From f4ae2d78b3ec152379f2ba8ddf64d7d62eae5b3a Mon Sep 17 00:00:00 2001 From: Erik Onarheim Date: Fri, 8 Aug 2025 09:20:22 -0500 Subject: [PATCH] wip --- package-lock.json | 491 +- package.json | 4 +- sample/autotile/autotile.js | 8797 ++++++++--------- sample/autotile/autotile.js.map | 2 +- sample/pureautotile/pureautotile.js | 8797 ++++++++--------- sample/pureautotile/pureautotile.js.map | 2 +- sample/sample/sample.js | 10871 +++++++++++----------- sample/sample/sample.js.map | 2 +- src/entity-layer.ts | 283 +- src/intgrid-layer.ts | 2 +- src/ldtk-resource.ts | 3 +- webpack.config.test.js | 5 +- 12 files changed, 14755 insertions(+), 14504 deletions(-) diff --git a/package-lock.json b/package-lock.json index e1311b6..d6907b4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,9 +20,9 @@ "raw-loader": "4.0.2", "ts-loader": "9.5.1", "typescript": "5.7.2", - "webpack": "5.97.1", + "webpack": "5.101.0", "webpack-cli": "6.0.1", - "webpack-dev-server": "5.2.0" + "webpack-dev-server": "5.2.2" }, "peerDependencies": { "excalibur": "~0.30.1" @@ -39,17 +39,14 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", + "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { @@ -57,40 +54,35 @@ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.10.tgz", + "integrity": "sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", + "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", + "dev": true, + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "version": "0.3.29", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", + "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -234,9 +226,9 @@ } }, "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true, "license": "MIT" }, @@ -271,9 +263,9 @@ "dev": true }, "node_modules/@types/http-proxy": { - "version": "1.17.15", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", - "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", + "version": "1.17.16", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz", + "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", "dev": true, "license": "MIT", "dependencies": { @@ -613,9 +605,9 @@ } }, "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", "bin": { @@ -625,6 +617,19 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -888,7 +893,8 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/bundle-name": { "version": "4.1.0", @@ -1077,7 +1083,8 @@ "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/compare-versions": { "version": "6.1.1", @@ -1356,9 +1363,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", "dev": true, "license": "MIT", "dependencies": { @@ -1944,9 +1951,9 @@ } }, "node_modules/http-proxy-middleware": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", - "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", "dev": true, "license": "MIT", "dependencies": { @@ -2230,6 +2237,7 @@ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -2244,6 +2252,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -2406,7 +2415,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/methods": { "version": "1.1.2", @@ -2886,6 +2896,7 @@ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" } @@ -3192,6 +3203,7 @@ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } @@ -3444,6 +3456,7 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -3454,6 +3467,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -3587,13 +3601,14 @@ } }, "node_modules/terser": { - "version": "5.30.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.30.3.tgz", - "integrity": "sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA==", + "version": "5.43.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz", + "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", + "acorn": "^8.14.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -3605,16 +3620,17 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "version": "5.3.14", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", + "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.20", + "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" }, "engines": { "node": ">= 10.13.0" @@ -3638,6 +3654,63 @@ } } }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/thingies": { "version": "1.21.0", "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", @@ -3885,21 +3958,23 @@ } }, "node_modules/webpack": { - "version": "5.97.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", - "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", + "version": "5.101.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.101.0.tgz", + "integrity": "sha512-B4t+nJqytPeuZlHuIKTbalhljIFXeNRqrUGAQgTGlfOl2lXXKXw+yZu6bicycP+PUlM44CxBjCFD6aciKFT3LQ==", "dev": true, "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.6", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.14.0", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", + "enhanced-resolve": "^5.17.2", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -3909,11 +3984,11 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", + "schema-utils": "^4.3.2", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", + "terser-webpack-plugin": "^5.3.11", "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" + "webpack-sources": "^3.3.3" }, "bin": { "webpack": "bin/webpack.js" @@ -4072,15 +4147,16 @@ } }, "node_modules/webpack-dev-server": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.0.tgz", - "integrity": "sha512-90SqqYXA2SK36KcT6o1bvwvZfJFcmoamqeJY7+boioffX9g9C0wjjJRGUrQIuh43pb0ttX7+ssavmj/WN2RHtA==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.2.tgz", + "integrity": "sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==", "dev": true, "license": "MIT", "dependencies": { "@types/bonjour": "^3.5.13", "@types/connect-history-api-fallback": "^1.5.4", "@types/express": "^4.17.21", + "@types/express-serve-static-core": "^4.17.21", "@types/serve-index": "^1.9.4", "@types/serve-static": "^1.15.5", "@types/sockjs": "^0.3.36", @@ -4093,7 +4169,7 @@ "connect-history-api-fallback": "^2.0.0", "express": "^4.21.2", "graceful-fs": "^4.2.6", - "http-proxy-middleware": "^2.0.7", + "http-proxy-middleware": "^2.0.9", "ipaddr.js": "^2.1.0", "launch-editor": "^2.6.1", "open": "^10.0.3", @@ -4197,14 +4273,72 @@ } }, "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.13.0" } }, + "node_modules/webpack/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/websocket-driver": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", @@ -4322,13 +4456,12 @@ "dev": true }, "@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", + "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", "dev": true, "requires": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, @@ -4338,16 +4471,10 @@ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true }, - "@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true - }, "@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.10.tgz", + "integrity": "sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==", "dev": true, "requires": { "@jridgewell/gen-mapping": "^0.3.5", @@ -4355,15 +4482,15 @@ } }, "@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", + "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "version": "0.3.29", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", + "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", "dev": true, "requires": { "@jridgewell/resolve-uri": "^3.1.0", @@ -4470,9 +4597,9 @@ } }, "@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true }, "@types/express": { @@ -4506,9 +4633,9 @@ "dev": true }, "@types/http-proxy": { - "version": "1.17.15", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", - "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", + "version": "1.17.16", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz", + "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", "dev": true, "requires": { "@types/node": "*" @@ -4800,11 +4927,18 @@ } }, "acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true }, + "acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "dev": true, + "requires": {} + }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -5314,9 +5448,9 @@ "dev": true }, "enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", "dev": true, "requires": { "graceful-fs": "^4.2.4", @@ -5745,9 +5879,9 @@ } }, "http-proxy-middleware": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", - "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", "dev": true, "requires": { "@types/http-proxy": "^1.17.8", @@ -6901,28 +7035,69 @@ "dev": true }, "terser": { - "version": "5.30.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.30.3.tgz", - "integrity": "sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA==", + "version": "5.43.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz", + "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==", "dev": true, "requires": { "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", + "acorn": "^8.14.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" } }, "terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "version": "5.3.14", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", + "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", "dev": true, "requires": { - "@jridgewell/trace-mapping": "^0.3.20", + "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" + }, + "dependencies": { + "ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "schema-utils": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + } + } } }, "thingies": { @@ -7085,20 +7260,22 @@ } }, "webpack": { - "version": "5.97.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", - "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", + "version": "5.101.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.101.0.tgz", + "integrity": "sha512-B4t+nJqytPeuZlHuIKTbalhljIFXeNRqrUGAQgTGlfOl2lXXKXw+yZu6bicycP+PUlM44CxBjCFD6aciKFT3LQ==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.6", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.14.0", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", + "enhanced-resolve": "^5.17.2", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -7108,11 +7285,52 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", + "schema-utils": "^4.3.2", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", + "terser-webpack-plugin": "^5.3.11", "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" + "webpack-sources": "^3.3.3" + }, + "dependencies": { + "ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "schema-utils": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + } + } } }, "webpack-cli": { @@ -7200,14 +7418,15 @@ } }, "webpack-dev-server": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.0.tgz", - "integrity": "sha512-90SqqYXA2SK36KcT6o1bvwvZfJFcmoamqeJY7+boioffX9g9C0wjjJRGUrQIuh43pb0ttX7+ssavmj/WN2RHtA==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.2.tgz", + "integrity": "sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==", "dev": true, "requires": { "@types/bonjour": "^3.5.13", "@types/connect-history-api-fallback": "^1.5.4", "@types/express": "^4.17.21", + "@types/express-serve-static-core": "^4.17.21", "@types/serve-index": "^1.9.4", "@types/serve-static": "^1.15.5", "@types/sockjs": "^0.3.36", @@ -7220,7 +7439,7 @@ "connect-history-api-fallback": "^2.0.0", "express": "^4.21.2", "graceful-fs": "^4.2.6", - "http-proxy-middleware": "^2.0.7", + "http-proxy-middleware": "^2.0.9", "ipaddr.js": "^2.1.0", "launch-editor": "^2.6.1", "open": "^10.0.3", @@ -7287,9 +7506,9 @@ } }, "webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", "dev": true }, "websocket-driver": { diff --git a/package.json b/package.json index f6b431b..67c6bf8 100644 --- a/package.json +++ b/package.json @@ -36,9 +36,9 @@ "raw-loader": "4.0.2", "ts-loader": "9.5.1", "typescript": "5.7.2", - "webpack": "5.97.1", + "webpack": "5.101.0", "webpack-cli": "6.0.1", - "webpack-dev-server": "5.2.0" + "webpack-dev-server": "5.2.2" }, "peerDependencies": { "excalibur": "~0.30.1" diff --git a/sample/autotile/autotile.js b/sample/autotile/autotile.js index 56672bd..aa446d3 100644 --- a/sample/autotile/autotile.js +++ b/sample/autotile/autotile.js @@ -570,130 +570,130 @@ __nested_webpack_require_434__.r(__nested_webpack_exports__); var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); // Module -___CSS_LOADER_EXPORT___.push([module.id, `/* Buttons styles start */ - -button#excalibur-play { - display: inline-block; - position: relative; - z-index: 999; - border-radius: 6px; - border: none; - /*border: 3px solid; - border-color: white; - box-shadow: 0 0 10px #ccc;*/ - padding: 1rem 1.5rem 1rem 4rem; - margin: 0; - text-decoration: none; - background: #00b233; - color: #ffffff; - font-family: sans-serif; - font-size: 2rem; - white-space: nowrap; - line-height: 1; - cursor: pointer; - text-align: center; - transition: - background 250ms ease-in-out, - transform 150ms ease; - -webkit-appearance: none; - -moz-appearance: none; - - -webkit-animation: excalibur-button-fadein 200ms; /* Safari, Chrome and Opera > 12.1 */ - -moz-animation: excalibur-button-fadein 200ms; /* Firefox < 16 */ - -ms-animation: excalibur-button-fadein 200ms; /* Internet Explorer */ - -o-animation: excalibur-button-fadein 200ms; /* Opera < 12.1 */ - animation: excalibur-button-fadein 200ms; -} - -/* -button#excalibur-play { - display: none; -}*/ - -button#excalibur-play:after { - position: absolute; - content: ''; - border: 8px solid; - border-color: transparent transparent transparent white; - left: 35px; - top: 24px; - width: 0; - height: 0; -} - -button#excalibur-play:before { - position: absolute; - content: ''; - border: 3px solid; - left: 19px; - top: 14px; - border-radius: 20px; - width: 30px; - height: 30px; -} - -button#excalibur-play:hover, -button#excalibur-play:focus { - background: #00982c; -} - -button#excalibur-play:focus { - outline: 1px solid #fff; - outline-offset: -4px; -} - -button#excalibur-play:active { - transform: scale(0.99); -} - -@keyframes excalibur-button-fadein { - from { - opacity: 0; - } - to { - opacity: 1; - } -} - -/* Firefox < 16 */ -@-moz-keyframes excalibur-button-fadein { - from { - opacity: 0; - } - to { - opacity: 1; - } -} - -/* Safari, Chrome and Opera > 12.1 */ -@-webkit-keyframes excalibur-button-fadein { - from { - opacity: 0; - } - to { - opacity: 1; - } -} - -/* Internet Explorer */ -@-ms-keyframes excalibur-button-fadein { - from { - opacity: 0; - } - to { - opacity: 1; - } -} - -/* Opera < 12.1 */ -@-o-keyframes excalibur-button-fadein { - from { - opacity: 0; - } - to { - opacity: 1; - } -} +___CSS_LOADER_EXPORT___.push([module.id, `/* Buttons styles start */ + +button#excalibur-play { + display: inline-block; + position: relative; + z-index: 999; + border-radius: 6px; + border: none; + /*border: 3px solid; + border-color: white; + box-shadow: 0 0 10px #ccc;*/ + padding: 1rem 1.5rem 1rem 4rem; + margin: 0; + text-decoration: none; + background: #00b233; + color: #ffffff; + font-family: sans-serif; + font-size: 2rem; + white-space: nowrap; + line-height: 1; + cursor: pointer; + text-align: center; + transition: + background 250ms ease-in-out, + transform 150ms ease; + -webkit-appearance: none; + -moz-appearance: none; + + -webkit-animation: excalibur-button-fadein 200ms; /* Safari, Chrome and Opera > 12.1 */ + -moz-animation: excalibur-button-fadein 200ms; /* Firefox < 16 */ + -ms-animation: excalibur-button-fadein 200ms; /* Internet Explorer */ + -o-animation: excalibur-button-fadein 200ms; /* Opera < 12.1 */ + animation: excalibur-button-fadein 200ms; +} + +/* +button#excalibur-play { + display: none; +}*/ + +button#excalibur-play:after { + position: absolute; + content: ''; + border: 8px solid; + border-color: transparent transparent transparent white; + left: 35px; + top: 24px; + width: 0; + height: 0; +} + +button#excalibur-play:before { + position: absolute; + content: ''; + border: 3px solid; + left: 19px; + top: 14px; + border-radius: 20px; + width: 30px; + height: 30px; +} + +button#excalibur-play:hover, +button#excalibur-play:focus { + background: #00982c; +} + +button#excalibur-play:focus { + outline: 1px solid #fff; + outline-offset: -4px; +} + +button#excalibur-play:active { + transform: scale(0.99); +} + +@keyframes excalibur-button-fadein { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +/* Firefox < 16 */ +@-moz-keyframes excalibur-button-fadein { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +/* Safari, Chrome and Opera > 12.1 */ +@-webkit-keyframes excalibur-button-fadein { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +/* Internet Explorer */ +@-ms-keyframes excalibur-button-fadein { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +/* Opera < 12.1 */ +@-o-keyframes excalibur-button-fadein { + from { + opacity: 0; + } + to { + opacity: 1; + } +} `, "",{"version":3,"sources":["webpack://./Director/Loader.css"],"names":[],"mappings":"AAAA,yBAAyB;;AAEzB;EACE,qBAAqB;EACrB,kBAAkB;EAClB,YAAY;EACZ,kBAAkB;EAClB,YAAY;EACZ;;+BAE6B;EAC7B,8BAA8B;EAC9B,SAAS;EACT,qBAAqB;EACrB,mBAAmB;EACnB,cAAc;EACd,uBAAuB;EACvB,eAAe;EACf,mBAAmB;EACnB,cAAc;EACd,eAAe;EACf,kBAAkB;EAClB;;wBAEsB;EACtB,wBAAwB;EACxB,qBAAqB;;EAErB,gDAAgD,EAAE,oCAAoC;EACtF,6CAA6C,EAAE,iBAAiB;EAChE,4CAA4C,EAAE,sBAAsB;EACpE,2CAA2C,EAAE,iBAAiB;EAC9D,wCAAwC;AAC1C;;AAEA;;;EAGE;;AAEF;EACE,kBAAkB;EAClB,WAAW;EACX,iBAAiB;EACjB,uDAAuD;EACvD,UAAU;EACV,SAAS;EACT,QAAQ;EACR,SAAS;AACX;;AAEA;EACE,kBAAkB;EAClB,WAAW;EACX,iBAAiB;EACjB,UAAU;EACV,SAAS;EACT,mBAAmB;EACnB,WAAW;EACX,YAAY;AACd;;AAEA;;EAEE,mBAAmB;AACrB;;AAEA;EACE,uBAAuB;EACvB,oBAAoB;AACtB;;AAEA;EACE,sBAAsB;AACxB;;AAEA;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF;;AAEA,iBAAiB;AACjB;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF;;AAEA,oCAAoC;AACpC;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF;;AAEA,sBAAsB;AACtB;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF;;AAEA,iBAAiB;AACjB;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF","sourcesContent":["/* Buttons styles start */\r\n\r\nbutton#excalibur-play {\r\n display: inline-block;\r\n position: relative;\r\n z-index: 999;\r\n border-radius: 6px;\r\n border: none;\r\n /*border: 3px solid;\r\n border-color: white;\r\n box-shadow: 0 0 10px #ccc;*/\r\n padding: 1rem 1.5rem 1rem 4rem;\r\n margin: 0;\r\n text-decoration: none;\r\n background: #00b233;\r\n color: #ffffff;\r\n font-family: sans-serif;\r\n font-size: 2rem;\r\n white-space: nowrap;\r\n line-height: 1;\r\n cursor: pointer;\r\n text-align: center;\r\n transition:\r\n background 250ms ease-in-out,\r\n transform 150ms ease;\r\n -webkit-appearance: none;\r\n -moz-appearance: none;\r\n\r\n -webkit-animation: excalibur-button-fadein 200ms; /* Safari, Chrome and Opera > 12.1 */\r\n -moz-animation: excalibur-button-fadein 200ms; /* Firefox < 16 */\r\n -ms-animation: excalibur-button-fadein 200ms; /* Internet Explorer */\r\n -o-animation: excalibur-button-fadein 200ms; /* Opera < 12.1 */\r\n animation: excalibur-button-fadein 200ms;\r\n}\r\n\r\n/*\r\nbutton#excalibur-play {\r\n display: none;\r\n}*/\r\n\r\nbutton#excalibur-play:after {\r\n position: absolute;\r\n content: '';\r\n border: 8px solid;\r\n border-color: transparent transparent transparent white;\r\n left: 35px;\r\n top: 24px;\r\n width: 0;\r\n height: 0;\r\n}\r\n\r\nbutton#excalibur-play:before {\r\n position: absolute;\r\n content: '';\r\n border: 3px solid;\r\n left: 19px;\r\n top: 14px;\r\n border-radius: 20px;\r\n width: 30px;\r\n height: 30px;\r\n}\r\n\r\nbutton#excalibur-play:hover,\r\nbutton#excalibur-play:focus {\r\n background: #00982c;\r\n}\r\n\r\nbutton#excalibur-play:focus {\r\n outline: 1px solid #fff;\r\n outline-offset: -4px;\r\n}\r\n\r\nbutton#excalibur-play:active {\r\n transform: scale(0.99);\r\n}\r\n\r\n@keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n/* Firefox < 16 */\r\n@-moz-keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n/* Safari, Chrome and Opera > 12.1 */\r\n@-webkit-keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n/* Internet Explorer */\r\n@-ms-keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n/* Opera < 12.1 */\r\n@-o-keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n"],"sourceRoot":""}]); // Exports /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___); @@ -720,32 +720,32 @@ __nested_webpack_require_8167__.r(__nested_webpack_exports__); var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); // Module -___CSS_LOADER_EXPORT___.push([module.id, `#ex-toast-container { - position: absolute; - height: 0; - min-width: 50%; - left: 50%; - top: 0; -} - -.ex-toast-message { - left: -50%; - position: relative; - display: flex; - justify-content: space-between; - - padding: 10px; - margin-top: 5px; - font-size: 18px; - font-family: sans-serif; - border-radius: 6px; - border: 3px solid #b7b779; - background-color: rgb(253, 253, 192); -} - -.ex-toast-message button { - align-self: flex-start; -} +___CSS_LOADER_EXPORT___.push([module.id, `#ex-toast-container { + position: absolute; + height: 0; + min-width: 50%; + left: 50%; + top: 0; +} + +.ex-toast-message { + left: -50%; + position: relative; + display: flex; + justify-content: space-between; + + padding: 10px; + margin-top: 5px; + font-size: 18px; + font-family: sans-serif; + border-radius: 6px; + border: 3px solid #b7b779; + background-color: rgb(253, 253, 192); +} + +.ex-toast-message button { + align-self: flex-start; +} `, "",{"version":3,"sources":["webpack://./Util/Toaster.css"],"names":[],"mappings":"AAAA;EACE,kBAAkB;EAClB,SAAS;EACT,cAAc;EACd,SAAS;EACT,MAAM;AACR;;AAEA;EACE,UAAU;EACV,kBAAkB;EAClB,aAAa;EACb,8BAA8B;;EAE9B,aAAa;EACb,eAAe;EACf,eAAe;EACf,uBAAuB;EACvB,kBAAkB;EAClB,yBAAyB;EACzB,oCAAoC;AACtC;;AAEA;EACE,sBAAsB;AACxB","sourcesContent":["#ex-toast-container {\r\n position: absolute;\r\n height: 0;\r\n min-width: 50%;\r\n left: 50%;\r\n top: 0;\r\n}\r\n\r\n.ex-toast-message {\r\n left: -50%;\r\n position: relative;\r\n display: flex;\r\n justify-content: space-between;\r\n\r\n padding: 10px;\r\n margin-top: 5px;\r\n font-size: 18px;\r\n font-family: sans-serif;\r\n border-radius: 6px;\r\n border: 3px solid #b7b779;\r\n background-color: rgb(253, 253, 192);\r\n}\r\n\r\n.ex-toast-message button {\r\n align-self: flex-start;\r\n}\r\n"],"sourceRoot":""}]); // Exports /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___); @@ -2316,20 +2316,20 @@ class Flash { this._material = (_a = entity.scene) === null || _a === void 0 ? void 0 : _a.engine.graphicsContext.createMaterial({ name: 'flash-material', color, - fragmentSource: `#version 300 es - - precision mediump float; - uniform float u_blend; - uniform sampler2D u_graphic; - uniform vec4 u_color; - - in vec2 v_uv; - out vec4 color; - - void main() { - vec4 textureColor = texture(u_graphic, v_uv); - color = mix(textureColor, u_color, u_blend * textureColor.a); - color.rgb = color.rgb * color.a; + fragmentSource: `#version 300 es + + precision mediump float; + uniform float u_blend; + uniform sampler2D u_graphic; + uniform vec4 u_color; + + in vec2 v_uv; + out vec4 color; + + void main() { + vec4 textureColor = texture(u_graphic, v_uv); + color = mix(textureColor, u_color, u_blend * textureColor.a); + color.rgb = color.rgb * color.a; }` }); this._total = duration; @@ -11099,9 +11099,9 @@ class CollisionGroup { return _CollisionGroupManager__WEBPACK_IMPORTED_MODULE_0__.CollisionGroupManager.create(combinedName, combinedMask); } toString() { - return ` -category: ${this.category.toString(2).padStart(32, '0')} -mask: ${(this.mask >>> 0).toString(2).padStart(32, '0')} + return ` +category: ${this.category.toString(2).padStart(32, '0')} +mask: ${(this.mask >>> 0).toString(2).padStart(32, '0')} `; } } @@ -15527,22 +15527,22 @@ class Engine { container.style.padding = '10px'; container.style.borderStyle = 'solid 1px'; const div = document.createElement('div'); - div.innerHTML = ` -

There was an issue rendering, please refresh the page.

-
-

WebGL Graphics Context Lost

- - - -

There are a few reasons this might happen:

- -
+ div.innerHTML = ` +

There was an issue rendering, please refresh the page.

+
+

WebGL Graphics Context Lost

+ + + +

There are a few reasons this might happen:

+ +
`; container.appendChild(div); if ((_a = this.canvas) === null || _a === void 0 ? void 0 : _a.parentElement) { @@ -15600,9 +15600,9 @@ class Engine { // eslint-disable-next-line no-console console.log(`%cPowered by Excalibur.js (v${___WEBPACK_IMPORTED_MODULE_2__.EX_VERSION})`, 'background: #176BAA; color: white; border-radius: 5px; padding: 15px; font-size: 1.5em; line-height: 80px;'); // eslint-disable-next-line no-console - console.log('\n\ - /| ________________\n\ -O|===|* >________________>\n\ + console.log('\n\ + /| ________________\n\ +O|===|* >________________>\n\ \\|'); // eslint-disable-next-line no-console console.log('Visit', 'http://excaliburjs.com', 'for more information'); @@ -22009,26 +22009,26 @@ __nested_webpack_require_937606__.r(__nested_webpack_exports__); -const defaultVertexSource = `#version 300 es -in vec2 a_position; - -in vec2 a_uv; -out vec2 v_uv; - -in vec2 a_screenuv; -out vec2 v_screenuv; - -uniform mat4 u_matrix; -uniform mat4 u_transform; - -void main() { - // Set the vertex position using the ortho & transform matrix - gl_Position = u_matrix * u_transform * vec4(a_position, 0.0, 1.0); - - // Pass through the UV coord to the fragment shader - v_uv = a_uv; - v_screenuv = a_screenuv; -} +const defaultVertexSource = `#version 300 es +in vec2 a_position; + +in vec2 a_uv; +out vec2 v_uv; + +in vec2 a_screenuv; +out vec2 v_screenuv; + +uniform mat4 u_matrix; +uniform mat4 u_transform; + +void main() { + // Set the vertex position using the ortho & transform matrix + gl_Position = u_matrix * u_transform * vec4(a_position, 0.0, 1.0); + + // Pass through the UV coord to the fragment shader + v_uv = a_uv; + v_screenuv = a_screenuv; +} `; class Material { constructor(options) { @@ -24193,12 +24193,12 @@ function getAttributePointerType(gl, type) { */ function getMaxShaderComplexity(gl, numIfs) { const assembleTestShader = (numIfs) => { - const testShader = `#version 300 es - precision mediump float; - out vec4 fragColor; - void main() { - float index = 1.01; - %%complexity%% + const testShader = `#version 300 es + precision mediump float; + out vec4 fragColor; + void main() { + float index = 1.01; + %%complexity%% }`; let testComplexity = ''; for (let i = 0; i < numIfs; i++) { @@ -26982,17 +26982,17 @@ class ScreenShader { } this._shader = new _Context_shader__WEBPACK_IMPORTED_MODULE_1__.Shader({ gl, - vertexSource: `#version 300 es - in vec2 a_position; - in vec2 a_uv; - out vec2 v_texcoord; - out vec2 v_uv; - - void main() { - gl_Position = vec4(a_position, 0.0, 1.0); - // Pass the texcoord to the fragment shader. - v_texcoord = a_uv; - v_uv = a_uv; + vertexSource: `#version 300 es + in vec2 a_position; + in vec2 a_uv; + out vec2 v_texcoord; + out vec2 v_uv; + + void main() { + gl_Position = vec4(a_position, 0.0, 1.0); + // Pass the texcoord to the fragment shader. + v_texcoord = a_uv; + v_uv = a_uv; }`, fragmentSource: fragmentSource }); @@ -31464,10 +31464,10 @@ class AffineMatrix { return mat; } toString() { - return ` -[${this.data[0]} ${this.data[2]} ${this.data[4]}] -[${this.data[1]} ${this.data[3]} ${this.data[5]}] -[0 0 1] + return ` +[${this.data[0]} ${this.data[2]} ${this.data[4]}] +[${this.data[1]} ${this.data[3]} ${this.data[5]}] +[0 0 1] `; } } @@ -32596,11 +32596,11 @@ class Matrix { this.data[15] === 1); } toString() { - return ` -[${this.data[0]} ${this.data[4]} ${this.data[8]} ${this.data[12]}] -[${this.data[1]} ${this.data[5]} ${this.data[9]} ${this.data[13]}] -[${this.data[2]} ${this.data[6]} ${this.data[10]} ${this.data[14]}] -[${this.data[3]} ${this.data[7]} ${this.data[11]} ${this.data[15]}] + return ` +[${this.data[0]} ${this.data[4]} ${this.data[8]} ${this.data[12]}] +[${this.data[1]} ${this.data[5]} ${this.data[9]} ${this.data[13]}] +[${this.data[2]} ${this.data[6]} ${this.data[10]} ${this.data[14]}] +[${this.data[3]} ${this.data[7]} ${this.data[11]} ${this.data[15]}] `; } } @@ -35256,8 +35256,8 @@ class Resource { return; } if (request.response instanceof Blob && request.response.type === 'text/html') { - const errorText = `Expected blob (usually image) data from the server when loading ${this.path}, but got HTML content instead! - + const errorText = `Expected blob (usually image) data from the server when loading ${this.path}, but got HTML content instead! + Check your server configuration, for example Vite serves static files from the /public folder`; this.events.emit('error', request.response); reject(new Error(errorText)); @@ -42409,1715 +42409,385 @@ __nested_webpack_require_1787534__.r(__nested_webpack_exports__); /***/ }), -/***/ "./sample/resources.ts": -/*!*****************************!*\ - !*** ./sample/resources.ts ***! - \*****************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { +/***/ "./node_modules/zod/lib/index.mjs": +/*!****************************************!*\ + !*** ./node_modules/zod/lib/index.mjs ***! + \****************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ Resources: () => (/* binding */ Resources), -/* harmony export */ loader: () => (/* binding */ loader) +/* harmony export */ BRAND: () => (/* binding */ BRAND), +/* harmony export */ DIRTY: () => (/* binding */ DIRTY), +/* harmony export */ EMPTY_PATH: () => (/* binding */ EMPTY_PATH), +/* harmony export */ INVALID: () => (/* binding */ INVALID), +/* harmony export */ NEVER: () => (/* binding */ NEVER), +/* harmony export */ OK: () => (/* binding */ OK), +/* harmony export */ ParseStatus: () => (/* binding */ ParseStatus), +/* harmony export */ Schema: () => (/* binding */ ZodType), +/* harmony export */ ZodAny: () => (/* binding */ ZodAny), +/* harmony export */ ZodArray: () => (/* binding */ ZodArray), +/* harmony export */ ZodBigInt: () => (/* binding */ ZodBigInt), +/* harmony export */ ZodBoolean: () => (/* binding */ ZodBoolean), +/* harmony export */ ZodBranded: () => (/* binding */ ZodBranded), +/* harmony export */ ZodCatch: () => (/* binding */ ZodCatch), +/* harmony export */ ZodDate: () => (/* binding */ ZodDate), +/* harmony export */ ZodDefault: () => (/* binding */ ZodDefault), +/* harmony export */ ZodDiscriminatedUnion: () => (/* binding */ ZodDiscriminatedUnion), +/* harmony export */ ZodEffects: () => (/* binding */ ZodEffects), +/* harmony export */ ZodEnum: () => (/* binding */ ZodEnum), +/* harmony export */ ZodError: () => (/* binding */ ZodError), +/* harmony export */ ZodFirstPartyTypeKind: () => (/* binding */ ZodFirstPartyTypeKind), +/* harmony export */ ZodFunction: () => (/* binding */ ZodFunction), +/* harmony export */ ZodIntersection: () => (/* binding */ ZodIntersection), +/* harmony export */ ZodIssueCode: () => (/* binding */ ZodIssueCode), +/* harmony export */ ZodLazy: () => (/* binding */ ZodLazy), +/* harmony export */ ZodLiteral: () => (/* binding */ ZodLiteral), +/* harmony export */ ZodMap: () => (/* binding */ ZodMap), +/* harmony export */ ZodNaN: () => (/* binding */ ZodNaN), +/* harmony export */ ZodNativeEnum: () => (/* binding */ ZodNativeEnum), +/* harmony export */ ZodNever: () => (/* binding */ ZodNever), +/* harmony export */ ZodNull: () => (/* binding */ ZodNull), +/* harmony export */ ZodNullable: () => (/* binding */ ZodNullable), +/* harmony export */ ZodNumber: () => (/* binding */ ZodNumber), +/* harmony export */ ZodObject: () => (/* binding */ ZodObject), +/* harmony export */ ZodOptional: () => (/* binding */ ZodOptional), +/* harmony export */ ZodParsedType: () => (/* binding */ ZodParsedType), +/* harmony export */ ZodPipeline: () => (/* binding */ ZodPipeline), +/* harmony export */ ZodPromise: () => (/* binding */ ZodPromise), +/* harmony export */ ZodReadonly: () => (/* binding */ ZodReadonly), +/* harmony export */ ZodRecord: () => (/* binding */ ZodRecord), +/* harmony export */ ZodSchema: () => (/* binding */ ZodType), +/* harmony export */ ZodSet: () => (/* binding */ ZodSet), +/* harmony export */ ZodString: () => (/* binding */ ZodString), +/* harmony export */ ZodSymbol: () => (/* binding */ ZodSymbol), +/* harmony export */ ZodTransformer: () => (/* binding */ ZodEffects), +/* harmony export */ ZodTuple: () => (/* binding */ ZodTuple), +/* harmony export */ ZodType: () => (/* binding */ ZodType), +/* harmony export */ ZodUndefined: () => (/* binding */ ZodUndefined), +/* harmony export */ ZodUnion: () => (/* binding */ ZodUnion), +/* harmony export */ ZodUnknown: () => (/* binding */ ZodUnknown), +/* harmony export */ ZodVoid: () => (/* binding */ ZodVoid), +/* harmony export */ addIssueToContext: () => (/* binding */ addIssueToContext), +/* harmony export */ any: () => (/* binding */ anyType), +/* harmony export */ array: () => (/* binding */ arrayType), +/* harmony export */ bigint: () => (/* binding */ bigIntType), +/* harmony export */ boolean: () => (/* binding */ booleanType), +/* harmony export */ coerce: () => (/* binding */ coerce), +/* harmony export */ custom: () => (/* binding */ custom), +/* harmony export */ date: () => (/* binding */ dateType), +/* harmony export */ datetimeRegex: () => (/* binding */ datetimeRegex), +/* harmony export */ "default": () => (/* binding */ z), +/* harmony export */ defaultErrorMap: () => (/* binding */ errorMap), +/* harmony export */ discriminatedUnion: () => (/* binding */ discriminatedUnionType), +/* harmony export */ effect: () => (/* binding */ effectsType), +/* harmony export */ "enum": () => (/* binding */ enumType), +/* harmony export */ "function": () => (/* binding */ functionType), +/* harmony export */ getErrorMap: () => (/* binding */ getErrorMap), +/* harmony export */ getParsedType: () => (/* binding */ getParsedType), +/* harmony export */ "instanceof": () => (/* binding */ instanceOfType), +/* harmony export */ intersection: () => (/* binding */ intersectionType), +/* harmony export */ isAborted: () => (/* binding */ isAborted), +/* harmony export */ isAsync: () => (/* binding */ isAsync), +/* harmony export */ isDirty: () => (/* binding */ isDirty), +/* harmony export */ isValid: () => (/* binding */ isValid), +/* harmony export */ late: () => (/* binding */ late), +/* harmony export */ lazy: () => (/* binding */ lazyType), +/* harmony export */ literal: () => (/* binding */ literalType), +/* harmony export */ makeIssue: () => (/* binding */ makeIssue), +/* harmony export */ map: () => (/* binding */ mapType), +/* harmony export */ nan: () => (/* binding */ nanType), +/* harmony export */ nativeEnum: () => (/* binding */ nativeEnumType), +/* harmony export */ never: () => (/* binding */ neverType), +/* harmony export */ "null": () => (/* binding */ nullType), +/* harmony export */ nullable: () => (/* binding */ nullableType), +/* harmony export */ number: () => (/* binding */ numberType), +/* harmony export */ object: () => (/* binding */ objectType), +/* harmony export */ objectUtil: () => (/* binding */ objectUtil), +/* harmony export */ oboolean: () => (/* binding */ oboolean), +/* harmony export */ onumber: () => (/* binding */ onumber), +/* harmony export */ optional: () => (/* binding */ optionalType), +/* harmony export */ ostring: () => (/* binding */ ostring), +/* harmony export */ pipeline: () => (/* binding */ pipelineType), +/* harmony export */ preprocess: () => (/* binding */ preprocessType), +/* harmony export */ promise: () => (/* binding */ promiseType), +/* harmony export */ quotelessJson: () => (/* binding */ quotelessJson), +/* harmony export */ record: () => (/* binding */ recordType), +/* harmony export */ set: () => (/* binding */ setType), +/* harmony export */ setErrorMap: () => (/* binding */ setErrorMap), +/* harmony export */ strictObject: () => (/* binding */ strictObjectType), +/* harmony export */ string: () => (/* binding */ stringType), +/* harmony export */ symbol: () => (/* binding */ symbolType), +/* harmony export */ transformer: () => (/* binding */ effectsType), +/* harmony export */ tuple: () => (/* binding */ tupleType), +/* harmony export */ undefined: () => (/* binding */ undefinedType), +/* harmony export */ union: () => (/* binding */ unionType), +/* harmony export */ unknown: () => (/* binding */ unknownType), +/* harmony export */ util: () => (/* binding */ util), +/* harmony export */ "void": () => (/* binding */ voidType), +/* harmony export */ z: () => (/* binding */ z) /* harmony export */ }); -/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); -/* harmony import */ var _excalibur_ldtk__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @excalibur-ldtk */ "./src/index.ts"); - - -const Resources = { - HeroSpriteSheetPng: new excalibur__WEBPACK_IMPORTED_MODULE_1__.ImageSource('./Solaria Demo Pack Update 03/Solaria Demo Pack Update 03/16x16/Sprites/Hero 01.png'), - LdtkResource: new _excalibur_ldtk__WEBPACK_IMPORTED_MODULE_0__.LdtkResource('./spacing-padding/spacing-padding.ldtk', { - useTilemapCameraStrategy: true, - useMapBackgroundColor: true, - }), - LdtkAutoTile: new _excalibur_ldtk__WEBPACK_IMPORTED_MODULE_0__.LdtkResource('./autotile/autotile.ldtk', { - useMapBackgroundColor: true, - }), - LdtkPureAutoTile: new _excalibur_ldtk__WEBPACK_IMPORTED_MODULE_0__.LdtkResource('./dsml1/dsml1.ldtk', { - useMapBackgroundColor: true, - }) +var util; +(function (util) { + util.assertEqual = (val) => val; + function assertIs(_arg) { } + util.assertIs = assertIs; + function assertNever(_x) { + throw new Error(); + } + util.assertNever = assertNever; + util.arrayToEnum = (items) => { + const obj = {}; + for (const item of items) { + obj[item] = item; + } + return obj; + }; + util.getValidEnumValues = (obj) => { + const validKeys = util.objectKeys(obj).filter((k) => typeof obj[obj[k]] !== "number"); + const filtered = {}; + for (const k of validKeys) { + filtered[k] = obj[k]; + } + return util.objectValues(filtered); + }; + util.objectValues = (obj) => { + return util.objectKeys(obj).map(function (e) { + return obj[e]; + }); + }; + util.objectKeys = typeof Object.keys === "function" // eslint-disable-line ban/ban + ? (obj) => Object.keys(obj) // eslint-disable-line ban/ban + : (object) => { + const keys = []; + for (const key in object) { + if (Object.prototype.hasOwnProperty.call(object, key)) { + keys.push(key); + } + } + return keys; + }; + util.find = (arr, checker) => { + for (const item of arr) { + if (checker(item)) + return item; + } + return undefined; + }; + util.isInteger = typeof Number.isInteger === "function" + ? (val) => Number.isInteger(val) // eslint-disable-line ban/ban + : (val) => typeof val === "number" && isFinite(val) && Math.floor(val) === val; + function joinValues(array, separator = " | ") { + return array + .map((val) => (typeof val === "string" ? `'${val}'` : val)) + .join(separator); + } + util.joinValues = joinValues; + util.jsonStringifyReplacer = (_, value) => { + if (typeof value === "bigint") { + return value.toString(); + } + return value; + }; +})(util || (util = {})); +var objectUtil; +(function (objectUtil) { + objectUtil.mergeShapes = (first, second) => { + return { + ...first, + ...second, // second overwrites first + }; + }; +})(objectUtil || (objectUtil = {})); +const ZodParsedType = util.arrayToEnum([ + "string", + "nan", + "number", + "integer", + "float", + "boolean", + "date", + "bigint", + "symbol", + "function", + "undefined", + "null", + "array", + "object", + "unknown", + "promise", + "void", + "never", + "map", + "set", +]); +const getParsedType = (data) => { + const t = typeof data; + switch (t) { + case "undefined": + return ZodParsedType.undefined; + case "string": + return ZodParsedType.string; + case "number": + return isNaN(data) ? ZodParsedType.nan : ZodParsedType.number; + case "boolean": + return ZodParsedType.boolean; + case "function": + return ZodParsedType.function; + case "bigint": + return ZodParsedType.bigint; + case "symbol": + return ZodParsedType.symbol; + case "object": + if (Array.isArray(data)) { + return ZodParsedType.array; + } + if (data === null) { + return ZodParsedType.null; + } + if (data.then && + typeof data.then === "function" && + data.catch && + typeof data.catch === "function") { + return ZodParsedType.promise; + } + if (typeof Map !== "undefined" && data instanceof Map) { + return ZodParsedType.map; + } + if (typeof Set !== "undefined" && data instanceof Set) { + return ZodParsedType.set; + } + if (typeof Date !== "undefined" && data instanceof Date) { + return ZodParsedType.date; + } + return ZodParsedType.object; + default: + return ZodParsedType.unknown; + } }; -const loader = new excalibur__WEBPACK_IMPORTED_MODULE_1__.Loader(); -for (let resource of Object.values(Resources)) { - loader.addResource(resource); -} - - -/***/ }), -/***/ "./src/entity-layer.ts": -/*!*****************************!*\ - !*** ./src/entity-layer.ts ***! - \*****************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ EntityLayer: () => (/* binding */ EntityLayer) -/* harmony export */ }); -/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); - -class EntityLayer { - constructor(level, ldtkLayer, resource, order) { - var _a, _b; - this.ldtkLayer = ldtkLayer; - this.resource = resource; - this.order = order; - this.entities = []; - this.ldtkToEntity = new Map(); - this.entityToLdtk = new Map(); - this.worldPos = (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(level.ldtkLevel.worldX, level.ldtkLevel.worldY); - this.offset = (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(ldtkLayer.__pxTotalOffsetX, ldtkLayer.__pxTotalOffsetY); - if (ldtkLayer.entityInstances) { - for (let entity of ldtkLayer.entityInstances) { - const entityMetadata = resource.projectMetadata.defs.entities.find(e => { - return e.identifier === entity.__identifier; - }); - if (resource.factories.has(entity.__identifier)) { - const factory = resource.factories.get(entity.__identifier); - if (factory) { - const newEntity = factory({ - type: entity.__identifier, - worldPos: (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(entity.px[0], entity.px[1]).add(this.worldPos.add(this.offset)), - entity, - definition: entityMetadata, - layer: this, - }); - if (newEntity) { - this.entities.push(newEntity); - this.ldtkToEntity.set(entity, newEntity); - this.entityToLdtk.set(newEntity, entity); - } - } +const ZodIssueCode = util.arrayToEnum([ + "invalid_type", + "invalid_literal", + "custom", + "invalid_union", + "invalid_union_discriminator", + "invalid_enum_value", + "unrecognized_keys", + "invalid_arguments", + "invalid_return_type", + "invalid_date", + "invalid_string", + "too_small", + "too_big", + "invalid_intersection_types", + "not_multiple_of", + "not_finite", +]); +const quotelessJson = (obj) => { + const json = JSON.stringify(obj, null, 2); + return json.replace(/"([^"]+)":/g, "$1:"); +}; +class ZodError extends Error { + get errors() { + return this.issues; + } + constructor(issues) { + super(); + this.issues = []; + this.addIssue = (sub) => { + this.issues = [...this.issues, sub]; + }; + this.addIssues = (subs = []) => { + this.issues = [...this.issues, ...subs]; + }; + const actualProto = new.target.prototype; + if (Object.setPrototypeOf) { + // eslint-disable-next-line ban/ban + Object.setPrototypeOf(this, actualProto); + } + else { + this.__proto__ = actualProto; + } + this.name = "ZodError"; + this.issues = issues; + } + format(_mapper) { + const mapper = _mapper || + function (issue) { + return issue.message; + }; + const fieldErrors = { _errors: [] }; + const processError = (error) => { + for (const issue of error.issues) { + if (issue.code === "invalid_union") { + issue.unionErrors.map(processError); + } + else if (issue.code === "invalid_return_type") { + processError(issue.returnTypeError); + } + else if (issue.code === "invalid_arguments") { + processError(issue.argumentsError); + } + else if (issue.path.length === 0) { + fieldErrors._errors.push(mapper(issue)); } else { - const actor = new excalibur__WEBPACK_IMPORTED_MODULE_0__.Actor({ - name: entity.__identifier, - pos: (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(entity.px[0], entity.px[1]).add(this.worldPos.add(this.offset)), - width: entity.width, - height: entity.height, - anchor: (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)((_a = entityMetadata === null || entityMetadata === void 0 ? void 0 : entityMetadata.pivotX) !== null && _a !== void 0 ? _a : 0, (_b = entityMetadata === null || entityMetadata === void 0 ? void 0 : entityMetadata.pivotY) !== null && _b !== void 0 ? _b : 0), - z: order - }); - if (entity.__tile) { - const ts = resource.tilesets.get(entity.__tile.tilesetUid); - if (ts) { - const tsxCoord = Math.floor(entity.__tile.x / entity.__tile.w); - const tsyCoord = Math.floor(entity.__tile.y / entity.__tile.h); - const sprite = ts.spritesheet.getSprite(tsxCoord, tsyCoord); - if (sprite) { - actor.graphics.use(sprite); - } + let curr = fieldErrors; + let i = 0; + while (i < issue.path.length) { + const el = issue.path[i]; + const terminal = i === issue.path.length - 1; + if (!terminal) { + curr[el] = curr[el] || { _errors: [] }; + // if (typeof el === "string") { + // curr[el] = curr[el] || { _errors: [] }; + // } else if (typeof el === "number") { + // const errorArray: any = []; + // errorArray._errors = []; + // curr[el] = curr[el] || errorArray; + // } + } + else { + curr[el] = curr[el] || { _errors: [] }; + curr[el]._errors.push(mapper(issue)); } + curr = curr[el]; + i++; } - this.entities.push(actor); - this.ldtkToEntity.set(entity, actor); - this.entityToLdtk.set(actor, entity); } } - } + }; + processError(this); + return fieldErrors; } - runFactories() { - for (let entity of this.ldtkLayer.entityInstances) { - const factory = this.resource.factories.get(entity.__identifier); - if (!factory) { - continue; - } - const entityMetadata = this.resource.projectMetadata.defs.entities.find(e => { - return e.identifier === entity.__identifier; - }); - const newEntity = factory({ - type: entity.__identifier, - worldPos: (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(entity.px[0], entity.px[1]).add(this.worldPos.add(this.offset)), - entity, - definition: entityMetadata, - layer: this, - }); - if (newEntity) { - // remove pre-existing entity (e.g. the default actor created for the entity placement) - const preExisting = this.ldtkToEntity.get(entity); - if (preExisting) { - const index = this.entities.indexOf(preExisting); - if (index > -1) { - this.entities.splice(index, 1); - this.ldtkToEntity.delete(entity); - this.entityToLdtk.delete(preExisting); - } - } - this.entities.push(newEntity); - this.ldtkToEntity.set(entity, newEntity); - this.entityToLdtk.set(newEntity, entity); - } + static assert(value) { + if (!(value instanceof ZodError)) { + throw new Error(`Not a ZodError: ${value}`); } } - getEntitiesByIdentifier(identifier) { - const ldtkEntities = this.getLdtkEntitiesByIdentifier(identifier); - let results = []; - for (const ldtk of ldtkEntities) { - const maybeEntity = this.ldtkToEntity.get(ldtk); - if (maybeEntity) { - results.push(maybeEntity); - } - } - return results; + toString() { + return this.message; } - getEntitiesByField(fieldIdentifier, value) { - const ldtkEntities = this.getLdtkEntitiesByField(fieldIdentifier, value); - let results = []; - for (const ldtk of ldtkEntities) { - const maybeEntity = this.ldtkToEntity.get(ldtk); - if (maybeEntity) { - results.push(maybeEntity); + get message() { + return JSON.stringify(this.issues, util.jsonStringifyReplacer, 2); + } + get isEmpty() { + return this.issues.length === 0; + } + flatten(mapper = (issue) => issue.message) { + const fieldErrors = {}; + const formErrors = []; + for (const sub of this.issues) { + if (sub.path.length > 0) { + fieldErrors[sub.path[0]] = fieldErrors[sub.path[0]] || []; + fieldErrors[sub.path[0]].push(mapper(sub)); + } + else { + formErrors.push(mapper(sub)); } } - return results; - } - /** - * Search layer for entities that match an identifier (case insensitive) - * @param identifier - * @returns - */ - getLdtkEntitiesByIdentifier(identifier) { - return this.ldtkLayer.entityInstances.filter(e => e.__identifier.toLocaleLowerCase() === identifier.toLowerCase()); - } - /** - * Search layer for entities that match a field and optionally a value (both case insensitive) - * @param fieldIdentifier - * @param value - */ - getLdtkEntitiesByField(fieldIdentifier, value) { - return this.ldtkLayer.entityInstances.filter(e => { - if (value !== undefined) { - let normalizedValue = value; - if (typeof value === 'string') { - normalizedValue = value.toLocaleLowerCase(); - } - const field = e.fieldInstances.find(f => f.__identifier.toLocaleLowerCase() === fieldIdentifier.toLocaleLowerCase()); - if (field) { - return field.__value === normalizedValue; - } - return false; - } - else { - return !!e.fieldInstances.find(f => f.__identifier.toLocaleLowerCase() === fieldIdentifier.toLocaleLowerCase()); - } - }); - } -} - - -/***/ }), - -/***/ "./src/file-loader.ts": -/*!****************************!*\ - !*** ./src/file-loader.ts ***! - \****************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ FetchLoader: () => (/* binding */ FetchLoader) -/* harmony export */ }); -const FetchLoader = async (path, contentType) => { - const response = await fetch(path); - switch (contentType.toLowerCase()) { - case 'xml': return await response.text(); - case 'json': return await response.json(); - default: return await response.text(); - } -}; - - -/***/ }), - -/***/ "./src/index.ts": -/*!**********************!*\ - !*** ./src/index.ts ***! - \**********************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ EntityLayer: () => (/* reexport safe */ _entity_layer__WEBPACK_IMPORTED_MODULE_1__.EntityLayer), -/* harmony export */ FetchLoader: () => (/* reexport safe */ _file_loader__WEBPACK_IMPORTED_MODULE_2__.FetchLoader), -/* harmony export */ IntGridLayer: () => (/* reexport safe */ _intgrid_layer__WEBPACK_IMPORTED_MODULE_3__.IntGridLayer), -/* harmony export */ LdtkEntityDefinition: () => (/* reexport safe */ _types__WEBPACK_IMPORTED_MODULE_10__.LdtkEntityDefinition), -/* harmony export */ LdtkEntityInstance: () => (/* reexport safe */ _types__WEBPACK_IMPORTED_MODULE_10__.LdtkEntityInstance), -/* harmony export */ LdtkLayerDefinition: () => (/* reexport safe */ _types__WEBPACK_IMPORTED_MODULE_10__.LdtkLayerDefinition), -/* harmony export */ LdtkLayerInstance: () => (/* reexport safe */ _types__WEBPACK_IMPORTED_MODULE_10__.LdtkLayerInstance), -/* harmony export */ LdtkLevel: () => (/* reexport safe */ _types__WEBPACK_IMPORTED_MODULE_10__.LdtkLevel), -/* harmony export */ LdtkProjectMetadata: () => (/* reexport safe */ _types__WEBPACK_IMPORTED_MODULE_10__.LdtkProjectMetadata), -/* harmony export */ LdtkResource: () => (/* reexport safe */ _ldtk_resource__WEBPACK_IMPORTED_MODULE_0__.LdtkResource), -/* harmony export */ Level: () => (/* reexport safe */ _level__WEBPACK_IMPORTED_MODULE_5__.Level), -/* harmony export */ LevelResource: () => (/* reexport safe */ _level_resource__WEBPACK_IMPORTED_MODULE_4__.LevelResource), -/* harmony export */ LoaderCache: () => (/* reexport safe */ _loader_cache__WEBPACK_IMPORTED_MODULE_6__.LoaderCache), -/* harmony export */ TileLayer: () => (/* reexport safe */ _tile_layer__WEBPACK_IMPORTED_MODULE_8__.TileLayer), -/* harmony export */ Tileset: () => (/* reexport safe */ _tileset__WEBPACK_IMPORTED_MODULE_9__.Tileset), -/* harmony export */ filenameFromPath: () => (/* reexport safe */ _path_util__WEBPACK_IMPORTED_MODULE_7__.filenameFromPath), -/* harmony export */ mapPath: () => (/* reexport safe */ _path_util__WEBPACK_IMPORTED_MODULE_7__.mapPath), -/* harmony export */ pathInMap: () => (/* reexport safe */ _path_util__WEBPACK_IMPORTED_MODULE_7__.pathInMap), -/* harmony export */ pathRelativeToBase: () => (/* reexport safe */ _path_util__WEBPACK_IMPORTED_MODULE_7__.pathRelativeToBase) -/* harmony export */ }); -/* harmony import */ var _ldtk_resource__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ldtk-resource */ "./src/ldtk-resource.ts"); -/* harmony import */ var _entity_layer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./entity-layer */ "./src/entity-layer.ts"); -/* harmony import */ var _file_loader__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./file-loader */ "./src/file-loader.ts"); -/* harmony import */ var _intgrid_layer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./intgrid-layer */ "./src/intgrid-layer.ts"); -/* harmony import */ var _level_resource__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./level-resource */ "./src/level-resource.ts"); -/* harmony import */ var _level__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./level */ "./src/level.ts"); -/* harmony import */ var _loader_cache__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./loader-cache */ "./src/loader-cache.ts"); -/* harmony import */ var _path_util__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./path-util */ "./src/path-util.ts"); -/* harmony import */ var _tile_layer__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./tile-layer */ "./src/tile-layer.ts"); -/* harmony import */ var _tileset__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./tileset */ "./src/tileset.ts"); -/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./types */ "./src/types.ts"); - - - - - - - - - - - - - -/***/ }), - -/***/ "./src/intgrid-layer.ts": -/*!******************************!*\ - !*** ./src/intgrid-layer.ts ***! - \******************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ IntGridLayer: () => (/* binding */ IntGridLayer) -/* harmony export */ }); -/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); - -class IntGridLayer { - constructor(level, ldtkLayer, resource, order) { - var _a, _b, _c, _d; - this.order = order; - this.worldPos = (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(level.ldtkLevel.worldX, level.ldtkLevel.worldY); - this.offset = (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(ldtkLayer.__pxTotalOffsetX, ldtkLayer.__pxTotalOffsetY); - this.ldtkLayer = ldtkLayer; - if (ldtkLayer.intGridCsv.length || ldtkLayer.autoLayerTiles.length) { - const rows = ldtkLayer.__cHei; - const columns = ldtkLayer.__cWid; - this.tilemap = new excalibur__WEBPACK_IMPORTED_MODULE_0__.TileMap({ - name: ldtkLayer.__identifier, - pos: this.worldPos.add(this.offset), - tileWidth: ldtkLayer.__gridSize, - tileHeight: ldtkLayer.__gridSize, - rows, - columns, - }); - this.tilemap.z = order; - const graphics = this.tilemap.get(excalibur__WEBPACK_IMPORTED_MODULE_0__.GraphicsComponent); - graphics.isVisible = ldtkLayer.visible; - // find the intgrid metadata - const layerMetadata = resource.projectMetadata.defs.layers.find(l => { - return ldtkLayer.__identifier === l.identifier; - }); - if (layerMetadata) { - const solidValue = layerMetadata.intGridValues.find(val => { - var _a; - return ((_a = val === null || val === void 0 ? void 0 : val.identifier) === null || _a === void 0 ? void 0 : _a.toLocaleLowerCase()) === 'solid'; - }); - for (let i = 0; i < ldtkLayer.intGridCsv.length; i++) { - const xCoord = i % columns; - const yCoord = Math.floor(i / columns); - const tile = this.tilemap.getTile(xCoord, yCoord); - if (solidValue && ldtkLayer.intGridCsv[i] === solidValue.value) { - tile.solid = true; - } - // TODO might be a mistake to treat 1 as solid if there isn't a labelled solid - if (!solidValue && ldtkLayer.intGridCsv[i] === 1) { - tile.solid = true; - } - } - if (ldtkLayer.__tilesetDefUid) { - this.tileset = resource.tilesets.get(ldtkLayer.__tilesetDefUid); - for (let i = 0; i < ldtkLayer.autoLayerTiles.length; i++) { - const tile = ldtkLayer.autoLayerTiles[i]; - const xCoord = Math.floor(tile.px[0] / ldtkLayer.__gridSize); - const yCoord = Math.floor(tile.px[1] / ldtkLayer.__gridSize); - const exTile = this.tilemap.getTile(xCoord, yCoord); - if (exTile && this.tileset) { - const tsxCoord = Math.floor((tile.src[0] - ((_a = this.tileset.ldtkTileset.padding) !== null && _a !== void 0 ? _a : 0)) / (this.tileset.ldtkTileset.tileGridSize + ((_b = this.tileset.ldtkTileset.spacing) !== null && _b !== void 0 ? _b : 0))); - const tsyCoord = Math.floor((tile.src[1] - ((_c = this.tileset.ldtkTileset.padding) !== null && _c !== void 0 ? _c : 0)) / (this.tileset.ldtkTileset.tileGridSize + ((_d = this.tileset.ldtkTileset.spacing) !== null && _d !== void 0 ? _d : 0))); - // Bit 0 toggles x flip - // Bit 1 toggles 1 flip - // Examples: f=0 (no flip), f=1 (X flip only), f=2 (Y flip only), f=3 (both flips) - const flipHorizontal = !!(tile.f & 0b01); - const flipVertical = !!(tile.f & 0b10); - let sprite = this.tileset.spritesheet.getSprite(tsxCoord, tsyCoord); - if (flipHorizontal || flipVertical) { - sprite = sprite.clone(); - sprite.flipHorizontal = flipHorizontal; - sprite.flipVertical = flipVertical; - } - if (sprite) { - exTile.addGraphic(sprite); - } - else { - console.error('Could not find sprite in LDtk spritesheet at', tsxCoord, tsyCoord); - } - } - } - } - } - } - } -} - - -/***/ }), - -/***/ "./src/ldtk-resource.ts": -/*!******************************!*\ - !*** ./src/ldtk-resource.ts ***! - \******************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ LdtkResource: () => (/* binding */ LdtkResource) -/* harmony export */ }); -/* harmony import */ var _tile_layer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./tile-layer */ "./src/tile-layer.ts"); -/* harmony import */ var _path_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./path-util */ "./src/path-util.ts"); -/* harmony import */ var _file_loader__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./file-loader */ "./src/file-loader.ts"); -/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./types */ "./src/types.ts"); -/* harmony import */ var compare_versions__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! compare-versions */ "./node_modules/compare-versions/lib/esm/compare.js"); -/* harmony import */ var _loader_cache__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./loader-cache */ "./src/loader-cache.ts"); -/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); -/* harmony import */ var _level_resource__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./level-resource */ "./src/level-resource.ts"); -/* harmony import */ var _tileset__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./tileset */ "./src/tileset.ts"); -/* harmony import */ var _level__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./level */ "./src/level.ts"); -/* harmony import */ var _entity_layer__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./entity-layer */ "./src/entity-layer.ts"); -/* harmony import */ var _intgrid_layer__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./intgrid-layer */ "./src/intgrid-layer.ts"); - - - - - - - - - - - - -class LdtkResource { - constructor(path, options) { - this.path = path; - this.tilesets = new Map(); - this.levels = new Map(); - this.levelsByName = new Map(); - this.factories = new Map(); - this.fileLoader = _file_loader__WEBPACK_IMPORTED_MODULE_2__.FetchLoader; - this._imageLoader = new _loader_cache__WEBPACK_IMPORTED_MODULE_4__.LoaderCache(excalibur__WEBPACK_IMPORTED_MODULE_10__.ImageSource); - this._levelLoader = new _loader_cache__WEBPACK_IMPORTED_MODULE_4__.LoaderCache(_level_resource__WEBPACK_IMPORTED_MODULE_5__.LevelResource); - this.startZIndex = 0; - this.textQuality = 4; - this.useExcaliburWiring = true; - this.useMapBackgroundColor = false; - this.useTilemapCameraStrategy = false; - this.headless = false; - this.strict = true; - const { useExcaliburWiring, useTilemapCameraStrategy, entityIdentifierFactories, pathMap, useMapBackgroundColor, fileLoader, strict, headless, startZIndex } = { ...options }; - this.strict = strict !== null && strict !== void 0 ? strict : this.strict; - this.headless = headless !== null && headless !== void 0 ? headless : this.headless; - this.useExcaliburWiring = useExcaliburWiring !== null && useExcaliburWiring !== void 0 ? useExcaliburWiring : this.useExcaliburWiring; - this.useTilemapCameraStrategy = useTilemapCameraStrategy !== null && useTilemapCameraStrategy !== void 0 ? useTilemapCameraStrategy : this.useTilemapCameraStrategy; - this.useMapBackgroundColor = useMapBackgroundColor !== null && useMapBackgroundColor !== void 0 ? useMapBackgroundColor : this.useMapBackgroundColor; - this.startZIndex = startZIndex !== null && startZIndex !== void 0 ? startZIndex : this.startZIndex; - this.fileLoader = fileLoader !== null && fileLoader !== void 0 ? fileLoader : this.fileLoader; - this.pathMap = pathMap; - for (const key in entityIdentifierFactories) { - this.registerEntityIdentifierFactory(key, entityIdentifierFactories[key]); - } - } - async load() { - var _a; - const data = await this.fileLoader(this.path, 'json'); - if (this.strict) { - try { - this.projectMetadata = _types__WEBPACK_IMPORTED_MODULE_3__.LdtkProjectMetadata.parse(data); - } - catch (e) { - console.error(`Could not parse LDtk map from location ${this.path}.\nExcalibur only supports the latest version of LDtk formats as of the plugin's release.`); - console.error(`Is your map file corrupted or being interpreted as the wrong type?`); - throw e; - } - } - else { - this.projectMetadata = data; - } - if ((0,compare_versions__WEBPACK_IMPORTED_MODULE_11__.compare)(LdtkResource.supportedLdtkVersion, (_a = this.projectMetadata.jsonVersion) !== null && _a !== void 0 ? _a : '0.0.0', ">")) { - console.warn(`The excalibur ldtk plugin officially supports ${LdtkResource.supportedLdtkVersion}+, the current map has LDtk version ${this.projectMetadata.jsonVersion}`); - } - // iterate through the defs - // load the tilesets - const imagesToLoad = []; - for (let tileset of this.projectMetadata.defs.tilesets) { - if (tileset.relPath) { - const imagePath = (0,_path_util__WEBPACK_IMPORTED_MODULE_1__.pathRelativeToBase)(this.path, tileset.relPath, this.pathMap); - const image = this._imageLoader.getOrAdd(imagePath); - const friendlyTileset = new _tileset__WEBPACK_IMPORTED_MODULE_6__.Tileset({ - image, - ldtkTileset: tileset - }); - this.tilesets.set(tileset.uid, friendlyTileset); - } - else { - if (tileset.identifier !== 'Internal_Icons') { - console.warn(`No tileset image provided for ${tileset.identifier}`); - } - } - } - // iterate through the levels - // load the level metadata - for (let level of this.projectMetadata.levels) { - if (level.externalRelPath) { - // external levels - const levelPath = (0,_path_util__WEBPACK_IMPORTED_MODULE_1__.pathRelativeToBase)(this.path, level.externalRelPath, this.pathMap); - this._levelLoader.getOrAdd(levelPath, this, { - headless: this.headless, - strict: this.strict, - fileLoader: this.fileLoader, - imageLoader: this._imageLoader, - pathMap: this.pathMap - }); - } - else { - // embedded levels - const friendlyLevel = new _level__WEBPACK_IMPORTED_MODULE_7__.Level(level, this); - this.levels.set(level.uid, friendlyLevel); - this.levelsByName.set(level.identifier.toLowerCase(), friendlyLevel); - } - } - await Promise.all([this._imageLoader.load(), this._levelLoader.load()]); - this._levelLoader.values().forEach(level => { - this.levels.set(level.data.ldtkLevel.uid, level.data); - this.levelsByName.set(level.data.ldtkLevel.identifier.toLowerCase(), level.data); - }); - return this.data = this.projectMetadata; - } - ; - isLoaded() { - return !!this.data; - } - registerEntityIdentifierFactory(ldtkEntityIdentifier, factory) { - this.factories.set(ldtkEntityIdentifier, factory); - } - registerEntityIdentifierFactories(factories) { - for (const key in factories) { - this.registerEntityIdentifierFactory(key, factories[key]); - } - } - /** - * Get a level by identifier - * @param identifier - * @returns - */ - getLevel(identifier) { - return this.levelsByName.get(identifier.toLowerCase()); - } - /** - * Get the entity layers, optionally provide a level identifier to filter to - * @param levelIdentifier - */ - getEntityLayers(levelIdentifier) { - let results = []; - if (levelIdentifier) { - const level = this.getLevel(levelIdentifier); - if (level) { - for (let layer of level.layers) { - if (layer instanceof _entity_layer__WEBPACK_IMPORTED_MODULE_8__.EntityLayer) { - results.push(layer); - } - } - } - } - else { - for (const level of this.levels.values()) { - for (let layer of level.layers) { - if (layer instanceof _entity_layer__WEBPACK_IMPORTED_MODULE_8__.EntityLayer) { - results.push(layer); - } - } - } - } - return results; - } - getTileLayers(identifier) { - let results = []; - if (identifier) { - const level = this.getLevel(identifier); - if (level) { - for (let layer of level.layers) { - if (layer instanceof _tile_layer__WEBPACK_IMPORTED_MODULE_0__.TileLayer) { - results.push(layer); - } - } - } - } - else { - for (const level of this.levels.values()) { - for (let layer of level.layers) { - if (layer instanceof _tile_layer__WEBPACK_IMPORTED_MODULE_0__.TileLayer) { - results.push(layer); - } - } - } - } - return results; - } - getIntGridLayers(identifier) { - let results = []; - if (identifier) { - const level = this.getLevel(identifier); - if (level) { - for (let layer of level.layers) { - if (layer instanceof _intgrid_layer__WEBPACK_IMPORTED_MODULE_9__.IntGridLayer) { - results.push(layer); - } - } - } - } - else { - for (const level of this.levels.values()) { - for (let layer of level.layers) { - if (layer instanceof _intgrid_layer__WEBPACK_IMPORTED_MODULE_9__.IntGridLayer) { - results.push(layer); - } - } - } - } - return results; - } - /** - * Search layer for entities that match an identifier (case insensitive) - * @param identifier - * @returns - */ - getLdtkEntitiesByIdentifier(identifier, levels) { - let results = []; - const levelsToSearch = levels !== null && levels !== void 0 ? levels : Array.from(this.levels.values()).map(l => l.ldtkLevel.identifier); - for (const level of levelsToSearch) { - const layers = this.getEntityLayers(level); - for (let layer of layers) { - results = results.concat(layer.getLdtkEntitiesByIdentifier(identifier)); - } - } - return results; - } - /** - * Search levels for ldtk entities that match a field and optionally a value (both case insensitive) - * @param fieldIdentifier - * @param value - */ - getLdtkEntitiesByField(fieldIdentifier, value, levels) { - let results = []; - const levelsToSearch = levels !== null && levels !== void 0 ? levels : Array.from(this.levels.values()).map(l => l.ldtkLevel.identifier); - for (const level of levelsToSearch) { - const layers = this.getEntityLayers(level); - for (let layer of layers) { - results = results.concat(layer.getLdtkEntitiesByField(fieldIdentifier, value)); - } - } - return results; - } - /** - * Search levels for excalibur entities that match an identifier (case insensitive) - * @param identifier - * @param levels - */ - getEntitiesByIdentifier(identifier, levels) { - let results = []; - const levelsToSearch = levels !== null && levels !== void 0 ? levels : Array.from(this.levels.values()).map(l => l.ldtkLevel.identifier); - for (const level of levelsToSearch) { - const layers = this.getEntityLayers(level); - for (let layer of layers) { - results = results.concat(layer.getEntitiesByIdentifier(identifier)); - } - } - return results; - } - /** - * Search levels for excalibur entities that match a field and optionally a value (both case insensitive) - * @param fieldIdentifier - * @param value - * @param levels - */ - getEntitiesByField(fieldIdentifier, value, levels) { - let results = []; - const levelsToSearch = levels !== null && levels !== void 0 ? levels : Array.from(this.levels.values()).map(l => l.ldtkLevel.identifier); - for (const level of levelsToSearch) { - const layers = this.getEntityLayers(level); - for (let layer of layers) { - results = results.concat(layer.getEntitiesByField(fieldIdentifier, value)); - } - } - return results; - } - /** - * Get the level bounds given a list of level identifiers (case insensitive) - * @param levels - */ - getLevelBounds(levels) { - levels = levels !== null && levels !== void 0 ? levels : Array.from(this.levelsByName.keys()); - let bounds = null; - for (const level of this.levels.values()) { - if (!levels.includes(level.ldtkLevel.identifier)) { - continue; - } - const firstTileLayer = this.getTileLayers(level.ldtkLevel.identifier)[0]; - if (firstTileLayer) { - const tileBounds = excalibur__WEBPACK_IMPORTED_MODULE_10__.BoundingBox.fromDimension(firstTileLayer.tilemap.tileWidth * firstTileLayer.tilemap.columns, firstTileLayer.tilemap.tileHeight * firstTileLayer.tilemap.rows, excalibur__WEBPACK_IMPORTED_MODULE_10__.Vector.Zero, firstTileLayer.tilemap.pos); - if (!bounds) { - bounds = tileBounds; - } - else { - bounds = bounds.combine(tileBounds); - } - } - } - return bounds !== null && bounds !== void 0 ? bounds : new excalibur__WEBPACK_IMPORTED_MODULE_10__.BoundingBox(); - } - addToScene(scene, options) { - var _a, _b; - const { pos, useLevelOffsets } = { pos: (0,excalibur__WEBPACK_IMPORTED_MODULE_10__.vec)(0, 0), useLevelOffsets: true, ...options }; - for (let [id, level] of this.levels.entries()) { - if ((_a = options === null || options === void 0 ? void 0 : options.levelFilter) === null || _a === void 0 ? void 0 : _a.length) { - if (!options.levelFilter.includes(level.ldtkLevel.identifier)) { - continue; - } - } - for (let layer of level.layers) { - if (layer instanceof _tile_layer__WEBPACK_IMPORTED_MODULE_0__.TileLayer || layer instanceof _intgrid_layer__WEBPACK_IMPORTED_MODULE_9__.IntGridLayer) { - layer.tilemap.pos = layer.tilemap.pos.add(pos); - if (!useLevelOffsets) { - layer.tilemap.pos = layer.tilemap.pos.sub(layer.worldPos); - } - scene.add(layer.tilemap); - } - else { - layer.runFactories(); - for (let entity of layer.entities) { - const tx = entity.get(excalibur__WEBPACK_IMPORTED_MODULE_10__.TransformComponent); - if (tx) { - tx.pos = tx.pos.add(pos); - if (!useLevelOffsets) { - tx.pos = tx.pos.sub(layer.worldPos); - } - } - scene.add(entity); - } - } - } - } - if (this.useExcaliburWiring) { - const camera = this.getLdtkEntitiesByField('camera', true)[0]; - if (camera) { - scene.camera.pos = (0,excalibur__WEBPACK_IMPORTED_MODULE_10__.vec)(camera.px[0], camera.px[0]); - const zoom = camera.fieldInstances.find(f => f.__identifier.toLocaleLowerCase() === 'zoom'); - if (zoom) { - scene.camera.zoom = +zoom.__value; - } - } - } - if (this.useTilemapCameraStrategy) { - let bounds = this.getLevelBounds(options === null || options === void 0 ? void 0 : options.levelFilter); - scene.camera.strategy.limitCameraBounds(bounds); - } - if (this.useMapBackgroundColor) { - for (let [id, level] of this.levels.entries()) { - if ((_b = options === null || options === void 0 ? void 0 : options.levelFilter) === null || _b === void 0 ? void 0 : _b.length) { - if (!options.levelFilter.includes(level.ldtkLevel.identifier)) { - continue; - } - } - scene.backgroundColor = level.backgroundColor; - break; - } - } - } -} -LdtkResource.supportedLdtkVersion = "1.5.3"; - - -/***/ }), - -/***/ "./src/level-resource.ts": -/*!*******************************!*\ - !*** ./src/level-resource.ts ***! - \*******************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ LevelResource: () => (/* binding */ LevelResource) -/* harmony export */ }); -/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); -/* harmony import */ var _loader_cache__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./loader-cache */ "./src/loader-cache.ts"); -/* harmony import */ var _file_loader__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./file-loader */ "./src/file-loader.ts"); -/* harmony import */ var _level__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./level */ "./src/level.ts"); -/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./types */ "./src/types.ts"); - - - - - -/** - * Loads LDtk levels that are stored in separate files - */ -class LevelResource { - constructor(path, resource, options) { - this.path = path; - this.resource = resource; - this.fileLoader = _file_loader__WEBPACK_IMPORTED_MODULE_1__.FetchLoader; - this.strict = true; - this.headless = false; - const { headless, strict, fileLoader, imageLoader, pathMap } = { ...options }; - this.fileLoader = fileLoader !== null && fileLoader !== void 0 ? fileLoader : this.fileLoader; - this.strict = strict !== null && strict !== void 0 ? strict : this.strict; - this.headless = headless !== null && headless !== void 0 ? headless : this.headless; - this.imageLoader = imageLoader !== null && imageLoader !== void 0 ? imageLoader : new _loader_cache__WEBPACK_IMPORTED_MODULE_0__.LoaderCache(excalibur__WEBPACK_IMPORTED_MODULE_4__.ImageSource); - this.pathMap = pathMap !== null && pathMap !== void 0 ? pathMap : this.pathMap; - } - async load() { - const data = await this.fileLoader(this.path, 'json'); - let level; - if (this.strict) { - try { - level = _types__WEBPACK_IMPORTED_MODULE_3__.LdtkLevel.parse(data); - } - catch (e) { - console.error(`Could not parse LDtk level data at ${this.path} are you sure a level is there and not corrupt?`); - throw e; - } - } - else { - level = data; - } - return this.data = new _level__WEBPACK_IMPORTED_MODULE_2__.Level(level, this.resource); - } - isLoaded() { - return !!this.data; - } -} - - -/***/ }), - -/***/ "./src/level.ts": -/*!**********************!*\ - !*** ./src/level.ts ***! - \**********************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ Level: () => (/* binding */ Level) -/* harmony export */ }); -/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); -/* harmony import */ var _entity_layer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./entity-layer */ "./src/entity-layer.ts"); -/* harmony import */ var _intgrid_layer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./intgrid-layer */ "./src/intgrid-layer.ts"); -/* harmony import */ var _tile_layer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tile-layer */ "./src/tile-layer.ts"); - - - - -class Level { - constructor(ldtkLevel, resource) { - var _a, _b, _c, _d; - this.ldtkLevel = ldtkLevel; - this.resource = resource; - this.layers = []; - if (ldtkLevel.__bgColor) { - this.backgroundColor = excalibur__WEBPACK_IMPORTED_MODULE_3__.Color.fromHex(ldtkLevel.__bgColor); - } - if (ldtkLevel.layerInstances) { - let order = resource.startZIndex; - let layers = ldtkLevel.layerInstances.slice().reverse(); - for (let layer of layers) { - if (((_a = layer.entityInstances) === null || _a === void 0 ? void 0 : _a.length) !== 0) { - this.layers.push(new _entity_layer__WEBPACK_IMPORTED_MODULE_0__.EntityLayer(this, layer, resource, order)); - } - if (((_b = layer.gridTiles) === null || _b === void 0 ? void 0 : _b.length) !== 0) { - this.layers.push(new _tile_layer__WEBPACK_IMPORTED_MODULE_2__.TileLayer(this, layer, resource, order)); - } - // Includes standard IntGrid, IntGrid w/ AutoTile & AutoTile layers - if (((_c = layer.intGridCsv) === null || _c === void 0 ? void 0 : _c.length) !== 0 || ((_d = layer.autoLayerTiles) === null || _d === void 0 ? void 0 : _d.length) !== 0) { - this.layers.push(new _intgrid_layer__WEBPACK_IMPORTED_MODULE_1__.IntGridLayer(this, layer, resource, order)); - } - order++; - } - } - } -} - - -/***/ }), - -/***/ "./src/loader-cache.ts": -/*!*****************************!*\ - !*** ./src/loader-cache.ts ***! - \*****************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ LoaderCache: () => (/* binding */ LoaderCache) -/* harmony export */ }); -/** - * Read through cache for loadables - */ -class LoaderCache { - constructor(type) { - this.type = type; - this._loaded = false; - this.cache = new Map(); - } - getOrAdd(...args) { - let resource = this.cache.get(args.join('+')); - if (resource) { - return resource; - } - resource = new this.type(...args); - this.cache.set(args.join('+'), resource); - return resource; - } - values() { - if (this._loaded) { - return Array.from(this.cache.values()); - } - throw new Error(`Read through cache not yet loaded! No values to return!`); - } - async load() { - const resources = Array.from(this.cache.entries()); - const results = await Promise.allSettled(resources.map(i => i[1].load())); - // Check for errors loading resources - let errored = 0; - for (let i = 0; i < results.length; i++) { - const result = results[i]; - if (result.status === 'rejected') { - console.error(`Error loading resource at ${resources[i][0]}, is your pathMap correct? or your LDtk map corrupted?`, result.reason); - errored++; - } - } - if (errored) { - throw new Error(`Error loading ${errored} resources`); - } - this._loaded = true; - } -} - - -/***/ }), - -/***/ "./src/path-util.ts": -/*!**************************!*\ - !*** ./src/path-util.ts ***! - \**************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ filenameFromPath: () => (/* binding */ filenameFromPath), -/* harmony export */ mapPath: () => (/* binding */ mapPath), -/* harmony export */ pathInMap: () => (/* binding */ pathInMap), -/* harmony export */ pathRelativeToBase: () => (/* binding */ pathRelativeToBase) -/* harmony export */ }); -function filenameFromPath(inputPath) { - const filenameExpression = /[^/\\&\?]+\.\w{2,4}(?=([\#\?&].*$|$))/ig; - const matches = inputPath.match(filenameExpression); - if (matches) { - const match = matches[0]; - return match; - } - throw new Error(`Could not locate filename from path: ${inputPath}`); -} -function mapPath(inputPath, pathMap) { - for (const { path, output } of pathMap) { - if (typeof path === 'string') { - if (inputPath.includes(path)) { - return output; - } - } - else { - const match = inputPath.match(path); - if (match) { - return output.replace('[match]', match[0]); - ; - } - } - } - return inputPath; -} -function pathInMap(inputPath, pathMap) { - if (!pathMap) - return false; - for (const { path, output } of pathMap) { - if (typeof path === 'string') { - if (inputPath.includes(path)) { - return true; - } - } - else { - const match = inputPath.match(path); - if (match) { - return true; - } - } - } - return false; -} -function pathRelativeToBase(basePath, relativeToBase, pathMap) { - if (pathInMap(relativeToBase, pathMap) && pathMap) { - return mapPath(relativeToBase, pathMap); - } - // Use absolute path if specified - if (relativeToBase.indexOf('/') === 0) { - return relativeToBase; - } - const originSplit = basePath.split('/'); - const relativeSplit = relativeToBase.split('/'); - // if origin path is a file, remove it so it's a directory - if (originSplit[originSplit.length - 1].includes('.')) { - originSplit.pop(); - } - return originSplit.concat(relativeSplit).join('/'); -} - - -/***/ }), - -/***/ "./src/tile-layer.ts": -/*!***************************!*\ - !*** ./src/tile-layer.ts ***! - \***************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ TileLayer: () => (/* binding */ TileLayer) -/* harmony export */ }); -/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); - -class TileLayer { - constructor(level, ldtkLayer, resource, order) { - var _a, _b, _c, _d; - this.order = order; - this.worldPos = (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(level.ldtkLevel.worldX, level.ldtkLevel.worldY); - this.offset = (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(ldtkLayer.__pxTotalOffsetX, ldtkLayer.__pxTotalOffsetY); - this.ldtkLayer = ldtkLayer; - this.tilemap = new excalibur__WEBPACK_IMPORTED_MODULE_0__.TileMap({ - name: ldtkLayer.__identifier, - pos: this.worldPos.add(this.offset), - tileWidth: ldtkLayer.__gridSize, - tileHeight: ldtkLayer.__gridSize, - rows: ldtkLayer.__cHei, - columns: ldtkLayer.__cWid, - }); - this.tilemap.z = order; - const graphics = this.tilemap.get(excalibur__WEBPACK_IMPORTED_MODULE_0__.GraphicsComponent); - graphics.isVisible = ldtkLayer.visible; - if (ldtkLayer.__tilesetDefUid) { - this.tileset = resource.tilesets.get(ldtkLayer.__tilesetDefUid); - for (let tile of ldtkLayer.gridTiles) { - const xCoord = Math.floor(tile.px[0] / ldtkLayer.__gridSize); - const yCoord = Math.floor(tile.px[1] / ldtkLayer.__gridSize); - const exTile = this.tilemap.getTile(xCoord, yCoord); - if (this.tileset) { - const tsxCoord = Math.floor((tile.src[0] - ((_a = this.tileset.ldtkTileset.padding) !== null && _a !== void 0 ? _a : 0)) / (this.tileset.ldtkTileset.tileGridSize + ((_b = this.tileset.ldtkTileset.spacing) !== null && _b !== void 0 ? _b : 0))); - const tsyCoord = Math.floor((tile.src[1] - ((_c = this.tileset.ldtkTileset.padding) !== null && _c !== void 0 ? _c : 0)) / (this.tileset.ldtkTileset.tileGridSize + ((_d = this.tileset.ldtkTileset.spacing) !== null && _d !== void 0 ? _d : 0))); - // Bit 0 toggles x flip - // Bit 1 toggles 1 flip - // Examples: f=0 (no flip), f=1 (X flip only), f=2 (Y flip only), f=3 (both flips) - const flipHorizontal = !!(tile.f & 0b01); - const flipVertical = !!(tile.f & 0b10); - let sprite = this.tileset.spritesheet.getSprite(tsxCoord, tsyCoord); - if (flipHorizontal || flipVertical) { - sprite = sprite.clone(); - sprite.flipHorizontal = flipHorizontal; - sprite.flipVertical = flipVertical; - } - if (sprite) { - exTile.addGraphic(sprite); - } - else { - console.error('Could not find sprite in LDtk spritesheet at', tsxCoord, tsyCoord); - } - } - } - } - else { - console.error('Could not tileset in LDtk', ldtkLayer.__tilesetDefUid, ldtkLayer.__tilesetRelPath); - } - } -} - - -/***/ }), - -/***/ "./src/tileset.ts": -/*!************************!*\ - !*** ./src/tileset.ts ***! - \************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ Tileset: () => (/* binding */ Tileset) -/* harmony export */ }); -/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); - -class Tileset { - constructor(options) { - var _a, _b, _c, _d; - const { image, ldtkTileset } = options; - this.image = image; - this.ldtkTileset = ldtkTileset; - this.spritesheet = excalibur__WEBPACK_IMPORTED_MODULE_0__.SpriteSheet.fromImageSource({ - image, - grid: { - rows: ldtkTileset.pxHei / ldtkTileset.tileGridSize, - columns: ldtkTileset.pxWid / ldtkTileset.tileGridSize, - spriteHeight: ldtkTileset.tileGridSize, - spriteWidth: ldtkTileset.tileGridSize - }, - spacing: { - margin: { - x: (_a = ldtkTileset.spacing) !== null && _a !== void 0 ? _a : 0, - y: (_b = ldtkTileset.spacing) !== null && _b !== void 0 ? _b : 0, - }, - originOffset: { - x: (_c = ldtkTileset.padding) !== null && _c !== void 0 ? _c : 0, - y: (_d = ldtkTileset.padding) !== null && _d !== void 0 ? _d : 0 - } - } - }); - } -} - - -/***/ }), - -/***/ "./src/types.ts": -/*!**********************!*\ - !*** ./src/types.ts ***! - \**********************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ LdtkEntityDefinition: () => (/* binding */ LdtkEntityDefinition), -/* harmony export */ LdtkEntityInstance: () => (/* binding */ LdtkEntityInstance), -/* harmony export */ LdtkLayerDefinition: () => (/* binding */ LdtkLayerDefinition), -/* harmony export */ LdtkLayerInstance: () => (/* binding */ LdtkLayerInstance), -/* harmony export */ LdtkLevel: () => (/* binding */ LdtkLevel), -/* harmony export */ LdtkProjectMetadata: () => (/* binding */ LdtkProjectMetadata) -/* harmony export */ }); -/* harmony import */ var zod__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! zod */ "./node_modules/zod/lib/index.mjs"); - -const LdtkTilesetRectangle = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - h: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - tilesetUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - w: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - x: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - y: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() -}); -const LdtkPixel = zod__WEBPACK_IMPORTED_MODULE_0__.z.tuple([zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), zod__WEBPACK_IMPORTED_MODULE_0__.z.number()]); -const LdtkFieldInstance = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - __identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - __tile: LdtkTilesetRectangle.nullable(), - __type: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), //z.union([z.literal('Int'), z.literal('Float'), z.literal('String'), z.literal('Bool'), z.literal('Enum')]), // TODO this might not work with ENUM - __value: zod__WEBPACK_IMPORTED_MODULE_0__.z.any(), - defUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() -}); -const LdtkTileInstance = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - a: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - f: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), // 2-bit int 0bXY flip - px: LdtkPixel, - src: LdtkPixel, - t: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() -}); -const LdtkEntityInstance = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - __grid: LdtkPixel, - __identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - __pivot: LdtkPixel, - __smartColor: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - __tags: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.string()), - __tile: LdtkTilesetRectangle.nullable(), - __worldX: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), - __worldY: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), - defUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - fieldInstances: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkFieldInstance), - height: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - iid: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - px: LdtkPixel, - width: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() -}); -const LdtkLayerInstance = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - __cHei: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - __cWid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - __gridSize: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - __identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - __opacity: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - __pxTotalOffsetX: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - __pxTotalOffsetY: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - __tilesetDefUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), - __tilesetRelPath: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), - __type: zod__WEBPACK_IMPORTED_MODULE_0__.z.union([zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('IntGrid'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('Entities'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('Tiles'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('AutoLayer')]), - autoLayerTiles: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkTileInstance), // only in auto layers - entityInstances: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkEntityInstance), // only in entity layers - gridTiles: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkTileInstance), - iid: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - intGridCsv: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.number()), // __cWid x __cHei, 0 means empty, values start at 1 - layerDefUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - levelId: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - overrideTilesetUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), - pxOffsetX: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - pxOffsetY: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - visible: zod__WEBPACK_IMPORTED_MODULE_0__.z.boolean() -}); -const LdtkLevel = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - __bgColor: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), - bgColor: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), - __bgPos: zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - cropRect: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.tuple([zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), zod__WEBPACK_IMPORTED_MODULE_0__.z.number()])), // cropX, cropY, cropWidth, cropHeight - scale: zod__WEBPACK_IMPORTED_MODULE_0__.z.tuple([zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), zod__WEBPACK_IMPORTED_MODULE_0__.z.number()]), - topLeftPx: LdtkPixel - }).nullable(), - __neighbours: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - dir: zod__WEBPACK_IMPORTED_MODULE_0__.z.union([zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('n'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('s'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('w'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('e'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('ne'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('nw'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('se'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('sw'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('o'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('<'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('>')]), - levelIid: zod__WEBPACK_IMPORTED_MODULE_0__.z.string() - })), - bgRelPath: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), - externalRelPath: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), - fieldInstances: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkFieldInstance), - identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - iid: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - layerInstances: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkLayerInstance).nullable(), // null if the save levels separately is enabled - pxHei: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - pxWid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - uid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - worldDepth: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - worldX: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - worldY: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() -}); -const LdtkWorld = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - iid: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - levels: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkLevel), - worldGridHeight: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - worldGridWidth: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - // TODO is this a typo Vania? - worldLayout: zod__WEBPACK_IMPORTED_MODULE_0__.z.union([zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('Free'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('GridVania'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('LinearHorizontal'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('LinearVertical')]), -}); -const LdtkEnumValueDefinition = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - color: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - id: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - tileRect: LdtkTilesetRectangle.nullable() -}); -const LdtkEnumDefinition = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - externalRelPath: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), - iconTilesetUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), - identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - tags: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.string()), - uid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - values: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkEnumValueDefinition) -}); -const LdtkTilesetDefinition = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - __cHei: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - __cWid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - customData: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - data: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - tileId: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() - })), - embedAtlas: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), - enumTags: zod__WEBPACK_IMPORTED_MODULE_0__.z.optional(zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - enumValueId: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - tileIds: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.number()) - }))), - identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - padding: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - pxHei: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - pxWid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - relPath: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), - spacing: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - tags: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.string()), - tagsSourceEnumUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), - tileGridSize: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - uid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() -}); -const LdtkLayerDefinition = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - __type: zod__WEBPACK_IMPORTED_MODULE_0__.z.union([zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("IntGrid"), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("Entities"), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("Tiles"), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("AutoLayer")]), - autoSourceLayerDefUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), - displayOpacity: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - gridSize: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - intGridValues: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - color: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - groupUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), - tile: LdtkTilesetRectangle.nullable(), - value: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() - })), - intGridValuesGroups: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - color: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), - identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), - uid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() - })), - parallaxFactorX: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - parallaxFactorY: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - parallaxScaling: zod__WEBPACK_IMPORTED_MODULE_0__.z.boolean(), - pxOffsetX: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - pxOffsetY: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - tilesetDefUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), - uid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), -}); -const LdtkEntityDefinition = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - color: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - height: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - nineSliceBorders: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.number()), - pivotX: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - pivotY: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - tileRect: LdtkTilesetRectangle.nullable(), - tileRenderMode: zod__WEBPACK_IMPORTED_MODULE_0__.z.union([ - zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("Cover"), - zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("FitInside"), - zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("Repeat"), - zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("Stretch"), - zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("FullSizeCropped"), - zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("FullSizeUncropped"), - zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("NineSlice") - ]), - tilesetId: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), - uiTileRect: LdtkTilesetRectangle.nullable(), - uid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - width: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() -}); -const LdtkDefinitions = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - tilesets: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkTilesetDefinition), - enums: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkEnumDefinition), - layers: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkLayerDefinition), - entities: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkEntityDefinition) -}); -const LdtkProjectMetadata = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - iid: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - bgColor: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), - defs: LdtkDefinitions, - externalLevels: zod__WEBPACK_IMPORTED_MODULE_0__.z.boolean(), - jsonVersion: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - levels: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkLevel), - toc: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - instancesData: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - fields: zod__WEBPACK_IMPORTED_MODULE_0__.z.any(), - heiPx: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - iids: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - widPix: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - worldX: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - worldY: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() - })) - })), - // Moving to worlds array - worldGridHeight: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), - worldGridWidth: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), - // TODO is this a LDtk docs typo Vania? - worldLayout: zod__WEBPACK_IMPORTED_MODULE_0__.z.union([zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('Free'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('GridVania'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('LinearHorizontal'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('LinearVertical')]).nullable(), - worlds: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkWorld) -}); - - -/***/ }), - -/***/ "./node_modules/zod/lib/index.mjs": -/*!****************************************!*\ - !*** ./node_modules/zod/lib/index.mjs ***! - \****************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ BRAND: () => (/* binding */ BRAND), -/* harmony export */ DIRTY: () => (/* binding */ DIRTY), -/* harmony export */ EMPTY_PATH: () => (/* binding */ EMPTY_PATH), -/* harmony export */ INVALID: () => (/* binding */ INVALID), -/* harmony export */ NEVER: () => (/* binding */ NEVER), -/* harmony export */ OK: () => (/* binding */ OK), -/* harmony export */ ParseStatus: () => (/* binding */ ParseStatus), -/* harmony export */ Schema: () => (/* binding */ ZodType), -/* harmony export */ ZodAny: () => (/* binding */ ZodAny), -/* harmony export */ ZodArray: () => (/* binding */ ZodArray), -/* harmony export */ ZodBigInt: () => (/* binding */ ZodBigInt), -/* harmony export */ ZodBoolean: () => (/* binding */ ZodBoolean), -/* harmony export */ ZodBranded: () => (/* binding */ ZodBranded), -/* harmony export */ ZodCatch: () => (/* binding */ ZodCatch), -/* harmony export */ ZodDate: () => (/* binding */ ZodDate), -/* harmony export */ ZodDefault: () => (/* binding */ ZodDefault), -/* harmony export */ ZodDiscriminatedUnion: () => (/* binding */ ZodDiscriminatedUnion), -/* harmony export */ ZodEffects: () => (/* binding */ ZodEffects), -/* harmony export */ ZodEnum: () => (/* binding */ ZodEnum), -/* harmony export */ ZodError: () => (/* binding */ ZodError), -/* harmony export */ ZodFirstPartyTypeKind: () => (/* binding */ ZodFirstPartyTypeKind), -/* harmony export */ ZodFunction: () => (/* binding */ ZodFunction), -/* harmony export */ ZodIntersection: () => (/* binding */ ZodIntersection), -/* harmony export */ ZodIssueCode: () => (/* binding */ ZodIssueCode), -/* harmony export */ ZodLazy: () => (/* binding */ ZodLazy), -/* harmony export */ ZodLiteral: () => (/* binding */ ZodLiteral), -/* harmony export */ ZodMap: () => (/* binding */ ZodMap), -/* harmony export */ ZodNaN: () => (/* binding */ ZodNaN), -/* harmony export */ ZodNativeEnum: () => (/* binding */ ZodNativeEnum), -/* harmony export */ ZodNever: () => (/* binding */ ZodNever), -/* harmony export */ ZodNull: () => (/* binding */ ZodNull), -/* harmony export */ ZodNullable: () => (/* binding */ ZodNullable), -/* harmony export */ ZodNumber: () => (/* binding */ ZodNumber), -/* harmony export */ ZodObject: () => (/* binding */ ZodObject), -/* harmony export */ ZodOptional: () => (/* binding */ ZodOptional), -/* harmony export */ ZodParsedType: () => (/* binding */ ZodParsedType), -/* harmony export */ ZodPipeline: () => (/* binding */ ZodPipeline), -/* harmony export */ ZodPromise: () => (/* binding */ ZodPromise), -/* harmony export */ ZodReadonly: () => (/* binding */ ZodReadonly), -/* harmony export */ ZodRecord: () => (/* binding */ ZodRecord), -/* harmony export */ ZodSchema: () => (/* binding */ ZodType), -/* harmony export */ ZodSet: () => (/* binding */ ZodSet), -/* harmony export */ ZodString: () => (/* binding */ ZodString), -/* harmony export */ ZodSymbol: () => (/* binding */ ZodSymbol), -/* harmony export */ ZodTransformer: () => (/* binding */ ZodEffects), -/* harmony export */ ZodTuple: () => (/* binding */ ZodTuple), -/* harmony export */ ZodType: () => (/* binding */ ZodType), -/* harmony export */ ZodUndefined: () => (/* binding */ ZodUndefined), -/* harmony export */ ZodUnion: () => (/* binding */ ZodUnion), -/* harmony export */ ZodUnknown: () => (/* binding */ ZodUnknown), -/* harmony export */ ZodVoid: () => (/* binding */ ZodVoid), -/* harmony export */ addIssueToContext: () => (/* binding */ addIssueToContext), -/* harmony export */ any: () => (/* binding */ anyType), -/* harmony export */ array: () => (/* binding */ arrayType), -/* harmony export */ bigint: () => (/* binding */ bigIntType), -/* harmony export */ boolean: () => (/* binding */ booleanType), -/* harmony export */ coerce: () => (/* binding */ coerce), -/* harmony export */ custom: () => (/* binding */ custom), -/* harmony export */ date: () => (/* binding */ dateType), -/* harmony export */ datetimeRegex: () => (/* binding */ datetimeRegex), -/* harmony export */ "default": () => (/* binding */ z), -/* harmony export */ defaultErrorMap: () => (/* binding */ errorMap), -/* harmony export */ discriminatedUnion: () => (/* binding */ discriminatedUnionType), -/* harmony export */ effect: () => (/* binding */ effectsType), -/* harmony export */ "enum": () => (/* binding */ enumType), -/* harmony export */ "function": () => (/* binding */ functionType), -/* harmony export */ getErrorMap: () => (/* binding */ getErrorMap), -/* harmony export */ getParsedType: () => (/* binding */ getParsedType), -/* harmony export */ "instanceof": () => (/* binding */ instanceOfType), -/* harmony export */ intersection: () => (/* binding */ intersectionType), -/* harmony export */ isAborted: () => (/* binding */ isAborted), -/* harmony export */ isAsync: () => (/* binding */ isAsync), -/* harmony export */ isDirty: () => (/* binding */ isDirty), -/* harmony export */ isValid: () => (/* binding */ isValid), -/* harmony export */ late: () => (/* binding */ late), -/* harmony export */ lazy: () => (/* binding */ lazyType), -/* harmony export */ literal: () => (/* binding */ literalType), -/* harmony export */ makeIssue: () => (/* binding */ makeIssue), -/* harmony export */ map: () => (/* binding */ mapType), -/* harmony export */ nan: () => (/* binding */ nanType), -/* harmony export */ nativeEnum: () => (/* binding */ nativeEnumType), -/* harmony export */ never: () => (/* binding */ neverType), -/* harmony export */ "null": () => (/* binding */ nullType), -/* harmony export */ nullable: () => (/* binding */ nullableType), -/* harmony export */ number: () => (/* binding */ numberType), -/* harmony export */ object: () => (/* binding */ objectType), -/* harmony export */ objectUtil: () => (/* binding */ objectUtil), -/* harmony export */ oboolean: () => (/* binding */ oboolean), -/* harmony export */ onumber: () => (/* binding */ onumber), -/* harmony export */ optional: () => (/* binding */ optionalType), -/* harmony export */ ostring: () => (/* binding */ ostring), -/* harmony export */ pipeline: () => (/* binding */ pipelineType), -/* harmony export */ preprocess: () => (/* binding */ preprocessType), -/* harmony export */ promise: () => (/* binding */ promiseType), -/* harmony export */ quotelessJson: () => (/* binding */ quotelessJson), -/* harmony export */ record: () => (/* binding */ recordType), -/* harmony export */ set: () => (/* binding */ setType), -/* harmony export */ setErrorMap: () => (/* binding */ setErrorMap), -/* harmony export */ strictObject: () => (/* binding */ strictObjectType), -/* harmony export */ string: () => (/* binding */ stringType), -/* harmony export */ symbol: () => (/* binding */ symbolType), -/* harmony export */ transformer: () => (/* binding */ effectsType), -/* harmony export */ tuple: () => (/* binding */ tupleType), -/* harmony export */ undefined: () => (/* binding */ undefinedType), -/* harmony export */ union: () => (/* binding */ unionType), -/* harmony export */ unknown: () => (/* binding */ unknownType), -/* harmony export */ util: () => (/* binding */ util), -/* harmony export */ "void": () => (/* binding */ voidType), -/* harmony export */ z: () => (/* binding */ z) -/* harmony export */ }); -var util; -(function (util) { - util.assertEqual = (val) => val; - function assertIs(_arg) { } - util.assertIs = assertIs; - function assertNever(_x) { - throw new Error(); - } - util.assertNever = assertNever; - util.arrayToEnum = (items) => { - const obj = {}; - for (const item of items) { - obj[item] = item; - } - return obj; - }; - util.getValidEnumValues = (obj) => { - const validKeys = util.objectKeys(obj).filter((k) => typeof obj[obj[k]] !== "number"); - const filtered = {}; - for (const k of validKeys) { - filtered[k] = obj[k]; - } - return util.objectValues(filtered); - }; - util.objectValues = (obj) => { - return util.objectKeys(obj).map(function (e) { - return obj[e]; - }); - }; - util.objectKeys = typeof Object.keys === "function" // eslint-disable-line ban/ban - ? (obj) => Object.keys(obj) // eslint-disable-line ban/ban - : (object) => { - const keys = []; - for (const key in object) { - if (Object.prototype.hasOwnProperty.call(object, key)) { - keys.push(key); - } - } - return keys; - }; - util.find = (arr, checker) => { - for (const item of arr) { - if (checker(item)) - return item; - } - return undefined; - }; - util.isInteger = typeof Number.isInteger === "function" - ? (val) => Number.isInteger(val) // eslint-disable-line ban/ban - : (val) => typeof val === "number" && isFinite(val) && Math.floor(val) === val; - function joinValues(array, separator = " | ") { - return array - .map((val) => (typeof val === "string" ? `'${val}'` : val)) - .join(separator); - } - util.joinValues = joinValues; - util.jsonStringifyReplacer = (_, value) => { - if (typeof value === "bigint") { - return value.toString(); - } - return value; - }; -})(util || (util = {})); -var objectUtil; -(function (objectUtil) { - objectUtil.mergeShapes = (first, second) => { - return { - ...first, - ...second, // second overwrites first - }; - }; -})(objectUtil || (objectUtil = {})); -const ZodParsedType = util.arrayToEnum([ - "string", - "nan", - "number", - "integer", - "float", - "boolean", - "date", - "bigint", - "symbol", - "function", - "undefined", - "null", - "array", - "object", - "unknown", - "promise", - "void", - "never", - "map", - "set", -]); -const getParsedType = (data) => { - const t = typeof data; - switch (t) { - case "undefined": - return ZodParsedType.undefined; - case "string": - return ZodParsedType.string; - case "number": - return isNaN(data) ? ZodParsedType.nan : ZodParsedType.number; - case "boolean": - return ZodParsedType.boolean; - case "function": - return ZodParsedType.function; - case "bigint": - return ZodParsedType.bigint; - case "symbol": - return ZodParsedType.symbol; - case "object": - if (Array.isArray(data)) { - return ZodParsedType.array; - } - if (data === null) { - return ZodParsedType.null; - } - if (data.then && - typeof data.then === "function" && - data.catch && - typeof data.catch === "function") { - return ZodParsedType.promise; - } - if (typeof Map !== "undefined" && data instanceof Map) { - return ZodParsedType.map; - } - if (typeof Set !== "undefined" && data instanceof Set) { - return ZodParsedType.set; - } - if (typeof Date !== "undefined" && data instanceof Date) { - return ZodParsedType.date; - } - return ZodParsedType.object; - default: - return ZodParsedType.unknown; - } -}; - -const ZodIssueCode = util.arrayToEnum([ - "invalid_type", - "invalid_literal", - "custom", - "invalid_union", - "invalid_union_discriminator", - "invalid_enum_value", - "unrecognized_keys", - "invalid_arguments", - "invalid_return_type", - "invalid_date", - "invalid_string", - "too_small", - "too_big", - "invalid_intersection_types", - "not_multiple_of", - "not_finite", -]); -const quotelessJson = (obj) => { - const json = JSON.stringify(obj, null, 2); - return json.replace(/"([^"]+)":/g, "$1:"); -}; -class ZodError extends Error { - get errors() { - return this.issues; - } - constructor(issues) { - super(); - this.issues = []; - this.addIssue = (sub) => { - this.issues = [...this.issues, sub]; - }; - this.addIssues = (subs = []) => { - this.issues = [...this.issues, ...subs]; - }; - const actualProto = new.target.prototype; - if (Object.setPrototypeOf) { - // eslint-disable-next-line ban/ban - Object.setPrototypeOf(this, actualProto); - } - else { - this.__proto__ = actualProto; - } - this.name = "ZodError"; - this.issues = issues; - } - format(_mapper) { - const mapper = _mapper || - function (issue) { - return issue.message; - }; - const fieldErrors = { _errors: [] }; - const processError = (error) => { - for (const issue of error.issues) { - if (issue.code === "invalid_union") { - issue.unionErrors.map(processError); - } - else if (issue.code === "invalid_return_type") { - processError(issue.returnTypeError); - } - else if (issue.code === "invalid_arguments") { - processError(issue.argumentsError); - } - else if (issue.path.length === 0) { - fieldErrors._errors.push(mapper(issue)); - } - else { - let curr = fieldErrors; - let i = 0; - while (i < issue.path.length) { - const el = issue.path[i]; - const terminal = i === issue.path.length - 1; - if (!terminal) { - curr[el] = curr[el] || { _errors: [] }; - // if (typeof el === "string") { - // curr[el] = curr[el] || { _errors: [] }; - // } else if (typeof el === "number") { - // const errorArray: any = []; - // errorArray._errors = []; - // curr[el] = curr[el] || errorArray; - // } - } - else { - curr[el] = curr[el] || { _errors: [] }; - curr[el]._errors.push(mapper(issue)); - } - curr = curr[el]; - i++; - } - } - } - }; - processError(this); - return fieldErrors; - } - static assert(value) { - if (!(value instanceof ZodError)) { - throw new Error(`Not a ZodError: ${value}`); - } - } - toString() { - return this.message; - } - get message() { - return JSON.stringify(this.issues, util.jsonStringifyReplacer, 2); - } - get isEmpty() { - return this.issues.length === 0; - } - flatten(mapper = (issue) => issue.message) { - const fieldErrors = {}; - const formErrors = []; - for (const sub of this.issues) { - if (sub.path.length > 0) { - fieldErrors[sub.path[0]] = fieldErrors[sub.path[0]] || []; - fieldErrors[sub.path[0]].push(mapper(sub)); - } - else { - formErrors.push(mapper(sub)); - } - } - return { formErrors, fieldErrors }; + return { formErrors, fieldErrors }; } get formErrors() { return this.flatten(); @@ -44370,37 +43040,37 @@ const isDirty = (x) => x.status === "dirty"; const isValid = (x) => x.status === "valid"; const isAsync = (x) => typeof Promise !== "undefined" && x instanceof Promise; -/****************************************************************************** -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. -***************************************************************************** */ - -function __classPrivateFieldGet(receiver, state, kind, f) { - if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); - return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); -} - -function __classPrivateFieldSet(receiver, state, value, kind, f) { - if (kind === "m") throw new TypeError("Private method is not writable"); - if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); - return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; -} - -typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) { - var e = new Error(message); - return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e; +/****************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ + +function __classPrivateFieldGet(receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); +} + +function __classPrivateFieldSet(receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; +} + +typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) { + var e = new Error(message); + return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e; }; var errorUtil; @@ -45325,115 +43995,550 @@ class ZodString extends ZodType { ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message), }); } - startsWith(value, message) { - return this._addCheck({ - kind: "startsWith", - value: value, - ...errorUtil.errToObj(message), + startsWith(value, message) { + return this._addCheck({ + kind: "startsWith", + value: value, + ...errorUtil.errToObj(message), + }); + } + endsWith(value, message) { + return this._addCheck({ + kind: "endsWith", + value: value, + ...errorUtil.errToObj(message), + }); + } + min(minLength, message) { + return this._addCheck({ + kind: "min", + value: minLength, + ...errorUtil.errToObj(message), + }); + } + max(maxLength, message) { + return this._addCheck({ + kind: "max", + value: maxLength, + ...errorUtil.errToObj(message), + }); + } + length(len, message) { + return this._addCheck({ + kind: "length", + value: len, + ...errorUtil.errToObj(message), + }); + } + /** + * Equivalent to `.min(1)` + */ + nonempty(message) { + return this.min(1, errorUtil.errToObj(message)); + } + trim() { + return new ZodString({ + ...this._def, + checks: [...this._def.checks, { kind: "trim" }], + }); + } + toLowerCase() { + return new ZodString({ + ...this._def, + checks: [...this._def.checks, { kind: "toLowerCase" }], + }); + } + toUpperCase() { + return new ZodString({ + ...this._def, + checks: [...this._def.checks, { kind: "toUpperCase" }], + }); + } + get isDatetime() { + return !!this._def.checks.find((ch) => ch.kind === "datetime"); + } + get isDate() { + return !!this._def.checks.find((ch) => ch.kind === "date"); + } + get isTime() { + return !!this._def.checks.find((ch) => ch.kind === "time"); + } + get isDuration() { + return !!this._def.checks.find((ch) => ch.kind === "duration"); + } + get isEmail() { + return !!this._def.checks.find((ch) => ch.kind === "email"); + } + get isURL() { + return !!this._def.checks.find((ch) => ch.kind === "url"); + } + get isEmoji() { + return !!this._def.checks.find((ch) => ch.kind === "emoji"); + } + get isUUID() { + return !!this._def.checks.find((ch) => ch.kind === "uuid"); + } + get isNANOID() { + return !!this._def.checks.find((ch) => ch.kind === "nanoid"); + } + get isCUID() { + return !!this._def.checks.find((ch) => ch.kind === "cuid"); + } + get isCUID2() { + return !!this._def.checks.find((ch) => ch.kind === "cuid2"); + } + get isULID() { + return !!this._def.checks.find((ch) => ch.kind === "ulid"); + } + get isIP() { + return !!this._def.checks.find((ch) => ch.kind === "ip"); + } + get isCIDR() { + return !!this._def.checks.find((ch) => ch.kind === "cidr"); + } + get isBase64() { + return !!this._def.checks.find((ch) => ch.kind === "base64"); + } + get isBase64url() { + // base64url encoding is a modification of base64 that can safely be used in URLs and filenames + return !!this._def.checks.find((ch) => ch.kind === "base64url"); + } + get minLength() { + let min = null; + for (const ch of this._def.checks) { + if (ch.kind === "min") { + if (min === null || ch.value > min) + min = ch.value; + } + } + return min; + } + get maxLength() { + let max = null; + for (const ch of this._def.checks) { + if (ch.kind === "max") { + if (max === null || ch.value < max) + max = ch.value; + } + } + return max; + } +} +ZodString.create = (params) => { + var _a; + return new ZodString({ + checks: [], + typeName: ZodFirstPartyTypeKind.ZodString, + coerce: (_a = params === null || params === void 0 ? void 0 : params.coerce) !== null && _a !== void 0 ? _a : false, + ...processCreateParams(params), + }); +}; +// https://stackoverflow.com/questions/3966484/why-does-modulus-operator-return-fractional-number-in-javascript/31711034#31711034 +function floatSafeRemainder(val, step) { + const valDecCount = (val.toString().split(".")[1] || "").length; + const stepDecCount = (step.toString().split(".")[1] || "").length; + const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount; + const valInt = parseInt(val.toFixed(decCount).replace(".", "")); + const stepInt = parseInt(step.toFixed(decCount).replace(".", "")); + return (valInt % stepInt) / Math.pow(10, decCount); +} +class ZodNumber extends ZodType { + constructor() { + super(...arguments); + this.min = this.gte; + this.max = this.lte; + this.step = this.multipleOf; + } + _parse(input) { + if (this._def.coerce) { + input.data = Number(input.data); + } + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.number) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.number, + received: ctx.parsedType, + }); + return INVALID; + } + let ctx = undefined; + const status = new ParseStatus(); + for (const check of this._def.checks) { + if (check.kind === "int") { + if (!util.isInteger(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: "integer", + received: "float", + message: check.message, + }); + status.dirty(); + } + } + else if (check.kind === "min") { + const tooSmall = check.inclusive + ? input.data < check.value + : input.data <= check.value; + if (tooSmall) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + minimum: check.value, + type: "number", + inclusive: check.inclusive, + exact: false, + message: check.message, + }); + status.dirty(); + } + } + else if (check.kind === "max") { + const tooBig = check.inclusive + ? input.data > check.value + : input.data >= check.value; + if (tooBig) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + maximum: check.value, + type: "number", + inclusive: check.inclusive, + exact: false, + message: check.message, + }); + status.dirty(); + } + } + else if (check.kind === "multipleOf") { + if (floatSafeRemainder(input.data, check.value) !== 0) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.not_multiple_of, + multipleOf: check.value, + message: check.message, + }); + status.dirty(); + } + } + else if (check.kind === "finite") { + if (!Number.isFinite(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.not_finite, + message: check.message, + }); + status.dirty(); + } + } + else { + util.assertNever(check); + } + } + return { status: status.value, value: input.data }; + } + gte(value, message) { + return this.setLimit("min", value, true, errorUtil.toString(message)); + } + gt(value, message) { + return this.setLimit("min", value, false, errorUtil.toString(message)); + } + lte(value, message) { + return this.setLimit("max", value, true, errorUtil.toString(message)); + } + lt(value, message) { + return this.setLimit("max", value, false, errorUtil.toString(message)); + } + setLimit(kind, value, inclusive, message) { + return new ZodNumber({ + ...this._def, + checks: [ + ...this._def.checks, + { + kind, + value, + inclusive, + message: errorUtil.toString(message), + }, + ], + }); + } + _addCheck(check) { + return new ZodNumber({ + ...this._def, + checks: [...this._def.checks, check], + }); + } + int(message) { + return this._addCheck({ + kind: "int", + message: errorUtil.toString(message), + }); + } + positive(message) { + return this._addCheck({ + kind: "min", + value: 0, + inclusive: false, + message: errorUtil.toString(message), + }); + } + negative(message) { + return this._addCheck({ + kind: "max", + value: 0, + inclusive: false, + message: errorUtil.toString(message), + }); + } + nonpositive(message) { + return this._addCheck({ + kind: "max", + value: 0, + inclusive: true, + message: errorUtil.toString(message), + }); + } + nonnegative(message) { + return this._addCheck({ + kind: "min", + value: 0, + inclusive: true, + message: errorUtil.toString(message), + }); + } + multipleOf(value, message) { + return this._addCheck({ + kind: "multipleOf", + value: value, + message: errorUtil.toString(message), + }); + } + finite(message) { + return this._addCheck({ + kind: "finite", + message: errorUtil.toString(message), + }); + } + safe(message) { + return this._addCheck({ + kind: "min", + inclusive: true, + value: Number.MIN_SAFE_INTEGER, + message: errorUtil.toString(message), + })._addCheck({ + kind: "max", + inclusive: true, + value: Number.MAX_SAFE_INTEGER, + message: errorUtil.toString(message), + }); + } + get minValue() { + let min = null; + for (const ch of this._def.checks) { + if (ch.kind === "min") { + if (min === null || ch.value > min) + min = ch.value; + } + } + return min; + } + get maxValue() { + let max = null; + for (const ch of this._def.checks) { + if (ch.kind === "max") { + if (max === null || ch.value < max) + max = ch.value; + } + } + return max; + } + get isInt() { + return !!this._def.checks.find((ch) => ch.kind === "int" || + (ch.kind === "multipleOf" && util.isInteger(ch.value))); + } + get isFinite() { + let max = null, min = null; + for (const ch of this._def.checks) { + if (ch.kind === "finite" || + ch.kind === "int" || + ch.kind === "multipleOf") { + return true; + } + else if (ch.kind === "min") { + if (min === null || ch.value > min) + min = ch.value; + } + else if (ch.kind === "max") { + if (max === null || ch.value < max) + max = ch.value; + } + } + return Number.isFinite(min) && Number.isFinite(max); + } +} +ZodNumber.create = (params) => { + return new ZodNumber({ + checks: [], + typeName: ZodFirstPartyTypeKind.ZodNumber, + coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false, + ...processCreateParams(params), + }); +}; +class ZodBigInt extends ZodType { + constructor() { + super(...arguments); + this.min = this.gte; + this.max = this.lte; + } + _parse(input) { + if (this._def.coerce) { + try { + input.data = BigInt(input.data); + } + catch (_a) { + return this._getInvalidInput(input); + } + } + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.bigint) { + return this._getInvalidInput(input); + } + let ctx = undefined; + const status = new ParseStatus(); + for (const check of this._def.checks) { + if (check.kind === "min") { + const tooSmall = check.inclusive + ? input.data < check.value + : input.data <= check.value; + if (tooSmall) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + type: "bigint", + minimum: check.value, + inclusive: check.inclusive, + message: check.message, + }); + status.dirty(); + } + } + else if (check.kind === "max") { + const tooBig = check.inclusive + ? input.data > check.value + : input.data >= check.value; + if (tooBig) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + type: "bigint", + maximum: check.value, + inclusive: check.inclusive, + message: check.message, + }); + status.dirty(); + } + } + else if (check.kind === "multipleOf") { + if (input.data % check.value !== BigInt(0)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.not_multiple_of, + multipleOf: check.value, + message: check.message, + }); + status.dirty(); + } + } + else { + util.assertNever(check); + } + } + return { status: status.value, value: input.data }; + } + _getInvalidInput(input) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.bigint, + received: ctx.parsedType, + }); + return INVALID; + } + gte(value, message) { + return this.setLimit("min", value, true, errorUtil.toString(message)); + } + gt(value, message) { + return this.setLimit("min", value, false, errorUtil.toString(message)); + } + lte(value, message) { + return this.setLimit("max", value, true, errorUtil.toString(message)); + } + lt(value, message) { + return this.setLimit("max", value, false, errorUtil.toString(message)); + } + setLimit(kind, value, inclusive, message) { + return new ZodBigInt({ + ...this._def, + checks: [ + ...this._def.checks, + { + kind, + value, + inclusive, + message: errorUtil.toString(message), + }, + ], }); } - endsWith(value, message) { - return this._addCheck({ - kind: "endsWith", - value: value, - ...errorUtil.errToObj(message), + _addCheck(check) { + return new ZodBigInt({ + ...this._def, + checks: [...this._def.checks, check], }); } - min(minLength, message) { + positive(message) { return this._addCheck({ kind: "min", - value: minLength, - ...errorUtil.errToObj(message), + value: BigInt(0), + inclusive: false, + message: errorUtil.toString(message), }); } - max(maxLength, message) { + negative(message) { return this._addCheck({ kind: "max", - value: maxLength, - ...errorUtil.errToObj(message), + value: BigInt(0), + inclusive: false, + message: errorUtil.toString(message), }); } - length(len, message) { + nonpositive(message) { return this._addCheck({ - kind: "length", - value: len, - ...errorUtil.errToObj(message), - }); - } - /** - * Equivalent to `.min(1)` - */ - nonempty(message) { - return this.min(1, errorUtil.errToObj(message)); - } - trim() { - return new ZodString({ - ...this._def, - checks: [...this._def.checks, { kind: "trim" }], + kind: "max", + value: BigInt(0), + inclusive: true, + message: errorUtil.toString(message), }); } - toLowerCase() { - return new ZodString({ - ...this._def, - checks: [...this._def.checks, { kind: "toLowerCase" }], + nonnegative(message) { + return this._addCheck({ + kind: "min", + value: BigInt(0), + inclusive: true, + message: errorUtil.toString(message), }); } - toUpperCase() { - return new ZodString({ - ...this._def, - checks: [...this._def.checks, { kind: "toUpperCase" }], + multipleOf(value, message) { + return this._addCheck({ + kind: "multipleOf", + value, + message: errorUtil.toString(message), }); } - get isDatetime() { - return !!this._def.checks.find((ch) => ch.kind === "datetime"); - } - get isDate() { - return !!this._def.checks.find((ch) => ch.kind === "date"); - } - get isTime() { - return !!this._def.checks.find((ch) => ch.kind === "time"); - } - get isDuration() { - return !!this._def.checks.find((ch) => ch.kind === "duration"); - } - get isEmail() { - return !!this._def.checks.find((ch) => ch.kind === "email"); - } - get isURL() { - return !!this._def.checks.find((ch) => ch.kind === "url"); - } - get isEmoji() { - return !!this._def.checks.find((ch) => ch.kind === "emoji"); - } - get isUUID() { - return !!this._def.checks.find((ch) => ch.kind === "uuid"); - } - get isNANOID() { - return !!this._def.checks.find((ch) => ch.kind === "nanoid"); - } - get isCUID() { - return !!this._def.checks.find((ch) => ch.kind === "cuid"); - } - get isCUID2() { - return !!this._def.checks.find((ch) => ch.kind === "cuid2"); - } - get isULID() { - return !!this._def.checks.find((ch) => ch.kind === "ulid"); - } - get isIP() { - return !!this._def.checks.find((ch) => ch.kind === "ip"); - } - get isCIDR() { - return !!this._def.checks.find((ch) => ch.kind === "cidr"); - } - get isBase64() { - return !!this._def.checks.find((ch) => ch.kind === "base64"); - } - get isBase64url() { - // base64url encoding is a modification of base64 that can safely be used in URLs and filenames - return !!this._def.checks.find((ch) => ch.kind === "base64url"); - } - get minLength() { + get minValue() { let min = null; for (const ch of this._def.checks) { if (ch.kind === "min") { @@ -45443,7 +44548,7 @@ class ZodString extends ZodType { } return min; } - get maxLength() { + get maxValue() { let max = null; for (const ch of this._def.checks) { if (ch.kind === "max") { @@ -45454,111 +44559,89 @@ class ZodString extends ZodType { return max; } } -ZodString.create = (params) => { +ZodBigInt.create = (params) => { var _a; - return new ZodString({ + return new ZodBigInt({ checks: [], - typeName: ZodFirstPartyTypeKind.ZodString, + typeName: ZodFirstPartyTypeKind.ZodBigInt, coerce: (_a = params === null || params === void 0 ? void 0 : params.coerce) !== null && _a !== void 0 ? _a : false, ...processCreateParams(params), }); }; -// https://stackoverflow.com/questions/3966484/why-does-modulus-operator-return-fractional-number-in-javascript/31711034#31711034 -function floatSafeRemainder(val, step) { - const valDecCount = (val.toString().split(".")[1] || "").length; - const stepDecCount = (step.toString().split(".")[1] || "").length; - const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount; - const valInt = parseInt(val.toFixed(decCount).replace(".", "")); - const stepInt = parseInt(step.toFixed(decCount).replace(".", "")); - return (valInt % stepInt) / Math.pow(10, decCount); -} -class ZodNumber extends ZodType { - constructor() { - super(...arguments); - this.min = this.gte; - this.max = this.lte; - this.step = this.multipleOf; +class ZodBoolean extends ZodType { + _parse(input) { + if (this._def.coerce) { + input.data = Boolean(input.data); + } + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.boolean) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.boolean, + received: ctx.parsedType, + }); + return INVALID; + } + return OK(input.data); } +} +ZodBoolean.create = (params) => { + return new ZodBoolean({ + typeName: ZodFirstPartyTypeKind.ZodBoolean, + coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false, + ...processCreateParams(params), + }); +}; +class ZodDate extends ZodType { _parse(input) { if (this._def.coerce) { - input.data = Number(input.data); + input.data = new Date(input.data); } const parsedType = this._getType(input); - if (parsedType !== ZodParsedType.number) { + if (parsedType !== ZodParsedType.date) { const ctx = this._getOrReturnCtx(input); addIssueToContext(ctx, { code: ZodIssueCode.invalid_type, - expected: ZodParsedType.number, + expected: ZodParsedType.date, received: ctx.parsedType, }); return INVALID; } - let ctx = undefined; + if (isNaN(input.data.getTime())) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_date, + }); + return INVALID; + } const status = new ParseStatus(); + let ctx = undefined; for (const check of this._def.checks) { - if (check.kind === "int") { - if (!util.isInteger(input.data)) { - ctx = this._getOrReturnCtx(input, ctx); - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_type, - expected: "integer", - received: "float", - message: check.message, - }); - status.dirty(); - } - } - else if (check.kind === "min") { - const tooSmall = check.inclusive - ? input.data < check.value - : input.data <= check.value; - if (tooSmall) { + if (check.kind === "min") { + if (input.data.getTime() < check.value) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { code: ZodIssueCode.too_small, - minimum: check.value, - type: "number", - inclusive: check.inclusive, - exact: false, message: check.message, + inclusive: true, + exact: false, + minimum: check.value, + type: "date", }); status.dirty(); } } else if (check.kind === "max") { - const tooBig = check.inclusive - ? input.data > check.value - : input.data >= check.value; - if (tooBig) { + if (input.data.getTime() > check.value) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { code: ZodIssueCode.too_big, - maximum: check.value, - type: "number", - inclusive: check.inclusive, - exact: false, - message: check.message, - }); - status.dirty(); - } - } - else if (check.kind === "multipleOf") { - if (floatSafeRemainder(input.data, check.value) !== 0) { - ctx = this._getOrReturnCtx(input, ctx); - addIssueToContext(ctx, { - code: ZodIssueCode.not_multiple_of, - multipleOf: check.value, - message: check.message, - }); - status.dirty(); - } - } - else if (check.kind === "finite") { - if (!Number.isFinite(input.data)) { - ctx = this._getOrReturnCtx(input, ctx); - addIssueToContext(ctx, { - code: ZodIssueCode.not_finite, message: check.message, + inclusive: true, + exact: false, + maximum: check.value, + type: "date", }); status.dirty(); } @@ -45567,2678 +44650,3602 @@ class ZodNumber extends ZodType { util.assertNever(check); } } - return { status: status.value, value: input.data }; + return { + status: status.value, + value: new Date(input.data.getTime()), + }; } - gte(value, message) { - return this.setLimit("min", value, true, errorUtil.toString(message)); + _addCheck(check) { + return new ZodDate({ + ...this._def, + checks: [...this._def.checks, check], + }); } - gt(value, message) { - return this.setLimit("min", value, false, errorUtil.toString(message)); + min(minDate, message) { + return this._addCheck({ + kind: "min", + value: minDate.getTime(), + message: errorUtil.toString(message), + }); } - lte(value, message) { - return this.setLimit("max", value, true, errorUtil.toString(message)); + max(maxDate, message) { + return this._addCheck({ + kind: "max", + value: maxDate.getTime(), + message: errorUtil.toString(message), + }); + } + get minDate() { + let min = null; + for (const ch of this._def.checks) { + if (ch.kind === "min") { + if (min === null || ch.value > min) + min = ch.value; + } + } + return min != null ? new Date(min) : null; + } + get maxDate() { + let max = null; + for (const ch of this._def.checks) { + if (ch.kind === "max") { + if (max === null || ch.value < max) + max = ch.value; + } + } + return max != null ? new Date(max) : null; + } +} +ZodDate.create = (params) => { + return new ZodDate({ + checks: [], + coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false, + typeName: ZodFirstPartyTypeKind.ZodDate, + ...processCreateParams(params), + }); +}; +class ZodSymbol extends ZodType { + _parse(input) { + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.symbol) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.symbol, + received: ctx.parsedType, + }); + return INVALID; + } + return OK(input.data); + } +} +ZodSymbol.create = (params) => { + return new ZodSymbol({ + typeName: ZodFirstPartyTypeKind.ZodSymbol, + ...processCreateParams(params), + }); +}; +class ZodUndefined extends ZodType { + _parse(input) { + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.undefined) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.undefined, + received: ctx.parsedType, + }); + return INVALID; + } + return OK(input.data); + } +} +ZodUndefined.create = (params) => { + return new ZodUndefined({ + typeName: ZodFirstPartyTypeKind.ZodUndefined, + ...processCreateParams(params), + }); +}; +class ZodNull extends ZodType { + _parse(input) { + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.null) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.null, + received: ctx.parsedType, + }); + return INVALID; + } + return OK(input.data); + } +} +ZodNull.create = (params) => { + return new ZodNull({ + typeName: ZodFirstPartyTypeKind.ZodNull, + ...processCreateParams(params), + }); +}; +class ZodAny extends ZodType { + constructor() { + super(...arguments); + // to prevent instances of other classes from extending ZodAny. this causes issues with catchall in ZodObject. + this._any = true; + } + _parse(input) { + return OK(input.data); + } +} +ZodAny.create = (params) => { + return new ZodAny({ + typeName: ZodFirstPartyTypeKind.ZodAny, + ...processCreateParams(params), + }); +}; +class ZodUnknown extends ZodType { + constructor() { + super(...arguments); + // required + this._unknown = true; + } + _parse(input) { + return OK(input.data); + } +} +ZodUnknown.create = (params) => { + return new ZodUnknown({ + typeName: ZodFirstPartyTypeKind.ZodUnknown, + ...processCreateParams(params), + }); +}; +class ZodNever extends ZodType { + _parse(input) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.never, + received: ctx.parsedType, + }); + return INVALID; + } +} +ZodNever.create = (params) => { + return new ZodNever({ + typeName: ZodFirstPartyTypeKind.ZodNever, + ...processCreateParams(params), + }); +}; +class ZodVoid extends ZodType { + _parse(input) { + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.undefined) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.void, + received: ctx.parsedType, + }); + return INVALID; + } + return OK(input.data); + } +} +ZodVoid.create = (params) => { + return new ZodVoid({ + typeName: ZodFirstPartyTypeKind.ZodVoid, + ...processCreateParams(params), + }); +}; +class ZodArray extends ZodType { + _parse(input) { + const { ctx, status } = this._processInputParams(input); + const def = this._def; + if (ctx.parsedType !== ZodParsedType.array) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.array, + received: ctx.parsedType, + }); + return INVALID; + } + if (def.exactLength !== null) { + const tooBig = ctx.data.length > def.exactLength.value; + const tooSmall = ctx.data.length < def.exactLength.value; + if (tooBig || tooSmall) { + addIssueToContext(ctx, { + code: tooBig ? ZodIssueCode.too_big : ZodIssueCode.too_small, + minimum: (tooSmall ? def.exactLength.value : undefined), + maximum: (tooBig ? def.exactLength.value : undefined), + type: "array", + inclusive: true, + exact: true, + message: def.exactLength.message, + }); + status.dirty(); + } + } + if (def.minLength !== null) { + if (ctx.data.length < def.minLength.value) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + minimum: def.minLength.value, + type: "array", + inclusive: true, + exact: false, + message: def.minLength.message, + }); + status.dirty(); + } + } + if (def.maxLength !== null) { + if (ctx.data.length > def.maxLength.value) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + maximum: def.maxLength.value, + type: "array", + inclusive: true, + exact: false, + message: def.maxLength.message, + }); + status.dirty(); + } + } + if (ctx.common.async) { + return Promise.all([...ctx.data].map((item, i) => { + return def.type._parseAsync(new ParseInputLazyPath(ctx, item, ctx.path, i)); + })).then((result) => { + return ParseStatus.mergeArray(status, result); + }); + } + const result = [...ctx.data].map((item, i) => { + return def.type._parseSync(new ParseInputLazyPath(ctx, item, ctx.path, i)); + }); + return ParseStatus.mergeArray(status, result); } - lt(value, message) { - return this.setLimit("max", value, false, errorUtil.toString(message)); + get element() { + return this._def.type; } - setLimit(kind, value, inclusive, message) { - return new ZodNumber({ + min(minLength, message) { + return new ZodArray({ ...this._def, - checks: [ - ...this._def.checks, - { - kind, - value, - inclusive, - message: errorUtil.toString(message), - }, - ], + minLength: { value: minLength, message: errorUtil.toString(message) }, }); } - _addCheck(check) { - return new ZodNumber({ + max(maxLength, message) { + return new ZodArray({ ...this._def, - checks: [...this._def.checks, check], - }); - } - int(message) { - return this._addCheck({ - kind: "int", - message: errorUtil.toString(message), - }); - } - positive(message) { - return this._addCheck({ - kind: "min", - value: 0, - inclusive: false, - message: errorUtil.toString(message), - }); - } - negative(message) { - return this._addCheck({ - kind: "max", - value: 0, - inclusive: false, - message: errorUtil.toString(message), - }); - } - nonpositive(message) { - return this._addCheck({ - kind: "max", - value: 0, - inclusive: true, - message: errorUtil.toString(message), + maxLength: { value: maxLength, message: errorUtil.toString(message) }, }); } - nonnegative(message) { - return this._addCheck({ - kind: "min", - value: 0, - inclusive: true, - message: errorUtil.toString(message), + length(len, message) { + return new ZodArray({ + ...this._def, + exactLength: { value: len, message: errorUtil.toString(message) }, }); } - multipleOf(value, message) { - return this._addCheck({ - kind: "multipleOf", - value: value, - message: errorUtil.toString(message), - }); + nonempty(message) { + return this.min(1, message); } - finite(message) { - return this._addCheck({ - kind: "finite", - message: errorUtil.toString(message), +} +ZodArray.create = (schema, params) => { + return new ZodArray({ + type: schema, + minLength: null, + maxLength: null, + exactLength: null, + typeName: ZodFirstPartyTypeKind.ZodArray, + ...processCreateParams(params), + }); +}; +function deepPartialify(schema) { + if (schema instanceof ZodObject) { + const newShape = {}; + for (const key in schema.shape) { + const fieldSchema = schema.shape[key]; + newShape[key] = ZodOptional.create(deepPartialify(fieldSchema)); + } + return new ZodObject({ + ...schema._def, + shape: () => newShape, }); } - safe(message) { - return this._addCheck({ - kind: "min", - inclusive: true, - value: Number.MIN_SAFE_INTEGER, - message: errorUtil.toString(message), - })._addCheck({ - kind: "max", - inclusive: true, - value: Number.MAX_SAFE_INTEGER, - message: errorUtil.toString(message), + else if (schema instanceof ZodArray) { + return new ZodArray({ + ...schema._def, + type: deepPartialify(schema.element), }); } - get minValue() { - let min = null; - for (const ch of this._def.checks) { - if (ch.kind === "min") { - if (min === null || ch.value > min) - min = ch.value; - } - } - return min; + else if (schema instanceof ZodOptional) { + return ZodOptional.create(deepPartialify(schema.unwrap())); } - get maxValue() { - let max = null; - for (const ch of this._def.checks) { - if (ch.kind === "max") { - if (max === null || ch.value < max) - max = ch.value; - } - } - return max; + else if (schema instanceof ZodNullable) { + return ZodNullable.create(deepPartialify(schema.unwrap())); } - get isInt() { - return !!this._def.checks.find((ch) => ch.kind === "int" || - (ch.kind === "multipleOf" && util.isInteger(ch.value))); + else if (schema instanceof ZodTuple) { + return ZodTuple.create(schema.items.map((item) => deepPartialify(item))); } - get isFinite() { - let max = null, min = null; - for (const ch of this._def.checks) { - if (ch.kind === "finite" || - ch.kind === "int" || - ch.kind === "multipleOf") { - return true; - } - else if (ch.kind === "min") { - if (min === null || ch.value > min) - min = ch.value; - } - else if (ch.kind === "max") { - if (max === null || ch.value < max) - max = ch.value; - } - } - return Number.isFinite(min) && Number.isFinite(max); + else { + return schema; } } -ZodNumber.create = (params) => { - return new ZodNumber({ - checks: [], - typeName: ZodFirstPartyTypeKind.ZodNumber, - coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false, - ...processCreateParams(params), - }); -}; -class ZodBigInt extends ZodType { +class ZodObject extends ZodType { constructor() { super(...arguments); - this.min = this.gte; - this.max = this.lte; + this._cached = null; + /** + * @deprecated In most cases, this is no longer needed - unknown properties are now silently stripped. + * If you want to pass through unknown properties, use `.passthrough()` instead. + */ + this.nonstrict = this.passthrough; + // extend< + // Augmentation extends ZodRawShape, + // NewOutput extends util.flatten<{ + // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation + // ? Augmentation[k]["_output"] + // : k extends keyof Output + // ? Output[k] + // : never; + // }>, + // NewInput extends util.flatten<{ + // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation + // ? Augmentation[k]["_input"] + // : k extends keyof Input + // ? Input[k] + // : never; + // }> + // >( + // augmentation: Augmentation + // ): ZodObject< + // extendShape, + // UnknownKeys, + // Catchall, + // NewOutput, + // NewInput + // > { + // return new ZodObject({ + // ...this._def, + // shape: () => ({ + // ...this._def.shape(), + // ...augmentation, + // }), + // }) as any; + // } + /** + * @deprecated Use `.extend` instead + * */ + this.augment = this.extend; + } + _getCached() { + if (this._cached !== null) + return this._cached; + const shape = this._def.shape(); + const keys = util.objectKeys(shape); + return (this._cached = { shape, keys }); } _parse(input) { - if (this._def.coerce) { - try { - input.data = BigInt(input.data); - } - catch (_a) { - return this._getInvalidInput(input); - } - } const parsedType = this._getType(input); - if (parsedType !== ZodParsedType.bigint) { - return this._getInvalidInput(input); + if (parsedType !== ZodParsedType.object) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.object, + received: ctx.parsedType, + }); + return INVALID; } - let ctx = undefined; - const status = new ParseStatus(); - for (const check of this._def.checks) { - if (check.kind === "min") { - const tooSmall = check.inclusive - ? input.data < check.value - : input.data <= check.value; - if (tooSmall) { - ctx = this._getOrReturnCtx(input, ctx); - addIssueToContext(ctx, { - code: ZodIssueCode.too_small, - type: "bigint", - minimum: check.value, - inclusive: check.inclusive, - message: check.message, - }); - status.dirty(); + const { status, ctx } = this._processInputParams(input); + const { shape, keys: shapeKeys } = this._getCached(); + const extraKeys = []; + if (!(this._def.catchall instanceof ZodNever && + this._def.unknownKeys === "strip")) { + for (const key in ctx.data) { + if (!shapeKeys.includes(key)) { + extraKeys.push(key); } } - else if (check.kind === "max") { - const tooBig = check.inclusive - ? input.data > check.value - : input.data >= check.value; - if (tooBig) { - ctx = this._getOrReturnCtx(input, ctx); - addIssueToContext(ctx, { - code: ZodIssueCode.too_big, - type: "bigint", - maximum: check.value, - inclusive: check.inclusive, - message: check.message, + } + const pairs = []; + for (const key of shapeKeys) { + const keyValidator = shape[key]; + const value = ctx.data[key]; + pairs.push({ + key: { status: "valid", value: key }, + value: keyValidator._parse(new ParseInputLazyPath(ctx, value, ctx.path, key)), + alwaysSet: key in ctx.data, + }); + } + if (this._def.catchall instanceof ZodNever) { + const unknownKeys = this._def.unknownKeys; + if (unknownKeys === "passthrough") { + for (const key of extraKeys) { + pairs.push({ + key: { status: "valid", value: key }, + value: { status: "valid", value: ctx.data[key] }, }); - status.dirty(); } } - else if (check.kind === "multipleOf") { - if (input.data % check.value !== BigInt(0)) { - ctx = this._getOrReturnCtx(input, ctx); + else if (unknownKeys === "strict") { + if (extraKeys.length > 0) { addIssueToContext(ctx, { - code: ZodIssueCode.not_multiple_of, - multipleOf: check.value, - message: check.message, + code: ZodIssueCode.unrecognized_keys, + keys: extraKeys, }); status.dirty(); } } + else if (unknownKeys === "strip") ; else { - util.assertNever(check); + throw new Error(`Internal ZodObject error: invalid unknownKeys value.`); } } - return { status: status.value, value: input.data }; + else { + // run catchall validation + const catchall = this._def.catchall; + for (const key of extraKeys) { + const value = ctx.data[key]; + pairs.push({ + key: { status: "valid", value: key }, + value: catchall._parse(new ParseInputLazyPath(ctx, value, ctx.path, key) //, ctx.child(key), value, getParsedType(value) + ), + alwaysSet: key in ctx.data, + }); + } + } + if (ctx.common.async) { + return Promise.resolve() + .then(async () => { + const syncPairs = []; + for (const pair of pairs) { + const key = await pair.key; + const value = await pair.value; + syncPairs.push({ + key, + value, + alwaysSet: pair.alwaysSet, + }); + } + return syncPairs; + }) + .then((syncPairs) => { + return ParseStatus.mergeObjectSync(status, syncPairs); + }); + } + else { + return ParseStatus.mergeObjectSync(status, pairs); + } } - _getInvalidInput(input) { - const ctx = this._getOrReturnCtx(input); - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_type, - expected: ZodParsedType.bigint, - received: ctx.parsedType, + get shape() { + return this._def.shape(); + } + strict(message) { + errorUtil.errToObj; + return new ZodObject({ + ...this._def, + unknownKeys: "strict", + ...(message !== undefined + ? { + errorMap: (issue, ctx) => { + var _a, _b, _c, _d; + const defaultError = (_c = (_b = (_a = this._def).errorMap) === null || _b === void 0 ? void 0 : _b.call(_a, issue, ctx).message) !== null && _c !== void 0 ? _c : ctx.defaultError; + if (issue.code === "unrecognized_keys") + return { + message: (_d = errorUtil.errToObj(message).message) !== null && _d !== void 0 ? _d : defaultError, + }; + return { + message: defaultError, + }; + }, + } + : {}), }); - return INVALID; } - gte(value, message) { - return this.setLimit("min", value, true, errorUtil.toString(message)); + strip() { + return new ZodObject({ + ...this._def, + unknownKeys: "strip", + }); } - gt(value, message) { - return this.setLimit("min", value, false, errorUtil.toString(message)); + passthrough() { + return new ZodObject({ + ...this._def, + unknownKeys: "passthrough", + }); } - lte(value, message) { - return this.setLimit("max", value, true, errorUtil.toString(message)); + // const AugmentFactory = + // (def: Def) => + // ( + // augmentation: Augmentation + // ): ZodObject< + // extendShape, Augmentation>, + // Def["unknownKeys"], + // Def["catchall"] + // > => { + // return new ZodObject({ + // ...def, + // shape: () => ({ + // ...def.shape(), + // ...augmentation, + // }), + // }) as any; + // }; + extend(augmentation) { + return new ZodObject({ + ...this._def, + shape: () => ({ + ...this._def.shape(), + ...augmentation, + }), + }); } - lt(value, message) { - return this.setLimit("max", value, false, errorUtil.toString(message)); + /** + * Prior to zod@1.0.12 there was a bug in the + * inferred type of merged objects. Please + * upgrade if you are experiencing issues. + */ + merge(merging) { + const merged = new ZodObject({ + unknownKeys: merging._def.unknownKeys, + catchall: merging._def.catchall, + shape: () => ({ + ...this._def.shape(), + ...merging._def.shape(), + }), + typeName: ZodFirstPartyTypeKind.ZodObject, + }); + return merged; } - setLimit(kind, value, inclusive, message) { - return new ZodBigInt({ + // merge< + // Incoming extends AnyZodObject, + // Augmentation extends Incoming["shape"], + // NewOutput extends { + // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation + // ? Augmentation[k]["_output"] + // : k extends keyof Output + // ? Output[k] + // : never; + // }, + // NewInput extends { + // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation + // ? Augmentation[k]["_input"] + // : k extends keyof Input + // ? Input[k] + // : never; + // } + // >( + // merging: Incoming + // ): ZodObject< + // extendShape>, + // Incoming["_def"]["unknownKeys"], + // Incoming["_def"]["catchall"], + // NewOutput, + // NewInput + // > { + // const merged: any = new ZodObject({ + // unknownKeys: merging._def.unknownKeys, + // catchall: merging._def.catchall, + // shape: () => + // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()), + // typeName: ZodFirstPartyTypeKind.ZodObject, + // }) as any; + // return merged; + // } + setKey(key, schema) { + return this.augment({ [key]: schema }); + } + // merge( + // merging: Incoming + // ): //ZodObject = (merging) => { + // ZodObject< + // extendShape>, + // Incoming["_def"]["unknownKeys"], + // Incoming["_def"]["catchall"] + // > { + // // const mergedShape = objectUtil.mergeShapes( + // // this._def.shape(), + // // merging._def.shape() + // // ); + // const merged: any = new ZodObject({ + // unknownKeys: merging._def.unknownKeys, + // catchall: merging._def.catchall, + // shape: () => + // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()), + // typeName: ZodFirstPartyTypeKind.ZodObject, + // }) as any; + // return merged; + // } + catchall(index) { + return new ZodObject({ ...this._def, - checks: [ - ...this._def.checks, - { - kind, - value, - inclusive, - message: errorUtil.toString(message), - }, - ], + catchall: index, + }); + } + pick(mask) { + const shape = {}; + util.objectKeys(mask).forEach((key) => { + if (mask[key] && this.shape[key]) { + shape[key] = this.shape[key]; + } }); - } - _addCheck(check) { - return new ZodBigInt({ + return new ZodObject({ ...this._def, - checks: [...this._def.checks, check], + shape: () => shape, }); } - positive(message) { - return this._addCheck({ - kind: "min", - value: BigInt(0), - inclusive: false, - message: errorUtil.toString(message), + omit(mask) { + const shape = {}; + util.objectKeys(this.shape).forEach((key) => { + if (!mask[key]) { + shape[key] = this.shape[key]; + } }); - } - negative(message) { - return this._addCheck({ - kind: "max", - value: BigInt(0), - inclusive: false, - message: errorUtil.toString(message), + return new ZodObject({ + ...this._def, + shape: () => shape, }); } - nonpositive(message) { - return this._addCheck({ - kind: "max", - value: BigInt(0), - inclusive: true, - message: errorUtil.toString(message), - }); + /** + * @deprecated + */ + deepPartial() { + return deepPartialify(this); } - nonnegative(message) { - return this._addCheck({ - kind: "min", - value: BigInt(0), - inclusive: true, - message: errorUtil.toString(message), + partial(mask) { + const newShape = {}; + util.objectKeys(this.shape).forEach((key) => { + const fieldSchema = this.shape[key]; + if (mask && !mask[key]) { + newShape[key] = fieldSchema; + } + else { + newShape[key] = fieldSchema.optional(); + } }); - } - multipleOf(value, message) { - return this._addCheck({ - kind: "multipleOf", - value, - message: errorUtil.toString(message), + return new ZodObject({ + ...this._def, + shape: () => newShape, }); } - get minValue() { - let min = null; - for (const ch of this._def.checks) { - if (ch.kind === "min") { - if (min === null || ch.value > min) - min = ch.value; + required(mask) { + const newShape = {}; + util.objectKeys(this.shape).forEach((key) => { + if (mask && !mask[key]) { + newShape[key] = this.shape[key]; } - } - return min; - } - get maxValue() { - let max = null; - for (const ch of this._def.checks) { - if (ch.kind === "max") { - if (max === null || ch.value < max) - max = ch.value; + else { + const fieldSchema = this.shape[key]; + let newField = fieldSchema; + while (newField instanceof ZodOptional) { + newField = newField._def.innerType; + } + newShape[key] = newField; } - } - return max; + }); + return new ZodObject({ + ...this._def, + shape: () => newShape, + }); + } + keyof() { + return createZodEnum(util.objectKeys(this.shape)); } } -ZodBigInt.create = (params) => { - var _a; - return new ZodBigInt({ - checks: [], - typeName: ZodFirstPartyTypeKind.ZodBigInt, - coerce: (_a = params === null || params === void 0 ? void 0 : params.coerce) !== null && _a !== void 0 ? _a : false, +ZodObject.create = (shape, params) => { + return new ZodObject({ + shape: () => shape, + unknownKeys: "strip", + catchall: ZodNever.create(), + typeName: ZodFirstPartyTypeKind.ZodObject, ...processCreateParams(params), }); }; -class ZodBoolean extends ZodType { +ZodObject.strictCreate = (shape, params) => { + return new ZodObject({ + shape: () => shape, + unknownKeys: "strict", + catchall: ZodNever.create(), + typeName: ZodFirstPartyTypeKind.ZodObject, + ...processCreateParams(params), + }); +}; +ZodObject.lazycreate = (shape, params) => { + return new ZodObject({ + shape, + unknownKeys: "strip", + catchall: ZodNever.create(), + typeName: ZodFirstPartyTypeKind.ZodObject, + ...processCreateParams(params), + }); +}; +class ZodUnion extends ZodType { _parse(input) { - if (this._def.coerce) { - input.data = Boolean(input.data); + const { ctx } = this._processInputParams(input); + const options = this._def.options; + function handleResults(results) { + // return first issue-free validation if it exists + for (const result of results) { + if (result.result.status === "valid") { + return result.result; + } + } + for (const result of results) { + if (result.result.status === "dirty") { + // add issues from dirty option + ctx.common.issues.push(...result.ctx.common.issues); + return result.result; + } + } + // return invalid + const unionErrors = results.map((result) => new ZodError(result.ctx.common.issues)); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_union, + unionErrors, + }); + return INVALID; } - const parsedType = this._getType(input); - if (parsedType !== ZodParsedType.boolean) { - const ctx = this._getOrReturnCtx(input); + if (ctx.common.async) { + return Promise.all(options.map(async (option) => { + const childCtx = { + ...ctx, + common: { + ...ctx.common, + issues: [], + }, + parent: null, + }; + return { + result: await option._parseAsync({ + data: ctx.data, + path: ctx.path, + parent: childCtx, + }), + ctx: childCtx, + }; + })).then(handleResults); + } + else { + let dirty = undefined; + const issues = []; + for (const option of options) { + const childCtx = { + ...ctx, + common: { + ...ctx.common, + issues: [], + }, + parent: null, + }; + const result = option._parseSync({ + data: ctx.data, + path: ctx.path, + parent: childCtx, + }); + if (result.status === "valid") { + return result; + } + else if (result.status === "dirty" && !dirty) { + dirty = { result, ctx: childCtx }; + } + if (childCtx.common.issues.length) { + issues.push(childCtx.common.issues); + } + } + if (dirty) { + ctx.common.issues.push(...dirty.ctx.common.issues); + return dirty.result; + } + const unionErrors = issues.map((issues) => new ZodError(issues)); addIssueToContext(ctx, { - code: ZodIssueCode.invalid_type, - expected: ZodParsedType.boolean, - received: ctx.parsedType, + code: ZodIssueCode.invalid_union, + unionErrors, }); return INVALID; } - return OK(input.data); + } + get options() { + return this._def.options; } } -ZodBoolean.create = (params) => { - return new ZodBoolean({ - typeName: ZodFirstPartyTypeKind.ZodBoolean, - coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false, +ZodUnion.create = (types, params) => { + return new ZodUnion({ + options: types, + typeName: ZodFirstPartyTypeKind.ZodUnion, ...processCreateParams(params), }); }; -class ZodDate extends ZodType { +///////////////////////////////////////////////////// +///////////////////////////////////////////////////// +////////// ////////// +////////// ZodDiscriminatedUnion ////////// +////////// ////////// +///////////////////////////////////////////////////// +///////////////////////////////////////////////////// +const getDiscriminator = (type) => { + if (type instanceof ZodLazy) { + return getDiscriminator(type.schema); + } + else if (type instanceof ZodEffects) { + return getDiscriminator(type.innerType()); + } + else if (type instanceof ZodLiteral) { + return [type.value]; + } + else if (type instanceof ZodEnum) { + return type.options; + } + else if (type instanceof ZodNativeEnum) { + // eslint-disable-next-line ban/ban + return util.objectValues(type.enum); + } + else if (type instanceof ZodDefault) { + return getDiscriminator(type._def.innerType); + } + else if (type instanceof ZodUndefined) { + return [undefined]; + } + else if (type instanceof ZodNull) { + return [null]; + } + else if (type instanceof ZodOptional) { + return [undefined, ...getDiscriminator(type.unwrap())]; + } + else if (type instanceof ZodNullable) { + return [null, ...getDiscriminator(type.unwrap())]; + } + else if (type instanceof ZodBranded) { + return getDiscriminator(type.unwrap()); + } + else if (type instanceof ZodReadonly) { + return getDiscriminator(type.unwrap()); + } + else if (type instanceof ZodCatch) { + return getDiscriminator(type._def.innerType); + } + else { + return []; + } +}; +class ZodDiscriminatedUnion extends ZodType { _parse(input) { - if (this._def.coerce) { - input.data = new Date(input.data); - } - const parsedType = this._getType(input); - if (parsedType !== ZodParsedType.date) { - const ctx = this._getOrReturnCtx(input); + const { ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.object) { addIssueToContext(ctx, { code: ZodIssueCode.invalid_type, - expected: ZodParsedType.date, + expected: ZodParsedType.object, received: ctx.parsedType, }); return INVALID; } - if (isNaN(input.data.getTime())) { - const ctx = this._getOrReturnCtx(input); + const discriminator = this.discriminator; + const discriminatorValue = ctx.data[discriminator]; + const option = this.optionsMap.get(discriminatorValue); + if (!option) { addIssueToContext(ctx, { - code: ZodIssueCode.invalid_date, + code: ZodIssueCode.invalid_union_discriminator, + options: Array.from(this.optionsMap.keys()), + path: [discriminator], }); return INVALID; } - const status = new ParseStatus(); - let ctx = undefined; - for (const check of this._def.checks) { - if (check.kind === "min") { - if (input.data.getTime() < check.value) { - ctx = this._getOrReturnCtx(input, ctx); - addIssueToContext(ctx, { - code: ZodIssueCode.too_small, - message: check.message, - inclusive: true, - exact: false, - minimum: check.value, - type: "date", - }); - status.dirty(); - } + if (ctx.common.async) { + return option._parseAsync({ + data: ctx.data, + path: ctx.path, + parent: ctx, + }); + } + else { + return option._parseSync({ + data: ctx.data, + path: ctx.path, + parent: ctx, + }); + } + } + get discriminator() { + return this._def.discriminator; + } + get options() { + return this._def.options; + } + get optionsMap() { + return this._def.optionsMap; + } + /** + * The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor. + * However, it only allows a union of objects, all of which need to share a discriminator property. This property must + * have a different value for each object in the union. + * @param discriminator the name of the discriminator property + * @param types an array of object schemas + * @param params + */ + static create(discriminator, options, params) { + // Get all the valid discriminator values + const optionsMap = new Map(); + // try { + for (const type of options) { + const discriminatorValues = getDiscriminator(type.shape[discriminator]); + if (!discriminatorValues.length) { + throw new Error(`A discriminator value for key \`${discriminator}\` could not be extracted from all schema options`); } - else if (check.kind === "max") { - if (input.data.getTime() > check.value) { - ctx = this._getOrReturnCtx(input, ctx); - addIssueToContext(ctx, { - code: ZodIssueCode.too_big, - message: check.message, - inclusive: true, - exact: false, - maximum: check.value, - type: "date", - }); - status.dirty(); + for (const value of discriminatorValues) { + if (optionsMap.has(value)) { + throw new Error(`Discriminator property ${String(discriminator)} has duplicate value ${String(value)}`); } - } - else { - util.assertNever(check); + optionsMap.set(value, type); } } - return { - status: status.value, - value: new Date(input.data.getTime()), - }; - } - _addCheck(check) { - return new ZodDate({ - ...this._def, - checks: [...this._def.checks, check], + return new ZodDiscriminatedUnion({ + typeName: ZodFirstPartyTypeKind.ZodDiscriminatedUnion, + discriminator, + options, + optionsMap, + ...processCreateParams(params), }); } - min(minDate, message) { - return this._addCheck({ - kind: "min", - value: minDate.getTime(), - message: errorUtil.toString(message), - }); +} +function mergeValues(a, b) { + const aType = getParsedType(a); + const bType = getParsedType(b); + if (a === b) { + return { valid: true, data: a }; } - max(maxDate, message) { - return this._addCheck({ - kind: "max", - value: maxDate.getTime(), - message: errorUtil.toString(message), - }); + else if (aType === ZodParsedType.object && bType === ZodParsedType.object) { + const bKeys = util.objectKeys(b); + const sharedKeys = util + .objectKeys(a) + .filter((key) => bKeys.indexOf(key) !== -1); + const newObj = { ...a, ...b }; + for (const key of sharedKeys) { + const sharedValue = mergeValues(a[key], b[key]); + if (!sharedValue.valid) { + return { valid: false }; + } + newObj[key] = sharedValue.data; + } + return { valid: true, data: newObj }; } - get minDate() { - let min = null; - for (const ch of this._def.checks) { - if (ch.kind === "min") { - if (min === null || ch.value > min) - min = ch.value; + else if (aType === ZodParsedType.array && bType === ZodParsedType.array) { + if (a.length !== b.length) { + return { valid: false }; + } + const newArray = []; + for (let index = 0; index < a.length; index++) { + const itemA = a[index]; + const itemB = b[index]; + const sharedValue = mergeValues(itemA, itemB); + if (!sharedValue.valid) { + return { valid: false }; } + newArray.push(sharedValue.data); } - return min != null ? new Date(min) : null; + return { valid: true, data: newArray }; } - get maxDate() { - let max = null; - for (const ch of this._def.checks) { - if (ch.kind === "max") { - if (max === null || ch.value < max) - max = ch.value; + else if (aType === ZodParsedType.date && + bType === ZodParsedType.date && + +a === +b) { + return { valid: true, data: a }; + } + else { + return { valid: false }; + } +} +class ZodIntersection extends ZodType { + _parse(input) { + const { status, ctx } = this._processInputParams(input); + const handleParsed = (parsedLeft, parsedRight) => { + if (isAborted(parsedLeft) || isAborted(parsedRight)) { + return INVALID; + } + const merged = mergeValues(parsedLeft.value, parsedRight.value); + if (!merged.valid) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_intersection_types, + }); + return INVALID; + } + if (isDirty(parsedLeft) || isDirty(parsedRight)) { + status.dirty(); } + return { status: status.value, value: merged.data }; + }; + if (ctx.common.async) { + return Promise.all([ + this._def.left._parseAsync({ + data: ctx.data, + path: ctx.path, + parent: ctx, + }), + this._def.right._parseAsync({ + data: ctx.data, + path: ctx.path, + parent: ctx, + }), + ]).then(([left, right]) => handleParsed(left, right)); + } + else { + return handleParsed(this._def.left._parseSync({ + data: ctx.data, + path: ctx.path, + parent: ctx, + }), this._def.right._parseSync({ + data: ctx.data, + path: ctx.path, + parent: ctx, + })); } - return max != null ? new Date(max) : null; } } -ZodDate.create = (params) => { - return new ZodDate({ - checks: [], - coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false, - typeName: ZodFirstPartyTypeKind.ZodDate, +ZodIntersection.create = (left, right, params) => { + return new ZodIntersection({ + left: left, + right: right, + typeName: ZodFirstPartyTypeKind.ZodIntersection, ...processCreateParams(params), }); }; -class ZodSymbol extends ZodType { +class ZodTuple extends ZodType { _parse(input) { - const parsedType = this._getType(input); - if (parsedType !== ZodParsedType.symbol) { - const ctx = this._getOrReturnCtx(input); + const { status, ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.array) { addIssueToContext(ctx, { code: ZodIssueCode.invalid_type, - expected: ZodParsedType.symbol, + expected: ZodParsedType.array, received: ctx.parsedType, }); return INVALID; } - return OK(input.data); - } -} -ZodSymbol.create = (params) => { - return new ZodSymbol({ - typeName: ZodFirstPartyTypeKind.ZodSymbol, - ...processCreateParams(params), - }); -}; -class ZodUndefined extends ZodType { - _parse(input) { - const parsedType = this._getType(input); - if (parsedType !== ZodParsedType.undefined) { - const ctx = this._getOrReturnCtx(input); + if (ctx.data.length < this._def.items.length) { addIssueToContext(ctx, { - code: ZodIssueCode.invalid_type, - expected: ZodParsedType.undefined, - received: ctx.parsedType, + code: ZodIssueCode.too_small, + minimum: this._def.items.length, + inclusive: true, + exact: false, + type: "array", }); return INVALID; } - return OK(input.data); + const rest = this._def.rest; + if (!rest && ctx.data.length > this._def.items.length) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + maximum: this._def.items.length, + inclusive: true, + exact: false, + type: "array", + }); + status.dirty(); + } + const items = [...ctx.data] + .map((item, itemIndex) => { + const schema = this._def.items[itemIndex] || this._def.rest; + if (!schema) + return null; + return schema._parse(new ParseInputLazyPath(ctx, item, ctx.path, itemIndex)); + }) + .filter((x) => !!x); // filter nulls + if (ctx.common.async) { + return Promise.all(items).then((results) => { + return ParseStatus.mergeArray(status, results); + }); + } + else { + return ParseStatus.mergeArray(status, items); + } + } + get items() { + return this._def.items; + } + rest(rest) { + return new ZodTuple({ + ...this._def, + rest, + }); } } -ZodUndefined.create = (params) => { - return new ZodUndefined({ - typeName: ZodFirstPartyTypeKind.ZodUndefined, +ZodTuple.create = (schemas, params) => { + if (!Array.isArray(schemas)) { + throw new Error("You must pass an array of schemas to z.tuple([ ... ])"); + } + return new ZodTuple({ + items: schemas, + typeName: ZodFirstPartyTypeKind.ZodTuple, + rest: null, ...processCreateParams(params), }); }; -class ZodNull extends ZodType { +class ZodRecord extends ZodType { + get keySchema() { + return this._def.keyType; + } + get valueSchema() { + return this._def.valueType; + } _parse(input) { - const parsedType = this._getType(input); - if (parsedType !== ZodParsedType.null) { - const ctx = this._getOrReturnCtx(input); + const { status, ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.object) { addIssueToContext(ctx, { code: ZodIssueCode.invalid_type, - expected: ZodParsedType.null, + expected: ZodParsedType.object, received: ctx.parsedType, }); return INVALID; } - return OK(input.data); + const pairs = []; + const keyType = this._def.keyType; + const valueType = this._def.valueType; + for (const key in ctx.data) { + pairs.push({ + key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, key)), + value: valueType._parse(new ParseInputLazyPath(ctx, ctx.data[key], ctx.path, key)), + alwaysSet: key in ctx.data, + }); + } + if (ctx.common.async) { + return ParseStatus.mergeObjectAsync(status, pairs); + } + else { + return ParseStatus.mergeObjectSync(status, pairs); + } } -} -ZodNull.create = (params) => { - return new ZodNull({ - typeName: ZodFirstPartyTypeKind.ZodNull, - ...processCreateParams(params), - }); -}; -class ZodAny extends ZodType { - constructor() { - super(...arguments); - // to prevent instances of other classes from extending ZodAny. this causes issues with catchall in ZodObject. - this._any = true; + get element() { + return this._def.valueType; } - _parse(input) { - return OK(input.data); + static create(first, second, third) { + if (second instanceof ZodType) { + return new ZodRecord({ + keyType: first, + valueType: second, + typeName: ZodFirstPartyTypeKind.ZodRecord, + ...processCreateParams(third), + }); + } + return new ZodRecord({ + keyType: ZodString.create(), + valueType: first, + typeName: ZodFirstPartyTypeKind.ZodRecord, + ...processCreateParams(second), + }); } } -ZodAny.create = (params) => { - return new ZodAny({ - typeName: ZodFirstPartyTypeKind.ZodAny, - ...processCreateParams(params), - }); -}; -class ZodUnknown extends ZodType { - constructor() { - super(...arguments); - // required - this._unknown = true; - } - _parse(input) { - return OK(input.data); +class ZodMap extends ZodType { + get keySchema() { + return this._def.keyType; } -} -ZodUnknown.create = (params) => { - return new ZodUnknown({ - typeName: ZodFirstPartyTypeKind.ZodUnknown, - ...processCreateParams(params), - }); -}; -class ZodNever extends ZodType { - _parse(input) { - const ctx = this._getOrReturnCtx(input); - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_type, - expected: ZodParsedType.never, - received: ctx.parsedType, - }); - return INVALID; + get valueSchema() { + return this._def.valueType; } -} -ZodNever.create = (params) => { - return new ZodNever({ - typeName: ZodFirstPartyTypeKind.ZodNever, - ...processCreateParams(params), - }); -}; -class ZodVoid extends ZodType { _parse(input) { - const parsedType = this._getType(input); - if (parsedType !== ZodParsedType.undefined) { - const ctx = this._getOrReturnCtx(input); + const { status, ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.map) { addIssueToContext(ctx, { code: ZodIssueCode.invalid_type, - expected: ZodParsedType.void, + expected: ZodParsedType.map, received: ctx.parsedType, }); return INVALID; } - return OK(input.data); + const keyType = this._def.keyType; + const valueType = this._def.valueType; + const pairs = [...ctx.data.entries()].map(([key, value], index) => { + return { + key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, [index, "key"])), + value: valueType._parse(new ParseInputLazyPath(ctx, value, ctx.path, [index, "value"])), + }; + }); + if (ctx.common.async) { + const finalMap = new Map(); + return Promise.resolve().then(async () => { + for (const pair of pairs) { + const key = await pair.key; + const value = await pair.value; + if (key.status === "aborted" || value.status === "aborted") { + return INVALID; + } + if (key.status === "dirty" || value.status === "dirty") { + status.dirty(); + } + finalMap.set(key.value, value.value); + } + return { status: status.value, value: finalMap }; + }); + } + else { + const finalMap = new Map(); + for (const pair of pairs) { + const key = pair.key; + const value = pair.value; + if (key.status === "aborted" || value.status === "aborted") { + return INVALID; + } + if (key.status === "dirty" || value.status === "dirty") { + status.dirty(); + } + finalMap.set(key.value, value.value); + } + return { status: status.value, value: finalMap }; + } } } -ZodVoid.create = (params) => { - return new ZodVoid({ - typeName: ZodFirstPartyTypeKind.ZodVoid, +ZodMap.create = (keyType, valueType, params) => { + return new ZodMap({ + valueType, + keyType, + typeName: ZodFirstPartyTypeKind.ZodMap, ...processCreateParams(params), }); }; -class ZodArray extends ZodType { +class ZodSet extends ZodType { _parse(input) { - const { ctx, status } = this._processInputParams(input); - const def = this._def; - if (ctx.parsedType !== ZodParsedType.array) { + const { status, ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.set) { addIssueToContext(ctx, { code: ZodIssueCode.invalid_type, - expected: ZodParsedType.array, + expected: ZodParsedType.set, received: ctx.parsedType, }); return INVALID; } - if (def.exactLength !== null) { - const tooBig = ctx.data.length > def.exactLength.value; - const tooSmall = ctx.data.length < def.exactLength.value; - if (tooBig || tooSmall) { - addIssueToContext(ctx, { - code: tooBig ? ZodIssueCode.too_big : ZodIssueCode.too_small, - minimum: (tooSmall ? def.exactLength.value : undefined), - maximum: (tooBig ? def.exactLength.value : undefined), - type: "array", - inclusive: true, - exact: true, - message: def.exactLength.message, - }); - status.dirty(); - } - } - if (def.minLength !== null) { - if (ctx.data.length < def.minLength.value) { + const def = this._def; + if (def.minSize !== null) { + if (ctx.data.size < def.minSize.value) { addIssueToContext(ctx, { code: ZodIssueCode.too_small, - minimum: def.minLength.value, - type: "array", + minimum: def.minSize.value, + type: "set", inclusive: true, exact: false, - message: def.minLength.message, + message: def.minSize.message, }); status.dirty(); } } - if (def.maxLength !== null) { - if (ctx.data.length > def.maxLength.value) { + if (def.maxSize !== null) { + if (ctx.data.size > def.maxSize.value) { addIssueToContext(ctx, { code: ZodIssueCode.too_big, - maximum: def.maxLength.value, - type: "array", + maximum: def.maxSize.value, + type: "set", inclusive: true, exact: false, - message: def.maxLength.message, + message: def.maxSize.message, }); status.dirty(); } } + const valueType = this._def.valueType; + function finalizeSet(elements) { + const parsedSet = new Set(); + for (const element of elements) { + if (element.status === "aborted") + return INVALID; + if (element.status === "dirty") + status.dirty(); + parsedSet.add(element.value); + } + return { status: status.value, value: parsedSet }; + } + const elements = [...ctx.data.values()].map((item, i) => valueType._parse(new ParseInputLazyPath(ctx, item, ctx.path, i))); if (ctx.common.async) { - return Promise.all([...ctx.data].map((item, i) => { - return def.type._parseAsync(new ParseInputLazyPath(ctx, item, ctx.path, i)); - })).then((result) => { - return ParseStatus.mergeArray(status, result); - }); + return Promise.all(elements).then((elements) => finalizeSet(elements)); + } + else { + return finalizeSet(elements); } - const result = [...ctx.data].map((item, i) => { - return def.type._parseSync(new ParseInputLazyPath(ctx, item, ctx.path, i)); - }); - return ParseStatus.mergeArray(status, result); - } - get element() { - return this._def.type; } - min(minLength, message) { - return new ZodArray({ + min(minSize, message) { + return new ZodSet({ ...this._def, - minLength: { value: minLength, message: errorUtil.toString(message) }, + minSize: { value: minSize, message: errorUtil.toString(message) }, }); } - max(maxLength, message) { - return new ZodArray({ + max(maxSize, message) { + return new ZodSet({ ...this._def, - maxLength: { value: maxLength, message: errorUtil.toString(message) }, + maxSize: { value: maxSize, message: errorUtil.toString(message) }, }); } - length(len, message) { - return new ZodArray({ - ...this._def, - exactLength: { value: len, message: errorUtil.toString(message) }, - }); + size(size, message) { + return this.min(size, message).max(size, message); } nonempty(message) { return this.min(1, message); } } -ZodArray.create = (schema, params) => { - return new ZodArray({ - type: schema, - minLength: null, - maxLength: null, - exactLength: null, - typeName: ZodFirstPartyTypeKind.ZodArray, +ZodSet.create = (valueType, params) => { + return new ZodSet({ + valueType, + minSize: null, + maxSize: null, + typeName: ZodFirstPartyTypeKind.ZodSet, ...processCreateParams(params), }); }; -function deepPartialify(schema) { - if (schema instanceof ZodObject) { - const newShape = {}; - for (const key in schema.shape) { - const fieldSchema = schema.shape[key]; - newShape[key] = ZodOptional.create(deepPartialify(fieldSchema)); - } - return new ZodObject({ - ...schema._def, - shape: () => newShape, - }); - } - else if (schema instanceof ZodArray) { - return new ZodArray({ - ...schema._def, - type: deepPartialify(schema.element), - }); - } - else if (schema instanceof ZodOptional) { - return ZodOptional.create(deepPartialify(schema.unwrap())); - } - else if (schema instanceof ZodNullable) { - return ZodNullable.create(deepPartialify(schema.unwrap())); - } - else if (schema instanceof ZodTuple) { - return ZodTuple.create(schema.items.map((item) => deepPartialify(item))); - } - else { - return schema; - } -} -class ZodObject extends ZodType { +class ZodFunction extends ZodType { constructor() { super(...arguments); - this._cached = null; - /** - * @deprecated In most cases, this is no longer needed - unknown properties are now silently stripped. - * If you want to pass through unknown properties, use `.passthrough()` instead. - */ - this.nonstrict = this.passthrough; - // extend< - // Augmentation extends ZodRawShape, - // NewOutput extends util.flatten<{ - // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation - // ? Augmentation[k]["_output"] - // : k extends keyof Output - // ? Output[k] - // : never; - // }>, - // NewInput extends util.flatten<{ - // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation - // ? Augmentation[k]["_input"] - // : k extends keyof Input - // ? Input[k] - // : never; - // }> - // >( - // augmentation: Augmentation - // ): ZodObject< - // extendShape, - // UnknownKeys, - // Catchall, - // NewOutput, - // NewInput - // > { - // return new ZodObject({ - // ...this._def, - // shape: () => ({ - // ...this._def.shape(), - // ...augmentation, - // }), - // }) as any; - // } - /** - * @deprecated Use `.extend` instead - * */ - this.augment = this.extend; - } - _getCached() { - if (this._cached !== null) - return this._cached; - const shape = this._def.shape(); - const keys = util.objectKeys(shape); - return (this._cached = { shape, keys }); + this.validate = this.implement; } _parse(input) { - const parsedType = this._getType(input); - if (parsedType !== ZodParsedType.object) { - const ctx = this._getOrReturnCtx(input); + const { ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.function) { addIssueToContext(ctx, { code: ZodIssueCode.invalid_type, - expected: ZodParsedType.object, + expected: ZodParsedType.function, received: ctx.parsedType, }); return INVALID; } - const { status, ctx } = this._processInputParams(input); - const { shape, keys: shapeKeys } = this._getCached(); - const extraKeys = []; - if (!(this._def.catchall instanceof ZodNever && - this._def.unknownKeys === "strip")) { - for (const key in ctx.data) { - if (!shapeKeys.includes(key)) { - extraKeys.push(key); - } - } - } - const pairs = []; - for (const key of shapeKeys) { - const keyValidator = shape[key]; - const value = ctx.data[key]; - pairs.push({ - key: { status: "valid", value: key }, - value: keyValidator._parse(new ParseInputLazyPath(ctx, value, ctx.path, key)), - alwaysSet: key in ctx.data, + function makeArgsIssue(args, error) { + return makeIssue({ + data: args, + path: ctx.path, + errorMaps: [ + ctx.common.contextualErrorMap, + ctx.schemaErrorMap, + getErrorMap(), + errorMap, + ].filter((x) => !!x), + issueData: { + code: ZodIssueCode.invalid_arguments, + argumentsError: error, + }, }); } - if (this._def.catchall instanceof ZodNever) { - const unknownKeys = this._def.unknownKeys; - if (unknownKeys === "passthrough") { - for (const key of extraKeys) { - pairs.push({ - key: { status: "valid", value: key }, - value: { status: "valid", value: ctx.data[key] }, - }); - } - } - else if (unknownKeys === "strict") { - if (extraKeys.length > 0) { - addIssueToContext(ctx, { - code: ZodIssueCode.unrecognized_keys, - keys: extraKeys, - }); - status.dirty(); - } - } - else if (unknownKeys === "strip") ; - else { - throw new Error(`Internal ZodObject error: invalid unknownKeys value.`); - } + function makeReturnsIssue(returns, error) { + return makeIssue({ + data: returns, + path: ctx.path, + errorMaps: [ + ctx.common.contextualErrorMap, + ctx.schemaErrorMap, + getErrorMap(), + errorMap, + ].filter((x) => !!x), + issueData: { + code: ZodIssueCode.invalid_return_type, + returnTypeError: error, + }, + }); } - else { - // run catchall validation - const catchall = this._def.catchall; - for (const key of extraKeys) { - const value = ctx.data[key]; - pairs.push({ - key: { status: "valid", value: key }, - value: catchall._parse(new ParseInputLazyPath(ctx, value, ctx.path, key) //, ctx.child(key), value, getParsedType(value) - ), - alwaysSet: key in ctx.data, + const params = { errorMap: ctx.common.contextualErrorMap }; + const fn = ctx.data; + if (this._def.returns instanceof ZodPromise) { + // Would love a way to avoid disabling this rule, but we need + // an alias (using an arrow function was what caused 2651). + // eslint-disable-next-line @typescript-eslint/no-this-alias + const me = this; + return OK(async function (...args) { + const error = new ZodError([]); + const parsedArgs = await me._def.args + .parseAsync(args, params) + .catch((e) => { + error.addIssue(makeArgsIssue(args, e)); + throw error; }); - } - } - if (ctx.common.async) { - return Promise.resolve() - .then(async () => { - const syncPairs = []; - for (const pair of pairs) { - const key = await pair.key; - const value = await pair.value; - syncPairs.push({ - key, - value, - alwaysSet: pair.alwaysSet, - }); - } - return syncPairs; - }) - .then((syncPairs) => { - return ParseStatus.mergeObjectSync(status, syncPairs); + const result = await Reflect.apply(fn, this, parsedArgs); + const parsedReturns = await me._def.returns._def.type + .parseAsync(result, params) + .catch((e) => { + error.addIssue(makeReturnsIssue(result, e)); + throw error; + }); + return parsedReturns; }); } else { - return ParseStatus.mergeObjectSync(status, pairs); - } - } - get shape() { - return this._def.shape(); - } - strict(message) { - errorUtil.errToObj; - return new ZodObject({ - ...this._def, - unknownKeys: "strict", - ...(message !== undefined - ? { - errorMap: (issue, ctx) => { - var _a, _b, _c, _d; - const defaultError = (_c = (_b = (_a = this._def).errorMap) === null || _b === void 0 ? void 0 : _b.call(_a, issue, ctx).message) !== null && _c !== void 0 ? _c : ctx.defaultError; - if (issue.code === "unrecognized_keys") - return { - message: (_d = errorUtil.errToObj(message).message) !== null && _d !== void 0 ? _d : defaultError, - }; - return { - message: defaultError, - }; - }, + // Would love a way to avoid disabling this rule, but we need + // an alias (using an arrow function was what caused 2651). + // eslint-disable-next-line @typescript-eslint/no-this-alias + const me = this; + return OK(function (...args) { + const parsedArgs = me._def.args.safeParse(args, params); + if (!parsedArgs.success) { + throw new ZodError([makeArgsIssue(args, parsedArgs.error)]); } - : {}), - }); - } - strip() { - return new ZodObject({ - ...this._def, - unknownKeys: "strip", - }); - } - passthrough() { - return new ZodObject({ - ...this._def, - unknownKeys: "passthrough", - }); - } - // const AugmentFactory = - // (def: Def) => - // ( - // augmentation: Augmentation - // ): ZodObject< - // extendShape, Augmentation>, - // Def["unknownKeys"], - // Def["catchall"] - // > => { - // return new ZodObject({ - // ...def, - // shape: () => ({ - // ...def.shape(), - // ...augmentation, - // }), - // }) as any; - // }; - extend(augmentation) { - return new ZodObject({ - ...this._def, - shape: () => ({ - ...this._def.shape(), - ...augmentation, - }), - }); + const result = Reflect.apply(fn, this, parsedArgs.data); + const parsedReturns = me._def.returns.safeParse(result, params); + if (!parsedReturns.success) { + throw new ZodError([makeReturnsIssue(result, parsedReturns.error)]); + } + return parsedReturns.data; + }); + } } - /** - * Prior to zod@1.0.12 there was a bug in the - * inferred type of merged objects. Please - * upgrade if you are experiencing issues. - */ - merge(merging) { - const merged = new ZodObject({ - unknownKeys: merging._def.unknownKeys, - catchall: merging._def.catchall, - shape: () => ({ - ...this._def.shape(), - ...merging._def.shape(), - }), - typeName: ZodFirstPartyTypeKind.ZodObject, - }); - return merged; + parameters() { + return this._def.args; } - // merge< - // Incoming extends AnyZodObject, - // Augmentation extends Incoming["shape"], - // NewOutput extends { - // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation - // ? Augmentation[k]["_output"] - // : k extends keyof Output - // ? Output[k] - // : never; - // }, - // NewInput extends { - // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation - // ? Augmentation[k]["_input"] - // : k extends keyof Input - // ? Input[k] - // : never; - // } - // >( - // merging: Incoming - // ): ZodObject< - // extendShape>, - // Incoming["_def"]["unknownKeys"], - // Incoming["_def"]["catchall"], - // NewOutput, - // NewInput - // > { - // const merged: any = new ZodObject({ - // unknownKeys: merging._def.unknownKeys, - // catchall: merging._def.catchall, - // shape: () => - // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()), - // typeName: ZodFirstPartyTypeKind.ZodObject, - // }) as any; - // return merged; - // } - setKey(key, schema) { - return this.augment({ [key]: schema }); + returnType() { + return this._def.returns; } - // merge( - // merging: Incoming - // ): //ZodObject = (merging) => { - // ZodObject< - // extendShape>, - // Incoming["_def"]["unknownKeys"], - // Incoming["_def"]["catchall"] - // > { - // // const mergedShape = objectUtil.mergeShapes( - // // this._def.shape(), - // // merging._def.shape() - // // ); - // const merged: any = new ZodObject({ - // unknownKeys: merging._def.unknownKeys, - // catchall: merging._def.catchall, - // shape: () => - // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()), - // typeName: ZodFirstPartyTypeKind.ZodObject, - // }) as any; - // return merged; - // } - catchall(index) { - return new ZodObject({ + args(...items) { + return new ZodFunction({ ...this._def, - catchall: index, + args: ZodTuple.create(items).rest(ZodUnknown.create()), }); } - pick(mask) { - const shape = {}; - util.objectKeys(mask).forEach((key) => { - if (mask[key] && this.shape[key]) { - shape[key] = this.shape[key]; - } - }); - return new ZodObject({ + returns(returnType) { + return new ZodFunction({ ...this._def, - shape: () => shape, + returns: returnType, }); } - omit(mask) { - const shape = {}; - util.objectKeys(this.shape).forEach((key) => { - if (!mask[key]) { - shape[key] = this.shape[key]; - } - }); - return new ZodObject({ - ...this._def, - shape: () => shape, - }); + implement(func) { + const validatedFunc = this.parse(func); + return validatedFunc; } - /** - * @deprecated - */ - deepPartial() { - return deepPartialify(this); + strictImplement(func) { + const validatedFunc = this.parse(func); + return validatedFunc; } - partial(mask) { - const newShape = {}; - util.objectKeys(this.shape).forEach((key) => { - const fieldSchema = this.shape[key]; - if (mask && !mask[key]) { - newShape[key] = fieldSchema; - } - else { - newShape[key] = fieldSchema.optional(); - } - }); - return new ZodObject({ - ...this._def, - shape: () => newShape, + static create(args, returns, params) { + return new ZodFunction({ + args: (args + ? args + : ZodTuple.create([]).rest(ZodUnknown.create())), + returns: returns || ZodUnknown.create(), + typeName: ZodFirstPartyTypeKind.ZodFunction, + ...processCreateParams(params), }); } - required(mask) { - const newShape = {}; - util.objectKeys(this.shape).forEach((key) => { - if (mask && !mask[key]) { - newShape[key] = this.shape[key]; - } - else { - const fieldSchema = this.shape[key]; - let newField = fieldSchema; - while (newField instanceof ZodOptional) { - newField = newField._def.innerType; - } - newShape[key] = newField; - } - }); - return new ZodObject({ - ...this._def, - shape: () => newShape, - }); +} +class ZodLazy extends ZodType { + get schema() { + return this._def.getter(); } - keyof() { - return createZodEnum(util.objectKeys(this.shape)); + _parse(input) { + const { ctx } = this._processInputParams(input); + const lazySchema = this._def.getter(); + return lazySchema._parse({ data: ctx.data, path: ctx.path, parent: ctx }); } } -ZodObject.create = (shape, params) => { - return new ZodObject({ - shape: () => shape, - unknownKeys: "strip", - catchall: ZodNever.create(), - typeName: ZodFirstPartyTypeKind.ZodObject, +ZodLazy.create = (getter, params) => { + return new ZodLazy({ + getter: getter, + typeName: ZodFirstPartyTypeKind.ZodLazy, ...processCreateParams(params), }); }; -ZodObject.strictCreate = (shape, params) => { - return new ZodObject({ - shape: () => shape, - unknownKeys: "strict", - catchall: ZodNever.create(), - typeName: ZodFirstPartyTypeKind.ZodObject, +class ZodLiteral extends ZodType { + _parse(input) { + if (input.data !== this._def.value) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + received: ctx.data, + code: ZodIssueCode.invalid_literal, + expected: this._def.value, + }); + return INVALID; + } + return { status: "valid", value: input.data }; + } + get value() { + return this._def.value; + } +} +ZodLiteral.create = (value, params) => { + return new ZodLiteral({ + value: value, + typeName: ZodFirstPartyTypeKind.ZodLiteral, ...processCreateParams(params), }); }; -ZodObject.lazycreate = (shape, params) => { - return new ZodObject({ - shape, - unknownKeys: "strip", - catchall: ZodNever.create(), - typeName: ZodFirstPartyTypeKind.ZodObject, +function createZodEnum(values, params) { + return new ZodEnum({ + values, + typeName: ZodFirstPartyTypeKind.ZodEnum, ...processCreateParams(params), }); -}; -class ZodUnion extends ZodType { +} +class ZodEnum extends ZodType { + constructor() { + super(...arguments); + _ZodEnum_cache.set(this, void 0); + } _parse(input) { - const { ctx } = this._processInputParams(input); - const options = this._def.options; - function handleResults(results) { - // return first issue-free validation if it exists - for (const result of results) { - if (result.result.status === "valid") { - return result.result; - } - } - for (const result of results) { - if (result.result.status === "dirty") { - // add issues from dirty option - ctx.common.issues.push(...result.ctx.common.issues); - return result.result; - } - } - // return invalid - const unionErrors = results.map((result) => new ZodError(result.ctx.common.issues)); + if (typeof input.data !== "string") { + const ctx = this._getOrReturnCtx(input); + const expectedValues = this._def.values; addIssueToContext(ctx, { - code: ZodIssueCode.invalid_union, - unionErrors, + expected: util.joinValues(expectedValues), + received: ctx.parsedType, + code: ZodIssueCode.invalid_type, }); return INVALID; } - if (ctx.common.async) { - return Promise.all(options.map(async (option) => { - const childCtx = { - ...ctx, - common: { - ...ctx.common, - issues: [], - }, - parent: null, - }; - return { - result: await option._parseAsync({ - data: ctx.data, - path: ctx.path, - parent: childCtx, - }), - ctx: childCtx, - }; - })).then(handleResults); + if (!__classPrivateFieldGet(this, _ZodEnum_cache, "f")) { + __classPrivateFieldSet(this, _ZodEnum_cache, new Set(this._def.values), "f"); } - else { - let dirty = undefined; - const issues = []; - for (const option of options) { - const childCtx = { - ...ctx, - common: { - ...ctx.common, - issues: [], - }, - parent: null, - }; - const result = option._parseSync({ - data: ctx.data, - path: ctx.path, - parent: childCtx, - }); - if (result.status === "valid") { - return result; - } - else if (result.status === "dirty" && !dirty) { - dirty = { result, ctx: childCtx }; - } - if (childCtx.common.issues.length) { - issues.push(childCtx.common.issues); - } - } - if (dirty) { - ctx.common.issues.push(...dirty.ctx.common.issues); - return dirty.result; - } - const unionErrors = issues.map((issues) => new ZodError(issues)); + if (!__classPrivateFieldGet(this, _ZodEnum_cache, "f").has(input.data)) { + const ctx = this._getOrReturnCtx(input); + const expectedValues = this._def.values; + addIssueToContext(ctx, { + received: ctx.data, + code: ZodIssueCode.invalid_enum_value, + options: expectedValues, + }); + return INVALID; + } + return OK(input.data); + } + get options() { + return this._def.values; + } + get enum() { + const enumValues = {}; + for (const val of this._def.values) { + enumValues[val] = val; + } + return enumValues; + } + get Values() { + const enumValues = {}; + for (const val of this._def.values) { + enumValues[val] = val; + } + return enumValues; + } + get Enum() { + const enumValues = {}; + for (const val of this._def.values) { + enumValues[val] = val; + } + return enumValues; + } + extract(values, newDef = this._def) { + return ZodEnum.create(values, { + ...this._def, + ...newDef, + }); + } + exclude(values, newDef = this._def) { + return ZodEnum.create(this.options.filter((opt) => !values.includes(opt)), { + ...this._def, + ...newDef, + }); + } +} +_ZodEnum_cache = new WeakMap(); +ZodEnum.create = createZodEnum; +class ZodNativeEnum extends ZodType { + constructor() { + super(...arguments); + _ZodNativeEnum_cache.set(this, void 0); + } + _parse(input) { + const nativeEnumValues = util.getValidEnumValues(this._def.values); + const ctx = this._getOrReturnCtx(input); + if (ctx.parsedType !== ZodParsedType.string && + ctx.parsedType !== ZodParsedType.number) { + const expectedValues = util.objectValues(nativeEnumValues); + addIssueToContext(ctx, { + expected: util.joinValues(expectedValues), + received: ctx.parsedType, + code: ZodIssueCode.invalid_type, + }); + return INVALID; + } + if (!__classPrivateFieldGet(this, _ZodNativeEnum_cache, "f")) { + __classPrivateFieldSet(this, _ZodNativeEnum_cache, new Set(util.getValidEnumValues(this._def.values)), "f"); + } + if (!__classPrivateFieldGet(this, _ZodNativeEnum_cache, "f").has(input.data)) { + const expectedValues = util.objectValues(nativeEnumValues); addIssueToContext(ctx, { - code: ZodIssueCode.invalid_union, - unionErrors, + received: ctx.data, + code: ZodIssueCode.invalid_enum_value, + options: expectedValues, }); return INVALID; } + return OK(input.data); } - get options() { - return this._def.options; + get enum() { + return this._def.values; } } -ZodUnion.create = (types, params) => { - return new ZodUnion({ - options: types, - typeName: ZodFirstPartyTypeKind.ZodUnion, +_ZodNativeEnum_cache = new WeakMap(); +ZodNativeEnum.create = (values, params) => { + return new ZodNativeEnum({ + values: values, + typeName: ZodFirstPartyTypeKind.ZodNativeEnum, ...processCreateParams(params), }); }; -///////////////////////////////////////////////////// -///////////////////////////////////////////////////// -////////// ////////// -////////// ZodDiscriminatedUnion ////////// -////////// ////////// -///////////////////////////////////////////////////// -///////////////////////////////////////////////////// -const getDiscriminator = (type) => { - if (type instanceof ZodLazy) { - return getDiscriminator(type.schema); - } - else if (type instanceof ZodEffects) { - return getDiscriminator(type.innerType()); - } - else if (type instanceof ZodLiteral) { - return [type.value]; - } - else if (type instanceof ZodEnum) { - return type.options; - } - else if (type instanceof ZodNativeEnum) { - // eslint-disable-next-line ban/ban - return util.objectValues(type.enum); - } - else if (type instanceof ZodDefault) { - return getDiscriminator(type._def.innerType); - } - else if (type instanceof ZodUndefined) { - return [undefined]; - } - else if (type instanceof ZodNull) { - return [null]; - } - else if (type instanceof ZodOptional) { - return [undefined, ...getDiscriminator(type.unwrap())]; - } - else if (type instanceof ZodNullable) { - return [null, ...getDiscriminator(type.unwrap())]; - } - else if (type instanceof ZodBranded) { - return getDiscriminator(type.unwrap()); - } - else if (type instanceof ZodReadonly) { - return getDiscriminator(type.unwrap()); - } - else if (type instanceof ZodCatch) { - return getDiscriminator(type._def.innerType); - } - else { - return []; +class ZodPromise extends ZodType { + unwrap() { + return this._def.type; } -}; -class ZodDiscriminatedUnion extends ZodType { _parse(input) { const { ctx } = this._processInputParams(input); - if (ctx.parsedType !== ZodParsedType.object) { + if (ctx.parsedType !== ZodParsedType.promise && + ctx.common.async === false) { addIssueToContext(ctx, { code: ZodIssueCode.invalid_type, - expected: ZodParsedType.object, + expected: ZodParsedType.promise, received: ctx.parsedType, }); return INVALID; } - const discriminator = this.discriminator; - const discriminatorValue = ctx.data[discriminator]; - const option = this.optionsMap.get(discriminatorValue); - if (!option) { - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_union_discriminator, - options: Array.from(this.optionsMap.keys()), - path: [discriminator], - }); - return INVALID; - } - if (ctx.common.async) { - return option._parseAsync({ - data: ctx.data, - path: ctx.path, - parent: ctx, - }); - } - else { - return option._parseSync({ - data: ctx.data, + const promisified = ctx.parsedType === ZodParsedType.promise + ? ctx.data + : Promise.resolve(ctx.data); + return OK(promisified.then((data) => { + return this._def.type.parseAsync(data, { path: ctx.path, - parent: ctx, + errorMap: ctx.common.contextualErrorMap, }); - } - } - get discriminator() { - return this._def.discriminator; - } - get options() { - return this._def.options; - } - get optionsMap() { - return this._def.optionsMap; - } - /** - * The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor. - * However, it only allows a union of objects, all of which need to share a discriminator property. This property must - * have a different value for each object in the union. - * @param discriminator the name of the discriminator property - * @param types an array of object schemas - * @param params - */ - static create(discriminator, options, params) { - // Get all the valid discriminator values - const optionsMap = new Map(); - // try { - for (const type of options) { - const discriminatorValues = getDiscriminator(type.shape[discriminator]); - if (!discriminatorValues.length) { - throw new Error(`A discriminator value for key \`${discriminator}\` could not be extracted from all schema options`); - } - for (const value of discriminatorValues) { - if (optionsMap.has(value)) { - throw new Error(`Discriminator property ${String(discriminator)} has duplicate value ${String(value)}`); - } - optionsMap.set(value, type); - } - } - return new ZodDiscriminatedUnion({ - typeName: ZodFirstPartyTypeKind.ZodDiscriminatedUnion, - discriminator, - options, - optionsMap, - ...processCreateParams(params), - }); + })); } } -function mergeValues(a, b) { - const aType = getParsedType(a); - const bType = getParsedType(b); - if (a === b) { - return { valid: true, data: a }; - } - else if (aType === ZodParsedType.object && bType === ZodParsedType.object) { - const bKeys = util.objectKeys(b); - const sharedKeys = util - .objectKeys(a) - .filter((key) => bKeys.indexOf(key) !== -1); - const newObj = { ...a, ...b }; - for (const key of sharedKeys) { - const sharedValue = mergeValues(a[key], b[key]); - if (!sharedValue.valid) { - return { valid: false }; - } - newObj[key] = sharedValue.data; - } - return { valid: true, data: newObj }; - } - else if (aType === ZodParsedType.array && bType === ZodParsedType.array) { - if (a.length !== b.length) { - return { valid: false }; - } - const newArray = []; - for (let index = 0; index < a.length; index++) { - const itemA = a[index]; - const itemB = b[index]; - const sharedValue = mergeValues(itemA, itemB); - if (!sharedValue.valid) { - return { valid: false }; - } - newArray.push(sharedValue.data); - } - return { valid: true, data: newArray }; - } - else if (aType === ZodParsedType.date && - bType === ZodParsedType.date && - +a === +b) { - return { valid: true, data: a }; +ZodPromise.create = (schema, params) => { + return new ZodPromise({ + type: schema, + typeName: ZodFirstPartyTypeKind.ZodPromise, + ...processCreateParams(params), + }); +}; +class ZodEffects extends ZodType { + innerType() { + return this._def.schema; } - else { - return { valid: false }; + sourceType() { + return this._def.schema._def.typeName === ZodFirstPartyTypeKind.ZodEffects + ? this._def.schema.sourceType() + : this._def.schema; } -} -class ZodIntersection extends ZodType { _parse(input) { const { status, ctx } = this._processInputParams(input); - const handleParsed = (parsedLeft, parsedRight) => { - if (isAborted(parsedLeft) || isAborted(parsedRight)) { - return INVALID; - } - const merged = mergeValues(parsedLeft.value, parsedRight.value); - if (!merged.valid) { - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_intersection_types, + const effect = this._def.effect || null; + const checkCtx = { + addIssue: (arg) => { + addIssueToContext(ctx, arg); + if (arg.fatal) { + status.abort(); + } + else { + status.dirty(); + } + }, + get path() { + return ctx.path; + }, + }; + checkCtx.addIssue = checkCtx.addIssue.bind(checkCtx); + if (effect.type === "preprocess") { + const processed = effect.transform(ctx.data, checkCtx); + if (ctx.common.async) { + return Promise.resolve(processed).then(async (processed) => { + if (status.value === "aborted") + return INVALID; + const result = await this._def.schema._parseAsync({ + data: processed, + path: ctx.path, + parent: ctx, + }); + if (result.status === "aborted") + return INVALID; + if (result.status === "dirty") + return DIRTY(result.value); + if (status.value === "dirty") + return DIRTY(result.value); + return result; }); - return INVALID; } - if (isDirty(parsedLeft) || isDirty(parsedRight)) { - status.dirty(); + else { + if (status.value === "aborted") + return INVALID; + const result = this._def.schema._parseSync({ + data: processed, + path: ctx.path, + parent: ctx, + }); + if (result.status === "aborted") + return INVALID; + if (result.status === "dirty") + return DIRTY(result.value); + if (status.value === "dirty") + return DIRTY(result.value); + return result; } - return { status: status.value, value: merged.data }; - }; - if (ctx.common.async) { - return Promise.all([ - this._def.left._parseAsync({ + } + if (effect.type === "refinement") { + const executeRefinement = (acc) => { + const result = effect.refinement(acc, checkCtx); + if (ctx.common.async) { + return Promise.resolve(result); + } + if (result instanceof Promise) { + throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead."); + } + return acc; + }; + if (ctx.common.async === false) { + const inner = this._def.schema._parseSync({ data: ctx.data, path: ctx.path, parent: ctx, - }), - this._def.right._parseAsync({ + }); + if (inner.status === "aborted") + return INVALID; + if (inner.status === "dirty") + status.dirty(); + // return value is ignored + executeRefinement(inner.value); + return { status: status.value, value: inner.value }; + } + else { + return this._def.schema + ._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }) + .then((inner) => { + if (inner.status === "aborted") + return INVALID; + if (inner.status === "dirty") + status.dirty(); + return executeRefinement(inner.value).then(() => { + return { status: status.value, value: inner.value }; + }); + }); + } + } + if (effect.type === "transform") { + if (ctx.common.async === false) { + const base = this._def.schema._parseSync({ data: ctx.data, path: ctx.path, parent: ctx, - }), - ]).then(([left, right]) => handleParsed(left, right)); - } - else { - return handleParsed(this._def.left._parseSync({ - data: ctx.data, - path: ctx.path, - parent: ctx, - }), this._def.right._parseSync({ - data: ctx.data, - path: ctx.path, - parent: ctx, - })); + }); + if (!isValid(base)) + return base; + const result = effect.transform(base.value, checkCtx); + if (result instanceof Promise) { + throw new Error(`Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.`); + } + return { status: status.value, value: result }; + } + else { + return this._def.schema + ._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }) + .then((base) => { + if (!isValid(base)) + return base; + return Promise.resolve(effect.transform(base.value, checkCtx)).then((result) => ({ status: status.value, value: result })); + }); + } } + util.assertNever(effect); } } -ZodIntersection.create = (left, right, params) => { - return new ZodIntersection({ - left: left, - right: right, - typeName: ZodFirstPartyTypeKind.ZodIntersection, +ZodEffects.create = (schema, effect, params) => { + return new ZodEffects({ + schema, + typeName: ZodFirstPartyTypeKind.ZodEffects, + effect, ...processCreateParams(params), }); }; -class ZodTuple extends ZodType { +ZodEffects.createWithPreprocess = (preprocess, schema, params) => { + return new ZodEffects({ + schema, + effect: { type: "preprocess", transform: preprocess }, + typeName: ZodFirstPartyTypeKind.ZodEffects, + ...processCreateParams(params), + }); +}; +class ZodOptional extends ZodType { _parse(input) { - const { status, ctx } = this._processInputParams(input); - if (ctx.parsedType !== ZodParsedType.array) { - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_type, - expected: ZodParsedType.array, - received: ctx.parsedType, - }); - return INVALID; + const parsedType = this._getType(input); + if (parsedType === ZodParsedType.undefined) { + return OK(undefined); } - if (ctx.data.length < this._def.items.length) { - addIssueToContext(ctx, { - code: ZodIssueCode.too_small, - minimum: this._def.items.length, - inclusive: true, - exact: false, - type: "array", - }); - return INVALID; + return this._def.innerType._parse(input); + } + unwrap() { + return this._def.innerType; + } +} +ZodOptional.create = (type, params) => { + return new ZodOptional({ + innerType: type, + typeName: ZodFirstPartyTypeKind.ZodOptional, + ...processCreateParams(params), + }); +}; +class ZodNullable extends ZodType { + _parse(input) { + const parsedType = this._getType(input); + if (parsedType === ZodParsedType.null) { + return OK(null); } - const rest = this._def.rest; - if (!rest && ctx.data.length > this._def.items.length) { - addIssueToContext(ctx, { - code: ZodIssueCode.too_big, - maximum: this._def.items.length, - inclusive: true, - exact: false, - type: "array", - }); - status.dirty(); + return this._def.innerType._parse(input); + } + unwrap() { + return this._def.innerType; + } +} +ZodNullable.create = (type, params) => { + return new ZodNullable({ + innerType: type, + typeName: ZodFirstPartyTypeKind.ZodNullable, + ...processCreateParams(params), + }); +}; +class ZodDefault extends ZodType { + _parse(input) { + const { ctx } = this._processInputParams(input); + let data = ctx.data; + if (ctx.parsedType === ZodParsedType.undefined) { + data = this._def.defaultValue(); } - const items = [...ctx.data] - .map((item, itemIndex) => { - const schema = this._def.items[itemIndex] || this._def.rest; - if (!schema) - return null; - return schema._parse(new ParseInputLazyPath(ctx, item, ctx.path, itemIndex)); - }) - .filter((x) => !!x); // filter nulls - if (ctx.common.async) { - return Promise.all(items).then((results) => { - return ParseStatus.mergeArray(status, results); + return this._def.innerType._parse({ + data, + path: ctx.path, + parent: ctx, + }); + } + removeDefault() { + return this._def.innerType; + } +} +ZodDefault.create = (type, params) => { + return new ZodDefault({ + innerType: type, + typeName: ZodFirstPartyTypeKind.ZodDefault, + defaultValue: typeof params.default === "function" + ? params.default + : () => params.default, + ...processCreateParams(params), + }); +}; +class ZodCatch extends ZodType { + _parse(input) { + const { ctx } = this._processInputParams(input); + // newCtx is used to not collect issues from inner types in ctx + const newCtx = { + ...ctx, + common: { + ...ctx.common, + issues: [], + }, + }; + const result = this._def.innerType._parse({ + data: newCtx.data, + path: newCtx.path, + parent: { + ...newCtx, + }, + }); + if (isAsync(result)) { + return result.then((result) => { + return { + status: "valid", + value: result.status === "valid" + ? result.value + : this._def.catchValue({ + get error() { + return new ZodError(newCtx.common.issues); + }, + input: newCtx.data, + }), + }; }); } else { - return ParseStatus.mergeArray(status, items); + return { + status: "valid", + value: result.status === "valid" + ? result.value + : this._def.catchValue({ + get error() { + return new ZodError(newCtx.common.issues); + }, + input: newCtx.data, + }), + }; } } - get items() { - return this._def.items; - } - rest(rest) { - return new ZodTuple({ - ...this._def, - rest, - }); + removeCatch() { + return this._def.innerType; } } -ZodTuple.create = (schemas, params) => { - if (!Array.isArray(schemas)) { - throw new Error("You must pass an array of schemas to z.tuple([ ... ])"); - } - return new ZodTuple({ - items: schemas, - typeName: ZodFirstPartyTypeKind.ZodTuple, - rest: null, +ZodCatch.create = (type, params) => { + return new ZodCatch({ + innerType: type, + typeName: ZodFirstPartyTypeKind.ZodCatch, + catchValue: typeof params.catch === "function" ? params.catch : () => params.catch, ...processCreateParams(params), }); }; -class ZodRecord extends ZodType { - get keySchema() { - return this._def.keyType; - } - get valueSchema() { - return this._def.valueType; - } +class ZodNaN extends ZodType { _parse(input) { - const { status, ctx } = this._processInputParams(input); - if (ctx.parsedType !== ZodParsedType.object) { + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.nan) { + const ctx = this._getOrReturnCtx(input); addIssueToContext(ctx, { code: ZodIssueCode.invalid_type, - expected: ZodParsedType.object, + expected: ZodParsedType.nan, received: ctx.parsedType, }); return INVALID; } - const pairs = []; - const keyType = this._def.keyType; - const valueType = this._def.valueType; - for (const key in ctx.data) { - pairs.push({ - key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, key)), - value: valueType._parse(new ParseInputLazyPath(ctx, ctx.data[key], ctx.path, key)), - alwaysSet: key in ctx.data, - }); - } + return { status: "valid", value: input.data }; + } +} +ZodNaN.create = (params) => { + return new ZodNaN({ + typeName: ZodFirstPartyTypeKind.ZodNaN, + ...processCreateParams(params), + }); +}; +const BRAND = Symbol("zod_brand"); +class ZodBranded extends ZodType { + _parse(input) { + const { ctx } = this._processInputParams(input); + const data = ctx.data; + return this._def.type._parse({ + data, + path: ctx.path, + parent: ctx, + }); + } + unwrap() { + return this._def.type; + } +} +class ZodPipeline extends ZodType { + _parse(input) { + const { status, ctx } = this._processInputParams(input); if (ctx.common.async) { - return ParseStatus.mergeObjectAsync(status, pairs); + const handleAsync = async () => { + const inResult = await this._def.in._parseAsync({ + data: ctx.data, + path: ctx.path, + parent: ctx, + }); + if (inResult.status === "aborted") + return INVALID; + if (inResult.status === "dirty") { + status.dirty(); + return DIRTY(inResult.value); + } + else { + return this._def.out._parseAsync({ + data: inResult.value, + path: ctx.path, + parent: ctx, + }); + } + }; + return handleAsync(); } else { - return ParseStatus.mergeObjectSync(status, pairs); - } - } - get element() { - return this._def.valueType; - } - static create(first, second, third) { - if (second instanceof ZodType) { - return new ZodRecord({ - keyType: first, - valueType: second, - typeName: ZodFirstPartyTypeKind.ZodRecord, - ...processCreateParams(third), + const inResult = this._def.in._parseSync({ + data: ctx.data, + path: ctx.path, + parent: ctx, }); + if (inResult.status === "aborted") + return INVALID; + if (inResult.status === "dirty") { + status.dirty(); + return { + status: "dirty", + value: inResult.value, + }; + } + else { + return this._def.out._parseSync({ + data: inResult.value, + path: ctx.path, + parent: ctx, + }); + } } - return new ZodRecord({ - keyType: ZodString.create(), - valueType: first, - typeName: ZodFirstPartyTypeKind.ZodRecord, - ...processCreateParams(second), + } + static create(a, b) { + return new ZodPipeline({ + in: a, + out: b, + typeName: ZodFirstPartyTypeKind.ZodPipeline, }); } } -class ZodMap extends ZodType { - get keySchema() { - return this._def.keyType; +class ZodReadonly extends ZodType { + _parse(input) { + const result = this._def.innerType._parse(input); + const freeze = (data) => { + if (isValid(data)) { + data.value = Object.freeze(data.value); + } + return data; + }; + return isAsync(result) + ? result.then((data) => freeze(data)) + : freeze(result); } - get valueSchema() { - return this._def.valueType; + unwrap() { + return this._def.innerType; } - _parse(input) { - const { status, ctx } = this._processInputParams(input); - if (ctx.parsedType !== ZodParsedType.map) { - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_type, - expected: ZodParsedType.map, - received: ctx.parsedType, - }); - return INVALID; - } - const keyType = this._def.keyType; - const valueType = this._def.valueType; - const pairs = [...ctx.data.entries()].map(([key, value], index) => { - return { - key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, [index, "key"])), - value: valueType._parse(new ParseInputLazyPath(ctx, value, ctx.path, [index, "value"])), - }; +} +ZodReadonly.create = (type, params) => { + return new ZodReadonly({ + innerType: type, + typeName: ZodFirstPartyTypeKind.ZodReadonly, + ...processCreateParams(params), + }); +}; +function custom(check, params = {}, +/** + * @deprecated + * + * Pass `fatal` into the params object instead: + * + * ```ts + * z.string().custom((val) => val.length > 5, { fatal: false }) + * ``` + * + */ +fatal) { + if (check) + return ZodAny.create().superRefine((data, ctx) => { + var _a, _b; + if (!check(data)) { + const p = typeof params === "function" + ? params(data) + : typeof params === "string" + ? { message: params } + : params; + const _fatal = (_b = (_a = p.fatal) !== null && _a !== void 0 ? _a : fatal) !== null && _b !== void 0 ? _b : true; + const p2 = typeof p === "string" ? { message: p } : p; + ctx.addIssue({ code: "custom", ...p2, fatal: _fatal }); + } }); - if (ctx.common.async) { - const finalMap = new Map(); - return Promise.resolve().then(async () => { - for (const pair of pairs) { - const key = await pair.key; - const value = await pair.value; - if (key.status === "aborted" || value.status === "aborted") { - return INVALID; - } - if (key.status === "dirty" || value.status === "dirty") { - status.dirty(); - } - finalMap.set(key.value, value.value); - } - return { status: status.value, value: finalMap }; - }); - } - else { - const finalMap = new Map(); - for (const pair of pairs) { - const key = pair.key; - const value = pair.value; - if (key.status === "aborted" || value.status === "aborted") { - return INVALID; + return ZodAny.create(); +} +const late = { + object: ZodObject.lazycreate, +}; +var ZodFirstPartyTypeKind; +(function (ZodFirstPartyTypeKind) { + ZodFirstPartyTypeKind["ZodString"] = "ZodString"; + ZodFirstPartyTypeKind["ZodNumber"] = "ZodNumber"; + ZodFirstPartyTypeKind["ZodNaN"] = "ZodNaN"; + ZodFirstPartyTypeKind["ZodBigInt"] = "ZodBigInt"; + ZodFirstPartyTypeKind["ZodBoolean"] = "ZodBoolean"; + ZodFirstPartyTypeKind["ZodDate"] = "ZodDate"; + ZodFirstPartyTypeKind["ZodSymbol"] = "ZodSymbol"; + ZodFirstPartyTypeKind["ZodUndefined"] = "ZodUndefined"; + ZodFirstPartyTypeKind["ZodNull"] = "ZodNull"; + ZodFirstPartyTypeKind["ZodAny"] = "ZodAny"; + ZodFirstPartyTypeKind["ZodUnknown"] = "ZodUnknown"; + ZodFirstPartyTypeKind["ZodNever"] = "ZodNever"; + ZodFirstPartyTypeKind["ZodVoid"] = "ZodVoid"; + ZodFirstPartyTypeKind["ZodArray"] = "ZodArray"; + ZodFirstPartyTypeKind["ZodObject"] = "ZodObject"; + ZodFirstPartyTypeKind["ZodUnion"] = "ZodUnion"; + ZodFirstPartyTypeKind["ZodDiscriminatedUnion"] = "ZodDiscriminatedUnion"; + ZodFirstPartyTypeKind["ZodIntersection"] = "ZodIntersection"; + ZodFirstPartyTypeKind["ZodTuple"] = "ZodTuple"; + ZodFirstPartyTypeKind["ZodRecord"] = "ZodRecord"; + ZodFirstPartyTypeKind["ZodMap"] = "ZodMap"; + ZodFirstPartyTypeKind["ZodSet"] = "ZodSet"; + ZodFirstPartyTypeKind["ZodFunction"] = "ZodFunction"; + ZodFirstPartyTypeKind["ZodLazy"] = "ZodLazy"; + ZodFirstPartyTypeKind["ZodLiteral"] = "ZodLiteral"; + ZodFirstPartyTypeKind["ZodEnum"] = "ZodEnum"; + ZodFirstPartyTypeKind["ZodEffects"] = "ZodEffects"; + ZodFirstPartyTypeKind["ZodNativeEnum"] = "ZodNativeEnum"; + ZodFirstPartyTypeKind["ZodOptional"] = "ZodOptional"; + ZodFirstPartyTypeKind["ZodNullable"] = "ZodNullable"; + ZodFirstPartyTypeKind["ZodDefault"] = "ZodDefault"; + ZodFirstPartyTypeKind["ZodCatch"] = "ZodCatch"; + ZodFirstPartyTypeKind["ZodPromise"] = "ZodPromise"; + ZodFirstPartyTypeKind["ZodBranded"] = "ZodBranded"; + ZodFirstPartyTypeKind["ZodPipeline"] = "ZodPipeline"; + ZodFirstPartyTypeKind["ZodReadonly"] = "ZodReadonly"; +})(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {})); +const instanceOfType = ( +// const instanceOfType = any>( +cls, params = { + message: `Input not instance of ${cls.name}`, +}) => custom((data) => data instanceof cls, params); +const stringType = ZodString.create; +const numberType = ZodNumber.create; +const nanType = ZodNaN.create; +const bigIntType = ZodBigInt.create; +const booleanType = ZodBoolean.create; +const dateType = ZodDate.create; +const symbolType = ZodSymbol.create; +const undefinedType = ZodUndefined.create; +const nullType = ZodNull.create; +const anyType = ZodAny.create; +const unknownType = ZodUnknown.create; +const neverType = ZodNever.create; +const voidType = ZodVoid.create; +const arrayType = ZodArray.create; +const objectType = ZodObject.create; +const strictObjectType = ZodObject.strictCreate; +const unionType = ZodUnion.create; +const discriminatedUnionType = ZodDiscriminatedUnion.create; +const intersectionType = ZodIntersection.create; +const tupleType = ZodTuple.create; +const recordType = ZodRecord.create; +const mapType = ZodMap.create; +const setType = ZodSet.create; +const functionType = ZodFunction.create; +const lazyType = ZodLazy.create; +const literalType = ZodLiteral.create; +const enumType = ZodEnum.create; +const nativeEnumType = ZodNativeEnum.create; +const promiseType = ZodPromise.create; +const effectsType = ZodEffects.create; +const optionalType = ZodOptional.create; +const nullableType = ZodNullable.create; +const preprocessType = ZodEffects.createWithPreprocess; +const pipelineType = ZodPipeline.create; +const ostring = () => stringType().optional(); +const onumber = () => numberType().optional(); +const oboolean = () => booleanType().optional(); +const coerce = { + string: ((arg) => ZodString.create({ ...arg, coerce: true })), + number: ((arg) => ZodNumber.create({ ...arg, coerce: true })), + boolean: ((arg) => ZodBoolean.create({ + ...arg, + coerce: true, + })), + bigint: ((arg) => ZodBigInt.create({ ...arg, coerce: true })), + date: ((arg) => ZodDate.create({ ...arg, coerce: true })), +}; +const NEVER = INVALID; + +var z = /*#__PURE__*/Object.freeze({ + __proto__: null, + defaultErrorMap: errorMap, + setErrorMap: setErrorMap, + getErrorMap: getErrorMap, + makeIssue: makeIssue, + EMPTY_PATH: EMPTY_PATH, + addIssueToContext: addIssueToContext, + ParseStatus: ParseStatus, + INVALID: INVALID, + DIRTY: DIRTY, + OK: OK, + isAborted: isAborted, + isDirty: isDirty, + isValid: isValid, + isAsync: isAsync, + get util () { return util; }, + get objectUtil () { return objectUtil; }, + ZodParsedType: ZodParsedType, + getParsedType: getParsedType, + ZodType: ZodType, + datetimeRegex: datetimeRegex, + ZodString: ZodString, + ZodNumber: ZodNumber, + ZodBigInt: ZodBigInt, + ZodBoolean: ZodBoolean, + ZodDate: ZodDate, + ZodSymbol: ZodSymbol, + ZodUndefined: ZodUndefined, + ZodNull: ZodNull, + ZodAny: ZodAny, + ZodUnknown: ZodUnknown, + ZodNever: ZodNever, + ZodVoid: ZodVoid, + ZodArray: ZodArray, + ZodObject: ZodObject, + ZodUnion: ZodUnion, + ZodDiscriminatedUnion: ZodDiscriminatedUnion, + ZodIntersection: ZodIntersection, + ZodTuple: ZodTuple, + ZodRecord: ZodRecord, + ZodMap: ZodMap, + ZodSet: ZodSet, + ZodFunction: ZodFunction, + ZodLazy: ZodLazy, + ZodLiteral: ZodLiteral, + ZodEnum: ZodEnum, + ZodNativeEnum: ZodNativeEnum, + ZodPromise: ZodPromise, + ZodEffects: ZodEffects, + ZodTransformer: ZodEffects, + ZodOptional: ZodOptional, + ZodNullable: ZodNullable, + ZodDefault: ZodDefault, + ZodCatch: ZodCatch, + ZodNaN: ZodNaN, + BRAND: BRAND, + ZodBranded: ZodBranded, + ZodPipeline: ZodPipeline, + ZodReadonly: ZodReadonly, + custom: custom, + Schema: ZodType, + ZodSchema: ZodType, + late: late, + get ZodFirstPartyTypeKind () { return ZodFirstPartyTypeKind; }, + coerce: coerce, + any: anyType, + array: arrayType, + bigint: bigIntType, + boolean: booleanType, + date: dateType, + discriminatedUnion: discriminatedUnionType, + effect: effectsType, + 'enum': enumType, + 'function': functionType, + 'instanceof': instanceOfType, + intersection: intersectionType, + lazy: lazyType, + literal: literalType, + map: mapType, + nan: nanType, + nativeEnum: nativeEnumType, + never: neverType, + 'null': nullType, + nullable: nullableType, + number: numberType, + object: objectType, + oboolean: oboolean, + onumber: onumber, + optional: optionalType, + ostring: ostring, + pipeline: pipelineType, + preprocess: preprocessType, + promise: promiseType, + record: recordType, + set: setType, + strictObject: strictObjectType, + string: stringType, + symbol: symbolType, + transformer: effectsType, + tuple: tupleType, + 'undefined': undefinedType, + union: unionType, + unknown: unknownType, + 'void': voidType, + NEVER: NEVER, + ZodIssueCode: ZodIssueCode, + quotelessJson: quotelessJson, + ZodError: ZodError +}); + + + + +/***/ }), + +/***/ "./sample/resources.ts": +/*!*****************************!*\ + !*** ./sample/resources.ts ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ Resources: () => (/* binding */ Resources), +/* harmony export */ loader: () => (/* binding */ loader) +/* harmony export */ }); +/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); +/* harmony import */ var _excalibur_ldtk__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @excalibur-ldtk */ "./src/index.ts"); + + +const Resources = { + HeroSpriteSheetPng: new excalibur__WEBPACK_IMPORTED_MODULE_0__.ImageSource('./Solaria Demo Pack Update 03/Solaria Demo Pack Update 03/16x16/Sprites/Hero 01.png'), + LdtkResource: new _excalibur_ldtk__WEBPACK_IMPORTED_MODULE_1__.LdtkResource('./spacing-padding/spacing-padding.ldtk', { + useTilemapCameraStrategy: true, + useMapBackgroundColor: true, + }), + LdtkAutoTile: new _excalibur_ldtk__WEBPACK_IMPORTED_MODULE_1__.LdtkResource('./autotile/autotile.ldtk', { + useMapBackgroundColor: true, + }), + LdtkPureAutoTile: new _excalibur_ldtk__WEBPACK_IMPORTED_MODULE_1__.LdtkResource('./dsml1/dsml1.ldtk', { + useMapBackgroundColor: true, + }) +}; +const loader = new excalibur__WEBPACK_IMPORTED_MODULE_0__.Loader(); +for (let resource of Object.values(Resources)) { + loader.addResource(resource); +} + + +/***/ }), + +/***/ "./src/entity-layer.ts": +/*!*****************************!*\ + !*** ./src/entity-layer.ts ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ EntityLayer: () => (/* binding */ EntityLayer) +/* harmony export */ }); +/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); + +class EntityLayer { + constructor(level, ldtkLayer, resource, order) { + this.ldtkLayer = ldtkLayer; + this.resource = resource; + this.order = order; + this.entities = []; + this.ldtkToEntity = new Map(); + this.entityToLdtk = new Map(); + this.worldPos = (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(level.ldtkLevel.worldX, level.ldtkLevel.worldY); + this.offset = (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(ldtkLayer.__pxTotalOffsetX, ldtkLayer.__pxTotalOffsetY); + console.log("yo"); + } + runFactories() { + var _a, _b; + const ldtkLayer = this.ldtkLayer; + const resource = this.resource; + const order = this.order; + if (ldtkLayer.entityInstances) { + for (let entity of ldtkLayer.entityInstances) { + const entityMetadata = resource.projectMetadata.defs.entities.find(e => { + return e.identifier === entity.__identifier; + }); + if (resource.factories.has(entity.__identifier)) { + const factory = resource.factories.get(entity.__identifier); + if (factory) { + const newEntity = factory({ + type: entity.__identifier, + worldPos: (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(entity.px[0], entity.px[1]).add(this.worldPos.add(this.offset)), + entity, + definition: entityMetadata, + layer: this, + }); + if (newEntity) { + this.entities.push(newEntity); + this.ldtkToEntity.set(entity, newEntity); + this.entityToLdtk.set(newEntity, entity); + } + } } - if (key.status === "dirty" || value.status === "dirty") { - status.dirty(); + else { + if (entity.__tile) { + const actor = new excalibur__WEBPACK_IMPORTED_MODULE_0__.Actor({ + name: entity.__identifier, + pos: (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(entity.px[0], entity.px[1]).add(this.worldPos.add(this.offset)), + width: entity.width, + height: entity.height, + anchor: (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)((_a = entityMetadata === null || entityMetadata === void 0 ? void 0 : entityMetadata.pivotX) !== null && _a !== void 0 ? _a : 0, (_b = entityMetadata === null || entityMetadata === void 0 ? void 0 : entityMetadata.pivotY) !== null && _b !== void 0 ? _b : 0), + z: order + }); + const ts = resource.tilesets.get(entity.__tile.tilesetUid); + if (ts) { + const tsxCoord = Math.floor(entity.__tile.x / entity.__tile.w); + const tsyCoord = Math.floor(entity.__tile.y / entity.__tile.h); + const sprite = ts.spritesheet.getSprite(tsxCoord, tsyCoord); + if (sprite) { + actor.graphics.use(sprite); + } + } + this.entities.push(actor); + this.ldtkToEntity.set(entity, actor); + this.entityToLdtk.set(actor, entity); + } } - finalMap.set(key.value, value.value); } - return { status: status.value, value: finalMap }; } + // for (let entity of this.ldtkLayer.entityInstances) { + // const factory = this.resource.factories.get(entity.__identifier); + // if (!factory) { continue } + // + // const entityMetadata = this.resource.projectMetadata.defs.entities.find(e => { + // return e.identifier === entity.__identifier + // }); + // + // const newEntity = factory({ + // type: entity.__identifier, + // worldPos: vec(entity.px[0], entity.px[1]).add(this.worldPos.add(this.offset)), + // entity, + // definition: entityMetadata, + // layer: this, + // }); + // + // if (newEntity) { + // // remove pre-existing entity (e.g. the default actor created for the entity placement) + // const preExisting = this.ldtkToEntity.get(entity); + // if (preExisting) { + // const index = this.entities.indexOf(preExisting); + // if (index > -1) { + // this.entities.splice(index, 1); + // this.ldtkToEntity.delete(entity); + // this.entityToLdtk.delete(preExisting); + // } + // } + // + // this.entities.push(newEntity); + // this.ldtkToEntity.set(entity, newEntity); + // this.entityToLdtk.set(newEntity, entity); + // } + // } } -} -ZodMap.create = (keyType, valueType, params) => { - return new ZodMap({ - valueType, - keyType, - typeName: ZodFirstPartyTypeKind.ZodMap, - ...processCreateParams(params), - }); -}; -class ZodSet extends ZodType { - _parse(input) { - const { status, ctx } = this._processInputParams(input); - if (ctx.parsedType !== ZodParsedType.set) { - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_type, - expected: ZodParsedType.set, - received: ctx.parsedType, - }); - return INVALID; - } - const def = this._def; - if (def.minSize !== null) { - if (ctx.data.size < def.minSize.value) { - addIssueToContext(ctx, { - code: ZodIssueCode.too_small, - minimum: def.minSize.value, - type: "set", - inclusive: true, - exact: false, - message: def.minSize.message, - }); - status.dirty(); - } - } - if (def.maxSize !== null) { - if (ctx.data.size > def.maxSize.value) { - addIssueToContext(ctx, { - code: ZodIssueCode.too_big, - maximum: def.maxSize.value, - type: "set", - inclusive: true, - exact: false, - message: def.maxSize.message, - }); - status.dirty(); + getEntitiesByIdentifier(identifier) { + const ldtkEntities = this.getLdtkEntitiesByIdentifier(identifier); + let results = []; + for (const ldtk of ldtkEntities) { + const maybeEntity = this.ldtkToEntity.get(ldtk); + if (maybeEntity) { + results.push(maybeEntity); } } - const valueType = this._def.valueType; - function finalizeSet(elements) { - const parsedSet = new Set(); - for (const element of elements) { - if (element.status === "aborted") - return INVALID; - if (element.status === "dirty") - status.dirty(); - parsedSet.add(element.value); + return results; + } + getEntitiesByField(fieldIdentifier, value) { + const ldtkEntities = this.getLdtkEntitiesByField(fieldIdentifier, value); + let results = []; + for (const ldtk of ldtkEntities) { + const maybeEntity = this.ldtkToEntity.get(ldtk); + if (maybeEntity) { + results.push(maybeEntity); } - return { status: status.value, value: parsedSet }; - } - const elements = [...ctx.data.values()].map((item, i) => valueType._parse(new ParseInputLazyPath(ctx, item, ctx.path, i))); - if (ctx.common.async) { - return Promise.all(elements).then((elements) => finalizeSet(elements)); - } - else { - return finalizeSet(elements); } + return results; } - min(minSize, message) { - return new ZodSet({ - ...this._def, - minSize: { value: minSize, message: errorUtil.toString(message) }, - }); + /** + * Search layer for entities that match an identifier (case insensitive) + * @param identifier + * @returns + */ + getLdtkEntitiesByIdentifier(identifier) { + return this.ldtkLayer.entityInstances.filter(e => e.__identifier.toLocaleLowerCase() === identifier.toLowerCase()); } - max(maxSize, message) { - return new ZodSet({ - ...this._def, - maxSize: { value: maxSize, message: errorUtil.toString(message) }, + /** + * Search layer for entities that match a field and optionally a value (both case insensitive) + * @param fieldIdentifier + * @param value + */ + getLdtkEntitiesByField(fieldIdentifier, value) { + return this.ldtkLayer.entityInstances.filter(e => { + if (value !== undefined) { + let normalizedValue = value; + if (typeof value === 'string') { + normalizedValue = value.toLocaleLowerCase(); + } + const field = e.fieldInstances.find(f => f.__identifier.toLocaleLowerCase() === fieldIdentifier.toLocaleLowerCase()); + if (field) { + return field.__value === normalizedValue; + } + return false; + } + else { + return !!e.fieldInstances.find(f => f.__identifier.toLocaleLowerCase() === fieldIdentifier.toLocaleLowerCase()); + } }); } - size(size, message) { - return this.min(size, message).max(size, message); - } - nonempty(message) { - return this.min(1, message); - } } -ZodSet.create = (valueType, params) => { - return new ZodSet({ - valueType, - minSize: null, - maxSize: null, - typeName: ZodFirstPartyTypeKind.ZodSet, - ...processCreateParams(params), - }); -}; -class ZodFunction extends ZodType { - constructor() { - super(...arguments); - this.validate = this.implement; + + +/***/ }), + +/***/ "./src/file-loader.ts": +/*!****************************!*\ + !*** ./src/file-loader.ts ***! + \****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ FetchLoader: () => (/* binding */ FetchLoader) +/* harmony export */ }); +const FetchLoader = async (path, contentType) => { + const response = await fetch(path); + switch (contentType.toLowerCase()) { + case 'xml': return await response.text(); + case 'json': return await response.json(); + default: return await response.text(); } - _parse(input) { - const { ctx } = this._processInputParams(input); - if (ctx.parsedType !== ZodParsedType.function) { - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_type, - expected: ZodParsedType.function, - received: ctx.parsedType, - }); - return INVALID; - } - function makeArgsIssue(args, error) { - return makeIssue({ - data: args, - path: ctx.path, - errorMaps: [ - ctx.common.contextualErrorMap, - ctx.schemaErrorMap, - getErrorMap(), - errorMap, - ].filter((x) => !!x), - issueData: { - code: ZodIssueCode.invalid_arguments, - argumentsError: error, - }, +}; + + +/***/ }), + +/***/ "./src/index.ts": +/*!**********************!*\ + !*** ./src/index.ts ***! + \**********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ EntityLayer: () => (/* reexport safe */ _entity_layer__WEBPACK_IMPORTED_MODULE_1__.EntityLayer), +/* harmony export */ FetchLoader: () => (/* reexport safe */ _file_loader__WEBPACK_IMPORTED_MODULE_2__.FetchLoader), +/* harmony export */ IntGridLayer: () => (/* reexport safe */ _intgrid_layer__WEBPACK_IMPORTED_MODULE_3__.IntGridLayer), +/* harmony export */ LdtkEntityDefinition: () => (/* reexport safe */ _types__WEBPACK_IMPORTED_MODULE_10__.LdtkEntityDefinition), +/* harmony export */ LdtkEntityInstance: () => (/* reexport safe */ _types__WEBPACK_IMPORTED_MODULE_10__.LdtkEntityInstance), +/* harmony export */ LdtkLayerDefinition: () => (/* reexport safe */ _types__WEBPACK_IMPORTED_MODULE_10__.LdtkLayerDefinition), +/* harmony export */ LdtkLayerInstance: () => (/* reexport safe */ _types__WEBPACK_IMPORTED_MODULE_10__.LdtkLayerInstance), +/* harmony export */ LdtkLevel: () => (/* reexport safe */ _types__WEBPACK_IMPORTED_MODULE_10__.LdtkLevel), +/* harmony export */ LdtkProjectMetadata: () => (/* reexport safe */ _types__WEBPACK_IMPORTED_MODULE_10__.LdtkProjectMetadata), +/* harmony export */ LdtkResource: () => (/* reexport safe */ _ldtk_resource__WEBPACK_IMPORTED_MODULE_0__.LdtkResource), +/* harmony export */ Level: () => (/* reexport safe */ _level__WEBPACK_IMPORTED_MODULE_5__.Level), +/* harmony export */ LevelResource: () => (/* reexport safe */ _level_resource__WEBPACK_IMPORTED_MODULE_4__.LevelResource), +/* harmony export */ LoaderCache: () => (/* reexport safe */ _loader_cache__WEBPACK_IMPORTED_MODULE_6__.LoaderCache), +/* harmony export */ TileLayer: () => (/* reexport safe */ _tile_layer__WEBPACK_IMPORTED_MODULE_8__.TileLayer), +/* harmony export */ Tileset: () => (/* reexport safe */ _tileset__WEBPACK_IMPORTED_MODULE_9__.Tileset), +/* harmony export */ filenameFromPath: () => (/* reexport safe */ _path_util__WEBPACK_IMPORTED_MODULE_7__.filenameFromPath), +/* harmony export */ mapPath: () => (/* reexport safe */ _path_util__WEBPACK_IMPORTED_MODULE_7__.mapPath), +/* harmony export */ pathInMap: () => (/* reexport safe */ _path_util__WEBPACK_IMPORTED_MODULE_7__.pathInMap), +/* harmony export */ pathRelativeToBase: () => (/* reexport safe */ _path_util__WEBPACK_IMPORTED_MODULE_7__.pathRelativeToBase) +/* harmony export */ }); +/* harmony import */ var _ldtk_resource__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ldtk-resource */ "./src/ldtk-resource.ts"); +/* harmony import */ var _entity_layer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./entity-layer */ "./src/entity-layer.ts"); +/* harmony import */ var _file_loader__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./file-loader */ "./src/file-loader.ts"); +/* harmony import */ var _intgrid_layer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./intgrid-layer */ "./src/intgrid-layer.ts"); +/* harmony import */ var _level_resource__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./level-resource */ "./src/level-resource.ts"); +/* harmony import */ var _level__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./level */ "./src/level.ts"); +/* harmony import */ var _loader_cache__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./loader-cache */ "./src/loader-cache.ts"); +/* harmony import */ var _path_util__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./path-util */ "./src/path-util.ts"); +/* harmony import */ var _tile_layer__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./tile-layer */ "./src/tile-layer.ts"); +/* harmony import */ var _tileset__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./tileset */ "./src/tileset.ts"); +/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./types */ "./src/types.ts"); + + + + + + + + + + + + + +/***/ }), + +/***/ "./src/intgrid-layer.ts": +/*!******************************!*\ + !*** ./src/intgrid-layer.ts ***! + \******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ IntGridLayer: () => (/* binding */ IntGridLayer) +/* harmony export */ }); +/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); + +class IntGridLayer { + constructor(level, ldtkLayer, resource, order) { + var _a, _b, _c, _d; + this.order = order; + this.worldPos = (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(level.ldtkLevel.worldX, level.ldtkLevel.worldY); + this.offset = (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(ldtkLayer.__pxTotalOffsetX, ldtkLayer.__pxTotalOffsetY); + this.ldtkLayer = ldtkLayer; + if (ldtkLayer.intGridCsv.length || ldtkLayer.autoLayerTiles.length) { + const rows = ldtkLayer.__cHei; + const columns = ldtkLayer.__cWid; + this.tilemap = new excalibur__WEBPACK_IMPORTED_MODULE_0__.TileMap({ + name: ldtkLayer.__identifier, + pos: this.worldPos.add(this.offset), + tileWidth: ldtkLayer.__gridSize, + tileHeight: ldtkLayer.__gridSize, + rows, + columns, }); - } - function makeReturnsIssue(returns, error) { - return makeIssue({ - data: returns, - path: ctx.path, - errorMaps: [ - ctx.common.contextualErrorMap, - ctx.schemaErrorMap, - getErrorMap(), - errorMap, - ].filter((x) => !!x), - issueData: { - code: ZodIssueCode.invalid_return_type, - returnTypeError: error, - }, + this.tilemap.z = order; + const graphics = this.tilemap.get(excalibur__WEBPACK_IMPORTED_MODULE_0__.GraphicsComponent); + graphics.isVisible = ldtkLayer.visible; + // find the intgrid metadata + const layerMetadata = resource.projectMetadata.defs.layers.find(l => { + return ldtkLayer.__identifier === l.identifier; }); - } - const params = { errorMap: ctx.common.contextualErrorMap }; - const fn = ctx.data; - if (this._def.returns instanceof ZodPromise) { - // Would love a way to avoid disabling this rule, but we need - // an alias (using an arrow function was what caused 2651). - // eslint-disable-next-line @typescript-eslint/no-this-alias - const me = this; - return OK(async function (...args) { - const error = new ZodError([]); - const parsedArgs = await me._def.args - .parseAsync(args, params) - .catch((e) => { - error.addIssue(makeArgsIssue(args, e)); - throw error; - }); - const result = await Reflect.apply(fn, this, parsedArgs); - const parsedReturns = await me._def.returns._def.type - .parseAsync(result, params) - .catch((e) => { - error.addIssue(makeReturnsIssue(result, e)); - throw error; + if (layerMetadata) { + const solidValue = layerMetadata.intGridValues.find(val => { + var _a; + return ((_a = val === null || val === void 0 ? void 0 : val.identifier) === null || _a === void 0 ? void 0 : _a.toLocaleLowerCase()) === 'solid'; }); - return parsedReturns; - }); - } - else { - // Would love a way to avoid disabling this rule, but we need - // an alias (using an arrow function was what caused 2651). - // eslint-disable-next-line @typescript-eslint/no-this-alias - const me = this; - return OK(function (...args) { - const parsedArgs = me._def.args.safeParse(args, params); - if (!parsedArgs.success) { - throw new ZodError([makeArgsIssue(args, parsedArgs.error)]); + for (let i = 0; i < ldtkLayer.intGridCsv.length; i++) { + const xCoord = i % columns; + const yCoord = Math.floor(i / columns); + const tile = this.tilemap.getTile(xCoord, yCoord); + if (solidValue && ldtkLayer.intGridCsv[i] === solidValue.value) { + tile.solid = true; + } + // TODO might be a mistake to treat 1 as solid if there isn't a labelled solid + if (!solidValue && ldtkLayer.intGridCsv[i] === 1) { + tile.solid = true; + } } - const result = Reflect.apply(fn, this, parsedArgs.data); - const parsedReturns = me._def.returns.safeParse(result, params); - if (!parsedReturns.success) { - throw new ZodError([makeReturnsIssue(result, parsedReturns.error)]); + if (ldtkLayer.__tilesetDefUid) { + this.tileset = resource.tilesets.get(ldtkLayer.__tilesetDefUid); + for (let i = 0; i < ldtkLayer.autoLayerTiles.length; i++) { + const tile = ldtkLayer.autoLayerTiles[i]; + const xCoord = Math.floor(tile.px[0] / ldtkLayer.__gridSize); + const yCoord = Math.floor(tile.px[1] / ldtkLayer.__gridSize); + const exTile = this.tilemap.getTile(xCoord, yCoord); + if (exTile && this.tileset) { + const tsxCoord = Math.floor((tile.src[0] - ((_a = this.tileset.ldtkTileset.padding) !== null && _a !== void 0 ? _a : 0)) / (this.tileset.ldtkTileset.tileGridSize + ((_b = this.tileset.ldtkTileset.spacing) !== null && _b !== void 0 ? _b : 0))); + const tsyCoord = Math.floor((tile.src[1] - ((_c = this.tileset.ldtkTileset.padding) !== null && _c !== void 0 ? _c : 0)) / (this.tileset.ldtkTileset.tileGridSize + ((_d = this.tileset.ldtkTileset.spacing) !== null && _d !== void 0 ? _d : 0))); + // Bit 0 toggles x flip + // Bit 1 toggles 1 flip + // Examples: f=0 (no flip), f=1 (X flip only), f=2 (Y flip only), f=3 (both flips) + const flipHorizontal = !!(tile.f & 0b01); + const flipVertical = !!(tile.f & 0b10); + let sprite = this.tileset.spritesheet.getSprite(tsxCoord, tsyCoord); + if (flipHorizontal || flipVertical) { + sprite = sprite.clone(); + sprite.flipHorizontal = flipHorizontal; + sprite.flipVertical = flipVertical; + } + if (sprite) { + exTile.addGraphic(sprite); + } + else { + console.error('Could not find sprite in LDtk spritesheet at', tsxCoord, tsyCoord); + } + } + } } - return parsedReturns.data; - }); + } } } - parameters() { - return this._def.args; - } - returnType() { - return this._def.returns; - } - args(...items) { - return new ZodFunction({ - ...this._def, - args: ZodTuple.create(items).rest(ZodUnknown.create()), - }); - } - returns(returnType) { - return new ZodFunction({ - ...this._def, - returns: returnType, - }); - } - implement(func) { - const validatedFunc = this.parse(func); - return validatedFunc; - } - strictImplement(func) { - const validatedFunc = this.parse(func); - return validatedFunc; - } - static create(args, returns, params) { - return new ZodFunction({ - args: (args - ? args - : ZodTuple.create([]).rest(ZodUnknown.create())), - returns: returns || ZodUnknown.create(), - typeName: ZodFirstPartyTypeKind.ZodFunction, - ...processCreateParams(params), - }); - } -} -class ZodLazy extends ZodType { - get schema() { - return this._def.getter(); - } - _parse(input) { - const { ctx } = this._processInputParams(input); - const lazySchema = this._def.getter(); - return lazySchema._parse({ data: ctx.data, path: ctx.path, parent: ctx }); - } } -ZodLazy.create = (getter, params) => { - return new ZodLazy({ - getter: getter, - typeName: ZodFirstPartyTypeKind.ZodLazy, - ...processCreateParams(params), - }); -}; -class ZodLiteral extends ZodType { - _parse(input) { - if (input.data !== this._def.value) { - const ctx = this._getOrReturnCtx(input); - addIssueToContext(ctx, { - received: ctx.data, - code: ZodIssueCode.invalid_literal, - expected: this._def.value, - }); - return INVALID; + + +/***/ }), + +/***/ "./src/ldtk-resource.ts": +/*!******************************!*\ + !*** ./src/ldtk-resource.ts ***! + \******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ LdtkResource: () => (/* binding */ LdtkResource) +/* harmony export */ }); +/* harmony import */ var _tile_layer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./tile-layer */ "./src/tile-layer.ts"); +/* harmony import */ var _path_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./path-util */ "./src/path-util.ts"); +/* harmony import */ var _file_loader__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./file-loader */ "./src/file-loader.ts"); +/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./types */ "./src/types.ts"); +/* harmony import */ var compare_versions__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! compare-versions */ "./node_modules/compare-versions/lib/esm/compare.js"); +/* harmony import */ var _loader_cache__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./loader-cache */ "./src/loader-cache.ts"); +/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); +/* harmony import */ var _level_resource__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./level-resource */ "./src/level-resource.ts"); +/* harmony import */ var _tileset__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./tileset */ "./src/tileset.ts"); +/* harmony import */ var _level__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./level */ "./src/level.ts"); +/* harmony import */ var _entity_layer__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./entity-layer */ "./src/entity-layer.ts"); +/* harmony import */ var _intgrid_layer__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./intgrid-layer */ "./src/intgrid-layer.ts"); + + + + + + + + + + + + +class LdtkResource { + constructor(path, options) { + this.path = path; + this.tilesets = new Map(); + this.levels = new Map(); + this.levelsByName = new Map(); + this.factories = new Map(); + this.fileLoader = _file_loader__WEBPACK_IMPORTED_MODULE_2__.FetchLoader; + this._imageLoader = new _loader_cache__WEBPACK_IMPORTED_MODULE_5__.LoaderCache(excalibur__WEBPACK_IMPORTED_MODULE_6__.ImageSource); + this._levelLoader = new _loader_cache__WEBPACK_IMPORTED_MODULE_5__.LoaderCache(_level_resource__WEBPACK_IMPORTED_MODULE_7__.LevelResource); + this.startZIndex = 0; + this.textQuality = 4; + this.useExcaliburWiring = true; + this.useMapBackgroundColor = false; + this.useTilemapCameraStrategy = false; + this.headless = false; + this.strict = true; + const { useExcaliburWiring, useTilemapCameraStrategy, entityIdentifierFactories, pathMap, useMapBackgroundColor, fileLoader, strict, headless, startZIndex } = { ...options }; + this.strict = strict !== null && strict !== void 0 ? strict : this.strict; + this.headless = headless !== null && headless !== void 0 ? headless : this.headless; + this.useExcaliburWiring = useExcaliburWiring !== null && useExcaliburWiring !== void 0 ? useExcaliburWiring : this.useExcaliburWiring; + this.useTilemapCameraStrategy = useTilemapCameraStrategy !== null && useTilemapCameraStrategy !== void 0 ? useTilemapCameraStrategy : this.useTilemapCameraStrategy; + this.useMapBackgroundColor = useMapBackgroundColor !== null && useMapBackgroundColor !== void 0 ? useMapBackgroundColor : this.useMapBackgroundColor; + this.startZIndex = startZIndex !== null && startZIndex !== void 0 ? startZIndex : this.startZIndex; + this.fileLoader = fileLoader !== null && fileLoader !== void 0 ? fileLoader : this.fileLoader; + this.pathMap = pathMap; + for (const key in entityIdentifierFactories) { + this.registerEntityIdentifierFactory(key, entityIdentifierFactories[key]); } - return { status: "valid", value: input.data }; - } - get value() { - return this._def.value; - } -} -ZodLiteral.create = (value, params) => { - return new ZodLiteral({ - value: value, - typeName: ZodFirstPartyTypeKind.ZodLiteral, - ...processCreateParams(params), - }); -}; -function createZodEnum(values, params) { - return new ZodEnum({ - values, - typeName: ZodFirstPartyTypeKind.ZodEnum, - ...processCreateParams(params), - }); -} -class ZodEnum extends ZodType { - constructor() { - super(...arguments); - _ZodEnum_cache.set(this, void 0); } - _parse(input) { - if (typeof input.data !== "string") { - const ctx = this._getOrReturnCtx(input); - const expectedValues = this._def.values; - addIssueToContext(ctx, { - expected: util.joinValues(expectedValues), - received: ctx.parsedType, - code: ZodIssueCode.invalid_type, - }); - return INVALID; + async load() { + var _a; + const data = await this.fileLoader(this.path, 'json'); + if (this.strict) { + try { + this.projectMetadata = _types__WEBPACK_IMPORTED_MODULE_3__.LdtkProjectMetadata.parse(data); + } + catch (e) { + console.error(`Could not parse LDtk map from location ${this.path}.\nExcalibur only supports the latest version of LDtk formats as of the plugin's release.`); + console.error(`Is your map file corrupted or being interpreted as the wrong type?`); + throw e; + } } - if (!__classPrivateFieldGet(this, _ZodEnum_cache, "f")) { - __classPrivateFieldSet(this, _ZodEnum_cache, new Set(this._def.values), "f"); + else { + this.projectMetadata = data; } - if (!__classPrivateFieldGet(this, _ZodEnum_cache, "f").has(input.data)) { - const ctx = this._getOrReturnCtx(input); - const expectedValues = this._def.values; - addIssueToContext(ctx, { - received: ctx.data, - code: ZodIssueCode.invalid_enum_value, - options: expectedValues, - }); - return INVALID; + if ((0,compare_versions__WEBPACK_IMPORTED_MODULE_4__.compare)(LdtkResource.supportedLdtkVersion, (_a = this.projectMetadata.jsonVersion) !== null && _a !== void 0 ? _a : '0.0.0', ">")) { + console.warn(`The excalibur ldtk plugin officially supports ${LdtkResource.supportedLdtkVersion}+, the current map has LDtk version ${this.projectMetadata.jsonVersion}`); } - return OK(input.data); - } - get options() { - return this._def.values; - } - get enum() { - const enumValues = {}; - for (const val of this._def.values) { - enumValues[val] = val; + // iterate through the defs + // load the tilesets + const imagesToLoad = []; + for (let tileset of this.projectMetadata.defs.tilesets) { + if (tileset.relPath) { + const imagePath = (0,_path_util__WEBPACK_IMPORTED_MODULE_1__.pathRelativeToBase)(this.path, tileset.relPath, this.pathMap); + const image = this._imageLoader.getOrAdd(imagePath); + const friendlyTileset = new _tileset__WEBPACK_IMPORTED_MODULE_8__.Tileset({ + image, + ldtkTileset: tileset + }); + this.tilesets.set(tileset.uid, friendlyTileset); + } + else { + if (tileset.identifier !== 'Internal_Icons') { + console.warn(`No tileset image provided for ${tileset.identifier}`); + } + } } - return enumValues; - } - get Values() { - const enumValues = {}; - for (const val of this._def.values) { - enumValues[val] = val; + // iterate through the levels + // load the level metadata + for (let level of this.projectMetadata.levels) { + if (level.externalRelPath) { + // external levels + const levelPath = (0,_path_util__WEBPACK_IMPORTED_MODULE_1__.pathRelativeToBase)(this.path, level.externalRelPath, this.pathMap); + this._levelLoader.getOrAdd(levelPath, this, { + headless: this.headless, + strict: this.strict, + fileLoader: this.fileLoader, + imageLoader: this._imageLoader, + pathMap: this.pathMap + }); + } + else { + // embedded levels + const friendlyLevel = new _level__WEBPACK_IMPORTED_MODULE_9__.Level(level, this); + this.levels.set(level.uid, friendlyLevel); + this.levelsByName.set(level.identifier.toLowerCase(), friendlyLevel); + } } - return enumValues; + await Promise.all([this._imageLoader.load(), this._levelLoader.load()]); + this._levelLoader.values().forEach(level => { + this.levels.set(level.data.ldtkLevel.uid, level.data); + this.levelsByName.set(level.data.ldtkLevel.identifier.toLowerCase(), level.data); + }); + return this.data = this.projectMetadata; } - get Enum() { - const enumValues = {}; - for (const val of this._def.values) { - enumValues[val] = val; - } - return enumValues; + ; + isLoaded() { + return !!this.data; } - extract(values, newDef = this._def) { - return ZodEnum.create(values, { - ...this._def, - ...newDef, - }); + registerEntityIdentifierFactory(ldtkEntityIdentifier, factory) { + this.factories.set(ldtkEntityIdentifier, factory); } - exclude(values, newDef = this._def) { - return ZodEnum.create(this.options.filter((opt) => !values.includes(opt)), { - ...this._def, - ...newDef, - }); + registerEntityIdentifierFactories(factories) { + for (const key in factories) { + this.registerEntityIdentifierFactory(key, factories[key]); + } } -} -_ZodEnum_cache = new WeakMap(); -ZodEnum.create = createZodEnum; -class ZodNativeEnum extends ZodType { - constructor() { - super(...arguments); - _ZodNativeEnum_cache.set(this, void 0); + /** + * Get a level by identifier + * @param identifier + * @returns + */ + getLevel(identifier) { + return this.levelsByName.get(identifier.toLowerCase()); } - _parse(input) { - const nativeEnumValues = util.getValidEnumValues(this._def.values); - const ctx = this._getOrReturnCtx(input); - if (ctx.parsedType !== ZodParsedType.string && - ctx.parsedType !== ZodParsedType.number) { - const expectedValues = util.objectValues(nativeEnumValues); - addIssueToContext(ctx, { - expected: util.joinValues(expectedValues), - received: ctx.parsedType, - code: ZodIssueCode.invalid_type, - }); - return INVALID; + /** + * Get the entity layers, optionally provide a level identifier to filter to + * @param levelIdentifier + */ + getEntityLayers(levelIdentifier) { + let results = []; + if (levelIdentifier) { + const level = this.getLevel(levelIdentifier); + if (level) { + for (let layer of level.layers) { + if (layer instanceof _entity_layer__WEBPACK_IMPORTED_MODULE_10__.EntityLayer) { + results.push(layer); + } + } + } } - if (!__classPrivateFieldGet(this, _ZodNativeEnum_cache, "f")) { - __classPrivateFieldSet(this, _ZodNativeEnum_cache, new Set(util.getValidEnumValues(this._def.values)), "f"); + else { + for (const level of this.levels.values()) { + for (let layer of level.layers) { + if (layer instanceof _entity_layer__WEBPACK_IMPORTED_MODULE_10__.EntityLayer) { + results.push(layer); + } + } + } } - if (!__classPrivateFieldGet(this, _ZodNativeEnum_cache, "f").has(input.data)) { - const expectedValues = util.objectValues(nativeEnumValues); - addIssueToContext(ctx, { - received: ctx.data, - code: ZodIssueCode.invalid_enum_value, - options: expectedValues, - }); - return INVALID; + return results; + } + getTileLayers(identifier) { + let results = []; + if (identifier) { + const level = this.getLevel(identifier); + if (level) { + for (let layer of level.layers) { + if (layer instanceof _tile_layer__WEBPACK_IMPORTED_MODULE_0__.TileLayer) { + results.push(layer); + } + } + } } - return OK(input.data); + else { + for (const level of this.levels.values()) { + for (let layer of level.layers) { + if (layer instanceof _tile_layer__WEBPACK_IMPORTED_MODULE_0__.TileLayer) { + results.push(layer); + } + } + } + } + return results; } - get enum() { - return this._def.values; + getIntGridLayers(identifier) { + let results = []; + if (identifier) { + const level = this.getLevel(identifier); + if (level) { + for (let layer of level.layers) { + if (layer instanceof _intgrid_layer__WEBPACK_IMPORTED_MODULE_11__.IntGridLayer) { + results.push(layer); + } + } + } + } + else { + for (const level of this.levels.values()) { + for (let layer of level.layers) { + if (layer instanceof _intgrid_layer__WEBPACK_IMPORTED_MODULE_11__.IntGridLayer) { + results.push(layer); + } + } + } + } + return results; } -} -_ZodNativeEnum_cache = new WeakMap(); -ZodNativeEnum.create = (values, params) => { - return new ZodNativeEnum({ - values: values, - typeName: ZodFirstPartyTypeKind.ZodNativeEnum, - ...processCreateParams(params), - }); -}; -class ZodPromise extends ZodType { - unwrap() { - return this._def.type; + /** + * Search layer for entities that match an identifier (case insensitive) + * @param identifier + * @returns + */ + getLdtkEntitiesByIdentifier(identifier, levels) { + let results = []; + const levelsToSearch = levels !== null && levels !== void 0 ? levels : Array.from(this.levels.values()).map(l => l.ldtkLevel.identifier); + for (const level of levelsToSearch) { + const layers = this.getEntityLayers(level); + for (let layer of layers) { + results = results.concat(layer.getLdtkEntitiesByIdentifier(identifier)); + } + } + return results; } - _parse(input) { - const { ctx } = this._processInputParams(input); - if (ctx.parsedType !== ZodParsedType.promise && - ctx.common.async === false) { - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_type, - expected: ZodParsedType.promise, - received: ctx.parsedType, - }); - return INVALID; + /** + * Search levels for ldtk entities that match a field and optionally a value (both case insensitive) + * @param fieldIdentifier + * @param value + */ + getLdtkEntitiesByField(fieldIdentifier, value, levels) { + let results = []; + const levelsToSearch = levels !== null && levels !== void 0 ? levels : Array.from(this.levels.values()).map(l => l.ldtkLevel.identifier); + for (const level of levelsToSearch) { + const layers = this.getEntityLayers(level); + for (let layer of layers) { + results = results.concat(layer.getLdtkEntitiesByField(fieldIdentifier, value)); + } } - const promisified = ctx.parsedType === ZodParsedType.promise - ? ctx.data - : Promise.resolve(ctx.data); - return OK(promisified.then((data) => { - return this._def.type.parseAsync(data, { - path: ctx.path, - errorMap: ctx.common.contextualErrorMap, - }); - })); + return results; } -} -ZodPromise.create = (schema, params) => { - return new ZodPromise({ - type: schema, - typeName: ZodFirstPartyTypeKind.ZodPromise, - ...processCreateParams(params), - }); -}; -class ZodEffects extends ZodType { - innerType() { - return this._def.schema; + /** + * Search levels for excalibur entities that match an identifier (case insensitive) + * @param identifier + * @param levels + */ + getEntitiesByIdentifier(identifier, levels) { + let results = []; + const levelsToSearch = levels !== null && levels !== void 0 ? levels : Array.from(this.levels.values()).map(l => l.ldtkLevel.identifier); + for (const level of levelsToSearch) { + const layers = this.getEntityLayers(level); + for (let layer of layers) { + results = results.concat(layer.getEntitiesByIdentifier(identifier)); + } + } + return results; } - sourceType() { - return this._def.schema._def.typeName === ZodFirstPartyTypeKind.ZodEffects - ? this._def.schema.sourceType() - : this._def.schema; + /** + * Search levels for excalibur entities that match a field and optionally a value (both case insensitive) + * @param fieldIdentifier + * @param value + * @param levels + */ + getEntitiesByField(fieldIdentifier, value, levels) { + let results = []; + const levelsToSearch = levels !== null && levels !== void 0 ? levels : Array.from(this.levels.values()).map(l => l.ldtkLevel.identifier); + for (const level of levelsToSearch) { + const layers = this.getEntityLayers(level); + for (let layer of layers) { + results = results.concat(layer.getEntitiesByField(fieldIdentifier, value)); + } + } + return results; } - _parse(input) { - const { status, ctx } = this._processInputParams(input); - const effect = this._def.effect || null; - const checkCtx = { - addIssue: (arg) => { - addIssueToContext(ctx, arg); - if (arg.fatal) { - status.abort(); + /** + * Get the level bounds given a list of level identifiers (case insensitive) + * @param levels + */ + getLevelBounds(levels) { + levels = levels !== null && levels !== void 0 ? levels : Array.from(this.levelsByName.keys()); + let bounds = null; + for (const level of this.levels.values()) { + if (!levels.includes(level.ldtkLevel.identifier)) { + continue; + } + const firstTileLayer = this.getTileLayers(level.ldtkLevel.identifier)[0]; + if (firstTileLayer) { + const tileBounds = excalibur__WEBPACK_IMPORTED_MODULE_6__.BoundingBox.fromDimension(firstTileLayer.tilemap.tileWidth * firstTileLayer.tilemap.columns, firstTileLayer.tilemap.tileHeight * firstTileLayer.tilemap.rows, excalibur__WEBPACK_IMPORTED_MODULE_6__.Vector.Zero, firstTileLayer.tilemap.pos); + if (!bounds) { + bounds = tileBounds; } else { - status.dirty(); + bounds = bounds.combine(tileBounds); } - }, - get path() { - return ctx.path; - }, - }; - checkCtx.addIssue = checkCtx.addIssue.bind(checkCtx); - if (effect.type === "preprocess") { - const processed = effect.transform(ctx.data, checkCtx); - if (ctx.common.async) { - return Promise.resolve(processed).then(async (processed) => { - if (status.value === "aborted") - return INVALID; - const result = await this._def.schema._parseAsync({ - data: processed, - path: ctx.path, - parent: ctx, - }); - if (result.status === "aborted") - return INVALID; - if (result.status === "dirty") - return DIRTY(result.value); - if (status.value === "dirty") - return DIRTY(result.value); - return result; - }); - } - else { - if (status.value === "aborted") - return INVALID; - const result = this._def.schema._parseSync({ - data: processed, - path: ctx.path, - parent: ctx, - }); - if (result.status === "aborted") - return INVALID; - if (result.status === "dirty") - return DIRTY(result.value); - if (status.value === "dirty") - return DIRTY(result.value); - return result; } } - if (effect.type === "refinement") { - const executeRefinement = (acc) => { - const result = effect.refinement(acc, checkCtx); - if (ctx.common.async) { - return Promise.resolve(result); + return bounds !== null && bounds !== void 0 ? bounds : new excalibur__WEBPACK_IMPORTED_MODULE_6__.BoundingBox(); + } + addToScene(scene, options) { + var _a, _b; + const { pos, useLevelOffsets } = { pos: (0,excalibur__WEBPACK_IMPORTED_MODULE_6__.vec)(0, 0), useLevelOffsets: true, ...options }; + for (let [id, level] of this.levels.entries()) { + if ((_a = options === null || options === void 0 ? void 0 : options.levelFilter) === null || _a === void 0 ? void 0 : _a.length) { + if (!options.levelFilter.includes(level.ldtkLevel.identifier)) { + continue; } - if (result instanceof Promise) { - throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead."); + } + for (let layer of level.layers) { + if (layer instanceof _tile_layer__WEBPACK_IMPORTED_MODULE_0__.TileLayer || layer instanceof _intgrid_layer__WEBPACK_IMPORTED_MODULE_11__.IntGridLayer) { + layer.tilemap.pos = layer.tilemap.pos.add(pos); + if (!useLevelOffsets) { + layer.tilemap.pos = layer.tilemap.pos.sub(layer.worldPos); + } + scene.add(layer.tilemap); + } + else { + layer.runFactories(); + for (let entity of layer.entities) { + const tx = entity.get(excalibur__WEBPACK_IMPORTED_MODULE_6__.TransformComponent); + if (tx) { + tx.pos = tx.pos.add(pos); + if (!useLevelOffsets) { + tx.pos = tx.pos.sub(layer.worldPos); + } + } + scene.add(entity); + } } - return acc; - }; - if (ctx.common.async === false) { - const inner = this._def.schema._parseSync({ - data: ctx.data, - path: ctx.path, - parent: ctx, - }); - if (inner.status === "aborted") - return INVALID; - if (inner.status === "dirty") - status.dirty(); - // return value is ignored - executeRefinement(inner.value); - return { status: status.value, value: inner.value }; } - else { - return this._def.schema - ._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }) - .then((inner) => { - if (inner.status === "aborted") - return INVALID; - if (inner.status === "dirty") - status.dirty(); - return executeRefinement(inner.value).then(() => { - return { status: status.value, value: inner.value }; - }); - }); + } + if (this.useExcaliburWiring) { + const camera = this.getLdtkEntitiesByField('camera', true)[0]; + if (camera) { + scene.camera.pos = (0,excalibur__WEBPACK_IMPORTED_MODULE_6__.vec)(camera.px[0], camera.px[0]); + const zoom = camera.fieldInstances.find(f => f.__identifier.toLocaleLowerCase() === 'zoom'); + if (zoom) { + scene.camera.zoom = +zoom.__value; + } } } - if (effect.type === "transform") { - if (ctx.common.async === false) { - const base = this._def.schema._parseSync({ - data: ctx.data, - path: ctx.path, - parent: ctx, - }); - if (!isValid(base)) - return base; - const result = effect.transform(base.value, checkCtx); - if (result instanceof Promise) { - throw new Error(`Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.`); + if (this.useTilemapCameraStrategy) { + let bounds = this.getLevelBounds(options === null || options === void 0 ? void 0 : options.levelFilter); + scene.camera.strategy.limitCameraBounds(bounds); + } + if (this.useMapBackgroundColor) { + for (let [id, level] of this.levels.entries()) { + if ((_b = options === null || options === void 0 ? void 0 : options.levelFilter) === null || _b === void 0 ? void 0 : _b.length) { + if (!options.levelFilter.includes(level.ldtkLevel.identifier)) { + continue; + } } - return { status: status.value, value: result }; - } - else { - return this._def.schema - ._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }) - .then((base) => { - if (!isValid(base)) - return base; - return Promise.resolve(effect.transform(base.value, checkCtx)).then((result) => ({ status: status.value, value: result })); - }); + scene.backgroundColor = level.backgroundColor; + break; } } - util.assertNever(effect); } } -ZodEffects.create = (schema, effect, params) => { - return new ZodEffects({ - schema, - typeName: ZodFirstPartyTypeKind.ZodEffects, - effect, - ...processCreateParams(params), - }); -}; -ZodEffects.createWithPreprocess = (preprocess, schema, params) => { - return new ZodEffects({ - schema, - effect: { type: "preprocess", transform: preprocess }, - typeName: ZodFirstPartyTypeKind.ZodEffects, - ...processCreateParams(params), - }); -}; -class ZodOptional extends ZodType { - _parse(input) { - const parsedType = this._getType(input); - if (parsedType === ZodParsedType.undefined) { - return OK(undefined); +LdtkResource.supportedLdtkVersion = "1.5.3"; + + +/***/ }), + +/***/ "./src/level-resource.ts": +/*!*******************************!*\ + !*** ./src/level-resource.ts ***! + \*******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ LevelResource: () => (/* binding */ LevelResource) +/* harmony export */ }); +/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); +/* harmony import */ var _loader_cache__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./loader-cache */ "./src/loader-cache.ts"); +/* harmony import */ var _file_loader__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./file-loader */ "./src/file-loader.ts"); +/* harmony import */ var _level__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./level */ "./src/level.ts"); +/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./types */ "./src/types.ts"); + + + + + +/** + * Loads LDtk levels that are stored in separate files + */ +class LevelResource { + constructor(path, resource, options) { + this.path = path; + this.resource = resource; + this.fileLoader = _file_loader__WEBPACK_IMPORTED_MODULE_2__.FetchLoader; + this.strict = true; + this.headless = false; + const { headless, strict, fileLoader, imageLoader, pathMap } = { ...options }; + this.fileLoader = fileLoader !== null && fileLoader !== void 0 ? fileLoader : this.fileLoader; + this.strict = strict !== null && strict !== void 0 ? strict : this.strict; + this.headless = headless !== null && headless !== void 0 ? headless : this.headless; + this.imageLoader = imageLoader !== null && imageLoader !== void 0 ? imageLoader : new _loader_cache__WEBPACK_IMPORTED_MODULE_1__.LoaderCache(excalibur__WEBPACK_IMPORTED_MODULE_0__.ImageSource); + this.pathMap = pathMap !== null && pathMap !== void 0 ? pathMap : this.pathMap; + } + async load() { + const data = await this.fileLoader(this.path, 'json'); + let level; + if (this.strict) { + try { + level = _types__WEBPACK_IMPORTED_MODULE_4__.LdtkLevel.parse(data); + } + catch (e) { + console.error(`Could not parse LDtk level data at ${this.path} are you sure a level is there and not corrupt?`); + throw e; + } } - return this._def.innerType._parse(input); + else { + level = data; + } + return this.data = new _level__WEBPACK_IMPORTED_MODULE_3__.Level(level, this.resource); } - unwrap() { - return this._def.innerType; + isLoaded() { + return !!this.data; } } -ZodOptional.create = (type, params) => { - return new ZodOptional({ - innerType: type, - typeName: ZodFirstPartyTypeKind.ZodOptional, - ...processCreateParams(params), - }); -}; -class ZodNullable extends ZodType { - _parse(input) { - const parsedType = this._getType(input); - if (parsedType === ZodParsedType.null) { - return OK(null); + + +/***/ }), + +/***/ "./src/level.ts": +/*!**********************!*\ + !*** ./src/level.ts ***! + \**********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ Level: () => (/* binding */ Level) +/* harmony export */ }); +/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); +/* harmony import */ var _entity_layer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./entity-layer */ "./src/entity-layer.ts"); +/* harmony import */ var _intgrid_layer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./intgrid-layer */ "./src/intgrid-layer.ts"); +/* harmony import */ var _tile_layer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tile-layer */ "./src/tile-layer.ts"); + + + + +class Level { + constructor(ldtkLevel, resource) { + var _a, _b, _c, _d; + this.ldtkLevel = ldtkLevel; + this.resource = resource; + this.layers = []; + if (ldtkLevel.__bgColor) { + this.backgroundColor = excalibur__WEBPACK_IMPORTED_MODULE_0__.Color.fromHex(ldtkLevel.__bgColor); + } + if (ldtkLevel.layerInstances) { + let order = resource.startZIndex; + let layers = ldtkLevel.layerInstances.slice().reverse(); + for (let layer of layers) { + if (((_a = layer.entityInstances) === null || _a === void 0 ? void 0 : _a.length) !== 0) { + this.layers.push(new _entity_layer__WEBPACK_IMPORTED_MODULE_1__.EntityLayer(this, layer, resource, order)); + } + if (((_b = layer.gridTiles) === null || _b === void 0 ? void 0 : _b.length) !== 0) { + this.layers.push(new _tile_layer__WEBPACK_IMPORTED_MODULE_3__.TileLayer(this, layer, resource, order)); + } + // Includes standard IntGrid, IntGrid w/ AutoTile & AutoTile layers + if (((_c = layer.intGridCsv) === null || _c === void 0 ? void 0 : _c.length) !== 0 || ((_d = layer.autoLayerTiles) === null || _d === void 0 ? void 0 : _d.length) !== 0) { + this.layers.push(new _intgrid_layer__WEBPACK_IMPORTED_MODULE_2__.IntGridLayer(this, layer, resource, order)); + } + order++; + } } - return this._def.innerType._parse(input); - } - unwrap() { - return this._def.innerType; } } -ZodNullable.create = (type, params) => { - return new ZodNullable({ - innerType: type, - typeName: ZodFirstPartyTypeKind.ZodNullable, - ...processCreateParams(params), - }); -}; -class ZodDefault extends ZodType { - _parse(input) { - const { ctx } = this._processInputParams(input); - let data = ctx.data; - if (ctx.parsedType === ZodParsedType.undefined) { - data = this._def.defaultValue(); + + +/***/ }), + +/***/ "./src/loader-cache.ts": +/*!*****************************!*\ + !*** ./src/loader-cache.ts ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ LoaderCache: () => (/* binding */ LoaderCache) +/* harmony export */ }); +/** + * Read through cache for loadables + */ +class LoaderCache { + constructor(type) { + this.type = type; + this._loaded = false; + this.cache = new Map(); + } + getOrAdd(...args) { + let resource = this.cache.get(args.join('+')); + if (resource) { + return resource; } - return this._def.innerType._parse({ - data, - path: ctx.path, - parent: ctx, - }); + resource = new this.type(...args); + this.cache.set(args.join('+'), resource); + return resource; } - removeDefault() { - return this._def.innerType; + values() { + if (this._loaded) { + return Array.from(this.cache.values()); + } + throw new Error(`Read through cache not yet loaded! No values to return!`); } -} -ZodDefault.create = (type, params) => { - return new ZodDefault({ - innerType: type, - typeName: ZodFirstPartyTypeKind.ZodDefault, - defaultValue: typeof params.default === "function" - ? params.default - : () => params.default, - ...processCreateParams(params), - }); -}; -class ZodCatch extends ZodType { - _parse(input) { - const { ctx } = this._processInputParams(input); - // newCtx is used to not collect issues from inner types in ctx - const newCtx = { - ...ctx, - common: { - ...ctx.common, - issues: [], - }, - }; - const result = this._def.innerType._parse({ - data: newCtx.data, - path: newCtx.path, - parent: { - ...newCtx, - }, - }); - if (isAsync(result)) { - return result.then((result) => { - return { - status: "valid", - value: result.status === "valid" - ? result.value - : this._def.catchValue({ - get error() { - return new ZodError(newCtx.common.issues); - }, - input: newCtx.data, - }), - }; - }); + async load() { + const resources = Array.from(this.cache.entries()); + const results = await Promise.allSettled(resources.map(i => i[1].load())); + // Check for errors loading resources + let errored = 0; + for (let i = 0; i < results.length; i++) { + const result = results[i]; + if (result.status === 'rejected') { + console.error(`Error loading resource at ${resources[i][0]}, is your pathMap correct? or your LDtk map corrupted?`, result.reason); + errored++; + } } - else { - return { - status: "valid", - value: result.status === "valid" - ? result.value - : this._def.catchValue({ - get error() { - return new ZodError(newCtx.common.issues); - }, - input: newCtx.data, - }), - }; + if (errored) { + throw new Error(`Error loading ${errored} resources`); } - } - removeCatch() { - return this._def.innerType; + this._loaded = true; } } -ZodCatch.create = (type, params) => { - return new ZodCatch({ - innerType: type, - typeName: ZodFirstPartyTypeKind.ZodCatch, - catchValue: typeof params.catch === "function" ? params.catch : () => params.catch, - ...processCreateParams(params), - }); -}; -class ZodNaN extends ZodType { - _parse(input) { - const parsedType = this._getType(input); - if (parsedType !== ZodParsedType.nan) { - const ctx = this._getOrReturnCtx(input); - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_type, - expected: ZodParsedType.nan, - received: ctx.parsedType, - }); - return INVALID; - } - return { status: "valid", value: input.data }; + + +/***/ }), + +/***/ "./src/path-util.ts": +/*!**************************!*\ + !*** ./src/path-util.ts ***! + \**************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ filenameFromPath: () => (/* binding */ filenameFromPath), +/* harmony export */ mapPath: () => (/* binding */ mapPath), +/* harmony export */ pathInMap: () => (/* binding */ pathInMap), +/* harmony export */ pathRelativeToBase: () => (/* binding */ pathRelativeToBase) +/* harmony export */ }); +function filenameFromPath(inputPath) { + const filenameExpression = /[^/\\&\?]+\.\w{2,4}(?=([\#\?&].*$|$))/ig; + const matches = inputPath.match(filenameExpression); + if (matches) { + const match = matches[0]; + return match; } + throw new Error(`Could not locate filename from path: ${inputPath}`); } -ZodNaN.create = (params) => { - return new ZodNaN({ - typeName: ZodFirstPartyTypeKind.ZodNaN, - ...processCreateParams(params), - }); -}; -const BRAND = Symbol("zod_brand"); -class ZodBranded extends ZodType { - _parse(input) { - const { ctx } = this._processInputParams(input); - const data = ctx.data; - return this._def.type._parse({ - data, - path: ctx.path, - parent: ctx, - }); - } - unwrap() { - return this._def.type; +function mapPath(inputPath, pathMap) { + for (const { path, output } of pathMap) { + if (typeof path === 'string') { + if (inputPath.includes(path)) { + return output; + } + } + else { + const match = inputPath.match(path); + if (match) { + return output.replace('[match]', match[0]); + // removed by dead control flow +{} + } + } } + return inputPath; } -class ZodPipeline extends ZodType { - _parse(input) { - const { status, ctx } = this._processInputParams(input); - if (ctx.common.async) { - const handleAsync = async () => { - const inResult = await this._def.in._parseAsync({ - data: ctx.data, - path: ctx.path, - parent: ctx, - }); - if (inResult.status === "aborted") - return INVALID; - if (inResult.status === "dirty") { - status.dirty(); - return DIRTY(inResult.value); - } - else { - return this._def.out._parseAsync({ - data: inResult.value, - path: ctx.path, - parent: ctx, - }); - } - }; - return handleAsync(); +function pathInMap(inputPath, pathMap) { + if (!pathMap) + return false; + for (const { path, output } of pathMap) { + if (typeof path === 'string') { + if (inputPath.includes(path)) { + return true; + } } else { - const inResult = this._def.in._parseSync({ - data: ctx.data, - path: ctx.path, - parent: ctx, - }); - if (inResult.status === "aborted") - return INVALID; - if (inResult.status === "dirty") { - status.dirty(); - return { - status: "dirty", - value: inResult.value, - }; - } - else { - return this._def.out._parseSync({ - data: inResult.value, - path: ctx.path, - parent: ctx, - }); + const match = inputPath.match(path); + if (match) { + return true; } } } - static create(a, b) { - return new ZodPipeline({ - in: a, - out: b, - typeName: ZodFirstPartyTypeKind.ZodPipeline, - }); - } + return false; } -class ZodReadonly extends ZodType { - _parse(input) { - const result = this._def.innerType._parse(input); - const freeze = (data) => { - if (isValid(data)) { - data.value = Object.freeze(data.value); - } - return data; - }; - return isAsync(result) - ? result.then((data) => freeze(data)) - : freeze(result); +function pathRelativeToBase(basePath, relativeToBase, pathMap) { + if (pathInMap(relativeToBase, pathMap) && pathMap) { + return mapPath(relativeToBase, pathMap); } - unwrap() { - return this._def.innerType; + // Use absolute path if specified + if (relativeToBase.indexOf('/') === 0) { + return relativeToBase; + } + const originSplit = basePath.split('/'); + const relativeSplit = relativeToBase.split('/'); + // if origin path is a file, remove it so it's a directory + if (originSplit[originSplit.length - 1].includes('.')) { + originSplit.pop(); + } + return originSplit.concat(relativeSplit).join('/'); +} + + +/***/ }), + +/***/ "./src/tile-layer.ts": +/*!***************************!*\ + !*** ./src/tile-layer.ts ***! + \***************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ TileLayer: () => (/* binding */ TileLayer) +/* harmony export */ }); +/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); + +class TileLayer { + constructor(level, ldtkLayer, resource, order) { + var _a, _b, _c, _d; + this.order = order; + this.worldPos = (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(level.ldtkLevel.worldX, level.ldtkLevel.worldY); + this.offset = (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(ldtkLayer.__pxTotalOffsetX, ldtkLayer.__pxTotalOffsetY); + this.ldtkLayer = ldtkLayer; + this.tilemap = new excalibur__WEBPACK_IMPORTED_MODULE_0__.TileMap({ + name: ldtkLayer.__identifier, + pos: this.worldPos.add(this.offset), + tileWidth: ldtkLayer.__gridSize, + tileHeight: ldtkLayer.__gridSize, + rows: ldtkLayer.__cHei, + columns: ldtkLayer.__cWid, + }); + this.tilemap.z = order; + const graphics = this.tilemap.get(excalibur__WEBPACK_IMPORTED_MODULE_0__.GraphicsComponent); + graphics.isVisible = ldtkLayer.visible; + if (ldtkLayer.__tilesetDefUid) { + this.tileset = resource.tilesets.get(ldtkLayer.__tilesetDefUid); + for (let tile of ldtkLayer.gridTiles) { + const xCoord = Math.floor(tile.px[0] / ldtkLayer.__gridSize); + const yCoord = Math.floor(tile.px[1] / ldtkLayer.__gridSize); + const exTile = this.tilemap.getTile(xCoord, yCoord); + if (this.tileset) { + const tsxCoord = Math.floor((tile.src[0] - ((_a = this.tileset.ldtkTileset.padding) !== null && _a !== void 0 ? _a : 0)) / (this.tileset.ldtkTileset.tileGridSize + ((_b = this.tileset.ldtkTileset.spacing) !== null && _b !== void 0 ? _b : 0))); + const tsyCoord = Math.floor((tile.src[1] - ((_c = this.tileset.ldtkTileset.padding) !== null && _c !== void 0 ? _c : 0)) / (this.tileset.ldtkTileset.tileGridSize + ((_d = this.tileset.ldtkTileset.spacing) !== null && _d !== void 0 ? _d : 0))); + // Bit 0 toggles x flip + // Bit 1 toggles 1 flip + // Examples: f=0 (no flip), f=1 (X flip only), f=2 (Y flip only), f=3 (both flips) + const flipHorizontal = !!(tile.f & 0b01); + const flipVertical = !!(tile.f & 0b10); + let sprite = this.tileset.spritesheet.getSprite(tsxCoord, tsyCoord); + if (flipHorizontal || flipVertical) { + sprite = sprite.clone(); + sprite.flipHorizontal = flipHorizontal; + sprite.flipVertical = flipVertical; + } + if (sprite) { + exTile.addGraphic(sprite); + } + else { + console.error('Could not find sprite in LDtk spritesheet at', tsxCoord, tsyCoord); + } + } + } + } + else { + console.error('Could not tileset in LDtk', ldtkLayer.__tilesetDefUid, ldtkLayer.__tilesetRelPath); + } } } -ZodReadonly.create = (type, params) => { - return new ZodReadonly({ - innerType: type, - typeName: ZodFirstPartyTypeKind.ZodReadonly, - ...processCreateParams(params), - }); -}; -function custom(check, params = {}, -/** - * @deprecated - * - * Pass `fatal` into the params object instead: - * - * ```ts - * z.string().custom((val) => val.length > 5, { fatal: false }) - * ``` - * - */ -fatal) { - if (check) - return ZodAny.create().superRefine((data, ctx) => { - var _a, _b; - if (!check(data)) { - const p = typeof params === "function" - ? params(data) - : typeof params === "string" - ? { message: params } - : params; - const _fatal = (_b = (_a = p.fatal) !== null && _a !== void 0 ? _a : fatal) !== null && _b !== void 0 ? _b : true; - const p2 = typeof p === "string" ? { message: p } : p; - ctx.addIssue({ code: "custom", ...p2, fatal: _fatal }); + + +/***/ }), + +/***/ "./src/tileset.ts": +/*!************************!*\ + !*** ./src/tileset.ts ***! + \************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ Tileset: () => (/* binding */ Tileset) +/* harmony export */ }); +/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); + +class Tileset { + constructor(options) { + var _a, _b, _c, _d; + const { image, ldtkTileset } = options; + this.image = image; + this.ldtkTileset = ldtkTileset; + this.spritesheet = excalibur__WEBPACK_IMPORTED_MODULE_0__.SpriteSheet.fromImageSource({ + image, + grid: { + rows: ldtkTileset.pxHei / ldtkTileset.tileGridSize, + columns: ldtkTileset.pxWid / ldtkTileset.tileGridSize, + spriteHeight: ldtkTileset.tileGridSize, + spriteWidth: ldtkTileset.tileGridSize + }, + spacing: { + margin: { + x: (_a = ldtkTileset.spacing) !== null && _a !== void 0 ? _a : 0, + y: (_b = ldtkTileset.spacing) !== null && _b !== void 0 ? _b : 0, + }, + originOffset: { + x: (_c = ldtkTileset.padding) !== null && _c !== void 0 ? _c : 0, + y: (_d = ldtkTileset.padding) !== null && _d !== void 0 ? _d : 0 + } } }); - return ZodAny.create(); + } } -const late = { - object: ZodObject.lazycreate, -}; -var ZodFirstPartyTypeKind; -(function (ZodFirstPartyTypeKind) { - ZodFirstPartyTypeKind["ZodString"] = "ZodString"; - ZodFirstPartyTypeKind["ZodNumber"] = "ZodNumber"; - ZodFirstPartyTypeKind["ZodNaN"] = "ZodNaN"; - ZodFirstPartyTypeKind["ZodBigInt"] = "ZodBigInt"; - ZodFirstPartyTypeKind["ZodBoolean"] = "ZodBoolean"; - ZodFirstPartyTypeKind["ZodDate"] = "ZodDate"; - ZodFirstPartyTypeKind["ZodSymbol"] = "ZodSymbol"; - ZodFirstPartyTypeKind["ZodUndefined"] = "ZodUndefined"; - ZodFirstPartyTypeKind["ZodNull"] = "ZodNull"; - ZodFirstPartyTypeKind["ZodAny"] = "ZodAny"; - ZodFirstPartyTypeKind["ZodUnknown"] = "ZodUnknown"; - ZodFirstPartyTypeKind["ZodNever"] = "ZodNever"; - ZodFirstPartyTypeKind["ZodVoid"] = "ZodVoid"; - ZodFirstPartyTypeKind["ZodArray"] = "ZodArray"; - ZodFirstPartyTypeKind["ZodObject"] = "ZodObject"; - ZodFirstPartyTypeKind["ZodUnion"] = "ZodUnion"; - ZodFirstPartyTypeKind["ZodDiscriminatedUnion"] = "ZodDiscriminatedUnion"; - ZodFirstPartyTypeKind["ZodIntersection"] = "ZodIntersection"; - ZodFirstPartyTypeKind["ZodTuple"] = "ZodTuple"; - ZodFirstPartyTypeKind["ZodRecord"] = "ZodRecord"; - ZodFirstPartyTypeKind["ZodMap"] = "ZodMap"; - ZodFirstPartyTypeKind["ZodSet"] = "ZodSet"; - ZodFirstPartyTypeKind["ZodFunction"] = "ZodFunction"; - ZodFirstPartyTypeKind["ZodLazy"] = "ZodLazy"; - ZodFirstPartyTypeKind["ZodLiteral"] = "ZodLiteral"; - ZodFirstPartyTypeKind["ZodEnum"] = "ZodEnum"; - ZodFirstPartyTypeKind["ZodEffects"] = "ZodEffects"; - ZodFirstPartyTypeKind["ZodNativeEnum"] = "ZodNativeEnum"; - ZodFirstPartyTypeKind["ZodOptional"] = "ZodOptional"; - ZodFirstPartyTypeKind["ZodNullable"] = "ZodNullable"; - ZodFirstPartyTypeKind["ZodDefault"] = "ZodDefault"; - ZodFirstPartyTypeKind["ZodCatch"] = "ZodCatch"; - ZodFirstPartyTypeKind["ZodPromise"] = "ZodPromise"; - ZodFirstPartyTypeKind["ZodBranded"] = "ZodBranded"; - ZodFirstPartyTypeKind["ZodPipeline"] = "ZodPipeline"; - ZodFirstPartyTypeKind["ZodReadonly"] = "ZodReadonly"; -})(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {})); -const instanceOfType = ( -// const instanceOfType = any>( -cls, params = { - message: `Input not instance of ${cls.name}`, -}) => custom((data) => data instanceof cls, params); -const stringType = ZodString.create; -const numberType = ZodNumber.create; -const nanType = ZodNaN.create; -const bigIntType = ZodBigInt.create; -const booleanType = ZodBoolean.create; -const dateType = ZodDate.create; -const symbolType = ZodSymbol.create; -const undefinedType = ZodUndefined.create; -const nullType = ZodNull.create; -const anyType = ZodAny.create; -const unknownType = ZodUnknown.create; -const neverType = ZodNever.create; -const voidType = ZodVoid.create; -const arrayType = ZodArray.create; -const objectType = ZodObject.create; -const strictObjectType = ZodObject.strictCreate; -const unionType = ZodUnion.create; -const discriminatedUnionType = ZodDiscriminatedUnion.create; -const intersectionType = ZodIntersection.create; -const tupleType = ZodTuple.create; -const recordType = ZodRecord.create; -const mapType = ZodMap.create; -const setType = ZodSet.create; -const functionType = ZodFunction.create; -const lazyType = ZodLazy.create; -const literalType = ZodLiteral.create; -const enumType = ZodEnum.create; -const nativeEnumType = ZodNativeEnum.create; -const promiseType = ZodPromise.create; -const effectsType = ZodEffects.create; -const optionalType = ZodOptional.create; -const nullableType = ZodNullable.create; -const preprocessType = ZodEffects.createWithPreprocess; -const pipelineType = ZodPipeline.create; -const ostring = () => stringType().optional(); -const onumber = () => numberType().optional(); -const oboolean = () => booleanType().optional(); -const coerce = { - string: ((arg) => ZodString.create({ ...arg, coerce: true })), - number: ((arg) => ZodNumber.create({ ...arg, coerce: true })), - boolean: ((arg) => ZodBoolean.create({ - ...arg, - coerce: true, - })), - bigint: ((arg) => ZodBigInt.create({ ...arg, coerce: true })), - date: ((arg) => ZodDate.create({ ...arg, coerce: true })), -}; -const NEVER = INVALID; -var z = /*#__PURE__*/Object.freeze({ - __proto__: null, - defaultErrorMap: errorMap, - setErrorMap: setErrorMap, - getErrorMap: getErrorMap, - makeIssue: makeIssue, - EMPTY_PATH: EMPTY_PATH, - addIssueToContext: addIssueToContext, - ParseStatus: ParseStatus, - INVALID: INVALID, - DIRTY: DIRTY, - OK: OK, - isAborted: isAborted, - isDirty: isDirty, - isValid: isValid, - isAsync: isAsync, - get util () { return util; }, - get objectUtil () { return objectUtil; }, - ZodParsedType: ZodParsedType, - getParsedType: getParsedType, - ZodType: ZodType, - datetimeRegex: datetimeRegex, - ZodString: ZodString, - ZodNumber: ZodNumber, - ZodBigInt: ZodBigInt, - ZodBoolean: ZodBoolean, - ZodDate: ZodDate, - ZodSymbol: ZodSymbol, - ZodUndefined: ZodUndefined, - ZodNull: ZodNull, - ZodAny: ZodAny, - ZodUnknown: ZodUnknown, - ZodNever: ZodNever, - ZodVoid: ZodVoid, - ZodArray: ZodArray, - ZodObject: ZodObject, - ZodUnion: ZodUnion, - ZodDiscriminatedUnion: ZodDiscriminatedUnion, - ZodIntersection: ZodIntersection, - ZodTuple: ZodTuple, - ZodRecord: ZodRecord, - ZodMap: ZodMap, - ZodSet: ZodSet, - ZodFunction: ZodFunction, - ZodLazy: ZodLazy, - ZodLiteral: ZodLiteral, - ZodEnum: ZodEnum, - ZodNativeEnum: ZodNativeEnum, - ZodPromise: ZodPromise, - ZodEffects: ZodEffects, - ZodTransformer: ZodEffects, - ZodOptional: ZodOptional, - ZodNullable: ZodNullable, - ZodDefault: ZodDefault, - ZodCatch: ZodCatch, - ZodNaN: ZodNaN, - BRAND: BRAND, - ZodBranded: ZodBranded, - ZodPipeline: ZodPipeline, - ZodReadonly: ZodReadonly, - custom: custom, - Schema: ZodType, - ZodSchema: ZodType, - late: late, - get ZodFirstPartyTypeKind () { return ZodFirstPartyTypeKind; }, - coerce: coerce, - any: anyType, - array: arrayType, - bigint: bigIntType, - boolean: booleanType, - date: dateType, - discriminatedUnion: discriminatedUnionType, - effect: effectsType, - 'enum': enumType, - 'function': functionType, - 'instanceof': instanceOfType, - intersection: intersectionType, - lazy: lazyType, - literal: literalType, - map: mapType, - nan: nanType, - nativeEnum: nativeEnumType, - never: neverType, - 'null': nullType, - nullable: nullableType, - number: numberType, - object: objectType, - oboolean: oboolean, - onumber: onumber, - optional: optionalType, - ostring: ostring, - pipeline: pipelineType, - preprocess: preprocessType, - promise: promiseType, - record: recordType, - set: setType, - strictObject: strictObjectType, - string: stringType, - symbol: symbolType, - transformer: effectsType, - tuple: tupleType, - 'undefined': undefinedType, - union: unionType, - unknown: unknownType, - 'void': voidType, - NEVER: NEVER, - ZodIssueCode: ZodIssueCode, - quotelessJson: quotelessJson, - ZodError: ZodError -}); +/***/ }), + +/***/ "./src/types.ts": +/*!**********************!*\ + !*** ./src/types.ts ***! + \**********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ LdtkEntityDefinition: () => (/* binding */ LdtkEntityDefinition), +/* harmony export */ LdtkEntityInstance: () => (/* binding */ LdtkEntityInstance), +/* harmony export */ LdtkLayerDefinition: () => (/* binding */ LdtkLayerDefinition), +/* harmony export */ LdtkLayerInstance: () => (/* binding */ LdtkLayerInstance), +/* harmony export */ LdtkLevel: () => (/* binding */ LdtkLevel), +/* harmony export */ LdtkProjectMetadata: () => (/* binding */ LdtkProjectMetadata) +/* harmony export */ }); +/* harmony import */ var zod__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! zod */ "./node_modules/zod/lib/index.mjs"); +const LdtkTilesetRectangle = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + h: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + tilesetUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + w: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + x: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + y: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() +}); +const LdtkPixel = zod__WEBPACK_IMPORTED_MODULE_0__.z.tuple([zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), zod__WEBPACK_IMPORTED_MODULE_0__.z.number()]); +const LdtkFieldInstance = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + __identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + __tile: LdtkTilesetRectangle.nullable(), + __type: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), //z.union([z.literal('Int'), z.literal('Float'), z.literal('String'), z.literal('Bool'), z.literal('Enum')]), // TODO this might not work with ENUM + __value: zod__WEBPACK_IMPORTED_MODULE_0__.z.any(), + defUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() +}); +const LdtkTileInstance = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + a: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + f: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), // 2-bit int 0bXY flip + px: LdtkPixel, + src: LdtkPixel, + t: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() +}); +const LdtkEntityInstance = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + __grid: LdtkPixel, + __identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + __pivot: LdtkPixel, + __smartColor: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + __tags: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.string()), + __tile: LdtkTilesetRectangle.nullable(), + __worldX: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), + __worldY: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), + defUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + fieldInstances: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkFieldInstance), + height: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + iid: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + px: LdtkPixel, + width: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() +}); +const LdtkLayerInstance = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + __cHei: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + __cWid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + __gridSize: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + __identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + __opacity: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + __pxTotalOffsetX: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + __pxTotalOffsetY: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + __tilesetDefUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), + __tilesetRelPath: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), + __type: zod__WEBPACK_IMPORTED_MODULE_0__.z.union([zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('IntGrid'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('Entities'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('Tiles'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('AutoLayer')]), + autoLayerTiles: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkTileInstance), // only in auto layers + entityInstances: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkEntityInstance), // only in entity layers + gridTiles: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkTileInstance), + iid: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + intGridCsv: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.number()), // __cWid x __cHei, 0 means empty, values start at 1 + layerDefUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + levelId: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + overrideTilesetUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), + pxOffsetX: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + pxOffsetY: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + visible: zod__WEBPACK_IMPORTED_MODULE_0__.z.boolean() +}); +const LdtkLevel = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + __bgColor: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), + bgColor: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), + __bgPos: zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + cropRect: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.tuple([zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), zod__WEBPACK_IMPORTED_MODULE_0__.z.number()])), // cropX, cropY, cropWidth, cropHeight + scale: zod__WEBPACK_IMPORTED_MODULE_0__.z.tuple([zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), zod__WEBPACK_IMPORTED_MODULE_0__.z.number()]), + topLeftPx: LdtkPixel + }).nullable(), + __neighbours: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + dir: zod__WEBPACK_IMPORTED_MODULE_0__.z.union([zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('n'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('s'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('w'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('e'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('ne'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('nw'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('se'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('sw'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('o'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('<'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('>')]), + levelIid: zod__WEBPACK_IMPORTED_MODULE_0__.z.string() + })), + bgRelPath: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), + externalRelPath: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), + fieldInstances: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkFieldInstance), + identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + iid: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + layerInstances: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkLayerInstance).nullable(), // null if the save levels separately is enabled + pxHei: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + pxWid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + uid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + worldDepth: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + worldX: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + worldY: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() +}); +const LdtkWorld = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + iid: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + levels: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkLevel), + worldGridHeight: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + worldGridWidth: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + // TODO is this a typo Vania? + worldLayout: zod__WEBPACK_IMPORTED_MODULE_0__.z.union([zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('Free'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('GridVania'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('LinearHorizontal'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('LinearVertical')]), +}); +const LdtkEnumValueDefinition = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + color: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + id: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + tileRect: LdtkTilesetRectangle.nullable() +}); +const LdtkEnumDefinition = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + externalRelPath: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), + iconTilesetUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), + identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + tags: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.string()), + uid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + values: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkEnumValueDefinition) +}); +const LdtkTilesetDefinition = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + __cHei: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + __cWid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + customData: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + data: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + tileId: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() + })), + embedAtlas: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), + enumTags: zod__WEBPACK_IMPORTED_MODULE_0__.z.optional(zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + enumValueId: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + tileIds: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.number()) + }))), + identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + padding: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + pxHei: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + pxWid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + relPath: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), + spacing: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + tags: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.string()), + tagsSourceEnumUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), + tileGridSize: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + uid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() +}); +const LdtkLayerDefinition = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + __type: zod__WEBPACK_IMPORTED_MODULE_0__.z.union([zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("IntGrid"), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("Entities"), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("Tiles"), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("AutoLayer")]), + autoSourceLayerDefUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), + displayOpacity: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + gridSize: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + intGridValues: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + color: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + groupUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), + tile: LdtkTilesetRectangle.nullable(), + value: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() + })), + intGridValuesGroups: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + color: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), + identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), + uid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() + })), + parallaxFactorX: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + parallaxFactorY: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + parallaxScaling: zod__WEBPACK_IMPORTED_MODULE_0__.z.boolean(), + pxOffsetX: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + pxOffsetY: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + tilesetDefUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), + uid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), +}); +const LdtkEntityDefinition = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + color: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + height: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + nineSliceBorders: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.number()), + pivotX: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + pivotY: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + tileRect: LdtkTilesetRectangle.nullable(), + tileRenderMode: zod__WEBPACK_IMPORTED_MODULE_0__.z.union([ + zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("Cover"), + zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("FitInside"), + zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("Repeat"), + zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("Stretch"), + zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("FullSizeCropped"), + zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("FullSizeUncropped"), + zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("NineSlice") + ]), + tilesetId: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), + uiTileRect: LdtkTilesetRectangle.nullable(), + uid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + width: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() +}); +const LdtkDefinitions = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + tilesets: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkTilesetDefinition), + enums: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkEnumDefinition), + layers: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkLayerDefinition), + entities: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkEntityDefinition) +}); +const LdtkProjectMetadata = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + iid: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + bgColor: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), + defs: LdtkDefinitions, + externalLevels: zod__WEBPACK_IMPORTED_MODULE_0__.z.boolean(), + jsonVersion: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + levels: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkLevel), + toc: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + instancesData: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + fields: zod__WEBPACK_IMPORTED_MODULE_0__.z.any(), + heiPx: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + iids: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + widPix: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + worldX: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + worldY: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() + })) + })), + // Moving to worlds array + worldGridHeight: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), + worldGridWidth: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), + // TODO is this a LDtk docs typo Vania? + worldLayout: zod__WEBPACK_IMPORTED_MODULE_0__.z.union([zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('Free'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('GridVania'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('LinearHorizontal'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('LinearVertical')]).nullable(), + worlds: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkWorld) +}); /***/ }) @@ -48306,12 +48313,12 @@ var __webpack_exports__ = {}; !*** ./sample/autotile.ts ***! \****************************/ __webpack_require__.r(__webpack_exports__); -/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); -/* harmony import */ var _resources__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./resources */ "./sample/resources.ts"); +/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); +/* harmony import */ var _resources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./resources */ "./sample/resources.ts"); -excalibur__WEBPACK_IMPORTED_MODULE_1__.Flags.useLegacyImageRenderer(); -const game = new excalibur__WEBPACK_IMPORTED_MODULE_1__.Engine({ +excalibur__WEBPACK_IMPORTED_MODULE_0__.Flags.useLegacyImageRenderer(); +const game = new excalibur__WEBPACK_IMPORTED_MODULE_0__.Engine({ resolution: { width: 256, height: 256, @@ -48319,12 +48326,12 @@ const game = new excalibur__WEBPACK_IMPORTED_MODULE_1__.Engine({ suppressPlayButton: false, pixelArt: true, pixelRatio: 4, - displayMode: excalibur__WEBPACK_IMPORTED_MODULE_1__.DisplayMode.FitScreen, + displayMode: excalibur__WEBPACK_IMPORTED_MODULE_0__.DisplayMode.FitScreen, }); -game.start(_resources__WEBPACK_IMPORTED_MODULE_0__.loader).then(() => { +game.start(_resources__WEBPACK_IMPORTED_MODULE_1__.loader).then(() => { console.log('Game start!'); - _resources__WEBPACK_IMPORTED_MODULE_0__.Resources.LdtkAutoTile.addToScene(game.currentScene, { - pos: excalibur__WEBPACK_IMPORTED_MODULE_1__.vec(0, 0) + _resources__WEBPACK_IMPORTED_MODULE_1__.Resources.LdtkAutoTile.addToScene(game.currentScene, { + pos: excalibur__WEBPACK_IMPORTED_MODULE_0__.vec(0, 0) }); }); diff --git a/sample/autotile/autotile.js.map b/sample/autotile/autotile.js.map index ee39058..8bdecd7 100644 --- a/sample/autotile/autotile.js.map +++ b/sample/autotile/autotile.js.map @@ -1 +1 @@ -{"version":3,"file":"autotile/autotile.js","mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD,O;;;;;;;;;;;;;;;ACVuD;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC,qCAAqC;AACrC,qCAAqC;AACrC,sCAAsC;AACtC,sCAAsC;AACtC;AACA;AACO;AACP;AACA;AACA;AACA;AACA,gBAAgB,oEAAe;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,UAAU;AACxF;AACA;AACA,6DAA6D,2BAA2B;AACxF;AACA;AACA;;;;;;;;;;;;;;;AC3C+D;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA,eAAe,2DAAgB;AAC/B,eAAe,2DAAgB;AAC/B;AACA;AACA;AACA;AACA,cAAc,0DAAe;AAC7B;AACA;AACA;AACA;AACA,eAAe,0DAAe;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;AC5BO;AACA;AACP;AACA;AACA;AACA;AACA;AACA,+DAA+D,QAAQ;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP,oBAAoB,kCAAkC;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB,0BAAmB,EAAE,8BAAmB;;AAExD,8BAAmB,GAAG,0BAAmB;AACzC,qBAAqB,8BAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,4GAA4G,8BAAmB;AAC/H,iIAAiI,8BAAmB;AACpJ,qGAAqG,8BAAmB;AACxH,0HAA0H,8BAAmB;AAC7I;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD,iDAAiD;AACjD,gDAAgD;AAChD,+CAA+C;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,8FAA8F,MAAM,YAAY,aAAa,WAAW,YAAY,WAAW,MAAM,OAAO,aAAa,WAAW,YAAY,aAAa,WAAW,YAAY,WAAW,YAAY,WAAW,UAAU,YAAY,OAAO,OAAO,aAAa,cAAc,yBAAyB,yBAAyB,yBAAyB,yBAAyB,aAAa,OAAO,OAAO,MAAM,KAAK,YAAY,WAAW,YAAY,aAAa,WAAW,UAAU,UAAU,UAAU,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,UAAU,YAAY,WAAW,UAAU,MAAM,MAAM,YAAY,OAAO,KAAK,YAAY,aAAa,OAAO,KAAK,YAAY,OAAO,KAAK,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,MAAM,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,MAAM,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,MAAM,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,MAAM,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,kFAAkF,4BAA4B,yBAAyB,mBAAmB,yBAAyB,mBAAmB,0BAA0B,4BAA4B,kCAAkC,uCAAuC,gBAAgB,4BAA4B,0BAA0B,qBAAqB,8BAA8B,sBAAsB,0BAA0B,qBAAqB,sBAAsB,yBAAyB,mFAAmF,+BAA+B,4BAA4B,4DAA4D,0FAA0F,sEAAsE,0EAA0E,iEAAiE,KAAK,qCAAqC,oBAAoB,KAAK,uCAAuC,yBAAyB,kBAAkB,wBAAwB,8DAA8D,iBAAiB,gBAAgB,eAAe,gBAAgB,KAAK,sCAAsC,yBAAyB,kBAAkB,wBAAwB,iBAAiB,gBAAgB,0BAA0B,kBAAkB,mBAAmB,KAAK,qEAAqE,0BAA0B,KAAK,qCAAqC,8BAA8B,2BAA2B,KAAK,sCAAsC,6BAA6B,KAAK,4CAA4C,YAAY,mBAAmB,OAAO,UAAU,mBAAmB,OAAO,KAAK,uEAAuE,YAAY,mBAAmB,OAAO,UAAU,mBAAmB,OAAO,KAAK,6FAA6F,YAAY,mBAAmB,OAAO,UAAU,mBAAmB,OAAO,KAAK,2EAA2E,YAAY,mBAAmB,OAAO,UAAU,mBAAmB,OAAO,KAAK,qEAAqE,YAAY,mBAAmB,OAAO,UAAU,mBAAmB,OAAO,KAAK,uBAAuB;AAClmH;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,gBAAgB,0BAAmB,EAAE,+BAAmB;;AAExD,+BAAmB,GAAG,0BAAmB;AACzC,qBAAqB,+BAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,4GAA4G,+BAAmB;AAC/H,iIAAiI,+BAAmB;AACpJ,qGAAqG,+BAAmB;AACxH,0HAA0H,+BAAmB;AAC7I;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,mFAAmF,YAAY,WAAW,UAAU,UAAU,UAAU,MAAM,KAAK,UAAU,YAAY,WAAW,aAAa,WAAW,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,OAAO,KAAK,YAAY,+CAA+C,yBAAyB,gBAAgB,qBAAqB,gBAAgB,aAAa,KAAK,2BAA2B,iBAAiB,yBAAyB,oBAAoB,qCAAqC,wBAAwB,sBAAsB,sBAAsB,8BAA8B,yBAAyB,gCAAgC,2CAA2C,KAAK,kCAAkC,6BAA6B,KAAK,uBAAuB;AACr2B;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA,gDAAgD;AAChD;AACA;AACA,qFAAqF;AACrF;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,qBAAqB;AACrB;AACA;AACA,qBAAqB;AACrB;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,iBAAiB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,qBAAqB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,sFAAsF,qBAAqB;AAC3G;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,iDAAiD,qBAAqB;AACtE;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,sDAAsD,qBAAqB;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAO;;AAEP;AACA;AACA;AACA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,cAAc;AACrE;AACA;AACA;AACA;AACA;;AAEA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,2GAA2G,oCAAoC,mEAAmE,8DAA8D,uEAAuE,yCAAyC,2BAA2B,qBAAqB,wEAAwE,+BAA+B,uCAAuC,mHAAmH,oCAAoC,wEAAwE,iDAAiD,kHAAkH,4JAA4J,yCAAyC,uCAAuC,2CAA2C,2BAA2B,wEAAwE,kDAAkD,8CAA8C,6BAA6B,KAAK;;AAE57C,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,wGAAwG,yCAAyC,kBAAkB,0CAA0C,wBAAwB,wBAAwB,qBAAqB,8BAA8B,2BAA2B,mCAAmC,gCAAgC,8BAA8B,yBAAyB,6HAA6H,uDAAuD,sFAAsF,gFAAgF,mGAAmG,+GAA+G,KAAK;;AAEt/B,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6GAA6G,0CAA0C,mFAAmF,gCAAgC,iCAAiC,2BAA2B,uBAAuB,+CAA+C,yBAAyB,qBAAqB,2BAA2B,mJAAmJ,qCAAqC,oCAAoC,8BAA8B,iDAAiD,oCAAoC,KAAK,oDAAoD,8CAA8C,KAAK,yDAAyD,0CAA0C,KAAK,iGAAiG,mDAAmD,6CAA6C,KAAK,oBAAoB,+PAA+P,sJAAsJ,wDAAwD,wDAAwD,wEAAwE,oCAAoC,iCAAiC,KAAK;;AAEz2D,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,oHAAoH,0CAA0C,wBAAwB,4CAA4C,6CAA6C,6CAA6C,6CAA6C,8CAA8C,wBAAwB,+FAA+F,mBAAmB,sEAAsE,yDAAyD,mCAAmC,6CAA6C,sBAAsB,6CAA6C,sBAAsB,2CAA2C,oBAAoB,8BAA8B,oBAAoB,uOAAuO,+DAA+D,2EAA2E,gCAAgC,8BAA8B,0BAA0B,0BAA0B,oBAAoB,wCAAwC,sBAAsB,KAAK;;AAEp/C,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6GAA6G,0CAA0C,yDAAyD,mFAAmF,gCAAgC,yCAAyC,uBAAuB,sBAAsB,2BAA2B,mJAAmJ,qCAAqC,sCAAsC,8BAA8B,iDAAiD,sCAAsC,KAAK,oBAAoB,iQAAiQ,uJAAuJ,gCAAgC,6BAA6B,KAAK;;AAE1vC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,wGAAwG,yCAAyC,wBAAwB,+CAA+C,wBAAwB,wCAAwC,mBAAmB,0DAA0D,kCAAkC,uBAAuB,oBAAoB,8BAA8B,oBAAoB,mHAAmH,wFAAwF,qFAAqF,wBAAwB,uGAAuG,kDAAkD,KAAK;;AAE17B,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6GAA6G,yCAAyC,2BAA2B,qBAAqB,0BAA0B,KAAK;;AAErO,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,wGAAwG,oBAAoB,8BAA8B,8BAA8B,qBAAqB,6HAA6H,4DAA4D,KAAK;;AAE3Y,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6GAA6G,kCAAkC,4BAA4B,4BAA4B,gCAAgC,0BAA0B,sBAAsB,+BAA+B,+BAA+B,yBAAyB,uBAAuB,oBAAoB,kDAAkD,2BAA2B,8DAA8D,uBAAuB,0CAA0C,wCAAwC,yMAAyM,+CAA+C,mDAAmD,QAAQ,MAAM,6DAA6D,+CAA+C,sCAAsC,yCAAyC,6DAA6D,sEAAsE,8BAA8B,qEAAqE,kDAAkD,qCAAqC,OAAO,KAAK;;AAE18C,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6GAA6G,8BAA8B,4BAA4B,yBAAyB,uBAAuB,6BAA6B,0BAA0B,6BAA6B,4BAA4B,0BAA0B,kCAAkC,2CAA2C,uCAAuC,wCAAwC,+CAA+C,sCAAsC,uGAAuG,2BAA2B,4BAA4B,mCAAmC,0BAA0B,gBAAgB,8DAA8D,6NAA6N,wDAAwD,4FAA4F,2DAA2D,6CAA6C,2DAA2D,oGAAoG,wDAAwD,iDAAiD,4GAA4G,yEAAyE,+FAA+F,UAAU,sDAAsD,oFAAoF,wGAAwG,iEAAiE,qGAAqG,KAAK;;AAEvxE,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iHAAiH,yBAAyB,2BAA2B,qBAAqB,8CAA8C,2CAA2C,wBAAwB,4BAA4B,4DAA4D,sEAAsE,gCAAgC,sCAAsC,wBAAwB,KAAK;;AAE5iB,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,wGAAwG,oBAAoB,oBAAoB,0BAA0B,0BAA0B,qBAAqB,0DAA0D,kCAAkC,wBAAwB,KAAK;;AAElV,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iHAAiH,oCAAoC,wBAAwB,+EAA+E,8DAA8D,wEAAwE,qDAAqD,2BAA2B,qBAAqB,wIAAwI,qCAAqC,kDAAkD,uCAAuC,kDAAkD,uCAAuC,kHAAkH,8BAA8B,UAAU,MAAM,oCAAoC,SAAS,iCAAiC,qCAAqC,yEAAyE,0EAA0E,gDAAgD,4CAA4C,0JAA0J,4EAA4E,8DAA8D,YAAY,gKAAgK,4EAA4E,8DAA8D,YAAY,2BAA2B,yMAAyM,4EAA4E,2NAA2N,+FAA+F,0FAA0F,YAAY,gDAAgD,4CAA4C,yCAAyC,yEAAyE,mCAAmC,4CAA4C,YAAY,0EAA0E,qEAAqE,qCAAqC,KAAK;;AAEhmG,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,wGAAwG,yCAAyC,kBAAkB,uBAAuB,oBAAoB,0CAA0C,wBAAwB,wBAAwB,qBAAqB,8BAA8B,2BAA2B,mCAAmC,gCAAgC,8BAA8B,yBAAyB,6HAA6H,uDAAuD,kDAAkD,sFAAsF,gFAAgF,mGAAmG,+GAA+G,KAAK;;AAEnlC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6GAA6G,mEAAmE,uDAAuD,2BAA2B,qBAAqB,kDAAkD,KAAK;;AAE9U,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,wGAAwG,2BAA2B,wBAAwB,qBAAqB,+CAA+C,oFAAoF,KAAK;;AAExT,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6GAA6G,gDAAgD,6EAA6E,kDAAkD,kDAAkD,2BAA2B,qBAAqB,6CAA6C,yGAAyG,oEAAoE,uEAAuE,+CAA+C,cAAc,cAAc,2CAA2C,qEAAqE,wCAAwC,yCAAyC,QAAQ,uBAAuB,8DAA8D,iDAAiD,wCAAwC,QAAQ,uBAAuB,4DAA4D,wCAAwC,mDAAmD,OAAO,2DAA2D,kGAAkG,8EAA8E,iFAAiF,oBAAoB,4BAA4B,uBAAuB,8CAA8C,sDAAsD,sDAAsD,kCAAkC,yBAAyB,0DAA0D,+BAA+B,QAAQ,MAAM,oCAAoC,OAAO,KAAK;;AAE7gE,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,8EAA8E,gCAAmB;AACjG,qEAAqE,gCAAmB;AACxF,wEAAwE,gCAAmB;AAC3F,+EAA+E,gCAAmB;AAClG,uEAAuE,gCAAmB;AAC1F,uEAAuE,gCAAmB;AAC1F,yEAAyE,gCAAmB;AAC5F,0EAA0E,gCAAmB;AAC7F,yEAAyE,gCAAmB;AAC5F,yEAAyE,gCAAmB;AAC5F,4EAA4E,gCAAmB;AAC/F,uEAAuE,gCAAmB;AAC1F,uEAAuE,gCAAmB;AAC1F,uEAAuE,gCAAmB;AAC1F,sEAAsE,gCAAmB;AACzF,uEAAuE,gCAAmB;AAC1F,qEAAqE,gCAAmB;AACxF,wEAAwE,gCAAmB;AAC3F,sEAAsE,gCAAmB;AACzF,8DAA8D,gCAAmB;AACjF,uEAAuE,gCAAmB;AAC1F,wEAAwE,gCAAmB;AAC3F,wEAAwE,gCAAmB;;;;;;;;;;;;;;;;;;;;;;;;AAwB3F;AACA;AACA,IAAI,2BAA2B;AAC/B;AACA,QAAQ,iBAAiB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,gCAAmB;;AAEnF;AACA;AACA;AACA,kCAAkC,uCAAuC;AACzE,oDAAoD,eAAe;AACnE;AACA,qBAAqB,wBAAwB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,gCAAmB;AACnF,uEAAuE,gCAAmB;;;AAG1F;AACA;AACA,IAAI,0BAA0B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,oFAAoF,gCAAmB;AACvG,gEAAgE,gCAAmB;;;AAGnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,gCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+EAA+E,gCAAmB;AAClG,8DAA8D,gCAAmB;AACjF,8DAA8D,gCAAmB;AACjF,8DAA8D,gCAAmB;AACjF,8DAA8D,gCAAmB;AACjF,gEAAgE,gCAAmB;;;;AAInF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+EAA+E,gCAAmB;AAClG,8DAA8D,gCAAmB;AACjF,8DAA8D,gCAAmB;AACjF,8DAA8D,gCAAmB;AACjF,8DAA8D,gCAAmB;AACjF,gEAAgE,gCAAmB;;;;AAInF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,gCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,gCAAmB;AACnF,0EAA0E,gCAAmB;;;AAG7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,0GAA0G,gCAAmB;AAC7H,6GAA6G,gCAAmB;AAChI,qEAAqE,gCAAmB;AACxF,gEAAgE,gCAAmB;;;;;AAKnF;AACA,2BAA2B,yDAAyD;AACpF;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6GAA6G,gCAAmB;AAChI,0GAA0G,gCAAmB;AAC7H,qEAAqE,gCAAmB;AACxF,gEAAgE,gCAAmB;;;;;AAKnF;AACA,2BAA2B,sDAAsD;AACjF;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,oFAAoF,gCAAmB;AACvG,kEAAkE,gCAAmB;AACrF,gEAAgE,gCAAmB;;;;AAInF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,oFAAoF,gCAAmB;AACvG,gEAAgE,gCAAmB;;;AAGnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,0GAA0G,gCAAmB;AAC7H,6GAA6G,gCAAmB;AAChI,qEAAqE,gCAAmB;AACxF,gEAAgE,gCAAmB;;;;;AAKnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,0GAA0G,iCAAmB;AAC7H,6GAA6G,iCAAmB;AAChI,qEAAqE,iCAAmB;AACxF,gEAAgE,iCAAmB;;;;;AAKnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,0GAA0G,iCAAmB;AAC7H,6GAA6G,iCAAmB;AAChI,8DAA8D,iCAAmB;AACjF,8DAA8D,iCAAmB;AACjF,qEAAqE,iCAAmB;AACxF,8EAA8E,iCAAmB;AACjG,kEAAkE,iCAAmB;AACrF,gEAAgE,iCAAmB;;;;;;;;AAQnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,0GAA0G,iCAAmB;AAC7H,6GAA6G,iCAAmB;AAChI,8DAA8D,iCAAmB;AACjF,8DAA8D,iCAAmB;AACjF,qEAAqE,iCAAmB;AACxF,8EAA8E,iCAAmB;AACjG,gEAAgE,iCAAmB;;;;;;;AAOnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;;AAEnF;AACA,iCAAiC,gBAAgB,MAAM,wBAAwB;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;;;AAG1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;;;AAG1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,6GAA6G,iCAAmB;AAChI,0GAA0G,iCAAmB;AAC7H,mEAAmE,iCAAmB;AACtF,8DAA8D,iCAAmB;AACjF,8DAA8D,iCAAmB;;;;;;AAMjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,8DAA8D,iCAAmB;AACjF,6GAA6G,iCAAmB;AAChI,0GAA0G,iCAAmB;AAC7H,mEAAmE,iCAAmB;AACtF,8DAA8D,iCAAmB;;;;;;;AAOjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,0GAA0G,iCAAmB;AAC7H,6GAA6G,iCAAmB;AAChI,gEAAgE,iCAAmB;AACnF,8DAA8D,iCAAmB;AACjF,8DAA8D,iCAAmB;;;;;;AAMjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,0GAA0G,iCAAmB;AAC7H,6GAA6G,iCAAmB;AAChI,gEAAgE,iCAAmB;AACnF,8DAA8D,iCAAmB;AACjF,8DAA8D,iCAAmB;;;;;;AAMjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,uEAAuE,iCAAmB;AAC1F,yFAAyF,iCAAmB;AAC5G,0GAA0G,iCAAmB;AAC7H,6GAA6G,iCAAmB;;;;;AAKhI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+EAA+E,iCAAmB;AAClG,sFAAsF,iCAAmB;AACzG,0EAA0E,iCAAmB;;;;AAI7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,uEAAuE,iCAAmB;AAC1F,qEAAqE,iCAAmB;AACxF,gEAAgE,iCAAmB;AACnF,+EAA+E,iCAAmB;AAClG,gFAAgF,iCAAmB;AACnG,uEAAuE,iCAAmB;AAC1F,8EAA8E,iCAAmB;AACjG,sEAAsE,iCAAmB;AACzF,oEAAoE,iCAAmB;AACvF,uEAAuE,iCAAmB;AAC1F,wEAAwE,iCAAmB;AAC3F,sEAAsE,iCAAmB;AACzF,wEAAwE,iCAAmB;AAC3F,sEAAsE,iCAAmB;AACzF,wEAAwE,iCAAmB;AAC3F,wEAAwE,iCAAmB;AAC3F,0EAA0E,iCAAmB;AAC7F,0EAA0E,iCAAmB;AAC7F,yEAAyE,iCAAmB;AAC5F,yEAAyE,iCAAmB;AAC5F,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;AAC1F,yEAAyE,iCAAmB;AAC5F,yEAAyE,iCAAmB;AAC5F,2EAA2E,iCAAmB;AAC9F,wEAAwE,iCAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8B3F,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,iEAAiE,iCAAmB;AACpF,kEAAkE,iCAAmB;AACrF,qEAAqE,iCAAmB;AACxF,kFAAkF,iCAAmB;AACrG,kFAAkF,iCAAmB;AACrG,sFAAsF,iCAAmB;AACzG,6GAA6G,iCAAmB;AAChI,0GAA0G,iCAAmB;AAC7H,oFAAoF,iCAAmB;AACvG,6EAA6E,iCAAmB;AAChG,sFAAsF,iCAAmB;AACzG,oFAAoF,iCAAmB;AACvG,oEAAoE,iCAAmB;AACvF,0EAA0E,iCAAmB;AAC7F,gFAAgF,iCAAmB;AACnG,mFAAmF,iCAAmB;AACtG,0EAA0E,iCAAmB;AAC7F,sEAAsE,iCAAmB;;;;;;;;;;;;;;;;;;;AAmBzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,gBAAgB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qGAAqG,qBAAqB;AAC1H;AACA;AACA;AACA;AACA;AACA,qGAAqG,qBAAqB;AAC1H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uMAAuM;AACvN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE,IAAI;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,oBAAoB;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oGAAoG,IAAI;AACxG;AACA,8FAA8F,eAAe;AAC7G;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,qBAAqB;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uGAAuG,IAAI;AAC3G;AACA,6FAA6F,eAAe;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,UAAU;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,yBAAyB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wGAAwG,IAAI;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0GAA0G,IAAI;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,sBAAsB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,uBAAuB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,8EAA8E,iCAAmB;AACjG,qEAAqE,iCAAmB;AACxF,mEAAmE,iCAAmB;AACtF,gEAAgE,iCAAmB;AACnF,+EAA+E,iCAAmB;AAClG,kEAAkE,iCAAmB;AACrF,4EAA4E,iCAAmB;AAC/F,sEAAsE,iCAAmB;AACzF,kEAAkE,iCAAmB;AACrF,oEAAoE,iCAAmB;AACvF,2EAA2E,iCAAmB;;;;;;;;;;;;AAY9F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,oCAAoC;AACjE;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,wCAAwC;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,iCAAiC;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,oCAAoC;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,oCAAoC;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oBAAoB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,iBAAiB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,iBAAiB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE,gBAAgB;AACrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE,gBAAgB;AACrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,yCAAyC;AAChG,mBAAmB,kBAAkB;AACrC,qBAAqB,kBAAkB,cAAc,iBAAiB;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,sBAAsB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wGAAwG,IAAI;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,uBAAuB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yGAAyG,IAAI;AAC7G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yGAAyG,IAAI;AAC7G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,uEAAuE,iCAAmB;AAC1F,6GAA6G,iCAAmB;AAChI,0GAA0G,iCAAmB;AAC7H,yFAAyF,iCAAmB;AAC5G,8EAA8E,iCAAmB;AACjG,4DAA4D,iCAAmB;AAC/E,oEAAoE,iCAAmB;AACvF,4EAA4E,iCAAmB;AAC/F,wEAAwE,iCAAmB;AAC3F,sEAAsE,iCAAmB;AACzF,uEAAuE,iCAAmB;;;;;;;;;;;;;AAa1F;AACA;AACA;AACA;AACA;AACA,CAAC,0CAA0C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4EAA4E;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,gCAAgC;AAChD;AACA;AACA;AACA;AACA,sCAAsC,0BAA0B;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8GAA8G,qBAAqB;AACnI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,8BAA8B;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,oCAAoC;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,2BAA2B,MAAM,8BAA8B;AACnH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,uBAAuB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,+DAA+D,iCAAmB;AAClF,8DAA8D,iCAAmB;;;;AAIjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,sBAAsB;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,gBAAgB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E,OAAO;AACjF;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,+EAA+E,iCAAmB;AAClG,yFAAyF,iCAAmB;AAC5G,gEAAgE,iCAAmB;AACnF,yEAAyE,iCAAmB;AAC5F,qEAAqE,iCAAmB;AACxF,qFAAqF,iCAAmB;AACxG,yEAAyE,iCAAmB;AAC5F,sEAAsE,iCAAmB;AACzF,+DAA+D,iCAAmB;;;;;;;;;;;AAWlF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,sCAAsC;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,+CAA+C;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,2CAA2C;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,4BAA4B;AAChD;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,4EAA4E,iCAAmB;AAC/F,yEAAyE,iCAAmB;AAC5F,sEAAsE,iCAAmB;AACzF,0EAA0E,iCAAmB;AAC7F,qEAAqE,iCAAmB;AACxF,gEAAgE,iCAAmB;AACnF,kEAAkE,iCAAmB;AACrF,8EAA8E,iCAAmB;AACjG,4EAA4E,iCAAmB;AAC/F,+DAA+D,iCAAmB;AAClF,mEAAmE,iCAAmB;;;;;;;;;;;;;AAatF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qFAAqF,aAAa;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oFAAoF,gBAAgB;AACpG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,YAAY,IAAI,KAAK,cAAc;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,2EAA2E,iCAAmB;AAC9F,qEAAqE,iCAAmB;AACxF,kEAAkE,iCAAmB;AACrF,mEAAmE,iCAAmB;;;;;AAKtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C,4BAA4B,mBAAmB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,4DAA4D,iCAAmB;AAC/E,sEAAsE,iCAAmB;;;;AAIzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,wEAAwE,iCAAmB;AAC3F,oFAAoF,iCAAmB;AACvG,yEAAyE,iCAAmB;AAC5F,sEAAsE,iCAAmB;AACzF,wEAAwE,iCAAmB;AAC3F,2EAA2E,iCAAmB;AAC9F,qEAAqE,iCAAmB;AACxF,+EAA+E,iCAAmB;AAClG,wEAAwE,iCAAmB;AAC3F,4EAA4E,iCAAmB;;;;;;;;;;;AAW/F,2EAA2E;AAC3E,6EAA6E;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,uBAAuB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,0DAA0D,iCAAmB;AAC7E,wEAAwE,iCAAmB;AAC3F,yEAAyE,iCAAmB;AAC5F,qEAAqE,iCAAmB;AACxF,qEAAqE,iCAAmB;AACxF,+EAA+E,iCAAmB;AAClG,iGAAiG,iCAAmB;AACpH,kEAAkE,iCAAmB;AACrF,uEAAuE,iCAAmB;;;;;;;;;;AAU1F;AACA;AACA;AACA;AACA;AACA,sDAAsD,4BAA4B;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,4EAA4E,iCAAmB;AAC/F,wEAAwE,iCAAmB;AAC3F,yEAAyE,iCAAmB;AAC5F,0EAA0E,iCAAmB;AAC7F,2EAA2E,iCAAmB;AAC9F,qEAAqE,iCAAmB;AACxF,kEAAkE,iCAAmB;AACrF,8EAA8E,iCAAmB;AACjG,4EAA4E,iCAAmB;AAC/F,+DAA+D,iCAAmB;;;;;;;;;;;;AAYlF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qFAAqF,aAAa;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kFAAkF,aAAa;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,sEAAsE,iCAAmB;AACzF,uEAAuE,iCAAmB;AAC1F,6EAA6E,iCAAmB;AAChG,wEAAwE,iCAAmB;AAC3F,0EAA0E,iCAAmB;AAC7F,2EAA2E,iCAAmB;AAC9F,qEAAqE,iCAAmB;AACxF,kEAAkE,iCAAmB;AACrF,+EAA+E,iCAAmB;AAClG,kEAAkE,iCAAmB;AACrF,0DAA0D,iCAAmB;AAC7E,0DAA0D,iCAAmB;AAC7E,2DAA2D,iCAAmB;AAC9E,2DAA2D,iCAAmB;AAC9E,2EAA2E,iCAAmB;AAC9F,+DAA+D,iCAAmB;AAClF,wEAAwE,iCAAmB;;;;;;;;;;;;;;;AAe3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,yBAAyB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,8BAA8B,eAAe,4BAA4B;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,4BAA4B;AACrF;AACA;AACA;AACA,wBAAwB,4BAA4B;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,4BAA4B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,iBAAiB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,iBAAiB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,iBAAiB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,iBAAiB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,SAAS;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,SAAS;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,qBAAqB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,qBAAqB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,0BAA0B;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qFAAqF,gBAAgB;AACrG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qFAAqF,gBAAgB;AACrG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oEAAoE,OAAO;AAC3E;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,2EAA2E,iCAAmB;AAC9F,qEAAqE,iCAAmB;AACxF,4EAA4E,iCAAmB;AAC/F,mEAAmE,iCAAmB;;;;;AAKtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,+BAA+B;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,+BAA+B;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yEAAyE,iCAAmB;AAC5F,wEAAwE,iCAAmB;AAC3F,sEAAsE,iCAAmB;AACzF,qEAAqE,iCAAmB;AACxF,qEAAqE,iCAAmB;AACxF,2EAA2E,iCAAmB;AAC9F,0DAA0D,iCAAmB;;;;;;;;AAQ7E;AACA;AACA;AACA;AACA;AACA,yDAAyD,0BAA0B;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,sBAAsB,gDAAgD;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,sBAAsB,oCAAoC;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,sBAAsB,gCAAgC;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,qCAAqC,4BAA4B;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gFAAgF,iCAAmB;AACnG,0GAA0G,iCAAmB;AAC7H,6GAA6G,iCAAmB;AAChI,sFAAsF,iCAAmB;AACzG,iEAAiE,iCAAmB;AACpF,yEAAyE,iCAAmB;AAC5F,6EAA6E,iCAAmB;AAChG,gFAAgF,iCAAmB;AACnG,2EAA2E,iCAAmB;AAC9F,qFAAqF,iCAAmB;AACxG,yEAAyE,iCAAmB;AAC5F,kFAAkF,iCAAmB;AACrG,sEAAsE,iCAAmB;AACzF,wEAAwE,iCAAmB;;;;;;;;;;;;;;;AAe3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,0CAA0C;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA,2BAA2B,gBAAgB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,sCAAsC;;;AAGvC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,uEAAuE,iCAAmB;AAC1F,8DAA8D,iCAAmB;AACjF,uEAAuE,iCAAmB;;;;AAI1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,kEAAkE,iCAAmB;AACrF,uEAAuE,iCAAmB;AAC1F,0DAA0D,iCAAmB;;;;;AAK7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,8DAA8D,iCAAmB;AACjF,sEAAsE,iCAAmB;AACzF,kEAAkE,iCAAmB;AACrF,kEAAkE,iCAAmB;AACrF,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;AAC1F,qFAAqF,iCAAmB;AACxG,8EAA8E,iCAAmB;AACjG,qEAAqE,iCAAmB;AACxF,4DAA4D,iCAAmB;;;;;;;;;;;;AAY/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,uDAAuD,OAAO;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8FAA8F;AAC9F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;;;AAG1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,UAAU,GAAG,UAAU;AAC9C;AACA;AACA,uBAAuB,UAAU,GAAG,UAAU;AAC9C;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,qEAAqE,iCAAmB;;;AAGxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,qEAAqE,iCAAmB;AACxF,yEAAyE,iCAAmB;AAC5F,qEAAqE,iCAAmB;;;;;AAKxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,EAAE,GAAG,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,aAAa;AAC7C,mCAAmC,cAAc;AACjD;AACA;AACA;AACA;AACA,wCAAwC,yBAAyB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,yBAAyB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,mBAAmB;AACrD,qCAAqC,oBAAoB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,mBAAmB;AAC7D,6CAA6C,oBAAoB;AACjE;AACA;AACA;AACA;AACA;AACA,0CAA0C,mBAAmB;AAC7D,6CAA6C,oBAAoB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,4DAA4D,iCAAmB;AAC/E,qEAAqE,iCAAmB;AACxF,mEAAmE,iCAAmB;AACtF,uEAAuE,iCAAmB;AAC1F,qFAAqF,iCAAmB;AACxG,uEAAuE,iCAAmB;AAC1F,8EAA8E,iCAAmB;AACjG,8DAA8D,iCAAmB;AACjF,wEAAwE,iCAAmB;;;;;;;;;;AAU3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8HAA8H,kEAAkE,IAAI,kEAAkE;AACtQ;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,qCAAqC;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,qBAAqB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA,oCAAoC,gCAAgC;AACpE;AACA;AACA;AACA,yCAAyC,kCAAkC;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA,4BAA4B,wBAAwB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA,mBAAmB,gCAAgC;AACnD;AACA;AACA,4DAA4D,mCAAmC;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4DAA4D;;;AAG7D,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+EAA+E,iCAAmB;;AAElG;AACA,mFAAmF,gCAAgC,WAAW,wBAAwB;AACtJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,uCAAuC;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,6CAA6C;AAC1F;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ,YAAY;AACZ;AACA;AACA;AACA;AACA,cAAc,yBAAyB;AACvC;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,wEAAwE,iCAAmB;;AAE3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,kBAAkB;AACvE;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,MAAM;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,uEAAuE,iCAAmB;AAC1F,2EAA2E,iCAAmB;AAC9F,uEAAuE,iCAAmB;AAC1F,wEAAwE,iCAAmB;AAC3F,4EAA4E,iCAAmB;AAC/F,qEAAqE,iCAAmB;AACxF,yEAAyE,iCAAmB;AAC5F,qFAAqF,iCAAmB;AACxG,kFAAkF,iCAAmB;AACrG,gFAAgF,iCAAmB;AACnG,oFAAoF,iCAAmB;AACvG,uFAAuF,iCAAmB;AAC1G,yFAAyF,iCAAmB;AAC5G,mFAAmF,iCAAmB;AACtG,+EAA+E,iCAAmB;AAClG,sFAAsF,iCAAmB;AACzG,yEAAyE,iCAAmB;AAC5F,qFAAqF,iCAAmB;AACxG,gFAAgF,iCAAmB;AACnG,kGAAkG,iCAAmB;AACrH,qGAAqG,iCAAmB;AACxH,mFAAmF,iCAAmB;AACtG,6FAA6F,iCAAmB;AAChH,6EAA6E,iCAAmB;AAChG,8EAA8E,iCAAmB;AACjG,6EAA6E,iCAAmB;AAChG,wFAAwF,iCAAmB;AAC3G,iFAAiF,iCAAmB;AACpG,0EAA0E,iCAAmB;AAC7F,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;AAC1F,wEAAwE,iCAAmB;AAC3F,+DAA+D,iCAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyClF,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;;AAExF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+EAA+E,iCAAmB;AAClG,0GAA0G,iCAAmB;AAC7H,6GAA6G,iCAAmB;AAChI,sFAAsF,iCAAmB;AACzG,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;AAC1F,oEAAoE,iCAAmB;;;;;;;;AAQvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,4BAA4B;AACpD;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,wEAAwE,iCAAmB;AAC3F,4EAA4E,iCAAmB;AAC/F,4FAA4F,iCAAmB;;;;;AAK/G;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;AAGD,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yEAAyE,iCAAmB;AAC5F,+DAA+D,iCAAmB;AAClF,+DAA+D,iCAAmB;AAClF,uEAAuE,iCAAmB;AAC1F,oEAAoE,iCAAmB;AACvF,4FAA4F,iCAAmB;;;;;;AAM/G;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oBAAoB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oBAAoB;;;AAGrB,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA,mBAAmB,gCAAgC;AACnD;AACA;AACA,4DAA4D,mCAAmC;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,wCAAwC;;;AAGzC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,8DAA8D,iCAAmB;AACjF,uEAAuE,iCAAmB;AAC1F,qEAAqE,iCAAmB;;;;;;AAMxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4CAA4C;AAC7C;AACA,kDAAkD,uBAAuB;AACzE;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,uBAAuB;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uBAAuB;AACvC;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;;AAExF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,mEAAmE,iCAAmB;AACtF,uEAAuE,iCAAmB;AAC1F,gFAAgF,iCAAmB;AACnG,8DAA8D,iCAAmB;AACjF,uEAAuE,iCAAmB;AAC1F,sFAAsF,iCAAmB;;;;;;;;AAQzG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,2BAA2B;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,qBAAqB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oCAAoC;AAC5D,4BAA4B,qBAAqB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6EAA6E;AAC7E;AACA,uDAAuD;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oCAAoC;AAC5D,4BAA4B,qBAAqB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA,mCAAmC,qBAAqB;AACxD;AACA,iCAAiC,uBAAuB,GAAG,sBAAsB;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;AAC3C;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,cAAc;AACnD;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,oEAAoE,iCAAmB;AACvF,+DAA+D,iCAAmB;;;AAGlF;AACA;AACA,gDAAgD,gBAAgB;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2EAA2E,2BAA2B;AACtG,iCAAiC,oBAAoB,YAAY;AACjE;AACA;AACA;AACA,4EAA4E,2BAA2B;AACvG,iCAAiC,mBAAmB,uDAAuD;AAC3G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,oBAAoB;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,wBAAwB;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uEAAuE,0BAA0B;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,mGAAmG,iCAAmB;AACtH,4GAA4G,iCAAmB;AAC/H,wGAAwG,iCAAmB;;;;AAI3H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,2GAA2G,iCAAmB;AAC9H,sFAAsF,iCAAmB;AACzG,+EAA+E,iCAAmB;AAClG,gFAAgF,iCAAmB;AACnG,sFAAsF,iCAAmB;AACzG,qEAAqE,iCAAmB;AACxF,mEAAmE,iCAAmB;AACtF,iFAAiF,iCAAmB;AACpG,mFAAmF,iCAAmB;AACtG,gGAAgG,iCAAmB;AACnH,oFAAoF,iCAAmB;AACvG,6EAA6E,iCAAmB;AAChG,yFAAyF,iCAAmB;AAC5G,0EAA0E,iCAAmB;AAC7F,yEAAyE,iCAAmB;;;;;;;;;;;;;;;AAe5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gCAAgC;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mHAAmH,0CAA0C;AAC7J;AACA;AACA,+DAA+D,mBAAmB;AAClF;AACA;AACA;AACA,8DAA8D,gBAAgB;AAC9E;AACA;AACA;AACA,+DAA+D,GAAG,IAAI,8GAA8G;AACpL;AACA;AACA;AACA,iEAAiE,KAAK;AACtE;AACA;AACA;AACA;AACA,oEAAoE,8EAA8E;AAClJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4EAA4E,gBAAgB;AAC5F;AACA;AACA;AACA,2EAA2E,mBAAmB;AAC9F;AACA;AACA;AACA,iEAAiE,UAAU;AAC3E;AACA;AACA;AACA,mEAAmE,iBAAiB;AACpF;AACA;AACA;AACA,qEAAqE,+CAA+C;AACpH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D,uBAAuB;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8GAA8G,qCAAqC;AACnJ;AACA,iFAAiF,kBAAkB;AACnG;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0GAA0G,qCAAqC;AAC/I;AACA,6EAA6E,sBAAsB;AACnG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,kBAAkB;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,oEAAoE,iCAAmB;AACvF,qEAAqE,iCAAmB;;;;;;AAMxF,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,kEAAkE,iCAAmB;AACrF,oEAAoE,iCAAmB;AACvF,qEAAqE,iCAAmB;;;;AAIxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,6BAA6B,GAAG;AAChD,iCAAiC,QAAQ;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,uEAAuE,iCAAmB;AAC1F,yEAAyE,iCAAmB;AAC5F,4EAA4E,iCAAmB;AAC/F,mEAAmE,iCAAmB;AACtF,+EAA+E,iCAAmB;AAClG,qEAAqE,iCAAmB;AACxF,sEAAsE,iCAAmB;AACzF,+DAA+D,iCAAmB;AAClF,mEAAmE,iCAAmB;;;;;;;;;;AAUtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yFAAyF;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,uEAAuE,iCAAmB;AAC1F,+DAA+D,iCAAmB;AAClF,gEAAgE,iCAAmB;AACnF,kEAAkE,iCAAmB;AACrF,gEAAgE,iCAAmB;AACnF,sEAAsE,iCAAmB;;;;;;;AAOzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,eAAe;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,sBAAsB;AAC1C,oBAAoB,uCAAuC;AAC3D,gDAAgD,sCAAsC;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uFAAuF,IAAI;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2EAA2E,YAAY;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,kBAAkB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,iHAAiH;AAClI,iBAAiB,mHAAmH;AACpI;AACA;AACA;AACA,gBAAgB,gDAAgD;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,QAAQ;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,kEAAkE,iCAAmB;AACrF,oEAAoE,iCAAmB;;;;AAIvF;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,iCAAiC,QAAQ;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,uEAAuE,iCAAmB;AAC1F,yEAAyE,iCAAmB;AAC5F,oEAAoE,iCAAmB;AACvF,mEAAmE,iCAAmB;AACtF,sEAAsE,iCAAmB;AACzF,uEAAuE,iCAAmB;AAC1F,kEAAkE,iCAAmB;AACrF,qEAAqE,iCAAmB;;;;;;;;;;AAUxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,iBAAiB,mBAAmB,mBAAmB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA,8EAA8E;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,4DAA4D;AAChF;AACA;AACA;AACA;AACA,gEAAgE,0BAA0B;AAC1F,+DAA+D,0BAA0B;AACzF;AACA;AACA,gEAAgE,yCAAyC;AACzG,+DAA+D,gDAAgD;AAC/G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oFAAoF;AACpF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,kEAAkE,iCAAmB;AACrF,oEAAoE,iCAAmB;AACvF,qEAAqE,iCAAmB;AACxF,8EAA8E,iCAAmB;AACjG,0EAA0E,iCAAmB;;;;;;AAM7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,6BAA6B,GAAG;AAChD;AACA,6BAA6B,QAAQ;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,+EAA+E,iCAAmB;AAClG,+EAA+E,iCAAmB;AAClG,kEAAkE,iCAAmB;AACrF,0EAA0E,iCAAmB;AAC7F,qEAAqE,iCAAmB;AACxF,mEAAmE,iCAAmB;AACtF,8EAA8E,iCAAmB;AACjG,wEAAwE,iCAAmB;AAC3F,kEAAkE,iCAAmB;;;;;;;;;;AAUrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,QAAQ;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D,WAAW;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE,WAAW;AAC3E;AACA;AACA;AACA,gEAAgE,WAAW;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,oEAAoE,iCAAmB;AACvF,mEAAmE,iCAAmB;AACtF,mEAAmE,iCAAmB;AACtF,+DAA+D,iCAAmB;AAClF,kEAAkE,iCAAmB;AACrF,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;;;;;;;;;;AAU1F,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,0DAA0D,iCAAmB;AAC7E,qEAAqE,iCAAmB;AACxF,sEAAsE,iCAAmB;AACzF,6EAA6E,iCAAmB;AAChG,+DAA+D,iCAAmB;AAClF,kEAAkE,iCAAmB;AACrF,iEAAiE,iCAAmB;AACpF,iFAAiF,iCAAmB;AACpG,0EAA0E,iCAAmB;AAC7F,uEAAuE,iCAAmB;AAC1F,iEAAiE,iCAAmB;AACpF,kEAAkE,iCAAmB;AACrF,gEAAgE,iCAAmB;AACnF,gEAAgE,iCAAmB;AACnF,uFAAuF,iCAAmB;AAC1G,4EAA4E,iCAAmB;AAC/F,sEAAsE,iCAAmB;AACzF,mEAAmE,iCAAmB;AACtF,mEAAmE,iCAAmB;AACtF,mEAAmE,iCAAmB;AACtF,mEAAmE,iCAAmB;AACtF,qEAAqE,iCAAmB;AACxF,6EAA6E,iCAAmB;AAChG,uFAAuF,iCAAmB;AAC1G,sEAAsE,iCAAmB;AACzF,4EAA4E,iCAAmB;AAC/F,0EAA0E,iCAAmB;AAC7F,kFAAkF,iCAAmB;AACrG,iEAAiE,iCAAmB;AACpF,2EAA2E,iCAAmB;AAC9F,oEAAoE,iCAAmB;;;;;;;AAOvF;;;;;;;;;;;;;;;;;;;;;;;AAuBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oDAAoD;AACrD;AACA;AACA;AACA,QAAQ,iBAAiB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA;AACA;AACA,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA;AACA;AACA,oBAAoB,gBAAgB,kBAAkB,2BAA2B;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,sBAAsB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,uBAAuB;AAClE;AACA,qDAAqD,uBAAuB;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,0CAA0C,0BAA0B,cAAc,oBAAoB,eAAe,kBAAkB,kBAAkB;AAChN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wGAAwG,wBAAwB;AAChI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,uGAAuG;AACtH;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,qFAAqF,UAAU;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oHAAoH,+CAA+C;AACnK;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,QAAQ;AACxB,cAAc,+BAA+B;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,6BAA6B;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oHAAoH,+CAA+C;AACnK;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,gBAAgB,QAAQ,sBAAsB;AAC7D,8CAA8C,sBAAsB;AACpE;AACA;AACA;AACA;AACA;AACA,kBAAkB,gBAAgB,UAAU,sBAAsB;AAClE,iDAAiD,sBAAsB;AACvE;AACA;AACA;AACA;AACA;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,oBAAoB;AACnD,uCAAuC,gCAAgC;AACvE,mCAAmC,iCAAiC;AACpE;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,gCAAgC;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,gCAAgC;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,kCAAkC;AAC9E,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,mBAAmB,WAAW,iBAAiB,aAAa,eAAe,MAAM,iBAAiB;AAC9H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,gBAAgB,uDAAuD;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,mEAAmE,iCAAmB;;;AAGtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,0EAA0E,iCAAmB;AAC7F,wEAAwE,iCAAmB;AAC3F,mEAAmE,iCAAmB;AACtF,yEAAyE,iCAAmB;AAC5F,kEAAkE,iCAAmB;;;;;;AAMrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,0CAA0C;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6EAA6E,+DAA+D;AAC5I;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mEAAmE,iCAAmB;AACtF,yEAAyE,iCAAmB;AAC5F,gEAAgE,iCAAmB;AACnF,sEAAsE,iCAAmB;AACzF,mEAAmE,iCAAmB;AACtF,kEAAkE,iCAAmB;;;;;;;;AAQrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,QAAQ;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,oCAAoC;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,IAAI;AAChB;AACA;AACA;AACA,oGAAoG,qBAAqB;AACzH;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,yBAAyB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,QAAQ;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,sBAAsB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,uBAAuB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE,IAAI;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D,IAAI;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE,IAAI;AACtE;AACA;AACA;AACA;AACA;AACA,wGAAwG,IAAI;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0GAA0G,IAAI;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,mEAAmE,iCAAmB;;;AAGtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,oCAAoC;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,oCAAoC;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,6CAA6C;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,oCAAoC;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,QAAQ;AACvD;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yEAAyE,iCAAmB;;AAE5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,kEAAkE,iCAAmB;;;AAGrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,kEAAkE,iCAAmB;;AAErF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gCAAgC;AACjC;AACA,iBAAiB,iBAAiB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,mEAAmE,iCAAmB;;;AAGtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,QAAQ;AACtD;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yEAAyE,iCAAmB;;AAE5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,sEAAsE,iCAAmB;AACzF,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;;;;;;AAM1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mEAAmE,iCAAmB;AACtF,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,+DAA+D,iCAAmB;AAClF,kEAAkE,iCAAmB;AACrF,sEAAsE,iCAAmB;AACzF,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,+DAA+D,iCAAmB;AAClF,kEAAkE,iCAAmB;AACrF,wFAAwF,iCAAmB;AAC3G,qFAAqF,iCAAmB;;;;;;;;;;;;;;;;AAgBxG,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,kBAAkB;AAC9C;AACA;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gCAAgC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,mBAAmB;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE,mBAAmB;AACrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,mBAAmB,oDAAoD,kBAAkB;AACvH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,mBAAmB,oDAAoD,kBAAkB;AACrH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,iBAAiB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,iBAAiB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,0BAA0B;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,0BAA0B;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,0BAA0B;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,0BAA0B;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,eAAe,GAAG,eAAe,OAAO,iBAAiB;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,gBAAgB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,gBAAgB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,gBAAgB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,gBAAgB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,gBAAgB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,gBAAgB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA,6FAA6F,iBAAiB;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+EAA+E,iBAAiB;AAChG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gFAAgF,iBAAiB;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA,sBAAsB;AACtB,iEAAiE,iCAAmB;AACpF,kEAAkE,iCAAmB;AACrF,mEAAmE,iCAAmB;AACtF,sEAAsE,iCAAmB;;;;;AAKzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gDAAgD;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,8CAA8C;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,2BAA2B,IAAI;AACvE;AACA,kCAAkC,qBAAqB,OAAO;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,MAAM;AACpD;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,qBAAqB;AACxD,qBAAqB;AACrB;AACA;AACA;AACA,wDAAwD,IAAI;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gGAAgG,0BAA0B;AAC1H;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,SAAS;AACT;AACA;AACA,kBAAkB,oBAAoB,QAAQ,sBAAsB;AACpE;AACA;AACA;AACA,wDAAwD,IAAI;AAC5D;AACA;AACA;AACA;AACA,WAAW,qCAAqC,uBAAuB;AACvE,WAAW,0BAA0B;AACrC,WAAW,WAAW;AACtB,WAAW;AACX;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,gGAAgG;AAChH;AACA;AACA;AACA,oBAAoB,0BAA0B;AAC9C;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,gGAAgG,EAAE,IAAI,EAAE;AACxG;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,sCAAsC;AAClD,QAAQ,8BAA8B;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,iCAAiC,qBAAqB,gBAAgB;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,mDAAmD;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,0DAA0D;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;;AAEnF;AACA,aAAa,kBAAkB,yDAAyD,kCAAkC;AAC1H;AACA,QAAQ,iBAAiB;AACzB,WAAW,mCAAmC;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,mEAAmE,iCAAmB;AACtF,gEAAgE,iCAAmB;;;AAGnF;AACA,aAAa,kBAAkB,4BAA4B;AAC3D;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mHAAmH;AACnH,kGAAkG;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,mEAAmE,iCAAmB;;AAEtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,qEAAqE,iCAAmB;AACxF,6EAA6E,iCAAmB;AAChG,oEAAoE,iCAAmB;;;;;AAKvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,wDAAwD;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,iEAAiE;AACvG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,oGAAoG;AACpH;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,oBAAoB;AACpB;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,sEAAsE,iCAAmB;AACzF,yEAAyE,iCAAmB;AAC5F,qEAAqE,iCAAmB;AACxF,+DAA+D,iCAAmB;AAClF,qEAAqE,iCAAmB;AACxF,kEAAkE,iCAAmB;AACrF,oEAAoE,iCAAmB;AACvF,wEAAwE,iCAAmB;AAC3F,wEAAwE,iCAAmB;AAC3F,sFAAsF,iCAAmB;AACzG,wFAAwF,iCAAmB;AAC3G,kGAAkG,iCAAmB;AACrH,wFAAwF,iCAAmB;AAC3G,gGAAgG,iCAAmB;AACnH,0FAA0F,iCAAmB;AAC7G,mEAAmE,iCAAmB;AACtF,mEAAmE,iCAAmB;AACtF,mEAAmE,iCAAmB;AACtF,8FAA8F,iCAAmB;AACjH,iEAAiE,iCAAmB;AACpF,8FAA8F,iCAAmB;AACjH,8FAA8F,iCAAmB;AACjH,+DAA+D,iCAAmB;;;;;;;;;;AAUlF;;;;;;;;;;;;;;;AAeA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,wDAAwD;AAC1G,kJAAkJ,gBAAgB;AAClK,mKAAmK,gBAAgB;AACnL,oKAAoK,gBAAgB;AACpL,mJAAmJ,gBAAgB;AACnK;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,iEAAiE;AACvG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,2OAA2O;AAC3P;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,IAAI;AAChB;AACA,mFAAmF;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,aAAa;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,cAAc;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,oBAAoB;AACpB;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gFAAgF,mCAAmC;AACnH;AACA;AACA;AACA;AACA,gBAAgB,+BAA+B;AAC/C;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,4BAA4B;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,kCAAkC;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,gCAAgC,yBAAyB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iCAAiC;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,qEAAqE,iCAAmB;AACxF,6EAA6E,iCAAmB;AAChG,uFAAuF,iCAAmB;AAC1G,2EAA2E,iCAAmB;AAC9F,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;AAC1F,mFAAmF,iCAAmB;AACtG,mFAAmF,iCAAmB;;;;;;;;;;;AAWtG;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,oEAAoE,iCAAmB;AACvF,qEAAqE,iCAAmB;AACxF,wEAAwE,iCAAmB;;;;;AAK3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,4EAA4E,iCAAmB;AAC/F,+DAA+D,iCAAmB;;;AAGlF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,mEAAmE,iCAAmB;AACtF,8EAA8E,iCAAmB;AACjG,qEAAqE,iCAAmB;AACxF,kEAAkE,iCAAmB;AACrF,uFAAuF,iCAAmB;AAC1G,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,oEAAoE,iCAAmB;AACvF,qFAAqF,iCAAmB;AACxG,qFAAqF,iCAAmB;AACxG,YAAY,QAAQ;AACpB,YAAY,sBAAsB;;;;;;;;;;;;AAYlC;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA,kEAAkE,EAAE,KAAK;AACzE;AACA;AACA,0EAA0E,EAAE,KAAK;AACjF;AACA,wEAAwE,EAAE,OAAO;AACjF,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sGAAsG;AACtG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,oEAAoE,iCAAmB;AACvF,mEAAmE,iCAAmB;AACtF,8EAA8E,iCAAmB;AACjG,qEAAqE,iCAAmB;AACxF,mEAAmE,iCAAmB;AACtF,wFAAwF,iCAAmB;AAC3G,2EAA2E,iCAAmB;AAC9F,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;AAC1F,oEAAoE,iCAAmB;AACvF,kFAAkF,iCAAmB;AACrG,kFAAkF,iCAAmB;;;;;;;;;;;;;;;AAerG;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA,iEAAiE,EAAE,KAAK;AACxE;AACA;AACA,yEAAyE,EAAE,KAAK;AAChF;AACA,wGAAwG;AACxG,wEAAwE,EAAE,OAAO;AACjF,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sGAAsG;AACtG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,0EAA0E,iCAAmB;AAC7F,4EAA4E,iCAAmB;AAC/F,0DAA0D,iCAAmB;AAC7E,0DAA0D,iCAAmB;AAC7E,0DAA0D,iCAAmB;AAC7E,6EAA6E,iCAAmB;;;;;;AAMhG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,mEAAmE,iCAAmB;AACtF,6EAA6E,iCAAmB;AAChG,qEAAqE,iCAAmB;AACxF,kEAAkE,iCAAmB;AACrF,2EAA2E,iCAAmB;AAC9F,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;;;;;;;;;AAS1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,uFAAuF,iCAAmB;AAC1G,kEAAkE,iCAAmB;AACrF,qEAAqE,iCAAmB;AACxF,mEAAmE,iCAAmB;AACtF,kEAAkE,iCAAmB;;;;;;;AAOrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,qEAAqE;AACrF;AACA;AACA;AACA;AACA;AACA,oCAAoC,MAAM;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,MAAM;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,uBAAuB,kCAAkC,UAAU;AAC7H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,aAAa,cAAc,WAAW;AAC3F;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,WAAW;AAC/C;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,8EAA8E,iCAAmB;AACjG,gFAAgF,iCAAmB;AACnG,qEAAqE,iCAAmB;AACxF,+DAA+D,iCAAmB;AAClF,qEAAqE,iCAAmB;AACxF,kEAAkE,iCAAmB;AACrF,mEAAmE,iCAAmB;AACtF,6EAA6E,iCAAmB;;;;;;;;;;AAUhG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,2EAA2E,iCAAmB;AAC9F,6EAA6E,iCAAmB;AAChG,uFAAuF,iCAAmB;AAC1G,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;AAC1F,6EAA6E,iCAAmB;;;;;;;;AAQhG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,0DAA0D,iCAAmB;;AAE7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oEAAoE;AACpE;AACA;AACA;AACA;AACA,mGAAmG,eAAe,oBAAoB,cAAc;AACpJ;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,qEAAqE,iCAAmB;AACxF,6EAA6E,iCAAmB;AAChG,uFAAuF,iCAAmB;AAC1G,2EAA2E,iCAAmB;AAC9F,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;AAC1F,sFAAsF,iCAAmB;AACzG,sFAAsF,iCAAmB;;;;;;;;;;;AAWzG;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,uEAAuE,iCAAmB;;AAE1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,4EAA4E,iCAAmB;AAC/F,8EAA8E,iCAAmB;AACjG,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;;;;;;AAM1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,0DAA0D,iCAAmB;AAC7E,oEAAoE,iCAAmB;;;AAGvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,6DAA6D;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,iBAAiB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,iBAAiB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,gBAAgB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,gBAAgB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,iBAAiB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,iBAAiB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wEAAwE,YAAY,GAAG,KAAK;AAC5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,YAAY,GAAG,MAAM;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,YAAY,GAAG,KAAK;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,8BAA8B;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,OAAO;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,UAAU,aAAa,UAAU,EAAE,+CAA+C;AAC/H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C,0BAA0B,MAAM,IAAI,SAAS,EAAE,yCAAyC;AACxF;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,+DAA+D,kCAAmB;AAClF,yEAAyE,kCAAmB;;;AAG5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,mEAAmE,kCAAmB;AACtF,kEAAkE,kCAAmB;;;;AAIrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE,MAAM;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,oBAAoB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,sBAAsB,IAAI;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,qBAAqB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,YAAY;AAClE,oBAAoB,gCAAgC,GAAG,gCAAgC;AACvF;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,YAAY;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yEAAyE;AACzE;AACA;AACA,2BAA2B;AAC3B;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,4EAA4E,kCAAmB;AAC/F,yEAAyE,kCAAmB;;;AAG5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uBAAuB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,0DAA0D,kCAAmB;AAC7E,oEAAoE,kCAAmB;;;AAGvF;AACA,wDAAwD,sBAAsB;AAC9E;AACA;AACA,4DAA4D,sBAAsB;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,yDAAyD;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,cAAc,OAAO,aAAa;AAC1F,mEAAmE,0BAA0B;AAC7F;AACA;AACA,8DAA8D,cAAc,OAAO,aAAa;AAChG;AACA,qFAAqF,aAAa;AAClG;AACA,4DAA4D,aAAa;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,gFAAgF,aAAa,IAAI,aAAa;AAC9G,8DAA8D,YAAY,MAAM,0BAA0B;AAC1G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,oBAAoB;AAChF,qBAAqB,qCAAqC;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,UAAU;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,UAAU;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,wBAAwB,YAAY;AACpC;AACA,kDAAkD,EAAE,KAAK;AACzD;AACA;AACA,0DAA0D,EAAE,KAAK;AACjE;AACA,2DAA2D;AAC3D,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,kCAAmB;;AAElF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,gCAAgC,uBAAuB;AACvD;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,wBAAwB;AACxD;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,gBAAgB,4BAA4B;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gBAAgB,kBAAkB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,OAAO;AACpD,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yFAAyF,kCAAmB;;AAE5G;AACA;AACA;AACA,wDAAwD,2BAA2B,IAAI;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,wCAAwC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yEAAyE,kCAAmB;AAC5F,+DAA+D,kCAAmB;AAClF,oEAAoE,kCAAmB;AACvF,iEAAiE,kCAAmB;AACpF,mEAAmE,kCAAmB;AACtF,0EAA0E,kCAAmB;AAC7F,mEAAmE,kCAAmB;;;;;;;;AAQtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA,wBAAwB;AACxB;AACA,2DAA2D,iCAAiC;AAC5F;AACA,kFAAkF;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,kBAAkB,YAAY,EAAE,yBAAyB,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY;AAChG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,0EAA0E,kCAAmB;;;AAG7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE,kBAAkB;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4BAA4B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,8BAA8B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD;AACA,gEAAgE;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,8BAA8B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,8BAA8B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,8BAA8B;;;AAG/B,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+EAA+E,kCAAmB;AAClG,+DAA+D,kCAAmB;AAClF,uEAAuE,kCAAmB;AAC1F,+FAA+F,kCAAmB;;;;;AAKlH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,kCAAkC;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,gCAAgC;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,+EAA+E,kCAAmB;AAClG,oEAAoE,kCAAmB;AACvF,4EAA4E,kCAAmB;;;;;AAK/F;AACA,qFAAqF,kCAAkC;AACvH,IAAI,gBAAgB,GAAG,mBAAmB,GAAG,uBAAuB,GAAG,gBAAgB,GAAG,mBAAmB,GAAG,gBAAgB,OAAO,kBAAkB;AACzJ,IAAI,kBAAkB;AACtB;AACA,yDAAyD,6BAA6B;AACtF,qEAAqE,2BAA2B,KAAK;AACrG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8FAA8F;AAC9F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,6BAA6B;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,iEAAiE,kCAAmB;AACpF,yEAAyE,kCAAmB;AAC5F,yFAAyF,kCAAmB;AAC5G,kEAAkE,kCAAmB;AACrF,2EAA2E,kCAAmB;AAC9F,+EAA+E,kCAAmB;AAClG,gFAAgF,kCAAmB;AACnG,gEAAgE,kCAAmB;AACnF,8DAA8D,kCAAmB;;;;;;;;;;;AAWjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA,gBAAgB,2IAA2I;AAC3J;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,kBAAkB;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,eAAe,yDAAyD,+DAA+D;AACpL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,iEAAiE,kCAAmB;AACpF,mEAAmE,kCAAmB;AACtF,yEAAyE,kCAAmB;AAC5F,kEAAkE,kCAAmB;;;;;;AAMrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kCAAkC;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wHAAwH,uBAAuB;AAC/I;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,2EAA2E,kCAAmB;AAC9F,qEAAqE,kCAAmB;AACxF,6GAA6G,kCAAmB;AAChI,+EAA+E,kCAAmB;AAClG,gFAAgF,kCAAmB;AACnG,uEAAuE,kCAAmB;AAC1F,2EAA2E,kCAAmB;AAC9F,0EAA0E,kCAAmB;AAC7F,kFAAkF,kCAAmB;AACrG,mEAAmE,kCAAmB;AACtF,gEAAgE,kCAAmB;AACnF,wEAAwE,kCAAmB;AAC3F,iFAAiF,kCAAmB;AACpG,kEAAkE,kCAAmB;;;;;;;;;;;;;;AAcrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,gDAAgD;AACrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,4EAA4E,kCAAmB;AAC/F,gEAAgE,kCAAmB;AACnF,kEAAkE,kCAAmB;AACrF,mEAAmE,kCAAmB;AACtF,qEAAqE,kCAAmB;AACxF,yFAAyF,kCAAmB;AAC5G,kEAAkE,kCAAmB;;;;;;;;AAQrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,iCAAiC,IAAI,uBAAuB;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,cAAc;AACjH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,6CAA6C,uBAAuB;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,UAAU,gBAAgB,cAAc;AAClG;AACA;AACA,yFAAyF;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+EAA+E,kCAAmB;AAClG,+DAA+D,kCAAmB;AAClF,iEAAiE,kCAAmB;;;;AAIpF;AACA;AACA;AACA;AACA;AACA,gBAAgB,+BAA+B;AAC/C;AACA;AACA;AACA;AACA;AACA,gBAAgB,gBAAgB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,iEAAiE,kCAAmB;AACpF,kEAAkE,kCAAmB;AACrF,qEAAqE,kCAAmB;;;;AAIxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4CAA4C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,eAAe;AACvC,4BAA4B,eAAe;AAC3C,sBAAsB,yBAAyB;AAC/C;AACA;AACA,mBAAmB,yBAAyB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,qBAAqB;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,2EAA2E,kCAAmB;AAC9F,gEAAgE,kCAAmB;AACnF,6GAA6G,kCAAmB;AAChI,sFAAsF,kCAAmB;AACzG,2EAA2E,kCAAmB;AAC9F,qEAAqE,kCAAmB;AACxF,0EAA0E,kCAAmB;AAC7F,+EAA+E,kCAAmB;;;;;;;;;AASlG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gCAAgC;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yFAAyF,kCAAmB;AAC5G,qEAAqE,kCAAmB;;;AAGxF;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,mEAAmE,kCAAmB;AACtF,qEAAqE,kCAAmB;AACxF,gEAAgE,kCAAmB;;;;AAInF;AACA,cAAc,kBAAkB,uCAAuC;AACvE;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA,CAAC,gDAAgD;;;AAGjD,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,mFAAmF,kCAAmB;AACtG,4EAA4E,kCAAmB;AAC/F,sEAAsE,kCAAmB;;;;AAIzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,wEAAwE,kCAAmB;AAC3F,+EAA+E,kCAAmB;AAClG,+EAA+E,kCAAmB;;;;;AAKlG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,IAAI;AAChB;AACA;AACA,oDAAoD,eAAe;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iEAAiE,kCAAmB;AACpF,+DAA+D,kCAAmB;AAClF,qEAAqE,kCAAmB;AACxF,+EAA+E,kCAAmB;AAClG,oEAAoE,kCAAmB;AACvF,mEAAmE,kCAAmB;;;;;;;AAOtF;AACA;AACA,IAAI,kCAAkC;AACtC;AACA,oCAAoC,yBAAyB;AAC7D;AACA;AACA;AACA;AACA,iEAAiE,YAAY,yBAAyB;AACtG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,uBAAuB,aAAa,uBAAuB;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;;AAEnF;AACA,gBAAgB,kBAAkB,+BAA+B;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iEAAiE,kCAAmB;AACpF,kEAAkE,kCAAmB;;;AAGrF;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,gBAAgB;AAChC,uFAAuF;AACvF,mFAAmF;AACnF;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,2CAA2C;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,gBAAgB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,oBAAoB;AAC9C,wBAAwB,kBAAkB;AAC1C;AACA,SAAS;AACT;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,kEAAkE,kCAAmB;AACrF,iEAAiE,kCAAmB;AACpF,+EAA+E,kCAAmB;;;;;AAKlG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,sEAAsE;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,mCAAmC;AACrE;AACA;AACA;AACA;AACA;AACA,0EAA0E,OAAO,4BAA4B,SAAS;AACtH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,OAAO,cAAc,YAAY;AAC/G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;AACnF,qEAAqE,kCAAmB;;;AAGxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,sCAAsC,iCAAiC,sBAAsB;AACzG;AACA;AACA;AACA;AACA,gBAAgB,yBAAyB;AACzC;AACA;AACA;AACA;AACA;AACA,gHAAgH,iBAAiB;AACjI;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE,EAAE,IAAI,EAAE,QAAQ,GAAG,0BAA0B,kBAAkB;AAClI;AACA;AACA,mEAAmE,EAAE,IAAI,EAAE,QAAQ,GAAG,0BAA0B,eAAe;AAC/H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,EAAE,IAAI,EAAE;AAC3D;AACA;AACA;AACA,kDAAkD,sBAAsB;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE,EAAE,IAAI,EAAE,QAAQ,GAAG,0BAA0B,kBAAkB;AAClI;AACA;AACA,mEAAmE,EAAE,IAAI,EAAE,QAAQ,GAAG,0BAA0B,eAAe;AAC/H;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,EAAE,IAAI,EAAE;AAC3D;AACA;AACA,mDAAmD,qBAAqB;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,iCAAiC,SAAS;AAC1C;AACA;AACA,qCAAqC,sBAAsB;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,eAAe,gDAAgD,aAAa,yBAAyB;AACrH,iCAAiC;AACjC,iCAAiC;AACjC,wBAAwB,UAAU;AAClC,4BAA4B,UAAU;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,gCAAgC;AAChC,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iEAAiE,kCAAmB;AACpF,+DAA+D,kCAAmB;AAClF,8DAA8D,kCAAmB;;;;AAIjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,gBAAgB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,gBAAgB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;AACnF,mEAAmE,kCAAmB;AACtF,qEAAqE,kCAAmB;AACxF,oEAAoE,kCAAmB;AACvF,qEAAqE,kCAAmB;;;;;;AAMxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,uBAAuB;AACzD;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,+CAA+C;AAC/C,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,qEAAqE,kCAAmB;AACxF,gEAAgE,kCAAmB;AACnF,kEAAkE,kCAAmB;;;;;AAKrF;AACA;AACA;AACA;AACA;AACA,wBAAwB,8CAA8C;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,sBAAsB;AAChD;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gBAAgB,qCAAqC,IAAI;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,wEAAwE,kCAAmB;;AAE3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,sCAAsC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,iEAAiE,kCAAmB;AACpF,gEAAgE,kCAAmB;AACnF,qEAAqE,kCAAmB;AACxF,uEAAuE,kCAAmB;AAC1F,qEAAqE,kCAAmB;AACxF,mEAAmE,kCAAmB;AACtF,8DAA8D,kCAAmB;AACjF,2EAA2E,kCAAmB;AAC9F,gFAAgF,kCAAmB;AACnG,wEAAwE,kCAAmB;AAC3F,0EAA0E,kCAAmB;AAC7F,4EAA4E,kCAAmB;AAC/F,iEAAiE,kCAAmB;AACpF,iEAAiE,kCAAmB;AACpF,oEAAoE,kCAAmB;AACvF,kEAAkE,kCAAmB;AACrF,+DAA+D,kCAAmB;AAClF,qEAAqE,kCAAmB;AACxF,+DAA+D,kCAAmB;AAClF,oEAAoE,kCAAmB;AACvF,qEAAqE,kCAAmB;AACxF,iEAAiE,kCAAmB;AACpF,oEAAoE,kCAAmB;AACvF,sEAAsE,kCAAmB;AACzF,yEAAyE,kCAAmB;AAC5F,2FAA2F,kCAAmB;AAC9G,mGAAmG,kCAAmB;AACtH,gGAAgG,kCAAmB;AACnH,sGAAsG,kCAAmB;AACzH,6EAA6E,kCAAmB;AAChG,qFAAqF,kCAAmB;AACxG,2FAA2F,kCAAmB;AAC9G,oGAAoG,kCAAmB;AACvH,iFAAiF,kCAAmB;AACpG,oEAAoE,kCAAmB;AACvF,mEAAmE,kCAAmB;AACtF,yEAAyE,kCAAmB;AAC5F,gFAAgF,kCAAmB;AACnG,gFAAgF,kCAAmB;AACnG,oFAAoF,kCAAmB;AACvG,2EAA2E,kCAAmB;AAC9F,gEAAgE,kCAAmB;AACnF,6EAA6E,kCAAmB;AAChG;;;;;;;;AAQA;;;;;;AAMA;;;;;;;;;;;;;;;;;AAiBA;;;AAGA;;;;;;;;AAQA;;;;;;;AAOA;;AAEA;;;;;AAKA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA,aAAa;AACb;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;AACnF,sEAAsE,kCAAmB;;;AAGzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,qBAAqB;AACjF;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA,6DAA6D,SAAS;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,SAAS;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,SAAS;AACvD;AACA;AACA;AACA;AACA,2CAA2C,SAAS;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oEAAoE;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,+BAA+B;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,0BAA0B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oBAAoB;;;AAGrB,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iEAAiE,kCAAmB;AACpF,qEAAqE,kCAAmB;AACxF,kEAAkE,kCAAmB;AACrF,8EAA8E,kCAAmB;;;;;AAKjG;AACA;AACA;AACA,gBAAgB,yCAAyC;AACzD;AACA;AACA;AACA,6BAA6B,iBAAiB;AAC9C,6BAA6B,iBAAiB;AAC9C;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C,8CAA8C;AAC9C,4CAA4C;AAC5C,8CAA8C;AAC9C;AACA,+BAA+B,SAAS;AACxC,+BAA+B,SAAS;AACxC,+BAA+B,SAAS;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,gEAAgE,kCAAmB;AACnF,qEAAqE,kCAAmB;AACxF,sEAAsE,kCAAmB;;;;;AAKzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oBAAoB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB,gBAAgB,kBAAkB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kDAAkD;;;AAGnD,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,sEAAsE,kCAAmB;AACzF,iFAAiF,kCAAmB;;;;AAIpG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,sCAAsC;;;AAGvC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yFAAyF,kCAAmB;;AAE5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;AACnF,iFAAiF,kCAAmB;AACpG,qEAAqE,kCAAmB;AACxF,sEAAsE,kCAAmB;AACzF,qEAAqE,kCAAmB;AACxF,4EAA4E,kCAAmB;AAC/F,wEAAwE,kCAAmB;AAC3F,wEAAwE,kCAAmB;AAC3F,8EAA8E,kCAAmB;AACjG,uEAAuE,kCAAmB;AAC1F,oEAAoE,kCAAmB;AACvF,qEAAqE,kCAAmB;AACxF,qEAAqE,kCAAmB;AACxF,sEAAsE,kCAAmB;;;;;;;;;;;;;;;AAezF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE,SAAS;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,8BAA8B;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,yEAAyE,kCAAmB;;AAE5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,8BAA8B;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oCAAoC;;;AAGrC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+EAA+E,kCAAmB;AAClG,+EAA+E,kCAAmB;AAClG,+EAA+E,kCAAmB;AAClG,oFAAoF,kCAAmB;AACvG,0EAA0E,kCAAmB;AAC7F,0EAA0E,kCAAmB;AAC7F,4FAA4F,kCAAmB;AAC/G,yFAAyF,kCAAmB;;;;;;;AAO5G;AACA;AACA;AACA;AACA,0DAA0D,0BAA0B;AACpF,QAAQ,kBAAkB;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA,uHAAuH,WAAW;AAClI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,qBAAqB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA,8BAA8B,sBAAsB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kCAAkC;;;AAGnC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA,CAAC,wCAAwC;;;AAGzC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,6EAA6E,kCAAmB;AAChG,yEAAyE,kCAAmB;;;;;;;;;;AAU5F,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,uEAAuE,kCAAmB;AAC1F,kEAAkE,kCAAmB;AACrF,uEAAuE,kCAAmB;AAC1F,+DAA+D,kCAAmB;;;;;;AAMlF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,qBAAqB,2BAA2B,wBAAwB;AACpF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4EAA4E,4BAA4B;AACxG,gBAAgB,qDAAqD,IAAI;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,aAAa;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,uBAAuB;AACtC;AACA;AACA;AACA,eAAe,iBAAiB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,cAAc;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,YAAY;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;AACnF,8DAA8D,kCAAmB;AACjF,gEAAgE,kCAAmB;;;;AAInF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,WAAW;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,gBAAgB;AACpE,oDAAoD,gBAAgB;AACpE,oDAAoD,gBAAgB;AACpE,oDAAoD,gBAAgB;AACpE,0DAA0D,UAAU;AACpE,0DAA0D,UAAU;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,cAAc;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG,cAAc,EAAE,cAAc,EAAE,aAAa;AAChD,GAAG,cAAc,EAAE,cAAc,EAAE,aAAa;AAChD;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,8DAA8D,kCAAmB;;AAEjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,OAAO;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,WAAW;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C,4BAA4B,uBAAuB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA,6EAA6E;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gCAAgC;;;AAGjC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;AACnF,qEAAqE,kCAAmB;AACxF,gEAAgE,kCAAmB;AACnF,uEAAuE,kCAAmB;AAC1F,mEAAmE,kCAAmB;AACtF,qEAAqE,kCAAmB;AACxF,gEAAgE,kCAAmB;AACnF,4EAA4E,kCAAmB;AAC/F,sEAAsE,kCAAmB;AACzF,oEAAoE,kCAAmB;AACvF,8DAA8D,kCAAmB;AACjF,+DAA+D,kCAAmB;AAClF,uEAAuE,kCAAmB;AAC1F,+DAA+D,kCAAmB;AAClF,wEAAwE,kCAAmB;;;;;;;;;;;;;;;;;;AAkB3F,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,uEAAuE,kCAAmB;AAC1F,8DAA8D,kCAAmB;;;AAGjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,8DAA8D,kCAAmB;AACjF,gEAAgE,kCAAmB;;;;AAInF;AACA;AACA;AACA;AACA,CAAC,0CAA0C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,WAAW;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc;AACjE,GAAG,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc;AACjE,GAAG,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,cAAc;AAClE,GAAG,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,cAAc;AAClE;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oCAAoC;;;AAGrC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,uEAAuE,kCAAmB;AAC1F,8DAA8D,kCAAmB;AACjF,gEAAgE,kCAAmB;AACnF,qEAAqE,kCAAmB;AACxF,sEAAsE,kCAAmB;;;;;;AAMzF;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,4BAA4B,UAAU;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,4BAA4B,UAAU;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,uEAAuE,kCAAmB;AAC1F,8DAA8D,kCAAmB;;;AAGjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8FAA8F,mBAAmB;AACjH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6EAA6E;AAC7E,iCAAiC,uBAAuB;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,sBAAsB,IAAI,sBAAsB;AACvE;AACA,mBAAmB,OAAO,IAAI,OAAO;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kCAAkC;;;AAGnC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,kCAAmB;AAClF,qEAAqE,kCAAmB;AACxF,mEAAmE,kCAAmB;AACtF,6EAA6E,kCAAmB;AAChG,oFAAoF,kCAAmB;AACvG,qEAAqE,kCAAmB;AACxF,qEAAqE,kCAAmB;AACxF,8DAA8D,kCAAmB;;;;;;;;;AASjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,wEAAwE,GAAG;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,0FAA0F,IAAI;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,mEAAmE,kCAAmB;AACtF,mEAAmE,kCAAmB;AACtF,qEAAqE,kCAAmB;AACxF,qEAAqE,kCAAmB;AACxF,qEAAqE,kCAAmB;;;;;;AAMxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,cAAc;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,QAAQ;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yGAAyG,SAAS;AAClH,2GAA2G,SAAS;AACpH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,kCAAmB;AAClF,qEAAqE,kCAAmB;AACxF,qEAAqE,kCAAmB;AACxF,iFAAiF,kCAAmB;AACpG,mEAAmE,kCAAmB;AACtF,qEAAqE,kCAAmB;AACxF,mEAAmE,kCAAmB;AACtF,yEAAyE,kCAAmB;;;;;;;;;AAS5F;AACA;AACA;AACA,WAAW,gBAAgB;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,gIAAgI;AAChJ;AACA,uJAAuJ;AACvJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA,wEAAwE,sBAAsB,IAAI;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,4EAA4E,IAAI;AAChG,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kCAAkC;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,+BAA+B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,+DAA+D,kCAAmB;AAClF,qEAAqE,kCAAmB;AACxF,6GAA6G,kCAAmB;AAChI,oFAAoF,kCAAmB;AACvG,sFAAsF,kCAAmB;AACzG,+EAA+E,kCAAmB;AAClG,mEAAmE,kCAAmB;AACtF,+EAA+E,kCAAmB;AAClG,8EAA8E,kCAAmB;;;;;;;;;;AAUjG;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA,gBAAgB,uBAAuB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,QAAQ;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+FAA+F,4CAA4C;AAC3I;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,mCAAmC;AAC3C;AACA;AACA;AACA;AACA,QAAQ,kCAAkC;AAC1C;AACA;AACA;AACA,CAAC,8CAA8C;;;AAG/C,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,mEAAmE,kCAAmB;AACtF,yEAAyE,kCAAmB;AAC5F,4EAA4E,kCAAmB;AAC/F,6EAA6E,kCAAmB;;;;;;;;AAQhG,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,uEAAuE,kCAAmB;AAC1F,kEAAkE,kCAAmB;;;AAGrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,wBAAwB,IAAI;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,IAAI;AACjE;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,UAAU,gBAAgB,cAAc;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,aAAa;AACpC;AACA;AACA,sEAAsE,mDAAmD;AACzH;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,8EAA8E,kCAAmB;AACjG,4EAA4E,kCAAmB;AAC/F,8EAA8E,kCAAmB;;;;;AAKjG;AACA,QAAQ,kBAAkB;AAC1B,IAAI,kBAAkB,OAAO,mBAAmB,mCAAmC;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF,SAAS;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,oBAAoB,QAAQ;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,OAAO;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,OAAO;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,wBAAwB,UAAU;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,eAAe;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,aAAa;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;AACA,oDAAoD,aAAa;AACjE;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D;AAC/D,yDAAyD;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,UAAU;AAC7C,oDAAoD,cAAc;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,6BAA6B;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,MAAM,IAAI,MAAM,IAAI,MAAM;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,qEAAqE,kCAAmB;AACxF,6DAA6D,kCAAmB;AAChF,8DAA8D,kCAAmB;;;;;;;AAOjF,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,sEAAsE,kCAAmB;;;AAGzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,mBAAmB;AAC3B,6DAA6D,mBAAmB;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yGAAyG,UAAU;AACnH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,SAAS;AACT;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA,sBAAsB;AACtB,+DAA+D,kCAAmB;AAClF,sEAAsE,kCAAmB;AACzF,0EAA0E,kCAAmB;;;;;;AAM7F,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,wFAAwF,kCAAmB;AAC3G,kEAAkE,kCAAmB;AACrF,0EAA0E,kCAAmB;AAC7F,sEAAsE,kCAAmB;AACzF,4EAA4E,kCAAmB;AAC/F,oEAAoE,kCAAmB;AACvF,kEAAkE,kCAAmB;AACrF,sEAAsE,kCAAmB;;;;;;;;;AASzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,gBAAgB;AACxB,mDAAmD,gBAAgB,OAAO;AAC1E,sCAAsC,iBAAiB;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,WAAW;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,gBAAgB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,2EAA2E,kCAAmB;AAC9F,mEAAmE,kCAAmB;AACtF,sEAAsE,kCAAmB;AACzF,qEAAqE,kCAAmB;;;;;AAKxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,MAAM;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,+BAA+B,IAAI;AACnC;AACA;AACA;AACA;AACA;AACA,uDAAuD;AACvD;AACA;AACA;AACA,qBAAqB;AACrB;AACA,iBAAiB;AACjB;AACA,gCAAgC,2BAA2B;AAC3D;AACA;AACA,qBAAqB;AACrB;AACA,iBAAiB;AACjB;AACA,gCAAgC,MAAM;AACtC;AACA;AACA;AACA,qBAAqB;AACrB;AACA,iBAAiB;AACjB;AACA,gCAAgC,MAAM;AACtC;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,sBAAsB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA,sBAAsB;AACtB,wEAAwE,kCAAmB;AAC3F,iEAAiE,kCAAmB;AACpF,kEAAkE,kCAAmB;AACrF,gEAAgE,kCAAmB;AACnF,iEAAiE,kCAAmB;AACpF,gEAAgE,kCAAmB;AACnF,+DAA+D,kCAAmB;AAClF,oEAAoE,kCAAmB;AACvF,iEAAiE,kCAAmB;AACpF,uFAAuF,kCAAmB;AAC1G,qFAAqF,kCAAmB;AACxG,iFAAiF,kCAAmB;AACpG,oFAAoF,kCAAmB;AACvG,uFAAuF,kCAAmB;AAC1G,kFAAkF,kCAAmB;AACrG,4EAA4E,kCAAmB;AAC/F,8EAA8E,kCAAmB;AACjG,+EAA+E,kCAAmB;AAClG,wFAAwF,kCAAmB;AAC3G,mFAAmF,kCAAmB;AACtG,gFAAgF,kCAAmB;AACnG,sEAAsE,kCAAmB;AACzF,0EAA0E,kCAAmB;AAC7F,6EAA6E,kCAAmB;AAChG,iFAAiF,kCAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BpG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,2BAA2B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,YAAY,iBAAiB;AAC7B;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,oCAAoC;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,eAAe;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wGAAwG,IAAI;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yGAAyG,IAAI;AAC7G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sGAAsG,IAAI;AAC1G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uGAAuG,IAAI;AAC3G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,gBAAgB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kFAAkF,kFAAkF;AACpK;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E,sIAAsI;AAChN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,sBAAsB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,uBAAuB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,oBAAoB;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,qBAAqB;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE,gBAAgB;AACtF;AACA;AACA;AACA;AACA;AACA;AACA,qFAAqF,kFAAkF;AACvK;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,SAAS;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,gBAAgB;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4EAA4E,gBAAgB;AAC5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,gBAAgB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,iBAAiB,mCAAmC,gBAAgB;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oFAAoF,gBAAgB;AACpG;AACA;AACA;AACA;AACA,yCAAyC,gBAAgB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,QAAQ;AACvD;AACA;AACA,6CAA6C,QAAQ;AACrD;AACA;AACA;AACA;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,gBAAgB;AAClC,uCAAuC,sBAAsB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,eAAe;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA,4BAA4B,2BAA2B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,kEAAkE,kCAAmB;AACrF,yEAAyE,kCAAmB;AAC5F,mEAAmE,kCAAmB;AACtF,wGAAwG,kCAAmB;AAC3H,2GAA2G,kCAAmB;AAC9H,sEAAsE,kCAAmB;;;;;;;;AAQzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oGAAoG;AACpG;AACA;AACA;AACA;AACA;AACA,qGAAqG;AACrG;AACA;AACA;AACA;AACA;AACA,uDAAuD,sBAAsB;AAC7E;AACA;AACA,YAAY,6BAA6B;AACzC;AACA;AACA;AACA;AACA,uDAAuD,mBAAmB;AAC1E;AACA;AACA,YAAY,6BAA6B;AACzC;AACA;AACA;AACA;AACA,gCAAgC,8BAA8B;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6EAA6E;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kCAAkC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,uFAAuF;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+FAA+F,wBAAwB;AACvH;AACA;AACA,6FAA6F,YAAY;AACzG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,8EAA8E,sBAAsB,GAAG,uBAAuB,qBAAqB,gBAAgB;AACnK;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,eAAe;AAClH;AACA;AACA;AACA,sEAAsE,gBAAgB;AACtF,8CAA8C,gBAAgB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,8BAA8B,8BAA8B;AACzF,qDAAqD,gBAAgB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,4CAA4C,KAAK,8BAA8B,MAAM,4BAA4B;AAC/I;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,oCAAoC;AACpD;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,+DAA+D,kCAAmB;AAClF,6GAA6G,kCAAmB;AAChI,iFAAiF,kCAAmB;AACpG,0EAA0E,kCAAmB;;;;;;AAM7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,gBAAgB;AAC3B;AACA;AACA;AACA;AACA;AACA,gBAAgB,WAAW;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yFAAyF,kCAAmB;;AAE5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,sFAAsF,kCAAmB;AACzG,6GAA6G,kCAAmB;AAChI,kFAAkF,kCAAmB;AACrG,+EAA+E,kCAAmB;;;;;AAKlG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gCAAgC;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,iFAAiF,kCAAmB;AACpG,+EAA+E,kCAAmB;AAClG,qFAAqF,kCAAmB;AACxG,iFAAiF,kCAAmB;AACpG,gGAAgG,kCAAmB;AACnH,qEAAqE,kCAAmB;AACxF,6GAA6G,kCAAmB;AAChI,sFAAsF,kCAAmB;AACzG,kEAAkE,kCAAmB;AACrF,mEAAmE,kCAAmB;AACtF,kFAAkF,kCAAmB;AACrG,iFAAiF,kCAAmB;AACpG,sEAAsE,kCAAmB;AACzF,gGAAgG,kCAAmB;;;;;;;;;;;;;;AAcnH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,qBAAqB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,wBAAwB;AACnE;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,8GAA8G;AAC9H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,YAAY;AACpC,4BAA4B,WAAW;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sHAAsH;AACtH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,wBAAwB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,wBAAwB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,2GAA2G;AAC3H,gBAAgB,sDAAsD;AACtE;AACA;AACA;AACA,4BAA4B,mBAAmB;AAC/C;AACA;AACA;AACA;AACA,4BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,4DAA4D;AACzH;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,gFAAgF,kCAAmB;AACnG,qEAAqE,kCAAmB;AACxF,kEAAkE,kCAAmB;AACrF,sFAAsF,kCAAmB;AACzG,6GAA6G,kCAAmB;AAChI,iFAAiF,kCAAmB;AACpG,iFAAiF,kCAAmB;AACpG,oFAAoF,kCAAmB;AACvG,kEAAkE,kCAAmB;AACrF,mEAAmE,kCAAmB;AACtF,0GAA0G,kCAAmB;AAC7H,sFAAsF,kCAAmB;AACzG,yFAAyF,kCAAmB;AAC5G,iEAAiE,kCAAmB;AACpF,sEAAsE,kCAAmB;AACzF,2EAA2E,kCAAmB;AAC9F,oEAAoE,kCAAmB;AACvF,iFAAiF,kCAAmB;AACpG,gGAAgG,kCAAmB;;;;;;;;;;;;;;;;;;;AAmBnH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C,4BAA4B,eAAe;AAC3C;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,QAAQ;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA,4BAA4B,eAAe;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,eAAe;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,eAAe;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,eAAe;AACnC;AACA;AACA;AACA,gBAAgB,OAAO;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,eAAe;AAChD,qCAAqC,eAAe;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,eAAe;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0GAA0G;AAC1G;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA,mEAAmE,6BAA6B;AAChG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,4IAA4I;AAC5J,gBAAgB,sDAAsD;AACtE;AACA;AACA;AACA;AACA,4BAA4B,mBAAmB;AAC/C;AACA;AACA;AACA,4BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,4DAA4D;AACrH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,uBAAuB;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,iBAAiB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,kBAAkB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,eAAe;AACrD;AACA,kCAAkC,qBAAqB;AACvD;AACA,sBAAsB,qBAAqB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,iEAAiE,kCAAmB;AACpF,sEAAsE,kCAAmB;AACzF,kFAAkF,kCAAmB;AACrG,+EAA+E,kCAAmB;;;;;;;AAOlG,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,qEAAqE,kCAAmB;;;AAGxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;AACnF,iFAAiF,kCAAmB;AACpG,+DAA+D,kCAAmB;AAClF,sEAAsE,kCAAmB;;;;;AAKzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,0BAA0B;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,YAAY;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,iBAAiB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,0CAA0C,iBAAiB;AAC3D;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA,QAAQ,IAAI;AACZ;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,6DAA6D,kCAAmB;;;AAGhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,QAAQ;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,wBAAwB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iEAAiE,kCAAmB;AACpF,gEAAgE,kCAAmB;AACnF,6DAA6D,kCAAmB;;;;AAIhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG;AACnG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E,IAAI;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,cAAc;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA,KAAK;AACL;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,+DAA+D,kCAAmB;AAClF,6DAA6D,kCAAmB;;;AAGhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,kBAAkB,EAAE,mCAAmC,EAAE,yBAAyB;AACrH,2BAA2B,iBAAiB,sBAAsB,gBAAgB;AAClF,+CAA+C,yBAAyB;AACxE;AACA;AACA;AACA;AACA,sCAAsC,gBAAgB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6DAA6D,kCAAmB;;AAEhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,oCAAoC;AAC9E;AACA;AACA;AACA,uCAAuC;AACvC,8CAA8C;AAC9C,gDAAgD;AAChD;AACA;AACA,uCAAuC;AACvC,8CAA8C;AAC9C,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,+DAA+D,kCAAmB;;AAElF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,uBAAuB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,gBAAgB;AACtC,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;;AAExF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;AAGD,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,8DAA8D,kCAAmB;AACjF,6DAA6D,kCAAmB;AAChF,oEAAoE,kCAAmB;AACvF,yEAAyE,kCAAmB;AAC5F,kEAAkE,kCAAmB;;;;;;;;;AASrF,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,+DAA+D,kCAAmB;AAClF;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4BAA4B;AAC7B;AACA;AACA,oCAAoC,0BAA0B,KAAK,wBAAwB;AAC3F,gBAAgB,mBAAmB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,mBAAmB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,yBAAyB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,yBAAyB;AAClE;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,wBAAwB;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,wBAAwB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,wBAAwB;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,wBAAwB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,yBAAyB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,yBAAyB;AAClE;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,yBAAyB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,yBAAyB;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA,wBAAwB,yBAAyB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;;AAErF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,YAAY;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6DAA6D,kCAAmB;;AAEhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE,WAAW,0DAA0D,gBAAgB;AACtJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0GAA0G,6CAA6C;AACvJ;AACA;AACA;AACA;AACA;AACA,mIAAmI,0DAA0D;AAC7L;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;;AAExF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,gEAAgE,kCAAmB;;;AAGnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,WAAW;AACvD;AACA;AACA;AACA;AACA,wCAAwC,oBAAoB;AAC5D;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,sFAAsF,kCAAmB;AACzG,6DAA6D,kCAAmB;;;AAGhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,aAAa;AACb;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,+DAA+D,kCAAmB;AAClF,4DAA4D,kCAAmB;AAC/E,gEAAgE,kCAAmB;AACnF,0EAA0E,kCAAmB;AAC7F,gEAAgE,kCAAmB;AACnF,+DAA+D,kCAAmB;AAClF,oEAAoE,kCAAmB;AACvF,gEAAgE,kCAAmB;AACnF,qEAAqE,kCAAmB;AACxF,uEAAuE,kCAAmB;AAC1F,6EAA6E,kCAAmB;AAChG,iEAAiE,kCAAmB;AACpF,gEAAgE,kCAAmB;AACnF,8EAA8E,kCAAmB;AACjG,0EAA0E,kCAAmB;AAC7F,gEAAgE,kCAAmB;AACnF,wEAAwE,kCAAmB;AAC3F,gEAAgE,kCAAmB;AACnF,kEAAkE,kCAAmB;AACrF,wEAAwE,kCAAmB;AAC3F,wEAAwE,kCAAmB;AAC3F,0EAA0E,kCAAmB;AAC7F,2EAA2E,kCAAmB;AAC9F,0EAA0E,kCAAmB;AAC7F,sFAAsF,kCAAmB;AACzG,yEAAyE,kCAAmB;AAC5F,gEAAgE,kCAAmB;AACnF,yEAAyE,kCAAmB;AAC5F,2EAA2E,kCAAmB;AAC9F,6EAA6E,kCAAmB;AAChG,+EAA+E,kCAAmB;AAClG,8EAA8E,kCAAmB;AACjG,oFAAoF,kCAAmB;AACvG,qFAAqF,kCAAmB;AACxG,mFAAmF,kCAAmB;AACtG,iFAAiF,kCAAmB;AACpG,8EAA8E,kCAAmB;AACjG,4EAA4E,kCAAmB;AAC/F,6EAA6E,kCAAmB;AAChG,wEAAwE,kCAAmB;AAC3F,yEAAyE,kCAAmB;AAC5F,0EAA0E,kCAAmB;AAC7F,4EAA4E,kCAAmB;AAC/F,qEAAqE,kCAAmB;AACxF,uEAAuE,kCAAmB;AAC1F,0EAA0E,kCAAmB;AAC7F,wEAAwE,kCAAmB;AAC3F,+EAA+E,kCAAmB;AAClG,0EAA0E,kCAAmB;AAC7F,mEAAmE,kCAAmB;AACtF,oEAAoE,kCAAmB;AACvF,mEAAmE,kCAAmB;AACtF,qEAAqE,kCAAmB;AACxF,wEAAwE,kCAAmB;AAC3F,uEAAuE,kCAAmB;AAC1F,4EAA4E,kCAAmB;AAC/F,sEAAsE,kCAAmB;AACzF,yEAAyE,kCAAmB;AAC5F,yEAAyE,kCAAmB;AAC5F,sEAAsE,kCAAmB;AACzF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA;;;;;;;;;;;;;;;;;;AAkBA;;;;;;;;;;;;;;;;;;;AAmBA;AACA;AACA,YAAY;AACZ;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iFAAiF;;AAEjF,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iFAAiF;;AAEjF,OAAO;;AAEP,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,kBAAkB,kCAAmB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE,kCAAmB;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,kCAAmB;AAC7B;AACA;AACA;AACA,WAAW,kCAAmB,aAAa,WAAW;AACtD;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU,kCAAmB;AAC7B;AACA,eAAe,kCAAmB,wBAAwB,kCAAmB;AAC7E,mDAAmD,wCAAwC;AAC3F;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU,kCAAmB;AAC7B,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU,kCAAmB;AAC7B;AACA,iEAAiE,iBAAiB;AAClF;AACA,0DAA0D,aAAa;AACvE;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,0BAAmB,GAAG,kCAAmB;AACtD,sDAAsD,0BAAmB;AACzE,gDAAgD,0BAAmB;AACnE,8CAA8C,0BAAmB;AACjE,iDAAiD,0BAAmB;AACpE,mDAAmD,0BAAmB;AACtE,mDAAmD,0BAAmB;AACtE,gDAAgD,0BAAmB;AACnE,gDAAgD,0BAAmB;AACnE,wCAAwC,0BAAmB;AAC3D,8CAA8C,0BAAmB;AACjE,2CAA2C,0BAAmB;AAC9D,iDAAiD,0BAAmB;AACpE,+CAA+C,0BAAmB;AAClE,4CAA4C,0BAAmB;AAC/D,qDAAqD,0BAAmB;AACxE,kDAAkD,0BAAmB;AACrE,oDAAoD,0BAAmB;AACvE,+CAA+C,0BAAmB;AAClE,sDAAsD,0BAAmB;AACzE,uCAAuC,0BAAmB;AAC1D,uCAAuC,0BAAmB;AAC1D,4CAA4C,0BAAmB;AAC/D,8CAA8C,0BAAmB;AACjE,wCAAwC,0BAAmB;AAC3D,gDAAgD,0BAAmB;AACnE,8CAA8C,0BAAmB;AACjE,mDAAmD,0BAAmB;AACtE,gDAAgD,0BAAmB;AACnE,0CAA0C,0BAAmB;AAC7D,yCAAyC,0BAAmB;AAC5D,+CAA+C,0BAAmB;AAClE,yCAAyC,0BAAmB;AAC5D,yCAAyC,0BAAmB;AAC5D,iDAAiD,0BAAmB;AACpE,wCAAwC,0BAAmB;AAC3D,uDAAuD,0BAAmB;AAC1E,2CAA2C,0BAAmB;AAC9D,oDAAoD,0BAAmB;AACvE,mDAAmD,0BAAmB;AACtE,oDAAoD,0BAAmB;AACvE,iDAAiD,0BAAmB;AACpE,wDAAwD,0BAAmB;AAC3E,qDAAqD,0BAAmB;AACxE,0DAA0D,0BAAmB;AAC7E,yDAAyD,0BAAmB;AAC5E,sDAAsD,0BAAmB;AACzE,kDAAkD,0BAAmB;AACrE,gDAAgD,0BAAmB;AACnE,wCAAwC,0BAAmB;AAC3D,kDAAkD,0BAAmB;AACrE,qDAAqD,0BAAmB;AACxE,8DAA8D,0BAAmB;AACjF,4CAA4C,0BAAmB;AAC/D,oDAAoD,0BAAmB;AACvE,kDAAkD,0BAAmB;AACrE,yDAAyD,0BAAmB;AAC5E,kDAAkD,0BAAmB;AACrE,mDAAmD,0BAAmB;AACtE,oDAAoD,0BAAmB;AACvE,6CAA6C,0BAAmB;AAChE,4CAA4C,0BAAmB;AAC/D,0CAA0C,0BAAmB;AAC7D,0CAA0C,0BAAmB;AAC7D,kDAAkD,0BAAmB;AACrE,wCAAwC,0BAAmB;AAC3D,8CAA8C,0BAAmB;AACjE,yDAAyD,0BAAmB;AAC5E,8CAA8C,0BAAmB;AACjE,4CAA4C,0BAAmB;AAC/D,0DAA0D,0BAAmB;AAC7E,kEAAkE,0BAAmB;AACrF,gDAAgD,0BAAmB;AACnE,yDAAyD,0BAAmB;AAC5E,kDAAkD,0BAAmB;AACrE,wCAAwC,0BAAmB;AAC3D,2CAA2C,0BAAmB;AAC9D,sCAAsC,0BAAmB;AACzD,4CAA4C,0BAAmB;AAC/D,2CAA2C,0BAAmB;AAC9D,iDAAiD,0BAAmB;AACpE,8CAA8C,0BAAmB;AACjE,8CAA8C,0BAAmB;AACjE,gEAAgE,0BAAmB;AACnF,6CAA6C,0BAAmB;AAChE,yCAAyC,0BAAmB;AAC5D,yCAAyC,0BAAmB;AAC5D,kDAAkD,0BAAmB;AACrE,+CAA+C,0BAAmB;AAClE,yDAAyD,0BAAmB;AAC5E,8CAA8C,0BAAmB;AACjE,yCAAyC,0BAAmB;AAC5D,+CAA+C,0BAAmB;AAClE,oDAAoD,0BAAmB;AACvE,qDAAqD,0BAAmB;AACxE,yCAAyC,0BAAmB;AAC5D,+CAA+C,0BAAmB;AAClE,gDAAgD,0BAAmB;AACnE,+CAA+C,0BAAmB;AAClE,6CAA6C,0BAAmB;AAChE,yCAAyC,0BAAmB;AAC5D,6CAA6C,0BAAmB;AAChE,mEAAmE,0BAAmB;AACtF,gEAAgE,0BAAmB;AACnF,mDAAmD,0BAAmB;AACtE,oDAAoD,0BAAmB;AACvE,uCAAuC,0BAAmB;AAC1D,4CAA4C,0BAAmB;AAC/D,wCAAwC,0BAAmB;AAC3D,wCAAwC,0BAAmB;AAC3D,yCAAyC,0BAAmB;AAC5D,uCAAuC,0BAAmB;AAC1D,4CAA4C,0BAAmB;AAC/D,6CAA6C,0BAAmB;AAChE,4CAA4C,0BAAmB;AAC/D,2CAA2C,0BAAmB;AAC9D,6CAA6C,0BAAmB;AAChE,6CAA6C,0BAAmB;AAChE,yCAAyC,0BAAmB;AAC5D,4CAA4C,0BAAmB;AAC/D,iDAAiD,0BAAmB;AACpE,gDAAgD,0BAAmB;AACnE,0CAA0C,0BAAmB;AAC7D,mDAAmD,0BAAmB;AACtE,qDAAqD,0BAAmB;AACxE,sDAAsD,0BAAmB;AACzE,yDAAyD,0BAAmB;AAC5E,2CAA2C,0BAAmB;AAC9D,mDAAmD,0BAAmB;AACtE,sCAAsC,0BAAmB;AACzD,4CAA4C,0BAAmB;AAC/D,oDAAoD,0BAAmB;AACvE,qDAAqD,0BAAmB;AACxE,sDAAsD,0BAAmB;AACzE,0CAA0C,0BAAmB;AAC7D,oDAAoD,0BAAmB;AACvE,gDAAgD,0BAAmB;AACnE,iDAAiD,0BAAmB;AACpE,oDAAoD,0BAAmB;AACvE,+CAA+C,0BAAmB;AAClE,gDAAgD,0BAAmB;AACnE,8CAA8C,0BAAmB;AACjE,kDAAkD,0BAAmB;AACrE,iDAAiD,0BAAmB;AACpE,8CAA8C,0BAAmB;AACjE,gEAAgE,0BAAmB;AACnF,gDAAgD,0BAAmB;AACnE,kDAAkD,0BAAmB;AACrE,4CAA4C,0BAAmB;AAC/D,8CAA8C,0BAAmB;AACjE,2DAA2D,0BAAmB;AAC9E,wDAAwD,0BAAmB;AAC3E,+CAA+C,0BAAmB;AAClE,gDAAgD,0BAAmB;AACnE,2CAA2C,0BAAmB;AAC9D,2CAA2C,0BAAmB;AAC9D,uCAAuC,0BAAmB;AAC1D,4CAA4C,0BAAmB;AAC/D,wCAAwC,0BAAmB;AAC3D,4DAA4D,0BAAmB;AAC/E,uCAAuC,0BAAmB;AAC1D,8CAA8C,0BAAmB;AACjE,yCAAyC,0BAAmB;AAC5D,+CAA+C,0BAAmB;AAClE,gEAAgE,0BAAmB;AACnF,4DAA4D,0BAAmB;AAC/E,2CAA2C,0BAAmB;AAC9D,yCAAyC,0BAAmB;AAC5D,2CAA2C,0BAAmB;AAC9D,yCAAyC,0BAAmB;AAC5D,kDAAkD,0BAAmB;AACrE,6CAA6C,0BAAmB;AAChE,uCAAuC,0BAAmB;AAC1D,kDAAkD,0BAAmB;AACrE,+CAA+C,0BAAmB;AAClE,yCAAyC,0BAAmB;AAC5D,oDAAoD,0BAAmB;AACvE,yCAAyC,0BAAmB;AAC5D,oDAAoD,0BAAmB;AACvE,sDAAsD,0BAAmB;AACzE,mDAAmD,0BAAmB;AACtE,4DAA4D,0BAAmB;AAC/E,4CAA4C,0BAAmB;AAC/D,mDAAmD,0BAAmB;AACtE,uCAAuC,0BAAmB;AAC1D,6CAA6C,0BAAmB;AAChE,kDAAkD,0BAAmB;AACrE,uCAAuC,0BAAmB;AAC1D,oDAAoD,0BAAmB;AACvE,kDAAkD,0BAAmB;AACrE,2CAA2C,0BAAmB;AAC9D,kDAAkD,0BAAmB;AACrE,mDAAmD,0BAAmB;AACtE,oDAAoD,0BAAmB;AACvE,+CAA+C,0BAAmB;AAClE,+CAA+C,0BAAmB;AAClE,qDAAqD,0BAAmB;AACxE,gDAAgD,0BAAmB;AACnE,mDAAmD,0BAAmB;AACtE,+CAA+C,0BAAmB;AAClE,uDAAuD,0BAAmB;AAC1E,+CAA+C,0BAAmB;AAClE,gDAAgD,0BAAmB;AACnE,8CAA8C,0BAAmB;AACjE,0CAA0C,0BAAmB;AAC7D,kDAAkD,0BAAmB;AACrE,uCAAuC,0BAAmB;AAC1D,qDAAqD,0BAAmB;AACxE,qDAAqD,0BAAmB;AACxE,gDAAgD,0BAAmB;AACnE,iDAAiD,0BAAmB;AACpE,gDAAgD,0BAAmB;AACnE,yDAAyD,0BAAmB;AAC5E,kDAAkD,0BAAmB;AACrE,oDAAoD,0BAAmB;AACvE,oDAAoD,0BAAmB;AACvE,+CAA+C,0BAAmB;AAClE,gDAAgD,0BAAmB;AACnE,+CAA+C,0BAAmB;AAClE,+CAA+C,0BAAmB;AAClE,wDAAwD,0BAAmB;AAC3E,iDAAiD,0BAAmB;AACpE,6CAA6C,0BAAmB;AAChE,kDAAkD,0BAAmB;AACrE,2CAA2C,0BAAmB;AAC9D,wCAAwC,0BAAmB;AAC3D,+CAA+C,0BAAmB;AAClE,4DAA4D,0BAAmB;AAC/E,yCAAyC,0BAAmB;AAC5D,yCAAyC,0BAAmB;AAC5D,sCAAsC,0BAAmB;AACzD,kDAAkD,0BAAmB;AACrE,4CAA4C,0BAAmB;AAC/D,8CAA8C,0BAAmB;AACjE,mDAAmD,0BAAmB;AACtE,yCAAyC,0BAAmB;AAC5D,gDAAgD,0BAAmB;AACnE,6CAA6C,0BAAmB;AAChE,2CAA2C,0BAAmB;AAC9D,iDAAiD,0BAAmB;AACpE,2CAA2C,0BAAmB;AAC9D,sDAAsD,0BAAmB;AACzE,2CAA2C,0BAAmB;AAC9D,sDAAsD,0BAAmB;AACzE,+CAA+C,0BAAmB;AAClE,0CAA0C,0BAAmB;AAC7D,qDAAqD,0BAAmB;AACxE,0CAA0C,0BAAmB;AAC7D,qDAAqD,0BAAmB;AACxE,wCAAwC,0BAAmB;AAC3D,8CAA8C,0BAAmB;AACjE,yCAAyC,0BAAmB;AAC5D,iDAAiD,0BAAmB;AACpE,gDAAgD,0BAAmB;AACnE,+CAA+C,0BAAmB;AAClE,+CAA+C,0BAAmB;AAClE,uDAAuD,0BAAmB;AAC1E,4CAA4C,0BAAmB;AAC/D,iDAAiD,0BAAmB;AACpE,iDAAiD,0BAAmB;AACpE,yCAAyC,0BAAmB;AAC5D,wCAAwC,0BAAmB;AAC3D,uCAAuC,0BAAmB;AAC1D,wCAAwC,0BAAmB;AAC3D,iDAAiD,0BAAmB;AACpE,wCAAwC,0BAAmB;AAC3D,8CAA8C,0BAAmB;AACjE,iDAAiD,0BAAmB;AACpE,mEAAmE,0BAAmB;AACtF,2DAA2D,0BAAmB;AAC9E,yCAAyC,0BAAmB;AAC5D,6CAA6C,0BAAmB;AAChE,8CAA8C,0BAAmB;AACjE,gDAAgD,0BAAmB;AACnE,+CAA+C,0BAAmB;AAClE,oDAAoD,0BAAmB;AACvE,yCAAyC,0BAAmB;AAC5D,yCAAyC,0BAAmB;AAC5D,gDAAgD,0BAAmB;AACnE,iDAAiD,0BAAmB;AACpE,6CAA6C,0BAAmB;AAChE,2CAA2C,0BAAmB;AAC9D,4CAA4C,0BAAmB;AAC/D,uCAAuC,0BAAmB;AAC1D,4CAA4C,0BAAmB;AAC/D,gDAAgD,0BAAmB;AACnE,uCAAuC,0BAAmB;AAC1D,0CAA0C,0BAAmB;AAC7D,gDAAgD,0BAAmB;AACnE,iDAAiD,0BAAmB;AACpE,8CAA8C,0BAAmB;AACjE,wCAAwC,0BAAmB;AAC3D,0CAA0C,0BAAmB;AAC7D,4CAA4C,0BAAmB;AAC/D,qDAAqD,0BAAmB;AACxE,6CAA6C,0BAAmB;AAChE,2CAA2C,0BAAmB;AAC9D,0CAA0C,0BAAmB;AAC7D,gDAAgD,0BAAmB;AACnE,wCAAwC,0BAAmB;AAC3D,uCAAuC,0BAAmB;AAC1D,yCAAyC,0BAAmB;AAC5D,6CAA6C,0BAAmB;AAChE,+CAA+C,0BAAmB;AAClE,+CAA+C,0BAAmB;AAClE,gDAAgD,0BAAmB;AACnE,+CAA+C,0BAAmB;AAClE,2CAA2C,0BAAmB;AAC9D,mDAAmD,0BAAmB;AACtE,iDAAiD,0BAAmB;AACpE,6CAA6C,0BAAmB;AAChE,wCAAwC,0BAAmB;AAC3D,qDAAqD,0BAAmB;AACxE,yCAAyC,0BAAmB;AAC5D,oDAAoD,0BAAmB;AACvE,wCAAwC,0BAAmB;AAC3D,4CAA4C,0BAAmB;AAC/D,2CAA2C,0BAAmB;AAC9D,uCAAuC,0BAAmB;AAC1D,0DAA0D,0BAAmB;AAC7E,kDAAkD,0BAAmB;AACrE,2CAA2C,0BAAmB;AAC9D,kDAAkD,0BAAmB;AACrE,kDAAkD,0BAAmB;AACrE,iDAAiD,0BAAmB;AACpE,8CAA8C,0BAAmB;AACjE,8CAA8C,0BAAmB;AACjE,6CAA6C,0BAAmB;AAChE,0CAA0C,0BAAmB;AAC7D,iDAAiD,0BAAmB;AACpE,iDAAiD,0BAAmB;AACpE,gDAAgD,0BAAmB;AACnE,6CAA6C,0BAAmB;AAChE,8CAA8C,0BAAmB;AACjE,oDAAoD,0BAAmB;AACvE,0CAA0C,0BAAmB;AAC7D,mDAAmD,0BAAmB;AACtE,kDAAkD,0BAAmB;AACrE,sDAAsD,0BAAmB;AACzE,kDAAkD,0BAAmB;AACrE,kDAAkD,0BAAmB;AACrE,qDAAqD,0BAAmB;AACxE,oDAAoD,0BAAmB;AACvE,oDAAoD,0BAAmB;AACvE,mDAAmD,0BAAmB;AACtE,mDAAmD,0BAAmB;AACtE,qDAAqD,0BAAmB;AACxE,kDAAkD,0BAAmB;AACrE,sDAAsD,0BAAmB;AACzE,uCAAuC,0BAAmB;AAC1D,4CAA4C,0BAAmB;AAC/D,6CAA6C,0BAAmB;AAChE,8CAA8C,0BAAmB;AACjE,+CAA+C,0BAAmB;AAClE,2CAA2C,0BAAmB;AAC9D,sDAAsD,0BAAmB;AACzE,qDAAqD,0BAAmB;AACxE,mDAAmD,0BAAmB;AACtE,gDAAgD,0BAAmB;AACnE,mDAAmD,0BAAmB;AACtE,wCAAwC,0BAAmB;AAC3D,wCAAwC,0BAAmB;AAC3D,8CAA8C,0BAAmB;AACjE,uDAAuD,0BAAmB;AAC1E,uCAAuC,0BAAmB;AAC1D,4CAA4C,0BAAmB;AAC/D,4CAA4C,0BAAmB;AAC/D,sCAAsC,0BAAmB;AACzD,wCAAwC,0BAAmB;AAC3D,SAAi5jB;AACj5jB;;AAEA;;;;;;;;;;;;;;;;;ACv4xCgE;AACjB;AAExC,MAAM,SAAS,GAAG;IACrB,kBAAkB,EAAE,IAAI,kDAAW,CAAC,qFAAqF,CAAC;IAC1H,YAAY,EAAE,IAAI,yDAAY,CAAC,wCAAwC,EAAE;QACrE,wBAAwB,EAAE,IAAI;QAC9B,qBAAqB,EAAE,IAAI;KAC9B,CAAC;IACF,YAAY,EAAE,IAAI,yDAAY,CAAC,0BAA0B,EAAE;QACvD,qBAAqB,EAAE,IAAI;KAC9B,CAAC;IACF,gBAAgB,EAAE,IAAI,yDAAY,CAAC,oBAAoB,EAAE;QACrD,qBAAqB,EAAE,IAAI;KAC9B,CAAC;CACI,CAAC;AAGJ,MAAM,MAAM,GAAG,IAAI,6CAAM,EAAE,CAAC;AACnC,KAAK,IAAI,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;IAC5C,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;AACjC,CAAC;;;;;;;;;;;;;;;;ACrBsD;AAKhD,MAAM,WAAW;IAMpB,YAAY,KAAY,EAAkB,SAA4B,EAAU,QAAsB,EAAkB,KAAa;;QAA3F,cAAS,GAAT,SAAS,CAAmB;QAAU,aAAQ,GAAR,QAAQ,CAAc;QAAkB,UAAK,GAAL,KAAK,CAAQ;QAH9H,aAAQ,GAAa,EAAE,CAAC;QACxB,iBAAY,GAAG,IAAI,GAAG,EAA8B,CAAC;QACrD,iBAAY,GAAG,IAAI,GAAG,EAA8B,CAAC;QAExD,IAAI,CAAC,QAAQ,GAAG,8CAAG,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACpE,IAAI,CAAC,MAAM,GAAG,8CAAG,CAAC,SAAS,CAAC,gBAAgB,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC1E,IAAI,SAAS,CAAC,eAAe,EAAE,CAAC;YAC5B,KAAK,IAAI,MAAM,IAAI,SAAS,CAAC,eAAe,EAAE,CAAC;gBAC3C,MAAM,cAAc,GAAG,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;oBACnE,OAAO,CAAC,CAAC,UAAU,KAAK,MAAM,CAAC,YAAY;gBAC/C,CAAC,CAAC,CAAC;gBAEH,IAAI,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;oBAC9C,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;oBAC5D,IAAI,OAAO,EAAE,CAAC;wBACV,MAAM,SAAS,GAAG,OAAO,CAAC;4BACtB,IAAI,EAAE,MAAM,CAAC,YAAY;4BACzB,QAAQ,EAAE,8CAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;4BAC7E,MAAM;4BACN,UAAU,EAAE,cAAc;4BAC1B,KAAK,EAAE,IAAI;yBACd,CAAC,CAAC;wBACH,IAAI,SAAS,EAAE,CAAC;4BACZ,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;4BAC9B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;4BACzC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;wBAC7C,CAAC;oBACL,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACJ,MAAM,KAAK,GAAG,IAAI,4CAAK,CAAC;wBACpB,IAAI,EAAE,MAAM,CAAC,YAAY;wBACzB,GAAG,EAAE,8CAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;wBACxE,KAAK,EAAE,MAAM,CAAC,KAAK;wBACnB,MAAM,EAAE,MAAM,CAAC,MAAM;wBACrB,MAAM,EAAE,8CAAG,CAAC,oBAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,MAAM,mCAAI,CAAC,EAAE,oBAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,MAAM,mCAAI,CAAC,CAAC;wBACrE,CAAC,EAAE,KAAK;qBACX,CAAC,CAAC;oBACH,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;wBAChB,MAAM,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;wBAC3D,IAAI,EAAE,EAAE,CAAC;4BACL,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;4BAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;4BAC/D,MAAM,MAAM,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;4BAC5D,IAAI,MAAM,EAAE,CAAC;gCACT,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;4BAC/B,CAAC;wBACL,CAAC;oBACL,CAAC;oBACD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAC1B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;oBACrC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBACzC,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAED,YAAY;QACR,KAAK,IAAI,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,CAAC;YAChD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YAEjE,IAAI,CAAC,OAAO,EAAE,CAAC;gBAAC,SAAQ;YAAC,CAAC;YAE1B,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;gBACxE,OAAO,CAAC,CAAC,UAAU,KAAK,MAAM,CAAC,YAAY;YAC/C,CAAC,CAAC,CAAC;YAEH,MAAM,SAAS,GAAG,OAAO,CAAC;gBACtB,IAAI,EAAE,MAAM,CAAC,YAAY;gBACzB,QAAQ,EAAE,8CAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC7E,MAAM;gBACN,UAAU,EAAE,cAAc;gBAC1B,KAAK,EAAE,IAAI;aACd,CAAC,CAAC;YAEH,IAAI,SAAS,EAAE,CAAC;gBACZ,uFAAuF;gBACvF,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAClD,IAAI,WAAW,EAAE,CAAC;oBACd,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;oBACjD,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;wBACb,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;wBAC/B,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;wBACjC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;oBAC1C,CAAC;gBACL,CAAC;gBAED,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC9B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;gBACzC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAC7C,CAAC;QACL,CAAC;IACL,CAAC;IAGD,uBAAuB,CAAC,UAAkB;QACtC,MAAM,YAAY,GAAG,IAAI,CAAC,2BAA2B,CAAC,UAAU,CAAC,CAAC;QAClE,IAAI,OAAO,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAC9B,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAChD,IAAI,WAAW,EAAE,CAAC;gBACd,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC9B,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,kBAAkB,CAAC,eAAuB,EAAE,KAAW;QACnD,MAAM,YAAY,GAAG,IAAI,CAAC,sBAAsB,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;QACzE,IAAI,OAAO,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAC9B,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAChD,IAAI,WAAW,EAAE,CAAC;gBACd,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC9B,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;;OAIG;IACH,2BAA2B,CAAC,UAAkB;QAC1C,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,iBAAiB,EAAE,KAAK,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;IACvH,CAAC;IAED;;;;OAIG;IACH,sBAAsB,CAAC,eAAuB,EAAE,KAAW;QACvD,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;YAC7C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACtB,IAAI,eAAe,GAAG,KAAK,CAAC;gBAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;oBAC5B,eAAe,GAAG,KAAK,CAAC,iBAAiB,EAAE,CAAC;gBAChD,CAAC;gBAED,MAAM,KAAK,GAAG,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,iBAAiB,EAAE,KAAK,eAAe,CAAC,iBAAiB,EAAE,CAAC,CAAC;gBACrH,IAAI,KAAK,EAAE,CAAC;oBACR,OAAO,KAAK,CAAC,OAAO,KAAK,eAAe,CAAC;gBAC7C,CAAC;gBACD,OAAO,KAAK,CAAC;YACjB,CAAC;iBAAM,CAAC;gBACJ,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,iBAAiB,EAAE,KAAK,eAAe,CAAC,iBAAiB,EAAE,CAAC,CAAC;YACpH,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;CACJ;;;;;;;;;;;;;;;AC1JM,MAAM,WAAW,GAAe,KAAK,EAAE,IAAY,EAAE,WAA2B,EAAE,EAAE;IACxF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,QAAO,WAAW,CAAC,WAAW,EAAE,EAAE,CAAC;QAChC,KAAK,KAAK,CAAC,CAAC,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACzC,KAAK,MAAM,CAAC,CAAC,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC1C,OAAO,CAAC,CAAC,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACzC,CAAC;AACJ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACV+B;AACD;AACD;AACE;AACC;AACT;AACO;AACH;AACC;AACH;AACF;;;;;;;;;;;;;;;;ACX4C;AAM7D,MAAM,YAAY;IAQrB,YAAY,KAAY,EAAE,SAA4B,EAAE,QAAsB,EAAkB,KAAa;;QAAb,UAAK,GAAL,KAAK,CAAQ;QACzG,IAAI,CAAC,QAAQ,GAAG,8CAAG,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACpE,IAAI,CAAC,MAAM,GAAG,8CAAG,CAAC,SAAS,CAAC,gBAAgB,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC1E,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,IAAI,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;YAEjE,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC;YAC9B,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC;YACjC,IAAI,CAAC,OAAO,GAAG,IAAI,8CAAO,CAAC;gBACvB,IAAI,EAAE,SAAS,CAAC,YAAY;gBAC5B,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;gBACnC,SAAS,EAAE,SAAS,CAAC,UAAU;gBAC/B,UAAU,EAAE,SAAS,CAAC,UAAU;gBAChC,IAAI;gBACJ,OAAO;aACV,CAAC,CAAC;YACH,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC;YACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,wDAAiB,CAAC,CAAC;YACrD,QAAQ,CAAC,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC;YAEvC,4BAA4B;YAC5B,MAAM,aAAa,GAAG,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;gBAChE,OAAO,SAAS,CAAC,YAAY,KAAK,CAAC,CAAC,UAAU,CAAC;YACnD,CAAC,CAAC,CAAC;YAEH,IAAI,aAAa,EAAE,CAAC;gBAChB,MAAM,UAAU,GAAG,aAAa,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;;oBACtD,OAAO,UAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,UAAU,0CAAE,iBAAiB,EAAE,MAAK,OAAO,CAAC;gBAC5D,CAAC,CAAC,CAAC;gBAEH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACnD,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC;oBAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC;oBACvC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;oBAClD,IAAI,UAAU,IAAI,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,KAAK,EAAE,CAAC;wBAC7D,IAAK,CAAC,KAAK,GAAG,IAAI,CAAC;oBACvB,CAAC;oBAED,8EAA8E;oBAC9E,IAAI,CAAC,UAAU,IAAI,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;wBAC/C,IAAK,CAAC,KAAK,GAAG,IAAI,CAAC;oBACvB,CAAC;gBACL,CAAC;gBAED,IAAI,SAAS,CAAC,eAAe,EAAE,CAAC;oBAC5B,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;oBAChE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;wBACvD,MAAM,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;wBACzC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;wBAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;wBAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;wBACpD,IAAI,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;4BACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,UAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,mCAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,GAAG,CAAC,UAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,mCAAI,CAAC,CAAC,CAAC,CAAC,CAAC;4BACzK,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,UAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,mCAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,GAAG,CAAC,UAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,mCAAI,CAAC,CAAC,CAAC,CAAC,CAAC;4BACzK,uBAAuB;4BACvB,uBAAuB;4BACvB,kFAAkF;4BAClF,MAAM,cAAc,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;4BACzC,MAAM,YAAY,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;4BACvC,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;4BACpE,IAAI,cAAc,IAAI,YAAY,EAAE,CAAC;gCACjC,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;gCACxB,MAAM,CAAC,cAAc,GAAG,cAAc,CAAC;gCACvC,MAAM,CAAC,YAAY,GAAG,YAAY,CAAC;4BACvC,CAAC;4BACD,IAAI,MAAM,EAAE,CAAC;gCACT,MAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;4BAC/B,CAAC;iCAAM,CAAC;gCACJ,OAAO,CAAC,KAAK,CAAC,8CAA8C,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;4BACtF,CAAC;wBACL,CAAC;oBACL,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;CACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;AC1FwC;AACiB;AACF;AACgC;AAC7C;AACE;AACkE;AAC9D;AACb;AACJ;AACa;AACE;AAmIxC,MAAM,YAAY;IAyBrB,YAA4B,IAAY,EAAE,OAA6B;QAA3C,SAAI,GAAJ,IAAI,CAAQ;QAnBjC,aAAQ,GAAG,IAAI,GAAG,EAAmB,CAAC;QACtC,WAAM,GAAG,IAAI,GAAG,EAAiB,CAAC;QAClC,iBAAY,GAAG,IAAI,GAAG,EAAiB,CAAC;QACxC,cAAS,GAAG,IAAI,GAAG,EAAuD,CAAC;QAC3E,eAAU,GAAe,qDAAW,CAAC;QAGpC,iBAAY,GAAG,IAAI,sDAAW,CAAC,mDAAW,CAAC,CAAC;QAC5C,iBAAY,GAAG,IAAI,sDAAW,CAAC,0DAAa,CAAC,CAAC;QAGtC,gBAAW,GAAW,CAAC,CAAC;QACxB,gBAAW,GAAW,CAAC,CAAC;QACxB,uBAAkB,GAAY,IAAI,CAAC;QACnC,0BAAqB,GAAY,KAAK,CAAC;QACvC,6BAAwB,GAAY,KAAK,CAAC;QAC1C,aAAQ,GAAY,KAAK,CAAC;QAC1B,WAAM,GAAY,IAAI,CAAC;QAGnC,MAAM,EACF,kBAAkB,EAClB,wBAAwB,EACxB,yBAAyB,EACzB,OAAO,EACP,qBAAqB,EACrB,UAAU,EACV,MAAM,EACN,QAAQ,EACR,WAAW,EACd,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,IAAI,CAAC,MAAM,CAAC;QACpC,IAAI,CAAC,QAAQ,GAAG,QAAQ,aAAR,QAAQ,cAAR,QAAQ,GAAI,IAAI,CAAC,QAAQ,CAAC;QAC1C,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,aAAlB,kBAAkB,cAAlB,kBAAkB,GAAI,IAAI,CAAC,kBAAkB,CAAC;QACxE,IAAI,CAAC,wBAAwB,GAAG,wBAAwB,aAAxB,wBAAwB,cAAxB,wBAAwB,GAAI,IAAI,CAAC,wBAAwB,CAAC;QAC1F,IAAI,CAAC,qBAAqB,GAAG,qBAAqB,aAArB,qBAAqB,cAArB,qBAAqB,GAAI,IAAI,CAAC,qBAAqB,CAAC;QACjF,IAAI,CAAC,WAAW,GAAG,WAAW,aAAX,WAAW,cAAX,WAAW,GAAI,IAAI,CAAC,WAAW,CAAC;QACnD,IAAI,CAAC,UAAU,GAAG,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,IAAI,CAAC,UAAU,CAAC;QAChD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,KAAK,MAAM,GAAG,IAAI,yBAAyB,EAAE,CAAC;YAC1C,IAAI,CAAC,+BAA+B,CAAC,GAAG,EAAE,yBAAyB,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9E,CAAC;IAEL,CAAC;IACD,KAAK,CAAC,IAAI;;QACN,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACtD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,IAAI,CAAC;gBACD,IAAI,CAAC,eAAe,GAAG,uDAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3D,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,OAAO,CAAC,KAAK,CAAC,0CAA0C,IAAI,CAAC,IAAI,2FAA2F,CAAC,CAAC;gBAC9J,OAAO,CAAC,KAAK,CAAC,oEAAoE,CAAC;gBACnF,MAAM,CAAC,CAAC;YACZ,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,eAAe,GAAG,IAA2B,CAAC;QACvD,CAAC;QAED,IAAI,0DAAO,CAAC,YAAY,CAAC,oBAAoB,EAAE,UAAI,CAAC,eAAe,CAAC,WAAW,mCAAI,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC;YAC/F,OAAO,CAAC,IAAI,CAAC,iDAAiD,YAAY,CAAC,oBAAoB,uCAAuC,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC;QAC7K,CAAC;QAED,2BAA2B;QAC3B,oBAAoB;QACpB,MAAM,YAAY,GAAgC,EAAE,CAAC;QACrD,KAAK,IAAI,OAAO,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACrD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBAClB,MAAM,SAAS,GAAG,8DAAkB,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC/E,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;gBACpD,MAAM,eAAe,GAAG,IAAI,6CAAO,CAAC;oBAChC,KAAK;oBACL,WAAW,EAAE,OAAO;iBACvB,CAAC,CAAC;gBACH,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;YACpD,CAAC;iBAAM,CAAC;gBACJ,IAAI,OAAO,CAAC,UAAU,KAAK,gBAAgB,EAAE,CAAC;oBAC1C,OAAO,CAAC,IAAI,CAAC,iCAAiC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;gBACxE,CAAC;YACL,CAAC;QACL,CAAC;QAED,6BAA6B;QAC7B,0BAA0B;QAC1B,KAAK,IAAI,KAAK,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC;YAC5C,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;gBACxB,kBAAkB;gBAClB,MAAM,SAAS,GAAG,8DAAkB,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,eAAe,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;gBACrF,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,EAAE;oBACxC,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,UAAU,EAAE,IAAI,CAAC,UAAU;oBAC3B,WAAW,EAAE,IAAI,CAAC,YAAY;oBAC9B,OAAO,EAAE,IAAI,CAAC,OAAO;iBACxB,CAAC,CAAC;YACP,CAAC;iBAAM,CAAC;gBACJ,kBAAkB;gBAClB,MAAM,aAAa,GAAG,IAAI,yCAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;gBAC7C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;gBAC1C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,aAAa,CAAC,CAAC;YACzE,CAAC;QACL,CAAC;QAED,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACxE,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACvC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACtD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACrF,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC;IAC5C,CAAC;IAAA,CAAC;IAEF,QAAQ;QACJ,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,+BAA+B,CAAC,oBAA4B,EAAE,OAAoD;QAC9G,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;IAED,iCAAiC,CAAC,SAAsE;QACpG,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;YAC1B,IAAI,CAAC,+BAA+B,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9D,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,QAAQ,CAAC,UAAkB;QACvB,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED;;;OAGG;IACH,eAAe,CAAC,eAAwB;QACpC,IAAI,OAAO,GAAkB,EAAE,CAAC;QAChC,IAAI,eAAe,EAAE,CAAC;YAClB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;YAC7C,IAAI,KAAK,EAAE,CAAC;gBACR,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBAC7B,IAAI,KAAK,YAAY,sDAAW,EAAE,CAAC;wBAC/B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACxB,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;gBACvC,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBAC7B,IAAI,KAAK,YAAY,sDAAW,EAAE,CAAC;wBAC/B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACxB,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;QAED,OAAO,OAAO;IAClB,CAAC;IAED,aAAa,CAAC,UAAmB;QAC7B,IAAI,OAAO,GAAgB,EAAE,CAAC;QAC9B,IAAI,UAAU,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YACxC,IAAI,KAAK,EAAE,CAAC;gBACR,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBAC7B,IAAI,KAAK,YAAY,kDAAS,EAAE,CAAC;wBAC7B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACxB,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;gBACvC,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBAC7B,IAAI,KAAK,YAAY,kDAAS,EAAE,CAAC;wBAC7B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACxB,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,gBAAgB,CAAC,UAAmB;QAChC,IAAI,OAAO,GAAmB,EAAE,CAAC;QACjC,IAAI,UAAU,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YACxC,IAAI,KAAK,EAAE,CAAC;gBACR,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBAC7B,IAAI,KAAK,YAAY,wDAAY,EAAE,CAAC;wBAChC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACxB,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;gBACvC,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBAC7B,IAAI,KAAK,YAAY,wDAAY,EAAE,CAAC;wBAChC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACxB,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;;OAIG;IACH,2BAA2B,CAAC,UAAkB,EAAE,MAAiB;QAC7D,IAAI,OAAO,GAAyB,EAAE,CAAC;QACvC,MAAM,cAAc,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACnG,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAC3C,KAAK,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;gBACvB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,CAAC,UAAU,CAAC,CAAC,CAAC;YAC5E,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;;OAIG;IACH,sBAAsB,CAAC,eAAuB,EAAE,KAAW,EAAE,MAAiB;QAC1E,IAAI,OAAO,GAAyB,EAAE,CAAC;QACvC,MAAM,cAAc,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACnG,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAC3C,KAAK,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;gBACvB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC,CAAC;YACnF,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;;OAIG;IACH,uBAAuB,CAAC,UAAkB,EAAE,MAAiB;QACzD,IAAI,OAAO,GAAkB,EAAE,CAAC;QAChC,MAAM,cAAc,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACnG,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAC3C,KAAK,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;gBACvB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,UAAU,CAAC,CAAC,CAAC;YACxE,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;;;OAKG;IACH,kBAAkB,CAAC,eAAuB,EAAE,KAAW,EAAE,MAAiB;QACtE,IAAI,OAAO,GAAkB,EAAE,CAAC;QAChC,MAAM,cAAc,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACnG,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAC3C,KAAK,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;gBACvB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC,CAAC;YAC/E,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;OAGG;IACH,cAAc,CAAC,MAAiB;QAC5B,MAAM,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;QACxD,IAAI,MAAM,GAAuB,IAAI,CAAC;QACtC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACvC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC/C,SAAS;YACb,CAAC;YACD,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;YACzE,IAAI,cAAc,EAAE,CAAC;gBACjB,MAAM,UAAU,GAAG,mDAAW,CAAC,aAAa,CACxC,cAAc,CAAC,OAAO,CAAC,SAAS,GAAG,cAAc,CAAC,OAAO,CAAC,OAAO,EACjE,cAAc,CAAC,OAAO,CAAC,UAAU,GAAG,cAAc,CAAC,OAAO,CAAC,IAAI,EAC/D,8CAAM,CAAC,IAAI,EACX,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBAChC,IAAI,CAAC,MAAM,EAAE,CAAC;oBACV,MAAM,GAAG,UAAU,CAAC;gBACxB,CAAC;qBAAM,CAAC;oBACJ,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBACxC,CAAC;YACL,CAAC;QACL,CAAC;QACD,OAAO,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,IAAI,mDAAW,EAAE,CAAC;IACvC,CAAC;IAED,UAAU,CAAC,KAAY,EAAE,OAA2B;;QAChD,MAAM,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,EAAC,GAAG,EAAE,+CAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,GAAG,OAAO,EAAC,CAAC;QAGrF,KAAK,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;YAC5C,IAAI,aAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,WAAW,0CAAE,MAAM,EAAE,CAAC;gBAC/B,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC5D,SAAS;gBACb,CAAC;YACL,CAAC;YACD,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBAC7B,IAAI,KAAK,YAAY,kDAAS,IAAI,KAAK,YAAY,wDAAY,EAAE,CAAC;oBAC9D,KAAK,CAAC,OAAO,CAAC,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBAC/C,IAAI,CAAC,eAAe,EAAE,CAAC;wBACnB,KAAK,CAAC,OAAO,CAAC,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;oBAC9D,CAAC;oBACD,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC;gBAC5B,CAAC;qBAAM,CAAC;oBACJ,KAAK,CAAC,YAAY,EAAE;oBACpB,KAAK,IAAI,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;wBAChC,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,0DAAkB,CAAC,CAAC;wBAC1C,IAAI,EAAE,EAAE,CAAC;4BACL,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;4BACzB,IAAI,CAAC,eAAe,EAAE,CAAC;gCACnB,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;4BACxC,CAAC;wBACL,CAAC;wBACD,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;oBACtB,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;QAED,IAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9D,IAAI,MAAM,EAAE,CAAC;gBACT,KAAK,CAAC,MAAM,CAAC,GAAG,GAAG,+CAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBACnD,MAAM,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,iBAAiB,EAAE,KAAK,MAAM,CAAC,CAAC;gBAC5F,IAAI,IAAI,EAAE,CAAC;oBACP,KAAK,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;gBACtC,CAAC;YACL,CAAC;QACL,CAAC;QAED,IAAI,IAAI,CAAC,wBAAwB,EAAE,CAAC;YAChC,IAAI,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,WAAW,CAAC,CAAC;YACvD,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC7B,KAAK,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC5C,IAAI,aAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,WAAW,0CAAE,MAAM,EAAE,CAAC;oBAC/B,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;wBAC5D,SAAS;oBACb,CAAC;gBACL,CAAC;gBACD,KAAK,CAAC,eAAe,GAAG,KAAK,CAAC,eAAe,CAAC;gBAC9C,MAAM;YACV,CAAC;QACL,CAAC;IAGL,CAAC;;AApXa,iCAAoB,GAAG,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;AC/IC;AAEL;AACW;AACxB;AACI;AAWpC;;GAEG;AACI,MAAM,aAAa;IAMtB,YAA4B,IAAY,EAAkB,QAAsB,EAAE,OAA8B;QAApF,SAAI,GAAJ,IAAI,CAAQ;QAAkB,aAAQ,GAAR,QAAQ,CAAc;QALxE,eAAU,GAAe,qDAAW,CAAC;QAG7B,WAAM,GAAY,IAAI,CAAC;QACvB,aAAQ,GAAY,KAAK,CAAC;QAEtC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;QAC9E,IAAI,CAAC,UAAU,GAAG,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,IAAI,CAAC,UAAU,CAAC;QAChD,IAAI,CAAC,MAAM,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,IAAI,CAAC,MAAM,CAAC;QACpC,IAAI,CAAC,QAAQ,GAAG,QAAQ,aAAR,QAAQ,cAAR,QAAQ,GAAI,IAAI,CAAC,QAAQ,CAAC;QAC1C,IAAI,CAAC,WAAW,GAAG,WAAW,aAAX,WAAW,cAAX,WAAW,GAAI,IAAI,sDAAW,CAAC,kDAAW,CAAC,CAAC;QAC/D,IAAI,CAAC,OAAO,GAAG,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,IAAI,CAAC,OAAO,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,IAAI;QACN,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACtD,IAAI,KAAgB,CAAC;QACrB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,IAAI,CAAC;gBACD,KAAK,GAAG,6CAAS,CAAC,KAAK,CAAC,IAAI,CAAC;YACjC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,OAAO,CAAC,KAAK,CAAC,sCAAsC,IAAI,CAAC,IAAI,iDAAiD,CAAC,CAAC;gBAChH,MAAM,CAAC,CAAC;YACZ,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,KAAK,GAAG,IAAiB,CAAC;QAC9B,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,GAAG,IAAI,yCAAK,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvD,CAAC;IACD,QAAQ;QACJ,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IACvB,CAAC;CAEJ;;;;;;;;;;;;;;;;;;;ACrDiC;AACW;AACE;AAEN;AAGlC,MAAM,KAAK;IAKd,YAAmB,SAAoB,EAAS,QAAsB;;QAAnD,cAAS,GAAT,SAAS,CAAW;QAAS,aAAQ,GAAR,QAAQ,CAAc;QAF/D,WAAM,GAA+C,EAAE,CAAC;QAG3D,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;YACtB,IAAI,CAAC,eAAe,GAAG,4CAAK,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,SAAS,CAAC,cAAc,EAAE,CAAC;YAC3B,IAAI,KAAK,GAAG,QAAQ,CAAC,WAAW,CAAC;YACjC,IAAI,MAAM,GAAG,SAAS,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC;YACxD,KAAK,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;gBACvB,IAAI,YAAK,CAAC,eAAe,0CAAE,MAAM,MAAK,CAAC,EAAE,CAAC;oBACtC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,sDAAW,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;gBACpE,CAAC;gBAED,IAAI,YAAK,CAAC,SAAS,0CAAE,MAAM,MAAK,CAAC,EAAE,CAAC;oBAChC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,kDAAS,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;gBAClE,CAAC;gBAED,mEAAmE;gBACnE,IAAI,YAAK,CAAC,UAAU,0CAAE,MAAM,MAAK,CAAC,IAAI,YAAK,CAAC,cAAc,0CAAE,MAAM,MAAK,CAAC,EAAE,CAAC;oBACvE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,wDAAY,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;gBACrE,CAAC;gBACD,KAAK,EAAE,CAAC;YACZ,CAAC;QACL,CAAC;IACL,CAAC;CACJ;;;;;;;;;;;;;;;AChCA;;GAEG;AACI,MAAM,WAAW;IAIrB,YAA4B,IAA+B;QAA/B,SAAI,GAAJ,IAAI,CAA2B;QAHnD,YAAO,GAAG,KAAK,CAAC;QACxB,UAAK,GAAG,IAAI,GAAG,EAAa,CAAC;IAEgC,CAAC;IAE9D,QAAQ,CAAC,GAAG,IAAW;QACpB,IAAI,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9C,IAAI,QAAQ,EAAE,CAAC;YACZ,OAAO,QAAQ,CAAC;QACnB,CAAC;QAED,QAAQ,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;QACzC,OAAO,QAAQ,CAAC;IACnB,CAAC;IAED,MAAM;QACH,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAChB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1C,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC9E,CAAC;IAED,KAAK,CAAC,IAAI;QACP,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAE1E,qCAAqC;QACrC,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBAChC,OAAO,CAAC,KAAK,CAAC,6BAA6B,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,wDAAwD,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;gBACnI,OAAO,EAAE,CAAC;YACb,CAAC;QACJ,CAAC;QACD,IAAI,OAAO,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,iBAAiB,OAAO,YAAY,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACvB,CAAC;CACH;;;;;;;;;;;;;;;;;;AC7CK,SAAS,gBAAgB,CAAC,SAAiB;IAC/C,MAAM,kBAAkB,GAAG,yCAAyC;IAEpE,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAEpD,IAAI,OAAO,EAAE,CAAC;QACX,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACzB,OAAO,KAAK,CAAC;IAChB,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,wCAAwC,SAAS,EAAE,CAAC,CAAC;AACxE,CAAC;AAEM,SAAS,OAAO,CAAC,SAAiB,EAAE,OAAgB;IAExD,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;QACtC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5B,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5B,OAAO,MAAM,CAAC;YACjB,CAAC;QACJ,CAAC;aAAM,CAAC;YACL,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,KAAK,EAAE,CAAC;gBACT,OAAO,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAAA,CAAC;YAC/C,CAAC;QACJ,CAAC;IACJ,CAAC;IACD,OAAO,SAAS,CAAC;AACpB,CAAC;AAEM,SAAS,SAAS,CAAC,SAAiB,EAAE,OAAiB;IAC3D,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC3B,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;QACtC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5B,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5B,OAAO,IAAI,CAAC;YACf,CAAC;QACJ,CAAC;aAAM,CAAC;YACL,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,KAAK,EAAE,CAAC;gBACT,OAAO,IAAI,CAAC;YACf,CAAC;QACJ,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AAChB,CAAC;AAGM,SAAS,kBAAkB,CAAC,QAAgB,EAAE,cAAsB,EAAE,OAAiB;IAC3F,IAAI,SAAS,CAAC,cAAc,EAAE,OAAO,CAAC,IAAI,OAAO,EAAE,CAAC;QACjD,OAAO,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,iCAAiC;IACjC,IAAI,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,OAAO,cAAc,CAAC;IACzB,CAAC;IAED,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,aAAa,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAChD,0DAA0D;IAC1D,IAAI,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACrD,WAAW,CAAC,GAAG,EAAE,CAAC;IACrB,CAAC;IACD,OAAO,WAAW,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACtD,CAAC;;;;;;;;;;;;;;;;ACrEmE;AAO7D,MAAM,SAAS;IAOlB,YAAY,KAAY,EAAE,SAA4B,EAAE,QAAsB,EAAkB,KAAa;;QAAb,UAAK,GAAL,KAAK,CAAQ;QACzG,IAAI,CAAC,QAAQ,GAAG,8CAAG,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACpE,IAAI,CAAC,MAAM,GAAG,8CAAG,CAAC,SAAS,CAAC,gBAAgB,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC1E,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,8CAAO,CAAC;YACvB,IAAI,EAAE,SAAS,CAAC,YAAY;YAC5B,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;YACnC,SAAS,EAAE,SAAS,CAAC,UAAU;YAC/B,UAAU,EAAE,SAAS,CAAC,UAAU;YAChC,IAAI,EAAE,SAAS,CAAC,MAAM;YACtB,OAAO,EAAE,SAAS,CAAC,MAAM;SAC5B,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,wDAAiB,CAAC,CAAC;QACrD,QAAQ,CAAC,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC;QAGvC,IAAI,SAAS,CAAC,eAAe,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;YAChE,KAAK,IAAI,IAAI,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;gBACnC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;gBAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;gBAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBACpD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;oBACf,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,UAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,mCAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,GAAG,CAAC,UAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,mCAAI,CAAC,CAAC,CAAC,CAAC,CAAC;oBACzK,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,UAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,mCAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,GAAG,CAAC,UAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,mCAAI,CAAC,CAAC,CAAC,CAAC,CAAC;oBACzK,uBAAuB;oBACvB,uBAAuB;oBACvB,kFAAkF;oBAClF,MAAM,cAAc,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;oBACzC,MAAM,YAAY,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;oBACvC,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;oBACpE,IAAI,cAAc,IAAI,YAAY,EAAE,CAAC;wBACjC,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;wBACxB,MAAM,CAAC,cAAc,GAAG,cAAc,CAAC;wBACvC,MAAM,CAAC,YAAY,GAAG,YAAY,CAAC;oBACvC,CAAC;oBACD,IAAI,MAAM,EAAE,CAAC;wBACT,MAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;oBAC/B,CAAC;yBAAM,CAAC;wBACJ,OAAO,CAAC,KAAK,CAAC,8CAA8C,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;oBACtF,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,SAAS,CAAC,eAAe,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACtG,CAAC;IAEL,CAAC;CACJ;;;;;;;;;;;;;;;;AC/D4D;AAQtD,MAAM,OAAO;IAIhB,YAAY,OAAuB;;QAC/B,MAAM,EAAC,KAAK,EAAE,WAAW,EAAC,GAAG,OAAO,CAAC;QACrC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,WAAW,GAAG,kDAAW,CAAC,eAAe,CAAC;YAC3C,KAAK;YACL,IAAI,EAAE;gBACF,IAAI,EAAE,WAAW,CAAC,KAAK,GAAG,WAAW,CAAC,YAAY;gBAClD,OAAO,EAAE,WAAW,CAAC,KAAK,GAAG,WAAW,CAAC,YAAY;gBACrD,YAAY,EAAE,WAAW,CAAC,YAAY;gBACtC,WAAW,EAAE,WAAW,CAAC,YAAY;aACxC;YACD,OAAO,EAAE;gBACL,MAAM,EAAE;oBACJ,CAAC,EAAE,iBAAW,CAAC,OAAO,mCAAI,CAAC;oBAC3B,CAAC,EAAE,iBAAW,CAAC,OAAO,mCAAI,CAAC;iBAC9B;gBACD,YAAY,EAAE;oBACV,CAAC,EAAE,iBAAW,CAAC,OAAO,mCAAI,CAAC;oBAC3B,CAAC,EAAE,iBAAW,CAAC,OAAO,mCAAI,CAAC;iBAC9B;aACJ;SACJ,CAAC,CAAC;IACP,CAAC;CACJ;;;;;;;;;;;;;;;;;;;;;ACpCuB;AAIxB,MAAM,oBAAoB,GAAG,kCAAC,CAAC,MAAM,CAAC;IAClC,CAAC,EAAE,kCAAC,CAAC,MAAM,EAAE;IACb,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,CAAC,EAAE,kCAAC,CAAC,MAAM,EAAE;IACb,CAAC,EAAE,kCAAC,CAAC,MAAM,EAAE;IACb,CAAC,EAAE,kCAAC,CAAC,MAAM,EAAE;CAChB,CAAC,CAAC;AACH,MAAM,SAAS,GAAG,kCAAC,CAAC,KAAK,CAAC,CAAC,kCAAC,CAAC,MAAM,EAAE,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AACpD,MAAM,iBAAiB,GAAG,kCAAC,CAAC,MAAM,CAAC;IAC/B,YAAY,EAAE,kCAAC,CAAC,MAAM,EAAE;IACxB,MAAM,EAAE,oBAAoB,CAAC,QAAQ,EAAE;IACvC,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE,EAAC,mJAAmJ;IACtK,OAAO,EAAE,kCAAC,CAAC,GAAG,EAAE;IAChB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;CACrB,CAAC;AACF,MAAM,gBAAgB,GAAG,kCAAC,CAAC,MAAM,CAAC;IAC9B,CAAC,EAAE,kCAAC,CAAC,MAAM,EAAE;IACb,CAAC,EAAE,kCAAC,CAAC,MAAM,EAAE,EAAE,sBAAsB;IACrC,EAAE,EAAE,SAAS;IACb,GAAG,EAAE,SAAS;IACd,CAAC,EAAE,kCAAC,CAAC,MAAM,EAAE;CAChB,CAAC,CAAC;AAEI,MAAM,kBAAkB,GAAG,kCAAC,CAAC,MAAM,CAAC;IACvC,MAAM,EAAE,SAAS;IACjB,YAAY,EAAE,kCAAC,CAAC,MAAM,EAAE;IACxB,OAAO,EAAE,SAAS;IAClB,YAAY,EAAE,kCAAC,CAAC,MAAM,EAAE;IACxB,MAAM,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,EAAE,CAAC;IAC3B,MAAM,EAAE,oBAAoB,CAAC,QAAQ,EAAE;IACvC,QAAQ,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,QAAQ,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,cAAc,EAAE,kCAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC;IAC1C,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;IACf,EAAE,EAAE,SAAS;IACb,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;CACpB,CAAC,CAAC;AAGI,MAAM,iBAAiB,GAAG,kCAAC,CAAC,MAAM,CAAC;IACtC,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,YAAY,EAAE,kCAAC,CAAC,MAAM,EAAE;IACxB,SAAS,EAAE,kCAAC,CAAC,MAAM,EAAE;IACrB,gBAAgB,EAAE,kCAAC,CAAC,MAAM,EAAE;IAC5B,gBAAgB,EAAE,kCAAC,CAAC,MAAM,EAAE;IAC5B,eAAe,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACtC,gBAAgB,EAAC,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACtC,MAAM,EAAE,kCAAC,CAAC,KAAK,CAAC,CAAC,kCAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;IAC1G,cAAc,EAAE,kCAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,sBAAsB;IACjE,eAAe,EAAE,kCAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAC,wBAAwB;IACrE,SAAS,EAAE,kCAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC;IACpC,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;IACf,UAAU,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,EAAE,CAAC,EAAE,oDAAoD;IACrF,WAAW,EAAE,kCAAC,CAAC,MAAM,EAAE;IACvB,OAAO,EAAE,kCAAC,CAAC,MAAM,EAAE;IACnB,kBAAkB,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACzC,SAAS,EAAE,kCAAC,CAAC,MAAM,EAAE;IACrB,SAAS,EAAE,kCAAC,CAAC,MAAM,EAAE;IACrB,OAAO,EAAE,kCAAC,CAAC,OAAO,EAAE;CACvB,CAAC,CAAC;AAGI,MAAM,SAAS,GAAG,kCAAC,CAAC,MAAM,CAAC;IAC9B,SAAS,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,OAAO,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,OAAO,EAAE,kCAAC,CAAC,MAAM,CAAC;QACd,QAAQ,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,KAAK,CAAC,CAAC,kCAAC,CAAC,MAAM,EAAE,EAAE,kCAAC,CAAC,MAAM,EAAE,EAAE,kCAAC,CAAC,MAAM,EAAE,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,sCAAsC;QACpH,KAAK,EAAE,kCAAC,CAAC,KAAK,CAAC,CAAC,kCAAC,CAAC,MAAM,EAAE,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACxC,SAAS,EAAE,SAAS;KACvB,CAAC,CAAC,QAAQ,EAAE;IACb,YAAY,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,CAAC;QAC3B,GAAG,EAAE,kCAAC,CAAC,KAAK,CAAC,CAAC,kCAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QAClM,QAAQ,EAAE,kCAAC,CAAC,MAAM,EAAE;KACvB,CAAC,CAAC;IACH,SAAS,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,eAAe,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACtC,cAAc,EAAE,kCAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC;IAC1C,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;IACf,cAAc,EAAE,kCAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,QAAQ,EAAE,EAAE,gDAAgD;IACvG,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;IACjB,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;IACjB,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;IACf,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;CACrB,CAAC,CAAC;AAGH,MAAM,SAAS,GAAG,kCAAC,CAAC,MAAM,CAAC;IACvB,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;IACf,MAAM,EAAE,kCAAC,CAAC,KAAK,CAAC,SAAS,CAAC;IAC1B,eAAe,EAAC,kCAAC,CAAC,MAAM,EAAE;IAC1B,cAAc,EAAE,kCAAC,CAAC,MAAM,EAAE;IAC1B,6BAA6B;IAC7B,WAAW,EAAE,kCAAC,CAAC,KAAK,CAAC,CAAC,kCAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC;CAChI,CAAC,CAAC;AAGH,MAAM,uBAAuB,GAAG,kCAAC,CAAC,MAAM,CAAC;IACrC,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;IACjB,EAAE,EAAE,kCAAC,CAAC,MAAM,EAAE;IACd,QAAQ,EAAE,oBAAoB,CAAC,QAAQ,EAAE;CAC5C,CAAC,CAAC;AAEH,MAAM,kBAAkB,GAAG,kCAAC,CAAC,MAAM,CAAC;IAChC,eAAe,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACtC,cAAc,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACrC,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,IAAI,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,EAAE,CAAC;IACzB,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;IACf,MAAM,EAAE,kCAAC,CAAC,KAAK,CAAC,uBAAuB,CAAC;CAC3C,CAAC;AAIF,MAAM,qBAAqB,GAAG,kCAAC,CAAC,MAAM,CAAC;IACnC,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,UAAU,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,CAAC;QACzB,IAAI,EAAE,kCAAC,CAAC,MAAM,EAAE;QAChB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;KACrB,CAAC,CAAC;IACH,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,QAAQ,EAAE,kCAAC,CAAC,QAAQ,CAAC,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,CAAC;QAClC,WAAW,EAAE,kCAAC,CAAC,MAAM,EAAE;QACvB,OAAO,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,EAAE,CAAC;KAC/B,CAAC,CAAC,CAAC;IACJ,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,OAAO,EAAE,kCAAC,CAAC,MAAM,EAAE;IACnB,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;IACjB,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;IACjB,OAAO,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,OAAO,EAAE,kCAAC,CAAC,MAAM,EAAE;IACnB,IAAI,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,EAAE,CAAC;IACzB,iBAAiB,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACxC,YAAY,EAAE,kCAAC,CAAC,MAAM,EAAE;IACxB,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;CAClB,CAAC;AAGK,MAAM,mBAAmB,GAAG,kCAAC,CAAC,MAAM,CAAC;IACxC,MAAM,EAAE,kCAAC,CAAC,KAAK,CAAC,CAAC,kCAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;IAC1G,qBAAqB,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5C,cAAc,EAAE,kCAAC,CAAC,MAAM,EAAE;IAC1B,QAAQ,EAAE,kCAAC,CAAC,MAAM,EAAE;IACpB,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,aAAa,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,CAAC;QAC5B,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;QACjB,QAAQ,EAAE,kCAAC,CAAC,MAAM,EAAE;QACpB,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QACjC,IAAI,EAAE,oBAAoB,CAAC,QAAQ,EAAE;QACrC,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;KACpB,CAAC,CAAC;IACH,mBAAmB,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,CAAC;QAClC,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC5B,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QACjC,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;KAClB,CAAC,CAAC;IACH,eAAe,EAAE,kCAAC,CAAC,MAAM,EAAE;IAC3B,eAAe,EAAE,kCAAC,CAAC,MAAM,EAAE;IAC3B,eAAe,EAAE,kCAAC,CAAC,OAAO,EAAE;IAC5B,SAAS,EAAE,kCAAC,CAAC,MAAM,EAAE;IACrB,SAAS,EAAE,kCAAC,CAAC,MAAM,EAAE;IACrB,aAAa,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpC,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;CAClB,CAAC,CAAC;AAGI,MAAM,oBAAoB,GAAG,kCAAC,CAAC,MAAM,CAAC;IACzC,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;IACjB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,gBAAgB,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,EAAE,CAAC;IACrC,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,QAAQ,EAAE,oBAAoB,CAAC,QAAQ,EAAE;IACzC,cAAc,EAAE,kCAAC,CAAC,KAAK,CAAC;QACpB,kCAAC,CAAC,OAAO,CAAC,OAAO,CAAC;QAClB,kCAAC,CAAC,OAAO,CAAC,WAAW,CAAC;QACtB,kCAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;QACnB,kCAAC,CAAC,OAAO,CAAC,SAAS,CAAC;QACpB,kCAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC;QAC5B,kCAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC;QAC9B,kCAAC,CAAC,OAAO,CAAC,WAAW,CAAC;KACzB,CAAC;IACF,SAAS,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,UAAU,EAAE,oBAAoB,CAAC,QAAQ,EAAE;IAC3C,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;IACf,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;CACpB,CAAC,CAAC;AAGH,MAAM,eAAe,GAAG,kCAAC,CAAC,MAAM,CAAC;IAC7B,QAAQ,EAAE,kCAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC;IACxC,KAAK,EAAE,kCAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC;IAClC,MAAM,EAAE,kCAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC;IACpC,QAAQ,EAAE,kCAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC;CAC1C,CAAC;AAGK,MAAM,mBAAmB,GAAG,kCAAC,CAAC,MAAM,CAAC;IACxC,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;IACf,OAAO,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,IAAI,EAAE,eAAe;IACrB,cAAc,EAAE,kCAAC,CAAC,OAAO,EAAE;IAC3B,WAAW,EAAE,kCAAC,CAAC,MAAM,EAAE;IACvB,MAAM,EAAE,kCAAC,CAAC,KAAK,CAAC,SAAS,CAAC;IAC1B,GAAG,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,CAAC;QAClB,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;QACtB,aAAa,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,CAAC;YAC5B,MAAM,EAAE,kCAAC,CAAC,GAAG,EAAE;YACf,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;YACjB,IAAI,EAAE,kCAAC,CAAC,MAAM,EAAE;YAChB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;YAClB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;YAClB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;SACrB,CAAC,CAAC;KACN,CAAC,CAAC;IACH,yBAAyB;IACzB,eAAe,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACtC,cAAc,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACrC,uCAAuC;IACvC,WAAW,EAAE,kCAAC,CAAC,KAAK,CAAC,CAAC,kCAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACxI,MAAM,EAAE,kCAAC,CAAC,KAAK,CAAC,SAAS,CAAC;CAC7B,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC1OH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,IAAI;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oBAAoB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gCAAgC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA,0DAA0D;AAC1D,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,MAAM;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,eAAe,aAAa,eAAe;AACjF;AACA;AACA;AACA,yDAAyD,2DAA2D;AACpH;AACA;AACA,wDAAwD,kCAAkC;AAC1F;AACA;AACA;AACA;AACA;AACA,+DAA+D,+BAA+B;AAC9F;AACA;AACA,sDAAsD,+BAA+B,cAAc,eAAe;AAClH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8DAA8D,0BAA0B;AACxF;AACA,qCAAqC,SAAS,oDAAoD,0BAA0B;AAC5H;AACA;AACA;AACA,iEAAiE,4BAA4B;AAC7F;AACA;AACA,+DAA+D,0BAA0B;AACzF;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,iBAAiB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,sEAAsE,EAAE,eAAe;AACvI;AACA,iDAAiD,iEAAiE,EAAE,eAAe;AACnI;AACA,4CAA4C;AAC5C;AACA;AACA;AACA,0CAA0C,EAAE,cAAc;AAC1D;AACA,0CAA0C;AAC1C;AACA;AACA;AACA,0CAA0C,EAAE,gCAAgC;AAC5E;AACA;AACA;AACA;AACA;AACA,gDAAgD,qEAAqE,EAAE,eAAe;AACtI;AACA,iDAAiD,iEAAiE,EAAE,eAAe;AACnI;AACA,4CAA4C;AAC5C;AACA;AACA;AACA,uCAAuC,EAAE,cAAc;AACvD;AACA,4CAA4C;AAC5C;AACA;AACA;AACA,uCAAuC,EAAE,cAAc;AACvD;AACA,0CAA0C;AAC1C;AACA;AACA;AACA,0CAA0C,EAAE,gCAAgC;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,iBAAiB;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY,mCAAmC;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,kCAAkC;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,aAAa;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,CAAC;AACD,4BAA4B,wBAAwB;AACpD,yBAAyB,wBAAwB;AACjD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,sEAAsE,UAAU;AAChF;AACA,CAAC,8BAA8B;;AAE/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,4DAA4D;AACxE;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,gBAAgB,UAAU;AAC1B;AACA,qBAAqB;AACrB;AACA;AACA,qBAAqB;AACrB;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,mCAAmC;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,6BAA6B;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,6BAA6B;AAC/D;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,mCAAmC;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,sBAAsB,gCAAgC;AACtD,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,8BAA8B;AACpD,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,GAAG;AAC/B;AACA,uCAAuC,GAAG;AAC1C;AACA,iBAAiB,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU,GAAG;AACzE,gCAAgC,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,GAAG;AACvG,iCAAiC,GAAG;AACpC;AACA;AACA;AACA;AACA,4DAA4D,GAAG,mFAAmF,GAAG;AACrJ;AACA,sCAAsC,sBAAsB,sCAAsC,uBAAuB,OAAO,GAAG,cAAc;AACjJ;AACA;AACA,uBAAuB,yBAAyB,4DAA4D,EAAE,SAAS,IAAI,MAAM,EAAE,iCAAiC,EAAE,SAAS,IAAI,yBAAyB,IAAI,GAAG,EAAE,aAAa,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,mCAAmC,EAAE,SAAS,IAAI,MAAM,EAAE,iCAAiC,EAAE,SAAS,IAAI,0DAA0D,GAAG;AACrnB;AACA,iDAAiD,IAAI,kCAAkC,KAAK,6CAA6C,KAAK;AAC9I;AACA,gCAAgC,EAAE,+BAA+B,EAAE,2NAA2N,EAAE;AAChS,iGAAiG,GAAG;AACpG;AACA,8BAA8B,EAAE;AAChC;AACA,2BAA2B,sBAAsB,KAAK,gBAAgB;AACtE;AACA;AACA,+EAA+E,EAAE;AACjF,mFAAmF,EAAE;AACrF;AACA,gBAAgB,IAAI,GAAG,EAAE,aAAa,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,mCAAmC,EAAE,SAAS,IAAI,MAAM,EAAE,iCAAiC,EAAE,SAAS,IAAI;AAC5X,kCAAkC,IAAI,GAAG,IAAI,YAAY,IAAI,cAAc,IAAI,GAAG,IAAI,eAAe,IAAI,GAAG,IAAI,aAAa,IAAI,cAAc,IAAI,GAAG,IAAI,cAAc,IAAI,EAAE,IAAI,cAAc,IAAI,GAAG,IAAI,cAAc,IAAI,EAAE,IAAI,cAAc,IAAI,GAAG,IAAI,cAAc,IAAI,EAAE,IAAI,cAAc,IAAI,GAAG,IAAI,cAAc,IAAI,EAAE,IAAI,aAAa,IAAI,gBAAgB,IAAI,EAAE,IAAI,kBAAkB,IAAI,EAAE,IAAI,uBAAuB,IAAI,EAAE,IAAI,aAAa,GAAG,YAAY,IAAI,EAAE,IAAI,GAAG,IAAI,oBAAoB,IAAI,OAAO,IAAI,UAAU,IAAI,mBAAmB,IAAI,OAAO,IAAI,oBAAoB,IAAI,GAAG,IAAI,qBAAqB,IAAI,OAAO,IAAI,UAAU,IAAI,mBAAmB,IAAI,OAAO,IAAI;AAChqB,sCAAsC,IAAI,GAAG,IAAI,YAAY,IAAI,cAAc,IAAI,GAAG,IAAI,eAAe,IAAI,GAAG,IAAI,aAAa,IAAI,cAAc,IAAI,GAAG,IAAI,cAAc,IAAI,EAAE,IAAI,cAAc,IAAI,GAAG,IAAI,cAAc,IAAI,EAAE,IAAI,cAAc,IAAI,GAAG,IAAI,cAAc,IAAI,EAAE,IAAI,cAAc,IAAI,GAAG,IAAI,cAAc,IAAI,EAAE,IAAI,aAAa,IAAI,gBAAgB,IAAI,EAAE,IAAI,kBAAkB,IAAI,EAAE,IAAI,uBAAuB,IAAI,EAAE,IAAI,aAAa,GAAG,YAAY,IAAI,EAAE,IAAI,GAAG,IAAI,oBAAoB,IAAI,OAAO,IAAI,UAAU,IAAI,mBAAmB,IAAI,OAAO,IAAI,oBAAoB,IAAI,GAAG,IAAI,qBAAqB,IAAI,OAAO,IAAI,UAAU,IAAI,mBAAmB,IAAI,OAAO,IAAI;AACpqB;AACA,qCAAqC,EAAE,kBAAkB,EAAE,mBAAmB,EAAE;AAChF;AACA,wCAAwC,EAAE,kBAAkB,EAAE,sBAAsB,EAAE;AACtF;AACA,gCAAgC,EAAE,KAAK,EAAE,KAAK,EAAE;AAChD;AACA,gCAAgC,EAAE;AAClC;AACA,mHAAmH,EAAE;AACrH,iCAAiC,gBAAgB;AACjD;AACA,wBAAwB,EAAE,KAAK,EAAE,KAAK,EAAE;AACxC;AACA;AACA,mBAAmB,MAAM,OAAO,EAAE,gBAAgB;AAClD;AACA;AACA,mBAAmB,MAAM;AACzB;AACA;AACA;AACA;AACA,0BAA0B,sBAAsB;AAChD;AACA;AACA;AACA,mBAAmB,gBAAgB,GAAG,sBAAsB;AAC5D;AACA;AACA;AACA,4BAA4B,EAAE,MAAM,EAAE;AACtC,eAAe,MAAM,GAAG,eAAe;AACvC,0BAA0B,MAAM;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,iDAAiD;AACvF;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,yBAAyB;AAC/D;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,uBAAuB;AAC7D;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gCAAgC,+CAA+C;AAC/E;AACA;AACA,gCAAgC,6CAA6C;AAC7E;AACA;AACA,gCAAgC,+CAA+C;AAC/E;AACA;AACA,gCAAgC,8CAA8C;AAC9E;AACA;AACA,gCAAgC,gDAAgD;AAChF;AACA;AACA,gCAAgC,8CAA8C;AAC9E;AACA;AACA,gCAAgC,+CAA+C;AAC/E;AACA;AACA,gCAAgC,8CAA8C;AAC9E;AACA;AACA,gCAAgC,gDAAgD;AAChF;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gCAAgC,6CAA6C;AAC7E;AACA;AACA,gCAAgC,4CAA4C;AAC5E;AACA;AACA,gCAAgC,8CAA8C;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gCAAgC,uBAAuB;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gCAAgC,kDAAkD;AAClF;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,cAAc;AAC1D,SAAS;AACT;AACA;AACA;AACA;AACA,4CAA4C,qBAAqB;AACjE,SAAS;AACT;AACA;AACA;AACA;AACA,4CAA4C,qBAAqB;AACjE,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,wDAAwD;AACjF,SAAS;AACT;AACA;AACA;AACA;AACA,yBAAyB,wDAAwD;AACjF,SAAS;AACT;AACA;AACA;AACA;AACA,2BAA2B,kDAAkD;AAC7E,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,aAAa;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,gBAAgB,cAAc;AAC9B,gBAAgB,yBAAyB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,6BAA6B;AACpD;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,6BAA6B;AAC5D,iCAAiC,uCAAuC;AACxE,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,6BAA6B;AACxD;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,oBAAoB;AACpB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,8BAA8B,eAAe;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE,cAAc;AACjF;AACA;AACA;AACA,8DAA8D,uBAAuB,sBAAsB,cAAc;AACzH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,4BAA4B,kBAAkB;AAC9C;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,iCAAiC;AACjC;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,sDAAsD;AAC7E,SAAS;AACT;AACA;AACA;AACA;AACA,uBAAuB,sDAAsD;AAC7E,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA,mCAAmC,6CAA6C;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,mCAAmC,6CAA6C;AAChF;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,mCAAmC,6CAA6C;AAChF;AACA;AACA;AACA,uGAAuG,qCAAqC;AAC5I,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,kBAAkB,2CAA2C;AAC7D;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA,yBAAyB;AACzB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,cAAc;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA,qDAAqD,aAAa;AAClE,+BAA+B,sCAAsC;AACrE;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,sDAAsD;AACvD;AACA;AACA;AACA,sCAAsC,SAAS;AAC/C,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,sBAAsB;AAC/D,yCAAyC,sBAAsB;AAC/D;AACA;AACA;AACA,KAAK;AACL,yCAAyC,sBAAsB;AAC/D,qCAAqC,sBAAsB;AAC3D;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,cAAc;AAChC,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,+BAA+B;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAE2rD;;;;;;;UC7xI5rD;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;;;;WCtBA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA;;;;;WCPA;;;;;WCAA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D;;;;;;;;;;;;;ACLgC;AAEgB;AAChD,4CAAQ,CAAC,sBAAsB,EAAE,CAAC;AAClC,MAAM,IAAI,GAAG,IAAI,6CAAS,CAAC;IACvB,UAAU,EAAE;QACR,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,GAAG;KACd;IACD,kBAAkB,EAAE,KAAK;IACzB,QAAQ,EAAE,IAAI;IACd,UAAU,EAAE,CAAC;IACb,WAAW,EAAE,kDAAc,CAAC,SAAS;CACxC,CAAC,CAAC;AAEH,IAAI,CAAC,KAAK,CAAC,8CAAM,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;IACzB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAE3B,iDAAS,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE;QACjD,GAAG,EAAE,0CAAM,CAAC,CAAC,EAAE,CAAC,CAAC;KACpB,CAAC,CAAC;AACP,CAAC,CAAC,CAAC","sources":["webpack://@excaliburjs/plugin-ldtk/webpack/universalModuleDefinition","webpack://@excaliburjs/plugin-ldtk/./node_modules/compare-versions/lib/esm/compare.js","webpack://@excaliburjs/plugin-ldtk/./node_modules/compare-versions/lib/esm/compareVersions.js","webpack://@excaliburjs/plugin-ldtk/./node_modules/compare-versions/lib/esm/utils.js","webpack://@excaliburjs/plugin-ldtk/./node_modules/excalibur/build/esm/excalibur.development.js","webpack://@excaliburjs/plugin-ldtk/./sample/resources.ts","webpack://@excaliburjs/plugin-ldtk/./src/entity-layer.ts","webpack://@excaliburjs/plugin-ldtk/./src/file-loader.ts","webpack://@excaliburjs/plugin-ldtk/./src/index.ts","webpack://@excaliburjs/plugin-ldtk/./src/intgrid-layer.ts","webpack://@excaliburjs/plugin-ldtk/./src/ldtk-resource.ts","webpack://@excaliburjs/plugin-ldtk/./src/level-resource.ts","webpack://@excaliburjs/plugin-ldtk/./src/level.ts","webpack://@excaliburjs/plugin-ldtk/./src/loader-cache.ts","webpack://@excaliburjs/plugin-ldtk/./src/path-util.ts","webpack://@excaliburjs/plugin-ldtk/./src/tile-layer.ts","webpack://@excaliburjs/plugin-ldtk/./src/tileset.ts","webpack://@excaliburjs/plugin-ldtk/./src/types.ts","webpack://@excaliburjs/plugin-ldtk/./node_modules/zod/lib/index.mjs","webpack://@excaliburjs/plugin-ldtk/webpack/bootstrap","webpack://@excaliburjs/plugin-ldtk/webpack/runtime/define property getters","webpack://@excaliburjs/plugin-ldtk/webpack/runtime/hasOwnProperty shorthand","webpack://@excaliburjs/plugin-ldtk/webpack/runtime/make namespace object","webpack://@excaliburjs/plugin-ldtk/./sample/autotile.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, () => {\nreturn ","import { compareVersions } from './compareVersions.js';\n/**\n * Compare [semver](https://semver.org/) version strings using the specified operator.\n *\n * @param v1 First version to compare\n * @param v2 Second version to compare\n * @param operator Allowed arithmetic operator to use\n * @returns `true` if the comparison between the firstVersion and the secondVersion satisfies the operator, `false` otherwise.\n *\n * @example\n * ```\n * compare('10.1.8', '10.0.4', '>'); // return true\n * compare('10.0.1', '10.0.1', '='); // return true\n * compare('10.1.1', '10.2.2', '<'); // return true\n * compare('10.1.1', '10.2.2', '<='); // return true\n * compare('10.1.1', '10.2.2', '>='); // return false\n * ```\n */\nexport const compare = (v1, v2, operator) => {\n // validate input operator\n assertValidOperator(operator);\n // since result of compareVersions can only be -1 or 0 or 1\n // a simple map can be used to replace switch\n const res = compareVersions(v1, v2);\n return operatorResMap[operator].includes(res);\n};\nconst operatorResMap = {\n '>': [1],\n '>=': [0, 1],\n '=': [0],\n '<=': [-1, 0],\n '<': [-1],\n '!=': [-1, 1],\n};\nconst allowedOperators = Object.keys(operatorResMap);\nconst assertValidOperator = (op) => {\n if (typeof op !== 'string') {\n throw new TypeError(`Invalid operator type, expected string but got ${typeof op}`);\n }\n if (allowedOperators.indexOf(op) === -1) {\n throw new Error(`Invalid operator, expected one of ${allowedOperators.join('|')}`);\n }\n};\n//# sourceMappingURL=compare.js.map","import { compareSegments, validateAndParse } from './utils.js';\n/**\n * Compare [semver](https://semver.org/) version strings to find greater, equal or lesser.\n * This library supports the full semver specification, including comparing versions with different number of digits like `1.0.0`, `1.0`, `1`, and pre-release versions like `1.0.0-alpha`.\n * @param v1 - First version to compare\n * @param v2 - Second version to compare\n * @returns Numeric value compatible with the [Array.sort(fn) interface](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#Parameters).\n */\nexport const compareVersions = (v1, v2) => {\n // validate input and split into segments\n const n1 = validateAndParse(v1);\n const n2 = validateAndParse(v2);\n // pop off the patch\n const p1 = n1.pop();\n const p2 = n2.pop();\n // validate numbers\n const r = compareSegments(n1, n2);\n if (r !== 0)\n return r;\n // validate pre-release\n if (p1 && p2) {\n return compareSegments(p1.split('.'), p2.split('.'));\n }\n else if (p1 || p2) {\n return p1 ? -1 : 1;\n }\n return 0;\n};\n//# sourceMappingURL=compareVersions.js.map","export const semver = /^[v^~<>=]*?(\\d+)(?:\\.([x*]|\\d+)(?:\\.([x*]|\\d+)(?:\\.([x*]|\\d+))?(?:-([\\da-z\\-]+(?:\\.[\\da-z\\-]+)*))?(?:\\+[\\da-z\\-]+(?:\\.[\\da-z\\-]+)*)?)?)?$/i;\nexport const validateAndParse = (version) => {\n if (typeof version !== 'string') {\n throw new TypeError('Invalid argument expected string');\n }\n const match = version.match(semver);\n if (!match) {\n throw new Error(`Invalid argument not valid semver ('${version}' received)`);\n }\n match.shift();\n return match;\n};\nconst isWildcard = (s) => s === '*' || s === 'x' || s === 'X';\nconst tryParse = (v) => {\n const n = parseInt(v, 10);\n return isNaN(n) ? v : n;\n};\nconst forceType = (a, b) => typeof a !== typeof b ? [String(a), String(b)] : [a, b];\nconst compareStrings = (a, b) => {\n if (isWildcard(a) || isWildcard(b))\n return 0;\n const [ap, bp] = forceType(tryParse(a), tryParse(b));\n if (ap > bp)\n return 1;\n if (ap < bp)\n return -1;\n return 0;\n};\nexport const compareSegments = (a, b) => {\n for (let i = 0; i < Math.max(a.length, b.length); i++) {\n const r = compareStrings(a[i] || '0', b[i] || '0');\n if (r !== 0)\n return r;\n }\n return 0;\n};\n//# sourceMappingURL=utils.js.map","/*!\n * excalibur - 0.30.1 - 2024-12-12\n * https://github.com/excaliburjs/Excalibur\n * Copyright (c) 2024 Excalibur.js \n * Licensed BSD-2-Clause\n * @preserve\n */\n/******/ var __webpack_modules__ = ({\n\n/***/ \"./Director/Loader.css\":\n/*!*****************************!*\\\n !*** ./Director/Loader.css ***!\n \\*****************************/\n/***/ ((module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/sourceMaps.js */ \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ \"../../node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `/* Buttons styles start */\r\n\r\nbutton#excalibur-play {\r\n display: inline-block;\r\n position: relative;\r\n z-index: 999;\r\n border-radius: 6px;\r\n border: none;\r\n /*border: 3px solid;\r\n border-color: white;\r\n box-shadow: 0 0 10px #ccc;*/\r\n padding: 1rem 1.5rem 1rem 4rem;\r\n margin: 0;\r\n text-decoration: none;\r\n background: #00b233;\r\n color: #ffffff;\r\n font-family: sans-serif;\r\n font-size: 2rem;\r\n white-space: nowrap;\r\n line-height: 1;\r\n cursor: pointer;\r\n text-align: center;\r\n transition:\r\n background 250ms ease-in-out,\r\n transform 150ms ease;\r\n -webkit-appearance: none;\r\n -moz-appearance: none;\r\n\r\n -webkit-animation: excalibur-button-fadein 200ms; /* Safari, Chrome and Opera > 12.1 */\r\n -moz-animation: excalibur-button-fadein 200ms; /* Firefox < 16 */\r\n -ms-animation: excalibur-button-fadein 200ms; /* Internet Explorer */\r\n -o-animation: excalibur-button-fadein 200ms; /* Opera < 12.1 */\r\n animation: excalibur-button-fadein 200ms;\r\n}\r\n\r\n/*\r\nbutton#excalibur-play {\r\n display: none;\r\n}*/\r\n\r\nbutton#excalibur-play:after {\r\n position: absolute;\r\n content: '';\r\n border: 8px solid;\r\n border-color: transparent transparent transparent white;\r\n left: 35px;\r\n top: 24px;\r\n width: 0;\r\n height: 0;\r\n}\r\n\r\nbutton#excalibur-play:before {\r\n position: absolute;\r\n content: '';\r\n border: 3px solid;\r\n left: 19px;\r\n top: 14px;\r\n border-radius: 20px;\r\n width: 30px;\r\n height: 30px;\r\n}\r\n\r\nbutton#excalibur-play:hover,\r\nbutton#excalibur-play:focus {\r\n background: #00982c;\r\n}\r\n\r\nbutton#excalibur-play:focus {\r\n outline: 1px solid #fff;\r\n outline-offset: -4px;\r\n}\r\n\r\nbutton#excalibur-play:active {\r\n transform: scale(0.99);\r\n}\r\n\r\n@keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n/* Firefox < 16 */\r\n@-moz-keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n/* Safari, Chrome and Opera > 12.1 */\r\n@-webkit-keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n/* Internet Explorer */\r\n@-ms-keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n/* Opera < 12.1 */\r\n@-o-keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./Director/Loader.css\"],\"names\":[],\"mappings\":\"AAAA,yBAAyB;;AAEzB;EACE,qBAAqB;EACrB,kBAAkB;EAClB,YAAY;EACZ,kBAAkB;EAClB,YAAY;EACZ;;+BAE6B;EAC7B,8BAA8B;EAC9B,SAAS;EACT,qBAAqB;EACrB,mBAAmB;EACnB,cAAc;EACd,uBAAuB;EACvB,eAAe;EACf,mBAAmB;EACnB,cAAc;EACd,eAAe;EACf,kBAAkB;EAClB;;wBAEsB;EACtB,wBAAwB;EACxB,qBAAqB;;EAErB,gDAAgD,EAAE,oCAAoC;EACtF,6CAA6C,EAAE,iBAAiB;EAChE,4CAA4C,EAAE,sBAAsB;EACpE,2CAA2C,EAAE,iBAAiB;EAC9D,wCAAwC;AAC1C;;AAEA;;;EAGE;;AAEF;EACE,kBAAkB;EAClB,WAAW;EACX,iBAAiB;EACjB,uDAAuD;EACvD,UAAU;EACV,SAAS;EACT,QAAQ;EACR,SAAS;AACX;;AAEA;EACE,kBAAkB;EAClB,WAAW;EACX,iBAAiB;EACjB,UAAU;EACV,SAAS;EACT,mBAAmB;EACnB,WAAW;EACX,YAAY;AACd;;AAEA;;EAEE,mBAAmB;AACrB;;AAEA;EACE,uBAAuB;EACvB,oBAAoB;AACtB;;AAEA;EACE,sBAAsB;AACxB;;AAEA;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF;;AAEA,iBAAiB;AACjB;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF;;AAEA,oCAAoC;AACpC;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF;;AAEA,sBAAsB;AACtB;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF;;AAEA,iBAAiB;AACjB;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF\",\"sourcesContent\":[\"/* Buttons styles start */\\r\\n\\r\\nbutton#excalibur-play {\\r\\n display: inline-block;\\r\\n position: relative;\\r\\n z-index: 999;\\r\\n border-radius: 6px;\\r\\n border: none;\\r\\n /*border: 3px solid;\\r\\n border-color: white;\\r\\n box-shadow: 0 0 10px #ccc;*/\\r\\n padding: 1rem 1.5rem 1rem 4rem;\\r\\n margin: 0;\\r\\n text-decoration: none;\\r\\n background: #00b233;\\r\\n color: #ffffff;\\r\\n font-family: sans-serif;\\r\\n font-size: 2rem;\\r\\n white-space: nowrap;\\r\\n line-height: 1;\\r\\n cursor: pointer;\\r\\n text-align: center;\\r\\n transition:\\r\\n background 250ms ease-in-out,\\r\\n transform 150ms ease;\\r\\n -webkit-appearance: none;\\r\\n -moz-appearance: none;\\r\\n\\r\\n -webkit-animation: excalibur-button-fadein 200ms; /* Safari, Chrome and Opera > 12.1 */\\r\\n -moz-animation: excalibur-button-fadein 200ms; /* Firefox < 16 */\\r\\n -ms-animation: excalibur-button-fadein 200ms; /* Internet Explorer */\\r\\n -o-animation: excalibur-button-fadein 200ms; /* Opera < 12.1 */\\r\\n animation: excalibur-button-fadein 200ms;\\r\\n}\\r\\n\\r\\n/*\\r\\nbutton#excalibur-play {\\r\\n display: none;\\r\\n}*/\\r\\n\\r\\nbutton#excalibur-play:after {\\r\\n position: absolute;\\r\\n content: '';\\r\\n border: 8px solid;\\r\\n border-color: transparent transparent transparent white;\\r\\n left: 35px;\\r\\n top: 24px;\\r\\n width: 0;\\r\\n height: 0;\\r\\n}\\r\\n\\r\\nbutton#excalibur-play:before {\\r\\n position: absolute;\\r\\n content: '';\\r\\n border: 3px solid;\\r\\n left: 19px;\\r\\n top: 14px;\\r\\n border-radius: 20px;\\r\\n width: 30px;\\r\\n height: 30px;\\r\\n}\\r\\n\\r\\nbutton#excalibur-play:hover,\\r\\nbutton#excalibur-play:focus {\\r\\n background: #00982c;\\r\\n}\\r\\n\\r\\nbutton#excalibur-play:focus {\\r\\n outline: 1px solid #fff;\\r\\n outline-offset: -4px;\\r\\n}\\r\\n\\r\\nbutton#excalibur-play:active {\\r\\n transform: scale(0.99);\\r\\n}\\r\\n\\r\\n@keyframes excalibur-button-fadein {\\r\\n from {\\r\\n opacity: 0;\\r\\n }\\r\\n to {\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n/* Firefox < 16 */\\r\\n@-moz-keyframes excalibur-button-fadein {\\r\\n from {\\r\\n opacity: 0;\\r\\n }\\r\\n to {\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n/* Safari, Chrome and Opera > 12.1 */\\r\\n@-webkit-keyframes excalibur-button-fadein {\\r\\n from {\\r\\n opacity: 0;\\r\\n }\\r\\n to {\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n/* Internet Explorer */\\r\\n@-ms-keyframes excalibur-button-fadein {\\r\\n from {\\r\\n opacity: 0;\\r\\n }\\r\\n to {\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n/* Opera < 12.1 */\\r\\n@-o-keyframes excalibur-button-fadein {\\r\\n from {\\r\\n opacity: 0;\\r\\n }\\r\\n to {\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n\n\n/***/ }),\n\n/***/ \"./Util/Toaster.css\":\n/*!**************************!*\\\n !*** ./Util/Toaster.css ***!\n \\**************************/\n/***/ ((module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/sourceMaps.js */ \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ \"../../node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `#ex-toast-container {\r\n position: absolute;\r\n height: 0;\r\n min-width: 50%;\r\n left: 50%;\r\n top: 0;\r\n}\r\n\r\n.ex-toast-message {\r\n left: -50%;\r\n position: relative;\r\n display: flex;\r\n justify-content: space-between;\r\n\r\n padding: 10px;\r\n margin-top: 5px;\r\n font-size: 18px;\r\n font-family: sans-serif;\r\n border-radius: 6px;\r\n border: 3px solid #b7b779;\r\n background-color: rgb(253, 253, 192);\r\n}\r\n\r\n.ex-toast-message button {\r\n align-self: flex-start;\r\n}\r\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./Util/Toaster.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,kBAAkB;EAClB,SAAS;EACT,cAAc;EACd,SAAS;EACT,MAAM;AACR;;AAEA;EACE,UAAU;EACV,kBAAkB;EAClB,aAAa;EACb,8BAA8B;;EAE9B,aAAa;EACb,eAAe;EACf,eAAe;EACf,uBAAuB;EACvB,kBAAkB;EAClB,yBAAyB;EACzB,oCAAoC;AACtC;;AAEA;EACE,sBAAsB;AACxB\",\"sourcesContent\":[\"#ex-toast-container {\\r\\n position: absolute;\\r\\n height: 0;\\r\\n min-width: 50%;\\r\\n left: 50%;\\r\\n top: 0;\\r\\n}\\r\\n\\r\\n.ex-toast-message {\\r\\n left: -50%;\\r\\n position: relative;\\r\\n display: flex;\\r\\n justify-content: space-between;\\r\\n\\r\\n padding: 10px;\\r\\n margin-top: 5px;\\r\\n font-size: 18px;\\r\\n font-family: sans-serif;\\r\\n border-radius: 6px;\\r\\n border: 3px solid #b7b779;\\r\\n background-color: rgb(253, 253, 192);\\r\\n}\\r\\n\\r\\n.ex-toast-message button {\\r\\n align-self: flex-start;\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n\n\n/***/ }),\n\n/***/ \"../../node_modules/css-loader/dist/runtime/api.js\":\n/*!*********************************************************!*\\\n !*** ../../node_modules/css-loader/dist/runtime/api.js ***!\n \\*********************************************************/\n/***/ ((module) => {\n\n\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\nmodule.exports = function (cssWithMappingToString) {\n var list = [];\n\n // return the list of modules as css string\n list.toString = function toString() {\n return this.map(function (item) {\n var content = \"\";\n var needLayer = typeof item[5] !== \"undefined\";\n if (item[4]) {\n content += \"@supports (\".concat(item[4], \") {\");\n }\n if (item[2]) {\n content += \"@media \".concat(item[2], \" {\");\n }\n if (needLayer) {\n content += \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\");\n }\n content += cssWithMappingToString(item);\n if (needLayer) {\n content += \"}\";\n }\n if (item[2]) {\n content += \"}\";\n }\n if (item[4]) {\n content += \"}\";\n }\n return content;\n }).join(\"\");\n };\n\n // import a list of modules into the list\n list.i = function i(modules, media, dedupe, supports, layer) {\n if (typeof modules === \"string\") {\n modules = [[null, modules, undefined]];\n }\n var alreadyImportedModules = {};\n if (dedupe) {\n for (var k = 0; k < this.length; k++) {\n var id = this[k][0];\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n for (var _k = 0; _k < modules.length; _k++) {\n var item = [].concat(modules[_k]);\n if (dedupe && alreadyImportedModules[item[0]]) {\n continue;\n }\n if (typeof layer !== \"undefined\") {\n if (typeof item[5] === \"undefined\") {\n item[5] = layer;\n } else {\n item[1] = \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\").concat(item[1], \"}\");\n item[5] = layer;\n }\n }\n if (media) {\n if (!item[2]) {\n item[2] = media;\n } else {\n item[1] = \"@media \".concat(item[2], \" {\").concat(item[1], \"}\");\n item[2] = media;\n }\n }\n if (supports) {\n if (!item[4]) {\n item[4] = \"\".concat(supports);\n } else {\n item[1] = \"@supports (\".concat(item[4], \") {\").concat(item[1], \"}\");\n item[4] = supports;\n }\n }\n list.push(item);\n }\n };\n return list;\n};\n\n/***/ }),\n\n/***/ \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\":\n/*!****************************************************************!*\\\n !*** ../../node_modules/css-loader/dist/runtime/sourceMaps.js ***!\n \\****************************************************************/\n/***/ ((module) => {\n\n\n\nmodule.exports = function (item) {\n var content = item[1];\n var cssMapping = item[3];\n if (!cssMapping) {\n return content;\n }\n if (typeof btoa === \"function\") {\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n var sourceMapping = \"/*# \".concat(data, \" */\");\n return [content].concat([sourceMapping]).join(\"\\n\");\n }\n return [content].join(\"\\n\");\n};\n\n/***/ }),\n\n/***/ \"./Graphics/Context/circle-renderer/circle-renderer.frag.glsl\":\n/*!********************************************************************!*\\\n !*** ./Graphics/Context/circle-renderer/circle-renderer.frag.glsl ***!\n \\********************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nprecision highp float;\\r\\n\\r\\n// UV coord\\r\\nin vec2 v_uv;\\r\\n\\r\\n// Color coord to blend with image\\r\\nin lowp vec4 v_color;\\r\\n\\r\\n// Stroke color if used\\r\\nin lowp vec4 v_strokeColor;\\r\\n\\r\\n// Stroke thickness if used\\r\\nin lowp float v_strokeThickness;\\r\\n\\r\\n// Opacity\\r\\nin float v_opacity;\\r\\n\\r\\nout vec4 fragColor;\\r\\n\\r\\nvoid main() {\\r\\n // make (0, 0) the center the uv \\r\\n vec2 uv = v_uv * 2.0 - 1.0;\\r\\n\\r\\n vec4 color = v_color;\\r\\n vec4 strokeColor = v_strokeColor;\\r\\n\\r\\n // circle border is at radius 1.0 \\r\\n // dist is > 0 when inside the circle \\r\\n float d = length(uv);\\r\\n float dist = 1.0 - length(uv);\\r\\n\\r\\n // Fade based on fwidth\\r\\n float fade = fwidth(dot(uv, uv));\\r\\n\\r\\n // if dist is greater than 0 step to 1;\\r\\n // when we cross this 0 threshold add a smooth fade\\r\\n float fill = smoothstep(-fade/2.0, fade/2.0, dist);\\r\\n\\r\\n // if dist is greater than the stroke thickness step to 1\\r\\n float stroke = 1.0 - smoothstep(v_strokeThickness, v_strokeThickness + fade, dist);\\r\\n\\r\\n strokeColor.a *= fill * stroke;\\r\\n strokeColor.rgb *= strokeColor.a;\\r\\n\\r\\n color.a *= fill * (1.0 - stroke);\\r\\n color.rgb *= color.a;\\r\\n\\r\\n vec4 finalColor = mix(vec4(0.0), (color + strokeColor), fill);\\r\\n finalColor.rgb = finalColor.rgb * v_opacity;\\r\\n finalColor.a = finalColor.a * v_opacity;\\r\\n fragColor = finalColor;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/circle-renderer/circle-renderer.vert.glsl\":\n/*!********************************************************************!*\\\n !*** ./Graphics/Context/circle-renderer/circle-renderer.vert.glsl ***!\n \\********************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nin vec2 a_position;\\r\\n\\r\\n// UV coordinate\\r\\nin vec2 a_uv;\\r\\nout vec2 v_uv;\\r\\n\\r\\n// Opacity \\r\\nin float a_opacity;\\r\\nout float v_opacity;\\r\\n\\r\\nin vec4 a_color;\\r\\nout vec4 v_color;\\r\\n\\r\\nin vec4 a_strokeColor;\\r\\nout vec4 v_strokeColor;\\r\\n\\r\\nin float a_strokeThickness;\\r\\nout float v_strokeThickness;\\r\\n\\r\\nuniform mat4 u_matrix;\\r\\n\\r\\n\\r\\nvoid main() {\\r\\n // Set the vertex position using the ortho transform matrix\\r\\n gl_Position = u_matrix * vec4(a_position, 0.0, 1.0);\\r\\n\\r\\n // Pass through UV coords\\r\\n v_uv = a_uv;\\r\\n // Pass through the Opacity to the fragment shader\\r\\n v_opacity = a_opacity;\\r\\n // Pass through the color to the fragment shader\\r\\n v_color = a_color;\\r\\n // Pass through the stroke color to the fragment shader\\r\\n v_strokeColor = a_strokeColor;\\r\\n // Pass through the stroke thickenss to the fragment shader\\r\\n v_strokeThickness = a_strokeThickness;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/image-renderer-v2/image-renderer-v2.frag.glsl\":\n/*!************************************************************************!*\\\n !*** ./Graphics/Context/image-renderer-v2/image-renderer-v2.frag.glsl ***!\n \\************************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nprecision mediump float;\\r\\n\\r\\n// UV coord\\r\\nin vec2 v_texcoord;\\r\\n\\r\\n// Textures in the current draw\\r\\nuniform sampler2D u_textures[%%count%%];\\r\\n\\r\\nuniform bool u_pixelart;\\r\\n\\r\\nin float v_texture_index;\\r\\n\\r\\nin float v_opacity;\\r\\n\\r\\nin vec4 v_tint;\\r\\n\\r\\n// texture resolution\\r\\nin vec2 v_res;\\r\\n\\r\\nin vec2 v_uv_min;\\r\\nin vec2 v_uv_max;\\r\\n\\r\\nout vec4 fragColor;\\r\\n\\r\\n// Inigo Quilez pixel art filter https://jorenjoestar.github.io/post/pixel_art_filtering/\\r\\nvec2 uv_iq(in vec2 uv, in vec2 texture_size) {\\r\\n vec2 pixel = uv * texture_size;\\r\\n\\r\\n vec2 seam=floor(pixel+.5);\\r\\n vec2 dudv=fwidth(pixel);\\r\\n pixel=seam+clamp((pixel-seam)/dudv,-.5,.5);\\r\\n\\r\\n return pixel/texture_size;\\r\\n}\\r\\n\\r\\nfloat lerp(float from, float to, float rel){\\r\\n return ((1. - rel) * from) + (rel * to);\\r\\n}\\r\\n\\r\\nfloat invLerp(float from, float to, float value){\\r\\n return (value - from) / (to - from);\\r\\n}\\r\\n\\r\\nfloat remap(float origFrom, float origTo, float targetFrom, float targetTo, float value){\\r\\n float rel = invLerp(origFrom, origTo, value);\\r\\n return lerp(targetFrom, targetTo, rel);\\r\\n}\\r\\n\\r\\nvoid main(){\\r\\n // In order to support the most efficient sprite batching, we have multiple\\r\\n // textures loaded into the gpu (usually 8) this picker logic skips over textures\\r\\n // that do not apply to a particular sprite.\\r\\n\\r\\n vec4 color=vec4(1.,0,0,1.);\\r\\n\\r\\n // GLSL is templated out to pick the right texture and set the vec4 color\\r\\n vec2 uv = u_pixelart ? uv_iq(v_texcoord, v_res) : v_texcoord;\\r\\n uv.x = remap(0.,1., v_uv_min.x, v_uv_max.x, uv.x);\\r\\n uv.y = remap(0.,1., v_uv_min.y, v_uv_max.y, uv.y);\\r\\n\\r\\n %%texture_picker%%\\r\\n\\r\\n color.rgb = color.rgb * v_opacity;\\r\\n color.a = color.a * v_opacity;\\r\\n fragColor = color * v_tint;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/image-renderer-v2/image-renderer-v2.vert.glsl\":\n/*!************************************************************************!*\\\n !*** ./Graphics/Context/image-renderer-v2/image-renderer-v2.vert.glsl ***!\n \\************************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nlayout(location=0) in vec2 pos;\\r\\nlayout(location=1) in vec2 a_texcoord;\\r\\nout vec2 v_texcoord;\\r\\n\\r\\nlayout(location=2) in vec2 a_offset;\\r\\nlayout(location=3) in vec2 a_mat_column1;\\r\\nlayout(location=4) in vec2 a_mat_column2;\\r\\nlayout(location=5) in vec2 a_mat_column3;\\r\\n\\r\\nlayout(location=6) in float a_opacity;\\r\\nout float v_opacity;\\r\\n\\r\\n// Texture resolution (could be bigger than a_siz)\\r\\nlayout(location=7) in vec2 a_res;\\r\\nout vec2 v_res;\\r\\n\\r\\n// Final size of graphic\\r\\nlayout(location=8) in vec2 a_size;\\r\\n\\r\\nlayout(location=9) in lowp float a_texture_index;\\r\\nout lowp float v_texture_index;\\r\\n\\r\\nlayout(location=10) in vec2 a_uv_min;\\r\\nout vec2 v_uv_min;\\r\\n\\r\\nlayout(location=11) in vec2 a_uv_max;\\r\\nout vec2 v_uv_max;\\r\\n\\r\\nlayout(location=12) in vec4 a_tint;\\r\\nout vec4 v_tint;\\r\\n\\r\\nuniform mat4 u_matrix;\\r\\n\\r\\nvoid main(){\\r\\n mat4 world_mat = mat4(\\r\\n a_mat_column1.x, a_mat_column1.y, 0., 0.,\\r\\n a_mat_column2.x, a_mat_column2.y, 0., 0.,\\r\\n 0. , 0. , 1., 0.,\\r\\n a_mat_column3.x, a_mat_column3.y, 0., 1.\\r\\n );\\r\\n\\r\\n vec2 newPos = vec2(pos.x * a_res.x, pos.y * a_res.y);\\r\\n gl_Position = u_matrix * world_mat * vec4(newPos + a_offset, 0., 1.);\\r\\n\\r\\n v_opacity = a_opacity;\\r\\n v_texcoord = a_texcoord;\\r\\n v_uv_min = a_uv_min;\\r\\n v_uv_max = a_uv_max;\\r\\n v_res = a_res;\\r\\n v_texture_index = a_texture_index;\\r\\n v_tint = a_tint;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/image-renderer/image-renderer.frag.glsl\":\n/*!******************************************************************!*\\\n !*** ./Graphics/Context/image-renderer/image-renderer.frag.glsl ***!\n \\******************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nprecision mediump float;\\r\\n\\r\\n// UV coord\\r\\nin vec2 v_texcoord;\\r\\n\\r\\n// Texture index\\r\\nin lowp float v_textureIndex;\\r\\n\\r\\n// Textures in the current draw\\r\\nuniform sampler2D u_textures[%%count%%];\\r\\n\\r\\nuniform bool u_pixelart;\\r\\n\\r\\n// Opacity\\r\\nin float v_opacity;\\r\\n\\r\\nin vec4 v_tint;\\r\\n\\r\\nin vec2 v_res;\\r\\n\\r\\nout vec4 fragColor;\\r\\n\\r\\n// Inigo Quilez pixel art filter https://jorenjoestar.github.io/post/pixel_art_filtering/\\r\\nvec2 uv_iq(in vec2 uv, in vec2 texture_size) {\\r\\n vec2 pixel = uv * texture_size;\\r\\n \\r\\n vec2 seam=floor(pixel+.5);\\r\\n vec2 dudv=fwidth(pixel);\\r\\n pixel=seam+clamp((pixel-seam)/dudv,-.5,.5);\\r\\n \\r\\n return pixel/texture_size;\\r\\n}\\r\\n\\r\\nvoid main(){\\r\\n // In order to support the most efficient sprite batching, we have multiple\\r\\n // textures loaded into the gpu (usually 8) this picker logic skips over textures\\r\\n // that do not apply to a particular sprite.\\r\\n \\r\\n vec4 color=vec4(1.,0,0,1.);\\r\\n \\r\\n // GLSL is templated out to pick the right texture and set the vec4 color\\r\\n %%texture_picker%%\\r\\n \\r\\n color.rgb=color.rgb*v_opacity;\\r\\n color.a=color.a*v_opacity;\\r\\n fragColor=color*v_tint;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/image-renderer/image-renderer.vert.glsl\":\n/*!******************************************************************!*\\\n !*** ./Graphics/Context/image-renderer/image-renderer.vert.glsl ***!\n \\******************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nin vec2 a_position;\\r\\n\\r\\n// Opacity\\r\\nin float a_opacity;\\r\\nout float v_opacity;\\r\\n\\r\\n// UV coordinate\\r\\nin vec2 a_texcoord;\\r\\nout vec2 v_texcoord;\\r\\n\\r\\n// Texture res\\r\\nin vec2 a_res;\\r\\nout vec2 v_res;\\r\\n\\r\\n// Texture number\\r\\nin lowp float a_textureIndex;\\r\\nout lowp float v_textureIndex;\\r\\n\\r\\nin vec4 a_tint;\\r\\nout vec4 v_tint;\\r\\n\\r\\nuniform mat4 u_matrix;\\r\\n\\r\\nvoid main(){\\r\\n // Set the vertex position using the ortho transform matrix\\r\\n gl_Position=u_matrix*vec4(a_position,0.,1.);\\r\\n \\r\\n // Pass through the Opacity to the fragment shader\\r\\n v_opacity=a_opacity;\\r\\n // Pass through the UV coord to the fragment shader\\r\\n v_texcoord=a_texcoord;\\r\\n\\r\\n v_res = a_res;\\r\\n\\r\\n // Pass through the texture number to the fragment shader\\r\\n v_textureIndex=a_textureIndex;\\r\\n // Pass through the tint\\r\\n v_tint=a_tint;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/line-renderer/line-fragment.glsl\":\n/*!***********************************************************!*\\\n !*** ./Graphics/Context/line-renderer/line-fragment.glsl ***!\n \\***********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nprecision mediump float;\\r\\n\\r\\n// Color\\r\\nin lowp vec4 v_color;\\r\\n\\r\\nout vec4 fragColor;\\r\\n\\r\\nvoid main() {\\r\\n fragColor = v_color;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/line-renderer/line-vertex.glsl\":\n/*!*********************************************************!*\\\n !*** ./Graphics/Context/line-renderer/line-vertex.glsl ***!\n \\*********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nin vec2 a_position;\\r\\nin vec4 a_color;\\r\\n\\r\\nout lowp vec4 v_color;\\r\\n\\r\\nuniform mat4 u_matrix;\\r\\n\\r\\nvoid main() {\\r\\n // Set the vertex position using the ortho transform matrix\\r\\n gl_Position = u_matrix * vec4(a_position, 0.0, 1.0);\\r\\n\\r\\n // Passthrough the color\\r\\n v_color = a_color;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/particle-renderer/particle-fragment.glsl\":\n/*!*******************************************************************!*\\\n !*** ./Graphics/Context/particle-renderer/particle-fragment.glsl ***!\n \\*******************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nprecision mediump float;\\r\\n\\r\\nuniform sampler2D graphic;\\r\\nuniform bool useTexture;\\r\\nuniform float maxLifeMs;\\r\\n\\r\\nuniform vec4 beginColor;\\r\\nuniform vec4 endColor;\\r\\nuniform bool fade;\\r\\nuniform float startOpacity;\\r\\n\\r\\nin float finalRotation;\\r\\nin float finalLifeMs;\\r\\nout vec4 fragColor;\\r\\n\\r\\nvoid main(){\\r\\n\\r\\n float lifePct = finalLifeMs / maxLifeMs;\\r\\n\\r\\n if (useTexture) {\\r\\n /** Draw texture */\\r\\n if (lifePct <= 0.) discard;\\r\\n float mid = .5;\\r\\n float cosine = cos(finalRotation);\\r\\n float sine = sin(finalRotation);\\r\\n vec2 rotated = vec2(cosine * (gl_PointCoord.x - mid) + sine * (gl_PointCoord.y - mid) + mid,\\r\\n cosine * (gl_PointCoord.y - mid) - sine * (gl_PointCoord.x - mid) + mid);\\r\\n vec4 color = texture(graphic, rotated);\\r\\n fragColor = color * (fade ? lifePct : 1.0);\\r\\n } else {\\r\\n /** Draw circle */\\r\\n if (lifePct <= 0.) discard;\\r\\n vec2 uv = gl_PointCoord.xy * 2.0 - 1.0;\\r\\n float dist = 1.0 - length(uv);\\r\\n float edge = fwidth(dot(uv, uv));\\r\\n float circle = smoothstep(-edge/2.0, edge/2.0, dist);\\r\\n vec3 color = mix(beginColor.rgb, endColor.rgb, 1.0 - lifePct);\\r\\n fragColor.rgb = color;\\r\\n fragColor.a = startOpacity * circle * (fade ? lifePct : 1.0);// * mix(beginColor.a, endColor.a, 1.0 - lifePct);\\r\\n fragColor.rgb *= fragColor.a;\\r\\n }\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/particle-renderer/particle-vertex.glsl\":\n/*!*****************************************************************!*\\\n !*** ./Graphics/Context/particle-renderer/particle-vertex.glsl ***!\n \\*****************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nprecision mediump float;\\r\\n\\r\\nuniform float deltaMs;\\r\\nuniform float maxLifeMs;\\r\\nuniform vec2 gravity;\\r\\nuniform vec2 focus;\\r\\nuniform float focusAccel;\\r\\nuniform mat4 u_matrix;\\r\\nuniform mat4 u_transform;\\r\\nuniform float startSize;\\r\\nuniform float endSize;\\r\\n// uniform sampler2D obstacle;\\r\\n\\r\\nlayout(location=0)in vec2 position;\\r\\nlayout(location=1)in vec2 velocity;\\r\\nlayout(location=2)in float rotation;\\r\\nlayout(location=3)in float angularVelocity;\\r\\nlayout(location=4)in float lifeMs;\\r\\n\\r\\n// TODO z index to handle buffer wrapping?\\r\\n\\r\\n// DO NOT RE-ORDER\\r\\nout vec2 finalPosition;\\r\\nout vec2 finalVelocity;\\r\\nout float finalRotation;\\r\\nout float finalAngularVelocity;\\r\\nout float finalLifeMs;\\r\\nvoid main(){\\r\\n // Evolve particle\\r\\n float seconds = deltaMs / 1000.;\\r\\n // euler integration\\r\\n // Weird artifact of re-using the same buffer layout for update/draw\\r\\n // we need differently named variables\\r\\n vec2 finalGravity = gravity + normalize(focus - position) * focusAccel;\\r\\n finalVelocity = velocity + finalGravity * seconds;\\r\\n finalPosition = position + velocity * seconds + finalGravity * .5 * seconds * seconds;\\r\\n finalRotation = rotation + angularVelocity * seconds;\\r\\n finalAngularVelocity = angularVelocity;\\r\\n finalLifeMs = clamp(lifeMs - deltaMs, 0., maxLifeMs);\\r\\n\\r\\n // Collision mask sampling\\r\\n // vec2 samplePoint = finalPosition / vec2(width, height);\\r\\n // vec4 collides = texture(obstacle, samplePoint);\\r\\n // if (distance(collides,vec4(0.)) > .01) {\\r\\n // // non opaque means we collide! recalc final pos/vel\\r\\n // vec2 newVelocity = velocity * -.1;// lose energy\\r\\n // finalVelocity = newVelocity + gravity * seconds;\\r\\n // finalPosition = position + newVelocity * seconds + gravity * .5 * seconds * seconds;\\r\\n // }\\r\\n\\r\\n float lifePercent = finalLifeMs / maxLifeMs;\\r\\n vec2 transformedPos = (u_matrix * u_transform * vec4(finalPosition,0.,1.)).xy;\\r\\n float scale = sqrt(u_transform[0][0] * u_transform[0][0] + u_transform[1][1] * u_transform[1][1]);\\r\\n gl_Position = vec4(transformedPos, 1.0 - lifePercent, 1.); // use life percent to sort z\\r\\n gl_PointSize = mix(startSize, endSize, 1.0 - lifePercent) * scale;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/point-renderer/point-fragment.glsl\":\n/*!*************************************************************!*\\\n !*** ./Graphics/Context/point-renderer/point-fragment.glsl ***!\n \\*************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\n\\r\\nprecision mediump float;\\r\\nin lowp vec4 v_color;\\r\\n\\r\\nout vec4 fragColor;\\r\\n\\r\\nvoid main() {\\r\\n float r = 0.0, delta = 0.0, alpha = 1.0;\\r\\n vec2 cxy = 2.0 * gl_PointCoord - 1.0;\\r\\n r = dot(cxy, cxy);\\r\\n\\r\\n delta = fwidth(r);\\r\\n alpha = 1.0 - smoothstep(1.0 - delta, 1.0 + delta, r);\\r\\n // \\\"premultiply\\\" the color by alpha\\r\\n vec4 color = v_color;\\r\\n color.a = color.a * alpha;\\r\\n color.rgb = color.rgb * color.a;\\r\\n fragColor = color;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/point-renderer/point-vertex.glsl\":\n/*!***********************************************************!*\\\n !*** ./Graphics/Context/point-renderer/point-vertex.glsl ***!\n \\***********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nin vec2 a_position;\\r\\nin vec4 a_color;\\r\\nin float a_size;\\r\\nout lowp vec4 v_color;\\r\\nuniform mat4 u_matrix;\\r\\n\\r\\nvoid main() {\\r\\n gl_Position = u_matrix * vec4(a_position, 0.0, 1.0);\\r\\n gl_PointSize = a_size * 2.0;\\r\\n v_color = a_color;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/rectangle-renderer/rectangle-renderer.frag.glsl\":\n/*!**************************************************************************!*\\\n !*** ./Graphics/Context/rectangle-renderer/rectangle-renderer.frag.glsl ***!\n \\**************************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\n\\r\\nprecision mediump float;\\r\\n\\r\\n// UV coord\\r\\nin vec2 v_uv;\\r\\n\\r\\nin vec2 v_size; // in pixels\\r\\n\\r\\n// Color coord to blend with image\\r\\nin lowp vec4 v_color;\\r\\n\\r\\n// Stroke color if used\\r\\nin lowp vec4 v_strokeColor;\\r\\n\\r\\n// Stroke thickness if used\\r\\nin lowp float v_strokeThickness; // in pixels\\r\\n\\r\\n// Opacity\\r\\nin float v_opacity;\\r\\n\\r\\nout vec4 fragColor;\\r\\n\\r\\nvoid main() {\\r\\n // modified from https://stackoverflow.com/questions/59197671/glsl-rounded-rectangle-with-variable-border\\r\\n vec2 uv = v_uv;\\r\\n vec2 fragCoord = uv * v_size;\\r\\n float maxX = v_size.x - v_strokeThickness;\\r\\n float minX = v_strokeThickness;\\r\\n float maxY = v_size.y - v_strokeThickness;\\r\\n float minY = v_strokeThickness;\\r\\n\\r\\n if (fragCoord.x < maxX && fragCoord.x > minX &&\\r\\n fragCoord.y < maxY && fragCoord.y > minY) {\\r\\n fragColor = v_color;\\r\\n } else {\\r\\n fragColor = v_strokeColor;\\r\\n }\\r\\n fragColor.a *= v_opacity;\\r\\n fragColor.rgb *= fragColor.a;\\r\\n\\r\\n // vec2 v2CenteredPos = abs(fragCoord - v_size.xy / 2.0);\\r\\n // vec2 v2HalfShapeSizePx = v_size.xy/2.0 - v_strokeThickness/2.0;\\r\\n\\r\\n // float fHalfBorderDist = 0.0;\\r\\n // float fHalfBorderThickness = 0.0;\\r\\n\\r\\n // if (fragCoord.x > max(v_radius, v_strokeThickness) && \\r\\n // fragCoord.x < v_size.x - max(v_radius, v_strokeThickness))\\r\\n // {\\r\\n // fHalfBorderDist = v2CenteredPos.y - v2HalfShapeSizePx.y;\\r\\n // fHalfBorderThickness = v_strokeThickness / 2.0;\\r\\n // }\\r\\n // else if (fragCoord.y > max(v_radius, v_strokeThickness) && \\r\\n // fragCoord.y < v_size.y - max(v_radius, v_strokeThickness))\\r\\n // {\\r\\n // fHalfBorderDist = v2CenteredPos.x - v2HalfShapeSizePx.x;\\r\\n // fHalfBorderThickness = v_strokeThickness / 2.0;\\r\\n // }\\r\\n // else\\r\\n // {\\r\\n // vec2 edgeVec = max(vec2(0.0), v_radius - vec2(\\r\\n // uv.x > 0.5 ? v_size.x - fragCoord.x : fragCoord.x,\\r\\n // uv.y > 0.5 ? v_size.y - fragCoord.y : fragCoord.y));\\r\\n \\r\\n // float ellipse_ab = v_radius-v_strokeThickness;\\r\\n // vec2 ellipse_isect = (v_strokeThickness > v_radius || v_strokeThickness > v_radius) ? vec2(0.0) :\\r\\n // edgeVec.xy * ellipse_ab*ellipse_ab / length(ellipse_ab*edgeVec.yx); \\r\\n \\r\\n // fHalfBorderThickness = (v_radius - length(ellipse_isect)) / 2.0;\\r\\n // fHalfBorderDist = length(edgeVec) - (v_radius - fHalfBorderThickness);\\r\\n // }\\r\\n\\r\\n // vec4 v4FromColor = v_strokeColor;\\r\\n // v4FromColor.rgb *= v4FromColor.a;\\r\\n // vec4 v4ToColor = vec4(0.0); // background color is transparent\\r\\n // if (fHalfBorderDist < 0.0) {\\r\\n // v4ToColor = v_color;\\r\\n // v4ToColor.rgb *= v4ToColor.a;\\r\\n // }\\r\\n\\r\\n // float mixPct = abs(fHalfBorderDist) - fHalfBorderThickness;\\r\\n\\r\\n // vec4 finalColor = mix(v4FromColor, v4ToColor, mixPct);\\r\\n // gl_FragColor = finalColor;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/rectangle-renderer/rectangle-renderer.vert.glsl\":\n/*!**************************************************************************!*\\\n !*** ./Graphics/Context/rectangle-renderer/rectangle-renderer.vert.glsl ***!\n \\**************************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nin vec2 a_position;\\r\\n\\r\\n// UV coordinate\\r\\nin vec2 a_uv;\\r\\nout vec2 v_uv;\\r\\n\\r\\nin vec2 a_size;\\r\\nout vec2 v_size;\\r\\n\\r\\n// Opacity \\r\\nin float a_opacity;\\r\\nout float v_opacity;\\r\\n\\r\\nin vec4 a_color;\\r\\nout vec4 v_color;\\r\\n\\r\\nin vec4 a_strokeColor;\\r\\nout vec4 v_strokeColor;\\r\\n\\r\\nin float a_strokeThickness;\\r\\nout float v_strokeThickness;\\r\\n\\r\\nuniform mat4 u_matrix;\\r\\n\\r\\n\\r\\nvoid main() {\\r\\n // Set the vertex position using the ortho transform matrix\\r\\n gl_Position = u_matrix * vec4(a_position, 0.0, 1.0);\\r\\n\\r\\n // Pass through UV coords\\r\\n v_uv = a_uv;\\r\\n // Pass through size\\r\\n v_size = a_size;\\r\\n // Pass through the Opacity to the fragment shader\\r\\n v_opacity = a_opacity;\\r\\n // Pass through the color to the fragment shader\\r\\n v_color = a_color;\\r\\n // Pass through the stroke color to the fragment shader\\r\\n v_strokeColor = a_strokeColor;\\r\\n // Pass through the stroke thickenss to the fragment shader\\r\\n v_strokeThickness = a_strokeThickness;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/screen-pass-painter/screen-fragment.glsl\":\n/*!*******************************************************************!*\\\n !*** ./Graphics/Context/screen-pass-painter/screen-fragment.glsl ***!\n \\*******************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nprecision mediump float;\\r\\n\\r\\n// Passed in from the vertex shader.\\r\\nin vec2 v_texcoord;\\r\\n\\r\\n// The texture.\\r\\nuniform sampler2D u_texture;\\r\\n\\r\\nout vec4 fragColor;\\r\\n\\r\\nvoid main() {\\r\\n fragColor = texture(u_texture, v_texcoord);\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/screen-pass-painter/screen-vertex.glsl\":\n/*!*****************************************************************!*\\\n !*** ./Graphics/Context/screen-pass-painter/screen-vertex.glsl ***!\n \\*****************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nin vec2 a_position;\\r\\n\\r\\nin vec2 a_texcoord;\\r\\nout vec2 v_texcoord;\\r\\n\\r\\nvoid main() {\\r\\n gl_Position = vec4(a_position, 0.0, 1.0);\\r\\n\\r\\n // Pass the texcoord to the fragment shader.\\r\\n v_texcoord = a_texcoord;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/PostProcessor/color-blind-fragment.glsl\":\n/*!**********************************************************!*\\\n !*** ./Graphics/PostProcessor/color-blind-fragment.glsl ***!\n \\**********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nprecision mediump float;\\r\\n// our texture\\r\\nuniform sampler2D u_image;\\r\\n// the texCoords passed in from the vertex shader.\\r\\nin vec2 v_texcoord;\\r\\n\\r\\n// color blind type\\r\\nuniform int u_type;\\r\\n\\r\\n// simulation?\\r\\nuniform bool u_simulate;\\r\\n\\r\\nout vec4 fragColor;\\r\\n\\r\\nvoid main() {\\r\\n vec4 o = texture(u_image, v_texcoord);\\r\\n // RGB to LMS matrix conversion\\r\\n float L = (17.8824 * o.r) + (43.5161 * o.g) + (4.11935 * o.b);\\r\\n float M = (3.45565 * o.r) + (27.1554 * o.g) + (3.86714 * o.b);\\r\\n float S = (0.0299566 * o.r) + (0.184309 * o.g) + (1.46709 * o.b);\\r\\n // Simulate color blindness\\r\\n float l;\\r\\n float m;\\r\\n float s;\\r\\n //MODE CODE//\\r\\n if (u_type == 0) {\\r\\n // Protanope\\r\\n l = 0.0 * L + 2.02344 * M + -2.52581 * S;\\r\\n m = 0.0 * L + 1.0 * M + 0.0 * S;\\r\\n s = 0.0 * L + 0.0 * M + 1.0 * S;;\\r\\n } else if (u_type == 1) {\\r\\n // Deuteranope\\r\\n l = 1.0 * L + 0.0 * M + 0.0 * S;\\r\\n m = 0.494207 * L + 0.0 * M + 1.24827 * S;\\r\\n s = 0.0 * L + 0.0 * M + 1.0 * S;\\r\\n } else if (u_type == 2) {\\r\\n // Tritanope\\r\\n l = 1.0 * L + 0.0 * M + 0.0 * S;\\r\\n m = 0.0 * L + 1.0 * M + 0.0 * S;\\r\\n s = -0.395913 * L + 0.801109 * M + 0.0 * S;\\r\\n }\\r\\n\\r\\n // LMS to RGB matrix conversion\\r\\n vec4 error; // simulate the colors\\r\\n error.r = (0.0809444479 * l) + (-0.130504409 * m) + (0.116721066 * s);\\r\\n error.g = (-0.0102485335 * l) + (0.0540193266 * m) + (-0.113614708 * s);\\r\\n error.b = (-0.000365296938 * l) + (-0.00412161469 * m) + (0.693511405 * s);\\r\\n error.a = 1.0;\\r\\n vec4 diff = o - error;\\r\\n vec4 correction; // correct the colors\\r\\n correction.r = 0.0;\\r\\n correction.g = (diff.r * 0.7) + (diff.g * 1.0);\\r\\n correction.b = (diff.r * 0.7) + (diff.b * 1.0);\\r\\n correction = o + correction;\\r\\n correction.a = o.a;\\r\\n //SIMULATE//\\r\\n\\r\\n // sim \\r\\n if (u_simulate) {\\r\\n fragColor = error.rgba;\\r\\n } else {\\r\\n fragColor = correction.rgba;\\r\\n }\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Actions/Action.ts\":\n/*!***************************!*\\\n !*** ./Actions/Action.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ nextActionId: () => (/* binding */ nextActionId)\n/* harmony export */ });\nlet _ACTION_ID = 0;\n/**\n *\n */\nfunction nextActionId() {\n return _ACTION_ID++;\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/ActionContext.ts\":\n/*!**********************************!*\\\n !*** ./Actions/ActionContext.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ActionContext: () => (/* binding */ ActionContext)\n/* harmony export */ });\n/* harmony import */ var _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Util/EasingFunctions */ \"./Util/EasingFunctions.ts\");\n/* harmony import */ var _ActionQueue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ActionQueue */ \"./Actions/ActionQueue.ts\");\n/* harmony import */ var _Action_Repeat__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./Action/Repeat */ \"./Actions/Action/Repeat.ts\");\n/* harmony import */ var _Action_RepeatForever__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./Action/RepeatForever */ \"./Actions/Action/RepeatForever.ts\");\n/* harmony import */ var _Action_MoveBy__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Action/MoveBy */ \"./Actions/Action/MoveBy.ts\");\n/* harmony import */ var _Action_MoveTo__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Action/MoveTo */ \"./Actions/Action/MoveTo.ts\");\n/* harmony import */ var _Action_RotateTo__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Action/RotateTo */ \"./Actions/Action/RotateTo.ts\");\n/* harmony import */ var _Action_RotateBy__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Action/RotateBy */ \"./Actions/Action/RotateBy.ts\");\n/* harmony import */ var _Action_ScaleTo__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Action/ScaleTo */ \"./Actions/Action/ScaleTo.ts\");\n/* harmony import */ var _Action_ScaleBy__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Action/ScaleBy */ \"./Actions/Action/ScaleBy.ts\");\n/* harmony import */ var _Action_CallMethod__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Action/CallMethod */ \"./Actions/Action/CallMethod.ts\");\n/* harmony import */ var _Action_EaseTo__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Action/EaseTo */ \"./Actions/Action/EaseTo.ts\");\n/* harmony import */ var _Action_EaseBy__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Action/EaseBy */ \"./Actions/Action/EaseBy.ts\");\n/* harmony import */ var _Action_Blink__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Action/Blink */ \"./Actions/Action/Blink.ts\");\n/* harmony import */ var _Action_Fade__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Action/Fade */ \"./Actions/Action/Fade.ts\");\n/* harmony import */ var _Action_Delay__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Action/Delay */ \"./Actions/Action/Delay.ts\");\n/* harmony import */ var _Action_Die__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./Action/Die */ \"./Actions/Action/Die.ts\");\n/* harmony import */ var _Action_Follow__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./Action/Follow */ \"./Actions/Action/Follow.ts\");\n/* harmony import */ var _Action_Meet__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./Action/Meet */ \"./Actions/Action/Meet.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Math */ \"./Math/vector.ts\");\n/* harmony import */ var _Action_Flash__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Action/Flash */ \"./Actions/Action/Flash.ts\");\n/* harmony import */ var _Action_CurveTo__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Action/CurveTo */ \"./Actions/Action/CurveTo.ts\");\n/* harmony import */ var _Action_CurveBy__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Action/CurveBy */ \"./Actions/Action/CurveBy.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * The fluent Action API allows you to perform \"actions\" on\n * {@apilink Actor | `actors`} such as following, moving, rotating, and\n * more. You can implement your own actions by implementing\n * the {@apilink Action} interface.\n */\nclass ActionContext {\n constructor(entity) {\n this._entity = entity;\n this._queue = new _ActionQueue__WEBPACK_IMPORTED_MODULE_0__.ActionQueue(entity);\n }\n getQueue() {\n return this._queue;\n }\n update(elapsed) {\n this._queue.update(elapsed);\n }\n /**\n * Clears all queued actions from the Actor\n */\n clearActions() {\n this._queue.clearActions();\n }\n runAction(action) {\n action.reset();\n this._queue.add(action);\n return this;\n }\n /**\n * Animates an actor with a specified bezier curve by an offset to the current position, the start point is assumed\n * to be the actors current position\n * @param options\n */\n curveBy(options) {\n this._queue.add(new _Action_CurveBy__WEBPACK_IMPORTED_MODULE_1__.CurveBy(this._entity, options));\n return this;\n }\n /**\n * Animates an actor with a specified bezier curve to an absolute world space coordinate, the start point is assumed\n * to be the actors current position\n * @param options\n */\n curveTo(options) {\n this._queue.add(new _Action_CurveTo__WEBPACK_IMPORTED_MODULE_2__.CurveTo(this._entity, options));\n return this;\n }\n easeTo(...args) {\n var _a, _b;\n let x = 0;\n let y = 0;\n let duration = 0;\n let easingFcn = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_3__.EasingFunctions.Linear;\n if (args[0] instanceof _Math__WEBPACK_IMPORTED_MODULE_4__.Vector) {\n x = args[0].x;\n y = args[0].y;\n duration = args[1];\n easingFcn = (_a = args[2]) !== null && _a !== void 0 ? _a : easingFcn;\n }\n else {\n x = args[0];\n y = args[1];\n duration = args[2];\n easingFcn = (_b = args[3]) !== null && _b !== void 0 ? _b : easingFcn;\n }\n this._queue.add(new _Action_EaseTo__WEBPACK_IMPORTED_MODULE_5__.EaseTo(this._entity, x, y, duration, easingFcn));\n return this;\n }\n easeBy(...args) {\n var _a, _b;\n let offsetX = 0;\n let offsetY = 0;\n let duration = 0;\n let easingFcn = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_3__.EasingFunctions.Linear;\n if (args[0] instanceof _Math__WEBPACK_IMPORTED_MODULE_4__.Vector) {\n offsetX = args[0].x;\n offsetY = args[0].y;\n duration = args[1];\n easingFcn = (_a = args[2]) !== null && _a !== void 0 ? _a : easingFcn;\n }\n else {\n offsetX = args[0];\n offsetY = args[1];\n duration = args[2];\n easingFcn = (_b = args[3]) !== null && _b !== void 0 ? _b : easingFcn;\n }\n this._queue.add(new _Action_EaseBy__WEBPACK_IMPORTED_MODULE_6__.EaseBy(this._entity, offsetX, offsetY, duration, easingFcn));\n return this;\n }\n moveTo(xOrPosOrOptions, yOrSpeed, speedOrUndefined) {\n let x = 0;\n let y = 0;\n let speed = 0;\n if (xOrPosOrOptions instanceof _Math__WEBPACK_IMPORTED_MODULE_4__.Vector) {\n x = xOrPosOrOptions.x;\n y = xOrPosOrOptions.y;\n speed = +(yOrSpeed !== null && yOrSpeed !== void 0 ? yOrSpeed : 0);\n this._queue.add(new _Action_MoveTo__WEBPACK_IMPORTED_MODULE_7__.MoveTo(this._entity, x, y, speed));\n }\n else if (typeof xOrPosOrOptions === 'number' && typeof yOrSpeed === 'number' && typeof speedOrUndefined === 'number') {\n x = xOrPosOrOptions;\n y = yOrSpeed;\n speed = speedOrUndefined;\n this._queue.add(new _Action_MoveTo__WEBPACK_IMPORTED_MODULE_7__.MoveTo(this._entity, x, y, speed));\n }\n else if ((0,_Action_MoveTo__WEBPACK_IMPORTED_MODULE_7__.isMoveToOptions)(xOrPosOrOptions)) {\n this._queue.add(new _Action_MoveTo__WEBPACK_IMPORTED_MODULE_7__.MoveToWithOptions(this._entity, xOrPosOrOptions));\n }\n return this;\n }\n moveBy(xOffsetOrVectorOrOptions, yOffsetOrSpeed, speedOrUndefined) {\n let xOffset = 0;\n let yOffset = 0;\n let speed = 0;\n if (xOffsetOrVectorOrOptions instanceof _Math__WEBPACK_IMPORTED_MODULE_4__.Vector && typeof yOffsetOrSpeed === 'number') {\n xOffset = xOffsetOrVectorOrOptions.x;\n yOffset = xOffsetOrVectorOrOptions.y;\n speed = yOffsetOrSpeed;\n this._queue.add(new _Action_MoveBy__WEBPACK_IMPORTED_MODULE_8__.MoveBy(this._entity, xOffset, yOffset, speed));\n }\n else if (typeof xOffsetOrVectorOrOptions === 'number' && typeof yOffsetOrSpeed === 'number' && typeof speedOrUndefined === 'number') {\n xOffset = xOffsetOrVectorOrOptions;\n yOffset = yOffsetOrSpeed;\n speed = speedOrUndefined;\n this._queue.add(new _Action_MoveBy__WEBPACK_IMPORTED_MODULE_8__.MoveBy(this._entity, xOffset, yOffset, speed));\n }\n else if ((0,_Action_MoveBy__WEBPACK_IMPORTED_MODULE_8__.isMoveByOptions)(xOffsetOrVectorOrOptions)) {\n this._queue.add(new _Action_MoveBy__WEBPACK_IMPORTED_MODULE_8__.MoveByWithOptions(this._entity, xOffsetOrVectorOrOptions));\n }\n return this;\n }\n rotateTo(angleRadiansOrOptions, speed, rotationType) {\n if (typeof angleRadiansOrOptions === 'number' && typeof speed === 'number') {\n this._queue.add(new _Action_RotateTo__WEBPACK_IMPORTED_MODULE_9__.RotateTo(this._entity, angleRadiansOrOptions, speed, rotationType));\n }\n else if (typeof angleRadiansOrOptions === 'object') {\n this._queue.add(new _Action_RotateTo__WEBPACK_IMPORTED_MODULE_9__.RotateToWithOptions(this._entity, angleRadiansOrOptions));\n }\n return this;\n }\n rotateBy(angleRadiansOffsetOrOptions, speed, rotationType) {\n if (typeof angleRadiansOffsetOrOptions === 'object') {\n this._queue.add(new _Action_RotateBy__WEBPACK_IMPORTED_MODULE_10__.RotateByWithOptions(this._entity, angleRadiansOffsetOrOptions));\n }\n else {\n this._queue.add(new _Action_RotateBy__WEBPACK_IMPORTED_MODULE_10__.RotateBy(this._entity, angleRadiansOffsetOrOptions, speed, rotationType));\n }\n return this;\n }\n scaleTo(sizeXOrVectorOrOptions, sizeYOrSpeed, speedXOrUndefined, speedYOrUndefined) {\n let sizeX = 1;\n let sizeY = 1;\n let speedX = 0;\n let speedY = 0;\n if ((0,_Action_ScaleTo__WEBPACK_IMPORTED_MODULE_11__.isScaleToOptions)(sizeXOrVectorOrOptions)) {\n this._queue.add(new _Action_ScaleTo__WEBPACK_IMPORTED_MODULE_11__.ScaleToWithOptions(this._entity, sizeXOrVectorOrOptions));\n return this;\n }\n if (sizeXOrVectorOrOptions instanceof _Math__WEBPACK_IMPORTED_MODULE_4__.Vector && sizeYOrSpeed instanceof _Math__WEBPACK_IMPORTED_MODULE_4__.Vector) {\n sizeX = sizeXOrVectorOrOptions.x;\n sizeY = sizeXOrVectorOrOptions.y;\n speedX = sizeYOrSpeed.x;\n speedY = sizeYOrSpeed.y;\n }\n if (typeof sizeXOrVectorOrOptions === 'number' && typeof sizeYOrSpeed === 'number') {\n sizeX = sizeXOrVectorOrOptions;\n sizeY = sizeYOrSpeed;\n speedX = speedXOrUndefined;\n speedY = speedYOrUndefined;\n }\n this._queue.add(new _Action_ScaleTo__WEBPACK_IMPORTED_MODULE_11__.ScaleTo(this._entity, sizeX, sizeY, speedX, speedY));\n return this;\n }\n scaleBy(sizeOffsetXOrVectorOrOptions, sizeOffsetYOrSpeed, speed) {\n if ((0,_Action_ScaleBy__WEBPACK_IMPORTED_MODULE_12__.isScaleByOptions)(sizeOffsetXOrVectorOrOptions)) {\n this._queue.add(new _Action_ScaleBy__WEBPACK_IMPORTED_MODULE_12__.ScaleByWithOptions(this._entity, sizeOffsetXOrVectorOrOptions));\n return this;\n }\n let sizeOffsetX = 1;\n let sizeOffsetY = 1;\n if (sizeOffsetXOrVectorOrOptions instanceof _Math__WEBPACK_IMPORTED_MODULE_4__.Vector) {\n sizeOffsetX = sizeOffsetXOrVectorOrOptions.x;\n sizeOffsetY = sizeOffsetXOrVectorOrOptions.y;\n speed = sizeOffsetYOrSpeed;\n }\n if (typeof sizeOffsetXOrVectorOrOptions === 'number' && typeof sizeOffsetYOrSpeed === 'number') {\n sizeOffsetX = sizeOffsetXOrVectorOrOptions;\n sizeOffsetY = sizeOffsetYOrSpeed;\n }\n this._queue.add(new _Action_ScaleBy__WEBPACK_IMPORTED_MODULE_12__.ScaleBy(this._entity, sizeOffsetX, sizeOffsetY, speed));\n return this;\n }\n /**\n * This method will cause an actor to blink (become visible and not\n * visible). Optionally, you may specify the number of blinks. Specify the amount of time\n * the actor should be visible per blink, and the amount of time not visible.\n * This method is part of the actor 'Action' fluent API allowing action chaining.\n * @param timeVisible The amount of time to stay visible per blink in milliseconds\n * @param timeNotVisible The amount of time to stay not visible per blink in milliseconds\n * @param numBlinks The number of times to blink\n */\n blink(timeVisible, timeNotVisible, numBlinks = 1) {\n this._queue.add(new _Action_Blink__WEBPACK_IMPORTED_MODULE_13__.Blink(this._entity, timeVisible, timeNotVisible, numBlinks));\n return this;\n }\n /**\n * This method will cause an actor's opacity to change from its current value\n * to the provided value by a specified time (in milliseconds). This method is\n * part of the actor 'Action' fluent API allowing action chaining.\n * @param opacity The ending opacity\n * @param duration The time it should take to fade the actor (in milliseconds)\n */\n fade(opacity, duration) {\n this._queue.add(new _Action_Fade__WEBPACK_IMPORTED_MODULE_14__.Fade(this._entity, opacity, duration));\n return this;\n }\n /**\n * This will cause an actor to flash a specific color for a period of time\n * @param color\n * @param duration The duration in milliseconds\n */\n flash(color, duration = 1000) {\n this._queue.add(new _Action_Flash__WEBPACK_IMPORTED_MODULE_15__.Flash(this._entity, color, duration));\n return this;\n }\n /**\n * This method will delay the next action from executing for a certain\n * amount of time (in milliseconds). This method is part of the actor\n * 'Action' fluent API allowing action chaining.\n * @param duration The amount of time to delay the next action in the queue from executing in milliseconds\n */\n delay(duration) {\n this._queue.add(new _Action_Delay__WEBPACK_IMPORTED_MODULE_16__.Delay(duration));\n return this;\n }\n /**\n * This method will add an action to the queue that will remove the actor from the\n * scene once it has completed its previous Any actions on the\n * action queue after this action will not be executed.\n */\n die() {\n this._queue.add(new _Action_Die__WEBPACK_IMPORTED_MODULE_17__.Die(this._entity));\n return this;\n }\n /**\n * This method allows you to call an arbitrary method as the next action in the\n * action queue. This is useful if you want to execute code in after a specific\n * action, i.e An actor arrives at a destination after traversing a path\n */\n callMethod(method) {\n this._queue.add(new _Action_CallMethod__WEBPACK_IMPORTED_MODULE_18__.CallMethod(method));\n return this;\n }\n /**\n * This method will cause the actor to repeat all of the actions built in\n * the `repeatBuilder` callback. If the number of repeats\n * is not specified it will repeat forever. This method is part of\n * the actor 'Action' fluent API allowing action chaining\n *\n * ```typescript\n * // Move up in a zig-zag by repeated moveBy's\n * actor.actions.repeat(repeatCtx => {\n * repeatCtx.moveBy(10, 0, 10);\n * repeatCtx.moveBy(0, 10, 10);\n * }, 5);\n * ```\n * @param repeatBuilder The builder to specify the repeatable list of actions\n * @param times The number of times to repeat all the previous actions in the action queue. If nothing is specified the actions\n * will repeat forever\n */\n repeat(repeatBuilder, times) {\n if (!times) {\n this.repeatForever(repeatBuilder);\n return this;\n }\n this._queue.add(new _Action_Repeat__WEBPACK_IMPORTED_MODULE_19__.Repeat(this._entity, repeatBuilder, times));\n return this;\n }\n /**\n * This method will cause the actor to repeat all of the actions built in\n * the `repeatBuilder` callback. If the number of repeats\n * is not specified it will repeat forever. This method is part of\n * the actor 'Action' fluent API allowing action chaining\n *\n * ```typescript\n * // Move up in a zig-zag by repeated moveBy's\n * actor.actions.repeat(repeatCtx => {\n * repeatCtx.moveBy(10, 0, 10);\n * repeatCtx.moveBy(0, 10, 10);\n * }, 5);\n * ```\n * @param repeatBuilder The builder to specify the repeatable list of actions\n */\n repeatForever(repeatBuilder) {\n this._queue.add(new _Action_RepeatForever__WEBPACK_IMPORTED_MODULE_20__.RepeatForever(this._entity, repeatBuilder));\n return this;\n }\n /**\n * This method will cause the entity to follow another at a specified distance\n * @param entity The entity to follow\n * @param followDistance The distance to maintain when following, if not specified the actor will follow at the current distance.\n */\n follow(entity, followDistance) {\n if (followDistance === undefined) {\n this._queue.add(new _Action_Follow__WEBPACK_IMPORTED_MODULE_21__.Follow(this._entity, entity));\n }\n else {\n this._queue.add(new _Action_Follow__WEBPACK_IMPORTED_MODULE_21__.Follow(this._entity, entity, followDistance));\n }\n return this;\n }\n /**\n * This method will cause the entity to move towards another until they\n * collide \"meet\" at a specified speed.\n * @param entity The entity to meet\n * @param speed The speed in pixels per second to move, if not specified it will match the speed of the other actor\n */\n meet(entity, speed) {\n if (speed === undefined) {\n this._queue.add(new _Action_Meet__WEBPACK_IMPORTED_MODULE_22__.Meet(this._entity, entity));\n }\n else {\n this._queue.add(new _Action_Meet__WEBPACK_IMPORTED_MODULE_22__.Meet(this._entity, entity, speed));\n }\n return this;\n }\n /**\n * Returns a promise that resolves when the current action queue up to now\n * is finished.\n */\n toPromise() {\n const temp = new Promise((resolve) => {\n this._queue.add(new _Action_CallMethod__WEBPACK_IMPORTED_MODULE_18__.CallMethod(() => {\n resolve();\n }));\n });\n return temp;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/ActionQueue.ts\":\n/*!********************************!*\\\n !*** ./Actions/ActionQueue.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ActionQueue: () => (/* binding */ ActionQueue)\n/* harmony export */ });\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n\n/**\n * Action Queues represent an ordered sequence of actions\n *\n * Action queues are part of the {@apilink ActionContext | `Action API`} and\n * store the list of actions to be executed for an {@apilink Actor}.\n *\n * Actors implement {@apilink Actor.actions} which can be manipulated by\n * advanced users to adjust the actions currently being executed in the\n * queue.\n */\nclass ActionQueue {\n constructor(entity) {\n this._actions = [];\n this._currentAction = null;\n this._completedActions = [];\n this._entity = entity;\n }\n /**\n * Add an action to the sequence\n * @param action\n */\n add(action) {\n this._actions.push(action);\n }\n /**\n * Remove an action by reference from the sequence\n * @param action\n */\n remove(action) {\n const index = this._actions.indexOf(action);\n this._actions.splice(index, 1);\n }\n /**\n * Removes all actions from this sequence\n */\n clearActions() {\n this._actions.length = 0;\n this._completedActions.length = 0;\n if (this._currentAction) {\n this._currentAction.stop();\n }\n }\n /**\n *\n * @returns The total list of actions in this sequence complete or not\n */\n getActions() {\n return this._actions.concat(this._completedActions);\n }\n getIncompleteActions() {\n return this._actions;\n }\n getCurrentAction() {\n return this._currentAction;\n }\n /**\n *\n * @returns `true` if there are more actions to process in the sequence\n */\n hasNext() {\n return this._actions.length > 0;\n }\n /**\n * @returns `true` if the current sequence of actions is done\n */\n isComplete() {\n return this._actions.length === 0;\n }\n /**\n * Resets the sequence of actions, this is used to restart a sequence from the beginning\n */\n reset() {\n this._actions = this.getActions();\n const len = this._actions.length;\n for (let i = 0; i < len; i++) {\n this._actions[i].reset();\n }\n this._completedActions = [];\n }\n /**\n * Update the queue which updates actions and handles completing actions\n * @param elapsed\n */\n update(elapsed) {\n if (this._actions.length > 0) {\n if (this._currentAction !== this._actions[0]) {\n this._currentAction = this._actions[0];\n this._entity.emit('actionstart', new _Events__WEBPACK_IMPORTED_MODULE_0__.ActionStartEvent(this._currentAction, this._entity));\n }\n this._currentAction.update(elapsed);\n if (this._currentAction.isComplete(this._entity)) {\n this._entity.emit('actioncomplete', new _Events__WEBPACK_IMPORTED_MODULE_0__.ActionCompleteEvent(this._currentAction, this._entity));\n const complete = this._actions.shift();\n if (complete) {\n this._completedActions.push(complete);\n }\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/ActionSequence.ts\":\n/*!******************************************!*\\\n !*** ./Actions/Action/ActionSequence.ts ***!\n \\******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ActionSequence: () => (/* binding */ ActionSequence)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _ActionContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ActionContext */ \"./Actions/ActionContext.ts\");\n\n\n/**\n * Action that can represent a sequence of actions, this can be useful in conjunction with\n * {@apilink ParallelActions} to run multiple sequences in parallel.\n */\nclass ActionSequence {\n constructor(entity, actionBuilder) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._stopped = false;\n this._sequenceBuilder = actionBuilder;\n this._sequenceContext = new _ActionContext__WEBPACK_IMPORTED_MODULE_1__.ActionContext(entity);\n this._actionQueue = this._sequenceContext.getQueue();\n this._sequenceBuilder(this._sequenceContext);\n }\n update(elapsed) {\n this._actionQueue.update(elapsed);\n }\n isComplete() {\n return this._stopped || this._actionQueue.isComplete();\n }\n stop() {\n this._stopped = true;\n }\n reset() {\n this._stopped = false;\n this._actionQueue.reset();\n }\n clone(entity) {\n return new ActionSequence(entity, this._sequenceBuilder);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/Blink.ts\":\n/*!*********************************!*\\\n !*** ./Actions/Action/Blink.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Blink: () => (/* binding */ Blink)\n/* harmony export */ });\n/* harmony import */ var _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Graphics/GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\nclass Blink {\n constructor(entity, timeVisible, timeNotVisible, numBlinks = 1) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._timeVisible = 0;\n this._timeNotVisible = 0;\n this._elapsedTime = 0;\n this._totalTime = 0;\n this._stopped = false;\n this._started = false;\n this._graphics = entity.get(_Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_1__.GraphicsComponent);\n this._timeVisible = timeVisible;\n this._timeNotVisible = timeNotVisible;\n this._duration = (timeVisible + timeNotVisible) * numBlinks;\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._elapsedTime = 0;\n this._totalTime = 0;\n }\n if (!this._graphics) {\n return;\n }\n this._elapsedTime += elapsed;\n this._totalTime += elapsed;\n if (this._graphics.isVisible && this._elapsedTime >= this._timeVisible) {\n this._graphics.isVisible = false;\n this._elapsedTime = 0;\n }\n if (!this._graphics.isVisible && this._elapsedTime >= this._timeNotVisible) {\n this._graphics.isVisible = true;\n this._elapsedTime = 0;\n }\n if (this.isComplete()) {\n this._graphics.isVisible = true;\n }\n }\n isComplete() {\n return this._stopped || this._totalTime >= this._duration;\n }\n stop() {\n if (this._graphics) {\n this._graphics.isVisible = true;\n }\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n this._elapsedTime = 0;\n this._totalTime = 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/CallMethod.ts\":\n/*!**************************************!*\\\n !*** ./Actions/Action/CallMethod.ts ***!\n \\**************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CallMethod: () => (/* binding */ CallMethod)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\nclass CallMethod {\n constructor(method) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._hasBeenCalled = false;\n this._method = method;\n }\n update(elapsed) {\n this._method();\n this._hasBeenCalled = true;\n }\n isComplete() {\n return this._hasBeenCalled;\n }\n reset() {\n this._hasBeenCalled = false;\n }\n stop() {\n this._hasBeenCalled = true;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/CurveBy.ts\":\n/*!***********************************!*\\\n !*** ./Actions/Action/CurveBy.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CurveBy: () => (/* binding */ CurveBy)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../EntityComponentSystem */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math */ \"./Math/bezier-curve.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math */ \"./Math/vector.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Math */ \"./Math/util.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math */ \"./Math/lerp.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\nclass CurveBy {\n constructor(entity, options) {\n var _a;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._mode = 'dynamic';\n this._entity = entity;\n this._tx = this._entity.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n if (!this._tx) {\n throw new Error(`Entity ${entity.name} has no TransformComponent, can only curveTo on Entities with TransformComponents.`);\n }\n this._curve = this._curve = new _Math__WEBPACK_IMPORTED_MODULE_2__.BezierCurve({\n controlPoints: [(0,_Math__WEBPACK_IMPORTED_MODULE_3__.vec)(0, 0), ...options.controlPoints],\n quality: options.quality\n });\n this._durationMs = options.duration;\n this._mode = (_a = options.mode) !== null && _a !== void 0 ? _a : this._mode;\n this._currentMs = this._durationMs;\n }\n update(elapsed) {\n if (!this._started) {\n this._curve.setControlPoint(0, this._tx.globalPos);\n this._curve.setControlPoint(1, this._curve.controlPoints[1].add(this._tx.globalPos));\n this._curve.setControlPoint(2, this._curve.controlPoints[2].add(this._tx.globalPos));\n this._curve.setControlPoint(3, this._curve.controlPoints[3].add(this._tx.globalPos));\n this._started = true;\n }\n this._currentMs -= elapsed;\n const t = (0,_Math__WEBPACK_IMPORTED_MODULE_4__.clamp)((0,_Math__WEBPACK_IMPORTED_MODULE_5__.remap)(0, this._durationMs, 0, 1, this._durationMs - this._currentMs), 0, 1);\n if (this._mode === 'dynamic') {\n this._tx.pos = this._curve.getPoint(t);\n }\n else {\n this._tx.pos = this._curve.getUniformPoint(t);\n }\n if (this.isComplete(this._entity)) {\n if (this._mode === 'dynamic') {\n this._tx.pos = this._curve.getPoint(1);\n }\n else {\n this._tx.pos = this._curve.getUniformPoint(1);\n }\n }\n }\n isComplete(entity) {\n return this._stopped || this._currentMs < 0;\n }\n reset() {\n this._currentMs = this._durationMs;\n this._started = false;\n this._stopped = false;\n }\n stop() {\n this._stopped = true;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/CurveTo.ts\":\n/*!***********************************!*\\\n !*** ./Actions/Action/CurveTo.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CurveTo: () => (/* binding */ CurveTo)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../EntityComponentSystem */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math */ \"./Math/bezier-curve.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math */ \"./Math/vector.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Math */ \"./Math/util.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math */ \"./Math/lerp.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\nclass CurveTo {\n constructor(entity, options) {\n var _a;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._mode = 'dynamic';\n this._entity = entity;\n this._tx = this._entity.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n if (!this._tx) {\n throw new Error(`Entity ${entity.name} has no TransformComponent, can only curveTo on Entities with TransformComponents.`);\n }\n this._curve = new _Math__WEBPACK_IMPORTED_MODULE_2__.BezierCurve({\n controlPoints: [(0,_Math__WEBPACK_IMPORTED_MODULE_3__.vec)(0, 0), ...options.controlPoints],\n quality: options.quality\n });\n this._durationMs = options.duration;\n this._mode = (_a = options.mode) !== null && _a !== void 0 ? _a : this._mode;\n this._currentMs = this._durationMs;\n }\n update(elapsed) {\n if (!this._started) {\n this._curve.setControlPoint(0, this._tx.globalPos.clone());\n this._started = true;\n }\n this._currentMs -= elapsed;\n const t = (0,_Math__WEBPACK_IMPORTED_MODULE_4__.clamp)((0,_Math__WEBPACK_IMPORTED_MODULE_5__.remap)(0, this._durationMs, 0, 1, this._durationMs - this._currentMs), 0, 1);\n if (this._mode === 'dynamic') {\n this._tx.pos = this._curve.getPoint(t);\n }\n else {\n this._tx.pos = this._curve.getUniformPoint(t);\n }\n if (this.isComplete(this._entity)) {\n if (this._mode === 'dynamic') {\n this._tx.pos = this._curve.getPoint(1);\n }\n else {\n this._tx.pos = this._curve.getUniformPoint(1);\n }\n }\n }\n isComplete(entity) {\n return this._stopped || this._currentMs < 0;\n }\n reset() {\n this._currentMs = this._durationMs;\n this._started = false;\n this._stopped = false;\n }\n stop() {\n this._stopped = true;\n this._currentMs = 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/Delay.ts\":\n/*!*********************************!*\\\n !*** ./Actions/Action/Delay.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Delay: () => (/* binding */ Delay)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\nclass Delay {\n constructor(duration) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._elapsedTime = 0;\n this._started = false;\n this._stopped = false;\n this._delay = duration;\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n }\n this._elapsedTime += elapsed;\n }\n isComplete() {\n return this._stopped || this._elapsedTime >= this._delay;\n }\n stop() {\n this._stopped = true;\n }\n reset() {\n this._elapsedTime = 0;\n this._started = false;\n this._stopped = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/Die.ts\":\n/*!*******************************!*\\\n !*** ./Actions/Action/Die.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Die: () => (/* binding */ Die)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _ActionsComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ActionsComponent */ \"./Actions/ActionsComponent.ts\");\n\n\nclass Die {\n constructor(entity) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._stopped = false;\n this._entity = entity;\n }\n update(elapsed) {\n this._entity.get(_ActionsComponent__WEBPACK_IMPORTED_MODULE_1__.ActionsComponent).clearActions();\n this._entity.kill();\n this._stopped = true;\n }\n isComplete() {\n return this._stopped;\n }\n stop() {\n return;\n }\n reset() {\n return;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/EaseBy.ts\":\n/*!**********************************!*\\\n !*** ./Actions/Action/EaseBy.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EaseBy: () => (/* binding */ EaseBy)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\n\n/**\n * @deprecated use moveBy({offset: Vector, duration: number, easing: EasingFunction})\n */\nclass EaseBy {\n constructor(entity, offsetX, offsetY, duration, easingFcn) {\n this.easingFcn = easingFcn;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._currentLerpTime = 0;\n this._lerpDuration = 1 * 1000; // 1 second\n this._lerpStart = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(0, 0);\n this._lerpEnd = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(0, 0);\n this._initialized = false;\n this._stopped = false;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__.MotionComponent);\n this._lerpDuration = duration;\n this._offset = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(offsetX, offsetY);\n }\n _initialize() {\n this._lerpStart = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this._tx.pos.x, this._tx.pos.y);\n this._currentLerpTime = 0;\n this._lerpEnd = this._lerpStart.add(this._offset);\n }\n update(elapsed) {\n if (!this._initialized) {\n this._initialize();\n this._initialized = true;\n }\n // Need to update lerp time first, otherwise the first update will always be zero\n this._currentLerpTime += elapsed;\n let newX = this._tx.pos.x;\n let newY = this._tx.pos.y;\n if (this._currentLerpTime < this._lerpDuration) {\n if (this._lerpEnd.x < this._lerpStart.x) {\n newX =\n this._lerpStart.x -\n (this.easingFcn(this._currentLerpTime, this._lerpEnd.x, this._lerpStart.x, this._lerpDuration) - this._lerpEnd.x);\n }\n else {\n newX = this.easingFcn(this._currentLerpTime, this._lerpStart.x, this._lerpEnd.x, this._lerpDuration);\n }\n if (this._lerpEnd.y < this._lerpStart.y) {\n newY =\n this._lerpStart.y -\n (this.easingFcn(this._currentLerpTime, this._lerpEnd.y, this._lerpStart.y, this._lerpDuration) - this._lerpEnd.y);\n }\n else {\n newY = this.easingFcn(this._currentLerpTime, this._lerpStart.y, this._lerpEnd.y, this._lerpDuration);\n }\n // Given the lerp position figure out the velocity in pixels per second\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)((newX - this._tx.pos.x) / (elapsed / 1000), (newY - this._tx.pos.y) / (elapsed / 1000));\n }\n else {\n this._tx.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(this._lerpEnd.x, this._lerpEnd.y);\n this._motion.vel = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n }\n }\n isComplete() {\n return this._stopped || this._currentLerpTime >= this._lerpDuration;\n }\n reset() {\n this._initialized = false;\n this._stopped = false;\n this._currentLerpTime = 0;\n }\n stop() {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0);\n this._stopped = true;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/EaseTo.ts\":\n/*!**********************************!*\\\n !*** ./Actions/Action/EaseTo.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EaseTo: () => (/* binding */ EaseTo)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\n\n/**\n * @deprecated use moveTo({pos: Vector, duration: number, easing: EasingFunction})\n */\nclass EaseTo {\n constructor(entity, x, y, duration, easingFcn) {\n this.easingFcn = easingFcn;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._currentLerpTime = 0;\n this._lerpDuration = 1 * 1000; // 1 second\n this._lerpStart = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(0, 0);\n this._lerpEnd = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(0, 0);\n this._initialized = false;\n this._stopped = false;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__.MotionComponent);\n this._lerpDuration = duration;\n this._lerpEnd = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(x, y);\n }\n _initialize() {\n this._lerpStart = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this._tx.pos.x, this._tx.pos.y);\n this._currentLerpTime = 0;\n }\n update(elapsed) {\n if (!this._initialized) {\n this._initialize();\n this._initialized = true;\n }\n // Need to update lerp time first, otherwise the first update will always be zero\n this._currentLerpTime += elapsed;\n let newX = this._tx.pos.x;\n let newY = this._tx.pos.y;\n if (this._currentLerpTime < this._lerpDuration) {\n if (this._lerpEnd.x < this._lerpStart.x) {\n newX =\n this._lerpStart.x -\n (this.easingFcn(this._currentLerpTime, this._lerpEnd.x, this._lerpStart.x, this._lerpDuration) - this._lerpEnd.x);\n }\n else {\n newX = this.easingFcn(this._currentLerpTime, this._lerpStart.x, this._lerpEnd.x, this._lerpDuration);\n }\n if (this._lerpEnd.y < this._lerpStart.y) {\n newY =\n this._lerpStart.y -\n (this.easingFcn(this._currentLerpTime, this._lerpEnd.y, this._lerpStart.y, this._lerpDuration) - this._lerpEnd.y);\n }\n else {\n newY = this.easingFcn(this._currentLerpTime, this._lerpStart.y, this._lerpEnd.y, this._lerpDuration);\n }\n // Given the lerp position figure out the velocity in pixels per second\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)((newX - this._tx.pos.x) / (elapsed / 1000), (newY - this._tx.pos.y) / (elapsed / 1000));\n }\n else {\n this._tx.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(this._lerpEnd.x, this._lerpEnd.y);\n this._motion.vel = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n }\n }\n isComplete() {\n return this._stopped || this._currentLerpTime >= this._lerpDuration;\n }\n reset() {\n this._initialized = false;\n this._stopped = false;\n this._currentLerpTime = 0;\n }\n stop() {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0);\n this._stopped = true;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/Fade.ts\":\n/*!********************************!*\\\n !*** ./Actions/Action/Fade.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Fade: () => (/* binding */ Fade)\n/* harmony export */ });\n/* harmony import */ var _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Graphics/GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\nclass Fade {\n constructor(entity, endOpacity, duration) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._multiplier = 1;\n this._started = false;\n this._stopped = false;\n this._graphics = entity.get(_Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_1__.GraphicsComponent);\n this._endOpacity = endOpacity;\n this._remainingTime = this._originalTime = duration;\n }\n update(elapsed) {\n if (!this._graphics) {\n return;\n }\n if (!this._started) {\n this._started = true;\n this._remainingTime = this._originalTime;\n // determine direction when we start\n if (this._endOpacity < this._graphics.opacity) {\n this._multiplier = -1;\n }\n else {\n this._multiplier = 1;\n }\n }\n if (this._remainingTime > 0) {\n this._graphics.opacity += (this._multiplier * (Math.abs(this._graphics.opacity - this._endOpacity) * elapsed)) / this._remainingTime;\n }\n this._remainingTime -= elapsed;\n if (this.isComplete()) {\n this._graphics.opacity = this._endOpacity;\n }\n _Util_Log__WEBPACK_IMPORTED_MODULE_2__.Logger.getInstance().debug('[Action fade] Actor opacity:', this._graphics.opacity);\n }\n isComplete() {\n return this._stopped || this._remainingTime <= 0;\n }\n stop() {\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n this._remainingTime = this._originalTime;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/Flash.ts\":\n/*!*********************************!*\\\n !*** ./Actions/Action/Flash.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Flash: () => (/* binding */ Flash)\n/* harmony export */ });\n/* harmony import */ var _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Graphics/GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\nclass Flash {\n constructor(entity, color, duration = 1000) {\n var _a;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._stopped = false;\n this._started = false;\n this._total = 0;\n this._currentDuration = 0;\n this._graphics = entity.get(_Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_1__.GraphicsComponent);\n this._duration = duration;\n this._entity = entity;\n this._material = (_a = entity.scene) === null || _a === void 0 ? void 0 : _a.engine.graphicsContext.createMaterial({\n name: 'flash-material',\n color,\n fragmentSource: `#version 300 es\r\n \r\n precision mediump float;\r\n uniform float u_blend;\r\n uniform sampler2D u_graphic;\r\n uniform vec4 u_color;\r\n \r\n in vec2 v_uv; \r\n out vec4 color;\r\n \r\n void main() { \r\n vec4 textureColor = texture(u_graphic, v_uv); \r\n color = mix(textureColor, u_color, u_blend * textureColor.a);\r\n color.rgb = color.rgb * color.a;\r\n }`\n });\n this._total = duration;\n }\n update(elapsed) {\n var _a;\n if (!this._started) {\n this._started = true;\n this._total = this._duration;\n this._currentDuration = this._duration;\n this._entity.graphics.material = this._material;\n }\n if (!this._graphics) {\n return;\n }\n this._currentDuration -= elapsed;\n if (this._graphics) {\n (_a = this._material) === null || _a === void 0 ? void 0 : _a.update((shader) => {\n shader.trySetUniformFloat('u_blend', this._currentDuration / this._total);\n });\n }\n if (this.isComplete()) {\n this._entity.graphics.material = null;\n }\n }\n isComplete() {\n return this._stopped || this._currentDuration <= 0;\n }\n stop() {\n if (this._graphics) {\n this._graphics.isVisible = true;\n }\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/Follow.ts\":\n/*!**********************************!*\\\n !*** ./Actions/Action/Follow.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Follow: () => (/* binding */ Follow)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\n\nclass Follow {\n constructor(entity, entityToFollow, followDistance) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n this._followTx = entityToFollow.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._followMotion = entityToFollow.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n this._current = new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(this._tx.pos.x, this._tx.pos.y);\n this._end = new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(this._followTx.pos.x, this._followTx.pos.y);\n this._maximumDistance = followDistance !== undefined ? followDistance : this._current.distance(this._end);\n this._speed = 0;\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._distanceBetween = this._current.distance(this._end);\n this._dir = this._end.sub(this._current).normalize();\n }\n const actorToFollowSpeed = Math.sqrt(Math.pow(this._followMotion.vel.x, 2) + Math.pow(this._followMotion.vel.y, 2));\n if (actorToFollowSpeed !== 0) {\n this._speed = actorToFollowSpeed;\n }\n this._current = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this._tx.pos.x, this._tx.pos.y);\n this._end = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this._followTx.pos.x, this._followTx.pos.y);\n this._distanceBetween = this._current.distance(this._end);\n this._dir = this._end.sub(this._current).normalize();\n if (this._distanceBetween >= this._maximumDistance) {\n const m = this._dir.scale(this._speed);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(m.x, m.y);\n }\n else {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(0, 0);\n }\n if (this.isComplete()) {\n this._tx.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this._end.x, this._end.y);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(0, 0);\n }\n }\n stop() {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(0, 0);\n this._stopped = true;\n }\n isComplete() {\n // the actor following should never stop unless specified to do so\n return this._stopped;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/Meet.ts\":\n/*!********************************!*\\\n !*** ./Actions/Action/Meet.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Meet: () => (/* binding */ Meet)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\n\nclass Meet {\n constructor(actor, actorToMeet, speed) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._speedWasSpecified = false;\n this._tx = actor.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._motion = actor.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n this._meetTx = actorToMeet.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._meetMotion = actorToMeet.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n this._current = new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(this._tx.pos.x, this._tx.pos.y);\n this._end = new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(this._meetTx.pos.x, this._meetTx.pos.y);\n this._speed = speed || 0;\n if (speed !== undefined) {\n this._speedWasSpecified = true;\n }\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._distanceBetween = this._current.distance(this._end);\n this._dir = this._end.sub(this._current).normalize();\n }\n const actorToMeetSpeed = Math.sqrt(Math.pow(this._meetMotion.vel.x, 2) + Math.pow(this._meetMotion.vel.y, 2));\n if (actorToMeetSpeed !== 0 && !this._speedWasSpecified) {\n this._speed = actorToMeetSpeed;\n }\n this._current = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this._tx.pos.x, this._tx.pos.y);\n this._end = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this._meetTx.pos.x, this._meetTx.pos.y);\n this._distanceBetween = this._current.distance(this._end);\n this._dir = this._end.sub(this._current).normalize();\n const m = this._dir.scale(this._speed);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(m.x, m.y);\n if (this.isComplete()) {\n this._tx.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this._end.x, this._end.y);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(0, 0);\n }\n }\n isComplete() {\n return this._stopped || this._distanceBetween <= 1;\n }\n stop() {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(0, 0);\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n this._distanceBetween = Infinity;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/MoveBy.ts\":\n/*!**********************************!*\\\n !*** ./Actions/Action/MoveBy.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MoveBy: () => (/* binding */ MoveBy),\n/* harmony export */ MoveByWithOptions: () => (/* binding */ MoveByWithOptions),\n/* harmony export */ isMoveByOptions: () => (/* binding */ isMoveByOptions)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math */ \"./Math/util.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../Math */ \"./Math/lerp.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Util/EasingFunctions */ \"./Util/EasingFunctions.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\n\n\n\n\n/**\n *\n */\nfunction isMoveByOptions(x) {\n return x.offset instanceof _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector && typeof x.duration === 'number';\n}\nclass MoveByWithOptions {\n constructor(entity, options) {\n var _a;\n this.entity = entity;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_1__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._easing = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_2__.EasingFunctions.Linear;\n this._offset = options.offset;\n this._easing = (_a = options.easing) !== null && _a !== void 0 ? _a : this._easing;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_4__.MotionComponent);\n if (!this._tx) {\n throw new Error(`Entity ${entity.name} has no TransformComponent, can only MoveBy on Entities with TransformComponents.`);\n }\n this._durationMs = options.duration;\n this._currentMs = this._durationMs;\n }\n update(elapsed) {\n if (!this._started) {\n this._start = this._tx.pos.clone();\n this._end = this._start.add(this._offset);\n this._started = true;\n }\n this._currentMs -= elapsed;\n const t = (0,_Math__WEBPACK_IMPORTED_MODULE_5__.clamp)((0,_Math__WEBPACK_IMPORTED_MODULE_6__.remap)(0, this._durationMs, 0, 1, this._durationMs - this._currentMs), 0, 1);\n const currentPos = this._tx.pos;\n const newPosX = this._easing(t, this._start.x, this._end.x, 1);\n const newPosY = this._easing(t, this._start.y, this._end.y, 1);\n const velX = (newPosX - currentPos.x) / (elapsed / 1000);\n const velY = (newPosY - currentPos.y) / (elapsed / 1000);\n this._motion.vel.x = velX;\n this._motion.vel.y = velY;\n if (this.isComplete(this.entity)) {\n this._tx.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this._end.x, this._end.y);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n }\n }\n isComplete(entity) {\n return this._stopped || this._currentMs < 0;\n }\n stop() {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n this._stopped = true;\n this._currentMs = 0;\n }\n reset() {\n this._currentMs = this._durationMs;\n this._started = false;\n this._stopped = false;\n }\n}\nclass MoveBy {\n constructor(entity, offsetX, offsetY, speed) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_1__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._entity = entity;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_4__.MotionComponent);\n this._speed = speed;\n this._offset = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(offsetX, offsetY);\n if (speed <= 0) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_7__.Logger.getInstance().error('Attempted to moveBy with speed less than or equal to zero : ' + speed);\n throw new Error('Speed must be greater than 0 pixels per second');\n }\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._start = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(this._tx.pos.x, this._tx.pos.y);\n this._end = this._start.add(this._offset);\n this._distance = this._offset.magnitude;\n this._dir = this._end.sub(this._start).normalize();\n }\n if (this.isComplete(this._entity)) {\n this._tx.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this._end.x, this._end.y);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n }\n else {\n this._motion.vel = this._dir.scale(this._speed);\n }\n }\n isComplete(entity) {\n const tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__.TransformComponent);\n return this._stopped || tx.pos.distance(this._start) >= this._distance;\n }\n stop() {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/MoveTo.ts\":\n/*!**********************************!*\\\n !*** ./Actions/Action/MoveTo.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MoveTo: () => (/* binding */ MoveTo),\n/* harmony export */ MoveToWithOptions: () => (/* binding */ MoveToWithOptions),\n/* harmony export */ isMoveToOptions: () => (/* binding */ isMoveToOptions)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math */ \"./Math/util.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../Math */ \"./Math/lerp.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Util/EasingFunctions */ \"./Util/EasingFunctions.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\n\n\n\n/**\n *\n */\nfunction isMoveToOptions(x) {\n return x.pos instanceof _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector && typeof x.duration === 'number';\n}\nclass MoveToWithOptions {\n constructor(entity, options) {\n var _a;\n this.entity = entity;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_1__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._easing = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_2__.EasingFunctions.Linear;\n this._end = options.pos;\n this._easing = (_a = options.easing) !== null && _a !== void 0 ? _a : this._easing;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_4__.MotionComponent);\n if (!this._tx) {\n throw new Error(`Entity ${entity.name} has no TransformComponent, can only moveTo on Entities with TransformComponents.`);\n }\n this._durationMs = options.duration;\n this._currentMs = this._durationMs;\n }\n update(elapsed) {\n if (!this._started) {\n this._start = this._tx.pos.clone();\n this._started = true;\n }\n this._currentMs -= elapsed;\n const t = (0,_Math__WEBPACK_IMPORTED_MODULE_5__.clamp)((0,_Math__WEBPACK_IMPORTED_MODULE_6__.remap)(0, this._durationMs, 0, 1, this._durationMs - this._currentMs), 0, 1);\n const currentPos = this._tx.pos;\n const newPosX = this._easing(t, this._start.x, this._end.x, 1);\n const newPosY = this._easing(t, this._start.y, this._end.y, 1);\n const velX = (newPosX - currentPos.x) / (elapsed / 1000);\n const velY = (newPosY - currentPos.y) / (elapsed / 1000);\n this._motion.vel.x = velX;\n this._motion.vel.y = velY;\n if (this.isComplete(this.entity)) {\n this._tx.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this._end.x, this._end.y);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n }\n }\n isComplete(entity) {\n return this._stopped || this._currentMs < 0;\n }\n stop() {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n this._stopped = true;\n this._currentMs = 0;\n }\n reset() {\n this._currentMs = this._durationMs;\n this._started = false;\n this._stopped = false;\n }\n}\nclass MoveTo {\n constructor(entity, destX, destY, speed) {\n this.entity = entity;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_1__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_4__.MotionComponent);\n this._end = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(destX, destY);\n this._speed = speed;\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._start = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(this._tx.pos.x, this._tx.pos.y);\n this._distance = this._start.distance(this._end);\n this._dir = this._end.sub(this._start).normalize();\n }\n const m = this._dir.scale(this._speed);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(m.x, m.y);\n if (this.isComplete(this.entity)) {\n this._tx.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this._end.x, this._end.y);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n }\n }\n isComplete(entity) {\n const tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__.TransformComponent);\n return this._stopped || new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(tx.pos.x, tx.pos.y).distance(this._start) >= this._distance;\n }\n stop() {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/ParallelActions.ts\":\n/*!*******************************************!*\\\n !*** ./Actions/Action/ParallelActions.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ParallelActions: () => (/* binding */ ParallelActions)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n/**\n * Action that can run multiple {@apilink Action}s or {@apilink ActionSequence}s at the same time\n */\nclass ParallelActions {\n constructor(parallelActions) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._actions = parallelActions;\n }\n update(elapsed) {\n for (let i = 0; i < this._actions.length; i++) {\n this._actions[i].update(elapsed);\n }\n }\n isComplete(entity) {\n return this._actions.every((a) => a.isComplete(entity));\n }\n reset() {\n this._actions.forEach((a) => a.reset());\n }\n stop() {\n this._actions.forEach((a) => a.stop());\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/Repeat.ts\":\n/*!**********************************!*\\\n !*** ./Actions/Action/Repeat.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Repeat: () => (/* binding */ Repeat)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _ActionContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ActionContext */ \"./Actions/ActionContext.ts\");\n\n\nclass Repeat {\n constructor(entity, repeatBuilder, repeat) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._stopped = false;\n this._repeatBuilder = repeatBuilder;\n this._repeatContext = new _ActionContext__WEBPACK_IMPORTED_MODULE_1__.ActionContext(entity);\n this._actionQueue = this._repeatContext.getQueue();\n this._repeat = repeat;\n this._originalRepeat = repeat;\n this._repeatBuilder(this._repeatContext);\n this._repeat--; // current execution is the first repeat\n }\n update(elapsed) {\n if (this._actionQueue.isComplete()) {\n this._actionQueue.clearActions();\n this._repeatBuilder(this._repeatContext);\n this._repeat--;\n }\n this._actionQueue.update(elapsed);\n }\n isComplete() {\n return this._stopped || (this._repeat <= 0 && this._actionQueue.isComplete());\n }\n stop() {\n this._stopped = true;\n }\n reset() {\n this._repeat = this._originalRepeat;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/RepeatForever.ts\":\n/*!*****************************************!*\\\n !*** ./Actions/Action/RepeatForever.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RepeatForever: () => (/* binding */ RepeatForever)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _ActionContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ActionContext */ \"./Actions/ActionContext.ts\");\n\n\n/**\n * RepeatForever Action implementation, it is recommended you use the fluent action\n * context API.\n *\n *\n */\nclass RepeatForever {\n constructor(entity, repeatBuilder) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._stopped = false;\n this._repeatBuilder = repeatBuilder;\n this._repeatContext = new _ActionContext__WEBPACK_IMPORTED_MODULE_1__.ActionContext(entity);\n this._actionQueue = this._repeatContext.getQueue();\n this._repeatBuilder(this._repeatContext);\n }\n update(elapsed) {\n if (this._stopped) {\n return;\n }\n if (this._actionQueue.isComplete()) {\n this._actionQueue.clearActions();\n this._repeatBuilder(this._repeatContext);\n }\n this._actionQueue.update(elapsed);\n }\n isComplete() {\n return this._stopped;\n }\n stop() {\n this._stopped = true;\n this._actionQueue.clearActions();\n }\n reset() {\n return;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/RotateBy.ts\":\n/*!************************************!*\\\n !*** ./Actions/Action/RotateBy.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RotateBy: () => (/* binding */ RotateBy),\n/* harmony export */ RotateByWithOptions: () => (/* binding */ RotateByWithOptions),\n/* harmony export */ isRotateByOptions: () => (/* binding */ isRotateByOptions)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math */ \"./Math/rotation-type.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math */ \"./Math/lerp.ts\");\n\n\n\n\n\n/**\n *\n */\nfunction isRotateByOptions(x) {\n return typeof x.angleRadiansOffset === 'number' && typeof x.duration === 'number';\n}\nclass RotateByWithOptions {\n constructor(entity, options) {\n var _a;\n this.entity = entity;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._offset = 0;\n this._startAngle = 0;\n this._endAngle = 0;\n this._offset = options.angleRadiansOffset;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n if (!this._tx) {\n throw new Error(`Entity ${entity.name} has no TransformComponent, can only RotateBy on Entities with TransformComponents.`);\n }\n this._durationMs = options.duration;\n this._rotationType = (_a = options.rotationType) !== null && _a !== void 0 ? _a : _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.ShortestPath;\n this._currentMs = this._durationMs;\n }\n update(elapsed) {\n if (!this._started) {\n this._startAngle = this._tx.rotation;\n this._endAngle = (0,_Math_util__WEBPACK_IMPORTED_MODULE_4__.canonicalizeAngle)(this._startAngle + this._offset);\n this._started = true;\n }\n this._currentMs -= elapsed;\n const t = (0,_Math_util__WEBPACK_IMPORTED_MODULE_4__.clamp)((0,_Math__WEBPACK_IMPORTED_MODULE_5__.remap)(0, this._durationMs, 0, 1, this._durationMs - this._currentMs), 0, 1);\n const newAngle = (0,_Math__WEBPACK_IMPORTED_MODULE_5__.lerpAngle)(this._startAngle, this._endAngle, this._rotationType, t);\n const currentAngle = this._tx.rotation;\n const rx = (newAngle - currentAngle) / (elapsed / 1000);\n this._motion.angularVelocity = rx;\n if (this.isComplete()) {\n this._tx.rotation = this._endAngle;\n this._motion.angularVelocity = 0;\n }\n }\n isComplete() {\n return this._stopped || this._currentMs < 0;\n }\n stop() {\n this._motion.angularVelocity = 0;\n this._stopped = true;\n this._currentMs = 0;\n }\n reset() {\n this._currentMs = this._durationMs;\n this._started = false;\n this._stopped = false;\n }\n}\nclass RotateBy {\n constructor(entity, angleRadiansOffset, speed, rotationType) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n this._speed = speed;\n this._offset = angleRadiansOffset;\n this._rotationType = rotationType || _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.ShortestPath;\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._start = this._tx.rotation;\n this._currentNonCannonAngle = this._tx.rotation;\n this._end = this._start + this._offset;\n const distance1 = Math.abs(this._end - this._start);\n const distance2 = _Math_util__WEBPACK_IMPORTED_MODULE_4__.TwoPI - distance1;\n if (distance1 > distance2) {\n this._shortDistance = distance2;\n this._longDistance = distance1;\n }\n else {\n this._shortDistance = distance1;\n this._longDistance = distance2;\n }\n this._shortestPathIsPositive = (this._start - this._end + _Math_util__WEBPACK_IMPORTED_MODULE_4__.TwoPI) % _Math_util__WEBPACK_IMPORTED_MODULE_4__.TwoPI >= Math.PI;\n switch (this._rotationType) {\n case _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.ShortestPath:\n this._distance = this._shortDistance;\n if (this._shortestPathIsPositive) {\n this._direction = 1;\n }\n else {\n this._direction = -1;\n }\n break;\n case _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.LongestPath:\n this._distance = this._longDistance;\n if (this._shortestPathIsPositive) {\n this._direction = -1;\n }\n else {\n this._direction = 1;\n }\n break;\n case _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.Clockwise:\n this._direction = 1;\n if (this._shortDistance >= 0) {\n this._distance = this._shortDistance;\n }\n else {\n this._distance = this._longDistance;\n }\n break;\n case _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.CounterClockwise:\n this._direction = -1;\n if (this._shortDistance <= 0) {\n this._distance = this._shortDistance;\n }\n else {\n this._distance = this._longDistance;\n }\n break;\n }\n }\n this._motion.angularVelocity = this._direction * this._speed;\n this._currentNonCannonAngle += this._direction * this._speed * (elapsed / 1000);\n if (this.isComplete()) {\n this._tx.rotation = this._end;\n this._motion.angularVelocity = 0;\n this._stopped = true;\n }\n }\n isComplete() {\n const distanceTraveled = Math.abs(this._currentNonCannonAngle - this._start);\n return this._stopped || distanceTraveled >= Math.abs(this._distance);\n }\n stop() {\n this._motion.angularVelocity = 0;\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n this._start = undefined;\n this._currentNonCannonAngle = undefined;\n this._distance = undefined;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/RotateTo.ts\":\n/*!************************************!*\\\n !*** ./Actions/Action/RotateTo.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RotateTo: () => (/* binding */ RotateTo),\n/* harmony export */ RotateToWithOptions: () => (/* binding */ RotateToWithOptions),\n/* harmony export */ isRotateToOptions: () => (/* binding */ isRotateToOptions)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math */ \"./Math/rotation-type.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math */ \"./Math/lerp.ts\");\n\n\n\n\n\n\n/**\n *\n */\nfunction isRotateToOptions(x) {\n return typeof x.angle === 'number' && typeof x.duration === 'number';\n}\nclass RotateToWithOptions {\n constructor(entity, options) {\n var _a;\n this.entity = entity;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._endAngle = 0;\n this._startAngle = 0;\n this._endAngle = options.angle;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n if (!this._tx) {\n throw new Error(`Entity ${entity.name} has no TransformComponent, can only RotateTo on Entities with TransformComponents.`);\n }\n this._durationMs = options.duration;\n this._rotationType = (_a = options.rotationType) !== null && _a !== void 0 ? _a : _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.ShortestPath;\n this._currentMs = this._durationMs;\n }\n update(elapsed) {\n if (!this._started) {\n this._startAngle = this._tx.rotation;\n this._started = true;\n }\n this._currentMs -= elapsed;\n const t = (0,_Math_util__WEBPACK_IMPORTED_MODULE_4__.clamp)((0,_Math__WEBPACK_IMPORTED_MODULE_5__.remap)(0, this._durationMs, 0, 1, this._durationMs - this._currentMs), 0, 1);\n const newAngle = (0,_Math__WEBPACK_IMPORTED_MODULE_5__.lerpAngle)(this._startAngle, this._endAngle, this._rotationType, t);\n const currentAngle = this._tx.rotation;\n const rx = (newAngle - currentAngle) / (elapsed / 1000);\n this._motion.angularVelocity = rx;\n if (this.isComplete(this.entity)) {\n this._tx.rotation = this._endAngle;\n this._motion.angularVelocity = 0;\n }\n }\n isComplete(entity) {\n return this._stopped || this._currentMs < 0;\n }\n stop() {\n this._motion.angularVelocity = 0;\n this._stopped = true;\n this._currentMs = 0;\n }\n reset() {\n this._currentMs = this._durationMs;\n this._started = false;\n this._stopped = false;\n }\n}\nclass RotateTo {\n constructor(entity, angle, speed, rotationType) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n this._end = angle;\n this._speed = speed;\n this._rotationType = rotationType || _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.ShortestPath;\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._start = this._tx.rotation;\n this._currentNonCannonAngle = this._tx.rotation;\n const distance1 = Math.abs(this._end - this._start);\n const distance2 = _Math_util__WEBPACK_IMPORTED_MODULE_4__.TwoPI - distance1;\n if (distance1 > distance2) {\n this._shortDistance = distance2;\n this._longDistance = distance1;\n }\n else {\n this._shortDistance = distance1;\n this._longDistance = distance2;\n }\n this._shortestPathIsPositive = (this._start - this._end + _Math_util__WEBPACK_IMPORTED_MODULE_4__.TwoPI) % _Math_util__WEBPACK_IMPORTED_MODULE_4__.TwoPI >= Math.PI;\n switch (this._rotationType) {\n case _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.ShortestPath:\n this._distance = this._shortDistance;\n if (this._shortestPathIsPositive) {\n this._direction = 1;\n }\n else {\n this._direction = -1;\n }\n break;\n case _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.LongestPath:\n this._distance = this._longDistance;\n if (this._shortestPathIsPositive) {\n this._direction = -1;\n }\n else {\n this._direction = 1;\n }\n break;\n case _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.Clockwise:\n this._direction = 1;\n if (this._shortestPathIsPositive) {\n this._distance = this._shortDistance;\n }\n else {\n this._distance = this._longDistance;\n }\n break;\n case _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.CounterClockwise:\n this._direction = -1;\n if (!this._shortestPathIsPositive) {\n this._distance = this._shortDistance;\n }\n else {\n this._distance = this._longDistance;\n }\n break;\n }\n }\n this._motion.angularVelocity = this._direction * this._speed;\n this._currentNonCannonAngle += this._direction * this._speed * (elapsed / 1000);\n if (this.isComplete()) {\n this._tx.rotation = this._end;\n this._motion.angularVelocity = 0;\n this._stopped = true;\n }\n }\n isComplete() {\n const distanceTraveled = Math.abs(this._currentNonCannonAngle - this._start);\n return this._stopped || distanceTraveled >= Math.abs(this._distance);\n }\n stop() {\n this._motion.angularVelocity = 0;\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/ScaleBy.ts\":\n/*!***********************************!*\\\n !*** ./Actions/Action/ScaleBy.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ScaleBy: () => (/* binding */ ScaleBy),\n/* harmony export */ ScaleByWithOptions: () => (/* binding */ ScaleByWithOptions),\n/* harmony export */ isScaleByOptions: () => (/* binding */ isScaleByOptions)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Math */ \"./Math/util.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math */ \"./Math/lerp.ts\");\n\n\n\n\n\n/**\n *\n */\nfunction isScaleByOptions(x) {\n return typeof x.scaleOffset === 'object' && typeof x.duration === 'number';\n}\nclass ScaleByWithOptions {\n constructor(entity, options) {\n this.entity = entity;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._endScale = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(1, 1);\n this._scaleOffset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0);\n this._startScale = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(1, 1);\n this._scaleOffset = options.scaleOffset;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__.MotionComponent);\n if (!this._tx) {\n throw new Error(`Entity ${entity.name} has no TransformComponent, can only ScaleBy on Entities with TransformComponents.`);\n }\n this._durationMs = options.duration;\n this._currentMs = this._durationMs;\n }\n update(elapsed) {\n if (!this._started) {\n this._startScale = this._tx.scale;\n this._endScale = this._startScale.add(this._scaleOffset);\n this._started = true;\n }\n this._currentMs -= elapsed;\n const t = (0,_Math__WEBPACK_IMPORTED_MODULE_4__.clamp)((0,_Math__WEBPACK_IMPORTED_MODULE_5__.remap)(0, this._durationMs, 0, 1, this._durationMs - this._currentMs), 0, 1);\n const newScale = (0,_Math__WEBPACK_IMPORTED_MODULE_5__.lerpVector)(this._startScale, this._endScale, t);\n const currentScale = this._tx.scale;\n const sx = newScale.sub(currentScale).scale(1 / (elapsed / 1000));\n this._motion.scaleFactor = sx;\n if (this.isComplete()) {\n this._tx.scale = this._endScale;\n this._motion.angularVelocity = 0;\n }\n }\n isComplete() {\n return this._stopped || this._currentMs < 0;\n }\n stop() {\n this._motion.scaleFactor = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n this._stopped = true;\n this._currentMs = 0;\n }\n reset() {\n this._currentMs = this._durationMs;\n this._started = false;\n this._stopped = false;\n }\n}\nclass ScaleBy {\n constructor(entity, scaleOffsetX, scaleOffsetY, speed) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__.MotionComponent);\n this._offset = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(scaleOffsetX, scaleOffsetY);\n this._speedX = this._speedY = speed;\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._startScale = this._tx.scale.clone();\n this._endScale = this._startScale.add(this._offset);\n this._distanceX = Math.abs(this._endScale.x - this._startScale.x);\n this._distanceY = Math.abs(this._endScale.y - this._startScale.y);\n this._directionX = this._endScale.x < this._startScale.x ? -1 : 1;\n this._directionY = this._endScale.y < this._startScale.y ? -1 : 1;\n }\n this._motion.scaleFactor.x = this._speedX * this._directionX;\n this._motion.scaleFactor.y = this._speedY * this._directionY;\n if (this.isComplete()) {\n this._tx.scale = this._endScale;\n this._motion.scaleFactor.x = 0;\n this._motion.scaleFactor.y = 0;\n }\n }\n isComplete() {\n return (this._stopped ||\n (Math.abs(this._tx.scale.x - this._startScale.x) >= this._distanceX - 0.01 &&\n Math.abs(this._tx.scale.y - this._startScale.y) >= this._distanceY - 0.01));\n }\n stop() {\n this._motion.scaleFactor.x = 0;\n this._motion.scaleFactor.y = 0;\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/ScaleTo.ts\":\n/*!***********************************!*\\\n !*** ./Actions/Action/ScaleTo.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ScaleTo: () => (/* binding */ ScaleTo),\n/* harmony export */ ScaleToWithOptions: () => (/* binding */ ScaleToWithOptions),\n/* harmony export */ isScaleToOptions: () => (/* binding */ isScaleToOptions)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Math */ \"./Math/util.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math */ \"./Math/lerp.ts\");\n\n\n\n\n\n/**\n *\n */\nfunction isScaleToOptions(x) {\n return typeof x.scale === 'object' && typeof x.duration === 'number';\n}\nclass ScaleToWithOptions {\n constructor(entity, options) {\n this.entity = entity;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._endScale = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(1, 1);\n this._startScale = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(1, 1);\n this._endScale = options.scale;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__.MotionComponent);\n if (!this._tx) {\n throw new Error(`Entity ${entity.name} has no TransformComponent, can only ScaleTo on Entities with TransformComponents.`);\n }\n this._durationMs = options.duration;\n this._currentMs = this._durationMs;\n }\n update(elapsed) {\n if (!this._started) {\n this._startScale = this._tx.scale;\n this._started = true;\n }\n this._currentMs -= elapsed;\n const t = (0,_Math__WEBPACK_IMPORTED_MODULE_4__.clamp)((0,_Math__WEBPACK_IMPORTED_MODULE_5__.remap)(0, this._durationMs, 0, 1, this._durationMs - this._currentMs), 0, 1);\n const newScale = (0,_Math__WEBPACK_IMPORTED_MODULE_5__.lerpVector)(this._startScale, this._endScale, t);\n const currentScale = this._tx.scale;\n const sx = newScale.sub(currentScale).scale(1 / (elapsed / 1000));\n this._motion.scaleFactor = sx;\n if (this.isComplete()) {\n this._tx.scale = this._endScale;\n this._motion.angularVelocity = 0;\n }\n }\n isComplete() {\n return this._stopped || this._currentMs < 0;\n }\n stop() {\n this._motion.scaleFactor = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n this._stopped = true;\n this._currentMs = 0;\n }\n reset() {\n this._currentMs = this._durationMs;\n this._started = false;\n this._stopped = false;\n }\n}\nclass ScaleTo {\n constructor(entity, scaleX, scaleY, speedX, speedY) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__.MotionComponent);\n this._endX = scaleX;\n this._endY = scaleY;\n this._speedX = speedX;\n this._speedY = speedY;\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._startX = this._tx.scale.x;\n this._startY = this._tx.scale.y;\n this._distanceX = Math.abs(this._endX - this._startX);\n this._distanceY = Math.abs(this._endY - this._startY);\n }\n if (!(Math.abs(this._tx.scale.x - this._startX) >= this._distanceX)) {\n const directionX = this._endY < this._startY ? -1 : 1;\n this._motion.scaleFactor.x = this._speedX * directionX;\n }\n else {\n this._motion.scaleFactor.x = 0;\n }\n if (!(Math.abs(this._tx.scale.y - this._startY) >= this._distanceY)) {\n const directionY = this._endY < this._startY ? -1 : 1;\n this._motion.scaleFactor.y = this._speedY * directionY;\n }\n else {\n this._motion.scaleFactor.y = 0;\n }\n if (this.isComplete()) {\n this._tx.scale = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(this._endX, this._endY);\n this._motion.scaleFactor.x = 0;\n this._motion.scaleFactor.y = 0;\n }\n }\n isComplete() {\n return (this._stopped ||\n (Math.abs(this._tx.scale.x - this._startX) >= this._distanceX - 0.01 &&\n Math.abs(this._tx.scale.y - this._startY) >= this._distanceY - 0.01));\n }\n stop() {\n this._motion.scaleFactor.x = 0;\n this._motion.scaleFactor.y = 0;\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/ActionsComponent.ts\":\n/*!*************************************!*\\\n !*** ./Actions/ActionsComponent.ts ***!\n \\*************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ActionsComponent: () => (/* binding */ ActionsComponent)\n/* harmony export */ });\n/* harmony import */ var _ActionContext__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./ActionContext */ \"./Actions/ActionContext.ts\");\n/* harmony import */ var _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Component */ \"./EntityComponentSystem/Component.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n\n\n\n\nclass ActionsComponent extends _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor() {\n super(...arguments);\n this.dependencies = [_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent, _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent];\n this._ctx = null;\n }\n onAdd(entity) {\n this._ctx = new _ActionContext__WEBPACK_IMPORTED_MODULE_3__.ActionContext(entity);\n }\n onRemove() {\n this._ctx = null;\n }\n _getCtx() {\n if (!this._ctx) {\n throw new Error('Actions component not attached to an entity, no context available');\n }\n return this._ctx;\n }\n /**\n * Returns the internal action queue\n * @returns action queue\n */\n getQueue() {\n if (!this._ctx) {\n throw new Error('Actions component not attached to an entity, no queue available');\n }\n return this._ctx.getQueue();\n }\n /**\n * Runs a specific action in the action queue\n * @param action\n */\n runAction(action) {\n if (!this._ctx) {\n throw new Error('Actions component not attached to an entity, cannot run action');\n }\n return this._ctx.runAction(action);\n }\n /**\n * Updates the internal action context, performing action and moving through the internal queue\n * @param elapsed\n */\n update(elapsed) {\n var _a;\n return (_a = this._ctx) === null || _a === void 0 ? void 0 : _a.update(elapsed);\n }\n /**\n * Clears all queued actions from the Actor\n */\n clearActions() {\n var _a;\n (_a = this._ctx) === null || _a === void 0 ? void 0 : _a.clearActions();\n }\n /**\n * Animates an actor with a specified bezier curve by an offset to the current position, the start point is assumed\n * to be the actors current position\n * @param options\n */\n curveBy(options) {\n return this._getCtx().curveBy.apply(this._ctx, [options]);\n }\n /**\n * Animates an actor with a specified bezier curve to an absolute world space coordinate, the start point is assumed\n * to be the actors current position\n * @param options\n */\n curveTo(options) {\n return this._getCtx().curveTo.apply(this._ctx, [options]);\n }\n easeTo(...args) {\n return this._getCtx().easeTo.apply(this._ctx, args);\n }\n easeBy(...args) {\n return this._getCtx().easeBy.apply(this._ctx, args);\n }\n moveTo(xOrPosOrOptions, yOrSpeed, speedOrUndefined) {\n return this._getCtx().moveTo.apply(this._ctx, [xOrPosOrOptions, yOrSpeed, speedOrUndefined]);\n }\n moveBy(xOffsetOrVectorOptions, yOffsetOrSpeed, speedOrUndefined) {\n return this._getCtx().moveBy.apply(this._ctx, [xOffsetOrVectorOptions, yOffsetOrSpeed, speedOrUndefined]);\n }\n rotateTo(angle, speed, rotationType) {\n return this._getCtx().rotateTo.apply(this._ctx, [angle, speed, rotationType]);\n }\n rotateBy(angleRadiansOffsetOrOptions, speed, rotationType) {\n return this._getCtx().rotateBy.apply(this._ctx, [angleRadiansOffsetOrOptions, speed, rotationType]);\n }\n scaleTo(sizeXOrVectorOrOptions, sizeYOrSpeed, speedXOrUndefined, speedYOrUndefined) {\n return this._getCtx().scaleTo.apply(this._ctx, [sizeXOrVectorOrOptions, sizeYOrSpeed, speedXOrUndefined, speedYOrUndefined]);\n }\n scaleBy(sizeOffsetXOrVectorOrOptions, sizeOffsetYOrSpeed, speed) {\n return this._getCtx().scaleBy.apply(this._ctx, [sizeOffsetXOrVectorOrOptions, sizeOffsetYOrSpeed, speed]);\n }\n /**\n * This method will cause an actor to blink (become visible and not\n * visible). Optionally, you may specify the number of blinks. Specify the amount of time\n * the actor should be visible per blink, and the amount of time not visible.\n * This method is part of the actor 'Action' fluent API allowing action chaining.\n * @param timeVisible The amount of time to stay visible per blink in milliseconds\n * @param timeNotVisible The amount of time to stay not visible per blink in milliseconds\n * @param numBlinks The number of times to blink\n */\n blink(timeVisible, timeNotVisible, numBlinks) {\n return this._getCtx().blink(timeVisible, timeNotVisible, numBlinks);\n }\n /**\n * This method will cause an actor's opacity to change from its current value\n * to the provided value by a specified time (in milliseconds). This method is\n * part of the actor 'Action' fluent API allowing action chaining.\n * @param opacity The ending opacity\n * @param duration The time it should take to fade the actor (in milliseconds)\n */\n fade(opacity, duration) {\n return this._getCtx().fade(opacity, duration);\n }\n /**\n * This will cause an actor to flash a specific color for a period of time\n * @param color\n * @param duration The duration in milliseconds\n */\n flash(color, duration = 1000) {\n return this._getCtx().flash(color, duration);\n }\n /**\n * This method will delay the next action from executing for a certain\n * amount of time (in milliseconds). This method is part of the actor\n * 'Action' fluent API allowing action chaining.\n * @param duration The amount of time to delay the next action in the queue from executing in milliseconds\n */\n delay(duration) {\n return this._getCtx().delay(duration);\n }\n /**\n * This method will add an action to the queue that will remove the actor from the\n * scene once it has completed its previous Any actions on the\n * action queue after this action will not be executed.\n */\n die() {\n return this._getCtx().die();\n }\n /**\n * This method allows you to call an arbitrary method as the next action in the\n * action queue. This is useful if you want to execute code in after a specific\n * action, i.e An actor arrives at a destination after traversing a path\n */\n callMethod(method) {\n return this._getCtx().callMethod(method);\n }\n /**\n * This method will cause the actor to repeat all of the actions built in\n * the `repeatBuilder` callback. If the number of repeats\n * is not specified it will repeat forever. This method is part of\n * the actor 'Action' fluent API allowing action chaining\n *\n * ```typescript\n * // Move up in a zig-zag by repeated moveBy's\n * actor.actions.repeat(repeatCtx => {\n * repeatCtx.moveBy(10, 0, 10);\n * repeatCtx.moveBy(0, 10, 10);\n * }, 5);\n * ```\n * @param repeatBuilder The builder to specify the repeatable list of actions\n * @param times The number of times to repeat all the previous actions in the action queue. If nothing is specified the actions\n * will repeat forever\n */\n repeat(repeatBuilder, times) {\n return this._getCtx().repeat(repeatBuilder, times);\n }\n /**\n * This method will cause the actor to repeat all of the actions built in\n * the `repeatBuilder` callback. If the number of repeats\n * is not specified it will repeat forever. This method is part of\n * the actor 'Action' fluent API allowing action chaining\n *\n * ```typescript\n * // Move up in a zig-zag by repeated moveBy's\n * actor.actions.repeat(repeatCtx => {\n * repeatCtx.moveBy(10, 0, 10);\n * repeatCtx.moveBy(0, 10, 10);\n * }, 5);\n * ```\n * @param repeatBuilder The builder to specify the repeatable list of actions\n */\n repeatForever(repeatBuilder) {\n return this._getCtx().repeatForever(repeatBuilder);\n }\n /**\n * This method will cause the entity to follow another at a specified distance\n * @param entity The entity to follow\n * @param followDistance The distance to maintain when following, if not specified the actor will follow at the current distance.\n */\n follow(entity, followDistance) {\n return this._getCtx().follow(entity, followDistance);\n }\n /**\n * This method will cause the entity to move towards another until they\n * collide \"meet\" at a specified speed.\n * @param entity The entity to meet\n * @param speed The speed in pixels per second to move, if not specified it will match the speed of the other actor\n */\n meet(entity, speed) {\n return this._getCtx().meet(entity, speed);\n }\n /**\n * Returns a promise that resolves when the current action queue up to now\n * is finished.\n */\n toPromise() {\n return this._getCtx().toPromise();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/ActionsSystem.ts\":\n/*!**********************************!*\\\n !*** ./Actions/ActionsSystem.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ActionsSystem: () => (/* binding */ ActionsSystem)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Priority.ts\");\n/* harmony import */ var _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _ActionsComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ActionsComponent */ \"./Actions/ActionsComponent.ts\");\n\n\n\nclass ActionsSystem extends _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.System {\n constructor(world) {\n super();\n this.world = world;\n this.systemType = _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.SystemType.Update;\n this._actions = [];\n this.query = this.world.query([_ActionsComponent__WEBPACK_IMPORTED_MODULE_1__.ActionsComponent]);\n this.query.entityAdded$.subscribe((e) => this._actions.push(e.get(_ActionsComponent__WEBPACK_IMPORTED_MODULE_1__.ActionsComponent)));\n this.query.entityRemoved$.subscribe((e) => {\n const action = e.get(_ActionsComponent__WEBPACK_IMPORTED_MODULE_1__.ActionsComponent);\n const index = this._actions.indexOf(action);\n if (index > -1) {\n this._actions.splice(index, 1);\n }\n });\n }\n update(elapsed) {\n for (let i = 0; i < this._actions.length; i++) {\n const action = this._actions[i];\n action.update(elapsed);\n }\n }\n}\nActionsSystem.priority = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_2__.SystemPriority.Higher;\n\n\n/***/ }),\n\n/***/ \"./Actions/index.ts\":\n/*!**************************!*\\\n !*** ./Actions/index.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ActionContext: () => (/* reexport safe */ _ActionContext__WEBPACK_IMPORTED_MODULE_0__.ActionContext),\n/* harmony export */ ActionQueue: () => (/* reexport safe */ _ActionQueue__WEBPACK_IMPORTED_MODULE_1__.ActionQueue),\n/* harmony export */ ActionSequence: () => (/* reexport safe */ _Action_ActionSequence__WEBPACK_IMPORTED_MODULE_3__.ActionSequence),\n/* harmony export */ ActionsComponent: () => (/* reexport safe */ _ActionsComponent__WEBPACK_IMPORTED_MODULE_24__.ActionsComponent),\n/* harmony export */ ActionsSystem: () => (/* reexport safe */ _ActionsSystem__WEBPACK_IMPORTED_MODULE_25__.ActionsSystem),\n/* harmony export */ Blink: () => (/* reexport safe */ _Action_Blink__WEBPACK_IMPORTED_MODULE_7__.Blink),\n/* harmony export */ CurveBy: () => (/* reexport safe */ _Action_CurveBy__WEBPACK_IMPORTED_MODULE_23__.CurveBy),\n/* harmony export */ CurveTo: () => (/* reexport safe */ _Action_CurveTo__WEBPACK_IMPORTED_MODULE_22__.CurveTo),\n/* harmony export */ Delay: () => (/* reexport safe */ _Action_Delay__WEBPACK_IMPORTED_MODULE_20__.Delay),\n/* harmony export */ Die: () => (/* reexport safe */ _Action_Die__WEBPACK_IMPORTED_MODULE_8__.Die),\n/* harmony export */ EaseBy: () => (/* reexport safe */ _Action_EaseBy__WEBPACK_IMPORTED_MODULE_10__.EaseBy),\n/* harmony export */ EaseTo: () => (/* reexport safe */ _Action_EaseTo__WEBPACK_IMPORTED_MODULE_9__.EaseTo),\n/* harmony export */ Fade: () => (/* reexport safe */ _Action_Fade__WEBPACK_IMPORTED_MODULE_11__.Fade),\n/* harmony export */ Flash: () => (/* reexport safe */ _Action_Flash__WEBPACK_IMPORTED_MODULE_21__.Flash),\n/* harmony export */ Follow: () => (/* reexport safe */ _Action_Follow__WEBPACK_IMPORTED_MODULE_12__.Follow),\n/* harmony export */ Meet: () => (/* reexport safe */ _Action_Meet__WEBPACK_IMPORTED_MODULE_13__.Meet),\n/* harmony export */ MoveBy: () => (/* reexport safe */ _Action_MoveBy__WEBPACK_IMPORTED_MODULE_14__.MoveBy),\n/* harmony export */ MoveByWithOptions: () => (/* reexport safe */ _Action_MoveBy__WEBPACK_IMPORTED_MODULE_14__.MoveByWithOptions),\n/* harmony export */ MoveTo: () => (/* reexport safe */ _Action_MoveTo__WEBPACK_IMPORTED_MODULE_15__.MoveTo),\n/* harmony export */ MoveToWithOptions: () => (/* reexport safe */ _Action_MoveTo__WEBPACK_IMPORTED_MODULE_15__.MoveToWithOptions),\n/* harmony export */ ParallelActions: () => (/* reexport safe */ _Action_ParallelActions__WEBPACK_IMPORTED_MODULE_4__.ParallelActions),\n/* harmony export */ Repeat: () => (/* reexport safe */ _Action_Repeat__WEBPACK_IMPORTED_MODULE_5__.Repeat),\n/* harmony export */ RepeatForever: () => (/* reexport safe */ _Action_RepeatForever__WEBPACK_IMPORTED_MODULE_6__.RepeatForever),\n/* harmony export */ RotateBy: () => (/* reexport safe */ _Action_RotateBy__WEBPACK_IMPORTED_MODULE_16__.RotateBy),\n/* harmony export */ RotateByWithOptions: () => (/* reexport safe */ _Action_RotateBy__WEBPACK_IMPORTED_MODULE_16__.RotateByWithOptions),\n/* harmony export */ RotateTo: () => (/* reexport safe */ _Action_RotateTo__WEBPACK_IMPORTED_MODULE_17__.RotateTo),\n/* harmony export */ RotateToWithOptions: () => (/* reexport safe */ _Action_RotateTo__WEBPACK_IMPORTED_MODULE_17__.RotateToWithOptions),\n/* harmony export */ ScaleBy: () => (/* reexport safe */ _Action_ScaleBy__WEBPACK_IMPORTED_MODULE_18__.ScaleBy),\n/* harmony export */ ScaleByWithOptions: () => (/* reexport safe */ _Action_ScaleBy__WEBPACK_IMPORTED_MODULE_18__.ScaleByWithOptions),\n/* harmony export */ ScaleTo: () => (/* reexport safe */ _Action_ScaleTo__WEBPACK_IMPORTED_MODULE_19__.ScaleTo),\n/* harmony export */ ScaleToWithOptions: () => (/* reexport safe */ _Action_ScaleTo__WEBPACK_IMPORTED_MODULE_19__.ScaleToWithOptions),\n/* harmony export */ isMoveByOptions: () => (/* reexport safe */ _Action_MoveBy__WEBPACK_IMPORTED_MODULE_14__.isMoveByOptions),\n/* harmony export */ isMoveToOptions: () => (/* reexport safe */ _Action_MoveTo__WEBPACK_IMPORTED_MODULE_15__.isMoveToOptions),\n/* harmony export */ isRotateByOptions: () => (/* reexport safe */ _Action_RotateBy__WEBPACK_IMPORTED_MODULE_16__.isRotateByOptions),\n/* harmony export */ isRotateToOptions: () => (/* reexport safe */ _Action_RotateTo__WEBPACK_IMPORTED_MODULE_17__.isRotateToOptions),\n/* harmony export */ isScaleByOptions: () => (/* reexport safe */ _Action_ScaleBy__WEBPACK_IMPORTED_MODULE_18__.isScaleByOptions),\n/* harmony export */ isScaleToOptions: () => (/* reexport safe */ _Action_ScaleTo__WEBPACK_IMPORTED_MODULE_19__.isScaleToOptions),\n/* harmony export */ nextActionId: () => (/* reexport safe */ _Action__WEBPACK_IMPORTED_MODULE_2__.nextActionId)\n/* harmony export */ });\n/* harmony import */ var _ActionContext__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ActionContext */ \"./Actions/ActionContext.ts\");\n/* harmony import */ var _ActionQueue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ActionQueue */ \"./Actions/ActionQueue.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _Action_ActionSequence__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Action/ActionSequence */ \"./Actions/Action/ActionSequence.ts\");\n/* harmony import */ var _Action_ParallelActions__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Action/ParallelActions */ \"./Actions/Action/ParallelActions.ts\");\n/* harmony import */ var _Action_Repeat__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Action/Repeat */ \"./Actions/Action/Repeat.ts\");\n/* harmony import */ var _Action_RepeatForever__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Action/RepeatForever */ \"./Actions/Action/RepeatForever.ts\");\n/* harmony import */ var _Action_Blink__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Action/Blink */ \"./Actions/Action/Blink.ts\");\n/* harmony import */ var _Action_Die__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Action/Die */ \"./Actions/Action/Die.ts\");\n/* harmony import */ var _Action_EaseTo__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Action/EaseTo */ \"./Actions/Action/EaseTo.ts\");\n/* harmony import */ var _Action_EaseBy__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Action/EaseBy */ \"./Actions/Action/EaseBy.ts\");\n/* harmony import */ var _Action_Fade__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Action/Fade */ \"./Actions/Action/Fade.ts\");\n/* harmony import */ var _Action_Follow__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Action/Follow */ \"./Actions/Action/Follow.ts\");\n/* harmony import */ var _Action_Meet__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Action/Meet */ \"./Actions/Action/Meet.ts\");\n/* harmony import */ var _Action_MoveBy__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Action/MoveBy */ \"./Actions/Action/MoveBy.ts\");\n/* harmony import */ var _Action_MoveTo__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Action/MoveTo */ \"./Actions/Action/MoveTo.ts\");\n/* harmony import */ var _Action_RotateBy__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Action/RotateBy */ \"./Actions/Action/RotateBy.ts\");\n/* harmony import */ var _Action_RotateTo__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./Action/RotateTo */ \"./Actions/Action/RotateTo.ts\");\n/* harmony import */ var _Action_ScaleBy__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Action/ScaleBy */ \"./Actions/Action/ScaleBy.ts\");\n/* harmony import */ var _Action_ScaleTo__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./Action/ScaleTo */ \"./Actions/Action/ScaleTo.ts\");\n/* harmony import */ var _Action_Delay__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./Action/Delay */ \"./Actions/Action/Delay.ts\");\n/* harmony import */ var _Action_Flash__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./Action/Flash */ \"./Actions/Action/Flash.ts\");\n/* harmony import */ var _Action_CurveTo__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./Action/CurveTo */ \"./Actions/Action/CurveTo.ts\");\n/* harmony import */ var _Action_CurveBy__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./Action/CurveBy */ \"./Actions/Action/CurveBy.ts\");\n/* harmony import */ var _ActionsComponent__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./ActionsComponent */ \"./Actions/ActionsComponent.ts\");\n/* harmony import */ var _ActionsSystem__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./ActionsSystem */ \"./Actions/ActionsSystem.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Actor.ts\":\n/*!******************!*\\\n !*** ./Actor.ts ***!\n \\******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Actor: () => (/* binding */ Actor),\n/* harmony export */ ActorEvents: () => (/* binding */ ActorEvents),\n/* harmony export */ isActor: () => (/* binding */ isActor)\n/* harmony export */ });\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./Events */ \"./Events.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Collision/BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Collision/CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./EntityComponentSystem/Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Graphics/GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Graphics_Rectangle__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Graphics/Rectangle */ \"./Graphics/Rectangle.ts\");\n/* harmony import */ var _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Collision/ColliderComponent */ \"./Collision/ColliderComponent.ts\");\n/* harmony import */ var _Collision_Colliders_Shape__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Collision/Colliders/Shape */ \"./Collision/Colliders/Shape.ts\");\n/* harmony import */ var _Util_Watch__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Util/Watch */ \"./Util/Watch.ts\");\n/* harmony import */ var _Graphics_Circle__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Graphics/Circle */ \"./Graphics/Circle.ts\");\n/* harmony import */ var _Input_PointerComponent__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Input/PointerComponent */ \"./Input/PointerComponent.ts\");\n/* harmony import */ var _Actions_ActionsComponent__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Actions/ActionsComponent */ \"./Actions/ActionsComponent.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Math/coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Type guard for checking if something is an Actor\n * @param x\n */\nfunction isActor(x) {\n return x instanceof Actor;\n}\nconst ActorEvents = {\n CollisionStart: 'collisionstart',\n CollisionEnd: 'collisionend',\n PreCollision: 'precollision',\n PostCollision: 'postcollision',\n Kill: 'kill',\n PreKill: 'prekill',\n PostKill: 'postkill',\n PreDraw: 'predraw',\n PostDraw: 'postdraw',\n PreTransformDraw: 'pretransformdraw',\n PostTransformDraw: 'posttransformdraw',\n PreDebugDraw: 'predebugdraw',\n PostDebugDraw: 'postdebugdraw',\n PointerUp: 'pointerup',\n PointerDown: 'pointerdown',\n PointerEnter: 'pointerenter',\n PointerLeave: 'pointerleave',\n PointerMove: 'pointermove',\n PointerCancel: 'pointercancel',\n Wheel: 'pointerwheel',\n PointerDrag: 'pointerdragstart',\n PointerDragEnd: 'pointerdragend',\n PointerDragEnter: 'pointerdragenter',\n PointerDragLeave: 'pointerdragleave',\n PointerDragMove: 'pointerdragmove',\n EnterViewPort: 'enterviewport',\n ExitViewPort: 'exitviewport',\n ActionStart: 'actionstart',\n ActionComplete: 'actioncomplete'\n};\n/**\n * The most important primitive in Excalibur is an `Actor`. Anything that\n * can move on the screen, collide with another `Actor`, respond to events,\n * or interact with the current scene, must be an actor. An `Actor` **must**\n * be part of a {@apilink Scene} for it to be drawn to the screen.\n */\nclass Actor extends _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__.Entity {\n /**\n * Gets the position vector of the actor in pixels\n */\n get pos() {\n return this.transform.pos;\n }\n /**\n * Sets the position vector of the actor in pixels\n */\n set pos(thePos) {\n this.transform.pos = thePos.clone();\n }\n /**\n * Gets the position vector of the actor from the last frame\n */\n get oldPos() {\n return this.body.oldPos;\n }\n /**\n * Gets the global position vector of the actor from the last frame\n */\n get oldGlobalPos() {\n return this.body.oldGlobalPos;\n }\n /**\n * Sets the position vector of the actor in the last frame\n */\n set oldPos(thePos) {\n this.body.oldPos.setTo(thePos.x, thePos.y);\n }\n /**\n * Gets the velocity vector of the actor in pixels/sec\n */\n get vel() {\n return this.motion.vel;\n }\n /**\n * Sets the velocity vector of the actor in pixels/sec\n */\n set vel(theVel) {\n this.motion.vel = theVel.clone();\n }\n /**\n * Gets the velocity vector of the actor from the last frame\n */\n get oldVel() {\n return this.body.oldVel;\n }\n /**\n * Sets the velocity vector of the actor from the last frame\n */\n set oldVel(theVel) {\n this.body.oldVel.setTo(theVel.x, theVel.y);\n }\n /**\n * Gets the acceleration vector of the actor in pixels/second/second. An acceleration pointing down such as (0, 100) may be\n * useful to simulate a gravitational effect.\n */\n get acc() {\n return this.motion.acc;\n }\n /**\n * Sets the acceleration vector of teh actor in pixels/second/second\n */\n set acc(theAcc) {\n this.motion.acc = theAcc.clone();\n }\n /**\n * Sets the acceleration of the actor from the last frame. This does not include the global acc {@apilink Physics.acc}.\n */\n set oldAcc(theAcc) {\n this.body.oldAcc.setTo(theAcc.x, theAcc.y);\n }\n /**\n * Gets the acceleration of the actor from the last frame. This does not include the global acc {@apilink Physics.acc}.\n */\n get oldAcc() {\n return this.body.oldAcc;\n }\n /**\n * Gets the rotation of the actor in radians. 1 radian = 180/PI Degrees.\n */\n get rotation() {\n return this.transform.rotation;\n }\n /**\n * Sets the rotation of the actor in radians. 1 radian = 180/PI Degrees.\n */\n set rotation(theAngle) {\n this.transform.rotation = theAngle;\n }\n /**\n * Gets the rotational velocity of the actor in radians/second\n */\n get angularVelocity() {\n return this.motion.angularVelocity;\n }\n /**\n * Sets the rotational velocity of the actor in radians/sec\n */\n set angularVelocity(angularVelocity) {\n this.motion.angularVelocity = angularVelocity;\n }\n get scale() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).scale;\n }\n set scale(scale) {\n this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).scale = scale;\n }\n /**\n * The anchor to apply all actor related transformations like rotation,\n * translation, and scaling. By default the anchor is in the center of\n * the actor. By default it is set to the center of the actor (.5, .5)\n *\n * An anchor of (.5, .5) will ensure that drawings are centered.\n *\n * Use `anchor.setTo` to set the anchor to a different point using\n * values between 0 and 1. For example, anchoring to the top-left would be\n * `Actor.anchor.setTo(0, 0)` and top-right would be `Actor.anchor.setTo(0, 1)`.\n */\n get anchor() {\n return this._anchor;\n }\n set anchor(vec) {\n this._anchor = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_2__.watch)(vec, (v) => this._handleAnchorChange(v));\n this._handleAnchorChange(vec);\n }\n _handleAnchorChange(v) {\n if (this.graphics) {\n this.graphics.anchor = v;\n }\n }\n /**\n * The offset in pixels to apply to all actor graphics\n *\n * Default offset of (0, 0)\n */\n get offset() {\n return this._offset;\n }\n set offset(vec) {\n this._offset = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_2__.watch)(vec, (v) => this._handleOffsetChange(v));\n this._handleOffsetChange(vec);\n }\n _handleOffsetChange(v) {\n if (this.graphics) {\n this.graphics.offset = v;\n }\n }\n /**\n * Indicates whether the actor is physically in the viewport\n */\n get isOffScreen() {\n return this.hasTag('ex.offscreen');\n }\n get draggable() {\n return this._draggable;\n }\n set draggable(isDraggable) {\n if (isDraggable) {\n if (isDraggable && !this._draggable) {\n this.events.on('pointerdragstart', this._pointerDragStartHandler);\n this.events.on('pointerdragend', this._pointerDragEndHandler);\n this.events.on('pointerdragmove', this._pointerDragMoveHandler);\n this.events.on('pointerdragleave', this._pointerDragLeaveHandler);\n }\n else if (!isDraggable && this._draggable) {\n this.events.off('pointerdragstart', this._pointerDragStartHandler);\n this.events.off('pointerdragend', this._pointerDragEndHandler);\n this.events.off('pointerdragmove', this._pointerDragMoveHandler);\n this.events.off('pointerdragleave', this._pointerDragLeaveHandler);\n }\n this._draggable = isDraggable;\n }\n }\n /**\n * Sets the color of the actor's current graphic\n */\n get color() {\n return this.graphics.color;\n }\n set color(v) {\n this.graphics.color = v;\n }\n // #endregion\n /**\n *\n * @param config\n */\n constructor(config) {\n super();\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_3__.EventEmitter();\n this._anchor = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_2__.watch)(_Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Half, (v) => this._handleAnchorChange(v));\n this._offset = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_2__.watch)(_Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero, (v) => this._handleOffsetChange(v));\n /**\n * Convenience reference to the global logger\n */\n this.logger = _Util_Log__WEBPACK_IMPORTED_MODULE_5__.Logger.getInstance();\n /**\n * Draggable helper\n */\n this._draggable = false;\n this._dragging = false;\n this._pointerDragStartHandler = () => {\n this._dragging = true;\n };\n this._pointerDragEndHandler = () => {\n this._dragging = false;\n };\n this._pointerDragMoveHandler = (pe) => {\n if (this._dragging) {\n this.pos = pe.worldPos;\n }\n };\n this._pointerDragLeaveHandler = (pe) => {\n if (this._dragging) {\n this.pos = pe.worldPos;\n }\n };\n const { name, x, y, pos, coordPlane, scale, width, height, radius, collider, vel, acc, rotation, angularVelocity, z, color, visible, opacity, anchor, offset, collisionType, collisionGroup, silenceWarnings } = {\n ...config\n };\n this.name = name !== null && name !== void 0 ? name : this.name;\n this.anchor = anchor !== null && anchor !== void 0 ? anchor : Actor.defaults.anchor.clone();\n this.offset = offset !== null && offset !== void 0 ? offset : _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero;\n this.transform = new _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent();\n this.addComponent(this.transform);\n this.pos = pos !== null && pos !== void 0 ? pos : (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(x !== null && x !== void 0 ? x : 0, y !== null && y !== void 0 ? y : 0);\n this.rotation = rotation !== null && rotation !== void 0 ? rotation : 0;\n this.scale = scale !== null && scale !== void 0 ? scale : (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(1, 1);\n this.z = z !== null && z !== void 0 ? z : 0;\n this.transform.coordPlane = coordPlane !== null && coordPlane !== void 0 ? coordPlane : _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__.CoordPlane.World;\n this._silenceWarnings = silenceWarnings !== null && silenceWarnings !== void 0 ? silenceWarnings : false;\n this.pointer = new _Input_PointerComponent__WEBPACK_IMPORTED_MODULE_7__.PointerComponent();\n this.addComponent(this.pointer);\n this.graphics = new _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_8__.GraphicsComponent({\n anchor: this.anchor,\n offset: this.offset,\n opacity: opacity\n });\n this.addComponent(this.graphics);\n this.motion = new _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_9__.MotionComponent();\n this.addComponent(this.motion);\n this.vel = vel !== null && vel !== void 0 ? vel : _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero;\n this.acc = acc !== null && acc !== void 0 ? acc : _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero;\n this.angularVelocity = angularVelocity !== null && angularVelocity !== void 0 ? angularVelocity : 0;\n this.actions = new _Actions_ActionsComponent__WEBPACK_IMPORTED_MODULE_10__.ActionsComponent();\n this.addComponent(this.actions);\n this.body = new _Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_11__.BodyComponent();\n this.addComponent(this.body);\n this.body.collisionType = collisionType !== null && collisionType !== void 0 ? collisionType : _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_12__.CollisionType.Passive;\n if (collisionGroup) {\n this.body.group = collisionGroup;\n }\n if (color) {\n this.color = color;\n }\n if (collider) {\n this.collider = new _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_13__.ColliderComponent(collider);\n this.addComponent(this.collider);\n }\n else if (radius) {\n this.collider = new _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_13__.ColliderComponent(_Collision_Colliders_Shape__WEBPACK_IMPORTED_MODULE_14__.Shape.Circle(radius));\n this.addComponent(this.collider);\n if (color) {\n this.graphics.add(new _Graphics_Circle__WEBPACK_IMPORTED_MODULE_15__.Circle({\n color: color,\n radius\n }));\n }\n }\n else {\n if (width > 0 && height > 0) {\n this.collider = new _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_13__.ColliderComponent(_Collision_Colliders_Shape__WEBPACK_IMPORTED_MODULE_14__.Shape.Box(width, height, this.anchor));\n this.addComponent(this.collider);\n if (color && width && height) {\n this.graphics.add(new _Graphics_Rectangle__WEBPACK_IMPORTED_MODULE_16__.Rectangle({\n color: color,\n width,\n height\n }));\n }\n }\n else {\n this.collider = new _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_13__.ColliderComponent();\n this.addComponent(this.collider); // no collider\n }\n }\n this.graphics.isVisible = visible !== null && visible !== void 0 ? visible : true;\n }\n clone() {\n const clone = new Actor({\n silenceWarnings: this._silenceWarnings,\n color: this.color.clone(),\n anchor: this.anchor.clone(),\n offset: this.offset.clone()\n });\n clone.clearComponents();\n clone.processComponentRemoval();\n // Clone builtins, order is important, same as ctor\n clone.addComponent((clone.transform = this.transform.clone()), true);\n clone.addComponent((clone.pointer = this.pointer.clone()), true);\n clone.addComponent((clone.graphics = this.graphics.clone()), true);\n clone.addComponent((clone.motion = this.motion.clone()), true);\n clone.addComponent((clone.actions = this.actions.clone()), true);\n clone.addComponent((clone.body = this.body.clone()), true);\n clone.addComponent((clone.collider = this.collider.clone()), true);\n const builtInComponents = [\n this.transform,\n this.pointer,\n this.graphics,\n this.motion,\n this.actions,\n this.body,\n this.collider\n ];\n // Clone non-builtin the current actors components\n const components = this.getComponents();\n for (const c of components) {\n if (!builtInComponents.includes(c)) {\n clone.addComponent(c.clone(), true);\n }\n }\n return clone;\n }\n /**\n * `onInitialize` is called before the first update of the actor. This method is meant to be\n * overridden. This is where initialization of child actors should take place.\n *\n * Synonymous with the event handler `.on('initialize', (evt) => {...})`\n */\n onInitialize(engine) {\n // Override me\n }\n /**\n * Initializes this actor and all it's child actors, meant to be called by the Scene before first update not by users of Excalibur.\n *\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n * @internal\n */\n _initialize(engine) {\n super._initialize(engine);\n for (const child of this.children) {\n child._initialize(engine);\n }\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n // #endregion\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _prekill handler for {@apilink onPreKill} lifecycle event\n * @internal\n */\n _prekill(scene) {\n this.events.emit('prekill', new _Events__WEBPACK_IMPORTED_MODULE_17__.PreKillEvent(this));\n this.onPreKill(scene);\n }\n /**\n * Safe to override onPreKill lifecycle event handler. Synonymous with `.on('prekill', (evt) =>{...})`\n *\n * `onPreKill` is called directly before an actor is killed and removed from its current {@apilink Scene}.\n */\n onPreKill(scene) {\n // Override me\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _prekill handler for {@apilink onPostKill} lifecycle event\n * @internal\n */\n _postkill(scene) {\n this.events.emit('postkill', new _Events__WEBPACK_IMPORTED_MODULE_17__.PostKillEvent(this));\n this.onPostKill(scene);\n }\n /**\n * Safe to override onPostKill lifecycle event handler. Synonymous with `.on('postkill', (evt) => {...})`\n *\n * `onPostKill` is called directly after an actor is killed and remove from its current {@apilink Scene}.\n */\n onPostKill(scene) {\n // Override me\n }\n /**\n * If the current actor is a member of the scene, this will remove\n * it from the scene graph. It will no longer be drawn or updated.\n */\n kill() {\n if (this.scene) {\n this._prekill(this.scene);\n this.events.emit('kill', new _Events__WEBPACK_IMPORTED_MODULE_17__.KillEvent(this));\n super.kill();\n this._postkill(this.scene);\n }\n else {\n this.logger.warn(`Cannot kill actor named \"${this.name}\", it was never added to the Scene`);\n }\n }\n /**\n * If the current actor is killed, it will now not be killed.\n */\n unkill() {\n this.isActive = true;\n }\n /**\n * Indicates wether the actor has been killed.\n */\n isKilled() {\n return !this.isActive;\n }\n /**\n * Gets the z-index of an actor. The z-index determines the relative order an actor is drawn in.\n * Actors with a higher z-index are drawn on top of actors with a lower z-index\n */\n get z() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).z;\n }\n /**\n * Sets the z-index of an actor and updates it in the drawing list for the scene.\n * The z-index determines the relative order an actor is drawn in.\n * Actors with a higher z-index are drawn on top of actors with a lower z-index\n * @param newZ new z-index to assign\n */\n set z(newZ) {\n this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).z = newZ;\n }\n /**\n * Get the center point of an actor (global position)\n */\n get center() {\n const globalPos = this.getGlobalPos();\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector(globalPos.x + this.width / 2 - this.anchor.x * this.width, globalPos.y + this.height / 2 - this.anchor.y * this.height);\n }\n /**\n * Get the local center point of an actor\n */\n get localCenter() {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector(this.pos.x + this.width / 2 - this.anchor.x * this.width, this.pos.y + this.height / 2 - this.anchor.y * this.height);\n }\n get width() {\n return this.collider.localBounds.width * this.getGlobalScale().x;\n }\n get height() {\n return this.collider.localBounds.height * this.getGlobalScale().y;\n }\n /**\n * Gets this actor's rotation taking into account any parent relationships\n * @returns Rotation angle in radians\n * @deprecated Use {@apilink globalRotation} instead\n */\n getGlobalRotation() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).globalRotation;\n }\n /**\n * The actor's rotation (in radians) taking into account any parent relationships\n */\n get globalRotation() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).globalRotation;\n }\n /**\n * Gets an actor's world position taking into account parent relationships, scaling, rotation, and translation\n * @returns Position in world coordinates\n * @deprecated Use {@apilink globalPos} instead\n */\n getGlobalPos() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).globalPos;\n }\n /**\n * The actor's world position taking into account parent relationships, scaling, rotation, and translation\n */\n get globalPos() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).globalPos;\n }\n /**\n * Gets the global scale of the Actor\n * @deprecated Use {@apilink globalScale} instead\n */\n getGlobalScale() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).globalScale;\n }\n /**\n * The global scale of the Actor\n */\n get globalScale() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).globalScale;\n }\n /**\n * The global z-index of the actor\n */\n get globalZ() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).globalZ;\n }\n // #region Collision\n /**\n * Tests whether the x/y specified are contained in the actor\n * @param x X coordinate to test (in world coordinates)\n * @param y Y coordinate to test (in world coordinates)\n * @param recurse checks whether the x/y are contained in any child actors (if they exist).\n */\n contains(x, y, recurse = false) {\n const point = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(x, y);\n const collider = this.get(_Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_13__.ColliderComponent);\n collider.update();\n const geom = collider.get();\n if (!geom) {\n return false;\n }\n const containment = geom.contains(point);\n if (recurse) {\n return (containment ||\n this.children.some((child) => {\n return child.contains(x, y, true);\n }));\n }\n return containment;\n }\n /**\n * Returns true if the two actor.collider's surfaces are less than or equal to the distance specified from each other\n * @param actor Actor to test\n * @param distance Distance in pixels to test\n */\n within(actor, distance) {\n const collider = this.get(_Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_13__.ColliderComponent);\n const otherCollider = actor.get(_Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_13__.ColliderComponent);\n const me = collider.get();\n const other = otherCollider.get();\n if (me && other) {\n return me.getClosestLineBetween(other).getLength() <= distance;\n }\n return false;\n }\n // #endregion\n // #region Update\n /**\n * Called by the Engine, updates the state of the actor\n * @internal\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n */\n update(engine, elapsed) {\n this._initialize(engine);\n this._add(engine);\n this._preupdate(engine, elapsed);\n this._postupdate(engine, elapsed);\n this._remove(engine);\n }\n /**\n * Safe to override onPreUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPreUpdate` is called directly before an actor is updated.\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n */\n onPreUpdate(engine, elapsed) {\n // Override me\n }\n /**\n * Safe to override onPostUpdate lifecycle event handler. Synonymous with `.on('postupdate', (evt) =>{...})`\n *\n * `onPostUpdate` is called directly after an actor is updated.\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n */\n onPostUpdate(engine, elapsed) {\n // Override me\n }\n /**\n * Fires before every collision resolution for a confirmed contact\n * @param self\n * @param other\n * @param side\n * @param contact\n */\n onPreCollisionResolve(self, other, side, contact) {\n // Override me\n }\n /**\n * Fires after every resolution for a confirmed contact.\n * @param self\n * @param other\n * @param side\n * @param contact\n */\n onPostCollisionResolve(self, other, side, contact) {\n // Override me\n }\n /**\n * Fires once when 2 entities with a ColliderComponent first start colliding or touching, if the Colliders stay in contact this\n * does not continue firing until they separate and re-collide.\n * @param self\n * @param other\n * @param side\n * @param contact\n */\n onCollisionStart(self, other, side, contact) {\n // Override me\n }\n /**\n * Fires once when 2 entities with a ColliderComponent separate after having been in contact.\n * @param self\n * @param other\n * @param side\n * @param lastContact\n */\n onCollisionEnd(self, other, side, lastContact) {\n // Override me\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _preupdate handler for {@apilink onPreUpdate} lifecycle event\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n * @internal\n */\n _preupdate(engine, elapsed) {\n this.events.emit('preupdate', new _Events__WEBPACK_IMPORTED_MODULE_17__.PreUpdateEvent(engine, elapsed, this));\n this.onPreUpdate(engine, elapsed);\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _preupdate handler for {@apilink onPostUpdate} lifecycle event\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n * @internal\n */\n _postupdate(engine, elapsed) {\n this.events.emit('postupdate', new _Events__WEBPACK_IMPORTED_MODULE_17__.PostUpdateEvent(engine, elapsed, this));\n this.onPostUpdate(engine, elapsed);\n }\n}\n// #region Properties\n/**\n * Set defaults for all Actors\n */\nActor.defaults = {\n anchor: _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Half\n};\n\n\n/***/ }),\n\n/***/ \"./Camera.ts\":\n/*!*******************!*\\\n !*** ./Camera.ts ***!\n \\*******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Axis: () => (/* binding */ Axis),\n/* harmony export */ Camera: () => (/* binding */ Camera),\n/* harmony export */ CameraEvents: () => (/* binding */ CameraEvents),\n/* harmony export */ ElasticToActorStrategy: () => (/* binding */ ElasticToActorStrategy),\n/* harmony export */ LimitCameraBoundsStrategy: () => (/* binding */ LimitCameraBoundsStrategy),\n/* harmony export */ LockCameraToActorAxisStrategy: () => (/* binding */ LockCameraToActorAxisStrategy),\n/* harmony export */ LockCameraToActorStrategy: () => (/* binding */ LockCameraToActorStrategy),\n/* harmony export */ RadiusAroundActorStrategy: () => (/* binding */ RadiusAroundActorStrategy),\n/* harmony export */ StrategyContainer: () => (/* binding */ StrategyContainer)\n/* harmony export */ });\n/* harmony import */ var _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Util/EasingFunctions */ \"./Util/EasingFunctions.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Util/Util */ \"./Util/Util.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Events */ \"./Events.ts\");\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Math/affine-matrix */ \"./Math/affine-matrix.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Graphics */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Math_watch_vector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Math/watch-vector */ \"./Math/watch-vector.ts\");\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Container to house convenience strategy methods\n * @internal\n */\nclass StrategyContainer {\n constructor(camera) {\n this.camera = camera;\n }\n /**\n * Creates and adds the {@apilink LockCameraToActorStrategy} on the current camera.\n * @param actor The actor to lock the camera to\n */\n lockToActor(actor) {\n this.camera.addStrategy(new LockCameraToActorStrategy(actor));\n }\n /**\n * Creates and adds the {@apilink LockCameraToActorAxisStrategy} on the current camera\n * @param actor The actor to lock the camera to\n * @param axis The axis to follow the actor on\n */\n lockToActorAxis(actor, axis) {\n this.camera.addStrategy(new LockCameraToActorAxisStrategy(actor, axis));\n }\n /**\n * Creates and adds the {@apilink ElasticToActorStrategy} on the current camera\n * If cameraElasticity < cameraFriction < 1.0, the behavior will be a dampened spring that will slowly end at the target without bouncing\n * If cameraFriction < cameraElasticity < 1.0, the behavior will be an oscillating spring that will over\n * correct and bounce around the target\n * @param actor Target actor to elastically follow\n * @param cameraElasticity [0 - 1.0] The higher the elasticity the more force that will drive the camera towards the target\n * @param cameraFriction [0 - 1.0] The higher the friction the more that the camera will resist motion towards the target\n */\n elasticToActor(actor, cameraElasticity, cameraFriction) {\n this.camera.addStrategy(new ElasticToActorStrategy(actor, cameraElasticity, cameraFriction));\n }\n /**\n * Creates and adds the {@apilink RadiusAroundActorStrategy} on the current camera\n * @param actor Target actor to follow when it is \"radius\" pixels away\n * @param radius Number of pixels away before the camera will follow\n */\n radiusAroundActor(actor, radius) {\n this.camera.addStrategy(new RadiusAroundActorStrategy(actor, radius));\n }\n /**\n * Creates and adds the {@apilink LimitCameraBoundsStrategy} on the current camera\n * @param box The bounding box to limit the camera to.\n */\n limitCameraBounds(box) {\n this.camera.addStrategy(new LimitCameraBoundsStrategy(box));\n }\n}\n/**\n * Camera axis enum\n */\nvar Axis;\n(function (Axis) {\n Axis[Axis[\"X\"] = 0] = \"X\";\n Axis[Axis[\"Y\"] = 1] = \"Y\";\n})(Axis || (Axis = {}));\n/**\n * Lock a camera to the exact x/y position of an actor.\n */\nclass LockCameraToActorStrategy {\n constructor(target) {\n this.target = target;\n this.action = (target, camera, engine, elapsed) => {\n const center = target.center;\n return center;\n };\n }\n}\n/**\n * Lock a camera to a specific axis around an actor.\n */\nclass LockCameraToActorAxisStrategy {\n constructor(target, axis) {\n this.target = target;\n this.axis = axis;\n this.action = (target, cam, _eng, elapsed) => {\n const center = target.center;\n const currentFocus = cam.getFocus();\n if (this.axis === Axis.X) {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(center.x, currentFocus.y);\n }\n else {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(currentFocus.x, center.y);\n }\n };\n }\n}\n/**\n * Using [Hook's law](https://en.wikipedia.org/wiki/Hooke's_law), elastically move the camera towards the target actor.\n */\nclass ElasticToActorStrategy {\n /**\n * If cameraElasticity < cameraFriction < 1.0, the behavior will be a dampened spring that will slowly end at the target without bouncing\n * If cameraFriction < cameraElasticity < 1.0, the behavior will be an oscillating spring that will over\n * correct and bounce around the target\n * @param target Target actor to elastically follow\n * @param cameraElasticity [0 - 1.0] The higher the elasticity the more force that will drive the camera towards the target\n * @param cameraFriction [0 - 1.0] The higher the friction the more that the camera will resist motion towards the target\n */\n constructor(target, cameraElasticity, cameraFriction) {\n this.target = target;\n this.cameraElasticity = cameraElasticity;\n this.cameraFriction = cameraFriction;\n this.action = (target, cam, _eng, elapsed) => {\n const position = target.center;\n let focus = cam.getFocus();\n let cameraVel = cam.vel.clone();\n // Calculate the stretch vector, using the spring equation\n // F = kX\n // https://en.wikipedia.org/wiki/Hooke's_law\n // Apply to the current camera velocity\n const stretch = position.sub(focus).scale(this.cameraElasticity); // stretch is X\n cameraVel = cameraVel.add(stretch);\n // Calculate the friction (-1 to apply a force in the opposition of motion)\n // Apply to the current camera velocity\n const friction = cameraVel.scale(-1).scale(this.cameraFriction);\n cameraVel = cameraVel.add(friction);\n // Update position by velocity deltas\n focus = focus.add(cameraVel);\n return focus;\n };\n }\n}\nclass RadiusAroundActorStrategy {\n /**\n *\n * @param target Target actor to follow when it is \"radius\" pixels away\n * @param radius Number of pixels away before the camera will follow\n */\n constructor(target, radius) {\n this.target = target;\n this.radius = radius;\n this.action = (target, cam, _eng, elapsed) => {\n const position = target.center;\n const focus = cam.getFocus();\n const direction = position.sub(focus);\n const distance = direction.magnitude;\n if (distance >= this.radius) {\n const offset = distance - this.radius;\n return focus.add(direction.normalize().scale(offset));\n }\n return focus;\n };\n }\n}\n/**\n * Prevent a camera from going beyond the given camera dimensions.\n */\nclass LimitCameraBoundsStrategy {\n constructor(target) {\n this.target = target;\n /**\n * Useful for limiting the camera to a {@apilink TileMap}'s dimensions, or a specific area inside the map.\n *\n * Note that this strategy does not perform any movement by itself.\n * It only sets the camera position to within the given bounds when the camera has gone beyond them.\n * Thus, it is a good idea to combine it with other camera strategies and set this strategy as the last one.\n *\n * Make sure that the camera bounds are at least as large as the viewport size.\n * @param target The bounding box to limit the camera to\n */\n this.boundSizeChecked = false; // Check and warn only once\n this.action = (target, cam, _eng, elapsed) => {\n const focus = cam.getFocus();\n if (!this.boundSizeChecked) {\n if (target.bottom - target.top < _eng.drawHeight || target.right - target.left < _eng.drawWidth) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance().warn('Camera bounds should not be smaller than the engine viewport');\n }\n this.boundSizeChecked = true;\n }\n let focusX = focus.x;\n let focusY = focus.y;\n if (focus.x < target.left + _eng.halfDrawWidth) {\n focusX = target.left + _eng.halfDrawWidth;\n }\n else if (focus.x > target.right - _eng.halfDrawWidth) {\n focusX = target.right - _eng.halfDrawWidth;\n }\n if (focus.y < target.top + _eng.halfDrawHeight) {\n focusY = target.top + _eng.halfDrawHeight;\n }\n else if (focus.y > target.bottom - _eng.halfDrawHeight) {\n focusY = target.bottom - _eng.halfDrawHeight;\n }\n return (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(focusX, focusY);\n };\n }\n}\nconst CameraEvents = {\n Initialize: 'initialize',\n PreUpdate: 'preupdate',\n PostUpdate: 'postupdate'\n};\n/**\n * Cameras\n *\n * {@apilink Camera} is the base class for all Excalibur cameras. Cameras are used\n * to move around your game and set focus. They are used to determine\n * what is \"off screen\" and can be used to scale the game.\n *\n */\nclass Camera {\n constructor() {\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_2__.EventEmitter();\n this.transform = _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_3__.AffineMatrix.identity();\n this.inverse = _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_3__.AffineMatrix.identity();\n this._cameraStrategies = [];\n this.strategy = new StrategyContainer(this);\n /**\n * Get or set current zoom of the camera, defaults to 1\n */\n this._z = 1;\n /**\n * Get or set rate of change in zoom, defaults to 0\n */\n this.dz = 0;\n /**\n * Get or set zoom acceleration\n */\n this.az = 0;\n /**\n * Current rotation of the camera\n */\n this.rotation = 0;\n this._angularVelocity = 0;\n this._posChanged = false;\n this._pos = new _Math_watch_vector__WEBPACK_IMPORTED_MODULE_4__.WatchVector(_Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero, () => {\n this._posChanged = true;\n });\n /**\n * Interpolated camera position if more draws are running than updates\n *\n * Enabled when `Engine.fixedUpdateFps` is enabled, in all other cases this will be the same as pos\n */\n this.drawPos = this.pos.clone();\n this._oldPos = this.pos.clone();\n /**\n * Get or set the camera's velocity\n */\n this.vel = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero;\n /**\n * Get or set the camera's acceleration\n */\n this.acc = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero;\n this._cameraMoving = false;\n this._currentLerpTime = 0;\n this._lerpDuration = 1000; // 1 second\n this._lerpStart = null;\n this._lerpEnd = null;\n //camera effects\n this._isShaking = false;\n this._shakeMagnitudeX = 0;\n this._shakeMagnitudeY = 0;\n this._shakeDuration = 0;\n this._elapsedShakeTime = 0;\n this._xShake = 0;\n this._yShake = 0;\n this._isZooming = false;\n this._zoomStart = 1;\n this._zoomEnd = 1;\n this._currentZoomTime = 0;\n this._zoomDuration = 0;\n this._zoomEasing = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_5__.EasingFunctions.EaseInOutCubic;\n this._easing = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_5__.EasingFunctions.EaseInOutCubic;\n this._halfWidth = 0;\n this._halfHeight = 0;\n this._viewport = null;\n this._isInitialized = false;\n this._snapPos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n }\n get zoom() {\n return this._z;\n }\n set zoom(val) {\n this._z = val;\n if (this._engine) {\n this._halfWidth = this._engine.halfDrawWidth;\n this._halfHeight = this._engine.halfDrawHeight;\n }\n }\n /**\n * Get or set the camera's angular velocity\n */\n get angularVelocity() {\n return this._angularVelocity;\n }\n set angularVelocity(value) {\n this._angularVelocity = value;\n }\n /**\n * Get or set the camera's position\n */\n get pos() {\n return this._pos;\n }\n set pos(vec) {\n this._posChanged = true;\n this._pos = new _Math_watch_vector__WEBPACK_IMPORTED_MODULE_4__.WatchVector(vec, () => {\n this._posChanged = true;\n });\n }\n /**\n * Has the position changed since the last update\n */\n hasChanged() {\n return this._posChanged;\n }\n /**\n * Get the camera's x position\n */\n get x() {\n return this.pos.x;\n }\n /**\n * Set the camera's x position (cannot be set when following an {@apilink Actor} or when moving)\n */\n set x(value) {\n if (!this._follow && !this._cameraMoving) {\n this.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(value, this.pos.y);\n }\n }\n /**\n * Get the camera's y position\n */\n get y() {\n return this.pos.y;\n }\n /**\n * Set the camera's y position (cannot be set when following an {@apilink Actor} or when moving)\n */\n set y(value) {\n if (!this._follow && !this._cameraMoving) {\n this.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.pos.x, value);\n }\n }\n /**\n * Get or set the camera's x velocity\n */\n get dx() {\n return this.vel.x;\n }\n set dx(value) {\n this.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(value, this.vel.y);\n }\n /**\n * Get or set the camera's y velocity\n */\n get dy() {\n return this.vel.y;\n }\n set dy(value) {\n this.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.vel.x, value);\n }\n /**\n * Get or set the camera's x acceleration\n */\n get ax() {\n return this.acc.x;\n }\n set ax(value) {\n this.acc = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(value, this.acc.y);\n }\n /**\n * Get or set the camera's y acceleration\n */\n get ay() {\n return this.acc.y;\n }\n set ay(value) {\n this.acc = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.acc.x, value);\n }\n /**\n * Returns the focal point of the camera, a new point giving the x and y position of the camera\n */\n getFocus() {\n return this.pos;\n }\n /**\n * This moves the camera focal point to the specified position using specified easing function. Cannot move when following an Actor.\n * @param pos The target position to move to\n * @param duration The duration in milliseconds the move should last\n * @param [easingFn] An optional easing function ({@apilink EasingFunctions.EaseInOutCubic} by default)\n * @returns A {@apilink Promise} that resolves when movement is finished, including if it's interrupted.\n * The {@apilink Promise} value is the {@apilink Vector} of the target position. It will be rejected if a move cannot be made.\n */\n move(pos, duration, easingFn = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_5__.EasingFunctions.EaseInOutCubic) {\n if (typeof easingFn !== 'function') {\n throw 'Please specify an EasingFunction';\n }\n // cannot move when following an actor\n if (this._follow) {\n return Promise.reject(pos);\n }\n // resolve existing promise, if any\n if (this._lerpPromise && this._lerpResolve) {\n this._lerpResolve(pos);\n }\n this._lerpPromise = new Promise((resolve) => {\n this._lerpResolve = resolve;\n });\n this._lerpStart = this.getFocus().clone();\n this._lerpDuration = duration;\n this._lerpEnd = pos;\n this._currentLerpTime = 0;\n this._cameraMoving = true;\n this._easing = easingFn;\n return this._lerpPromise;\n }\n /**\n * Sets the camera to shake at the specified magnitudes for the specified duration\n * @param magnitudeX The x magnitude of the shake\n * @param magnitudeY The y magnitude of the shake\n * @param duration The duration of the shake in milliseconds\n */\n shake(magnitudeX, magnitudeY, duration) {\n this._isShaking = true;\n this._shakeMagnitudeX = magnitudeX;\n this._shakeMagnitudeY = magnitudeY;\n this._shakeDuration = duration;\n }\n /**\n * Zooms the camera in or out by the specified scale over the specified duration.\n * If no duration is specified, it take effect immediately.\n * @param scale The scale of the zoom\n * @param duration The duration of the zoom in milliseconds\n */\n zoomOverTime(scale, duration = 0, easingFn = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_5__.EasingFunctions.EaseInOutCubic) {\n this._zoomPromise = new Promise((resolve) => {\n this._zoomResolve = resolve;\n });\n if (duration) {\n this._isZooming = true;\n this._zoomEasing = easingFn;\n this._currentZoomTime = 0;\n this._zoomDuration = duration;\n this._zoomStart = this.zoom;\n this._zoomEnd = scale;\n }\n else {\n this._isZooming = false;\n this.zoom = scale;\n return Promise.resolve(true);\n }\n return this._zoomPromise;\n }\n /**\n * Gets the bounding box of the viewport of this camera in world coordinates\n */\n get viewport() {\n if (this._viewport) {\n return this._viewport;\n }\n return new _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox(0, 0, 0, 0);\n }\n /**\n * Adds a new camera strategy to this camera\n * @param cameraStrategy Instance of an {@apilink CameraStrategy}\n */\n addStrategy(cameraStrategy) {\n this._cameraStrategies.push(cameraStrategy);\n }\n /**\n * Removes a camera strategy by reference\n * @param cameraStrategy Instance of an {@apilink CameraStrategy}\n */\n removeStrategy(cameraStrategy) {\n (0,_Util_Util__WEBPACK_IMPORTED_MODULE_7__.removeItemFromArray)(cameraStrategy, this._cameraStrategies);\n }\n /**\n * Clears all camera strategies from the camera\n */\n clearAllStrategies() {\n this._cameraStrategies.length = 0;\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _preupdate handler for {@apilink onPreUpdate} lifecycle event\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n * @internal\n */\n _preupdate(engine, elapsed) {\n this.events.emit('preupdate', new _Events__WEBPACK_IMPORTED_MODULE_8__.PreUpdateEvent(engine, elapsed, this));\n this.onPreUpdate(engine, elapsed);\n }\n /**\n * Safe to override onPreUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPreUpdate` is called directly before a scene is updated.\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n */\n onPreUpdate(engine, elapsed) {\n // Overridable\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _preupdate handler for {@apilink onPostUpdate} lifecycle event\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n * @internal\n */\n _postupdate(engine, elapsed) {\n this.events.emit('postupdate', new _Events__WEBPACK_IMPORTED_MODULE_8__.PostUpdateEvent(engine, elapsed, this));\n this.onPostUpdate(engine, elapsed);\n }\n /**\n * Safe to override onPostUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPostUpdate` is called directly after a scene is updated.\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n */\n onPostUpdate(engine, elapsed) {\n // Overridable\n }\n get isInitialized() {\n return this._isInitialized;\n }\n _initialize(engine) {\n if (!this.isInitialized) {\n this._engine = engine;\n this._screen = engine.screen;\n const currentRes = this._screen.contentArea;\n let center = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(currentRes.width / 2, currentRes.height / 2);\n if (!this._engine.loadingComplete) {\n // If there was a loading screen, we peek the configured resolution\n const res = this._screen.peekResolution();\n if (res) {\n center = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(res.width / 2, res.height / 2);\n }\n }\n this._halfWidth = center.x;\n this._halfHeight = center.y;\n // If the user has not set the camera pos, apply default center screen position\n if (!this._posChanged) {\n this.pos = center;\n }\n this.pos.clone(this.drawPos);\n // First frame bootstrap\n // Ensure camera tx is correct\n // Run update twice to ensure properties are init'd\n this.updateTransform(this.pos);\n // Run strategies for first frame\n this.runStrategies(engine, engine.clock.elapsed());\n // Setup the first frame viewport\n this.updateViewport();\n // It's important to update the camera after strategies\n // This prevents jitter\n this.updateTransform(this.pos);\n this.pos.clone(this._oldPos);\n this.onInitialize(engine);\n this.events.emit('initialize', new _Events__WEBPACK_IMPORTED_MODULE_8__.InitializeEvent(engine, this));\n this._isInitialized = true;\n }\n }\n /**\n * Safe to override onPostUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPostUpdate` is called directly after a scene is updated.\n */\n onInitialize(engine) {\n // Overridable\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n runStrategies(engine, elapsed) {\n for (const s of this._cameraStrategies) {\n this.pos = s.action.call(s, s.target, this, engine, elapsed);\n }\n }\n updateViewport() {\n // recalculate viewport\n this._viewport = new _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox(this.x - this._halfWidth, this.y - this._halfHeight, this.x + this._halfWidth, this.y + this._halfHeight);\n }\n update(engine, elapsed) {\n this._initialize(engine);\n this._preupdate(engine, elapsed);\n this.pos.clone(this._oldPos);\n // Update placements based on linear algebra\n this.pos = this.pos.add(this.vel.scale(elapsed / 1000));\n this.zoom += (this.dz * elapsed) / 1000;\n this.vel = this.vel.add(this.acc.scale(elapsed / 1000));\n this.dz += (this.az * elapsed) / 1000;\n this.rotation += (this.angularVelocity * elapsed) / 1000;\n if (this._isZooming) {\n if (this._currentZoomTime < this._zoomDuration) {\n const zoomEasing = this._zoomEasing;\n const newZoom = zoomEasing(this._currentZoomTime, this._zoomStart, this._zoomEnd, this._zoomDuration);\n this.zoom = newZoom;\n this._currentZoomTime += elapsed;\n }\n else {\n this._isZooming = false;\n this.zoom = this._zoomEnd;\n this._currentZoomTime = 0;\n this._zoomResolve(true);\n }\n }\n if (this._cameraMoving) {\n if (this._currentLerpTime < this._lerpDuration) {\n const moveEasing = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_5__.EasingFunctions.CreateVectorEasingFunction(this._easing);\n const lerpPoint = moveEasing(this._currentLerpTime, this._lerpStart, this._lerpEnd, this._lerpDuration);\n this.pos = lerpPoint;\n this._currentLerpTime += elapsed;\n }\n else {\n this.pos = this._lerpEnd;\n const end = this._lerpEnd.clone();\n this._lerpStart = null;\n this._lerpEnd = null;\n this._currentLerpTime = 0;\n this._cameraMoving = false;\n // Order matters here, resolve should be last so any chain promises have a clean slate\n this._lerpResolve(end);\n }\n }\n if (this._isDoneShaking()) {\n this._isShaking = false;\n this._elapsedShakeTime = 0;\n this._shakeMagnitudeX = 0;\n this._shakeMagnitudeY = 0;\n this._shakeDuration = 0;\n this._xShake = 0;\n this._yShake = 0;\n }\n else {\n this._elapsedShakeTime += elapsed;\n this._xShake = ((Math.random() * this._shakeMagnitudeX) | 0) + 1;\n this._yShake = ((Math.random() * this._shakeMagnitudeY) | 0) + 1;\n }\n this.runStrategies(engine, elapsed);\n this.updateViewport();\n // It's important to update the camera after strategies\n // This prevents jitter\n this.updateTransform(this.pos);\n this._postupdate(engine, elapsed);\n this._posChanged = false;\n }\n /**\n * Applies the relevant transformations to the game canvas to \"move\" or apply effects to the Camera\n * @param ctx Canvas context to apply transformations\n */\n draw(ctx) {\n // default to the current position\n this.pos.clone(this.drawPos);\n // interpolation if fixed update is on\n // must happen on the draw, because more draws are potentially happening than updates\n if (this._engine.fixedUpdateTimestep) {\n const blend = this._engine.currentFrameLagMs / this._engine.fixedUpdateTimestep;\n const interpolatedPos = this.pos.scale(blend).add(this._oldPos.scale(1.0 - blend));\n interpolatedPos.clone(this.drawPos);\n this.updateTransform(interpolatedPos);\n }\n // Snap camera to pixel\n if (ctx.snapToPixel) {\n const snapPos = this.drawPos.clone(this._snapPos);\n snapPos.x = ~~(snapPos.x + _Graphics__WEBPACK_IMPORTED_MODULE_9__.pixelSnapEpsilon * (0,_Math_util__WEBPACK_IMPORTED_MODULE_10__.sign)(snapPos.x));\n snapPos.y = ~~(snapPos.y + _Graphics__WEBPACK_IMPORTED_MODULE_9__.pixelSnapEpsilon * (0,_Math_util__WEBPACK_IMPORTED_MODULE_10__.sign)(snapPos.y));\n snapPos.clone(this.drawPos);\n this.updateTransform(snapPos);\n }\n ctx.multiply(this.transform);\n }\n updateTransform(pos) {\n // center the camera\n const newCanvasWidth = this._screen.resolution.width / this.zoom;\n const newCanvasHeight = this._screen.resolution.height / this.zoom;\n const cameraPos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(-pos.x + newCanvasWidth / 2 + this._xShake, -pos.y + newCanvasHeight / 2 + this._yShake);\n // Calculate camera transform\n this.transform.reset();\n this.transform.scale(this.zoom, this.zoom);\n // rotate about the focus\n this.transform.translate(newCanvasWidth / 2, newCanvasHeight / 2);\n this.transform.rotate(this.rotation);\n this.transform.translate(-newCanvasWidth / 2, -newCanvasHeight / 2);\n this.transform.translate(cameraPos.x, cameraPos.y);\n this.transform.inverse(this.inverse);\n }\n _isDoneShaking() {\n return !this._isShaking || this._elapsedShakeTime >= this._shakeDuration;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/BodyComponent.ts\":\n/*!************************************!*\\\n !*** ./Collision/BodyComponent.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BodyComponent: () => (/* binding */ BodyComponent),\n/* harmony export */ DegreeOfFreedom: () => (/* binding */ DegreeOfFreedom)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Component */ \"./EntityComponentSystem/Component.ts\");\n/* harmony import */ var _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Group/CollisionGroup */ \"./Collision/Group/CollisionGroup.ts\");\n/* harmony import */ var _Id__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Id */ \"./Id.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _ColliderComponent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./ColliderComponent */ \"./Collision/ColliderComponent.ts\");\n/* harmony import */ var _Math_transform__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Math/transform */ \"./Math/transform.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _PhysicsConfig__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./PhysicsConfig */ \"./Collision/PhysicsConfig.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\nvar DegreeOfFreedom;\n(function (DegreeOfFreedom) {\n DegreeOfFreedom[\"Rotation\"] = \"rotation\";\n DegreeOfFreedom[\"X\"] = \"x\";\n DegreeOfFreedom[\"Y\"] = \"y\";\n})(DegreeOfFreedom || (DegreeOfFreedom = {}));\n/**\n * Body describes all the physical properties pos, vel, acc, rotation, angular velocity for the purpose of\n * of physics simulation.\n */\nclass BodyComponent extends _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor(options) {\n var _a, _b, _c;\n super();\n this.dependencies = [_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent, _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent];\n this.id = (0,_Id__WEBPACK_IMPORTED_MODULE_3__.createId)('body', BodyComponent._ID++);\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_4__.EventEmitter();\n this.oldTransform = new _Math_transform__WEBPACK_IMPORTED_MODULE_5__.Transform();\n /**\n * Indicates whether the old transform has been captured at least once for interpolation\n * @internal\n */\n this.__oldTransformCaptured = false;\n /**\n * Enable or disabled the fixed update interpolation, by default interpolation is on.\n */\n this.enableFixedUpdateInterpolate = true;\n /**\n * Collision type for the rigidbody physics simulation, by default {@apilink CollisionType.PreventCollision}\n */\n this.collisionType = _CollisionType__WEBPACK_IMPORTED_MODULE_6__.CollisionType.PreventCollision;\n /**\n * The collision group for the body's colliders, by default body colliders collide with everything\n */\n this.group = _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_7__.CollisionGroup.All;\n this._sleeping = false;\n /**\n * The also known as coefficient of restitution of this actor, represents the amount of energy preserved after collision or the\n * bounciness. If 1, it is 100% bouncy, 0 it completely absorbs.\n */\n this.bounciness = 0.2;\n /**\n * The coefficient of friction on this actor.\n *\n * The {@apilink SolverStrategy.Arcade} does not support this property.\n *\n */\n this.friction = 0.99;\n /**\n * Should use global gravity {@apilink Physics.gravity} in it's physics simulation, default is true\n */\n this.useGravity = true;\n /**\n * Degrees of freedom to limit\n *\n * Note: this only limits responses in the realistic solver, if velocity/angularVelocity is set the actor will still respond\n */\n this.limitDegreeOfFreedom = [];\n this._oldGlobalPos = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Zero;\n /**\n * The velocity of the actor last frame (vx, vy) in pixels/second\n */\n this.oldVel = new _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector(0, 0);\n /**\n * Gets/sets the acceleration of the actor from the last frame. This does not include the global acc {@apilink Physics.acc}.\n */\n this.oldAcc = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Zero;\n this._impulseScratch = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_8__.vec)(0, 0);\n this._distanceFromCenterScratch = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_8__.vec)(0, 0);\n if (options) {\n this.collisionType = (_a = options.type) !== null && _a !== void 0 ? _a : this.collisionType;\n this.group = (_b = options.group) !== null && _b !== void 0 ? _b : this.group;\n this.useGravity = (_c = options.useGravity) !== null && _c !== void 0 ? _c : this.useGravity;\n this._bodyConfig = {\n ...(0,_PhysicsConfig__WEBPACK_IMPORTED_MODULE_9__.getDefaultPhysicsConfig)().bodies,\n ...options.config\n };\n }\n else {\n this._bodyConfig = {\n ...(0,_PhysicsConfig__WEBPACK_IMPORTED_MODULE_9__.getDefaultPhysicsConfig)().bodies\n };\n }\n this.updatePhysicsConfig(this._bodyConfig);\n this._mass = BodyComponent._DEFAULT_CONFIG.defaultMass;\n }\n get matrix() {\n return this.transform.get().matrix;\n }\n /**\n * Called by excalibur to update physics config defaults if they change\n * @param config\n */\n updatePhysicsConfig(config) {\n this._bodyConfig = {\n ...(0,_PhysicsConfig__WEBPACK_IMPORTED_MODULE_9__.getDefaultPhysicsConfig)().bodies,\n ...config\n };\n this.canSleep = this._bodyConfig.canSleepByDefault;\n this.sleepMotion = this._bodyConfig.sleepEpsilon * 5;\n this.wakeThreshold = this._bodyConfig.wakeThreshold;\n }\n /**\n * Called by excalibur to update defaults\n * @param config\n */\n static updateDefaultPhysicsConfig(config) {\n BodyComponent._DEFAULT_CONFIG = config;\n }\n get mass() {\n return this._mass;\n }\n set mass(newMass) {\n this._mass = newMass;\n this._cachedInertia = undefined;\n this._cachedInverseInertia = undefined;\n }\n /**\n * The inverse mass (1/mass) of the body. If {@apilink CollisionType.Fixed} this is 0, meaning \"infinite\" mass\n */\n get inverseMass() {\n return this.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_6__.CollisionType.Fixed ? 0 : 1 / this.mass;\n }\n /**\n * Whether this body is sleeping or not\n * @deprecated use isSleeping\n */\n get sleeping() {\n return this.isSleeping;\n }\n /**\n * Whether this body is sleeping or not\n */\n get isSleeping() {\n return this._sleeping;\n }\n /**\n * Set the sleep state of the body\n * @param sleeping\n * @deprecated use isSleeping\n */\n setSleeping(sleeping) {\n this.isSleeping = sleeping;\n }\n set isSleeping(sleeping) {\n this._sleeping = sleeping;\n if (!sleeping) {\n // Give it a kick to keep it from falling asleep immediately\n this.sleepMotion = this._bodyConfig.sleepEpsilon * 5;\n }\n else {\n this.vel = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Zero;\n this.acc = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Zero;\n this.angularVelocity = 0;\n this.sleepMotion = 0;\n }\n }\n /**\n * Update body's {@apilink BodyComponent.sleepMotion} for the purpose of sleeping\n */\n updateMotion() {\n if (this._sleeping) {\n this.isSleeping = true;\n }\n const currentMotion = this.vel.magnitude * this.vel.magnitude + Math.abs(this.angularVelocity * this.angularVelocity);\n const bias = this._bodyConfig.sleepBias;\n this.sleepMotion = bias * this.sleepMotion + (1 - bias) * currentMotion;\n this.sleepMotion = (0,_Math_util__WEBPACK_IMPORTED_MODULE_10__.clamp)(this.sleepMotion, 0, 10 * this._bodyConfig.sleepEpsilon);\n if (this.canSleep && this.sleepMotion < this._bodyConfig.sleepEpsilon) {\n this.isSleeping = true;\n }\n }\n /**\n * Get the moment of inertia from the {@apilink ColliderComponent}\n */\n get inertia() {\n if (this._cachedInertia) {\n return this._cachedInertia;\n }\n // Inertia is a property of the geometry, so this is a little goofy but seems to be okay?\n const collider = this.owner.get(_ColliderComponent__WEBPACK_IMPORTED_MODULE_11__.ColliderComponent);\n if (collider) {\n collider.$colliderAdded.subscribe(() => {\n this._cachedInertia = null;\n });\n collider.$colliderRemoved.subscribe(() => {\n this._cachedInertia = null;\n });\n const maybeCollider = collider.get();\n if (maybeCollider) {\n return (this._cachedInertia = maybeCollider.getInertia(this.mass));\n }\n }\n return 0;\n }\n /**\n * Get the inverse moment of inertial from the {@apilink ColliderComponent}. If {@apilink CollisionType.Fixed} this is 0, meaning \"infinite\" mass\n */\n get inverseInertia() {\n if (this._cachedInverseInertia) {\n return this._cachedInverseInertia;\n }\n return (this._cachedInverseInertia = this.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_6__.CollisionType.Fixed ? 0 : 1 / this.inertia);\n }\n /**\n * Returns if the owner is active\n * @deprecated use isActive\n */\n get active() {\n var _a;\n return !!((_a = this.owner) === null || _a === void 0 ? void 0 : _a.isActive);\n }\n /**\n * Returns if the owner is active\n */\n get isActive() {\n var _a;\n return !!((_a = this.owner) === null || _a === void 0 ? void 0 : _a.isActive);\n }\n /**\n * @deprecated Use globalPos\n */\n get center() {\n return this.globalPos;\n }\n onAdd(owner) {\n var _a, _b;\n this.transform = (_a = this.owner) === null || _a === void 0 ? void 0 : _a.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this.motion = (_b = this.owner) === null || _b === void 0 ? void 0 : _b.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n }\n get pos() {\n return this.transform.pos;\n }\n set pos(val) {\n this.transform.pos = val;\n }\n /**\n * The (x, y) position of the actor this will be in the middle of the actor if the\n * {@apilink Actor.anchor} is set to (0.5, 0.5) which is default.\n * If you want the (x, y) position to be the top left of the actor specify an anchor of (0, 0).\n */\n get globalPos() {\n return this.transform.globalPos;\n }\n set globalPos(val) {\n this.transform.globalPos = val;\n }\n /**\n * The position of the actor last frame (x, y) in pixels\n */\n get oldPos() {\n return this.oldTransform.pos;\n }\n /**\n * The global position of the actor last frame (x, y) in pixels\n */\n get oldGlobalPos() {\n return this._oldGlobalPos;\n }\n /**\n * The current velocity vector (vx, vy) of the actor in pixels/second\n */\n get vel() {\n return this.motion.vel;\n }\n set vel(val) {\n this.motion.vel = val;\n }\n /**\n * The current acceleration vector (ax, ay) of the actor in pixels/second/second. An acceleration pointing down such as (0, 100) may\n * be useful to simulate a gravitational effect.\n */\n get acc() {\n return this.motion.acc;\n }\n set acc(val) {\n this.motion.acc = val;\n }\n /**\n * The current torque applied to the actor\n */\n get torque() {\n return this.motion.torque;\n }\n set torque(val) {\n this.motion.torque = val;\n }\n /**\n * Gets/sets the rotation of the body from the last frame.\n */\n get oldRotation() {\n return this.oldTransform.rotation;\n }\n /**\n * The rotation of the body in radians\n */\n get rotation() {\n return this.transform.globalRotation;\n }\n set rotation(val) {\n this.transform.globalRotation = val;\n }\n /**\n * The scale vector of the actor\n */\n get scale() {\n return this.transform.globalScale;\n }\n set scale(val) {\n this.transform.globalScale = val;\n }\n /**\n * The scale of the actor last frame\n */\n get oldScale() {\n return this.oldTransform.scale;\n }\n /**\n * The scale rate of change of the actor in scale/second\n */\n get scaleFactor() {\n return this.motion.scaleFactor;\n }\n set scaleFactor(scaleFactor) {\n this.motion.scaleFactor = scaleFactor;\n }\n /**\n * Get the angular velocity in radians/second\n */\n get angularVelocity() {\n return this.motion.angularVelocity;\n }\n /**\n * Set the angular velocity in radians/second\n */\n set angularVelocity(value) {\n this.motion.angularVelocity = value;\n }\n /**\n * Apply a specific impulse to the body\n * @param point\n * @param impulse\n */\n applyImpulse(point, impulse) {\n if (this.collisionType !== _CollisionType__WEBPACK_IMPORTED_MODULE_6__.CollisionType.Active) {\n return; // only active objects participate in the simulation\n }\n const finalImpulse = impulse.scale(this.inverseMass, this._impulseScratch);\n if (this.limitDegreeOfFreedom.indexOf(DegreeOfFreedom.X) > -1) {\n finalImpulse.x = 0;\n }\n if (this.limitDegreeOfFreedom.indexOf(DegreeOfFreedom.Y) > -1) {\n finalImpulse.y = 0;\n }\n this.vel.addEqual(finalImpulse);\n if (!this.limitDegreeOfFreedom.includes(DegreeOfFreedom.Rotation)) {\n const distanceFromCenter = point.sub(this.globalPos, this._distanceFromCenterScratch);\n this.angularVelocity += this.inverseInertia * distanceFromCenter.cross(impulse);\n }\n }\n /**\n * Apply only linear impulse to the body\n * @param impulse\n */\n applyLinearImpulse(impulse) {\n if (this.collisionType !== _CollisionType__WEBPACK_IMPORTED_MODULE_6__.CollisionType.Active) {\n return; // only active objects participate in the simulation\n }\n const finalImpulse = impulse.scale(this.inverseMass);\n if (this.limitDegreeOfFreedom.includes(DegreeOfFreedom.X)) {\n finalImpulse.x = 0;\n }\n if (this.limitDegreeOfFreedom.includes(DegreeOfFreedom.Y)) {\n finalImpulse.y = 0;\n }\n this.vel = this.vel.add(finalImpulse);\n }\n /**\n * Apply only angular impulse to the body\n * @param point\n * @param impulse\n */\n applyAngularImpulse(point, impulse) {\n if (this.collisionType !== _CollisionType__WEBPACK_IMPORTED_MODULE_6__.CollisionType.Active) {\n return; // only active objects participate in the simulation\n }\n if (!this.limitDegreeOfFreedom.includes(DegreeOfFreedom.Rotation)) {\n const distanceFromCenter = point.sub(this.globalPos);\n this.angularVelocity += this.inverseInertia * distanceFromCenter.cross(impulse);\n }\n }\n /**\n * Sets the old versions of pos, vel, acc, and scale.\n */\n captureOldTransform() {\n // Capture old values before integration step updates them\n this.__oldTransformCaptured = true;\n const tx = this.transform.get();\n tx.clone(this.oldTransform);\n this.oldTransform.parent = tx.parent; // also grab parent\n this.oldVel.setTo(this.vel.x, this.vel.y);\n this.oldAcc.setTo(this.acc.x, this.acc.y);\n this.oldGlobalPos.setTo(this.globalPos.x, this.globalPos.y);\n }\n clone() {\n const component = super.clone();\n return component;\n }\n}\nBodyComponent._ID = 0;\nBodyComponent._DEFAULT_CONFIG = {\n ...(0,_PhysicsConfig__WEBPACK_IMPORTED_MODULE_9__.getDefaultPhysicsConfig)().bodies\n};\n\n\n/***/ }),\n\n/***/ \"./Collision/BoundingBox.ts\":\n/*!**********************************!*\\\n !*** ./Collision/BoundingBox.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BoundingBox: () => (/* binding */ BoundingBox)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Side__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Side */ \"./Collision/Side.ts\");\n\n\n\n/**\n * Axis Aligned collision primitive for Excalibur.\n */\nclass BoundingBox {\n /**\n * Constructor allows passing of either an object with all coordinate components,\n * or the coordinate components passed separately.\n * @param leftOrOptions Either x coordinate of the left edge or an options object\n * containing the four coordinate components.\n * @param top y coordinate of the top edge\n * @param right x coordinate of the right edge\n * @param bottom y coordinate of the bottom edge\n */\n constructor(leftOrOptions = 0, top = 0, right = 0, bottom = 0) {\n // Cache bounding box point returns\n this._points = [];\n if (typeof leftOrOptions === 'object') {\n this.left = leftOrOptions.left;\n this.top = leftOrOptions.top;\n this.right = leftOrOptions.right;\n this.bottom = leftOrOptions.bottom;\n }\n else if (typeof leftOrOptions === 'number') {\n this.left = leftOrOptions;\n this.top = top;\n this.right = right;\n this.bottom = bottom;\n }\n }\n /**\n * Returns a new instance of {@apilink BoundingBox} that is a copy of the current instance\n */\n clone(dest) {\n const result = dest || new BoundingBox(0, 0, 0, 0);\n result.left = this.left;\n result.right = this.right;\n result.top = this.top;\n result.bottom = this.bottom;\n return result;\n }\n /**\n * Resets the bounds to a zero width/height box\n */\n reset() {\n this.left = 0;\n this.top = 0;\n this.bottom = 0;\n this.right = 0;\n }\n /**\n * Given bounding box A & B, returns the side relative to A when intersection is performed.\n * @param intersection Intersection vector between 2 bounding boxes\n */\n static getSideFromIntersection(intersection) {\n if (!intersection) {\n return _Side__WEBPACK_IMPORTED_MODULE_0__.Side.None;\n }\n if (intersection) {\n if (Math.abs(intersection.x) > Math.abs(intersection.y)) {\n if (intersection.x < 0) {\n return _Side__WEBPACK_IMPORTED_MODULE_0__.Side.Right;\n }\n return _Side__WEBPACK_IMPORTED_MODULE_0__.Side.Left;\n }\n else {\n if (intersection.y < 0) {\n return _Side__WEBPACK_IMPORTED_MODULE_0__.Side.Bottom;\n }\n return _Side__WEBPACK_IMPORTED_MODULE_0__.Side.Top;\n }\n }\n return _Side__WEBPACK_IMPORTED_MODULE_0__.Side.None;\n }\n static fromPoints(points) {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (let i = 0; i < points.length; i++) {\n if (points[i].x < minX) {\n minX = points[i].x;\n }\n if (points[i].x > maxX) {\n maxX = points[i].x;\n }\n if (points[i].y < minY) {\n minY = points[i].y;\n }\n if (points[i].y > maxY) {\n maxY = points[i].y;\n }\n }\n return new BoundingBox(minX, minY, maxX, maxY);\n }\n /**\n * Creates a bounding box from a width and height\n * @param width\n * @param height\n * @param anchor Default Vector.Half\n * @param pos Default Vector.Zero\n */\n static fromDimension(width, height, anchor = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Half, pos = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero) {\n return new BoundingBox(-width * anchor.x + pos.x, -height * anchor.y + pos.y, width - width * anchor.x + pos.x, height - height * anchor.y + pos.y);\n }\n /**\n * Returns the calculated width of the bounding box\n */\n get width() {\n return this.right - this.left;\n }\n /**\n * Returns the calculated height of the bounding box\n */\n get height() {\n return this.bottom - this.top;\n }\n /**\n * Return whether the bounding box has zero dimensions in height,width or both\n */\n hasZeroDimensions() {\n return this.width === 0 || this.height === 0;\n }\n /**\n * Returns the center of the bounding box\n */\n get center() {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector((this.left + this.right) / 2, (this.top + this.bottom) / 2);\n }\n get topLeft() {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.left, this.top);\n }\n get bottomRight() {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.right, this.bottom);\n }\n get topRight() {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.right, this.top);\n }\n get bottomLeft() {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.left, this.bottom);\n }\n translate(pos) {\n return new BoundingBox(this.left + pos.x, this.top + pos.y, this.right + pos.x, this.bottom + pos.y);\n }\n /**\n * Rotates a bounding box by and angle and around a point, if no point is specified (0, 0) is used by default. The resulting bounding\n * box is also axis-align. This is useful when a new axis-aligned bounding box is needed for rotated geometry.\n */\n rotate(angle, point = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero) {\n const points = this.getPoints().map((p) => p.rotate(angle, point));\n return BoundingBox.fromPoints(points);\n }\n /**\n * Scale a bounding box by a scale factor, optionally provide a point\n * @param scale\n * @param point\n */\n scale(scale, point = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero) {\n const shifted = this.translate(point);\n return new BoundingBox(shifted.left * scale.x, shifted.top * scale.y, shifted.right * scale.x, shifted.bottom * scale.y);\n }\n /**\n * Transform the axis aligned bounding box by a {@apilink Matrix}, producing a new axis aligned bounding box\n * @param matrix\n */\n transform(matrix) {\n // inlined these calculations to not use vectors would speed it up slightly\n // const matFirstColumn = vec(matrix.data[0], matrix.data[1]);\n // const xa = matFirstColumn.scale(this.left);\n const xa1 = matrix.data[0] * this.left;\n const xa2 = matrix.data[1] * this.left;\n // const xb = matFirstColumn.scale(this.right);\n const xb1 = matrix.data[0] * this.right;\n const xb2 = matrix.data[1] * this.right;\n // const matSecondColumn = vec(matrix.data[2], matrix.data[3]);\n // const ya = matSecondColumn.scale(this.top);\n const ya1 = matrix.data[2] * this.top;\n const ya2 = matrix.data[3] * this.top;\n // const yb = matSecondColumn.scale(this.bottom);\n const yb1 = matrix.data[2] * this.bottom;\n const yb2 = matrix.data[3] * this.bottom;\n const matrixPos = matrix.getPosition();\n // const topLeft = Vector.min(xa, xb).add(Vector.min(ya, yb)).add(matrixPos);\n // const bottomRight = Vector.max(xa, xb).add(Vector.max(ya, yb)).add(matrixPos);\n const left = Math.min(xa1, xb1) + Math.min(ya1, yb1) + matrixPos.x;\n const top = Math.min(xa2, xb2) + Math.min(ya2, yb2) + matrixPos.y;\n const right = Math.max(xa1, xb1) + Math.max(ya1, yb1) + matrixPos.x;\n const bottom = Math.max(xa2, xb2) + Math.max(ya2, yb2) + matrixPos.y;\n return new BoundingBox({\n left, //: topLeft.x,\n top, //: topLeft.y,\n right, //: bottomRight.x,\n bottom //: bottomRight.y\n });\n }\n /**\n * Returns the perimeter of the bounding box\n */\n getPerimeter() {\n const wx = this.width;\n const wy = this.height;\n return 2 * (wx + wy);\n }\n /**\n * Returns the world space points that make up the corners of the bounding box as a polygon\n */\n getPoints() {\n if (this._left !== this.left || this._right !== this.right || this._top !== this.top || this._bottom !== this.bottom) {\n this._points.length = 0;\n this._points.push(new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.left, this.top));\n this._points.push(new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.right, this.top));\n this._points.push(new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.right, this.bottom));\n this._points.push(new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.left, this.bottom));\n this._left = this.left;\n this._right = this.right;\n this._top = this.top;\n this._bottom = this.bottom;\n }\n return this._points;\n }\n /**\n * Determines whether a ray intersects with a bounding box\n */\n rayCast(ray, farClipDistance = Infinity) {\n // algorithm from https://tavianator.com/fast-branchless-raybounding-box-intersections/\n let tMin = -Infinity;\n let tMax = +Infinity;\n const xInv = ray.dir.x === 0 ? Number.MAX_VALUE : 1 / ray.dir.x;\n const yInv = ray.dir.y === 0 ? Number.MAX_VALUE : 1 / ray.dir.y;\n const tx1 = (this.left - ray.pos.x) * xInv;\n const tx2 = (this.right - ray.pos.x) * xInv;\n tMin = Math.min(tx1, tx2);\n tMax = Math.max(tx1, tx2);\n const ty1 = (this.top - ray.pos.y) * yInv;\n const ty2 = (this.bottom - ray.pos.y) * yInv;\n tMin = Math.max(tMin, Math.min(ty1, ty2));\n tMax = Math.min(tMax, Math.max(ty1, ty2));\n return tMax >= Math.max(0, tMin) && tMin < farClipDistance;\n }\n rayCastTime(ray, farClipDistance = Infinity) {\n // algorithm from https://tavianator.com/fast-branchless-raybounding-box-intersections/\n let tMin = -Infinity;\n let tMax = +Infinity;\n const xInv = ray.dir.x === 0 ? Number.MAX_VALUE : 1 / ray.dir.x;\n const yInv = ray.dir.y === 0 ? Number.MAX_VALUE : 1 / ray.dir.y;\n const tx1 = (this.left - ray.pos.x) * xInv;\n const tx2 = (this.right - ray.pos.x) * xInv;\n tMin = Math.min(tx1, tx2);\n tMax = Math.max(tx1, tx2);\n const ty1 = (this.top - ray.pos.y) * yInv;\n const ty2 = (this.bottom - ray.pos.y) * yInv;\n tMin = Math.max(tMin, Math.min(ty1, ty2));\n tMax = Math.min(tMax, Math.max(ty1, ty2));\n if (tMax >= Math.max(0, tMin) && tMin < farClipDistance) {\n return tMin;\n }\n return -1;\n }\n contains(val) {\n if (val instanceof _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector) {\n return this.left <= val.x && this.top <= val.y && val.y <= this.bottom && val.x <= this.right;\n }\n else if (val instanceof BoundingBox) {\n return this.left <= val.left && this.top <= val.top && val.bottom <= this.bottom && val.right <= this.right;\n }\n return false;\n }\n /**\n * Combines this bounding box and another together returning a new bounding box\n * @param other The bounding box to combine\n */\n combine(other, dest) {\n const compositeBB = dest || new BoundingBox(0, 0, 0, 0);\n const left = Math.min(this.left, other.left);\n const top = Math.min(this.top, other.top);\n const right = Math.max(this.right, other.right);\n const bottom = Math.max(this.bottom, other.bottom);\n compositeBB.left = left;\n compositeBB.top = top;\n compositeBB.right = right;\n compositeBB.bottom = bottom;\n return compositeBB;\n }\n get dimensions() {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.width, this.height);\n }\n /**\n * Returns true if the bounding boxes overlap.\n * @param other\n * @param epsilon Optionally specify a small epsilon (default 0) as amount of overlap to ignore as overlap.\n * This epsilon is useful in stable collision simulations.\n */\n overlaps(other, epsilon) {\n const e = epsilon || 0;\n if (other.hasZeroDimensions()) {\n return this.contains(other);\n }\n if (this.hasZeroDimensions()) {\n return other.contains(this);\n }\n const totalBoundingBox = this.combine(other);\n return totalBoundingBox.width + e < other.width + this.width && totalBoundingBox.height + e < other.height + this.height;\n }\n /**\n * Test wether this bounding box intersects with another returning\n * the intersection vector that can be used to resolve the collision. If there\n * is no intersection null is returned.\n * @param other Other {@apilink BoundingBox} to test intersection with\n * @returns A Vector in the direction of the current BoundingBox, this <- other\n */\n intersect(other) {\n const totalBoundingBox = this.combine(other);\n // If the total bounding box is less than or equal the sum of the 2 bounds then there is collision\n if (totalBoundingBox.width < other.width + this.width &&\n totalBoundingBox.height < other.height + this.height &&\n !totalBoundingBox.dimensions.equals(other.dimensions) &&\n !totalBoundingBox.dimensions.equals(this.dimensions)) {\n // collision\n let overlapX = 0;\n // right edge is between the other's left and right edge\n /**\n * +-this-+\n * | |\n * | +-other-+\n * +----|-+ |\n * | |\n * +-------+\n * <---\n * ^ overlap\n */\n if (this.right >= other.left && this.right <= other.right) {\n overlapX = other.left - this.right;\n // right edge is past the other's right edge\n /**\n * +-other-+\n * | |\n * | +-this-+\n * +----|--+ |\n * | |\n * +------+\n * --->\n * ^ overlap\n */\n }\n else {\n overlapX = other.right - this.left;\n }\n let overlapY = 0;\n // top edge is between the other's top and bottom edge\n /**\n * +-other-+\n * | |\n * | +-this-+ | <- overlap\n * +----|--+ | |\n * | | \\ /\n * +------+ '\n */\n if (this.top <= other.bottom && this.top >= other.top) {\n overlapY = other.bottom - this.top;\n // top edge is above the other top edge\n /**\n * +-this-+ .\n * | | / \\\n * | +-other-+ | <- overlap\n * +----|-+ | |\n * | |\n * +-------+\n */\n }\n else {\n overlapY = other.top - this.bottom;\n }\n if (Math.abs(overlapX) < Math.abs(overlapY)) {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(overlapX, 0);\n }\n else {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(0, overlapY);\n }\n // Case of total containment of one bounding box by another\n }\n else if (totalBoundingBox.dimensions.equals(other.dimensions) || totalBoundingBox.dimensions.equals(this.dimensions)) {\n let overlapX = 0;\n // this is wider than the other\n if (this.width - other.width >= 0) {\n // This right edge is closest to the others right edge\n if (this.right - other.right <= other.left - this.left) {\n overlapX = other.left - this.right;\n // This left edge is closest to the others left edge\n }\n else {\n overlapX = other.right - this.left;\n }\n // other is wider than this\n }\n else {\n // This right edge is closest to the others right edge\n if (other.right - this.right <= this.left - other.left) {\n overlapX = this.left - other.right;\n // This left edge is closest to the others left edge\n }\n else {\n overlapX = this.right - other.left;\n }\n }\n let overlapY = 0;\n // this is taller than other\n if (this.height - other.height >= 0) {\n // The bottom edge is closest to the others bottom edge\n if (this.bottom - other.bottom <= other.top - this.top) {\n overlapY = other.top - this.bottom;\n }\n else {\n overlapY = other.bottom - this.top;\n }\n // other is taller than this\n }\n else {\n // The bottom edge is closest to the others bottom edge\n if (other.bottom - this.bottom <= this.top - other.top) {\n overlapY = this.top - other.bottom;\n }\n else {\n overlapY = this.bottom - other.top;\n }\n }\n if (Math.abs(overlapX) < Math.abs(overlapY)) {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(overlapX, 0);\n }\n else {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(0, overlapY);\n }\n }\n else {\n return null;\n }\n }\n /**\n * Test whether the bounding box has intersected with another bounding box, returns the side of the current bb that intersected.\n * @param bb The other actor to test\n */\n intersectWithSide(bb) {\n const intersect = this.intersect(bb);\n return BoundingBox.getSideFromIntersection(intersect);\n }\n /**\n * Draw a debug bounding box\n * @param ex\n * @param color\n */\n draw(ex, color = _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Yellow) {\n ex.debug.drawRect(this.left, this.top, this.width, this.height, { color });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/ColliderComponent.ts\":\n/*!****************************************!*\\\n !*** ./Collision/ColliderComponent.ts ***!\n \\****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ColliderComponent: () => (/* binding */ ColliderComponent)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Component */ \"./EntityComponentSystem/Component.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _Util_Observable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Util/Observable */ \"./Util/Observable.ts\");\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Colliders/CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var _Colliders_Shape__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Colliders/Shape */ \"./Collision/Colliders/Shape.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Actor__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Actor */ \"./Actor.ts\");\n\n\n\n\n\n\n\n\n\n\nclass ColliderComponent extends _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor(collider) {\n super();\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_1__.EventEmitter();\n /**\n * Observable that notifies when a collider is added to the body\n */\n this.$colliderAdded = new _Util_Observable__WEBPACK_IMPORTED_MODULE_2__.Observable();\n /**\n * Observable that notifies when a collider is removed from the body\n */\n this.$colliderRemoved = new _Util_Observable__WEBPACK_IMPORTED_MODULE_2__.Observable();\n this._collidersToRemove = [];\n this.set(collider);\n }\n /**\n * Get the current collider geometry\n */\n get() {\n return this._collider;\n }\n /**\n * Set the collider geometry\n * @param collider\n * @returns the collider you set\n */\n set(collider) {\n this.clear();\n if (collider) {\n this._collider = collider;\n this._collider.owner = this.owner;\n collider.events.pipe(this.events);\n this.$colliderAdded.notifyAll(collider);\n this.update();\n }\n return collider;\n }\n /**\n * Remove collider geometry from collider component\n */\n clear() {\n if (this._collider) {\n this._collidersToRemove.push(this._collider);\n this._collider = null;\n }\n }\n processColliderRemoval() {\n for (const collider of this._collidersToRemove) {\n collider.events.unpipe(this.events);\n this.$colliderRemoved.notifyAll(collider);\n collider.owner = null;\n }\n }\n clone() {\n const clone = new ColliderComponent(this._collider.clone());\n return clone;\n }\n /**\n * Return world space bounds\n */\n get bounds() {\n var _a, _b;\n return (_b = (_a = this._collider) === null || _a === void 0 ? void 0 : _a.bounds) !== null && _b !== void 0 ? _b : new _BoundingBox__WEBPACK_IMPORTED_MODULE_3__.BoundingBox();\n }\n /**\n * Return local space bounds\n */\n get localBounds() {\n var _a, _b;\n return (_b = (_a = this._collider) === null || _a === void 0 ? void 0 : _a.localBounds) !== null && _b !== void 0 ? _b : new _BoundingBox__WEBPACK_IMPORTED_MODULE_3__.BoundingBox();\n }\n /**\n * Update the collider's transformed geometry\n */\n update() {\n var _a;\n const tx = (_a = this.owner) === null || _a === void 0 ? void 0 : _a.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__.TransformComponent);\n if (this._collider) {\n this._collider.owner = this.owner;\n if (tx) {\n this._collider.update(tx.get());\n }\n }\n }\n /**\n * Collide component with another\n * @param other\n */\n collide(other) {\n let colliderA = this._collider;\n let colliderB = other._collider;\n if (!colliderA || !colliderB) {\n return [];\n }\n // If we have a composite left hand side :(\n // Might bite us, but to avoid updating all the handlers make composite always left side\n let flipped = false;\n if (colliderB instanceof _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_5__.CompositeCollider) {\n colliderA = colliderB;\n colliderB = this._collider;\n flipped = true;\n }\n if (this._collider) {\n const contacts = colliderA.collide(colliderB);\n if (contacts) {\n if (flipped) {\n contacts.forEach((contact) => {\n contact.mtv = contact.mtv.negate();\n contact.normal = contact.normal.negate();\n contact.tangent = contact.normal.perpendicular();\n contact.colliderA = this._collider;\n contact.colliderB = other._collider;\n });\n }\n return contacts;\n }\n return [];\n }\n return [];\n }\n onAdd(entity) {\n if (this._collider) {\n this.update();\n }\n // Wire up the collider events to the owning entity\n this.events.on('precollision', (evt) => {\n const precollision = evt;\n entity.events.emit('precollision', new _Events__WEBPACK_IMPORTED_MODULE_6__.PreCollisionEvent(precollision.self, precollision.other, precollision.side, precollision.intersection, precollision.contact));\n if (entity instanceof _Actor__WEBPACK_IMPORTED_MODULE_7__.Actor) {\n entity.onPreCollisionResolve(precollision.self, precollision.other, precollision.side, precollision.contact);\n }\n });\n this.events.on('postcollision', (evt) => {\n const postcollision = evt;\n entity.events.emit('postcollision', new _Events__WEBPACK_IMPORTED_MODULE_6__.PostCollisionEvent(postcollision.self, postcollision.other, postcollision.side, postcollision.intersection, postcollision.contact));\n if (entity instanceof _Actor__WEBPACK_IMPORTED_MODULE_7__.Actor) {\n entity.onPostCollisionResolve(postcollision.self, postcollision.other, postcollision.side, postcollision.contact);\n }\n });\n this.events.on('collisionstart', (evt) => {\n const start = evt;\n entity.events.emit('collisionstart', new _Events__WEBPACK_IMPORTED_MODULE_6__.CollisionStartEvent(start.self, start.other, start.side, start.contact));\n if (entity instanceof _Actor__WEBPACK_IMPORTED_MODULE_7__.Actor) {\n entity.onCollisionStart(start.self, start.other, start.side, start.contact);\n }\n });\n this.events.on('collisionend', (evt) => {\n const end = evt;\n entity.events.emit('collisionend', new _Events__WEBPACK_IMPORTED_MODULE_6__.CollisionEndEvent(end.self, end.other, end.side, end.lastContact));\n if (entity instanceof _Actor__WEBPACK_IMPORTED_MODULE_7__.Actor) {\n entity.onCollisionEnd(end.self, end.other, end.side, end.lastContact);\n }\n });\n }\n onRemove() {\n this.events.clear();\n this.$colliderRemoved.notifyAll(this._collider);\n }\n /**\n * Sets up a box geometry based on the current bounds of the associated actor of this physics body.\n *\n * If no width/height are specified the body will attempt to use the associated actor's width/height.\n *\n * By default, the box is center is at (0, 0) which means it is centered around the actors anchor.\n */\n useBoxCollider(width, height, anchor = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Half, center = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Zero) {\n const collider = _Colliders_Shape__WEBPACK_IMPORTED_MODULE_9__.Shape.Box(width, height, anchor, center);\n return this.set(collider);\n }\n /**\n * Sets up a {@apilink PolygonCollider | `polygon`} collision geometry based on a list of of points relative\n * to the anchor of the associated actor\n * of this physics body.\n *\n * Only [convex polygon](https://en.wikipedia.org/wiki/Convex_polygon) definitions are supported.\n *\n * By default, the box is center is at (0, 0) which means it is centered around the actors anchor.\n */\n usePolygonCollider(points, center = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Zero) {\n const poly = _Colliders_Shape__WEBPACK_IMPORTED_MODULE_9__.Shape.Polygon(points, center);\n return this.set(poly);\n }\n /**\n * Sets up a {@apilink Circle | `circle collision geometry`} as the only collider with a specified radius in pixels.\n *\n * By default, the box is center is at (0, 0) which means it is centered around the actors anchor.\n */\n useCircleCollider(radius, center = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Zero) {\n const collider = _Colliders_Shape__WEBPACK_IMPORTED_MODULE_9__.Shape.Circle(radius, center);\n return this.set(collider);\n }\n /**\n * Sets up an {@apilink Edge | `edge collision geometry`} with a start point and an end point relative to the anchor of the associated actor\n * of this physics body.\n *\n * By default, the box is center is at (0, 0) which means it is centered around the actors anchor.\n */\n useEdgeCollider(begin, end) {\n const collider = _Colliders_Shape__WEBPACK_IMPORTED_MODULE_9__.Shape.Edge(begin, end);\n return this.set(collider);\n }\n /**\n * Setups up a {@apilink CompositeCollider} which can define any arbitrary set of excalibur colliders\n * @param colliders\n */\n useCompositeCollider(colliders) {\n return this.set(new _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_5__.CompositeCollider(colliders));\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/CircleCollider.ts\":\n/*!***********************************************!*\\\n !*** ./Collision/Colliders/CircleCollider.ts ***!\n \\***********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CircleCollider: () => (/* binding */ CircleCollider)\n/* harmony export */ });\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./CollisionJumpTable */ \"./Collision/Colliders/CollisionJumpTable.ts\");\n/* harmony import */ var _PolygonCollider__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./PolygonCollider */ \"./Collision/Colliders/PolygonCollider.ts\");\n/* harmony import */ var _EdgeCollider__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./EdgeCollider */ \"./Collision/Colliders/EdgeCollider.ts\");\n/* harmony import */ var _Math_projection__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../Math/projection */ \"./Math/projection.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../Color */ \"./Color.ts\");\n/* harmony import */ var _Collider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Collider */ \"./Collision/Colliders/Collider.ts\");\n/* harmony import */ var _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./ClosestLineJumpTable */ \"./Collision/Colliders/ClosestLineJumpTable.ts\");\n/* harmony import */ var _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math/affine-matrix */ \"./Math/affine-matrix.ts\");\n/* harmony import */ var _Index__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Index */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math/util */ \"./Math/util.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * This is a circle collider for the excalibur rigid body physics simulation\n */\nclass CircleCollider extends _Collider__WEBPACK_IMPORTED_MODULE_0__.Collider {\n get worldPos() {\n return this._globalMatrix.getPosition();\n }\n /**\n * Get the radius of the circle\n */\n get radius() {\n var _a;\n if (this._radius) {\n return this._radius;\n }\n const tx = this._transform;\n const scale = (_a = tx === null || tx === void 0 ? void 0 : tx.globalScale) !== null && _a !== void 0 ? _a : _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.One;\n // This is a trade off, the alternative is retooling circles to support ellipse collisions\n return (this._radius = this._naturalRadius * Math.min(scale.x, scale.y));\n }\n /**\n * Set the radius of the circle\n */\n set radius(val) {\n var _a;\n const tx = this._transform;\n const scale = (_a = tx === null || tx === void 0 ? void 0 : tx.globalScale) !== null && _a !== void 0 ? _a : _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.One;\n // This is a trade off, the alternative is retooling circles to support ellipse collisions\n this._naturalRadius = val / Math.min(scale.x, scale.y);\n this._localBoundsDirty = true;\n this._radius = val;\n }\n constructor(options) {\n super();\n /**\n * Position of the circle relative to the collider, by default (0, 0).\n */\n this.offset = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n this._globalMatrix = _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_2__.AffineMatrix.identity();\n this._localBoundsDirty = true;\n this.offset = options.offset || _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n this.radius = options.radius || 0;\n this._globalMatrix.translate(this.offset.x, this.offset.y);\n }\n /**\n * Returns a clone of this shape, not associated with any collider\n */\n clone() {\n return new CircleCollider({\n offset: this.offset.clone(),\n radius: this.radius\n });\n }\n /**\n * Get the center of the collider in world coordinates\n */\n get center() {\n return this._globalMatrix.getPosition();\n }\n /**\n * Tests if a point is contained in this collider\n */\n contains(point) {\n var _a, _b;\n const pos = (_b = (_a = this._transform) === null || _a === void 0 ? void 0 : _a.pos) !== null && _b !== void 0 ? _b : this.offset;\n const distance = pos.distance(point);\n if (distance <= this.radius) {\n return true;\n }\n return false;\n }\n /**\n * Casts a ray at the Circle collider and returns the nearest point of collision\n * @param ray\n */\n rayCast(ray, max = Infinity) {\n var _a, _b;\n // https://en.wikipedia.org/wiki/Intersection_(geometry)#A_line_and_a_circle\n const c = this.center;\n const dir = ray.dir;\n const orig = ray.pos;\n const u = c.sub(orig);\n const u1 = dir.scale(u.dot(dir));\n const u2 = u.sub(u1);\n const d = u2.magnitude;\n if (d > this.radius) {\n return null;\n }\n else {\n // tangent case\n let toi = 0;\n if ((0,_Math_util__WEBPACK_IMPORTED_MODULE_3__.approximatelyEqual)(d, this.radius, 0.0001)) {\n toi = -dir.dot(orig.sub(c));\n if (toi > 0 && toi < max) {\n const point = ray.getPoint(toi);\n return {\n point,\n normal: point.sub(c).normalize(),\n collider: this,\n body: (_a = this.owner) === null || _a === void 0 ? void 0 : _a.get(_Index__WEBPACK_IMPORTED_MODULE_4__.BodyComponent),\n distance: toi\n };\n }\n return null;\n }\n else {\n // two point\n const discriminant = Math.sqrt(Math.pow(dir.dot(orig.sub(c)), 2) - Math.pow(orig.sub(c).distance(), 2) + Math.pow(this.radius, 2));\n const toi1 = -dir.dot(orig.sub(c)) + discriminant;\n const toi2 = -dir.dot(orig.sub(c)) - discriminant;\n const positiveToi = [];\n if (toi1 >= 0) {\n positiveToi.push(toi1);\n }\n if (toi2 >= 0) {\n positiveToi.push(toi2);\n }\n const minToi = Math.min(...positiveToi);\n if (minToi <= max) {\n const point = ray.getPoint(minToi);\n return {\n point,\n normal: point.sub(c).normalize(),\n collider: this,\n body: (_b = this.owner) === null || _b === void 0 ? void 0 : _b.get(_Index__WEBPACK_IMPORTED_MODULE_4__.BodyComponent),\n distance: minToi\n };\n }\n return null;\n }\n }\n }\n getClosestLineBetween(shape) {\n if (shape instanceof CircleCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_5__.ClosestLineJumpTable.CircleCircleClosestLine(this, shape);\n }\n else if (shape instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_6__.PolygonCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_5__.ClosestLineJumpTable.PolygonCircleClosestLine(shape, this).flip();\n }\n else if (shape instanceof _EdgeCollider__WEBPACK_IMPORTED_MODULE_7__.EdgeCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_5__.ClosestLineJumpTable.CircleEdgeClosestLine(this, shape).flip();\n }\n else {\n throw new Error(`Polygon could not collide with unknown CollisionShape ${typeof shape}`);\n }\n }\n /**\n * @inheritdoc\n */\n collide(collider) {\n if (collider instanceof CircleCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_8__.CollisionJumpTable.CollideCircleCircle(this, collider);\n }\n else if (collider instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_6__.PolygonCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_8__.CollisionJumpTable.CollideCirclePolygon(this, collider);\n }\n else if (collider instanceof _EdgeCollider__WEBPACK_IMPORTED_MODULE_7__.EdgeCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_8__.CollisionJumpTable.CollideCircleEdge(this, collider);\n }\n else {\n throw new Error(`Circle could not collide with unknown CollisionShape ${typeof collider}`);\n }\n }\n /**\n * Find the point on the collider furthest in the direction specified\n */\n getFurthestPoint(direction) {\n return this.center.add(direction.normalize().scale(this.radius));\n }\n /**\n * Find the local point on the shape in the direction specified\n * @param direction\n */\n getFurthestLocalPoint(direction) {\n const dir = direction.normalize();\n return dir.scale(this.radius);\n }\n /**\n * Get the axis aligned bounding box for the circle collider in world coordinates\n */\n get bounds() {\n return this.localBounds.transform(this._globalMatrix);\n }\n /**\n * Get the axis aligned bounding box for the circle collider in local coordinates\n */\n get localBounds() {\n if (this._localBoundsDirty) {\n this._localBounds = new _BoundingBox__WEBPACK_IMPORTED_MODULE_9__.BoundingBox(-this._naturalRadius, -this._naturalRadius, +this._naturalRadius, +this._naturalRadius);\n this._localBoundsDirty = false;\n }\n return this._localBounds;\n }\n /**\n * Get axis not implemented on circles, since there are infinite axis in a circle\n */\n get axes() {\n return [];\n }\n /**\n * Returns the moment of inertia of a circle given it's mass\n * https://en.wikipedia.org/wiki/List_of_moments_of_inertia\n */\n getInertia(mass) {\n return (mass * this.radius * this.radius) / 2;\n }\n /* istanbul ignore next */\n update(transform) {\n var _a;\n this._transform = transform;\n const globalMat = (_a = transform.matrix) !== null && _a !== void 0 ? _a : this._globalMatrix;\n globalMat.clone(this._globalMatrix);\n this._globalMatrix.translate(this.offset.x, this.offset.y);\n this._radius = undefined;\n }\n /**\n * Project the circle along a specified axis\n */\n project(axis) {\n const scalars = [];\n const point = this.center;\n const dotProduct = point.dot(axis);\n scalars.push(dotProduct);\n scalars.push(dotProduct + this.radius);\n scalars.push(dotProduct - this.radius);\n return new _Math_projection__WEBPACK_IMPORTED_MODULE_10__.Projection(Math.min.apply(Math, scalars), Math.max.apply(Math, scalars));\n }\n debug(ex, color, options) {\n var _a, _b, _c, _d;\n const { lineWidth } = { ...{ lineWidth: 1 }, ...options };\n const tx = this._transform;\n const scale = (_a = tx === null || tx === void 0 ? void 0 : tx.globalScale) !== null && _a !== void 0 ? _a : _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.One;\n const rotation = (_b = tx === null || tx === void 0 ? void 0 : tx.globalRotation) !== null && _b !== void 0 ? _b : 0;\n const pos = (_c = tx === null || tx === void 0 ? void 0 : tx.globalPos) !== null && _c !== void 0 ? _c : _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n ex.save();\n ex.translate(pos.x, pos.y);\n ex.rotate(rotation);\n ex.scale(scale.x, scale.y);\n ex.drawCircle((_d = this.offset) !== null && _d !== void 0 ? _d : _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero, this._naturalRadius, _Color__WEBPACK_IMPORTED_MODULE_11__.Color.Transparent, color, lineWidth);\n ex.restore();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/ClosestLineJumpTable.ts\":\n/*!*****************************************************!*\\\n !*** ./Collision/Colliders/ClosestLineJumpTable.ts ***!\n \\*****************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ClosestLineJumpTable: () => (/* binding */ ClosestLineJumpTable)\n/* harmony export */ });\n/* harmony import */ var _Math_line_segment__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/line-segment */ \"./Math/line-segment.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math_ray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math/ray */ \"./Math/ray.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/util */ \"./Math/util.ts\");\n\n\n\n\n/**\n * Finds the closest line segment between two given line segments.\n */\nfunction ClosestLine(line1, line2) {\n // https://math.stackexchange.com/questions/1993953/closest-points-between-2-lines-in-2d\n const EPSILON = 1e-9;\n const line1Dir = line1.dir();\n const line2Dir = line2.dir();\n const d1Squared = line1Dir.dot(line1Dir);\n const d2Squared = line2Dir.dot(line2Dir);\n if (d1Squared < EPSILON && d2Squared < EPSILON) {\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_0__.LineSegment(line1.begin, line2.begin);\n }\n if (d1Squared < EPSILON) {\n const t = (0,_Math_util__WEBPACK_IMPORTED_MODULE_1__.clamp)(line2Dir.dot(line1.begin.sub(line2.begin)) / d2Squared, 0, 1);\n const closestPoint = line2.begin.add(line2Dir.scale(t));\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_0__.LineSegment(line1.begin, closestPoint);\n }\n if (d2Squared < EPSILON) {\n const t = (0,_Math_util__WEBPACK_IMPORTED_MODULE_1__.clamp)(line1Dir.dot(line2.begin.sub(line1.begin)) / d1Squared, 0, 1);\n const closestPoint = line1.begin.add(line1Dir.scale(t));\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_0__.LineSegment(closestPoint, line2.begin);\n }\n const r = line1.begin.sub(line2.begin);\n const a = d1Squared;\n const e = d2Squared;\n const f = line2Dir.dot(r);\n const denom = a * e - Math.pow(line1Dir.dot(line2Dir), 2);\n let s = 0;\n let t = 0;\n if (Math.abs(denom) > EPSILON) {\n s = (0,_Math_util__WEBPACK_IMPORTED_MODULE_1__.clamp)((line1Dir.dot(line2Dir) * f - e * line1Dir.dot(r)) / denom, 0, 1);\n }\n else {\n // lines are parallel\n s = (0,_Math_util__WEBPACK_IMPORTED_MODULE_1__.clamp)(line1Dir.dot(r) / a, 0, 1);\n }\n if (Math.abs(e) > EPSILON) {\n t = (0,_Math_util__WEBPACK_IMPORTED_MODULE_1__.clamp)((line1Dir.dot(line2Dir) * s + f) / e, 0, 1);\n }\n else {\n // line2 is a degenerate point\n t = 0;\n }\n const closestPointOnLine1 = line1.begin.add(line1Dir.scale(s));\n const closestPointOnLine2 = line2.begin.add(line2Dir.scale(t));\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_0__.LineSegment(closestPointOnLine1, closestPointOnLine2);\n}\nconst ClosestLineJumpTable = {\n PolygonPolygonClosestLine(polygonA, polygonB) {\n const aSides = polygonA.getSides();\n const bSides = polygonB.getSides();\n let minDistance = Number.MAX_VALUE;\n let closestLine = null;\n for (let i = 0; i < aSides.length; i++) {\n for (let j = 0; j < bSides.length; j++) {\n const line = ClosestLine(aSides[i], bSides[j]);\n const distance = line.getLength();\n if (distance < minDistance) {\n minDistance = distance;\n closestLine = line;\n }\n }\n }\n return closestLine;\n },\n PolygonEdgeClosestLine(polygon, edge) {\n // Find the 2 closest faces on each polygon\n const otherWorldPos = edge.worldPos;\n const otherDirection = otherWorldPos.sub(polygon.worldPos);\n const rayTowardsOther = new _Math_ray__WEBPACK_IMPORTED_MODULE_2__.Ray(polygon.worldPos, otherDirection);\n const thisPoint = polygon.rayCast(rayTowardsOther).point.add(rayTowardsOther.dir.scale(0.1));\n const thisFace = polygon.getClosestFace(thisPoint);\n // L1 = P(s) = p0 + s * u, where s is time and p0 is the start of the line\n // L2 = Q(t) = q0 + t * v, where t is time and q0 is the start of the line\n const edgeLine = edge.asLine();\n return ClosestLine(thisFace.face, edgeLine);\n },\n PolygonCircleClosestLine(polygon, circle) {\n // https://math.stackexchange.com/questions/1919177/how-to-find-point-on-line-closest-to-sphere\n // Find the 2 closest faces on each polygon\n const otherWorldPos = circle.worldPos;\n const otherDirection = otherWorldPos.sub(polygon.worldPos);\n const rayTowardsOther = new _Math_ray__WEBPACK_IMPORTED_MODULE_2__.Ray(polygon.worldPos, otherDirection.normalize());\n const thisPoint = polygon.rayCast(rayTowardsOther).point.add(rayTowardsOther.dir.scale(0.1));\n const thisFace = polygon.getClosestFace(thisPoint);\n // L1 = P(s) = p0 + s * u, where s is time and p0 is the start of the line\n const p0 = thisFace.face.begin;\n const u = thisFace.face.getEdge();\n // Time of minimum distance\n let t = (u.x * (otherWorldPos.x - p0.x) + u.y * (otherWorldPos.y - p0.y)) / (u.x * u.x + u.y * u.y);\n // If time of minimum is past the edge clamp\n if (t > 1) {\n t = 1;\n }\n else if (t < 0) {\n t = 0;\n }\n // Minimum distance\n const d = Math.sqrt(Math.pow(p0.x + u.x * t - otherWorldPos.x, 2) + Math.pow(p0.y + u.y * t - otherWorldPos.y, 2)) - circle.radius;\n const circlex = ((p0.x + u.x * t - otherWorldPos.x) * circle.radius) / (circle.radius + d);\n const circley = ((p0.y + u.y * t - otherWorldPos.y) * circle.radius) / (circle.radius + d);\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_0__.LineSegment(u.scale(t).add(p0), new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(otherWorldPos.x + circlex, otherWorldPos.y + circley));\n },\n CircleCircleClosestLine(circleA, circleB) {\n // Find the 2 closest faces on each polygon\n const otherWorldPos = circleB.worldPos;\n const otherDirection = otherWorldPos.sub(circleA.worldPos);\n const thisWorldPos = circleA.worldPos;\n const thisDirection = thisWorldPos.sub(circleB.worldPos);\n const rayTowardsOther = new _Math_ray__WEBPACK_IMPORTED_MODULE_2__.Ray(circleA.worldPos, otherDirection);\n const rayTowardsThis = new _Math_ray__WEBPACK_IMPORTED_MODULE_2__.Ray(circleB.worldPos, thisDirection);\n const thisPoint = circleA.rayCast(rayTowardsOther);\n const otherPoint = circleB.rayCast(rayTowardsThis);\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_0__.LineSegment(thisPoint.point, otherPoint.point);\n },\n CircleEdgeClosestLine(circle, edge) {\n // https://math.stackexchange.com/questions/1919177/how-to-find-point-on-line-closest-to-sphere\n const circleWorldPos = circle.worldPos;\n // L1 = P(s) = p0 + s * u, where s is time and p0 is the start of the line\n const edgeLine = edge.asLine();\n const edgeStart = edgeLine.begin;\n const edgeVector = edgeLine.getEdge();\n const p0 = edgeStart;\n const u = edgeVector;\n // Time of minimum distance\n let t = (u.x * (circleWorldPos.x - p0.x) + u.y * (circleWorldPos.y - p0.y)) / (u.x * u.x + u.y * u.y);\n // If time of minimum is past the edge clamp to edge\n if (t > 1) {\n t = 1;\n }\n else if (t < 0) {\n t = 0;\n }\n // Minimum distance\n const d = Math.sqrt(Math.pow(p0.x + u.x * t - circleWorldPos.x, 2) + Math.pow(p0.y + u.y * t - circleWorldPos.y, 2)) - circle.radius;\n const circlex = ((p0.x + u.x * t - circleWorldPos.x) * circle.radius) / (circle.radius + d);\n const circley = ((p0.y + u.y * t - circleWorldPos.y) * circle.radius) / (circle.radius + d);\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_0__.LineSegment(u.scale(t).add(p0), new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(circleWorldPos.x + circlex, circleWorldPos.y + circley));\n },\n EdgeEdgeClosestLine(edgeA, edgeB) {\n // L1 = P(s) = p0 + s * u, where s is time and p0 is the start of the line\n const edgeLineA = edgeA.asLine();\n // L2 = Q(t) = q0 + t * v, where t is time and q0 is the start of the line\n const edgeLineB = edgeB.asLine();\n return ClosestLine(edgeLineA, edgeLineB);\n }\n};\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/Collider.ts\":\n/*!*****************************************!*\\\n !*** ./Collision/Colliders/Collider.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Collider: () => (/* binding */ Collider)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Id__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Id */ \"./Id.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n/**\n * A collision collider specifies the geometry that can detect when other collision colliders intersect\n * for the purposes of colliding 2 objects in excalibur.\n */\nclass Collider {\n constructor() {\n this.id = (0,_Id__WEBPACK_IMPORTED_MODULE_0__.createId)('collider', Collider._ID++);\n /**\n * Composite collider if any this collider is attached to\n *\n * **WARNING** do not tamper with this property\n */\n this.composite = null;\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_1__.EventEmitter();\n /**\n * Pixel offset of the collision collider relative to the collider, by default (0, 0) meaning the collider is positioned\n * on top of the collider.\n */\n this.offset = _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero;\n }\n /**\n * Returns a boolean indicating whether this body collided with\n * or was in stationary contact with\n * the body of the other {@apilink Collider}\n */\n touching(other) {\n const contact = this.collide(other);\n if (contact) {\n return true;\n }\n return false;\n }\n}\nCollider._ID = 0;\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/CollisionJumpTable.ts\":\n/*!***************************************************!*\\\n !*** ./Collision/Colliders/CollisionJumpTable.ts ***!\n \\***************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CollisionJumpTable: () => (/* binding */ CollisionJumpTable)\n/* harmony export */ });\n/* harmony import */ var _CircleCollider__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./CircleCollider */ \"./Collision/Colliders/CircleCollider.ts\");\n/* harmony import */ var _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Detection/CollisionContact */ \"./Collision/Detection/CollisionContact.ts\");\n/* harmony import */ var _PolygonCollider__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./PolygonCollider */ \"./Collision/Colliders/PolygonCollider.ts\");\n/* harmony import */ var _EdgeCollider__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./EdgeCollider */ \"./Collision/Colliders/EdgeCollider.ts\");\n/* harmony import */ var _SeparatingAxis__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./SeparatingAxis */ \"./Collision/Colliders/SeparatingAxis.ts\");\n/* harmony import */ var _Math_line_segment__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../Math/line-segment */ \"./Math/line-segment.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../EntityComponentSystem */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Detection_Pair__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Detection/Pair */ \"./Collision/Detection/Pair.ts\");\n/* harmony import */ var _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/affine-matrix */ \"./Math/affine-matrix.ts\");\n\n\n\n\n\n\n\n\n\n\nconst ScratchZero = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero; // TODO constant vector\nconst ScratchNormal = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero; // TODO constant vector\nconst ScratchMatrix = _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_1__.AffineMatrix.identity();\nconst CollisionJumpTable = {\n CollideCircleCircle(circleA, circleB) {\n const circleAPos = circleA.worldPos;\n const circleBPos = circleB.worldPos;\n const combinedRadius = circleA.radius + circleB.radius;\n const distance = circleAPos.distance(circleBPos);\n if (distance > combinedRadius) {\n return [];\n }\n // negative means overlap\n const separation = combinedRadius - distance;\n // Normal points from A -> B\n const normal = circleBPos.sub(circleAPos).normalize();\n const tangent = normal.perpendicular();\n const mvt = normal.scale(separation);\n const point = circleA.getFurthestPoint(normal);\n const local = circleA.getFurthestLocalPoint(normal);\n const info = {\n collider: circleA,\n separation,\n axis: normal,\n point: point\n };\n return [new _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_2__.CollisionContact(circleA, circleB, mvt, normal, tangent, [point], [local], info)];\n },\n CollideCirclePolygon(circle, polygon) {\n var _a, _b;\n let minAxis = _SeparatingAxis__WEBPACK_IMPORTED_MODULE_3__.SeparatingAxis.findCirclePolygonSeparation(circle, polygon);\n if (!minAxis) {\n return [];\n }\n // make sure that the minAxis is pointing away from circle\n const sameDir = minAxis.dot(polygon.center.sub(circle.center));\n minAxis = sameDir < 0 ? minAxis.negate() : minAxis;\n const point = circle.getFurthestPoint(minAxis);\n const xf = (_b = (_a = circle.owner) === null || _a === void 0 ? void 0 : _a.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__.TransformComponent)) !== null && _b !== void 0 ? _b : new _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__.TransformComponent();\n const local = xf.applyInverse(point);\n const normal = minAxis.normalize();\n const info = {\n collider: circle,\n separation: -minAxis.magnitude,\n axis: normal,\n point: point,\n localPoint: local,\n side: polygon.findSide(normal.negate()),\n localSide: polygon.findLocalSide(normal.negate())\n };\n return [new _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_2__.CollisionContact(circle, polygon, minAxis, normal, normal.perpendicular(), [point], [local], info)];\n },\n CollideCircleEdge(circle, edge) {\n // TODO not sure this actually abides by local/world collisions\n // Are edge.begin and edge.end local space or world space? I think they should be local\n // center of the circle in world pos\n const cc = circle.center;\n // vector in the direction of the edge\n const edgeWorld = edge.asLine();\n const e = edgeWorld.end.sub(edgeWorld.begin);\n // amount of overlap with the circle's center along the edge direction\n const u = e.dot(edgeWorld.end.sub(cc));\n const v = e.dot(cc.sub(edgeWorld.begin));\n const side = edge.asLine();\n const localSide = edge.asLocalLine();\n // Potential region A collision (circle is on the left side of the edge, before the beginning)\n if (v <= 0) {\n const da = edgeWorld.begin.sub(cc);\n const dda = da.dot(da); // quick and dirty way of calc'n distance in r^2 terms saves some sqrts\n // save some sqrts\n if (dda > circle.radius * circle.radius) {\n return []; // no collision\n }\n const normal = da.normalize();\n const separation = circle.radius - Math.sqrt(dda);\n const info = {\n collider: circle,\n separation: separation,\n axis: normal,\n point: side.begin,\n side: side,\n localSide: localSide\n };\n return [\n new _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_2__.CollisionContact(circle, edge, normal.scale(separation), normal, normal.perpendicular(), [side.begin], [localSide.begin], info)\n ];\n }\n // Potential region B collision (circle is on the right side of the edge, after the end)\n if (u <= 0) {\n const db = edgeWorld.end.sub(cc);\n const ddb = db.dot(db);\n if (ddb > circle.radius * circle.radius) {\n return [];\n }\n const normal = db.normalize();\n const separation = circle.radius - Math.sqrt(ddb);\n const info = {\n collider: circle,\n separation: separation,\n axis: normal,\n point: side.end,\n side: side,\n localSide: localSide\n };\n return [\n new _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_2__.CollisionContact(circle, edge, normal.scale(separation), normal, normal.perpendicular(), [side.end], [localSide.end], info)\n ];\n }\n // Otherwise potential region AB collision (circle is in the middle of the edge between the beginning and end)\n const den = e.dot(e);\n const pointOnEdge = edgeWorld.begin\n .scale(u)\n .add(edgeWorld.end.scale(v))\n .scale(1 / den);\n const d = cc.sub(pointOnEdge);\n const dd = d.dot(d);\n if (dd > circle.radius * circle.radius) {\n return []; // no collision\n }\n let normal = e.perpendicular();\n // flip correct direction\n if (normal.dot(cc.sub(edgeWorld.begin)) < 0) {\n normal.x = -normal.x;\n normal.y = -normal.y;\n }\n normal = normal.normalize();\n const separation = circle.radius - Math.sqrt(dd);\n const mvt = normal.scale(separation);\n const info = {\n collider: circle,\n separation: separation,\n axis: normal,\n point: pointOnEdge,\n side: side,\n localSide: localSide\n };\n return [\n new _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_2__.CollisionContact(circle, edge, mvt, normal.negate(), normal.negate().perpendicular(), [pointOnEdge], [pointOnEdge.sub(edge.worldPos)], info)\n ];\n },\n CollideEdgeEdge() {\n // Edge-edge collision doesn't make sense\n return [];\n },\n CollidePolygonEdge(polygon, edge) {\n var _a;\n const pc = polygon.center;\n const ec = edge.center;\n const dir = ec.sub(pc).normalize();\n // build a temporary polygon from the edge to use SAT\n const linePoly = new _PolygonCollider__WEBPACK_IMPORTED_MODULE_5__.PolygonCollider({\n points: [edge.begin, edge.end, edge.end.add(dir.scale(100)), edge.begin.add(dir.scale(100))],\n offset: edge.offset\n });\n linePoly.owner = edge.owner;\n const tx = (_a = edge.owner) === null || _a === void 0 ? void 0 : _a.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__.TransformComponent);\n if (tx) {\n linePoly.update(edge.owner.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__.TransformComponent).get());\n }\n // Gross hack but poly-poly works well\n const contact = this.CollidePolygonPolygon(polygon, linePoly);\n if (contact.length) {\n // Fudge the contact back to edge\n contact[0].colliderB = edge;\n contact[0].id = _Detection_Pair__WEBPACK_IMPORTED_MODULE_6__.Pair.calculatePairHash(polygon.id, edge.id);\n }\n return contact;\n },\n CollidePolygonPolygon(polyA, polyB) {\n // Multi contact from SAT\n // https://gamedev.stackexchange.com/questions/111390/multiple-contacts-for-sat-collision-detection\n // do a SAT test to find a min axis if it exists\n const separationA = _SeparatingAxis__WEBPACK_IMPORTED_MODULE_3__.SeparatingAxis.findPolygonPolygonSeparation(polyA, polyB);\n // If there is no overlap from boxA's perspective we can end early\n if (separationA.separation > 0) {\n return [];\n }\n const separationB = _SeparatingAxis__WEBPACK_IMPORTED_MODULE_3__.SeparatingAxis.findPolygonPolygonSeparation(polyB, polyA);\n // If there is no overlap from boxB's perspective exit now\n if (separationB.separation > 0) {\n return [];\n }\n // Separations are both negative, we want to pick the least negative (minimal movement)\n const separation = separationA.separation > separationB.separation ? separationA : separationB;\n // The incident side is the most opposite from the axes of collision on the other collider\n const other = separation.collider === polyA ? polyB : polyA;\n const main = separation.collider === polyA ? polyA : polyB;\n const toIncidentFrame = other.transform.inverse.multiply(main.transform.matrix, ScratchMatrix);\n const toIncidentFrameRotation = toIncidentFrame.getRotation();\n const referenceEdgeNormal = main.normals[separation.sideId].rotate(toIncidentFrameRotation, ScratchZero, ScratchNormal);\n let minEdge = Number.MAX_VALUE;\n let incidentEdgeIndex = 0;\n for (let i = 0; i < other.normals.length; i++) {\n const value = referenceEdgeNormal.dot(other.normals[i]);\n if (value < minEdge) {\n minEdge = value;\n incidentEdgeIndex = i;\n }\n }\n // Clip incident side by the perpendicular lines at each end of the reference side\n // https://en.wikipedia.org/wiki/Sutherland%E2%80%93Hodgman_algorithm\n const referenceSide = separation.localSide.transform(toIncidentFrame);\n const referenceDirection = separation.localAxis.perpendicular().negate().rotate(toIncidentFrameRotation);\n const incidentSide = new _Math_line_segment__WEBPACK_IMPORTED_MODULE_7__.LineSegment(other.points[incidentEdgeIndex], other.points[(incidentEdgeIndex + 1) % other.points.length]);\n const clipRight = incidentSide.clip(referenceDirection.negate(), -referenceDirection.dot(referenceSide.begin), false);\n let clipLeft = null;\n if (clipRight) {\n clipLeft = clipRight.clip(referenceDirection, referenceDirection.dot(referenceSide.end), false);\n }\n if (clipLeft) {\n const localPoints = [];\n const points = [];\n const clipPoints = clipLeft.getPoints();\n for (let i = 0; i < clipPoints.length; i++) {\n const p = clipPoints[i];\n if (referenceSide.below(p)) {\n localPoints.push(p);\n points.push(other.transform.apply(p));\n }\n }\n let normal = separation.axis;\n let tangent = normal.perpendicular();\n // Point Contact A -> B\n if (polyB.center.sub(polyA.center).dot(normal) < 0) {\n normal = normal.negate();\n tangent = normal.perpendicular();\n }\n return [new _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_2__.CollisionContact(polyA, polyB, normal.scale(-separation.separation), normal, tangent, points, localPoints, separation)];\n }\n return [];\n },\n FindContactSeparation(contact, localPoint) {\n var _a, _b, _c, _d;\n const shapeA = contact.colliderA;\n const txA = (_b = (_a = contact.bodyA) === null || _a === void 0 ? void 0 : _a.transform) !== null && _b !== void 0 ? _b : new _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__.TransformComponent();\n const shapeB = contact.colliderB;\n const txB = (_d = (_c = contact.bodyB) === null || _c === void 0 ? void 0 : _c.transform) !== null && _d !== void 0 ? _d : new _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__.TransformComponent();\n // both are circles\n if (shapeA instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_8__.CircleCollider && shapeB instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_8__.CircleCollider) {\n const combinedRadius = shapeA.radius + shapeB.radius;\n const distance = txA.pos.distance(txB.pos);\n const separation = combinedRadius - distance;\n return -separation;\n }\n // both are polygons\n if (shapeA instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_5__.PolygonCollider && shapeB instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_5__.PolygonCollider) {\n if (contact.info.localSide) {\n let side;\n let worldPoint;\n if (contact.info.collider === shapeA) {\n side = new _Math_line_segment__WEBPACK_IMPORTED_MODULE_7__.LineSegment(txA.apply(contact.info.localSide.begin), txA.apply(contact.info.localSide.end));\n worldPoint = txB.apply(localPoint);\n }\n else {\n side = new _Math_line_segment__WEBPACK_IMPORTED_MODULE_7__.LineSegment(txB.apply(contact.info.localSide.begin), txB.apply(contact.info.localSide.end));\n worldPoint = txA.apply(localPoint);\n }\n return side.distanceToPoint(worldPoint, true);\n }\n }\n // polygon v circle\n if ((shapeA instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_5__.PolygonCollider && shapeB instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_8__.CircleCollider) ||\n (shapeB instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_5__.PolygonCollider && shapeA instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_8__.CircleCollider)) {\n const worldPoint = txA.apply(localPoint);\n if (contact.info.side) {\n return contact.info.side.distanceToPoint(worldPoint, true);\n }\n }\n // polygon v edge\n if ((shapeA instanceof _EdgeCollider__WEBPACK_IMPORTED_MODULE_9__.EdgeCollider && shapeB instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_5__.PolygonCollider) ||\n (shapeB instanceof _EdgeCollider__WEBPACK_IMPORTED_MODULE_9__.EdgeCollider && shapeA instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_5__.PolygonCollider)) {\n let worldPoint;\n if (contact.info.collider === shapeA) {\n worldPoint = txB.apply(localPoint);\n }\n else {\n worldPoint = txA.apply(localPoint);\n }\n if (contact.info.side) {\n return contact.info.side.distanceToPoint(worldPoint, true);\n }\n }\n // circle v edge\n if ((shapeA instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_8__.CircleCollider && shapeB instanceof _EdgeCollider__WEBPACK_IMPORTED_MODULE_9__.EdgeCollider) ||\n (shapeB instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_8__.CircleCollider && shapeA instanceof _EdgeCollider__WEBPACK_IMPORTED_MODULE_9__.EdgeCollider)) {\n // Local point is always on the edge which is always shapeB\n const worldPoint = txB.apply(localPoint);\n let circlePoint;\n if (shapeA instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_8__.CircleCollider) {\n circlePoint = shapeA.getFurthestPoint(contact.normal);\n }\n const dist = worldPoint.distance(circlePoint);\n if (contact.info.side) {\n return dist > 0 ? -dist : 0;\n }\n }\n return 0;\n }\n};\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/CompositeCollider.ts\":\n/*!**************************************************!*\\\n !*** ./Collision/Colliders/CompositeCollider.ts ***!\n \\**************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CompositeCollider: () => (/* binding */ CompositeCollider)\n/* harmony export */ });\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../.. */ \"./Util/Util.ts\");\n/* harmony import */ var _Detection_Pair__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Detection/Pair */ \"./Collision/Detection/Pair.ts\");\n/* harmony import */ var _Math_projection__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../Math/projection */ \"./Math/projection.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Detection_DynamicTree__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Detection/DynamicTree */ \"./Collision/Detection/DynamicTree.ts\");\n/* harmony import */ var _Detection_DynamicTreeCollisionProcessor__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Detection/DynamicTreeCollisionProcessor */ \"./Collision/Detection/DynamicTreeCollisionProcessor.ts\");\n/* harmony import */ var _Collider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Collider */ \"./Collision/Colliders/Collider.ts\");\n/* harmony import */ var _PhysicsConfig__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../PhysicsConfig */ \"./Collision/PhysicsConfig.ts\");\n\n\n\n\n\n\n\n\n\nclass CompositeCollider extends _Collider__WEBPACK_IMPORTED_MODULE_0__.Collider {\n /**\n * Treat composite collider's member colliders as either separate colliders for the purposes of onCollisionStart/onCollision\n * or as a single collider together.\n *\n * This property can be overridden on individual {@apilink CompositeColliders}.\n *\n * For composites without gaps or small groups of colliders, you probably want 'together'\n *\n * For composites with deliberate gaps, like a platforming level layout, you probably want 'separate'\n *\n * Default is 'together' if unset\n */\n set compositeStrategy(value) {\n this._compositeStrategy = value;\n }\n get compositeStrategy() {\n return this._compositeStrategy;\n }\n constructor(colliders) {\n super();\n this._collisionProcessor = new _Detection_DynamicTreeCollisionProcessor__WEBPACK_IMPORTED_MODULE_1__.DynamicTreeCollisionProcessor({\n ...(0,_PhysicsConfig__WEBPACK_IMPORTED_MODULE_2__.getDefaultPhysicsConfig)()\n });\n this._dynamicAABBTree = new _Detection_DynamicTree__WEBPACK_IMPORTED_MODULE_3__.DynamicTree({\n boundsPadding: 5,\n velocityMultiplier: 2\n });\n this._colliders = [];\n for (const c of colliders) {\n this.addCollider(c);\n }\n }\n clearColliders() {\n this._colliders = [];\n }\n addCollider(collider) {\n let colliders;\n if (collider instanceof CompositeCollider) {\n colliders = collider.getColliders();\n colliders.forEach((c) => c.offset.addEqual(collider.offset));\n }\n else {\n colliders = [collider];\n }\n // Flatten composites\n for (const c of colliders) {\n c.events.pipe(this.events);\n c.composite = this;\n this._colliders.push(c);\n this._collisionProcessor.track(c);\n this._dynamicAABBTree.trackCollider(c);\n }\n }\n removeCollider(collider) {\n collider.events.pipe(this.events);\n collider.composite = null;\n ___WEBPACK_IMPORTED_MODULE_4__.removeItemFromArray(collider, this._colliders);\n this._collisionProcessor.untrack(collider);\n this._dynamicAABBTree.untrackCollider(collider);\n }\n getColliders() {\n return this._colliders;\n }\n get worldPos() {\n var _a, _b;\n return ((_b = (_a = this._transform) === null || _a === void 0 ? void 0 : _a.pos) !== null && _b !== void 0 ? _b : _Math_vector__WEBPACK_IMPORTED_MODULE_5__.Vector.Zero).add(this.offset);\n }\n get center() {\n var _a, _b;\n return ((_b = (_a = this._transform) === null || _a === void 0 ? void 0 : _a.pos) !== null && _b !== void 0 ? _b : _Math_vector__WEBPACK_IMPORTED_MODULE_5__.Vector.Zero).add(this.offset);\n }\n get bounds() {\n var _a, _b;\n // TODO cache this\n const colliders = this.getColliders();\n const results = colliders.reduce((acc, collider) => acc.combine(collider.bounds), (_b = (_a = colliders[0]) === null || _a === void 0 ? void 0 : _a.bounds) !== null && _b !== void 0 ? _b : new _BoundingBox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox().translate(this.worldPos));\n return results.translate(this.offset);\n }\n get localBounds() {\n var _a, _b;\n // TODO cache this\n const colliders = this.getColliders();\n const results = colliders.reduce((acc, collider) => acc.combine(collider.localBounds), (_b = (_a = colliders[0]) === null || _a === void 0 ? void 0 : _a.localBounds) !== null && _b !== void 0 ? _b : new _BoundingBox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox());\n return results;\n }\n get axes() {\n // TODO cache this\n const colliders = this.getColliders();\n let axes = [];\n for (const collider of colliders) {\n axes = axes.concat(collider.axes);\n }\n return axes;\n }\n getFurthestPoint(direction) {\n const colliders = this.getColliders();\n const furthestPoints = [];\n for (const collider of colliders) {\n furthestPoints.push(collider.getFurthestPoint(direction));\n }\n // Pick best point from all colliders\n let bestPoint = furthestPoints[0];\n let maxDistance = -Number.MAX_VALUE;\n for (const point of furthestPoints) {\n const distance = point.dot(direction);\n if (distance > maxDistance) {\n bestPoint = point;\n maxDistance = distance;\n }\n }\n return bestPoint;\n }\n getInertia(mass) {\n const colliders = this.getColliders();\n let totalInertia = 0;\n for (const collider of colliders) {\n totalInertia += collider.getInertia(mass);\n }\n return totalInertia;\n }\n collide(other) {\n let otherColliders = [other];\n if (other instanceof CompositeCollider) {\n otherColliders = other.getColliders();\n }\n const pairs = [];\n for (const c of otherColliders) {\n this._dynamicAABBTree.query(c, (potentialCollider) => {\n pairs.push(new _Detection_Pair__WEBPACK_IMPORTED_MODULE_7__.Pair(c, potentialCollider));\n return false;\n });\n }\n let contacts = [];\n for (const p of pairs) {\n contacts = contacts.concat(p.collide());\n }\n return contacts;\n }\n getClosestLineBetween(other) {\n const colliders = this.getColliders();\n const lines = [];\n if (other instanceof CompositeCollider) {\n const otherColliders = other.getColliders();\n for (const colliderA of colliders) {\n for (const colliderB of otherColliders) {\n const maybeLine = colliderA.getClosestLineBetween(colliderB);\n if (maybeLine) {\n lines.push(maybeLine);\n }\n }\n }\n }\n else {\n for (const collider of colliders) {\n const maybeLine = other.getClosestLineBetween(collider);\n if (maybeLine) {\n lines.push(maybeLine);\n }\n }\n }\n if (lines.length) {\n let minLength = lines[0].getLength();\n let minLine = lines[0];\n for (const line of lines) {\n const length = line.getLength();\n if (length < minLength) {\n minLength = length;\n minLine = line;\n }\n }\n return minLine;\n }\n return null;\n }\n contains(point) {\n const colliders = this.getColliders();\n for (const collider of colliders) {\n if (collider.contains(point)) {\n return true;\n }\n }\n return false;\n }\n rayCast(ray, max) {\n const colliders = this.getColliders();\n const hits = [];\n for (const collider of colliders) {\n const hit = collider.rayCast(ray, max);\n if (hit) {\n hits.push(hit);\n }\n }\n if (hits.length) {\n let minHit = hits[0];\n let minDistance = minHit.point.dot(ray.dir);\n for (const hit of hits) {\n const distance = ray.dir.dot(hit.point);\n if (distance < minDistance) {\n minHit = hit;\n minDistance = distance;\n }\n }\n return minHit;\n }\n return null;\n }\n project(axis) {\n const colliders = this.getColliders();\n const projections = [];\n for (const collider of colliders) {\n const proj = collider.project(axis);\n if (proj) {\n projections.push(proj);\n }\n }\n // Merge all proj's on the same axis\n if (projections.length) {\n const newProjection = new _Math_projection__WEBPACK_IMPORTED_MODULE_8__.Projection(projections[0].min, projections[0].max);\n for (const proj of projections) {\n newProjection.min = Math.min(proj.min, newProjection.min);\n newProjection.max = Math.max(proj.max, newProjection.max);\n }\n return newProjection;\n }\n return null;\n }\n update(transform) {\n if (transform) {\n const colliders = this.getColliders();\n for (const collider of colliders) {\n collider.owner = this.owner;\n collider.update(transform);\n }\n }\n }\n debug(ex, color, options) {\n const colliders = this.getColliders();\n ex.save();\n ex.translate(this.offset.x, this.offset.y);\n for (const collider of colliders) {\n collider.debug(ex, color, options);\n }\n ex.restore();\n }\n clone() {\n const result = new CompositeCollider(this._colliders.map((c) => c.clone()));\n result.offset = this.offset.clone();\n return result;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/EdgeCollider.ts\":\n/*!*********************************************!*\\\n !*** ./Collision/Colliders/EdgeCollider.ts ***!\n \\*********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EdgeCollider: () => (/* binding */ EdgeCollider)\n/* harmony export */ });\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./CollisionJumpTable */ \"./Collision/Colliders/CollisionJumpTable.ts\");\n/* harmony import */ var _CircleCollider__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./CircleCollider */ \"./Collision/Colliders/CircleCollider.ts\");\n/* harmony import */ var _PolygonCollider__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./PolygonCollider */ \"./Collision/Colliders/PolygonCollider.ts\");\n/* harmony import */ var _Math_projection__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../Math/projection */ \"./Math/projection.ts\");\n/* harmony import */ var _Math_line_segment__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../Math/line-segment */ \"./Math/line-segment.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Collider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Collider */ \"./Collision/Colliders/Collider.ts\");\n/* harmony import */ var _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./ClosestLineJumpTable */ \"./Collision/Colliders/ClosestLineJumpTable.ts\");\n/* harmony import */ var _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/affine-matrix */ \"./Math/affine-matrix.ts\");\n/* harmony import */ var _Index__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Index */ \"./Collision/BodyComponent.ts\");\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Edge is a single line collider to create collisions with a single line.\n */\nclass EdgeCollider extends _Collider__WEBPACK_IMPORTED_MODULE_0__.Collider {\n constructor(options) {\n var _a;\n super();\n this._globalMatrix = _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_1__.AffineMatrix.identity();\n this.begin = options.begin || _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero;\n this.end = options.end || _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero;\n this.offset = (_a = options.offset) !== null && _a !== void 0 ? _a : _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero;\n }\n /**\n * Returns a clone of this Edge, not associated with any collider\n */\n clone() {\n return new EdgeCollider({\n begin: this.begin.clone(),\n end: this.end.clone()\n });\n }\n get worldPos() {\n var _a;\n const tx = this._transform;\n return (_a = tx === null || tx === void 0 ? void 0 : tx.globalPos.add(this.offset)) !== null && _a !== void 0 ? _a : this.offset;\n }\n /**\n * Get the center of the collision area in world coordinates\n */\n get center() {\n const begin = this._getTransformedBegin();\n const end = this._getTransformedEnd();\n const pos = begin.average(end);\n return pos;\n }\n _getTransformedBegin() {\n return this._globalMatrix.multiply(this.begin);\n }\n _getTransformedEnd() {\n return this._globalMatrix.multiply(this.end);\n }\n /**\n * Returns the slope of the line in the form of a vector\n */\n getSlope() {\n const begin = this._getTransformedBegin();\n const end = this._getTransformedEnd();\n const distance = begin.distance(end);\n return end.sub(begin).scale(1 / distance);\n }\n /**\n * Returns the length of the line segment in pixels\n */\n getLength() {\n const begin = this._getTransformedBegin();\n const end = this._getTransformedEnd();\n const distance = begin.distance(end);\n return distance;\n }\n /**\n * Tests if a point is contained in this collision area\n */\n contains() {\n return false;\n }\n /**\n * @inheritdoc\n */\n rayCast(ray, max = Infinity) {\n var _a;\n const numerator = this._getTransformedBegin().sub(ray.pos);\n // Test is line and ray are parallel and non intersecting\n if (ray.dir.cross(this.getSlope()) === 0 && numerator.cross(ray.dir) !== 0) {\n return null;\n }\n // Lines are parallel\n const divisor = ray.dir.cross(this.getSlope());\n if (divisor === 0) {\n return null;\n }\n const t = numerator.cross(this.getSlope()) / divisor;\n if (t >= 0 && t <= max) {\n const u = numerator.cross(ray.dir) / divisor / this.getLength();\n if (u >= 0 && u <= 1) {\n return {\n distance: t,\n normal: this.asLine().normal(),\n collider: this,\n body: (_a = this.owner) === null || _a === void 0 ? void 0 : _a.get(_Index__WEBPACK_IMPORTED_MODULE_3__.BodyComponent),\n point: ray.getPoint(t)\n };\n }\n }\n return null;\n }\n /**\n * Returns the closes line between this and another collider, from this -> collider\n * @param shape\n */\n getClosestLineBetween(shape) {\n if (shape instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_4__.CircleCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_5__.ClosestLineJumpTable.CircleEdgeClosestLine(shape, this);\n }\n else if (shape instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_6__.PolygonCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_5__.ClosestLineJumpTable.PolygonEdgeClosestLine(shape, this).flip();\n }\n else if (shape instanceof EdgeCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_5__.ClosestLineJumpTable.EdgeEdgeClosestLine(this, shape);\n }\n else {\n throw new Error(`Polygon could not collide with unknown CollisionShape ${typeof shape}`);\n }\n }\n /**\n * @inheritdoc\n */\n collide(shape) {\n if (shape instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_4__.CircleCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_7__.CollisionJumpTable.CollideCircleEdge(shape, this);\n }\n else if (shape instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_6__.PolygonCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_7__.CollisionJumpTable.CollidePolygonEdge(shape, this);\n }\n else if (shape instanceof EdgeCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_7__.CollisionJumpTable.CollideEdgeEdge();\n }\n else {\n throw new Error(`Edge could not collide with unknown CollisionShape ${typeof shape}`);\n }\n }\n /**\n * Find the point on the collider furthest in the direction specified\n */\n getFurthestPoint(direction) {\n const transformedBegin = this._getTransformedBegin();\n const transformedEnd = this._getTransformedEnd();\n if (direction.dot(transformedBegin) > 0) {\n return transformedBegin;\n }\n else {\n return transformedEnd;\n }\n }\n _boundsFromBeginEnd(begin, end, padding = 10) {\n // A perfectly vertical or horizontal edge would have a bounds 0 width or height\n // this causes problems for the collision system so we give them some padding\n return new _BoundingBox__WEBPACK_IMPORTED_MODULE_8__.BoundingBox(Math.min(begin.x, end.x) - padding, Math.min(begin.y, end.y) - padding, Math.max(begin.x, end.x) + padding, Math.max(begin.y, end.y) + padding);\n }\n /**\n * Get the axis aligned bounding box for the edge collider in world space\n */\n get bounds() {\n const transformedBegin = this._getTransformedBegin();\n const transformedEnd = this._getTransformedEnd();\n return this._boundsFromBeginEnd(transformedBegin, transformedEnd);\n }\n /**\n * Get the axis aligned bounding box for the edge collider in local space\n */\n get localBounds() {\n return this._boundsFromBeginEnd(this.begin, this.end);\n }\n /**\n * Returns this edge represented as a line in world coordinates\n */\n asLine() {\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_9__.LineSegment(this._getTransformedBegin(), this._getTransformedEnd());\n }\n /**\n * Return this edge as a line in local line coordinates (relative to the position)\n */\n asLocalLine() {\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_9__.LineSegment(this.begin, this.end);\n }\n /**\n * Get the axis associated with the edge\n */\n get axes() {\n const e = this._getTransformedEnd().sub(this._getTransformedBegin());\n const edgeNormal = e.normal();\n const axes = [];\n axes.push(edgeNormal);\n axes.push(edgeNormal.negate());\n axes.push(edgeNormal.normal());\n axes.push(edgeNormal.normal().negate());\n return axes;\n }\n /**\n * Get the moment of inertia for an edge\n * https://en.wikipedia.org/wiki/List_of_moments_of_inertia\n */\n getInertia(mass) {\n const length = this.end.sub(this.begin).distance() / 2;\n return mass * length * length;\n }\n /**\n * @inheritdoc\n */\n update(transform) {\n var _a;\n this._transform = transform;\n const globalMat = (_a = transform.matrix) !== null && _a !== void 0 ? _a : this._globalMatrix;\n globalMat.clone(this._globalMatrix);\n this._globalMatrix.translate(this.offset.x, this.offset.y);\n }\n /**\n * Project the edge along a specified axis\n */\n project(axis) {\n const scalars = [];\n const points = [this._getTransformedBegin(), this._getTransformedEnd()];\n const len = points.length;\n for (let i = 0; i < len; i++) {\n scalars.push(points[i].dot(axis));\n }\n return new _Math_projection__WEBPACK_IMPORTED_MODULE_10__.Projection(Math.min.apply(Math, scalars), Math.max.apply(Math, scalars));\n }\n debug(ex, color) {\n const begin = this._getTransformedBegin();\n const end = this._getTransformedEnd();\n ex.drawLine(begin, end, color, 2);\n ex.drawCircle(begin, 2, color);\n ex.drawCircle(end, 2, color);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/PolygonCollider.ts\":\n/*!************************************************!*\\\n !*** ./Collision/Colliders/PolygonCollider.ts ***!\n \\************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PolygonCollider: () => (/* binding */ PolygonCollider)\n/* harmony export */ });\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _EdgeCollider__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./EdgeCollider */ \"./Collision/Colliders/EdgeCollider.ts\");\n/* harmony import */ var _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./CollisionJumpTable */ \"./Collision/Colliders/CollisionJumpTable.ts\");\n/* harmony import */ var _CircleCollider__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./CircleCollider */ \"./Collision/Colliders/CircleCollider.ts\");\n/* harmony import */ var _Math_projection__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../Math/projection */ \"./Math/projection.ts\");\n/* harmony import */ var _Math_line_segment__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../Math/line-segment */ \"./Math/line-segment.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math_ray__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../Math/ray */ \"./Math/ray.ts\");\n/* harmony import */ var _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./ClosestLineJumpTable */ \"./Collision/Colliders/ClosestLineJumpTable.ts\");\n/* harmony import */ var _Collider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Collider */ \"./Collision/Colliders/Collider.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../.. */ \"./Util/Log.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../.. */ \"./Math/util.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../.. */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../.. */ \"./Graphics/Debug.ts\");\n/* harmony import */ var _CompositeCollider__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var _Shape__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Shape */ \"./Collision/Colliders/Shape.ts\");\n/* harmony import */ var _Math_transform__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math/transform */ \"./Math/transform.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Polygon collider for detecting collisions\n */\nclass PolygonCollider extends _Collider__WEBPACK_IMPORTED_MODULE_0__.Collider {\n flagDirty() {\n this._localBoundsDirty = true;\n this._localSidesDirty = true;\n this._transformedPointsDirty = true;\n this._sidesDirty = true;\n }\n get normals() {\n return this._normals;\n }\n /**\n * Points in the polygon in order around the perimeter in local coordinates. These are relative from the body transform position.\n * Excalibur stores these in counter-clockwise order\n */\n set points(points) {\n if (points.length < 3) {\n throw new Error('PolygonCollider cannot be created with less that 3 points');\n }\n this._points = points;\n this._checkAndUpdateWinding(this._points);\n this._calculateNormals();\n this.flagDirty();\n }\n _calculateNormals() {\n const normals = [];\n for (let i = 0; i < this._points.length; i++) {\n normals.push(this._points[(i + 1) % this._points.length].sub(this._points[i]).normal());\n }\n this._normals = normals;\n }\n /**\n * Points in the polygon in order around the perimeter in local coordinates. These are relative from the body transform position.\n * Excalibur stores these in counter-clockwise order\n */\n get points() {\n return this._points;\n }\n get transform() {\n return this._transform;\n }\n constructor(options) {\n var _a;\n super();\n this._logger = ___WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this._transform = new _Math_transform__WEBPACK_IMPORTED_MODULE_2__.Transform();\n this._transformedPoints = [];\n this._sides = [];\n this._localSides = [];\n this._transformedPointsDirty = true;\n this._sidesDirty = true;\n this._localSidesDirty = true;\n this._localBoundsDirty = true;\n this.offset = (_a = options.offset) !== null && _a !== void 0 ? _a : _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero;\n this._transform.pos.x += this.offset.x;\n this._transform.pos.y += this.offset.y;\n this.points = options.points;\n if (!this.isConvex()) {\n if (!options.suppressConvexWarning) {\n this._logger.warn('Excalibur only supports convex polygon colliders and will not behave properly.' +\n 'Call PolygonCollider.triangulate() to build a new collider composed of smaller convex triangles');\n }\n }\n // calculate initial transformation\n this._calculateTransformation();\n }\n _checkAndUpdateWinding(points) {\n const counterClockwise = this._isCounterClockwiseWinding(points);\n if (!counterClockwise) {\n points.reverse();\n }\n }\n _isCounterClockwiseWinding(points) {\n // https://stackoverflow.com/a/1165943\n let sum = 0;\n for (let i = 0; i < points.length; i++) {\n sum += (points[(i + 1) % points.length].x - points[i].x) * (points[(i + 1) % points.length].y + points[i].y);\n }\n return sum < 0;\n }\n /**\n * Returns if the polygon collider is convex, Excalibur does not handle non-convex collision shapes.\n * Call {@apilink Polygon.triangulate} to generate a {@apilink CompositeCollider} from this non-convex shape\n */\n isConvex() {\n // From SO: https://stackoverflow.com/a/45372025\n if (this.points.length < 3) {\n return false;\n }\n let oldPoint = this.points[this.points.length - 2];\n let newPoint = this.points[this.points.length - 1];\n let direction = Math.atan2(newPoint.y - oldPoint.y, newPoint.x - oldPoint.x);\n let oldDirection = 0;\n let orientation = 0;\n let angleSum = 0;\n for (const [i, point] of this.points.entries()) {\n oldPoint = newPoint;\n oldDirection = direction;\n newPoint = point;\n direction = Math.atan2(newPoint.y - oldPoint.y, newPoint.x - oldPoint.x);\n if (oldPoint.equals(newPoint)) {\n return false; // repeat point\n }\n let angle = direction - oldDirection;\n if (angle <= -Math.PI) {\n angle += Math.PI * 2;\n }\n else if (angle > Math.PI) {\n angle -= Math.PI * 2;\n }\n if (i === 0) {\n if (angle === 0.0) {\n return false;\n }\n orientation = angle > 0 ? 1 : -1;\n }\n else {\n if (orientation * angle <= 0) {\n return false;\n }\n }\n angleSum += angle;\n }\n return Math.abs(Math.round(angleSum / (Math.PI * 2))) === 1;\n }\n /**\n * Tessellates the polygon into a triangle fan as a {@apilink CompositeCollider} of triangle polygons\n */\n tessellate() {\n const polygons = [];\n for (let i = 1; i < this.points.length - 2; i++) {\n polygons.push([this.points[0], this.points[i + 1], this.points[i + 2]]);\n }\n polygons.push([this.points[0], this.points[1], this.points[2]]);\n return new _CompositeCollider__WEBPACK_IMPORTED_MODULE_4__.CompositeCollider(polygons.map((points) => _Shape__WEBPACK_IMPORTED_MODULE_5__.Shape.Polygon(points)));\n }\n /**\n * Triangulate the polygon collider using the \"Ear Clipping\" algorithm.\n * Returns a new {@apilink CompositeCollider} made up of smaller triangles.\n */\n triangulate() {\n // https://www.youtube.com/watch?v=hTJFcHutls8\n if (this.points.length < 3) {\n throw Error('Invalid polygon');\n }\n const triangles = [];\n // algorithm likes clockwise\n const vertices = [...this.points].reverse();\n let vertexCount = vertices.length;\n /**\n * Returns the previous index based on the current vertex\n */\n function getPrevIndex(index) {\n return index === 0 ? vertexCount - 1 : index - 1;\n }\n /**\n * Retrieves the next index based on the current vertex\n */\n function getNextIndex(index) {\n return index === vertexCount - 1 ? 0 : index + 1;\n }\n /**\n * Whether or not the angle at this vertex index is convex\n */\n function isConvex(index) {\n const prev = getPrevIndex(index);\n const next = getNextIndex(index);\n const va = vertices[prev];\n const vb = vertices[index];\n const vc = vertices[next];\n // Check convexity\n const leftArm = va.sub(vb);\n const rightArm = vc.sub(vb);\n // Positive cross product is convex\n if (leftArm.cross(rightArm) < 0) {\n return false;\n }\n return true;\n }\n const convexVertices = vertices.map((_, i) => isConvex(i));\n /**\n * Quick test for point in triangle\n */\n function isPointInTriangle(point, a, b, c) {\n const ab = b.sub(a);\n const bc = c.sub(b);\n const ca = a.sub(c);\n const ap = point.sub(a);\n const bp = point.sub(b);\n const cp = point.sub(c);\n const cross1 = ab.cross(ap);\n const cross2 = bc.cross(bp);\n const cross3 = ca.cross(cp);\n if (cross1 > 0 || cross2 > 0 || cross3 > 0) {\n return false;\n }\n return true;\n }\n /**\n * Calculate the area of the triangle\n */\n // function triangleArea(a: Vector, b: Vector, c: Vector) {\n // return Math.abs(a.x * (b.y - c.y) + b.x * (c.y - a.y) + c.x * (a.y - c.y))/2;\n // }\n /**\n * Find the next suitable ear tip\n */\n function findEarTip() {\n for (let i = 0; i < vertexCount; i++) {\n if (convexVertices[i]) {\n const prev = getPrevIndex(i);\n const next = getNextIndex(i);\n const va = vertices[prev];\n const vb = vertices[i];\n const vc = vertices[next];\n let isEar = true;\n // Check that if any vertices are in the triangle a, b, c\n for (let j = 0; j < vertexCount; j++) {\n // We can skip these verts because they are the triangle we are testing\n if (j === i || j === prev || j === next) {\n continue;\n }\n const point = vertices[j];\n if (isPointInTriangle(point, va, vb, vc)) {\n isEar = false;\n break;\n }\n }\n // Add ear to polygon list and remove from list\n if (isEar) {\n return i;\n }\n }\n }\n // Fall back to any convex vertex\n for (let i = 0; i < vertexCount; i++) {\n if (convexVertices[i]) {\n return i;\n }\n }\n // bail and return the first one?\n return 0;\n }\n /**\n * Cut the ear and produce a triangle, update internal state\n */\n function cutEarTip(index) {\n const prev = getPrevIndex(index);\n const next = getNextIndex(index);\n const va = vertices[prev];\n const vb = vertices[index];\n const vc = vertices[next];\n // Clockwise winding\n // if (triangleArea(va, vb, vc) > 0) {\n triangles.push([va, vb, vc]);\n // }\n vertices.splice(index, 1);\n convexVertices.splice(index, 1);\n vertexCount--;\n }\n // Loop over all the vertices finding ears\n while (vertexCount > 3) {\n const earIndex = findEarTip();\n cutEarTip(earIndex);\n // reclassify vertices\n for (let i = 0; i < vertexCount; i++) {\n convexVertices[i] = isConvex(i);\n }\n }\n // Last triangle after the loop\n triangles.push([vertices[0], vertices[1], vertices[2]]);\n // FIXME: there is a colinear triangle that sneaks in here sometimes\n return new _CompositeCollider__WEBPACK_IMPORTED_MODULE_4__.CompositeCollider(triangles.map((points) => _Shape__WEBPACK_IMPORTED_MODULE_5__.Shape.Polygon(points, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero, true)));\n }\n /**\n * Returns a clone of this ConvexPolygon, not associated with any collider\n */\n clone() {\n return new PolygonCollider({\n offset: this.offset.clone(),\n points: this.points.map((p) => p.clone())\n });\n }\n /**\n * Returns the world position of the collider, which is the current body transform plus any defined offset\n */\n get worldPos() {\n return this._transform.pos;\n }\n /**\n * Get the center of the collider in world coordinates\n */\n get center() {\n return this.bounds.center;\n }\n /**\n * Calculates the underlying transformation from the body relative space to world space\n */\n _calculateTransformation() {\n const points = this.points;\n const len = points.length;\n this._transformedPoints.length = 0; // clear out old transform\n for (let i = 0; i < len; i++) {\n this._transformedPoints[i] = this._transform.apply(points[i].clone());\n }\n }\n /**\n * Gets the points that make up the polygon in world space, from actor relative space (if specified)\n */\n getTransformedPoints() {\n if (this._transformedPointsDirty) {\n this._calculateTransformation();\n this._transformedPointsDirty = false;\n }\n return this._transformedPoints;\n }\n /**\n * Gets the sides of the polygon in world space\n */\n getSides() {\n if (this._sidesDirty) {\n const lines = [];\n const points = this.getTransformedPoints();\n const len = points.length;\n for (let i = 0; i < len; i++) {\n // This winding is important\n lines.push(new _Math_line_segment__WEBPACK_IMPORTED_MODULE_6__.LineSegment(points[i], points[(i + 1) % len]));\n }\n this._sides = lines;\n this._sidesDirty = false;\n }\n return this._sides;\n }\n /**\n * Returns the local coordinate space sides\n */\n getLocalSides() {\n if (this._localSidesDirty) {\n const lines = [];\n const points = this.points;\n const len = points.length;\n for (let i = 0; i < len; i++) {\n // This winding is important\n lines.push(new _Math_line_segment__WEBPACK_IMPORTED_MODULE_6__.LineSegment(points[i], points[(i + 1) % len]));\n }\n this._localSides = lines;\n this._localSidesDirty = false;\n }\n return this._localSides;\n }\n /**\n * Given a direction vector find the world space side that is most in that direction\n * @param direction\n */\n findSide(direction) {\n const sides = this.getSides();\n let bestSide = sides[0];\n let maxDistance = -Number.MAX_VALUE;\n for (let side = 0; side < sides.length; side++) {\n const currentSide = sides[side];\n const sideNormal = currentSide.normal();\n const mostDirection = sideNormal.dot(direction);\n if (mostDirection > maxDistance) {\n bestSide = currentSide;\n maxDistance = mostDirection;\n }\n }\n return bestSide;\n }\n /**\n * Given a direction vector find the local space side that is most in that direction\n * @param direction\n */\n findLocalSide(direction) {\n const sides = this.getLocalSides();\n let bestSide = sides[0];\n let maxDistance = -Number.MAX_VALUE;\n for (let side = 0; side < sides.length; side++) {\n const currentSide = sides[side];\n const sideNormal = currentSide.normal();\n const mostDirection = sideNormal.dot(direction);\n if (mostDirection > maxDistance) {\n bestSide = currentSide;\n maxDistance = mostDirection;\n }\n }\n return bestSide;\n }\n /**\n * Get the axis associated with the convex polygon\n */\n get axes() {\n const axes = [];\n const sides = this.getSides();\n for (let i = 0; i < sides.length; i++) {\n axes.push(sides[i].normal());\n }\n return axes;\n }\n /**\n * Updates the transform for the collision geometry\n *\n * Collision geometry (points/bounds) will not change until this is called.\n * @param transform\n */\n update(transform) {\n if (transform) {\n // This change means an update must be performed in order for geometry to update\n transform.cloneWithParent(this._transform);\n this._transformedPointsDirty = true;\n this._sidesDirty = true;\n if (this.offset.x !== 0 || this.offset.y !== 0) {\n this._transform.pos.x += this.offset.x;\n this._transform.pos.y += this.offset.y;\n }\n if (this._transform.isMirrored()) {\n // negative transforms really mess with things in collision local space\n // flatten out the negatives by applying to geometry\n this.points = this.points.map((p) => (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(p.x * (0,___WEBPACK_IMPORTED_MODULE_7__.sign)(this._transform.scale.x), p.y * (0,___WEBPACK_IMPORTED_MODULE_7__.sign)(this._transform.scale.y)));\n this._transform.scale.x = Math.abs(this._transform.scale.x);\n this._transform.scale.y = Math.abs(this._transform.scale.y);\n }\n }\n }\n /**\n * Tests if a point is contained in this collider in world space\n */\n contains(point) {\n // Always cast to the right, as long as we cast in a consistent fixed direction we\n // will be fine\n const localPoint = this._transform.applyInverse(point);\n const testRay = new _Math_ray__WEBPACK_IMPORTED_MODULE_8__.Ray(localPoint, new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(1, 0));\n let intersectCount = 0;\n const sides = this.getLocalSides();\n for (let sideIndex = 0; sideIndex < sides.length; sideIndex++) {\n const side = sides[sideIndex];\n if (testRay.intersect(side) >= 0) {\n intersectCount++;\n }\n }\n if (intersectCount % 2 === 0) {\n return false;\n }\n return true;\n }\n getClosestLineBetween(collider) {\n if (collider instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_9__.CircleCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_10__.ClosestLineJumpTable.PolygonCircleClosestLine(this, collider);\n }\n else if (collider instanceof PolygonCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_10__.ClosestLineJumpTable.PolygonPolygonClosestLine(this, collider);\n }\n else if (collider instanceof _EdgeCollider__WEBPACK_IMPORTED_MODULE_11__.EdgeCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_10__.ClosestLineJumpTable.PolygonEdgeClosestLine(this, collider);\n }\n else {\n throw new Error(`Polygon could not collide with unknown CollisionShape ${typeof collider}`);\n }\n }\n /**\n * Returns a collision contact if the 2 colliders collide, otherwise collide will\n * return null.\n * @param collider\n */\n collide(collider) {\n if (collider instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_9__.CircleCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_12__.CollisionJumpTable.CollideCirclePolygon(collider, this);\n }\n else if (collider instanceof PolygonCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_12__.CollisionJumpTable.CollidePolygonPolygon(this, collider);\n }\n else if (collider instanceof _EdgeCollider__WEBPACK_IMPORTED_MODULE_11__.EdgeCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_12__.CollisionJumpTable.CollidePolygonEdge(this, collider);\n }\n else {\n throw new Error(`Polygon could not collide with unknown CollisionShape ${typeof collider}`);\n }\n }\n /**\n * Find the point on the collider furthest in the direction specified\n */\n getFurthestPoint(direction) {\n const pts = this.getTransformedPoints();\n let furthestPoint = null;\n let maxDistance = -Number.MAX_VALUE;\n for (let i = 0; i < pts.length; i++) {\n const distance = direction.dot(pts[i]);\n if (distance > maxDistance) {\n maxDistance = distance;\n furthestPoint = pts[i];\n }\n }\n return furthestPoint;\n }\n /**\n * Find the local point on the collider furthest in the direction specified\n * @param direction\n */\n getFurthestLocalPoint(direction) {\n const pts = this.points;\n let furthestPoint = pts[0];\n let maxDistance = -Number.MAX_VALUE;\n for (let i = 0; i < pts.length; i++) {\n const distance = direction.dot(pts[i]);\n if (distance > maxDistance) {\n maxDistance = distance;\n furthestPoint = pts[i];\n }\n }\n return furthestPoint;\n }\n /**\n * Finds the closes face to the point using perpendicular distance\n * @param point point to test against polygon\n */\n getClosestFace(point) {\n const sides = this.getSides();\n let min = Number.POSITIVE_INFINITY;\n let faceIndex = -1;\n let distance = -1;\n for (let i = 0; i < sides.length; i++) {\n const dist = sides[i].distanceToPoint(point);\n if (dist < min) {\n min = dist;\n faceIndex = i;\n distance = dist;\n }\n }\n if (faceIndex !== -1) {\n return {\n distance: sides[faceIndex].normal().scale(distance),\n face: sides[faceIndex]\n };\n }\n return null;\n }\n /**\n * Get the axis aligned bounding box for the polygon collider in world coordinates\n */\n get bounds() {\n return this.localBounds.transform(this._transform.matrix);\n }\n /**\n * Get the axis aligned bounding box for the polygon collider in local coordinates\n */\n get localBounds() {\n if (this._localBoundsDirty) {\n this._localBounds = _BoundingBox__WEBPACK_IMPORTED_MODULE_13__.BoundingBox.fromPoints(this.points);\n this._localBoundsDirty = false;\n }\n return this._localBounds;\n }\n /**\n * Get the moment of inertia for an arbitrary polygon\n * https://en.wikipedia.org/wiki/List_of_moments_of_inertia\n */\n getInertia(mass) {\n if (this._cachedMass === mass && this._cachedInertia) {\n return this._cachedInertia;\n }\n let numerator = 0;\n let denominator = 0;\n const points = this.points;\n for (let i = 0; i < points.length; i++) {\n const iplusone = (i + 1) % points.length;\n const crossTerm = points[iplusone].cross(points[i]);\n numerator += crossTerm * (points[i].dot(points[i]) + points[i].dot(points[iplusone]) + points[iplusone].dot(points[iplusone]));\n denominator += crossTerm;\n }\n this._cachedMass = mass;\n return (this._cachedInertia = (mass / 6) * (numerator / denominator));\n }\n /**\n * Casts a ray into the polygon and returns a vector representing the point of contact (in world space) or null if no collision.\n */\n rayCast(ray, max = Infinity) {\n var _a;\n // find the minimum contact time greater than 0\n // contact times less than 0 are behind the ray and we don't want those\n const sides = this.getSides();\n const len = sides.length;\n let minContactTime = Number.MAX_VALUE;\n let contactSide;\n let contactIndex = -1;\n for (let i = 0; i < len; i++) {\n const contactTime = ray.intersect(sides[i]);\n if (contactTime >= 0 && contactTime < minContactTime && contactTime <= max) {\n minContactTime = contactTime;\n contactSide = sides[i];\n contactIndex = i;\n }\n }\n // contact was found\n if (contactIndex >= 0) {\n return {\n collider: this,\n distance: minContactTime,\n body: (_a = this.owner) === null || _a === void 0 ? void 0 : _a.get(___WEBPACK_IMPORTED_MODULE_14__.BodyComponent),\n point: ray.getPoint(minContactTime),\n normal: contactSide.normal()\n };\n }\n // no contact found\n return null;\n }\n /**\n * Project the edges of the polygon along a specified axis\n */\n project(axis) {\n const points = this.getTransformedPoints();\n const len = points.length;\n let min = Number.MAX_VALUE;\n let max = -Number.MAX_VALUE;\n for (let i = 0; i < len; i++) {\n const scalar = points[i].dot(axis);\n min = Math.min(min, scalar);\n max = Math.max(max, scalar);\n }\n return new _Math_projection__WEBPACK_IMPORTED_MODULE_15__.Projection(min, max);\n }\n debug(ex, color, options) {\n const points = this.getTransformedPoints();\n ___WEBPACK_IMPORTED_MODULE_16__.Debug.drawPolygon(points, { color });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/SeparatingAxis.ts\":\n/*!***********************************************!*\\\n !*** ./Collision/Colliders/SeparatingAxis.ts ***!\n \\***********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SeparatingAxis: () => (/* binding */ SeparatingAxis),\n/* harmony export */ SeparationInfo: () => (/* binding */ SeparationInfo)\n/* harmony export */ });\n/* harmony import */ var _Math_line_segment__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/line-segment */ \"./Math/line-segment.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math/affine-matrix */ \"./Math/affine-matrix.ts\");\n/* harmony import */ var _Util_Pool__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Util/Pool */ \"./Util/Pool.ts\");\n\n\n\n\n/**\n * Specific information about a contact and it's separation\n */\nclass SeparationInfo {\n constructor() {\n /**\n * Axis of separation from the collider's perspective\n */\n this.axis = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n /**\n * Local axis of separation from the collider's perspective\n */\n this.localAxis = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n /**\n * Side of separation (reference) from the collider's perspective\n */\n this.side = new _Math_line_segment__WEBPACK_IMPORTED_MODULE_1__.LineSegment((0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0), (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0));\n /**\n * Local side of separation (reference) from the collider's perspective\n */\n this.localSide = new _Math_line_segment__WEBPACK_IMPORTED_MODULE_1__.LineSegment((0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0), (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0));\n /**\n * Point on collider B (incident point)\n */\n this.point = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n /**\n * Local point on collider B (incident point)\n */\n this.localPoint = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n }\n}\nclass SeparatingAxis {\n static findPolygonPolygonSeparation(polyA, polyB) {\n // if polyB has 0 scale we need to hop back to degenerate separation\n if (polyB.transform.matrix.determinant() === 0) {\n return SeparatingAxis.findPolygonPolygonSeparationDegenerate(polyA, polyB);\n }\n // Multi contact from SAT\n // https://gamedev.stackexchange.com/questions/111390/multiple-contacts-for-sat-collision-detection\n // do a SAT test to find a min axis if it exists\n let bestSeparation = -Number.MAX_VALUE;\n let bestSideIndex = -1;\n let localPoint;\n // Work inside polyB reference frame\n // inv polyB converts to local space from polyA world space\n const toPolyBSpace = polyB.transform.inverse.multiply(polyA.transform.matrix, SeparatingAxis._SCRATCH_MATRIX);\n const toPolyBSpaceRotation = toPolyBSpace.getRotation();\n const normalsA = polyA.normals;\n const pointsA = polyA.points;\n const pointsB = polyB.points;\n for (let pointsAIndex = 0; pointsAIndex < pointsA.length; pointsAIndex++) {\n const normal = normalsA[pointsAIndex].rotate(toPolyBSpaceRotation, SeparatingAxis._ZERO, SeparatingAxis._SCRATCH_NORMAL);\n const point = toPolyBSpace.multiply(pointsA[pointsAIndex], SeparatingAxis._SCRATCH_POINT);\n // For every point in polyB\n // We want to see how much overlap there is on the axis provided by the normal\n // We want to find the minimum overlap among all points\n let smallestPointDistance = Number.MAX_VALUE;\n let smallestLocalPoint;\n for (let pointsBIndex = 0; pointsBIndex < pointsB.length; pointsBIndex++) {\n const distance = normal.dot(pointsB[pointsBIndex].sub(point, SeparatingAxis._SCRATCH_SUB_POINT));\n if (distance < smallestPointDistance) {\n smallestPointDistance = distance;\n smallestLocalPoint = pointsB[pointsBIndex];\n }\n }\n // We take the maximum overlap as the separation between the\n // A negative separation means there were no gaps between the two shapes\n if (smallestPointDistance > bestSeparation) {\n bestSeparation = smallestPointDistance;\n bestSideIndex = pointsAIndex;\n localPoint = smallestLocalPoint;\n }\n }\n // TODO can we avoid applying world space transforms?\n const bestSide2 = (bestSideIndex + 1) % pointsA.length;\n const separationInfo = SeparatingAxis.SeparationPool.get();\n separationInfo.collider = polyA;\n separationInfo.separation = bestSeparation;\n if (bestSeparation > 0) {\n // early out because if separation is > 0 then no local point\n return separationInfo;\n }\n normalsA[bestSideIndex].clone(separationInfo.localAxis);\n normalsA[bestSideIndex].rotate(polyA.transform.rotation, SeparatingAxis._ZERO, separationInfo.axis);\n polyA.transform.matrix.multiply(pointsA[bestSideIndex], separationInfo.side.begin);\n polyA.transform.matrix.multiply(pointsA[bestSide2], separationInfo.side.end);\n polyB.transform.matrix.multiply(localPoint, separationInfo.point);\n separationInfo.sideId = bestSideIndex;\n localPoint.clone(separationInfo.localPoint);\n pointsA[bestSideIndex].clone(separationInfo.localSide.begin);\n pointsA[bestSide2].clone(separationInfo.localSide.end);\n return separationInfo;\n }\n static findCirclePolygonSeparation(circle, polygon) {\n const axes = polygon.axes;\n const pc = polygon.center;\n // Special SAT with circles\n const polyDir = pc.sub(circle.worldPos);\n const closestPointOnPoly = polygon.getFurthestPoint(polyDir.negate());\n axes.push(closestPointOnPoly.sub(circle.worldPos).normalize());\n let minOverlap = Number.MAX_VALUE;\n let minAxis = null;\n let minIndex = -1;\n for (let i = 0; i < axes.length; i++) {\n const proj1 = polygon.project(axes[i]);\n const proj2 = circle.project(axes[i]);\n const overlap = proj1.getOverlap(proj2);\n if (overlap <= 0) {\n return null;\n }\n else {\n if (overlap < minOverlap) {\n minOverlap = overlap;\n minAxis = axes[i];\n minIndex = i;\n }\n }\n }\n if (minIndex < 0) {\n return null;\n }\n return minAxis.normalize().scale(minOverlap);\n }\n static findPolygonPolygonSeparationDegenerate(polyA, polyB) {\n let bestSeparation = -Number.MAX_VALUE;\n let bestSide = null;\n let bestAxis = null;\n let bestSideIndex = -1;\n let bestOtherPoint = null;\n const sides = polyA.getSides();\n const localSides = polyA.getLocalSides();\n for (let i = 0; i < sides.length; i++) {\n const side = sides[i];\n const axis = side.normal();\n const vertB = polyB.getFurthestPoint(axis.negate());\n // Separation on side i's axis\n // We are looking for the largest separation between poly A's sides\n const vertSeparation = side.distanceToPoint(vertB, true);\n if (vertSeparation > bestSeparation) {\n bestSeparation = vertSeparation;\n bestSide = side;\n bestAxis = axis;\n bestSideIndex = i;\n bestOtherPoint = vertB;\n }\n }\n return {\n collider: polyA,\n separation: bestAxis ? bestSeparation : 99,\n axis: bestAxis,\n side: bestSide,\n localSide: localSides[bestSideIndex],\n sideId: bestSideIndex,\n point: bestOtherPoint,\n localPoint: bestAxis ? polyB.getFurthestLocalPoint(bestAxis.negate()) : null\n };\n }\n}\nSeparatingAxis.SeparationPool = new _Util_Pool__WEBPACK_IMPORTED_MODULE_2__.Pool(() => new SeparationInfo(), (i) => i, // no recycle\n500);\nSeparatingAxis._ZERO = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\nSeparatingAxis._SCRATCH_POINT = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\nSeparatingAxis._SCRATCH_SUB_POINT = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\nSeparatingAxis._SCRATCH_NORMAL = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\nSeparatingAxis._SCRATCH_MATRIX = _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_3__.AffineMatrix.identity();\nSeparatingAxis.SeparationPool.disableWarnings = true;\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/Shape.ts\":\n/*!**************************************!*\\\n !*** ./Collision/Colliders/Shape.ts ***!\n \\**************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Shape: () => (/* binding */ Shape)\n/* harmony export */ });\n/* harmony import */ var _PolygonCollider__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./PolygonCollider */ \"./Collision/Colliders/PolygonCollider.ts\");\n/* harmony import */ var _CircleCollider__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./CircleCollider */ \"./Collision/Colliders/CircleCollider.ts\");\n/* harmony import */ var _EdgeCollider__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./EdgeCollider */ \"./Collision/Colliders/EdgeCollider.ts\");\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _CompositeCollider__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../.. */ \"./Util/Log.ts\");\n\n\n\n\n\n\n\n/**\n * Excalibur helper for defining colliders quickly\n */\nclass Shape {\n /**\n * Creates a box collider, under the hood defines a {@apilink PolygonCollider} collider\n * @param width Width of the box\n * @param height Height of the box\n * @param anchor Anchor of the box (default (.5, .5)) which positions the box relative to the center of the collider's position\n * @param offset Optional offset relative to the collider in local coordinates\n */\n static Box(width, height, anchor = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Half, offset = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero) {\n return new _PolygonCollider__WEBPACK_IMPORTED_MODULE_1__.PolygonCollider({\n points: new _BoundingBox__WEBPACK_IMPORTED_MODULE_2__.BoundingBox(-width * anchor.x, -height * anchor.y, width - width * anchor.x, height - height * anchor.y).getPoints(),\n offset: offset\n });\n }\n /**\n * Creates a new {@apilink PolygonCollider | `arbitrary polygon`} collider\n *\n * PolygonColliders are useful for creating convex polygon shapes\n * @param points Points specified in counter clockwise\n * @param offset Optional offset relative to the collider in local coordinates\n */\n static Polygon(points, offset = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero, suppressConvexWarning = false) {\n return new _PolygonCollider__WEBPACK_IMPORTED_MODULE_1__.PolygonCollider({\n points: points,\n offset: offset,\n suppressConvexWarning\n });\n }\n /**\n * Creates a new {@apilink CircleCollider | `circle`} collider\n *\n * Circle colliders are useful for balls, or to make collisions more forgiving on sharp edges\n * @param radius Radius of the circle collider\n * @param offset Optional offset relative to the collider in local coordinates\n */\n static Circle(radius, offset = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero) {\n return new _CircleCollider__WEBPACK_IMPORTED_MODULE_3__.CircleCollider({\n radius: radius,\n offset: offset\n });\n }\n /**\n * Creates a new {@apilink EdgeCollider | `edge`} collider\n *\n * Edge colliders are useful for floors, walls, and other barriers\n * @param begin Beginning of the edge in local coordinates to the collider\n * @param end Ending of the edge in local coordinates to the collider\n */\n static Edge(begin, end) {\n return new _EdgeCollider__WEBPACK_IMPORTED_MODULE_4__.EdgeCollider({\n begin: begin,\n end: end\n });\n }\n /**\n * Creates a new capsule shaped {@apilink CompositeCollider} using 2 circles and a box\n *\n * Capsule colliders are useful for platformers with incline or jagged floors to have a smooth\n * player experience.\n * @param width\n * @param height\n * @param offset Optional offset\n */\n static Capsule(width, height, offset = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero) {\n const logger = ___WEBPACK_IMPORTED_MODULE_5__.Logger.getInstance();\n if (width === height) {\n logger.warn('A capsule collider with equal width and height is a circle, consider using a ex.Shape.Circle or ex.CircleCollider');\n }\n const vertical = height >= width;\n if (vertical) {\n // height > width, if equal maybe use a circle\n const capsule = new _CompositeCollider__WEBPACK_IMPORTED_MODULE_6__.CompositeCollider([\n Shape.Circle(width / 2, (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, -height / 2 + width / 2).add(offset)),\n Shape.Box(width, height - width, _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Half, offset),\n Shape.Circle(width / 2, (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, height / 2 - width / 2).add(offset))\n ]);\n return capsule;\n }\n else {\n // width > height, if equal maybe use a circle\n const capsule = new _CompositeCollider__WEBPACK_IMPORTED_MODULE_6__.CompositeCollider([\n Shape.Circle(height / 2, (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(-width / 2 + height / 2, 0).add(offset)),\n Shape.Box(width - height, height, _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Half, offset),\n Shape.Circle(height / 2, (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(width / 2 - height / 2, 0).add(offset))\n ]);\n return capsule;\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/CollisionSystem.ts\":\n/*!**************************************!*\\\n !*** ./Collision/CollisionSystem.ts ***!\n \\**************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CollisionSystem: () => (/* binding */ CollisionSystem)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Priority.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _SolverStrategy__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./SolverStrategy */ \"./Collision/SolverStrategy.ts\");\n/* harmony import */ var _Solver_ArcadeSolver__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Solver/ArcadeSolver */ \"./Collision/Solver/ArcadeSolver.ts\");\n/* harmony import */ var _Solver_RealisticSolver__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Solver/RealisticSolver */ \"./Collision/Solver/RealisticSolver.ts\");\n/* harmony import */ var _ColliderComponent__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./ColliderComponent */ \"./Collision/ColliderComponent.ts\");\n/* harmony import */ var _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Colliders/CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var _Collision_Side__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../Collision/Side */ \"./Collision/Side.ts\");\n/* harmony import */ var _Colliders_SeparatingAxis__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Colliders/SeparatingAxis */ \"./Collision/Colliders/SeparatingAxis.ts\");\n/* harmony import */ var _MotionSystem__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./MotionSystem */ \"./Collision/MotionSystem.ts\");\n/* harmony import */ var _Detection_Pair__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Detection/Pair */ \"./Collision/Detection/Pair.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass CollisionSystem extends _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.System {\n get _processor() {\n return this._physics.collisionProcessor;\n }\n constructor(world, _physics) {\n super();\n this._physics = _physics;\n this.systemType = _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.SystemType.Update;\n this._configDirty = false;\n this._lastFrameContacts = new Map();\n this._currentFrameContacts = new Map();\n this._arcadeSolver = new _Solver_ArcadeSolver__WEBPACK_IMPORTED_MODULE_1__.ArcadeSolver(_physics.config.arcade);\n this._realisticSolver = new _Solver_RealisticSolver__WEBPACK_IMPORTED_MODULE_2__.RealisticSolver(_physics.config.realistic);\n this._physics.$configUpdate.subscribe(() => (this._configDirty = true));\n this._trackCollider = (c) => this._processor.track(c);\n this._untrackCollider = (c) => this._processor.untrack(c);\n this.query = world.query([_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__.TransformComponent, _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_4__.MotionComponent, _ColliderComponent__WEBPACK_IMPORTED_MODULE_5__.ColliderComponent]);\n this.query.entityAdded$.subscribe((e) => {\n const colliderComponent = e.get(_ColliderComponent__WEBPACK_IMPORTED_MODULE_5__.ColliderComponent);\n colliderComponent.$colliderAdded.subscribe(this._trackCollider);\n colliderComponent.$colliderRemoved.subscribe(this._untrackCollider);\n const collider = colliderComponent.get();\n if (collider) {\n this._processor.track(collider);\n }\n });\n this.query.entityRemoved$.subscribe((e) => {\n const colliderComponent = e.get(_ColliderComponent__WEBPACK_IMPORTED_MODULE_5__.ColliderComponent);\n const collider = colliderComponent.get();\n if (colliderComponent && collider) {\n this._processor.untrack(collider);\n }\n });\n this._motionSystem = world.get(_MotionSystem__WEBPACK_IMPORTED_MODULE_6__.MotionSystem);\n }\n initialize(world, scene) {\n this._engine = scene.engine;\n }\n update(elapsed) {\n var _a, _b, _c, _d;\n if (!this._physics.config.enabled) {\n return;\n }\n // TODO do we need to do this every frame?\n // Collect up all the colliders and update them\n let colliders = [];\n for (let entityIndex = 0; entityIndex < this.query.entities.length; entityIndex++) {\n const entity = this.query.entities[entityIndex];\n const colliderComp = entity.get(_ColliderComponent__WEBPACK_IMPORTED_MODULE_5__.ColliderComponent);\n const collider = colliderComp === null || colliderComp === void 0 ? void 0 : colliderComp.get();\n if (colliderComp && ((_a = colliderComp.owner) === null || _a === void 0 ? void 0 : _a.isActive) && collider) {\n colliderComp.update();\n // Flatten composite colliders\n if (collider instanceof _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_7__.CompositeCollider) {\n const compositeColliders = collider.getColliders();\n if (!collider.compositeStrategy) {\n collider.compositeStrategy = this._physics.config.colliders.compositeStrategy;\n }\n colliders = colliders.concat(compositeColliders);\n }\n else {\n colliders.push(collider);\n }\n }\n }\n // Update the spatial partitioning data structures\n // TODO if collider invalid it will break the processor\n // TODO rename \"update\" to something more specific\n this._processor.update(colliders, elapsed);\n // Run broadphase on all colliders and locates potential collisions\n let pairs = this._processor.broadphase(colliders, elapsed);\n this._currentFrameContacts.clear();\n // Given possible pairs find actual contacts\n let contacts = []; // = this._processor.narrowphase(pairs, this._engine?.debug?.stats?.currFrame);\n const solver = this.getSolver();\n // Solve, this resolves the position/velocity so entities aren't overlapping\n const substep = this._physics.config.substep;\n for (let step = 0; step < substep; step++) {\n if (step > 0) {\n // first step is run by the MotionSystem when configured, so skip\n this._motionSystem.update(elapsed);\n }\n // Re-use pairs from previous collision\n if (contacts.length) {\n pairs = contacts.map((c) => new _Detection_Pair__WEBPACK_IMPORTED_MODULE_8__.Pair(c.colliderA, c.colliderB));\n }\n if (pairs.length) {\n contacts = this._processor.narrowphase(pairs, (_d = (_c = (_b = this._engine) === null || _b === void 0 ? void 0 : _b.debug) === null || _c === void 0 ? void 0 : _c.stats) === null || _d === void 0 ? void 0 : _d.currFrame);\n contacts = solver.solve(contacts);\n // Record contacts for start/end\n for (const contact of contacts) {\n if (contact.isCanceled()) {\n continue;\n }\n // Process composite ids, things with the same composite id are treated as the same collider for start/end\n const index = contact.id.indexOf('|');\n if (index > 0) {\n const compositeId = contact.id.substring(index + 1);\n this._currentFrameContacts.set(compositeId, contact);\n }\n else {\n this._currentFrameContacts.set(contact.id, contact);\n }\n }\n }\n }\n // Emit contact start/end events\n this.runContactStartEnd();\n // reset the last frame cache\n this._lastFrameContacts.clear();\n // Keep track of collisions contacts that have started or ended\n this._lastFrameContacts = new Map(this._currentFrameContacts);\n // Process deferred collider removals\n for (const entity of this.query.entities) {\n const collider = entity.get(_ColliderComponent__WEBPACK_IMPORTED_MODULE_5__.ColliderComponent);\n if (collider) {\n collider.processColliderRemoval();\n }\n }\n }\n postupdate() {\n _Colliders_SeparatingAxis__WEBPACK_IMPORTED_MODULE_9__.SeparatingAxis.SeparationPool.done();\n }\n getSolver() {\n if (this._configDirty) {\n this._configDirty = false;\n this._arcadeSolver = new _Solver_ArcadeSolver__WEBPACK_IMPORTED_MODULE_1__.ArcadeSolver(this._physics.config.arcade);\n this._realisticSolver = new _Solver_RealisticSolver__WEBPACK_IMPORTED_MODULE_2__.RealisticSolver(this._physics.config.realistic);\n }\n return this._physics.config.solver === _SolverStrategy__WEBPACK_IMPORTED_MODULE_10__.SolverStrategy.Realistic ? this._realisticSolver : this._arcadeSolver;\n }\n debug(ex) {\n this._processor.debug(ex, 0);\n }\n runContactStartEnd() {\n // If composite colliders are 'together' collisions may have a duplicate id because we want to treat those as a singular start/end\n for (const [id, c] of this._currentFrameContacts) {\n // find all new contacts\n if (!this._lastFrameContacts.has(id)) {\n const colliderA = c.colliderA;\n const colliderB = c.colliderB;\n const side = _Collision_Side__WEBPACK_IMPORTED_MODULE_11__.Side.fromDirection(c.mtv);\n const opposite = _Collision_Side__WEBPACK_IMPORTED_MODULE_11__.Side.getOpposite(side);\n colliderA.events.emit('collisionstart', new _Events__WEBPACK_IMPORTED_MODULE_12__.CollisionStartEvent(colliderA, colliderB, side, c));\n colliderA.events.emit('contactstart', new _Events__WEBPACK_IMPORTED_MODULE_12__.ContactStartEvent(colliderA, colliderB, side, c));\n colliderB.events.emit('collisionstart', new _Events__WEBPACK_IMPORTED_MODULE_12__.CollisionStartEvent(colliderB, colliderA, opposite, c));\n colliderB.events.emit('contactstart', new _Events__WEBPACK_IMPORTED_MODULE_12__.ContactStartEvent(colliderB, colliderA, opposite, c));\n }\n }\n // find all contacts that have ceased\n for (const [id, c] of this._lastFrameContacts) {\n if (!this._currentFrameContacts.has(id)) {\n const colliderA = c.colliderA;\n const colliderB = c.colliderB;\n const side = _Collision_Side__WEBPACK_IMPORTED_MODULE_11__.Side.fromDirection(c.mtv);\n const opposite = _Collision_Side__WEBPACK_IMPORTED_MODULE_11__.Side.getOpposite(side);\n colliderA.events.emit('collisionend', new _Events__WEBPACK_IMPORTED_MODULE_12__.CollisionEndEvent(colliderA, colliderB, side, c));\n colliderA.events.emit('contactend', new _Events__WEBPACK_IMPORTED_MODULE_12__.ContactEndEvent(colliderA, colliderB, side, c));\n colliderB.events.emit('collisionend', new _Events__WEBPACK_IMPORTED_MODULE_12__.CollisionEndEvent(colliderB, colliderA, opposite, c));\n colliderB.events.emit('contactend', new _Events__WEBPACK_IMPORTED_MODULE_12__.ContactEndEvent(colliderB, colliderA, opposite, c));\n }\n }\n }\n}\nCollisionSystem.priority = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_13__.SystemPriority.Higher;\n\n\n/***/ }),\n\n/***/ \"./Collision/CollisionType.ts\":\n/*!************************************!*\\\n !*** ./Collision/CollisionType.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CollisionType: () => (/* binding */ CollisionType)\n/* harmony export */ });\n/**\n * An enum that describes the types of collisions bodies can participate in\n */\nvar CollisionType;\n(function (CollisionType) {\n /**\n * Bodies with the `PreventCollision` setting do not participate in any\n * collisions and do not raise collision events.\n */\n CollisionType[\"PreventCollision\"] = \"PreventCollision\";\n /**\n * Bodies with the `Passive` setting only raise collision events, but are not\n * influenced or moved by other bodies and do not influence or move other bodies.\n * This is useful for use in trigger type behavior.\n */\n CollisionType[\"Passive\"] = \"Passive\";\n /**\n * Bodies with the `Active` setting raise collision events and participate\n * in collisions with other bodies and will be push or moved by bodies sharing\n * the `Active` or `Fixed` setting.\n */\n CollisionType[\"Active\"] = \"Active\";\n /**\n * Bodies with the `Fixed` setting raise collision events and participate in\n * collisions with other bodies. Actors with the `Fixed` setting will not be\n * pushed or moved by other bodies sharing the `Fixed`. Think of Fixed\n * bodies as \"immovable/unstoppable\" objects. If two `Fixed` bodies meet they will\n * not be pushed or moved by each other, they will not interact except to throw\n * collision events.\n */\n CollisionType[\"Fixed\"] = \"Fixed\";\n})(CollisionType || (CollisionType = {}));\n\n\n/***/ }),\n\n/***/ \"./Collision/Detection/CollisionContact.ts\":\n/*!*************************************************!*\\\n !*** ./Collision/Detection/CollisionContact.ts ***!\n \\*************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CollisionContact: () => (/* binding */ CollisionContact)\n/* harmony export */ });\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Pair__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Pair */ \"./Collision/Detection/Pair.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../BodyComponent */ \"./Collision/BodyComponent.ts\");\n\n\n\n/**\n * Collision contacts are used internally by Excalibur to resolve collision between colliders. This\n * Pair prevents collisions from being evaluated more than one time\n */\nclass CollisionContact {\n constructor(colliderA, colliderB, mtv, normal, tangent, points, localPoints, info) {\n var _a, _b, _c, _d, _e, _f;\n this._canceled = false;\n this.bodyA = null;\n this.bodyB = null;\n this.colliderA = colliderA;\n this.colliderB = colliderB;\n this.mtv = mtv;\n this.normal = normal;\n this.tangent = tangent;\n this.points = points;\n this.localPoints = localPoints;\n this.info = info;\n this.id = _Pair__WEBPACK_IMPORTED_MODULE_0__.Pair.calculatePairHash(colliderA.id, colliderB.id);\n if (colliderA.composite || colliderB.composite) {\n // Add on the parent composite pair for start/end contact if 'together\n const colliderAId = ((_a = colliderA.composite) === null || _a === void 0 ? void 0 : _a.compositeStrategy) === 'separate' ? colliderA.id : (_c = (_b = colliderA.composite) === null || _b === void 0 ? void 0 : _b.id) !== null && _c !== void 0 ? _c : colliderA.id;\n const colliderBId = ((_d = colliderB.composite) === null || _d === void 0 ? void 0 : _d.compositeStrategy) === 'separate' ? colliderB.id : (_f = (_e = colliderB.composite) === null || _e === void 0 ? void 0 : _e.id) !== null && _f !== void 0 ? _f : colliderB.id;\n this.id += '|' + _Pair__WEBPACK_IMPORTED_MODULE_0__.Pair.calculatePairHash(colliderAId, colliderBId);\n }\n if (this.colliderA.owner) {\n this.bodyA = this.colliderA.owner.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_1__.BodyComponent);\n }\n if (this.colliderB.owner) {\n this.bodyB = this.colliderB.owner.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_1__.BodyComponent);\n }\n }\n /**\n * Match contact awake state, except if body's are Fixed\n */\n matchAwake() {\n const bodyA = this.bodyA;\n const bodyB = this.bodyB;\n if (bodyA && bodyB) {\n if (bodyA.isSleeping !== bodyB.isSleeping) {\n if (bodyA.isSleeping && bodyA.collisionType !== _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.Fixed && bodyB.sleepMotion >= bodyA.wakeThreshold) {\n bodyA.isSleeping = false;\n }\n if (bodyB.isSleeping && bodyB.collisionType !== _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.Fixed && bodyA.sleepMotion >= bodyB.wakeThreshold) {\n bodyB.isSleeping = false;\n }\n }\n }\n }\n isCanceled() {\n return this._canceled;\n }\n cancel() {\n this._canceled = true;\n }\n /**\n * Biases the contact so that the given collider is colliderA\n */\n bias(collider) {\n if (collider !== this.colliderA && collider !== this.colliderB) {\n throw new Error('Collider must be either colliderA or colliderB from this contact');\n }\n if (collider === this.colliderA) {\n return this;\n }\n const colliderA = this.colliderA;\n const colliderB = this.colliderB;\n this.colliderB = colliderA;\n this.colliderA = colliderB;\n this.mtv = this.mtv.negate();\n this.normal = this.normal.negate();\n this.tangent = this.tangent.negate();\n return this;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Detection/DynamicTree.ts\":\n/*!********************************************!*\\\n !*** ./Collision/Detection/DynamicTree.ts ***!\n \\********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DynamicTree: () => (/* binding */ DynamicTree),\n/* harmony export */ TreeNode: () => (/* binding */ TreeNode)\n/* harmony export */ });\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../.. */ \"./Color.ts\");\n\n\n\n\n/**\n * Dynamic Tree Node used for tracking bounds within the tree\n */\nclass TreeNode {\n constructor(parent) {\n this.parent = parent;\n this.parent = parent || null;\n this.data = null;\n this.bounds = new _BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox();\n this.left = null;\n this.right = null;\n this.height = 0;\n }\n isLeaf() {\n return !this.left && !this.right;\n }\n}\n/**\n * The DynamicTrees provides a spatial partitioning data structure for quickly querying for overlapping bounding boxes for\n * all tracked bodies. The worst case performance of this is O(n*log(n)) where n is the number of bodies in the tree.\n *\n * Internally the bounding boxes are organized as a balanced binary tree of bounding boxes, where the leaf nodes are tracked bodies.\n * Every non-leaf node is a bounding box that contains child bounding boxes.\n */\nclass DynamicTree {\n constructor(_config, worldBounds = new _BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox(-Number.MAX_VALUE, -Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE)) {\n this._config = _config;\n this.worldBounds = worldBounds;\n this.root = null;\n this.nodes = {};\n }\n /**\n * Inserts a node into the dynamic tree\n */\n _insert(leaf) {\n // If there are no nodes in the tree, make this the root leaf\n if (this.root === null) {\n this.root = leaf;\n this.root.parent = null;\n return;\n }\n // Search the tree for a node that is not a leaf and find the best place to insert\n const leafAABB = leaf.bounds;\n let currentRoot = this.root;\n while (!currentRoot.isLeaf()) {\n const left = currentRoot.left;\n const right = currentRoot.right;\n const area = currentRoot.bounds.getPerimeter();\n const combinedAABB = currentRoot.bounds.combine(leafAABB);\n const combinedArea = combinedAABB.getPerimeter();\n // Calculate cost heuristic for creating a new parent and leaf\n const cost = 2 * combinedArea;\n // Minimum cost of pushing the leaf down the tree\n const inheritanceCost = 2 * (combinedArea - area);\n // Cost of descending\n let leftCost = 0;\n const leftCombined = leafAABB.combine(left.bounds);\n let newArea;\n let oldArea;\n if (left.isLeaf()) {\n leftCost = leftCombined.getPerimeter() + inheritanceCost;\n }\n else {\n oldArea = left.bounds.getPerimeter();\n newArea = leftCombined.getPerimeter();\n leftCost = newArea - oldArea + inheritanceCost;\n }\n let rightCost = 0;\n const rightCombined = leafAABB.combine(right.bounds);\n if (right.isLeaf()) {\n rightCost = rightCombined.getPerimeter() + inheritanceCost;\n }\n else {\n oldArea = right.bounds.getPerimeter();\n newArea = rightCombined.getPerimeter();\n rightCost = newArea - oldArea + inheritanceCost;\n }\n // cost is acceptable\n if (cost < leftCost && cost < rightCost) {\n break;\n }\n // Descend to the depths\n if (leftCost < rightCost) {\n currentRoot = left;\n }\n else {\n currentRoot = right;\n }\n }\n // Create the new parent node and insert into the tree\n const oldParent = currentRoot.parent;\n const newParent = new TreeNode(oldParent);\n newParent.bounds = leafAABB.combine(currentRoot.bounds);\n newParent.height = currentRoot.height + 1;\n if (oldParent !== null) {\n // The sibling node was not the root\n if (oldParent.left === currentRoot) {\n oldParent.left = newParent;\n }\n else {\n oldParent.right = newParent;\n }\n newParent.left = currentRoot;\n newParent.right = leaf;\n currentRoot.parent = newParent;\n leaf.parent = newParent;\n }\n else {\n // The sibling node was the root\n newParent.left = currentRoot;\n newParent.right = leaf;\n currentRoot.parent = newParent;\n leaf.parent = newParent;\n this.root = newParent;\n }\n // Walk up the tree fixing heights and AABBs\n let currentNode = leaf.parent;\n while (currentNode) {\n currentNode = this._balance(currentNode);\n if (!currentNode.left) {\n throw new Error('Parent of current leaf cannot have a null left child' + currentNode);\n }\n if (!currentNode.right) {\n throw new Error('Parent of current leaf cannot have a null right child' + currentNode);\n }\n currentNode.height = 1 + Math.max(currentNode.left.height, currentNode.right.height);\n currentNode.bounds = currentNode.left.bounds.combine(currentNode.right.bounds);\n currentNode = currentNode.parent;\n }\n }\n /**\n * Removes a node from the dynamic tree\n */\n _remove(leaf) {\n if (leaf === this.root) {\n this.root = null;\n return;\n }\n const parent = leaf.parent;\n const grandParent = parent.parent;\n let sibling;\n if (parent.left === leaf) {\n sibling = parent.right;\n }\n else {\n sibling = parent.left;\n }\n if (grandParent) {\n if (grandParent.left === parent) {\n grandParent.left = sibling;\n }\n else {\n grandParent.right = sibling;\n }\n sibling.parent = grandParent;\n let currentNode = grandParent;\n while (currentNode) {\n currentNode = this._balance(currentNode);\n currentNode.bounds = currentNode.left.bounds.combine(currentNode.right.bounds);\n currentNode.height = 1 + Math.max(currentNode.left.height, currentNode.right.height);\n currentNode = currentNode.parent;\n }\n }\n else {\n this.root = sibling;\n sibling.parent = null;\n }\n }\n /**\n * Tracks a body in the dynamic tree\n */\n trackCollider(collider) {\n const node = new TreeNode();\n node.data = collider;\n node.bounds = collider.bounds;\n node.bounds.left -= 2;\n node.bounds.top -= 2;\n node.bounds.right += 2;\n node.bounds.bottom += 2;\n this.nodes[collider.id.value] = node;\n this._insert(node);\n }\n /**\n * Updates the dynamic tree given the current bounds of each body being tracked\n */\n updateCollider(collider) {\n var _a;\n const node = this.nodes[collider.id.value];\n if (!node) {\n return false;\n }\n const b = collider.bounds;\n // if the body is outside the world no longer update it\n if (!this.worldBounds.contains(b)) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance().warn('Collider with id ' + collider.id.value + ' is outside the world bounds and will no longer be tracked for physics');\n this.untrackCollider(collider);\n return false;\n }\n if (node.bounds.contains(b)) {\n return false;\n }\n this._remove(node);\n b.left -= this._config.boundsPadding;\n b.top -= this._config.boundsPadding;\n b.right += this._config.boundsPadding;\n b.bottom += this._config.boundsPadding;\n // THIS IS CAUSING UNNECESSARY CHECKS\n if (collider.owner) {\n const body = (_a = collider.owner) === null || _a === void 0 ? void 0 : _a.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_2__.BodyComponent);\n if (body) {\n const multdx = ((body.vel.x * 32) / 1000) * this._config.velocityMultiplier;\n const multdy = ((body.vel.y * 32) / 1000) * this._config.velocityMultiplier;\n if (multdx < 0) {\n b.left += multdx;\n }\n else {\n b.right += multdx;\n }\n if (multdy < 0) {\n b.top += multdy;\n }\n else {\n b.bottom += multdy;\n }\n }\n }\n node.bounds = b;\n this._insert(node);\n return true;\n }\n /**\n * Untracks a body from the dynamic tree\n */\n untrackCollider(collider) {\n const node = this.nodes[collider.id.value];\n if (!node) {\n return;\n }\n this._remove(node);\n this.nodes[collider.id.value] = null;\n delete this.nodes[collider.id.value];\n }\n /**\n * Balances the tree about a node\n */\n _balance(node) {\n if (node === null) {\n throw new Error('Cannot balance at null node');\n }\n if (node.isLeaf() || node.height < 2) {\n return node;\n }\n const left = node.left;\n const right = node.right;\n const a = node;\n const b = left;\n const c = right;\n const d = left.left;\n const e = left.right;\n const f = right.left;\n const g = right.right;\n const balance = c.height - b.height;\n // Rotate c node up\n if (balance > 1) {\n // Swap the right node with it's parent\n c.left = a;\n c.parent = a.parent;\n a.parent = c;\n // The original node's old parent should point to the right node\n // this is mega confusing\n if (c.parent) {\n if (c.parent.left === a) {\n c.parent.left = c;\n }\n else {\n c.parent.right = c;\n }\n }\n else {\n this.root = c;\n }\n // Rotate\n if (f.height > g.height) {\n c.right = f;\n a.right = g;\n g.parent = a;\n a.bounds = b.bounds.combine(g.bounds);\n c.bounds = a.bounds.combine(f.bounds);\n a.height = 1 + Math.max(b.height, g.height);\n c.height = 1 + Math.max(a.height, f.height);\n }\n else {\n c.right = g;\n a.right = f;\n f.parent = a;\n a.bounds = b.bounds.combine(f.bounds);\n c.bounds = a.bounds.combine(g.bounds);\n a.height = 1 + Math.max(b.height, f.height);\n c.height = 1 + Math.max(a.height, g.height);\n }\n return c;\n }\n // Rotate left node up\n if (balance < -1) {\n // swap\n b.left = a;\n b.parent = a.parent;\n a.parent = b;\n // node's old parent should point to b\n if (b.parent) {\n if (b.parent.left === a) {\n b.parent.left = b;\n }\n else {\n if (b.parent.right !== a) {\n throw 'Error rotating Dynamic Tree';\n }\n b.parent.right = b;\n }\n }\n else {\n this.root = b;\n }\n // rotate\n if (d.height > e.height) {\n b.right = d;\n a.left = e;\n e.parent = a;\n a.bounds = c.bounds.combine(e.bounds);\n b.bounds = a.bounds.combine(d.bounds);\n a.height = 1 + Math.max(c.height, e.height);\n b.height = 1 + Math.max(a.height, d.height);\n }\n else {\n b.right = e;\n a.left = d;\n d.parent = a;\n a.bounds = c.bounds.combine(d.bounds);\n b.bounds = a.bounds.combine(e.bounds);\n a.height = 1 + Math.max(c.height, d.height);\n b.height = 1 + Math.max(a.height, e.height);\n }\n return b;\n }\n return node;\n }\n /**\n * Returns the internal height of the tree, shorter trees are better. Performance drops as the tree grows\n */\n getHeight() {\n if (this.root === null) {\n return 0;\n }\n return this.root.height;\n }\n /**\n * Queries the Dynamic Axis Aligned Tree for bodies that could be colliding with the provided body.\n *\n * In the query callback, it will be passed a potential collider. Returning true from this callback indicates\n * that you are complete with your query and you do not want to continue. Returning false will continue searching\n * the tree until all possible colliders have been returned.\n */\n query(collider, callback) {\n const bounds = collider.bounds;\n const helper = (currentNode) => {\n if (currentNode && currentNode.bounds.overlaps(bounds)) {\n if (currentNode.isLeaf() && currentNode.data !== collider) {\n if (callback.call(collider, currentNode.data)) {\n return true;\n }\n }\n else {\n return helper(currentNode.left) || helper(currentNode.right);\n }\n }\n return false;\n };\n helper(this.root);\n }\n /**\n * Queries the Dynamic Axis Aligned Tree for bodies that could be intersecting. By default the raycast query uses an infinitely\n * long ray to test the tree specified by `max`.\n *\n * In the query callback, it will be passed a potential body that intersects with the raycast. Returning true from this\n * callback indicates that your are complete with your query and do not want to continue. Return false will continue searching\n * the tree until all possible bodies that would intersect with the ray have been returned.\n */\n rayCastQuery(ray, max = Infinity, callback) {\n const helper = (currentNode) => {\n if (currentNode && currentNode.bounds.rayCast(ray, max)) {\n if (currentNode.isLeaf()) {\n if (callback.call(ray, currentNode.data)) {\n // ray hit a leaf! return the body\n return true;\n }\n }\n else {\n // ray hit but not at a leaf, recurse deeper\n return helper(currentNode.left) || helper(currentNode.right);\n }\n }\n return false; // ray missed\n };\n helper(this.root);\n }\n getNodes() {\n const helper = (currentNode) => {\n if (currentNode) {\n return [currentNode].concat(helper(currentNode.left), helper(currentNode.right));\n }\n else {\n return [];\n }\n };\n return helper(this.root);\n }\n debug(ex) {\n // draw all the nodes in the Dynamic Tree\n const helper = (currentNode) => {\n if (currentNode) {\n if (currentNode.isLeaf()) {\n currentNode.bounds.draw(ex, ___WEBPACK_IMPORTED_MODULE_3__.Color.Green);\n }\n else {\n currentNode.bounds.draw(ex, ___WEBPACK_IMPORTED_MODULE_3__.Color.White);\n }\n if (currentNode.left) {\n helper(currentNode.left);\n }\n if (currentNode.right) {\n helper(currentNode.right);\n }\n }\n };\n helper(this.root);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Detection/DynamicTreeCollisionProcessor.ts\":\n/*!**************************************************************!*\\\n !*** ./Collision/Detection/DynamicTreeCollisionProcessor.ts ***!\n \\**************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DynamicTreeCollisionProcessor: () => (/* binding */ DynamicTreeCollisionProcessor)\n/* harmony export */ });\n/* harmony import */ var _DynamicTree__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./DynamicTree */ \"./Collision/Detection/DynamicTree.ts\");\n/* harmony import */ var _Pair__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Pair */ \"./Collision/Detection/Pair.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math_ray__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../Math/ray */ \"./Math/ray.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Colliders/CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Group/CollisionGroup */ \"./Collision/Group/CollisionGroup.ts\");\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Id__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Id */ \"./Id.ts\");\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Responsible for performing the collision broadphase (locating potential collisions) and\n * the narrowphase (actual collision contacts)\n */\nclass DynamicTreeCollisionProcessor {\n constructor(_config) {\n this._config = _config;\n this._pairs = new Set();\n this._collisionPairCache = [];\n this._colliders = [];\n this._dynamicCollisionTree = new _DynamicTree__WEBPACK_IMPORTED_MODULE_0__.DynamicTree(_config.dynamicTree);\n }\n getColliders() {\n return this._colliders;\n }\n query(pointOrBounds) {\n const results = [];\n if (pointOrBounds instanceof _BoundingBox__WEBPACK_IMPORTED_MODULE_1__.BoundingBox) {\n this._dynamicCollisionTree.query({\n id: (0,_Id__WEBPACK_IMPORTED_MODULE_2__.createId)('collider', -1),\n owner: null,\n bounds: pointOrBounds\n }, (other) => {\n results.push(other);\n return false;\n });\n }\n else {\n this._dynamicCollisionTree.query({\n id: (0,_Id__WEBPACK_IMPORTED_MODULE_2__.createId)('collider', -1),\n owner: null,\n bounds: new _BoundingBox__WEBPACK_IMPORTED_MODULE_1__.BoundingBox(pointOrBounds.x, pointOrBounds.y, pointOrBounds.x, pointOrBounds.y)\n }, (other) => {\n results.push(other);\n return false;\n });\n }\n return results;\n }\n rayCast(ray, options) {\n var _a, _b, _c;\n const results = [];\n const maxDistance = (_a = options === null || options === void 0 ? void 0 : options.maxDistance) !== null && _a !== void 0 ? _a : Infinity;\n const collisionGroup = options === null || options === void 0 ? void 0 : options.collisionGroup;\n const collisionMask = !collisionGroup ? (_b = options === null || options === void 0 ? void 0 : options.collisionMask) !== null && _b !== void 0 ? _b : _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_3__.CollisionGroup.All.category : collisionGroup.category;\n const searchAllColliders = (_c = options === null || options === void 0 ? void 0 : options.searchAllColliders) !== null && _c !== void 0 ? _c : false;\n this._dynamicCollisionTree.rayCastQuery(ray, maxDistance, (collider) => {\n const owner = collider.owner;\n const maybeBody = owner.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_4__.BodyComponent);\n if ((options === null || options === void 0 ? void 0 : options.ignoreCollisionGroupAll) && maybeBody.group === _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_3__.CollisionGroup.All) {\n return false;\n }\n const canCollide = (collisionMask & maybeBody.group.category) !== 0;\n // Early exit if not the right group\n if ((maybeBody === null || maybeBody === void 0 ? void 0 : maybeBody.group) && !canCollide) {\n return false;\n }\n const hit = collider.rayCast(ray, maxDistance);\n if (hit) {\n if (options === null || options === void 0 ? void 0 : options.filter) {\n if (options.filter(hit)) {\n results.push(hit);\n if (!searchAllColliders) {\n // returning true exits the search\n return true;\n }\n }\n }\n else {\n results.push(hit);\n if (!searchAllColliders) {\n // returning true exits the search\n return true;\n }\n }\n }\n return false;\n });\n return results;\n }\n /**\n * Tracks a physics body for collisions\n */\n track(target) {\n if (!target) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_5__.Logger.getInstance().warn('Cannot track null collider');\n return;\n }\n if (target instanceof _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_6__.CompositeCollider) {\n const colliders = target.getColliders();\n for (const c of colliders) {\n c.owner = target.owner;\n this._colliders.push(c);\n this._dynamicCollisionTree.trackCollider(c);\n }\n }\n else {\n this._colliders.push(target);\n this._dynamicCollisionTree.trackCollider(target);\n }\n }\n /**\n * Untracks a physics body\n */\n untrack(target) {\n if (!target) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_5__.Logger.getInstance().warn('Cannot untrack a null collider');\n return;\n }\n if (target instanceof _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_6__.CompositeCollider) {\n const colliders = target.getColliders();\n for (const c of colliders) {\n const index = this._colliders.indexOf(c);\n if (index !== -1) {\n this._colliders.splice(index, 1);\n }\n this._dynamicCollisionTree.untrackCollider(c);\n }\n }\n else {\n const index = this._colliders.indexOf(target);\n if (index !== -1) {\n this._colliders.splice(index, 1);\n }\n this._dynamicCollisionTree.untrackCollider(target);\n }\n }\n _pairExists(colliderA, colliderB) {\n // if the collision pair has been calculated already short circuit\n const hash = _Pair__WEBPACK_IMPORTED_MODULE_7__.Pair.calculatePairHash(colliderA.id, colliderB.id);\n return this._pairs.has(hash);\n }\n /**\n * Detects potential collision pairs in a broadphase approach with the dynamic AABB tree strategy\n */\n broadphase(targets, elapsed, stats) {\n const seconds = elapsed / 1000;\n // Retrieve the list of potential colliders, exclude killed, prevented, and self\n const potentialColliders = targets.filter((other) => {\n var _a, _b;\n const body = (_a = other.owner) === null || _a === void 0 ? void 0 : _a.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_4__.BodyComponent);\n return ((_b = other.owner) === null || _b === void 0 ? void 0 : _b.isActive) && body.collisionType !== _CollisionType__WEBPACK_IMPORTED_MODULE_8__.CollisionType.PreventCollision;\n });\n // clear old list of collision pairs\n this._collisionPairCache = [];\n this._pairs.clear();\n // check for normal collision pairs\n let collider;\n for (let j = 0, l = potentialColliders.length; j < l; j++) {\n collider = potentialColliders[j];\n // Query the collision tree for potential colliders\n this._dynamicCollisionTree.query(collider, (other) => {\n if (!this._pairExists(collider, other) && _Pair__WEBPACK_IMPORTED_MODULE_7__.Pair.canCollide(collider, other)) {\n const pair = new _Pair__WEBPACK_IMPORTED_MODULE_7__.Pair(collider, other);\n this._pairs.add(pair.id);\n this._collisionPairCache.push(pair);\n }\n // Always return false, to query whole tree. Returning true in the query method stops searching\n return false;\n });\n }\n if (stats) {\n stats.physics.pairs = this._collisionPairCache.length;\n }\n // Check dynamic tree for fast moving objects\n // Fast moving objects are those moving at least there smallest bound per frame\n if (this._config.continuous.checkForFastBodies) {\n for (const collider of potentialColliders) {\n const body = collider.owner.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_4__.BodyComponent);\n // Skip non-active objects. Does not make sense on other collision types\n if (body.collisionType !== _CollisionType__WEBPACK_IMPORTED_MODULE_8__.CollisionType.Active) {\n continue;\n }\n // Maximum travel distance next frame\n const updateDistance = body.vel.magnitude * seconds + // velocity term\n body.acc.magnitude * 0.5 * seconds * seconds; // acc term\n // Find the minimum dimension\n const minDimension = Math.min(collider.bounds.height, collider.bounds.width);\n if (this._config.continuous.disableMinimumSpeedForFastBody || updateDistance > minDimension / 2) {\n if (stats) {\n stats.physics.fastBodies++;\n }\n // start with the oldPos because the integration for actors has already happened\n // objects resting on a surface may be slightly penetrating in the current position\n const updateVec = body.globalPos.sub(body.oldPos);\n const centerPoint = collider.center;\n const furthestPoint = collider.getFurthestPoint(body.vel);\n const origin = furthestPoint.sub(updateVec);\n const ray = new _Math_ray__WEBPACK_IMPORTED_MODULE_9__.Ray(origin, body.vel);\n // back the ray up by -2x surfaceEpsilon to account for fast moving objects starting on the surface\n ray.pos = ray.pos.add(ray.dir.scale(-2 * this._config.continuous.surfaceEpsilon));\n let minCollider;\n let minTranslate = new _Math_vector__WEBPACK_IMPORTED_MODULE_10__.Vector(Infinity, Infinity);\n this._dynamicCollisionTree.rayCastQuery(ray, updateDistance + this._config.continuous.surfaceEpsilon * 2, (other) => {\n if (!this._pairExists(collider, other) && _Pair__WEBPACK_IMPORTED_MODULE_7__.Pair.canCollide(collider, other)) {\n const hit = other.rayCast(ray, updateDistance + this._config.continuous.surfaceEpsilon * 10);\n if (hit) {\n const translate = hit.point.sub(origin);\n if (translate.magnitude < minTranslate.magnitude) {\n minTranslate = translate;\n minCollider = other;\n }\n }\n }\n return false;\n });\n if (minCollider && _Math_vector__WEBPACK_IMPORTED_MODULE_10__.Vector.isValid(minTranslate)) {\n const pair = new _Pair__WEBPACK_IMPORTED_MODULE_7__.Pair(collider, minCollider);\n if (!this._pairs.has(pair.id)) {\n this._pairs.add(pair.id);\n this._collisionPairCache.push(pair);\n }\n // move the fast moving object to the other body\n // need to push into the surface by ex.Physics.surfaceEpsilon\n const shift = centerPoint.sub(furthestPoint);\n body.globalPos = origin\n .add(shift)\n .add(minTranslate)\n .add(ray.dir.scale(10 * this._config.continuous.surfaceEpsilon)); // needed to push the shape slightly into contact\n collider.update(body.transform.get());\n if (stats) {\n stats.physics.fastBodyCollisions++;\n }\n }\n }\n }\n }\n // return cache\n return this._collisionPairCache;\n }\n /**\n * Applies narrow phase on collision pairs to find actual area intersections\n * Adds actual colliding pairs to stats' Frame data\n */\n narrowphase(pairs, stats) {\n let contacts = [];\n for (let i = 0; i < pairs.length; i++) {\n const newContacts = pairs[i].collide();\n contacts = contacts.concat(newContacts);\n if (stats && newContacts.length > 0) {\n for (const c of newContacts) {\n stats.physics.contacts.set(c.id, c);\n }\n }\n }\n if (stats) {\n stats.physics.collisions += contacts.length;\n }\n return contacts;\n }\n /**\n * Update the dynamic tree positions\n */\n update(targets) {\n let updated = 0;\n const len = targets.length;\n for (let i = 0; i < len; i++) {\n if (this._dynamicCollisionTree.updateCollider(targets[i])) {\n updated++;\n }\n }\n return updated;\n }\n debug(ex) {\n this._dynamicCollisionTree.debug(ex);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Detection/Pair.ts\":\n/*!*************************************!*\\\n !*** ./Collision/Detection/Pair.ts ***!\n \\*************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Pair: () => (/* binding */ Pair)\n/* harmony export */ });\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../BodyComponent */ \"./Collision/BodyComponent.ts\");\n\n\n/**\n * Models a potential collision between 2 colliders\n */\nclass Pair {\n constructor(colliderA, colliderB) {\n this.colliderA = colliderA;\n this.colliderB = colliderB;\n this.id = null;\n this.id = Pair.calculatePairHash(colliderA.id, colliderB.id);\n }\n /**\n * Returns whether a it is allowed for 2 colliders in a Pair to collide\n * @param colliderA\n * @param colliderB\n */\n static canCollide(colliderA, colliderB) {\n var _a, _b;\n // Prevent self collision\n if (colliderA.id === colliderB.id) {\n return false;\n }\n // Colliders with the same owner do not collide (composite colliders)\n if (colliderA.owner && colliderB.owner && colliderA.owner.id === colliderB.owner.id) {\n return false;\n }\n // if the pair has a member with zero dimension don't collide\n if (colliderA.localBounds.hasZeroDimensions() || colliderB.localBounds.hasZeroDimensions()) {\n return false;\n }\n const bodyA = (_a = colliderA === null || colliderA === void 0 ? void 0 : colliderA.owner) === null || _a === void 0 ? void 0 : _a.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_0__.BodyComponent);\n const bodyB = (_b = colliderB === null || colliderB === void 0 ? void 0 : colliderB.owner) === null || _b === void 0 ? void 0 : _b.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_0__.BodyComponent);\n // Body's needed for collision in the current state\n // TODO can we collide without a body?\n if (!bodyA || !bodyB) {\n return false;\n }\n // If both are in the same collision group short circuit\n if (!bodyA.group.canCollide(bodyB.group)) {\n return false;\n }\n // if both are fixed short circuit\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_1__.CollisionType.Fixed && bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_1__.CollisionType.Fixed) {\n return false;\n }\n // if the either is prevent collision short circuit\n if (bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_1__.CollisionType.PreventCollision || bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_1__.CollisionType.PreventCollision) {\n return false;\n }\n // if either is dead short circuit\n if (!bodyA.isActive || !bodyB.isActive) {\n return false;\n }\n return true;\n }\n /**\n * Returns whether or not it is possible for the pairs to collide\n */\n get canCollide() {\n const colliderA = this.colliderA;\n const colliderB = this.colliderB;\n return Pair.canCollide(colliderA, colliderB);\n }\n /**\n * Runs the collision intersection logic on the members of this pair\n */\n collide() {\n return this.colliderA.collide(this.colliderB);\n }\n /**\n * Check if the collider is part of the pair\n * @param collider\n */\n hasCollider(collider) {\n return collider === this.colliderA || collider === this.colliderB;\n }\n /**\n * Calculates the unique pair hash id for this collision pair (owning id)\n */\n static calculatePairHash(idA, idB) {\n if (idA.value < idB.value) {\n return `#${idA.value}+${idB.value}`;\n }\n else {\n return `#${idB.value}+${idA.value}`;\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Detection/QuadTree.ts\":\n/*!*****************************************!*\\\n !*** ./Collision/Detection/QuadTree.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ QuadTree: () => (/* binding */ QuadTree)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Color */ \"./Color.ts\");\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n\n\n/**\n * QuadTree spatial data structure. Useful for quickly retrieving all objects that might\n * be in a specific location.\n */\nclass QuadTree {\n constructor(bounds, options) {\n this.bounds = bounds;\n this.options = options;\n this._defaultOptions = {\n maxDepth: 10,\n capacity: 10,\n level: 0\n };\n this.items = [];\n this._isDivided = false;\n this.topLeft = null;\n this.topRight = null;\n this.bottomLeft = null;\n this.bottomRight = null;\n this.options = { ...this._defaultOptions, ...options };\n this.halfWidth = bounds.width / 2;\n this.halfHeight = bounds.height / 2;\n }\n /**\n * Splits the quad tree one level deeper\n */\n _split() {\n this._isDivided = true;\n const newLevelOptions = {\n maxDepth: this.options.maxDepth,\n capacity: this.options.capacity,\n level: this.options.level + 1\n };\n this.topLeft = new QuadTree(new _BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox({\n left: this.bounds.left,\n top: this.bounds.top,\n right: this.bounds.left + this.halfWidth,\n bottom: this.bounds.top + this.halfHeight\n }), newLevelOptions);\n this.topRight = new QuadTree(new _BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox({\n left: this.bounds.left + this.halfWidth,\n top: this.bounds.top,\n right: this.bounds.right,\n bottom: this.bounds.top + this.halfHeight\n }), newLevelOptions);\n this.bottomLeft = new QuadTree(new _BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox({\n left: this.bounds.left,\n top: this.bounds.top + this.halfHeight,\n right: this.bounds.left + this.halfWidth,\n bottom: this.bounds.bottom\n }), newLevelOptions);\n this.bottomRight = new QuadTree(new _BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox({\n left: this.bounds.left + this.halfWidth,\n top: this.bounds.top + this.halfHeight,\n right: this.bounds.right,\n bottom: this.bounds.bottom\n }), newLevelOptions);\n }\n _insertIntoSubNodes(item) {\n var _a, _b, _c, _d;\n if ((_a = this.topLeft) === null || _a === void 0 ? void 0 : _a.bounds.overlaps(item.bounds)) {\n this.topLeft.insert(item);\n }\n if ((_b = this.topRight) === null || _b === void 0 ? void 0 : _b.bounds.overlaps(item.bounds)) {\n this.topRight.insert(item);\n }\n if ((_c = this.bottomLeft) === null || _c === void 0 ? void 0 : _c.bounds.overlaps(item.bounds)) {\n this.bottomLeft.insert(item);\n }\n if ((_d = this.bottomRight) === null || _d === void 0 ? void 0 : _d.bounds.overlaps(item.bounds)) {\n this.bottomRight.insert(item);\n }\n }\n /**\n * Insert an item to be tracked in the QuadTree\n * @param item\n */\n insert(item) {\n // add to subnodes if it matches\n if (this._isDivided) {\n this._insertIntoSubNodes(item);\n return;\n }\n // leaf case\n this.items.push(item);\n // capacity\n if (this.items.length > this.options.capacity && this.options.level < this.options.maxDepth) {\n if (!this._isDivided) {\n this._split();\n }\n // divide this level's items into it's subnodes\n for (const item of this.items) {\n this._insertIntoSubNodes(item);\n }\n // clear this level\n this.items.length = 0;\n }\n }\n /**\n * Remove a tracked item in the QuadTree\n * @param item\n */\n remove(item) {\n var _a, _b, _c, _d;\n if (!this.bounds.overlaps(item.bounds)) {\n return;\n }\n if (!this._isDivided) {\n const index = this.items.indexOf(item);\n if (index > -1) {\n this.items.splice(index, 1);\n }\n return;\n }\n if ((_a = this.topLeft) === null || _a === void 0 ? void 0 : _a.bounds.overlaps(item.bounds)) {\n this.topLeft.remove(item);\n }\n if ((_b = this.topRight) === null || _b === void 0 ? void 0 : _b.bounds.overlaps(item.bounds)) {\n this.topRight.remove(item);\n }\n if ((_c = this.bottomLeft) === null || _c === void 0 ? void 0 : _c.bounds.overlaps(item.bounds)) {\n this.bottomLeft.remove(item);\n }\n if ((_d = this.bottomRight) === null || _d === void 0 ? void 0 : _d.bounds.overlaps(item.bounds)) {\n this.bottomRight.remove(item);\n }\n }\n /**\n * Query the structure for all objects that intersect the bounding box\n * @param boundingBox\n * @returns items\n */\n query(boundingBox) {\n let results = this.items;\n if (this._isDivided) {\n if (this.topLeft.bounds.overlaps(boundingBox)) {\n results = results.concat(this.topLeft.query(boundingBox));\n }\n if (this.topRight.bounds.overlaps(boundingBox)) {\n results = results.concat(this.topRight.query(boundingBox));\n }\n if (this.bottomLeft.bounds.overlaps(boundingBox)) {\n results = results.concat(this.bottomLeft.query(boundingBox));\n }\n if (this.bottomRight.bounds.overlaps(boundingBox)) {\n results = results.concat(this.bottomRight.query(boundingBox));\n }\n }\n results = results.filter((item, index) => {\n return results.indexOf(item) >= index;\n });\n return results;\n }\n clear() {\n this.items = [];\n this._isDivided = false;\n this.topLeft = null;\n this.topRight = null;\n this.bottomLeft = null;\n this.bottomRight = null;\n }\n getAllItems() {\n let results = this.items;\n if (this._isDivided) {\n results = results.concat(this.topLeft.getAllItems());\n results = results.concat(this.topRight.getAllItems());\n results = results.concat(this.bottomLeft.getAllItems());\n results = results.concat(this.bottomRight.getAllItems());\n }\n results = results.filter((item, index) => {\n return results.indexOf(item) >= index;\n });\n return results;\n }\n getTreeDepth() {\n if (!this._isDivided) {\n return 0;\n }\n return (1 +\n Math.max(this.topLeft.getTreeDepth(), this.topRight.getTreeDepth(), this.bottomLeft.getTreeDepth(), this.bottomRight.getTreeDepth()));\n }\n debug(ctx) {\n this.bounds.draw(ctx, _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Yellow);\n if (this._isDivided) {\n this.topLeft.bounds.draw(ctx, _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Yellow);\n this.topRight.bounds.draw(ctx, _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Yellow);\n this.bottomLeft.bounds.draw(ctx, _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Yellow);\n this.bottomRight.bounds.draw(ctx, _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Yellow);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Detection/SparseHashGrid.ts\":\n/*!***********************************************!*\\\n !*** ./Collision/Detection/SparseHashGrid.ts ***!\n \\***********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ HashGridCell: () => (/* binding */ HashGridCell),\n/* harmony export */ HashGridProxy: () => (/* binding */ HashGridProxy),\n/* harmony export */ SparseHashGrid: () => (/* binding */ SparseHashGrid)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Color */ \"./Color.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_RentalPool__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Util/RentalPool */ \"./Util/RentalPool.ts\");\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n\n\n\n\nclass HashGridProxy {\n constructor(object, gridSize) {\n this.object = object;\n this.id = -1;\n this.cells = [];\n this.hasZeroBounds = false;\n this.gridSize = gridSize;\n this.bounds = object.bounds;\n this.hasZeroBounds = this.bounds.hasZeroDimensions();\n this.leftX = Math.floor(this.bounds.left / this.gridSize);\n this.rightX = Math.floor(this.bounds.right / this.gridSize);\n this.bottomY = Math.floor(this.bounds.bottom / this.gridSize);\n this.topY = Math.floor(this.bounds.top / this.gridSize);\n }\n /**\n * Has the hashed bounds changed\n */\n hasChanged() {\n const bounds = this.object.bounds;\n const leftX = Math.floor(bounds.left / this.gridSize);\n const rightX = Math.floor(bounds.right / this.gridSize);\n const bottomY = Math.floor(bounds.bottom / this.gridSize);\n const topY = Math.floor(bounds.top / this.gridSize);\n if (this.leftX !== leftX || this.rightX !== rightX || this.bottomY !== bottomY || this.topY !== topY) {\n return true;\n }\n return false;\n }\n /**\n * Clears all collider references\n */\n clear() {\n for (const cell of this.cells) {\n const index = cell.proxies.indexOf(this);\n if (index > -1) {\n cell.proxies.splice(index, 1);\n }\n // TODO reclaim cell in pool if empty?\n }\n }\n /**\n * Update bounds of the proxy\n */\n updateBounds() {\n this.bounds = this.object.bounds;\n }\n /**\n * Updates the hashed bounds coordinates\n */\n update() {\n this.bounds = this.object.bounds;\n this.leftX = Math.floor(this.bounds.left / this.gridSize);\n this.rightX = Math.floor(this.bounds.right / this.gridSize);\n this.bottomY = Math.floor(this.bounds.bottom / this.gridSize);\n this.topY = Math.floor(this.bounds.top / this.gridSize);\n this.hasZeroBounds = this.object.bounds.hasZeroDimensions();\n }\n}\nclass HashGridCell {\n constructor() {\n this.proxies = [];\n }\n configure(x, y) {\n this.x = x;\n this.y = y;\n this.key = HashGridCell.calculateHashKey(x, y);\n }\n static calculateHashKey(x, y) {\n return `${x}+${y}`;\n }\n}\nclass SparseHashGrid {\n constructor(options) {\n this.bounds = new _BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox();\n this._hashGridCellPool = new _Util_RentalPool__WEBPACK_IMPORTED_MODULE_1__.RentalPool(() => new HashGridCell(), (instance) => {\n instance.configure(0, 0);\n instance.proxies.length = 0;\n return instance;\n }, 1000);\n this.gridSize = options.size;\n this.sparseHashGrid = new Map();\n this.objectToProxy = new Map();\n if (options.proxyFactory) {\n this._buildProxy = (object) => options.proxyFactory(object, this.gridSize);\n }\n else {\n this._buildProxy = (object) => new HashGridProxy(object, this.gridSize);\n }\n // TODO dynamic grid size potentially larger than the largest collider\n // TODO Re-hash the objects if the median proves to be different\n }\n query(boundsOrPoint) {\n const results = new Set();\n if (boundsOrPoint instanceof _BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox) {\n const bounds = boundsOrPoint;\n const leftX = Math.floor(bounds.left / this.gridSize);\n const rightX = Math.floor(bounds.right / this.gridSize);\n const bottomY = Math.floor(bounds.bottom / this.gridSize);\n const topY = Math.floor(bounds.top / this.gridSize);\n for (let x = leftX; x <= rightX; x++) {\n for (let y = topY; y <= bottomY; y++) {\n const key = HashGridCell.calculateHashKey(x, y);\n // Hash bounds into appropriate cell\n const cell = this.sparseHashGrid.get(key);\n if (cell) {\n for (let i = 0; i < cell.proxies.length; i++) {\n cell.proxies[i].updateBounds();\n if (cell.proxies[i].bounds.intersect(bounds)) {\n results.add(cell.proxies[i].object);\n }\n }\n }\n }\n }\n }\n else {\n const point = boundsOrPoint;\n const key = HashGridCell.calculateHashKey(Math.floor(point.x / this.gridSize), Math.floor(point.y / this.gridSize));\n // Hash points into appropriate cell\n const cell = this.sparseHashGrid.get(key);\n if (cell) {\n for (let i = 0; i < cell.proxies.length; i++) {\n cell.proxies[i].updateBounds();\n if (cell.proxies[i].bounds.contains(point)) {\n results.add(cell.proxies[i].object);\n }\n }\n }\n }\n return Array.from(results);\n }\n get(xCoord, yCoord) {\n const key = HashGridCell.calculateHashKey(xCoord, yCoord);\n const cell = this.sparseHashGrid.get(key);\n return cell;\n }\n _insert(x, y, proxy) {\n const key = HashGridCell.calculateHashKey(x, y);\n // Hash collider into appropriate cell\n let cell = this.sparseHashGrid.get(key);\n if (!cell) {\n cell = this._hashGridCellPool.rent();\n cell.configure(x, y);\n this.sparseHashGrid.set(cell.key, cell);\n }\n cell.proxies.push(proxy);\n proxy.cells.push(cell); // TODO dupes, doesn't seem to be a problem\n this.bounds.combine(proxy.bounds, this.bounds);\n }\n _remove(x, y, proxy) {\n const key = HashGridCell.calculateHashKey(x, y);\n // Hash collider into appropriate cell\n const cell = this.sparseHashGrid.get(key);\n if (cell) {\n const proxyIndex = cell.proxies.indexOf(proxy);\n if (proxyIndex > -1) {\n cell.proxies.splice(proxyIndex, 1);\n }\n const cellIndex = proxy.cells.indexOf(cell);\n if (cellIndex > -1) {\n proxy.cells.splice(cellIndex, 1);\n }\n if (cell.proxies.length === 0) {\n this._hashGridCellPool.return(cell);\n this.sparseHashGrid.delete(key);\n }\n }\n }\n track(target) {\n const proxy = this._buildProxy(target);\n this.objectToProxy.set(target, proxy);\n for (let x = proxy.leftX; x <= proxy.rightX; x++) {\n for (let y = proxy.topY; y <= proxy.bottomY; y++) {\n this._insert(x, y, proxy);\n }\n }\n }\n untrack(target) {\n const proxy = this.objectToProxy.get(target);\n if (proxy) {\n proxy.clear();\n this.objectToProxy.delete(target);\n }\n }\n update(targets) {\n let updated = 0;\n // FIXME resetting bounds is wrong, if nothing has updated then\n // the bounds stay 0\n // this.bounds.reset();\n for (const target of targets) {\n const proxy = this.objectToProxy.get(target);\n if (!proxy) {\n continue;\n }\n if (proxy.hasChanged()) {\n // TODO slightly wasteful only remove from changed\n for (let x = proxy.leftX; x <= proxy.rightX; x++) {\n for (let y = proxy.topY; y <= proxy.bottomY; y++) {\n this._remove(x, y, proxy);\n }\n }\n proxy.update();\n // TODO slightly wasteful only add new\n for (let x = proxy.leftX; x <= proxy.rightX; x++) {\n for (let y = proxy.topY; y <= proxy.bottomY; y++) {\n this._insert(x, y, proxy);\n }\n }\n updated++;\n }\n }\n return updated;\n }\n debug(ex, elapsed) {\n const transparent = _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Transparent;\n const color = _Color__WEBPACK_IMPORTED_MODULE_2__.Color.White;\n for (const cell of this.sparseHashGrid.values()) {\n ex.drawRectangle((0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(cell.x * this.gridSize, cell.y * this.gridSize), this.gridSize, this.gridSize, transparent, color, 2);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Detection/SparseHashGridCollisionProcessor.ts\":\n/*!*****************************************************************!*\\\n !*** ./Collision/Detection/SparseHashGridCollisionProcessor.ts ***!\n \\*****************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ HashColliderProxy: () => (/* binding */ HashColliderProxy),\n/* harmony export */ SparseHashGridCollisionProcessor: () => (/* binding */ SparseHashGridCollisionProcessor)\n/* harmony export */ });\n/* harmony import */ var _Id__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Id */ \"./Id.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_Pool__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Util/Pool */ \"./Util/Pool.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Colliders/CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Group/CollisionGroup */ \"./Collision/Group/CollisionGroup.ts\");\n/* harmony import */ var _Pair__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Pair */ \"./Collision/Detection/Pair.ts\");\n/* harmony import */ var _SparseHashGrid__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./SparseHashGrid */ \"./Collision/Detection/SparseHashGrid.ts\");\n\n\n\n\n\n\n\n\n\n/**\n * Proxy type to stash collision info\n */\nclass HashColliderProxy extends _SparseHashGrid__WEBPACK_IMPORTED_MODULE_0__.HashGridProxy {\n constructor(collider, gridSize) {\n var _a, _b;\n super(collider, gridSize);\n this.collider = collider;\n this.id = -1;\n this.hasZeroBounds = false;\n /**\n * References to the hash cell the collider is a current member of\n */\n this.cells = [];\n this.gridSize = gridSize;\n const bounds = collider.bounds;\n this.hasZeroBounds = bounds.hasZeroDimensions();\n this.leftX = Math.floor(bounds.left / this.gridSize);\n this.rightX = Math.floor(bounds.right / this.gridSize);\n this.bottomY = Math.floor(bounds.bottom / this.gridSize);\n this.topY = Math.floor(bounds.top / this.gridSize);\n this.owner = collider.owner;\n this.body = (_a = this.owner) === null || _a === void 0 ? void 0 : _a.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_1__.BodyComponent);\n this.collisionType = (_b = this.body.collisionType) !== null && _b !== void 0 ? _b : _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.PreventCollision;\n }\n /**\n * Updates the hashed bounds coordinates\n */\n update() {\n var _a, _b;\n super.update();\n this.body = (_a = this.owner) === null || _a === void 0 ? void 0 : _a.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_1__.BodyComponent);\n this.collisionType = (_b = this.body.collisionType) !== null && _b !== void 0 ? _b : _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.PreventCollision;\n this.hasZeroBounds = this.collider.localBounds.hasZeroDimensions();\n }\n}\n/**\n * This collision processor uses a sparsely populated grid of uniform cells to bucket potential\n * colliders together for the purpose of detecting collision pairs and collisions.\n */\nclass SparseHashGridCollisionProcessor {\n constructor(options) {\n this._pairs = new Set();\n this._nonPairs = new Set();\n this._pairPool = new _Util_Pool__WEBPACK_IMPORTED_MODULE_3__.Pool(() => new _Pair__WEBPACK_IMPORTED_MODULE_4__.Pair({ id: (0,_Id__WEBPACK_IMPORTED_MODULE_5__.createId)('collider', 0) }, { id: (0,_Id__WEBPACK_IMPORTED_MODULE_5__.createId)('collider', 0) }), (instance) => {\n instance.colliderA = null;\n instance.colliderB = null;\n return instance;\n }, 200);\n this.gridSize = options.size;\n this.hashGrid = new _SparseHashGrid__WEBPACK_IMPORTED_MODULE_0__.SparseHashGrid({\n size: this.gridSize,\n proxyFactory: (collider, size) => new HashColliderProxy(collider, size)\n });\n this._pairPool.disableWarnings = true;\n // TODO dynamic grid size potentially larger than the largest collider\n // TODO Re-hash the objects if the median proves to be different\n }\n getColliders() {\n return Array.from(this.hashGrid.objectToProxy.keys());\n }\n query(boundsOrPoint) {\n // FIXME workaround TS: https://github.com/microsoft/TypeScript/issues/14107\n return this.hashGrid.query(boundsOrPoint);\n }\n rayCast(ray, options) {\n var _a, _b, _c;\n // DDA raycast algo\n const results = [];\n const maxDistance = (_a = options === null || options === void 0 ? void 0 : options.maxDistance) !== null && _a !== void 0 ? _a : Infinity;\n const collisionGroup = options === null || options === void 0 ? void 0 : options.collisionGroup;\n const collisionMask = !collisionGroup ? (_b = options === null || options === void 0 ? void 0 : options.collisionMask) !== null && _b !== void 0 ? _b : _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_6__.CollisionGroup.All.category : collisionGroup.category;\n const searchAllColliders = (_c = options === null || options === void 0 ? void 0 : options.searchAllColliders) !== null && _c !== void 0 ? _c : false;\n const unitRay = ray.dir.normalize();\n const dydx = unitRay.y / unitRay.x;\n const dxdy = unitRay.x / unitRay.y;\n const unitStepX = Math.sqrt(1 + dydx * dydx) * this.gridSize;\n const unitStepY = Math.sqrt(1 + dxdy * dxdy) * this.gridSize;\n const startXCoord = ray.pos.x / this.gridSize;\n const startYCoord = ray.pos.y / this.gridSize;\n const stepDir = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_7__.vec)(1, 1);\n let currentXCoord = ~~startXCoord;\n let currentYCoord = ~~startYCoord;\n let currentRayLengthX = 0;\n let currentRayLengthY = 0;\n if (unitRay.x < 0) {\n stepDir.x = -1;\n currentRayLengthX = (startXCoord - currentXCoord) * unitStepX;\n }\n else {\n stepDir.x = 1;\n currentRayLengthX = (currentXCoord + 1 - startXCoord) * unitStepX;\n }\n if (unitRay.y < 0) {\n stepDir.y = -1;\n currentRayLengthY = (startYCoord - currentYCoord) * unitStepY;\n }\n else {\n stepDir.y = 1;\n currentRayLengthY = (currentYCoord + 1 - startYCoord) * unitStepY;\n }\n const collidersVisited = new Set();\n let done = false;\n let maxIterations = 9999;\n while (!done && maxIterations > 0) {\n maxIterations--; // safety exit\n // exit if exhausted max hash grid coordinate, bounds of the sparse grid\n if (!this.hashGrid.bounds.contains((0,_Math_vector__WEBPACK_IMPORTED_MODULE_7__.vec)(currentXCoord * this.gridSize, currentYCoord * this.gridSize))) {\n break;\n }\n // Test colliders at cell\n const key = _SparseHashGrid__WEBPACK_IMPORTED_MODULE_0__.HashGridCell.calculateHashKey(currentXCoord, currentYCoord);\n const cell = this.hashGrid.sparseHashGrid.get(key);\n if (cell) {\n const cellHits = [];\n for (let colliderIndex = 0; colliderIndex < cell.proxies.length; colliderIndex++) {\n const collider = cell.proxies[colliderIndex];\n if (!collidersVisited.has(collider.collider.id.value)) {\n collidersVisited.add(collider.collider.id.value);\n if ((options === null || options === void 0 ? void 0 : options.ignoreCollisionGroupAll) && collider.body.group === _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_6__.CollisionGroup.All) {\n continue;\n }\n const canCollide = (collisionMask & collider.body.group.category) !== 0;\n // Early exit if not the right group\n if (collider.body.group && !canCollide) {\n continue;\n }\n const hit = collider.collider.rayCast(ray, maxDistance);\n // Collect up all the colliders that hit inside a cell\n // they can be in any order so we need to sort them next\n if (hit) {\n cellHits.push(hit);\n }\n }\n }\n cellHits.sort((hit1, hit2) => hit1.distance - hit2.distance);\n for (let i = 0; i < cellHits.length; i++) {\n const hit = cellHits[i];\n if (options === null || options === void 0 ? void 0 : options.filter) {\n if (options.filter(hit)) {\n results.push(hit);\n if (!searchAllColliders) {\n done = true;\n break;\n }\n }\n }\n else {\n results.push(hit);\n if (!searchAllColliders) {\n done = true;\n break;\n }\n }\n }\n }\n if (currentRayLengthX < currentRayLengthY) {\n currentXCoord += stepDir.x;\n currentRayLengthX += unitStepX;\n }\n else {\n currentYCoord += stepDir.y;\n currentRayLengthY += unitStepY;\n }\n }\n // Sort by distance\n results.sort((hit1, hit2) => hit1.distance - hit2.distance);\n if (!searchAllColliders && results.length) {\n return [results[0]];\n }\n return results;\n }\n /**\n * Adds the collider to the internal data structure for collision tracking\n * @param target\n */\n track(target) {\n let colliders = [target];\n if (target instanceof _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_8__.CompositeCollider) {\n const compColliders = target.getColliders();\n for (const c of compColliders) {\n c.owner = target.owner;\n }\n colliders = compColliders;\n }\n for (const target of colliders) {\n this.hashGrid.track(target);\n }\n }\n /**\n * Removes a collider from the internal data structure for tracking collisions\n * @param target\n */\n untrack(target) {\n let colliders = [target];\n if (target instanceof _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_8__.CompositeCollider) {\n colliders = target.getColliders();\n }\n for (const target of colliders) {\n this.hashGrid.untrack(target);\n }\n }\n _canCollide(colliderA, colliderB) {\n // Prevent self collision\n if (colliderA.collider.id === colliderB.collider.id) {\n return false;\n }\n // Colliders with the same owner do not collide (composite colliders)\n if (colliderA.owner && colliderB.owner && colliderA.owner.id === colliderB.owner.id) {\n return false;\n }\n // if the pair has a member with zero dimension don't collide\n if (colliderA.hasZeroBounds || colliderB.hasZeroBounds) {\n return false;\n }\n // If both are in the same collision group short circuit\n if (!colliderA.body.group.canCollide(colliderB.body.group)) {\n return false;\n }\n // if both are fixed short circuit\n if (colliderA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.Fixed && colliderB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.Fixed) {\n return false;\n }\n // if the either is prevent collision short circuit\n if (colliderA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.PreventCollision || colliderB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.PreventCollision) {\n return false;\n }\n // if either is dead short circuit\n if (!colliderA.owner.isActive || !colliderB.owner.isActive) {\n return false;\n }\n return true;\n }\n /**\n * Runs the broadphase sweep over tracked colliders and returns possible collision pairs\n * @param targets\n * @param elapsed\n */\n broadphase(targets, elapsed) {\n const pairs = [];\n this._pairs.clear();\n this._nonPairs.clear();\n let proxyId = 0;\n for (const proxy of this.hashGrid.objectToProxy.values()) {\n proxy.id = proxyId++; // track proxies we've already processed\n if (!proxy.owner.isActive || proxy.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.PreventCollision) {\n continue;\n }\n // for every cell proxy collider is member of\n for (let cellIndex = 0; cellIndex < proxy.cells.length; cellIndex++) {\n const cell = proxy.cells[cellIndex];\n // TODO Can we skip any cells or make this iteration faster?\n // maybe a linked list here\n for (let otherIndex = 0; otherIndex < cell.proxies.length; otherIndex++) {\n const other = cell.proxies[otherIndex];\n if (other.id === proxy.id) {\n // skip duplicates\n continue;\n }\n const id = _Pair__WEBPACK_IMPORTED_MODULE_4__.Pair.calculatePairHash(proxy.collider.id, other.collider.id);\n if (this._nonPairs.has(id)) {\n continue; // Is there a way we can re-use the non-pair cache\n }\n if (!this._pairs.has(id) && this._canCollide(proxy, other) && proxy.object.bounds.overlaps(other.object.bounds)) {\n const pair = this._pairPool.get();\n pair.colliderA = proxy.collider;\n pair.colliderB = other.collider;\n pair.id = id;\n this._pairs.add(id);\n pairs.push(pair);\n }\n else {\n this._nonPairs.add(id);\n }\n }\n }\n }\n return pairs;\n }\n /**\n * Runs a fine grain pass on collision pairs and does geometry intersection tests producing any contacts\n * @param pairs\n * @param stats\n */\n narrowphase(pairs, stats) {\n const contacts = [];\n for (let i = 0; i < pairs.length; i++) {\n const newContacts = pairs[i].collide();\n for (let j = 0; j < newContacts.length; j++) {\n const c = newContacts[j];\n contacts.push(c);\n if (stats) {\n stats.physics.contacts.set(c.id, c);\n }\n }\n }\n this._pairPool.done();\n if (stats) {\n stats.physics.collisions += contacts.length;\n }\n return contacts; // TODO maybe we can re-use contacts as likely pairs next frame\n }\n /**\n * Perform data structure maintenance, returns number of colliders updated\n */\n update(targets, elapsed) {\n return this.hashGrid.update(targets);\n }\n /**\n * Draws the internal data structure\n * @param ex\n * @param elapsed\n */\n debug(ex, elapsed) {\n this.hashGrid.debug(ex, elapsed);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Detection/SpatialPartitionStrategy.ts\":\n/*!*********************************************************!*\\\n !*** ./Collision/Detection/SpatialPartitionStrategy.ts ***!\n \\*********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SpatialPartitionStrategy: () => (/* binding */ SpatialPartitionStrategy)\n/* harmony export */ });\n/**\n * Possible collision resolution strategies\n *\n * The default is {@apilink SolverStrategy.Arcade} which performs simple axis aligned arcade style physics. This is useful for things\n * like platformers or top down games.\n *\n * More advanced rigid body physics are enabled by setting {@apilink SolverStrategy.Realistic} which allows for complicated\n * simulated physical interactions.\n */\nvar SpatialPartitionStrategy;\n(function (SpatialPartitionStrategy) {\n SpatialPartitionStrategy[\"DynamicTree\"] = \"dynamic-tree\";\n SpatialPartitionStrategy[\"SparseHashGrid\"] = \"sparse-hash-grid\";\n})(SpatialPartitionStrategy || (SpatialPartitionStrategy = {}));\n\n\n/***/ }),\n\n/***/ \"./Collision/Group/CollisionGroup.ts\":\n/*!*******************************************!*\\\n !*** ./Collision/Group/CollisionGroup.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CollisionGroup: () => (/* binding */ CollisionGroup)\n/* harmony export */ });\n/* harmony import */ var _CollisionGroupManager__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./CollisionGroupManager */ \"./Collision/Group/CollisionGroupManager.ts\");\n\n/**\n * CollisionGroups indicate like members that do not collide with each other. Use {@apilink CollisionGroupManager} to create {@apilink CollisionGroup}s\n *\n * For example:\n *\n * Players have collision group \"player\"\n *\n * ![Player Collision Group](/assets/images/docs/CollisionGroupsPlayer.png)\n *\n * Enemies have collision group \"enemy\"\n *\n * ![Enemy Collision Group](/assets/images/docs/CollisionGroupsEnemy.png)\n *\n * Blocks have collision group \"ground\"\n *\n * ![Ground collision group](/assets/images/docs/CollisionGroupsGround.png)\n *\n * Players don't collide with each other, but enemies and blocks. Likewise, enemies don't collide with each other but collide\n * with players and blocks.\n *\n * This is done with bitmasking, see the following pseudo-code\n *\n * PlayerGroup = `0b001`\n * PlayerGroupMask = `0b110`\n *\n * EnemyGroup = `0b010`\n * EnemyGroupMask = `0b101`\n *\n * BlockGroup = `0b100`\n * BlockGroupMask = `0b011`\n *\n * Should Players collide? No because the bitwise mask evaluates to 0\n * `(player1.group & player2.mask) === 0`\n * `(0b001 & 0b110) === 0`\n *\n * Should Players and Enemies collide? Yes because the bitwise mask is non-zero\n * `(player1.group & enemy1.mask) === 1`\n * `(0b001 & 0b101) === 1`\n *\n * Should Players and Blocks collide? Yes because the bitwise mask is non-zero\n * `(player1.group & blocks1.mask) === 1`\n * `(0b001 & 0b011) === 1`\n */\nclass CollisionGroup {\n /**\n * STOP!!** It is preferred that {@apilink CollisionGroupManager.create} is used to create collision groups\n * unless you know how to construct the proper bitmasks. See https://github.com/excaliburjs/Excalibur/issues/1091 for more info.\n * @param name Name of the collision group\n * @param category 32 bit category for the group, should be a unique power of 2. For example `0b001` or `0b010`\n * @param mask 32 bit mask of category, or `~category` generally. For a category of `0b001`, the mask would be `0b110`\n */\n constructor(name, category, mask) {\n this._name = name;\n this._category = category;\n this._mask = mask;\n }\n /**\n * Get the name of the collision group\n */\n get name() {\n return this._name;\n }\n /**\n * Get the category of the collision group, a 32 bit number which should be a unique power of 2\n */\n get category() {\n return this._category;\n }\n /**\n * Get the mask for this collision group\n */\n get mask() {\n return this._mask;\n }\n /**\n * Evaluates whether 2 collision groups can collide\n *\n * This means the mask has the same bit set the other category and vice versa\n * @param other CollisionGroup\n */\n canCollide(other) {\n const overlap1 = this.category & other.mask;\n const overlap2 = this.mask & other.category;\n return overlap1 !== 0 && overlap2 !== 0;\n }\n /**\n * Inverts the collision group. For example, if before the group specified \"players\",\n * inverting would specify all groups except players\n * @returns CollisionGroup\n */\n invert() {\n const group = _CollisionGroupManager__WEBPACK_IMPORTED_MODULE_0__.CollisionGroupManager.create('~(' + this.name + ')', ~this.mask | 0);\n group._category = ~this.category;\n return group;\n }\n /**\n * Combine collision groups with each other. The new group includes all of the previous groups.\n * @param collisionGroups\n */\n static combine(collisionGroups) {\n const combinedName = collisionGroups.map((c) => c.name).join('+');\n const combinedCategory = collisionGroups.reduce((current, g) => g.category | current, 0b0);\n const combinedMask = ~combinedCategory;\n return _CollisionGroupManager__WEBPACK_IMPORTED_MODULE_0__.CollisionGroupManager.create(combinedName, combinedMask);\n }\n /**\n * Creates a collision group that collides with the listed groups\n * @param collisionGroups\n */\n static collidesWith(collisionGroups) {\n const combinedName = `collidesWith(${collisionGroups.map((c) => c.name).join('+')})`;\n const combinedMask = collisionGroups.reduce((current, g) => g.category | current, 0b0);\n return _CollisionGroupManager__WEBPACK_IMPORTED_MODULE_0__.CollisionGroupManager.create(combinedName, combinedMask);\n }\n toString() {\n return `\r\ncategory: ${this.category.toString(2).padStart(32, '0')}\r\nmask: ${(this.mask >>> 0).toString(2).padStart(32, '0')}\r\n `;\n }\n}\n/**\n * The `All` {@apilink CollisionGroup} is a special group that collides with all other groups including itself,\n * it is the default collision group on colliders.\n */\nCollisionGroup.All = new CollisionGroup('Collide with all groups', -1, -1);\n\n\n/***/ }),\n\n/***/ \"./Collision/Group/CollisionGroupManager.ts\":\n/*!**************************************************!*\\\n !*** ./Collision/Group/CollisionGroupManager.ts ***!\n \\**************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CollisionGroupManager: () => (/* binding */ CollisionGroupManager)\n/* harmony export */ });\n/* harmony import */ var _CollisionGroup__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./CollisionGroup */ \"./Collision/Group/CollisionGroup.ts\");\n\n/**\n * Static class for managing collision groups in excalibur, there is a maximum of 32 collision groups possible in excalibur\n */\nclass CollisionGroupManager {\n /**\n * Create a new named collision group up to a max of 32.\n * @param name Name for the collision group\n * @param mask Optionally provide your own 32-bit mask, if none is provide the manager will generate one\n */\n static create(name, mask) {\n if (this._CURRENT_GROUP > this._MAX_GROUPS) {\n throw new Error(`Cannot have more than ${this._MAX_GROUPS} collision groups`);\n }\n if (this._GROUPS.get(name)) {\n const existingGroup = this._GROUPS.get(name);\n if (existingGroup.mask === mask) {\n return existingGroup;\n }\n throw new Error(`Collision group ${name} already exists with a different mask!`);\n }\n const group = new _CollisionGroup__WEBPACK_IMPORTED_MODULE_0__.CollisionGroup(name, this._CURRENT_BIT, mask !== undefined ? mask : ~this._CURRENT_BIT);\n this._CURRENT_BIT = (this._CURRENT_BIT << 1) | 0;\n this._CURRENT_GROUP++;\n this._GROUPS.set(name, group);\n return group;\n }\n /**\n * Get all collision groups currently tracked by excalibur\n */\n static get groups() {\n return Array.from(this._GROUPS.values());\n }\n /**\n * Get a collision group by it's name\n * @param name\n */\n static groupByName(name) {\n return this._GROUPS.get(name);\n }\n /**\n * Resets the managers internal group management state\n */\n static reset() {\n this._GROUPS = new Map();\n this._CURRENT_BIT = this._STARTING_BIT;\n this._CURRENT_GROUP = 1;\n }\n}\n// using bitmasking the maximum number of groups is 32, because that is the highest 32bit integer that JS can present.\nCollisionGroupManager._STARTING_BIT = 0b1 | 0;\nCollisionGroupManager._MAX_GROUPS = 32;\nCollisionGroupManager._CURRENT_GROUP = 1;\nCollisionGroupManager._CURRENT_BIT = CollisionGroupManager._STARTING_BIT;\nCollisionGroupManager._GROUPS = new Map();\n\n\n/***/ }),\n\n/***/ \"./Collision/Index.ts\":\n/*!****************************!*\\\n !*** ./Collision/Index.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ArcadeSolver: () => (/* reexport safe */ _Solver_ArcadeSolver__WEBPACK_IMPORTED_MODULE_24__.ArcadeSolver),\n/* harmony export */ BodyComponent: () => (/* reexport safe */ _BodyComponent__WEBPACK_IMPORTED_MODULE_0__.BodyComponent),\n/* harmony export */ BoundingBox: () => (/* reexport safe */ _BoundingBox__WEBPACK_IMPORTED_MODULE_5__.BoundingBox),\n/* harmony export */ CircleCollider: () => (/* reexport safe */ _Colliders_CircleCollider__WEBPACK_IMPORTED_MODULE_8__.CircleCollider),\n/* harmony export */ ClosestLineJumpTable: () => (/* reexport safe */ _Colliders_ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_12__.ClosestLineJumpTable),\n/* harmony export */ Collider: () => (/* reexport safe */ _Colliders_Collider__WEBPACK_IMPORTED_MODULE_4__.Collider),\n/* harmony export */ ColliderComponent: () => (/* reexport safe */ _ColliderComponent__WEBPACK_IMPORTED_MODULE_1__.ColliderComponent),\n/* harmony export */ CollisionContact: () => (/* reexport safe */ _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_17__.CollisionContact),\n/* harmony export */ CollisionGroup: () => (/* reexport safe */ _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_14__.CollisionGroup),\n/* harmony export */ CollisionGroupManager: () => (/* reexport safe */ _Group_CollisionGroupManager__WEBPACK_IMPORTED_MODULE_15__.CollisionGroupManager),\n/* harmony export */ CollisionJumpTable: () => (/* reexport safe */ _Colliders_CollisionJumpTable__WEBPACK_IMPORTED_MODULE_11__.CollisionJumpTable),\n/* harmony export */ CollisionSystem: () => (/* reexport safe */ _CollisionSystem__WEBPACK_IMPORTED_MODULE_28__.CollisionSystem),\n/* harmony export */ CollisionType: () => (/* reexport safe */ _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType),\n/* harmony export */ CompositeCollider: () => (/* reexport safe */ _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_7__.CompositeCollider),\n/* harmony export */ ContactConstraintPoint: () => (/* reexport safe */ _Solver_ContactConstraintPoint__WEBPACK_IMPORTED_MODULE_26__.ContactConstraintPoint),\n/* harmony export */ ContactSolveBias: () => (/* reexport safe */ _Solver_ContactBias__WEBPACK_IMPORTED_MODULE_25__.ContactSolveBias),\n/* harmony export */ DegreeOfFreedom: () => (/* reexport safe */ _BodyComponent__WEBPACK_IMPORTED_MODULE_0__.DegreeOfFreedom),\n/* harmony export */ DynamicTree: () => (/* reexport safe */ _Detection_DynamicTree__WEBPACK_IMPORTED_MODULE_18__.DynamicTree),\n/* harmony export */ DynamicTreeCollisionProcessor: () => (/* reexport safe */ _Detection_DynamicTreeCollisionProcessor__WEBPACK_IMPORTED_MODULE_19__.DynamicTreeCollisionProcessor),\n/* harmony export */ EdgeCollider: () => (/* reexport safe */ _Colliders_EdgeCollider__WEBPACK_IMPORTED_MODULE_9__.EdgeCollider),\n/* harmony export */ HashColliderProxy: () => (/* reexport safe */ _Detection_SparseHashGridCollisionProcessor__WEBPACK_IMPORTED_MODULE_20__.HashColliderProxy),\n/* harmony export */ HashGridCell: () => (/* reexport safe */ _Detection_SparseHashGrid__WEBPACK_IMPORTED_MODULE_21__.HashGridCell),\n/* harmony export */ HashGridProxy: () => (/* reexport safe */ _Detection_SparseHashGrid__WEBPACK_IMPORTED_MODULE_21__.HashGridProxy),\n/* harmony export */ HorizontalFirst: () => (/* reexport safe */ _Solver_ContactBias__WEBPACK_IMPORTED_MODULE_25__.HorizontalFirst),\n/* harmony export */ MotionSystem: () => (/* reexport safe */ _MotionSystem__WEBPACK_IMPORTED_MODULE_29__.MotionSystem),\n/* harmony export */ None: () => (/* reexport safe */ _Solver_ContactBias__WEBPACK_IMPORTED_MODULE_25__.None),\n/* harmony export */ Pair: () => (/* reexport safe */ _Detection_Pair__WEBPACK_IMPORTED_MODULE_16__.Pair),\n/* harmony export */ PhysicsWorld: () => (/* reexport safe */ _PhysicsWorld__WEBPACK_IMPORTED_MODULE_30__.PhysicsWorld),\n/* harmony export */ PolygonCollider: () => (/* reexport safe */ _Colliders_PolygonCollider__WEBPACK_IMPORTED_MODULE_10__.PolygonCollider),\n/* harmony export */ QuadTree: () => (/* reexport safe */ _Detection_QuadTree__WEBPACK_IMPORTED_MODULE_23__.QuadTree),\n/* harmony export */ RealisticSolver: () => (/* reexport safe */ _Solver_RealisticSolver__WEBPACK_IMPORTED_MODULE_27__.RealisticSolver),\n/* harmony export */ SeparatingAxis: () => (/* reexport safe */ _Colliders_SeparatingAxis__WEBPACK_IMPORTED_MODULE_13__.SeparatingAxis),\n/* harmony export */ SeparationInfo: () => (/* reexport safe */ _Colliders_SeparatingAxis__WEBPACK_IMPORTED_MODULE_13__.SeparationInfo),\n/* harmony export */ Shape: () => (/* reexport safe */ _Colliders_Shape__WEBPACK_IMPORTED_MODULE_6__.Shape),\n/* harmony export */ Side: () => (/* reexport safe */ _Side__WEBPACK_IMPORTED_MODULE_32__.Side),\n/* harmony export */ SolverStrategy: () => (/* reexport safe */ _SolverStrategy__WEBPACK_IMPORTED_MODULE_3__.SolverStrategy),\n/* harmony export */ SparseHashGrid: () => (/* reexport safe */ _Detection_SparseHashGrid__WEBPACK_IMPORTED_MODULE_21__.SparseHashGrid),\n/* harmony export */ SparseHashGridCollisionProcessor: () => (/* reexport safe */ _Detection_SparseHashGridCollisionProcessor__WEBPACK_IMPORTED_MODULE_20__.SparseHashGridCollisionProcessor),\n/* harmony export */ SpatialPartitionStrategy: () => (/* reexport safe */ _Detection_SpatialPartitionStrategy__WEBPACK_IMPORTED_MODULE_22__.SpatialPartitionStrategy),\n/* harmony export */ TreeNode: () => (/* reexport safe */ _Detection_DynamicTree__WEBPACK_IMPORTED_MODULE_18__.TreeNode),\n/* harmony export */ VerticalFirst: () => (/* reexport safe */ _Solver_ContactBias__WEBPACK_IMPORTED_MODULE_25__.VerticalFirst),\n/* harmony export */ getDefaultPhysicsConfig: () => (/* reexport safe */ _PhysicsConfig__WEBPACK_IMPORTED_MODULE_31__.getDefaultPhysicsConfig)\n/* harmony export */ });\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _ColliderComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ColliderComponent */ \"./Collision/ColliderComponent.ts\");\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _SolverStrategy__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./SolverStrategy */ \"./Collision/SolverStrategy.ts\");\n/* harmony import */ var _Colliders_Collider__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Colliders/Collider */ \"./Collision/Colliders/Collider.ts\");\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Colliders_Shape__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Colliders/Shape */ \"./Collision/Colliders/Shape.ts\");\n/* harmony import */ var _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Colliders/CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var _Colliders_CircleCollider__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Colliders/CircleCollider */ \"./Collision/Colliders/CircleCollider.ts\");\n/* harmony import */ var _Colliders_EdgeCollider__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Colliders/EdgeCollider */ \"./Collision/Colliders/EdgeCollider.ts\");\n/* harmony import */ var _Colliders_PolygonCollider__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Colliders/PolygonCollider */ \"./Collision/Colliders/PolygonCollider.ts\");\n/* harmony import */ var _Colliders_CollisionJumpTable__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Colliders/CollisionJumpTable */ \"./Collision/Colliders/CollisionJumpTable.ts\");\n/* harmony import */ var _Colliders_ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Colliders/ClosestLineJumpTable */ \"./Collision/Colliders/ClosestLineJumpTable.ts\");\n/* harmony import */ var _Colliders_SeparatingAxis__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Colliders/SeparatingAxis */ \"./Collision/Colliders/SeparatingAxis.ts\");\n/* harmony import */ var _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Group/CollisionGroup */ \"./Collision/Group/CollisionGroup.ts\");\n/* harmony import */ var _Group_CollisionGroupManager__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Group/CollisionGroupManager */ \"./Collision/Group/CollisionGroupManager.ts\");\n/* harmony import */ var _Detection_Pair__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Detection/Pair */ \"./Collision/Detection/Pair.ts\");\n/* harmony import */ var _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./Detection/CollisionContact */ \"./Collision/Detection/CollisionContact.ts\");\n/* harmony import */ var _Detection_DynamicTree__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Detection/DynamicTree */ \"./Collision/Detection/DynamicTree.ts\");\n/* harmony import */ var _Detection_DynamicTreeCollisionProcessor__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./Detection/DynamicTreeCollisionProcessor */ \"./Collision/Detection/DynamicTreeCollisionProcessor.ts\");\n/* harmony import */ var _Detection_SparseHashGridCollisionProcessor__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./Detection/SparseHashGridCollisionProcessor */ \"./Collision/Detection/SparseHashGridCollisionProcessor.ts\");\n/* harmony import */ var _Detection_SparseHashGrid__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./Detection/SparseHashGrid */ \"./Collision/Detection/SparseHashGrid.ts\");\n/* harmony import */ var _Detection_SpatialPartitionStrategy__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./Detection/SpatialPartitionStrategy */ \"./Collision/Detection/SpatialPartitionStrategy.ts\");\n/* harmony import */ var _Detection_QuadTree__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./Detection/QuadTree */ \"./Collision/Detection/QuadTree.ts\");\n/* harmony import */ var _Solver_ArcadeSolver__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./Solver/ArcadeSolver */ \"./Collision/Solver/ArcadeSolver.ts\");\n/* harmony import */ var _Solver_ContactBias__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./Solver/ContactBias */ \"./Collision/Solver/ContactBias.ts\");\n/* harmony import */ var _Solver_ContactConstraintPoint__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./Solver/ContactConstraintPoint */ \"./Collision/Solver/ContactConstraintPoint.ts\");\n/* harmony import */ var _Solver_RealisticSolver__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./Solver/RealisticSolver */ \"./Collision/Solver/RealisticSolver.ts\");\n/* harmony import */ var _CollisionSystem__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./CollisionSystem */ \"./Collision/CollisionSystem.ts\");\n/* harmony import */ var _MotionSystem__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./MotionSystem */ \"./Collision/MotionSystem.ts\");\n/* harmony import */ var _PhysicsWorld__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./PhysicsWorld */ \"./Collision/PhysicsWorld.ts\");\n/* harmony import */ var _PhysicsConfig__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./PhysicsConfig */ \"./Collision/PhysicsConfig.ts\");\n/* harmony import */ var _Side__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./Side */ \"./Collision/Side.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Collision/Integrator.ts\":\n/*!*********************************!*\\\n !*** ./Collision/Integrator.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EulerIntegrator: () => (/* binding */ EulerIntegrator)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n\nclass EulerIntegrator {\n static integrate(transform, motion, totalAcc, elapsed) {\n const seconds = elapsed / 1000;\n // This code looks a little wild, but it's to avoid creating any new Vector instances\n // integration is done in a tight loop so this is key to avoid GC'ing\n motion.vel.addEqual(totalAcc.scale(seconds, EulerIntegrator._ACC));\n transform.pos\n .add(motion.vel.scale(seconds, EulerIntegrator._VEL), EulerIntegrator._POS)\n .addEqual(totalAcc.scale(0.5 * seconds * seconds, EulerIntegrator._VEL_ACC));\n motion.angularVelocity += motion.torque * (1.0 / motion.inertia) * seconds;\n const rotation = transform.rotation + motion.angularVelocity * seconds;\n transform.scale.add(motion.scaleFactor.scale(seconds, this._SCALE_FACTOR), EulerIntegrator._SCALE);\n const tx = transform.get();\n tx.setTransform(EulerIntegrator._POS, rotation, EulerIntegrator._SCALE);\n }\n}\n// Scratch vectors to avoid allocation\nEulerIntegrator._POS = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\nEulerIntegrator._SCALE = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(1, 1);\nEulerIntegrator._ACC = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\nEulerIntegrator._VEL = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\nEulerIntegrator._VEL_ACC = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\nEulerIntegrator._SCALE_FACTOR = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\n\n\n/***/ }),\n\n/***/ \"./Collision/MotionSystem.ts\":\n/*!***********************************!*\\\n !*** ./Collision/MotionSystem.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MotionSystem: () => (/* binding */ MotionSystem)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Priority.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Integrator__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Integrator */ \"./Collision/Integrator.ts\");\n\n\n\n\n\n\n\nclass MotionSystem extends _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.System {\n constructor(world, physics) {\n super();\n this.world = world;\n this.physics = physics;\n this.systemType = _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.SystemType.Update;\n this._physicsConfigDirty = false;\n physics.$configUpdate.subscribe(() => (this._physicsConfigDirty = true));\n this.query = this.world.query([_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent, _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent]);\n }\n update(elapsed) {\n let transform;\n let motion;\n const entities = this.query.entities;\n const substep = this.physics.config.substep;\n for (let i = 0; i < entities.length; i++) {\n transform = entities[i].get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n motion = entities[i].get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n const optionalBody = entities[i].get(_BodyComponent__WEBPACK_IMPORTED_MODULE_3__.BodyComponent);\n if (this._physicsConfigDirty && optionalBody) {\n optionalBody.updatePhysicsConfig(this.physics.config.bodies);\n }\n if (optionalBody === null || optionalBody === void 0 ? void 0 : optionalBody.isSleeping) {\n continue;\n }\n const totalAcc = motion.acc.clone();\n if ((optionalBody === null || optionalBody === void 0 ? void 0 : optionalBody.collisionType) === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Active && (optionalBody === null || optionalBody === void 0 ? void 0 : optionalBody.useGravity)) {\n totalAcc.addEqual(this.physics.config.gravity);\n }\n // capture old transform of this entity and all of its children so that\n // any transform properties that derived from their parents are properly captured\n if (!entities[i].parent) {\n this.captureOldTransformWithChildren(entities[i]);\n }\n // Update transform and motion based on Euler linear algebra\n _Integrator__WEBPACK_IMPORTED_MODULE_5__.EulerIntegrator.integrate(transform, motion, totalAcc, elapsed / substep);\n }\n this._physicsConfigDirty = false;\n }\n captureOldTransformWithChildren(entity) {\n var _a;\n (_a = entity.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_3__.BodyComponent)) === null || _a === void 0 ? void 0 : _a.captureOldTransform();\n for (let i = 0; i < entity.children.length; i++) {\n this.captureOldTransformWithChildren(entity.children[i]);\n }\n }\n}\nMotionSystem.priority = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_6__.SystemPriority.Higher;\n\n\n/***/ }),\n\n/***/ \"./Collision/PhysicsConfig.ts\":\n/*!************************************!*\\\n !*** ./Collision/PhysicsConfig.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ getDefaultPhysicsConfig: () => (/* binding */ getDefaultPhysicsConfig)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _SolverStrategy__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./SolverStrategy */ \"./Collision/SolverStrategy.ts\");\n/* harmony import */ var _Solver_ContactBias__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Solver/ContactBias */ \"./Collision/Solver/ContactBias.ts\");\n/* harmony import */ var _Detection_SpatialPartitionStrategy__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Detection/SpatialPartitionStrategy */ \"./Collision/Detection/SpatialPartitionStrategy.ts\");\n\n\n\n\nconst getDefaultPhysicsConfig = () => ({\n enabled: true,\n gravity: (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0).clone(),\n solver: _SolverStrategy__WEBPACK_IMPORTED_MODULE_1__.SolverStrategy.Arcade,\n substep: 1,\n colliders: {\n compositeStrategy: 'together'\n },\n continuous: {\n checkForFastBodies: true,\n disableMinimumSpeedForFastBody: false,\n surfaceEpsilon: 0.1\n },\n bodies: {\n canSleepByDefault: false,\n sleepEpsilon: 0.07,\n wakeThreshold: 0.07 * 3,\n sleepBias: 0.9,\n defaultMass: 10\n },\n spatialPartition: _Detection_SpatialPartitionStrategy__WEBPACK_IMPORTED_MODULE_2__.SpatialPartitionStrategy.SparseHashGrid,\n sparseHashGrid: {\n size: 100\n },\n dynamicTree: {\n boundsPadding: 5,\n velocityMultiplier: 2\n },\n arcade: {\n contactSolveBias: _Solver_ContactBias__WEBPACK_IMPORTED_MODULE_3__.ContactSolveBias.None\n },\n realistic: {\n positionIterations: 3,\n velocityIterations: 8,\n slop: 1,\n steeringFactor: 0.2,\n warmStart: true\n }\n});\n\n\n/***/ }),\n\n/***/ \"./Collision/PhysicsWorld.ts\":\n/*!***********************************!*\\\n !*** ./Collision/PhysicsWorld.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PhysicsWorld: () => (/* binding */ PhysicsWorld)\n/* harmony export */ });\n/* harmony import */ var _Util_Observable__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Util/Observable */ \"./Util/Observable.ts\");\n/* harmony import */ var _Index__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Index */ \"./Collision/Detection/SparseHashGridCollisionProcessor.ts\");\n/* harmony import */ var _Index__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Index */ \"./Collision/Detection/DynamicTreeCollisionProcessor.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Util_Watch__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Util/Watch */ \"./Util/Watch.ts\");\n/* harmony import */ var _Detection_SpatialPartitionStrategy__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Detection/SpatialPartitionStrategy */ \"./Collision/Detection/SpatialPartitionStrategy.ts\");\n\n\n\n\n\nclass PhysicsWorld {\n get config() {\n return (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_0__.watchDeep)(this._config, (change) => {\n this.$configUpdate.notifyAll(change);\n });\n }\n set config(newConfig) {\n this._config = newConfig;\n this.$configUpdate.notifyAll(newConfig);\n }\n /**\n * Spatial data structure for locating potential collision pairs and ray casts\n */\n get collisionProcessor() {\n if (this._configDirty) {\n this._configDirty = false;\n // preserve tracked colliders if config updates\n const colliders = this._collisionProcessor.getColliders();\n if (this._config.spatialPartition === _Detection_SpatialPartitionStrategy__WEBPACK_IMPORTED_MODULE_1__.SpatialPartitionStrategy.SparseHashGrid) {\n this._collisionProcessor = new _Index__WEBPACK_IMPORTED_MODULE_2__.SparseHashGridCollisionProcessor(this._config.sparseHashGrid);\n }\n else {\n this._collisionProcessor = new _Index__WEBPACK_IMPORTED_MODULE_3__.DynamicTreeCollisionProcessor(this._config);\n }\n for (const collider of colliders) {\n this._collisionProcessor.track(collider);\n }\n }\n return this._collisionProcessor;\n }\n constructor(config) {\n this.$configUpdate = new _Util_Observable__WEBPACK_IMPORTED_MODULE_4__.Observable();\n this._configDirty = false;\n this.config = config;\n this.$configUpdate.subscribe((config) => {\n this._configDirty = true;\n _BodyComponent__WEBPACK_IMPORTED_MODULE_5__.BodyComponent.updateDefaultPhysicsConfig(config.bodies);\n });\n if (this._config.spatialPartition === _Detection_SpatialPartitionStrategy__WEBPACK_IMPORTED_MODULE_1__.SpatialPartitionStrategy.SparseHashGrid) {\n this._collisionProcessor = new _Index__WEBPACK_IMPORTED_MODULE_2__.SparseHashGridCollisionProcessor(this._config.sparseHashGrid);\n }\n else {\n this._collisionProcessor = new _Index__WEBPACK_IMPORTED_MODULE_3__.DynamicTreeCollisionProcessor(this._config);\n }\n }\n /**\n * Raycast into the scene's physics world\n * @param ray\n * @param options\n */\n rayCast(ray, options) {\n return this.collisionProcessor.rayCast(ray, options);\n }\n query(pointOrBounds) {\n // FIXME workaround TS: https://github.com/microsoft/TypeScript/issues/14107\n return this._collisionProcessor.query(pointOrBounds);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Side.ts\":\n/*!***************************!*\\\n !*** ./Collision/Side.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Side: () => (/* binding */ Side)\n/* harmony export */ });\n/**\n * An enum that describes the sides of an axis aligned box for collision\n */\nvar Side;\n(function (Side) {\n Side[\"None\"] = \"None\";\n Side[\"Top\"] = \"Top\";\n Side[\"Bottom\"] = \"Bottom\";\n Side[\"Left\"] = \"Left\";\n Side[\"Right\"] = \"Right\";\n})(Side || (Side = {}));\n(function (Side) {\n /**\n * Returns the opposite side from the current\n */\n function getOpposite(side) {\n if (side === Side.Top) {\n return Side.Bottom;\n }\n if (side === Side.Bottom) {\n return Side.Top;\n }\n if (side === Side.Left) {\n return Side.Right;\n }\n if (side === Side.Right) {\n return Side.Left;\n }\n return Side.None;\n }\n Side.getOpposite = getOpposite;\n /**\n * Given a vector, return the Side most in that direction\n */\n function fromDirection(direction) {\n if (Math.abs(direction.x) >= Math.abs(direction.y)) {\n if (direction.x <= 0) {\n return Side.Left;\n }\n return Side.Right;\n }\n if (direction.y <= 0) {\n return Side.Top;\n }\n return Side.Bottom;\n }\n Side.fromDirection = fromDirection;\n})(Side || (Side = {}));\n\n\n/***/ }),\n\n/***/ \"./Collision/SolverStrategy.ts\":\n/*!*************************************!*\\\n !*** ./Collision/SolverStrategy.ts ***!\n \\*************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SolverStrategy: () => (/* binding */ SolverStrategy)\n/* harmony export */ });\n/**\n * Possible collision resolution strategies\n *\n * The default is {@apilink SolverStrategy.Arcade} which performs simple axis aligned arcade style physics. This is useful for things\n * like platformers or top down games.\n *\n * More advanced rigid body physics are enabled by setting {@apilink SolverStrategy.Realistic} which allows for complicated\n * simulated physical interactions.\n */\nvar SolverStrategy;\n(function (SolverStrategy) {\n SolverStrategy[\"Arcade\"] = \"arcade\";\n SolverStrategy[\"Realistic\"] = \"realistic\";\n})(SolverStrategy || (SolverStrategy = {}));\n\n\n/***/ }),\n\n/***/ \"./Collision/Solver/ArcadeSolver.ts\":\n/*!******************************************!*\\\n !*** ./Collision/Solver/ArcadeSolver.ts ***!\n \\******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ArcadeSolver: () => (/* binding */ ArcadeSolver)\n/* harmony export */ });\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Events */ \"./Events.ts\");\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Side__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Side */ \"./Collision/Side.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _ContactBias__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ContactBias */ \"./Collision/Solver/ContactBias.ts\");\n\n\n\n\n\n/**\n * ArcadeSolver is the default in Excalibur. It solves collisions so that there is no overlap between contacts,\n * and negates velocity along the collision normal.\n *\n * This is usually the type of collisions used for 2D games that don't need a more realistic collision simulation.\n *\n */\nclass ArcadeSolver {\n constructor(config) {\n this.config = config;\n this.directionMap = new Map();\n this.distanceMap = new Map();\n }\n solve(contacts) {\n // Events and init\n this.preSolve(contacts);\n // Remove any canceled contacts\n contacts = contacts.filter((c) => !c.isCanceled());\n // Locate collision bias order\n let bias;\n switch (this.config.contactSolveBias) {\n case _ContactBias__WEBPACK_IMPORTED_MODULE_0__.ContactSolveBias.HorizontalFirst: {\n bias = _ContactBias__WEBPACK_IMPORTED_MODULE_0__.HorizontalFirst;\n break;\n }\n case _ContactBias__WEBPACK_IMPORTED_MODULE_0__.ContactSolveBias.VerticalFirst: {\n bias = _ContactBias__WEBPACK_IMPORTED_MODULE_0__.VerticalFirst;\n break;\n }\n default: {\n bias = _ContactBias__WEBPACK_IMPORTED_MODULE_0__.None;\n }\n }\n // Sort by bias (None, VerticalFirst, HorizontalFirst) to avoid artifacts with seams\n // Sort contacts by distance to avoid artifacts with seams\n // It's important to solve in a specific order\n contacts.sort((a, b) => {\n const aDir = this.directionMap.get(a.id);\n const bDir = this.directionMap.get(b.id);\n const aDist = this.distanceMap.get(a.id);\n const bDist = this.distanceMap.get(b.id);\n return bias[aDir] - bias[bDir] || aDist - bDist;\n });\n for (const contact of contacts) {\n // Solve position first in arcade\n this.solvePosition(contact);\n // Solve velocity second in arcade\n this.solveVelocity(contact);\n }\n // Events and any contact house-keeping the solver needs\n this.postSolve(contacts);\n return contacts;\n }\n preSolve(contacts) {\n const epsilon = 0.0001;\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n if (Math.abs(contact.mtv.x) < epsilon && Math.abs(contact.mtv.y) < epsilon) {\n // Cancel near 0 mtv collisions\n contact.cancel();\n continue;\n }\n const side = _Side__WEBPACK_IMPORTED_MODULE_1__.Side.fromDirection(contact.mtv);\n const mtv = contact.mtv.negate();\n const distance = Math.abs(contact.info.separation);\n this.distanceMap.set(contact.id, distance);\n this.directionMap.set(contact.id, side === _Side__WEBPACK_IMPORTED_MODULE_1__.Side.Left || side === _Side__WEBPACK_IMPORTED_MODULE_1__.Side.Right ? 'horizontal' : 'vertical');\n // Publish collision events on both participants\n contact.colliderA.events.emit('precollision', new _Events__WEBPACK_IMPORTED_MODULE_2__.PreCollisionEvent(contact.colliderA, contact.colliderB, side, mtv, contact));\n contact.colliderB.events.emit('precollision', new _Events__WEBPACK_IMPORTED_MODULE_2__.PreCollisionEvent(contact.colliderB, contact.colliderA, _Side__WEBPACK_IMPORTED_MODULE_1__.Side.getOpposite(side), mtv.negate(), contact));\n }\n }\n postSolve(contacts) {\n var _a, _b;\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n if (contact.isCanceled()) {\n continue;\n }\n const colliderA = contact.colliderA;\n const colliderB = contact.colliderB;\n const bodyA = (_a = colliderA.owner) === null || _a === void 0 ? void 0 : _a.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_3__.BodyComponent);\n const bodyB = (_b = colliderB.owner) === null || _b === void 0 ? void 0 : _b.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_3__.BodyComponent);\n if (bodyA && bodyB) {\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Passive || bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Passive) {\n continue;\n }\n }\n const side = _Side__WEBPACK_IMPORTED_MODULE_1__.Side.fromDirection(contact.mtv);\n const mtv = contact.mtv.negate();\n // Publish collision events on both participants\n contact.colliderA.events.emit('postcollision', new _Events__WEBPACK_IMPORTED_MODULE_2__.PostCollisionEvent(contact.colliderA, contact.colliderB, side, mtv, contact));\n contact.colliderB.events.emit('postcollision', new _Events__WEBPACK_IMPORTED_MODULE_2__.PostCollisionEvent(contact.colliderB, contact.colliderA, _Side__WEBPACK_IMPORTED_MODULE_1__.Side.getOpposite(side), mtv.negate(), contact));\n }\n }\n solvePosition(contact) {\n var _a, _b;\n const epsilon = 0.0001;\n // if bounds no longer intersect skip to the next\n // this removes jitter from overlapping/stacked solid tiles or a wall of solid tiles\n if (!contact.colliderA.bounds.overlaps(contact.colliderB.bounds, epsilon)) {\n // Cancel the contact to prevent and solving\n contact.cancel();\n return;\n }\n if (Math.abs(contact.mtv.x) < epsilon && Math.abs(contact.mtv.y) < epsilon) {\n // Cancel near 0 mtv collisions\n contact.cancel();\n return;\n }\n let mtv = contact.mtv;\n const colliderA = contact.colliderA;\n const colliderB = contact.colliderB;\n const bodyA = (_a = colliderA.owner) === null || _a === void 0 ? void 0 : _a.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_3__.BodyComponent);\n const bodyB = (_b = colliderB.owner) === null || _b === void 0 ? void 0 : _b.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_3__.BodyComponent);\n if (bodyA && bodyB) {\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Passive || bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Passive) {\n return;\n }\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Active && bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Active) {\n // split overlaps if both are Active\n mtv = mtv.scale(0.5);\n }\n // Resolve overlaps\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Active) {\n bodyA.globalPos.x -= mtv.x;\n bodyA.globalPos.y -= mtv.y;\n colliderA.update(bodyA.transform.get());\n }\n if (bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Active) {\n bodyB.globalPos.x += mtv.x;\n bodyB.globalPos.y += mtv.y;\n colliderB.update(bodyB.transform.get());\n }\n }\n }\n solveVelocity(contact) {\n var _a, _b;\n if (contact.isCanceled()) {\n return;\n }\n const colliderA = contact.colliderA;\n const colliderB = contact.colliderB;\n const bodyA = (_a = colliderA.owner) === null || _a === void 0 ? void 0 : _a.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_3__.BodyComponent);\n const bodyB = (_b = colliderB.owner) === null || _b === void 0 ? void 0 : _b.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_3__.BodyComponent);\n if (bodyA && bodyB) {\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Passive || bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Passive) {\n return;\n }\n const normal = contact.normal;\n const opposite = normal.negate();\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Active) {\n // only adjust velocity if the contact normal is opposite to the current velocity\n // this avoids catching edges on a platform when sliding off\n if (bodyA.vel.normalize().dot(opposite) < 0) {\n // Cancel out velocity opposite direction of collision normal\n const velAdj = normal.scale(normal.dot(bodyA.vel.negate()));\n bodyA.vel = bodyA.vel.add(velAdj);\n }\n }\n if (bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Active) {\n // only adjust velocity if the contact normal is opposite to the current velocity\n // this avoids catching edges on a platform\n if (bodyB.vel.normalize().dot(normal) < 0) {\n const velAdj = opposite.scale(opposite.dot(bodyB.vel.negate()));\n bodyB.vel = bodyB.vel.add(velAdj);\n }\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Solver/ContactBias.ts\":\n/*!*****************************************!*\\\n !*** ./Collision/Solver/ContactBias.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ContactSolveBias: () => (/* binding */ ContactSolveBias),\n/* harmony export */ HorizontalFirst: () => (/* binding */ HorizontalFirst),\n/* harmony export */ None: () => (/* binding */ None),\n/* harmony export */ VerticalFirst: () => (/* binding */ VerticalFirst)\n/* harmony export */ });\n/**\n * Tells the Arcade collision solver to prefer certain contacts over others\n */\nvar ContactSolveBias;\n(function (ContactSolveBias) {\n ContactSolveBias[\"None\"] = \"none\";\n ContactSolveBias[\"VerticalFirst\"] = \"vertical-first\";\n ContactSolveBias[\"HorizontalFirst\"] = \"horizontal-first\";\n})(ContactSolveBias || (ContactSolveBias = {}));\n/**\n * Vertical First contact solve bias Used by the {@apilink ArcadeSolver} to sort contacts\n */\nconst VerticalFirst = {\n vertical: 1,\n horizontal: 2\n};\n/**\n * Horizontal First contact solve bias Used by the {@apilink ArcadeSolver} to sort contacts\n */\nconst HorizontalFirst = {\n horizontal: 1,\n vertical: 2\n};\n/**\n * None value, {@apilink ArcadeSolver} sorts contacts using distance by default\n */\nconst None = {\n horizontal: 0,\n vertical: 0\n};\n\n\n/***/ }),\n\n/***/ \"./Collision/Solver/ContactConstraintPoint.ts\":\n/*!****************************************************!*\\\n !*** ./Collision/Solver/ContactConstraintPoint.ts ***!\n \\****************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ContactConstraintPoint: () => (/* binding */ ContactConstraintPoint)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n\n/**\n * Holds information about contact points, meant to be reused over multiple frames of contact\n */\nclass ContactConstraintPoint {\n constructor(point, local, contact) {\n this.point = point;\n this.local = local;\n this.contact = contact;\n /**\n * Impulse accumulated over time in normal direction\n */\n this.normalImpulse = 0;\n /**\n * Impulse accumulated over time in the tangent direction\n */\n this.tangentImpulse = 0;\n /**\n * Effective mass seen in the normal direction\n */\n this.normalMass = 0;\n /**\n * Effective mass seen in the tangent direction\n */\n this.tangentMass = 0;\n /**\n * Direction from center of mass of bodyA to contact point\n */\n this.aToContact = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\n /**\n * Direction from center of mass of bodyB to contact point\n */\n this.bToContact = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\n /**\n * Original contact velocity combined with bounciness\n */\n this.originalVelocityAndRestitution = 0;\n this.update();\n }\n /**\n * Updates the contact information\n */\n update() {\n const bodyA = this.contact.bodyA;\n const bodyB = this.contact.bodyB;\n if (bodyA && bodyB) {\n const normal = this.contact.normal;\n const tangent = this.contact.tangent;\n this.aToContact = this.point.sub(bodyA.globalPos);\n this.bToContact = this.point.sub(bodyB.globalPos);\n const aToContactNormal = this.aToContact.cross(normal);\n const bToContactNormal = this.bToContact.cross(normal);\n this.normalMass =\n bodyA.inverseMass +\n bodyB.inverseMass +\n bodyA.inverseInertia * aToContactNormal * aToContactNormal +\n bodyB.inverseInertia * bToContactNormal * bToContactNormal;\n const aToContactTangent = this.aToContact.cross(tangent);\n const bToContactTangent = this.bToContact.cross(tangent);\n this.tangentMass =\n bodyA.inverseMass +\n bodyB.inverseMass +\n bodyA.inverseInertia * aToContactTangent * aToContactTangent +\n bodyB.inverseInertia * bToContactTangent * bToContactTangent;\n }\n return this;\n }\n /**\n * Returns the relative velocity between bodyA and bodyB\n */\n getRelativeVelocity() {\n const bodyA = this.contact.bodyA;\n const bodyB = this.contact.bodyB;\n if (bodyA && bodyB) {\n // Relative velocity in linear terms\n // Angular to linear velocity formula -> omega = velocity/radius so omega x radius = velocity\n const velA = bodyA.vel.add(_Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.cross(bodyA.angularVelocity, this.aToContact));\n const velB = bodyB.vel.add(_Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.cross(bodyB.angularVelocity, this.bToContact));\n return velB.sub(velA);\n }\n return _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Solver/RealisticSolver.ts\":\n/*!*********************************************!*\\\n !*** ./Collision/Solver/RealisticSolver.ts ***!\n \\*********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RealisticSolver: () => (/* binding */ RealisticSolver)\n/* harmony export */ });\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Events */ \"./Events.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _ContactConstraintPoint__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ContactConstraintPoint */ \"./Collision/Solver/ContactConstraintPoint.ts\");\n/* harmony import */ var _Side__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Side */ \"./Collision/Side.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Colliders_CollisionJumpTable__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Colliders/CollisionJumpTable */ \"./Collision/Colliders/CollisionJumpTable.ts\");\n\n\n\n\n\n\n\nclass RealisticSolver {\n constructor(config) {\n this.config = config;\n this.lastFrameContacts = new Map();\n // map contact id to contact points\n this.idToContactConstraint = new Map();\n }\n getContactConstraints(id) {\n var _a;\n return (_a = this.idToContactConstraint.get(id)) !== null && _a !== void 0 ? _a : [];\n }\n solve(contacts) {\n // Events and init\n this.preSolve(contacts);\n // Remove any canceled contacts\n contacts = contacts.filter((c) => !c.isCanceled());\n // Solve velocity first\n this.solveVelocity(contacts);\n // Solve position last because non-overlap is the most important\n this.solvePosition(contacts);\n // Events and any contact house-keeping the solver needs\n this.postSolve(contacts);\n return contacts;\n }\n preSolve(contacts) {\n var _a, _b, _c;\n const epsilon = 0.0001;\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n if (Math.abs(contact.mtv.x) < epsilon && Math.abs(contact.mtv.y) < epsilon) {\n // Cancel near 0 mtv collisions\n contact.cancel();\n continue;\n }\n // Publish collision events on both participants\n const side = _Side__WEBPACK_IMPORTED_MODULE_0__.Side.fromDirection(contact.mtv);\n contact.colliderA.events.emit('precollision', new _Events__WEBPACK_IMPORTED_MODULE_1__.PreCollisionEvent(contact.colliderA, contact.colliderB, side, contact.mtv, contact));\n contact.colliderA.events.emit('beforecollisionresolve', new _Events__WEBPACK_IMPORTED_MODULE_1__.CollisionPreSolveEvent(contact.colliderA, contact.colliderB, side, contact.mtv, contact));\n contact.colliderB.events.emit('precollision', new _Events__WEBPACK_IMPORTED_MODULE_1__.PreCollisionEvent(contact.colliderB, contact.colliderA, _Side__WEBPACK_IMPORTED_MODULE_0__.Side.getOpposite(side), contact.mtv.negate(), contact));\n contact.colliderB.events.emit('beforecollisionresolve', new _Events__WEBPACK_IMPORTED_MODULE_1__.CollisionPreSolveEvent(contact.colliderB, contact.colliderA, _Side__WEBPACK_IMPORTED_MODULE_0__.Side.getOpposite(side), contact.mtv.negate(), contact));\n // Match awake state for sleeping\n contact.matchAwake();\n }\n // Keep track of contacts that done\n const finishedContactIds = Array.from(this.idToContactConstraint.keys());\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n // Remove all current contacts that are not done\n const index = finishedContactIds.indexOf(contact.id);\n if (index > -1) {\n finishedContactIds.splice(index, 1);\n }\n const contactPoints = (_a = this.idToContactConstraint.get(contact.id)) !== null && _a !== void 0 ? _a : [];\n let pointIndex = 0;\n const bodyA = contact.bodyA;\n const bodyB = contact.bodyB;\n if (bodyA && bodyB) {\n for (let j = 0; j < contact.points.length; j++) {\n const point = contact.points[j];\n const normal = contact.normal;\n const tangent = contact.tangent;\n const aToContact = point.sub(bodyA.globalPos);\n const bToContact = point.sub(bodyB.globalPos);\n const aToContactNormal = aToContact.cross(normal);\n const bToContactNormal = bToContact.cross(normal);\n const normalMass = bodyA.inverseMass +\n bodyB.inverseMass +\n bodyA.inverseInertia * aToContactNormal * aToContactNormal +\n bodyB.inverseInertia * bToContactNormal * bToContactNormal;\n const aToContactTangent = aToContact.cross(tangent);\n const bToContactTangent = bToContact.cross(tangent);\n const tangentMass = bodyA.inverseMass +\n bodyB.inverseMass +\n bodyA.inverseInertia * aToContactTangent * aToContactTangent +\n bodyB.inverseInertia * bToContactTangent * bToContactTangent;\n // Preserve normal/tangent impulse by re-using the contact point if it's close\n if (contactPoints[pointIndex] && ((_c = (_b = contactPoints[pointIndex]) === null || _b === void 0 ? void 0 : _b.point) === null || _c === void 0 ? void 0 : _c.squareDistance(point)) < 4) {\n contactPoints[pointIndex].point = point;\n contactPoints[pointIndex].local = contact.localPoints[pointIndex];\n }\n else {\n // new contact if it's not close or doesn't exist\n contactPoints[pointIndex] = new _ContactConstraintPoint__WEBPACK_IMPORTED_MODULE_2__.ContactConstraintPoint(point, contact.localPoints[pointIndex], contact);\n }\n // Update contact point calculations\n contactPoints[pointIndex].aToContact = aToContact;\n contactPoints[pointIndex].bToContact = bToContact;\n contactPoints[pointIndex].normalMass = 1.0 / normalMass;\n contactPoints[pointIndex].tangentMass = 1.0 / tangentMass;\n // Calculate relative velocity before solving to accurately do restitution\n const restitution = bodyA.bounciness > bodyB.bounciness ? bodyA.bounciness : bodyB.bounciness;\n const relativeVelocity = contact.normal.dot(contactPoints[pointIndex].getRelativeVelocity());\n contactPoints[pointIndex].originalVelocityAndRestitution = 0;\n if (relativeVelocity < -0.1) {\n // TODO what's a good threshold here?\n contactPoints[pointIndex].originalVelocityAndRestitution = -restitution * relativeVelocity;\n }\n pointIndex++;\n }\n }\n this.idToContactConstraint.set(contact.id, contactPoints);\n }\n // Clean up any contacts that did not occur last frame\n for (const id of finishedContactIds) {\n this.idToContactConstraint.delete(id);\n }\n // Warm contacts with accumulated impulse\n // Useful for tall stacks\n if (this.config.warmStart) {\n this.warmStart(contacts);\n }\n else {\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n const contactPoints = this.getContactConstraints(contact.id);\n for (const point of contactPoints) {\n point.normalImpulse = 0;\n point.tangentImpulse = 0;\n }\n }\n }\n }\n postSolve(contacts) {\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n const bodyA = contact.bodyA;\n const bodyB = contact.bodyB;\n if (bodyA && bodyB) {\n // Skip post solve for active+passive collisions\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_3__.CollisionType.Passive || bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_3__.CollisionType.Passive) {\n continue;\n }\n // Update motion values for sleeping\n bodyA.updateMotion();\n bodyB.updateMotion();\n }\n // Publish collision events on both participants\n const side = _Side__WEBPACK_IMPORTED_MODULE_0__.Side.fromDirection(contact.mtv);\n contact.colliderA.events.emit('postcollision', new _Events__WEBPACK_IMPORTED_MODULE_1__.PostCollisionEvent(contact.colliderA, contact.colliderB, side, contact.mtv, contact));\n contact.colliderA.events.emit('aftercollisionresolve', new _Events__WEBPACK_IMPORTED_MODULE_1__.CollisionPostSolveEvent(contact.colliderA, contact.colliderB, side, contact.mtv, contact));\n contact.colliderB.events.emit('postcollision', new _Events__WEBPACK_IMPORTED_MODULE_1__.PostCollisionEvent(contact.colliderB, contact.colliderA, _Side__WEBPACK_IMPORTED_MODULE_0__.Side.getOpposite(side), contact.mtv.negate(), contact));\n contact.colliderB.events.emit('aftercollisionresolve', new _Events__WEBPACK_IMPORTED_MODULE_1__.CollisionPostSolveEvent(contact.colliderB, contact.colliderA, _Side__WEBPACK_IMPORTED_MODULE_0__.Side.getOpposite(side), contact.mtv.negate(), contact));\n }\n // Store contacts\n this.lastFrameContacts.clear();\n for (let i = 0; i < contacts.length; i++) {\n const c = contacts[i];\n this.lastFrameContacts.set(c.id, c);\n }\n }\n /**\n * Warm up body's based on previous frame contact points\n * @param contacts\n */\n warmStart(contacts) {\n var _a;\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n const bodyA = contact.bodyA;\n const bodyB = contact.bodyB;\n if (bodyA && bodyB) {\n const contactPoints = (_a = this.idToContactConstraint.get(contact.id)) !== null && _a !== void 0 ? _a : [];\n for (const point of contactPoints) {\n if (this.config.warmStart) {\n const normalImpulse = contact.normal.scale(point.normalImpulse);\n const tangentImpulse = contact.tangent.scale(point.tangentImpulse);\n const impulse = normalImpulse.add(tangentImpulse);\n bodyA.applyImpulse(point.point, impulse.negate());\n bodyB.applyImpulse(point.point, impulse);\n }\n else {\n point.normalImpulse = 0;\n point.tangentImpulse = 0;\n }\n }\n }\n }\n }\n /**\n * Iteratively solve the position overlap constraint\n * @param contacts\n */\n solvePosition(contacts) {\n var _a;\n for (let i = 0; i < this.config.positionIterations; i++) {\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n const bodyA = contact.bodyA;\n const bodyB = contact.bodyB;\n if (bodyA && bodyB) {\n // Skip solving active+passive\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_3__.CollisionType.Passive || bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_3__.CollisionType.Passive) {\n continue;\n }\n const constraints = (_a = this.idToContactConstraint.get(contact.id)) !== null && _a !== void 0 ? _a : [];\n for (const point of constraints) {\n const normal = contact.normal;\n const separation = _Colliders_CollisionJumpTable__WEBPACK_IMPORTED_MODULE_4__.CollisionJumpTable.FindContactSeparation(contact, point.local);\n const steeringConstant = this.config.steeringFactor; //0.2;\n const maxCorrection = -5;\n const slop = this.config.slop; //1;\n // Clamp to avoid over-correction\n // Remember that we are shooting for 0 overlap in the end\n const steeringForce = (0,_Math_util__WEBPACK_IMPORTED_MODULE_5__.clamp)(steeringConstant * (separation + slop), maxCorrection, 0);\n const impulse = normal.scale(-steeringForce * point.normalMass);\n // This is a pseudo impulse, meaning we aren't doing a real impulse calculation\n // We adjust position and rotation instead of doing the velocity\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_3__.CollisionType.Active) {\n // TODO make applyPseudoImpulse function?\n const impulseForce = impulse.negate().scale(bodyA.inverseMass);\n if (bodyA.limitDegreeOfFreedom.includes(_BodyComponent__WEBPACK_IMPORTED_MODULE_6__.DegreeOfFreedom.X)) {\n impulseForce.x = 0;\n }\n if (bodyA.limitDegreeOfFreedom.includes(_BodyComponent__WEBPACK_IMPORTED_MODULE_6__.DegreeOfFreedom.Y)) {\n impulseForce.y = 0;\n }\n bodyA.globalPos = bodyA.globalPos.add(impulseForce);\n if (!bodyA.limitDegreeOfFreedom.includes(_BodyComponent__WEBPACK_IMPORTED_MODULE_6__.DegreeOfFreedom.Rotation)) {\n bodyA.rotation -= point.aToContact.cross(impulse) * bodyA.inverseInertia;\n }\n }\n if (bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_3__.CollisionType.Active) {\n const impulseForce = impulse.scale(bodyB.inverseMass);\n if (bodyB.limitDegreeOfFreedom.includes(_BodyComponent__WEBPACK_IMPORTED_MODULE_6__.DegreeOfFreedom.X)) {\n impulseForce.x = 0;\n }\n if (bodyB.limitDegreeOfFreedom.includes(_BodyComponent__WEBPACK_IMPORTED_MODULE_6__.DegreeOfFreedom.Y)) {\n impulseForce.y = 0;\n }\n bodyB.globalPos = bodyB.globalPos.add(impulseForce);\n if (!bodyB.limitDegreeOfFreedom.includes(_BodyComponent__WEBPACK_IMPORTED_MODULE_6__.DegreeOfFreedom.Rotation)) {\n bodyB.rotation += point.bToContact.cross(impulse) * bodyB.inverseInertia;\n }\n }\n }\n }\n }\n }\n }\n solveVelocity(contacts) {\n var _a;\n for (let i = 0; i < this.config.velocityIterations; i++) {\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n const bodyA = contact.bodyA;\n const bodyB = contact.bodyB;\n if (bodyA && bodyB) {\n // Skip solving active+passive\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_3__.CollisionType.Passive || bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_3__.CollisionType.Passive) {\n continue;\n }\n const friction = Math.min(bodyA.friction, bodyB.friction);\n const constraints = (_a = this.idToContactConstraint.get(contact.id)) !== null && _a !== void 0 ? _a : [];\n // Friction constraint\n for (const point of constraints) {\n const relativeVelocity = point.getRelativeVelocity();\n // Negate velocity in tangent direction to simulate friction\n const tangentVelocity = -relativeVelocity.dot(contact.tangent);\n let impulseDelta = tangentVelocity * point.tangentMass;\n // Clamping based in Erin Catto's GDC 2006 talk\n // Correct clamping https://github.com/erincatto/box2d-lite/blob/master/docs/GDC2006_Catto_Erin_PhysicsTutorial.pdf\n // Accumulated fiction impulse is always between -uMaxFriction < dT < uMaxFriction\n // But deltas can vary\n const maxFriction = friction * point.normalImpulse;\n const newImpulse = (0,_Math_util__WEBPACK_IMPORTED_MODULE_5__.clamp)(point.tangentImpulse + impulseDelta, -maxFriction, maxFriction);\n impulseDelta = newImpulse - point.tangentImpulse;\n point.tangentImpulse = newImpulse;\n const impulse = contact.tangent.scale(impulseDelta);\n bodyA.applyImpulse(point.point, impulse.negate());\n bodyB.applyImpulse(point.point, impulse);\n }\n // Bounce constraint\n for (const point of constraints) {\n // Need to recalc relative velocity because the previous step could have changed vel\n const relativeVelocity = point.getRelativeVelocity();\n // Compute impulse in normal direction\n const normalVelocity = relativeVelocity.dot(contact.normal);\n // Per Erin it is a mistake to apply the restitution inside the iteration\n // From Erin Catto's Box2D we keep original contact velocity and adjust by small impulses\n let impulseDelta = -point.normalMass * (normalVelocity - point.originalVelocityAndRestitution);\n // Clamping based in Erin Catto's GDC 2014 talk\n // Accumulated impulse stored in the contact is always positive (dV > 0)\n // But deltas can be negative\n const newImpulse = Math.max(point.normalImpulse + impulseDelta, 0);\n impulseDelta = newImpulse - point.normalImpulse;\n point.normalImpulse = newImpulse;\n const impulse = contact.normal.scale(impulseDelta);\n bodyA.applyImpulse(point.point, impulse.negate());\n bodyB.applyImpulse(point.point, impulse);\n }\n }\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Color.ts\":\n/*!******************!*\\\n !*** ./Color.ts ***!\n \\******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Color: () => (/* binding */ Color)\n/* harmony export */ });\n/**\n * Provides standard colors (e.g. {@apilink Color.Black})\n * but you can also create custom colors using RGB, HSL, or Hex. Also provides\n * useful color operations like {@apilink Color.lighten}, {@apilink Color.darken}, and more.\n */\nclass Color {\n /**\n * Creates a new instance of Color from an r, g, b, a\n * @param r The red component of color (0-255)\n * @param g The green component of color (0-255)\n * @param b The blue component of color (0-255)\n * @param a The alpha component of color (0-1.0)\n */\n constructor(r, g, b, a) {\n this.r = r;\n this.g = g;\n this.b = b;\n this.a = a != null ? a : 1;\n }\n /**\n * Creates a new instance of Color from an r, g, b, a\n * @param r The red component of color (0-255)\n * @param g The green component of color (0-255)\n * @param b The blue component of color (0-255)\n * @param a The alpha component of color (0-1.0)\n */\n static fromRGB(r, g, b, a) {\n return new Color(r, g, b, a);\n }\n /**\n * Creates a new instance of Color from a rgb string\n * @param string CSS color string of the form rgba(255, 255, 255, 1) or rgb(255, 255, 255)\n */\n static fromRGBString(string) {\n const rgbaRegEx = /^rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*(\\d+(?:\\.\\d+)?))?\\)/i;\n let match = null;\n if ((match = string.match(rgbaRegEx))) {\n const r = parseInt(match[1], 10);\n const g = parseInt(match[2], 10);\n const b = parseInt(match[3], 10);\n let a = 1;\n if (match[4]) {\n a = parseFloat(match[4]);\n }\n return new Color(r, g, b, a);\n }\n else {\n throw new Error('Invalid rgb/a string: ' + string);\n }\n }\n /**\n * Creates a new instance of Color from a hex string\n * @param hex CSS color string of the form #ffffff, the alpha component is optional\n */\n static fromHex(hex) {\n const hexRegEx = /^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})?$/i;\n let match = null;\n if ((match = hex.match(hexRegEx))) {\n const r = parseInt(match[1], 16);\n const g = parseInt(match[2], 16);\n const b = parseInt(match[3], 16);\n let a = 1;\n if (match[4]) {\n a = parseInt(match[4], 16) / 255;\n }\n return new Color(r, g, b, a);\n }\n else {\n throw new Error('Invalid hex string: ' + hex);\n }\n }\n /**\n * Creates a new instance of Color from hsla values\n * @param h Hue is represented [0-1]\n * @param s Saturation is represented [0-1]\n * @param l Luminance is represented [0-1]\n * @param a Alpha is represented [0-1]\n */\n static fromHSL(h, s, l, a = 1.0) {\n const temp = new HSLColor(h, s, l, a);\n return temp.toRGBA();\n }\n /**\n * Lightens the current color by a specified amount\n * @param factor The amount to lighten by [0-1]\n */\n lighten(factor = 0.1) {\n const temp = HSLColor.fromRGBA(this.r, this.g, this.b, this.a);\n temp.l += (1 - temp.l) * factor;\n return temp.toRGBA();\n }\n /**\n * Darkens the current color by a specified amount\n * @param factor The amount to darken by [0-1]\n */\n darken(factor = 0.1) {\n const temp = HSLColor.fromRGBA(this.r, this.g, this.b, this.a);\n temp.l -= temp.l * factor;\n return temp.toRGBA();\n }\n /**\n * Saturates the current color by a specified amount\n * @param factor The amount to saturate by [0-1]\n */\n saturate(factor = 0.1) {\n const temp = HSLColor.fromRGBA(this.r, this.g, this.b, this.a);\n temp.s += temp.s * factor;\n return temp.toRGBA();\n }\n /**\n * Desaturates the current color by a specified amount\n * @param factor The amount to desaturate by [0-1]\n */\n desaturate(factor = 0.1) {\n const temp = HSLColor.fromRGBA(this.r, this.g, this.b, this.a);\n temp.s -= temp.s * factor;\n return temp.toRGBA();\n }\n /**\n * Multiplies a color by another, results in a darker color\n * @param color The other color\n */\n multiply(color) {\n const newR = (((color.r / 255) * this.r) / 255) * 255;\n const newG = (((color.g / 255) * this.g) / 255) * 255;\n const newB = (((color.b / 255) * this.b) / 255) * 255;\n const newA = color.a * this.a;\n return new Color(newR, newG, newB, newA);\n }\n /**\n * Screens a color by another, results in a lighter color\n * @param color The other color\n */\n screen(color) {\n const color1 = color.invert();\n const color2 = color.invert();\n return color1.multiply(color2).invert();\n }\n /**\n * Inverts the current color\n */\n invert() {\n return new Color(255 - this.r, 255 - this.g, 255 - this.b, 1.0 - this.a);\n }\n /**\n * Averages the current color with another\n * @param color The other color\n */\n average(color) {\n const newR = (color.r + this.r) / 2;\n const newG = (color.g + this.g) / 2;\n const newB = (color.b + this.b) / 2;\n const newA = (color.a + this.a) / 2;\n return new Color(newR, newG, newB, newA);\n }\n equal(color) {\n return this.toString() === color.toString();\n }\n /**\n * Returns a CSS string representation of a color.\n * @param format Color representation, accepts: rgb, hsl, or hex\n */\n toString(format = 'rgb') {\n switch (format) {\n case 'rgb':\n return this.toRGBA();\n case 'hsl':\n return this.toHSLA();\n case 'hex':\n return this.toHex();\n default:\n throw new Error('Invalid Color format');\n }\n }\n /**\n * Returns Hex Value of a color component\n * @param c color component\n * @see https://stackoverflow.com/questions/5623838/rgb-to-hex-and-hex-to-rgb\n */\n _componentToHex(c) {\n // Handle negative and fractional numbers\n const hex = Math.max(Math.round(c), 0).toString(16);\n return hex.length === 1 ? '0' + hex : hex;\n }\n /**\n * Return Hex representation of a color.\n */\n toHex() {\n let hexRepresentation = '#' + this._componentToHex(this.r) + this._componentToHex(this.g) + this._componentToHex(this.b);\n if (this.a !== 1) {\n hexRepresentation += this._componentToHex(this.a * 255);\n }\n return hexRepresentation;\n }\n /**\n * Return RGBA representation of a color.\n */\n toRGBA() {\n const result = String(this.r.toFixed(0)) + ', ' + String(this.g.toFixed(0)) + ', ' + String(this.b.toFixed(0));\n if (this.a !== undefined || this.a !== null) {\n return 'rgba(' + result + ', ' + String(this.a) + ')';\n }\n return 'rgb(' + result + ')';\n }\n /**\n * Return HSLA representation of a color.\n */\n toHSLA() {\n return HSLColor.fromRGBA(this.r, this.g, this.b, this.a).toString();\n }\n /**\n * Returns a CSS string representation of a color.\n */\n fillStyle() {\n return this.toString();\n }\n /**\n * Returns a clone of the current color.\n */\n clone(dest) {\n const result = dest || new Color(this.r, this.g, this.b, this.a);\n result.r = this.r;\n result.g = this.g;\n result.b = this.b;\n result.a = this.a;\n return result;\n }\n /**\n * Black (#000000)\n */\n static get Black() {\n return Color.fromHex('#000000');\n }\n /**\n * White (#FFFFFF)\n */\n static get White() {\n return Color.fromHex('#FFFFFF');\n }\n /**\n * Gray (#808080)\n */\n static get Gray() {\n return Color.fromHex('#808080');\n }\n /**\n * Light gray (#D3D3D3)\n */\n static get LightGray() {\n return Color.fromHex('#D3D3D3');\n }\n /**\n * Dark gray (#A9A9A9)\n */\n static get DarkGray() {\n return Color.fromHex('#A9A9A9');\n }\n /**\n * Yellow (#FFFF00)\n */\n static get Yellow() {\n return Color.fromHex('#FFFF00');\n }\n /**\n * Orange (#FFA500)\n */\n static get Orange() {\n return Color.fromHex('#FFA500');\n }\n /**\n * Red (#FF0000)\n */\n static get Red() {\n return Color.fromHex('#FF0000');\n }\n /**\n * Vermilion (#FF5B31)\n */\n static get Vermilion() {\n return Color.fromHex('#FF5B31');\n }\n /**\n * Rose (#FF007F)\n */\n static get Rose() {\n return Color.fromHex('#FF007F');\n }\n /**\n * Pink (#FFC0CB)\n */\n static get Pink() {\n return Color.fromHex('#FFC0CB');\n }\n /**\n * Magenta (#FF00FF)\n */\n static get Magenta() {\n return Color.fromHex('#FF00FF');\n }\n /**\n * Violet (#7F00FF)\n */\n static get Violet() {\n return Color.fromHex('#7F00FF');\n }\n /**\n * Purple (#800080)\n */\n static get Purple() {\n return Color.fromHex('#800080');\n }\n /**\n * Blue (#0000FF)\n */\n static get Blue() {\n return Color.fromHex('#0000FF');\n }\n /**\n * Azure (#007FFF)\n */\n static get Azure() {\n return Color.fromHex('#007FFF');\n }\n /**\n * Cyan (#00FFFF)\n */\n static get Cyan() {\n return Color.fromHex('#00FFFF');\n }\n /**\n * Viridian (#59978F)\n */\n static get Viridian() {\n return Color.fromHex('#59978F');\n }\n /**\n * Teal (#008080)\n */\n static get Teal() {\n return Color.fromHex('#008080');\n }\n /**\n * Green (#00FF00)\n */\n static get Green() {\n return Color.fromHex('#00FF00');\n }\n /**\n * Chartreuse (#7FFF00)\n */\n static get Chartreuse() {\n return Color.fromHex('#7FFF00');\n }\n /**\n * Transparent (#FFFFFF00)\n */\n static get Transparent() {\n return Color.fromHex('#FFFFFF00');\n }\n /**\n * ExcaliburBlue (#176BAA)\n */\n static get ExcaliburBlue() {\n return Color.fromHex('#176BAA');\n }\n /**\n * Brown (#964B00)\n */\n static get Brown() {\n return Color.fromHex('#964B00');\n }\n}\n/**\n * Internal HSL Color representation\n *\n * http://en.wikipedia.org/wiki/HSL_and_HSV\n * http://axonflux.com/handy-rgb-to-hsl-and-rgb-to-hsv-color-model-c\n */\nclass HSLColor {\n constructor(h, s, l, a) {\n this.h = h;\n this.s = s;\n this.l = l;\n this.a = a;\n }\n static hue2rgb(p, q, t) {\n if (t < 0) {\n t += 1;\n }\n if (t > 1) {\n t -= 1;\n }\n if (t < 1 / 6) {\n return p + (q - p) * 6 * t;\n }\n if (t < 1 / 2) {\n return q;\n }\n if (t < 2 / 3) {\n return p + (q - p) * (2 / 3 - t) * 6;\n }\n return p;\n }\n static fromRGBA(r, g, b, a) {\n r /= 255;\n g /= 255;\n b /= 255;\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h, s;\n const l = (max + min) / 2;\n if (max === min) {\n h = s = 0; // achromatic\n }\n else {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n h /= 6;\n }\n return new HSLColor(h, s, l, a);\n }\n toRGBA() {\n let r, g, b;\n if (this.s === 0) {\n r = g = b = this.l; // achromatic\n }\n else {\n const q = this.l < 0.5 ? this.l * (1 + this.s) : this.l + this.s - this.l * this.s;\n const p = 2 * this.l - q;\n r = HSLColor.hue2rgb(p, q, this.h + 1 / 3);\n g = HSLColor.hue2rgb(p, q, this.h);\n b = HSLColor.hue2rgb(p, q, this.h - 1 / 3);\n }\n return new Color(r * 255, g * 255, b * 255, this.a);\n }\n toString() {\n const h = this.h.toFixed(0), s = this.s.toFixed(0), l = this.l.toFixed(0), a = this.a.toFixed(0);\n return `hsla(${h}, ${s}, ${l}, ${a})`;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Context.ts\":\n/*!********************!*\\\n !*** ./Context.ts ***!\n \\********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ createContext: () => (/* binding */ createContext),\n/* harmony export */ useContext: () => (/* binding */ useContext)\n/* harmony export */ });\n/**\n * Creates a injectable context that can be retrieved later with `useContext(context)`\n *\n * Example\n * ```typescript\n *\n * const AppContext = createContext({some: 'value'});\n * context.scope(val, () => {\n * const value = useContext(AppContext);\n * })\n *\n * ```\n */\nfunction createContext() {\n const ctx = {\n scope: (value, cb) => {\n const old = ctx.value;\n ctx.value = value;\n try {\n return cb();\n }\n catch (e) {\n throw e;\n }\n finally {\n ctx.value = old;\n }\n },\n value: undefined\n };\n return ctx;\n}\n/**\n * Retrieves the value from the current context\n */\nfunction useContext(context) {\n return context.value;\n}\n\n\n/***/ }),\n\n/***/ \"./Debug/DebugConfig.ts\":\n/*!******************************!*\\\n !*** ./Debug/DebugConfig.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DebugConfig: () => (/* binding */ DebugConfig),\n/* harmony export */ FrameStats: () => (/* binding */ FrameStats),\n/* harmony export */ PhysicsStats: () => (/* binding */ PhysicsStats)\n/* harmony export */ });\n/* harmony import */ var _DebugFlags__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./DebugFlags */ \"./Debug/DebugFlags.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n\n\n/**\n * Debug statistics and flags for Excalibur. If polling these values, it would be\n * best to do so on the `postupdate` event for {@apilink Engine}, after all values have been\n * updated during a frame.\n */\nclass DebugConfig {\n constructor(engine) {\n /**\n * Performance statistics\n */\n this.stats = {\n /**\n * Current frame statistics. Engine reuses this instance, use {@apilink FrameStats.clone} to copy frame stats.\n * Best accessed on {@apilink postframe} event. See {@apilink FrameStats}\n */\n currFrame: new FrameStats(),\n /**\n * Previous frame statistics. Engine reuses this instance, use {@apilink FrameStats.clone} to copy frame stats.\n * Best accessed on {@apilink preframe} event. Best inspected on engine event `preframe`. See {@apilink FrameStats}\n */\n prevFrame: new FrameStats()\n };\n /**\n * Filter debug context to named entities or entity ids\n */\n this.filter = {\n /**\n * Toggle filter on or off (default off) must be on for DebugDraw to use filters\n */\n useFilter: false,\n /**\n * Query for entities by name, if the entity name contains `nameQuery` it will be included\n */\n nameQuery: '',\n /**\n * Query for Entity ids, if the id matches it will be included\n */\n ids: []\n };\n /**\n * Entity debug settings\n */\n this.entity = {\n showAll: false,\n showId: false,\n showName: false\n };\n /**\n * Transform component debug settings\n */\n this.transform = {\n showAll: false,\n debugZIndex: 10000000,\n showPosition: false,\n showPositionLabel: false,\n positionColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Yellow,\n showZIndex: false,\n showScale: false,\n scaleColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Green,\n showRotation: false,\n rotationColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Blue\n };\n /**\n * Graphics component debug settings\n */\n this.graphics = {\n showAll: false,\n showBounds: false,\n boundsColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Yellow\n };\n /**\n * Collider component debug settings\n */\n this.collider = {\n showAll: false,\n showBounds: false,\n boundsColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Blue,\n showOwner: false,\n showGeometry: true,\n geometryColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Green,\n geometryLineWidth: 1,\n geometryPointSize: 0.5\n };\n /**\n * Physics simulation debug settings\n */\n this.physics = {\n showAll: false,\n showBroadphaseSpacePartitionDebug: false,\n showCollisionNormals: false,\n collisionNormalColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Cyan,\n showCollisionContacts: true,\n contactSize: 2,\n collisionContactColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Red\n };\n /**\n * Motion component debug settings\n */\n this.motion = {\n showAll: false,\n showVelocity: false,\n velocityColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Yellow,\n showAcceleration: false,\n accelerationColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Red\n };\n /**\n * Body component debug settings\n */\n this.body = {\n showAll: false,\n showCollisionGroup: false,\n showCollisionType: false,\n showSleeping: false,\n showMotion: false,\n showMass: false\n };\n /**\n * Camera debug settings\n */\n this.camera = {\n showAll: false,\n showFocus: false,\n focusColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Red,\n showZoom: false\n };\n this.tilemap = {\n showAll: false,\n showGrid: false,\n gridColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Red,\n gridWidth: 0.5,\n showSolidBounds: false,\n solidBoundsColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.fromHex('#8080807F'), // grayish\n showColliderGeometry: true\n };\n this.isometric = {\n showAll: false,\n showPosition: false,\n positionColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Yellow,\n positionSize: 1,\n showGrid: false,\n gridColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Red,\n gridWidth: 1,\n showColliderGeometry: true\n };\n this._engine = engine;\n this.colorBlindMode = new _DebugFlags__WEBPACK_IMPORTED_MODULE_1__.ColorBlindFlags(this._engine);\n }\n /**\n * Switch the current excalibur clock with the {@apilink TestClock} and return\n * it in the same running state.\n *\n * This is useful when you need to debug frame by frame.\n */\n useTestClock() {\n const clock = this._engine.clock;\n const wasRunning = clock.isRunning();\n clock.stop();\n const testClock = clock.toTestClock();\n if (wasRunning) {\n testClock.start();\n }\n this._engine.clock = testClock;\n return testClock;\n }\n /**\n * Switch the current excalibur clock with the {@apilink StandardClock} and\n * return it in the same running state.\n *\n * This is useful when you need to switch back to normal mode after\n * debugging.\n */\n useStandardClock() {\n const currentClock = this._engine.clock;\n const wasRunning = currentClock.isRunning();\n currentClock.stop();\n const standardClock = currentClock.toStandardClock();\n if (wasRunning) {\n standardClock.start();\n }\n this._engine.clock = standardClock;\n return standardClock;\n }\n}\n/**\n * Implementation of a frame's stats. Meant to have values copied via {@apilink FrameStats.reset}, avoid\n * creating instances of this every frame.\n */\nclass FrameStats {\n constructor() {\n this._id = 0;\n this._elapsedMs = 0;\n this._fps = 0;\n this._actorStats = {\n alive: 0,\n killed: 0,\n ui: 0,\n get remaining() {\n return this.alive - this.killed;\n },\n get total() {\n return this.remaining + this.ui;\n }\n };\n this._durationStats = {\n update: 0,\n draw: 0,\n get total() {\n return this.update + this.draw;\n }\n };\n this._physicsStats = new PhysicsStats();\n this._graphicsStats = {\n drawCalls: 0,\n drawnImages: 0\n };\n }\n /**\n * Zero out values or clone other IFrameStat stats. Allows instance reuse.\n * @param [otherStats] Optional stats to clone\n */\n reset(otherStats) {\n if (otherStats) {\n this.id = otherStats.id;\n this.elapsedMs = otherStats.elapsedMs;\n this.fps = otherStats.fps;\n this.actors.alive = otherStats.actors.alive;\n this.actors.killed = otherStats.actors.killed;\n this.actors.ui = otherStats.actors.ui;\n this.duration.update = otherStats.duration.update;\n this.duration.draw = otherStats.duration.draw;\n this._physicsStats.reset(otherStats.physics);\n this.graphics.drawCalls = otherStats.graphics.drawCalls;\n this.graphics.drawnImages = otherStats.graphics.drawnImages;\n }\n else {\n this.id = this.elapsedMs = this.fps = 0;\n this.actors.alive = this.actors.killed = this.actors.ui = 0;\n this.duration.update = this.duration.draw = 0;\n this._physicsStats.reset();\n this.graphics.drawnImages = this.graphics.drawCalls = 0;\n }\n }\n /**\n * Provides a clone of this instance.\n */\n clone() {\n const fs = new FrameStats();\n fs.reset(this);\n return fs;\n }\n /**\n * Gets the frame's id\n */\n get id() {\n return this._id;\n }\n /**\n * Sets the frame's id\n */\n set id(value) {\n this._id = value;\n }\n /**\n * Gets the frame's delta (time since last frame)\n */\n get elapsedMs() {\n return this._elapsedMs;\n }\n /**\n * Sets the frame's delta (time since last frame). Internal use only.\n * @internal\n */\n set elapsedMs(value) {\n this._elapsedMs = value;\n }\n /**\n * Gets the frame's frames-per-second (FPS)\n */\n get fps() {\n return this._fps;\n }\n /**\n * Sets the frame's frames-per-second (FPS). Internal use only.\n * @internal\n */\n set fps(value) {\n this._fps = value;\n }\n /**\n * Gets the frame's actor statistics\n */\n get actors() {\n return this._actorStats;\n }\n /**\n * Gets the frame's duration statistics\n */\n get duration() {\n return this._durationStats;\n }\n /**\n * Gets the frame's physics statistics\n */\n get physics() {\n return this._physicsStats;\n }\n /**\n * Gets the frame's graphics statistics\n */\n get graphics() {\n return this._graphicsStats;\n }\n}\nclass PhysicsStats {\n constructor() {\n this._pairs = 0;\n this._collisions = 0;\n this._contacts = new Map();\n this._fastBodies = 0;\n this._fastBodyCollisions = 0;\n this._broadphase = 0;\n this._narrowphase = 0;\n }\n /**\n * Zero out values or clone other IPhysicsStats stats. Allows instance reuse.\n * @param [otherStats] Optional stats to clone\n */\n reset(otherStats) {\n if (otherStats) {\n this.pairs = otherStats.pairs;\n this.collisions = otherStats.collisions;\n this.contacts = otherStats.contacts;\n this.fastBodies = otherStats.fastBodies;\n this.fastBodyCollisions = otherStats.fastBodyCollisions;\n this.broadphase = otherStats.broadphase;\n this.narrowphase = otherStats.narrowphase;\n }\n else {\n this.pairs = this.collisions = this.fastBodies = 0;\n this.fastBodyCollisions = this.broadphase = this.narrowphase = 0;\n this.contacts.clear();\n }\n }\n /**\n * Provides a clone of this instance.\n */\n clone() {\n const ps = new PhysicsStats();\n ps.reset(this);\n return ps;\n }\n get pairs() {\n return this._pairs;\n }\n set pairs(value) {\n this._pairs = value;\n }\n get collisions() {\n return this._collisions;\n }\n set collisions(value) {\n this._collisions = value;\n }\n get contacts() {\n return this._contacts;\n }\n set contacts(contacts) {\n this._contacts = contacts;\n }\n get fastBodies() {\n return this._fastBodies;\n }\n set fastBodies(value) {\n this._fastBodies = value;\n }\n get fastBodyCollisions() {\n return this._fastBodyCollisions;\n }\n set fastBodyCollisions(value) {\n this._fastBodyCollisions = value;\n }\n get broadphase() {\n return this._broadphase;\n }\n set broadphase(value) {\n this._broadphase = value;\n }\n get narrowphase() {\n return this._narrowphase;\n }\n set narrowphase(value) {\n this._narrowphase = value;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Debug/DebugFlags.ts\":\n/*!*****************************!*\\\n !*** ./Debug/DebugFlags.ts ***!\n \\*****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ColorBlindFlags: () => (/* binding */ ColorBlindFlags)\n/* harmony export */ });\n/* harmony import */ var _Graphics_PostProcessor_ColorBlindnessMode__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Graphics/PostProcessor/ColorBlindnessMode */ \"./Graphics/PostProcessor/ColorBlindnessMode.ts\");\n/* harmony import */ var _Graphics_PostProcessor_ColorBlindnessPostProcessor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Graphics/PostProcessor/ColorBlindnessPostProcessor */ \"./Graphics/PostProcessor/ColorBlindnessPostProcessor.ts\");\n/* harmony import */ var _Graphics_Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Graphics/Context/ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n\n\n\nclass ColorBlindFlags {\n constructor(engine) {\n this._engine = engine;\n this._colorBlindPostProcessor = new _Graphics_PostProcessor_ColorBlindnessPostProcessor__WEBPACK_IMPORTED_MODULE_0__.ColorBlindnessPostProcessor(_Graphics_PostProcessor_ColorBlindnessMode__WEBPACK_IMPORTED_MODULE_1__.ColorBlindnessMode.Protanope);\n }\n /**\n * Correct colors for a specified color blindness\n * @param colorBlindness\n */\n correct(colorBlindness) {\n if (this._engine.graphicsContext instanceof _Graphics_Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_2__.ExcaliburGraphicsContextWebGL) {\n this.clear();\n this._colorBlindPostProcessor.colorBlindnessMode = colorBlindness;\n this._colorBlindPostProcessor.simulate = false;\n this._engine.graphicsContext.addPostProcessor(this._colorBlindPostProcessor);\n }\n }\n /**\n * Simulate colors for a specified color blindness\n * @param colorBlindness\n */\n simulate(colorBlindness) {\n if (this._engine.graphicsContext instanceof _Graphics_Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_2__.ExcaliburGraphicsContextWebGL) {\n this.clear();\n this._colorBlindPostProcessor.colorBlindnessMode = colorBlindness;\n this._colorBlindPostProcessor.simulate = true;\n this._engine.graphicsContext.addPostProcessor(this._colorBlindPostProcessor);\n }\n }\n /**\n * Remove color blindness post processor\n */\n clear() {\n this._engine.graphicsContext.removePostProcessor(this._colorBlindPostProcessor);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Debug/DebugSystem.ts\":\n/*!******************************!*\\\n !*** ./Debug/DebugSystem.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DebugSystem: () => (/* binding */ DebugSystem)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../Collision/ColliderComponent */ \"./Collision/ColliderComponent.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Priority.ts\");\n/* harmony import */ var _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../Collision/BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Collision_CollisionSystem__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Collision/CollisionSystem */ \"./Collision/CollisionSystem.ts\");\n/* harmony import */ var _Collision_Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../Collision/Colliders/CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Graphics/GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Particles_Particles__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Particles/Particles */ \"./Particles/Particles.ts\");\n/* harmony import */ var _Graphics_DebugGraphicsComponent__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Graphics/DebugGraphicsComponent */ \"./Graphics/DebugGraphicsComponent.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Math/coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _Graphics_Debug__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../Graphics/Debug */ \"./Graphics/Debug.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass DebugSystem extends _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.System {\n constructor(world) {\n super();\n this.world = world;\n this.systemType = _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.SystemType.Draw;\n this.query = this.world.query([_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_1__.TransformComponent]);\n }\n initialize(world, scene) {\n this._graphicsContext = scene.engine.graphicsContext;\n this._camera = scene.camera;\n this._engine = scene.engine;\n this._collisionSystem = world.systemManager.get(_Collision_CollisionSystem__WEBPACK_IMPORTED_MODULE_2__.CollisionSystem);\n }\n update() {\n var _a;\n if (!this._engine.isDebug) {\n return;\n }\n const filterSettings = this._engine.debug.filter;\n let id;\n let name;\n const entitySettings = this._engine.debug.entity;\n let tx;\n const txSettings = this._engine.debug.transform;\n let motion;\n const motionSettings = this._engine.debug.motion;\n let colliderComp;\n const colliderSettings = this._engine.debug.collider;\n const physicsSettings = this._engine.debug.physics;\n let graphics;\n const graphicsSettings = this._engine.debug.graphics;\n let debugDraw;\n let body;\n const bodySettings = this._engine.debug.body;\n const cameraSettings = this._engine.debug.camera;\n for (let i = 0; i < this.query.entities.length; i++) {\n const entity = this.query.entities[i];\n if (entity.hasTag('offscreen')) {\n // skip offscreen entities\n continue;\n }\n if (entity instanceof _Particles_Particles__WEBPACK_IMPORTED_MODULE_3__.Particle) {\n // Particles crush the renderer :(\n continue;\n }\n if (filterSettings.useFilter) {\n const allIds = filterSettings.ids.length === 0;\n const idMatch = allIds || filterSettings.ids.includes(entity.id);\n if (!idMatch) {\n continue;\n }\n const allNames = filterSettings.nameQuery === '';\n const nameMatch = allNames || entity.name.includes(filterSettings.nameQuery);\n if (!nameMatch) {\n continue;\n }\n }\n let cursor = _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero;\n const lineHeight = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(0, 16);\n id = entity.id;\n name = entity.name;\n tx = entity.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n // This optionally sets our camera based on the entity coord plan (world vs. screen)\n this._pushCameraTransform(tx);\n this._graphicsContext.save();\n if (tx.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_5__.CoordPlane.Screen) {\n this._graphicsContext.translate(this._engine.screen.contentArea.left, this._engine.screen.contentArea.top);\n }\n this._graphicsContext.z = txSettings.debugZIndex;\n this._applyTransform(entity);\n if (tx) {\n if (txSettings.showAll || txSettings.showPosition) {\n this._graphicsContext.debug.drawPoint(_Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero, { size: 4, color: txSettings.positionColor });\n }\n if (txSettings.showAll || txSettings.showPositionLabel) {\n this._graphicsContext.debug.drawText(`pos${tx.pos.toString(2)}`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (txSettings.showAll || txSettings.showZIndex) {\n this._graphicsContext.debug.drawText(`z(${tx.z.toFixed(1)})`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (entitySettings.showAll || entitySettings.showId) {\n this._graphicsContext.debug.drawText(`id(${id}) ${entity.parent ? 'child of id(' + ((_a = entity.parent) === null || _a === void 0 ? void 0 : _a.id) + ')' : ''}`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (entitySettings.showAll || entitySettings.showName) {\n this._graphicsContext.debug.drawText(`name(${name})`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (txSettings.showAll || txSettings.showRotation) {\n this._graphicsContext.drawLine(_Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero, _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.fromAngle(tx.rotation).scale(50).add(_Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero), txSettings.rotationColor, 2);\n this._graphicsContext.debug.drawText(`rot deg(${(0,_Math_util__WEBPACK_IMPORTED_MODULE_6__.toDegrees)(tx.rotation).toFixed(2)})`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (txSettings.showAll || txSettings.showScale) {\n this._graphicsContext.drawLine(_Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero, tx.scale.add(_Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero), txSettings.scaleColor, 2);\n }\n }\n graphics = entity.get(_Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_7__.GraphicsComponent);\n if (graphics) {\n if (graphicsSettings.showAll || graphicsSettings.showBounds) {\n const bounds = graphics.localBounds;\n bounds.draw(this._graphicsContext, graphicsSettings.boundsColor);\n }\n }\n debugDraw = entity.get(_Graphics_DebugGraphicsComponent__WEBPACK_IMPORTED_MODULE_8__.DebugGraphicsComponent);\n if (debugDraw) {\n if (!debugDraw.useTransform) {\n this._graphicsContext.restore();\n }\n debugDraw.draw(this._graphicsContext, this._engine.debug);\n if (!debugDraw.useTransform) {\n this._graphicsContext.save();\n this._applyTransform(entity);\n }\n }\n body = entity.get(_Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_9__.BodyComponent);\n if (body) {\n if (bodySettings.showAll || bodySettings.showCollisionGroup) {\n this._graphicsContext.debug.drawText(`collision group(${body.group.name})`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (bodySettings.showAll || bodySettings.showCollisionType) {\n this._graphicsContext.debug.drawText(`collision type(${body.collisionType})`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (bodySettings.showAll || bodySettings.showMass) {\n this._graphicsContext.debug.drawText(`mass(${body.mass})`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (bodySettings.showAll || bodySettings.showMotion) {\n this._graphicsContext.debug.drawText(`motion(${body.sleepMotion})`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (bodySettings.showAll || bodySettings.showSleeping) {\n this._graphicsContext.debug.drawText(`sleeping(${body.canSleep ? body.isSleeping : 'cant sleep'})`, cursor);\n cursor = cursor.add(lineHeight);\n }\n }\n this._graphicsContext.restore();\n // World space\n this._graphicsContext.save();\n if (tx.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_5__.CoordPlane.Screen) {\n this._graphicsContext.translate(this._engine.screen.contentArea.left, this._engine.screen.contentArea.top);\n }\n this._graphicsContext.z = txSettings.debugZIndex;\n motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_10__.MotionComponent);\n if (motion) {\n if (motionSettings.showAll || motionSettings.showVelocity) {\n this._graphicsContext.debug.drawText(`vel${motion.vel.toString(2)}`, cursor.add(tx.globalPos));\n this._graphicsContext.drawLine(tx.globalPos, tx.globalPos.add(motion.vel), motionSettings.velocityColor, 2);\n cursor = cursor.add(lineHeight);\n }\n if (motionSettings.showAll || motionSettings.showAcceleration) {\n this._graphicsContext.drawLine(tx.globalPos, tx.globalPos.add(motion.acc), motionSettings.accelerationColor, 2);\n }\n }\n // Colliders live in world space already so after the restore()\n colliderComp = entity.get(_Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_11__.ColliderComponent);\n if (colliderComp) {\n const collider = colliderComp.get();\n if ((colliderSettings.showAll || colliderSettings.showGeometry) && collider) {\n collider.debug(this._graphicsContext, colliderSettings.geometryColor, {\n lineWidth: colliderSettings.geometryLineWidth,\n pointSize: colliderSettings.geometryPointSize\n });\n }\n if (colliderSettings.showAll || colliderSettings.showBounds) {\n if (collider instanceof _Collision_Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_12__.CompositeCollider) {\n const colliders = collider.getColliders();\n for (const collider of colliders) {\n const bounds = collider.bounds;\n const pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(bounds.left, bounds.top);\n this._graphicsContext.debug.drawRect(pos.x, pos.y, bounds.width, bounds.height, { color: colliderSettings.boundsColor });\n if (colliderSettings.showAll || colliderSettings.showOwner) {\n this._graphicsContext.debug.drawText(`owner id(${collider.owner.id})`, pos);\n }\n }\n colliderComp.bounds.draw(this._graphicsContext, colliderSettings.boundsColor);\n }\n else if (collider) {\n const bounds = colliderComp.bounds;\n const pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(bounds.left, bounds.top);\n this._graphicsContext.debug.drawRect(pos.x, pos.y, bounds.width, bounds.height, { color: colliderSettings.boundsColor });\n if (colliderSettings.showAll || colliderSettings.showOwner) {\n this._graphicsContext.debug.drawText(`owner id(${colliderComp.owner.id})`, pos);\n }\n }\n }\n }\n this._graphicsContext.restore();\n this._popCameraTransform(tx);\n }\n this._graphicsContext.save();\n this._camera.draw(this._graphicsContext);\n if (physicsSettings.showAll || physicsSettings.showBroadphaseSpacePartitionDebug) {\n this._collisionSystem.debug(this._graphicsContext);\n }\n if (physicsSettings.showAll || physicsSettings.showCollisionContacts || physicsSettings.showCollisionNormals) {\n for (const [_, contact] of this._engine.debug.stats.currFrame.physics.contacts) {\n if (physicsSettings.showAll || physicsSettings.showCollisionContacts) {\n for (const point of contact.points) {\n this._graphicsContext.debug.drawPoint(point, {\n size: physicsSettings.contactSize,\n color: physicsSettings.collisionContactColor\n });\n }\n }\n if (physicsSettings.showAll || physicsSettings.showCollisionNormals) {\n for (const point of contact.points) {\n this._graphicsContext.debug.drawLine(point, contact.normal.scale(30).add(point), {\n color: physicsSettings.collisionNormalColor\n });\n }\n }\n }\n }\n this._graphicsContext.restore();\n if (cameraSettings) {\n this._graphicsContext.save();\n this._camera.draw(this._graphicsContext);\n if (cameraSettings.showAll || cameraSettings.showFocus) {\n this._graphicsContext.drawCircle(this._camera.pos, 4, cameraSettings.focusColor);\n }\n if (cameraSettings.showAll || cameraSettings.showZoom) {\n this._graphicsContext.debug.drawText(`zoom(${this._camera.zoom})`, this._camera.pos);\n }\n this._graphicsContext.restore();\n }\n this._graphicsContext.flush();\n }\n postupdate(engine, elapsed) {\n if (this._engine.isDebug) {\n this._graphicsContext.save();\n if (this._camera) {\n this._camera.draw(this._graphicsContext);\n }\n _Graphics_Debug__WEBPACK_IMPORTED_MODULE_13__.Debug.flush(this._graphicsContext);\n this._graphicsContext.restore();\n }\n }\n /**\n * This applies the current entity transform to the graphics context\n * @param entity\n */\n _applyTransform(entity) {\n const ancestors = entity.getAncestors();\n for (const ancestor of ancestors) {\n const transform = ancestor === null || ancestor === void 0 ? void 0 : ancestor.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n if (transform) {\n this._graphicsContext.translate(transform.pos.x, transform.pos.y);\n this._graphicsContext.scale(transform.scale.x, transform.scale.y);\n this._graphicsContext.rotate(transform.rotation);\n }\n }\n }\n /**\n * Applies the current camera transform if in world coordinates\n * @param transform\n */\n _pushCameraTransform(transform) {\n // Establish camera offset per entity\n if (transform.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_5__.CoordPlane.World) {\n this._graphicsContext.save();\n if (this._camera) {\n this._camera.draw(this._graphicsContext);\n }\n }\n }\n /**\n * Resets the current camera transform if in world coordinates\n * @param transform\n */\n _popCameraTransform(transform) {\n if (transform.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_5__.CoordPlane.World) {\n // Apply camera world offset\n this._graphicsContext.restore();\n }\n }\n}\nDebugSystem.priority = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_14__.SystemPriority.Lowest;\n\n\n/***/ }),\n\n/***/ \"./Debug/index.ts\":\n/*!************************!*\\\n !*** ./Debug/index.ts ***!\n \\************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ColorBlindFlags: () => (/* reexport safe */ _DebugFlags__WEBPACK_IMPORTED_MODULE_1__.ColorBlindFlags),\n/* harmony export */ DebugConfig: () => (/* reexport safe */ _DebugConfig__WEBPACK_IMPORTED_MODULE_0__.DebugConfig),\n/* harmony export */ DebugSystem: () => (/* reexport safe */ _DebugSystem__WEBPACK_IMPORTED_MODULE_2__.DebugSystem),\n/* harmony export */ FrameStats: () => (/* reexport safe */ _DebugConfig__WEBPACK_IMPORTED_MODULE_0__.FrameStats),\n/* harmony export */ PhysicsStats: () => (/* reexport safe */ _DebugConfig__WEBPACK_IMPORTED_MODULE_0__.PhysicsStats)\n/* harmony export */ });\n/* harmony import */ var _DebugConfig__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./DebugConfig */ \"./Debug/DebugConfig.ts\");\n/* harmony import */ var _DebugFlags__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./DebugFlags */ \"./Debug/DebugFlags.ts\");\n/* harmony import */ var _DebugSystem__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./DebugSystem */ \"./Debug/DebugSystem.ts\");\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Director/CrossFade.ts\":\n/*!*******************************!*\\\n !*** ./Director/CrossFade.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CrossFade: () => (/* binding */ CrossFade)\n/* harmony export */ });\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Graphics */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Transition__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Transition */ \"./Director/Transition.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n\n\n\n/**\n * CrossFades between the previous scene and the destination scene\n *\n * Note: CrossFade only works as an \"in\" transition\n */\nclass CrossFade extends _Transition__WEBPACK_IMPORTED_MODULE_0__.Transition {\n constructor(options) {\n super({ direction: 'in', ...options }); // default the correct direction\n this.name = `CrossFade#${this.id}`;\n }\n async onPreviousSceneDeactivate(scene) {\n this.image = await scene.engine.screenshot(true);\n // Firefox is particularly slow\n // needed in case the image isn't ready yet\n await this.image.decode();\n }\n onInitialize(engine) {\n this.engine = engine;\n this.transform.pos = engine.screen.unsafeArea.topLeft;\n this.screenCover = _Graphics__WEBPACK_IMPORTED_MODULE_1__.ImageSource.fromHtmlImageElement(this.image).toSprite();\n this.graphics.add(this.screenCover);\n // This is because we preserve hidpi res on the screen shot which COULD be bigger than the logical resolution\n this.transform.scale = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(1 / engine.screen.pixelRatio, 1 / engine.screen.pixelRatio);\n this.graphics.opacity = this.progress;\n }\n onStart(_progress) {\n this.graphics.opacity = this.progress;\n }\n onReset() {\n this.graphics.opacity = this.progress;\n }\n onEnd(progress) {\n this.graphics.opacity = progress;\n }\n onUpdate(progress) {\n this.graphics.opacity = progress;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Director/DefaultLoader.ts\":\n/*!***********************************!*\\\n !*** ./Director/DefaultLoader.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DefaultLoader: () => (/* binding */ DefaultLoader),\n/* harmony export */ LoaderEvents: () => (/* binding */ LoaderEvents),\n/* harmony export */ isLoaderConstructor: () => (/* binding */ isLoaderConstructor)\n/* harmony export */ });\n/* harmony import */ var _Util_WebAudio__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Util/WebAudio */ \"./Util/WebAudio.ts\");\n/* harmony import */ var _Graphics_Canvas__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Graphics/Canvas */ \"./Graphics/Canvas.ts\");\n/* harmony import */ var _Graphics_Filtering__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Graphics/Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Resources_Sound_Sound__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Resources/Sound/Sound */ \"./Resources/Sound/Sound.ts\");\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Util/Future */ \"./Util/Future.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Util/Util */ \"./Util/Util.ts\");\n\n\n\n\n\n\n\n\n\nconst LoaderEvents = {\n // Add event types here\n BeforeLoad: 'beforeload',\n AfterLoad: 'afterload',\n UserAction: 'useraction',\n LoadResourceStart: 'loadresourcestart',\n LoadResourceEnd: 'loadresourceend'\n};\n/**\n * Returns true if the constructor is for an Excalibur Loader\n */\nfunction isLoaderConstructor(x) {\n var _a, _b;\n return !!(x === null || x === void 0 ? void 0 : x.prototype) && !!((_b = (_a = x === null || x === void 0 ? void 0 : x.prototype) === null || _a === void 0 ? void 0 : _a.constructor) === null || _b === void 0 ? void 0 : _b.name);\n}\nclass DefaultLoader {\n get resources() {\n return this._resources;\n }\n /**\n * @param options Optionally provide the list of resources you want to load at constructor time\n */\n constructor(options) {\n var _a;\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n this.canvas = new _Graphics_Canvas__WEBPACK_IMPORTED_MODULE_1__.Canvas({\n filtering: _Graphics_Filtering__WEBPACK_IMPORTED_MODULE_2__.ImageFiltering.Blended,\n smoothing: true,\n cache: false,\n draw: this.onDraw.bind(this)\n });\n this._resources = [];\n this._numLoaded = 0;\n this._totalTimeMs = 0;\n this._loadingFuture = new _Util_Future__WEBPACK_IMPORTED_MODULE_3__.Future();\n if (options && ((_a = options.loadables) === null || _a === void 0 ? void 0 : _a.length)) {\n this.addResources(options.loadables);\n }\n }\n /**\n * Called by the engine before loading\n * @param engine\n */\n onInitialize(engine) {\n this.engine = engine;\n this.canvas.width = this.engine.screen.resolution.width;\n this.canvas.height = this.engine.screen.resolution.height;\n }\n /**\n * Return a promise that resolves when the user interacts with the loading screen in some way, usually a click.\n *\n * It's important to implement this in order to unlock the audio context in the browser. Browsers automatically prevent\n * audio from playing until the user performs an action.\n *\n */\n async onUserAction() {\n return await Promise.resolve();\n }\n /**\n * Overridable lifecycle method, called directly before loading starts\n */\n async onBeforeLoad() {\n // override me\n }\n /**\n * Overridable lifecycle method, called after loading has completed\n */\n async onAfterLoad() {\n // override me\n await (0,_Util_Util__WEBPACK_IMPORTED_MODULE_4__.delay)(500, this.engine.clock); // avoid a flicker\n }\n /**\n * Add a resource to the loader to load\n * @param loadable Resource to add\n */\n addResource(loadable) {\n this._resources.push(loadable);\n }\n /**\n * Add a list of resources to the loader to load\n * @param loadables The list of resources to load\n */\n addResources(loadables) {\n let i = 0;\n const len = loadables.length;\n for (i; i < len; i++) {\n this.addResource(loadables[i]);\n }\n }\n markResourceComplete() {\n this._numLoaded++;\n }\n /**\n * Returns the progress of the loader as a number between [0, 1] inclusive.\n */\n get progress() {\n const total = this._resources.length;\n return total > 0 ? (0,_Math_util__WEBPACK_IMPORTED_MODULE_5__.clamp)(this._numLoaded, 0, total) / total : 1;\n }\n /**\n * Returns true if the loader has completely loaded all resources\n */\n isLoaded() {\n return this._numLoaded === this._resources.length;\n }\n /**\n * Optionally override the onUpdate\n * @param engine\n * @param elapsed\n */\n onUpdate(engine, elapsed) {\n this._totalTimeMs += elapsed;\n // override me\n }\n /**\n * Optionally override the onDraw\n */\n onDraw(ctx) {\n const seconds = this._totalTimeMs / 1000;\n ctx.fillStyle = _Color__WEBPACK_IMPORTED_MODULE_6__.Color.Black.toRGBA();\n ctx.fillRect(0, 0, this.engine.screen.resolution.width, this.engine.screen.resolution.height);\n ctx.save();\n ctx.translate(this.engine.screen.resolution.width / 2, this.engine.screen.resolution.height / 2);\n const speed = seconds * 10;\n ctx.strokeStyle = 'white';\n ctx.lineWidth = 10;\n ctx.lineCap = 'round';\n ctx.arc(0, 0, 40, speed, speed + (Math.PI * 3) / 2);\n ctx.stroke();\n ctx.fillStyle = 'white';\n ctx.font = '16px sans-serif';\n const text = (this.progress * 100).toFixed(0) + '%';\n const textbox = ctx.measureText(text);\n const width = Math.abs(textbox.actualBoundingBoxLeft) + Math.abs(textbox.actualBoundingBoxRight);\n const height = Math.abs(textbox.actualBoundingBoxAscent) + Math.abs(textbox.actualBoundingBoxDescent);\n ctx.fillText(text, -width / 2, height / 2); // center\n ctx.restore();\n }\n areResourcesLoaded() {\n if (this._resources.length === 0) {\n // special case no resources mean loaded;\n return Promise.resolve();\n }\n return this._loadingFuture.promise;\n }\n /**\n * Not meant to be overridden\n *\n * Begin loading all of the supplied resources, returning a promise\n * that resolves when loading of all is complete AND the user has interacted with the loading screen\n */\n async load() {\n await this.onBeforeLoad();\n this.events.emit('beforeload');\n this.canvas.flagDirty();\n await Promise.all(this._resources.map(async (r) => {\n this.events.emit('loadresourcestart', r);\n await r.load().finally(() => {\n // capture progress\n this._numLoaded++;\n this.canvas.flagDirty();\n this.events.emit('loadresourceend', r);\n });\n }));\n // Wire all sound to the engine\n for (const resource of this._resources) {\n if (resource instanceof _Resources_Sound_Sound__WEBPACK_IMPORTED_MODULE_7__.Sound) {\n resource.wireEngine(this.engine);\n }\n }\n this._loadingFuture.resolve();\n this.canvas.flagDirty();\n // Unlock browser AudioContext in after user gesture\n // See: https://github.com/excaliburjs/Excalibur/issues/262\n // See: https://github.com/excaliburjs/Excalibur/issues/1031\n await this.onUserAction();\n this.events.emit('useraction');\n await _Util_WebAudio__WEBPACK_IMPORTED_MODULE_8__.WebAudio.unlock();\n await this.onAfterLoad();\n this.events.emit('afterload');\n return (this.data = this._resources);\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Director/Director.ts\":\n/*!******************************!*\\\n !*** ./Director/Director.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Director: () => (/* binding */ Director),\n/* harmony export */ DirectorEvents: () => (/* binding */ DirectorEvents)\n/* harmony export */ });\n/* harmony import */ var _DefaultLoader__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./DefaultLoader */ \"./Director/DefaultLoader.ts\");\n/* harmony import */ var _Scene__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Scene */ \"./Scene.ts\");\n/* harmony import */ var _Loader__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Loader */ \"./Director/Loader.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n\n\n\nconst DirectorEvents = {\n NavigationStart: 'navigationstart',\n Navigation: 'navigation',\n NavigationEnd: 'navigationend'\n};\n/**\n * The Director is responsible for managing scenes and changing scenes in Excalibur.\n *\n * It deals with transitions, scene loaders, switching scenes\n *\n * This is used internally by Excalibur, generally not mean to\n * be instantiated end users directly.\n */\nclass Director {\n /**\n * Gets whether the director currently transitioning between scenes\n *\n * Useful if you need to block behavior during transition\n */\n get isTransitioning() {\n return this._isTransitioning;\n }\n constructor(_engine, scenes) {\n this._engine = _engine;\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this._initialized = false;\n /**\n * All registered scenes in Excalibur\n */\n this.scenes = {};\n /**\n * Holds all instantiated scenes\n */\n this._sceneToInstance = new Map();\n this._sceneToLoader = new Map();\n this._sceneToTransition = new Map();\n /**\n * Used to keep track of scenes that have already been loaded so we don't load multiple times\n */\n this._loadedScenes = new Set();\n this._isTransitioning = false;\n this.rootScene = this.currentScene = new _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene();\n this.add('root', this.rootScene);\n this.currentScene = this.rootScene;\n this.currentSceneName = 'root';\n for (const sceneKey in scenes) {\n const sceneOrOptions = scenes[sceneKey];\n this.add(sceneKey, sceneOrOptions);\n if (sceneKey === 'root') {\n this.rootScene = this.getSceneInstance('root'); // always a root scene\n this.currentScene = this.rootScene;\n }\n }\n }\n /**\n * Initialize the director's internal state\n */\n async onInitialize() {\n if (!this._initialized) {\n this._initialized = true;\n if (this._deferredGoto) {\n const deferredScene = this._deferredGoto;\n this._deferredGoto = undefined;\n const deferredTransition = this._deferredTransition;\n this._deferredTransition = undefined;\n const deferredSceneInstance = this.getSceneInstance(deferredScene);\n if (deferredSceneInstance && deferredTransition) {\n deferredTransition._addToTargetScene(this._engine, deferredSceneInstance);\n }\n await this.swapScene(deferredScene);\n if (deferredSceneInstance && deferredTransition) {\n await this.playTransition(deferredTransition, deferredSceneInstance);\n }\n }\n else {\n await this.swapScene('root');\n }\n }\n }\n get isInitialized() {\n return this._initialized;\n }\n /**\n * Configures the start scene, and optionally the transition & loader for the director\n *\n * Typically this is called at the beginning of the game to the start scene and transition and never again.\n * @param startScene\n * @param options\n */\n configureStart(startScene, options) {\n const maybeLoaderOrCtor = options === null || options === void 0 ? void 0 : options.loader;\n if (maybeLoaderOrCtor instanceof _DefaultLoader__WEBPACK_IMPORTED_MODULE_3__.DefaultLoader) {\n this.mainLoader = maybeLoaderOrCtor;\n }\n else if ((0,_DefaultLoader__WEBPACK_IMPORTED_MODULE_3__.isLoaderConstructor)(maybeLoaderOrCtor)) {\n this.mainLoader = new maybeLoaderOrCtor();\n }\n else {\n this.mainLoader = new _Loader__WEBPACK_IMPORTED_MODULE_4__.Loader();\n }\n let maybeStartTransition;\n if (options === null || options === void 0 ? void 0 : options.inTransition) {\n const { inTransition } = options;\n maybeStartTransition = inTransition;\n }\n this.startScene = startScene;\n // Fire and forget promise for the initial scene\n if (maybeStartTransition) {\n const startSceneInstance = this.getSceneInstance(this.startScene);\n if (startSceneInstance) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n maybeStartTransition._addToTargetScene(this._engine, startSceneInstance);\n this.swapScene(this.startScene).then(() => {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n return this.playTransition(maybeStartTransition, startSceneInstance);\n });\n }\n }\n else {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.swapScene(this.startScene);\n }\n this.currentSceneName = this.startScene;\n }\n _getLoader(sceneName) {\n return this._sceneToLoader.get(sceneName);\n }\n _getInTransition(sceneName) {\n var _a;\n const sceneOrRoute = this.scenes[sceneName];\n if (sceneOrRoute instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene || (0,_Scene__WEBPACK_IMPORTED_MODULE_2__.isSceneConstructor)(sceneOrRoute)) {\n return undefined;\n }\n return (_a = sceneOrRoute === null || sceneOrRoute === void 0 ? void 0 : sceneOrRoute.transitions) === null || _a === void 0 ? void 0 : _a.in;\n }\n _getOutTransition(sceneName) {\n var _a;\n const sceneOrRoute = this.scenes[sceneName];\n if (sceneOrRoute instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene || (0,_Scene__WEBPACK_IMPORTED_MODULE_2__.isSceneConstructor)(sceneOrRoute)) {\n return undefined;\n }\n return (_a = sceneOrRoute === null || sceneOrRoute === void 0 ? void 0 : sceneOrRoute.transitions) === null || _a === void 0 ? void 0 : _a.out;\n }\n getDeferredScene() {\n const maybeDeferred = this.getSceneDefinition(this._deferredGoto);\n if (this._deferredGoto && maybeDeferred) {\n return maybeDeferred;\n }\n return null;\n }\n /**\n * Returns a scene by name if it exists, might be the constructor and not the instance of a scene\n * @param name\n */\n getSceneDefinition(name) {\n const maybeScene = this.scenes[name];\n if (maybeScene instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene || (0,_Scene__WEBPACK_IMPORTED_MODULE_2__.isSceneConstructor)(maybeScene)) {\n return maybeScene;\n }\n else if (maybeScene) {\n return maybeScene.scene;\n }\n return undefined;\n }\n /**\n * Returns the name of the registered scene, null if none can be found\n * @param scene\n */\n getSceneName(scene) {\n for (const [name, maybeScene] of Object.entries(this.scenes)) {\n if (maybeScene instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene) {\n if (scene === maybeScene) {\n return name;\n }\n }\n else if (!(0,_Scene__WEBPACK_IMPORTED_MODULE_2__.isSceneConstructor)(maybeScene)) {\n if (scene === maybeScene.scene) {\n return name;\n }\n }\n }\n for (const [name, maybeScene] of Object.entries(this.scenes)) {\n if ((0,_Scene__WEBPACK_IMPORTED_MODULE_2__.isSceneConstructor)(maybeScene)) {\n if (scene.constructor === maybeScene) {\n return name;\n }\n }\n else if (!(maybeScene instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene)) {\n if (scene.constructor === maybeScene.scene) {\n return name;\n }\n }\n }\n return null;\n }\n /**\n * Returns the same Director, but asserts a scene DOES exist to the type system\n * @param name\n */\n assertAdded(name) {\n return this;\n }\n /**\n * Returns the same Director, but asserts a scene DOES NOT exist to the type system\n * @param name\n */\n assertRemoved(name) {\n return this;\n }\n /**\n * Adds additional Scenes to the game!\n * @param name\n * @param sceneOrRoute\n */\n add(name, sceneOrRoute) {\n if (!(sceneOrRoute instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene) && !(0,_Scene__WEBPACK_IMPORTED_MODULE_2__.isSceneConstructor)(sceneOrRoute)) {\n const { loader, transitions } = sceneOrRoute;\n const { in: inTransition, out: outTransition } = transitions !== null && transitions !== void 0 ? transitions : {};\n this._sceneToTransition.set(name, { in: inTransition, out: outTransition });\n if ((0,_DefaultLoader__WEBPACK_IMPORTED_MODULE_3__.isLoaderConstructor)(loader)) {\n this._sceneToLoader.set(name, new loader());\n }\n else if (loader) {\n this._sceneToLoader.set(name, loader);\n }\n }\n if (this.scenes[name]) {\n this._logger.warn('Scene', name, 'already exists overwriting');\n }\n this.scenes[name] = sceneOrRoute;\n return this.assertAdded(name);\n }\n remove(nameOrScene) {\n if (nameOrScene instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene || (0,_Scene__WEBPACK_IMPORTED_MODULE_2__.isSceneConstructor)(nameOrScene)) {\n const sceneOrCtor = nameOrScene;\n // remove scene\n for (const key in this.scenes) {\n if (this.scenes.hasOwnProperty(key)) {\n const potentialSceneOrOptions = this.scenes[key];\n let scene;\n if (potentialSceneOrOptions instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene || (0,_Scene__WEBPACK_IMPORTED_MODULE_2__.isSceneConstructor)(potentialSceneOrOptions)) {\n scene = potentialSceneOrOptions;\n }\n else {\n scene = potentialSceneOrOptions.scene;\n }\n if (scene === sceneOrCtor) {\n if (key === this.currentSceneName) {\n throw new Error(`Cannot remove a currently active scene: ${key}`);\n }\n this._sceneToInstance.delete(key);\n this._sceneToTransition.delete(key);\n this._sceneToLoader.delete(key);\n delete this.scenes[key];\n }\n }\n }\n }\n if (typeof nameOrScene === 'string') {\n if (nameOrScene === this.currentSceneName) {\n throw new Error(`Cannot remove a currently active scene: ${nameOrScene}`);\n }\n // remove scene\n this._sceneToInstance.delete(nameOrScene);\n this._sceneToTransition.delete(nameOrScene);\n this._sceneToLoader.delete(nameOrScene);\n delete this.scenes[nameOrScene];\n }\n }\n /**\n * Go to a specific scene, and optionally override loaders and transitions\n * @param destinationScene\n * @param options\n */\n async goToScene(destinationScene, options) {\n var _a, _b, _c, _d, _e, _f;\n const maybeDest = this.getSceneInstance(destinationScene);\n if (!maybeDest) {\n this._logger.warn(`Scene ${destinationScene} does not exist! Check the name, are you sure you added it?`);\n return;\n }\n const sourceSceneInstance = this.currentScene;\n const sourceScene = this.currentSceneName;\n const engineInputEnabled = (_b = (_a = this._engine.input) === null || _a === void 0 ? void 0 : _a.enabled) !== null && _b !== void 0 ? _b : true;\n this._isTransitioning = true;\n const maybeSourceOut = (_c = this.getSceneInstance(sourceScene)) === null || _c === void 0 ? void 0 : _c.onTransition('out');\n const maybeDestinationIn = maybeDest === null || maybeDest === void 0 ? void 0 : maybeDest.onTransition('in');\n options = {\n // Engine configuration then dynamic scene transitions\n ...{ sourceOut: (_d = this._getOutTransition(this.currentSceneName)) !== null && _d !== void 0 ? _d : maybeSourceOut },\n ...{ destinationIn: (_e = this._getInTransition(destinationScene)) !== null && _e !== void 0 ? _e : maybeDestinationIn },\n // Goto options\n ...options\n };\n const { sourceOut, destinationIn, sceneActivationData } = options;\n const outTransition = sourceOut !== null && sourceOut !== void 0 ? sourceOut : this._getOutTransition(this.currentSceneName);\n const inTransition = destinationIn !== null && destinationIn !== void 0 ? destinationIn : this._getInTransition(destinationScene);\n const hideLoader = (outTransition === null || outTransition === void 0 ? void 0 : outTransition.hideLoader) || (inTransition === null || inTransition === void 0 ? void 0 : inTransition.hideLoader);\n if (hideLoader) {\n // Start hidden loader early and take advantage of the transition\n // Don't await and block on a hidden loader\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.maybeLoadScene(destinationScene, hideLoader);\n }\n this._emitEvent('navigationstart', sourceScene, destinationScene);\n // Run the out transition on the current scene if present\n if (outTransition) {\n await this.playTransition(outTransition, sourceSceneInstance);\n }\n // Run the loader if present\n await this.maybeLoadScene(destinationScene, hideLoader);\n // Give incoming transition a chance to grab info from previous\n if (inTransition) {\n await inTransition.onPreviousSceneDeactivate(this.currentScene);\n }\n // Setup the in transition on the destination scene if present\n // this is important to it can be initialized with the\n if (inTransition) {\n inTransition._addToTargetScene(this._engine, maybeDest);\n }\n // Swap to the new scene\n // Runs scene lifecycle init and activate\n await this.swapScene(destinationScene, sceneActivationData);\n this._emitEvent('navigation', sourceScene, destinationScene);\n // Run the in transition on the new scene if present\n if (inTransition) {\n await this.playTransition(inTransition, maybeDest);\n }\n this._emitEvent('navigationend', sourceScene, destinationScene);\n (_f = this._engine.input) === null || _f === void 0 ? void 0 : _f.toggleEnabled(engineInputEnabled);\n this._isTransitioning = false;\n }\n /**\n * Retrieves a scene instance by key if it's registered.\n *\n * This will call any constructors that were given as a definition\n * @param scene\n */\n getSceneInstance(scene) {\n const sceneDefinition = this.getSceneDefinition(scene);\n if (!sceneDefinition) {\n return undefined;\n }\n if (this._sceneToInstance.has(scene)) {\n return this._sceneToInstance.get(scene);\n }\n if (sceneDefinition instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene) {\n this._sceneToInstance.set(scene, sceneDefinition);\n return sceneDefinition;\n }\n const newScene = new sceneDefinition();\n this._sceneToInstance.set(scene, newScene);\n return newScene;\n }\n /**\n * Triggers scene loading if has not already been loaded\n * @param scene\n * @param hideLoader\n */\n async maybeLoadScene(scene, hideLoader = false) {\n var _a;\n const loader = (_a = this._getLoader(scene)) !== null && _a !== void 0 ? _a : new _DefaultLoader__WEBPACK_IMPORTED_MODULE_3__.DefaultLoader();\n const sceneToLoad = this.getSceneDefinition(scene);\n const sceneToLoadInstance = this.getSceneInstance(scene);\n if (sceneToLoad && sceneToLoadInstance && !this._loadedScenes.has(sceneToLoadInstance)) {\n sceneToLoadInstance.onPreLoad(loader);\n sceneToLoadInstance.events.emit('preload', { loader });\n if (hideLoader) {\n // Don't await a hidden loader\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this._engine.load(loader, hideLoader);\n }\n else {\n await this._engine.load(loader);\n }\n this._loadedScenes.add(sceneToLoadInstance);\n }\n }\n /**\n * Plays a transition in the current scene and does book keeping for input.\n * @param transition\n */\n async playTransition(transition, targetScene) {\n var _a, _b, _c, _d, _e, _f, _g;\n if (!this.isInitialized) {\n this._deferredTransition = transition;\n return;\n }\n if (transition) {\n this.currentTransition = transition;\n const sceneInputEnabled = (_b = (_a = targetScene.input) === null || _a === void 0 ? void 0 : _a.enabled) !== null && _b !== void 0 ? _b : true;\n (_c = targetScene.input) === null || _c === void 0 ? void 0 : _c.toggleEnabled(!transition.blockInput);\n (_d = this._engine.input) === null || _d === void 0 ? void 0 : _d.toggleEnabled(!transition.blockInput);\n this.currentTransition._addToTargetScene(this._engine, targetScene);\n await this.currentTransition._play();\n (_e = targetScene.input) === null || _e === void 0 ? void 0 : _e.toggleEnabled(sceneInputEnabled);\n }\n (_f = this.currentTransition) === null || _f === void 0 ? void 0 : _f.kill();\n (_g = this.currentTransition) === null || _g === void 0 ? void 0 : _g.reset();\n this.currentTransition = undefined;\n }\n /**\n * Swaps the current and destination scene after performing required lifecycle events\n * @param destinationScene\n * @param data\n */\n async swapScene(destinationScene, data) {\n const engine = this._engine;\n // if not yet initialized defer goToScene\n if (!this.isInitialized) {\n this._deferredGoto = destinationScene;\n return;\n }\n const maybeDest = this.getSceneInstance(destinationScene);\n if (maybeDest) {\n const previousScene = this.currentScene;\n const nextScene = maybeDest;\n this._logger.debug('Going to scene:', destinationScene);\n // only deactivate when initialized\n if (this.currentScene.isInitialized) {\n const context = { engine, previousScene, nextScene };\n await this.currentScene._deactivate(context);\n this.currentScene.events.emit('deactivate', new _Events__WEBPACK_IMPORTED_MODULE_5__.DeactivateEvent(context, this.currentScene));\n this.currentScene.input.clear();\n }\n // wait for the scene to be loaded if needed\n const destLoader = this._sceneToLoader.get(destinationScene);\n await (destLoader === null || destLoader === void 0 ? void 0 : destLoader.areResourcesLoaded());\n // set current scene to new one\n this.currentScene = nextScene;\n this.currentSceneName = destinationScene;\n engine.screen.setCurrentCamera(nextScene.camera);\n // initialize the current scene if has not been already\n await this.currentScene._initialize(engine);\n const context = { engine, previousScene, nextScene, data };\n await this.currentScene._activate(context);\n this.currentScene.events.emit('activate', new _Events__WEBPACK_IMPORTED_MODULE_5__.ActivateEvent(context, this.currentScene));\n }\n else {\n this._logger.error('Scene', destinationScene, 'does not exist!');\n }\n }\n _emitEvent(eventName, sourceScene, destinationScene) {\n const source = this.getSceneDefinition(sourceScene);\n const dest = this.getSceneDefinition(destinationScene);\n this.events.emit(eventName, {\n sourceScene: source,\n sourceName: sourceScene,\n destinationScene: dest,\n destinationName: destinationScene\n });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Director/FadeInOut.ts\":\n/*!*******************************!*\\\n !*** ./Director/FadeInOut.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FadeInOut: () => (/* binding */ FadeInOut)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Graphics */ \"./Graphics/Rectangle.ts\");\n/* harmony import */ var _Transition__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Transition */ \"./Director/Transition.ts\");\n\n\n\nclass FadeInOut extends _Transition__WEBPACK_IMPORTED_MODULE_0__.Transition {\n constructor(options) {\n var _a, _b;\n super({\n ...options,\n duration: (_a = options.duration) !== null && _a !== void 0 ? _a : 2000\n });\n this.name = `FadeInOut#${this.id}`;\n this.color = (_b = options.color) !== null && _b !== void 0 ? _b : _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Black;\n }\n onInitialize(engine) {\n this.transform.pos = engine.screen.unsafeArea.topLeft;\n this.screenCover = new _Graphics__WEBPACK_IMPORTED_MODULE_2__.Rectangle({\n width: engine.screen.resolution.width,\n height: engine.screen.resolution.height,\n color: this.color\n });\n this.graphics.add(this.screenCover);\n this.graphics.opacity = this.progress;\n }\n onReset() {\n this.graphics.opacity = this.progress;\n }\n onStart(progress) {\n this.graphics.opacity = progress;\n }\n onEnd(progress) {\n this.graphics.opacity = progress;\n }\n onUpdate(progress) {\n this.graphics.opacity = progress;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Director/Loader.ts\":\n/*!****************************!*\\\n !*** ./Director/Loader.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Loader: () => (/* binding */ Loader)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Util_DrawUtil__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Util/DrawUtil */ \"./Util/DrawUtil.ts\");\n/* harmony import */ var _Loader_logo_png__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Loader.logo.png */ \"./Director/Loader.logo.png\");\n/* harmony import */ var _Loader_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Loader.css */ \"./Director/Loader.css\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Util/Util */ \"./Util/Util.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _DefaultLoader__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./DefaultLoader */ \"./Director/DefaultLoader.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Util/Future */ \"./Util/Future.ts\");\n\n\n\n\n\n\n\n\n\n/**\n * Pre-loading assets\n *\n * The loader provides a mechanism to preload multiple resources at\n * one time. The loader must be passed to the engine in order to\n * trigger the loading progress bar.\n *\n * The {@apilink Loader} itself implements {@apilink Loadable} so you can load loaders.\n *\n * ## Example: Pre-loading resources for a game\n *\n * ```js\n * // create a loader\n * var loader = new ex.Loader();\n *\n * // create a resource dictionary (best practice is to keep a separate file)\n * var resources = {\n * TextureGround: new ex.Texture(\"/images/textures/ground.png\"),\n * SoundDeath: new ex.Sound(\"/sound/death.wav\", \"/sound/death.mp3\")\n * };\n *\n * // loop through dictionary and add to loader\n * for (var loadable in resources) {\n * if (resources.hasOwnProperty(loadable)) {\n * loader.addResource(resources[loadable]);\n * }\n * }\n *\n * // start game\n * game.start(loader).then(function () {\n * console.log(\"Game started!\");\n * });\n * ```\n *\n * ## Customize the Loader\n *\n * The loader can be customized to show different, text, logo, background color, and button.\n *\n * ```typescript\n * const loader = new ex.Loader([playerTexture]);\n *\n * // The loaders button text can simply modified using this\n * loader.playButtonText = 'Start the best game ever';\n *\n * // The logo can be changed by inserting a base64 image string here\n *\n * loader.logo = 'data:image/png;base64,iVBORw...';\n * loader.logoWidth = 15;\n * loader.logoHeight = 14;\n *\n * // The background color can be changed like so by supplying a valid CSS color string\n *\n * loader.backgroundColor = 'red'\n * loader.backgroundColor = '#176BAA'\n *\n * // To build a completely new button\n * loader.startButtonFactory = () => {\n * let myButton = document.createElement('button');\n * myButton.textContent = 'The best button';\n * return myButton;\n * };\n *\n * engine.start(loader).then(() => {});\n * ```\n */\nclass Loader extends _DefaultLoader__WEBPACK_IMPORTED_MODULE_0__.DefaultLoader {\n get _image() {\n if (!this._imageElement) {\n this._imageElement = new Image();\n this._imageElement.onload = () => this._imageLoaded.resolve();\n this._imageElement.src = this.logo;\n }\n return this._imageElement;\n }\n get playButtonRootElement() {\n return this._playButtonRootElement;\n }\n get playButtonElement() {\n return this._playButtonElement;\n }\n get _playButton() {\n const existingRoot = document.getElementById('excalibur-play-root');\n if (existingRoot) {\n this._playButtonRootElement = existingRoot;\n }\n if (!this._playButtonRootElement) {\n this._playButtonRootElement = document.createElement('div');\n this._playButtonRootElement.id = 'excalibur-play-root';\n this._playButtonRootElement.style.position = 'absolute';\n document.body.appendChild(this._playButtonRootElement);\n }\n if (!this._styleBlock) {\n this._styleBlock = document.createElement('style');\n this._styleBlock.textContent = this._playButtonStyles;\n document.head.appendChild(this._styleBlock);\n }\n if (!this._playButtonElement) {\n this._playButtonElement = this.startButtonFactory();\n this._playButtonRootElement.appendChild(this._playButtonElement);\n }\n return this._playButtonElement;\n }\n constructor(loadablesOrOptions) {\n const options = Array.isArray(loadablesOrOptions)\n ? {\n loadables: loadablesOrOptions\n }\n : loadablesOrOptions;\n super(options);\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this._originalOptions = { loadables: [] };\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_2__.EventEmitter();\n this._playButtonShown = false;\n // logo drawing stuff\n // base64 string encoding of the excalibur logo (logo-white.png)\n this.logo = _Loader_logo_png__WEBPACK_IMPORTED_MODULE_3__[\"default\"];\n this.logoWidth = 468;\n this.logoHeight = 118;\n /**\n * Gets or sets the color of the loading bar, default is {@apilink Color.White}\n */\n this.loadingBarColor = _Color__WEBPACK_IMPORTED_MODULE_4__.Color.White;\n /**\n * Gets or sets the background color of the loader as a hex string\n */\n this.backgroundColor = '#176BAA';\n this._imageLoaded = new _Util_Future__WEBPACK_IMPORTED_MODULE_5__.Future();\n this.suppressPlayButton = false;\n /** Loads the css from Loader.css */\n this._playButtonStyles = _Loader_css__WEBPACK_IMPORTED_MODULE_6__[\"default\"].toString();\n /**\n * Get/set play button text\n */\n this.playButtonText = 'Play game';\n /**\n * Return a html button element for excalibur to use as a play button\n */\n this.startButtonFactory = () => {\n let buttonElement = document.getElementById('excalibur-play');\n if (!buttonElement) {\n buttonElement = document.createElement('button');\n }\n buttonElement.id = 'excalibur-play';\n buttonElement.textContent = this.playButtonText;\n buttonElement.style.display = 'none';\n return buttonElement;\n };\n this._originalOptions = { ...Loader._DEFAULT_LOADER_OPTIONS, ...options };\n }\n onInitialize(engine) {\n this.engine = engine;\n this.screen = engine.screen;\n this.canvas.width = this.engine.canvas.width;\n this.canvas.height = this.engine.canvas.height;\n this.screen.events.on('resize', () => {\n this.canvas.width = this.engine.canvas.width;\n this.canvas.height = this.engine.canvas.height;\n });\n }\n /**\n * Shows the play button and returns a promise that resolves when clicked\n */\n async showPlayButton() {\n var _a, _b;\n if (this.suppressPlayButton) {\n this.hidePlayButton();\n // Delay is to give the logo a chance to show, otherwise don't delay\n await (0,_Util_Util__WEBPACK_IMPORTED_MODULE_7__.delay)(500, (_a = this.engine) === null || _a === void 0 ? void 0 : _a.clock);\n }\n else {\n const resizeHandler = () => {\n try {\n this._positionPlayButton();\n }\n catch (_a) {\n // swallow if can't position\n }\n };\n if ((_b = this.engine) === null || _b === void 0 ? void 0 : _b.browser) {\n this.engine.browser.window.on('resize', resizeHandler);\n }\n this._playButtonShown = true;\n this._playButton.style.display = 'block';\n document.body.addEventListener('keyup', (evt) => {\n if (evt.key === 'Enter') {\n this._playButton.click();\n }\n });\n this._positionPlayButton();\n const playButtonClicked = new Promise((resolve) => {\n const startButtonHandler = (e) => {\n var _a;\n // We want to stop propagation to keep bubbling to the engine pointer handlers\n e.stopPropagation();\n // Hide Button after click\n this.hidePlayButton();\n if ((_a = this.engine) === null || _a === void 0 ? void 0 : _a.browser) {\n this.engine.browser.window.off('resize', resizeHandler);\n }\n if (this._originalOptions.fullscreenAfterLoad) {\n try {\n this._logger.info('requesting fullscreen');\n if (this._originalOptions.fullscreenContainer instanceof HTMLElement) {\n this._originalOptions.fullscreenContainer.requestFullscreen();\n }\n else {\n this.engine.screen.goFullScreen(this._originalOptions.fullscreenContainer);\n }\n }\n catch (error) {\n this._logger.error('could not go fullscreen', error);\n }\n }\n resolve();\n };\n this._playButton.addEventListener('click', startButtonHandler);\n this._playButton.addEventListener('touchend', startButtonHandler);\n this._playButton.addEventListener('pointerup', startButtonHandler);\n });\n return await playButtonClicked;\n }\n }\n hidePlayButton() {\n this._playButtonShown = false;\n this._playButton.style.display = 'none';\n }\n /**\n * Clean up generated elements for the loader\n */\n dispose() {\n if (this._playButtonRootElement.parentElement) {\n this._playButtonRootElement.removeChild(this._playButtonElement);\n document.body.removeChild(this._playButtonRootElement);\n document.head.removeChild(this._styleBlock);\n this._playButtonRootElement = null;\n this._playButtonElement = null;\n this._styleBlock = null;\n }\n }\n async onUserAction() {\n var _a;\n // short delay in showing the button for aesthetics\n await (0,_Util_Util__WEBPACK_IMPORTED_MODULE_7__.delay)(200, (_a = this.engine) === null || _a === void 0 ? void 0 : _a.clock);\n this.canvas.flagDirty();\n // show play button\n await this.showPlayButton();\n }\n async onBeforeLoad() {\n this.screen.pushResolutionAndViewport();\n this.screen.resolution = { width: this.canvas.width, height: this.canvas.height };\n this.screen.applyResolutionAndViewport();\n const image = this._image;\n await this._imageLoaded.promise;\n await (image === null || image === void 0 ? void 0 : image.decode()); // decode logo if it exists\n }\n // eslint-disable-next-line require-await\n async onAfterLoad() {\n this.screen.popResolutionAndViewport();\n this.screen.applyResolutionAndViewport();\n this.dispose();\n }\n _positionPlayButton() {\n if (this.engine) {\n const { x: left, y: top, width: screenWidth, height: screenHeight } = this.engine.canvas.getBoundingClientRect();\n if (this._playButtonRootElement) {\n const buttonWidth = this._playButton.clientWidth;\n const buttonHeight = this._playButton.clientHeight;\n if (this.playButtonPosition) {\n this._playButtonRootElement.style.left = `${this.playButtonPosition.x}px`;\n this._playButtonRootElement.style.top = `${this.playButtonPosition.y}px`;\n }\n else {\n this._playButtonRootElement.style.left = `${left + screenWidth / 2 - buttonWidth / 2}px`;\n this._playButtonRootElement.style.top = `${top + screenHeight / 2 - buttonHeight / 2 + 100}px`;\n }\n }\n }\n }\n /**\n * Loader draw function. Draws the default Excalibur loading screen.\n * Override `logo`, `logoWidth`, `logoHeight` and `backgroundColor` properties\n * to customize the drawing, or just override entire method.\n */\n onDraw(ctx) {\n const canvasHeight = this.engine.canvasHeight / this.engine.pixelRatio;\n const canvasWidth = this.engine.canvasWidth / this.engine.pixelRatio;\n this._positionPlayButton();\n ctx.fillStyle = this.backgroundColor;\n ctx.fillRect(0, 0, canvasWidth, canvasHeight);\n let logoY = canvasHeight / 2;\n const width = Math.min(this.logoWidth, canvasWidth * 0.75);\n let logoX = canvasWidth / 2 - width / 2;\n if (this.logoPosition) {\n logoX = this.logoPosition.x;\n logoY = this.logoPosition.y;\n }\n const imageHeight = Math.floor(width * (this.logoHeight / this.logoWidth)); // OG height/width factor\n const oldAntialias = this.engine.screen.antialiasing;\n this.engine.screen.antialiasing = true;\n if (!this.logoPosition) {\n ctx.drawImage(this._image, 0, 0, this.logoWidth, this.logoHeight, logoX, logoY - imageHeight - 20, width, imageHeight);\n }\n else {\n ctx.drawImage(this._image, 0, 0, this.logoWidth, this.logoHeight, logoX, logoY, width, imageHeight);\n }\n // loading box\n if (!this.suppressPlayButton && this._playButtonShown) {\n this.engine.screen.antialiasing = oldAntialias;\n return;\n }\n let loadingX = logoX;\n let loadingY = logoY;\n if (this.loadingBarPosition) {\n loadingX = this.loadingBarPosition.x;\n loadingY = this.loadingBarPosition.y;\n }\n ctx.lineWidth = 2;\n _Util_DrawUtil__WEBPACK_IMPORTED_MODULE_8__.roundRect(ctx, loadingX, loadingY, width, 20, 10, this.loadingBarColor);\n const progress = width * this.progress;\n const margin = 5;\n const progressWidth = progress - margin * 2;\n const height = 20 - margin * 2;\n _Util_DrawUtil__WEBPACK_IMPORTED_MODULE_8__.roundRect(ctx, loadingX + margin, loadingY + margin, progressWidth > 10 ? progressWidth : 10, height, 5, null, this.loadingBarColor);\n this.engine.screen.antialiasing = oldAntialias;\n }\n}\nLoader._DEFAULT_LOADER_OPTIONS = {\n loadables: [],\n fullscreenAfterLoad: false,\n fullscreenContainer: undefined\n};\n\n\n/***/ }),\n\n/***/ \"./Director/Slide.ts\":\n/*!***************************!*\\\n !*** ./Director/Slide.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Slide: () => (/* binding */ Slide)\n/* harmony export */ });\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Graphics */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Transition__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Transition */ \"./Director/Transition.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/EasingFunctions */ \"./Util/EasingFunctions.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Math/coord-plane */ \"./Math/coord-plane.ts\");\n\n\n\n\n\n/**\n * Slide`s between the previous scene and the destination scene\n *\n * Note: Slide` only works as an \"in\" transition\n */\nclass Slide extends _Transition__WEBPACK_IMPORTED_MODULE_0__.Transition {\n constructor(options) {\n var _a;\n super({ direction: 'in', ...options }); // default the correct direction\n this._easing = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_1__.EasingFunctions.Linear;\n this.name = `Slide#${this.id}`;\n this.slideDirection = options.slideDirection;\n this.transform.coordPlane = _Math_coord_plane__WEBPACK_IMPORTED_MODULE_2__.CoordPlane.World;\n this.graphics.forceOnScreen = true;\n this._easing = (_a = options.easingFunction) !== null && _a !== void 0 ? _a : this._easing;\n this._vectorEasing = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_1__.EasingFunctions.CreateVectorEasingFunction(this._easing);\n }\n async onPreviousSceneDeactivate(scene) {\n this._image = await scene.engine.screenshot(true);\n // Firefox is particularly slow\n // needed in case the image isn't ready yet\n await this._image.decode();\n this._screenCover = _Graphics__WEBPACK_IMPORTED_MODULE_3__.ImageSource.fromHtmlImageElement(this._image).toSprite();\n }\n onInitialize(engine) {\n this._engine = engine;\n switch (this.slideDirection) {\n case 'up': {\n this._directionOffset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(0, -engine.screen.resolution.height);\n break;\n }\n case 'down': {\n this._directionOffset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(0, engine.screen.resolution.height);\n break;\n }\n case 'left': {\n this._directionOffset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(-engine.screen.resolution.width, 0);\n break;\n }\n case 'right': {\n this._directionOffset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(engine.screen.resolution.width, 0);\n break;\n }\n }\n this._camera = this._engine.currentScene.camera;\n this._destinationCameraPosition = this._camera.pos.clone();\n // For sliding shift the camera and the transition slide by offset\n this._camera.pos = this._camera.pos.add(this._directionOffset);\n this.transform.pos = this.transform.pos.add(this._directionOffset);\n this._startCameraPosition = this._camera.pos.clone();\n this.graphics.use(this._screenCover);\n // This is because we preserve hidpi res on the screen shot which COULD be bigger than the logical resolution\n this.transform.scale = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(1 / engine.screen.pixelRatio, 1 / engine.screen.pixelRatio);\n }\n onUpdate(progress) {\n // in-transitions count down from 1 -> 0, so our \"end\" is swapped\n this._camera.pos = this._vectorEasing(progress, this._destinationCameraPosition, this._startCameraPosition, 1);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Director/Transition.ts\":\n/*!********************************!*\\\n !*** ./Director/Transition.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Transition: () => (/* binding */ Transition)\n/* harmony export */ });\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Util/Future */ \"./Util/Future.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Graphics */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Math/coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Util/EasingFunctions */ \"./Util/EasingFunctions.ts\");\n/* harmony import */ var _Util_Coroutine__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../Util/Coroutine */ \"./Util/Coroutine.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n\n\n\n\n\n\n\n\n\n/**\n * Base Transition that can be extended to provide custom scene transitions in Excalibur.\n */\nclass Transition extends _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_0__.Entity {\n /**\n * Returns a number between [0, 1] indicating what state the transition is in.\n *\n * * For 'out' direction transitions start at 0 and end at 1\n * * For 'in' direction transitions start at 1 and end at 0\n */\n get progress() {\n return this._currentProgress;\n }\n get complete() {\n if (this.direction === 'out') {\n return this.progress >= 1;\n }\n else {\n return this.progress <= 0;\n }\n }\n constructor(options) {\n var _a, _b, _c, _d;\n super();\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this.transform = new _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_2__.TransformComponent();\n this.graphics = new _Graphics__WEBPACK_IMPORTED_MODULE_3__.GraphicsComponent();\n this._completeFuture = new _Util_Future__WEBPACK_IMPORTED_MODULE_4__.Future();\n // State needs to be reset between uses\n this.started = false;\n this._currentDistance = 0;\n this._currentProgress = 0;\n this.done = this._completeFuture.promise;\n this.name = `Transition#${this.id}`;\n this.duration = options.duration;\n this.easing = (_a = options.easing) !== null && _a !== void 0 ? _a : _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_5__.EasingFunctions.Linear;\n this.direction = (_b = options.direction) !== null && _b !== void 0 ? _b : 'out';\n this.hideLoader = (_c = options.hideLoader) !== null && _c !== void 0 ? _c : false;\n this.blockInput = (_d = options.blockInput) !== null && _d !== void 0 ? _d : false;\n this.transform.coordPlane = _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__.CoordPlane.Screen;\n this.transform.pos = _Math_vector__WEBPACK_IMPORTED_MODULE_7__.Vector.Zero;\n this.transform.z = Infinity; // Transitions sit on top of everything\n this.graphics.anchor = _Math_vector__WEBPACK_IMPORTED_MODULE_7__.Vector.Zero;\n this.addComponent(this.transform);\n this.addComponent(this.graphics);\n if (this.direction === 'out') {\n this._currentProgress = 0;\n }\n else {\n this._currentProgress = 1;\n }\n }\n /**\n * Overridable lifecycle method, called before each update.\n *\n * **WARNING BE SURE** to call `super.updateTransition()` if overriding in your own custom implementation\n * @param engine\n * @param elapsed\n */\n updateTransition(engine, elapsed) {\n if (this.complete) {\n return;\n }\n this._currentDistance += (0,_Math_util__WEBPACK_IMPORTED_MODULE_8__.clamp)(elapsed / this.duration, 0, 1);\n if (this._currentDistance >= 1) {\n this._currentDistance = 1;\n }\n if (this.direction === 'out') {\n this._currentProgress = (0,_Math_util__WEBPACK_IMPORTED_MODULE_8__.clamp)(this.easing(this._currentDistance, 0, 1, 1), 0, 1);\n }\n else {\n this._currentProgress = (0,_Math_util__WEBPACK_IMPORTED_MODULE_8__.clamp)(this.easing(this._currentDistance, 1, 0, 1), 0, 1);\n }\n }\n /**\n * Overridable lifecycle method, called right before the previous scene has deactivated.\n *\n * This gives incoming transition a chance to grab info from previous scene if desired\n * @param scene\n */\n async onPreviousSceneDeactivate(scene) {\n // override me\n }\n /**\n * Overridable lifecycle method, called once at the beginning of the transition\n *\n * `progress` is given between 0 and 1\n * @param progress\n */\n onStart(progress) {\n // override me\n }\n /**\n * Overridable lifecycle method, called every frame of the transition\n *\n * `progress` is given between 0 and 1\n * @param progress\n */\n onUpdate(progress) {\n // override me\n }\n /**\n * Overridable lifecycle method, called at the end of the transition,\n *\n * `progress` is given between 0 and 1\n * @param progress\n */\n onEnd(progress) {\n // override me\n }\n /**\n * Overridable lifecycle method, called when the transition is reset\n *\n * Use this to override and provide your own reset logic for internal state in custom transition implementations\n */\n onReset() {\n // override me\n }\n /**\n * reset() is called by the engine to reset transitions\n */\n reset() {\n this.started = false;\n this._completeFuture = new _Util_Future__WEBPACK_IMPORTED_MODULE_4__.Future();\n this.done = this._completeFuture.promise;\n this._currentDistance = 0;\n if (this.direction === 'out') {\n this._currentProgress = 0;\n }\n else {\n this._currentProgress = 1;\n }\n this.onReset();\n }\n /**\n * @internal\n */\n _addToTargetScene(engine, targetScene) {\n const currentScene = targetScene;\n if (this.started) {\n this._logger.warn(`Attempted to add a transition ${this.name} that is already playing.`);\n }\n if (currentScene.world.entityManager.getById(this.id)) {\n return this._co;\n }\n this._engine = engine;\n currentScene.add(this);\n const self = this;\n this._co = (0,_Util_Coroutine__WEBPACK_IMPORTED_MODULE_9__.coroutine)(engine, function* () {\n while (!self.complete) {\n const elapsed = yield; // per frame\n self.updateTransition(self._engine, elapsed);\n self._execute();\n }\n }, {\n autostart: false\n });\n return this._co;\n }\n /**\n * Called internally by excalibur to swap scenes with transition\n * @internal\n */\n async _play() {\n if (this.started) {\n this.reset();\n this._logger.warn(`Attempted to play a transition ${this.name} that is already playing, reset transition.`);\n }\n if (!this._engine || !this._co) {\n this.reset();\n this._logger.warn(`Attempted to play a transition ${this.name} that hasn't been added`);\n }\n if (this._co) {\n await this._co.start();\n }\n }\n /**\n * execute() is called by the engine every frame to update the Transition lifecycle onStart/onUpdate/onEnd\n * @internal\n */\n _execute() {\n if (!this.isInitialized) {\n return;\n }\n if (!this.started) {\n this.started = true;\n this.onStart(this.progress);\n }\n this.onUpdate(this.progress);\n if (this.complete && !this._completeFuture.isCompleted) {\n this.onEnd(this.progress);\n this._completeFuture.resolve();\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Director/index.ts\":\n/*!***************************!*\\\n !*** ./Director/index.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CrossFade: () => (/* reexport safe */ _CrossFade__WEBPACK_IMPORTED_MODULE_2__.CrossFade),\n/* harmony export */ DefaultLoader: () => (/* reexport safe */ _DefaultLoader__WEBPACK_IMPORTED_MODULE_6__.DefaultLoader),\n/* harmony export */ Director: () => (/* reexport safe */ _Director__WEBPACK_IMPORTED_MODULE_4__.Director),\n/* harmony export */ DirectorEvents: () => (/* reexport safe */ _Director__WEBPACK_IMPORTED_MODULE_4__.DirectorEvents),\n/* harmony export */ FadeInOut: () => (/* reexport safe */ _FadeInOut__WEBPACK_IMPORTED_MODULE_1__.FadeInOut),\n/* harmony export */ Loader: () => (/* reexport safe */ _Loader__WEBPACK_IMPORTED_MODULE_5__.Loader),\n/* harmony export */ LoaderEvents: () => (/* reexport safe */ _DefaultLoader__WEBPACK_IMPORTED_MODULE_6__.LoaderEvents),\n/* harmony export */ Slide: () => (/* reexport safe */ _Slide__WEBPACK_IMPORTED_MODULE_3__.Slide),\n/* harmony export */ Transition: () => (/* reexport safe */ _Transition__WEBPACK_IMPORTED_MODULE_0__.Transition),\n/* harmony export */ isLoaderConstructor: () => (/* reexport safe */ _DefaultLoader__WEBPACK_IMPORTED_MODULE_6__.isLoaderConstructor)\n/* harmony export */ });\n/* harmony import */ var _Transition__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Transition */ \"./Director/Transition.ts\");\n/* harmony import */ var _FadeInOut__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./FadeInOut */ \"./Director/FadeInOut.ts\");\n/* harmony import */ var _CrossFade__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./CrossFade */ \"./Director/CrossFade.ts\");\n/* harmony import */ var _Slide__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Slide */ \"./Director/Slide.ts\");\n/* harmony import */ var _Director__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Director */ \"./Director/Director.ts\");\n/* harmony import */ var _Loader__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Loader */ \"./Director/Loader.ts\");\n/* harmony import */ var _DefaultLoader__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./DefaultLoader */ \"./Director/DefaultLoader.ts\");\n\n\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Engine.ts\":\n/*!*******************!*\\\n !*** ./Engine.ts ***!\n \\*******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Engine: () => (/* binding */ Engine),\n/* harmony export */ EngineEvents: () => (/* binding */ EngineEvents),\n/* harmony export */ ScrollPreventionMode: () => (/* binding */ ScrollPreventionMode)\n/* harmony export */ });\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ */ \"./index.ts\");\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Util/Future */ \"./Util/Future.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Input_PointerScope__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./Input/PointerScope */ \"./Input/PointerScope.ts\");\n/* harmony import */ var _Flags__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Flags */ \"./Flags.ts\");\n/* harmony import */ var _Polyfill__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Polyfill */ \"./Polyfill.ts\");\n/* harmony import */ var _Screen__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Screen */ \"./Screen.ts\");\n/* harmony import */ var _Director_DefaultLoader__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./Director/DefaultLoader */ \"./Director/DefaultLoader.ts\");\n/* harmony import */ var _Director_Loader__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./Director/Loader */ \"./Director/Loader.ts\");\n/* harmony import */ var _Util_Detector__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Util/Detector */ \"./Util/Detector.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./Events */ \"./Events.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./Color */ \"./Color.ts\");\n/* harmony import */ var _Scene__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./Scene */ \"./Scene.ts\");\n/* harmony import */ var _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./EntityComponentSystem/Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _Debug_DebugConfig__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./Debug/DebugConfig */ \"./Debug/DebugConfig.ts\");\n/* harmony import */ var _Util_Browser__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Util/Browser */ \"./Util/Browser.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Graphics */ \"./Graphics/Context/ExcaliburGraphicsContext.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Graphics */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Graphics */ \"./Graphics/Context/ExcaliburGraphicsContext2DCanvas.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Graphics */ \"./Graphics/Context/texture-loader.ts\");\n/* harmony import */ var _Util_Clock__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./Util/Clock */ \"./Util/Clock.ts\");\n/* harmony import */ var _Graphics_Filtering__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Graphics/Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Graphics_GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./Graphics/GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n/* harmony import */ var _Util_Toaster__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Util/Toaster */ \"./Util/Toaster.ts\");\n/* harmony import */ var _Director_Director__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./Director/Director */ \"./Director/Director.ts\");\n/* harmony import */ var _Input_InputHost__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./Input/InputHost */ \"./Input/InputHost.ts\");\n/* harmony import */ var _Collision_PhysicsConfig__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Collision/PhysicsConfig */ \"./Collision/PhysicsConfig.ts\");\n/* harmony import */ var _Context__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Context */ \"./Context.ts\");\n/* harmony import */ var _GarbageCollector__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./GarbageCollector */ \"./GarbageCollector.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./Util/Util */ \"./Util/Util.ts\");\n\n\n\n\n\n\n(0,_Polyfill__WEBPACK_IMPORTED_MODULE_0__.polyfill)();\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst EngineEvents = {\n FallbackGraphicsContext: 'fallbackgraphicscontext',\n Initialize: 'initialize',\n Visible: 'visible',\n Hidden: 'hidden',\n Start: 'start',\n Stop: 'stop',\n PreUpdate: 'preupdate',\n PostUpdate: 'postupdate',\n PreFrame: 'preframe',\n PostFrame: 'postframe',\n PreDraw: 'predraw',\n PostDraw: 'postdraw'\n};\n/**\n * Enum representing the different mousewheel event bubble prevention\n */\nvar ScrollPreventionMode;\n(function (ScrollPreventionMode) {\n /**\n * Do not prevent any page scrolling\n */\n ScrollPreventionMode[ScrollPreventionMode[\"None\"] = 0] = \"None\";\n /**\n * Prevent page scroll if mouse is over the game canvas\n */\n ScrollPreventionMode[ScrollPreventionMode[\"Canvas\"] = 1] = \"Canvas\";\n /**\n * Prevent all page scrolling via mouse wheel\n */\n ScrollPreventionMode[ScrollPreventionMode[\"All\"] = 2] = \"All\";\n})(ScrollPreventionMode || (ScrollPreventionMode = {}));\n/**\n * The Excalibur Engine\n *\n * The {@apilink Engine} is the main driver for a game. It is responsible for\n * starting/stopping the game, maintaining state, transmitting events,\n * loading resources, and managing the scene.\n */\nclass Engine {\n static useEngine() {\n const value = (0,_Context__WEBPACK_IMPORTED_MODULE_1__.useContext)(Engine.Context);\n if (!value) {\n throw new Error('Cannot inject engine with `useEngine()`, `useEngine()` was called outside of Engine lifecycle scope.');\n }\n return value;\n }\n /**\n * The width of the game canvas in pixels (physical width component of the\n * resolution of the canvas element)\n */\n get canvasWidth() {\n return this.screen.canvasWidth;\n }\n /**\n * Returns half width of the game canvas in pixels (half physical width component)\n */\n get halfCanvasWidth() {\n return this.screen.halfCanvasWidth;\n }\n /**\n * The height of the game canvas in pixels, (physical height component of\n * the resolution of the canvas element)\n */\n get canvasHeight() {\n return this.screen.canvasHeight;\n }\n /**\n * Returns half height of the game canvas in pixels (half physical height component)\n */\n get halfCanvasHeight() {\n return this.screen.halfCanvasHeight;\n }\n /**\n * Returns the width of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get drawWidth() {\n return this.screen.drawWidth;\n }\n /**\n * Returns half the width of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get halfDrawWidth() {\n return this.screen.halfDrawWidth;\n }\n /**\n * Returns the height of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get drawHeight() {\n return this.screen.drawHeight;\n }\n /**\n * Returns half the height of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get halfDrawHeight() {\n return this.screen.halfDrawHeight;\n }\n /**\n * Returns whether excalibur detects the current screen to be HiDPI\n */\n get isHiDpi() {\n return this.screen.isHiDpi;\n }\n /**\n * Access {@apilink stats} that holds frame statistics.\n */\n get stats() {\n return this.debug.stats;\n }\n /**\n * The current {@apilink Scene} being drawn and updated on screen\n */\n get currentScene() {\n return this.director.currentScene;\n }\n /**\n * The current {@apilink Scene} being drawn and updated on screen\n */\n get currentSceneName() {\n return this.director.currentSceneName;\n }\n /**\n * The default {@apilink Scene} of the game, use {@apilink Engine.goToScene} to transition to different scenes.\n */\n get rootScene() {\n return this.director.rootScene;\n }\n /**\n * Contains all the scenes currently registered with Excalibur\n */\n get scenes() {\n return this.director.scenes;\n }\n /**\n * Indicates whether the engine is set to fullscreen or not\n */\n get isFullscreen() {\n return this.screen.isFullScreen;\n }\n /**\n * Indicates the current {@apilink DisplayMode} of the engine.\n */\n get displayMode() {\n return this.screen.displayMode;\n }\n /**\n * Returns the calculated pixel ration for use in rendering\n */\n get pixelRatio() {\n return this.screen.pixelRatio;\n }\n get isDebug() {\n return this._isDebug;\n }\n /**\n * Hints the graphics context to truncate fractional world space coordinates\n */\n get snapToPixel() {\n return this.graphicsContext.snapToPixel;\n }\n set snapToPixel(shouldSnapToPixel) {\n this.graphicsContext.snapToPixel = shouldSnapToPixel;\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n /**\n * Creates a new game using the given {@apilink EngineOptions}. By default, if no options are provided,\n * the game will be rendered full screen (taking up all available browser window space).\n * You can customize the game rendering through {@apilink EngineOptions}.\n *\n * Example:\n *\n * ```js\n * var game = new ex.Engine({\n * width: 0, // the width of the canvas\n * height: 0, // the height of the canvas\n * enableCanvasTransparency: true, // the transparencySection of the canvas\n * canvasElementId: '', // the DOM canvas element ID, if you are providing your own\n * displayMode: ex.DisplayMode.FullScreen, // the display mode\n * pointerScope: ex.PointerScope.Document, // the scope of capturing pointer (mouse/touch) events\n * backgroundColor: ex.Color.fromHex('#2185d0') // background color of the engine\n * });\n *\n * // call game.start, which is a Promise\n * game.start().then(function () {\n * // ready, set, go!\n * });\n * ```\n */\n constructor(options) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j;\n /**\n * Anything run under scope can use `useEngine()` to inject the current engine\n * @param cb\n */\n this.scope = (cb) => Engine.Context.scope(this, cb);\n /**\n * Current Excalibur version string\n *\n * Useful for plugins or other tools that need to know what features are available\n */\n this.version = ___WEBPACK_IMPORTED_MODULE_2__.EX_VERSION;\n /**\n * Listen to and emit events on the Engine\n */\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_3__.EventEmitter();\n /**\n * Optionally set the maximum fps if not set Excalibur will go as fast as the device allows.\n *\n * You may want to constrain max fps if your game cannot maintain fps consistently, it can look and feel better to have a 30fps game than\n * one that bounces between 30fps and 60fps\n */\n this.maxFps = Number.POSITIVE_INFINITY;\n this._inputEnabled = true;\n this._suppressPlayButton = false;\n /**\n * Indicates whether audio should be paused when the game is no longer visible.\n */\n this.pauseAudioWhenHidden = true;\n /**\n * Indicates whether the engine should draw with debug information\n */\n this._isDebug = false;\n /**\n * Sets the Transparency for the engine.\n */\n this.enableCanvasTransparency = true;\n /**\n * The action to take when a fatal exception is thrown\n */\n this.onFatalException = (e) => {\n _Util_Log__WEBPACK_IMPORTED_MODULE_4__.Logger.getInstance().fatal(e, e.stack);\n };\n this._toaster = new _Util_Toaster__WEBPACK_IMPORTED_MODULE_5__.Toaster();\n this._timescale = 1.0;\n this._isInitialized = false;\n this._originalOptions = {};\n this._handleWebGLContextLost = (e) => {\n var _a;\n e.preventDefault();\n this.clock.stop();\n this._logger.fatalOnce('WebGL Graphics Lost', e);\n const container = document.createElement('div');\n container.id = 'ex-webgl-graphics-context-lost';\n container.style.position = 'absolute';\n container.style.zIndex = '99';\n container.style.left = '50%';\n container.style.top = '50%';\n container.style.display = 'flex';\n container.style.flexDirection = 'column';\n container.style.transform = 'translate(-50%, -50%)';\n container.style.backgroundColor = 'white';\n container.style.padding = '10px';\n container.style.borderStyle = 'solid 1px';\n const div = document.createElement('div');\n div.innerHTML = `\r\n

There was an issue rendering, please refresh the page.

\r\n
\r\n

WebGL Graphics Context Lost

\r\n\r\n \r\n\r\n

There are a few reasons this might happen:

\r\n
    \r\n
  • Two or more pages are placing a high demand on the GPU
  • \r\n
  • Another page or operation has stalled the GPU and the browser has decided to reset the GPU
  • \r\n
  • The computer has multiple GPUs and the user has switched between them
  • \r\n
  • Graphics driver has crashed or restarted
  • \r\n
  • Graphics driver was updated
  • \r\n
\r\n
\r\n `;\n container.appendChild(div);\n if ((_a = this.canvas) === null || _a === void 0 ? void 0 : _a.parentElement) {\n this.canvas.parentElement.appendChild(container);\n const button = div.querySelector('#ex-webgl-graphics-reload');\n button === null || button === void 0 ? void 0 : button.addEventListener('click', () => location.reload());\n }\n };\n this._performanceThresholdTriggered = false;\n this._fpsSamples = [];\n this._disposed = false;\n this._isLoading = false;\n this._hideLoader = false;\n this._isReadyFuture = new _Util_Future__WEBPACK_IMPORTED_MODULE_6__.Future();\n /**\n * Returns the current frames elapsed milliseconds\n */\n this.currentFrameElapsedMs = 0;\n /**\n * Returns the current frame lag when in fixed update mode\n */\n this.currentFrameLagMs = 0;\n this._lagMs = 0;\n this._screenShotRequests = [];\n options = { ...Engine._DEFAULT_ENGINE_OPTIONS, ...options };\n this._originalOptions = options;\n _Flags__WEBPACK_IMPORTED_MODULE_7__.Flags.freeze();\n // Initialize browser events facade\n this.browser = new _Util_Browser__WEBPACK_IMPORTED_MODULE_8__.BrowserEvents(window, document);\n // Check compatibility\n const detector = new _Util_Detector__WEBPACK_IMPORTED_MODULE_9__.Detector();\n if (!options.suppressMinimumBrowserFeatureDetection && !(this._compatible = detector.test())) {\n const message = document.createElement('div');\n message.innerText = 'Sorry, your browser does not support all the features needed for Excalibur';\n document.body.appendChild(message);\n detector.failedTests.forEach(function (test) {\n const testMessage = document.createElement('div');\n testMessage.innerText = 'Browser feature missing ' + test;\n document.body.appendChild(testMessage);\n });\n if (options.canvasElementId) {\n const canvas = document.getElementById(options.canvasElementId);\n if (canvas) {\n canvas.parentElement.removeChild(canvas);\n }\n }\n return;\n }\n else {\n this._compatible = true;\n }\n // Use native console API for color fun\n // eslint-disable-next-line no-console\n if (console.log && !options.suppressConsoleBootMessage) {\n // eslint-disable-next-line no-console\n console.log(`%cPowered by Excalibur.js (v${___WEBPACK_IMPORTED_MODULE_2__.EX_VERSION})`, 'background: #176BAA; color: white; border-radius: 5px; padding: 15px; font-size: 1.5em; line-height: 80px;');\n // eslint-disable-next-line no-console\n console.log('\\n\\\r\n /| ________________\\n\\\r\nO|===|* >________________>\\n\\\r\n \\\\|');\n // eslint-disable-next-line no-console\n console.log('Visit', 'http://excaliburjs.com', 'for more information');\n }\n // Suppress play button\n if (options.suppressPlayButton) {\n this._suppressPlayButton = true;\n }\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_4__.Logger.getInstance();\n // If debug is enabled, let's log browser features to the console.\n if (this._logger.defaultLevel === _Util_Log__WEBPACK_IMPORTED_MODULE_4__.LogLevel.Debug) {\n detector.logBrowserFeatures();\n }\n this._logger.debug('Building engine...');\n if (options.garbageCollection === true) {\n this.garbageCollectorConfig = {\n ..._GarbageCollector__WEBPACK_IMPORTED_MODULE_10__.DefaultGarbageCollectionOptions\n };\n }\n else if (options.garbageCollection === false) {\n this._logger.warn('WebGL Garbage Collection Disabled!!! If you leak any images over time your game will crash when GPU memory is exhausted');\n this.garbageCollectorConfig = null;\n }\n else {\n this.garbageCollectorConfig = {\n ..._GarbageCollector__WEBPACK_IMPORTED_MODULE_10__.DefaultGarbageCollectionOptions,\n ...options.garbageCollection\n };\n }\n this._garbageCollector = new _GarbageCollector__WEBPACK_IMPORTED_MODULE_10__.GarbageCollector({ getTimestamp: Date.now });\n this.canvasElementId = options.canvasElementId;\n if (options.canvasElementId) {\n this._logger.debug('Using Canvas element specified: ' + options.canvasElementId);\n //test for existence of element\n if (document.getElementById(options.canvasElementId) === null) {\n throw new Error('Cannot find existing element in the DOM, please ensure element is created prior to engine creation.');\n }\n this.canvas = document.getElementById(options.canvasElementId);\n }\n else if (options.canvasElement) {\n this._logger.debug('Using Canvas element specified:', options.canvasElement);\n this.canvas = options.canvasElement;\n }\n else {\n this._logger.debug('Using generated canvas element');\n this.canvas = document.createElement('canvas');\n }\n if (this.canvas && !options.enableCanvasContextMenu) {\n this.canvas.addEventListener('contextmenu', (evt) => {\n evt.preventDefault();\n });\n }\n let displayMode = (_a = options.displayMode) !== null && _a !== void 0 ? _a : _Screen__WEBPACK_IMPORTED_MODULE_11__.DisplayMode.Fixed;\n if ((options.width && options.height) || options.viewport) {\n if (options.displayMode === undefined) {\n displayMode = _Screen__WEBPACK_IMPORTED_MODULE_11__.DisplayMode.Fixed;\n }\n this._logger.debug('Engine viewport is size ' + options.width + ' x ' + options.height);\n }\n else if (!options.displayMode) {\n this._logger.debug('Engine viewport is fit');\n displayMode = _Screen__WEBPACK_IMPORTED_MODULE_11__.DisplayMode.FitScreen;\n }\n this.grabWindowFocus = options.grabWindowFocus;\n this.pointerScope = options.pointerScope;\n this._originalDisplayMode = displayMode;\n let pixelArtSampler;\n let uvPadding;\n let nativeContextAntialiasing;\n let canvasImageRendering;\n let filtering;\n let multiSampleAntialiasing;\n if (typeof options.antialiasing === 'object') {\n ({ pixelArtSampler, nativeContextAntialiasing, multiSampleAntialiasing, filtering, canvasImageRendering } = {\n ...(options.pixelArt ? _Graphics__WEBPACK_IMPORTED_MODULE_12__.DefaultPixelArtOptions : _Graphics__WEBPACK_IMPORTED_MODULE_12__.DefaultAntialiasOptions),\n ...options.antialiasing\n });\n }\n else {\n pixelArtSampler = !!options.pixelArt;\n nativeContextAntialiasing = false;\n multiSampleAntialiasing = options.antialiasing;\n canvasImageRendering = options.antialiasing ? 'auto' : 'pixelated';\n filtering = options.antialiasing ? _Graphics_Filtering__WEBPACK_IMPORTED_MODULE_13__.ImageFiltering.Blended : _Graphics_Filtering__WEBPACK_IMPORTED_MODULE_13__.ImageFiltering.Pixel;\n }\n if (nativeContextAntialiasing && multiSampleAntialiasing) {\n this._logger.warnOnce(`Cannot use antialias setting nativeContextAntialiasing and multiSampleAntialiasing` +\n ` at the same time, they are incompatible settings. If you aren\\'t sure use multiSampleAntialiasing`);\n }\n if (options.pixelArt) {\n uvPadding = 0.25;\n }\n if (!options.antialiasing || filtering === _Graphics_Filtering__WEBPACK_IMPORTED_MODULE_13__.ImageFiltering.Pixel) {\n uvPadding = 0;\n }\n // Override with any user option, if non default to .25 for pixel art, 0.01 for everything else\n uvPadding = (_c = (_b = options.uvPadding) !== null && _b !== void 0 ? _b : uvPadding) !== null && _c !== void 0 ? _c : 0.01;\n // Canvas 2D fallback can be flagged on\n let useCanvasGraphicsContext = _Flags__WEBPACK_IMPORTED_MODULE_7__.Flags.isEnabled('use-canvas-context');\n if (!useCanvasGraphicsContext) {\n // Attempt webgl first\n try {\n this.graphicsContext = new _Graphics__WEBPACK_IMPORTED_MODULE_14__.ExcaliburGraphicsContextWebGL({\n canvasElement: this.canvas,\n enableTransparency: this.enableCanvasTransparency,\n pixelArtSampler: pixelArtSampler,\n antialiasing: nativeContextAntialiasing,\n multiSampleAntialiasing: multiSampleAntialiasing,\n uvPadding: uvPadding,\n powerPreference: options.powerPreference,\n backgroundColor: options.backgroundColor,\n snapToPixel: options.snapToPixel,\n useDrawSorting: options.useDrawSorting,\n garbageCollector: this.garbageCollectorConfig\n ? {\n garbageCollector: this._garbageCollector,\n collectionInterval: this.garbageCollectorConfig.textureCollectInterval\n }\n : null,\n handleContextLost: (_d = options.handleContextLost) !== null && _d !== void 0 ? _d : this._handleWebGLContextLost,\n handleContextRestored: options.handleContextRestored\n });\n }\n catch (e) {\n this._logger.warn(`Excalibur could not load webgl for some reason (${e.message}) and loaded a Canvas 2D fallback. ` +\n `Some features of Excalibur will not work in this mode. \\n\\n` +\n 'Read more about this issue at https://excaliburjs.com/docs/performance');\n // fallback to canvas in case of failure\n useCanvasGraphicsContext = true;\n }\n }\n if (useCanvasGraphicsContext) {\n this.graphicsContext = new _Graphics__WEBPACK_IMPORTED_MODULE_15__.ExcaliburGraphicsContext2DCanvas({\n canvasElement: this.canvas,\n enableTransparency: this.enableCanvasTransparency,\n antialiasing: nativeContextAntialiasing,\n backgroundColor: options.backgroundColor,\n snapToPixel: options.snapToPixel,\n useDrawSorting: options.useDrawSorting\n });\n }\n this.screen = new _Screen__WEBPACK_IMPORTED_MODULE_11__.Screen({\n canvas: this.canvas,\n context: this.graphicsContext,\n antialiasing: nativeContextAntialiasing,\n canvasImageRendering: canvasImageRendering,\n browser: this.browser,\n viewport: (_e = options.viewport) !== null && _e !== void 0 ? _e : (options.width && options.height ? { width: options.width, height: options.height } : _Screen__WEBPACK_IMPORTED_MODULE_11__.Resolution.SVGA),\n resolution: options.resolution,\n displayMode,\n pixelRatio: options.suppressHiDPIScaling ? 1 : (_f = options.pixelRatio) !== null && _f !== void 0 ? _f : null\n });\n // TODO REMOVE STATIC!!!\n // Set default filtering based on antialiasing\n _Graphics__WEBPACK_IMPORTED_MODULE_16__.TextureLoader.filtering = filtering;\n if (options.backgroundColor) {\n this.backgroundColor = options.backgroundColor.clone();\n }\n this.maxFps = (_g = options.maxFps) !== null && _g !== void 0 ? _g : this.maxFps;\n this.fixedUpdateTimestep = (_h = options.fixedUpdateTimestep) !== null && _h !== void 0 ? _h : this.fixedUpdateTimestep;\n this.fixedUpdateFps = (_j = options.fixedUpdateFps) !== null && _j !== void 0 ? _j : this.fixedUpdateFps;\n this.fixedUpdateTimestep = this.fixedUpdateTimestep || 1000 / this.fixedUpdateFps;\n this.clock = new _Util_Clock__WEBPACK_IMPORTED_MODULE_17__.StandardClock({\n maxFps: this.maxFps,\n tick: this._mainloop.bind(this),\n onFatalException: (e) => this.onFatalException(e)\n });\n this.enableCanvasTransparency = options.enableCanvasTransparency;\n if (typeof options.physics === 'boolean') {\n this.physics = {\n ...(0,_Collision_PhysicsConfig__WEBPACK_IMPORTED_MODULE_18__.getDefaultPhysicsConfig)(),\n enabled: options.physics\n };\n }\n else {\n this.physics = {\n ...(0,_Collision_PhysicsConfig__WEBPACK_IMPORTED_MODULE_18__.getDefaultPhysicsConfig)()\n };\n (0,_Util_Util__WEBPACK_IMPORTED_MODULE_19__.mergeDeep)(this.physics, options.physics);\n }\n this.debug = new _Debug_DebugConfig__WEBPACK_IMPORTED_MODULE_20__.DebugConfig(this);\n this.director = new _Director_Director__WEBPACK_IMPORTED_MODULE_21__.Director(this, options.scenes);\n this._initialize(options);\n window.___EXCALIBUR_DEVTOOL = this;\n Engine.InstanceCount++;\n }\n _monitorPerformanceThresholdAndTriggerFallback() {\n const { allow } = this._originalOptions.configurePerformanceCanvas2DFallback;\n let { threshold, showPlayerMessage } = this._originalOptions.configurePerformanceCanvas2DFallback;\n if (threshold === undefined) {\n threshold = Engine._DEFAULT_ENGINE_OPTIONS.configurePerformanceCanvas2DFallback.threshold;\n }\n if (showPlayerMessage === undefined) {\n showPlayerMessage = Engine._DEFAULT_ENGINE_OPTIONS.configurePerformanceCanvas2DFallback.showPlayerMessage;\n }\n if (!_Flags__WEBPACK_IMPORTED_MODULE_7__.Flags.isEnabled('use-canvas-context') && allow && this.ready && !this._performanceThresholdTriggered) {\n // Calculate Average fps for last X number of frames after start\n if (this._fpsSamples.length === threshold.numberOfFrames) {\n this._fpsSamples.splice(0, 1);\n }\n this._fpsSamples.push(this.clock.fpsSampler.fps);\n let total = 0;\n for (let i = 0; i < this._fpsSamples.length; i++) {\n total += this._fpsSamples[i];\n }\n const average = total / this._fpsSamples.length;\n if (this._fpsSamples.length === threshold.numberOfFrames) {\n if (average <= threshold.fps) {\n this._performanceThresholdTriggered = true;\n this._logger.warn(`Switching to browser 2D Canvas fallback due to performance. Some features of Excalibur will not work in this mode.\\n` +\n \"this might mean your browser doesn't have webgl enabled or hardware acceleration is unavailable.\\n\\n\" +\n 'If in Chrome:\\n' +\n ' * Visit Settings > Advanced > System, and ensure \"Use Hardware Acceleration\" is checked.\\n' +\n ' * Visit chrome://flags/#ignore-gpu-blocklist and ensure \"Override software rendering list\" is \"enabled\"\\n' +\n 'If in Firefox, visit about:config\\n' +\n ' * Ensure webgl.disabled = false\\n' +\n ' * Ensure webgl.force-enabled = true\\n' +\n ' * Ensure layers.acceleration.force-enabled = true\\n\\n' +\n 'Read more about this issue at https://excaliburjs.com/docs/performance');\n if (showPlayerMessage) {\n this._toaster.toast('Excalibur is encountering performance issues. ' +\n \"It's possible that your browser doesn't have hardware acceleration enabled. \" +\n 'Visit [LINK] for more information and potential solutions.', 'https://excaliburjs.com/docs/performance');\n }\n this.useCanvas2DFallback();\n this.emit('fallbackgraphicscontext', this.graphicsContext);\n }\n }\n }\n }\n /**\n * Switches the engine's graphics context to the 2D Canvas.\n * @warning Some features of Excalibur will not work in this mode.\n */\n useCanvas2DFallback() {\n var _a, _b, _c;\n // Swap out the canvas\n const newCanvas = this.canvas.cloneNode(false);\n this.canvas.parentNode.replaceChild(newCanvas, this.canvas);\n this.canvas = newCanvas;\n const options = { ...this._originalOptions, antialiasing: this.screen.antialiasing };\n const displayMode = this._originalDisplayMode;\n // New graphics context\n this.graphicsContext = new _Graphics__WEBPACK_IMPORTED_MODULE_15__.ExcaliburGraphicsContext2DCanvas({\n canvasElement: this.canvas,\n enableTransparency: this.enableCanvasTransparency,\n antialiasing: options.antialiasing,\n backgroundColor: options.backgroundColor,\n snapToPixel: options.snapToPixel,\n useDrawSorting: options.useDrawSorting\n });\n // Reset screen\n if (this.screen) {\n this.screen.dispose();\n }\n this.screen = new _Screen__WEBPACK_IMPORTED_MODULE_11__.Screen({\n canvas: this.canvas,\n context: this.graphicsContext,\n antialiasing: (_a = options.antialiasing) !== null && _a !== void 0 ? _a : true,\n browser: this.browser,\n viewport: (_b = options.viewport) !== null && _b !== void 0 ? _b : (options.width && options.height ? { width: options.width, height: options.height } : _Screen__WEBPACK_IMPORTED_MODULE_11__.Resolution.SVGA),\n resolution: options.resolution,\n displayMode,\n pixelRatio: options.suppressHiDPIScaling ? 1 : (_c = options.pixelRatio) !== null && _c !== void 0 ? _c : null\n });\n this.screen.setCurrentCamera(this.currentScene.camera);\n // Reset pointers\n this.input.pointers.detach();\n const pointerTarget = options && options.pointerScope === _Input_PointerScope__WEBPACK_IMPORTED_MODULE_22__.PointerScope.Document ? document : this.canvas;\n this.input.pointers = this.input.pointers.recreate(pointerTarget, this);\n this.input.pointers.init();\n }\n /**\n * Attempts to completely clean up excalibur resources, including removing the canvas from the dom.\n *\n * To start again you will need to new up an Engine.\n */\n dispose() {\n if (!this._disposed) {\n this._disposed = true;\n this.stop();\n this._garbageCollector.forceCollectAll();\n this.input.toggleEnabled(false);\n this.canvas.parentNode.removeChild(this.canvas);\n this.canvas = null;\n this.screen.dispose();\n this.graphicsContext.dispose();\n this.graphicsContext = null;\n Engine.InstanceCount--;\n }\n }\n isDisposed() {\n return this._disposed;\n }\n /**\n * Returns a BoundingBox of the top left corner of the screen\n * and the bottom right corner of the screen.\n */\n getWorldBounds() {\n return this.screen.getWorldBounds();\n }\n /**\n * Gets the current engine timescale factor (default is 1.0 which is 1:1 time)\n */\n get timescale() {\n return this._timescale;\n }\n /**\n * Sets the current engine timescale factor. Useful for creating slow-motion effects or fast-forward effects\n * when using time-based movement.\n */\n set timescale(value) {\n if (value < 0) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_4__.Logger.getInstance().warnOnce('engine.timescale to a value less than 0 are ignored');\n return;\n }\n this._timescale = value;\n }\n /**\n * Adds a {@apilink Timer} to the {@apilink currentScene}.\n * @param timer The timer to add to the {@apilink currentScene}.\n */\n addTimer(timer) {\n return this.currentScene.addTimer(timer);\n }\n /**\n * Removes a {@apilink Timer} from the {@apilink currentScene}.\n * @param timer The timer to remove to the {@apilink currentScene}.\n */\n removeTimer(timer) {\n return this.currentScene.removeTimer(timer);\n }\n /**\n * Adds a {@apilink Scene} to the engine, think of scenes in Excalibur as you\n * would levels or menus.\n * @param key The name of the scene, must be unique\n * @param scene The scene to add to the engine\n */\n addScene(key, scene) {\n this.director.add(key, scene);\n return this;\n }\n /**\n * @internal\n */\n removeScene(entity) {\n this.director.remove(entity);\n }\n add(entity) {\n if (arguments.length === 2) {\n this.director.add(arguments[0], arguments[1]);\n return;\n }\n const maybeDeferred = this.director.getDeferredScene();\n if (maybeDeferred instanceof _Scene__WEBPACK_IMPORTED_MODULE_23__.Scene) {\n maybeDeferred.add(entity);\n }\n else {\n this.currentScene.add(entity);\n }\n }\n remove(entity) {\n if (entity instanceof _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_24__.Entity) {\n this.currentScene.remove(entity);\n }\n if (entity instanceof _Scene__WEBPACK_IMPORTED_MODULE_23__.Scene || (0,_Scene__WEBPACK_IMPORTED_MODULE_23__.isSceneConstructor)(entity)) {\n this.removeScene(entity);\n }\n if (typeof entity === 'string') {\n this.removeScene(entity);\n }\n }\n /**\n * Changes the current scene with optionally supplied:\n * * Activation data\n * * Transitions\n * * Loaders\n *\n * Example:\n * ```typescript\n * game.goToScene('myScene', {\n * sceneActivationData: {any: 'thing at all'},\n * destinationIn: new FadeInOut({duration: 1000, direction: 'in'}),\n * sourceOut: new FadeInOut({duration: 1000, direction: 'out'}),\n * loader: MyLoader\n * });\n * ```\n *\n * Scenes are defined in the Engine constructor\n * ```typescript\n * const engine = new ex.Engine({\n scenes: {...}\n });\n * ```\n * Or by adding dynamically\n *\n * ```typescript\n * engine.addScene('myScene', new ex.Scene());\n * ```\n * @param destinationScene\n * @param options\n */\n async goToScene(destinationScene, options) {\n await this.scope(async () => {\n await this.director.goToScene(destinationScene, options);\n });\n }\n /**\n * Transforms the current x, y from screen coordinates to world coordinates\n * @param point Screen coordinate to convert\n */\n screenToWorldCoordinates(point) {\n return this.screen.screenToWorldCoordinates(point);\n }\n /**\n * Transforms a world coordinate, to a screen coordinate\n * @param point World coordinate to convert\n */\n worldToScreenCoordinates(point) {\n return this.screen.worldToScreenCoordinates(point);\n }\n /**\n * Initializes the internal canvas, rendering context, display mode, and native event listeners\n */\n _initialize(options) {\n var _a, _b;\n this.pageScrollPreventionMode = options.scrollPreventionMode;\n // initialize inputs\n const pointerTarget = options && options.pointerScope === _Input_PointerScope__WEBPACK_IMPORTED_MODULE_22__.PointerScope.Document ? document : this.canvas;\n const grabWindowFocus = (_b = (_a = this._originalOptions) === null || _a === void 0 ? void 0 : _a.grabWindowFocus) !== null && _b !== void 0 ? _b : true;\n this.input = new _Input_InputHost__WEBPACK_IMPORTED_MODULE_25__.InputHost({\n pointerTarget,\n grabWindowFocus,\n engine: this\n });\n this.inputMapper = this.input.inputMapper;\n // Issue #385 make use of the visibility api\n // https://developer.mozilla.org/en-US/docs/Web/Guide/User_experience/Using_the_Page_Visibility_API\n this.browser.document.on('visibilitychange', () => {\n if (document.visibilityState === 'hidden') {\n this.events.emit('hidden', new _Events__WEBPACK_IMPORTED_MODULE_26__.HiddenEvent(this));\n this._logger.debug('Window hidden');\n }\n else if (document.visibilityState === 'visible') {\n this.events.emit('visible', new _Events__WEBPACK_IMPORTED_MODULE_26__.VisibleEvent(this));\n this._logger.debug('Window visible');\n }\n });\n if (!this.canvasElementId && !options.canvasElement) {\n document.body.appendChild(this.canvas);\n }\n }\n toggleInputEnabled(enabled) {\n this._inputEnabled = enabled;\n this.input.toggleEnabled(this._inputEnabled);\n }\n onInitialize(engine) {\n // Override me\n }\n /**\n * Gets whether the actor is Initialized\n */\n get isInitialized() {\n return this._isInitialized;\n }\n async _overrideInitialize(engine) {\n if (!this.isInitialized) {\n await this.director.onInitialize();\n await this.onInitialize(engine);\n this.events.emit('initialize', new _Events__WEBPACK_IMPORTED_MODULE_26__.InitializeEvent(engine, this));\n this._isInitialized = true;\n }\n }\n /**\n * Updates the entire state of the game\n * @param elapsed Number of milliseconds elapsed since the last update.\n */\n _update(elapsed) {\n var _a;\n if (this._isLoading) {\n // suspend updates until loading is finished\n (_a = this._loader) === null || _a === void 0 ? void 0 : _a.onUpdate(this, elapsed);\n // Update input listeners\n this.input.update();\n return;\n }\n // Publish preupdate events\n this.clock.__runScheduledCbs('preupdate');\n this._preupdate(elapsed);\n // process engine level events\n this.currentScene.update(this, elapsed);\n // Update graphics postprocessors\n this.graphicsContext.updatePostProcessors(elapsed);\n // Publish update event\n this.clock.__runScheduledCbs('postupdate');\n this._postupdate(elapsed);\n // Update input listeners\n this.input.update();\n }\n /**\n * @internal\n */\n _preupdate(elapsed) {\n this.emit('preupdate', new _Events__WEBPACK_IMPORTED_MODULE_26__.PreUpdateEvent(this, elapsed, this));\n this.onPreUpdate(this, elapsed);\n }\n /**\n * Safe to override method\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n */\n onPreUpdate(engine, elapsed) {\n // Override me\n }\n /**\n * @internal\n */\n _postupdate(elapsed) {\n this.emit('postupdate', new _Events__WEBPACK_IMPORTED_MODULE_26__.PostUpdateEvent(this, elapsed, this));\n this.onPostUpdate(this, elapsed);\n }\n /**\n * Safe to override method\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n */\n onPostUpdate(engine, elapsed) {\n // Override me\n }\n /**\n * Draws the entire game\n * @param elapsed Number of milliseconds elapsed since the last draw.\n */\n _draw(elapsed) {\n var _a, _b;\n // Use scene background color if present, fallback to engine\n this.graphicsContext.backgroundColor = (_a = this.currentScene.backgroundColor) !== null && _a !== void 0 ? _a : this.backgroundColor;\n this.graphicsContext.beginDrawLifecycle();\n this.graphicsContext.clear();\n this.clock.__runScheduledCbs('predraw');\n this._predraw(this.graphicsContext, elapsed);\n // Drawing nothing else while loading\n if (this._isLoading) {\n if (!this._hideLoader) {\n (_b = this._loader) === null || _b === void 0 ? void 0 : _b.canvas.draw(this.graphicsContext, 0, 0);\n this.clock.__runScheduledCbs('postdraw');\n this.graphicsContext.flush();\n this.graphicsContext.endDrawLifecycle();\n }\n return;\n }\n this.currentScene.draw(this.graphicsContext, elapsed);\n this.clock.__runScheduledCbs('postdraw');\n this._postdraw(this.graphicsContext, elapsed);\n // Flush any pending drawings\n this.graphicsContext.flush();\n this.graphicsContext.endDrawLifecycle();\n this._checkForScreenShots();\n }\n /**\n * @internal\n */\n _predraw(ctx, elapsed) {\n this.emit('predraw', new _Events__WEBPACK_IMPORTED_MODULE_26__.PreDrawEvent(ctx, elapsed, this));\n this.onPreDraw(ctx, elapsed);\n }\n /**\n * Safe to override method to hook into pre draw\n * @param ctx {@link ExcaliburGraphicsContext} for drawing\n * @param elapsed Number of milliseconds elapsed since the last draw.\n */\n onPreDraw(ctx, elapsed) {\n // Override me\n }\n /**\n * @internal\n */\n _postdraw(ctx, elapsed) {\n this.emit('postdraw', new _Events__WEBPACK_IMPORTED_MODULE_26__.PostDrawEvent(ctx, elapsed, this));\n this.onPostDraw(ctx, elapsed);\n }\n /**\n * Safe to override method to hook into pre draw\n * @param ctx {@link ExcaliburGraphicsContext} for drawing\n * @param elapsed Number of milliseconds elapsed since the last draw.\n */\n onPostDraw(ctx, elapsed) {\n // Override me\n }\n /**\n * Enable or disable Excalibur debugging functionality.\n * @param toggle a value that debug drawing will be changed to\n */\n showDebug(toggle) {\n this._isDebug = toggle;\n }\n /**\n * Toggle Excalibur debugging functionality.\n */\n toggleDebug() {\n this._isDebug = !this._isDebug;\n return this._isDebug;\n }\n /**\n * Returns true when loading is totally complete and the player has clicked start\n */\n get loadingComplete() {\n return !this._isLoading;\n }\n get ready() {\n return this._isReadyFuture.isCompleted;\n }\n isReady() {\n return this._isReadyFuture.promise;\n }\n async start(sceneNameOrLoader, options) {\n await this.scope(async () => {\n if (!this._compatible) {\n throw new Error('Excalibur is incompatible with your browser');\n }\n this._isLoading = true;\n let loader;\n if (sceneNameOrLoader instanceof _Director_DefaultLoader__WEBPACK_IMPORTED_MODULE_27__.DefaultLoader) {\n loader = sceneNameOrLoader;\n }\n else if (typeof sceneNameOrLoader === 'string') {\n this.director.configureStart(sceneNameOrLoader, options);\n loader = this.director.mainLoader;\n }\n // Start the excalibur clock which drives the mainloop\n this._logger.debug('Starting game clock...');\n this.browser.resume();\n this.clock.start();\n if (this.garbageCollectorConfig) {\n this._garbageCollector.start();\n }\n this._logger.debug('Game clock started');\n await this.load(loader !== null && loader !== void 0 ? loader : new _Director_Loader__WEBPACK_IMPORTED_MODULE_28__.Loader());\n // Initialize before ready\n await this._overrideInitialize(this);\n this._isReadyFuture.resolve();\n this.emit('start', new _Events__WEBPACK_IMPORTED_MODULE_26__.GameStartEvent(this));\n return this._isReadyFuture.promise;\n });\n }\n _mainloop(elapsed) {\n this.scope(() => {\n this.emit('preframe', new _Events__WEBPACK_IMPORTED_MODULE_26__.PreFrameEvent(this, this.stats.prevFrame));\n const elapsedMs = elapsed * this.timescale;\n this.currentFrameElapsedMs = elapsedMs;\n // reset frame stats (reuse existing instances)\n const frameId = this.stats.prevFrame.id + 1;\n this.stats.currFrame.reset();\n this.stats.currFrame.id = frameId;\n this.stats.currFrame.elapsedMs = elapsedMs;\n this.stats.currFrame.fps = this.clock.fpsSampler.fps;\n _Graphics_GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_29__.GraphicsDiagnostics.clear();\n const beforeUpdate = this.clock.now();\n const fixedTimestepMs = this.fixedUpdateTimestep;\n if (this.fixedUpdateTimestep) {\n this._lagMs += elapsedMs;\n while (this._lagMs >= fixedTimestepMs) {\n this._update(fixedTimestepMs);\n this._lagMs -= fixedTimestepMs;\n }\n }\n else {\n this._update(elapsedMs);\n }\n const afterUpdate = this.clock.now();\n this.currentFrameLagMs = this._lagMs;\n this._draw(elapsedMs);\n const afterDraw = this.clock.now();\n this.stats.currFrame.duration.update = afterUpdate - beforeUpdate;\n this.stats.currFrame.duration.draw = afterDraw - afterUpdate;\n this.stats.currFrame.graphics.drawnImages = _Graphics_GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_29__.GraphicsDiagnostics.DrawnImagesCount;\n this.stats.currFrame.graphics.drawCalls = _Graphics_GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_29__.GraphicsDiagnostics.DrawCallCount;\n this.emit('postframe', new _Events__WEBPACK_IMPORTED_MODULE_26__.PostFrameEvent(this, this.stats.currFrame));\n this.stats.prevFrame.reset(this.stats.currFrame);\n this._monitorPerformanceThresholdAndTriggerFallback();\n });\n }\n /**\n * Stops Excalibur's main loop, useful for pausing the game.\n */\n stop() {\n if (this.clock.isRunning()) {\n this.emit('stop', new _Events__WEBPACK_IMPORTED_MODULE_26__.GameStopEvent(this));\n this.browser.pause();\n this.clock.stop();\n this._garbageCollector.stop();\n this._logger.debug('Game stopped');\n }\n }\n /**\n * Returns the Engine's running status, Useful for checking whether engine is running or paused.\n */\n isRunning() {\n return this.clock.isRunning();\n }\n /**\n * Takes a screen shot of the current viewport and returns it as an\n * HTML Image Element.\n * @param preserveHiDPIResolution in the case of HiDPI return the full scaled backing image, by default false\n */\n screenshot(preserveHiDPIResolution = false) {\n const screenShotPromise = new Promise((resolve) => {\n this._screenShotRequests.push({ preserveHiDPIResolution, resolve });\n });\n return screenShotPromise;\n }\n _checkForScreenShots() {\n // We must grab the draw buffer before we yield to the browser\n // the draw buffer is cleared after compositing\n // the reason for the asynchrony is setting `preserveDrawingBuffer: true`\n // forces the browser to copy buffers which can have a mass perf impact on mobile\n for (const request of this._screenShotRequests) {\n const finalWidth = request.preserveHiDPIResolution ? this.canvas.width : this.screen.resolution.width;\n const finalHeight = request.preserveHiDPIResolution ? this.canvas.height : this.screen.resolution.height;\n const screenshot = document.createElement('canvas');\n screenshot.width = finalWidth;\n screenshot.height = finalHeight;\n const ctx = screenshot.getContext('2d');\n ctx.imageSmoothingEnabled = this.screen.antialiasing;\n ctx.drawImage(this.canvas, 0, 0, finalWidth, finalHeight);\n const result = new Image();\n const raw = screenshot.toDataURL('image/png');\n result.onload = () => {\n request.resolve(result);\n };\n result.src = raw;\n }\n // Reset state\n this._screenShotRequests.length = 0;\n }\n /**\n * Another option available to you to load resources into the game.\n * Immediately after calling this the game will pause and the loading screen\n * will appear.\n * @param loader Some {@apilink Loadable} such as a {@apilink Loader} collection, {@apilink Sound}, or {@apilink Texture}.\n */\n async load(loader, hideLoader = false) {\n await this.scope(async () => {\n try {\n // early exit if loaded\n if (loader.isLoaded()) {\n return;\n }\n this._loader = loader;\n this._isLoading = true;\n this._hideLoader = hideLoader;\n if (loader instanceof _Director_Loader__WEBPACK_IMPORTED_MODULE_28__.Loader) {\n loader.suppressPlayButton = loader.suppressPlayButton || this._suppressPlayButton;\n }\n this._loader.onInitialize(this);\n await loader.load();\n }\n catch (e) {\n this._logger.error('Error loading resources, things may not behave properly', e);\n await Promise.resolve();\n }\n finally {\n this._isLoading = false;\n this._hideLoader = false;\n this._loader = null;\n }\n });\n }\n}\nEngine.Context = (0,_Context__WEBPACK_IMPORTED_MODULE_1__.createContext)();\nEngine.InstanceCount = 0;\n/**\n * Default {@apilink EngineOptions}\n */\nEngine._DEFAULT_ENGINE_OPTIONS = {\n width: 0,\n height: 0,\n enableCanvasTransparency: true,\n useDrawSorting: true,\n configurePerformanceCanvas2DFallback: {\n allow: false,\n showPlayerMessage: false,\n threshold: { fps: 20, numberOfFrames: 100 }\n },\n canvasElementId: '',\n canvasElement: undefined,\n enableCanvasContextMenu: false,\n snapToPixel: false,\n antialiasing: true,\n pixelArt: false,\n garbageCollection: true,\n powerPreference: 'high-performance',\n pointerScope: _Input_PointerScope__WEBPACK_IMPORTED_MODULE_22__.PointerScope.Canvas,\n suppressConsoleBootMessage: null,\n suppressMinimumBrowserFeatureDetection: null,\n suppressHiDPIScaling: null,\n suppressPlayButton: null,\n grabWindowFocus: true,\n scrollPreventionMode: ScrollPreventionMode.Canvas,\n backgroundColor: _Color__WEBPACK_IMPORTED_MODULE_30__.Color.fromHex('#2185d0') // Excalibur blue\n};\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/Component.ts\":\n/*!********************************************!*\\\n !*** ./EntityComponentSystem/Component.ts ***!\n \\********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Component: () => (/* binding */ Component),\n/* harmony export */ isComponentCtor: () => (/* binding */ isComponentCtor)\n/* harmony export */ });\n/**\n *\n */\nfunction isComponentCtor(value) {\n return !!value && !!value.prototype && !!value.prototype.constructor;\n}\n/**\n * Type guard to check if a component implements clone\n * @param x\n */\nfunction hasClone(x) {\n return !!(x === null || x === void 0 ? void 0 : x.clone);\n}\n/**\n * Components are containers for state in Excalibur, the are meant to convey capabilities that an Entity possesses\n *\n * Implementations of Component must have a zero-arg constructor to support dependencies\n *\n * ```typescript\n * class MyComponent extends ex.Component {\n * // zero arg support required if you want to use component dependencies\n * constructor(public optionalPos?: ex.Vector) {}\n * }\n * ```\n */\nclass Component {\n constructor() {\n // TODO maybe generate a unique id?\n /**\n * Current owning {@apilink Entity}, if any, of this component. Null if not added to any {@apilink Entity}\n */\n this.owner = undefined;\n }\n /**\n * Clones any properties on this component, if that property value has a `clone()` method it will be called\n */\n clone() {\n const newComponent = new this.constructor();\n for (const prop in this) {\n if (this.hasOwnProperty(prop)) {\n const val = this[prop];\n if (hasClone(val) && prop !== 'owner' && prop !== 'clone') {\n newComponent[prop] = val.clone();\n }\n else {\n newComponent[prop] = val;\n }\n }\n }\n return newComponent;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/Components/MotionComponent.ts\":\n/*!*************************************************************!*\\\n !*** ./EntityComponentSystem/Components/MotionComponent.ts ***!\n \\*************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MotionComponent: () => (/* binding */ MotionComponent)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Component */ \"./EntityComponentSystem/Component.ts\");\n\n\nclass MotionComponent extends _Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor() {\n super(...arguments);\n /**\n * The velocity of an entity in pixels per second\n */\n this.vel = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n /**\n * The acceleration of entity in pixels per second^2\n */\n this.acc = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n /**\n * The scale rate of change in scale units per second\n */\n this.scaleFactor = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n /**\n * The angular velocity which is how quickly the entity is rotating in radians per second\n */\n this.angularVelocity = 0;\n /**\n * The amount of torque applied to the entity, angular acceleration is torque * inertia\n */\n this.torque = 0;\n /**\n * Inertia can be thought of as the resistance to motion\n */\n this.inertia = 1;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/Components/TransformComponent.ts\":\n/*!****************************************************************!*\\\n !*** ./EntityComponentSystem/Components/TransformComponent.ts ***!\n \\****************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TransformComponent: () => (/* binding */ TransformComponent)\n/* harmony export */ });\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Math/coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _Math_transform__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math/transform */ \"./Math/transform.ts\");\n/* harmony import */ var _Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Component */ \"./EntityComponentSystem/Component.ts\");\n/* harmony import */ var _Util_Observable__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Util/Observable */ \"./Util/Observable.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n\n\n\n\n\nclass TransformComponent extends _Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor() {\n super(...arguments);\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this._parentComponent = null;\n this._transform = new _Math_transform__WEBPACK_IMPORTED_MODULE_2__.Transform();\n this._addChildTransform = (child) => {\n const childTxComponent = child.get(TransformComponent);\n if (childTxComponent) {\n childTxComponent._transform.parent = this._transform;\n childTxComponent._parentComponent = this;\n }\n };\n /**\n * Observable that emits when the z index changes on this component\n */\n this.zIndexChanged$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_3__.Observable();\n this._coordPlane = _Math_coord_plane__WEBPACK_IMPORTED_MODULE_4__.CoordPlane.World;\n }\n get() {\n return this._transform;\n }\n onAdd(owner) {\n for (const child of owner.children) {\n this._addChildTransform(child);\n }\n owner.childrenAdded$.subscribe((child) => this._addChildTransform(child));\n owner.childrenRemoved$.subscribe((child) => {\n const childTxComponent = child.get(TransformComponent);\n if (childTxComponent) {\n childTxComponent._transform.parent = null;\n childTxComponent._parentComponent = null;\n }\n });\n }\n onRemove(_previousOwner) {\n this._transform.parent = null;\n this._parentComponent = null;\n }\n /**\n * The z-index ordering of the entity, a higher values are drawn on top of lower values.\n * For example z=99 would be drawn on top of z=0.\n */\n get z() {\n return this._transform.z;\n }\n set z(val) {\n const oldz = this._transform.z;\n this._transform.z = val;\n if (oldz !== val) {\n this.zIndexChanged$.notifyAll(val);\n }\n }\n get globalZ() {\n return this._transform.globalZ;\n }\n set globalZ(z) {\n this._transform.globalZ = z;\n }\n /**\n * The {@apilink CoordPlane | `coordinate plane`} for this transform for the entity.\n */\n get coordPlane() {\n if (this._parentComponent) {\n return this._parentComponent.coordPlane;\n }\n return this._coordPlane;\n }\n set coordPlane(value) {\n var _a;\n if (!this._parentComponent) {\n this._coordPlane = value;\n }\n else {\n this._logger.warn(`Cannot set coordinate plane on child entity ${(_a = this.owner) === null || _a === void 0 ? void 0 : _a.name}, children inherit their coordinate plane from their parents.`);\n }\n }\n get pos() {\n return this._transform.pos;\n }\n set pos(v) {\n this._transform.pos = v;\n }\n get globalPos() {\n return this._transform.globalPos;\n }\n set globalPos(v) {\n this._transform.globalPos = v;\n }\n get rotation() {\n return this._transform.rotation;\n }\n set rotation(rotation) {\n this._transform.rotation = rotation;\n }\n get globalRotation() {\n return this._transform.globalRotation;\n }\n set globalRotation(rotation) {\n this._transform.globalRotation = rotation;\n }\n get scale() {\n return this._transform.scale;\n }\n set scale(v) {\n this._transform.scale = v;\n }\n get globalScale() {\n return this._transform.globalScale;\n }\n set globalScale(v) {\n this._transform.globalScale = v;\n }\n applyInverse(v) {\n return this._transform.applyInverse(v);\n }\n apply(v) {\n return this._transform.apply(v);\n }\n clone() {\n const component = new TransformComponent();\n component._transform = this._transform.clone();\n return component;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/Entity.ts\":\n/*!*****************************************!*\\\n !*** ./EntityComponentSystem/Entity.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AddedComponent: () => (/* binding */ AddedComponent),\n/* harmony export */ Entity: () => (/* binding */ Entity),\n/* harmony export */ EntityEvents: () => (/* binding */ EntityEvents),\n/* harmony export */ RemovedComponent: () => (/* binding */ RemovedComponent),\n/* harmony export */ isAddedComponent: () => (/* binding */ isAddedComponent),\n/* harmony export */ isRemovedComponent: () => (/* binding */ isRemovedComponent)\n/* harmony export */ });\n/* harmony import */ var _Component__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Component */ \"./EntityComponentSystem/Component.ts\");\n/* harmony import */ var _Util_Observable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Observable */ \"./Util/Observable.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Util/Util */ \"./Util/Util.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n\n\n\n\n\n\n\n/**\n * AddedComponent message\n */\nclass AddedComponent {\n constructor(data) {\n this.data = data;\n this.type = 'Component Added';\n }\n}\n/**\n * Type guard to know if message is f an Added Component\n */\nfunction isAddedComponent(x) {\n return !!x && x.type === 'Component Added';\n}\n/**\n * RemovedComponent message\n */\nclass RemovedComponent {\n constructor(data) {\n this.data = data;\n this.type = 'Component Removed';\n }\n}\n/**\n * Type guard to know if message is for a Removed Component\n */\nfunction isRemovedComponent(x) {\n return !!x && x.type === 'Component Removed';\n}\nconst EntityEvents = {\n Add: 'add',\n Remove: 'remove',\n Initialize: 'initialize',\n PreUpdate: 'preupdate',\n PostUpdate: 'postupdate',\n Kill: 'kill'\n};\n/**\n * An Entity is the base type of anything that can have behavior in Excalibur, they are part of the built in entity component system\n *\n * Entities can be strongly typed with the components they contain\n *\n * ```typescript\n * const entity = new Entity();\n * entity.components.a; // Type ComponentA\n * entity.components.b; // Type ComponentB\n * ```\n */\nclass Entity {\n constructor(componentsOrOptions, name) {\n /**\n * The unique identifier for the entity\n */\n this.id = Entity._ID++;\n this.name = `Entity#${this.id}`;\n /**\n * Listen to or emit events for an entity\n */\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n this._tags = new Set();\n this.componentAdded$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_1__.Observable();\n this.componentRemoved$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_1__.Observable();\n this.tagAdded$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_1__.Observable();\n this.tagRemoved$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_1__.Observable();\n /**\n * Current components on the entity\n *\n * **Do not modify**\n *\n * Use addComponent/removeComponent otherwise the ECS will not be notified of changes.\n */\n this.components = new Map();\n this.componentValues = [];\n this._componentsToRemove = [];\n /**\n * The current scene that the entity is in, if any\n */\n this.scene = null;\n /**\n * Whether this entity is active, if set to false it will be reclaimed\n */\n this.isActive = true;\n this._parent = null;\n this.childrenAdded$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_1__.Observable();\n this.childrenRemoved$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_1__.Observable();\n this._children = [];\n this._isInitialized = false;\n this._isAdded = false;\n let componentsToAdd;\n let nameToAdd;\n let silence = false;\n if (Array.isArray(componentsOrOptions)) {\n componentsToAdd = componentsOrOptions;\n nameToAdd = name;\n }\n else if (componentsOrOptions && typeof componentsOrOptions === 'object') {\n const { components, name, silenceWarnings } = componentsOrOptions;\n componentsToAdd = components !== null && components !== void 0 ? components : [];\n nameToAdd = name;\n silence = !!silenceWarnings;\n }\n if (nameToAdd) {\n this.name = nameToAdd;\n }\n if (componentsToAdd) {\n for (const component of componentsToAdd) {\n this.addComponent(component);\n }\n }\n if (true) {\n if (!silence) {\n setTimeout(() => {\n if (!this.scene && !this.isInitialized) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_2__.Logger.getInstance().warn(`Entity \"${this.name || this.id}\" was not added to a scene.`);\n }\n }, 5000);\n }\n }\n }\n /**\n * Whether this entity is active, if set to false it will be reclaimed\n * @deprecated use isActive\n */\n get active() {\n return this.isActive;\n }\n /**\n * Whether this entity is active, if set to false it will be reclaimed\n * @deprecated use isActive\n */\n set active(val) {\n this.isActive = val;\n }\n /**\n * Kill the entity, means it will no longer be updated. Kills are deferred to the end of the update.\n * If parented it will be removed from the parent when killed.\n */\n kill() {\n if (this.isActive) {\n this.isActive = false;\n this.unparent();\n }\n this.emit('kill', new _Events__WEBPACK_IMPORTED_MODULE_3__.KillEvent(this));\n }\n isKilled() {\n return !this.isActive;\n }\n /**\n * Specifically get the tags on the entity from {@apilink TagsComponent}\n */\n get tags() {\n return this._tags;\n }\n /**\n * Check if a tag exists on the entity\n * @param tag name to check for\n */\n hasTag(tag) {\n return this._tags.has(tag);\n }\n /**\n * Adds a tag to an entity\n * @param tag\n */\n addTag(tag) {\n this._tags.add(tag);\n this.tagAdded$.notifyAll(tag);\n return this;\n }\n /**\n * Removes a tag on the entity\n *\n * Removals are deferred until the end of update\n * @param tag\n */\n removeTag(tag) {\n this._tags.delete(tag);\n this.tagRemoved$.notifyAll(tag);\n return this;\n }\n /**\n * The types of the components on the Entity\n */\n get types() {\n return Array.from(this.components.keys());\n }\n /**\n * Returns all component instances on entity\n */\n getComponents() {\n return Array.from(this.components.values());\n }\n /**\n * Verifies that an entity has all the required types\n * @param requiredTypes\n */\n hasAll(requiredTypes) {\n for (let i = 0; i < requiredTypes.length; i++) {\n if (!this.components.has(requiredTypes[i])) {\n return false;\n }\n }\n return true;\n }\n /**\n * Verifies that an entity has all the required tags\n * @param requiredTags\n */\n hasAllTags(requiredTags) {\n for (let i = 0; i < requiredTags.length; i++) {\n if (!this.tags.has(requiredTags[i])) {\n return false;\n }\n }\n return true;\n }\n get(type) {\n return this.components.get(type);\n }\n get parent() {\n return this._parent;\n }\n /**\n * Get the direct children of this entity\n */\n get children() {\n return this._children;\n }\n /**\n * Unparents this entity, if there is a parent. Otherwise it does nothing.\n */\n unparent() {\n if (this._parent) {\n this._parent.removeChild(this);\n this._parent = null;\n }\n }\n /**\n * Adds an entity to be a child of this entity\n * @param entity\n */\n addChild(entity) {\n if (entity.parent === null) {\n if (this.getAncestors().includes(entity)) {\n throw new Error('Cycle detected, cannot add entity');\n }\n this._children.push(entity);\n entity._parent = this;\n this.childrenAdded$.notifyAll(entity);\n }\n else {\n throw new Error('Entity already has a parent, cannot add without unparenting');\n }\n return this;\n }\n /**\n * Remove an entity from children if it exists\n * @param entity\n */\n removeChild(entity) {\n if (entity.parent === this) {\n (0,_Util_Util__WEBPACK_IMPORTED_MODULE_4__.removeItemFromArray)(entity, this._children);\n entity._parent = null;\n this.childrenRemoved$.notifyAll(entity);\n }\n return this;\n }\n /**\n * Removes all children from this entity\n */\n removeAllChildren() {\n // Avoid modifying the array issue by walking backwards\n for (let i = this.children.length - 1; i >= 0; i--) {\n this.removeChild(this.children[i]);\n }\n return this;\n }\n /**\n * Returns a list of parent entities starting with the topmost parent. Includes the current entity.\n */\n getAncestors() {\n const result = [this];\n let current = this.parent;\n while (current) {\n result.push(current);\n current = current.parent;\n }\n return result.reverse();\n }\n /**\n * Returns a list of all the entities that descend from this entity. Includes the current entity.\n */\n getDescendants() {\n let result = [this];\n let queue = [this];\n while (queue.length > 0) {\n const curr = queue.pop();\n if (curr) {\n queue = queue.concat(curr.children);\n result = result.concat(curr.children);\n }\n }\n return result;\n }\n /**\n * Creates a deep copy of the entity and a copy of all its components\n */\n clone() {\n const newEntity = new Entity();\n for (const c of this.types) {\n const componentInstance = this.get(c);\n if (componentInstance) {\n newEntity.addComponent(componentInstance.clone());\n }\n }\n for (const child of this.children) {\n newEntity.addChild(child.clone());\n }\n return newEntity;\n }\n /**\n * Adds a copy of all the components from another template entity as a \"prefab\"\n * @param templateEntity Entity to use as a template\n * @param force Force component replacement if it already exists on the target entity\n */\n addTemplate(templateEntity, force = false) {\n for (const c of templateEntity.getComponents()) {\n this.addComponent(c.clone(), force);\n }\n for (const child of templateEntity.children) {\n this.addChild(child.clone().addTemplate(child));\n }\n return this;\n }\n _getClassHierarchyRoot(componentType) {\n var _a, _b;\n let current = componentType;\n let parent = (_a = Object.getPrototypeOf(current.prototype)) === null || _a === void 0 ? void 0 : _a.constructor;\n while (parent && parent !== Object && parent !== _Component__WEBPACK_IMPORTED_MODULE_5__.Component) {\n current = parent;\n parent = (_b = Object.getPrototypeOf(current.prototype)) === null || _b === void 0 ? void 0 : _b.constructor;\n }\n return current;\n }\n /**\n * Adds a component to the entity\n * @param component Component or Entity to add copy of components from\n * @param force Optionally overwrite any existing components of the same type\n */\n addComponent(component, force = false) {\n // if component already exists, skip if not forced\n if (this.has(component.constructor)) {\n if (force) {\n // Remove existing component type if exists when forced\n this.removeComponent(component.constructor, true);\n }\n else {\n // early exit component exits\n return this;\n }\n }\n // TODO circular dependencies will be a problem\n if (component.dependencies && component.dependencies.length) {\n for (const ctor of component.dependencies) {\n this.addComponent(new ctor());\n }\n }\n component.owner = this;\n const rootComponent = this._getClassHierarchyRoot(component.constructor);\n this.components.set(rootComponent, component);\n this.components.set(component.constructor, component);\n this.componentValues.push(component);\n if (component.onAdd) {\n component.onAdd(this);\n }\n this.componentAdded$.notifyAll(component);\n return this;\n }\n /**\n * Removes a component from the entity, by default removals are deferred to the end of entity update to avoid consistency issues\n *\n * Components can be force removed with the `force` flag, the removal is not deferred and happens immediately\n * @param typeOrInstance\n * @param force\n */\n removeComponent(typeOrInstance, force = false) {\n let type;\n if ((0,_Component__WEBPACK_IMPORTED_MODULE_5__.isComponentCtor)(typeOrInstance)) {\n type = typeOrInstance;\n }\n else {\n type = typeOrInstance.constructor;\n }\n if (force) {\n const componentToRemove = this.components.get(type);\n if (componentToRemove) {\n this.componentRemoved$.notifyAll(componentToRemove);\n componentToRemove.owner = undefined;\n if (componentToRemove.onRemove) {\n componentToRemove.onRemove(this);\n }\n const componentIndex = this.componentValues.indexOf(componentToRemove);\n if (componentIndex > -1) {\n this.componentValues.splice(componentIndex, 1);\n }\n }\n const rootComponent = this._getClassHierarchyRoot(type);\n this.components.delete(rootComponent);\n this.components.delete(type); // remove after the notify to preserve typing\n }\n else {\n this._componentsToRemove.push(type);\n }\n return this;\n }\n clearComponents() {\n const components = this.types;\n for (const c of components) {\n this.removeComponent(c);\n }\n }\n /**\n * @hidden\n * @internal\n */\n processComponentRemoval() {\n for (const type of this._componentsToRemove) {\n this.removeComponent(type, true);\n }\n this._componentsToRemove.length = 0;\n }\n /**\n * Check if a component type exists\n * @param type\n */\n has(type) {\n return this.components.has(type);\n }\n /**\n * Gets whether the actor is Initialized\n */\n get isInitialized() {\n return this._isInitialized;\n }\n get isAdded() {\n return this._isAdded;\n }\n /**\n * Initializes this entity, meant to be called by the Scene before first update not by users of Excalibur.\n *\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n * @internal\n */\n _initialize(engine) {\n if (!this.isInitialized) {\n this.onInitialize(engine);\n this.events.emit('initialize', new _Events__WEBPACK_IMPORTED_MODULE_3__.InitializeEvent(engine, this));\n this._isInitialized = true;\n }\n }\n /**\n * Adds this Actor, meant to be called by the Scene when Actor is added.\n *\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n * @internal\n */\n _add(engine) {\n if (!this.isAdded && this.isActive) {\n this.onAdd(engine);\n this.events.emit('add', new _Events__WEBPACK_IMPORTED_MODULE_3__.AddEvent(engine, this));\n this._isAdded = true;\n }\n }\n /**\n * Removes Actor, meant to be called by the Scene when Actor is added.\n *\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n * @internal\n */\n _remove(engine) {\n if (this.isAdded && !this.isActive) {\n this.onRemove(engine);\n this.events.emit('remove', new _Events__WEBPACK_IMPORTED_MODULE_3__.RemoveEvent(engine, this));\n this._isAdded = false;\n }\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _preupdate handler for {@apilink onPreUpdate} lifecycle event\n * @internal\n */\n _preupdate(engine, elapsed) {\n this.events.emit('preupdate', new _Events__WEBPACK_IMPORTED_MODULE_3__.PreUpdateEvent(engine, elapsed, this));\n this.onPreUpdate(engine, elapsed);\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _preupdate handler for {@apilink onPostUpdate} lifecycle event\n * @internal\n */\n _postupdate(engine, elapsed) {\n this.events.emit('postupdate', new _Events__WEBPACK_IMPORTED_MODULE_3__.PostUpdateEvent(engine, elapsed, this));\n this.onPostUpdate(engine, elapsed);\n }\n /**\n * `onInitialize` is called before the first update of the entity. This method is meant to be\n * overridden.\n *\n * Synonymous with the event handler `.on('initialize', (evt) => {...})`\n */\n onInitialize(engine) {\n // Override me\n }\n /**\n * `onAdd` is called when Actor is added to scene. This method is meant to be\n * overridden.\n *\n * Synonymous with the event handler `.on('add', (evt) => {...})`\n */\n onAdd(engine) {\n // Override me\n }\n /**\n * `onRemove` is called when Actor is added to scene. This method is meant to be\n * overridden.\n *\n * Synonymous with the event handler `.on('remove', (evt) => {...})`\n */\n onRemove(engine) {\n // Override me\n }\n /**\n * Safe to override onPreUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPreUpdate` is called directly before an entity is updated.\n */\n onPreUpdate(engine, elapsed) {\n // Override me\n }\n /**\n * Safe to override onPostUpdate lifecycle event handler. Synonymous with `.on('postupdate', (evt) =>{...})`\n *\n * `onPostUpdate` is called directly after an entity is updated.\n */\n onPostUpdate(engine, elapsed) {\n // Override me\n }\n /**\n *\n * Entity update lifecycle, called internally\n * @internal\n * @param engine\n * @param elapsed\n */\n update(engine, elapsed) {\n this._initialize(engine);\n this._add(engine);\n this._preupdate(engine, elapsed);\n for (const child of this.children) {\n child.update(engine, elapsed);\n }\n this._postupdate(engine, elapsed);\n this._remove(engine);\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n if (handler) {\n this.events.off(eventName, handler);\n }\n else {\n this.events.off(eventName);\n }\n }\n}\nEntity._ID = 0;\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/EntityManager.ts\":\n/*!************************************************!*\\\n !*** ./EntityComponentSystem/EntityManager.ts ***!\n \\************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EntityManager: () => (/* binding */ EntityManager)\n/* harmony export */ });\n/* harmony import */ var _Entity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Util */ \"./Util/Util.ts\");\n\n\n// Add/Remove entities and components\nclass EntityManager {\n constructor(_world) {\n this._world = _world;\n this.entities = [];\n this._entityIndex = {};\n this._childAddedHandlerMap = new Map();\n this._childRemovedHandlerMap = new Map();\n this._createChildAddedHandler = () => (e) => {\n this.addEntity(e);\n };\n this._createChildRemovedHandler = () => (e) => {\n this.removeEntity(e, false);\n };\n this._entitiesToRemove = [];\n }\n /**\n * Runs the entity lifecycle\n * @param scene\n * @param elapsed\n */\n updateEntities(scene, elapsed) {\n for (let entityIndex = 0; entityIndex < this.entities.length; entityIndex++) {\n const entity = this.entities[entityIndex];\n entity.update(scene.engine, elapsed);\n if (!entity.isActive) {\n this.removeEntity(entity);\n }\n }\n }\n findEntitiesForRemoval() {\n for (let entityIndex = 0; entityIndex < this.entities.length; entityIndex++) {\n const entity = this.entities[entityIndex];\n if (!entity.isActive) {\n this.removeEntity(entity);\n }\n }\n }\n /**\n * Adds an entity to be tracked by the EntityManager\n * @param entity\n */\n addEntity(entity) {\n entity.isActive = true;\n entity.scene = this._world.scene;\n if (entity && !this._entityIndex[entity.id]) {\n this._entityIndex[entity.id] = entity;\n this.entities.push(entity);\n this._world.queryManager.addEntity(entity);\n // if entity has children\n entity.children.forEach((c) => {\n c.scene = entity.scene;\n this.addEntity(c);\n });\n const childAdded = this._createChildAddedHandler();\n this._childAddedHandlerMap.set(entity, childAdded);\n const childRemoved = this._createChildRemovedHandler();\n this._childRemovedHandlerMap.set(entity, childRemoved);\n entity.childrenAdded$.subscribe(childAdded);\n entity.childrenRemoved$.subscribe(childRemoved);\n }\n }\n removeEntity(idOrEntity, deferred = true) {\n var _a, _b;\n let id = 0;\n if (idOrEntity instanceof _Entity__WEBPACK_IMPORTED_MODULE_0__.Entity) {\n id = idOrEntity.id;\n }\n else {\n id = idOrEntity;\n }\n const entity = this._entityIndex[id];\n if (entity && entity.isActive) {\n entity.isActive = false;\n }\n if (entity && deferred) {\n this._entitiesToRemove.push(entity);\n return;\n }\n delete this._entityIndex[id];\n if (entity) {\n entity.scene = null;\n (0,_Util_Util__WEBPACK_IMPORTED_MODULE_1__.removeItemFromArray)(entity, this.entities);\n this._world.queryManager.removeEntity(entity);\n // if entity has children\n entity.children.forEach((c) => {\n c.scene = null;\n this.removeEntity(c, deferred);\n });\n const childAddedHandler = this._childAddedHandlerMap.get(entity);\n if (childAddedHandler) {\n entity.childrenAdded$.unsubscribe(childAddedHandler);\n }\n const childRemovedHandler = this._childRemovedHandlerMap.get(entity);\n if (childRemovedHandler) {\n entity.childrenRemoved$.unsubscribe(childRemovedHandler);\n }\n // stats\n if ((_b = (_a = this._world) === null || _a === void 0 ? void 0 : _a.scene) === null || _b === void 0 ? void 0 : _b.engine) {\n this._world.scene.engine.stats.currFrame.actors.killed++;\n }\n }\n }\n processEntityRemovals() {\n for (let entityIndex = 0; entityIndex < this._entitiesToRemove.length; entityIndex++) {\n const entity = this._entitiesToRemove[entityIndex];\n if (entity.isActive) {\n continue;\n }\n this.removeEntity(entity, false);\n }\n this._entitiesToRemove.length = 0;\n }\n processComponentRemovals() {\n for (let entityIndex = 0; entityIndex < this.entities.length; entityIndex++) {\n const entity = this.entities[entityIndex];\n entity.processComponentRemoval();\n }\n }\n getById(id) {\n return this._entityIndex[id];\n }\n getByName(name) {\n return this.entities.filter((e) => e.name === name);\n }\n clear() {\n for (let i = this.entities.length - 1; i >= 0; i--) {\n this.removeEntity(this.entities[i]);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/Priority.ts\":\n/*!*******************************************!*\\\n !*** ./EntityComponentSystem/Priority.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SystemPriority: () => (/* binding */ SystemPriority)\n/* harmony export */ });\n/**\n * Higher priorities run earlier than others in the system update\n */\nconst SystemPriority = {\n Highest: -Infinity,\n Higher: -5,\n Average: 0,\n Lower: 5,\n Lowest: Infinity\n};\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/Query.ts\":\n/*!****************************************!*\\\n !*** ./EntityComponentSystem/Query.ts ***!\n \\****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Query: () => (/* binding */ Query)\n/* harmony export */ });\n/* harmony import */ var _Util_Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Util/Observable */ \"./Util/Observable.ts\");\n\n/**\n * Represents query for entities that match a list of types that is cached and observable\n *\n * Queries can be strongly typed by supplying a type union in the optional type parameter\n * ```typescript\n * const queryAB = new ex.Query(['A', 'B']);\n * ```\n */\nclass Query {\n constructor(requiredComponents) {\n this.requiredComponents = requiredComponents;\n this.components = new Set();\n this.entities = [];\n /**\n * This fires right after the component is added\n */\n this.entityAdded$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_0__.Observable();\n /**\n * This fires right before the component is actually removed from the entity, it will still be available for cleanup purposes\n */\n this.entityRemoved$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_0__.Observable();\n if (requiredComponents.length === 0) {\n throw new Error('Cannot create query without components');\n }\n for (const type of requiredComponents) {\n this.components.add(type);\n }\n this.id = Query.createId(requiredComponents);\n }\n static createId(requiredComponents) {\n // TODO what happens if a user defines the same type name as a built in type\n // ! TODO this could be dangerous depending on the bundler's settings for names\n // Maybe some kind of hash function is better here?\n return requiredComponents\n .slice()\n .map((c) => c.name)\n .sort()\n .join('-');\n }\n /**\n * Potentially adds an entity to a query index, returns true if added, false if not\n * @param entity\n */\n checkAndAdd(entity) {\n if (!this.entities.includes(entity) && entity.hasAll(Array.from(this.components))) {\n this.entities.push(entity);\n this.entityAdded$.notifyAll(entity);\n return true;\n }\n return false;\n }\n removeEntity(entity) {\n const index = this.entities.indexOf(entity);\n if (index > -1) {\n this.entities.splice(index, 1);\n this.entityRemoved$.notifyAll(entity);\n }\n }\n /**\n * Returns a list of entities that match the query\n * @param sort Optional sorting function to sort entities returned from the query\n */\n getEntities(sort) {\n if (sort) {\n this.entities.sort(sort);\n }\n return this.entities;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/QueryManager.ts\":\n/*!***********************************************!*\\\n !*** ./EntityComponentSystem/QueryManager.ts ***!\n \\***********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ QueryManager: () => (/* binding */ QueryManager)\n/* harmony export */ });\n/* harmony import */ var _Query__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Query */ \"./EntityComponentSystem/Query.ts\");\n/* harmony import */ var _TagQuery__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./TagQuery */ \"./EntityComponentSystem/TagQuery.ts\");\n\n\n/**\n * The query manager is responsible for updating all queries when entities/components change\n */\nclass QueryManager {\n constructor(_world) {\n this._world = _world;\n this._queries = new Map();\n this._addComponentHandlers = new Map();\n this._removeComponentHandlers = new Map();\n this._componentToQueriesIndex = new Map();\n this._tagQueries = new Map();\n this._addTagHandlers = new Map();\n this._removeTagHandlers = new Map();\n this._tagToQueriesIndex = new Map();\n this._createAddComponentHandler = (entity) => (c) => {\n this.addComponent(entity, c);\n };\n this._createRemoveComponentHandler = (entity) => (c) => {\n this.removeComponent(entity, c);\n };\n this._createAddTagHandler = (entity) => (tag) => {\n this.addTag(entity, tag);\n };\n this._createRemoveTagHandler = (entity) => (tag) => {\n this.removeTag(entity, tag);\n };\n }\n createQuery(requiredComponents) {\n const id = _Query__WEBPACK_IMPORTED_MODULE_0__.Query.createId(requiredComponents);\n if (this._queries.has(id)) {\n // short circuit if query is already created\n return this._queries.get(id);\n }\n const query = new _Query__WEBPACK_IMPORTED_MODULE_0__.Query(requiredComponents);\n this._queries.set(query.id, query);\n // index maintenance\n for (const component of requiredComponents) {\n const queries = this._componentToQueriesIndex.get(component);\n if (!queries) {\n this._componentToQueriesIndex.set(component, [query]);\n }\n else {\n queries.push(query);\n }\n }\n for (const entity of this._world.entities) {\n this.addEntity(entity);\n }\n return query;\n }\n createTagQuery(requiredTags) {\n const id = _TagQuery__WEBPACK_IMPORTED_MODULE_1__.TagQuery.createId(requiredTags);\n if (this._tagQueries.has(id)) {\n // short circuit if query is already created\n return this._tagQueries.get(id);\n }\n const query = new _TagQuery__WEBPACK_IMPORTED_MODULE_1__.TagQuery(requiredTags);\n this._tagQueries.set(query.id, query);\n // index maintenance\n for (const tag of requiredTags) {\n const queries = this._tagToQueriesIndex.get(tag);\n if (!queries) {\n this._tagToQueriesIndex.set(tag, [query]);\n }\n else {\n queries.push(query);\n }\n }\n for (const entity of this._world.entities) {\n this.addEntity(entity);\n }\n return query;\n }\n /**\n * Scans queries and locates any that need this entity added\n * @param entity\n */\n addEntity(entity) {\n const maybeAddComponent = this._addComponentHandlers.get(entity);\n const maybeRemoveComponent = this._removeComponentHandlers.get(entity);\n const addComponent = maybeAddComponent !== null && maybeAddComponent !== void 0 ? maybeAddComponent : this._createAddComponentHandler(entity);\n const removeComponent = maybeRemoveComponent !== null && maybeRemoveComponent !== void 0 ? maybeRemoveComponent : this._createRemoveComponentHandler(entity);\n this._addComponentHandlers.set(entity, addComponent);\n this._removeComponentHandlers.set(entity, removeComponent);\n const maybeAddTag = this._addTagHandlers.get(entity);\n const maybeRemoveTag = this._removeTagHandlers.get(entity);\n const addTag = maybeAddTag !== null && maybeAddTag !== void 0 ? maybeAddTag : this._createAddTagHandler(entity);\n const removeTag = maybeRemoveTag !== null && maybeRemoveTag !== void 0 ? maybeRemoveTag : this._createRemoveTagHandler(entity);\n this._addTagHandlers.set(entity, addTag);\n this._removeTagHandlers.set(entity, removeTag);\n for (const query of this._queries.values()) {\n query.checkAndAdd(entity);\n }\n for (const tagQuery of this._tagQueries.values()) {\n tagQuery.checkAndAdd(entity);\n }\n entity.componentAdded$.subscribe(addComponent);\n entity.componentRemoved$.subscribe(removeComponent);\n entity.tagAdded$.subscribe(addTag);\n entity.tagRemoved$.subscribe(removeTag);\n }\n /**\n * Scans queries and locates any that need this entity removed\n * @param entity\n */\n removeEntity(entity) {\n // Handle components\n const addComponent = this._addComponentHandlers.get(entity);\n const removeComponent = this._removeComponentHandlers.get(entity);\n for (const query of this._queries.values()) {\n query.removeEntity(entity);\n }\n if (addComponent) {\n entity.componentAdded$.unsubscribe(addComponent);\n }\n if (removeComponent) {\n entity.componentRemoved$.unsubscribe(removeComponent);\n }\n // Handle tags\n const addTag = this._addTagHandlers.get(entity);\n const removeTag = this._removeTagHandlers.get(entity);\n for (const tagQuery of this._tagQueries.values()) {\n tagQuery.removeEntity(entity);\n }\n if (addTag) {\n entity.tagAdded$.unsubscribe(addTag);\n }\n if (removeTag) {\n entity.tagRemoved$.unsubscribe(removeTag);\n }\n }\n /**\n * Updates any queries when a component is added to an entity\n * @param entity\n * @param component\n */\n addComponent(entity, component) {\n var _a;\n const queries = (_a = this._componentToQueriesIndex.get(component.constructor)) !== null && _a !== void 0 ? _a : [];\n for (const query of queries) {\n query.checkAndAdd(entity);\n }\n }\n /**\n * Updates any queries when a component is removed from an entity\n * @param entity\n * @param component\n */\n removeComponent(entity, component) {\n var _a;\n const queries = (_a = this._componentToQueriesIndex.get(component.constructor)) !== null && _a !== void 0 ? _a : [];\n for (const query of queries) {\n query.removeEntity(entity);\n }\n }\n /**\n * Updates any queries when a tag is added to an entity\n * @param entity\n * @param tag\n */\n addTag(entity, tag) {\n var _a;\n const queries = (_a = this._tagToQueriesIndex.get(tag)) !== null && _a !== void 0 ? _a : [];\n for (const query of queries) {\n query.checkAndAdd(entity);\n }\n }\n /**\n * Updates any queries when a component is removed from an entity\n * @param entity\n * @param tag\n */\n removeTag(entity, tag) {\n var _a;\n const queries = (_a = this._tagToQueriesIndex.get(tag)) !== null && _a !== void 0 ? _a : [];\n for (const query of queries) {\n query.removeEntity(entity);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/System.ts\":\n/*!*****************************************!*\\\n !*** ./EntityComponentSystem/System.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ System: () => (/* binding */ System),\n/* harmony export */ SystemType: () => (/* binding */ SystemType)\n/* harmony export */ });\n/* harmony import */ var _Priority__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Priority */ \"./EntityComponentSystem/Priority.ts\");\n\n/**\n * Enum that determines whether to run the system in the update or draw phase\n */\nvar SystemType;\n(function (SystemType) {\n SystemType[\"Update\"] = \"update\";\n SystemType[\"Draw\"] = \"draw\";\n})(SystemType || (SystemType = {}));\n/**\n * An Excalibur {@apilink System} that updates entities of certain types.\n * Systems are scene specific\n *\n *\n *\n * Excalibur Systems currently require at least 1 Component type to operated\n *\n * Multiple types are declared as a type union\n * For example:\n *\n * ```typescript\n * class MySystem extends System {\n * static priority = SystemPriority.Lowest;\n * public readonly systemType = SystemType.Update;\n * public query: Query;\n * constructor(public world: World) {\n * super();\n * this.query = this.world.query([TransformComponent]);\n * }\n * public update(elapsed: number) {\n * ...\n * }\n * }\n * ```\n */\nclass System {\n}\n/**\n * System can execute in priority order, by default all systems are priority 0. Lower values indicated higher priority.\n * For a system to execute before all other a lower priority value (-1 for example) must be set.\n * For a system to execute after all other a higher priority value (10 for example) must be set.\n */\nSystem.priority = _Priority__WEBPACK_IMPORTED_MODULE_0__.SystemPriority.Average;\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/SystemManager.ts\":\n/*!************************************************!*\\\n !*** ./EntityComponentSystem/SystemManager.ts ***!\n \\************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SystemManager: () => (/* binding */ SystemManager),\n/* harmony export */ isSystemConstructor: () => (/* binding */ isSystemConstructor)\n/* harmony export */ });\n/* harmony import */ var _System__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Util */ \"./Util/Util.ts\");\n\n\n/**\n *\n */\nfunction isSystemConstructor(x) {\n var _a, _b;\n return !!(x === null || x === void 0 ? void 0 : x.prototype) && !!((_b = (_a = x === null || x === void 0 ? void 0 : x.prototype) === null || _a === void 0 ? void 0 : _a.constructor) === null || _b === void 0 ? void 0 : _b.name);\n}\n/**\n * The SystemManager is responsible for keeping track of all systems in a scene.\n * Systems are scene specific\n */\nclass SystemManager {\n constructor(_world) {\n this._world = _world;\n /**\n * List of systems, to add a new system call {@apilink SystemManager.addSystem}\n */\n this.systems = [];\n this.initialized = false;\n }\n /**\n * Get a system registered in the manager by type\n * @param systemType\n */\n get(systemType) {\n return this.systems.find((s) => s instanceof systemType);\n }\n /**\n * Adds a system to the manager, it will now be updated every frame\n * @param systemOrCtor\n */\n addSystem(systemOrCtor) {\n let system;\n if (systemOrCtor instanceof _System__WEBPACK_IMPORTED_MODULE_0__.System) {\n system = systemOrCtor;\n }\n else {\n system = new systemOrCtor(this._world);\n }\n this.systems.push(system);\n this.systems.sort((a, b) => a.constructor.priority - b.constructor.priority);\n // If systems are added and the manager has already been init'd\n // then immediately init the system\n if (this.initialized && system.initialize) {\n system.initialize(this._world, this._world.scene);\n }\n }\n /**\n * Removes a system from the manager, it will no longer be updated\n * @param system\n */\n removeSystem(system) {\n (0,_Util_Util__WEBPACK_IMPORTED_MODULE_1__.removeItemFromArray)(system, this.systems);\n }\n /**\n * Initialize all systems in the manager\n *\n * Systems added after initialize() will be initialized on add\n */\n initialize() {\n if (!this.initialized) {\n this.initialized = true;\n for (const s of this.systems) {\n if (s.initialize) {\n s.initialize(this._world, this._world.scene);\n }\n }\n }\n }\n /**\n * Updates all systems\n * @param type whether this is an update or draw system\n * @param scene context reference\n * @param elapsed time in milliseconds\n */\n updateSystems(type, scene, elapsed) {\n const systems = this.systems.filter((s) => s.systemType === type);\n for (const s of systems) {\n if (s.preupdate) {\n s.preupdate(scene, elapsed);\n }\n }\n for (const s of systems) {\n s.update(elapsed);\n }\n for (const s of systems) {\n if (s.postupdate) {\n s.postupdate(scene, elapsed);\n }\n }\n }\n clear() {\n for (let i = this.systems.length - 1; i >= 0; i--) {\n this.removeSystem(this.systems[i]);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/TagQuery.ts\":\n/*!*******************************************!*\\\n !*** ./EntityComponentSystem/TagQuery.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TagQuery: () => (/* binding */ TagQuery)\n/* harmony export */ });\n/* harmony import */ var _Util_Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Util/Observable */ \"./Util/Observable.ts\");\n\nclass TagQuery {\n constructor(requiredTags) {\n this.requiredTags = requiredTags;\n this.tags = new Set();\n this.entities = [];\n /**\n * This fires right after the component is added\n */\n this.entityAdded$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_0__.Observable();\n /**\n * This fires right before the component is actually removed from the entity, it will still be available for cleanup purposes\n */\n this.entityRemoved$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_0__.Observable();\n if (requiredTags.length === 0) {\n throw new Error('Cannot create tag query without tags');\n }\n for (const tag of requiredTags) {\n this.tags.add(tag);\n }\n this.id = TagQuery.createId(requiredTags);\n }\n static createId(requiredComponents) {\n return requiredComponents.slice().sort().join('-');\n }\n checkAndAdd(entity) {\n if (!this.entities.includes(entity) && entity.hasAllTags(Array.from(this.tags))) {\n this.entities.push(entity);\n this.entityAdded$.notifyAll(entity);\n return true;\n }\n return false;\n }\n removeEntity(entity) {\n const index = this.entities.indexOf(entity);\n if (index > -1) {\n this.entities.splice(index, 1);\n this.entityRemoved$.notifyAll(entity);\n }\n }\n /**\n * Returns a list of entities that match the query\n * @param sort Optional sorting function to sort entities returned from the query\n */\n getEntities(sort) {\n if (sort) {\n this.entities.sort(sort);\n }\n return this.entities;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/World.ts\":\n/*!****************************************!*\\\n !*** ./EntityComponentSystem/World.ts ***!\n \\****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ World: () => (/* binding */ World)\n/* harmony export */ });\n/* harmony import */ var _Entity__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _EntityManager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./EntityManager */ \"./EntityComponentSystem/EntityManager.ts\");\n/* harmony import */ var _QueryManager__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./QueryManager */ \"./EntityComponentSystem/QueryManager.ts\");\n/* harmony import */ var _System__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _SystemManager__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./SystemManager */ \"./EntityComponentSystem/SystemManager.ts\");\n\n\n\n\n\n/**\n * The World is a self-contained entity component system for a particular context.\n */\nclass World {\n /**\n * The context type is passed to the system updates\n * @param scene\n */\n constructor(scene) {\n this.scene = scene;\n this.queryManager = new _QueryManager__WEBPACK_IMPORTED_MODULE_0__.QueryManager(this);\n this.entityManager = new _EntityManager__WEBPACK_IMPORTED_MODULE_1__.EntityManager(this);\n this.systemManager = new _SystemManager__WEBPACK_IMPORTED_MODULE_2__.SystemManager(this);\n }\n /**\n * Query the ECS world for entities that match your components\n * @param requiredTypes\n */\n query(requiredTypes) {\n return this.queryManager.createQuery(requiredTypes);\n }\n queryTags(requiredTags) {\n return this.queryManager.createTagQuery(requiredTags);\n }\n /**\n * Update systems by type and time elapsed in milliseconds\n */\n update(type, elapsed) {\n if (type === _System__WEBPACK_IMPORTED_MODULE_3__.SystemType.Update) {\n this.entityManager.updateEntities(this.scene, elapsed);\n }\n this.systemManager.updateSystems(type, this.scene, elapsed);\n this.entityManager.findEntitiesForRemoval();\n this.entityManager.processComponentRemovals();\n this.entityManager.processEntityRemovals();\n }\n add(entityOrSystem) {\n if (entityOrSystem instanceof _Entity__WEBPACK_IMPORTED_MODULE_4__.Entity) {\n this.entityManager.addEntity(entityOrSystem);\n }\n if (entityOrSystem instanceof _System__WEBPACK_IMPORTED_MODULE_3__.System || (0,_SystemManager__WEBPACK_IMPORTED_MODULE_2__.isSystemConstructor)(entityOrSystem)) {\n this.systemManager.addSystem(entityOrSystem);\n }\n }\n /**\n * Get a system out of the ECS world\n */\n get(system) {\n return this.systemManager.get(system);\n }\n remove(entityOrSystem, deferred = true) {\n if (entityOrSystem instanceof _Entity__WEBPACK_IMPORTED_MODULE_4__.Entity) {\n this.entityManager.removeEntity(entityOrSystem, deferred);\n }\n if (entityOrSystem instanceof _System__WEBPACK_IMPORTED_MODULE_3__.System) {\n this.systemManager.removeSystem(entityOrSystem);\n }\n }\n get entities() {\n return this.entityManager.entities;\n }\n clearEntities() {\n this.entityManager.clear();\n }\n clearSystems() {\n this.systemManager.clear();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/index.ts\":\n/*!****************************************!*\\\n !*** ./EntityComponentSystem/index.ts ***!\n \\****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AddedComponent: () => (/* reexport safe */ _Entity__WEBPACK_IMPORTED_MODULE_1__.AddedComponent),\n/* harmony export */ Component: () => (/* reexport safe */ _Component__WEBPACK_IMPORTED_MODULE_0__.Component),\n/* harmony export */ Entity: () => (/* reexport safe */ _Entity__WEBPACK_IMPORTED_MODULE_1__.Entity),\n/* harmony export */ EntityEvents: () => (/* reexport safe */ _Entity__WEBPACK_IMPORTED_MODULE_1__.EntityEvents),\n/* harmony export */ EntityManager: () => (/* reexport safe */ _EntityManager__WEBPACK_IMPORTED_MODULE_2__.EntityManager),\n/* harmony export */ MotionComponent: () => (/* reexport safe */ _Components_MotionComponent__WEBPACK_IMPORTED_MODULE_11__.MotionComponent),\n/* harmony export */ Query: () => (/* reexport safe */ _Query__WEBPACK_IMPORTED_MODULE_3__.Query),\n/* harmony export */ QueryManager: () => (/* reexport safe */ _QueryManager__WEBPACK_IMPORTED_MODULE_5__.QueryManager),\n/* harmony export */ RemovedComponent: () => (/* reexport safe */ _Entity__WEBPACK_IMPORTED_MODULE_1__.RemovedComponent),\n/* harmony export */ System: () => (/* reexport safe */ _System__WEBPACK_IMPORTED_MODULE_6__.System),\n/* harmony export */ SystemManager: () => (/* reexport safe */ _SystemManager__WEBPACK_IMPORTED_MODULE_7__.SystemManager),\n/* harmony export */ SystemPriority: () => (/* reexport safe */ _Priority__WEBPACK_IMPORTED_MODULE_9__.SystemPriority),\n/* harmony export */ SystemType: () => (/* reexport safe */ _System__WEBPACK_IMPORTED_MODULE_6__.SystemType),\n/* harmony export */ TagQuery: () => (/* reexport safe */ _TagQuery__WEBPACK_IMPORTED_MODULE_4__.TagQuery),\n/* harmony export */ TransformComponent: () => (/* reexport safe */ _Components_TransformComponent__WEBPACK_IMPORTED_MODULE_10__.TransformComponent),\n/* harmony export */ World: () => (/* reexport safe */ _World__WEBPACK_IMPORTED_MODULE_8__.World),\n/* harmony export */ isAddedComponent: () => (/* reexport safe */ _Entity__WEBPACK_IMPORTED_MODULE_1__.isAddedComponent),\n/* harmony export */ isComponentCtor: () => (/* reexport safe */ _Component__WEBPACK_IMPORTED_MODULE_0__.isComponentCtor),\n/* harmony export */ isRemovedComponent: () => (/* reexport safe */ _Entity__WEBPACK_IMPORTED_MODULE_1__.isRemovedComponent),\n/* harmony export */ isSystemConstructor: () => (/* reexport safe */ _SystemManager__WEBPACK_IMPORTED_MODULE_7__.isSystemConstructor)\n/* harmony export */ });\n/* harmony import */ var _Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Component */ \"./EntityComponentSystem/Component.ts\");\n/* harmony import */ var _Entity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _EntityManager__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./EntityManager */ \"./EntityComponentSystem/EntityManager.ts\");\n/* harmony import */ var _Query__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Query */ \"./EntityComponentSystem/Query.ts\");\n/* harmony import */ var _TagQuery__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./TagQuery */ \"./EntityComponentSystem/TagQuery.ts\");\n/* harmony import */ var _QueryManager__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./QueryManager */ \"./EntityComponentSystem/QueryManager.ts\");\n/* harmony import */ var _System__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _SystemManager__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./SystemManager */ \"./EntityComponentSystem/SystemManager.ts\");\n/* harmony import */ var _World__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./World */ \"./EntityComponentSystem/World.ts\");\n/* harmony import */ var _Priority__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Priority */ \"./EntityComponentSystem/Priority.ts\");\n/* harmony import */ var _Components_TransformComponent__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Components_MotionComponent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./EventEmitter.ts\":\n/*!*************************!*\\\n !*** ./EventEmitter.ts ***!\n \\*************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EventEmitter: () => (/* binding */ EventEmitter)\n/* harmony export */ });\n/**\n * Excalibur's typed event emitter, this allows events to be sent with any string to Type mapping\n */\nclass EventEmitter {\n constructor() {\n this._paused = false;\n this._empty = true;\n this._listeners = {};\n this._listenersOnce = {};\n this._pipes = [];\n }\n /**\n * Removes all listeners and pipes\n */\n clear() {\n this._listeners = {};\n this._listenersOnce = {};\n this._pipes.length = 0;\n this._empty = true;\n }\n on(eventName, handler) {\n var _a;\n this._empty = false;\n this._listeners[eventName] = (_a = this._listeners[eventName]) !== null && _a !== void 0 ? _a : [];\n this._listeners[eventName].push(handler);\n return {\n close: () => this.off(eventName, handler)\n };\n }\n once(eventName, handler) {\n var _a;\n this._empty = false;\n this._listenersOnce[eventName] = (_a = this._listenersOnce[eventName]) !== null && _a !== void 0 ? _a : [];\n this._listenersOnce[eventName].push(handler);\n return {\n close: () => this.off(eventName, handler)\n };\n }\n off(eventName, handler) {\n var _a, _b;\n if (handler) {\n const newListeners = (_a = this._listeners[eventName]) === null || _a === void 0 ? void 0 : _a.filter((h) => h !== handler);\n this._listeners[eventName] = newListeners;\n const newOnceListeners = (_b = this._listenersOnce[eventName]) === null || _b === void 0 ? void 0 : _b.filter((h) => h !== handler);\n this._listenersOnce[eventName] = newOnceListeners;\n }\n else {\n delete this._listeners[eventName];\n }\n }\n emit(eventName, event) {\n if (this._empty) {\n return;\n }\n if (this._paused) {\n return;\n }\n const listeners = this._listeners[eventName];\n if (listeners) {\n for (let i = 0; i < listeners.length; i++) {\n listeners[i](event);\n }\n }\n const onces = this._listenersOnce[eventName];\n this._listenersOnce[eventName] = [];\n if (onces) {\n for (let i = 0; i < onces.length; i++) {\n onces[i](event);\n }\n }\n for (let i = 0; i < this._pipes.length; i++) {\n this._pipes[i].emit(eventName, event);\n }\n }\n /**\n * Replay events from this emitter to another\n * @param emitter\n */\n pipe(emitter) {\n if (this === emitter) {\n throw Error('Cannot pipe to self');\n }\n this._empty = false;\n this._pipes.push(emitter);\n return {\n close: () => {\n const i = this._pipes.indexOf(emitter);\n if (i > -1) {\n this._pipes.splice(i, 1);\n }\n }\n };\n }\n /**\n * Remove any piped emitters\n * @param emitter\n */\n unpipe(emitter) {\n const i = this._pipes.indexOf(emitter);\n if (i > -1) {\n this._pipes.splice(i, 1);\n }\n }\n /**\n * Paused event emitters do not emit events\n */\n pause() {\n this._paused = true;\n }\n /**\n * Unpaused event emitter do emit events\n */\n unpause() {\n this._paused = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Events.ts\":\n/*!*******************!*\\\n !*** ./Events.ts ***!\n \\*******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ActionCompleteEvent: () => (/* binding */ ActionCompleteEvent),\n/* harmony export */ ActionStartEvent: () => (/* binding */ ActionStartEvent),\n/* harmony export */ ActivateEvent: () => (/* binding */ ActivateEvent),\n/* harmony export */ AddEvent: () => (/* binding */ AddEvent),\n/* harmony export */ CollisionEndEvent: () => (/* binding */ CollisionEndEvent),\n/* harmony export */ CollisionPostSolveEvent: () => (/* binding */ CollisionPostSolveEvent),\n/* harmony export */ CollisionPreSolveEvent: () => (/* binding */ CollisionPreSolveEvent),\n/* harmony export */ CollisionStartEvent: () => (/* binding */ CollisionStartEvent),\n/* harmony export */ ContactEndEvent: () => (/* binding */ ContactEndEvent),\n/* harmony export */ ContactStartEvent: () => (/* binding */ ContactStartEvent),\n/* harmony export */ DeactivateEvent: () => (/* binding */ DeactivateEvent),\n/* harmony export */ EnterTriggerEvent: () => (/* binding */ EnterTriggerEvent),\n/* harmony export */ EnterViewPortEvent: () => (/* binding */ EnterViewPortEvent),\n/* harmony export */ EventTypes: () => (/* binding */ EventTypes),\n/* harmony export */ ExitTriggerEvent: () => (/* binding */ ExitTriggerEvent),\n/* harmony export */ ExitViewPortEvent: () => (/* binding */ ExitViewPortEvent),\n/* harmony export */ GameEvent: () => (/* binding */ GameEvent),\n/* harmony export */ GameStartEvent: () => (/* binding */ GameStartEvent),\n/* harmony export */ GameStopEvent: () => (/* binding */ GameStopEvent),\n/* harmony export */ GamepadAxisEvent: () => (/* binding */ GamepadAxisEvent),\n/* harmony export */ GamepadButtonEvent: () => (/* binding */ GamepadButtonEvent),\n/* harmony export */ GamepadConnectEvent: () => (/* binding */ GamepadConnectEvent),\n/* harmony export */ GamepadDisconnectEvent: () => (/* binding */ GamepadDisconnectEvent),\n/* harmony export */ HiddenEvent: () => (/* binding */ HiddenEvent),\n/* harmony export */ InitializeEvent: () => (/* binding */ InitializeEvent),\n/* harmony export */ KillEvent: () => (/* binding */ KillEvent),\n/* harmony export */ PostCollisionEvent: () => (/* binding */ PostCollisionEvent),\n/* harmony export */ PostDebugDrawEvent: () => (/* binding */ PostDebugDrawEvent),\n/* harmony export */ PostDrawEvent: () => (/* binding */ PostDrawEvent),\n/* harmony export */ PostFrameEvent: () => (/* binding */ PostFrameEvent),\n/* harmony export */ PostKillEvent: () => (/* binding */ PostKillEvent),\n/* harmony export */ PostTransformDrawEvent: () => (/* binding */ PostTransformDrawEvent),\n/* harmony export */ PostUpdateEvent: () => (/* binding */ PostUpdateEvent),\n/* harmony export */ PreCollisionEvent: () => (/* binding */ PreCollisionEvent),\n/* harmony export */ PreDebugDrawEvent: () => (/* binding */ PreDebugDrawEvent),\n/* harmony export */ PreDrawEvent: () => (/* binding */ PreDrawEvent),\n/* harmony export */ PreFrameEvent: () => (/* binding */ PreFrameEvent),\n/* harmony export */ PreKillEvent: () => (/* binding */ PreKillEvent),\n/* harmony export */ PreTransformDrawEvent: () => (/* binding */ PreTransformDrawEvent),\n/* harmony export */ PreUpdateEvent: () => (/* binding */ PreUpdateEvent),\n/* harmony export */ RemoveEvent: () => (/* binding */ RemoveEvent),\n/* harmony export */ VisibleEvent: () => (/* binding */ VisibleEvent)\n/* harmony export */ });\nvar EventTypes;\n(function (EventTypes) {\n EventTypes[\"Kill\"] = \"kill\";\n EventTypes[\"PreKill\"] = \"prekill\";\n EventTypes[\"PostKill\"] = \"postkill\";\n EventTypes[\"PreDraw\"] = \"predraw\";\n EventTypes[\"PostDraw\"] = \"postdraw\";\n EventTypes[\"PreDebugDraw\"] = \"predebugdraw\";\n EventTypes[\"PostDebugDraw\"] = \"postdebugdraw\";\n EventTypes[\"PreUpdate\"] = \"preupdate\";\n EventTypes[\"PostUpdate\"] = \"postupdate\";\n EventTypes[\"PreFrame\"] = \"preframe\";\n EventTypes[\"PostFrame\"] = \"postframe\";\n EventTypes[\"PreCollision\"] = \"precollision\";\n EventTypes[\"CollisionStart\"] = \"collisionstart\";\n EventTypes[\"CollisionEnd\"] = \"collisionend\";\n EventTypes[\"PostCollision\"] = \"postcollision\";\n EventTypes[\"Initialize\"] = \"initialize\";\n EventTypes[\"Activate\"] = \"activate\";\n EventTypes[\"Deactivate\"] = \"deactivate\";\n EventTypes[\"ExitViewport\"] = \"exitviewport\";\n EventTypes[\"EnterViewport\"] = \"enterviewport\";\n EventTypes[\"ExitTrigger\"] = \"exit\";\n EventTypes[\"EnterTrigger\"] = \"enter\";\n EventTypes[\"Connect\"] = \"connect\";\n EventTypes[\"Disconnect\"] = \"disconnect\";\n EventTypes[\"Button\"] = \"button\";\n EventTypes[\"Axis\"] = \"axis\";\n EventTypes[\"Visible\"] = \"visible\";\n EventTypes[\"Hidden\"] = \"hidden\";\n EventTypes[\"Start\"] = \"start\";\n EventTypes[\"Stop\"] = \"stop\";\n EventTypes[\"PointerUp\"] = \"pointerup\";\n EventTypes[\"PointerDown\"] = \"pointerdown\";\n EventTypes[\"PointerMove\"] = \"pointermove\";\n EventTypes[\"PointerEnter\"] = \"pointerenter\";\n EventTypes[\"PointerLeave\"] = \"pointerleave\";\n EventTypes[\"PointerCancel\"] = \"pointercancel\";\n EventTypes[\"PointerWheel\"] = \"pointerwheel\";\n EventTypes[\"Up\"] = \"up\";\n EventTypes[\"Down\"] = \"down\";\n EventTypes[\"Move\"] = \"move\";\n EventTypes[\"Enter\"] = \"enter\";\n EventTypes[\"Leave\"] = \"leave\";\n EventTypes[\"Cancel\"] = \"cancel\";\n EventTypes[\"Wheel\"] = \"wheel\";\n EventTypes[\"Press\"] = \"press\";\n EventTypes[\"Release\"] = \"release\";\n EventTypes[\"Hold\"] = \"hold\";\n EventTypes[\"PointerDragStart\"] = \"pointerdragstart\";\n EventTypes[\"PointerDragEnd\"] = \"pointerdragend\";\n EventTypes[\"PointerDragEnter\"] = \"pointerdragenter\";\n EventTypes[\"PointerDragLeave\"] = \"pointerdragleave\";\n EventTypes[\"PointerDragMove\"] = \"pointerdragmove\";\n EventTypes[\"ActionStart\"] = \"actionstart\";\n EventTypes[\"ActionComplete\"] = \"actioncomplete\";\n EventTypes[\"Add\"] = \"add\";\n EventTypes[\"Remove\"] = \"remove\";\n})(EventTypes || (EventTypes = {}));\n/**\n * Base event type in Excalibur that all other event types derive from. Not all event types are thrown on all Excalibur game objects,\n * some events are unique to a type, others are not.\n *\n */\nclass GameEvent {\n constructor() {\n /**\n * Other target object for this event\n */\n this.other = null;\n this._bubbles = true;\n }\n /**\n * If set to false, prevents event from propagating to other actors. If true it will be propagated\n * to all actors that apply.\n */\n get bubbles() {\n return this._bubbles;\n }\n set bubbles(value) {\n this._bubbles = value;\n }\n /**\n * Prevents event from bubbling\n */\n stopPropagation() {\n this.bubbles = false;\n }\n}\n/**\n * The 'kill' event is emitted on actors when it is killed. The target is the actor that was killed.\n */\nclass KillEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'prekill' event is emitted directly before an actor is killed.\n */\nclass PreKillEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'postkill' event is emitted directly after the actor is killed.\n */\nclass PostKillEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'start' event is emitted on engine when has started and is ready for interaction.\n */\nclass GameStartEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'stop' event is emitted on engine when has been stopped and will no longer take input, update or draw.\n */\nclass GameStopEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'predraw' event is emitted on actors, scenes, and engine before drawing starts. Actors' predraw happens inside their graphics\n * transform so that all drawing takes place with the actor as the origin.\n *\n */\nclass PreDrawEvent extends GameEvent {\n constructor(ctx, elapsed, self) {\n super();\n this.ctx = ctx;\n this.elapsed = elapsed;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'postdraw' event is emitted on actors, scenes, and engine after drawing finishes. Actors' postdraw happens inside their graphics\n * transform so that all drawing takes place with the actor as the origin.\n *\n */\nclass PostDrawEvent extends GameEvent {\n constructor(ctx, elapsed, self) {\n super();\n this.ctx = ctx;\n this.elapsed = elapsed;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'pretransformdraw' event is emitted on actors/entities before any graphics transforms have taken place.\n * Useful if you need to completely customize the draw or modify the transform before drawing in the draw step (for example needing\n * latest camera positions)\n *\n */\nclass PreTransformDrawEvent extends GameEvent {\n constructor(ctx, elapsed, self) {\n super();\n this.ctx = ctx;\n this.elapsed = elapsed;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'posttransformdraw' event is emitted on actors/entities after all graphics have been draw and transforms reset.\n * Useful if you need to completely custom the draw after everything is done.\n *\n */\nclass PostTransformDrawEvent extends GameEvent {\n constructor(ctx, elapsed, self) {\n super();\n this.ctx = ctx;\n this.elapsed = elapsed;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'predebugdraw' event is emitted on actors, scenes, and engine before debug drawing starts.\n */\nclass PreDebugDrawEvent extends GameEvent {\n constructor(ctx, self) {\n super();\n this.ctx = ctx;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'postdebugdraw' event is emitted on actors, scenes, and engine after debug drawing starts.\n */\nclass PostDebugDrawEvent extends GameEvent {\n constructor(ctx, self) {\n super();\n this.ctx = ctx;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'preupdate' event is emitted on actors, scenes, camera, and engine before the update starts.\n */\nclass PreUpdateEvent extends GameEvent {\n constructor(engine, elapsed, self) {\n super();\n this.engine = engine;\n this.elapsed = elapsed;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'postupdate' event is emitted on actors, scenes, camera, and engine after the update ends.\n */\nclass PostUpdateEvent extends GameEvent {\n constructor(engine, elapsed, self) {\n super();\n this.engine = engine;\n this.elapsed = elapsed;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'preframe' event is emitted on the engine, before the frame begins.\n */\nclass PreFrameEvent extends GameEvent {\n constructor(engine, prevStats) {\n super();\n this.engine = engine;\n this.prevStats = prevStats;\n this.target = engine;\n }\n}\n/**\n * The 'postframe' event is emitted on the engine, after a frame ends.\n */\nclass PostFrameEvent extends GameEvent {\n constructor(engine, stats) {\n super();\n this.engine = engine;\n this.stats = stats;\n this.target = engine;\n }\n}\n/**\n * Event received when a gamepad is connected to Excalibur. {@apilink Gamepads} receives this event.\n */\nclass GamepadConnectEvent extends GameEvent {\n constructor(index, gamepad) {\n super();\n this.index = index;\n this.gamepad = gamepad;\n this.target = gamepad;\n }\n}\n/**\n * Event received when a gamepad is disconnected from Excalibur. {@apilink Gamepads} receives this event.\n */\nclass GamepadDisconnectEvent extends GameEvent {\n constructor(index, gamepad) {\n super();\n this.index = index;\n this.gamepad = gamepad;\n this.target = gamepad;\n }\n}\n/**\n * Gamepad button event. See {@apilink Gamepads} for information on responding to controller input. {@apilink Gamepad} instances receive this event;\n */\nclass GamepadButtonEvent extends GameEvent {\n /**\n * @param button The Gamepad button\n * @param value A numeric value between 0 and 1\n */\n constructor(button, value, self) {\n super();\n this.button = button;\n this.value = value;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Gamepad axis event. See {@apilink Gamepads} for information on responding to controller input. {@apilink Gamepad} instances receive this event;\n */\nclass GamepadAxisEvent extends GameEvent {\n /**\n * @param axis The Gamepad axis\n * @param value A numeric value between -1 and 1\n */\n constructor(axis, value, self) {\n super();\n this.axis = axis;\n this.value = value;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event received by the {@apilink Engine} when the browser window is visible on a screen.\n */\nclass VisibleEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event received by the {@apilink Engine} when the browser window is hidden from all screens.\n */\nclass HiddenEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event thrown on an {@apilink Actor | `actor`} when a collision will occur this frame if it resolves\n */\nclass PreCollisionEvent extends GameEvent {\n /**\n * @param self The actor the event was thrown on\n * @param other The actor that will collided with the current actor\n * @param side The side that will be collided with the current actor\n * @param intersection Intersection vector\n */\n constructor(self, other, side, intersection, contact) {\n super();\n this.self = self;\n this.other = other;\n this.side = side;\n this.intersection = intersection;\n this.contact = contact;\n this.target = self;\n }\n}\n/**\n * Event thrown on an {@apilink Actor | `actor`} when a collision has been resolved (body reacted) this frame\n */\nclass PostCollisionEvent extends GameEvent {\n /**\n * @param self The actor the event was thrown on\n * @param other The actor that did collide with the current actor\n * @param side The side that did collide with the current actor\n * @param intersection Intersection vector\n */\n constructor(self, other, side, intersection, contact) {\n super();\n this.self = self;\n this.other = other;\n this.side = side;\n this.intersection = intersection;\n this.contact = contact;\n this.target = self;\n }\n}\nclass ContactStartEvent {\n constructor(self, other, side, contact) {\n this.self = self;\n this.other = other;\n this.side = side;\n this.contact = contact;\n }\n}\nclass ContactEndEvent {\n constructor(self, other, side, lastContact) {\n this.self = self;\n this.other = other;\n this.side = side;\n this.lastContact = lastContact;\n }\n}\nclass CollisionPreSolveEvent {\n constructor(self, other, side, intersection, contact) {\n this.self = self;\n this.other = other;\n this.side = side;\n this.intersection = intersection;\n this.contact = contact;\n }\n}\nclass CollisionPostSolveEvent {\n constructor(self, other, side, intersection, contact) {\n this.self = self;\n this.other = other;\n this.side = side;\n this.intersection = intersection;\n this.contact = contact;\n }\n}\n/**\n * Event thrown the first time an {@apilink Actor | `actor`} collides with another, after an actor is in contact normal collision events are fired.\n */\nclass CollisionStartEvent extends GameEvent {\n /**\n *\n * @param self\n * @param other\n * @param side\n * @param contact\n */\n constructor(self, other, side, contact) {\n super();\n this.self = self;\n this.other = other;\n this.side = side;\n this.contact = contact;\n this.target = self;\n }\n}\n/**\n * Event thrown when the {@apilink Actor | `actor`} is no longer colliding with another\n */\nclass CollisionEndEvent extends GameEvent {\n /**\n *\n */\n constructor(self, other, side, lastContact) {\n super();\n this.self = self;\n this.other = other;\n this.side = side;\n this.lastContact = lastContact;\n this.target = self;\n }\n}\n/**\n * Event thrown on an {@apilink Actor}, {@apilink Scene}, and {@apilink Engine} only once before the first update call\n */\nclass InitializeEvent extends GameEvent {\n /**\n * @param engine The reference to the current engine\n */\n constructor(engine, self) {\n super();\n this.engine = engine;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event thrown on a {@apilink Scene} on activation\n */\nclass ActivateEvent extends GameEvent {\n /**\n * @param context The context for the scene activation\n */\n constructor(context, self) {\n super();\n this.context = context;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event thrown on a {@apilink Scene} on deactivation\n */\nclass DeactivateEvent extends GameEvent {\n /**\n * @param context The context for the scene deactivation\n */\n constructor(context, self) {\n super();\n this.context = context;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event thrown on an {@apilink Actor} when the graphics bounds completely leaves the screen.\n */\nclass ExitViewPortEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event thrown on an {@apilink Actor} when any part of the graphics bounds are on screen.\n */\nclass EnterViewPortEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\nclass EnterTriggerEvent extends GameEvent {\n constructor(self, entity) {\n super();\n this.self = self;\n this.entity = entity;\n this.target = self;\n }\n}\nclass ExitTriggerEvent extends GameEvent {\n constructor(self, entity) {\n super();\n this.self = self;\n this.entity = entity;\n this.target = self;\n }\n}\n/**\n * Event thrown on an {@apilink Actor} when an action starts.\n */\nclass ActionStartEvent extends GameEvent {\n constructor(action, self) {\n super();\n this.action = action;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event thrown on an {@apilink Actor} when an action completes.\n */\nclass ActionCompleteEvent extends GameEvent {\n constructor(action, self) {\n super();\n this.action = action;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event thrown on an [[Actor]] when an Actor added to scene.\n */\nclass AddEvent extends GameEvent {\n constructor(engine, self) {\n super();\n this.engine = engine;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event thrown on an [[Actor]] when an Actor removed from scene.\n */\nclass RemoveEvent extends GameEvent {\n constructor(engine, self) {\n super();\n this.engine = engine;\n this.self = self;\n this.target = self;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Events/MediaEvents.ts\":\n/*!*******************************!*\\\n !*** ./Events/MediaEvents.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MediaEvent: () => (/* binding */ MediaEvent),\n/* harmony export */ NativeSoundEvent: () => (/* binding */ NativeSoundEvent),\n/* harmony export */ NativeSoundProcessedEvent: () => (/* binding */ NativeSoundProcessedEvent)\n/* harmony export */ });\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n\nclass MediaEvent extends _Events__WEBPACK_IMPORTED_MODULE_0__.GameEvent {\n /**\n * Media event cannot bubble\n */\n set bubbles(_value) {\n // stubbed\n }\n /**\n * Media event cannot bubble\n */\n get bubbles() {\n return false;\n }\n /**\n * Media event cannot bubble, so they have no path\n */\n get _path() {\n return null;\n }\n /**\n * Media event cannot bubble, so they have no path\n */\n set _path(_val) {\n // stubbed\n }\n constructor(target, _name = 'MediaEvent') {\n super();\n this.target = target;\n this._name = _name;\n }\n /**\n * Prevents event from bubbling\n */\n stopPropagation() {\n /**\n * Stub\n */\n }\n /**\n * Action, that calls when event happens\n */\n action() {\n /**\n * Stub\n */\n }\n /**\n * Propagate event further through event path\n */\n propagate() {\n /**\n * Stub\n */\n }\n layPath(_actor) {\n /**\n * Stub\n */\n }\n}\nclass NativeSoundEvent extends MediaEvent {\n constructor(target, track) {\n super(target, 'NativeSoundEvent');\n this.track = track;\n }\n}\nclass NativeSoundProcessedEvent extends MediaEvent {\n constructor(target, _processedData) {\n super(target, 'NativeSoundProcessedEvent');\n this._processedData = _processedData;\n this.data = this._processedData;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Flags.ts\":\n/*!******************!*\\\n !*** ./Flags.ts ***!\n \\******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Flags: () => (/* binding */ Flags)\n/* harmony export */ });\n/**\n * Flags is a feature flag implementation for Excalibur. They can only be operated **before {@apilink Engine} construction**\n * after which they are frozen and are read-only.\n *\n * Flags are used to enable experimental or preview features in Excalibur.\n */\nclass Flags {\n /**\n * Force excalibur to load the Canvas 2D graphics context fallback\n * @warning not all features of excalibur are supported in the Canvas 2D fallback\n */\n static useCanvasGraphicsContext() {\n Flags.enable('use-canvas-context');\n }\n /**\n * Force excalibur to use the less optimized image renderer\n */\n static useLegacyImageRenderer() {\n Flags.enable('use-legacy-image-renderer');\n }\n /**\n * Freeze all flag modifications making them readonly\n */\n static freeze() {\n Flags._FROZEN = true;\n }\n /**\n * Resets internal flag state, not meant to be called by users. Only used for testing.\n *\n * Calling this in your game is UNSUPPORTED\n * @internal\n */\n static _reset() {\n Flags._FROZEN = false;\n Flags._FLAGS = {};\n }\n /**\n * Enable a specific feature flag by name. **Note: can only be set before {@apilink Engine} constructor time**\n * @param flagName\n */\n static enable(flagName) {\n if (this._FROZEN) {\n throw Error('Feature flags can only be enabled before Engine constructor time');\n }\n Flags._FLAGS[flagName] = true;\n }\n /**\n * Disable a specific feature flag by name. **Note: can only be set before {@apilink Engine} constructor time**\n * @param flagName\n */\n static disable(flagName) {\n if (this._FROZEN) {\n throw Error('Feature flags can only be disabled before Engine constructor time');\n }\n Flags._FLAGS[flagName] = false;\n }\n /**\n * Check if a flag is enabled. If the flag is disabled or does not exist `false` is returned\n * @param flagName\n */\n static isEnabled(flagName) {\n return !!Flags._FLAGS[flagName];\n }\n /**\n * Show a list of currently known flags\n */\n static show() {\n return Object.keys(Flags._FLAGS);\n }\n}\nFlags._FROZEN = false;\nFlags._FLAGS = {};\n\n\n/***/ }),\n\n/***/ \"./GarbageCollector.ts\":\n/*!*****************************!*\\\n !*** ./GarbageCollector.ts ***!\n \\*****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DefaultGarbageCollectionOptions: () => (/* binding */ DefaultGarbageCollectionOptions),\n/* harmony export */ GarbageCollector: () => (/* binding */ GarbageCollector)\n/* harmony export */ });\nconst DefaultGarbageCollectionOptions = {\n textureCollectInterval: 60000\n // TODO future work to integrate the font and text configuration, refactor existing collection mechanism\n // fontCollectInterval: 60_000,\n // textMeasurementCollectInterval: 60_000,\n};\nclass GarbageCollector {\n constructor(options) {\n this.options = options;\n this._running = false;\n this._collectionMap = new Map();\n this._collectors = new Map();\n /**\n * Runs the collection loop to cleanup any stale resources given the registered collect handlers\n */\n this.collectStaleResources = (deadline) => {\n if (!this._running) {\n return;\n }\n for (const [type, [collector, timeoutInterval]] of this._collectors.entries()) {\n const now = this.options.getTimestamp();\n for (const [resource, [resourceType, time]] of this._collectionMap.entries()) {\n if (type !== resourceType || time + timeoutInterval >= now) {\n continue;\n }\n const collected = collector(resource);\n if (collected) {\n this._collectionMap.delete(resource);\n }\n }\n }\n this._collectHandle = requestIdleCallback(this.collectStaleResources);\n };\n }\n /**\n *\n * @param type Resource type\n * @param timeoutInterval If resource type exceeds interval in milliseconds collect() is called\n * @param collect Collection implementation, returns true if collected\n */\n registerCollector(type, timeoutInterval, collect) {\n this._collectors.set(type, [collect, timeoutInterval]);\n }\n /**\n * Add a resource to be tracked for collection\n * @param type\n * @param resource\n */\n addCollectableResource(type, resource) {\n this._collectionMap.set(resource, [type, this.options.getTimestamp()]);\n }\n /**\n * Update the resource last used timestamp preventing collection\n * @param resource\n */\n touch(resource) {\n const collectionData = this._collectionMap.get(resource);\n if (collectionData) {\n this._collectionMap.set(resource, [collectionData[0], this.options.getTimestamp()]);\n }\n }\n /**\n * Force collect all resources, useful for shutting down a game\n * or if you know that you will not use anything you've allocated before now\n */\n forceCollectAll() {\n for (const [_, [collector]] of this._collectors.entries()) {\n for (const [resource] of this._collectionMap.entries()) {\n const collected = collector(resource);\n if (collected) {\n this._collectionMap.delete(resource);\n }\n }\n }\n }\n /**\n * Starts the garbage collection loop\n */\n start() {\n this._running = true;\n this.collectStaleResources();\n }\n /**\n * Stops the garbage collection loop\n */\n stop() {\n this._running = false;\n cancelIdleCallback(this._collectHandle);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Animation.ts\":\n/*!*******************************!*\\\n !*** ./Graphics/Animation.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Animation: () => (/* binding */ Animation),\n/* harmony export */ AnimationDirection: () => (/* binding */ AnimationDirection),\n/* harmony export */ AnimationEvents: () => (/* binding */ AnimationEvents),\n/* harmony export */ AnimationStrategy: () => (/* binding */ AnimationStrategy)\n/* harmony export */ });\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n\nvar AnimationDirection;\n(function (AnimationDirection) {\n /**\n * Animation is playing forwards\n */\n AnimationDirection[\"Forward\"] = \"forward\";\n /**\n * Animation is playing backwards\n */\n AnimationDirection[\"Backward\"] = \"backward\";\n})(AnimationDirection || (AnimationDirection = {}));\nvar AnimationStrategy;\n(function (AnimationStrategy) {\n /**\n * Animation ends without displaying anything\n */\n AnimationStrategy[\"End\"] = \"end\";\n /**\n * Animation loops to the first frame after the last frame\n */\n AnimationStrategy[\"Loop\"] = \"loop\";\n /**\n * Animation plays to the last frame, then backwards to the first frame, then repeats\n */\n AnimationStrategy[\"PingPong\"] = \"pingpong\";\n /**\n * Animation ends stopping on the last frame\n */\n AnimationStrategy[\"Freeze\"] = \"freeze\";\n})(AnimationStrategy || (AnimationStrategy = {}));\nconst AnimationEvents = {\n Frame: 'frame',\n Loop: 'loop',\n End: 'end'\n};\n/**\n * Create an Animation given a list of {@apilink Frame | `frames`} in {@apilink AnimationOptions}\n *\n * To create an Animation from a {@apilink SpriteSheet}, use {@apilink Animation.fromSpriteSheet}\n */\nclass Animation extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n constructor(options) {\n var _a, _b, _c;\n super(options);\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_1__.EventEmitter();\n this.frames = [];\n this.strategy = AnimationStrategy.Loop;\n this.frameDuration = 100;\n this._idempotencyToken = -1;\n this._firstTick = true;\n this._currentFrame = 0;\n this._timeLeftInFrame = 0;\n this._pingPongDirection = 1;\n this._done = false;\n this._playing = true;\n this._speed = 1;\n this._reversed = false;\n this.frames = options.frames;\n this.speed = (_a = options.speed) !== null && _a !== void 0 ? _a : this.speed;\n this.strategy = (_b = options.strategy) !== null && _b !== void 0 ? _b : this.strategy;\n this.frameDuration = options.totalDuration ? options.totalDuration / this.frames.length : (_c = options.frameDuration) !== null && _c !== void 0 ? _c : this.frameDuration;\n if (options.reverse) {\n this.reverse();\n }\n this.goToFrame(0);\n }\n clone() {\n return new Animation({\n frames: this.frames.map((f) => ({ ...f })),\n frameDuration: this.frameDuration,\n speed: this.speed,\n reverse: this._reversed,\n strategy: this.strategy,\n ...this.cloneGraphicOptions()\n });\n }\n get width() {\n const maybeFrame = this.currentFrame;\n if (maybeFrame && maybeFrame.graphic) {\n return Math.abs(maybeFrame.graphic.width * this.scale.x);\n }\n return 0;\n }\n get height() {\n const maybeFrame = this.currentFrame;\n if (maybeFrame && maybeFrame.graphic) {\n return Math.abs(maybeFrame.graphic.height * this.scale.y);\n }\n return 0;\n }\n /**\n * Create an Animation from a {@apilink SpriteSheet}, a list of indices into the sprite sheet, a duration per frame\n * and optional {@apilink AnimationStrategy}\n *\n * Example:\n * ```typescript\n * const spriteSheet = SpriteSheet.fromImageSource({...});\n *\n * const anim = Animation.fromSpriteSheet(spriteSheet, range(0, 5), 200, AnimationStrategy.Loop);\n * ```\n * @param spriteSheet ex.SpriteSheet\n * @param spriteSheetIndex 0 based index from left to right, top down (row major order) of the ex.SpriteSheet\n * @param durationPerFrame duration per frame in milliseconds\n * @param strategy Optional strategy, default AnimationStrategy.Loop\n */\n static fromSpriteSheet(spriteSheet, spriteSheetIndex, durationPerFrame, strategy = AnimationStrategy.Loop) {\n const maxIndex = spriteSheet.sprites.length - 1;\n const invalidIndices = spriteSheetIndex.filter((index) => index < 0 || index > maxIndex);\n if (invalidIndices.length) {\n Animation._LOGGER.warn(`Indices into SpriteSheet were provided that don\\'t exist: ${invalidIndices.join(',')} no frame will be shown`);\n }\n return new Animation({\n frames: spriteSheet.sprites\n .filter((_, index) => spriteSheetIndex.indexOf(index) > -1)\n .map((f) => ({\n graphic: f,\n duration: durationPerFrame\n })),\n strategy: strategy\n });\n }\n /**\n * Create an {@apilink Animation} from a {@apilink SpriteSheet} given a list of coordinates\n *\n * Example:\n * ```typescript\n * const spriteSheet = SpriteSheet.fromImageSource({...});\n *\n * const anim = Animation.fromSpriteSheetCoordinates({\n * spriteSheet,\n * frameCoordinates: [\n * {x: 0, y: 5, duration: 100, options { flipHorizontal: true }},\n * {x: 1, y: 5, duration: 200},\n * {x: 2, y: 5},\n * {x: 3, y: 5}\n * ],\n * strategy: AnimationStrategy.PingPong\n * });\n * ```\n * @param options\n * @returns Animation\n */\n static fromSpriteSheetCoordinates(options) {\n var _a;\n const { spriteSheet, frameCoordinates, durationPerFrame, durationPerFrameMs, speed, strategy, reverse } = options;\n const defaultDuration = (_a = durationPerFrame !== null && durationPerFrame !== void 0 ? durationPerFrame : durationPerFrameMs) !== null && _a !== void 0 ? _a : 100;\n const frames = [];\n for (const coord of frameCoordinates) {\n const { x, y, duration, options } = coord;\n const sprite = spriteSheet.getSprite(x, y, options);\n if (sprite) {\n frames.push({\n graphic: sprite,\n duration: duration !== null && duration !== void 0 ? duration : defaultDuration\n });\n }\n else {\n Animation._LOGGER.warn(`Skipping frame! SpriteSheet does not have coordinate (${x}, ${y}), please check your SpriteSheet to confirm that sprite exists`);\n }\n }\n return new Animation({\n frames,\n strategy,\n speed,\n reverse\n });\n }\n /**\n * Current animation speed\n *\n * 1 meaning normal 1x speed.\n * 2 meaning 2x speed and so on.\n */\n get speed() {\n return this._speed;\n }\n /**\n * Current animation speed\n *\n * 1 meaning normal 1x speed.\n * 2 meaning 2x speed and so on.\n */\n set speed(val) {\n this._speed = (0,_Math_util__WEBPACK_IMPORTED_MODULE_2__.clamp)(Math.abs(val), 0, Infinity);\n }\n /**\n * Returns the current Frame of the animation\n *\n * Use {@apilink Animation.currentFrameIndex} to get the frame number and\n * {@apilink Animation.goToFrame} to set the current frame index\n */\n get currentFrame() {\n if (this._currentFrame >= 0 && this._currentFrame < this.frames.length) {\n return this.frames[this._currentFrame];\n }\n return null;\n }\n /**\n * Returns the current frame index of the animation\n *\n * Use {@apilink Animation.currentFrame} to grab the current {@apilink Frame} object\n */\n get currentFrameIndex() {\n return this._currentFrame;\n }\n /**\n * Returns the amount of time in milliseconds left in the current frame\n */\n get currentFrameTimeLeft() {\n return this._timeLeftInFrame;\n }\n /**\n * Returns `true` if the animation is playing\n */\n get isPlaying() {\n return this._playing;\n }\n get isReversed() {\n return this._reversed;\n }\n /**\n * Reverses the play direction of the Animation, this preserves the current frame\n */\n reverse() {\n // Don't mutate with the original frame list, create a copy\n this.frames = this.frames.slice().reverse();\n this._reversed = !this._reversed;\n }\n /**\n * Returns the current play direction of the animation\n */\n get direction() {\n // Keep logically consistent with ping-pong direction\n // If ping-pong is forward = 1 and reversed is true then we are logically reversed\n const reversed = this._reversed && this._pingPongDirection === 1 ? true : false;\n return reversed ? AnimationDirection.Backward : AnimationDirection.Forward;\n }\n /**\n * Plays or resumes the animation from the current frame\n */\n play() {\n this._playing = true;\n }\n /**\n * Pauses the animation on the current frame\n */\n pause() {\n this._playing = false;\n this._firstTick = true; // firstTick must be set to emit the proper frame event\n }\n /**\n * Reset the animation back to the beginning, including if the animation were done\n */\n reset() {\n this._done = false;\n this._firstTick = true;\n this._currentFrame = 0;\n this._timeLeftInFrame = this.frameDuration;\n const maybeFrame = this.frames[this._currentFrame];\n if (maybeFrame) {\n this._timeLeftInFrame = (maybeFrame === null || maybeFrame === void 0 ? void 0 : maybeFrame.duration) || this.frameDuration;\n }\n }\n /**\n * Returns `true` if the animation can end\n */\n get canFinish() {\n switch (this.strategy) {\n case AnimationStrategy.End:\n case AnimationStrategy.Freeze: {\n return true;\n }\n default: {\n return false;\n }\n }\n }\n /**\n * Returns `true` if the animation is done, for looping type animations\n * `ex.AnimationStrategy.PingPong` and `ex.AnimationStrategy.Loop` this will always return `false`\n *\n * See the `ex.Animation.canFinish()` method to know if an animation type can end\n */\n get done() {\n return this._done;\n }\n /**\n * Jump the animation immediately to a specific frame if it exists\n *\n * Optionally specify an override for the duration of the frame, useful for\n * keeping multiple animations in sync with one another.\n * @param frameNumber\n * @param duration\n */\n goToFrame(frameNumber, duration) {\n this._currentFrame = frameNumber;\n this._timeLeftInFrame = duration !== null && duration !== void 0 ? duration : this.frameDuration;\n const maybeFrame = this.frames[this._currentFrame];\n if (maybeFrame && !this._done) {\n this._timeLeftInFrame = duration !== null && duration !== void 0 ? duration : ((maybeFrame === null || maybeFrame === void 0 ? void 0 : maybeFrame.duration) || this.frameDuration);\n this.events.emit('frame', { ...maybeFrame, frameIndex: this.currentFrameIndex });\n }\n }\n _nextFrame() {\n const currentFrame = this._currentFrame;\n if (this._done) {\n return currentFrame;\n }\n let next = -1;\n switch (this.strategy) {\n case AnimationStrategy.Loop: {\n next = (currentFrame + 1) % this.frames.length;\n if (next === 0) {\n this.events.emit('loop', this);\n }\n break;\n }\n case AnimationStrategy.End: {\n next = currentFrame + 1;\n if (next >= this.frames.length) {\n this._done = true;\n this._currentFrame = this.frames.length;\n this.events.emit('end', this);\n }\n break;\n }\n case AnimationStrategy.Freeze: {\n next = (0,_Math_util__WEBPACK_IMPORTED_MODULE_2__.clamp)(currentFrame + 1, 0, this.frames.length - 1);\n if (next >= this.frames.length - 1) {\n this._done = true;\n this.events.emit('end', this);\n }\n break;\n }\n case AnimationStrategy.PingPong: {\n if (currentFrame + this._pingPongDirection >= this.frames.length) {\n this._pingPongDirection = -1;\n this.events.emit('loop', this);\n }\n if (currentFrame + this._pingPongDirection < 0) {\n this._pingPongDirection = 1;\n this.events.emit('loop', this);\n }\n next = currentFrame + (this._pingPongDirection % this.frames.length);\n break;\n }\n }\n return next;\n }\n /**\n * Called internally by Excalibur to update the state of the animation potential update the current frame\n * @param elapsed Milliseconds elapsed\n * @param idempotencyToken Prevents double ticking in a frame by passing a unique token to the frame\n */\n tick(elapsed, idempotencyToken = 0) {\n if (this._idempotencyToken === idempotencyToken) {\n return;\n }\n this._idempotencyToken = idempotencyToken;\n if (!this._playing) {\n return;\n }\n // if it's the first frame emit frame event\n if (this._firstTick) {\n this._firstTick = false;\n this.events.emit('frame', { ...this.currentFrame, frameIndex: this.currentFrameIndex });\n }\n this._timeLeftInFrame -= elapsed * this._speed;\n if (this._timeLeftInFrame <= 0) {\n this.goToFrame(this._nextFrame());\n }\n }\n _drawImage(ctx, x, y) {\n if (this.currentFrame && this.currentFrame.graphic) {\n this.currentFrame.graphic.draw(ctx, x, y);\n }\n }\n}\nAnimation._LOGGER = _Util_Log__WEBPACK_IMPORTED_MODULE_3__.Logger.getInstance();\n\n\n/***/ }),\n\n/***/ \"./Graphics/Canvas.ts\":\n/*!****************************!*\\\n !*** ./Graphics/Canvas.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Canvas: () => (/* binding */ Canvas)\n/* harmony export */ });\n/* harmony import */ var _Raster__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Raster */ \"./Graphics/Raster.ts\");\n\n/**\n * A canvas {@apilink Graphic} to provide an adapter between the 2D Canvas API and the {@apilink ExcaliburGraphicsContext}.\n *\n * The {@apilink Canvas} works by re-rastering a draw handler to a HTMLCanvasElement for every draw which is then passed\n * to the {@apilink ExcaliburGraphicsContext} implementation as a rendered image.\n *\n * **Low performance API**\n */\nclass Canvas extends _Raster__WEBPACK_IMPORTED_MODULE_0__.Raster {\n /**\n * Return the 2D graphics context of this canvas\n */\n get ctx() {\n return this._ctx;\n }\n constructor(_options = {}) {\n super(_options);\n this._options = _options;\n }\n clone() {\n return new Canvas({\n ...this._options,\n ...this.cloneGraphicOptions(),\n ...this.cloneRasterOptions()\n });\n }\n execute(ctx) {\n var _a, _b;\n if ((_a = this._options) === null || _a === void 0 ? void 0 : _a.draw) {\n (_b = this._options) === null || _b === void 0 ? void 0 : _b.draw(ctx);\n }\n if (!this._options.cache) {\n this.flagDirty();\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Circle.ts\":\n/*!****************************!*\\\n !*** ./Graphics/Circle.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Circle: () => (/* binding */ Circle)\n/* harmony export */ });\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Raster__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Raster */ \"./Graphics/Raster.ts\");\n\n\n/**\n * A circle {@apilink Graphic} for drawing circles to the {@apilink ExcaliburGraphicsContext}\n *\n * Circles default to {@apilink ImageFiltering.Blended}\n */\nclass Circle extends _Raster__WEBPACK_IMPORTED_MODULE_0__.Raster {\n get radius() {\n return this._radius;\n }\n set radius(value) {\n this._radius = value;\n this.width = this._radius * 2;\n this.height = this._radius * 2;\n this.flagDirty();\n }\n constructor(options) {\n var _a, _b, _c;\n super(options);\n this._radius = 0;\n const lineWidth = (_a = options.lineWidth) !== null && _a !== void 0 ? _a : (options.strokeColor ? 1 : 0); // default lineWidth in canvas is 1px\n this.padding = (_b = options.padding) !== null && _b !== void 0 ? _b : 2 + lineWidth / 2; // default 2 padding for circles looks nice\n this.radius = options.radius;\n this.filtering = (_c = options.filtering) !== null && _c !== void 0 ? _c : _Filtering__WEBPACK_IMPORTED_MODULE_1__.ImageFiltering.Blended;\n this.rasterize();\n }\n clone() {\n return new Circle({\n radius: this.radius,\n ...this.cloneGraphicOptions(),\n ...this.cloneRasterOptions()\n });\n }\n execute(ctx) {\n if (this.radius > 0) {\n ctx.beginPath();\n ctx.arc(this.radius, this.radius, this.radius, 0, Math.PI * 2);\n if (this.color) {\n ctx.fill();\n }\n if (this.strokeColor) {\n ctx.stroke();\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/ExcaliburGraphicsContext.ts\":\n/*!******************************************************!*\\\n !*** ./Graphics/Context/ExcaliburGraphicsContext.ts ***!\n \\******************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DefaultAntialiasOptions: () => (/* binding */ DefaultAntialiasOptions),\n/* harmony export */ DefaultPixelArtOptions: () => (/* binding */ DefaultPixelArtOptions)\n/* harmony export */ });\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Filtering */ \"./Graphics/Filtering.ts\");\n\nconst DefaultAntialiasOptions = {\n pixelArtSampler: false,\n nativeContextAntialiasing: false,\n multiSampleAntialiasing: true,\n filtering: _Filtering__WEBPACK_IMPORTED_MODULE_0__.ImageFiltering.Blended,\n canvasImageRendering: 'auto'\n};\nconst DefaultPixelArtOptions = {\n pixelArtSampler: true,\n nativeContextAntialiasing: false,\n multiSampleAntialiasing: true,\n filtering: _Filtering__WEBPACK_IMPORTED_MODULE_0__.ImageFiltering.Blended,\n canvasImageRendering: 'auto'\n};\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/ExcaliburGraphicsContext2DCanvas.ts\":\n/*!**************************************************************!*\\\n !*** ./Graphics/Context/ExcaliburGraphicsContext2DCanvas.ts ***!\n \\**************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ExcaliburGraphicsContext2DCanvas: () => (/* binding */ ExcaliburGraphicsContext2DCanvas)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Color */ \"./Color.ts\");\n/* harmony import */ var _state_stack__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./state-stack */ \"./Graphics/Context/state-stack.ts\");\n/* harmony import */ var _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n/* harmony import */ var _debug_text__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./debug-text */ \"./Graphics/Context/debug-text.ts\");\n\n\n\n\nconst pixelSnapEpsilon = 0.0001;\nclass ExcaliburGraphicsContext2DCanvasDebug {\n constructor(_ex) {\n this._ex = _ex;\n this._debugText = new _debug_text__WEBPACK_IMPORTED_MODULE_0__.DebugText();\n }\n /**\n * Draw a debug rectangle to the context\n * @param x\n * @param y\n * @param width\n * @param height\n */\n drawRect(x, y, width, height) {\n this._ex.__ctx.save();\n this._ex.__ctx.strokeStyle = 'red';\n this._ex.__ctx.strokeRect(this._ex.snapToPixel ? ~~(x + pixelSnapEpsilon) : x, this._ex.snapToPixel ? ~~(y + pixelSnapEpsilon) : y, this._ex.snapToPixel ? ~~(width + pixelSnapEpsilon) : width, this._ex.snapToPixel ? ~~(height + pixelSnapEpsilon) : height);\n this._ex.__ctx.restore();\n }\n drawLine(start, end, lineOptions = { color: _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Black }) {\n var _a, _b;\n this._ex.__ctx.save();\n this._ex.__ctx.beginPath();\n this._ex.__ctx.strokeStyle = (_b = (_a = lineOptions.color) === null || _a === void 0 ? void 0 : _a.toString()) !== null && _b !== void 0 ? _b : '';\n this._ex.__ctx.moveTo(this._ex.snapToPixel ? ~~(start.x + pixelSnapEpsilon) : start.x, this._ex.snapToPixel ? ~~(start.y + pixelSnapEpsilon) : start.y);\n this._ex.__ctx.lineTo(this._ex.snapToPixel ? ~~(end.x + pixelSnapEpsilon) : end.x, this._ex.snapToPixel ? ~~(end.y + pixelSnapEpsilon) : end.y);\n this._ex.__ctx.lineWidth = 2;\n this._ex.__ctx.stroke();\n this._ex.__ctx.closePath();\n this._ex.__ctx.restore();\n }\n drawPoint(point, pointOptions = { color: _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Black, size: 5 }) {\n this._ex.__ctx.save();\n this._ex.__ctx.beginPath();\n this._ex.__ctx.fillStyle = pointOptions.color.toString();\n this._ex.__ctx.arc(this._ex.snapToPixel ? ~~(point.x + pixelSnapEpsilon) : point.x, this._ex.snapToPixel ? ~~(point.y + pixelSnapEpsilon) : point.y, pointOptions.size, 0, Math.PI * 2);\n this._ex.__ctx.fill();\n this._ex.__ctx.closePath();\n this._ex.__ctx.restore();\n }\n drawText(text, pos) {\n this._debugText.write(this._ex, text, pos);\n }\n}\nclass ExcaliburGraphicsContext2DCanvas {\n get width() {\n return this.__ctx.canvas.width;\n }\n get height() {\n return this.__ctx.canvas.height;\n }\n get opacity() {\n return this._state.current.opacity;\n }\n set opacity(value) {\n this._state.current.opacity = value;\n }\n get tint() {\n return this._state.current.tint;\n }\n set tint(color) {\n this._state.current.tint = color;\n }\n get smoothing() {\n return this.__ctx.imageSmoothingEnabled;\n }\n set smoothing(value) {\n this.__ctx.imageSmoothingEnabled = value;\n }\n constructor(options) {\n /**\n * Unused in Canvas implementation\n */\n this.useDrawSorting = false;\n /**\n * Unused in Canvas implementation\n */\n this.z = 0;\n this.backgroundColor = _Color__WEBPACK_IMPORTED_MODULE_1__.Color.ExcaliburBlue;\n this._state = new _state_stack__WEBPACK_IMPORTED_MODULE_2__.StateStack();\n this.snapToPixel = false;\n this.debug = new ExcaliburGraphicsContext2DCanvasDebug(this);\n const { canvasElement, context, enableTransparency, snapToPixel, antialiasing: smoothing, backgroundColor } = options;\n this.__ctx =\n context !== null && context !== void 0 ? context : canvasElement.getContext('2d', {\n alpha: enableTransparency !== null && enableTransparency !== void 0 ? enableTransparency : true\n });\n if (!this.__ctx) {\n throw new Error('Cannot build new ExcaliburGraphicsContext2D for some reason!');\n }\n this.backgroundColor = backgroundColor !== null && backgroundColor !== void 0 ? backgroundColor : this.backgroundColor;\n this.snapToPixel = snapToPixel !== null && snapToPixel !== void 0 ? snapToPixel : this.snapToPixel;\n this.smoothing = smoothing !== null && smoothing !== void 0 ? smoothing : this.smoothing;\n }\n resetTransform() {\n this.__ctx.resetTransform();\n }\n updateViewport(_resolution) {\n // pass\n }\n drawImage(image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight) {\n if (swidth === 0 || sheight === 0) {\n return; // zero dimension dest exit early\n }\n else if (dwidth === 0 || dheight === 0) {\n return; // zero dimension dest exit early\n }\n else if (image.width === 0 || image.height === 0) {\n return; // zero dimension source exit early\n }\n this.__ctx.globalAlpha = this.opacity;\n const args = [image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight]\n .filter((a) => a !== undefined)\n .map((a) => (typeof a === 'number' && this.snapToPixel ? ~~a : a));\n this.__ctx.drawImage.apply(this.__ctx, args);\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_3__.GraphicsDiagnostics.DrawCallCount++;\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_3__.GraphicsDiagnostics.DrawnImagesCount = 1;\n }\n drawLine(start, end, color, thickness = 1) {\n this.__ctx.save();\n this.__ctx.beginPath();\n this.__ctx.strokeStyle = color.toString();\n this.__ctx.moveTo(this.snapToPixel ? ~~(start.x + pixelSnapEpsilon) : start.x, this.snapToPixel ? ~~(start.y + pixelSnapEpsilon) : start.y);\n this.__ctx.lineTo(this.snapToPixel ? ~~(end.x + pixelSnapEpsilon) : end.x, this.snapToPixel ? ~~(end.y + pixelSnapEpsilon) : end.y);\n this.__ctx.lineWidth = thickness;\n this.__ctx.stroke();\n this.__ctx.closePath();\n this.__ctx.restore();\n }\n drawRectangle(pos, width, height, color) {\n this.__ctx.save();\n this.__ctx.fillStyle = color.toString();\n this.__ctx.fillRect(this.snapToPixel ? ~~(pos.x + pixelSnapEpsilon) : pos.x, this.snapToPixel ? ~~(pos.y + pixelSnapEpsilon) : pos.y, this.snapToPixel ? ~~(width + pixelSnapEpsilon) : width, this.snapToPixel ? ~~(height + pixelSnapEpsilon) : height);\n this.__ctx.restore();\n }\n drawCircle(pos, radius, color, stroke, thickness) {\n this.__ctx.save();\n this.__ctx.beginPath();\n if (stroke) {\n this.__ctx.strokeStyle = stroke.toString();\n }\n if (thickness) {\n this.__ctx.lineWidth = thickness;\n }\n this.__ctx.fillStyle = color.toString();\n this.__ctx.arc(this.snapToPixel ? ~~(pos.x + pixelSnapEpsilon) : pos.x, this.snapToPixel ? ~~(pos.y + pixelSnapEpsilon) : pos.y, radius, 0, Math.PI * 2);\n this.__ctx.fill();\n if (stroke) {\n this.__ctx.stroke();\n }\n this.__ctx.closePath();\n this.__ctx.restore();\n }\n /**\n * Save the current state of the canvas to the stack (transforms and opacity)\n */\n save() {\n this.__ctx.save();\n this._state.save();\n }\n /**\n * Restore the state of the canvas from the stack\n */\n restore() {\n this.__ctx.restore();\n this._state.restore();\n }\n /**\n * Translate the origin of the context by an x and y\n * @param x\n * @param y\n */\n translate(x, y) {\n this.__ctx.translate(this.snapToPixel ? ~~(x + pixelSnapEpsilon) : x, this.snapToPixel ? ~~(y + pixelSnapEpsilon) : y);\n }\n /**\n * Rotate the context about the current origin\n */\n rotate(angle) {\n this.__ctx.rotate(angle);\n }\n /**\n * Scale the context by an x and y factor\n * @param x\n * @param y\n */\n scale(x, y) {\n this.__ctx.scale(x, y);\n }\n getTransform() {\n throw new Error('Not implemented');\n }\n multiply(_m) {\n this.__ctx.setTransform(this.__ctx.getTransform().multiply(_m.toDOMMatrix()));\n }\n addPostProcessor(_postprocessor) {\n // pass\n }\n removePostProcessor(_postprocessor) {\n // pass\n }\n clearPostProcessors() {\n // pass\n }\n updatePostProcessors(elapsed) {\n // pass\n }\n beginDrawLifecycle() {\n // pass\n }\n endDrawLifecycle() {\n // pass\n }\n set material(material) {\n this._state.current.material = material;\n }\n get material() {\n return this._state.current.material;\n }\n createMaterial(options) {\n // pass\n return null;\n }\n clear() {\n // Clear frame\n this.__ctx.clearRect(0, 0, this.width, this.height);\n this.__ctx.fillStyle = this.backgroundColor.toString();\n this.__ctx.fillRect(0, 0, this.width, this.height);\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_3__.GraphicsDiagnostics.clear();\n }\n /**\n * Flushes the batched draw calls to the screen\n */\n flush() {\n // pass\n }\n dispose() {\n this.__ctx = undefined;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\":\n/*!***********************************************************!*\\\n !*** ./Graphics/Context/ExcaliburGraphicsContextWebGL.ts ***!\n \\***********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ExcaliburGraphicsContextWebGL: () => (/* binding */ ExcaliburGraphicsContextWebGL),\n/* harmony export */ pixelSnapEpsilon: () => (/* binding */ pixelSnapEpsilon)\n/* harmony export */ });\n/* harmony import */ var _Math_matrix__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../Math/matrix */ \"./Math/matrix.ts\");\n/* harmony import */ var _transform_stack__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./transform-stack */ \"./Graphics/Context/transform-stack.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Color */ \"./Color.ts\");\n/* harmony import */ var _state_stack__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./state-stack */ \"./Graphics/Context/state-stack.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _debug_text__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./debug-text */ \"./Graphics/Context/debug-text.ts\");\n/* harmony import */ var _render_target__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./render-target */ \"./Graphics/Context/render-target.ts\");\n/* harmony import */ var _texture_loader__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./texture-loader */ \"./Graphics/Context/texture-loader.ts\");\n/* harmony import */ var _line_renderer_line_renderer__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./line-renderer/line-renderer */ \"./Graphics/Context/line-renderer/line-renderer.ts\");\n/* harmony import */ var _point_renderer_point_renderer__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./point-renderer/point-renderer */ \"./Graphics/Context/point-renderer/point-renderer.ts\");\n/* harmony import */ var _screen_pass_painter_screen_pass_painter__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./screen-pass-painter/screen-pass-painter */ \"./Graphics/Context/screen-pass-painter/screen-pass-painter.ts\");\n/* harmony import */ var _image_renderer_image_renderer__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./image-renderer/image-renderer */ \"./Graphics/Context/image-renderer/image-renderer.ts\");\n/* harmony import */ var _rectangle_renderer_rectangle_renderer__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./rectangle-renderer/rectangle-renderer */ \"./Graphics/Context/rectangle-renderer/rectangle-renderer.ts\");\n/* harmony import */ var _circle_renderer_circle_renderer__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./circle-renderer/circle-renderer */ \"./Graphics/Context/circle-renderer/circle-renderer.ts\");\n/* harmony import */ var _Util_Pool__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Util/Pool */ \"./Util/Pool.ts\");\n/* harmony import */ var _draw_call__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./draw-call */ \"./Graphics/Context/draw-call.ts\");\n/* harmony import */ var _material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./material */ \"./Graphics/Context/material.ts\");\n/* harmony import */ var _material_renderer_material_renderer__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./material-renderer/material-renderer */ \"./Graphics/Context/material-renderer/material-renderer.ts\");\n/* harmony import */ var _shader__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _particle_renderer_particle_renderer__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./particle-renderer/particle-renderer */ \"./Graphics/Context/particle-renderer/particle-renderer.ts\");\n/* harmony import */ var _image_renderer_v2_image_renderer_v2__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./image-renderer-v2/image-renderer-v2 */ \"./Graphics/Context/image-renderer-v2/image-renderer-v2.ts\");\n/* harmony import */ var _Flags__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Flags */ \"./Flags.ts\");\n\n\n\n\n\n\n\n\n\n// renderers\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst pixelSnapEpsilon = 0.0001;\nclass ExcaliburGraphicsContextWebGLDebug {\n constructor(_webglCtx) {\n this._webglCtx = _webglCtx;\n this._debugText = new _debug_text__WEBPACK_IMPORTED_MODULE_0__.DebugText();\n }\n /**\n * Draw a debugging rectangle to the context\n * @param x\n * @param y\n * @param width\n * @param height\n */\n drawRect(x, y, width, height, rectOptions = { color: _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Black }) {\n this.drawLine((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(x, y), (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(x + width, y), { ...rectOptions });\n this.drawLine((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(x + width, y), (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(x + width, y + height), { ...rectOptions });\n this.drawLine((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(x + width, y + height), (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(x, y + height), { ...rectOptions });\n this.drawLine((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(x, y + height), (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(x, y), { ...rectOptions });\n }\n /**\n * Draw a debugging line to the context\n * @param start\n * @param end\n * @param lineOptions\n */\n drawLine(start, end, lineOptions) {\n var _a;\n this._webglCtx.draw('ex.line', start, end, (_a = lineOptions === null || lineOptions === void 0 ? void 0 : lineOptions.color) !== null && _a !== void 0 ? _a : _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Black);\n }\n /**\n * Draw a debugging point to the context\n * @param point\n * @param pointOptions\n */\n drawPoint(point, pointOptions = { color: _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Black, size: 5 }) {\n this._webglCtx.draw('ex.point', point, pointOptions.color, pointOptions.size);\n }\n drawText(text, pos) {\n this._debugText.write(this._webglCtx, text, pos);\n }\n}\nclass ExcaliburGraphicsContextWebGL {\n get z() {\n return this._state.current.z;\n }\n set z(value) {\n this._state.current.z = value;\n }\n get opacity() {\n return this._state.current.opacity;\n }\n set opacity(value) {\n this._state.current.opacity = value;\n }\n get tint() {\n return this._state.current.tint;\n }\n set tint(color) {\n this._state.current.tint = color;\n }\n get width() {\n return this.__gl.canvas.width;\n }\n get height() {\n return this.__gl.canvas.height;\n }\n get ortho() {\n return this._ortho;\n }\n /**\n * Checks the underlying webgl implementation if the requested internal resolution is supported\n * @param dim\n */\n checkIfResolutionSupported(dim) {\n // Slight hack based on this thread https://groups.google.com/g/webgl-dev-list/c/AHONvz3oQTo\n let supported = true;\n if (dim.width > 4096 || dim.height > 4096) {\n supported = false;\n }\n return supported;\n }\n constructor(options) {\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_3__.Logger.getInstance();\n this._renderers = new Map();\n this.imageRenderer = _Flags__WEBPACK_IMPORTED_MODULE_4__.Flags.isEnabled('use-legacy-image-renderer') ? 'ex.image' : 'ex.image-v2';\n this._isDrawLifecycle = false;\n this.useDrawSorting = true;\n this._drawCallPool = new _Util_Pool__WEBPACK_IMPORTED_MODULE_5__.Pool(() => new _draw_call__WEBPACK_IMPORTED_MODULE_6__.DrawCall(), undefined, 4000);\n this._drawCallIndex = 0;\n this._drawCalls = new Array(4000).fill(null);\n // Postprocessing is a tuple with 2 render targets, these are flip-flopped during the postprocessing process\n this._postProcessTargets = [];\n this._postprocessors = [];\n this._transform = new _transform_stack__WEBPACK_IMPORTED_MODULE_7__.TransformStack();\n this._state = new _state_stack__WEBPACK_IMPORTED_MODULE_8__.StateStack();\n /**\n * Snaps the drawing x/y coordinate to the nearest whole pixel\n */\n this.snapToPixel = false;\n /**\n * Native context smoothing\n */\n this.smoothing = false;\n /**\n * Whether the pixel art sampler is enabled for smooth sub pixel anti-aliasing\n */\n this.pixelArtSampler = false;\n /**\n * UV padding in pixels to use in internal image rendering to prevent texture bleed\n *\n */\n this.uvPadding = 0.01;\n this.backgroundColor = _Color__WEBPACK_IMPORTED_MODULE_1__.Color.ExcaliburBlue;\n this.multiSampleAntialiasing = true;\n this.transparency = true;\n this._isContextLost = false;\n this._disposed = false;\n this._imageToWidth = new Map();\n this._imageToHeight = new Map();\n this.debug = new ExcaliburGraphicsContextWebGLDebug(this);\n this._totalPostProcessorTime = 0;\n const { canvasElement, context, enableTransparency, antialiasing, uvPadding, multiSampleAntialiasing, pixelArtSampler, powerPreference, snapToPixel, backgroundColor, useDrawSorting, garbageCollector, handleContextLost, handleContextRestored } = options;\n this.__gl =\n context !== null && context !== void 0 ? context : canvasElement.getContext('webgl2', {\n antialias: antialiasing !== null && antialiasing !== void 0 ? antialiasing : this.smoothing,\n premultipliedAlpha: false,\n alpha: enableTransparency !== null && enableTransparency !== void 0 ? enableTransparency : this.transparency,\n depth: false,\n powerPreference: powerPreference !== null && powerPreference !== void 0 ? powerPreference : 'high-performance'\n });\n if (!this.__gl) {\n throw Error('Failed to retrieve webgl context from browser');\n }\n if (handleContextLost) {\n this.__gl.canvas.addEventListener('webglcontextlost', handleContextLost, false);\n }\n if (handleContextRestored) {\n this.__gl.canvas.addEventListener('webglcontextrestored', handleContextRestored, false);\n }\n this.__gl.canvas.addEventListener('webglcontextlost', () => {\n this._isContextLost = true;\n });\n this.__gl.canvas.addEventListener('webglcontextrestored', () => {\n this._isContextLost = false;\n });\n this.textureLoader = new _texture_loader__WEBPACK_IMPORTED_MODULE_9__.TextureLoader(this.__gl, garbageCollector);\n this.snapToPixel = snapToPixel !== null && snapToPixel !== void 0 ? snapToPixel : this.snapToPixel;\n this.smoothing = antialiasing !== null && antialiasing !== void 0 ? antialiasing : this.smoothing;\n this.transparency = enableTransparency !== null && enableTransparency !== void 0 ? enableTransparency : this.transparency;\n this.pixelArtSampler = pixelArtSampler !== null && pixelArtSampler !== void 0 ? pixelArtSampler : this.pixelArtSampler;\n this.uvPadding = uvPadding !== null && uvPadding !== void 0 ? uvPadding : this.uvPadding;\n this.multiSampleAntialiasing = typeof multiSampleAntialiasing === 'boolean' ? multiSampleAntialiasing : this.multiSampleAntialiasing;\n this.samples = typeof multiSampleAntialiasing === 'object' ? multiSampleAntialiasing.samples : undefined;\n this.backgroundColor = backgroundColor !== null && backgroundColor !== void 0 ? backgroundColor : this.backgroundColor;\n this.useDrawSorting = useDrawSorting !== null && useDrawSorting !== void 0 ? useDrawSorting : this.useDrawSorting;\n this._drawCallPool.disableWarnings = true;\n this._drawCallPool.preallocate();\n this._init();\n }\n dispose() {\n if (!this._disposed) {\n this._disposed = true;\n this.textureLoader.dispose();\n for (const renderer of this._renderers.values()) {\n renderer.dispose();\n }\n this._renderers.clear();\n this._drawCallPool.dispose();\n this._drawCalls.length = 0;\n this.__gl = null;\n }\n }\n _init() {\n const gl = this.__gl;\n // Setup viewport and view matrix\n this._ortho = _Math_matrix__WEBPACK_IMPORTED_MODULE_10__.Matrix.ortho(0, gl.canvas.width, gl.canvas.height, 0, 400, -400);\n gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);\n // Clear background\n gl.clearColor(this.backgroundColor.r / 255, this.backgroundColor.g / 255, this.backgroundColor.b / 255, this.backgroundColor.a);\n gl.clear(gl.COLOR_BUFFER_BIT);\n // Enable alpha blending\n // https://www.realtimerendering.com/blog/gpus-prefer-premultiplication/\n gl.enable(gl.BLEND);\n gl.blendEquation(gl.FUNC_ADD);\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n gl.blendEquationSeparate(gl.FUNC_ADD, gl.FUNC_ADD);\n gl.blendFuncSeparate(gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n gl.depthMask(false);\n // Setup builtin renderers\n this.register(new _image_renderer_image_renderer__WEBPACK_IMPORTED_MODULE_11__.ImageRenderer({\n uvPadding: this.uvPadding,\n pixelArtSampler: this.pixelArtSampler\n }));\n this.register(new _material_renderer_material_renderer__WEBPACK_IMPORTED_MODULE_12__.MaterialRenderer());\n this.register(new _rectangle_renderer_rectangle_renderer__WEBPACK_IMPORTED_MODULE_13__.RectangleRenderer());\n this.register(new _circle_renderer_circle_renderer__WEBPACK_IMPORTED_MODULE_14__.CircleRenderer());\n this.register(new _point_renderer_point_renderer__WEBPACK_IMPORTED_MODULE_15__.PointRenderer());\n this.register(new _line_renderer_line_renderer__WEBPACK_IMPORTED_MODULE_16__.LineRenderer());\n this.register(new _particle_renderer_particle_renderer__WEBPACK_IMPORTED_MODULE_17__.ParticleRenderer());\n this.register(new _image_renderer_v2_image_renderer_v2__WEBPACK_IMPORTED_MODULE_18__.ImageRendererV2({\n uvPadding: this.uvPadding,\n pixelArtSampler: this.pixelArtSampler\n }));\n this.materialScreenTexture = gl.createTexture();\n if (!this.materialScreenTexture) {\n throw new Error('Could not create screen texture!');\n }\n gl.bindTexture(gl.TEXTURE_2D, this.materialScreenTexture);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT);\n gl.bindTexture(gl.TEXTURE_2D, null);\n this._screenRenderer = new _screen_pass_painter_screen_pass_painter__WEBPACK_IMPORTED_MODULE_19__.ScreenPassPainter(gl);\n this._renderTarget = new _render_target__WEBPACK_IMPORTED_MODULE_20__.RenderTarget({\n gl,\n transparency: this.transparency,\n width: gl.canvas.width,\n height: gl.canvas.height\n });\n this._postProcessTargets = [\n new _render_target__WEBPACK_IMPORTED_MODULE_20__.RenderTarget({\n gl,\n transparency: this.transparency,\n width: gl.canvas.width,\n height: gl.canvas.height\n }),\n new _render_target__WEBPACK_IMPORTED_MODULE_20__.RenderTarget({\n gl,\n transparency: this.transparency,\n width: gl.canvas.width,\n height: gl.canvas.height\n })\n ];\n this._msaaTarget = new _render_target__WEBPACK_IMPORTED_MODULE_20__.RenderTarget({\n gl,\n transparency: this.transparency,\n width: gl.canvas.width,\n height: gl.canvas.height,\n antialias: this.multiSampleAntialiasing,\n samples: this.samples\n });\n }\n register(renderer) {\n this._renderers.set(renderer.type, renderer);\n renderer.initialize(this.__gl, this);\n }\n get(rendererName) {\n return this._renderers.get(rendererName);\n }\n _isCurrentRenderer(renderer) {\n if (!this._currentRenderer || this._currentRenderer === renderer) {\n return true;\n }\n return false;\n }\n beginDrawLifecycle() {\n this._isDrawLifecycle = true;\n }\n endDrawLifecycle() {\n this._isDrawLifecycle = false;\n }\n draw(rendererName, ...args) {\n if (true) {\n if (args.length > 9) {\n throw new Error('Only 10 or less renderer arguments are supported!;');\n }\n }\n if (!this._isDrawLifecycle) {\n this._logger.warnOnce(`Attempting to draw outside the the drawing lifecycle (preDraw/postDraw) is not supported and is a source of bugs/errors.\\n` +\n `If you want to do custom drawing, use Actor.graphics, or any onPreDraw or onPostDraw handler.`);\n }\n if (this._isContextLost) {\n this._logger.errorOnce(`Unable to draw ${rendererName}, the webgl context is lost`);\n return;\n }\n const renderer = this._renderers.get(rendererName);\n if (renderer) {\n if (this.useDrawSorting) {\n const drawCall = this._drawCallPool.get();\n drawCall.z = this._state.current.z;\n drawCall.priority = renderer.priority;\n drawCall.renderer = rendererName;\n this.getTransform().clone(drawCall.transform);\n drawCall.state.z = this._state.current.z;\n drawCall.state.opacity = this._state.current.opacity;\n drawCall.state.tint = this._state.current.tint;\n drawCall.state.material = this._state.current.material;\n drawCall.args[0] = args[0];\n drawCall.args[1] = args[1];\n drawCall.args[2] = args[2];\n drawCall.args[3] = args[3];\n drawCall.args[4] = args[4];\n drawCall.args[5] = args[5];\n drawCall.args[6] = args[6];\n drawCall.args[7] = args[7];\n drawCall.args[8] = args[8];\n drawCall.args[9] = args[9];\n this._drawCalls[this._drawCallIndex++] = drawCall;\n }\n else {\n // Set the current renderer if not defined\n if (!this._currentRenderer) {\n this._currentRenderer = renderer;\n }\n if (!this._isCurrentRenderer(renderer)) {\n // switching graphics means we must flush the previous\n this._currentRenderer.flush();\n }\n // If we are still using the same renderer we can add to the current batch\n renderer.draw(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9]);\n this._currentRenderer = renderer;\n }\n }\n else {\n throw Error(`No renderer with name ${rendererName} has been registered`);\n }\n }\n resetTransform() {\n this._transform.reset();\n }\n updateViewport(resolution) {\n const gl = this.__gl;\n this._ortho = this._ortho = _Math_matrix__WEBPACK_IMPORTED_MODULE_10__.Matrix.ortho(0, resolution.width, resolution.height, 0, 400, -400);\n this._renderTarget.setResolution(gl.canvas.width, gl.canvas.height);\n this._msaaTarget.setResolution(gl.canvas.width, gl.canvas.height);\n this._postProcessTargets[0].setResolution(gl.canvas.width, gl.canvas.height);\n this._postProcessTargets[1].setResolution(gl.canvas.width, gl.canvas.height);\n }\n _getImageWidth(image) {\n let maybeWidth = this._imageToWidth.get(image);\n if (maybeWidth === undefined) {\n maybeWidth = image.width;\n this._imageToWidth.set(image, maybeWidth);\n }\n return maybeWidth;\n }\n _getImageHeight(image) {\n let maybeHeight = this._imageToHeight.get(image);\n if (maybeHeight === undefined) {\n maybeHeight = image.height;\n this._imageToHeight.set(image, maybeHeight);\n }\n return maybeHeight;\n }\n drawImage(image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight) {\n if (swidth === 0 || sheight === 0) {\n return; // zero dimension dest exit early\n }\n else if (dwidth === 0 || dheight === 0) {\n return; // zero dimension dest exit early\n }\n else if (this._getImageWidth(image) === 0 || this._getImageHeight(image) === 0) {\n return; // zero dimension source exit early\n }\n if (!image) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_3__.Logger.getInstance().warn('Cannot draw a null or undefined image');\n // tslint:disable-next-line: no-console\n if (console.trace) {\n // tslint:disable-next-line: no-console\n console.trace();\n }\n return;\n }\n if (this._state.current.material) {\n this.draw('ex.material', image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight);\n }\n else {\n if (this.imageRenderer === 'ex.image') {\n this.draw(this.imageRenderer, image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight);\n }\n else {\n this.draw(this.imageRenderer, image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight);\n }\n }\n }\n drawLine(start, end, color, thickness = 1) {\n this.draw('ex.rectangle', start, end, color, thickness);\n }\n drawRectangle(pos, width, height, color, stroke, strokeThickness) {\n this.draw('ex.rectangle', pos, width, height, color, stroke, strokeThickness);\n }\n drawCircle(pos, radius, color, stroke, thickness) {\n this.draw('ex.circle', pos, radius, color, stroke, thickness);\n }\n save() {\n this._transform.save();\n this._state.save();\n }\n restore() {\n this._transform.restore();\n this._state.restore();\n }\n translate(x, y) {\n this._transform.translate(this.snapToPixel ? ~~(x + pixelSnapEpsilon) : x, this.snapToPixel ? ~~(y + pixelSnapEpsilon) : y);\n }\n rotate(angle) {\n this._transform.rotate(angle);\n }\n scale(x, y) {\n this._transform.scale(x, y);\n }\n transform(matrix) {\n this._transform.current = matrix;\n }\n getTransform() {\n return this._transform.current;\n }\n multiply(m) {\n this._transform.current.multiply(m, this._transform.current);\n }\n addPostProcessor(postprocessor) {\n this._postprocessors.push(postprocessor);\n postprocessor.initialize(this.__gl);\n }\n removePostProcessor(postprocessor) {\n const index = this._postprocessors.indexOf(postprocessor);\n if (index !== -1) {\n this._postprocessors.splice(index, 1);\n }\n }\n clearPostProcessors() {\n this._postprocessors.length = 0;\n }\n updatePostProcessors(elapsed) {\n for (const postprocessor of this._postprocessors) {\n const shader = postprocessor.getShader();\n shader.use();\n const uniforms = shader.getUniforms();\n this._totalPostProcessorTime += elapsed;\n if (uniforms.find((u) => u.name === 'u_time_ms')) {\n shader.setUniformFloat('u_time_ms', this._totalPostProcessorTime);\n }\n if (uniforms.find((u) => u.name === 'u_elapsed_ms')) {\n shader.setUniformFloat('u_elapsed_ms', elapsed);\n }\n if (uniforms.find((u) => u.name === 'u_resolution')) {\n shader.setUniformFloatVector('u_resolution', (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(this.width, this.height));\n }\n if (postprocessor.onUpdate) {\n postprocessor.onUpdate(elapsed);\n }\n }\n }\n set material(material) {\n this._state.current.material = material;\n }\n get material() {\n return this._state.current.material;\n }\n /**\n * Creates and initializes the material which compiles the internal shader\n * @param options\n * @returns Material\n */\n createMaterial(options) {\n const material = new _material__WEBPACK_IMPORTED_MODULE_21__.Material({ ...options, graphicsContext: this });\n return material;\n }\n createShader(options) {\n const gl = this.__gl;\n const { vertexSource, fragmentSource } = options;\n const shader = new _shader__WEBPACK_IMPORTED_MODULE_22__.Shader({\n gl,\n vertexSource,\n fragmentSource\n });\n shader.compile();\n return shader;\n }\n clear() {\n const gl = this.__gl;\n const currentTarget = this.multiSampleAntialiasing ? this._msaaTarget : this._renderTarget;\n currentTarget.use();\n gl.clearColor(this.backgroundColor.r / 255, this.backgroundColor.g / 255, this.backgroundColor.b / 255, this.backgroundColor.a);\n // Clear the context with the newly set color. This is\n // the function call that actually does the drawing.\n gl.clear(gl.COLOR_BUFFER_BIT);\n }\n /**\n * Flushes all batched rendering to the screen\n */\n flush() {\n var _a;\n if (this._isContextLost) {\n this._logger.errorOnce(`Unable to flush the webgl context is lost`);\n return;\n }\n // render target captures all draws and redirects to the render target\n let currentTarget = this.multiSampleAntialiasing ? this._msaaTarget : this._renderTarget;\n currentTarget.use();\n if (this.useDrawSorting) {\n // null out unused draw calls\n for (let i = this._drawCallIndex; i < this._drawCalls.length; i++) {\n this._drawCalls[i] = null;\n }\n // sort draw calls\n // Find the original order of the first instance of the draw call\n const originalSort = new Map();\n for (const [name] of this._renderers) {\n let firstIndex = 0;\n for (firstIndex = 0; firstIndex < this._drawCallIndex; firstIndex++) {\n if (this._drawCalls[firstIndex].renderer === name) {\n break;\n }\n }\n originalSort.set(name, firstIndex);\n }\n this._drawCalls.sort((a, b) => {\n if (a === null || b === null) {\n return 0;\n }\n const zIndex = a.z - b.z;\n const originalSortOrder = originalSort.get(a.renderer) - originalSort.get(b.renderer);\n const priority = a.priority - b.priority;\n if (zIndex === 0) {\n // sort by z first\n if (priority === 0) {\n // sort by priority\n return originalSortOrder; // use the original order to inform draw call packing to maximally preserve painter order\n }\n return priority;\n }\n return zIndex;\n });\n const oldTransform = this._transform.current;\n const oldState = this._state.current;\n if (this._drawCalls.length && this._drawCallIndex) {\n let currentRendererName = this._drawCalls[0].renderer;\n let currentRenderer = this._renderers.get(currentRendererName);\n for (let i = 0; i < this._drawCallIndex; i++) {\n // hydrate the state for renderers\n this._transform.current = this._drawCalls[i].transform;\n this._state.current = this._drawCalls[i].state;\n if (this._drawCalls[i].renderer !== currentRendererName) {\n // switching graphics renderer means we must flush the previous\n currentRenderer.flush();\n currentRendererName = this._drawCalls[i].renderer;\n currentRenderer = this._renderers.get(currentRendererName);\n }\n // ! hack to grab screen texture before materials run because they might want it\n if (currentRenderer instanceof _material_renderer_material_renderer__WEBPACK_IMPORTED_MODULE_12__.MaterialRenderer && ((_a = this.material) === null || _a === void 0 ? void 0 : _a.isUsingScreenTexture)) {\n currentTarget.copyToTexture(this.materialScreenTexture);\n currentTarget.use();\n }\n // If we are still using the same renderer we can add to the current batch\n currentRenderer.draw(...this._drawCalls[i].args);\n }\n if (currentRenderer.hasPendingDraws()) {\n currentRenderer.flush();\n }\n }\n // reset state\n this._transform.current = oldTransform;\n this._state.current = oldState;\n // reclaim draw calls\n this._drawCallPool.done();\n this._drawCallIndex = 0;\n this._imageToHeight.clear();\n this._imageToWidth.clear();\n }\n else {\n // This is the final flush at the moment to draw any leftover pending draw\n for (const renderer of this._renderers.values()) {\n if (renderer.hasPendingDraws()) {\n renderer.flush();\n }\n }\n }\n currentTarget.disable();\n // post process step\n if (this._postprocessors.length > 0) {\n const source = currentTarget.toRenderSource();\n source.use();\n }\n // flip flop render targets for post processing\n for (let i = 0; i < this._postprocessors.length; i++) {\n currentTarget = this._postProcessTargets[i % 2];\n this._postProcessTargets[i % 2].use();\n this._screenRenderer.renderWithPostProcessor(this._postprocessors[i]);\n this._postProcessTargets[i % 2].toRenderSource().use();\n }\n // Final blit to the screen\n currentTarget.blitToScreen();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/circle-renderer/circle-renderer.ts\":\n/*!*************************************************************!*\\\n !*** ./Graphics/Context/circle-renderer/circle-renderer.ts ***!\n \\*************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CircleRenderer: () => (/* binding */ CircleRenderer)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../Color */ \"./Color.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n/* harmony import */ var _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _quad_index_buffer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../quad-index-buffer */ \"./Graphics/Context/quad-index-buffer.ts\");\n/* harmony import */ var _shader__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _vertex_buffer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _vertex_layout__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../vertex-layout */ \"./Graphics/Context/vertex-layout.ts\");\n/* harmony import */ var _circle_renderer_frag_glsl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./circle-renderer.frag.glsl */ \"./Graphics/Context/circle-renderer/circle-renderer.frag.glsl\");\n/* harmony import */ var _circle_renderer_vert_glsl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./circle-renderer.vert.glsl */ \"./Graphics/Context/circle-renderer/circle-renderer.vert.glsl\");\n\n\n\n\n\n\n\n\n\n\nclass CircleRenderer {\n constructor() {\n this.type = 'ex.circle';\n this.priority = 0;\n this._maxCircles = 10922; // max(uint16) / 6 verts\n this._circleCount = 0;\n this._vertexIndex = 0;\n }\n initialize(gl, context) {\n this._gl = gl;\n this._context = context;\n this._shader = new _shader__WEBPACK_IMPORTED_MODULE_0__.Shader({\n gl,\n fragmentSource: _circle_renderer_frag_glsl__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n vertexSource: _circle_renderer_vert_glsl__WEBPACK_IMPORTED_MODULE_2__[\"default\"]\n });\n this._shader.compile();\n // setup uniforms\n this._shader.use();\n this._shader.setUniformMatrix('u_matrix', context.ortho);\n this._buffer = new _vertex_buffer__WEBPACK_IMPORTED_MODULE_3__.VertexBuffer({\n gl,\n size: 14 * 4 * this._maxCircles,\n type: 'dynamic'\n });\n this._layout = new _vertex_layout__WEBPACK_IMPORTED_MODULE_4__.VertexLayout({\n gl,\n shader: this._shader,\n vertexBuffer: this._buffer,\n attributes: [\n ['a_position', 2],\n ['a_uv', 2],\n ['a_opacity', 1],\n ['a_color', 4],\n ['a_strokeColor', 4],\n ['a_strokeThickness', 1]\n ]\n });\n this._quads = new _quad_index_buffer__WEBPACK_IMPORTED_MODULE_5__.QuadIndexBuffer(gl, this._maxCircles, true);\n }\n dispose() {\n this._buffer.dispose();\n this._quads.dispose();\n this._shader.dispose();\n this._context = null;\n this._gl = null;\n }\n _isFull() {\n if (this._circleCount >= this._maxCircles) {\n return true;\n }\n return false;\n }\n draw(pos, radius, color, stroke = _Color__WEBPACK_IMPORTED_MODULE_6__.Color.Transparent, strokeThickness = 0) {\n if (this._isFull()) {\n this.flush();\n }\n this._circleCount++;\n // transform based on current context\n const transform = this._context.getTransform();\n const opacity = this._context.opacity;\n const snapToPixel = this._context.snapToPixel;\n const topLeft = transform.multiply(pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_7__.vec)(-radius, -radius)));\n const topRight = transform.multiply(pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_7__.vec)(radius, -radius)));\n const bottomRight = transform.multiply(pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_7__.vec)(radius, radius)));\n const bottomLeft = transform.multiply(pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_7__.vec)(-radius, radius)));\n if (snapToPixel) {\n topLeft.x = ~~(topLeft.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n topLeft.y = ~~(topLeft.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n topRight.x = ~~(topRight.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n topRight.y = ~~(topRight.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n bottomLeft.x = ~~(bottomLeft.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n bottomLeft.y = ~~(bottomLeft.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n bottomRight.x = ~~(bottomRight.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n bottomRight.y = ~~(bottomRight.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n }\n // TODO UV could be static vertex buffer\n const uvx0 = 0;\n const uvy0 = 0;\n const uvx1 = 1;\n const uvy1 = 1;\n // update data\n const vertexBuffer = this._layout.vertexBuffer.bufferData;\n // (0, 0) - 0\n vertexBuffer[this._vertexIndex++] = topLeft.x;\n vertexBuffer[this._vertexIndex++] = topLeft.y;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness / radius;\n // (0, 1) - 1\n vertexBuffer[this._vertexIndex++] = bottomLeft.x;\n vertexBuffer[this._vertexIndex++] = bottomLeft.y;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness / radius;\n // (1, 0) - 2\n vertexBuffer[this._vertexIndex++] = topRight.x;\n vertexBuffer[this._vertexIndex++] = topRight.y;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness / radius;\n // (1, 1) - 3\n vertexBuffer[this._vertexIndex++] = bottomRight.x;\n vertexBuffer[this._vertexIndex++] = bottomRight.y;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness / radius;\n }\n hasPendingDraws() {\n return this._circleCount !== 0;\n }\n flush() {\n // nothing to draw early exit\n if (this._circleCount === 0) {\n return;\n }\n const gl = this._gl;\n // Bind the shader\n this._shader.use();\n // Bind the memory layout and upload data\n this._layout.use(true);\n // Update ortho matrix uniform\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n // Bind index buffer\n this._quads.bind();\n // Draw all the quads\n gl.drawElements(gl.TRIANGLES, this._circleCount * 6, this._quads.bufferGlType, 0);\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_9__.GraphicsDiagnostics.DrawnImagesCount += this._circleCount;\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_9__.GraphicsDiagnostics.DrawCallCount++;\n // Reset\n this._circleCount = 0;\n this._vertexIndex = 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/debug-text.ts\":\n/*!****************************************!*\\\n !*** ./Graphics/Context/debug-text.ts ***!\n \\****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DebugText: () => (/* binding */ DebugText)\n/* harmony export */ });\n/* harmony import */ var _ImageSource__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ImageSource */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _SpriteFont__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../SpriteFont */ \"./Graphics/SpriteFont.ts\");\n/* harmony import */ var _SpriteSheet__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../SpriteSheet */ \"./Graphics/SpriteSheet.ts\");\n/* harmony import */ var _debug_font_png__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./debug-font.png */ \"./Graphics/Context/debug-font.png\");\n\n\n\n\n/**\n * Internal debug text helper\n */\nclass DebugText {\n constructor() {\n /**\n * base64 font\n */\n this.fontSheet = _debug_font_png__WEBPACK_IMPORTED_MODULE_0__[\"default\"];\n this.size = 16;\n // We fire and forget, we don't care if it's loaded or not\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.load();\n }\n load() {\n this._imageSource = new _ImageSource__WEBPACK_IMPORTED_MODULE_1__.ImageSource(this.fontSheet);\n return this._imageSource.load().then(() => {\n this._spriteSheet = _SpriteSheet__WEBPACK_IMPORTED_MODULE_2__.SpriteSheet.fromImageSource({\n image: this._imageSource,\n grid: {\n rows: 4,\n columns: 16,\n spriteWidth: 16,\n spriteHeight: 16\n }\n });\n this._spriteFont = new _SpriteFont__WEBPACK_IMPORTED_MODULE_3__.SpriteFont({\n alphabet: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ,!\\'&.\"?-()+# ',\n caseInsensitive: true,\n spriteSheet: this._spriteSheet,\n spacing: -6\n });\n });\n }\n /**\n * Writes debug text using the built in sprint font\n * @param ctx\n * @param text\n * @param pos\n */\n write(ctx, text, pos) {\n if (this._imageSource.isLoaded()) {\n this._spriteFont.render(ctx, text, null, pos.x, pos.y);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/draw-call.ts\":\n/*!***************************************!*\\\n !*** ./Graphics/Context/draw-call.ts ***!\n \\***************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DrawCall: () => (/* binding */ DrawCall)\n/* harmony export */ });\n/* harmony import */ var _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/affine-matrix */ \"./Math/affine-matrix.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Color */ \"./Color.ts\");\n\n\nclass DrawCall {\n constructor() {\n this.z = 0;\n this.priority = 0;\n this.renderer = '';\n this.transform = _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_0__.AffineMatrix.identity();\n this.state = {\n z: 0,\n opacity: 1,\n tint: _Color__WEBPACK_IMPORTED_MODULE_1__.Color.White,\n material: null\n };\n this.args = new Array(10);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/image-renderer-v2/image-renderer-v2.ts\":\n/*!*****************************************************************!*\\\n !*** ./Graphics/Context/image-renderer-v2/image-renderer-v2.ts ***!\n \\*****************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ImageRendererV2: () => (/* binding */ ImageRendererV2)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Color */ \"./Color.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n/* harmony import */ var _ImageSource__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../ImageSource */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../Wrapping */ \"./Graphics/Wrapping.ts\");\n/* harmony import */ var _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _shader__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _vertex_buffer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _webgl_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../webgl-util */ \"./Graphics/Context/webgl-util.ts\");\n/* harmony import */ var _image_renderer_v2_frag_glsl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./image-renderer-v2.frag.glsl */ \"./Graphics/Context/image-renderer-v2/image-renderer-v2.frag.glsl\");\n/* harmony import */ var _image_renderer_v2_vert_glsl__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./image-renderer-v2.vert.glsl */ \"./Graphics/Context/image-renderer-v2/image-renderer-v2.vert.glsl\");\n// import { Color } from '../../../Color';\n// import { parseImageFiltering } from '../../Filtering';\n\n\n\n\n\n\n\n\n\n\n\nclass ImageRendererV2 {\n constructor(options) {\n this.type = 'ex.image-v2';\n this.priority = 0;\n // TODO this could be bigger probably\n this._maxImages = 20000; // max(uint16) / 6 verts\n this._maxTextures = 0;\n this._components = 2 + 2 + 2 + 2 + 1 + 2 + 2 + 1 + 2 + 2 + 4;\n // Per flush vars\n this._imageCount = 0;\n this._textures = [];\n this._textureIndex = 0;\n this._textureToIndex = new Map();\n this._images = new Set();\n this._vertexIndex = 0;\n this._imageToWidth = new Map();\n this._imageToHeight = new Map();\n this._view = [0, 0, 0, 0];\n this._dest = [0, 0];\n this._defaultTint = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.White;\n this.pixelArtSampler = options.pixelArtSampler;\n this.uvPadding = options.uvPadding;\n }\n initialize(gl, context) {\n this._gl = gl;\n this._context = context;\n // Transform shader source\n const maxTexture = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS);\n const maxComplexity = (0,_webgl_util__WEBPACK_IMPORTED_MODULE_1__.getMaxShaderComplexity)(gl, maxTexture);\n this._maxTextures = Math.min(maxTexture, maxComplexity);\n const transformedFrag = this._transformFragmentSource(_image_renderer_v2_frag_glsl__WEBPACK_IMPORTED_MODULE_2__[\"default\"], this._maxTextures);\n // Compile shader\n this._shader = new _shader__WEBPACK_IMPORTED_MODULE_3__.Shader({\n gl,\n fragmentSource: transformedFrag,\n vertexSource: _image_renderer_v2_vert_glsl__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n });\n this._shader.compile();\n // setup uniforms\n this._shader.use();\n this._shader.setUniformMatrix('u_matrix', context.ortho);\n // Initialize texture slots to [0, 1, 2, 3, 4, .... maxGPUTextures]\n this._shader.setUniformIntArray('u_textures', [...Array(this._maxTextures)].map((_, i) => i));\n this._vao = gl.createVertexArray();\n gl.bindVertexArray(this._vao);\n this._quadMesh = new Float32Array([\n // pos uv\n 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0,\n 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1\n ]);\n this._meshBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this._meshBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, this._quadMesh, gl.STATIC_DRAW);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 16, 0);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(1, 2, gl.FLOAT, false, 16, 8);\n gl.enableVertexAttribArray(1);\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n // Setup memory layout\n const components = this._components;\n this._transformData = new _vertex_buffer__WEBPACK_IMPORTED_MODULE_5__.VertexBuffer({\n gl,\n size: components * this._maxImages, // components * images\n type: 'dynamic'\n });\n this._transformData.bind();\n // attributes\n let offset = 0;\n let start = 2;\n const bytesPerFloat = 4;\n const totalSize = components * 4;\n // a_offset vec2 - 2\n gl.vertexAttribPointer(start++, 2, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(2);\n offset += 2 * bytesPerFloat;\n // a_mat_column1 vec2 - 2\n gl.vertexAttribPointer(start++, 2, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(3);\n offset += 2 * bytesPerFloat;\n // a_mat_column2 vec2 - 2\n gl.vertexAttribPointer(start++, 2, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(4);\n offset += 2 * bytesPerFloat;\n // a_mat_column3 vec2 - 2\n gl.vertexAttribPointer(start++, 2, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(5);\n offset += 2 * bytesPerFloat;\n // a_opacity float - 1\n gl.vertexAttribPointer(start++, 1, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(6);\n offset += 1 * bytesPerFloat;\n // a_res vec2 - 2\n gl.vertexAttribPointer(start++, 2, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(7);\n offset += 2 * bytesPerFloat;\n // a_size vec2 - 2\n gl.vertexAttribPointer(start++, 2, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(8);\n offset += 2 * bytesPerFloat;\n // a_texture_index - 1\n gl.vertexAttribPointer(start++, 1, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(9);\n offset += 1 * bytesPerFloat;\n // a_uv_min - 2\n gl.vertexAttribPointer(start++, 2, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(10);\n offset += 2 * bytesPerFloat;\n // a_uv_max - 2\n gl.vertexAttribPointer(start++, 2, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(11);\n offset += 2 * bytesPerFloat;\n // a_tint - 4\n gl.vertexAttribPointer(start++, 4, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(12);\n offset += 4 * bytesPerFloat;\n gl.vertexAttribDivisor(2, 1);\n gl.vertexAttribDivisor(3, 1);\n gl.vertexAttribDivisor(4, 1);\n gl.vertexAttribDivisor(5, 1);\n gl.vertexAttribDivisor(6, 1);\n gl.vertexAttribDivisor(7, 1);\n gl.vertexAttribDivisor(8, 1);\n gl.vertexAttribDivisor(9, 1);\n gl.vertexAttribDivisor(10, 1);\n gl.vertexAttribDivisor(11, 1);\n gl.vertexAttribDivisor(12, 1);\n gl.bindVertexArray(null);\n }\n _bindData(gl) {\n // Setup memory layout\n const components = this._components;\n this._transformData.bind();\n this._transformData.upload(components * this._imageCount);\n gl.bindVertexArray(this._vao);\n }\n dispose() {\n this._transformData.dispose();\n this._shader.dispose();\n this._textures.length = 0;\n this._context = null;\n this._gl = null;\n }\n _transformFragmentSource(source, maxTextures) {\n let newSource = source.replace('%%count%%', maxTextures.toString());\n let texturePickerBuilder = '';\n for (let i = 0; i < maxTextures; i++) {\n if (i === 0) {\n texturePickerBuilder += `if (v_texture_index <= ${i}.5) {\\n`;\n }\n else {\n texturePickerBuilder += ` else if (v_texture_index <= ${i}.5) {\\n`;\n }\n texturePickerBuilder += ` color = texture(u_textures[${i}], uv);\\n`;\n texturePickerBuilder += ` }\\n`;\n }\n newSource = newSource.replace('%%texture_picker%%', texturePickerBuilder);\n return newSource;\n }\n _addImageAsTexture(image) {\n if (this._images.has(image)) {\n return;\n }\n const maybeFiltering = image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_6__.ImageSourceAttributeConstants.Filtering);\n const filtering = maybeFiltering ? (0,_Filtering__WEBPACK_IMPORTED_MODULE_7__.parseImageFiltering)(maybeFiltering) : undefined;\n const wrapX = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_8__.parseImageWrapping)(image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_6__.ImageSourceAttributeConstants.WrappingX));\n const wrapY = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_8__.parseImageWrapping)(image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_6__.ImageSourceAttributeConstants.WrappingY));\n const force = image.getAttribute('forceUpload') === 'true' ? true : false;\n const texture = this._context.textureLoader.load(image, {\n filtering,\n wrapping: { x: wrapX, y: wrapY }\n }, force);\n // remove force attribute after upload\n image.removeAttribute('forceUpload');\n if (this._textures.indexOf(texture) === -1) {\n this._textures.push(texture);\n this._textureToIndex.set(texture, this._textureIndex++);\n this._images.add(image);\n }\n }\n _bindTextures(gl) {\n // Bind textures in the correct order\n const max = Math.min(this._textureIndex, this._maxTextures);\n for (let i = 0; i < max; i++) {\n gl.activeTexture(gl.TEXTURE0 + i);\n gl.bindTexture(gl.TEXTURE_2D, this._textures[i] || this._textures[0]);\n }\n }\n _getTextureIdForImage(image) {\n var _a;\n if (image) {\n const maybeTexture = this._context.textureLoader.get(image);\n return (_a = this._textureToIndex.get(maybeTexture)) !== null && _a !== void 0 ? _a : -1; //this._textures.indexOf(maybeTexture);\n }\n return -1;\n }\n _isFull() {\n if (this._imageCount >= this._maxImages) {\n return true;\n }\n if (this._textures.length >= this._maxTextures) {\n return true;\n }\n return false;\n }\n _getImageWidth(image) {\n let maybeWidth = this._imageToWidth.get(image);\n if (maybeWidth === undefined) {\n maybeWidth = image.width;\n this._imageToWidth.set(image, maybeWidth);\n }\n return maybeWidth;\n }\n _getImageHeight(image) {\n let maybeHeight = this._imageToHeight.get(image);\n if (maybeHeight === undefined) {\n maybeHeight = image.height;\n this._imageToHeight.set(image, maybeHeight);\n }\n return maybeHeight;\n }\n draw(image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight) {\n var _a, _b, _c, _d;\n // Force a render if the batch is full\n if (this._isFull()) {\n this.flush();\n }\n this._imageCount++;\n // This creates and uploads the texture if not already done\n this._addImageAsTexture(image);\n const maybeImageWidth = this._getImageWidth(image);\n const maybeImageHeight = this._getImageHeight(image);\n let width = maybeImageWidth || swidth || 0;\n let height = maybeImageHeight || sheight || 0;\n this._view[0] = 0;\n this._view[1] = 0;\n this._view[2] = (_a = swidth !== null && swidth !== void 0 ? swidth : maybeImageWidth) !== null && _a !== void 0 ? _a : 0;\n this._view[3] = (_b = sheight !== null && sheight !== void 0 ? sheight : maybeImageHeight) !== null && _b !== void 0 ? _b : 0;\n this._dest[0] = sx !== null && sx !== void 0 ? sx : 1;\n this._dest[1] = sy !== null && sy !== void 0 ? sy : 1;\n // If destination is specified, update view and dest\n if (dx !== undefined && dy !== undefined && dwidth !== undefined && dheight !== undefined) {\n this._view[0] = sx !== null && sx !== void 0 ? sx : 1;\n this._view[1] = sy !== null && sy !== void 0 ? sy : 1;\n this._view[2] = (_c = swidth !== null && swidth !== void 0 ? swidth : maybeImageWidth) !== null && _c !== void 0 ? _c : 0;\n this._view[3] = (_d = sheight !== null && sheight !== void 0 ? sheight : maybeImageHeight) !== null && _d !== void 0 ? _d : 0;\n this._dest[0] = dx;\n this._dest[1] = dy;\n width = dwidth;\n height = dheight;\n }\n sx = this._view[0];\n sy = this._view[1];\n const sw = this._view[2];\n const sh = this._view[3];\n // transform based on current context\n const transform = this._context.getTransform();\n const opacity = this._context.opacity;\n const snapToPixel = this._context.snapToPixel;\n if (snapToPixel) {\n this._dest[0] = ~~(this._dest[0] + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_9__.pixelSnapEpsilon);\n this._dest[1] = ~~(this._dest[1] + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_9__.pixelSnapEpsilon);\n }\n const tint = this._context.tint || this._defaultTint;\n const textureId = this._getTextureIdForImage(image);\n const imageWidth = maybeImageWidth || width;\n const imageHeight = maybeImageHeight || height;\n const uvx0 = (sx + this.uvPadding) / imageWidth;\n const uvy0 = (sy + this.uvPadding) / imageHeight;\n const uvx1 = (sx + sw - this.uvPadding) / imageWidth;\n const uvy1 = (sy + sh - this.uvPadding) / imageHeight;\n const txWidth = maybeImageWidth;\n const txHeight = maybeImageHeight;\n // update data\n const vertexBuffer = this._transformData.bufferData;\n vertexBuffer[this._vertexIndex++] = this._dest[0];\n vertexBuffer[this._vertexIndex++] = this._dest[1];\n vertexBuffer[this._vertexIndex++] = transform.data[0];\n vertexBuffer[this._vertexIndex++] = transform.data[1];\n vertexBuffer[this._vertexIndex++] = transform.data[2];\n vertexBuffer[this._vertexIndex++] = transform.data[3];\n vertexBuffer[this._vertexIndex++] = transform.data[4];\n vertexBuffer[this._vertexIndex++] = transform.data[5];\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = width;\n vertexBuffer[this._vertexIndex++] = height;\n vertexBuffer[this._vertexIndex++] = txWidth;\n vertexBuffer[this._vertexIndex++] = txHeight;\n vertexBuffer[this._vertexIndex++] = textureId;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = tint.r / 255;\n vertexBuffer[this._vertexIndex++] = tint.g / 255;\n vertexBuffer[this._vertexIndex++] = tint.b / 255;\n vertexBuffer[this._vertexIndex++] = tint.a;\n }\n hasPendingDraws() {\n return this._imageCount !== 0;\n }\n flush() {\n // nothing to draw early exit\n if (this._imageCount === 0) {\n return;\n }\n const gl = this._gl;\n // Bind the shader\n this._shader.use();\n // Bind the memory layout and upload data\n this._bindData(gl);\n // Update ortho matrix uniform\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n // Turn on pixel art aa sampler\n this._shader.setUniformBoolean('u_pixelart', this.pixelArtSampler);\n // Bind textures to\n this._bindTextures(gl);\n // Draw all the quads\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 6, this._imageCount);\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_10__.GraphicsDiagnostics.DrawnImagesCount += this._imageCount;\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_10__.GraphicsDiagnostics.DrawCallCount++;\n gl.bindVertexArray(null);\n // Reset\n this._imageCount = 0;\n this._vertexIndex = 0;\n this._textures.length = 0;\n this._textureIndex = 0;\n this._textureToIndex.clear();\n this._images.clear();\n this._imageToWidth.clear();\n this._imageToHeight.clear();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/image-renderer/image-renderer.ts\":\n/*!***********************************************************!*\\\n !*** ./Graphics/Context/image-renderer/image-renderer.ts ***!\n \\***********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ImageRenderer: () => (/* binding */ ImageRenderer)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Color */ \"./Color.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n/* harmony import */ var _ImageSource__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../ImageSource */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../Wrapping */ \"./Graphics/Wrapping.ts\");\n/* harmony import */ var _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _quad_index_buffer__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../quad-index-buffer */ \"./Graphics/Context/quad-index-buffer.ts\");\n/* harmony import */ var _shader__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _vertex_buffer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _vertex_layout__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../vertex-layout */ \"./Graphics/Context/vertex-layout.ts\");\n/* harmony import */ var _webgl_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../webgl-util */ \"./Graphics/Context/webgl-util.ts\");\n/* harmony import */ var _image_renderer_frag_glsl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./image-renderer.frag.glsl */ \"./Graphics/Context/image-renderer/image-renderer.frag.glsl\");\n/* harmony import */ var _image_renderer_vert_glsl__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./image-renderer.vert.glsl */ \"./Graphics/Context/image-renderer/image-renderer.vert.glsl\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass ImageRenderer {\n constructor(options) {\n this.type = 'ex.image';\n this.priority = 0;\n this._maxImages = 10922; // max(uint16) / 6 verts\n this._maxTextures = 0;\n // Per flush vars\n this._imageCount = 0;\n this._textures = [];\n this._textureIndex = 0;\n this._textureToIndex = new Map();\n this._images = new Set();\n this._vertexIndex = 0;\n this._imageToWidth = new Map();\n this._imageToHeight = new Map();\n this._view = [0, 0, 0, 0];\n this._dest = [0, 0];\n this._quad = [0, 0, 0, 0, 0, 0, 0, 0];\n this._defaultTint = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.White;\n this.pixelArtSampler = options.pixelArtSampler;\n this.uvPadding = options.uvPadding;\n }\n initialize(gl, context) {\n this._gl = gl;\n this._context = context;\n // Transform shader source\n // FIXME: PIXEL 6 complains `ERROR: Expression too complex.` if we use it's reported max texture units, 125 seems to work for now...\n const maxTexture = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS);\n const maxComplexity = (0,_webgl_util__WEBPACK_IMPORTED_MODULE_1__.getMaxShaderComplexity)(gl, maxTexture);\n this._maxTextures = Math.min(maxTexture, maxComplexity);\n const transformedFrag = this._transformFragmentSource(_image_renderer_frag_glsl__WEBPACK_IMPORTED_MODULE_2__[\"default\"], this._maxTextures);\n // Compile shader\n this._shader = new _shader__WEBPACK_IMPORTED_MODULE_3__.Shader({\n gl,\n fragmentSource: transformedFrag,\n vertexSource: _image_renderer_vert_glsl__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n });\n this._shader.compile();\n // setup uniforms\n this._shader.use();\n this._shader.setUniformMatrix('u_matrix', context.ortho);\n // Initialize texture slots to [0, 1, 2, 3, 4, .... maxGPUTextures]\n this._shader.setUniformIntArray('u_textures', [...Array(this._maxTextures)].map((_, i) => i));\n // Setup memory layout\n this._buffer = new _vertex_buffer__WEBPACK_IMPORTED_MODULE_5__.VertexBuffer({\n gl,\n size: 12 * 4 * this._maxImages, // 12 components * 4 verts\n type: 'dynamic'\n });\n this._layout = new _vertex_layout__WEBPACK_IMPORTED_MODULE_6__.VertexLayout({\n gl,\n shader: this._shader,\n vertexBuffer: this._buffer,\n attributes: [\n ['a_position', 2],\n ['a_opacity', 1],\n ['a_res', 2],\n ['a_texcoord', 2],\n ['a_textureIndex', 1],\n ['a_tint', 4]\n ]\n });\n // Setup index buffer\n this._quads = new _quad_index_buffer__WEBPACK_IMPORTED_MODULE_7__.QuadIndexBuffer(gl, this._maxImages, true);\n }\n dispose() {\n this._buffer.dispose();\n this._quads.dispose();\n this._shader.dispose();\n this._textures.length = 0;\n this._context = null;\n this._gl = null;\n }\n _transformFragmentSource(source, maxTextures) {\n let newSource = source.replace('%%count%%', maxTextures.toString());\n let texturePickerBuilder = '';\n for (let i = 0; i < maxTextures; i++) {\n if (i === 0) {\n texturePickerBuilder += `if (v_textureIndex <= ${i}.5) {\\n`;\n }\n else {\n texturePickerBuilder += ` else if (v_textureIndex <= ${i}.5) {\\n`;\n }\n texturePickerBuilder += ` vec2 uv = u_pixelart ? uv_iq(v_texcoord, v_res) : v_texcoord;\\n`;\n texturePickerBuilder += ` color = texture(u_textures[${i}], uv);\\n`;\n texturePickerBuilder += ` }\\n`;\n }\n newSource = newSource.replace('%%texture_picker%%', texturePickerBuilder);\n return newSource;\n }\n _addImageAsTexture(image) {\n if (this._images.has(image)) {\n return;\n }\n const maybeFiltering = image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_8__.ImageSourceAttributeConstants.Filtering);\n const filtering = maybeFiltering ? (0,_Filtering__WEBPACK_IMPORTED_MODULE_9__.parseImageFiltering)(maybeFiltering) : undefined;\n const wrapX = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_10__.parseImageWrapping)(image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_8__.ImageSourceAttributeConstants.WrappingX));\n const wrapY = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_10__.parseImageWrapping)(image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_8__.ImageSourceAttributeConstants.WrappingY));\n const force = image.getAttribute('forceUpload') === 'true' ? true : false;\n const texture = this._context.textureLoader.load(image, {\n filtering,\n wrapping: { x: wrapX, y: wrapY }\n }, force);\n // remove force attribute after upload\n image.removeAttribute('forceUpload');\n if (this._textures.indexOf(texture) === -1) {\n this._textures.push(texture);\n this._textureToIndex.set(texture, this._textureIndex++);\n this._images.add(image);\n }\n }\n _bindTextures(gl) {\n // Bind textures in the correct order\n for (let i = 0; i < this._maxTextures; i++) {\n gl.activeTexture(gl.TEXTURE0 + i);\n gl.bindTexture(gl.TEXTURE_2D, this._textures[i] || this._textures[0]);\n }\n }\n _getTextureIdForImage(image) {\n var _a;\n if (image) {\n const maybeTexture = this._context.textureLoader.get(image);\n return (_a = this._textureToIndex.get(maybeTexture)) !== null && _a !== void 0 ? _a : -1; //this._textures.indexOf(maybeTexture);\n }\n return -1;\n }\n _isFull() {\n if (this._imageCount >= this._maxImages) {\n return true;\n }\n if (this._textures.length >= this._maxTextures) {\n return true;\n }\n return false;\n }\n _getImageWidth(image) {\n let maybeWidth = this._imageToWidth.get(image);\n if (maybeWidth === undefined) {\n maybeWidth = image.width;\n this._imageToWidth.set(image, maybeWidth);\n }\n return maybeWidth;\n }\n _getImageHeight(image) {\n let maybeHeight = this._imageToHeight.get(image);\n if (maybeHeight === undefined) {\n maybeHeight = image.height;\n this._imageToHeight.set(image, maybeHeight);\n }\n return maybeHeight;\n }\n draw(image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight) {\n var _a, _b, _c, _d;\n // Force a render if the batch is full\n if (this._isFull()) {\n this.flush();\n }\n this._imageCount++;\n // This creates and uploads the texture if not already done\n this._addImageAsTexture(image);\n const maybeImageWidth = this._getImageWidth(image);\n const maybeImageHeight = this._getImageHeight(image);\n let width = maybeImageWidth || swidth || 0;\n let height = maybeImageHeight || sheight || 0;\n this._view[0] = 0;\n this._view[1] = 0;\n this._view[2] = (_a = swidth !== null && swidth !== void 0 ? swidth : maybeImageWidth) !== null && _a !== void 0 ? _a : 0;\n this._view[3] = (_b = sheight !== null && sheight !== void 0 ? sheight : maybeImageHeight) !== null && _b !== void 0 ? _b : 0;\n this._dest[0] = sx !== null && sx !== void 0 ? sx : 1;\n this._dest[1] = sy !== null && sy !== void 0 ? sy : 1;\n // If destination is specified, update view and dest\n if (dx !== undefined && dy !== undefined && dwidth !== undefined && dheight !== undefined) {\n this._view[0] = sx !== null && sx !== void 0 ? sx : 1;\n this._view[1] = sy !== null && sy !== void 0 ? sy : 1;\n this._view[2] = (_c = swidth !== null && swidth !== void 0 ? swidth : maybeImageWidth) !== null && _c !== void 0 ? _c : 0;\n this._view[3] = (_d = sheight !== null && sheight !== void 0 ? sheight : maybeImageHeight) !== null && _d !== void 0 ? _d : 0;\n this._dest[0] = dx;\n this._dest[1] = dy;\n width = dwidth;\n height = dheight;\n }\n sx = this._view[0];\n sy = this._view[1];\n const sw = this._view[2];\n const sh = this._view[3];\n // transform based on current context\n const transform = this._context.getTransform();\n const opacity = this._context.opacity;\n const snapToPixel = this._context.snapToPixel;\n // top left\n this._quad[0] = this._dest[0];\n this._quad[1] = this._dest[1];\n // top right\n this._quad[2] = this._dest[0] + width;\n this._quad[3] = this._dest[1];\n // bottom left\n this._quad[4] = this._dest[0];\n this._quad[5] = this._dest[1] + height;\n // bottom right\n this._quad[6] = this._dest[0] + width;\n this._quad[7] = this._dest[1] + height;\n transform.multiplyQuadInPlace(this._quad);\n if (snapToPixel) {\n this._quad[0] = ~~(this._quad[0] + (0,_Math_util__WEBPACK_IMPORTED_MODULE_11__.sign)(this._quad[0]) * _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__.pixelSnapEpsilon);\n this._quad[1] = ~~(this._quad[1] + (0,_Math_util__WEBPACK_IMPORTED_MODULE_11__.sign)(this._quad[1]) * _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__.pixelSnapEpsilon);\n this._quad[2] = ~~(this._quad[2] + (0,_Math_util__WEBPACK_IMPORTED_MODULE_11__.sign)(this._quad[2]) * _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__.pixelSnapEpsilon);\n this._quad[3] = ~~(this._quad[3] + (0,_Math_util__WEBPACK_IMPORTED_MODULE_11__.sign)(this._quad[3]) * _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__.pixelSnapEpsilon);\n this._quad[4] = ~~(this._quad[4] + (0,_Math_util__WEBPACK_IMPORTED_MODULE_11__.sign)(this._quad[4]) * _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__.pixelSnapEpsilon);\n this._quad[5] = ~~(this._quad[5] + (0,_Math_util__WEBPACK_IMPORTED_MODULE_11__.sign)(this._quad[5]) * _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__.pixelSnapEpsilon);\n this._quad[6] = ~~(this._quad[6] + (0,_Math_util__WEBPACK_IMPORTED_MODULE_11__.sign)(this._quad[6]) * _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__.pixelSnapEpsilon);\n this._quad[7] = ~~(this._quad[7] + (0,_Math_util__WEBPACK_IMPORTED_MODULE_11__.sign)(this._quad[7]) * _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__.pixelSnapEpsilon);\n }\n const tint = this._context.tint || this._defaultTint;\n const textureId = this._getTextureIdForImage(image);\n const imageWidth = maybeImageWidth || width;\n const imageHeight = maybeImageHeight || height;\n const uvx0 = (sx + this.uvPadding) / imageWidth;\n const uvy0 = (sy + this.uvPadding) / imageHeight;\n const uvx1 = (sx + sw - this.uvPadding) / imageWidth;\n const uvy1 = (sy + sh - this.uvPadding) / imageHeight;\n const txWidth = maybeImageWidth;\n const txHeight = maybeImageHeight;\n // update data\n const vertexBuffer = this._layout.vertexBuffer.bufferData;\n // (0, 0) - 0\n vertexBuffer[this._vertexIndex++] = this._quad[0];\n vertexBuffer[this._vertexIndex++] = this._quad[1];\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = txWidth;\n vertexBuffer[this._vertexIndex++] = txHeight;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = textureId;\n vertexBuffer[this._vertexIndex++] = tint.r / 255;\n vertexBuffer[this._vertexIndex++] = tint.g / 255;\n vertexBuffer[this._vertexIndex++] = tint.b / 255;\n vertexBuffer[this._vertexIndex++] = tint.a;\n // (0, 1) - 1\n vertexBuffer[this._vertexIndex++] = this._quad[4];\n vertexBuffer[this._vertexIndex++] = this._quad[5];\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = txWidth;\n vertexBuffer[this._vertexIndex++] = txHeight;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = textureId;\n vertexBuffer[this._vertexIndex++] = tint.r / 255;\n vertexBuffer[this._vertexIndex++] = tint.g / 255;\n vertexBuffer[this._vertexIndex++] = tint.b / 255;\n vertexBuffer[this._vertexIndex++] = tint.a;\n // (1, 0) - 2\n vertexBuffer[this._vertexIndex++] = this._quad[2];\n vertexBuffer[this._vertexIndex++] = this._quad[3];\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = txWidth;\n vertexBuffer[this._vertexIndex++] = txHeight;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = textureId;\n vertexBuffer[this._vertexIndex++] = tint.r / 255;\n vertexBuffer[this._vertexIndex++] = tint.g / 255;\n vertexBuffer[this._vertexIndex++] = tint.b / 255;\n vertexBuffer[this._vertexIndex++] = tint.a;\n // (1, 1) - 3\n vertexBuffer[this._vertexIndex++] = this._quad[6];\n vertexBuffer[this._vertexIndex++] = this._quad[7];\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = txWidth;\n vertexBuffer[this._vertexIndex++] = txHeight;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = textureId;\n vertexBuffer[this._vertexIndex++] = tint.r / 255;\n vertexBuffer[this._vertexIndex++] = tint.g / 255;\n vertexBuffer[this._vertexIndex++] = tint.b / 255;\n vertexBuffer[this._vertexIndex++] = tint.a;\n }\n hasPendingDraws() {\n return this._imageCount !== 0;\n }\n flush() {\n // nothing to draw early exit\n if (this._imageCount === 0) {\n return;\n }\n const gl = this._gl;\n // Bind the shader\n this._shader.use();\n // Bind the memory layout and upload data\n this._layout.use(true, 4 * 12 * this._imageCount); // 4 verts * 12 components\n // Update ortho matrix uniform\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n // Turn on pixel art aa sampler\n this._shader.setUniformBoolean('u_pixelart', this.pixelArtSampler);\n // Bind textures to\n this._bindTextures(gl);\n // Bind index buffer\n this._quads.bind();\n // Draw all the quads\n gl.drawElements(gl.TRIANGLES, this._imageCount * 6, this._quads.bufferGlType, 0);\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_13__.GraphicsDiagnostics.DrawnImagesCount += this._imageCount;\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_13__.GraphicsDiagnostics.DrawCallCount++;\n // Reset\n this._imageCount = 0;\n this._vertexIndex = 0;\n this._textures.length = 0;\n this._textureIndex = 0;\n this._textureToIndex.clear();\n this._images.clear();\n this._imageToWidth.clear();\n this._imageToHeight.clear();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/line-renderer/line-renderer.ts\":\n/*!*********************************************************!*\\\n !*** ./Graphics/Context/line-renderer/line-renderer.ts ***!\n \\*********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ LineRenderer: () => (/* binding */ LineRenderer)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _line_vertex_glsl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./line-vertex.glsl */ \"./Graphics/Context/line-renderer/line-vertex.glsl\");\n/* harmony import */ var _line_fragment_glsl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./line-fragment.glsl */ \"./Graphics/Context/line-renderer/line-fragment.glsl\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../.. */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../.. */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../.. */ \"./Graphics/Context/vertex-layout.ts\");\n/* harmony import */ var _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n\n\n\n\n\nclass LineRenderer {\n constructor() {\n this.type = 'ex.line';\n this.priority = 0;\n this._maxLines = 10922;\n this._vertexIndex = 0;\n this._lineCount = 0;\n this._startScratch = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n this._endScratch = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n }\n initialize(gl, context) {\n this._gl = gl;\n this._context = context;\n this._shader = new ___WEBPACK_IMPORTED_MODULE_1__.Shader({\n gl,\n vertexSource: _line_vertex_glsl__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n fragmentSource: _line_fragment_glsl__WEBPACK_IMPORTED_MODULE_3__[\"default\"]\n });\n this._shader.compile();\n this._shader.use();\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n this._vertexBuffer = new ___WEBPACK_IMPORTED_MODULE_4__.VertexBuffer({\n gl,\n size: 6 * 2 * this._maxLines,\n type: 'dynamic'\n });\n this._layout = new ___WEBPACK_IMPORTED_MODULE_5__.VertexLayout({\n gl,\n vertexBuffer: this._vertexBuffer,\n shader: this._shader,\n attributes: [\n ['a_position', 2],\n ['a_color', 4]\n ]\n });\n }\n dispose() {\n this._vertexBuffer.dispose();\n this._shader.dispose();\n this._context = null;\n this._gl = null;\n }\n draw(start, end, color) {\n // Force a render if the batch is full\n if (this._isFull()) {\n this.flush();\n }\n this._lineCount++;\n const transform = this._context.getTransform();\n const finalStart = transform.multiply(start, this._startScratch);\n const finalEnd = transform.multiply(end, this._endScratch);\n const vertexBuffer = this._vertexBuffer.bufferData;\n // Start\n vertexBuffer[this._vertexIndex++] = finalStart.x;\n vertexBuffer[this._vertexIndex++] = finalStart.y;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n // End\n vertexBuffer[this._vertexIndex++] = finalEnd.x;\n vertexBuffer[this._vertexIndex++] = finalEnd.y;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n }\n _isFull() {\n if (this._lineCount >= this._maxLines) {\n return true;\n }\n return false;\n }\n hasPendingDraws() {\n return this._lineCount !== 0;\n }\n flush() {\n // nothing to draw early exit\n if (this._lineCount === 0) {\n return;\n }\n const gl = this._gl;\n this._shader.use();\n this._layout.use(true);\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n gl.drawArrays(gl.LINES, 0, this._lineCount * 2); // 2 verts per line\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_6__.GraphicsDiagnostics.DrawnImagesCount += this._lineCount;\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_6__.GraphicsDiagnostics.DrawCallCount++;\n // reset\n this._vertexIndex = 0;\n this._lineCount = 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/material-renderer/material-renderer.ts\":\n/*!*****************************************************************!*\\\n !*** ./Graphics/Context/material-renderer/material-renderer.ts ***!\n \\*****************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MaterialRenderer: () => (/* binding */ MaterialRenderer)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n/* harmony import */ var _ImageSource__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../ImageSource */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../Wrapping */ \"./Graphics/Wrapping.ts\");\n/* harmony import */ var _quad_index_buffer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../quad-index-buffer */ \"./Graphics/Context/quad-index-buffer.ts\");\n/* harmony import */ var _vertex_buffer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _vertex_layout__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../vertex-layout */ \"./Graphics/Context/vertex-layout.ts\");\n\n\n\n\n\n\n\n\nclass MaterialRenderer {\n constructor() {\n this.type = 'ex.material';\n this.priority = 0;\n this._textures = [];\n }\n initialize(gl, context) {\n this._gl = gl;\n this._context = context;\n // Setup memory layout\n this._buffer = new _vertex_buffer__WEBPACK_IMPORTED_MODULE_0__.VertexBuffer({\n gl,\n size: 6 * 4, // 6 components * 4 verts\n type: 'dynamic'\n });\n // Setup a vertex layout/buffer to the material\n this._layout = new _vertex_layout__WEBPACK_IMPORTED_MODULE_1__.VertexLayout({\n gl,\n vertexBuffer: this._buffer,\n attributes: [\n ['a_position', 2],\n ['a_uv', 2],\n ['a_screenuv', 2]\n ],\n suppressWarnings: true\n });\n // Setup index buffer\n this._quads = new _quad_index_buffer__WEBPACK_IMPORTED_MODULE_2__.QuadIndexBuffer(gl, 1, true);\n }\n dispose() {\n this._buffer.dispose();\n this._quads.dispose();\n this._textures.length = 0;\n this._context = null;\n this._gl = null;\n }\n draw(image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight) {\n var _a, _b, _c, _d;\n const gl = this._gl;\n // Extract context info\n const material = this._context.material;\n if (!material) {\n return;\n }\n const transform = this._context.getTransform();\n const opacity = this._context.opacity;\n // material shader\n const shader = material.getShader();\n // construct geometry, or hold on to it in the material?\n // geometry primitive for drawing rectangles?\n // update data\n const vertexBuffer = this._layout.vertexBuffer.bufferData;\n let vertexIndex = 0;\n let width = (image === null || image === void 0 ? void 0 : image.width) || swidth || 0;\n let height = (image === null || image === void 0 ? void 0 : image.height) || sheight || 0;\n let view = [0, 0, (_a = swidth !== null && swidth !== void 0 ? swidth : image === null || image === void 0 ? void 0 : image.width) !== null && _a !== void 0 ? _a : 0, (_b = sheight !== null && sheight !== void 0 ? sheight : image === null || image === void 0 ? void 0 : image.height) !== null && _b !== void 0 ? _b : 0];\n let dest = [sx !== null && sx !== void 0 ? sx : 1, sy !== null && sy !== void 0 ? sy : 1];\n // If destination is specified, update view and dest\n if (dx !== undefined && dy !== undefined && dwidth !== undefined && dheight !== undefined) {\n view = [sx !== null && sx !== void 0 ? sx : 1, sy !== null && sy !== void 0 ? sy : 1, (_c = swidth !== null && swidth !== void 0 ? swidth : image === null || image === void 0 ? void 0 : image.width) !== null && _c !== void 0 ? _c : 0, (_d = sheight !== null && sheight !== void 0 ? sheight : image === null || image === void 0 ? void 0 : image.height) !== null && _d !== void 0 ? _d : 0];\n dest = [dx, dy];\n width = dwidth;\n height = dheight;\n }\n sx = view[0];\n sy = view[1];\n const sw = view[2];\n const sh = view[3];\n const topLeft = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(dest[0], dest[1]);\n const topRight = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(dest[0] + width, dest[1]);\n const bottomLeft = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(dest[0], dest[1] + height);\n const bottomRight = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(dest[0] + width, dest[1] + height);\n const imageWidth = image.width || width;\n const imageHeight = image.height || height;\n const uvx0 = sx / imageWidth;\n const uvy0 = sy / imageHeight;\n const uvx1 = (sx + sw - 0.01) / imageWidth;\n const uvy1 = (sy + sh - 0.01) / imageHeight;\n const topLeftScreen = transform.getPosition();\n const bottomRightScreen = topLeftScreen.add(bottomRight);\n const screenUVX0 = topLeftScreen.x / this._context.width;\n const screenUVY0 = topLeftScreen.y / this._context.height;\n const screenUVX1 = bottomRightScreen.x / this._context.width;\n const screenUVY1 = bottomRightScreen.y / this._context.height;\n // (0, 0) - 0\n vertexBuffer[vertexIndex++] = topLeft.x;\n vertexBuffer[vertexIndex++] = topLeft.y;\n vertexBuffer[vertexIndex++] = uvx0;\n vertexBuffer[vertexIndex++] = uvy0;\n vertexBuffer[vertexIndex++] = screenUVX0;\n vertexBuffer[vertexIndex++] = screenUVY0;\n // (0, 1) - 1\n vertexBuffer[vertexIndex++] = bottomLeft.x;\n vertexBuffer[vertexIndex++] = bottomLeft.y;\n vertexBuffer[vertexIndex++] = uvx0;\n vertexBuffer[vertexIndex++] = uvy1;\n vertexBuffer[vertexIndex++] = screenUVX0;\n vertexBuffer[vertexIndex++] = screenUVY1;\n // (1, 0) - 2\n vertexBuffer[vertexIndex++] = topRight.x;\n vertexBuffer[vertexIndex++] = topRight.y;\n vertexBuffer[vertexIndex++] = uvx1;\n vertexBuffer[vertexIndex++] = uvy0;\n vertexBuffer[vertexIndex++] = screenUVX1;\n vertexBuffer[vertexIndex++] = screenUVY0;\n // (1, 1) - 3\n vertexBuffer[vertexIndex++] = bottomRight.x;\n vertexBuffer[vertexIndex++] = bottomRight.y;\n vertexBuffer[vertexIndex++] = uvx1;\n vertexBuffer[vertexIndex++] = uvy1;\n vertexBuffer[vertexIndex++] = screenUVX1;\n vertexBuffer[vertexIndex++] = screenUVY1;\n // This creates and uploads the texture if not already done\n const texture = this._addImageAsTexture(image);\n // apply material\n material.use();\n this._layout.shader = shader;\n // apply layout and geometry\n this._layout.use(true);\n // apply time in ms since the page (performance.now())\n shader.trySetUniformFloat('u_time_ms', performance.now());\n // apply opacity\n shader.trySetUniformFloat('u_opacity', opacity);\n // apply resolution\n shader.trySetUniformFloatVector('u_resolution', (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this._context.width, this._context.height));\n // apply graphic resolution\n shader.trySetUniformFloatVector('u_graphic_resolution', (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(imageWidth, imageHeight));\n // apply size\n shader.trySetUniformFloatVector('u_size', (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(sw, sh));\n // apply orthographic projection\n shader.trySetUniformMatrix('u_matrix', this._context.ortho);\n // apply geometry transform\n shader.trySetUniformMatrix('u_transform', transform.to4x4());\n // bind graphic image texture 'uniform sampler2D u_graphic;'\n gl.activeTexture(gl.TEXTURE0 + 0);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n shader.trySetUniformInt('u_graphic', 0);\n // bind the screen texture\n gl.activeTexture(gl.TEXTURE0 + 1);\n gl.bindTexture(gl.TEXTURE_2D, this._context.materialScreenTexture);\n shader.trySetUniformInt('u_screen_texture', 1);\n // bind any additional textures in the material\n material.uploadAndBind(gl);\n // bind quad index buffer\n this._quads.bind();\n // Draw a single quad\n gl.drawElements(gl.TRIANGLES, 6, this._quads.bufferGlType, 0);\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_4__.GraphicsDiagnostics.DrawnImagesCount++;\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_4__.GraphicsDiagnostics.DrawCallCount++;\n }\n _addImageAsTexture(image) {\n const maybeFiltering = image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_5__.ImageSourceAttributeConstants.Filtering);\n const filtering = maybeFiltering ? (0,_Filtering__WEBPACK_IMPORTED_MODULE_6__.parseImageFiltering)(maybeFiltering) : undefined;\n const wrapX = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_7__.parseImageWrapping)(image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_5__.ImageSourceAttributeConstants.WrappingX));\n const wrapY = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_7__.parseImageWrapping)(image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_5__.ImageSourceAttributeConstants.WrappingY));\n const force = image.getAttribute('forceUpload') === 'true' ? true : false;\n const texture = this._context.textureLoader.load(image, {\n filtering,\n wrapping: { x: wrapX, y: wrapY }\n }, force);\n // remove force attribute after upload\n image.removeAttribute('forceUpload');\n if (this._textures.indexOf(texture) === -1) {\n this._textures.push(texture);\n }\n return texture;\n }\n hasPendingDraws() {\n return false;\n }\n flush() {\n // flush does not do anything, material renderer renders immediately per draw\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/material.ts\":\n/*!**************************************!*\\\n !*** ./Graphics/Context/material.ts ***!\n \\**************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Material: () => (/* binding */ Material)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Color */ \"./Color.ts\");\n/* harmony import */ var _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _ImageSource__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ImageSource */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Wrapping */ \"./Graphics/Wrapping.ts\");\n\n\n\n\n\n\nconst defaultVertexSource = `#version 300 es\r\nin vec2 a_position;\r\n\r\nin vec2 a_uv;\r\nout vec2 v_uv;\r\n\r\nin vec2 a_screenuv;\r\nout vec2 v_screenuv;\r\n\r\nuniform mat4 u_matrix;\r\nuniform mat4 u_transform;\r\n\r\nvoid main() {\r\n // Set the vertex position using the ortho & transform matrix\r\n gl_Position = u_matrix * u_transform * vec4(a_position, 0.0, 1.0);\r\n\r\n // Pass through the UV coord to the fragment shader\r\n v_uv = a_uv;\r\n v_screenuv = a_screenuv;\r\n}\r\n`;\nclass Material {\n constructor(options) {\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance();\n this._color = _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Transparent;\n this._initialized = false;\n this._images = new Map();\n this._textures = new Map();\n const { color, name, vertexSource, fragmentSource, graphicsContext, images } = options;\n this._name = name !== null && name !== void 0 ? name : 'anonymous material';\n this._vertexSource = vertexSource !== null && vertexSource !== void 0 ? vertexSource : defaultVertexSource;\n this._fragmentSource = fragmentSource;\n this._color = color !== null && color !== void 0 ? color : this._color;\n if (!graphicsContext) {\n throw Error(`Material ${name} must be provided an excalibur webgl graphics context`);\n }\n if (graphicsContext instanceof _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_2__.ExcaliburGraphicsContextWebGL) {\n this._graphicsContext = graphicsContext;\n this._initialize(graphicsContext);\n }\n else {\n this._logger.warn(`Material ${name} was created in 2D Canvas mode, currently only WebGL is supported`);\n }\n if (images) {\n for (const key in images) {\n this.addImageSource(key, images[key]);\n }\n }\n }\n _initialize(graphicsContextWebGL) {\n if (this._initialized) {\n return;\n }\n const gl = graphicsContextWebGL.__gl;\n // max texture slots - 2 for the graphic texture and screen texture\n this._maxTextureSlots = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS) - 2;\n this._shader = graphicsContextWebGL.createShader({\n vertexSource: this._vertexSource,\n fragmentSource: this._fragmentSource\n });\n this._shader.compile();\n this._initialized = true;\n }\n get color() {\n return this._color;\n }\n set color(c) {\n this._color = c;\n }\n get name() {\n var _a;\n return (_a = this._name) !== null && _a !== void 0 ? _a : 'anonymous material';\n }\n get isUsingScreenTexture() {\n return this._fragmentSource.includes('u_screen_texture');\n }\n update(callback) {\n if (this._shader) {\n this._shader.use();\n callback(this._shader);\n }\n }\n getShader() {\n return this._shader;\n }\n addImageSource(textureUniformName, image) {\n if (this._images.size < this._maxTextureSlots) {\n this._images.set(textureUniformName, image);\n }\n else {\n this._logger.warn(`Max number texture slots ${this._maxTextureSlots} have been reached for material \"${this.name}\", ` +\n `no more textures will be uploaded due to hardware constraints.`);\n }\n }\n removeImageSource(textureName) {\n const image = this._images.get(textureName);\n this._graphicsContext.textureLoader.delete(image.image);\n this._images.delete(textureName);\n }\n _loadImageSource(image) {\n const imageElement = image.image;\n const maybeFiltering = imageElement.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_3__.ImageSourceAttributeConstants.Filtering);\n const filtering = maybeFiltering ? (0,_Filtering__WEBPACK_IMPORTED_MODULE_4__.parseImageFiltering)(maybeFiltering) : undefined;\n const wrapX = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_5__.parseImageWrapping)(imageElement.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_3__.ImageSourceAttributeConstants.WrappingX));\n const wrapY = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_5__.parseImageWrapping)(imageElement.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_3__.ImageSourceAttributeConstants.WrappingY));\n const force = imageElement.getAttribute('forceUpload') === 'true' ? true : false;\n const texture = this._graphicsContext.textureLoader.load(imageElement, {\n filtering,\n wrapping: { x: wrapX, y: wrapY }\n }, force);\n // remove force attribute after upload\n imageElement.removeAttribute('forceUpload');\n if (!this._textures.has(image)) {\n this._textures.set(image, texture);\n }\n return texture;\n }\n uploadAndBind(gl, startingTextureSlot = 2) {\n let textureSlot = startingTextureSlot;\n for (const [textureName, image] of this._images.entries()) {\n if (!image.isLoaded()) {\n this._logger.warnOnce(`Image named ${textureName} in material ${this.name} not loaded, nothing will be uploaded to the shader.` +\n ` Did you forget to add this to a loader? https://excaliburjs.com/docs/loaders/`);\n continue;\n } // skip unloaded images, maybe warn\n const texture = this._loadImageSource(image);\n gl.activeTexture(gl.TEXTURE0 + textureSlot);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n this._shader.trySetUniformInt(textureName, textureSlot);\n textureSlot++;\n }\n }\n use() {\n if (this._initialized) {\n // bind the shader\n this._shader.use();\n // Apply standard uniforms\n this._shader.trySetUniformFloatColor('u_color', this._color);\n }\n else {\n throw Error(`Material ${this.name} not yet initialized, use the ExcaliburGraphicsContext.createMaterial() to work around this.`);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/particle-renderer/particle-renderer.ts\":\n/*!*****************************************************************!*\\\n !*** ./Graphics/Context/particle-renderer/particle-renderer.ts ***!\n \\*****************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ParticleRenderer: () => (/* binding */ ParticleRenderer)\n/* harmony export */ });\n/* harmony import */ var _shader__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _particle_vertex_glsl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./particle-vertex.glsl */ \"./Graphics/Context/particle-renderer/particle-vertex.glsl\");\n/* harmony import */ var _particle_fragment_glsl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./particle-fragment.glsl */ \"./Graphics/Context/particle-renderer/particle-fragment.glsl\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../../Color */ \"./Color.ts\");\n/* harmony import */ var _ImageSource__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../ImageSource */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Wrapping */ \"./Graphics/Wrapping.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Particles_Particles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../Particles/Particles */ \"./Particles/Particles.ts\");\n\n\n\n\n\n\n\n\n\nclass ParticleRenderer {\n constructor() {\n this.type = 'ex.particle';\n this.priority = 0;\n }\n initialize(gl, context) {\n this._gl = gl;\n this._context = context;\n this._shader = new _shader__WEBPACK_IMPORTED_MODULE_0__.Shader({\n gl,\n vertexSource: _particle_vertex_glsl__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n fragmentSource: _particle_fragment_glsl__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n onPreLink: (program) => {\n gl.transformFeedbackVaryings(program, ['finalPosition', 'finalVelocity', 'finalRotation', 'finalAngularVelocity', 'finalLifeMs'], gl.INTERLEAVED_ATTRIBS);\n }\n });\n this._shader.compile();\n this._shader.use();\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n }\n _getTexture(image) {\n const maybeFiltering = image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_3__.ImageSourceAttributeConstants.Filtering);\n const filtering = maybeFiltering ? (0,_Filtering__WEBPACK_IMPORTED_MODULE_4__.parseImageFiltering)(maybeFiltering) : undefined;\n const wrapX = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_5__.parseImageWrapping)(image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_3__.ImageSourceAttributeConstants.WrappingX));\n const wrapY = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_5__.parseImageWrapping)(image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_3__.ImageSourceAttributeConstants.WrappingY));\n const force = image.getAttribute('forceUpload') === 'true' ? true : false;\n const texture = this._context.textureLoader.load(image, {\n filtering,\n wrapping: { x: wrapX, y: wrapY }\n }, force);\n // remove force attribute after upload\n image.removeAttribute('forceUpload');\n return texture;\n }\n draw(renderer, elapsed) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j;\n const gl = this._gl;\n this._shader.use();\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n const transform = renderer.particle.transform === _Particles_Particles__WEBPACK_IMPORTED_MODULE_6__.ParticleTransform.Local\n ? this._context.getTransform()\n : this._context.getTransform().multiply(renderer.emitter.transform.get().inverse);\n this._shader.setUniformAffineMatrix('u_transform', transform);\n this._shader.setUniformBoolean('fade', renderer.particle.fade ? true : false);\n this._shader.setUniformBoolean('useTexture', renderer.particle.graphic ? true : false);\n this._shader.setUniformFloat('maxLifeMs', (_a = renderer.particle.life) !== null && _a !== void 0 ? _a : 2000);\n this._shader.setUniformFloat('deltaMs', elapsed);\n this._shader.setUniformFloatVector('gravity', (_b = renderer.particle.acc) !== null && _b !== void 0 ? _b : (0,_Math_vector__WEBPACK_IMPORTED_MODULE_7__.vec)(0, 0));\n this._shader.setUniformFloatColor('beginColor', (_c = renderer.particle.beginColor) !== null && _c !== void 0 ? _c : _Color__WEBPACK_IMPORTED_MODULE_8__.Color.Transparent);\n this._shader.setUniformFloatColor('endColor', (_d = renderer.particle.endColor) !== null && _d !== void 0 ? _d : _Color__WEBPACK_IMPORTED_MODULE_8__.Color.Transparent);\n let startSize = (_e = renderer.particle.startSize) !== null && _e !== void 0 ? _e : 0;\n let endSize = (_f = renderer.particle.endSize) !== null && _f !== void 0 ? _f : 0;\n const size = (_g = renderer.particle.size) !== null && _g !== void 0 ? _g : 0;\n if (size > 0) {\n startSize = size;\n endSize = size;\n }\n this._shader.setUniformFloat('startSize', startSize !== null && startSize !== void 0 ? startSize : 10);\n this._shader.setUniformFloat('endSize', endSize !== null && endSize !== void 0 ? endSize : 10);\n this._shader.setUniformFloat('startOpacity', (_h = renderer.particle.opacity) !== null && _h !== void 0 ? _h : 1);\n if (renderer.particle.focus) {\n this._shader.setUniformFloatVector('focus', renderer.particle.focus);\n this._shader.setUniformFloat('focusAccel', (_j = renderer.particle.focusAccel) !== null && _j !== void 0 ? _j : 0);\n }\n // Particle Graphic (only Sprites right now)\n if (renderer.particle.graphic) {\n const graphic = renderer.particle.graphic;\n const texture = this._getTexture(graphic.image.image);\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n this._shader.setUniformInt('graphic', 0);\n }\n // Collision Mask\n // gl.activeTexture(gl.TEXTURE0 + 1);\n // gl.bindTexture(gl.TEXTURE_2D, obstacleTex);\n // gl.uniform1i(u_obstacle, 1);\n renderer.draw(gl);\n }\n hasPendingDraws() {\n return false;\n }\n flush() {\n // pass\n }\n dispose() {\n // pass\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/point-renderer/point-renderer.ts\":\n/*!***********************************************************!*\\\n !*** ./Graphics/Context/point-renderer/point-renderer.ts ***!\n \\***********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointRenderer: () => (/* binding */ PointRenderer)\n/* harmony export */ });\n/* harmony import */ var _point_vertex_glsl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./point-vertex.glsl */ \"./Graphics/Context/point-renderer/point-vertex.glsl\");\n/* harmony import */ var _point_fragment_glsl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./point-fragment.glsl */ \"./Graphics/Context/point-renderer/point-fragment.glsl\");\n/* harmony import */ var _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _shader__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _vertex_buffer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _vertex_layout__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../vertex-layout */ \"./Graphics/Context/vertex-layout.ts\");\n/* harmony import */ var _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n\n\n\n\n\n\n\nclass PointRenderer {\n constructor() {\n this.type = 'ex.point';\n this.priority = 0;\n this._maxPoints = 10922;\n this._pointCount = 0;\n this._vertexIndex = 0;\n }\n initialize(gl, context) {\n this._gl = gl;\n this._context = context;\n this._shader = new _shader__WEBPACK_IMPORTED_MODULE_0__.Shader({\n gl,\n vertexSource: _point_vertex_glsl__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n fragmentSource: _point_fragment_glsl__WEBPACK_IMPORTED_MODULE_2__[\"default\"]\n });\n this._shader.compile();\n this._shader.use();\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n this._buffer = new _vertex_buffer__WEBPACK_IMPORTED_MODULE_3__.VertexBuffer({\n gl,\n size: 7 * this._maxPoints,\n type: 'dynamic'\n });\n this._layout = new _vertex_layout__WEBPACK_IMPORTED_MODULE_4__.VertexLayout({\n gl,\n shader: this._shader,\n vertexBuffer: this._buffer,\n attributes: [\n ['a_position', 2],\n ['a_color', 4],\n ['a_size', 1]\n ]\n });\n }\n dispose() {\n this._buffer.dispose();\n this._shader.dispose();\n this._context = null;\n this._gl = null;\n }\n draw(point, color, size) {\n // Force a render if the batch is full\n if (this._isFull()) {\n this.flush();\n }\n this._pointCount++;\n const transform = this._context.getTransform();\n const opacity = this._context.opacity;\n const snapToPixel = this._context.snapToPixel;\n const finalPoint = transform.multiply(point);\n if (snapToPixel) {\n finalPoint.x = ~~(finalPoint.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_5__.pixelSnapEpsilon);\n finalPoint.y = ~~(finalPoint.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_5__.pixelSnapEpsilon);\n }\n const vertexBuffer = this._buffer.bufferData;\n vertexBuffer[this._vertexIndex++] = finalPoint.x;\n vertexBuffer[this._vertexIndex++] = finalPoint.y;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a * opacity;\n vertexBuffer[this._vertexIndex++] = size * Math.max(transform.getScaleX(), transform.getScaleY());\n }\n _isFull() {\n if (this._pointCount >= this._maxPoints) {\n return true;\n }\n return false;\n }\n hasPendingDraws() {\n return this._pointCount !== 0;\n }\n flush() {\n // nothing to draw early exit\n if (this._pointCount === 0) {\n return;\n }\n const gl = this._gl;\n this._shader.use();\n this._layout.use(true);\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n gl.drawArrays(gl.POINTS, 0, this._pointCount);\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_6__.GraphicsDiagnostics.DrawnImagesCount += this._pointCount;\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_6__.GraphicsDiagnostics.DrawCallCount++;\n this._pointCount = 0;\n this._vertexIndex = 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/quad-index-buffer.ts\":\n/*!***********************************************!*\\\n !*** ./Graphics/Context/quad-index-buffer.ts ***!\n \\***********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ QuadIndexBuffer: () => (/* binding */ QuadIndexBuffer)\n/* harmony export */ });\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../.. */ \"./Util/Log.ts\");\n\n/**\n * Helper that defines and index buffer for quad geometry\n *\n * Index buffers allow you to save space in vertex buffers when you share vertices in geometry\n * it is almost always worth it in terms of performance to use an index buffer.\n */\nclass QuadIndexBuffer {\n /**\n * @param gl WebGL2RenderingContext this layout will be attached to, these cannot be reused across contexts.\n * @param numberOfQuads Specify the max number of quads you want to draw\n * @param useUint16 Optionally force a uint16 buffer\n */\n constructor(gl, numberOfQuads, useUint16) {\n this._logger = ___WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance();\n this._gl = gl;\n this.buffer = gl.createBuffer();\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.buffer);\n const totalVertices = numberOfQuads * 6;\n if (!useUint16) {\n this.bufferData = new Uint32Array(totalVertices);\n }\n else {\n // fall back to using gl.UNSIGNED_SHORT or tell the user they are out of luck\n const maxUint16 = 65535;\n const maxUint16Index = Math.floor((maxUint16 - 1) / 4); // max quads\n this.bufferGlType = gl.UNSIGNED_SHORT;\n this.bufferData = new Uint16Array(totalVertices);\n // TODO Should we error if this happens?? maybe not might crash mid game\n if (numberOfQuads > maxUint16Index) {\n this._logger.warn(`Total quads exceeds hardware index buffer limit (uint16), max(${maxUint16Index}) requested quads(${numberOfQuads})`);\n }\n }\n let currentQuad = 0;\n for (let i = 0; i < totalVertices; i += 6) {\n // first triangle\n this.bufferData[i + 0] = currentQuad + 0;\n this.bufferData[i + 1] = currentQuad + 1;\n this.bufferData[i + 2] = currentQuad + 2;\n // second triangle\n this.bufferData[i + 3] = currentQuad + 2;\n this.bufferData[i + 4] = currentQuad + 1;\n this.bufferData[i + 5] = currentQuad + 3;\n currentQuad += 4;\n }\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.bufferData, gl.STATIC_DRAW);\n }\n get size() {\n return this.bufferData.length;\n }\n /**\n * Upload data to the GPU\n */\n upload() {\n const gl = this._gl;\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.buffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.bufferData, gl.STATIC_DRAW);\n }\n /**\n * Bind this index buffer\n */\n bind() {\n const gl = this._gl;\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.buffer);\n }\n dispose() {\n const gl = this._gl;\n gl.deleteBuffer(this.buffer);\n this._gl = null;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/rectangle-renderer/rectangle-renderer.ts\":\n/*!*******************************************************************!*\\\n !*** ./Graphics/Context/rectangle-renderer/rectangle-renderer.ts ***!\n \\*******************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RectangleRenderer: () => (/* binding */ RectangleRenderer)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Color */ \"./Color.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n/* harmony import */ var _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _quad_index_buffer__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../quad-index-buffer */ \"./Graphics/Context/quad-index-buffer.ts\");\n/* harmony import */ var _shader__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _vertex_buffer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _vertex_layout__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../vertex-layout */ \"./Graphics/Context/vertex-layout.ts\");\n/* harmony import */ var _rectangle_renderer_frag_glsl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./rectangle-renderer.frag.glsl */ \"./Graphics/Context/rectangle-renderer/rectangle-renderer.frag.glsl\");\n/* harmony import */ var _rectangle_renderer_vert_glsl__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./rectangle-renderer.vert.glsl */ \"./Graphics/Context/rectangle-renderer/rectangle-renderer.vert.glsl\");\n\n\n\n\n\n\n\n\n\n\nclass RectangleRenderer {\n constructor() {\n this.type = 'ex.rectangle';\n this.priority = 0;\n this._maxRectangles = 10922; // max(uint16) / 6 verts\n this._rectangleCount = 0;\n this._vertexIndex = 0;\n this._transparent = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Transparent;\n this._scratch1 = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0);\n this._scratch2 = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0);\n this._scratch3 = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0);\n this._scratch4 = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0);\n }\n initialize(gl, context) {\n this._gl = gl;\n this._context = context;\n // https://stackoverflow.com/questions/59197671/glsl-rounded-rectangle-with-variable-border\n this._shader = new _shader__WEBPACK_IMPORTED_MODULE_2__.Shader({\n gl,\n fragmentSource: _rectangle_renderer_frag_glsl__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n vertexSource: _rectangle_renderer_vert_glsl__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n });\n this._shader.compile();\n // setup uniforms\n this._shader.use();\n this._shader.setUniformMatrix('u_matrix', context.ortho);\n this._buffer = new _vertex_buffer__WEBPACK_IMPORTED_MODULE_5__.VertexBuffer({\n gl,\n size: 16 * 4 * this._maxRectangles,\n type: 'dynamic'\n });\n this._layout = new _vertex_layout__WEBPACK_IMPORTED_MODULE_6__.VertexLayout({\n gl,\n shader: this._shader,\n vertexBuffer: this._buffer,\n attributes: [\n ['a_position', 2],\n ['a_uv', 2],\n ['a_size', 2],\n ['a_opacity', 1],\n ['a_color', 4],\n ['a_strokeColor', 4],\n ['a_strokeThickness', 1]\n ]\n });\n this._quads = new _quad_index_buffer__WEBPACK_IMPORTED_MODULE_7__.QuadIndexBuffer(gl, this._maxRectangles, true);\n }\n dispose() {\n this._buffer.dispose();\n this._quads.dispose();\n this._shader.dispose();\n this._context = null;\n this._gl = null;\n }\n _isFull() {\n if (this._rectangleCount >= this._maxRectangles) {\n return true;\n }\n return false;\n }\n draw(...args) {\n if (args[0] instanceof _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector && args[1] instanceof _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector) {\n this.drawLine.apply(this, args);\n }\n else {\n this.drawRectangle.apply(this, args);\n }\n }\n drawLine(start, end, color, thickness = 1) {\n if (this._isFull()) {\n this.flush();\n }\n this._rectangleCount++;\n // transform based on current context\n const transform = this._context.getTransform();\n const opacity = this._context.opacity;\n const snapToPixel = this._context.snapToPixel;\n const dir = end.sub(start);\n const length = dir.magnitude;\n const normal = dir.normalize().perpendicular();\n const halfThick = thickness / 2;\n /**\n * +---------------------^----------------------+\n * | | (normal) |\n * (startX, startY)------------------>(endX, endY)\n * | |\n * + -------------------------------------------+\n */\n const startTop = transform.multiply(normal.scale(halfThick, this._scratch1).add(start, this._scratch1), this._scratch1);\n const startBottom = transform.multiply(normal.scale(-halfThick, this._scratch2).add(start, this._scratch2), this._scratch2);\n const endTop = transform.multiply(normal.scale(halfThick, this._scratch3).add(end, this._scratch3), this._scratch3);\n const endBottom = transform.multiply(normal.scale(-halfThick, this._scratch4).add(end, this._scratch4), this._scratch4);\n if (snapToPixel) {\n startTop.x = ~~(startTop.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n startTop.y = ~~(startTop.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n endTop.x = ~~(endTop.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n endTop.y = ~~(endTop.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n startBottom.x = ~~(startBottom.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n startBottom.y = ~~(startBottom.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n endBottom.x = ~~(endBottom.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n endBottom.y = ~~(endBottom.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n }\n // TODO uv could be static vertex buffer\n const uvx0 = 0;\n const uvy0 = 0;\n const uvx1 = 1;\n const uvy1 = 1;\n const stroke = this._transparent;\n const strokeThickness = 0;\n const width = 1;\n // update data\n const vertexBuffer = this._layout.vertexBuffer.bufferData;\n // (0, 0) - 0\n vertexBuffer[this._vertexIndex++] = startTop.x;\n vertexBuffer[this._vertexIndex++] = startTop.y;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = length;\n vertexBuffer[this._vertexIndex++] = thickness;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness / width;\n // (0, 1) - 1\n vertexBuffer[this._vertexIndex++] = startBottom.x;\n vertexBuffer[this._vertexIndex++] = startBottom.y;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = length;\n vertexBuffer[this._vertexIndex++] = thickness;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness / width;\n // (1, 0) - 2\n vertexBuffer[this._vertexIndex++] = endTop.x;\n vertexBuffer[this._vertexIndex++] = endTop.y;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = length;\n vertexBuffer[this._vertexIndex++] = thickness;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness / width;\n // (1, 1) - 3\n vertexBuffer[this._vertexIndex++] = endBottom.x;\n vertexBuffer[this._vertexIndex++] = endBottom.y;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = length;\n vertexBuffer[this._vertexIndex++] = thickness;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness / width;\n }\n drawRectangle(pos, width, height, color, stroke = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Transparent, strokeThickness = 0) {\n if (this._isFull()) {\n this.flush();\n }\n this._rectangleCount++;\n // transform based on current context\n const transform = this._context.getTransform();\n const opacity = this._context.opacity;\n const snapToPixel = this._context.snapToPixel;\n const topLeft = transform.multiply(pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0)));\n const topRight = transform.multiply(pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(width, 0)));\n const bottomRight = transform.multiply(pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(width, height)));\n const bottomLeft = transform.multiply(pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, height)));\n if (snapToPixel) {\n topLeft.x = ~~(topLeft.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n topLeft.y = ~~(topLeft.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n topRight.x = ~~(topRight.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n topRight.y = ~~(topRight.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n bottomLeft.x = ~~(bottomLeft.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n bottomLeft.y = ~~(bottomLeft.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n bottomRight.x = ~~(bottomRight.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n bottomRight.y = ~~(bottomRight.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n }\n // TODO uv could be static vertex buffer\n const uvx0 = 0;\n const uvy0 = 0;\n const uvx1 = 1;\n const uvy1 = 1;\n // update data\n const vertexBuffer = this._layout.vertexBuffer.bufferData;\n // (0, 0) - 0\n vertexBuffer[this._vertexIndex++] = topLeft.x;\n vertexBuffer[this._vertexIndex++] = topLeft.y;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = width;\n vertexBuffer[this._vertexIndex++] = height;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness;\n // (0, 1) - 1\n vertexBuffer[this._vertexIndex++] = bottomLeft.x;\n vertexBuffer[this._vertexIndex++] = bottomLeft.y;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = width;\n vertexBuffer[this._vertexIndex++] = height;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness;\n // (1, 0) - 2\n vertexBuffer[this._vertexIndex++] = topRight.x;\n vertexBuffer[this._vertexIndex++] = topRight.y;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = width;\n vertexBuffer[this._vertexIndex++] = height;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness;\n // (1, 1) - 3\n vertexBuffer[this._vertexIndex++] = bottomRight.x;\n vertexBuffer[this._vertexIndex++] = bottomRight.y;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = width;\n vertexBuffer[this._vertexIndex++] = height;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness;\n }\n hasPendingDraws() {\n return this._rectangleCount !== 0;\n }\n flush() {\n // nothing to draw early exit\n if (this._rectangleCount === 0) {\n return;\n }\n const gl = this._gl;\n // Bind the shader\n this._shader.use();\n // Bind the memory layout and upload data\n this._layout.use(true);\n // Update ortho matrix uniform\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n // Bind index buffer\n this._quads.bind();\n // Draw all the quads\n gl.drawElements(gl.TRIANGLES, this._rectangleCount * 6, this._quads.bufferGlType, 0);\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_9__.GraphicsDiagnostics.DrawnImagesCount += this._rectangleCount;\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_9__.GraphicsDiagnostics.DrawCallCount++;\n // Reset\n this._rectangleCount = 0;\n this._vertexIndex = 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/render-source.ts\":\n/*!*******************************************!*\\\n !*** ./Graphics/Context/render-source.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RenderSource: () => (/* binding */ RenderSource)\n/* harmony export */ });\nclass RenderSource {\n constructor(_gl, _texture) {\n this._gl = _gl;\n this._texture = _texture;\n }\n use() {\n const gl = this._gl;\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, this._texture);\n }\n disable() {\n const gl = this._gl;\n gl.bindTexture(gl.TEXTURE_2D, null);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/render-target.ts\":\n/*!*******************************************!*\\\n !*** ./Graphics/Context/render-target.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RenderTarget: () => (/* binding */ RenderTarget)\n/* harmony export */ });\n/* harmony import */ var _render_source__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./render-source */ \"./Graphics/Context/render-source.ts\");\n\nclass RenderTarget {\n constructor(options) {\n var _a, _b;\n this.antialias = false;\n this.samples = 1;\n this._gl = options.gl;\n this.width = options.width;\n this.height = options.height;\n this.transparency = options.transparency;\n this.antialias = (_a = options.antialias) !== null && _a !== void 0 ? _a : this.antialias;\n this.samples = (_b = options.samples) !== null && _b !== void 0 ? _b : this._gl.getParameter(this._gl.MAX_SAMPLES);\n const gl = this._gl;\n // Determine current context format for blitting later needs to match\n if (gl.drawingBufferFormat) {\n this.bufferFormat = gl.drawingBufferFormat;\n }\n else {\n // Documented in webgl spec\n // https://registry.khronos.org/webgl/specs/latest/1.0/\n if (this.transparency) {\n this.bufferFormat = gl.RGBA8;\n }\n else {\n this.bufferFormat = gl.RGB8;\n }\n }\n this._setupRenderBuffer();\n this._setupFramebuffer();\n }\n setResolution(width, height) {\n const gl = this._gl;\n this.width = width;\n this.height = height;\n // update backing texture size\n gl.bindTexture(gl.TEXTURE_2D, this._frameTexture);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n // update render buffer size\n if (this._renderBuffer) {\n gl.bindRenderbuffer(gl.RENDERBUFFER, this._renderBuffer);\n gl.renderbufferStorageMultisample(gl.RENDERBUFFER, Math.min(this.samples, gl.getParameter(gl.MAX_SAMPLES)), this.bufferFormat, this.width, this.height);\n }\n }\n get renderBuffer() {\n return this._renderBuffer;\n }\n get renderFrameBuffer() {\n return this._renderFrameBuffer;\n }\n get frameBuffer() {\n return this._frameBuffer;\n }\n get frameTexture() {\n return this._frameTexture;\n }\n _setupRenderBuffer() {\n if (this.antialias) {\n const gl = this._gl;\n // Render buffers can be used as an input to a shader\n this._renderBuffer = gl.createRenderbuffer();\n this._renderFrameBuffer = gl.createFramebuffer();\n gl.bindRenderbuffer(gl.RENDERBUFFER, this._renderBuffer);\n gl.renderbufferStorageMultisample(gl.RENDERBUFFER, Math.min(this.samples, gl.getParameter(gl.MAX_SAMPLES)), this.bufferFormat, this.width, this.height);\n gl.bindFramebuffer(gl.FRAMEBUFFER, this._renderFrameBuffer);\n gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, this._renderBuffer);\n }\n }\n _setupFramebuffer() {\n // Allocates frame buffer\n const gl = this._gl;\n this._frameTexture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, this._frameTexture);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n // set the filtering so we don't need mips\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n // attach the texture as the first color attachment\n const attachmentPoint = gl.COLOR_ATTACHMENT0;\n // After this bind all draw calls will draw to this framebuffer texture\n this._frameBuffer = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, this._frameBuffer);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, attachmentPoint, gl.TEXTURE_2D, this._frameTexture, 0);\n // Reset after initialized\n this.disable();\n }\n toRenderSource() {\n if (this.renderBuffer) {\n this.blitRenderBufferToFrameBuffer();\n }\n const source = new _render_source__WEBPACK_IMPORTED_MODULE_0__.RenderSource(this._gl, this._frameTexture);\n return source;\n }\n blitToScreen() {\n const gl = this._gl;\n // set to size of canvas's drawingBuffer\n if (this._renderBuffer) {\n gl.bindFramebuffer(gl.READ_FRAMEBUFFER, this.renderFrameBuffer);\n gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, null);\n gl.clearBufferfv(gl.COLOR, 0, [0.0, 0.0, 1.0, 1.0]);\n gl.blitFramebuffer(0, 0, this.width, this.height, 0, 0, this.width, this.height, gl.COLOR_BUFFER_BIT, gl.LINEAR);\n }\n else {\n gl.bindFramebuffer(gl.READ_FRAMEBUFFER, this.frameBuffer);\n gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, null);\n gl.clearBufferfv(gl.COLOR, 0, [0.0, 0.0, 1.0, 1.0]);\n gl.blitFramebuffer(0, 0, this.width, this.height, 0, 0, this.width, this.height, gl.COLOR_BUFFER_BIT, gl.LINEAR);\n }\n }\n blitRenderBufferToFrameBuffer() {\n if (this._renderBuffer) {\n const gl = this._gl;\n gl.bindFramebuffer(gl.READ_FRAMEBUFFER, this.renderFrameBuffer);\n gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, this.frameBuffer);\n gl.clearBufferfv(gl.COLOR, 0, [0.0, 0.0, 1.0, 1.0]);\n gl.blitFramebuffer(0, 0, this.width, this.height, 0, 0, this.width, this.height, gl.COLOR_BUFFER_BIT, gl.LINEAR);\n }\n }\n copyToTexture(texture) {\n const gl = this._gl;\n if (this._renderBuffer) {\n this.blitRenderBufferToFrameBuffer();\n }\n gl.bindFramebuffer(gl.FRAMEBUFFER, this._frameBuffer);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.copyTexImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 0, 0, this.width, this.height, 0);\n }\n /**\n * When called, all drawing gets redirected to this render target\n */\n use() {\n const gl = this._gl;\n if (this.antialias) {\n gl.bindFramebuffer(gl.FRAMEBUFFER, this._renderFrameBuffer);\n }\n else {\n gl.bindFramebuffer(gl.FRAMEBUFFER, this._frameBuffer);\n }\n // very important to set the viewport to the size of the framebuffer texture\n gl.viewport(0, 0, this.width, this.height);\n }\n /**\n * When called, all drawing is sent back to the canvas\n */\n disable() {\n const gl = this._gl;\n // passing null switches rendering back to the canvas\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.bindTexture(gl.TEXTURE_2D, null);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/screen-pass-painter/screen-pass-painter.ts\":\n/*!*********************************************************************!*\\\n !*** ./Graphics/Context/screen-pass-painter/screen-pass-painter.ts ***!\n \\*********************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ScreenPassPainter: () => (/* binding */ ScreenPassPainter)\n/* harmony export */ });\n/* harmony import */ var _screen_vertex_glsl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./screen-vertex.glsl */ \"./Graphics/Context/screen-pass-painter/screen-vertex.glsl\");\n/* harmony import */ var _screen_fragment_glsl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./screen-fragment.glsl */ \"./Graphics/Context/screen-pass-painter/screen-fragment.glsl\");\n/* harmony import */ var _shader__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _vertex_buffer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _vertex_layout__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../vertex-layout */ \"./Graphics/Context/vertex-layout.ts\");\n\n\n\n\n\n/**\n * This is responsible for painting the entire screen during the render passes\n */\nclass ScreenPassPainter {\n constructor(gl) {\n this._gl = gl;\n this._shader = new _shader__WEBPACK_IMPORTED_MODULE_0__.Shader({\n gl,\n vertexSource: _screen_vertex_glsl__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n fragmentSource: _screen_fragment_glsl__WEBPACK_IMPORTED_MODULE_2__[\"default\"]\n });\n this._shader.compile();\n // Setup memory layout\n this._buffer = new _vertex_buffer__WEBPACK_IMPORTED_MODULE_3__.VertexBuffer({\n gl,\n type: 'static',\n // clip space quad + uv since we don't need a camera\n data: new Float32Array([\n -1, -1, 0, 0, -1, 1, 0, 1, 1, -1, 1, 0,\n 1, -1, 1, 0, -1, 1, 0, 1, 1, 1, 1, 1\n ])\n });\n this._layout = new _vertex_layout__WEBPACK_IMPORTED_MODULE_4__.VertexLayout({\n gl,\n shader: this._shader,\n vertexBuffer: this._buffer,\n attributes: [\n ['a_position', 2],\n ['a_texcoord', 2]\n ]\n });\n this._buffer.upload();\n }\n renderWithPostProcessor(postprocessor) {\n const gl = this._gl;\n postprocessor.getShader().use();\n postprocessor.getLayout().use();\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n }\n renderToScreen() {\n const gl = this._gl;\n this._shader.use();\n this._layout.use();\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/shader.ts\":\n/*!************************************!*\\\n !*** ./Graphics/Context/shader.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Shader: () => (/* binding */ Shader)\n/* harmony export */ });\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../.. */ \"./Util/Log.ts\");\n/* harmony import */ var _webgl_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./webgl-util */ \"./Graphics/Context/webgl-util.ts\");\n\n\nclass Shader {\n get compiled() {\n return this._compiled;\n }\n /**\n * Create a shader program in excalibur\n * @param options specify shader vertex and fragment source\n */\n constructor(options) {\n this._logger = ___WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance();\n this.uniforms = {};\n this.attributes = {};\n this._compiled = false;\n const { gl, vertexSource, fragmentSource, onPreLink, onPostCompile } = options;\n this._gl = gl;\n this.vertexSource = vertexSource;\n this.fragmentSource = fragmentSource;\n this._onPreLink = onPreLink;\n this._onPostCompile = onPostCompile;\n }\n dispose() {\n const gl = this._gl;\n gl.deleteProgram(this.program);\n this._gl = null;\n }\n /**\n * Binds the shader program\n */\n use() {\n const gl = this._gl;\n gl.useProgram(this.program);\n Shader._ACTIVE_SHADER_INSTANCE = this;\n }\n isCurrentlyBound() {\n return Shader._ACTIVE_SHADER_INSTANCE === this;\n }\n /**\n * Compile the current shader against a webgl context\n */\n compile() {\n const gl = this._gl;\n const vertexShader = this._compileShader(gl, this.vertexSource, gl.VERTEX_SHADER);\n const fragmentShader = this._compileShader(gl, this.fragmentSource, gl.FRAGMENT_SHADER);\n this.program = this._createProgram(gl, vertexShader, fragmentShader);\n const attributes = this.getAttributes();\n for (const attribute of attributes) {\n this.attributes[attribute.name] = attribute;\n }\n const uniforms = this.getUniforms();\n for (const uniform of uniforms) {\n this.uniforms[uniform.name] = uniform;\n }\n this._compiled = true;\n if (this._onPostCompile) {\n this._onPostCompile(this);\n }\n return this.program;\n }\n getUniforms() {\n const gl = this._gl;\n const uniformCount = gl.getProgramParameter(this.program, gl.ACTIVE_UNIFORMS);\n const uniforms = [];\n for (let i = 0; i < uniformCount; i++) {\n const uniform = gl.getActiveUniform(this.program, i);\n const uniformLocation = gl.getUniformLocation(this.program, uniform.name);\n uniforms.push({\n name: uniform.name,\n glType: uniform.type,\n location: uniformLocation\n });\n }\n return uniforms;\n }\n getAttributes() {\n const gl = this._gl;\n const attributeCount = gl.getProgramParameter(this.program, gl.ACTIVE_ATTRIBUTES);\n const attributes = [];\n for (let i = 0; i < attributeCount; i++) {\n const attribute = gl.getActiveAttrib(this.program, i);\n const attributeLocation = gl.getAttribLocation(this.program, attribute.name);\n attributes.push({\n name: attribute.name,\n glType: (0,_webgl_util__WEBPACK_IMPORTED_MODULE_1__.getAttributePointerType)(gl, attribute.type),\n size: (0,_webgl_util__WEBPACK_IMPORTED_MODULE_1__.getAttributeComponentSize)(gl, attribute.type),\n location: attributeLocation,\n normalized: false\n });\n }\n return attributes;\n }\n /**\n * Set a texture in a gpu texture slot\n * @param slotNumber\n * @param texture\n */\n setTexture(slotNumber, texture) {\n const gl = this._gl;\n gl.activeTexture(gl.TEXTURE0 + slotNumber);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n }\n /**\n * Set an integer uniform for the current shader\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n setUniformInt(name, value) {\n this.setUniform('uniform1i', name, ~~value);\n }\n /**\n * Set an integer uniform for the current shader, WILL NOT THROW on error.\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n trySetUniformInt(name, value) {\n return this.trySetUniform('uniform1i', name, ~~value);\n }\n /**\n * Set an integer array uniform for the current shader\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n setUniformIntArray(name, value) {\n this.setUniform('uniform1iv', name, value);\n }\n /**\n * Set an integer array uniform for the current shader, WILL NOT THROW on error.\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n trySetUniformIntArray(name, value) {\n return this.trySetUniform('uniform1iv', name, value);\n }\n /**\n * Set a boolean uniform for the current shader\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n setUniformBoolean(name, value) {\n this.setUniform('uniform1i', name, value ? 1 : 0);\n }\n /**\n * Set a boolean uniform for the current shader, WILL NOT THROW on error.\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n trySetUniformBoolean(name, value) {\n return this.trySetUniform('uniform1i', name, value ? 1 : 0);\n }\n /**\n * Set a float uniform for the current shader\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n setUniformFloat(name, value) {\n this.setUniform('uniform1f', name, value);\n }\n /**\n * Set a float uniform for the current shader, WILL NOT THROW on error.\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n trySetUniformFloat(name, value) {\n return this.trySetUniform('uniform1f', name, value);\n }\n /**\n * Set a float array uniform for the current shader\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n setUniformFloatArray(name, value) {\n this.setUniform('uniform1fv', name, value);\n }\n /**\n * Set a float array uniform for the current shader, WILL NOT THROW on error.\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n trySetUniformFloatArray(name, value) {\n return this.trySetUniform('uniform1fv', name, value);\n }\n /**\n * Set a {@apilink Vector} uniform for the current shader\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n setUniformFloatVector(name, value) {\n this.setUniform('uniform2f', name, value.x, value.y);\n }\n /**\n * Set a {@apilink Vector} uniform for the current shader, WILL NOT THROW on error.\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n trySetUniformFloatVector(name, value) {\n return this.trySetUniform('uniform2f', name, value.x, value.y);\n }\n /**\n * Set a {@apilink Color} uniform for the current shader\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n setUniformFloatColor(name, value) {\n this.setUniform('uniform4f', name, value.r / 255, value.g / 255, value.b / 255, value.a);\n }\n /**\n * Set a {@apilink Color} uniform for the current shader, WILL NOT THROW on error.\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n trySetUniformFloatColor(name, value) {\n return this.trySetUniform('uniform4f', name, value.r / 255, value.g / 255, value.b / 255, value.a);\n }\n /**\n * Set an {@apilink Matrix} uniform for the current shader\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n setUniformMatrix(name, value) {\n this.setUniform('uniformMatrix4fv', name, false, value.data);\n }\n setUniformAffineMatrix(name, value) {\n this.setUniform('uniformMatrix4fv', name, false, [\n value.data[0],\n value.data[1],\n 0,\n 0,\n value.data[2],\n value.data[3],\n 0,\n 0,\n 0,\n 0,\n 1,\n 0,\n value.data[4],\n value.data[5],\n 0,\n 1\n ]);\n }\n /**\n * Set an {@apilink Matrix} uniform for the current shader, WILL NOT THROW on error.\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n trySetUniformMatrix(name, value) {\n return this.trySetUniform('uniformMatrix4fv', name, false, value.data);\n }\n /**\n * Set any available uniform type in webgl\n *\n * For example setUniform('uniformMatrix2fv', 'u_my2x2_mat`, ...);\n */\n setUniform(uniformType, name, ...value) {\n if (!this._compiled) {\n throw Error(`Must compile shader before setting a uniform ${uniformType}:${name}`);\n }\n if (!this.isCurrentlyBound()) {\n throw Error('Currently accessed shader instance is not the current active shader in WebGL,' +\n ' must call `shader.use()` before setting uniforms');\n }\n const gl = this._gl;\n const location = gl.getUniformLocation(this.program, name);\n if (location) {\n const args = [location, ...value];\n this._gl[uniformType].apply(this._gl, args);\n }\n else {\n throw Error(`Uniform ${uniformType}:${name} doesn\\'t exist or is not used in the shader source code,` +\n ' unused uniforms are optimized away by most browsers');\n }\n }\n /**\n * Set any available uniform type in webgl. Will try to set the uniform, will return false if the uniform didn't exist,\n * true if it was set.\n *\n * WILL NOT THROW on error\n *\n * For example setUniform('uniformMatrix2fv', 'u_my2x2_mat`, ...);\n *\n */\n trySetUniform(uniformType, name, ...value) {\n if (!this._compiled) {\n this._logger.warn(`Must compile shader before setting a uniform ${uniformType}:${name}`);\n return false;\n }\n if (!this.isCurrentlyBound()) {\n this._logger.warn('Currently accessed shader instance is not the current active shader in WebGL,' +\n ' must call `shader.use()` before setting uniforms');\n return false;\n }\n const gl = this._gl;\n const location = gl.getUniformLocation(this.program, name);\n if (location) {\n const args = [location, ...value];\n this._gl[uniformType].apply(this._gl, args);\n }\n else {\n return false;\n }\n return true;\n }\n _createProgram(gl, vertexShader, fragmentShader) {\n const program = gl.createProgram();\n if (program === null) {\n throw Error('Could not create graphics shader program');\n }\n // attach the shaders.\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n if (this._onPreLink) {\n this._onPreLink(program);\n }\n // link the program.\n gl.linkProgram(program);\n const success = gl.getProgramParameter(program, gl.LINK_STATUS);\n if (!success) {\n throw Error(`Could not link the program: [${gl.getProgramInfoLog(program)}]`);\n }\n return program;\n }\n _compileShader(gl, source, type) {\n const typeName = gl.VERTEX_SHADER === type ? 'vertex' : 'fragment';\n const shader = gl.createShader(type);\n if (shader === null) {\n throw Error(`Could not build shader: [${source}]`);\n }\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n const success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n if (!success) {\n const errorInfo = gl.getShaderInfoLog(shader);\n throw Error(`Could not compile ${typeName} shader:\\n\\n${errorInfo}${this._processSourceForError(source, errorInfo)}`);\n }\n return shader;\n }\n _processSourceForError(source, errorInfo) {\n if (!source) {\n return errorInfo;\n }\n const lines = source.split('\\n');\n const errorLineStart = errorInfo.search(/\\d:\\d/);\n const errorLineEnd = errorInfo.indexOf(' ', errorLineStart);\n const [_, error2] = errorInfo\n .slice(errorLineStart, errorLineEnd)\n .split(':')\n .map((v) => Number(v));\n for (let i = 0; i < lines.length; i++) {\n lines[i] = `${i + 1}: ${lines[i]}${error2 === i + 1 ? ' <----- ERROR!' : ''}`;\n }\n return '\\n\\nSource:\\n' + lines.join('\\n');\n }\n}\nShader._ACTIVE_SHADER_INSTANCE = null;\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/state-stack.ts\":\n/*!*****************************************!*\\\n !*** ./Graphics/Context/state-stack.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ContextState: () => (/* binding */ ContextState),\n/* harmony export */ StateStack: () => (/* binding */ StateStack)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Color */ \"./Color.ts\");\n/* harmony import */ var _Util_RentalPool__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Util/RentalPool */ \"./Util/RentalPool.ts\");\n\n\nclass ContextState {\n constructor() {\n this.opacity = 1;\n this.z = 0;\n this.tint = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.White;\n this.material = null;\n }\n}\nclass StateStack {\n constructor() {\n this._pool = new _Util_RentalPool__WEBPACK_IMPORTED_MODULE_1__.RentalPool(() => new ContextState(), (s) => {\n s.opacity = 1;\n s.z = 0;\n s.tint = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.White;\n s.material = null;\n return s;\n }, 100);\n this.current = this._pool.rent(true);\n this._states = [];\n }\n _cloneState(dest) {\n var _a;\n dest.opacity = this.current.opacity;\n dest.z = this.current.z;\n dest.tint = (_a = this.current.tint) === null || _a === void 0 ? void 0 : _a.clone();\n dest.material = this.current.material; // TODO is this going to cause problems when cloning\n return dest;\n }\n save() {\n this._states.push(this.current);\n this.current = this._cloneState(this._pool.rent());\n }\n restore() {\n this._pool.return(this.current);\n this.current = this._states.pop();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/texture-loader.ts\":\n/*!********************************************!*\\\n !*** ./Graphics/Context/texture-loader.ts ***!\n \\********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TextureLoader: () => (/* binding */ TextureLoader)\n/* harmony export */ });\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Wrapping */ \"./Graphics/Wrapping.ts\");\n\n\n\n/**\n * Manages loading image sources into webgl textures, a unique id is associated with all sources\n */\nclass TextureLoader {\n constructor(gl, _garbageCollector) {\n var _a;\n this._garbageCollector = _garbageCollector;\n this._textureMap = new Map();\n /**\n * Looks for textures that haven't been drawn in a while\n */\n this._collect = (image) => {\n var _a;\n if (this._gl) {\n const name = (_a = image.dataset.originalSrc) !== null && _a !== void 0 ? _a : image.constructor.name;\n TextureLoader._LOGGER.debug(`WebGL Texture for ${name} collected`);\n this.delete(image);\n return true;\n }\n return false;\n };\n this._gl = gl;\n TextureLoader._MAX_TEXTURE_SIZE = gl.getParameter(gl.MAX_TEXTURE_SIZE);\n if (this._garbageCollector) {\n TextureLoader._LOGGER.debug('WebGL Texture collection interval:', this._garbageCollector.collectionInterval);\n (_a = this._garbageCollector.garbageCollector) === null || _a === void 0 ? void 0 : _a.registerCollector('texture', this._garbageCollector.collectionInterval, this._collect);\n }\n }\n dispose() {\n for (const [image] of this._textureMap) {\n this.delete(image);\n }\n this._textureMap.clear();\n this._gl = null;\n }\n /**\n * Get the WebGL Texture from a source image\n * @param image\n */\n get(image) {\n return this._textureMap.get(image);\n }\n /**\n * Returns whether a source image has been loaded as a texture\n * @param image\n */\n has(image) {\n return this._textureMap.has(image);\n }\n /**\n * Loads a graphic into webgl and returns it's texture info, a webgl context must be previously registered\n * @param image Source graphic\n * @param options {ImageSourceOptions} Optionally configure the ImageFiltering and ImageWrapping mode to apply to the loaded texture\n * @param forceUpdate Optionally force a texture to be reloaded, useful if the source graphic has changed\n */\n load(image, options, forceUpdate = false) {\n var _a, _b;\n // Ignore loading if webgl is not registered\n const gl = this._gl;\n if (!gl) {\n return null;\n }\n const { filtering, wrapping } = { ...options };\n let tex = null;\n // If reuse the texture if it's from the same source\n if (this.has(image)) {\n tex = this.get(image);\n }\n // Update existing webgl texture and return early\n if (tex) {\n if (forceUpdate) {\n gl.bindTexture(gl.TEXTURE_2D, tex);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);\n }\n (_a = this._garbageCollector) === null || _a === void 0 ? void 0 : _a.garbageCollector.touch(image);\n return tex;\n }\n // No texture exists create a new one\n tex = gl.createTexture();\n // TODO implement texture gc with weakmap and timer\n TextureLoader.checkImageSizeSupportedAndLog(image);\n gl.bindTexture(gl.TEXTURE_2D, tex);\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);\n let wrappingConfig;\n if (wrapping) {\n if (typeof wrapping === 'string') {\n wrappingConfig = {\n x: wrapping,\n y: wrapping\n };\n }\n else {\n wrappingConfig = {\n x: wrapping.x,\n y: wrapping.y\n };\n }\n }\n const { x: xWrap, y: yWrap } = wrappingConfig !== null && wrappingConfig !== void 0 ? wrappingConfig : TextureLoader.wrapping;\n switch (xWrap) {\n case _Wrapping__WEBPACK_IMPORTED_MODULE_0__.ImageWrapping.Clamp:\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n break;\n case _Wrapping__WEBPACK_IMPORTED_MODULE_0__.ImageWrapping.Repeat:\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT);\n break;\n case _Wrapping__WEBPACK_IMPORTED_MODULE_0__.ImageWrapping.Mirror:\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.MIRRORED_REPEAT);\n break;\n default:\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n }\n switch (yWrap) {\n case _Wrapping__WEBPACK_IMPORTED_MODULE_0__.ImageWrapping.Clamp:\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n break;\n case _Wrapping__WEBPACK_IMPORTED_MODULE_0__.ImageWrapping.Repeat:\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT);\n break;\n case _Wrapping__WEBPACK_IMPORTED_MODULE_0__.ImageWrapping.Mirror:\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.MIRRORED_REPEAT);\n break;\n default:\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n }\n // NEAREST for pixel art, LINEAR for hi-res\n const filterMode = filtering !== null && filtering !== void 0 ? filtering : TextureLoader.filtering;\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filterMode === _Filtering__WEBPACK_IMPORTED_MODULE_1__.ImageFiltering.Pixel ? gl.NEAREST : gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filterMode === _Filtering__WEBPACK_IMPORTED_MODULE_1__.ImageFiltering.Pixel ? gl.NEAREST : gl.LINEAR);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);\n this._textureMap.set(image, tex);\n (_b = this._garbageCollector) === null || _b === void 0 ? void 0 : _b.garbageCollector.addCollectableResource('texture', image);\n return tex;\n }\n delete(image) {\n // Ignore loading if webgl is not registered\n const gl = this._gl;\n if (!gl) {\n return;\n }\n if (this.has(image)) {\n const texture = this.get(image);\n if (texture) {\n this._textureMap.delete(image);\n gl.deleteTexture(texture);\n }\n }\n }\n /**\n * Takes an image and returns if it meets size criteria for hardware\n * @param image\n * @returns if the image will be supported at runtime\n */\n static checkImageSizeSupportedAndLog(image) {\n var _a;\n const originalSrc = (_a = image.dataset.originalSrc) !== null && _a !== void 0 ? _a : 'internal canvas bitmap';\n if (image.width > TextureLoader._MAX_TEXTURE_SIZE || image.height > TextureLoader._MAX_TEXTURE_SIZE) {\n TextureLoader._LOGGER.error(`The image [${originalSrc}] provided to Excalibur is too large for the device's maximum texture size of ` +\n `(${TextureLoader._MAX_TEXTURE_SIZE}x${TextureLoader._MAX_TEXTURE_SIZE}) please resize to an image ` +\n `for excalibur to render properly.\\n\\nImages will likely render as black rectangles.\\n\\n` +\n `Read more here: https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/WebGL_best_practices#understand_system_limits`);\n return false;\n }\n else if (image.width > 4096 || image.height > 4096) {\n // https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/WebGL_best_practices#understand_system_limits\n TextureLoader._LOGGER.warn(`The image [${originalSrc}] provided to excalibur is too large may not work on all mobile devices, ` +\n `it is recommended you resize images to a maximum (4096x4096).\\n\\n` +\n `Images will likely render as black rectangles on some mobile platforms.\\n\\n` +\n `Read more here: https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/WebGL_best_practices#understand_system_limits`);\n }\n return true;\n }\n}\nTextureLoader._LOGGER = _Util_Log__WEBPACK_IMPORTED_MODULE_2__.Logger.getInstance();\n/**\n * Sets the default filtering for the Excalibur texture loader, default {@apilink ImageFiltering.Blended}\n */\nTextureLoader.filtering = _Filtering__WEBPACK_IMPORTED_MODULE_1__.ImageFiltering.Blended;\nTextureLoader.wrapping = { x: _Wrapping__WEBPACK_IMPORTED_MODULE_0__.ImageWrapping.Clamp, y: _Wrapping__WEBPACK_IMPORTED_MODULE_0__.ImageWrapping.Clamp };\nTextureLoader._MAX_TEXTURE_SIZE = 4096;\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/transform-stack.ts\":\n/*!*********************************************!*\\\n !*** ./Graphics/Context/transform-stack.ts ***!\n \\*********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TransformStack: () => (/* binding */ TransformStack)\n/* harmony export */ });\n/* harmony import */ var _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/affine-matrix */ \"./Math/affine-matrix.ts\");\n/* harmony import */ var _Util_RentalPool__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Util/RentalPool */ \"./Util/RentalPool.ts\");\n\n\nclass TransformStack {\n constructor() {\n this._pool = new _Util_RentalPool__WEBPACK_IMPORTED_MODULE_0__.RentalPool(() => _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_1__.AffineMatrix.identity(), (mat) => mat.reset(), 100);\n this._transforms = [];\n this._currentTransform = this._pool.rent(true);\n }\n save() {\n this._transforms.push(this._currentTransform);\n this._currentTransform = this._currentTransform.clone(this._pool.rent());\n }\n restore() {\n this._pool.return(this._currentTransform);\n this._currentTransform = this._transforms.pop();\n }\n translate(x, y) {\n return this._currentTransform.translate(x, y);\n }\n rotate(angle) {\n return this._currentTransform.rotate(angle);\n }\n scale(x, y) {\n return this._currentTransform.scale(x, y);\n }\n reset() {\n this._currentTransform.reset();\n }\n set current(matrix) {\n this._currentTransform = matrix;\n }\n get current() {\n return this._currentTransform;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/vertex-buffer.ts\":\n/*!*******************************************!*\\\n !*** ./Graphics/Context/vertex-buffer.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ VertexBuffer: () => (/* binding */ VertexBuffer)\n/* harmony export */ });\n/**\n * Helper around vertex buffer to simplify creating and uploading geometry\n *\n * Under the hood uses Float32Array\n */\nclass VertexBuffer {\n constructor(options) {\n /**\n * If the vertices never change switching 'static' can be more efficient on the gpu\n *\n * Default is 'dynamic'\n */\n this.type = 'dynamic';\n const { gl, size, type, data } = options;\n this._gl = gl;\n this.buffer = this._gl.createBuffer();\n if (!data && !size) {\n throw Error('Must either provide data or a size to the VertexBuffer');\n }\n if (!data) {\n this.bufferData = new Float32Array(size);\n }\n else {\n this.bufferData = data;\n }\n this.type = type !== null && type !== void 0 ? type : this.type;\n // Allocate buffer\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer);\n gl.bufferData(gl.ARRAY_BUFFER, this.bufferData, this.type === 'static' ? gl.STATIC_DRAW : gl.DYNAMIC_DRAW);\n }\n /**\n * Bind this vertex buffer\n */\n bind() {\n const gl = this._gl;\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer);\n }\n unbind() {\n const gl = this._gl;\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n }\n /**\n * Upload vertex buffer geometry to the GPU\n */\n upload(count) {\n const gl = this._gl;\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer);\n if (count) {\n gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.bufferData, 0, count);\n }\n else {\n // TODO always use bufferSubData? need to perf test it\n gl.bufferData(gl.ARRAY_BUFFER, this.bufferData, this.type === 'static' ? gl.STATIC_DRAW : gl.DYNAMIC_DRAW);\n }\n }\n dispose() {\n const gl = this._gl;\n gl.deleteBuffer(this.buffer);\n this._gl = null;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/vertex-layout.ts\":\n/*!*******************************************!*\\\n !*** ./Graphics/Context/vertex-layout.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ VertexLayout: () => (/* binding */ VertexLayout)\n/* harmony export */ });\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../.. */ \"./Util/Log.ts\");\n/* harmony import */ var _webgl_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./webgl-util */ \"./Graphics/Context/webgl-util.ts\");\n\n\n/**\n * Helper around creating vertex attributes in a given {@apilink VertexBuffer}, this is useful for describing\n * the memory layout for your vertices inside a particular buffer\n *\n * Note: This helper assumes interleaved attributes in one {@apilink VertexBuffer}, not many.\n *\n * Working with `gl.vertexAttribPointer` can be tricky, and this attempts to double check you\n */\nclass VertexLayout {\n get vertexBuffer() {\n return this._vertexBuffer;\n }\n get attributes() {\n return this._attributes;\n }\n constructor(options) {\n this._logger = ___WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance();\n this._suppressWarnings = false;\n this._layout = [];\n this._attributes = [];\n this._vertexTotalSizeBytes = 0;\n this._initialized = false;\n const { gl, shader, vertexBuffer, attributes, suppressWarnings } = options;\n this._gl = gl;\n this._vertexBuffer = vertexBuffer;\n this._attributes = attributes;\n this._shader = shader;\n this._suppressWarnings = suppressWarnings;\n if (shader) {\n this.initialize();\n }\n }\n /**\n * Total number of bytes that the vertex will take up\n */\n get totalVertexSizeBytes() {\n return this._vertexTotalSizeBytes;\n }\n set shader(shader) {\n if (shader && this._shader !== shader) {\n this._shader = shader;\n this.initialize();\n }\n }\n get shader() {\n return this._shader;\n }\n /**\n * Layouts need shader locations and must be bound to a shader\n */\n initialize() {\n if (this._initialized) {\n return;\n }\n if (!this._shader) {\n return;\n }\n if (!this._shader.compiled) {\n throw Error('Shader not compiled, shader must be compiled before defining a vertex layout');\n }\n this._vertexTotalSizeBytes = 0;\n this._layout.length = 0;\n const shaderAttributes = this._shader.attributes;\n for (const attribute of this._attributes) {\n const attrib = shaderAttributes[attribute[0]];\n if (!attrib) {\n if (!(0,_webgl_util__WEBPACK_IMPORTED_MODULE_1__.isAttributeInSource)(this._shader.vertexSource, attribute[0])) {\n throw Error(`The attribute named: ${attribute[0]} size ${attribute[1]}` +\n ` not found in the shader source code:\\n ${this._shader.vertexSource}`);\n }\n if (!this._suppressWarnings) {\n this._logger.warn(`The attribute named: ${attribute[0]} size ${attribute[1]}` +\n ` not found in the compiled shader. This is possibly a bug:\\n` +\n ` 1. Not a bug, but should remove unused code - attribute \"${attribute[0]}\" is unused in` +\n ` vertex/fragment and has been automatically removed by glsl compiler.\\n` +\n ` 2. Definitely a bug, attribute \"${attribute[0]}\" in layout has been mistyped or is missing` +\n ` in shader, check vertex/fragment source.`);\n }\n const glType = (0,_webgl_util__WEBPACK_IMPORTED_MODULE_1__.getGLTypeFromSource)(this._gl, this._shader.vertexSource, attribute[0]);\n // Unused attribute placeholder\n this._layout.push({\n name: attribute[0],\n glType,\n size: attribute[1],\n location: -1,\n normalized: false\n });\n }\n if (attrib) {\n if (attrib.size !== attribute[1]) {\n throw Error(`VertexLayout size definition for attribute: [${attribute[0]}, ${attribute[1]}],` +\n ` doesn\\'t match shader source size ${attrib.size}:\\n ${this._shader.vertexSource}`);\n }\n this._layout.push(attrib);\n }\n }\n // calc size\n let componentsPerVertex = 0;\n for (const vertAttribute of this._layout) {\n const typeSize = (0,_webgl_util__WEBPACK_IMPORTED_MODULE_1__.getGlTypeSizeBytes)(this._gl, vertAttribute.glType);\n this._vertexTotalSizeBytes += typeSize * vertAttribute.size;\n componentsPerVertex += vertAttribute.size;\n }\n if (this._vertexBuffer.bufferData.length % componentsPerVertex !== 0) {\n this._logger.warn(`The vertex component size (${componentsPerVertex}) does NOT divide evenly into the specified vertex buffer` +\n ` (${this._vertexBuffer.bufferData.length})`);\n }\n // create VAO\n const gl = this._gl;\n this._vao = gl.createVertexArray();\n gl.bindVertexArray(this._vao);\n this._vertexBuffer.bind();\n let offset = 0;\n for (const vert of this._layout) {\n // skip unused attributes\n if (vert.location !== -1) {\n if (vert.glType === gl.INT) {\n gl.vertexAttribIPointer(vert.location, vert.size, vert.glType, this.totalVertexSizeBytes, offset);\n }\n else {\n gl.vertexAttribPointer(vert.location, vert.size, vert.glType, vert.normalized, this.totalVertexSizeBytes, offset);\n }\n gl.enableVertexAttribArray(vert.location);\n }\n offset += (0,_webgl_util__WEBPACK_IMPORTED_MODULE_1__.getGlTypeSizeBytes)(gl, vert.glType) * vert.size;\n }\n gl.bindVertexArray(null);\n this._vertexBuffer.unbind();\n this._initialized = true;\n }\n /**\n * Bind this layout with it's associated vertex buffer\n * @param uploadBuffer Optionally indicate you wish to upload the buffer to the GPU associated with this layout\n */\n use(uploadBuffer = false, count) {\n if (!this._shader) {\n throw Error('No shader is associated with this vertex layout, a shader must be set');\n }\n const gl = this._gl;\n if (!this._shader.isCurrentlyBound()) {\n throw Error('Shader associated with this vertex layout is not active! Call shader.use() before layout.use()');\n }\n this._vertexBuffer.bind();\n if (uploadBuffer) {\n this._vertexBuffer.upload(count);\n }\n gl.bindVertexArray(this._vao);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/webgl-util.ts\":\n/*!****************************************!*\\\n !*** ./Graphics/Context/webgl-util.ts ***!\n \\****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ getAttributeComponentSize: () => (/* binding */ getAttributeComponentSize),\n/* harmony export */ getAttributePointerType: () => (/* binding */ getAttributePointerType),\n/* harmony export */ getGLTypeFromSource: () => (/* binding */ getGLTypeFromSource),\n/* harmony export */ getGlTypeSizeBytes: () => (/* binding */ getGlTypeSizeBytes),\n/* harmony export */ getMaxShaderComplexity: () => (/* binding */ getMaxShaderComplexity),\n/* harmony export */ isAttributeInSource: () => (/* binding */ isAttributeInSource)\n/* harmony export */ });\n/**\n * Return the size of the GlType in bytes\n * @param gl\n * @param type\n */\nfunction getGlTypeSizeBytes(gl, type) {\n switch (type) {\n case gl.INT:\n case gl.UNSIGNED_INT:\n case gl.FLOAT:\n return 4;\n case gl.SHORT:\n return 2;\n case gl.UNSIGNED_SHORT:\n return 2;\n case gl.BYTE:\n return 1;\n case gl.UNSIGNED_BYTE:\n return 1;\n default:\n return 1;\n }\n}\n/**\n * Checks if an attribute is present in vertex source\n */\nfunction isAttributeInSource(source, variable) {\n const attributeRegexTemplate = `(?[a-z0-9]+)\\\\s+${variable};`;\n const regex = new RegExp(attributeRegexTemplate, 'g');\n const matches = regex.exec(source);\n return (matches === null || matches === void 0 ? void 0 : matches.length) > 0;\n}\n/**\n * Attempt to discern the glType of an attribute from vertex source\n * @param gl\n * @param source\n * @param variable\n */\nfunction getGLTypeFromSource(gl, source, variable) {\n var _a;\n const attributeRegexTemplate = `(?[a-z0-9]+)\\\\s+${variable};`;\n const regex = new RegExp(attributeRegexTemplate, 'g');\n const matches = regex.exec(source);\n const type = (_a = matches === null || matches === void 0 ? void 0 : matches.groups) === null || _a === void 0 ? void 0 : _a.type;\n switch (type) {\n case 'float':\n case 'vec2':\n case 'vec3':\n case 'vec4':\n return gl.FLOAT;\n case 'int':\n case 'ivec2':\n case 'ivec3':\n case 'ivec4':\n return gl.INT;\n case 'uint':\n case 'uvec2':\n case 'uvec3':\n case 'uvec4':\n return gl.UNSIGNED_INT;\n case 'bool':\n case 'bvec2':\n case 'bvec3':\n case 'bvec4':\n return gl.BOOL;\n case 'short':\n return gl.SHORT;\n case 'ushort':\n return gl.UNSIGNED_SHORT;\n case 'ubyte':\n return gl.UNSIGNED_BYTE;\n case 'byte':\n return gl.BYTE;\n default:\n return gl.FLOAT;\n }\n}\n/**\n * Based on the type return the number of attribute components\n *\n * https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/vertexAttribPointer\n * @param gl\n * @param type\n */\nfunction getAttributeComponentSize(gl, type) {\n switch (type) {\n case gl.LOW_FLOAT:\n case gl.HIGH_FLOAT:\n case gl.FLOAT:\n return 1;\n case gl.FLOAT_VEC2:\n return 2;\n case gl.FLOAT_VEC3:\n return 3;\n case gl.FLOAT_VEC4:\n return 4;\n case gl.BYTE:\n return 1;\n case gl.UNSIGNED_BYTE:\n return 1;\n case gl.UNSIGNED_SHORT:\n case gl.SHORT:\n return 1;\n default:\n return 1;\n }\n}\n/**\n * Based on the attribute return the corresponding supported attrib pointer type\n * https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/vertexAttribPointer\n * @param gl\n * @param type\n */\nfunction getAttributePointerType(gl, type) {\n switch (type) {\n case gl.LOW_FLOAT:\n case gl.HIGH_FLOAT:\n case gl.FLOAT:\n case gl.FLOAT_VEC2:\n case gl.FLOAT_VEC3:\n case gl.FLOAT_VEC4:\n return gl.FLOAT;\n case gl.BYTE:\n return gl.BYTE;\n case gl.UNSIGNED_BYTE:\n return gl.UNSIGNED_BYTE;\n case gl.SHORT:\n return gl.SHORT;\n case gl.UNSIGNED_SHORT:\n return gl.UNSIGNED_SHORT;\n default:\n return gl.FLOAT;\n }\n}\n/**\n *\n */\nfunction getMaxShaderComplexity(gl, numIfs) {\n const assembleTestShader = (numIfs) => {\n const testShader = `#version 300 es\r\n precision mediump float;\r\n out vec4 fragColor;\r\n void main() {\r\n float index = 1.01;\r\n %%complexity%%\r\n }`;\n let testComplexity = '';\n for (let i = 0; i < numIfs; i++) {\n if (i === 0) {\n testComplexity += `if (index <= ${i}.5) {\\n`;\n }\n else {\n testComplexity += ` else if (index <= ${i}.5) {\\n`;\n }\n testComplexity += ` fragColor = vec4(1.0);\\n`;\n testComplexity += ` }\\n`;\n }\n return testShader.replace('%%complexity%%', testComplexity);\n };\n let canCompile = false;\n do {\n const test = assembleTestShader(numIfs);\n const shader = gl.createShader(gl.FRAGMENT_SHADER);\n gl.shaderSource(shader, test);\n gl.compileShader(shader);\n canCompile = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n if (!canCompile) {\n numIfs = (numIfs / 2) | 0;\n }\n } while (!canCompile);\n return numIfs;\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Debug.ts\":\n/*!***************************!*\\\n !*** ./Graphics/Debug.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Debug: () => (/* binding */ Debug)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n\nclass Debug {\n static registerGraphicsContext(ctx) {\n Debug._ctx = ctx;\n }\n static draw(debugDrawCall) {\n this._drawCalls.push(debugDrawCall);\n }\n static drawPoint(point, options) {\n Debug.draw((ctx) => {\n ctx.debug.drawPoint(point, options);\n });\n }\n static drawLine(start, end, options) {\n Debug.draw((ctx) => {\n ctx.debug.drawLine(start, end, options);\n });\n }\n static drawLines(points, options) {\n if (points.length > 1) {\n Debug.draw((ctx) => {\n for (let i = 0; i < points.length - 1; i++) {\n ctx.debug.drawLine(points[i], points[i + 1], options);\n }\n });\n }\n }\n static drawText(text, pos) {\n Debug.draw((ctx) => {\n ctx.debug.drawText(text, pos);\n });\n }\n static drawPolygon(points, options) {\n if (points.length > 1) {\n Debug.draw((ctx) => {\n const firstPoint = points[0];\n const polygon = [...points, firstPoint];\n for (let i = 0; i < polygon.length - 1; i++) {\n ctx.debug.drawLine(polygon[i], polygon[i + 1], options);\n }\n });\n }\n }\n static drawCircle(center, radius, options) {\n const { color, strokeColor, width } = {\n color: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Black,\n strokeColor: undefined,\n width: undefined,\n ...options\n };\n Debug.draw((ctx) => {\n ctx.drawCircle(center, radius, color, strokeColor, width);\n });\n }\n static drawBounds(boundingBox, options) {\n Debug.draw((ctx) => {\n ctx.debug.drawRect(boundingBox.left, boundingBox.top, boundingBox.width, boundingBox.height, options);\n });\n }\n static drawRay(ray, options) {\n const { distance, color } = {\n color: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Blue,\n distance: 10,\n ...options\n };\n Debug.draw((ctx) => {\n const start = ray.pos;\n const end = ray.pos.add(ray.dir.scale(distance));\n ctx.debug.drawLine(start, end, { color });\n });\n }\n static flush(ctx) {\n ctx.save();\n ctx.z = Debug.z;\n for (const drawCall of Debug._drawCalls) {\n drawCall(ctx);\n }\n ctx.restore();\n Debug.clear();\n }\n static clear() {\n Debug._drawCalls.length = 0;\n }\n}\nDebug._drawCalls = [];\nDebug.z = Infinity;\n\n\n/***/ }),\n\n/***/ \"./Graphics/DebugGraphicsComponent.ts\":\n/*!********************************************!*\\\n !*** ./Graphics/DebugGraphicsComponent.ts ***!\n \\********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DebugGraphicsComponent: () => (/* binding */ DebugGraphicsComponent)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Component */ \"./EntityComponentSystem/Component.ts\");\n\n/**\n * Provide arbitrary drawing for the purposes of debugging your game\n *\n * Will only show when the Engine is set to debug mode {@apilink Engine.showDebug} or {@apilink Engine.toggleDebug}\n *\n */\nclass DebugGraphicsComponent extends _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor(draw, useTransform = true) {\n super();\n this.draw = draw;\n this.useTransform = useTransform;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Filtering.ts\":\n/*!*******************************!*\\\n !*** ./Graphics/Filtering.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ImageFiltering: () => (/* binding */ ImageFiltering),\n/* harmony export */ parseImageFiltering: () => (/* binding */ parseImageFiltering)\n/* harmony export */ });\n/**\n * Describes the different image filtering modes\n */\nvar ImageFiltering;\n(function (ImageFiltering) {\n /**\n * Pixel is useful when you do not want smoothing aka antialiasing applied to your graphics.\n *\n * Useful for Pixel art aesthetics.\n */\n ImageFiltering[\"Pixel\"] = \"Pixel\";\n /**\n * Blended is useful when you have high resolution artwork and would like it blended and smoothed\n */\n ImageFiltering[\"Blended\"] = \"Blended\";\n})(ImageFiltering || (ImageFiltering = {}));\n/**\n * Parse the image filtering attribute value, if it doesn't match returns null\n */\nfunction parseImageFiltering(val) {\n switch (val) {\n case ImageFiltering.Pixel:\n return ImageFiltering.Pixel;\n case ImageFiltering.Blended:\n return ImageFiltering.Blended;\n default:\n return undefined;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Font.ts\":\n/*!**************************!*\\\n !*** ./Graphics/Font.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Font: () => (/* binding */ Font)\n/* harmony export */ });\n/* harmony import */ var _Collision_Index__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Collision/Index */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _FontCommon__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./FontCommon */ \"./Graphics/FontCommon.ts\");\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _FontTextInstance__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./FontTextInstance */ \"./Graphics/FontTextInstance.ts\");\n/* harmony import */ var _FontCache__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./FontCache */ \"./Graphics/FontCache.ts\");\n\n\n\n\n\n\n\n/**\n * Represents a system or web font in Excalibur\n *\n * If no options specified, the system sans-serif 10 pixel is used\n *\n * If loading a custom web font be sure to have the font loaded before you use it https://erikonarheim.com/posts/dont-test-fonts/\n */\nclass Font extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n constructor(options = {}) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v;\n super(options); // <- Graphics properties\n /**\n * Set the font filtering mode, by default set to {@apilink ImageFiltering.Blended} regardless of the engine default smoothing\n *\n * If you have a pixel style font that may be a reason to switch this to {@apilink ImageFiltering.Pixel}\n */\n this.filtering = _Filtering__WEBPACK_IMPORTED_MODULE_1__.ImageFiltering.Blended;\n /**\n * Font quality determines the size of the underlying raster text, higher quality means less jagged edges.\n * If quality is set to 1, then just enough raster bitmap is generated to render the text.\n *\n * You can think of quality as how zoomed in to the text you can get before seeing jagged edges.\n *\n * (Default 2)\n */\n this.quality = 2;\n // Raster properties for fonts\n this.padding = 2;\n this.smoothing = false;\n this.lineWidth = 1;\n this.lineDash = [];\n this.color = _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Black;\n this.family = 'sans-serif';\n this.style = _FontCommon__WEBPACK_IMPORTED_MODULE_3__.FontStyle.Normal;\n this.bold = false;\n this.unit = _FontCommon__WEBPACK_IMPORTED_MODULE_3__.FontUnit.Px;\n this.textAlign = _FontCommon__WEBPACK_IMPORTED_MODULE_3__.TextAlign.Left;\n this.baseAlign = _FontCommon__WEBPACK_IMPORTED_MODULE_3__.BaseAlign.Top;\n this.direction = _FontCommon__WEBPACK_IMPORTED_MODULE_3__.Direction.LeftToRight;\n /**\n * Font line height in pixels, default line height if unset\n */\n this.lineHeight = undefined;\n this.size = 10;\n this._textBounds = new _Collision_Index__WEBPACK_IMPORTED_MODULE_4__.BoundingBox();\n this._textMeasurement = new _FontTextInstance__WEBPACK_IMPORTED_MODULE_5__.FontTextInstance(this, '', _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Black);\n // Raster properties\n this.smoothing = (_a = options === null || options === void 0 ? void 0 : options.smoothing) !== null && _a !== void 0 ? _a : this.smoothing;\n this.padding = (_b = options === null || options === void 0 ? void 0 : options.padding) !== null && _b !== void 0 ? _b : this.padding;\n this.color = (_c = options === null || options === void 0 ? void 0 : options.color) !== null && _c !== void 0 ? _c : this.color;\n this.strokeColor = (_d = options === null || options === void 0 ? void 0 : options.strokeColor) !== null && _d !== void 0 ? _d : this.strokeColor;\n this.lineDash = (_e = options === null || options === void 0 ? void 0 : options.lineDash) !== null && _e !== void 0 ? _e : this.lineDash;\n this.lineWidth = (_f = options === null || options === void 0 ? void 0 : options.lineWidth) !== null && _f !== void 0 ? _f : this.lineWidth;\n this.filtering = (_g = options === null || options === void 0 ? void 0 : options.filtering) !== null && _g !== void 0 ? _g : this.filtering;\n // Font specific properties\n this.family = (_h = options === null || options === void 0 ? void 0 : options.family) !== null && _h !== void 0 ? _h : this.family;\n this.style = (_j = options === null || options === void 0 ? void 0 : options.style) !== null && _j !== void 0 ? _j : this.style;\n this.bold = (_k = options === null || options === void 0 ? void 0 : options.bold) !== null && _k !== void 0 ? _k : this.bold;\n this.size = (_l = options === null || options === void 0 ? void 0 : options.size) !== null && _l !== void 0 ? _l : this.size;\n this.unit = (_m = options === null || options === void 0 ? void 0 : options.unit) !== null && _m !== void 0 ? _m : this.unit;\n this.textAlign = (_o = options === null || options === void 0 ? void 0 : options.textAlign) !== null && _o !== void 0 ? _o : this.textAlign;\n this.baseAlign = (_p = options === null || options === void 0 ? void 0 : options.baseAlign) !== null && _p !== void 0 ? _p : this.baseAlign;\n this.direction = (_q = options === null || options === void 0 ? void 0 : options.direction) !== null && _q !== void 0 ? _q : this.direction;\n this.lineHeight = (_r = options === null || options === void 0 ? void 0 : options.lineHeight) !== null && _r !== void 0 ? _r : this.lineHeight;\n this.quality = (_s = options === null || options === void 0 ? void 0 : options.quality) !== null && _s !== void 0 ? _s : this.quality;\n if (options === null || options === void 0 ? void 0 : options.shadow) {\n this.shadow = {};\n this.shadow.blur = (_t = options.shadow.blur) !== null && _t !== void 0 ? _t : this.shadow.blur;\n this.shadow.offset = (_u = options.shadow.offset) !== null && _u !== void 0 ? _u : this.shadow.offset;\n this.shadow.color = (_v = options.shadow.color) !== null && _v !== void 0 ? _v : this.shadow.color;\n }\n }\n clone() {\n return new Font({\n ...this.cloneGraphicOptions(),\n size: this.size,\n unit: this.unit,\n family: this.family,\n style: this.style,\n bold: this.bold,\n textAlign: this.textAlign,\n baseAlign: this.baseAlign,\n direction: this.direction,\n shadow: this.shadow\n ? {\n blur: this.shadow.blur,\n offset: this.shadow.offset,\n color: this.shadow.color\n }\n : undefined\n });\n }\n get fontString() {\n return `${this.style} ${this.bold ? 'bold' : ''} ${this.size}${this.unit} ${this.family}`;\n }\n get localBounds() {\n return this._textBounds;\n }\n _drawImage(_ex, _x, _y) {\n // TODO weird vestigial drawimage\n }\n _rotate(ex) {\n var _a;\n // TODO this needs to change depending on the bounding box...\n const origin = (_a = this.origin) !== null && _a !== void 0 ? _a : this._textBounds.center;\n ex.translate(origin.x, origin.y);\n ex.rotate(this.rotation);\n ex.translate(-origin.x, -origin.y);\n }\n _flip(ex) {\n if (this.flipHorizontal) {\n ex.translate(this._textBounds.width / this.scale.x, 0);\n ex.scale(-1, 1);\n }\n if (this.flipVertical) {\n ex.translate(0, -this._textBounds.height / 2 / this.scale.y);\n ex.scale(1, -1);\n }\n }\n measureTextWithoutCache(text, maxWidth) {\n return this._textMeasurement.measureText(text, maxWidth);\n }\n /**\n * Returns a BoundingBox that is the total size of the text including multiple lines\n *\n * Does not include any padding or adjustment\n * @param text\n * @returns BoundingBox\n */\n measureText(text, maxWidth) {\n return _FontCache__WEBPACK_IMPORTED_MODULE_6__.FontCache.measureText(text, this, maxWidth);\n }\n _postDraw(ex) {\n ex.restore();\n }\n render(ex, text, colorOverride, x, y, maxWidth) {\n const textInstance = _FontCache__WEBPACK_IMPORTED_MODULE_6__.FontCache.getTextInstance(text, this, colorOverride);\n // Apply affine transformations\n this._textBounds = textInstance.dimensions;\n this._preDraw(ex, x, y);\n textInstance.render(ex, x, y, maxWidth);\n this._postDraw(ex);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/FontCache.ts\":\n/*!*******************************!*\\\n !*** ./Graphics/FontCache.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FontCache: () => (/* binding */ FontCache)\n/* harmony export */ });\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _FontTextInstance__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./FontTextInstance */ \"./Graphics/FontTextInstance.ts\");\n\n\nclass FontCache {\n static measureText(text, font, maxWidth) {\n const hash = _FontTextInstance__WEBPACK_IMPORTED_MODULE_0__.FontTextInstance.getHashCode(font, text);\n if (FontCache._MEASURE_CACHE.has(hash)) {\n return FontCache._MEASURE_CACHE.get(hash);\n }\n FontCache._LOGGER.debug('Font text measurement cache miss');\n const measurement = font.measureTextWithoutCache(text, maxWidth);\n FontCache._MEASURE_CACHE.set(hash, measurement);\n return measurement;\n }\n static getTextInstance(text, font, color) {\n const hash = _FontTextInstance__WEBPACK_IMPORTED_MODULE_0__.FontTextInstance.getHashCode(font, text, color);\n let textInstance = FontCache._TEXT_CACHE.get(hash);\n if (!textInstance) {\n textInstance = new _FontTextInstance__WEBPACK_IMPORTED_MODULE_0__.FontTextInstance(font, text, color);\n FontCache._TEXT_CACHE.set(hash, textInstance);\n FontCache._LOGGER.debug('Font text instance cache miss');\n }\n // Cache the bitmap for certain amount of time\n FontCache._TEXT_USAGE.set(textInstance, performance.now());\n return textInstance;\n }\n static checkAndClearCache() {\n const deferred = [];\n const currentHashCodes = new Set();\n for (const [textInstance, time] of FontCache._TEXT_USAGE.entries()) {\n // if bitmap hasn't been used in 100 ms clear it\n if (time + FontCache.FONT_TIMEOUT < performance.now()) {\n FontCache._LOGGER.debug(`Text cache entry timed out ${textInstance.text}`);\n deferred.push(textInstance);\n textInstance.dispose();\n }\n else {\n const hash = textInstance.getHashCode(false);\n currentHashCodes.add(hash);\n }\n }\n // Deferred removal of text instances\n deferred.forEach((t) => {\n FontCache._TEXT_USAGE.delete(t);\n });\n // Regenerate text instance cache\n this._TEXT_CACHE.clear();\n for (const [textInstance] of this._TEXT_USAGE.entries()) {\n this._TEXT_CACHE.set(textInstance.getHashCode(), textInstance);\n }\n // Regenerated measurement cache\n const newTextMeasurementCache = new Map();\n for (const current of currentHashCodes) {\n if (FontCache._MEASURE_CACHE.has(current)) {\n newTextMeasurementCache.set(current, FontCache._MEASURE_CACHE.get(current));\n }\n }\n this._MEASURE_CACHE.clear();\n this._MEASURE_CACHE = newTextMeasurementCache;\n }\n static get cacheSize() {\n return FontCache._TEXT_USAGE.size;\n }\n /**\n * Force clear all cached text bitmaps\n */\n static clearCache() {\n for (const [textInstance] of FontCache._TEXT_USAGE.entries()) {\n textInstance.dispose();\n }\n FontCache._TEXT_USAGE.clear();\n FontCache._TEXT_CACHE.clear();\n FontCache._MEASURE_CACHE.clear();\n }\n}\nFontCache.FONT_TIMEOUT = 500;\nFontCache._LOGGER = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\nFontCache._TEXT_USAGE = new Map();\nFontCache._TEXT_CACHE = new Map();\nFontCache._MEASURE_CACHE = new Map();\n\n\n/***/ }),\n\n/***/ \"./Graphics/FontCommon.ts\":\n/*!********************************!*\\\n !*** ./Graphics/FontCommon.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BaseAlign: () => (/* binding */ BaseAlign),\n/* harmony export */ Direction: () => (/* binding */ Direction),\n/* harmony export */ FontStyle: () => (/* binding */ FontStyle),\n/* harmony export */ FontUnit: () => (/* binding */ FontUnit),\n/* harmony export */ TextAlign: () => (/* binding */ TextAlign)\n/* harmony export */ });\n/**\n * Enum representing the different font size units\n * https://developer.mozilla.org/en-US/docs/Web/CSS/font-size\n */\nvar FontUnit;\n(function (FontUnit) {\n /**\n * Em is a scalable unit, 1 em is equal to the current font size of the current element, parent elements can effect em values\n */\n FontUnit[\"Em\"] = \"em\";\n /**\n * Rem is similar to the Em, it is a scalable unit. 1 rem is equal to the font size of the root element\n */\n FontUnit[\"Rem\"] = \"rem\";\n /**\n * Pixel is a unit of length in screen pixels\n */\n FontUnit[\"Px\"] = \"px\";\n /**\n * Point is a physical unit length (1/72 of an inch)\n */\n FontUnit[\"Pt\"] = \"pt\";\n /**\n * Percent is a scalable unit similar to Em, the only difference is the Em units scale faster when Text-Size stuff\n */\n FontUnit[\"Percent\"] = \"%\";\n})(FontUnit || (FontUnit = {}));\n/**\n * Enum representing the different horizontal text alignments\n */\nvar TextAlign;\n(function (TextAlign) {\n /**\n * The text is left-aligned.\n */\n TextAlign[\"Left\"] = \"left\";\n /**\n * The text is right-aligned.\n */\n TextAlign[\"Right\"] = \"right\";\n /**\n * The text is centered.\n */\n TextAlign[\"Center\"] = \"center\";\n /**\n * The text is aligned at the normal start of the line (left-aligned for left-to-right locales,\n * right-aligned for right-to-left locales).\n */\n TextAlign[\"Start\"] = \"start\";\n /**\n * The text is aligned at the normal end of the line (right-aligned for left-to-right locales,\n * left-aligned for right-to-left locales).\n */\n TextAlign[\"End\"] = \"end\";\n})(TextAlign || (TextAlign = {}));\n/**\n * Enum representing the different baseline text alignments\n */\nvar BaseAlign;\n(function (BaseAlign) {\n /**\n * The text baseline is the top of the em square.\n */\n BaseAlign[\"Top\"] = \"top\";\n /**\n * The text baseline is the hanging baseline. Currently unsupported; this will act like\n * alphabetic.\n */\n BaseAlign[\"Hanging\"] = \"hanging\";\n /**\n * The text baseline is the middle of the em square.\n */\n BaseAlign[\"Middle\"] = \"middle\";\n /**\n * The text baseline is the normal alphabetic baseline.\n */\n BaseAlign[\"Alphabetic\"] = \"alphabetic\";\n /**\n * The text baseline is the ideographic baseline; this is the bottom of\n * the body of the characters, if the main body of characters protrudes\n * beneath the alphabetic baseline. Currently unsupported; this will\n * act like alphabetic.\n */\n BaseAlign[\"Ideographic\"] = \"ideographic\";\n /**\n * The text baseline is the bottom of the bounding box. This differs\n * from the ideographic baseline in that the ideographic baseline\n * doesn't consider descenders.\n */\n BaseAlign[\"Bottom\"] = \"bottom\";\n})(BaseAlign || (BaseAlign = {}));\n/**\n * Enum representing the different possible font styles\n */\nvar FontStyle;\n(function (FontStyle) {\n FontStyle[\"Normal\"] = \"normal\";\n FontStyle[\"Italic\"] = \"italic\";\n FontStyle[\"Oblique\"] = \"oblique\";\n})(FontStyle || (FontStyle = {}));\n/**\n * Enum representing the text direction, useful for other languages, or writing text in reverse\n */\nvar Direction;\n(function (Direction) {\n Direction[\"LeftToRight\"] = \"ltr\";\n Direction[\"RightToLeft\"] = \"rtl\";\n})(Direction || (Direction = {}));\n\n\n/***/ }),\n\n/***/ \"./Graphics/FontTextInstance.ts\":\n/*!**************************************!*\\\n !*** ./Graphics/FontTextInstance.ts ***!\n \\**************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FontTextInstance: () => (/* binding */ FontTextInstance)\n/* harmony export */ });\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Util_DrawUtil__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/DrawUtil */ \"./Util/DrawUtil.ts\");\n/* harmony import */ var _Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Context/ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n\n\n\n\nclass FontTextInstance {\n constructor(font, text, color, maxWidth) {\n this.font = font;\n this.text = text;\n this.color = color;\n this.maxWidth = maxWidth;\n this._textFragments = [];\n this.disposed = false;\n this._dirty = true;\n this.canvas = document.createElement('canvas');\n const ctx = this.canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Unable to create FontTextInstance, internal canvas failed to create');\n }\n this.ctx = ctx;\n this.dimensions = this.measureText(text);\n this._setDimension(this.dimensions, this.ctx);\n this._lastHashCode = this.getHashCode();\n }\n measureText(text, maxWidth) {\n if (this.disposed) {\n throw Error('Accessing disposed text instance! ' + this.text);\n }\n let lines = null;\n if (maxWidth != null) {\n lines = this._getLinesFromText(text, maxWidth);\n }\n else {\n lines = text.split('\\n');\n }\n const maxWidthLine = lines.reduce((a, b) => {\n return a.length > b.length ? a : b;\n });\n this._applyFont(this.ctx); // font must be applied to the context to measure it\n const metrics = this.ctx.measureText(maxWidthLine);\n let textHeight = Math.abs(metrics.actualBoundingBoxAscent) + Math.abs(metrics.actualBoundingBoxDescent);\n // TODO line height makes the text bounds wonky\n const lineAdjustedHeight = textHeight * lines.length;\n textHeight = lineAdjustedHeight;\n const bottomBounds = lineAdjustedHeight - Math.abs(metrics.actualBoundingBoxAscent);\n const x = 0;\n const y = 0;\n const measurement = new _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox({\n left: x - Math.abs(metrics.actualBoundingBoxLeft) - this.font.padding,\n top: y - Math.abs(metrics.actualBoundingBoxAscent) - this.font.padding,\n bottom: y + bottomBounds + this.font.padding,\n right: x + Math.abs(metrics.actualBoundingBoxRight) + this.font.padding\n });\n return measurement;\n }\n _setDimension(textBounds, bitmap) {\n let lineHeightRatio = 1;\n if (this.font.lineHeight) {\n lineHeightRatio = this.font.lineHeight / this.font.size;\n }\n // Changing the width and height clears the context properties\n // We double the bitmap width to account for all possible alignment\n // We scale by \"quality\" so we render text without jaggies\n bitmap.canvas.width = (textBounds.width + this.font.padding * 2) * 2 * this.font.quality;\n bitmap.canvas.height = (textBounds.height + this.font.padding * 2) * 2 * this.font.quality * lineHeightRatio;\n }\n static getHashCode(font, text, color) {\n var _a;\n const hash = text +\n '__hashcode__' +\n font.fontString +\n font.showDebug +\n font.textAlign +\n font.baseAlign +\n font.direction +\n font.lineHeight +\n JSON.stringify(font.shadow) +\n (font.padding.toString() +\n font.smoothing.toString() +\n font.lineWidth.toString() +\n font.lineDash.toString() +\n ((_a = font.strokeColor) === null || _a === void 0 ? void 0 : _a.toString()) +\n (color ? color.toString() : font.color.toString()));\n return hash;\n }\n getHashCode(includeColor = true) {\n return FontTextInstance.getHashCode(this.font, this.text, includeColor ? this.color : undefined);\n }\n _applyRasterProperties(ctx) {\n var _a, _b, _c;\n ctx.translate(this.font.padding, this.font.padding);\n ctx.imageSmoothingEnabled = this.font.smoothing;\n ctx.lineWidth = this.font.lineWidth;\n ctx.setLineDash((_a = this.font.lineDash) !== null && _a !== void 0 ? _a : ctx.getLineDash());\n ctx.strokeStyle = (_c = (_b = this.font.strokeColor) === null || _b === void 0 ? void 0 : _b.toString()) !== null && _c !== void 0 ? _c : '';\n ctx.fillStyle = this.color.toString();\n }\n _applyFont(ctx) {\n ctx.resetTransform();\n ctx.translate(this.font.padding + ctx.canvas.width / 2, this.font.padding + ctx.canvas.height / 2);\n ctx.scale(this.font.quality, this.font.quality);\n ctx.textAlign = this.font.textAlign;\n ctx.textBaseline = this.font.baseAlign;\n ctx.font = this.font.fontString;\n ctx.direction = this.font.direction;\n if (this.font.shadow) {\n if (this.font.shadow.color) {\n ctx.shadowColor = this.font.shadow.color.toString();\n }\n if (this.font.shadow.blur) {\n ctx.shadowBlur = this.font.shadow.blur;\n }\n if (this.font.shadow.offset) {\n ctx.shadowOffsetX = this.font.shadow.offset.x;\n ctx.shadowOffsetY = this.font.shadow.offset.y;\n }\n }\n }\n _drawText(ctx, lines, lineHeight) {\n this._applyRasterProperties(ctx);\n this._applyFont(ctx);\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (this.color) {\n ctx.fillText(line, 0, i * lineHeight);\n }\n if (this.font.strokeColor) {\n ctx.strokeText(line, 0, i * lineHeight);\n }\n }\n if (this.font.showDebug) {\n // Horizontal line\n /* istanbul ignore next */\n (0,_Util_DrawUtil__WEBPACK_IMPORTED_MODULE_1__.line)(ctx, _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Green, -ctx.canvas.width / 2, 0, ctx.canvas.width / 2, 0, 2);\n // Vertical line\n /* istanbul ignore next */\n (0,_Util_DrawUtil__WEBPACK_IMPORTED_MODULE_1__.line)(ctx, _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Red, 0, -ctx.canvas.height / 2, 0, ctx.canvas.height / 2, 2);\n }\n }\n _splitTextBitmap(bitmap) {\n const textImages = [];\n let currentX = 0;\n let currentY = 0;\n // 4k is the max for mobile devices\n const width = Math.min(4096, bitmap.canvas.width);\n const height = Math.min(4096, bitmap.canvas.height);\n // Splits the original bitmap into 4k max chunks\n while (currentX < bitmap.canvas.width) {\n while (currentY < bitmap.canvas.height) {\n // create new bitmap\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Unable to split internal FontTextInstance bitmap, failed to create internal canvas');\n }\n // draw current slice to new bitmap in < 4k chunks\n ctx.drawImage(bitmap.canvas, currentX, currentY, width, height, 0, 0, width, height);\n textImages.push({ x: currentX, y: currentY, canvas });\n currentY += height;\n }\n currentX += width;\n currentY = 0;\n }\n return textImages;\n }\n flagDirty() {\n this._dirty = true;\n }\n render(ex, x, y, maxWidth) {\n var _a;\n if (this.disposed) {\n throw Error('Accessing disposed text instance! ' + this.text);\n }\n this._ex = ex;\n const hashCode = this.getHashCode();\n if (this._lastHashCode !== hashCode) {\n this._dirty = true;\n }\n // Calculate image chunks\n if (this._dirty) {\n this.dimensions = this.measureText(this.text, maxWidth);\n this._setDimension(this.dimensions, this.ctx);\n const lines = this._getLinesFromText(this.text, maxWidth);\n const lineHeight = (_a = this.font.lineHeight) !== null && _a !== void 0 ? _a : this.dimensions.height / lines.length;\n // draws the text to the main bitmap\n this._drawText(this.ctx, lines, lineHeight);\n // clear any out old fragments\n if (ex instanceof _Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_3__.ExcaliburGraphicsContextWebGL) {\n for (const frag of this._textFragments) {\n ex.textureLoader.delete(frag.canvas);\n }\n }\n // splits to < 4k fragments for large text\n this._textFragments = this._splitTextBitmap(this.ctx);\n if (ex instanceof _Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_3__.ExcaliburGraphicsContextWebGL) {\n for (const frag of this._textFragments) {\n ex.textureLoader.load(frag.canvas, { filtering: this.font.filtering }, true);\n }\n }\n this._lastHashCode = hashCode;\n this._dirty = false;\n }\n // draws the bitmap fragments to excalibur graphics context\n for (const frag of this._textFragments) {\n ex.drawImage(frag.canvas, 0, 0, frag.canvas.width, frag.canvas.height, frag.x / this.font.quality + x - this.ctx.canvas.width / this.font.quality / 2, frag.y / this.font.quality + y - this.ctx.canvas.height / this.font.quality / 2, frag.canvas.width / this.font.quality, frag.canvas.height / this.font.quality);\n }\n }\n dispose() {\n this.disposed = true;\n this.dimensions = undefined;\n this.canvas = undefined;\n this.ctx = undefined;\n if (this._ex instanceof _Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_3__.ExcaliburGraphicsContextWebGL) {\n for (const frag of this._textFragments) {\n this._ex.textureLoader.delete(frag.canvas);\n }\n }\n this._textFragments.length = 0;\n }\n _getLinesFromText(text, maxWidth) {\n var _a;\n if (this._cachedText === text && this._cachedRenderWidth === maxWidth && ((_a = this._cachedLines) === null || _a === void 0 ? void 0 : _a.length)) {\n return this._cachedLines;\n }\n const lines = text.split('\\n');\n if (maxWidth == null) {\n return lines;\n }\n // If the current line goes past the maxWidth, append a new line without modifying the underlying text.\n for (let i = 0; i < lines.length; i++) {\n let line = lines[i];\n let newLine = '';\n if (this.measureText(line).width > maxWidth) {\n while (this.measureText(line).width > maxWidth) {\n newLine = line[line.length - 1] + newLine;\n line = line.slice(0, -1); // Remove last character from line\n }\n // Update the array with our new values\n lines[i] = line;\n lines[i + 1] = newLine;\n }\n }\n this._cachedText = text;\n this._cachedLines = lines;\n this._cachedRenderWidth = maxWidth;\n return lines;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Graphic.ts\":\n/*!*****************************!*\\\n !*** ./Graphics/Graphic.ts ***!\n \\*****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Graphic: () => (/* binding */ Graphic)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Util_Watch__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Util/Watch */ \"./Util/Watch.ts\");\n/* harmony import */ var _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/affine-matrix */ \"./Math/affine-matrix.ts\");\n\n\n\n\n/**\n * A Graphic is the base Excalibur primitive for something that can be drawn to the {@apilink ExcaliburGraphicsContext}.\n * {@apilink Sprite}, {@apilink Animation}, {@apilink GraphicsGroup}, {@apilink Canvas}, {@apilink Rectangle}, {@apilink Circle}, and {@apilink Polygon} all derive from the\n * {@apilink Graphic} abstract class.\n *\n * Implementors of a Graphic must override the abstract {@apilink Graphic._drawImage} method to render an image to the graphics context. Graphic\n * handles all the position, rotation, and scale transformations in {@apilink Graphic._preDraw} and {@apilink Graphic._postDraw}\n */\nclass Graphic {\n isStale() {\n return this._transformStale;\n }\n /**\n * Gets or sets the flipHorizontal, which will flip the graphic horizontally (across the y axis)\n */\n get flipHorizontal() {\n return this._flipHorizontal;\n }\n set flipHorizontal(value) {\n this._flipHorizontal = value;\n this._transformStale = true;\n }\n /**\n * Gets or sets the flipVertical, which will flip the graphic vertically (across the x axis)\n */\n get flipVertical() {\n return this._flipVertical;\n }\n set flipVertical(value) {\n this._flipVertical = value;\n this._transformStale = true;\n }\n /**\n * Gets or sets the rotation of the graphic\n */\n get rotation() {\n return this._rotation;\n }\n set rotation(value) {\n this._rotation = value;\n this._transformStale = true;\n }\n /**\n * Gets or sets the scale of the graphic, this affects the width and\n */\n get scale() {\n return this._scale;\n }\n set scale(value) {\n this._scale = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_0__.watch)(value, () => {\n this._transformStale = true;\n });\n this._transformStale = true;\n }\n /**\n * Gets or sets the origin of the graphic, if not set the center of the graphic is the origin\n */\n get origin() {\n return this._origin;\n }\n set origin(value) {\n if (value) {\n this._origin = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_0__.watch)(value, () => {\n this._transformStale = true;\n });\n }\n this._transformStale = true;\n }\n constructor(options) {\n var _a, _b, _c, _d, _e, _f, _g;\n this.id = Graphic._ID++;\n this.transform = _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_1__.AffineMatrix.identity();\n this._transformStale = true;\n /**\n * Gets or sets wether to show debug information about the graphic\n */\n this.showDebug = false;\n this._flipHorizontal = false;\n this._flipVertical = false;\n this._rotation = 0;\n /**\n * Gets or sets the opacity of the graphic, 0 is transparent, 1 is solid (opaque).\n */\n this.opacity = 1;\n this._scale = _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.One;\n this._width = 0;\n this._height = 0;\n if (options) {\n this.origin = (_a = options.origin) !== null && _a !== void 0 ? _a : this.origin;\n this.flipHorizontal = (_b = options.flipHorizontal) !== null && _b !== void 0 ? _b : this.flipHorizontal;\n this.flipVertical = (_c = options.flipVertical) !== null && _c !== void 0 ? _c : this.flipVertical;\n this.rotation = (_d = options.rotation) !== null && _d !== void 0 ? _d : this.rotation;\n this.opacity = (_e = options.opacity) !== null && _e !== void 0 ? _e : this.opacity;\n this.scale = (_f = options.scale) !== null && _f !== void 0 ? _f : this.scale;\n this.tint = (_g = options.tint) !== null && _g !== void 0 ? _g : this.tint;\n if (options.width) {\n this._width = options.width;\n }\n if (options.height) {\n this._height = options.height;\n }\n }\n }\n cloneGraphicOptions() {\n return {\n width: this.width / this.scale.x,\n height: this.height / this.scale.y,\n origin: this.origin ? this.origin.clone() : undefined,\n flipHorizontal: this.flipHorizontal,\n flipVertical: this.flipVertical,\n rotation: this.rotation,\n opacity: this.opacity,\n scale: this.scale ? this.scale.clone() : undefined,\n tint: this.tint ? this.tint.clone() : undefined\n };\n }\n /**\n * Gets or sets the width of the graphic (always positive)\n */\n get width() {\n return Math.abs(this._width * this.scale.x);\n }\n /**\n * Gets or sets the height of the graphic (always positive)\n */\n get height() {\n return Math.abs(this._height * this.scale.y);\n }\n set width(value) {\n this._width = value;\n this._transformStale = true;\n }\n set height(value) {\n this._height = value;\n this._transformStale = true;\n }\n /**\n * Gets a copy of the bounds in pixels occupied by the graphic on the the screen. This includes scale.\n */\n get localBounds() {\n return _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_3__.BoundingBox.fromDimension(this.width, this.height, _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero);\n }\n /**\n * Draw the whole graphic to the context including transform\n * @param ex The excalibur graphics context\n * @param x\n * @param y\n */\n draw(ex, x, y) {\n this._preDraw(ex, x, y);\n this._drawImage(ex, 0, 0);\n this._postDraw(ex);\n }\n /**\n * Apply affine transformations to the graphics context to manipulate the graphic before {@apilink Graphic._drawImage}\n * @param ex\n * @param x\n * @param y\n */\n _preDraw(ex, x, y) {\n ex.save();\n ex.translate(x, y);\n if (this._transformStale) {\n this.transform.reset();\n this.transform.scale(Math.abs(this.scale.x), Math.abs(this.scale.y));\n this._rotate(this.transform);\n this._flip(this.transform);\n this._transformStale = false;\n }\n ex.multiply(this.transform);\n // it is important to multiply alphas so graphics respect the current context\n ex.opacity = ex.opacity * this.opacity;\n if (this.tint) {\n ex.tint = this.tint;\n }\n }\n _rotate(ex) {\n var _a;\n const scaleDirX = this.scale.x > 0 ? 1 : -1;\n const scaleDirY = this.scale.y > 0 ? 1 : -1;\n const origin = (_a = this.origin) !== null && _a !== void 0 ? _a : (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(this.width / 2, this.height / 2);\n ex.translate(origin.x, origin.y);\n ex.rotate(this.rotation);\n // This is for handling direction changes 1 or -1, that way we don't have mismatched translates()\n ex.scale(scaleDirX, scaleDirY);\n ex.translate(-origin.x, -origin.y);\n }\n _flip(ex) {\n if (this.flipHorizontal) {\n ex.translate(this.width / this.scale.x, 0);\n ex.scale(-1, 1);\n }\n if (this.flipVertical) {\n ex.translate(0, this.height / this.scale.y);\n ex.scale(1, -1);\n }\n }\n /**\n * Apply any additional work after {@apilink Graphic._drawImage} and restore the context state.\n * @param ex\n */\n _postDraw(ex) {\n if (this.showDebug) {\n ex.debug.drawRect(0, 0, this.width, this.height);\n }\n ex.restore();\n }\n}\nGraphic._ID = 0;\n\n\n/***/ }),\n\n/***/ \"./Graphics/GraphicsComponent.ts\":\n/*!***************************************!*\\\n !*** ./Graphics/GraphicsComponent.ts ***!\n \\***************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ GraphicsComponent: () => (/* binding */ GraphicsComponent),\n/* harmony export */ hasGraphicsTick: () => (/* binding */ hasGraphicsTick)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Collision_Index__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Collision/Index */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Component */ \"./EntityComponentSystem/Component.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Math_watch_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/watch-vector */ \"./Math/watch-vector.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Graphics_GraphicsGroup__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Graphics/GraphicsGroup */ \"./Graphics/GraphicsGroup.ts\");\n/* harmony import */ var _Raster__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Raster */ \"./Graphics/Raster.ts\");\n/* harmony import */ var _Text__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Text */ \"./Graphics/Text.ts\");\n\n\n\n\n\n\n\n\n\n\n/**\n * Type guard for checking if a Graphic HasTick (used for graphics that change over time like animations)\n * @param graphic\n */\nfunction hasGraphicsTick(graphic) {\n return !!graphic.tick;\n}\n/**\n * Component to manage drawings, using with the position component\n */\nclass GraphicsComponent extends _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n /**\n * Sets or gets wether any drawing should be visible in this component\n * @deprecated use isVisible\n */\n get visible() {\n return this.isVisible;\n }\n /**\n * Sets or gets wether any drawing should be visible in this component\n * @deprecated use isVisible\n */\n set visible(val) {\n this.isVisible = val;\n }\n /**\n * Offset to apply to graphics by default\n */\n get offset() {\n return this._offset;\n }\n set offset(value) {\n this._offset = new _Math_watch_vector__WEBPACK_IMPORTED_MODULE_1__.WatchVector(value, () => this.recalculateBounds());\n this.recalculateBounds();\n }\n /**\n * Anchor to apply to graphics by default\n */\n get anchor() {\n return this._anchor;\n }\n set anchor(value) {\n this._anchor = new _Math_watch_vector__WEBPACK_IMPORTED_MODULE_1__.WatchVector(value, () => this.recalculateBounds());\n this.recalculateBounds();\n }\n /**\n * Sets the color of the actor's current graphic\n */\n get color() {\n return this._color;\n }\n set color(v) {\n if (v) {\n this._color = v.clone();\n const currentGraphic = this.graphics.current;\n if (currentGraphic instanceof _Raster__WEBPACK_IMPORTED_MODULE_2__.Raster || currentGraphic instanceof _Text__WEBPACK_IMPORTED_MODULE_3__.Text) {\n currentGraphic.color = this._color;\n }\n }\n }\n constructor(options) {\n super();\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_4__.Logger.getInstance();\n this._current = 'default';\n this._graphics = {};\n this._options = {};\n this.material = null;\n /**\n * Sets or gets wether any drawing should be visible in this component\n */\n this.isVisible = true;\n /**\n * Optionally force the graphic onscreen, default false. Not recommend to use for perf reasons, only if you known what you're doing.\n */\n this.forceOnScreen = false;\n /**\n * Sets or gets wither all drawings should have an opacity applied\n */\n this.opacity = 1;\n this._offset = new _Math_watch_vector__WEBPACK_IMPORTED_MODULE_1__.WatchVector(_Math_vector__WEBPACK_IMPORTED_MODULE_5__.Vector.Zero, () => this.recalculateBounds());\n this._anchor = new _Math_watch_vector__WEBPACK_IMPORTED_MODULE_1__.WatchVector(_Math_vector__WEBPACK_IMPORTED_MODULE_5__.Vector.Half, () => this.recalculateBounds());\n /**\n * Flip all graphics horizontally along the y-axis\n */\n this.flipHorizontal = false;\n /**\n * Flip all graphics vertically along the x-axis\n */\n this.flipVertical = false;\n /**\n * If set to true graphics added to the component will be copied. This can effect performance, but is useful if you don't want\n * changes to a graphic to effect all the places it is used.\n */\n this.copyGraphics = false;\n // Defaults\n options = {\n visible: this.isVisible,\n graphics: {},\n ...options\n };\n const { current, anchor, color, opacity, visible, graphics, offset, copyGraphics, onPreDraw, onPostDraw, onPreTransformDraw, onPostTransformDraw } = options;\n for (const [key, graphicOrOptions] of Object.entries(graphics)) {\n if (graphicOrOptions instanceof _Graphic__WEBPACK_IMPORTED_MODULE_6__.Graphic) {\n this._graphics[key] = graphicOrOptions;\n }\n else {\n this._graphics[key] = graphicOrOptions.graphic;\n this._options[key] = graphicOrOptions.options;\n }\n }\n this.offset = offset !== null && offset !== void 0 ? offset : this.offset;\n this.opacity = opacity !== null && opacity !== void 0 ? opacity : this.opacity;\n this.anchor = anchor !== null && anchor !== void 0 ? anchor : this.anchor;\n this.color = color !== null && color !== void 0 ? color : this.color;\n this.copyGraphics = copyGraphics !== null && copyGraphics !== void 0 ? copyGraphics : this.copyGraphics;\n this.onPreDraw = onPreDraw !== null && onPreDraw !== void 0 ? onPreDraw : this.onPreDraw;\n this.onPostDraw = onPostDraw !== null && onPostDraw !== void 0 ? onPostDraw : this.onPostDraw;\n this.onPreDraw = onPreTransformDraw !== null && onPreTransformDraw !== void 0 ? onPreTransformDraw : this.onPreTransformDraw;\n this.onPostTransformDraw = onPostTransformDraw !== null && onPostTransformDraw !== void 0 ? onPostTransformDraw : this.onPostTransformDraw;\n this.isVisible = !!visible;\n this._current = current !== null && current !== void 0 ? current : this._current;\n if (current && this._graphics[current]) {\n this.use(current);\n }\n }\n getGraphic(name) {\n return this._graphics[name];\n }\n getOptions(name) {\n return this._options[name];\n }\n /**\n * Get registered graphics names\n */\n getNames() {\n return Object.keys(this._graphics);\n }\n /**\n * Returns the currently displayed graphic\n */\n get current() {\n return this._graphics[this._current];\n }\n /**\n * Returns the currently displayed graphic offsets\n */\n get currentOptions() {\n return this._options[this._current];\n }\n /**\n * Returns all graphics associated with this component\n */\n get graphics() {\n return this._graphics;\n }\n /**\n * Returns all graphics options associated with this component\n */\n get options() {\n return this._options;\n }\n add(nameOrGraphic, graphicOrOptions, options) {\n let name = 'default';\n let graphicToSet = null;\n let optionsToSet = undefined;\n if (typeof nameOrGraphic === 'string' && graphicOrOptions instanceof _Graphic__WEBPACK_IMPORTED_MODULE_6__.Graphic) {\n name = nameOrGraphic;\n graphicToSet = graphicOrOptions;\n optionsToSet = options;\n }\n if (nameOrGraphic instanceof _Graphic__WEBPACK_IMPORTED_MODULE_6__.Graphic && !(graphicOrOptions instanceof _Graphic__WEBPACK_IMPORTED_MODULE_6__.Graphic)) {\n graphicToSet = nameOrGraphic;\n optionsToSet = graphicOrOptions;\n }\n if (!graphicToSet) {\n throw new Error('Need to provide a graphic or valid graphic string');\n }\n this._graphics[name] = this.copyGraphics ? graphicToSet.clone() : graphicToSet;\n this._options[name] = this.copyGraphics ? { ...optionsToSet } : optionsToSet;\n if (name === 'default') {\n this.use('default');\n }\n return graphicToSet;\n }\n /**\n * Removes a registered graphic, if the removed graphic is the current it will switch to the default\n * @param name\n */\n remove(name) {\n delete this._graphics[name];\n delete this._options[name];\n if (this._current === name) {\n this._current = 'default';\n this.recalculateBounds();\n }\n }\n /**\n * Use a graphic only, will set the default graphic. Returns the new {@apilink Graphic}\n *\n * Optionally override the stored options\n * @param nameOrGraphic\n * @param options\n */\n use(nameOrGraphic, options) {\n var _a;\n if (nameOrGraphic instanceof _Graphic__WEBPACK_IMPORTED_MODULE_6__.Graphic) {\n let graphic = nameOrGraphic;\n if (this.copyGraphics) {\n graphic = nameOrGraphic.clone();\n }\n this._current = 'default';\n this._graphics[this._current] = graphic;\n this._options[this._current] = options;\n }\n else {\n this._current = nameOrGraphic;\n this._options[this._current] = options;\n if (!(this._current in this._graphics)) {\n this._logger.warn(`Graphic ${this._current} is not registered with the graphics component owned by ${(_a = this.owner) === null || _a === void 0 ? void 0 : _a.name}. Nothing will be drawn.`);\n }\n }\n this.recalculateBounds();\n return this.current;\n }\n /**\n * Hide currently shown graphic\n */\n hide() {\n this._current = 'ex.none';\n }\n set localBounds(bounds) {\n this._localBounds = bounds;\n }\n recalculateBounds() {\n let bb = new _Collision_Index__WEBPACK_IMPORTED_MODULE_7__.BoundingBox();\n const graphic = this._graphics[this._current];\n const options = this._options[this._current];\n if (!graphic) {\n this._localBounds = bb;\n return;\n }\n let anchor = this.anchor;\n let offset = this.offset;\n if (options === null || options === void 0 ? void 0 : options.anchor) {\n anchor = options.anchor;\n }\n if (options === null || options === void 0 ? void 0 : options.offset) {\n offset = options.offset;\n }\n const bounds = graphic.localBounds;\n const offsetX = -bounds.width * anchor.x + offset.x;\n const offsetY = -bounds.height * anchor.y + offset.y;\n if (graphic instanceof _Graphics_GraphicsGroup__WEBPACK_IMPORTED_MODULE_8__.GraphicsGroup && !graphic.useAnchor) {\n bb = graphic === null || graphic === void 0 ? void 0 : graphic.localBounds.combine(bb);\n }\n else {\n bb = graphic === null || graphic === void 0 ? void 0 : graphic.localBounds.translate((0,_Math_vector__WEBPACK_IMPORTED_MODULE_5__.vec)(offsetX, offsetY)).combine(bb);\n }\n this._localBounds = bb;\n }\n /**\n * Get local bounds of graphics component\n */\n get localBounds() {\n if (!this._localBounds || this._localBounds.hasZeroDimensions()) {\n this.recalculateBounds();\n }\n return this._localBounds; // recalc guarantees type\n }\n /**\n * Get world bounds of graphics component\n */\n get bounds() {\n let bounds = this.localBounds;\n if (this.owner) {\n const tx = this.owner.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_9__.TransformComponent);\n if (tx) {\n bounds = bounds.transform(tx.get().matrix);\n }\n }\n return bounds;\n }\n /**\n * Update underlying graphics if necessary, called internally\n * @param elapsed\n * @internal\n */\n update(elapsed, idempotencyToken = 0) {\n const graphic = this.current;\n if (graphic && hasGraphicsTick(graphic)) {\n graphic.tick(elapsed, idempotencyToken);\n }\n }\n clone() {\n const graphics = new GraphicsComponent();\n graphics._graphics = { ...this._graphics };\n graphics._options = { ...this._options };\n graphics.offset = this.offset.clone();\n if (this.color) {\n graphics.color = this.color.clone();\n }\n graphics.opacity = this.opacity;\n graphics.anchor = this.anchor.clone();\n graphics.copyGraphics = this.copyGraphics;\n graphics.onPreDraw = this.onPreDraw;\n graphics.onPostDraw = this.onPostDraw;\n graphics.isVisible = this.isVisible;\n return graphics;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/GraphicsDiagnostics.ts\":\n/*!*****************************************!*\\\n !*** ./Graphics/GraphicsDiagnostics.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ GraphicsDiagnostics: () => (/* binding */ GraphicsDiagnostics)\n/* harmony export */ });\nclass GraphicsDiagnostics {\n static clear() {\n GraphicsDiagnostics.DrawCallCount = 0;\n GraphicsDiagnostics.DrawnImagesCount = 0;\n }\n}\nGraphicsDiagnostics.DrawCallCount = 0;\nGraphicsDiagnostics.DrawnImagesCount = 0;\n\n\n/***/ }),\n\n/***/ \"./Graphics/GraphicsGroup.ts\":\n/*!***********************************!*\\\n !*** ./Graphics/GraphicsGroup.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ GraphicsGroup: () => (/* binding */ GraphicsGroup)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Animation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Animation */ \"./Graphics/Animation.ts\");\n/* harmony import */ var _Collision_Index__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Collision/Index */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n\n\n\n\n\nclass GraphicsGroup extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n constructor(options) {\n var _a;\n super(options);\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this.useAnchor = true;\n this.members = [];\n this.members = options.members;\n this.useAnchor = (_a = options.useAnchor) !== null && _a !== void 0 ? _a : this.useAnchor;\n this._updateDimensions();\n }\n clone() {\n return new GraphicsGroup({\n members: [...this.members],\n ...this.cloneGraphicOptions()\n });\n }\n _updateDimensions() {\n const bb = this.localBounds;\n this.width = bb.width;\n this.height = bb.height;\n return bb;\n }\n get localBounds() {\n const bb = new _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox();\n for (const member of this.members) {\n if (member instanceof _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic) {\n member.localBounds.combine(bb, bb);\n }\n else {\n const { graphic, offset: pos, useBounds } = member;\n const shouldUseBounds = useBounds === undefined ? true : useBounds;\n if (graphic) {\n if (shouldUseBounds) {\n graphic.localBounds.translate(pos).combine(bb, bb);\n }\n }\n else {\n this._logger.warnOnce(`Graphics group member has an null or undefined graphic, member definition: ${JSON.stringify(member)}.`);\n }\n }\n }\n return bb;\n }\n _isAnimationOrGroup(graphic) {\n return graphic instanceof _Animation__WEBPACK_IMPORTED_MODULE_3__.Animation || graphic instanceof GraphicsGroup;\n }\n tick(elapsed, idempotencyToken) {\n for (const member of this.members) {\n let graphic;\n if (member instanceof _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic) {\n graphic = member;\n }\n else {\n graphic = member.graphic;\n }\n if (this._isAnimationOrGroup(graphic)) {\n graphic.tick(elapsed, idempotencyToken);\n }\n }\n }\n reset() {\n for (const member of this.members) {\n let graphic;\n if (member instanceof _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic) {\n graphic = member;\n }\n else {\n graphic = member.graphic;\n }\n if (this._isAnimationOrGroup(graphic)) {\n graphic.reset();\n }\n }\n }\n _preDraw(ex, x, y) {\n this._updateDimensions();\n super._preDraw(ex, this.useAnchor ? x : 0, this.useAnchor ? y : 0);\n }\n _drawImage(ex, x, y) {\n const pos = _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero;\n for (const member of this.members) {\n let graphic;\n if (member instanceof _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic) {\n graphic = member;\n }\n else {\n graphic = member.graphic;\n member.offset.clone(pos);\n }\n if (!graphic) {\n continue;\n }\n ex.save();\n ex.translate(x, y);\n graphic.draw(ex, pos.x, pos.y);\n if (this.showDebug) {\n /* istanbul ignore next */\n ex.debug.drawRect(0, 0, this.width, this.height);\n }\n ex.restore();\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/GraphicsSystem.ts\":\n/*!************************************!*\\\n !*** ./Graphics/GraphicsSystem.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ GraphicsSystem: () => (/* binding */ GraphicsSystem)\n/* harmony export */ });\n/* harmony import */ var _GraphicsComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Priority.ts\");\n/* harmony import */ var _GraphicsGroup__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./GraphicsGroup */ \"./Graphics/GraphicsGroup.ts\");\n/* harmony import */ var _ParallaxComponent__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./ParallaxComponent */ \"./Graphics/ParallaxComponent.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Math/coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../Collision/BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _FontCache__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./FontCache */ \"./Graphics/FontCache.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _Math_transform__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/transform */ \"./Math/transform.ts\");\n/* harmony import */ var _TransformInterpolation__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./TransformInterpolation */ \"./Graphics/TransformInterpolation.ts\");\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass GraphicsSystem extends _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_0__.System {\n get sortedTransforms() {\n return this._sortedTransforms;\n }\n constructor(world) {\n super();\n this.world = world;\n this.systemType = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_0__.SystemType.Draw;\n this._token = 0;\n this._sortedTransforms = [];\n this._zHasChanged = false;\n this._zIndexUpdate = () => {\n this._zHasChanged = true;\n };\n this._targetInterpolationTransform = new _Math_transform__WEBPACK_IMPORTED_MODULE_1__.Transform();\n this.query = this.world.query([_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent, _GraphicsComponent__WEBPACK_IMPORTED_MODULE_3__.GraphicsComponent]);\n this.query.entityAdded$.subscribe((e) => {\n const tx = e.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n this._sortedTransforms.push(tx);\n tx.zIndexChanged$.subscribe(this._zIndexUpdate);\n this._zHasChanged = true;\n });\n this.query.entityRemoved$.subscribe((e) => {\n const tx = e.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n tx.zIndexChanged$.unsubscribe(this._zIndexUpdate);\n const index = this._sortedTransforms.indexOf(tx);\n if (index > -1) {\n this._sortedTransforms.splice(index, 1);\n }\n });\n }\n initialize(world, scene) {\n this._camera = scene.camera;\n this._engine = scene.engine;\n }\n preupdate() {\n // Graphics context could be switched to fallback in a new frame\n this._graphicsContext = this._engine.graphicsContext;\n if (this._zHasChanged) {\n this._sortedTransforms.sort((a, b) => {\n return a.globalZ - b.globalZ;\n });\n this._zHasChanged = false;\n }\n }\n update(elapsed) {\n this._token++;\n let graphics;\n _FontCache__WEBPACK_IMPORTED_MODULE_4__.FontCache.checkAndClearCache();\n // This is a performance enhancement, most things are in world space\n // so if we can only do this once saves a ton of transform updates\n this._graphicsContext.save();\n if (this._camera) {\n this._camera.draw(this._graphicsContext);\n }\n for (let transformIndex = 0; transformIndex < this._sortedTransforms.length; transformIndex++) {\n const transform = this._sortedTransforms[transformIndex];\n const entity = transform.owner;\n // If the entity is offscreen skip\n if (entity.hasTag('ex.offscreen')) {\n continue;\n }\n graphics = entity.get(_GraphicsComponent__WEBPACK_IMPORTED_MODULE_3__.GraphicsComponent);\n // Exit if graphics set to not visible\n if (!graphics.isVisible) {\n continue;\n }\n // Optionally run the onPreTransformDraw graphics lifecycle draw\n if (graphics.onPreTransformDraw) {\n graphics.onPreTransformDraw(this._graphicsContext, elapsed);\n }\n entity.events.emit('pretransformdraw', new _Events__WEBPACK_IMPORTED_MODULE_5__.PreTransformDrawEvent(this._graphicsContext, elapsed, entity));\n // This optionally sets our camera based on the entity coord plan (world vs. screen)\n if (transform.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__.CoordPlane.Screen) {\n this._graphicsContext.restore();\n }\n this._graphicsContext.save();\n if (transform.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__.CoordPlane.Screen) {\n this._graphicsContext.translate(this._engine.screen.contentArea.left, this._engine.screen.contentArea.top);\n }\n // Tick any graphics state (but only once) for animations and graphics groups\n graphics.update(elapsed, this._token);\n // Apply parallax\n const parallax = entity.get(_ParallaxComponent__WEBPACK_IMPORTED_MODULE_7__.ParallaxComponent);\n if (parallax) {\n // We use the Tiled formula\n // https://doc.mapeditor.org/en/latest/manual/layers/#parallax-scrolling-factor\n // cameraPos * (1 - parallaxFactor)\n const oneMinusFactor = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.One.sub(parallax.parallaxFactor);\n const parallaxOffset = this._camera.drawPos.scale(oneMinusFactor);\n this._graphicsContext.translate(parallaxOffset.x, parallaxOffset.y);\n }\n // Position the entity + estimate lag\n this._applyTransform(entity);\n // If there is a material enable it on the context\n if (graphics.material) {\n this._graphicsContext.material = graphics.material;\n }\n // Optionally run the onPreDraw graphics lifecycle draw\n if (graphics.onPreDraw) {\n graphics.onPreDraw(this._graphicsContext, elapsed);\n }\n entity.events.emit('predraw', new _Events__WEBPACK_IMPORTED_MODULE_5__.PreDrawEvent(this._graphicsContext, elapsed, entity));\n // this._graphicsContext.opacity *= graphics.opacity;\n this._applyOpacity(entity);\n // Draw the graphics component\n this._drawGraphicsComponent(graphics, transform);\n // Optionally run the onPostDraw graphics lifecycle draw\n if (graphics.onPostDraw) {\n graphics.onPostDraw(this._graphicsContext, elapsed);\n }\n entity.events.emit('postdraw', new _Events__WEBPACK_IMPORTED_MODULE_5__.PostDrawEvent(this._graphicsContext, elapsed, entity));\n this._graphicsContext.restore();\n // Reset the transform back to the original world space\n if (transform.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__.CoordPlane.Screen) {\n this._graphicsContext.save();\n if (this._camera) {\n this._camera.draw(this._graphicsContext);\n }\n }\n // Optionally run the onPreTransformDraw graphics lifecycle draw\n if (graphics.onPostTransformDraw) {\n graphics.onPostTransformDraw(this._graphicsContext, elapsed);\n }\n entity.events.emit('posttransformdraw', new _Events__WEBPACK_IMPORTED_MODULE_5__.PostTransformDrawEvent(this._graphicsContext, elapsed, entity));\n }\n this._graphicsContext.restore();\n }\n _drawGraphicsComponent(graphicsComponent, transformComponent) {\n var _a, _b;\n if (graphicsComponent.isVisible) {\n const flipHorizontal = graphicsComponent.flipHorizontal;\n const flipVertical = graphicsComponent.flipVertical;\n const graphic = graphicsComponent.current;\n const options = (_a = graphicsComponent.currentOptions) !== null && _a !== void 0 ? _a : {};\n if (graphic) {\n let anchor = graphicsComponent.anchor;\n let offset = graphicsComponent.offset;\n let scaleX = 1;\n let scaleY = 1;\n // handle specific overrides\n if (options === null || options === void 0 ? void 0 : options.anchor) {\n anchor = options.anchor;\n }\n if (options === null || options === void 0 ? void 0 : options.offset) {\n offset = options.offset;\n }\n const globalScale = transformComponent.globalScale;\n scaleX *= graphic.scale.x * globalScale.x;\n scaleY *= graphic.scale.y * globalScale.y;\n // See https://github.com/excaliburjs/Excalibur/pull/619 for discussion on this formula\n const offsetX = -graphic.width * anchor.x + offset.x * scaleX;\n const offsetY = -graphic.height * anchor.y + offset.y * scaleY;\n const oldFlipHorizontal = graphic.flipHorizontal;\n const oldFlipVertical = graphic.flipVertical;\n if (flipHorizontal || flipVertical) {\n // flip any currently flipped graphics\n graphic.flipHorizontal = flipHorizontal ? !oldFlipHorizontal : oldFlipHorizontal;\n graphic.flipVertical = flipVertical ? !oldFlipVertical : oldFlipVertical;\n }\n graphic === null || graphic === void 0 ? void 0 : graphic.draw(this._graphicsContext, offsetX, offsetY);\n if (flipHorizontal || flipVertical) {\n graphic.flipHorizontal = oldFlipHorizontal;\n graphic.flipVertical = oldFlipVertical;\n }\n // TODO move debug code out?\n if (((_b = this._engine) === null || _b === void 0 ? void 0 : _b.isDebug) && this._engine.debug.graphics.showBounds) {\n const offset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_8__.vec)(offsetX, offsetY);\n if (graphic instanceof _GraphicsGroup__WEBPACK_IMPORTED_MODULE_9__.GraphicsGroup) {\n for (const member of graphic.members) {\n let g;\n let pos = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Zero;\n if (member instanceof _Graphic__WEBPACK_IMPORTED_MODULE_10__.Graphic) {\n g = member;\n }\n else {\n g = member.graphic;\n pos = member.offset;\n }\n if (graphic.useAnchor) {\n g === null || g === void 0 ? void 0 : g.localBounds.translate(offset.add(pos)).draw(this._graphicsContext, this._engine.debug.graphics.boundsColor);\n }\n else {\n g === null || g === void 0 ? void 0 : g.localBounds.translate(pos).draw(this._graphicsContext, this._engine.debug.graphics.boundsColor);\n }\n }\n }\n else {\n /* istanbul ignore next */\n graphic === null || graphic === void 0 ? void 0 : graphic.localBounds.translate(offset).draw(this._graphicsContext, this._engine.debug.graphics.boundsColor);\n }\n }\n }\n }\n }\n /**\n * This applies the current entity transform to the graphics context\n * @param entity\n */\n _applyTransform(entity) {\n const ancestors = entity.getAncestors();\n for (let i = 0; i < ancestors.length; i++) {\n const ancestor = ancestors[i];\n const transform = ancestor === null || ancestor === void 0 ? void 0 : ancestor.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n const optionalBody = ancestor === null || ancestor === void 0 ? void 0 : ancestor.get(_Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_11__.BodyComponent);\n if (transform) {\n let tx = transform.get();\n if (optionalBody) {\n if (this._engine.fixedUpdateTimestep && optionalBody.__oldTransformCaptured && optionalBody.enableFixedUpdateInterpolate) {\n // Interpolate graphics if needed\n const blend = this._engine.currentFrameLagMs / this._engine.fixedUpdateTimestep;\n tx = (0,_TransformInterpolation__WEBPACK_IMPORTED_MODULE_12__.blendTransform)(optionalBody.oldTransform, transform.get(), blend, this._targetInterpolationTransform);\n }\n }\n this._graphicsContext.z = transform.globalZ;\n this._graphicsContext.translate(tx.pos.x, tx.pos.y);\n this._graphicsContext.scale(tx.scale.x, tx.scale.y);\n this._graphicsContext.rotate(tx.rotation);\n }\n }\n }\n _applyOpacity(entity) {\n var _a;\n const ancestors = entity.getAncestors();\n for (let i = 0; i < ancestors.length; i++) {\n const ancestor = ancestors[i];\n const maybeGraphics = ancestor === null || ancestor === void 0 ? void 0 : ancestor.get(_GraphicsComponent__WEBPACK_IMPORTED_MODULE_3__.GraphicsComponent);\n this._graphicsContext.opacity *= (_a = maybeGraphics === null || maybeGraphics === void 0 ? void 0 : maybeGraphics.opacity) !== null && _a !== void 0 ? _a : 1;\n }\n }\n}\nGraphicsSystem.priority = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_13__.SystemPriority.Average;\n\n\n/***/ }),\n\n/***/ \"./Graphics/ImageSource.ts\":\n/*!*********************************!*\\\n !*** ./Graphics/ImageSource.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ImageSource: () => (/* binding */ ImageSource),\n/* harmony export */ ImageSourceAttributeConstants: () => (/* binding */ ImageSourceAttributeConstants)\n/* harmony export */ });\n/* harmony import */ var _Resources_Resource__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Resources/Resource */ \"./Resources/Resource.ts\");\n/* harmony import */ var _Sprite__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Sprite */ \"./Graphics/Sprite.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Future */ \"./Util/Future.ts\");\n/* harmony import */ var _Graphics_Context_texture_loader__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Graphics/Context/texture-loader */ \"./Graphics/Context/texture-loader.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Wrapping */ \"./Graphics/Wrapping.ts\");\n\n\n\n\n\n\n\nconst ImageSourceAttributeConstants = {\n Filtering: 'filtering',\n WrappingX: 'wrapping-x',\n WrappingY: 'wrapping-y'\n};\nclass ImageSource {\n /**\n * The original size of the source image in pixels\n */\n get width() {\n return this.image.naturalWidth;\n }\n /**\n * The original height of the source image in pixels\n */\n get height() {\n return this.image.naturalHeight;\n }\n /**\n * Returns true if the Texture is completely loaded and is ready\n * to be drawn.\n */\n isLoaded() {\n if (!this._src) {\n // this boosts speed of access\n this._src = this.data.src;\n }\n return !!this._src;\n }\n get image() {\n return this.data;\n }\n constructor(pathOrBase64, bustCacheOrOptions, filtering) {\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance();\n /**\n * Access to the underlying html image element\n */\n this.data = new Image();\n this._readyFuture = new _Util_Future__WEBPACK_IMPORTED_MODULE_1__.Future();\n /**\n * Promise the resolves when the image is loaded and ready for use, does not initiate loading\n */\n this.ready = this._readyFuture.promise;\n this.path = pathOrBase64;\n let bustCache = false;\n let wrapping;\n if (typeof bustCacheOrOptions === 'boolean') {\n bustCache = bustCacheOrOptions;\n }\n else {\n ({ filtering, wrapping, bustCache } = { ...bustCacheOrOptions });\n }\n this._resource = new _Resources_Resource__WEBPACK_IMPORTED_MODULE_2__.Resource(pathOrBase64, 'blob', bustCache);\n this.filtering = filtering !== null && filtering !== void 0 ? filtering : this.filtering;\n if (typeof wrapping === 'string') {\n this.wrapping = {\n x: wrapping,\n y: wrapping\n };\n }\n else {\n this.wrapping = wrapping !== null && wrapping !== void 0 ? wrapping : this.wrapping;\n }\n if (pathOrBase64.endsWith('.gif')) {\n this._logger.warn(`Use the ex.Gif type to load gifs, you may have mixed results with ${pathOrBase64} in ex.ImageSource. Fully supported: svg, jpg, bmp, and png`);\n }\n }\n /**\n * Create an ImageSource from and HTML tag element\n * @param image\n */\n static fromHtmlImageElement(image, options) {\n const imageSource = new ImageSource('');\n imageSource._src = 'image-element';\n imageSource.data = image;\n imageSource.data.setAttribute('data-original-src', 'image-element');\n if (options === null || options === void 0 ? void 0 : options.filtering) {\n imageSource.data.setAttribute(ImageSourceAttributeConstants.Filtering, options === null || options === void 0 ? void 0 : options.filtering);\n }\n else {\n imageSource.data.setAttribute(ImageSourceAttributeConstants.Filtering, _Filtering__WEBPACK_IMPORTED_MODULE_3__.ImageFiltering.Blended);\n }\n if (options === null || options === void 0 ? void 0 : options.wrapping) {\n let wrapping;\n if (typeof options.wrapping === 'string') {\n wrapping = {\n x: options.wrapping,\n y: options.wrapping\n };\n }\n else {\n wrapping = {\n x: options.wrapping.x,\n y: options.wrapping.y\n };\n }\n imageSource.data.setAttribute(ImageSourceAttributeConstants.WrappingX, wrapping.x);\n imageSource.data.setAttribute(ImageSourceAttributeConstants.WrappingY, wrapping.y);\n }\n else {\n imageSource.data.setAttribute(ImageSourceAttributeConstants.WrappingX, _Wrapping__WEBPACK_IMPORTED_MODULE_4__.ImageWrapping.Clamp);\n imageSource.data.setAttribute(ImageSourceAttributeConstants.WrappingY, _Wrapping__WEBPACK_IMPORTED_MODULE_4__.ImageWrapping.Clamp);\n }\n _Graphics_Context_texture_loader__WEBPACK_IMPORTED_MODULE_5__.TextureLoader.checkImageSizeSupportedAndLog(image);\n imageSource._readyFuture.resolve(image);\n return imageSource;\n }\n static fromHtmlCanvasElement(image, options) {\n const imageSource = new ImageSource('');\n imageSource._src = 'canvas-element-blob';\n imageSource.data.setAttribute('data-original-src', 'canvas-element-blob');\n if (options === null || options === void 0 ? void 0 : options.filtering) {\n imageSource.data.setAttribute(ImageSourceAttributeConstants.Filtering, options === null || options === void 0 ? void 0 : options.filtering);\n }\n else {\n imageSource.data.setAttribute(ImageSourceAttributeConstants.Filtering, _Filtering__WEBPACK_IMPORTED_MODULE_3__.ImageFiltering.Blended);\n }\n if (options === null || options === void 0 ? void 0 : options.wrapping) {\n let wrapping;\n if (typeof options.wrapping === 'string') {\n wrapping = {\n x: options.wrapping,\n y: options.wrapping\n };\n }\n else {\n wrapping = {\n x: options.wrapping.x,\n y: options.wrapping.y\n };\n }\n imageSource.data.setAttribute(ImageSourceAttributeConstants.WrappingX, wrapping.x);\n imageSource.data.setAttribute(ImageSourceAttributeConstants.WrappingY, wrapping.y);\n }\n else {\n imageSource.data.setAttribute(ImageSourceAttributeConstants.WrappingX, _Wrapping__WEBPACK_IMPORTED_MODULE_4__.ImageWrapping.Clamp);\n imageSource.data.setAttribute(ImageSourceAttributeConstants.WrappingY, _Wrapping__WEBPACK_IMPORTED_MODULE_4__.ImageWrapping.Clamp);\n }\n _Graphics_Context_texture_loader__WEBPACK_IMPORTED_MODULE_5__.TextureLoader.checkImageSizeSupportedAndLog(image);\n image.toBlob((blob) => {\n // TODO throw? if blob null?\n const url = URL.createObjectURL(blob);\n imageSource.image.onload = () => {\n // no longer need to read the blob so it's revoked\n URL.revokeObjectURL(url);\n imageSource.data = imageSource.image;\n imageSource._readyFuture.resolve(imageSource.image);\n };\n imageSource.image.src = url;\n });\n return imageSource;\n }\n static fromSvgString(svgSource, options) {\n const blob = new Blob([svgSource], { type: 'image/svg+xml' });\n const url = URL.createObjectURL(blob);\n return new ImageSource(url, options);\n }\n /**\n * Should excalibur add a cache busting querystring? By default false.\n * Must be set before loading\n */\n get bustCache() {\n return this._resource.bustCache;\n }\n set bustCache(val) {\n this._resource.bustCache = val;\n }\n /**\n * Begins loading the image and returns a promise that resolves when the image is loaded\n */\n async load() {\n var _a, _b, _c, _d;\n if (this.isLoaded()) {\n return this.data;\n }\n try {\n // Load base64 or blob if needed\n let url;\n if (!this.path.includes('data:image/')) {\n const blob = await this._resource.load();\n url = URL.createObjectURL(blob);\n }\n else {\n url = this.path;\n }\n // Decode the image\n const image = new Image();\n // Use Image.onload over Image.decode()\n // https://bugs.chromium.org/p/chromium/issues/detail?id=1055828#c7\n // Otherwise chrome will throw still Image.decode() failures for large textures\n const loadedFuture = new _Util_Future__WEBPACK_IMPORTED_MODULE_1__.Future();\n image.onload = () => loadedFuture.resolve();\n image.src = url;\n image.setAttribute('data-original-src', this.path);\n await loadedFuture.promise;\n // Set results\n // We defer loading the texture into webgl until the first draw that way we avoid a singleton\n // and for the multi-engine case the texture needs to be created in EACH webgl context to work\n // See image-renderer.ts draw()\n this.data = image;\n // emit warning if potentially too big\n _Graphics_Context_texture_loader__WEBPACK_IMPORTED_MODULE_5__.TextureLoader.checkImageSizeSupportedAndLog(this.data);\n }\n catch (error) {\n throw `Error loading ImageSource from path '${this.path}' with error [${error.message}]`;\n }\n // Do a bad thing to pass the filtering as an attribute\n this.data.setAttribute(ImageSourceAttributeConstants.Filtering, this.filtering); // TODO fix type\n this.data.setAttribute(ImageSourceAttributeConstants.WrappingX, (_b = (_a = this.wrapping) === null || _a === void 0 ? void 0 : _a.x) !== null && _b !== void 0 ? _b : _Wrapping__WEBPACK_IMPORTED_MODULE_4__.ImageWrapping.Clamp);\n this.data.setAttribute(ImageSourceAttributeConstants.WrappingY, (_d = (_c = this.wrapping) === null || _c === void 0 ? void 0 : _c.y) !== null && _d !== void 0 ? _d : _Wrapping__WEBPACK_IMPORTED_MODULE_4__.ImageWrapping.Clamp);\n // todo emit complete\n this._readyFuture.resolve(this.data);\n return this.data;\n }\n /**\n * Build a sprite from this ImageSource\n */\n toSprite(options) {\n return _Sprite__WEBPACK_IMPORTED_MODULE_6__.Sprite.from(this, options);\n }\n /**\n * Unload images from memory\n */\n unload() {\n this.data = new Image();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Line.ts\":\n/*!**************************!*\\\n !*** ./Graphics/Line.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Line: () => (/* binding */ Line)\n/* harmony export */ });\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n\n\n\nclass Line extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n constructor(options) {\n super();\n this.color = _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Black;\n this.thickness = 1;\n const { start, end, color, thickness } = options;\n this.start = start;\n this.end = end;\n this.color = color !== null && color !== void 0 ? color : this.color;\n this.thickness = thickness !== null && thickness !== void 0 ? thickness : this.thickness;\n this._localBounds = this._calculateBounds();\n const { width, height } = this._localBounds;\n this.width = width;\n this.height = height;\n }\n get localBounds() {\n return this._localBounds;\n }\n _calculateBounds() {\n const lineNormal = this.end.sub(this.start).normal();\n const halfThickness = this.thickness / 2;\n const points = [\n this.start.add(lineNormal.scale(halfThickness)),\n this.end.add(lineNormal.scale(halfThickness)),\n this.end.add(lineNormal.scale(-halfThickness)),\n this.start.add(lineNormal.scale(-halfThickness))\n ];\n return _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromPoints(points);\n }\n _drawImage(ctx, _x, _y) {\n ctx.drawLine(this.start, this.end, this.color, this.thickness);\n }\n clone() {\n return new Line({\n start: this.start,\n end: this.end,\n color: this.color,\n thickness: this.thickness\n });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/NineSlice.ts\":\n/*!*******************************!*\\\n !*** ./Graphics/NineSlice.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ NineSlice: () => (/* binding */ NineSlice),\n/* harmony export */ NineSliceStretch: () => (/* binding */ NineSliceStretch)\n/* harmony export */ });\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n\n\n\n/**\n * Nine slice stretch mode\n */\nvar NineSliceStretch;\n(function (NineSliceStretch) {\n /**\n * Stretch the image across a dimension\n */\n NineSliceStretch[\"Stretch\"] = \"stretch\";\n /**\n * Tile the image across a dimension\n */\n NineSliceStretch[\"Tile\"] = \"tile\";\n /**\n * Tile the image across a dimension but only by whole image amounts\n */\n NineSliceStretch[\"TileFit\"] = \"tile-fit\";\n})(NineSliceStretch || (NineSliceStretch = {}));\nclass NineSlice extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n constructor(config) {\n super(config);\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this._config = config;\n this._imgSource = config.source;\n this._canvasA = document.createElement('canvas');\n this._canvasB = document.createElement('canvas');\n this._canvasC = document.createElement('canvas');\n this._canvasD = document.createElement('canvas');\n this._canvasE = document.createElement('canvas');\n this._canvasF = document.createElement('canvas');\n this._canvasG = document.createElement('canvas');\n this._canvasH = document.createElement('canvas');\n this._canvasI = document.createElement('canvas');\n this._initialize();\n this._imgSource.ready.then(() => {\n this._initialize();\n });\n }\n /**\n * Sets the target width of the 9 slice (pixels), and recalculates the 9 slice if desired (auto)\n * @param newWidth\n * @param auto\n */\n setTargetWidth(newWidth, auto = false) {\n this._config.width = newWidth;\n if (auto) {\n this._initialize();\n }\n }\n /**\n * Sets the target height of the 9 slice (pixels), and recalculates the 9 slice if desired (auto)\n * @param newHeight\n * @param auto\n */\n setTargetHeight(newHeight, auto = false) {\n this._config.height = newHeight;\n if (auto) {\n this._initialize();\n }\n }\n /**\n * Sets the 9 slice margins (pixels), and recalculates the 9 slice if desired (auto)\n */\n setMargins(left, top, right, bottom, auto = false) {\n this._config.sourceConfig.leftMargin = left;\n this._config.sourceConfig.topMargin = top;\n this._config.sourceConfig.rightMargin = right;\n this._config.sourceConfig.bottomMargin = bottom;\n if (auto) {\n this._initialize();\n }\n }\n /**\n * Sets the stretching strategy for the 9 slice, and recalculates the 9 slice if desired (auto)\n *\n */\n setStretch(type, stretch, auto = false) {\n if (type === 'horizontal') {\n this._config.destinationConfig.horizontalStretch = stretch;\n }\n else if (type === 'vertical') {\n this._config.destinationConfig.verticalStretch = stretch;\n }\n else {\n this._config.destinationConfig.horizontalStretch = stretch;\n this._config.destinationConfig.verticalStretch = stretch;\n }\n if (auto) {\n this._initialize();\n }\n }\n /**\n * Returns the config of the 9 slice\n */\n getConfig() {\n return this._config;\n }\n /**\n * Draws 1 of the 9 tiles based on parameters passed in\n * context is the ExcaliburGraphicsContext from the _drawImage function\n * destinationSize is the size of the destination image as a vector (width,height)\n * targetCanvas is the canvas to draw to\n * horizontalStretch and verticalStretch are the horizontal and vertical stretching strategies\n * marginW and marginH are optional margins for the 9 slice for positioning\n * @param context\n * @param targetCanvas\n * @param destinationSize\n * @param horizontalStretch\n * @param verticalStretch\n * @param marginWidth\n * @param marginHeight\n */\n _drawTile(context, targetCanvas, destinationSize, horizontalStretch, verticalStretch, marginWidth, marginHeight) {\n const tempMarginW = marginWidth || 0;\n const tempMarginH = marginHeight || 0;\n let tempSizeX, tempPositionX, tempSizeY, tempPositionY;\n const numTilesX = this._getNumberOfTiles(targetCanvas.width, destinationSize.x, horizontalStretch);\n const numTilesY = this._getNumberOfTiles(targetCanvas.height, destinationSize.y, verticalStretch);\n for (let i = 0; i < numTilesX; i++) {\n for (let j = 0; j < numTilesY; j++) {\n let { tempSize, tempPosition } = this._calculateParams(i, numTilesX, targetCanvas.width, destinationSize.x, this._config.destinationConfig.horizontalStretch);\n tempSizeX = tempSize;\n tempPositionX = tempPosition;\n ({ tempSize, tempPosition } = this._calculateParams(j, numTilesY, targetCanvas.height, destinationSize.y, this._config.destinationConfig.verticalStretch));\n tempSizeY = tempSize;\n tempPositionY = tempPosition;\n context.drawImage(targetCanvas, 0, 0, targetCanvas.width, targetCanvas.height, tempMarginW + tempPositionX, tempMarginH + tempPositionY, tempSizeX, tempSizeY);\n }\n }\n }\n /**\n * Draws the 9 slices to the canvas\n */\n _drawImage(ex, x, y) {\n if (this._imgSource.isLoaded()) {\n // Top left, no stretching\n this._drawTile(ex, this._canvasA, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.sourceConfig.leftMargin, this._config.sourceConfig.topMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch);\n // Top, middle, horizontal stretching\n this._drawTile(ex, this._canvasB, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.width - this._config.sourceConfig.leftMargin - this._config.sourceConfig.rightMargin, this._config.sourceConfig.topMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch, this._config.sourceConfig.leftMargin, 0);\n // Top right, no stretching\n this._drawTile(ex, this._canvasC, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.sourceConfig.rightMargin, this._config.sourceConfig.topMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch, this._config.width - this._config.sourceConfig.rightMargin, 0);\n // middle, left, vertical stretching\n this._drawTile(ex, this._canvasD, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.sourceConfig.leftMargin, this._config.height - this._config.sourceConfig.bottomMargin - this._config.sourceConfig.topMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch, 0, this._config.sourceConfig.topMargin);\n // center, both stretching\n if (this._config.destinationConfig.drawCenter) {\n this._drawTile(ex, this._canvasE, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.width - this._config.sourceConfig.leftMargin - this._config.sourceConfig.rightMargin, this._config.height - this._config.sourceConfig.bottomMargin - this._config.sourceConfig.topMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch, this._config.sourceConfig.leftMargin, this._config.sourceConfig.topMargin);\n }\n // middle, right, vertical stretching\n this._drawTile(ex, this._canvasF, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.sourceConfig.rightMargin, this._config.height - this._config.sourceConfig.bottomMargin - this._config.sourceConfig.topMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch, this._config.width - this._config.sourceConfig.rightMargin, this._config.sourceConfig.topMargin);\n // bottom left, no stretching\n this._drawTile(ex, this._canvasG, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.sourceConfig.leftMargin, this._config.sourceConfig.bottomMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch, 0, this._config.height - this._config.sourceConfig.bottomMargin);\n // bottom middle, horizontal stretching\n this._drawTile(ex, this._canvasH, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.width - this._config.sourceConfig.leftMargin - this._config.sourceConfig.rightMargin, this._config.sourceConfig.bottomMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch, this._config.sourceConfig.leftMargin, this._config.height - this._config.sourceConfig.bottomMargin);\n // bottom right, no stretching\n this._drawTile(ex, this._canvasI, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.sourceConfig.rightMargin, this._config.sourceConfig.bottomMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch, this._config.width - this._config.sourceConfig.rightMargin, this._config.height - this._config.sourceConfig.bottomMargin);\n }\n else {\n this._logger.warnOnce(`NineSlice ImageSource ${this._imgSource.path}` +\n ` is not yet loaded and won't be drawn. Please call .load() or include in a Loader.\\n\\n` +\n `Read https://excaliburjs.com/docs/imagesource for more information.`);\n }\n }\n /**\n * Slices the source sprite into the 9 slice canvases internally\n */\n _initialize() {\n this._sourceSprite = this._imgSource.image;\n // top left slice\n this._canvasA.width = this._config.sourceConfig.leftMargin;\n this._canvasA.height = this._config.sourceConfig.topMargin;\n const aCtx = this._canvasA.getContext('2d');\n aCtx === null || aCtx === void 0 ? void 0 : aCtx.drawImage(this._sourceSprite, 0, 0, this._canvasA.width, this._canvasA.height, 0, 0, this._canvasA.width, this._canvasA.height);\n // top slice\n this._canvasB.width = this._config.sourceConfig.width - this._config.sourceConfig.leftMargin - this._config.sourceConfig.rightMargin;\n this._canvasB.height = this._config.sourceConfig.topMargin;\n const bCtx = this._canvasB.getContext('2d');\n bCtx === null || bCtx === void 0 ? void 0 : bCtx.drawImage(this._sourceSprite, this._config.sourceConfig.leftMargin, 0, this._canvasB.width, this._canvasB.height, 0, 0, this._canvasB.width, this._canvasB.height);\n // top right slice\n this._canvasC.width = this._config.sourceConfig.rightMargin;\n this._canvasC.height = this._config.sourceConfig.topMargin;\n const cCtx = this._canvasC.getContext('2d');\n cCtx === null || cCtx === void 0 ? void 0 : cCtx.drawImage(this._sourceSprite, this._sourceSprite.width - this._config.sourceConfig.rightMargin, 0, this._canvasC.width, this._canvasC.height, 0, 0, this._canvasC.width, this._canvasC.height);\n // middle left slice\n this._canvasD.width = this._config.sourceConfig.leftMargin;\n this._canvasD.height = this._config.sourceConfig.height - this._config.sourceConfig.topMargin - this._config.sourceConfig.bottomMargin;\n const dCtx = this._canvasD.getContext('2d');\n dCtx === null || dCtx === void 0 ? void 0 : dCtx.drawImage(this._sourceSprite, 0, this._config.sourceConfig.topMargin, this._canvasD.width, this._canvasD.height, 0, 0, this._canvasD.width, this._canvasD.height);\n // middle slice\n this._canvasE.width = this._config.sourceConfig.width - this._config.sourceConfig.leftMargin - this._config.sourceConfig.rightMargin;\n this._canvasE.height = this._config.sourceConfig.height - this._config.sourceConfig.topMargin - this._config.sourceConfig.bottomMargin;\n const eCtx = this._canvasE.getContext('2d');\n eCtx === null || eCtx === void 0 ? void 0 : eCtx.drawImage(this._sourceSprite, this._config.sourceConfig.leftMargin, this._config.sourceConfig.topMargin, this._canvasE.width, this._canvasE.height, 0, 0, this._canvasE.width, this._canvasE.height);\n // middle right slice\n this._canvasF.width = this._config.sourceConfig.rightMargin;\n this._canvasF.height = this._config.sourceConfig.height - this._config.sourceConfig.topMargin - this._config.sourceConfig.bottomMargin;\n const fCtx = this._canvasF.getContext('2d');\n fCtx === null || fCtx === void 0 ? void 0 : fCtx.drawImage(this._sourceSprite, this._config.sourceConfig.width - this._config.sourceConfig.rightMargin, this._config.sourceConfig.topMargin, this._canvasF.width, this._canvasF.height, 0, 0, this._canvasF.width, this._canvasF.height);\n // bottom left slice\n this._canvasG.width = this._config.sourceConfig.leftMargin;\n this._canvasG.height = this._config.sourceConfig.bottomMargin;\n const gCtx = this._canvasG.getContext('2d');\n gCtx === null || gCtx === void 0 ? void 0 : gCtx.drawImage(this._sourceSprite, 0, this._config.sourceConfig.height - this._config.sourceConfig.bottomMargin, this._canvasG.width, this._canvasG.height, 0, 0, this._canvasG.width, this._canvasG.height);\n // bottom slice\n this._canvasH.width = this._config.sourceConfig.width - this._config.sourceConfig.leftMargin - this._config.sourceConfig.rightMargin;\n this._canvasH.height = this._config.sourceConfig.bottomMargin;\n const hCtx = this._canvasH.getContext('2d');\n hCtx === null || hCtx === void 0 ? void 0 : hCtx.drawImage(this._sourceSprite, this._config.sourceConfig.leftMargin, this._config.sourceConfig.height - this._config.sourceConfig.bottomMargin, this._canvasH.width, this._canvasH.height, 0, 0, this._canvasH.width, this._canvasH.height);\n // bottom right slice\n this._canvasI.width = this._config.sourceConfig.rightMargin;\n this._canvasI.height = this._config.sourceConfig.bottomMargin;\n const iCtx = this._canvasI.getContext('2d');\n iCtx === null || iCtx === void 0 ? void 0 : iCtx.drawImage(this._sourceSprite, this._sourceSprite.width - this._config.sourceConfig.rightMargin, this._config.sourceConfig.height - this._config.sourceConfig.bottomMargin, this._canvasI.width, this._canvasI.height, 0, 0, this._canvasI.width, this._canvasI.height);\n }\n /**\n * Clones the 9 slice\n */\n clone() {\n return new NineSlice(this._config);\n }\n /**\n * Returns the number of tiles\n */\n _getNumberOfTiles(tileSize, destinationSize, strategy) {\n switch (strategy) {\n case NineSliceStretch.Stretch:\n return 1;\n case NineSliceStretch.Tile:\n return Math.ceil(destinationSize / tileSize);\n case NineSliceStretch.TileFit:\n return Math.ceil(destinationSize / tileSize);\n }\n }\n /**\n * Returns the position and size of the tile\n */\n _calculateParams(tileNum, numTiles, tileSize, destinationSize, strategy) {\n switch (strategy) {\n case NineSliceStretch.Stretch:\n return {\n tempPosition: 0,\n tempSize: destinationSize\n };\n case NineSliceStretch.Tile:\n // if last tile, adjust size\n if (tileNum === numTiles - 1) {\n //last tile\n return {\n tempPosition: tileNum * tileSize,\n tempSize: tileSize - (numTiles * tileSize - destinationSize)\n };\n }\n else {\n return {\n tempPosition: tileNum * tileSize,\n tempSize: tileSize\n };\n }\n case NineSliceStretch.TileFit:\n const reducedTileSize = destinationSize / numTiles;\n const position = tileNum * reducedTileSize;\n return {\n tempPosition: position,\n tempSize: reducedTileSize\n };\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/OffscreenSystem.ts\":\n/*!*************************************!*\\\n !*** ./Graphics/OffscreenSystem.ts ***!\n \\*************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ OffscreenSystem: () => (/* binding */ OffscreenSystem)\n/* harmony export */ });\n/* harmony import */ var _GraphicsComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _ParallaxComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./ParallaxComponent */ \"./Graphics/ParallaxComponent.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Math/coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Priority.ts\");\n\n\n\n\n\n\n\n\nclass OffscreenSystem extends _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.System {\n constructor(world) {\n super();\n this.world = world;\n this.systemType = _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.SystemType.Draw;\n this.query = this.world.query([_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent, _GraphicsComponent__WEBPACK_IMPORTED_MODULE_2__.GraphicsComponent]);\n }\n initialize(world, scene) {\n this._camera = scene.camera;\n this._screen = scene.engine.screen;\n }\n update() {\n this._worldBounds = this._screen.getWorldBounds();\n let transform;\n let graphics;\n let maybeParallax;\n for (let i = 0; i < this.query.entities.length; i++) {\n const entity = this.query.entities[i];\n graphics = entity.get(_GraphicsComponent__WEBPACK_IMPORTED_MODULE_2__.GraphicsComponent);\n transform = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n maybeParallax = entity.get(_ParallaxComponent__WEBPACK_IMPORTED_MODULE_3__.ParallaxComponent);\n let parallaxOffset;\n if (maybeParallax) {\n // We use the Tiled formula\n // https://doc.mapeditor.org/en/latest/manual/layers/#parallax-scrolling-factor\n // cameraPos * (1 - parallaxFactor)\n const oneMinusFactor = _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.One.sub(maybeParallax.parallaxFactor);\n parallaxOffset = this._camera.pos.scale(oneMinusFactor);\n }\n // Figure out if entities are offscreen\n const entityOffscreen = this._isOffscreen(transform, graphics, parallaxOffset);\n if (entityOffscreen && !entity.hasTag('ex.offscreen')) {\n entity.events.emit('exitviewport', new _Events__WEBPACK_IMPORTED_MODULE_5__.ExitViewPortEvent(entity));\n entity.addTag('ex.offscreen');\n }\n if (!entityOffscreen && entity.hasTag('ex.offscreen')) {\n entity.events.emit('enterviewport', new _Events__WEBPACK_IMPORTED_MODULE_5__.EnterViewPortEvent(entity));\n entity.removeTag('ex.offscreen');\n }\n }\n }\n _isOffscreen(transform, graphics, parallaxOffset) {\n if (graphics.forceOnScreen) {\n return false;\n }\n if (transform.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__.CoordPlane.World) {\n let bounds = graphics.localBounds;\n if (parallaxOffset) {\n bounds = bounds.translate(parallaxOffset);\n }\n const transformedBounds = bounds.transform(transform.get().matrix);\n const graphicsOffscreen = !this._worldBounds.overlaps(transformedBounds);\n return graphicsOffscreen;\n }\n else {\n // TODO screen coordinates\n return false;\n }\n }\n}\nOffscreenSystem.priority = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_7__.SystemPriority.Higher;\n\n\n/***/ }),\n\n/***/ \"./Graphics/ParallaxComponent.ts\":\n/*!***************************************!*\\\n !*** ./Graphics/ParallaxComponent.ts ***!\n \\***************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ParallaxComponent: () => (/* binding */ ParallaxComponent)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Component */ \"./EntityComponentSystem/Component.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n\n\nclass ParallaxComponent extends _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor(parallaxFactor) {\n super();\n this.parallaxFactor = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(1.0, 1.0);\n this.parallaxFactor = parallaxFactor !== null && parallaxFactor !== void 0 ? parallaxFactor : this.parallaxFactor;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Polygon.ts\":\n/*!*****************************!*\\\n !*** ./Graphics/Polygon.ts ***!\n \\*****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Polygon: () => (/* binding */ Polygon)\n/* harmony export */ });\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Raster__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Raster */ \"./Graphics/Raster.ts\");\n\n\n\n/**\n * A polygon {@apilink Graphic} for drawing arbitrary polygons to the {@apilink ExcaliburGraphicsContext}\n *\n * Polygons default to {@apilink ImageFiltering.Blended}\n */\nclass Polygon extends _Raster__WEBPACK_IMPORTED_MODULE_0__.Raster {\n get points() {\n return this._points;\n }\n set points(points) {\n this._points = points;\n const min = this.minPoint;\n this.width = this._points.reduce((max, p) => Math.max(p.x, max), 0) - min.x;\n this.height = this._points.reduce((max, p) => Math.max(p.y, max), 0) - min.y;\n this.flagDirty();\n }\n get minPoint() {\n const minX = this._points.reduce((min, p) => Math.min(p.x, min), Infinity);\n const minY = this._points.reduce((min, p) => Math.min(p.y, min), Infinity);\n return (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(minX, minY);\n }\n constructor(options) {\n super(options);\n this._points = [];\n this.points = options.points;\n this.filtering = _Filtering__WEBPACK_IMPORTED_MODULE_2__.ImageFiltering.Blended;\n this.rasterize();\n }\n clone() {\n return new Polygon({\n points: this.points.map((p) => p.clone()),\n ...this.cloneGraphicOptions(),\n ...this.cloneRasterOptions()\n });\n }\n execute(ctx) {\n if (this.points && this.points.length) {\n ctx.beginPath();\n // Iterate through the supplied points and construct a 'polygon'\n const min = this.minPoint.negate();\n const firstPoint = this.points[0].add(min);\n ctx.moveTo(firstPoint.x, firstPoint.y);\n this.points.forEach((point) => {\n ctx.lineTo(point.x + min.x, point.y + min.y);\n });\n ctx.lineTo(firstPoint.x, firstPoint.y);\n ctx.closePath();\n if (this.color) {\n ctx.fill();\n }\n if (this.strokeColor) {\n ctx.stroke();\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/PostProcessor/ColorBlindnessMode.ts\":\n/*!******************************************************!*\\\n !*** ./Graphics/PostProcessor/ColorBlindnessMode.ts ***!\n \\******************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ColorBlindnessMode: () => (/* binding */ ColorBlindnessMode)\n/* harmony export */ });\nvar ColorBlindnessMode;\n(function (ColorBlindnessMode) {\n ColorBlindnessMode[\"Protanope\"] = \"Protanope\";\n ColorBlindnessMode[\"Deuteranope\"] = \"Deuteranope\";\n ColorBlindnessMode[\"Tritanope\"] = \"Tritanope\";\n})(ColorBlindnessMode || (ColorBlindnessMode = {}));\n\n\n/***/ }),\n\n/***/ \"./Graphics/PostProcessor/ColorBlindnessPostProcessor.ts\":\n/*!***************************************************************!*\\\n !*** ./Graphics/PostProcessor/ColorBlindnessPostProcessor.ts ***!\n \\***************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ColorBlindnessPostProcessor: () => (/* binding */ ColorBlindnessPostProcessor)\n/* harmony export */ });\n/* harmony import */ var _color_blind_fragment_glsl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./color-blind-fragment.glsl */ \"./Graphics/PostProcessor/color-blind-fragment.glsl\");\n/* harmony import */ var _ColorBlindnessMode__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ColorBlindnessMode */ \"./Graphics/PostProcessor/ColorBlindnessMode.ts\");\n/* harmony import */ var _ScreenShader__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ScreenShader */ \"./Graphics/PostProcessor/ScreenShader.ts\");\n\n\n\nclass ColorBlindnessPostProcessor {\n constructor(_colorBlindnessMode, simulate = false) {\n this._colorBlindnessMode = _colorBlindnessMode;\n this._simulate = false;\n this._simulate = simulate;\n }\n initialize(gl) {\n this._shader = new _ScreenShader__WEBPACK_IMPORTED_MODULE_0__.ScreenShader(gl, _color_blind_fragment_glsl__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n this.simulate = this._simulate;\n this.colorBlindnessMode = this._colorBlindnessMode;\n }\n getShader() {\n return this._shader.getShader();\n }\n getLayout() {\n return this._shader.getLayout();\n }\n set colorBlindnessMode(colorBlindMode) {\n this._colorBlindnessMode = colorBlindMode;\n if (this._shader) {\n const shader = this._shader.getShader();\n shader.use();\n if (this._colorBlindnessMode === _ColorBlindnessMode__WEBPACK_IMPORTED_MODULE_2__.ColorBlindnessMode.Protanope) {\n shader.setUniformInt('u_type', 0);\n }\n else if (this._colorBlindnessMode === _ColorBlindnessMode__WEBPACK_IMPORTED_MODULE_2__.ColorBlindnessMode.Deuteranope) {\n shader.setUniformInt('u_type', 1);\n }\n else if (this._colorBlindnessMode === _ColorBlindnessMode__WEBPACK_IMPORTED_MODULE_2__.ColorBlindnessMode.Tritanope) {\n shader.setUniformInt('u_type', 2);\n }\n }\n }\n get colorBlindnessMode() {\n return this._colorBlindnessMode;\n }\n set simulate(value) {\n this._simulate = value;\n if (this._shader) {\n const shader = this._shader.getShader();\n shader.use();\n shader.setUniformBoolean('u_simulate', value);\n }\n }\n get simulate() {\n return this._simulate;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/PostProcessor/ScreenShader.ts\":\n/*!************************************************!*\\\n !*** ./Graphics/PostProcessor/ScreenShader.ts ***!\n \\************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ScreenShader: () => (/* binding */ ScreenShader)\n/* harmony export */ });\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Context_shader__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Context/shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _Context_vertex_buffer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Context/vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _Context_vertex_layout__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Context/vertex-layout */ \"./Graphics/Context/vertex-layout.ts\");\n\n\n\n\n/**\n * Helper that defines a whole screen renderer, just provide a fragment source!\n *\n * Currently supports 1 varying\n * - vec2 a_texcoord between 0-1 which corresponds to screen position\n */\nclass ScreenShader {\n constructor(gl, fragmentSource) {\n if (true) {\n if (fragmentSource.includes('v_texcoord')) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance().warn(`ScreenShader: \"v_texcoord\" is deprecated in postprocessing fragment shaders will be removed in v1.0,` +\n ` use \"v_uv\" instead. Source [${fragmentSource}]`);\n }\n }\n this._shader = new _Context_shader__WEBPACK_IMPORTED_MODULE_1__.Shader({\n gl,\n vertexSource: `#version 300 es\r\n in vec2 a_position;\r\n in vec2 a_uv;\r\n out vec2 v_texcoord;\r\n out vec2 v_uv;\r\n\r\n void main() {\r\n gl_Position = vec4(a_position, 0.0, 1.0);\r\n // Pass the texcoord to the fragment shader.\r\n v_texcoord = a_uv;\r\n v_uv = a_uv;\r\n }`,\n fragmentSource: fragmentSource\n });\n this._shader.compile();\n // Setup memory layout\n this._buffer = new _Context_vertex_buffer__WEBPACK_IMPORTED_MODULE_2__.VertexBuffer({\n gl,\n type: 'static',\n // clip space quad + uv since we don't need a camera\n data: new Float32Array([\n -1, -1, 0, 0, -1, 1, 0, 1, 1, -1, 1, 0,\n 1, -1, 1, 0, -1, 1, 0, 1, 1, 1, 1, 1\n ])\n });\n this._layout = new _Context_vertex_layout__WEBPACK_IMPORTED_MODULE_3__.VertexLayout({\n gl,\n shader: this._shader,\n vertexBuffer: this._buffer,\n attributes: [\n ['a_position', 2],\n ['a_uv', 2]\n ]\n });\n this._buffer.upload();\n }\n getShader() {\n return this._shader;\n }\n getLayout() {\n return this._layout;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Raster.ts\":\n/*!****************************!*\\\n !*** ./Graphics/Raster.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Raster: () => (/* binding */ Raster)\n/* harmony export */ });\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Util_Watch__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Util/Watch */ \"./Util/Watch.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Util */ \"./Util/Util.ts\");\n\n\n\n\n\n\n/**\n * A Raster is a Graphic that needs to be first painted to a HTMLCanvasElement before it can be drawn to the\n * {@apilink ExcaliburGraphicsContext}. This is useful for generating custom images using the 2D canvas api.\n *\n * Implementors must implement the {@apilink Raster.execute} method to rasterize their drawing.\n */\nclass Raster extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n constructor(options) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;\n super((0,_Util_Util__WEBPACK_IMPORTED_MODULE_1__.omit)({ ...options }, ['width', 'height'])); // rasters do some special sauce with width/height\n this.lineCap = 'butt';\n this.quality = 1;\n this._dirty = true;\n this._smoothing = false;\n this._color = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_2__.watch)(_Color__WEBPACK_IMPORTED_MODULE_3__.Color.Black, () => this.flagDirty());\n this._lineWidth = 1;\n this._lineDash = [];\n this._padding = 0;\n if (options) {\n this.quality = (_a = options.quality) !== null && _a !== void 0 ? _a : this.quality;\n this.color = (_b = options.color) !== null && _b !== void 0 ? _b : _Color__WEBPACK_IMPORTED_MODULE_3__.Color.Black;\n this.strokeColor = options === null || options === void 0 ? void 0 : options.strokeColor;\n this.smoothing = (_c = options.smoothing) !== null && _c !== void 0 ? _c : this.smoothing;\n this.lineWidth = (_d = options.lineWidth) !== null && _d !== void 0 ? _d : this.lineWidth;\n this.lineDash = (_e = options.lineDash) !== null && _e !== void 0 ? _e : this.lineDash;\n this.lineCap = (_f = options.lineCap) !== null && _f !== void 0 ? _f : this.lineCap;\n this.padding = (_g = options.padding) !== null && _g !== void 0 ? _g : this.padding;\n this.filtering = (_h = options.filtering) !== null && _h !== void 0 ? _h : this.filtering;\n }\n this._bitmap = document.createElement('canvas');\n // get the default canvas width/height as a fallback\n const bitmapWidth = (_j = options === null || options === void 0 ? void 0 : options.width) !== null && _j !== void 0 ? _j : this._bitmap.width;\n const bitmapHeight = (_k = options === null || options === void 0 ? void 0 : options.height) !== null && _k !== void 0 ? _k : this._bitmap.height;\n this.width = bitmapWidth;\n this.height = bitmapHeight;\n const maybeCtx = this._bitmap.getContext('2d');\n if (!maybeCtx) {\n /* istanbul ignore next */\n throw new Error('Browser does not support 2d canvas drawing, cannot create Raster graphic');\n }\n else {\n this._ctx = maybeCtx;\n }\n }\n cloneRasterOptions() {\n return {\n color: this.color ? this.color.clone() : undefined,\n strokeColor: this.strokeColor ? this.strokeColor.clone() : undefined,\n smoothing: this.smoothing,\n lineWidth: this.lineWidth,\n lineDash: this.lineDash,\n lineCap: this.lineCap,\n quality: this.quality,\n padding: this.padding\n };\n }\n /**\n * Gets whether the graphic is dirty, this means there are changes that haven't been re-rasterized\n */\n get dirty() {\n return this._dirty;\n }\n /**\n * Flags the graphic as dirty, meaning it must be re-rasterized before draw.\n * This should be called any time the graphics state changes such that it affects the outputted drawing\n */\n flagDirty() {\n this._dirty = true;\n }\n /**\n * Gets or sets the current width of the Raster graphic. Setting the width will cause the raster\n * to be flagged dirty causing a re-raster on the next draw.\n *\n * Any `padding`s or `quality` set will be factored into the width\n */\n get width() {\n return Math.abs(this._getTotalWidth() * this.scale.x);\n }\n set width(value) {\n value /= Math.abs(this.scale.x);\n this._bitmap.width = value;\n this._originalWidth = value;\n this.flagDirty();\n }\n /**\n * Gets or sets the current height of the Raster graphic. Setting the height will cause the raster\n * to be flagged dirty causing a re-raster on the next draw.\n *\n * Any `padding` or `quality` set will be factored into the height\n */\n get height() {\n return Math.abs(this._getTotalHeight() * this.scale.y);\n }\n set height(value) {\n value /= Math.abs(this.scale.y);\n this._bitmap.height = value;\n this._originalHeight = value;\n this.flagDirty();\n }\n _getTotalWidth() {\n var _a;\n return (((_a = this._originalWidth) !== null && _a !== void 0 ? _a : this._bitmap.width) + this.padding * 2) * 1;\n }\n _getTotalHeight() {\n var _a;\n return (((_a = this._originalHeight) !== null && _a !== void 0 ? _a : this._bitmap.height) + this.padding * 2) * 1;\n }\n /**\n * Returns the local bounds of the Raster including the padding\n */\n get localBounds() {\n return _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_4__.BoundingBox.fromDimension(this._getTotalWidth() * this.scale.x, this._getTotalHeight() * this.scale.y, _Math_vector__WEBPACK_IMPORTED_MODULE_5__.Vector.Zero);\n }\n /**\n * Gets or sets the smoothing (anti-aliasing of the graphic). Setting the height will cause the raster\n * to be flagged dirty causing a re-raster on the next draw.\n */\n get smoothing() {\n return this._smoothing;\n }\n set smoothing(value) {\n this._smoothing = value;\n this.flagDirty();\n }\n /**\n * Gets or sets the fillStyle of the Raster graphic. Setting the fillStyle will cause the raster to be\n * flagged dirty causing a re-raster on the next draw.\n */\n get color() {\n return this._color;\n }\n set color(value) {\n this.flagDirty();\n this._color = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_2__.watch)(value, () => this.flagDirty());\n }\n /**\n * Gets or sets the strokeStyle of the Raster graphic. Setting the strokeStyle will cause the raster to be\n * flagged dirty causing a re-raster on the next draw.\n */\n get strokeColor() {\n return this._strokeColor;\n }\n set strokeColor(value) {\n this.flagDirty();\n if (value) {\n this._strokeColor = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_2__.watch)(value, () => this.flagDirty());\n }\n }\n /**\n * Gets or sets the line width of the Raster graphic. Setting the lineWidth will cause the raster to be\n * flagged dirty causing a re-raster on the next draw.\n */\n get lineWidth() {\n return this._lineWidth;\n }\n set lineWidth(value) {\n this._lineWidth = value;\n this.flagDirty();\n }\n get lineDash() {\n return this._lineDash;\n }\n set lineDash(value) {\n this._lineDash = value;\n this.flagDirty();\n }\n get padding() {\n return this._padding;\n }\n set padding(value) {\n this._padding = value;\n this.flagDirty();\n }\n /**\n * Rasterize the graphic to a bitmap making it usable as in excalibur. Rasterize is called automatically if\n * the graphic is {@apilink Raster.dirty} on the next {@apilink Graphic.draw} call\n */\n rasterize() {\n this._dirty = false;\n this._ctx.clearRect(0, 0, this._getTotalWidth(), this._getTotalHeight());\n this._ctx.save();\n this._applyRasterProperties(this._ctx);\n this.execute(this._ctx);\n this._ctx.restore();\n }\n _applyRasterProperties(ctx) {\n var _a, _b, _c, _d;\n this._bitmap.width = this._getTotalWidth() * this.quality;\n this._bitmap.height = this._getTotalHeight() * this.quality;\n // Do a bad thing to pass the filtering as an attribute\n this._bitmap.setAttribute('filtering', this.filtering);\n this._bitmap.setAttribute('forceUpload', 'true');\n ctx.scale(this.quality, this.quality);\n ctx.translate(this.padding, this.padding);\n ctx.imageSmoothingEnabled = this.smoothing;\n ctx.lineWidth = this.lineWidth;\n ctx.setLineDash((_a = this.lineDash) !== null && _a !== void 0 ? _a : ctx.getLineDash());\n ctx.lineCap = this.lineCap;\n ctx.strokeStyle = (_c = (_b = this.strokeColor) === null || _b === void 0 ? void 0 : _b.toString()) !== null && _c !== void 0 ? _c : '';\n ctx.fillStyle = (_d = this.color) === null || _d === void 0 ? void 0 : _d.toString();\n }\n _drawImage(ex, x, y) {\n if (this._dirty) {\n this.rasterize();\n }\n ex.scale(1 / this.quality, 1 / this.quality);\n ex.drawImage(this._bitmap, x, y);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Rectangle.ts\":\n/*!*******************************!*\\\n !*** ./Graphics/Rectangle.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Rectangle: () => (/* binding */ Rectangle)\n/* harmony export */ });\n/* harmony import */ var _Raster__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Raster */ \"./Graphics/Raster.ts\");\n\n/**\n * A Rectangle {@apilink Graphic} for drawing rectangles to the {@apilink ExcaliburGraphicsContext}\n */\nclass Rectangle extends _Raster__WEBPACK_IMPORTED_MODULE_0__.Raster {\n constructor(options) {\n super(options);\n this.width = options.width;\n this.height = options.height;\n this.rasterize();\n }\n clone() {\n return new Rectangle({\n width: this.width,\n height: this.height,\n ...this.cloneGraphicOptions(),\n ...this.cloneRasterOptions()\n });\n }\n execute(ctx) {\n if (this.color) {\n ctx.fillRect(0, 0, this.width, this.height);\n }\n if (this.strokeColor) {\n ctx.strokeRect(0, 0, this.width, this.height);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Sprite.ts\":\n/*!****************************!*\\\n !*** ./Graphics/Sprite.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Sprite: () => (/* binding */ Sprite)\n/* harmony export */ });\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n\n\nclass Sprite extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n static from(image, options) {\n return new Sprite({\n image,\n ...options\n });\n }\n constructor(options) {\n var _a, _b;\n super(options);\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this._dirty = true;\n this.image = options.image;\n const { width, height } = options;\n this.sourceView = (_a = options.sourceView) !== null && _a !== void 0 ? _a : { x: 0, y: 0, width: width !== null && width !== void 0 ? width : 0, height: height !== null && height !== void 0 ? height : 0 };\n this.destSize = (_b = options.destSize) !== null && _b !== void 0 ? _b : { width: width !== null && width !== void 0 ? width : 0, height: height !== null && height !== void 0 ? height : 0 };\n this._updateSpriteDimensions();\n // Fire when loaded\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.image.ready.then(() => {\n this._updateSpriteDimensions();\n });\n }\n get width() {\n return Math.abs(this.destSize.width * this.scale.x);\n }\n get height() {\n return Math.abs(this.destSize.height * this.scale.y);\n }\n set width(newWidth) {\n newWidth /= Math.abs(this.scale.x);\n this.destSize.width = newWidth;\n super.width = Math.ceil(this.destSize.width);\n }\n set height(newHeight) {\n newHeight /= Math.abs(this.scale.y);\n this.destSize.height = newHeight;\n super.height = Math.ceil(this.destSize.height);\n }\n _updateSpriteDimensions() {\n var _a, _b, _c, _d, _e, _f;\n const { width: nativeWidth, height: nativeHeight } = this.image;\n // This code uses || to avoid 0's\n // If the source is not specified, use the native dimension\n this.sourceView.width = ((_a = this.sourceView) === null || _a === void 0 ? void 0 : _a.width) || nativeWidth;\n this.sourceView.height = ((_b = this.sourceView) === null || _b === void 0 ? void 0 : _b.height) || nativeHeight;\n // If the destination is not specified, use the source if specified, then native\n this.destSize.width = ((_c = this.destSize) === null || _c === void 0 ? void 0 : _c.width) || ((_d = this.sourceView) === null || _d === void 0 ? void 0 : _d.width) || nativeWidth;\n this.destSize.height = ((_e = this.destSize) === null || _e === void 0 ? void 0 : _e.height) || ((_f = this.sourceView) === null || _f === void 0 ? void 0 : _f.height) || nativeHeight;\n this.width = Math.ceil(this.destSize.width) * this.scale.x;\n this.height = Math.ceil(this.destSize.height) * this.scale.y;\n }\n _preDraw(ex, x, y) {\n if (this.image.isLoaded() && this._dirty) {\n this._dirty = false;\n this._updateSpriteDimensions();\n }\n super._preDraw(ex, x, y);\n }\n _drawImage(ex, x, y) {\n if (this.image.isLoaded()) {\n ex.drawImage(this.image.image, this.sourceView.x, this.sourceView.y, this.sourceView.width, this.sourceView.height, x, y, this.destSize.width, this.destSize.height);\n }\n else {\n this._logger.warnOnce(`ImageSource ${this.image.path}` +\n ` is not yet loaded and won't be drawn. Please call .load() or include in a Loader.\\n\\n` +\n `Read https://excaliburjs.com/docs/imagesource for more information.`);\n }\n }\n clone() {\n return new Sprite({\n image: this.image,\n sourceView: { ...this.sourceView },\n destSize: { ...this.destSize },\n ...this.cloneGraphicOptions()\n });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/SpriteFont.ts\":\n/*!********************************!*\\\n !*** ./Graphics/SpriteFont.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SpriteFont: () => (/* binding */ SpriteFont)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n\n\n\n\nclass SpriteFont extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n constructor(options) {\n super(options);\n this._text = '';\n this.alphabet = '';\n this.shadow = undefined;\n this.caseInsensitive = false;\n this.spacing = 0;\n this.lineHeight = undefined;\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n const { alphabet, spriteSheet, caseInsensitive, spacing, shadow, lineHeight } = options;\n this.alphabet = alphabet;\n this.spriteSheet = spriteSheet;\n this.caseInsensitive = caseInsensitive !== null && caseInsensitive !== void 0 ? caseInsensitive : this.caseInsensitive;\n this.spacing = spacing !== null && spacing !== void 0 ? spacing : this.spacing;\n this.shadow = shadow !== null && shadow !== void 0 ? shadow : this.shadow;\n this.lineHeight = lineHeight !== null && lineHeight !== void 0 ? lineHeight : this.lineHeight;\n }\n _getCharacterSprites(text) {\n const results = [];\n // handle case insensitive\n const textToRender = this.caseInsensitive ? text.toLocaleLowerCase() : text;\n const alphabet = this.caseInsensitive ? this.alphabet.toLocaleLowerCase() : this.alphabet;\n // for each letter in text\n for (let letterIndex = 0; letterIndex < textToRender.length; letterIndex++) {\n // find the sprite index in alphabet , if there is an error pick the first\n const letter = textToRender[letterIndex];\n let spriteIndex = alphabet.indexOf(letter);\n if (spriteIndex === -1) {\n spriteIndex = 0;\n this._logger.warnOnce(`SpriteFont - Cannot find letter '${letter}' in configured alphabet '${alphabet}'.`);\n this._logger.warnOnce('There maybe be more issues in the SpriteFont configuration. No additional warnings will be logged.');\n }\n const letterSprite = this.spriteSheet.sprites[spriteIndex];\n if (letterSprite) {\n results.push(letterSprite);\n }\n else {\n this._logger.warnOnce(`SpriteFont - Cannot find sprite for '${letter}' at index '${spriteIndex}' in configured SpriteSheet`);\n this._logger.warnOnce('There maybe be more issues in the SpriteFont configuration. No additional warnings will be logged.');\n }\n }\n return results;\n }\n measureText(text, maxWidth) {\n const lines = this._getLinesFromText(text, maxWidth);\n const maxWidthLine = lines.reduce((a, b) => {\n return a.length > b.length ? a : b;\n });\n const sprites = this._getCharacterSprites(maxWidthLine);\n let width = 0;\n let height = 0;\n for (const sprite of sprites) {\n width += sprite.width + this.spacing;\n height = Math.max(height, sprite.height);\n }\n return _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromDimension(width * this.scale.x, height * lines.length * this.scale.y, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero);\n }\n _drawImage(ex, x, y, maxWidth) {\n var _a;\n let xCursor = 0;\n let yCursor = 0;\n let height = 0;\n const lines = this._getLinesFromText(this._text, maxWidth);\n for (const line of lines) {\n for (const sprite of this._getCharacterSprites(line)) {\n // draw it in the right spot and increase the cursor by sprite width\n sprite.draw(ex, x + xCursor, y + yCursor);\n xCursor += sprite.width + this.spacing;\n height = Math.max(height, sprite.height);\n }\n xCursor = 0;\n yCursor += (_a = this.lineHeight) !== null && _a !== void 0 ? _a : height;\n }\n }\n render(ex, text, _color, x, y, maxWidth) {\n // SpriteFont doesn't support _color, yet...\n this._text = text;\n const bounds = this.measureText(text, maxWidth);\n this.width = bounds.width;\n this.height = bounds.height;\n if (this.shadow) {\n ex.save();\n ex.translate(this.shadow.offset.x, this.shadow.offset.y);\n this._preDraw(ex, x, y);\n this._drawImage(ex, 0, 0, maxWidth);\n this._postDraw(ex);\n ex.restore();\n }\n this._preDraw(ex, x, y);\n this._drawImage(ex, 0, 0, maxWidth);\n this._postDraw(ex);\n }\n clone() {\n return new SpriteFont({\n alphabet: this.alphabet,\n spriteSheet: this.spriteSheet,\n spacing: this.spacing\n });\n }\n _getLinesFromText(text, maxWidth) {\n var _a;\n if (this._cachedText === text && this._cachedRenderWidth === maxWidth && ((_a = this._cachedLines) === null || _a === void 0 ? void 0 : _a.length)) {\n return this._cachedLines;\n }\n const lines = text.split('\\n');\n if (maxWidth == null) {\n return lines;\n }\n // If the current line goes past the maxWidth, append a new line without modifying the underlying text.\n for (let i = 0; i < lines.length; i++) {\n let line = lines[i];\n let newLine = '';\n // Note: we subtract the spacing to counter the initial padding on the left side.\n if (this.measureText(line).width > maxWidth) {\n while (this.measureText(line).width > maxWidth) {\n newLine = line[line.length - 1] + newLine;\n line = line.slice(0, -1); // Remove last character from line\n }\n // Update the array with our new values\n lines[i] = line;\n lines[i + 1] = newLine;\n }\n }\n this._cachedText = text;\n this._cachedLines = lines;\n this._cachedRenderWidth = maxWidth;\n return lines;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/SpriteSheet.ts\":\n/*!*********************************!*\\\n !*** ./Graphics/SpriteSheet.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SpriteSheet: () => (/* binding */ SpriteSheet)\n/* harmony export */ });\n/* harmony import */ var _Sprite__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Sprite */ \"./Graphics/Sprite.ts\");\n/* harmony import */ var _TiledSprite__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./TiledSprite */ \"./Graphics/TiledSprite.ts\");\n\n\n/**\n * Represents a collection of sprites from a source image with some organization in a grid\n */\nclass SpriteSheet {\n /**\n * Build a new sprite sheet from a list of sprites\n *\n * Use {@apilink SpriteSheet.fromImageSource} to create a SpriteSheet from an {@apilink ImageSource} organized in a grid\n * @param options\n */\n constructor(options) {\n this.sprites = [];\n const { sprites, rows, columns } = options;\n this.sprites = sprites;\n this.rows = rows !== null && rows !== void 0 ? rows : 1;\n this.columns = columns !== null && columns !== void 0 ? columns : this.sprites.length;\n }\n /**\n * Find a sprite by their x/y integer coordinates in the SpriteSheet, for example `getSprite(0, 0)` is the {@apilink Sprite} in the top-left\n * and `getSprite(1, 0)` is the sprite one to the right.\n * @param x\n * @param y\n */\n getSprite(x, y, options) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j;\n if (x >= this.columns || x < 0) {\n throw Error(`No sprite exists in the SpriteSheet at (${x}, ${y}), x: ${x} should be between 0 and ${this.columns - 1} columns`);\n }\n if (y >= this.rows || y < 0) {\n throw Error(`No sprite exists in the SpriteSheet at (${x}, ${y}), y: ${y} should be between 0 and ${this.rows - 1} rows`);\n }\n const spriteIndex = x + y * this.columns;\n const sprite = this.sprites[spriteIndex];\n if (sprite) {\n if (options) {\n const spriteWithOptions = sprite.clone();\n spriteWithOptions.flipHorizontal = (_a = options.flipHorizontal) !== null && _a !== void 0 ? _a : spriteWithOptions.flipHorizontal;\n spriteWithOptions.flipVertical = (_b = options.flipVertical) !== null && _b !== void 0 ? _b : spriteWithOptions.flipVertical;\n spriteWithOptions.width = (_c = options.width) !== null && _c !== void 0 ? _c : spriteWithOptions.width;\n spriteWithOptions.height = (_d = options.height) !== null && _d !== void 0 ? _d : spriteWithOptions.height;\n spriteWithOptions.rotation = (_e = options.rotation) !== null && _e !== void 0 ? _e : spriteWithOptions.rotation;\n spriteWithOptions.scale = (_f = options.scale) !== null && _f !== void 0 ? _f : spriteWithOptions.scale;\n spriteWithOptions.opacity = (_g = options.opacity) !== null && _g !== void 0 ? _g : spriteWithOptions.opacity;\n spriteWithOptions.tint = (_h = options.tint) !== null && _h !== void 0 ? _h : spriteWithOptions.tint;\n spriteWithOptions.origin = (_j = options.origin) !== null && _j !== void 0 ? _j : spriteWithOptions.origin;\n return spriteWithOptions;\n }\n return sprite;\n }\n throw Error(`Invalid sprite coordinates (${x}, ${y})`);\n }\n /**\n * Find a sprite by their x/y integer coordinates in the SpriteSheet and configures tiling to repeat by default,\n * for example `getTiledSprite(0, 0)` is the {@apilink TiledSprite} in the top-left\n * and `getTiledSprite(1, 0)` is the sprite one to the right.\n *\n * Example:\n *\n * ```typescript\n * spriteSheet.getTiledSprite(1, 0, {\n * width: game.screen.width,\n * height: 200,\n * wrapping: {\n * x: ex.ImageWrapping.Repeat,\n * y: ex.ImageWrapping.Clamp\n * }\n * });\n * ```\n * @param x\n * @param y\n * @param options\n */\n getTiledSprite(x, y, options) {\n if (x >= this.columns || x < 0) {\n throw Error(`No sprite exists in the SpriteSheet at (${x}, ${y}), x: ${x} should be between 0 and ${this.columns - 1} columns`);\n }\n if (y >= this.rows || y < 0) {\n throw Error(`No sprite exists in the SpriteSheet at (${x}, ${y}), y: ${y} should be between 0 and ${this.rows - 1} rows`);\n }\n const spriteIndex = x + y * this.columns;\n const sprite = this.sprites[spriteIndex];\n if (sprite) {\n return _TiledSprite__WEBPACK_IMPORTED_MODULE_0__.TiledSprite.fromSprite(sprite, options);\n }\n throw Error(`Invalid sprite coordinates (${x}, ${y})`);\n }\n /**\n * Create a sprite sheet from a sparse set of {@apilink SourceView} rectangles\n * @param options\n */\n static fromImageSourceWithSourceViews(options) {\n const sprites = options.sourceViews.map((sourceView) => {\n return new _Sprite__WEBPACK_IMPORTED_MODULE_1__.Sprite({\n image: options.image,\n sourceView\n });\n });\n return new SpriteSheet({ sprites });\n }\n /**\n * Create a SpriteSheet from an {@apilink ImageSource} organized in a grid\n *\n * Example:\n * ```\n * const spriteSheet = SpriteSheet.fromImageSource({\n * image: imageSource,\n * grid: {\n * rows: 5,\n * columns: 2,\n * spriteWidth: 32, // pixels\n * spriteHeight: 32 // pixels\n * },\n * // Optionally specify spacing\n * spacing: {\n * // pixels from the top left to start the sprite parsing\n * originOffset: {\n * x: 5,\n * y: 5\n * },\n * // pixels between each sprite while parsing\n * margin: {\n * x: 1,\n * y: 1\n * }\n * }\n * })\n * ```\n * @param options\n */\n static fromImageSource(options) {\n var _a;\n const sprites = [];\n options.spacing = (_a = options.spacing) !== null && _a !== void 0 ? _a : {};\n const { image, grid: { rows, columns: cols, spriteWidth, spriteHeight }, spacing: { originOffset, margin } } = options;\n const offsetDefaults = { x: 0, y: 0, ...originOffset };\n const marginDefaults = { x: 0, y: 0, ...margin };\n for (let x = 0; x < cols; x++) {\n for (let y = 0; y < rows; y++) {\n sprites[x + y * cols] = new _Sprite__WEBPACK_IMPORTED_MODULE_1__.Sprite({\n image: image,\n sourceView: {\n x: x * spriteWidth + marginDefaults.x * x + offsetDefaults.x,\n y: y * spriteHeight + marginDefaults.y * y + offsetDefaults.y,\n width: spriteWidth,\n height: spriteHeight\n },\n destSize: { height: spriteHeight, width: spriteWidth }\n });\n }\n }\n return new SpriteSheet({\n sprites: sprites,\n rows: rows,\n columns: cols\n });\n }\n clone() {\n return new SpriteSheet({\n sprites: this.sprites.map((sprite) => sprite.clone()),\n rows: this.rows,\n columns: this.columns\n });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Text.ts\":\n/*!**************************!*\\\n !*** ./Graphics/Text.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Text: () => (/* binding */ Text)\n/* harmony export */ });\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Font__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Font */ \"./Graphics/Font.ts\");\n\n\n\n/**\n * Represent Text graphics in excalibur\n *\n * Useful for in game labels, ui, or overlays\n */\nclass Text extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n constructor(options) {\n var _a, _b;\n super(options);\n this._text = '';\n this._textWidth = 0;\n this._textHeight = 0;\n // This order is important font, color, then text\n this.font = (_a = options.font) !== null && _a !== void 0 ? _a : new _Font__WEBPACK_IMPORTED_MODULE_1__.Font();\n this.color = (_b = options.color) !== null && _b !== void 0 ? _b : this.color;\n this.text = options.text;\n this.maxWidth = options.maxWidth;\n }\n clone() {\n var _a, _b;\n return new Text({\n text: this.text.slice(),\n color: (_b = (_a = this.color) === null || _a === void 0 ? void 0 : _a.clone()) !== null && _b !== void 0 ? _b : _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Black,\n font: this.font.clone(),\n maxWidth: this.maxWidth\n });\n }\n get text() {\n return this._text;\n }\n set text(value) {\n this._text = value;\n this._calculateDimension();\n }\n get font() {\n return this._font;\n }\n set font(font) {\n this._font = font;\n }\n get width() {\n if (this._textWidth === 0) {\n this._calculateDimension();\n }\n return this._textWidth * this.scale.x;\n }\n get height() {\n if (this._textHeight === 0) {\n this._calculateDimension();\n }\n return this._textHeight * this.scale.y;\n }\n _calculateDimension() {\n const { width, height } = this.font.measureText(this._text, this.maxWidth);\n this._textWidth = width;\n this._textHeight = height;\n }\n get localBounds() {\n return this.font.measureText(this._text, this.maxWidth).scale(this.scale);\n }\n _rotate(_ex) {\n // None this is delegated to font\n // This override erases the default behavior\n }\n _flip(_ex) {\n // None this is delegated to font\n // This override erases the default behavior\n }\n _preDraw(ex, x, y) {\n if (this.isStale() || this.font.isStale()) {\n this.font.flipHorizontal = this.flipHorizontal;\n this.font.flipVertical = this.flipVertical;\n this.font.rotation = this.rotation;\n this.font.origin = this.origin;\n this.font.opacity = this.opacity;\n }\n this.font.tint = this.tint;\n super._preDraw(ex, x, y);\n }\n _drawImage(ex, x, y) {\n var _a;\n let color = _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Black;\n if (this.font instanceof _Font__WEBPACK_IMPORTED_MODULE_1__.Font) {\n color = (_a = this.color) !== null && _a !== void 0 ? _a : this.font.color;\n }\n const { width, height } = this.font.measureText(this._text, this.maxWidth);\n this._textWidth = width;\n this._textHeight = height;\n this.font.render(ex, this._text, color, x, y, this.maxWidth);\n if (this.font.showDebug) {\n ex.debug.drawRect(x - width, y - height, width * 2, height * 2);\n if (this.maxWidth != null) {\n ex.debug.drawRect(x, y, this.maxWidth, this.height, {\n color: _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Yellow\n });\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/TiledAnimation.ts\":\n/*!************************************!*\\\n !*** ./Graphics/TiledAnimation.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TiledAnimation: () => (/* binding */ TiledAnimation)\n/* harmony export */ });\n/* harmony import */ var _Sprite__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Sprite */ \"./Graphics/Sprite.ts\");\n/* harmony import */ var _Animation__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Animation */ \"./Graphics/Animation.ts\");\n/* harmony import */ var _TiledSprite__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./TiledSprite */ \"./Graphics/TiledSprite.ts\");\n/* harmony import */ var _Util_Watch__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Util/Watch */ \"./Util/Watch.ts\");\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Future */ \"./Util/Future.ts\");\n\n\n\n\n\nclass TiledAnimation extends _Animation__WEBPACK_IMPORTED_MODULE_0__.Animation {\n constructor(options) {\n super({\n ...options,\n frames: options.animation.frames.slice(),\n strategy: options.animation.strategy,\n frameDuration: options.animation.frameDuration,\n speed: options.animation.speed,\n reverse: options.animation.isReversed\n });\n this._ready = new _Util_Future__WEBPACK_IMPORTED_MODULE_1__.Future();\n this.ready = this._ready.promise;\n this._tiledWidth = 0;\n this._tiledHeight = 0;\n this._sourceView = {};\n this._sourceView = { ...options.sourceView };\n this._tiledWidth = options.width;\n this._tiledHeight = options.height;\n const promises = [];\n for (let i = 0; i < this.frames.length; i++) {\n const graphic = this.frames[i].graphic;\n if (graphic && graphic instanceof _Sprite__WEBPACK_IMPORTED_MODULE_2__.Sprite) {\n const tiledSprite = new _TiledSprite__WEBPACK_IMPORTED_MODULE_3__.TiledSprite({\n image: graphic.image,\n width: options.width,\n height: options.height,\n sourceView: { ...graphic.sourceView },\n wrapping: options.wrapping,\n filtering: options.filtering\n });\n this.frames[i].graphic = tiledSprite;\n // There is a new calc'd sourceView when ready\n tiledSprite.ready.then(() => {\n tiledSprite.sourceView = { ...tiledSprite.sourceView, ...this._sourceView };\n });\n promises.push(tiledSprite.ready);\n }\n }\n Promise.all(promises).then(() => this._ready.resolve());\n }\n static fromAnimation(animation, options) {\n return new TiledAnimation({\n width: animation.width,\n height: animation.height,\n ...options,\n animation\n });\n }\n _updateSourceView() {\n for (let i = 0; i < this.frames.length; i++) {\n const graphic = this.frames[i].graphic;\n if (graphic && graphic instanceof _Sprite__WEBPACK_IMPORTED_MODULE_2__.Sprite) {\n graphic.sourceView = { ...graphic.sourceView, ...this._sourceView };\n }\n }\n }\n get sourceView() {\n return (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_4__.watch)(this._sourceView, () => this._updateSourceView());\n }\n set sourceView(sourceView) {\n this._sourceView = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_4__.watch)(sourceView, () => this._updateSourceView());\n this._updateSourceView();\n }\n _updateWidthHeight() {\n for (let i = 0; i < this.frames.length; i++) {\n const graphic = this.frames[i].graphic;\n if (graphic && graphic instanceof _Sprite__WEBPACK_IMPORTED_MODULE_2__.Sprite) {\n graphic.sourceView.height = this._tiledHeight || graphic.height;\n graphic.destSize.height = this._tiledHeight || graphic.height;\n graphic.sourceView.width = this._tiledWidth || graphic.width;\n graphic.destSize.width = this._tiledWidth || graphic.width;\n }\n }\n }\n get width() {\n return this._tiledWidth;\n }\n get height() {\n return this._tiledHeight;\n }\n set width(width) {\n this._tiledWidth = width;\n this._updateWidthHeight();\n }\n set height(height) {\n this._tiledHeight = height;\n this._updateWidthHeight();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/TiledSprite.ts\":\n/*!*********************************!*\\\n !*** ./Graphics/TiledSprite.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TiledSprite: () => (/* binding */ TiledSprite)\n/* harmony export */ });\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Future */ \"./Util/Future.ts\");\n/* harmony import */ var _ImageSource__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ImageSource */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Sprite__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Sprite */ \"./Graphics/Sprite.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Wrapping */ \"./Graphics/Wrapping.ts\");\n\n\n\n\nclass TiledSprite extends _Sprite__WEBPACK_IMPORTED_MODULE_0__.Sprite {\n constructor(options) {\n super({\n image: options.image,\n sourceView: options.sourceView,\n destSize: { width: options.width, height: options.height },\n flipHorizontal: options.flipHorizontal,\n flipVertical: options.flipVertical,\n rotation: options.rotation,\n scale: options.scale,\n opacity: options.opacity,\n tint: options.tint,\n origin: options.origin\n });\n this._ready = new _Util_Future__WEBPACK_IMPORTED_MODULE_1__.Future();\n this.ready = this._ready.promise;\n this._options = options;\n if (this.image.isLoaded()) {\n this._applyTiling();\n }\n else {\n this.image.ready.then(() => this._applyTiling());\n }\n }\n static fromSprite(sprite, options) {\n return new TiledSprite({\n sourceView: { ...sprite.sourceView },\n width: sprite.width,\n height: sprite.height,\n ...options,\n image: sprite.image\n });\n }\n _applyTiling() {\n const { width, height, filtering, wrapping } = { ...this._options };\n const spriteCanvas = document.createElement('canvas');\n spriteCanvas.width = this.sourceView.width;\n spriteCanvas.height = this.sourceView.height;\n const spriteCtx = spriteCanvas.getContext('2d');\n // prettier-ignore\n spriteCtx.drawImage(this.image.image, this.sourceView.x, this.sourceView.y, this.sourceView.width, this.sourceView.height, 0, 0, this.sourceView.width, this.sourceView.height);\n // prettier-ignore\n const tiledImageSource = _ImageSource__WEBPACK_IMPORTED_MODULE_2__.ImageSource.fromHtmlCanvasElement(spriteCanvas, {\n wrapping: wrapping !== null && wrapping !== void 0 ? wrapping : _Wrapping__WEBPACK_IMPORTED_MODULE_3__.ImageWrapping.Repeat,\n filtering\n });\n if (width) {\n this.destSize.width = width;\n this.sourceView.width = width;\n }\n if (height) {\n this.destSize.height = height;\n this.sourceView.height = height;\n }\n this.sourceView.x = 0;\n this.sourceView.y = 0;\n this.image = tiledImageSource;\n // this._ready.resolve();\n this.image.ready.then(() => this._ready.resolve());\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/TransformInterpolation.ts\":\n/*!********************************************!*\\\n !*** ./Graphics/TransformInterpolation.ts ***!\n \\********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ blendGlobalTransform: () => (/* binding */ blendGlobalTransform),\n/* harmony export */ blendTransform: () => (/* binding */ blendTransform)\n/* harmony export */ });\n/* harmony import */ var _Math_transform__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Math/transform */ \"./Math/transform.ts\");\n\n/**\n * Blend 2 transforms for interpolation, will interpolate from the context of newTx's parent if it exists\n */\nfunction blendTransform(oldTx, newTx, blend, target) {\n if (oldTx.parent !== newTx.parent) {\n // Caller expects a local transform\n // Adjust old tx to be local to the new parent whatever that is\n const oldTxWithNewParent = oldTx.clone();\n const oldGlobalPos = oldTx.globalPos.clone();\n const oldGlobalScale = oldTx.globalScale.clone();\n const oldGlobalRotation = oldTx.globalRotation;\n oldTxWithNewParent.parent = newTx.parent;\n oldTxWithNewParent.globalPos = oldGlobalPos;\n oldTxWithNewParent.globalScale = oldGlobalScale;\n oldTxWithNewParent.globalRotation = oldGlobalRotation;\n oldTx = oldTxWithNewParent;\n }\n let interpolatedPos = newTx.pos;\n let interpolatedScale = newTx.scale;\n let interpolatedRotation = newTx.rotation;\n interpolatedPos = newTx.pos.scale(blend).add(oldTx.pos.scale(1.0 - blend));\n interpolatedScale = newTx.scale.scale(blend).add(oldTx.scale.scale(1.0 - blend));\n // Rotational lerp https://stackoverflow.com/a/30129248\n const cosine = (1.0 - blend) * Math.cos(oldTx.rotation) + blend * Math.cos(newTx.rotation);\n const sine = (1.0 - blend) * Math.sin(oldTx.rotation) + blend * Math.sin(newTx.rotation);\n interpolatedRotation = Math.atan2(sine, cosine);\n const tx = target !== null && target !== void 0 ? target : new _Math_transform__WEBPACK_IMPORTED_MODULE_0__.Transform();\n tx.setTransform(interpolatedPos, interpolatedRotation, interpolatedScale);\n return tx;\n}\n/**\n *\n */\nfunction blendGlobalTransform(oldTx, newTx, blend, target) {\n let interpolatedPos = newTx.globalPos;\n let interpolatedScale = newTx.globalScale;\n let interpolatedRotation = newTx.globalRotation;\n interpolatedPos = newTx.globalPos.scale(blend).add(oldTx.globalPos.scale(1.0 - blend));\n interpolatedScale = newTx.globalScale.scale(blend).add(oldTx.globalScale.scale(1.0 - blend));\n // Rotational lerp https://stackoverflow.com/a/30129248\n const cosine = (1.0 - blend) * Math.cos(oldTx.globalRotation) + blend * Math.cos(newTx.globalRotation);\n const sine = (1.0 - blend) * Math.sin(oldTx.globalRotation) + blend * Math.sin(newTx.globalRotation);\n interpolatedRotation = Math.atan2(sine, cosine);\n const tx = target !== null && target !== void 0 ? target : new _Math_transform__WEBPACK_IMPORTED_MODULE_0__.Transform();\n tx.setTransform(interpolatedPos, interpolatedRotation, interpolatedScale);\n return tx;\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Wrapping.ts\":\n/*!******************************!*\\\n !*** ./Graphics/Wrapping.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ImageWrapping: () => (/* binding */ ImageWrapping),\n/* harmony export */ parseImageWrapping: () => (/* binding */ parseImageWrapping)\n/* harmony export */ });\n/**\n * Describes the different image wrapping modes\n */\nvar ImageWrapping;\n(function (ImageWrapping) {\n ImageWrapping[\"Clamp\"] = \"Clamp\";\n ImageWrapping[\"Repeat\"] = \"Repeat\";\n ImageWrapping[\"Mirror\"] = \"Mirror\";\n})(ImageWrapping || (ImageWrapping = {}));\n/**\n *\n */\nfunction parseImageWrapping(val) {\n switch (val) {\n case ImageWrapping.Clamp:\n return ImageWrapping.Clamp;\n case ImageWrapping.Repeat:\n return ImageWrapping.Repeat;\n case ImageWrapping.Mirror:\n return ImageWrapping.Mirror;\n default:\n return ImageWrapping.Clamp;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/index.ts\":\n/*!***************************!*\\\n !*** ./Graphics/index.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Animation: () => (/* reexport safe */ _Animation__WEBPACK_IMPORTED_MODULE_5__.Animation),\n/* harmony export */ AnimationDirection: () => (/* reexport safe */ _Animation__WEBPACK_IMPORTED_MODULE_5__.AnimationDirection),\n/* harmony export */ AnimationEvents: () => (/* reexport safe */ _Animation__WEBPACK_IMPORTED_MODULE_5__.AnimationEvents),\n/* harmony export */ AnimationStrategy: () => (/* reexport safe */ _Animation__WEBPACK_IMPORTED_MODULE_5__.AnimationStrategy),\n/* harmony export */ BaseAlign: () => (/* reexport safe */ _FontCommon__WEBPACK_IMPORTED_MODULE_17__.BaseAlign),\n/* harmony export */ Canvas: () => (/* reexport safe */ _Canvas__WEBPACK_IMPORTED_MODULE_21__.Canvas),\n/* harmony export */ Circle: () => (/* reexport safe */ _Circle__WEBPACK_IMPORTED_MODULE_13__.Circle),\n/* harmony export */ ColorBlindnessMode: () => (/* reexport safe */ _PostProcessor_ColorBlindnessMode__WEBPACK_IMPORTED_MODULE_31__.ColorBlindnessMode),\n/* harmony export */ ColorBlindnessPostProcessor: () => (/* reexport safe */ _PostProcessor_ColorBlindnessPostProcessor__WEBPACK_IMPORTED_MODULE_32__.ColorBlindnessPostProcessor),\n/* harmony export */ Debug: () => (/* reexport safe */ _Debug__WEBPACK_IMPORTED_MODULE_41__.Debug),\n/* harmony export */ DebugGraphicsComponent: () => (/* reexport safe */ _DebugGraphicsComponent__WEBPACK_IMPORTED_MODULE_8__.DebugGraphicsComponent),\n/* harmony export */ DebugText: () => (/* reexport safe */ _Context_debug_text__WEBPACK_IMPORTED_MODULE_29__.DebugText),\n/* harmony export */ DefaultAntialiasOptions: () => (/* reexport safe */ _Context_ExcaliburGraphicsContext__WEBPACK_IMPORTED_MODULE_25__.DefaultAntialiasOptions),\n/* harmony export */ DefaultPixelArtOptions: () => (/* reexport safe */ _Context_ExcaliburGraphicsContext__WEBPACK_IMPORTED_MODULE_25__.DefaultPixelArtOptions),\n/* harmony export */ Direction: () => (/* reexport safe */ _FontCommon__WEBPACK_IMPORTED_MODULE_17__.Direction),\n/* harmony export */ ExcaliburGraphicsContext2DCanvas: () => (/* reexport safe */ _Context_ExcaliburGraphicsContext2DCanvas__WEBPACK_IMPORTED_MODULE_26__.ExcaliburGraphicsContext2DCanvas),\n/* harmony export */ ExcaliburGraphicsContextWebGL: () => (/* reexport safe */ _Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_27__.ExcaliburGraphicsContextWebGL),\n/* harmony export */ Font: () => (/* reexport safe */ _Font__WEBPACK_IMPORTED_MODULE_18__.Font),\n/* harmony export */ FontCache: () => (/* reexport safe */ _FontCache__WEBPACK_IMPORTED_MODULE_19__.FontCache),\n/* harmony export */ FontStyle: () => (/* reexport safe */ _FontCommon__WEBPACK_IMPORTED_MODULE_17__.FontStyle),\n/* harmony export */ FontUnit: () => (/* reexport safe */ _FontCommon__WEBPACK_IMPORTED_MODULE_17__.FontUnit),\n/* harmony export */ Graphic: () => (/* reexport safe */ _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic),\n/* harmony export */ GraphicsComponent: () => (/* reexport safe */ _GraphicsComponent__WEBPACK_IMPORTED_MODULE_7__.GraphicsComponent),\n/* harmony export */ GraphicsGroup: () => (/* reexport safe */ _GraphicsGroup__WEBPACK_IMPORTED_MODULE_3__.GraphicsGroup),\n/* harmony export */ GraphicsSystem: () => (/* reexport safe */ _GraphicsSystem__WEBPACK_IMPORTED_MODULE_9__.GraphicsSystem),\n/* harmony export */ ImageFiltering: () => (/* reexport safe */ _Filtering__WEBPACK_IMPORTED_MODULE_34__.ImageFiltering),\n/* harmony export */ ImageSource: () => (/* reexport safe */ _ImageSource__WEBPACK_IMPORTED_MODULE_4__.ImageSource),\n/* harmony export */ ImageSourceAttributeConstants: () => (/* reexport safe */ _ImageSource__WEBPACK_IMPORTED_MODULE_4__.ImageSourceAttributeConstants),\n/* harmony export */ ImageWrapping: () => (/* reexport safe */ _Wrapping__WEBPACK_IMPORTED_MODULE_35__.ImageWrapping),\n/* harmony export */ Line: () => (/* reexport safe */ _Line__WEBPACK_IMPORTED_MODULE_6__.Line),\n/* harmony export */ Material: () => (/* reexport safe */ _Context_material__WEBPACK_IMPORTED_MODULE_40__.Material),\n/* harmony export */ NineSlice: () => (/* reexport safe */ _NineSlice__WEBPACK_IMPORTED_MODULE_22__.NineSlice),\n/* harmony export */ NineSliceStretch: () => (/* reexport safe */ _NineSlice__WEBPACK_IMPORTED_MODULE_22__.NineSliceStretch),\n/* harmony export */ OffscreenSystem: () => (/* reexport safe */ _OffscreenSystem__WEBPACK_IMPORTED_MODULE_10__.OffscreenSystem),\n/* harmony export */ ParallaxComponent: () => (/* reexport safe */ _ParallaxComponent__WEBPACK_IMPORTED_MODULE_11__.ParallaxComponent),\n/* harmony export */ ParticleRenderer: () => (/* reexport safe */ _Context_particle_renderer_particle_renderer__WEBPACK_IMPORTED_MODULE_28__.ParticleRenderer),\n/* harmony export */ Polygon: () => (/* reexport safe */ _Polygon__WEBPACK_IMPORTED_MODULE_15__.Polygon),\n/* harmony export */ QuadIndexBuffer: () => (/* reexport safe */ _Context_quad_index_buffer__WEBPACK_IMPORTED_MODULE_39__.QuadIndexBuffer),\n/* harmony export */ Raster: () => (/* reexport safe */ _Raster__WEBPACK_IMPORTED_MODULE_12__.Raster),\n/* harmony export */ Rectangle: () => (/* reexport safe */ _Rectangle__WEBPACK_IMPORTED_MODULE_14__.Rectangle),\n/* harmony export */ ScreenShader: () => (/* reexport safe */ _PostProcessor_ScreenShader__WEBPACK_IMPORTED_MODULE_30__.ScreenShader),\n/* harmony export */ Shader: () => (/* reexport safe */ _Context_shader__WEBPACK_IMPORTED_MODULE_36__.Shader),\n/* harmony export */ Sprite: () => (/* reexport safe */ _Sprite__WEBPACK_IMPORTED_MODULE_1__.Sprite),\n/* harmony export */ SpriteFont: () => (/* reexport safe */ _SpriteFont__WEBPACK_IMPORTED_MODULE_20__.SpriteFont),\n/* harmony export */ SpriteSheet: () => (/* reexport safe */ _SpriteSheet__WEBPACK_IMPORTED_MODULE_2__.SpriteSheet),\n/* harmony export */ Text: () => (/* reexport safe */ _Text__WEBPACK_IMPORTED_MODULE_16__.Text),\n/* harmony export */ TextAlign: () => (/* reexport safe */ _FontCommon__WEBPACK_IMPORTED_MODULE_17__.TextAlign),\n/* harmony export */ TextureLoader: () => (/* reexport safe */ _Context_texture_loader__WEBPACK_IMPORTED_MODULE_33__.TextureLoader),\n/* harmony export */ TiledAnimation: () => (/* reexport safe */ _TiledAnimation__WEBPACK_IMPORTED_MODULE_24__.TiledAnimation),\n/* harmony export */ TiledSprite: () => (/* reexport safe */ _TiledSprite__WEBPACK_IMPORTED_MODULE_23__.TiledSprite),\n/* harmony export */ VertexBuffer: () => (/* reexport safe */ _Context_vertex_buffer__WEBPACK_IMPORTED_MODULE_37__.VertexBuffer),\n/* harmony export */ VertexLayout: () => (/* reexport safe */ _Context_vertex_layout__WEBPACK_IMPORTED_MODULE_38__.VertexLayout),\n/* harmony export */ hasGraphicsTick: () => (/* reexport safe */ _GraphicsComponent__WEBPACK_IMPORTED_MODULE_7__.hasGraphicsTick),\n/* harmony export */ parseImageFiltering: () => (/* reexport safe */ _Filtering__WEBPACK_IMPORTED_MODULE_34__.parseImageFiltering),\n/* harmony export */ parseImageWrapping: () => (/* reexport safe */ _Wrapping__WEBPACK_IMPORTED_MODULE_35__.parseImageWrapping),\n/* harmony export */ pixelSnapEpsilon: () => (/* reexport safe */ _Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_27__.pixelSnapEpsilon),\n/* harmony export */ webgl: () => (/* reexport module object */ _Context_webgl_util__WEBPACK_IMPORTED_MODULE_42__)\n/* harmony export */ });\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Sprite__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Sprite */ \"./Graphics/Sprite.ts\");\n/* harmony import */ var _SpriteSheet__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./SpriteSheet */ \"./Graphics/SpriteSheet.ts\");\n/* harmony import */ var _GraphicsGroup__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./GraphicsGroup */ \"./Graphics/GraphicsGroup.ts\");\n/* harmony import */ var _ImageSource__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./ImageSource */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Animation__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Animation */ \"./Graphics/Animation.ts\");\n/* harmony import */ var _Line__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Line */ \"./Graphics/Line.ts\");\n/* harmony import */ var _GraphicsComponent__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _DebugGraphicsComponent__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./DebugGraphicsComponent */ \"./Graphics/DebugGraphicsComponent.ts\");\n/* harmony import */ var _GraphicsSystem__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./GraphicsSystem */ \"./Graphics/GraphicsSystem.ts\");\n/* harmony import */ var _OffscreenSystem__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./OffscreenSystem */ \"./Graphics/OffscreenSystem.ts\");\n/* harmony import */ var _ParallaxComponent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./ParallaxComponent */ \"./Graphics/ParallaxComponent.ts\");\n/* harmony import */ var _Raster__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Raster */ \"./Graphics/Raster.ts\");\n/* harmony import */ var _Circle__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Circle */ \"./Graphics/Circle.ts\");\n/* harmony import */ var _Rectangle__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Rectangle */ \"./Graphics/Rectangle.ts\");\n/* harmony import */ var _Polygon__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Polygon */ \"./Graphics/Polygon.ts\");\n/* harmony import */ var _Text__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Text */ \"./Graphics/Text.ts\");\n/* harmony import */ var _FontCommon__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./FontCommon */ \"./Graphics/FontCommon.ts\");\n/* harmony import */ var _Font__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Font */ \"./Graphics/Font.ts\");\n/* harmony import */ var _FontCache__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./FontCache */ \"./Graphics/FontCache.ts\");\n/* harmony import */ var _SpriteFont__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./SpriteFont */ \"./Graphics/SpriteFont.ts\");\n/* harmony import */ var _Canvas__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./Canvas */ \"./Graphics/Canvas.ts\");\n/* harmony import */ var _NineSlice__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./NineSlice */ \"./Graphics/NineSlice.ts\");\n/* harmony import */ var _TiledSprite__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./TiledSprite */ \"./Graphics/TiledSprite.ts\");\n/* harmony import */ var _TiledAnimation__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./TiledAnimation */ \"./Graphics/TiledAnimation.ts\");\n/* harmony import */ var _Context_ExcaliburGraphicsContext__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./Context/ExcaliburGraphicsContext */ \"./Graphics/Context/ExcaliburGraphicsContext.ts\");\n/* harmony import */ var _Context_ExcaliburGraphicsContext2DCanvas__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./Context/ExcaliburGraphicsContext2DCanvas */ \"./Graphics/Context/ExcaliburGraphicsContext2DCanvas.ts\");\n/* harmony import */ var _Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./Context/ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _Context_particle_renderer_particle_renderer__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./Context/particle-renderer/particle-renderer */ \"./Graphics/Context/particle-renderer/particle-renderer.ts\");\n/* harmony import */ var _Context_debug_text__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./Context/debug-text */ \"./Graphics/Context/debug-text.ts\");\n/* harmony import */ var _PostProcessor_ScreenShader__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./PostProcessor/ScreenShader */ \"./Graphics/PostProcessor/ScreenShader.ts\");\n/* harmony import */ var _PostProcessor_ColorBlindnessMode__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./PostProcessor/ColorBlindnessMode */ \"./Graphics/PostProcessor/ColorBlindnessMode.ts\");\n/* harmony import */ var _PostProcessor_ColorBlindnessPostProcessor__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./PostProcessor/ColorBlindnessPostProcessor */ \"./Graphics/PostProcessor/ColorBlindnessPostProcessor.ts\");\n/* harmony import */ var _Context_texture_loader__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./Context/texture-loader */ \"./Graphics/Context/texture-loader.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./Wrapping */ \"./Graphics/Wrapping.ts\");\n/* harmony import */ var _Context_shader__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./Context/shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _Context_vertex_buffer__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./Context/vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _Context_vertex_layout__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./Context/vertex-layout */ \"./Graphics/Context/vertex-layout.ts\");\n/* harmony import */ var _Context_quad_index_buffer__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./Context/quad-index-buffer */ \"./Graphics/Context/quad-index-buffer.ts\");\n/* harmony import */ var _Context_material__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./Context/material */ \"./Graphics/Context/material.ts\");\n/* harmony import */ var _Debug__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ./Debug */ \"./Graphics/Debug.ts\");\n/* harmony import */ var _Context_webgl_util__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ./Context/webgl-util */ \"./Graphics/Context/webgl-util.ts\");\n// Graphics\n\n\n\n\n\n\n\n// Graphics ECS\n\n\n\n\n\n// Raster graphics\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// TODO DELETEME\n\n\n// Post Processor\n\n\n\n\n\n\n\n// Rendering\n\n\n\n\n\n\n// Debug\n\n// Util\n\n\n\n\n/***/ }),\n\n/***/ \"./Id.ts\":\n/*!***************!*\\\n !*** ./Id.ts ***!\n \\***************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ createId: () => (/* binding */ createId)\n/* harmony export */ });\n/**\n * Create a branded ID type from a number\n */\nfunction createId(type, value) {\n return { type, value };\n}\n\n\n/***/ }),\n\n/***/ \"./Input/Gamepad.ts\":\n/*!**************************!*\\\n !*** ./Input/Gamepad.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Axes: () => (/* binding */ Axes),\n/* harmony export */ Buttons: () => (/* binding */ Buttons),\n/* harmony export */ Gamepad: () => (/* binding */ Gamepad),\n/* harmony export */ GamepadEvents: () => (/* binding */ GamepadEvents),\n/* harmony export */ Gamepads: () => (/* binding */ Gamepads)\n/* harmony export */ });\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n\n\nconst GamepadEvents = {\n GamepadConnect: 'connect',\n GamepadDisconnect: 'disconnect',\n GamepadButton: 'button',\n GamepadAxis: 'axis'\n};\n/**\n * Excalibur leverages the HTML5 Gamepad API [where it is supported](http://caniuse.com/#feat=gamepad)\n * to provide controller support for your games.\n */\nclass Gamepads {\n constructor() {\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n /**\n * Whether or not to poll for Gamepad input (default: `false`)\n */\n this.enabled = false;\n /**\n * Whether or not Gamepad API is supported\n */\n this.supported = !!navigator.getGamepads;\n this._gamePadTimeStamps = [0, 0, 0, 0];\n this._oldPads = [];\n this._pads = [];\n this._initSuccess = false;\n this._navigator = navigator;\n this._minimumConfiguration = null;\n this._enabled = true;\n }\n init() {\n if (!this.supported) {\n return;\n }\n if (this._initSuccess) {\n return;\n }\n // In Chrome, this will return 4 undefined items until a button is pressed\n // In FF, this will not return any items until a button is pressed\n this._oldPads = this._clonePads(this._navigator.getGamepads());\n if (this._oldPads.length && this._oldPads[0]) {\n this._initSuccess = true;\n }\n }\n toggleEnabled(enabled) {\n this._enabled = enabled;\n }\n /**\n * Sets the minimum gamepad configuration, for example {axis: 4, buttons: 4} means\n * this game requires at minimum 4 axis inputs and 4 buttons, this is not restrictive\n * all other controllers with more axis or buttons are valid as well. If no minimum\n * configuration is set all pads are valid.\n */\n setMinimumGamepadConfiguration(config) {\n this._enableAndUpdate(); // if config is used, implicitly enable\n this._minimumConfiguration = config;\n }\n /**\n * When implicitly enabled, set the enabled flag and run an update so information is updated\n */\n _enableAndUpdate() {\n if (!this.enabled) {\n this.enabled = true;\n this.update();\n }\n }\n /**\n * Checks a navigator gamepad against the minimum configuration if present.\n */\n _isGamepadValid(pad) {\n if (!this._minimumConfiguration) {\n return true;\n }\n if (!pad) {\n return false;\n }\n const axesLength = pad.axes.filter((value) => {\n return typeof value !== undefined;\n }).length;\n const buttonLength = pad.buttons.filter((value) => {\n return typeof value !== undefined;\n }).length;\n return axesLength >= this._minimumConfiguration.axis && buttonLength >= this._minimumConfiguration.buttons && pad.connected;\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n this._enableAndUpdate(); // implicitly enable\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this._enableAndUpdate(); // implicitly enable\n this.events.off(eventName, handler);\n }\n /**\n * Updates Gamepad state and publishes Gamepad events\n */\n update() {\n if (!this.enabled || !this.supported) {\n return;\n }\n if (!this._enabled) {\n return;\n }\n this.init();\n const gamepads = this._navigator.getGamepads();\n for (let i = 0; i < gamepads.length; i++) {\n if (!gamepads[i]) {\n const gamepad = this.at(i);\n // If was connected, but now isn't emit the disconnect event\n if (gamepad.connected) {\n this.events.emit('disconnect', new _Events__WEBPACK_IMPORTED_MODULE_1__.GamepadDisconnectEvent(i, gamepad));\n }\n // Reset connection status\n gamepad.connected = false;\n continue;\n }\n else {\n if (!this.at(i).connected && this._isGamepadValid(gamepads[i])) {\n this.events.emit('connect', new _Events__WEBPACK_IMPORTED_MODULE_1__.GamepadConnectEvent(i, this.at(i)));\n }\n // Set connection status\n this.at(i).connected = true;\n }\n this.at(i).update();\n // Only supported in Chrome\n if (gamepads[i].timestamp && gamepads[i].timestamp === this._gamePadTimeStamps[i]) {\n continue;\n }\n this._gamePadTimeStamps[i] = gamepads[i].timestamp;\n // Add reference to navigator gamepad\n this.at(i).navigatorGamepad = gamepads[i];\n // Buttons\n let b, bi, a, ai, value;\n for (b in Buttons) {\n bi = Buttons[b];\n if (typeof bi === 'number') {\n if (gamepads[i].buttons[bi]) {\n value = gamepads[i].buttons[bi].value;\n if (value !== this._oldPads[i].getButton(bi)) {\n if (gamepads[i].buttons[bi].pressed) {\n this.at(i).updateButton(bi, value);\n this.at(i).events.emit('button', new _Events__WEBPACK_IMPORTED_MODULE_1__.GamepadButtonEvent(bi, value, this.at(i)));\n }\n else {\n this.at(i).updateButton(bi, 0);\n }\n }\n }\n }\n }\n // Axes\n for (a in Axes) {\n ai = Axes[a];\n if (typeof ai === 'number') {\n value = gamepads[i].axes[ai];\n if (value !== this._oldPads[i].getAxes(ai)) {\n this.at(i).updateAxes(ai, value);\n this.at(i).events.emit('axis', new _Events__WEBPACK_IMPORTED_MODULE_1__.GamepadAxisEvent(ai, value, this.at(i)));\n }\n }\n }\n this._oldPads[i] = this._clonePad(gamepads[i]);\n }\n }\n /**\n * Safely retrieves a Gamepad at a specific index and creates one if it doesn't yet exist\n */\n at(index) {\n this._enableAndUpdate(); // implicitly enable gamepads when at() is called\n if (index >= this._pads.length) {\n // Ensure there is a pad to retrieve\n for (let i = this._pads.length - 1, max = index; i < max; i++) {\n this._pads.push(new Gamepad());\n this._oldPads.push(new Gamepad());\n }\n }\n return this._pads[index];\n }\n /**\n * Returns a list of all valid gamepads that meet the minimum configuration requirement.\n */\n getValidGamepads() {\n this._enableAndUpdate();\n const result = [];\n for (let i = 0; i < this._pads.length; i++) {\n if (this._isGamepadValid(this.at(i).navigatorGamepad) && this.at(i).connected) {\n result.push(this.at(i));\n }\n }\n return result;\n }\n /**\n * Gets the number of connected gamepads\n */\n count() {\n return this._pads.filter((p) => p.connected).length;\n }\n _clonePads(pads) {\n const arr = [];\n for (let i = 0, len = pads.length; i < len; i++) {\n arr.push(this._clonePad(pads[i]));\n }\n return arr;\n }\n /**\n * Fastest way to clone a known object is to do it yourself\n */\n _clonePad(pad) {\n let i, len;\n const clonedPad = new Gamepad();\n if (!pad) {\n return clonedPad;\n }\n for (i = 0, len = pad.buttons.length; i < len; i++) {\n if (pad.buttons[i]) {\n clonedPad.updateButton(i, pad.buttons[i].value);\n }\n }\n for (i = 0, len = pad.axes.length; i < len; i++) {\n clonedPad.updateAxes(i, pad.axes[i]);\n }\n return clonedPad;\n }\n}\n/**\n * The minimum value an axis has to move before considering it a change\n */\nGamepads.MinAxisMoveThreshold = 0.05;\n/**\n * Gamepad holds state information for a connected controller. See {@apilink Gamepads}\n * for more information on handling controller input.\n */\nclass Gamepad {\n constructor() {\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n this.connected = false;\n this._axes = new Array(4);\n this._buttons = new Array(16);\n this._buttonsUp = new Array(16);\n this._buttonsDown = new Array(16);\n for (let i = 0; i < this._buttons.length; i++) {\n this._buttons[i] = 0;\n }\n for (let i = 0; i < this._axes.length; i++) {\n this._axes[i] = 0;\n }\n }\n update() {\n // Reset buttonsDown and buttonsUp after update is complete\n this._buttonsDown = new Array(16);\n this._buttonsUp = new Array(16);\n }\n /**\n * Whether or not the given button is pressed\n * @deprecated will be removed in v0.28.0. Use isButtonHeld instead\n * @param button The button to query\n * @param threshold The threshold over which the button is considered to be pressed\n */\n isButtonPressed(button, threshold = 1) {\n return this._buttons[button] >= threshold;\n }\n /**\n * Tests if a certain button is held down. This is persisted between frames.\n * @param button The button to query\n * @param threshold The threshold over which the button is considered to be pressed\n */\n isButtonHeld(button, threshold = 1) {\n return this._buttons[button] >= threshold;\n }\n /**\n * Tests if a certain button was just pressed this frame. This is cleared at the end of the update frame.\n * @param button Test whether a button was just pressed\n * @param threshold The threshold over which the button is considered to be pressed\n */\n wasButtonPressed(button, threshold = 1) {\n return this._buttonsDown[button] >= threshold;\n }\n /**\n * Tests if a certain button was just released this frame. This is cleared at the end of the update frame.\n * @param button Test whether a button was just released\n */\n wasButtonReleased(button) {\n return Boolean(this._buttonsUp[button]);\n }\n /**\n * Gets the given button value between 0 and 1\n */\n getButton(button) {\n return this._buttons[button];\n }\n /**\n * Gets the given axis value between -1 and 1. Values below\n * {@apilink MinAxisMoveThreshold} are considered 0.\n */\n getAxes(axes) {\n const value = this._axes[axes];\n if (Math.abs(value) < Gamepads.MinAxisMoveThreshold) {\n return 0;\n }\n else {\n return value;\n }\n }\n updateButton(buttonIndex, value) {\n // button was just released\n if (value === 0 && this._buttons[buttonIndex]) {\n this._buttonsUp[buttonIndex] = 1;\n // button was just pressed\n }\n else {\n this._buttonsDown[buttonIndex] = value;\n }\n this._buttons[buttonIndex] = value;\n }\n updateAxes(axesIndex, value) {\n this._axes[axesIndex] = value;\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n}\n/**\n * Gamepad Buttons enumeration\n */\nvar Buttons;\n(function (Buttons) {\n /**\n * Face 1 button (e.g. A)\n */\n Buttons[Buttons[\"Face1\"] = 0] = \"Face1\";\n /**\n * Face 2 button (e.g. B)\n */\n Buttons[Buttons[\"Face2\"] = 1] = \"Face2\";\n /**\n * Face 3 button (e.g. X)\n */\n Buttons[Buttons[\"Face3\"] = 2] = \"Face3\";\n /**\n * Face 4 button (e.g. Y)\n */\n Buttons[Buttons[\"Face4\"] = 3] = \"Face4\";\n /**\n * Left bumper button\n */\n Buttons[Buttons[\"LeftBumper\"] = 4] = \"LeftBumper\";\n /**\n * Right bumper button\n */\n Buttons[Buttons[\"RightBumper\"] = 5] = \"RightBumper\";\n /**\n * Left trigger button\n */\n Buttons[Buttons[\"LeftTrigger\"] = 6] = \"LeftTrigger\";\n /**\n * Right trigger button\n */\n Buttons[Buttons[\"RightTrigger\"] = 7] = \"RightTrigger\";\n /**\n * Select button\n */\n Buttons[Buttons[\"Select\"] = 8] = \"Select\";\n /**\n * Start button\n */\n Buttons[Buttons[\"Start\"] = 9] = \"Start\";\n /**\n * Left analog stick press (e.g. L3)\n */\n Buttons[Buttons[\"LeftStick\"] = 10] = \"LeftStick\";\n /**\n * Right analog stick press (e.g. R3)\n */\n Buttons[Buttons[\"RightStick\"] = 11] = \"RightStick\";\n /**\n * D-pad up\n */\n Buttons[Buttons[\"DpadUp\"] = 12] = \"DpadUp\";\n /**\n * D-pad down\n */\n Buttons[Buttons[\"DpadDown\"] = 13] = \"DpadDown\";\n /**\n * D-pad left\n */\n Buttons[Buttons[\"DpadLeft\"] = 14] = \"DpadLeft\";\n /**\n * D-pad right\n */\n Buttons[Buttons[\"DpadRight\"] = 15] = \"DpadRight\";\n})(Buttons || (Buttons = {}));\n/**\n * Gamepad Axes enumeration\n */\nvar Axes;\n(function (Axes) {\n /**\n * Left analogue stick X direction\n */\n Axes[Axes[\"LeftStickX\"] = 0] = \"LeftStickX\";\n /**\n * Left analogue stick Y direction\n */\n Axes[Axes[\"LeftStickY\"] = 1] = \"LeftStickY\";\n /**\n * Right analogue stick X direction\n */\n Axes[Axes[\"RightStickX\"] = 2] = \"RightStickX\";\n /**\n * Right analogue stick Y direction\n */\n Axes[Axes[\"RightStickY\"] = 3] = \"RightStickY\";\n})(Axes || (Axes = {}));\n\n\n/***/ }),\n\n/***/ \"./Input/InputHost.ts\":\n/*!****************************!*\\\n !*** ./Input/InputHost.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ InputHost: () => (/* binding */ InputHost)\n/* harmony export */ });\n/* harmony import */ var _Gamepad__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Gamepad */ \"./Input/Gamepad.ts\");\n/* harmony import */ var _InputMapper__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./InputMapper */ \"./Input/InputMapper.ts\");\n/* harmony import */ var _Keyboard__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Keyboard */ \"./Input/Keyboard.ts\");\n/* harmony import */ var _PointerEventReceiver__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./PointerEventReceiver */ \"./Input/PointerEventReceiver.ts\");\n\n\n\n\nclass InputHost {\n constructor(options) {\n this._enabled = true;\n const { pointerTarget, grabWindowFocus, engine } = options;\n this.keyboard = new _Keyboard__WEBPACK_IMPORTED_MODULE_0__.Keyboard();\n this.pointers = new _PointerEventReceiver__WEBPACK_IMPORTED_MODULE_1__.PointerEventReceiver(pointerTarget, engine);\n this.gamepads = new _Gamepad__WEBPACK_IMPORTED_MODULE_2__.Gamepads();\n this.keyboard.init({ grabWindowFocus });\n this.pointers.init({ grabWindowFocus });\n this.gamepads.init();\n this.inputMapper = new _InputMapper__WEBPACK_IMPORTED_MODULE_3__.InputMapper({\n keyboard: this.keyboard,\n pointers: this.pointers,\n gamepads: this.gamepads\n });\n }\n get enabled() {\n return this._enabled;\n }\n toggleEnabled(enabled) {\n this._enabled = enabled;\n this.keyboard.toggleEnabled(this._enabled);\n this.pointers.toggleEnabled(this._enabled);\n this.gamepads.toggleEnabled(this._enabled);\n }\n update() {\n if (this._enabled) {\n this.inputMapper.execute();\n this.keyboard.update();\n this.gamepads.update();\n }\n }\n clear() {\n this.keyboard.clear();\n this.pointers.clear();\n // this.gamepads.clear();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Input/InputMapper.ts\":\n/*!******************************!*\\\n !*** ./Input/InputMapper.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ InputMapper: () => (/* binding */ InputMapper)\n/* harmony export */ });\n/**\n * This allows you to map multiple inputs to specific commands! This is especially useful when\n * you need to allow multiple input sources to control a specific action.\n */\nclass InputMapper {\n constructor(inputs) {\n this.inputs = inputs;\n this._handlers = new Map();\n }\n /**\n * Executes the input map, called internally by Excalibur\n */\n execute() {\n for (const [input, command] of this._handlers.entries()) {\n const results = input(this.inputs);\n if (results) {\n command(results);\n }\n }\n }\n /**\n * This allows you to map multiple inputs to specific commands! This is useful\n *\n * The inputHandler should return a truthy value if you wish the commandHandler to fire.\n *\n * Example:\n * ```typescript\n * const moveRight = (amount: number) => { actor.vel.x = 100 * amount }\n * const moveLeft = (amount: number) => { actor.vel.x = -100 * amount }\n * const moveUp = (amount: number) => { actor.vel.y = -100 * amount }\n * const moveDown = (amount: number) => { actor.vel.y = 100 * amount }\n *\n * engine.inputMapper.on(({keyboard}) => keyboard.isHeld(ex.Keys.ArrowRight) ? 1 : 0, moveRight);\n * engine.inputMapper.on(({gamepads}) => gamepads.at(0).isButtonPressed(ex.Buttons.DpadRight) ? 1 : 0, moveRight);\n * engine.inputMapper.on(({gamepads}) => gamepads.at(0).getAxes(ex.Axes.LeftStickX) > 0 ?\n * gamepads.at(0).getAxes(ex.Axes.LeftStickX) : 0, moveRight);\n * ```\n * @param inputHandler\n * @param commandHandler\n */\n on(inputHandler, commandHandler) {\n this._handlers.set(inputHandler, commandHandler);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Input/Keyboard.ts\":\n/*!***************************!*\\\n !*** ./Input/Keyboard.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ KeyEvent: () => (/* binding */ KeyEvent),\n/* harmony export */ KeyEvents: () => (/* binding */ KeyEvents),\n/* harmony export */ Keyboard: () => (/* binding */ Keyboard),\n/* harmony export */ Keys: () => (/* binding */ Keys)\n/* harmony export */ });\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _Util_IFrame__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Util/IFrame */ \"./Util/IFrame.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n\n/**\n * Enum representing physical input key codes\n *\n * Spec: https://w3c.github.io/uievents-code/#key-alphanumeric-section\n */\nvar Keys;\n(function (Keys) {\n // Writing System Keys https://w3c.github.io/uievents-code/#key-alphanumeric-writing-system\n Keys[\"Backquote\"] = \"Backquote\";\n Keys[\"Backslash\"] = \"Backslash\";\n Keys[\"BracketLeft\"] = \"BracketLeft\";\n Keys[\"BracketRight\"] = \"BracketRight\";\n Keys[\"Comma\"] = \"Comma\";\n // NUMBERS\n Keys[\"Key0\"] = \"Digit0\";\n Keys[\"Key1\"] = \"Digit1\";\n Keys[\"Key2\"] = \"Digit2\";\n Keys[\"Key3\"] = \"Digit3\";\n Keys[\"Key4\"] = \"Digit4\";\n Keys[\"Key5\"] = \"Digit5\";\n Keys[\"Key6\"] = \"Digit6\";\n Keys[\"Key7\"] = \"Digit7\";\n Keys[\"Key8\"] = \"Digit8\";\n Keys[\"Key9\"] = \"Digit9\";\n Keys[\"Digit0\"] = \"Digit0\";\n Keys[\"Digit1\"] = \"Digit1\";\n Keys[\"Digit2\"] = \"Digit2\";\n Keys[\"Digit3\"] = \"Digit3\";\n Keys[\"Digit4\"] = \"Digit4\";\n Keys[\"Digit5\"] = \"Digit5\";\n Keys[\"Digit6\"] = \"Digit6\";\n Keys[\"Digit7\"] = \"Digit7\";\n Keys[\"Digit8\"] = \"Digit8\";\n Keys[\"Digit9\"] = \"Digit9\";\n Keys[\"Equal\"] = \"Equal\";\n Keys[\"IntlBackslash\"] = \"IntlBackslash\";\n Keys[\"IntlRo\"] = \"IntlRo\";\n Keys[\"IntlYen\"] = \"IntlYen\";\n // LETTERS\n Keys[\"A\"] = \"KeyA\";\n Keys[\"B\"] = \"KeyB\";\n Keys[\"C\"] = \"KeyC\";\n Keys[\"D\"] = \"KeyD\";\n Keys[\"E\"] = \"KeyE\";\n Keys[\"F\"] = \"KeyF\";\n Keys[\"G\"] = \"KeyG\";\n Keys[\"H\"] = \"KeyH\";\n Keys[\"I\"] = \"KeyI\";\n Keys[\"J\"] = \"KeyJ\";\n Keys[\"K\"] = \"KeyK\";\n Keys[\"L\"] = \"KeyL\";\n Keys[\"M\"] = \"KeyM\";\n Keys[\"N\"] = \"KeyN\";\n Keys[\"O\"] = \"KeyO\";\n Keys[\"P\"] = \"KeyP\";\n Keys[\"Q\"] = \"KeyQ\";\n Keys[\"R\"] = \"KeyR\";\n Keys[\"S\"] = \"KeyS\";\n Keys[\"T\"] = \"KeyT\";\n Keys[\"U\"] = \"KeyU\";\n Keys[\"V\"] = \"KeyV\";\n Keys[\"W\"] = \"KeyW\";\n Keys[\"X\"] = \"KeyX\";\n Keys[\"Y\"] = \"KeyY\";\n Keys[\"Z\"] = \"KeyZ\";\n Keys[\"KeyA\"] = \"KeyA\";\n Keys[\"KeyB\"] = \"KeyB\";\n Keys[\"KeyC\"] = \"KeyC\";\n Keys[\"KeyD\"] = \"KeyD\";\n Keys[\"KeyE\"] = \"KeyE\";\n Keys[\"KeyF\"] = \"KeyF\";\n Keys[\"KeyG\"] = \"KeyG\";\n Keys[\"KeyH\"] = \"KeyH\";\n Keys[\"KeyI\"] = \"KeyI\";\n Keys[\"KeyJ\"] = \"KeyJ\";\n Keys[\"KeyK\"] = \"KeyK\";\n Keys[\"KeyL\"] = \"KeyL\";\n Keys[\"KeyM\"] = \"KeyM\";\n Keys[\"KeyN\"] = \"KeyN\";\n Keys[\"KeyO\"] = \"KeyO\";\n Keys[\"KeyP\"] = \"KeyP\";\n Keys[\"KeyQ\"] = \"KeyQ\";\n Keys[\"KeyR\"] = \"KeyR\";\n Keys[\"KeyS\"] = \"KeyS\";\n Keys[\"KeyT\"] = \"KeyT\";\n Keys[\"KeyU\"] = \"KeyU\";\n Keys[\"KeyV\"] = \"KeyV\";\n Keys[\"KeyW\"] = \"KeyW\";\n Keys[\"KeyX\"] = \"KeyX\";\n Keys[\"KeyY\"] = \"KeyY\";\n Keys[\"KeyZ\"] = \"KeyZ\";\n // SYMBOLS\n Keys[\"Minus\"] = \"Minus\";\n Keys[\"Period\"] = \"Period\";\n Keys[\"Quote\"] = \"Quote\";\n Keys[\"Semicolon\"] = \"Semicolon\";\n Keys[\"Slash\"] = \"Slash\";\n // Functional keys https://w3c.github.io/uievents-code/#key-alphanumeric-functional\n Keys[\"AltLeft\"] = \"AltLeft\";\n Keys[\"AltRight\"] = \"AltRight\";\n Keys[\"Alt\"] = \"Alt\";\n Keys[\"AltGraph\"] = \"AltGraph\";\n Keys[\"Backspace\"] = \"Backspace\";\n Keys[\"CapsLock\"] = \"CapsLock\";\n Keys[\"ContextMenu\"] = \"ContextMenu\";\n Keys[\"ControlLeft\"] = \"ControlLeft\";\n Keys[\"ControlRight\"] = \"ControlRight\";\n Keys[\"Enter\"] = \"Enter\";\n Keys[\"MetaLeft\"] = \"MetaLeft\";\n Keys[\"MetaRight\"] = \"MetaRight\";\n Keys[\"ShiftLeft\"] = \"ShiftLeft\";\n Keys[\"ShiftRight\"] = \"ShiftRight\";\n Keys[\"Space\"] = \"Space\";\n Keys[\"Tab\"] = \"Tab\";\n Keys[\"Convert\"] = \"Convert\";\n Keys[\"KanaMode\"] = \"KanaMode\";\n Keys[\"NonConvert\"] = \"NonConvert\";\n // Control Pad https://w3c.github.io/uievents-code/#key-controlpad-section\n Keys[\"Delete\"] = \"Delete\";\n Keys[\"End\"] = \"End\";\n Keys[\"Help\"] = \"Help\";\n Keys[\"Home\"] = \"Home\";\n Keys[\"Insert\"] = \"Insert\";\n Keys[\"PageDown\"] = \"PageDown\";\n Keys[\"PageUp\"] = \"PageUp\";\n // Arrow Pad https://w3c.github.io/uievents-code/#key-arrowpad-section\n Keys[\"Up\"] = \"ArrowUp\";\n Keys[\"Down\"] = \"ArrowDown\";\n Keys[\"Left\"] = \"ArrowLeft\";\n Keys[\"Right\"] = \"ArrowRight\";\n Keys[\"ArrowUp\"] = \"ArrowUp\";\n Keys[\"ArrowDown\"] = \"ArrowDown\";\n Keys[\"ArrowLeft\"] = \"ArrowLeft\";\n Keys[\"ArrowRight\"] = \"ArrowRight\";\n // Numpad Section https://w3c.github.io/uievents-code/#key-numpad-section\n Keys[\"NumLock\"] = \"NumLock\";\n Keys[\"Numpad0\"] = \"Numpad0\";\n Keys[\"Numpad1\"] = \"Numpad1\";\n Keys[\"Numpad2\"] = \"Numpad2\";\n Keys[\"Numpad3\"] = \"Numpad3\";\n Keys[\"Numpad4\"] = \"Numpad4\";\n Keys[\"Numpad5\"] = \"Numpad5\";\n Keys[\"Numpad6\"] = \"Numpad6\";\n Keys[\"Numpad7\"] = \"Numpad7\";\n Keys[\"Numpad8\"] = \"Numpad8\";\n Keys[\"Numpad9\"] = \"Numpad9\";\n Keys[\"Num0\"] = \"Numpad0\";\n Keys[\"Num1\"] = \"Numpad1\";\n Keys[\"Num2\"] = \"Numpad2\";\n Keys[\"Num3\"] = \"Numpad3\";\n Keys[\"Num4\"] = \"Numpad4\";\n Keys[\"Num5\"] = \"Numpad5\";\n Keys[\"Num6\"] = \"Numpad6\";\n Keys[\"Num7\"] = \"Numpad7\";\n Keys[\"Num8\"] = \"Numpad8\";\n Keys[\"Num9\"] = \"Numpad9\";\n Keys[\"NumAdd\"] = \"NumpadAdd\";\n Keys[\"NumpadAdd\"] = \"NumpadAdd\";\n Keys[\"NumDecimal\"] = \"NumpadDecimal\";\n Keys[\"NumpadDecimal\"] = \"NumpadDecimal\";\n Keys[\"NumDivide\"] = \"NumpadDivide\";\n Keys[\"NumpadDivide\"] = \"NumpadDivide\";\n Keys[\"NumEnter\"] = \"NumpadEnter\";\n Keys[\"NumpadEnter\"] = \"NumpadEnter\";\n Keys[\"NumMultiply\"] = \"NumpadMultiply\";\n Keys[\"NumpadMultiply\"] = \"NumpadMultiply\";\n Keys[\"NumSubtract\"] = \"NumpadSubtract\";\n Keys[\"NumpadSubtract\"] = \"NumpadSubtract\";\n // NumComma = 'NumpadComma', // not x-browser\n // NumpadComma = 'NumpadComma', // not x-browser\n // Function section https://w3c.github.io/uievents-code/#key-function-section\n Keys[\"Esc\"] = \"Escape\";\n Keys[\"Escape\"] = \"Escape\";\n Keys[\"F1\"] = \"F1\";\n Keys[\"F2\"] = \"F2\";\n Keys[\"F3\"] = \"F3\";\n Keys[\"F4\"] = \"F4\";\n Keys[\"F5\"] = \"F5\";\n Keys[\"F6\"] = \"F6\";\n Keys[\"F7\"] = \"F7\";\n Keys[\"F8\"] = \"F8\";\n Keys[\"F9\"] = \"F9\";\n Keys[\"F10\"] = \"F10\";\n Keys[\"F11\"] = \"F11\";\n Keys[\"F12\"] = \"F12\";\n Keys[\"F13\"] = \"F13\";\n Keys[\"F14\"] = \"F14\";\n Keys[\"F15\"] = \"F15\";\n Keys[\"F16\"] = \"F16\";\n Keys[\"F17\"] = \"F17\";\n Keys[\"F18\"] = \"F18\";\n Keys[\"F19\"] = \"F19\";\n Keys[\"F20\"] = \"F20\";\n Keys[\"PrintScreen\"] = \"PrintScreen\";\n Keys[\"ScrollLock\"] = \"ScrollLock\";\n Keys[\"Pause\"] = \"Pause\";\n Keys[\"Unidentified\"] = \"Unidentified\";\n})(Keys || (Keys = {}));\n/**\n * Event thrown on a game object for a key event\n */\nclass KeyEvent extends _Events__WEBPACK_IMPORTED_MODULE_0__.GameEvent {\n /**\n * @param key The key responsible for throwing the event\n * @param value The key's typed value the browser detected\n * @param originalEvent The original keyboard event that Excalibur handled\n */\n constructor(key, value, originalEvent) {\n super();\n this.key = key;\n this.value = value;\n this.originalEvent = originalEvent;\n }\n}\nconst KeyEvents = {\n Press: 'press',\n Hold: 'hold',\n Release: 'release'\n};\n/**\n * Provides keyboard support for Excalibur.\n */\nclass Keyboard {\n constructor() {\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_1__.EventEmitter();\n this._enabled = true;\n /**\n * Keys that are currently held down\n */\n this._keys = [];\n /**\n * Keys up in the current frame\n */\n this._keysUp = [];\n /**\n * Keys down in the current frame\n */\n this._keysDown = [];\n this._releaseAllKeys = (ev) => {\n for (const code of this._keys) {\n const keyEvent = new KeyEvent(code, ev.key, ev);\n this.events.emit('up', keyEvent);\n this.events.emit('release', keyEvent);\n }\n this._keysUp = Array.from(new Set(this._keys.concat(this._keysUp)));\n this._keys.length = 0;\n };\n this._handleKeyDown = (ev) => {\n if (!this._enabled) {\n return;\n }\n // handle macos meta key issue\n // https://github.com/excaliburjs/Excalibur/issues/2608\n if (!ev.metaKey && (this._keys.includes(Keys.MetaLeft) || this._keys.includes(Keys.MetaRight))) {\n this._releaseAllKeys(ev);\n }\n const code = ev.code;\n if (this._keys.indexOf(code) === -1) {\n this._keys.push(code);\n this._keysDown.push(code);\n const keyEvent = new KeyEvent(code, ev.key, ev);\n this.events.emit('down', keyEvent);\n this.events.emit('press', keyEvent);\n }\n };\n this._handleKeyUp = (ev) => {\n if (!this._enabled) {\n return;\n }\n const code = ev.code;\n const key = this._keys.indexOf(code);\n this._keys.splice(key, 1);\n this._keysUp.push(code);\n const keyEvent = new KeyEvent(code, ev.key, ev);\n // alias the old api, we may want to deprecate this in the future\n this.events.emit('up', keyEvent);\n this.events.emit('release', keyEvent);\n // handle macos meta key issue\n // https://github.com/excaliburjs/Excalibur/issues/2608\n if (ev.key === 'Meta') {\n this._releaseAllKeys(ev);\n }\n };\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n /**\n * Initialize Keyboard event listeners\n */\n init(keyboardOptions) {\n let { global } = keyboardOptions;\n const { grabWindowFocus } = keyboardOptions;\n if (!global) {\n if ((0,_Util_IFrame__WEBPACK_IMPORTED_MODULE_2__.isCrossOriginIframe)()) {\n global = window;\n // Workaround for iframes like for itch.io or codesandbox\n // https://www.reddit.com/r/gamemaker/comments/kfs5cs/keyboard_inputs_no_longer_working_in_html5_game/\n // https://forum.gamemaker.io/index.php?threads/solved-keyboard-issue-on-itch-io.87336/\n if (grabWindowFocus) {\n window.focus();\n }\n _Util_Log__WEBPACK_IMPORTED_MODULE_3__.Logger.getInstance().warn('Excalibur might be in a cross-origin iframe, in order to receive keyboard events it must be in focus');\n }\n else {\n global = window.top;\n }\n }\n global.addEventListener('blur', () => {\n this._keys.length = 0; // empties array efficiently\n });\n // key up is on window because canvas cannot have focus\n global.addEventListener('keyup', this._handleKeyUp);\n // key down is on window because canvas cannot have focus\n global.addEventListener('keydown', this._handleKeyDown);\n }\n toggleEnabled(enabled) {\n this._enabled = enabled;\n }\n clear() {\n this._keysDown.length = 0;\n this._keysUp.length = 0;\n this._keys.length = 0;\n }\n update() {\n // Reset keysDown and keysUp after update is complete\n this._keysDown.length = 0;\n this._keysUp.length = 0;\n // Emit synthetic \"hold\" event\n for (let i = 0; i < this._keys.length; i++) {\n this.events.emit('hold', new KeyEvent(this._keys[i]));\n }\n }\n /**\n * Gets list of keys being pressed down\n */\n getKeys() {\n return this._keys;\n }\n /**\n * Tests if a certain key was just pressed this frame. This is cleared at the end of the update frame.\n * @param key Test whether a key was just pressed\n */\n wasPressed(key) {\n if (!this._enabled) {\n return false;\n }\n return this._keysDown.indexOf(key) > -1;\n }\n /**\n * Tests if a certain key is held down. This is persisted between frames.\n * @param key Test whether a key is held down\n */\n isHeld(key) {\n if (!this._enabled) {\n return false;\n }\n return this._keys.indexOf(key) > -1;\n }\n /**\n * Tests if a certain key was just released this frame. This is cleared at the end of the update frame.\n * @param key Test whether a key was just released\n */\n wasReleased(key) {\n if (!this._enabled) {\n return false;\n }\n return this._keysUp.indexOf(key) > -1;\n }\n /**\n * Trigger a manual key event\n * @param type\n * @param key\n * @param character\n */\n triggerEvent(type, key, character) {\n if (type === 'down') {\n this._handleKeyDown(new KeyboardEvent('keydown', {\n code: key,\n key: character !== null && character !== void 0 ? character : null\n }));\n }\n if (type === 'up') {\n this._handleKeyUp(new KeyboardEvent('keyup', {\n code: key,\n key: character !== null && character !== void 0 ? character : null\n }));\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Input/NativePointerButton.ts\":\n/*!**************************************!*\\\n !*** ./Input/NativePointerButton.ts ***!\n \\**************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ NativePointerButton: () => (/* binding */ NativePointerButton)\n/* harmony export */ });\n/**\n * Native browser button enumeration\n */\nvar NativePointerButton;\n(function (NativePointerButton) {\n NativePointerButton[NativePointerButton[\"NoButton\"] = -1] = \"NoButton\";\n NativePointerButton[NativePointerButton[\"Left\"] = 0] = \"Left\";\n NativePointerButton[NativePointerButton[\"Middle\"] = 1] = \"Middle\";\n NativePointerButton[NativePointerButton[\"Right\"] = 2] = \"Right\";\n NativePointerButton[NativePointerButton[\"Unknown\"] = 3] = \"Unknown\";\n})(NativePointerButton || (NativePointerButton = {}));\n\n\n/***/ }),\n\n/***/ \"./Input/PointerAbstraction.ts\":\n/*!*************************************!*\\\n !*** ./Input/PointerAbstraction.ts ***!\n \\*************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerAbstraction: () => (/* binding */ PointerAbstraction)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Math_global_coordinates__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Math/global-coordinates */ \"./Math/global-coordinates.ts\");\n\n\n\nclass PointerAbstraction {\n constructor() {\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n /**\n * The last position on the document this pointer was at. Can be `null` if pointer was never active.\n */\n this.lastPagePos = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n /**\n * The last position on the screen this pointer was at. Can be `null` if pointer was never active.\n */\n this.lastScreenPos = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n /**\n * The last position in the game world coordinates this pointer was at. Can be `null` if pointer was never active.\n */\n this.lastWorldPos = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n this._onPointerMove = (ev) => {\n this.lastPagePos = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(ev.pagePos.x, ev.pagePos.y);\n this.lastScreenPos = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(ev.screenPos.x, ev.screenPos.y);\n this.lastWorldPos = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(ev.worldPos.x, ev.worldPos.y);\n };\n this._onPointerDown = (ev) => {\n this.lastPagePos = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(ev.pagePos.x, ev.pagePos.y);\n this.lastScreenPos = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(ev.screenPos.x, ev.screenPos.y);\n this.lastWorldPos = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(ev.worldPos.x, ev.worldPos.y);\n };\n this.on('move', this._onPointerMove);\n this.on('down', this._onPointerDown);\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n /**\n * Called internally by excalibur to keep pointers up to date\n * @internal\n * @param engine\n */\n _updateWorldPosition(engine) {\n const coord = _Math_global_coordinates__WEBPACK_IMPORTED_MODULE_2__.GlobalCoordinates.fromPagePosition(this.lastPagePos, engine);\n this.lastScreenPos = coord.screenPos;\n this.lastWorldPos = coord.worldPos;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Input/PointerButton.ts\":\n/*!********************************!*\\\n !*** ./Input/PointerButton.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerButton: () => (/* binding */ PointerButton)\n/* harmony export */ });\n/**\n * The mouse button being pressed.\n */\nvar PointerButton;\n(function (PointerButton) {\n PointerButton[\"Left\"] = \"Left\";\n PointerButton[\"Middle\"] = \"Middle\";\n PointerButton[\"Right\"] = \"Right\";\n PointerButton[\"Unknown\"] = \"Unknown\";\n PointerButton[\"NoButton\"] = \"NoButton\";\n})(PointerButton || (PointerButton = {}));\n\n\n/***/ }),\n\n/***/ \"./Input/PointerComponent.ts\":\n/*!***********************************!*\\\n !*** ./Input/PointerComponent.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerComponent: () => (/* binding */ PointerComponent)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Component */ \"./EntityComponentSystem/Component.ts\");\n\n/**\n * Add this component to optionally configure how the pointer\n * system detects pointer events.\n *\n * By default the collider shape is used and graphics bounds is not.\n *\n * If both collider shape and graphics bounds are enabled it will fire events if either or\n * are intersecting the pointer.\n */\nclass PointerComponent extends _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor(options) {\n var _a, _b;\n super();\n /**\n * Use any existing Collider component geometry for pointer events. This is useful if you want\n * user pointer events only to trigger on the same collision geometry used in the collider component\n * for collision resolution. Default is `true`.\n */\n this.useColliderShape = true;\n /**\n * Use any existing Graphics component bounds for pointers. This is useful if you want the axis aligned\n * bounds around the graphic to trigger pointer events. Default is `true`.\n */\n this.useGraphicsBounds = true;\n this.useColliderShape = (_a = options === null || options === void 0 ? void 0 : options.useColliderShape) !== null && _a !== void 0 ? _a : this.useColliderShape;\n this.useGraphicsBounds = (_b = options === null || options === void 0 ? void 0 : options.useGraphicsBounds) !== null && _b !== void 0 ? _b : this.useGraphicsBounds;\n this.localBounds = options === null || options === void 0 ? void 0 : options.localBounds;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Input/PointerEvent.ts\":\n/*!*******************************!*\\\n !*** ./Input/PointerEvent.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerEvent: () => (/* binding */ PointerEvent)\n/* harmony export */ });\nclass PointerEvent {\n cancel() {\n this.active = false;\n }\n get pagePos() {\n return this.coordinates.pagePos;\n }\n get screenPos() {\n return this.coordinates.screenPos;\n }\n get worldPos() {\n return this.coordinates.worldPos;\n }\n constructor(type, pointerId, button, pointerType, coordinates, nativeEvent) {\n this.type = type;\n this.pointerId = pointerId;\n this.button = button;\n this.pointerType = pointerType;\n this.coordinates = coordinates;\n this.nativeEvent = nativeEvent;\n this.active = true;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Input/PointerEventReceiver.ts\":\n/*!***************************************!*\\\n !*** ./Input/PointerEventReceiver.ts ***!\n \\***************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerEventReceiver: () => (/* binding */ PointerEventReceiver),\n/* harmony export */ PointerEvents: () => (/* binding */ PointerEvents)\n/* harmony export */ });\n/* harmony import */ var _Engine__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Engine */ \"./Engine.ts\");\n/* harmony import */ var _Math_global_coordinates__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Math/global-coordinates */ \"./Math/global-coordinates.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _PointerEvent__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./PointerEvent */ \"./Input/PointerEvent.ts\");\n/* harmony import */ var _WheelEvent__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./WheelEvent */ \"./Input/WheelEvent.ts\");\n/* harmony import */ var _PointerAbstraction__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./PointerAbstraction */ \"./Input/PointerAbstraction.ts\");\n/* harmony import */ var _WheelDeltaMode__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./WheelDeltaMode */ \"./Input/WheelDeltaMode.ts\");\n/* harmony import */ var _PointerSystem__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./PointerSystem */ \"./Input/PointerSystem.ts\");\n/* harmony import */ var _NativePointerButton__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./NativePointerButton */ \"./Input/NativePointerButton.ts\");\n/* harmony import */ var _PointerButton__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./PointerButton */ \"./Input/PointerButton.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../Util/Util */ \"./Util/Util.ts\");\n/* harmony import */ var _PointerType__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./PointerType */ \"./Input/PointerType.ts\");\n/* harmony import */ var _Util_IFrame__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Util/IFrame */ \"./Util/IFrame.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst PointerEvents = {\n Move: 'move',\n Down: 'down',\n Up: 'up',\n Wheel: 'wheel'\n};\n/**\n * Is this event a native touch event?\n */\nfunction isTouchEvent(value) {\n // Guard for Safari <= 13.1\n return globalThis.TouchEvent && value instanceof globalThis.TouchEvent;\n}\n/**\n * Is this event a native pointer event\n */\nfunction isPointerEvent(value) {\n // Guard for Safari <= 13.1\n return globalThis.PointerEvent && value instanceof globalThis.PointerEvent;\n}\n/**\n * The PointerEventProcessor is responsible for collecting all the events from the canvas and transforming them into GlobalCoordinates\n */\nclass PointerEventReceiver {\n constructor(target, engine) {\n this.target = target;\n this.engine = engine;\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n this.primary = new _PointerAbstraction__WEBPACK_IMPORTED_MODULE_1__.PointerAbstraction();\n this._activeNativePointerIdsToNormalized = new Map();\n this.lastFramePointerCoords = new Map();\n this.currentFramePointerCoords = new Map();\n this.currentFramePointerDown = new Map();\n this.lastFramePointerDown = new Map();\n this.currentFrameDown = [];\n this.currentFrameUp = [];\n this.currentFrameMove = [];\n this.currentFrameCancel = [];\n this.currentFrameWheel = [];\n this._enabled = true;\n this._pointers = [this.primary];\n this._boundHandle = this._handle.bind(this);\n this._boundWheel = this._handleWheel.bind(this);\n }\n toggleEnabled(enabled) {\n this._enabled = enabled;\n }\n /**\n * Creates a new PointerEventReceiver with a new target and engine while preserving existing pointer event\n * handlers.\n * @param target\n * @param engine\n */\n recreate(target, engine) {\n const eventReceiver = new PointerEventReceiver(target, engine);\n eventReceiver.primary = this.primary;\n eventReceiver._pointers = this._pointers;\n return eventReceiver;\n }\n /**\n * Locates a specific pointer by id, creates it if it doesn't exist\n * @param index\n */\n at(index) {\n if (index >= this._pointers.length) {\n // Ensure there is a pointer to retrieve\n for (let i = this._pointers.length - 1, max = index; i < max; i++) {\n this._pointers.push(new _PointerAbstraction__WEBPACK_IMPORTED_MODULE_1__.PointerAbstraction());\n }\n }\n return this._pointers[index];\n }\n /**\n * The number of pointers currently being tracked by excalibur\n */\n count() {\n return this._pointers.length;\n }\n /**\n * Is the specified pointer id down this frame\n * @param pointerId\n */\n isDown(pointerId) {\n var _a;\n if (!this._enabled) {\n return false;\n }\n return (_a = this.currentFramePointerDown.get(pointerId)) !== null && _a !== void 0 ? _a : false;\n }\n /**\n * Was the specified pointer id down last frame\n * @param pointerId\n */\n wasDown(pointerId) {\n var _a;\n if (!this._enabled) {\n return false;\n }\n return (_a = this.lastFramePointerDown.get(pointerId)) !== null && _a !== void 0 ? _a : false;\n }\n /**\n * Whether the Pointer is currently dragging.\n */\n isDragging(pointerId) {\n if (!this._enabled) {\n return false;\n }\n return this.isDown(pointerId);\n }\n /**\n * Whether the Pointer just started dragging.\n */\n isDragStart(pointerId) {\n if (!this._enabled) {\n return false;\n }\n return this.isDown(pointerId) && !this.wasDown(pointerId);\n }\n /**\n * Whether the Pointer just ended dragging.\n */\n isDragEnd(pointerId) {\n if (!this._enabled) {\n return false;\n }\n return !this.isDown(pointerId) && this.wasDown(pointerId);\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n /**\n * Called internally by excalibur\n *\n * Updates the current frame pointer info and emits raw pointer events\n *\n * This does not emit events to entities, see PointerSystem\n * @internal\n */\n update() {\n this.lastFramePointerDown = new Map(this.currentFramePointerDown);\n this.lastFramePointerCoords = new Map(this.currentFramePointerCoords);\n for (const event of this.currentFrameDown) {\n if (!event.active) {\n continue;\n }\n this.emit('down', event);\n const pointer = this.at(event.pointerId);\n pointer.emit('down', event);\n this.primary.emit('pointerdown', event);\n }\n for (const event of this.currentFrameUp) {\n if (!event.active) {\n continue;\n }\n this.emit('up', event);\n const pointer = this.at(event.pointerId);\n pointer.emit('up', event);\n }\n for (const event of this.currentFrameMove) {\n if (!event.active) {\n continue;\n }\n this.emit('move', event);\n const pointer = this.at(event.pointerId);\n pointer.emit('move', event);\n }\n for (const event of this.currentFrameCancel) {\n if (!event.active) {\n continue;\n }\n this.emit('cancel', event);\n const pointer = this.at(event.pointerId);\n pointer.emit('cancel', event);\n }\n for (const event of this.currentFrameWheel) {\n if (!event.active) {\n continue;\n }\n this.emit('pointerwheel', event);\n this.emit('wheel', event);\n this.primary.emit('pointerwheel', event);\n this.primary.emit('wheel', event);\n }\n if (this.engine.currentScene.camera.hasChanged()) {\n for (const pointer of this._pointers) {\n pointer._updateWorldPosition(this.engine);\n }\n }\n }\n /**\n * Clears the current frame event and pointer data\n */\n clear() {\n for (const event of this.currentFrameUp) {\n this.currentFramePointerCoords.delete(event.pointerId);\n const ids = this._activeNativePointerIdsToNormalized.entries();\n for (const [native, normalized] of ids) {\n if (normalized === event.pointerId) {\n this._activeNativePointerIdsToNormalized.delete(native);\n }\n }\n }\n this.currentFrameDown.length = 0;\n this.currentFrameUp.length = 0;\n this.currentFrameMove.length = 0;\n this.currentFrameCancel.length = 0;\n this.currentFrameWheel.length = 0;\n }\n /**\n * Initializes the pointer event receiver so that it can start listening to native\n * browser events.\n */\n init(options) {\n var _a;\n if (this.engine.isDisposed()) {\n return;\n }\n // Disabling the touch action avoids browser/platform gestures from firing on the canvas\n // It is important on mobile to have touch action 'none'\n // https://stackoverflow.com/questions/48124372/pointermove-event-not-working-with-touch-why-not\n if (this.target === this.engine.canvas) {\n this.engine.canvas.style.touchAction = 'none';\n }\n else {\n document.body.style.touchAction = 'none';\n }\n // Preferred pointer events\n if (window.PointerEvent) {\n this.target.addEventListener('pointerdown', this._boundHandle);\n this.target.addEventListener('pointerup', this._boundHandle);\n this.target.addEventListener('pointermove', this._boundHandle);\n this.target.addEventListener('pointercancel', this._boundHandle);\n }\n else {\n // Touch Events\n this.target.addEventListener('touchstart', this._boundHandle);\n this.target.addEventListener('touchend', this._boundHandle);\n this.target.addEventListener('touchmove', this._boundHandle);\n this.target.addEventListener('touchcancel', this._boundHandle);\n // Mouse Events\n this.target.addEventListener('mousedown', this._boundHandle);\n this.target.addEventListener('mouseup', this._boundHandle);\n this.target.addEventListener('mousemove', this._boundHandle);\n }\n // MDN MouseWheelEvent\n const wheelOptions = {\n passive: !(this.engine.pageScrollPreventionMode === _Engine__WEBPACK_IMPORTED_MODULE_2__.ScrollPreventionMode.All ||\n this.engine.pageScrollPreventionMode === _Engine__WEBPACK_IMPORTED_MODULE_2__.ScrollPreventionMode.Canvas)\n };\n if ('onwheel' in document.createElement('div')) {\n // Modern Browsers\n this.target.addEventListener('wheel', this._boundWheel, wheelOptions);\n }\n else if (document.onmousewheel !== undefined) {\n // Webkit and IE\n this.target.addEventListener('mousewheel', this._boundWheel, wheelOptions);\n }\n else {\n // Remaining browser and older Firefox\n this.target.addEventListener('MozMousePixelScroll', this._boundWheel, wheelOptions);\n }\n const grabWindowFocus = (_a = options === null || options === void 0 ? void 0 : options.grabWindowFocus) !== null && _a !== void 0 ? _a : true;\n // Handle cross origin iframe\n if (grabWindowFocus && (0,_Util_IFrame__WEBPACK_IMPORTED_MODULE_3__.isCrossOriginIframe)()) {\n const grabFocus = () => {\n window.focus();\n };\n // Preferred pointer events\n if (window.PointerEvent) {\n this.target.addEventListener('pointerdown', grabFocus);\n }\n else {\n // Touch Events\n this.target.addEventListener('touchstart', grabFocus);\n // Mouse Events\n this.target.addEventListener('mousedown', grabFocus);\n }\n }\n }\n detach() {\n // Preferred pointer events\n if (window.PointerEvent) {\n this.target.removeEventListener('pointerdown', this._boundHandle);\n this.target.removeEventListener('pointerup', this._boundHandle);\n this.target.removeEventListener('pointermove', this._boundHandle);\n this.target.removeEventListener('pointercancel', this._boundHandle);\n }\n else {\n // Touch Events\n this.target.removeEventListener('touchstart', this._boundHandle);\n this.target.removeEventListener('touchend', this._boundHandle);\n this.target.removeEventListener('touchmove', this._boundHandle);\n this.target.removeEventListener('touchcancel', this._boundHandle);\n // Mouse Events\n this.target.removeEventListener('mousedown', this._boundHandle);\n this.target.removeEventListener('mouseup', this._boundHandle);\n this.target.removeEventListener('mousemove', this._boundHandle);\n }\n if ('onwheel' in document.createElement('div')) {\n // Modern Browsers\n this.target.removeEventListener('wheel', this._boundWheel);\n }\n else if (document.onmousewheel !== undefined) {\n // Webkit and IE\n this.target.addEventListener('mousewheel', this._boundWheel);\n }\n else {\n // Remaining browser and older Firefox\n this.target.addEventListener('MozMousePixelScroll', this._boundWheel);\n }\n }\n /**\n * Take native pointer id and map it to index in active pointers\n * @param nativePointerId\n */\n _normalizePointerId(nativePointerId) {\n // Add to the the native pointer set id\n this._activeNativePointerIdsToNormalized.set(nativePointerId, -1);\n // Native pointer ids in ascending order\n const currentPointerIds = Array.from(this._activeNativePointerIdsToNormalized.keys()).sort((a, b) => a - b);\n // The index into sorted ids will be the new id, will always have an id\n const id = currentPointerIds.findIndex((p) => p === nativePointerId);\n // Save the mapping so we can reverse it later\n this._activeNativePointerIdsToNormalized.set(nativePointerId, id);\n // ignore pointer because game isn't watching\n return id;\n }\n /**\n * Responsible for handling and parsing pointer events\n */\n _handle(ev) {\n if (!this._enabled) {\n return;\n }\n ev.preventDefault();\n const eventCoords = new Map();\n let button;\n let pointerType;\n if (isTouchEvent(ev)) {\n button = _PointerButton__WEBPACK_IMPORTED_MODULE_4__.PointerButton.Unknown;\n pointerType = _PointerType__WEBPACK_IMPORTED_MODULE_5__.PointerType.Touch;\n // https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent\n for (let i = 0; i < ev.changedTouches.length; i++) {\n const touch = ev.changedTouches[i];\n const coordinates = _Math_global_coordinates__WEBPACK_IMPORTED_MODULE_6__.GlobalCoordinates.fromPagePosition(touch.pageX, touch.pageY, this.engine);\n const nativePointerId = i + 1;\n const pointerId = this._normalizePointerId(nativePointerId);\n this.currentFramePointerCoords.set(pointerId, coordinates);\n eventCoords.set(pointerId, coordinates);\n }\n }\n else {\n button = this._nativeButtonToPointerButton(ev.button);\n pointerType = _PointerType__WEBPACK_IMPORTED_MODULE_5__.PointerType.Mouse;\n const coordinates = _Math_global_coordinates__WEBPACK_IMPORTED_MODULE_6__.GlobalCoordinates.fromPagePosition(ev.pageX, ev.pageY, this.engine);\n let nativePointerId = 1;\n if (isPointerEvent(ev)) {\n nativePointerId = ev.pointerId;\n pointerType = this._stringToPointerType(ev.pointerType);\n }\n const pointerId = this._normalizePointerId(nativePointerId);\n this.currentFramePointerCoords.set(pointerId, coordinates);\n eventCoords.set(pointerId, coordinates);\n }\n for (const [pointerId, coord] of eventCoords.entries()) {\n switch (ev.type) {\n case 'mousedown':\n case 'pointerdown':\n case 'touchstart':\n this.currentFrameDown.push(new _PointerEvent__WEBPACK_IMPORTED_MODULE_7__.PointerEvent('down', pointerId, button, pointerType, coord, ev));\n this.currentFramePointerDown.set(pointerId, true);\n break;\n case 'mouseup':\n case 'pointerup':\n case 'touchend':\n this.currentFrameUp.push(new _PointerEvent__WEBPACK_IMPORTED_MODULE_7__.PointerEvent('up', pointerId, button, pointerType, coord, ev));\n this.currentFramePointerDown.set(pointerId, false);\n break;\n case 'mousemove':\n case 'pointermove':\n case 'touchmove':\n this.currentFrameMove.push(new _PointerEvent__WEBPACK_IMPORTED_MODULE_7__.PointerEvent('move', pointerId, button, pointerType, coord, ev));\n break;\n case 'touchcancel':\n case 'pointercancel':\n this.currentFrameCancel.push(new _PointerEvent__WEBPACK_IMPORTED_MODULE_7__.PointerEvent('cancel', pointerId, button, pointerType, coord, ev));\n break;\n }\n }\n }\n _handleWheel(ev) {\n if (!this._enabled) {\n return;\n }\n // Should we prevent page scroll because of this event\n if (this.engine.pageScrollPreventionMode === _Engine__WEBPACK_IMPORTED_MODULE_2__.ScrollPreventionMode.All ||\n (this.engine.pageScrollPreventionMode === _Engine__WEBPACK_IMPORTED_MODULE_2__.ScrollPreventionMode.Canvas && ev.target === this.engine.canvas)) {\n ev.preventDefault();\n }\n const screen = this.engine.screen.pageToScreenCoordinates((0,_Math_vector__WEBPACK_IMPORTED_MODULE_8__.vec)(ev.pageX, ev.pageY));\n const world = this.engine.screen.screenToWorldCoordinates(screen);\n /**\n * A constant used to normalize wheel events across different browsers\n *\n * This normalization factor is pulled from\n * https://developer.mozilla.org/en-US/docs/Web/Events/wheel#Listening_to_this_event_across_browser\n */\n const ScrollWheelNormalizationFactor = -1 / 40;\n const deltaX = ev.deltaX || ev.wheelDeltaX * ScrollWheelNormalizationFactor || 0;\n const deltaY = ev.deltaY || ev.wheelDeltaY * ScrollWheelNormalizationFactor || ev.wheelDelta * ScrollWheelNormalizationFactor || ev.detail || 0;\n const deltaZ = ev.deltaZ || 0;\n let deltaMode = _WheelDeltaMode__WEBPACK_IMPORTED_MODULE_9__.WheelDeltaMode.Pixel;\n if (ev.deltaMode) {\n if (ev.deltaMode === 1) {\n deltaMode = _WheelDeltaMode__WEBPACK_IMPORTED_MODULE_9__.WheelDeltaMode.Line;\n }\n else if (ev.deltaMode === 2) {\n deltaMode = _WheelDeltaMode__WEBPACK_IMPORTED_MODULE_9__.WheelDeltaMode.Page;\n }\n }\n const we = new _WheelEvent__WEBPACK_IMPORTED_MODULE_10__.WheelEvent(world.x, world.y, ev.pageX, ev.pageY, screen.x, screen.y, 0, deltaX, deltaY, deltaZ, deltaMode, ev);\n this.currentFrameWheel.push(we);\n }\n /**\n * Triggers an excalibur pointer event in a world space pos\n *\n * Useful for testing pointers in excalibur\n * @param type\n * @param pos\n */\n triggerEvent(type, pos) {\n const page = this.engine.screen.worldToPageCoordinates(pos);\n // Send an event to the event receiver\n if (window.PointerEvent) {\n this._handle(new window.PointerEvent('pointer' + type, {\n pointerId: 0,\n clientX: page.x,\n clientY: page.y\n }));\n }\n else {\n // Safari hack\n this._handle(new window.MouseEvent('mouse' + type, {\n clientX: page.x,\n clientY: page.y\n }));\n }\n // Force update pointer system\n const pointerSystem = this.engine.currentScene.world.get(_PointerSystem__WEBPACK_IMPORTED_MODULE_11__.PointerSystem);\n pointerSystem.preupdate(this.engine.currentScene, 1);\n pointerSystem.update(1);\n }\n _nativeButtonToPointerButton(s) {\n switch (s) {\n case _NativePointerButton__WEBPACK_IMPORTED_MODULE_12__.NativePointerButton.NoButton:\n return _PointerButton__WEBPACK_IMPORTED_MODULE_4__.PointerButton.NoButton;\n case _NativePointerButton__WEBPACK_IMPORTED_MODULE_12__.NativePointerButton.Left:\n return _PointerButton__WEBPACK_IMPORTED_MODULE_4__.PointerButton.Left;\n case _NativePointerButton__WEBPACK_IMPORTED_MODULE_12__.NativePointerButton.Middle:\n return _PointerButton__WEBPACK_IMPORTED_MODULE_4__.PointerButton.Middle;\n case _NativePointerButton__WEBPACK_IMPORTED_MODULE_12__.NativePointerButton.Right:\n return _PointerButton__WEBPACK_IMPORTED_MODULE_4__.PointerButton.Right;\n case _NativePointerButton__WEBPACK_IMPORTED_MODULE_12__.NativePointerButton.Unknown:\n return _PointerButton__WEBPACK_IMPORTED_MODULE_4__.PointerButton.Unknown;\n default:\n return (0,_Util_Util__WEBPACK_IMPORTED_MODULE_13__.fail)(s);\n }\n }\n _stringToPointerType(s) {\n switch (s) {\n case 'touch':\n return _PointerType__WEBPACK_IMPORTED_MODULE_5__.PointerType.Touch;\n case 'mouse':\n return _PointerType__WEBPACK_IMPORTED_MODULE_5__.PointerType.Mouse;\n case 'pen':\n return _PointerType__WEBPACK_IMPORTED_MODULE_5__.PointerType.Pen;\n default:\n return _PointerType__WEBPACK_IMPORTED_MODULE_5__.PointerType.Unknown;\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Input/PointerEventsToObjectDispatcher.ts\":\n/*!**************************************************!*\\\n !*** ./Input/PointerEventsToObjectDispatcher.ts ***!\n \\**************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerEventsToObjectDispatcher: () => (/* binding */ PointerEventsToObjectDispatcher),\n/* harmony export */ PointerTargetObjectProxy: () => (/* binding */ PointerTargetObjectProxy)\n/* harmony export */ });\n/* harmony import */ var _Util_RentalPool__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Util/RentalPool */ \"./Util/RentalPool.ts\");\n\n/**\n *\n */\nfunction hasNestedEvents(object) {\n return object && object._dispatchPointerEvents && object._processPointerToObject;\n}\nclass PointerTargetObjectProxy {\n get events() {\n return this.object.events;\n }\n init(object, contains, active) {\n this.object = object;\n this.contains = contains;\n this.active = active;\n }\n}\nclass PointerEventsToObjectDispatcher {\n constructor() {\n this._proxyPool = new _Util_RentalPool__WEBPACK_IMPORTED_MODULE_0__.RentalPool(() => new PointerTargetObjectProxy(), (p) => p, 100);\n this._objectToProxy = new Map();\n this._proxies = [];\n this._lastFrameObjectToPointers = new Map();\n this._currentFrameObjectToPointers = new Map();\n }\n /**\n * Tracks an object to associate with pointers and their events\n * @param object\n * @param contains\n * @param active\n */\n addObject(object, contains, active) {\n const proxy = this._proxyPool.rent(false);\n proxy.init(object, contains, active);\n this._proxies.push(proxy);\n this._objectToProxy.set(object, proxy);\n }\n _getProxy(object) {\n const proxy = this._objectToProxy.get(object);\n if (proxy) {\n return proxy;\n }\n throw new Error('No PointerTargetProxy for object');\n }\n /**\n * Untracks an object associated with pointers and their events\n * @param object\n */\n removeObject(object) {\n const proxy = this._objectToProxy.get(object);\n if (proxy) {\n const index = this._proxies.indexOf(proxy);\n if (index > -1) {\n this._proxies.splice(index, 1);\n }\n this._proxyPool.return(proxy);\n }\n }\n _objectCurrentlyUnderPointer(object, pointerId) {\n return !!(this._currentFrameObjectToPointers.has(object) && this._currentFrameObjectToPointers.get(object).includes(pointerId));\n }\n _objectWasUnderPointer(object, pointerId) {\n return !!(this._lastFrameObjectToPointers.has(object) && this._lastFrameObjectToPointers.get(object).includes(pointerId));\n }\n _entered(object, pointerId) {\n return this._objectCurrentlyUnderPointer(object, pointerId) && !this._lastFrameObjectToPointers.has(object);\n }\n _left(object, pointerId) {\n return !this._currentFrameObjectToPointers.has(object) && this._objectWasUnderPointer(object, pointerId);\n }\n /**\n * Manually associate a pointer id with an object.\n *\n * This assumes you've checked that the pointer is indeed over the object.\n */\n addPointerToObject(object, pointerId) {\n const maybeProxy = this._objectToProxy.get(object);\n if (maybeProxy) {\n this._addPointerToProxy(maybeProxy, pointerId);\n }\n }\n _addPointerToProxy(object, pointerId) {\n if (!this._currentFrameObjectToPointers.has(object)) {\n this._currentFrameObjectToPointers.set(object, [pointerId]);\n return;\n }\n const pointers = this._currentFrameObjectToPointers.get(object);\n this._currentFrameObjectToPointers.set(object, pointers.concat(pointerId));\n }\n /**\n * Dispatches the appropriate pointer events in sortedObject order on tracked objects\n * @param receiver\n * @param sortedObjects\n */\n dispatchEvents(receiver, sortedObjects) {\n const lastFrameEntities = new Set(this._lastFrameObjectToPointers.keys());\n const currentFrameEntities = new Set(this._currentFrameObjectToPointers.keys());\n // Filter preserves z order\n let lastMovePerPointer;\n let lastUpPerPointer;\n let lastDownPerPointer;\n // Dispatch events in proxy z order\n for (let i = 0; i < sortedObjects.length; i++) {\n const object = sortedObjects[i];\n const proxy = this._getProxy(object);\n if (hasNestedEvents(object)) {\n object._dispatchPointerEvents(receiver);\n }\n if (lastFrameEntities.has(proxy) || currentFrameEntities.has(proxy)) {\n lastDownPerPointer = this._processDownAndEmit(receiver, proxy);\n lastUpPerPointer = this._processUpAndEmit(receiver, proxy);\n lastMovePerPointer = this._processMoveAndEmit(receiver, proxy);\n const lastUpDownMoveEvents = [...lastMovePerPointer.values(), ...lastDownPerPointer.values(), ...lastUpPerPointer.values()];\n this._processEnterLeaveAndEmit(receiver, proxy, lastUpDownMoveEvents);\n this._processCancelAndEmit(receiver, proxy);\n this._processWheelAndEmit(receiver, proxy);\n }\n }\n }\n /**\n * Given the tracked objects, update pointer containment given the provided contains()\n * @param receiver\n * @param objects\n */\n processPointerToObject(receiver, objects) {\n // Pre-process find entities under pointers\n for (let objectIndex = 0; objectIndex < objects.length; objectIndex++) {\n const object = objects[objectIndex];\n const proxy = this._getProxy(object);\n if (hasNestedEvents(object)) {\n object._processPointerToObject(receiver);\n }\n for (const [pointerId, pos] of receiver.currentFramePointerCoords.entries()) {\n if (proxy.contains(pos)) {\n this._addPointerToProxy(proxy, pointerId);\n }\n }\n }\n }\n /**\n * Clear current frames pointer-object associations and track last frame pointer-object associations\n */\n clear() {\n this._lastFrameObjectToPointers.clear();\n this._lastFrameObjectToPointers = new Map(this._currentFrameObjectToPointers);\n this._currentFrameObjectToPointers.clear();\n }\n _processDownAndEmit(receiver, object) {\n const lastDownPerPointer = new Map();\n // Loop through down and dispatch to entities\n for (const event of receiver.currentFrameDown) {\n if (event.active && this._objectCurrentlyUnderPointer(object, event.pointerId)) {\n object.events.emit('pointerdown', event);\n if (receiver.isDragStart(event.pointerId)) {\n object.events.emit('pointerdragstart', event);\n }\n }\n lastDownPerPointer.set(event.pointerId, event);\n }\n return lastDownPerPointer;\n }\n _processUpAndEmit(receiver, object) {\n const lastUpPerPointer = new Map();\n // Loop through up and dispatch to entities\n for (const event of receiver.currentFrameUp) {\n if (event.active && this._objectCurrentlyUnderPointer(object, event.pointerId)) {\n object.events.emit('pointerup', event);\n if (receiver.isDragEnd(event.pointerId)) {\n object.events.emit('pointerdragend', event);\n }\n }\n lastUpPerPointer.set(event.pointerId, event);\n }\n return lastUpPerPointer;\n }\n _processMoveAndEmit(receiver, object) {\n const lastMovePerPointer = new Map();\n // Loop through move and dispatch to entities\n for (const event of receiver.currentFrameMove) {\n if (event.active && object.active() && this._objectCurrentlyUnderPointer(object, event.pointerId)) {\n // move\n object.events.emit('pointermove', event);\n if (receiver.isDragging(event.pointerId)) {\n object.events.emit('pointerdragmove', event);\n }\n }\n lastMovePerPointer.set(event.pointerId, event);\n }\n return lastMovePerPointer;\n }\n _processEnterLeaveAndEmit(receiver, object, lastUpDownMoveEvents) {\n // up, down, and move are considered for enter and leave\n for (const event of lastUpDownMoveEvents) {\n // enter\n if (event.active && object.active() && this._entered(object, event.pointerId)) {\n object.events.emit('pointerenter', event);\n if (receiver.isDragging(event.pointerId)) {\n object.events.emit('pointerdragenter', event);\n }\n break;\n }\n if (event.active &&\n object.active() &&\n // leave can happen on move\n (this._left(object, event.pointerId) ||\n // or leave can happen on pointer up\n (this._objectCurrentlyUnderPointer(object, event.pointerId) && event.type === 'up'))) {\n object.events.emit('pointerleave', event);\n if (receiver.isDragging(event.pointerId)) {\n object.events.emit('pointerdragleave', event);\n }\n break;\n }\n }\n }\n _processCancelAndEmit(receiver, object) {\n // cancel\n for (const event of receiver.currentFrameCancel) {\n if (event.active && object.active() && this._objectCurrentlyUnderPointer(object, event.pointerId)) {\n object.events.emit('pointercancel', event);\n }\n }\n }\n _processWheelAndEmit(receiver, object) {\n // wheel\n for (const event of receiver.currentFrameWheel) {\n // Currently the wheel only fires under the primary pointer '0'\n if (event.active && object.active() && this._objectCurrentlyUnderPointer(object, 0)) {\n object.events.emit('pointerwheel', event);\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Input/PointerScope.ts\":\n/*!*******************************!*\\\n !*** ./Input/PointerScope.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerScope: () => (/* binding */ PointerScope)\n/* harmony export */ });\n/**\n * Determines the scope of handling mouse/touch events.\n */\nvar PointerScope;\n(function (PointerScope) {\n /**\n * Handle events on the `canvas` element only. Events originating outside the\n * `canvas` will not be handled.\n */\n PointerScope[\"Canvas\"] = \"Canvas\";\n /**\n * Handles events on the entire document. All events will be handled by Excalibur.\n */\n PointerScope[\"Document\"] = \"Document\";\n})(PointerScope || (PointerScope = {}));\n\n\n/***/ }),\n\n/***/ \"./Input/PointerSystem.ts\":\n/*!********************************!*\\\n !*** ./Input/PointerSystem.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerSystem: () => (/* binding */ PointerSystem)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Priority.ts\");\n/* harmony import */ var _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Graphics/GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _PointerComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./PointerComponent */ \"./Input/PointerComponent.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Math/coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _Collision_Detection_SparseHashGrid__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Collision/Detection/SparseHashGrid */ \"./Collision/Detection/SparseHashGrid.ts\");\n/* harmony import */ var _PointerEventsToObjectDispatcher__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./PointerEventsToObjectDispatcher */ \"./Input/PointerEventsToObjectDispatcher.ts\");\n\n\n\n\n\n\n/**\n * The PointerSystem is responsible for dispatching pointer events to entities\n * that need them.\n *\n * The PointerSystem can be optionally configured by the {@apilink PointerComponent}, by default Entities use\n * the {@apilink Collider}'s shape for pointer events.\n */\nclass PointerSystem extends _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_0__.System {\n constructor(world) {\n super();\n this.world = world;\n this.systemType = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_0__.SystemType.Update;\n this._graphicsHashGrid = new _Collision_Detection_SparseHashGrid__WEBPACK_IMPORTED_MODULE_1__.SparseHashGrid({ size: 100 });\n this._graphics = [];\n this._entityToPointer = new Map();\n this._pointerEventDispatcher = new _PointerEventsToObjectDispatcher__WEBPACK_IMPORTED_MODULE_2__.PointerEventsToObjectDispatcher();\n /**\n * Optionally override component configuration for all entities\n */\n this.overrideUseColliderShape = false;\n /**\n * Optionally override component configuration for all entities\n */\n this.overrideUseGraphicsBounds = false;\n this._sortedTransforms = [];\n this._sortedEntities = [];\n this._zHasChanged = false;\n this._zIndexUpdate = () => {\n this._zHasChanged = true;\n };\n this.query = this.world.query([_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_3__.TransformComponent, _PointerComponent__WEBPACK_IMPORTED_MODULE_4__.PointerComponent]);\n this.query.entityAdded$.subscribe((e) => {\n const tx = e.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_3__.TransformComponent);\n const pointer = e.get(_PointerComponent__WEBPACK_IMPORTED_MODULE_4__.PointerComponent);\n this._pointerEventDispatcher.addObject(e, (pos) => {\n // If pointer bounds defined\n if (pointer && pointer.localBounds) {\n const pointerBounds = pointer.localBounds.transform(tx.get().matrix);\n return pointerBounds.contains(tx.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_5__.CoordPlane.World ? pos.worldPos : pos.screenPos);\n }\n return false;\n }, () => e.isActive);\n this._entityToPointer.set(e, pointer);\n const maybeGfx = e.get(_Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_6__.GraphicsComponent);\n if (maybeGfx) {\n this._graphics.push(maybeGfx);\n this._graphicsHashGrid.track(maybeGfx);\n }\n this._sortedTransforms.push(tx);\n this._sortedEntities.push(tx.owner);\n tx.zIndexChanged$.subscribe(this._zIndexUpdate);\n this._zHasChanged = true;\n });\n this.query.entityRemoved$.subscribe((e) => {\n this._pointerEventDispatcher.removeObject(e);\n const tx = e.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_3__.TransformComponent);\n this._entityToPointer.delete(e);\n const maybeGfx = e.get(_Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_6__.GraphicsComponent);\n if (maybeGfx) {\n const index = this._graphics.indexOf(maybeGfx);\n if (index > -1) {\n this._graphics.splice(index, 1);\n }\n this._graphicsHashGrid.untrack(maybeGfx);\n }\n tx.zIndexChanged$.unsubscribe(this._zIndexUpdate);\n const index = this._sortedTransforms.indexOf(tx);\n if (index > -1) {\n this._sortedTransforms.splice(index, 1);\n this._sortedEntities.splice(index, 1);\n }\n });\n }\n initialize(world, scene) {\n this._engine = scene.engine;\n this._scene = scene;\n }\n preupdate() {\n if (this._scene.camera.hasChanged()) {\n // if the camera has changed we want to force a transform update so pointers can be correctly calc'd\n this._scene.camera.updateTransform(this._scene.camera.pos);\n }\n // event receiver might change per frame\n this._receivers = [this._engine.input.pointers, this._scene.input.pointers];\n this._engineReceiver = this._engine.input.pointers;\n if (this._zHasChanged) {\n this._sortedTransforms.sort((a, b) => {\n return b.z - a.z;\n });\n this._sortedEntities = this._sortedTransforms.map((t) => t.owner);\n this._zHasChanged = false;\n }\n }\n update() {\n // Update graphics\n this._graphicsHashGrid.update(this._graphics);\n // Locate all the pointer/entity mappings\n for (const [pointerId, pos] of this._engineReceiver.currentFramePointerCoords.entries()) {\n const colliders = this._scene.physics.query(pos.worldPos);\n for (let i = 0; i < colliders.length; i++) {\n const collider = colliders[i];\n const maybePointer = this._entityToPointer.get(collider.owner);\n if (maybePointer && (maybePointer.useColliderShape || this.overrideUseColliderShape)) {\n this._pointerEventDispatcher.addPointerToObject(collider.owner, pointerId);\n }\n }\n const graphics = this._graphicsHashGrid.query(pos.worldPos);\n for (let i = 0; i < graphics.length; i++) {\n const graphic = graphics[i];\n const maybePointer = this._entityToPointer.get(graphic.owner);\n if (maybePointer && (maybePointer.useGraphicsBounds || this.overrideUseGraphicsBounds)) {\n this._pointerEventDispatcher.addPointerToObject(graphic.owner, pointerId);\n }\n }\n }\n this._pointerEventDispatcher.processPointerToObject(this._engineReceiver, this._sortedEntities);\n // Dispatch pointer events on entities\n this._pointerEventDispatcher.dispatchEvents(this._engineReceiver, this._sortedEntities);\n // Dispatch pointer events on top level pointers\n this._receivers.forEach((r) => r.update());\n // Clear last frame's events\n this._pointerEventDispatcher.clear();\n this._receivers.forEach((r) => r.clear());\n }\n}\nPointerSystem.priority = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_7__.SystemPriority.Higher;\n\n\n/***/ }),\n\n/***/ \"./Input/PointerType.ts\":\n/*!******************************!*\\\n !*** ./Input/PointerType.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerType: () => (/* binding */ PointerType)\n/* harmony export */ });\n/**\n * The type of pointer for a {@apilink PointerEvent}.\n */\nvar PointerType;\n(function (PointerType) {\n PointerType[\"Touch\"] = \"Touch\";\n PointerType[\"Mouse\"] = \"Mouse\";\n PointerType[\"Pen\"] = \"Pen\";\n PointerType[\"Unknown\"] = \"Unknown\";\n})(PointerType || (PointerType = {}));\n\n\n/***/ }),\n\n/***/ \"./Input/WheelDeltaMode.ts\":\n/*!*********************************!*\\\n !*** ./Input/WheelDeltaMode.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ WheelDeltaMode: () => (/* binding */ WheelDeltaMode)\n/* harmony export */ });\nvar WheelDeltaMode;\n(function (WheelDeltaMode) {\n WheelDeltaMode[\"Pixel\"] = \"Pixel\";\n WheelDeltaMode[\"Line\"] = \"Line\";\n WheelDeltaMode[\"Page\"] = \"Page\";\n})(WheelDeltaMode || (WheelDeltaMode = {}));\n\n\n/***/ }),\n\n/***/ \"./Input/WheelEvent.ts\":\n/*!*****************************!*\\\n !*** ./Input/WheelEvent.ts ***!\n \\*****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ WheelEvent: () => (/* binding */ WheelEvent)\n/* harmony export */ });\nclass WheelEvent {\n cancel() {\n this.active = false;\n }\n constructor(x, y, pageX, pageY, screenX, screenY, index, deltaX, deltaY, deltaZ, deltaMode, ev) {\n this.x = x;\n this.y = y;\n this.pageX = pageX;\n this.pageY = pageY;\n this.screenX = screenX;\n this.screenY = screenY;\n this.index = index;\n this.deltaX = deltaX;\n this.deltaY = deltaY;\n this.deltaZ = deltaZ;\n this.deltaMode = deltaMode;\n this.ev = ev;\n this.active = true;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Interfaces/AudioImplementation.ts\":\n/*!*******************************************!*\\\n !*** ./Interfaces/AudioImplementation.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ExResponse: () => (/* binding */ ExResponse)\n/* harmony export */ });\nclass ExResponse {\n}\nExResponse.type = {\n any: '',\n blob: 'blob',\n json: 'json',\n text: 'text',\n document: 'document',\n arraybuffer: 'arraybuffer'\n};\n\n\n/***/ }),\n\n/***/ \"./Interfaces/Index.ts\":\n/*!*****************************!*\\\n !*** ./Interfaces/Index.ts ***!\n \\*****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ExResponse: () => (/* reexport safe */ _AudioImplementation__WEBPACK_IMPORTED_MODULE_0__.ExResponse),\n/* harmony export */ hasOnAdd: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.hasOnAdd),\n/* harmony export */ hasOnInitialize: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.hasOnInitialize),\n/* harmony export */ hasOnPostUpdate: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.hasOnPostUpdate),\n/* harmony export */ hasOnPreUpdate: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.hasOnPreUpdate),\n/* harmony export */ hasOnRemove: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.hasOnRemove),\n/* harmony export */ hasPostDraw: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.hasPostDraw),\n/* harmony export */ hasPreDraw: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.hasPreDraw),\n/* harmony export */ has_add: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.has_add),\n/* harmony export */ has_initialize: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.has_initialize),\n/* harmony export */ has_postupdate: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.has_postupdate),\n/* harmony export */ has_preupdate: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.has_preupdate),\n/* harmony export */ has_remove: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.has_remove)\n/* harmony export */ });\n/* harmony import */ var _AudioImplementation__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AudioImplementation */ \"./Interfaces/AudioImplementation.ts\");\n/* harmony import */ var _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./LifecycleEvents */ \"./Interfaces/LifecycleEvents.ts\");\n\n\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Interfaces/LifecycleEvents.ts\":\n/*!***************************************!*\\\n !*** ./Interfaces/LifecycleEvents.ts ***!\n \\***************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ hasOnAdd: () => (/* binding */ hasOnAdd),\n/* harmony export */ hasOnInitialize: () => (/* binding */ hasOnInitialize),\n/* harmony export */ hasOnPostUpdate: () => (/* binding */ hasOnPostUpdate),\n/* harmony export */ hasOnPreUpdate: () => (/* binding */ hasOnPreUpdate),\n/* harmony export */ hasOnRemove: () => (/* binding */ hasOnRemove),\n/* harmony export */ hasPostDraw: () => (/* binding */ hasPostDraw),\n/* harmony export */ hasPreDraw: () => (/* binding */ hasPreDraw),\n/* harmony export */ has_add: () => (/* binding */ has_add),\n/* harmony export */ has_initialize: () => (/* binding */ has_initialize),\n/* harmony export */ has_postupdate: () => (/* binding */ has_postupdate),\n/* harmony export */ has_preupdate: () => (/* binding */ has_preupdate),\n/* harmony export */ has_remove: () => (/* binding */ has_remove)\n/* harmony export */ });\n/**\n * Type guard checking for internal initialize method\n * @internal\n * @param a\n */\nfunction has_initialize(a) {\n return !!a._initialize;\n}\n/**\n *\n */\nfunction has_add(a) {\n return !!a.onAdd;\n}\n/**\n *\n */\nfunction has_remove(a) {\n return !!a.onRemove;\n}\n/**\n *\n */\nfunction hasOnInitialize(a) {\n return !!a.onInitialize;\n}\n/**\n *\n */\nfunction has_preupdate(a) {\n return !!a._preupdate;\n}\n/**\n *\n */\nfunction hasOnPreUpdate(a) {\n return !!a.onPreUpdate;\n}\n/**\n *\n */\nfunction has_postupdate(a) {\n return !!a.onPostUpdate;\n}\n/**\n *\n */\nfunction hasOnPostUpdate(a) {\n return !!a.onPostUpdate;\n}\n/**\n *\n */\nfunction hasOnAdd(a) {\n return !!a.onAdd;\n}\n/**\n *\n */\nfunction hasOnRemove(a) {\n return !!a.onRemove;\n}\n/**\n *\n */\nfunction hasPreDraw(a) {\n return !!a.onPreDraw;\n}\n/**\n *\n */\nfunction hasPostDraw(a) {\n return !!a.onPostDraw;\n}\n\n\n/***/ }),\n\n/***/ \"./Label.ts\":\n/*!******************!*\\\n !*** ./Label.ts ***!\n \\******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Label: () => (/* binding */ Label)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Graphics_Text__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Graphics/Text */ \"./Graphics/Text.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Graphics */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Graphics_Font__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Graphics/Font */ \"./Graphics/Font.ts\");\n/* harmony import */ var _Actor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Actor */ \"./Actor.ts\");\n\n\n\n\n\n/**\n * Labels are the way to draw small amounts of text to the screen. They are\n * actors and inherit all of the benefits and capabilities.\n */\nclass Label extends _Actor__WEBPACK_IMPORTED_MODULE_0__.Actor {\n set maxWidth(width) {\n this._text.maxWidth = width;\n }\n get maxWidth() {\n return this._text.maxWidth;\n }\n get font() {\n return this._font;\n }\n set font(newFont) {\n this._font = newFont;\n this._text.font = newFont;\n }\n /**\n * The text to draw.\n */\n get text() {\n return this._text.text;\n }\n set text(text) {\n this._text.text = text;\n }\n get color() {\n return this._text.color;\n }\n set color(color) {\n if (this._text) {\n this._text.color = color;\n }\n }\n get opacity() {\n return this.graphics.opacity;\n }\n set opacity(opacity) {\n this.graphics.opacity = opacity;\n }\n /**\n * The {@apilink SpriteFont} to use, if any. Overrides {@apilink Font | `font`} if present.\n */\n get spriteFont() {\n return this._spriteFont;\n }\n set spriteFont(sf) {\n if (sf) {\n this._spriteFont = sf;\n this._text.font = this._spriteFont;\n }\n }\n /**\n * Build a new label\n * @param options\n */\n constructor(options) {\n super(options);\n this._font = new _Graphics_Font__WEBPACK_IMPORTED_MODULE_1__.Font();\n this._text = new _Graphics_Text__WEBPACK_IMPORTED_MODULE_2__.Text({ text: '', font: this._font });\n const { text, pos, x, y, spriteFont, font, color, maxWidth } = { text: '', ...options };\n this.pos = pos !== null && pos !== void 0 ? pos : (x && y ? (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(x, y) : this.pos);\n this.text = text !== null && text !== void 0 ? text : this.text;\n this.font = font !== null && font !== void 0 ? font : this.font;\n this.maxWidth = maxWidth !== null && maxWidth !== void 0 ? maxWidth : this.maxWidth;\n this.spriteFont = spriteFont !== null && spriteFont !== void 0 ? spriteFont : this.spriteFont;\n this._text.color = color !== null && color !== void 0 ? color : this.color;\n const gfx = this.get(_Graphics__WEBPACK_IMPORTED_MODULE_4__.GraphicsComponent);\n gfx.anchor = _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero;\n gfx.use(this._text);\n }\n _initialize(engine) {\n super._initialize(engine);\n }\n /**\n * Returns the width of the text in the label (in pixels);\n */\n getTextWidth() {\n return this._text.width;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/Random.ts\":\n/*!************************!*\\\n !*** ./Math/Random.ts ***!\n \\************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Random: () => (/* binding */ Random)\n/* harmony export */ });\n/**\n * @module\n * Pseudo-Random Utility\n *\n * A pseudo-random utility to add seeded random support for help in\n * generating things like terrain or reproducible randomness. Uses the\n * [Mersenne Twister](https://en.wikipedia.org/wiki/Mersenne_Twister) algorithm.\n */\n/**\n * 32-bit mask\n */\nconst BITMASK32 = 0xffffffff;\n/**\n * Pseudo-random number generator following the Mersenne_Twister algorithm. Given a seed this generator will produce the same sequence\n * of numbers each time it is called.\n * See https://en.wikipedia.org/wiki/Mersenne_Twister for more details.\n * Uses the MT19937-32 (2002) implementation documented here http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/emt19937ar.html\n *\n * Api inspired by http://chancejs.com/# https://github.com/chancejs/chancejs\n */\nclass Random {\n /**\n * If no seed is specified, the Date.now() is used\n */\n constructor(seed) {\n this.seed = seed;\n // Separation point of one one word, the number of bits in the lower bitmask 0 <= r <= w-1\n this._lowerMask = 0x7fffffff; // 31 bits same as _r\n this._upperMask = 0x80000000; // 34 high bits\n // Word size, 64 bits\n this._w = 32;\n // Degree of recurrence\n this._n = 624;\n // Middle word, an offset used in the recurrence defining the series x, 1<=m>> 0;\n for (let i = 1; i < this._n; i++) {\n const s = this._mt[i - 1] ^ (this._mt[i - 1] >>> (this._w - 2));\n // numbers are bigger than the JS max safe int, add in 16-bit chunks to prevent IEEE rounding errors on high bits\n this._mt[i] = (((this._f * ((s & 0xffff0000) >>> 16)) << 16) + this._f * (s & 0xffff) + i) >>> 0;\n }\n this._index = this._n;\n }\n /**\n * Apply the twist\n */\n _twist() {\n const mag01 = [0x0, this._a];\n let y = 0, i = 0;\n for (; i < this._n - this._m; i++) {\n y = (this._mt[i] & this._upperMask) | (this._mt[i + 1] & this._lowerMask);\n this._mt[i] = this._mt[i + this._m] ^ (y >>> 1) ^ (mag01[y & 0x1] & BITMASK32);\n }\n for (; i < this._n - 1; i++) {\n y = (this._mt[i] & this._upperMask) | (this._mt[i + 1] & this._lowerMask);\n this._mt[i] = this._mt[i + (this._m - this._n)] ^ (y >>> 1) ^ (mag01[y & 0x1] & BITMASK32);\n }\n y = (this._mt[this._n - 1] & this._upperMask) | (this._mt[0] & this._lowerMask);\n this._mt[this._n - 1] = this._mt[this._m - 1] ^ (y >>> 1) ^ (mag01[y & 0x1] & BITMASK32);\n this._index = 0;\n }\n /**\n * Return next 32 bit integer number in sequence\n */\n nextInt() {\n if (this._index >= this._n) {\n this._twist();\n }\n let y = this._mt[this._index++];\n y ^= y >>> this._u;\n y ^= (y << this._s) & this._b;\n y ^= (y << this._t) & this._c;\n y ^= y >>> this._l;\n return y >>> 0;\n }\n /**\n * Return a random floating point number between [0, 1)\n */\n next() {\n return this.nextInt() * (1.0 / 4294967296.0); // divided by 2^32\n }\n /**\n * Return a random floating point in range [min, max) min is included, max is not included\n */\n floating(min, max) {\n return (max - min) * this.next() + min;\n }\n /**\n * Return a random integer in range [min, max] min is included, max is included.\n * Implemented with rejection sampling, see https://medium.com/@betable/tifu-by-using-math-random-f1c308c4fd9d#.i13tdiu5a\n */\n integer(min, max) {\n return Math.floor((max - min + 1) * this.next() + min);\n }\n /**\n * Returns true or false randomly with 50/50 odds by default.\n * By default the likelihood of returning a true is .5 (50%).\n * @param likelihood takes values between [0, 1]\n */\n bool(likelihood = 0.5) {\n return this.next() <= likelihood;\n }\n /**\n * Returns one element from an array at random\n */\n pickOne(array) {\n return array[this.integer(0, array.length - 1)];\n }\n /**\n * Returns a new array random picking elements from the original\n * @param array Original array to pick from\n * @param numPicks can be any positive number\n * @param allowDuplicates indicates whether the returned set is allowed duplicates (it does not mean there will always be duplicates\n * just that it is possible)\n */\n pickSet(array, numPicks, allowDuplicates = false) {\n if (allowDuplicates) {\n return this._pickSetWithDuplicates(array, numPicks);\n }\n else {\n return this._pickSetWithoutDuplicates(array, numPicks);\n }\n }\n /**\n * Returns a new array randomly picking elements in the original (not reused)\n * @param array Array to pick elements out of\n * @param numPicks must be less than or equal to the number of elements in the array.\n */\n _pickSetWithoutDuplicates(array, numPicks) {\n if (numPicks > array.length || numPicks < 0) {\n throw new Error('Invalid number of elements to pick, must pick a value 0 < n <= length');\n }\n if (numPicks === array.length) {\n return array;\n }\n const result = new Array(numPicks);\n let currentPick = 0;\n const tempArray = array.slice(0);\n while (currentPick < numPicks) {\n const index = this.integer(0, tempArray.length - 1);\n result[currentPick++] = tempArray[index];\n tempArray.splice(index, 1);\n }\n return result;\n }\n /**\n * Returns a new array random picking elements from the original allowing duplicates\n * @param array Array to pick elements out of\n * @param numPicks can be any positive number\n */\n _pickSetWithDuplicates(array, numPicks) {\n // Typescript numbers are all floating point, so do we add check for int? (or floor the input?)\n if (numPicks < 0) {\n throw new Error('Invalid number of elements to pick, must pick a value 0 <= n < MAX_INT');\n }\n const result = new Array(numPicks);\n for (let i = 0; i < numPicks; i++) {\n result[i] = this.pickOne(array);\n }\n return result;\n }\n /**\n * Returns a new array that has its elements shuffled. Using the Fisher/Yates method\n * https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle\n */\n shuffle(array) {\n const tempArray = array.slice(0);\n let swap;\n for (let i = 0; i < tempArray.length - 2; i++) {\n const randomIndex = this.integer(i, tempArray.length - 1);\n swap = tempArray[i];\n tempArray[i] = tempArray[randomIndex];\n tempArray[randomIndex] = swap;\n }\n return tempArray;\n }\n /**\n * Generate a list of random integer numbers\n * @param length the length of the final array\n * @param min the minimum integer number to generate inclusive\n * @param max the maximum integer number to generate inclusive\n */\n range(length, min, max) {\n const result = new Array(length);\n for (let i = 0; i < length; i++) {\n result[i] = this.integer(min, max);\n }\n return result;\n }\n /**\n * Returns the result of a d4 dice roll\n */\n d4() {\n return this.integer(1, 4);\n }\n /**\n * Returns the result of a d6 dice roll\n */\n d6() {\n return this.integer(1, 6);\n }\n /**\n * Returns the result of a d8 dice roll\n */\n d8() {\n return this.integer(1, 8);\n }\n /**\n * Returns the result of a d10 dice roll\n */\n d10() {\n return this.integer(1, 10);\n }\n /**\n * Returns the result of a d12 dice roll\n */\n d12() {\n return this.integer(1, 12);\n }\n /**\n * Returns the result of a d20 dice roll\n */\n d20() {\n return this.integer(1, 20);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/affine-matrix.ts\":\n/*!*******************************!*\\\n !*** ./Math/affine-matrix.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AffineMatrix: () => (/* binding */ AffineMatrix)\n/* harmony export */ });\n/* harmony import */ var _matrix__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./matrix */ \"./Math/matrix.ts\");\n/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./util */ \"./Math/util.ts\");\n/* harmony import */ var _vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vector */ \"./Math/vector.ts\");\n\n\n\nclass AffineMatrix {\n constructor() {\n /**\n * | | | |\n * | ------- | ------- | -------- |\n * | data[0] | data[2] | data[4] |\n * | data[1] | data[3] | data[5] |\n * | 0 | 0 | 1 |\n */\n this.data = new Float64Array(6);\n this._scale = new Float64Array([1, 1]);\n this._scaleSignX = 1;\n this._scaleSignY = 1;\n }\n /**\n * Converts the current matrix into a DOMMatrix\n *\n * This is useful when working with the browser Canvas context\n * @returns {DOMMatrix} DOMMatrix\n */\n toDOMMatrix() {\n return new DOMMatrix([...this.data]);\n }\n static identity() {\n const mat = new AffineMatrix();\n mat.data[0] = 1;\n mat.data[1] = 0;\n mat.data[2] = 0;\n mat.data[3] = 1;\n mat.data[4] = 0;\n mat.data[5] = 0;\n return mat;\n }\n /**\n * Creates a brand new translation matrix at the specified 3d point\n * @param x\n * @param y\n */\n static translation(x, y) {\n const mat = AffineMatrix.identity();\n mat.data[4] = x;\n mat.data[5] = y;\n return mat;\n }\n /**\n * Creates a brand new scaling matrix with the specified scaling factor\n * @param sx\n * @param sy\n */\n static scale(sx, sy) {\n const mat = AffineMatrix.identity();\n mat.data[0] = sx;\n mat.data[3] = sy;\n mat._scale[0] = sx;\n mat._scale[1] = sy;\n return mat;\n }\n /**\n * Creates a brand new rotation matrix with the specified angle in radians\n * @param angle\n */\n static rotation(angle) {\n const mat = AffineMatrix.identity();\n mat.data[0] = Math.cos(angle);\n mat.data[1] = Math.sin(angle);\n mat.data[2] = -Math.sin(angle);\n mat.data[3] = Math.cos(angle);\n return mat;\n }\n setPosition(x, y) {\n this.data[4] = x;\n this.data[5] = y;\n }\n getPosition() {\n return (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.data[4], this.data[5]);\n }\n /**\n * Applies rotation to the current matrix mutating it\n * @param angle in Radians\n */\n rotate(angle) {\n const a11 = this.data[0];\n const a21 = this.data[1];\n const a12 = this.data[2];\n const a22 = this.data[3];\n const sine = Math.sin(angle);\n const cosine = Math.cos(angle);\n this.data[0] = cosine * a11 + sine * a12;\n this.data[1] = cosine * a21 + sine * a22;\n this.data[2] = cosine * a12 - sine * a11;\n this.data[3] = cosine * a22 - sine * a21;\n return this;\n }\n /**\n * Applies translation to the current matrix mutating it\n * @param x\n * @param y\n */\n translate(x, y) {\n const a11 = this.data[0];\n const a21 = this.data[1];\n // const a31 = 0;\n const a12 = this.data[2];\n const a22 = this.data[3];\n // const a32 = 0;\n const a13 = this.data[4];\n const a23 = this.data[5];\n // const a33 = 1;\n // Doesn't change z\n this.data[4] = a11 * x + a12 * y + a13;\n this.data[5] = a21 * x + a22 * y + a23;\n return this;\n }\n /**\n * Applies scaling to the current matrix mutating it\n * @param x\n * @param y\n */\n scale(x, y) {\n const a11 = this.data[0];\n const a21 = this.data[1];\n const a12 = this.data[2];\n const a22 = this.data[3];\n this.data[0] = a11 * x;\n this.data[1] = a21 * x;\n this.data[2] = a12 * y;\n this.data[3] = a22 * y;\n this._scale[0] = x;\n this._scale[1] = y;\n this._scaleSignX = (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(x);\n this._scaleSignY = (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(y);\n return this;\n }\n determinant() {\n return this.data[0] * this.data[3] - this.data[1] * this.data[2];\n }\n /**\n * Return the affine inverse, optionally store it in a target matrix.\n *\n * It's recommended you call .reset() the target unless you know what you're doing\n * @param target\n */\n inverse(target) {\n // See http://negativeprobability.blogspot.com/2011/11/affine-transformations-and-their.html\n // See https://www.mathsisfun.com/algebra/matrix-inverse.html\n // Since we are actually only doing 2D transformations we can use this hack\n // We don't actually use the 3rd or 4th dimension\n const det = this.determinant();\n let inverseDet = det; // default to a zero matrix if we have a singular matrix\n if (det !== 0) {\n inverseDet = 1 / det;\n }\n const a = this.data[0];\n const b = this.data[2];\n const c = this.data[1];\n const d = this.data[3];\n const m = target || AffineMatrix.identity();\n // inverts rotation and scale\n m.data[0] = d * inverseDet;\n m.data[1] = -c * inverseDet;\n m.data[2] = -b * inverseDet;\n m.data[3] = a * inverseDet;\n const tx = this.data[4];\n const ty = this.data[5];\n // invert translation\n // transform translation into the matrix basis created by rot/scale\n m.data[4] = -(tx * m.data[0] + ty * m.data[2]);\n m.data[5] = -(tx * m.data[1] + ty * m.data[3]);\n return m;\n }\n multiply(vectorOrMatrix, dest) {\n if (vectorOrMatrix instanceof _vector__WEBPACK_IMPORTED_MODULE_0__.Vector) {\n const result = dest || new _vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\n const vector = vectorOrMatrix;\n // these shenanigans are to allow dest and vector to be the same instance\n const resultX = vector.x * this.data[0] + vector.y * this.data[2] + this.data[4];\n const resultY = vector.x * this.data[1] + vector.y * this.data[3] + this.data[5];\n result.x = resultX;\n result.y = resultY;\n return result;\n }\n else {\n const result = dest || new AffineMatrix();\n const other = vectorOrMatrix;\n const a11 = this.data[0];\n const a21 = this.data[1];\n // const a31 = 0;\n const a12 = this.data[2];\n const a22 = this.data[3];\n // const a32 = 0;\n const a13 = this.data[4];\n const a23 = this.data[5];\n // const a33 = 1;\n const b11 = other.data[0];\n const b21 = other.data[1];\n // const b31 = 0;\n const b12 = other.data[2];\n const b22 = other.data[3];\n // const b32 = 0;\n const b13 = other.data[4];\n const b23 = other.data[5];\n // const b33 = 1;\n result.data[0] = a11 * b11 + a12 * b21; // + a13 * b31; // zero\n result.data[1] = a21 * b11 + a22 * b21; // + a23 * b31; // zero\n result.data[2] = a11 * b12 + a12 * b22; // + a13 * b32; // zero\n result.data[3] = a21 * b12 + a22 * b22; // + a23 * b32; // zero\n result.data[4] = a11 * b13 + a12 * b23 + a13; // * b33; // one\n result.data[5] = a21 * b13 + a22 * b23 + a23; // * b33; // one\n const signX = this._scaleSignX;\n const signY = this._scaleSignY;\n result._scaleSignX = signX * (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(result._scaleSignX);\n result._scaleSignY = signY * (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(result._scaleSignY);\n return result;\n }\n }\n /**\n * Packed array of length 8, that contains 4 vertices, with 2 components each\n * So: [x0, y0, x1, y1, x2, y2, x3, y3]\n * @param quad\n */\n multiplyQuadInPlace(quad) {\n const resultTopLeftX = quad[0] * this.data[0] + quad[1] * this.data[2] + this.data[4];\n const resultTopLeftY = quad[0] * this.data[1] + quad[1] * this.data[3] + this.data[5];\n quad[0] = resultTopLeftX;\n quad[1] = resultTopLeftY;\n const resultTopRightX = quad[2] * this.data[0] + quad[3] * this.data[2] + this.data[4];\n const resultTopRightY = quad[2] * this.data[1] + quad[3] * this.data[3] + this.data[5];\n quad[2] = resultTopRightX;\n quad[3] = resultTopRightY;\n const resultBottomLeftX = quad[4] * this.data[0] + quad[5] * this.data[2] + this.data[4];\n const resultBottomLeftY = quad[4] * this.data[1] + quad[5] * this.data[3] + this.data[5];\n quad[4] = resultBottomLeftX;\n quad[5] = resultBottomLeftY;\n const resultBottomRightX = quad[6] * this.data[0] + quad[7] * this.data[2] + this.data[4];\n const resultBottomRightY = quad[6] * this.data[1] + quad[7] * this.data[3] + this.data[5];\n quad[6] = resultBottomRightX;\n quad[7] = resultBottomRightY;\n }\n to4x4() {\n const mat = new _matrix__WEBPACK_IMPORTED_MODULE_2__.Matrix();\n mat.data[0] = this.data[0];\n mat.data[1] = this.data[1];\n mat.data[2] = 0;\n mat.data[3] = 0;\n mat.data[4] = this.data[2];\n mat.data[5] = this.data[3];\n mat.data[6] = 0;\n mat.data[7] = 0;\n mat.data[8] = 0;\n mat.data[9] = 0;\n mat.data[10] = 1;\n mat.data[11] = 0;\n mat.data[12] = this.data[4];\n mat.data[13] = this.data[5];\n mat.data[14] = 0;\n mat.data[15] = 1;\n return mat;\n }\n setRotation(angle) {\n const currentScale = this.getScale();\n const sine = Math.sin(angle);\n const cosine = Math.cos(angle);\n this.data[0] = cosine * currentScale.x;\n this.data[1] = sine * currentScale.y;\n this.data[2] = -sine * currentScale.x;\n this.data[3] = cosine * currentScale.y;\n }\n getRotation() {\n const angle = Math.atan2(this.data[1] / this.getScaleY(), this.data[0] / this.getScaleX());\n return (0,_util__WEBPACK_IMPORTED_MODULE_1__.canonicalizeAngle)(angle);\n }\n getScaleX() {\n // absolute scale of the matrix (we lose sign so need to add it back)\n const xScaleSq = this.data[0] * this.data[0] + this.data[2] * this.data[2];\n if (xScaleSq === 1.0) {\n // usually there isn't scale so we can avoid a sqrt\n return this._scaleSignX;\n }\n return this._scaleSignX * Math.sqrt(xScaleSq);\n }\n getScaleY() {\n // absolute scale of the matrix (we lose sign so need to add it back)\n const yScaleSq = this.data[1] * this.data[1] + this.data[3] * this.data[3];\n if (yScaleSq === 1.0) {\n // usually there isn't scale so we can avoid a sqrt\n return this._scaleSignY;\n }\n return this._scaleSignY * Math.sqrt(yScaleSq);\n }\n /**\n * Get the scale of the matrix\n */\n getScale() {\n return (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.getScaleX(), this.getScaleY());\n }\n setScaleX(val) {\n if (val === this._scale[0]) {\n return;\n }\n this._scaleSignX = (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(val);\n // negative scale acts like a 180 rotation, so flip\n const xscale = (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.data[0] * this._scaleSignX, this.data[2] * this._scaleSignX).normalize();\n this.data[0] = xscale.x * val;\n this.data[2] = xscale.y * val;\n this._scale[0] = val;\n }\n setScaleY(val) {\n if (val === this._scale[1]) {\n return;\n }\n this._scaleSignY = (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(val);\n // negative scale acts like a 180 rotation, so flip\n const yscale = (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.data[1] * this._scaleSignY, this.data[3] * this._scaleSignY).normalize();\n this.data[1] = yscale.x * val;\n this.data[3] = yscale.y * val;\n this._scale[1] = val;\n }\n setScale(scale) {\n this.setScaleX(scale.x);\n this.setScaleY(scale.y);\n }\n isIdentity() {\n return this.data[0] === 1 && this.data[1] === 0 && this.data[2] === 0 && this.data[3] === 1 && this.data[4] === 0 && this.data[5] === 0;\n }\n /**\n * Resets the current matrix to the identity matrix, mutating it\n * @returns {AffineMatrix} Current matrix as identity\n */\n reset() {\n const mat = this;\n mat.data[0] = 1;\n mat.data[1] = 0;\n mat.data[2] = 0;\n mat.data[3] = 1;\n mat.data[4] = 0;\n mat.data[5] = 0;\n return mat;\n }\n /**\n * Creates a new Matrix with the same data as the current {@apilink AffineMatrix}\n */\n clone(dest) {\n const mat = dest || new AffineMatrix();\n mat.data[0] = this.data[0];\n mat.data[1] = this.data[1];\n mat.data[2] = this.data[2];\n mat.data[3] = this.data[3];\n mat.data[4] = this.data[4];\n mat.data[5] = this.data[5];\n mat._scaleSignX = this._scaleSignX;\n mat._scaleSignY = this._scaleSignY;\n return mat;\n }\n toString() {\n return `\r\n[${this.data[0]} ${this.data[2]} ${this.data[4]}]\r\n[${this.data[1]} ${this.data[3]} ${this.data[5]}]\r\n[0 0 1]\r\n`;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/bezier-curve.ts\":\n/*!******************************!*\\\n !*** ./Math/bezier-curve.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BezierCurve: () => (/* binding */ BezierCurve)\n/* harmony export */ });\n/* harmony import */ var _lerp__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./lerp */ \"./Math/lerp.ts\");\n\n/**\n * BezierCurve that supports cubic Bezier curves.\n */\nclass BezierCurve {\n constructor(options) {\n var _a;\n // Thanks Freya! https://www.youtube.com/watch?v=aVwxzDHniEw\n this._distLookup = [];\n this.quality = 4;\n if (options.controlPoints.length !== 4) {\n throw new Error('Only cubic bezier curves are supported');\n }\n this._controlPoints = [...options.controlPoints];\n this.quality = (_a = options.quality) !== null && _a !== void 0 ? _a : this.quality;\n this._calculateLookup();\n }\n get arcLength() {\n return this._arcLength;\n }\n get controlPoints() {\n return this._controlPoints;\n }\n set controlPoints(points) {\n this._controlPoints = [...points];\n this._calculateLookup();\n }\n setControlPoint(index, point) {\n this._controlPoints[index] = point;\n this._calculateLookup();\n }\n _calculateLookup() {\n let totalLength = 0;\n this._distLookup.length = 0;\n let prev = this.controlPoints[0];\n const n = this.controlPoints.length * this.quality;\n for (let i = 0; i < n; i++) {\n const t = i / (n - 1);\n const pt = this.getPoint(t);\n const diff = prev.distance(pt);\n totalLength += diff;\n this._distLookup.push(totalLength);\n prev = pt;\n }\n this._arcLength = totalLength;\n }\n _getTimeGivenDistance(distance) {\n const n = this._distLookup.length;\n const arcLength = this.arcLength;\n if (distance >= 0 && distance < arcLength) {\n for (let i = 0; i < n - 1; i++) {\n if (this._distLookup[i] <= distance && distance < this._distLookup[i + 1]) {\n return (0,_lerp__WEBPACK_IMPORTED_MODULE_0__.remap)(this._distLookup[i], this._distLookup[i + 1], i / (n - 1), (i + 1) / (n - 1), distance);\n }\n }\n }\n return distance / arcLength;\n }\n /**\n * Get the point on the Bezier curve at a certain time\n * @param time Between 0-1\n */\n getPoint(time) {\n const points = [...this.controlPoints];\n for (let r = 1; r < points.length; r++) {\n for (let i = 0; i < points.length - r; i++) {\n points[i] = (0,_lerp__WEBPACK_IMPORTED_MODULE_0__.lerpVector)(points[i], points[i + 1], time);\n }\n }\n return points[0];\n }\n /**\n * Get the tangent of the Bezier curve at a certain time\n * @param time Between 0-1\n */\n getTangent(time) {\n const timeSquared = time * time;\n const p0 = this.controlPoints[0];\n const p1 = this.controlPoints[1];\n const p2 = this.controlPoints[2];\n const p3 = this.controlPoints[3];\n // Derivative of Bernstein polynomial\n const pPrime = p0\n .scale(-3 * timeSquared + 6 * time - 3)\n .add(p1.scale(9 * timeSquared - 12 * time + 3).add(p2.scale(-9 * timeSquared + 6 * time).add(p3.scale(3 * timeSquared))));\n return pPrime.normalize();\n }\n /**\n * Get the tangent of the Bezier curve where the distance is uniformly distributed over time\n * @param time\n */\n getUniformTangent(time) {\n const desiredDistance = time * this.arcLength;\n const uniformTime = this._getTimeGivenDistance(desiredDistance);\n return this.getTangent(uniformTime);\n }\n /**\n * Get the normal of the Bezier curve at a certain time\n * @param time Between 0-1\n */\n getNormal(time) {\n return this.getTangent(time).normal();\n }\n /**\n * Get the normal of the Bezier curve where the distance is uniformly distributed over time\n * @param time\n */\n getUniformNormal(time) {\n return this.getUniformTangent(time).normal();\n }\n /**\n * Points are spaced uniformly across the length of the curve over time\n * @param time\n */\n getUniformPoint(time) {\n const desiredDistance = time * this.arcLength;\n const uniformTime = this._getTimeGivenDistance(desiredDistance);\n return this.getPoint(uniformTime);\n }\n clone() {\n return new BezierCurve({\n controlPoints: [...this.controlPoints],\n quality: this.quality\n });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/coord-plane.ts\":\n/*!*****************************!*\\\n !*** ./Math/coord-plane.ts ***!\n \\*****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CoordPlane: () => (/* binding */ CoordPlane)\n/* harmony export */ });\n/**\n * Enum representing the coordinate plane for the position 2D vector in the {@apilink TransformComponent}\n */\nvar CoordPlane;\n(function (CoordPlane) {\n /**\n * The world coordinate plane (default) represents world space, any entities drawn with world\n * space move when the camera moves.\n */\n CoordPlane[\"World\"] = \"world\";\n /**\n * The screen coordinate plane represents screen space, entities drawn in screen space are pinned\n * to screen coordinates ignoring the camera.\n */\n CoordPlane[\"Screen\"] = \"screen\";\n})(CoordPlane || (CoordPlane = {}));\n\n\n/***/ }),\n\n/***/ \"./Math/global-coordinates.ts\":\n/*!************************************!*\\\n !*** ./Math/global-coordinates.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ GlobalCoordinates: () => (/* binding */ GlobalCoordinates)\n/* harmony export */ });\n/* harmony import */ var _vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vector */ \"./Math/vector.ts\");\n\nclass GlobalCoordinates {\n static fromPagePosition(xOrPos, yOrEngine, engineOrUndefined) {\n let pageX;\n let pageY;\n let pagePos;\n let engine;\n if (arguments.length === 3) {\n pageX = xOrPos;\n pageY = yOrEngine;\n pagePos = new _vector__WEBPACK_IMPORTED_MODULE_0__.Vector(pageX, pageY);\n engine = engineOrUndefined;\n }\n else {\n pagePos = xOrPos;\n pageX = pagePos.x;\n pageY = pagePos.y;\n engine = yOrEngine;\n }\n const screenPos = engine.screen.pageToScreenCoordinates(pagePos);\n const worldPos = engine.screen.screenToWorldCoordinates(screenPos);\n return new GlobalCoordinates(worldPos, pagePos, screenPos);\n }\n constructor(worldPos, pagePos, screenPos) {\n this.worldPos = worldPos;\n this.pagePos = pagePos;\n this.screenPos = screenPos;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/index.ts\":\n/*!***********************!*\\\n !*** ./Math/index.ts ***!\n \\***********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AffineMatrix: () => (/* reexport safe */ _affine_matrix__WEBPACK_IMPORTED_MODULE_3__.AffineMatrix),\n/* harmony export */ BezierCurve: () => (/* reexport safe */ _bezier_curve__WEBPACK_IMPORTED_MODULE_12__.BezierCurve),\n/* harmony export */ CoordPlane: () => (/* reexport safe */ _coord_plane__WEBPACK_IMPORTED_MODULE_5__.CoordPlane),\n/* harmony export */ GlobalCoordinates: () => (/* reexport safe */ _global_coordinates__WEBPACK_IMPORTED_MODULE_7__.GlobalCoordinates),\n/* harmony export */ LineSegment: () => (/* reexport safe */ _line_segment__WEBPACK_IMPORTED_MODULE_8__.LineSegment),\n/* harmony export */ Matrix: () => (/* reexport safe */ _matrix__WEBPACK_IMPORTED_MODULE_2__.Matrix),\n/* harmony export */ MatrixLocations: () => (/* reexport safe */ _matrix__WEBPACK_IMPORTED_MODULE_2__.MatrixLocations),\n/* harmony export */ Projection: () => (/* reexport safe */ _projection__WEBPACK_IMPORTED_MODULE_9__.Projection),\n/* harmony export */ Random: () => (/* reexport safe */ _Random__WEBPACK_IMPORTED_MODULE_6__.Random),\n/* harmony export */ Ray: () => (/* reexport safe */ _ray__WEBPACK_IMPORTED_MODULE_10__.Ray),\n/* harmony export */ RotationType: () => (/* reexport safe */ _rotation_type__WEBPACK_IMPORTED_MODULE_14__.RotationType),\n/* harmony export */ Transform: () => (/* reexport safe */ _transform__WEBPACK_IMPORTED_MODULE_4__.Transform),\n/* harmony export */ TwoPI: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.TwoPI),\n/* harmony export */ Vector: () => (/* reexport safe */ _vector__WEBPACK_IMPORTED_MODULE_0__.Vector),\n/* harmony export */ VectorView: () => (/* reexport safe */ _vector_view__WEBPACK_IMPORTED_MODULE_1__.VectorView),\n/* harmony export */ approximatelyEqual: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.approximatelyEqual),\n/* harmony export */ canonicalizeAngle: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.canonicalizeAngle),\n/* harmony export */ clamp: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.clamp),\n/* harmony export */ frac: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.frac),\n/* harmony export */ inverseLerp: () => (/* reexport safe */ _lerp__WEBPACK_IMPORTED_MODULE_11__.inverseLerp),\n/* harmony export */ inverseLerpVector: () => (/* reexport safe */ _lerp__WEBPACK_IMPORTED_MODULE_11__.inverseLerpVector),\n/* harmony export */ lerp: () => (/* reexport safe */ _lerp__WEBPACK_IMPORTED_MODULE_11__.lerp),\n/* harmony export */ lerpAngle: () => (/* reexport safe */ _lerp__WEBPACK_IMPORTED_MODULE_11__.lerpAngle),\n/* harmony export */ lerpVector: () => (/* reexport safe */ _lerp__WEBPACK_IMPORTED_MODULE_11__.lerpVector),\n/* harmony export */ randomInRange: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.randomInRange),\n/* harmony export */ randomIntInRange: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.randomIntInRange),\n/* harmony export */ range: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.range),\n/* harmony export */ remap: () => (/* reexport safe */ _lerp__WEBPACK_IMPORTED_MODULE_11__.remap),\n/* harmony export */ remapVector: () => (/* reexport safe */ _lerp__WEBPACK_IMPORTED_MODULE_11__.remapVector),\n/* harmony export */ sign: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.sign),\n/* harmony export */ toDegrees: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.toDegrees),\n/* harmony export */ toRadians: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.toRadians),\n/* harmony export */ vec: () => (/* reexport safe */ _vector__WEBPACK_IMPORTED_MODULE_0__.vec)\n/* harmony export */ });\n/* harmony import */ var _vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vector */ \"./Math/vector.ts\");\n/* harmony import */ var _vector_view__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./vector-view */ \"./Math/vector-view.ts\");\n/* harmony import */ var _matrix__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./matrix */ \"./Math/matrix.ts\");\n/* harmony import */ var _affine_matrix__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./affine-matrix */ \"./Math/affine-matrix.ts\");\n/* harmony import */ var _transform__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./transform */ \"./Math/transform.ts\");\n/* harmony import */ var _coord_plane__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _Random__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Random */ \"./Math/Random.ts\");\n/* harmony import */ var _global_coordinates__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./global-coordinates */ \"./Math/global-coordinates.ts\");\n/* harmony import */ var _line_segment__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./line-segment */ \"./Math/line-segment.ts\");\n/* harmony import */ var _projection__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./projection */ \"./Math/projection.ts\");\n/* harmony import */ var _ray__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./ray */ \"./Math/ray.ts\");\n/* harmony import */ var _lerp__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./lerp */ \"./Math/lerp.ts\");\n/* harmony import */ var _bezier_curve__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./bezier-curve */ \"./Math/bezier-curve.ts\");\n/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./util */ \"./Math/util.ts\");\n/* harmony import */ var _rotation_type__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./rotation-type */ \"./Math/rotation-type.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Math/lerp.ts\":\n/*!**********************!*\\\n !*** ./Math/lerp.ts ***!\n \\**********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ inverseLerp: () => (/* binding */ inverseLerp),\n/* harmony export */ inverseLerpVector: () => (/* binding */ inverseLerpVector),\n/* harmony export */ lerp: () => (/* binding */ lerp),\n/* harmony export */ lerpAngle: () => (/* binding */ lerpAngle),\n/* harmony export */ lerpVector: () => (/* binding */ lerpVector),\n/* harmony export */ remap: () => (/* binding */ remap),\n/* harmony export */ remapVector: () => (/* binding */ remapVector)\n/* harmony export */ });\n/* harmony import */ var _rotation_type__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./rotation-type */ \"./Math/rotation-type.ts\");\n/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./util */ \"./Math/util.ts\");\n\n\n/**\n * Linear interpolation between `a` and `b`, at `time = 0` the value will be `a` at `time = 1` the value will be `b`\n * @param a\n * @param b\n * @param time\n */\nfunction lerp(a, b, time) {\n return (1 - time) * a + b * time;\n}\n/**\n * Linear interpolation between angles in radians\n * @param startAngle\n * @param endAngle\n * @param rotationType\n * @param time\n */\nfunction lerpAngle(startAngle, endAngle, rotationType, time) {\n const shortestPathIsPositive = (startAngle - endAngle + _util__WEBPACK_IMPORTED_MODULE_0__.TwoPI) % _util__WEBPACK_IMPORTED_MODULE_0__.TwoPI >= Math.PI;\n const distance1 = Math.abs(endAngle - startAngle);\n const distance2 = _util__WEBPACK_IMPORTED_MODULE_0__.TwoPI - distance1;\n let shortDistance = 0;\n let longDistance = 0;\n if (distance1 > distance2) {\n shortDistance = distance2;\n longDistance = distance1;\n }\n else {\n shortDistance = distance1;\n longDistance = distance2;\n }\n let distance = 0;\n let direction = 1;\n switch (rotationType) {\n case _rotation_type__WEBPACK_IMPORTED_MODULE_1__.RotationType.ShortestPath:\n distance = shortDistance;\n direction = shortestPathIsPositive ? 1 : -1;\n break;\n case _rotation_type__WEBPACK_IMPORTED_MODULE_1__.RotationType.LongestPath:\n distance = longDistance;\n direction = shortestPathIsPositive ? -1 : 1;\n break;\n case _rotation_type__WEBPACK_IMPORTED_MODULE_1__.RotationType.Clockwise:\n direction = 1;\n distance = shortestPathIsPositive ? shortDistance : longDistance;\n break;\n case _rotation_type__WEBPACK_IMPORTED_MODULE_1__.RotationType.CounterClockwise:\n direction = -1;\n distance = shortestPathIsPositive ? longDistance : shortDistance;\n break;\n }\n return startAngle + direction * (distance * time);\n}\n/**\n * Linear interpolation between `a` and `b`, at `time = 0` the value will be `a` at `time = 1` the value will be `b`\n * @param a\n * @param b\n * @param time\n */\nfunction lerpVector(a, b, time) {\n return a.scale(1 - time).add(b.scale(time));\n}\n/**\n * Inverse of a linear interpolation, given a `value` in between `a` and `b` return how close to `a` or `b` the `value` is.\n *\n * Example: `a=1`, `b=5`, `value=4` will return `.75`\n * @param a\n * @param b\n * @param value\n */\nfunction inverseLerp(a, b, value) {\n return (value - a) / (b - a);\n}\n/**\n * Inverse of a linear interpolation, given a `value` in between `a` and `b` return how close to `a` or `b` the `value` is.\n *\n * **Warning** assumes that the `value` vector is co-linear with vector `a` and `b`\n *\n * Example: `a=1`, `b=5`, `value=4` will return `.75`\n * @param a\n * @param b\n * @param value\n */\nfunction inverseLerpVector(a, b, value) {\n const numerator = value.sub(a);\n const denominator = b.sub(a);\n const x = numerator.x / denominator.x;\n const y = numerator.y / denominator.y;\n return Math.min(x, y);\n}\n/**\n * Remaps a value from a source domain to a destination\n * @param minSource\n * @param maxSource\n * @param minDestination\n * @param maxDestination\n * @param value\n */\nfunction remap(minSource, maxSource, minDestination, maxDestination, value) {\n const time = inverseLerp(minSource, maxSource, value);\n return lerp(minDestination, maxDestination, time);\n}\n/**\n * Remaps a value from a source domain to a destination\n *\n * **Warning** assumes that the `value` vector is co-linear with vector `minSource` and `maxSource`\n * @param minSource\n * @param maxSource\n * @param minDestination\n * @param maxDestination\n * @param value\n */\nfunction remapVector(minSource, maxSource, minDestination, maxDestination, value) {\n const time = inverseLerpVector(minSource, maxSource, value);\n return lerpVector(minDestination, maxDestination, time);\n}\n\n\n/***/ }),\n\n/***/ \"./Math/line-segment.ts\":\n/*!******************************!*\\\n !*** ./Math/line-segment.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ LineSegment: () => (/* binding */ LineSegment)\n/* harmony export */ });\n/* harmony import */ var _vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vector */ \"./Math/vector.ts\");\n\n/**\n * A 2D line segment\n */\nclass LineSegment {\n /**\n * @param begin The starting point of the line segment\n * @param end The ending point of the line segment\n */\n constructor(begin, end) {\n this.begin = begin;\n this.end = end;\n }\n clone(dest) {\n const result = dest || new LineSegment(this.begin.clone(), this.end.clone());\n result.begin = this.begin.clone(result.begin);\n result.end = this.end.clone(result.end);\n return result;\n }\n transform(matrix, dest) {\n const result = dest || new LineSegment(_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero, _vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero);\n result.begin = matrix.multiply(this.begin, result.begin);\n result.end = matrix.multiply(this.end, result.end);\n return result;\n }\n /**\n * Gets the raw slope (m) of the line. Will return (+/-)Infinity for vertical lines.\n */\n get slope() {\n return (this.end.y - this.begin.y) / (this.end.x - this.begin.x);\n }\n /**\n * Gets the Y-intercept (b) of the line. Will return (+/-)Infinity if there is no intercept.\n */\n get intercept() {\n return this.begin.y - this.slope * this.begin.x;\n }\n /**\n * Gets the normal of the line\n */\n normal() {\n if (this._normal) {\n return this._normal;\n }\n return (this._normal = this.end.sub(this.begin).normal());\n }\n dir() {\n if (this._dir) {\n return this._dir;\n }\n return (this._dir = this.end.sub(this.begin));\n }\n getPoints() {\n return [this.begin, this.end];\n }\n /**\n * Returns the slope of the line in the form of a vector of length 1\n */\n getSlope() {\n if (this._slope) {\n return this._slope;\n }\n const begin = this.begin;\n const end = this.end;\n const distance = begin.distance(end);\n return (this._slope = end.sub(begin).scale(1 / distance));\n }\n /**\n * Returns the edge of the line as vector, the length of the vector is the length of the edge\n */\n getEdge() {\n const begin = this.begin;\n const end = this.end;\n return end.sub(begin);\n }\n /**\n * Returns the length of the line segment in pixels\n */\n getLength() {\n const begin = this.begin;\n const end = this.end;\n const distance = begin.distance(end);\n return distance;\n }\n /**\n * Returns the midpoint of the edge\n */\n get midpoint() {\n return this.begin.add(this.end).scale(0.5);\n }\n /**\n * Flips the direction of the line segment\n */\n flip() {\n return new LineSegment(this.end, this.begin);\n }\n /**\n * Tests if a given point is below the line, points in the normal direction above the line are considered above.\n * @param point\n */\n below(point) {\n const above2 = (this.end.x - this.begin.x) * (point.y - this.begin.y) - (this.end.y - this.begin.y) * (point.x - this.begin.x);\n return above2 >= 0;\n }\n /**\n * Returns the clip point\n * @param sideVector Vector that traces the line\n * @param length Length to clip along side\n */\n clip(sideVector, length, normalize = true) {\n let dir = sideVector;\n if (normalize) {\n dir = dir.normalize();\n }\n const near = dir.dot(this.begin) - length;\n const far = dir.dot(this.end) - length;\n const results = [];\n if (near <= 0) {\n results.push(this.begin);\n }\n if (far <= 0) {\n results.push(this.end);\n }\n if (near * far < 0) {\n const clipTime = near / (near - far);\n results.push(this.begin.add(this.end.sub(this.begin).scale(clipTime)));\n }\n if (results.length !== 2) {\n return null;\n }\n return new LineSegment(results[0], results[1]);\n }\n /**\n * Find the perpendicular distance from the line to a point\n * https://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line\n * @param point\n */\n distanceToPoint(point, signed = false) {\n const x0 = point.x;\n const y0 = point.y;\n const l = this.getLength();\n const dy = this.end.y - this.begin.y;\n const dx = this.end.x - this.begin.x;\n const distance = (dy * x0 - dx * y0 + this.end.x * this.begin.y - this.end.y * this.begin.x) / l;\n return signed ? distance : Math.abs(distance);\n }\n /**\n * Find the perpendicular line from the line to a point\n * https://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line\n * (a - p) - ((a - p) * n)n\n * a is a point on the line\n * p is the arbitrary point above the line\n * n is a unit vector in direction of the line\n * @param point\n */\n findVectorToPoint(point) {\n const aMinusP = this.begin.sub(point);\n const n = this.getSlope();\n return aMinusP.sub(n.scale(aMinusP.dot(n)));\n }\n /**\n * Finds a point on the line given only an X or a Y value. Given an X value, the function returns\n * a new point with the calculated Y value and vice-versa.\n * @param x The known X value of the target point\n * @param y The known Y value of the target point\n * @returns A new point with the other calculated axis value\n */\n findPoint(x = null, y = null) {\n const m = this.slope;\n const b = this.intercept;\n if (x !== null) {\n return new _vector__WEBPACK_IMPORTED_MODULE_0__.Vector(x, m * x + b);\n }\n else if (y !== null) {\n return new _vector__WEBPACK_IMPORTED_MODULE_0__.Vector((y - b) / m, y);\n }\n else {\n throw new Error('You must provide an X or a Y value');\n }\n }\n /**\n * @see http://stackoverflow.com/a/11908158/109458\n */\n hasPoint() {\n let currPoint;\n let threshold = 0;\n if (typeof arguments[0] === 'number' && typeof arguments[1] === 'number') {\n currPoint = new _vector__WEBPACK_IMPORTED_MODULE_0__.Vector(arguments[0], arguments[1]);\n threshold = arguments[2] || 0;\n }\n else if (arguments[0] instanceof _vector__WEBPACK_IMPORTED_MODULE_0__.Vector) {\n currPoint = arguments[0];\n threshold = arguments[1] || 0;\n }\n else {\n throw 'Could not determine the arguments for Vector.hasPoint';\n }\n const dxc = currPoint.x - this.begin.x;\n const dyc = currPoint.y - this.begin.y;\n const dx1 = this.end.x - this.begin.x;\n const dy1 = this.end.y - this.begin.y;\n const cross = dxc * dy1 - dyc * dx1;\n // check whether point lines on the line\n if (Math.abs(cross) > threshold) {\n return false;\n }\n // check whether point lies in-between start and end\n if (Math.abs(dx1) >= Math.abs(dy1)) {\n return dx1 > 0 ? this.begin.x <= currPoint.x && currPoint.x <= this.end.x : this.end.x <= currPoint.x && currPoint.x <= this.begin.x;\n }\n else {\n return dy1 > 0 ? this.begin.y <= currPoint.y && currPoint.y <= this.end.y : this.end.y <= currPoint.y && currPoint.y <= this.begin.y;\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/matrix.ts\":\n/*!************************!*\\\n !*** ./Math/matrix.ts ***!\n \\************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Matrix: () => (/* binding */ Matrix),\n/* harmony export */ MatrixLocations: () => (/* binding */ MatrixLocations)\n/* harmony export */ });\n/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./util */ \"./Math/util.ts\");\n/* harmony import */ var _vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vector */ \"./Math/vector.ts\");\n\n\n\nvar MatrixLocations;\n(function (MatrixLocations) {\n MatrixLocations[MatrixLocations[\"X\"] = 12] = \"X\";\n MatrixLocations[MatrixLocations[\"Y\"] = 13] = \"Y\";\n})(MatrixLocations || (MatrixLocations = {}));\n/**\n * Excalibur Matrix helper for 4x4 matrices\n *\n * Useful for webgl 4x4 matrices\n */\nclass Matrix {\n constructor() {\n /**\n * 4x4 matrix in column major order\n *\n * | | | | |\n * | ------- | ------- | -------- | -------- |\n * | data[0] | data[4] | data[8] | data[12] |\n * | data[1] | data[5] | data[9] | data[13] |\n * | data[2] | data[6] | data[10] | data[14] |\n * | data[3] | data[7] | data[11] | data[15] |\n *\n */\n this.data = new Float32Array(16);\n this._scaleX = 1;\n this._scaleSignX = 1;\n this._scaleY = 1;\n this._scaleSignY = 1;\n }\n /**\n * Creates an orthographic (flat non-perspective) projection\n * https://en.wikipedia.org/wiki/Orthographic_projection\n * @param left\n * @param right\n * @param bottom\n * @param top\n * @param near\n * @param far\n */\n static ortho(left, right, bottom, top, near, far) {\n const mat = new Matrix();\n mat.data[0] = 2 / (right - left);\n mat.data[1] = 0;\n mat.data[2] = 0;\n mat.data[3] = 0;\n mat.data[4] = 0;\n mat.data[5] = 2 / (top - bottom);\n mat.data[6] = 0;\n mat.data[7] = 0;\n mat.data[8] = 0;\n mat.data[9] = 0;\n mat.data[10] = -2 / (far - near);\n mat.data[11] = 0;\n mat.data[12] = -(right + left) / (right - left);\n mat.data[13] = -(top + bottom) / (top - bottom);\n mat.data[14] = -(far + near) / (far - near);\n mat.data[15] = 1;\n return mat;\n }\n /**\n * Creates a new Matrix with the same data as the current 4x4\n */\n clone(dest) {\n const mat = dest || new Matrix();\n mat.data[0] = this.data[0];\n mat.data[1] = this.data[1];\n mat.data[2] = this.data[2];\n mat.data[3] = this.data[3];\n mat.data[4] = this.data[4];\n mat.data[5] = this.data[5];\n mat.data[6] = this.data[6];\n mat.data[7] = this.data[7];\n mat.data[8] = this.data[8];\n mat.data[9] = this.data[9];\n mat.data[10] = this.data[10];\n mat.data[11] = this.data[11];\n mat.data[12] = this.data[12];\n mat.data[13] = this.data[13];\n mat.data[14] = this.data[14];\n mat.data[15] = this.data[15];\n return mat;\n }\n /**\n * Converts the current matrix into a DOMMatrix\n *\n * This is useful when working with the browser Canvas context\n * @returns {DOMMatrix} DOMMatrix\n */\n toDOMMatrix() {\n return new DOMMatrix([...this.data]);\n }\n static fromFloat32Array(data) {\n const matrix = new Matrix();\n matrix.data = data;\n return matrix;\n }\n /**\n * Creates a new identity matrix (a matrix that when applied does nothing)\n */\n static identity() {\n const mat = new Matrix();\n mat.data[0] = 1;\n mat.data[1] = 0;\n mat.data[2] = 0;\n mat.data[3] = 0;\n mat.data[4] = 0;\n mat.data[5] = 1;\n mat.data[6] = 0;\n mat.data[7] = 0;\n mat.data[8] = 0;\n mat.data[9] = 0;\n mat.data[10] = 1;\n mat.data[11] = 0;\n mat.data[12] = 0;\n mat.data[13] = 0;\n mat.data[14] = 0;\n mat.data[15] = 1;\n return mat;\n }\n /**\n * Resets the current matrix to the identity matrix, mutating it\n * @returns {Matrix} Current matrix as identity\n */\n reset() {\n const mat = this;\n mat.data[0] = 1;\n mat.data[1] = 0;\n mat.data[2] = 0;\n mat.data[3] = 0;\n mat.data[4] = 0;\n mat.data[5] = 1;\n mat.data[6] = 0;\n mat.data[7] = 0;\n mat.data[8] = 0;\n mat.data[9] = 0;\n mat.data[10] = 1;\n mat.data[11] = 0;\n mat.data[12] = 0;\n mat.data[13] = 0;\n mat.data[14] = 0;\n mat.data[15] = 1;\n return mat;\n }\n /**\n * Creates a brand new translation matrix at the specified 3d point\n * @param x\n * @param y\n */\n static translation(x, y) {\n const mat = Matrix.identity();\n mat.data[12] = x;\n mat.data[13] = y;\n return mat;\n }\n /**\n * Creates a brand new scaling matrix with the specified scaling factor\n * @param sx\n * @param sy\n */\n static scale(sx, sy) {\n const mat = Matrix.identity();\n mat.data[0] = sx;\n mat.data[5] = sy;\n mat.data[10] = 1;\n mat.data[15] = 1;\n return mat;\n }\n /**\n * Creates a brand new rotation matrix with the specified angle in radians\n * @param angle\n */\n static rotation(angle) {\n const mat = Matrix.identity();\n mat.data[0] = Math.cos(angle);\n mat.data[4] = -Math.sin(angle);\n mat.data[1] = Math.sin(angle);\n mat.data[5] = Math.cos(angle);\n return mat;\n }\n multiply(vectorOrMatrix, dest) {\n if (vectorOrMatrix instanceof _vector__WEBPACK_IMPORTED_MODULE_0__.Vector) {\n const result = dest || new _vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\n const vector = vectorOrMatrix;\n // these shenanigans are to allow dest and vector to be the same instance\n const resultX = vector.x * this.data[0] + vector.y * this.data[4] + this.data[12];\n const resultY = vector.x * this.data[1] + vector.y * this.data[5] + this.data[13];\n result.x = resultX;\n result.y = resultY;\n return result;\n }\n else {\n const result = dest || new Matrix();\n const other = vectorOrMatrix;\n const a11 = this.data[0];\n const a21 = this.data[1];\n const a31 = this.data[2];\n const a41 = this.data[3];\n const a12 = this.data[4];\n const a22 = this.data[5];\n const a32 = this.data[6];\n const a42 = this.data[7];\n const a13 = this.data[8];\n const a23 = this.data[9];\n const a33 = this.data[10];\n const a43 = this.data[11];\n const a14 = this.data[12];\n const a24 = this.data[13];\n const a34 = this.data[14];\n const a44 = this.data[15];\n const b11 = other.data[0];\n const b21 = other.data[1];\n const b31 = other.data[2];\n const b41 = other.data[3];\n const b12 = other.data[4];\n const b22 = other.data[5];\n const b32 = other.data[6];\n const b42 = other.data[7];\n const b13 = other.data[8];\n const b23 = other.data[9];\n const b33 = other.data[10];\n const b43 = other.data[11];\n const b14 = other.data[12];\n const b24 = other.data[13];\n const b34 = other.data[14];\n const b44 = other.data[15];\n result.data[0] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n result.data[1] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n result.data[2] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n result.data[3] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n result.data[4] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n result.data[5] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n result.data[6] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n result.data[7] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n result.data[8] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n result.data[9] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n result.data[10] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n result.data[11] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n result.data[12] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n result.data[13] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n result.data[14] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n result.data[15] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n const s = this.getScale();\n result._scaleSignX = (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(s.x) * (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(result._scaleSignX);\n result._scaleSignY = (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(s.y) * (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(result._scaleSignY);\n return result;\n }\n }\n /**\n * Applies translation to the current matrix mutating it\n * @param x\n * @param y\n */\n translate(x, y) {\n const a11 = this.data[0];\n const a21 = this.data[1];\n const a31 = this.data[2];\n const a41 = this.data[3];\n const a12 = this.data[4];\n const a22 = this.data[5];\n const a32 = this.data[6];\n const a42 = this.data[7];\n const a13 = this.data[8];\n const a23 = this.data[9];\n const a33 = this.data[10];\n const a43 = this.data[11];\n const a14 = this.data[12];\n const a24 = this.data[13];\n const a34 = this.data[14];\n const a44 = this.data[15];\n // Doesn't change z\n const z = 0;\n const w = 1;\n this.data[12] = a11 * x + a12 * y + a13 * z + a14 * w;\n this.data[13] = a21 * x + a22 * y + a23 * z + a24 * w;\n this.data[14] = a31 * x + a32 * y + a33 * z + a34 * w;\n this.data[15] = a41 * x + a42 * y + a43 * z + a44 * w;\n return this;\n }\n setPosition(x, y) {\n this.data[12] = x;\n this.data[13] = y;\n }\n getPosition() {\n return (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.data[12], this.data[13]);\n }\n /**\n * Applies rotation to the current matrix mutating it\n * @param angle in Radians\n */\n rotate(angle) {\n const a11 = this.data[0];\n const a21 = this.data[1];\n const a31 = this.data[2];\n const a41 = this.data[3];\n const a12 = this.data[4];\n const a22 = this.data[5];\n const a32 = this.data[6];\n const a42 = this.data[7];\n const sine = Math.sin(angle);\n const cosine = Math.cos(angle);\n this.data[0] = cosine * a11 + sine * a12;\n this.data[1] = cosine * a21 + sine * a22;\n this.data[2] = cosine * a31 + sine * a32;\n this.data[3] = cosine * a41 + sine * a42;\n this.data[4] = cosine * a12 - sine * a11;\n this.data[5] = cosine * a22 - sine * a21;\n this.data[6] = cosine * a32 - sine * a31;\n this.data[7] = cosine * a42 - sine * a41;\n return this;\n }\n /**\n * Applies scaling to the current matrix mutating it\n * @param x\n * @param y\n */\n scale(x, y) {\n const a11 = this.data[0];\n const a21 = this.data[1];\n const a31 = this.data[2];\n const a41 = this.data[3];\n const a12 = this.data[4];\n const a22 = this.data[5];\n const a32 = this.data[6];\n const a42 = this.data[7];\n this.data[0] = a11 * x;\n this.data[1] = a21 * x;\n this.data[2] = a31 * x;\n this.data[3] = a41 * x;\n this.data[4] = a12 * y;\n this.data[5] = a22 * y;\n this.data[6] = a32 * y;\n this.data[7] = a42 * y;\n return this;\n }\n setRotation(angle) {\n const currentScale = this.getScale();\n const sine = Math.sin(angle);\n const cosine = Math.cos(angle);\n this.data[0] = cosine * currentScale.x;\n this.data[1] = sine * currentScale.y;\n this.data[4] = -sine * currentScale.x;\n this.data[5] = cosine * currentScale.y;\n }\n getRotation() {\n const angle = Math.atan2(this.data[1] / this.getScaleY(), this.data[0] / this.getScaleX());\n return (0,_util__WEBPACK_IMPORTED_MODULE_1__.canonicalizeAngle)(angle);\n }\n getScaleX() {\n // absolute scale of the matrix (we lose sign so need to add it back)\n const xscale = (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.data[0], this.data[4]).magnitude;\n return this._scaleSignX * xscale;\n }\n getScaleY() {\n // absolute scale of the matrix (we lose sign so need to add it back)\n const yscale = (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.data[1], this.data[5]).magnitude;\n return this._scaleSignY * yscale;\n }\n /**\n * Get the scale of the matrix\n */\n getScale() {\n return (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.getScaleX(), this.getScaleY());\n }\n setScaleX(val) {\n if (this._scaleX === val) {\n return;\n }\n this._scaleSignX = (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(val);\n // negative scale acts like a 180 rotation, so flip\n const xscale = (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.data[0] * this._scaleSignX, this.data[4] * this._scaleSignX).normalize();\n this.data[0] = xscale.x * val;\n this.data[4] = xscale.y * val;\n this._scaleX = val;\n }\n setScaleY(val) {\n if (this._scaleY === val) {\n return;\n }\n this._scaleSignY = (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(val);\n // negative scale acts like a 180 rotation, so flip\n const yscale = (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.data[1] * this._scaleSignY, this.data[5] * this._scaleSignY).normalize();\n this.data[1] = yscale.x * val;\n this.data[5] = yscale.y * val;\n this._scaleY = val;\n }\n setScale(scale) {\n this.setScaleX(scale.x);\n this.setScaleY(scale.y);\n }\n /**\n * Determinant of the upper left 2x2 matrix\n */\n getBasisDeterminant() {\n return this.data[0] * this.data[5] - this.data[1] * this.data[4];\n }\n /**\n * Return the affine inverse, optionally store it in a target matrix.\n *\n * It's recommended you call .reset() the target unless you know what you're doing\n * @param target\n */\n getAffineInverse(target) {\n // See http://negativeprobability.blogspot.com/2011/11/affine-transformations-and-their.html\n // See https://www.mathsisfun.com/algebra/matrix-inverse.html\n // Since we are actually only doing 2D transformations we can use this hack\n // We don't actually use the 3rd or 4th dimension\n const det = this.getBasisDeterminant();\n const inverseDet = 1 / det; // todo zero check\n const a = this.data[0];\n const b = this.data[4];\n const c = this.data[1];\n const d = this.data[5];\n const m = target || Matrix.identity();\n // inverts rotation and scale\n m.data[0] = d * inverseDet;\n m.data[1] = -c * inverseDet;\n m.data[4] = -b * inverseDet;\n m.data[5] = a * inverseDet;\n const tx = this.data[12];\n const ty = this.data[13];\n // invert translation\n // transform translation into the matrix basis created by rot/scale\n m.data[12] = -(tx * m.data[0] + ty * m.data[4]);\n m.data[13] = -(tx * m.data[1] + ty * m.data[5]);\n return m;\n }\n isIdentity() {\n return (this.data[0] === 1 &&\n this.data[1] === 0 &&\n this.data[2] === 0 &&\n this.data[3] === 0 &&\n this.data[4] === 0 &&\n this.data[5] === 1 &&\n this.data[6] === 0 &&\n this.data[7] === 0 &&\n this.data[8] === 0 &&\n this.data[9] === 0 &&\n this.data[10] === 1 &&\n this.data[11] === 0 &&\n this.data[12] === 0 &&\n this.data[13] === 0 &&\n this.data[14] === 0 &&\n this.data[15] === 1);\n }\n toString() {\n return `\r\n[${this.data[0]} ${this.data[4]} ${this.data[8]} ${this.data[12]}]\r\n[${this.data[1]} ${this.data[5]} ${this.data[9]} ${this.data[13]}]\r\n[${this.data[2]} ${this.data[6]} ${this.data[10]} ${this.data[14]}]\r\n[${this.data[3]} ${this.data[7]} ${this.data[11]} ${this.data[15]}]\r\n`;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/projection.ts\":\n/*!****************************!*\\\n !*** ./Math/projection.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Projection: () => (/* binding */ Projection)\n/* harmony export */ });\n/**\n * A 1 dimensional projection on an axis, used to test overlaps\n */\nclass Projection {\n constructor(min, max) {\n this.min = min;\n this.max = max;\n }\n overlaps(projection) {\n return this.max > projection.min && projection.max > this.min;\n }\n getOverlap(projection) {\n if (this.overlaps(projection)) {\n if (this.max > projection.max) {\n return projection.max - this.min;\n }\n else {\n return this.max - projection.min;\n }\n }\n return 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/ray.ts\":\n/*!*********************!*\\\n !*** ./Math/ray.ts ***!\n \\*********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Ray: () => (/* binding */ Ray)\n/* harmony export */ });\n/**\n * A 2D ray that can be cast into the scene to do collision detection\n */\nclass Ray {\n /**\n * @param pos The starting position for the ray\n * @param dir The vector indicating the direction of the ray\n */\n constructor(pos, dir) {\n this.pos = pos;\n this.dir = dir.normalize();\n }\n /**\n * Tests a whether this ray intersects with a line segment. Returns a number greater than or equal to 0 on success.\n * This number indicates the mathematical intersection time.\n * @param line The line to test\n */\n intersect(line) {\n const numerator = line.begin.sub(this.pos);\n // Test is line and ray are parallel and non intersecting\n if (this.dir.cross(line.getSlope()) === 0 && numerator.cross(this.dir) !== 0) {\n return -1;\n }\n // Lines are parallel\n const divisor = this.dir.cross(line.getSlope());\n if (divisor === 0) {\n return -1;\n }\n const t = numerator.cross(line.getSlope()) / divisor;\n if (t >= 0) {\n const u = numerator.cross(this.dir) / divisor / line.getLength();\n if (u >= 0 && u <= 1) {\n return t;\n }\n }\n return -1;\n }\n intersectPoint(line) {\n const time = this.intersect(line);\n if (time < 0) {\n return null;\n }\n return this.getPoint(time);\n }\n /**\n * Returns the point of intersection given the intersection time\n */\n getPoint(time) {\n return this.pos.add(this.dir.scale(time));\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/rotation-type.ts\":\n/*!*******************************!*\\\n !*** ./Math/rotation-type.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RotationType: () => (/* binding */ RotationType)\n/* harmony export */ });\n/**\n * An enum that describes the strategies that rotation actions can use\n */\nvar RotationType;\n(function (RotationType) {\n /**\n * Rotation via `ShortestPath` will use the smallest angle\n * between the starting and ending points. This strategy is the default behavior.\n */\n RotationType[\"ShortestPath\"] = \"shortest-path\";\n /**\n * Rotation via `LongestPath` will use the largest angle\n * between the starting and ending points.\n */\n RotationType[\"LongestPath\"] = \"longest-path\";\n /**\n * Rotation via `Clockwise` will travel in a clockwise direction,\n * regardless of the starting and ending points.\n */\n RotationType[\"Clockwise\"] = \"clockwise\";\n /**\n * Rotation via `CounterClockwise` will travel in a counterclockwise direction,\n * regardless of the starting and ending points.\n */\n RotationType[\"CounterClockwise\"] = \"counter-clockwise\";\n})(RotationType || (RotationType = {}));\n\n\n/***/ }),\n\n/***/ \"./Math/transform.ts\":\n/*!***************************!*\\\n !*** ./Math/transform.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Transform: () => (/* binding */ Transform)\n/* harmony export */ });\n/* harmony import */ var _affine_matrix__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./affine-matrix */ \"./Math/affine-matrix.ts\");\n/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./util */ \"./Math/util.ts\");\n/* harmony import */ var _vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./vector */ \"./Math/vector.ts\");\n/* harmony import */ var _vector_view__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./vector-view */ \"./Math/vector-view.ts\");\n/* harmony import */ var _watch_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./watch-vector */ \"./Math/watch-vector.ts\");\n\n\n\n\n\nclass Transform {\n constructor() {\n this._parent = null;\n this._children = [];\n this._pos = new _watch_vector__WEBPACK_IMPORTED_MODULE_0__.WatchVector((0,_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0), () => {\n this.flagDirty();\n });\n this._globalPos = new _vector_view__WEBPACK_IMPORTED_MODULE_2__.VectorView({\n getX: () => this.matrix.data[4],\n getY: () => this.matrix.data[5],\n setX: (x) => {\n if (this.parent) {\n const { x: newX } = this.parent.inverse.multiply((0,_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(x, this.pos.y));\n this.pos.x = newX;\n }\n else {\n this.pos.x = x;\n }\n if (x !== this.matrix.data[4]) {\n this.flagDirty();\n }\n },\n setY: (y) => {\n if (this.parent) {\n const { y: newY } = this.parent.inverse.multiply((0,_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(this.pos.x, y));\n this.pos.y = newY;\n }\n else {\n this.pos.y = y;\n }\n if (y !== this.matrix.data[5]) {\n this.flagDirty();\n }\n }\n });\n this._rotation = 0;\n this._scale = new _watch_vector__WEBPACK_IMPORTED_MODULE_0__.WatchVector((0,_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(1, 1), () => {\n this.flagDirty();\n });\n this._globalScale = new _vector_view__WEBPACK_IMPORTED_MODULE_2__.VectorView({\n getX: () => (this.parent ? this.matrix.getScaleX() : this.scale.x),\n getY: () => (this.parent ? this.matrix.getScaleY() : this.scale.y),\n setX: (x) => {\n if (this.parent) {\n const globalScaleX = this.parent.globalScale.x;\n this.scale.x = x / globalScaleX;\n }\n else {\n this.scale.x = x;\n }\n },\n setY: (y) => {\n if (this.parent) {\n const globalScaleY = this.parent.globalScale.y;\n this.scale.y = y / globalScaleY;\n }\n else {\n this.scale.y = y;\n }\n }\n });\n this._z = 0;\n this._isDirty = false;\n this._isInverseDirty = false;\n this._matrix = _affine_matrix__WEBPACK_IMPORTED_MODULE_3__.AffineMatrix.identity();\n this._inverse = _affine_matrix__WEBPACK_IMPORTED_MODULE_3__.AffineMatrix.identity();\n this._scratch = _affine_matrix__WEBPACK_IMPORTED_MODULE_3__.AffineMatrix.identity();\n }\n get parent() {\n return this._parent;\n }\n set parent(transform) {\n if (this._parent) {\n const index = this._parent._children.indexOf(this);\n if (index > -1) {\n this._parent._children.splice(index, 1);\n }\n }\n this._parent = transform;\n if (this._parent) {\n this._parent._children.push(this);\n }\n this.flagDirty();\n }\n get children() {\n return this._children;\n }\n set pos(v) {\n this._pos.x = v.x;\n this._pos.y = v.y;\n }\n get pos() {\n return this._pos;\n }\n set globalPos(v) {\n let localPos = v.clone();\n if (this.parent) {\n localPos = this.parent.inverse.multiply(v);\n }\n if (!localPos.equals(this._pos)) {\n this._pos = localPos;\n this.flagDirty();\n }\n }\n get globalPos() {\n return this._globalPos;\n }\n set rotation(rotation) {\n const canonRotation = (0,_util__WEBPACK_IMPORTED_MODULE_4__.canonicalizeAngle)(rotation);\n if (canonRotation !== this._rotation) {\n this.flagDirty();\n }\n this._rotation = canonRotation;\n }\n get rotation() {\n return this._rotation;\n }\n set globalRotation(rotation) {\n let inverseRotation = 0;\n if (this.parent) {\n inverseRotation = this.parent.globalRotation;\n }\n const canonRotation = (0,_util__WEBPACK_IMPORTED_MODULE_4__.canonicalizeAngle)(rotation + inverseRotation);\n if (canonRotation !== this._rotation) {\n this.flagDirty();\n }\n this._rotation = canonRotation;\n }\n get globalRotation() {\n if (this.parent) {\n return this.matrix.getRotation();\n }\n return this.rotation;\n }\n set scale(v) {\n this._scale.x = v.x;\n this._scale.y = v.y;\n }\n get scale() {\n return this._scale;\n }\n set globalScale(v) {\n let inverseScale = (0,_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(1, 1);\n if (this.parent) {\n inverseScale = this.parent.globalScale;\n }\n this.scale = v.scale((0,_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(1 / inverseScale.x, 1 / inverseScale.y));\n }\n get globalScale() {\n return this._globalScale;\n }\n set z(z) {\n this._z = z;\n this.flagDirty();\n }\n get z() {\n return this._z;\n }\n set globalZ(z) {\n if (this.parent) {\n this.z = z - this.parent.globalZ;\n }\n else {\n this.z = z;\n }\n }\n get globalZ() {\n if (this.parent) {\n return this.z + this.parent.globalZ;\n }\n return this.z;\n }\n /**\n * Calculates and returns the matrix representation of this transform\n *\n * Avoid mutating the matrix to update the transform, it is not the source of truth.\n * Update the transform pos, rotation, scale.\n */\n get matrix() {\n if (this._isDirty) {\n if (this.parent === null) {\n this._calculateMatrix().clone(this._matrix);\n }\n else {\n this.parent.matrix.multiply(this._calculateMatrix()).clone(this._matrix);\n }\n this._isDirty = false;\n }\n return this._matrix;\n }\n /**\n * Calculates and returns the inverse matrix representation of this transform\n */\n get inverse() {\n if (this._isInverseDirty) {\n this.matrix.inverse(this._inverse);\n this._isInverseDirty = false;\n }\n return this._inverse;\n }\n _calculateMatrix() {\n this._scratch.data[0] = Math.cos(this._rotation);\n this._scratch.data[1] = Math.sin(this._rotation);\n this._scratch.data[2] = -Math.sin(this._rotation);\n this._scratch.data[3] = Math.cos(this.rotation);\n this._scratch.data[4] = this._pos.x;\n this._scratch.data[5] = this._pos.y;\n this._scratch.scale(this._scale.x, this._scale.y);\n return this._scratch;\n }\n flagDirty() {\n this._isDirty = true;\n this._isInverseDirty = true;\n for (let i = 0; i < this._children.length; i++) {\n this._children[i].flagDirty();\n }\n }\n apply(point) {\n return this.matrix.multiply(point);\n }\n applyInverse(point) {\n return this.inverse.multiply(point);\n }\n setTransform(pos, rotation, scale) {\n this._pos.x = pos.x;\n this._pos.y = pos.y;\n this._rotation = (0,_util__WEBPACK_IMPORTED_MODULE_4__.canonicalizeAngle)(rotation);\n this._scale.x = scale.x;\n this._scale.y = scale.y;\n this.flagDirty();\n }\n /**\n * Returns true if the transform has a negative x scale or y scale, but not both\n */\n isMirrored() {\n const signBitX = (0,_util__WEBPACK_IMPORTED_MODULE_4__.sign)(this.scale.x) >>> 31;\n const signBitY = (0,_util__WEBPACK_IMPORTED_MODULE_4__.sign)(this.scale.y) >>> 31;\n const mirrored = signBitX ^ signBitY;\n return !!mirrored;\n }\n /**\n * Clones the current transform\n * **Warning does not clone the parent**\n * @param dest\n */\n clone(dest) {\n const target = dest !== null && dest !== void 0 ? dest : new Transform();\n this._pos.clone(target._pos);\n target._z = this._z;\n target._rotation = this._rotation;\n this._scale.clone(target._scale);\n target.flagDirty();\n return target;\n }\n /**\n * Clones but keeps the same parent reference\n */\n cloneWithParent(dest) {\n const target = dest !== null && dest !== void 0 ? dest : new Transform();\n this._pos.clone(target._pos);\n target._z = this._z;\n target._rotation = this._rotation;\n this._scale.clone(target._scale);\n target.parent = this.parent;\n target.flagDirty();\n return target;\n }\n toString() {\n return this.matrix.toString();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/util.ts\":\n/*!**********************!*\\\n !*** ./Math/util.ts ***!\n \\**********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TwoPI: () => (/* binding */ TwoPI),\n/* harmony export */ approximatelyEqual: () => (/* binding */ approximatelyEqual),\n/* harmony export */ canonicalizeAngle: () => (/* binding */ canonicalizeAngle),\n/* harmony export */ clamp: () => (/* binding */ clamp),\n/* harmony export */ frac: () => (/* binding */ frac),\n/* harmony export */ randomInRange: () => (/* binding */ randomInRange),\n/* harmony export */ randomIntInRange: () => (/* binding */ randomIntInRange),\n/* harmony export */ range: () => (/* binding */ range),\n/* harmony export */ sign: () => (/* binding */ sign),\n/* harmony export */ toDegrees: () => (/* binding */ toDegrees),\n/* harmony export */ toRadians: () => (/* binding */ toRadians)\n/* harmony export */ });\n/* harmony import */ var _Random__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Random */ \"./Math/Random.ts\");\n\n/**\n * Two PI constant\n */\nconst TwoPI = Math.PI * 2;\n/**\n * Returns the fractional part of a number\n * @param x\n */\nfunction frac(x) {\n if (x >= 0) {\n return x - Math.floor(x);\n }\n else {\n return x - Math.ceil(x);\n }\n}\n/**\n * Returns the sign of a number, if 0 returns 0\n */\nfunction sign(val) {\n if (val === 0) {\n return 0;\n }\n return val < 0 ? -1 : 1;\n}\n/**\n * Clamps a value between a min and max inclusive\n */\nfunction clamp(val, min, max) {\n return Math.min(Math.max(min, val), max);\n}\n/**\n * Approximately equals\n */\nfunction approximatelyEqual(val1, val2, tolerance) {\n // https://dev.to/alldanielscott/how-to-compare-numbers-correctly-in-javascript-1l4i\n return Math.abs(val1 - val2) < tolerance;\n}\n/**\n * Convert an angle to be the equivalent in the range [0, 2PI)\n */\nfunction canonicalizeAngle(angle) {\n let tmpAngle = angle;\n if (angle >= TwoPI) {\n while (tmpAngle >= TwoPI) {\n tmpAngle -= TwoPI;\n }\n }\n if (angle < 0) {\n while (tmpAngle < 0) {\n tmpAngle += TwoPI;\n }\n }\n return tmpAngle;\n}\n/**\n * Convert radians to degrees\n */\nfunction toDegrees(radians) {\n return (180 / Math.PI) * radians;\n}\n/**\n * Convert degrees to radians\n */\nfunction toRadians(degrees) {\n return (degrees / 180) * Math.PI;\n}\n/**\n * Generate a range of numbers\n * For example: range(0, 5) -> [0, 1, 2, 3, 4, 5]\n * @param from inclusive\n * @param to inclusive\n */\nconst range = (from, to) => Array.from(new Array(to - from + 1), (_x, i) => i + from);\n/**\n * Find a random floating point number in range\n */\nfunction randomInRange(min, max, random = new _Random__WEBPACK_IMPORTED_MODULE_0__.Random()) {\n return random ? random.floating(min, max) : min + Math.random() * (max - min);\n}\n/**\n * Find a random integer in a range\n */\nfunction randomIntInRange(min, max, random = new _Random__WEBPACK_IMPORTED_MODULE_0__.Random()) {\n return random ? random.integer(min, max) : Math.round(randomInRange(min, max));\n}\n\n\n/***/ }),\n\n/***/ \"./Math/vector-view.ts\":\n/*!*****************************!*\\\n !*** ./Math/vector-view.ts ***!\n \\*****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ VectorView: () => (/* binding */ VectorView)\n/* harmony export */ });\n/* harmony import */ var _vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vector */ \"./Math/vector.ts\");\n\nclass VectorView extends _vector__WEBPACK_IMPORTED_MODULE_0__.Vector {\n constructor(options) {\n super(0, 0);\n this._getX = options.getX;\n this._getY = options.getY;\n this._setX = options.setX;\n this._setY = options.setY;\n }\n get x() {\n return (this._x = this._getX());\n }\n set x(val) {\n this._setX(val);\n this._x = val;\n }\n get y() {\n return (this._y = this._getY());\n }\n set y(val) {\n this._setY(val);\n this._y = val;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/vector.ts\":\n/*!************************!*\\\n !*** ./Math/vector.ts ***!\n \\************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Vector: () => (/* binding */ Vector),\n/* harmony export */ vec: () => (/* binding */ vec)\n/* harmony export */ });\n/* harmony import */ var _rotation_type__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./rotation-type */ \"./Math/rotation-type.ts\");\n/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./util */ \"./Math/util.ts\");\n\n\n/**\n * A 2D vector on a plane.\n */\nclass Vector {\n /**\n * A (0, 0) vector\n */\n static get Zero() {\n return new Vector(0, 0);\n }\n /**\n * A (1, 1) vector\n */\n static get One() {\n return new Vector(1, 1);\n }\n /**\n * A (0.5, 0.5) vector\n */\n static get Half() {\n return new Vector(0.5, 0.5);\n }\n /**\n * A unit vector pointing up (0, -1)\n */\n static get Up() {\n return new Vector(0, -1);\n }\n /**\n * A unit vector pointing down (0, 1)\n */\n static get Down() {\n return new Vector(0, 1);\n }\n /**\n * A unit vector pointing left (-1, 0)\n */\n static get Left() {\n return new Vector(-1, 0);\n }\n /**\n * A unit vector pointing right (1, 0)\n */\n static get Right() {\n return new Vector(1, 0);\n }\n /**\n * Returns a vector of unit length in the direction of the specified angle in Radians.\n * @param angle The angle to generate the vector\n */\n static fromAngle(angle) {\n return new Vector(Math.cos(angle), Math.sin(angle));\n }\n /**\n * Checks if vector is not null, undefined, or if any of its components are NaN or Infinity.\n */\n static isValid(vec) {\n if (vec === null || vec === undefined) {\n return false;\n }\n if (isNaN(vec.x) || isNaN(vec.y)) {\n return false;\n }\n if (vec.x === Infinity || vec.y === Infinity || vec.x === -Infinity || vec.y === -Infinity) {\n return false;\n }\n return true;\n }\n /**\n * Calculates distance between two Vectors\n * @param vec1\n * @param vec2\n */\n static distance(vec1, vec2) {\n return Math.sqrt(Math.pow(vec1.x - vec2.x, 2) + Math.pow(vec1.y - vec2.y, 2));\n }\n static min(vec1, vec2) {\n return new Vector(Math.min(vec1.x, vec2.x), Math.min(vec1.y, vec2.y));\n }\n static max(vec1, vec2) {\n return new Vector(Math.max(vec1.x, vec2.x), Math.max(vec1.y, vec2.y));\n }\n /**\n * @param x X component of the Vector\n * @param y Y component of the Vector\n */\n constructor(x, y) {\n this._x = 0;\n this._y = 0;\n this._x = x;\n this._y = y;\n }\n /**\n * Get the x component of the vector\n */\n get x() {\n return this._x;\n }\n /**\n * Set the x component, THIS MUTATES the current vector. It is usually better to create a new vector.\n * @warning **Be very careful setting components on shared vectors, mutating shared vectors can cause hard to find bugs**\n */\n set x(val) {\n this._x = val;\n }\n /**\n * Get the y component of the vector\n */\n get y() {\n return this._y;\n }\n /**\n * Set the y component, THIS MUTATES the current vector. It is usually better to create a new vector.\n * @warning **Be very careful setting components on shared vectors, mutating shared vectors can cause hard to find bugs**\n */\n set y(val) {\n this._y = val;\n }\n /**\n * Sets the x and y components at once, THIS MUTATES the current vector. It is usually better to create a new vector.\n * @warning **Be very careful using this, mutating vectors can cause hard to find bugs**\n */\n setTo(x, y) {\n this.x = x;\n this.y = y;\n }\n /**\n * Compares this point against another and tests for equality\n * @param vector The other point to compare to\n * @param tolerance Amount of euclidean distance off we are willing to tolerate\n */\n equals(vector, tolerance = Vector.EQUALS_EPSILON) {\n return Math.abs(this.x - vector.x) <= tolerance && Math.abs(this.y - vector.y) <= tolerance;\n }\n /**\n * The distance to another vector. If no other Vector is specified, this will return the {@apilink magnitude}.\n * @param v The other vector. Leave blank to use origin vector.\n */\n distance(v) {\n if (!v) {\n return Math.sqrt(this.x * this.x + this.y * this.y);\n }\n const deltaX = this.x - v.x;\n const deltaY = this.y - v.y;\n return Math.sqrt(deltaX * deltaX + deltaY * deltaY);\n }\n squareDistance(v) {\n if (!v) {\n v = Vector.Zero;\n }\n const deltaX = this.x - v.x;\n const deltaY = this.y - v.y;\n return deltaX * deltaX + deltaY * deltaY;\n }\n /**\n * Clamps the current vector's magnitude mutating it\n * @param magnitude\n */\n clampMagnitude(magnitude) {\n const size = this.magnitude;\n const newSize = (0,_util__WEBPACK_IMPORTED_MODULE_0__.clamp)(size, 0, magnitude);\n this.magnitude = newSize;\n return this;\n }\n /**\n * The size (magnitude) of the Vector\n * @deprecated Will be removed in v1, use Vector.magnitude\n */\n get size() {\n return this.distance();\n }\n /**\n * Setting the size mutates the current vector\n * @warning Can be used to set the size of the vector, **be very careful using this, mutating vectors can cause hard to find bugs**\n * @deprecated Will be removed in v1, use Vector.magnitude\n */\n set size(newLength) {\n const v = this.normalize().scale(newLength);\n this.setTo(v.x, v.y);\n }\n /**\n * The magnitude (length) of the Vector\n */\n get magnitude() {\n return this.distance();\n }\n /**\n * Setting the size mutates the current vector\n * @warning Can be used to set the size of the vector, **be very careful using this, mutating vectors can cause hard to find bugs**\n */\n set magnitude(newMagnitude) {\n this.normalize().scale(newMagnitude, this);\n }\n /**\n * Normalizes a non-zero vector to have a magnitude of 1. Zero vectors return a new zero vector.\n */\n normalize() {\n const distance = this.distance();\n if (distance === 0) {\n return Vector.Zero;\n }\n return new Vector(this.x / distance, this.y / distance);\n }\n /**\n * Returns the average (midpoint) between the current point and the specified\n */\n average(vec) {\n return this.add(vec).scale(0.5);\n }\n scale(sizeOrScale, dest) {\n const result = dest || new Vector(0, 0);\n if (sizeOrScale instanceof Vector) {\n result.x = this.x * sizeOrScale.x;\n result.y = this.y * sizeOrScale.y;\n }\n else {\n result.x = this.x * sizeOrScale;\n result.y = this.y * sizeOrScale;\n }\n return result;\n }\n /**\n * Adds one vector to another\n * @param v The vector to add\n * @param dest Optionally copy the result into a provided vector\n */\n add(v, dest) {\n if (dest) {\n dest.x = this.x + v.x;\n dest.y = this.y + v.y;\n return dest;\n }\n return new Vector(this.x + v.x, this.y + v.y);\n }\n /**\n * Subtracts a vector from another, if you subtract vector `B.sub(A)` the resulting vector points from A -> B\n * @param v The vector to subtract\n */\n sub(v, dest) {\n const result = dest || new Vector(0, 0);\n const x = this.x - v.x;\n const y = this.y - v.y;\n result.x = x;\n result.y = y;\n return result;\n }\n /**\n * Adds one vector to this one modifying the original\n * @param v The vector to add\n * @warning Be very careful using this, mutating vectors can cause hard to find bugs\n */\n addEqual(v) {\n this.setTo(this.x + v.x, this.y + v.y);\n return this;\n }\n /**\n * Subtracts a vector from this one modifying the original\n * @param v The vector to subtract\n * @warning Be very careful using this, mutating vectors can cause hard to find bugs\n */\n subEqual(v) {\n this.setTo(this.x - v.x, this.y - v.y);\n return this;\n }\n /**\n * Scales this vector by a factor of size and modifies the original\n * @warning Be very careful using this, mutating vectors can cause hard to find bugs\n */\n scaleEqual(size) {\n this.setTo(this.x * size, this.y * size);\n return this;\n }\n /**\n * Performs a dot product with another vector\n * @param v The vector to dot\n */\n dot(v) {\n return this.x * v.x + this.y * v.y;\n }\n cross(v) {\n if (v instanceof Vector) {\n return this.x * v.y - this.y * v.x;\n }\n else if (typeof v === 'number') {\n return new Vector(v * this.y, -v * this.x);\n }\n }\n static cross(num, vec) {\n return new Vector(-num * vec.y, num * vec.x);\n }\n /**\n * Returns the perpendicular vector to this one\n */\n perpendicular() {\n return new Vector(this.y, -this.x);\n }\n /**\n * Returns the normal vector to this one, same as the perpendicular of length 1\n */\n normal() {\n return this.perpendicular().normalize();\n }\n /**\n * Negate the current vector\n */\n negate() {\n return this.scale(-1);\n }\n /**\n * Returns the angle of this vector, in range [0, 2*PI)\n */\n toAngle() {\n return (0,_util__WEBPACK_IMPORTED_MODULE_0__.canonicalizeAngle)(Math.atan2(this.y, this.x));\n }\n /**\n * Returns the difference in radians between the angle of this vector and given angle,\n * using the given rotation type.\n * @param angle in radians to which the vector has to be rotated, using {@apilink rotate}\n * @param rotationType what {@apilink RotationType} to use for the rotation\n * @returns the angle by which the vector needs to be rotated to match the given angle\n */\n angleBetween(angle, rotationType) {\n const startAngleRadians = this.toAngle();\n const endAngleRadians = (0,_util__WEBPACK_IMPORTED_MODULE_0__.canonicalizeAngle)(angle);\n let rotationClockwise = 0;\n let rotationAntiClockwise = 0;\n if (endAngleRadians > startAngleRadians) {\n rotationClockwise = endAngleRadians - startAngleRadians;\n }\n else {\n rotationClockwise = (_util__WEBPACK_IMPORTED_MODULE_0__.TwoPI - startAngleRadians + endAngleRadians) % _util__WEBPACK_IMPORTED_MODULE_0__.TwoPI;\n }\n rotationAntiClockwise = (rotationClockwise - _util__WEBPACK_IMPORTED_MODULE_0__.TwoPI) % _util__WEBPACK_IMPORTED_MODULE_0__.TwoPI;\n switch (rotationType) {\n case _rotation_type__WEBPACK_IMPORTED_MODULE_1__.RotationType.ShortestPath:\n if (Math.abs(rotationClockwise) < Math.abs(rotationAntiClockwise)) {\n return rotationClockwise;\n }\n else {\n return rotationAntiClockwise;\n }\n case _rotation_type__WEBPACK_IMPORTED_MODULE_1__.RotationType.LongestPath:\n if (Math.abs(rotationClockwise) > Math.abs(rotationAntiClockwise)) {\n return rotationClockwise;\n }\n else {\n return rotationAntiClockwise;\n }\n case _rotation_type__WEBPACK_IMPORTED_MODULE_1__.RotationType.Clockwise:\n return rotationClockwise;\n case _rotation_type__WEBPACK_IMPORTED_MODULE_1__.RotationType.CounterClockwise:\n return rotationAntiClockwise;\n }\n }\n /**\n * Rotates the current vector around a point by a certain angle in radians.\n * Positive angle means rotation clockwise.\n */\n rotate(angle, anchor, dest) {\n const result = dest || new Vector(0, 0);\n if (!anchor) {\n anchor = new Vector(0, 0);\n }\n const sinAngle = Math.sin(angle);\n const cosAngle = Math.cos(angle);\n const x = cosAngle * (this.x - anchor.x) - sinAngle * (this.y - anchor.y) + anchor.x;\n const y = sinAngle * (this.x - anchor.x) + cosAngle * (this.y - anchor.y) + anchor.y;\n result.x = x;\n result.y = y;\n return result;\n }\n /**\n * Creates new vector that has the same values as the previous.\n */\n clone(dest) {\n const v = dest !== null && dest !== void 0 ? dest : new Vector(0, 0);\n v.x = this.x;\n v.y = this.y;\n return v;\n }\n /**\n * Returns a string representation of the vector.\n */\n toString(fixed) {\n if (fixed) {\n return `(${this.x.toFixed(fixed)}, ${this.y.toFixed(fixed)})`;\n }\n return `(${this.x}, ${this.y})`;\n }\n}\n/**\n * Get or set the vector equals epsilon, by default 0.001 meaning vectors within that tolerance on x or y will be considered equal.\n */\nVector.EQUALS_EPSILON = 0.001;\n/**\n * Shorthand for creating new Vectors - returns a new Vector instance with the\n * provided X and Y components.\n * @param x X component of the Vector\n * @param y Y component of the Vector\n */\nfunction vec(x, y) {\n return new Vector(x, y);\n}\n\n\n/***/ }),\n\n/***/ \"./Math/watch-vector.ts\":\n/*!******************************!*\\\n !*** ./Math/watch-vector.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ WatchVector: () => (/* binding */ WatchVector)\n/* harmony export */ });\n/* harmony import */ var _vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vector */ \"./Math/vector.ts\");\n\n/**\n * Wraps a vector and watches for changes in the x/y, modifies the original vector.\n */\nclass WatchVector extends _vector__WEBPACK_IMPORTED_MODULE_0__.Vector {\n constructor(original, change) {\n super(original.x, original.y);\n this.original = original;\n this.change = change;\n }\n get x() {\n return (this._x = this.original.x);\n }\n set x(newX) {\n if (newX !== this._x) {\n this.change(newX, this._y);\n this._x = this.original.x = newX;\n }\n }\n get y() {\n return (this._y = this.original.y);\n }\n set y(newY) {\n if (newY !== this._y) {\n this.change(this._x, newY);\n this._y = this.original.y = newY;\n }\n }\n setTo(x, y) {\n this.x = x;\n this.y = y;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Particles/EmitterType.ts\":\n/*!**********************************!*\\\n !*** ./Particles/EmitterType.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EmitterType: () => (/* binding */ EmitterType)\n/* harmony export */ });\n/**\n * An enum that represents the types of emitter nozzles\n */\nvar EmitterType;\n(function (EmitterType) {\n /**\n * Constant for the circular emitter type\n */\n EmitterType[\"Circle\"] = \"circle\";\n /**\n * Constant for the rectangular emitter type\n */\n EmitterType[\"Rectangle\"] = \"rectangle\";\n})(EmitterType || (EmitterType = {}));\n\n\n/***/ }),\n\n/***/ \"./Particles/GpuParticleEmitter.ts\":\n/*!*****************************************!*\\\n !*** ./Particles/GpuParticleEmitter.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ GpuParticleEmitter: () => (/* binding */ GpuParticleEmitter)\n/* harmony export */ });\n/* harmony import */ var _Actor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Actor */ \"./Actor.ts\");\n/* harmony import */ var _EmitterType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./EmitterType */ \"./Particles/EmitterType.ts\");\n/* harmony import */ var _Particles__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Particles */ \"./Particles/Particles.ts\");\n/* harmony import */ var _GpuParticleRenderer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./GpuParticleRenderer */ \"./Particles/GpuParticleRenderer.ts\");\n/* harmony import */ var _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Graphics/GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Math_Random__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Math/Random */ \"./Math/Random.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Math */ \"./Math/util.ts\");\n\n\n\n\n\n\n\n\nclass GpuParticleEmitter extends _Actor__WEBPACK_IMPORTED_MODULE_0__.Actor {\n get pos() {\n return this.transform.pos;\n }\n set pos(pos) {\n this.transform.pos = pos;\n }\n get z() {\n return this.transform.z;\n }\n set z(z) {\n this.transform.z = z;\n }\n constructor(config) {\n super({ name: `GpuParticleEmitter`, width: config.width, height: config.height }); // somewhat goofy way of doing width/height\n this.particle = {\n /**\n * Gets or sets the life of each particle in milliseconds\n */\n life: 2000,\n transform: _Particles__WEBPACK_IMPORTED_MODULE_1__.ParticleTransform.Global,\n graphic: undefined,\n opacity: 1,\n angularVelocity: 0,\n focus: undefined,\n focusAccel: undefined,\n randomRotation: false\n };\n this.graphics = new _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_2__.GraphicsComponent();\n this.isEmitting = false;\n this.emitRate = 1;\n this.emitterType = _EmitterType__WEBPACK_IMPORTED_MODULE_3__.EmitterType.Rectangle;\n this.radius = 0;\n this.maxParticles = 2000;\n this._particlesToEmit = 0;\n this.addComponent(this.graphics, true);\n this.graphics.onPostDraw = this.draw.bind(this);\n const { particle, maxParticles, x, y, z, pos, isEmitting, emitRate, emitterType, radius, random } = { ...config };\n this.maxParticles = (0,_Math__WEBPACK_IMPORTED_MODULE_4__.clamp)(maxParticles !== null && maxParticles !== void 0 ? maxParticles : this.maxParticles, 0, _GpuParticleRenderer__WEBPACK_IMPORTED_MODULE_5__.GpuParticleRenderer.GPU_MAX_PARTICLES);\n this.pos = pos !== null && pos !== void 0 ? pos : (0,_Math_vector__WEBPACK_IMPORTED_MODULE_6__.vec)(x !== null && x !== void 0 ? x : 0, y !== null && y !== void 0 ? y : 0);\n this.z = z !== null && z !== void 0 ? z : 0;\n this.isEmitting = isEmitting !== null && isEmitting !== void 0 ? isEmitting : this.isEmitting;\n this.emitRate = emitRate !== null && emitRate !== void 0 ? emitRate : this.emitRate;\n this.emitterType = emitterType !== null && emitterType !== void 0 ? emitterType : this.emitterType;\n this.radius = radius !== null && radius !== void 0 ? radius : this.radius;\n this.particle = { ...this.particle, ...particle };\n this.random = random !== null && random !== void 0 ? random : new _Math_Random__WEBPACK_IMPORTED_MODULE_7__.Random();\n this.renderer = new _GpuParticleRenderer__WEBPACK_IMPORTED_MODULE_5__.GpuParticleRenderer(this, this.random, this.particle);\n }\n _initialize(engine) {\n super._initialize(engine);\n const context = engine.graphicsContext;\n this.renderer.initialize(context.__gl, context);\n }\n update(engine, elapsed) {\n super.update(engine, elapsed);\n if (this.isEmitting) {\n this._particlesToEmit += this.emitRate * (elapsed / 1000);\n if (this._particlesToEmit > 1.0) {\n this.emitParticles(Math.floor(this._particlesToEmit));\n this._particlesToEmit = this._particlesToEmit - Math.floor(this._particlesToEmit);\n }\n }\n this.renderer.update(elapsed);\n }\n emitParticles(particleCount) {\n if (particleCount <= 0) {\n return;\n }\n this.renderer.emitParticles(particleCount | 0); // coerce to integer\n }\n clearParticles() {\n this.renderer.clearParticles();\n }\n draw(ctx, elapsed) {\n ctx.draw('ex.particle', this.renderer, elapsed);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Particles/GpuParticleRenderer.ts\":\n/*!******************************************!*\\\n !*** ./Particles/GpuParticleRenderer.ts ***!\n \\******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ GpuParticleRenderer: () => (/* binding */ GpuParticleRenderer)\n/* harmony export */ });\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Particles__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Particles */ \"./Particles/Particles.ts\");\n/* harmony import */ var _EmitterType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./EmitterType */ \"./Particles/EmitterType.ts\");\n/* harmony import */ var _Util_Assert__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Util/Assert */ \"./Util/Assert.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n\n\n\n\n\n/**\n * Container for the GPU Particle State contains the internal state needed for the GPU\n * to render particles and maintain state.\n */\nclass GpuParticleRenderer {\n constructor(emitter, random, options) {\n var _a;\n this.emitRate = 1;\n this._initialized = false;\n this._vaos = [];\n this._buffers = [];\n this._drawIndex = 0;\n this._numInputFloats = 2 + 2 + 1 + 1 + 1;\n this._particleIndex = 0;\n this._uploadIndex = 0;\n this._wrappedLife = 0;\n this._wrappedParticles = 0;\n this._particleLife = 0;\n this._clearRequested = false;\n this._emitted = [];\n this.emitter = emitter;\n this.particle = options;\n this._particleData = new Float32Array(this.emitter.maxParticles * this._numInputFloats);\n this._random = random;\n this._particleLife = (_a = this.particle.life) !== null && _a !== void 0 ? _a : 2000;\n }\n get isInitialized() {\n return this._initialized;\n }\n get maxParticles() {\n return this.emitter.maxParticles;\n }\n initialize(gl, context) {\n if (this._initialized) {\n return;\n }\n const numParticles = this.emitter.maxParticles;\n const numInputFloats = this._numInputFloats;\n const particleData = this._particleData;\n const bytesPerFloat = 4;\n const particleDataBuffer1 = gl.createBuffer();\n const vao1 = gl.createVertexArray();\n gl.bindVertexArray(vao1);\n gl.bindBuffer(gl.ARRAY_BUFFER, particleDataBuffer1);\n gl.bufferData(gl.ARRAY_BUFFER, numParticles * numInputFloats * bytesPerFloat, gl.DYNAMIC_DRAW);\n gl.bufferSubData(gl.ARRAY_BUFFER, 0, particleData);\n let offset = 0;\n // position\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, numInputFloats * bytesPerFloat, 0);\n offset += bytesPerFloat * 2;\n // velocity\n gl.vertexAttribPointer(1, 2, gl.FLOAT, false, numInputFloats * bytesPerFloat, offset);\n offset += bytesPerFloat * 2;\n // rotation\n gl.vertexAttribPointer(2, 1, gl.FLOAT, false, numInputFloats * bytesPerFloat, offset);\n offset += bytesPerFloat * 1;\n // angularVelocity\n gl.vertexAttribPointer(3, 1, gl.FLOAT, false, numInputFloats * bytesPerFloat, offset);\n offset += bytesPerFloat * 1;\n // life\n gl.vertexAttribPointer(4, 1, gl.FLOAT, false, numInputFloats * bytesPerFloat, offset);\n offset += bytesPerFloat * 1;\n // enable attributes\n gl.enableVertexAttribArray(0);\n gl.enableVertexAttribArray(1);\n gl.enableVertexAttribArray(2);\n gl.enableVertexAttribArray(3);\n gl.enableVertexAttribArray(4);\n this._vaos.push(vao1);\n this._buffers.push(particleDataBuffer1);\n // Clean up\n gl.bindVertexArray(null);\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n const particleDataBuffer2 = gl.createBuffer();\n const vao2 = gl.createVertexArray();\n gl.bindVertexArray(vao2);\n gl.bindBuffer(gl.ARRAY_BUFFER, particleDataBuffer2);\n gl.bufferData(gl.ARRAY_BUFFER, numParticles * numInputFloats * bytesPerFloat, gl.DYNAMIC_DRAW);\n offset = 0;\n // position\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, numInputFloats * bytesPerFloat, 0);\n offset += bytesPerFloat * 2;\n // velocity\n gl.vertexAttribPointer(1, 2, gl.FLOAT, false, numInputFloats * bytesPerFloat, offset);\n offset += bytesPerFloat * 2;\n // rotation\n gl.vertexAttribPointer(2, 1, gl.FLOAT, false, numInputFloats * bytesPerFloat, offset);\n offset += bytesPerFloat * 1;\n // angularVelocity\n gl.vertexAttribPointer(3, 1, gl.FLOAT, false, numInputFloats * bytesPerFloat, offset);\n offset += bytesPerFloat * 1;\n // life\n gl.vertexAttribPointer(4, 1, gl.FLOAT, false, numInputFloats * bytesPerFloat, offset);\n offset += bytesPerFloat * 1;\n // enable attributes\n gl.enableVertexAttribArray(0);\n gl.enableVertexAttribArray(1);\n gl.enableVertexAttribArray(2);\n gl.enableVertexAttribArray(3);\n gl.enableVertexAttribArray(4);\n this._vaos.push(vao2);\n this._buffers.push(particleDataBuffer2);\n // Clean up\n gl.bindVertexArray(null);\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n this._currentVao = this._vaos[this._drawIndex % 2];\n this._currentBuffer = this._buffers[(this._drawIndex + 1) % 2];\n this._initialized = true;\n }\n clearParticles() {\n this._particleData.fill(0);\n this._clearRequested = true;\n }\n emitParticles(particleCount) {\n const startIndex = this._particleIndex;\n const maxSize = this.maxParticles * this._numInputFloats;\n const endIndex = particleCount * this._numInputFloats + startIndex;\n let countParticle = 0;\n for (let i = startIndex; i < endIndex; i += this._numInputFloats) {\n const angle = this._random.floating(this.particle.minAngle || 0, this.particle.maxAngle || _Math_util__WEBPACK_IMPORTED_MODULE_0__.TwoPI);\n const speedX = this._random.floating(this.particle.minSpeed || 0, this.particle.maxSpeed || 0);\n const speedY = this._random.floating(this.particle.minSpeed || 0, this.particle.maxSpeed || 0);\n const dx = speedX * Math.cos(angle);\n const dy = speedY * Math.sin(angle);\n let ranX = 0;\n let ranY = 0;\n if (this.emitter.emitterType === _EmitterType__WEBPACK_IMPORTED_MODULE_1__.EmitterType.Rectangle) {\n ranX = this._random.floating(-0.5, 0.5) * this.emitter.width;\n ranY = this._random.floating(-0.5, 0.5) * this.emitter.height;\n }\n else {\n const radius = this._random.floating(0, this.emitter.radius);\n ranX = radius * Math.cos(angle);\n ranY = radius * Math.sin(angle);\n }\n const tx = this.emitter.transform.apply((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(ranX, ranY));\n const data = [\n this.particle.transform === _Particles__WEBPACK_IMPORTED_MODULE_3__.ParticleTransform.Local ? ranX : tx.x,\n this.particle.transform === _Particles__WEBPACK_IMPORTED_MODULE_3__.ParticleTransform.Local ? ranY : tx.y, // pos in world space\n dx,\n dy, // velocity\n this.particle.randomRotation ? (0,_Math_util__WEBPACK_IMPORTED_MODULE_0__.randomInRange)(0, _Math_util__WEBPACK_IMPORTED_MODULE_0__.TwoPI, this._random) : this.particle.rotation || 0, // rotation\n this.particle.angularVelocity || 0, // angular velocity\n this._particleLife // life\n ];\n countParticle++;\n this._particleData.set(data, i % this._particleData.length);\n }\n if (endIndex >= maxSize) {\n this._wrappedParticles += (endIndex - maxSize) / this._numInputFloats;\n this._wrappedLife = this._particleLife;\n }\n else if (this._wrappedLife > 0) {\n this._wrappedParticles += particleCount;\n }\n this._particleIndex = endIndex % maxSize;\n this._emitted.push([this._particleLife, startIndex]);\n }\n _uploadEmitted(gl) {\n // upload index is the index of the previous upload\n // particle index is the current index of modification\n if (this._particleIndex !== this._uploadIndex) {\n // Bind one buffer to ARRAY_BUFFER and the other to TFB\n gl.bindBuffer(gl.ARRAY_BUFFER, this._buffers[(this._drawIndex + 1) % 2]);\n if (this._particleIndex >= this._uploadIndex) {\n gl.bufferSubData(gl.ARRAY_BUFFER, this._uploadIndex * 4, // dst byte offset 4 bytes per float\n this._particleData, this._uploadIndex, this._particleIndex - this._uploadIndex);\n }\n else {\n // upload before the wrap\n // prettier-ignore\n gl.bufferSubData(gl.ARRAY_BUFFER, this._uploadIndex * 4, this._particleData, this._uploadIndex, this._particleData.length - this._uploadIndex);\n // upload after the wrap if there are any\n if (this._wrappedParticles) {\n // prettier-ignore\n gl.bufferSubData(gl.ARRAY_BUFFER, 0, this._particleData, 0, this._wrappedParticles * this._numInputFloats);\n }\n this._wrappedLife = this._particleLife;\n }\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n }\n this._uploadIndex = this._particleIndex % (this.maxParticles * this._numInputFloats);\n }\n update(elapsed) {\n var _a;\n this._particleLife = (_a = this.particle.life) !== null && _a !== void 0 ? _a : this._particleLife;\n if (this._wrappedLife > 0) {\n this._wrappedLife -= elapsed;\n }\n else {\n this._wrappedLife = 0;\n this._wrappedParticles = 0;\n }\n if (!this._emitted.length) {\n return;\n }\n for (let i = this._emitted.length - 1; i >= 0; i--) {\n const particle = this._emitted[i];\n particle[0] -= elapsed;\n const life = particle[0];\n if (life <= 0) {\n this._emitted.splice(i, 1);\n }\n }\n this._emitted.sort((a, b) => a[0] - b[0]);\n }\n draw(gl) {\n if (this._initialized) {\n // Emit\n if (this._clearRequested) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this._buffers[(this._drawIndex + 1) % 2]);\n gl.bufferSubData(gl.ARRAY_BUFFER, 0, this._particleData);\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n this._clearRequested = false;\n }\n else {\n this._uploadEmitted(gl);\n }\n // Bind one buffer to ARRAY_BUFFER and the other to transform feedback buffer\n gl.bindVertexArray(this._currentVao);\n gl.bindBufferBase(gl.TRANSFORM_FEEDBACK_BUFFER, 0, this._currentBuffer);\n // Perform transform feedback (run the simulation) and the draw call all at once\n if (this._wrappedLife && this._emitted[0] && this._emitted[0][1] > 0) {\n const midpoint = this._emitted[0][1] / this._numInputFloats;\n // draw oldest first (maybe make configurable)\n (0,_Util_Assert__WEBPACK_IMPORTED_MODULE_4__.assert)(`midpoint greater than 0, actual: ${midpoint}`, () => midpoint > 0);\n (0,_Util_Assert__WEBPACK_IMPORTED_MODULE_4__.assert)(`midpoint is less than max, actual: ${midpoint}`, () => midpoint < this.maxParticles);\n gl.bindBufferRange(gl.TRANSFORM_FEEDBACK_BUFFER, 0, this._currentBuffer, this._emitted[0][1] * 4, (this.maxParticles - midpoint) * this._numInputFloats * 4);\n gl.beginTransformFeedback(gl.POINTS);\n gl.drawArrays(gl.POINTS, midpoint, this.maxParticles - midpoint);\n gl.endTransformFeedback();\n // then draw newer particles\n gl.bindBufferRange(gl.TRANSFORM_FEEDBACK_BUFFER, 0, this._currentBuffer, 0, this._emitted[0][1] * 4);\n gl.beginTransformFeedback(gl.POINTS);\n gl.drawArrays(gl.POINTS, 0, midpoint);\n gl.endTransformFeedback();\n }\n else {\n gl.bindBufferRange(gl.TRANSFORM_FEEDBACK_BUFFER, 0, this._currentBuffer, 0, this._particleData.length * 4);\n gl.beginTransformFeedback(gl.POINTS);\n gl.drawArrays(gl.POINTS, 0, this.maxParticles);\n gl.endTransformFeedback();\n }\n // Clean up after ourselves to avoid errors.\n gl.bindVertexArray(null);\n gl.bindBufferBase(gl.TRANSFORM_FEEDBACK_BUFFER, 0, null);\n // flip flop buffers, one will be draw the other simulation\n this._currentVao = this._vaos[this._drawIndex % 2];\n this._currentBuffer = this._buffers[(this._drawIndex + 1) % 2];\n this._drawIndex = (this._drawIndex + 1) % 2;\n }\n }\n}\nGpuParticleRenderer.GPU_MAX_PARTICLES = 100000;\n\n\n/***/ }),\n\n/***/ \"./Particles/ParticleEmitter.ts\":\n/*!**************************************!*\\\n !*** ./Particles/ParticleEmitter.ts ***!\n \\**************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ParticleEmitter: () => (/* binding */ ParticleEmitter)\n/* harmony export */ });\n/* harmony import */ var _Actor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Actor */ \"./Actor.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math_Random__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Math/Random */ \"./Math/Random.ts\");\n/* harmony import */ var _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Collision/CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _EmitterType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./EmitterType */ \"./Particles/EmitterType.ts\");\n/* harmony import */ var _Particles__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Particles */ \"./Particles/Particles.ts\");\n/* harmony import */ var _Util_RentalPool__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/RentalPool */ \"./Util/RentalPool.ts\");\n\n\n\n\n\n\n\n\n/**\n * Using a particle emitter is a great way to create interesting effects\n * in your game, like smoke, fire, water, explosions, etc. `ParticleEmitter`\n * extend {@apilink Actor} allowing you to use all of the features that come with.\n *\n * These particles are simulated on the CPU in JavaScript\n */\nclass ParticleEmitter extends _Actor__WEBPACK_IMPORTED_MODULE_0__.Actor {\n /**\n * @param config particle emitter options bag\n */\n constructor(config) {\n var _a, _b;\n super({ width: (_a = config.width) !== null && _a !== void 0 ? _a : 0, height: (_b = config.height) !== null && _b !== void 0 ? _b : 0 });\n this._particlesToEmit = 0;\n this._particlePool = new _Util_RentalPool__WEBPACK_IMPORTED_MODULE_1__.RentalPool(() => new _Particles__WEBPACK_IMPORTED_MODULE_2__.Particle({}), (p) => p, 500);\n this.numParticles = 0;\n /**\n * Gets or sets the isEmitting flag\n */\n this.isEmitting = true;\n /**\n * Gets or sets the backing deadParticle collection\n */\n this.deadParticles = [];\n /**\n * Gets or sets the emission rate for particles (particles/sec)\n */\n this.emitRate = 1; //particles/sec\n /**\n * Gets or sets the emitter type for the particle emitter\n */\n this.emitterType = _EmitterType__WEBPACK_IMPORTED_MODULE_3__.EmitterType.Rectangle;\n /**\n * Gets or sets the emitter radius, only takes effect when the {@apilink emitterType} is {@apilink EmitterType.Circle}\n */\n this.radius = 0;\n this.particle = {\n /**\n * Gets or sets the life of each particle in milliseconds\n */\n life: 2000,\n transform: _Particles__WEBPACK_IMPORTED_MODULE_2__.ParticleTransform.Global,\n graphic: undefined,\n opacity: 1,\n angularVelocity: 0,\n focus: undefined,\n focusAccel: undefined,\n randomRotation: false\n };\n this._activeParticles = [];\n const { particle, x, y, z, pos, isEmitting, emitRate, emitterType, radius, random } = { ...config };\n this.particle = { ...this.particle, ...particle };\n this.pos = pos !== null && pos !== void 0 ? pos : (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(x !== null && x !== void 0 ? x : 0, y !== null && y !== void 0 ? y : 0);\n this.z = z !== null && z !== void 0 ? z : 0;\n this.isEmitting = isEmitting !== null && isEmitting !== void 0 ? isEmitting : this.isEmitting;\n this.emitRate = emitRate !== null && emitRate !== void 0 ? emitRate : this.emitRate;\n this.emitterType = emitterType !== null && emitterType !== void 0 ? emitterType : this.emitterType;\n this.radius = radius !== null && radius !== void 0 ? radius : this.radius;\n this.body.collisionType = _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_5__.CollisionType.PreventCollision;\n this.random = random !== null && random !== void 0 ? random : new _Math_Random__WEBPACK_IMPORTED_MODULE_6__.Random();\n }\n removeParticle(particle) {\n this.deadParticles.push(particle);\n }\n /**\n * Causes the emitter to emit particles\n * @param particleCount Number of particles to emit right now\n */\n emitParticles(particleCount) {\n var _a;\n if (particleCount <= 0) {\n return;\n }\n particleCount = particleCount | 0; // coerce to int\n for (let i = 0; i < particleCount; i++) {\n const p = this._createParticle();\n if ((_a = this === null || this === void 0 ? void 0 : this.scene) === null || _a === void 0 ? void 0 : _a.world) {\n if (this.particle.transform === _Particles__WEBPACK_IMPORTED_MODULE_2__.ParticleTransform.Global) {\n this.scene.world.add(p);\n }\n else {\n this.addChild(p);\n }\n }\n this._activeParticles.push(p);\n }\n }\n clearParticles() {\n for (let i = 0; i < this._activeParticles.length; i++) {\n this.removeParticle(this._activeParticles[i]);\n }\n }\n // Creates a new particle given the constraints of the emitter\n _createParticle() {\n let ranX = 0;\n let ranY = 0;\n const angle = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.randomInRange)(this.particle.minAngle || 0, this.particle.maxAngle || Math.PI * 2, this.random);\n const vel = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.randomInRange)(this.particle.minSpeed || 0, this.particle.maxSpeed || 0, this.random);\n const size = this.particle.startSize || (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.randomInRange)(this.particle.minSize || 5, this.particle.maxSize || 5, this.random);\n const dx = vel * Math.cos(angle);\n const dy = vel * Math.sin(angle);\n if (this.emitterType === _EmitterType__WEBPACK_IMPORTED_MODULE_3__.EmitterType.Rectangle) {\n ranX = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.randomInRange)(0, this.width, this.random);\n ranY = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.randomInRange)(0, this.height, this.random);\n }\n else if (this.emitterType === _EmitterType__WEBPACK_IMPORTED_MODULE_3__.EmitterType.Circle) {\n const radius = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.randomInRange)(0, this.radius, this.random);\n ranX = radius * Math.cos(angle);\n ranY = radius * Math.sin(angle);\n }\n const p = this._particlePool.rent();\n p.configure({\n life: this.particle.life,\n opacity: this.particle.opacity,\n beginColor: this.particle.beginColor,\n endColor: this.particle.endColor,\n pos: (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(ranX, ranY),\n vel: (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(dx, dy),\n acc: this.particle.acc,\n angularVelocity: this.particle.angularVelocity,\n startSize: this.particle.startSize,\n endSize: this.particle.endSize,\n size: size,\n graphic: this.particle.graphic,\n fade: this.particle.fade\n });\n p.registerEmitter(this);\n if (this.particle.randomRotation) {\n p.transform.rotation = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.randomInRange)(0, Math.PI * 2, this.random);\n }\n if (this.particle.focus) {\n p.focus = this.particle.focus.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(this.pos.x, this.pos.y));\n p.focusAccel = this.particle.focusAccel;\n }\n return p;\n }\n update(engine, elapsed) {\n var _a;\n super.update(engine, elapsed);\n if (this.isEmitting) {\n this._particlesToEmit += this.emitRate * (elapsed / 1000);\n if (this._particlesToEmit > 1.0) {\n this.emitParticles(Math.floor(this._particlesToEmit));\n this._particlesToEmit = this._particlesToEmit - Math.floor(this._particlesToEmit);\n }\n }\n // deferred removal\n for (let i = 0; i < this.deadParticles.length; i++) {\n if ((_a = this === null || this === void 0 ? void 0 : this.scene) === null || _a === void 0 ? void 0 : _a.world) {\n this.scene.world.remove(this.deadParticles[i], false);\n this._particlePool.return(this.deadParticles[i]);\n }\n const index = this._activeParticles.indexOf(this.deadParticles[i]);\n if (index > -1) {\n this._activeParticles.splice(index, 1);\n }\n }\n this.deadParticles.length = 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Particles/Particles.ts\":\n/*!********************************!*\\\n !*** ./Particles/Particles.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Particle: () => (/* binding */ Particle),\n/* harmony export */ ParticleTransform: () => (/* binding */ ParticleTransform)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Graphics/GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _Collision_Integrator__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Collision/Integrator */ \"./Collision/Integrator.ts\");\n\n\n\n\n\n\n\n\n\n/**\n/**\n * CPU Particle is used in a {@apilink ParticleEmitter}\n */\nclass Particle extends _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__.Entity {\n constructor(options) {\n super({ silenceWarnings: true });\n this.beginColor = _Color__WEBPACK_IMPORTED_MODULE_1__.Color.White;\n this.endColor = _Color__WEBPACK_IMPORTED_MODULE_1__.Color.White;\n // Life is counted in ms\n this.life = 300;\n this.fade = false;\n // Color transitions\n this._rRate = 1;\n this._gRate = 1;\n this._bRate = 1;\n this._aRate = 0;\n this._currentColor = _Color__WEBPACK_IMPORTED_MODULE_1__.Color.White;\n this.size = 5;\n this.sizeRate = 0;\n this.visible = true;\n this.isOffscreen = false;\n this.particleTransform = ParticleTransform.Global;\n this.name = `Particle#${this.id}`;\n this.addComponent((this.transform = new _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent()));\n this.addComponent((this.motion = new _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_3__.MotionComponent()));\n this.addComponent((this.graphics = new _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_4__.GraphicsComponent()));\n this.configure(options);\n }\n registerEmitter(emitter) {\n this._emitter = emitter;\n if (this.particleTransform === ParticleTransform.Global) {\n const globalPos = this._emitter.transform.globalPos;\n this.transform.pos = this.transform.pos.add(globalPos);\n this.motion.vel = this.motion.vel.rotate(this._emitter.transform.globalRotation);\n }\n }\n configure(options) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;\n this.particleTransform = (_a = options.transform) !== null && _a !== void 0 ? _a : this.particleTransform;\n this.life = (_b = options.life) !== null && _b !== void 0 ? _b : this.life;\n this.fade = (_c = options.fade) !== null && _c !== void 0 ? _c : this.fade;\n this.size = (_d = options.size) !== null && _d !== void 0 ? _d : this.size;\n this.endColor = (_e = options.endColor) !== null && _e !== void 0 ? _e : this.endColor.clone();\n this.beginColor = (_f = options.beginColor) !== null && _f !== void 0 ? _f : this.beginColor.clone();\n this._currentColor = this.beginColor.clone();\n this.graphic = options.graphic;\n this.graphics.opacity = (_g = options.opacity) !== null && _g !== void 0 ? _g : this.graphics.opacity;\n this.transform.pos = (_h = options.pos) !== null && _h !== void 0 ? _h : this.transform.pos;\n this.transform.rotation = (_j = options.rotation) !== null && _j !== void 0 ? _j : 0;\n this.transform.scale = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_5__.vec)(1, 1);\n this.motion.vel = (_k = options.vel) !== null && _k !== void 0 ? _k : this.motion.vel;\n this.motion.angularVelocity = (_l = options.angularVelocity) !== null && _l !== void 0 ? _l : 0;\n this.motion.acc = (_m = options.acc) !== null && _m !== void 0 ? _m : this.motion.acc;\n this._rRate = (this.endColor.r - this.beginColor.r) / this.life;\n this._gRate = (this.endColor.g - this.beginColor.g) / this.life;\n this._bRate = (this.endColor.b - this.beginColor.b) / this.life;\n this._aRate = this.graphics.opacity / this.life;\n this.startSize = (_o = options.startSize) !== null && _o !== void 0 ? _o : 0;\n this.endSize = (_p = options.endSize) !== null && _p !== void 0 ? _p : 0;\n if (this.endSize > 0 && this.startSize > 0) {\n this.sizeRate = (this.endSize - this.startSize) / this.life;\n this.size = this.startSize;\n }\n if (this.graphic) {\n this.graphics.use(this.graphic);\n this.graphics.onPostDraw = undefined;\n }\n else {\n this.graphics.localBounds = _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox.fromDimension(this.size, this.size, _Math_vector__WEBPACK_IMPORTED_MODULE_5__.Vector.Half);\n this.graphics.onPostDraw = (ctx) => {\n ctx.save();\n ctx.debug.drawPoint((0,_Math_vector__WEBPACK_IMPORTED_MODULE_5__.vec)(0, 0), { color: this._currentColor, size: this.size });\n ctx.restore();\n };\n }\n }\n kill() {\n var _a;\n if ((_a = this._emitter) === null || _a === void 0 ? void 0 : _a.isActive) {\n this._emitter.removeParticle(this);\n }\n else {\n super.kill();\n }\n }\n update(engine, elapsed) {\n this.life = this.life - elapsed;\n if (this.life < 0) {\n this.kill();\n }\n if (this.fade) {\n this.graphics.opacity = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.clamp)(this._aRate * this.life, 0.0001, 1);\n }\n if (this.startSize && this.endSize && this.startSize > 0 && this.endSize > 0) {\n this.size = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.clamp)(this.sizeRate * elapsed + this.size, Math.min(this.startSize, this.endSize), Math.max(this.startSize, this.endSize));\n }\n this._currentColor.r = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.clamp)(this._currentColor.r + this._rRate * elapsed, 0, 255);\n this._currentColor.g = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.clamp)(this._currentColor.g + this._gRate * elapsed, 0, 255);\n this._currentColor.b = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.clamp)(this._currentColor.b + this._bRate * elapsed, 0, 255);\n this._currentColor.a = this.graphics.opacity;\n let accel = this.motion.acc;\n if (this.focus) {\n accel = this.focus\n .sub(this.transform.pos)\n .normalize()\n .scale(this.focusAccel || 0)\n .scale(elapsed / 1000);\n }\n // Update transform and motion based on Euler linear algebra\n _Collision_Integrator__WEBPACK_IMPORTED_MODULE_8__.EulerIntegrator.integrate(this.transform, this.motion, accel, elapsed);\n }\n}\nParticle.DefaultConfig = {\n beginColor: _Color__WEBPACK_IMPORTED_MODULE_1__.Color.White,\n endColor: _Color__WEBPACK_IMPORTED_MODULE_1__.Color.White,\n life: 300,\n fade: false,\n size: 5,\n graphic: undefined,\n startSize: undefined,\n endSize: undefined\n};\nvar ParticleTransform;\n(function (ParticleTransform) {\n /**\n * {@apilink ParticleTransform.Global} is the default and emits particles as if\n * they were world space objects, useful for most effects.\n */\n ParticleTransform[\"Global\"] = \"global\";\n /**\n * {@apilink ParticleTransform.Local} particles are children of the emitter and move relative to the emitter\n * as they would in a parent/child actor relationship.\n */\n ParticleTransform[\"Local\"] = \"local\";\n})(ParticleTransform || (ParticleTransform = {}));\n\n\n/***/ }),\n\n/***/ \"./Particles/index.ts\":\n/*!****************************!*\\\n !*** ./Particles/index.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EmitterType: () => (/* reexport safe */ _EmitterType__WEBPACK_IMPORTED_MODULE_0__.EmitterType),\n/* harmony export */ GpuParticleEmitter: () => (/* reexport safe */ _GpuParticleEmitter__WEBPACK_IMPORTED_MODULE_3__.GpuParticleEmitter),\n/* harmony export */ GpuParticleRenderer: () => (/* reexport safe */ _GpuParticleRenderer__WEBPACK_IMPORTED_MODULE_4__.GpuParticleRenderer),\n/* harmony export */ Particle: () => (/* reexport safe */ _Particles__WEBPACK_IMPORTED_MODULE_1__.Particle),\n/* harmony export */ ParticleEmitter: () => (/* reexport safe */ _ParticleEmitter__WEBPACK_IMPORTED_MODULE_2__.ParticleEmitter),\n/* harmony export */ ParticleTransform: () => (/* reexport safe */ _Particles__WEBPACK_IMPORTED_MODULE_1__.ParticleTransform)\n/* harmony export */ });\n/* harmony import */ var _EmitterType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./EmitterType */ \"./Particles/EmitterType.ts\");\n/* harmony import */ var _Particles__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Particles */ \"./Particles/Particles.ts\");\n/* harmony import */ var _ParticleEmitter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ParticleEmitter */ \"./Particles/ParticleEmitter.ts\");\n/* harmony import */ var _GpuParticleEmitter__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./GpuParticleEmitter */ \"./Particles/GpuParticleEmitter.ts\");\n/* harmony import */ var _GpuParticleRenderer__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./GpuParticleRenderer */ \"./Particles/GpuParticleRenderer.ts\");\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Polyfill.ts\":\n/*!*********************!*\\\n !*** ./Polyfill.ts ***!\n \\*********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ polyfill: () => (/* binding */ polyfill)\n/* harmony export */ });\n/**\n * Polyfill adding function\n */\nfunction polyfill() {\n /* istanbul ignore next */\n if (typeof window === 'undefined') {\n window = {\n audioContext: function () {\n return;\n }\n };\n }\n /* istanbul ignore next */\n if (typeof window !== 'undefined' && !window.requestAnimationFrame) {\n window.requestAnimationFrame =\n window.webkitRequestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n function (callback) {\n window.setInterval(callback, 1000 / 60);\n };\n }\n /* istanbul ignore next */\n if (typeof window !== 'undefined' && !window.cancelAnimationFrame) {\n window.cancelAnimationFrame =\n window.webkitCancelAnimationFrame ||\n window.mozCancelAnimationFrame ||\n function () {\n return;\n };\n }\n /* istanbul ignore next */\n if (typeof window !== 'undefined' && !window.AudioContext) {\n if (window.webkitAudioContext) {\n const ctx = window.webkitAudioContext;\n const replaceMe = ctx.prototype.decodeAudioData;\n window.webkitAudioContext.prototype.decodeAudioData = function (arrayBuffer) {\n return new Promise((resolve, reject) => {\n replaceMe.call(this, arrayBuffer, resolve, reject);\n });\n };\n }\n window.AudioContext =\n window.AudioContext ||\n window.webkitAudioContext ||\n window.mozAudioContext ||\n window.msAudioContext ||\n window.oAudioContext;\n }\n /* istanbul ignore next */\n if (typeof window !== 'undefined' && !window.devicePixelRatio) {\n window.devicePixelRatio = window.devicePixelRatio || 1;\n }\n /* istanbul ignore next */\n if (typeof window !== 'undefined' && !window.requestIdleCallback) {\n // Adapted from https://developer.chrome.com/blog/using-requestidlecallback#checking_for_requestidlecallback\n window.requestIdleCallback =\n window.requestIdleCallback ||\n function (cb) {\n const start = Date.now();\n return setTimeout(function () {\n cb({\n didTimeout: false,\n timeRemaining: function () {\n return Math.max(0, 50 - (Date.now() - start));\n }\n });\n }, 1);\n };\n window.cancelIdleCallback =\n window.cancelIdleCallback ||\n function (id) {\n clearTimeout(id);\n };\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Resources/Font.ts\":\n/*!***************************!*\\\n !*** ./Resources/Font.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FontSource: () => (/* binding */ FontSource)\n/* harmony export */ });\n/* harmony import */ var _Graphics_Font__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Graphics/Font */ \"./Graphics/Font.ts\");\n/* harmony import */ var _Resource__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Resource */ \"./Resources/Resource.ts\");\n\n\nclass FontSource {\n constructor(\n /**\n * Path to the font resource relative from the HTML document hosting the game, or absolute\n */\n path, \n /**\n * The font family name\n */\n family, { bustCache, ...options } = {}) {\n this.path = path;\n this.family = family;\n this._isLoaded = false;\n this._resource = new _Resource__WEBPACK_IMPORTED_MODULE_0__.Resource(path, 'blob', bustCache);\n this._options = options;\n }\n async load() {\n if (this.isLoaded()) {\n return this.data;\n }\n try {\n const blob = await this._resource.load();\n const url = URL.createObjectURL(blob);\n if (!this.data) {\n this.data = new FontFace(this.family, `url(${url})`);\n document.fonts.add(this.data);\n }\n await this.data.load();\n this._isLoaded = true;\n }\n catch (error) {\n throw `Error loading FontSource from path '${this.path}' with error [${error.message}]`;\n }\n return this.data;\n }\n isLoaded() {\n return this._isLoaded;\n }\n /**\n * Build a font from this FontSource.\n * @param options {FontOptions} Override the font options\n */\n toFont(options) {\n return new _Graphics_Font__WEBPACK_IMPORTED_MODULE_1__.Font({ family: this.family, ...this._options, ...options });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Resources/Gif.ts\":\n/*!**************************!*\\\n !*** ./Resources/Gif.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Gif: () => (/* binding */ Gif),\n/* harmony export */ GifParser: () => (/* binding */ GifParser),\n/* harmony export */ Stream: () => (/* binding */ Stream)\n/* harmony export */ });\n/* harmony import */ var _Resource__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Resource */ \"./Resources/Resource.ts\");\n/* harmony import */ var _Graphics_SpriteSheet__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Graphics/SpriteSheet */ \"./Graphics/SpriteSheet.ts\");\n/* harmony import */ var _Graphics_Animation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Graphics/Animation */ \"./Graphics/Animation.ts\");\n/* harmony import */ var _Graphics_ImageSource__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Graphics/ImageSource */ \"./Graphics/ImageSource.ts\");\n\n\n\n\n/**\n * The {@apilink Texture} object allows games built in Excalibur to load image resources.\n * {@apilink Texture} is an {@apilink Loadable} which means it can be passed to a {@apilink Loader}\n * to pre-load before starting a level or game.\n */\nclass Gif {\n /**\n * @param path Path to the image resource\n * @param bustCache Optionally load texture with cache busting\n */\n constructor(path, bustCache = false) {\n this.path = path;\n /**\n * The width of the texture in pixels\n */\n this.width = 0;\n /**\n * The height of the texture in pixels\n */\n this.height = 0;\n this._images = [];\n this.data = [];\n this._sprites = [];\n this._resource = new _Resource__WEBPACK_IMPORTED_MODULE_0__.Resource(path, 'arraybuffer', bustCache);\n }\n /**\n * Should excalibur add a cache busting querystring? By default false.\n * Must be set before loading\n */\n get bustCache() {\n return this._resource.bustCache;\n }\n set bustCache(val) {\n this._resource.bustCache = val;\n }\n /**\n * Begins loading the texture and returns a promise to be resolved on completion\n */\n async load() {\n const arraybuffer = await this._resource.load();\n this._stream = new Stream(arraybuffer);\n this._gif = new GifParser(this._stream);\n const images = this._gif.images.map((i) => new _Graphics_ImageSource__WEBPACK_IMPORTED_MODULE_1__.ImageSource(i.src, false));\n // Load all textures\n await Promise.all(images.map((t) => t.load()));\n this.data = this._images = images;\n this._sprites = this._images.map((image) => {\n return image.toSprite();\n });\n return this.data;\n }\n isLoaded() {\n return !!this.data;\n }\n /**\n * Return a frame of the gif as a sprite by id\n * @param id\n */\n toSprite(id = 0) {\n var _a;\n return (_a = this._sprites[id]) !== null && _a !== void 0 ? _a : null;\n }\n /**\n * Return the gif as a spritesheet\n */\n toSpriteSheet() {\n const sprites = this._sprites;\n if (sprites.length) {\n return new _Graphics_SpriteSheet__WEBPACK_IMPORTED_MODULE_2__.SpriteSheet({ sprites });\n }\n return null;\n }\n /**\n * Transform the GIF into an animation with duration per frame\n * @param durationPerFrame Optionally override duration per frame\n */\n toAnimation(durationPerFrame) {\n var _a;\n const images = (_a = this._gif) === null || _a === void 0 ? void 0 : _a.images;\n if (images === null || images === void 0 ? void 0 : images.length) {\n const frames = images.map((image, index) => {\n var _a;\n return {\n graphic: this._sprites[index],\n duration: ((_a = this._gif) === null || _a === void 0 ? void 0 : _a.frames[index].delayMs) || undefined\n };\n });\n this._animation = new _Graphics_Animation__WEBPACK_IMPORTED_MODULE_3__.Animation({\n frames,\n frameDuration: durationPerFrame\n });\n return this._animation;\n }\n return null;\n }\n get readCheckBytes() {\n var _a, _b;\n return (_b = (_a = this._gif) === null || _a === void 0 ? void 0 : _a.checkBytes) !== null && _b !== void 0 ? _b : [];\n }\n}\nconst bitsToNum = (ba) => {\n return ba.reduce(function (s, n) {\n return s * 2 + n;\n }, 0);\n};\nconst byteToBitArr = (bite) => {\n const a = [];\n for (let i = 7; i >= 0; i--) {\n a.push(!!(bite & (1 << i)));\n }\n return a;\n};\nclass Stream {\n constructor(dataArray) {\n this.len = 0;\n this.position = 0;\n this.readByte = () => {\n if (this.position >= this.data.byteLength) {\n throw new Error('Attempted to read past end of stream.');\n }\n return this.data[this.position++];\n };\n this.readBytes = (n) => {\n const bytes = [];\n for (let i = 0; i < n; i++) {\n bytes.push(this.readByte());\n }\n return bytes;\n };\n this.read = (n) => {\n let s = '';\n for (let i = 0; i < n; i++) {\n s += String.fromCharCode(this.readByte());\n }\n return s;\n };\n this.readUnsigned = () => {\n // Little-endian.\n const a = this.readBytes(2);\n return (a[1] << 8) + a[0];\n };\n this.data = new Uint8Array(dataArray);\n this.len = this.data.byteLength;\n if (this.len === 0) {\n throw new Error('No data loaded from file');\n }\n }\n}\nconst lzwDecode = function (minCodeSize, data) {\n // TODO: Now that the GIF parser is a bit different, maybe this should get an array of bytes instead of a String?\n let pos = 0; // Maybe this streaming thing should be merged with the Stream?\n const readCode = function (size) {\n let code = 0;\n for (let i = 0; i < size; i++) {\n if (data.charCodeAt(pos >> 3) & (1 << (pos & 7))) {\n code |= 1 << i;\n }\n pos++;\n }\n return code;\n };\n const output = [];\n const clearCode = 1 << minCodeSize;\n const eoiCode = clearCode + 1;\n let codeSize = minCodeSize + 1;\n let dict = [];\n const clear = function () {\n dict = [];\n codeSize = minCodeSize + 1;\n for (let i = 0; i < clearCode; i++) {\n dict[i] = [i];\n }\n dict[clearCode] = [];\n dict[eoiCode] = null;\n };\n let code = 0;\n let last = 0;\n while (true) {\n last = code;\n code = readCode(codeSize);\n if (code === clearCode) {\n clear();\n continue;\n }\n if (code === eoiCode) {\n break;\n }\n if (code < dict.length) {\n if (last !== clearCode) {\n dict.push(dict[last].concat(dict[code][0]));\n }\n }\n else {\n if (code !== dict.length) {\n throw new Error('Invalid LZW code.');\n }\n dict.push(dict[last].concat(dict[last][0]));\n }\n output.push.apply(output, dict[code]);\n if (dict.length === 1 << codeSize && codeSize < 12) {\n // If we're at the last code and codeSize is 12, the next code will be a clearCode, and it'll be 12 bits long.\n codeSize++;\n }\n }\n // I don't know if this is technically an error, but some GIFs do it.\n //if (Math.ceil(pos / 8) !== data.length) throw new Error('Extraneous LZW bytes.');\n return output;\n};\n/**\n * GifParser for binary format\n *\n * Roughly based on the documentation https://giflib.sourceforge.net/whatsinagif/index.html\n */\nclass GifParser {\n constructor(stream) {\n this._handler = {};\n this.frames = [];\n this.images = [];\n this.globalColorTableBytes = [];\n this.checkBytes = [];\n this.parseColorTableBytes = (entries) => {\n // Each entry is 3 bytes, for RGB.\n const colorTable = [];\n for (let i = 0; i < entries; i++) {\n const rgb = this._st.readBytes(3);\n colorTable.push(rgb);\n }\n return colorTable;\n };\n this.readSubBlocks = () => {\n let size, data;\n data = '';\n do {\n size = this._st.readByte();\n data += this._st.read(size);\n } while (size !== 0);\n return data;\n };\n this.parseHeader = () => {\n const hdr = {\n sig: '',\n ver: '',\n width: 0,\n height: 0,\n colorResolution: 0,\n globalColorTableSize: 0,\n gctFlag: false,\n sortedFlag: false,\n globalColorTable: [],\n backgroundColorIndex: 0,\n pixelAspectRatio: 0 // if not 0, aspectRatio = (pixelAspectRatio + 15) / 64\n };\n hdr.sig = this._st.read(3);\n hdr.ver = this._st.read(3);\n if (hdr.sig !== 'GIF') {\n throw new Error('Not a GIF file.'); // XXX: This should probably be handled more nicely.\n }\n hdr.width = this._st.readUnsigned();\n hdr.height = this._st.readUnsigned();\n this._currentFrameCanvas.width = hdr.width;\n this._currentFrameCanvas.height = hdr.height;\n const bits = byteToBitArr(this._st.readByte());\n hdr.gctFlag = bits.shift();\n hdr.colorResolution = bitsToNum(bits.splice(0, 3));\n hdr.sortedFlag = bits.shift();\n hdr.globalColorTableSize = bitsToNum(bits.splice(0, 3));\n hdr.backgroundColorIndex = this._st.readByte();\n hdr.pixelAspectRatio = this._st.readByte(); // if not 0, aspectRatio = (pixelAspectRatio + 15) / 64\n if (hdr.gctFlag) {\n // hdr.globalColorTable = this.parseColorTable(1 << (hdr.globalColorTableSize + 1));\n this.globalColorTableBytes = this.parseColorTableBytes(1 << (hdr.globalColorTableSize + 1));\n }\n if (this._handler.hdr && this._handler.hdr(hdr)) {\n this.checkBytes.push(this._handler.hdr);\n }\n };\n this.parseExt = (block) => {\n const parseGCExt = (block) => {\n this.checkBytes.push(this._st.readByte()); // Always 4\n const bits = byteToBitArr(this._st.readByte());\n block.reserved = bits.splice(0, 3); // Reserved; should be 000.\n block.disposalMethod = bitsToNum(bits.splice(0, 3));\n block.userInputFlag = bits.shift();\n block.transparentColorFlag = bits.shift();\n block.delayTime = this._st.readUnsigned();\n block.transparentColorIndex = this._st.readByte();\n block.terminator = this._st.readByte(); // always 0\n if (this._handler.gce && this._handler.gce(block)) {\n this.checkBytes.push(this._handler.gce);\n }\n return block;\n };\n const parseComExt = (block) => {\n block.comment = this.readSubBlocks();\n if (this._handler.com && this._handler.com(block)) {\n this.checkBytes.push(this._handler.com);\n }\n };\n const parsePTExt = (block) => {\n this.checkBytes.push(this._st.readByte()); // Always 12\n block.ptHeader = this._st.readBytes(12);\n block.ptData = this.readSubBlocks();\n if (this._handler.pte && this._handler.pte(block)) {\n this.checkBytes.push(this._handler.pte);\n }\n };\n const parseAppExt = (block) => {\n const parseNetscapeExt = (block) => {\n this.checkBytes.push(this._st.readByte()); // Always 3\n block.unknown = this._st.readByte(); // Q: Always 1? What is this?\n block.iterations = this._st.readUnsigned();\n block.terminator = this._st.readByte();\n if (this._handler.app && this._handler.app.NETSCAPE && this._handler.app.NETSCAPE(block)) {\n this.checkBytes.push(this._handler.app);\n }\n };\n const parseUnknownAppExt = (block) => {\n block.appData = this.readSubBlocks();\n // FIXME: This won't work if a handler wants to match on any identifier.\n if (this._handler.app && this._handler.app[block.identifier] && this._handler.app[block.identifier](block)) {\n this.checkBytes.push(this._handler.app[block.identifier]);\n }\n };\n this.checkBytes.push(this._st.readByte()); // Always 11\n block.identifier = this._st.read(8);\n block.authCode = this._st.read(3);\n switch (block.identifier) {\n case 'NETSCAPE':\n parseNetscapeExt(block);\n break;\n default:\n parseUnknownAppExt(block);\n break;\n }\n };\n const parseUnknownExt = (block) => {\n block.data = this.readSubBlocks();\n if (this._handler.unknown && this._handler.unknown(block)) {\n this.checkBytes.push(this._handler.unknown);\n }\n };\n block.label = this._st.readByte();\n switch (block.label) {\n case 0xf9:\n block.extType = 'gce';\n this._gce = parseGCExt(block);\n break;\n case 0xfe:\n block.extType = 'com';\n parseComExt(block);\n break;\n case 0x01:\n block.extType = 'pte';\n parsePTExt(block);\n break;\n case 0xff:\n block.extType = 'app';\n parseAppExt(block);\n break;\n default:\n block.extType = 'unknown';\n parseUnknownExt(block);\n break;\n }\n };\n this.parseImg = (img) => {\n var _a;\n const deinterlace = (pixels, width) => {\n // Of course this defeats the purpose of interlacing. And it's *probably*\n // the least efficient way it's ever been implemented. But nevertheless...\n const newPixels = new Array(pixels.length);\n const rows = pixels.length / width;\n const cpRow = (toRow, fromRow) => {\n const fromPixels = pixels.slice(fromRow * width, (fromRow + 1) * width);\n newPixels.splice.apply(newPixels, [toRow * width, width].concat(fromPixels));\n };\n const offsets = [0, 4, 2, 1];\n const steps = [8, 8, 4, 2];\n let fromRow = 0;\n for (let pass = 0; pass < 4; pass++) {\n for (let toRow = offsets[pass]; toRow < rows; toRow += steps[pass]) {\n cpRow(toRow, fromRow);\n fromRow++;\n }\n }\n return newPixels;\n };\n img.leftPos = this._st.readUnsigned();\n img.topPos = this._st.readUnsigned();\n img.width = this._st.readUnsigned();\n img.height = this._st.readUnsigned();\n const bits = byteToBitArr(this._st.readByte());\n img.lctFlag = bits.shift();\n img.interlaced = bits.shift();\n img.sorted = bits.shift();\n img.reserved = bits.splice(0, 2);\n img.lctSize = bitsToNum(bits.splice(0, 3));\n if (img.lctFlag) {\n img.lctBytes = this.parseColorTableBytes(1 << (img.lctSize + 1));\n }\n img.lzwMinCodeSize = this._st.readByte();\n const lzwData = this.readSubBlocks();\n img.pixels = lzwDecode(img.lzwMinCodeSize, lzwData);\n if (img.interlaced) {\n // Move\n img.pixels = deinterlace(img.pixels, img.width);\n }\n if ((_a = this._gce) === null || _a === void 0 ? void 0 : _a.delayTime) {\n img.delayMs = this._gce.delayTime * 10;\n }\n this.frames.push(img);\n this.arrayToImage(img, img.lctFlag ? img.lctBytes : this.globalColorTableBytes);\n if (this._handler.img && this._handler.img(img)) {\n this.checkBytes.push(this._handler);\n }\n };\n this.parseBlocks = () => {\n const block = {\n sentinel: this._st.readByte(),\n type: ''\n };\n const blockChar = String.fromCharCode(block.sentinel);\n switch (blockChar) {\n case '!':\n block.type = 'ext';\n this.parseExt(block);\n break;\n case ',':\n block.type = 'img';\n this.parseImg(block);\n break;\n case ';':\n block.type = 'eof';\n if (this._handler.eof && this._handler.eof(block)) {\n this.checkBytes.push(this._handler.eof);\n }\n break;\n default:\n throw new Error('Unknown block: 0x' + block.sentinel.toString(16));\n }\n if (block.type !== 'eof') {\n this.parseBlocks();\n }\n };\n this.arrayToImage = (frame, colorTable) => {\n var _a, _b, _c, _d;\n const canvas = document.createElement('canvas');\n canvas.width = frame.width;\n canvas.height = frame.height;\n const context = canvas.getContext('2d');\n const imageData = context.getImageData(0, 0, canvas.width, canvas.height);\n let transparentColorIndex = -1;\n if ((_a = this._gce) === null || _a === void 0 ? void 0 : _a.transparentColorFlag) {\n transparentColorIndex = this._gce.transparentColorIndex;\n }\n for (let pixel = 0; pixel < frame.pixels.length; pixel++) {\n const colorIndex = frame.pixels[pixel];\n const color = colorTable[colorIndex];\n if (colorIndex === transparentColorIndex) {\n imageData.data.set([0, 0, 0, 0], pixel * 4);\n }\n else {\n imageData.data.set([...color, 255], pixel * 4);\n }\n }\n context.putImageData(imageData, 0, 0);\n // A value of 1 which tells the decoder to leave the image in place and draw the next image on top of it.\n // A value of 2 would have meant that the canvas should be restored to the background color (as indicated by the logical screen descriptor).\n // A value of 3 is defined to mean that the decoder should restore the canvas to its previous state before the current image was drawn.\n // The behavior for values 4-7 are yet to be defined.\n if (((_b = this._gce) === null || _b === void 0 ? void 0 : _b.disposalMethod) === 1 && this.images.length) {\n this._currentFrameContext.drawImage(this.images[this.images.length - 1], 0, 0);\n }\n else if (((_c = this._gce) === null || _c === void 0 ? void 0 : _c.disposalMethod) === 2 && ((_d = this._hdr) === null || _d === void 0 ? void 0 : _d.gctFlag)) {\n const bg = colorTable[this._hdr.backgroundColorIndex];\n this._currentFrameContext.fillStyle = `rgb(${bg[0]}, ${bg[1]}, ${bg[2]})`;\n this._currentFrameContext.fillRect(0, 0, this._hdr.width, this._hdr.height);\n }\n else {\n this._currentFrameContext.clearRect(0, 0, this._currentFrameCanvas.width, this._currentFrameCanvas.height);\n }\n this._currentFrameContext.drawImage(canvas, frame.leftPos, frame.topPos, frame.width, frame.height);\n const img = new Image();\n img.src = this._currentFrameCanvas.toDataURL(); // default is png\n this.images.push(img);\n };\n this._st = stream;\n this._handler = {};\n this._currentFrameCanvas = document.createElement('canvas');\n this._currentFrameContext = this._currentFrameCanvas.getContext('2d');\n this.parseHeader();\n this.parseBlocks();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Resources/Index.ts\":\n/*!****************************!*\\\n !*** ./Resources/Index.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AudioContextFactory: () => (/* reexport safe */ _Sound_Index__WEBPACK_IMPORTED_MODULE_1__.AudioContextFactory),\n/* harmony export */ FontSource: () => (/* reexport safe */ _Font__WEBPACK_IMPORTED_MODULE_3__.FontSource),\n/* harmony export */ Gif: () => (/* reexport safe */ _Gif__WEBPACK_IMPORTED_MODULE_2__.Gif),\n/* harmony export */ GifParser: () => (/* reexport safe */ _Gif__WEBPACK_IMPORTED_MODULE_2__.GifParser),\n/* harmony export */ Resource: () => (/* reexport safe */ _Resource__WEBPACK_IMPORTED_MODULE_0__.Resource),\n/* harmony export */ ResourceEvents: () => (/* reexport safe */ _Resource__WEBPACK_IMPORTED_MODULE_0__.ResourceEvents),\n/* harmony export */ Sound: () => (/* reexport safe */ _Sound_Index__WEBPACK_IMPORTED_MODULE_1__.Sound),\n/* harmony export */ SoundEvents: () => (/* reexport safe */ _Sound_Index__WEBPACK_IMPORTED_MODULE_1__.SoundEvents),\n/* harmony export */ Stream: () => (/* reexport safe */ _Gif__WEBPACK_IMPORTED_MODULE_2__.Stream),\n/* harmony export */ WebAudioInstance: () => (/* reexport safe */ _Sound_Index__WEBPACK_IMPORTED_MODULE_1__.WebAudioInstance)\n/* harmony export */ });\n/* harmony import */ var _Resource__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Resource */ \"./Resources/Resource.ts\");\n/* harmony import */ var _Sound_Index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Sound/Index */ \"./Resources/Sound/Index.ts\");\n/* harmony import */ var _Gif__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Gif */ \"./Resources/Gif.ts\");\n/* harmony import */ var _Font__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Font */ \"./Resources/Font.ts\");\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Resources/Resource.ts\":\n/*!*******************************!*\\\n !*** ./Resources/Resource.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Resource: () => (/* binding */ Resource),\n/* harmony export */ ResourceEvents: () => (/* binding */ ResourceEvents)\n/* harmony export */ });\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n\n\nconst ResourceEvents = {\n Complete: 'complete',\n Load: 'load',\n LoadStart: 'loadstart',\n Progress: 'progress',\n Error: 'error'\n};\n/**\n * The {@apilink Resource} type allows games built in Excalibur to load generic resources.\n * For any type of remote resource it is recommended to use {@apilink Resource} for preloading.\n */\nclass Resource {\n /**\n * @param path Path to the remote resource\n * @param responseType The type to expect as a response: \"\" | \"arraybuffer\" | \"blob\" | \"document\" | \"json\" | \"text\";\n * @param bustCache Whether or not to cache-bust requests\n */\n constructor(path, responseType, bustCache = false) {\n this.path = path;\n this.responseType = responseType;\n this.bustCache = bustCache;\n this.data = null;\n this.logger = _Util_Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance();\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_1__.EventEmitter();\n }\n /**\n * Returns true if the Resource is completely loaded and is ready\n * to be drawn.\n */\n isLoaded() {\n return this.data !== null;\n }\n _cacheBust(uri) {\n const query = /\\?\\w*=\\w*/;\n if (query.test(uri)) {\n uri += '&__=' + Date.now();\n }\n else {\n uri += '?__=' + Date.now();\n }\n return uri;\n }\n /**\n * Begin loading the resource and returns a promise to be resolved on completion\n */\n load() {\n return new Promise((resolve, reject) => {\n // Exit early if we already have data\n if (this.data !== null) {\n this.logger.debug('Already have data for resource', this.path);\n this.events.emit('complete', this.data);\n resolve(this.data);\n return;\n }\n const request = new XMLHttpRequest();\n request.open('GET', this.bustCache ? this._cacheBust(this.path) : this.path, true);\n request.responseType = this.responseType;\n request.addEventListener('loadstart', (e) => this.events.emit('loadstart', e));\n request.addEventListener('progress', (e) => this.events.emit('progress', e));\n request.addEventListener('error', (e) => this.events.emit('error', e));\n request.addEventListener('load', (e) => this.events.emit('load', e));\n request.addEventListener('load', () => {\n // XHR on file:// success status is 0, such as with PhantomJS\n if (request.status !== 0 && request.status !== 200) {\n this.logger.error('Failed to load resource ', this.path, ' server responded with error code', request.status);\n this.events.emit('error', request.response);\n reject(new Error(request.statusText));\n return;\n }\n if (request.response instanceof Blob && request.response.type === 'text/html') {\n const errorText = `Expected blob (usually image) data from the server when loading ${this.path}, but got HTML content instead!\r\n\r\nCheck your server configuration, for example Vite serves static files from the /public folder`;\n this.events.emit('error', request.response);\n reject(new Error(errorText));\n return;\n }\n this.data = request.response;\n this.events.emit('complete', this.data);\n this.logger.debug('Completed loading resource', this.path);\n resolve(this.data);\n });\n request.send();\n });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Resources/Sound/AudioContext.ts\":\n/*!*****************************************!*\\\n !*** ./Resources/Sound/AudioContext.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AudioContextFactory: () => (/* binding */ AudioContextFactory)\n/* harmony export */ });\n/**\n * Internal class used to build instances of AudioContext\n */\n/* istanbul ignore next */\nclass AudioContextFactory {\n static create() {\n if (!this._INSTANCE) {\n if (window.AudioContext || window.webkitAudioContext) {\n this._INSTANCE = new AudioContext();\n }\n }\n return this._INSTANCE;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Resources/Sound/Index.ts\":\n/*!**********************************!*\\\n !*** ./Resources/Sound/Index.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AudioContextFactory: () => (/* reexport safe */ _AudioContext__WEBPACK_IMPORTED_MODULE_1__.AudioContextFactory),\n/* harmony export */ Sound: () => (/* reexport safe */ _Sound__WEBPACK_IMPORTED_MODULE_0__.Sound),\n/* harmony export */ SoundEvents: () => (/* reexport safe */ _Sound__WEBPACK_IMPORTED_MODULE_0__.SoundEvents),\n/* harmony export */ WebAudioInstance: () => (/* reexport safe */ _WebAudioInstance__WEBPACK_IMPORTED_MODULE_2__.WebAudioInstance)\n/* harmony export */ });\n/* harmony import */ var _Sound__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Sound */ \"./Resources/Sound/Sound.ts\");\n/* harmony import */ var _AudioContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./AudioContext */ \"./Resources/Sound/AudioContext.ts\");\n/* harmony import */ var _WebAudioInstance__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./WebAudioInstance */ \"./Resources/Sound/WebAudioInstance.ts\");\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Resources/Sound/Sound.ts\":\n/*!**********************************!*\\\n !*** ./Resources/Sound/Sound.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Sound: () => (/* binding */ Sound),\n/* harmony export */ SoundEvents: () => (/* binding */ SoundEvents)\n/* harmony export */ });\n/* harmony import */ var _Interfaces_AudioImplementation__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Interfaces/AudioImplementation */ \"./Interfaces/AudioImplementation.ts\");\n/* harmony import */ var _Resource__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Resource */ \"./Resources/Resource.ts\");\n/* harmony import */ var _WebAudioInstance__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./WebAudioInstance */ \"./Resources/Sound/WebAudioInstance.ts\");\n/* harmony import */ var _AudioContext__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./AudioContext */ \"./Resources/Sound/AudioContext.ts\");\n/* harmony import */ var _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Events/MediaEvents */ \"./Events/MediaEvents.ts\");\n/* harmony import */ var _Util_Sound__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../Util/Sound */ \"./Util/Sound.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n\n\n\n\n\nconst SoundEvents = {\n VolumeChange: 'volumechange',\n Processed: 'processed',\n Pause: 'pause',\n Stop: 'stop',\n PlaybackEnd: 'playbackend',\n Resume: 'resume',\n PlaybackStart: 'playbackstart'\n};\n/**\n * The {@apilink Sound} object allows games built in Excalibur to load audio\n * components, from soundtracks to sound effects. {@apilink Sound} is an {@apilink Loadable}\n * which means it can be passed to a {@apilink Loader} to pre-load before a game or level.\n */\nclass Sound {\n /**\n * Indicates whether the clip should loop when complete\n * @param value Set the looping flag\n */\n set loop(value) {\n this._loop = value;\n for (const track of this._tracks) {\n track.loop = this._loop;\n }\n this.logger.debug('Set loop for all instances of sound', this.path, 'to', this._loop);\n }\n get loop() {\n return this._loop;\n }\n set volume(value) {\n this._volume = value;\n for (const track of this._tracks) {\n track.volume = this._volume;\n }\n this.events.emit('volumechange', new _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_0__.NativeSoundEvent(this));\n this.logger.debug('Set loop for all instances of sound', this.path, 'to', this._volume);\n }\n get volume() {\n return this._volume;\n }\n /**\n * Get the duration that this audio should play. If unset the total natural playback duration will be used.\n */\n get duration() {\n return this._duration;\n }\n /**\n * Set the duration that this audio should play. If unset the total natural playback duration will be used.\n *\n * Note: if you seek to a specific point the duration will start from that point, for example\n *\n * If you have a 10 second clip, seek to 5 seconds, then set the duration to 2, it will play the clip from 5-7 seconds.\n */\n set duration(duration) {\n this._duration = duration;\n }\n /**\n * Return array of Current AudioInstances playing or being paused\n */\n get instances() {\n return this._tracks;\n }\n get path() {\n return this._resource.path;\n }\n set path(val) {\n this._resource.path = val;\n }\n /**\n * Should excalibur add a cache busting querystring? By default false.\n * Must be set before loading\n */\n get bustCache() {\n return this._resource.bustCache;\n }\n set bustCache(val) {\n this._resource.bustCache = val;\n }\n /**\n * @param paths A list of audio sources (clip.wav, clip.mp3, clip.ogg) for this audio clip. This is done for browser compatibility.\n */\n constructor(...paths) {\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_1__.EventEmitter();\n this.logger = _Util_Log__WEBPACK_IMPORTED_MODULE_2__.Logger.getInstance();\n this._loop = false;\n this._volume = 1;\n this._isStopped = false;\n // private _isPaused = false;\n this._tracks = [];\n this._wasPlayingOnHidden = false;\n this._playbackRate = 1.0;\n this._audioContext = _AudioContext__WEBPACK_IMPORTED_MODULE_3__.AudioContextFactory.create();\n this._resource = new _Resource__WEBPACK_IMPORTED_MODULE_4__.Resource('', _Interfaces_AudioImplementation__WEBPACK_IMPORTED_MODULE_5__.ExResponse.type.arraybuffer);\n /**\n * Chrome : MP3, WAV, Ogg\n * Firefox : WAV, Ogg,\n * IE : MP3, WAV coming soon\n * Safari MP3, WAV, Ogg\n */\n for (const path of paths) {\n if ((0,_Util_Sound__WEBPACK_IMPORTED_MODULE_6__.canPlayFile)(path)) {\n this.path = path;\n break;\n }\n }\n if (!this.path) {\n this.logger.warn('This browser does not support any of the audio files specified:', paths.join(', '));\n this.logger.warn('Attempting to use', paths[0]);\n this.path = paths[0]; // select the first specified\n }\n }\n isLoaded() {\n return !!this.data;\n }\n async load() {\n var _a, _b;\n if (this.data) {\n return this.data;\n }\n const arraybuffer = await this._resource.load();\n const audiobuffer = await this.decodeAudio(arraybuffer.slice(0));\n this._duration = (_b = (_a = this._duration) !== null && _a !== void 0 ? _a : audiobuffer === null || audiobuffer === void 0 ? void 0 : audiobuffer.duration) !== null && _b !== void 0 ? _b : undefined;\n this.events.emit('processed', new _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_0__.NativeSoundProcessedEvent(this, audiobuffer));\n return (this.data = audiobuffer);\n }\n async decodeAudio(data) {\n try {\n return await this._audioContext.decodeAudioData(data.slice(0));\n }\n catch (e) {\n this.logger.error('Unable to decode ' +\n ' this browser may not fully support this format, or the file may be corrupt, ' +\n 'if this is an mp3 try removing id3 tags and album art from the file.');\n return await Promise.reject();\n }\n }\n wireEngine(engine) {\n if (engine) {\n this._engine = engine;\n this._engine.on('hidden', () => {\n if (engine.pauseAudioWhenHidden && this.isPlaying()) {\n this._wasPlayingOnHidden = true;\n this.pause();\n }\n });\n this._engine.on('visible', () => {\n if (engine.pauseAudioWhenHidden && this._wasPlayingOnHidden) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.play();\n this._wasPlayingOnHidden = false;\n }\n });\n this._engine.on('start', () => {\n this._isStopped = false;\n });\n this._engine.on('stop', () => {\n this.stop();\n this._isStopped = true;\n });\n }\n }\n /**\n * Returns how many instances of the sound are currently playing\n */\n instanceCount() {\n return this._tracks.length;\n }\n /**\n * Whether or not the sound is playing right now\n */\n isPlaying() {\n return this._tracks.some((t) => t.isPlaying());\n }\n isPaused() {\n return this._tracks.some((t) => t.isPaused());\n }\n isStopped() {\n return this._tracks.some((t) => t.isStopped());\n }\n /**\n * Play the sound, returns a promise that resolves when the sound is done playing\n * An optional volume argument can be passed in to play the sound. Max volume is 1.0\n */\n play(volume) {\n if (!this.isLoaded()) {\n this.logger.warn('Cannot start playing. Resource', this.path, 'is not loaded yet');\n return Promise.resolve(true);\n }\n if (this._isStopped) {\n this.logger.warn('Cannot start playing. Engine is in a stopped state.');\n return Promise.resolve(false);\n }\n this.volume = volume || this.volume;\n if (this.isPaused()) {\n return this._resumePlayback();\n }\n else {\n return this._startPlayback();\n }\n }\n /**\n * Stop the sound, and do not rewind\n */\n pause() {\n if (!this.isPlaying()) {\n return;\n }\n for (const track of this._tracks) {\n track.pause();\n }\n this.events.emit('pause', new _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_0__.NativeSoundEvent(this));\n this.logger.debug('Paused all instances of sound', this.path);\n }\n /**\n * Stop the sound if it is currently playing and rewind the track. If the sound is not playing, rewinds the track.\n */\n stop() {\n for (const track of this._tracks) {\n track.stop();\n }\n this.events.emit('stop', new _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_0__.NativeSoundEvent(this));\n this._tracks.length = 0;\n this.logger.debug('Stopped all instances of sound', this.path);\n }\n get playbackRate() {\n return this._playbackRate;\n }\n set playbackRate(playbackRate) {\n this._playbackRate = playbackRate;\n this._tracks.forEach((t) => {\n t.playbackRate = this._playbackRate;\n });\n }\n seek(position, trackId = 0) {\n if (this._tracks.length === 0) {\n this._getTrackInstance(this.data);\n }\n this._tracks[trackId].seek(position);\n }\n getTotalPlaybackDuration() {\n if (!this.isLoaded()) {\n this.logger.warnOnce(`Sound from ${this.path} is not loaded, cannot return total playback duration.` +\n `Did you forget to add Sound to a loader? https://excaliburjs.com/docs/loaders/`);\n return 0;\n }\n return this.data.duration;\n }\n /**\n * Return the current playback time of the playing track in seconds from the start.\n *\n * Optionally specify the track to query if multiple are playing at once.\n * @param trackId\n */\n getPlaybackPosition(trackId = 0) {\n if (this._tracks.length) {\n return this._tracks[trackId].getPlaybackPosition();\n }\n return 0;\n }\n /**\n * Get Id of provided AudioInstance in current trackList\n * @param track {@apilink Audio} which Id is to be given\n */\n getTrackId(track) {\n return this._tracks.indexOf(track);\n }\n async _resumePlayback() {\n if (this.isPaused()) {\n const resumed = [];\n // ensure we resume *current* tracks (if paused)\n for (const track of this._tracks) {\n resumed.push(track.play().then(() => {\n this._tracks.splice(this.getTrackId(track), 1);\n return true;\n }));\n }\n this.events.emit('resume', new _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_0__.NativeSoundEvent(this));\n this.logger.debug('Resuming paused instances for sound', this.path, this._tracks);\n // resolve when resumed tracks are done\n await Promise.all(resumed);\n }\n return true;\n }\n /**\n * Starts playback, returns a promise that resolves when playback is complete\n */\n async _startPlayback() {\n const track = this._getTrackInstance(this.data);\n const complete = await track.play(() => {\n this.events.emit('playbackstart', new _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_0__.NativeSoundEvent(this, track));\n this.logger.debug('Playing new instance for sound', this.path);\n });\n this.events.emit('playbackend', new _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_0__.NativeSoundEvent(this, track));\n // cleanup any done tracks\n const trackId = this.getTrackId(track);\n if (trackId !== -1) {\n this._tracks.splice(trackId, 1);\n }\n return complete;\n }\n _getTrackInstance(data) {\n var _a;\n const newTrack = new _WebAudioInstance__WEBPACK_IMPORTED_MODULE_7__.WebAudioInstance(data);\n newTrack.loop = this.loop;\n newTrack.volume = this.volume;\n newTrack.duration = (_a = this.duration) !== null && _a !== void 0 ? _a : 0;\n newTrack.playbackRate = this._playbackRate;\n this._tracks.push(newTrack);\n return newTrack;\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Resources/Sound/WebAudioInstance.ts\":\n/*!*********************************************!*\\\n !*** ./Resources/Sound/WebAudioInstance.ts ***!\n \\*********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ WebAudioInstance: () => (/* binding */ WebAudioInstance)\n/* harmony export */ });\n/* harmony import */ var _Util_StateMachine__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Util/StateMachine */ \"./Util/StateMachine.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _AudioContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./AudioContext */ \"./Resources/Sound/AudioContext.ts\");\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Util/Future */ \"./Util/Future.ts\");\n\n\n\n\n/**\n * Internal class representing a Web Audio AudioBufferSourceNode instance\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API\n */\nclass WebAudioInstance {\n _createNewBufferSource() {\n this._instance = this._audioContext.createBufferSource();\n this._instance.buffer = this._src;\n this._instance.loop = this.loop;\n this._instance.playbackRate.value = this._playbackRate;\n this._instance.connect(this._volumeNode);\n this._volumeNode.connect(this._audioContext.destination);\n }\n _handleEnd() {\n if (!this.loop) {\n this._instance.onended = () => {\n this._playingFuture.resolve(true);\n };\n }\n }\n set loop(value) {\n this._loop = value;\n if (this._instance) {\n this._instance.loop = value;\n if (!this.loop) {\n this._instance.onended = () => {\n this._playingFuture.resolve(true);\n };\n }\n }\n }\n get loop() {\n return this._loop;\n }\n set volume(value) {\n value = (0,_Math_util__WEBPACK_IMPORTED_MODULE_0__.clamp)(value, 0, 1.0);\n this._volume = value;\n if (this._stateMachine.in('PLAYING') && this._volumeNode.gain.setTargetAtTime) {\n // https://developer.mozilla.org/en-US/docs/Web/API/AudioParam/setTargetAtTime\n // After each .1 seconds timestep, the target value will ~63.2% closer to the target value.\n // This exponential ramp provides a more pleasant transition in gain\n this._volumeNode.gain.setTargetAtTime(value, this._audioContext.currentTime, 0.1);\n }\n else {\n this._volumeNode.gain.value = value;\n }\n }\n get volume() {\n return this._volume;\n }\n /**\n * Returns the set duration to play, otherwise returns the total duration if unset\n */\n get duration() {\n var _a;\n return (_a = this._duration) !== null && _a !== void 0 ? _a : this.getTotalPlaybackDuration();\n }\n /**\n * Set the duration that this audio should play.\n *\n * Note: if you seek to a specific point the duration will start from that point, for example\n *\n * If you have a 10 second clip, seek to 5 seconds, then set the duration to 2, it will play the clip from 5-7 seconds.\n */\n set duration(duration) {\n this._duration = duration;\n }\n constructor(_src) {\n this._src = _src;\n this._audioContext = _AudioContext__WEBPACK_IMPORTED_MODULE_1__.AudioContextFactory.create();\n this._volumeNode = this._audioContext.createGain();\n this._playingFuture = new _Util_Future__WEBPACK_IMPORTED_MODULE_2__.Future();\n this._stateMachine = _Util_StateMachine__WEBPACK_IMPORTED_MODULE_3__.StateMachine.create({\n start: 'STOPPED',\n states: {\n PLAYING: {\n onEnter: ({ data }) => {\n // Buffer nodes are single use\n this._createNewBufferSource();\n this._handleEnd();\n if (this.loop) {\n // when looping don't set a duration\n this._instance.start(0, data.pausedAt * this._playbackRate);\n }\n else {\n this._instance.start(0, data.pausedAt * this._playbackRate, this.duration);\n }\n data.startedAt = this._audioContext.currentTime - data.pausedAt;\n data.pausedAt = 0;\n },\n onState: () => this._playStarted(),\n onExit: ({ to }) => {\n // If you've exited early only resolve if explicitly STOPPED\n if (to === 'STOPPED') {\n this._playingFuture.resolve(true);\n }\n // Whenever you're not playing... you stop!\n this._instance.onended = null; // disconnect the wired on-end handler\n this._instance.disconnect();\n this._instance.stop(0);\n this._instance = null;\n },\n transitions: ['STOPPED', 'PAUSED', 'SEEK']\n },\n SEEK: {\n onEnter: ({ eventData: position, data }) => {\n data.pausedAt = (position !== null && position !== void 0 ? position : 0) / this._playbackRate;\n data.startedAt = 0;\n },\n transitions: ['*']\n },\n STOPPED: {\n onEnter: ({ data }) => {\n data.pausedAt = 0;\n data.startedAt = 0;\n this._playingFuture.resolve(true);\n },\n transitions: ['PLAYING', 'PAUSED', 'SEEK']\n },\n PAUSED: {\n onEnter: ({ data }) => {\n // Playback rate will be a scale factor of how fast/slow the audio is being played\n // default is 1.0\n // we need to invert it to get the time scale\n data.pausedAt = this._audioContext.currentTime - data.startedAt;\n },\n transitions: ['PLAYING', 'STOPPED', 'SEEK']\n }\n }\n }, {\n startedAt: 0,\n pausedAt: 0\n });\n this._volume = 1;\n this._loop = false;\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n this._playStarted = () => { };\n this._playbackRate = 1.0;\n this._createNewBufferSource();\n }\n isPlaying() {\n return this._stateMachine.in('PLAYING');\n }\n isPaused() {\n return this._stateMachine.in('PAUSED') || this._stateMachine.in('SEEK');\n }\n isStopped() {\n return this._stateMachine.in('STOPPED');\n }\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n play(playStarted = () => { }) {\n this._playStarted = playStarted;\n this._stateMachine.go('PLAYING');\n return this._playingFuture.promise;\n }\n pause() {\n this._stateMachine.go('PAUSED');\n }\n stop() {\n this._stateMachine.go('STOPPED');\n }\n seek(position) {\n this._stateMachine.go('PAUSED');\n this._stateMachine.go('SEEK', position);\n }\n getTotalPlaybackDuration() {\n return this._src.duration;\n }\n getPlaybackPosition() {\n const { pausedAt, startedAt } = this._stateMachine.data;\n if (pausedAt) {\n return pausedAt * this._playbackRate;\n }\n if (startedAt) {\n return (this._audioContext.currentTime - startedAt) * this._playbackRate;\n }\n return 0;\n }\n set playbackRate(playbackRate) {\n this._instance.playbackRate.value = this._playbackRate = playbackRate;\n }\n get playbackRate() {\n return this._instance.playbackRate.value;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Scene.ts\":\n/*!******************!*\\\n !*** ./Scene.ts ***!\n \\******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PreLoadEvent: () => (/* binding */ PreLoadEvent),\n/* harmony export */ Scene: () => (/* binding */ Scene),\n/* harmony export */ SceneEvents: () => (/* binding */ SceneEvents),\n/* harmony export */ isSceneConstructor: () => (/* binding */ isSceneConstructor)\n/* harmony export */ });\n/* harmony import */ var _ScreenElement__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./ScreenElement */ \"./ScreenElement.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./Events */ \"./Events.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Timer__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./Timer */ \"./Timer.ts\");\n/* harmony import */ var _TileMap__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./TileMap */ \"./TileMap/TileMap.ts\");\n/* harmony import */ var _Camera__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Camera */ \"./Camera.ts\");\n/* harmony import */ var _Actor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Actor */ \"./Actor.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./Util/Util */ \"./Util/Util.ts\");\n/* harmony import */ var _Trigger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Trigger */ \"./Trigger.ts\");\n/* harmony import */ var _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./EntityComponentSystem/System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _EntityComponentSystem_World__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./EntityComponentSystem/World */ \"./EntityComponentSystem/World.ts\");\n/* harmony import */ var _Collision_MotionSystem__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Collision/MotionSystem */ \"./Collision/MotionSystem.ts\");\n/* harmony import */ var _Collision_CollisionSystem__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Collision/CollisionSystem */ \"./Collision/CollisionSystem.ts\");\n/* harmony import */ var _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./EntityComponentSystem/Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _Graphics_GraphicsSystem__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Graphics/GraphicsSystem */ \"./Graphics/GraphicsSystem.ts\");\n/* harmony import */ var _Debug_DebugSystem__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Debug/DebugSystem */ \"./Debug/DebugSystem.ts\");\n/* harmony import */ var _Input_PointerSystem__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Input/PointerSystem */ \"./Input/PointerSystem.ts\");\n/* harmony import */ var _Actions_ActionsSystem__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Actions/ActionsSystem */ \"./Actions/ActionsSystem.ts\");\n/* harmony import */ var _TileMap_IsometricEntitySystem__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./TileMap/IsometricEntitySystem */ \"./TileMap/IsometricEntitySystem.ts\");\n/* harmony import */ var _Graphics_OffscreenSystem__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Graphics/OffscreenSystem */ \"./Graphics/OffscreenSystem.ts\");\n/* harmony import */ var _Collision_PhysicsWorld__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Collision/PhysicsWorld */ \"./Collision/PhysicsWorld.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Input_InputHost__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./Input/InputHost */ \"./Input/InputHost.ts\");\n/* harmony import */ var _Input_PointerScope__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Input/PointerScope */ \"./Input/PointerScope.ts\");\n/* harmony import */ var _Collision_PhysicsConfig__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Collision/PhysicsConfig */ \"./Collision/PhysicsConfig.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass PreLoadEvent {\n}\nconst SceneEvents = {\n Initialize: 'initialize',\n Activate: 'activate',\n Deactivate: 'deactivate',\n PreUpdate: 'preupdate',\n PostUpdate: 'postupdate',\n PreDraw: 'predraw',\n PostDraw: 'postdraw',\n PreDebugDraw: 'predebugdraw',\n PostDebugDraw: 'postdebugdraw',\n PreLoad: 'preload'\n};\n/**\n *\n */\nfunction isSceneConstructor(x) {\n var _a, _b;\n return !!(x === null || x === void 0 ? void 0 : x.prototype) && !!((_b = (_a = x === null || x === void 0 ? void 0 : x.prototype) === null || _a === void 0 ? void 0 : _a.constructor) === null || _b === void 0 ? void 0 : _b.name);\n}\n/**\n * {@apilink Actor | `Actors`} are composed together into groupings called Scenes in\n * Excalibur. The metaphor models the same idea behind real world\n * actors in a scene. Only actors in scenes will be updated and drawn.\n *\n * Typical usages of a scene include: levels, menus, loading screens, etc.\n */\nclass Scene {\n /**\n * The actors in the current scene\n */\n get actors() {\n return this.world.entityManager.entities.filter((e) => {\n return e instanceof _Actor__WEBPACK_IMPORTED_MODULE_0__.Actor;\n });\n }\n /**\n * The entities in the current scene\n */\n get entities() {\n return this.world.entityManager.entities;\n }\n /**\n * The triggers in the current scene\n */\n get triggers() {\n return this.world.entityManager.entities.filter((e) => {\n return e instanceof _Trigger__WEBPACK_IMPORTED_MODULE_1__.Trigger;\n });\n }\n /**\n * The {@apilink TileMap}s in the scene, if any\n */\n get tileMaps() {\n return this.world.entityManager.entities.filter((e) => {\n return e instanceof _TileMap__WEBPACK_IMPORTED_MODULE_2__.TileMap;\n });\n }\n get timers() {\n return this._timers;\n }\n constructor() {\n // Initialize systems\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_3__.Logger.getInstance();\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_4__.EventEmitter();\n /**\n * Gets or sets the current camera for the scene\n */\n this.camera = new _Camera__WEBPACK_IMPORTED_MODULE_5__.Camera();\n /**\n * The ECS world for the scene\n */\n this.world = new _EntityComponentSystem_World__WEBPACK_IMPORTED_MODULE_6__.World(this);\n /**\n * The Excalibur physics world for the scene. Used to interact\n * with colliders included in the scene.\n *\n * Can be used to perform scene ray casts, track colliders, broadphase, and narrowphase.\n */\n this.physics = new _Collision_PhysicsWorld__WEBPACK_IMPORTED_MODULE_7__.PhysicsWorld((0,_Collision_PhysicsConfig__WEBPACK_IMPORTED_MODULE_8__.getDefaultPhysicsConfig)());\n this._isInitialized = false;\n this._timers = [];\n this._cancelQueue = [];\n // Update\n this.world.add(_Actions_ActionsSystem__WEBPACK_IMPORTED_MODULE_9__.ActionsSystem);\n this.world.add(new _Collision_MotionSystem__WEBPACK_IMPORTED_MODULE_10__.MotionSystem(this.world, this.physics));\n this.world.add(new _Collision_CollisionSystem__WEBPACK_IMPORTED_MODULE_11__.CollisionSystem(this.world, this.physics));\n this.world.add(_Input_PointerSystem__WEBPACK_IMPORTED_MODULE_12__.PointerSystem);\n this.world.add(_TileMap_IsometricEntitySystem__WEBPACK_IMPORTED_MODULE_13__.IsometricEntitySystem);\n // Draw\n this.world.add(_Graphics_OffscreenSystem__WEBPACK_IMPORTED_MODULE_14__.OffscreenSystem);\n this.world.add(_Graphics_GraphicsSystem__WEBPACK_IMPORTED_MODULE_15__.GraphicsSystem);\n this.world.add(_Debug_DebugSystem__WEBPACK_IMPORTED_MODULE_16__.DebugSystem);\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n /**\n * Event hook to provide Scenes a way of loading scene specific resources.\n *\n * This is called before the Scene.onInitialize during scene transition. It will only ever fire once for a scene.\n * @param loader\n */\n onPreLoad(loader) {\n // will be overridden\n }\n /**\n * Event hook fired directly before transition, either \"in\" or \"out\" of the scene\n *\n * This overrides the Engine scene definition. However transitions specified in goToScene take highest precedence\n *\n * ```typescript\n * // Overrides all\n * Engine.goToScene('scene', { destinationIn: ..., sourceOut: ... });\n * ```\n *\n * This can be used to configure custom transitions for a scene dynamically\n */\n onTransition(direction) {\n // will be overridden\n return undefined;\n }\n /**\n * This is called before the first update of the {@apilink Scene}. Initializes scene members like the camera. This method is meant to be\n * overridden. This is where initialization of child actors should take place.\n */\n onInitialize(engine) {\n // will be overridden\n }\n /**\n * This is called when the scene is made active and started. It is meant to be overridden,\n * this is where you should setup any DOM UI or event handlers needed for the scene.\n */\n onActivate(context) {\n // will be overridden\n }\n /**\n * This is called when the scene is made transitioned away from and stopped. It is meant to be overridden,\n * this is where you should cleanup any DOM UI or event handlers needed for the scene.\n */\n onDeactivate(context) {\n // will be overridden\n }\n /**\n * Safe to override onPreUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPreUpdate` is called directly before a scene is updated.\n * @param engine reference to the engine\n * @param elapsed Number of milliseconds elapsed since the last draw.\n */\n onPreUpdate(engine, elapsed) {\n // will be overridden\n }\n /**\n * Safe to override onPostUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPostUpdate` is called directly after a scene is updated.\n * @param engine reference to the engine\n * @param elapsed Number of milliseconds elapsed since the last draw.\n */\n onPostUpdate(engine, elapsed) {\n // will be overridden\n }\n /**\n * Safe to override onPreDraw lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPreDraw` is called directly before a scene is drawn.\n *\n */\n onPreDraw(ctx, elapsed) {\n // will be overridden\n }\n /**\n * Safe to override onPostDraw lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPostDraw` is called directly after a scene is drawn.\n *\n */\n onPostDraw(ctx, elapsed) {\n // will be overridden\n }\n /**\n * Initializes actors in the scene\n */\n _initializeChildren() {\n for (const child of this.entities) {\n child._initialize(this.engine);\n }\n }\n /**\n * Gets whether or not the {@apilink Scene} has been initialized\n */\n get isInitialized() {\n return this._isInitialized;\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Initializes the scene before the first update, meant to be called by engine not by users of\n * Excalibur\n * @internal\n */\n async _initialize(engine) {\n var _a;\n if (!this.isInitialized) {\n try {\n this.engine = engine;\n // PhysicsWorld config is watched so things will automagically update\n this.physics.config = this.engine.physics;\n this.input = new _Input_InputHost__WEBPACK_IMPORTED_MODULE_17__.InputHost({\n pointerTarget: engine.pointerScope === _Input_PointerScope__WEBPACK_IMPORTED_MODULE_18__.PointerScope.Canvas ? engine.canvas : document,\n grabWindowFocus: engine.grabWindowFocus,\n engine\n });\n // Initialize camera first\n this.camera._initialize(engine);\n this.world.systemManager.initialize();\n // This order is important! we want to be sure any custom init that add actors\n // fire before the actor init\n await this.onInitialize(engine);\n this._initializeChildren();\n this._logger.debug('Scene.onInitialize', this, engine);\n this.events.emit('initialize', new _Events__WEBPACK_IMPORTED_MODULE_19__.InitializeEvent(engine, this));\n }\n catch (e) {\n this._logger.error(`Error during scene initialization for scene ${(_a = engine.director) === null || _a === void 0 ? void 0 : _a.getSceneName(this)}!`);\n throw e;\n }\n this._isInitialized = true;\n }\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Activates the scene with the base behavior, then calls the overridable `onActivate` implementation.\n * @internal\n */\n async _activate(context) {\n var _a, _b;\n try {\n this._logger.debug('Scene.onActivate', this);\n this.input.toggleEnabled(true);\n await this.onActivate(context);\n }\n catch (e) {\n this._logger.error(`Error during scene activation for scene ${(_b = (_a = this.engine) === null || _a === void 0 ? void 0 : _a.director) === null || _b === void 0 ? void 0 : _b.getSceneName(this)}!`);\n throw e;\n }\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Deactivates the scene with the base behavior, then calls the overridable `onDeactivate` implementation.\n * @internal\n */\n async _deactivate(context) {\n this._logger.debug('Scene.onDeactivate', this);\n this.input.toggleEnabled(false);\n await this.onDeactivate(context);\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _preupdate handler for {@apilink onPreUpdate} lifecycle event\n * @internal\n */\n _preupdate(engine, elapsed) {\n this.emit('preupdate', new _Events__WEBPACK_IMPORTED_MODULE_19__.PreUpdateEvent(engine, elapsed, this));\n this.onPreUpdate(engine, elapsed);\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _preupdate handler for {@apilink onPostUpdate} lifecycle event\n * @internal\n */\n _postupdate(engine, elapsed) {\n this.emit('postupdate', new _Events__WEBPACK_IMPORTED_MODULE_19__.PostUpdateEvent(engine, elapsed, this));\n this.onPostUpdate(engine, elapsed);\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _predraw handler for {@apilink onPreDraw} lifecycle event\n * @internal\n */\n _predraw(ctx, elapsed) {\n this.emit('predraw', new _Events__WEBPACK_IMPORTED_MODULE_19__.PreDrawEvent(ctx, elapsed, this));\n this.onPreDraw(ctx, elapsed);\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _postdraw handler for {@apilink onPostDraw} lifecycle event\n * @internal\n */\n _postdraw(ctx, elapsed) {\n this.emit('postdraw', new _Events__WEBPACK_IMPORTED_MODULE_19__.PostDrawEvent(ctx, elapsed, this));\n this.onPostDraw(ctx, elapsed);\n }\n /**\n * Updates all the actors and timers in the scene. Called by the {@apilink Engine}.\n * @param engine Reference to the current Engine\n * @param elapsed The number of milliseconds since the last update\n */\n update(engine, elapsed) {\n var _a;\n if (!this.isInitialized) {\n this._logger.warnOnce(`Scene update called before initialize for scene ${(_a = engine.director) === null || _a === void 0 ? void 0 : _a.getSceneName(this)}!`);\n return;\n }\n this._preupdate(engine, elapsed);\n // TODO differed entity removal for timers\n let i, len;\n // Remove timers in the cancel queue before updating them\n for (i = 0, len = this._cancelQueue.length; i < len; i++) {\n this.removeTimer(this._cancelQueue[i]);\n }\n this._cancelQueue.length = 0;\n // Cycle through timers updating timers\n for (const timer of this._timers) {\n timer.update(elapsed);\n }\n this.world.update(_EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_20__.SystemType.Update, elapsed);\n // Camera last keeps renders smooth that are based on entity/actor\n if (this.camera) {\n this.camera.update(engine, elapsed);\n }\n this._collectActorStats(engine);\n this._postupdate(engine, elapsed);\n this.input.update();\n }\n /**\n * Draws all the actors in the Scene. Called by the {@apilink Engine}.\n * @param ctx The current rendering context\n * @param elapsed The number of milliseconds since the last draw\n */\n draw(ctx, elapsed) {\n var _a;\n if (!this.isInitialized) {\n this._logger.warnOnce(`Scene draw called before initialize!`);\n return;\n }\n this._predraw(ctx, elapsed);\n this.world.update(_EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_20__.SystemType.Draw, elapsed);\n if ((_a = this.engine) === null || _a === void 0 ? void 0 : _a.isDebug) {\n this.debugDraw(ctx);\n }\n this._postdraw(ctx, elapsed);\n }\n /**\n * Draws all the actors' debug information in the Scene. Called by the {@apilink Engine}.\n * @param ctx The current rendering context\n */\n /* istanbul ignore next */\n debugDraw(ctx) {\n this.emit('predebugdraw', new _Events__WEBPACK_IMPORTED_MODULE_19__.PreDebugDrawEvent(ctx, this));\n // pass\n this.emit('postdebugdraw', new _Events__WEBPACK_IMPORTED_MODULE_19__.PostDebugDrawEvent(ctx, this));\n }\n /**\n * Checks whether an actor is contained in this scene or not\n */\n contains(actor) {\n return this.actors.indexOf(actor) > -1;\n }\n add(entity) {\n this.emit('entityadded', { target: entity });\n this.world.add(entity);\n entity.scene = this;\n if (entity instanceof _Timer__WEBPACK_IMPORTED_MODULE_21__.Timer) {\n if (!_Util_Util__WEBPACK_IMPORTED_MODULE_22__.contains(this._timers, entity)) {\n this.addTimer(entity);\n }\n return;\n }\n }\n /**\n * Removes an {@apilink Entity} (Actor, TileMap, Trigger, etc) or {@apilink Timer} from it's current scene\n * and adds it to this scene.\n *\n * Useful if you want to have an object be present in only 1 scene at a time.\n * @param entity\n */\n transfer(entity) {\n let scene;\n if (entity instanceof _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_23__.Entity && entity.scene && entity.scene !== this) {\n scene = entity.scene;\n entity.scene.world.remove(entity, false);\n }\n if (entity instanceof _Timer__WEBPACK_IMPORTED_MODULE_21__.Timer && entity.scene) {\n scene = entity.scene;\n entity.scene.removeTimer(entity);\n }\n scene === null || scene === void 0 ? void 0 : scene.emit('entityremoved', { target: entity });\n this.add(entity);\n }\n remove(entity) {\n if (entity instanceof _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_23__.Entity) {\n this.emit('entityremoved', { target: entity });\n if (entity.isActive) {\n entity.kill();\n }\n this.world.remove(entity);\n }\n if (entity instanceof _Timer__WEBPACK_IMPORTED_MODULE_21__.Timer) {\n this.removeTimer(entity);\n }\n }\n /**\n * Removes all entities and timers from the scene, optionally indicate whether deferred should or shouldn't be used.\n *\n * By default entities use deferred removal\n * @param deferred\n */\n clear(deferred = true) {\n for (let i = this.entities.length - 1; i >= 0; i--) {\n this.world.remove(this.entities[i], deferred);\n }\n for (let i = this.timers.length - 1; i >= 0; i--) {\n this.removeTimer(this.timers[i]);\n }\n }\n /**\n * Adds a {@apilink Timer} to the scene\n * @param timer The timer to add\n */\n addTimer(timer) {\n this._timers.push(timer);\n timer.scene = this;\n return timer;\n }\n /**\n * Removes a {@apilink Timer} from the scene.\n * @warning Can be dangerous, use {@apilink cancelTimer} instead\n * @param timer The timer to remove\n */\n removeTimer(timer) {\n const i = this._timers.indexOf(timer);\n if (i !== -1) {\n this._timers.splice(i, 1);\n }\n return timer;\n }\n /**\n * Cancels a {@apilink Timer}, removing it from the scene nicely\n * @param timer The timer to cancel\n */\n cancelTimer(timer) {\n this._cancelQueue.push(timer);\n return timer;\n }\n /**\n * Tests whether a {@apilink Timer} is active in the scene\n */\n isTimerActive(timer) {\n return this._timers.indexOf(timer) > -1 && !timer.complete;\n }\n isCurrentScene() {\n if (this.engine) {\n return this.engine.currentScene === this;\n }\n return false;\n }\n _collectActorStats(engine) {\n const actors = this.actors;\n for (let i = 0; i < actors.length; i++) {\n const actor = actors[i];\n if (actor instanceof _ScreenElement__WEBPACK_IMPORTED_MODULE_24__.ScreenElement) {\n engine.stats.currFrame.actors.ui++;\n }\n engine.stats.currFrame.actors.alive++;\n for (let j = 0; j < actor.children.length; j++) {\n const child = actor.children[j];\n if ((0,_ScreenElement__WEBPACK_IMPORTED_MODULE_24__.isScreenElement)(child)) {\n // TODO not true\n engine.stats.currFrame.actors.ui++;\n }\n else {\n engine.stats.currFrame.actors.alive++;\n }\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Screen.ts\":\n/*!*******************!*\\\n !*** ./Screen.ts ***!\n \\*******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DisplayMode: () => (/* binding */ DisplayMode),\n/* harmony export */ Resolution: () => (/* binding */ Resolution),\n/* harmony export */ Screen: () => (/* binding */ Screen),\n/* harmony export */ ScreenEvents: () => (/* binding */ ScreenEvents)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Collision_Index__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Collision/Index */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Util/Util */ \"./Util/Util.ts\");\n/* harmony import */ var _Graphics_Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Graphics/Context/ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _Graphics_Context_ExcaliburGraphicsContext2DCanvas__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Graphics/Context/ExcaliburGraphicsContext2DCanvas */ \"./Graphics/Context/ExcaliburGraphicsContext2DCanvas.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n\n\n\n\n/**\n * Enum representing the different display modes available to Excalibur.\n */\nvar DisplayMode;\n(function (DisplayMode) {\n /**\n * Default, use a specified resolution for the game. Like 800x600 pixels for example.\n */\n DisplayMode[\"Fixed\"] = \"Fixed\";\n /**\n * Fit the aspect ratio given by the game resolution within the container at all times will fill any gaps with canvas.\n * The displayed area outside the aspect ratio is not guaranteed to be on the screen, only the {@apilink Screen.contentArea}\n * is guaranteed to be on screen.\n */\n DisplayMode[\"FitContainerAndFill\"] = \"FitContainerAndFill\";\n /**\n * Fit the aspect ratio given by the game resolution the screen at all times will fill the screen.\n * This displayed area outside the aspect ratio is not guaranteed to be on the screen, only the {@apilink Screen.contentArea}\n * is guaranteed to be on screen.\n */\n DisplayMode[\"FitScreenAndFill\"] = \"FitScreenAndFill\";\n /**\n * Fit the viewport to the parent element maintaining aspect ratio given by the game resolution, but zooms in to avoid the black bars\n * (letterbox) that would otherwise be present in {@apilink FitContainer}.\n *\n * **warning** This will clip some drawable area from the user because of the zoom,\n * use {@apilink Screen.contentArea} to know the safe to draw area.\n */\n DisplayMode[\"FitContainerAndZoom\"] = \"FitContainerAndZoom\";\n /**\n * Fit the viewport to the device screen maintaining aspect ratio given by the game resolution, but zooms in to avoid the black bars\n * (letterbox) that would otherwise be present in {@apilink FitScreen}.\n *\n * **warning** This will clip some drawable area from the user because of the zoom,\n * use {@apilink Screen.contentArea} to know the safe to draw area.\n */\n DisplayMode[\"FitScreenAndZoom\"] = \"FitScreenAndZoom\";\n /**\n * Fit to screen using as much space as possible while maintaining aspect ratio and resolution.\n * This is not the same as {@apilink Screen.goFullScreen} but behaves in a similar way maintaining aspect ratio.\n *\n * You may want to center your game here is an example\n * ```html\n * \n * \n *
\n * \n *
\n * \n * ```\n *\n * ```css\n * // css\n * main {\n * display: flex;\n * align-items: center;\n * justify-content: center;\n * height: 100%;\n * width: 100%;\n * }\n * ```\n */\n DisplayMode[\"FitScreen\"] = \"FitScreen\";\n /**\n * Fill the entire screen's css width/height for the game resolution dynamically. This means the resolution of the game will\n * change dynamically as the window is resized. This is not the same as {@apilink Screen.goFullScreen}\n */\n DisplayMode[\"FillScreen\"] = \"FillScreen\";\n /**\n * Fit to parent element width/height using as much space as possible while maintaining aspect ratio and resolution.\n */\n DisplayMode[\"FitContainer\"] = \"FitContainer\";\n /**\n * Use the parent DOM container's css width/height for the game resolution dynamically\n */\n DisplayMode[\"FillContainer\"] = \"FillContainer\";\n})(DisplayMode || (DisplayMode = {}));\n/**\n * Convenience class for quick resolutions\n * Mostly sourced from https://emulation.gametechwiki.com/index.php/Resolution\n */\nclass Resolution {\n /* istanbul ignore next */\n static get SVGA() {\n return { width: 800, height: 600 };\n }\n /* istanbul ignore next */\n static get Standard() {\n return { width: 1920, height: 1080 };\n }\n /* istanbul ignore next */\n static get Atari2600() {\n return { width: 160, height: 192 };\n }\n /* istanbul ignore next */\n static get GameBoy() {\n return { width: 160, height: 144 };\n }\n /* istanbul ignore next */\n static get GameBoyAdvance() {\n return { width: 240, height: 160 };\n }\n /* istanbul ignore next */\n static get NintendoDS() {\n return { width: 256, height: 192 };\n }\n /* istanbul ignore next */\n static get NES() {\n return { width: 256, height: 224 };\n }\n /* istanbul ignore next */\n static get SNES() {\n return { width: 256, height: 244 };\n }\n}\nconst ScreenEvents = {\n ScreenResize: 'resize',\n PixelRatioChange: 'pixelratio',\n FullScreenChange: 'fullscreen'\n};\n/**\n * The Screen handles all aspects of interacting with the screen for Excalibur.\n */\nclass Screen {\n constructor(options) {\n var _a, _b, _c, _d;\n /**\n * Listen to screen events {@apilink ScreenEvents}\n */\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n this._antialiasing = true;\n this._canvasImageRendering = 'auto';\n this._resolutionStack = [];\n this._viewportStack = [];\n this._pixelRatioOverride = null;\n this._isFullscreen = false;\n this._isDisposed = false;\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this._fullscreenChangeHandler = () => {\n if (this._isDisposed) {\n return;\n }\n this._isFullscreen = !this._isFullscreen;\n this._logger.debug('Fullscreen Change', this._isFullscreen);\n this.events.emit('fullscreen', {\n fullscreen: this.isFullScreen\n });\n };\n this._pixelRatioChangeHandler = () => {\n if (this._isDisposed) {\n return;\n }\n this._logger.debug('Pixel Ratio Change', window.devicePixelRatio);\n this._listenForPixelRatio();\n this._devicePixelRatio = this._calculateDevicePixelRatio();\n this.applyResolutionAndViewport();\n this.events.emit('pixelratio', {\n pixelRatio: this.pixelRatio\n });\n };\n this._resizeHandler = () => {\n if (this._isDisposed) {\n return;\n }\n const parent = this.parent;\n this._logger.debug('View port resized');\n this._setResolutionAndViewportByDisplayMode(parent);\n this.applyResolutionAndViewport();\n // Emit resize event\n this.events.emit('resize', {\n resolution: this.resolution,\n viewport: this.viewport\n });\n };\n // Asking the window.devicePixelRatio is expensive we do it once\n this._devicePixelRatio = this._calculateDevicePixelRatio();\n this._contentArea = new _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox();\n this._unsafeArea = new _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox();\n this.viewport = options.viewport;\n this.resolution = (_a = options.resolution) !== null && _a !== void 0 ? _a : { ...this.viewport };\n this._contentResolution = this.resolution;\n this._displayMode = (_b = options.displayMode) !== null && _b !== void 0 ? _b : DisplayMode.Fixed;\n this._canvas = options.canvas;\n this.graphicsContext = options.context;\n this._antialiasing = (_c = options.antialiasing) !== null && _c !== void 0 ? _c : this._antialiasing;\n this._canvasImageRendering = (_d = options.canvasImageRendering) !== null && _d !== void 0 ? _d : this._canvasImageRendering;\n this._browser = options.browser;\n this._pixelRatioOverride = options.pixelRatio;\n this._applyDisplayMode();\n this._listenForPixelRatio();\n this._canvas.addEventListener('fullscreenchange', this._fullscreenChangeHandler);\n this.applyResolutionAndViewport();\n }\n _listenForPixelRatio() {\n if (this._mediaQueryList && !this._mediaQueryList.addEventListener) {\n // Safari <=13.1 workaround, remove any existing handlers\n this._mediaQueryList.removeListener(this._pixelRatioChangeHandler);\n }\n this._mediaQueryList = this._browser.window.nativeComponent.matchMedia(`(resolution: ${window.devicePixelRatio}dppx)`);\n // Safari <=13.1 workaround\n if (this._mediaQueryList.addEventListener) {\n this._mediaQueryList.addEventListener('change', this._pixelRatioChangeHandler, { once: true });\n }\n else {\n this._mediaQueryList.addListener(this._pixelRatioChangeHandler);\n }\n }\n dispose() {\n if (!this._isDisposed) {\n // Clean up handlers\n this._isDisposed = true;\n this.events.clear();\n this._browser.window.off('resize', this._resizeHandler);\n this._browser.window.clear();\n if (this._resizeObserver) {\n this._resizeObserver.disconnect();\n }\n this.parent.removeEventListener('resize', this._resizeHandler);\n // Safari <=13.1 workaround\n if (this._mediaQueryList.removeEventListener) {\n this._mediaQueryList.removeEventListener('change', this._pixelRatioChangeHandler);\n }\n else {\n this._mediaQueryList.removeListener(this._pixelRatioChangeHandler);\n }\n this._canvas.removeEventListener('fullscreenchange', this._fullscreenChangeHandler);\n this._canvas = null;\n }\n }\n _calculateDevicePixelRatio() {\n if (window.devicePixelRatio < 1) {\n return 1;\n }\n const devicePixelRatio = window.devicePixelRatio || 1;\n return devicePixelRatio;\n }\n /**\n * Returns the computed pixel ratio, first using any override, then the device pixel ratio\n */\n get pixelRatio() {\n if (this._pixelRatioOverride) {\n return this._pixelRatioOverride;\n }\n return this._devicePixelRatio;\n }\n /**\n * This calculates the ratio between excalibur pixels and the HTML pixels.\n *\n * This is useful for scaling HTML UI so that it matches your game.\n */\n get worldToPagePixelRatio() {\n if (this._canvas) {\n const pageOrigin = this.worldToPageCoordinates(_Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero);\n const pageDistance = this.worldToPageCoordinates((0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(1, 0)).sub(pageOrigin);\n const pixelConversion = pageDistance.x;\n return pixelConversion;\n }\n else {\n return 1;\n }\n }\n /**\n * Get or set the pixel ratio override\n *\n * You will need to call applyResolutionAndViewport() affect change on the screen\n */\n get pixelRatioOverride() {\n return this._pixelRatioOverride;\n }\n set pixelRatioOverride(value) {\n this._pixelRatioOverride = value;\n }\n get isHiDpi() {\n return this.pixelRatio !== 1;\n }\n get displayMode() {\n return this._displayMode;\n }\n get canvas() {\n return this._canvas;\n }\n get parent() {\n switch (this.displayMode) {\n case DisplayMode.FillContainer:\n case DisplayMode.FitContainer:\n case DisplayMode.FitContainerAndFill:\n case DisplayMode.FitContainerAndZoom:\n return this.canvas.parentElement || document.body;\n default:\n return window;\n }\n }\n get resolution() {\n return this._resolution;\n }\n set resolution(resolution) {\n this._resolution = resolution;\n }\n /**\n * Returns screen dimensions in pixels or percentage\n */\n get viewport() {\n if (this._viewport) {\n return this._viewport;\n }\n return this._resolution;\n }\n set viewport(viewport) {\n this._viewport = viewport;\n }\n get aspectRatio() {\n return this._resolution.width / this._resolution.height;\n }\n get scaledWidth() {\n return this._resolution.width * this.pixelRatio;\n }\n get scaledHeight() {\n return this._resolution.height * this.pixelRatio;\n }\n setCurrentCamera(camera) {\n this._camera = camera;\n }\n pushResolutionAndViewport() {\n this._resolutionStack.push(this.resolution);\n this._viewportStack.push(this.viewport);\n this.resolution = { ...this.resolution };\n this.viewport = { ...this.viewport };\n }\n peekViewport() {\n return this._viewportStack[this._viewportStack.length - 1];\n }\n peekResolution() {\n return this._resolutionStack[this._resolutionStack.length - 1];\n }\n popResolutionAndViewport() {\n if (this._resolutionStack.length && this._viewportStack.length) {\n this.resolution = this._resolutionStack.pop();\n this.viewport = this._viewportStack.pop();\n }\n }\n applyResolutionAndViewport() {\n if (this.graphicsContext instanceof _Graphics_Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_4__.ExcaliburGraphicsContextWebGL) {\n const scaledResolutionSupported = this.graphicsContext.checkIfResolutionSupported({\n width: this.scaledWidth,\n height: this.scaledHeight\n });\n if (!scaledResolutionSupported) {\n this._logger.warnOnce(`The currently configured resolution (${this.resolution.width}x${this.resolution.height}) and pixel ratio (${this.pixelRatio})` +\n ' are too large for the platform WebGL implementation, this may work but cause WebGL rendering to behave oddly.' +\n ' Try reducing the resolution or disabling Hi DPI scaling to avoid this' +\n ' (read more here https://excaliburjs.com/docs/screens#understanding-viewport--resolution).');\n // Attempt to recover if the user hasn't configured a specific ratio for up scaling\n if (!this.pixelRatioOverride) {\n let currentPixelRatio = Math.max(1, this.pixelRatio - 0.5);\n let newResolutionSupported = false;\n while (currentPixelRatio > 1 && !newResolutionSupported) {\n currentPixelRatio = Math.max(1, currentPixelRatio - 0.5);\n const width = this._resolution.width * currentPixelRatio;\n const height = this._resolution.height * currentPixelRatio;\n newResolutionSupported = this.graphicsContext.checkIfResolutionSupported({ width, height });\n }\n this.pixelRatioOverride = currentPixelRatio;\n this._logger.warnOnce('Scaled resolution too big attempted recovery!' +\n ` Pixel ratio was automatically reduced to (${this.pixelRatio}) to avoid 4k texture limit.` +\n ' Setting `ex.Engine({pixelRatio: ...}) will override any automatic recalculation, do so at your own risk.` ' +\n ' (read more here https://excaliburjs.com/docs/screens#understanding-viewport--resolution).');\n }\n }\n }\n this._canvas.width = this.scaledWidth;\n this._canvas.height = this.scaledHeight;\n if (this._canvasImageRendering === 'auto') {\n this._canvas.style.imageRendering = 'auto';\n }\n else {\n this._canvas.style.imageRendering = 'pixelated';\n // Fall back to 'crisp-edges' if 'pixelated' is not supported\n // Currently for firefox https://developer.mozilla.org/en-US/docs/Web/CSS/image-rendering\n if (this._canvas.style.imageRendering === '') {\n this._canvas.style.imageRendering = 'crisp-edges';\n }\n }\n const widthUnit = this.viewport.widthUnit === 'percent' ? '%' : 'px';\n const heightUnit = this.viewport.heightUnit === 'percent' ? '%' : 'px';\n this._canvas.style.width = this.viewport.width + widthUnit;\n this._canvas.style.height = this.viewport.height + heightUnit;\n // After messing with the canvas width/height the graphics context is invalidated and needs to have some properties reset\n this.graphicsContext.updateViewport(this.resolution);\n this.graphicsContext.resetTransform();\n this.graphicsContext.smoothing = this._antialiasing;\n if (this.graphicsContext instanceof _Graphics_Context_ExcaliburGraphicsContext2DCanvas__WEBPACK_IMPORTED_MODULE_5__.ExcaliburGraphicsContext2DCanvas) {\n this.graphicsContext.scale(this.pixelRatio, this.pixelRatio);\n }\n // Add the excalibur world pixel to page pixel\n document.documentElement.style.setProperty('--ex-pixel-ratio', this.worldToPagePixelRatio.toString());\n }\n /**\n * Get or set screen antialiasing,\n *\n * If true smoothing is applied\n */\n get antialiasing() {\n return this._antialiasing;\n }\n /**\n * Get or set screen antialiasing\n */\n set antialiasing(isSmooth) {\n this._antialiasing = isSmooth;\n this.graphicsContext.smoothing = this._antialiasing;\n }\n /**\n * Returns true if excalibur is fullscreen using the browser fullscreen api\n * @deprecated use isFullscreen()\n */\n get isFullScreen() {\n return this._isFullscreen;\n }\n /**\n * Returns true if excalibur is fullscreen using the browser fullscreen api\n */\n get isFullscreen() {\n return this._isFullscreen;\n }\n /**\n * Requests to go fullscreen using the browser fullscreen api, requires user interaction to be successful.\n * For example, wire this to a user click handler.\n *\n * Optionally specify a target element id to go fullscreen, by default the game canvas is used\n * @param elementId\n * @deprecated use enterFullscreen(...)\n */\n goFullScreen(elementId) {\n return this.enterFullscreen(elementId);\n }\n /**\n * Requests to enter fullscreen using the browser fullscreen api, requires user interaction to be successful.\n * For example, wire this to a user click handler.\n *\n * Optionally specify a target element id to go fullscreen, by default the game canvas is used\n * @param elementId\n */\n enterFullscreen(elementId) {\n if (elementId) {\n const maybeElement = document.getElementById(elementId);\n if (maybeElement) {\n if (!maybeElement.getAttribute('ex-fullscreen-listener')) {\n maybeElement.setAttribute('ex-fullscreen-listener', 'true');\n maybeElement.addEventListener('fullscreenchange', this._fullscreenChangeHandler);\n }\n const fullscreenPromise = maybeElement.requestFullscreen();\n return fullscreenPromise;\n }\n }\n return this._canvas.requestFullscreen();\n }\n /**\n * Requests to exit fullscreen using the browser fullscreen api\n * @deprecated use exitFullscreen()\n */\n exitFullScreen() {\n return this.exitFullscreen();\n }\n exitFullscreen() {\n return document.exitFullscreen();\n }\n _viewportToPixels(viewport) {\n return {\n width: viewport.widthUnit === 'percent' ? this.canvas.offsetWidth : viewport.width,\n height: viewport.heightUnit === 'percent' ? this.canvas.offsetHeight : viewport.height\n };\n }\n /**\n * Takes a coordinate in normal html page space, for example from a pointer move event, and translates it to\n * Excalibur screen space.\n *\n * Excalibur screen space starts at the top left (0, 0) corner of the viewport, and extends to the\n * bottom right corner (resolutionX, resolutionY). When using *AndFill suffixed display modes screen space\n * (0, 0) is the top left of the safe content area bounding box not the viewport.\n * @param point\n */\n pageToScreenCoordinates(point) {\n let newX = point.x;\n let newY = point.y;\n if (!this._isFullscreen) {\n newX -= (0,_Util_Util__WEBPACK_IMPORTED_MODULE_6__.getPosition)(this._canvas).x;\n newY -= (0,_Util_Util__WEBPACK_IMPORTED_MODULE_6__.getPosition)(this._canvas).y;\n }\n const viewport = this._viewportToPixels(this.viewport);\n // if fullscreen api on it centers with black bars\n // we need to adjust the screen to world coordinates in this case\n if (this._isFullscreen) {\n if (window.innerWidth / this.aspectRatio < window.innerHeight) {\n const screenHeight = window.innerWidth / this.aspectRatio;\n const screenMarginY = (window.innerHeight - screenHeight) / 2;\n newY = ((newY - screenMarginY) / screenHeight) * viewport.height;\n newX = (newX / window.innerWidth) * viewport.width;\n }\n else {\n const screenWidth = window.innerHeight * this.aspectRatio;\n const screenMarginX = (window.innerWidth - screenWidth) / 2;\n newX = ((newX - screenMarginX) / screenWidth) * viewport.width;\n newY = (newY / window.innerHeight) * viewport.height;\n }\n }\n newX = (newX / viewport.width) * this.resolution.width;\n newY = (newY / viewport.height) * this.resolution.height;\n // offset by content area\n newX = newX - this.contentArea.left;\n newY = newY - this.contentArea.top;\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(newX, newY);\n }\n /**\n * Takes a coordinate in Excalibur screen space, and translates it to normal html page space. For example,\n * this is where html elements might live if you want to position them relative to Excalibur.\n *\n * Excalibur screen space starts at the top left (0, 0) corner of the viewport, and extends to the\n * bottom right corner (resolutionX, resolutionY)\n * @param point\n */\n screenToPageCoordinates(point) {\n let newX = point.x;\n let newY = point.y;\n // no need to offset by content area, drawing is already offset by this\n const viewport = this._viewportToPixels(this.viewport);\n newX = (newX / this.resolution.width) * viewport.width;\n newY = (newY / this.resolution.height) * viewport.height;\n if (this._isFullscreen) {\n if (window.innerWidth / this.aspectRatio < window.innerHeight) {\n const screenHeight = window.innerWidth / this.aspectRatio;\n const screenMarginY = (window.innerHeight - screenHeight) / 2;\n newY = (newY / viewport.height) * screenHeight + screenMarginY;\n newX = (newX / viewport.width) * window.innerWidth;\n }\n else {\n const screenWidth = window.innerHeight * this.aspectRatio;\n const screenMarginX = (window.innerWidth - screenWidth) / 2;\n newX = (newX / viewport.width) * screenWidth + screenMarginX;\n newY = (newY / viewport.height) * window.innerHeight;\n }\n }\n if (!this._isFullscreen) {\n newX += (0,_Util_Util__WEBPACK_IMPORTED_MODULE_6__.getPosition)(this._canvas).x;\n newY += (0,_Util_Util__WEBPACK_IMPORTED_MODULE_6__.getPosition)(this._canvas).y;\n }\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(newX, newY);\n }\n /**\n * Takes a coordinate in Excalibur screen space, and translates it to Excalibur world space.\n *\n * World space is where {@apilink Entity | `entities`} in Excalibur live by default {@apilink CoordPlane.World}\n * and extends infinitely out relative from the {@apilink Camera}.\n * @param point Screen coordinate to convert\n */\n screenToWorldCoordinates(point) {\n // offset by content area\n point = point.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this.contentArea.left, this.contentArea.top));\n // the only difference between screen & world is the camera transform\n if (this._camera) {\n return this._camera.inverse.multiply(point);\n }\n return point.sub((0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this.resolution.width / 2, this.resolution.height / 2));\n }\n /**\n * Takes a coordinate in Excalibur world space, and translates it to Excalibur screen space.\n *\n * Screen space is where {@apilink ScreenElement | `screen elements`} and {@apilink Entity | `entities`} with {@apilink CoordPlane.Screen} live.\n * @param point World coordinate to convert\n */\n worldToScreenCoordinates(point) {\n if (this._camera) {\n return this._camera.transform.multiply(point);\n }\n return point.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this.resolution.width / 2, this.resolution.height / 2));\n }\n pageToWorldCoordinates(point) {\n const screen = this.pageToScreenCoordinates(point);\n return this.screenToWorldCoordinates(screen);\n }\n worldToPageCoordinates(point) {\n const screen = this.worldToScreenCoordinates(point);\n return this.screenToPageCoordinates(screen);\n }\n /**\n * Returns a BoundingBox of the top left corner of the screen\n * and the bottom right corner of the screen.\n *\n * World bounds are in world coordinates, useful for culling objects offscreen that are in world space\n */\n getWorldBounds() {\n const bounds = _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromDimension(this.resolution.width, this.resolution.height, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Half)\n .scale((0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(1 / this._camera.zoom, 1 / this._camera.zoom))\n .rotate(this._camera.rotation)\n .translate(this._camera.drawPos);\n return bounds;\n }\n /**\n * Returns a BoundingBox of the top left corner of the screen and the bottom right corner of the screen.\n *\n * Screen bounds are in screen coordinates, useful for culling objects offscreen that are in screen space\n */\n getScreenBounds() {\n const bounds = _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromDimension(this.resolution.width, this.resolution.height, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero);\n return bounds;\n }\n /**\n * The width of the game canvas in pixels (physical width component of the\n * resolution of the canvas element)\n */\n get canvasWidth() {\n return this.canvas.width;\n }\n /**\n * Returns half width of the game canvas in pixels (half physical width component)\n */\n get halfCanvasWidth() {\n return this.canvas.width / 2;\n }\n /**\n * The height of the game canvas in pixels, (physical height component of\n * the resolution of the canvas element)\n */\n get canvasHeight() {\n return this.canvas.height;\n }\n /**\n * Returns half height of the game canvas in pixels (half physical height component)\n */\n get halfCanvasHeight() {\n return this.canvas.height / 2;\n }\n /**\n * Returns the width of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get drawWidth() {\n if (this._camera) {\n return this.resolution.width / this._camera.zoom;\n }\n return this.resolution.width;\n }\n /**\n * Returns the width of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get width() {\n if (this._camera) {\n return this.resolution.width / this._camera.zoom;\n }\n return this.resolution.width;\n }\n /**\n * Returns half the width of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get halfDrawWidth() {\n return this.drawWidth / 2;\n }\n /**\n * Returns the height of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get drawHeight() {\n if (this._camera) {\n return this.resolution.height / this._camera.zoom;\n }\n return this.resolution.height;\n }\n get height() {\n if (this._camera) {\n return this.resolution.height / this._camera.zoom;\n }\n return this.resolution.height;\n }\n /**\n * Returns half the height of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get halfDrawHeight() {\n return this.drawHeight / 2;\n }\n /**\n * Returns screen center coordinates including zoom and device pixel ratio.\n */\n get center() {\n return (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this.halfDrawWidth, this.halfDrawHeight);\n }\n /**\n * Returns the content area in screen space where it is safe to place content\n */\n get contentArea() {\n return this._contentArea;\n }\n /**\n * Returns the unsafe area in screen space, this is the full screen and some space may not be onscreen.\n */\n get unsafeArea() {\n return this._unsafeArea;\n }\n _computeFit() {\n document.body.style.margin = '0px';\n document.body.style.overflow = 'hidden';\n const aspect = this.aspectRatio;\n let adjustedWidth = 0;\n let adjustedHeight = 0;\n if (window.innerWidth / aspect < window.innerHeight) {\n adjustedWidth = window.innerWidth;\n adjustedHeight = window.innerWidth / aspect;\n }\n else {\n adjustedWidth = window.innerHeight * aspect;\n adjustedHeight = window.innerHeight;\n }\n this.viewport = {\n width: adjustedWidth,\n height: adjustedHeight\n };\n this._contentArea = _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromDimension(this.resolution.width, this.resolution.height, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero);\n this._unsafeArea = _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromDimension(this.resolution.width, this.resolution.height, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero);\n this.events.emit('resize', {\n resolution: this.resolution,\n viewport: this.viewport\n });\n }\n _computeFitScreenAndFill() {\n document.body.style.margin = '0px';\n document.body.style.overflow = 'hidden';\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n this._computeFitAndFill(vw, vh);\n this.events.emit('resize', {\n resolution: this.resolution,\n viewport: this.viewport\n });\n }\n _computeFitContainerAndFill() {\n this.canvas.style.width = '100%';\n this.canvas.style.height = '100%';\n this._computeFitAndFill(this.canvas.offsetWidth, this.canvas.offsetHeight, {\n width: 100,\n widthUnit: 'percent',\n height: 100,\n heightUnit: 'percent'\n });\n this.events.emit('resize', {\n resolution: this.resolution,\n viewport: this.viewport\n });\n }\n _computeFitAndFill(vw, vh, viewport) {\n this.viewport = viewport !== null && viewport !== void 0 ? viewport : {\n width: vw,\n height: vh\n };\n // if the current screen aspectRatio is less than the original aspectRatio\n if (vw / vh <= this._contentResolution.width / this._contentResolution.height) {\n // compute new resolution to match the original aspect ratio\n this.resolution = {\n width: (vw * this._contentResolution.width) / vw,\n height: (((vw * this._contentResolution.width) / vw) * vh) / vw\n };\n const clip = (this.resolution.height - this._contentResolution.height) / 2;\n this._contentArea = new _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox({\n top: clip,\n left: 0,\n right: this._contentResolution.width,\n bottom: this.resolution.height - clip\n });\n this._unsafeArea = new _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox({\n top: -clip,\n left: 0,\n right: this._contentResolution.width,\n bottom: this.resolution.height + clip\n });\n }\n else {\n this.resolution = {\n width: (((vh * this._contentResolution.height) / vh) * vw) / vh,\n height: (vh * this._contentResolution.height) / vh\n };\n const clip = (this.resolution.width - this._contentResolution.width) / 2;\n this._contentArea = new _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox({\n top: 0,\n left: clip,\n right: this.resolution.width - clip,\n bottom: this._contentResolution.height\n });\n this._unsafeArea = new _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox({\n top: 0,\n left: -clip,\n right: this.resolution.width + clip,\n bottom: this._contentResolution.height\n });\n }\n }\n _computeFitScreenAndZoom() {\n document.body.style.margin = '0px';\n document.body.style.overflow = 'hidden';\n this.canvas.style.position = 'absolute';\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n this._computeFitAndZoom(vw, vh);\n this.events.emit('resize', {\n resolution: this.resolution,\n viewport: this.viewport\n });\n }\n _computeFitContainerAndZoom() {\n this.canvas.style.width = '100%';\n this.canvas.style.height = '100%';\n this.canvas.style.position = 'relative';\n const parent = this.canvas.parentElement;\n parent.style.overflow = 'hidden';\n const { offsetWidth: vw, offsetHeight: vh } = this.canvas;\n this._computeFitAndZoom(vw, vh);\n this.events.emit('resize', {\n resolution: this.resolution,\n viewport: this.viewport\n });\n }\n _computeFitAndZoom(vw, vh) {\n const aspect = this.aspectRatio;\n let adjustedWidth = 0;\n let adjustedHeight = 0;\n if (vw / aspect < vh) {\n adjustedWidth = vw;\n adjustedHeight = vw / aspect;\n }\n else {\n adjustedWidth = vh * aspect;\n adjustedHeight = vh;\n }\n const scaleX = vw / adjustedWidth;\n const scaleY = vh / adjustedHeight;\n const maxScaleFactor = Math.max(scaleX, scaleY);\n const zoomedWidth = adjustedWidth * maxScaleFactor;\n const zoomedHeight = adjustedHeight * maxScaleFactor;\n // Center zoomed dimension if bigger than the screen\n if (zoomedWidth > vw) {\n this.canvas.style.left = -(zoomedWidth - vw) / 2 + 'px';\n }\n else {\n this.canvas.style.left = '';\n }\n if (zoomedHeight > vh) {\n this.canvas.style.top = -(zoomedHeight - vh) / 2 + 'px';\n }\n else {\n this.canvas.style.top = '';\n }\n this.viewport = {\n width: zoomedWidth,\n height: zoomedHeight\n };\n const bounds = _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromDimension(this.viewport.width, this.viewport.height, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero);\n // return safe area\n if (this.viewport.width > vw) {\n const clip = ((this.viewport.width - vw) / this.viewport.width) * this.resolution.width;\n bounds.top = 0;\n bounds.left = clip / 2;\n bounds.right = this.resolution.width - clip / 2;\n bounds.bottom = this.resolution.height;\n }\n if (this.viewport.height > vh) {\n const clip = ((this.viewport.height - vh) / this.viewport.height) * this.resolution.height;\n bounds.top = clip / 2;\n bounds.left = 0;\n bounds.bottom = this.resolution.height - clip / 2;\n bounds.right = this.resolution.width;\n }\n this._contentArea = bounds;\n }\n _computeFitContainer() {\n const aspect = this.aspectRatio;\n let adjustedWidth = 0;\n let adjustedHeight = 0;\n let widthUnit = 'pixel';\n let heightUnit = 'pixel';\n const parent = this.canvas.parentElement;\n if (parent.clientWidth / aspect < parent.clientHeight) {\n this.canvas.style.width = '100%';\n adjustedWidth = 100;\n widthUnit = 'percent';\n adjustedHeight = this.canvas.offsetWidth / aspect;\n }\n else {\n this.canvas.style.height = '100%';\n adjustedHeight = 100;\n heightUnit = 'percent';\n adjustedWidth = this.canvas.offsetHeight * aspect;\n }\n this.viewport = {\n width: adjustedWidth,\n widthUnit,\n height: adjustedHeight,\n heightUnit\n };\n this._contentArea = _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromDimension(this.resolution.width, this.resolution.height, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero);\n this.events.emit('resize', {\n resolution: this.resolution,\n viewport: this.viewport\n });\n }\n _applyDisplayMode() {\n this._setResolutionAndViewportByDisplayMode(this.parent);\n // watch resizing\n if (this.parent instanceof Window) {\n this._browser.window.on('resize', this._resizeHandler);\n }\n else {\n this._resizeObserver = new ResizeObserver(() => {\n this._resizeHandler();\n });\n this._resizeObserver.observe(this.parent);\n }\n this.parent.addEventListener('resize', this._resizeHandler);\n }\n /**\n * Sets the resolution and viewport based on the selected display mode.\n */\n _setResolutionAndViewportByDisplayMode(parent) {\n if (this.displayMode === DisplayMode.FillContainer) {\n this.canvas.style.width = '100%';\n this.canvas.style.height = '100%';\n this.viewport = {\n width: 100,\n widthUnit: 'percent',\n height: 100,\n heightUnit: 'percent'\n };\n this.resolution = {\n width: this.canvas.offsetWidth,\n height: this.canvas.offsetHeight\n };\n }\n if (this.displayMode === DisplayMode.FillScreen) {\n document.body.style.margin = '0px';\n document.body.style.overflow = 'hidden';\n this.resolution = {\n width: parent.innerWidth,\n height: parent.innerHeight\n };\n this.viewport = this.resolution;\n }\n this._contentArea = _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromDimension(this.resolution.width, this.resolution.height, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero);\n if (this.displayMode === DisplayMode.FitScreen) {\n this._computeFit();\n }\n if (this.displayMode === DisplayMode.FitContainer) {\n this._computeFitContainer();\n }\n if (this.displayMode === DisplayMode.FitScreenAndFill) {\n this._computeFitScreenAndFill();\n }\n if (this.displayMode === DisplayMode.FitContainerAndFill) {\n this._computeFitContainerAndFill();\n }\n if (this.displayMode === DisplayMode.FitScreenAndZoom) {\n this._computeFitScreenAndZoom();\n }\n if (this.displayMode === DisplayMode.FitContainerAndZoom) {\n this._computeFitContainerAndZoom();\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./ScreenElement.ts\":\n/*!**************************!*\\\n !*** ./ScreenElement.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ScreenElement: () => (/* binding */ ScreenElement),\n/* harmony export */ isScreenElement: () => (/* binding */ isScreenElement)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Actor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Actor */ \"./Actor.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Collision/CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Math/coord-plane */ \"./Math/coord-plane.ts\");\n\n\n\n\n\n/**\n * Type guard to detect a screen element\n */\nfunction isScreenElement(actor) {\n return actor instanceof ScreenElement;\n}\n/**\n * Helper {@apilink Actor} primitive for drawing UI's, optimized for UI drawing. Does\n * not participate in collisions. Drawn on top of all other actors.\n */\nclass ScreenElement extends _Actor__WEBPACK_IMPORTED_MODULE_0__.Actor {\n constructor(config) {\n var _a, _b;\n super({ ...config });\n this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).coordPlane = _Math_coord_plane__WEBPACK_IMPORTED_MODULE_2__.CoordPlane.Screen;\n this.anchor = (_a = config === null || config === void 0 ? void 0 : config.anchor) !== null && _a !== void 0 ? _a : (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(0, 0);\n this.body.collisionType = (_b = config === null || config === void 0 ? void 0 : config.collisionType) !== null && _b !== void 0 ? _b : _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.PreventCollision;\n this.pointer.useGraphicsBounds = true;\n this.pointer.useColliderShape = false;\n if (!(config === null || config === void 0 ? void 0 : config.collider) && (config === null || config === void 0 ? void 0 : config.width) > 0 && (config === null || config === void 0 ? void 0 : config.height) > 0) {\n this.collider.useBoxCollider(this.width, this.height, this.anchor);\n }\n }\n _initialize(engine) {\n this._engine = engine;\n super._initialize(engine);\n }\n contains(x, y, useWorld = true) {\n if (useWorld) {\n return super.contains(x, y);\n }\n const coords = this._engine.worldToScreenCoordinates(new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(x, y));\n return super.contains(coords.x, coords.y);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./TileMap/IsometricEntityComponent.ts\":\n/*!*********************************************!*\\\n !*** ./TileMap/IsometricEntityComponent.ts ***!\n \\*********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ IsometricEntityComponent: () => (/* binding */ IsometricEntityComponent)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Component */ \"./EntityComponentSystem/Component.ts\");\n\nclass IsometricEntityComponent extends _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n /**\n * Specify the isometric map to use to position this entity's z-index\n * @param mapOrOptions\n */\n constructor(mapOrOptions) {\n super();\n /**\n * Vertical \"height\" in the isometric world\n */\n this.elevation = 0;\n this.columns = mapOrOptions.columns;\n this.rows = mapOrOptions.rows;\n this.tileWidth = mapOrOptions.tileWidth;\n this.tileHeight = mapOrOptions.tileHeight;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./TileMap/IsometricEntitySystem.ts\":\n/*!******************************************!*\\\n !*** ./TileMap/IsometricEntitySystem.ts ***!\n \\******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ IsometricEntitySystem: () => (/* binding */ IsometricEntitySystem)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _IsometricEntityComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./IsometricEntityComponent */ \"./TileMap/IsometricEntityComponent.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Priority.ts\");\n\n\n\n\nclass IsometricEntitySystem extends _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.System {\n constructor(world) {\n super();\n this.world = world;\n this.systemType = _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.SystemType.Update;\n this.query = this.world.query([_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent, _IsometricEntityComponent__WEBPACK_IMPORTED_MODULE_2__.IsometricEntityComponent]);\n }\n update() {\n let transform;\n let iso;\n for (let i = 0; i < this.query.entities.length; i++) {\n const entity = this.query.entities[i];\n transform = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n iso = entity.get(_IsometricEntityComponent__WEBPACK_IMPORTED_MODULE_2__.IsometricEntityComponent);\n const maxZindexPerElevation = Math.max(iso.columns * iso.tileWidth, iso.rows * iso.tileHeight);\n const newZ = maxZindexPerElevation * iso.elevation + transform.pos.y;\n transform.z = newZ;\n }\n }\n}\nIsometricEntitySystem.priority = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_3__.SystemPriority.Lower;\n\n\n/***/ }),\n\n/***/ \"./TileMap/IsometricMap.ts\":\n/*!*********************************!*\\\n !*** ./TileMap/IsometricMap.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ IsometricMap: () => (/* binding */ IsometricMap),\n/* harmony export */ IsometricTile: () => (/* binding */ IsometricTile)\n/* harmony export */ });\n/* harmony import */ var _Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Collision/BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../Collision/ColliderComponent */ \"./Collision/ColliderComponent.ts\");\n/* harmony import */ var _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Collision/CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Collision_Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../Collision/Colliders/CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Graphics */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../Graphics */ \"./Graphics/DebugGraphicsComponent.ts\");\n/* harmony import */ var _IsometricEntityComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./IsometricEntityComponent */ \"./TileMap/IsometricEntityComponent.ts\");\n/* harmony import */ var _Input_PointerComponent__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../Input/PointerComponent */ \"./Input/PointerComponent.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Input_PointerEventsToObjectDispatcher__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../Input/PointerEventsToObjectDispatcher */ \"./Input/PointerEventsToObjectDispatcher.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass IsometricTile extends _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__.Entity {\n getGraphics() {\n return this._graphics;\n }\n /**\n * Tile graphics\n */\n addGraphic(graphic, options) {\n this._graphics.push(graphic);\n this._gfx.isVisible = this.map.isVisible;\n this._gfx.opacity = this.map.opacity;\n if (options === null || options === void 0 ? void 0 : options.offset) {\n this._gfx.offset = options.offset;\n }\n // TODO detect when this changes on the map and apply to all tiles\n this._gfx.localBounds = this._recalculateBounds();\n }\n _recalculateBounds() {\n let bounds = this._tileBounds.clone();\n for (const graphic of this._graphics) {\n const offset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(this.map.graphicsOffset.x - this.map.tileWidth / 2, this.map.graphicsOffset.y - (this.map.renderFromTopOfGraphic ? 0 : graphic.height - this.map.tileHeight));\n bounds = bounds.combine(graphic.localBounds.translate(offset));\n }\n return bounds;\n }\n removeGraphic(graphic) {\n const index = this._graphics.indexOf(graphic);\n if (index > -1) {\n this._graphics.splice(index, 1);\n }\n this._gfx.localBounds = this._recalculateBounds();\n }\n clearGraphics() {\n this._graphics.length = 0;\n this._gfx.isVisible = false;\n this._gfx.localBounds = this._recalculateBounds();\n }\n getColliders() {\n return this._colliders;\n }\n /**\n * Adds a collider to the IsometricTile\n *\n * **Note!** the {@apilink Tile.solid} must be set to true for it to act as a \"fixed\" collider\n * @param collider\n */\n addCollider(collider) {\n this._colliders.push(collider);\n this.map.flagCollidersDirty();\n }\n /**\n * Removes a collider from the IsometricTile\n * @param collider\n */\n removeCollider(collider) {\n const index = this._colliders.indexOf(collider);\n if (index > -1) {\n this._colliders.splice(index, 1);\n }\n this.map.flagCollidersDirty();\n }\n /**\n * Clears all colliders from the IsometricTile\n */\n clearColliders() {\n this._colliders.length = 0;\n this.map.flagCollidersDirty();\n }\n /**\n * Returns the top left corner of the {@apilink IsometricTile} in world space\n */\n get pos() {\n return this.map.tileToWorld((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(this.x, this.y));\n }\n /**\n * Returns the center of the {@apilink IsometricTile}\n */\n get center() {\n return this.pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, this.map.tileHeight / 2));\n }\n /**\n * Construct a new IsometricTile\n * @param x tile coordinate in x (not world position)\n * @param y tile coordinate in y (not world position)\n * @param graphicsOffset offset that tile should be shifted by (default (0, 0))\n * @param map reference to owning IsometricMap\n */\n constructor(x, y, graphicsOffset, map) {\n super([\n new _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent(),\n new _Graphics__WEBPACK_IMPORTED_MODULE_3__.GraphicsComponent({\n offset: graphicsOffset !== null && graphicsOffset !== void 0 ? graphicsOffset : _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero,\n onPostDraw: (gfx, elapsed) => this.draw(gfx, elapsed)\n }),\n new _IsometricEntityComponent__WEBPACK_IMPORTED_MODULE_4__.IsometricEntityComponent(map)\n ]);\n /**\n * Indicates whether this tile is solid\n */\n this.solid = false;\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_5__.EventEmitter();\n this._tileBounds = new _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox();\n this._graphics = [];\n /**\n * Tile colliders\n */\n this._colliders = [];\n /**\n * Arbitrary data storage per tile, useful for any game specific data\n */\n this.data = new Map();\n this.x = x;\n this.y = y;\n this.map = map;\n this._transform = this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n this._isometricEntityComponent = this.get(_IsometricEntityComponent__WEBPACK_IMPORTED_MODULE_4__.IsometricEntityComponent);\n const halfTileWidth = this.map.tileWidth / 2;\n const halfTileHeight = this.map.tileHeight / 2;\n // See https://clintbellanger.net/articles/isometric_math/ for formula\n // The x position shifts left with every y step\n const xPos = (this.x - this.y) * halfTileWidth;\n // The y position needs to go down with every x step\n const yPos = (this.x + this.y) * halfTileHeight;\n this._transform.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(xPos, yPos);\n this._isometricEntityComponent.elevation = map.elevation;\n this._gfx = this.get(_Graphics__WEBPACK_IMPORTED_MODULE_3__.GraphicsComponent);\n this._gfx.isVisible = false; // start not visible\n const totalWidth = this.map.tileWidth;\n const totalHeight = this.map.tileHeight;\n // initial guess at gfx bounds based on the tile\n const offset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, this.map.renderFromTopOfGraphic ? totalHeight : 0);\n this._gfx.localBounds = this._tileBounds = new _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox({\n left: -totalWidth / 2,\n top: -totalHeight,\n right: totalWidth / 2,\n bottom: totalHeight\n }).translate(offset);\n }\n draw(gfx, _elapsed) {\n const halfTileWidth = this.map.tileWidth / 2;\n gfx.save();\n // shift left origin to corner of map, not the left corner of the first sprite\n gfx.translate(-halfTileWidth, 0);\n for (const graphic of this._graphics) {\n graphic.draw(gfx, this.map.graphicsOffset.x, this.map.graphicsOffset.y - (this.map.renderFromTopOfGraphic ? 0 : graphic.height - this.map.tileHeight));\n }\n gfx.restore();\n }\n}\n/**\n * The IsometricMap is a special tile map that provides isometric rendering support to Excalibur\n *\n * The tileWidth and tileHeight should be the height and width in pixels of the parallelogram of the base of the tile art asset.\n * The tileWidth and tileHeight is not necessarily the same as your graphic pixel width and height.\n *\n * Please refer to the docs https://excaliburjs.com for more details calculating what your tile width and height should be given\n * your art assets.\n */\nclass IsometricMap extends _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__.Entity {\n /**\n * Whether tiles should be visible\n * @deprecated use isVisible\n */\n get visible() {\n return this.isVisible;\n }\n /**\n * Whether tiles should be visible\n * @deprecated use isVisible\n */\n set visible(val) {\n this.isVisible = val;\n }\n constructor(options) {\n super([\n new _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent(),\n new _Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_7__.BodyComponent({\n type: _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_8__.CollisionType.Fixed\n }),\n new _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_9__.ColliderComponent(),\n new _Input_PointerComponent__WEBPACK_IMPORTED_MODULE_10__.PointerComponent(),\n new _Graphics__WEBPACK_IMPORTED_MODULE_11__.DebugGraphicsComponent((ctx, debugFlags) => this.debug(ctx, debugFlags), false)\n ], options.name);\n this.elevation = 0;\n /**\n * Whether tiles should be visible\n */\n this.isVisible = true;\n /**\n * Opacity of tiles\n */\n this.opacity = 1.0;\n /**\n * Render the tile graphic from the top instead of the bottom\n *\n * default is `false` meaning rendering from the bottom\n */\n this.renderFromTopOfGraphic = false;\n this.graphicsOffset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0);\n this._collidersDirty = false;\n this._originalOffsets = new WeakMap();\n const { pos, tileWidth, tileHeight, columns: width, rows: height, renderFromTopOfGraphic, graphicsOffset, elevation } = options;\n this.transform = this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n if (pos) {\n this.transform.pos = pos;\n }\n this.collider = this.get(_Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_9__.ColliderComponent);\n if (this.collider) {\n this.collider.set((this._composite = new _Collision_Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_12__.CompositeCollider([])));\n }\n this.pointer = this.get(_Input_PointerComponent__WEBPACK_IMPORTED_MODULE_10__.PointerComponent);\n this.renderFromTopOfGraphic = renderFromTopOfGraphic !== null && renderFromTopOfGraphic !== void 0 ? renderFromTopOfGraphic : this.renderFromTopOfGraphic;\n this.graphicsOffset = graphicsOffset !== null && graphicsOffset !== void 0 ? graphicsOffset : this.graphicsOffset;\n this.elevation = elevation !== null && elevation !== void 0 ? elevation : this.elevation;\n this.tileWidth = tileWidth;\n this.tileHeight = tileHeight;\n this.columns = width;\n this.rows = height;\n this._pointerEventDispatcher = new _Input_PointerEventsToObjectDispatcher__WEBPACK_IMPORTED_MODULE_13__.PointerEventsToObjectDispatcher();\n this.tiles = new Array(width * height);\n // build up tile representation\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const tile = new IsometricTile(x, y, this.graphicsOffset, this);\n this.tiles[x + y * width] = tile;\n this.addChild(tile);\n this._pointerEventDispatcher.addObject(tile, (p) => this.getTileByPoint(p.worldPos) === tile, () => true);\n }\n }\n this.pointer.localBounds = _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox.fromDimension(tileWidth * width * this.transform.scale.x, tileHeight * height * this.transform.scale.y, (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0.5, 0));\n }\n /**\n * @internal\n */\n _processPointerToObject(receiver) {\n this._pointerEventDispatcher.processPointerToObject(receiver, this.tiles);\n }\n /**\n * @internal\n */\n _dispatchPointerEvents(receiver) {\n this._pointerEventDispatcher.dispatchEvents(receiver, this.tiles);\n }\n update() {\n if (this._collidersDirty) {\n this.updateColliders();\n this._collidersDirty = false;\n }\n this._pointerEventDispatcher.clear();\n }\n flagCollidersDirty() {\n this._collidersDirty = true;\n }\n _getOrSetColliderOriginalOffset(collider) {\n var _a;\n if (!this._originalOffsets.has(collider)) {\n const originalOffset = collider.offset;\n this._originalOffsets.set(collider, originalOffset);\n return originalOffset;\n }\n else {\n return (_a = this._originalOffsets.get(collider)) !== null && _a !== void 0 ? _a : _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n }\n }\n updateColliders() {\n this._composite.clearColliders();\n const pos = this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent).pos;\n for (const tile of this.tiles) {\n if (tile.solid) {\n for (const collider of tile.getColliders()) {\n const originalOffset = this._getOrSetColliderOriginalOffset(collider);\n collider.offset = this.tileToWorld((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(tile.x, tile.y))\n .sub(pos)\n .add(originalOffset)\n .sub((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(this.tileWidth / 2, this.tileHeight)); // We need to unshift height based on drawing\n collider.owner = this;\n this._composite.addCollider(collider);\n }\n }\n }\n this.collider.update();\n }\n /**\n * Convert world space coordinates to the tile x, y coordinate\n * @param worldCoordinate\n */\n worldToTile(worldCoordinate) {\n // TODO I don't think this handles parent transform see TileMap\n worldCoordinate = worldCoordinate.sub(this.transform.globalPos);\n const halfTileWidth = this.tileWidth / 2;\n const halfTileHeight = this.tileHeight / 2;\n // See https://clintbellanger.net/articles/isometric_math/ for formula\n return (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(~~((worldCoordinate.x / halfTileWidth + worldCoordinate.y / halfTileHeight) / 2), ~~((worldCoordinate.y / halfTileHeight - worldCoordinate.x / halfTileWidth) / 2));\n }\n /**\n * Given a tile coordinate, return the top left corner in world space\n * @param tileCoordinate\n */\n tileToWorld(tileCoordinate) {\n const halfTileWidth = this.tileWidth / 2;\n const halfTileHeight = this.tileHeight / 2;\n // The x position shifts left with every y step\n const xPos = (tileCoordinate.x - tileCoordinate.y) * halfTileWidth;\n // The y position needs to go down with every x step\n const yPos = (tileCoordinate.x + tileCoordinate.y) * halfTileHeight;\n return (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(xPos, yPos).add(this.transform.pos);\n }\n /**\n * Returns the {@apilink IsometricTile} by its x and y coordinates\n */\n getTile(x, y) {\n if (x < 0 || y < 0 || x >= this.columns || y >= this.rows) {\n return null;\n }\n return this.tiles[x + y * this.columns];\n }\n /**\n * Returns the {@apilink IsometricTile} by testing a point in world coordinates,\n * returns `null` if no Tile was found.\n */\n getTileByPoint(point) {\n const tileCoord = this.worldToTile(point);\n const tile = this.getTile(tileCoord.x, tileCoord.y);\n return tile;\n }\n _getMaxZIndex() {\n let maxZ = Number.NEGATIVE_INFINITY;\n for (const tile of this.tiles) {\n const currentZ = tile.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent).z;\n if (currentZ > maxZ) {\n maxZ = currentZ;\n }\n }\n return maxZ;\n }\n /**\n * Debug draw for IsometricMap, called internally by excalibur when debug mode is toggled on\n * @param gfx\n */\n debug(gfx, debugFlags) {\n const { showAll, showPosition, positionColor, positionSize, showGrid, gridColor, gridWidth, showColliderGeometry } = debugFlags.isometric;\n const { geometryColor, geometryLineWidth, geometryPointSize } = debugFlags.collider;\n gfx.save();\n gfx.z = this._getMaxZIndex() + 0.5;\n if (showAll || showGrid) {\n for (let y = 0; y < this.rows + 1; y++) {\n const left = this.tileToWorld((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, y));\n const right = this.tileToWorld((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(this.columns, y));\n gfx.drawLine(left, right, gridColor, gridWidth);\n }\n for (let x = 0; x < this.columns + 1; x++) {\n const top = this.tileToWorld((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(x, 0));\n const bottom = this.tileToWorld((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(x, this.rows));\n gfx.drawLine(top, bottom, gridColor, gridWidth);\n }\n }\n if (showAll || showPosition) {\n for (const tile of this.tiles) {\n gfx.drawCircle(this.tileToWorld((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(tile.x, tile.y)), positionSize, positionColor);\n }\n }\n if (showAll || showColliderGeometry) {\n for (const tile of this.tiles) {\n if (tile.solid) {\n // only draw solid tiles\n for (const collider of tile.getColliders()) {\n collider.debug(gfx, geometryColor, { lineWidth: geometryLineWidth, pointSize: geometryPointSize });\n }\n }\n }\n }\n gfx.restore();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./TileMap/TileMap.ts\":\n/*!****************************!*\\\n !*** ./TileMap/TileMap.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Tile: () => (/* binding */ Tile),\n/* harmony export */ TileMap: () => (/* binding */ TileMap),\n/* harmony export */ TileMapEvents: () => (/* binding */ TileMapEvents)\n/* harmony export */ });\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Collision/BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Collision/CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Collision_Colliders_Shape__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../Collision/Colliders/Shape */ \"./Collision/Colliders/Shape.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Graphics */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../Graphics */ \"./Graphics/ParallaxComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../Collision/ColliderComponent */ \"./Collision/ColliderComponent.ts\");\n/* harmony import */ var _Graphics_DebugGraphicsComponent__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../Graphics/DebugGraphicsComponent */ \"./Graphics/DebugGraphicsComponent.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../Math/coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Input_PointerComponent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../Input/PointerComponent */ \"./Input/PointerComponent.ts\");\n/* harmony import */ var _Input_PointerEventsToObjectDispatcher__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../Input/PointerEventsToObjectDispatcher */ \"./Input/PointerEventsToObjectDispatcher.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst TileMapEvents = {\n PreUpdate: 'preupdate',\n PostUpdate: 'postupdate',\n PreDraw: 'predraw',\n PostDraw: 'postdraw',\n PointerUp: 'pointerup',\n PointerDown: 'pointerdown',\n PointerMove: 'pointermove',\n PointerCancel: 'pointercancel'\n};\n/**\n * The TileMap provides a mechanism for doing flat 2D tiles rendered in a grid.\n *\n * TileMaps are useful for top down or side scrolling grid oriented games.\n */\nclass TileMap extends _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__.Entity {\n flagCollidersDirty() {\n this._collidersDirty = true;\n }\n flagTilesDirty() {\n for (let i = 0; i < this.tiles.length; i++) {\n if (this.tiles[i]) {\n this.tiles[i].flagDirty();\n }\n }\n }\n get x() {\n var _a;\n return (_a = this.transform.pos.x) !== null && _a !== void 0 ? _a : 0;\n }\n set x(val) {\n var _a;\n if ((_a = this.transform) === null || _a === void 0 ? void 0 : _a.pos) {\n this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(val, this.y);\n }\n }\n get y() {\n var _a, _b;\n return (_b = (_a = this.transform) === null || _a === void 0 ? void 0 : _a.pos.y) !== null && _b !== void 0 ? _b : 0;\n }\n set y(val) {\n var _a;\n if ((_a = this.transform) === null || _a === void 0 ? void 0 : _a.pos) {\n this.transform.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(this.x, val);\n }\n }\n get z() {\n var _a;\n return (_a = this.transform.z) !== null && _a !== void 0 ? _a : 0;\n }\n set z(val) {\n if (this.transform) {\n this.transform.z = val;\n }\n }\n get rotation() {\n var _a, _b;\n return (_b = (_a = this.transform) === null || _a === void 0 ? void 0 : _a.rotation) !== null && _b !== void 0 ? _b : 0;\n }\n set rotation(val) {\n if (this.transform) {\n this.transform.rotation = val;\n }\n }\n get scale() {\n var _a, _b;\n return (_b = (_a = this.transform) === null || _a === void 0 ? void 0 : _a.scale) !== null && _b !== void 0 ? _b : _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.One;\n }\n set scale(val) {\n var _a;\n if ((_a = this.transform) === null || _a === void 0 ? void 0 : _a.scale) {\n this.transform.scale = val;\n }\n }\n get pos() {\n return this.transform.pos;\n }\n set pos(val) {\n this.transform.pos = val;\n }\n get vel() {\n return this._motion.vel;\n }\n set vel(val) {\n this._motion.vel = val;\n }\n /**\n * Width of the whole tile map in pixels\n */\n get width() {\n return this.tileWidth * this.columns * this.scale.x;\n }\n /**\n * Height of the whole tilemap in pixels\n */\n get height() {\n return this.tileHeight * this.rows * this.scale.y;\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n /**\n * @param options\n */\n constructor(options) {\n var _a, _b, _c;\n super([], options.name);\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_3__.EventEmitter();\n this._token = 0;\n this.logger = _Util_Log__WEBPACK_IMPORTED_MODULE_4__.Logger.getInstance();\n this.tiles = [];\n this._rows = [];\n this._cols = [];\n this.renderFromTopOfGraphic = false;\n this.meshingLookBehind = 10;\n this._collidersDirty = true;\n this._oldRotation = 0;\n this._originalOffsets = new WeakMap();\n this.meshingLookBehind = (_a = options.meshingLookBehind) !== null && _a !== void 0 ? _a : this.meshingLookBehind;\n this.addComponent(new _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent());\n this.addComponent(new _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_5__.MotionComponent());\n this.addComponent(new _Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_6__.BodyComponent({\n type: _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_7__.CollisionType.Fixed\n }));\n this.addComponent(new _Graphics__WEBPACK_IMPORTED_MODULE_8__.GraphicsComponent({\n onPostDraw: (ctx, elapsed) => this.draw(ctx, elapsed)\n }));\n this.addComponent(new _Graphics_DebugGraphicsComponent__WEBPACK_IMPORTED_MODULE_9__.DebugGraphicsComponent((ctx, debugFlags) => this.debug(ctx, debugFlags), false));\n this.addComponent(new _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_10__.ColliderComponent());\n this.addComponent(new _Input_PointerComponent__WEBPACK_IMPORTED_MODULE_11__.PointerComponent());\n this.pointer = this.get(_Input_PointerComponent__WEBPACK_IMPORTED_MODULE_11__.PointerComponent);\n this._graphics = this.get(_Graphics__WEBPACK_IMPORTED_MODULE_8__.GraphicsComponent);\n this.transform = this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._motion = this.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_5__.MotionComponent);\n this.collider = this.get(_Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_10__.ColliderComponent);\n this._composite = this.collider.useCompositeCollider([]);\n this.transform.pos = (_b = options.pos) !== null && _b !== void 0 ? _b : _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero;\n this._oldPos = this.transform.pos.clone();\n this._oldScale = this.transform.scale.clone();\n this.renderFromTopOfGraphic = (_c = options.renderFromTopOfGraphic) !== null && _c !== void 0 ? _c : this.renderFromTopOfGraphic;\n this.tileWidth = options.tileWidth;\n this.tileHeight = options.tileHeight;\n this.rows = options.rows;\n this.columns = options.columns;\n this._pointerEventDispatcher = new _Input_PointerEventsToObjectDispatcher__WEBPACK_IMPORTED_MODULE_12__.PointerEventsToObjectDispatcher();\n this.tiles = new Array(this.rows * this.columns);\n this._rows = new Array(this.rows);\n this._cols = new Array(this.columns);\n let currentCol = [];\n for (let i = 0; i < this.columns; i++) {\n for (let j = 0; j < this.rows; j++) {\n const tile = new Tile({\n x: i,\n y: j,\n map: this\n });\n tile.map = this;\n this.tiles[i + j * this.columns] = tile;\n this._pointerEventDispatcher.addObject(tile, (vec) => {\n // TODO handle geometry/graphics\n return tile.bounds.contains(vec.worldPos);\n }, () => true);\n currentCol.push(tile);\n if (!this._rows[j]) {\n this._rows[j] = [];\n }\n this._rows[j].push(tile);\n }\n this._cols[i] = currentCol;\n currentCol = [];\n }\n this._graphics.localBounds = new _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_13__.BoundingBox({\n left: 0,\n top: 0,\n right: this.columns * this.tileWidth * this.scale.x,\n bottom: this.rows * this.tileHeight * this.scale.y\n });\n }\n _initialize(engine) {\n super._initialize(engine);\n this._engine = engine;\n }\n _getOrSetColliderOriginalOffset(collider) {\n var _a;\n if (!this._originalOffsets.has(collider)) {\n const originalOffset = collider.offset;\n this._originalOffsets.set(collider, originalOffset);\n return originalOffset;\n }\n else {\n return (_a = this._originalOffsets.get(collider)) !== null && _a !== void 0 ? _a : _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero;\n }\n }\n /**\n * Tiles colliders based on the solid tiles in the tilemap.\n */\n _updateColliders() {\n this.collider.$colliderRemoved.notifyAll(this._composite);\n this._composite.clearColliders();\n const colliders = [];\n this._composite = this.collider.useCompositeCollider([]);\n let current = null;\n /**\n * Returns wether or not the 2 boxes share an edge and are the same height\n * @param prev\n * @param next\n * @returns true if they share and edge, false if not\n */\n const shareEdges = (prev, next) => {\n if (prev && next) {\n // same top/bottom\n return (prev.top === next.top &&\n prev.bottom === next.bottom &&\n // Shared right/left edge\n prev.right === next.left);\n }\n return false;\n };\n /**\n * Potentially merges the current collider into a list of previous ones, mutating the list\n * If checkAndCombine returns true, the collider was successfully merged and should be thrown away\n * @param current current collider to test\n * @param colliders List of colliders to consider merging with\n * @param maxLookBack The amount of colliders to look back for combination\n * @returns false when no combination found, true when successfully combined\n */\n const checkAndCombine = (current, colliders, maxLookBack = this.meshingLookBehind) => {\n if (!current) {\n return false;\n }\n // walk backwards through the list of colliders and combine with the first that shares an edge\n for (let i = colliders.length - 1; i >= 0; i--) {\n if (maxLookBack-- < 0) {\n // blunt the O(n^2) algorithm a bit\n return false;\n }\n const prev = colliders[i];\n if (shareEdges(prev, current)) {\n colliders[i] = prev.combine(current);\n return true;\n }\n }\n return false;\n };\n // ? configurable bias perhaps, horizontal strips vs. vertical ones\n // Bad tile collider packing algorithm\n for (let i = 0; i < this.columns; i++) {\n // Scan column for colliders\n for (let j = 0; j < this.rows; j++) {\n const tile = this.tiles[i + j * this.columns];\n // Current tile in column is solid build up current collider\n if (tile.solid) {\n // Use custom collider otherwise bounding box\n if (tile.getColliders().length > 0) {\n // tile with custom collider interrupting the current run\n for (const collider of tile.getColliders()) {\n const originalOffset = this._getOrSetColliderOriginalOffset(collider);\n collider.offset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(tile.x * this.tileWidth * this.scale.x, tile.y * this.tileHeight * this.scale.y).add(originalOffset);\n collider.owner = this;\n this._composite.addCollider(collider);\n }\n //we push any current collider before nulling the current run\n if (current && !checkAndCombine(current, colliders)) {\n colliders.push(current);\n }\n current = null;\n // Use the bounding box\n }\n else {\n if (!current) {\n // no current run, start one\n current = tile.defaultGeometry;\n }\n else {\n // combine with current run\n current = current.combine(tile.defaultGeometry);\n }\n }\n }\n else {\n // Not solid skip and cut off the current collider\n // End of run check and combine\n if (current && !checkAndCombine(current, colliders)) {\n colliders.push(current);\n }\n current = null;\n }\n }\n // After a column is complete check to see if it can be merged into the last one\n // Eno of run check and combine\n if (current && !checkAndCombine(current, colliders)) {\n // else new collider if no combination\n colliders.push(current);\n }\n current = null;\n }\n for (const c of colliders) {\n const collider = _Collision_Colliders_Shape__WEBPACK_IMPORTED_MODULE_14__.Shape.Box(c.width, c.height, _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero, (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(c.left - this.pos.x, c.top - this.pos.y));\n collider.owner = this;\n this._composite.addCollider(collider);\n }\n this.collider.update();\n // Notify that colliders have been updated\n this.collider.$colliderAdded.notifyAll(this._composite);\n }\n /**\n * Returns the {@apilink Tile} by index (row major order)\n *\n * Returns null if out of bounds\n */\n getTileByIndex(index) {\n var _a;\n return (_a = this.tiles[index]) !== null && _a !== void 0 ? _a : null;\n }\n /**\n * Returns the {@apilink Tile} by its x and y integer coordinates\n *\n * Returns null if out of bounds\n *\n * For example, if I want the tile in fifth column (x), and second row (y):\n * `getTile(4, 1)` 0 based, so 0 is the first in row/column\n */\n getTile(x, y) {\n if (x < 0 || y < 0 || x >= this.columns || y >= this.rows) {\n return null;\n }\n return this.tiles[x + y * this.columns];\n }\n /**\n * Returns the {@apilink Tile} by testing a point in world coordinates,\n * returns `null` if no Tile was found.\n */\n getTileByPoint(point) {\n const { x, y } = this._getTileCoordinates(point);\n const tile = this.getTile(x, y);\n if (x >= 0 && y >= 0 && x < this.columns && y < this.rows && tile) {\n return tile;\n }\n return null;\n }\n _getTileCoordinates(point) {\n // Convert to Tile Space point\n point = this.transform.applyInverse(point);\n const x = Math.floor(point.x / this.tileWidth);\n const y = Math.floor(point.y / this.tileHeight);\n return { x, y };\n }\n getRows() {\n return this._rows;\n }\n getColumns() {\n return this._cols;\n }\n /**\n * Returns the on screen tiles for a tilemap, this will overshoot by a small amount because of the internal quad tree data structure.\n *\n * Useful if you need to perform specific logic on onscreen tiles\n */\n getOnScreenTiles() {\n let worldBounds = this._engine.screen.getWorldBounds();\n const maybeParallax = this.get(_Graphics__WEBPACK_IMPORTED_MODULE_15__.ParallaxComponent);\n if (maybeParallax && this.isInitialized) {\n let pos = this.pos;\n const oneMinusFactor = _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.One.sub(maybeParallax.parallaxFactor);\n const parallaxOffset = this._engine.currentScene.camera.pos.scale(oneMinusFactor);\n pos = pos.sub(parallaxOffset);\n // adjust world bounds by parallax factor\n worldBounds = worldBounds.translate(pos);\n }\n const bounds = this.transform.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_16__.CoordPlane.Screen ? this._engine.screen.getScreenBounds() : worldBounds;\n const topLeft = this._getTileCoordinates(bounds.topLeft);\n const topRight = this._getTileCoordinates(bounds.topRight);\n const bottomRight = this._getTileCoordinates(bounds.bottomRight);\n const bottomLeft = this._getTileCoordinates(bounds.bottomLeft);\n const tileStartX = Math.min((0,_Math_util__WEBPACK_IMPORTED_MODULE_17__.clamp)(topLeft.x, 0, this.columns - 1), (0,_Math_util__WEBPACK_IMPORTED_MODULE_17__.clamp)(topRight.x, 0, this.columns - 1));\n const tileStartY = Math.min((0,_Math_util__WEBPACK_IMPORTED_MODULE_17__.clamp)(topLeft.y, 0, this.rows - 1), (0,_Math_util__WEBPACK_IMPORTED_MODULE_17__.clamp)(topRight.y, 0, this.rows - 1));\n const tileEndX = Math.max((0,_Math_util__WEBPACK_IMPORTED_MODULE_17__.clamp)(bottomRight.x, 0, this.columns - 1), (0,_Math_util__WEBPACK_IMPORTED_MODULE_17__.clamp)(bottomLeft.x, 0, this.columns - 1));\n const tileEndY = Math.max((0,_Math_util__WEBPACK_IMPORTED_MODULE_17__.clamp)(bottomRight.y, 0, this.rows - 1), (0,_Math_util__WEBPACK_IMPORTED_MODULE_17__.clamp)(bottomLeft.y, 0, this.rows - 1));\n const tiles = [];\n for (let x = tileStartX; x <= tileEndX; x++) {\n for (let y = tileStartY; y <= tileEndY; y++) {\n tiles.push(this.getTile(x, y));\n }\n }\n return tiles;\n }\n /**\n * @internal\n */\n _processPointerToObject(receiver) {\n this._pointerEventDispatcher.processPointerToObject(receiver, this.tiles);\n }\n /**\n * @internal\n */\n _dispatchPointerEvents(receiver) {\n this._pointerEventDispatcher.dispatchEvents(receiver, this.tiles);\n }\n update(engine, elapsed) {\n this._initialize(engine);\n this.onPreUpdate(engine, elapsed);\n this.emit('preupdate', new _Events__WEBPACK_IMPORTED_MODULE_18__.PreUpdateEvent(engine, elapsed, this));\n // Update colliders\n if (!this._oldPos.equals(this.pos) || this._oldRotation !== this.rotation || !this._oldScale.equals(this.scale)) {\n this.flagCollidersDirty();\n this.flagTilesDirty();\n }\n if (this._collidersDirty) {\n this._collidersDirty = false;\n this._updateColliders();\n }\n // Clear last frame's events\n this._pointerEventDispatcher.clear();\n this._token++;\n this.pos.clone(this._oldPos);\n this._oldRotation = this.rotation;\n this.scale.clone(this._oldScale);\n this.transform.pos = this.pos;\n this.onPostUpdate(engine, elapsed);\n this.emit('postupdate', new _Events__WEBPACK_IMPORTED_MODULE_18__.PostUpdateEvent(engine, elapsed, this));\n }\n /**\n * Draws the tile map to the screen. Called by the {@apilink Scene}.\n * @param ctx ExcaliburGraphicsContext\n * @param elapsed The number of milliseconds since the last draw\n */\n draw(ctx, elapsed) {\n if (!this.isInitialized) {\n return;\n }\n this.emit('predraw', new _Events__WEBPACK_IMPORTED_MODULE_18__.PreDrawEvent(ctx, elapsed, this)); // TODO fix event\n let graphics, graphicsIndex, graphicsLen;\n const tiles = this.getOnScreenTiles();\n for (let i = 0; i < tiles.length; i++) {\n const tile = tiles[i];\n // get non-negative tile sprites\n const offsets = tile.getGraphicsOffsets();\n graphics = tile.getGraphics();\n for (graphicsIndex = 0, graphicsLen = graphics.length; graphicsIndex < graphicsLen; graphicsIndex++) {\n // draw sprite, warning if sprite doesn't exist\n const graphic = graphics[graphicsIndex];\n const offset = offsets[graphicsIndex];\n if (graphic) {\n if ((0,_Graphics__WEBPACK_IMPORTED_MODULE_8__.hasGraphicsTick)(graphic)) {\n graphic === null || graphic === void 0 ? void 0 : graphic.tick(elapsed, this._token);\n }\n const offsetY = this.renderFromTopOfGraphic ? 0 : graphic.height - this.tileHeight;\n graphic.draw(ctx, tile.x * this.tileWidth + offset.x, tile.y * this.tileHeight - offsetY + offset.y);\n }\n }\n }\n this.emit('postdraw', new _Events__WEBPACK_IMPORTED_MODULE_18__.PostDrawEvent(ctx, elapsed, this));\n }\n debug(gfx, debugFlags) {\n const { showAll, showGrid, gridColor, gridWidth, showSolidBounds: showColliderBounds, solidBoundsColor: colliderBoundsColor, showColliderGeometry } = debugFlags.tilemap;\n const { geometryColor, geometryLineWidth, geometryPointSize } = debugFlags.collider;\n const width = this.tileWidth * this.columns * this.scale.x;\n const height = this.tileHeight * this.rows * this.scale.y;\n const pos = this.pos;\n if (showGrid || showAll) {\n for (let r = 0; r < this.rows + 1; r++) {\n const yOffset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(0, r * this.tileHeight * this.scale.y);\n gfx.drawLine(pos.add(yOffset), pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(width, yOffset.y)), gridColor, gridWidth);\n }\n for (let c = 0; c < this.columns + 1; c++) {\n const xOffset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(c * this.tileWidth * this.scale.x, 0);\n gfx.drawLine(pos.add(xOffset), pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(xOffset.x, height)), gridColor, gridWidth);\n }\n }\n if (showAll || showColliderBounds || showColliderGeometry) {\n const colliders = this._composite.getColliders();\n gfx.save();\n gfx.translate(this.pos.x, this.pos.y);\n gfx.scale(this.scale.x, this.scale.y);\n for (const collider of colliders) {\n const bounds = collider.localBounds;\n const pos = collider.worldPos.sub(this.pos);\n if (showColliderBounds) {\n gfx.drawRectangle(pos, bounds.width, bounds.height, colliderBoundsColor);\n }\n }\n gfx.restore();\n if (showColliderGeometry) {\n for (const collider of colliders) {\n collider.debug(gfx, geometryColor, { lineWidth: geometryLineWidth, pointSize: geometryPointSize });\n }\n }\n }\n if (showAll || showColliderBounds) {\n gfx.save();\n gfx.z = 999;\n if (showColliderBounds) {\n for (let i = 0; i < this.tiles.length; i++) {\n this.tiles[i].bounds.draw(gfx);\n }\n }\n gfx.restore();\n }\n }\n}\n/**\n * TileMap Tile\n *\n * A light-weight object that occupies a space in a collision map. Generally\n * created by a {@apilink TileMap}.\n *\n * Tiles can draw multiple sprites. Note that the order of drawing is the order\n * of the sprites in the array so the last one will be drawn on top. You can\n * use transparency to create layers this way.\n */\nclass Tile {\n /**\n * Return the world position of the top left corner of the tile\n */\n get pos() {\n if (this._posDirty) {\n this._recalculate();\n this._posDirty = false;\n }\n return this._pos;\n }\n /**\n * Width of the tile in pixels\n */\n get width() {\n return this._width;\n }\n /**\n * Height of the tile in pixels\n */\n get height() {\n return this._height;\n }\n /**\n * Wether this tile should be treated as solid by the tilemap\n */\n get solid() {\n return this._solid;\n }\n /**\n * Wether this tile should be treated as solid by the tilemap\n */\n set solid(val) {\n var _a;\n (_a = this.map) === null || _a === void 0 ? void 0 : _a.flagCollidersDirty();\n this._solid = val;\n }\n /**\n * Current list of graphics for this tile\n */\n getGraphics() {\n return this._graphics;\n }\n /**\n * Current list of offsets for this tile's graphics\n */\n getGraphicsOffsets() {\n return this._offsets;\n }\n /**\n * Add another {@apilink Graphic} to this TileMap tile\n * @param graphic\n */\n addGraphic(graphic, options) {\n this._graphics.push(graphic);\n if (options === null || options === void 0 ? void 0 : options.offset) {\n this._offsets.push(options.offset);\n }\n else {\n this._offsets.push(_Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero);\n }\n }\n /**\n * Remove an instance of a {@apilink Graphic} from this tile\n */\n removeGraphic(graphic) {\n const index = this._graphics.indexOf(graphic);\n if (index > -1) {\n this._graphics.splice(index, 1);\n this._offsets.splice(index, 1);\n }\n }\n /**\n * Clear all graphics from this tile\n */\n clearGraphics() {\n this._graphics.length = 0;\n this._offsets.length = 0;\n }\n /**\n * Returns the list of colliders\n */\n getColliders() {\n return this._colliders;\n }\n /**\n * Adds a custom collider to the {@apilink Tile} to use instead of it's bounds\n *\n * If no collider is set but {@apilink Tile.solid} is set, the tile bounds are used as a collider.\n *\n * **Note!** the {@apilink Tile.solid} must be set to true for it to act as a \"fixed\" collider\n * @param collider\n */\n addCollider(collider) {\n this._colliders.push(collider);\n this.map.flagCollidersDirty();\n }\n /**\n * Removes a collider from the {@apilink Tile}\n * @param collider\n */\n removeCollider(collider) {\n const index = this._colliders.indexOf(collider);\n if (index > -1) {\n this._colliders.splice(index, 1);\n }\n this.map.flagCollidersDirty();\n }\n /**\n * Clears all colliders from the {@apilink Tile}\n */\n clearColliders() {\n this._colliders.length = 0;\n this.map.flagCollidersDirty();\n }\n constructor(options) {\n var _a, _b;\n this._posDirty = false;\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_3__.EventEmitter();\n this._solid = false;\n this._graphics = [];\n this._offsets = [];\n /**\n * Current list of colliders for this tile\n */\n this._colliders = [];\n /**\n * Arbitrary data storage per tile, useful for any game specific data\n */\n this.data = new Map();\n this.x = options.x;\n this.y = options.y;\n this.map = options.map;\n this._width = options.map.tileWidth * this.map.scale.x;\n this._height = options.map.tileHeight * this.map.scale.y;\n this.solid = (_a = options.solid) !== null && _a !== void 0 ? _a : this.solid;\n this._graphics = (_b = options.graphics) !== null && _b !== void 0 ? _b : [];\n this._recalculate();\n }\n flagDirty() {\n return (this._posDirty = true);\n }\n _recalculate() {\n const geometryPos = this.map.pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(this.x * this.map.tileWidth, this.y * this.map.tileHeight));\n this._geometry = new _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_13__.BoundingBox(geometryPos.x, geometryPos.y, geometryPos.x + this.map.tileWidth, geometryPos.y + this.map.tileHeight);\n this._width = this.map.tileWidth * this.map.scale.x;\n this._height = this.map.tileHeight * this.map.scale.y;\n this._pos = this.map.pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(this.x * this._width, this.y * this._height));\n this._bounds = new _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_13__.BoundingBox(this._pos.x, this._pos.y, this._pos.x + this._width, this._pos.y + this._height);\n if (this.map.rotation) {\n this._bounds = this._bounds.rotate(this.map.rotation, this.map.pos);\n }\n this._posDirty = false;\n }\n /**\n * Tile bounds in world space\n */\n get bounds() {\n if (this._posDirty) {\n this._recalculate();\n }\n return this._bounds;\n }\n get defaultGeometry() {\n return this._geometry;\n }\n /**\n * Tile position in world space\n */\n get center() {\n if (this._posDirty) {\n this._recalculate();\n }\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._pos.x + this._width / 2, this._pos.y + this._height / 2);\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n if (handler) {\n this.events.off(eventName, handler);\n }\n else {\n this.events.off(eventName);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./TileMap/index.ts\":\n/*!**************************!*\\\n !*** ./TileMap/index.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ IsometricEntityComponent: () => (/* reexport safe */ _IsometricEntityComponent__WEBPACK_IMPORTED_MODULE_2__.IsometricEntityComponent),\n/* harmony export */ IsometricEntitySystem: () => (/* reexport safe */ _IsometricEntitySystem__WEBPACK_IMPORTED_MODULE_3__.IsometricEntitySystem),\n/* harmony export */ IsometricMap: () => (/* reexport safe */ _IsometricMap__WEBPACK_IMPORTED_MODULE_1__.IsometricMap),\n/* harmony export */ IsometricTile: () => (/* reexport safe */ _IsometricMap__WEBPACK_IMPORTED_MODULE_1__.IsometricTile),\n/* harmony export */ Tile: () => (/* reexport safe */ _TileMap__WEBPACK_IMPORTED_MODULE_0__.Tile),\n/* harmony export */ TileMap: () => (/* reexport safe */ _TileMap__WEBPACK_IMPORTED_MODULE_0__.TileMap),\n/* harmony export */ TileMapEvents: () => (/* reexport safe */ _TileMap__WEBPACK_IMPORTED_MODULE_0__.TileMapEvents)\n/* harmony export */ });\n/* harmony import */ var _TileMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./TileMap */ \"./TileMap/TileMap.ts\");\n/* harmony import */ var _IsometricMap__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./IsometricMap */ \"./TileMap/IsometricMap.ts\");\n/* harmony import */ var _IsometricEntityComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./IsometricEntityComponent */ \"./TileMap/IsometricEntityComponent.ts\");\n/* harmony import */ var _IsometricEntitySystem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./IsometricEntitySystem */ \"./TileMap/IsometricEntitySystem.ts\");\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Timer.ts\":\n/*!******************!*\\\n !*** ./Timer.ts ***!\n \\******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Timer: () => (/* binding */ Timer)\n/* harmony export */ });\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Math_Random__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Math/Random */ \"./Math/Random.ts\");\n\n\n/**\n * The Excalibur timer hooks into the internal timer and fires callbacks,\n * after a certain interval, optionally repeating.\n */\nclass Timer {\n get complete() {\n return this._complete;\n }\n constructor(options) {\n var _a;\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance();\n this.id = 0;\n this._elapsedTime = 0;\n this._totalTimeAlive = 0;\n this._running = false;\n this._numberOfTicks = 0;\n this.interval = 10;\n this.repeats = false;\n this.maxNumberOfRepeats = -1;\n this.randomRange = [0, 0];\n this._baseInterval = 10;\n this._generateRandomInterval = () => {\n return this._baseInterval + this.random.integer(this.randomRange[0], this.randomRange[1]);\n };\n this._complete = false;\n this.scene = null;\n const fcn = (_a = options.action) !== null && _a !== void 0 ? _a : options.fcn;\n const interval = options.interval;\n const repeats = options.repeats;\n const numberOfRepeats = options.numberOfRepeats;\n const randomRange = options.randomRange;\n const random = options.random;\n if (!!numberOfRepeats && numberOfRepeats >= 0) {\n this.maxNumberOfRepeats = numberOfRepeats;\n if (!repeats) {\n throw new Error('repeats must be set to true if numberOfRepeats is set');\n }\n }\n this.id = Timer._MAX_ID++;\n this._callbacks = [];\n this._baseInterval = this.interval = interval;\n if (!!randomRange) {\n if (randomRange[0] > randomRange[1]) {\n throw new Error('min value must be lower than max value for range');\n }\n //We use the instance of ex.Random to generate the range\n this.random = random !== null && random !== void 0 ? random : new _Math_Random__WEBPACK_IMPORTED_MODULE_1__.Random();\n this.randomRange = randomRange;\n this.interval = this._generateRandomInterval();\n this.on(() => {\n this.interval = this._generateRandomInterval();\n });\n }\n this.repeats = repeats || this.repeats;\n if (fcn) {\n this.on(fcn);\n }\n }\n /**\n * Adds a new callback to be fired after the interval is complete\n * @param action The callback to be added to the callback list, to be fired after the interval is complete.\n */\n on(action) {\n this._callbacks.push(action);\n }\n /**\n * Removes a callback from the callback list to be fired after the interval is complete.\n * @param action The callback to be removed from the callback list, to be fired after the interval is complete.\n */\n off(action) {\n const index = this._callbacks.indexOf(action);\n this._callbacks.splice(index, 1);\n }\n /**\n * Updates the timer after a certain number of milliseconds have elapsed. This is used internally by the engine.\n * @param elapsed Number of elapsed milliseconds since the last update.\n */\n update(elapsed) {\n if (this._running) {\n this._totalTimeAlive += elapsed;\n this._elapsedTime += elapsed;\n if (this.maxNumberOfRepeats > -1 && this._numberOfTicks >= this.maxNumberOfRepeats) {\n this._complete = true;\n this._running = false;\n this._elapsedTime = 0;\n }\n if (!this.complete && this._elapsedTime >= this.interval) {\n this._callbacks.forEach((c) => {\n c.call(this);\n });\n this._numberOfTicks++;\n if (this.repeats) {\n this._elapsedTime = 0;\n }\n else {\n this._complete = true;\n this._running = false;\n this._elapsedTime = 0;\n }\n }\n }\n }\n /**\n * Resets the timer so that it can be reused, and optionally reconfigure the timers interval.\n *\n * Warning** you may need to call `timer.start()` again if the timer had completed\n * @param newInterval If specified, sets a new non-negative interval in milliseconds to refire the callback\n * @param newNumberOfRepeats If specified, sets a new non-negative upper limit to the number of time this timer executes\n */\n reset(newInterval, newNumberOfRepeats) {\n if (!!newInterval && newInterval >= 0) {\n this._baseInterval = this.interval = newInterval;\n }\n if (!!this.maxNumberOfRepeats && this.maxNumberOfRepeats >= 0) {\n this.maxNumberOfRepeats = newNumberOfRepeats;\n if (!this.repeats) {\n throw new Error('repeats must be set to true if numberOfRepeats is set');\n }\n }\n this._complete = false;\n this._elapsedTime = 0;\n this._numberOfTicks = 0;\n }\n get timesRepeated() {\n return this._numberOfTicks;\n }\n getTimeRunning() {\n return this._totalTimeAlive;\n }\n /**\n * @returns milliseconds until the next action callback, if complete will return 0\n */\n get timeToNextAction() {\n if (this.complete) {\n return 0;\n }\n return this.interval - this._elapsedTime;\n }\n /**\n * @returns milliseconds elapsed toward the next action\n */\n get timeElapsedTowardNextAction() {\n return this._elapsedTime;\n }\n get isRunning() {\n return this._running;\n }\n /**\n * Pauses the timer, time will no longer increment towards the next call\n */\n pause() {\n this._running = false;\n return this;\n }\n /**\n * Resumes the timer, time will now increment towards the next call.\n */\n resume() {\n this._running = true;\n return this;\n }\n /**\n * Starts the timer, if the timer was complete it will restart the timer and reset the elapsed time counter\n */\n start() {\n if (!this.scene) {\n this._logger.warn('Cannot start a timer not part of a scene, timer wont start until added');\n }\n this._running = true;\n if (this.complete) {\n this._complete = false;\n this._elapsedTime = 0;\n this._numberOfTicks = 0;\n }\n return this;\n }\n /**\n * Stops the timer and resets the elapsed time counter towards the next action invocation\n */\n stop() {\n this._running = false;\n this._elapsedTime = 0;\n this._numberOfTicks = 0;\n return this;\n }\n /**\n * Cancels the timer, preventing any further executions.\n */\n cancel() {\n this.pause();\n if (this.scene) {\n this.scene.cancelTimer(this);\n }\n }\n}\nTimer._MAX_ID = 0;\n\n\n/***/ }),\n\n/***/ \"./Trigger.ts\":\n/*!********************!*\\\n !*** ./Trigger.ts ***!\n \\********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Trigger: () => (/* binding */ Trigger),\n/* harmony export */ TriggerEvents: () => (/* binding */ TriggerEvents)\n/* harmony export */ });\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Events */ \"./Events.ts\");\n/* harmony import */ var _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Collision/CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Actor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Actor */ \"./Actor.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n\nconst TriggerEvents = {\n ExitTrigger: 'exit',\n EnterTrigger: 'enter'\n};\n/**\n * Triggers are a method of firing arbitrary code on collision. These are useful\n * as 'buttons', 'switches', or to trigger effects in a game. By default triggers\n * are invisible, and can only be seen when {@apilink Trigger.visible} is set to `true`.\n */\nclass Trigger extends _Actor__WEBPACK_IMPORTED_MODULE_0__.Actor {\n /**\n * @param options Trigger options\n */\n constructor(options) {\n var _a, _b, _c, _d;\n super({ ...options });\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_1__.EventEmitter();\n this.filter = (_a = options.filter) !== null && _a !== void 0 ? _a : (() => true);\n this.repeat = (_b = options.repeat) !== null && _b !== void 0 ? _b : -1;\n this.action = (_c = options.action) !== null && _c !== void 0 ? _c : (() => undefined);\n this.target = options.target;\n this.graphics.isVisible = (_d = options.visible) !== null && _d !== void 0 ? _d : false;\n this.body.collisionType = _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.Passive;\n this.events.on('collisionstart', ({ other: collider }) => {\n if (!this._matchesTarget(collider.owner)) {\n return;\n }\n this.events.emit('enter', new _Events__WEBPACK_IMPORTED_MODULE_3__.EnterTriggerEvent(this, collider.owner));\n this._dispatchAction(collider.owner);\n // remove trigger if its done, -1 repeat forever\n if (this.repeat === 0) {\n this.kill();\n }\n });\n this.events.on('collisionend', ({ other: collider }) => {\n if (this._matchesTarget(collider.owner)) {\n this.events.emit('exit', new _Events__WEBPACK_IMPORTED_MODULE_3__.ExitTriggerEvent(this, collider.owner));\n }\n });\n }\n _matchesTarget(entity) {\n return this.filter(entity) && (this.target === undefined || this.target === entity);\n }\n _dispatchAction(target) {\n if (this.repeat !== 0) {\n this.action.call(this, target);\n this.repeat--;\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Assert.ts\":\n/*!************************!*\\\n !*** ./Util/Assert.ts ***!\n \\************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ assert: () => (/* binding */ assert)\n/* harmony export */ });\n/**\n * Asserts will throw in `process.env.NODE_ENV === 'development'` builds if the expression evaluates false\n */\nfunction assert(message, expression) {\n if (true) {\n if (!expression()) {\n throw new Error(message);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Browser.ts\":\n/*!*************************!*\\\n !*** ./Util/Browser.ts ***!\n \\*************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BrowserComponent: () => (/* binding */ BrowserComponent),\n/* harmony export */ BrowserEvents: () => (/* binding */ BrowserEvents)\n/* harmony export */ });\nclass BrowserComponent {\n on(eventName, handler) {\n if (this._nativeHandlers[eventName]) {\n this.off(eventName, this._nativeHandlers[eventName]);\n }\n this._nativeHandlers[eventName] = this._decorate(handler);\n this.nativeComponent.addEventListener(eventName, this._nativeHandlers[eventName]);\n }\n off(eventName, handler) {\n if (!handler) {\n handler = this._nativeHandlers[eventName];\n }\n this.nativeComponent.removeEventListener(eventName, handler);\n this._nativeHandlers[eventName] = null;\n }\n _decorate(handler) {\n return (evt) => {\n if (!this._paused) {\n handler(evt);\n }\n };\n }\n pause() {\n this._paused = true;\n }\n resume() {\n this._paused = false;\n }\n clear() {\n for (const event in this._nativeHandlers) {\n this.off(event);\n }\n }\n constructor(nativeComponent) {\n this.nativeComponent = nativeComponent;\n this._paused = false;\n this._nativeHandlers = {};\n }\n}\nclass BrowserEvents {\n constructor(_windowGlobal, _documentGlobal) {\n this._windowGlobal = _windowGlobal;\n this._documentGlobal = _documentGlobal;\n this._windowComponent = new BrowserComponent(this._windowGlobal);\n this._documentComponent = new BrowserComponent(this._documentGlobal);\n }\n get window() {\n return this._windowComponent;\n }\n get document() {\n return this._documentComponent;\n }\n pause() {\n this.window.pause();\n this.document.pause();\n }\n resume() {\n this.window.resume();\n this.document.resume();\n }\n clear() {\n this.window.clear();\n this.document.clear();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Clock.ts\":\n/*!***********************!*\\\n !*** ./Util/Clock.ts ***!\n \\***********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Clock: () => (/* binding */ Clock),\n/* harmony export */ StandardClock: () => (/* binding */ StandardClock),\n/* harmony export */ TestClock: () => (/* binding */ TestClock)\n/* harmony export */ });\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Fps__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Fps */ \"./Util/Fps.ts\");\n\n\n/**\n * Abstract Clock is the base type of all Clocks\n *\n * It has a few opinions\n * 1. It manages the calculation of what \"elapsed\" time means and thus maximum fps\n * 2. The default timing api is implemented in now()\n *\n * To implement your own clock, extend Clock and override start/stop to start and stop the clock, then call update() with whatever\n * method is unique to your clock implementation.\n */\nclass Clock {\n constructor(options) {\n var _a, _b, _c;\n this._onFatalException = () => {\n /* default nothing */\n };\n this._maxFps = Infinity;\n this._lastTime = 0;\n this._elapsed = 1;\n this._scheduledCbs = [];\n this._totalElapsed = 0;\n this._options = options;\n this.tick = options.tick;\n this._lastTime = (_a = this.now()) !== null && _a !== void 0 ? _a : 0;\n this._maxFps = (_b = options.maxFps) !== null && _b !== void 0 ? _b : this._maxFps;\n this._onFatalException = (_c = options.onFatalException) !== null && _c !== void 0 ? _c : this._onFatalException;\n this.fpsSampler = new _Fps__WEBPACK_IMPORTED_MODULE_0__.FpsSampler({\n initialFps: 60,\n nowFn: () => this.now()\n });\n }\n /**\n * Get the elapsed time for the last completed frame\n */\n elapsed() {\n return this._elapsed;\n }\n /**\n * Get the current time in milliseconds\n */\n now() {\n return performance.now();\n }\n toTestClock() {\n const testClock = new TestClock({\n ...this._options,\n defaultUpdateMs: 16.6\n });\n return testClock;\n }\n toStandardClock() {\n const clock = new StandardClock({\n ...this._options\n });\n return clock;\n }\n setFatalExceptionHandler(handler) {\n this._onFatalException = handler;\n }\n /**\n * Schedule a callback to fire given a timeout in milliseconds using the excalibur {@apilink Clock}\n *\n * This is useful to use over the built in browser `setTimeout` because callbacks will be tied to the\n * excalibur update clock, instead of browser time, this means that callbacks wont fire if the game is\n * stopped or paused.\n * @param cb callback to fire\n * @param timeoutMs Optionally specify a timeout in milliseconds from now, default is 0ms which means the next possible tick\n * @param timing Optionally specify a timeout in milliseconds from now, default is 0ms which means the next possible tick\n */\n schedule(cb, timeoutMs = 0, timing = 'preframe') {\n // Scheduled based on internal elapsed time\n const scheduledTime = this._totalElapsed + timeoutMs;\n this._scheduledCbs.push([cb, scheduledTime, timing]);\n }\n /**\n * Called internally to trigger scheduled callbacks in the clock\n * @param timing\n * @internal\n */\n __runScheduledCbs(timing = 'preframe') {\n // walk backwards to delete items as we loop\n for (let i = this._scheduledCbs.length - 1; i > -1; i--) {\n if (timing === this._scheduledCbs[i][2] && this._scheduledCbs[i][1] <= this._totalElapsed) {\n this._scheduledCbs[i][0](this._elapsed);\n this._scheduledCbs.splice(i, 1);\n }\n }\n }\n update(overrideUpdateMs) {\n try {\n this.fpsSampler.start();\n // Get the time to calculate time-elapsed\n const now = this.now();\n let elapsed = now - this._lastTime || 1; // first frame\n // Constrain fps\n const fpsInterval = 1000 / this._maxFps;\n // only run frame if enough time has elapsed\n if (elapsed >= fpsInterval) {\n let leftover = 0;\n if (fpsInterval !== 0) {\n leftover = elapsed % fpsInterval;\n elapsed = elapsed - leftover; // shift elapsed to be \"in phase\" with the current loop fps\n }\n // Resolves issue #138 if the game has been paused, or blurred for\n // more than a 200 milliseconds, reset elapsed time to 1. This improves reliability\n // and provides more expected behavior when the engine comes back\n // into focus\n if (elapsed > 200) {\n elapsed = 1;\n }\n // tick the mainloop and run scheduled callbacks\n this._elapsed = overrideUpdateMs || elapsed;\n this._totalElapsed += this._elapsed;\n this.__runScheduledCbs('preframe');\n this.tick(overrideUpdateMs || elapsed);\n this.__runScheduledCbs('postframe');\n if (fpsInterval !== 0) {\n this._lastTime = now - leftover;\n }\n else {\n this._lastTime = now;\n }\n this.fpsSampler.end();\n }\n }\n catch (e) {\n this._onFatalException(e);\n this.stop();\n }\n }\n}\n/**\n * The {@apilink StandardClock} implements the requestAnimationFrame browser api to run the tick()\n */\nclass StandardClock extends Clock {\n constructor(options) {\n super(options);\n this._running = false;\n }\n isRunning() {\n return this._running;\n }\n start() {\n if (this._running) {\n return;\n }\n this._running = true;\n const mainloop = () => {\n // stop the loop\n if (!this._running) {\n return;\n }\n try {\n // request next loop\n this._requestId = window.requestAnimationFrame(mainloop);\n this.update();\n }\n catch (e) {\n window.cancelAnimationFrame(this._requestId);\n throw e;\n }\n };\n // begin the first frame\n mainloop();\n }\n stop() {\n window.cancelAnimationFrame(this._requestId);\n this._running = false;\n }\n}\n/**\n * The TestClock is meant for debugging interactions in excalibur that require precise timing to replicate or test\n */\nclass TestClock extends Clock {\n constructor(options) {\n super({\n ...options\n });\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this._running = false;\n this._currentTime = 0;\n this._updateMs = options.defaultUpdateMs;\n }\n /**\n * Get the current time in milliseconds\n */\n now() {\n var _a;\n return (_a = this._currentTime) !== null && _a !== void 0 ? _a : 0;\n }\n isRunning() {\n return this._running;\n }\n start() {\n this._running = true;\n }\n stop() {\n this._running = false;\n }\n /**\n * Manually step the clock forward 1 tick, optionally specify an elapsed time in milliseconds\n * @param overrideUpdateMs\n */\n step(overrideUpdateMs) {\n const time = overrideUpdateMs !== null && overrideUpdateMs !== void 0 ? overrideUpdateMs : this._updateMs;\n if (this._running) {\n // to be comparable to RAF this needs to be a full blown Task\n // For example, images cannot decode synchronously in a single step\n this.update(time);\n this._currentTime += time;\n }\n else {\n this._logger.warn('The clock is not running, no step will be performed');\n }\n }\n /**\n * Run a number of steps that tick the clock, optionally specify an elapsed time in milliseconds\n * @param numberOfSteps\n * @param overrideUpdateMs\n */\n run(numberOfSteps, overrideUpdateMs) {\n for (let i = 0; i < numberOfSteps; i++) {\n this.step(overrideUpdateMs !== null && overrideUpdateMs !== void 0 ? overrideUpdateMs : this._updateMs);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Coroutine.ts\":\n/*!***************************!*\\\n !*** ./Util/Coroutine.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ coroutine: () => (/* binding */ coroutine)\n/* harmony export */ });\n/* harmony import */ var _Context__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Context */ \"./Context.ts\");\n/* harmony import */ var _Engine__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Engine */ \"./Engine.ts\");\n/* harmony import */ var _Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Log */ \"./Util/Log.ts\");\n\n\n\nconst InsideCoroutineContext = (0,_Context__WEBPACK_IMPORTED_MODULE_0__.createContext)();\nconst generatorFunctionDeclaration = /^\\s*(?:function)?\\*/;\n/**\n *\n */\nfunction isCoroutineGenerator(x) {\n if (typeof x !== 'function') {\n return false;\n }\n if (generatorFunctionDeclaration.test(Function.prototype.toString.call(x))) {\n return true;\n }\n if (!Object.getPrototypeOf) {\n return false;\n }\n return Object.getPrototypeOf(x) === Object.getPrototypeOf(new Function('return function * () {}')());\n}\n/**\n *\n */\nfunction coroutine(...args) {\n var _a;\n const logger = _Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n let coroutineGenerator;\n let thisArg;\n let options;\n let passedEngine;\n // coroutine(coroutineGenerator: CoroutineGenerator, options?: CoroutineOptions): CoroutineInstance;\n if (isCoroutineGenerator(args[0])) {\n thisArg = globalThis;\n coroutineGenerator = args[0];\n options = args[1];\n }\n // coroutine(thisArg: any, coroutineGenerator: CoroutineGenerator, options?: CoroutineOptions): CoroutineInstance;\n if (isCoroutineGenerator(args[1])) {\n thisArg = args[0];\n coroutineGenerator = args[1];\n options = args[2];\n }\n // coroutine(thisArg: any, engine: Engine, coroutineGenerator: CoroutineGenerator, options?: CoroutineOptions): CoroutineInstance;\n if (args[1] instanceof _Engine__WEBPACK_IMPORTED_MODULE_2__.Engine) {\n thisArg = args[0];\n passedEngine = args[1];\n coroutineGenerator = args[2];\n options = args[3];\n }\n // coroutine(engine: Engine, coroutineGenerator: CoroutineGenerator, options?: CoroutineOptions): CoroutineInstance;\n if (args[0] instanceof _Engine__WEBPACK_IMPORTED_MODULE_2__.Engine) {\n thisArg = globalThis;\n passedEngine = args[0];\n coroutineGenerator = args[1];\n options = args[2];\n }\n const inside = (0,_Context__WEBPACK_IMPORTED_MODULE_0__.useContext)(InsideCoroutineContext);\n const schedule = options === null || options === void 0 ? void 0 : options.timing;\n const autostart = inside ? false : (_a = options === null || options === void 0 ? void 0 : options.autostart) !== null && _a !== void 0 ? _a : true;\n let engine;\n try {\n engine = passedEngine !== null && passedEngine !== void 0 ? passedEngine : _Engine__WEBPACK_IMPORTED_MODULE_2__.Engine.useEngine();\n }\n catch (_) {\n throw Error('Cannot run coroutine without engine parameter outside of an excalibur lifecycle method.\\n' +\n 'Pass an engine parameter to ex.coroutine(engine, function * {...})');\n }\n let started = false;\n let completed = false;\n let cancelled = false;\n const generatorFcn = coroutineGenerator.bind(thisArg);\n const generator = generatorFcn();\n let loop;\n const complete = new Promise((resolve, reject) => {\n loop = (elapsed) => {\n try {\n if (cancelled) {\n completed = true;\n resolve();\n return;\n }\n const { done, value } = InsideCoroutineContext.scope(true, () => generator.next(elapsed));\n if (done || cancelled) {\n completed = true;\n resolve();\n return;\n }\n if (value instanceof Promise) {\n value.then(() => {\n // schedule next loop\n engine.clock.schedule(loop, 0, schedule);\n });\n }\n else if (value === undefined || value === void 0) {\n // schedule next frame\n engine.clock.schedule(loop, 0, schedule);\n }\n else {\n // schedule value milliseconds from now\n engine.clock.schedule(loop, value || 0, schedule);\n }\n }\n catch (e) {\n reject(e);\n return;\n }\n };\n if (autostart) {\n started = true;\n loop(engine.clock.elapsed()); // run first frame immediately\n }\n });\n const co = {\n isRunning: () => {\n return started && !cancelled && !completed;\n },\n isComplete: () => {\n return completed;\n },\n cancel: () => {\n cancelled = true;\n },\n start: () => {\n if (!started) {\n started = true;\n loop(engine.clock.elapsed());\n }\n else {\n logger.warn('.start() was called on a coroutine that was already started, this is probably a bug:\\n', Function.prototype.toString.call(generatorFcn));\n }\n return co;\n },\n generator,\n done: complete,\n then: complete.then.bind(complete),\n [Symbol.iterator]: () => {\n // TODO warn if a coroutine is already running\n // TODO warn if a coroutine is cancelled\n return generator;\n }\n };\n return co;\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Decorators.ts\":\n/*!****************************!*\\\n !*** ./Util/Decorators.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ maxMessages: () => (/* binding */ maxMessages),\n/* harmony export */ obsolete: () => (/* binding */ obsolete),\n/* harmony export */ resetObsoleteCounter: () => (/* binding */ resetObsoleteCounter)\n/* harmony export */ });\n/* harmony import */ var _Flags__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Flags */ \"./Flags.ts\");\n/* harmony import */ var _Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Log */ \"./Util/Log.ts\");\n\n\nconst maxMessages = 5;\nconst obsoleteMessage = {};\nconst resetObsoleteCounter = () => {\n for (const message in obsoleteMessage) {\n obsoleteMessage[message] = 0;\n }\n};\nconst logMessage = (message, options) => {\n const suppressObsoleteMessages = _Flags__WEBPACK_IMPORTED_MODULE_0__.Flags.isEnabled('suppress-obsolete-message');\n if (obsoleteMessage[message] < maxMessages && !suppressObsoleteMessages) {\n _Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance().warn(message);\n // tslint:disable-next-line: no-console\n if (console.trace && options.showStackTrace) {\n // tslint:disable-next-line: no-console\n console.trace();\n }\n }\n obsoleteMessage[message]++;\n};\n/**\n * Obsolete decorator for marking Excalibur methods obsolete, you can optionally specify a custom message and/or alternate replacement\n * method do the deprecated one. Inspired by https://github.com/jayphelps/core-decorators.js\n */\nfunction obsolete(options) {\n options = {\n message: 'This feature will be removed in future versions of Excalibur.',\n alternateMethod: null,\n showStackTrace: false,\n ...options\n };\n return function (target, property, descriptor) {\n if (descriptor &&\n !(typeof descriptor.value === 'function' || typeof descriptor.get === 'function' || typeof descriptor.set === 'function')) {\n throw new SyntaxError('Only classes/functions/getters/setters can be marked as obsolete');\n }\n const methodSignature = `${target.name || ''}${target.name && property ? '.' : ''}${property ? property : ''}`;\n const message = `${methodSignature} is marked obsolete: ${options.message}` +\n (options.alternateMethod ? ` Use ${options.alternateMethod} instead` : '');\n if (!obsoleteMessage[message]) {\n obsoleteMessage[message] = 0;\n }\n // If descriptor is null it is a class\n const method = descriptor ? { ...descriptor } : target;\n if (!descriptor) {\n // with es2015 classes we need to change our decoration tactic\n class DecoratedClass extends method {\n constructor(...args) {\n logMessage(message, options);\n super(...args);\n }\n }\n return DecoratedClass;\n }\n if (descriptor && descriptor.value) {\n method.value = function () {\n logMessage(message, options);\n return descriptor.value.apply(this, arguments);\n };\n return method;\n }\n if (descriptor && descriptor.get) {\n method.get = function () {\n logMessage(message, options);\n return descriptor.get.apply(this, arguments);\n };\n }\n if (descriptor && descriptor.set) {\n method.set = function () {\n logMessage(message, options);\n return descriptor.set.apply(this, arguments);\n };\n }\n return method;\n };\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Detector.ts\":\n/*!**************************!*\\\n !*** ./Util/Detector.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Detector: () => (/* binding */ Detector)\n/* harmony export */ });\n/* harmony import */ var _Log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Log */ \"./Util/Log.ts\");\n\n/**\n * This is the list of features that will be used to log the supported\n * features to the console when Detector.logBrowserFeatures() is called.\n */\nconst REPORTED_FEATURES = {\n webgl: 'WebGL',\n webaudio: 'WebAudio',\n gamepadapi: 'Gamepad API'\n};\n/**\n * Excalibur internal feature detection helper class\n */\nclass Detector {\n constructor() {\n this._features = null;\n this.failedTests = [];\n // critical browser features required for ex to run\n this._criticalTests = {\n // Test canvas/2d context support\n canvasSupport: function () {\n const elem = document.createElement('canvas');\n return !!(elem.getContext && elem.getContext('2d'));\n },\n // Test array buffer support ex uses for downloading binary data\n arrayBufferSupport: function () {\n const xhr = new XMLHttpRequest();\n xhr.open('GET', '/');\n try {\n xhr.responseType = 'arraybuffer';\n }\n catch (e) {\n return false;\n }\n return xhr.responseType === 'arraybuffer';\n },\n // Test data urls ex uses for sprites\n dataUrlSupport: function () {\n const canvas = document.createElement('canvas');\n return canvas.toDataURL('image/png').indexOf('data:image/png') === 0;\n },\n // Test object url support for loading\n objectUrlSupport: function () {\n return 'URL' in window && 'revokeObjectURL' in URL && 'createObjectURL' in URL;\n },\n // RGBA support for colors\n rgbaSupport: function () {\n const style = document.createElement('a').style;\n style.cssText = 'background-color:rgba(150,255,150,.5)';\n return ('' + style.backgroundColor).indexOf('rgba') > -1;\n }\n };\n // warnings excalibur performance will be degraded\n this._warningTest = {\n webAudioSupport: function () {\n return !!(window.AudioContext ||\n window.webkitAudioContext ||\n window.mozAudioContext ||\n window.msAudioContext ||\n window.oAudioContext);\n },\n webglSupport: function () {\n const elem = document.createElement('canvas');\n return !!(elem.getContext && elem.getContext('webgl'));\n }\n };\n this._features = this._loadBrowserFeatures();\n }\n /**\n * Returns a map of currently supported browser features. This method\n * treats the features as a singleton and will only calculate feature\n * support if it has not previously been done.\n */\n getBrowserFeatures() {\n if (this._features === null) {\n this._features = this._loadBrowserFeatures();\n }\n return this._features;\n }\n /**\n * Report on non-critical browser support for debugging purposes.\n * Use native browser console colors for visibility.\n */\n logBrowserFeatures() {\n let msg = '%cSUPPORTED BROWSER FEATURES\\n==========================%c\\n';\n const args = ['font-weight: bold; color: navy', 'font-weight: normal; color: inherit'];\n const supported = this.getBrowserFeatures();\n for (const feature of Object.keys(REPORTED_FEATURES)) {\n if (supported[feature]) {\n msg += '(%c\\u2713%c)'; // (✓)\n args.push('font-weight: bold; color: green');\n args.push('font-weight: normal; color: inherit');\n }\n else {\n msg += '(%c\\u2717%c)'; // (✗)\n args.push('font-weight: bold; color: red');\n args.push('font-weight: normal; color: inherit');\n }\n msg += ' ' + REPORTED_FEATURES[feature] + '\\n';\n }\n args.unshift(msg);\n // eslint-disable-next-line no-console\n console.log.apply(console, args);\n }\n /**\n * Executes several IIFE's to get a constant reference to supported\n * features within the current execution context.\n */\n _loadBrowserFeatures() {\n return {\n // IIFE to check canvas support\n canvas: (() => {\n return this._criticalTests.canvasSupport();\n })(),\n // IIFE to check arraybuffer support\n arraybuffer: (() => {\n return this._criticalTests.arrayBufferSupport();\n })(),\n // IIFE to check dataurl support\n dataurl: (() => {\n return this._criticalTests.dataUrlSupport();\n })(),\n // IIFE to check objecturl support\n objecturl: (() => {\n return this._criticalTests.objectUrlSupport();\n })(),\n // IIFE to check rgba support\n rgba: (() => {\n return this._criticalTests.rgbaSupport();\n })(),\n // IIFE to check webaudio support\n webaudio: (() => {\n return this._warningTest.webAudioSupport();\n })(),\n // IIFE to check webgl support\n webgl: (() => {\n return this._warningTest.webglSupport();\n })(),\n // IIFE to check gamepadapi support\n gamepadapi: (() => {\n return !!navigator.getGamepads;\n })()\n };\n }\n test() {\n // Critical test will for ex not to run\n let failedCritical = false;\n for (const test in this._criticalTests) {\n if (!this._criticalTests[test].call(this)) {\n this.failedTests.push(test);\n _Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance().error('Critical browser feature missing, Excalibur requires:', test);\n failedCritical = true;\n }\n }\n if (failedCritical) {\n return false;\n }\n // Warning tests do not for ex to return false to compatibility\n for (const warning in this._warningTest) {\n if (!this._warningTest[warning]()) {\n _Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance().warn('Warning browser feature missing, Excalibur will have reduced performance:', warning);\n }\n }\n return true;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/DrawUtil.ts\":\n/*!**************************!*\\\n !*** ./Util/DrawUtil.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ circle: () => (/* binding */ circle),\n/* harmony export */ line: () => (/* binding */ line),\n/* harmony export */ point: () => (/* binding */ point),\n/* harmony export */ roundRect: () => (/* binding */ roundRect),\n/* harmony export */ vector: () => (/* binding */ vector)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n\n/* istanbul ignore next */\n/**\n * Draw a line on canvas context\n * @param ctx The canvas context\n * @param color The color of the line\n * @param x1 The start x coordinate\n * @param y1 The start y coordinate\n * @param x2 The ending x coordinate\n * @param y2 The ending y coordinate\n * @param thickness The line thickness\n * @param cap The {@apilink LineCapStyle} (butt, round, or square)\n */\nfunction line(ctx, color = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Red, x1, y1, x2, y2, thickness = 1, cap = 'butt') {\n ctx.save();\n ctx.beginPath();\n ctx.lineWidth = thickness;\n ctx.lineCap = cap;\n ctx.strokeStyle = color.toString();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.closePath();\n ctx.stroke();\n ctx.restore();\n}\n/* istanbul ignore next */\n/**\n * Draw the vector as a point onto the canvas.\n */\nfunction point(ctx, color = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Red, point) {\n ctx.beginPath();\n ctx.strokeStyle = color.toString();\n ctx.arc(point.x, point.y, 5, 0, Math.PI * 2);\n ctx.closePath();\n ctx.stroke();\n}\n/**\n * Draw the vector as a line onto the canvas starting a origin point.\n */\n/* istanbul ignore next */\n/**\n *\n */\nfunction vector(ctx, color, origin, vector, scale = 1.0) {\n const c = color ? color.toString() : 'blue';\n const v = vector.scale(scale);\n ctx.beginPath();\n ctx.strokeStyle = c;\n ctx.moveTo(origin.x, origin.y);\n ctx.lineTo(origin.x + v.x, origin.y + v.y);\n ctx.closePath();\n ctx.stroke();\n}\n/**\n * Draw a round rectangle on a canvas context\n * @param ctx The canvas context\n * @param x The top-left x coordinate\n * @param y The top-left y coordinate\n * @param width The width of the rectangle\n * @param height The height of the rectangle\n * @param radius The border radius of the rectangle\n * @param stroke The {@apilink Color} to stroke rectangle with\n * @param fill The {@apilink Color} to fill rectangle with\n */\nfunction roundRect(ctx, x, y, width, height, radius = 5, stroke = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.White, fill = null) {\n let br;\n if (typeof radius === 'number') {\n br = { tl: radius, tr: radius, br: radius, bl: radius };\n }\n else {\n const defaultRadius = { tl: 0, tr: 0, br: 0, bl: 0 };\n for (const prop in defaultRadius) {\n if (defaultRadius.hasOwnProperty(prop)) {\n const side = prop;\n br[side] = radius[side] || defaultRadius[side];\n }\n }\n }\n ctx.beginPath();\n ctx.moveTo(x + br.tl, y);\n ctx.lineTo(x + width - br.tr, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + br.tr);\n ctx.lineTo(x + width, y + height - br.br);\n ctx.quadraticCurveTo(x + width, y + height, x + width - br.br, y + height);\n ctx.lineTo(x + br.bl, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - br.bl);\n ctx.lineTo(x, y + br.tl);\n ctx.quadraticCurveTo(x, y, x + br.tl, y);\n ctx.closePath();\n if (fill) {\n ctx.fillStyle = fill.toString();\n ctx.fill();\n }\n if (stroke) {\n ctx.strokeStyle = stroke.toString();\n ctx.stroke();\n }\n}\n/**\n *\n */\nfunction circle(ctx, x, y, radius, stroke = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.White, fill = null) {\n ctx.beginPath();\n ctx.arc(x, y, radius, 0, Math.PI * 2);\n ctx.closePath();\n if (fill) {\n ctx.fillStyle = fill.toString();\n ctx.fill();\n }\n if (stroke) {\n ctx.strokeStyle = stroke.toString();\n ctx.stroke();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/EasingFunctions.ts\":\n/*!*********************************!*\\\n !*** ./Util/EasingFunctions.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EasingFunctions: () => (/* binding */ EasingFunctions)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n\n/**\n * Standard easing functions for motion in Excalibur, defined on a domain of [0, duration] and a range from [+startValue,+endValue]\n * Given a time, the function will return a value from positive startValue to positive endValue.\n *\n * ```js\n * function Linear (t) {\n * return t * t;\n * }\n *\n * // accelerating from zero velocity\n * function EaseInQuad (t) {\n * return t * t;\n * }\n *\n * // decelerating to zero velocity\n * function EaseOutQuad (t) {\n * return t * (2 - t);\n * }\n *\n * // acceleration until halfway, then deceleration\n * function EaseInOutQuad (t) {\n * return t < .5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n * }\n *\n * // accelerating from zero velocity\n * function EaseInCubic (t) {\n * return t * t * t;\n * }\n *\n * // decelerating to zero velocity\n * function EaseOutCubic (t) {\n * return (--t) * t * t + 1;\n * }\n *\n * // acceleration until halfway, then deceleration\n * function EaseInOutCubic (t) {\n * return t < .5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1;\n * }\n * ```\n */\nclass EasingFunctions {\n static CreateReversibleEasingFunction(easing) {\n return (time, start, end, duration) => {\n if (end < start) {\n return start - (easing(time, end, start, duration) - end);\n }\n else {\n return easing(time, start, end, duration);\n }\n };\n }\n static CreateVectorEasingFunction(easing) {\n return (time, start, end, duration) => {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(easing(time, start.x, end.x, duration), easing(time, start.y, end.y, duration));\n };\n }\n}\nEasingFunctions.Linear = EasingFunctions.CreateReversibleEasingFunction((currentTime, startValue, endValue, duration) => {\n endValue = endValue - startValue;\n return (endValue * currentTime) / duration + startValue;\n});\nEasingFunctions.EaseInQuad = EasingFunctions.CreateReversibleEasingFunction((currentTime, startValue, endValue, duration) => {\n endValue = endValue - startValue;\n currentTime /= duration;\n return endValue * currentTime * currentTime + startValue;\n});\nEasingFunctions.EaseOutQuad = EasingFunctions.CreateReversibleEasingFunction((currentTime, startValue, endValue, duration) => {\n endValue = endValue - startValue;\n currentTime /= duration;\n return -endValue * currentTime * (currentTime - 2) + startValue;\n});\nEasingFunctions.EaseInOutQuad = EasingFunctions.CreateReversibleEasingFunction((currentTime, startValue, endValue, duration) => {\n endValue = endValue - startValue;\n currentTime /= duration / 2;\n if (currentTime < 1) {\n return (endValue / 2) * currentTime * currentTime + startValue;\n }\n currentTime--;\n return (-endValue / 2) * (currentTime * (currentTime - 2) - 1) + startValue;\n});\nEasingFunctions.EaseInCubic = EasingFunctions.CreateReversibleEasingFunction((currentTime, startValue, endValue, duration) => {\n endValue = endValue - startValue;\n currentTime /= duration;\n return endValue * currentTime * currentTime * currentTime + startValue;\n});\nEasingFunctions.EaseOutCubic = EasingFunctions.CreateReversibleEasingFunction((currentTime, startValue, endValue, duration) => {\n endValue = endValue - startValue;\n currentTime /= duration;\n currentTime--;\n return endValue * (currentTime * currentTime * currentTime + 1) + startValue;\n});\nEasingFunctions.EaseInOutCubic = EasingFunctions.CreateReversibleEasingFunction((currentTime, startValue, endValue, duration) => {\n endValue = endValue - startValue;\n currentTime /= duration / 2;\n if (currentTime < 1) {\n return (endValue / 2) * currentTime * currentTime * currentTime + startValue;\n }\n currentTime -= 2;\n return (endValue / 2) * (currentTime * currentTime * currentTime + 2) + startValue;\n});\n\n\n/***/ }),\n\n/***/ \"./Util/Fps.ts\":\n/*!*********************!*\\\n !*** ./Util/Fps.ts ***!\n \\*********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FpsSampler: () => (/* binding */ FpsSampler)\n/* harmony export */ });\nclass FpsSampler {\n constructor(options) {\n var _a;\n this._samplePeriod = 100;\n this._currentFrameTime = 0;\n this._frames = 0;\n this._previousSampleTime = 0;\n this._beginFrameTime = 0;\n this._fps = options.initialFps;\n this._samplePeriod = (_a = options.samplePeriod) !== null && _a !== void 0 ? _a : this._samplePeriod;\n this._currentFrameTime = 1000 / options.initialFps;\n this._nowFn = options.nowFn;\n this._previousSampleTime = this._nowFn();\n }\n /**\n * Start of code block to sample FPS for\n */\n start() {\n this._beginFrameTime = this._nowFn();\n }\n /**\n * End of code block to sample FPS for\n */\n end() {\n this._frames++;\n const time = this._nowFn();\n this._currentFrameTime = time - this._beginFrameTime;\n if (time >= this._previousSampleTime + this._samplePeriod) {\n this._fps = (this._frames * 1000) / (time - this._previousSampleTime);\n this._previousSampleTime = time;\n this._frames = 0;\n }\n }\n /**\n * Return the currently sampled fps over the last sample period, by default every 100ms\n */\n get fps() {\n return this._fps;\n }\n /**\n * Return the instantaneous fps, this can be less useful because it will fluctuate given the current frames time\n */\n get instant() {\n return 1000 / this._currentFrameTime;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Future.ts\":\n/*!************************!*\\\n !*** ./Util/Future.ts ***!\n \\************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Future: () => (/* binding */ Future)\n/* harmony export */ });\n/**\n * Future is a wrapper around a native browser Promise to allow resolving/rejecting at any time\n */\nclass Future {\n constructor() {\n this._isCompleted = false;\n this.promise = new Promise((resolve, reject) => {\n this._resolver = resolve;\n this._rejecter = reject;\n });\n }\n get isCompleted() {\n return this._isCompleted;\n }\n resolve(value) {\n if (this._isCompleted) {\n return;\n }\n this._isCompleted = true;\n this._resolver(value);\n }\n reject(error) {\n if (this._isCompleted) {\n return;\n }\n this._isCompleted = true;\n this._rejecter(error);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/IFrame.ts\":\n/*!************************!*\\\n !*** ./Util/IFrame.ts ***!\n \\************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ isCrossOriginIframe: () => (/* binding */ isCrossOriginIframe)\n/* harmony export */ });\n/**\n * Checks if excalibur is in a x-origin iframe\n */\nfunction isCrossOriginIframe() {\n try {\n // Try and listen to events on top window frame if within an iframe.\n //\n // See https://github.com/excaliburjs/Excalibur/issues/1294\n //\n // Attempt to add an event listener, which triggers a DOMException on\n // cross-origin iframes\n const noop = () => {\n return;\n };\n window.top.addEventListener('blur', noop);\n window.top.removeEventListener('blur', noop);\n }\n catch (_a) {\n return true;\n }\n return false;\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Index.ts\":\n/*!***********************!*\\\n !*** ./Util/Index.ts ***!\n \\***********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ConsoleAppender: () => (/* reexport safe */ _Log__WEBPACK_IMPORTED_MODULE_1__.ConsoleAppender),\n/* harmony export */ DrawUtil: () => (/* reexport module object */ _DrawUtil__WEBPACK_IMPORTED_MODULE_4__),\n/* harmony export */ EasingFunctions: () => (/* reexport safe */ _EasingFunctions__WEBPACK_IMPORTED_MODULE_3__.EasingFunctions),\n/* harmony export */ LogLevel: () => (/* reexport safe */ _Log__WEBPACK_IMPORTED_MODULE_1__.LogLevel),\n/* harmony export */ Logger: () => (/* reexport safe */ _Log__WEBPACK_IMPORTED_MODULE_1__.Logger),\n/* harmony export */ Observable: () => (/* reexport safe */ _Observable__WEBPACK_IMPORTED_MODULE_2__.Observable),\n/* harmony export */ ScreenAppender: () => (/* reexport safe */ _Log__WEBPACK_IMPORTED_MODULE_1__.ScreenAppender),\n/* harmony export */ addItemToArray: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.addItemToArray),\n/* harmony export */ contains: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.contains),\n/* harmony export */ delay: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.delay),\n/* harmony export */ fail: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.fail),\n/* harmony export */ getPosition: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.getPosition),\n/* harmony export */ isObject: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.isObject),\n/* harmony export */ mergeDeep: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.mergeDeep),\n/* harmony export */ omit: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.omit),\n/* harmony export */ removeItemFromArray: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.removeItemFromArray)\n/* harmony export */ });\n/* harmony import */ var _Util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Util */ \"./Util/Util.ts\");\n/* harmony import */ var _Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Observable */ \"./Util/Observable.ts\");\n/* harmony import */ var _EasingFunctions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./EasingFunctions */ \"./Util/EasingFunctions.ts\");\n/* harmony import */ var _DrawUtil__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./DrawUtil */ \"./Util/DrawUtil.ts\");\n\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Util/Log.ts\":\n/*!*********************!*\\\n !*** ./Util/Log.ts ***!\n \\*********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ConsoleAppender: () => (/* binding */ ConsoleAppender),\n/* harmony export */ LogLevel: () => (/* binding */ LogLevel),\n/* harmony export */ Logger: () => (/* binding */ Logger),\n/* harmony export */ ScreenAppender: () => (/* binding */ ScreenAppender)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* eslint-disable no-console */\n\n\n/**\n * Logging level that Excalibur will tag\n */\nvar LogLevel;\n(function (LogLevel) {\n LogLevel[LogLevel[\"Debug\"] = 0] = \"Debug\";\n LogLevel[LogLevel[\"Info\"] = 1] = \"Info\";\n LogLevel[LogLevel[\"Warn\"] = 2] = \"Warn\";\n LogLevel[LogLevel[\"Error\"] = 3] = \"Error\";\n LogLevel[LogLevel[\"Fatal\"] = 4] = \"Fatal\";\n})(LogLevel || (LogLevel = {}));\n/**\n * Static singleton that represents the logging facility for Excalibur.\n * Excalibur comes built-in with a {@apilink ConsoleAppender} and {@apilink ScreenAppender}.\n * Derive from {@apilink Appender} to create your own logging appenders.\n */\nclass Logger {\n constructor() {\n this._appenders = [];\n /**\n * Gets or sets the default logging level. Excalibur will only log\n * messages if equal to or above this level. Default: {@apilink LogLevel.Info}\n */\n this.defaultLevel = LogLevel.Info;\n this._logOnceSet = new Set();\n if (Logger._INSTANCE) {\n throw new Error('Logger is a singleton');\n }\n Logger._INSTANCE = this;\n // Default console appender\n Logger._INSTANCE.addAppender(new ConsoleAppender());\n return Logger._INSTANCE;\n }\n /**\n * Gets the current static instance of Logger\n */\n static getInstance() {\n if (Logger._INSTANCE == null) {\n Logger._INSTANCE = new Logger();\n }\n return Logger._INSTANCE;\n }\n /**\n * Adds a new {@apilink Appender} to the list of appenders to write to\n */\n addAppender(appender) {\n this._appenders.push(appender);\n }\n /**\n * Clears all appenders from the logger\n */\n clearAppenders() {\n this._appenders.length = 0;\n }\n /**\n * Logs a message at a given LogLevel\n * @param level The LogLevel`to log the message at\n * @param args An array of arguments to write to an appender\n */\n _log(level, args) {\n if (level == null) {\n level = this.defaultLevel;\n }\n const len = this._appenders.length;\n for (let i = 0; i < len; i++) {\n if (level >= this.defaultLevel) {\n this._appenders[i].log(level, args);\n }\n }\n }\n _logOnce(level, args) {\n const serialized = level + args.join('+');\n if (this._logOnceSet.has(serialized)) {\n return;\n }\n else {\n this._logOnceSet.add(serialized);\n this._log(level, args);\n }\n }\n /**\n * Writes a log message at the {@apilink LogLevel.Debug} level\n * @param args Accepts any number of arguments\n */\n debug(...args) {\n this._log(LogLevel.Debug, args);\n }\n /**\n * Writes a log message once at the {@apilink LogLevel.Fatal} level, if it sees the same args again it wont log\n * @param args Accepts any number of arguments\n */\n debugOnce(...args) {\n this._logOnce(LogLevel.Debug, args);\n }\n /**\n * Writes a log message at the {@apilink LogLevel.Info} level\n * @param args Accepts any number of arguments\n */\n info(...args) {\n this._log(LogLevel.Info, args);\n }\n /**\n * Writes a log message once at the {@apilink LogLevel.Info} level, if it sees the same args again it wont log\n * @param args Accepts any number of arguments\n */\n infoOnce(...args) {\n this._logOnce(LogLevel.Info, args);\n }\n /**\n * Writes a log message at the {@apilink LogLevel.Warn} level\n * @param args Accepts any number of arguments\n */\n warn(...args) {\n this._log(LogLevel.Warn, args);\n }\n /**\n * Writes a log message once at the {@apilink LogLevel.Warn} level, if it sees the same args again it won't log\n * @param args Accepts any number of arguments\n */\n warnOnce(...args) {\n this._logOnce(LogLevel.Warn, args);\n }\n /**\n * Writes a log message at the {@apilink LogLevel.Error} level\n * @param args Accepts any number of arguments\n */\n error(...args) {\n this._log(LogLevel.Error, args);\n }\n /**\n * Writes a log message once at the {@apilink LogLevel.Error} level, if it sees the same args again it won't log\n * @param args Accepts any number of arguments\n */\n errorOnce(...args) {\n this._logOnce(LogLevel.Error, args);\n }\n /**\n * Writes a log message at the {@apilink LogLevel.Fatal} level\n * @param args Accepts any number of arguments\n */\n fatal(...args) {\n this._log(LogLevel.Fatal, args);\n }\n /**\n * Writes a log message once at the {@apilink LogLevel.Fatal} level, if it sees the same args again it won't log\n * @param args Accepts any number of arguments\n */\n fatalOnce(...args) {\n this._logOnce(LogLevel.Fatal, args);\n }\n}\nLogger._INSTANCE = null;\n/**\n * Console appender for browsers (i.e. `console.log`)\n */\nclass ConsoleAppender {\n /**\n * Logs a message at the given {@apilink LogLevel}\n * @param level Level to log at\n * @param args Arguments to log\n */\n log(level, args) {\n // Check for console support\n if (!console && !console.log && console.warn && console.error) {\n // todo maybe do something better than nothing\n return;\n }\n // Create a new console args array\n const consoleArgs = [];\n consoleArgs.unshift.apply(consoleArgs, args);\n consoleArgs.unshift('[' + LogLevel[level] + '] : ');\n if (level < LogLevel.Warn) {\n // Call .log for Debug/Info\n if (console.log.apply) {\n // this is required on some older browsers that don't support apply on console.log :(\n console.log.apply(console, consoleArgs);\n }\n else {\n console.log(consoleArgs.join(' '));\n }\n }\n else if (level < LogLevel.Error) {\n // Call .warn for Warn\n if (console.warn.apply) {\n console.warn.apply(console, consoleArgs);\n }\n else {\n console.warn(consoleArgs.join(' '));\n }\n }\n else {\n // Call .error for Error/Fatal\n if (console.error.apply) {\n console.error.apply(console, consoleArgs);\n }\n else {\n console.error(consoleArgs.join(' '));\n }\n }\n }\n}\n/**\n * On-screen (canvas) appender\n */\nclass ScreenAppender {\n constructor(options) {\n var _a, _b;\n this._messages = [];\n this._pos = 10;\n this._color = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Black;\n this._options = options;\n this.canvas = document.createElement('canvas');\n this._ctx = this.canvas.getContext('2d');\n this.canvas.style.position = 'absolute';\n this.canvas.style.zIndex = (_b = (_a = options.zIndex) === null || _a === void 0 ? void 0 : _a.toString()) !== null && _b !== void 0 ? _b : '99';\n document.body.appendChild(this.canvas);\n this._positionScreenAppenderCanvas();\n options.engine.screen.events.on('resize', () => {\n this._positionScreenAppenderCanvas();\n });\n }\n _positionScreenAppenderCanvas() {\n var _a, _b, _c, _d;\n const options = this._options;\n this.canvas.width = (_a = options.width) !== null && _a !== void 0 ? _a : options.engine.screen.resolution.width;\n this.canvas.height = (_b = options.height) !== null && _b !== void 0 ? _b : options.engine.screen.resolution.height;\n this.canvas.style.position = 'absolute';\n const pagePos = options.engine.screen.screenToPageCoordinates((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0));\n this.canvas.style.left = pagePos.x + 'px';\n this.canvas.style.top = pagePos.y + 'px';\n this._pos = (_c = options.xPos) !== null && _c !== void 0 ? _c : this._pos;\n this._color = (_d = options.color) !== null && _d !== void 0 ? _d : this._color;\n }\n /**\n * Logs a message at the given {@apilink LogLevel}\n * @param level Level to log at\n * @param args Arguments to log\n */\n log(level, args) {\n const message = args.join(',');\n this._ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n this._messages.unshift('[' + LogLevel[level] + '] : ' + message);\n let pos = 10;\n this._messages = this._messages.slice(0, 1000);\n for (let i = 0; i < this._messages.length; i++) {\n this._ctx.fillStyle = this._color.toRGBA();\n this._ctx.fillText(this._messages[i], this._pos, pos);\n pos += 10;\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Observable.ts\":\n/*!****************************!*\\\n !*** ./Util/Observable.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Observable: () => (/* binding */ Observable)\n/* harmony export */ });\n/**\n * Simple Observable implementation\n * @template T is the typescript Type that defines the data being observed\n */\nclass Observable {\n constructor() {\n this.observers = [];\n this.subscriptions = [];\n }\n /**\n * Register an observer to listen to this observable\n * @param observer\n */\n register(observer) {\n this.observers.push(observer);\n }\n /**\n * Register a callback to listen to this observable\n * @param func\n */\n subscribe(func) {\n this.subscriptions.push(func);\n }\n /**\n * Remove an observer from the observable\n * @param observer\n */\n unregister(observer) {\n const i = this.observers.indexOf(observer);\n if (i !== -1) {\n this.observers.splice(i, 1);\n }\n }\n /**\n * Remove a callback that is listening to this observable\n * @param func\n */\n unsubscribe(func) {\n const i = this.subscriptions.indexOf(func);\n if (i !== -1) {\n this.subscriptions.splice(i, 1);\n }\n }\n /**\n * Broadcasts a message to all observers and callbacks\n * @param message\n */\n notifyAll(message) {\n const observersLength = this.observers.length;\n for (let i = 0; i < observersLength; i++) {\n this.observers[i].notify(message);\n }\n const subscriptionsLength = this.subscriptions.length;\n for (let i = 0; i < subscriptionsLength; i++) {\n this.subscriptions[i](message);\n }\n }\n /**\n * Removes all observers and callbacks\n */\n clear() {\n this.observers.length = 0;\n this.subscriptions.length = 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Pool.ts\":\n/*!**********************!*\\\n !*** ./Util/Pool.ts ***!\n \\**********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Pool: () => (/* binding */ Pool)\n/* harmony export */ });\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n\nclass Pool {\n constructor(builder, recycler, maxObjects = 100) {\n this.builder = builder;\n this.recycler = recycler;\n this.maxObjects = maxObjects;\n this.totalAllocations = 0;\n this.index = 0;\n this.objects = [];\n this.disableWarnings = false;\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance();\n }\n dispose() {\n this.objects.length = 0;\n }\n preallocate() {\n for (let i = 0; i < this.maxObjects; i++) {\n this.objects[i] = this.builder();\n }\n }\n /**\n * Use many instances out of the in the context and return all to the pool.\n *\n * By returning values out of the context they will be un-hooked from the pool and are free to be passed to consumers\n * @param context\n */\n using(context) {\n const result = context(this);\n if (result) {\n return this.done(...result);\n }\n return this.done();\n }\n /**\n * Use a single instance out of th pool and immediately return it to the pool\n * @param context\n */\n borrow(context) {\n const object = this.get();\n context(object);\n this.index--;\n }\n /**\n * Retrieve a value from the pool, will allocate a new instance if necessary or recycle from the pool\n */\n get() {\n if (this.index === this.maxObjects) {\n if (!this.disableWarnings) {\n this._logger.warn('Max pooled objects reached, possible memory leak? Doubling');\n }\n this.maxObjects = this.maxObjects * 2;\n }\n if (this.objects[this.index]) {\n // Pool has an available object already constructed\n if (this.recycler) {\n return this.recycler(this.objects[this.index++]);\n }\n return this.objects[this.index++];\n }\n else {\n // New allocation\n this.totalAllocations++;\n const object = (this.objects[this.index++] = this.builder());\n return object;\n }\n }\n done(...objects) {\n // All objects in pool now considered \"free\"\n this.index = 0;\n for (const object of objects) {\n const poolIndex = this.objects.indexOf(object);\n // Build a new object to take the pool place\n this.objects[poolIndex] = this.builder();\n this.totalAllocations++;\n }\n return objects;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/RentalPool.ts\":\n/*!****************************!*\\\n !*** ./Util/RentalPool.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RentalPool: () => (/* binding */ RentalPool)\n/* harmony export */ });\nclass RentalPool {\n constructor(builder, cleaner, preAllocate = 1) {\n this.builder = builder;\n this.cleaner = cleaner;\n this._pool = [];\n this._size = 0;\n this.grow(preAllocate);\n }\n /**\n * Grow the pool size by an amount\n * @param amount\n */\n grow(amount) {\n if (amount > 0) {\n this._size += amount;\n for (let i = 0; i < amount; i++) {\n this._pool.push(this.builder());\n }\n }\n }\n /**\n * Rent an object from the pool, optionally clean it. If not cleaned previous state may be set.\n *\n * The pool will automatically double if depleted\n * @param clean\n */\n rent(clean = false) {\n if (this._pool.length === 0) {\n this.grow(this._size);\n }\n return clean ? this.cleaner(this._pool.pop()) : this._pool.pop();\n }\n /**\n * Return an object to the pool\n * @param object\n */\n return(object) {\n this._pool.push(object);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Semaphore.ts\":\n/*!***************************!*\\\n !*** ./Util/Semaphore.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Semaphore: () => (/* binding */ Semaphore)\n/* harmony export */ });\n/* harmony import */ var _Future__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Future */ \"./Util/Future.ts\");\n\nclass AsyncWaitQueue {\n constructor() {\n // Code from StephenCleary https://gist.github.com/StephenCleary/ba50b2da419c03b9cba1d20cb4654d5e\n this._queue = [];\n }\n get length() {\n return this._queue.length;\n }\n enqueue() {\n const future = new _Future__WEBPACK_IMPORTED_MODULE_0__.Future();\n this._queue.push(future);\n return future.promise;\n }\n dequeue(value) {\n const future = this._queue.shift();\n future.resolve(value);\n }\n}\n/**\n * Semaphore allows you to limit the amount of async calls happening between `enter()` and `exit()`\n *\n * This can be useful when limiting the number of http calls, browser api calls, etc either for performance or to work\n * around browser limitations like max Image.decode() calls in chromium being 256.\n */\nclass Semaphore {\n constructor(_count) {\n this._count = _count;\n this._waitQueue = new AsyncWaitQueue();\n }\n get count() {\n return this._count;\n }\n get waiting() {\n return this._waitQueue.length;\n }\n // eslint-disable-next-line require-await\n async enter() {\n if (this._count !== 0) {\n this._count--;\n return Promise.resolve();\n }\n return this._waitQueue.enqueue();\n }\n exit(count = 1) {\n if (count === 0) {\n return;\n }\n while (count !== 0 && this._waitQueue.length !== 0) {\n this._waitQueue.dequeue(null);\n count--;\n }\n this._count += count;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Sound.ts\":\n/*!***********************!*\\\n !*** ./Util/Sound.ts ***!\n \\***********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ canPlayFile: () => (/* binding */ canPlayFile)\n/* harmony export */ });\n/* harmony import */ var _Log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Log */ \"./Util/Log.ts\");\n\n/**\n * Whether or not the browser can play this file as HTML5 Audio\n */\nfunction canPlayFile(file) {\n try {\n const a = new Audio();\n const filetype = /.*\\.([A-Za-z0-9]+)(?:(?:\\?|\\#).*)*$/;\n const type = file.match(filetype)[1];\n if (a.canPlayType('audio/' + type)) {\n return true;\n }\n else {\n return false;\n }\n }\n catch (e) {\n _Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance().warn('Cannot determine audio support, assuming no support for the Audio Tag', e);\n return false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/StateMachine.ts\":\n/*!******************************!*\\\n !*** ./Util/StateMachine.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ StateMachine: () => (/* binding */ StateMachine)\n/* harmony export */ });\nclass StateMachine {\n constructor() {\n this.states = new Map();\n }\n get currentState() {\n return this._currentState;\n }\n set currentState(state) {\n this._currentState = state;\n }\n static create(machineDescription, data) {\n const machine = new StateMachine();\n machine.data = data;\n for (const stateName in machineDescription.states) {\n machine.states.set(stateName, {\n name: stateName,\n ...machineDescription.states[stateName]\n });\n }\n // validate transitions are states\n for (const state of machine.states.values()) {\n for (const transitionState of state.transitions) {\n if (transitionState === '*') {\n continue;\n }\n if (!machine.states.has(transitionState)) {\n throw Error(`Invalid state machine, state [${state.name}] has a transition to another state that doesn't exist [${transitionState}]`);\n }\n }\n }\n machine.currentState = machine.startState = machine.states.get(machineDescription.start);\n return machine;\n }\n in(state) {\n return this.currentState.name === state;\n }\n go(stateName, eventData) {\n var _a, _b;\n if (this.currentState.transitions.includes(stateName) || this.currentState.transitions.includes('*')) {\n const potentialNewState = this.states.get(stateName);\n if (this.currentState.onExit) {\n const canExit = (_a = this.currentState) === null || _a === void 0 ? void 0 : _a.onExit({ to: potentialNewState.name, data: this.data });\n if (canExit === false) {\n return false;\n }\n }\n if (potentialNewState === null || potentialNewState === void 0 ? void 0 : potentialNewState.onEnter) {\n const canEnter = potentialNewState === null || potentialNewState === void 0 ? void 0 : potentialNewState.onEnter({ from: this.currentState.name, eventData, data: this.data });\n if (canEnter === false) {\n return false;\n }\n }\n this.currentState = potentialNewState;\n if ((_b = this.currentState) === null || _b === void 0 ? void 0 : _b.onState) {\n this.currentState.onState();\n }\n return true;\n }\n return false;\n }\n update(elapsed) {\n if (this.currentState.onUpdate) {\n this.currentState.onUpdate(this.data, elapsed);\n }\n }\n save(saveKey) {\n localStorage.setItem(saveKey, JSON.stringify({\n currentState: this.currentState.name,\n data: this.data\n }));\n }\n restore(saveKey) {\n const state = JSON.parse(localStorage.getItem(saveKey));\n this.currentState = this.states.get(state.currentState);\n this.data = state.data;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Toaster.ts\":\n/*!*************************!*\\\n !*** ./Util/Toaster.ts ***!\n \\*************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Toaster: () => (/* binding */ Toaster)\n/* harmony export */ });\n/* harmony import */ var _Toaster_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Toaster.css */ \"./Util/Toaster.css\");\n\n/**\n * The Toaster is only meant to be called from inside Excalibur to display messages to players\n */\nclass Toaster {\n constructor() {\n this._toasterCss = _Toaster_css__WEBPACK_IMPORTED_MODULE_0__[\"default\"].toString();\n this._isInitialized = false;\n }\n _initialize() {\n if (!this._isInitialized) {\n this._container = document.createElement('div');\n this._container.id = 'ex-toast-container';\n document.body.appendChild(this._container);\n this._isInitialized = true;\n this._styleBlock = document.createElement('style');\n this._styleBlock.textContent = this._toasterCss;\n document.head.appendChild(this._styleBlock);\n }\n }\n dispose() {\n this._container.parentElement.removeChild(this._container);\n this._styleBlock.parentElement.removeChild(this._styleBlock);\n this._isInitialized = false;\n }\n _createFragment(message) {\n const toastMessage = document.createElement('span');\n toastMessage.innerText = message;\n return toastMessage;\n }\n /**\n * Display a toast message to a player\n * @param message Text of the message, messages may have a single \"[LINK]\" to influence placement\n * @param linkTarget Optionally specify a link location\n * @param linkName Optionally specify a name for that link location\n */\n toast(message, linkTarget, linkName) {\n this._initialize();\n const toast = document.createElement('div');\n toast.className = 'ex-toast-message';\n const messageFragments = message.split('[LINK]').map((message) => this._createFragment(message));\n if (linkTarget) {\n const link = document.createElement('a');\n link.href = linkTarget;\n if (linkName) {\n link.innerText = linkName;\n }\n else {\n link.innerText = linkTarget;\n }\n messageFragments.splice(1, 0, link);\n }\n // Assembly message\n const finalMessage = document.createElement('div');\n messageFragments.forEach((message) => {\n finalMessage.appendChild(message);\n });\n toast.appendChild(finalMessage);\n // Dismiss button\n const dismissBtn = document.createElement('button');\n dismissBtn.innerText = 'x';\n dismissBtn.addEventListener('click', () => {\n this._container.removeChild(toast);\n });\n toast.appendChild(dismissBtn);\n // Escape to dismiss\n const keydownHandler = (evt) => {\n if (evt.key === 'Escape') {\n try {\n this._container.removeChild(toast);\n }\n catch (_a) {\n // pass\n }\n }\n document.removeEventListener('keydown', keydownHandler);\n };\n document.addEventListener('keydown', keydownHandler);\n // Insert into container\n const first = this._container.firstChild;\n this._container.insertBefore(toast, first);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Util.ts\":\n/*!**********************!*\\\n !*** ./Util/Util.ts ***!\n \\**********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ addItemToArray: () => (/* binding */ addItemToArray),\n/* harmony export */ contains: () => (/* binding */ contains),\n/* harmony export */ delay: () => (/* binding */ delay),\n/* harmony export */ fail: () => (/* binding */ fail),\n/* harmony export */ getPosition: () => (/* binding */ getPosition),\n/* harmony export */ isObject: () => (/* binding */ isObject),\n/* harmony export */ mergeDeep: () => (/* binding */ mergeDeep),\n/* harmony export */ omit: () => (/* binding */ omit),\n/* harmony export */ removeItemFromArray: () => (/* binding */ removeItemFromArray)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Future__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Future */ \"./Util/Future.ts\");\n\n\n/**\n * Find the screen position of an HTML element\n */\nfunction getPosition(el) {\n // do we need the scroll too? technically the offset method before did that\n if (el && el.getBoundingClientRect) {\n const rect = el.getBoundingClientRect();\n return (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(rect.x + window.scrollX, rect.y + window.scrollY);\n }\n return _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero;\n}\n/**\n * Add an item to an array list if it doesn't already exist. Returns true if added, false if not and already exists in the array.\n * @deprecated Will be removed in v0.26.0\n */\nfunction addItemToArray(item, array) {\n if (array.indexOf(item) === -1) {\n array.push(item);\n return true;\n }\n return false;\n}\n/**\n * Remove an item from an list\n * @deprecated Will be removed in v0.26.0\n */\nfunction removeItemFromArray(item, array) {\n let index = -1;\n if ((index = array.indexOf(item)) > -1) {\n array.splice(index, 1);\n return true;\n }\n return false;\n}\n/**\n * See if an array contains something\n */\nfunction contains(array, obj) {\n for (let i = 0; i < array.length; i++) {\n if (array[i] === obj) {\n return true;\n }\n }\n return false;\n}\n/**\n * Used for exhaustive checks at compile time\n */\nfunction fail(message) {\n throw new Error(message);\n}\n/**\n * Create a promise that resolves after a certain number of milliseconds\n *\n * It is strongly recommended you pass the excalibur clock so delays are bound to the\n * excalibur clock which would be unaffected by stop/pause.\n * @param milliseconds\n * @param clock\n */\nfunction delay(milliseconds, clock) {\n var _a;\n const future = new _Future__WEBPACK_IMPORTED_MODULE_1__.Future();\n const schedule = (_a = clock === null || clock === void 0 ? void 0 : clock.schedule.bind(clock)) !== null && _a !== void 0 ? _a : setTimeout;\n schedule(() => {\n future.resolve();\n }, milliseconds);\n return future.promise;\n}\n/**\n * Remove keys from object literals\n * @param object\n * @param keys\n */\nfunction omit(object, keys) {\n const newObj = {};\n for (const key in object) {\n if (!keys.includes(key)) {\n newObj[key] = object[key];\n }\n }\n return newObj;\n}\n/**\n * Simple object check.\n * @param item\n */\nfunction isObject(item) {\n return item && typeof item === 'object' && !Array.isArray(item);\n}\n/**\n * Deep merge two objects.\n * @param target\n * @param sources\n */\nfunction mergeDeep(target, ...sources) {\n if (!sources.length) {\n return target;\n }\n const source = sources.shift();\n if (isObject(target) && isObject(source)) {\n for (const key in source) {\n if (isObject(source[key])) {\n if (!target[key]) {\n Object.assign(target, { [key]: {} });\n }\n mergeDeep(target[key], source[key]);\n }\n else {\n Object.assign(target, { [key]: source[key] });\n }\n }\n }\n return mergeDeep(target, ...sources);\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Watch.ts\":\n/*!***********************!*\\\n !*** ./Util/Watch.ts ***!\n \\***********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ watch: () => (/* binding */ watch),\n/* harmony export */ watchAny: () => (/* binding */ watchAny),\n/* harmony export */ watchDeep: () => (/* binding */ watchDeep)\n/* harmony export */ });\n/**\n * Watch an object with a proxy, only fires if property value is different\n */\nfunction watch(type, change) {\n if (!type) {\n return type;\n }\n if (type.__isProxy === undefined) {\n // expando hack to mark a proxy\n return new Proxy(type, {\n set: (obj, prop, value) => {\n // The default behavior to store the value\n if (obj[prop] !== value) {\n obj[prop] = value;\n // Avoid watching private junk\n if (typeof prop === 'string') {\n if (prop[0] !== '_') {\n change(obj);\n }\n }\n }\n // Indicate success\n return true;\n },\n get: (obj, prop) => {\n if (prop !== '__isProxy') {\n return obj[prop];\n }\n return true;\n }\n });\n }\n return type;\n}\nconst createHandler = (path = [], change, typeType) => ({\n get: (target, key) => {\n if (key === '__isProxy') {\n return true;\n }\n if (typeof target[key] === 'object' && target[key] != null) {\n return new Proxy(target[key], createHandler([...path, key], change, typeType));\n }\n return target[key];\n },\n set: (target, key, value) => {\n if (typeof key === 'string') {\n if (key[0] !== '_') {\n change(typeType);\n }\n }\n target[key] = value;\n return true;\n }\n});\n/**\n *\n */\nfunction watchDeep(type, change) {\n if (!type) {\n return type;\n }\n if (type.__isProxy === undefined) {\n // expando hack to mark a proxy\n return new Proxy(type, createHandler([], change, type));\n }\n return type;\n}\n/**\n * Watch an object with a proxy, fires change on any property value change\n */\nfunction watchAny(type, change) {\n if (!type) {\n return type;\n }\n if (type.__isProxy === undefined) {\n // expando hack to mark a proxy\n return new Proxy(type, {\n set: (obj, prop, value) => {\n // The default behavior to store the value\n obj[prop] = value;\n // Avoid watching private junk\n if (typeof prop === 'string') {\n if (prop[0] !== '_') {\n change(obj);\n }\n }\n // Indicate success\n return true;\n },\n get: (obj, prop) => {\n if (prop !== '__isProxy') {\n return obj[prop];\n }\n return true;\n }\n });\n }\n return type;\n}\n\n\n/***/ }),\n\n/***/ \"./Util/WebAudio.ts\":\n/*!**************************!*\\\n !*** ./Util/WebAudio.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ WebAudio: () => (/* binding */ WebAudio)\n/* harmony export */ });\n/* harmony import */ var _Resources_Sound_AudioContext__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Resources/Sound/AudioContext */ \"./Resources/Sound/AudioContext.ts\");\n/* harmony import */ var _Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Log */ \"./Util/Log.ts\");\n\n\n/**\n * Patch for detecting legacy web audio in browsers\n * @internal\n * @param source\n */\nfunction isLegacyWebAudioSource(source) {\n return !!source.playbackState;\n}\nclass WebAudio {\n /**\n * Play an empty sound to unlock Safari WebAudio context. Call this function\n * right after a user interaction event.\n * @source https://paulbakaus.com/tutorials/html5/web-audio-on-ios/\n */\n static unlock() {\n const promise = new Promise((resolve, reject) => {\n if (WebAudio._UNLOCKED || !_Resources_Sound_AudioContext__WEBPACK_IMPORTED_MODULE_0__.AudioContextFactory.create()) {\n return resolve(true);\n }\n const unlockTimeoutTimer = setTimeout(() => {\n _Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance().warn('Excalibur was unable to unlock the audio context, audio probably will not play in this browser.');\n resolve(false);\n }, 200);\n const audioContext = _Resources_Sound_AudioContext__WEBPACK_IMPORTED_MODULE_0__.AudioContextFactory.create();\n audioContext.resume().then(() => {\n // create empty buffer and play it\n const buffer = audioContext.createBuffer(1, 1, 22050);\n const source = audioContext.createBufferSource();\n let ended = false;\n source.buffer = buffer;\n source.connect(audioContext.destination);\n source.onended = () => (ended = true);\n source.start(0);\n // by checking the play state after some time, we know if we're really unlocked\n setTimeout(() => {\n if (isLegacyWebAudioSource(source)) {\n if (source.playbackState === source.PLAYING_STATE || source.playbackState === source.FINISHED_STATE) {\n WebAudio._UNLOCKED = true;\n }\n }\n else {\n if (audioContext.currentTime > 0 || ended) {\n WebAudio._UNLOCKED = true;\n }\n }\n }, 0);\n clearTimeout(unlockTimeoutTimer);\n resolve(true);\n }, () => {\n reject();\n });\n });\n return promise;\n }\n static isUnlocked() {\n return this._UNLOCKED;\n }\n}\nWebAudio._UNLOCKED = false;\n\n\n/***/ }),\n\n/***/ \"./index.ts\":\n/*!******************!*\\\n !*** ./index.ts ***!\n \\******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ActionCompleteEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.ActionCompleteEvent),\n/* harmony export */ ActionContext: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ActionContext),\n/* harmony export */ ActionQueue: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ActionQueue),\n/* harmony export */ ActionSequence: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ActionSequence),\n/* harmony export */ ActionStartEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.ActionStartEvent),\n/* harmony export */ ActionsComponent: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ActionsComponent),\n/* harmony export */ ActionsSystem: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ActionsSystem),\n/* harmony export */ ActivateEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.ActivateEvent),\n/* harmony export */ Actor: () => (/* reexport safe */ _Actor__WEBPACK_IMPORTED_MODULE_6__.Actor),\n/* harmony export */ ActorEvents: () => (/* reexport safe */ _Actor__WEBPACK_IMPORTED_MODULE_6__.ActorEvents),\n/* harmony export */ AddEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.AddEvent),\n/* harmony export */ AddedComponent: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.AddedComponent),\n/* harmony export */ AffineMatrix: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.AffineMatrix),\n/* harmony export */ Animation: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Animation),\n/* harmony export */ AnimationDirection: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.AnimationDirection),\n/* harmony export */ AnimationEvents: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.AnimationEvents),\n/* harmony export */ AnimationStrategy: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.AnimationStrategy),\n/* harmony export */ ArcadeSolver: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.ArcadeSolver),\n/* harmony export */ AudioContextFactory: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.AudioContextFactory),\n/* harmony export */ Axes: () => (/* reexport safe */ _Input_Gamepad__WEBPACK_IMPORTED_MODULE_40__.Axes),\n/* harmony export */ Axis: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.Axis),\n/* harmony export */ BaseAlign: () => (/* reexport safe */ _Graphics_FontCommon__WEBPACK_IMPORTED_MODULE_14__.BaseAlign),\n/* harmony export */ BezierCurve: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.BezierCurve),\n/* harmony export */ Blink: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.Blink),\n/* harmony export */ BodyComponent: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.BodyComponent),\n/* harmony export */ BoundingBox: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.BoundingBox),\n/* harmony export */ BrowserComponent: () => (/* reexport safe */ _Util_Browser__WEBPACK_IMPORTED_MODULE_45__.BrowserComponent),\n/* harmony export */ BrowserEvents: () => (/* reexport safe */ _Util_Browser__WEBPACK_IMPORTED_MODULE_45__.BrowserEvents),\n/* harmony export */ Buttons: () => (/* reexport safe */ _Input_Gamepad__WEBPACK_IMPORTED_MODULE_40__.Buttons),\n/* harmony export */ Camera: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.Camera),\n/* harmony export */ CameraEvents: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.CameraEvents),\n/* harmony export */ Canvas: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Canvas),\n/* harmony export */ Circle: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Circle),\n/* harmony export */ CircleCollider: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.CircleCollider),\n/* harmony export */ Clock: () => (/* reexport safe */ _Util_Clock__WEBPACK_IMPORTED_MODULE_53__.Clock),\n/* harmony export */ ClosestLineJumpTable: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.ClosestLineJumpTable),\n/* harmony export */ Collider: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.Collider),\n/* harmony export */ ColliderComponent: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.ColliderComponent),\n/* harmony export */ CollisionContact: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.CollisionContact),\n/* harmony export */ CollisionEndEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.CollisionEndEvent),\n/* harmony export */ CollisionGroup: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.CollisionGroup),\n/* harmony export */ CollisionGroupManager: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.CollisionGroupManager),\n/* harmony export */ CollisionJumpTable: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.CollisionJumpTable),\n/* harmony export */ CollisionPostSolveEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.CollisionPostSolveEvent),\n/* harmony export */ CollisionPreSolveEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.CollisionPreSolveEvent),\n/* harmony export */ CollisionStartEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.CollisionStartEvent),\n/* harmony export */ CollisionSystem: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.CollisionSystem),\n/* harmony export */ CollisionType: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.CollisionType),\n/* harmony export */ Color: () => (/* reexport safe */ _Color__WEBPACK_IMPORTED_MODULE_27__.Color),\n/* harmony export */ ColorBlindFlags: () => (/* reexport safe */ _Debug_index__WEBPACK_IMPORTED_MODULE_9__.ColorBlindFlags),\n/* harmony export */ ColorBlindnessMode: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ColorBlindnessMode),\n/* harmony export */ ColorBlindnessPostProcessor: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ColorBlindnessPostProcessor),\n/* harmony export */ Component: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.Component),\n/* harmony export */ CompositeCollider: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.CompositeCollider),\n/* harmony export */ ConsoleAppender: () => (/* reexport safe */ _Util_Log__WEBPACK_IMPORTED_MODULE_50__.ConsoleAppender),\n/* harmony export */ ContactConstraintPoint: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.ContactConstraintPoint),\n/* harmony export */ ContactEndEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.ContactEndEvent),\n/* harmony export */ ContactSolveBias: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.ContactSolveBias),\n/* harmony export */ ContactStartEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.ContactStartEvent),\n/* harmony export */ CoordPlane: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.CoordPlane),\n/* harmony export */ CrossFade: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.CrossFade),\n/* harmony export */ CurveBy: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.CurveBy),\n/* harmony export */ CurveTo: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.CurveTo),\n/* harmony export */ DeactivateEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.DeactivateEvent),\n/* harmony export */ Debug: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Debug),\n/* harmony export */ DebugConfig: () => (/* reexport safe */ _Debug_index__WEBPACK_IMPORTED_MODULE_9__.DebugConfig),\n/* harmony export */ DebugGraphicsComponent: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.DebugGraphicsComponent),\n/* harmony export */ DebugSystem: () => (/* reexport safe */ _Debug_index__WEBPACK_IMPORTED_MODULE_9__.DebugSystem),\n/* harmony export */ DebugText: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.DebugText),\n/* harmony export */ DefaultAntialiasOptions: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.DefaultAntialiasOptions),\n/* harmony export */ DefaultGarbageCollectionOptions: () => (/* reexport safe */ _GarbageCollector__WEBPACK_IMPORTED_MODULE_4__.DefaultGarbageCollectionOptions),\n/* harmony export */ DefaultLoader: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.DefaultLoader),\n/* harmony export */ DefaultPixelArtOptions: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.DefaultPixelArtOptions),\n/* harmony export */ DegreeOfFreedom: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.DegreeOfFreedom),\n/* harmony export */ Delay: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.Delay),\n/* harmony export */ Detector: () => (/* reexport safe */ _Util_Detector__WEBPACK_IMPORTED_MODULE_47__.Detector),\n/* harmony export */ Die: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.Die),\n/* harmony export */ Direction: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Direction),\n/* harmony export */ Director: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.Director),\n/* harmony export */ DirectorEvents: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.DirectorEvents),\n/* harmony export */ DisplayMode: () => (/* reexport safe */ _Screen__WEBPACK_IMPORTED_MODULE_5__.DisplayMode),\n/* harmony export */ DynamicTree: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.DynamicTree),\n/* harmony export */ DynamicTreeCollisionProcessor: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.DynamicTreeCollisionProcessor),\n/* harmony export */ EX_VERSION: () => (/* binding */ EX_VERSION),\n/* harmony export */ EaseBy: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.EaseBy),\n/* harmony export */ EaseTo: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.EaseTo),\n/* harmony export */ EasingFunctions: () => (/* reexport safe */ _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_48__.EasingFunctions),\n/* harmony export */ EdgeCollider: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.EdgeCollider),\n/* harmony export */ ElasticToActorStrategy: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.ElasticToActorStrategy),\n/* harmony export */ EmitterType: () => (/* reexport safe */ _Particles_index__WEBPACK_IMPORTED_MODULE_15__.EmitterType),\n/* harmony export */ Engine: () => (/* reexport safe */ _Engine__WEBPACK_IMPORTED_MODULE_3__.Engine),\n/* harmony export */ EngineEvents: () => (/* reexport safe */ _Engine__WEBPACK_IMPORTED_MODULE_3__.EngineEvents),\n/* harmony export */ EnterTriggerEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.EnterTriggerEvent),\n/* harmony export */ EnterViewPortEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.EnterViewPortEvent),\n/* harmony export */ Entity: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.Entity),\n/* harmony export */ EntityEvents: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.EntityEvents),\n/* harmony export */ EntityManager: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.EntityManager),\n/* harmony export */ EventEmitter: () => (/* reexport safe */ _EventEmitter__WEBPACK_IMPORTED_MODULE_10__.EventEmitter),\n/* harmony export */ EventTypes: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.EventTypes),\n/* harmony export */ Events: () => (/* reexport module object */ _Events__WEBPACK_IMPORTED_MODULE_12__),\n/* harmony export */ ExResponse: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.ExResponse),\n/* harmony export */ ExcaliburGraphicsContext2DCanvas: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ExcaliburGraphicsContext2DCanvas),\n/* harmony export */ ExcaliburGraphicsContextWebGL: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ExcaliburGraphicsContextWebGL),\n/* harmony export */ ExitTriggerEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.ExitTriggerEvent),\n/* harmony export */ ExitViewPortEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.ExitViewPortEvent),\n/* harmony export */ Fade: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.Fade),\n/* harmony export */ FadeInOut: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.FadeInOut),\n/* harmony export */ Flags: () => (/* reexport safe */ _Flags__WEBPACK_IMPORTED_MODULE_1__.Flags),\n/* harmony export */ Flash: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.Flash),\n/* harmony export */ Follow: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.Follow),\n/* harmony export */ Font: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Font),\n/* harmony export */ FontCache: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.FontCache),\n/* harmony export */ FontSource: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.FontSource),\n/* harmony export */ FontStyle: () => (/* reexport safe */ _Graphics_FontCommon__WEBPACK_IMPORTED_MODULE_14__.FontStyle),\n/* harmony export */ FontUnit: () => (/* reexport safe */ _Graphics_FontCommon__WEBPACK_IMPORTED_MODULE_14__.FontUnit),\n/* harmony export */ FpsSampler: () => (/* reexport safe */ _Util_Fps__WEBPACK_IMPORTED_MODULE_52__.FpsSampler),\n/* harmony export */ FrameStats: () => (/* reexport safe */ _Debug_index__WEBPACK_IMPORTED_MODULE_9__.FrameStats),\n/* harmony export */ Future: () => (/* reexport safe */ _Util_Future__WEBPACK_IMPORTED_MODULE_57__.Future),\n/* harmony export */ GameEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.GameEvent),\n/* harmony export */ GameStartEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.GameStartEvent),\n/* harmony export */ GameStopEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.GameStopEvent),\n/* harmony export */ Gamepad: () => (/* reexport safe */ _Input_Gamepad__WEBPACK_IMPORTED_MODULE_40__.Gamepad),\n/* harmony export */ GamepadAxisEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.GamepadAxisEvent),\n/* harmony export */ GamepadButtonEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.GamepadButtonEvent),\n/* harmony export */ GamepadConnectEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.GamepadConnectEvent),\n/* harmony export */ GamepadDisconnectEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.GamepadDisconnectEvent),\n/* harmony export */ Gamepads: () => (/* reexport safe */ _Input_Gamepad__WEBPACK_IMPORTED_MODULE_40__.Gamepads),\n/* harmony export */ GarbageCollector: () => (/* reexport safe */ _GarbageCollector__WEBPACK_IMPORTED_MODULE_4__.GarbageCollector),\n/* harmony export */ Gif: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.Gif),\n/* harmony export */ GifParser: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.GifParser),\n/* harmony export */ GlobalCoordinates: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.GlobalCoordinates),\n/* harmony export */ GpuParticleEmitter: () => (/* reexport safe */ _Particles_index__WEBPACK_IMPORTED_MODULE_15__.GpuParticleEmitter),\n/* harmony export */ GpuParticleRenderer: () => (/* reexport safe */ _Particles_index__WEBPACK_IMPORTED_MODULE_15__.GpuParticleRenderer),\n/* harmony export */ Graphic: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Graphic),\n/* harmony export */ GraphicsComponent: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.GraphicsComponent),\n/* harmony export */ GraphicsGroup: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.GraphicsGroup),\n/* harmony export */ GraphicsSystem: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.GraphicsSystem),\n/* harmony export */ HashColliderProxy: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.HashColliderProxy),\n/* harmony export */ HashGridCell: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.HashGridCell),\n/* harmony export */ HashGridProxy: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.HashGridProxy),\n/* harmony export */ HiddenEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.HiddenEvent),\n/* harmony export */ HorizontalFirst: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.HorizontalFirst),\n/* harmony export */ ImageFiltering: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ImageFiltering),\n/* harmony export */ ImageSource: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ImageSource),\n/* harmony export */ ImageSourceAttributeConstants: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ImageSourceAttributeConstants),\n/* harmony export */ ImageWrapping: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ImageWrapping),\n/* harmony export */ InitializeEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.InitializeEvent),\n/* harmony export */ InputHost: () => (/* reexport safe */ _Input_InputHost__WEBPACK_IMPORTED_MODULE_42__.InputHost),\n/* harmony export */ InputMapper: () => (/* reexport safe */ _Input_InputMapper__WEBPACK_IMPORTED_MODULE_43__.InputMapper),\n/* harmony export */ IsometricEntityComponent: () => (/* reexport safe */ _TileMap_index__WEBPACK_IMPORTED_MODULE_17__.IsometricEntityComponent),\n/* harmony export */ IsometricEntitySystem: () => (/* reexport safe */ _TileMap_index__WEBPACK_IMPORTED_MODULE_17__.IsometricEntitySystem),\n/* harmony export */ IsometricMap: () => (/* reexport safe */ _TileMap_index__WEBPACK_IMPORTED_MODULE_17__.IsometricMap),\n/* harmony export */ IsometricTile: () => (/* reexport safe */ _TileMap_index__WEBPACK_IMPORTED_MODULE_17__.IsometricTile),\n/* harmony export */ KeyEvent: () => (/* reexport safe */ _Input_Keyboard__WEBPACK_IMPORTED_MODULE_41__.KeyEvent),\n/* harmony export */ Keyboard: () => (/* reexport safe */ _Input_Keyboard__WEBPACK_IMPORTED_MODULE_41__.Keyboard),\n/* harmony export */ Keys: () => (/* reexport safe */ _Input_Keyboard__WEBPACK_IMPORTED_MODULE_41__.Keys),\n/* harmony export */ KillEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.KillEvent),\n/* harmony export */ Label: () => (/* reexport safe */ _Label__WEBPACK_IMPORTED_MODULE_13__.Label),\n/* harmony export */ LimitCameraBoundsStrategy: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.LimitCameraBoundsStrategy),\n/* harmony export */ Line: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Line),\n/* harmony export */ LineSegment: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.LineSegment),\n/* harmony export */ Loader: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.Loader),\n/* harmony export */ LoaderEvents: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.LoaderEvents),\n/* harmony export */ LockCameraToActorAxisStrategy: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.LockCameraToActorAxisStrategy),\n/* harmony export */ LockCameraToActorStrategy: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.LockCameraToActorStrategy),\n/* harmony export */ LogLevel: () => (/* reexport safe */ _Util_Log__WEBPACK_IMPORTED_MODULE_50__.LogLevel),\n/* harmony export */ Logger: () => (/* reexport safe */ _Util_Log__WEBPACK_IMPORTED_MODULE_50__.Logger),\n/* harmony export */ Material: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Material),\n/* harmony export */ Matrix: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.Matrix),\n/* harmony export */ MatrixLocations: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.MatrixLocations),\n/* harmony export */ MediaEvent: () => (/* reexport safe */ _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_11__.MediaEvent),\n/* harmony export */ Meet: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.Meet),\n/* harmony export */ MotionComponent: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.MotionComponent),\n/* harmony export */ MotionSystem: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.MotionSystem),\n/* harmony export */ MoveBy: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.MoveBy),\n/* harmony export */ MoveByWithOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.MoveByWithOptions),\n/* harmony export */ MoveTo: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.MoveTo),\n/* harmony export */ MoveToWithOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.MoveToWithOptions),\n/* harmony export */ NativePointerButton: () => (/* reexport safe */ _Input_NativePointerButton__WEBPACK_IMPORTED_MODULE_33__.NativePointerButton),\n/* harmony export */ NativeSoundEvent: () => (/* reexport safe */ _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_11__.NativeSoundEvent),\n/* harmony export */ NativeSoundProcessedEvent: () => (/* reexport safe */ _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_11__.NativeSoundProcessedEvent),\n/* harmony export */ NineSlice: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.NineSlice),\n/* harmony export */ NineSliceStretch: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.NineSliceStretch),\n/* harmony export */ None: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.None),\n/* harmony export */ Observable: () => (/* reexport safe */ _Util_Observable__WEBPACK_IMPORTED_MODULE_49__.Observable),\n/* harmony export */ OffscreenSystem: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.OffscreenSystem),\n/* harmony export */ Pair: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.Pair),\n/* harmony export */ ParallaxComponent: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ParallaxComponent),\n/* harmony export */ ParallelActions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ParallelActions),\n/* harmony export */ Particle: () => (/* reexport safe */ _Particles_index__WEBPACK_IMPORTED_MODULE_15__.Particle),\n/* harmony export */ ParticleEmitter: () => (/* reexport safe */ _Particles_index__WEBPACK_IMPORTED_MODULE_15__.ParticleEmitter),\n/* harmony export */ ParticleRenderer: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ParticleRenderer),\n/* harmony export */ ParticleTransform: () => (/* reexport safe */ _Particles_index__WEBPACK_IMPORTED_MODULE_15__.ParticleTransform),\n/* harmony export */ PhysicsStats: () => (/* reexport safe */ _Debug_index__WEBPACK_IMPORTED_MODULE_9__.PhysicsStats),\n/* harmony export */ PhysicsWorld: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.PhysicsWorld),\n/* harmony export */ PointerAbstraction: () => (/* reexport safe */ _Input_PointerAbstraction__WEBPACK_IMPORTED_MODULE_35__.PointerAbstraction),\n/* harmony export */ PointerButton: () => (/* reexport safe */ _Input_PointerButton__WEBPACK_IMPORTED_MODULE_32__.PointerButton),\n/* harmony export */ PointerComponent: () => (/* reexport safe */ _Input_PointerComponent__WEBPACK_IMPORTED_MODULE_36__.PointerComponent),\n/* harmony export */ PointerEvent: () => (/* reexport safe */ _Input_PointerEvent__WEBPACK_IMPORTED_MODULE_30__.PointerEvent),\n/* harmony export */ PointerEventReceiver: () => (/* reexport safe */ _Input_PointerEventReceiver__WEBPACK_IMPORTED_MODULE_34__.PointerEventReceiver),\n/* harmony export */ PointerScope: () => (/* reexport safe */ _Input_PointerScope__WEBPACK_IMPORTED_MODULE_39__.PointerScope),\n/* harmony export */ PointerSystem: () => (/* reexport safe */ _Input_PointerSystem__WEBPACK_IMPORTED_MODULE_37__.PointerSystem),\n/* harmony export */ PointerType: () => (/* reexport safe */ _Input_PointerType__WEBPACK_IMPORTED_MODULE_38__.PointerType),\n/* harmony export */ Polygon: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Polygon),\n/* harmony export */ PolygonCollider: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.PolygonCollider),\n/* harmony export */ Pool: () => (/* reexport safe */ _Util_Pool__WEBPACK_IMPORTED_MODULE_51__.Pool),\n/* harmony export */ PostCollisionEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PostCollisionEvent),\n/* harmony export */ PostDebugDrawEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PostDebugDrawEvent),\n/* harmony export */ PostDrawEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PostDrawEvent),\n/* harmony export */ PostFrameEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PostFrameEvent),\n/* harmony export */ PostKillEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PostKillEvent),\n/* harmony export */ PostTransformDrawEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PostTransformDrawEvent),\n/* harmony export */ PostUpdateEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PostUpdateEvent),\n/* harmony export */ PreCollisionEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PreCollisionEvent),\n/* harmony export */ PreDebugDrawEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PreDebugDrawEvent),\n/* harmony export */ PreDrawEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PreDrawEvent),\n/* harmony export */ PreFrameEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PreFrameEvent),\n/* harmony export */ PreKillEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PreKillEvent),\n/* harmony export */ PreLoadEvent: () => (/* reexport safe */ _Scene__WEBPACK_IMPORTED_MODULE_16__.PreLoadEvent),\n/* harmony export */ PreTransformDrawEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PreTransformDrawEvent),\n/* harmony export */ PreUpdateEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PreUpdateEvent),\n/* harmony export */ Projection: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.Projection),\n/* harmony export */ QuadIndexBuffer: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.QuadIndexBuffer),\n/* harmony export */ QuadTree: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.QuadTree),\n/* harmony export */ Query: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.Query),\n/* harmony export */ QueryManager: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.QueryManager),\n/* harmony export */ RadiusAroundActorStrategy: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.RadiusAroundActorStrategy),\n/* harmony export */ Random: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.Random),\n/* harmony export */ Raster: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Raster),\n/* harmony export */ Ray: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.Ray),\n/* harmony export */ RealisticSolver: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.RealisticSolver),\n/* harmony export */ Rectangle: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Rectangle),\n/* harmony export */ RemoveEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.RemoveEvent),\n/* harmony export */ RemovedComponent: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.RemovedComponent),\n/* harmony export */ Repeat: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.Repeat),\n/* harmony export */ RepeatForever: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.RepeatForever),\n/* harmony export */ Resolution: () => (/* reexport safe */ _Screen__WEBPACK_IMPORTED_MODULE_5__.Resolution),\n/* harmony export */ Resource: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.Resource),\n/* harmony export */ ResourceEvents: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.ResourceEvents),\n/* harmony export */ RotateBy: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.RotateBy),\n/* harmony export */ RotateByWithOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.RotateByWithOptions),\n/* harmony export */ RotateTo: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.RotateTo),\n/* harmony export */ RotateToWithOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.RotateToWithOptions),\n/* harmony export */ RotationType: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.RotationType),\n/* harmony export */ ScaleBy: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ScaleBy),\n/* harmony export */ ScaleByWithOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ScaleByWithOptions),\n/* harmony export */ ScaleTo: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ScaleTo),\n/* harmony export */ ScaleToWithOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ScaleToWithOptions),\n/* harmony export */ Scene: () => (/* reexport safe */ _Scene__WEBPACK_IMPORTED_MODULE_16__.Scene),\n/* harmony export */ SceneEvents: () => (/* reexport safe */ _Scene__WEBPACK_IMPORTED_MODULE_16__.SceneEvents),\n/* harmony export */ Screen: () => (/* reexport safe */ _Screen__WEBPACK_IMPORTED_MODULE_5__.Screen),\n/* harmony export */ ScreenAppender: () => (/* reexport safe */ _Util_Log__WEBPACK_IMPORTED_MODULE_50__.ScreenAppender),\n/* harmony export */ ScreenElement: () => (/* reexport safe */ _ScreenElement__WEBPACK_IMPORTED_MODULE_20__.ScreenElement),\n/* harmony export */ ScreenEvents: () => (/* reexport safe */ _Screen__WEBPACK_IMPORTED_MODULE_5__.ScreenEvents),\n/* harmony export */ ScreenShader: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ScreenShader),\n/* harmony export */ ScrollPreventionMode: () => (/* reexport safe */ _Engine__WEBPACK_IMPORTED_MODULE_3__.ScrollPreventionMode),\n/* harmony export */ Semaphore: () => (/* reexport safe */ _Util_Semaphore__WEBPACK_IMPORTED_MODULE_58__.Semaphore),\n/* harmony export */ SeparatingAxis: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.SeparatingAxis),\n/* harmony export */ SeparationInfo: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.SeparationInfo),\n/* harmony export */ Shader: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Shader),\n/* harmony export */ Shape: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.Shape),\n/* harmony export */ Side: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.Side),\n/* harmony export */ Slide: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.Slide),\n/* harmony export */ SolverStrategy: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.SolverStrategy),\n/* harmony export */ Sound: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.Sound),\n/* harmony export */ SoundEvents: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.SoundEvents),\n/* harmony export */ SparseHashGrid: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.SparseHashGrid),\n/* harmony export */ SparseHashGridCollisionProcessor: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.SparseHashGridCollisionProcessor),\n/* harmony export */ SpatialPartitionStrategy: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.SpatialPartitionStrategy),\n/* harmony export */ Sprite: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Sprite),\n/* harmony export */ SpriteFont: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.SpriteFont),\n/* harmony export */ SpriteSheet: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.SpriteSheet),\n/* harmony export */ StandardClock: () => (/* reexport safe */ _Util_Clock__WEBPACK_IMPORTED_MODULE_53__.StandardClock),\n/* harmony export */ StateMachine: () => (/* reexport safe */ _Util_StateMachine__WEBPACK_IMPORTED_MODULE_56__.StateMachine),\n/* harmony export */ StrategyContainer: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.StrategyContainer),\n/* harmony export */ Stream: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.Stream),\n/* harmony export */ System: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.System),\n/* harmony export */ SystemManager: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.SystemManager),\n/* harmony export */ SystemPriority: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.SystemPriority),\n/* harmony export */ SystemType: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.SystemType),\n/* harmony export */ TagQuery: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.TagQuery),\n/* harmony export */ TestClock: () => (/* reexport safe */ _Util_Clock__WEBPACK_IMPORTED_MODULE_53__.TestClock),\n/* harmony export */ Text: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Text),\n/* harmony export */ TextAlign: () => (/* reexport safe */ _Graphics_FontCommon__WEBPACK_IMPORTED_MODULE_14__.TextAlign),\n/* harmony export */ TextureLoader: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.TextureLoader),\n/* harmony export */ Tile: () => (/* reexport safe */ _TileMap_index__WEBPACK_IMPORTED_MODULE_17__.Tile),\n/* harmony export */ TileMap: () => (/* reexport safe */ _TileMap_index__WEBPACK_IMPORTED_MODULE_17__.TileMap),\n/* harmony export */ TileMapEvents: () => (/* reexport safe */ _TileMap_index__WEBPACK_IMPORTED_MODULE_17__.TileMapEvents),\n/* harmony export */ TiledAnimation: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.TiledAnimation),\n/* harmony export */ TiledSprite: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.TiledSprite),\n/* harmony export */ Timer: () => (/* reexport safe */ _Timer__WEBPACK_IMPORTED_MODULE_18__.Timer),\n/* harmony export */ Toaster: () => (/* reexport safe */ _Util_Toaster__WEBPACK_IMPORTED_MODULE_55__.Toaster),\n/* harmony export */ Transform: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.Transform),\n/* harmony export */ TransformComponent: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.TransformComponent),\n/* harmony export */ Transition: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.Transition),\n/* harmony export */ TreeNode: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.TreeNode),\n/* harmony export */ Trigger: () => (/* reexport safe */ _Trigger__WEBPACK_IMPORTED_MODULE_19__.Trigger),\n/* harmony export */ TriggerEvents: () => (/* reexport safe */ _Trigger__WEBPACK_IMPORTED_MODULE_19__.TriggerEvents),\n/* harmony export */ TwoPI: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.TwoPI),\n/* harmony export */ Util: () => (/* reexport module object */ _Util_Index__WEBPACK_IMPORTED_MODULE_44__),\n/* harmony export */ Vector: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.Vector),\n/* harmony export */ VectorView: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.VectorView),\n/* harmony export */ VertexBuffer: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.VertexBuffer),\n/* harmony export */ VertexLayout: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.VertexLayout),\n/* harmony export */ VerticalFirst: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.VerticalFirst),\n/* harmony export */ VisibleEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.VisibleEvent),\n/* harmony export */ WebAudio: () => (/* reexport safe */ _Util_WebAudio__WEBPACK_IMPORTED_MODULE_54__.WebAudio),\n/* harmony export */ WebAudioInstance: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.WebAudioInstance),\n/* harmony export */ WheelDeltaMode: () => (/* reexport safe */ _Input_WheelDeltaMode__WEBPACK_IMPORTED_MODULE_31__.WheelDeltaMode),\n/* harmony export */ WheelEvent: () => (/* reexport safe */ _Input_WheelEvent__WEBPACK_IMPORTED_MODULE_29__.WheelEvent),\n/* harmony export */ World: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.World),\n/* harmony export */ approximatelyEqual: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.approximatelyEqual),\n/* harmony export */ assert: () => (/* reexport safe */ _Util_Assert__WEBPACK_IMPORTED_MODULE_60__.assert),\n/* harmony export */ canonicalizeAngle: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.canonicalizeAngle),\n/* harmony export */ clamp: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.clamp),\n/* harmony export */ coroutine: () => (/* reexport safe */ _Util_Coroutine__WEBPACK_IMPORTED_MODULE_59__.coroutine),\n/* harmony export */ createId: () => (/* reexport safe */ _Id__WEBPACK_IMPORTED_MODULE_2__.createId),\n/* harmony export */ frac: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.frac),\n/* harmony export */ getDefaultPhysicsConfig: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.getDefaultPhysicsConfig),\n/* harmony export */ hasGraphicsTick: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.hasGraphicsTick),\n/* harmony export */ hasOnAdd: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.hasOnAdd),\n/* harmony export */ hasOnInitialize: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.hasOnInitialize),\n/* harmony export */ hasOnPostUpdate: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.hasOnPostUpdate),\n/* harmony export */ hasOnPreUpdate: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.hasOnPreUpdate),\n/* harmony export */ hasOnRemove: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.hasOnRemove),\n/* harmony export */ hasPostDraw: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.hasPostDraw),\n/* harmony export */ hasPreDraw: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.hasPreDraw),\n/* harmony export */ has_add: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.has_add),\n/* harmony export */ has_initialize: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.has_initialize),\n/* harmony export */ has_postupdate: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.has_postupdate),\n/* harmony export */ has_preupdate: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.has_preupdate),\n/* harmony export */ has_remove: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.has_remove),\n/* harmony export */ inverseLerp: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.inverseLerp),\n/* harmony export */ inverseLerpVector: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.inverseLerpVector),\n/* harmony export */ isActor: () => (/* reexport safe */ _Actor__WEBPACK_IMPORTED_MODULE_6__.isActor),\n/* harmony export */ isAddedComponent: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.isAddedComponent),\n/* harmony export */ isComponentCtor: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.isComponentCtor),\n/* harmony export */ isLoaderConstructor: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.isLoaderConstructor),\n/* harmony export */ isMoveByOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.isMoveByOptions),\n/* harmony export */ isMoveToOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.isMoveToOptions),\n/* harmony export */ isRemovedComponent: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.isRemovedComponent),\n/* harmony export */ isRotateByOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.isRotateByOptions),\n/* harmony export */ isRotateToOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.isRotateToOptions),\n/* harmony export */ isScaleByOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.isScaleByOptions),\n/* harmony export */ isScaleToOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.isScaleToOptions),\n/* harmony export */ isSceneConstructor: () => (/* reexport safe */ _Scene__WEBPACK_IMPORTED_MODULE_16__.isSceneConstructor),\n/* harmony export */ isScreenElement: () => (/* reexport safe */ _ScreenElement__WEBPACK_IMPORTED_MODULE_20__.isScreenElement),\n/* harmony export */ isSystemConstructor: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.isSystemConstructor),\n/* harmony export */ lerp: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.lerp),\n/* harmony export */ lerpAngle: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.lerpAngle),\n/* harmony export */ lerpVector: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.lerpVector),\n/* harmony export */ maxMessages: () => (/* reexport safe */ _Util_Decorators__WEBPACK_IMPORTED_MODULE_46__.maxMessages),\n/* harmony export */ nextActionId: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.nextActionId),\n/* harmony export */ obsolete: () => (/* reexport safe */ _Util_Decorators__WEBPACK_IMPORTED_MODULE_46__.obsolete),\n/* harmony export */ parseImageFiltering: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.parseImageFiltering),\n/* harmony export */ parseImageWrapping: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.parseImageWrapping),\n/* harmony export */ pixelSnapEpsilon: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.pixelSnapEpsilon),\n/* harmony export */ randomInRange: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.randomInRange),\n/* harmony export */ randomIntInRange: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.randomIntInRange),\n/* harmony export */ range: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.range),\n/* harmony export */ remap: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.remap),\n/* harmony export */ remapVector: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.remapVector),\n/* harmony export */ resetObsoleteCounter: () => (/* reexport safe */ _Util_Decorators__WEBPACK_IMPORTED_MODULE_46__.resetObsoleteCounter),\n/* harmony export */ sign: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.sign),\n/* harmony export */ toDegrees: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.toDegrees),\n/* harmony export */ toRadians: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.toRadians),\n/* harmony export */ vec: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.vec),\n/* harmony export */ webgl: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.webgl)\n/* harmony export */ });\n/* harmony import */ var _Polyfill__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Polyfill */ \"./Polyfill.ts\");\n/* harmony import */ var _Flags__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Flags */ \"./Flags.ts\");\n/* harmony import */ var _Id__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Id */ \"./Id.ts\");\n/* harmony import */ var _Engine__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Engine */ \"./Engine.ts\");\n/* harmony import */ var _GarbageCollector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./GarbageCollector */ \"./GarbageCollector.ts\");\n/* harmony import */ var _Screen__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Screen */ \"./Screen.ts\");\n/* harmony import */ var _Actor__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Actor */ \"./Actor.ts\");\n/* harmony import */ var _Math_index__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Math/index */ \"./Math/index.ts\");\n/* harmony import */ var _Camera__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Camera */ \"./Camera.ts\");\n/* harmony import */ var _Debug_index__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Debug/index */ \"./Debug/index.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Events/MediaEvents */ \"./Events/MediaEvents.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Events */ \"./Events.ts\");\n/* harmony import */ var _Label__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Label */ \"./Label.ts\");\n/* harmony import */ var _Graphics_FontCommon__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Graphics/FontCommon */ \"./Graphics/FontCommon.ts\");\n/* harmony import */ var _Particles_index__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Particles/index */ \"./Particles/index.ts\");\n/* harmony import */ var _Scene__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Scene */ \"./Scene.ts\");\n/* harmony import */ var _TileMap_index__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./TileMap/index */ \"./TileMap/index.ts\");\n/* harmony import */ var _Timer__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Timer */ \"./Timer.ts\");\n/* harmony import */ var _Trigger__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./Trigger */ \"./Trigger.ts\");\n/* harmony import */ var _ScreenElement__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./ScreenElement */ \"./ScreenElement.ts\");\n/* harmony import */ var _Actions_index__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./Actions/index */ \"./Actions/index.ts\");\n/* harmony import */ var _Collision_Index__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./Collision/Index */ \"./Collision/Index.ts\");\n/* harmony import */ var _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./Interfaces/Index */ \"./Interfaces/Index.ts\");\n/* harmony import */ var _Resources_Index__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./Resources/Index */ \"./Resources/Index.ts\");\n/* harmony import */ var _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./EntityComponentSystem/index */ \"./EntityComponentSystem/index.ts\");\n/* harmony import */ var _Director_index__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./Director/index */ \"./Director/index.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./Color */ \"./Color.ts\");\n/* harmony import */ var _Graphics_index__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./Graphics/index */ \"./Graphics/index.ts\");\n/* harmony import */ var _Input_WheelEvent__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./Input/WheelEvent */ \"./Input/WheelEvent.ts\");\n/* harmony import */ var _Input_PointerEvent__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./Input/PointerEvent */ \"./Input/PointerEvent.ts\");\n/* harmony import */ var _Input_WheelDeltaMode__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./Input/WheelDeltaMode */ \"./Input/WheelDeltaMode.ts\");\n/* harmony import */ var _Input_PointerButton__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./Input/PointerButton */ \"./Input/PointerButton.ts\");\n/* harmony import */ var _Input_NativePointerButton__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./Input/NativePointerButton */ \"./Input/NativePointerButton.ts\");\n/* harmony import */ var _Input_PointerEventReceiver__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./Input/PointerEventReceiver */ \"./Input/PointerEventReceiver.ts\");\n/* harmony import */ var _Input_PointerAbstraction__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./Input/PointerAbstraction */ \"./Input/PointerAbstraction.ts\");\n/* harmony import */ var _Input_PointerComponent__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./Input/PointerComponent */ \"./Input/PointerComponent.ts\");\n/* harmony import */ var _Input_PointerSystem__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./Input/PointerSystem */ \"./Input/PointerSystem.ts\");\n/* harmony import */ var _Input_PointerType__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./Input/PointerType */ \"./Input/PointerType.ts\");\n/* harmony import */ var _Input_PointerScope__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./Input/PointerScope */ \"./Input/PointerScope.ts\");\n/* harmony import */ var _Input_Gamepad__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./Input/Gamepad */ \"./Input/Gamepad.ts\");\n/* harmony import */ var _Input_Keyboard__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ./Input/Keyboard */ \"./Input/Keyboard.ts\");\n/* harmony import */ var _Input_InputHost__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ./Input/InputHost */ \"./Input/InputHost.ts\");\n/* harmony import */ var _Input_InputMapper__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ./Input/InputMapper */ \"./Input/InputMapper.ts\");\n/* harmony import */ var _Util_Index__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! ./Util/Index */ \"./Util/Index.ts\");\n/* harmony import */ var _Util_Browser__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! ./Util/Browser */ \"./Util/Browser.ts\");\n/* harmony import */ var _Util_Decorators__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! ./Util/Decorators */ \"./Util/Decorators.ts\");\n/* harmony import */ var _Util_Detector__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! ./Util/Detector */ \"./Util/Detector.ts\");\n/* harmony import */ var _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! ./Util/EasingFunctions */ \"./Util/EasingFunctions.ts\");\n/* harmony import */ var _Util_Observable__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(/*! ./Util/Observable */ \"./Util/Observable.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(/*! ./Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Util_Pool__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(/*! ./Util/Pool */ \"./Util/Pool.ts\");\n/* harmony import */ var _Util_Fps__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(/*! ./Util/Fps */ \"./Util/Fps.ts\");\n/* harmony import */ var _Util_Clock__WEBPACK_IMPORTED_MODULE_53__ = __webpack_require__(/*! ./Util/Clock */ \"./Util/Clock.ts\");\n/* harmony import */ var _Util_WebAudio__WEBPACK_IMPORTED_MODULE_54__ = __webpack_require__(/*! ./Util/WebAudio */ \"./Util/WebAudio.ts\");\n/* harmony import */ var _Util_Toaster__WEBPACK_IMPORTED_MODULE_55__ = __webpack_require__(/*! ./Util/Toaster */ \"./Util/Toaster.ts\");\n/* harmony import */ var _Util_StateMachine__WEBPACK_IMPORTED_MODULE_56__ = __webpack_require__(/*! ./Util/StateMachine */ \"./Util/StateMachine.ts\");\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_57__ = __webpack_require__(/*! ./Util/Future */ \"./Util/Future.ts\");\n/* harmony import */ var _Util_Semaphore__WEBPACK_IMPORTED_MODULE_58__ = __webpack_require__(/*! ./Util/Semaphore */ \"./Util/Semaphore.ts\");\n/* harmony import */ var _Util_Coroutine__WEBPACK_IMPORTED_MODULE_59__ = __webpack_require__(/*! ./Util/Coroutine */ \"./Util/Coroutine.ts\");\n/* harmony import */ var _Util_Assert__WEBPACK_IMPORTED_MODULE_60__ = __webpack_require__(/*! ./Util/Assert */ \"./Util/Assert.ts\");\n/**\n * The current Excalibur version string\n * @description `process.env.__EX_VERSION` gets replaced by Webpack on build\n */\nconst EX_VERSION = \"0.30.1\";\n\n(0,_Polyfill__WEBPACK_IMPORTED_MODULE_0__.polyfill)();\n// This file is used as the bundle entry point and exports everything\n// that will be exposed as the `ex` global variable.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// ex.Events namespace\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// ex.Util namespaces\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// ex.Deprecated\n// import * as deprecated from './Deprecated';\n// export { deprecated as Deprecated };\n// export * from './Deprecated';\n\n\n/***/ }),\n\n/***/ \"./Director/Loader.logo.png\":\n/*!**********************************!*\\\n !*** ./Director/Loader.logo.png ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAdQAAAB2CAYAAABxhGI9AAAACXBIWXMAAAsSAAALEgHS3X78AAAKnUlEQVR42u3dP2wjSx0H8N8hJIonIRmJjsq0SBR+BQ1dcqKhe0lD77SvSwpKkJKGPulpktfRIMUdEqKIqV57rpAokM4dbSiyq7ONPTP7x39ifz7SFbnEnp3xer47O7uzH15fXwMA6OYHmgAABCoACFQAEKgAgEAFAIEKAAIVAAQqACBQAUCgAoBABQCBCgAIVAAQqAAgUAFAoAIAAhUABCoACFQAEKgAgECFLbmOiNeFf2PbAyz68Pr6qhUgbRwR92v+/zwiJrYHMEKFMmcN///UtgcQqFBk1PD/97U9Qx8VCFSgu4EmAIEKAAIVAAQqACBQ4Z25jojP8eX+0WtNAgIVaOY+Im5j+eKh24h41jQgUIEyZ7F5NaPU7wCBCiwYd/w9cOB+qAlgJ3KLLow0EV198803RWvJfvfddx+0lhEqHKu5JgAjVCBvlhmFzjQRXUekHz9+TP79y8uLRjNChXfvoePvAYEKxNtj1e42/O5JoIJABcrdRMRVLM+X3kTEpaaB988cKuzWg9EobTWdMx0Oly8uN4dqhAoARqgnaN3arHfqu7OyH8ItKLVB/P+CEfMTHyGPY3npx1m8zWGDEeoBfUk/xdti57dr/r1Wv2+6EPow3tZ5rRdS72s1neuF97xvWd+XTH0/V+UMttDWqbI/r2nrxfp+jv2uSjSO7S+OXy/A/3lN+9xX5T5HxEUPZZ0tfB71+w57eJ/HFu+z+jkv1u92YX9fbI/HhX3JA9rp5MPr66tWaG9UfUGbrHIzi7cLUyYFf/tpTady03EEeL8mUJ6i7MKYNvWNqr4Pe2jradXO60LrvPAz2PQ5RPX684ah8dxD+2zantnCgVipSVV+m/tgB9W2DDq2Sx/vM95wcHhZhWVJm8yrv58cSgfTdc70+++/X/r522+/tUKSEepBqo+om4ZLPerMjUwuNnQCtx1GWJtee1FwdD5uWd86xLs8UaVt2aNEO1/saZ/Z5rYMW4zq6v34rGV9Bg3q2eZ9SkeNm9qwyUh30OPIHYFKx5FG03C7znSOqYBq+qW/zpQ3anH037TNHluG6f0WPsPhHvab4QFty7ogOeuxDYcNy2/zu2214WNYWxmBurNO8bGn97pNBOO8xy/9uCorZZ4I2r4C7aJgO7ZV9iE49Dm6NvOWx+pWE9CUq3zbdTp9doz38TbXtzqH9RT5CyWe422OaZoZGeZCabrhPQY9HjwsjpTvCg4YtlE2+Ta/j2bzn8fqrDqgm+6yUHOmAvWUjAtGhbNYvsBknDnqH1Qhc7VmxHgeb/NbudA5j/UXlYwif2p6luhAc9teu1npiHKnDs8if6tCm7JLX3NKpgttXe9ruc9mHMd7a83iwdxF5vt8tutARaCeklRnNK9C8WnNF7geJQ4T4XG3JhSnVdilQrG+yOnrlVHfsEGYzhNBn7Lu6tS7+HJafJQ4EMiNlNqWXZ9WPvVgnVYHG5M1ByDXkT6leX2EgTqJtyt45yv7S2qO3sEZjZhDLXeR+YKdJ0Zdk8QocvH9N732KrNtq+FZ/zzIHABcJrYpd+Xv14lOd5ap76SgrduW/VTQ1qcQpqnbgu4ifZvUMNpd9XuoZmvCtPaQ2Y/BCHVLgbrJTeRPDdVf6pfMKDU2fOkHmVFFfXr3MsouLsnNvV5kRoe5+s431PeuoKPqWnaurY/ZPBEeqwceN4l96iwO6H7Mjq4y7VGPVNe10VaZMzVCPVWpI/Z6FZbcv5fMqGCU+dLfFGzj58jP8+bCdJCo7yzKTwdOF0bu9Ug7V4c+yz7FJfYeGoysUss0HssIdVZwYLDujMqlESoCdTtGsZtbHnJBeNdDSJSs0jTKdMJN1HNX54Wv7bvsU9NkVJVa13dX+/wuArV0X/l5RHyo/lnfF4G6p6DrS0kHdtXhy35TGErDPYZUn2WfWqDOo/lVqdMD2O/hKJhD7S/odukymq9s02QN4EEPR/zbaOumZc+r15zK1Zqznl9jsfiemTM1QmV3HUuTkedlg9HIQzRbUD93dfC+2tpj2fIHEH2+RqCCQH13gZq7hWXTNpVu19OB1fc9nQ0AKOKUb5lU0P1kDyOneoWk0lOZ9cIP0x7qu8+2BhCoR2wYu1+e7DmaXzBSsu5vaX1ne2zrpmUPTmxf7PM1Dm4y/vC7ny7Nif7+z/9ZmtM0Z3panPLtPmra9f16bcK0Dpbnwk43Vd/RHtu6zfNQTy1QBy3aqG2g9nVmxml+BOoJyT3NpWmn9xhfFnu4bvDa+44BXhqqfdf3uUF9+yz77AT31Yue2mjecYQ62NLfgkA9ghHqLNEhNem4H1c6vdyDxhf/bpz5m4coW/c39wi6VH2bPtHlcaV9cvXts+zxCe6rTeqc2ndL7uGd93QwM9bFcAzMoZZ7SgTBbWx+asui61h/iq1+RmjqdbnQXQ3T1DNQ63V/U9ucqm/pMzPb1rePsk/1iTOjgvatR4W3Lc8ULB78pELyrnAfeTcj1NU509/86mfJ33/8+Mf00a05UyPUEw7UVCeWG/WNEiExyHRMt5ltW30izUPk18ytt7lNfc8i//DvtvXto+ySA5BjljsLUF8lPkqMPEtW1JomDsiGBZ9Byb4NAvUITSN9GuwsIj6t6UTOqk7jJREkmzqli8xIs96udSO20sX0H1vW92IL9e1a9rgqVyf91gbPsTy9UD9n9lOkT8k+RfkFR5PMNqxOcdSf32PBvg3vilO+zdxE+okx9Wm0ph36XYsRZCpMF993GOk5qvqB3Dct6jvssb67KvuUNJ3frw92bhr8/STSF0JdRPMLpUCgnsgo9S76PZ246ZFk1wWvK5m3vVoYvW1Sz7nN91jfXbQ1ZQc7TW6HeaoOalypG/8/p/rP1aNAc6ZHzSnfdqPUPhdy2PQw6Nz9gSVhuhiqueUHR3uu7y7K3rdDX4u46ZrPbUa0IFBZ0seKQ3XQTRt2vm3W/a2DbNKys++rvm3ep6+y1x2UdP3bWU9lzra47U1GmlctX/sQ23t+aOlByLTh/4NAPaCRxtcdO5HLSJ/6vNtCwGx67VPmPbvWd1q9frKHtp4kAqRJ2HR9j762JfX3bZ//elPtj13PPDx1+D5tqk/Xi6NO8SHz7MmH19dXrdBNfVFP6T2PT1UHNit87/t4m5+aRH+nQBdvqyhZDKJLfZs8h7XPsqdV2ZOV+tanKB8aln0dyxdAXbV4j4gvt4oMOrbP6vbU73NW7TMlbdTnPrWpfqXfh9HKZ9vke7KuTeZRNtXRSe6+1FV//ce/ln5eXfsXgcqXzr6+9261M3moOoa7E6nvTZTfy7iNsmfb7kjfgXGsvxe0vihsEts9HTquPpt1q1vtahu2TqAiUAEEKj0zhwoARqgAu/OnX/442WH+9xc/Wvr58re/Tr7f41/+ZsRqhAoACFQAEKgAcHjMoQJskJsz/eqrr5Z+vvr7v5fmQFevAl5lztQIFQAQqAAgUAHgIJlDBdhgdQ41N2eKESoAIFABQKACwFEwhwoARqgAIFABQKACAAIVAAQqAAhUABCoAIBABQCBCgACFQAEKgAgUAFAoAKAQAUAgQoACFQAEKgAIFABQKACAAIVAAQqAAhUABCoAIBABQCBCgACFQAQqAAgUAFAoAKAQAUAlvwPcFDns1DsH4sAAAAASUVORK5CYII=\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/debug-font.png\":\n/*!*****************************************!*\\\n !*** ./Graphics/Context/debug-font.png ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAABACAYAAAD1Xam+AAAAAXNSR0IArs4c6QAABlFJREFUeJztndmy4yoMRcWt/v9fdr8EWoDAaDD4JntVpeqcxBrMIGQDNhEAAAAAAAAAAAAAAOCrSbMfr+u6yoEpTY+906GV57YtPkjyXj9WZZ+wHWHfo2N3/bU6Tte9Rv6ptruqRyMvKvvIX/zY3I/vjLeqsg6l/CWdp0KHKO/1Y1H2EdsR9j06Ntdfp+N03SvkH2u7i3pu5XkQ+DNTkgNJSok+/183xpcdWZHjgUzpQ2pGD67vaf//KRAGAq3tdhCy2tcMQKPyXyz7iPqrdBjbX5h9g7xbtvWf4ZJvM4D/BKG24Sd+IkQ0TC9aW5NM5FbO2HgrPVzW2vmN50DZNv/QWtl5bfPy85SBtdy9dFmjsf2F2SehTBVE+u+tkE5+lAGcJlFwGuodwRRU2Qe3rx0FhPNflc3HWC7BEh8EDGVR5IMCiLnDONtPp87qhxVH/S/LvzUAuDs/kyGimA5oSONKR1w8vsLpv+v+S9vhmS71JRiX1xB5CWZNw7m6rMrllMag/RJyWb67BEgpDVMWSydc+K47pr35w05kWd7ReEq6116KaG4CsbJ7OmV9PdZLEKkONiC1/7ZONVgDsajLIJPYp2OUAXRpnPcGmnIE6eSK4nv5YQqqSYO52JqnYfYj/PdQXQIY7XszuMofMgZRT/1LdeC5h2I5/0EdWDMY2Yb05WDE1RodVdpSA5r85slArAVnSf+89iP896St0f5bZKVA7Gk/3ja8q+152/+wrLqBWZTem3IBADbRBoDuHgAA4HdAAADgh0EAAOCHQQAA4IdBAADgh0EAAOCHuVsKbJ3P9M7jjuxHzGfv8j9iDt47Dx7hP8cjq5F/o/0T62Aer//ZOgDrajBp6aNlOWTEajKLjgj/Pcs/vfZD/a++3Pc8hNfZ966EVeh5vP75luDRJUAl0KzJfnopaqbaTuzZiulc2BS5lltFXntu3dcQsXadl59Wn1H+dfYNtrt2d6D/LDF9HkCQw6eXFbr8P9X5W/un5Ol8gz1t39p5pWOPn0vLynbgdnfe8maEQw+UIPJdfxdOd/4oTtVD0IYg8wDywGas0I04T5O3P8/qf2UWwPpkn1PbOT1bN2tFe59EM7TvKf+TRFw+erZ2ey4hpS3hp9qBkqq/tjsSU1OYqucBWB1yynt5QxC42Mdk30pAEIio//zRG3feBzLUX+TTjCKwlH83aI/KbpQBVEHgUGF0j/SitcLofHem8q6AyH0wBhFv4WszuOjy0yK2vc/oRWQoP2X9ve78jfaLnpncbBqQSC6s0HnIRT0a2yNZjfxT8+ir8t+yDsDTWaS6X70GP33+d77stp+I5HtBdwEAAPBl8ECApcAA/DBvfSowAGAB7/05ZAAA/DAIAADMMU3fOuS2ggAAwBjrorKoxWiPBxHMAgAg490Ts0VeePdA+ZfJDKcCh7sBqY88mmjklZeOt9iXPrvx2I2QPRnN2/qzyJ84h4gNcbtfasq5mM1rZr+bBWh2A+bIIX13Z9wqL+nQvFno7v3oq4tJItCed7isUT6C/I7BUn9KP95wDicYBYpcjncrO2c/dmW4tBtw4RiRld1IDxDyYsoXMHxF1w3dyz0Nne8033AOFsT6VgRCafl89fenTZUfbm8CGhrgdDcS7anAsvnkkP0IeCfQ+JzYunky6jhNYj5bl7++4fJvN9WDSKS/292A0wyANyKDI91bfkm3kcH7ckaP/SKW/VHKRZAcI14pP3beu0fPyn/DuZQbWMogNnsc16sziE96f7H/iai7uTf0/3N8lwFz/e13T00Djt4OrInCnkeChXT+qOcKOLA21tJpsv/G8/COnGnw97J9QwbTvd6djYSv7fxEVTuV/LzNhj7nOawv6bfbAGCYEpQ6HxFtuxs6sq9tzOYHobQ6Nje+6vo5BwFrPZ4OgMayS4PPt1NlzdLfbRCYBoBc+NaO4JWPwLEf33oN3unY3InKPQBW6Z7nEZzEmrl4iZjC804lqgePPEOguQcwWghUphxm343wyt/pWpWR0OrR+jvyxavHajfb9pTjbt9bH07Z5/expM4TLWfwb7QQqMoC+UDWXZo/4RgA38LOgUvLJAAQ1Td9y9//0ylxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+g79apuVUsS5ZmwAAAABJRU5ErkJggg==\");\n\n/***/ })\n\n/******/ });\n/************************************************************************/\n/******/ // The module cache\n/******/ var __webpack_module_cache__ = {};\n/******/ \n/******/ // The require function\n/******/ function __webpack_require__(moduleId) {\n/******/ \t// Check if module is in cache\n/******/ \tvar cachedModule = __webpack_module_cache__[moduleId];\n/******/ \tif (cachedModule !== undefined) {\n/******/ \t\treturn cachedModule.exports;\n/******/ \t}\n/******/ \t// Create a new module (and put it into the cache)\n/******/ \tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\tid: moduleId,\n/******/ \t\t// no module.loaded needed\n/******/ \t\texports: {}\n/******/ \t};\n/******/ \n/******/ \t// Execute the module function\n/******/ \t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/ \n/******/ \t// Return the exports of the module\n/******/ \treturn module.exports;\n/******/ }\n/******/ \n/************************************************************************/\n/******/ /* webpack/runtime/compat get default export */\n/******/ (() => {\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = (module) => {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t() => (module['default']) :\n/******/ \t\t\t() => (module);\n/******/ \t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\treturn getter;\n/******/ \t};\n/******/ })();\n/******/ \n/******/ /* webpack/runtime/define property getters */\n/******/ (() => {\n/******/ \t// define getter functions for harmony exports\n/******/ \t__webpack_require__.d = (exports, definition) => {\n/******/ \t\tfor(var key in definition) {\n/******/ \t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t}\n/******/ \t\t}\n/******/ \t};\n/******/ })();\n/******/ \n/******/ /* webpack/runtime/hasOwnProperty shorthand */\n/******/ (() => {\n/******/ \t__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))\n/******/ })();\n/******/ \n/******/ /* webpack/runtime/make namespace object */\n/******/ (() => {\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = (exports) => {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/ })();\n/******/ \n/************************************************************************/\n/******/ \n/******/ // startup\n/******/ // Load entry module and return exports\n/******/ // This entry module is referenced by other modules so it can't be inlined\n/******/ var __webpack_exports__ = __webpack_require__(\"./index.ts\");\n/******/ var __webpack_exports__ActionCompleteEvent = __webpack_exports__.ActionCompleteEvent;\n/******/ var __webpack_exports__ActionContext = __webpack_exports__.ActionContext;\n/******/ var __webpack_exports__ActionQueue = __webpack_exports__.ActionQueue;\n/******/ var __webpack_exports__ActionSequence = __webpack_exports__.ActionSequence;\n/******/ var __webpack_exports__ActionStartEvent = __webpack_exports__.ActionStartEvent;\n/******/ var __webpack_exports__ActionsComponent = __webpack_exports__.ActionsComponent;\n/******/ var __webpack_exports__ActionsSystem = __webpack_exports__.ActionsSystem;\n/******/ var __webpack_exports__ActivateEvent = __webpack_exports__.ActivateEvent;\n/******/ var __webpack_exports__Actor = __webpack_exports__.Actor;\n/******/ var __webpack_exports__ActorEvents = __webpack_exports__.ActorEvents;\n/******/ var __webpack_exports__AddEvent = __webpack_exports__.AddEvent;\n/******/ var __webpack_exports__AddedComponent = __webpack_exports__.AddedComponent;\n/******/ var __webpack_exports__AffineMatrix = __webpack_exports__.AffineMatrix;\n/******/ var __webpack_exports__Animation = __webpack_exports__.Animation;\n/******/ var __webpack_exports__AnimationDirection = __webpack_exports__.AnimationDirection;\n/******/ var __webpack_exports__AnimationEvents = __webpack_exports__.AnimationEvents;\n/******/ var __webpack_exports__AnimationStrategy = __webpack_exports__.AnimationStrategy;\n/******/ var __webpack_exports__ArcadeSolver = __webpack_exports__.ArcadeSolver;\n/******/ var __webpack_exports__AudioContextFactory = __webpack_exports__.AudioContextFactory;\n/******/ var __webpack_exports__Axes = __webpack_exports__.Axes;\n/******/ var __webpack_exports__Axis = __webpack_exports__.Axis;\n/******/ var __webpack_exports__BaseAlign = __webpack_exports__.BaseAlign;\n/******/ var __webpack_exports__BezierCurve = __webpack_exports__.BezierCurve;\n/******/ var __webpack_exports__Blink = __webpack_exports__.Blink;\n/******/ var __webpack_exports__BodyComponent = __webpack_exports__.BodyComponent;\n/******/ var __webpack_exports__BoundingBox = __webpack_exports__.BoundingBox;\n/******/ var __webpack_exports__BrowserComponent = __webpack_exports__.BrowserComponent;\n/******/ var __webpack_exports__BrowserEvents = __webpack_exports__.BrowserEvents;\n/******/ var __webpack_exports__Buttons = __webpack_exports__.Buttons;\n/******/ var __webpack_exports__Camera = __webpack_exports__.Camera;\n/******/ var __webpack_exports__CameraEvents = __webpack_exports__.CameraEvents;\n/******/ var __webpack_exports__Canvas = __webpack_exports__.Canvas;\n/******/ var __webpack_exports__Circle = __webpack_exports__.Circle;\n/******/ var __webpack_exports__CircleCollider = __webpack_exports__.CircleCollider;\n/******/ var __webpack_exports__Clock = __webpack_exports__.Clock;\n/******/ var __webpack_exports__ClosestLineJumpTable = __webpack_exports__.ClosestLineJumpTable;\n/******/ var __webpack_exports__Collider = __webpack_exports__.Collider;\n/******/ var __webpack_exports__ColliderComponent = __webpack_exports__.ColliderComponent;\n/******/ var __webpack_exports__CollisionContact = __webpack_exports__.CollisionContact;\n/******/ var __webpack_exports__CollisionEndEvent = __webpack_exports__.CollisionEndEvent;\n/******/ var __webpack_exports__CollisionGroup = __webpack_exports__.CollisionGroup;\n/******/ var __webpack_exports__CollisionGroupManager = __webpack_exports__.CollisionGroupManager;\n/******/ var __webpack_exports__CollisionJumpTable = __webpack_exports__.CollisionJumpTable;\n/******/ var __webpack_exports__CollisionPostSolveEvent = __webpack_exports__.CollisionPostSolveEvent;\n/******/ var __webpack_exports__CollisionPreSolveEvent = __webpack_exports__.CollisionPreSolveEvent;\n/******/ var __webpack_exports__CollisionStartEvent = __webpack_exports__.CollisionStartEvent;\n/******/ var __webpack_exports__CollisionSystem = __webpack_exports__.CollisionSystem;\n/******/ var __webpack_exports__CollisionType = __webpack_exports__.CollisionType;\n/******/ var __webpack_exports__Color = __webpack_exports__.Color;\n/******/ var __webpack_exports__ColorBlindFlags = __webpack_exports__.ColorBlindFlags;\n/******/ var __webpack_exports__ColorBlindnessMode = __webpack_exports__.ColorBlindnessMode;\n/******/ var __webpack_exports__ColorBlindnessPostProcessor = __webpack_exports__.ColorBlindnessPostProcessor;\n/******/ var __webpack_exports__Component = __webpack_exports__.Component;\n/******/ var __webpack_exports__CompositeCollider = __webpack_exports__.CompositeCollider;\n/******/ var __webpack_exports__ConsoleAppender = __webpack_exports__.ConsoleAppender;\n/******/ var __webpack_exports__ContactConstraintPoint = __webpack_exports__.ContactConstraintPoint;\n/******/ var __webpack_exports__ContactEndEvent = __webpack_exports__.ContactEndEvent;\n/******/ var __webpack_exports__ContactSolveBias = __webpack_exports__.ContactSolveBias;\n/******/ var __webpack_exports__ContactStartEvent = __webpack_exports__.ContactStartEvent;\n/******/ var __webpack_exports__CoordPlane = __webpack_exports__.CoordPlane;\n/******/ var __webpack_exports__CrossFade = __webpack_exports__.CrossFade;\n/******/ var __webpack_exports__CurveBy = __webpack_exports__.CurveBy;\n/******/ var __webpack_exports__CurveTo = __webpack_exports__.CurveTo;\n/******/ var __webpack_exports__DeactivateEvent = __webpack_exports__.DeactivateEvent;\n/******/ var __webpack_exports__Debug = __webpack_exports__.Debug;\n/******/ var __webpack_exports__DebugConfig = __webpack_exports__.DebugConfig;\n/******/ var __webpack_exports__DebugGraphicsComponent = __webpack_exports__.DebugGraphicsComponent;\n/******/ var __webpack_exports__DebugSystem = __webpack_exports__.DebugSystem;\n/******/ var __webpack_exports__DebugText = __webpack_exports__.DebugText;\n/******/ var __webpack_exports__DefaultAntialiasOptions = __webpack_exports__.DefaultAntialiasOptions;\n/******/ var __webpack_exports__DefaultGarbageCollectionOptions = __webpack_exports__.DefaultGarbageCollectionOptions;\n/******/ var __webpack_exports__DefaultLoader = __webpack_exports__.DefaultLoader;\n/******/ var __webpack_exports__DefaultPixelArtOptions = __webpack_exports__.DefaultPixelArtOptions;\n/******/ var __webpack_exports__DegreeOfFreedom = __webpack_exports__.DegreeOfFreedom;\n/******/ var __webpack_exports__Delay = __webpack_exports__.Delay;\n/******/ var __webpack_exports__Detector = __webpack_exports__.Detector;\n/******/ var __webpack_exports__Die = __webpack_exports__.Die;\n/******/ var __webpack_exports__Direction = __webpack_exports__.Direction;\n/******/ var __webpack_exports__Director = __webpack_exports__.Director;\n/******/ var __webpack_exports__DirectorEvents = __webpack_exports__.DirectorEvents;\n/******/ var __webpack_exports__DisplayMode = __webpack_exports__.DisplayMode;\n/******/ var __webpack_exports__DynamicTree = __webpack_exports__.DynamicTree;\n/******/ var __webpack_exports__DynamicTreeCollisionProcessor = __webpack_exports__.DynamicTreeCollisionProcessor;\n/******/ var __webpack_exports__EX_VERSION = __webpack_exports__.EX_VERSION;\n/******/ var __webpack_exports__EaseBy = __webpack_exports__.EaseBy;\n/******/ var __webpack_exports__EaseTo = __webpack_exports__.EaseTo;\n/******/ var __webpack_exports__EasingFunctions = __webpack_exports__.EasingFunctions;\n/******/ var __webpack_exports__EdgeCollider = __webpack_exports__.EdgeCollider;\n/******/ var __webpack_exports__ElasticToActorStrategy = __webpack_exports__.ElasticToActorStrategy;\n/******/ var __webpack_exports__EmitterType = __webpack_exports__.EmitterType;\n/******/ var __webpack_exports__Engine = __webpack_exports__.Engine;\n/******/ var __webpack_exports__EngineEvents = __webpack_exports__.EngineEvents;\n/******/ var __webpack_exports__EnterTriggerEvent = __webpack_exports__.EnterTriggerEvent;\n/******/ var __webpack_exports__EnterViewPortEvent = __webpack_exports__.EnterViewPortEvent;\n/******/ var __webpack_exports__Entity = __webpack_exports__.Entity;\n/******/ var __webpack_exports__EntityEvents = __webpack_exports__.EntityEvents;\n/******/ var __webpack_exports__EntityManager = __webpack_exports__.EntityManager;\n/******/ var __webpack_exports__EventEmitter = __webpack_exports__.EventEmitter;\n/******/ var __webpack_exports__EventTypes = __webpack_exports__.EventTypes;\n/******/ var __webpack_exports__Events = __webpack_exports__.Events;\n/******/ var __webpack_exports__ExResponse = __webpack_exports__.ExResponse;\n/******/ var __webpack_exports__ExcaliburGraphicsContext2DCanvas = __webpack_exports__.ExcaliburGraphicsContext2DCanvas;\n/******/ var __webpack_exports__ExcaliburGraphicsContextWebGL = __webpack_exports__.ExcaliburGraphicsContextWebGL;\n/******/ var __webpack_exports__ExitTriggerEvent = __webpack_exports__.ExitTriggerEvent;\n/******/ var __webpack_exports__ExitViewPortEvent = __webpack_exports__.ExitViewPortEvent;\n/******/ var __webpack_exports__Fade = __webpack_exports__.Fade;\n/******/ var __webpack_exports__FadeInOut = __webpack_exports__.FadeInOut;\n/******/ var __webpack_exports__Flags = __webpack_exports__.Flags;\n/******/ var __webpack_exports__Flash = __webpack_exports__.Flash;\n/******/ var __webpack_exports__Follow = __webpack_exports__.Follow;\n/******/ var __webpack_exports__Font = __webpack_exports__.Font;\n/******/ var __webpack_exports__FontCache = __webpack_exports__.FontCache;\n/******/ var __webpack_exports__FontSource = __webpack_exports__.FontSource;\n/******/ var __webpack_exports__FontStyle = __webpack_exports__.FontStyle;\n/******/ var __webpack_exports__FontUnit = __webpack_exports__.FontUnit;\n/******/ var __webpack_exports__FpsSampler = __webpack_exports__.FpsSampler;\n/******/ var __webpack_exports__FrameStats = __webpack_exports__.FrameStats;\n/******/ var __webpack_exports__Future = __webpack_exports__.Future;\n/******/ var __webpack_exports__GameEvent = __webpack_exports__.GameEvent;\n/******/ var __webpack_exports__GameStartEvent = __webpack_exports__.GameStartEvent;\n/******/ var __webpack_exports__GameStopEvent = __webpack_exports__.GameStopEvent;\n/******/ var __webpack_exports__Gamepad = __webpack_exports__.Gamepad;\n/******/ var __webpack_exports__GamepadAxisEvent = __webpack_exports__.GamepadAxisEvent;\n/******/ var __webpack_exports__GamepadButtonEvent = __webpack_exports__.GamepadButtonEvent;\n/******/ var __webpack_exports__GamepadConnectEvent = __webpack_exports__.GamepadConnectEvent;\n/******/ var __webpack_exports__GamepadDisconnectEvent = __webpack_exports__.GamepadDisconnectEvent;\n/******/ var __webpack_exports__Gamepads = __webpack_exports__.Gamepads;\n/******/ var __webpack_exports__GarbageCollector = __webpack_exports__.GarbageCollector;\n/******/ var __webpack_exports__Gif = __webpack_exports__.Gif;\n/******/ var __webpack_exports__GifParser = __webpack_exports__.GifParser;\n/******/ var __webpack_exports__GlobalCoordinates = __webpack_exports__.GlobalCoordinates;\n/******/ var __webpack_exports__GpuParticleEmitter = __webpack_exports__.GpuParticleEmitter;\n/******/ var __webpack_exports__GpuParticleRenderer = __webpack_exports__.GpuParticleRenderer;\n/******/ var __webpack_exports__Graphic = __webpack_exports__.Graphic;\n/******/ var __webpack_exports__GraphicsComponent = __webpack_exports__.GraphicsComponent;\n/******/ var __webpack_exports__GraphicsGroup = __webpack_exports__.GraphicsGroup;\n/******/ var __webpack_exports__GraphicsSystem = __webpack_exports__.GraphicsSystem;\n/******/ var __webpack_exports__HashColliderProxy = __webpack_exports__.HashColliderProxy;\n/******/ var __webpack_exports__HashGridCell = __webpack_exports__.HashGridCell;\n/******/ var __webpack_exports__HashGridProxy = __webpack_exports__.HashGridProxy;\n/******/ var __webpack_exports__HiddenEvent = __webpack_exports__.HiddenEvent;\n/******/ var __webpack_exports__HorizontalFirst = __webpack_exports__.HorizontalFirst;\n/******/ var __webpack_exports__ImageFiltering = __webpack_exports__.ImageFiltering;\n/******/ var __webpack_exports__ImageSource = __webpack_exports__.ImageSource;\n/******/ var __webpack_exports__ImageSourceAttributeConstants = __webpack_exports__.ImageSourceAttributeConstants;\n/******/ var __webpack_exports__ImageWrapping = __webpack_exports__.ImageWrapping;\n/******/ var __webpack_exports__InitializeEvent = __webpack_exports__.InitializeEvent;\n/******/ var __webpack_exports__InputHost = __webpack_exports__.InputHost;\n/******/ var __webpack_exports__InputMapper = __webpack_exports__.InputMapper;\n/******/ var __webpack_exports__IsometricEntityComponent = __webpack_exports__.IsometricEntityComponent;\n/******/ var __webpack_exports__IsometricEntitySystem = __webpack_exports__.IsometricEntitySystem;\n/******/ var __webpack_exports__IsometricMap = __webpack_exports__.IsometricMap;\n/******/ var __webpack_exports__IsometricTile = __webpack_exports__.IsometricTile;\n/******/ var __webpack_exports__KeyEvent = __webpack_exports__.KeyEvent;\n/******/ var __webpack_exports__Keyboard = __webpack_exports__.Keyboard;\n/******/ var __webpack_exports__Keys = __webpack_exports__.Keys;\n/******/ var __webpack_exports__KillEvent = __webpack_exports__.KillEvent;\n/******/ var __webpack_exports__Label = __webpack_exports__.Label;\n/******/ var __webpack_exports__LimitCameraBoundsStrategy = __webpack_exports__.LimitCameraBoundsStrategy;\n/******/ var __webpack_exports__Line = __webpack_exports__.Line;\n/******/ var __webpack_exports__LineSegment = __webpack_exports__.LineSegment;\n/******/ var __webpack_exports__Loader = __webpack_exports__.Loader;\n/******/ var __webpack_exports__LoaderEvents = __webpack_exports__.LoaderEvents;\n/******/ var __webpack_exports__LockCameraToActorAxisStrategy = __webpack_exports__.LockCameraToActorAxisStrategy;\n/******/ var __webpack_exports__LockCameraToActorStrategy = __webpack_exports__.LockCameraToActorStrategy;\n/******/ var __webpack_exports__LogLevel = __webpack_exports__.LogLevel;\n/******/ var __webpack_exports__Logger = __webpack_exports__.Logger;\n/******/ var __webpack_exports__Material = __webpack_exports__.Material;\n/******/ var __webpack_exports__Matrix = __webpack_exports__.Matrix;\n/******/ var __webpack_exports__MatrixLocations = __webpack_exports__.MatrixLocations;\n/******/ var __webpack_exports__MediaEvent = __webpack_exports__.MediaEvent;\n/******/ var __webpack_exports__Meet = __webpack_exports__.Meet;\n/******/ var __webpack_exports__MotionComponent = __webpack_exports__.MotionComponent;\n/******/ var __webpack_exports__MotionSystem = __webpack_exports__.MotionSystem;\n/******/ var __webpack_exports__MoveBy = __webpack_exports__.MoveBy;\n/******/ var __webpack_exports__MoveByWithOptions = __webpack_exports__.MoveByWithOptions;\n/******/ var __webpack_exports__MoveTo = __webpack_exports__.MoveTo;\n/******/ var __webpack_exports__MoveToWithOptions = __webpack_exports__.MoveToWithOptions;\n/******/ var __webpack_exports__NativePointerButton = __webpack_exports__.NativePointerButton;\n/******/ var __webpack_exports__NativeSoundEvent = __webpack_exports__.NativeSoundEvent;\n/******/ var __webpack_exports__NativeSoundProcessedEvent = __webpack_exports__.NativeSoundProcessedEvent;\n/******/ var __webpack_exports__NineSlice = __webpack_exports__.NineSlice;\n/******/ var __webpack_exports__NineSliceStretch = __webpack_exports__.NineSliceStretch;\n/******/ var __webpack_exports__None = __webpack_exports__.None;\n/******/ var __webpack_exports__Observable = __webpack_exports__.Observable;\n/******/ var __webpack_exports__OffscreenSystem = __webpack_exports__.OffscreenSystem;\n/******/ var __webpack_exports__Pair = __webpack_exports__.Pair;\n/******/ var __webpack_exports__ParallaxComponent = __webpack_exports__.ParallaxComponent;\n/******/ var __webpack_exports__ParallelActions = __webpack_exports__.ParallelActions;\n/******/ var __webpack_exports__Particle = __webpack_exports__.Particle;\n/******/ var __webpack_exports__ParticleEmitter = __webpack_exports__.ParticleEmitter;\n/******/ var __webpack_exports__ParticleRenderer = __webpack_exports__.ParticleRenderer;\n/******/ var __webpack_exports__ParticleTransform = __webpack_exports__.ParticleTransform;\n/******/ var __webpack_exports__PhysicsStats = __webpack_exports__.PhysicsStats;\n/******/ var __webpack_exports__PhysicsWorld = __webpack_exports__.PhysicsWorld;\n/******/ var __webpack_exports__PointerAbstraction = __webpack_exports__.PointerAbstraction;\n/******/ var __webpack_exports__PointerButton = __webpack_exports__.PointerButton;\n/******/ var __webpack_exports__PointerComponent = __webpack_exports__.PointerComponent;\n/******/ var __webpack_exports__PointerEvent = __webpack_exports__.PointerEvent;\n/******/ var __webpack_exports__PointerEventReceiver = __webpack_exports__.PointerEventReceiver;\n/******/ var __webpack_exports__PointerScope = __webpack_exports__.PointerScope;\n/******/ var __webpack_exports__PointerSystem = __webpack_exports__.PointerSystem;\n/******/ var __webpack_exports__PointerType = __webpack_exports__.PointerType;\n/******/ var __webpack_exports__Polygon = __webpack_exports__.Polygon;\n/******/ var __webpack_exports__PolygonCollider = __webpack_exports__.PolygonCollider;\n/******/ var __webpack_exports__Pool = __webpack_exports__.Pool;\n/******/ var __webpack_exports__PostCollisionEvent = __webpack_exports__.PostCollisionEvent;\n/******/ var __webpack_exports__PostDebugDrawEvent = __webpack_exports__.PostDebugDrawEvent;\n/******/ var __webpack_exports__PostDrawEvent = __webpack_exports__.PostDrawEvent;\n/******/ var __webpack_exports__PostFrameEvent = __webpack_exports__.PostFrameEvent;\n/******/ var __webpack_exports__PostKillEvent = __webpack_exports__.PostKillEvent;\n/******/ var __webpack_exports__PostTransformDrawEvent = __webpack_exports__.PostTransformDrawEvent;\n/******/ var __webpack_exports__PostUpdateEvent = __webpack_exports__.PostUpdateEvent;\n/******/ var __webpack_exports__PreCollisionEvent = __webpack_exports__.PreCollisionEvent;\n/******/ var __webpack_exports__PreDebugDrawEvent = __webpack_exports__.PreDebugDrawEvent;\n/******/ var __webpack_exports__PreDrawEvent = __webpack_exports__.PreDrawEvent;\n/******/ var __webpack_exports__PreFrameEvent = __webpack_exports__.PreFrameEvent;\n/******/ var __webpack_exports__PreKillEvent = __webpack_exports__.PreKillEvent;\n/******/ var __webpack_exports__PreLoadEvent = __webpack_exports__.PreLoadEvent;\n/******/ var __webpack_exports__PreTransformDrawEvent = __webpack_exports__.PreTransformDrawEvent;\n/******/ var __webpack_exports__PreUpdateEvent = __webpack_exports__.PreUpdateEvent;\n/******/ var __webpack_exports__Projection = __webpack_exports__.Projection;\n/******/ var __webpack_exports__QuadIndexBuffer = __webpack_exports__.QuadIndexBuffer;\n/******/ var __webpack_exports__QuadTree = __webpack_exports__.QuadTree;\n/******/ var __webpack_exports__Query = __webpack_exports__.Query;\n/******/ var __webpack_exports__QueryManager = __webpack_exports__.QueryManager;\n/******/ var __webpack_exports__RadiusAroundActorStrategy = __webpack_exports__.RadiusAroundActorStrategy;\n/******/ var __webpack_exports__Random = __webpack_exports__.Random;\n/******/ var __webpack_exports__Raster = __webpack_exports__.Raster;\n/******/ var __webpack_exports__Ray = __webpack_exports__.Ray;\n/******/ var __webpack_exports__RealisticSolver = __webpack_exports__.RealisticSolver;\n/******/ var __webpack_exports__Rectangle = __webpack_exports__.Rectangle;\n/******/ var __webpack_exports__RemoveEvent = __webpack_exports__.RemoveEvent;\n/******/ var __webpack_exports__RemovedComponent = __webpack_exports__.RemovedComponent;\n/******/ var __webpack_exports__Repeat = __webpack_exports__.Repeat;\n/******/ var __webpack_exports__RepeatForever = __webpack_exports__.RepeatForever;\n/******/ var __webpack_exports__Resolution = __webpack_exports__.Resolution;\n/******/ var __webpack_exports__Resource = __webpack_exports__.Resource;\n/******/ var __webpack_exports__ResourceEvents = __webpack_exports__.ResourceEvents;\n/******/ var __webpack_exports__RotateBy = __webpack_exports__.RotateBy;\n/******/ var __webpack_exports__RotateByWithOptions = __webpack_exports__.RotateByWithOptions;\n/******/ var __webpack_exports__RotateTo = __webpack_exports__.RotateTo;\n/******/ var __webpack_exports__RotateToWithOptions = __webpack_exports__.RotateToWithOptions;\n/******/ var __webpack_exports__RotationType = __webpack_exports__.RotationType;\n/******/ var __webpack_exports__ScaleBy = __webpack_exports__.ScaleBy;\n/******/ var __webpack_exports__ScaleByWithOptions = __webpack_exports__.ScaleByWithOptions;\n/******/ var __webpack_exports__ScaleTo = __webpack_exports__.ScaleTo;\n/******/ var __webpack_exports__ScaleToWithOptions = __webpack_exports__.ScaleToWithOptions;\n/******/ var __webpack_exports__Scene = __webpack_exports__.Scene;\n/******/ var __webpack_exports__SceneEvents = __webpack_exports__.SceneEvents;\n/******/ var __webpack_exports__Screen = __webpack_exports__.Screen;\n/******/ var __webpack_exports__ScreenAppender = __webpack_exports__.ScreenAppender;\n/******/ var __webpack_exports__ScreenElement = __webpack_exports__.ScreenElement;\n/******/ var __webpack_exports__ScreenEvents = __webpack_exports__.ScreenEvents;\n/******/ var __webpack_exports__ScreenShader = __webpack_exports__.ScreenShader;\n/******/ var __webpack_exports__ScrollPreventionMode = __webpack_exports__.ScrollPreventionMode;\n/******/ var __webpack_exports__Semaphore = __webpack_exports__.Semaphore;\n/******/ var __webpack_exports__SeparatingAxis = __webpack_exports__.SeparatingAxis;\n/******/ var __webpack_exports__SeparationInfo = __webpack_exports__.SeparationInfo;\n/******/ var __webpack_exports__Shader = __webpack_exports__.Shader;\n/******/ var __webpack_exports__Shape = __webpack_exports__.Shape;\n/******/ var __webpack_exports__Side = __webpack_exports__.Side;\n/******/ var __webpack_exports__Slide = __webpack_exports__.Slide;\n/******/ var __webpack_exports__SolverStrategy = __webpack_exports__.SolverStrategy;\n/******/ var __webpack_exports__Sound = __webpack_exports__.Sound;\n/******/ var __webpack_exports__SoundEvents = __webpack_exports__.SoundEvents;\n/******/ var __webpack_exports__SparseHashGrid = __webpack_exports__.SparseHashGrid;\n/******/ var __webpack_exports__SparseHashGridCollisionProcessor = __webpack_exports__.SparseHashGridCollisionProcessor;\n/******/ var __webpack_exports__SpatialPartitionStrategy = __webpack_exports__.SpatialPartitionStrategy;\n/******/ var __webpack_exports__Sprite = __webpack_exports__.Sprite;\n/******/ var __webpack_exports__SpriteFont = __webpack_exports__.SpriteFont;\n/******/ var __webpack_exports__SpriteSheet = __webpack_exports__.SpriteSheet;\n/******/ var __webpack_exports__StandardClock = __webpack_exports__.StandardClock;\n/******/ var __webpack_exports__StateMachine = __webpack_exports__.StateMachine;\n/******/ var __webpack_exports__StrategyContainer = __webpack_exports__.StrategyContainer;\n/******/ var __webpack_exports__Stream = __webpack_exports__.Stream;\n/******/ var __webpack_exports__System = __webpack_exports__.System;\n/******/ var __webpack_exports__SystemManager = __webpack_exports__.SystemManager;\n/******/ var __webpack_exports__SystemPriority = __webpack_exports__.SystemPriority;\n/******/ var __webpack_exports__SystemType = __webpack_exports__.SystemType;\n/******/ var __webpack_exports__TagQuery = __webpack_exports__.TagQuery;\n/******/ var __webpack_exports__TestClock = __webpack_exports__.TestClock;\n/******/ var __webpack_exports__Text = __webpack_exports__.Text;\n/******/ var __webpack_exports__TextAlign = __webpack_exports__.TextAlign;\n/******/ var __webpack_exports__TextureLoader = __webpack_exports__.TextureLoader;\n/******/ var __webpack_exports__Tile = __webpack_exports__.Tile;\n/******/ var __webpack_exports__TileMap = __webpack_exports__.TileMap;\n/******/ var __webpack_exports__TileMapEvents = __webpack_exports__.TileMapEvents;\n/******/ var __webpack_exports__TiledAnimation = __webpack_exports__.TiledAnimation;\n/******/ var __webpack_exports__TiledSprite = __webpack_exports__.TiledSprite;\n/******/ var __webpack_exports__Timer = __webpack_exports__.Timer;\n/******/ var __webpack_exports__Toaster = __webpack_exports__.Toaster;\n/******/ var __webpack_exports__Transform = __webpack_exports__.Transform;\n/******/ var __webpack_exports__TransformComponent = __webpack_exports__.TransformComponent;\n/******/ var __webpack_exports__Transition = __webpack_exports__.Transition;\n/******/ var __webpack_exports__TreeNode = __webpack_exports__.TreeNode;\n/******/ var __webpack_exports__Trigger = __webpack_exports__.Trigger;\n/******/ var __webpack_exports__TriggerEvents = __webpack_exports__.TriggerEvents;\n/******/ var __webpack_exports__TwoPI = __webpack_exports__.TwoPI;\n/******/ var __webpack_exports__Util = __webpack_exports__.Util;\n/******/ var __webpack_exports__Vector = __webpack_exports__.Vector;\n/******/ var __webpack_exports__VectorView = __webpack_exports__.VectorView;\n/******/ var __webpack_exports__VertexBuffer = __webpack_exports__.VertexBuffer;\n/******/ var __webpack_exports__VertexLayout = __webpack_exports__.VertexLayout;\n/******/ var __webpack_exports__VerticalFirst = __webpack_exports__.VerticalFirst;\n/******/ var __webpack_exports__VisibleEvent = __webpack_exports__.VisibleEvent;\n/******/ var __webpack_exports__WebAudio = __webpack_exports__.WebAudio;\n/******/ var __webpack_exports__WebAudioInstance = __webpack_exports__.WebAudioInstance;\n/******/ var __webpack_exports__WheelDeltaMode = __webpack_exports__.WheelDeltaMode;\n/******/ var __webpack_exports__WheelEvent = __webpack_exports__.WheelEvent;\n/******/ var __webpack_exports__World = __webpack_exports__.World;\n/******/ var __webpack_exports__approximatelyEqual = __webpack_exports__.approximatelyEqual;\n/******/ var __webpack_exports__assert = __webpack_exports__.assert;\n/******/ var __webpack_exports__canonicalizeAngle = __webpack_exports__.canonicalizeAngle;\n/******/ var __webpack_exports__clamp = __webpack_exports__.clamp;\n/******/ var __webpack_exports__coroutine = __webpack_exports__.coroutine;\n/******/ var __webpack_exports__createId = __webpack_exports__.createId;\n/******/ var __webpack_exports__frac = __webpack_exports__.frac;\n/******/ var __webpack_exports__getDefaultPhysicsConfig = __webpack_exports__.getDefaultPhysicsConfig;\n/******/ var __webpack_exports__hasGraphicsTick = __webpack_exports__.hasGraphicsTick;\n/******/ var __webpack_exports__hasOnAdd = __webpack_exports__.hasOnAdd;\n/******/ var __webpack_exports__hasOnInitialize = __webpack_exports__.hasOnInitialize;\n/******/ var __webpack_exports__hasOnPostUpdate = __webpack_exports__.hasOnPostUpdate;\n/******/ var __webpack_exports__hasOnPreUpdate = __webpack_exports__.hasOnPreUpdate;\n/******/ var __webpack_exports__hasOnRemove = __webpack_exports__.hasOnRemove;\n/******/ var __webpack_exports__hasPostDraw = __webpack_exports__.hasPostDraw;\n/******/ var __webpack_exports__hasPreDraw = __webpack_exports__.hasPreDraw;\n/******/ var __webpack_exports__has_add = __webpack_exports__.has_add;\n/******/ var __webpack_exports__has_initialize = __webpack_exports__.has_initialize;\n/******/ var __webpack_exports__has_postupdate = __webpack_exports__.has_postupdate;\n/******/ var __webpack_exports__has_preupdate = __webpack_exports__.has_preupdate;\n/******/ var __webpack_exports__has_remove = __webpack_exports__.has_remove;\n/******/ var __webpack_exports__inverseLerp = __webpack_exports__.inverseLerp;\n/******/ var __webpack_exports__inverseLerpVector = __webpack_exports__.inverseLerpVector;\n/******/ var __webpack_exports__isActor = __webpack_exports__.isActor;\n/******/ var __webpack_exports__isAddedComponent = __webpack_exports__.isAddedComponent;\n/******/ var __webpack_exports__isComponentCtor = __webpack_exports__.isComponentCtor;\n/******/ var __webpack_exports__isLoaderConstructor = __webpack_exports__.isLoaderConstructor;\n/******/ var __webpack_exports__isMoveByOptions = __webpack_exports__.isMoveByOptions;\n/******/ var __webpack_exports__isMoveToOptions = __webpack_exports__.isMoveToOptions;\n/******/ var __webpack_exports__isRemovedComponent = __webpack_exports__.isRemovedComponent;\n/******/ var __webpack_exports__isRotateByOptions = __webpack_exports__.isRotateByOptions;\n/******/ var __webpack_exports__isRotateToOptions = __webpack_exports__.isRotateToOptions;\n/******/ var __webpack_exports__isScaleByOptions = __webpack_exports__.isScaleByOptions;\n/******/ var __webpack_exports__isScaleToOptions = __webpack_exports__.isScaleToOptions;\n/******/ var __webpack_exports__isSceneConstructor = __webpack_exports__.isSceneConstructor;\n/******/ var __webpack_exports__isScreenElement = __webpack_exports__.isScreenElement;\n/******/ var __webpack_exports__isSystemConstructor = __webpack_exports__.isSystemConstructor;\n/******/ var __webpack_exports__lerp = __webpack_exports__.lerp;\n/******/ var __webpack_exports__lerpAngle = __webpack_exports__.lerpAngle;\n/******/ var __webpack_exports__lerpVector = __webpack_exports__.lerpVector;\n/******/ var __webpack_exports__maxMessages = __webpack_exports__.maxMessages;\n/******/ var __webpack_exports__nextActionId = __webpack_exports__.nextActionId;\n/******/ var __webpack_exports__obsolete = __webpack_exports__.obsolete;\n/******/ var __webpack_exports__parseImageFiltering = __webpack_exports__.parseImageFiltering;\n/******/ var __webpack_exports__parseImageWrapping = __webpack_exports__.parseImageWrapping;\n/******/ var __webpack_exports__pixelSnapEpsilon = __webpack_exports__.pixelSnapEpsilon;\n/******/ var __webpack_exports__randomInRange = __webpack_exports__.randomInRange;\n/******/ var __webpack_exports__randomIntInRange = __webpack_exports__.randomIntInRange;\n/******/ var __webpack_exports__range = __webpack_exports__.range;\n/******/ var __webpack_exports__remap = __webpack_exports__.remap;\n/******/ var __webpack_exports__remapVector = __webpack_exports__.remapVector;\n/******/ var __webpack_exports__resetObsoleteCounter = __webpack_exports__.resetObsoleteCounter;\n/******/ var __webpack_exports__sign = __webpack_exports__.sign;\n/******/ var __webpack_exports__toDegrees = __webpack_exports__.toDegrees;\n/******/ var __webpack_exports__toRadians = __webpack_exports__.toRadians;\n/******/ var __webpack_exports__vec = __webpack_exports__.vec;\n/******/ var __webpack_exports__webgl = __webpack_exports__.webgl;\n/******/ export { __webpack_exports__ActionCompleteEvent as ActionCompleteEvent, __webpack_exports__ActionContext as ActionContext, __webpack_exports__ActionQueue as ActionQueue, __webpack_exports__ActionSequence as ActionSequence, __webpack_exports__ActionStartEvent as ActionStartEvent, __webpack_exports__ActionsComponent as ActionsComponent, __webpack_exports__ActionsSystem as ActionsSystem, __webpack_exports__ActivateEvent as ActivateEvent, __webpack_exports__Actor as Actor, __webpack_exports__ActorEvents as ActorEvents, __webpack_exports__AddEvent as AddEvent, __webpack_exports__AddedComponent as AddedComponent, __webpack_exports__AffineMatrix as AffineMatrix, __webpack_exports__Animation as Animation, __webpack_exports__AnimationDirection as AnimationDirection, __webpack_exports__AnimationEvents as AnimationEvents, __webpack_exports__AnimationStrategy as AnimationStrategy, __webpack_exports__ArcadeSolver as ArcadeSolver, __webpack_exports__AudioContextFactory as AudioContextFactory, __webpack_exports__Axes as Axes, __webpack_exports__Axis as Axis, __webpack_exports__BaseAlign as BaseAlign, __webpack_exports__BezierCurve as BezierCurve, __webpack_exports__Blink as Blink, __webpack_exports__BodyComponent as BodyComponent, __webpack_exports__BoundingBox as BoundingBox, __webpack_exports__BrowserComponent as BrowserComponent, __webpack_exports__BrowserEvents as BrowserEvents, __webpack_exports__Buttons as Buttons, __webpack_exports__Camera as Camera, __webpack_exports__CameraEvents as CameraEvents, __webpack_exports__Canvas as Canvas, __webpack_exports__Circle as Circle, __webpack_exports__CircleCollider as CircleCollider, __webpack_exports__Clock as Clock, __webpack_exports__ClosestLineJumpTable as ClosestLineJumpTable, __webpack_exports__Collider as Collider, __webpack_exports__ColliderComponent as ColliderComponent, __webpack_exports__CollisionContact as CollisionContact, __webpack_exports__CollisionEndEvent as CollisionEndEvent, __webpack_exports__CollisionGroup as CollisionGroup, __webpack_exports__CollisionGroupManager as CollisionGroupManager, __webpack_exports__CollisionJumpTable as CollisionJumpTable, __webpack_exports__CollisionPostSolveEvent as CollisionPostSolveEvent, __webpack_exports__CollisionPreSolveEvent as CollisionPreSolveEvent, __webpack_exports__CollisionStartEvent as CollisionStartEvent, __webpack_exports__CollisionSystem as CollisionSystem, __webpack_exports__CollisionType as CollisionType, __webpack_exports__Color as Color, __webpack_exports__ColorBlindFlags as ColorBlindFlags, __webpack_exports__ColorBlindnessMode as ColorBlindnessMode, __webpack_exports__ColorBlindnessPostProcessor as ColorBlindnessPostProcessor, __webpack_exports__Component as Component, __webpack_exports__CompositeCollider as CompositeCollider, __webpack_exports__ConsoleAppender as ConsoleAppender, __webpack_exports__ContactConstraintPoint as ContactConstraintPoint, __webpack_exports__ContactEndEvent as ContactEndEvent, __webpack_exports__ContactSolveBias as ContactSolveBias, __webpack_exports__ContactStartEvent as ContactStartEvent, __webpack_exports__CoordPlane as CoordPlane, __webpack_exports__CrossFade as CrossFade, __webpack_exports__CurveBy as CurveBy, __webpack_exports__CurveTo as CurveTo, __webpack_exports__DeactivateEvent as DeactivateEvent, __webpack_exports__Debug as Debug, __webpack_exports__DebugConfig as DebugConfig, __webpack_exports__DebugGraphicsComponent as DebugGraphicsComponent, __webpack_exports__DebugSystem as DebugSystem, __webpack_exports__DebugText as DebugText, __webpack_exports__DefaultAntialiasOptions as DefaultAntialiasOptions, __webpack_exports__DefaultGarbageCollectionOptions as DefaultGarbageCollectionOptions, __webpack_exports__DefaultLoader as DefaultLoader, __webpack_exports__DefaultPixelArtOptions as DefaultPixelArtOptions, __webpack_exports__DegreeOfFreedom as DegreeOfFreedom, __webpack_exports__Delay as Delay, __webpack_exports__Detector as Detector, __webpack_exports__Die as Die, __webpack_exports__Direction as Direction, __webpack_exports__Director as Director, __webpack_exports__DirectorEvents as DirectorEvents, __webpack_exports__DisplayMode as DisplayMode, __webpack_exports__DynamicTree as DynamicTree, __webpack_exports__DynamicTreeCollisionProcessor as DynamicTreeCollisionProcessor, __webpack_exports__EX_VERSION as EX_VERSION, __webpack_exports__EaseBy as EaseBy, __webpack_exports__EaseTo as EaseTo, __webpack_exports__EasingFunctions as EasingFunctions, __webpack_exports__EdgeCollider as EdgeCollider, __webpack_exports__ElasticToActorStrategy as ElasticToActorStrategy, __webpack_exports__EmitterType as EmitterType, __webpack_exports__Engine as Engine, __webpack_exports__EngineEvents as EngineEvents, __webpack_exports__EnterTriggerEvent as EnterTriggerEvent, __webpack_exports__EnterViewPortEvent as EnterViewPortEvent, __webpack_exports__Entity as Entity, __webpack_exports__EntityEvents as EntityEvents, __webpack_exports__EntityManager as EntityManager, __webpack_exports__EventEmitter as EventEmitter, __webpack_exports__EventTypes as EventTypes, __webpack_exports__Events as Events, __webpack_exports__ExResponse as ExResponse, __webpack_exports__ExcaliburGraphicsContext2DCanvas as ExcaliburGraphicsContext2DCanvas, __webpack_exports__ExcaliburGraphicsContextWebGL as ExcaliburGraphicsContextWebGL, __webpack_exports__ExitTriggerEvent as ExitTriggerEvent, __webpack_exports__ExitViewPortEvent as ExitViewPortEvent, __webpack_exports__Fade as Fade, __webpack_exports__FadeInOut as FadeInOut, __webpack_exports__Flags as Flags, __webpack_exports__Flash as Flash, __webpack_exports__Follow as Follow, __webpack_exports__Font as Font, __webpack_exports__FontCache as FontCache, __webpack_exports__FontSource as FontSource, __webpack_exports__FontStyle as FontStyle, __webpack_exports__FontUnit as FontUnit, __webpack_exports__FpsSampler as FpsSampler, __webpack_exports__FrameStats as FrameStats, __webpack_exports__Future as Future, __webpack_exports__GameEvent as GameEvent, __webpack_exports__GameStartEvent as GameStartEvent, __webpack_exports__GameStopEvent as GameStopEvent, __webpack_exports__Gamepad as Gamepad, __webpack_exports__GamepadAxisEvent as GamepadAxisEvent, __webpack_exports__GamepadButtonEvent as GamepadButtonEvent, __webpack_exports__GamepadConnectEvent as GamepadConnectEvent, __webpack_exports__GamepadDisconnectEvent as GamepadDisconnectEvent, __webpack_exports__Gamepads as Gamepads, __webpack_exports__GarbageCollector as GarbageCollector, __webpack_exports__Gif as Gif, __webpack_exports__GifParser as GifParser, __webpack_exports__GlobalCoordinates as GlobalCoordinates, __webpack_exports__GpuParticleEmitter as GpuParticleEmitter, __webpack_exports__GpuParticleRenderer as GpuParticleRenderer, __webpack_exports__Graphic as Graphic, __webpack_exports__GraphicsComponent as GraphicsComponent, __webpack_exports__GraphicsGroup as GraphicsGroup, __webpack_exports__GraphicsSystem as GraphicsSystem, __webpack_exports__HashColliderProxy as HashColliderProxy, __webpack_exports__HashGridCell as HashGridCell, __webpack_exports__HashGridProxy as HashGridProxy, __webpack_exports__HiddenEvent as HiddenEvent, __webpack_exports__HorizontalFirst as HorizontalFirst, __webpack_exports__ImageFiltering as ImageFiltering, __webpack_exports__ImageSource as ImageSource, __webpack_exports__ImageSourceAttributeConstants as ImageSourceAttributeConstants, __webpack_exports__ImageWrapping as ImageWrapping, __webpack_exports__InitializeEvent as InitializeEvent, __webpack_exports__InputHost as InputHost, __webpack_exports__InputMapper as InputMapper, __webpack_exports__IsometricEntityComponent as IsometricEntityComponent, __webpack_exports__IsometricEntitySystem as IsometricEntitySystem, __webpack_exports__IsometricMap as IsometricMap, __webpack_exports__IsometricTile as IsometricTile, __webpack_exports__KeyEvent as KeyEvent, __webpack_exports__Keyboard as Keyboard, __webpack_exports__Keys as Keys, __webpack_exports__KillEvent as KillEvent, __webpack_exports__Label as Label, __webpack_exports__LimitCameraBoundsStrategy as LimitCameraBoundsStrategy, __webpack_exports__Line as Line, __webpack_exports__LineSegment as LineSegment, __webpack_exports__Loader as Loader, __webpack_exports__LoaderEvents as LoaderEvents, __webpack_exports__LockCameraToActorAxisStrategy as LockCameraToActorAxisStrategy, __webpack_exports__LockCameraToActorStrategy as LockCameraToActorStrategy, __webpack_exports__LogLevel as LogLevel, __webpack_exports__Logger as Logger, __webpack_exports__Material as Material, __webpack_exports__Matrix as Matrix, __webpack_exports__MatrixLocations as MatrixLocations, __webpack_exports__MediaEvent as MediaEvent, __webpack_exports__Meet as Meet, __webpack_exports__MotionComponent as MotionComponent, __webpack_exports__MotionSystem as MotionSystem, __webpack_exports__MoveBy as MoveBy, __webpack_exports__MoveByWithOptions as MoveByWithOptions, __webpack_exports__MoveTo as MoveTo, __webpack_exports__MoveToWithOptions as MoveToWithOptions, __webpack_exports__NativePointerButton as NativePointerButton, __webpack_exports__NativeSoundEvent as NativeSoundEvent, __webpack_exports__NativeSoundProcessedEvent as NativeSoundProcessedEvent, __webpack_exports__NineSlice as NineSlice, __webpack_exports__NineSliceStretch as NineSliceStretch, __webpack_exports__None as None, __webpack_exports__Observable as Observable, __webpack_exports__OffscreenSystem as OffscreenSystem, __webpack_exports__Pair as Pair, __webpack_exports__ParallaxComponent as ParallaxComponent, __webpack_exports__ParallelActions as ParallelActions, __webpack_exports__Particle as Particle, __webpack_exports__ParticleEmitter as ParticleEmitter, __webpack_exports__ParticleRenderer as ParticleRenderer, __webpack_exports__ParticleTransform as ParticleTransform, __webpack_exports__PhysicsStats as PhysicsStats, __webpack_exports__PhysicsWorld as PhysicsWorld, __webpack_exports__PointerAbstraction as PointerAbstraction, __webpack_exports__PointerButton as PointerButton, __webpack_exports__PointerComponent as PointerComponent, __webpack_exports__PointerEvent as PointerEvent, __webpack_exports__PointerEventReceiver as PointerEventReceiver, __webpack_exports__PointerScope as PointerScope, __webpack_exports__PointerSystem as PointerSystem, __webpack_exports__PointerType as PointerType, __webpack_exports__Polygon as Polygon, __webpack_exports__PolygonCollider as PolygonCollider, __webpack_exports__Pool as Pool, __webpack_exports__PostCollisionEvent as PostCollisionEvent, __webpack_exports__PostDebugDrawEvent as PostDebugDrawEvent, __webpack_exports__PostDrawEvent as PostDrawEvent, __webpack_exports__PostFrameEvent as PostFrameEvent, __webpack_exports__PostKillEvent as PostKillEvent, __webpack_exports__PostTransformDrawEvent as PostTransformDrawEvent, __webpack_exports__PostUpdateEvent as PostUpdateEvent, __webpack_exports__PreCollisionEvent as PreCollisionEvent, __webpack_exports__PreDebugDrawEvent as PreDebugDrawEvent, __webpack_exports__PreDrawEvent as PreDrawEvent, __webpack_exports__PreFrameEvent as PreFrameEvent, __webpack_exports__PreKillEvent as PreKillEvent, __webpack_exports__PreLoadEvent as PreLoadEvent, __webpack_exports__PreTransformDrawEvent as PreTransformDrawEvent, __webpack_exports__PreUpdateEvent as PreUpdateEvent, __webpack_exports__Projection as Projection, __webpack_exports__QuadIndexBuffer as QuadIndexBuffer, __webpack_exports__QuadTree as QuadTree, __webpack_exports__Query as Query, __webpack_exports__QueryManager as QueryManager, __webpack_exports__RadiusAroundActorStrategy as RadiusAroundActorStrategy, __webpack_exports__Random as Random, __webpack_exports__Raster as Raster, __webpack_exports__Ray as Ray, __webpack_exports__RealisticSolver as RealisticSolver, __webpack_exports__Rectangle as Rectangle, __webpack_exports__RemoveEvent as RemoveEvent, __webpack_exports__RemovedComponent as RemovedComponent, __webpack_exports__Repeat as Repeat, __webpack_exports__RepeatForever as RepeatForever, __webpack_exports__Resolution as Resolution, __webpack_exports__Resource as Resource, __webpack_exports__ResourceEvents as ResourceEvents, __webpack_exports__RotateBy as RotateBy, __webpack_exports__RotateByWithOptions as RotateByWithOptions, __webpack_exports__RotateTo as RotateTo, __webpack_exports__RotateToWithOptions as RotateToWithOptions, __webpack_exports__RotationType as RotationType, __webpack_exports__ScaleBy as ScaleBy, __webpack_exports__ScaleByWithOptions as ScaleByWithOptions, __webpack_exports__ScaleTo as ScaleTo, __webpack_exports__ScaleToWithOptions as ScaleToWithOptions, __webpack_exports__Scene as Scene, __webpack_exports__SceneEvents as SceneEvents, __webpack_exports__Screen as Screen, __webpack_exports__ScreenAppender as ScreenAppender, __webpack_exports__ScreenElement as ScreenElement, __webpack_exports__ScreenEvents as ScreenEvents, __webpack_exports__ScreenShader as ScreenShader, __webpack_exports__ScrollPreventionMode as ScrollPreventionMode, __webpack_exports__Semaphore as Semaphore, __webpack_exports__SeparatingAxis as SeparatingAxis, __webpack_exports__SeparationInfo as SeparationInfo, __webpack_exports__Shader as Shader, __webpack_exports__Shape as Shape, __webpack_exports__Side as Side, __webpack_exports__Slide as Slide, __webpack_exports__SolverStrategy as SolverStrategy, __webpack_exports__Sound as Sound, __webpack_exports__SoundEvents as SoundEvents, __webpack_exports__SparseHashGrid as SparseHashGrid, __webpack_exports__SparseHashGridCollisionProcessor as SparseHashGridCollisionProcessor, __webpack_exports__SpatialPartitionStrategy as SpatialPartitionStrategy, __webpack_exports__Sprite as Sprite, __webpack_exports__SpriteFont as SpriteFont, __webpack_exports__SpriteSheet as SpriteSheet, __webpack_exports__StandardClock as StandardClock, __webpack_exports__StateMachine as StateMachine, __webpack_exports__StrategyContainer as StrategyContainer, __webpack_exports__Stream as Stream, __webpack_exports__System as System, __webpack_exports__SystemManager as SystemManager, __webpack_exports__SystemPriority as SystemPriority, __webpack_exports__SystemType as SystemType, __webpack_exports__TagQuery as TagQuery, __webpack_exports__TestClock as TestClock, __webpack_exports__Text as Text, __webpack_exports__TextAlign as TextAlign, __webpack_exports__TextureLoader as TextureLoader, __webpack_exports__Tile as Tile, __webpack_exports__TileMap as TileMap, __webpack_exports__TileMapEvents as TileMapEvents, __webpack_exports__TiledAnimation as TiledAnimation, __webpack_exports__TiledSprite as TiledSprite, __webpack_exports__Timer as Timer, __webpack_exports__Toaster as Toaster, __webpack_exports__Transform as Transform, __webpack_exports__TransformComponent as TransformComponent, __webpack_exports__Transition as Transition, __webpack_exports__TreeNode as TreeNode, __webpack_exports__Trigger as Trigger, __webpack_exports__TriggerEvents as TriggerEvents, __webpack_exports__TwoPI as TwoPI, __webpack_exports__Util as Util, __webpack_exports__Vector as Vector, __webpack_exports__VectorView as VectorView, __webpack_exports__VertexBuffer as VertexBuffer, __webpack_exports__VertexLayout as VertexLayout, __webpack_exports__VerticalFirst as VerticalFirst, __webpack_exports__VisibleEvent as VisibleEvent, __webpack_exports__WebAudio as WebAudio, __webpack_exports__WebAudioInstance as WebAudioInstance, __webpack_exports__WheelDeltaMode as WheelDeltaMode, __webpack_exports__WheelEvent as WheelEvent, __webpack_exports__World as World, __webpack_exports__approximatelyEqual as approximatelyEqual, __webpack_exports__assert as assert, __webpack_exports__canonicalizeAngle as canonicalizeAngle, __webpack_exports__clamp as clamp, __webpack_exports__coroutine as coroutine, __webpack_exports__createId as createId, __webpack_exports__frac as frac, __webpack_exports__getDefaultPhysicsConfig as getDefaultPhysicsConfig, __webpack_exports__hasGraphicsTick as hasGraphicsTick, __webpack_exports__hasOnAdd as hasOnAdd, __webpack_exports__hasOnInitialize as hasOnInitialize, __webpack_exports__hasOnPostUpdate as hasOnPostUpdate, __webpack_exports__hasOnPreUpdate as hasOnPreUpdate, __webpack_exports__hasOnRemove as hasOnRemove, __webpack_exports__hasPostDraw as hasPostDraw, __webpack_exports__hasPreDraw as hasPreDraw, __webpack_exports__has_add as has_add, __webpack_exports__has_initialize as has_initialize, __webpack_exports__has_postupdate as has_postupdate, __webpack_exports__has_preupdate as has_preupdate, __webpack_exports__has_remove as has_remove, __webpack_exports__inverseLerp as inverseLerp, __webpack_exports__inverseLerpVector as inverseLerpVector, __webpack_exports__isActor as isActor, __webpack_exports__isAddedComponent as isAddedComponent, __webpack_exports__isComponentCtor as isComponentCtor, __webpack_exports__isLoaderConstructor as isLoaderConstructor, __webpack_exports__isMoveByOptions as isMoveByOptions, __webpack_exports__isMoveToOptions as isMoveToOptions, __webpack_exports__isRemovedComponent as isRemovedComponent, __webpack_exports__isRotateByOptions as isRotateByOptions, __webpack_exports__isRotateToOptions as isRotateToOptions, __webpack_exports__isScaleByOptions as isScaleByOptions, __webpack_exports__isScaleToOptions as isScaleToOptions, __webpack_exports__isSceneConstructor as isSceneConstructor, __webpack_exports__isScreenElement as isScreenElement, __webpack_exports__isSystemConstructor as isSystemConstructor, __webpack_exports__lerp as lerp, __webpack_exports__lerpAngle as lerpAngle, __webpack_exports__lerpVector as lerpVector, __webpack_exports__maxMessages as maxMessages, __webpack_exports__nextActionId as nextActionId, __webpack_exports__obsolete as obsolete, __webpack_exports__parseImageFiltering as parseImageFiltering, __webpack_exports__parseImageWrapping as parseImageWrapping, __webpack_exports__pixelSnapEpsilon as pixelSnapEpsilon, __webpack_exports__randomInRange as randomInRange, __webpack_exports__randomIntInRange as randomIntInRange, __webpack_exports__range as range, __webpack_exports__remap as remap, __webpack_exports__remapVector as remapVector, __webpack_exports__resetObsoleteCounter as resetObsoleteCounter, __webpack_exports__sign as sign, __webpack_exports__toDegrees as toDegrees, __webpack_exports__toRadians as toRadians, __webpack_exports__vec as vec, __webpack_exports__webgl as webgl };\n/******/ \n\n//# sourceMappingURL=excalibur.development.js.map","import { ImageFiltering, ImageSource, Loader } from \"excalibur\";\r\nimport { LdtkResource } from '@excalibur-ldtk';\r\n\r\nexport const Resources = {\r\n HeroSpriteSheetPng: new ImageSource('./Solaria Demo Pack Update 03/Solaria Demo Pack Update 03/16x16/Sprites/Hero 01.png'),\r\n LdtkResource: new LdtkResource('./spacing-padding/spacing-padding.ldtk', {\r\n useTilemapCameraStrategy: true,\r\n useMapBackgroundColor: true,\r\n }),\r\n LdtkAutoTile: new LdtkResource('./autotile/autotile.ldtk', {\r\n useMapBackgroundColor: true,\r\n }),\r\n LdtkPureAutoTile: new LdtkResource('./dsml1/dsml1.ldtk', {\r\n useMapBackgroundColor: true,\r\n })\r\n} as const;\r\n\r\n\r\nexport const loader = new Loader();\r\nfor (let resource of Object.values(Resources)) {\r\n loader.addResource(resource);\r\n}","import { Actor, Entity, Vector, vec } from \"excalibur\";\r\nimport { LdtkResource } from \"./ldtk-resource\";\r\nimport { LdtkEntityInstance, LdtkLayerInstance } from \"./types\";\r\nimport { Level } from \"./level\";\r\n\r\nexport class EntityLayer {\r\n public worldPos: Vector;\r\n public offset: Vector;\r\n public entities: Entity[] = [];\r\n public ldtkToEntity = new Map();\r\n public entityToLdtk = new Map();\r\n constructor(level: Level, public readonly ldtkLayer: LdtkLayerInstance, private resource: LdtkResource, public readonly order: number) {\r\n this.worldPos = vec(level.ldtkLevel.worldX, level.ldtkLevel.worldY);\r\n this.offset = vec(ldtkLayer.__pxTotalOffsetX, ldtkLayer.__pxTotalOffsetY);\r\n if (ldtkLayer.entityInstances) {\r\n for (let entity of ldtkLayer.entityInstances) {\r\n const entityMetadata = resource.projectMetadata.defs.entities.find(e => {\r\n return e.identifier === entity.__identifier\r\n });\r\n \r\n if (resource.factories.has(entity.__identifier)) {\r\n const factory = resource.factories.get(entity.__identifier);\r\n if (factory) {\r\n const newEntity = factory({\r\n type: entity.__identifier,\r\n worldPos: vec(entity.px[0], entity.px[1]).add(this.worldPos.add(this.offset)),\r\n entity,\r\n definition: entityMetadata,\r\n layer: this,\r\n });\r\n if (newEntity) {\r\n this.entities.push(newEntity);\r\n this.ldtkToEntity.set(entity, newEntity);\r\n this.entityToLdtk.set(newEntity, entity);\r\n }\r\n }\r\n } else {\r\n const actor = new Actor({\r\n name: entity.__identifier,\r\n pos: vec(entity.px[0], entity.px[1]).add(this.worldPos.add(this.offset)),\r\n width: entity.width,\r\n height: entity.height,\r\n anchor: vec(entityMetadata?.pivotX ?? 0, entityMetadata?.pivotY ?? 0),\r\n z: order\r\n });\r\n if (entity.__tile) {\r\n const ts = resource.tilesets.get(entity.__tile.tilesetUid);\r\n if (ts) {\r\n const tsxCoord = Math.floor(entity.__tile.x / entity.__tile.w);\r\n const tsyCoord = Math.floor(entity.__tile.y / entity.__tile.h);\r\n const sprite = ts.spritesheet.getSprite(tsxCoord, tsyCoord);\r\n if (sprite) {\r\n actor.graphics.use(sprite);\r\n }\r\n }\r\n }\r\n this.entities.push(actor);\r\n this.ldtkToEntity.set(entity, actor);\r\n this.entityToLdtk.set(actor, entity);\r\n }\r\n }\r\n }\r\n }\r\n\r\n runFactories() {\r\n for (let entity of this.ldtkLayer.entityInstances) {\r\n const factory = this.resource.factories.get(entity.__identifier);\r\n \r\n if (!factory) { continue }\r\n\r\n const entityMetadata = this.resource.projectMetadata.defs.entities.find(e => {\r\n return e.identifier === entity.__identifier\r\n });\r\n\r\n const newEntity = factory({\r\n type: entity.__identifier,\r\n worldPos: vec(entity.px[0], entity.px[1]).add(this.worldPos.add(this.offset)),\r\n entity,\r\n definition: entityMetadata,\r\n layer: this,\r\n });\r\n\r\n if (newEntity) {\r\n // remove pre-existing entity (e.g. the default actor created for the entity placement)\r\n const preExisting = this.ldtkToEntity.get(entity);\r\n if (preExisting) {\r\n const index = this.entities.indexOf(preExisting);\r\n if (index > -1) {\r\n this.entities.splice(index, 1);\r\n this.ldtkToEntity.delete(entity);\r\n this.entityToLdtk.delete(preExisting);\r\n }\r\n }\r\n \r\n this.entities.push(newEntity);\r\n this.ldtkToEntity.set(entity, newEntity);\r\n this.entityToLdtk.set(newEntity, entity);\r\n }\r\n }\r\n }\r\n\r\n\r\n getEntitiesByIdentifier(identifier: string): Entity[] {\r\n const ldtkEntities = this.getLdtkEntitiesByIdentifier(identifier);\r\n let results: Entity[] = [];\r\n for (const ldtk of ldtkEntities) {\r\n const maybeEntity = this.ldtkToEntity.get(ldtk);\r\n if (maybeEntity) {\r\n results.push(maybeEntity);\r\n }\r\n }\r\n return results;\r\n }\r\n\r\n getEntitiesByField(fieldIdentifier: string, value?: any): Entity[] {\r\n const ldtkEntities = this.getLdtkEntitiesByField(fieldIdentifier, value);\r\n let results: Entity[] = [];\r\n for (const ldtk of ldtkEntities) {\r\n const maybeEntity = this.ldtkToEntity.get(ldtk);\r\n if (maybeEntity) {\r\n results.push(maybeEntity);\r\n }\r\n }\r\n return results;\r\n }\r\n\r\n /**\r\n * Search layer for entities that match an identifier (case insensitive)\r\n * @param identifier \r\n * @returns \r\n */\r\n getLdtkEntitiesByIdentifier(identifier: string): LdtkEntityInstance[] {\r\n return this.ldtkLayer.entityInstances.filter(e => e.__identifier.toLocaleLowerCase() === identifier.toLowerCase());\r\n }\r\n\r\n /**\r\n * Search layer for entities that match a field and optionally a value (both case insensitive)\r\n * @param fieldIdentifier \r\n * @param value\r\n */\r\n getLdtkEntitiesByField(fieldIdentifier: string, value?: any): LdtkEntityInstance[] {\r\n return this.ldtkLayer.entityInstances.filter(e => {\r\n if (value !== undefined) {\r\n let normalizedValue = value;\r\n if (typeof value === 'string') {\r\n normalizedValue = value.toLocaleLowerCase();\r\n }\r\n\r\n const field = e.fieldInstances.find(f => f.__identifier.toLocaleLowerCase() === fieldIdentifier.toLocaleLowerCase());\r\n if (field) {\r\n return field.__value === normalizedValue;\r\n }\r\n return false;\r\n } else {\r\n return !!e.fieldInstances.find(f => f.__identifier.toLocaleLowerCase() === fieldIdentifier.toLocaleLowerCase());\r\n }\r\n });\r\n }\r\n}","\r\n\r\nexport type FileLoader = (path: string, contentType: 'json' | 'xml') => Promise;\r\n\r\nexport const FetchLoader: FileLoader = async (path: string, contentType: 'json' | 'xml') => {\r\n const response = await fetch(path);\r\n switch(contentType.toLowerCase()) {\r\n case 'xml': return await response.text();\r\n case 'json': return await response.json();\r\n default: return await response.text();\r\n }\r\n}","\r\nexport * from './ldtk-resource';\r\nexport * from './entity-layer';\r\nexport * from './file-loader';\r\nexport * from './intgrid-layer';\r\nexport * from './level-resource';\r\nexport * from './level';\r\nexport * from './loader-cache';\r\nexport * from './path-util';\r\nexport * from './tile-layer';\r\nexport * from './tileset';\r\nexport * from './types';","import { GraphicsComponent, TileMap, Vector, vec } from \"excalibur\";\r\nimport { LdtkLayerInstance } from \"./types\";\r\nimport { LdtkResource } from \"./ldtk-resource\";\r\nimport { Level } from \"./level\";\r\nimport { Tileset } from \"./tileset\";\r\n\r\nexport class IntGridLayer {\r\n\r\n public ldtkLayer: LdtkLayerInstance;\r\n public worldPos: Vector;\r\n public offset: Vector;\r\n public tilemap!: TileMap;\r\n public tileset?: Tileset;\r\n\r\n constructor(level: Level, ldtkLayer: LdtkLayerInstance, resource: LdtkResource, public readonly order: number) {\r\n this.worldPos = vec(level.ldtkLevel.worldX, level.ldtkLevel.worldY);\r\n this.offset = vec(ldtkLayer.__pxTotalOffsetX, ldtkLayer.__pxTotalOffsetY);\r\n this.ldtkLayer = ldtkLayer;\r\n if (ldtkLayer.intGridCsv.length || ldtkLayer.autoLayerTiles.length) {\r\n\r\n const rows = ldtkLayer.__cHei;\r\n const columns = ldtkLayer.__cWid;\r\n this.tilemap = new TileMap({\r\n name: ldtkLayer.__identifier,\r\n pos: this.worldPos.add(this.offset),\r\n tileWidth: ldtkLayer.__gridSize,\r\n tileHeight: ldtkLayer.__gridSize,\r\n rows,\r\n columns,\r\n });\r\n this.tilemap.z = order;\r\n const graphics = this.tilemap.get(GraphicsComponent);\r\n graphics.isVisible = ldtkLayer.visible;\r\n\r\n // find the intgrid metadata\r\n const layerMetadata = resource.projectMetadata.defs.layers.find(l => {\r\n return ldtkLayer.__identifier === l.identifier;\r\n });\r\n\r\n if (layerMetadata) {\r\n const solidValue = layerMetadata.intGridValues.find(val => {\r\n return val?.identifier?.toLocaleLowerCase() === 'solid';\r\n });\r\n\r\n for (let i = 0; i < ldtkLayer.intGridCsv.length; i++) {\r\n const xCoord = i % columns;\r\n const yCoord = Math.floor(i / columns);\r\n const tile = this.tilemap.getTile(xCoord, yCoord);\r\n if (solidValue && ldtkLayer.intGridCsv[i] === solidValue.value) {\r\n tile!.solid = true;\r\n }\r\n\r\n // TODO might be a mistake to treat 1 as solid if there isn't a labelled solid\r\n if (!solidValue && ldtkLayer.intGridCsv[i] === 1) {\r\n tile!.solid = true;\r\n }\r\n }\r\n\r\n if (ldtkLayer.__tilesetDefUid) {\r\n this.tileset = resource.tilesets.get(ldtkLayer.__tilesetDefUid);\r\n for (let i = 0; i < ldtkLayer.autoLayerTiles.length; i++) {\r\n const tile = ldtkLayer.autoLayerTiles[i];\r\n const xCoord = Math.floor(tile.px[0] / ldtkLayer.__gridSize);\r\n const yCoord = Math.floor(tile.px[1] / ldtkLayer.__gridSize);\r\n const exTile = this.tilemap.getTile(xCoord, yCoord);\r\n if (exTile && this.tileset) {\r\n const tsxCoord = Math.floor((tile.src[0] - (this.tileset.ldtkTileset.padding ?? 0)) / (this.tileset.ldtkTileset.tileGridSize + (this.tileset.ldtkTileset.spacing ?? 0)));\r\n const tsyCoord = Math.floor((tile.src[1] - (this.tileset.ldtkTileset.padding ?? 0)) / (this.tileset.ldtkTileset.tileGridSize + (this.tileset.ldtkTileset.spacing ?? 0)));\r\n // Bit 0 toggles x flip\r\n // Bit 1 toggles 1 flip\r\n // Examples: f=0 (no flip), f=1 (X flip only), f=2 (Y flip only), f=3 (both flips)\r\n const flipHorizontal = !!(tile.f & 0b01);\r\n const flipVertical = !!(tile.f & 0b10);\r\n let sprite = this.tileset.spritesheet.getSprite(tsxCoord, tsyCoord);\r\n if (flipHorizontal || flipVertical) {\r\n sprite = sprite.clone();\r\n sprite.flipHorizontal = flipHorizontal;\r\n sprite.flipVertical = flipVertical;\r\n }\r\n if (sprite) {\r\n exTile!.addGraphic(sprite);\r\n } else {\r\n console.error('Could not find sprite in LDtk spritesheet at', tsxCoord, tsyCoord);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}","import { TileLayer } from './tile-layer';\r\nimport { PathMap, pathRelativeToBase } from './path-util';\r\nimport { FetchLoader, FileLoader } from './file-loader';\r\nimport { LdtkEntityDefinition, LdtkEntityInstance, LdtkProjectMetadata } from './types';\r\nimport { compare } from 'compare-versions';\r\nimport { LoaderCache } from './loader-cache';\r\nimport { BoundingBox, Entity, ImageSource, Loadable, Scene, TransformComponent, Vector, vec } from 'excalibur';\r\nimport { LevelResource } from './level-resource';\r\nimport { Tileset } from './tileset';\r\nimport { Level } from './level';\r\nimport { EntityLayer } from './entity-layer';\r\nimport { IntGridLayer } from './intgrid-layer';\r\n\r\nexport interface AddToSceneOptions {\r\n /**\r\n * Optionally set the position to place the levels\r\n * \r\n * Default is vec(0, 0)\r\n */\r\n pos?: Vector;\r\n /**\r\n * Optionally add only specific levels to the scene\r\n * \r\n * Default includes all levels\r\n */\r\n levelFilter?: string[];\r\n\r\n /**\r\n * Optionally use the level world offsets, this is useful if your levels are arranged the way you want them\r\n * to appear in your game.\r\n * \r\n * Default is true\r\n */\r\n useLevelOffsets?: boolean;\r\n}\r\n\r\nexport interface FactoryProps {\r\n /**\r\n * Excalibur world position\r\n */\r\n worldPos: Vector;\r\n /**\r\n * LDtk name in UI\r\n */\r\n name?: string;\r\n /**\r\n * LDtk type in UI\r\n */\r\n type: string;\r\n /**\r\n * LDtk entity\r\n */\r\n entity: LdtkEntityInstance;\r\n /**\r\n * LDtk entity metadata\r\n */\r\n definition: LdtkEntityDefinition | undefined;\r\n /**\r\n * Layer\r\n */\r\n layer: EntityLayer;\r\n}\r\n\r\nexport interface LdtkResourceOptions {\r\n /**\r\n * Add a starting z index for the layers to use. By default the layers count up from 0.\r\n *\r\n * If you'd like to manually override a z-index on a layer use the 'zindex' custom property on a layer.\r\n */\r\n startZIndex?: number;\r\n\r\n /**\r\n * Default true. If false, only tilemap will be parsed and displayed, it's up to you to wire up any excalibur behavior.\r\n * Automatically wires excalibur to the following\r\n * * Wire up current scene camera\r\n *\r\n * Read more at excaliburjs.com!\r\n */\r\n useExcaliburWiring?: boolean;\r\n\r\n /**\r\n * Sets excalibur's background color to match the LDtk map\r\n */\r\n useMapBackgroundColor?: boolean;\r\n\r\n /**\r\n * The pathMap helps work around odd things bundlers do with static files by providing a way to redirect the original\r\n * source paths in the LDtk files to new locations.\r\n *\r\n * When the LDtk resource comes across something that matches `path`, it will use the output string instead.\r\n * \r\n * Example:\r\n * ```typescript\r\n * const newResource = new LdtkResource('./example-city.ldtk', {\r\n * pathMap: [\r\n * // If the \"path\" is included in the source path, the output will be used\r\n * { path: 'cone.png', output: '/static/assets/cone.png' },\r\n * // Regex matching with special [match] in output string that is replaced with the first match from the regex\r\n * { path: /(.*\\..*$)/, output: '/static/assets/[match]'}\r\n * ]\r\n * }\r\n * ```\r\n */\r\n pathMap?: PathMap;\r\n\r\n /**\r\n * Optionally provide a custom file loader implementation instead of using the built in ajax (fetch) loader\r\n * that takes a path and returns file data\r\n * \r\n */\r\n fileLoader?: FileLoader;\r\n\r\n /**\r\n * By default `true`, means LDtk files must pass the plugins Typed parse pass.\r\n *\r\n * If you have something that the LDtk plugin does not expect, you can set this to false and it will do it's best\r\n * to parse the LDtk source map file.\r\n */\r\n strict?: boolean;\r\n\r\n /**\r\n * Plugin will operate in headless mode and skip all graphics related\r\n * excalibur items including creating ImageSource's for LDtk items.\r\n *\r\n * Default false.\r\n */\r\n headless?: boolean;\r\n\r\n /**\r\n * Keeps the camera viewport within the bounds of the TileMap, uses the first tile layer's bounds.\r\n *\r\n * Defaults true, if false the camera will use the layer bounds to keep the camera from showing the background.\r\n */\r\n useTilemapCameraStrategy?: boolean;\r\n\r\n /**\r\n * Configure custom Actor/Entity factory functions to construct Actors/Entities\r\n * given a LDtk type name\r\n */\r\n entityIdentifierFactories?: Record Entity | undefined>;\r\n}\r\n\r\nexport class LdtkResource implements Loadable {\r\n public static supportedLdtkVersion = \"1.5.3\";\r\n public projectMetadata!: LdtkProjectMetadata;\r\n data!: LdtkProjectMetadata;\r\n\r\n\r\n public tilesets = new Map();\r\n public levels = new Map();\r\n public levelsByName = new Map();\r\n public factories = new Map Entity | undefined>();\r\n public fileLoader: FileLoader = FetchLoader;\r\n public pathMap: PathMap | undefined;\r\n\r\n private _imageLoader = new LoaderCache(ImageSource);\r\n private _levelLoader = new LoaderCache(LevelResource);\r\n\r\n\r\n public readonly startZIndex: number = 0;\r\n public readonly textQuality: number = 4;\r\n public readonly useExcaliburWiring: boolean = true;\r\n public readonly useMapBackgroundColor: boolean = false;\r\n public readonly useTilemapCameraStrategy: boolean = false;\r\n public readonly headless: boolean = false;\r\n public readonly strict: boolean = true;\r\n\r\n constructor(public readonly path: string, options?: LdtkResourceOptions) {\r\n const {\r\n useExcaliburWiring,\r\n useTilemapCameraStrategy,\r\n entityIdentifierFactories,\r\n pathMap,\r\n useMapBackgroundColor,\r\n fileLoader,\r\n strict,\r\n headless,\r\n startZIndex\r\n } = { ...options };\r\n this.strict = strict ?? this.strict;\r\n this.headless = headless ?? this.headless;\r\n this.useExcaliburWiring = useExcaliburWiring ?? this.useExcaliburWiring;\r\n this.useTilemapCameraStrategy = useTilemapCameraStrategy ?? this.useTilemapCameraStrategy;\r\n this.useMapBackgroundColor = useMapBackgroundColor ?? this.useMapBackgroundColor;\r\n this.startZIndex = startZIndex ?? this.startZIndex;\r\n this.fileLoader = fileLoader ?? this.fileLoader;\r\n this.pathMap = pathMap;\r\n for (const key in entityIdentifierFactories) {\r\n this.registerEntityIdentifierFactory(key, entityIdentifierFactories[key]);\r\n }\r\n\r\n }\r\n async load(): Promise {\r\n const data = await this.fileLoader(this.path, 'json');\r\n if (this.strict) {\r\n try {\r\n this.projectMetadata = LdtkProjectMetadata.parse(data);\r\n } catch (e) {\r\n console.error(`Could not parse LDtk map from location ${this.path}.\\nExcalibur only supports the latest version of LDtk formats as of the plugin's release.`);\r\n console.error(`Is your map file corrupted or being interpreted as the wrong type?`)\r\n throw e;\r\n }\r\n } else {\r\n this.projectMetadata = data as LdtkProjectMetadata;\r\n }\r\n\r\n if (compare(LdtkResource.supportedLdtkVersion, this.projectMetadata.jsonVersion ?? '0.0.0', \">\")) {\r\n console.warn(`The excalibur ldtk plugin officially supports ${LdtkResource.supportedLdtkVersion}+, the current map has LDtk version ${this.projectMetadata.jsonVersion}`)\r\n }\r\n\r\n // iterate through the defs\r\n // load the tilesets\r\n const imagesToLoad: Promise[] = [];\r\n for (let tileset of this.projectMetadata.defs.tilesets) {\r\n if (tileset.relPath) {\r\n const imagePath = pathRelativeToBase(this.path, tileset.relPath, this.pathMap);\r\n const image = this._imageLoader.getOrAdd(imagePath);\r\n const friendlyTileset = new Tileset({\r\n image,\r\n ldtkTileset: tileset\r\n });\r\n this.tilesets.set(tileset.uid, friendlyTileset);\r\n } else {\r\n if (tileset.identifier !== 'Internal_Icons') {\r\n console.warn(`No tileset image provided for ${tileset.identifier}`);\r\n }\r\n }\r\n }\r\n\r\n // iterate through the levels\r\n // load the level metadata\r\n for (let level of this.projectMetadata.levels) {\r\n if (level.externalRelPath) {\r\n // external levels\r\n const levelPath = pathRelativeToBase(this.path, level.externalRelPath, this.pathMap);\r\n this._levelLoader.getOrAdd(levelPath, this, {\r\n headless: this.headless,\r\n strict: this.strict,\r\n fileLoader: this.fileLoader,\r\n imageLoader: this._imageLoader,\r\n pathMap: this.pathMap\r\n });\r\n } else {\r\n // embedded levels\r\n const friendlyLevel = new Level(level, this);\r\n this.levels.set(level.uid, friendlyLevel);\r\n this.levelsByName.set(level.identifier.toLowerCase(), friendlyLevel);\r\n }\r\n }\r\n\r\n await Promise.all([this._imageLoader.load(), this._levelLoader.load()]);\r\n this._levelLoader.values().forEach(level => {\r\n this.levels.set(level.data.ldtkLevel.uid, level.data);\r\n this.levelsByName.set(level.data.ldtkLevel.identifier.toLowerCase(), level.data);\r\n });\r\n\r\n return this.data = this.projectMetadata;\r\n };\r\n\r\n isLoaded(): boolean {\r\n return !!this.data;\r\n }\r\n\r\n registerEntityIdentifierFactory(ldtkEntityIdentifier: string, factory: (props: FactoryProps) => Entity | undefined): void {\r\n this.factories.set(ldtkEntityIdentifier, factory);\r\n }\r\n\r\n registerEntityIdentifierFactories(factories: Record Entity | undefined>): void {\r\n for (const key in factories) {\r\n this.registerEntityIdentifierFactory(key, factories[key]);\r\n }\r\n }\r\n\r\n /**\r\n * Get a level by identifier\r\n * @param identifier \r\n * @returns \r\n */\r\n getLevel(identifier: string): Level | undefined {\r\n return this.levelsByName.get(identifier.toLowerCase());\r\n }\r\n\r\n /**\r\n * Get the entity layers, optionally provide a level identifier to filter to\r\n * @param levelIdentifier \r\n */\r\n getEntityLayers(levelIdentifier?: string): EntityLayer[] {\r\n let results: EntityLayer[] = [];\r\n if (levelIdentifier) {\r\n const level = this.getLevel(levelIdentifier);\r\n if (level) {\r\n for (let layer of level.layers) {\r\n if (layer instanceof EntityLayer) {\r\n results.push(layer);\r\n }\r\n }\r\n }\r\n } else {\r\n for (const level of this.levels.values()) {\r\n for (let layer of level.layers) {\r\n if (layer instanceof EntityLayer) {\r\n results.push(layer);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return results\r\n }\r\n\r\n getTileLayers(identifier?: string): TileLayer[] {\r\n let results: TileLayer[] = [];\r\n if (identifier) {\r\n const level = this.getLevel(identifier);\r\n if (level) {\r\n for (let layer of level.layers) {\r\n if (layer instanceof TileLayer) {\r\n results.push(layer);\r\n }\r\n }\r\n }\r\n } else {\r\n for (const level of this.levels.values()) {\r\n for (let layer of level.layers) {\r\n if (layer instanceof TileLayer) {\r\n results.push(layer);\r\n }\r\n }\r\n }\r\n }\r\n return results;\r\n }\r\n\r\n getIntGridLayers(identifier?: string): IntGridLayer[] {\r\n let results: IntGridLayer[] = [];\r\n if (identifier) {\r\n const level = this.getLevel(identifier);\r\n if (level) {\r\n for (let layer of level.layers) {\r\n if (layer instanceof IntGridLayer) {\r\n results.push(layer);\r\n }\r\n }\r\n }\r\n } else {\r\n for (const level of this.levels.values()) {\r\n for (let layer of level.layers) {\r\n if (layer instanceof IntGridLayer) {\r\n results.push(layer);\r\n }\r\n }\r\n }\r\n }\r\n return results;\r\n }\r\n\r\n /**\r\n * Search layer for entities that match an identifier (case insensitive)\r\n * @param identifier \r\n * @returns \r\n */\r\n getLdtkEntitiesByIdentifier(identifier: string, levels?: string[]): LdtkEntityInstance[] {\r\n let results: LdtkEntityInstance[] = [];\r\n const levelsToSearch = levels ?? Array.from(this.levels.values()).map(l => l.ldtkLevel.identifier);\r\n for (const level of levelsToSearch) {\r\n const layers = this.getEntityLayers(level);\r\n for (let layer of layers) {\r\n results = results.concat(layer.getLdtkEntitiesByIdentifier(identifier));\r\n }\r\n }\r\n return results;\r\n }\r\n\r\n /**\r\n * Search levels for ldtk entities that match a field and optionally a value (both case insensitive)\r\n * @param fieldIdentifier \r\n * @param value\r\n */\r\n getLdtkEntitiesByField(fieldIdentifier: string, value?: any, levels?: string[]): LdtkEntityInstance[] {\r\n let results: LdtkEntityInstance[] = [];\r\n const levelsToSearch = levels ?? Array.from(this.levels.values()).map(l => l.ldtkLevel.identifier);\r\n for (const level of levelsToSearch) {\r\n const layers = this.getEntityLayers(level);\r\n for (let layer of layers) {\r\n results = results.concat(layer.getLdtkEntitiesByField(fieldIdentifier, value));\r\n }\r\n }\r\n return results;\r\n }\r\n\r\n /**\r\n * Search levels for excalibur entities that match an identifier (case insensitive)\r\n * @param identifier\r\n * @param levels\r\n */\r\n getEntitiesByIdentifier(identifier: string, levels?: string[]): Entity[] {\r\n let results: Entity[] = [];\r\n const levelsToSearch = levels ?? Array.from(this.levels.values()).map(l => l.ldtkLevel.identifier);\r\n for (const level of levelsToSearch) {\r\n const layers = this.getEntityLayers(level);\r\n for (let layer of layers) {\r\n results = results.concat(layer.getEntitiesByIdentifier(identifier));\r\n }\r\n }\r\n return results;\r\n }\r\n\r\n /**\r\n * Search levels for excalibur entities that match a field and optionally a value (both case insensitive)\r\n * @param fieldIdentifier\r\n * @param value\r\n * @param levels\r\n */\r\n getEntitiesByField(fieldIdentifier: string, value?: any, levels?: string[]): Entity[] {\r\n let results: Entity[] = [];\r\n const levelsToSearch = levels ?? Array.from(this.levels.values()).map(l => l.ldtkLevel.identifier);\r\n for (const level of levelsToSearch) {\r\n const layers = this.getEntityLayers(level);\r\n for (let layer of layers) {\r\n results = results.concat(layer.getEntitiesByField(fieldIdentifier, value));\r\n }\r\n }\r\n return results;\r\n }\r\n\r\n /**\r\n * Get the level bounds given a list of level identifiers (case insensitive)\r\n * @param levels\r\n */\r\n getLevelBounds(levels?: string[]): BoundingBox {\r\n levels = levels ?? Array.from(this.levelsByName.keys());\r\n let bounds: BoundingBox | null = null;\r\n for (const level of this.levels.values()) {\r\n if (!levels.includes(level.ldtkLevel.identifier)) {\r\n continue;\r\n }\r\n const firstTileLayer = this.getTileLayers(level.ldtkLevel.identifier)[0];\r\n if (firstTileLayer) {\r\n const tileBounds = BoundingBox.fromDimension(\r\n firstTileLayer.tilemap.tileWidth * firstTileLayer.tilemap.columns,\r\n firstTileLayer.tilemap.tileHeight * firstTileLayer.tilemap.rows,\r\n Vector.Zero,\r\n firstTileLayer.tilemap.pos);\r\n if (!bounds) {\r\n bounds = tileBounds;\r\n } else {\r\n bounds = bounds.combine(tileBounds);\r\n }\r\n }\r\n }\r\n return bounds ?? new BoundingBox();\r\n }\r\n\r\n addToScene(scene: Scene, options?: AddToSceneOptions) {\r\n const { pos, useLevelOffsets } = {pos: vec(0, 0), useLevelOffsets: true, ...options};\r\n\r\n \r\n for (let [id, level] of this.levels.entries()) {\r\n if (options?.levelFilter?.length) {\r\n if (!options.levelFilter.includes(level.ldtkLevel.identifier)) {\r\n continue;\r\n }\r\n }\r\n for (let layer of level.layers) {\r\n if (layer instanceof TileLayer || layer instanceof IntGridLayer) {\r\n layer.tilemap.pos = layer.tilemap.pos.add(pos);\r\n if (!useLevelOffsets) {\r\n layer.tilemap.pos = layer.tilemap.pos.sub(layer.worldPos);\r\n }\r\n scene.add(layer.tilemap)\r\n } else {\r\n layer.runFactories()\r\n for (let entity of layer.entities) {\r\n const tx = entity.get(TransformComponent);\r\n if (tx) {\r\n tx.pos = tx.pos.add(pos);\r\n if (!useLevelOffsets) {\r\n tx.pos = tx.pos.sub(layer.worldPos);\r\n }\r\n }\r\n scene.add(entity);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if(this.useExcaliburWiring) {\r\n const camera = this.getLdtkEntitiesByField('camera', true)[0];\r\n if (camera) {\r\n scene.camera.pos = vec(camera.px[0], camera.px[0]);\r\n const zoom = camera.fieldInstances.find(f => f.__identifier.toLocaleLowerCase() === 'zoom');\r\n if (zoom) {\r\n scene.camera.zoom = +zoom.__value;\r\n }\r\n }\r\n }\r\n\r\n if (this.useTilemapCameraStrategy) {\r\n let bounds = this.getLevelBounds(options?.levelFilter);\r\n scene.camera.strategy.limitCameraBounds(bounds);\r\n }\r\n\r\n if (this.useMapBackgroundColor) {\r\n for (let [id, level] of this.levels.entries()) {\r\n if (options?.levelFilter?.length) {\r\n if (!options.levelFilter.includes(level.ldtkLevel.identifier)) {\r\n continue;\r\n }\r\n }\r\n scene.backgroundColor = level.backgroundColor;\r\n break;\r\n }\r\n }\r\n\r\n\r\n }\r\n}","import { ImageSource, Loadable } from \"excalibur\";\r\nimport { PathMap } from \"./path-util\";\r\nimport { LoaderCache } from \"./loader-cache\";\r\nimport { FetchLoader, FileLoader } from \"./file-loader\";\r\nimport { Level } from \"./level\";\r\nimport { LdtkLevel } from \"./types\";\r\nimport { LdtkResource } from \"./ldtk-resource\";\r\n\r\nexport interface LevelResourceOptions {\r\n headless?: boolean;\r\n strict?: boolean;\r\n fileLoader?: FileLoader;\r\n imageLoader?: LoaderCache;\r\n pathMap?: PathMap;\r\n}\r\n\r\n/**\r\n * Loads LDtk levels that are stored in separate files\r\n */\r\nexport class LevelResource implements Loadable {\r\n private fileLoader: FileLoader = FetchLoader;\r\n private imageLoader: LoaderCache;\r\n private pathMap?: PathMap;\r\n public readonly strict: boolean = true;\r\n public readonly headless: boolean = false;\r\n constructor(public readonly path: string, public readonly resource: LdtkResource, options?: LevelResourceOptions) {\r\n const { headless, strict, fileLoader, imageLoader, pathMap } = { ...options };\r\n this.fileLoader = fileLoader ?? this.fileLoader;\r\n this.strict = strict ?? this.strict;\r\n this.headless = headless ?? this.headless;\r\n this.imageLoader = imageLoader ?? new LoaderCache(ImageSource);\r\n this.pathMap = pathMap ?? this.pathMap;\r\n }\r\n data!: Level;\r\n async load(): Promise {\r\n const data = await this.fileLoader(this.path, 'json');\r\n let level: LdtkLevel;\r\n if (this.strict) {\r\n try {\r\n level = LdtkLevel.parse(data)\r\n } catch (e) {\r\n console.error(`Could not parse LDtk level data at ${this.path} are you sure a level is there and not corrupt?`);\r\n throw e;\r\n }\r\n } else {\r\n level = data as LdtkLevel;\r\n }\r\n return this.data = new Level(level, this.resource);\r\n }\r\n isLoaded(): boolean {\r\n return !!this.data;\r\n }\r\n\r\n}","import { Color } from \"excalibur\";\r\nimport { EntityLayer } from \"./entity-layer\";\r\nimport { IntGridLayer } from \"./intgrid-layer\";\r\nimport { LdtkResource } from \"./ldtk-resource\";\r\nimport { TileLayer } from \"./tile-layer\";\r\nimport { LdtkLevel } from \"./types\";\r\n\r\nexport class Level {\r\n\r\n public backgroundColor?: Color;\r\n public layers: (TileLayer | IntGridLayer | EntityLayer)[] = []; \r\n\r\n constructor(public ldtkLevel: LdtkLevel, public resource: LdtkResource) {\r\n if (ldtkLevel.__bgColor) {\r\n this.backgroundColor = Color.fromHex(ldtkLevel.__bgColor);\r\n }\r\n if (ldtkLevel.layerInstances) {\r\n let order = resource.startZIndex;\r\n let layers = ldtkLevel.layerInstances.slice().reverse();\r\n for (let layer of layers) {\r\n if (layer.entityInstances?.length !== 0) {\r\n this.layers.push(new EntityLayer(this, layer, resource, order));\r\n }\r\n\r\n if (layer.gridTiles?.length !== 0) {\r\n this.layers.push(new TileLayer(this, layer, resource, order));\r\n }\r\n\r\n // Includes standard IntGrid, IntGrid w/ AutoTile & AutoTile layers\r\n if (layer.intGridCsv?.length !== 0 || layer.autoLayerTiles?.length !== 0) {\r\n this.layers.push(new IntGridLayer(this, layer, resource, order));\r\n }\r\n order++;\r\n }\r\n }\r\n }\r\n}","export interface CanLoad {\r\n load(): Promise;\r\n }\r\n \r\n /**\r\n * Read through cache for loadables\r\n */\r\n export class LoaderCache {\r\n private _loaded = false;\r\n cache = new Map();\r\n \r\n constructor(public readonly type: new (...args: any[]) => T){}\r\n \r\n getOrAdd(...args: any[]): T {\r\n let resource = this.cache.get(args.join('+'));\r\n if (resource) {\r\n return resource;\r\n }\r\n \r\n resource = new this.type(...args);\r\n this.cache.set(args.join('+'), resource);\r\n return resource;\r\n }\r\n \r\n values(): T[] {\r\n if (this._loaded) {\r\n return Array.from(this.cache.values());\r\n }\r\n throw new Error(`Read through cache not yet loaded! No values to return!`);\r\n }\r\n \r\n async load() {\r\n const resources = Array.from(this.cache.entries());\r\n const results = await Promise.allSettled(resources.map(i => i[1].load()));\r\n \r\n // Check for errors loading resources\r\n let errored = 0;\r\n for (let i = 0; i < results.length; i++) {\r\n const result = results[i];\r\n if (result.status === 'rejected') {\r\n console.error(`Error loading resource at ${resources[i][0]}, is your pathMap correct? or your LDtk map corrupted?`, result.reason);\r\n errored++;\r\n }\r\n }\r\n if (errored) {\r\n throw new Error(`Error loading ${errored} resources`);\r\n }\r\n this._loaded = true;\r\n }\r\n }","\r\n\r\nexport type PathMap = { path: string | RegExp, output: string }[];\r\n\r\nexport function filenameFromPath(inputPath: string): string {\r\n const filenameExpression = /[^/\\\\&\\?]+\\.\\w{2,4}(?=([\\#\\?&].*$|$))/ig\r\n\r\n const matches = inputPath.match(filenameExpression);\r\n\r\n if (matches) {\r\n const match = matches[0];\r\n return match;\r\n }\r\n\r\n throw new Error(`Could not locate filename from path: ${inputPath}`);\r\n}\r\n\r\nexport function mapPath(inputPath: string, pathMap: PathMap): string {\r\n\r\n for (const { path, output } of pathMap) {\r\n if (typeof path === 'string') {\r\n if (inputPath.includes(path)) {\r\n return output;\r\n }\r\n } else {\r\n const match = inputPath.match(path);\r\n if (match) {\r\n return output.replace('[match]', match[0]);;\r\n }\r\n }\r\n }\r\n return inputPath;\r\n}\r\n\r\nexport function pathInMap(inputPath: string, pathMap?: PathMap): boolean {\r\n if (!pathMap) return false;\r\n for (const { path, output } of pathMap) {\r\n if (typeof path === 'string') {\r\n if (inputPath.includes(path)) {\r\n return true;\r\n }\r\n } else {\r\n const match = inputPath.match(path);\r\n if (match) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n}\r\n\r\n\r\nexport function pathRelativeToBase(basePath: string, relativeToBase: string, pathMap?: PathMap) {\r\n if (pathInMap(relativeToBase, pathMap) && pathMap) {\r\n return mapPath(relativeToBase, pathMap);\r\n }\r\n\r\n // Use absolute path if specified\r\n if (relativeToBase.indexOf('/') === 0) {\r\n return relativeToBase;\r\n }\r\n\r\n const originSplit = basePath.split('/');\r\n const relativeSplit = relativeToBase.split('/');\r\n // if origin path is a file, remove it so it's a directory\r\n if (originSplit[originSplit.length - 1].includes('.')) {\r\n originSplit.pop();\r\n }\r\n return originSplit.concat(relativeSplit).join('/');\r\n}","import { GraphicsComponent, TileMap, Vector, vec } from \"excalibur\";\r\nimport { LdtkResource } from \"./ldtk-resource\";\r\nimport { LdtkLayerInstance } from \"./types\";\r\nimport { Level } from \"./level\";\r\nimport { Tileset } from \"./tileset\";\r\n\r\n\r\nexport class TileLayer {\r\n public ldtkLayer: LdtkLayerInstance;\r\n public worldPos: Vector;\r\n public offset: Vector;\r\n public tilemap: TileMap;\r\n public tileset?: Tileset;\r\n\r\n constructor(level: Level, ldtkLayer: LdtkLayerInstance, resource: LdtkResource, public readonly order: number) {\r\n this.worldPos = vec(level.ldtkLevel.worldX, level.ldtkLevel.worldY);\r\n this.offset = vec(ldtkLayer.__pxTotalOffsetX, ldtkLayer.__pxTotalOffsetY);\r\n this.ldtkLayer = ldtkLayer;\r\n this.tilemap = new TileMap({\r\n name: ldtkLayer.__identifier,\r\n pos: this.worldPos.add(this.offset),\r\n tileWidth: ldtkLayer.__gridSize,\r\n tileHeight: ldtkLayer.__gridSize,\r\n rows: ldtkLayer.__cHei,\r\n columns: ldtkLayer.__cWid,\r\n });\r\n this.tilemap.z = order;\r\n const graphics = this.tilemap.get(GraphicsComponent);\r\n graphics.isVisible = ldtkLayer.visible;\r\n\r\n\r\n if (ldtkLayer.__tilesetDefUid) {\r\n this.tileset = resource.tilesets.get(ldtkLayer.__tilesetDefUid);\r\n for (let tile of ldtkLayer.gridTiles) {\r\n const xCoord = Math.floor(tile.px[0] / ldtkLayer.__gridSize);\r\n const yCoord = Math.floor(tile.px[1] / ldtkLayer.__gridSize);\r\n const exTile = this.tilemap.getTile(xCoord, yCoord);\r\n if (this.tileset) {\r\n const tsxCoord = Math.floor((tile.src[0] - (this.tileset.ldtkTileset.padding ?? 0)) / (this.tileset.ldtkTileset.tileGridSize + (this.tileset.ldtkTileset.spacing ?? 0)));\r\n const tsyCoord = Math.floor((tile.src[1] - (this.tileset.ldtkTileset.padding ?? 0)) / (this.tileset.ldtkTileset.tileGridSize + (this.tileset.ldtkTileset.spacing ?? 0)));\r\n // Bit 0 toggles x flip\r\n // Bit 1 toggles 1 flip\r\n // Examples: f=0 (no flip), f=1 (X flip only), f=2 (Y flip only), f=3 (both flips)\r\n const flipHorizontal = !!(tile.f & 0b01);\r\n const flipVertical = !!(tile.f & 0b10);\r\n let sprite = this.tileset.spritesheet.getSprite(tsxCoord, tsyCoord);\r\n if (flipHorizontal || flipVertical) {\r\n sprite = sprite.clone();\r\n sprite.flipHorizontal = flipHorizontal;\r\n sprite.flipVertical = flipVertical;\r\n }\r\n if (sprite) {\r\n exTile!.addGraphic(sprite);\r\n } else {\r\n console.error('Could not find sprite in LDtk spritesheet at', tsxCoord, tsyCoord);\r\n } \r\n }\r\n } \r\n } else {\r\n console.error('Could not tileset in LDtk', ldtkLayer.__tilesetDefUid, ldtkLayer.__tilesetRelPath);\r\n }\r\n\r\n }\r\n}","import { ImageSource, Sprite, SpriteSheet } from \"excalibur\";\r\nimport { LdtkTilesetDefinition } from \"./types\";\r\n\r\nexport interface TilesetOptions {\r\n image: ImageSource,\r\n ldtkTileset: LdtkTilesetDefinition\r\n}\r\n\r\nexport class Tileset {\r\n public readonly image: ImageSource;\r\n public readonly ldtkTileset: LdtkTilesetDefinition;\r\n public readonly spritesheet: SpriteSheet;\r\n constructor(options: TilesetOptions) {\r\n const {image, ldtkTileset} = options;\r\n this.image = image;\r\n this.ldtkTileset = ldtkTileset;\r\n this.spritesheet = SpriteSheet.fromImageSource({\r\n image,\r\n grid: {\r\n rows: ldtkTileset.pxHei / ldtkTileset.tileGridSize,\r\n columns: ldtkTileset.pxWid / ldtkTileset.tileGridSize,\r\n spriteHeight: ldtkTileset.tileGridSize,\r\n spriteWidth: ldtkTileset.tileGridSize\r\n },\r\n spacing: {\r\n margin: { \r\n x: ldtkTileset.spacing ?? 0,\r\n y: ldtkTileset.spacing ?? 0,\r\n },\r\n originOffset: {\r\n x: ldtkTileset.padding ?? 0,\r\n y: ldtkTileset.padding ?? 0\r\n }\r\n }\r\n });\r\n }\r\n}","import { z } from 'zod';\r\n\r\n\r\n\r\nconst LdtkTilesetRectangle = z.object({\r\n h: z.number(),\r\n tilesetUid: z.number(),\r\n w: z.number(),\r\n x: z.number(),\r\n y: z.number()\r\n});\r\nconst LdtkPixel = z.tuple([z.number(), z.number()]);\r\nconst LdtkFieldInstance = z.object({\r\n __identifier: z.string(),\r\n __tile: LdtkTilesetRectangle.nullable(),\r\n __type: z.string(),//z.union([z.literal('Int'), z.literal('Float'), z.literal('String'), z.literal('Bool'), z.literal('Enum')]), // TODO this might not work with ENUM\r\n __value: z.any(),\r\n defUid: z.number()\r\n})\r\nconst LdtkTileInstance = z.object({\r\n a: z.number(),\r\n f: z.number(), // 2-bit int 0bXY flip\r\n px: LdtkPixel,\r\n src: LdtkPixel,\r\n t: z.number()\r\n});\r\n\r\nexport const LdtkEntityInstance = z.object({\r\n __grid: LdtkPixel,\r\n __identifier: z.string(),\r\n __pivot: LdtkPixel,\r\n __smartColor: z.string(),\r\n __tags: z.array(z.string()),\r\n __tile: LdtkTilesetRectangle.nullable(),\r\n __worldX: z.number().nullable(),\r\n __worldY: z.number().nullable(),\r\n defUid: z.number(),\r\n fieldInstances: z.array(LdtkFieldInstance),\r\n height: z.number(),\r\n iid: z.string(),\r\n px: LdtkPixel,\r\n width: z.number()\r\n});\r\nexport type LdtkEntityInstance = z.infer;\r\n\r\nexport const LdtkLayerInstance = z.object({\r\n __cHei: z.number(),\r\n __cWid: z.number(),\r\n __gridSize: z.number(),\r\n __identifier: z.string(),\r\n __opacity: z.number(),\r\n __pxTotalOffsetX: z.number(),\r\n __pxTotalOffsetY: z.number(),\r\n __tilesetDefUid: z.number().nullable(),\r\n __tilesetRelPath:z.string().nullable(),\r\n __type: z.union([z.literal('IntGrid'), z.literal('Entities'), z.literal('Tiles'), z.literal('AutoLayer')]),\r\n autoLayerTiles: z.array(LdtkTileInstance), // only in auto layers\r\n entityInstances: z.array(LdtkEntityInstance),// only in entity layers\r\n gridTiles: z.array(LdtkTileInstance),\r\n iid: z.string(),\r\n intGridCsv: z.array(z.number()), // __cWid x __cHei, 0 means empty, values start at 1\r\n layerDefUid: z.number(),\r\n levelId: z.number(),\r\n overrideTilesetUid: z.number().nullable(),\r\n pxOffsetX: z.number(),\r\n pxOffsetY: z.number(),\r\n visible: z.boolean()\r\n});\r\nexport type LdtkLayerInstance = z.infer;\r\n\r\nexport const LdtkLevel = z.object({\r\n __bgColor: z.string().nullable(),\r\n bgColor: z.string().nullable(),\r\n __bgPos: z.object({\r\n cropRect: z.array(z.tuple([z.number(), z.number(), z.number(), z.number()])), // cropX, cropY, cropWidth, cropHeight\r\n scale: z.tuple([z.number(), z.number()]),\r\n topLeftPx: LdtkPixel\r\n }).nullable(),\r\n __neighbours: z.array(z.object({\r\n dir: z.union([z.literal('n'), z.literal('s'), z.literal('w'), z.literal('e'), z.literal('ne'), z.literal('nw'), z.literal('se'), z.literal('sw'), z.literal('o'), z.literal('<'), z.literal('>')]),\r\n levelIid: z.string()\r\n })),\r\n bgRelPath: z.string().nullable(),\r\n externalRelPath: z.string().nullable(),\r\n fieldInstances: z.array(LdtkFieldInstance),\r\n identifier: z.string(),\r\n iid: z.string(),\r\n layerInstances: z.array(LdtkLayerInstance).nullable(), // null if the save levels separately is enabled\r\n pxHei: z.number(),\r\n pxWid: z.number(),\r\n uid: z.number(),\r\n worldDepth: z.number(),\r\n worldX: z.number(),\r\n worldY: z.number()\r\n});\r\nexport type LdtkLevel = z.infer;\r\n\r\nconst LdtkWorld = z.object({\r\n identifier: z.string(),\r\n iid: z.string(),\r\n levels: z.array(LdtkLevel),\r\n worldGridHeight:z.number(),\r\n worldGridWidth: z.number(),\r\n // TODO is this a typo Vania?\r\n worldLayout: z.union([z.literal('Free'), z.literal('GridVania'), z.literal('LinearHorizontal'), z.literal('LinearVertical')]),\r\n});\r\nexport type LdtkWorld = z.infer;\r\n\r\nconst LdtkEnumValueDefinition = z.object({\r\n color: z.number(),\r\n id: z.string(),\r\n tileRect: LdtkTilesetRectangle.nullable()\r\n});\r\n\r\nconst LdtkEnumDefinition = z.object({\r\n externalRelPath: z.string().nullable(),\r\n iconTilesetUid: z.number().nullable(),\r\n identifier: z.string(),\r\n tags: z.array(z.string()),\r\n uid: z.number(),\r\n values: z.array(LdtkEnumValueDefinition)\r\n})\r\n\r\nexport type LdtkEnumDefinition = z.infer;\r\n\r\nconst LdtkTilesetDefinition = z.object({\r\n __cHei: z.number(),\r\n __cWid: z.number(),\r\n customData: z.array(z.object({\r\n data: z.string(),\r\n tileId: z.number()\r\n })),\r\n embedAtlas: z.string().nullable(),\r\n enumTags: z.optional(z.array(z.object({\r\n enumValueId: z.string(),\r\n tileIds: z.array(z.number())\r\n }))),\r\n identifier: z.string(),\r\n padding: z.number(),\r\n pxHei: z.number(),\r\n pxWid: z.number(),\r\n relPath: z.string().nullable(),\r\n spacing: z.number(),\r\n tags: z.array(z.string()),\r\n tagsSourceEnumUid: z.number().nullable(),\r\n tileGridSize: z.number(),\r\n uid: z.number()\r\n})\r\nexport type LdtkTilesetDefinition = z.infer;\r\n\r\nexport const LdtkLayerDefinition = z.object({\r\n __type: z.union([z.literal(\"IntGrid\"), z.literal(\"Entities\"), z.literal(\"Tiles\"), z.literal(\"AutoLayer\")]),\r\n autoSourceLayerDefUid: z.number().nullable(),\r\n displayOpacity: z.number(),\r\n gridSize: z.number(),\r\n identifier: z.string(),\r\n intGridValues: z.array(z.object({\r\n color: z.string(),\r\n groupUid: z.number(),\r\n identifier: z.string().nullable(),\r\n tile: LdtkTilesetRectangle.nullable(),\r\n value: z.number()\r\n })),\r\n intGridValuesGroups: z.array(z.object({\r\n color: z.string().nullable(),\r\n identifier: z.string().nullable(),\r\n uid: z.number()\r\n })),\r\n parallaxFactorX: z.number(),\r\n parallaxFactorY: z.number(),\r\n parallaxScaling: z.boolean(),\r\n pxOffsetX: z.number(),\r\n pxOffsetY: z.number(),\r\n tilesetDefUid: z.number().nullable(),\r\n uid: z.number(),\r\n});\r\nexport type LdtkLayerDefinition = z.infer;\r\n\r\nexport const LdtkEntityDefinition = z.object({\r\n color: z.string(),\r\n height: z.number(),\r\n identifier: z.string(),\r\n nineSliceBorders: z.array(z.number()),\r\n pivotX: z.number(),\r\n pivotY: z.number(),\r\n tileRect: LdtkTilesetRectangle.nullable(),\r\n tileRenderMode: z.union([\r\n z.literal(\"Cover\"),\r\n z.literal(\"FitInside\"),\r\n z.literal(\"Repeat\"),\r\n z.literal(\"Stretch\"),\r\n z.literal(\"FullSizeCropped\"),\r\n z.literal(\"FullSizeUncropped\"),\r\n z.literal(\"NineSlice\")\r\n ]),\r\n tilesetId: z.number().nullable(),\r\n uiTileRect: LdtkTilesetRectangle.nullable(),\r\n uid: z.number(),\r\n width: z.number()\r\n});\r\nexport type LdtkEntityDefinition = z.infer;\r\n\r\nconst LdtkDefinitions = z.object({\r\n tilesets: z.array(LdtkTilesetDefinition),\r\n enums: z.array(LdtkEnumDefinition),\r\n layers: z.array(LdtkLayerDefinition),\r\n entities: z.array(LdtkEntityDefinition)\r\n})\r\nexport type LdtkDefinitions = z.infer;\r\n\r\nexport const LdtkProjectMetadata = z.object({\r\n iid: z.string(),\r\n bgColor: z.string().nullable(),\r\n defs: LdtkDefinitions,\r\n externalLevels: z.boolean(),\r\n jsonVersion: z.string(),\r\n levels: z.array(LdtkLevel),\r\n toc: z.array(z.object({\r\n identifier: z.string(),\r\n instancesData: z.array(z.object({\r\n fields: z.any(),\r\n heiPx: z.number(),\r\n iids: z.string(),\r\n widPix: z.number(),\r\n worldX: z.number(),\r\n worldY: z.number()\r\n }))\r\n })),\r\n // Moving to worlds array\r\n worldGridHeight: z.number().nullable(),\r\n worldGridWidth: z.number().nullable(),\r\n // TODO is this a LDtk docs typo Vania?\r\n worldLayout: z.union([z.literal('Free'), z.literal('GridVania'), z.literal('LinearHorizontal'), z.literal('LinearVertical')]).nullable(),\r\n worlds: z.array(LdtkWorld)\r\n});\r\nexport type LdtkProjectMetadata = z.infer;\r\n\r\n\r\n\r\n","var util;\n(function (util) {\n util.assertEqual = (val) => val;\n function assertIs(_arg) { }\n util.assertIs = assertIs;\n function assertNever(_x) {\n throw new Error();\n }\n util.assertNever = assertNever;\n util.arrayToEnum = (items) => {\n const obj = {};\n for (const item of items) {\n obj[item] = item;\n }\n return obj;\n };\n util.getValidEnumValues = (obj) => {\n const validKeys = util.objectKeys(obj).filter((k) => typeof obj[obj[k]] !== \"number\");\n const filtered = {};\n for (const k of validKeys) {\n filtered[k] = obj[k];\n }\n return util.objectValues(filtered);\n };\n util.objectValues = (obj) => {\n return util.objectKeys(obj).map(function (e) {\n return obj[e];\n });\n };\n util.objectKeys = typeof Object.keys === \"function\" // eslint-disable-line ban/ban\n ? (obj) => Object.keys(obj) // eslint-disable-line ban/ban\n : (object) => {\n const keys = [];\n for (const key in object) {\n if (Object.prototype.hasOwnProperty.call(object, key)) {\n keys.push(key);\n }\n }\n return keys;\n };\n util.find = (arr, checker) => {\n for (const item of arr) {\n if (checker(item))\n return item;\n }\n return undefined;\n };\n util.isInteger = typeof Number.isInteger === \"function\"\n ? (val) => Number.isInteger(val) // eslint-disable-line ban/ban\n : (val) => typeof val === \"number\" && isFinite(val) && Math.floor(val) === val;\n function joinValues(array, separator = \" | \") {\n return array\n .map((val) => (typeof val === \"string\" ? `'${val}'` : val))\n .join(separator);\n }\n util.joinValues = joinValues;\n util.jsonStringifyReplacer = (_, value) => {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n };\n})(util || (util = {}));\nvar objectUtil;\n(function (objectUtil) {\n objectUtil.mergeShapes = (first, second) => {\n return {\n ...first,\n ...second, // second overwrites first\n };\n };\n})(objectUtil || (objectUtil = {}));\nconst ZodParsedType = util.arrayToEnum([\n \"string\",\n \"nan\",\n \"number\",\n \"integer\",\n \"float\",\n \"boolean\",\n \"date\",\n \"bigint\",\n \"symbol\",\n \"function\",\n \"undefined\",\n \"null\",\n \"array\",\n \"object\",\n \"unknown\",\n \"promise\",\n \"void\",\n \"never\",\n \"map\",\n \"set\",\n]);\nconst getParsedType = (data) => {\n const t = typeof data;\n switch (t) {\n case \"undefined\":\n return ZodParsedType.undefined;\n case \"string\":\n return ZodParsedType.string;\n case \"number\":\n return isNaN(data) ? ZodParsedType.nan : ZodParsedType.number;\n case \"boolean\":\n return ZodParsedType.boolean;\n case \"function\":\n return ZodParsedType.function;\n case \"bigint\":\n return ZodParsedType.bigint;\n case \"symbol\":\n return ZodParsedType.symbol;\n case \"object\":\n if (Array.isArray(data)) {\n return ZodParsedType.array;\n }\n if (data === null) {\n return ZodParsedType.null;\n }\n if (data.then &&\n typeof data.then === \"function\" &&\n data.catch &&\n typeof data.catch === \"function\") {\n return ZodParsedType.promise;\n }\n if (typeof Map !== \"undefined\" && data instanceof Map) {\n return ZodParsedType.map;\n }\n if (typeof Set !== \"undefined\" && data instanceof Set) {\n return ZodParsedType.set;\n }\n if (typeof Date !== \"undefined\" && data instanceof Date) {\n return ZodParsedType.date;\n }\n return ZodParsedType.object;\n default:\n return ZodParsedType.unknown;\n }\n};\n\nconst ZodIssueCode = util.arrayToEnum([\n \"invalid_type\",\n \"invalid_literal\",\n \"custom\",\n \"invalid_union\",\n \"invalid_union_discriminator\",\n \"invalid_enum_value\",\n \"unrecognized_keys\",\n \"invalid_arguments\",\n \"invalid_return_type\",\n \"invalid_date\",\n \"invalid_string\",\n \"too_small\",\n \"too_big\",\n \"invalid_intersection_types\",\n \"not_multiple_of\",\n \"not_finite\",\n]);\nconst quotelessJson = (obj) => {\n const json = JSON.stringify(obj, null, 2);\n return json.replace(/\"([^\"]+)\":/g, \"$1:\");\n};\nclass ZodError extends Error {\n get errors() {\n return this.issues;\n }\n constructor(issues) {\n super();\n this.issues = [];\n this.addIssue = (sub) => {\n this.issues = [...this.issues, sub];\n };\n this.addIssues = (subs = []) => {\n this.issues = [...this.issues, ...subs];\n };\n const actualProto = new.target.prototype;\n if (Object.setPrototypeOf) {\n // eslint-disable-next-line ban/ban\n Object.setPrototypeOf(this, actualProto);\n }\n else {\n this.__proto__ = actualProto;\n }\n this.name = \"ZodError\";\n this.issues = issues;\n }\n format(_mapper) {\n const mapper = _mapper ||\n function (issue) {\n return issue.message;\n };\n const fieldErrors = { _errors: [] };\n const processError = (error) => {\n for (const issue of error.issues) {\n if (issue.code === \"invalid_union\") {\n issue.unionErrors.map(processError);\n }\n else if (issue.code === \"invalid_return_type\") {\n processError(issue.returnTypeError);\n }\n else if (issue.code === \"invalid_arguments\") {\n processError(issue.argumentsError);\n }\n else if (issue.path.length === 0) {\n fieldErrors._errors.push(mapper(issue));\n }\n else {\n let curr = fieldErrors;\n let i = 0;\n while (i < issue.path.length) {\n const el = issue.path[i];\n const terminal = i === issue.path.length - 1;\n if (!terminal) {\n curr[el] = curr[el] || { _errors: [] };\n // if (typeof el === \"string\") {\n // curr[el] = curr[el] || { _errors: [] };\n // } else if (typeof el === \"number\") {\n // const errorArray: any = [];\n // errorArray._errors = [];\n // curr[el] = curr[el] || errorArray;\n // }\n }\n else {\n curr[el] = curr[el] || { _errors: [] };\n curr[el]._errors.push(mapper(issue));\n }\n curr = curr[el];\n i++;\n }\n }\n }\n };\n processError(this);\n return fieldErrors;\n }\n static assert(value) {\n if (!(value instanceof ZodError)) {\n throw new Error(`Not a ZodError: ${value}`);\n }\n }\n toString() {\n return this.message;\n }\n get message() {\n return JSON.stringify(this.issues, util.jsonStringifyReplacer, 2);\n }\n get isEmpty() {\n return this.issues.length === 0;\n }\n flatten(mapper = (issue) => issue.message) {\n const fieldErrors = {};\n const formErrors = [];\n for (const sub of this.issues) {\n if (sub.path.length > 0) {\n fieldErrors[sub.path[0]] = fieldErrors[sub.path[0]] || [];\n fieldErrors[sub.path[0]].push(mapper(sub));\n }\n else {\n formErrors.push(mapper(sub));\n }\n }\n return { formErrors, fieldErrors };\n }\n get formErrors() {\n return this.flatten();\n }\n}\nZodError.create = (issues) => {\n const error = new ZodError(issues);\n return error;\n};\n\nconst errorMap = (issue, _ctx) => {\n let message;\n switch (issue.code) {\n case ZodIssueCode.invalid_type:\n if (issue.received === ZodParsedType.undefined) {\n message = \"Required\";\n }\n else {\n message = `Expected ${issue.expected}, received ${issue.received}`;\n }\n break;\n case ZodIssueCode.invalid_literal:\n message = `Invalid literal value, expected ${JSON.stringify(issue.expected, util.jsonStringifyReplacer)}`;\n break;\n case ZodIssueCode.unrecognized_keys:\n message = `Unrecognized key(s) in object: ${util.joinValues(issue.keys, \", \")}`;\n break;\n case ZodIssueCode.invalid_union:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_union_discriminator:\n message = `Invalid discriminator value. Expected ${util.joinValues(issue.options)}`;\n break;\n case ZodIssueCode.invalid_enum_value:\n message = `Invalid enum value. Expected ${util.joinValues(issue.options)}, received '${issue.received}'`;\n break;\n case ZodIssueCode.invalid_arguments:\n message = `Invalid function arguments`;\n break;\n case ZodIssueCode.invalid_return_type:\n message = `Invalid function return type`;\n break;\n case ZodIssueCode.invalid_date:\n message = `Invalid date`;\n break;\n case ZodIssueCode.invalid_string:\n if (typeof issue.validation === \"object\") {\n if (\"includes\" in issue.validation) {\n message = `Invalid input: must include \"${issue.validation.includes}\"`;\n if (typeof issue.validation.position === \"number\") {\n message = `${message} at one or more positions greater than or equal to ${issue.validation.position}`;\n }\n }\n else if (\"startsWith\" in issue.validation) {\n message = `Invalid input: must start with \"${issue.validation.startsWith}\"`;\n }\n else if (\"endsWith\" in issue.validation) {\n message = `Invalid input: must end with \"${issue.validation.endsWith}\"`;\n }\n else {\n util.assertNever(issue.validation);\n }\n }\n else if (issue.validation !== \"regex\") {\n message = `Invalid ${issue.validation}`;\n }\n else {\n message = \"Invalid\";\n }\n break;\n case ZodIssueCode.too_small:\n if (issue.type === \"array\")\n message = `Array must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `more than`} ${issue.minimum} element(s)`;\n else if (issue.type === \"string\")\n message = `String must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `over`} ${issue.minimum} character(s)`;\n else if (issue.type === \"number\")\n message = `Number must be ${issue.exact\n ? `exactly equal to `\n : issue.inclusive\n ? `greater than or equal to `\n : `greater than `}${issue.minimum}`;\n else if (issue.type === \"date\")\n message = `Date must be ${issue.exact\n ? `exactly equal to `\n : issue.inclusive\n ? `greater than or equal to `\n : `greater than `}${new Date(Number(issue.minimum))}`;\n else\n message = \"Invalid input\";\n break;\n case ZodIssueCode.too_big:\n if (issue.type === \"array\")\n message = `Array must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `less than`} ${issue.maximum} element(s)`;\n else if (issue.type === \"string\")\n message = `String must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `under`} ${issue.maximum} character(s)`;\n else if (issue.type === \"number\")\n message = `Number must be ${issue.exact\n ? `exactly`\n : issue.inclusive\n ? `less than or equal to`\n : `less than`} ${issue.maximum}`;\n else if (issue.type === \"bigint\")\n message = `BigInt must be ${issue.exact\n ? `exactly`\n : issue.inclusive\n ? `less than or equal to`\n : `less than`} ${issue.maximum}`;\n else if (issue.type === \"date\")\n message = `Date must be ${issue.exact\n ? `exactly`\n : issue.inclusive\n ? `smaller than or equal to`\n : `smaller than`} ${new Date(Number(issue.maximum))}`;\n else\n message = \"Invalid input\";\n break;\n case ZodIssueCode.custom:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_intersection_types:\n message = `Intersection results could not be merged`;\n break;\n case ZodIssueCode.not_multiple_of:\n message = `Number must be a multiple of ${issue.multipleOf}`;\n break;\n case ZodIssueCode.not_finite:\n message = \"Number must be finite\";\n break;\n default:\n message = _ctx.defaultError;\n util.assertNever(issue);\n }\n return { message };\n};\n\nlet overrideErrorMap = errorMap;\nfunction setErrorMap(map) {\n overrideErrorMap = map;\n}\nfunction getErrorMap() {\n return overrideErrorMap;\n}\n\nconst makeIssue = (params) => {\n const { data, path, errorMaps, issueData } = params;\n const fullPath = [...path, ...(issueData.path || [])];\n const fullIssue = {\n ...issueData,\n path: fullPath,\n };\n if (issueData.message !== undefined) {\n return {\n ...issueData,\n path: fullPath,\n message: issueData.message,\n };\n }\n let errorMessage = \"\";\n const maps = errorMaps\n .filter((m) => !!m)\n .slice()\n .reverse();\n for (const map of maps) {\n errorMessage = map(fullIssue, { data, defaultError: errorMessage }).message;\n }\n return {\n ...issueData,\n path: fullPath,\n message: errorMessage,\n };\n};\nconst EMPTY_PATH = [];\nfunction addIssueToContext(ctx, issueData) {\n const overrideMap = getErrorMap();\n const issue = makeIssue({\n issueData: issueData,\n data: ctx.data,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap, // contextual error map is first priority\n ctx.schemaErrorMap, // then schema-bound map if available\n overrideMap, // then global override map\n overrideMap === errorMap ? undefined : errorMap, // then global default map\n ].filter((x) => !!x),\n });\n ctx.common.issues.push(issue);\n}\nclass ParseStatus {\n constructor() {\n this.value = \"valid\";\n }\n dirty() {\n if (this.value === \"valid\")\n this.value = \"dirty\";\n }\n abort() {\n if (this.value !== \"aborted\")\n this.value = \"aborted\";\n }\n static mergeArray(status, results) {\n const arrayValue = [];\n for (const s of results) {\n if (s.status === \"aborted\")\n return INVALID;\n if (s.status === \"dirty\")\n status.dirty();\n arrayValue.push(s.value);\n }\n return { status: status.value, value: arrayValue };\n }\n static async mergeObjectAsync(status, pairs) {\n const syncPairs = [];\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n syncPairs.push({\n key,\n value,\n });\n }\n return ParseStatus.mergeObjectSync(status, syncPairs);\n }\n static mergeObjectSync(status, pairs) {\n const finalObject = {};\n for (const pair of pairs) {\n const { key, value } = pair;\n if (key.status === \"aborted\")\n return INVALID;\n if (value.status === \"aborted\")\n return INVALID;\n if (key.status === \"dirty\")\n status.dirty();\n if (value.status === \"dirty\")\n status.dirty();\n if (key.value !== \"__proto__\" &&\n (typeof value.value !== \"undefined\" || pair.alwaysSet)) {\n finalObject[key.value] = value.value;\n }\n }\n return { status: status.value, value: finalObject };\n }\n}\nconst INVALID = Object.freeze({\n status: \"aborted\",\n});\nconst DIRTY = (value) => ({ status: \"dirty\", value });\nconst OK = (value) => ({ status: \"valid\", value });\nconst isAborted = (x) => x.status === \"aborted\";\nconst isDirty = (x) => x.status === \"dirty\";\nconst isValid = (x) => x.status === \"valid\";\nconst isAsync = (x) => typeof Promise !== \"undefined\" && x instanceof Promise;\n\n/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n\r\nfunction __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nfunction __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\ntypeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\n\nvar errorUtil;\n(function (errorUtil) {\n errorUtil.errToObj = (message) => typeof message === \"string\" ? { message } : message || {};\n errorUtil.toString = (message) => typeof message === \"string\" ? message : message === null || message === void 0 ? void 0 : message.message;\n})(errorUtil || (errorUtil = {}));\n\nvar _ZodEnum_cache, _ZodNativeEnum_cache;\nclass ParseInputLazyPath {\n constructor(parent, value, path, key) {\n this._cachedPath = [];\n this.parent = parent;\n this.data = value;\n this._path = path;\n this._key = key;\n }\n get path() {\n if (!this._cachedPath.length) {\n if (this._key instanceof Array) {\n this._cachedPath.push(...this._path, ...this._key);\n }\n else {\n this._cachedPath.push(...this._path, this._key);\n }\n }\n return this._cachedPath;\n }\n}\nconst handleResult = (ctx, result) => {\n if (isValid(result)) {\n return { success: true, data: result.value };\n }\n else {\n if (!ctx.common.issues.length) {\n throw new Error(\"Validation failed but no issues detected.\");\n }\n return {\n success: false,\n get error() {\n if (this._error)\n return this._error;\n const error = new ZodError(ctx.common.issues);\n this._error = error;\n return this._error;\n },\n };\n }\n};\nfunction processCreateParams(params) {\n if (!params)\n return {};\n const { errorMap, invalid_type_error, required_error, description } = params;\n if (errorMap && (invalid_type_error || required_error)) {\n throw new Error(`Can't use \"invalid_type_error\" or \"required_error\" in conjunction with custom error map.`);\n }\n if (errorMap)\n return { errorMap: errorMap, description };\n const customMap = (iss, ctx) => {\n var _a, _b;\n const { message } = params;\n if (iss.code === \"invalid_enum_value\") {\n return { message: message !== null && message !== void 0 ? message : ctx.defaultError };\n }\n if (typeof ctx.data === \"undefined\") {\n return { message: (_a = message !== null && message !== void 0 ? message : required_error) !== null && _a !== void 0 ? _a : ctx.defaultError };\n }\n if (iss.code !== \"invalid_type\")\n return { message: ctx.defaultError };\n return { message: (_b = message !== null && message !== void 0 ? message : invalid_type_error) !== null && _b !== void 0 ? _b : ctx.defaultError };\n };\n return { errorMap: customMap, description };\n}\nclass ZodType {\n get description() {\n return this._def.description;\n }\n _getType(input) {\n return getParsedType(input.data);\n }\n _getOrReturnCtx(input, ctx) {\n return (ctx || {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent,\n });\n }\n _processInputParams(input) {\n return {\n status: new ParseStatus(),\n ctx: {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent,\n },\n };\n }\n _parseSync(input) {\n const result = this._parse(input);\n if (isAsync(result)) {\n throw new Error(\"Synchronous parse encountered promise.\");\n }\n return result;\n }\n _parseAsync(input) {\n const result = this._parse(input);\n return Promise.resolve(result);\n }\n parse(data, params) {\n const result = this.safeParse(data, params);\n if (result.success)\n return result.data;\n throw result.error;\n }\n safeParse(data, params) {\n var _a;\n const ctx = {\n common: {\n issues: [],\n async: (_a = params === null || params === void 0 ? void 0 : params.async) !== null && _a !== void 0 ? _a : false,\n contextualErrorMap: params === null || params === void 0 ? void 0 : params.errorMap,\n },\n path: (params === null || params === void 0 ? void 0 : params.path) || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n const result = this._parseSync({ data, path: ctx.path, parent: ctx });\n return handleResult(ctx, result);\n }\n \"~validate\"(data) {\n var _a, _b;\n const ctx = {\n common: {\n issues: [],\n async: !!this[\"~standard\"].async,\n },\n path: [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n if (!this[\"~standard\"].async) {\n try {\n const result = this._parseSync({ data, path: [], parent: ctx });\n return isValid(result)\n ? {\n value: result.value,\n }\n : {\n issues: ctx.common.issues,\n };\n }\n catch (err) {\n if ((_b = (_a = err === null || err === void 0 ? void 0 : err.message) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === null || _b === void 0 ? void 0 : _b.includes(\"encountered\")) {\n this[\"~standard\"].async = true;\n }\n ctx.common = {\n issues: [],\n async: true,\n };\n }\n }\n return this._parseAsync({ data, path: [], parent: ctx }).then((result) => isValid(result)\n ? {\n value: result.value,\n }\n : {\n issues: ctx.common.issues,\n });\n }\n async parseAsync(data, params) {\n const result = await this.safeParseAsync(data, params);\n if (result.success)\n return result.data;\n throw result.error;\n }\n async safeParseAsync(data, params) {\n const ctx = {\n common: {\n issues: [],\n contextualErrorMap: params === null || params === void 0 ? void 0 : params.errorMap,\n async: true,\n },\n path: (params === null || params === void 0 ? void 0 : params.path) || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n const maybeAsyncResult = this._parse({ data, path: ctx.path, parent: ctx });\n const result = await (isAsync(maybeAsyncResult)\n ? maybeAsyncResult\n : Promise.resolve(maybeAsyncResult));\n return handleResult(ctx, result);\n }\n refine(check, message) {\n const getIssueProperties = (val) => {\n if (typeof message === \"string\" || typeof message === \"undefined\") {\n return { message };\n }\n else if (typeof message === \"function\") {\n return message(val);\n }\n else {\n return message;\n }\n };\n return this._refinement((val, ctx) => {\n const result = check(val);\n const setError = () => ctx.addIssue({\n code: ZodIssueCode.custom,\n ...getIssueProperties(val),\n });\n if (typeof Promise !== \"undefined\" && result instanceof Promise) {\n return result.then((data) => {\n if (!data) {\n setError();\n return false;\n }\n else {\n return true;\n }\n });\n }\n if (!result) {\n setError();\n return false;\n }\n else {\n return true;\n }\n });\n }\n refinement(check, refinementData) {\n return this._refinement((val, ctx) => {\n if (!check(val)) {\n ctx.addIssue(typeof refinementData === \"function\"\n ? refinementData(val, ctx)\n : refinementData);\n return false;\n }\n else {\n return true;\n }\n });\n }\n _refinement(refinement) {\n return new ZodEffects({\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: { type: \"refinement\", refinement },\n });\n }\n superRefine(refinement) {\n return this._refinement(refinement);\n }\n constructor(def) {\n /** Alias of safeParseAsync */\n this.spa = this.safeParseAsync;\n this._def = def;\n this.parse = this.parse.bind(this);\n this.safeParse = this.safeParse.bind(this);\n this.parseAsync = this.parseAsync.bind(this);\n this.safeParseAsync = this.safeParseAsync.bind(this);\n this.spa = this.spa.bind(this);\n this.refine = this.refine.bind(this);\n this.refinement = this.refinement.bind(this);\n this.superRefine = this.superRefine.bind(this);\n this.optional = this.optional.bind(this);\n this.nullable = this.nullable.bind(this);\n this.nullish = this.nullish.bind(this);\n this.array = this.array.bind(this);\n this.promise = this.promise.bind(this);\n this.or = this.or.bind(this);\n this.and = this.and.bind(this);\n this.transform = this.transform.bind(this);\n this.brand = this.brand.bind(this);\n this.default = this.default.bind(this);\n this.catch = this.catch.bind(this);\n this.describe = this.describe.bind(this);\n this.pipe = this.pipe.bind(this);\n this.readonly = this.readonly.bind(this);\n this.isNullable = this.isNullable.bind(this);\n this.isOptional = this.isOptional.bind(this);\n this[\"~standard\"] = {\n version: 1,\n vendor: \"zod\",\n validate: (data) => this[\"~validate\"](data),\n };\n }\n optional() {\n return ZodOptional.create(this, this._def);\n }\n nullable() {\n return ZodNullable.create(this, this._def);\n }\n nullish() {\n return this.nullable().optional();\n }\n array() {\n return ZodArray.create(this);\n }\n promise() {\n return ZodPromise.create(this, this._def);\n }\n or(option) {\n return ZodUnion.create([this, option], this._def);\n }\n and(incoming) {\n return ZodIntersection.create(this, incoming, this._def);\n }\n transform(transform) {\n return new ZodEffects({\n ...processCreateParams(this._def),\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: { type: \"transform\", transform },\n });\n }\n default(def) {\n const defaultValueFunc = typeof def === \"function\" ? def : () => def;\n return new ZodDefault({\n ...processCreateParams(this._def),\n innerType: this,\n defaultValue: defaultValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodDefault,\n });\n }\n brand() {\n return new ZodBranded({\n typeName: ZodFirstPartyTypeKind.ZodBranded,\n type: this,\n ...processCreateParams(this._def),\n });\n }\n catch(def) {\n const catchValueFunc = typeof def === \"function\" ? def : () => def;\n return new ZodCatch({\n ...processCreateParams(this._def),\n innerType: this,\n catchValue: catchValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodCatch,\n });\n }\n describe(description) {\n const This = this.constructor;\n return new This({\n ...this._def,\n description,\n });\n }\n pipe(target) {\n return ZodPipeline.create(this, target);\n }\n readonly() {\n return ZodReadonly.create(this);\n }\n isOptional() {\n return this.safeParse(undefined).success;\n }\n isNullable() {\n return this.safeParse(null).success;\n }\n}\nconst cuidRegex = /^c[^\\s-]{8,}$/i;\nconst cuid2Regex = /^[0-9a-z]+$/;\nconst ulidRegex = /^[0-9A-HJKMNP-TV-Z]{26}$/i;\n// const uuidRegex =\n// /^([a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[a-f0-9]{4}-[a-f0-9]{12}|00000000-0000-0000-0000-000000000000)$/i;\nconst uuidRegex = /^[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$/i;\nconst nanoidRegex = /^[a-z0-9_-]{21}$/i;\nconst jwtRegex = /^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]*$/;\nconst durationRegex = /^[-+]?P(?!$)(?:(?:[-+]?\\d+Y)|(?:[-+]?\\d+[.,]\\d+Y$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:(?:[-+]?\\d+W)|(?:[-+]?\\d+[.,]\\d+W$))?(?:(?:[-+]?\\d+D)|(?:[-+]?\\d+[.,]\\d+D$))?(?:T(?=[\\d+-])(?:(?:[-+]?\\d+H)|(?:[-+]?\\d+[.,]\\d+H$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:[-+]?\\d+(?:[.,]\\d+)?S)?)??$/;\n// from https://stackoverflow.com/a/46181/1550155\n// old version: too slow, didn't support unicode\n// const emailRegex = /^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/i;\n//old email regex\n// const emailRegex = /^(([^<>()[\\].,;:\\s@\"]+(\\.[^<>()[\\].,;:\\s@\"]+)*)|(\".+\"))@((?!-)([^<>()[\\].,;:\\s@\"]+\\.)+[^<>()[\\].,;:\\s@\"]{1,})[^-<>()[\\].,;:\\s@\"]$/i;\n// eslint-disable-next-line\n// const emailRegex =\n// /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\])|(\\[IPv6:(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))\\])|([A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])*(\\.[A-Za-z]{2,})+))$/;\n// const emailRegex =\n// /^[a-zA-Z0-9\\.\\!\\#\\$\\%\\&\\'\\*\\+\\/\\=\\?\\^\\_\\`\\{\\|\\}\\~\\-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n// const emailRegex =\n// /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])$/i;\nconst emailRegex = /^(?!\\.)(?!.*\\.\\.)([A-Z0-9_'+\\-\\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\\-]*\\.)+[A-Z]{2,}$/i;\n// const emailRegex =\n// /^[a-z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-z0-9-]+(?:\\.[a-z0-9\\-]+)*$/i;\n// from https://thekevinscott.com/emojis-in-javascript/#writing-a-regular-expression\nconst _emojiRegex = `^(\\\\p{Extended_Pictographic}|\\\\p{Emoji_Component})+$`;\nlet emojiRegex;\n// faster, simpler, safer\nconst ipv4Regex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/;\nconst ipv4CidrRegex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/(3[0-2]|[12]?[0-9])$/;\n// const ipv6Regex =\n// /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/;\nconst ipv6Regex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/;\nconst ipv6CidrRegex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/;\n// https://stackoverflow.com/questions/7860392/determine-if-string-is-in-base64-using-javascript\nconst base64Regex = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/;\n// https://base64.guru/standards/base64url\nconst base64urlRegex = /^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/;\n// simple\n// const dateRegexSource = `\\\\d{4}-\\\\d{2}-\\\\d{2}`;\n// no leap year validation\n// const dateRegexSource = `\\\\d{4}-((0[13578]|10|12)-31|(0[13-9]|1[0-2])-30|(0[1-9]|1[0-2])-(0[1-9]|1\\\\d|2\\\\d))`;\n// with leap year validation\nconst dateRegexSource = `((\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\\\d|30)|(02)-(0[1-9]|1\\\\d|2[0-8])))`;\nconst dateRegex = new RegExp(`^${dateRegexSource}$`);\nfunction timeRegexSource(args) {\n // let regex = `\\\\d{2}:\\\\d{2}:\\\\d{2}`;\n let regex = `([01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d`;\n if (args.precision) {\n regex = `${regex}\\\\.\\\\d{${args.precision}}`;\n }\n else if (args.precision == null) {\n regex = `${regex}(\\\\.\\\\d+)?`;\n }\n return regex;\n}\nfunction timeRegex(args) {\n return new RegExp(`^${timeRegexSource(args)}$`);\n}\n// Adapted from https://stackoverflow.com/a/3143231\nfunction datetimeRegex(args) {\n let regex = `${dateRegexSource}T${timeRegexSource(args)}`;\n const opts = [];\n opts.push(args.local ? `Z?` : `Z`);\n if (args.offset)\n opts.push(`([+-]\\\\d{2}:?\\\\d{2})`);\n regex = `${regex}(${opts.join(\"|\")})`;\n return new RegExp(`^${regex}$`);\n}\nfunction isValidIP(ip, version) {\n if ((version === \"v4\" || !version) && ipv4Regex.test(ip)) {\n return true;\n }\n if ((version === \"v6\" || !version) && ipv6Regex.test(ip)) {\n return true;\n }\n return false;\n}\nfunction isValidJWT(jwt, alg) {\n if (!jwtRegex.test(jwt))\n return false;\n try {\n const [header] = jwt.split(\".\");\n // Convert base64url to base64\n const base64 = header\n .replace(/-/g, \"+\")\n .replace(/_/g, \"/\")\n .padEnd(header.length + ((4 - (header.length % 4)) % 4), \"=\");\n const decoded = JSON.parse(atob(base64));\n if (typeof decoded !== \"object\" || decoded === null)\n return false;\n if (!decoded.typ || !decoded.alg)\n return false;\n if (alg && decoded.alg !== alg)\n return false;\n return true;\n }\n catch (_a) {\n return false;\n }\n}\nfunction isValidCidr(ip, version) {\n if ((version === \"v4\" || !version) && ipv4CidrRegex.test(ip)) {\n return true;\n }\n if ((version === \"v6\" || !version) && ipv6CidrRegex.test(ip)) {\n return true;\n }\n return false;\n}\nclass ZodString extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = String(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.string) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.string,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n if (input.data.length < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n if (input.data.length > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"length\") {\n const tooBig = input.data.length > check.value;\n const tooSmall = input.data.length < check.value;\n if (tooBig || tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n if (tooBig) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n exact: true,\n message: check.message,\n });\n }\n else if (tooSmall) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n exact: true,\n message: check.message,\n });\n }\n status.dirty();\n }\n }\n else if (check.kind === \"email\") {\n if (!emailRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"email\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"emoji\") {\n if (!emojiRegex) {\n emojiRegex = new RegExp(_emojiRegex, \"u\");\n }\n if (!emojiRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"emoji\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"uuid\") {\n if (!uuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"uuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"nanoid\") {\n if (!nanoidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"nanoid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cuid\") {\n if (!cuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cuid2\") {\n if (!cuid2Regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid2\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"ulid\") {\n if (!ulidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"ulid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"url\") {\n try {\n new URL(input.data);\n }\n catch (_a) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"url\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"regex\") {\n check.regex.lastIndex = 0;\n const testResult = check.regex.test(input.data);\n if (!testResult) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"regex\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"trim\") {\n input.data = input.data.trim();\n }\n else if (check.kind === \"includes\") {\n if (!input.data.includes(check.value, check.position)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { includes: check.value, position: check.position },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"toLowerCase\") {\n input.data = input.data.toLowerCase();\n }\n else if (check.kind === \"toUpperCase\") {\n input.data = input.data.toUpperCase();\n }\n else if (check.kind === \"startsWith\") {\n if (!input.data.startsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { startsWith: check.value },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"endsWith\") {\n if (!input.data.endsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { endsWith: check.value },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"datetime\") {\n const regex = datetimeRegex(check);\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"datetime\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"date\") {\n const regex = dateRegex;\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"date\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"time\") {\n const regex = timeRegex(check);\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"time\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"duration\") {\n if (!durationRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"duration\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"ip\") {\n if (!isValidIP(input.data, check.version)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"ip\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"jwt\") {\n if (!isValidJWT(input.data, check.alg)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"jwt\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cidr\") {\n if (!isValidCidr(input.data, check.version)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cidr\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"base64\") {\n if (!base64Regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"base64\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"base64url\") {\n if (!base64urlRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"base64url\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n _regex(regex, validation, message) {\n return this.refinement((data) => regex.test(data), {\n validation,\n code: ZodIssueCode.invalid_string,\n ...errorUtil.errToObj(message),\n });\n }\n _addCheck(check) {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n email(message) {\n return this._addCheck({ kind: \"email\", ...errorUtil.errToObj(message) });\n }\n url(message) {\n return this._addCheck({ kind: \"url\", ...errorUtil.errToObj(message) });\n }\n emoji(message) {\n return this._addCheck({ kind: \"emoji\", ...errorUtil.errToObj(message) });\n }\n uuid(message) {\n return this._addCheck({ kind: \"uuid\", ...errorUtil.errToObj(message) });\n }\n nanoid(message) {\n return this._addCheck({ kind: \"nanoid\", ...errorUtil.errToObj(message) });\n }\n cuid(message) {\n return this._addCheck({ kind: \"cuid\", ...errorUtil.errToObj(message) });\n }\n cuid2(message) {\n return this._addCheck({ kind: \"cuid2\", ...errorUtil.errToObj(message) });\n }\n ulid(message) {\n return this._addCheck({ kind: \"ulid\", ...errorUtil.errToObj(message) });\n }\n base64(message) {\n return this._addCheck({ kind: \"base64\", ...errorUtil.errToObj(message) });\n }\n base64url(message) {\n // base64url encoding is a modification of base64 that can safely be used in URLs and filenames\n return this._addCheck({\n kind: \"base64url\",\n ...errorUtil.errToObj(message),\n });\n }\n jwt(options) {\n return this._addCheck({ kind: \"jwt\", ...errorUtil.errToObj(options) });\n }\n ip(options) {\n return this._addCheck({ kind: \"ip\", ...errorUtil.errToObj(options) });\n }\n cidr(options) {\n return this._addCheck({ kind: \"cidr\", ...errorUtil.errToObj(options) });\n }\n datetime(options) {\n var _a, _b;\n if (typeof options === \"string\") {\n return this._addCheck({\n kind: \"datetime\",\n precision: null,\n offset: false,\n local: false,\n message: options,\n });\n }\n return this._addCheck({\n kind: \"datetime\",\n precision: typeof (options === null || options === void 0 ? void 0 : options.precision) === \"undefined\" ? null : options === null || options === void 0 ? void 0 : options.precision,\n offset: (_a = options === null || options === void 0 ? void 0 : options.offset) !== null && _a !== void 0 ? _a : false,\n local: (_b = options === null || options === void 0 ? void 0 : options.local) !== null && _b !== void 0 ? _b : false,\n ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message),\n });\n }\n date(message) {\n return this._addCheck({ kind: \"date\", message });\n }\n time(options) {\n if (typeof options === \"string\") {\n return this._addCheck({\n kind: \"time\",\n precision: null,\n message: options,\n });\n }\n return this._addCheck({\n kind: \"time\",\n precision: typeof (options === null || options === void 0 ? void 0 : options.precision) === \"undefined\" ? null : options === null || options === void 0 ? void 0 : options.precision,\n ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message),\n });\n }\n duration(message) {\n return this._addCheck({ kind: \"duration\", ...errorUtil.errToObj(message) });\n }\n regex(regex, message) {\n return this._addCheck({\n kind: \"regex\",\n regex: regex,\n ...errorUtil.errToObj(message),\n });\n }\n includes(value, options) {\n return this._addCheck({\n kind: \"includes\",\n value: value,\n position: options === null || options === void 0 ? void 0 : options.position,\n ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message),\n });\n }\n startsWith(value, message) {\n return this._addCheck({\n kind: \"startsWith\",\n value: value,\n ...errorUtil.errToObj(message),\n });\n }\n endsWith(value, message) {\n return this._addCheck({\n kind: \"endsWith\",\n value: value,\n ...errorUtil.errToObj(message),\n });\n }\n min(minLength, message) {\n return this._addCheck({\n kind: \"min\",\n value: minLength,\n ...errorUtil.errToObj(message),\n });\n }\n max(maxLength, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxLength,\n ...errorUtil.errToObj(message),\n });\n }\n length(len, message) {\n return this._addCheck({\n kind: \"length\",\n value: len,\n ...errorUtil.errToObj(message),\n });\n }\n /**\n * Equivalent to `.min(1)`\n */\n nonempty(message) {\n return this.min(1, errorUtil.errToObj(message));\n }\n trim() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"trim\" }],\n });\n }\n toLowerCase() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"toLowerCase\" }],\n });\n }\n toUpperCase() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"toUpperCase\" }],\n });\n }\n get isDatetime() {\n return !!this._def.checks.find((ch) => ch.kind === \"datetime\");\n }\n get isDate() {\n return !!this._def.checks.find((ch) => ch.kind === \"date\");\n }\n get isTime() {\n return !!this._def.checks.find((ch) => ch.kind === \"time\");\n }\n get isDuration() {\n return !!this._def.checks.find((ch) => ch.kind === \"duration\");\n }\n get isEmail() {\n return !!this._def.checks.find((ch) => ch.kind === \"email\");\n }\n get isURL() {\n return !!this._def.checks.find((ch) => ch.kind === \"url\");\n }\n get isEmoji() {\n return !!this._def.checks.find((ch) => ch.kind === \"emoji\");\n }\n get isUUID() {\n return !!this._def.checks.find((ch) => ch.kind === \"uuid\");\n }\n get isNANOID() {\n return !!this._def.checks.find((ch) => ch.kind === \"nanoid\");\n }\n get isCUID() {\n return !!this._def.checks.find((ch) => ch.kind === \"cuid\");\n }\n get isCUID2() {\n return !!this._def.checks.find((ch) => ch.kind === \"cuid2\");\n }\n get isULID() {\n return !!this._def.checks.find((ch) => ch.kind === \"ulid\");\n }\n get isIP() {\n return !!this._def.checks.find((ch) => ch.kind === \"ip\");\n }\n get isCIDR() {\n return !!this._def.checks.find((ch) => ch.kind === \"cidr\");\n }\n get isBase64() {\n return !!this._def.checks.find((ch) => ch.kind === \"base64\");\n }\n get isBase64url() {\n // base64url encoding is a modification of base64 that can safely be used in URLs and filenames\n return !!this._def.checks.find((ch) => ch.kind === \"base64url\");\n }\n get minLength() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxLength() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n}\nZodString.create = (params) => {\n var _a;\n return new ZodString({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodString,\n coerce: (_a = params === null || params === void 0 ? void 0 : params.coerce) !== null && _a !== void 0 ? _a : false,\n ...processCreateParams(params),\n });\n};\n// https://stackoverflow.com/questions/3966484/why-does-modulus-operator-return-fractional-number-in-javascript/31711034#31711034\nfunction floatSafeRemainder(val, step) {\n const valDecCount = (val.toString().split(\".\")[1] || \"\").length;\n const stepDecCount = (step.toString().split(\".\")[1] || \"\").length;\n const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount;\n const valInt = parseInt(val.toFixed(decCount).replace(\".\", \"\"));\n const stepInt = parseInt(step.toFixed(decCount).replace(\".\", \"\"));\n return (valInt % stepInt) / Math.pow(10, decCount);\n}\nclass ZodNumber extends ZodType {\n constructor() {\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n this.step = this.multipleOf;\n }\n _parse(input) {\n if (this._def.coerce) {\n input.data = Number(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.number) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.number,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks) {\n if (check.kind === \"int\") {\n if (!util.isInteger(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: \"integer\",\n received: \"float\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"min\") {\n const tooSmall = check.inclusive\n ? input.data < check.value\n : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n const tooBig = check.inclusive\n ? input.data > check.value\n : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"multipleOf\") {\n if (floatSafeRemainder(input.data, check.value) !== 0) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"finite\") {\n if (!Number.isFinite(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_finite,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodNumber({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message),\n },\n ],\n });\n }\n _addCheck(check) {\n return new ZodNumber({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n int(message) {\n return this._addCheck({\n kind: \"int\",\n message: errorUtil.toString(message),\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value: value,\n message: errorUtil.toString(message),\n });\n }\n finite(message) {\n return this._addCheck({\n kind: \"finite\",\n message: errorUtil.toString(message),\n });\n }\n safe(message) {\n return this._addCheck({\n kind: \"min\",\n inclusive: true,\n value: Number.MIN_SAFE_INTEGER,\n message: errorUtil.toString(message),\n })._addCheck({\n kind: \"max\",\n inclusive: true,\n value: Number.MAX_SAFE_INTEGER,\n message: errorUtil.toString(message),\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n get isInt() {\n return !!this._def.checks.find((ch) => ch.kind === \"int\" ||\n (ch.kind === \"multipleOf\" && util.isInteger(ch.value)));\n }\n get isFinite() {\n let max = null, min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"finite\" ||\n ch.kind === \"int\" ||\n ch.kind === \"multipleOf\") {\n return true;\n }\n else if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n else if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return Number.isFinite(min) && Number.isFinite(max);\n }\n}\nZodNumber.create = (params) => {\n return new ZodNumber({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodNumber,\n coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false,\n ...processCreateParams(params),\n });\n};\nclass ZodBigInt extends ZodType {\n constructor() {\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n }\n _parse(input) {\n if (this._def.coerce) {\n try {\n input.data = BigInt(input.data);\n }\n catch (_a) {\n return this._getInvalidInput(input);\n }\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.bigint) {\n return this._getInvalidInput(input);\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n const tooSmall = check.inclusive\n ? input.data < check.value\n : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n type: \"bigint\",\n minimum: check.value,\n inclusive: check.inclusive,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n const tooBig = check.inclusive\n ? input.data > check.value\n : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n type: \"bigint\",\n maximum: check.value,\n inclusive: check.inclusive,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"multipleOf\") {\n if (input.data % check.value !== BigInt(0)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n _getInvalidInput(input) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.bigint,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodBigInt({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message),\n },\n ],\n });\n }\n _addCheck(check) {\n return new ZodBigInt({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value,\n message: errorUtil.toString(message),\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n}\nZodBigInt.create = (params) => {\n var _a;\n return new ZodBigInt({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodBigInt,\n coerce: (_a = params === null || params === void 0 ? void 0 : params.coerce) !== null && _a !== void 0 ? _a : false,\n ...processCreateParams(params),\n });\n};\nclass ZodBoolean extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = Boolean(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.boolean) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.boolean,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodBoolean.create = (params) => {\n return new ZodBoolean({\n typeName: ZodFirstPartyTypeKind.ZodBoolean,\n coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false,\n ...processCreateParams(params),\n });\n};\nclass ZodDate extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = new Date(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.date) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.date,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (isNaN(input.data.getTime())) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_date,\n });\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n if (input.data.getTime() < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n message: check.message,\n inclusive: true,\n exact: false,\n minimum: check.value,\n type: \"date\",\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n if (input.data.getTime() > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n message: check.message,\n inclusive: true,\n exact: false,\n maximum: check.value,\n type: \"date\",\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return {\n status: status.value,\n value: new Date(input.data.getTime()),\n };\n }\n _addCheck(check) {\n return new ZodDate({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n min(minDate, message) {\n return this._addCheck({\n kind: \"min\",\n value: minDate.getTime(),\n message: errorUtil.toString(message),\n });\n }\n max(maxDate, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxDate.getTime(),\n message: errorUtil.toString(message),\n });\n }\n get minDate() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min != null ? new Date(min) : null;\n }\n get maxDate() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max != null ? new Date(max) : null;\n }\n}\nZodDate.create = (params) => {\n return new ZodDate({\n checks: [],\n coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false,\n typeName: ZodFirstPartyTypeKind.ZodDate,\n ...processCreateParams(params),\n });\n};\nclass ZodSymbol extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.symbol) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.symbol,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodSymbol.create = (params) => {\n return new ZodSymbol({\n typeName: ZodFirstPartyTypeKind.ZodSymbol,\n ...processCreateParams(params),\n });\n};\nclass ZodUndefined extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.undefined,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodUndefined.create = (params) => {\n return new ZodUndefined({\n typeName: ZodFirstPartyTypeKind.ZodUndefined,\n ...processCreateParams(params),\n });\n};\nclass ZodNull extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.null) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.null,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodNull.create = (params) => {\n return new ZodNull({\n typeName: ZodFirstPartyTypeKind.ZodNull,\n ...processCreateParams(params),\n });\n};\nclass ZodAny extends ZodType {\n constructor() {\n super(...arguments);\n // to prevent instances of other classes from extending ZodAny. this causes issues with catchall in ZodObject.\n this._any = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodAny.create = (params) => {\n return new ZodAny({\n typeName: ZodFirstPartyTypeKind.ZodAny,\n ...processCreateParams(params),\n });\n};\nclass ZodUnknown extends ZodType {\n constructor() {\n super(...arguments);\n // required\n this._unknown = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodUnknown.create = (params) => {\n return new ZodUnknown({\n typeName: ZodFirstPartyTypeKind.ZodUnknown,\n ...processCreateParams(params),\n });\n};\nclass ZodNever extends ZodType {\n _parse(input) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.never,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n}\nZodNever.create = (params) => {\n return new ZodNever({\n typeName: ZodFirstPartyTypeKind.ZodNever,\n ...processCreateParams(params),\n });\n};\nclass ZodVoid extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.void,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodVoid.create = (params) => {\n return new ZodVoid({\n typeName: ZodFirstPartyTypeKind.ZodVoid,\n ...processCreateParams(params),\n });\n};\nclass ZodArray extends ZodType {\n _parse(input) {\n const { ctx, status } = this._processInputParams(input);\n const def = this._def;\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (def.exactLength !== null) {\n const tooBig = ctx.data.length > def.exactLength.value;\n const tooSmall = ctx.data.length < def.exactLength.value;\n if (tooBig || tooSmall) {\n addIssueToContext(ctx, {\n code: tooBig ? ZodIssueCode.too_big : ZodIssueCode.too_small,\n minimum: (tooSmall ? def.exactLength.value : undefined),\n maximum: (tooBig ? def.exactLength.value : undefined),\n type: \"array\",\n inclusive: true,\n exact: true,\n message: def.exactLength.message,\n });\n status.dirty();\n }\n }\n if (def.minLength !== null) {\n if (ctx.data.length < def.minLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minLength.value,\n type: \"array\",\n inclusive: true,\n exact: false,\n message: def.minLength.message,\n });\n status.dirty();\n }\n }\n if (def.maxLength !== null) {\n if (ctx.data.length > def.maxLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxLength.value,\n type: \"array\",\n inclusive: true,\n exact: false,\n message: def.maxLength.message,\n });\n status.dirty();\n }\n }\n if (ctx.common.async) {\n return Promise.all([...ctx.data].map((item, i) => {\n return def.type._parseAsync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n })).then((result) => {\n return ParseStatus.mergeArray(status, result);\n });\n }\n const result = [...ctx.data].map((item, i) => {\n return def.type._parseSync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n });\n return ParseStatus.mergeArray(status, result);\n }\n get element() {\n return this._def.type;\n }\n min(minLength, message) {\n return new ZodArray({\n ...this._def,\n minLength: { value: minLength, message: errorUtil.toString(message) },\n });\n }\n max(maxLength, message) {\n return new ZodArray({\n ...this._def,\n maxLength: { value: maxLength, message: errorUtil.toString(message) },\n });\n }\n length(len, message) {\n return new ZodArray({\n ...this._def,\n exactLength: { value: len, message: errorUtil.toString(message) },\n });\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodArray.create = (schema, params) => {\n return new ZodArray({\n type: schema,\n minLength: null,\n maxLength: null,\n exactLength: null,\n typeName: ZodFirstPartyTypeKind.ZodArray,\n ...processCreateParams(params),\n });\n};\nfunction deepPartialify(schema) {\n if (schema instanceof ZodObject) {\n const newShape = {};\n for (const key in schema.shape) {\n const fieldSchema = schema.shape[key];\n newShape[key] = ZodOptional.create(deepPartialify(fieldSchema));\n }\n return new ZodObject({\n ...schema._def,\n shape: () => newShape,\n });\n }\n else if (schema instanceof ZodArray) {\n return new ZodArray({\n ...schema._def,\n type: deepPartialify(schema.element),\n });\n }\n else if (schema instanceof ZodOptional) {\n return ZodOptional.create(deepPartialify(schema.unwrap()));\n }\n else if (schema instanceof ZodNullable) {\n return ZodNullable.create(deepPartialify(schema.unwrap()));\n }\n else if (schema instanceof ZodTuple) {\n return ZodTuple.create(schema.items.map((item) => deepPartialify(item)));\n }\n else {\n return schema;\n }\n}\nclass ZodObject extends ZodType {\n constructor() {\n super(...arguments);\n this._cached = null;\n /**\n * @deprecated In most cases, this is no longer needed - unknown properties are now silently stripped.\n * If you want to pass through unknown properties, use `.passthrough()` instead.\n */\n this.nonstrict = this.passthrough;\n // extend<\n // Augmentation extends ZodRawShape,\n // NewOutput extends util.flatten<{\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // }>,\n // NewInput extends util.flatten<{\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }>\n // >(\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape,\n // UnknownKeys,\n // Catchall,\n // NewOutput,\n // NewInput\n // > {\n // return new ZodObject({\n // ...this._def,\n // shape: () => ({\n // ...this._def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // }\n /**\n * @deprecated Use `.extend` instead\n * */\n this.augment = this.extend;\n }\n _getCached() {\n if (this._cached !== null)\n return this._cached;\n const shape = this._def.shape();\n const keys = util.objectKeys(shape);\n return (this._cached = { shape, keys });\n }\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.object) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const { status, ctx } = this._processInputParams(input);\n const { shape, keys: shapeKeys } = this._getCached();\n const extraKeys = [];\n if (!(this._def.catchall instanceof ZodNever &&\n this._def.unknownKeys === \"strip\")) {\n for (const key in ctx.data) {\n if (!shapeKeys.includes(key)) {\n extraKeys.push(key);\n }\n }\n }\n const pairs = [];\n for (const key of shapeKeys) {\n const keyValidator = shape[key];\n const value = ctx.data[key];\n pairs.push({\n key: { status: \"valid\", value: key },\n value: keyValidator._parse(new ParseInputLazyPath(ctx, value, ctx.path, key)),\n alwaysSet: key in ctx.data,\n });\n }\n if (this._def.catchall instanceof ZodNever) {\n const unknownKeys = this._def.unknownKeys;\n if (unknownKeys === \"passthrough\") {\n for (const key of extraKeys) {\n pairs.push({\n key: { status: \"valid\", value: key },\n value: { status: \"valid\", value: ctx.data[key] },\n });\n }\n }\n else if (unknownKeys === \"strict\") {\n if (extraKeys.length > 0) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.unrecognized_keys,\n keys: extraKeys,\n });\n status.dirty();\n }\n }\n else if (unknownKeys === \"strip\") ;\n else {\n throw new Error(`Internal ZodObject error: invalid unknownKeys value.`);\n }\n }\n else {\n // run catchall validation\n const catchall = this._def.catchall;\n for (const key of extraKeys) {\n const value = ctx.data[key];\n pairs.push({\n key: { status: \"valid\", value: key },\n value: catchall._parse(new ParseInputLazyPath(ctx, value, ctx.path, key) //, ctx.child(key), value, getParsedType(value)\n ),\n alwaysSet: key in ctx.data,\n });\n }\n }\n if (ctx.common.async) {\n return Promise.resolve()\n .then(async () => {\n const syncPairs = [];\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n syncPairs.push({\n key,\n value,\n alwaysSet: pair.alwaysSet,\n });\n }\n return syncPairs;\n })\n .then((syncPairs) => {\n return ParseStatus.mergeObjectSync(status, syncPairs);\n });\n }\n else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get shape() {\n return this._def.shape();\n }\n strict(message) {\n errorUtil.errToObj;\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strict\",\n ...(message !== undefined\n ? {\n errorMap: (issue, ctx) => {\n var _a, _b, _c, _d;\n const defaultError = (_c = (_b = (_a = this._def).errorMap) === null || _b === void 0 ? void 0 : _b.call(_a, issue, ctx).message) !== null && _c !== void 0 ? _c : ctx.defaultError;\n if (issue.code === \"unrecognized_keys\")\n return {\n message: (_d = errorUtil.errToObj(message).message) !== null && _d !== void 0 ? _d : defaultError,\n };\n return {\n message: defaultError,\n };\n },\n }\n : {}),\n });\n }\n strip() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strip\",\n });\n }\n passthrough() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"passthrough\",\n });\n }\n // const AugmentFactory =\n // (def: Def) =>\n // (\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape, Augmentation>,\n // Def[\"unknownKeys\"],\n // Def[\"catchall\"]\n // > => {\n // return new ZodObject({\n // ...def,\n // shape: () => ({\n // ...def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // };\n extend(augmentation) {\n return new ZodObject({\n ...this._def,\n shape: () => ({\n ...this._def.shape(),\n ...augmentation,\n }),\n });\n }\n /**\n * Prior to zod@1.0.12 there was a bug in the\n * inferred type of merged objects. Please\n * upgrade if you are experiencing issues.\n */\n merge(merging) {\n const merged = new ZodObject({\n unknownKeys: merging._def.unknownKeys,\n catchall: merging._def.catchall,\n shape: () => ({\n ...this._def.shape(),\n ...merging._def.shape(),\n }),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n });\n return merged;\n }\n // merge<\n // Incoming extends AnyZodObject,\n // Augmentation extends Incoming[\"shape\"],\n // NewOutput extends {\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // },\n // NewInput extends {\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }\n // >(\n // merging: Incoming\n // ): ZodObject<\n // extendShape>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"],\n // NewOutput,\n // NewInput\n // > {\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n setKey(key, schema) {\n return this.augment({ [key]: schema });\n }\n // merge(\n // merging: Incoming\n // ): //ZodObject = (merging) => {\n // ZodObject<\n // extendShape>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"]\n // > {\n // // const mergedShape = objectUtil.mergeShapes(\n // // this._def.shape(),\n // // merging._def.shape()\n // // );\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n catchall(index) {\n return new ZodObject({\n ...this._def,\n catchall: index,\n });\n }\n pick(mask) {\n const shape = {};\n util.objectKeys(mask).forEach((key) => {\n if (mask[key] && this.shape[key]) {\n shape[key] = this.shape[key];\n }\n });\n return new ZodObject({\n ...this._def,\n shape: () => shape,\n });\n }\n omit(mask) {\n const shape = {};\n util.objectKeys(this.shape).forEach((key) => {\n if (!mask[key]) {\n shape[key] = this.shape[key];\n }\n });\n return new ZodObject({\n ...this._def,\n shape: () => shape,\n });\n }\n /**\n * @deprecated\n */\n deepPartial() {\n return deepPartialify(this);\n }\n partial(mask) {\n const newShape = {};\n util.objectKeys(this.shape).forEach((key) => {\n const fieldSchema = this.shape[key];\n if (mask && !mask[key]) {\n newShape[key] = fieldSchema;\n }\n else {\n newShape[key] = fieldSchema.optional();\n }\n });\n return new ZodObject({\n ...this._def,\n shape: () => newShape,\n });\n }\n required(mask) {\n const newShape = {};\n util.objectKeys(this.shape).forEach((key) => {\n if (mask && !mask[key]) {\n newShape[key] = this.shape[key];\n }\n else {\n const fieldSchema = this.shape[key];\n let newField = fieldSchema;\n while (newField instanceof ZodOptional) {\n newField = newField._def.innerType;\n }\n newShape[key] = newField;\n }\n });\n return new ZodObject({\n ...this._def,\n shape: () => newShape,\n });\n }\n keyof() {\n return createZodEnum(util.objectKeys(this.shape));\n }\n}\nZodObject.create = (shape, params) => {\n return new ZodObject({\n shape: () => shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nZodObject.strictCreate = (shape, params) => {\n return new ZodObject({\n shape: () => shape,\n unknownKeys: \"strict\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nZodObject.lazycreate = (shape, params) => {\n return new ZodObject({\n shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nclass ZodUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const options = this._def.options;\n function handleResults(results) {\n // return first issue-free validation if it exists\n for (const result of results) {\n if (result.result.status === \"valid\") {\n return result.result;\n }\n }\n for (const result of results) {\n if (result.result.status === \"dirty\") {\n // add issues from dirty option\n ctx.common.issues.push(...result.ctx.common.issues);\n return result.result;\n }\n }\n // return invalid\n const unionErrors = results.map((result) => new ZodError(result.ctx.common.issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors,\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return Promise.all(options.map(async (option) => {\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n parent: null,\n };\n return {\n result: await option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx,\n }),\n ctx: childCtx,\n };\n })).then(handleResults);\n }\n else {\n let dirty = undefined;\n const issues = [];\n for (const option of options) {\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n parent: null,\n };\n const result = option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx,\n });\n if (result.status === \"valid\") {\n return result;\n }\n else if (result.status === \"dirty\" && !dirty) {\n dirty = { result, ctx: childCtx };\n }\n if (childCtx.common.issues.length) {\n issues.push(childCtx.common.issues);\n }\n }\n if (dirty) {\n ctx.common.issues.push(...dirty.ctx.common.issues);\n return dirty.result;\n }\n const unionErrors = issues.map((issues) => new ZodError(issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors,\n });\n return INVALID;\n }\n }\n get options() {\n return this._def.options;\n }\n}\nZodUnion.create = (types, params) => {\n return new ZodUnion({\n options: types,\n typeName: ZodFirstPartyTypeKind.ZodUnion,\n ...processCreateParams(params),\n });\n};\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\n////////// //////////\n////////// ZodDiscriminatedUnion //////////\n////////// //////////\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\nconst getDiscriminator = (type) => {\n if (type instanceof ZodLazy) {\n return getDiscriminator(type.schema);\n }\n else if (type instanceof ZodEffects) {\n return getDiscriminator(type.innerType());\n }\n else if (type instanceof ZodLiteral) {\n return [type.value];\n }\n else if (type instanceof ZodEnum) {\n return type.options;\n }\n else if (type instanceof ZodNativeEnum) {\n // eslint-disable-next-line ban/ban\n return util.objectValues(type.enum);\n }\n else if (type instanceof ZodDefault) {\n return getDiscriminator(type._def.innerType);\n }\n else if (type instanceof ZodUndefined) {\n return [undefined];\n }\n else if (type instanceof ZodNull) {\n return [null];\n }\n else if (type instanceof ZodOptional) {\n return [undefined, ...getDiscriminator(type.unwrap())];\n }\n else if (type instanceof ZodNullable) {\n return [null, ...getDiscriminator(type.unwrap())];\n }\n else if (type instanceof ZodBranded) {\n return getDiscriminator(type.unwrap());\n }\n else if (type instanceof ZodReadonly) {\n return getDiscriminator(type.unwrap());\n }\n else if (type instanceof ZodCatch) {\n return getDiscriminator(type._def.innerType);\n }\n else {\n return [];\n }\n};\nclass ZodDiscriminatedUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const discriminator = this.discriminator;\n const discriminatorValue = ctx.data[discriminator];\n const option = this.optionsMap.get(discriminatorValue);\n if (!option) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union_discriminator,\n options: Array.from(this.optionsMap.keys()),\n path: [discriminator],\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n }\n else {\n return option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n get discriminator() {\n return this._def.discriminator;\n }\n get options() {\n return this._def.options;\n }\n get optionsMap() {\n return this._def.optionsMap;\n }\n /**\n * The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor.\n * However, it only allows a union of objects, all of which need to share a discriminator property. This property must\n * have a different value for each object in the union.\n * @param discriminator the name of the discriminator property\n * @param types an array of object schemas\n * @param params\n */\n static create(discriminator, options, params) {\n // Get all the valid discriminator values\n const optionsMap = new Map();\n // try {\n for (const type of options) {\n const discriminatorValues = getDiscriminator(type.shape[discriminator]);\n if (!discriminatorValues.length) {\n throw new Error(`A discriminator value for key \\`${discriminator}\\` could not be extracted from all schema options`);\n }\n for (const value of discriminatorValues) {\n if (optionsMap.has(value)) {\n throw new Error(`Discriminator property ${String(discriminator)} has duplicate value ${String(value)}`);\n }\n optionsMap.set(value, type);\n }\n }\n return new ZodDiscriminatedUnion({\n typeName: ZodFirstPartyTypeKind.ZodDiscriminatedUnion,\n discriminator,\n options,\n optionsMap,\n ...processCreateParams(params),\n });\n }\n}\nfunction mergeValues(a, b) {\n const aType = getParsedType(a);\n const bType = getParsedType(b);\n if (a === b) {\n return { valid: true, data: a };\n }\n else if (aType === ZodParsedType.object && bType === ZodParsedType.object) {\n const bKeys = util.objectKeys(b);\n const sharedKeys = util\n .objectKeys(a)\n .filter((key) => bKeys.indexOf(key) !== -1);\n const newObj = { ...a, ...b };\n for (const key of sharedKeys) {\n const sharedValue = mergeValues(a[key], b[key]);\n if (!sharedValue.valid) {\n return { valid: false };\n }\n newObj[key] = sharedValue.data;\n }\n return { valid: true, data: newObj };\n }\n else if (aType === ZodParsedType.array && bType === ZodParsedType.array) {\n if (a.length !== b.length) {\n return { valid: false };\n }\n const newArray = [];\n for (let index = 0; index < a.length; index++) {\n const itemA = a[index];\n const itemB = b[index];\n const sharedValue = mergeValues(itemA, itemB);\n if (!sharedValue.valid) {\n return { valid: false };\n }\n newArray.push(sharedValue.data);\n }\n return { valid: true, data: newArray };\n }\n else if (aType === ZodParsedType.date &&\n bType === ZodParsedType.date &&\n +a === +b) {\n return { valid: true, data: a };\n }\n else {\n return { valid: false };\n }\n}\nclass ZodIntersection extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const handleParsed = (parsedLeft, parsedRight) => {\n if (isAborted(parsedLeft) || isAborted(parsedRight)) {\n return INVALID;\n }\n const merged = mergeValues(parsedLeft.value, parsedRight.value);\n if (!merged.valid) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_intersection_types,\n });\n return INVALID;\n }\n if (isDirty(parsedLeft) || isDirty(parsedRight)) {\n status.dirty();\n }\n return { status: status.value, value: merged.data };\n };\n if (ctx.common.async) {\n return Promise.all([\n this._def.left._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }),\n this._def.right._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }),\n ]).then(([left, right]) => handleParsed(left, right));\n }\n else {\n return handleParsed(this._def.left._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }), this._def.right._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }));\n }\n }\n}\nZodIntersection.create = (left, right, params) => {\n return new ZodIntersection({\n left: left,\n right: right,\n typeName: ZodFirstPartyTypeKind.ZodIntersection,\n ...processCreateParams(params),\n });\n};\nclass ZodTuple extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (ctx.data.length < this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: \"array\",\n });\n return INVALID;\n }\n const rest = this._def.rest;\n if (!rest && ctx.data.length > this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: \"array\",\n });\n status.dirty();\n }\n const items = [...ctx.data]\n .map((item, itemIndex) => {\n const schema = this._def.items[itemIndex] || this._def.rest;\n if (!schema)\n return null;\n return schema._parse(new ParseInputLazyPath(ctx, item, ctx.path, itemIndex));\n })\n .filter((x) => !!x); // filter nulls\n if (ctx.common.async) {\n return Promise.all(items).then((results) => {\n return ParseStatus.mergeArray(status, results);\n });\n }\n else {\n return ParseStatus.mergeArray(status, items);\n }\n }\n get items() {\n return this._def.items;\n }\n rest(rest) {\n return new ZodTuple({\n ...this._def,\n rest,\n });\n }\n}\nZodTuple.create = (schemas, params) => {\n if (!Array.isArray(schemas)) {\n throw new Error(\"You must pass an array of schemas to z.tuple([ ... ])\");\n }\n return new ZodTuple({\n items: schemas,\n typeName: ZodFirstPartyTypeKind.ZodTuple,\n rest: null,\n ...processCreateParams(params),\n });\n};\nclass ZodRecord extends ZodType {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const pairs = [];\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n for (const key in ctx.data) {\n pairs.push({\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, key)),\n value: valueType._parse(new ParseInputLazyPath(ctx, ctx.data[key], ctx.path, key)),\n alwaysSet: key in ctx.data,\n });\n }\n if (ctx.common.async) {\n return ParseStatus.mergeObjectAsync(status, pairs);\n }\n else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get element() {\n return this._def.valueType;\n }\n static create(first, second, third) {\n if (second instanceof ZodType) {\n return new ZodRecord({\n keyType: first,\n valueType: second,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(third),\n });\n }\n return new ZodRecord({\n keyType: ZodString.create(),\n valueType: first,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(second),\n });\n }\n}\nclass ZodMap extends ZodType {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.map) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.map,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n const pairs = [...ctx.data.entries()].map(([key, value], index) => {\n return {\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, [index, \"key\"])),\n value: valueType._parse(new ParseInputLazyPath(ctx, value, ctx.path, [index, \"value\"])),\n };\n });\n if (ctx.common.async) {\n const finalMap = new Map();\n return Promise.resolve().then(async () => {\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return { status: status.value, value: finalMap };\n });\n }\n else {\n const finalMap = new Map();\n for (const pair of pairs) {\n const key = pair.key;\n const value = pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return { status: status.value, value: finalMap };\n }\n }\n}\nZodMap.create = (keyType, valueType, params) => {\n return new ZodMap({\n valueType,\n keyType,\n typeName: ZodFirstPartyTypeKind.ZodMap,\n ...processCreateParams(params),\n });\n};\nclass ZodSet extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.set) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.set,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const def = this._def;\n if (def.minSize !== null) {\n if (ctx.data.size < def.minSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minSize.value,\n type: \"set\",\n inclusive: true,\n exact: false,\n message: def.minSize.message,\n });\n status.dirty();\n }\n }\n if (def.maxSize !== null) {\n if (ctx.data.size > def.maxSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxSize.value,\n type: \"set\",\n inclusive: true,\n exact: false,\n message: def.maxSize.message,\n });\n status.dirty();\n }\n }\n const valueType = this._def.valueType;\n function finalizeSet(elements) {\n const parsedSet = new Set();\n for (const element of elements) {\n if (element.status === \"aborted\")\n return INVALID;\n if (element.status === \"dirty\")\n status.dirty();\n parsedSet.add(element.value);\n }\n return { status: status.value, value: parsedSet };\n }\n const elements = [...ctx.data.values()].map((item, i) => valueType._parse(new ParseInputLazyPath(ctx, item, ctx.path, i)));\n if (ctx.common.async) {\n return Promise.all(elements).then((elements) => finalizeSet(elements));\n }\n else {\n return finalizeSet(elements);\n }\n }\n min(minSize, message) {\n return new ZodSet({\n ...this._def,\n minSize: { value: minSize, message: errorUtil.toString(message) },\n });\n }\n max(maxSize, message) {\n return new ZodSet({\n ...this._def,\n maxSize: { value: maxSize, message: errorUtil.toString(message) },\n });\n }\n size(size, message) {\n return this.min(size, message).max(size, message);\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodSet.create = (valueType, params) => {\n return new ZodSet({\n valueType,\n minSize: null,\n maxSize: null,\n typeName: ZodFirstPartyTypeKind.ZodSet,\n ...processCreateParams(params),\n });\n};\nclass ZodFunction extends ZodType {\n constructor() {\n super(...arguments);\n this.validate = this.implement;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.function) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.function,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n function makeArgsIssue(args, error) {\n return makeIssue({\n data: args,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap,\n ctx.schemaErrorMap,\n getErrorMap(),\n errorMap,\n ].filter((x) => !!x),\n issueData: {\n code: ZodIssueCode.invalid_arguments,\n argumentsError: error,\n },\n });\n }\n function makeReturnsIssue(returns, error) {\n return makeIssue({\n data: returns,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap,\n ctx.schemaErrorMap,\n getErrorMap(),\n errorMap,\n ].filter((x) => !!x),\n issueData: {\n code: ZodIssueCode.invalid_return_type,\n returnTypeError: error,\n },\n });\n }\n const params = { errorMap: ctx.common.contextualErrorMap };\n const fn = ctx.data;\n if (this._def.returns instanceof ZodPromise) {\n // Would love a way to avoid disabling this rule, but we need\n // an alias (using an arrow function was what caused 2651).\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const me = this;\n return OK(async function (...args) {\n const error = new ZodError([]);\n const parsedArgs = await me._def.args\n .parseAsync(args, params)\n .catch((e) => {\n error.addIssue(makeArgsIssue(args, e));\n throw error;\n });\n const result = await Reflect.apply(fn, this, parsedArgs);\n const parsedReturns = await me._def.returns._def.type\n .parseAsync(result, params)\n .catch((e) => {\n error.addIssue(makeReturnsIssue(result, e));\n throw error;\n });\n return parsedReturns;\n });\n }\n else {\n // Would love a way to avoid disabling this rule, but we need\n // an alias (using an arrow function was what caused 2651).\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const me = this;\n return OK(function (...args) {\n const parsedArgs = me._def.args.safeParse(args, params);\n if (!parsedArgs.success) {\n throw new ZodError([makeArgsIssue(args, parsedArgs.error)]);\n }\n const result = Reflect.apply(fn, this, parsedArgs.data);\n const parsedReturns = me._def.returns.safeParse(result, params);\n if (!parsedReturns.success) {\n throw new ZodError([makeReturnsIssue(result, parsedReturns.error)]);\n }\n return parsedReturns.data;\n });\n }\n }\n parameters() {\n return this._def.args;\n }\n returnType() {\n return this._def.returns;\n }\n args(...items) {\n return new ZodFunction({\n ...this._def,\n args: ZodTuple.create(items).rest(ZodUnknown.create()),\n });\n }\n returns(returnType) {\n return new ZodFunction({\n ...this._def,\n returns: returnType,\n });\n }\n implement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n strictImplement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n static create(args, returns, params) {\n return new ZodFunction({\n args: (args\n ? args\n : ZodTuple.create([]).rest(ZodUnknown.create())),\n returns: returns || ZodUnknown.create(),\n typeName: ZodFirstPartyTypeKind.ZodFunction,\n ...processCreateParams(params),\n });\n }\n}\nclass ZodLazy extends ZodType {\n get schema() {\n return this._def.getter();\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const lazySchema = this._def.getter();\n return lazySchema._parse({ data: ctx.data, path: ctx.path, parent: ctx });\n }\n}\nZodLazy.create = (getter, params) => {\n return new ZodLazy({\n getter: getter,\n typeName: ZodFirstPartyTypeKind.ZodLazy,\n ...processCreateParams(params),\n });\n};\nclass ZodLiteral extends ZodType {\n _parse(input) {\n if (input.data !== this._def.value) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_literal,\n expected: this._def.value,\n });\n return INVALID;\n }\n return { status: \"valid\", value: input.data };\n }\n get value() {\n return this._def.value;\n }\n}\nZodLiteral.create = (value, params) => {\n return new ZodLiteral({\n value: value,\n typeName: ZodFirstPartyTypeKind.ZodLiteral,\n ...processCreateParams(params),\n });\n};\nfunction createZodEnum(values, params) {\n return new ZodEnum({\n values,\n typeName: ZodFirstPartyTypeKind.ZodEnum,\n ...processCreateParams(params),\n });\n}\nclass ZodEnum extends ZodType {\n constructor() {\n super(...arguments);\n _ZodEnum_cache.set(this, void 0);\n }\n _parse(input) {\n if (typeof input.data !== \"string\") {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type,\n });\n return INVALID;\n }\n if (!__classPrivateFieldGet(this, _ZodEnum_cache, \"f\")) {\n __classPrivateFieldSet(this, _ZodEnum_cache, new Set(this._def.values), \"f\");\n }\n if (!__classPrivateFieldGet(this, _ZodEnum_cache, \"f\").has(input.data)) {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get options() {\n return this._def.values;\n }\n get enum() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Values() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Enum() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n extract(values, newDef = this._def) {\n return ZodEnum.create(values, {\n ...this._def,\n ...newDef,\n });\n }\n exclude(values, newDef = this._def) {\n return ZodEnum.create(this.options.filter((opt) => !values.includes(opt)), {\n ...this._def,\n ...newDef,\n });\n }\n}\n_ZodEnum_cache = new WeakMap();\nZodEnum.create = createZodEnum;\nclass ZodNativeEnum extends ZodType {\n constructor() {\n super(...arguments);\n _ZodNativeEnum_cache.set(this, void 0);\n }\n _parse(input) {\n const nativeEnumValues = util.getValidEnumValues(this._def.values);\n const ctx = this._getOrReturnCtx(input);\n if (ctx.parsedType !== ZodParsedType.string &&\n ctx.parsedType !== ZodParsedType.number) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type,\n });\n return INVALID;\n }\n if (!__classPrivateFieldGet(this, _ZodNativeEnum_cache, \"f\")) {\n __classPrivateFieldSet(this, _ZodNativeEnum_cache, new Set(util.getValidEnumValues(this._def.values)), \"f\");\n }\n if (!__classPrivateFieldGet(this, _ZodNativeEnum_cache, \"f\").has(input.data)) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get enum() {\n return this._def.values;\n }\n}\n_ZodNativeEnum_cache = new WeakMap();\nZodNativeEnum.create = (values, params) => {\n return new ZodNativeEnum({\n values: values,\n typeName: ZodFirstPartyTypeKind.ZodNativeEnum,\n ...processCreateParams(params),\n });\n};\nclass ZodPromise extends ZodType {\n unwrap() {\n return this._def.type;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.promise &&\n ctx.common.async === false) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.promise,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const promisified = ctx.parsedType === ZodParsedType.promise\n ? ctx.data\n : Promise.resolve(ctx.data);\n return OK(promisified.then((data) => {\n return this._def.type.parseAsync(data, {\n path: ctx.path,\n errorMap: ctx.common.contextualErrorMap,\n });\n }));\n }\n}\nZodPromise.create = (schema, params) => {\n return new ZodPromise({\n type: schema,\n typeName: ZodFirstPartyTypeKind.ZodPromise,\n ...processCreateParams(params),\n });\n};\nclass ZodEffects extends ZodType {\n innerType() {\n return this._def.schema;\n }\n sourceType() {\n return this._def.schema._def.typeName === ZodFirstPartyTypeKind.ZodEffects\n ? this._def.schema.sourceType()\n : this._def.schema;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const effect = this._def.effect || null;\n const checkCtx = {\n addIssue: (arg) => {\n addIssueToContext(ctx, arg);\n if (arg.fatal) {\n status.abort();\n }\n else {\n status.dirty();\n }\n },\n get path() {\n return ctx.path;\n },\n };\n checkCtx.addIssue = checkCtx.addIssue.bind(checkCtx);\n if (effect.type === \"preprocess\") {\n const processed = effect.transform(ctx.data, checkCtx);\n if (ctx.common.async) {\n return Promise.resolve(processed).then(async (processed) => {\n if (status.value === \"aborted\")\n return INVALID;\n const result = await this._def.schema._parseAsync({\n data: processed,\n path: ctx.path,\n parent: ctx,\n });\n if (result.status === \"aborted\")\n return INVALID;\n if (result.status === \"dirty\")\n return DIRTY(result.value);\n if (status.value === \"dirty\")\n return DIRTY(result.value);\n return result;\n });\n }\n else {\n if (status.value === \"aborted\")\n return INVALID;\n const result = this._def.schema._parseSync({\n data: processed,\n path: ctx.path,\n parent: ctx,\n });\n if (result.status === \"aborted\")\n return INVALID;\n if (result.status === \"dirty\")\n return DIRTY(result.value);\n if (status.value === \"dirty\")\n return DIRTY(result.value);\n return result;\n }\n }\n if (effect.type === \"refinement\") {\n const executeRefinement = (acc) => {\n const result = effect.refinement(acc, checkCtx);\n if (ctx.common.async) {\n return Promise.resolve(result);\n }\n if (result instanceof Promise) {\n throw new Error(\"Async refinement encountered during synchronous parse operation. Use .parseAsync instead.\");\n }\n return acc;\n };\n if (ctx.common.async === false) {\n const inner = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inner.status === \"aborted\")\n return INVALID;\n if (inner.status === \"dirty\")\n status.dirty();\n // return value is ignored\n executeRefinement(inner.value);\n return { status: status.value, value: inner.value };\n }\n else {\n return this._def.schema\n ._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx })\n .then((inner) => {\n if (inner.status === \"aborted\")\n return INVALID;\n if (inner.status === \"dirty\")\n status.dirty();\n return executeRefinement(inner.value).then(() => {\n return { status: status.value, value: inner.value };\n });\n });\n }\n }\n if (effect.type === \"transform\") {\n if (ctx.common.async === false) {\n const base = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (!isValid(base))\n return base;\n const result = effect.transform(base.value, checkCtx);\n if (result instanceof Promise) {\n throw new Error(`Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.`);\n }\n return { status: status.value, value: result };\n }\n else {\n return this._def.schema\n ._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx })\n .then((base) => {\n if (!isValid(base))\n return base;\n return Promise.resolve(effect.transform(base.value, checkCtx)).then((result) => ({ status: status.value, value: result }));\n });\n }\n }\n util.assertNever(effect);\n }\n}\nZodEffects.create = (schema, effect, params) => {\n return new ZodEffects({\n schema,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect,\n ...processCreateParams(params),\n });\n};\nZodEffects.createWithPreprocess = (preprocess, schema, params) => {\n return new ZodEffects({\n schema,\n effect: { type: \"preprocess\", transform: preprocess },\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n ...processCreateParams(params),\n });\n};\nclass ZodOptional extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.undefined) {\n return OK(undefined);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodOptional.create = (type, params) => {\n return new ZodOptional({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodOptional,\n ...processCreateParams(params),\n });\n};\nclass ZodNullable extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.null) {\n return OK(null);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodNullable.create = (type, params) => {\n return new ZodNullable({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodNullable,\n ...processCreateParams(params),\n });\n};\nclass ZodDefault extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n let data = ctx.data;\n if (ctx.parsedType === ZodParsedType.undefined) {\n data = this._def.defaultValue();\n }\n return this._def.innerType._parse({\n data,\n path: ctx.path,\n parent: ctx,\n });\n }\n removeDefault() {\n return this._def.innerType;\n }\n}\nZodDefault.create = (type, params) => {\n return new ZodDefault({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodDefault,\n defaultValue: typeof params.default === \"function\"\n ? params.default\n : () => params.default,\n ...processCreateParams(params),\n });\n};\nclass ZodCatch extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n // newCtx is used to not collect issues from inner types in ctx\n const newCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n };\n const result = this._def.innerType._parse({\n data: newCtx.data,\n path: newCtx.path,\n parent: {\n ...newCtx,\n },\n });\n if (isAsync(result)) {\n return result.then((result) => {\n return {\n status: \"valid\",\n value: result.status === \"valid\"\n ? result.value\n : this._def.catchValue({\n get error() {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data,\n }),\n };\n });\n }\n else {\n return {\n status: \"valid\",\n value: result.status === \"valid\"\n ? result.value\n : this._def.catchValue({\n get error() {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data,\n }),\n };\n }\n }\n removeCatch() {\n return this._def.innerType;\n }\n}\nZodCatch.create = (type, params) => {\n return new ZodCatch({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodCatch,\n catchValue: typeof params.catch === \"function\" ? params.catch : () => params.catch,\n ...processCreateParams(params),\n });\n};\nclass ZodNaN extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.nan) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.nan,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return { status: \"valid\", value: input.data };\n }\n}\nZodNaN.create = (params) => {\n return new ZodNaN({\n typeName: ZodFirstPartyTypeKind.ZodNaN,\n ...processCreateParams(params),\n });\n};\nconst BRAND = Symbol(\"zod_brand\");\nclass ZodBranded extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const data = ctx.data;\n return this._def.type._parse({\n data,\n path: ctx.path,\n parent: ctx,\n });\n }\n unwrap() {\n return this._def.type;\n }\n}\nclass ZodPipeline extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.common.async) {\n const handleAsync = async () => {\n const inResult = await this._def.in._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inResult.status === \"aborted\")\n return INVALID;\n if (inResult.status === \"dirty\") {\n status.dirty();\n return DIRTY(inResult.value);\n }\n else {\n return this._def.out._parseAsync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx,\n });\n }\n };\n return handleAsync();\n }\n else {\n const inResult = this._def.in._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inResult.status === \"aborted\")\n return INVALID;\n if (inResult.status === \"dirty\") {\n status.dirty();\n return {\n status: \"dirty\",\n value: inResult.value,\n };\n }\n else {\n return this._def.out._parseSync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n }\n static create(a, b) {\n return new ZodPipeline({\n in: a,\n out: b,\n typeName: ZodFirstPartyTypeKind.ZodPipeline,\n });\n }\n}\nclass ZodReadonly extends ZodType {\n _parse(input) {\n const result = this._def.innerType._parse(input);\n const freeze = (data) => {\n if (isValid(data)) {\n data.value = Object.freeze(data.value);\n }\n return data;\n };\n return isAsync(result)\n ? result.then((data) => freeze(data))\n : freeze(result);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodReadonly.create = (type, params) => {\n return new ZodReadonly({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodReadonly,\n ...processCreateParams(params),\n });\n};\nfunction custom(check, params = {}, \n/**\n * @deprecated\n *\n * Pass `fatal` into the params object instead:\n *\n * ```ts\n * z.string().custom((val) => val.length > 5, { fatal: false })\n * ```\n *\n */\nfatal) {\n if (check)\n return ZodAny.create().superRefine((data, ctx) => {\n var _a, _b;\n if (!check(data)) {\n const p = typeof params === \"function\"\n ? params(data)\n : typeof params === \"string\"\n ? { message: params }\n : params;\n const _fatal = (_b = (_a = p.fatal) !== null && _a !== void 0 ? _a : fatal) !== null && _b !== void 0 ? _b : true;\n const p2 = typeof p === \"string\" ? { message: p } : p;\n ctx.addIssue({ code: \"custom\", ...p2, fatal: _fatal });\n }\n });\n return ZodAny.create();\n}\nconst late = {\n object: ZodObject.lazycreate,\n};\nvar ZodFirstPartyTypeKind;\n(function (ZodFirstPartyTypeKind) {\n ZodFirstPartyTypeKind[\"ZodString\"] = \"ZodString\";\n ZodFirstPartyTypeKind[\"ZodNumber\"] = \"ZodNumber\";\n ZodFirstPartyTypeKind[\"ZodNaN\"] = \"ZodNaN\";\n ZodFirstPartyTypeKind[\"ZodBigInt\"] = \"ZodBigInt\";\n ZodFirstPartyTypeKind[\"ZodBoolean\"] = \"ZodBoolean\";\n ZodFirstPartyTypeKind[\"ZodDate\"] = \"ZodDate\";\n ZodFirstPartyTypeKind[\"ZodSymbol\"] = \"ZodSymbol\";\n ZodFirstPartyTypeKind[\"ZodUndefined\"] = \"ZodUndefined\";\n ZodFirstPartyTypeKind[\"ZodNull\"] = \"ZodNull\";\n ZodFirstPartyTypeKind[\"ZodAny\"] = \"ZodAny\";\n ZodFirstPartyTypeKind[\"ZodUnknown\"] = \"ZodUnknown\";\n ZodFirstPartyTypeKind[\"ZodNever\"] = \"ZodNever\";\n ZodFirstPartyTypeKind[\"ZodVoid\"] = \"ZodVoid\";\n ZodFirstPartyTypeKind[\"ZodArray\"] = \"ZodArray\";\n ZodFirstPartyTypeKind[\"ZodObject\"] = \"ZodObject\";\n ZodFirstPartyTypeKind[\"ZodUnion\"] = \"ZodUnion\";\n ZodFirstPartyTypeKind[\"ZodDiscriminatedUnion\"] = \"ZodDiscriminatedUnion\";\n ZodFirstPartyTypeKind[\"ZodIntersection\"] = \"ZodIntersection\";\n ZodFirstPartyTypeKind[\"ZodTuple\"] = \"ZodTuple\";\n ZodFirstPartyTypeKind[\"ZodRecord\"] = \"ZodRecord\";\n ZodFirstPartyTypeKind[\"ZodMap\"] = \"ZodMap\";\n ZodFirstPartyTypeKind[\"ZodSet\"] = \"ZodSet\";\n ZodFirstPartyTypeKind[\"ZodFunction\"] = \"ZodFunction\";\n ZodFirstPartyTypeKind[\"ZodLazy\"] = \"ZodLazy\";\n ZodFirstPartyTypeKind[\"ZodLiteral\"] = \"ZodLiteral\";\n ZodFirstPartyTypeKind[\"ZodEnum\"] = \"ZodEnum\";\n ZodFirstPartyTypeKind[\"ZodEffects\"] = \"ZodEffects\";\n ZodFirstPartyTypeKind[\"ZodNativeEnum\"] = \"ZodNativeEnum\";\n ZodFirstPartyTypeKind[\"ZodOptional\"] = \"ZodOptional\";\n ZodFirstPartyTypeKind[\"ZodNullable\"] = \"ZodNullable\";\n ZodFirstPartyTypeKind[\"ZodDefault\"] = \"ZodDefault\";\n ZodFirstPartyTypeKind[\"ZodCatch\"] = \"ZodCatch\";\n ZodFirstPartyTypeKind[\"ZodPromise\"] = \"ZodPromise\";\n ZodFirstPartyTypeKind[\"ZodBranded\"] = \"ZodBranded\";\n ZodFirstPartyTypeKind[\"ZodPipeline\"] = \"ZodPipeline\";\n ZodFirstPartyTypeKind[\"ZodReadonly\"] = \"ZodReadonly\";\n})(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {}));\nconst instanceOfType = (\n// const instanceOfType = any>(\ncls, params = {\n message: `Input not instance of ${cls.name}`,\n}) => custom((data) => data instanceof cls, params);\nconst stringType = ZodString.create;\nconst numberType = ZodNumber.create;\nconst nanType = ZodNaN.create;\nconst bigIntType = ZodBigInt.create;\nconst booleanType = ZodBoolean.create;\nconst dateType = ZodDate.create;\nconst symbolType = ZodSymbol.create;\nconst undefinedType = ZodUndefined.create;\nconst nullType = ZodNull.create;\nconst anyType = ZodAny.create;\nconst unknownType = ZodUnknown.create;\nconst neverType = ZodNever.create;\nconst voidType = ZodVoid.create;\nconst arrayType = ZodArray.create;\nconst objectType = ZodObject.create;\nconst strictObjectType = ZodObject.strictCreate;\nconst unionType = ZodUnion.create;\nconst discriminatedUnionType = ZodDiscriminatedUnion.create;\nconst intersectionType = ZodIntersection.create;\nconst tupleType = ZodTuple.create;\nconst recordType = ZodRecord.create;\nconst mapType = ZodMap.create;\nconst setType = ZodSet.create;\nconst functionType = ZodFunction.create;\nconst lazyType = ZodLazy.create;\nconst literalType = ZodLiteral.create;\nconst enumType = ZodEnum.create;\nconst nativeEnumType = ZodNativeEnum.create;\nconst promiseType = ZodPromise.create;\nconst effectsType = ZodEffects.create;\nconst optionalType = ZodOptional.create;\nconst nullableType = ZodNullable.create;\nconst preprocessType = ZodEffects.createWithPreprocess;\nconst pipelineType = ZodPipeline.create;\nconst ostring = () => stringType().optional();\nconst onumber = () => numberType().optional();\nconst oboolean = () => booleanType().optional();\nconst coerce = {\n string: ((arg) => ZodString.create({ ...arg, coerce: true })),\n number: ((arg) => ZodNumber.create({ ...arg, coerce: true })),\n boolean: ((arg) => ZodBoolean.create({\n ...arg,\n coerce: true,\n })),\n bigint: ((arg) => ZodBigInt.create({ ...arg, coerce: true })),\n date: ((arg) => ZodDate.create({ ...arg, coerce: true })),\n};\nconst NEVER = INVALID;\n\nvar z = /*#__PURE__*/Object.freeze({\n __proto__: null,\n defaultErrorMap: errorMap,\n setErrorMap: setErrorMap,\n getErrorMap: getErrorMap,\n makeIssue: makeIssue,\n EMPTY_PATH: EMPTY_PATH,\n addIssueToContext: addIssueToContext,\n ParseStatus: ParseStatus,\n INVALID: INVALID,\n DIRTY: DIRTY,\n OK: OK,\n isAborted: isAborted,\n isDirty: isDirty,\n isValid: isValid,\n isAsync: isAsync,\n get util () { return util; },\n get objectUtil () { return objectUtil; },\n ZodParsedType: ZodParsedType,\n getParsedType: getParsedType,\n ZodType: ZodType,\n datetimeRegex: datetimeRegex,\n ZodString: ZodString,\n ZodNumber: ZodNumber,\n ZodBigInt: ZodBigInt,\n ZodBoolean: ZodBoolean,\n ZodDate: ZodDate,\n ZodSymbol: ZodSymbol,\n ZodUndefined: ZodUndefined,\n ZodNull: ZodNull,\n ZodAny: ZodAny,\n ZodUnknown: ZodUnknown,\n ZodNever: ZodNever,\n ZodVoid: ZodVoid,\n ZodArray: ZodArray,\n ZodObject: ZodObject,\n ZodUnion: ZodUnion,\n ZodDiscriminatedUnion: ZodDiscriminatedUnion,\n ZodIntersection: ZodIntersection,\n ZodTuple: ZodTuple,\n ZodRecord: ZodRecord,\n ZodMap: ZodMap,\n ZodSet: ZodSet,\n ZodFunction: ZodFunction,\n ZodLazy: ZodLazy,\n ZodLiteral: ZodLiteral,\n ZodEnum: ZodEnum,\n ZodNativeEnum: ZodNativeEnum,\n ZodPromise: ZodPromise,\n ZodEffects: ZodEffects,\n ZodTransformer: ZodEffects,\n ZodOptional: ZodOptional,\n ZodNullable: ZodNullable,\n ZodDefault: ZodDefault,\n ZodCatch: ZodCatch,\n ZodNaN: ZodNaN,\n BRAND: BRAND,\n ZodBranded: ZodBranded,\n ZodPipeline: ZodPipeline,\n ZodReadonly: ZodReadonly,\n custom: custom,\n Schema: ZodType,\n ZodSchema: ZodType,\n late: late,\n get ZodFirstPartyTypeKind () { return ZodFirstPartyTypeKind; },\n coerce: coerce,\n any: anyType,\n array: arrayType,\n bigint: bigIntType,\n boolean: booleanType,\n date: dateType,\n discriminatedUnion: discriminatedUnionType,\n effect: effectsType,\n 'enum': enumType,\n 'function': functionType,\n 'instanceof': instanceOfType,\n intersection: intersectionType,\n lazy: lazyType,\n literal: literalType,\n map: mapType,\n nan: nanType,\n nativeEnum: nativeEnumType,\n never: neverType,\n 'null': nullType,\n nullable: nullableType,\n number: numberType,\n object: objectType,\n oboolean: oboolean,\n onumber: onumber,\n optional: optionalType,\n ostring: ostring,\n pipeline: pipelineType,\n preprocess: preprocessType,\n promise: promiseType,\n record: recordType,\n set: setType,\n strictObject: strictObjectType,\n string: stringType,\n symbol: symbolType,\n transformer: effectsType,\n tuple: tupleType,\n 'undefined': undefinedType,\n union: unionType,\n unknown: unknownType,\n 'void': voidType,\n NEVER: NEVER,\n ZodIssueCode: ZodIssueCode,\n quotelessJson: quotelessJson,\n ZodError: ZodError\n});\n\nexport { BRAND, DIRTY, EMPTY_PATH, INVALID, NEVER, OK, ParseStatus, ZodType as Schema, ZodAny, ZodArray, ZodBigInt, ZodBoolean, ZodBranded, ZodCatch, ZodDate, ZodDefault, ZodDiscriminatedUnion, ZodEffects, ZodEnum, ZodError, ZodFirstPartyTypeKind, ZodFunction, ZodIntersection, ZodIssueCode, ZodLazy, ZodLiteral, ZodMap, ZodNaN, ZodNativeEnum, ZodNever, ZodNull, ZodNullable, ZodNumber, ZodObject, ZodOptional, ZodParsedType, ZodPipeline, ZodPromise, ZodReadonly, ZodRecord, ZodType as ZodSchema, ZodSet, ZodString, ZodSymbol, ZodEffects as ZodTransformer, ZodTuple, ZodType, ZodUndefined, ZodUnion, ZodUnknown, ZodVoid, addIssueToContext, anyType as any, arrayType as array, bigIntType as bigint, booleanType as boolean, coerce, custom, dateType as date, datetimeRegex, z as default, errorMap as defaultErrorMap, discriminatedUnionType as discriminatedUnion, effectsType as effect, enumType as enum, functionType as function, getErrorMap, getParsedType, instanceOfType as instanceof, intersectionType as intersection, isAborted, isAsync, isDirty, isValid, late, lazyType as lazy, literalType as literal, makeIssue, mapType as map, nanType as nan, nativeEnumType as nativeEnum, neverType as never, nullType as null, nullableType as nullable, numberType as number, objectType as object, objectUtil, oboolean, onumber, optionalType as optional, ostring, pipelineType as pipeline, preprocessType as preprocess, promiseType as promise, quotelessJson, recordType as record, setType as set, setErrorMap, strictObjectType as strictObject, stringType as string, symbolType as symbol, effectsType as transformer, tupleType as tuple, undefinedType as undefined, unionType as union, unknownType as unknown, util, voidType as void, z };\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","\r\nimport * as ex from \"excalibur\";\r\nimport { Player } from './player';\r\nimport { Resources, loader } from \"./resources\";\r\nex.Flags.useLegacyImageRenderer();\r\nconst game = new ex.Engine({\r\n resolution: {\r\n width: 256,\r\n height: 256,\r\n },\r\n suppressPlayButton: false,\r\n pixelArt: true,\r\n pixelRatio: 4,\r\n displayMode: ex.DisplayMode.FitScreen,\r\n});\r\n\r\ngame.start(loader).then(() => {\r\n console.log('Game start!');\r\n\r\n Resources.LdtkAutoTile.addToScene(game.currentScene, {\r\n pos: ex.vec(0, 0)\r\n });\r\n});"],"names":[],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"autotile/autotile.js","mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD,O;;;;;;;;;;;;;;;ACVuD;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC,qCAAqC;AACrC,qCAAqC;AACrC,sCAAsC;AACtC,sCAAsC;AACtC;AACA;AACO;AACP;AACA;AACA;AACA;AACA,gBAAgB,oEAAe;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,UAAU;AACxF;AACA;AACA,6DAA6D,2BAA2B;AACxF;AACA;AACA,mC;;;;;;;;;;;;;;;AC3C+D;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA,eAAe,2DAAgB;AAC/B,eAAe,2DAAgB;AAC/B;AACA;AACA;AACA;AACA,cAAc,0DAAe;AAC7B;AACA;AACA;AACA;AACA,eAAe,0DAAe;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA,2C;;;;;;;;;;;;;;;;AC5BO;AACA;AACP;AACA;AACA;AACA;AACA;AACA,+DAA+D,QAAQ;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP,oBAAoB,kCAAkC;AACtD;AACA;AACA;AACA;AACA;AACA;AACA,iC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB,0BAAmB,EAAE,8BAAmB;;AAExD,8BAAmB,GAAG,0BAAmB;AACzC,qBAAqB,8BAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,4GAA4G,8BAAmB;AAC/H,iIAAiI,8BAAmB;AACpJ,qGAAqG,8BAAmB;AACxH,0HAA0H,8BAAmB;AAC7I;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD,iDAAiD;AACjD,gDAAgD;AAChD,+CAA+C;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,8FAA8F,MAAM,YAAY,aAAa,WAAW,YAAY,WAAW,MAAM,OAAO,aAAa,WAAW,YAAY,aAAa,WAAW,YAAY,WAAW,YAAY,WAAW,UAAU,YAAY,OAAO,OAAO,aAAa,cAAc,yBAAyB,yBAAyB,yBAAyB,yBAAyB,aAAa,OAAO,OAAO,MAAM,KAAK,YAAY,WAAW,YAAY,aAAa,WAAW,UAAU,UAAU,UAAU,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,UAAU,YAAY,WAAW,UAAU,MAAM,MAAM,YAAY,OAAO,KAAK,YAAY,aAAa,OAAO,KAAK,YAAY,OAAO,KAAK,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,MAAM,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,MAAM,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,MAAM,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,MAAM,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,kFAAkF,4BAA4B,yBAAyB,mBAAmB,yBAAyB,mBAAmB,0BAA0B,4BAA4B,kCAAkC,uCAAuC,gBAAgB,4BAA4B,0BAA0B,qBAAqB,8BAA8B,sBAAsB,0BAA0B,qBAAqB,sBAAsB,yBAAyB,mFAAmF,+BAA+B,4BAA4B,4DAA4D,0FAA0F,sEAAsE,0EAA0E,iEAAiE,KAAK,qCAAqC,oBAAoB,KAAK,uCAAuC,yBAAyB,kBAAkB,wBAAwB,8DAA8D,iBAAiB,gBAAgB,eAAe,gBAAgB,KAAK,sCAAsC,yBAAyB,kBAAkB,wBAAwB,iBAAiB,gBAAgB,0BAA0B,kBAAkB,mBAAmB,KAAK,qEAAqE,0BAA0B,KAAK,qCAAqC,8BAA8B,2BAA2B,KAAK,sCAAsC,6BAA6B,KAAK,4CAA4C,YAAY,mBAAmB,OAAO,UAAU,mBAAmB,OAAO,KAAK,uEAAuE,YAAY,mBAAmB,OAAO,UAAU,mBAAmB,OAAO,KAAK,6FAA6F,YAAY,mBAAmB,OAAO,UAAU,mBAAmB,OAAO,KAAK,2EAA2E,YAAY,mBAAmB,OAAO,UAAU,mBAAmB,OAAO,KAAK,qEAAqE,YAAY,mBAAmB,OAAO,UAAU,mBAAmB,OAAO,KAAK,uBAAuB;AAClmH;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,gBAAgB,0BAAmB,EAAE,+BAAmB;;AAExD,+BAAmB,GAAG,0BAAmB;AACzC,qBAAqB,+BAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,4GAA4G,+BAAmB;AAC/H,iIAAiI,+BAAmB;AACpJ,qGAAqG,+BAAmB;AACxH,0HAA0H,+BAAmB;AAC7I;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,mFAAmF,YAAY,WAAW,UAAU,UAAU,UAAU,MAAM,KAAK,UAAU,YAAY,WAAW,aAAa,WAAW,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,OAAO,KAAK,YAAY,+CAA+C,yBAAyB,gBAAgB,qBAAqB,gBAAgB,aAAa,KAAK,2BAA2B,iBAAiB,yBAAyB,oBAAoB,qCAAqC,wBAAwB,sBAAsB,sBAAsB,8BAA8B,yBAAyB,gCAAgC,2CAA2C,KAAK,kCAAkC,6BAA6B,KAAK,uBAAuB;AACr2B;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA,gDAAgD;AAChD;AACA;AACA,qFAAqF;AACrF;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,qBAAqB;AACrB;AACA;AACA,qBAAqB;AACrB;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,iBAAiB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,qBAAqB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,sFAAsF,qBAAqB;AAC3G;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,iDAAiD,qBAAqB;AACtE;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,sDAAsD,qBAAqB;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAO;;AAEP;AACA;AACA;AACA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,cAAc;AACrE;AACA;AACA;AACA;AACA;;AAEA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,2GAA2G,oCAAoC,mEAAmE,8DAA8D,uEAAuE,yCAAyC,2BAA2B,qBAAqB,wEAAwE,+BAA+B,uCAAuC,mHAAmH,oCAAoC,wEAAwE,iDAAiD,kHAAkH,4JAA4J,yCAAyC,uCAAuC,2CAA2C,2BAA2B,wEAAwE,kDAAkD,8CAA8C,6BAA6B,KAAK;;AAE57C,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,wGAAwG,yCAAyC,kBAAkB,0CAA0C,wBAAwB,wBAAwB,qBAAqB,8BAA8B,2BAA2B,mCAAmC,gCAAgC,8BAA8B,yBAAyB,6HAA6H,uDAAuD,sFAAsF,gFAAgF,mGAAmG,+GAA+G,KAAK;;AAEt/B,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6GAA6G,0CAA0C,mFAAmF,gCAAgC,iCAAiC,2BAA2B,uBAAuB,+CAA+C,yBAAyB,qBAAqB,2BAA2B,mJAAmJ,qCAAqC,oCAAoC,8BAA8B,iDAAiD,oCAAoC,KAAK,oDAAoD,8CAA8C,KAAK,yDAAyD,0CAA0C,KAAK,iGAAiG,mDAAmD,6CAA6C,KAAK,oBAAoB,+PAA+P,sJAAsJ,wDAAwD,wDAAwD,wEAAwE,oCAAoC,iCAAiC,KAAK;;AAEz2D,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,oHAAoH,0CAA0C,wBAAwB,4CAA4C,6CAA6C,6CAA6C,6CAA6C,8CAA8C,wBAAwB,+FAA+F,mBAAmB,sEAAsE,yDAAyD,mCAAmC,6CAA6C,sBAAsB,6CAA6C,sBAAsB,2CAA2C,oBAAoB,8BAA8B,oBAAoB,uOAAuO,+DAA+D,2EAA2E,gCAAgC,8BAA8B,0BAA0B,0BAA0B,oBAAoB,wCAAwC,sBAAsB,KAAK;;AAEp/C,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6GAA6G,0CAA0C,yDAAyD,mFAAmF,gCAAgC,yCAAyC,uBAAuB,sBAAsB,2BAA2B,mJAAmJ,qCAAqC,sCAAsC,8BAA8B,iDAAiD,sCAAsC,KAAK,oBAAoB,iQAAiQ,uJAAuJ,gCAAgC,6BAA6B,KAAK;;AAE1vC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,wGAAwG,yCAAyC,wBAAwB,+CAA+C,wBAAwB,wCAAwC,mBAAmB,0DAA0D,kCAAkC,uBAAuB,oBAAoB,8BAA8B,oBAAoB,mHAAmH,wFAAwF,qFAAqF,wBAAwB,uGAAuG,kDAAkD,KAAK;;AAE17B,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6GAA6G,yCAAyC,2BAA2B,qBAAqB,0BAA0B,KAAK;;AAErO,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,wGAAwG,oBAAoB,8BAA8B,8BAA8B,qBAAqB,6HAA6H,4DAA4D,KAAK;;AAE3Y,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6GAA6G,kCAAkC,4BAA4B,4BAA4B,gCAAgC,0BAA0B,sBAAsB,+BAA+B,+BAA+B,yBAAyB,uBAAuB,oBAAoB,kDAAkD,2BAA2B,8DAA8D,uBAAuB,0CAA0C,wCAAwC,yMAAyM,+CAA+C,mDAAmD,QAAQ,MAAM,6DAA6D,+CAA+C,sCAAsC,yCAAyC,6DAA6D,sEAAsE,8BAA8B,qEAAqE,kDAAkD,qCAAqC,OAAO,KAAK;;AAE18C,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6GAA6G,8BAA8B,4BAA4B,yBAAyB,uBAAuB,6BAA6B,0BAA0B,6BAA6B,4BAA4B,0BAA0B,kCAAkC,2CAA2C,uCAAuC,wCAAwC,+CAA+C,sCAAsC,uGAAuG,2BAA2B,4BAA4B,mCAAmC,0BAA0B,gBAAgB,8DAA8D,6NAA6N,wDAAwD,4FAA4F,2DAA2D,6CAA6C,2DAA2D,oGAAoG,wDAAwD,iDAAiD,4GAA4G,yEAAyE,+FAA+F,UAAU,sDAAsD,oFAAoF,wGAAwG,iEAAiE,qGAAqG,KAAK;;AAEvxE,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iHAAiH,yBAAyB,2BAA2B,qBAAqB,8CAA8C,2CAA2C,wBAAwB,4BAA4B,4DAA4D,sEAAsE,gCAAgC,sCAAsC,wBAAwB,KAAK;;AAE5iB,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,wGAAwG,oBAAoB,oBAAoB,0BAA0B,0BAA0B,qBAAqB,0DAA0D,kCAAkC,wBAAwB,KAAK;;AAElV,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iHAAiH,oCAAoC,wBAAwB,+EAA+E,8DAA8D,wEAAwE,qDAAqD,2BAA2B,qBAAqB,wIAAwI,qCAAqC,kDAAkD,uCAAuC,kDAAkD,uCAAuC,kHAAkH,8BAA8B,UAAU,MAAM,oCAAoC,SAAS,iCAAiC,qCAAqC,yEAAyE,0EAA0E,gDAAgD,4CAA4C,0JAA0J,4EAA4E,8DAA8D,YAAY,gKAAgK,4EAA4E,8DAA8D,YAAY,2BAA2B,yMAAyM,4EAA4E,2NAA2N,+FAA+F,0FAA0F,YAAY,gDAAgD,4CAA4C,yCAAyC,yEAAyE,mCAAmC,4CAA4C,YAAY,0EAA0E,qEAAqE,qCAAqC,KAAK;;AAEhmG,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,wGAAwG,yCAAyC,kBAAkB,uBAAuB,oBAAoB,0CAA0C,wBAAwB,wBAAwB,qBAAqB,8BAA8B,2BAA2B,mCAAmC,gCAAgC,8BAA8B,yBAAyB,6HAA6H,uDAAuD,kDAAkD,sFAAsF,gFAAgF,mGAAmG,+GAA+G,KAAK;;AAEnlC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6GAA6G,mEAAmE,uDAAuD,2BAA2B,qBAAqB,kDAAkD,KAAK;;AAE9U,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,wGAAwG,2BAA2B,wBAAwB,qBAAqB,+CAA+C,oFAAoF,KAAK;;AAExT,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6GAA6G,gDAAgD,6EAA6E,kDAAkD,kDAAkD,2BAA2B,qBAAqB,6CAA6C,yGAAyG,oEAAoE,uEAAuE,+CAA+C,cAAc,cAAc,2CAA2C,qEAAqE,wCAAwC,yCAAyC,QAAQ,uBAAuB,8DAA8D,iDAAiD,wCAAwC,QAAQ,uBAAuB,4DAA4D,wCAAwC,mDAAmD,OAAO,2DAA2D,kGAAkG,8EAA8E,iFAAiF,oBAAoB,4BAA4B,uBAAuB,8CAA8C,sDAAsD,sDAAsD,kCAAkC,yBAAyB,0DAA0D,+BAA+B,QAAQ,MAAM,oCAAoC,OAAO,KAAK;;AAE7gE,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,8EAA8E,gCAAmB;AACjG,qEAAqE,gCAAmB;AACxF,wEAAwE,gCAAmB;AAC3F,+EAA+E,gCAAmB;AAClG,uEAAuE,gCAAmB;AAC1F,uEAAuE,gCAAmB;AAC1F,yEAAyE,gCAAmB;AAC5F,0EAA0E,gCAAmB;AAC7F,yEAAyE,gCAAmB;AAC5F,yEAAyE,gCAAmB;AAC5F,4EAA4E,gCAAmB;AAC/F,uEAAuE,gCAAmB;AAC1F,uEAAuE,gCAAmB;AAC1F,uEAAuE,gCAAmB;AAC1F,sEAAsE,gCAAmB;AACzF,uEAAuE,gCAAmB;AAC1F,qEAAqE,gCAAmB;AACxF,wEAAwE,gCAAmB;AAC3F,sEAAsE,gCAAmB;AACzF,8DAA8D,gCAAmB;AACjF,uEAAuE,gCAAmB;AAC1F,wEAAwE,gCAAmB;AAC3F,wEAAwE,gCAAmB;;;;;;;;;;;;;;;;;;;;;;;;AAwB3F;AACA;AACA,IAAI,2BAA2B;AAC/B;AACA,QAAQ,iBAAiB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,gCAAmB;;AAEnF;AACA;AACA;AACA,kCAAkC,uCAAuC;AACzE,oDAAoD,eAAe;AACnE;AACA,qBAAqB,wBAAwB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,gCAAmB;AACnF,uEAAuE,gCAAmB;;;AAG1F;AACA;AACA,IAAI,0BAA0B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,oFAAoF,gCAAmB;AACvG,gEAAgE,gCAAmB;;;AAGnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,gCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+EAA+E,gCAAmB;AAClG,8DAA8D,gCAAmB;AACjF,8DAA8D,gCAAmB;AACjF,8DAA8D,gCAAmB;AACjF,8DAA8D,gCAAmB;AACjF,gEAAgE,gCAAmB;;;;AAInF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+EAA+E,gCAAmB;AAClG,8DAA8D,gCAAmB;AACjF,8DAA8D,gCAAmB;AACjF,8DAA8D,gCAAmB;AACjF,8DAA8D,gCAAmB;AACjF,gEAAgE,gCAAmB;;;;AAInF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,gCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,gCAAmB;AACnF,0EAA0E,gCAAmB;;;AAG7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,0GAA0G,gCAAmB;AAC7H,6GAA6G,gCAAmB;AAChI,qEAAqE,gCAAmB;AACxF,gEAAgE,gCAAmB;;;;;AAKnF;AACA,2BAA2B,yDAAyD;AACpF;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6GAA6G,gCAAmB;AAChI,0GAA0G,gCAAmB;AAC7H,qEAAqE,gCAAmB;AACxF,gEAAgE,gCAAmB;;;;;AAKnF;AACA,2BAA2B,sDAAsD;AACjF;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,oFAAoF,gCAAmB;AACvG,kEAAkE,gCAAmB;AACrF,gEAAgE,gCAAmB;;;;AAInF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,oFAAoF,gCAAmB;AACvG,gEAAgE,gCAAmB;;;AAGnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,0GAA0G,gCAAmB;AAC7H,6GAA6G,gCAAmB;AAChI,qEAAqE,gCAAmB;AACxF,gEAAgE,gCAAmB;;;;;AAKnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,0GAA0G,iCAAmB;AAC7H,6GAA6G,iCAAmB;AAChI,qEAAqE,iCAAmB;AACxF,gEAAgE,iCAAmB;;;;;AAKnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,0GAA0G,iCAAmB;AAC7H,6GAA6G,iCAAmB;AAChI,8DAA8D,iCAAmB;AACjF,8DAA8D,iCAAmB;AACjF,qEAAqE,iCAAmB;AACxF,8EAA8E,iCAAmB;AACjG,kEAAkE,iCAAmB;AACrF,gEAAgE,iCAAmB;;;;;;;;AAQnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,0GAA0G,iCAAmB;AAC7H,6GAA6G,iCAAmB;AAChI,8DAA8D,iCAAmB;AACjF,8DAA8D,iCAAmB;AACjF,qEAAqE,iCAAmB;AACxF,8EAA8E,iCAAmB;AACjG,gEAAgE,iCAAmB;;;;;;;AAOnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;;AAEnF;AACA,iCAAiC,gBAAgB,MAAM,wBAAwB;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;;;AAG1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;;;AAG1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,6GAA6G,iCAAmB;AAChI,0GAA0G,iCAAmB;AAC7H,mEAAmE,iCAAmB;AACtF,8DAA8D,iCAAmB;AACjF,8DAA8D,iCAAmB;;;;;;AAMjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,8DAA8D,iCAAmB;AACjF,6GAA6G,iCAAmB;AAChI,0GAA0G,iCAAmB;AAC7H,mEAAmE,iCAAmB;AACtF,8DAA8D,iCAAmB;;;;;;;AAOjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,0GAA0G,iCAAmB;AAC7H,6GAA6G,iCAAmB;AAChI,gEAAgE,iCAAmB;AACnF,8DAA8D,iCAAmB;AACjF,8DAA8D,iCAAmB;;;;;;AAMjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,0GAA0G,iCAAmB;AAC7H,6GAA6G,iCAAmB;AAChI,gEAAgE,iCAAmB;AACnF,8DAA8D,iCAAmB;AACjF,8DAA8D,iCAAmB;;;;;;AAMjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,uEAAuE,iCAAmB;AAC1F,yFAAyF,iCAAmB;AAC5G,0GAA0G,iCAAmB;AAC7H,6GAA6G,iCAAmB;;;;;AAKhI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+EAA+E,iCAAmB;AAClG,sFAAsF,iCAAmB;AACzG,0EAA0E,iCAAmB;;;;AAI7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,uEAAuE,iCAAmB;AAC1F,qEAAqE,iCAAmB;AACxF,gEAAgE,iCAAmB;AACnF,+EAA+E,iCAAmB;AAClG,gFAAgF,iCAAmB;AACnG,uEAAuE,iCAAmB;AAC1F,8EAA8E,iCAAmB;AACjG,sEAAsE,iCAAmB;AACzF,oEAAoE,iCAAmB;AACvF,uEAAuE,iCAAmB;AAC1F,wEAAwE,iCAAmB;AAC3F,sEAAsE,iCAAmB;AACzF,wEAAwE,iCAAmB;AAC3F,sEAAsE,iCAAmB;AACzF,wEAAwE,iCAAmB;AAC3F,wEAAwE,iCAAmB;AAC3F,0EAA0E,iCAAmB;AAC7F,0EAA0E,iCAAmB;AAC7F,yEAAyE,iCAAmB;AAC5F,yEAAyE,iCAAmB;AAC5F,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;AAC1F,yEAAyE,iCAAmB;AAC5F,yEAAyE,iCAAmB;AAC5F,2EAA2E,iCAAmB;AAC9F,wEAAwE,iCAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8B3F,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,iEAAiE,iCAAmB;AACpF,kEAAkE,iCAAmB;AACrF,qEAAqE,iCAAmB;AACxF,kFAAkF,iCAAmB;AACrG,kFAAkF,iCAAmB;AACrG,sFAAsF,iCAAmB;AACzG,6GAA6G,iCAAmB;AAChI,0GAA0G,iCAAmB;AAC7H,oFAAoF,iCAAmB;AACvG,6EAA6E,iCAAmB;AAChG,sFAAsF,iCAAmB;AACzG,oFAAoF,iCAAmB;AACvG,oEAAoE,iCAAmB;AACvF,0EAA0E,iCAAmB;AAC7F,gFAAgF,iCAAmB;AACnG,mFAAmF,iCAAmB;AACtG,0EAA0E,iCAAmB;AAC7F,sEAAsE,iCAAmB;;;;;;;;;;;;;;;;;;;AAmBzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,gBAAgB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qGAAqG,qBAAqB;AAC1H;AACA;AACA;AACA;AACA;AACA,qGAAqG,qBAAqB;AAC1H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uMAAuM;AACvN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE,IAAI;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,oBAAoB;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oGAAoG,IAAI;AACxG;AACA,8FAA8F,eAAe;AAC7G;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,qBAAqB;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uGAAuG,IAAI;AAC3G;AACA,6FAA6F,eAAe;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,UAAU;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,yBAAyB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wGAAwG,IAAI;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0GAA0G,IAAI;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,sBAAsB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,uBAAuB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,8EAA8E,iCAAmB;AACjG,qEAAqE,iCAAmB;AACxF,mEAAmE,iCAAmB;AACtF,gEAAgE,iCAAmB;AACnF,+EAA+E,iCAAmB;AAClG,kEAAkE,iCAAmB;AACrF,4EAA4E,iCAAmB;AAC/F,sEAAsE,iCAAmB;AACzF,kEAAkE,iCAAmB;AACrF,oEAAoE,iCAAmB;AACvF,2EAA2E,iCAAmB;;;;;;;;;;;;AAY9F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,oCAAoC;AACjE;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,wCAAwC;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,iCAAiC;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,oCAAoC;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,oCAAoC;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oBAAoB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,iBAAiB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,iBAAiB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE,gBAAgB;AACrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE,gBAAgB;AACrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,yCAAyC;AAChG,mBAAmB,kBAAkB;AACrC,qBAAqB,kBAAkB,cAAc,iBAAiB;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,sBAAsB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wGAAwG,IAAI;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,uBAAuB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yGAAyG,IAAI;AAC7G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yGAAyG,IAAI;AAC7G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,uEAAuE,iCAAmB;AAC1F,6GAA6G,iCAAmB;AAChI,0GAA0G,iCAAmB;AAC7H,yFAAyF,iCAAmB;AAC5G,8EAA8E,iCAAmB;AACjG,4DAA4D,iCAAmB;AAC/E,oEAAoE,iCAAmB;AACvF,4EAA4E,iCAAmB;AAC/F,wEAAwE,iCAAmB;AAC3F,sEAAsE,iCAAmB;AACzF,uEAAuE,iCAAmB;;;;;;;;;;;;;AAa1F;AACA;AACA;AACA;AACA;AACA,CAAC,0CAA0C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4EAA4E;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,gCAAgC;AAChD;AACA;AACA;AACA;AACA,sCAAsC,0BAA0B;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8GAA8G,qBAAqB;AACnI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,8BAA8B;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,oCAAoC;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,2BAA2B,MAAM,8BAA8B;AACnH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,uBAAuB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,+DAA+D,iCAAmB;AAClF,8DAA8D,iCAAmB;;;;AAIjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,sBAAsB;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,gBAAgB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E,OAAO;AACjF;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,+EAA+E,iCAAmB;AAClG,yFAAyF,iCAAmB;AAC5G,gEAAgE,iCAAmB;AACnF,yEAAyE,iCAAmB;AAC5F,qEAAqE,iCAAmB;AACxF,qFAAqF,iCAAmB;AACxG,yEAAyE,iCAAmB;AAC5F,sEAAsE,iCAAmB;AACzF,+DAA+D,iCAAmB;;;;;;;;;;;AAWlF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,sCAAsC;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,+CAA+C;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,2CAA2C;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,4BAA4B;AAChD;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,4EAA4E,iCAAmB;AAC/F,yEAAyE,iCAAmB;AAC5F,sEAAsE,iCAAmB;AACzF,0EAA0E,iCAAmB;AAC7F,qEAAqE,iCAAmB;AACxF,gEAAgE,iCAAmB;AACnF,kEAAkE,iCAAmB;AACrF,8EAA8E,iCAAmB;AACjG,4EAA4E,iCAAmB;AAC/F,+DAA+D,iCAAmB;AAClF,mEAAmE,iCAAmB;;;;;;;;;;;;;AAatF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qFAAqF,aAAa;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oFAAoF,gBAAgB;AACpG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,YAAY,IAAI,KAAK,cAAc;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,2EAA2E,iCAAmB;AAC9F,qEAAqE,iCAAmB;AACxF,kEAAkE,iCAAmB;AACrF,mEAAmE,iCAAmB;;;;;AAKtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C,4BAA4B,mBAAmB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,4DAA4D,iCAAmB;AAC/E,sEAAsE,iCAAmB;;;;AAIzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,wEAAwE,iCAAmB;AAC3F,oFAAoF,iCAAmB;AACvG,yEAAyE,iCAAmB;AAC5F,sEAAsE,iCAAmB;AACzF,wEAAwE,iCAAmB;AAC3F,2EAA2E,iCAAmB;AAC9F,qEAAqE,iCAAmB;AACxF,+EAA+E,iCAAmB;AAClG,wEAAwE,iCAAmB;AAC3F,4EAA4E,iCAAmB;;;;;;;;;;;AAW/F,2EAA2E;AAC3E,6EAA6E;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,uBAAuB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,0DAA0D,iCAAmB;AAC7E,wEAAwE,iCAAmB;AAC3F,yEAAyE,iCAAmB;AAC5F,qEAAqE,iCAAmB;AACxF,qEAAqE,iCAAmB;AACxF,+EAA+E,iCAAmB;AAClG,iGAAiG,iCAAmB;AACpH,kEAAkE,iCAAmB;AACrF,uEAAuE,iCAAmB;;;;;;;;;;AAU1F;AACA;AACA;AACA;AACA;AACA,sDAAsD,4BAA4B;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,4EAA4E,iCAAmB;AAC/F,wEAAwE,iCAAmB;AAC3F,yEAAyE,iCAAmB;AAC5F,0EAA0E,iCAAmB;AAC7F,2EAA2E,iCAAmB;AAC9F,qEAAqE,iCAAmB;AACxF,kEAAkE,iCAAmB;AACrF,8EAA8E,iCAAmB;AACjG,4EAA4E,iCAAmB;AAC/F,+DAA+D,iCAAmB;;;;;;;;;;;;AAYlF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qFAAqF,aAAa;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kFAAkF,aAAa;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,sEAAsE,iCAAmB;AACzF,uEAAuE,iCAAmB;AAC1F,6EAA6E,iCAAmB;AAChG,wEAAwE,iCAAmB;AAC3F,0EAA0E,iCAAmB;AAC7F,2EAA2E,iCAAmB;AAC9F,qEAAqE,iCAAmB;AACxF,kEAAkE,iCAAmB;AACrF,+EAA+E,iCAAmB;AAClG,kEAAkE,iCAAmB;AACrF,0DAA0D,iCAAmB;AAC7E,0DAA0D,iCAAmB;AAC7E,2DAA2D,iCAAmB;AAC9E,2DAA2D,iCAAmB;AAC9E,2EAA2E,iCAAmB;AAC9F,+DAA+D,iCAAmB;AAClF,wEAAwE,iCAAmB;;;;;;;;;;;;;;;AAe3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,yBAAyB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,8BAA8B,eAAe,4BAA4B;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,4BAA4B;AACrF;AACA;AACA;AACA,wBAAwB,4BAA4B;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,4BAA4B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,iBAAiB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,iBAAiB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,iBAAiB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,iBAAiB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,SAAS;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,SAAS;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,qBAAqB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,qBAAqB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,0BAA0B;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qFAAqF,gBAAgB;AACrG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qFAAqF,gBAAgB;AACrG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oEAAoE,OAAO;AAC3E;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,2EAA2E,iCAAmB;AAC9F,qEAAqE,iCAAmB;AACxF,4EAA4E,iCAAmB;AAC/F,mEAAmE,iCAAmB;;;;;AAKtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,+BAA+B;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,+BAA+B;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yEAAyE,iCAAmB;AAC5F,wEAAwE,iCAAmB;AAC3F,sEAAsE,iCAAmB;AACzF,qEAAqE,iCAAmB;AACxF,qEAAqE,iCAAmB;AACxF,2EAA2E,iCAAmB;AAC9F,0DAA0D,iCAAmB;;;;;;;;AAQ7E;AACA;AACA;AACA;AACA;AACA,yDAAyD,0BAA0B;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,sBAAsB,gDAAgD;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,sBAAsB,oCAAoC;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,sBAAsB,gCAAgC;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,qCAAqC,4BAA4B;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gFAAgF,iCAAmB;AACnG,0GAA0G,iCAAmB;AAC7H,6GAA6G,iCAAmB;AAChI,sFAAsF,iCAAmB;AACzG,iEAAiE,iCAAmB;AACpF,yEAAyE,iCAAmB;AAC5F,6EAA6E,iCAAmB;AAChG,gFAAgF,iCAAmB;AACnG,2EAA2E,iCAAmB;AAC9F,qFAAqF,iCAAmB;AACxG,yEAAyE,iCAAmB;AAC5F,kFAAkF,iCAAmB;AACrG,sEAAsE,iCAAmB;AACzF,wEAAwE,iCAAmB;;;;;;;;;;;;;;;AAe3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,0CAA0C;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA,2BAA2B,gBAAgB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,sCAAsC;;;AAGvC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,uEAAuE,iCAAmB;AAC1F,8DAA8D,iCAAmB;AACjF,uEAAuE,iCAAmB;;;;AAI1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,kEAAkE,iCAAmB;AACrF,uEAAuE,iCAAmB;AAC1F,0DAA0D,iCAAmB;;;;;AAK7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,8DAA8D,iCAAmB;AACjF,sEAAsE,iCAAmB;AACzF,kEAAkE,iCAAmB;AACrF,kEAAkE,iCAAmB;AACrF,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;AAC1F,qFAAqF,iCAAmB;AACxG,8EAA8E,iCAAmB;AACjG,qEAAqE,iCAAmB;AACxF,4DAA4D,iCAAmB;;;;;;;;;;;;AAY/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,uDAAuD,OAAO;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8FAA8F;AAC9F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;;;AAG1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,UAAU,GAAG,UAAU;AAC9C;AACA;AACA,uBAAuB,UAAU,GAAG,UAAU;AAC9C;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,qEAAqE,iCAAmB;;;AAGxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,qEAAqE,iCAAmB;AACxF,yEAAyE,iCAAmB;AAC5F,qEAAqE,iCAAmB;;;;;AAKxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,EAAE,GAAG,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,aAAa;AAC7C,mCAAmC,cAAc;AACjD;AACA;AACA;AACA;AACA,wCAAwC,yBAAyB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,yBAAyB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,mBAAmB;AACrD,qCAAqC,oBAAoB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,mBAAmB;AAC7D,6CAA6C,oBAAoB;AACjE;AACA;AACA;AACA;AACA;AACA,0CAA0C,mBAAmB;AAC7D,6CAA6C,oBAAoB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,4DAA4D,iCAAmB;AAC/E,qEAAqE,iCAAmB;AACxF,mEAAmE,iCAAmB;AACtF,uEAAuE,iCAAmB;AAC1F,qFAAqF,iCAAmB;AACxG,uEAAuE,iCAAmB;AAC1F,8EAA8E,iCAAmB;AACjG,8DAA8D,iCAAmB;AACjF,wEAAwE,iCAAmB;;;;;;;;;;AAU3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8HAA8H,kEAAkE,IAAI,kEAAkE;AACtQ;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,qCAAqC;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,qBAAqB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA,oCAAoC,gCAAgC;AACpE;AACA;AACA;AACA,yCAAyC,kCAAkC;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA,4BAA4B,wBAAwB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA,mBAAmB,gCAAgC;AACnD;AACA;AACA,4DAA4D,mCAAmC;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4DAA4D;;;AAG7D,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+EAA+E,iCAAmB;;AAElG;AACA,mFAAmF,gCAAgC,WAAW,wBAAwB;AACtJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,uCAAuC;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,6CAA6C;AAC1F;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ,YAAY;AACZ;AACA;AACA;AACA;AACA,cAAc,yBAAyB;AACvC;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,wEAAwE,iCAAmB;;AAE3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,kBAAkB;AACvE;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,MAAM;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,uEAAuE,iCAAmB;AAC1F,2EAA2E,iCAAmB;AAC9F,uEAAuE,iCAAmB;AAC1F,wEAAwE,iCAAmB;AAC3F,4EAA4E,iCAAmB;AAC/F,qEAAqE,iCAAmB;AACxF,yEAAyE,iCAAmB;AAC5F,qFAAqF,iCAAmB;AACxG,kFAAkF,iCAAmB;AACrG,gFAAgF,iCAAmB;AACnG,oFAAoF,iCAAmB;AACvG,uFAAuF,iCAAmB;AAC1G,yFAAyF,iCAAmB;AAC5G,mFAAmF,iCAAmB;AACtG,+EAA+E,iCAAmB;AAClG,sFAAsF,iCAAmB;AACzG,yEAAyE,iCAAmB;AAC5F,qFAAqF,iCAAmB;AACxG,gFAAgF,iCAAmB;AACnG,kGAAkG,iCAAmB;AACrH,qGAAqG,iCAAmB;AACxH,mFAAmF,iCAAmB;AACtG,6FAA6F,iCAAmB;AAChH,6EAA6E,iCAAmB;AAChG,8EAA8E,iCAAmB;AACjG,6EAA6E,iCAAmB;AAChG,wFAAwF,iCAAmB;AAC3G,iFAAiF,iCAAmB;AACpG,0EAA0E,iCAAmB;AAC7F,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;AAC1F,wEAAwE,iCAAmB;AAC3F,+DAA+D,iCAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyClF,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;;AAExF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+EAA+E,iCAAmB;AAClG,0GAA0G,iCAAmB;AAC7H,6GAA6G,iCAAmB;AAChI,sFAAsF,iCAAmB;AACzG,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;AAC1F,oEAAoE,iCAAmB;;;;;;;;AAQvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,4BAA4B;AACpD;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,wEAAwE,iCAAmB;AAC3F,4EAA4E,iCAAmB;AAC/F,4FAA4F,iCAAmB;;;;;AAK/G;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;AAGD,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yEAAyE,iCAAmB;AAC5F,+DAA+D,iCAAmB;AAClF,+DAA+D,iCAAmB;AAClF,uEAAuE,iCAAmB;AAC1F,oEAAoE,iCAAmB;AACvF,4FAA4F,iCAAmB;;;;;;AAM/G;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oBAAoB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oBAAoB;;;AAGrB,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA,mBAAmB,gCAAgC;AACnD;AACA;AACA,4DAA4D,mCAAmC;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,wCAAwC;;;AAGzC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,8DAA8D,iCAAmB;AACjF,uEAAuE,iCAAmB;AAC1F,qEAAqE,iCAAmB;;;;;;AAMxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4CAA4C;AAC7C;AACA,kDAAkD,uBAAuB;AACzE;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,uBAAuB;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uBAAuB;AACvC;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;;AAExF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,mEAAmE,iCAAmB;AACtF,uEAAuE,iCAAmB;AAC1F,gFAAgF,iCAAmB;AACnG,8DAA8D,iCAAmB;AACjF,uEAAuE,iCAAmB;AAC1F,sFAAsF,iCAAmB;;;;;;;;AAQzG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,2BAA2B;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,qBAAqB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oCAAoC;AAC5D,4BAA4B,qBAAqB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6EAA6E;AAC7E;AACA,uDAAuD;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oCAAoC;AAC5D,4BAA4B,qBAAqB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA,mCAAmC,qBAAqB;AACxD;AACA,iCAAiC,uBAAuB,GAAG,sBAAsB;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;AAC3C;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,cAAc;AACnD;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,oEAAoE,iCAAmB;AACvF,+DAA+D,iCAAmB;;;AAGlF;AACA;AACA,gDAAgD,gBAAgB;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2EAA2E,2BAA2B;AACtG,iCAAiC,oBAAoB,YAAY;AACjE;AACA;AACA;AACA,4EAA4E,2BAA2B;AACvG,iCAAiC,mBAAmB,uDAAuD;AAC3G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,oBAAoB;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,wBAAwB;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uEAAuE,0BAA0B;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,mGAAmG,iCAAmB;AACtH,4GAA4G,iCAAmB;AAC/H,wGAAwG,iCAAmB;;;;AAI3H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,2GAA2G,iCAAmB;AAC9H,sFAAsF,iCAAmB;AACzG,+EAA+E,iCAAmB;AAClG,gFAAgF,iCAAmB;AACnG,sFAAsF,iCAAmB;AACzG,qEAAqE,iCAAmB;AACxF,mEAAmE,iCAAmB;AACtF,iFAAiF,iCAAmB;AACpG,mFAAmF,iCAAmB;AACtG,gGAAgG,iCAAmB;AACnH,oFAAoF,iCAAmB;AACvG,6EAA6E,iCAAmB;AAChG,yFAAyF,iCAAmB;AAC5G,0EAA0E,iCAAmB;AAC7F,yEAAyE,iCAAmB;;;;;;;;;;;;;;;AAe5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gCAAgC;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mHAAmH,0CAA0C;AAC7J;AACA;AACA,+DAA+D,mBAAmB;AAClF;AACA;AACA;AACA,8DAA8D,gBAAgB;AAC9E;AACA;AACA;AACA,+DAA+D,GAAG,IAAI,8GAA8G;AACpL;AACA;AACA;AACA,iEAAiE,KAAK;AACtE;AACA;AACA;AACA;AACA,oEAAoE,8EAA8E;AAClJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4EAA4E,gBAAgB;AAC5F;AACA;AACA;AACA,2EAA2E,mBAAmB;AAC9F;AACA;AACA;AACA,iEAAiE,UAAU;AAC3E;AACA;AACA;AACA,mEAAmE,iBAAiB;AACpF;AACA;AACA;AACA,qEAAqE,+CAA+C;AACpH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D,uBAAuB;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8GAA8G,qCAAqC;AACnJ;AACA,iFAAiF,kBAAkB;AACnG;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0GAA0G,qCAAqC;AAC/I;AACA,6EAA6E,sBAAsB;AACnG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,kBAAkB;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,oEAAoE,iCAAmB;AACvF,qEAAqE,iCAAmB;;;;;;AAMxF,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,kEAAkE,iCAAmB;AACrF,oEAAoE,iCAAmB;AACvF,qEAAqE,iCAAmB;;;;AAIxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,6BAA6B,GAAG;AAChD,iCAAiC,QAAQ;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,uEAAuE,iCAAmB;AAC1F,yEAAyE,iCAAmB;AAC5F,4EAA4E,iCAAmB;AAC/F,mEAAmE,iCAAmB;AACtF,+EAA+E,iCAAmB;AAClG,qEAAqE,iCAAmB;AACxF,sEAAsE,iCAAmB;AACzF,+DAA+D,iCAAmB;AAClF,mEAAmE,iCAAmB;;;;;;;;;;AAUtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yFAAyF;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,uEAAuE,iCAAmB;AAC1F,+DAA+D,iCAAmB;AAClF,gEAAgE,iCAAmB;AACnF,kEAAkE,iCAAmB;AACrF,gEAAgE,iCAAmB;AACnF,sEAAsE,iCAAmB;;;;;;;AAOzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,eAAe;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,sBAAsB;AAC1C,oBAAoB,uCAAuC;AAC3D,gDAAgD,sCAAsC;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uFAAuF,IAAI;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2EAA2E,YAAY;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,kBAAkB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,iHAAiH;AAClI,iBAAiB,mHAAmH;AACpI;AACA;AACA;AACA,gBAAgB,gDAAgD;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,QAAQ;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,kEAAkE,iCAAmB;AACrF,oEAAoE,iCAAmB;;;;AAIvF;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,iCAAiC,QAAQ;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,uEAAuE,iCAAmB;AAC1F,yEAAyE,iCAAmB;AAC5F,oEAAoE,iCAAmB;AACvF,mEAAmE,iCAAmB;AACtF,sEAAsE,iCAAmB;AACzF,uEAAuE,iCAAmB;AAC1F,kEAAkE,iCAAmB;AACrF,qEAAqE,iCAAmB;;;;;;;;;;AAUxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,iBAAiB,mBAAmB,mBAAmB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA,8EAA8E;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,4DAA4D;AAChF;AACA;AACA;AACA;AACA,gEAAgE,0BAA0B;AAC1F,+DAA+D,0BAA0B;AACzF;AACA;AACA,gEAAgE,yCAAyC;AACzG,+DAA+D,gDAAgD;AAC/G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oFAAoF;AACpF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,kEAAkE,iCAAmB;AACrF,oEAAoE,iCAAmB;AACvF,qEAAqE,iCAAmB;AACxF,8EAA8E,iCAAmB;AACjG,0EAA0E,iCAAmB;;;;;;AAM7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,6BAA6B,GAAG;AAChD;AACA,6BAA6B,QAAQ;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,+EAA+E,iCAAmB;AAClG,+EAA+E,iCAAmB;AAClG,kEAAkE,iCAAmB;AACrF,0EAA0E,iCAAmB;AAC7F,qEAAqE,iCAAmB;AACxF,mEAAmE,iCAAmB;AACtF,8EAA8E,iCAAmB;AACjG,wEAAwE,iCAAmB;AAC3F,kEAAkE,iCAAmB;;;;;;;;;;AAUrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,QAAQ;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D,WAAW;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE,WAAW;AAC3E;AACA;AACA;AACA,gEAAgE,WAAW;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,oEAAoE,iCAAmB;AACvF,mEAAmE,iCAAmB;AACtF,mEAAmE,iCAAmB;AACtF,+DAA+D,iCAAmB;AAClF,kEAAkE,iCAAmB;AACrF,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;;;;;;;;;;AAU1F,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,0DAA0D,iCAAmB;AAC7E,qEAAqE,iCAAmB;AACxF,sEAAsE,iCAAmB;AACzF,6EAA6E,iCAAmB;AAChG,+DAA+D,iCAAmB;AAClF,kEAAkE,iCAAmB;AACrF,iEAAiE,iCAAmB;AACpF,iFAAiF,iCAAmB;AACpG,0EAA0E,iCAAmB;AAC7F,uEAAuE,iCAAmB;AAC1F,iEAAiE,iCAAmB;AACpF,kEAAkE,iCAAmB;AACrF,gEAAgE,iCAAmB;AACnF,gEAAgE,iCAAmB;AACnF,uFAAuF,iCAAmB;AAC1G,4EAA4E,iCAAmB;AAC/F,sEAAsE,iCAAmB;AACzF,mEAAmE,iCAAmB;AACtF,mEAAmE,iCAAmB;AACtF,mEAAmE,iCAAmB;AACtF,mEAAmE,iCAAmB;AACtF,qEAAqE,iCAAmB;AACxF,6EAA6E,iCAAmB;AAChG,uFAAuF,iCAAmB;AAC1G,sEAAsE,iCAAmB;AACzF,4EAA4E,iCAAmB;AAC/F,0EAA0E,iCAAmB;AAC7F,kFAAkF,iCAAmB;AACrG,iEAAiE,iCAAmB;AACpF,2EAA2E,iCAAmB;AAC9F,oEAAoE,iCAAmB;;;;;;;AAOvF;;;;;;;;;;;;;;;;;;;;;;;AAuBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oDAAoD;AACrD;AACA;AACA;AACA,QAAQ,iBAAiB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA;AACA;AACA,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA;AACA;AACA,oBAAoB,gBAAgB,kBAAkB,2BAA2B;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,sBAAsB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,uBAAuB;AAClE;AACA,qDAAqD,uBAAuB;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,0CAA0C,0BAA0B,cAAc,oBAAoB,eAAe,kBAAkB,kBAAkB;AAChN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wGAAwG,wBAAwB;AAChI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,uGAAuG;AACtH;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,qFAAqF,UAAU;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oHAAoH,+CAA+C;AACnK;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,QAAQ;AACxB,cAAc,+BAA+B;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,6BAA6B;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oHAAoH,+CAA+C;AACnK;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,gBAAgB,QAAQ,sBAAsB;AAC7D,8CAA8C,sBAAsB;AACpE;AACA;AACA;AACA;AACA;AACA,kBAAkB,gBAAgB,UAAU,sBAAsB;AAClE,iDAAiD,sBAAsB;AACvE;AACA;AACA;AACA;AACA;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,oBAAoB;AACnD,uCAAuC,gCAAgC;AACvE,mCAAmC,iCAAiC;AACpE;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,gCAAgC;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,gCAAgC;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,kCAAkC;AAC9E,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,mBAAmB,WAAW,iBAAiB,aAAa,eAAe,MAAM,iBAAiB;AAC9H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,gBAAgB,uDAAuD;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,mEAAmE,iCAAmB;;;AAGtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,0EAA0E,iCAAmB;AAC7F,wEAAwE,iCAAmB;AAC3F,mEAAmE,iCAAmB;AACtF,yEAAyE,iCAAmB;AAC5F,kEAAkE,iCAAmB;;;;;;AAMrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,0CAA0C;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6EAA6E,+DAA+D;AAC5I;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mEAAmE,iCAAmB;AACtF,yEAAyE,iCAAmB;AAC5F,gEAAgE,iCAAmB;AACnF,sEAAsE,iCAAmB;AACzF,mEAAmE,iCAAmB;AACtF,kEAAkE,iCAAmB;;;;;;;;AAQrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,QAAQ;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,oCAAoC;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,IAAI;AAChB;AACA;AACA;AACA,oGAAoG,qBAAqB;AACzH;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,yBAAyB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,QAAQ;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,sBAAsB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,uBAAuB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE,IAAI;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D,IAAI;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE,IAAI;AACtE;AACA;AACA;AACA;AACA;AACA,wGAAwG,IAAI;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0GAA0G,IAAI;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,mEAAmE,iCAAmB;;;AAGtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,oCAAoC;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,oCAAoC;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,6CAA6C;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,oCAAoC;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,QAAQ;AACvD;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yEAAyE,iCAAmB;;AAE5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,kEAAkE,iCAAmB;;;AAGrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,kEAAkE,iCAAmB;;AAErF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gCAAgC;AACjC;AACA,iBAAiB,iBAAiB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,mEAAmE,iCAAmB;;;AAGtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,QAAQ;AACtD;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yEAAyE,iCAAmB;;AAE5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,sEAAsE,iCAAmB;AACzF,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;;;;;;AAM1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mEAAmE,iCAAmB;AACtF,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,+DAA+D,iCAAmB;AAClF,kEAAkE,iCAAmB;AACrF,sEAAsE,iCAAmB;AACzF,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,+DAA+D,iCAAmB;AAClF,kEAAkE,iCAAmB;AACrF,wFAAwF,iCAAmB;AAC3G,qFAAqF,iCAAmB;;;;;;;;;;;;;;;;AAgBxG,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,kBAAkB;AAC9C;AACA;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gCAAgC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,mBAAmB;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE,mBAAmB;AACrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,mBAAmB,oDAAoD,kBAAkB;AACvH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,mBAAmB,oDAAoD,kBAAkB;AACrH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,iBAAiB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,iBAAiB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,0BAA0B;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,0BAA0B;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,0BAA0B;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,0BAA0B;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,eAAe,GAAG,eAAe,OAAO,iBAAiB;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,gBAAgB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,gBAAgB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,gBAAgB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,gBAAgB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,gBAAgB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,gBAAgB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA,6FAA6F,iBAAiB;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+EAA+E,iBAAiB;AAChG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gFAAgF,iBAAiB;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA,sBAAsB;AACtB,iEAAiE,iCAAmB;AACpF,kEAAkE,iCAAmB;AACrF,mEAAmE,iCAAmB;AACtF,sEAAsE,iCAAmB;;;;;AAKzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gDAAgD;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,8CAA8C;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,2BAA2B,IAAI;AACvE;AACA,kCAAkC,qBAAqB,OAAO;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,MAAM;AACpD;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,qBAAqB;AACxD,qBAAqB;AACrB;AACA;AACA;AACA,wDAAwD,IAAI;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gGAAgG,0BAA0B;AAC1H;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,SAAS;AACT;AACA;AACA,kBAAkB,oBAAoB,QAAQ,sBAAsB;AACpE;AACA;AACA;AACA,wDAAwD,IAAI;AAC5D;AACA;AACA;AACA;AACA,WAAW,qCAAqC,uBAAuB;AACvE,WAAW,0BAA0B;AACrC,WAAW,WAAW;AACtB,WAAW;AACX;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,gGAAgG;AAChH;AACA;AACA;AACA,oBAAoB,0BAA0B;AAC9C;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,gGAAgG,EAAE,IAAI,EAAE;AACxG;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,sCAAsC;AAClD,QAAQ,8BAA8B;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,iCAAiC,qBAAqB,gBAAgB;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,mDAAmD;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,0DAA0D;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;;AAEnF;AACA,aAAa,kBAAkB,yDAAyD,kCAAkC;AAC1H;AACA,QAAQ,iBAAiB;AACzB,WAAW,mCAAmC;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,mEAAmE,iCAAmB;AACtF,gEAAgE,iCAAmB;;;AAGnF;AACA,aAAa,kBAAkB,4BAA4B;AAC3D;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mHAAmH;AACnH,kGAAkG;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,mEAAmE,iCAAmB;;AAEtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,qEAAqE,iCAAmB;AACxF,6EAA6E,iCAAmB;AAChG,oEAAoE,iCAAmB;;;;;AAKvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,wDAAwD;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,iEAAiE;AACvG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,oGAAoG;AACpH;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,oBAAoB;AACpB;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,sEAAsE,iCAAmB;AACzF,yEAAyE,iCAAmB;AAC5F,qEAAqE,iCAAmB;AACxF,+DAA+D,iCAAmB;AAClF,qEAAqE,iCAAmB;AACxF,kEAAkE,iCAAmB;AACrF,oEAAoE,iCAAmB;AACvF,wEAAwE,iCAAmB;AAC3F,wEAAwE,iCAAmB;AAC3F,sFAAsF,iCAAmB;AACzG,wFAAwF,iCAAmB;AAC3G,kGAAkG,iCAAmB;AACrH,wFAAwF,iCAAmB;AAC3G,gGAAgG,iCAAmB;AACnH,0FAA0F,iCAAmB;AAC7G,mEAAmE,iCAAmB;AACtF,mEAAmE,iCAAmB;AACtF,mEAAmE,iCAAmB;AACtF,8FAA8F,iCAAmB;AACjH,iEAAiE,iCAAmB;AACpF,8FAA8F,iCAAmB;AACjH,8FAA8F,iCAAmB;AACjH,+DAA+D,iCAAmB;;;;;;;;;;AAUlF;;;;;;;;;;;;;;;AAeA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,wDAAwD;AAC1G,kJAAkJ,gBAAgB;AAClK,mKAAmK,gBAAgB;AACnL,oKAAoK,gBAAgB;AACpL,mJAAmJ,gBAAgB;AACnK;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,iEAAiE;AACvG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,2OAA2O;AAC3P;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,IAAI;AAChB;AACA,mFAAmF;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,aAAa;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,cAAc;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,oBAAoB;AACpB;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gFAAgF,mCAAmC;AACnH;AACA;AACA;AACA;AACA,gBAAgB,+BAA+B;AAC/C;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,4BAA4B;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,kCAAkC;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,gCAAgC,yBAAyB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iCAAiC;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,qEAAqE,iCAAmB;AACxF,6EAA6E,iCAAmB;AAChG,uFAAuF,iCAAmB;AAC1G,2EAA2E,iCAAmB;AAC9F,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;AAC1F,mFAAmF,iCAAmB;AACtG,mFAAmF,iCAAmB;;;;;;;;;;;AAWtG;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,oEAAoE,iCAAmB;AACvF,qEAAqE,iCAAmB;AACxF,wEAAwE,iCAAmB;;;;;AAK3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,4EAA4E,iCAAmB;AAC/F,+DAA+D,iCAAmB;;;AAGlF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,mEAAmE,iCAAmB;AACtF,8EAA8E,iCAAmB;AACjG,qEAAqE,iCAAmB;AACxF,kEAAkE,iCAAmB;AACrF,uFAAuF,iCAAmB;AAC1G,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,oEAAoE,iCAAmB;AACvF,qFAAqF,iCAAmB;AACxG,qFAAqF,iCAAmB;AACxG,YAAY,QAAQ;AACpB,YAAY,sBAAsB;;;;;;;;;;;;AAYlC;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA,kEAAkE,EAAE,KAAK;AACzE;AACA;AACA,0EAA0E,EAAE,KAAK;AACjF;AACA,wEAAwE,EAAE,OAAO;AACjF,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sGAAsG;AACtG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,oEAAoE,iCAAmB;AACvF,mEAAmE,iCAAmB;AACtF,8EAA8E,iCAAmB;AACjG,qEAAqE,iCAAmB;AACxF,mEAAmE,iCAAmB;AACtF,wFAAwF,iCAAmB;AAC3G,2EAA2E,iCAAmB;AAC9F,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;AAC1F,oEAAoE,iCAAmB;AACvF,kFAAkF,iCAAmB;AACrG,kFAAkF,iCAAmB;;;;;;;;;;;;;;;AAerG;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA,iEAAiE,EAAE,KAAK;AACxE;AACA;AACA,yEAAyE,EAAE,KAAK;AAChF;AACA,wGAAwG;AACxG,wEAAwE,EAAE,OAAO;AACjF,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sGAAsG;AACtG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,0EAA0E,iCAAmB;AAC7F,4EAA4E,iCAAmB;AAC/F,0DAA0D,iCAAmB;AAC7E,0DAA0D,iCAAmB;AAC7E,0DAA0D,iCAAmB;AAC7E,6EAA6E,iCAAmB;;;;;;AAMhG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,mEAAmE,iCAAmB;AACtF,6EAA6E,iCAAmB;AAChG,qEAAqE,iCAAmB;AACxF,kEAAkE,iCAAmB;AACrF,2EAA2E,iCAAmB;AAC9F,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;;;;;;;;;AAS1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,uFAAuF,iCAAmB;AAC1G,kEAAkE,iCAAmB;AACrF,qEAAqE,iCAAmB;AACxF,mEAAmE,iCAAmB;AACtF,kEAAkE,iCAAmB;;;;;;;AAOrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,qEAAqE;AACrF;AACA;AACA;AACA;AACA;AACA,oCAAoC,MAAM;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,MAAM;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,uBAAuB,kCAAkC,UAAU;AAC7H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,aAAa,cAAc,WAAW;AAC3F;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,WAAW;AAC/C;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,8EAA8E,iCAAmB;AACjG,gFAAgF,iCAAmB;AACnG,qEAAqE,iCAAmB;AACxF,+DAA+D,iCAAmB;AAClF,qEAAqE,iCAAmB;AACxF,kEAAkE,iCAAmB;AACrF,mEAAmE,iCAAmB;AACtF,6EAA6E,iCAAmB;;;;;;;;;;AAUhG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,2EAA2E,iCAAmB;AAC9F,6EAA6E,iCAAmB;AAChG,uFAAuF,iCAAmB;AAC1G,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;AAC1F,6EAA6E,iCAAmB;;;;;;;;AAQhG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,0DAA0D,iCAAmB;;AAE7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oEAAoE;AACpE;AACA;AACA;AACA;AACA,mGAAmG,eAAe,oBAAoB,cAAc;AACpJ;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,qEAAqE,iCAAmB;AACxF,6EAA6E,iCAAmB;AAChG,uFAAuF,iCAAmB;AAC1G,2EAA2E,iCAAmB;AAC9F,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;AAC1F,sFAAsF,iCAAmB;AACzG,sFAAsF,iCAAmB;;;;;;;;;;;AAWzG;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,uEAAuE,iCAAmB;;AAE1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,4EAA4E,iCAAmB;AAC/F,8EAA8E,iCAAmB;AACjG,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;;;;;;AAM1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,0DAA0D,iCAAmB;AAC7E,oEAAoE,iCAAmB;;;AAGvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,6DAA6D;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,iBAAiB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,iBAAiB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,gBAAgB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,gBAAgB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,iBAAiB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,iBAAiB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wEAAwE,YAAY,GAAG,KAAK;AAC5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,YAAY,GAAG,MAAM;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,YAAY,GAAG,KAAK;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,8BAA8B;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,OAAO;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,UAAU,aAAa,UAAU,EAAE,+CAA+C;AAC/H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C,0BAA0B,MAAM,IAAI,SAAS,EAAE,yCAAyC;AACxF;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,+DAA+D,kCAAmB;AAClF,yEAAyE,kCAAmB;;;AAG5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,mEAAmE,kCAAmB;AACtF,kEAAkE,kCAAmB;;;;AAIrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE,MAAM;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,oBAAoB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,sBAAsB,IAAI;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,qBAAqB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,YAAY;AAClE,oBAAoB,gCAAgC,GAAG,gCAAgC;AACvF;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,YAAY;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yEAAyE;AACzE;AACA;AACA,2BAA2B;AAC3B;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,4EAA4E,kCAAmB;AAC/F,yEAAyE,kCAAmB;;;AAG5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uBAAuB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,0DAA0D,kCAAmB;AAC7E,oEAAoE,kCAAmB;;;AAGvF;AACA,wDAAwD,sBAAsB;AAC9E;AACA;AACA,4DAA4D,sBAAsB;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,yDAAyD;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,cAAc,OAAO,aAAa;AAC1F,mEAAmE,0BAA0B;AAC7F;AACA;AACA,8DAA8D,cAAc,OAAO,aAAa;AAChG;AACA,qFAAqF,aAAa;AAClG;AACA,4DAA4D,aAAa;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,gFAAgF,aAAa,IAAI,aAAa;AAC9G,8DAA8D,YAAY,MAAM,0BAA0B;AAC1G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,oBAAoB;AAChF,qBAAqB,qCAAqC;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,UAAU;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,UAAU;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,wBAAwB,YAAY;AACpC;AACA,kDAAkD,EAAE,KAAK;AACzD;AACA;AACA,0DAA0D,EAAE,KAAK;AACjE;AACA,2DAA2D;AAC3D,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,kCAAmB;;AAElF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,gCAAgC,uBAAuB;AACvD;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,wBAAwB;AACxD;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,gBAAgB,4BAA4B;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gBAAgB,kBAAkB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,OAAO;AACpD,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yFAAyF,kCAAmB;;AAE5G;AACA;AACA;AACA,wDAAwD,2BAA2B,IAAI;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,wCAAwC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yEAAyE,kCAAmB;AAC5F,+DAA+D,kCAAmB;AAClF,oEAAoE,kCAAmB;AACvF,iEAAiE,kCAAmB;AACpF,mEAAmE,kCAAmB;AACtF,0EAA0E,kCAAmB;AAC7F,mEAAmE,kCAAmB;;;;;;;;AAQtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA,wBAAwB;AACxB;AACA,2DAA2D,iCAAiC;AAC5F;AACA,kFAAkF;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,kBAAkB,YAAY,EAAE,yBAAyB,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY;AAChG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,0EAA0E,kCAAmB;;;AAG7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE,kBAAkB;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4BAA4B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,8BAA8B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD;AACA,gEAAgE;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,8BAA8B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,8BAA8B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,8BAA8B;;;AAG/B,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+EAA+E,kCAAmB;AAClG,+DAA+D,kCAAmB;AAClF,uEAAuE,kCAAmB;AAC1F,+FAA+F,kCAAmB;;;;;AAKlH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,kCAAkC;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,gCAAgC;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,+EAA+E,kCAAmB;AAClG,oEAAoE,kCAAmB;AACvF,4EAA4E,kCAAmB;;;;;AAK/F;AACA,qFAAqF,kCAAkC;AACvH,IAAI,gBAAgB,GAAG,mBAAmB,GAAG,uBAAuB,GAAG,gBAAgB,GAAG,mBAAmB,GAAG,gBAAgB,OAAO,kBAAkB;AACzJ,IAAI,kBAAkB;AACtB;AACA,yDAAyD,6BAA6B;AACtF,qEAAqE,2BAA2B,KAAK;AACrG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8FAA8F;AAC9F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,6BAA6B;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,iEAAiE,kCAAmB;AACpF,yEAAyE,kCAAmB;AAC5F,yFAAyF,kCAAmB;AAC5G,kEAAkE,kCAAmB;AACrF,2EAA2E,kCAAmB;AAC9F,+EAA+E,kCAAmB;AAClG,gFAAgF,kCAAmB;AACnG,gEAAgE,kCAAmB;AACnF,8DAA8D,kCAAmB;;;;;;;;;;;AAWjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA,gBAAgB,2IAA2I;AAC3J;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,kBAAkB;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,eAAe,yDAAyD,+DAA+D;AACpL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,iEAAiE,kCAAmB;AACpF,mEAAmE,kCAAmB;AACtF,yEAAyE,kCAAmB;AAC5F,kEAAkE,kCAAmB;;;;;;AAMrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kCAAkC;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wHAAwH,uBAAuB;AAC/I;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,2EAA2E,kCAAmB;AAC9F,qEAAqE,kCAAmB;AACxF,6GAA6G,kCAAmB;AAChI,+EAA+E,kCAAmB;AAClG,gFAAgF,kCAAmB;AACnG,uEAAuE,kCAAmB;AAC1F,2EAA2E,kCAAmB;AAC9F,0EAA0E,kCAAmB;AAC7F,kFAAkF,kCAAmB;AACrG,mEAAmE,kCAAmB;AACtF,gEAAgE,kCAAmB;AACnF,wEAAwE,kCAAmB;AAC3F,iFAAiF,kCAAmB;AACpG,kEAAkE,kCAAmB;;;;;;;;;;;;;;AAcrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,gDAAgD;AACrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,4EAA4E,kCAAmB;AAC/F,gEAAgE,kCAAmB;AACnF,kEAAkE,kCAAmB;AACrF,mEAAmE,kCAAmB;AACtF,qEAAqE,kCAAmB;AACxF,yFAAyF,kCAAmB;AAC5G,kEAAkE,kCAAmB;;;;;;;;AAQrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,iCAAiC,IAAI,uBAAuB;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,cAAc;AACjH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,6CAA6C,uBAAuB;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,UAAU,gBAAgB,cAAc;AAClG;AACA;AACA,yFAAyF;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+EAA+E,kCAAmB;AAClG,+DAA+D,kCAAmB;AAClF,iEAAiE,kCAAmB;;;;AAIpF;AACA;AACA;AACA;AACA;AACA,gBAAgB,+BAA+B;AAC/C;AACA;AACA;AACA;AACA;AACA,gBAAgB,gBAAgB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,iEAAiE,kCAAmB;AACpF,kEAAkE,kCAAmB;AACrF,qEAAqE,kCAAmB;;;;AAIxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4CAA4C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,eAAe;AACvC,4BAA4B,eAAe;AAC3C,sBAAsB,yBAAyB;AAC/C;AACA;AACA,mBAAmB,yBAAyB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,qBAAqB;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,2EAA2E,kCAAmB;AAC9F,gEAAgE,kCAAmB;AACnF,6GAA6G,kCAAmB;AAChI,sFAAsF,kCAAmB;AACzG,2EAA2E,kCAAmB;AAC9F,qEAAqE,kCAAmB;AACxF,0EAA0E,kCAAmB;AAC7F,+EAA+E,kCAAmB;;;;;;;;;AASlG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gCAAgC;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yFAAyF,kCAAmB;AAC5G,qEAAqE,kCAAmB;;;AAGxF;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,mEAAmE,kCAAmB;AACtF,qEAAqE,kCAAmB;AACxF,gEAAgE,kCAAmB;;;;AAInF;AACA,cAAc,kBAAkB,uCAAuC;AACvE;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA,CAAC,gDAAgD;;;AAGjD,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,mFAAmF,kCAAmB;AACtG,4EAA4E,kCAAmB;AAC/F,sEAAsE,kCAAmB;;;;AAIzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,wEAAwE,kCAAmB;AAC3F,+EAA+E,kCAAmB;AAClG,+EAA+E,kCAAmB;;;;;AAKlG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,IAAI;AAChB;AACA;AACA,oDAAoD,eAAe;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iEAAiE,kCAAmB;AACpF,+DAA+D,kCAAmB;AAClF,qEAAqE,kCAAmB;AACxF,+EAA+E,kCAAmB;AAClG,oEAAoE,kCAAmB;AACvF,mEAAmE,kCAAmB;;;;;;;AAOtF;AACA;AACA,IAAI,kCAAkC;AACtC;AACA,oCAAoC,yBAAyB;AAC7D;AACA;AACA;AACA;AACA,iEAAiE,YAAY,yBAAyB;AACtG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,uBAAuB,aAAa,uBAAuB;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;;AAEnF;AACA,gBAAgB,kBAAkB,+BAA+B;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iEAAiE,kCAAmB;AACpF,kEAAkE,kCAAmB;;;AAGrF;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,gBAAgB;AAChC,uFAAuF;AACvF,mFAAmF;AACnF;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,2CAA2C;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,gBAAgB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,oBAAoB;AAC9C,wBAAwB,kBAAkB;AAC1C;AACA,SAAS;AACT;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,kEAAkE,kCAAmB;AACrF,iEAAiE,kCAAmB;AACpF,+EAA+E,kCAAmB;;;;;AAKlG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,sEAAsE;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,mCAAmC;AACrE;AACA;AACA;AACA;AACA;AACA,0EAA0E,OAAO,4BAA4B,SAAS;AACtH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,OAAO,cAAc,YAAY;AAC/G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;AACnF,qEAAqE,kCAAmB;;;AAGxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,sCAAsC,iCAAiC,sBAAsB;AACzG;AACA;AACA;AACA;AACA,gBAAgB,yBAAyB;AACzC;AACA;AACA;AACA;AACA;AACA,gHAAgH,iBAAiB;AACjI;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE,EAAE,IAAI,EAAE,QAAQ,GAAG,0BAA0B,kBAAkB;AAClI;AACA;AACA,mEAAmE,EAAE,IAAI,EAAE,QAAQ,GAAG,0BAA0B,eAAe;AAC/H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,EAAE,IAAI,EAAE;AAC3D;AACA;AACA;AACA,kDAAkD,sBAAsB;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE,EAAE,IAAI,EAAE,QAAQ,GAAG,0BAA0B,kBAAkB;AAClI;AACA;AACA,mEAAmE,EAAE,IAAI,EAAE,QAAQ,GAAG,0BAA0B,eAAe;AAC/H;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,EAAE,IAAI,EAAE;AAC3D;AACA;AACA,mDAAmD,qBAAqB;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,iCAAiC,SAAS;AAC1C;AACA;AACA,qCAAqC,sBAAsB;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,eAAe,gDAAgD,aAAa,yBAAyB;AACrH,iCAAiC;AACjC,iCAAiC;AACjC,wBAAwB,UAAU;AAClC,4BAA4B,UAAU;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,gCAAgC;AAChC,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iEAAiE,kCAAmB;AACpF,+DAA+D,kCAAmB;AAClF,8DAA8D,kCAAmB;;;;AAIjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,gBAAgB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,gBAAgB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;AACnF,mEAAmE,kCAAmB;AACtF,qEAAqE,kCAAmB;AACxF,oEAAoE,kCAAmB;AACvF,qEAAqE,kCAAmB;;;;;;AAMxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,uBAAuB;AACzD;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,+CAA+C;AAC/C,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,qEAAqE,kCAAmB;AACxF,gEAAgE,kCAAmB;AACnF,kEAAkE,kCAAmB;;;;;AAKrF;AACA;AACA;AACA;AACA;AACA,wBAAwB,8CAA8C;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,sBAAsB;AAChD;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gBAAgB,qCAAqC,IAAI;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,wEAAwE,kCAAmB;;AAE3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,sCAAsC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,iEAAiE,kCAAmB;AACpF,gEAAgE,kCAAmB;AACnF,qEAAqE,kCAAmB;AACxF,uEAAuE,kCAAmB;AAC1F,qEAAqE,kCAAmB;AACxF,mEAAmE,kCAAmB;AACtF,8DAA8D,kCAAmB;AACjF,2EAA2E,kCAAmB;AAC9F,gFAAgF,kCAAmB;AACnG,wEAAwE,kCAAmB;AAC3F,0EAA0E,kCAAmB;AAC7F,4EAA4E,kCAAmB;AAC/F,iEAAiE,kCAAmB;AACpF,iEAAiE,kCAAmB;AACpF,oEAAoE,kCAAmB;AACvF,kEAAkE,kCAAmB;AACrF,+DAA+D,kCAAmB;AAClF,qEAAqE,kCAAmB;AACxF,+DAA+D,kCAAmB;AAClF,oEAAoE,kCAAmB;AACvF,qEAAqE,kCAAmB;AACxF,iEAAiE,kCAAmB;AACpF,oEAAoE,kCAAmB;AACvF,sEAAsE,kCAAmB;AACzF,yEAAyE,kCAAmB;AAC5F,2FAA2F,kCAAmB;AAC9G,mGAAmG,kCAAmB;AACtH,gGAAgG,kCAAmB;AACnH,sGAAsG,kCAAmB;AACzH,6EAA6E,kCAAmB;AAChG,qFAAqF,kCAAmB;AACxG,2FAA2F,kCAAmB;AAC9G,oGAAoG,kCAAmB;AACvH,iFAAiF,kCAAmB;AACpG,oEAAoE,kCAAmB;AACvF,mEAAmE,kCAAmB;AACtF,yEAAyE,kCAAmB;AAC5F,gFAAgF,kCAAmB;AACnG,gFAAgF,kCAAmB;AACnG,oFAAoF,kCAAmB;AACvG,2EAA2E,kCAAmB;AAC9F,gEAAgE,kCAAmB;AACnF,6EAA6E,kCAAmB;AAChG;;;;;;;;AAQA;;;;;;AAMA;;;;;;;;;;;;;;;;;AAiBA;;;AAGA;;;;;;;;AAQA;;;;;;;AAOA;;AAEA;;;;;AAKA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA,aAAa;AACb;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;AACnF,sEAAsE,kCAAmB;;;AAGzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,qBAAqB;AACjF;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA,6DAA6D,SAAS;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,SAAS;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,SAAS;AACvD;AACA;AACA;AACA;AACA,2CAA2C,SAAS;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oEAAoE;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,+BAA+B;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,0BAA0B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oBAAoB;;;AAGrB,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iEAAiE,kCAAmB;AACpF,qEAAqE,kCAAmB;AACxF,kEAAkE,kCAAmB;AACrF,8EAA8E,kCAAmB;;;;;AAKjG;AACA;AACA;AACA,gBAAgB,yCAAyC;AACzD;AACA;AACA;AACA,6BAA6B,iBAAiB;AAC9C,6BAA6B,iBAAiB;AAC9C;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C,8CAA8C;AAC9C,4CAA4C;AAC5C,8CAA8C;AAC9C;AACA,+BAA+B,SAAS;AACxC,+BAA+B,SAAS;AACxC,+BAA+B,SAAS;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,gEAAgE,kCAAmB;AACnF,qEAAqE,kCAAmB;AACxF,sEAAsE,kCAAmB;;;;;AAKzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oBAAoB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB,gBAAgB,kBAAkB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kDAAkD;;;AAGnD,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,sEAAsE,kCAAmB;AACzF,iFAAiF,kCAAmB;;;;AAIpG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,sCAAsC;;;AAGvC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yFAAyF,kCAAmB;;AAE5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;AACnF,iFAAiF,kCAAmB;AACpG,qEAAqE,kCAAmB;AACxF,sEAAsE,kCAAmB;AACzF,qEAAqE,kCAAmB;AACxF,4EAA4E,kCAAmB;AAC/F,wEAAwE,kCAAmB;AAC3F,wEAAwE,kCAAmB;AAC3F,8EAA8E,kCAAmB;AACjG,uEAAuE,kCAAmB;AAC1F,oEAAoE,kCAAmB;AACvF,qEAAqE,kCAAmB;AACxF,qEAAqE,kCAAmB;AACxF,sEAAsE,kCAAmB;;;;;;;;;;;;;;;AAezF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE,SAAS;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,8BAA8B;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,yEAAyE,kCAAmB;;AAE5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,8BAA8B;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oCAAoC;;;AAGrC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+EAA+E,kCAAmB;AAClG,+EAA+E,kCAAmB;AAClG,+EAA+E,kCAAmB;AAClG,oFAAoF,kCAAmB;AACvG,0EAA0E,kCAAmB;AAC7F,0EAA0E,kCAAmB;AAC7F,4FAA4F,kCAAmB;AAC/G,yFAAyF,kCAAmB;;;;;;;AAO5G;AACA;AACA;AACA;AACA,0DAA0D,0BAA0B;AACpF,QAAQ,kBAAkB;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA,uHAAuH,WAAW;AAClI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,qBAAqB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA,8BAA8B,sBAAsB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kCAAkC;;;AAGnC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA,CAAC,wCAAwC;;;AAGzC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,6EAA6E,kCAAmB;AAChG,yEAAyE,kCAAmB;;;;;;;;;;AAU5F,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,uEAAuE,kCAAmB;AAC1F,kEAAkE,kCAAmB;AACrF,uEAAuE,kCAAmB;AAC1F,+DAA+D,kCAAmB;;;;;;AAMlF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,qBAAqB,2BAA2B,wBAAwB;AACpF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4EAA4E,4BAA4B;AACxG,gBAAgB,qDAAqD,IAAI;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,aAAa;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,uBAAuB;AACtC;AACA;AACA;AACA,eAAe,iBAAiB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,cAAc;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,YAAY;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;AACnF,8DAA8D,kCAAmB;AACjF,gEAAgE,kCAAmB;;;;AAInF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,WAAW;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,gBAAgB;AACpE,oDAAoD,gBAAgB;AACpE,oDAAoD,gBAAgB;AACpE,oDAAoD,gBAAgB;AACpE,0DAA0D,UAAU;AACpE,0DAA0D,UAAU;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,cAAc;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG,cAAc,EAAE,cAAc,EAAE,aAAa;AAChD,GAAG,cAAc,EAAE,cAAc,EAAE,aAAa;AAChD;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,8DAA8D,kCAAmB;;AAEjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,OAAO;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,WAAW;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C,4BAA4B,uBAAuB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA,6EAA6E;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gCAAgC;;;AAGjC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;AACnF,qEAAqE,kCAAmB;AACxF,gEAAgE,kCAAmB;AACnF,uEAAuE,kCAAmB;AAC1F,mEAAmE,kCAAmB;AACtF,qEAAqE,kCAAmB;AACxF,gEAAgE,kCAAmB;AACnF,4EAA4E,kCAAmB;AAC/F,sEAAsE,kCAAmB;AACzF,oEAAoE,kCAAmB;AACvF,8DAA8D,kCAAmB;AACjF,+DAA+D,kCAAmB;AAClF,uEAAuE,kCAAmB;AAC1F,+DAA+D,kCAAmB;AAClF,wEAAwE,kCAAmB;;;;;;;;;;;;;;;;;;AAkB3F,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,uEAAuE,kCAAmB;AAC1F,8DAA8D,kCAAmB;;;AAGjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,8DAA8D,kCAAmB;AACjF,gEAAgE,kCAAmB;;;;AAInF;AACA;AACA;AACA;AACA,CAAC,0CAA0C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,WAAW;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc;AACjE,GAAG,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc;AACjE,GAAG,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,cAAc;AAClE,GAAG,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,cAAc;AAClE;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oCAAoC;;;AAGrC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,uEAAuE,kCAAmB;AAC1F,8DAA8D,kCAAmB;AACjF,gEAAgE,kCAAmB;AACnF,qEAAqE,kCAAmB;AACxF,sEAAsE,kCAAmB;;;;;;AAMzF;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,4BAA4B,UAAU;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,4BAA4B,UAAU;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,uEAAuE,kCAAmB;AAC1F,8DAA8D,kCAAmB;;;AAGjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8FAA8F,mBAAmB;AACjH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6EAA6E;AAC7E,iCAAiC,uBAAuB;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,sBAAsB,IAAI,sBAAsB;AACvE;AACA,mBAAmB,OAAO,IAAI,OAAO;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kCAAkC;;;AAGnC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,kCAAmB;AAClF,qEAAqE,kCAAmB;AACxF,mEAAmE,kCAAmB;AACtF,6EAA6E,kCAAmB;AAChG,oFAAoF,kCAAmB;AACvG,qEAAqE,kCAAmB;AACxF,qEAAqE,kCAAmB;AACxF,8DAA8D,kCAAmB;;;;;;;;;AASjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,wEAAwE,GAAG;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,0FAA0F,IAAI;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,mEAAmE,kCAAmB;AACtF,mEAAmE,kCAAmB;AACtF,qEAAqE,kCAAmB;AACxF,qEAAqE,kCAAmB;AACxF,qEAAqE,kCAAmB;;;;;;AAMxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,cAAc;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,QAAQ;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yGAAyG,SAAS;AAClH,2GAA2G,SAAS;AACpH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,kCAAmB;AAClF,qEAAqE,kCAAmB;AACxF,qEAAqE,kCAAmB;AACxF,iFAAiF,kCAAmB;AACpG,mEAAmE,kCAAmB;AACtF,qEAAqE,kCAAmB;AACxF,mEAAmE,kCAAmB;AACtF,yEAAyE,kCAAmB;;;;;;;;;AAS5F;AACA;AACA;AACA,WAAW,gBAAgB;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,gIAAgI;AAChJ;AACA,uJAAuJ;AACvJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA,wEAAwE,sBAAsB,IAAI;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,4EAA4E,IAAI;AAChG,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kCAAkC;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,+BAA+B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,+DAA+D,kCAAmB;AAClF,qEAAqE,kCAAmB;AACxF,6GAA6G,kCAAmB;AAChI,oFAAoF,kCAAmB;AACvG,sFAAsF,kCAAmB;AACzG,+EAA+E,kCAAmB;AAClG,mEAAmE,kCAAmB;AACtF,+EAA+E,kCAAmB;AAClG,8EAA8E,kCAAmB;;;;;;;;;;AAUjG;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA,gBAAgB,uBAAuB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,QAAQ;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+FAA+F,4CAA4C;AAC3I;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,mCAAmC;AAC3C;AACA;AACA;AACA;AACA,QAAQ,kCAAkC;AAC1C;AACA;AACA;AACA,CAAC,8CAA8C;;;AAG/C,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,mEAAmE,kCAAmB;AACtF,yEAAyE,kCAAmB;AAC5F,4EAA4E,kCAAmB;AAC/F,6EAA6E,kCAAmB;;;;;;;;AAQhG,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,uEAAuE,kCAAmB;AAC1F,kEAAkE,kCAAmB;;;AAGrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,wBAAwB,IAAI;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,IAAI;AACjE;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,UAAU,gBAAgB,cAAc;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,aAAa;AACpC;AACA;AACA,sEAAsE,mDAAmD;AACzH;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,8EAA8E,kCAAmB;AACjG,4EAA4E,kCAAmB;AAC/F,8EAA8E,kCAAmB;;;;;AAKjG;AACA,QAAQ,kBAAkB;AAC1B,IAAI,kBAAkB,OAAO,mBAAmB,mCAAmC;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF,SAAS;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,oBAAoB,QAAQ;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,OAAO;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,OAAO;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,wBAAwB,UAAU;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,eAAe;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,aAAa;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;AACA,oDAAoD,aAAa;AACjE;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D;AAC/D,yDAAyD;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,UAAU;AAC7C,oDAAoD,cAAc;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,6BAA6B;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,MAAM,IAAI,MAAM,IAAI,MAAM;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,qEAAqE,kCAAmB;AACxF,6DAA6D,kCAAmB;AAChF,8DAA8D,kCAAmB;;;;;;;AAOjF,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,sEAAsE,kCAAmB;;;AAGzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,mBAAmB;AAC3B,6DAA6D,mBAAmB;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yGAAyG,UAAU;AACnH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,SAAS;AACT;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA,sBAAsB;AACtB,+DAA+D,kCAAmB;AAClF,sEAAsE,kCAAmB;AACzF,0EAA0E,kCAAmB;;;;;;AAM7F,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,wFAAwF,kCAAmB;AAC3G,kEAAkE,kCAAmB;AACrF,0EAA0E,kCAAmB;AAC7F,sEAAsE,kCAAmB;AACzF,4EAA4E,kCAAmB;AAC/F,oEAAoE,kCAAmB;AACvF,kEAAkE,kCAAmB;AACrF,sEAAsE,kCAAmB;;;;;;;;;AASzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,gBAAgB;AACxB,mDAAmD,gBAAgB,OAAO;AAC1E,sCAAsC,iBAAiB;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,WAAW;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,gBAAgB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,2EAA2E,kCAAmB;AAC9F,mEAAmE,kCAAmB;AACtF,sEAAsE,kCAAmB;AACzF,qEAAqE,kCAAmB;;;;;AAKxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,MAAM;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,+BAA+B,IAAI;AACnC;AACA;AACA;AACA;AACA;AACA,uDAAuD;AACvD;AACA;AACA;AACA,qBAAqB;AACrB;AACA,iBAAiB;AACjB;AACA,gCAAgC,2BAA2B;AAC3D;AACA;AACA,qBAAqB;AACrB;AACA,iBAAiB;AACjB;AACA,gCAAgC,MAAM;AACtC;AACA;AACA;AACA,qBAAqB;AACrB;AACA,iBAAiB;AACjB;AACA,gCAAgC,MAAM;AACtC;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,sBAAsB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA,sBAAsB;AACtB,wEAAwE,kCAAmB;AAC3F,iEAAiE,kCAAmB;AACpF,kEAAkE,kCAAmB;AACrF,gEAAgE,kCAAmB;AACnF,iEAAiE,kCAAmB;AACpF,gEAAgE,kCAAmB;AACnF,+DAA+D,kCAAmB;AAClF,oEAAoE,kCAAmB;AACvF,iEAAiE,kCAAmB;AACpF,uFAAuF,kCAAmB;AAC1G,qFAAqF,kCAAmB;AACxG,iFAAiF,kCAAmB;AACpG,oFAAoF,kCAAmB;AACvG,uFAAuF,kCAAmB;AAC1G,kFAAkF,kCAAmB;AACrG,4EAA4E,kCAAmB;AAC/F,8EAA8E,kCAAmB;AACjG,+EAA+E,kCAAmB;AAClG,wFAAwF,kCAAmB;AAC3G,mFAAmF,kCAAmB;AACtG,gFAAgF,kCAAmB;AACnG,sEAAsE,kCAAmB;AACzF,0EAA0E,kCAAmB;AAC7F,6EAA6E,kCAAmB;AAChG,iFAAiF,kCAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BpG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,2BAA2B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,YAAY,iBAAiB;AAC7B;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,oCAAoC;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,eAAe;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wGAAwG,IAAI;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yGAAyG,IAAI;AAC7G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sGAAsG,IAAI;AAC1G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uGAAuG,IAAI;AAC3G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,gBAAgB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kFAAkF,kFAAkF;AACpK;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E,sIAAsI;AAChN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,sBAAsB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,uBAAuB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,oBAAoB;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,qBAAqB;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE,gBAAgB;AACtF;AACA;AACA;AACA;AACA;AACA;AACA,qFAAqF,kFAAkF;AACvK;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,SAAS;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,gBAAgB;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4EAA4E,gBAAgB;AAC5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,gBAAgB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,iBAAiB,mCAAmC,gBAAgB;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oFAAoF,gBAAgB;AACpG;AACA;AACA;AACA;AACA,yCAAyC,gBAAgB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,QAAQ;AACvD;AACA;AACA,6CAA6C,QAAQ;AACrD;AACA;AACA;AACA;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,gBAAgB;AAClC,uCAAuC,sBAAsB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,eAAe;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA,4BAA4B,2BAA2B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,kEAAkE,kCAAmB;AACrF,yEAAyE,kCAAmB;AAC5F,mEAAmE,kCAAmB;AACtF,wGAAwG,kCAAmB;AAC3H,2GAA2G,kCAAmB;AAC9H,sEAAsE,kCAAmB;;;;;;;;AAQzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oGAAoG;AACpG;AACA;AACA;AACA;AACA;AACA,qGAAqG;AACrG;AACA;AACA;AACA;AACA;AACA,uDAAuD,sBAAsB;AAC7E;AACA;AACA,YAAY,6BAA6B;AACzC;AACA;AACA;AACA;AACA,uDAAuD,mBAAmB;AAC1E;AACA;AACA,YAAY,6BAA6B;AACzC;AACA;AACA;AACA;AACA,gCAAgC,8BAA8B;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6EAA6E;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kCAAkC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,uFAAuF;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+FAA+F,wBAAwB;AACvH;AACA;AACA,6FAA6F,YAAY;AACzG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,8EAA8E,sBAAsB,GAAG,uBAAuB,qBAAqB,gBAAgB;AACnK;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,eAAe;AAClH;AACA;AACA;AACA,sEAAsE,gBAAgB;AACtF,8CAA8C,gBAAgB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,8BAA8B,8BAA8B;AACzF,qDAAqD,gBAAgB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,4CAA4C,KAAK,8BAA8B,MAAM,4BAA4B;AAC/I;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,oCAAoC;AACpD;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,+DAA+D,kCAAmB;AAClF,6GAA6G,kCAAmB;AAChI,iFAAiF,kCAAmB;AACpG,0EAA0E,kCAAmB;;;;;;AAM7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,gBAAgB;AAC3B;AACA;AACA;AACA;AACA;AACA,gBAAgB,WAAW;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yFAAyF,kCAAmB;;AAE5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,sFAAsF,kCAAmB;AACzG,6GAA6G,kCAAmB;AAChI,kFAAkF,kCAAmB;AACrG,+EAA+E,kCAAmB;;;;;AAKlG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gCAAgC;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,iFAAiF,kCAAmB;AACpG,+EAA+E,kCAAmB;AAClG,qFAAqF,kCAAmB;AACxG,iFAAiF,kCAAmB;AACpG,gGAAgG,kCAAmB;AACnH,qEAAqE,kCAAmB;AACxF,6GAA6G,kCAAmB;AAChI,sFAAsF,kCAAmB;AACzG,kEAAkE,kCAAmB;AACrF,mEAAmE,kCAAmB;AACtF,kFAAkF,kCAAmB;AACrG,iFAAiF,kCAAmB;AACpG,sEAAsE,kCAAmB;AACzF,gGAAgG,kCAAmB;;;;;;;;;;;;;;AAcnH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,qBAAqB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,wBAAwB;AACnE;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,8GAA8G;AAC9H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,YAAY;AACpC,4BAA4B,WAAW;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sHAAsH;AACtH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,wBAAwB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,wBAAwB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,2GAA2G;AAC3H,gBAAgB,sDAAsD;AACtE;AACA;AACA;AACA,4BAA4B,mBAAmB;AAC/C;AACA;AACA;AACA;AACA,4BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,4DAA4D;AACzH;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,gFAAgF,kCAAmB;AACnG,qEAAqE,kCAAmB;AACxF,kEAAkE,kCAAmB;AACrF,sFAAsF,kCAAmB;AACzG,6GAA6G,kCAAmB;AAChI,iFAAiF,kCAAmB;AACpG,iFAAiF,kCAAmB;AACpG,oFAAoF,kCAAmB;AACvG,kEAAkE,kCAAmB;AACrF,mEAAmE,kCAAmB;AACtF,0GAA0G,kCAAmB;AAC7H,sFAAsF,kCAAmB;AACzG,yFAAyF,kCAAmB;AAC5G,iEAAiE,kCAAmB;AACpF,sEAAsE,kCAAmB;AACzF,2EAA2E,kCAAmB;AAC9F,oEAAoE,kCAAmB;AACvF,iFAAiF,kCAAmB;AACpG,gGAAgG,kCAAmB;;;;;;;;;;;;;;;;;;;AAmBnH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C,4BAA4B,eAAe;AAC3C;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,QAAQ;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA,4BAA4B,eAAe;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,eAAe;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,eAAe;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,eAAe;AACnC;AACA;AACA;AACA,gBAAgB,OAAO;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,eAAe;AAChD,qCAAqC,eAAe;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,eAAe;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0GAA0G;AAC1G;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA,mEAAmE,6BAA6B;AAChG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,4IAA4I;AAC5J,gBAAgB,sDAAsD;AACtE;AACA;AACA;AACA;AACA,4BAA4B,mBAAmB;AAC/C;AACA;AACA;AACA,4BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,4DAA4D;AACrH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,uBAAuB;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,iBAAiB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,kBAAkB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,eAAe;AACrD;AACA,kCAAkC,qBAAqB;AACvD;AACA,sBAAsB,qBAAqB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,iEAAiE,kCAAmB;AACpF,sEAAsE,kCAAmB;AACzF,kFAAkF,kCAAmB;AACrG,+EAA+E,kCAAmB;;;;;;;AAOlG,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,qEAAqE,kCAAmB;;;AAGxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;AACnF,iFAAiF,kCAAmB;AACpG,+DAA+D,kCAAmB;AAClF,sEAAsE,kCAAmB;;;;;AAKzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,0BAA0B;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,YAAY;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,iBAAiB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,0CAA0C,iBAAiB;AAC3D;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA,QAAQ,IAAI;AACZ;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,6DAA6D,kCAAmB;;;AAGhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,QAAQ;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,wBAAwB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iEAAiE,kCAAmB;AACpF,gEAAgE,kCAAmB;AACnF,6DAA6D,kCAAmB;;;;AAIhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG;AACnG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E,IAAI;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,cAAc;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA,KAAK;AACL;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,+DAA+D,kCAAmB;AAClF,6DAA6D,kCAAmB;;;AAGhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,kBAAkB,EAAE,mCAAmC,EAAE,yBAAyB;AACrH,2BAA2B,iBAAiB,sBAAsB,gBAAgB;AAClF,+CAA+C,yBAAyB;AACxE;AACA;AACA;AACA;AACA,sCAAsC,gBAAgB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6DAA6D,kCAAmB;;AAEhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,oCAAoC;AAC9E;AACA;AACA;AACA,uCAAuC;AACvC,8CAA8C;AAC9C,gDAAgD;AAChD;AACA;AACA,uCAAuC;AACvC,8CAA8C;AAC9C,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,+DAA+D,kCAAmB;;AAElF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,uBAAuB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,gBAAgB;AACtC,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;;AAExF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;AAGD,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,8DAA8D,kCAAmB;AACjF,6DAA6D,kCAAmB;AAChF,oEAAoE,kCAAmB;AACvF,yEAAyE,kCAAmB;AAC5F,kEAAkE,kCAAmB;;;;;;;;;AASrF,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,+DAA+D,kCAAmB;AAClF;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4BAA4B;AAC7B;AACA;AACA,oCAAoC,0BAA0B,KAAK,wBAAwB;AAC3F,gBAAgB,mBAAmB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,mBAAmB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,yBAAyB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,yBAAyB;AAClE;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,wBAAwB;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,wBAAwB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,wBAAwB;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,wBAAwB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,yBAAyB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,yBAAyB;AAClE;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,yBAAyB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,yBAAyB;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA,wBAAwB,yBAAyB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;;AAErF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,YAAY;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6DAA6D,kCAAmB;;AAEhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE,WAAW,0DAA0D,gBAAgB;AACtJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0GAA0G,6CAA6C;AACvJ;AACA;AACA;AACA;AACA;AACA,mIAAmI,0DAA0D;AAC7L;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;;AAExF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,gEAAgE,kCAAmB;;;AAGnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,WAAW;AACvD;AACA;AACA;AACA;AACA,wCAAwC,oBAAoB;AAC5D;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,sFAAsF,kCAAmB;AACzG,6DAA6D,kCAAmB;;;AAGhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,aAAa;AACb;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,+DAA+D,kCAAmB;AAClF,4DAA4D,kCAAmB;AAC/E,gEAAgE,kCAAmB;AACnF,0EAA0E,kCAAmB;AAC7F,gEAAgE,kCAAmB;AACnF,+DAA+D,kCAAmB;AAClF,oEAAoE,kCAAmB;AACvF,gEAAgE,kCAAmB;AACnF,qEAAqE,kCAAmB;AACxF,uEAAuE,kCAAmB;AAC1F,6EAA6E,kCAAmB;AAChG,iEAAiE,kCAAmB;AACpF,gEAAgE,kCAAmB;AACnF,8EAA8E,kCAAmB;AACjG,0EAA0E,kCAAmB;AAC7F,gEAAgE,kCAAmB;AACnF,wEAAwE,kCAAmB;AAC3F,gEAAgE,kCAAmB;AACnF,kEAAkE,kCAAmB;AACrF,wEAAwE,kCAAmB;AAC3F,wEAAwE,kCAAmB;AAC3F,0EAA0E,kCAAmB;AAC7F,2EAA2E,kCAAmB;AAC9F,0EAA0E,kCAAmB;AAC7F,sFAAsF,kCAAmB;AACzG,yEAAyE,kCAAmB;AAC5F,gEAAgE,kCAAmB;AACnF,yEAAyE,kCAAmB;AAC5F,2EAA2E,kCAAmB;AAC9F,6EAA6E,kCAAmB;AAChG,+EAA+E,kCAAmB;AAClG,8EAA8E,kCAAmB;AACjG,oFAAoF,kCAAmB;AACvG,qFAAqF,kCAAmB;AACxG,mFAAmF,kCAAmB;AACtG,iFAAiF,kCAAmB;AACpG,8EAA8E,kCAAmB;AACjG,4EAA4E,kCAAmB;AAC/F,6EAA6E,kCAAmB;AAChG,wEAAwE,kCAAmB;AAC3F,yEAAyE,kCAAmB;AAC5F,0EAA0E,kCAAmB;AAC7F,4EAA4E,kCAAmB;AAC/F,qEAAqE,kCAAmB;AACxF,uEAAuE,kCAAmB;AAC1F,0EAA0E,kCAAmB;AAC7F,wEAAwE,kCAAmB;AAC3F,+EAA+E,kCAAmB;AAClG,0EAA0E,kCAAmB;AAC7F,mEAAmE,kCAAmB;AACtF,oEAAoE,kCAAmB;AACvF,mEAAmE,kCAAmB;AACtF,qEAAqE,kCAAmB;AACxF,wEAAwE,kCAAmB;AAC3F,uEAAuE,kCAAmB;AAC1F,4EAA4E,kCAAmB;AAC/F,sEAAsE,kCAAmB;AACzF,yEAAyE,kCAAmB;AAC5F,yEAAyE,kCAAmB;AAC5F,sEAAsE,kCAAmB;AACzF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA;;;;;;;;;;;;;;;;;;AAkBA;;;;;;;;;;;;;;;;;;;AAmBA;AACA;AACA,YAAY;AACZ;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iFAAiF;;AAEjF,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iFAAiF;;AAEjF,OAAO;;AAEP,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,kBAAkB,kCAAmB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE,kCAAmB;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,kCAAmB;AAC7B;AACA;AACA;AACA,WAAW,kCAAmB,aAAa,WAAW;AACtD;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU,kCAAmB;AAC7B;AACA,eAAe,kCAAmB,wBAAwB,kCAAmB;AAC7E,mDAAmD,wCAAwC;AAC3F;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU,kCAAmB;AAC7B,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU,kCAAmB;AAC7B;AACA,iEAAiE,iBAAiB;AAClF;AACA,0DAA0D,aAAa;AACvE;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,0BAAmB,GAAG,kCAAmB;AACtD,sDAAsD,0BAAmB;AACzE,gDAAgD,0BAAmB;AACnE,8CAA8C,0BAAmB;AACjE,iDAAiD,0BAAmB;AACpE,mDAAmD,0BAAmB;AACtE,mDAAmD,0BAAmB;AACtE,gDAAgD,0BAAmB;AACnE,gDAAgD,0BAAmB;AACnE,wCAAwC,0BAAmB;AAC3D,8CAA8C,0BAAmB;AACjE,2CAA2C,0BAAmB;AAC9D,iDAAiD,0BAAmB;AACpE,+CAA+C,0BAAmB;AAClE,4CAA4C,0BAAmB;AAC/D,qDAAqD,0BAAmB;AACxE,kDAAkD,0BAAmB;AACrE,oDAAoD,0BAAmB;AACvE,+CAA+C,0BAAmB;AAClE,sDAAsD,0BAAmB;AACzE,uCAAuC,0BAAmB;AAC1D,uCAAuC,0BAAmB;AAC1D,4CAA4C,0BAAmB;AAC/D,8CAA8C,0BAAmB;AACjE,wCAAwC,0BAAmB;AAC3D,gDAAgD,0BAAmB;AACnE,8CAA8C,0BAAmB;AACjE,mDAAmD,0BAAmB;AACtE,gDAAgD,0BAAmB;AACnE,0CAA0C,0BAAmB;AAC7D,yCAAyC,0BAAmB;AAC5D,+CAA+C,0BAAmB;AAClE,yCAAyC,0BAAmB;AAC5D,yCAAyC,0BAAmB;AAC5D,iDAAiD,0BAAmB;AACpE,wCAAwC,0BAAmB;AAC3D,uDAAuD,0BAAmB;AAC1E,2CAA2C,0BAAmB;AAC9D,oDAAoD,0BAAmB;AACvE,mDAAmD,0BAAmB;AACtE,oDAAoD,0BAAmB;AACvE,iDAAiD,0BAAmB;AACpE,wDAAwD,0BAAmB;AAC3E,qDAAqD,0BAAmB;AACxE,0DAA0D,0BAAmB;AAC7E,yDAAyD,0BAAmB;AAC5E,sDAAsD,0BAAmB;AACzE,kDAAkD,0BAAmB;AACrE,gDAAgD,0BAAmB;AACnE,wCAAwC,0BAAmB;AAC3D,kDAAkD,0BAAmB;AACrE,qDAAqD,0BAAmB;AACxE,8DAA8D,0BAAmB;AACjF,4CAA4C,0BAAmB;AAC/D,oDAAoD,0BAAmB;AACvE,kDAAkD,0BAAmB;AACrE,yDAAyD,0BAAmB;AAC5E,kDAAkD,0BAAmB;AACrE,mDAAmD,0BAAmB;AACtE,oDAAoD,0BAAmB;AACvE,6CAA6C,0BAAmB;AAChE,4CAA4C,0BAAmB;AAC/D,0CAA0C,0BAAmB;AAC7D,0CAA0C,0BAAmB;AAC7D,kDAAkD,0BAAmB;AACrE,wCAAwC,0BAAmB;AAC3D,8CAA8C,0BAAmB;AACjE,yDAAyD,0BAAmB;AAC5E,8CAA8C,0BAAmB;AACjE,4CAA4C,0BAAmB;AAC/D,0DAA0D,0BAAmB;AAC7E,kEAAkE,0BAAmB;AACrF,gDAAgD,0BAAmB;AACnE,yDAAyD,0BAAmB;AAC5E,kDAAkD,0BAAmB;AACrE,wCAAwC,0BAAmB;AAC3D,2CAA2C,0BAAmB;AAC9D,sCAAsC,0BAAmB;AACzD,4CAA4C,0BAAmB;AAC/D,2CAA2C,0BAAmB;AAC9D,iDAAiD,0BAAmB;AACpE,8CAA8C,0BAAmB;AACjE,8CAA8C,0BAAmB;AACjE,gEAAgE,0BAAmB;AACnF,6CAA6C,0BAAmB;AAChE,yCAAyC,0BAAmB;AAC5D,yCAAyC,0BAAmB;AAC5D,kDAAkD,0BAAmB;AACrE,+CAA+C,0BAAmB;AAClE,yDAAyD,0BAAmB;AAC5E,8CAA8C,0BAAmB;AACjE,yCAAyC,0BAAmB;AAC5D,+CAA+C,0BAAmB;AAClE,oDAAoD,0BAAmB;AACvE,qDAAqD,0BAAmB;AACxE,yCAAyC,0BAAmB;AAC5D,+CAA+C,0BAAmB;AAClE,gDAAgD,0BAAmB;AACnE,+CAA+C,0BAAmB;AAClE,6CAA6C,0BAAmB;AAChE,yCAAyC,0BAAmB;AAC5D,6CAA6C,0BAAmB;AAChE,mEAAmE,0BAAmB;AACtF,gEAAgE,0BAAmB;AACnF,mDAAmD,0BAAmB;AACtE,oDAAoD,0BAAmB;AACvE,uCAAuC,0BAAmB;AAC1D,4CAA4C,0BAAmB;AAC/D,wCAAwC,0BAAmB;AAC3D,wCAAwC,0BAAmB;AAC3D,yCAAyC,0BAAmB;AAC5D,uCAAuC,0BAAmB;AAC1D,4CAA4C,0BAAmB;AAC/D,6CAA6C,0BAAmB;AAChE,4CAA4C,0BAAmB;AAC/D,2CAA2C,0BAAmB;AAC9D,6CAA6C,0BAAmB;AAChE,6CAA6C,0BAAmB;AAChE,yCAAyC,0BAAmB;AAC5D,4CAA4C,0BAAmB;AAC/D,iDAAiD,0BAAmB;AACpE,gDAAgD,0BAAmB;AACnE,0CAA0C,0BAAmB;AAC7D,mDAAmD,0BAAmB;AACtE,qDAAqD,0BAAmB;AACxE,sDAAsD,0BAAmB;AACzE,yDAAyD,0BAAmB;AAC5E,2CAA2C,0BAAmB;AAC9D,mDAAmD,0BAAmB;AACtE,sCAAsC,0BAAmB;AACzD,4CAA4C,0BAAmB;AAC/D,oDAAoD,0BAAmB;AACvE,qDAAqD,0BAAmB;AACxE,sDAAsD,0BAAmB;AACzE,0CAA0C,0BAAmB;AAC7D,oDAAoD,0BAAmB;AACvE,gDAAgD,0BAAmB;AACnE,iDAAiD,0BAAmB;AACpE,oDAAoD,0BAAmB;AACvE,+CAA+C,0BAAmB;AAClE,gDAAgD,0BAAmB;AACnE,8CAA8C,0BAAmB;AACjE,kDAAkD,0BAAmB;AACrE,iDAAiD,0BAAmB;AACpE,8CAA8C,0BAAmB;AACjE,gEAAgE,0BAAmB;AACnF,gDAAgD,0BAAmB;AACnE,kDAAkD,0BAAmB;AACrE,4CAA4C,0BAAmB;AAC/D,8CAA8C,0BAAmB;AACjE,2DAA2D,0BAAmB;AAC9E,wDAAwD,0BAAmB;AAC3E,+CAA+C,0BAAmB;AAClE,gDAAgD,0BAAmB;AACnE,2CAA2C,0BAAmB;AAC9D,2CAA2C,0BAAmB;AAC9D,uCAAuC,0BAAmB;AAC1D,4CAA4C,0BAAmB;AAC/D,wCAAwC,0BAAmB;AAC3D,4DAA4D,0BAAmB;AAC/E,uCAAuC,0BAAmB;AAC1D,8CAA8C,0BAAmB;AACjE,yCAAyC,0BAAmB;AAC5D,+CAA+C,0BAAmB;AAClE,gEAAgE,0BAAmB;AACnF,4DAA4D,0BAAmB;AAC/E,2CAA2C,0BAAmB;AAC9D,yCAAyC,0BAAmB;AAC5D,2CAA2C,0BAAmB;AAC9D,yCAAyC,0BAAmB;AAC5D,kDAAkD,0BAAmB;AACrE,6CAA6C,0BAAmB;AAChE,uCAAuC,0BAAmB;AAC1D,kDAAkD,0BAAmB;AACrE,+CAA+C,0BAAmB;AAClE,yCAAyC,0BAAmB;AAC5D,oDAAoD,0BAAmB;AACvE,yCAAyC,0BAAmB;AAC5D,oDAAoD,0BAAmB;AACvE,sDAAsD,0BAAmB;AACzE,mDAAmD,0BAAmB;AACtE,4DAA4D,0BAAmB;AAC/E,4CAA4C,0BAAmB;AAC/D,mDAAmD,0BAAmB;AACtE,uCAAuC,0BAAmB;AAC1D,6CAA6C,0BAAmB;AAChE,kDAAkD,0BAAmB;AACrE,uCAAuC,0BAAmB;AAC1D,oDAAoD,0BAAmB;AACvE,kDAAkD,0BAAmB;AACrE,2CAA2C,0BAAmB;AAC9D,kDAAkD,0BAAmB;AACrE,mDAAmD,0BAAmB;AACtE,oDAAoD,0BAAmB;AACvE,+CAA+C,0BAAmB;AAClE,+CAA+C,0BAAmB;AAClE,qDAAqD,0BAAmB;AACxE,gDAAgD,0BAAmB;AACnE,mDAAmD,0BAAmB;AACtE,+CAA+C,0BAAmB;AAClE,uDAAuD,0BAAmB;AAC1E,+CAA+C,0BAAmB;AAClE,gDAAgD,0BAAmB;AACnE,8CAA8C,0BAAmB;AACjE,0CAA0C,0BAAmB;AAC7D,kDAAkD,0BAAmB;AACrE,uCAAuC,0BAAmB;AAC1D,qDAAqD,0BAAmB;AACxE,qDAAqD,0BAAmB;AACxE,gDAAgD,0BAAmB;AACnE,iDAAiD,0BAAmB;AACpE,gDAAgD,0BAAmB;AACnE,yDAAyD,0BAAmB;AAC5E,kDAAkD,0BAAmB;AACrE,oDAAoD,0BAAmB;AACvE,oDAAoD,0BAAmB;AACvE,+CAA+C,0BAAmB;AAClE,gDAAgD,0BAAmB;AACnE,+CAA+C,0BAAmB;AAClE,+CAA+C,0BAAmB;AAClE,wDAAwD,0BAAmB;AAC3E,iDAAiD,0BAAmB;AACpE,6CAA6C,0BAAmB;AAChE,kDAAkD,0BAAmB;AACrE,2CAA2C,0BAAmB;AAC9D,wCAAwC,0BAAmB;AAC3D,+CAA+C,0BAAmB;AAClE,4DAA4D,0BAAmB;AAC/E,yCAAyC,0BAAmB;AAC5D,yCAAyC,0BAAmB;AAC5D,sCAAsC,0BAAmB;AACzD,kDAAkD,0BAAmB;AACrE,4CAA4C,0BAAmB;AAC/D,8CAA8C,0BAAmB;AACjE,mDAAmD,0BAAmB;AACtE,yCAAyC,0BAAmB;AAC5D,gDAAgD,0BAAmB;AACnE,6CAA6C,0BAAmB;AAChE,2CAA2C,0BAAmB;AAC9D,iDAAiD,0BAAmB;AACpE,2CAA2C,0BAAmB;AAC9D,sDAAsD,0BAAmB;AACzE,2CAA2C,0BAAmB;AAC9D,sDAAsD,0BAAmB;AACzE,+CAA+C,0BAAmB;AAClE,0CAA0C,0BAAmB;AAC7D,qDAAqD,0BAAmB;AACxE,0CAA0C,0BAAmB;AAC7D,qDAAqD,0BAAmB;AACxE,wCAAwC,0BAAmB;AAC3D,8CAA8C,0BAAmB;AACjE,yCAAyC,0BAAmB;AAC5D,iDAAiD,0BAAmB;AACpE,gDAAgD,0BAAmB;AACnE,+CAA+C,0BAAmB;AAClE,+CAA+C,0BAAmB;AAClE,uDAAuD,0BAAmB;AAC1E,4CAA4C,0BAAmB;AAC/D,iDAAiD,0BAAmB;AACpE,iDAAiD,0BAAmB;AACpE,yCAAyC,0BAAmB;AAC5D,wCAAwC,0BAAmB;AAC3D,uCAAuC,0BAAmB;AAC1D,wCAAwC,0BAAmB;AAC3D,iDAAiD,0BAAmB;AACpE,wCAAwC,0BAAmB;AAC3D,8CAA8C,0BAAmB;AACjE,iDAAiD,0BAAmB;AACpE,mEAAmE,0BAAmB;AACtF,2DAA2D,0BAAmB;AAC9E,yCAAyC,0BAAmB;AAC5D,6CAA6C,0BAAmB;AAChE,8CAA8C,0BAAmB;AACjE,gDAAgD,0BAAmB;AACnE,+CAA+C,0BAAmB;AAClE,oDAAoD,0BAAmB;AACvE,yCAAyC,0BAAmB;AAC5D,yCAAyC,0BAAmB;AAC5D,gDAAgD,0BAAmB;AACnE,iDAAiD,0BAAmB;AACpE,6CAA6C,0BAAmB;AAChE,2CAA2C,0BAAmB;AAC9D,4CAA4C,0BAAmB;AAC/D,uCAAuC,0BAAmB;AAC1D,4CAA4C,0BAAmB;AAC/D,gDAAgD,0BAAmB;AACnE,uCAAuC,0BAAmB;AAC1D,0CAA0C,0BAAmB;AAC7D,gDAAgD,0BAAmB;AACnE,iDAAiD,0BAAmB;AACpE,8CAA8C,0BAAmB;AACjE,wCAAwC,0BAAmB;AAC3D,0CAA0C,0BAAmB;AAC7D,4CAA4C,0BAAmB;AAC/D,qDAAqD,0BAAmB;AACxE,6CAA6C,0BAAmB;AAChE,2CAA2C,0BAAmB;AAC9D,0CAA0C,0BAAmB;AAC7D,gDAAgD,0BAAmB;AACnE,wCAAwC,0BAAmB;AAC3D,uCAAuC,0BAAmB;AAC1D,yCAAyC,0BAAmB;AAC5D,6CAA6C,0BAAmB;AAChE,+CAA+C,0BAAmB;AAClE,+CAA+C,0BAAmB;AAClE,gDAAgD,0BAAmB;AACnE,+CAA+C,0BAAmB;AAClE,2CAA2C,0BAAmB;AAC9D,mDAAmD,0BAAmB;AACtE,iDAAiD,0BAAmB;AACpE,6CAA6C,0BAAmB;AAChE,wCAAwC,0BAAmB;AAC3D,qDAAqD,0BAAmB;AACxE,yCAAyC,0BAAmB;AAC5D,oDAAoD,0BAAmB;AACvE,wCAAwC,0BAAmB;AAC3D,4CAA4C,0BAAmB;AAC/D,2CAA2C,0BAAmB;AAC9D,uCAAuC,0BAAmB;AAC1D,0DAA0D,0BAAmB;AAC7E,kDAAkD,0BAAmB;AACrE,2CAA2C,0BAAmB;AAC9D,kDAAkD,0BAAmB;AACrE,kDAAkD,0BAAmB;AACrE,iDAAiD,0BAAmB;AACpE,8CAA8C,0BAAmB;AACjE,8CAA8C,0BAAmB;AACjE,6CAA6C,0BAAmB;AAChE,0CAA0C,0BAAmB;AAC7D,iDAAiD,0BAAmB;AACpE,iDAAiD,0BAAmB;AACpE,gDAAgD,0BAAmB;AACnE,6CAA6C,0BAAmB;AAChE,8CAA8C,0BAAmB;AACjE,oDAAoD,0BAAmB;AACvE,0CAA0C,0BAAmB;AAC7D,mDAAmD,0BAAmB;AACtE,kDAAkD,0BAAmB;AACrE,sDAAsD,0BAAmB;AACzE,kDAAkD,0BAAmB;AACrE,kDAAkD,0BAAmB;AACrE,qDAAqD,0BAAmB;AACxE,oDAAoD,0BAAmB;AACvE,oDAAoD,0BAAmB;AACvE,mDAAmD,0BAAmB;AACtE,mDAAmD,0BAAmB;AACtE,qDAAqD,0BAAmB;AACxE,kDAAkD,0BAAmB;AACrE,sDAAsD,0BAAmB;AACzE,uCAAuC,0BAAmB;AAC1D,4CAA4C,0BAAmB;AAC/D,6CAA6C,0BAAmB;AAChE,8CAA8C,0BAAmB;AACjE,+CAA+C,0BAAmB;AAClE,2CAA2C,0BAAmB;AAC9D,sDAAsD,0BAAmB;AACzE,qDAAqD,0BAAmB;AACxE,mDAAmD,0BAAmB;AACtE,gDAAgD,0BAAmB;AACnE,mDAAmD,0BAAmB;AACtE,wCAAwC,0BAAmB;AAC3D,wCAAwC,0BAAmB;AAC3D,8CAA8C,0BAAmB;AACjE,uDAAuD,0BAAmB;AAC1E,uCAAuC,0BAAmB;AAC1D,4CAA4C,0BAAmB;AAC/D,4CAA4C,0BAAmB;AAC/D,sCAAsC,0BAAmB;AACzD,wCAAwC,0BAAmB;AAC3D,SAAi5jB;AACj5jB;;AAEA,iD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACv4xCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,IAAI;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oBAAoB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gCAAgC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA,0DAA0D;AAC1D,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,MAAM;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,eAAe,aAAa,eAAe;AACjF;AACA;AACA;AACA,yDAAyD,2DAA2D;AACpH;AACA;AACA,wDAAwD,kCAAkC;AAC1F;AACA;AACA;AACA;AACA;AACA,+DAA+D,+BAA+B;AAC9F;AACA;AACA,sDAAsD,+BAA+B,cAAc,eAAe;AAClH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8DAA8D,0BAA0B;AACxF;AACA,qCAAqC,SAAS,oDAAoD,0BAA0B;AAC5H;AACA;AACA;AACA,iEAAiE,4BAA4B;AAC7F;AACA;AACA,+DAA+D,0BAA0B;AACzF;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,iBAAiB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,sEAAsE,EAAE,eAAe;AACvI;AACA,iDAAiD,iEAAiE,EAAE,eAAe;AACnI;AACA,4CAA4C;AAC5C;AACA;AACA;AACA,0CAA0C,EAAE,cAAc;AAC1D;AACA,0CAA0C;AAC1C;AACA;AACA;AACA,0CAA0C,EAAE,gCAAgC;AAC5E;AACA;AACA;AACA;AACA;AACA,gDAAgD,qEAAqE,EAAE,eAAe;AACtI;AACA,iDAAiD,iEAAiE,EAAE,eAAe;AACnI;AACA,4CAA4C;AAC5C;AACA;AACA;AACA,uCAAuC,EAAE,cAAc;AACvD;AACA,4CAA4C;AAC5C;AACA;AACA;AACA,uCAAuC,EAAE,cAAc;AACvD;AACA,0CAA0C;AAC1C;AACA;AACA;AACA,0CAA0C,EAAE,gCAAgC;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,iBAAiB;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY,mCAAmC;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,kCAAkC;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,aAAa;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,CAAC;AACD,4BAA4B,wBAAwB;AACpD,yBAAyB,wBAAwB;AACjD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,sEAAsE,UAAU;AAChF;AACA,CAAC,8BAA8B;;AAE/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,4DAA4D;AACxE;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,gBAAgB,UAAU;AAC1B;AACA,qBAAqB;AACrB;AACA;AACA,qBAAqB;AACrB;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,mCAAmC;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,6BAA6B;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,6BAA6B;AAC/D;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,mCAAmC;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,sBAAsB,gCAAgC;AACtD,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,8BAA8B;AACpD,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,GAAG;AAC/B;AACA,uCAAuC,GAAG;AAC1C;AACA,iBAAiB,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU,GAAG;AACzE,gCAAgC,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,GAAG;AACvG,iCAAiC,GAAG;AACpC;AACA;AACA;AACA;AACA,4DAA4D,GAAG,mFAAmF,GAAG;AACrJ;AACA,sCAAsC,sBAAsB,sCAAsC,uBAAuB,OAAO,GAAG,cAAc;AACjJ;AACA;AACA,uBAAuB,yBAAyB,4DAA4D,EAAE,SAAS,IAAI,MAAM,EAAE,iCAAiC,EAAE,SAAS,IAAI,yBAAyB,IAAI,GAAG,EAAE,aAAa,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,mCAAmC,EAAE,SAAS,IAAI,MAAM,EAAE,iCAAiC,EAAE,SAAS,IAAI,0DAA0D,GAAG;AACrnB;AACA,iDAAiD,IAAI,kCAAkC,KAAK,6CAA6C,KAAK;AAC9I;AACA,gCAAgC,EAAE,+BAA+B,EAAE,2NAA2N,EAAE;AAChS,iGAAiG,GAAG;AACpG;AACA,8BAA8B,EAAE;AAChC;AACA,2BAA2B,sBAAsB,KAAK,gBAAgB;AACtE;AACA;AACA,+EAA+E,EAAE;AACjF,mFAAmF,EAAE;AACrF;AACA,gBAAgB,IAAI,GAAG,EAAE,aAAa,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,mCAAmC,EAAE,SAAS,IAAI,MAAM,EAAE,iCAAiC,EAAE,SAAS,IAAI;AAC5X,kCAAkC,IAAI,GAAG,IAAI,YAAY,IAAI,cAAc,IAAI,GAAG,IAAI,eAAe,IAAI,GAAG,IAAI,aAAa,IAAI,cAAc,IAAI,GAAG,IAAI,cAAc,IAAI,EAAE,IAAI,cAAc,IAAI,GAAG,IAAI,cAAc,IAAI,EAAE,IAAI,cAAc,IAAI,GAAG,IAAI,cAAc,IAAI,EAAE,IAAI,cAAc,IAAI,GAAG,IAAI,cAAc,IAAI,EAAE,IAAI,aAAa,IAAI,gBAAgB,IAAI,EAAE,IAAI,kBAAkB,IAAI,EAAE,IAAI,uBAAuB,IAAI,EAAE,IAAI,aAAa,GAAG,YAAY,IAAI,EAAE,IAAI,GAAG,IAAI,oBAAoB,IAAI,OAAO,IAAI,UAAU,IAAI,mBAAmB,IAAI,OAAO,IAAI,oBAAoB,IAAI,GAAG,IAAI,qBAAqB,IAAI,OAAO,IAAI,UAAU,IAAI,mBAAmB,IAAI,OAAO,IAAI;AAChqB,sCAAsC,IAAI,GAAG,IAAI,YAAY,IAAI,cAAc,IAAI,GAAG,IAAI,eAAe,IAAI,GAAG,IAAI,aAAa,IAAI,cAAc,IAAI,GAAG,IAAI,cAAc,IAAI,EAAE,IAAI,cAAc,IAAI,GAAG,IAAI,cAAc,IAAI,EAAE,IAAI,cAAc,IAAI,GAAG,IAAI,cAAc,IAAI,EAAE,IAAI,cAAc,IAAI,GAAG,IAAI,cAAc,IAAI,EAAE,IAAI,aAAa,IAAI,gBAAgB,IAAI,EAAE,IAAI,kBAAkB,IAAI,EAAE,IAAI,uBAAuB,IAAI,EAAE,IAAI,aAAa,GAAG,YAAY,IAAI,EAAE,IAAI,GAAG,IAAI,oBAAoB,IAAI,OAAO,IAAI,UAAU,IAAI,mBAAmB,IAAI,OAAO,IAAI,oBAAoB,IAAI,GAAG,IAAI,qBAAqB,IAAI,OAAO,IAAI,UAAU,IAAI,mBAAmB,IAAI,OAAO,IAAI;AACpqB;AACA,qCAAqC,EAAE,kBAAkB,EAAE,mBAAmB,EAAE;AAChF;AACA,wCAAwC,EAAE,kBAAkB,EAAE,sBAAsB,EAAE;AACtF;AACA,gCAAgC,EAAE,KAAK,EAAE,KAAK,EAAE;AAChD;AACA,gCAAgC,EAAE;AAClC;AACA,mHAAmH,EAAE;AACrH,iCAAiC,gBAAgB;AACjD;AACA,wBAAwB,EAAE,KAAK,EAAE,KAAK,EAAE;AACxC;AACA;AACA,mBAAmB,MAAM,OAAO,EAAE,gBAAgB;AAClD;AACA;AACA,mBAAmB,MAAM;AACzB;AACA;AACA;AACA;AACA,0BAA0B,sBAAsB;AAChD;AACA;AACA;AACA,mBAAmB,gBAAgB,GAAG,sBAAsB;AAC5D;AACA;AACA;AACA,4BAA4B,EAAE,MAAM,EAAE;AACtC,eAAe,MAAM,GAAG,eAAe;AACvC,0BAA0B,MAAM;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,iDAAiD;AACvF;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,yBAAyB;AAC/D;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,uBAAuB;AAC7D;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gCAAgC,+CAA+C;AAC/E;AACA;AACA,gCAAgC,6CAA6C;AAC7E;AACA;AACA,gCAAgC,+CAA+C;AAC/E;AACA;AACA,gCAAgC,8CAA8C;AAC9E;AACA;AACA,gCAAgC,gDAAgD;AAChF;AACA;AACA,gCAAgC,8CAA8C;AAC9E;AACA;AACA,gCAAgC,+CAA+C;AAC/E;AACA;AACA,gCAAgC,8CAA8C;AAC9E;AACA;AACA,gCAAgC,gDAAgD;AAChF;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gCAAgC,6CAA6C;AAC7E;AACA;AACA,gCAAgC,4CAA4C;AAC5E;AACA;AACA,gCAAgC,8CAA8C;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gCAAgC,uBAAuB;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gCAAgC,kDAAkD;AAClF;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,cAAc;AAC1D,SAAS;AACT;AACA;AACA;AACA;AACA,4CAA4C,qBAAqB;AACjE,SAAS;AACT;AACA;AACA;AACA;AACA,4CAA4C,qBAAqB;AACjE,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,wDAAwD;AACjF,SAAS;AACT;AACA;AACA;AACA;AACA,yBAAyB,wDAAwD;AACjF,SAAS;AACT;AACA;AACA;AACA;AACA,2BAA2B,kDAAkD;AAC7E,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,aAAa;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,gBAAgB,cAAc;AAC9B,gBAAgB,yBAAyB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,6BAA6B;AACpD;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,6BAA6B;AAC5D,iCAAiC,uCAAuC;AACxE,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,6BAA6B;AACxD;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,oBAAoB;AACpB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,8BAA8B,eAAe;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE,cAAc;AACjF;AACA;AACA;AACA,8DAA8D,uBAAuB,sBAAsB,cAAc;AACzH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,4BAA4B,kBAAkB;AAC9C;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,iCAAiC;AACjC;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,sDAAsD;AAC7E,SAAS;AACT;AACA;AACA;AACA;AACA,uBAAuB,sDAAsD;AAC7E,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA,mCAAmC,6CAA6C;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,mCAAmC,6CAA6C;AAChF;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,mCAAmC,6CAA6C;AAChF;AACA;AACA;AACA,uGAAuG,qCAAqC;AAC5I,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,kBAAkB,2CAA2C;AAC7D;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA,yBAAyB;AACzB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,cAAc;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA,qDAAqD,aAAa;AAClE,+BAA+B,sCAAsC;AACrE;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,sDAAsD;AACvD;AACA;AACA;AACA,sCAAsC,SAAS;AAC/C,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,sBAAsB;AAC/D,yCAAyC,sBAAsB;AAC/D;AACA;AACA;AACA,KAAK;AACL,yCAAyC,sBAAsB;AAC/D,qCAAqC,sBAAsB;AAC3D;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,cAAc;AAChC,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,+BAA+B;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAE2rD;;;;;;;;;;;;;;;;;;AC7xI5nD;AACjB;AAExC,MAAM,SAAS,GAAG;IACrB,kBAAkB,EAAE,IAAI,kDAAW,CAAC,qFAAqF,CAAC;IAC1H,YAAY,EAAE,IAAI,yDAAY,CAAC,wCAAwC,EAAE;QACrE,wBAAwB,EAAE,IAAI;QAC9B,qBAAqB,EAAE,IAAI;KAC9B,CAAC;IACF,YAAY,EAAE,IAAI,yDAAY,CAAC,0BAA0B,EAAE;QACvD,qBAAqB,EAAE,IAAI;KAC9B,CAAC;IACF,gBAAgB,EAAE,IAAI,yDAAY,CAAC,oBAAoB,EAAE;QACrD,qBAAqB,EAAE,IAAI;KAC9B,CAAC;CACI,CAAC;AAGJ,MAAM,MAAM,GAAG,IAAI,6CAAM,EAAE,CAAC;AACnC,KAAK,IAAI,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;IAC5C,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;AACjC,CAAC;;;;;;;;;;;;;;;;ACrBsD;AAKhD,MAAM,WAAW;IAOtB,YACE,KAAY,EACI,SAA4B,EACpC,QAAsB,EACd,KAAa;QAFb,cAAS,GAAT,SAAS,CAAmB;QACpC,aAAQ,GAAR,QAAQ,CAAc;QACd,UAAK,GAAL,KAAK,CAAQ;QARxB,aAAQ,GAAa,EAAE,CAAC;QACxB,iBAAY,GAAG,IAAI,GAAG,EAA8B,CAAC;QACrD,iBAAY,GAAG,IAAI,GAAG,EAA8B,CAAC;QAO1D,IAAI,CAAC,QAAQ,GAAG,8CAAG,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACpE,IAAI,CAAC,MAAM,GAAG,8CAAG,CAAC,SAAS,CAAC,gBAAgB,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IAED,YAAY;;QACV,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,IAAI,SAAS,CAAC,eAAe,EAAE,CAAC;YAC9B,KAAK,IAAI,MAAM,IAAI,SAAS,CAAC,eAAe,EAAE,CAAC;gBAC7C,MAAM,cAAc,GAAG,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;oBACrE,OAAO,CAAC,CAAC,UAAU,KAAK,MAAM,CAAC,YAAY;gBAC7C,CAAC,CAAC,CAAC;gBACH,IAAI,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;oBAChD,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;oBAC5D,IAAI,OAAO,EAAE,CAAC;wBACZ,MAAM,SAAS,GAAG,OAAO,CAAC;4BACxB,IAAI,EAAE,MAAM,CAAC,YAAY;4BACzB,QAAQ,EAAE,8CAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;4BAC7E,MAAM;4BACN,UAAU,EAAE,cAAc;4BAC1B,KAAK,EAAE,IAAI;yBACZ,CAAC,CAAC;wBACH,IAAI,SAAS,EAAE,CAAC;4BACd,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;4BAC9B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;4BACzC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;wBAC3C,CAAC;oBACH,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;wBAClB,MAAM,KAAK,GAAG,IAAI,4CAAK,CAAC;4BACtB,IAAI,EAAE,MAAM,CAAC,YAAY;4BACzB,GAAG,EAAE,8CAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;4BACxE,KAAK,EAAE,MAAM,CAAC,KAAK;4BACnB,MAAM,EAAE,MAAM,CAAC,MAAM;4BACrB,MAAM,EAAE,8CAAG,CAAC,oBAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,MAAM,mCAAI,CAAC,EAAE,oBAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,MAAM,mCAAI,CAAC,CAAC;4BACrE,CAAC,EAAE,KAAK;yBACT,CAAC,CAAC;wBACH,MAAM,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;wBAC3D,IAAI,EAAE,EAAE,CAAC;4BACP,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;4BAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;4BAC/D,MAAM,MAAM,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;4BAC5D,IAAI,MAAM,EAAE,CAAC;gCACX,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;4BAC7B,CAAC;wBACH,CAAC;wBAED,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;wBAC1B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;wBACrC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;oBACvC,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,uDAAuD;QACvD,sEAAsE;QACtE,+BAA+B;QAC/B,EAAE;QACF,mFAAmF;QACnF,kDAAkD;QAClD,QAAQ;QACR,EAAE;QACF,gCAAgC;QAChC,iCAAiC;QACjC,qFAAqF;QACrF,cAAc;QACd,kCAAkC;QAClC,mBAAmB;QACnB,QAAQ;QACR,EAAE;QACF,qBAAqB;QACrB,8FAA8F;QAC9F,yDAAyD;QACzD,yBAAyB;QACzB,0DAA0D;QAC1D,0BAA0B;QAC1B,0CAA0C;QAC1C,4CAA4C;QAC5C,iDAAiD;QACjD,UAAU;QACV,QAAQ;QACR,EAAE;QACF,qCAAqC;QACrC,gDAAgD;QAChD,gDAAgD;QAChD,MAAM;QACN,IAAI;IACN,CAAC;IAGD,uBAAuB,CAAC,UAAkB;QACxC,MAAM,YAAY,GAAG,IAAI,CAAC,2BAA2B,CAAC,UAAU,CAAC,CAAC;QAClE,IAAI,OAAO,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAChC,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAChD,IAAI,WAAW,EAAE,CAAC;gBAChB,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,kBAAkB,CAAC,eAAuB,EAAE,KAAW;QACrD,MAAM,YAAY,GAAG,IAAI,CAAC,sBAAsB,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;QACzE,IAAI,OAAO,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAChC,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAChD,IAAI,WAAW,EAAE,CAAC;gBAChB,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;OAIG;IACH,2BAA2B,CAAC,UAAkB;QAC5C,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,iBAAiB,EAAE,KAAK,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;IACrH,CAAC;IAED;;;;OAIG;IACH,sBAAsB,CAAC,eAAuB,EAAE,KAAW;QACzD,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;YAC/C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,IAAI,eAAe,GAAG,KAAK,CAAC;gBAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;oBAC9B,eAAe,GAAG,KAAK,CAAC,iBAAiB,EAAE,CAAC;gBAC9C,CAAC;gBAED,MAAM,KAAK,GAAG,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,iBAAiB,EAAE,KAAK,eAAe,CAAC,iBAAiB,EAAE,CAAC,CAAC;gBACrH,IAAI,KAAK,EAAE,CAAC;oBACV,OAAO,KAAK,CAAC,OAAO,KAAK,eAAe,CAAC;gBAC3C,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,iBAAiB,EAAE,KAAK,eAAe,CAAC,iBAAiB,EAAE,CAAC,CAAC;YAClH,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;CACF;;;;;;;;;;;;;;;ACnKM,MAAM,WAAW,GAAe,KAAK,EAAE,IAAY,EAAE,WAA2B,EAAE,EAAE;IACxF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,QAAO,WAAW,CAAC,WAAW,EAAE,EAAE,CAAC;QAChC,KAAK,KAAK,CAAC,CAAC,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACzC,KAAK,MAAM,CAAC,CAAC,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC1C,OAAO,CAAC,CAAC,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACzC,CAAC;AACJ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACV+B;AACD;AACD;AACE;AACC;AACT;AACO;AACH;AACC;AACH;AACF;;;;;;;;;;;;;;;;ACX4C;AAM7D,MAAM,YAAY;IAQrB,YAAY,KAAY,EAAE,SAA4B,EAAE,QAAsB,EAAkB,KAAa;;QAAb,UAAK,GAAL,KAAK,CAAQ;QACzG,IAAI,CAAC,QAAQ,GAAG,8CAAG,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACpE,IAAI,CAAC,MAAM,GAAG,8CAAG,CAAC,SAAS,CAAC,gBAAgB,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC1E,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,IAAI,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;YAEjE,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC;YAC9B,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC;YACjC,IAAI,CAAC,OAAO,GAAG,IAAI,8CAAO,CAAC;gBACvB,IAAI,EAAE,SAAS,CAAC,YAAY;gBAC5B,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;gBACnC,SAAS,EAAE,SAAS,CAAC,UAAU;gBAC/B,UAAU,EAAE,SAAS,CAAC,UAAU;gBAChC,IAAI;gBACJ,OAAO;aACV,CAAC,CAAC;YACH,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC;YACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,wDAAiB,CAAC,CAAC;YACrD,QAAQ,CAAC,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC;YAEvC,4BAA4B;YAC5B,MAAM,aAAa,GAAG,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;gBAChE,OAAO,SAAS,CAAC,YAAY,KAAK,CAAC,CAAC,UAAU,CAAC;YACnD,CAAC,CAAC,CAAC;YAEH,IAAI,aAAa,EAAE,CAAC;gBAChB,MAAM,UAAU,GAAG,aAAa,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;;oBACtD,OAAO,UAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,UAAU,0CAAE,iBAAiB,EAAE,MAAK,OAAO,CAAC;gBAC5D,CAAC,CAAC,CAAC;gBAEH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACnD,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC;oBAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC;oBACvC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;oBAClD,IAAI,UAAU,IAAI,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,KAAK,EAAE,CAAC;wBAC7D,IAAK,CAAC,KAAK,GAAG,IAAI,CAAC;oBACvB,CAAC;oBAED,8EAA8E;oBAC9E,IAAI,CAAC,UAAU,IAAI,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;wBAC/C,IAAK,CAAC,KAAK,GAAG,IAAI,CAAC;oBACvB,CAAC;gBACL,CAAC;gBAED,IAAI,SAAS,CAAC,eAAe,EAAE,CAAC;oBAC5B,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;oBAChE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;wBACvD,MAAM,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;wBACzC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;wBAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;wBAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;wBACpD,IAAI,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;4BACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,UAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,mCAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,GAAG,CAAC,UAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,mCAAI,CAAC,CAAC,CAAC,CAAC,CAAC;4BACzK,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,UAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,mCAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,GAAG,CAAC,UAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,mCAAI,CAAC,CAAC,CAAC,CAAC,CAAC;4BACzK,uBAAuB;4BACvB,uBAAuB;4BACvB,kFAAkF;4BAClF,MAAM,cAAc,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;4BACzC,MAAM,YAAY,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;4BACvC,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;4BACpE,IAAI,cAAc,IAAI,YAAY,EAAE,CAAC;gCACjC,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;gCACxB,MAAM,CAAC,cAAc,GAAG,cAAc,CAAC;gCACvC,MAAM,CAAC,YAAY,GAAG,YAAY,CAAC;4BACvC,CAAC;4BACD,IAAI,MAAM,EAAE,CAAC;gCACT,MAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;4BAC/B,CAAC;iCAAM,CAAC;gCACJ,OAAO,CAAC,KAAK,CAAC,8CAA8C,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;4BACtF,CAAC;wBACL,CAAC;oBACL,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;CACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;AC1FwC;AACiB;AACF;AACgC;AAC7C;AACE;AACkE;AAC9D;AACb;AACJ;AACa;AACE;AAmIxC,MAAM,YAAY;IAyBrB,YAA4B,IAAY,EAAE,OAA6B;QAA3C,SAAI,GAAJ,IAAI,CAAQ;QAnBjC,aAAQ,GAAG,IAAI,GAAG,EAAmB,CAAC;QACtC,WAAM,GAAG,IAAI,GAAG,EAAiB,CAAC;QAClC,iBAAY,GAAG,IAAI,GAAG,EAAiB,CAAC;QACxC,cAAS,GAAG,IAAI,GAAG,EAAuD,CAAC;QAC3E,eAAU,GAAe,qDAAW,CAAC;QAGpC,iBAAY,GAAG,IAAI,sDAAW,CAAC,kDAAW,CAAC,CAAC;QAC5C,iBAAY,GAAG,IAAI,sDAAW,CAAC,0DAAa,CAAC,CAAC;QAGtC,gBAAW,GAAW,CAAC,CAAC;QACxB,gBAAW,GAAW,CAAC,CAAC;QACxB,uBAAkB,GAAY,IAAI,CAAC;QACnC,0BAAqB,GAAY,KAAK,CAAC;QACvC,6BAAwB,GAAY,KAAK,CAAC;QAC1C,aAAQ,GAAY,KAAK,CAAC;QAC1B,WAAM,GAAY,IAAI,CAAC;QAGnC,MAAM,EACF,kBAAkB,EAClB,wBAAwB,EACxB,yBAAyB,EACzB,OAAO,EACP,qBAAqB,EACrB,UAAU,EACV,MAAM,EACN,QAAQ,EACR,WAAW,EACd,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,IAAI,CAAC,MAAM,CAAC;QACpC,IAAI,CAAC,QAAQ,GAAG,QAAQ,aAAR,QAAQ,cAAR,QAAQ,GAAI,IAAI,CAAC,QAAQ,CAAC;QAC1C,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,aAAlB,kBAAkB,cAAlB,kBAAkB,GAAI,IAAI,CAAC,kBAAkB,CAAC;QACxE,IAAI,CAAC,wBAAwB,GAAG,wBAAwB,aAAxB,wBAAwB,cAAxB,wBAAwB,GAAI,IAAI,CAAC,wBAAwB,CAAC;QAC1F,IAAI,CAAC,qBAAqB,GAAG,qBAAqB,aAArB,qBAAqB,cAArB,qBAAqB,GAAI,IAAI,CAAC,qBAAqB,CAAC;QACjF,IAAI,CAAC,WAAW,GAAG,WAAW,aAAX,WAAW,cAAX,WAAW,GAAI,IAAI,CAAC,WAAW,CAAC;QACnD,IAAI,CAAC,UAAU,GAAG,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,IAAI,CAAC,UAAU,CAAC;QAChD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,KAAK,MAAM,GAAG,IAAI,yBAAyB,EAAE,CAAC;YAC1C,IAAI,CAAC,+BAA+B,CAAC,GAAG,EAAE,yBAAyB,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9E,CAAC;IAEL,CAAC;IACD,KAAK,CAAC,IAAI;;QACN,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACtD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,IAAI,CAAC;gBACD,IAAI,CAAC,eAAe,GAAG,uDAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3D,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,OAAO,CAAC,KAAK,CAAC,0CAA0C,IAAI,CAAC,IAAI,2FAA2F,CAAC,CAAC;gBAC9J,OAAO,CAAC,KAAK,CAAC,oEAAoE,CAAC;gBACnF,MAAM,CAAC,CAAC;YACZ,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,eAAe,GAAG,IAA2B,CAAC;QACvD,CAAC;QAED,IAAI,yDAAO,CAAC,YAAY,CAAC,oBAAoB,EAAE,UAAI,CAAC,eAAe,CAAC,WAAW,mCAAI,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC;YAC/F,OAAO,CAAC,IAAI,CAAC,iDAAiD,YAAY,CAAC,oBAAoB,uCAAuC,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC;QAC7K,CAAC;QAED,2BAA2B;QAC3B,oBAAoB;QACpB,MAAM,YAAY,GAAgC,EAAE,CAAC;QACrD,KAAK,IAAI,OAAO,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACrD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBAClB,MAAM,SAAS,GAAG,8DAAkB,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC/E,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;gBACpD,MAAM,eAAe,GAAG,IAAI,6CAAO,CAAC;oBAChC,KAAK;oBACL,WAAW,EAAE,OAAO;iBACvB,CAAC,CAAC;gBACH,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;YACpD,CAAC;iBAAM,CAAC;gBACJ,IAAI,OAAO,CAAC,UAAU,KAAK,gBAAgB,EAAE,CAAC;oBAC1C,OAAO,CAAC,IAAI,CAAC,iCAAiC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;gBACxE,CAAC;YACL,CAAC;QACL,CAAC;QAED,6BAA6B;QAC7B,0BAA0B;QAC1B,KAAK,IAAI,KAAK,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC;YAC5C,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;gBACxB,kBAAkB;gBAClB,MAAM,SAAS,GAAG,8DAAkB,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,eAAe,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;gBACrF,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,EAAE;oBACxC,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,UAAU,EAAE,IAAI,CAAC,UAAU;oBAC3B,WAAW,EAAE,IAAI,CAAC,YAAY;oBAC9B,OAAO,EAAE,IAAI,CAAC,OAAO;iBACxB,CAAC,CAAC;YACP,CAAC;iBAAM,CAAC;gBACJ,kBAAkB;gBAClB,MAAM,aAAa,GAAG,IAAI,yCAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;gBAC7C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;gBAC1C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,aAAa,CAAC,CAAC;YACzE,CAAC;QACL,CAAC;QAED,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACxE,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACvC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACtD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACrF,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC;IAC5C,CAAC;IAAA,CAAC;IAEF,QAAQ;QACJ,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,+BAA+B,CAAC,oBAA4B,EAAE,OAAoD;QAC9G,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;IAED,iCAAiC,CAAC,SAAsE;QACpG,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;YAC1B,IAAI,CAAC,+BAA+B,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9D,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,QAAQ,CAAC,UAAkB;QACvB,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED;;;OAGG;IACH,eAAe,CAAC,eAAwB;QACpC,IAAI,OAAO,GAAkB,EAAE,CAAC;QAChC,IAAI,eAAe,EAAE,CAAC;YAClB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;YAC7C,IAAI,KAAK,EAAE,CAAC;gBACR,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBAC7B,IAAI,KAAK,YAAY,uDAAW,EAAE,CAAC;wBAC/B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACxB,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;gBACvC,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBAC7B,IAAI,KAAK,YAAY,uDAAW,EAAE,CAAC;wBAC/B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACxB,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;QAED,OAAO,OAAO;IAClB,CAAC;IAED,aAAa,CAAC,UAAmB;QAC7B,IAAI,OAAO,GAAgB,EAAE,CAAC;QAC9B,IAAI,UAAU,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YACxC,IAAI,KAAK,EAAE,CAAC;gBACR,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBAC7B,IAAI,KAAK,YAAY,kDAAS,EAAE,CAAC;wBAC7B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACxB,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;gBACvC,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBAC7B,IAAI,KAAK,YAAY,kDAAS,EAAE,CAAC;wBAC7B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACxB,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,gBAAgB,CAAC,UAAmB;QAChC,IAAI,OAAO,GAAmB,EAAE,CAAC;QACjC,IAAI,UAAU,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YACxC,IAAI,KAAK,EAAE,CAAC;gBACR,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBAC7B,IAAI,KAAK,YAAY,yDAAY,EAAE,CAAC;wBAChC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACxB,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;gBACvC,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBAC7B,IAAI,KAAK,YAAY,yDAAY,EAAE,CAAC;wBAChC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACxB,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;;OAIG;IACH,2BAA2B,CAAC,UAAkB,EAAE,MAAiB;QAC7D,IAAI,OAAO,GAAyB,EAAE,CAAC;QACvC,MAAM,cAAc,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACnG,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAC3C,KAAK,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;gBACvB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,CAAC,UAAU,CAAC,CAAC,CAAC;YAC5E,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;;OAIG;IACH,sBAAsB,CAAC,eAAuB,EAAE,KAAW,EAAE,MAAiB;QAC1E,IAAI,OAAO,GAAyB,EAAE,CAAC;QACvC,MAAM,cAAc,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACnG,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAC3C,KAAK,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;gBACvB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC,CAAC;YACnF,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;;OAIG;IACH,uBAAuB,CAAC,UAAkB,EAAE,MAAiB;QACzD,IAAI,OAAO,GAAkB,EAAE,CAAC;QAChC,MAAM,cAAc,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACnG,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAC3C,KAAK,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;gBACvB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,UAAU,CAAC,CAAC,CAAC;YACxE,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;;;OAKG;IACH,kBAAkB,CAAC,eAAuB,EAAE,KAAW,EAAE,MAAiB;QACtE,IAAI,OAAO,GAAkB,EAAE,CAAC;QAChC,MAAM,cAAc,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACnG,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAC3C,KAAK,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;gBACvB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC,CAAC;YAC/E,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;OAGG;IACH,cAAc,CAAC,MAAiB;QAC5B,MAAM,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;QACxD,IAAI,MAAM,GAAuB,IAAI,CAAC;QACtC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACvC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC/C,SAAS;YACb,CAAC;YACD,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;YACzE,IAAI,cAAc,EAAE,CAAC;gBACjB,MAAM,UAAU,GAAG,kDAAW,CAAC,aAAa,CACxC,cAAc,CAAC,OAAO,CAAC,SAAS,GAAG,cAAc,CAAC,OAAO,CAAC,OAAO,EACjE,cAAc,CAAC,OAAO,CAAC,UAAU,GAAG,cAAc,CAAC,OAAO,CAAC,IAAI,EAC/D,6CAAM,CAAC,IAAI,EACX,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBAChC,IAAI,CAAC,MAAM,EAAE,CAAC;oBACV,MAAM,GAAG,UAAU,CAAC;gBACxB,CAAC;qBAAM,CAAC;oBACJ,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBACxC,CAAC;YACL,CAAC;QACL,CAAC;QACD,OAAO,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,IAAI,kDAAW,EAAE,CAAC;IACvC,CAAC;IAED,UAAU,CAAC,KAAY,EAAE,OAA2B;;QAChD,MAAM,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,EAAC,GAAG,EAAE,8CAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,GAAG,OAAO,EAAC,CAAC;QAErF,KAAK,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;YAC5C,IAAI,aAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,WAAW,0CAAE,MAAM,EAAE,CAAC;gBAC/B,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC5D,SAAS;gBACb,CAAC;YACL,CAAC;YACD,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBAC7B,IAAI,KAAK,YAAY,kDAAS,IAAI,KAAK,YAAY,yDAAY,EAAE,CAAC;oBAC9D,KAAK,CAAC,OAAO,CAAC,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBAC/C,IAAI,CAAC,eAAe,EAAE,CAAC;wBACnB,KAAK,CAAC,OAAO,CAAC,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;oBAC9D,CAAC;oBACD,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC;gBAC5B,CAAC;qBAAM,CAAC;oBACJ,KAAK,CAAC,YAAY,EAAE;oBACpB,KAAK,IAAI,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;wBAChC,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,yDAAkB,CAAC,CAAC;wBAC1C,IAAI,EAAE,EAAE,CAAC;4BACL,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;4BACzB,IAAI,CAAC,eAAe,EAAE,CAAC;gCACnB,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;4BACxC,CAAC;wBACL,CAAC;wBACD,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;oBACtB,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;QAED,IAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9D,IAAI,MAAM,EAAE,CAAC;gBACT,KAAK,CAAC,MAAM,CAAC,GAAG,GAAG,8CAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBACnD,MAAM,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,iBAAiB,EAAE,KAAK,MAAM,CAAC,CAAC;gBAC5F,IAAI,IAAI,EAAE,CAAC;oBACP,KAAK,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;gBACtC,CAAC;YACL,CAAC;QACL,CAAC;QAED,IAAI,IAAI,CAAC,wBAAwB,EAAE,CAAC;YAChC,IAAI,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,WAAW,CAAC,CAAC;YACvD,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC7B,KAAK,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC5C,IAAI,aAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,WAAW,0CAAE,MAAM,EAAE,CAAC;oBAC/B,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;wBAC5D,SAAS;oBACb,CAAC;gBACL,CAAC;gBACD,KAAK,CAAC,eAAe,GAAG,KAAK,CAAC,eAAe,CAAC;gBAC9C,MAAM;YACV,CAAC;QACL,CAAC;IAGL,CAAC;;AAnXa,iCAAoB,GAAG,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;AC/IC;AAEL;AACW;AACxB;AACI;AAWpC;;GAEG;AACI,MAAM,aAAa;IAMtB,YAA4B,IAAY,EAAkB,QAAsB,EAAE,OAA8B;QAApF,SAAI,GAAJ,IAAI,CAAQ;QAAkB,aAAQ,GAAR,QAAQ,CAAc;QALxE,eAAU,GAAe,qDAAW,CAAC;QAG7B,WAAM,GAAY,IAAI,CAAC;QACvB,aAAQ,GAAY,KAAK,CAAC;QAEtC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;QAC9E,IAAI,CAAC,UAAU,GAAG,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,IAAI,CAAC,UAAU,CAAC;QAChD,IAAI,CAAC,MAAM,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,IAAI,CAAC,MAAM,CAAC;QACpC,IAAI,CAAC,QAAQ,GAAG,QAAQ,aAAR,QAAQ,cAAR,QAAQ,GAAI,IAAI,CAAC,QAAQ,CAAC;QAC1C,IAAI,CAAC,WAAW,GAAG,WAAW,aAAX,WAAW,cAAX,WAAW,GAAI,IAAI,sDAAW,CAAC,kDAAW,CAAC,CAAC;QAC/D,IAAI,CAAC,OAAO,GAAG,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,IAAI,CAAC,OAAO,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,IAAI;QACN,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACtD,IAAI,KAAgB,CAAC;QACrB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,IAAI,CAAC;gBACD,KAAK,GAAG,6CAAS,CAAC,KAAK,CAAC,IAAI,CAAC;YACjC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,OAAO,CAAC,KAAK,CAAC,sCAAsC,IAAI,CAAC,IAAI,iDAAiD,CAAC,CAAC;gBAChH,MAAM,CAAC,CAAC;YACZ,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,KAAK,GAAG,IAAiB,CAAC;QAC9B,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,GAAG,IAAI,yCAAK,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvD,CAAC;IACD,QAAQ;QACJ,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IACvB,CAAC;CAEJ;;;;;;;;;;;;;;;;;;;ACrDiC;AACW;AACE;AAEN;AAGlC,MAAM,KAAK;IAKd,YAAmB,SAAoB,EAAS,QAAsB;;QAAnD,cAAS,GAAT,SAAS,CAAW;QAAS,aAAQ,GAAR,QAAQ,CAAc;QAF/D,WAAM,GAA+C,EAAE,CAAC;QAG3D,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;YACtB,IAAI,CAAC,eAAe,GAAG,4CAAK,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,SAAS,CAAC,cAAc,EAAE,CAAC;YAC3B,IAAI,KAAK,GAAG,QAAQ,CAAC,WAAW,CAAC;YACjC,IAAI,MAAM,GAAG,SAAS,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC;YACxD,KAAK,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;gBACvB,IAAI,YAAK,CAAC,eAAe,0CAAE,MAAM,MAAK,CAAC,EAAE,CAAC;oBACtC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,sDAAW,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;gBACpE,CAAC;gBAED,IAAI,YAAK,CAAC,SAAS,0CAAE,MAAM,MAAK,CAAC,EAAE,CAAC;oBAChC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,kDAAS,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;gBAClE,CAAC;gBAED,mEAAmE;gBACnE,IAAI,YAAK,CAAC,UAAU,0CAAE,MAAM,MAAK,CAAC,IAAI,YAAK,CAAC,cAAc,0CAAE,MAAM,MAAK,CAAC,EAAE,CAAC;oBACvE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,wDAAY,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;gBACrE,CAAC;gBACD,KAAK,EAAE,CAAC;YACZ,CAAC;QACL,CAAC;IACL,CAAC;CACJ;;;;;;;;;;;;;;;AChCA;;GAEG;AACI,MAAM,WAAW;IAIrB,YAA4B,IAA+B;QAA/B,SAAI,GAAJ,IAAI,CAA2B;QAHnD,YAAO,GAAG,KAAK,CAAC;QACxB,UAAK,GAAG,IAAI,GAAG,EAAa,CAAC;IAEgC,CAAC;IAE9D,QAAQ,CAAC,GAAG,IAAW;QACpB,IAAI,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9C,IAAI,QAAQ,EAAE,CAAC;YACZ,OAAO,QAAQ,CAAC;QACnB,CAAC;QAED,QAAQ,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;QACzC,OAAO,QAAQ,CAAC;IACnB,CAAC;IAED,MAAM;QACH,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAChB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1C,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC9E,CAAC;IAED,KAAK,CAAC,IAAI;QACP,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAE1E,qCAAqC;QACrC,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBAChC,OAAO,CAAC,KAAK,CAAC,6BAA6B,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,wDAAwD,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;gBACnI,OAAO,EAAE,CAAC;YACb,CAAC;QACJ,CAAC;QACD,IAAI,OAAO,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,iBAAiB,OAAO,YAAY,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACvB,CAAC;CACH;;;;;;;;;;;;;;;;;;AC7CK,SAAS,gBAAgB,CAAC,SAAiB;IAC/C,MAAM,kBAAkB,GAAG,yCAAyC;IAEpE,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAEpD,IAAI,OAAO,EAAE,CAAC;QACX,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACzB,OAAO,KAAK,CAAC;IAChB,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,wCAAwC,SAAS,EAAE,CAAC,CAAC;AACxE,CAAC;AAEM,SAAS,OAAO,CAAC,SAAiB,EAAE,OAAgB;IAExD,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;QACtC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5B,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5B,OAAO,MAAM,CAAC;YACjB,CAAC;QACJ,CAAC;aAAM,CAAC;YACL,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,KAAK,EAAE,CAAC;gBACT,OAAO,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAAA;AAAA,EAAC;YAC/C,CAAC;QACJ,CAAC;IACJ,CAAC;IACD,OAAO,SAAS,CAAC;AACpB,CAAC;AAEM,SAAS,SAAS,CAAC,SAAiB,EAAE,OAAiB;IAC3D,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC3B,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;QACtC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5B,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5B,OAAO,IAAI,CAAC;YACf,CAAC;QACJ,CAAC;aAAM,CAAC;YACL,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,KAAK,EAAE,CAAC;gBACT,OAAO,IAAI,CAAC;YACf,CAAC;QACJ,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AAChB,CAAC;AAGM,SAAS,kBAAkB,CAAC,QAAgB,EAAE,cAAsB,EAAE,OAAiB;IAC3F,IAAI,SAAS,CAAC,cAAc,EAAE,OAAO,CAAC,IAAI,OAAO,EAAE,CAAC;QACjD,OAAO,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,iCAAiC;IACjC,IAAI,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,OAAO,cAAc,CAAC;IACzB,CAAC;IAED,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,aAAa,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAChD,0DAA0D;IAC1D,IAAI,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACrD,WAAW,CAAC,GAAG,EAAE,CAAC;IACrB,CAAC;IACD,OAAO,WAAW,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACtD,CAAC;;;;;;;;;;;;;;;;ACrEmE;AAO7D,MAAM,SAAS;IAOlB,YAAY,KAAY,EAAE,SAA4B,EAAE,QAAsB,EAAkB,KAAa;;QAAb,UAAK,GAAL,KAAK,CAAQ;QACzG,IAAI,CAAC,QAAQ,GAAG,8CAAG,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACpE,IAAI,CAAC,MAAM,GAAG,8CAAG,CAAC,SAAS,CAAC,gBAAgB,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC1E,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,8CAAO,CAAC;YACvB,IAAI,EAAE,SAAS,CAAC,YAAY;YAC5B,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;YACnC,SAAS,EAAE,SAAS,CAAC,UAAU;YAC/B,UAAU,EAAE,SAAS,CAAC,UAAU;YAChC,IAAI,EAAE,SAAS,CAAC,MAAM;YACtB,OAAO,EAAE,SAAS,CAAC,MAAM;SAC5B,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,wDAAiB,CAAC,CAAC;QACrD,QAAQ,CAAC,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC;QAGvC,IAAI,SAAS,CAAC,eAAe,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;YAChE,KAAK,IAAI,IAAI,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;gBACnC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;gBAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;gBAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBACpD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;oBACf,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,UAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,mCAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,GAAG,CAAC,UAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,mCAAI,CAAC,CAAC,CAAC,CAAC,CAAC;oBACzK,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,UAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,mCAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,GAAG,CAAC,UAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,mCAAI,CAAC,CAAC,CAAC,CAAC,CAAC;oBACzK,uBAAuB;oBACvB,uBAAuB;oBACvB,kFAAkF;oBAClF,MAAM,cAAc,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;oBACzC,MAAM,YAAY,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;oBACvC,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;oBACpE,IAAI,cAAc,IAAI,YAAY,EAAE,CAAC;wBACjC,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;wBACxB,MAAM,CAAC,cAAc,GAAG,cAAc,CAAC;wBACvC,MAAM,CAAC,YAAY,GAAG,YAAY,CAAC;oBACvC,CAAC;oBACD,IAAI,MAAM,EAAE,CAAC;wBACT,MAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;oBAC/B,CAAC;yBAAM,CAAC;wBACJ,OAAO,CAAC,KAAK,CAAC,8CAA8C,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;oBACtF,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,SAAS,CAAC,eAAe,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACtG,CAAC;IAEL,CAAC;CACJ;;;;;;;;;;;;;;;;AC/D4D;AAQtD,MAAM,OAAO;IAIhB,YAAY,OAAuB;;QAC/B,MAAM,EAAC,KAAK,EAAE,WAAW,EAAC,GAAG,OAAO,CAAC;QACrC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,WAAW,GAAG,kDAAW,CAAC,eAAe,CAAC;YAC3C,KAAK;YACL,IAAI,EAAE;gBACF,IAAI,EAAE,WAAW,CAAC,KAAK,GAAG,WAAW,CAAC,YAAY;gBAClD,OAAO,EAAE,WAAW,CAAC,KAAK,GAAG,WAAW,CAAC,YAAY;gBACrD,YAAY,EAAE,WAAW,CAAC,YAAY;gBACtC,WAAW,EAAE,WAAW,CAAC,YAAY;aACxC;YACD,OAAO,EAAE;gBACL,MAAM,EAAE;oBACJ,CAAC,EAAE,iBAAW,CAAC,OAAO,mCAAI,CAAC;oBAC3B,CAAC,EAAE,iBAAW,CAAC,OAAO,mCAAI,CAAC;iBAC9B;gBACD,YAAY,EAAE;oBACV,CAAC,EAAE,iBAAW,CAAC,OAAO,mCAAI,CAAC;oBAC3B,CAAC,EAAE,iBAAW,CAAC,OAAO,mCAAI,CAAC;iBAC9B;aACJ;SACJ,CAAC,CAAC;IACP,CAAC;CACJ;;;;;;;;;;;;;;;;;;;;;ACpCuB;AAIxB,MAAM,oBAAoB,GAAG,kCAAC,CAAC,MAAM,CAAC;IAClC,CAAC,EAAE,kCAAC,CAAC,MAAM,EAAE;IACb,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,CAAC,EAAE,kCAAC,CAAC,MAAM,EAAE;IACb,CAAC,EAAE,kCAAC,CAAC,MAAM,EAAE;IACb,CAAC,EAAE,kCAAC,CAAC,MAAM,EAAE;CAChB,CAAC,CAAC;AACH,MAAM,SAAS,GAAG,kCAAC,CAAC,KAAK,CAAC,CAAC,kCAAC,CAAC,MAAM,EAAE,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AACpD,MAAM,iBAAiB,GAAG,kCAAC,CAAC,MAAM,CAAC;IAC/B,YAAY,EAAE,kCAAC,CAAC,MAAM,EAAE;IACxB,MAAM,EAAE,oBAAoB,CAAC,QAAQ,EAAE;IACvC,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE,EAAC,mJAAmJ;IACtK,OAAO,EAAE,kCAAC,CAAC,GAAG,EAAE;IAChB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;CACrB,CAAC;AACF,MAAM,gBAAgB,GAAG,kCAAC,CAAC,MAAM,CAAC;IAC9B,CAAC,EAAE,kCAAC,CAAC,MAAM,EAAE;IACb,CAAC,EAAE,kCAAC,CAAC,MAAM,EAAE,EAAE,sBAAsB;IACrC,EAAE,EAAE,SAAS;IACb,GAAG,EAAE,SAAS;IACd,CAAC,EAAE,kCAAC,CAAC,MAAM,EAAE;CAChB,CAAC,CAAC;AAEI,MAAM,kBAAkB,GAAG,kCAAC,CAAC,MAAM,CAAC;IACvC,MAAM,EAAE,SAAS;IACjB,YAAY,EAAE,kCAAC,CAAC,MAAM,EAAE;IACxB,OAAO,EAAE,SAAS;IAClB,YAAY,EAAE,kCAAC,CAAC,MAAM,EAAE;IACxB,MAAM,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,EAAE,CAAC;IAC3B,MAAM,EAAE,oBAAoB,CAAC,QAAQ,EAAE;IACvC,QAAQ,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,QAAQ,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,cAAc,EAAE,kCAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC;IAC1C,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;IACf,EAAE,EAAE,SAAS;IACb,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;CACpB,CAAC,CAAC;AAGI,MAAM,iBAAiB,GAAG,kCAAC,CAAC,MAAM,CAAC;IACtC,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,YAAY,EAAE,kCAAC,CAAC,MAAM,EAAE;IACxB,SAAS,EAAE,kCAAC,CAAC,MAAM,EAAE;IACrB,gBAAgB,EAAE,kCAAC,CAAC,MAAM,EAAE;IAC5B,gBAAgB,EAAE,kCAAC,CAAC,MAAM,EAAE;IAC5B,eAAe,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACtC,gBAAgB,EAAC,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACtC,MAAM,EAAE,kCAAC,CAAC,KAAK,CAAC,CAAC,kCAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;IAC1G,cAAc,EAAE,kCAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,sBAAsB;IACjE,eAAe,EAAE,kCAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAC,wBAAwB;IACrE,SAAS,EAAE,kCAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC;IACpC,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;IACf,UAAU,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,EAAE,CAAC,EAAE,oDAAoD;IACrF,WAAW,EAAE,kCAAC,CAAC,MAAM,EAAE;IACvB,OAAO,EAAE,kCAAC,CAAC,MAAM,EAAE;IACnB,kBAAkB,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACzC,SAAS,EAAE,kCAAC,CAAC,MAAM,EAAE;IACrB,SAAS,EAAE,kCAAC,CAAC,MAAM,EAAE;IACrB,OAAO,EAAE,kCAAC,CAAC,OAAO,EAAE;CACvB,CAAC,CAAC;AAGI,MAAM,SAAS,GAAG,kCAAC,CAAC,MAAM,CAAC;IAC9B,SAAS,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,OAAO,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,OAAO,EAAE,kCAAC,CAAC,MAAM,CAAC;QACd,QAAQ,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,KAAK,CAAC,CAAC,kCAAC,CAAC,MAAM,EAAE,EAAE,kCAAC,CAAC,MAAM,EAAE,EAAE,kCAAC,CAAC,MAAM,EAAE,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,sCAAsC;QACpH,KAAK,EAAE,kCAAC,CAAC,KAAK,CAAC,CAAC,kCAAC,CAAC,MAAM,EAAE,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACxC,SAAS,EAAE,SAAS;KACvB,CAAC,CAAC,QAAQ,EAAE;IACb,YAAY,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,CAAC;QAC3B,GAAG,EAAE,kCAAC,CAAC,KAAK,CAAC,CAAC,kCAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QAClM,QAAQ,EAAE,kCAAC,CAAC,MAAM,EAAE;KACvB,CAAC,CAAC;IACH,SAAS,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,eAAe,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACtC,cAAc,EAAE,kCAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC;IAC1C,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;IACf,cAAc,EAAE,kCAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,QAAQ,EAAE,EAAE,gDAAgD;IACvG,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;IACjB,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;IACjB,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;IACf,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;CACrB,CAAC,CAAC;AAGH,MAAM,SAAS,GAAG,kCAAC,CAAC,MAAM,CAAC;IACvB,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;IACf,MAAM,EAAE,kCAAC,CAAC,KAAK,CAAC,SAAS,CAAC;IAC1B,eAAe,EAAC,kCAAC,CAAC,MAAM,EAAE;IAC1B,cAAc,EAAE,kCAAC,CAAC,MAAM,EAAE;IAC1B,6BAA6B;IAC7B,WAAW,EAAE,kCAAC,CAAC,KAAK,CAAC,CAAC,kCAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC;CAChI,CAAC,CAAC;AAGH,MAAM,uBAAuB,GAAG,kCAAC,CAAC,MAAM,CAAC;IACrC,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;IACjB,EAAE,EAAE,kCAAC,CAAC,MAAM,EAAE;IACd,QAAQ,EAAE,oBAAoB,CAAC,QAAQ,EAAE;CAC5C,CAAC,CAAC;AAEH,MAAM,kBAAkB,GAAG,kCAAC,CAAC,MAAM,CAAC;IAChC,eAAe,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACtC,cAAc,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACrC,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,IAAI,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,EAAE,CAAC;IACzB,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;IACf,MAAM,EAAE,kCAAC,CAAC,KAAK,CAAC,uBAAuB,CAAC;CAC3C,CAAC;AAIF,MAAM,qBAAqB,GAAG,kCAAC,CAAC,MAAM,CAAC;IACnC,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,UAAU,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,CAAC;QACzB,IAAI,EAAE,kCAAC,CAAC,MAAM,EAAE;QAChB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;KACrB,CAAC,CAAC;IACH,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,QAAQ,EAAE,kCAAC,CAAC,QAAQ,CAAC,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,CAAC;QAClC,WAAW,EAAE,kCAAC,CAAC,MAAM,EAAE;QACvB,OAAO,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,EAAE,CAAC;KAC/B,CAAC,CAAC,CAAC;IACJ,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,OAAO,EAAE,kCAAC,CAAC,MAAM,EAAE;IACnB,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;IACjB,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;IACjB,OAAO,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,OAAO,EAAE,kCAAC,CAAC,MAAM,EAAE;IACnB,IAAI,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,EAAE,CAAC;IACzB,iBAAiB,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACxC,YAAY,EAAE,kCAAC,CAAC,MAAM,EAAE;IACxB,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;CAClB,CAAC;AAGK,MAAM,mBAAmB,GAAG,kCAAC,CAAC,MAAM,CAAC;IACxC,MAAM,EAAE,kCAAC,CAAC,KAAK,CAAC,CAAC,kCAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;IAC1G,qBAAqB,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5C,cAAc,EAAE,kCAAC,CAAC,MAAM,EAAE;IAC1B,QAAQ,EAAE,kCAAC,CAAC,MAAM,EAAE;IACpB,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,aAAa,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,CAAC;QAC5B,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;QACjB,QAAQ,EAAE,kCAAC,CAAC,MAAM,EAAE;QACpB,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QACjC,IAAI,EAAE,oBAAoB,CAAC,QAAQ,EAAE;QACrC,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;KACpB,CAAC,CAAC;IACH,mBAAmB,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,CAAC;QAClC,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC5B,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QACjC,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;KAClB,CAAC,CAAC;IACH,eAAe,EAAE,kCAAC,CAAC,MAAM,EAAE;IAC3B,eAAe,EAAE,kCAAC,CAAC,MAAM,EAAE;IAC3B,eAAe,EAAE,kCAAC,CAAC,OAAO,EAAE;IAC5B,SAAS,EAAE,kCAAC,CAAC,MAAM,EAAE;IACrB,SAAS,EAAE,kCAAC,CAAC,MAAM,EAAE;IACrB,aAAa,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpC,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;CAClB,CAAC,CAAC;AAGI,MAAM,oBAAoB,GAAG,kCAAC,CAAC,MAAM,CAAC;IACzC,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;IACjB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,gBAAgB,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,EAAE,CAAC;IACrC,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,QAAQ,EAAE,oBAAoB,CAAC,QAAQ,EAAE;IACzC,cAAc,EAAE,kCAAC,CAAC,KAAK,CAAC;QACpB,kCAAC,CAAC,OAAO,CAAC,OAAO,CAAC;QAClB,kCAAC,CAAC,OAAO,CAAC,WAAW,CAAC;QACtB,kCAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;QACnB,kCAAC,CAAC,OAAO,CAAC,SAAS,CAAC;QACpB,kCAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC;QAC5B,kCAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC;QAC9B,kCAAC,CAAC,OAAO,CAAC,WAAW,CAAC;KACzB,CAAC;IACF,SAAS,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,UAAU,EAAE,oBAAoB,CAAC,QAAQ,EAAE;IAC3C,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;IACf,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;CACpB,CAAC,CAAC;AAGH,MAAM,eAAe,GAAG,kCAAC,CAAC,MAAM,CAAC;IAC7B,QAAQ,EAAE,kCAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC;IACxC,KAAK,EAAE,kCAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC;IAClC,MAAM,EAAE,kCAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC;IACpC,QAAQ,EAAE,kCAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC;CAC1C,CAAC;AAGK,MAAM,mBAAmB,GAAG,kCAAC,CAAC,MAAM,CAAC;IACxC,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;IACf,OAAO,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,IAAI,EAAE,eAAe;IACrB,cAAc,EAAE,kCAAC,CAAC,OAAO,EAAE;IAC3B,WAAW,EAAE,kCAAC,CAAC,MAAM,EAAE;IACvB,MAAM,EAAE,kCAAC,CAAC,KAAK,CAAC,SAAS,CAAC;IAC1B,GAAG,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,CAAC;QAClB,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;QACtB,aAAa,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,CAAC;YAC5B,MAAM,EAAE,kCAAC,CAAC,GAAG,EAAE;YACf,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;YACjB,IAAI,EAAE,kCAAC,CAAC,MAAM,EAAE;YAChB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;YAClB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;YAClB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;SACrB,CAAC,CAAC;KACN,CAAC,CAAC;IACH,yBAAyB;IACzB,eAAe,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACtC,cAAc,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACrC,uCAAuC;IACvC,WAAW,EAAE,kCAAC,CAAC,KAAK,CAAC,CAAC,kCAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACxI,MAAM,EAAE,kCAAC,CAAC,KAAK,CAAC,SAAS,CAAC;CAC7B,CAAC,CAAC;;;;;;;UC1OH;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;;;;WCtBA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA,E;;;;;WCPA,wF;;;;;WCAA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D,E;;;;;;;;;;;;;ACLgC;AAEgB;AAChD,4CAAQ,CAAC,sBAAsB,EAAE,CAAC;AAClC,MAAM,IAAI,GAAG,IAAI,6CAAS,CAAC;IACvB,UAAU,EAAE;QACR,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,GAAG;KACd;IACD,kBAAkB,EAAE,KAAK;IACzB,QAAQ,EAAE,IAAI;IACd,UAAU,EAAE,CAAC;IACb,WAAW,EAAE,kDAAc,CAAC,SAAS;CACxC,CAAC,CAAC;AAEH,IAAI,CAAC,KAAK,CAAC,8CAAM,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;IACzB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAE3B,iDAAS,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE;QACjD,GAAG,EAAE,0CAAM,CAAC,CAAC,EAAE,CAAC,CAAC;KACpB,CAAC,CAAC;AACP,CAAC,CAAC,CAAC","sources":["webpack://@excaliburjs/plugin-ldtk/webpack/universalModuleDefinition","webpack://@excaliburjs/plugin-ldtk/./node_modules/compare-versions/lib/esm/compare.js","webpack://@excaliburjs/plugin-ldtk/./node_modules/compare-versions/lib/esm/compareVersions.js","webpack://@excaliburjs/plugin-ldtk/./node_modules/compare-versions/lib/esm/utils.js","webpack://@excaliburjs/plugin-ldtk/./node_modules/excalibur/build/esm/excalibur.development.js","webpack://@excaliburjs/plugin-ldtk/./node_modules/zod/lib/index.mjs","webpack://@excaliburjs/plugin-ldtk/./sample/resources.ts","webpack://@excaliburjs/plugin-ldtk/./src/entity-layer.ts","webpack://@excaliburjs/plugin-ldtk/./src/file-loader.ts","webpack://@excaliburjs/plugin-ldtk/./src/index.ts","webpack://@excaliburjs/plugin-ldtk/./src/intgrid-layer.ts","webpack://@excaliburjs/plugin-ldtk/./src/ldtk-resource.ts","webpack://@excaliburjs/plugin-ldtk/./src/level-resource.ts","webpack://@excaliburjs/plugin-ldtk/./src/level.ts","webpack://@excaliburjs/plugin-ldtk/./src/loader-cache.ts","webpack://@excaliburjs/plugin-ldtk/./src/path-util.ts","webpack://@excaliburjs/plugin-ldtk/./src/tile-layer.ts","webpack://@excaliburjs/plugin-ldtk/./src/tileset.ts","webpack://@excaliburjs/plugin-ldtk/./src/types.ts","webpack://@excaliburjs/plugin-ldtk/webpack/bootstrap","webpack://@excaliburjs/plugin-ldtk/webpack/runtime/define property getters","webpack://@excaliburjs/plugin-ldtk/webpack/runtime/hasOwnProperty shorthand","webpack://@excaliburjs/plugin-ldtk/webpack/runtime/make namespace object","webpack://@excaliburjs/plugin-ldtk/./sample/autotile.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, () => {\nreturn ","import { compareVersions } from './compareVersions.js';\n/**\n * Compare [semver](https://semver.org/) version strings using the specified operator.\n *\n * @param v1 First version to compare\n * @param v2 Second version to compare\n * @param operator Allowed arithmetic operator to use\n * @returns `true` if the comparison between the firstVersion and the secondVersion satisfies the operator, `false` otherwise.\n *\n * @example\n * ```\n * compare('10.1.8', '10.0.4', '>'); // return true\n * compare('10.0.1', '10.0.1', '='); // return true\n * compare('10.1.1', '10.2.2', '<'); // return true\n * compare('10.1.1', '10.2.2', '<='); // return true\n * compare('10.1.1', '10.2.2', '>='); // return false\n * ```\n */\nexport const compare = (v1, v2, operator) => {\n // validate input operator\n assertValidOperator(operator);\n // since result of compareVersions can only be -1 or 0 or 1\n // a simple map can be used to replace switch\n const res = compareVersions(v1, v2);\n return operatorResMap[operator].includes(res);\n};\nconst operatorResMap = {\n '>': [1],\n '>=': [0, 1],\n '=': [0],\n '<=': [-1, 0],\n '<': [-1],\n '!=': [-1, 1],\n};\nconst allowedOperators = Object.keys(operatorResMap);\nconst assertValidOperator = (op) => {\n if (typeof op !== 'string') {\n throw new TypeError(`Invalid operator type, expected string but got ${typeof op}`);\n }\n if (allowedOperators.indexOf(op) === -1) {\n throw new Error(`Invalid operator, expected one of ${allowedOperators.join('|')}`);\n }\n};\n//# sourceMappingURL=compare.js.map","import { compareSegments, validateAndParse } from './utils.js';\n/**\n * Compare [semver](https://semver.org/) version strings to find greater, equal or lesser.\n * This library supports the full semver specification, including comparing versions with different number of digits like `1.0.0`, `1.0`, `1`, and pre-release versions like `1.0.0-alpha`.\n * @param v1 - First version to compare\n * @param v2 - Second version to compare\n * @returns Numeric value compatible with the [Array.sort(fn) interface](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#Parameters).\n */\nexport const compareVersions = (v1, v2) => {\n // validate input and split into segments\n const n1 = validateAndParse(v1);\n const n2 = validateAndParse(v2);\n // pop off the patch\n const p1 = n1.pop();\n const p2 = n2.pop();\n // validate numbers\n const r = compareSegments(n1, n2);\n if (r !== 0)\n return r;\n // validate pre-release\n if (p1 && p2) {\n return compareSegments(p1.split('.'), p2.split('.'));\n }\n else if (p1 || p2) {\n return p1 ? -1 : 1;\n }\n return 0;\n};\n//# sourceMappingURL=compareVersions.js.map","export const semver = /^[v^~<>=]*?(\\d+)(?:\\.([x*]|\\d+)(?:\\.([x*]|\\d+)(?:\\.([x*]|\\d+))?(?:-([\\da-z\\-]+(?:\\.[\\da-z\\-]+)*))?(?:\\+[\\da-z\\-]+(?:\\.[\\da-z\\-]+)*)?)?)?$/i;\nexport const validateAndParse = (version) => {\n if (typeof version !== 'string') {\n throw new TypeError('Invalid argument expected string');\n }\n const match = version.match(semver);\n if (!match) {\n throw new Error(`Invalid argument not valid semver ('${version}' received)`);\n }\n match.shift();\n return match;\n};\nconst isWildcard = (s) => s === '*' || s === 'x' || s === 'X';\nconst tryParse = (v) => {\n const n = parseInt(v, 10);\n return isNaN(n) ? v : n;\n};\nconst forceType = (a, b) => typeof a !== typeof b ? [String(a), String(b)] : [a, b];\nconst compareStrings = (a, b) => {\n if (isWildcard(a) || isWildcard(b))\n return 0;\n const [ap, bp] = forceType(tryParse(a), tryParse(b));\n if (ap > bp)\n return 1;\n if (ap < bp)\n return -1;\n return 0;\n};\nexport const compareSegments = (a, b) => {\n for (let i = 0; i < Math.max(a.length, b.length); i++) {\n const r = compareStrings(a[i] || '0', b[i] || '0');\n if (r !== 0)\n return r;\n }\n return 0;\n};\n//# sourceMappingURL=utils.js.map","/*!\n * excalibur - 0.30.1 - 2024-12-12\n * https://github.com/excaliburjs/Excalibur\n * Copyright (c) 2024 Excalibur.js \n * Licensed BSD-2-Clause\n * @preserve\n */\n/******/ var __webpack_modules__ = ({\n\n/***/ \"./Director/Loader.css\":\n/*!*****************************!*\\\n !*** ./Director/Loader.css ***!\n \\*****************************/\n/***/ ((module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/sourceMaps.js */ \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ \"../../node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `/* Buttons styles start */\r\n\r\nbutton#excalibur-play {\r\n display: inline-block;\r\n position: relative;\r\n z-index: 999;\r\n border-radius: 6px;\r\n border: none;\r\n /*border: 3px solid;\r\n border-color: white;\r\n box-shadow: 0 0 10px #ccc;*/\r\n padding: 1rem 1.5rem 1rem 4rem;\r\n margin: 0;\r\n text-decoration: none;\r\n background: #00b233;\r\n color: #ffffff;\r\n font-family: sans-serif;\r\n font-size: 2rem;\r\n white-space: nowrap;\r\n line-height: 1;\r\n cursor: pointer;\r\n text-align: center;\r\n transition:\r\n background 250ms ease-in-out,\r\n transform 150ms ease;\r\n -webkit-appearance: none;\r\n -moz-appearance: none;\r\n\r\n -webkit-animation: excalibur-button-fadein 200ms; /* Safari, Chrome and Opera > 12.1 */\r\n -moz-animation: excalibur-button-fadein 200ms; /* Firefox < 16 */\r\n -ms-animation: excalibur-button-fadein 200ms; /* Internet Explorer */\r\n -o-animation: excalibur-button-fadein 200ms; /* Opera < 12.1 */\r\n animation: excalibur-button-fadein 200ms;\r\n}\r\n\r\n/*\r\nbutton#excalibur-play {\r\n display: none;\r\n}*/\r\n\r\nbutton#excalibur-play:after {\r\n position: absolute;\r\n content: '';\r\n border: 8px solid;\r\n border-color: transparent transparent transparent white;\r\n left: 35px;\r\n top: 24px;\r\n width: 0;\r\n height: 0;\r\n}\r\n\r\nbutton#excalibur-play:before {\r\n position: absolute;\r\n content: '';\r\n border: 3px solid;\r\n left: 19px;\r\n top: 14px;\r\n border-radius: 20px;\r\n width: 30px;\r\n height: 30px;\r\n}\r\n\r\nbutton#excalibur-play:hover,\r\nbutton#excalibur-play:focus {\r\n background: #00982c;\r\n}\r\n\r\nbutton#excalibur-play:focus {\r\n outline: 1px solid #fff;\r\n outline-offset: -4px;\r\n}\r\n\r\nbutton#excalibur-play:active {\r\n transform: scale(0.99);\r\n}\r\n\r\n@keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n/* Firefox < 16 */\r\n@-moz-keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n/* Safari, Chrome and Opera > 12.1 */\r\n@-webkit-keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n/* Internet Explorer */\r\n@-ms-keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n/* Opera < 12.1 */\r\n@-o-keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./Director/Loader.css\"],\"names\":[],\"mappings\":\"AAAA,yBAAyB;;AAEzB;EACE,qBAAqB;EACrB,kBAAkB;EAClB,YAAY;EACZ,kBAAkB;EAClB,YAAY;EACZ;;+BAE6B;EAC7B,8BAA8B;EAC9B,SAAS;EACT,qBAAqB;EACrB,mBAAmB;EACnB,cAAc;EACd,uBAAuB;EACvB,eAAe;EACf,mBAAmB;EACnB,cAAc;EACd,eAAe;EACf,kBAAkB;EAClB;;wBAEsB;EACtB,wBAAwB;EACxB,qBAAqB;;EAErB,gDAAgD,EAAE,oCAAoC;EACtF,6CAA6C,EAAE,iBAAiB;EAChE,4CAA4C,EAAE,sBAAsB;EACpE,2CAA2C,EAAE,iBAAiB;EAC9D,wCAAwC;AAC1C;;AAEA;;;EAGE;;AAEF;EACE,kBAAkB;EAClB,WAAW;EACX,iBAAiB;EACjB,uDAAuD;EACvD,UAAU;EACV,SAAS;EACT,QAAQ;EACR,SAAS;AACX;;AAEA;EACE,kBAAkB;EAClB,WAAW;EACX,iBAAiB;EACjB,UAAU;EACV,SAAS;EACT,mBAAmB;EACnB,WAAW;EACX,YAAY;AACd;;AAEA;;EAEE,mBAAmB;AACrB;;AAEA;EACE,uBAAuB;EACvB,oBAAoB;AACtB;;AAEA;EACE,sBAAsB;AACxB;;AAEA;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF;;AAEA,iBAAiB;AACjB;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF;;AAEA,oCAAoC;AACpC;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF;;AAEA,sBAAsB;AACtB;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF;;AAEA,iBAAiB;AACjB;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF\",\"sourcesContent\":[\"/* Buttons styles start */\\r\\n\\r\\nbutton#excalibur-play {\\r\\n display: inline-block;\\r\\n position: relative;\\r\\n z-index: 999;\\r\\n border-radius: 6px;\\r\\n border: none;\\r\\n /*border: 3px solid;\\r\\n border-color: white;\\r\\n box-shadow: 0 0 10px #ccc;*/\\r\\n padding: 1rem 1.5rem 1rem 4rem;\\r\\n margin: 0;\\r\\n text-decoration: none;\\r\\n background: #00b233;\\r\\n color: #ffffff;\\r\\n font-family: sans-serif;\\r\\n font-size: 2rem;\\r\\n white-space: nowrap;\\r\\n line-height: 1;\\r\\n cursor: pointer;\\r\\n text-align: center;\\r\\n transition:\\r\\n background 250ms ease-in-out,\\r\\n transform 150ms ease;\\r\\n -webkit-appearance: none;\\r\\n -moz-appearance: none;\\r\\n\\r\\n -webkit-animation: excalibur-button-fadein 200ms; /* Safari, Chrome and Opera > 12.1 */\\r\\n -moz-animation: excalibur-button-fadein 200ms; /* Firefox < 16 */\\r\\n -ms-animation: excalibur-button-fadein 200ms; /* Internet Explorer */\\r\\n -o-animation: excalibur-button-fadein 200ms; /* Opera < 12.1 */\\r\\n animation: excalibur-button-fadein 200ms;\\r\\n}\\r\\n\\r\\n/*\\r\\nbutton#excalibur-play {\\r\\n display: none;\\r\\n}*/\\r\\n\\r\\nbutton#excalibur-play:after {\\r\\n position: absolute;\\r\\n content: '';\\r\\n border: 8px solid;\\r\\n border-color: transparent transparent transparent white;\\r\\n left: 35px;\\r\\n top: 24px;\\r\\n width: 0;\\r\\n height: 0;\\r\\n}\\r\\n\\r\\nbutton#excalibur-play:before {\\r\\n position: absolute;\\r\\n content: '';\\r\\n border: 3px solid;\\r\\n left: 19px;\\r\\n top: 14px;\\r\\n border-radius: 20px;\\r\\n width: 30px;\\r\\n height: 30px;\\r\\n}\\r\\n\\r\\nbutton#excalibur-play:hover,\\r\\nbutton#excalibur-play:focus {\\r\\n background: #00982c;\\r\\n}\\r\\n\\r\\nbutton#excalibur-play:focus {\\r\\n outline: 1px solid #fff;\\r\\n outline-offset: -4px;\\r\\n}\\r\\n\\r\\nbutton#excalibur-play:active {\\r\\n transform: scale(0.99);\\r\\n}\\r\\n\\r\\n@keyframes excalibur-button-fadein {\\r\\n from {\\r\\n opacity: 0;\\r\\n }\\r\\n to {\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n/* Firefox < 16 */\\r\\n@-moz-keyframes excalibur-button-fadein {\\r\\n from {\\r\\n opacity: 0;\\r\\n }\\r\\n to {\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n/* Safari, Chrome and Opera > 12.1 */\\r\\n@-webkit-keyframes excalibur-button-fadein {\\r\\n from {\\r\\n opacity: 0;\\r\\n }\\r\\n to {\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n/* Internet Explorer */\\r\\n@-ms-keyframes excalibur-button-fadein {\\r\\n from {\\r\\n opacity: 0;\\r\\n }\\r\\n to {\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n/* Opera < 12.1 */\\r\\n@-o-keyframes excalibur-button-fadein {\\r\\n from {\\r\\n opacity: 0;\\r\\n }\\r\\n to {\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n\n\n/***/ }),\n\n/***/ \"./Util/Toaster.css\":\n/*!**************************!*\\\n !*** ./Util/Toaster.css ***!\n \\**************************/\n/***/ ((module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/sourceMaps.js */ \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ \"../../node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `#ex-toast-container {\r\n position: absolute;\r\n height: 0;\r\n min-width: 50%;\r\n left: 50%;\r\n top: 0;\r\n}\r\n\r\n.ex-toast-message {\r\n left: -50%;\r\n position: relative;\r\n display: flex;\r\n justify-content: space-between;\r\n\r\n padding: 10px;\r\n margin-top: 5px;\r\n font-size: 18px;\r\n font-family: sans-serif;\r\n border-radius: 6px;\r\n border: 3px solid #b7b779;\r\n background-color: rgb(253, 253, 192);\r\n}\r\n\r\n.ex-toast-message button {\r\n align-self: flex-start;\r\n}\r\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./Util/Toaster.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,kBAAkB;EAClB,SAAS;EACT,cAAc;EACd,SAAS;EACT,MAAM;AACR;;AAEA;EACE,UAAU;EACV,kBAAkB;EAClB,aAAa;EACb,8BAA8B;;EAE9B,aAAa;EACb,eAAe;EACf,eAAe;EACf,uBAAuB;EACvB,kBAAkB;EAClB,yBAAyB;EACzB,oCAAoC;AACtC;;AAEA;EACE,sBAAsB;AACxB\",\"sourcesContent\":[\"#ex-toast-container {\\r\\n position: absolute;\\r\\n height: 0;\\r\\n min-width: 50%;\\r\\n left: 50%;\\r\\n top: 0;\\r\\n}\\r\\n\\r\\n.ex-toast-message {\\r\\n left: -50%;\\r\\n position: relative;\\r\\n display: flex;\\r\\n justify-content: space-between;\\r\\n\\r\\n padding: 10px;\\r\\n margin-top: 5px;\\r\\n font-size: 18px;\\r\\n font-family: sans-serif;\\r\\n border-radius: 6px;\\r\\n border: 3px solid #b7b779;\\r\\n background-color: rgb(253, 253, 192);\\r\\n}\\r\\n\\r\\n.ex-toast-message button {\\r\\n align-self: flex-start;\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n\n\n/***/ }),\n\n/***/ \"../../node_modules/css-loader/dist/runtime/api.js\":\n/*!*********************************************************!*\\\n !*** ../../node_modules/css-loader/dist/runtime/api.js ***!\n \\*********************************************************/\n/***/ ((module) => {\n\n\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\nmodule.exports = function (cssWithMappingToString) {\n var list = [];\n\n // return the list of modules as css string\n list.toString = function toString() {\n return this.map(function (item) {\n var content = \"\";\n var needLayer = typeof item[5] !== \"undefined\";\n if (item[4]) {\n content += \"@supports (\".concat(item[4], \") {\");\n }\n if (item[2]) {\n content += \"@media \".concat(item[2], \" {\");\n }\n if (needLayer) {\n content += \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\");\n }\n content += cssWithMappingToString(item);\n if (needLayer) {\n content += \"}\";\n }\n if (item[2]) {\n content += \"}\";\n }\n if (item[4]) {\n content += \"}\";\n }\n return content;\n }).join(\"\");\n };\n\n // import a list of modules into the list\n list.i = function i(modules, media, dedupe, supports, layer) {\n if (typeof modules === \"string\") {\n modules = [[null, modules, undefined]];\n }\n var alreadyImportedModules = {};\n if (dedupe) {\n for (var k = 0; k < this.length; k++) {\n var id = this[k][0];\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n for (var _k = 0; _k < modules.length; _k++) {\n var item = [].concat(modules[_k]);\n if (dedupe && alreadyImportedModules[item[0]]) {\n continue;\n }\n if (typeof layer !== \"undefined\") {\n if (typeof item[5] === \"undefined\") {\n item[5] = layer;\n } else {\n item[1] = \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\").concat(item[1], \"}\");\n item[5] = layer;\n }\n }\n if (media) {\n if (!item[2]) {\n item[2] = media;\n } else {\n item[1] = \"@media \".concat(item[2], \" {\").concat(item[1], \"}\");\n item[2] = media;\n }\n }\n if (supports) {\n if (!item[4]) {\n item[4] = \"\".concat(supports);\n } else {\n item[1] = \"@supports (\".concat(item[4], \") {\").concat(item[1], \"}\");\n item[4] = supports;\n }\n }\n list.push(item);\n }\n };\n return list;\n};\n\n/***/ }),\n\n/***/ \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\":\n/*!****************************************************************!*\\\n !*** ../../node_modules/css-loader/dist/runtime/sourceMaps.js ***!\n \\****************************************************************/\n/***/ ((module) => {\n\n\n\nmodule.exports = function (item) {\n var content = item[1];\n var cssMapping = item[3];\n if (!cssMapping) {\n return content;\n }\n if (typeof btoa === \"function\") {\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n var sourceMapping = \"/*# \".concat(data, \" */\");\n return [content].concat([sourceMapping]).join(\"\\n\");\n }\n return [content].join(\"\\n\");\n};\n\n/***/ }),\n\n/***/ \"./Graphics/Context/circle-renderer/circle-renderer.frag.glsl\":\n/*!********************************************************************!*\\\n !*** ./Graphics/Context/circle-renderer/circle-renderer.frag.glsl ***!\n \\********************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nprecision highp float;\\r\\n\\r\\n// UV coord\\r\\nin vec2 v_uv;\\r\\n\\r\\n// Color coord to blend with image\\r\\nin lowp vec4 v_color;\\r\\n\\r\\n// Stroke color if used\\r\\nin lowp vec4 v_strokeColor;\\r\\n\\r\\n// Stroke thickness if used\\r\\nin lowp float v_strokeThickness;\\r\\n\\r\\n// Opacity\\r\\nin float v_opacity;\\r\\n\\r\\nout vec4 fragColor;\\r\\n\\r\\nvoid main() {\\r\\n // make (0, 0) the center the uv \\r\\n vec2 uv = v_uv * 2.0 - 1.0;\\r\\n\\r\\n vec4 color = v_color;\\r\\n vec4 strokeColor = v_strokeColor;\\r\\n\\r\\n // circle border is at radius 1.0 \\r\\n // dist is > 0 when inside the circle \\r\\n float d = length(uv);\\r\\n float dist = 1.0 - length(uv);\\r\\n\\r\\n // Fade based on fwidth\\r\\n float fade = fwidth(dot(uv, uv));\\r\\n\\r\\n // if dist is greater than 0 step to 1;\\r\\n // when we cross this 0 threshold add a smooth fade\\r\\n float fill = smoothstep(-fade/2.0, fade/2.0, dist);\\r\\n\\r\\n // if dist is greater than the stroke thickness step to 1\\r\\n float stroke = 1.0 - smoothstep(v_strokeThickness, v_strokeThickness + fade, dist);\\r\\n\\r\\n strokeColor.a *= fill * stroke;\\r\\n strokeColor.rgb *= strokeColor.a;\\r\\n\\r\\n color.a *= fill * (1.0 - stroke);\\r\\n color.rgb *= color.a;\\r\\n\\r\\n vec4 finalColor = mix(vec4(0.0), (color + strokeColor), fill);\\r\\n finalColor.rgb = finalColor.rgb * v_opacity;\\r\\n finalColor.a = finalColor.a * v_opacity;\\r\\n fragColor = finalColor;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/circle-renderer/circle-renderer.vert.glsl\":\n/*!********************************************************************!*\\\n !*** ./Graphics/Context/circle-renderer/circle-renderer.vert.glsl ***!\n \\********************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nin vec2 a_position;\\r\\n\\r\\n// UV coordinate\\r\\nin vec2 a_uv;\\r\\nout vec2 v_uv;\\r\\n\\r\\n// Opacity \\r\\nin float a_opacity;\\r\\nout float v_opacity;\\r\\n\\r\\nin vec4 a_color;\\r\\nout vec4 v_color;\\r\\n\\r\\nin vec4 a_strokeColor;\\r\\nout vec4 v_strokeColor;\\r\\n\\r\\nin float a_strokeThickness;\\r\\nout float v_strokeThickness;\\r\\n\\r\\nuniform mat4 u_matrix;\\r\\n\\r\\n\\r\\nvoid main() {\\r\\n // Set the vertex position using the ortho transform matrix\\r\\n gl_Position = u_matrix * vec4(a_position, 0.0, 1.0);\\r\\n\\r\\n // Pass through UV coords\\r\\n v_uv = a_uv;\\r\\n // Pass through the Opacity to the fragment shader\\r\\n v_opacity = a_opacity;\\r\\n // Pass through the color to the fragment shader\\r\\n v_color = a_color;\\r\\n // Pass through the stroke color to the fragment shader\\r\\n v_strokeColor = a_strokeColor;\\r\\n // Pass through the stroke thickenss to the fragment shader\\r\\n v_strokeThickness = a_strokeThickness;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/image-renderer-v2/image-renderer-v2.frag.glsl\":\n/*!************************************************************************!*\\\n !*** ./Graphics/Context/image-renderer-v2/image-renderer-v2.frag.glsl ***!\n \\************************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nprecision mediump float;\\r\\n\\r\\n// UV coord\\r\\nin vec2 v_texcoord;\\r\\n\\r\\n// Textures in the current draw\\r\\nuniform sampler2D u_textures[%%count%%];\\r\\n\\r\\nuniform bool u_pixelart;\\r\\n\\r\\nin float v_texture_index;\\r\\n\\r\\nin float v_opacity;\\r\\n\\r\\nin vec4 v_tint;\\r\\n\\r\\n// texture resolution\\r\\nin vec2 v_res;\\r\\n\\r\\nin vec2 v_uv_min;\\r\\nin vec2 v_uv_max;\\r\\n\\r\\nout vec4 fragColor;\\r\\n\\r\\n// Inigo Quilez pixel art filter https://jorenjoestar.github.io/post/pixel_art_filtering/\\r\\nvec2 uv_iq(in vec2 uv, in vec2 texture_size) {\\r\\n vec2 pixel = uv * texture_size;\\r\\n\\r\\n vec2 seam=floor(pixel+.5);\\r\\n vec2 dudv=fwidth(pixel);\\r\\n pixel=seam+clamp((pixel-seam)/dudv,-.5,.5);\\r\\n\\r\\n return pixel/texture_size;\\r\\n}\\r\\n\\r\\nfloat lerp(float from, float to, float rel){\\r\\n return ((1. - rel) * from) + (rel * to);\\r\\n}\\r\\n\\r\\nfloat invLerp(float from, float to, float value){\\r\\n return (value - from) / (to - from);\\r\\n}\\r\\n\\r\\nfloat remap(float origFrom, float origTo, float targetFrom, float targetTo, float value){\\r\\n float rel = invLerp(origFrom, origTo, value);\\r\\n return lerp(targetFrom, targetTo, rel);\\r\\n}\\r\\n\\r\\nvoid main(){\\r\\n // In order to support the most efficient sprite batching, we have multiple\\r\\n // textures loaded into the gpu (usually 8) this picker logic skips over textures\\r\\n // that do not apply to a particular sprite.\\r\\n\\r\\n vec4 color=vec4(1.,0,0,1.);\\r\\n\\r\\n // GLSL is templated out to pick the right texture and set the vec4 color\\r\\n vec2 uv = u_pixelart ? uv_iq(v_texcoord, v_res) : v_texcoord;\\r\\n uv.x = remap(0.,1., v_uv_min.x, v_uv_max.x, uv.x);\\r\\n uv.y = remap(0.,1., v_uv_min.y, v_uv_max.y, uv.y);\\r\\n\\r\\n %%texture_picker%%\\r\\n\\r\\n color.rgb = color.rgb * v_opacity;\\r\\n color.a = color.a * v_opacity;\\r\\n fragColor = color * v_tint;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/image-renderer-v2/image-renderer-v2.vert.glsl\":\n/*!************************************************************************!*\\\n !*** ./Graphics/Context/image-renderer-v2/image-renderer-v2.vert.glsl ***!\n \\************************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nlayout(location=0) in vec2 pos;\\r\\nlayout(location=1) in vec2 a_texcoord;\\r\\nout vec2 v_texcoord;\\r\\n\\r\\nlayout(location=2) in vec2 a_offset;\\r\\nlayout(location=3) in vec2 a_mat_column1;\\r\\nlayout(location=4) in vec2 a_mat_column2;\\r\\nlayout(location=5) in vec2 a_mat_column3;\\r\\n\\r\\nlayout(location=6) in float a_opacity;\\r\\nout float v_opacity;\\r\\n\\r\\n// Texture resolution (could be bigger than a_siz)\\r\\nlayout(location=7) in vec2 a_res;\\r\\nout vec2 v_res;\\r\\n\\r\\n// Final size of graphic\\r\\nlayout(location=8) in vec2 a_size;\\r\\n\\r\\nlayout(location=9) in lowp float a_texture_index;\\r\\nout lowp float v_texture_index;\\r\\n\\r\\nlayout(location=10) in vec2 a_uv_min;\\r\\nout vec2 v_uv_min;\\r\\n\\r\\nlayout(location=11) in vec2 a_uv_max;\\r\\nout vec2 v_uv_max;\\r\\n\\r\\nlayout(location=12) in vec4 a_tint;\\r\\nout vec4 v_tint;\\r\\n\\r\\nuniform mat4 u_matrix;\\r\\n\\r\\nvoid main(){\\r\\n mat4 world_mat = mat4(\\r\\n a_mat_column1.x, a_mat_column1.y, 0., 0.,\\r\\n a_mat_column2.x, a_mat_column2.y, 0., 0.,\\r\\n 0. , 0. , 1., 0.,\\r\\n a_mat_column3.x, a_mat_column3.y, 0., 1.\\r\\n );\\r\\n\\r\\n vec2 newPos = vec2(pos.x * a_res.x, pos.y * a_res.y);\\r\\n gl_Position = u_matrix * world_mat * vec4(newPos + a_offset, 0., 1.);\\r\\n\\r\\n v_opacity = a_opacity;\\r\\n v_texcoord = a_texcoord;\\r\\n v_uv_min = a_uv_min;\\r\\n v_uv_max = a_uv_max;\\r\\n v_res = a_res;\\r\\n v_texture_index = a_texture_index;\\r\\n v_tint = a_tint;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/image-renderer/image-renderer.frag.glsl\":\n/*!******************************************************************!*\\\n !*** ./Graphics/Context/image-renderer/image-renderer.frag.glsl ***!\n \\******************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nprecision mediump float;\\r\\n\\r\\n// UV coord\\r\\nin vec2 v_texcoord;\\r\\n\\r\\n// Texture index\\r\\nin lowp float v_textureIndex;\\r\\n\\r\\n// Textures in the current draw\\r\\nuniform sampler2D u_textures[%%count%%];\\r\\n\\r\\nuniform bool u_pixelart;\\r\\n\\r\\n// Opacity\\r\\nin float v_opacity;\\r\\n\\r\\nin vec4 v_tint;\\r\\n\\r\\nin vec2 v_res;\\r\\n\\r\\nout vec4 fragColor;\\r\\n\\r\\n// Inigo Quilez pixel art filter https://jorenjoestar.github.io/post/pixel_art_filtering/\\r\\nvec2 uv_iq(in vec2 uv, in vec2 texture_size) {\\r\\n vec2 pixel = uv * texture_size;\\r\\n \\r\\n vec2 seam=floor(pixel+.5);\\r\\n vec2 dudv=fwidth(pixel);\\r\\n pixel=seam+clamp((pixel-seam)/dudv,-.5,.5);\\r\\n \\r\\n return pixel/texture_size;\\r\\n}\\r\\n\\r\\nvoid main(){\\r\\n // In order to support the most efficient sprite batching, we have multiple\\r\\n // textures loaded into the gpu (usually 8) this picker logic skips over textures\\r\\n // that do not apply to a particular sprite.\\r\\n \\r\\n vec4 color=vec4(1.,0,0,1.);\\r\\n \\r\\n // GLSL is templated out to pick the right texture and set the vec4 color\\r\\n %%texture_picker%%\\r\\n \\r\\n color.rgb=color.rgb*v_opacity;\\r\\n color.a=color.a*v_opacity;\\r\\n fragColor=color*v_tint;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/image-renderer/image-renderer.vert.glsl\":\n/*!******************************************************************!*\\\n !*** ./Graphics/Context/image-renderer/image-renderer.vert.glsl ***!\n \\******************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nin vec2 a_position;\\r\\n\\r\\n// Opacity\\r\\nin float a_opacity;\\r\\nout float v_opacity;\\r\\n\\r\\n// UV coordinate\\r\\nin vec2 a_texcoord;\\r\\nout vec2 v_texcoord;\\r\\n\\r\\n// Texture res\\r\\nin vec2 a_res;\\r\\nout vec2 v_res;\\r\\n\\r\\n// Texture number\\r\\nin lowp float a_textureIndex;\\r\\nout lowp float v_textureIndex;\\r\\n\\r\\nin vec4 a_tint;\\r\\nout vec4 v_tint;\\r\\n\\r\\nuniform mat4 u_matrix;\\r\\n\\r\\nvoid main(){\\r\\n // Set the vertex position using the ortho transform matrix\\r\\n gl_Position=u_matrix*vec4(a_position,0.,1.);\\r\\n \\r\\n // Pass through the Opacity to the fragment shader\\r\\n v_opacity=a_opacity;\\r\\n // Pass through the UV coord to the fragment shader\\r\\n v_texcoord=a_texcoord;\\r\\n\\r\\n v_res = a_res;\\r\\n\\r\\n // Pass through the texture number to the fragment shader\\r\\n v_textureIndex=a_textureIndex;\\r\\n // Pass through the tint\\r\\n v_tint=a_tint;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/line-renderer/line-fragment.glsl\":\n/*!***********************************************************!*\\\n !*** ./Graphics/Context/line-renderer/line-fragment.glsl ***!\n \\***********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nprecision mediump float;\\r\\n\\r\\n// Color\\r\\nin lowp vec4 v_color;\\r\\n\\r\\nout vec4 fragColor;\\r\\n\\r\\nvoid main() {\\r\\n fragColor = v_color;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/line-renderer/line-vertex.glsl\":\n/*!*********************************************************!*\\\n !*** ./Graphics/Context/line-renderer/line-vertex.glsl ***!\n \\*********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nin vec2 a_position;\\r\\nin vec4 a_color;\\r\\n\\r\\nout lowp vec4 v_color;\\r\\n\\r\\nuniform mat4 u_matrix;\\r\\n\\r\\nvoid main() {\\r\\n // Set the vertex position using the ortho transform matrix\\r\\n gl_Position = u_matrix * vec4(a_position, 0.0, 1.0);\\r\\n\\r\\n // Passthrough the color\\r\\n v_color = a_color;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/particle-renderer/particle-fragment.glsl\":\n/*!*******************************************************************!*\\\n !*** ./Graphics/Context/particle-renderer/particle-fragment.glsl ***!\n \\*******************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nprecision mediump float;\\r\\n\\r\\nuniform sampler2D graphic;\\r\\nuniform bool useTexture;\\r\\nuniform float maxLifeMs;\\r\\n\\r\\nuniform vec4 beginColor;\\r\\nuniform vec4 endColor;\\r\\nuniform bool fade;\\r\\nuniform float startOpacity;\\r\\n\\r\\nin float finalRotation;\\r\\nin float finalLifeMs;\\r\\nout vec4 fragColor;\\r\\n\\r\\nvoid main(){\\r\\n\\r\\n float lifePct = finalLifeMs / maxLifeMs;\\r\\n\\r\\n if (useTexture) {\\r\\n /** Draw texture */\\r\\n if (lifePct <= 0.) discard;\\r\\n float mid = .5;\\r\\n float cosine = cos(finalRotation);\\r\\n float sine = sin(finalRotation);\\r\\n vec2 rotated = vec2(cosine * (gl_PointCoord.x - mid) + sine * (gl_PointCoord.y - mid) + mid,\\r\\n cosine * (gl_PointCoord.y - mid) - sine * (gl_PointCoord.x - mid) + mid);\\r\\n vec4 color = texture(graphic, rotated);\\r\\n fragColor = color * (fade ? lifePct : 1.0);\\r\\n } else {\\r\\n /** Draw circle */\\r\\n if (lifePct <= 0.) discard;\\r\\n vec2 uv = gl_PointCoord.xy * 2.0 - 1.0;\\r\\n float dist = 1.0 - length(uv);\\r\\n float edge = fwidth(dot(uv, uv));\\r\\n float circle = smoothstep(-edge/2.0, edge/2.0, dist);\\r\\n vec3 color = mix(beginColor.rgb, endColor.rgb, 1.0 - lifePct);\\r\\n fragColor.rgb = color;\\r\\n fragColor.a = startOpacity * circle * (fade ? lifePct : 1.0);// * mix(beginColor.a, endColor.a, 1.0 - lifePct);\\r\\n fragColor.rgb *= fragColor.a;\\r\\n }\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/particle-renderer/particle-vertex.glsl\":\n/*!*****************************************************************!*\\\n !*** ./Graphics/Context/particle-renderer/particle-vertex.glsl ***!\n \\*****************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nprecision mediump float;\\r\\n\\r\\nuniform float deltaMs;\\r\\nuniform float maxLifeMs;\\r\\nuniform vec2 gravity;\\r\\nuniform vec2 focus;\\r\\nuniform float focusAccel;\\r\\nuniform mat4 u_matrix;\\r\\nuniform mat4 u_transform;\\r\\nuniform float startSize;\\r\\nuniform float endSize;\\r\\n// uniform sampler2D obstacle;\\r\\n\\r\\nlayout(location=0)in vec2 position;\\r\\nlayout(location=1)in vec2 velocity;\\r\\nlayout(location=2)in float rotation;\\r\\nlayout(location=3)in float angularVelocity;\\r\\nlayout(location=4)in float lifeMs;\\r\\n\\r\\n// TODO z index to handle buffer wrapping?\\r\\n\\r\\n// DO NOT RE-ORDER\\r\\nout vec2 finalPosition;\\r\\nout vec2 finalVelocity;\\r\\nout float finalRotation;\\r\\nout float finalAngularVelocity;\\r\\nout float finalLifeMs;\\r\\nvoid main(){\\r\\n // Evolve particle\\r\\n float seconds = deltaMs / 1000.;\\r\\n // euler integration\\r\\n // Weird artifact of re-using the same buffer layout for update/draw\\r\\n // we need differently named variables\\r\\n vec2 finalGravity = gravity + normalize(focus - position) * focusAccel;\\r\\n finalVelocity = velocity + finalGravity * seconds;\\r\\n finalPosition = position + velocity * seconds + finalGravity * .5 * seconds * seconds;\\r\\n finalRotation = rotation + angularVelocity * seconds;\\r\\n finalAngularVelocity = angularVelocity;\\r\\n finalLifeMs = clamp(lifeMs - deltaMs, 0., maxLifeMs);\\r\\n\\r\\n // Collision mask sampling\\r\\n // vec2 samplePoint = finalPosition / vec2(width, height);\\r\\n // vec4 collides = texture(obstacle, samplePoint);\\r\\n // if (distance(collides,vec4(0.)) > .01) {\\r\\n // // non opaque means we collide! recalc final pos/vel\\r\\n // vec2 newVelocity = velocity * -.1;// lose energy\\r\\n // finalVelocity = newVelocity + gravity * seconds;\\r\\n // finalPosition = position + newVelocity * seconds + gravity * .5 * seconds * seconds;\\r\\n // }\\r\\n\\r\\n float lifePercent = finalLifeMs / maxLifeMs;\\r\\n vec2 transformedPos = (u_matrix * u_transform * vec4(finalPosition,0.,1.)).xy;\\r\\n float scale = sqrt(u_transform[0][0] * u_transform[0][0] + u_transform[1][1] * u_transform[1][1]);\\r\\n gl_Position = vec4(transformedPos, 1.0 - lifePercent, 1.); // use life percent to sort z\\r\\n gl_PointSize = mix(startSize, endSize, 1.0 - lifePercent) * scale;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/point-renderer/point-fragment.glsl\":\n/*!*************************************************************!*\\\n !*** ./Graphics/Context/point-renderer/point-fragment.glsl ***!\n \\*************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\n\\r\\nprecision mediump float;\\r\\nin lowp vec4 v_color;\\r\\n\\r\\nout vec4 fragColor;\\r\\n\\r\\nvoid main() {\\r\\n float r = 0.0, delta = 0.0, alpha = 1.0;\\r\\n vec2 cxy = 2.0 * gl_PointCoord - 1.0;\\r\\n r = dot(cxy, cxy);\\r\\n\\r\\n delta = fwidth(r);\\r\\n alpha = 1.0 - smoothstep(1.0 - delta, 1.0 + delta, r);\\r\\n // \\\"premultiply\\\" the color by alpha\\r\\n vec4 color = v_color;\\r\\n color.a = color.a * alpha;\\r\\n color.rgb = color.rgb * color.a;\\r\\n fragColor = color;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/point-renderer/point-vertex.glsl\":\n/*!***********************************************************!*\\\n !*** ./Graphics/Context/point-renderer/point-vertex.glsl ***!\n \\***********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nin vec2 a_position;\\r\\nin vec4 a_color;\\r\\nin float a_size;\\r\\nout lowp vec4 v_color;\\r\\nuniform mat4 u_matrix;\\r\\n\\r\\nvoid main() {\\r\\n gl_Position = u_matrix * vec4(a_position, 0.0, 1.0);\\r\\n gl_PointSize = a_size * 2.0;\\r\\n v_color = a_color;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/rectangle-renderer/rectangle-renderer.frag.glsl\":\n/*!**************************************************************************!*\\\n !*** ./Graphics/Context/rectangle-renderer/rectangle-renderer.frag.glsl ***!\n \\**************************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\n\\r\\nprecision mediump float;\\r\\n\\r\\n// UV coord\\r\\nin vec2 v_uv;\\r\\n\\r\\nin vec2 v_size; // in pixels\\r\\n\\r\\n// Color coord to blend with image\\r\\nin lowp vec4 v_color;\\r\\n\\r\\n// Stroke color if used\\r\\nin lowp vec4 v_strokeColor;\\r\\n\\r\\n// Stroke thickness if used\\r\\nin lowp float v_strokeThickness; // in pixels\\r\\n\\r\\n// Opacity\\r\\nin float v_opacity;\\r\\n\\r\\nout vec4 fragColor;\\r\\n\\r\\nvoid main() {\\r\\n // modified from https://stackoverflow.com/questions/59197671/glsl-rounded-rectangle-with-variable-border\\r\\n vec2 uv = v_uv;\\r\\n vec2 fragCoord = uv * v_size;\\r\\n float maxX = v_size.x - v_strokeThickness;\\r\\n float minX = v_strokeThickness;\\r\\n float maxY = v_size.y - v_strokeThickness;\\r\\n float minY = v_strokeThickness;\\r\\n\\r\\n if (fragCoord.x < maxX && fragCoord.x > minX &&\\r\\n fragCoord.y < maxY && fragCoord.y > minY) {\\r\\n fragColor = v_color;\\r\\n } else {\\r\\n fragColor = v_strokeColor;\\r\\n }\\r\\n fragColor.a *= v_opacity;\\r\\n fragColor.rgb *= fragColor.a;\\r\\n\\r\\n // vec2 v2CenteredPos = abs(fragCoord - v_size.xy / 2.0);\\r\\n // vec2 v2HalfShapeSizePx = v_size.xy/2.0 - v_strokeThickness/2.0;\\r\\n\\r\\n // float fHalfBorderDist = 0.0;\\r\\n // float fHalfBorderThickness = 0.0;\\r\\n\\r\\n // if (fragCoord.x > max(v_radius, v_strokeThickness) && \\r\\n // fragCoord.x < v_size.x - max(v_radius, v_strokeThickness))\\r\\n // {\\r\\n // fHalfBorderDist = v2CenteredPos.y - v2HalfShapeSizePx.y;\\r\\n // fHalfBorderThickness = v_strokeThickness / 2.0;\\r\\n // }\\r\\n // else if (fragCoord.y > max(v_radius, v_strokeThickness) && \\r\\n // fragCoord.y < v_size.y - max(v_radius, v_strokeThickness))\\r\\n // {\\r\\n // fHalfBorderDist = v2CenteredPos.x - v2HalfShapeSizePx.x;\\r\\n // fHalfBorderThickness = v_strokeThickness / 2.0;\\r\\n // }\\r\\n // else\\r\\n // {\\r\\n // vec2 edgeVec = max(vec2(0.0), v_radius - vec2(\\r\\n // uv.x > 0.5 ? v_size.x - fragCoord.x : fragCoord.x,\\r\\n // uv.y > 0.5 ? v_size.y - fragCoord.y : fragCoord.y));\\r\\n \\r\\n // float ellipse_ab = v_radius-v_strokeThickness;\\r\\n // vec2 ellipse_isect = (v_strokeThickness > v_radius || v_strokeThickness > v_radius) ? vec2(0.0) :\\r\\n // edgeVec.xy * ellipse_ab*ellipse_ab / length(ellipse_ab*edgeVec.yx); \\r\\n \\r\\n // fHalfBorderThickness = (v_radius - length(ellipse_isect)) / 2.0;\\r\\n // fHalfBorderDist = length(edgeVec) - (v_radius - fHalfBorderThickness);\\r\\n // }\\r\\n\\r\\n // vec4 v4FromColor = v_strokeColor;\\r\\n // v4FromColor.rgb *= v4FromColor.a;\\r\\n // vec4 v4ToColor = vec4(0.0); // background color is transparent\\r\\n // if (fHalfBorderDist < 0.0) {\\r\\n // v4ToColor = v_color;\\r\\n // v4ToColor.rgb *= v4ToColor.a;\\r\\n // }\\r\\n\\r\\n // float mixPct = abs(fHalfBorderDist) - fHalfBorderThickness;\\r\\n\\r\\n // vec4 finalColor = mix(v4FromColor, v4ToColor, mixPct);\\r\\n // gl_FragColor = finalColor;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/rectangle-renderer/rectangle-renderer.vert.glsl\":\n/*!**************************************************************************!*\\\n !*** ./Graphics/Context/rectangle-renderer/rectangle-renderer.vert.glsl ***!\n \\**************************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nin vec2 a_position;\\r\\n\\r\\n// UV coordinate\\r\\nin vec2 a_uv;\\r\\nout vec2 v_uv;\\r\\n\\r\\nin vec2 a_size;\\r\\nout vec2 v_size;\\r\\n\\r\\n// Opacity \\r\\nin float a_opacity;\\r\\nout float v_opacity;\\r\\n\\r\\nin vec4 a_color;\\r\\nout vec4 v_color;\\r\\n\\r\\nin vec4 a_strokeColor;\\r\\nout vec4 v_strokeColor;\\r\\n\\r\\nin float a_strokeThickness;\\r\\nout float v_strokeThickness;\\r\\n\\r\\nuniform mat4 u_matrix;\\r\\n\\r\\n\\r\\nvoid main() {\\r\\n // Set the vertex position using the ortho transform matrix\\r\\n gl_Position = u_matrix * vec4(a_position, 0.0, 1.0);\\r\\n\\r\\n // Pass through UV coords\\r\\n v_uv = a_uv;\\r\\n // Pass through size\\r\\n v_size = a_size;\\r\\n // Pass through the Opacity to the fragment shader\\r\\n v_opacity = a_opacity;\\r\\n // Pass through the color to the fragment shader\\r\\n v_color = a_color;\\r\\n // Pass through the stroke color to the fragment shader\\r\\n v_strokeColor = a_strokeColor;\\r\\n // Pass through the stroke thickenss to the fragment shader\\r\\n v_strokeThickness = a_strokeThickness;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/screen-pass-painter/screen-fragment.glsl\":\n/*!*******************************************************************!*\\\n !*** ./Graphics/Context/screen-pass-painter/screen-fragment.glsl ***!\n \\*******************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nprecision mediump float;\\r\\n\\r\\n// Passed in from the vertex shader.\\r\\nin vec2 v_texcoord;\\r\\n\\r\\n// The texture.\\r\\nuniform sampler2D u_texture;\\r\\n\\r\\nout vec4 fragColor;\\r\\n\\r\\nvoid main() {\\r\\n fragColor = texture(u_texture, v_texcoord);\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/screen-pass-painter/screen-vertex.glsl\":\n/*!*****************************************************************!*\\\n !*** ./Graphics/Context/screen-pass-painter/screen-vertex.glsl ***!\n \\*****************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nin vec2 a_position;\\r\\n\\r\\nin vec2 a_texcoord;\\r\\nout vec2 v_texcoord;\\r\\n\\r\\nvoid main() {\\r\\n gl_Position = vec4(a_position, 0.0, 1.0);\\r\\n\\r\\n // Pass the texcoord to the fragment shader.\\r\\n v_texcoord = a_texcoord;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/PostProcessor/color-blind-fragment.glsl\":\n/*!**********************************************************!*\\\n !*** ./Graphics/PostProcessor/color-blind-fragment.glsl ***!\n \\**********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nprecision mediump float;\\r\\n// our texture\\r\\nuniform sampler2D u_image;\\r\\n// the texCoords passed in from the vertex shader.\\r\\nin vec2 v_texcoord;\\r\\n\\r\\n// color blind type\\r\\nuniform int u_type;\\r\\n\\r\\n// simulation?\\r\\nuniform bool u_simulate;\\r\\n\\r\\nout vec4 fragColor;\\r\\n\\r\\nvoid main() {\\r\\n vec4 o = texture(u_image, v_texcoord);\\r\\n // RGB to LMS matrix conversion\\r\\n float L = (17.8824 * o.r) + (43.5161 * o.g) + (4.11935 * o.b);\\r\\n float M = (3.45565 * o.r) + (27.1554 * o.g) + (3.86714 * o.b);\\r\\n float S = (0.0299566 * o.r) + (0.184309 * o.g) + (1.46709 * o.b);\\r\\n // Simulate color blindness\\r\\n float l;\\r\\n float m;\\r\\n float s;\\r\\n //MODE CODE//\\r\\n if (u_type == 0) {\\r\\n // Protanope\\r\\n l = 0.0 * L + 2.02344 * M + -2.52581 * S;\\r\\n m = 0.0 * L + 1.0 * M + 0.0 * S;\\r\\n s = 0.0 * L + 0.0 * M + 1.0 * S;;\\r\\n } else if (u_type == 1) {\\r\\n // Deuteranope\\r\\n l = 1.0 * L + 0.0 * M + 0.0 * S;\\r\\n m = 0.494207 * L + 0.0 * M + 1.24827 * S;\\r\\n s = 0.0 * L + 0.0 * M + 1.0 * S;\\r\\n } else if (u_type == 2) {\\r\\n // Tritanope\\r\\n l = 1.0 * L + 0.0 * M + 0.0 * S;\\r\\n m = 0.0 * L + 1.0 * M + 0.0 * S;\\r\\n s = -0.395913 * L + 0.801109 * M + 0.0 * S;\\r\\n }\\r\\n\\r\\n // LMS to RGB matrix conversion\\r\\n vec4 error; // simulate the colors\\r\\n error.r = (0.0809444479 * l) + (-0.130504409 * m) + (0.116721066 * s);\\r\\n error.g = (-0.0102485335 * l) + (0.0540193266 * m) + (-0.113614708 * s);\\r\\n error.b = (-0.000365296938 * l) + (-0.00412161469 * m) + (0.693511405 * s);\\r\\n error.a = 1.0;\\r\\n vec4 diff = o - error;\\r\\n vec4 correction; // correct the colors\\r\\n correction.r = 0.0;\\r\\n correction.g = (diff.r * 0.7) + (diff.g * 1.0);\\r\\n correction.b = (diff.r * 0.7) + (diff.b * 1.0);\\r\\n correction = o + correction;\\r\\n correction.a = o.a;\\r\\n //SIMULATE//\\r\\n\\r\\n // sim \\r\\n if (u_simulate) {\\r\\n fragColor = error.rgba;\\r\\n } else {\\r\\n fragColor = correction.rgba;\\r\\n }\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Actions/Action.ts\":\n/*!***************************!*\\\n !*** ./Actions/Action.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ nextActionId: () => (/* binding */ nextActionId)\n/* harmony export */ });\nlet _ACTION_ID = 0;\n/**\n *\n */\nfunction nextActionId() {\n return _ACTION_ID++;\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/ActionContext.ts\":\n/*!**********************************!*\\\n !*** ./Actions/ActionContext.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ActionContext: () => (/* binding */ ActionContext)\n/* harmony export */ });\n/* harmony import */ var _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Util/EasingFunctions */ \"./Util/EasingFunctions.ts\");\n/* harmony import */ var _ActionQueue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ActionQueue */ \"./Actions/ActionQueue.ts\");\n/* harmony import */ var _Action_Repeat__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./Action/Repeat */ \"./Actions/Action/Repeat.ts\");\n/* harmony import */ var _Action_RepeatForever__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./Action/RepeatForever */ \"./Actions/Action/RepeatForever.ts\");\n/* harmony import */ var _Action_MoveBy__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Action/MoveBy */ \"./Actions/Action/MoveBy.ts\");\n/* harmony import */ var _Action_MoveTo__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Action/MoveTo */ \"./Actions/Action/MoveTo.ts\");\n/* harmony import */ var _Action_RotateTo__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Action/RotateTo */ \"./Actions/Action/RotateTo.ts\");\n/* harmony import */ var _Action_RotateBy__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Action/RotateBy */ \"./Actions/Action/RotateBy.ts\");\n/* harmony import */ var _Action_ScaleTo__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Action/ScaleTo */ \"./Actions/Action/ScaleTo.ts\");\n/* harmony import */ var _Action_ScaleBy__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Action/ScaleBy */ \"./Actions/Action/ScaleBy.ts\");\n/* harmony import */ var _Action_CallMethod__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Action/CallMethod */ \"./Actions/Action/CallMethod.ts\");\n/* harmony import */ var _Action_EaseTo__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Action/EaseTo */ \"./Actions/Action/EaseTo.ts\");\n/* harmony import */ var _Action_EaseBy__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Action/EaseBy */ \"./Actions/Action/EaseBy.ts\");\n/* harmony import */ var _Action_Blink__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Action/Blink */ \"./Actions/Action/Blink.ts\");\n/* harmony import */ var _Action_Fade__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Action/Fade */ \"./Actions/Action/Fade.ts\");\n/* harmony import */ var _Action_Delay__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Action/Delay */ \"./Actions/Action/Delay.ts\");\n/* harmony import */ var _Action_Die__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./Action/Die */ \"./Actions/Action/Die.ts\");\n/* harmony import */ var _Action_Follow__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./Action/Follow */ \"./Actions/Action/Follow.ts\");\n/* harmony import */ var _Action_Meet__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./Action/Meet */ \"./Actions/Action/Meet.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Math */ \"./Math/vector.ts\");\n/* harmony import */ var _Action_Flash__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Action/Flash */ \"./Actions/Action/Flash.ts\");\n/* harmony import */ var _Action_CurveTo__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Action/CurveTo */ \"./Actions/Action/CurveTo.ts\");\n/* harmony import */ var _Action_CurveBy__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Action/CurveBy */ \"./Actions/Action/CurveBy.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * The fluent Action API allows you to perform \"actions\" on\n * {@apilink Actor | `actors`} such as following, moving, rotating, and\n * more. You can implement your own actions by implementing\n * the {@apilink Action} interface.\n */\nclass ActionContext {\n constructor(entity) {\n this._entity = entity;\n this._queue = new _ActionQueue__WEBPACK_IMPORTED_MODULE_0__.ActionQueue(entity);\n }\n getQueue() {\n return this._queue;\n }\n update(elapsed) {\n this._queue.update(elapsed);\n }\n /**\n * Clears all queued actions from the Actor\n */\n clearActions() {\n this._queue.clearActions();\n }\n runAction(action) {\n action.reset();\n this._queue.add(action);\n return this;\n }\n /**\n * Animates an actor with a specified bezier curve by an offset to the current position, the start point is assumed\n * to be the actors current position\n * @param options\n */\n curveBy(options) {\n this._queue.add(new _Action_CurveBy__WEBPACK_IMPORTED_MODULE_1__.CurveBy(this._entity, options));\n return this;\n }\n /**\n * Animates an actor with a specified bezier curve to an absolute world space coordinate, the start point is assumed\n * to be the actors current position\n * @param options\n */\n curveTo(options) {\n this._queue.add(new _Action_CurveTo__WEBPACK_IMPORTED_MODULE_2__.CurveTo(this._entity, options));\n return this;\n }\n easeTo(...args) {\n var _a, _b;\n let x = 0;\n let y = 0;\n let duration = 0;\n let easingFcn = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_3__.EasingFunctions.Linear;\n if (args[0] instanceof _Math__WEBPACK_IMPORTED_MODULE_4__.Vector) {\n x = args[0].x;\n y = args[0].y;\n duration = args[1];\n easingFcn = (_a = args[2]) !== null && _a !== void 0 ? _a : easingFcn;\n }\n else {\n x = args[0];\n y = args[1];\n duration = args[2];\n easingFcn = (_b = args[3]) !== null && _b !== void 0 ? _b : easingFcn;\n }\n this._queue.add(new _Action_EaseTo__WEBPACK_IMPORTED_MODULE_5__.EaseTo(this._entity, x, y, duration, easingFcn));\n return this;\n }\n easeBy(...args) {\n var _a, _b;\n let offsetX = 0;\n let offsetY = 0;\n let duration = 0;\n let easingFcn = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_3__.EasingFunctions.Linear;\n if (args[0] instanceof _Math__WEBPACK_IMPORTED_MODULE_4__.Vector) {\n offsetX = args[0].x;\n offsetY = args[0].y;\n duration = args[1];\n easingFcn = (_a = args[2]) !== null && _a !== void 0 ? _a : easingFcn;\n }\n else {\n offsetX = args[0];\n offsetY = args[1];\n duration = args[2];\n easingFcn = (_b = args[3]) !== null && _b !== void 0 ? _b : easingFcn;\n }\n this._queue.add(new _Action_EaseBy__WEBPACK_IMPORTED_MODULE_6__.EaseBy(this._entity, offsetX, offsetY, duration, easingFcn));\n return this;\n }\n moveTo(xOrPosOrOptions, yOrSpeed, speedOrUndefined) {\n let x = 0;\n let y = 0;\n let speed = 0;\n if (xOrPosOrOptions instanceof _Math__WEBPACK_IMPORTED_MODULE_4__.Vector) {\n x = xOrPosOrOptions.x;\n y = xOrPosOrOptions.y;\n speed = +(yOrSpeed !== null && yOrSpeed !== void 0 ? yOrSpeed : 0);\n this._queue.add(new _Action_MoveTo__WEBPACK_IMPORTED_MODULE_7__.MoveTo(this._entity, x, y, speed));\n }\n else if (typeof xOrPosOrOptions === 'number' && typeof yOrSpeed === 'number' && typeof speedOrUndefined === 'number') {\n x = xOrPosOrOptions;\n y = yOrSpeed;\n speed = speedOrUndefined;\n this._queue.add(new _Action_MoveTo__WEBPACK_IMPORTED_MODULE_7__.MoveTo(this._entity, x, y, speed));\n }\n else if ((0,_Action_MoveTo__WEBPACK_IMPORTED_MODULE_7__.isMoveToOptions)(xOrPosOrOptions)) {\n this._queue.add(new _Action_MoveTo__WEBPACK_IMPORTED_MODULE_7__.MoveToWithOptions(this._entity, xOrPosOrOptions));\n }\n return this;\n }\n moveBy(xOffsetOrVectorOrOptions, yOffsetOrSpeed, speedOrUndefined) {\n let xOffset = 0;\n let yOffset = 0;\n let speed = 0;\n if (xOffsetOrVectorOrOptions instanceof _Math__WEBPACK_IMPORTED_MODULE_4__.Vector && typeof yOffsetOrSpeed === 'number') {\n xOffset = xOffsetOrVectorOrOptions.x;\n yOffset = xOffsetOrVectorOrOptions.y;\n speed = yOffsetOrSpeed;\n this._queue.add(new _Action_MoveBy__WEBPACK_IMPORTED_MODULE_8__.MoveBy(this._entity, xOffset, yOffset, speed));\n }\n else if (typeof xOffsetOrVectorOrOptions === 'number' && typeof yOffsetOrSpeed === 'number' && typeof speedOrUndefined === 'number') {\n xOffset = xOffsetOrVectorOrOptions;\n yOffset = yOffsetOrSpeed;\n speed = speedOrUndefined;\n this._queue.add(new _Action_MoveBy__WEBPACK_IMPORTED_MODULE_8__.MoveBy(this._entity, xOffset, yOffset, speed));\n }\n else if ((0,_Action_MoveBy__WEBPACK_IMPORTED_MODULE_8__.isMoveByOptions)(xOffsetOrVectorOrOptions)) {\n this._queue.add(new _Action_MoveBy__WEBPACK_IMPORTED_MODULE_8__.MoveByWithOptions(this._entity, xOffsetOrVectorOrOptions));\n }\n return this;\n }\n rotateTo(angleRadiansOrOptions, speed, rotationType) {\n if (typeof angleRadiansOrOptions === 'number' && typeof speed === 'number') {\n this._queue.add(new _Action_RotateTo__WEBPACK_IMPORTED_MODULE_9__.RotateTo(this._entity, angleRadiansOrOptions, speed, rotationType));\n }\n else if (typeof angleRadiansOrOptions === 'object') {\n this._queue.add(new _Action_RotateTo__WEBPACK_IMPORTED_MODULE_9__.RotateToWithOptions(this._entity, angleRadiansOrOptions));\n }\n return this;\n }\n rotateBy(angleRadiansOffsetOrOptions, speed, rotationType) {\n if (typeof angleRadiansOffsetOrOptions === 'object') {\n this._queue.add(new _Action_RotateBy__WEBPACK_IMPORTED_MODULE_10__.RotateByWithOptions(this._entity, angleRadiansOffsetOrOptions));\n }\n else {\n this._queue.add(new _Action_RotateBy__WEBPACK_IMPORTED_MODULE_10__.RotateBy(this._entity, angleRadiansOffsetOrOptions, speed, rotationType));\n }\n return this;\n }\n scaleTo(sizeXOrVectorOrOptions, sizeYOrSpeed, speedXOrUndefined, speedYOrUndefined) {\n let sizeX = 1;\n let sizeY = 1;\n let speedX = 0;\n let speedY = 0;\n if ((0,_Action_ScaleTo__WEBPACK_IMPORTED_MODULE_11__.isScaleToOptions)(sizeXOrVectorOrOptions)) {\n this._queue.add(new _Action_ScaleTo__WEBPACK_IMPORTED_MODULE_11__.ScaleToWithOptions(this._entity, sizeXOrVectorOrOptions));\n return this;\n }\n if (sizeXOrVectorOrOptions instanceof _Math__WEBPACK_IMPORTED_MODULE_4__.Vector && sizeYOrSpeed instanceof _Math__WEBPACK_IMPORTED_MODULE_4__.Vector) {\n sizeX = sizeXOrVectorOrOptions.x;\n sizeY = sizeXOrVectorOrOptions.y;\n speedX = sizeYOrSpeed.x;\n speedY = sizeYOrSpeed.y;\n }\n if (typeof sizeXOrVectorOrOptions === 'number' && typeof sizeYOrSpeed === 'number') {\n sizeX = sizeXOrVectorOrOptions;\n sizeY = sizeYOrSpeed;\n speedX = speedXOrUndefined;\n speedY = speedYOrUndefined;\n }\n this._queue.add(new _Action_ScaleTo__WEBPACK_IMPORTED_MODULE_11__.ScaleTo(this._entity, sizeX, sizeY, speedX, speedY));\n return this;\n }\n scaleBy(sizeOffsetXOrVectorOrOptions, sizeOffsetYOrSpeed, speed) {\n if ((0,_Action_ScaleBy__WEBPACK_IMPORTED_MODULE_12__.isScaleByOptions)(sizeOffsetXOrVectorOrOptions)) {\n this._queue.add(new _Action_ScaleBy__WEBPACK_IMPORTED_MODULE_12__.ScaleByWithOptions(this._entity, sizeOffsetXOrVectorOrOptions));\n return this;\n }\n let sizeOffsetX = 1;\n let sizeOffsetY = 1;\n if (sizeOffsetXOrVectorOrOptions instanceof _Math__WEBPACK_IMPORTED_MODULE_4__.Vector) {\n sizeOffsetX = sizeOffsetXOrVectorOrOptions.x;\n sizeOffsetY = sizeOffsetXOrVectorOrOptions.y;\n speed = sizeOffsetYOrSpeed;\n }\n if (typeof sizeOffsetXOrVectorOrOptions === 'number' && typeof sizeOffsetYOrSpeed === 'number') {\n sizeOffsetX = sizeOffsetXOrVectorOrOptions;\n sizeOffsetY = sizeOffsetYOrSpeed;\n }\n this._queue.add(new _Action_ScaleBy__WEBPACK_IMPORTED_MODULE_12__.ScaleBy(this._entity, sizeOffsetX, sizeOffsetY, speed));\n return this;\n }\n /**\n * This method will cause an actor to blink (become visible and not\n * visible). Optionally, you may specify the number of blinks. Specify the amount of time\n * the actor should be visible per blink, and the amount of time not visible.\n * This method is part of the actor 'Action' fluent API allowing action chaining.\n * @param timeVisible The amount of time to stay visible per blink in milliseconds\n * @param timeNotVisible The amount of time to stay not visible per blink in milliseconds\n * @param numBlinks The number of times to blink\n */\n blink(timeVisible, timeNotVisible, numBlinks = 1) {\n this._queue.add(new _Action_Blink__WEBPACK_IMPORTED_MODULE_13__.Blink(this._entity, timeVisible, timeNotVisible, numBlinks));\n return this;\n }\n /**\n * This method will cause an actor's opacity to change from its current value\n * to the provided value by a specified time (in milliseconds). This method is\n * part of the actor 'Action' fluent API allowing action chaining.\n * @param opacity The ending opacity\n * @param duration The time it should take to fade the actor (in milliseconds)\n */\n fade(opacity, duration) {\n this._queue.add(new _Action_Fade__WEBPACK_IMPORTED_MODULE_14__.Fade(this._entity, opacity, duration));\n return this;\n }\n /**\n * This will cause an actor to flash a specific color for a period of time\n * @param color\n * @param duration The duration in milliseconds\n */\n flash(color, duration = 1000) {\n this._queue.add(new _Action_Flash__WEBPACK_IMPORTED_MODULE_15__.Flash(this._entity, color, duration));\n return this;\n }\n /**\n * This method will delay the next action from executing for a certain\n * amount of time (in milliseconds). This method is part of the actor\n * 'Action' fluent API allowing action chaining.\n * @param duration The amount of time to delay the next action in the queue from executing in milliseconds\n */\n delay(duration) {\n this._queue.add(new _Action_Delay__WEBPACK_IMPORTED_MODULE_16__.Delay(duration));\n return this;\n }\n /**\n * This method will add an action to the queue that will remove the actor from the\n * scene once it has completed its previous Any actions on the\n * action queue after this action will not be executed.\n */\n die() {\n this._queue.add(new _Action_Die__WEBPACK_IMPORTED_MODULE_17__.Die(this._entity));\n return this;\n }\n /**\n * This method allows you to call an arbitrary method as the next action in the\n * action queue. This is useful if you want to execute code in after a specific\n * action, i.e An actor arrives at a destination after traversing a path\n */\n callMethod(method) {\n this._queue.add(new _Action_CallMethod__WEBPACK_IMPORTED_MODULE_18__.CallMethod(method));\n return this;\n }\n /**\n * This method will cause the actor to repeat all of the actions built in\n * the `repeatBuilder` callback. If the number of repeats\n * is not specified it will repeat forever. This method is part of\n * the actor 'Action' fluent API allowing action chaining\n *\n * ```typescript\n * // Move up in a zig-zag by repeated moveBy's\n * actor.actions.repeat(repeatCtx => {\n * repeatCtx.moveBy(10, 0, 10);\n * repeatCtx.moveBy(0, 10, 10);\n * }, 5);\n * ```\n * @param repeatBuilder The builder to specify the repeatable list of actions\n * @param times The number of times to repeat all the previous actions in the action queue. If nothing is specified the actions\n * will repeat forever\n */\n repeat(repeatBuilder, times) {\n if (!times) {\n this.repeatForever(repeatBuilder);\n return this;\n }\n this._queue.add(new _Action_Repeat__WEBPACK_IMPORTED_MODULE_19__.Repeat(this._entity, repeatBuilder, times));\n return this;\n }\n /**\n * This method will cause the actor to repeat all of the actions built in\n * the `repeatBuilder` callback. If the number of repeats\n * is not specified it will repeat forever. This method is part of\n * the actor 'Action' fluent API allowing action chaining\n *\n * ```typescript\n * // Move up in a zig-zag by repeated moveBy's\n * actor.actions.repeat(repeatCtx => {\n * repeatCtx.moveBy(10, 0, 10);\n * repeatCtx.moveBy(0, 10, 10);\n * }, 5);\n * ```\n * @param repeatBuilder The builder to specify the repeatable list of actions\n */\n repeatForever(repeatBuilder) {\n this._queue.add(new _Action_RepeatForever__WEBPACK_IMPORTED_MODULE_20__.RepeatForever(this._entity, repeatBuilder));\n return this;\n }\n /**\n * This method will cause the entity to follow another at a specified distance\n * @param entity The entity to follow\n * @param followDistance The distance to maintain when following, if not specified the actor will follow at the current distance.\n */\n follow(entity, followDistance) {\n if (followDistance === undefined) {\n this._queue.add(new _Action_Follow__WEBPACK_IMPORTED_MODULE_21__.Follow(this._entity, entity));\n }\n else {\n this._queue.add(new _Action_Follow__WEBPACK_IMPORTED_MODULE_21__.Follow(this._entity, entity, followDistance));\n }\n return this;\n }\n /**\n * This method will cause the entity to move towards another until they\n * collide \"meet\" at a specified speed.\n * @param entity The entity to meet\n * @param speed The speed in pixels per second to move, if not specified it will match the speed of the other actor\n */\n meet(entity, speed) {\n if (speed === undefined) {\n this._queue.add(new _Action_Meet__WEBPACK_IMPORTED_MODULE_22__.Meet(this._entity, entity));\n }\n else {\n this._queue.add(new _Action_Meet__WEBPACK_IMPORTED_MODULE_22__.Meet(this._entity, entity, speed));\n }\n return this;\n }\n /**\n * Returns a promise that resolves when the current action queue up to now\n * is finished.\n */\n toPromise() {\n const temp = new Promise((resolve) => {\n this._queue.add(new _Action_CallMethod__WEBPACK_IMPORTED_MODULE_18__.CallMethod(() => {\n resolve();\n }));\n });\n return temp;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/ActionQueue.ts\":\n/*!********************************!*\\\n !*** ./Actions/ActionQueue.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ActionQueue: () => (/* binding */ ActionQueue)\n/* harmony export */ });\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n\n/**\n * Action Queues represent an ordered sequence of actions\n *\n * Action queues are part of the {@apilink ActionContext | `Action API`} and\n * store the list of actions to be executed for an {@apilink Actor}.\n *\n * Actors implement {@apilink Actor.actions} which can be manipulated by\n * advanced users to adjust the actions currently being executed in the\n * queue.\n */\nclass ActionQueue {\n constructor(entity) {\n this._actions = [];\n this._currentAction = null;\n this._completedActions = [];\n this._entity = entity;\n }\n /**\n * Add an action to the sequence\n * @param action\n */\n add(action) {\n this._actions.push(action);\n }\n /**\n * Remove an action by reference from the sequence\n * @param action\n */\n remove(action) {\n const index = this._actions.indexOf(action);\n this._actions.splice(index, 1);\n }\n /**\n * Removes all actions from this sequence\n */\n clearActions() {\n this._actions.length = 0;\n this._completedActions.length = 0;\n if (this._currentAction) {\n this._currentAction.stop();\n }\n }\n /**\n *\n * @returns The total list of actions in this sequence complete or not\n */\n getActions() {\n return this._actions.concat(this._completedActions);\n }\n getIncompleteActions() {\n return this._actions;\n }\n getCurrentAction() {\n return this._currentAction;\n }\n /**\n *\n * @returns `true` if there are more actions to process in the sequence\n */\n hasNext() {\n return this._actions.length > 0;\n }\n /**\n * @returns `true` if the current sequence of actions is done\n */\n isComplete() {\n return this._actions.length === 0;\n }\n /**\n * Resets the sequence of actions, this is used to restart a sequence from the beginning\n */\n reset() {\n this._actions = this.getActions();\n const len = this._actions.length;\n for (let i = 0; i < len; i++) {\n this._actions[i].reset();\n }\n this._completedActions = [];\n }\n /**\n * Update the queue which updates actions and handles completing actions\n * @param elapsed\n */\n update(elapsed) {\n if (this._actions.length > 0) {\n if (this._currentAction !== this._actions[0]) {\n this._currentAction = this._actions[0];\n this._entity.emit('actionstart', new _Events__WEBPACK_IMPORTED_MODULE_0__.ActionStartEvent(this._currentAction, this._entity));\n }\n this._currentAction.update(elapsed);\n if (this._currentAction.isComplete(this._entity)) {\n this._entity.emit('actioncomplete', new _Events__WEBPACK_IMPORTED_MODULE_0__.ActionCompleteEvent(this._currentAction, this._entity));\n const complete = this._actions.shift();\n if (complete) {\n this._completedActions.push(complete);\n }\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/ActionSequence.ts\":\n/*!******************************************!*\\\n !*** ./Actions/Action/ActionSequence.ts ***!\n \\******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ActionSequence: () => (/* binding */ ActionSequence)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _ActionContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ActionContext */ \"./Actions/ActionContext.ts\");\n\n\n/**\n * Action that can represent a sequence of actions, this can be useful in conjunction with\n * {@apilink ParallelActions} to run multiple sequences in parallel.\n */\nclass ActionSequence {\n constructor(entity, actionBuilder) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._stopped = false;\n this._sequenceBuilder = actionBuilder;\n this._sequenceContext = new _ActionContext__WEBPACK_IMPORTED_MODULE_1__.ActionContext(entity);\n this._actionQueue = this._sequenceContext.getQueue();\n this._sequenceBuilder(this._sequenceContext);\n }\n update(elapsed) {\n this._actionQueue.update(elapsed);\n }\n isComplete() {\n return this._stopped || this._actionQueue.isComplete();\n }\n stop() {\n this._stopped = true;\n }\n reset() {\n this._stopped = false;\n this._actionQueue.reset();\n }\n clone(entity) {\n return new ActionSequence(entity, this._sequenceBuilder);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/Blink.ts\":\n/*!*********************************!*\\\n !*** ./Actions/Action/Blink.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Blink: () => (/* binding */ Blink)\n/* harmony export */ });\n/* harmony import */ var _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Graphics/GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\nclass Blink {\n constructor(entity, timeVisible, timeNotVisible, numBlinks = 1) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._timeVisible = 0;\n this._timeNotVisible = 0;\n this._elapsedTime = 0;\n this._totalTime = 0;\n this._stopped = false;\n this._started = false;\n this._graphics = entity.get(_Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_1__.GraphicsComponent);\n this._timeVisible = timeVisible;\n this._timeNotVisible = timeNotVisible;\n this._duration = (timeVisible + timeNotVisible) * numBlinks;\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._elapsedTime = 0;\n this._totalTime = 0;\n }\n if (!this._graphics) {\n return;\n }\n this._elapsedTime += elapsed;\n this._totalTime += elapsed;\n if (this._graphics.isVisible && this._elapsedTime >= this._timeVisible) {\n this._graphics.isVisible = false;\n this._elapsedTime = 0;\n }\n if (!this._graphics.isVisible && this._elapsedTime >= this._timeNotVisible) {\n this._graphics.isVisible = true;\n this._elapsedTime = 0;\n }\n if (this.isComplete()) {\n this._graphics.isVisible = true;\n }\n }\n isComplete() {\n return this._stopped || this._totalTime >= this._duration;\n }\n stop() {\n if (this._graphics) {\n this._graphics.isVisible = true;\n }\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n this._elapsedTime = 0;\n this._totalTime = 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/CallMethod.ts\":\n/*!**************************************!*\\\n !*** ./Actions/Action/CallMethod.ts ***!\n \\**************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CallMethod: () => (/* binding */ CallMethod)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\nclass CallMethod {\n constructor(method) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._hasBeenCalled = false;\n this._method = method;\n }\n update(elapsed) {\n this._method();\n this._hasBeenCalled = true;\n }\n isComplete() {\n return this._hasBeenCalled;\n }\n reset() {\n this._hasBeenCalled = false;\n }\n stop() {\n this._hasBeenCalled = true;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/CurveBy.ts\":\n/*!***********************************!*\\\n !*** ./Actions/Action/CurveBy.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CurveBy: () => (/* binding */ CurveBy)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../EntityComponentSystem */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math */ \"./Math/bezier-curve.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math */ \"./Math/vector.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Math */ \"./Math/util.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math */ \"./Math/lerp.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\nclass CurveBy {\n constructor(entity, options) {\n var _a;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._mode = 'dynamic';\n this._entity = entity;\n this._tx = this._entity.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n if (!this._tx) {\n throw new Error(`Entity ${entity.name} has no TransformComponent, can only curveTo on Entities with TransformComponents.`);\n }\n this._curve = this._curve = new _Math__WEBPACK_IMPORTED_MODULE_2__.BezierCurve({\n controlPoints: [(0,_Math__WEBPACK_IMPORTED_MODULE_3__.vec)(0, 0), ...options.controlPoints],\n quality: options.quality\n });\n this._durationMs = options.duration;\n this._mode = (_a = options.mode) !== null && _a !== void 0 ? _a : this._mode;\n this._currentMs = this._durationMs;\n }\n update(elapsed) {\n if (!this._started) {\n this._curve.setControlPoint(0, this._tx.globalPos);\n this._curve.setControlPoint(1, this._curve.controlPoints[1].add(this._tx.globalPos));\n this._curve.setControlPoint(2, this._curve.controlPoints[2].add(this._tx.globalPos));\n this._curve.setControlPoint(3, this._curve.controlPoints[3].add(this._tx.globalPos));\n this._started = true;\n }\n this._currentMs -= elapsed;\n const t = (0,_Math__WEBPACK_IMPORTED_MODULE_4__.clamp)((0,_Math__WEBPACK_IMPORTED_MODULE_5__.remap)(0, this._durationMs, 0, 1, this._durationMs - this._currentMs), 0, 1);\n if (this._mode === 'dynamic') {\n this._tx.pos = this._curve.getPoint(t);\n }\n else {\n this._tx.pos = this._curve.getUniformPoint(t);\n }\n if (this.isComplete(this._entity)) {\n if (this._mode === 'dynamic') {\n this._tx.pos = this._curve.getPoint(1);\n }\n else {\n this._tx.pos = this._curve.getUniformPoint(1);\n }\n }\n }\n isComplete(entity) {\n return this._stopped || this._currentMs < 0;\n }\n reset() {\n this._currentMs = this._durationMs;\n this._started = false;\n this._stopped = false;\n }\n stop() {\n this._stopped = true;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/CurveTo.ts\":\n/*!***********************************!*\\\n !*** ./Actions/Action/CurveTo.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CurveTo: () => (/* binding */ CurveTo)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../EntityComponentSystem */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math */ \"./Math/bezier-curve.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math */ \"./Math/vector.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Math */ \"./Math/util.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math */ \"./Math/lerp.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\nclass CurveTo {\n constructor(entity, options) {\n var _a;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._mode = 'dynamic';\n this._entity = entity;\n this._tx = this._entity.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n if (!this._tx) {\n throw new Error(`Entity ${entity.name} has no TransformComponent, can only curveTo on Entities with TransformComponents.`);\n }\n this._curve = new _Math__WEBPACK_IMPORTED_MODULE_2__.BezierCurve({\n controlPoints: [(0,_Math__WEBPACK_IMPORTED_MODULE_3__.vec)(0, 0), ...options.controlPoints],\n quality: options.quality\n });\n this._durationMs = options.duration;\n this._mode = (_a = options.mode) !== null && _a !== void 0 ? _a : this._mode;\n this._currentMs = this._durationMs;\n }\n update(elapsed) {\n if (!this._started) {\n this._curve.setControlPoint(0, this._tx.globalPos.clone());\n this._started = true;\n }\n this._currentMs -= elapsed;\n const t = (0,_Math__WEBPACK_IMPORTED_MODULE_4__.clamp)((0,_Math__WEBPACK_IMPORTED_MODULE_5__.remap)(0, this._durationMs, 0, 1, this._durationMs - this._currentMs), 0, 1);\n if (this._mode === 'dynamic') {\n this._tx.pos = this._curve.getPoint(t);\n }\n else {\n this._tx.pos = this._curve.getUniformPoint(t);\n }\n if (this.isComplete(this._entity)) {\n if (this._mode === 'dynamic') {\n this._tx.pos = this._curve.getPoint(1);\n }\n else {\n this._tx.pos = this._curve.getUniformPoint(1);\n }\n }\n }\n isComplete(entity) {\n return this._stopped || this._currentMs < 0;\n }\n reset() {\n this._currentMs = this._durationMs;\n this._started = false;\n this._stopped = false;\n }\n stop() {\n this._stopped = true;\n this._currentMs = 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/Delay.ts\":\n/*!*********************************!*\\\n !*** ./Actions/Action/Delay.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Delay: () => (/* binding */ Delay)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\nclass Delay {\n constructor(duration) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._elapsedTime = 0;\n this._started = false;\n this._stopped = false;\n this._delay = duration;\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n }\n this._elapsedTime += elapsed;\n }\n isComplete() {\n return this._stopped || this._elapsedTime >= this._delay;\n }\n stop() {\n this._stopped = true;\n }\n reset() {\n this._elapsedTime = 0;\n this._started = false;\n this._stopped = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/Die.ts\":\n/*!*******************************!*\\\n !*** ./Actions/Action/Die.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Die: () => (/* binding */ Die)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _ActionsComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ActionsComponent */ \"./Actions/ActionsComponent.ts\");\n\n\nclass Die {\n constructor(entity) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._stopped = false;\n this._entity = entity;\n }\n update(elapsed) {\n this._entity.get(_ActionsComponent__WEBPACK_IMPORTED_MODULE_1__.ActionsComponent).clearActions();\n this._entity.kill();\n this._stopped = true;\n }\n isComplete() {\n return this._stopped;\n }\n stop() {\n return;\n }\n reset() {\n return;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/EaseBy.ts\":\n/*!**********************************!*\\\n !*** ./Actions/Action/EaseBy.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EaseBy: () => (/* binding */ EaseBy)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\n\n/**\n * @deprecated use moveBy({offset: Vector, duration: number, easing: EasingFunction})\n */\nclass EaseBy {\n constructor(entity, offsetX, offsetY, duration, easingFcn) {\n this.easingFcn = easingFcn;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._currentLerpTime = 0;\n this._lerpDuration = 1 * 1000; // 1 second\n this._lerpStart = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(0, 0);\n this._lerpEnd = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(0, 0);\n this._initialized = false;\n this._stopped = false;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__.MotionComponent);\n this._lerpDuration = duration;\n this._offset = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(offsetX, offsetY);\n }\n _initialize() {\n this._lerpStart = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this._tx.pos.x, this._tx.pos.y);\n this._currentLerpTime = 0;\n this._lerpEnd = this._lerpStart.add(this._offset);\n }\n update(elapsed) {\n if (!this._initialized) {\n this._initialize();\n this._initialized = true;\n }\n // Need to update lerp time first, otherwise the first update will always be zero\n this._currentLerpTime += elapsed;\n let newX = this._tx.pos.x;\n let newY = this._tx.pos.y;\n if (this._currentLerpTime < this._lerpDuration) {\n if (this._lerpEnd.x < this._lerpStart.x) {\n newX =\n this._lerpStart.x -\n (this.easingFcn(this._currentLerpTime, this._lerpEnd.x, this._lerpStart.x, this._lerpDuration) - this._lerpEnd.x);\n }\n else {\n newX = this.easingFcn(this._currentLerpTime, this._lerpStart.x, this._lerpEnd.x, this._lerpDuration);\n }\n if (this._lerpEnd.y < this._lerpStart.y) {\n newY =\n this._lerpStart.y -\n (this.easingFcn(this._currentLerpTime, this._lerpEnd.y, this._lerpStart.y, this._lerpDuration) - this._lerpEnd.y);\n }\n else {\n newY = this.easingFcn(this._currentLerpTime, this._lerpStart.y, this._lerpEnd.y, this._lerpDuration);\n }\n // Given the lerp position figure out the velocity in pixels per second\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)((newX - this._tx.pos.x) / (elapsed / 1000), (newY - this._tx.pos.y) / (elapsed / 1000));\n }\n else {\n this._tx.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(this._lerpEnd.x, this._lerpEnd.y);\n this._motion.vel = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n }\n }\n isComplete() {\n return this._stopped || this._currentLerpTime >= this._lerpDuration;\n }\n reset() {\n this._initialized = false;\n this._stopped = false;\n this._currentLerpTime = 0;\n }\n stop() {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0);\n this._stopped = true;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/EaseTo.ts\":\n/*!**********************************!*\\\n !*** ./Actions/Action/EaseTo.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EaseTo: () => (/* binding */ EaseTo)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\n\n/**\n * @deprecated use moveTo({pos: Vector, duration: number, easing: EasingFunction})\n */\nclass EaseTo {\n constructor(entity, x, y, duration, easingFcn) {\n this.easingFcn = easingFcn;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._currentLerpTime = 0;\n this._lerpDuration = 1 * 1000; // 1 second\n this._lerpStart = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(0, 0);\n this._lerpEnd = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(0, 0);\n this._initialized = false;\n this._stopped = false;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__.MotionComponent);\n this._lerpDuration = duration;\n this._lerpEnd = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(x, y);\n }\n _initialize() {\n this._lerpStart = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this._tx.pos.x, this._tx.pos.y);\n this._currentLerpTime = 0;\n }\n update(elapsed) {\n if (!this._initialized) {\n this._initialize();\n this._initialized = true;\n }\n // Need to update lerp time first, otherwise the first update will always be zero\n this._currentLerpTime += elapsed;\n let newX = this._tx.pos.x;\n let newY = this._tx.pos.y;\n if (this._currentLerpTime < this._lerpDuration) {\n if (this._lerpEnd.x < this._lerpStart.x) {\n newX =\n this._lerpStart.x -\n (this.easingFcn(this._currentLerpTime, this._lerpEnd.x, this._lerpStart.x, this._lerpDuration) - this._lerpEnd.x);\n }\n else {\n newX = this.easingFcn(this._currentLerpTime, this._lerpStart.x, this._lerpEnd.x, this._lerpDuration);\n }\n if (this._lerpEnd.y < this._lerpStart.y) {\n newY =\n this._lerpStart.y -\n (this.easingFcn(this._currentLerpTime, this._lerpEnd.y, this._lerpStart.y, this._lerpDuration) - this._lerpEnd.y);\n }\n else {\n newY = this.easingFcn(this._currentLerpTime, this._lerpStart.y, this._lerpEnd.y, this._lerpDuration);\n }\n // Given the lerp position figure out the velocity in pixels per second\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)((newX - this._tx.pos.x) / (elapsed / 1000), (newY - this._tx.pos.y) / (elapsed / 1000));\n }\n else {\n this._tx.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(this._lerpEnd.x, this._lerpEnd.y);\n this._motion.vel = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n }\n }\n isComplete() {\n return this._stopped || this._currentLerpTime >= this._lerpDuration;\n }\n reset() {\n this._initialized = false;\n this._stopped = false;\n this._currentLerpTime = 0;\n }\n stop() {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0);\n this._stopped = true;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/Fade.ts\":\n/*!********************************!*\\\n !*** ./Actions/Action/Fade.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Fade: () => (/* binding */ Fade)\n/* harmony export */ });\n/* harmony import */ var _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Graphics/GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\nclass Fade {\n constructor(entity, endOpacity, duration) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._multiplier = 1;\n this._started = false;\n this._stopped = false;\n this._graphics = entity.get(_Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_1__.GraphicsComponent);\n this._endOpacity = endOpacity;\n this._remainingTime = this._originalTime = duration;\n }\n update(elapsed) {\n if (!this._graphics) {\n return;\n }\n if (!this._started) {\n this._started = true;\n this._remainingTime = this._originalTime;\n // determine direction when we start\n if (this._endOpacity < this._graphics.opacity) {\n this._multiplier = -1;\n }\n else {\n this._multiplier = 1;\n }\n }\n if (this._remainingTime > 0) {\n this._graphics.opacity += (this._multiplier * (Math.abs(this._graphics.opacity - this._endOpacity) * elapsed)) / this._remainingTime;\n }\n this._remainingTime -= elapsed;\n if (this.isComplete()) {\n this._graphics.opacity = this._endOpacity;\n }\n _Util_Log__WEBPACK_IMPORTED_MODULE_2__.Logger.getInstance().debug('[Action fade] Actor opacity:', this._graphics.opacity);\n }\n isComplete() {\n return this._stopped || this._remainingTime <= 0;\n }\n stop() {\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n this._remainingTime = this._originalTime;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/Flash.ts\":\n/*!*********************************!*\\\n !*** ./Actions/Action/Flash.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Flash: () => (/* binding */ Flash)\n/* harmony export */ });\n/* harmony import */ var _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Graphics/GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\nclass Flash {\n constructor(entity, color, duration = 1000) {\n var _a;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._stopped = false;\n this._started = false;\n this._total = 0;\n this._currentDuration = 0;\n this._graphics = entity.get(_Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_1__.GraphicsComponent);\n this._duration = duration;\n this._entity = entity;\n this._material = (_a = entity.scene) === null || _a === void 0 ? void 0 : _a.engine.graphicsContext.createMaterial({\n name: 'flash-material',\n color,\n fragmentSource: `#version 300 es\r\n \r\n precision mediump float;\r\n uniform float u_blend;\r\n uniform sampler2D u_graphic;\r\n uniform vec4 u_color;\r\n \r\n in vec2 v_uv; \r\n out vec4 color;\r\n \r\n void main() { \r\n vec4 textureColor = texture(u_graphic, v_uv); \r\n color = mix(textureColor, u_color, u_blend * textureColor.a);\r\n color.rgb = color.rgb * color.a;\r\n }`\n });\n this._total = duration;\n }\n update(elapsed) {\n var _a;\n if (!this._started) {\n this._started = true;\n this._total = this._duration;\n this._currentDuration = this._duration;\n this._entity.graphics.material = this._material;\n }\n if (!this._graphics) {\n return;\n }\n this._currentDuration -= elapsed;\n if (this._graphics) {\n (_a = this._material) === null || _a === void 0 ? void 0 : _a.update((shader) => {\n shader.trySetUniformFloat('u_blend', this._currentDuration / this._total);\n });\n }\n if (this.isComplete()) {\n this._entity.graphics.material = null;\n }\n }\n isComplete() {\n return this._stopped || this._currentDuration <= 0;\n }\n stop() {\n if (this._graphics) {\n this._graphics.isVisible = true;\n }\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/Follow.ts\":\n/*!**********************************!*\\\n !*** ./Actions/Action/Follow.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Follow: () => (/* binding */ Follow)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\n\nclass Follow {\n constructor(entity, entityToFollow, followDistance) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n this._followTx = entityToFollow.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._followMotion = entityToFollow.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n this._current = new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(this._tx.pos.x, this._tx.pos.y);\n this._end = new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(this._followTx.pos.x, this._followTx.pos.y);\n this._maximumDistance = followDistance !== undefined ? followDistance : this._current.distance(this._end);\n this._speed = 0;\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._distanceBetween = this._current.distance(this._end);\n this._dir = this._end.sub(this._current).normalize();\n }\n const actorToFollowSpeed = Math.sqrt(Math.pow(this._followMotion.vel.x, 2) + Math.pow(this._followMotion.vel.y, 2));\n if (actorToFollowSpeed !== 0) {\n this._speed = actorToFollowSpeed;\n }\n this._current = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this._tx.pos.x, this._tx.pos.y);\n this._end = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this._followTx.pos.x, this._followTx.pos.y);\n this._distanceBetween = this._current.distance(this._end);\n this._dir = this._end.sub(this._current).normalize();\n if (this._distanceBetween >= this._maximumDistance) {\n const m = this._dir.scale(this._speed);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(m.x, m.y);\n }\n else {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(0, 0);\n }\n if (this.isComplete()) {\n this._tx.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this._end.x, this._end.y);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(0, 0);\n }\n }\n stop() {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(0, 0);\n this._stopped = true;\n }\n isComplete() {\n // the actor following should never stop unless specified to do so\n return this._stopped;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/Meet.ts\":\n/*!********************************!*\\\n !*** ./Actions/Action/Meet.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Meet: () => (/* binding */ Meet)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\n\nclass Meet {\n constructor(actor, actorToMeet, speed) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._speedWasSpecified = false;\n this._tx = actor.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._motion = actor.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n this._meetTx = actorToMeet.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._meetMotion = actorToMeet.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n this._current = new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(this._tx.pos.x, this._tx.pos.y);\n this._end = new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(this._meetTx.pos.x, this._meetTx.pos.y);\n this._speed = speed || 0;\n if (speed !== undefined) {\n this._speedWasSpecified = true;\n }\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._distanceBetween = this._current.distance(this._end);\n this._dir = this._end.sub(this._current).normalize();\n }\n const actorToMeetSpeed = Math.sqrt(Math.pow(this._meetMotion.vel.x, 2) + Math.pow(this._meetMotion.vel.y, 2));\n if (actorToMeetSpeed !== 0 && !this._speedWasSpecified) {\n this._speed = actorToMeetSpeed;\n }\n this._current = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this._tx.pos.x, this._tx.pos.y);\n this._end = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this._meetTx.pos.x, this._meetTx.pos.y);\n this._distanceBetween = this._current.distance(this._end);\n this._dir = this._end.sub(this._current).normalize();\n const m = this._dir.scale(this._speed);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(m.x, m.y);\n if (this.isComplete()) {\n this._tx.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this._end.x, this._end.y);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(0, 0);\n }\n }\n isComplete() {\n return this._stopped || this._distanceBetween <= 1;\n }\n stop() {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(0, 0);\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n this._distanceBetween = Infinity;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/MoveBy.ts\":\n/*!**********************************!*\\\n !*** ./Actions/Action/MoveBy.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MoveBy: () => (/* binding */ MoveBy),\n/* harmony export */ MoveByWithOptions: () => (/* binding */ MoveByWithOptions),\n/* harmony export */ isMoveByOptions: () => (/* binding */ isMoveByOptions)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math */ \"./Math/util.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../Math */ \"./Math/lerp.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Util/EasingFunctions */ \"./Util/EasingFunctions.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\n\n\n\n\n/**\n *\n */\nfunction isMoveByOptions(x) {\n return x.offset instanceof _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector && typeof x.duration === 'number';\n}\nclass MoveByWithOptions {\n constructor(entity, options) {\n var _a;\n this.entity = entity;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_1__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._easing = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_2__.EasingFunctions.Linear;\n this._offset = options.offset;\n this._easing = (_a = options.easing) !== null && _a !== void 0 ? _a : this._easing;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_4__.MotionComponent);\n if (!this._tx) {\n throw new Error(`Entity ${entity.name} has no TransformComponent, can only MoveBy on Entities with TransformComponents.`);\n }\n this._durationMs = options.duration;\n this._currentMs = this._durationMs;\n }\n update(elapsed) {\n if (!this._started) {\n this._start = this._tx.pos.clone();\n this._end = this._start.add(this._offset);\n this._started = true;\n }\n this._currentMs -= elapsed;\n const t = (0,_Math__WEBPACK_IMPORTED_MODULE_5__.clamp)((0,_Math__WEBPACK_IMPORTED_MODULE_6__.remap)(0, this._durationMs, 0, 1, this._durationMs - this._currentMs), 0, 1);\n const currentPos = this._tx.pos;\n const newPosX = this._easing(t, this._start.x, this._end.x, 1);\n const newPosY = this._easing(t, this._start.y, this._end.y, 1);\n const velX = (newPosX - currentPos.x) / (elapsed / 1000);\n const velY = (newPosY - currentPos.y) / (elapsed / 1000);\n this._motion.vel.x = velX;\n this._motion.vel.y = velY;\n if (this.isComplete(this.entity)) {\n this._tx.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this._end.x, this._end.y);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n }\n }\n isComplete(entity) {\n return this._stopped || this._currentMs < 0;\n }\n stop() {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n this._stopped = true;\n this._currentMs = 0;\n }\n reset() {\n this._currentMs = this._durationMs;\n this._started = false;\n this._stopped = false;\n }\n}\nclass MoveBy {\n constructor(entity, offsetX, offsetY, speed) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_1__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._entity = entity;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_4__.MotionComponent);\n this._speed = speed;\n this._offset = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(offsetX, offsetY);\n if (speed <= 0) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_7__.Logger.getInstance().error('Attempted to moveBy with speed less than or equal to zero : ' + speed);\n throw new Error('Speed must be greater than 0 pixels per second');\n }\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._start = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(this._tx.pos.x, this._tx.pos.y);\n this._end = this._start.add(this._offset);\n this._distance = this._offset.magnitude;\n this._dir = this._end.sub(this._start).normalize();\n }\n if (this.isComplete(this._entity)) {\n this._tx.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this._end.x, this._end.y);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n }\n else {\n this._motion.vel = this._dir.scale(this._speed);\n }\n }\n isComplete(entity) {\n const tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__.TransformComponent);\n return this._stopped || tx.pos.distance(this._start) >= this._distance;\n }\n stop() {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/MoveTo.ts\":\n/*!**********************************!*\\\n !*** ./Actions/Action/MoveTo.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MoveTo: () => (/* binding */ MoveTo),\n/* harmony export */ MoveToWithOptions: () => (/* binding */ MoveToWithOptions),\n/* harmony export */ isMoveToOptions: () => (/* binding */ isMoveToOptions)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math */ \"./Math/util.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../Math */ \"./Math/lerp.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Util/EasingFunctions */ \"./Util/EasingFunctions.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\n\n\n\n/**\n *\n */\nfunction isMoveToOptions(x) {\n return x.pos instanceof _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector && typeof x.duration === 'number';\n}\nclass MoveToWithOptions {\n constructor(entity, options) {\n var _a;\n this.entity = entity;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_1__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._easing = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_2__.EasingFunctions.Linear;\n this._end = options.pos;\n this._easing = (_a = options.easing) !== null && _a !== void 0 ? _a : this._easing;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_4__.MotionComponent);\n if (!this._tx) {\n throw new Error(`Entity ${entity.name} has no TransformComponent, can only moveTo on Entities with TransformComponents.`);\n }\n this._durationMs = options.duration;\n this._currentMs = this._durationMs;\n }\n update(elapsed) {\n if (!this._started) {\n this._start = this._tx.pos.clone();\n this._started = true;\n }\n this._currentMs -= elapsed;\n const t = (0,_Math__WEBPACK_IMPORTED_MODULE_5__.clamp)((0,_Math__WEBPACK_IMPORTED_MODULE_6__.remap)(0, this._durationMs, 0, 1, this._durationMs - this._currentMs), 0, 1);\n const currentPos = this._tx.pos;\n const newPosX = this._easing(t, this._start.x, this._end.x, 1);\n const newPosY = this._easing(t, this._start.y, this._end.y, 1);\n const velX = (newPosX - currentPos.x) / (elapsed / 1000);\n const velY = (newPosY - currentPos.y) / (elapsed / 1000);\n this._motion.vel.x = velX;\n this._motion.vel.y = velY;\n if (this.isComplete(this.entity)) {\n this._tx.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this._end.x, this._end.y);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n }\n }\n isComplete(entity) {\n return this._stopped || this._currentMs < 0;\n }\n stop() {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n this._stopped = true;\n this._currentMs = 0;\n }\n reset() {\n this._currentMs = this._durationMs;\n this._started = false;\n this._stopped = false;\n }\n}\nclass MoveTo {\n constructor(entity, destX, destY, speed) {\n this.entity = entity;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_1__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_4__.MotionComponent);\n this._end = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(destX, destY);\n this._speed = speed;\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._start = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(this._tx.pos.x, this._tx.pos.y);\n this._distance = this._start.distance(this._end);\n this._dir = this._end.sub(this._start).normalize();\n }\n const m = this._dir.scale(this._speed);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(m.x, m.y);\n if (this.isComplete(this.entity)) {\n this._tx.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this._end.x, this._end.y);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n }\n }\n isComplete(entity) {\n const tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__.TransformComponent);\n return this._stopped || new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(tx.pos.x, tx.pos.y).distance(this._start) >= this._distance;\n }\n stop() {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/ParallelActions.ts\":\n/*!*******************************************!*\\\n !*** ./Actions/Action/ParallelActions.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ParallelActions: () => (/* binding */ ParallelActions)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n/**\n * Action that can run multiple {@apilink Action}s or {@apilink ActionSequence}s at the same time\n */\nclass ParallelActions {\n constructor(parallelActions) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._actions = parallelActions;\n }\n update(elapsed) {\n for (let i = 0; i < this._actions.length; i++) {\n this._actions[i].update(elapsed);\n }\n }\n isComplete(entity) {\n return this._actions.every((a) => a.isComplete(entity));\n }\n reset() {\n this._actions.forEach((a) => a.reset());\n }\n stop() {\n this._actions.forEach((a) => a.stop());\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/Repeat.ts\":\n/*!**********************************!*\\\n !*** ./Actions/Action/Repeat.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Repeat: () => (/* binding */ Repeat)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _ActionContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ActionContext */ \"./Actions/ActionContext.ts\");\n\n\nclass Repeat {\n constructor(entity, repeatBuilder, repeat) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._stopped = false;\n this._repeatBuilder = repeatBuilder;\n this._repeatContext = new _ActionContext__WEBPACK_IMPORTED_MODULE_1__.ActionContext(entity);\n this._actionQueue = this._repeatContext.getQueue();\n this._repeat = repeat;\n this._originalRepeat = repeat;\n this._repeatBuilder(this._repeatContext);\n this._repeat--; // current execution is the first repeat\n }\n update(elapsed) {\n if (this._actionQueue.isComplete()) {\n this._actionQueue.clearActions();\n this._repeatBuilder(this._repeatContext);\n this._repeat--;\n }\n this._actionQueue.update(elapsed);\n }\n isComplete() {\n return this._stopped || (this._repeat <= 0 && this._actionQueue.isComplete());\n }\n stop() {\n this._stopped = true;\n }\n reset() {\n this._repeat = this._originalRepeat;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/RepeatForever.ts\":\n/*!*****************************************!*\\\n !*** ./Actions/Action/RepeatForever.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RepeatForever: () => (/* binding */ RepeatForever)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _ActionContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ActionContext */ \"./Actions/ActionContext.ts\");\n\n\n/**\n * RepeatForever Action implementation, it is recommended you use the fluent action\n * context API.\n *\n *\n */\nclass RepeatForever {\n constructor(entity, repeatBuilder) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._stopped = false;\n this._repeatBuilder = repeatBuilder;\n this._repeatContext = new _ActionContext__WEBPACK_IMPORTED_MODULE_1__.ActionContext(entity);\n this._actionQueue = this._repeatContext.getQueue();\n this._repeatBuilder(this._repeatContext);\n }\n update(elapsed) {\n if (this._stopped) {\n return;\n }\n if (this._actionQueue.isComplete()) {\n this._actionQueue.clearActions();\n this._repeatBuilder(this._repeatContext);\n }\n this._actionQueue.update(elapsed);\n }\n isComplete() {\n return this._stopped;\n }\n stop() {\n this._stopped = true;\n this._actionQueue.clearActions();\n }\n reset() {\n return;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/RotateBy.ts\":\n/*!************************************!*\\\n !*** ./Actions/Action/RotateBy.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RotateBy: () => (/* binding */ RotateBy),\n/* harmony export */ RotateByWithOptions: () => (/* binding */ RotateByWithOptions),\n/* harmony export */ isRotateByOptions: () => (/* binding */ isRotateByOptions)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math */ \"./Math/rotation-type.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math */ \"./Math/lerp.ts\");\n\n\n\n\n\n/**\n *\n */\nfunction isRotateByOptions(x) {\n return typeof x.angleRadiansOffset === 'number' && typeof x.duration === 'number';\n}\nclass RotateByWithOptions {\n constructor(entity, options) {\n var _a;\n this.entity = entity;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._offset = 0;\n this._startAngle = 0;\n this._endAngle = 0;\n this._offset = options.angleRadiansOffset;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n if (!this._tx) {\n throw new Error(`Entity ${entity.name} has no TransformComponent, can only RotateBy on Entities with TransformComponents.`);\n }\n this._durationMs = options.duration;\n this._rotationType = (_a = options.rotationType) !== null && _a !== void 0 ? _a : _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.ShortestPath;\n this._currentMs = this._durationMs;\n }\n update(elapsed) {\n if (!this._started) {\n this._startAngle = this._tx.rotation;\n this._endAngle = (0,_Math_util__WEBPACK_IMPORTED_MODULE_4__.canonicalizeAngle)(this._startAngle + this._offset);\n this._started = true;\n }\n this._currentMs -= elapsed;\n const t = (0,_Math_util__WEBPACK_IMPORTED_MODULE_4__.clamp)((0,_Math__WEBPACK_IMPORTED_MODULE_5__.remap)(0, this._durationMs, 0, 1, this._durationMs - this._currentMs), 0, 1);\n const newAngle = (0,_Math__WEBPACK_IMPORTED_MODULE_5__.lerpAngle)(this._startAngle, this._endAngle, this._rotationType, t);\n const currentAngle = this._tx.rotation;\n const rx = (newAngle - currentAngle) / (elapsed / 1000);\n this._motion.angularVelocity = rx;\n if (this.isComplete()) {\n this._tx.rotation = this._endAngle;\n this._motion.angularVelocity = 0;\n }\n }\n isComplete() {\n return this._stopped || this._currentMs < 0;\n }\n stop() {\n this._motion.angularVelocity = 0;\n this._stopped = true;\n this._currentMs = 0;\n }\n reset() {\n this._currentMs = this._durationMs;\n this._started = false;\n this._stopped = false;\n }\n}\nclass RotateBy {\n constructor(entity, angleRadiansOffset, speed, rotationType) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n this._speed = speed;\n this._offset = angleRadiansOffset;\n this._rotationType = rotationType || _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.ShortestPath;\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._start = this._tx.rotation;\n this._currentNonCannonAngle = this._tx.rotation;\n this._end = this._start + this._offset;\n const distance1 = Math.abs(this._end - this._start);\n const distance2 = _Math_util__WEBPACK_IMPORTED_MODULE_4__.TwoPI - distance1;\n if (distance1 > distance2) {\n this._shortDistance = distance2;\n this._longDistance = distance1;\n }\n else {\n this._shortDistance = distance1;\n this._longDistance = distance2;\n }\n this._shortestPathIsPositive = (this._start - this._end + _Math_util__WEBPACK_IMPORTED_MODULE_4__.TwoPI) % _Math_util__WEBPACK_IMPORTED_MODULE_4__.TwoPI >= Math.PI;\n switch (this._rotationType) {\n case _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.ShortestPath:\n this._distance = this._shortDistance;\n if (this._shortestPathIsPositive) {\n this._direction = 1;\n }\n else {\n this._direction = -1;\n }\n break;\n case _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.LongestPath:\n this._distance = this._longDistance;\n if (this._shortestPathIsPositive) {\n this._direction = -1;\n }\n else {\n this._direction = 1;\n }\n break;\n case _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.Clockwise:\n this._direction = 1;\n if (this._shortDistance >= 0) {\n this._distance = this._shortDistance;\n }\n else {\n this._distance = this._longDistance;\n }\n break;\n case _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.CounterClockwise:\n this._direction = -1;\n if (this._shortDistance <= 0) {\n this._distance = this._shortDistance;\n }\n else {\n this._distance = this._longDistance;\n }\n break;\n }\n }\n this._motion.angularVelocity = this._direction * this._speed;\n this._currentNonCannonAngle += this._direction * this._speed * (elapsed / 1000);\n if (this.isComplete()) {\n this._tx.rotation = this._end;\n this._motion.angularVelocity = 0;\n this._stopped = true;\n }\n }\n isComplete() {\n const distanceTraveled = Math.abs(this._currentNonCannonAngle - this._start);\n return this._stopped || distanceTraveled >= Math.abs(this._distance);\n }\n stop() {\n this._motion.angularVelocity = 0;\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n this._start = undefined;\n this._currentNonCannonAngle = undefined;\n this._distance = undefined;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/RotateTo.ts\":\n/*!************************************!*\\\n !*** ./Actions/Action/RotateTo.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RotateTo: () => (/* binding */ RotateTo),\n/* harmony export */ RotateToWithOptions: () => (/* binding */ RotateToWithOptions),\n/* harmony export */ isRotateToOptions: () => (/* binding */ isRotateToOptions)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math */ \"./Math/rotation-type.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math */ \"./Math/lerp.ts\");\n\n\n\n\n\n\n/**\n *\n */\nfunction isRotateToOptions(x) {\n return typeof x.angle === 'number' && typeof x.duration === 'number';\n}\nclass RotateToWithOptions {\n constructor(entity, options) {\n var _a;\n this.entity = entity;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._endAngle = 0;\n this._startAngle = 0;\n this._endAngle = options.angle;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n if (!this._tx) {\n throw new Error(`Entity ${entity.name} has no TransformComponent, can only RotateTo on Entities with TransformComponents.`);\n }\n this._durationMs = options.duration;\n this._rotationType = (_a = options.rotationType) !== null && _a !== void 0 ? _a : _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.ShortestPath;\n this._currentMs = this._durationMs;\n }\n update(elapsed) {\n if (!this._started) {\n this._startAngle = this._tx.rotation;\n this._started = true;\n }\n this._currentMs -= elapsed;\n const t = (0,_Math_util__WEBPACK_IMPORTED_MODULE_4__.clamp)((0,_Math__WEBPACK_IMPORTED_MODULE_5__.remap)(0, this._durationMs, 0, 1, this._durationMs - this._currentMs), 0, 1);\n const newAngle = (0,_Math__WEBPACK_IMPORTED_MODULE_5__.lerpAngle)(this._startAngle, this._endAngle, this._rotationType, t);\n const currentAngle = this._tx.rotation;\n const rx = (newAngle - currentAngle) / (elapsed / 1000);\n this._motion.angularVelocity = rx;\n if (this.isComplete(this.entity)) {\n this._tx.rotation = this._endAngle;\n this._motion.angularVelocity = 0;\n }\n }\n isComplete(entity) {\n return this._stopped || this._currentMs < 0;\n }\n stop() {\n this._motion.angularVelocity = 0;\n this._stopped = true;\n this._currentMs = 0;\n }\n reset() {\n this._currentMs = this._durationMs;\n this._started = false;\n this._stopped = false;\n }\n}\nclass RotateTo {\n constructor(entity, angle, speed, rotationType) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n this._end = angle;\n this._speed = speed;\n this._rotationType = rotationType || _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.ShortestPath;\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._start = this._tx.rotation;\n this._currentNonCannonAngle = this._tx.rotation;\n const distance1 = Math.abs(this._end - this._start);\n const distance2 = _Math_util__WEBPACK_IMPORTED_MODULE_4__.TwoPI - distance1;\n if (distance1 > distance2) {\n this._shortDistance = distance2;\n this._longDistance = distance1;\n }\n else {\n this._shortDistance = distance1;\n this._longDistance = distance2;\n }\n this._shortestPathIsPositive = (this._start - this._end + _Math_util__WEBPACK_IMPORTED_MODULE_4__.TwoPI) % _Math_util__WEBPACK_IMPORTED_MODULE_4__.TwoPI >= Math.PI;\n switch (this._rotationType) {\n case _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.ShortestPath:\n this._distance = this._shortDistance;\n if (this._shortestPathIsPositive) {\n this._direction = 1;\n }\n else {\n this._direction = -1;\n }\n break;\n case _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.LongestPath:\n this._distance = this._longDistance;\n if (this._shortestPathIsPositive) {\n this._direction = -1;\n }\n else {\n this._direction = 1;\n }\n break;\n case _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.Clockwise:\n this._direction = 1;\n if (this._shortestPathIsPositive) {\n this._distance = this._shortDistance;\n }\n else {\n this._distance = this._longDistance;\n }\n break;\n case _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.CounterClockwise:\n this._direction = -1;\n if (!this._shortestPathIsPositive) {\n this._distance = this._shortDistance;\n }\n else {\n this._distance = this._longDistance;\n }\n break;\n }\n }\n this._motion.angularVelocity = this._direction * this._speed;\n this._currentNonCannonAngle += this._direction * this._speed * (elapsed / 1000);\n if (this.isComplete()) {\n this._tx.rotation = this._end;\n this._motion.angularVelocity = 0;\n this._stopped = true;\n }\n }\n isComplete() {\n const distanceTraveled = Math.abs(this._currentNonCannonAngle - this._start);\n return this._stopped || distanceTraveled >= Math.abs(this._distance);\n }\n stop() {\n this._motion.angularVelocity = 0;\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/ScaleBy.ts\":\n/*!***********************************!*\\\n !*** ./Actions/Action/ScaleBy.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ScaleBy: () => (/* binding */ ScaleBy),\n/* harmony export */ ScaleByWithOptions: () => (/* binding */ ScaleByWithOptions),\n/* harmony export */ isScaleByOptions: () => (/* binding */ isScaleByOptions)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Math */ \"./Math/util.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math */ \"./Math/lerp.ts\");\n\n\n\n\n\n/**\n *\n */\nfunction isScaleByOptions(x) {\n return typeof x.scaleOffset === 'object' && typeof x.duration === 'number';\n}\nclass ScaleByWithOptions {\n constructor(entity, options) {\n this.entity = entity;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._endScale = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(1, 1);\n this._scaleOffset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0);\n this._startScale = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(1, 1);\n this._scaleOffset = options.scaleOffset;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__.MotionComponent);\n if (!this._tx) {\n throw new Error(`Entity ${entity.name} has no TransformComponent, can only ScaleBy on Entities with TransformComponents.`);\n }\n this._durationMs = options.duration;\n this._currentMs = this._durationMs;\n }\n update(elapsed) {\n if (!this._started) {\n this._startScale = this._tx.scale;\n this._endScale = this._startScale.add(this._scaleOffset);\n this._started = true;\n }\n this._currentMs -= elapsed;\n const t = (0,_Math__WEBPACK_IMPORTED_MODULE_4__.clamp)((0,_Math__WEBPACK_IMPORTED_MODULE_5__.remap)(0, this._durationMs, 0, 1, this._durationMs - this._currentMs), 0, 1);\n const newScale = (0,_Math__WEBPACK_IMPORTED_MODULE_5__.lerpVector)(this._startScale, this._endScale, t);\n const currentScale = this._tx.scale;\n const sx = newScale.sub(currentScale).scale(1 / (elapsed / 1000));\n this._motion.scaleFactor = sx;\n if (this.isComplete()) {\n this._tx.scale = this._endScale;\n this._motion.angularVelocity = 0;\n }\n }\n isComplete() {\n return this._stopped || this._currentMs < 0;\n }\n stop() {\n this._motion.scaleFactor = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n this._stopped = true;\n this._currentMs = 0;\n }\n reset() {\n this._currentMs = this._durationMs;\n this._started = false;\n this._stopped = false;\n }\n}\nclass ScaleBy {\n constructor(entity, scaleOffsetX, scaleOffsetY, speed) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__.MotionComponent);\n this._offset = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(scaleOffsetX, scaleOffsetY);\n this._speedX = this._speedY = speed;\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._startScale = this._tx.scale.clone();\n this._endScale = this._startScale.add(this._offset);\n this._distanceX = Math.abs(this._endScale.x - this._startScale.x);\n this._distanceY = Math.abs(this._endScale.y - this._startScale.y);\n this._directionX = this._endScale.x < this._startScale.x ? -1 : 1;\n this._directionY = this._endScale.y < this._startScale.y ? -1 : 1;\n }\n this._motion.scaleFactor.x = this._speedX * this._directionX;\n this._motion.scaleFactor.y = this._speedY * this._directionY;\n if (this.isComplete()) {\n this._tx.scale = this._endScale;\n this._motion.scaleFactor.x = 0;\n this._motion.scaleFactor.y = 0;\n }\n }\n isComplete() {\n return (this._stopped ||\n (Math.abs(this._tx.scale.x - this._startScale.x) >= this._distanceX - 0.01 &&\n Math.abs(this._tx.scale.y - this._startScale.y) >= this._distanceY - 0.01));\n }\n stop() {\n this._motion.scaleFactor.x = 0;\n this._motion.scaleFactor.y = 0;\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/ScaleTo.ts\":\n/*!***********************************!*\\\n !*** ./Actions/Action/ScaleTo.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ScaleTo: () => (/* binding */ ScaleTo),\n/* harmony export */ ScaleToWithOptions: () => (/* binding */ ScaleToWithOptions),\n/* harmony export */ isScaleToOptions: () => (/* binding */ isScaleToOptions)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Math */ \"./Math/util.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math */ \"./Math/lerp.ts\");\n\n\n\n\n\n/**\n *\n */\nfunction isScaleToOptions(x) {\n return typeof x.scale === 'object' && typeof x.duration === 'number';\n}\nclass ScaleToWithOptions {\n constructor(entity, options) {\n this.entity = entity;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._endScale = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(1, 1);\n this._startScale = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(1, 1);\n this._endScale = options.scale;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__.MotionComponent);\n if (!this._tx) {\n throw new Error(`Entity ${entity.name} has no TransformComponent, can only ScaleTo on Entities with TransformComponents.`);\n }\n this._durationMs = options.duration;\n this._currentMs = this._durationMs;\n }\n update(elapsed) {\n if (!this._started) {\n this._startScale = this._tx.scale;\n this._started = true;\n }\n this._currentMs -= elapsed;\n const t = (0,_Math__WEBPACK_IMPORTED_MODULE_4__.clamp)((0,_Math__WEBPACK_IMPORTED_MODULE_5__.remap)(0, this._durationMs, 0, 1, this._durationMs - this._currentMs), 0, 1);\n const newScale = (0,_Math__WEBPACK_IMPORTED_MODULE_5__.lerpVector)(this._startScale, this._endScale, t);\n const currentScale = this._tx.scale;\n const sx = newScale.sub(currentScale).scale(1 / (elapsed / 1000));\n this._motion.scaleFactor = sx;\n if (this.isComplete()) {\n this._tx.scale = this._endScale;\n this._motion.angularVelocity = 0;\n }\n }\n isComplete() {\n return this._stopped || this._currentMs < 0;\n }\n stop() {\n this._motion.scaleFactor = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n this._stopped = true;\n this._currentMs = 0;\n }\n reset() {\n this._currentMs = this._durationMs;\n this._started = false;\n this._stopped = false;\n }\n}\nclass ScaleTo {\n constructor(entity, scaleX, scaleY, speedX, speedY) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__.MotionComponent);\n this._endX = scaleX;\n this._endY = scaleY;\n this._speedX = speedX;\n this._speedY = speedY;\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._startX = this._tx.scale.x;\n this._startY = this._tx.scale.y;\n this._distanceX = Math.abs(this._endX - this._startX);\n this._distanceY = Math.abs(this._endY - this._startY);\n }\n if (!(Math.abs(this._tx.scale.x - this._startX) >= this._distanceX)) {\n const directionX = this._endY < this._startY ? -1 : 1;\n this._motion.scaleFactor.x = this._speedX * directionX;\n }\n else {\n this._motion.scaleFactor.x = 0;\n }\n if (!(Math.abs(this._tx.scale.y - this._startY) >= this._distanceY)) {\n const directionY = this._endY < this._startY ? -1 : 1;\n this._motion.scaleFactor.y = this._speedY * directionY;\n }\n else {\n this._motion.scaleFactor.y = 0;\n }\n if (this.isComplete()) {\n this._tx.scale = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(this._endX, this._endY);\n this._motion.scaleFactor.x = 0;\n this._motion.scaleFactor.y = 0;\n }\n }\n isComplete() {\n return (this._stopped ||\n (Math.abs(this._tx.scale.x - this._startX) >= this._distanceX - 0.01 &&\n Math.abs(this._tx.scale.y - this._startY) >= this._distanceY - 0.01));\n }\n stop() {\n this._motion.scaleFactor.x = 0;\n this._motion.scaleFactor.y = 0;\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/ActionsComponent.ts\":\n/*!*************************************!*\\\n !*** ./Actions/ActionsComponent.ts ***!\n \\*************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ActionsComponent: () => (/* binding */ ActionsComponent)\n/* harmony export */ });\n/* harmony import */ var _ActionContext__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./ActionContext */ \"./Actions/ActionContext.ts\");\n/* harmony import */ var _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Component */ \"./EntityComponentSystem/Component.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n\n\n\n\nclass ActionsComponent extends _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor() {\n super(...arguments);\n this.dependencies = [_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent, _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent];\n this._ctx = null;\n }\n onAdd(entity) {\n this._ctx = new _ActionContext__WEBPACK_IMPORTED_MODULE_3__.ActionContext(entity);\n }\n onRemove() {\n this._ctx = null;\n }\n _getCtx() {\n if (!this._ctx) {\n throw new Error('Actions component not attached to an entity, no context available');\n }\n return this._ctx;\n }\n /**\n * Returns the internal action queue\n * @returns action queue\n */\n getQueue() {\n if (!this._ctx) {\n throw new Error('Actions component not attached to an entity, no queue available');\n }\n return this._ctx.getQueue();\n }\n /**\n * Runs a specific action in the action queue\n * @param action\n */\n runAction(action) {\n if (!this._ctx) {\n throw new Error('Actions component not attached to an entity, cannot run action');\n }\n return this._ctx.runAction(action);\n }\n /**\n * Updates the internal action context, performing action and moving through the internal queue\n * @param elapsed\n */\n update(elapsed) {\n var _a;\n return (_a = this._ctx) === null || _a === void 0 ? void 0 : _a.update(elapsed);\n }\n /**\n * Clears all queued actions from the Actor\n */\n clearActions() {\n var _a;\n (_a = this._ctx) === null || _a === void 0 ? void 0 : _a.clearActions();\n }\n /**\n * Animates an actor with a specified bezier curve by an offset to the current position, the start point is assumed\n * to be the actors current position\n * @param options\n */\n curveBy(options) {\n return this._getCtx().curveBy.apply(this._ctx, [options]);\n }\n /**\n * Animates an actor with a specified bezier curve to an absolute world space coordinate, the start point is assumed\n * to be the actors current position\n * @param options\n */\n curveTo(options) {\n return this._getCtx().curveTo.apply(this._ctx, [options]);\n }\n easeTo(...args) {\n return this._getCtx().easeTo.apply(this._ctx, args);\n }\n easeBy(...args) {\n return this._getCtx().easeBy.apply(this._ctx, args);\n }\n moveTo(xOrPosOrOptions, yOrSpeed, speedOrUndefined) {\n return this._getCtx().moveTo.apply(this._ctx, [xOrPosOrOptions, yOrSpeed, speedOrUndefined]);\n }\n moveBy(xOffsetOrVectorOptions, yOffsetOrSpeed, speedOrUndefined) {\n return this._getCtx().moveBy.apply(this._ctx, [xOffsetOrVectorOptions, yOffsetOrSpeed, speedOrUndefined]);\n }\n rotateTo(angle, speed, rotationType) {\n return this._getCtx().rotateTo.apply(this._ctx, [angle, speed, rotationType]);\n }\n rotateBy(angleRadiansOffsetOrOptions, speed, rotationType) {\n return this._getCtx().rotateBy.apply(this._ctx, [angleRadiansOffsetOrOptions, speed, rotationType]);\n }\n scaleTo(sizeXOrVectorOrOptions, sizeYOrSpeed, speedXOrUndefined, speedYOrUndefined) {\n return this._getCtx().scaleTo.apply(this._ctx, [sizeXOrVectorOrOptions, sizeYOrSpeed, speedXOrUndefined, speedYOrUndefined]);\n }\n scaleBy(sizeOffsetXOrVectorOrOptions, sizeOffsetYOrSpeed, speed) {\n return this._getCtx().scaleBy.apply(this._ctx, [sizeOffsetXOrVectorOrOptions, sizeOffsetYOrSpeed, speed]);\n }\n /**\n * This method will cause an actor to blink (become visible and not\n * visible). Optionally, you may specify the number of blinks. Specify the amount of time\n * the actor should be visible per blink, and the amount of time not visible.\n * This method is part of the actor 'Action' fluent API allowing action chaining.\n * @param timeVisible The amount of time to stay visible per blink in milliseconds\n * @param timeNotVisible The amount of time to stay not visible per blink in milliseconds\n * @param numBlinks The number of times to blink\n */\n blink(timeVisible, timeNotVisible, numBlinks) {\n return this._getCtx().blink(timeVisible, timeNotVisible, numBlinks);\n }\n /**\n * This method will cause an actor's opacity to change from its current value\n * to the provided value by a specified time (in milliseconds). This method is\n * part of the actor 'Action' fluent API allowing action chaining.\n * @param opacity The ending opacity\n * @param duration The time it should take to fade the actor (in milliseconds)\n */\n fade(opacity, duration) {\n return this._getCtx().fade(opacity, duration);\n }\n /**\n * This will cause an actor to flash a specific color for a period of time\n * @param color\n * @param duration The duration in milliseconds\n */\n flash(color, duration = 1000) {\n return this._getCtx().flash(color, duration);\n }\n /**\n * This method will delay the next action from executing for a certain\n * amount of time (in milliseconds). This method is part of the actor\n * 'Action' fluent API allowing action chaining.\n * @param duration The amount of time to delay the next action in the queue from executing in milliseconds\n */\n delay(duration) {\n return this._getCtx().delay(duration);\n }\n /**\n * This method will add an action to the queue that will remove the actor from the\n * scene once it has completed its previous Any actions on the\n * action queue after this action will not be executed.\n */\n die() {\n return this._getCtx().die();\n }\n /**\n * This method allows you to call an arbitrary method as the next action in the\n * action queue. This is useful if you want to execute code in after a specific\n * action, i.e An actor arrives at a destination after traversing a path\n */\n callMethod(method) {\n return this._getCtx().callMethod(method);\n }\n /**\n * This method will cause the actor to repeat all of the actions built in\n * the `repeatBuilder` callback. If the number of repeats\n * is not specified it will repeat forever. This method is part of\n * the actor 'Action' fluent API allowing action chaining\n *\n * ```typescript\n * // Move up in a zig-zag by repeated moveBy's\n * actor.actions.repeat(repeatCtx => {\n * repeatCtx.moveBy(10, 0, 10);\n * repeatCtx.moveBy(0, 10, 10);\n * }, 5);\n * ```\n * @param repeatBuilder The builder to specify the repeatable list of actions\n * @param times The number of times to repeat all the previous actions in the action queue. If nothing is specified the actions\n * will repeat forever\n */\n repeat(repeatBuilder, times) {\n return this._getCtx().repeat(repeatBuilder, times);\n }\n /**\n * This method will cause the actor to repeat all of the actions built in\n * the `repeatBuilder` callback. If the number of repeats\n * is not specified it will repeat forever. This method is part of\n * the actor 'Action' fluent API allowing action chaining\n *\n * ```typescript\n * // Move up in a zig-zag by repeated moveBy's\n * actor.actions.repeat(repeatCtx => {\n * repeatCtx.moveBy(10, 0, 10);\n * repeatCtx.moveBy(0, 10, 10);\n * }, 5);\n * ```\n * @param repeatBuilder The builder to specify the repeatable list of actions\n */\n repeatForever(repeatBuilder) {\n return this._getCtx().repeatForever(repeatBuilder);\n }\n /**\n * This method will cause the entity to follow another at a specified distance\n * @param entity The entity to follow\n * @param followDistance The distance to maintain when following, if not specified the actor will follow at the current distance.\n */\n follow(entity, followDistance) {\n return this._getCtx().follow(entity, followDistance);\n }\n /**\n * This method will cause the entity to move towards another until they\n * collide \"meet\" at a specified speed.\n * @param entity The entity to meet\n * @param speed The speed in pixels per second to move, if not specified it will match the speed of the other actor\n */\n meet(entity, speed) {\n return this._getCtx().meet(entity, speed);\n }\n /**\n * Returns a promise that resolves when the current action queue up to now\n * is finished.\n */\n toPromise() {\n return this._getCtx().toPromise();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/ActionsSystem.ts\":\n/*!**********************************!*\\\n !*** ./Actions/ActionsSystem.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ActionsSystem: () => (/* binding */ ActionsSystem)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Priority.ts\");\n/* harmony import */ var _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _ActionsComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ActionsComponent */ \"./Actions/ActionsComponent.ts\");\n\n\n\nclass ActionsSystem extends _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.System {\n constructor(world) {\n super();\n this.world = world;\n this.systemType = _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.SystemType.Update;\n this._actions = [];\n this.query = this.world.query([_ActionsComponent__WEBPACK_IMPORTED_MODULE_1__.ActionsComponent]);\n this.query.entityAdded$.subscribe((e) => this._actions.push(e.get(_ActionsComponent__WEBPACK_IMPORTED_MODULE_1__.ActionsComponent)));\n this.query.entityRemoved$.subscribe((e) => {\n const action = e.get(_ActionsComponent__WEBPACK_IMPORTED_MODULE_1__.ActionsComponent);\n const index = this._actions.indexOf(action);\n if (index > -1) {\n this._actions.splice(index, 1);\n }\n });\n }\n update(elapsed) {\n for (let i = 0; i < this._actions.length; i++) {\n const action = this._actions[i];\n action.update(elapsed);\n }\n }\n}\nActionsSystem.priority = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_2__.SystemPriority.Higher;\n\n\n/***/ }),\n\n/***/ \"./Actions/index.ts\":\n/*!**************************!*\\\n !*** ./Actions/index.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ActionContext: () => (/* reexport safe */ _ActionContext__WEBPACK_IMPORTED_MODULE_0__.ActionContext),\n/* harmony export */ ActionQueue: () => (/* reexport safe */ _ActionQueue__WEBPACK_IMPORTED_MODULE_1__.ActionQueue),\n/* harmony export */ ActionSequence: () => (/* reexport safe */ _Action_ActionSequence__WEBPACK_IMPORTED_MODULE_3__.ActionSequence),\n/* harmony export */ ActionsComponent: () => (/* reexport safe */ _ActionsComponent__WEBPACK_IMPORTED_MODULE_24__.ActionsComponent),\n/* harmony export */ ActionsSystem: () => (/* reexport safe */ _ActionsSystem__WEBPACK_IMPORTED_MODULE_25__.ActionsSystem),\n/* harmony export */ Blink: () => (/* reexport safe */ _Action_Blink__WEBPACK_IMPORTED_MODULE_7__.Blink),\n/* harmony export */ CurveBy: () => (/* reexport safe */ _Action_CurveBy__WEBPACK_IMPORTED_MODULE_23__.CurveBy),\n/* harmony export */ CurveTo: () => (/* reexport safe */ _Action_CurveTo__WEBPACK_IMPORTED_MODULE_22__.CurveTo),\n/* harmony export */ Delay: () => (/* reexport safe */ _Action_Delay__WEBPACK_IMPORTED_MODULE_20__.Delay),\n/* harmony export */ Die: () => (/* reexport safe */ _Action_Die__WEBPACK_IMPORTED_MODULE_8__.Die),\n/* harmony export */ EaseBy: () => (/* reexport safe */ _Action_EaseBy__WEBPACK_IMPORTED_MODULE_10__.EaseBy),\n/* harmony export */ EaseTo: () => (/* reexport safe */ _Action_EaseTo__WEBPACK_IMPORTED_MODULE_9__.EaseTo),\n/* harmony export */ Fade: () => (/* reexport safe */ _Action_Fade__WEBPACK_IMPORTED_MODULE_11__.Fade),\n/* harmony export */ Flash: () => (/* reexport safe */ _Action_Flash__WEBPACK_IMPORTED_MODULE_21__.Flash),\n/* harmony export */ Follow: () => (/* reexport safe */ _Action_Follow__WEBPACK_IMPORTED_MODULE_12__.Follow),\n/* harmony export */ Meet: () => (/* reexport safe */ _Action_Meet__WEBPACK_IMPORTED_MODULE_13__.Meet),\n/* harmony export */ MoveBy: () => (/* reexport safe */ _Action_MoveBy__WEBPACK_IMPORTED_MODULE_14__.MoveBy),\n/* harmony export */ MoveByWithOptions: () => (/* reexport safe */ _Action_MoveBy__WEBPACK_IMPORTED_MODULE_14__.MoveByWithOptions),\n/* harmony export */ MoveTo: () => (/* reexport safe */ _Action_MoveTo__WEBPACK_IMPORTED_MODULE_15__.MoveTo),\n/* harmony export */ MoveToWithOptions: () => (/* reexport safe */ _Action_MoveTo__WEBPACK_IMPORTED_MODULE_15__.MoveToWithOptions),\n/* harmony export */ ParallelActions: () => (/* reexport safe */ _Action_ParallelActions__WEBPACK_IMPORTED_MODULE_4__.ParallelActions),\n/* harmony export */ Repeat: () => (/* reexport safe */ _Action_Repeat__WEBPACK_IMPORTED_MODULE_5__.Repeat),\n/* harmony export */ RepeatForever: () => (/* reexport safe */ _Action_RepeatForever__WEBPACK_IMPORTED_MODULE_6__.RepeatForever),\n/* harmony export */ RotateBy: () => (/* reexport safe */ _Action_RotateBy__WEBPACK_IMPORTED_MODULE_16__.RotateBy),\n/* harmony export */ RotateByWithOptions: () => (/* reexport safe */ _Action_RotateBy__WEBPACK_IMPORTED_MODULE_16__.RotateByWithOptions),\n/* harmony export */ RotateTo: () => (/* reexport safe */ _Action_RotateTo__WEBPACK_IMPORTED_MODULE_17__.RotateTo),\n/* harmony export */ RotateToWithOptions: () => (/* reexport safe */ _Action_RotateTo__WEBPACK_IMPORTED_MODULE_17__.RotateToWithOptions),\n/* harmony export */ ScaleBy: () => (/* reexport safe */ _Action_ScaleBy__WEBPACK_IMPORTED_MODULE_18__.ScaleBy),\n/* harmony export */ ScaleByWithOptions: () => (/* reexport safe */ _Action_ScaleBy__WEBPACK_IMPORTED_MODULE_18__.ScaleByWithOptions),\n/* harmony export */ ScaleTo: () => (/* reexport safe */ _Action_ScaleTo__WEBPACK_IMPORTED_MODULE_19__.ScaleTo),\n/* harmony export */ ScaleToWithOptions: () => (/* reexport safe */ _Action_ScaleTo__WEBPACK_IMPORTED_MODULE_19__.ScaleToWithOptions),\n/* harmony export */ isMoveByOptions: () => (/* reexport safe */ _Action_MoveBy__WEBPACK_IMPORTED_MODULE_14__.isMoveByOptions),\n/* harmony export */ isMoveToOptions: () => (/* reexport safe */ _Action_MoveTo__WEBPACK_IMPORTED_MODULE_15__.isMoveToOptions),\n/* harmony export */ isRotateByOptions: () => (/* reexport safe */ _Action_RotateBy__WEBPACK_IMPORTED_MODULE_16__.isRotateByOptions),\n/* harmony export */ isRotateToOptions: () => (/* reexport safe */ _Action_RotateTo__WEBPACK_IMPORTED_MODULE_17__.isRotateToOptions),\n/* harmony export */ isScaleByOptions: () => (/* reexport safe */ _Action_ScaleBy__WEBPACK_IMPORTED_MODULE_18__.isScaleByOptions),\n/* harmony export */ isScaleToOptions: () => (/* reexport safe */ _Action_ScaleTo__WEBPACK_IMPORTED_MODULE_19__.isScaleToOptions),\n/* harmony export */ nextActionId: () => (/* reexport safe */ _Action__WEBPACK_IMPORTED_MODULE_2__.nextActionId)\n/* harmony export */ });\n/* harmony import */ var _ActionContext__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ActionContext */ \"./Actions/ActionContext.ts\");\n/* harmony import */ var _ActionQueue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ActionQueue */ \"./Actions/ActionQueue.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _Action_ActionSequence__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Action/ActionSequence */ \"./Actions/Action/ActionSequence.ts\");\n/* harmony import */ var _Action_ParallelActions__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Action/ParallelActions */ \"./Actions/Action/ParallelActions.ts\");\n/* harmony import */ var _Action_Repeat__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Action/Repeat */ \"./Actions/Action/Repeat.ts\");\n/* harmony import */ var _Action_RepeatForever__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Action/RepeatForever */ \"./Actions/Action/RepeatForever.ts\");\n/* harmony import */ var _Action_Blink__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Action/Blink */ \"./Actions/Action/Blink.ts\");\n/* harmony import */ var _Action_Die__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Action/Die */ \"./Actions/Action/Die.ts\");\n/* harmony import */ var _Action_EaseTo__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Action/EaseTo */ \"./Actions/Action/EaseTo.ts\");\n/* harmony import */ var _Action_EaseBy__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Action/EaseBy */ \"./Actions/Action/EaseBy.ts\");\n/* harmony import */ var _Action_Fade__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Action/Fade */ \"./Actions/Action/Fade.ts\");\n/* harmony import */ var _Action_Follow__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Action/Follow */ \"./Actions/Action/Follow.ts\");\n/* harmony import */ var _Action_Meet__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Action/Meet */ \"./Actions/Action/Meet.ts\");\n/* harmony import */ var _Action_MoveBy__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Action/MoveBy */ \"./Actions/Action/MoveBy.ts\");\n/* harmony import */ var _Action_MoveTo__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Action/MoveTo */ \"./Actions/Action/MoveTo.ts\");\n/* harmony import */ var _Action_RotateBy__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Action/RotateBy */ \"./Actions/Action/RotateBy.ts\");\n/* harmony import */ var _Action_RotateTo__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./Action/RotateTo */ \"./Actions/Action/RotateTo.ts\");\n/* harmony import */ var _Action_ScaleBy__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Action/ScaleBy */ \"./Actions/Action/ScaleBy.ts\");\n/* harmony import */ var _Action_ScaleTo__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./Action/ScaleTo */ \"./Actions/Action/ScaleTo.ts\");\n/* harmony import */ var _Action_Delay__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./Action/Delay */ \"./Actions/Action/Delay.ts\");\n/* harmony import */ var _Action_Flash__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./Action/Flash */ \"./Actions/Action/Flash.ts\");\n/* harmony import */ var _Action_CurveTo__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./Action/CurveTo */ \"./Actions/Action/CurveTo.ts\");\n/* harmony import */ var _Action_CurveBy__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./Action/CurveBy */ \"./Actions/Action/CurveBy.ts\");\n/* harmony import */ var _ActionsComponent__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./ActionsComponent */ \"./Actions/ActionsComponent.ts\");\n/* harmony import */ var _ActionsSystem__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./ActionsSystem */ \"./Actions/ActionsSystem.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Actor.ts\":\n/*!******************!*\\\n !*** ./Actor.ts ***!\n \\******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Actor: () => (/* binding */ Actor),\n/* harmony export */ ActorEvents: () => (/* binding */ ActorEvents),\n/* harmony export */ isActor: () => (/* binding */ isActor)\n/* harmony export */ });\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./Events */ \"./Events.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Collision/BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Collision/CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./EntityComponentSystem/Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Graphics/GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Graphics_Rectangle__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Graphics/Rectangle */ \"./Graphics/Rectangle.ts\");\n/* harmony import */ var _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Collision/ColliderComponent */ \"./Collision/ColliderComponent.ts\");\n/* harmony import */ var _Collision_Colliders_Shape__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Collision/Colliders/Shape */ \"./Collision/Colliders/Shape.ts\");\n/* harmony import */ var _Util_Watch__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Util/Watch */ \"./Util/Watch.ts\");\n/* harmony import */ var _Graphics_Circle__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Graphics/Circle */ \"./Graphics/Circle.ts\");\n/* harmony import */ var _Input_PointerComponent__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Input/PointerComponent */ \"./Input/PointerComponent.ts\");\n/* harmony import */ var _Actions_ActionsComponent__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Actions/ActionsComponent */ \"./Actions/ActionsComponent.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Math/coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Type guard for checking if something is an Actor\n * @param x\n */\nfunction isActor(x) {\n return x instanceof Actor;\n}\nconst ActorEvents = {\n CollisionStart: 'collisionstart',\n CollisionEnd: 'collisionend',\n PreCollision: 'precollision',\n PostCollision: 'postcollision',\n Kill: 'kill',\n PreKill: 'prekill',\n PostKill: 'postkill',\n PreDraw: 'predraw',\n PostDraw: 'postdraw',\n PreTransformDraw: 'pretransformdraw',\n PostTransformDraw: 'posttransformdraw',\n PreDebugDraw: 'predebugdraw',\n PostDebugDraw: 'postdebugdraw',\n PointerUp: 'pointerup',\n PointerDown: 'pointerdown',\n PointerEnter: 'pointerenter',\n PointerLeave: 'pointerleave',\n PointerMove: 'pointermove',\n PointerCancel: 'pointercancel',\n Wheel: 'pointerwheel',\n PointerDrag: 'pointerdragstart',\n PointerDragEnd: 'pointerdragend',\n PointerDragEnter: 'pointerdragenter',\n PointerDragLeave: 'pointerdragleave',\n PointerDragMove: 'pointerdragmove',\n EnterViewPort: 'enterviewport',\n ExitViewPort: 'exitviewport',\n ActionStart: 'actionstart',\n ActionComplete: 'actioncomplete'\n};\n/**\n * The most important primitive in Excalibur is an `Actor`. Anything that\n * can move on the screen, collide with another `Actor`, respond to events,\n * or interact with the current scene, must be an actor. An `Actor` **must**\n * be part of a {@apilink Scene} for it to be drawn to the screen.\n */\nclass Actor extends _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__.Entity {\n /**\n * Gets the position vector of the actor in pixels\n */\n get pos() {\n return this.transform.pos;\n }\n /**\n * Sets the position vector of the actor in pixels\n */\n set pos(thePos) {\n this.transform.pos = thePos.clone();\n }\n /**\n * Gets the position vector of the actor from the last frame\n */\n get oldPos() {\n return this.body.oldPos;\n }\n /**\n * Gets the global position vector of the actor from the last frame\n */\n get oldGlobalPos() {\n return this.body.oldGlobalPos;\n }\n /**\n * Sets the position vector of the actor in the last frame\n */\n set oldPos(thePos) {\n this.body.oldPos.setTo(thePos.x, thePos.y);\n }\n /**\n * Gets the velocity vector of the actor in pixels/sec\n */\n get vel() {\n return this.motion.vel;\n }\n /**\n * Sets the velocity vector of the actor in pixels/sec\n */\n set vel(theVel) {\n this.motion.vel = theVel.clone();\n }\n /**\n * Gets the velocity vector of the actor from the last frame\n */\n get oldVel() {\n return this.body.oldVel;\n }\n /**\n * Sets the velocity vector of the actor from the last frame\n */\n set oldVel(theVel) {\n this.body.oldVel.setTo(theVel.x, theVel.y);\n }\n /**\n * Gets the acceleration vector of the actor in pixels/second/second. An acceleration pointing down such as (0, 100) may be\n * useful to simulate a gravitational effect.\n */\n get acc() {\n return this.motion.acc;\n }\n /**\n * Sets the acceleration vector of teh actor in pixels/second/second\n */\n set acc(theAcc) {\n this.motion.acc = theAcc.clone();\n }\n /**\n * Sets the acceleration of the actor from the last frame. This does not include the global acc {@apilink Physics.acc}.\n */\n set oldAcc(theAcc) {\n this.body.oldAcc.setTo(theAcc.x, theAcc.y);\n }\n /**\n * Gets the acceleration of the actor from the last frame. This does not include the global acc {@apilink Physics.acc}.\n */\n get oldAcc() {\n return this.body.oldAcc;\n }\n /**\n * Gets the rotation of the actor in radians. 1 radian = 180/PI Degrees.\n */\n get rotation() {\n return this.transform.rotation;\n }\n /**\n * Sets the rotation of the actor in radians. 1 radian = 180/PI Degrees.\n */\n set rotation(theAngle) {\n this.transform.rotation = theAngle;\n }\n /**\n * Gets the rotational velocity of the actor in radians/second\n */\n get angularVelocity() {\n return this.motion.angularVelocity;\n }\n /**\n * Sets the rotational velocity of the actor in radians/sec\n */\n set angularVelocity(angularVelocity) {\n this.motion.angularVelocity = angularVelocity;\n }\n get scale() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).scale;\n }\n set scale(scale) {\n this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).scale = scale;\n }\n /**\n * The anchor to apply all actor related transformations like rotation,\n * translation, and scaling. By default the anchor is in the center of\n * the actor. By default it is set to the center of the actor (.5, .5)\n *\n * An anchor of (.5, .5) will ensure that drawings are centered.\n *\n * Use `anchor.setTo` to set the anchor to a different point using\n * values between 0 and 1. For example, anchoring to the top-left would be\n * `Actor.anchor.setTo(0, 0)` and top-right would be `Actor.anchor.setTo(0, 1)`.\n */\n get anchor() {\n return this._anchor;\n }\n set anchor(vec) {\n this._anchor = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_2__.watch)(vec, (v) => this._handleAnchorChange(v));\n this._handleAnchorChange(vec);\n }\n _handleAnchorChange(v) {\n if (this.graphics) {\n this.graphics.anchor = v;\n }\n }\n /**\n * The offset in pixels to apply to all actor graphics\n *\n * Default offset of (0, 0)\n */\n get offset() {\n return this._offset;\n }\n set offset(vec) {\n this._offset = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_2__.watch)(vec, (v) => this._handleOffsetChange(v));\n this._handleOffsetChange(vec);\n }\n _handleOffsetChange(v) {\n if (this.graphics) {\n this.graphics.offset = v;\n }\n }\n /**\n * Indicates whether the actor is physically in the viewport\n */\n get isOffScreen() {\n return this.hasTag('ex.offscreen');\n }\n get draggable() {\n return this._draggable;\n }\n set draggable(isDraggable) {\n if (isDraggable) {\n if (isDraggable && !this._draggable) {\n this.events.on('pointerdragstart', this._pointerDragStartHandler);\n this.events.on('pointerdragend', this._pointerDragEndHandler);\n this.events.on('pointerdragmove', this._pointerDragMoveHandler);\n this.events.on('pointerdragleave', this._pointerDragLeaveHandler);\n }\n else if (!isDraggable && this._draggable) {\n this.events.off('pointerdragstart', this._pointerDragStartHandler);\n this.events.off('pointerdragend', this._pointerDragEndHandler);\n this.events.off('pointerdragmove', this._pointerDragMoveHandler);\n this.events.off('pointerdragleave', this._pointerDragLeaveHandler);\n }\n this._draggable = isDraggable;\n }\n }\n /**\n * Sets the color of the actor's current graphic\n */\n get color() {\n return this.graphics.color;\n }\n set color(v) {\n this.graphics.color = v;\n }\n // #endregion\n /**\n *\n * @param config\n */\n constructor(config) {\n super();\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_3__.EventEmitter();\n this._anchor = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_2__.watch)(_Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Half, (v) => this._handleAnchorChange(v));\n this._offset = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_2__.watch)(_Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero, (v) => this._handleOffsetChange(v));\n /**\n * Convenience reference to the global logger\n */\n this.logger = _Util_Log__WEBPACK_IMPORTED_MODULE_5__.Logger.getInstance();\n /**\n * Draggable helper\n */\n this._draggable = false;\n this._dragging = false;\n this._pointerDragStartHandler = () => {\n this._dragging = true;\n };\n this._pointerDragEndHandler = () => {\n this._dragging = false;\n };\n this._pointerDragMoveHandler = (pe) => {\n if (this._dragging) {\n this.pos = pe.worldPos;\n }\n };\n this._pointerDragLeaveHandler = (pe) => {\n if (this._dragging) {\n this.pos = pe.worldPos;\n }\n };\n const { name, x, y, pos, coordPlane, scale, width, height, radius, collider, vel, acc, rotation, angularVelocity, z, color, visible, opacity, anchor, offset, collisionType, collisionGroup, silenceWarnings } = {\n ...config\n };\n this.name = name !== null && name !== void 0 ? name : this.name;\n this.anchor = anchor !== null && anchor !== void 0 ? anchor : Actor.defaults.anchor.clone();\n this.offset = offset !== null && offset !== void 0 ? offset : _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero;\n this.transform = new _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent();\n this.addComponent(this.transform);\n this.pos = pos !== null && pos !== void 0 ? pos : (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(x !== null && x !== void 0 ? x : 0, y !== null && y !== void 0 ? y : 0);\n this.rotation = rotation !== null && rotation !== void 0 ? rotation : 0;\n this.scale = scale !== null && scale !== void 0 ? scale : (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(1, 1);\n this.z = z !== null && z !== void 0 ? z : 0;\n this.transform.coordPlane = coordPlane !== null && coordPlane !== void 0 ? coordPlane : _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__.CoordPlane.World;\n this._silenceWarnings = silenceWarnings !== null && silenceWarnings !== void 0 ? silenceWarnings : false;\n this.pointer = new _Input_PointerComponent__WEBPACK_IMPORTED_MODULE_7__.PointerComponent();\n this.addComponent(this.pointer);\n this.graphics = new _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_8__.GraphicsComponent({\n anchor: this.anchor,\n offset: this.offset,\n opacity: opacity\n });\n this.addComponent(this.graphics);\n this.motion = new _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_9__.MotionComponent();\n this.addComponent(this.motion);\n this.vel = vel !== null && vel !== void 0 ? vel : _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero;\n this.acc = acc !== null && acc !== void 0 ? acc : _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero;\n this.angularVelocity = angularVelocity !== null && angularVelocity !== void 0 ? angularVelocity : 0;\n this.actions = new _Actions_ActionsComponent__WEBPACK_IMPORTED_MODULE_10__.ActionsComponent();\n this.addComponent(this.actions);\n this.body = new _Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_11__.BodyComponent();\n this.addComponent(this.body);\n this.body.collisionType = collisionType !== null && collisionType !== void 0 ? collisionType : _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_12__.CollisionType.Passive;\n if (collisionGroup) {\n this.body.group = collisionGroup;\n }\n if (color) {\n this.color = color;\n }\n if (collider) {\n this.collider = new _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_13__.ColliderComponent(collider);\n this.addComponent(this.collider);\n }\n else if (radius) {\n this.collider = new _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_13__.ColliderComponent(_Collision_Colliders_Shape__WEBPACK_IMPORTED_MODULE_14__.Shape.Circle(radius));\n this.addComponent(this.collider);\n if (color) {\n this.graphics.add(new _Graphics_Circle__WEBPACK_IMPORTED_MODULE_15__.Circle({\n color: color,\n radius\n }));\n }\n }\n else {\n if (width > 0 && height > 0) {\n this.collider = new _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_13__.ColliderComponent(_Collision_Colliders_Shape__WEBPACK_IMPORTED_MODULE_14__.Shape.Box(width, height, this.anchor));\n this.addComponent(this.collider);\n if (color && width && height) {\n this.graphics.add(new _Graphics_Rectangle__WEBPACK_IMPORTED_MODULE_16__.Rectangle({\n color: color,\n width,\n height\n }));\n }\n }\n else {\n this.collider = new _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_13__.ColliderComponent();\n this.addComponent(this.collider); // no collider\n }\n }\n this.graphics.isVisible = visible !== null && visible !== void 0 ? visible : true;\n }\n clone() {\n const clone = new Actor({\n silenceWarnings: this._silenceWarnings,\n color: this.color.clone(),\n anchor: this.anchor.clone(),\n offset: this.offset.clone()\n });\n clone.clearComponents();\n clone.processComponentRemoval();\n // Clone builtins, order is important, same as ctor\n clone.addComponent((clone.transform = this.transform.clone()), true);\n clone.addComponent((clone.pointer = this.pointer.clone()), true);\n clone.addComponent((clone.graphics = this.graphics.clone()), true);\n clone.addComponent((clone.motion = this.motion.clone()), true);\n clone.addComponent((clone.actions = this.actions.clone()), true);\n clone.addComponent((clone.body = this.body.clone()), true);\n clone.addComponent((clone.collider = this.collider.clone()), true);\n const builtInComponents = [\n this.transform,\n this.pointer,\n this.graphics,\n this.motion,\n this.actions,\n this.body,\n this.collider\n ];\n // Clone non-builtin the current actors components\n const components = this.getComponents();\n for (const c of components) {\n if (!builtInComponents.includes(c)) {\n clone.addComponent(c.clone(), true);\n }\n }\n return clone;\n }\n /**\n * `onInitialize` is called before the first update of the actor. This method is meant to be\n * overridden. This is where initialization of child actors should take place.\n *\n * Synonymous with the event handler `.on('initialize', (evt) => {...})`\n */\n onInitialize(engine) {\n // Override me\n }\n /**\n * Initializes this actor and all it's child actors, meant to be called by the Scene before first update not by users of Excalibur.\n *\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n * @internal\n */\n _initialize(engine) {\n super._initialize(engine);\n for (const child of this.children) {\n child._initialize(engine);\n }\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n // #endregion\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _prekill handler for {@apilink onPreKill} lifecycle event\n * @internal\n */\n _prekill(scene) {\n this.events.emit('prekill', new _Events__WEBPACK_IMPORTED_MODULE_17__.PreKillEvent(this));\n this.onPreKill(scene);\n }\n /**\n * Safe to override onPreKill lifecycle event handler. Synonymous with `.on('prekill', (evt) =>{...})`\n *\n * `onPreKill` is called directly before an actor is killed and removed from its current {@apilink Scene}.\n */\n onPreKill(scene) {\n // Override me\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _prekill handler for {@apilink onPostKill} lifecycle event\n * @internal\n */\n _postkill(scene) {\n this.events.emit('postkill', new _Events__WEBPACK_IMPORTED_MODULE_17__.PostKillEvent(this));\n this.onPostKill(scene);\n }\n /**\n * Safe to override onPostKill lifecycle event handler. Synonymous with `.on('postkill', (evt) => {...})`\n *\n * `onPostKill` is called directly after an actor is killed and remove from its current {@apilink Scene}.\n */\n onPostKill(scene) {\n // Override me\n }\n /**\n * If the current actor is a member of the scene, this will remove\n * it from the scene graph. It will no longer be drawn or updated.\n */\n kill() {\n if (this.scene) {\n this._prekill(this.scene);\n this.events.emit('kill', new _Events__WEBPACK_IMPORTED_MODULE_17__.KillEvent(this));\n super.kill();\n this._postkill(this.scene);\n }\n else {\n this.logger.warn(`Cannot kill actor named \"${this.name}\", it was never added to the Scene`);\n }\n }\n /**\n * If the current actor is killed, it will now not be killed.\n */\n unkill() {\n this.isActive = true;\n }\n /**\n * Indicates wether the actor has been killed.\n */\n isKilled() {\n return !this.isActive;\n }\n /**\n * Gets the z-index of an actor. The z-index determines the relative order an actor is drawn in.\n * Actors with a higher z-index are drawn on top of actors with a lower z-index\n */\n get z() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).z;\n }\n /**\n * Sets the z-index of an actor and updates it in the drawing list for the scene.\n * The z-index determines the relative order an actor is drawn in.\n * Actors with a higher z-index are drawn on top of actors with a lower z-index\n * @param newZ new z-index to assign\n */\n set z(newZ) {\n this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).z = newZ;\n }\n /**\n * Get the center point of an actor (global position)\n */\n get center() {\n const globalPos = this.getGlobalPos();\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector(globalPos.x + this.width / 2 - this.anchor.x * this.width, globalPos.y + this.height / 2 - this.anchor.y * this.height);\n }\n /**\n * Get the local center point of an actor\n */\n get localCenter() {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector(this.pos.x + this.width / 2 - this.anchor.x * this.width, this.pos.y + this.height / 2 - this.anchor.y * this.height);\n }\n get width() {\n return this.collider.localBounds.width * this.getGlobalScale().x;\n }\n get height() {\n return this.collider.localBounds.height * this.getGlobalScale().y;\n }\n /**\n * Gets this actor's rotation taking into account any parent relationships\n * @returns Rotation angle in radians\n * @deprecated Use {@apilink globalRotation} instead\n */\n getGlobalRotation() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).globalRotation;\n }\n /**\n * The actor's rotation (in radians) taking into account any parent relationships\n */\n get globalRotation() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).globalRotation;\n }\n /**\n * Gets an actor's world position taking into account parent relationships, scaling, rotation, and translation\n * @returns Position in world coordinates\n * @deprecated Use {@apilink globalPos} instead\n */\n getGlobalPos() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).globalPos;\n }\n /**\n * The actor's world position taking into account parent relationships, scaling, rotation, and translation\n */\n get globalPos() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).globalPos;\n }\n /**\n * Gets the global scale of the Actor\n * @deprecated Use {@apilink globalScale} instead\n */\n getGlobalScale() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).globalScale;\n }\n /**\n * The global scale of the Actor\n */\n get globalScale() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).globalScale;\n }\n /**\n * The global z-index of the actor\n */\n get globalZ() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).globalZ;\n }\n // #region Collision\n /**\n * Tests whether the x/y specified are contained in the actor\n * @param x X coordinate to test (in world coordinates)\n * @param y Y coordinate to test (in world coordinates)\n * @param recurse checks whether the x/y are contained in any child actors (if they exist).\n */\n contains(x, y, recurse = false) {\n const point = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(x, y);\n const collider = this.get(_Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_13__.ColliderComponent);\n collider.update();\n const geom = collider.get();\n if (!geom) {\n return false;\n }\n const containment = geom.contains(point);\n if (recurse) {\n return (containment ||\n this.children.some((child) => {\n return child.contains(x, y, true);\n }));\n }\n return containment;\n }\n /**\n * Returns true if the two actor.collider's surfaces are less than or equal to the distance specified from each other\n * @param actor Actor to test\n * @param distance Distance in pixels to test\n */\n within(actor, distance) {\n const collider = this.get(_Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_13__.ColliderComponent);\n const otherCollider = actor.get(_Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_13__.ColliderComponent);\n const me = collider.get();\n const other = otherCollider.get();\n if (me && other) {\n return me.getClosestLineBetween(other).getLength() <= distance;\n }\n return false;\n }\n // #endregion\n // #region Update\n /**\n * Called by the Engine, updates the state of the actor\n * @internal\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n */\n update(engine, elapsed) {\n this._initialize(engine);\n this._add(engine);\n this._preupdate(engine, elapsed);\n this._postupdate(engine, elapsed);\n this._remove(engine);\n }\n /**\n * Safe to override onPreUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPreUpdate` is called directly before an actor is updated.\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n */\n onPreUpdate(engine, elapsed) {\n // Override me\n }\n /**\n * Safe to override onPostUpdate lifecycle event handler. Synonymous with `.on('postupdate', (evt) =>{...})`\n *\n * `onPostUpdate` is called directly after an actor is updated.\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n */\n onPostUpdate(engine, elapsed) {\n // Override me\n }\n /**\n * Fires before every collision resolution for a confirmed contact\n * @param self\n * @param other\n * @param side\n * @param contact\n */\n onPreCollisionResolve(self, other, side, contact) {\n // Override me\n }\n /**\n * Fires after every resolution for a confirmed contact.\n * @param self\n * @param other\n * @param side\n * @param contact\n */\n onPostCollisionResolve(self, other, side, contact) {\n // Override me\n }\n /**\n * Fires once when 2 entities with a ColliderComponent first start colliding or touching, if the Colliders stay in contact this\n * does not continue firing until they separate and re-collide.\n * @param self\n * @param other\n * @param side\n * @param contact\n */\n onCollisionStart(self, other, side, contact) {\n // Override me\n }\n /**\n * Fires once when 2 entities with a ColliderComponent separate after having been in contact.\n * @param self\n * @param other\n * @param side\n * @param lastContact\n */\n onCollisionEnd(self, other, side, lastContact) {\n // Override me\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _preupdate handler for {@apilink onPreUpdate} lifecycle event\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n * @internal\n */\n _preupdate(engine, elapsed) {\n this.events.emit('preupdate', new _Events__WEBPACK_IMPORTED_MODULE_17__.PreUpdateEvent(engine, elapsed, this));\n this.onPreUpdate(engine, elapsed);\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _preupdate handler for {@apilink onPostUpdate} lifecycle event\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n * @internal\n */\n _postupdate(engine, elapsed) {\n this.events.emit('postupdate', new _Events__WEBPACK_IMPORTED_MODULE_17__.PostUpdateEvent(engine, elapsed, this));\n this.onPostUpdate(engine, elapsed);\n }\n}\n// #region Properties\n/**\n * Set defaults for all Actors\n */\nActor.defaults = {\n anchor: _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Half\n};\n\n\n/***/ }),\n\n/***/ \"./Camera.ts\":\n/*!*******************!*\\\n !*** ./Camera.ts ***!\n \\*******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Axis: () => (/* binding */ Axis),\n/* harmony export */ Camera: () => (/* binding */ Camera),\n/* harmony export */ CameraEvents: () => (/* binding */ CameraEvents),\n/* harmony export */ ElasticToActorStrategy: () => (/* binding */ ElasticToActorStrategy),\n/* harmony export */ LimitCameraBoundsStrategy: () => (/* binding */ LimitCameraBoundsStrategy),\n/* harmony export */ LockCameraToActorAxisStrategy: () => (/* binding */ LockCameraToActorAxisStrategy),\n/* harmony export */ LockCameraToActorStrategy: () => (/* binding */ LockCameraToActorStrategy),\n/* harmony export */ RadiusAroundActorStrategy: () => (/* binding */ RadiusAroundActorStrategy),\n/* harmony export */ StrategyContainer: () => (/* binding */ StrategyContainer)\n/* harmony export */ });\n/* harmony import */ var _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Util/EasingFunctions */ \"./Util/EasingFunctions.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Util/Util */ \"./Util/Util.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Events */ \"./Events.ts\");\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Math/affine-matrix */ \"./Math/affine-matrix.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Graphics */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Math_watch_vector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Math/watch-vector */ \"./Math/watch-vector.ts\");\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Container to house convenience strategy methods\n * @internal\n */\nclass StrategyContainer {\n constructor(camera) {\n this.camera = camera;\n }\n /**\n * Creates and adds the {@apilink LockCameraToActorStrategy} on the current camera.\n * @param actor The actor to lock the camera to\n */\n lockToActor(actor) {\n this.camera.addStrategy(new LockCameraToActorStrategy(actor));\n }\n /**\n * Creates and adds the {@apilink LockCameraToActorAxisStrategy} on the current camera\n * @param actor The actor to lock the camera to\n * @param axis The axis to follow the actor on\n */\n lockToActorAxis(actor, axis) {\n this.camera.addStrategy(new LockCameraToActorAxisStrategy(actor, axis));\n }\n /**\n * Creates and adds the {@apilink ElasticToActorStrategy} on the current camera\n * If cameraElasticity < cameraFriction < 1.0, the behavior will be a dampened spring that will slowly end at the target without bouncing\n * If cameraFriction < cameraElasticity < 1.0, the behavior will be an oscillating spring that will over\n * correct and bounce around the target\n * @param actor Target actor to elastically follow\n * @param cameraElasticity [0 - 1.0] The higher the elasticity the more force that will drive the camera towards the target\n * @param cameraFriction [0 - 1.0] The higher the friction the more that the camera will resist motion towards the target\n */\n elasticToActor(actor, cameraElasticity, cameraFriction) {\n this.camera.addStrategy(new ElasticToActorStrategy(actor, cameraElasticity, cameraFriction));\n }\n /**\n * Creates and adds the {@apilink RadiusAroundActorStrategy} on the current camera\n * @param actor Target actor to follow when it is \"radius\" pixels away\n * @param radius Number of pixels away before the camera will follow\n */\n radiusAroundActor(actor, radius) {\n this.camera.addStrategy(new RadiusAroundActorStrategy(actor, radius));\n }\n /**\n * Creates and adds the {@apilink LimitCameraBoundsStrategy} on the current camera\n * @param box The bounding box to limit the camera to.\n */\n limitCameraBounds(box) {\n this.camera.addStrategy(new LimitCameraBoundsStrategy(box));\n }\n}\n/**\n * Camera axis enum\n */\nvar Axis;\n(function (Axis) {\n Axis[Axis[\"X\"] = 0] = \"X\";\n Axis[Axis[\"Y\"] = 1] = \"Y\";\n})(Axis || (Axis = {}));\n/**\n * Lock a camera to the exact x/y position of an actor.\n */\nclass LockCameraToActorStrategy {\n constructor(target) {\n this.target = target;\n this.action = (target, camera, engine, elapsed) => {\n const center = target.center;\n return center;\n };\n }\n}\n/**\n * Lock a camera to a specific axis around an actor.\n */\nclass LockCameraToActorAxisStrategy {\n constructor(target, axis) {\n this.target = target;\n this.axis = axis;\n this.action = (target, cam, _eng, elapsed) => {\n const center = target.center;\n const currentFocus = cam.getFocus();\n if (this.axis === Axis.X) {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(center.x, currentFocus.y);\n }\n else {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(currentFocus.x, center.y);\n }\n };\n }\n}\n/**\n * Using [Hook's law](https://en.wikipedia.org/wiki/Hooke's_law), elastically move the camera towards the target actor.\n */\nclass ElasticToActorStrategy {\n /**\n * If cameraElasticity < cameraFriction < 1.0, the behavior will be a dampened spring that will slowly end at the target without bouncing\n * If cameraFriction < cameraElasticity < 1.0, the behavior will be an oscillating spring that will over\n * correct and bounce around the target\n * @param target Target actor to elastically follow\n * @param cameraElasticity [0 - 1.0] The higher the elasticity the more force that will drive the camera towards the target\n * @param cameraFriction [0 - 1.0] The higher the friction the more that the camera will resist motion towards the target\n */\n constructor(target, cameraElasticity, cameraFriction) {\n this.target = target;\n this.cameraElasticity = cameraElasticity;\n this.cameraFriction = cameraFriction;\n this.action = (target, cam, _eng, elapsed) => {\n const position = target.center;\n let focus = cam.getFocus();\n let cameraVel = cam.vel.clone();\n // Calculate the stretch vector, using the spring equation\n // F = kX\n // https://en.wikipedia.org/wiki/Hooke's_law\n // Apply to the current camera velocity\n const stretch = position.sub(focus).scale(this.cameraElasticity); // stretch is X\n cameraVel = cameraVel.add(stretch);\n // Calculate the friction (-1 to apply a force in the opposition of motion)\n // Apply to the current camera velocity\n const friction = cameraVel.scale(-1).scale(this.cameraFriction);\n cameraVel = cameraVel.add(friction);\n // Update position by velocity deltas\n focus = focus.add(cameraVel);\n return focus;\n };\n }\n}\nclass RadiusAroundActorStrategy {\n /**\n *\n * @param target Target actor to follow when it is \"radius\" pixels away\n * @param radius Number of pixels away before the camera will follow\n */\n constructor(target, radius) {\n this.target = target;\n this.radius = radius;\n this.action = (target, cam, _eng, elapsed) => {\n const position = target.center;\n const focus = cam.getFocus();\n const direction = position.sub(focus);\n const distance = direction.magnitude;\n if (distance >= this.radius) {\n const offset = distance - this.radius;\n return focus.add(direction.normalize().scale(offset));\n }\n return focus;\n };\n }\n}\n/**\n * Prevent a camera from going beyond the given camera dimensions.\n */\nclass LimitCameraBoundsStrategy {\n constructor(target) {\n this.target = target;\n /**\n * Useful for limiting the camera to a {@apilink TileMap}'s dimensions, or a specific area inside the map.\n *\n * Note that this strategy does not perform any movement by itself.\n * It only sets the camera position to within the given bounds when the camera has gone beyond them.\n * Thus, it is a good idea to combine it with other camera strategies and set this strategy as the last one.\n *\n * Make sure that the camera bounds are at least as large as the viewport size.\n * @param target The bounding box to limit the camera to\n */\n this.boundSizeChecked = false; // Check and warn only once\n this.action = (target, cam, _eng, elapsed) => {\n const focus = cam.getFocus();\n if (!this.boundSizeChecked) {\n if (target.bottom - target.top < _eng.drawHeight || target.right - target.left < _eng.drawWidth) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance().warn('Camera bounds should not be smaller than the engine viewport');\n }\n this.boundSizeChecked = true;\n }\n let focusX = focus.x;\n let focusY = focus.y;\n if (focus.x < target.left + _eng.halfDrawWidth) {\n focusX = target.left + _eng.halfDrawWidth;\n }\n else if (focus.x > target.right - _eng.halfDrawWidth) {\n focusX = target.right - _eng.halfDrawWidth;\n }\n if (focus.y < target.top + _eng.halfDrawHeight) {\n focusY = target.top + _eng.halfDrawHeight;\n }\n else if (focus.y > target.bottom - _eng.halfDrawHeight) {\n focusY = target.bottom - _eng.halfDrawHeight;\n }\n return (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(focusX, focusY);\n };\n }\n}\nconst CameraEvents = {\n Initialize: 'initialize',\n PreUpdate: 'preupdate',\n PostUpdate: 'postupdate'\n};\n/**\n * Cameras\n *\n * {@apilink Camera} is the base class for all Excalibur cameras. Cameras are used\n * to move around your game and set focus. They are used to determine\n * what is \"off screen\" and can be used to scale the game.\n *\n */\nclass Camera {\n constructor() {\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_2__.EventEmitter();\n this.transform = _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_3__.AffineMatrix.identity();\n this.inverse = _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_3__.AffineMatrix.identity();\n this._cameraStrategies = [];\n this.strategy = new StrategyContainer(this);\n /**\n * Get or set current zoom of the camera, defaults to 1\n */\n this._z = 1;\n /**\n * Get or set rate of change in zoom, defaults to 0\n */\n this.dz = 0;\n /**\n * Get or set zoom acceleration\n */\n this.az = 0;\n /**\n * Current rotation of the camera\n */\n this.rotation = 0;\n this._angularVelocity = 0;\n this._posChanged = false;\n this._pos = new _Math_watch_vector__WEBPACK_IMPORTED_MODULE_4__.WatchVector(_Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero, () => {\n this._posChanged = true;\n });\n /**\n * Interpolated camera position if more draws are running than updates\n *\n * Enabled when `Engine.fixedUpdateFps` is enabled, in all other cases this will be the same as pos\n */\n this.drawPos = this.pos.clone();\n this._oldPos = this.pos.clone();\n /**\n * Get or set the camera's velocity\n */\n this.vel = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero;\n /**\n * Get or set the camera's acceleration\n */\n this.acc = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero;\n this._cameraMoving = false;\n this._currentLerpTime = 0;\n this._lerpDuration = 1000; // 1 second\n this._lerpStart = null;\n this._lerpEnd = null;\n //camera effects\n this._isShaking = false;\n this._shakeMagnitudeX = 0;\n this._shakeMagnitudeY = 0;\n this._shakeDuration = 0;\n this._elapsedShakeTime = 0;\n this._xShake = 0;\n this._yShake = 0;\n this._isZooming = false;\n this._zoomStart = 1;\n this._zoomEnd = 1;\n this._currentZoomTime = 0;\n this._zoomDuration = 0;\n this._zoomEasing = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_5__.EasingFunctions.EaseInOutCubic;\n this._easing = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_5__.EasingFunctions.EaseInOutCubic;\n this._halfWidth = 0;\n this._halfHeight = 0;\n this._viewport = null;\n this._isInitialized = false;\n this._snapPos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n }\n get zoom() {\n return this._z;\n }\n set zoom(val) {\n this._z = val;\n if (this._engine) {\n this._halfWidth = this._engine.halfDrawWidth;\n this._halfHeight = this._engine.halfDrawHeight;\n }\n }\n /**\n * Get or set the camera's angular velocity\n */\n get angularVelocity() {\n return this._angularVelocity;\n }\n set angularVelocity(value) {\n this._angularVelocity = value;\n }\n /**\n * Get or set the camera's position\n */\n get pos() {\n return this._pos;\n }\n set pos(vec) {\n this._posChanged = true;\n this._pos = new _Math_watch_vector__WEBPACK_IMPORTED_MODULE_4__.WatchVector(vec, () => {\n this._posChanged = true;\n });\n }\n /**\n * Has the position changed since the last update\n */\n hasChanged() {\n return this._posChanged;\n }\n /**\n * Get the camera's x position\n */\n get x() {\n return this.pos.x;\n }\n /**\n * Set the camera's x position (cannot be set when following an {@apilink Actor} or when moving)\n */\n set x(value) {\n if (!this._follow && !this._cameraMoving) {\n this.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(value, this.pos.y);\n }\n }\n /**\n * Get the camera's y position\n */\n get y() {\n return this.pos.y;\n }\n /**\n * Set the camera's y position (cannot be set when following an {@apilink Actor} or when moving)\n */\n set y(value) {\n if (!this._follow && !this._cameraMoving) {\n this.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.pos.x, value);\n }\n }\n /**\n * Get or set the camera's x velocity\n */\n get dx() {\n return this.vel.x;\n }\n set dx(value) {\n this.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(value, this.vel.y);\n }\n /**\n * Get or set the camera's y velocity\n */\n get dy() {\n return this.vel.y;\n }\n set dy(value) {\n this.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.vel.x, value);\n }\n /**\n * Get or set the camera's x acceleration\n */\n get ax() {\n return this.acc.x;\n }\n set ax(value) {\n this.acc = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(value, this.acc.y);\n }\n /**\n * Get or set the camera's y acceleration\n */\n get ay() {\n return this.acc.y;\n }\n set ay(value) {\n this.acc = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.acc.x, value);\n }\n /**\n * Returns the focal point of the camera, a new point giving the x and y position of the camera\n */\n getFocus() {\n return this.pos;\n }\n /**\n * This moves the camera focal point to the specified position using specified easing function. Cannot move when following an Actor.\n * @param pos The target position to move to\n * @param duration The duration in milliseconds the move should last\n * @param [easingFn] An optional easing function ({@apilink EasingFunctions.EaseInOutCubic} by default)\n * @returns A {@apilink Promise} that resolves when movement is finished, including if it's interrupted.\n * The {@apilink Promise} value is the {@apilink Vector} of the target position. It will be rejected if a move cannot be made.\n */\n move(pos, duration, easingFn = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_5__.EasingFunctions.EaseInOutCubic) {\n if (typeof easingFn !== 'function') {\n throw 'Please specify an EasingFunction';\n }\n // cannot move when following an actor\n if (this._follow) {\n return Promise.reject(pos);\n }\n // resolve existing promise, if any\n if (this._lerpPromise && this._lerpResolve) {\n this._lerpResolve(pos);\n }\n this._lerpPromise = new Promise((resolve) => {\n this._lerpResolve = resolve;\n });\n this._lerpStart = this.getFocus().clone();\n this._lerpDuration = duration;\n this._lerpEnd = pos;\n this._currentLerpTime = 0;\n this._cameraMoving = true;\n this._easing = easingFn;\n return this._lerpPromise;\n }\n /**\n * Sets the camera to shake at the specified magnitudes for the specified duration\n * @param magnitudeX The x magnitude of the shake\n * @param magnitudeY The y magnitude of the shake\n * @param duration The duration of the shake in milliseconds\n */\n shake(magnitudeX, magnitudeY, duration) {\n this._isShaking = true;\n this._shakeMagnitudeX = magnitudeX;\n this._shakeMagnitudeY = magnitudeY;\n this._shakeDuration = duration;\n }\n /**\n * Zooms the camera in or out by the specified scale over the specified duration.\n * If no duration is specified, it take effect immediately.\n * @param scale The scale of the zoom\n * @param duration The duration of the zoom in milliseconds\n */\n zoomOverTime(scale, duration = 0, easingFn = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_5__.EasingFunctions.EaseInOutCubic) {\n this._zoomPromise = new Promise((resolve) => {\n this._zoomResolve = resolve;\n });\n if (duration) {\n this._isZooming = true;\n this._zoomEasing = easingFn;\n this._currentZoomTime = 0;\n this._zoomDuration = duration;\n this._zoomStart = this.zoom;\n this._zoomEnd = scale;\n }\n else {\n this._isZooming = false;\n this.zoom = scale;\n return Promise.resolve(true);\n }\n return this._zoomPromise;\n }\n /**\n * Gets the bounding box of the viewport of this camera in world coordinates\n */\n get viewport() {\n if (this._viewport) {\n return this._viewport;\n }\n return new _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox(0, 0, 0, 0);\n }\n /**\n * Adds a new camera strategy to this camera\n * @param cameraStrategy Instance of an {@apilink CameraStrategy}\n */\n addStrategy(cameraStrategy) {\n this._cameraStrategies.push(cameraStrategy);\n }\n /**\n * Removes a camera strategy by reference\n * @param cameraStrategy Instance of an {@apilink CameraStrategy}\n */\n removeStrategy(cameraStrategy) {\n (0,_Util_Util__WEBPACK_IMPORTED_MODULE_7__.removeItemFromArray)(cameraStrategy, this._cameraStrategies);\n }\n /**\n * Clears all camera strategies from the camera\n */\n clearAllStrategies() {\n this._cameraStrategies.length = 0;\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _preupdate handler for {@apilink onPreUpdate} lifecycle event\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n * @internal\n */\n _preupdate(engine, elapsed) {\n this.events.emit('preupdate', new _Events__WEBPACK_IMPORTED_MODULE_8__.PreUpdateEvent(engine, elapsed, this));\n this.onPreUpdate(engine, elapsed);\n }\n /**\n * Safe to override onPreUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPreUpdate` is called directly before a scene is updated.\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n */\n onPreUpdate(engine, elapsed) {\n // Overridable\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _preupdate handler for {@apilink onPostUpdate} lifecycle event\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n * @internal\n */\n _postupdate(engine, elapsed) {\n this.events.emit('postupdate', new _Events__WEBPACK_IMPORTED_MODULE_8__.PostUpdateEvent(engine, elapsed, this));\n this.onPostUpdate(engine, elapsed);\n }\n /**\n * Safe to override onPostUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPostUpdate` is called directly after a scene is updated.\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n */\n onPostUpdate(engine, elapsed) {\n // Overridable\n }\n get isInitialized() {\n return this._isInitialized;\n }\n _initialize(engine) {\n if (!this.isInitialized) {\n this._engine = engine;\n this._screen = engine.screen;\n const currentRes = this._screen.contentArea;\n let center = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(currentRes.width / 2, currentRes.height / 2);\n if (!this._engine.loadingComplete) {\n // If there was a loading screen, we peek the configured resolution\n const res = this._screen.peekResolution();\n if (res) {\n center = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(res.width / 2, res.height / 2);\n }\n }\n this._halfWidth = center.x;\n this._halfHeight = center.y;\n // If the user has not set the camera pos, apply default center screen position\n if (!this._posChanged) {\n this.pos = center;\n }\n this.pos.clone(this.drawPos);\n // First frame bootstrap\n // Ensure camera tx is correct\n // Run update twice to ensure properties are init'd\n this.updateTransform(this.pos);\n // Run strategies for first frame\n this.runStrategies(engine, engine.clock.elapsed());\n // Setup the first frame viewport\n this.updateViewport();\n // It's important to update the camera after strategies\n // This prevents jitter\n this.updateTransform(this.pos);\n this.pos.clone(this._oldPos);\n this.onInitialize(engine);\n this.events.emit('initialize', new _Events__WEBPACK_IMPORTED_MODULE_8__.InitializeEvent(engine, this));\n this._isInitialized = true;\n }\n }\n /**\n * Safe to override onPostUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPostUpdate` is called directly after a scene is updated.\n */\n onInitialize(engine) {\n // Overridable\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n runStrategies(engine, elapsed) {\n for (const s of this._cameraStrategies) {\n this.pos = s.action.call(s, s.target, this, engine, elapsed);\n }\n }\n updateViewport() {\n // recalculate viewport\n this._viewport = new _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox(this.x - this._halfWidth, this.y - this._halfHeight, this.x + this._halfWidth, this.y + this._halfHeight);\n }\n update(engine, elapsed) {\n this._initialize(engine);\n this._preupdate(engine, elapsed);\n this.pos.clone(this._oldPos);\n // Update placements based on linear algebra\n this.pos = this.pos.add(this.vel.scale(elapsed / 1000));\n this.zoom += (this.dz * elapsed) / 1000;\n this.vel = this.vel.add(this.acc.scale(elapsed / 1000));\n this.dz += (this.az * elapsed) / 1000;\n this.rotation += (this.angularVelocity * elapsed) / 1000;\n if (this._isZooming) {\n if (this._currentZoomTime < this._zoomDuration) {\n const zoomEasing = this._zoomEasing;\n const newZoom = zoomEasing(this._currentZoomTime, this._zoomStart, this._zoomEnd, this._zoomDuration);\n this.zoom = newZoom;\n this._currentZoomTime += elapsed;\n }\n else {\n this._isZooming = false;\n this.zoom = this._zoomEnd;\n this._currentZoomTime = 0;\n this._zoomResolve(true);\n }\n }\n if (this._cameraMoving) {\n if (this._currentLerpTime < this._lerpDuration) {\n const moveEasing = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_5__.EasingFunctions.CreateVectorEasingFunction(this._easing);\n const lerpPoint = moveEasing(this._currentLerpTime, this._lerpStart, this._lerpEnd, this._lerpDuration);\n this.pos = lerpPoint;\n this._currentLerpTime += elapsed;\n }\n else {\n this.pos = this._lerpEnd;\n const end = this._lerpEnd.clone();\n this._lerpStart = null;\n this._lerpEnd = null;\n this._currentLerpTime = 0;\n this._cameraMoving = false;\n // Order matters here, resolve should be last so any chain promises have a clean slate\n this._lerpResolve(end);\n }\n }\n if (this._isDoneShaking()) {\n this._isShaking = false;\n this._elapsedShakeTime = 0;\n this._shakeMagnitudeX = 0;\n this._shakeMagnitudeY = 0;\n this._shakeDuration = 0;\n this._xShake = 0;\n this._yShake = 0;\n }\n else {\n this._elapsedShakeTime += elapsed;\n this._xShake = ((Math.random() * this._shakeMagnitudeX) | 0) + 1;\n this._yShake = ((Math.random() * this._shakeMagnitudeY) | 0) + 1;\n }\n this.runStrategies(engine, elapsed);\n this.updateViewport();\n // It's important to update the camera after strategies\n // This prevents jitter\n this.updateTransform(this.pos);\n this._postupdate(engine, elapsed);\n this._posChanged = false;\n }\n /**\n * Applies the relevant transformations to the game canvas to \"move\" or apply effects to the Camera\n * @param ctx Canvas context to apply transformations\n */\n draw(ctx) {\n // default to the current position\n this.pos.clone(this.drawPos);\n // interpolation if fixed update is on\n // must happen on the draw, because more draws are potentially happening than updates\n if (this._engine.fixedUpdateTimestep) {\n const blend = this._engine.currentFrameLagMs / this._engine.fixedUpdateTimestep;\n const interpolatedPos = this.pos.scale(blend).add(this._oldPos.scale(1.0 - blend));\n interpolatedPos.clone(this.drawPos);\n this.updateTransform(interpolatedPos);\n }\n // Snap camera to pixel\n if (ctx.snapToPixel) {\n const snapPos = this.drawPos.clone(this._snapPos);\n snapPos.x = ~~(snapPos.x + _Graphics__WEBPACK_IMPORTED_MODULE_9__.pixelSnapEpsilon * (0,_Math_util__WEBPACK_IMPORTED_MODULE_10__.sign)(snapPos.x));\n snapPos.y = ~~(snapPos.y + _Graphics__WEBPACK_IMPORTED_MODULE_9__.pixelSnapEpsilon * (0,_Math_util__WEBPACK_IMPORTED_MODULE_10__.sign)(snapPos.y));\n snapPos.clone(this.drawPos);\n this.updateTransform(snapPos);\n }\n ctx.multiply(this.transform);\n }\n updateTransform(pos) {\n // center the camera\n const newCanvasWidth = this._screen.resolution.width / this.zoom;\n const newCanvasHeight = this._screen.resolution.height / this.zoom;\n const cameraPos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(-pos.x + newCanvasWidth / 2 + this._xShake, -pos.y + newCanvasHeight / 2 + this._yShake);\n // Calculate camera transform\n this.transform.reset();\n this.transform.scale(this.zoom, this.zoom);\n // rotate about the focus\n this.transform.translate(newCanvasWidth / 2, newCanvasHeight / 2);\n this.transform.rotate(this.rotation);\n this.transform.translate(-newCanvasWidth / 2, -newCanvasHeight / 2);\n this.transform.translate(cameraPos.x, cameraPos.y);\n this.transform.inverse(this.inverse);\n }\n _isDoneShaking() {\n return !this._isShaking || this._elapsedShakeTime >= this._shakeDuration;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/BodyComponent.ts\":\n/*!************************************!*\\\n !*** ./Collision/BodyComponent.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BodyComponent: () => (/* binding */ BodyComponent),\n/* harmony export */ DegreeOfFreedom: () => (/* binding */ DegreeOfFreedom)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Component */ \"./EntityComponentSystem/Component.ts\");\n/* harmony import */ var _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Group/CollisionGroup */ \"./Collision/Group/CollisionGroup.ts\");\n/* harmony import */ var _Id__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Id */ \"./Id.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _ColliderComponent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./ColliderComponent */ \"./Collision/ColliderComponent.ts\");\n/* harmony import */ var _Math_transform__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Math/transform */ \"./Math/transform.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _PhysicsConfig__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./PhysicsConfig */ \"./Collision/PhysicsConfig.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\nvar DegreeOfFreedom;\n(function (DegreeOfFreedom) {\n DegreeOfFreedom[\"Rotation\"] = \"rotation\";\n DegreeOfFreedom[\"X\"] = \"x\";\n DegreeOfFreedom[\"Y\"] = \"y\";\n})(DegreeOfFreedom || (DegreeOfFreedom = {}));\n/**\n * Body describes all the physical properties pos, vel, acc, rotation, angular velocity for the purpose of\n * of physics simulation.\n */\nclass BodyComponent extends _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor(options) {\n var _a, _b, _c;\n super();\n this.dependencies = [_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent, _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent];\n this.id = (0,_Id__WEBPACK_IMPORTED_MODULE_3__.createId)('body', BodyComponent._ID++);\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_4__.EventEmitter();\n this.oldTransform = new _Math_transform__WEBPACK_IMPORTED_MODULE_5__.Transform();\n /**\n * Indicates whether the old transform has been captured at least once for interpolation\n * @internal\n */\n this.__oldTransformCaptured = false;\n /**\n * Enable or disabled the fixed update interpolation, by default interpolation is on.\n */\n this.enableFixedUpdateInterpolate = true;\n /**\n * Collision type for the rigidbody physics simulation, by default {@apilink CollisionType.PreventCollision}\n */\n this.collisionType = _CollisionType__WEBPACK_IMPORTED_MODULE_6__.CollisionType.PreventCollision;\n /**\n * The collision group for the body's colliders, by default body colliders collide with everything\n */\n this.group = _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_7__.CollisionGroup.All;\n this._sleeping = false;\n /**\n * The also known as coefficient of restitution of this actor, represents the amount of energy preserved after collision or the\n * bounciness. If 1, it is 100% bouncy, 0 it completely absorbs.\n */\n this.bounciness = 0.2;\n /**\n * The coefficient of friction on this actor.\n *\n * The {@apilink SolverStrategy.Arcade} does not support this property.\n *\n */\n this.friction = 0.99;\n /**\n * Should use global gravity {@apilink Physics.gravity} in it's physics simulation, default is true\n */\n this.useGravity = true;\n /**\n * Degrees of freedom to limit\n *\n * Note: this only limits responses in the realistic solver, if velocity/angularVelocity is set the actor will still respond\n */\n this.limitDegreeOfFreedom = [];\n this._oldGlobalPos = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Zero;\n /**\n * The velocity of the actor last frame (vx, vy) in pixels/second\n */\n this.oldVel = new _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector(0, 0);\n /**\n * Gets/sets the acceleration of the actor from the last frame. This does not include the global acc {@apilink Physics.acc}.\n */\n this.oldAcc = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Zero;\n this._impulseScratch = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_8__.vec)(0, 0);\n this._distanceFromCenterScratch = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_8__.vec)(0, 0);\n if (options) {\n this.collisionType = (_a = options.type) !== null && _a !== void 0 ? _a : this.collisionType;\n this.group = (_b = options.group) !== null && _b !== void 0 ? _b : this.group;\n this.useGravity = (_c = options.useGravity) !== null && _c !== void 0 ? _c : this.useGravity;\n this._bodyConfig = {\n ...(0,_PhysicsConfig__WEBPACK_IMPORTED_MODULE_9__.getDefaultPhysicsConfig)().bodies,\n ...options.config\n };\n }\n else {\n this._bodyConfig = {\n ...(0,_PhysicsConfig__WEBPACK_IMPORTED_MODULE_9__.getDefaultPhysicsConfig)().bodies\n };\n }\n this.updatePhysicsConfig(this._bodyConfig);\n this._mass = BodyComponent._DEFAULT_CONFIG.defaultMass;\n }\n get matrix() {\n return this.transform.get().matrix;\n }\n /**\n * Called by excalibur to update physics config defaults if they change\n * @param config\n */\n updatePhysicsConfig(config) {\n this._bodyConfig = {\n ...(0,_PhysicsConfig__WEBPACK_IMPORTED_MODULE_9__.getDefaultPhysicsConfig)().bodies,\n ...config\n };\n this.canSleep = this._bodyConfig.canSleepByDefault;\n this.sleepMotion = this._bodyConfig.sleepEpsilon * 5;\n this.wakeThreshold = this._bodyConfig.wakeThreshold;\n }\n /**\n * Called by excalibur to update defaults\n * @param config\n */\n static updateDefaultPhysicsConfig(config) {\n BodyComponent._DEFAULT_CONFIG = config;\n }\n get mass() {\n return this._mass;\n }\n set mass(newMass) {\n this._mass = newMass;\n this._cachedInertia = undefined;\n this._cachedInverseInertia = undefined;\n }\n /**\n * The inverse mass (1/mass) of the body. If {@apilink CollisionType.Fixed} this is 0, meaning \"infinite\" mass\n */\n get inverseMass() {\n return this.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_6__.CollisionType.Fixed ? 0 : 1 / this.mass;\n }\n /**\n * Whether this body is sleeping or not\n * @deprecated use isSleeping\n */\n get sleeping() {\n return this.isSleeping;\n }\n /**\n * Whether this body is sleeping or not\n */\n get isSleeping() {\n return this._sleeping;\n }\n /**\n * Set the sleep state of the body\n * @param sleeping\n * @deprecated use isSleeping\n */\n setSleeping(sleeping) {\n this.isSleeping = sleeping;\n }\n set isSleeping(sleeping) {\n this._sleeping = sleeping;\n if (!sleeping) {\n // Give it a kick to keep it from falling asleep immediately\n this.sleepMotion = this._bodyConfig.sleepEpsilon * 5;\n }\n else {\n this.vel = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Zero;\n this.acc = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Zero;\n this.angularVelocity = 0;\n this.sleepMotion = 0;\n }\n }\n /**\n * Update body's {@apilink BodyComponent.sleepMotion} for the purpose of sleeping\n */\n updateMotion() {\n if (this._sleeping) {\n this.isSleeping = true;\n }\n const currentMotion = this.vel.magnitude * this.vel.magnitude + Math.abs(this.angularVelocity * this.angularVelocity);\n const bias = this._bodyConfig.sleepBias;\n this.sleepMotion = bias * this.sleepMotion + (1 - bias) * currentMotion;\n this.sleepMotion = (0,_Math_util__WEBPACK_IMPORTED_MODULE_10__.clamp)(this.sleepMotion, 0, 10 * this._bodyConfig.sleepEpsilon);\n if (this.canSleep && this.sleepMotion < this._bodyConfig.sleepEpsilon) {\n this.isSleeping = true;\n }\n }\n /**\n * Get the moment of inertia from the {@apilink ColliderComponent}\n */\n get inertia() {\n if (this._cachedInertia) {\n return this._cachedInertia;\n }\n // Inertia is a property of the geometry, so this is a little goofy but seems to be okay?\n const collider = this.owner.get(_ColliderComponent__WEBPACK_IMPORTED_MODULE_11__.ColliderComponent);\n if (collider) {\n collider.$colliderAdded.subscribe(() => {\n this._cachedInertia = null;\n });\n collider.$colliderRemoved.subscribe(() => {\n this._cachedInertia = null;\n });\n const maybeCollider = collider.get();\n if (maybeCollider) {\n return (this._cachedInertia = maybeCollider.getInertia(this.mass));\n }\n }\n return 0;\n }\n /**\n * Get the inverse moment of inertial from the {@apilink ColliderComponent}. If {@apilink CollisionType.Fixed} this is 0, meaning \"infinite\" mass\n */\n get inverseInertia() {\n if (this._cachedInverseInertia) {\n return this._cachedInverseInertia;\n }\n return (this._cachedInverseInertia = this.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_6__.CollisionType.Fixed ? 0 : 1 / this.inertia);\n }\n /**\n * Returns if the owner is active\n * @deprecated use isActive\n */\n get active() {\n var _a;\n return !!((_a = this.owner) === null || _a === void 0 ? void 0 : _a.isActive);\n }\n /**\n * Returns if the owner is active\n */\n get isActive() {\n var _a;\n return !!((_a = this.owner) === null || _a === void 0 ? void 0 : _a.isActive);\n }\n /**\n * @deprecated Use globalPos\n */\n get center() {\n return this.globalPos;\n }\n onAdd(owner) {\n var _a, _b;\n this.transform = (_a = this.owner) === null || _a === void 0 ? void 0 : _a.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this.motion = (_b = this.owner) === null || _b === void 0 ? void 0 : _b.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n }\n get pos() {\n return this.transform.pos;\n }\n set pos(val) {\n this.transform.pos = val;\n }\n /**\n * The (x, y) position of the actor this will be in the middle of the actor if the\n * {@apilink Actor.anchor} is set to (0.5, 0.5) which is default.\n * If you want the (x, y) position to be the top left of the actor specify an anchor of (0, 0).\n */\n get globalPos() {\n return this.transform.globalPos;\n }\n set globalPos(val) {\n this.transform.globalPos = val;\n }\n /**\n * The position of the actor last frame (x, y) in pixels\n */\n get oldPos() {\n return this.oldTransform.pos;\n }\n /**\n * The global position of the actor last frame (x, y) in pixels\n */\n get oldGlobalPos() {\n return this._oldGlobalPos;\n }\n /**\n * The current velocity vector (vx, vy) of the actor in pixels/second\n */\n get vel() {\n return this.motion.vel;\n }\n set vel(val) {\n this.motion.vel = val;\n }\n /**\n * The current acceleration vector (ax, ay) of the actor in pixels/second/second. An acceleration pointing down such as (0, 100) may\n * be useful to simulate a gravitational effect.\n */\n get acc() {\n return this.motion.acc;\n }\n set acc(val) {\n this.motion.acc = val;\n }\n /**\n * The current torque applied to the actor\n */\n get torque() {\n return this.motion.torque;\n }\n set torque(val) {\n this.motion.torque = val;\n }\n /**\n * Gets/sets the rotation of the body from the last frame.\n */\n get oldRotation() {\n return this.oldTransform.rotation;\n }\n /**\n * The rotation of the body in radians\n */\n get rotation() {\n return this.transform.globalRotation;\n }\n set rotation(val) {\n this.transform.globalRotation = val;\n }\n /**\n * The scale vector of the actor\n */\n get scale() {\n return this.transform.globalScale;\n }\n set scale(val) {\n this.transform.globalScale = val;\n }\n /**\n * The scale of the actor last frame\n */\n get oldScale() {\n return this.oldTransform.scale;\n }\n /**\n * The scale rate of change of the actor in scale/second\n */\n get scaleFactor() {\n return this.motion.scaleFactor;\n }\n set scaleFactor(scaleFactor) {\n this.motion.scaleFactor = scaleFactor;\n }\n /**\n * Get the angular velocity in radians/second\n */\n get angularVelocity() {\n return this.motion.angularVelocity;\n }\n /**\n * Set the angular velocity in radians/second\n */\n set angularVelocity(value) {\n this.motion.angularVelocity = value;\n }\n /**\n * Apply a specific impulse to the body\n * @param point\n * @param impulse\n */\n applyImpulse(point, impulse) {\n if (this.collisionType !== _CollisionType__WEBPACK_IMPORTED_MODULE_6__.CollisionType.Active) {\n return; // only active objects participate in the simulation\n }\n const finalImpulse = impulse.scale(this.inverseMass, this._impulseScratch);\n if (this.limitDegreeOfFreedom.indexOf(DegreeOfFreedom.X) > -1) {\n finalImpulse.x = 0;\n }\n if (this.limitDegreeOfFreedom.indexOf(DegreeOfFreedom.Y) > -1) {\n finalImpulse.y = 0;\n }\n this.vel.addEqual(finalImpulse);\n if (!this.limitDegreeOfFreedom.includes(DegreeOfFreedom.Rotation)) {\n const distanceFromCenter = point.sub(this.globalPos, this._distanceFromCenterScratch);\n this.angularVelocity += this.inverseInertia * distanceFromCenter.cross(impulse);\n }\n }\n /**\n * Apply only linear impulse to the body\n * @param impulse\n */\n applyLinearImpulse(impulse) {\n if (this.collisionType !== _CollisionType__WEBPACK_IMPORTED_MODULE_6__.CollisionType.Active) {\n return; // only active objects participate in the simulation\n }\n const finalImpulse = impulse.scale(this.inverseMass);\n if (this.limitDegreeOfFreedom.includes(DegreeOfFreedom.X)) {\n finalImpulse.x = 0;\n }\n if (this.limitDegreeOfFreedom.includes(DegreeOfFreedom.Y)) {\n finalImpulse.y = 0;\n }\n this.vel = this.vel.add(finalImpulse);\n }\n /**\n * Apply only angular impulse to the body\n * @param point\n * @param impulse\n */\n applyAngularImpulse(point, impulse) {\n if (this.collisionType !== _CollisionType__WEBPACK_IMPORTED_MODULE_6__.CollisionType.Active) {\n return; // only active objects participate in the simulation\n }\n if (!this.limitDegreeOfFreedom.includes(DegreeOfFreedom.Rotation)) {\n const distanceFromCenter = point.sub(this.globalPos);\n this.angularVelocity += this.inverseInertia * distanceFromCenter.cross(impulse);\n }\n }\n /**\n * Sets the old versions of pos, vel, acc, and scale.\n */\n captureOldTransform() {\n // Capture old values before integration step updates them\n this.__oldTransformCaptured = true;\n const tx = this.transform.get();\n tx.clone(this.oldTransform);\n this.oldTransform.parent = tx.parent; // also grab parent\n this.oldVel.setTo(this.vel.x, this.vel.y);\n this.oldAcc.setTo(this.acc.x, this.acc.y);\n this.oldGlobalPos.setTo(this.globalPos.x, this.globalPos.y);\n }\n clone() {\n const component = super.clone();\n return component;\n }\n}\nBodyComponent._ID = 0;\nBodyComponent._DEFAULT_CONFIG = {\n ...(0,_PhysicsConfig__WEBPACK_IMPORTED_MODULE_9__.getDefaultPhysicsConfig)().bodies\n};\n\n\n/***/ }),\n\n/***/ \"./Collision/BoundingBox.ts\":\n/*!**********************************!*\\\n !*** ./Collision/BoundingBox.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BoundingBox: () => (/* binding */ BoundingBox)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Side__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Side */ \"./Collision/Side.ts\");\n\n\n\n/**\n * Axis Aligned collision primitive for Excalibur.\n */\nclass BoundingBox {\n /**\n * Constructor allows passing of either an object with all coordinate components,\n * or the coordinate components passed separately.\n * @param leftOrOptions Either x coordinate of the left edge or an options object\n * containing the four coordinate components.\n * @param top y coordinate of the top edge\n * @param right x coordinate of the right edge\n * @param bottom y coordinate of the bottom edge\n */\n constructor(leftOrOptions = 0, top = 0, right = 0, bottom = 0) {\n // Cache bounding box point returns\n this._points = [];\n if (typeof leftOrOptions === 'object') {\n this.left = leftOrOptions.left;\n this.top = leftOrOptions.top;\n this.right = leftOrOptions.right;\n this.bottom = leftOrOptions.bottom;\n }\n else if (typeof leftOrOptions === 'number') {\n this.left = leftOrOptions;\n this.top = top;\n this.right = right;\n this.bottom = bottom;\n }\n }\n /**\n * Returns a new instance of {@apilink BoundingBox} that is a copy of the current instance\n */\n clone(dest) {\n const result = dest || new BoundingBox(0, 0, 0, 0);\n result.left = this.left;\n result.right = this.right;\n result.top = this.top;\n result.bottom = this.bottom;\n return result;\n }\n /**\n * Resets the bounds to a zero width/height box\n */\n reset() {\n this.left = 0;\n this.top = 0;\n this.bottom = 0;\n this.right = 0;\n }\n /**\n * Given bounding box A & B, returns the side relative to A when intersection is performed.\n * @param intersection Intersection vector between 2 bounding boxes\n */\n static getSideFromIntersection(intersection) {\n if (!intersection) {\n return _Side__WEBPACK_IMPORTED_MODULE_0__.Side.None;\n }\n if (intersection) {\n if (Math.abs(intersection.x) > Math.abs(intersection.y)) {\n if (intersection.x < 0) {\n return _Side__WEBPACK_IMPORTED_MODULE_0__.Side.Right;\n }\n return _Side__WEBPACK_IMPORTED_MODULE_0__.Side.Left;\n }\n else {\n if (intersection.y < 0) {\n return _Side__WEBPACK_IMPORTED_MODULE_0__.Side.Bottom;\n }\n return _Side__WEBPACK_IMPORTED_MODULE_0__.Side.Top;\n }\n }\n return _Side__WEBPACK_IMPORTED_MODULE_0__.Side.None;\n }\n static fromPoints(points) {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (let i = 0; i < points.length; i++) {\n if (points[i].x < minX) {\n minX = points[i].x;\n }\n if (points[i].x > maxX) {\n maxX = points[i].x;\n }\n if (points[i].y < minY) {\n minY = points[i].y;\n }\n if (points[i].y > maxY) {\n maxY = points[i].y;\n }\n }\n return new BoundingBox(minX, minY, maxX, maxY);\n }\n /**\n * Creates a bounding box from a width and height\n * @param width\n * @param height\n * @param anchor Default Vector.Half\n * @param pos Default Vector.Zero\n */\n static fromDimension(width, height, anchor = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Half, pos = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero) {\n return new BoundingBox(-width * anchor.x + pos.x, -height * anchor.y + pos.y, width - width * anchor.x + pos.x, height - height * anchor.y + pos.y);\n }\n /**\n * Returns the calculated width of the bounding box\n */\n get width() {\n return this.right - this.left;\n }\n /**\n * Returns the calculated height of the bounding box\n */\n get height() {\n return this.bottom - this.top;\n }\n /**\n * Return whether the bounding box has zero dimensions in height,width or both\n */\n hasZeroDimensions() {\n return this.width === 0 || this.height === 0;\n }\n /**\n * Returns the center of the bounding box\n */\n get center() {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector((this.left + this.right) / 2, (this.top + this.bottom) / 2);\n }\n get topLeft() {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.left, this.top);\n }\n get bottomRight() {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.right, this.bottom);\n }\n get topRight() {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.right, this.top);\n }\n get bottomLeft() {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.left, this.bottom);\n }\n translate(pos) {\n return new BoundingBox(this.left + pos.x, this.top + pos.y, this.right + pos.x, this.bottom + pos.y);\n }\n /**\n * Rotates a bounding box by and angle and around a point, if no point is specified (0, 0) is used by default. The resulting bounding\n * box is also axis-align. This is useful when a new axis-aligned bounding box is needed for rotated geometry.\n */\n rotate(angle, point = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero) {\n const points = this.getPoints().map((p) => p.rotate(angle, point));\n return BoundingBox.fromPoints(points);\n }\n /**\n * Scale a bounding box by a scale factor, optionally provide a point\n * @param scale\n * @param point\n */\n scale(scale, point = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero) {\n const shifted = this.translate(point);\n return new BoundingBox(shifted.left * scale.x, shifted.top * scale.y, shifted.right * scale.x, shifted.bottom * scale.y);\n }\n /**\n * Transform the axis aligned bounding box by a {@apilink Matrix}, producing a new axis aligned bounding box\n * @param matrix\n */\n transform(matrix) {\n // inlined these calculations to not use vectors would speed it up slightly\n // const matFirstColumn = vec(matrix.data[0], matrix.data[1]);\n // const xa = matFirstColumn.scale(this.left);\n const xa1 = matrix.data[0] * this.left;\n const xa2 = matrix.data[1] * this.left;\n // const xb = matFirstColumn.scale(this.right);\n const xb1 = matrix.data[0] * this.right;\n const xb2 = matrix.data[1] * this.right;\n // const matSecondColumn = vec(matrix.data[2], matrix.data[3]);\n // const ya = matSecondColumn.scale(this.top);\n const ya1 = matrix.data[2] * this.top;\n const ya2 = matrix.data[3] * this.top;\n // const yb = matSecondColumn.scale(this.bottom);\n const yb1 = matrix.data[2] * this.bottom;\n const yb2 = matrix.data[3] * this.bottom;\n const matrixPos = matrix.getPosition();\n // const topLeft = Vector.min(xa, xb).add(Vector.min(ya, yb)).add(matrixPos);\n // const bottomRight = Vector.max(xa, xb).add(Vector.max(ya, yb)).add(matrixPos);\n const left = Math.min(xa1, xb1) + Math.min(ya1, yb1) + matrixPos.x;\n const top = Math.min(xa2, xb2) + Math.min(ya2, yb2) + matrixPos.y;\n const right = Math.max(xa1, xb1) + Math.max(ya1, yb1) + matrixPos.x;\n const bottom = Math.max(xa2, xb2) + Math.max(ya2, yb2) + matrixPos.y;\n return new BoundingBox({\n left, //: topLeft.x,\n top, //: topLeft.y,\n right, //: bottomRight.x,\n bottom //: bottomRight.y\n });\n }\n /**\n * Returns the perimeter of the bounding box\n */\n getPerimeter() {\n const wx = this.width;\n const wy = this.height;\n return 2 * (wx + wy);\n }\n /**\n * Returns the world space points that make up the corners of the bounding box as a polygon\n */\n getPoints() {\n if (this._left !== this.left || this._right !== this.right || this._top !== this.top || this._bottom !== this.bottom) {\n this._points.length = 0;\n this._points.push(new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.left, this.top));\n this._points.push(new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.right, this.top));\n this._points.push(new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.right, this.bottom));\n this._points.push(new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.left, this.bottom));\n this._left = this.left;\n this._right = this.right;\n this._top = this.top;\n this._bottom = this.bottom;\n }\n return this._points;\n }\n /**\n * Determines whether a ray intersects with a bounding box\n */\n rayCast(ray, farClipDistance = Infinity) {\n // algorithm from https://tavianator.com/fast-branchless-raybounding-box-intersections/\n let tMin = -Infinity;\n let tMax = +Infinity;\n const xInv = ray.dir.x === 0 ? Number.MAX_VALUE : 1 / ray.dir.x;\n const yInv = ray.dir.y === 0 ? Number.MAX_VALUE : 1 / ray.dir.y;\n const tx1 = (this.left - ray.pos.x) * xInv;\n const tx2 = (this.right - ray.pos.x) * xInv;\n tMin = Math.min(tx1, tx2);\n tMax = Math.max(tx1, tx2);\n const ty1 = (this.top - ray.pos.y) * yInv;\n const ty2 = (this.bottom - ray.pos.y) * yInv;\n tMin = Math.max(tMin, Math.min(ty1, ty2));\n tMax = Math.min(tMax, Math.max(ty1, ty2));\n return tMax >= Math.max(0, tMin) && tMin < farClipDistance;\n }\n rayCastTime(ray, farClipDistance = Infinity) {\n // algorithm from https://tavianator.com/fast-branchless-raybounding-box-intersections/\n let tMin = -Infinity;\n let tMax = +Infinity;\n const xInv = ray.dir.x === 0 ? Number.MAX_VALUE : 1 / ray.dir.x;\n const yInv = ray.dir.y === 0 ? Number.MAX_VALUE : 1 / ray.dir.y;\n const tx1 = (this.left - ray.pos.x) * xInv;\n const tx2 = (this.right - ray.pos.x) * xInv;\n tMin = Math.min(tx1, tx2);\n tMax = Math.max(tx1, tx2);\n const ty1 = (this.top - ray.pos.y) * yInv;\n const ty2 = (this.bottom - ray.pos.y) * yInv;\n tMin = Math.max(tMin, Math.min(ty1, ty2));\n tMax = Math.min(tMax, Math.max(ty1, ty2));\n if (tMax >= Math.max(0, tMin) && tMin < farClipDistance) {\n return tMin;\n }\n return -1;\n }\n contains(val) {\n if (val instanceof _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector) {\n return this.left <= val.x && this.top <= val.y && val.y <= this.bottom && val.x <= this.right;\n }\n else if (val instanceof BoundingBox) {\n return this.left <= val.left && this.top <= val.top && val.bottom <= this.bottom && val.right <= this.right;\n }\n return false;\n }\n /**\n * Combines this bounding box and another together returning a new bounding box\n * @param other The bounding box to combine\n */\n combine(other, dest) {\n const compositeBB = dest || new BoundingBox(0, 0, 0, 0);\n const left = Math.min(this.left, other.left);\n const top = Math.min(this.top, other.top);\n const right = Math.max(this.right, other.right);\n const bottom = Math.max(this.bottom, other.bottom);\n compositeBB.left = left;\n compositeBB.top = top;\n compositeBB.right = right;\n compositeBB.bottom = bottom;\n return compositeBB;\n }\n get dimensions() {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.width, this.height);\n }\n /**\n * Returns true if the bounding boxes overlap.\n * @param other\n * @param epsilon Optionally specify a small epsilon (default 0) as amount of overlap to ignore as overlap.\n * This epsilon is useful in stable collision simulations.\n */\n overlaps(other, epsilon) {\n const e = epsilon || 0;\n if (other.hasZeroDimensions()) {\n return this.contains(other);\n }\n if (this.hasZeroDimensions()) {\n return other.contains(this);\n }\n const totalBoundingBox = this.combine(other);\n return totalBoundingBox.width + e < other.width + this.width && totalBoundingBox.height + e < other.height + this.height;\n }\n /**\n * Test wether this bounding box intersects with another returning\n * the intersection vector that can be used to resolve the collision. If there\n * is no intersection null is returned.\n * @param other Other {@apilink BoundingBox} to test intersection with\n * @returns A Vector in the direction of the current BoundingBox, this <- other\n */\n intersect(other) {\n const totalBoundingBox = this.combine(other);\n // If the total bounding box is less than or equal the sum of the 2 bounds then there is collision\n if (totalBoundingBox.width < other.width + this.width &&\n totalBoundingBox.height < other.height + this.height &&\n !totalBoundingBox.dimensions.equals(other.dimensions) &&\n !totalBoundingBox.dimensions.equals(this.dimensions)) {\n // collision\n let overlapX = 0;\n // right edge is between the other's left and right edge\n /**\n * +-this-+\n * | |\n * | +-other-+\n * +----|-+ |\n * | |\n * +-------+\n * <---\n * ^ overlap\n */\n if (this.right >= other.left && this.right <= other.right) {\n overlapX = other.left - this.right;\n // right edge is past the other's right edge\n /**\n * +-other-+\n * | |\n * | +-this-+\n * +----|--+ |\n * | |\n * +------+\n * --->\n * ^ overlap\n */\n }\n else {\n overlapX = other.right - this.left;\n }\n let overlapY = 0;\n // top edge is between the other's top and bottom edge\n /**\n * +-other-+\n * | |\n * | +-this-+ | <- overlap\n * +----|--+ | |\n * | | \\ /\n * +------+ '\n */\n if (this.top <= other.bottom && this.top >= other.top) {\n overlapY = other.bottom - this.top;\n // top edge is above the other top edge\n /**\n * +-this-+ .\n * | | / \\\n * | +-other-+ | <- overlap\n * +----|-+ | |\n * | |\n * +-------+\n */\n }\n else {\n overlapY = other.top - this.bottom;\n }\n if (Math.abs(overlapX) < Math.abs(overlapY)) {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(overlapX, 0);\n }\n else {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(0, overlapY);\n }\n // Case of total containment of one bounding box by another\n }\n else if (totalBoundingBox.dimensions.equals(other.dimensions) || totalBoundingBox.dimensions.equals(this.dimensions)) {\n let overlapX = 0;\n // this is wider than the other\n if (this.width - other.width >= 0) {\n // This right edge is closest to the others right edge\n if (this.right - other.right <= other.left - this.left) {\n overlapX = other.left - this.right;\n // This left edge is closest to the others left edge\n }\n else {\n overlapX = other.right - this.left;\n }\n // other is wider than this\n }\n else {\n // This right edge is closest to the others right edge\n if (other.right - this.right <= this.left - other.left) {\n overlapX = this.left - other.right;\n // This left edge is closest to the others left edge\n }\n else {\n overlapX = this.right - other.left;\n }\n }\n let overlapY = 0;\n // this is taller than other\n if (this.height - other.height >= 0) {\n // The bottom edge is closest to the others bottom edge\n if (this.bottom - other.bottom <= other.top - this.top) {\n overlapY = other.top - this.bottom;\n }\n else {\n overlapY = other.bottom - this.top;\n }\n // other is taller than this\n }\n else {\n // The bottom edge is closest to the others bottom edge\n if (other.bottom - this.bottom <= this.top - other.top) {\n overlapY = this.top - other.bottom;\n }\n else {\n overlapY = this.bottom - other.top;\n }\n }\n if (Math.abs(overlapX) < Math.abs(overlapY)) {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(overlapX, 0);\n }\n else {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(0, overlapY);\n }\n }\n else {\n return null;\n }\n }\n /**\n * Test whether the bounding box has intersected with another bounding box, returns the side of the current bb that intersected.\n * @param bb The other actor to test\n */\n intersectWithSide(bb) {\n const intersect = this.intersect(bb);\n return BoundingBox.getSideFromIntersection(intersect);\n }\n /**\n * Draw a debug bounding box\n * @param ex\n * @param color\n */\n draw(ex, color = _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Yellow) {\n ex.debug.drawRect(this.left, this.top, this.width, this.height, { color });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/ColliderComponent.ts\":\n/*!****************************************!*\\\n !*** ./Collision/ColliderComponent.ts ***!\n \\****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ColliderComponent: () => (/* binding */ ColliderComponent)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Component */ \"./EntityComponentSystem/Component.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _Util_Observable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Util/Observable */ \"./Util/Observable.ts\");\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Colliders/CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var _Colliders_Shape__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Colliders/Shape */ \"./Collision/Colliders/Shape.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Actor__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Actor */ \"./Actor.ts\");\n\n\n\n\n\n\n\n\n\n\nclass ColliderComponent extends _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor(collider) {\n super();\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_1__.EventEmitter();\n /**\n * Observable that notifies when a collider is added to the body\n */\n this.$colliderAdded = new _Util_Observable__WEBPACK_IMPORTED_MODULE_2__.Observable();\n /**\n * Observable that notifies when a collider is removed from the body\n */\n this.$colliderRemoved = new _Util_Observable__WEBPACK_IMPORTED_MODULE_2__.Observable();\n this._collidersToRemove = [];\n this.set(collider);\n }\n /**\n * Get the current collider geometry\n */\n get() {\n return this._collider;\n }\n /**\n * Set the collider geometry\n * @param collider\n * @returns the collider you set\n */\n set(collider) {\n this.clear();\n if (collider) {\n this._collider = collider;\n this._collider.owner = this.owner;\n collider.events.pipe(this.events);\n this.$colliderAdded.notifyAll(collider);\n this.update();\n }\n return collider;\n }\n /**\n * Remove collider geometry from collider component\n */\n clear() {\n if (this._collider) {\n this._collidersToRemove.push(this._collider);\n this._collider = null;\n }\n }\n processColliderRemoval() {\n for (const collider of this._collidersToRemove) {\n collider.events.unpipe(this.events);\n this.$colliderRemoved.notifyAll(collider);\n collider.owner = null;\n }\n }\n clone() {\n const clone = new ColliderComponent(this._collider.clone());\n return clone;\n }\n /**\n * Return world space bounds\n */\n get bounds() {\n var _a, _b;\n return (_b = (_a = this._collider) === null || _a === void 0 ? void 0 : _a.bounds) !== null && _b !== void 0 ? _b : new _BoundingBox__WEBPACK_IMPORTED_MODULE_3__.BoundingBox();\n }\n /**\n * Return local space bounds\n */\n get localBounds() {\n var _a, _b;\n return (_b = (_a = this._collider) === null || _a === void 0 ? void 0 : _a.localBounds) !== null && _b !== void 0 ? _b : new _BoundingBox__WEBPACK_IMPORTED_MODULE_3__.BoundingBox();\n }\n /**\n * Update the collider's transformed geometry\n */\n update() {\n var _a;\n const tx = (_a = this.owner) === null || _a === void 0 ? void 0 : _a.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__.TransformComponent);\n if (this._collider) {\n this._collider.owner = this.owner;\n if (tx) {\n this._collider.update(tx.get());\n }\n }\n }\n /**\n * Collide component with another\n * @param other\n */\n collide(other) {\n let colliderA = this._collider;\n let colliderB = other._collider;\n if (!colliderA || !colliderB) {\n return [];\n }\n // If we have a composite left hand side :(\n // Might bite us, but to avoid updating all the handlers make composite always left side\n let flipped = false;\n if (colliderB instanceof _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_5__.CompositeCollider) {\n colliderA = colliderB;\n colliderB = this._collider;\n flipped = true;\n }\n if (this._collider) {\n const contacts = colliderA.collide(colliderB);\n if (contacts) {\n if (flipped) {\n contacts.forEach((contact) => {\n contact.mtv = contact.mtv.negate();\n contact.normal = contact.normal.negate();\n contact.tangent = contact.normal.perpendicular();\n contact.colliderA = this._collider;\n contact.colliderB = other._collider;\n });\n }\n return contacts;\n }\n return [];\n }\n return [];\n }\n onAdd(entity) {\n if (this._collider) {\n this.update();\n }\n // Wire up the collider events to the owning entity\n this.events.on('precollision', (evt) => {\n const precollision = evt;\n entity.events.emit('precollision', new _Events__WEBPACK_IMPORTED_MODULE_6__.PreCollisionEvent(precollision.self, precollision.other, precollision.side, precollision.intersection, precollision.contact));\n if (entity instanceof _Actor__WEBPACK_IMPORTED_MODULE_7__.Actor) {\n entity.onPreCollisionResolve(precollision.self, precollision.other, precollision.side, precollision.contact);\n }\n });\n this.events.on('postcollision', (evt) => {\n const postcollision = evt;\n entity.events.emit('postcollision', new _Events__WEBPACK_IMPORTED_MODULE_6__.PostCollisionEvent(postcollision.self, postcollision.other, postcollision.side, postcollision.intersection, postcollision.contact));\n if (entity instanceof _Actor__WEBPACK_IMPORTED_MODULE_7__.Actor) {\n entity.onPostCollisionResolve(postcollision.self, postcollision.other, postcollision.side, postcollision.contact);\n }\n });\n this.events.on('collisionstart', (evt) => {\n const start = evt;\n entity.events.emit('collisionstart', new _Events__WEBPACK_IMPORTED_MODULE_6__.CollisionStartEvent(start.self, start.other, start.side, start.contact));\n if (entity instanceof _Actor__WEBPACK_IMPORTED_MODULE_7__.Actor) {\n entity.onCollisionStart(start.self, start.other, start.side, start.contact);\n }\n });\n this.events.on('collisionend', (evt) => {\n const end = evt;\n entity.events.emit('collisionend', new _Events__WEBPACK_IMPORTED_MODULE_6__.CollisionEndEvent(end.self, end.other, end.side, end.lastContact));\n if (entity instanceof _Actor__WEBPACK_IMPORTED_MODULE_7__.Actor) {\n entity.onCollisionEnd(end.self, end.other, end.side, end.lastContact);\n }\n });\n }\n onRemove() {\n this.events.clear();\n this.$colliderRemoved.notifyAll(this._collider);\n }\n /**\n * Sets up a box geometry based on the current bounds of the associated actor of this physics body.\n *\n * If no width/height are specified the body will attempt to use the associated actor's width/height.\n *\n * By default, the box is center is at (0, 0) which means it is centered around the actors anchor.\n */\n useBoxCollider(width, height, anchor = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Half, center = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Zero) {\n const collider = _Colliders_Shape__WEBPACK_IMPORTED_MODULE_9__.Shape.Box(width, height, anchor, center);\n return this.set(collider);\n }\n /**\n * Sets up a {@apilink PolygonCollider | `polygon`} collision geometry based on a list of of points relative\n * to the anchor of the associated actor\n * of this physics body.\n *\n * Only [convex polygon](https://en.wikipedia.org/wiki/Convex_polygon) definitions are supported.\n *\n * By default, the box is center is at (0, 0) which means it is centered around the actors anchor.\n */\n usePolygonCollider(points, center = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Zero) {\n const poly = _Colliders_Shape__WEBPACK_IMPORTED_MODULE_9__.Shape.Polygon(points, center);\n return this.set(poly);\n }\n /**\n * Sets up a {@apilink Circle | `circle collision geometry`} as the only collider with a specified radius in pixels.\n *\n * By default, the box is center is at (0, 0) which means it is centered around the actors anchor.\n */\n useCircleCollider(radius, center = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Zero) {\n const collider = _Colliders_Shape__WEBPACK_IMPORTED_MODULE_9__.Shape.Circle(radius, center);\n return this.set(collider);\n }\n /**\n * Sets up an {@apilink Edge | `edge collision geometry`} with a start point and an end point relative to the anchor of the associated actor\n * of this physics body.\n *\n * By default, the box is center is at (0, 0) which means it is centered around the actors anchor.\n */\n useEdgeCollider(begin, end) {\n const collider = _Colliders_Shape__WEBPACK_IMPORTED_MODULE_9__.Shape.Edge(begin, end);\n return this.set(collider);\n }\n /**\n * Setups up a {@apilink CompositeCollider} which can define any arbitrary set of excalibur colliders\n * @param colliders\n */\n useCompositeCollider(colliders) {\n return this.set(new _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_5__.CompositeCollider(colliders));\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/CircleCollider.ts\":\n/*!***********************************************!*\\\n !*** ./Collision/Colliders/CircleCollider.ts ***!\n \\***********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CircleCollider: () => (/* binding */ CircleCollider)\n/* harmony export */ });\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./CollisionJumpTable */ \"./Collision/Colliders/CollisionJumpTable.ts\");\n/* harmony import */ var _PolygonCollider__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./PolygonCollider */ \"./Collision/Colliders/PolygonCollider.ts\");\n/* harmony import */ var _EdgeCollider__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./EdgeCollider */ \"./Collision/Colliders/EdgeCollider.ts\");\n/* harmony import */ var _Math_projection__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../Math/projection */ \"./Math/projection.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../Color */ \"./Color.ts\");\n/* harmony import */ var _Collider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Collider */ \"./Collision/Colliders/Collider.ts\");\n/* harmony import */ var _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./ClosestLineJumpTable */ \"./Collision/Colliders/ClosestLineJumpTable.ts\");\n/* harmony import */ var _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math/affine-matrix */ \"./Math/affine-matrix.ts\");\n/* harmony import */ var _Index__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Index */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math/util */ \"./Math/util.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * This is a circle collider for the excalibur rigid body physics simulation\n */\nclass CircleCollider extends _Collider__WEBPACK_IMPORTED_MODULE_0__.Collider {\n get worldPos() {\n return this._globalMatrix.getPosition();\n }\n /**\n * Get the radius of the circle\n */\n get radius() {\n var _a;\n if (this._radius) {\n return this._radius;\n }\n const tx = this._transform;\n const scale = (_a = tx === null || tx === void 0 ? void 0 : tx.globalScale) !== null && _a !== void 0 ? _a : _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.One;\n // This is a trade off, the alternative is retooling circles to support ellipse collisions\n return (this._radius = this._naturalRadius * Math.min(scale.x, scale.y));\n }\n /**\n * Set the radius of the circle\n */\n set radius(val) {\n var _a;\n const tx = this._transform;\n const scale = (_a = tx === null || tx === void 0 ? void 0 : tx.globalScale) !== null && _a !== void 0 ? _a : _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.One;\n // This is a trade off, the alternative is retooling circles to support ellipse collisions\n this._naturalRadius = val / Math.min(scale.x, scale.y);\n this._localBoundsDirty = true;\n this._radius = val;\n }\n constructor(options) {\n super();\n /**\n * Position of the circle relative to the collider, by default (0, 0).\n */\n this.offset = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n this._globalMatrix = _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_2__.AffineMatrix.identity();\n this._localBoundsDirty = true;\n this.offset = options.offset || _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n this.radius = options.radius || 0;\n this._globalMatrix.translate(this.offset.x, this.offset.y);\n }\n /**\n * Returns a clone of this shape, not associated with any collider\n */\n clone() {\n return new CircleCollider({\n offset: this.offset.clone(),\n radius: this.radius\n });\n }\n /**\n * Get the center of the collider in world coordinates\n */\n get center() {\n return this._globalMatrix.getPosition();\n }\n /**\n * Tests if a point is contained in this collider\n */\n contains(point) {\n var _a, _b;\n const pos = (_b = (_a = this._transform) === null || _a === void 0 ? void 0 : _a.pos) !== null && _b !== void 0 ? _b : this.offset;\n const distance = pos.distance(point);\n if (distance <= this.radius) {\n return true;\n }\n return false;\n }\n /**\n * Casts a ray at the Circle collider and returns the nearest point of collision\n * @param ray\n */\n rayCast(ray, max = Infinity) {\n var _a, _b;\n // https://en.wikipedia.org/wiki/Intersection_(geometry)#A_line_and_a_circle\n const c = this.center;\n const dir = ray.dir;\n const orig = ray.pos;\n const u = c.sub(orig);\n const u1 = dir.scale(u.dot(dir));\n const u2 = u.sub(u1);\n const d = u2.magnitude;\n if (d > this.radius) {\n return null;\n }\n else {\n // tangent case\n let toi = 0;\n if ((0,_Math_util__WEBPACK_IMPORTED_MODULE_3__.approximatelyEqual)(d, this.radius, 0.0001)) {\n toi = -dir.dot(orig.sub(c));\n if (toi > 0 && toi < max) {\n const point = ray.getPoint(toi);\n return {\n point,\n normal: point.sub(c).normalize(),\n collider: this,\n body: (_a = this.owner) === null || _a === void 0 ? void 0 : _a.get(_Index__WEBPACK_IMPORTED_MODULE_4__.BodyComponent),\n distance: toi\n };\n }\n return null;\n }\n else {\n // two point\n const discriminant = Math.sqrt(Math.pow(dir.dot(orig.sub(c)), 2) - Math.pow(orig.sub(c).distance(), 2) + Math.pow(this.radius, 2));\n const toi1 = -dir.dot(orig.sub(c)) + discriminant;\n const toi2 = -dir.dot(orig.sub(c)) - discriminant;\n const positiveToi = [];\n if (toi1 >= 0) {\n positiveToi.push(toi1);\n }\n if (toi2 >= 0) {\n positiveToi.push(toi2);\n }\n const minToi = Math.min(...positiveToi);\n if (minToi <= max) {\n const point = ray.getPoint(minToi);\n return {\n point,\n normal: point.sub(c).normalize(),\n collider: this,\n body: (_b = this.owner) === null || _b === void 0 ? void 0 : _b.get(_Index__WEBPACK_IMPORTED_MODULE_4__.BodyComponent),\n distance: minToi\n };\n }\n return null;\n }\n }\n }\n getClosestLineBetween(shape) {\n if (shape instanceof CircleCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_5__.ClosestLineJumpTable.CircleCircleClosestLine(this, shape);\n }\n else if (shape instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_6__.PolygonCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_5__.ClosestLineJumpTable.PolygonCircleClosestLine(shape, this).flip();\n }\n else if (shape instanceof _EdgeCollider__WEBPACK_IMPORTED_MODULE_7__.EdgeCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_5__.ClosestLineJumpTable.CircleEdgeClosestLine(this, shape).flip();\n }\n else {\n throw new Error(`Polygon could not collide with unknown CollisionShape ${typeof shape}`);\n }\n }\n /**\n * @inheritdoc\n */\n collide(collider) {\n if (collider instanceof CircleCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_8__.CollisionJumpTable.CollideCircleCircle(this, collider);\n }\n else if (collider instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_6__.PolygonCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_8__.CollisionJumpTable.CollideCirclePolygon(this, collider);\n }\n else if (collider instanceof _EdgeCollider__WEBPACK_IMPORTED_MODULE_7__.EdgeCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_8__.CollisionJumpTable.CollideCircleEdge(this, collider);\n }\n else {\n throw new Error(`Circle could not collide with unknown CollisionShape ${typeof collider}`);\n }\n }\n /**\n * Find the point on the collider furthest in the direction specified\n */\n getFurthestPoint(direction) {\n return this.center.add(direction.normalize().scale(this.radius));\n }\n /**\n * Find the local point on the shape in the direction specified\n * @param direction\n */\n getFurthestLocalPoint(direction) {\n const dir = direction.normalize();\n return dir.scale(this.radius);\n }\n /**\n * Get the axis aligned bounding box for the circle collider in world coordinates\n */\n get bounds() {\n return this.localBounds.transform(this._globalMatrix);\n }\n /**\n * Get the axis aligned bounding box for the circle collider in local coordinates\n */\n get localBounds() {\n if (this._localBoundsDirty) {\n this._localBounds = new _BoundingBox__WEBPACK_IMPORTED_MODULE_9__.BoundingBox(-this._naturalRadius, -this._naturalRadius, +this._naturalRadius, +this._naturalRadius);\n this._localBoundsDirty = false;\n }\n return this._localBounds;\n }\n /**\n * Get axis not implemented on circles, since there are infinite axis in a circle\n */\n get axes() {\n return [];\n }\n /**\n * Returns the moment of inertia of a circle given it's mass\n * https://en.wikipedia.org/wiki/List_of_moments_of_inertia\n */\n getInertia(mass) {\n return (mass * this.radius * this.radius) / 2;\n }\n /* istanbul ignore next */\n update(transform) {\n var _a;\n this._transform = transform;\n const globalMat = (_a = transform.matrix) !== null && _a !== void 0 ? _a : this._globalMatrix;\n globalMat.clone(this._globalMatrix);\n this._globalMatrix.translate(this.offset.x, this.offset.y);\n this._radius = undefined;\n }\n /**\n * Project the circle along a specified axis\n */\n project(axis) {\n const scalars = [];\n const point = this.center;\n const dotProduct = point.dot(axis);\n scalars.push(dotProduct);\n scalars.push(dotProduct + this.radius);\n scalars.push(dotProduct - this.radius);\n return new _Math_projection__WEBPACK_IMPORTED_MODULE_10__.Projection(Math.min.apply(Math, scalars), Math.max.apply(Math, scalars));\n }\n debug(ex, color, options) {\n var _a, _b, _c, _d;\n const { lineWidth } = { ...{ lineWidth: 1 }, ...options };\n const tx = this._transform;\n const scale = (_a = tx === null || tx === void 0 ? void 0 : tx.globalScale) !== null && _a !== void 0 ? _a : _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.One;\n const rotation = (_b = tx === null || tx === void 0 ? void 0 : tx.globalRotation) !== null && _b !== void 0 ? _b : 0;\n const pos = (_c = tx === null || tx === void 0 ? void 0 : tx.globalPos) !== null && _c !== void 0 ? _c : _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n ex.save();\n ex.translate(pos.x, pos.y);\n ex.rotate(rotation);\n ex.scale(scale.x, scale.y);\n ex.drawCircle((_d = this.offset) !== null && _d !== void 0 ? _d : _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero, this._naturalRadius, _Color__WEBPACK_IMPORTED_MODULE_11__.Color.Transparent, color, lineWidth);\n ex.restore();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/ClosestLineJumpTable.ts\":\n/*!*****************************************************!*\\\n !*** ./Collision/Colliders/ClosestLineJumpTable.ts ***!\n \\*****************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ClosestLineJumpTable: () => (/* binding */ ClosestLineJumpTable)\n/* harmony export */ });\n/* harmony import */ var _Math_line_segment__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/line-segment */ \"./Math/line-segment.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math_ray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math/ray */ \"./Math/ray.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/util */ \"./Math/util.ts\");\n\n\n\n\n/**\n * Finds the closest line segment between two given line segments.\n */\nfunction ClosestLine(line1, line2) {\n // https://math.stackexchange.com/questions/1993953/closest-points-between-2-lines-in-2d\n const EPSILON = 1e-9;\n const line1Dir = line1.dir();\n const line2Dir = line2.dir();\n const d1Squared = line1Dir.dot(line1Dir);\n const d2Squared = line2Dir.dot(line2Dir);\n if (d1Squared < EPSILON && d2Squared < EPSILON) {\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_0__.LineSegment(line1.begin, line2.begin);\n }\n if (d1Squared < EPSILON) {\n const t = (0,_Math_util__WEBPACK_IMPORTED_MODULE_1__.clamp)(line2Dir.dot(line1.begin.sub(line2.begin)) / d2Squared, 0, 1);\n const closestPoint = line2.begin.add(line2Dir.scale(t));\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_0__.LineSegment(line1.begin, closestPoint);\n }\n if (d2Squared < EPSILON) {\n const t = (0,_Math_util__WEBPACK_IMPORTED_MODULE_1__.clamp)(line1Dir.dot(line2.begin.sub(line1.begin)) / d1Squared, 0, 1);\n const closestPoint = line1.begin.add(line1Dir.scale(t));\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_0__.LineSegment(closestPoint, line2.begin);\n }\n const r = line1.begin.sub(line2.begin);\n const a = d1Squared;\n const e = d2Squared;\n const f = line2Dir.dot(r);\n const denom = a * e - Math.pow(line1Dir.dot(line2Dir), 2);\n let s = 0;\n let t = 0;\n if (Math.abs(denom) > EPSILON) {\n s = (0,_Math_util__WEBPACK_IMPORTED_MODULE_1__.clamp)((line1Dir.dot(line2Dir) * f - e * line1Dir.dot(r)) / denom, 0, 1);\n }\n else {\n // lines are parallel\n s = (0,_Math_util__WEBPACK_IMPORTED_MODULE_1__.clamp)(line1Dir.dot(r) / a, 0, 1);\n }\n if (Math.abs(e) > EPSILON) {\n t = (0,_Math_util__WEBPACK_IMPORTED_MODULE_1__.clamp)((line1Dir.dot(line2Dir) * s + f) / e, 0, 1);\n }\n else {\n // line2 is a degenerate point\n t = 0;\n }\n const closestPointOnLine1 = line1.begin.add(line1Dir.scale(s));\n const closestPointOnLine2 = line2.begin.add(line2Dir.scale(t));\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_0__.LineSegment(closestPointOnLine1, closestPointOnLine2);\n}\nconst ClosestLineJumpTable = {\n PolygonPolygonClosestLine(polygonA, polygonB) {\n const aSides = polygonA.getSides();\n const bSides = polygonB.getSides();\n let minDistance = Number.MAX_VALUE;\n let closestLine = null;\n for (let i = 0; i < aSides.length; i++) {\n for (let j = 0; j < bSides.length; j++) {\n const line = ClosestLine(aSides[i], bSides[j]);\n const distance = line.getLength();\n if (distance < minDistance) {\n minDistance = distance;\n closestLine = line;\n }\n }\n }\n return closestLine;\n },\n PolygonEdgeClosestLine(polygon, edge) {\n // Find the 2 closest faces on each polygon\n const otherWorldPos = edge.worldPos;\n const otherDirection = otherWorldPos.sub(polygon.worldPos);\n const rayTowardsOther = new _Math_ray__WEBPACK_IMPORTED_MODULE_2__.Ray(polygon.worldPos, otherDirection);\n const thisPoint = polygon.rayCast(rayTowardsOther).point.add(rayTowardsOther.dir.scale(0.1));\n const thisFace = polygon.getClosestFace(thisPoint);\n // L1 = P(s) = p0 + s * u, where s is time and p0 is the start of the line\n // L2 = Q(t) = q0 + t * v, where t is time and q0 is the start of the line\n const edgeLine = edge.asLine();\n return ClosestLine(thisFace.face, edgeLine);\n },\n PolygonCircleClosestLine(polygon, circle) {\n // https://math.stackexchange.com/questions/1919177/how-to-find-point-on-line-closest-to-sphere\n // Find the 2 closest faces on each polygon\n const otherWorldPos = circle.worldPos;\n const otherDirection = otherWorldPos.sub(polygon.worldPos);\n const rayTowardsOther = new _Math_ray__WEBPACK_IMPORTED_MODULE_2__.Ray(polygon.worldPos, otherDirection.normalize());\n const thisPoint = polygon.rayCast(rayTowardsOther).point.add(rayTowardsOther.dir.scale(0.1));\n const thisFace = polygon.getClosestFace(thisPoint);\n // L1 = P(s) = p0 + s * u, where s is time and p0 is the start of the line\n const p0 = thisFace.face.begin;\n const u = thisFace.face.getEdge();\n // Time of minimum distance\n let t = (u.x * (otherWorldPos.x - p0.x) + u.y * (otherWorldPos.y - p0.y)) / (u.x * u.x + u.y * u.y);\n // If time of minimum is past the edge clamp\n if (t > 1) {\n t = 1;\n }\n else if (t < 0) {\n t = 0;\n }\n // Minimum distance\n const d = Math.sqrt(Math.pow(p0.x + u.x * t - otherWorldPos.x, 2) + Math.pow(p0.y + u.y * t - otherWorldPos.y, 2)) - circle.radius;\n const circlex = ((p0.x + u.x * t - otherWorldPos.x) * circle.radius) / (circle.radius + d);\n const circley = ((p0.y + u.y * t - otherWorldPos.y) * circle.radius) / (circle.radius + d);\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_0__.LineSegment(u.scale(t).add(p0), new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(otherWorldPos.x + circlex, otherWorldPos.y + circley));\n },\n CircleCircleClosestLine(circleA, circleB) {\n // Find the 2 closest faces on each polygon\n const otherWorldPos = circleB.worldPos;\n const otherDirection = otherWorldPos.sub(circleA.worldPos);\n const thisWorldPos = circleA.worldPos;\n const thisDirection = thisWorldPos.sub(circleB.worldPos);\n const rayTowardsOther = new _Math_ray__WEBPACK_IMPORTED_MODULE_2__.Ray(circleA.worldPos, otherDirection);\n const rayTowardsThis = new _Math_ray__WEBPACK_IMPORTED_MODULE_2__.Ray(circleB.worldPos, thisDirection);\n const thisPoint = circleA.rayCast(rayTowardsOther);\n const otherPoint = circleB.rayCast(rayTowardsThis);\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_0__.LineSegment(thisPoint.point, otherPoint.point);\n },\n CircleEdgeClosestLine(circle, edge) {\n // https://math.stackexchange.com/questions/1919177/how-to-find-point-on-line-closest-to-sphere\n const circleWorldPos = circle.worldPos;\n // L1 = P(s) = p0 + s * u, where s is time and p0 is the start of the line\n const edgeLine = edge.asLine();\n const edgeStart = edgeLine.begin;\n const edgeVector = edgeLine.getEdge();\n const p0 = edgeStart;\n const u = edgeVector;\n // Time of minimum distance\n let t = (u.x * (circleWorldPos.x - p0.x) + u.y * (circleWorldPos.y - p0.y)) / (u.x * u.x + u.y * u.y);\n // If time of minimum is past the edge clamp to edge\n if (t > 1) {\n t = 1;\n }\n else if (t < 0) {\n t = 0;\n }\n // Minimum distance\n const d = Math.sqrt(Math.pow(p0.x + u.x * t - circleWorldPos.x, 2) + Math.pow(p0.y + u.y * t - circleWorldPos.y, 2)) - circle.radius;\n const circlex = ((p0.x + u.x * t - circleWorldPos.x) * circle.radius) / (circle.radius + d);\n const circley = ((p0.y + u.y * t - circleWorldPos.y) * circle.radius) / (circle.radius + d);\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_0__.LineSegment(u.scale(t).add(p0), new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(circleWorldPos.x + circlex, circleWorldPos.y + circley));\n },\n EdgeEdgeClosestLine(edgeA, edgeB) {\n // L1 = P(s) = p0 + s * u, where s is time and p0 is the start of the line\n const edgeLineA = edgeA.asLine();\n // L2 = Q(t) = q0 + t * v, where t is time and q0 is the start of the line\n const edgeLineB = edgeB.asLine();\n return ClosestLine(edgeLineA, edgeLineB);\n }\n};\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/Collider.ts\":\n/*!*****************************************!*\\\n !*** ./Collision/Colliders/Collider.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Collider: () => (/* binding */ Collider)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Id__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Id */ \"./Id.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n/**\n * A collision collider specifies the geometry that can detect when other collision colliders intersect\n * for the purposes of colliding 2 objects in excalibur.\n */\nclass Collider {\n constructor() {\n this.id = (0,_Id__WEBPACK_IMPORTED_MODULE_0__.createId)('collider', Collider._ID++);\n /**\n * Composite collider if any this collider is attached to\n *\n * **WARNING** do not tamper with this property\n */\n this.composite = null;\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_1__.EventEmitter();\n /**\n * Pixel offset of the collision collider relative to the collider, by default (0, 0) meaning the collider is positioned\n * on top of the collider.\n */\n this.offset = _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero;\n }\n /**\n * Returns a boolean indicating whether this body collided with\n * or was in stationary contact with\n * the body of the other {@apilink Collider}\n */\n touching(other) {\n const contact = this.collide(other);\n if (contact) {\n return true;\n }\n return false;\n }\n}\nCollider._ID = 0;\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/CollisionJumpTable.ts\":\n/*!***************************************************!*\\\n !*** ./Collision/Colliders/CollisionJumpTable.ts ***!\n \\***************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CollisionJumpTable: () => (/* binding */ CollisionJumpTable)\n/* harmony export */ });\n/* harmony import */ var _CircleCollider__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./CircleCollider */ \"./Collision/Colliders/CircleCollider.ts\");\n/* harmony import */ var _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Detection/CollisionContact */ \"./Collision/Detection/CollisionContact.ts\");\n/* harmony import */ var _PolygonCollider__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./PolygonCollider */ \"./Collision/Colliders/PolygonCollider.ts\");\n/* harmony import */ var _EdgeCollider__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./EdgeCollider */ \"./Collision/Colliders/EdgeCollider.ts\");\n/* harmony import */ var _SeparatingAxis__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./SeparatingAxis */ \"./Collision/Colliders/SeparatingAxis.ts\");\n/* harmony import */ var _Math_line_segment__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../Math/line-segment */ \"./Math/line-segment.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../EntityComponentSystem */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Detection_Pair__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Detection/Pair */ \"./Collision/Detection/Pair.ts\");\n/* harmony import */ var _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/affine-matrix */ \"./Math/affine-matrix.ts\");\n\n\n\n\n\n\n\n\n\n\nconst ScratchZero = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero; // TODO constant vector\nconst ScratchNormal = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero; // TODO constant vector\nconst ScratchMatrix = _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_1__.AffineMatrix.identity();\nconst CollisionJumpTable = {\n CollideCircleCircle(circleA, circleB) {\n const circleAPos = circleA.worldPos;\n const circleBPos = circleB.worldPos;\n const combinedRadius = circleA.radius + circleB.radius;\n const distance = circleAPos.distance(circleBPos);\n if (distance > combinedRadius) {\n return [];\n }\n // negative means overlap\n const separation = combinedRadius - distance;\n // Normal points from A -> B\n const normal = circleBPos.sub(circleAPos).normalize();\n const tangent = normal.perpendicular();\n const mvt = normal.scale(separation);\n const point = circleA.getFurthestPoint(normal);\n const local = circleA.getFurthestLocalPoint(normal);\n const info = {\n collider: circleA,\n separation,\n axis: normal,\n point: point\n };\n return [new _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_2__.CollisionContact(circleA, circleB, mvt, normal, tangent, [point], [local], info)];\n },\n CollideCirclePolygon(circle, polygon) {\n var _a, _b;\n let minAxis = _SeparatingAxis__WEBPACK_IMPORTED_MODULE_3__.SeparatingAxis.findCirclePolygonSeparation(circle, polygon);\n if (!minAxis) {\n return [];\n }\n // make sure that the minAxis is pointing away from circle\n const sameDir = minAxis.dot(polygon.center.sub(circle.center));\n minAxis = sameDir < 0 ? minAxis.negate() : minAxis;\n const point = circle.getFurthestPoint(minAxis);\n const xf = (_b = (_a = circle.owner) === null || _a === void 0 ? void 0 : _a.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__.TransformComponent)) !== null && _b !== void 0 ? _b : new _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__.TransformComponent();\n const local = xf.applyInverse(point);\n const normal = minAxis.normalize();\n const info = {\n collider: circle,\n separation: -minAxis.magnitude,\n axis: normal,\n point: point,\n localPoint: local,\n side: polygon.findSide(normal.negate()),\n localSide: polygon.findLocalSide(normal.negate())\n };\n return [new _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_2__.CollisionContact(circle, polygon, minAxis, normal, normal.perpendicular(), [point], [local], info)];\n },\n CollideCircleEdge(circle, edge) {\n // TODO not sure this actually abides by local/world collisions\n // Are edge.begin and edge.end local space or world space? I think they should be local\n // center of the circle in world pos\n const cc = circle.center;\n // vector in the direction of the edge\n const edgeWorld = edge.asLine();\n const e = edgeWorld.end.sub(edgeWorld.begin);\n // amount of overlap with the circle's center along the edge direction\n const u = e.dot(edgeWorld.end.sub(cc));\n const v = e.dot(cc.sub(edgeWorld.begin));\n const side = edge.asLine();\n const localSide = edge.asLocalLine();\n // Potential region A collision (circle is on the left side of the edge, before the beginning)\n if (v <= 0) {\n const da = edgeWorld.begin.sub(cc);\n const dda = da.dot(da); // quick and dirty way of calc'n distance in r^2 terms saves some sqrts\n // save some sqrts\n if (dda > circle.radius * circle.radius) {\n return []; // no collision\n }\n const normal = da.normalize();\n const separation = circle.radius - Math.sqrt(dda);\n const info = {\n collider: circle,\n separation: separation,\n axis: normal,\n point: side.begin,\n side: side,\n localSide: localSide\n };\n return [\n new _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_2__.CollisionContact(circle, edge, normal.scale(separation), normal, normal.perpendicular(), [side.begin], [localSide.begin], info)\n ];\n }\n // Potential region B collision (circle is on the right side of the edge, after the end)\n if (u <= 0) {\n const db = edgeWorld.end.sub(cc);\n const ddb = db.dot(db);\n if (ddb > circle.radius * circle.radius) {\n return [];\n }\n const normal = db.normalize();\n const separation = circle.radius - Math.sqrt(ddb);\n const info = {\n collider: circle,\n separation: separation,\n axis: normal,\n point: side.end,\n side: side,\n localSide: localSide\n };\n return [\n new _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_2__.CollisionContact(circle, edge, normal.scale(separation), normal, normal.perpendicular(), [side.end], [localSide.end], info)\n ];\n }\n // Otherwise potential region AB collision (circle is in the middle of the edge between the beginning and end)\n const den = e.dot(e);\n const pointOnEdge = edgeWorld.begin\n .scale(u)\n .add(edgeWorld.end.scale(v))\n .scale(1 / den);\n const d = cc.sub(pointOnEdge);\n const dd = d.dot(d);\n if (dd > circle.radius * circle.radius) {\n return []; // no collision\n }\n let normal = e.perpendicular();\n // flip correct direction\n if (normal.dot(cc.sub(edgeWorld.begin)) < 0) {\n normal.x = -normal.x;\n normal.y = -normal.y;\n }\n normal = normal.normalize();\n const separation = circle.radius - Math.sqrt(dd);\n const mvt = normal.scale(separation);\n const info = {\n collider: circle,\n separation: separation,\n axis: normal,\n point: pointOnEdge,\n side: side,\n localSide: localSide\n };\n return [\n new _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_2__.CollisionContact(circle, edge, mvt, normal.negate(), normal.negate().perpendicular(), [pointOnEdge], [pointOnEdge.sub(edge.worldPos)], info)\n ];\n },\n CollideEdgeEdge() {\n // Edge-edge collision doesn't make sense\n return [];\n },\n CollidePolygonEdge(polygon, edge) {\n var _a;\n const pc = polygon.center;\n const ec = edge.center;\n const dir = ec.sub(pc).normalize();\n // build a temporary polygon from the edge to use SAT\n const linePoly = new _PolygonCollider__WEBPACK_IMPORTED_MODULE_5__.PolygonCollider({\n points: [edge.begin, edge.end, edge.end.add(dir.scale(100)), edge.begin.add(dir.scale(100))],\n offset: edge.offset\n });\n linePoly.owner = edge.owner;\n const tx = (_a = edge.owner) === null || _a === void 0 ? void 0 : _a.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__.TransformComponent);\n if (tx) {\n linePoly.update(edge.owner.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__.TransformComponent).get());\n }\n // Gross hack but poly-poly works well\n const contact = this.CollidePolygonPolygon(polygon, linePoly);\n if (contact.length) {\n // Fudge the contact back to edge\n contact[0].colliderB = edge;\n contact[0].id = _Detection_Pair__WEBPACK_IMPORTED_MODULE_6__.Pair.calculatePairHash(polygon.id, edge.id);\n }\n return contact;\n },\n CollidePolygonPolygon(polyA, polyB) {\n // Multi contact from SAT\n // https://gamedev.stackexchange.com/questions/111390/multiple-contacts-for-sat-collision-detection\n // do a SAT test to find a min axis if it exists\n const separationA = _SeparatingAxis__WEBPACK_IMPORTED_MODULE_3__.SeparatingAxis.findPolygonPolygonSeparation(polyA, polyB);\n // If there is no overlap from boxA's perspective we can end early\n if (separationA.separation > 0) {\n return [];\n }\n const separationB = _SeparatingAxis__WEBPACK_IMPORTED_MODULE_3__.SeparatingAxis.findPolygonPolygonSeparation(polyB, polyA);\n // If there is no overlap from boxB's perspective exit now\n if (separationB.separation > 0) {\n return [];\n }\n // Separations are both negative, we want to pick the least negative (minimal movement)\n const separation = separationA.separation > separationB.separation ? separationA : separationB;\n // The incident side is the most opposite from the axes of collision on the other collider\n const other = separation.collider === polyA ? polyB : polyA;\n const main = separation.collider === polyA ? polyA : polyB;\n const toIncidentFrame = other.transform.inverse.multiply(main.transform.matrix, ScratchMatrix);\n const toIncidentFrameRotation = toIncidentFrame.getRotation();\n const referenceEdgeNormal = main.normals[separation.sideId].rotate(toIncidentFrameRotation, ScratchZero, ScratchNormal);\n let minEdge = Number.MAX_VALUE;\n let incidentEdgeIndex = 0;\n for (let i = 0; i < other.normals.length; i++) {\n const value = referenceEdgeNormal.dot(other.normals[i]);\n if (value < minEdge) {\n minEdge = value;\n incidentEdgeIndex = i;\n }\n }\n // Clip incident side by the perpendicular lines at each end of the reference side\n // https://en.wikipedia.org/wiki/Sutherland%E2%80%93Hodgman_algorithm\n const referenceSide = separation.localSide.transform(toIncidentFrame);\n const referenceDirection = separation.localAxis.perpendicular().negate().rotate(toIncidentFrameRotation);\n const incidentSide = new _Math_line_segment__WEBPACK_IMPORTED_MODULE_7__.LineSegment(other.points[incidentEdgeIndex], other.points[(incidentEdgeIndex + 1) % other.points.length]);\n const clipRight = incidentSide.clip(referenceDirection.negate(), -referenceDirection.dot(referenceSide.begin), false);\n let clipLeft = null;\n if (clipRight) {\n clipLeft = clipRight.clip(referenceDirection, referenceDirection.dot(referenceSide.end), false);\n }\n if (clipLeft) {\n const localPoints = [];\n const points = [];\n const clipPoints = clipLeft.getPoints();\n for (let i = 0; i < clipPoints.length; i++) {\n const p = clipPoints[i];\n if (referenceSide.below(p)) {\n localPoints.push(p);\n points.push(other.transform.apply(p));\n }\n }\n let normal = separation.axis;\n let tangent = normal.perpendicular();\n // Point Contact A -> B\n if (polyB.center.sub(polyA.center).dot(normal) < 0) {\n normal = normal.negate();\n tangent = normal.perpendicular();\n }\n return [new _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_2__.CollisionContact(polyA, polyB, normal.scale(-separation.separation), normal, tangent, points, localPoints, separation)];\n }\n return [];\n },\n FindContactSeparation(contact, localPoint) {\n var _a, _b, _c, _d;\n const shapeA = contact.colliderA;\n const txA = (_b = (_a = contact.bodyA) === null || _a === void 0 ? void 0 : _a.transform) !== null && _b !== void 0 ? _b : new _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__.TransformComponent();\n const shapeB = contact.colliderB;\n const txB = (_d = (_c = contact.bodyB) === null || _c === void 0 ? void 0 : _c.transform) !== null && _d !== void 0 ? _d : new _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__.TransformComponent();\n // both are circles\n if (shapeA instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_8__.CircleCollider && shapeB instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_8__.CircleCollider) {\n const combinedRadius = shapeA.radius + shapeB.radius;\n const distance = txA.pos.distance(txB.pos);\n const separation = combinedRadius - distance;\n return -separation;\n }\n // both are polygons\n if (shapeA instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_5__.PolygonCollider && shapeB instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_5__.PolygonCollider) {\n if (contact.info.localSide) {\n let side;\n let worldPoint;\n if (contact.info.collider === shapeA) {\n side = new _Math_line_segment__WEBPACK_IMPORTED_MODULE_7__.LineSegment(txA.apply(contact.info.localSide.begin), txA.apply(contact.info.localSide.end));\n worldPoint = txB.apply(localPoint);\n }\n else {\n side = new _Math_line_segment__WEBPACK_IMPORTED_MODULE_7__.LineSegment(txB.apply(contact.info.localSide.begin), txB.apply(contact.info.localSide.end));\n worldPoint = txA.apply(localPoint);\n }\n return side.distanceToPoint(worldPoint, true);\n }\n }\n // polygon v circle\n if ((shapeA instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_5__.PolygonCollider && shapeB instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_8__.CircleCollider) ||\n (shapeB instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_5__.PolygonCollider && shapeA instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_8__.CircleCollider)) {\n const worldPoint = txA.apply(localPoint);\n if (contact.info.side) {\n return contact.info.side.distanceToPoint(worldPoint, true);\n }\n }\n // polygon v edge\n if ((shapeA instanceof _EdgeCollider__WEBPACK_IMPORTED_MODULE_9__.EdgeCollider && shapeB instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_5__.PolygonCollider) ||\n (shapeB instanceof _EdgeCollider__WEBPACK_IMPORTED_MODULE_9__.EdgeCollider && shapeA instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_5__.PolygonCollider)) {\n let worldPoint;\n if (contact.info.collider === shapeA) {\n worldPoint = txB.apply(localPoint);\n }\n else {\n worldPoint = txA.apply(localPoint);\n }\n if (contact.info.side) {\n return contact.info.side.distanceToPoint(worldPoint, true);\n }\n }\n // circle v edge\n if ((shapeA instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_8__.CircleCollider && shapeB instanceof _EdgeCollider__WEBPACK_IMPORTED_MODULE_9__.EdgeCollider) ||\n (shapeB instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_8__.CircleCollider && shapeA instanceof _EdgeCollider__WEBPACK_IMPORTED_MODULE_9__.EdgeCollider)) {\n // Local point is always on the edge which is always shapeB\n const worldPoint = txB.apply(localPoint);\n let circlePoint;\n if (shapeA instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_8__.CircleCollider) {\n circlePoint = shapeA.getFurthestPoint(contact.normal);\n }\n const dist = worldPoint.distance(circlePoint);\n if (contact.info.side) {\n return dist > 0 ? -dist : 0;\n }\n }\n return 0;\n }\n};\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/CompositeCollider.ts\":\n/*!**************************************************!*\\\n !*** ./Collision/Colliders/CompositeCollider.ts ***!\n \\**************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CompositeCollider: () => (/* binding */ CompositeCollider)\n/* harmony export */ });\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../.. */ \"./Util/Util.ts\");\n/* harmony import */ var _Detection_Pair__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Detection/Pair */ \"./Collision/Detection/Pair.ts\");\n/* harmony import */ var _Math_projection__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../Math/projection */ \"./Math/projection.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Detection_DynamicTree__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Detection/DynamicTree */ \"./Collision/Detection/DynamicTree.ts\");\n/* harmony import */ var _Detection_DynamicTreeCollisionProcessor__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Detection/DynamicTreeCollisionProcessor */ \"./Collision/Detection/DynamicTreeCollisionProcessor.ts\");\n/* harmony import */ var _Collider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Collider */ \"./Collision/Colliders/Collider.ts\");\n/* harmony import */ var _PhysicsConfig__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../PhysicsConfig */ \"./Collision/PhysicsConfig.ts\");\n\n\n\n\n\n\n\n\n\nclass CompositeCollider extends _Collider__WEBPACK_IMPORTED_MODULE_0__.Collider {\n /**\n * Treat composite collider's member colliders as either separate colliders for the purposes of onCollisionStart/onCollision\n * or as a single collider together.\n *\n * This property can be overridden on individual {@apilink CompositeColliders}.\n *\n * For composites without gaps or small groups of colliders, you probably want 'together'\n *\n * For composites with deliberate gaps, like a platforming level layout, you probably want 'separate'\n *\n * Default is 'together' if unset\n */\n set compositeStrategy(value) {\n this._compositeStrategy = value;\n }\n get compositeStrategy() {\n return this._compositeStrategy;\n }\n constructor(colliders) {\n super();\n this._collisionProcessor = new _Detection_DynamicTreeCollisionProcessor__WEBPACK_IMPORTED_MODULE_1__.DynamicTreeCollisionProcessor({\n ...(0,_PhysicsConfig__WEBPACK_IMPORTED_MODULE_2__.getDefaultPhysicsConfig)()\n });\n this._dynamicAABBTree = new _Detection_DynamicTree__WEBPACK_IMPORTED_MODULE_3__.DynamicTree({\n boundsPadding: 5,\n velocityMultiplier: 2\n });\n this._colliders = [];\n for (const c of colliders) {\n this.addCollider(c);\n }\n }\n clearColliders() {\n this._colliders = [];\n }\n addCollider(collider) {\n let colliders;\n if (collider instanceof CompositeCollider) {\n colliders = collider.getColliders();\n colliders.forEach((c) => c.offset.addEqual(collider.offset));\n }\n else {\n colliders = [collider];\n }\n // Flatten composites\n for (const c of colliders) {\n c.events.pipe(this.events);\n c.composite = this;\n this._colliders.push(c);\n this._collisionProcessor.track(c);\n this._dynamicAABBTree.trackCollider(c);\n }\n }\n removeCollider(collider) {\n collider.events.pipe(this.events);\n collider.composite = null;\n ___WEBPACK_IMPORTED_MODULE_4__.removeItemFromArray(collider, this._colliders);\n this._collisionProcessor.untrack(collider);\n this._dynamicAABBTree.untrackCollider(collider);\n }\n getColliders() {\n return this._colliders;\n }\n get worldPos() {\n var _a, _b;\n return ((_b = (_a = this._transform) === null || _a === void 0 ? void 0 : _a.pos) !== null && _b !== void 0 ? _b : _Math_vector__WEBPACK_IMPORTED_MODULE_5__.Vector.Zero).add(this.offset);\n }\n get center() {\n var _a, _b;\n return ((_b = (_a = this._transform) === null || _a === void 0 ? void 0 : _a.pos) !== null && _b !== void 0 ? _b : _Math_vector__WEBPACK_IMPORTED_MODULE_5__.Vector.Zero).add(this.offset);\n }\n get bounds() {\n var _a, _b;\n // TODO cache this\n const colliders = this.getColliders();\n const results = colliders.reduce((acc, collider) => acc.combine(collider.bounds), (_b = (_a = colliders[0]) === null || _a === void 0 ? void 0 : _a.bounds) !== null && _b !== void 0 ? _b : new _BoundingBox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox().translate(this.worldPos));\n return results.translate(this.offset);\n }\n get localBounds() {\n var _a, _b;\n // TODO cache this\n const colliders = this.getColliders();\n const results = colliders.reduce((acc, collider) => acc.combine(collider.localBounds), (_b = (_a = colliders[0]) === null || _a === void 0 ? void 0 : _a.localBounds) !== null && _b !== void 0 ? _b : new _BoundingBox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox());\n return results;\n }\n get axes() {\n // TODO cache this\n const colliders = this.getColliders();\n let axes = [];\n for (const collider of colliders) {\n axes = axes.concat(collider.axes);\n }\n return axes;\n }\n getFurthestPoint(direction) {\n const colliders = this.getColliders();\n const furthestPoints = [];\n for (const collider of colliders) {\n furthestPoints.push(collider.getFurthestPoint(direction));\n }\n // Pick best point from all colliders\n let bestPoint = furthestPoints[0];\n let maxDistance = -Number.MAX_VALUE;\n for (const point of furthestPoints) {\n const distance = point.dot(direction);\n if (distance > maxDistance) {\n bestPoint = point;\n maxDistance = distance;\n }\n }\n return bestPoint;\n }\n getInertia(mass) {\n const colliders = this.getColliders();\n let totalInertia = 0;\n for (const collider of colliders) {\n totalInertia += collider.getInertia(mass);\n }\n return totalInertia;\n }\n collide(other) {\n let otherColliders = [other];\n if (other instanceof CompositeCollider) {\n otherColliders = other.getColliders();\n }\n const pairs = [];\n for (const c of otherColliders) {\n this._dynamicAABBTree.query(c, (potentialCollider) => {\n pairs.push(new _Detection_Pair__WEBPACK_IMPORTED_MODULE_7__.Pair(c, potentialCollider));\n return false;\n });\n }\n let contacts = [];\n for (const p of pairs) {\n contacts = contacts.concat(p.collide());\n }\n return contacts;\n }\n getClosestLineBetween(other) {\n const colliders = this.getColliders();\n const lines = [];\n if (other instanceof CompositeCollider) {\n const otherColliders = other.getColliders();\n for (const colliderA of colliders) {\n for (const colliderB of otherColliders) {\n const maybeLine = colliderA.getClosestLineBetween(colliderB);\n if (maybeLine) {\n lines.push(maybeLine);\n }\n }\n }\n }\n else {\n for (const collider of colliders) {\n const maybeLine = other.getClosestLineBetween(collider);\n if (maybeLine) {\n lines.push(maybeLine);\n }\n }\n }\n if (lines.length) {\n let minLength = lines[0].getLength();\n let minLine = lines[0];\n for (const line of lines) {\n const length = line.getLength();\n if (length < minLength) {\n minLength = length;\n minLine = line;\n }\n }\n return minLine;\n }\n return null;\n }\n contains(point) {\n const colliders = this.getColliders();\n for (const collider of colliders) {\n if (collider.contains(point)) {\n return true;\n }\n }\n return false;\n }\n rayCast(ray, max) {\n const colliders = this.getColliders();\n const hits = [];\n for (const collider of colliders) {\n const hit = collider.rayCast(ray, max);\n if (hit) {\n hits.push(hit);\n }\n }\n if (hits.length) {\n let minHit = hits[0];\n let minDistance = minHit.point.dot(ray.dir);\n for (const hit of hits) {\n const distance = ray.dir.dot(hit.point);\n if (distance < minDistance) {\n minHit = hit;\n minDistance = distance;\n }\n }\n return minHit;\n }\n return null;\n }\n project(axis) {\n const colliders = this.getColliders();\n const projections = [];\n for (const collider of colliders) {\n const proj = collider.project(axis);\n if (proj) {\n projections.push(proj);\n }\n }\n // Merge all proj's on the same axis\n if (projections.length) {\n const newProjection = new _Math_projection__WEBPACK_IMPORTED_MODULE_8__.Projection(projections[0].min, projections[0].max);\n for (const proj of projections) {\n newProjection.min = Math.min(proj.min, newProjection.min);\n newProjection.max = Math.max(proj.max, newProjection.max);\n }\n return newProjection;\n }\n return null;\n }\n update(transform) {\n if (transform) {\n const colliders = this.getColliders();\n for (const collider of colliders) {\n collider.owner = this.owner;\n collider.update(transform);\n }\n }\n }\n debug(ex, color, options) {\n const colliders = this.getColliders();\n ex.save();\n ex.translate(this.offset.x, this.offset.y);\n for (const collider of colliders) {\n collider.debug(ex, color, options);\n }\n ex.restore();\n }\n clone() {\n const result = new CompositeCollider(this._colliders.map((c) => c.clone()));\n result.offset = this.offset.clone();\n return result;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/EdgeCollider.ts\":\n/*!*********************************************!*\\\n !*** ./Collision/Colliders/EdgeCollider.ts ***!\n \\*********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EdgeCollider: () => (/* binding */ EdgeCollider)\n/* harmony export */ });\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./CollisionJumpTable */ \"./Collision/Colliders/CollisionJumpTable.ts\");\n/* harmony import */ var _CircleCollider__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./CircleCollider */ \"./Collision/Colliders/CircleCollider.ts\");\n/* harmony import */ var _PolygonCollider__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./PolygonCollider */ \"./Collision/Colliders/PolygonCollider.ts\");\n/* harmony import */ var _Math_projection__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../Math/projection */ \"./Math/projection.ts\");\n/* harmony import */ var _Math_line_segment__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../Math/line-segment */ \"./Math/line-segment.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Collider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Collider */ \"./Collision/Colliders/Collider.ts\");\n/* harmony import */ var _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./ClosestLineJumpTable */ \"./Collision/Colliders/ClosestLineJumpTable.ts\");\n/* harmony import */ var _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/affine-matrix */ \"./Math/affine-matrix.ts\");\n/* harmony import */ var _Index__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Index */ \"./Collision/BodyComponent.ts\");\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Edge is a single line collider to create collisions with a single line.\n */\nclass EdgeCollider extends _Collider__WEBPACK_IMPORTED_MODULE_0__.Collider {\n constructor(options) {\n var _a;\n super();\n this._globalMatrix = _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_1__.AffineMatrix.identity();\n this.begin = options.begin || _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero;\n this.end = options.end || _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero;\n this.offset = (_a = options.offset) !== null && _a !== void 0 ? _a : _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero;\n }\n /**\n * Returns a clone of this Edge, not associated with any collider\n */\n clone() {\n return new EdgeCollider({\n begin: this.begin.clone(),\n end: this.end.clone()\n });\n }\n get worldPos() {\n var _a;\n const tx = this._transform;\n return (_a = tx === null || tx === void 0 ? void 0 : tx.globalPos.add(this.offset)) !== null && _a !== void 0 ? _a : this.offset;\n }\n /**\n * Get the center of the collision area in world coordinates\n */\n get center() {\n const begin = this._getTransformedBegin();\n const end = this._getTransformedEnd();\n const pos = begin.average(end);\n return pos;\n }\n _getTransformedBegin() {\n return this._globalMatrix.multiply(this.begin);\n }\n _getTransformedEnd() {\n return this._globalMatrix.multiply(this.end);\n }\n /**\n * Returns the slope of the line in the form of a vector\n */\n getSlope() {\n const begin = this._getTransformedBegin();\n const end = this._getTransformedEnd();\n const distance = begin.distance(end);\n return end.sub(begin).scale(1 / distance);\n }\n /**\n * Returns the length of the line segment in pixels\n */\n getLength() {\n const begin = this._getTransformedBegin();\n const end = this._getTransformedEnd();\n const distance = begin.distance(end);\n return distance;\n }\n /**\n * Tests if a point is contained in this collision area\n */\n contains() {\n return false;\n }\n /**\n * @inheritdoc\n */\n rayCast(ray, max = Infinity) {\n var _a;\n const numerator = this._getTransformedBegin().sub(ray.pos);\n // Test is line and ray are parallel and non intersecting\n if (ray.dir.cross(this.getSlope()) === 0 && numerator.cross(ray.dir) !== 0) {\n return null;\n }\n // Lines are parallel\n const divisor = ray.dir.cross(this.getSlope());\n if (divisor === 0) {\n return null;\n }\n const t = numerator.cross(this.getSlope()) / divisor;\n if (t >= 0 && t <= max) {\n const u = numerator.cross(ray.dir) / divisor / this.getLength();\n if (u >= 0 && u <= 1) {\n return {\n distance: t,\n normal: this.asLine().normal(),\n collider: this,\n body: (_a = this.owner) === null || _a === void 0 ? void 0 : _a.get(_Index__WEBPACK_IMPORTED_MODULE_3__.BodyComponent),\n point: ray.getPoint(t)\n };\n }\n }\n return null;\n }\n /**\n * Returns the closes line between this and another collider, from this -> collider\n * @param shape\n */\n getClosestLineBetween(shape) {\n if (shape instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_4__.CircleCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_5__.ClosestLineJumpTable.CircleEdgeClosestLine(shape, this);\n }\n else if (shape instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_6__.PolygonCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_5__.ClosestLineJumpTable.PolygonEdgeClosestLine(shape, this).flip();\n }\n else if (shape instanceof EdgeCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_5__.ClosestLineJumpTable.EdgeEdgeClosestLine(this, shape);\n }\n else {\n throw new Error(`Polygon could not collide with unknown CollisionShape ${typeof shape}`);\n }\n }\n /**\n * @inheritdoc\n */\n collide(shape) {\n if (shape instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_4__.CircleCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_7__.CollisionJumpTable.CollideCircleEdge(shape, this);\n }\n else if (shape instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_6__.PolygonCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_7__.CollisionJumpTable.CollidePolygonEdge(shape, this);\n }\n else if (shape instanceof EdgeCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_7__.CollisionJumpTable.CollideEdgeEdge();\n }\n else {\n throw new Error(`Edge could not collide with unknown CollisionShape ${typeof shape}`);\n }\n }\n /**\n * Find the point on the collider furthest in the direction specified\n */\n getFurthestPoint(direction) {\n const transformedBegin = this._getTransformedBegin();\n const transformedEnd = this._getTransformedEnd();\n if (direction.dot(transformedBegin) > 0) {\n return transformedBegin;\n }\n else {\n return transformedEnd;\n }\n }\n _boundsFromBeginEnd(begin, end, padding = 10) {\n // A perfectly vertical or horizontal edge would have a bounds 0 width or height\n // this causes problems for the collision system so we give them some padding\n return new _BoundingBox__WEBPACK_IMPORTED_MODULE_8__.BoundingBox(Math.min(begin.x, end.x) - padding, Math.min(begin.y, end.y) - padding, Math.max(begin.x, end.x) + padding, Math.max(begin.y, end.y) + padding);\n }\n /**\n * Get the axis aligned bounding box for the edge collider in world space\n */\n get bounds() {\n const transformedBegin = this._getTransformedBegin();\n const transformedEnd = this._getTransformedEnd();\n return this._boundsFromBeginEnd(transformedBegin, transformedEnd);\n }\n /**\n * Get the axis aligned bounding box for the edge collider in local space\n */\n get localBounds() {\n return this._boundsFromBeginEnd(this.begin, this.end);\n }\n /**\n * Returns this edge represented as a line in world coordinates\n */\n asLine() {\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_9__.LineSegment(this._getTransformedBegin(), this._getTransformedEnd());\n }\n /**\n * Return this edge as a line in local line coordinates (relative to the position)\n */\n asLocalLine() {\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_9__.LineSegment(this.begin, this.end);\n }\n /**\n * Get the axis associated with the edge\n */\n get axes() {\n const e = this._getTransformedEnd().sub(this._getTransformedBegin());\n const edgeNormal = e.normal();\n const axes = [];\n axes.push(edgeNormal);\n axes.push(edgeNormal.negate());\n axes.push(edgeNormal.normal());\n axes.push(edgeNormal.normal().negate());\n return axes;\n }\n /**\n * Get the moment of inertia for an edge\n * https://en.wikipedia.org/wiki/List_of_moments_of_inertia\n */\n getInertia(mass) {\n const length = this.end.sub(this.begin).distance() / 2;\n return mass * length * length;\n }\n /**\n * @inheritdoc\n */\n update(transform) {\n var _a;\n this._transform = transform;\n const globalMat = (_a = transform.matrix) !== null && _a !== void 0 ? _a : this._globalMatrix;\n globalMat.clone(this._globalMatrix);\n this._globalMatrix.translate(this.offset.x, this.offset.y);\n }\n /**\n * Project the edge along a specified axis\n */\n project(axis) {\n const scalars = [];\n const points = [this._getTransformedBegin(), this._getTransformedEnd()];\n const len = points.length;\n for (let i = 0; i < len; i++) {\n scalars.push(points[i].dot(axis));\n }\n return new _Math_projection__WEBPACK_IMPORTED_MODULE_10__.Projection(Math.min.apply(Math, scalars), Math.max.apply(Math, scalars));\n }\n debug(ex, color) {\n const begin = this._getTransformedBegin();\n const end = this._getTransformedEnd();\n ex.drawLine(begin, end, color, 2);\n ex.drawCircle(begin, 2, color);\n ex.drawCircle(end, 2, color);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/PolygonCollider.ts\":\n/*!************************************************!*\\\n !*** ./Collision/Colliders/PolygonCollider.ts ***!\n \\************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PolygonCollider: () => (/* binding */ PolygonCollider)\n/* harmony export */ });\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _EdgeCollider__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./EdgeCollider */ \"./Collision/Colliders/EdgeCollider.ts\");\n/* harmony import */ var _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./CollisionJumpTable */ \"./Collision/Colliders/CollisionJumpTable.ts\");\n/* harmony import */ var _CircleCollider__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./CircleCollider */ \"./Collision/Colliders/CircleCollider.ts\");\n/* harmony import */ var _Math_projection__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../Math/projection */ \"./Math/projection.ts\");\n/* harmony import */ var _Math_line_segment__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../Math/line-segment */ \"./Math/line-segment.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math_ray__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../Math/ray */ \"./Math/ray.ts\");\n/* harmony import */ var _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./ClosestLineJumpTable */ \"./Collision/Colliders/ClosestLineJumpTable.ts\");\n/* harmony import */ var _Collider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Collider */ \"./Collision/Colliders/Collider.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../.. */ \"./Util/Log.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../.. */ \"./Math/util.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../.. */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../.. */ \"./Graphics/Debug.ts\");\n/* harmony import */ var _CompositeCollider__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var _Shape__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Shape */ \"./Collision/Colliders/Shape.ts\");\n/* harmony import */ var _Math_transform__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math/transform */ \"./Math/transform.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Polygon collider for detecting collisions\n */\nclass PolygonCollider extends _Collider__WEBPACK_IMPORTED_MODULE_0__.Collider {\n flagDirty() {\n this._localBoundsDirty = true;\n this._localSidesDirty = true;\n this._transformedPointsDirty = true;\n this._sidesDirty = true;\n }\n get normals() {\n return this._normals;\n }\n /**\n * Points in the polygon in order around the perimeter in local coordinates. These are relative from the body transform position.\n * Excalibur stores these in counter-clockwise order\n */\n set points(points) {\n if (points.length < 3) {\n throw new Error('PolygonCollider cannot be created with less that 3 points');\n }\n this._points = points;\n this._checkAndUpdateWinding(this._points);\n this._calculateNormals();\n this.flagDirty();\n }\n _calculateNormals() {\n const normals = [];\n for (let i = 0; i < this._points.length; i++) {\n normals.push(this._points[(i + 1) % this._points.length].sub(this._points[i]).normal());\n }\n this._normals = normals;\n }\n /**\n * Points in the polygon in order around the perimeter in local coordinates. These are relative from the body transform position.\n * Excalibur stores these in counter-clockwise order\n */\n get points() {\n return this._points;\n }\n get transform() {\n return this._transform;\n }\n constructor(options) {\n var _a;\n super();\n this._logger = ___WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this._transform = new _Math_transform__WEBPACK_IMPORTED_MODULE_2__.Transform();\n this._transformedPoints = [];\n this._sides = [];\n this._localSides = [];\n this._transformedPointsDirty = true;\n this._sidesDirty = true;\n this._localSidesDirty = true;\n this._localBoundsDirty = true;\n this.offset = (_a = options.offset) !== null && _a !== void 0 ? _a : _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero;\n this._transform.pos.x += this.offset.x;\n this._transform.pos.y += this.offset.y;\n this.points = options.points;\n if (!this.isConvex()) {\n if (!options.suppressConvexWarning) {\n this._logger.warn('Excalibur only supports convex polygon colliders and will not behave properly.' +\n 'Call PolygonCollider.triangulate() to build a new collider composed of smaller convex triangles');\n }\n }\n // calculate initial transformation\n this._calculateTransformation();\n }\n _checkAndUpdateWinding(points) {\n const counterClockwise = this._isCounterClockwiseWinding(points);\n if (!counterClockwise) {\n points.reverse();\n }\n }\n _isCounterClockwiseWinding(points) {\n // https://stackoverflow.com/a/1165943\n let sum = 0;\n for (let i = 0; i < points.length; i++) {\n sum += (points[(i + 1) % points.length].x - points[i].x) * (points[(i + 1) % points.length].y + points[i].y);\n }\n return sum < 0;\n }\n /**\n * Returns if the polygon collider is convex, Excalibur does not handle non-convex collision shapes.\n * Call {@apilink Polygon.triangulate} to generate a {@apilink CompositeCollider} from this non-convex shape\n */\n isConvex() {\n // From SO: https://stackoverflow.com/a/45372025\n if (this.points.length < 3) {\n return false;\n }\n let oldPoint = this.points[this.points.length - 2];\n let newPoint = this.points[this.points.length - 1];\n let direction = Math.atan2(newPoint.y - oldPoint.y, newPoint.x - oldPoint.x);\n let oldDirection = 0;\n let orientation = 0;\n let angleSum = 0;\n for (const [i, point] of this.points.entries()) {\n oldPoint = newPoint;\n oldDirection = direction;\n newPoint = point;\n direction = Math.atan2(newPoint.y - oldPoint.y, newPoint.x - oldPoint.x);\n if (oldPoint.equals(newPoint)) {\n return false; // repeat point\n }\n let angle = direction - oldDirection;\n if (angle <= -Math.PI) {\n angle += Math.PI * 2;\n }\n else if (angle > Math.PI) {\n angle -= Math.PI * 2;\n }\n if (i === 0) {\n if (angle === 0.0) {\n return false;\n }\n orientation = angle > 0 ? 1 : -1;\n }\n else {\n if (orientation * angle <= 0) {\n return false;\n }\n }\n angleSum += angle;\n }\n return Math.abs(Math.round(angleSum / (Math.PI * 2))) === 1;\n }\n /**\n * Tessellates the polygon into a triangle fan as a {@apilink CompositeCollider} of triangle polygons\n */\n tessellate() {\n const polygons = [];\n for (let i = 1; i < this.points.length - 2; i++) {\n polygons.push([this.points[0], this.points[i + 1], this.points[i + 2]]);\n }\n polygons.push([this.points[0], this.points[1], this.points[2]]);\n return new _CompositeCollider__WEBPACK_IMPORTED_MODULE_4__.CompositeCollider(polygons.map((points) => _Shape__WEBPACK_IMPORTED_MODULE_5__.Shape.Polygon(points)));\n }\n /**\n * Triangulate the polygon collider using the \"Ear Clipping\" algorithm.\n * Returns a new {@apilink CompositeCollider} made up of smaller triangles.\n */\n triangulate() {\n // https://www.youtube.com/watch?v=hTJFcHutls8\n if (this.points.length < 3) {\n throw Error('Invalid polygon');\n }\n const triangles = [];\n // algorithm likes clockwise\n const vertices = [...this.points].reverse();\n let vertexCount = vertices.length;\n /**\n * Returns the previous index based on the current vertex\n */\n function getPrevIndex(index) {\n return index === 0 ? vertexCount - 1 : index - 1;\n }\n /**\n * Retrieves the next index based on the current vertex\n */\n function getNextIndex(index) {\n return index === vertexCount - 1 ? 0 : index + 1;\n }\n /**\n * Whether or not the angle at this vertex index is convex\n */\n function isConvex(index) {\n const prev = getPrevIndex(index);\n const next = getNextIndex(index);\n const va = vertices[prev];\n const vb = vertices[index];\n const vc = vertices[next];\n // Check convexity\n const leftArm = va.sub(vb);\n const rightArm = vc.sub(vb);\n // Positive cross product is convex\n if (leftArm.cross(rightArm) < 0) {\n return false;\n }\n return true;\n }\n const convexVertices = vertices.map((_, i) => isConvex(i));\n /**\n * Quick test for point in triangle\n */\n function isPointInTriangle(point, a, b, c) {\n const ab = b.sub(a);\n const bc = c.sub(b);\n const ca = a.sub(c);\n const ap = point.sub(a);\n const bp = point.sub(b);\n const cp = point.sub(c);\n const cross1 = ab.cross(ap);\n const cross2 = bc.cross(bp);\n const cross3 = ca.cross(cp);\n if (cross1 > 0 || cross2 > 0 || cross3 > 0) {\n return false;\n }\n return true;\n }\n /**\n * Calculate the area of the triangle\n */\n // function triangleArea(a: Vector, b: Vector, c: Vector) {\n // return Math.abs(a.x * (b.y - c.y) + b.x * (c.y - a.y) + c.x * (a.y - c.y))/2;\n // }\n /**\n * Find the next suitable ear tip\n */\n function findEarTip() {\n for (let i = 0; i < vertexCount; i++) {\n if (convexVertices[i]) {\n const prev = getPrevIndex(i);\n const next = getNextIndex(i);\n const va = vertices[prev];\n const vb = vertices[i];\n const vc = vertices[next];\n let isEar = true;\n // Check that if any vertices are in the triangle a, b, c\n for (let j = 0; j < vertexCount; j++) {\n // We can skip these verts because they are the triangle we are testing\n if (j === i || j === prev || j === next) {\n continue;\n }\n const point = vertices[j];\n if (isPointInTriangle(point, va, vb, vc)) {\n isEar = false;\n break;\n }\n }\n // Add ear to polygon list and remove from list\n if (isEar) {\n return i;\n }\n }\n }\n // Fall back to any convex vertex\n for (let i = 0; i < vertexCount; i++) {\n if (convexVertices[i]) {\n return i;\n }\n }\n // bail and return the first one?\n return 0;\n }\n /**\n * Cut the ear and produce a triangle, update internal state\n */\n function cutEarTip(index) {\n const prev = getPrevIndex(index);\n const next = getNextIndex(index);\n const va = vertices[prev];\n const vb = vertices[index];\n const vc = vertices[next];\n // Clockwise winding\n // if (triangleArea(va, vb, vc) > 0) {\n triangles.push([va, vb, vc]);\n // }\n vertices.splice(index, 1);\n convexVertices.splice(index, 1);\n vertexCount--;\n }\n // Loop over all the vertices finding ears\n while (vertexCount > 3) {\n const earIndex = findEarTip();\n cutEarTip(earIndex);\n // reclassify vertices\n for (let i = 0; i < vertexCount; i++) {\n convexVertices[i] = isConvex(i);\n }\n }\n // Last triangle after the loop\n triangles.push([vertices[0], vertices[1], vertices[2]]);\n // FIXME: there is a colinear triangle that sneaks in here sometimes\n return new _CompositeCollider__WEBPACK_IMPORTED_MODULE_4__.CompositeCollider(triangles.map((points) => _Shape__WEBPACK_IMPORTED_MODULE_5__.Shape.Polygon(points, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero, true)));\n }\n /**\n * Returns a clone of this ConvexPolygon, not associated with any collider\n */\n clone() {\n return new PolygonCollider({\n offset: this.offset.clone(),\n points: this.points.map((p) => p.clone())\n });\n }\n /**\n * Returns the world position of the collider, which is the current body transform plus any defined offset\n */\n get worldPos() {\n return this._transform.pos;\n }\n /**\n * Get the center of the collider in world coordinates\n */\n get center() {\n return this.bounds.center;\n }\n /**\n * Calculates the underlying transformation from the body relative space to world space\n */\n _calculateTransformation() {\n const points = this.points;\n const len = points.length;\n this._transformedPoints.length = 0; // clear out old transform\n for (let i = 0; i < len; i++) {\n this._transformedPoints[i] = this._transform.apply(points[i].clone());\n }\n }\n /**\n * Gets the points that make up the polygon in world space, from actor relative space (if specified)\n */\n getTransformedPoints() {\n if (this._transformedPointsDirty) {\n this._calculateTransformation();\n this._transformedPointsDirty = false;\n }\n return this._transformedPoints;\n }\n /**\n * Gets the sides of the polygon in world space\n */\n getSides() {\n if (this._sidesDirty) {\n const lines = [];\n const points = this.getTransformedPoints();\n const len = points.length;\n for (let i = 0; i < len; i++) {\n // This winding is important\n lines.push(new _Math_line_segment__WEBPACK_IMPORTED_MODULE_6__.LineSegment(points[i], points[(i + 1) % len]));\n }\n this._sides = lines;\n this._sidesDirty = false;\n }\n return this._sides;\n }\n /**\n * Returns the local coordinate space sides\n */\n getLocalSides() {\n if (this._localSidesDirty) {\n const lines = [];\n const points = this.points;\n const len = points.length;\n for (let i = 0; i < len; i++) {\n // This winding is important\n lines.push(new _Math_line_segment__WEBPACK_IMPORTED_MODULE_6__.LineSegment(points[i], points[(i + 1) % len]));\n }\n this._localSides = lines;\n this._localSidesDirty = false;\n }\n return this._localSides;\n }\n /**\n * Given a direction vector find the world space side that is most in that direction\n * @param direction\n */\n findSide(direction) {\n const sides = this.getSides();\n let bestSide = sides[0];\n let maxDistance = -Number.MAX_VALUE;\n for (let side = 0; side < sides.length; side++) {\n const currentSide = sides[side];\n const sideNormal = currentSide.normal();\n const mostDirection = sideNormal.dot(direction);\n if (mostDirection > maxDistance) {\n bestSide = currentSide;\n maxDistance = mostDirection;\n }\n }\n return bestSide;\n }\n /**\n * Given a direction vector find the local space side that is most in that direction\n * @param direction\n */\n findLocalSide(direction) {\n const sides = this.getLocalSides();\n let bestSide = sides[0];\n let maxDistance = -Number.MAX_VALUE;\n for (let side = 0; side < sides.length; side++) {\n const currentSide = sides[side];\n const sideNormal = currentSide.normal();\n const mostDirection = sideNormal.dot(direction);\n if (mostDirection > maxDistance) {\n bestSide = currentSide;\n maxDistance = mostDirection;\n }\n }\n return bestSide;\n }\n /**\n * Get the axis associated with the convex polygon\n */\n get axes() {\n const axes = [];\n const sides = this.getSides();\n for (let i = 0; i < sides.length; i++) {\n axes.push(sides[i].normal());\n }\n return axes;\n }\n /**\n * Updates the transform for the collision geometry\n *\n * Collision geometry (points/bounds) will not change until this is called.\n * @param transform\n */\n update(transform) {\n if (transform) {\n // This change means an update must be performed in order for geometry to update\n transform.cloneWithParent(this._transform);\n this._transformedPointsDirty = true;\n this._sidesDirty = true;\n if (this.offset.x !== 0 || this.offset.y !== 0) {\n this._transform.pos.x += this.offset.x;\n this._transform.pos.y += this.offset.y;\n }\n if (this._transform.isMirrored()) {\n // negative transforms really mess with things in collision local space\n // flatten out the negatives by applying to geometry\n this.points = this.points.map((p) => (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(p.x * (0,___WEBPACK_IMPORTED_MODULE_7__.sign)(this._transform.scale.x), p.y * (0,___WEBPACK_IMPORTED_MODULE_7__.sign)(this._transform.scale.y)));\n this._transform.scale.x = Math.abs(this._transform.scale.x);\n this._transform.scale.y = Math.abs(this._transform.scale.y);\n }\n }\n }\n /**\n * Tests if a point is contained in this collider in world space\n */\n contains(point) {\n // Always cast to the right, as long as we cast in a consistent fixed direction we\n // will be fine\n const localPoint = this._transform.applyInverse(point);\n const testRay = new _Math_ray__WEBPACK_IMPORTED_MODULE_8__.Ray(localPoint, new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(1, 0));\n let intersectCount = 0;\n const sides = this.getLocalSides();\n for (let sideIndex = 0; sideIndex < sides.length; sideIndex++) {\n const side = sides[sideIndex];\n if (testRay.intersect(side) >= 0) {\n intersectCount++;\n }\n }\n if (intersectCount % 2 === 0) {\n return false;\n }\n return true;\n }\n getClosestLineBetween(collider) {\n if (collider instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_9__.CircleCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_10__.ClosestLineJumpTable.PolygonCircleClosestLine(this, collider);\n }\n else if (collider instanceof PolygonCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_10__.ClosestLineJumpTable.PolygonPolygonClosestLine(this, collider);\n }\n else if (collider instanceof _EdgeCollider__WEBPACK_IMPORTED_MODULE_11__.EdgeCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_10__.ClosestLineJumpTable.PolygonEdgeClosestLine(this, collider);\n }\n else {\n throw new Error(`Polygon could not collide with unknown CollisionShape ${typeof collider}`);\n }\n }\n /**\n * Returns a collision contact if the 2 colliders collide, otherwise collide will\n * return null.\n * @param collider\n */\n collide(collider) {\n if (collider instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_9__.CircleCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_12__.CollisionJumpTable.CollideCirclePolygon(collider, this);\n }\n else if (collider instanceof PolygonCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_12__.CollisionJumpTable.CollidePolygonPolygon(this, collider);\n }\n else if (collider instanceof _EdgeCollider__WEBPACK_IMPORTED_MODULE_11__.EdgeCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_12__.CollisionJumpTable.CollidePolygonEdge(this, collider);\n }\n else {\n throw new Error(`Polygon could not collide with unknown CollisionShape ${typeof collider}`);\n }\n }\n /**\n * Find the point on the collider furthest in the direction specified\n */\n getFurthestPoint(direction) {\n const pts = this.getTransformedPoints();\n let furthestPoint = null;\n let maxDistance = -Number.MAX_VALUE;\n for (let i = 0; i < pts.length; i++) {\n const distance = direction.dot(pts[i]);\n if (distance > maxDistance) {\n maxDistance = distance;\n furthestPoint = pts[i];\n }\n }\n return furthestPoint;\n }\n /**\n * Find the local point on the collider furthest in the direction specified\n * @param direction\n */\n getFurthestLocalPoint(direction) {\n const pts = this.points;\n let furthestPoint = pts[0];\n let maxDistance = -Number.MAX_VALUE;\n for (let i = 0; i < pts.length; i++) {\n const distance = direction.dot(pts[i]);\n if (distance > maxDistance) {\n maxDistance = distance;\n furthestPoint = pts[i];\n }\n }\n return furthestPoint;\n }\n /**\n * Finds the closes face to the point using perpendicular distance\n * @param point point to test against polygon\n */\n getClosestFace(point) {\n const sides = this.getSides();\n let min = Number.POSITIVE_INFINITY;\n let faceIndex = -1;\n let distance = -1;\n for (let i = 0; i < sides.length; i++) {\n const dist = sides[i].distanceToPoint(point);\n if (dist < min) {\n min = dist;\n faceIndex = i;\n distance = dist;\n }\n }\n if (faceIndex !== -1) {\n return {\n distance: sides[faceIndex].normal().scale(distance),\n face: sides[faceIndex]\n };\n }\n return null;\n }\n /**\n * Get the axis aligned bounding box for the polygon collider in world coordinates\n */\n get bounds() {\n return this.localBounds.transform(this._transform.matrix);\n }\n /**\n * Get the axis aligned bounding box for the polygon collider in local coordinates\n */\n get localBounds() {\n if (this._localBoundsDirty) {\n this._localBounds = _BoundingBox__WEBPACK_IMPORTED_MODULE_13__.BoundingBox.fromPoints(this.points);\n this._localBoundsDirty = false;\n }\n return this._localBounds;\n }\n /**\n * Get the moment of inertia for an arbitrary polygon\n * https://en.wikipedia.org/wiki/List_of_moments_of_inertia\n */\n getInertia(mass) {\n if (this._cachedMass === mass && this._cachedInertia) {\n return this._cachedInertia;\n }\n let numerator = 0;\n let denominator = 0;\n const points = this.points;\n for (let i = 0; i < points.length; i++) {\n const iplusone = (i + 1) % points.length;\n const crossTerm = points[iplusone].cross(points[i]);\n numerator += crossTerm * (points[i].dot(points[i]) + points[i].dot(points[iplusone]) + points[iplusone].dot(points[iplusone]));\n denominator += crossTerm;\n }\n this._cachedMass = mass;\n return (this._cachedInertia = (mass / 6) * (numerator / denominator));\n }\n /**\n * Casts a ray into the polygon and returns a vector representing the point of contact (in world space) or null if no collision.\n */\n rayCast(ray, max = Infinity) {\n var _a;\n // find the minimum contact time greater than 0\n // contact times less than 0 are behind the ray and we don't want those\n const sides = this.getSides();\n const len = sides.length;\n let minContactTime = Number.MAX_VALUE;\n let contactSide;\n let contactIndex = -1;\n for (let i = 0; i < len; i++) {\n const contactTime = ray.intersect(sides[i]);\n if (contactTime >= 0 && contactTime < minContactTime && contactTime <= max) {\n minContactTime = contactTime;\n contactSide = sides[i];\n contactIndex = i;\n }\n }\n // contact was found\n if (contactIndex >= 0) {\n return {\n collider: this,\n distance: minContactTime,\n body: (_a = this.owner) === null || _a === void 0 ? void 0 : _a.get(___WEBPACK_IMPORTED_MODULE_14__.BodyComponent),\n point: ray.getPoint(minContactTime),\n normal: contactSide.normal()\n };\n }\n // no contact found\n return null;\n }\n /**\n * Project the edges of the polygon along a specified axis\n */\n project(axis) {\n const points = this.getTransformedPoints();\n const len = points.length;\n let min = Number.MAX_VALUE;\n let max = -Number.MAX_VALUE;\n for (let i = 0; i < len; i++) {\n const scalar = points[i].dot(axis);\n min = Math.min(min, scalar);\n max = Math.max(max, scalar);\n }\n return new _Math_projection__WEBPACK_IMPORTED_MODULE_15__.Projection(min, max);\n }\n debug(ex, color, options) {\n const points = this.getTransformedPoints();\n ___WEBPACK_IMPORTED_MODULE_16__.Debug.drawPolygon(points, { color });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/SeparatingAxis.ts\":\n/*!***********************************************!*\\\n !*** ./Collision/Colliders/SeparatingAxis.ts ***!\n \\***********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SeparatingAxis: () => (/* binding */ SeparatingAxis),\n/* harmony export */ SeparationInfo: () => (/* binding */ SeparationInfo)\n/* harmony export */ });\n/* harmony import */ var _Math_line_segment__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/line-segment */ \"./Math/line-segment.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math/affine-matrix */ \"./Math/affine-matrix.ts\");\n/* harmony import */ var _Util_Pool__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Util/Pool */ \"./Util/Pool.ts\");\n\n\n\n\n/**\n * Specific information about a contact and it's separation\n */\nclass SeparationInfo {\n constructor() {\n /**\n * Axis of separation from the collider's perspective\n */\n this.axis = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n /**\n * Local axis of separation from the collider's perspective\n */\n this.localAxis = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n /**\n * Side of separation (reference) from the collider's perspective\n */\n this.side = new _Math_line_segment__WEBPACK_IMPORTED_MODULE_1__.LineSegment((0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0), (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0));\n /**\n * Local side of separation (reference) from the collider's perspective\n */\n this.localSide = new _Math_line_segment__WEBPACK_IMPORTED_MODULE_1__.LineSegment((0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0), (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0));\n /**\n * Point on collider B (incident point)\n */\n this.point = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n /**\n * Local point on collider B (incident point)\n */\n this.localPoint = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n }\n}\nclass SeparatingAxis {\n static findPolygonPolygonSeparation(polyA, polyB) {\n // if polyB has 0 scale we need to hop back to degenerate separation\n if (polyB.transform.matrix.determinant() === 0) {\n return SeparatingAxis.findPolygonPolygonSeparationDegenerate(polyA, polyB);\n }\n // Multi contact from SAT\n // https://gamedev.stackexchange.com/questions/111390/multiple-contacts-for-sat-collision-detection\n // do a SAT test to find a min axis if it exists\n let bestSeparation = -Number.MAX_VALUE;\n let bestSideIndex = -1;\n let localPoint;\n // Work inside polyB reference frame\n // inv polyB converts to local space from polyA world space\n const toPolyBSpace = polyB.transform.inverse.multiply(polyA.transform.matrix, SeparatingAxis._SCRATCH_MATRIX);\n const toPolyBSpaceRotation = toPolyBSpace.getRotation();\n const normalsA = polyA.normals;\n const pointsA = polyA.points;\n const pointsB = polyB.points;\n for (let pointsAIndex = 0; pointsAIndex < pointsA.length; pointsAIndex++) {\n const normal = normalsA[pointsAIndex].rotate(toPolyBSpaceRotation, SeparatingAxis._ZERO, SeparatingAxis._SCRATCH_NORMAL);\n const point = toPolyBSpace.multiply(pointsA[pointsAIndex], SeparatingAxis._SCRATCH_POINT);\n // For every point in polyB\n // We want to see how much overlap there is on the axis provided by the normal\n // We want to find the minimum overlap among all points\n let smallestPointDistance = Number.MAX_VALUE;\n let smallestLocalPoint;\n for (let pointsBIndex = 0; pointsBIndex < pointsB.length; pointsBIndex++) {\n const distance = normal.dot(pointsB[pointsBIndex].sub(point, SeparatingAxis._SCRATCH_SUB_POINT));\n if (distance < smallestPointDistance) {\n smallestPointDistance = distance;\n smallestLocalPoint = pointsB[pointsBIndex];\n }\n }\n // We take the maximum overlap as the separation between the\n // A negative separation means there were no gaps between the two shapes\n if (smallestPointDistance > bestSeparation) {\n bestSeparation = smallestPointDistance;\n bestSideIndex = pointsAIndex;\n localPoint = smallestLocalPoint;\n }\n }\n // TODO can we avoid applying world space transforms?\n const bestSide2 = (bestSideIndex + 1) % pointsA.length;\n const separationInfo = SeparatingAxis.SeparationPool.get();\n separationInfo.collider = polyA;\n separationInfo.separation = bestSeparation;\n if (bestSeparation > 0) {\n // early out because if separation is > 0 then no local point\n return separationInfo;\n }\n normalsA[bestSideIndex].clone(separationInfo.localAxis);\n normalsA[bestSideIndex].rotate(polyA.transform.rotation, SeparatingAxis._ZERO, separationInfo.axis);\n polyA.transform.matrix.multiply(pointsA[bestSideIndex], separationInfo.side.begin);\n polyA.transform.matrix.multiply(pointsA[bestSide2], separationInfo.side.end);\n polyB.transform.matrix.multiply(localPoint, separationInfo.point);\n separationInfo.sideId = bestSideIndex;\n localPoint.clone(separationInfo.localPoint);\n pointsA[bestSideIndex].clone(separationInfo.localSide.begin);\n pointsA[bestSide2].clone(separationInfo.localSide.end);\n return separationInfo;\n }\n static findCirclePolygonSeparation(circle, polygon) {\n const axes = polygon.axes;\n const pc = polygon.center;\n // Special SAT with circles\n const polyDir = pc.sub(circle.worldPos);\n const closestPointOnPoly = polygon.getFurthestPoint(polyDir.negate());\n axes.push(closestPointOnPoly.sub(circle.worldPos).normalize());\n let minOverlap = Number.MAX_VALUE;\n let minAxis = null;\n let minIndex = -1;\n for (let i = 0; i < axes.length; i++) {\n const proj1 = polygon.project(axes[i]);\n const proj2 = circle.project(axes[i]);\n const overlap = proj1.getOverlap(proj2);\n if (overlap <= 0) {\n return null;\n }\n else {\n if (overlap < minOverlap) {\n minOverlap = overlap;\n minAxis = axes[i];\n minIndex = i;\n }\n }\n }\n if (minIndex < 0) {\n return null;\n }\n return minAxis.normalize().scale(minOverlap);\n }\n static findPolygonPolygonSeparationDegenerate(polyA, polyB) {\n let bestSeparation = -Number.MAX_VALUE;\n let bestSide = null;\n let bestAxis = null;\n let bestSideIndex = -1;\n let bestOtherPoint = null;\n const sides = polyA.getSides();\n const localSides = polyA.getLocalSides();\n for (let i = 0; i < sides.length; i++) {\n const side = sides[i];\n const axis = side.normal();\n const vertB = polyB.getFurthestPoint(axis.negate());\n // Separation on side i's axis\n // We are looking for the largest separation between poly A's sides\n const vertSeparation = side.distanceToPoint(vertB, true);\n if (vertSeparation > bestSeparation) {\n bestSeparation = vertSeparation;\n bestSide = side;\n bestAxis = axis;\n bestSideIndex = i;\n bestOtherPoint = vertB;\n }\n }\n return {\n collider: polyA,\n separation: bestAxis ? bestSeparation : 99,\n axis: bestAxis,\n side: bestSide,\n localSide: localSides[bestSideIndex],\n sideId: bestSideIndex,\n point: bestOtherPoint,\n localPoint: bestAxis ? polyB.getFurthestLocalPoint(bestAxis.negate()) : null\n };\n }\n}\nSeparatingAxis.SeparationPool = new _Util_Pool__WEBPACK_IMPORTED_MODULE_2__.Pool(() => new SeparationInfo(), (i) => i, // no recycle\n500);\nSeparatingAxis._ZERO = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\nSeparatingAxis._SCRATCH_POINT = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\nSeparatingAxis._SCRATCH_SUB_POINT = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\nSeparatingAxis._SCRATCH_NORMAL = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\nSeparatingAxis._SCRATCH_MATRIX = _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_3__.AffineMatrix.identity();\nSeparatingAxis.SeparationPool.disableWarnings = true;\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/Shape.ts\":\n/*!**************************************!*\\\n !*** ./Collision/Colliders/Shape.ts ***!\n \\**************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Shape: () => (/* binding */ Shape)\n/* harmony export */ });\n/* harmony import */ var _PolygonCollider__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./PolygonCollider */ \"./Collision/Colliders/PolygonCollider.ts\");\n/* harmony import */ var _CircleCollider__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./CircleCollider */ \"./Collision/Colliders/CircleCollider.ts\");\n/* harmony import */ var _EdgeCollider__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./EdgeCollider */ \"./Collision/Colliders/EdgeCollider.ts\");\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _CompositeCollider__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../.. */ \"./Util/Log.ts\");\n\n\n\n\n\n\n\n/**\n * Excalibur helper for defining colliders quickly\n */\nclass Shape {\n /**\n * Creates a box collider, under the hood defines a {@apilink PolygonCollider} collider\n * @param width Width of the box\n * @param height Height of the box\n * @param anchor Anchor of the box (default (.5, .5)) which positions the box relative to the center of the collider's position\n * @param offset Optional offset relative to the collider in local coordinates\n */\n static Box(width, height, anchor = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Half, offset = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero) {\n return new _PolygonCollider__WEBPACK_IMPORTED_MODULE_1__.PolygonCollider({\n points: new _BoundingBox__WEBPACK_IMPORTED_MODULE_2__.BoundingBox(-width * anchor.x, -height * anchor.y, width - width * anchor.x, height - height * anchor.y).getPoints(),\n offset: offset\n });\n }\n /**\n * Creates a new {@apilink PolygonCollider | `arbitrary polygon`} collider\n *\n * PolygonColliders are useful for creating convex polygon shapes\n * @param points Points specified in counter clockwise\n * @param offset Optional offset relative to the collider in local coordinates\n */\n static Polygon(points, offset = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero, suppressConvexWarning = false) {\n return new _PolygonCollider__WEBPACK_IMPORTED_MODULE_1__.PolygonCollider({\n points: points,\n offset: offset,\n suppressConvexWarning\n });\n }\n /**\n * Creates a new {@apilink CircleCollider | `circle`} collider\n *\n * Circle colliders are useful for balls, or to make collisions more forgiving on sharp edges\n * @param radius Radius of the circle collider\n * @param offset Optional offset relative to the collider in local coordinates\n */\n static Circle(radius, offset = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero) {\n return new _CircleCollider__WEBPACK_IMPORTED_MODULE_3__.CircleCollider({\n radius: radius,\n offset: offset\n });\n }\n /**\n * Creates a new {@apilink EdgeCollider | `edge`} collider\n *\n * Edge colliders are useful for floors, walls, and other barriers\n * @param begin Beginning of the edge in local coordinates to the collider\n * @param end Ending of the edge in local coordinates to the collider\n */\n static Edge(begin, end) {\n return new _EdgeCollider__WEBPACK_IMPORTED_MODULE_4__.EdgeCollider({\n begin: begin,\n end: end\n });\n }\n /**\n * Creates a new capsule shaped {@apilink CompositeCollider} using 2 circles and a box\n *\n * Capsule colliders are useful for platformers with incline or jagged floors to have a smooth\n * player experience.\n * @param width\n * @param height\n * @param offset Optional offset\n */\n static Capsule(width, height, offset = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero) {\n const logger = ___WEBPACK_IMPORTED_MODULE_5__.Logger.getInstance();\n if (width === height) {\n logger.warn('A capsule collider with equal width and height is a circle, consider using a ex.Shape.Circle or ex.CircleCollider');\n }\n const vertical = height >= width;\n if (vertical) {\n // height > width, if equal maybe use a circle\n const capsule = new _CompositeCollider__WEBPACK_IMPORTED_MODULE_6__.CompositeCollider([\n Shape.Circle(width / 2, (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, -height / 2 + width / 2).add(offset)),\n Shape.Box(width, height - width, _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Half, offset),\n Shape.Circle(width / 2, (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, height / 2 - width / 2).add(offset))\n ]);\n return capsule;\n }\n else {\n // width > height, if equal maybe use a circle\n const capsule = new _CompositeCollider__WEBPACK_IMPORTED_MODULE_6__.CompositeCollider([\n Shape.Circle(height / 2, (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(-width / 2 + height / 2, 0).add(offset)),\n Shape.Box(width - height, height, _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Half, offset),\n Shape.Circle(height / 2, (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(width / 2 - height / 2, 0).add(offset))\n ]);\n return capsule;\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/CollisionSystem.ts\":\n/*!**************************************!*\\\n !*** ./Collision/CollisionSystem.ts ***!\n \\**************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CollisionSystem: () => (/* binding */ CollisionSystem)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Priority.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _SolverStrategy__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./SolverStrategy */ \"./Collision/SolverStrategy.ts\");\n/* harmony import */ var _Solver_ArcadeSolver__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Solver/ArcadeSolver */ \"./Collision/Solver/ArcadeSolver.ts\");\n/* harmony import */ var _Solver_RealisticSolver__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Solver/RealisticSolver */ \"./Collision/Solver/RealisticSolver.ts\");\n/* harmony import */ var _ColliderComponent__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./ColliderComponent */ \"./Collision/ColliderComponent.ts\");\n/* harmony import */ var _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Colliders/CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var _Collision_Side__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../Collision/Side */ \"./Collision/Side.ts\");\n/* harmony import */ var _Colliders_SeparatingAxis__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Colliders/SeparatingAxis */ \"./Collision/Colliders/SeparatingAxis.ts\");\n/* harmony import */ var _MotionSystem__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./MotionSystem */ \"./Collision/MotionSystem.ts\");\n/* harmony import */ var _Detection_Pair__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Detection/Pair */ \"./Collision/Detection/Pair.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass CollisionSystem extends _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.System {\n get _processor() {\n return this._physics.collisionProcessor;\n }\n constructor(world, _physics) {\n super();\n this._physics = _physics;\n this.systemType = _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.SystemType.Update;\n this._configDirty = false;\n this._lastFrameContacts = new Map();\n this._currentFrameContacts = new Map();\n this._arcadeSolver = new _Solver_ArcadeSolver__WEBPACK_IMPORTED_MODULE_1__.ArcadeSolver(_physics.config.arcade);\n this._realisticSolver = new _Solver_RealisticSolver__WEBPACK_IMPORTED_MODULE_2__.RealisticSolver(_physics.config.realistic);\n this._physics.$configUpdate.subscribe(() => (this._configDirty = true));\n this._trackCollider = (c) => this._processor.track(c);\n this._untrackCollider = (c) => this._processor.untrack(c);\n this.query = world.query([_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__.TransformComponent, _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_4__.MotionComponent, _ColliderComponent__WEBPACK_IMPORTED_MODULE_5__.ColliderComponent]);\n this.query.entityAdded$.subscribe((e) => {\n const colliderComponent = e.get(_ColliderComponent__WEBPACK_IMPORTED_MODULE_5__.ColliderComponent);\n colliderComponent.$colliderAdded.subscribe(this._trackCollider);\n colliderComponent.$colliderRemoved.subscribe(this._untrackCollider);\n const collider = colliderComponent.get();\n if (collider) {\n this._processor.track(collider);\n }\n });\n this.query.entityRemoved$.subscribe((e) => {\n const colliderComponent = e.get(_ColliderComponent__WEBPACK_IMPORTED_MODULE_5__.ColliderComponent);\n const collider = colliderComponent.get();\n if (colliderComponent && collider) {\n this._processor.untrack(collider);\n }\n });\n this._motionSystem = world.get(_MotionSystem__WEBPACK_IMPORTED_MODULE_6__.MotionSystem);\n }\n initialize(world, scene) {\n this._engine = scene.engine;\n }\n update(elapsed) {\n var _a, _b, _c, _d;\n if (!this._physics.config.enabled) {\n return;\n }\n // TODO do we need to do this every frame?\n // Collect up all the colliders and update them\n let colliders = [];\n for (let entityIndex = 0; entityIndex < this.query.entities.length; entityIndex++) {\n const entity = this.query.entities[entityIndex];\n const colliderComp = entity.get(_ColliderComponent__WEBPACK_IMPORTED_MODULE_5__.ColliderComponent);\n const collider = colliderComp === null || colliderComp === void 0 ? void 0 : colliderComp.get();\n if (colliderComp && ((_a = colliderComp.owner) === null || _a === void 0 ? void 0 : _a.isActive) && collider) {\n colliderComp.update();\n // Flatten composite colliders\n if (collider instanceof _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_7__.CompositeCollider) {\n const compositeColliders = collider.getColliders();\n if (!collider.compositeStrategy) {\n collider.compositeStrategy = this._physics.config.colliders.compositeStrategy;\n }\n colliders = colliders.concat(compositeColliders);\n }\n else {\n colliders.push(collider);\n }\n }\n }\n // Update the spatial partitioning data structures\n // TODO if collider invalid it will break the processor\n // TODO rename \"update\" to something more specific\n this._processor.update(colliders, elapsed);\n // Run broadphase on all colliders and locates potential collisions\n let pairs = this._processor.broadphase(colliders, elapsed);\n this._currentFrameContacts.clear();\n // Given possible pairs find actual contacts\n let contacts = []; // = this._processor.narrowphase(pairs, this._engine?.debug?.stats?.currFrame);\n const solver = this.getSolver();\n // Solve, this resolves the position/velocity so entities aren't overlapping\n const substep = this._physics.config.substep;\n for (let step = 0; step < substep; step++) {\n if (step > 0) {\n // first step is run by the MotionSystem when configured, so skip\n this._motionSystem.update(elapsed);\n }\n // Re-use pairs from previous collision\n if (contacts.length) {\n pairs = contacts.map((c) => new _Detection_Pair__WEBPACK_IMPORTED_MODULE_8__.Pair(c.colliderA, c.colliderB));\n }\n if (pairs.length) {\n contacts = this._processor.narrowphase(pairs, (_d = (_c = (_b = this._engine) === null || _b === void 0 ? void 0 : _b.debug) === null || _c === void 0 ? void 0 : _c.stats) === null || _d === void 0 ? void 0 : _d.currFrame);\n contacts = solver.solve(contacts);\n // Record contacts for start/end\n for (const contact of contacts) {\n if (contact.isCanceled()) {\n continue;\n }\n // Process composite ids, things with the same composite id are treated as the same collider for start/end\n const index = contact.id.indexOf('|');\n if (index > 0) {\n const compositeId = contact.id.substring(index + 1);\n this._currentFrameContacts.set(compositeId, contact);\n }\n else {\n this._currentFrameContacts.set(contact.id, contact);\n }\n }\n }\n }\n // Emit contact start/end events\n this.runContactStartEnd();\n // reset the last frame cache\n this._lastFrameContacts.clear();\n // Keep track of collisions contacts that have started or ended\n this._lastFrameContacts = new Map(this._currentFrameContacts);\n // Process deferred collider removals\n for (const entity of this.query.entities) {\n const collider = entity.get(_ColliderComponent__WEBPACK_IMPORTED_MODULE_5__.ColliderComponent);\n if (collider) {\n collider.processColliderRemoval();\n }\n }\n }\n postupdate() {\n _Colliders_SeparatingAxis__WEBPACK_IMPORTED_MODULE_9__.SeparatingAxis.SeparationPool.done();\n }\n getSolver() {\n if (this._configDirty) {\n this._configDirty = false;\n this._arcadeSolver = new _Solver_ArcadeSolver__WEBPACK_IMPORTED_MODULE_1__.ArcadeSolver(this._physics.config.arcade);\n this._realisticSolver = new _Solver_RealisticSolver__WEBPACK_IMPORTED_MODULE_2__.RealisticSolver(this._physics.config.realistic);\n }\n return this._physics.config.solver === _SolverStrategy__WEBPACK_IMPORTED_MODULE_10__.SolverStrategy.Realistic ? this._realisticSolver : this._arcadeSolver;\n }\n debug(ex) {\n this._processor.debug(ex, 0);\n }\n runContactStartEnd() {\n // If composite colliders are 'together' collisions may have a duplicate id because we want to treat those as a singular start/end\n for (const [id, c] of this._currentFrameContacts) {\n // find all new contacts\n if (!this._lastFrameContacts.has(id)) {\n const colliderA = c.colliderA;\n const colliderB = c.colliderB;\n const side = _Collision_Side__WEBPACK_IMPORTED_MODULE_11__.Side.fromDirection(c.mtv);\n const opposite = _Collision_Side__WEBPACK_IMPORTED_MODULE_11__.Side.getOpposite(side);\n colliderA.events.emit('collisionstart', new _Events__WEBPACK_IMPORTED_MODULE_12__.CollisionStartEvent(colliderA, colliderB, side, c));\n colliderA.events.emit('contactstart', new _Events__WEBPACK_IMPORTED_MODULE_12__.ContactStartEvent(colliderA, colliderB, side, c));\n colliderB.events.emit('collisionstart', new _Events__WEBPACK_IMPORTED_MODULE_12__.CollisionStartEvent(colliderB, colliderA, opposite, c));\n colliderB.events.emit('contactstart', new _Events__WEBPACK_IMPORTED_MODULE_12__.ContactStartEvent(colliderB, colliderA, opposite, c));\n }\n }\n // find all contacts that have ceased\n for (const [id, c] of this._lastFrameContacts) {\n if (!this._currentFrameContacts.has(id)) {\n const colliderA = c.colliderA;\n const colliderB = c.colliderB;\n const side = _Collision_Side__WEBPACK_IMPORTED_MODULE_11__.Side.fromDirection(c.mtv);\n const opposite = _Collision_Side__WEBPACK_IMPORTED_MODULE_11__.Side.getOpposite(side);\n colliderA.events.emit('collisionend', new _Events__WEBPACK_IMPORTED_MODULE_12__.CollisionEndEvent(colliderA, colliderB, side, c));\n colliderA.events.emit('contactend', new _Events__WEBPACK_IMPORTED_MODULE_12__.ContactEndEvent(colliderA, colliderB, side, c));\n colliderB.events.emit('collisionend', new _Events__WEBPACK_IMPORTED_MODULE_12__.CollisionEndEvent(colliderB, colliderA, opposite, c));\n colliderB.events.emit('contactend', new _Events__WEBPACK_IMPORTED_MODULE_12__.ContactEndEvent(colliderB, colliderA, opposite, c));\n }\n }\n }\n}\nCollisionSystem.priority = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_13__.SystemPriority.Higher;\n\n\n/***/ }),\n\n/***/ \"./Collision/CollisionType.ts\":\n/*!************************************!*\\\n !*** ./Collision/CollisionType.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CollisionType: () => (/* binding */ CollisionType)\n/* harmony export */ });\n/**\n * An enum that describes the types of collisions bodies can participate in\n */\nvar CollisionType;\n(function (CollisionType) {\n /**\n * Bodies with the `PreventCollision` setting do not participate in any\n * collisions and do not raise collision events.\n */\n CollisionType[\"PreventCollision\"] = \"PreventCollision\";\n /**\n * Bodies with the `Passive` setting only raise collision events, but are not\n * influenced or moved by other bodies and do not influence or move other bodies.\n * This is useful for use in trigger type behavior.\n */\n CollisionType[\"Passive\"] = \"Passive\";\n /**\n * Bodies with the `Active` setting raise collision events and participate\n * in collisions with other bodies and will be push or moved by bodies sharing\n * the `Active` or `Fixed` setting.\n */\n CollisionType[\"Active\"] = \"Active\";\n /**\n * Bodies with the `Fixed` setting raise collision events and participate in\n * collisions with other bodies. Actors with the `Fixed` setting will not be\n * pushed or moved by other bodies sharing the `Fixed`. Think of Fixed\n * bodies as \"immovable/unstoppable\" objects. If two `Fixed` bodies meet they will\n * not be pushed or moved by each other, they will not interact except to throw\n * collision events.\n */\n CollisionType[\"Fixed\"] = \"Fixed\";\n})(CollisionType || (CollisionType = {}));\n\n\n/***/ }),\n\n/***/ \"./Collision/Detection/CollisionContact.ts\":\n/*!*************************************************!*\\\n !*** ./Collision/Detection/CollisionContact.ts ***!\n \\*************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CollisionContact: () => (/* binding */ CollisionContact)\n/* harmony export */ });\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Pair__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Pair */ \"./Collision/Detection/Pair.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../BodyComponent */ \"./Collision/BodyComponent.ts\");\n\n\n\n/**\n * Collision contacts are used internally by Excalibur to resolve collision between colliders. This\n * Pair prevents collisions from being evaluated more than one time\n */\nclass CollisionContact {\n constructor(colliderA, colliderB, mtv, normal, tangent, points, localPoints, info) {\n var _a, _b, _c, _d, _e, _f;\n this._canceled = false;\n this.bodyA = null;\n this.bodyB = null;\n this.colliderA = colliderA;\n this.colliderB = colliderB;\n this.mtv = mtv;\n this.normal = normal;\n this.tangent = tangent;\n this.points = points;\n this.localPoints = localPoints;\n this.info = info;\n this.id = _Pair__WEBPACK_IMPORTED_MODULE_0__.Pair.calculatePairHash(colliderA.id, colliderB.id);\n if (colliderA.composite || colliderB.composite) {\n // Add on the parent composite pair for start/end contact if 'together\n const colliderAId = ((_a = colliderA.composite) === null || _a === void 0 ? void 0 : _a.compositeStrategy) === 'separate' ? colliderA.id : (_c = (_b = colliderA.composite) === null || _b === void 0 ? void 0 : _b.id) !== null && _c !== void 0 ? _c : colliderA.id;\n const colliderBId = ((_d = colliderB.composite) === null || _d === void 0 ? void 0 : _d.compositeStrategy) === 'separate' ? colliderB.id : (_f = (_e = colliderB.composite) === null || _e === void 0 ? void 0 : _e.id) !== null && _f !== void 0 ? _f : colliderB.id;\n this.id += '|' + _Pair__WEBPACK_IMPORTED_MODULE_0__.Pair.calculatePairHash(colliderAId, colliderBId);\n }\n if (this.colliderA.owner) {\n this.bodyA = this.colliderA.owner.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_1__.BodyComponent);\n }\n if (this.colliderB.owner) {\n this.bodyB = this.colliderB.owner.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_1__.BodyComponent);\n }\n }\n /**\n * Match contact awake state, except if body's are Fixed\n */\n matchAwake() {\n const bodyA = this.bodyA;\n const bodyB = this.bodyB;\n if (bodyA && bodyB) {\n if (bodyA.isSleeping !== bodyB.isSleeping) {\n if (bodyA.isSleeping && bodyA.collisionType !== _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.Fixed && bodyB.sleepMotion >= bodyA.wakeThreshold) {\n bodyA.isSleeping = false;\n }\n if (bodyB.isSleeping && bodyB.collisionType !== _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.Fixed && bodyA.sleepMotion >= bodyB.wakeThreshold) {\n bodyB.isSleeping = false;\n }\n }\n }\n }\n isCanceled() {\n return this._canceled;\n }\n cancel() {\n this._canceled = true;\n }\n /**\n * Biases the contact so that the given collider is colliderA\n */\n bias(collider) {\n if (collider !== this.colliderA && collider !== this.colliderB) {\n throw new Error('Collider must be either colliderA or colliderB from this contact');\n }\n if (collider === this.colliderA) {\n return this;\n }\n const colliderA = this.colliderA;\n const colliderB = this.colliderB;\n this.colliderB = colliderA;\n this.colliderA = colliderB;\n this.mtv = this.mtv.negate();\n this.normal = this.normal.negate();\n this.tangent = this.tangent.negate();\n return this;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Detection/DynamicTree.ts\":\n/*!********************************************!*\\\n !*** ./Collision/Detection/DynamicTree.ts ***!\n \\********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DynamicTree: () => (/* binding */ DynamicTree),\n/* harmony export */ TreeNode: () => (/* binding */ TreeNode)\n/* harmony export */ });\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../.. */ \"./Color.ts\");\n\n\n\n\n/**\n * Dynamic Tree Node used for tracking bounds within the tree\n */\nclass TreeNode {\n constructor(parent) {\n this.parent = parent;\n this.parent = parent || null;\n this.data = null;\n this.bounds = new _BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox();\n this.left = null;\n this.right = null;\n this.height = 0;\n }\n isLeaf() {\n return !this.left && !this.right;\n }\n}\n/**\n * The DynamicTrees provides a spatial partitioning data structure for quickly querying for overlapping bounding boxes for\n * all tracked bodies. The worst case performance of this is O(n*log(n)) where n is the number of bodies in the tree.\n *\n * Internally the bounding boxes are organized as a balanced binary tree of bounding boxes, where the leaf nodes are tracked bodies.\n * Every non-leaf node is a bounding box that contains child bounding boxes.\n */\nclass DynamicTree {\n constructor(_config, worldBounds = new _BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox(-Number.MAX_VALUE, -Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE)) {\n this._config = _config;\n this.worldBounds = worldBounds;\n this.root = null;\n this.nodes = {};\n }\n /**\n * Inserts a node into the dynamic tree\n */\n _insert(leaf) {\n // If there are no nodes in the tree, make this the root leaf\n if (this.root === null) {\n this.root = leaf;\n this.root.parent = null;\n return;\n }\n // Search the tree for a node that is not a leaf and find the best place to insert\n const leafAABB = leaf.bounds;\n let currentRoot = this.root;\n while (!currentRoot.isLeaf()) {\n const left = currentRoot.left;\n const right = currentRoot.right;\n const area = currentRoot.bounds.getPerimeter();\n const combinedAABB = currentRoot.bounds.combine(leafAABB);\n const combinedArea = combinedAABB.getPerimeter();\n // Calculate cost heuristic for creating a new parent and leaf\n const cost = 2 * combinedArea;\n // Minimum cost of pushing the leaf down the tree\n const inheritanceCost = 2 * (combinedArea - area);\n // Cost of descending\n let leftCost = 0;\n const leftCombined = leafAABB.combine(left.bounds);\n let newArea;\n let oldArea;\n if (left.isLeaf()) {\n leftCost = leftCombined.getPerimeter() + inheritanceCost;\n }\n else {\n oldArea = left.bounds.getPerimeter();\n newArea = leftCombined.getPerimeter();\n leftCost = newArea - oldArea + inheritanceCost;\n }\n let rightCost = 0;\n const rightCombined = leafAABB.combine(right.bounds);\n if (right.isLeaf()) {\n rightCost = rightCombined.getPerimeter() + inheritanceCost;\n }\n else {\n oldArea = right.bounds.getPerimeter();\n newArea = rightCombined.getPerimeter();\n rightCost = newArea - oldArea + inheritanceCost;\n }\n // cost is acceptable\n if (cost < leftCost && cost < rightCost) {\n break;\n }\n // Descend to the depths\n if (leftCost < rightCost) {\n currentRoot = left;\n }\n else {\n currentRoot = right;\n }\n }\n // Create the new parent node and insert into the tree\n const oldParent = currentRoot.parent;\n const newParent = new TreeNode(oldParent);\n newParent.bounds = leafAABB.combine(currentRoot.bounds);\n newParent.height = currentRoot.height + 1;\n if (oldParent !== null) {\n // The sibling node was not the root\n if (oldParent.left === currentRoot) {\n oldParent.left = newParent;\n }\n else {\n oldParent.right = newParent;\n }\n newParent.left = currentRoot;\n newParent.right = leaf;\n currentRoot.parent = newParent;\n leaf.parent = newParent;\n }\n else {\n // The sibling node was the root\n newParent.left = currentRoot;\n newParent.right = leaf;\n currentRoot.parent = newParent;\n leaf.parent = newParent;\n this.root = newParent;\n }\n // Walk up the tree fixing heights and AABBs\n let currentNode = leaf.parent;\n while (currentNode) {\n currentNode = this._balance(currentNode);\n if (!currentNode.left) {\n throw new Error('Parent of current leaf cannot have a null left child' + currentNode);\n }\n if (!currentNode.right) {\n throw new Error('Parent of current leaf cannot have a null right child' + currentNode);\n }\n currentNode.height = 1 + Math.max(currentNode.left.height, currentNode.right.height);\n currentNode.bounds = currentNode.left.bounds.combine(currentNode.right.bounds);\n currentNode = currentNode.parent;\n }\n }\n /**\n * Removes a node from the dynamic tree\n */\n _remove(leaf) {\n if (leaf === this.root) {\n this.root = null;\n return;\n }\n const parent = leaf.parent;\n const grandParent = parent.parent;\n let sibling;\n if (parent.left === leaf) {\n sibling = parent.right;\n }\n else {\n sibling = parent.left;\n }\n if (grandParent) {\n if (grandParent.left === parent) {\n grandParent.left = sibling;\n }\n else {\n grandParent.right = sibling;\n }\n sibling.parent = grandParent;\n let currentNode = grandParent;\n while (currentNode) {\n currentNode = this._balance(currentNode);\n currentNode.bounds = currentNode.left.bounds.combine(currentNode.right.bounds);\n currentNode.height = 1 + Math.max(currentNode.left.height, currentNode.right.height);\n currentNode = currentNode.parent;\n }\n }\n else {\n this.root = sibling;\n sibling.parent = null;\n }\n }\n /**\n * Tracks a body in the dynamic tree\n */\n trackCollider(collider) {\n const node = new TreeNode();\n node.data = collider;\n node.bounds = collider.bounds;\n node.bounds.left -= 2;\n node.bounds.top -= 2;\n node.bounds.right += 2;\n node.bounds.bottom += 2;\n this.nodes[collider.id.value] = node;\n this._insert(node);\n }\n /**\n * Updates the dynamic tree given the current bounds of each body being tracked\n */\n updateCollider(collider) {\n var _a;\n const node = this.nodes[collider.id.value];\n if (!node) {\n return false;\n }\n const b = collider.bounds;\n // if the body is outside the world no longer update it\n if (!this.worldBounds.contains(b)) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance().warn('Collider with id ' + collider.id.value + ' is outside the world bounds and will no longer be tracked for physics');\n this.untrackCollider(collider);\n return false;\n }\n if (node.bounds.contains(b)) {\n return false;\n }\n this._remove(node);\n b.left -= this._config.boundsPadding;\n b.top -= this._config.boundsPadding;\n b.right += this._config.boundsPadding;\n b.bottom += this._config.boundsPadding;\n // THIS IS CAUSING UNNECESSARY CHECKS\n if (collider.owner) {\n const body = (_a = collider.owner) === null || _a === void 0 ? void 0 : _a.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_2__.BodyComponent);\n if (body) {\n const multdx = ((body.vel.x * 32) / 1000) * this._config.velocityMultiplier;\n const multdy = ((body.vel.y * 32) / 1000) * this._config.velocityMultiplier;\n if (multdx < 0) {\n b.left += multdx;\n }\n else {\n b.right += multdx;\n }\n if (multdy < 0) {\n b.top += multdy;\n }\n else {\n b.bottom += multdy;\n }\n }\n }\n node.bounds = b;\n this._insert(node);\n return true;\n }\n /**\n * Untracks a body from the dynamic tree\n */\n untrackCollider(collider) {\n const node = this.nodes[collider.id.value];\n if (!node) {\n return;\n }\n this._remove(node);\n this.nodes[collider.id.value] = null;\n delete this.nodes[collider.id.value];\n }\n /**\n * Balances the tree about a node\n */\n _balance(node) {\n if (node === null) {\n throw new Error('Cannot balance at null node');\n }\n if (node.isLeaf() || node.height < 2) {\n return node;\n }\n const left = node.left;\n const right = node.right;\n const a = node;\n const b = left;\n const c = right;\n const d = left.left;\n const e = left.right;\n const f = right.left;\n const g = right.right;\n const balance = c.height - b.height;\n // Rotate c node up\n if (balance > 1) {\n // Swap the right node with it's parent\n c.left = a;\n c.parent = a.parent;\n a.parent = c;\n // The original node's old parent should point to the right node\n // this is mega confusing\n if (c.parent) {\n if (c.parent.left === a) {\n c.parent.left = c;\n }\n else {\n c.parent.right = c;\n }\n }\n else {\n this.root = c;\n }\n // Rotate\n if (f.height > g.height) {\n c.right = f;\n a.right = g;\n g.parent = a;\n a.bounds = b.bounds.combine(g.bounds);\n c.bounds = a.bounds.combine(f.bounds);\n a.height = 1 + Math.max(b.height, g.height);\n c.height = 1 + Math.max(a.height, f.height);\n }\n else {\n c.right = g;\n a.right = f;\n f.parent = a;\n a.bounds = b.bounds.combine(f.bounds);\n c.bounds = a.bounds.combine(g.bounds);\n a.height = 1 + Math.max(b.height, f.height);\n c.height = 1 + Math.max(a.height, g.height);\n }\n return c;\n }\n // Rotate left node up\n if (balance < -1) {\n // swap\n b.left = a;\n b.parent = a.parent;\n a.parent = b;\n // node's old parent should point to b\n if (b.parent) {\n if (b.parent.left === a) {\n b.parent.left = b;\n }\n else {\n if (b.parent.right !== a) {\n throw 'Error rotating Dynamic Tree';\n }\n b.parent.right = b;\n }\n }\n else {\n this.root = b;\n }\n // rotate\n if (d.height > e.height) {\n b.right = d;\n a.left = e;\n e.parent = a;\n a.bounds = c.bounds.combine(e.bounds);\n b.bounds = a.bounds.combine(d.bounds);\n a.height = 1 + Math.max(c.height, e.height);\n b.height = 1 + Math.max(a.height, d.height);\n }\n else {\n b.right = e;\n a.left = d;\n d.parent = a;\n a.bounds = c.bounds.combine(d.bounds);\n b.bounds = a.bounds.combine(e.bounds);\n a.height = 1 + Math.max(c.height, d.height);\n b.height = 1 + Math.max(a.height, e.height);\n }\n return b;\n }\n return node;\n }\n /**\n * Returns the internal height of the tree, shorter trees are better. Performance drops as the tree grows\n */\n getHeight() {\n if (this.root === null) {\n return 0;\n }\n return this.root.height;\n }\n /**\n * Queries the Dynamic Axis Aligned Tree for bodies that could be colliding with the provided body.\n *\n * In the query callback, it will be passed a potential collider. Returning true from this callback indicates\n * that you are complete with your query and you do not want to continue. Returning false will continue searching\n * the tree until all possible colliders have been returned.\n */\n query(collider, callback) {\n const bounds = collider.bounds;\n const helper = (currentNode) => {\n if (currentNode && currentNode.bounds.overlaps(bounds)) {\n if (currentNode.isLeaf() && currentNode.data !== collider) {\n if (callback.call(collider, currentNode.data)) {\n return true;\n }\n }\n else {\n return helper(currentNode.left) || helper(currentNode.right);\n }\n }\n return false;\n };\n helper(this.root);\n }\n /**\n * Queries the Dynamic Axis Aligned Tree for bodies that could be intersecting. By default the raycast query uses an infinitely\n * long ray to test the tree specified by `max`.\n *\n * In the query callback, it will be passed a potential body that intersects with the raycast. Returning true from this\n * callback indicates that your are complete with your query and do not want to continue. Return false will continue searching\n * the tree until all possible bodies that would intersect with the ray have been returned.\n */\n rayCastQuery(ray, max = Infinity, callback) {\n const helper = (currentNode) => {\n if (currentNode && currentNode.bounds.rayCast(ray, max)) {\n if (currentNode.isLeaf()) {\n if (callback.call(ray, currentNode.data)) {\n // ray hit a leaf! return the body\n return true;\n }\n }\n else {\n // ray hit but not at a leaf, recurse deeper\n return helper(currentNode.left) || helper(currentNode.right);\n }\n }\n return false; // ray missed\n };\n helper(this.root);\n }\n getNodes() {\n const helper = (currentNode) => {\n if (currentNode) {\n return [currentNode].concat(helper(currentNode.left), helper(currentNode.right));\n }\n else {\n return [];\n }\n };\n return helper(this.root);\n }\n debug(ex) {\n // draw all the nodes in the Dynamic Tree\n const helper = (currentNode) => {\n if (currentNode) {\n if (currentNode.isLeaf()) {\n currentNode.bounds.draw(ex, ___WEBPACK_IMPORTED_MODULE_3__.Color.Green);\n }\n else {\n currentNode.bounds.draw(ex, ___WEBPACK_IMPORTED_MODULE_3__.Color.White);\n }\n if (currentNode.left) {\n helper(currentNode.left);\n }\n if (currentNode.right) {\n helper(currentNode.right);\n }\n }\n };\n helper(this.root);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Detection/DynamicTreeCollisionProcessor.ts\":\n/*!**************************************************************!*\\\n !*** ./Collision/Detection/DynamicTreeCollisionProcessor.ts ***!\n \\**************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DynamicTreeCollisionProcessor: () => (/* binding */ DynamicTreeCollisionProcessor)\n/* harmony export */ });\n/* harmony import */ var _DynamicTree__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./DynamicTree */ \"./Collision/Detection/DynamicTree.ts\");\n/* harmony import */ var _Pair__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Pair */ \"./Collision/Detection/Pair.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math_ray__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../Math/ray */ \"./Math/ray.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Colliders/CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Group/CollisionGroup */ \"./Collision/Group/CollisionGroup.ts\");\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Id__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Id */ \"./Id.ts\");\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Responsible for performing the collision broadphase (locating potential collisions) and\n * the narrowphase (actual collision contacts)\n */\nclass DynamicTreeCollisionProcessor {\n constructor(_config) {\n this._config = _config;\n this._pairs = new Set();\n this._collisionPairCache = [];\n this._colliders = [];\n this._dynamicCollisionTree = new _DynamicTree__WEBPACK_IMPORTED_MODULE_0__.DynamicTree(_config.dynamicTree);\n }\n getColliders() {\n return this._colliders;\n }\n query(pointOrBounds) {\n const results = [];\n if (pointOrBounds instanceof _BoundingBox__WEBPACK_IMPORTED_MODULE_1__.BoundingBox) {\n this._dynamicCollisionTree.query({\n id: (0,_Id__WEBPACK_IMPORTED_MODULE_2__.createId)('collider', -1),\n owner: null,\n bounds: pointOrBounds\n }, (other) => {\n results.push(other);\n return false;\n });\n }\n else {\n this._dynamicCollisionTree.query({\n id: (0,_Id__WEBPACK_IMPORTED_MODULE_2__.createId)('collider', -1),\n owner: null,\n bounds: new _BoundingBox__WEBPACK_IMPORTED_MODULE_1__.BoundingBox(pointOrBounds.x, pointOrBounds.y, pointOrBounds.x, pointOrBounds.y)\n }, (other) => {\n results.push(other);\n return false;\n });\n }\n return results;\n }\n rayCast(ray, options) {\n var _a, _b, _c;\n const results = [];\n const maxDistance = (_a = options === null || options === void 0 ? void 0 : options.maxDistance) !== null && _a !== void 0 ? _a : Infinity;\n const collisionGroup = options === null || options === void 0 ? void 0 : options.collisionGroup;\n const collisionMask = !collisionGroup ? (_b = options === null || options === void 0 ? void 0 : options.collisionMask) !== null && _b !== void 0 ? _b : _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_3__.CollisionGroup.All.category : collisionGroup.category;\n const searchAllColliders = (_c = options === null || options === void 0 ? void 0 : options.searchAllColliders) !== null && _c !== void 0 ? _c : false;\n this._dynamicCollisionTree.rayCastQuery(ray, maxDistance, (collider) => {\n const owner = collider.owner;\n const maybeBody = owner.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_4__.BodyComponent);\n if ((options === null || options === void 0 ? void 0 : options.ignoreCollisionGroupAll) && maybeBody.group === _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_3__.CollisionGroup.All) {\n return false;\n }\n const canCollide = (collisionMask & maybeBody.group.category) !== 0;\n // Early exit if not the right group\n if ((maybeBody === null || maybeBody === void 0 ? void 0 : maybeBody.group) && !canCollide) {\n return false;\n }\n const hit = collider.rayCast(ray, maxDistance);\n if (hit) {\n if (options === null || options === void 0 ? void 0 : options.filter) {\n if (options.filter(hit)) {\n results.push(hit);\n if (!searchAllColliders) {\n // returning true exits the search\n return true;\n }\n }\n }\n else {\n results.push(hit);\n if (!searchAllColliders) {\n // returning true exits the search\n return true;\n }\n }\n }\n return false;\n });\n return results;\n }\n /**\n * Tracks a physics body for collisions\n */\n track(target) {\n if (!target) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_5__.Logger.getInstance().warn('Cannot track null collider');\n return;\n }\n if (target instanceof _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_6__.CompositeCollider) {\n const colliders = target.getColliders();\n for (const c of colliders) {\n c.owner = target.owner;\n this._colliders.push(c);\n this._dynamicCollisionTree.trackCollider(c);\n }\n }\n else {\n this._colliders.push(target);\n this._dynamicCollisionTree.trackCollider(target);\n }\n }\n /**\n * Untracks a physics body\n */\n untrack(target) {\n if (!target) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_5__.Logger.getInstance().warn('Cannot untrack a null collider');\n return;\n }\n if (target instanceof _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_6__.CompositeCollider) {\n const colliders = target.getColliders();\n for (const c of colliders) {\n const index = this._colliders.indexOf(c);\n if (index !== -1) {\n this._colliders.splice(index, 1);\n }\n this._dynamicCollisionTree.untrackCollider(c);\n }\n }\n else {\n const index = this._colliders.indexOf(target);\n if (index !== -1) {\n this._colliders.splice(index, 1);\n }\n this._dynamicCollisionTree.untrackCollider(target);\n }\n }\n _pairExists(colliderA, colliderB) {\n // if the collision pair has been calculated already short circuit\n const hash = _Pair__WEBPACK_IMPORTED_MODULE_7__.Pair.calculatePairHash(colliderA.id, colliderB.id);\n return this._pairs.has(hash);\n }\n /**\n * Detects potential collision pairs in a broadphase approach with the dynamic AABB tree strategy\n */\n broadphase(targets, elapsed, stats) {\n const seconds = elapsed / 1000;\n // Retrieve the list of potential colliders, exclude killed, prevented, and self\n const potentialColliders = targets.filter((other) => {\n var _a, _b;\n const body = (_a = other.owner) === null || _a === void 0 ? void 0 : _a.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_4__.BodyComponent);\n return ((_b = other.owner) === null || _b === void 0 ? void 0 : _b.isActive) && body.collisionType !== _CollisionType__WEBPACK_IMPORTED_MODULE_8__.CollisionType.PreventCollision;\n });\n // clear old list of collision pairs\n this._collisionPairCache = [];\n this._pairs.clear();\n // check for normal collision pairs\n let collider;\n for (let j = 0, l = potentialColliders.length; j < l; j++) {\n collider = potentialColliders[j];\n // Query the collision tree for potential colliders\n this._dynamicCollisionTree.query(collider, (other) => {\n if (!this._pairExists(collider, other) && _Pair__WEBPACK_IMPORTED_MODULE_7__.Pair.canCollide(collider, other)) {\n const pair = new _Pair__WEBPACK_IMPORTED_MODULE_7__.Pair(collider, other);\n this._pairs.add(pair.id);\n this._collisionPairCache.push(pair);\n }\n // Always return false, to query whole tree. Returning true in the query method stops searching\n return false;\n });\n }\n if (stats) {\n stats.physics.pairs = this._collisionPairCache.length;\n }\n // Check dynamic tree for fast moving objects\n // Fast moving objects are those moving at least there smallest bound per frame\n if (this._config.continuous.checkForFastBodies) {\n for (const collider of potentialColliders) {\n const body = collider.owner.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_4__.BodyComponent);\n // Skip non-active objects. Does not make sense on other collision types\n if (body.collisionType !== _CollisionType__WEBPACK_IMPORTED_MODULE_8__.CollisionType.Active) {\n continue;\n }\n // Maximum travel distance next frame\n const updateDistance = body.vel.magnitude * seconds + // velocity term\n body.acc.magnitude * 0.5 * seconds * seconds; // acc term\n // Find the minimum dimension\n const minDimension = Math.min(collider.bounds.height, collider.bounds.width);\n if (this._config.continuous.disableMinimumSpeedForFastBody || updateDistance > minDimension / 2) {\n if (stats) {\n stats.physics.fastBodies++;\n }\n // start with the oldPos because the integration for actors has already happened\n // objects resting on a surface may be slightly penetrating in the current position\n const updateVec = body.globalPos.sub(body.oldPos);\n const centerPoint = collider.center;\n const furthestPoint = collider.getFurthestPoint(body.vel);\n const origin = furthestPoint.sub(updateVec);\n const ray = new _Math_ray__WEBPACK_IMPORTED_MODULE_9__.Ray(origin, body.vel);\n // back the ray up by -2x surfaceEpsilon to account for fast moving objects starting on the surface\n ray.pos = ray.pos.add(ray.dir.scale(-2 * this._config.continuous.surfaceEpsilon));\n let minCollider;\n let minTranslate = new _Math_vector__WEBPACK_IMPORTED_MODULE_10__.Vector(Infinity, Infinity);\n this._dynamicCollisionTree.rayCastQuery(ray, updateDistance + this._config.continuous.surfaceEpsilon * 2, (other) => {\n if (!this._pairExists(collider, other) && _Pair__WEBPACK_IMPORTED_MODULE_7__.Pair.canCollide(collider, other)) {\n const hit = other.rayCast(ray, updateDistance + this._config.continuous.surfaceEpsilon * 10);\n if (hit) {\n const translate = hit.point.sub(origin);\n if (translate.magnitude < minTranslate.magnitude) {\n minTranslate = translate;\n minCollider = other;\n }\n }\n }\n return false;\n });\n if (minCollider && _Math_vector__WEBPACK_IMPORTED_MODULE_10__.Vector.isValid(minTranslate)) {\n const pair = new _Pair__WEBPACK_IMPORTED_MODULE_7__.Pair(collider, minCollider);\n if (!this._pairs.has(pair.id)) {\n this._pairs.add(pair.id);\n this._collisionPairCache.push(pair);\n }\n // move the fast moving object to the other body\n // need to push into the surface by ex.Physics.surfaceEpsilon\n const shift = centerPoint.sub(furthestPoint);\n body.globalPos = origin\n .add(shift)\n .add(minTranslate)\n .add(ray.dir.scale(10 * this._config.continuous.surfaceEpsilon)); // needed to push the shape slightly into contact\n collider.update(body.transform.get());\n if (stats) {\n stats.physics.fastBodyCollisions++;\n }\n }\n }\n }\n }\n // return cache\n return this._collisionPairCache;\n }\n /**\n * Applies narrow phase on collision pairs to find actual area intersections\n * Adds actual colliding pairs to stats' Frame data\n */\n narrowphase(pairs, stats) {\n let contacts = [];\n for (let i = 0; i < pairs.length; i++) {\n const newContacts = pairs[i].collide();\n contacts = contacts.concat(newContacts);\n if (stats && newContacts.length > 0) {\n for (const c of newContacts) {\n stats.physics.contacts.set(c.id, c);\n }\n }\n }\n if (stats) {\n stats.physics.collisions += contacts.length;\n }\n return contacts;\n }\n /**\n * Update the dynamic tree positions\n */\n update(targets) {\n let updated = 0;\n const len = targets.length;\n for (let i = 0; i < len; i++) {\n if (this._dynamicCollisionTree.updateCollider(targets[i])) {\n updated++;\n }\n }\n return updated;\n }\n debug(ex) {\n this._dynamicCollisionTree.debug(ex);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Detection/Pair.ts\":\n/*!*************************************!*\\\n !*** ./Collision/Detection/Pair.ts ***!\n \\*************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Pair: () => (/* binding */ Pair)\n/* harmony export */ });\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../BodyComponent */ \"./Collision/BodyComponent.ts\");\n\n\n/**\n * Models a potential collision between 2 colliders\n */\nclass Pair {\n constructor(colliderA, colliderB) {\n this.colliderA = colliderA;\n this.colliderB = colliderB;\n this.id = null;\n this.id = Pair.calculatePairHash(colliderA.id, colliderB.id);\n }\n /**\n * Returns whether a it is allowed for 2 colliders in a Pair to collide\n * @param colliderA\n * @param colliderB\n */\n static canCollide(colliderA, colliderB) {\n var _a, _b;\n // Prevent self collision\n if (colliderA.id === colliderB.id) {\n return false;\n }\n // Colliders with the same owner do not collide (composite colliders)\n if (colliderA.owner && colliderB.owner && colliderA.owner.id === colliderB.owner.id) {\n return false;\n }\n // if the pair has a member with zero dimension don't collide\n if (colliderA.localBounds.hasZeroDimensions() || colliderB.localBounds.hasZeroDimensions()) {\n return false;\n }\n const bodyA = (_a = colliderA === null || colliderA === void 0 ? void 0 : colliderA.owner) === null || _a === void 0 ? void 0 : _a.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_0__.BodyComponent);\n const bodyB = (_b = colliderB === null || colliderB === void 0 ? void 0 : colliderB.owner) === null || _b === void 0 ? void 0 : _b.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_0__.BodyComponent);\n // Body's needed for collision in the current state\n // TODO can we collide without a body?\n if (!bodyA || !bodyB) {\n return false;\n }\n // If both are in the same collision group short circuit\n if (!bodyA.group.canCollide(bodyB.group)) {\n return false;\n }\n // if both are fixed short circuit\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_1__.CollisionType.Fixed && bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_1__.CollisionType.Fixed) {\n return false;\n }\n // if the either is prevent collision short circuit\n if (bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_1__.CollisionType.PreventCollision || bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_1__.CollisionType.PreventCollision) {\n return false;\n }\n // if either is dead short circuit\n if (!bodyA.isActive || !bodyB.isActive) {\n return false;\n }\n return true;\n }\n /**\n * Returns whether or not it is possible for the pairs to collide\n */\n get canCollide() {\n const colliderA = this.colliderA;\n const colliderB = this.colliderB;\n return Pair.canCollide(colliderA, colliderB);\n }\n /**\n * Runs the collision intersection logic on the members of this pair\n */\n collide() {\n return this.colliderA.collide(this.colliderB);\n }\n /**\n * Check if the collider is part of the pair\n * @param collider\n */\n hasCollider(collider) {\n return collider === this.colliderA || collider === this.colliderB;\n }\n /**\n * Calculates the unique pair hash id for this collision pair (owning id)\n */\n static calculatePairHash(idA, idB) {\n if (idA.value < idB.value) {\n return `#${idA.value}+${idB.value}`;\n }\n else {\n return `#${idB.value}+${idA.value}`;\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Detection/QuadTree.ts\":\n/*!*****************************************!*\\\n !*** ./Collision/Detection/QuadTree.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ QuadTree: () => (/* binding */ QuadTree)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Color */ \"./Color.ts\");\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n\n\n/**\n * QuadTree spatial data structure. Useful for quickly retrieving all objects that might\n * be in a specific location.\n */\nclass QuadTree {\n constructor(bounds, options) {\n this.bounds = bounds;\n this.options = options;\n this._defaultOptions = {\n maxDepth: 10,\n capacity: 10,\n level: 0\n };\n this.items = [];\n this._isDivided = false;\n this.topLeft = null;\n this.topRight = null;\n this.bottomLeft = null;\n this.bottomRight = null;\n this.options = { ...this._defaultOptions, ...options };\n this.halfWidth = bounds.width / 2;\n this.halfHeight = bounds.height / 2;\n }\n /**\n * Splits the quad tree one level deeper\n */\n _split() {\n this._isDivided = true;\n const newLevelOptions = {\n maxDepth: this.options.maxDepth,\n capacity: this.options.capacity,\n level: this.options.level + 1\n };\n this.topLeft = new QuadTree(new _BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox({\n left: this.bounds.left,\n top: this.bounds.top,\n right: this.bounds.left + this.halfWidth,\n bottom: this.bounds.top + this.halfHeight\n }), newLevelOptions);\n this.topRight = new QuadTree(new _BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox({\n left: this.bounds.left + this.halfWidth,\n top: this.bounds.top,\n right: this.bounds.right,\n bottom: this.bounds.top + this.halfHeight\n }), newLevelOptions);\n this.bottomLeft = new QuadTree(new _BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox({\n left: this.bounds.left,\n top: this.bounds.top + this.halfHeight,\n right: this.bounds.left + this.halfWidth,\n bottom: this.bounds.bottom\n }), newLevelOptions);\n this.bottomRight = new QuadTree(new _BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox({\n left: this.bounds.left + this.halfWidth,\n top: this.bounds.top + this.halfHeight,\n right: this.bounds.right,\n bottom: this.bounds.bottom\n }), newLevelOptions);\n }\n _insertIntoSubNodes(item) {\n var _a, _b, _c, _d;\n if ((_a = this.topLeft) === null || _a === void 0 ? void 0 : _a.bounds.overlaps(item.bounds)) {\n this.topLeft.insert(item);\n }\n if ((_b = this.topRight) === null || _b === void 0 ? void 0 : _b.bounds.overlaps(item.bounds)) {\n this.topRight.insert(item);\n }\n if ((_c = this.bottomLeft) === null || _c === void 0 ? void 0 : _c.bounds.overlaps(item.bounds)) {\n this.bottomLeft.insert(item);\n }\n if ((_d = this.bottomRight) === null || _d === void 0 ? void 0 : _d.bounds.overlaps(item.bounds)) {\n this.bottomRight.insert(item);\n }\n }\n /**\n * Insert an item to be tracked in the QuadTree\n * @param item\n */\n insert(item) {\n // add to subnodes if it matches\n if (this._isDivided) {\n this._insertIntoSubNodes(item);\n return;\n }\n // leaf case\n this.items.push(item);\n // capacity\n if (this.items.length > this.options.capacity && this.options.level < this.options.maxDepth) {\n if (!this._isDivided) {\n this._split();\n }\n // divide this level's items into it's subnodes\n for (const item of this.items) {\n this._insertIntoSubNodes(item);\n }\n // clear this level\n this.items.length = 0;\n }\n }\n /**\n * Remove a tracked item in the QuadTree\n * @param item\n */\n remove(item) {\n var _a, _b, _c, _d;\n if (!this.bounds.overlaps(item.bounds)) {\n return;\n }\n if (!this._isDivided) {\n const index = this.items.indexOf(item);\n if (index > -1) {\n this.items.splice(index, 1);\n }\n return;\n }\n if ((_a = this.topLeft) === null || _a === void 0 ? void 0 : _a.bounds.overlaps(item.bounds)) {\n this.topLeft.remove(item);\n }\n if ((_b = this.topRight) === null || _b === void 0 ? void 0 : _b.bounds.overlaps(item.bounds)) {\n this.topRight.remove(item);\n }\n if ((_c = this.bottomLeft) === null || _c === void 0 ? void 0 : _c.bounds.overlaps(item.bounds)) {\n this.bottomLeft.remove(item);\n }\n if ((_d = this.bottomRight) === null || _d === void 0 ? void 0 : _d.bounds.overlaps(item.bounds)) {\n this.bottomRight.remove(item);\n }\n }\n /**\n * Query the structure for all objects that intersect the bounding box\n * @param boundingBox\n * @returns items\n */\n query(boundingBox) {\n let results = this.items;\n if (this._isDivided) {\n if (this.topLeft.bounds.overlaps(boundingBox)) {\n results = results.concat(this.topLeft.query(boundingBox));\n }\n if (this.topRight.bounds.overlaps(boundingBox)) {\n results = results.concat(this.topRight.query(boundingBox));\n }\n if (this.bottomLeft.bounds.overlaps(boundingBox)) {\n results = results.concat(this.bottomLeft.query(boundingBox));\n }\n if (this.bottomRight.bounds.overlaps(boundingBox)) {\n results = results.concat(this.bottomRight.query(boundingBox));\n }\n }\n results = results.filter((item, index) => {\n return results.indexOf(item) >= index;\n });\n return results;\n }\n clear() {\n this.items = [];\n this._isDivided = false;\n this.topLeft = null;\n this.topRight = null;\n this.bottomLeft = null;\n this.bottomRight = null;\n }\n getAllItems() {\n let results = this.items;\n if (this._isDivided) {\n results = results.concat(this.topLeft.getAllItems());\n results = results.concat(this.topRight.getAllItems());\n results = results.concat(this.bottomLeft.getAllItems());\n results = results.concat(this.bottomRight.getAllItems());\n }\n results = results.filter((item, index) => {\n return results.indexOf(item) >= index;\n });\n return results;\n }\n getTreeDepth() {\n if (!this._isDivided) {\n return 0;\n }\n return (1 +\n Math.max(this.topLeft.getTreeDepth(), this.topRight.getTreeDepth(), this.bottomLeft.getTreeDepth(), this.bottomRight.getTreeDepth()));\n }\n debug(ctx) {\n this.bounds.draw(ctx, _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Yellow);\n if (this._isDivided) {\n this.topLeft.bounds.draw(ctx, _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Yellow);\n this.topRight.bounds.draw(ctx, _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Yellow);\n this.bottomLeft.bounds.draw(ctx, _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Yellow);\n this.bottomRight.bounds.draw(ctx, _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Yellow);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Detection/SparseHashGrid.ts\":\n/*!***********************************************!*\\\n !*** ./Collision/Detection/SparseHashGrid.ts ***!\n \\***********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ HashGridCell: () => (/* binding */ HashGridCell),\n/* harmony export */ HashGridProxy: () => (/* binding */ HashGridProxy),\n/* harmony export */ SparseHashGrid: () => (/* binding */ SparseHashGrid)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Color */ \"./Color.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_RentalPool__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Util/RentalPool */ \"./Util/RentalPool.ts\");\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n\n\n\n\nclass HashGridProxy {\n constructor(object, gridSize) {\n this.object = object;\n this.id = -1;\n this.cells = [];\n this.hasZeroBounds = false;\n this.gridSize = gridSize;\n this.bounds = object.bounds;\n this.hasZeroBounds = this.bounds.hasZeroDimensions();\n this.leftX = Math.floor(this.bounds.left / this.gridSize);\n this.rightX = Math.floor(this.bounds.right / this.gridSize);\n this.bottomY = Math.floor(this.bounds.bottom / this.gridSize);\n this.topY = Math.floor(this.bounds.top / this.gridSize);\n }\n /**\n * Has the hashed bounds changed\n */\n hasChanged() {\n const bounds = this.object.bounds;\n const leftX = Math.floor(bounds.left / this.gridSize);\n const rightX = Math.floor(bounds.right / this.gridSize);\n const bottomY = Math.floor(bounds.bottom / this.gridSize);\n const topY = Math.floor(bounds.top / this.gridSize);\n if (this.leftX !== leftX || this.rightX !== rightX || this.bottomY !== bottomY || this.topY !== topY) {\n return true;\n }\n return false;\n }\n /**\n * Clears all collider references\n */\n clear() {\n for (const cell of this.cells) {\n const index = cell.proxies.indexOf(this);\n if (index > -1) {\n cell.proxies.splice(index, 1);\n }\n // TODO reclaim cell in pool if empty?\n }\n }\n /**\n * Update bounds of the proxy\n */\n updateBounds() {\n this.bounds = this.object.bounds;\n }\n /**\n * Updates the hashed bounds coordinates\n */\n update() {\n this.bounds = this.object.bounds;\n this.leftX = Math.floor(this.bounds.left / this.gridSize);\n this.rightX = Math.floor(this.bounds.right / this.gridSize);\n this.bottomY = Math.floor(this.bounds.bottom / this.gridSize);\n this.topY = Math.floor(this.bounds.top / this.gridSize);\n this.hasZeroBounds = this.object.bounds.hasZeroDimensions();\n }\n}\nclass HashGridCell {\n constructor() {\n this.proxies = [];\n }\n configure(x, y) {\n this.x = x;\n this.y = y;\n this.key = HashGridCell.calculateHashKey(x, y);\n }\n static calculateHashKey(x, y) {\n return `${x}+${y}`;\n }\n}\nclass SparseHashGrid {\n constructor(options) {\n this.bounds = new _BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox();\n this._hashGridCellPool = new _Util_RentalPool__WEBPACK_IMPORTED_MODULE_1__.RentalPool(() => new HashGridCell(), (instance) => {\n instance.configure(0, 0);\n instance.proxies.length = 0;\n return instance;\n }, 1000);\n this.gridSize = options.size;\n this.sparseHashGrid = new Map();\n this.objectToProxy = new Map();\n if (options.proxyFactory) {\n this._buildProxy = (object) => options.proxyFactory(object, this.gridSize);\n }\n else {\n this._buildProxy = (object) => new HashGridProxy(object, this.gridSize);\n }\n // TODO dynamic grid size potentially larger than the largest collider\n // TODO Re-hash the objects if the median proves to be different\n }\n query(boundsOrPoint) {\n const results = new Set();\n if (boundsOrPoint instanceof _BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox) {\n const bounds = boundsOrPoint;\n const leftX = Math.floor(bounds.left / this.gridSize);\n const rightX = Math.floor(bounds.right / this.gridSize);\n const bottomY = Math.floor(bounds.bottom / this.gridSize);\n const topY = Math.floor(bounds.top / this.gridSize);\n for (let x = leftX; x <= rightX; x++) {\n for (let y = topY; y <= bottomY; y++) {\n const key = HashGridCell.calculateHashKey(x, y);\n // Hash bounds into appropriate cell\n const cell = this.sparseHashGrid.get(key);\n if (cell) {\n for (let i = 0; i < cell.proxies.length; i++) {\n cell.proxies[i].updateBounds();\n if (cell.proxies[i].bounds.intersect(bounds)) {\n results.add(cell.proxies[i].object);\n }\n }\n }\n }\n }\n }\n else {\n const point = boundsOrPoint;\n const key = HashGridCell.calculateHashKey(Math.floor(point.x / this.gridSize), Math.floor(point.y / this.gridSize));\n // Hash points into appropriate cell\n const cell = this.sparseHashGrid.get(key);\n if (cell) {\n for (let i = 0; i < cell.proxies.length; i++) {\n cell.proxies[i].updateBounds();\n if (cell.proxies[i].bounds.contains(point)) {\n results.add(cell.proxies[i].object);\n }\n }\n }\n }\n return Array.from(results);\n }\n get(xCoord, yCoord) {\n const key = HashGridCell.calculateHashKey(xCoord, yCoord);\n const cell = this.sparseHashGrid.get(key);\n return cell;\n }\n _insert(x, y, proxy) {\n const key = HashGridCell.calculateHashKey(x, y);\n // Hash collider into appropriate cell\n let cell = this.sparseHashGrid.get(key);\n if (!cell) {\n cell = this._hashGridCellPool.rent();\n cell.configure(x, y);\n this.sparseHashGrid.set(cell.key, cell);\n }\n cell.proxies.push(proxy);\n proxy.cells.push(cell); // TODO dupes, doesn't seem to be a problem\n this.bounds.combine(proxy.bounds, this.bounds);\n }\n _remove(x, y, proxy) {\n const key = HashGridCell.calculateHashKey(x, y);\n // Hash collider into appropriate cell\n const cell = this.sparseHashGrid.get(key);\n if (cell) {\n const proxyIndex = cell.proxies.indexOf(proxy);\n if (proxyIndex > -1) {\n cell.proxies.splice(proxyIndex, 1);\n }\n const cellIndex = proxy.cells.indexOf(cell);\n if (cellIndex > -1) {\n proxy.cells.splice(cellIndex, 1);\n }\n if (cell.proxies.length === 0) {\n this._hashGridCellPool.return(cell);\n this.sparseHashGrid.delete(key);\n }\n }\n }\n track(target) {\n const proxy = this._buildProxy(target);\n this.objectToProxy.set(target, proxy);\n for (let x = proxy.leftX; x <= proxy.rightX; x++) {\n for (let y = proxy.topY; y <= proxy.bottomY; y++) {\n this._insert(x, y, proxy);\n }\n }\n }\n untrack(target) {\n const proxy = this.objectToProxy.get(target);\n if (proxy) {\n proxy.clear();\n this.objectToProxy.delete(target);\n }\n }\n update(targets) {\n let updated = 0;\n // FIXME resetting bounds is wrong, if nothing has updated then\n // the bounds stay 0\n // this.bounds.reset();\n for (const target of targets) {\n const proxy = this.objectToProxy.get(target);\n if (!proxy) {\n continue;\n }\n if (proxy.hasChanged()) {\n // TODO slightly wasteful only remove from changed\n for (let x = proxy.leftX; x <= proxy.rightX; x++) {\n for (let y = proxy.topY; y <= proxy.bottomY; y++) {\n this._remove(x, y, proxy);\n }\n }\n proxy.update();\n // TODO slightly wasteful only add new\n for (let x = proxy.leftX; x <= proxy.rightX; x++) {\n for (let y = proxy.topY; y <= proxy.bottomY; y++) {\n this._insert(x, y, proxy);\n }\n }\n updated++;\n }\n }\n return updated;\n }\n debug(ex, elapsed) {\n const transparent = _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Transparent;\n const color = _Color__WEBPACK_IMPORTED_MODULE_2__.Color.White;\n for (const cell of this.sparseHashGrid.values()) {\n ex.drawRectangle((0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(cell.x * this.gridSize, cell.y * this.gridSize), this.gridSize, this.gridSize, transparent, color, 2);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Detection/SparseHashGridCollisionProcessor.ts\":\n/*!*****************************************************************!*\\\n !*** ./Collision/Detection/SparseHashGridCollisionProcessor.ts ***!\n \\*****************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ HashColliderProxy: () => (/* binding */ HashColliderProxy),\n/* harmony export */ SparseHashGridCollisionProcessor: () => (/* binding */ SparseHashGridCollisionProcessor)\n/* harmony export */ });\n/* harmony import */ var _Id__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Id */ \"./Id.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_Pool__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Util/Pool */ \"./Util/Pool.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Colliders/CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Group/CollisionGroup */ \"./Collision/Group/CollisionGroup.ts\");\n/* harmony import */ var _Pair__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Pair */ \"./Collision/Detection/Pair.ts\");\n/* harmony import */ var _SparseHashGrid__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./SparseHashGrid */ \"./Collision/Detection/SparseHashGrid.ts\");\n\n\n\n\n\n\n\n\n\n/**\n * Proxy type to stash collision info\n */\nclass HashColliderProxy extends _SparseHashGrid__WEBPACK_IMPORTED_MODULE_0__.HashGridProxy {\n constructor(collider, gridSize) {\n var _a, _b;\n super(collider, gridSize);\n this.collider = collider;\n this.id = -1;\n this.hasZeroBounds = false;\n /**\n * References to the hash cell the collider is a current member of\n */\n this.cells = [];\n this.gridSize = gridSize;\n const bounds = collider.bounds;\n this.hasZeroBounds = bounds.hasZeroDimensions();\n this.leftX = Math.floor(bounds.left / this.gridSize);\n this.rightX = Math.floor(bounds.right / this.gridSize);\n this.bottomY = Math.floor(bounds.bottom / this.gridSize);\n this.topY = Math.floor(bounds.top / this.gridSize);\n this.owner = collider.owner;\n this.body = (_a = this.owner) === null || _a === void 0 ? void 0 : _a.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_1__.BodyComponent);\n this.collisionType = (_b = this.body.collisionType) !== null && _b !== void 0 ? _b : _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.PreventCollision;\n }\n /**\n * Updates the hashed bounds coordinates\n */\n update() {\n var _a, _b;\n super.update();\n this.body = (_a = this.owner) === null || _a === void 0 ? void 0 : _a.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_1__.BodyComponent);\n this.collisionType = (_b = this.body.collisionType) !== null && _b !== void 0 ? _b : _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.PreventCollision;\n this.hasZeroBounds = this.collider.localBounds.hasZeroDimensions();\n }\n}\n/**\n * This collision processor uses a sparsely populated grid of uniform cells to bucket potential\n * colliders together for the purpose of detecting collision pairs and collisions.\n */\nclass SparseHashGridCollisionProcessor {\n constructor(options) {\n this._pairs = new Set();\n this._nonPairs = new Set();\n this._pairPool = new _Util_Pool__WEBPACK_IMPORTED_MODULE_3__.Pool(() => new _Pair__WEBPACK_IMPORTED_MODULE_4__.Pair({ id: (0,_Id__WEBPACK_IMPORTED_MODULE_5__.createId)('collider', 0) }, { id: (0,_Id__WEBPACK_IMPORTED_MODULE_5__.createId)('collider', 0) }), (instance) => {\n instance.colliderA = null;\n instance.colliderB = null;\n return instance;\n }, 200);\n this.gridSize = options.size;\n this.hashGrid = new _SparseHashGrid__WEBPACK_IMPORTED_MODULE_0__.SparseHashGrid({\n size: this.gridSize,\n proxyFactory: (collider, size) => new HashColliderProxy(collider, size)\n });\n this._pairPool.disableWarnings = true;\n // TODO dynamic grid size potentially larger than the largest collider\n // TODO Re-hash the objects if the median proves to be different\n }\n getColliders() {\n return Array.from(this.hashGrid.objectToProxy.keys());\n }\n query(boundsOrPoint) {\n // FIXME workaround TS: https://github.com/microsoft/TypeScript/issues/14107\n return this.hashGrid.query(boundsOrPoint);\n }\n rayCast(ray, options) {\n var _a, _b, _c;\n // DDA raycast algo\n const results = [];\n const maxDistance = (_a = options === null || options === void 0 ? void 0 : options.maxDistance) !== null && _a !== void 0 ? _a : Infinity;\n const collisionGroup = options === null || options === void 0 ? void 0 : options.collisionGroup;\n const collisionMask = !collisionGroup ? (_b = options === null || options === void 0 ? void 0 : options.collisionMask) !== null && _b !== void 0 ? _b : _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_6__.CollisionGroup.All.category : collisionGroup.category;\n const searchAllColliders = (_c = options === null || options === void 0 ? void 0 : options.searchAllColliders) !== null && _c !== void 0 ? _c : false;\n const unitRay = ray.dir.normalize();\n const dydx = unitRay.y / unitRay.x;\n const dxdy = unitRay.x / unitRay.y;\n const unitStepX = Math.sqrt(1 + dydx * dydx) * this.gridSize;\n const unitStepY = Math.sqrt(1 + dxdy * dxdy) * this.gridSize;\n const startXCoord = ray.pos.x / this.gridSize;\n const startYCoord = ray.pos.y / this.gridSize;\n const stepDir = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_7__.vec)(1, 1);\n let currentXCoord = ~~startXCoord;\n let currentYCoord = ~~startYCoord;\n let currentRayLengthX = 0;\n let currentRayLengthY = 0;\n if (unitRay.x < 0) {\n stepDir.x = -1;\n currentRayLengthX = (startXCoord - currentXCoord) * unitStepX;\n }\n else {\n stepDir.x = 1;\n currentRayLengthX = (currentXCoord + 1 - startXCoord) * unitStepX;\n }\n if (unitRay.y < 0) {\n stepDir.y = -1;\n currentRayLengthY = (startYCoord - currentYCoord) * unitStepY;\n }\n else {\n stepDir.y = 1;\n currentRayLengthY = (currentYCoord + 1 - startYCoord) * unitStepY;\n }\n const collidersVisited = new Set();\n let done = false;\n let maxIterations = 9999;\n while (!done && maxIterations > 0) {\n maxIterations--; // safety exit\n // exit if exhausted max hash grid coordinate, bounds of the sparse grid\n if (!this.hashGrid.bounds.contains((0,_Math_vector__WEBPACK_IMPORTED_MODULE_7__.vec)(currentXCoord * this.gridSize, currentYCoord * this.gridSize))) {\n break;\n }\n // Test colliders at cell\n const key = _SparseHashGrid__WEBPACK_IMPORTED_MODULE_0__.HashGridCell.calculateHashKey(currentXCoord, currentYCoord);\n const cell = this.hashGrid.sparseHashGrid.get(key);\n if (cell) {\n const cellHits = [];\n for (let colliderIndex = 0; colliderIndex < cell.proxies.length; colliderIndex++) {\n const collider = cell.proxies[colliderIndex];\n if (!collidersVisited.has(collider.collider.id.value)) {\n collidersVisited.add(collider.collider.id.value);\n if ((options === null || options === void 0 ? void 0 : options.ignoreCollisionGroupAll) && collider.body.group === _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_6__.CollisionGroup.All) {\n continue;\n }\n const canCollide = (collisionMask & collider.body.group.category) !== 0;\n // Early exit if not the right group\n if (collider.body.group && !canCollide) {\n continue;\n }\n const hit = collider.collider.rayCast(ray, maxDistance);\n // Collect up all the colliders that hit inside a cell\n // they can be in any order so we need to sort them next\n if (hit) {\n cellHits.push(hit);\n }\n }\n }\n cellHits.sort((hit1, hit2) => hit1.distance - hit2.distance);\n for (let i = 0; i < cellHits.length; i++) {\n const hit = cellHits[i];\n if (options === null || options === void 0 ? void 0 : options.filter) {\n if (options.filter(hit)) {\n results.push(hit);\n if (!searchAllColliders) {\n done = true;\n break;\n }\n }\n }\n else {\n results.push(hit);\n if (!searchAllColliders) {\n done = true;\n break;\n }\n }\n }\n }\n if (currentRayLengthX < currentRayLengthY) {\n currentXCoord += stepDir.x;\n currentRayLengthX += unitStepX;\n }\n else {\n currentYCoord += stepDir.y;\n currentRayLengthY += unitStepY;\n }\n }\n // Sort by distance\n results.sort((hit1, hit2) => hit1.distance - hit2.distance);\n if (!searchAllColliders && results.length) {\n return [results[0]];\n }\n return results;\n }\n /**\n * Adds the collider to the internal data structure for collision tracking\n * @param target\n */\n track(target) {\n let colliders = [target];\n if (target instanceof _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_8__.CompositeCollider) {\n const compColliders = target.getColliders();\n for (const c of compColliders) {\n c.owner = target.owner;\n }\n colliders = compColliders;\n }\n for (const target of colliders) {\n this.hashGrid.track(target);\n }\n }\n /**\n * Removes a collider from the internal data structure for tracking collisions\n * @param target\n */\n untrack(target) {\n let colliders = [target];\n if (target instanceof _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_8__.CompositeCollider) {\n colliders = target.getColliders();\n }\n for (const target of colliders) {\n this.hashGrid.untrack(target);\n }\n }\n _canCollide(colliderA, colliderB) {\n // Prevent self collision\n if (colliderA.collider.id === colliderB.collider.id) {\n return false;\n }\n // Colliders with the same owner do not collide (composite colliders)\n if (colliderA.owner && colliderB.owner && colliderA.owner.id === colliderB.owner.id) {\n return false;\n }\n // if the pair has a member with zero dimension don't collide\n if (colliderA.hasZeroBounds || colliderB.hasZeroBounds) {\n return false;\n }\n // If both are in the same collision group short circuit\n if (!colliderA.body.group.canCollide(colliderB.body.group)) {\n return false;\n }\n // if both are fixed short circuit\n if (colliderA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.Fixed && colliderB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.Fixed) {\n return false;\n }\n // if the either is prevent collision short circuit\n if (colliderA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.PreventCollision || colliderB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.PreventCollision) {\n return false;\n }\n // if either is dead short circuit\n if (!colliderA.owner.isActive || !colliderB.owner.isActive) {\n return false;\n }\n return true;\n }\n /**\n * Runs the broadphase sweep over tracked colliders and returns possible collision pairs\n * @param targets\n * @param elapsed\n */\n broadphase(targets, elapsed) {\n const pairs = [];\n this._pairs.clear();\n this._nonPairs.clear();\n let proxyId = 0;\n for (const proxy of this.hashGrid.objectToProxy.values()) {\n proxy.id = proxyId++; // track proxies we've already processed\n if (!proxy.owner.isActive || proxy.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.PreventCollision) {\n continue;\n }\n // for every cell proxy collider is member of\n for (let cellIndex = 0; cellIndex < proxy.cells.length; cellIndex++) {\n const cell = proxy.cells[cellIndex];\n // TODO Can we skip any cells or make this iteration faster?\n // maybe a linked list here\n for (let otherIndex = 0; otherIndex < cell.proxies.length; otherIndex++) {\n const other = cell.proxies[otherIndex];\n if (other.id === proxy.id) {\n // skip duplicates\n continue;\n }\n const id = _Pair__WEBPACK_IMPORTED_MODULE_4__.Pair.calculatePairHash(proxy.collider.id, other.collider.id);\n if (this._nonPairs.has(id)) {\n continue; // Is there a way we can re-use the non-pair cache\n }\n if (!this._pairs.has(id) && this._canCollide(proxy, other) && proxy.object.bounds.overlaps(other.object.bounds)) {\n const pair = this._pairPool.get();\n pair.colliderA = proxy.collider;\n pair.colliderB = other.collider;\n pair.id = id;\n this._pairs.add(id);\n pairs.push(pair);\n }\n else {\n this._nonPairs.add(id);\n }\n }\n }\n }\n return pairs;\n }\n /**\n * Runs a fine grain pass on collision pairs and does geometry intersection tests producing any contacts\n * @param pairs\n * @param stats\n */\n narrowphase(pairs, stats) {\n const contacts = [];\n for (let i = 0; i < pairs.length; i++) {\n const newContacts = pairs[i].collide();\n for (let j = 0; j < newContacts.length; j++) {\n const c = newContacts[j];\n contacts.push(c);\n if (stats) {\n stats.physics.contacts.set(c.id, c);\n }\n }\n }\n this._pairPool.done();\n if (stats) {\n stats.physics.collisions += contacts.length;\n }\n return contacts; // TODO maybe we can re-use contacts as likely pairs next frame\n }\n /**\n * Perform data structure maintenance, returns number of colliders updated\n */\n update(targets, elapsed) {\n return this.hashGrid.update(targets);\n }\n /**\n * Draws the internal data structure\n * @param ex\n * @param elapsed\n */\n debug(ex, elapsed) {\n this.hashGrid.debug(ex, elapsed);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Detection/SpatialPartitionStrategy.ts\":\n/*!*********************************************************!*\\\n !*** ./Collision/Detection/SpatialPartitionStrategy.ts ***!\n \\*********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SpatialPartitionStrategy: () => (/* binding */ SpatialPartitionStrategy)\n/* harmony export */ });\n/**\n * Possible collision resolution strategies\n *\n * The default is {@apilink SolverStrategy.Arcade} which performs simple axis aligned arcade style physics. This is useful for things\n * like platformers or top down games.\n *\n * More advanced rigid body physics are enabled by setting {@apilink SolverStrategy.Realistic} which allows for complicated\n * simulated physical interactions.\n */\nvar SpatialPartitionStrategy;\n(function (SpatialPartitionStrategy) {\n SpatialPartitionStrategy[\"DynamicTree\"] = \"dynamic-tree\";\n SpatialPartitionStrategy[\"SparseHashGrid\"] = \"sparse-hash-grid\";\n})(SpatialPartitionStrategy || (SpatialPartitionStrategy = {}));\n\n\n/***/ }),\n\n/***/ \"./Collision/Group/CollisionGroup.ts\":\n/*!*******************************************!*\\\n !*** ./Collision/Group/CollisionGroup.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CollisionGroup: () => (/* binding */ CollisionGroup)\n/* harmony export */ });\n/* harmony import */ var _CollisionGroupManager__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./CollisionGroupManager */ \"./Collision/Group/CollisionGroupManager.ts\");\n\n/**\n * CollisionGroups indicate like members that do not collide with each other. Use {@apilink CollisionGroupManager} to create {@apilink CollisionGroup}s\n *\n * For example:\n *\n * Players have collision group \"player\"\n *\n * ![Player Collision Group](/assets/images/docs/CollisionGroupsPlayer.png)\n *\n * Enemies have collision group \"enemy\"\n *\n * ![Enemy Collision Group](/assets/images/docs/CollisionGroupsEnemy.png)\n *\n * Blocks have collision group \"ground\"\n *\n * ![Ground collision group](/assets/images/docs/CollisionGroupsGround.png)\n *\n * Players don't collide with each other, but enemies and blocks. Likewise, enemies don't collide with each other but collide\n * with players and blocks.\n *\n * This is done with bitmasking, see the following pseudo-code\n *\n * PlayerGroup = `0b001`\n * PlayerGroupMask = `0b110`\n *\n * EnemyGroup = `0b010`\n * EnemyGroupMask = `0b101`\n *\n * BlockGroup = `0b100`\n * BlockGroupMask = `0b011`\n *\n * Should Players collide? No because the bitwise mask evaluates to 0\n * `(player1.group & player2.mask) === 0`\n * `(0b001 & 0b110) === 0`\n *\n * Should Players and Enemies collide? Yes because the bitwise mask is non-zero\n * `(player1.group & enemy1.mask) === 1`\n * `(0b001 & 0b101) === 1`\n *\n * Should Players and Blocks collide? Yes because the bitwise mask is non-zero\n * `(player1.group & blocks1.mask) === 1`\n * `(0b001 & 0b011) === 1`\n */\nclass CollisionGroup {\n /**\n * STOP!!** It is preferred that {@apilink CollisionGroupManager.create} is used to create collision groups\n * unless you know how to construct the proper bitmasks. See https://github.com/excaliburjs/Excalibur/issues/1091 for more info.\n * @param name Name of the collision group\n * @param category 32 bit category for the group, should be a unique power of 2. For example `0b001` or `0b010`\n * @param mask 32 bit mask of category, or `~category` generally. For a category of `0b001`, the mask would be `0b110`\n */\n constructor(name, category, mask) {\n this._name = name;\n this._category = category;\n this._mask = mask;\n }\n /**\n * Get the name of the collision group\n */\n get name() {\n return this._name;\n }\n /**\n * Get the category of the collision group, a 32 bit number which should be a unique power of 2\n */\n get category() {\n return this._category;\n }\n /**\n * Get the mask for this collision group\n */\n get mask() {\n return this._mask;\n }\n /**\n * Evaluates whether 2 collision groups can collide\n *\n * This means the mask has the same bit set the other category and vice versa\n * @param other CollisionGroup\n */\n canCollide(other) {\n const overlap1 = this.category & other.mask;\n const overlap2 = this.mask & other.category;\n return overlap1 !== 0 && overlap2 !== 0;\n }\n /**\n * Inverts the collision group. For example, if before the group specified \"players\",\n * inverting would specify all groups except players\n * @returns CollisionGroup\n */\n invert() {\n const group = _CollisionGroupManager__WEBPACK_IMPORTED_MODULE_0__.CollisionGroupManager.create('~(' + this.name + ')', ~this.mask | 0);\n group._category = ~this.category;\n return group;\n }\n /**\n * Combine collision groups with each other. The new group includes all of the previous groups.\n * @param collisionGroups\n */\n static combine(collisionGroups) {\n const combinedName = collisionGroups.map((c) => c.name).join('+');\n const combinedCategory = collisionGroups.reduce((current, g) => g.category | current, 0b0);\n const combinedMask = ~combinedCategory;\n return _CollisionGroupManager__WEBPACK_IMPORTED_MODULE_0__.CollisionGroupManager.create(combinedName, combinedMask);\n }\n /**\n * Creates a collision group that collides with the listed groups\n * @param collisionGroups\n */\n static collidesWith(collisionGroups) {\n const combinedName = `collidesWith(${collisionGroups.map((c) => c.name).join('+')})`;\n const combinedMask = collisionGroups.reduce((current, g) => g.category | current, 0b0);\n return _CollisionGroupManager__WEBPACK_IMPORTED_MODULE_0__.CollisionGroupManager.create(combinedName, combinedMask);\n }\n toString() {\n return `\r\ncategory: ${this.category.toString(2).padStart(32, '0')}\r\nmask: ${(this.mask >>> 0).toString(2).padStart(32, '0')}\r\n `;\n }\n}\n/**\n * The `All` {@apilink CollisionGroup} is a special group that collides with all other groups including itself,\n * it is the default collision group on colliders.\n */\nCollisionGroup.All = new CollisionGroup('Collide with all groups', -1, -1);\n\n\n/***/ }),\n\n/***/ \"./Collision/Group/CollisionGroupManager.ts\":\n/*!**************************************************!*\\\n !*** ./Collision/Group/CollisionGroupManager.ts ***!\n \\**************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CollisionGroupManager: () => (/* binding */ CollisionGroupManager)\n/* harmony export */ });\n/* harmony import */ var _CollisionGroup__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./CollisionGroup */ \"./Collision/Group/CollisionGroup.ts\");\n\n/**\n * Static class for managing collision groups in excalibur, there is a maximum of 32 collision groups possible in excalibur\n */\nclass CollisionGroupManager {\n /**\n * Create a new named collision group up to a max of 32.\n * @param name Name for the collision group\n * @param mask Optionally provide your own 32-bit mask, if none is provide the manager will generate one\n */\n static create(name, mask) {\n if (this._CURRENT_GROUP > this._MAX_GROUPS) {\n throw new Error(`Cannot have more than ${this._MAX_GROUPS} collision groups`);\n }\n if (this._GROUPS.get(name)) {\n const existingGroup = this._GROUPS.get(name);\n if (existingGroup.mask === mask) {\n return existingGroup;\n }\n throw new Error(`Collision group ${name} already exists with a different mask!`);\n }\n const group = new _CollisionGroup__WEBPACK_IMPORTED_MODULE_0__.CollisionGroup(name, this._CURRENT_BIT, mask !== undefined ? mask : ~this._CURRENT_BIT);\n this._CURRENT_BIT = (this._CURRENT_BIT << 1) | 0;\n this._CURRENT_GROUP++;\n this._GROUPS.set(name, group);\n return group;\n }\n /**\n * Get all collision groups currently tracked by excalibur\n */\n static get groups() {\n return Array.from(this._GROUPS.values());\n }\n /**\n * Get a collision group by it's name\n * @param name\n */\n static groupByName(name) {\n return this._GROUPS.get(name);\n }\n /**\n * Resets the managers internal group management state\n */\n static reset() {\n this._GROUPS = new Map();\n this._CURRENT_BIT = this._STARTING_BIT;\n this._CURRENT_GROUP = 1;\n }\n}\n// using bitmasking the maximum number of groups is 32, because that is the highest 32bit integer that JS can present.\nCollisionGroupManager._STARTING_BIT = 0b1 | 0;\nCollisionGroupManager._MAX_GROUPS = 32;\nCollisionGroupManager._CURRENT_GROUP = 1;\nCollisionGroupManager._CURRENT_BIT = CollisionGroupManager._STARTING_BIT;\nCollisionGroupManager._GROUPS = new Map();\n\n\n/***/ }),\n\n/***/ \"./Collision/Index.ts\":\n/*!****************************!*\\\n !*** ./Collision/Index.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ArcadeSolver: () => (/* reexport safe */ _Solver_ArcadeSolver__WEBPACK_IMPORTED_MODULE_24__.ArcadeSolver),\n/* harmony export */ BodyComponent: () => (/* reexport safe */ _BodyComponent__WEBPACK_IMPORTED_MODULE_0__.BodyComponent),\n/* harmony export */ BoundingBox: () => (/* reexport safe */ _BoundingBox__WEBPACK_IMPORTED_MODULE_5__.BoundingBox),\n/* harmony export */ CircleCollider: () => (/* reexport safe */ _Colliders_CircleCollider__WEBPACK_IMPORTED_MODULE_8__.CircleCollider),\n/* harmony export */ ClosestLineJumpTable: () => (/* reexport safe */ _Colliders_ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_12__.ClosestLineJumpTable),\n/* harmony export */ Collider: () => (/* reexport safe */ _Colliders_Collider__WEBPACK_IMPORTED_MODULE_4__.Collider),\n/* harmony export */ ColliderComponent: () => (/* reexport safe */ _ColliderComponent__WEBPACK_IMPORTED_MODULE_1__.ColliderComponent),\n/* harmony export */ CollisionContact: () => (/* reexport safe */ _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_17__.CollisionContact),\n/* harmony export */ CollisionGroup: () => (/* reexport safe */ _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_14__.CollisionGroup),\n/* harmony export */ CollisionGroupManager: () => (/* reexport safe */ _Group_CollisionGroupManager__WEBPACK_IMPORTED_MODULE_15__.CollisionGroupManager),\n/* harmony export */ CollisionJumpTable: () => (/* reexport safe */ _Colliders_CollisionJumpTable__WEBPACK_IMPORTED_MODULE_11__.CollisionJumpTable),\n/* harmony export */ CollisionSystem: () => (/* reexport safe */ _CollisionSystem__WEBPACK_IMPORTED_MODULE_28__.CollisionSystem),\n/* harmony export */ CollisionType: () => (/* reexport safe */ _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType),\n/* harmony export */ CompositeCollider: () => (/* reexport safe */ _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_7__.CompositeCollider),\n/* harmony export */ ContactConstraintPoint: () => (/* reexport safe */ _Solver_ContactConstraintPoint__WEBPACK_IMPORTED_MODULE_26__.ContactConstraintPoint),\n/* harmony export */ ContactSolveBias: () => (/* reexport safe */ _Solver_ContactBias__WEBPACK_IMPORTED_MODULE_25__.ContactSolveBias),\n/* harmony export */ DegreeOfFreedom: () => (/* reexport safe */ _BodyComponent__WEBPACK_IMPORTED_MODULE_0__.DegreeOfFreedom),\n/* harmony export */ DynamicTree: () => (/* reexport safe */ _Detection_DynamicTree__WEBPACK_IMPORTED_MODULE_18__.DynamicTree),\n/* harmony export */ DynamicTreeCollisionProcessor: () => (/* reexport safe */ _Detection_DynamicTreeCollisionProcessor__WEBPACK_IMPORTED_MODULE_19__.DynamicTreeCollisionProcessor),\n/* harmony export */ EdgeCollider: () => (/* reexport safe */ _Colliders_EdgeCollider__WEBPACK_IMPORTED_MODULE_9__.EdgeCollider),\n/* harmony export */ HashColliderProxy: () => (/* reexport safe */ _Detection_SparseHashGridCollisionProcessor__WEBPACK_IMPORTED_MODULE_20__.HashColliderProxy),\n/* harmony export */ HashGridCell: () => (/* reexport safe */ _Detection_SparseHashGrid__WEBPACK_IMPORTED_MODULE_21__.HashGridCell),\n/* harmony export */ HashGridProxy: () => (/* reexport safe */ _Detection_SparseHashGrid__WEBPACK_IMPORTED_MODULE_21__.HashGridProxy),\n/* harmony export */ HorizontalFirst: () => (/* reexport safe */ _Solver_ContactBias__WEBPACK_IMPORTED_MODULE_25__.HorizontalFirst),\n/* harmony export */ MotionSystem: () => (/* reexport safe */ _MotionSystem__WEBPACK_IMPORTED_MODULE_29__.MotionSystem),\n/* harmony export */ None: () => (/* reexport safe */ _Solver_ContactBias__WEBPACK_IMPORTED_MODULE_25__.None),\n/* harmony export */ Pair: () => (/* reexport safe */ _Detection_Pair__WEBPACK_IMPORTED_MODULE_16__.Pair),\n/* harmony export */ PhysicsWorld: () => (/* reexport safe */ _PhysicsWorld__WEBPACK_IMPORTED_MODULE_30__.PhysicsWorld),\n/* harmony export */ PolygonCollider: () => (/* reexport safe */ _Colliders_PolygonCollider__WEBPACK_IMPORTED_MODULE_10__.PolygonCollider),\n/* harmony export */ QuadTree: () => (/* reexport safe */ _Detection_QuadTree__WEBPACK_IMPORTED_MODULE_23__.QuadTree),\n/* harmony export */ RealisticSolver: () => (/* reexport safe */ _Solver_RealisticSolver__WEBPACK_IMPORTED_MODULE_27__.RealisticSolver),\n/* harmony export */ SeparatingAxis: () => (/* reexport safe */ _Colliders_SeparatingAxis__WEBPACK_IMPORTED_MODULE_13__.SeparatingAxis),\n/* harmony export */ SeparationInfo: () => (/* reexport safe */ _Colliders_SeparatingAxis__WEBPACK_IMPORTED_MODULE_13__.SeparationInfo),\n/* harmony export */ Shape: () => (/* reexport safe */ _Colliders_Shape__WEBPACK_IMPORTED_MODULE_6__.Shape),\n/* harmony export */ Side: () => (/* reexport safe */ _Side__WEBPACK_IMPORTED_MODULE_32__.Side),\n/* harmony export */ SolverStrategy: () => (/* reexport safe */ _SolverStrategy__WEBPACK_IMPORTED_MODULE_3__.SolverStrategy),\n/* harmony export */ SparseHashGrid: () => (/* reexport safe */ _Detection_SparseHashGrid__WEBPACK_IMPORTED_MODULE_21__.SparseHashGrid),\n/* harmony export */ SparseHashGridCollisionProcessor: () => (/* reexport safe */ _Detection_SparseHashGridCollisionProcessor__WEBPACK_IMPORTED_MODULE_20__.SparseHashGridCollisionProcessor),\n/* harmony export */ SpatialPartitionStrategy: () => (/* reexport safe */ _Detection_SpatialPartitionStrategy__WEBPACK_IMPORTED_MODULE_22__.SpatialPartitionStrategy),\n/* harmony export */ TreeNode: () => (/* reexport safe */ _Detection_DynamicTree__WEBPACK_IMPORTED_MODULE_18__.TreeNode),\n/* harmony export */ VerticalFirst: () => (/* reexport safe */ _Solver_ContactBias__WEBPACK_IMPORTED_MODULE_25__.VerticalFirst),\n/* harmony export */ getDefaultPhysicsConfig: () => (/* reexport safe */ _PhysicsConfig__WEBPACK_IMPORTED_MODULE_31__.getDefaultPhysicsConfig)\n/* harmony export */ });\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _ColliderComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ColliderComponent */ \"./Collision/ColliderComponent.ts\");\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _SolverStrategy__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./SolverStrategy */ \"./Collision/SolverStrategy.ts\");\n/* harmony import */ var _Colliders_Collider__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Colliders/Collider */ \"./Collision/Colliders/Collider.ts\");\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Colliders_Shape__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Colliders/Shape */ \"./Collision/Colliders/Shape.ts\");\n/* harmony import */ var _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Colliders/CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var _Colliders_CircleCollider__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Colliders/CircleCollider */ \"./Collision/Colliders/CircleCollider.ts\");\n/* harmony import */ var _Colliders_EdgeCollider__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Colliders/EdgeCollider */ \"./Collision/Colliders/EdgeCollider.ts\");\n/* harmony import */ var _Colliders_PolygonCollider__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Colliders/PolygonCollider */ \"./Collision/Colliders/PolygonCollider.ts\");\n/* harmony import */ var _Colliders_CollisionJumpTable__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Colliders/CollisionJumpTable */ \"./Collision/Colliders/CollisionJumpTable.ts\");\n/* harmony import */ var _Colliders_ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Colliders/ClosestLineJumpTable */ \"./Collision/Colliders/ClosestLineJumpTable.ts\");\n/* harmony import */ var _Colliders_SeparatingAxis__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Colliders/SeparatingAxis */ \"./Collision/Colliders/SeparatingAxis.ts\");\n/* harmony import */ var _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Group/CollisionGroup */ \"./Collision/Group/CollisionGroup.ts\");\n/* harmony import */ var _Group_CollisionGroupManager__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Group/CollisionGroupManager */ \"./Collision/Group/CollisionGroupManager.ts\");\n/* harmony import */ var _Detection_Pair__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Detection/Pair */ \"./Collision/Detection/Pair.ts\");\n/* harmony import */ var _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./Detection/CollisionContact */ \"./Collision/Detection/CollisionContact.ts\");\n/* harmony import */ var _Detection_DynamicTree__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Detection/DynamicTree */ \"./Collision/Detection/DynamicTree.ts\");\n/* harmony import */ var _Detection_DynamicTreeCollisionProcessor__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./Detection/DynamicTreeCollisionProcessor */ \"./Collision/Detection/DynamicTreeCollisionProcessor.ts\");\n/* harmony import */ var _Detection_SparseHashGridCollisionProcessor__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./Detection/SparseHashGridCollisionProcessor */ \"./Collision/Detection/SparseHashGridCollisionProcessor.ts\");\n/* harmony import */ var _Detection_SparseHashGrid__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./Detection/SparseHashGrid */ \"./Collision/Detection/SparseHashGrid.ts\");\n/* harmony import */ var _Detection_SpatialPartitionStrategy__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./Detection/SpatialPartitionStrategy */ \"./Collision/Detection/SpatialPartitionStrategy.ts\");\n/* harmony import */ var _Detection_QuadTree__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./Detection/QuadTree */ \"./Collision/Detection/QuadTree.ts\");\n/* harmony import */ var _Solver_ArcadeSolver__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./Solver/ArcadeSolver */ \"./Collision/Solver/ArcadeSolver.ts\");\n/* harmony import */ var _Solver_ContactBias__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./Solver/ContactBias */ \"./Collision/Solver/ContactBias.ts\");\n/* harmony import */ var _Solver_ContactConstraintPoint__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./Solver/ContactConstraintPoint */ \"./Collision/Solver/ContactConstraintPoint.ts\");\n/* harmony import */ var _Solver_RealisticSolver__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./Solver/RealisticSolver */ \"./Collision/Solver/RealisticSolver.ts\");\n/* harmony import */ var _CollisionSystem__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./CollisionSystem */ \"./Collision/CollisionSystem.ts\");\n/* harmony import */ var _MotionSystem__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./MotionSystem */ \"./Collision/MotionSystem.ts\");\n/* harmony import */ var _PhysicsWorld__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./PhysicsWorld */ \"./Collision/PhysicsWorld.ts\");\n/* harmony import */ var _PhysicsConfig__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./PhysicsConfig */ \"./Collision/PhysicsConfig.ts\");\n/* harmony import */ var _Side__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./Side */ \"./Collision/Side.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Collision/Integrator.ts\":\n/*!*********************************!*\\\n !*** ./Collision/Integrator.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EulerIntegrator: () => (/* binding */ EulerIntegrator)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n\nclass EulerIntegrator {\n static integrate(transform, motion, totalAcc, elapsed) {\n const seconds = elapsed / 1000;\n // This code looks a little wild, but it's to avoid creating any new Vector instances\n // integration is done in a tight loop so this is key to avoid GC'ing\n motion.vel.addEqual(totalAcc.scale(seconds, EulerIntegrator._ACC));\n transform.pos\n .add(motion.vel.scale(seconds, EulerIntegrator._VEL), EulerIntegrator._POS)\n .addEqual(totalAcc.scale(0.5 * seconds * seconds, EulerIntegrator._VEL_ACC));\n motion.angularVelocity += motion.torque * (1.0 / motion.inertia) * seconds;\n const rotation = transform.rotation + motion.angularVelocity * seconds;\n transform.scale.add(motion.scaleFactor.scale(seconds, this._SCALE_FACTOR), EulerIntegrator._SCALE);\n const tx = transform.get();\n tx.setTransform(EulerIntegrator._POS, rotation, EulerIntegrator._SCALE);\n }\n}\n// Scratch vectors to avoid allocation\nEulerIntegrator._POS = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\nEulerIntegrator._SCALE = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(1, 1);\nEulerIntegrator._ACC = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\nEulerIntegrator._VEL = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\nEulerIntegrator._VEL_ACC = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\nEulerIntegrator._SCALE_FACTOR = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\n\n\n/***/ }),\n\n/***/ \"./Collision/MotionSystem.ts\":\n/*!***********************************!*\\\n !*** ./Collision/MotionSystem.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MotionSystem: () => (/* binding */ MotionSystem)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Priority.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Integrator__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Integrator */ \"./Collision/Integrator.ts\");\n\n\n\n\n\n\n\nclass MotionSystem extends _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.System {\n constructor(world, physics) {\n super();\n this.world = world;\n this.physics = physics;\n this.systemType = _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.SystemType.Update;\n this._physicsConfigDirty = false;\n physics.$configUpdate.subscribe(() => (this._physicsConfigDirty = true));\n this.query = this.world.query([_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent, _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent]);\n }\n update(elapsed) {\n let transform;\n let motion;\n const entities = this.query.entities;\n const substep = this.physics.config.substep;\n for (let i = 0; i < entities.length; i++) {\n transform = entities[i].get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n motion = entities[i].get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n const optionalBody = entities[i].get(_BodyComponent__WEBPACK_IMPORTED_MODULE_3__.BodyComponent);\n if (this._physicsConfigDirty && optionalBody) {\n optionalBody.updatePhysicsConfig(this.physics.config.bodies);\n }\n if (optionalBody === null || optionalBody === void 0 ? void 0 : optionalBody.isSleeping) {\n continue;\n }\n const totalAcc = motion.acc.clone();\n if ((optionalBody === null || optionalBody === void 0 ? void 0 : optionalBody.collisionType) === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Active && (optionalBody === null || optionalBody === void 0 ? void 0 : optionalBody.useGravity)) {\n totalAcc.addEqual(this.physics.config.gravity);\n }\n // capture old transform of this entity and all of its children so that\n // any transform properties that derived from their parents are properly captured\n if (!entities[i].parent) {\n this.captureOldTransformWithChildren(entities[i]);\n }\n // Update transform and motion based on Euler linear algebra\n _Integrator__WEBPACK_IMPORTED_MODULE_5__.EulerIntegrator.integrate(transform, motion, totalAcc, elapsed / substep);\n }\n this._physicsConfigDirty = false;\n }\n captureOldTransformWithChildren(entity) {\n var _a;\n (_a = entity.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_3__.BodyComponent)) === null || _a === void 0 ? void 0 : _a.captureOldTransform();\n for (let i = 0; i < entity.children.length; i++) {\n this.captureOldTransformWithChildren(entity.children[i]);\n }\n }\n}\nMotionSystem.priority = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_6__.SystemPriority.Higher;\n\n\n/***/ }),\n\n/***/ \"./Collision/PhysicsConfig.ts\":\n/*!************************************!*\\\n !*** ./Collision/PhysicsConfig.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ getDefaultPhysicsConfig: () => (/* binding */ getDefaultPhysicsConfig)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _SolverStrategy__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./SolverStrategy */ \"./Collision/SolverStrategy.ts\");\n/* harmony import */ var _Solver_ContactBias__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Solver/ContactBias */ \"./Collision/Solver/ContactBias.ts\");\n/* harmony import */ var _Detection_SpatialPartitionStrategy__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Detection/SpatialPartitionStrategy */ \"./Collision/Detection/SpatialPartitionStrategy.ts\");\n\n\n\n\nconst getDefaultPhysicsConfig = () => ({\n enabled: true,\n gravity: (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0).clone(),\n solver: _SolverStrategy__WEBPACK_IMPORTED_MODULE_1__.SolverStrategy.Arcade,\n substep: 1,\n colliders: {\n compositeStrategy: 'together'\n },\n continuous: {\n checkForFastBodies: true,\n disableMinimumSpeedForFastBody: false,\n surfaceEpsilon: 0.1\n },\n bodies: {\n canSleepByDefault: false,\n sleepEpsilon: 0.07,\n wakeThreshold: 0.07 * 3,\n sleepBias: 0.9,\n defaultMass: 10\n },\n spatialPartition: _Detection_SpatialPartitionStrategy__WEBPACK_IMPORTED_MODULE_2__.SpatialPartitionStrategy.SparseHashGrid,\n sparseHashGrid: {\n size: 100\n },\n dynamicTree: {\n boundsPadding: 5,\n velocityMultiplier: 2\n },\n arcade: {\n contactSolveBias: _Solver_ContactBias__WEBPACK_IMPORTED_MODULE_3__.ContactSolveBias.None\n },\n realistic: {\n positionIterations: 3,\n velocityIterations: 8,\n slop: 1,\n steeringFactor: 0.2,\n warmStart: true\n }\n});\n\n\n/***/ }),\n\n/***/ \"./Collision/PhysicsWorld.ts\":\n/*!***********************************!*\\\n !*** ./Collision/PhysicsWorld.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PhysicsWorld: () => (/* binding */ PhysicsWorld)\n/* harmony export */ });\n/* harmony import */ var _Util_Observable__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Util/Observable */ \"./Util/Observable.ts\");\n/* harmony import */ var _Index__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Index */ \"./Collision/Detection/SparseHashGridCollisionProcessor.ts\");\n/* harmony import */ var _Index__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Index */ \"./Collision/Detection/DynamicTreeCollisionProcessor.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Util_Watch__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Util/Watch */ \"./Util/Watch.ts\");\n/* harmony import */ var _Detection_SpatialPartitionStrategy__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Detection/SpatialPartitionStrategy */ \"./Collision/Detection/SpatialPartitionStrategy.ts\");\n\n\n\n\n\nclass PhysicsWorld {\n get config() {\n return (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_0__.watchDeep)(this._config, (change) => {\n this.$configUpdate.notifyAll(change);\n });\n }\n set config(newConfig) {\n this._config = newConfig;\n this.$configUpdate.notifyAll(newConfig);\n }\n /**\n * Spatial data structure for locating potential collision pairs and ray casts\n */\n get collisionProcessor() {\n if (this._configDirty) {\n this._configDirty = false;\n // preserve tracked colliders if config updates\n const colliders = this._collisionProcessor.getColliders();\n if (this._config.spatialPartition === _Detection_SpatialPartitionStrategy__WEBPACK_IMPORTED_MODULE_1__.SpatialPartitionStrategy.SparseHashGrid) {\n this._collisionProcessor = new _Index__WEBPACK_IMPORTED_MODULE_2__.SparseHashGridCollisionProcessor(this._config.sparseHashGrid);\n }\n else {\n this._collisionProcessor = new _Index__WEBPACK_IMPORTED_MODULE_3__.DynamicTreeCollisionProcessor(this._config);\n }\n for (const collider of colliders) {\n this._collisionProcessor.track(collider);\n }\n }\n return this._collisionProcessor;\n }\n constructor(config) {\n this.$configUpdate = new _Util_Observable__WEBPACK_IMPORTED_MODULE_4__.Observable();\n this._configDirty = false;\n this.config = config;\n this.$configUpdate.subscribe((config) => {\n this._configDirty = true;\n _BodyComponent__WEBPACK_IMPORTED_MODULE_5__.BodyComponent.updateDefaultPhysicsConfig(config.bodies);\n });\n if (this._config.spatialPartition === _Detection_SpatialPartitionStrategy__WEBPACK_IMPORTED_MODULE_1__.SpatialPartitionStrategy.SparseHashGrid) {\n this._collisionProcessor = new _Index__WEBPACK_IMPORTED_MODULE_2__.SparseHashGridCollisionProcessor(this._config.sparseHashGrid);\n }\n else {\n this._collisionProcessor = new _Index__WEBPACK_IMPORTED_MODULE_3__.DynamicTreeCollisionProcessor(this._config);\n }\n }\n /**\n * Raycast into the scene's physics world\n * @param ray\n * @param options\n */\n rayCast(ray, options) {\n return this.collisionProcessor.rayCast(ray, options);\n }\n query(pointOrBounds) {\n // FIXME workaround TS: https://github.com/microsoft/TypeScript/issues/14107\n return this._collisionProcessor.query(pointOrBounds);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Side.ts\":\n/*!***************************!*\\\n !*** ./Collision/Side.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Side: () => (/* binding */ Side)\n/* harmony export */ });\n/**\n * An enum that describes the sides of an axis aligned box for collision\n */\nvar Side;\n(function (Side) {\n Side[\"None\"] = \"None\";\n Side[\"Top\"] = \"Top\";\n Side[\"Bottom\"] = \"Bottom\";\n Side[\"Left\"] = \"Left\";\n Side[\"Right\"] = \"Right\";\n})(Side || (Side = {}));\n(function (Side) {\n /**\n * Returns the opposite side from the current\n */\n function getOpposite(side) {\n if (side === Side.Top) {\n return Side.Bottom;\n }\n if (side === Side.Bottom) {\n return Side.Top;\n }\n if (side === Side.Left) {\n return Side.Right;\n }\n if (side === Side.Right) {\n return Side.Left;\n }\n return Side.None;\n }\n Side.getOpposite = getOpposite;\n /**\n * Given a vector, return the Side most in that direction\n */\n function fromDirection(direction) {\n if (Math.abs(direction.x) >= Math.abs(direction.y)) {\n if (direction.x <= 0) {\n return Side.Left;\n }\n return Side.Right;\n }\n if (direction.y <= 0) {\n return Side.Top;\n }\n return Side.Bottom;\n }\n Side.fromDirection = fromDirection;\n})(Side || (Side = {}));\n\n\n/***/ }),\n\n/***/ \"./Collision/SolverStrategy.ts\":\n/*!*************************************!*\\\n !*** ./Collision/SolverStrategy.ts ***!\n \\*************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SolverStrategy: () => (/* binding */ SolverStrategy)\n/* harmony export */ });\n/**\n * Possible collision resolution strategies\n *\n * The default is {@apilink SolverStrategy.Arcade} which performs simple axis aligned arcade style physics. This is useful for things\n * like platformers or top down games.\n *\n * More advanced rigid body physics are enabled by setting {@apilink SolverStrategy.Realistic} which allows for complicated\n * simulated physical interactions.\n */\nvar SolverStrategy;\n(function (SolverStrategy) {\n SolverStrategy[\"Arcade\"] = \"arcade\";\n SolverStrategy[\"Realistic\"] = \"realistic\";\n})(SolverStrategy || (SolverStrategy = {}));\n\n\n/***/ }),\n\n/***/ \"./Collision/Solver/ArcadeSolver.ts\":\n/*!******************************************!*\\\n !*** ./Collision/Solver/ArcadeSolver.ts ***!\n \\******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ArcadeSolver: () => (/* binding */ ArcadeSolver)\n/* harmony export */ });\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Events */ \"./Events.ts\");\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Side__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Side */ \"./Collision/Side.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _ContactBias__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ContactBias */ \"./Collision/Solver/ContactBias.ts\");\n\n\n\n\n\n/**\n * ArcadeSolver is the default in Excalibur. It solves collisions so that there is no overlap between contacts,\n * and negates velocity along the collision normal.\n *\n * This is usually the type of collisions used for 2D games that don't need a more realistic collision simulation.\n *\n */\nclass ArcadeSolver {\n constructor(config) {\n this.config = config;\n this.directionMap = new Map();\n this.distanceMap = new Map();\n }\n solve(contacts) {\n // Events and init\n this.preSolve(contacts);\n // Remove any canceled contacts\n contacts = contacts.filter((c) => !c.isCanceled());\n // Locate collision bias order\n let bias;\n switch (this.config.contactSolveBias) {\n case _ContactBias__WEBPACK_IMPORTED_MODULE_0__.ContactSolveBias.HorizontalFirst: {\n bias = _ContactBias__WEBPACK_IMPORTED_MODULE_0__.HorizontalFirst;\n break;\n }\n case _ContactBias__WEBPACK_IMPORTED_MODULE_0__.ContactSolveBias.VerticalFirst: {\n bias = _ContactBias__WEBPACK_IMPORTED_MODULE_0__.VerticalFirst;\n break;\n }\n default: {\n bias = _ContactBias__WEBPACK_IMPORTED_MODULE_0__.None;\n }\n }\n // Sort by bias (None, VerticalFirst, HorizontalFirst) to avoid artifacts with seams\n // Sort contacts by distance to avoid artifacts with seams\n // It's important to solve in a specific order\n contacts.sort((a, b) => {\n const aDir = this.directionMap.get(a.id);\n const bDir = this.directionMap.get(b.id);\n const aDist = this.distanceMap.get(a.id);\n const bDist = this.distanceMap.get(b.id);\n return bias[aDir] - bias[bDir] || aDist - bDist;\n });\n for (const contact of contacts) {\n // Solve position first in arcade\n this.solvePosition(contact);\n // Solve velocity second in arcade\n this.solveVelocity(contact);\n }\n // Events and any contact house-keeping the solver needs\n this.postSolve(contacts);\n return contacts;\n }\n preSolve(contacts) {\n const epsilon = 0.0001;\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n if (Math.abs(contact.mtv.x) < epsilon && Math.abs(contact.mtv.y) < epsilon) {\n // Cancel near 0 mtv collisions\n contact.cancel();\n continue;\n }\n const side = _Side__WEBPACK_IMPORTED_MODULE_1__.Side.fromDirection(contact.mtv);\n const mtv = contact.mtv.negate();\n const distance = Math.abs(contact.info.separation);\n this.distanceMap.set(contact.id, distance);\n this.directionMap.set(contact.id, side === _Side__WEBPACK_IMPORTED_MODULE_1__.Side.Left || side === _Side__WEBPACK_IMPORTED_MODULE_1__.Side.Right ? 'horizontal' : 'vertical');\n // Publish collision events on both participants\n contact.colliderA.events.emit('precollision', new _Events__WEBPACK_IMPORTED_MODULE_2__.PreCollisionEvent(contact.colliderA, contact.colliderB, side, mtv, contact));\n contact.colliderB.events.emit('precollision', new _Events__WEBPACK_IMPORTED_MODULE_2__.PreCollisionEvent(contact.colliderB, contact.colliderA, _Side__WEBPACK_IMPORTED_MODULE_1__.Side.getOpposite(side), mtv.negate(), contact));\n }\n }\n postSolve(contacts) {\n var _a, _b;\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n if (contact.isCanceled()) {\n continue;\n }\n const colliderA = contact.colliderA;\n const colliderB = contact.colliderB;\n const bodyA = (_a = colliderA.owner) === null || _a === void 0 ? void 0 : _a.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_3__.BodyComponent);\n const bodyB = (_b = colliderB.owner) === null || _b === void 0 ? void 0 : _b.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_3__.BodyComponent);\n if (bodyA && bodyB) {\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Passive || bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Passive) {\n continue;\n }\n }\n const side = _Side__WEBPACK_IMPORTED_MODULE_1__.Side.fromDirection(contact.mtv);\n const mtv = contact.mtv.negate();\n // Publish collision events on both participants\n contact.colliderA.events.emit('postcollision', new _Events__WEBPACK_IMPORTED_MODULE_2__.PostCollisionEvent(contact.colliderA, contact.colliderB, side, mtv, contact));\n contact.colliderB.events.emit('postcollision', new _Events__WEBPACK_IMPORTED_MODULE_2__.PostCollisionEvent(contact.colliderB, contact.colliderA, _Side__WEBPACK_IMPORTED_MODULE_1__.Side.getOpposite(side), mtv.negate(), contact));\n }\n }\n solvePosition(contact) {\n var _a, _b;\n const epsilon = 0.0001;\n // if bounds no longer intersect skip to the next\n // this removes jitter from overlapping/stacked solid tiles or a wall of solid tiles\n if (!contact.colliderA.bounds.overlaps(contact.colliderB.bounds, epsilon)) {\n // Cancel the contact to prevent and solving\n contact.cancel();\n return;\n }\n if (Math.abs(contact.mtv.x) < epsilon && Math.abs(contact.mtv.y) < epsilon) {\n // Cancel near 0 mtv collisions\n contact.cancel();\n return;\n }\n let mtv = contact.mtv;\n const colliderA = contact.colliderA;\n const colliderB = contact.colliderB;\n const bodyA = (_a = colliderA.owner) === null || _a === void 0 ? void 0 : _a.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_3__.BodyComponent);\n const bodyB = (_b = colliderB.owner) === null || _b === void 0 ? void 0 : _b.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_3__.BodyComponent);\n if (bodyA && bodyB) {\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Passive || bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Passive) {\n return;\n }\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Active && bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Active) {\n // split overlaps if both are Active\n mtv = mtv.scale(0.5);\n }\n // Resolve overlaps\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Active) {\n bodyA.globalPos.x -= mtv.x;\n bodyA.globalPos.y -= mtv.y;\n colliderA.update(bodyA.transform.get());\n }\n if (bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Active) {\n bodyB.globalPos.x += mtv.x;\n bodyB.globalPos.y += mtv.y;\n colliderB.update(bodyB.transform.get());\n }\n }\n }\n solveVelocity(contact) {\n var _a, _b;\n if (contact.isCanceled()) {\n return;\n }\n const colliderA = contact.colliderA;\n const colliderB = contact.colliderB;\n const bodyA = (_a = colliderA.owner) === null || _a === void 0 ? void 0 : _a.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_3__.BodyComponent);\n const bodyB = (_b = colliderB.owner) === null || _b === void 0 ? void 0 : _b.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_3__.BodyComponent);\n if (bodyA && bodyB) {\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Passive || bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Passive) {\n return;\n }\n const normal = contact.normal;\n const opposite = normal.negate();\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Active) {\n // only adjust velocity if the contact normal is opposite to the current velocity\n // this avoids catching edges on a platform when sliding off\n if (bodyA.vel.normalize().dot(opposite) < 0) {\n // Cancel out velocity opposite direction of collision normal\n const velAdj = normal.scale(normal.dot(bodyA.vel.negate()));\n bodyA.vel = bodyA.vel.add(velAdj);\n }\n }\n if (bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Active) {\n // only adjust velocity if the contact normal is opposite to the current velocity\n // this avoids catching edges on a platform\n if (bodyB.vel.normalize().dot(normal) < 0) {\n const velAdj = opposite.scale(opposite.dot(bodyB.vel.negate()));\n bodyB.vel = bodyB.vel.add(velAdj);\n }\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Solver/ContactBias.ts\":\n/*!*****************************************!*\\\n !*** ./Collision/Solver/ContactBias.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ContactSolveBias: () => (/* binding */ ContactSolveBias),\n/* harmony export */ HorizontalFirst: () => (/* binding */ HorizontalFirst),\n/* harmony export */ None: () => (/* binding */ None),\n/* harmony export */ VerticalFirst: () => (/* binding */ VerticalFirst)\n/* harmony export */ });\n/**\n * Tells the Arcade collision solver to prefer certain contacts over others\n */\nvar ContactSolveBias;\n(function (ContactSolveBias) {\n ContactSolveBias[\"None\"] = \"none\";\n ContactSolveBias[\"VerticalFirst\"] = \"vertical-first\";\n ContactSolveBias[\"HorizontalFirst\"] = \"horizontal-first\";\n})(ContactSolveBias || (ContactSolveBias = {}));\n/**\n * Vertical First contact solve bias Used by the {@apilink ArcadeSolver} to sort contacts\n */\nconst VerticalFirst = {\n vertical: 1,\n horizontal: 2\n};\n/**\n * Horizontal First contact solve bias Used by the {@apilink ArcadeSolver} to sort contacts\n */\nconst HorizontalFirst = {\n horizontal: 1,\n vertical: 2\n};\n/**\n * None value, {@apilink ArcadeSolver} sorts contacts using distance by default\n */\nconst None = {\n horizontal: 0,\n vertical: 0\n};\n\n\n/***/ }),\n\n/***/ \"./Collision/Solver/ContactConstraintPoint.ts\":\n/*!****************************************************!*\\\n !*** ./Collision/Solver/ContactConstraintPoint.ts ***!\n \\****************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ContactConstraintPoint: () => (/* binding */ ContactConstraintPoint)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n\n/**\n * Holds information about contact points, meant to be reused over multiple frames of contact\n */\nclass ContactConstraintPoint {\n constructor(point, local, contact) {\n this.point = point;\n this.local = local;\n this.contact = contact;\n /**\n * Impulse accumulated over time in normal direction\n */\n this.normalImpulse = 0;\n /**\n * Impulse accumulated over time in the tangent direction\n */\n this.tangentImpulse = 0;\n /**\n * Effective mass seen in the normal direction\n */\n this.normalMass = 0;\n /**\n * Effective mass seen in the tangent direction\n */\n this.tangentMass = 0;\n /**\n * Direction from center of mass of bodyA to contact point\n */\n this.aToContact = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\n /**\n * Direction from center of mass of bodyB to contact point\n */\n this.bToContact = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\n /**\n * Original contact velocity combined with bounciness\n */\n this.originalVelocityAndRestitution = 0;\n this.update();\n }\n /**\n * Updates the contact information\n */\n update() {\n const bodyA = this.contact.bodyA;\n const bodyB = this.contact.bodyB;\n if (bodyA && bodyB) {\n const normal = this.contact.normal;\n const tangent = this.contact.tangent;\n this.aToContact = this.point.sub(bodyA.globalPos);\n this.bToContact = this.point.sub(bodyB.globalPos);\n const aToContactNormal = this.aToContact.cross(normal);\n const bToContactNormal = this.bToContact.cross(normal);\n this.normalMass =\n bodyA.inverseMass +\n bodyB.inverseMass +\n bodyA.inverseInertia * aToContactNormal * aToContactNormal +\n bodyB.inverseInertia * bToContactNormal * bToContactNormal;\n const aToContactTangent = this.aToContact.cross(tangent);\n const bToContactTangent = this.bToContact.cross(tangent);\n this.tangentMass =\n bodyA.inverseMass +\n bodyB.inverseMass +\n bodyA.inverseInertia * aToContactTangent * aToContactTangent +\n bodyB.inverseInertia * bToContactTangent * bToContactTangent;\n }\n return this;\n }\n /**\n * Returns the relative velocity between bodyA and bodyB\n */\n getRelativeVelocity() {\n const bodyA = this.contact.bodyA;\n const bodyB = this.contact.bodyB;\n if (bodyA && bodyB) {\n // Relative velocity in linear terms\n // Angular to linear velocity formula -> omega = velocity/radius so omega x radius = velocity\n const velA = bodyA.vel.add(_Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.cross(bodyA.angularVelocity, this.aToContact));\n const velB = bodyB.vel.add(_Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.cross(bodyB.angularVelocity, this.bToContact));\n return velB.sub(velA);\n }\n return _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Solver/RealisticSolver.ts\":\n/*!*********************************************!*\\\n !*** ./Collision/Solver/RealisticSolver.ts ***!\n \\*********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RealisticSolver: () => (/* binding */ RealisticSolver)\n/* harmony export */ });\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Events */ \"./Events.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _ContactConstraintPoint__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ContactConstraintPoint */ \"./Collision/Solver/ContactConstraintPoint.ts\");\n/* harmony import */ var _Side__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Side */ \"./Collision/Side.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Colliders_CollisionJumpTable__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Colliders/CollisionJumpTable */ \"./Collision/Colliders/CollisionJumpTable.ts\");\n\n\n\n\n\n\n\nclass RealisticSolver {\n constructor(config) {\n this.config = config;\n this.lastFrameContacts = new Map();\n // map contact id to contact points\n this.idToContactConstraint = new Map();\n }\n getContactConstraints(id) {\n var _a;\n return (_a = this.idToContactConstraint.get(id)) !== null && _a !== void 0 ? _a : [];\n }\n solve(contacts) {\n // Events and init\n this.preSolve(contacts);\n // Remove any canceled contacts\n contacts = contacts.filter((c) => !c.isCanceled());\n // Solve velocity first\n this.solveVelocity(contacts);\n // Solve position last because non-overlap is the most important\n this.solvePosition(contacts);\n // Events and any contact house-keeping the solver needs\n this.postSolve(contacts);\n return contacts;\n }\n preSolve(contacts) {\n var _a, _b, _c;\n const epsilon = 0.0001;\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n if (Math.abs(contact.mtv.x) < epsilon && Math.abs(contact.mtv.y) < epsilon) {\n // Cancel near 0 mtv collisions\n contact.cancel();\n continue;\n }\n // Publish collision events on both participants\n const side = _Side__WEBPACK_IMPORTED_MODULE_0__.Side.fromDirection(contact.mtv);\n contact.colliderA.events.emit('precollision', new _Events__WEBPACK_IMPORTED_MODULE_1__.PreCollisionEvent(contact.colliderA, contact.colliderB, side, contact.mtv, contact));\n contact.colliderA.events.emit('beforecollisionresolve', new _Events__WEBPACK_IMPORTED_MODULE_1__.CollisionPreSolveEvent(contact.colliderA, contact.colliderB, side, contact.mtv, contact));\n contact.colliderB.events.emit('precollision', new _Events__WEBPACK_IMPORTED_MODULE_1__.PreCollisionEvent(contact.colliderB, contact.colliderA, _Side__WEBPACK_IMPORTED_MODULE_0__.Side.getOpposite(side), contact.mtv.negate(), contact));\n contact.colliderB.events.emit('beforecollisionresolve', new _Events__WEBPACK_IMPORTED_MODULE_1__.CollisionPreSolveEvent(contact.colliderB, contact.colliderA, _Side__WEBPACK_IMPORTED_MODULE_0__.Side.getOpposite(side), contact.mtv.negate(), contact));\n // Match awake state for sleeping\n contact.matchAwake();\n }\n // Keep track of contacts that done\n const finishedContactIds = Array.from(this.idToContactConstraint.keys());\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n // Remove all current contacts that are not done\n const index = finishedContactIds.indexOf(contact.id);\n if (index > -1) {\n finishedContactIds.splice(index, 1);\n }\n const contactPoints = (_a = this.idToContactConstraint.get(contact.id)) !== null && _a !== void 0 ? _a : [];\n let pointIndex = 0;\n const bodyA = contact.bodyA;\n const bodyB = contact.bodyB;\n if (bodyA && bodyB) {\n for (let j = 0; j < contact.points.length; j++) {\n const point = contact.points[j];\n const normal = contact.normal;\n const tangent = contact.tangent;\n const aToContact = point.sub(bodyA.globalPos);\n const bToContact = point.sub(bodyB.globalPos);\n const aToContactNormal = aToContact.cross(normal);\n const bToContactNormal = bToContact.cross(normal);\n const normalMass = bodyA.inverseMass +\n bodyB.inverseMass +\n bodyA.inverseInertia * aToContactNormal * aToContactNormal +\n bodyB.inverseInertia * bToContactNormal * bToContactNormal;\n const aToContactTangent = aToContact.cross(tangent);\n const bToContactTangent = bToContact.cross(tangent);\n const tangentMass = bodyA.inverseMass +\n bodyB.inverseMass +\n bodyA.inverseInertia * aToContactTangent * aToContactTangent +\n bodyB.inverseInertia * bToContactTangent * bToContactTangent;\n // Preserve normal/tangent impulse by re-using the contact point if it's close\n if (contactPoints[pointIndex] && ((_c = (_b = contactPoints[pointIndex]) === null || _b === void 0 ? void 0 : _b.point) === null || _c === void 0 ? void 0 : _c.squareDistance(point)) < 4) {\n contactPoints[pointIndex].point = point;\n contactPoints[pointIndex].local = contact.localPoints[pointIndex];\n }\n else {\n // new contact if it's not close or doesn't exist\n contactPoints[pointIndex] = new _ContactConstraintPoint__WEBPACK_IMPORTED_MODULE_2__.ContactConstraintPoint(point, contact.localPoints[pointIndex], contact);\n }\n // Update contact point calculations\n contactPoints[pointIndex].aToContact = aToContact;\n contactPoints[pointIndex].bToContact = bToContact;\n contactPoints[pointIndex].normalMass = 1.0 / normalMass;\n contactPoints[pointIndex].tangentMass = 1.0 / tangentMass;\n // Calculate relative velocity before solving to accurately do restitution\n const restitution = bodyA.bounciness > bodyB.bounciness ? bodyA.bounciness : bodyB.bounciness;\n const relativeVelocity = contact.normal.dot(contactPoints[pointIndex].getRelativeVelocity());\n contactPoints[pointIndex].originalVelocityAndRestitution = 0;\n if (relativeVelocity < -0.1) {\n // TODO what's a good threshold here?\n contactPoints[pointIndex].originalVelocityAndRestitution = -restitution * relativeVelocity;\n }\n pointIndex++;\n }\n }\n this.idToContactConstraint.set(contact.id, contactPoints);\n }\n // Clean up any contacts that did not occur last frame\n for (const id of finishedContactIds) {\n this.idToContactConstraint.delete(id);\n }\n // Warm contacts with accumulated impulse\n // Useful for tall stacks\n if (this.config.warmStart) {\n this.warmStart(contacts);\n }\n else {\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n const contactPoints = this.getContactConstraints(contact.id);\n for (const point of contactPoints) {\n point.normalImpulse = 0;\n point.tangentImpulse = 0;\n }\n }\n }\n }\n postSolve(contacts) {\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n const bodyA = contact.bodyA;\n const bodyB = contact.bodyB;\n if (bodyA && bodyB) {\n // Skip post solve for active+passive collisions\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_3__.CollisionType.Passive || bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_3__.CollisionType.Passive) {\n continue;\n }\n // Update motion values for sleeping\n bodyA.updateMotion();\n bodyB.updateMotion();\n }\n // Publish collision events on both participants\n const side = _Side__WEBPACK_IMPORTED_MODULE_0__.Side.fromDirection(contact.mtv);\n contact.colliderA.events.emit('postcollision', new _Events__WEBPACK_IMPORTED_MODULE_1__.PostCollisionEvent(contact.colliderA, contact.colliderB, side, contact.mtv, contact));\n contact.colliderA.events.emit('aftercollisionresolve', new _Events__WEBPACK_IMPORTED_MODULE_1__.CollisionPostSolveEvent(contact.colliderA, contact.colliderB, side, contact.mtv, contact));\n contact.colliderB.events.emit('postcollision', new _Events__WEBPACK_IMPORTED_MODULE_1__.PostCollisionEvent(contact.colliderB, contact.colliderA, _Side__WEBPACK_IMPORTED_MODULE_0__.Side.getOpposite(side), contact.mtv.negate(), contact));\n contact.colliderB.events.emit('aftercollisionresolve', new _Events__WEBPACK_IMPORTED_MODULE_1__.CollisionPostSolveEvent(contact.colliderB, contact.colliderA, _Side__WEBPACK_IMPORTED_MODULE_0__.Side.getOpposite(side), contact.mtv.negate(), contact));\n }\n // Store contacts\n this.lastFrameContacts.clear();\n for (let i = 0; i < contacts.length; i++) {\n const c = contacts[i];\n this.lastFrameContacts.set(c.id, c);\n }\n }\n /**\n * Warm up body's based on previous frame contact points\n * @param contacts\n */\n warmStart(contacts) {\n var _a;\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n const bodyA = contact.bodyA;\n const bodyB = contact.bodyB;\n if (bodyA && bodyB) {\n const contactPoints = (_a = this.idToContactConstraint.get(contact.id)) !== null && _a !== void 0 ? _a : [];\n for (const point of contactPoints) {\n if (this.config.warmStart) {\n const normalImpulse = contact.normal.scale(point.normalImpulse);\n const tangentImpulse = contact.tangent.scale(point.tangentImpulse);\n const impulse = normalImpulse.add(tangentImpulse);\n bodyA.applyImpulse(point.point, impulse.negate());\n bodyB.applyImpulse(point.point, impulse);\n }\n else {\n point.normalImpulse = 0;\n point.tangentImpulse = 0;\n }\n }\n }\n }\n }\n /**\n * Iteratively solve the position overlap constraint\n * @param contacts\n */\n solvePosition(contacts) {\n var _a;\n for (let i = 0; i < this.config.positionIterations; i++) {\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n const bodyA = contact.bodyA;\n const bodyB = contact.bodyB;\n if (bodyA && bodyB) {\n // Skip solving active+passive\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_3__.CollisionType.Passive || bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_3__.CollisionType.Passive) {\n continue;\n }\n const constraints = (_a = this.idToContactConstraint.get(contact.id)) !== null && _a !== void 0 ? _a : [];\n for (const point of constraints) {\n const normal = contact.normal;\n const separation = _Colliders_CollisionJumpTable__WEBPACK_IMPORTED_MODULE_4__.CollisionJumpTable.FindContactSeparation(contact, point.local);\n const steeringConstant = this.config.steeringFactor; //0.2;\n const maxCorrection = -5;\n const slop = this.config.slop; //1;\n // Clamp to avoid over-correction\n // Remember that we are shooting for 0 overlap in the end\n const steeringForce = (0,_Math_util__WEBPACK_IMPORTED_MODULE_5__.clamp)(steeringConstant * (separation + slop), maxCorrection, 0);\n const impulse = normal.scale(-steeringForce * point.normalMass);\n // This is a pseudo impulse, meaning we aren't doing a real impulse calculation\n // We adjust position and rotation instead of doing the velocity\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_3__.CollisionType.Active) {\n // TODO make applyPseudoImpulse function?\n const impulseForce = impulse.negate().scale(bodyA.inverseMass);\n if (bodyA.limitDegreeOfFreedom.includes(_BodyComponent__WEBPACK_IMPORTED_MODULE_6__.DegreeOfFreedom.X)) {\n impulseForce.x = 0;\n }\n if (bodyA.limitDegreeOfFreedom.includes(_BodyComponent__WEBPACK_IMPORTED_MODULE_6__.DegreeOfFreedom.Y)) {\n impulseForce.y = 0;\n }\n bodyA.globalPos = bodyA.globalPos.add(impulseForce);\n if (!bodyA.limitDegreeOfFreedom.includes(_BodyComponent__WEBPACK_IMPORTED_MODULE_6__.DegreeOfFreedom.Rotation)) {\n bodyA.rotation -= point.aToContact.cross(impulse) * bodyA.inverseInertia;\n }\n }\n if (bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_3__.CollisionType.Active) {\n const impulseForce = impulse.scale(bodyB.inverseMass);\n if (bodyB.limitDegreeOfFreedom.includes(_BodyComponent__WEBPACK_IMPORTED_MODULE_6__.DegreeOfFreedom.X)) {\n impulseForce.x = 0;\n }\n if (bodyB.limitDegreeOfFreedom.includes(_BodyComponent__WEBPACK_IMPORTED_MODULE_6__.DegreeOfFreedom.Y)) {\n impulseForce.y = 0;\n }\n bodyB.globalPos = bodyB.globalPos.add(impulseForce);\n if (!bodyB.limitDegreeOfFreedom.includes(_BodyComponent__WEBPACK_IMPORTED_MODULE_6__.DegreeOfFreedom.Rotation)) {\n bodyB.rotation += point.bToContact.cross(impulse) * bodyB.inverseInertia;\n }\n }\n }\n }\n }\n }\n }\n solveVelocity(contacts) {\n var _a;\n for (let i = 0; i < this.config.velocityIterations; i++) {\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n const bodyA = contact.bodyA;\n const bodyB = contact.bodyB;\n if (bodyA && bodyB) {\n // Skip solving active+passive\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_3__.CollisionType.Passive || bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_3__.CollisionType.Passive) {\n continue;\n }\n const friction = Math.min(bodyA.friction, bodyB.friction);\n const constraints = (_a = this.idToContactConstraint.get(contact.id)) !== null && _a !== void 0 ? _a : [];\n // Friction constraint\n for (const point of constraints) {\n const relativeVelocity = point.getRelativeVelocity();\n // Negate velocity in tangent direction to simulate friction\n const tangentVelocity = -relativeVelocity.dot(contact.tangent);\n let impulseDelta = tangentVelocity * point.tangentMass;\n // Clamping based in Erin Catto's GDC 2006 talk\n // Correct clamping https://github.com/erincatto/box2d-lite/blob/master/docs/GDC2006_Catto_Erin_PhysicsTutorial.pdf\n // Accumulated fiction impulse is always between -uMaxFriction < dT < uMaxFriction\n // But deltas can vary\n const maxFriction = friction * point.normalImpulse;\n const newImpulse = (0,_Math_util__WEBPACK_IMPORTED_MODULE_5__.clamp)(point.tangentImpulse + impulseDelta, -maxFriction, maxFriction);\n impulseDelta = newImpulse - point.tangentImpulse;\n point.tangentImpulse = newImpulse;\n const impulse = contact.tangent.scale(impulseDelta);\n bodyA.applyImpulse(point.point, impulse.negate());\n bodyB.applyImpulse(point.point, impulse);\n }\n // Bounce constraint\n for (const point of constraints) {\n // Need to recalc relative velocity because the previous step could have changed vel\n const relativeVelocity = point.getRelativeVelocity();\n // Compute impulse in normal direction\n const normalVelocity = relativeVelocity.dot(contact.normal);\n // Per Erin it is a mistake to apply the restitution inside the iteration\n // From Erin Catto's Box2D we keep original contact velocity and adjust by small impulses\n let impulseDelta = -point.normalMass * (normalVelocity - point.originalVelocityAndRestitution);\n // Clamping based in Erin Catto's GDC 2014 talk\n // Accumulated impulse stored in the contact is always positive (dV > 0)\n // But deltas can be negative\n const newImpulse = Math.max(point.normalImpulse + impulseDelta, 0);\n impulseDelta = newImpulse - point.normalImpulse;\n point.normalImpulse = newImpulse;\n const impulse = contact.normal.scale(impulseDelta);\n bodyA.applyImpulse(point.point, impulse.negate());\n bodyB.applyImpulse(point.point, impulse);\n }\n }\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Color.ts\":\n/*!******************!*\\\n !*** ./Color.ts ***!\n \\******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Color: () => (/* binding */ Color)\n/* harmony export */ });\n/**\n * Provides standard colors (e.g. {@apilink Color.Black})\n * but you can also create custom colors using RGB, HSL, or Hex. Also provides\n * useful color operations like {@apilink Color.lighten}, {@apilink Color.darken}, and more.\n */\nclass Color {\n /**\n * Creates a new instance of Color from an r, g, b, a\n * @param r The red component of color (0-255)\n * @param g The green component of color (0-255)\n * @param b The blue component of color (0-255)\n * @param a The alpha component of color (0-1.0)\n */\n constructor(r, g, b, a) {\n this.r = r;\n this.g = g;\n this.b = b;\n this.a = a != null ? a : 1;\n }\n /**\n * Creates a new instance of Color from an r, g, b, a\n * @param r The red component of color (0-255)\n * @param g The green component of color (0-255)\n * @param b The blue component of color (0-255)\n * @param a The alpha component of color (0-1.0)\n */\n static fromRGB(r, g, b, a) {\n return new Color(r, g, b, a);\n }\n /**\n * Creates a new instance of Color from a rgb string\n * @param string CSS color string of the form rgba(255, 255, 255, 1) or rgb(255, 255, 255)\n */\n static fromRGBString(string) {\n const rgbaRegEx = /^rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*(\\d+(?:\\.\\d+)?))?\\)/i;\n let match = null;\n if ((match = string.match(rgbaRegEx))) {\n const r = parseInt(match[1], 10);\n const g = parseInt(match[2], 10);\n const b = parseInt(match[3], 10);\n let a = 1;\n if (match[4]) {\n a = parseFloat(match[4]);\n }\n return new Color(r, g, b, a);\n }\n else {\n throw new Error('Invalid rgb/a string: ' + string);\n }\n }\n /**\n * Creates a new instance of Color from a hex string\n * @param hex CSS color string of the form #ffffff, the alpha component is optional\n */\n static fromHex(hex) {\n const hexRegEx = /^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})?$/i;\n let match = null;\n if ((match = hex.match(hexRegEx))) {\n const r = parseInt(match[1], 16);\n const g = parseInt(match[2], 16);\n const b = parseInt(match[3], 16);\n let a = 1;\n if (match[4]) {\n a = parseInt(match[4], 16) / 255;\n }\n return new Color(r, g, b, a);\n }\n else {\n throw new Error('Invalid hex string: ' + hex);\n }\n }\n /**\n * Creates a new instance of Color from hsla values\n * @param h Hue is represented [0-1]\n * @param s Saturation is represented [0-1]\n * @param l Luminance is represented [0-1]\n * @param a Alpha is represented [0-1]\n */\n static fromHSL(h, s, l, a = 1.0) {\n const temp = new HSLColor(h, s, l, a);\n return temp.toRGBA();\n }\n /**\n * Lightens the current color by a specified amount\n * @param factor The amount to lighten by [0-1]\n */\n lighten(factor = 0.1) {\n const temp = HSLColor.fromRGBA(this.r, this.g, this.b, this.a);\n temp.l += (1 - temp.l) * factor;\n return temp.toRGBA();\n }\n /**\n * Darkens the current color by a specified amount\n * @param factor The amount to darken by [0-1]\n */\n darken(factor = 0.1) {\n const temp = HSLColor.fromRGBA(this.r, this.g, this.b, this.a);\n temp.l -= temp.l * factor;\n return temp.toRGBA();\n }\n /**\n * Saturates the current color by a specified amount\n * @param factor The amount to saturate by [0-1]\n */\n saturate(factor = 0.1) {\n const temp = HSLColor.fromRGBA(this.r, this.g, this.b, this.a);\n temp.s += temp.s * factor;\n return temp.toRGBA();\n }\n /**\n * Desaturates the current color by a specified amount\n * @param factor The amount to desaturate by [0-1]\n */\n desaturate(factor = 0.1) {\n const temp = HSLColor.fromRGBA(this.r, this.g, this.b, this.a);\n temp.s -= temp.s * factor;\n return temp.toRGBA();\n }\n /**\n * Multiplies a color by another, results in a darker color\n * @param color The other color\n */\n multiply(color) {\n const newR = (((color.r / 255) * this.r) / 255) * 255;\n const newG = (((color.g / 255) * this.g) / 255) * 255;\n const newB = (((color.b / 255) * this.b) / 255) * 255;\n const newA = color.a * this.a;\n return new Color(newR, newG, newB, newA);\n }\n /**\n * Screens a color by another, results in a lighter color\n * @param color The other color\n */\n screen(color) {\n const color1 = color.invert();\n const color2 = color.invert();\n return color1.multiply(color2).invert();\n }\n /**\n * Inverts the current color\n */\n invert() {\n return new Color(255 - this.r, 255 - this.g, 255 - this.b, 1.0 - this.a);\n }\n /**\n * Averages the current color with another\n * @param color The other color\n */\n average(color) {\n const newR = (color.r + this.r) / 2;\n const newG = (color.g + this.g) / 2;\n const newB = (color.b + this.b) / 2;\n const newA = (color.a + this.a) / 2;\n return new Color(newR, newG, newB, newA);\n }\n equal(color) {\n return this.toString() === color.toString();\n }\n /**\n * Returns a CSS string representation of a color.\n * @param format Color representation, accepts: rgb, hsl, or hex\n */\n toString(format = 'rgb') {\n switch (format) {\n case 'rgb':\n return this.toRGBA();\n case 'hsl':\n return this.toHSLA();\n case 'hex':\n return this.toHex();\n default:\n throw new Error('Invalid Color format');\n }\n }\n /**\n * Returns Hex Value of a color component\n * @param c color component\n * @see https://stackoverflow.com/questions/5623838/rgb-to-hex-and-hex-to-rgb\n */\n _componentToHex(c) {\n // Handle negative and fractional numbers\n const hex = Math.max(Math.round(c), 0).toString(16);\n return hex.length === 1 ? '0' + hex : hex;\n }\n /**\n * Return Hex representation of a color.\n */\n toHex() {\n let hexRepresentation = '#' + this._componentToHex(this.r) + this._componentToHex(this.g) + this._componentToHex(this.b);\n if (this.a !== 1) {\n hexRepresentation += this._componentToHex(this.a * 255);\n }\n return hexRepresentation;\n }\n /**\n * Return RGBA representation of a color.\n */\n toRGBA() {\n const result = String(this.r.toFixed(0)) + ', ' + String(this.g.toFixed(0)) + ', ' + String(this.b.toFixed(0));\n if (this.a !== undefined || this.a !== null) {\n return 'rgba(' + result + ', ' + String(this.a) + ')';\n }\n return 'rgb(' + result + ')';\n }\n /**\n * Return HSLA representation of a color.\n */\n toHSLA() {\n return HSLColor.fromRGBA(this.r, this.g, this.b, this.a).toString();\n }\n /**\n * Returns a CSS string representation of a color.\n */\n fillStyle() {\n return this.toString();\n }\n /**\n * Returns a clone of the current color.\n */\n clone(dest) {\n const result = dest || new Color(this.r, this.g, this.b, this.a);\n result.r = this.r;\n result.g = this.g;\n result.b = this.b;\n result.a = this.a;\n return result;\n }\n /**\n * Black (#000000)\n */\n static get Black() {\n return Color.fromHex('#000000');\n }\n /**\n * White (#FFFFFF)\n */\n static get White() {\n return Color.fromHex('#FFFFFF');\n }\n /**\n * Gray (#808080)\n */\n static get Gray() {\n return Color.fromHex('#808080');\n }\n /**\n * Light gray (#D3D3D3)\n */\n static get LightGray() {\n return Color.fromHex('#D3D3D3');\n }\n /**\n * Dark gray (#A9A9A9)\n */\n static get DarkGray() {\n return Color.fromHex('#A9A9A9');\n }\n /**\n * Yellow (#FFFF00)\n */\n static get Yellow() {\n return Color.fromHex('#FFFF00');\n }\n /**\n * Orange (#FFA500)\n */\n static get Orange() {\n return Color.fromHex('#FFA500');\n }\n /**\n * Red (#FF0000)\n */\n static get Red() {\n return Color.fromHex('#FF0000');\n }\n /**\n * Vermilion (#FF5B31)\n */\n static get Vermilion() {\n return Color.fromHex('#FF5B31');\n }\n /**\n * Rose (#FF007F)\n */\n static get Rose() {\n return Color.fromHex('#FF007F');\n }\n /**\n * Pink (#FFC0CB)\n */\n static get Pink() {\n return Color.fromHex('#FFC0CB');\n }\n /**\n * Magenta (#FF00FF)\n */\n static get Magenta() {\n return Color.fromHex('#FF00FF');\n }\n /**\n * Violet (#7F00FF)\n */\n static get Violet() {\n return Color.fromHex('#7F00FF');\n }\n /**\n * Purple (#800080)\n */\n static get Purple() {\n return Color.fromHex('#800080');\n }\n /**\n * Blue (#0000FF)\n */\n static get Blue() {\n return Color.fromHex('#0000FF');\n }\n /**\n * Azure (#007FFF)\n */\n static get Azure() {\n return Color.fromHex('#007FFF');\n }\n /**\n * Cyan (#00FFFF)\n */\n static get Cyan() {\n return Color.fromHex('#00FFFF');\n }\n /**\n * Viridian (#59978F)\n */\n static get Viridian() {\n return Color.fromHex('#59978F');\n }\n /**\n * Teal (#008080)\n */\n static get Teal() {\n return Color.fromHex('#008080');\n }\n /**\n * Green (#00FF00)\n */\n static get Green() {\n return Color.fromHex('#00FF00');\n }\n /**\n * Chartreuse (#7FFF00)\n */\n static get Chartreuse() {\n return Color.fromHex('#7FFF00');\n }\n /**\n * Transparent (#FFFFFF00)\n */\n static get Transparent() {\n return Color.fromHex('#FFFFFF00');\n }\n /**\n * ExcaliburBlue (#176BAA)\n */\n static get ExcaliburBlue() {\n return Color.fromHex('#176BAA');\n }\n /**\n * Brown (#964B00)\n */\n static get Brown() {\n return Color.fromHex('#964B00');\n }\n}\n/**\n * Internal HSL Color representation\n *\n * http://en.wikipedia.org/wiki/HSL_and_HSV\n * http://axonflux.com/handy-rgb-to-hsl-and-rgb-to-hsv-color-model-c\n */\nclass HSLColor {\n constructor(h, s, l, a) {\n this.h = h;\n this.s = s;\n this.l = l;\n this.a = a;\n }\n static hue2rgb(p, q, t) {\n if (t < 0) {\n t += 1;\n }\n if (t > 1) {\n t -= 1;\n }\n if (t < 1 / 6) {\n return p + (q - p) * 6 * t;\n }\n if (t < 1 / 2) {\n return q;\n }\n if (t < 2 / 3) {\n return p + (q - p) * (2 / 3 - t) * 6;\n }\n return p;\n }\n static fromRGBA(r, g, b, a) {\n r /= 255;\n g /= 255;\n b /= 255;\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h, s;\n const l = (max + min) / 2;\n if (max === min) {\n h = s = 0; // achromatic\n }\n else {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n h /= 6;\n }\n return new HSLColor(h, s, l, a);\n }\n toRGBA() {\n let r, g, b;\n if (this.s === 0) {\n r = g = b = this.l; // achromatic\n }\n else {\n const q = this.l < 0.5 ? this.l * (1 + this.s) : this.l + this.s - this.l * this.s;\n const p = 2 * this.l - q;\n r = HSLColor.hue2rgb(p, q, this.h + 1 / 3);\n g = HSLColor.hue2rgb(p, q, this.h);\n b = HSLColor.hue2rgb(p, q, this.h - 1 / 3);\n }\n return new Color(r * 255, g * 255, b * 255, this.a);\n }\n toString() {\n const h = this.h.toFixed(0), s = this.s.toFixed(0), l = this.l.toFixed(0), a = this.a.toFixed(0);\n return `hsla(${h}, ${s}, ${l}, ${a})`;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Context.ts\":\n/*!********************!*\\\n !*** ./Context.ts ***!\n \\********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ createContext: () => (/* binding */ createContext),\n/* harmony export */ useContext: () => (/* binding */ useContext)\n/* harmony export */ });\n/**\n * Creates a injectable context that can be retrieved later with `useContext(context)`\n *\n * Example\n * ```typescript\n *\n * const AppContext = createContext({some: 'value'});\n * context.scope(val, () => {\n * const value = useContext(AppContext);\n * })\n *\n * ```\n */\nfunction createContext() {\n const ctx = {\n scope: (value, cb) => {\n const old = ctx.value;\n ctx.value = value;\n try {\n return cb();\n }\n catch (e) {\n throw e;\n }\n finally {\n ctx.value = old;\n }\n },\n value: undefined\n };\n return ctx;\n}\n/**\n * Retrieves the value from the current context\n */\nfunction useContext(context) {\n return context.value;\n}\n\n\n/***/ }),\n\n/***/ \"./Debug/DebugConfig.ts\":\n/*!******************************!*\\\n !*** ./Debug/DebugConfig.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DebugConfig: () => (/* binding */ DebugConfig),\n/* harmony export */ FrameStats: () => (/* binding */ FrameStats),\n/* harmony export */ PhysicsStats: () => (/* binding */ PhysicsStats)\n/* harmony export */ });\n/* harmony import */ var _DebugFlags__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./DebugFlags */ \"./Debug/DebugFlags.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n\n\n/**\n * Debug statistics and flags for Excalibur. If polling these values, it would be\n * best to do so on the `postupdate` event for {@apilink Engine}, after all values have been\n * updated during a frame.\n */\nclass DebugConfig {\n constructor(engine) {\n /**\n * Performance statistics\n */\n this.stats = {\n /**\n * Current frame statistics. Engine reuses this instance, use {@apilink FrameStats.clone} to copy frame stats.\n * Best accessed on {@apilink postframe} event. See {@apilink FrameStats}\n */\n currFrame: new FrameStats(),\n /**\n * Previous frame statistics. Engine reuses this instance, use {@apilink FrameStats.clone} to copy frame stats.\n * Best accessed on {@apilink preframe} event. Best inspected on engine event `preframe`. See {@apilink FrameStats}\n */\n prevFrame: new FrameStats()\n };\n /**\n * Filter debug context to named entities or entity ids\n */\n this.filter = {\n /**\n * Toggle filter on or off (default off) must be on for DebugDraw to use filters\n */\n useFilter: false,\n /**\n * Query for entities by name, if the entity name contains `nameQuery` it will be included\n */\n nameQuery: '',\n /**\n * Query for Entity ids, if the id matches it will be included\n */\n ids: []\n };\n /**\n * Entity debug settings\n */\n this.entity = {\n showAll: false,\n showId: false,\n showName: false\n };\n /**\n * Transform component debug settings\n */\n this.transform = {\n showAll: false,\n debugZIndex: 10000000,\n showPosition: false,\n showPositionLabel: false,\n positionColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Yellow,\n showZIndex: false,\n showScale: false,\n scaleColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Green,\n showRotation: false,\n rotationColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Blue\n };\n /**\n * Graphics component debug settings\n */\n this.graphics = {\n showAll: false,\n showBounds: false,\n boundsColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Yellow\n };\n /**\n * Collider component debug settings\n */\n this.collider = {\n showAll: false,\n showBounds: false,\n boundsColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Blue,\n showOwner: false,\n showGeometry: true,\n geometryColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Green,\n geometryLineWidth: 1,\n geometryPointSize: 0.5\n };\n /**\n * Physics simulation debug settings\n */\n this.physics = {\n showAll: false,\n showBroadphaseSpacePartitionDebug: false,\n showCollisionNormals: false,\n collisionNormalColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Cyan,\n showCollisionContacts: true,\n contactSize: 2,\n collisionContactColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Red\n };\n /**\n * Motion component debug settings\n */\n this.motion = {\n showAll: false,\n showVelocity: false,\n velocityColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Yellow,\n showAcceleration: false,\n accelerationColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Red\n };\n /**\n * Body component debug settings\n */\n this.body = {\n showAll: false,\n showCollisionGroup: false,\n showCollisionType: false,\n showSleeping: false,\n showMotion: false,\n showMass: false\n };\n /**\n * Camera debug settings\n */\n this.camera = {\n showAll: false,\n showFocus: false,\n focusColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Red,\n showZoom: false\n };\n this.tilemap = {\n showAll: false,\n showGrid: false,\n gridColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Red,\n gridWidth: 0.5,\n showSolidBounds: false,\n solidBoundsColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.fromHex('#8080807F'), // grayish\n showColliderGeometry: true\n };\n this.isometric = {\n showAll: false,\n showPosition: false,\n positionColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Yellow,\n positionSize: 1,\n showGrid: false,\n gridColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Red,\n gridWidth: 1,\n showColliderGeometry: true\n };\n this._engine = engine;\n this.colorBlindMode = new _DebugFlags__WEBPACK_IMPORTED_MODULE_1__.ColorBlindFlags(this._engine);\n }\n /**\n * Switch the current excalibur clock with the {@apilink TestClock} and return\n * it in the same running state.\n *\n * This is useful when you need to debug frame by frame.\n */\n useTestClock() {\n const clock = this._engine.clock;\n const wasRunning = clock.isRunning();\n clock.stop();\n const testClock = clock.toTestClock();\n if (wasRunning) {\n testClock.start();\n }\n this._engine.clock = testClock;\n return testClock;\n }\n /**\n * Switch the current excalibur clock with the {@apilink StandardClock} and\n * return it in the same running state.\n *\n * This is useful when you need to switch back to normal mode after\n * debugging.\n */\n useStandardClock() {\n const currentClock = this._engine.clock;\n const wasRunning = currentClock.isRunning();\n currentClock.stop();\n const standardClock = currentClock.toStandardClock();\n if (wasRunning) {\n standardClock.start();\n }\n this._engine.clock = standardClock;\n return standardClock;\n }\n}\n/**\n * Implementation of a frame's stats. Meant to have values copied via {@apilink FrameStats.reset}, avoid\n * creating instances of this every frame.\n */\nclass FrameStats {\n constructor() {\n this._id = 0;\n this._elapsedMs = 0;\n this._fps = 0;\n this._actorStats = {\n alive: 0,\n killed: 0,\n ui: 0,\n get remaining() {\n return this.alive - this.killed;\n },\n get total() {\n return this.remaining + this.ui;\n }\n };\n this._durationStats = {\n update: 0,\n draw: 0,\n get total() {\n return this.update + this.draw;\n }\n };\n this._physicsStats = new PhysicsStats();\n this._graphicsStats = {\n drawCalls: 0,\n drawnImages: 0\n };\n }\n /**\n * Zero out values or clone other IFrameStat stats. Allows instance reuse.\n * @param [otherStats] Optional stats to clone\n */\n reset(otherStats) {\n if (otherStats) {\n this.id = otherStats.id;\n this.elapsedMs = otherStats.elapsedMs;\n this.fps = otherStats.fps;\n this.actors.alive = otherStats.actors.alive;\n this.actors.killed = otherStats.actors.killed;\n this.actors.ui = otherStats.actors.ui;\n this.duration.update = otherStats.duration.update;\n this.duration.draw = otherStats.duration.draw;\n this._physicsStats.reset(otherStats.physics);\n this.graphics.drawCalls = otherStats.graphics.drawCalls;\n this.graphics.drawnImages = otherStats.graphics.drawnImages;\n }\n else {\n this.id = this.elapsedMs = this.fps = 0;\n this.actors.alive = this.actors.killed = this.actors.ui = 0;\n this.duration.update = this.duration.draw = 0;\n this._physicsStats.reset();\n this.graphics.drawnImages = this.graphics.drawCalls = 0;\n }\n }\n /**\n * Provides a clone of this instance.\n */\n clone() {\n const fs = new FrameStats();\n fs.reset(this);\n return fs;\n }\n /**\n * Gets the frame's id\n */\n get id() {\n return this._id;\n }\n /**\n * Sets the frame's id\n */\n set id(value) {\n this._id = value;\n }\n /**\n * Gets the frame's delta (time since last frame)\n */\n get elapsedMs() {\n return this._elapsedMs;\n }\n /**\n * Sets the frame's delta (time since last frame). Internal use only.\n * @internal\n */\n set elapsedMs(value) {\n this._elapsedMs = value;\n }\n /**\n * Gets the frame's frames-per-second (FPS)\n */\n get fps() {\n return this._fps;\n }\n /**\n * Sets the frame's frames-per-second (FPS). Internal use only.\n * @internal\n */\n set fps(value) {\n this._fps = value;\n }\n /**\n * Gets the frame's actor statistics\n */\n get actors() {\n return this._actorStats;\n }\n /**\n * Gets the frame's duration statistics\n */\n get duration() {\n return this._durationStats;\n }\n /**\n * Gets the frame's physics statistics\n */\n get physics() {\n return this._physicsStats;\n }\n /**\n * Gets the frame's graphics statistics\n */\n get graphics() {\n return this._graphicsStats;\n }\n}\nclass PhysicsStats {\n constructor() {\n this._pairs = 0;\n this._collisions = 0;\n this._contacts = new Map();\n this._fastBodies = 0;\n this._fastBodyCollisions = 0;\n this._broadphase = 0;\n this._narrowphase = 0;\n }\n /**\n * Zero out values or clone other IPhysicsStats stats. Allows instance reuse.\n * @param [otherStats] Optional stats to clone\n */\n reset(otherStats) {\n if (otherStats) {\n this.pairs = otherStats.pairs;\n this.collisions = otherStats.collisions;\n this.contacts = otherStats.contacts;\n this.fastBodies = otherStats.fastBodies;\n this.fastBodyCollisions = otherStats.fastBodyCollisions;\n this.broadphase = otherStats.broadphase;\n this.narrowphase = otherStats.narrowphase;\n }\n else {\n this.pairs = this.collisions = this.fastBodies = 0;\n this.fastBodyCollisions = this.broadphase = this.narrowphase = 0;\n this.contacts.clear();\n }\n }\n /**\n * Provides a clone of this instance.\n */\n clone() {\n const ps = new PhysicsStats();\n ps.reset(this);\n return ps;\n }\n get pairs() {\n return this._pairs;\n }\n set pairs(value) {\n this._pairs = value;\n }\n get collisions() {\n return this._collisions;\n }\n set collisions(value) {\n this._collisions = value;\n }\n get contacts() {\n return this._contacts;\n }\n set contacts(contacts) {\n this._contacts = contacts;\n }\n get fastBodies() {\n return this._fastBodies;\n }\n set fastBodies(value) {\n this._fastBodies = value;\n }\n get fastBodyCollisions() {\n return this._fastBodyCollisions;\n }\n set fastBodyCollisions(value) {\n this._fastBodyCollisions = value;\n }\n get broadphase() {\n return this._broadphase;\n }\n set broadphase(value) {\n this._broadphase = value;\n }\n get narrowphase() {\n return this._narrowphase;\n }\n set narrowphase(value) {\n this._narrowphase = value;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Debug/DebugFlags.ts\":\n/*!*****************************!*\\\n !*** ./Debug/DebugFlags.ts ***!\n \\*****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ColorBlindFlags: () => (/* binding */ ColorBlindFlags)\n/* harmony export */ });\n/* harmony import */ var _Graphics_PostProcessor_ColorBlindnessMode__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Graphics/PostProcessor/ColorBlindnessMode */ \"./Graphics/PostProcessor/ColorBlindnessMode.ts\");\n/* harmony import */ var _Graphics_PostProcessor_ColorBlindnessPostProcessor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Graphics/PostProcessor/ColorBlindnessPostProcessor */ \"./Graphics/PostProcessor/ColorBlindnessPostProcessor.ts\");\n/* harmony import */ var _Graphics_Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Graphics/Context/ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n\n\n\nclass ColorBlindFlags {\n constructor(engine) {\n this._engine = engine;\n this._colorBlindPostProcessor = new _Graphics_PostProcessor_ColorBlindnessPostProcessor__WEBPACK_IMPORTED_MODULE_0__.ColorBlindnessPostProcessor(_Graphics_PostProcessor_ColorBlindnessMode__WEBPACK_IMPORTED_MODULE_1__.ColorBlindnessMode.Protanope);\n }\n /**\n * Correct colors for a specified color blindness\n * @param colorBlindness\n */\n correct(colorBlindness) {\n if (this._engine.graphicsContext instanceof _Graphics_Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_2__.ExcaliburGraphicsContextWebGL) {\n this.clear();\n this._colorBlindPostProcessor.colorBlindnessMode = colorBlindness;\n this._colorBlindPostProcessor.simulate = false;\n this._engine.graphicsContext.addPostProcessor(this._colorBlindPostProcessor);\n }\n }\n /**\n * Simulate colors for a specified color blindness\n * @param colorBlindness\n */\n simulate(colorBlindness) {\n if (this._engine.graphicsContext instanceof _Graphics_Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_2__.ExcaliburGraphicsContextWebGL) {\n this.clear();\n this._colorBlindPostProcessor.colorBlindnessMode = colorBlindness;\n this._colorBlindPostProcessor.simulate = true;\n this._engine.graphicsContext.addPostProcessor(this._colorBlindPostProcessor);\n }\n }\n /**\n * Remove color blindness post processor\n */\n clear() {\n this._engine.graphicsContext.removePostProcessor(this._colorBlindPostProcessor);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Debug/DebugSystem.ts\":\n/*!******************************!*\\\n !*** ./Debug/DebugSystem.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DebugSystem: () => (/* binding */ DebugSystem)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../Collision/ColliderComponent */ \"./Collision/ColliderComponent.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Priority.ts\");\n/* harmony import */ var _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../Collision/BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Collision_CollisionSystem__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Collision/CollisionSystem */ \"./Collision/CollisionSystem.ts\");\n/* harmony import */ var _Collision_Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../Collision/Colliders/CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Graphics/GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Particles_Particles__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Particles/Particles */ \"./Particles/Particles.ts\");\n/* harmony import */ var _Graphics_DebugGraphicsComponent__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Graphics/DebugGraphicsComponent */ \"./Graphics/DebugGraphicsComponent.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Math/coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _Graphics_Debug__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../Graphics/Debug */ \"./Graphics/Debug.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass DebugSystem extends _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.System {\n constructor(world) {\n super();\n this.world = world;\n this.systemType = _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.SystemType.Draw;\n this.query = this.world.query([_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_1__.TransformComponent]);\n }\n initialize(world, scene) {\n this._graphicsContext = scene.engine.graphicsContext;\n this._camera = scene.camera;\n this._engine = scene.engine;\n this._collisionSystem = world.systemManager.get(_Collision_CollisionSystem__WEBPACK_IMPORTED_MODULE_2__.CollisionSystem);\n }\n update() {\n var _a;\n if (!this._engine.isDebug) {\n return;\n }\n const filterSettings = this._engine.debug.filter;\n let id;\n let name;\n const entitySettings = this._engine.debug.entity;\n let tx;\n const txSettings = this._engine.debug.transform;\n let motion;\n const motionSettings = this._engine.debug.motion;\n let colliderComp;\n const colliderSettings = this._engine.debug.collider;\n const physicsSettings = this._engine.debug.physics;\n let graphics;\n const graphicsSettings = this._engine.debug.graphics;\n let debugDraw;\n let body;\n const bodySettings = this._engine.debug.body;\n const cameraSettings = this._engine.debug.camera;\n for (let i = 0; i < this.query.entities.length; i++) {\n const entity = this.query.entities[i];\n if (entity.hasTag('offscreen')) {\n // skip offscreen entities\n continue;\n }\n if (entity instanceof _Particles_Particles__WEBPACK_IMPORTED_MODULE_3__.Particle) {\n // Particles crush the renderer :(\n continue;\n }\n if (filterSettings.useFilter) {\n const allIds = filterSettings.ids.length === 0;\n const idMatch = allIds || filterSettings.ids.includes(entity.id);\n if (!idMatch) {\n continue;\n }\n const allNames = filterSettings.nameQuery === '';\n const nameMatch = allNames || entity.name.includes(filterSettings.nameQuery);\n if (!nameMatch) {\n continue;\n }\n }\n let cursor = _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero;\n const lineHeight = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(0, 16);\n id = entity.id;\n name = entity.name;\n tx = entity.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n // This optionally sets our camera based on the entity coord plan (world vs. screen)\n this._pushCameraTransform(tx);\n this._graphicsContext.save();\n if (tx.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_5__.CoordPlane.Screen) {\n this._graphicsContext.translate(this._engine.screen.contentArea.left, this._engine.screen.contentArea.top);\n }\n this._graphicsContext.z = txSettings.debugZIndex;\n this._applyTransform(entity);\n if (tx) {\n if (txSettings.showAll || txSettings.showPosition) {\n this._graphicsContext.debug.drawPoint(_Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero, { size: 4, color: txSettings.positionColor });\n }\n if (txSettings.showAll || txSettings.showPositionLabel) {\n this._graphicsContext.debug.drawText(`pos${tx.pos.toString(2)}`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (txSettings.showAll || txSettings.showZIndex) {\n this._graphicsContext.debug.drawText(`z(${tx.z.toFixed(1)})`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (entitySettings.showAll || entitySettings.showId) {\n this._graphicsContext.debug.drawText(`id(${id}) ${entity.parent ? 'child of id(' + ((_a = entity.parent) === null || _a === void 0 ? void 0 : _a.id) + ')' : ''}`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (entitySettings.showAll || entitySettings.showName) {\n this._graphicsContext.debug.drawText(`name(${name})`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (txSettings.showAll || txSettings.showRotation) {\n this._graphicsContext.drawLine(_Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero, _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.fromAngle(tx.rotation).scale(50).add(_Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero), txSettings.rotationColor, 2);\n this._graphicsContext.debug.drawText(`rot deg(${(0,_Math_util__WEBPACK_IMPORTED_MODULE_6__.toDegrees)(tx.rotation).toFixed(2)})`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (txSettings.showAll || txSettings.showScale) {\n this._graphicsContext.drawLine(_Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero, tx.scale.add(_Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero), txSettings.scaleColor, 2);\n }\n }\n graphics = entity.get(_Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_7__.GraphicsComponent);\n if (graphics) {\n if (graphicsSettings.showAll || graphicsSettings.showBounds) {\n const bounds = graphics.localBounds;\n bounds.draw(this._graphicsContext, graphicsSettings.boundsColor);\n }\n }\n debugDraw = entity.get(_Graphics_DebugGraphicsComponent__WEBPACK_IMPORTED_MODULE_8__.DebugGraphicsComponent);\n if (debugDraw) {\n if (!debugDraw.useTransform) {\n this._graphicsContext.restore();\n }\n debugDraw.draw(this._graphicsContext, this._engine.debug);\n if (!debugDraw.useTransform) {\n this._graphicsContext.save();\n this._applyTransform(entity);\n }\n }\n body = entity.get(_Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_9__.BodyComponent);\n if (body) {\n if (bodySettings.showAll || bodySettings.showCollisionGroup) {\n this._graphicsContext.debug.drawText(`collision group(${body.group.name})`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (bodySettings.showAll || bodySettings.showCollisionType) {\n this._graphicsContext.debug.drawText(`collision type(${body.collisionType})`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (bodySettings.showAll || bodySettings.showMass) {\n this._graphicsContext.debug.drawText(`mass(${body.mass})`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (bodySettings.showAll || bodySettings.showMotion) {\n this._graphicsContext.debug.drawText(`motion(${body.sleepMotion})`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (bodySettings.showAll || bodySettings.showSleeping) {\n this._graphicsContext.debug.drawText(`sleeping(${body.canSleep ? body.isSleeping : 'cant sleep'})`, cursor);\n cursor = cursor.add(lineHeight);\n }\n }\n this._graphicsContext.restore();\n // World space\n this._graphicsContext.save();\n if (tx.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_5__.CoordPlane.Screen) {\n this._graphicsContext.translate(this._engine.screen.contentArea.left, this._engine.screen.contentArea.top);\n }\n this._graphicsContext.z = txSettings.debugZIndex;\n motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_10__.MotionComponent);\n if (motion) {\n if (motionSettings.showAll || motionSettings.showVelocity) {\n this._graphicsContext.debug.drawText(`vel${motion.vel.toString(2)}`, cursor.add(tx.globalPos));\n this._graphicsContext.drawLine(tx.globalPos, tx.globalPos.add(motion.vel), motionSettings.velocityColor, 2);\n cursor = cursor.add(lineHeight);\n }\n if (motionSettings.showAll || motionSettings.showAcceleration) {\n this._graphicsContext.drawLine(tx.globalPos, tx.globalPos.add(motion.acc), motionSettings.accelerationColor, 2);\n }\n }\n // Colliders live in world space already so after the restore()\n colliderComp = entity.get(_Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_11__.ColliderComponent);\n if (colliderComp) {\n const collider = colliderComp.get();\n if ((colliderSettings.showAll || colliderSettings.showGeometry) && collider) {\n collider.debug(this._graphicsContext, colliderSettings.geometryColor, {\n lineWidth: colliderSettings.geometryLineWidth,\n pointSize: colliderSettings.geometryPointSize\n });\n }\n if (colliderSettings.showAll || colliderSettings.showBounds) {\n if (collider instanceof _Collision_Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_12__.CompositeCollider) {\n const colliders = collider.getColliders();\n for (const collider of colliders) {\n const bounds = collider.bounds;\n const pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(bounds.left, bounds.top);\n this._graphicsContext.debug.drawRect(pos.x, pos.y, bounds.width, bounds.height, { color: colliderSettings.boundsColor });\n if (colliderSettings.showAll || colliderSettings.showOwner) {\n this._graphicsContext.debug.drawText(`owner id(${collider.owner.id})`, pos);\n }\n }\n colliderComp.bounds.draw(this._graphicsContext, colliderSettings.boundsColor);\n }\n else if (collider) {\n const bounds = colliderComp.bounds;\n const pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(bounds.left, bounds.top);\n this._graphicsContext.debug.drawRect(pos.x, pos.y, bounds.width, bounds.height, { color: colliderSettings.boundsColor });\n if (colliderSettings.showAll || colliderSettings.showOwner) {\n this._graphicsContext.debug.drawText(`owner id(${colliderComp.owner.id})`, pos);\n }\n }\n }\n }\n this._graphicsContext.restore();\n this._popCameraTransform(tx);\n }\n this._graphicsContext.save();\n this._camera.draw(this._graphicsContext);\n if (physicsSettings.showAll || physicsSettings.showBroadphaseSpacePartitionDebug) {\n this._collisionSystem.debug(this._graphicsContext);\n }\n if (physicsSettings.showAll || physicsSettings.showCollisionContacts || physicsSettings.showCollisionNormals) {\n for (const [_, contact] of this._engine.debug.stats.currFrame.physics.contacts) {\n if (physicsSettings.showAll || physicsSettings.showCollisionContacts) {\n for (const point of contact.points) {\n this._graphicsContext.debug.drawPoint(point, {\n size: physicsSettings.contactSize,\n color: physicsSettings.collisionContactColor\n });\n }\n }\n if (physicsSettings.showAll || physicsSettings.showCollisionNormals) {\n for (const point of contact.points) {\n this._graphicsContext.debug.drawLine(point, contact.normal.scale(30).add(point), {\n color: physicsSettings.collisionNormalColor\n });\n }\n }\n }\n }\n this._graphicsContext.restore();\n if (cameraSettings) {\n this._graphicsContext.save();\n this._camera.draw(this._graphicsContext);\n if (cameraSettings.showAll || cameraSettings.showFocus) {\n this._graphicsContext.drawCircle(this._camera.pos, 4, cameraSettings.focusColor);\n }\n if (cameraSettings.showAll || cameraSettings.showZoom) {\n this._graphicsContext.debug.drawText(`zoom(${this._camera.zoom})`, this._camera.pos);\n }\n this._graphicsContext.restore();\n }\n this._graphicsContext.flush();\n }\n postupdate(engine, elapsed) {\n if (this._engine.isDebug) {\n this._graphicsContext.save();\n if (this._camera) {\n this._camera.draw(this._graphicsContext);\n }\n _Graphics_Debug__WEBPACK_IMPORTED_MODULE_13__.Debug.flush(this._graphicsContext);\n this._graphicsContext.restore();\n }\n }\n /**\n * This applies the current entity transform to the graphics context\n * @param entity\n */\n _applyTransform(entity) {\n const ancestors = entity.getAncestors();\n for (const ancestor of ancestors) {\n const transform = ancestor === null || ancestor === void 0 ? void 0 : ancestor.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n if (transform) {\n this._graphicsContext.translate(transform.pos.x, transform.pos.y);\n this._graphicsContext.scale(transform.scale.x, transform.scale.y);\n this._graphicsContext.rotate(transform.rotation);\n }\n }\n }\n /**\n * Applies the current camera transform if in world coordinates\n * @param transform\n */\n _pushCameraTransform(transform) {\n // Establish camera offset per entity\n if (transform.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_5__.CoordPlane.World) {\n this._graphicsContext.save();\n if (this._camera) {\n this._camera.draw(this._graphicsContext);\n }\n }\n }\n /**\n * Resets the current camera transform if in world coordinates\n * @param transform\n */\n _popCameraTransform(transform) {\n if (transform.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_5__.CoordPlane.World) {\n // Apply camera world offset\n this._graphicsContext.restore();\n }\n }\n}\nDebugSystem.priority = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_14__.SystemPriority.Lowest;\n\n\n/***/ }),\n\n/***/ \"./Debug/index.ts\":\n/*!************************!*\\\n !*** ./Debug/index.ts ***!\n \\************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ColorBlindFlags: () => (/* reexport safe */ _DebugFlags__WEBPACK_IMPORTED_MODULE_1__.ColorBlindFlags),\n/* harmony export */ DebugConfig: () => (/* reexport safe */ _DebugConfig__WEBPACK_IMPORTED_MODULE_0__.DebugConfig),\n/* harmony export */ DebugSystem: () => (/* reexport safe */ _DebugSystem__WEBPACK_IMPORTED_MODULE_2__.DebugSystem),\n/* harmony export */ FrameStats: () => (/* reexport safe */ _DebugConfig__WEBPACK_IMPORTED_MODULE_0__.FrameStats),\n/* harmony export */ PhysicsStats: () => (/* reexport safe */ _DebugConfig__WEBPACK_IMPORTED_MODULE_0__.PhysicsStats)\n/* harmony export */ });\n/* harmony import */ var _DebugConfig__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./DebugConfig */ \"./Debug/DebugConfig.ts\");\n/* harmony import */ var _DebugFlags__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./DebugFlags */ \"./Debug/DebugFlags.ts\");\n/* harmony import */ var _DebugSystem__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./DebugSystem */ \"./Debug/DebugSystem.ts\");\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Director/CrossFade.ts\":\n/*!*******************************!*\\\n !*** ./Director/CrossFade.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CrossFade: () => (/* binding */ CrossFade)\n/* harmony export */ });\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Graphics */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Transition__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Transition */ \"./Director/Transition.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n\n\n\n/**\n * CrossFades between the previous scene and the destination scene\n *\n * Note: CrossFade only works as an \"in\" transition\n */\nclass CrossFade extends _Transition__WEBPACK_IMPORTED_MODULE_0__.Transition {\n constructor(options) {\n super({ direction: 'in', ...options }); // default the correct direction\n this.name = `CrossFade#${this.id}`;\n }\n async onPreviousSceneDeactivate(scene) {\n this.image = await scene.engine.screenshot(true);\n // Firefox is particularly slow\n // needed in case the image isn't ready yet\n await this.image.decode();\n }\n onInitialize(engine) {\n this.engine = engine;\n this.transform.pos = engine.screen.unsafeArea.topLeft;\n this.screenCover = _Graphics__WEBPACK_IMPORTED_MODULE_1__.ImageSource.fromHtmlImageElement(this.image).toSprite();\n this.graphics.add(this.screenCover);\n // This is because we preserve hidpi res on the screen shot which COULD be bigger than the logical resolution\n this.transform.scale = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(1 / engine.screen.pixelRatio, 1 / engine.screen.pixelRatio);\n this.graphics.opacity = this.progress;\n }\n onStart(_progress) {\n this.graphics.opacity = this.progress;\n }\n onReset() {\n this.graphics.opacity = this.progress;\n }\n onEnd(progress) {\n this.graphics.opacity = progress;\n }\n onUpdate(progress) {\n this.graphics.opacity = progress;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Director/DefaultLoader.ts\":\n/*!***********************************!*\\\n !*** ./Director/DefaultLoader.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DefaultLoader: () => (/* binding */ DefaultLoader),\n/* harmony export */ LoaderEvents: () => (/* binding */ LoaderEvents),\n/* harmony export */ isLoaderConstructor: () => (/* binding */ isLoaderConstructor)\n/* harmony export */ });\n/* harmony import */ var _Util_WebAudio__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Util/WebAudio */ \"./Util/WebAudio.ts\");\n/* harmony import */ var _Graphics_Canvas__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Graphics/Canvas */ \"./Graphics/Canvas.ts\");\n/* harmony import */ var _Graphics_Filtering__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Graphics/Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Resources_Sound_Sound__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Resources/Sound/Sound */ \"./Resources/Sound/Sound.ts\");\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Util/Future */ \"./Util/Future.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Util/Util */ \"./Util/Util.ts\");\n\n\n\n\n\n\n\n\n\nconst LoaderEvents = {\n // Add event types here\n BeforeLoad: 'beforeload',\n AfterLoad: 'afterload',\n UserAction: 'useraction',\n LoadResourceStart: 'loadresourcestart',\n LoadResourceEnd: 'loadresourceend'\n};\n/**\n * Returns true if the constructor is for an Excalibur Loader\n */\nfunction isLoaderConstructor(x) {\n var _a, _b;\n return !!(x === null || x === void 0 ? void 0 : x.prototype) && !!((_b = (_a = x === null || x === void 0 ? void 0 : x.prototype) === null || _a === void 0 ? void 0 : _a.constructor) === null || _b === void 0 ? void 0 : _b.name);\n}\nclass DefaultLoader {\n get resources() {\n return this._resources;\n }\n /**\n * @param options Optionally provide the list of resources you want to load at constructor time\n */\n constructor(options) {\n var _a;\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n this.canvas = new _Graphics_Canvas__WEBPACK_IMPORTED_MODULE_1__.Canvas({\n filtering: _Graphics_Filtering__WEBPACK_IMPORTED_MODULE_2__.ImageFiltering.Blended,\n smoothing: true,\n cache: false,\n draw: this.onDraw.bind(this)\n });\n this._resources = [];\n this._numLoaded = 0;\n this._totalTimeMs = 0;\n this._loadingFuture = new _Util_Future__WEBPACK_IMPORTED_MODULE_3__.Future();\n if (options && ((_a = options.loadables) === null || _a === void 0 ? void 0 : _a.length)) {\n this.addResources(options.loadables);\n }\n }\n /**\n * Called by the engine before loading\n * @param engine\n */\n onInitialize(engine) {\n this.engine = engine;\n this.canvas.width = this.engine.screen.resolution.width;\n this.canvas.height = this.engine.screen.resolution.height;\n }\n /**\n * Return a promise that resolves when the user interacts with the loading screen in some way, usually a click.\n *\n * It's important to implement this in order to unlock the audio context in the browser. Browsers automatically prevent\n * audio from playing until the user performs an action.\n *\n */\n async onUserAction() {\n return await Promise.resolve();\n }\n /**\n * Overridable lifecycle method, called directly before loading starts\n */\n async onBeforeLoad() {\n // override me\n }\n /**\n * Overridable lifecycle method, called after loading has completed\n */\n async onAfterLoad() {\n // override me\n await (0,_Util_Util__WEBPACK_IMPORTED_MODULE_4__.delay)(500, this.engine.clock); // avoid a flicker\n }\n /**\n * Add a resource to the loader to load\n * @param loadable Resource to add\n */\n addResource(loadable) {\n this._resources.push(loadable);\n }\n /**\n * Add a list of resources to the loader to load\n * @param loadables The list of resources to load\n */\n addResources(loadables) {\n let i = 0;\n const len = loadables.length;\n for (i; i < len; i++) {\n this.addResource(loadables[i]);\n }\n }\n markResourceComplete() {\n this._numLoaded++;\n }\n /**\n * Returns the progress of the loader as a number between [0, 1] inclusive.\n */\n get progress() {\n const total = this._resources.length;\n return total > 0 ? (0,_Math_util__WEBPACK_IMPORTED_MODULE_5__.clamp)(this._numLoaded, 0, total) / total : 1;\n }\n /**\n * Returns true if the loader has completely loaded all resources\n */\n isLoaded() {\n return this._numLoaded === this._resources.length;\n }\n /**\n * Optionally override the onUpdate\n * @param engine\n * @param elapsed\n */\n onUpdate(engine, elapsed) {\n this._totalTimeMs += elapsed;\n // override me\n }\n /**\n * Optionally override the onDraw\n */\n onDraw(ctx) {\n const seconds = this._totalTimeMs / 1000;\n ctx.fillStyle = _Color__WEBPACK_IMPORTED_MODULE_6__.Color.Black.toRGBA();\n ctx.fillRect(0, 0, this.engine.screen.resolution.width, this.engine.screen.resolution.height);\n ctx.save();\n ctx.translate(this.engine.screen.resolution.width / 2, this.engine.screen.resolution.height / 2);\n const speed = seconds * 10;\n ctx.strokeStyle = 'white';\n ctx.lineWidth = 10;\n ctx.lineCap = 'round';\n ctx.arc(0, 0, 40, speed, speed + (Math.PI * 3) / 2);\n ctx.stroke();\n ctx.fillStyle = 'white';\n ctx.font = '16px sans-serif';\n const text = (this.progress * 100).toFixed(0) + '%';\n const textbox = ctx.measureText(text);\n const width = Math.abs(textbox.actualBoundingBoxLeft) + Math.abs(textbox.actualBoundingBoxRight);\n const height = Math.abs(textbox.actualBoundingBoxAscent) + Math.abs(textbox.actualBoundingBoxDescent);\n ctx.fillText(text, -width / 2, height / 2); // center\n ctx.restore();\n }\n areResourcesLoaded() {\n if (this._resources.length === 0) {\n // special case no resources mean loaded;\n return Promise.resolve();\n }\n return this._loadingFuture.promise;\n }\n /**\n * Not meant to be overridden\n *\n * Begin loading all of the supplied resources, returning a promise\n * that resolves when loading of all is complete AND the user has interacted with the loading screen\n */\n async load() {\n await this.onBeforeLoad();\n this.events.emit('beforeload');\n this.canvas.flagDirty();\n await Promise.all(this._resources.map(async (r) => {\n this.events.emit('loadresourcestart', r);\n await r.load().finally(() => {\n // capture progress\n this._numLoaded++;\n this.canvas.flagDirty();\n this.events.emit('loadresourceend', r);\n });\n }));\n // Wire all sound to the engine\n for (const resource of this._resources) {\n if (resource instanceof _Resources_Sound_Sound__WEBPACK_IMPORTED_MODULE_7__.Sound) {\n resource.wireEngine(this.engine);\n }\n }\n this._loadingFuture.resolve();\n this.canvas.flagDirty();\n // Unlock browser AudioContext in after user gesture\n // See: https://github.com/excaliburjs/Excalibur/issues/262\n // See: https://github.com/excaliburjs/Excalibur/issues/1031\n await this.onUserAction();\n this.events.emit('useraction');\n await _Util_WebAudio__WEBPACK_IMPORTED_MODULE_8__.WebAudio.unlock();\n await this.onAfterLoad();\n this.events.emit('afterload');\n return (this.data = this._resources);\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Director/Director.ts\":\n/*!******************************!*\\\n !*** ./Director/Director.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Director: () => (/* binding */ Director),\n/* harmony export */ DirectorEvents: () => (/* binding */ DirectorEvents)\n/* harmony export */ });\n/* harmony import */ var _DefaultLoader__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./DefaultLoader */ \"./Director/DefaultLoader.ts\");\n/* harmony import */ var _Scene__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Scene */ \"./Scene.ts\");\n/* harmony import */ var _Loader__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Loader */ \"./Director/Loader.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n\n\n\nconst DirectorEvents = {\n NavigationStart: 'navigationstart',\n Navigation: 'navigation',\n NavigationEnd: 'navigationend'\n};\n/**\n * The Director is responsible for managing scenes and changing scenes in Excalibur.\n *\n * It deals with transitions, scene loaders, switching scenes\n *\n * This is used internally by Excalibur, generally not mean to\n * be instantiated end users directly.\n */\nclass Director {\n /**\n * Gets whether the director currently transitioning between scenes\n *\n * Useful if you need to block behavior during transition\n */\n get isTransitioning() {\n return this._isTransitioning;\n }\n constructor(_engine, scenes) {\n this._engine = _engine;\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this._initialized = false;\n /**\n * All registered scenes in Excalibur\n */\n this.scenes = {};\n /**\n * Holds all instantiated scenes\n */\n this._sceneToInstance = new Map();\n this._sceneToLoader = new Map();\n this._sceneToTransition = new Map();\n /**\n * Used to keep track of scenes that have already been loaded so we don't load multiple times\n */\n this._loadedScenes = new Set();\n this._isTransitioning = false;\n this.rootScene = this.currentScene = new _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene();\n this.add('root', this.rootScene);\n this.currentScene = this.rootScene;\n this.currentSceneName = 'root';\n for (const sceneKey in scenes) {\n const sceneOrOptions = scenes[sceneKey];\n this.add(sceneKey, sceneOrOptions);\n if (sceneKey === 'root') {\n this.rootScene = this.getSceneInstance('root'); // always a root scene\n this.currentScene = this.rootScene;\n }\n }\n }\n /**\n * Initialize the director's internal state\n */\n async onInitialize() {\n if (!this._initialized) {\n this._initialized = true;\n if (this._deferredGoto) {\n const deferredScene = this._deferredGoto;\n this._deferredGoto = undefined;\n const deferredTransition = this._deferredTransition;\n this._deferredTransition = undefined;\n const deferredSceneInstance = this.getSceneInstance(deferredScene);\n if (deferredSceneInstance && deferredTransition) {\n deferredTransition._addToTargetScene(this._engine, deferredSceneInstance);\n }\n await this.swapScene(deferredScene);\n if (deferredSceneInstance && deferredTransition) {\n await this.playTransition(deferredTransition, deferredSceneInstance);\n }\n }\n else {\n await this.swapScene('root');\n }\n }\n }\n get isInitialized() {\n return this._initialized;\n }\n /**\n * Configures the start scene, and optionally the transition & loader for the director\n *\n * Typically this is called at the beginning of the game to the start scene and transition and never again.\n * @param startScene\n * @param options\n */\n configureStart(startScene, options) {\n const maybeLoaderOrCtor = options === null || options === void 0 ? void 0 : options.loader;\n if (maybeLoaderOrCtor instanceof _DefaultLoader__WEBPACK_IMPORTED_MODULE_3__.DefaultLoader) {\n this.mainLoader = maybeLoaderOrCtor;\n }\n else if ((0,_DefaultLoader__WEBPACK_IMPORTED_MODULE_3__.isLoaderConstructor)(maybeLoaderOrCtor)) {\n this.mainLoader = new maybeLoaderOrCtor();\n }\n else {\n this.mainLoader = new _Loader__WEBPACK_IMPORTED_MODULE_4__.Loader();\n }\n let maybeStartTransition;\n if (options === null || options === void 0 ? void 0 : options.inTransition) {\n const { inTransition } = options;\n maybeStartTransition = inTransition;\n }\n this.startScene = startScene;\n // Fire and forget promise for the initial scene\n if (maybeStartTransition) {\n const startSceneInstance = this.getSceneInstance(this.startScene);\n if (startSceneInstance) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n maybeStartTransition._addToTargetScene(this._engine, startSceneInstance);\n this.swapScene(this.startScene).then(() => {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n return this.playTransition(maybeStartTransition, startSceneInstance);\n });\n }\n }\n else {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.swapScene(this.startScene);\n }\n this.currentSceneName = this.startScene;\n }\n _getLoader(sceneName) {\n return this._sceneToLoader.get(sceneName);\n }\n _getInTransition(sceneName) {\n var _a;\n const sceneOrRoute = this.scenes[sceneName];\n if (sceneOrRoute instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene || (0,_Scene__WEBPACK_IMPORTED_MODULE_2__.isSceneConstructor)(sceneOrRoute)) {\n return undefined;\n }\n return (_a = sceneOrRoute === null || sceneOrRoute === void 0 ? void 0 : sceneOrRoute.transitions) === null || _a === void 0 ? void 0 : _a.in;\n }\n _getOutTransition(sceneName) {\n var _a;\n const sceneOrRoute = this.scenes[sceneName];\n if (sceneOrRoute instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene || (0,_Scene__WEBPACK_IMPORTED_MODULE_2__.isSceneConstructor)(sceneOrRoute)) {\n return undefined;\n }\n return (_a = sceneOrRoute === null || sceneOrRoute === void 0 ? void 0 : sceneOrRoute.transitions) === null || _a === void 0 ? void 0 : _a.out;\n }\n getDeferredScene() {\n const maybeDeferred = this.getSceneDefinition(this._deferredGoto);\n if (this._deferredGoto && maybeDeferred) {\n return maybeDeferred;\n }\n return null;\n }\n /**\n * Returns a scene by name if it exists, might be the constructor and not the instance of a scene\n * @param name\n */\n getSceneDefinition(name) {\n const maybeScene = this.scenes[name];\n if (maybeScene instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene || (0,_Scene__WEBPACK_IMPORTED_MODULE_2__.isSceneConstructor)(maybeScene)) {\n return maybeScene;\n }\n else if (maybeScene) {\n return maybeScene.scene;\n }\n return undefined;\n }\n /**\n * Returns the name of the registered scene, null if none can be found\n * @param scene\n */\n getSceneName(scene) {\n for (const [name, maybeScene] of Object.entries(this.scenes)) {\n if (maybeScene instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene) {\n if (scene === maybeScene) {\n return name;\n }\n }\n else if (!(0,_Scene__WEBPACK_IMPORTED_MODULE_2__.isSceneConstructor)(maybeScene)) {\n if (scene === maybeScene.scene) {\n return name;\n }\n }\n }\n for (const [name, maybeScene] of Object.entries(this.scenes)) {\n if ((0,_Scene__WEBPACK_IMPORTED_MODULE_2__.isSceneConstructor)(maybeScene)) {\n if (scene.constructor === maybeScene) {\n return name;\n }\n }\n else if (!(maybeScene instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene)) {\n if (scene.constructor === maybeScene.scene) {\n return name;\n }\n }\n }\n return null;\n }\n /**\n * Returns the same Director, but asserts a scene DOES exist to the type system\n * @param name\n */\n assertAdded(name) {\n return this;\n }\n /**\n * Returns the same Director, but asserts a scene DOES NOT exist to the type system\n * @param name\n */\n assertRemoved(name) {\n return this;\n }\n /**\n * Adds additional Scenes to the game!\n * @param name\n * @param sceneOrRoute\n */\n add(name, sceneOrRoute) {\n if (!(sceneOrRoute instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene) && !(0,_Scene__WEBPACK_IMPORTED_MODULE_2__.isSceneConstructor)(sceneOrRoute)) {\n const { loader, transitions } = sceneOrRoute;\n const { in: inTransition, out: outTransition } = transitions !== null && transitions !== void 0 ? transitions : {};\n this._sceneToTransition.set(name, { in: inTransition, out: outTransition });\n if ((0,_DefaultLoader__WEBPACK_IMPORTED_MODULE_3__.isLoaderConstructor)(loader)) {\n this._sceneToLoader.set(name, new loader());\n }\n else if (loader) {\n this._sceneToLoader.set(name, loader);\n }\n }\n if (this.scenes[name]) {\n this._logger.warn('Scene', name, 'already exists overwriting');\n }\n this.scenes[name] = sceneOrRoute;\n return this.assertAdded(name);\n }\n remove(nameOrScene) {\n if (nameOrScene instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene || (0,_Scene__WEBPACK_IMPORTED_MODULE_2__.isSceneConstructor)(nameOrScene)) {\n const sceneOrCtor = nameOrScene;\n // remove scene\n for (const key in this.scenes) {\n if (this.scenes.hasOwnProperty(key)) {\n const potentialSceneOrOptions = this.scenes[key];\n let scene;\n if (potentialSceneOrOptions instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene || (0,_Scene__WEBPACK_IMPORTED_MODULE_2__.isSceneConstructor)(potentialSceneOrOptions)) {\n scene = potentialSceneOrOptions;\n }\n else {\n scene = potentialSceneOrOptions.scene;\n }\n if (scene === sceneOrCtor) {\n if (key === this.currentSceneName) {\n throw new Error(`Cannot remove a currently active scene: ${key}`);\n }\n this._sceneToInstance.delete(key);\n this._sceneToTransition.delete(key);\n this._sceneToLoader.delete(key);\n delete this.scenes[key];\n }\n }\n }\n }\n if (typeof nameOrScene === 'string') {\n if (nameOrScene === this.currentSceneName) {\n throw new Error(`Cannot remove a currently active scene: ${nameOrScene}`);\n }\n // remove scene\n this._sceneToInstance.delete(nameOrScene);\n this._sceneToTransition.delete(nameOrScene);\n this._sceneToLoader.delete(nameOrScene);\n delete this.scenes[nameOrScene];\n }\n }\n /**\n * Go to a specific scene, and optionally override loaders and transitions\n * @param destinationScene\n * @param options\n */\n async goToScene(destinationScene, options) {\n var _a, _b, _c, _d, _e, _f;\n const maybeDest = this.getSceneInstance(destinationScene);\n if (!maybeDest) {\n this._logger.warn(`Scene ${destinationScene} does not exist! Check the name, are you sure you added it?`);\n return;\n }\n const sourceSceneInstance = this.currentScene;\n const sourceScene = this.currentSceneName;\n const engineInputEnabled = (_b = (_a = this._engine.input) === null || _a === void 0 ? void 0 : _a.enabled) !== null && _b !== void 0 ? _b : true;\n this._isTransitioning = true;\n const maybeSourceOut = (_c = this.getSceneInstance(sourceScene)) === null || _c === void 0 ? void 0 : _c.onTransition('out');\n const maybeDestinationIn = maybeDest === null || maybeDest === void 0 ? void 0 : maybeDest.onTransition('in');\n options = {\n // Engine configuration then dynamic scene transitions\n ...{ sourceOut: (_d = this._getOutTransition(this.currentSceneName)) !== null && _d !== void 0 ? _d : maybeSourceOut },\n ...{ destinationIn: (_e = this._getInTransition(destinationScene)) !== null && _e !== void 0 ? _e : maybeDestinationIn },\n // Goto options\n ...options\n };\n const { sourceOut, destinationIn, sceneActivationData } = options;\n const outTransition = sourceOut !== null && sourceOut !== void 0 ? sourceOut : this._getOutTransition(this.currentSceneName);\n const inTransition = destinationIn !== null && destinationIn !== void 0 ? destinationIn : this._getInTransition(destinationScene);\n const hideLoader = (outTransition === null || outTransition === void 0 ? void 0 : outTransition.hideLoader) || (inTransition === null || inTransition === void 0 ? void 0 : inTransition.hideLoader);\n if (hideLoader) {\n // Start hidden loader early and take advantage of the transition\n // Don't await and block on a hidden loader\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.maybeLoadScene(destinationScene, hideLoader);\n }\n this._emitEvent('navigationstart', sourceScene, destinationScene);\n // Run the out transition on the current scene if present\n if (outTransition) {\n await this.playTransition(outTransition, sourceSceneInstance);\n }\n // Run the loader if present\n await this.maybeLoadScene(destinationScene, hideLoader);\n // Give incoming transition a chance to grab info from previous\n if (inTransition) {\n await inTransition.onPreviousSceneDeactivate(this.currentScene);\n }\n // Setup the in transition on the destination scene if present\n // this is important to it can be initialized with the\n if (inTransition) {\n inTransition._addToTargetScene(this._engine, maybeDest);\n }\n // Swap to the new scene\n // Runs scene lifecycle init and activate\n await this.swapScene(destinationScene, sceneActivationData);\n this._emitEvent('navigation', sourceScene, destinationScene);\n // Run the in transition on the new scene if present\n if (inTransition) {\n await this.playTransition(inTransition, maybeDest);\n }\n this._emitEvent('navigationend', sourceScene, destinationScene);\n (_f = this._engine.input) === null || _f === void 0 ? void 0 : _f.toggleEnabled(engineInputEnabled);\n this._isTransitioning = false;\n }\n /**\n * Retrieves a scene instance by key if it's registered.\n *\n * This will call any constructors that were given as a definition\n * @param scene\n */\n getSceneInstance(scene) {\n const sceneDefinition = this.getSceneDefinition(scene);\n if (!sceneDefinition) {\n return undefined;\n }\n if (this._sceneToInstance.has(scene)) {\n return this._sceneToInstance.get(scene);\n }\n if (sceneDefinition instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene) {\n this._sceneToInstance.set(scene, sceneDefinition);\n return sceneDefinition;\n }\n const newScene = new sceneDefinition();\n this._sceneToInstance.set(scene, newScene);\n return newScene;\n }\n /**\n * Triggers scene loading if has not already been loaded\n * @param scene\n * @param hideLoader\n */\n async maybeLoadScene(scene, hideLoader = false) {\n var _a;\n const loader = (_a = this._getLoader(scene)) !== null && _a !== void 0 ? _a : new _DefaultLoader__WEBPACK_IMPORTED_MODULE_3__.DefaultLoader();\n const sceneToLoad = this.getSceneDefinition(scene);\n const sceneToLoadInstance = this.getSceneInstance(scene);\n if (sceneToLoad && sceneToLoadInstance && !this._loadedScenes.has(sceneToLoadInstance)) {\n sceneToLoadInstance.onPreLoad(loader);\n sceneToLoadInstance.events.emit('preload', { loader });\n if (hideLoader) {\n // Don't await a hidden loader\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this._engine.load(loader, hideLoader);\n }\n else {\n await this._engine.load(loader);\n }\n this._loadedScenes.add(sceneToLoadInstance);\n }\n }\n /**\n * Plays a transition in the current scene and does book keeping for input.\n * @param transition\n */\n async playTransition(transition, targetScene) {\n var _a, _b, _c, _d, _e, _f, _g;\n if (!this.isInitialized) {\n this._deferredTransition = transition;\n return;\n }\n if (transition) {\n this.currentTransition = transition;\n const sceneInputEnabled = (_b = (_a = targetScene.input) === null || _a === void 0 ? void 0 : _a.enabled) !== null && _b !== void 0 ? _b : true;\n (_c = targetScene.input) === null || _c === void 0 ? void 0 : _c.toggleEnabled(!transition.blockInput);\n (_d = this._engine.input) === null || _d === void 0 ? void 0 : _d.toggleEnabled(!transition.blockInput);\n this.currentTransition._addToTargetScene(this._engine, targetScene);\n await this.currentTransition._play();\n (_e = targetScene.input) === null || _e === void 0 ? void 0 : _e.toggleEnabled(sceneInputEnabled);\n }\n (_f = this.currentTransition) === null || _f === void 0 ? void 0 : _f.kill();\n (_g = this.currentTransition) === null || _g === void 0 ? void 0 : _g.reset();\n this.currentTransition = undefined;\n }\n /**\n * Swaps the current and destination scene after performing required lifecycle events\n * @param destinationScene\n * @param data\n */\n async swapScene(destinationScene, data) {\n const engine = this._engine;\n // if not yet initialized defer goToScene\n if (!this.isInitialized) {\n this._deferredGoto = destinationScene;\n return;\n }\n const maybeDest = this.getSceneInstance(destinationScene);\n if (maybeDest) {\n const previousScene = this.currentScene;\n const nextScene = maybeDest;\n this._logger.debug('Going to scene:', destinationScene);\n // only deactivate when initialized\n if (this.currentScene.isInitialized) {\n const context = { engine, previousScene, nextScene };\n await this.currentScene._deactivate(context);\n this.currentScene.events.emit('deactivate', new _Events__WEBPACK_IMPORTED_MODULE_5__.DeactivateEvent(context, this.currentScene));\n this.currentScene.input.clear();\n }\n // wait for the scene to be loaded if needed\n const destLoader = this._sceneToLoader.get(destinationScene);\n await (destLoader === null || destLoader === void 0 ? void 0 : destLoader.areResourcesLoaded());\n // set current scene to new one\n this.currentScene = nextScene;\n this.currentSceneName = destinationScene;\n engine.screen.setCurrentCamera(nextScene.camera);\n // initialize the current scene if has not been already\n await this.currentScene._initialize(engine);\n const context = { engine, previousScene, nextScene, data };\n await this.currentScene._activate(context);\n this.currentScene.events.emit('activate', new _Events__WEBPACK_IMPORTED_MODULE_5__.ActivateEvent(context, this.currentScene));\n }\n else {\n this._logger.error('Scene', destinationScene, 'does not exist!');\n }\n }\n _emitEvent(eventName, sourceScene, destinationScene) {\n const source = this.getSceneDefinition(sourceScene);\n const dest = this.getSceneDefinition(destinationScene);\n this.events.emit(eventName, {\n sourceScene: source,\n sourceName: sourceScene,\n destinationScene: dest,\n destinationName: destinationScene\n });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Director/FadeInOut.ts\":\n/*!*******************************!*\\\n !*** ./Director/FadeInOut.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FadeInOut: () => (/* binding */ FadeInOut)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Graphics */ \"./Graphics/Rectangle.ts\");\n/* harmony import */ var _Transition__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Transition */ \"./Director/Transition.ts\");\n\n\n\nclass FadeInOut extends _Transition__WEBPACK_IMPORTED_MODULE_0__.Transition {\n constructor(options) {\n var _a, _b;\n super({\n ...options,\n duration: (_a = options.duration) !== null && _a !== void 0 ? _a : 2000\n });\n this.name = `FadeInOut#${this.id}`;\n this.color = (_b = options.color) !== null && _b !== void 0 ? _b : _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Black;\n }\n onInitialize(engine) {\n this.transform.pos = engine.screen.unsafeArea.topLeft;\n this.screenCover = new _Graphics__WEBPACK_IMPORTED_MODULE_2__.Rectangle({\n width: engine.screen.resolution.width,\n height: engine.screen.resolution.height,\n color: this.color\n });\n this.graphics.add(this.screenCover);\n this.graphics.opacity = this.progress;\n }\n onReset() {\n this.graphics.opacity = this.progress;\n }\n onStart(progress) {\n this.graphics.opacity = progress;\n }\n onEnd(progress) {\n this.graphics.opacity = progress;\n }\n onUpdate(progress) {\n this.graphics.opacity = progress;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Director/Loader.ts\":\n/*!****************************!*\\\n !*** ./Director/Loader.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Loader: () => (/* binding */ Loader)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Util_DrawUtil__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Util/DrawUtil */ \"./Util/DrawUtil.ts\");\n/* harmony import */ var _Loader_logo_png__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Loader.logo.png */ \"./Director/Loader.logo.png\");\n/* harmony import */ var _Loader_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Loader.css */ \"./Director/Loader.css\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Util/Util */ \"./Util/Util.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _DefaultLoader__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./DefaultLoader */ \"./Director/DefaultLoader.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Util/Future */ \"./Util/Future.ts\");\n\n\n\n\n\n\n\n\n\n/**\n * Pre-loading assets\n *\n * The loader provides a mechanism to preload multiple resources at\n * one time. The loader must be passed to the engine in order to\n * trigger the loading progress bar.\n *\n * The {@apilink Loader} itself implements {@apilink Loadable} so you can load loaders.\n *\n * ## Example: Pre-loading resources for a game\n *\n * ```js\n * // create a loader\n * var loader = new ex.Loader();\n *\n * // create a resource dictionary (best practice is to keep a separate file)\n * var resources = {\n * TextureGround: new ex.Texture(\"/images/textures/ground.png\"),\n * SoundDeath: new ex.Sound(\"/sound/death.wav\", \"/sound/death.mp3\")\n * };\n *\n * // loop through dictionary and add to loader\n * for (var loadable in resources) {\n * if (resources.hasOwnProperty(loadable)) {\n * loader.addResource(resources[loadable]);\n * }\n * }\n *\n * // start game\n * game.start(loader).then(function () {\n * console.log(\"Game started!\");\n * });\n * ```\n *\n * ## Customize the Loader\n *\n * The loader can be customized to show different, text, logo, background color, and button.\n *\n * ```typescript\n * const loader = new ex.Loader([playerTexture]);\n *\n * // The loaders button text can simply modified using this\n * loader.playButtonText = 'Start the best game ever';\n *\n * // The logo can be changed by inserting a base64 image string here\n *\n * loader.logo = 'data:image/png;base64,iVBORw...';\n * loader.logoWidth = 15;\n * loader.logoHeight = 14;\n *\n * // The background color can be changed like so by supplying a valid CSS color string\n *\n * loader.backgroundColor = 'red'\n * loader.backgroundColor = '#176BAA'\n *\n * // To build a completely new button\n * loader.startButtonFactory = () => {\n * let myButton = document.createElement('button');\n * myButton.textContent = 'The best button';\n * return myButton;\n * };\n *\n * engine.start(loader).then(() => {});\n * ```\n */\nclass Loader extends _DefaultLoader__WEBPACK_IMPORTED_MODULE_0__.DefaultLoader {\n get _image() {\n if (!this._imageElement) {\n this._imageElement = new Image();\n this._imageElement.onload = () => this._imageLoaded.resolve();\n this._imageElement.src = this.logo;\n }\n return this._imageElement;\n }\n get playButtonRootElement() {\n return this._playButtonRootElement;\n }\n get playButtonElement() {\n return this._playButtonElement;\n }\n get _playButton() {\n const existingRoot = document.getElementById('excalibur-play-root');\n if (existingRoot) {\n this._playButtonRootElement = existingRoot;\n }\n if (!this._playButtonRootElement) {\n this._playButtonRootElement = document.createElement('div');\n this._playButtonRootElement.id = 'excalibur-play-root';\n this._playButtonRootElement.style.position = 'absolute';\n document.body.appendChild(this._playButtonRootElement);\n }\n if (!this._styleBlock) {\n this._styleBlock = document.createElement('style');\n this._styleBlock.textContent = this._playButtonStyles;\n document.head.appendChild(this._styleBlock);\n }\n if (!this._playButtonElement) {\n this._playButtonElement = this.startButtonFactory();\n this._playButtonRootElement.appendChild(this._playButtonElement);\n }\n return this._playButtonElement;\n }\n constructor(loadablesOrOptions) {\n const options = Array.isArray(loadablesOrOptions)\n ? {\n loadables: loadablesOrOptions\n }\n : loadablesOrOptions;\n super(options);\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this._originalOptions = { loadables: [] };\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_2__.EventEmitter();\n this._playButtonShown = false;\n // logo drawing stuff\n // base64 string encoding of the excalibur logo (logo-white.png)\n this.logo = _Loader_logo_png__WEBPACK_IMPORTED_MODULE_3__[\"default\"];\n this.logoWidth = 468;\n this.logoHeight = 118;\n /**\n * Gets or sets the color of the loading bar, default is {@apilink Color.White}\n */\n this.loadingBarColor = _Color__WEBPACK_IMPORTED_MODULE_4__.Color.White;\n /**\n * Gets or sets the background color of the loader as a hex string\n */\n this.backgroundColor = '#176BAA';\n this._imageLoaded = new _Util_Future__WEBPACK_IMPORTED_MODULE_5__.Future();\n this.suppressPlayButton = false;\n /** Loads the css from Loader.css */\n this._playButtonStyles = _Loader_css__WEBPACK_IMPORTED_MODULE_6__[\"default\"].toString();\n /**\n * Get/set play button text\n */\n this.playButtonText = 'Play game';\n /**\n * Return a html button element for excalibur to use as a play button\n */\n this.startButtonFactory = () => {\n let buttonElement = document.getElementById('excalibur-play');\n if (!buttonElement) {\n buttonElement = document.createElement('button');\n }\n buttonElement.id = 'excalibur-play';\n buttonElement.textContent = this.playButtonText;\n buttonElement.style.display = 'none';\n return buttonElement;\n };\n this._originalOptions = { ...Loader._DEFAULT_LOADER_OPTIONS, ...options };\n }\n onInitialize(engine) {\n this.engine = engine;\n this.screen = engine.screen;\n this.canvas.width = this.engine.canvas.width;\n this.canvas.height = this.engine.canvas.height;\n this.screen.events.on('resize', () => {\n this.canvas.width = this.engine.canvas.width;\n this.canvas.height = this.engine.canvas.height;\n });\n }\n /**\n * Shows the play button and returns a promise that resolves when clicked\n */\n async showPlayButton() {\n var _a, _b;\n if (this.suppressPlayButton) {\n this.hidePlayButton();\n // Delay is to give the logo a chance to show, otherwise don't delay\n await (0,_Util_Util__WEBPACK_IMPORTED_MODULE_7__.delay)(500, (_a = this.engine) === null || _a === void 0 ? void 0 : _a.clock);\n }\n else {\n const resizeHandler = () => {\n try {\n this._positionPlayButton();\n }\n catch (_a) {\n // swallow if can't position\n }\n };\n if ((_b = this.engine) === null || _b === void 0 ? void 0 : _b.browser) {\n this.engine.browser.window.on('resize', resizeHandler);\n }\n this._playButtonShown = true;\n this._playButton.style.display = 'block';\n document.body.addEventListener('keyup', (evt) => {\n if (evt.key === 'Enter') {\n this._playButton.click();\n }\n });\n this._positionPlayButton();\n const playButtonClicked = new Promise((resolve) => {\n const startButtonHandler = (e) => {\n var _a;\n // We want to stop propagation to keep bubbling to the engine pointer handlers\n e.stopPropagation();\n // Hide Button after click\n this.hidePlayButton();\n if ((_a = this.engine) === null || _a === void 0 ? void 0 : _a.browser) {\n this.engine.browser.window.off('resize', resizeHandler);\n }\n if (this._originalOptions.fullscreenAfterLoad) {\n try {\n this._logger.info('requesting fullscreen');\n if (this._originalOptions.fullscreenContainer instanceof HTMLElement) {\n this._originalOptions.fullscreenContainer.requestFullscreen();\n }\n else {\n this.engine.screen.goFullScreen(this._originalOptions.fullscreenContainer);\n }\n }\n catch (error) {\n this._logger.error('could not go fullscreen', error);\n }\n }\n resolve();\n };\n this._playButton.addEventListener('click', startButtonHandler);\n this._playButton.addEventListener('touchend', startButtonHandler);\n this._playButton.addEventListener('pointerup', startButtonHandler);\n });\n return await playButtonClicked;\n }\n }\n hidePlayButton() {\n this._playButtonShown = false;\n this._playButton.style.display = 'none';\n }\n /**\n * Clean up generated elements for the loader\n */\n dispose() {\n if (this._playButtonRootElement.parentElement) {\n this._playButtonRootElement.removeChild(this._playButtonElement);\n document.body.removeChild(this._playButtonRootElement);\n document.head.removeChild(this._styleBlock);\n this._playButtonRootElement = null;\n this._playButtonElement = null;\n this._styleBlock = null;\n }\n }\n async onUserAction() {\n var _a;\n // short delay in showing the button for aesthetics\n await (0,_Util_Util__WEBPACK_IMPORTED_MODULE_7__.delay)(200, (_a = this.engine) === null || _a === void 0 ? void 0 : _a.clock);\n this.canvas.flagDirty();\n // show play button\n await this.showPlayButton();\n }\n async onBeforeLoad() {\n this.screen.pushResolutionAndViewport();\n this.screen.resolution = { width: this.canvas.width, height: this.canvas.height };\n this.screen.applyResolutionAndViewport();\n const image = this._image;\n await this._imageLoaded.promise;\n await (image === null || image === void 0 ? void 0 : image.decode()); // decode logo if it exists\n }\n // eslint-disable-next-line require-await\n async onAfterLoad() {\n this.screen.popResolutionAndViewport();\n this.screen.applyResolutionAndViewport();\n this.dispose();\n }\n _positionPlayButton() {\n if (this.engine) {\n const { x: left, y: top, width: screenWidth, height: screenHeight } = this.engine.canvas.getBoundingClientRect();\n if (this._playButtonRootElement) {\n const buttonWidth = this._playButton.clientWidth;\n const buttonHeight = this._playButton.clientHeight;\n if (this.playButtonPosition) {\n this._playButtonRootElement.style.left = `${this.playButtonPosition.x}px`;\n this._playButtonRootElement.style.top = `${this.playButtonPosition.y}px`;\n }\n else {\n this._playButtonRootElement.style.left = `${left + screenWidth / 2 - buttonWidth / 2}px`;\n this._playButtonRootElement.style.top = `${top + screenHeight / 2 - buttonHeight / 2 + 100}px`;\n }\n }\n }\n }\n /**\n * Loader draw function. Draws the default Excalibur loading screen.\n * Override `logo`, `logoWidth`, `logoHeight` and `backgroundColor` properties\n * to customize the drawing, or just override entire method.\n */\n onDraw(ctx) {\n const canvasHeight = this.engine.canvasHeight / this.engine.pixelRatio;\n const canvasWidth = this.engine.canvasWidth / this.engine.pixelRatio;\n this._positionPlayButton();\n ctx.fillStyle = this.backgroundColor;\n ctx.fillRect(0, 0, canvasWidth, canvasHeight);\n let logoY = canvasHeight / 2;\n const width = Math.min(this.logoWidth, canvasWidth * 0.75);\n let logoX = canvasWidth / 2 - width / 2;\n if (this.logoPosition) {\n logoX = this.logoPosition.x;\n logoY = this.logoPosition.y;\n }\n const imageHeight = Math.floor(width * (this.logoHeight / this.logoWidth)); // OG height/width factor\n const oldAntialias = this.engine.screen.antialiasing;\n this.engine.screen.antialiasing = true;\n if (!this.logoPosition) {\n ctx.drawImage(this._image, 0, 0, this.logoWidth, this.logoHeight, logoX, logoY - imageHeight - 20, width, imageHeight);\n }\n else {\n ctx.drawImage(this._image, 0, 0, this.logoWidth, this.logoHeight, logoX, logoY, width, imageHeight);\n }\n // loading box\n if (!this.suppressPlayButton && this._playButtonShown) {\n this.engine.screen.antialiasing = oldAntialias;\n return;\n }\n let loadingX = logoX;\n let loadingY = logoY;\n if (this.loadingBarPosition) {\n loadingX = this.loadingBarPosition.x;\n loadingY = this.loadingBarPosition.y;\n }\n ctx.lineWidth = 2;\n _Util_DrawUtil__WEBPACK_IMPORTED_MODULE_8__.roundRect(ctx, loadingX, loadingY, width, 20, 10, this.loadingBarColor);\n const progress = width * this.progress;\n const margin = 5;\n const progressWidth = progress - margin * 2;\n const height = 20 - margin * 2;\n _Util_DrawUtil__WEBPACK_IMPORTED_MODULE_8__.roundRect(ctx, loadingX + margin, loadingY + margin, progressWidth > 10 ? progressWidth : 10, height, 5, null, this.loadingBarColor);\n this.engine.screen.antialiasing = oldAntialias;\n }\n}\nLoader._DEFAULT_LOADER_OPTIONS = {\n loadables: [],\n fullscreenAfterLoad: false,\n fullscreenContainer: undefined\n};\n\n\n/***/ }),\n\n/***/ \"./Director/Slide.ts\":\n/*!***************************!*\\\n !*** ./Director/Slide.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Slide: () => (/* binding */ Slide)\n/* harmony export */ });\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Graphics */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Transition__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Transition */ \"./Director/Transition.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/EasingFunctions */ \"./Util/EasingFunctions.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Math/coord-plane */ \"./Math/coord-plane.ts\");\n\n\n\n\n\n/**\n * Slide`s between the previous scene and the destination scene\n *\n * Note: Slide` only works as an \"in\" transition\n */\nclass Slide extends _Transition__WEBPACK_IMPORTED_MODULE_0__.Transition {\n constructor(options) {\n var _a;\n super({ direction: 'in', ...options }); // default the correct direction\n this._easing = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_1__.EasingFunctions.Linear;\n this.name = `Slide#${this.id}`;\n this.slideDirection = options.slideDirection;\n this.transform.coordPlane = _Math_coord_plane__WEBPACK_IMPORTED_MODULE_2__.CoordPlane.World;\n this.graphics.forceOnScreen = true;\n this._easing = (_a = options.easingFunction) !== null && _a !== void 0 ? _a : this._easing;\n this._vectorEasing = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_1__.EasingFunctions.CreateVectorEasingFunction(this._easing);\n }\n async onPreviousSceneDeactivate(scene) {\n this._image = await scene.engine.screenshot(true);\n // Firefox is particularly slow\n // needed in case the image isn't ready yet\n await this._image.decode();\n this._screenCover = _Graphics__WEBPACK_IMPORTED_MODULE_3__.ImageSource.fromHtmlImageElement(this._image).toSprite();\n }\n onInitialize(engine) {\n this._engine = engine;\n switch (this.slideDirection) {\n case 'up': {\n this._directionOffset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(0, -engine.screen.resolution.height);\n break;\n }\n case 'down': {\n this._directionOffset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(0, engine.screen.resolution.height);\n break;\n }\n case 'left': {\n this._directionOffset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(-engine.screen.resolution.width, 0);\n break;\n }\n case 'right': {\n this._directionOffset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(engine.screen.resolution.width, 0);\n break;\n }\n }\n this._camera = this._engine.currentScene.camera;\n this._destinationCameraPosition = this._camera.pos.clone();\n // For sliding shift the camera and the transition slide by offset\n this._camera.pos = this._camera.pos.add(this._directionOffset);\n this.transform.pos = this.transform.pos.add(this._directionOffset);\n this._startCameraPosition = this._camera.pos.clone();\n this.graphics.use(this._screenCover);\n // This is because we preserve hidpi res on the screen shot which COULD be bigger than the logical resolution\n this.transform.scale = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(1 / engine.screen.pixelRatio, 1 / engine.screen.pixelRatio);\n }\n onUpdate(progress) {\n // in-transitions count down from 1 -> 0, so our \"end\" is swapped\n this._camera.pos = this._vectorEasing(progress, this._destinationCameraPosition, this._startCameraPosition, 1);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Director/Transition.ts\":\n/*!********************************!*\\\n !*** ./Director/Transition.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Transition: () => (/* binding */ Transition)\n/* harmony export */ });\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Util/Future */ \"./Util/Future.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Graphics */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Math/coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Util/EasingFunctions */ \"./Util/EasingFunctions.ts\");\n/* harmony import */ var _Util_Coroutine__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../Util/Coroutine */ \"./Util/Coroutine.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n\n\n\n\n\n\n\n\n\n/**\n * Base Transition that can be extended to provide custom scene transitions in Excalibur.\n */\nclass Transition extends _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_0__.Entity {\n /**\n * Returns a number between [0, 1] indicating what state the transition is in.\n *\n * * For 'out' direction transitions start at 0 and end at 1\n * * For 'in' direction transitions start at 1 and end at 0\n */\n get progress() {\n return this._currentProgress;\n }\n get complete() {\n if (this.direction === 'out') {\n return this.progress >= 1;\n }\n else {\n return this.progress <= 0;\n }\n }\n constructor(options) {\n var _a, _b, _c, _d;\n super();\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this.transform = new _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_2__.TransformComponent();\n this.graphics = new _Graphics__WEBPACK_IMPORTED_MODULE_3__.GraphicsComponent();\n this._completeFuture = new _Util_Future__WEBPACK_IMPORTED_MODULE_4__.Future();\n // State needs to be reset between uses\n this.started = false;\n this._currentDistance = 0;\n this._currentProgress = 0;\n this.done = this._completeFuture.promise;\n this.name = `Transition#${this.id}`;\n this.duration = options.duration;\n this.easing = (_a = options.easing) !== null && _a !== void 0 ? _a : _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_5__.EasingFunctions.Linear;\n this.direction = (_b = options.direction) !== null && _b !== void 0 ? _b : 'out';\n this.hideLoader = (_c = options.hideLoader) !== null && _c !== void 0 ? _c : false;\n this.blockInput = (_d = options.blockInput) !== null && _d !== void 0 ? _d : false;\n this.transform.coordPlane = _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__.CoordPlane.Screen;\n this.transform.pos = _Math_vector__WEBPACK_IMPORTED_MODULE_7__.Vector.Zero;\n this.transform.z = Infinity; // Transitions sit on top of everything\n this.graphics.anchor = _Math_vector__WEBPACK_IMPORTED_MODULE_7__.Vector.Zero;\n this.addComponent(this.transform);\n this.addComponent(this.graphics);\n if (this.direction === 'out') {\n this._currentProgress = 0;\n }\n else {\n this._currentProgress = 1;\n }\n }\n /**\n * Overridable lifecycle method, called before each update.\n *\n * **WARNING BE SURE** to call `super.updateTransition()` if overriding in your own custom implementation\n * @param engine\n * @param elapsed\n */\n updateTransition(engine, elapsed) {\n if (this.complete) {\n return;\n }\n this._currentDistance += (0,_Math_util__WEBPACK_IMPORTED_MODULE_8__.clamp)(elapsed / this.duration, 0, 1);\n if (this._currentDistance >= 1) {\n this._currentDistance = 1;\n }\n if (this.direction === 'out') {\n this._currentProgress = (0,_Math_util__WEBPACK_IMPORTED_MODULE_8__.clamp)(this.easing(this._currentDistance, 0, 1, 1), 0, 1);\n }\n else {\n this._currentProgress = (0,_Math_util__WEBPACK_IMPORTED_MODULE_8__.clamp)(this.easing(this._currentDistance, 1, 0, 1), 0, 1);\n }\n }\n /**\n * Overridable lifecycle method, called right before the previous scene has deactivated.\n *\n * This gives incoming transition a chance to grab info from previous scene if desired\n * @param scene\n */\n async onPreviousSceneDeactivate(scene) {\n // override me\n }\n /**\n * Overridable lifecycle method, called once at the beginning of the transition\n *\n * `progress` is given between 0 and 1\n * @param progress\n */\n onStart(progress) {\n // override me\n }\n /**\n * Overridable lifecycle method, called every frame of the transition\n *\n * `progress` is given between 0 and 1\n * @param progress\n */\n onUpdate(progress) {\n // override me\n }\n /**\n * Overridable lifecycle method, called at the end of the transition,\n *\n * `progress` is given between 0 and 1\n * @param progress\n */\n onEnd(progress) {\n // override me\n }\n /**\n * Overridable lifecycle method, called when the transition is reset\n *\n * Use this to override and provide your own reset logic for internal state in custom transition implementations\n */\n onReset() {\n // override me\n }\n /**\n * reset() is called by the engine to reset transitions\n */\n reset() {\n this.started = false;\n this._completeFuture = new _Util_Future__WEBPACK_IMPORTED_MODULE_4__.Future();\n this.done = this._completeFuture.promise;\n this._currentDistance = 0;\n if (this.direction === 'out') {\n this._currentProgress = 0;\n }\n else {\n this._currentProgress = 1;\n }\n this.onReset();\n }\n /**\n * @internal\n */\n _addToTargetScene(engine, targetScene) {\n const currentScene = targetScene;\n if (this.started) {\n this._logger.warn(`Attempted to add a transition ${this.name} that is already playing.`);\n }\n if (currentScene.world.entityManager.getById(this.id)) {\n return this._co;\n }\n this._engine = engine;\n currentScene.add(this);\n const self = this;\n this._co = (0,_Util_Coroutine__WEBPACK_IMPORTED_MODULE_9__.coroutine)(engine, function* () {\n while (!self.complete) {\n const elapsed = yield; // per frame\n self.updateTransition(self._engine, elapsed);\n self._execute();\n }\n }, {\n autostart: false\n });\n return this._co;\n }\n /**\n * Called internally by excalibur to swap scenes with transition\n * @internal\n */\n async _play() {\n if (this.started) {\n this.reset();\n this._logger.warn(`Attempted to play a transition ${this.name} that is already playing, reset transition.`);\n }\n if (!this._engine || !this._co) {\n this.reset();\n this._logger.warn(`Attempted to play a transition ${this.name} that hasn't been added`);\n }\n if (this._co) {\n await this._co.start();\n }\n }\n /**\n * execute() is called by the engine every frame to update the Transition lifecycle onStart/onUpdate/onEnd\n * @internal\n */\n _execute() {\n if (!this.isInitialized) {\n return;\n }\n if (!this.started) {\n this.started = true;\n this.onStart(this.progress);\n }\n this.onUpdate(this.progress);\n if (this.complete && !this._completeFuture.isCompleted) {\n this.onEnd(this.progress);\n this._completeFuture.resolve();\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Director/index.ts\":\n/*!***************************!*\\\n !*** ./Director/index.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CrossFade: () => (/* reexport safe */ _CrossFade__WEBPACK_IMPORTED_MODULE_2__.CrossFade),\n/* harmony export */ DefaultLoader: () => (/* reexport safe */ _DefaultLoader__WEBPACK_IMPORTED_MODULE_6__.DefaultLoader),\n/* harmony export */ Director: () => (/* reexport safe */ _Director__WEBPACK_IMPORTED_MODULE_4__.Director),\n/* harmony export */ DirectorEvents: () => (/* reexport safe */ _Director__WEBPACK_IMPORTED_MODULE_4__.DirectorEvents),\n/* harmony export */ FadeInOut: () => (/* reexport safe */ _FadeInOut__WEBPACK_IMPORTED_MODULE_1__.FadeInOut),\n/* harmony export */ Loader: () => (/* reexport safe */ _Loader__WEBPACK_IMPORTED_MODULE_5__.Loader),\n/* harmony export */ LoaderEvents: () => (/* reexport safe */ _DefaultLoader__WEBPACK_IMPORTED_MODULE_6__.LoaderEvents),\n/* harmony export */ Slide: () => (/* reexport safe */ _Slide__WEBPACK_IMPORTED_MODULE_3__.Slide),\n/* harmony export */ Transition: () => (/* reexport safe */ _Transition__WEBPACK_IMPORTED_MODULE_0__.Transition),\n/* harmony export */ isLoaderConstructor: () => (/* reexport safe */ _DefaultLoader__WEBPACK_IMPORTED_MODULE_6__.isLoaderConstructor)\n/* harmony export */ });\n/* harmony import */ var _Transition__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Transition */ \"./Director/Transition.ts\");\n/* harmony import */ var _FadeInOut__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./FadeInOut */ \"./Director/FadeInOut.ts\");\n/* harmony import */ var _CrossFade__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./CrossFade */ \"./Director/CrossFade.ts\");\n/* harmony import */ var _Slide__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Slide */ \"./Director/Slide.ts\");\n/* harmony import */ var _Director__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Director */ \"./Director/Director.ts\");\n/* harmony import */ var _Loader__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Loader */ \"./Director/Loader.ts\");\n/* harmony import */ var _DefaultLoader__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./DefaultLoader */ \"./Director/DefaultLoader.ts\");\n\n\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Engine.ts\":\n/*!*******************!*\\\n !*** ./Engine.ts ***!\n \\*******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Engine: () => (/* binding */ Engine),\n/* harmony export */ EngineEvents: () => (/* binding */ EngineEvents),\n/* harmony export */ ScrollPreventionMode: () => (/* binding */ ScrollPreventionMode)\n/* harmony export */ });\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ */ \"./index.ts\");\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Util/Future */ \"./Util/Future.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Input_PointerScope__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./Input/PointerScope */ \"./Input/PointerScope.ts\");\n/* harmony import */ var _Flags__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Flags */ \"./Flags.ts\");\n/* harmony import */ var _Polyfill__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Polyfill */ \"./Polyfill.ts\");\n/* harmony import */ var _Screen__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Screen */ \"./Screen.ts\");\n/* harmony import */ var _Director_DefaultLoader__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./Director/DefaultLoader */ \"./Director/DefaultLoader.ts\");\n/* harmony import */ var _Director_Loader__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./Director/Loader */ \"./Director/Loader.ts\");\n/* harmony import */ var _Util_Detector__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Util/Detector */ \"./Util/Detector.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./Events */ \"./Events.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./Color */ \"./Color.ts\");\n/* harmony import */ var _Scene__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./Scene */ \"./Scene.ts\");\n/* harmony import */ var _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./EntityComponentSystem/Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _Debug_DebugConfig__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./Debug/DebugConfig */ \"./Debug/DebugConfig.ts\");\n/* harmony import */ var _Util_Browser__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Util/Browser */ \"./Util/Browser.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Graphics */ \"./Graphics/Context/ExcaliburGraphicsContext.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Graphics */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Graphics */ \"./Graphics/Context/ExcaliburGraphicsContext2DCanvas.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Graphics */ \"./Graphics/Context/texture-loader.ts\");\n/* harmony import */ var _Util_Clock__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./Util/Clock */ \"./Util/Clock.ts\");\n/* harmony import */ var _Graphics_Filtering__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Graphics/Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Graphics_GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./Graphics/GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n/* harmony import */ var _Util_Toaster__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Util/Toaster */ \"./Util/Toaster.ts\");\n/* harmony import */ var _Director_Director__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./Director/Director */ \"./Director/Director.ts\");\n/* harmony import */ var _Input_InputHost__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./Input/InputHost */ \"./Input/InputHost.ts\");\n/* harmony import */ var _Collision_PhysicsConfig__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Collision/PhysicsConfig */ \"./Collision/PhysicsConfig.ts\");\n/* harmony import */ var _Context__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Context */ \"./Context.ts\");\n/* harmony import */ var _GarbageCollector__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./GarbageCollector */ \"./GarbageCollector.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./Util/Util */ \"./Util/Util.ts\");\n\n\n\n\n\n\n(0,_Polyfill__WEBPACK_IMPORTED_MODULE_0__.polyfill)();\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst EngineEvents = {\n FallbackGraphicsContext: 'fallbackgraphicscontext',\n Initialize: 'initialize',\n Visible: 'visible',\n Hidden: 'hidden',\n Start: 'start',\n Stop: 'stop',\n PreUpdate: 'preupdate',\n PostUpdate: 'postupdate',\n PreFrame: 'preframe',\n PostFrame: 'postframe',\n PreDraw: 'predraw',\n PostDraw: 'postdraw'\n};\n/**\n * Enum representing the different mousewheel event bubble prevention\n */\nvar ScrollPreventionMode;\n(function (ScrollPreventionMode) {\n /**\n * Do not prevent any page scrolling\n */\n ScrollPreventionMode[ScrollPreventionMode[\"None\"] = 0] = \"None\";\n /**\n * Prevent page scroll if mouse is over the game canvas\n */\n ScrollPreventionMode[ScrollPreventionMode[\"Canvas\"] = 1] = \"Canvas\";\n /**\n * Prevent all page scrolling via mouse wheel\n */\n ScrollPreventionMode[ScrollPreventionMode[\"All\"] = 2] = \"All\";\n})(ScrollPreventionMode || (ScrollPreventionMode = {}));\n/**\n * The Excalibur Engine\n *\n * The {@apilink Engine} is the main driver for a game. It is responsible for\n * starting/stopping the game, maintaining state, transmitting events,\n * loading resources, and managing the scene.\n */\nclass Engine {\n static useEngine() {\n const value = (0,_Context__WEBPACK_IMPORTED_MODULE_1__.useContext)(Engine.Context);\n if (!value) {\n throw new Error('Cannot inject engine with `useEngine()`, `useEngine()` was called outside of Engine lifecycle scope.');\n }\n return value;\n }\n /**\n * The width of the game canvas in pixels (physical width component of the\n * resolution of the canvas element)\n */\n get canvasWidth() {\n return this.screen.canvasWidth;\n }\n /**\n * Returns half width of the game canvas in pixels (half physical width component)\n */\n get halfCanvasWidth() {\n return this.screen.halfCanvasWidth;\n }\n /**\n * The height of the game canvas in pixels, (physical height component of\n * the resolution of the canvas element)\n */\n get canvasHeight() {\n return this.screen.canvasHeight;\n }\n /**\n * Returns half height of the game canvas in pixels (half physical height component)\n */\n get halfCanvasHeight() {\n return this.screen.halfCanvasHeight;\n }\n /**\n * Returns the width of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get drawWidth() {\n return this.screen.drawWidth;\n }\n /**\n * Returns half the width of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get halfDrawWidth() {\n return this.screen.halfDrawWidth;\n }\n /**\n * Returns the height of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get drawHeight() {\n return this.screen.drawHeight;\n }\n /**\n * Returns half the height of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get halfDrawHeight() {\n return this.screen.halfDrawHeight;\n }\n /**\n * Returns whether excalibur detects the current screen to be HiDPI\n */\n get isHiDpi() {\n return this.screen.isHiDpi;\n }\n /**\n * Access {@apilink stats} that holds frame statistics.\n */\n get stats() {\n return this.debug.stats;\n }\n /**\n * The current {@apilink Scene} being drawn and updated on screen\n */\n get currentScene() {\n return this.director.currentScene;\n }\n /**\n * The current {@apilink Scene} being drawn and updated on screen\n */\n get currentSceneName() {\n return this.director.currentSceneName;\n }\n /**\n * The default {@apilink Scene} of the game, use {@apilink Engine.goToScene} to transition to different scenes.\n */\n get rootScene() {\n return this.director.rootScene;\n }\n /**\n * Contains all the scenes currently registered with Excalibur\n */\n get scenes() {\n return this.director.scenes;\n }\n /**\n * Indicates whether the engine is set to fullscreen or not\n */\n get isFullscreen() {\n return this.screen.isFullScreen;\n }\n /**\n * Indicates the current {@apilink DisplayMode} of the engine.\n */\n get displayMode() {\n return this.screen.displayMode;\n }\n /**\n * Returns the calculated pixel ration for use in rendering\n */\n get pixelRatio() {\n return this.screen.pixelRatio;\n }\n get isDebug() {\n return this._isDebug;\n }\n /**\n * Hints the graphics context to truncate fractional world space coordinates\n */\n get snapToPixel() {\n return this.graphicsContext.snapToPixel;\n }\n set snapToPixel(shouldSnapToPixel) {\n this.graphicsContext.snapToPixel = shouldSnapToPixel;\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n /**\n * Creates a new game using the given {@apilink EngineOptions}. By default, if no options are provided,\n * the game will be rendered full screen (taking up all available browser window space).\n * You can customize the game rendering through {@apilink EngineOptions}.\n *\n * Example:\n *\n * ```js\n * var game = new ex.Engine({\n * width: 0, // the width of the canvas\n * height: 0, // the height of the canvas\n * enableCanvasTransparency: true, // the transparencySection of the canvas\n * canvasElementId: '', // the DOM canvas element ID, if you are providing your own\n * displayMode: ex.DisplayMode.FullScreen, // the display mode\n * pointerScope: ex.PointerScope.Document, // the scope of capturing pointer (mouse/touch) events\n * backgroundColor: ex.Color.fromHex('#2185d0') // background color of the engine\n * });\n *\n * // call game.start, which is a Promise\n * game.start().then(function () {\n * // ready, set, go!\n * });\n * ```\n */\n constructor(options) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j;\n /**\n * Anything run under scope can use `useEngine()` to inject the current engine\n * @param cb\n */\n this.scope = (cb) => Engine.Context.scope(this, cb);\n /**\n * Current Excalibur version string\n *\n * Useful for plugins or other tools that need to know what features are available\n */\n this.version = ___WEBPACK_IMPORTED_MODULE_2__.EX_VERSION;\n /**\n * Listen to and emit events on the Engine\n */\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_3__.EventEmitter();\n /**\n * Optionally set the maximum fps if not set Excalibur will go as fast as the device allows.\n *\n * You may want to constrain max fps if your game cannot maintain fps consistently, it can look and feel better to have a 30fps game than\n * one that bounces between 30fps and 60fps\n */\n this.maxFps = Number.POSITIVE_INFINITY;\n this._inputEnabled = true;\n this._suppressPlayButton = false;\n /**\n * Indicates whether audio should be paused when the game is no longer visible.\n */\n this.pauseAudioWhenHidden = true;\n /**\n * Indicates whether the engine should draw with debug information\n */\n this._isDebug = false;\n /**\n * Sets the Transparency for the engine.\n */\n this.enableCanvasTransparency = true;\n /**\n * The action to take when a fatal exception is thrown\n */\n this.onFatalException = (e) => {\n _Util_Log__WEBPACK_IMPORTED_MODULE_4__.Logger.getInstance().fatal(e, e.stack);\n };\n this._toaster = new _Util_Toaster__WEBPACK_IMPORTED_MODULE_5__.Toaster();\n this._timescale = 1.0;\n this._isInitialized = false;\n this._originalOptions = {};\n this._handleWebGLContextLost = (e) => {\n var _a;\n e.preventDefault();\n this.clock.stop();\n this._logger.fatalOnce('WebGL Graphics Lost', e);\n const container = document.createElement('div');\n container.id = 'ex-webgl-graphics-context-lost';\n container.style.position = 'absolute';\n container.style.zIndex = '99';\n container.style.left = '50%';\n container.style.top = '50%';\n container.style.display = 'flex';\n container.style.flexDirection = 'column';\n container.style.transform = 'translate(-50%, -50%)';\n container.style.backgroundColor = 'white';\n container.style.padding = '10px';\n container.style.borderStyle = 'solid 1px';\n const div = document.createElement('div');\n div.innerHTML = `\r\n

There was an issue rendering, please refresh the page.

\r\n
\r\n

WebGL Graphics Context Lost

\r\n\r\n \r\n\r\n

There are a few reasons this might happen:

\r\n
    \r\n
  • Two or more pages are placing a high demand on the GPU
  • \r\n
  • Another page or operation has stalled the GPU and the browser has decided to reset the GPU
  • \r\n
  • The computer has multiple GPUs and the user has switched between them
  • \r\n
  • Graphics driver has crashed or restarted
  • \r\n
  • Graphics driver was updated
  • \r\n
\r\n
\r\n `;\n container.appendChild(div);\n if ((_a = this.canvas) === null || _a === void 0 ? void 0 : _a.parentElement) {\n this.canvas.parentElement.appendChild(container);\n const button = div.querySelector('#ex-webgl-graphics-reload');\n button === null || button === void 0 ? void 0 : button.addEventListener('click', () => location.reload());\n }\n };\n this._performanceThresholdTriggered = false;\n this._fpsSamples = [];\n this._disposed = false;\n this._isLoading = false;\n this._hideLoader = false;\n this._isReadyFuture = new _Util_Future__WEBPACK_IMPORTED_MODULE_6__.Future();\n /**\n * Returns the current frames elapsed milliseconds\n */\n this.currentFrameElapsedMs = 0;\n /**\n * Returns the current frame lag when in fixed update mode\n */\n this.currentFrameLagMs = 0;\n this._lagMs = 0;\n this._screenShotRequests = [];\n options = { ...Engine._DEFAULT_ENGINE_OPTIONS, ...options };\n this._originalOptions = options;\n _Flags__WEBPACK_IMPORTED_MODULE_7__.Flags.freeze();\n // Initialize browser events facade\n this.browser = new _Util_Browser__WEBPACK_IMPORTED_MODULE_8__.BrowserEvents(window, document);\n // Check compatibility\n const detector = new _Util_Detector__WEBPACK_IMPORTED_MODULE_9__.Detector();\n if (!options.suppressMinimumBrowserFeatureDetection && !(this._compatible = detector.test())) {\n const message = document.createElement('div');\n message.innerText = 'Sorry, your browser does not support all the features needed for Excalibur';\n document.body.appendChild(message);\n detector.failedTests.forEach(function (test) {\n const testMessage = document.createElement('div');\n testMessage.innerText = 'Browser feature missing ' + test;\n document.body.appendChild(testMessage);\n });\n if (options.canvasElementId) {\n const canvas = document.getElementById(options.canvasElementId);\n if (canvas) {\n canvas.parentElement.removeChild(canvas);\n }\n }\n return;\n }\n else {\n this._compatible = true;\n }\n // Use native console API for color fun\n // eslint-disable-next-line no-console\n if (console.log && !options.suppressConsoleBootMessage) {\n // eslint-disable-next-line no-console\n console.log(`%cPowered by Excalibur.js (v${___WEBPACK_IMPORTED_MODULE_2__.EX_VERSION})`, 'background: #176BAA; color: white; border-radius: 5px; padding: 15px; font-size: 1.5em; line-height: 80px;');\n // eslint-disable-next-line no-console\n console.log('\\n\\\r\n /| ________________\\n\\\r\nO|===|* >________________>\\n\\\r\n \\\\|');\n // eslint-disable-next-line no-console\n console.log('Visit', 'http://excaliburjs.com', 'for more information');\n }\n // Suppress play button\n if (options.suppressPlayButton) {\n this._suppressPlayButton = true;\n }\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_4__.Logger.getInstance();\n // If debug is enabled, let's log browser features to the console.\n if (this._logger.defaultLevel === _Util_Log__WEBPACK_IMPORTED_MODULE_4__.LogLevel.Debug) {\n detector.logBrowserFeatures();\n }\n this._logger.debug('Building engine...');\n if (options.garbageCollection === true) {\n this.garbageCollectorConfig = {\n ..._GarbageCollector__WEBPACK_IMPORTED_MODULE_10__.DefaultGarbageCollectionOptions\n };\n }\n else if (options.garbageCollection === false) {\n this._logger.warn('WebGL Garbage Collection Disabled!!! If you leak any images over time your game will crash when GPU memory is exhausted');\n this.garbageCollectorConfig = null;\n }\n else {\n this.garbageCollectorConfig = {\n ..._GarbageCollector__WEBPACK_IMPORTED_MODULE_10__.DefaultGarbageCollectionOptions,\n ...options.garbageCollection\n };\n }\n this._garbageCollector = new _GarbageCollector__WEBPACK_IMPORTED_MODULE_10__.GarbageCollector({ getTimestamp: Date.now });\n this.canvasElementId = options.canvasElementId;\n if (options.canvasElementId) {\n this._logger.debug('Using Canvas element specified: ' + options.canvasElementId);\n //test for existence of element\n if (document.getElementById(options.canvasElementId) === null) {\n throw new Error('Cannot find existing element in the DOM, please ensure element is created prior to engine creation.');\n }\n this.canvas = document.getElementById(options.canvasElementId);\n }\n else if (options.canvasElement) {\n this._logger.debug('Using Canvas element specified:', options.canvasElement);\n this.canvas = options.canvasElement;\n }\n else {\n this._logger.debug('Using generated canvas element');\n this.canvas = document.createElement('canvas');\n }\n if (this.canvas && !options.enableCanvasContextMenu) {\n this.canvas.addEventListener('contextmenu', (evt) => {\n evt.preventDefault();\n });\n }\n let displayMode = (_a = options.displayMode) !== null && _a !== void 0 ? _a : _Screen__WEBPACK_IMPORTED_MODULE_11__.DisplayMode.Fixed;\n if ((options.width && options.height) || options.viewport) {\n if (options.displayMode === undefined) {\n displayMode = _Screen__WEBPACK_IMPORTED_MODULE_11__.DisplayMode.Fixed;\n }\n this._logger.debug('Engine viewport is size ' + options.width + ' x ' + options.height);\n }\n else if (!options.displayMode) {\n this._logger.debug('Engine viewport is fit');\n displayMode = _Screen__WEBPACK_IMPORTED_MODULE_11__.DisplayMode.FitScreen;\n }\n this.grabWindowFocus = options.grabWindowFocus;\n this.pointerScope = options.pointerScope;\n this._originalDisplayMode = displayMode;\n let pixelArtSampler;\n let uvPadding;\n let nativeContextAntialiasing;\n let canvasImageRendering;\n let filtering;\n let multiSampleAntialiasing;\n if (typeof options.antialiasing === 'object') {\n ({ pixelArtSampler, nativeContextAntialiasing, multiSampleAntialiasing, filtering, canvasImageRendering } = {\n ...(options.pixelArt ? _Graphics__WEBPACK_IMPORTED_MODULE_12__.DefaultPixelArtOptions : _Graphics__WEBPACK_IMPORTED_MODULE_12__.DefaultAntialiasOptions),\n ...options.antialiasing\n });\n }\n else {\n pixelArtSampler = !!options.pixelArt;\n nativeContextAntialiasing = false;\n multiSampleAntialiasing = options.antialiasing;\n canvasImageRendering = options.antialiasing ? 'auto' : 'pixelated';\n filtering = options.antialiasing ? _Graphics_Filtering__WEBPACK_IMPORTED_MODULE_13__.ImageFiltering.Blended : _Graphics_Filtering__WEBPACK_IMPORTED_MODULE_13__.ImageFiltering.Pixel;\n }\n if (nativeContextAntialiasing && multiSampleAntialiasing) {\n this._logger.warnOnce(`Cannot use antialias setting nativeContextAntialiasing and multiSampleAntialiasing` +\n ` at the same time, they are incompatible settings. If you aren\\'t sure use multiSampleAntialiasing`);\n }\n if (options.pixelArt) {\n uvPadding = 0.25;\n }\n if (!options.antialiasing || filtering === _Graphics_Filtering__WEBPACK_IMPORTED_MODULE_13__.ImageFiltering.Pixel) {\n uvPadding = 0;\n }\n // Override with any user option, if non default to .25 for pixel art, 0.01 for everything else\n uvPadding = (_c = (_b = options.uvPadding) !== null && _b !== void 0 ? _b : uvPadding) !== null && _c !== void 0 ? _c : 0.01;\n // Canvas 2D fallback can be flagged on\n let useCanvasGraphicsContext = _Flags__WEBPACK_IMPORTED_MODULE_7__.Flags.isEnabled('use-canvas-context');\n if (!useCanvasGraphicsContext) {\n // Attempt webgl first\n try {\n this.graphicsContext = new _Graphics__WEBPACK_IMPORTED_MODULE_14__.ExcaliburGraphicsContextWebGL({\n canvasElement: this.canvas,\n enableTransparency: this.enableCanvasTransparency,\n pixelArtSampler: pixelArtSampler,\n antialiasing: nativeContextAntialiasing,\n multiSampleAntialiasing: multiSampleAntialiasing,\n uvPadding: uvPadding,\n powerPreference: options.powerPreference,\n backgroundColor: options.backgroundColor,\n snapToPixel: options.snapToPixel,\n useDrawSorting: options.useDrawSorting,\n garbageCollector: this.garbageCollectorConfig\n ? {\n garbageCollector: this._garbageCollector,\n collectionInterval: this.garbageCollectorConfig.textureCollectInterval\n }\n : null,\n handleContextLost: (_d = options.handleContextLost) !== null && _d !== void 0 ? _d : this._handleWebGLContextLost,\n handleContextRestored: options.handleContextRestored\n });\n }\n catch (e) {\n this._logger.warn(`Excalibur could not load webgl for some reason (${e.message}) and loaded a Canvas 2D fallback. ` +\n `Some features of Excalibur will not work in this mode. \\n\\n` +\n 'Read more about this issue at https://excaliburjs.com/docs/performance');\n // fallback to canvas in case of failure\n useCanvasGraphicsContext = true;\n }\n }\n if (useCanvasGraphicsContext) {\n this.graphicsContext = new _Graphics__WEBPACK_IMPORTED_MODULE_15__.ExcaliburGraphicsContext2DCanvas({\n canvasElement: this.canvas,\n enableTransparency: this.enableCanvasTransparency,\n antialiasing: nativeContextAntialiasing,\n backgroundColor: options.backgroundColor,\n snapToPixel: options.snapToPixel,\n useDrawSorting: options.useDrawSorting\n });\n }\n this.screen = new _Screen__WEBPACK_IMPORTED_MODULE_11__.Screen({\n canvas: this.canvas,\n context: this.graphicsContext,\n antialiasing: nativeContextAntialiasing,\n canvasImageRendering: canvasImageRendering,\n browser: this.browser,\n viewport: (_e = options.viewport) !== null && _e !== void 0 ? _e : (options.width && options.height ? { width: options.width, height: options.height } : _Screen__WEBPACK_IMPORTED_MODULE_11__.Resolution.SVGA),\n resolution: options.resolution,\n displayMode,\n pixelRatio: options.suppressHiDPIScaling ? 1 : (_f = options.pixelRatio) !== null && _f !== void 0 ? _f : null\n });\n // TODO REMOVE STATIC!!!\n // Set default filtering based on antialiasing\n _Graphics__WEBPACK_IMPORTED_MODULE_16__.TextureLoader.filtering = filtering;\n if (options.backgroundColor) {\n this.backgroundColor = options.backgroundColor.clone();\n }\n this.maxFps = (_g = options.maxFps) !== null && _g !== void 0 ? _g : this.maxFps;\n this.fixedUpdateTimestep = (_h = options.fixedUpdateTimestep) !== null && _h !== void 0 ? _h : this.fixedUpdateTimestep;\n this.fixedUpdateFps = (_j = options.fixedUpdateFps) !== null && _j !== void 0 ? _j : this.fixedUpdateFps;\n this.fixedUpdateTimestep = this.fixedUpdateTimestep || 1000 / this.fixedUpdateFps;\n this.clock = new _Util_Clock__WEBPACK_IMPORTED_MODULE_17__.StandardClock({\n maxFps: this.maxFps,\n tick: this._mainloop.bind(this),\n onFatalException: (e) => this.onFatalException(e)\n });\n this.enableCanvasTransparency = options.enableCanvasTransparency;\n if (typeof options.physics === 'boolean') {\n this.physics = {\n ...(0,_Collision_PhysicsConfig__WEBPACK_IMPORTED_MODULE_18__.getDefaultPhysicsConfig)(),\n enabled: options.physics\n };\n }\n else {\n this.physics = {\n ...(0,_Collision_PhysicsConfig__WEBPACK_IMPORTED_MODULE_18__.getDefaultPhysicsConfig)()\n };\n (0,_Util_Util__WEBPACK_IMPORTED_MODULE_19__.mergeDeep)(this.physics, options.physics);\n }\n this.debug = new _Debug_DebugConfig__WEBPACK_IMPORTED_MODULE_20__.DebugConfig(this);\n this.director = new _Director_Director__WEBPACK_IMPORTED_MODULE_21__.Director(this, options.scenes);\n this._initialize(options);\n window.___EXCALIBUR_DEVTOOL = this;\n Engine.InstanceCount++;\n }\n _monitorPerformanceThresholdAndTriggerFallback() {\n const { allow } = this._originalOptions.configurePerformanceCanvas2DFallback;\n let { threshold, showPlayerMessage } = this._originalOptions.configurePerformanceCanvas2DFallback;\n if (threshold === undefined) {\n threshold = Engine._DEFAULT_ENGINE_OPTIONS.configurePerformanceCanvas2DFallback.threshold;\n }\n if (showPlayerMessage === undefined) {\n showPlayerMessage = Engine._DEFAULT_ENGINE_OPTIONS.configurePerformanceCanvas2DFallback.showPlayerMessage;\n }\n if (!_Flags__WEBPACK_IMPORTED_MODULE_7__.Flags.isEnabled('use-canvas-context') && allow && this.ready && !this._performanceThresholdTriggered) {\n // Calculate Average fps for last X number of frames after start\n if (this._fpsSamples.length === threshold.numberOfFrames) {\n this._fpsSamples.splice(0, 1);\n }\n this._fpsSamples.push(this.clock.fpsSampler.fps);\n let total = 0;\n for (let i = 0; i < this._fpsSamples.length; i++) {\n total += this._fpsSamples[i];\n }\n const average = total / this._fpsSamples.length;\n if (this._fpsSamples.length === threshold.numberOfFrames) {\n if (average <= threshold.fps) {\n this._performanceThresholdTriggered = true;\n this._logger.warn(`Switching to browser 2D Canvas fallback due to performance. Some features of Excalibur will not work in this mode.\\n` +\n \"this might mean your browser doesn't have webgl enabled or hardware acceleration is unavailable.\\n\\n\" +\n 'If in Chrome:\\n' +\n ' * Visit Settings > Advanced > System, and ensure \"Use Hardware Acceleration\" is checked.\\n' +\n ' * Visit chrome://flags/#ignore-gpu-blocklist and ensure \"Override software rendering list\" is \"enabled\"\\n' +\n 'If in Firefox, visit about:config\\n' +\n ' * Ensure webgl.disabled = false\\n' +\n ' * Ensure webgl.force-enabled = true\\n' +\n ' * Ensure layers.acceleration.force-enabled = true\\n\\n' +\n 'Read more about this issue at https://excaliburjs.com/docs/performance');\n if (showPlayerMessage) {\n this._toaster.toast('Excalibur is encountering performance issues. ' +\n \"It's possible that your browser doesn't have hardware acceleration enabled. \" +\n 'Visit [LINK] for more information and potential solutions.', 'https://excaliburjs.com/docs/performance');\n }\n this.useCanvas2DFallback();\n this.emit('fallbackgraphicscontext', this.graphicsContext);\n }\n }\n }\n }\n /**\n * Switches the engine's graphics context to the 2D Canvas.\n * @warning Some features of Excalibur will not work in this mode.\n */\n useCanvas2DFallback() {\n var _a, _b, _c;\n // Swap out the canvas\n const newCanvas = this.canvas.cloneNode(false);\n this.canvas.parentNode.replaceChild(newCanvas, this.canvas);\n this.canvas = newCanvas;\n const options = { ...this._originalOptions, antialiasing: this.screen.antialiasing };\n const displayMode = this._originalDisplayMode;\n // New graphics context\n this.graphicsContext = new _Graphics__WEBPACK_IMPORTED_MODULE_15__.ExcaliburGraphicsContext2DCanvas({\n canvasElement: this.canvas,\n enableTransparency: this.enableCanvasTransparency,\n antialiasing: options.antialiasing,\n backgroundColor: options.backgroundColor,\n snapToPixel: options.snapToPixel,\n useDrawSorting: options.useDrawSorting\n });\n // Reset screen\n if (this.screen) {\n this.screen.dispose();\n }\n this.screen = new _Screen__WEBPACK_IMPORTED_MODULE_11__.Screen({\n canvas: this.canvas,\n context: this.graphicsContext,\n antialiasing: (_a = options.antialiasing) !== null && _a !== void 0 ? _a : true,\n browser: this.browser,\n viewport: (_b = options.viewport) !== null && _b !== void 0 ? _b : (options.width && options.height ? { width: options.width, height: options.height } : _Screen__WEBPACK_IMPORTED_MODULE_11__.Resolution.SVGA),\n resolution: options.resolution,\n displayMode,\n pixelRatio: options.suppressHiDPIScaling ? 1 : (_c = options.pixelRatio) !== null && _c !== void 0 ? _c : null\n });\n this.screen.setCurrentCamera(this.currentScene.camera);\n // Reset pointers\n this.input.pointers.detach();\n const pointerTarget = options && options.pointerScope === _Input_PointerScope__WEBPACK_IMPORTED_MODULE_22__.PointerScope.Document ? document : this.canvas;\n this.input.pointers = this.input.pointers.recreate(pointerTarget, this);\n this.input.pointers.init();\n }\n /**\n * Attempts to completely clean up excalibur resources, including removing the canvas from the dom.\n *\n * To start again you will need to new up an Engine.\n */\n dispose() {\n if (!this._disposed) {\n this._disposed = true;\n this.stop();\n this._garbageCollector.forceCollectAll();\n this.input.toggleEnabled(false);\n this.canvas.parentNode.removeChild(this.canvas);\n this.canvas = null;\n this.screen.dispose();\n this.graphicsContext.dispose();\n this.graphicsContext = null;\n Engine.InstanceCount--;\n }\n }\n isDisposed() {\n return this._disposed;\n }\n /**\n * Returns a BoundingBox of the top left corner of the screen\n * and the bottom right corner of the screen.\n */\n getWorldBounds() {\n return this.screen.getWorldBounds();\n }\n /**\n * Gets the current engine timescale factor (default is 1.0 which is 1:1 time)\n */\n get timescale() {\n return this._timescale;\n }\n /**\n * Sets the current engine timescale factor. Useful for creating slow-motion effects or fast-forward effects\n * when using time-based movement.\n */\n set timescale(value) {\n if (value < 0) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_4__.Logger.getInstance().warnOnce('engine.timescale to a value less than 0 are ignored');\n return;\n }\n this._timescale = value;\n }\n /**\n * Adds a {@apilink Timer} to the {@apilink currentScene}.\n * @param timer The timer to add to the {@apilink currentScene}.\n */\n addTimer(timer) {\n return this.currentScene.addTimer(timer);\n }\n /**\n * Removes a {@apilink Timer} from the {@apilink currentScene}.\n * @param timer The timer to remove to the {@apilink currentScene}.\n */\n removeTimer(timer) {\n return this.currentScene.removeTimer(timer);\n }\n /**\n * Adds a {@apilink Scene} to the engine, think of scenes in Excalibur as you\n * would levels or menus.\n * @param key The name of the scene, must be unique\n * @param scene The scene to add to the engine\n */\n addScene(key, scene) {\n this.director.add(key, scene);\n return this;\n }\n /**\n * @internal\n */\n removeScene(entity) {\n this.director.remove(entity);\n }\n add(entity) {\n if (arguments.length === 2) {\n this.director.add(arguments[0], arguments[1]);\n return;\n }\n const maybeDeferred = this.director.getDeferredScene();\n if (maybeDeferred instanceof _Scene__WEBPACK_IMPORTED_MODULE_23__.Scene) {\n maybeDeferred.add(entity);\n }\n else {\n this.currentScene.add(entity);\n }\n }\n remove(entity) {\n if (entity instanceof _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_24__.Entity) {\n this.currentScene.remove(entity);\n }\n if (entity instanceof _Scene__WEBPACK_IMPORTED_MODULE_23__.Scene || (0,_Scene__WEBPACK_IMPORTED_MODULE_23__.isSceneConstructor)(entity)) {\n this.removeScene(entity);\n }\n if (typeof entity === 'string') {\n this.removeScene(entity);\n }\n }\n /**\n * Changes the current scene with optionally supplied:\n * * Activation data\n * * Transitions\n * * Loaders\n *\n * Example:\n * ```typescript\n * game.goToScene('myScene', {\n * sceneActivationData: {any: 'thing at all'},\n * destinationIn: new FadeInOut({duration: 1000, direction: 'in'}),\n * sourceOut: new FadeInOut({duration: 1000, direction: 'out'}),\n * loader: MyLoader\n * });\n * ```\n *\n * Scenes are defined in the Engine constructor\n * ```typescript\n * const engine = new ex.Engine({\n scenes: {...}\n });\n * ```\n * Or by adding dynamically\n *\n * ```typescript\n * engine.addScene('myScene', new ex.Scene());\n * ```\n * @param destinationScene\n * @param options\n */\n async goToScene(destinationScene, options) {\n await this.scope(async () => {\n await this.director.goToScene(destinationScene, options);\n });\n }\n /**\n * Transforms the current x, y from screen coordinates to world coordinates\n * @param point Screen coordinate to convert\n */\n screenToWorldCoordinates(point) {\n return this.screen.screenToWorldCoordinates(point);\n }\n /**\n * Transforms a world coordinate, to a screen coordinate\n * @param point World coordinate to convert\n */\n worldToScreenCoordinates(point) {\n return this.screen.worldToScreenCoordinates(point);\n }\n /**\n * Initializes the internal canvas, rendering context, display mode, and native event listeners\n */\n _initialize(options) {\n var _a, _b;\n this.pageScrollPreventionMode = options.scrollPreventionMode;\n // initialize inputs\n const pointerTarget = options && options.pointerScope === _Input_PointerScope__WEBPACK_IMPORTED_MODULE_22__.PointerScope.Document ? document : this.canvas;\n const grabWindowFocus = (_b = (_a = this._originalOptions) === null || _a === void 0 ? void 0 : _a.grabWindowFocus) !== null && _b !== void 0 ? _b : true;\n this.input = new _Input_InputHost__WEBPACK_IMPORTED_MODULE_25__.InputHost({\n pointerTarget,\n grabWindowFocus,\n engine: this\n });\n this.inputMapper = this.input.inputMapper;\n // Issue #385 make use of the visibility api\n // https://developer.mozilla.org/en-US/docs/Web/Guide/User_experience/Using_the_Page_Visibility_API\n this.browser.document.on('visibilitychange', () => {\n if (document.visibilityState === 'hidden') {\n this.events.emit('hidden', new _Events__WEBPACK_IMPORTED_MODULE_26__.HiddenEvent(this));\n this._logger.debug('Window hidden');\n }\n else if (document.visibilityState === 'visible') {\n this.events.emit('visible', new _Events__WEBPACK_IMPORTED_MODULE_26__.VisibleEvent(this));\n this._logger.debug('Window visible');\n }\n });\n if (!this.canvasElementId && !options.canvasElement) {\n document.body.appendChild(this.canvas);\n }\n }\n toggleInputEnabled(enabled) {\n this._inputEnabled = enabled;\n this.input.toggleEnabled(this._inputEnabled);\n }\n onInitialize(engine) {\n // Override me\n }\n /**\n * Gets whether the actor is Initialized\n */\n get isInitialized() {\n return this._isInitialized;\n }\n async _overrideInitialize(engine) {\n if (!this.isInitialized) {\n await this.director.onInitialize();\n await this.onInitialize(engine);\n this.events.emit('initialize', new _Events__WEBPACK_IMPORTED_MODULE_26__.InitializeEvent(engine, this));\n this._isInitialized = true;\n }\n }\n /**\n * Updates the entire state of the game\n * @param elapsed Number of milliseconds elapsed since the last update.\n */\n _update(elapsed) {\n var _a;\n if (this._isLoading) {\n // suspend updates until loading is finished\n (_a = this._loader) === null || _a === void 0 ? void 0 : _a.onUpdate(this, elapsed);\n // Update input listeners\n this.input.update();\n return;\n }\n // Publish preupdate events\n this.clock.__runScheduledCbs('preupdate');\n this._preupdate(elapsed);\n // process engine level events\n this.currentScene.update(this, elapsed);\n // Update graphics postprocessors\n this.graphicsContext.updatePostProcessors(elapsed);\n // Publish update event\n this.clock.__runScheduledCbs('postupdate');\n this._postupdate(elapsed);\n // Update input listeners\n this.input.update();\n }\n /**\n * @internal\n */\n _preupdate(elapsed) {\n this.emit('preupdate', new _Events__WEBPACK_IMPORTED_MODULE_26__.PreUpdateEvent(this, elapsed, this));\n this.onPreUpdate(this, elapsed);\n }\n /**\n * Safe to override method\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n */\n onPreUpdate(engine, elapsed) {\n // Override me\n }\n /**\n * @internal\n */\n _postupdate(elapsed) {\n this.emit('postupdate', new _Events__WEBPACK_IMPORTED_MODULE_26__.PostUpdateEvent(this, elapsed, this));\n this.onPostUpdate(this, elapsed);\n }\n /**\n * Safe to override method\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n */\n onPostUpdate(engine, elapsed) {\n // Override me\n }\n /**\n * Draws the entire game\n * @param elapsed Number of milliseconds elapsed since the last draw.\n */\n _draw(elapsed) {\n var _a, _b;\n // Use scene background color if present, fallback to engine\n this.graphicsContext.backgroundColor = (_a = this.currentScene.backgroundColor) !== null && _a !== void 0 ? _a : this.backgroundColor;\n this.graphicsContext.beginDrawLifecycle();\n this.graphicsContext.clear();\n this.clock.__runScheduledCbs('predraw');\n this._predraw(this.graphicsContext, elapsed);\n // Drawing nothing else while loading\n if (this._isLoading) {\n if (!this._hideLoader) {\n (_b = this._loader) === null || _b === void 0 ? void 0 : _b.canvas.draw(this.graphicsContext, 0, 0);\n this.clock.__runScheduledCbs('postdraw');\n this.graphicsContext.flush();\n this.graphicsContext.endDrawLifecycle();\n }\n return;\n }\n this.currentScene.draw(this.graphicsContext, elapsed);\n this.clock.__runScheduledCbs('postdraw');\n this._postdraw(this.graphicsContext, elapsed);\n // Flush any pending drawings\n this.graphicsContext.flush();\n this.graphicsContext.endDrawLifecycle();\n this._checkForScreenShots();\n }\n /**\n * @internal\n */\n _predraw(ctx, elapsed) {\n this.emit('predraw', new _Events__WEBPACK_IMPORTED_MODULE_26__.PreDrawEvent(ctx, elapsed, this));\n this.onPreDraw(ctx, elapsed);\n }\n /**\n * Safe to override method to hook into pre draw\n * @param ctx {@link ExcaliburGraphicsContext} for drawing\n * @param elapsed Number of milliseconds elapsed since the last draw.\n */\n onPreDraw(ctx, elapsed) {\n // Override me\n }\n /**\n * @internal\n */\n _postdraw(ctx, elapsed) {\n this.emit('postdraw', new _Events__WEBPACK_IMPORTED_MODULE_26__.PostDrawEvent(ctx, elapsed, this));\n this.onPostDraw(ctx, elapsed);\n }\n /**\n * Safe to override method to hook into pre draw\n * @param ctx {@link ExcaliburGraphicsContext} for drawing\n * @param elapsed Number of milliseconds elapsed since the last draw.\n */\n onPostDraw(ctx, elapsed) {\n // Override me\n }\n /**\n * Enable or disable Excalibur debugging functionality.\n * @param toggle a value that debug drawing will be changed to\n */\n showDebug(toggle) {\n this._isDebug = toggle;\n }\n /**\n * Toggle Excalibur debugging functionality.\n */\n toggleDebug() {\n this._isDebug = !this._isDebug;\n return this._isDebug;\n }\n /**\n * Returns true when loading is totally complete and the player has clicked start\n */\n get loadingComplete() {\n return !this._isLoading;\n }\n get ready() {\n return this._isReadyFuture.isCompleted;\n }\n isReady() {\n return this._isReadyFuture.promise;\n }\n async start(sceneNameOrLoader, options) {\n await this.scope(async () => {\n if (!this._compatible) {\n throw new Error('Excalibur is incompatible with your browser');\n }\n this._isLoading = true;\n let loader;\n if (sceneNameOrLoader instanceof _Director_DefaultLoader__WEBPACK_IMPORTED_MODULE_27__.DefaultLoader) {\n loader = sceneNameOrLoader;\n }\n else if (typeof sceneNameOrLoader === 'string') {\n this.director.configureStart(sceneNameOrLoader, options);\n loader = this.director.mainLoader;\n }\n // Start the excalibur clock which drives the mainloop\n this._logger.debug('Starting game clock...');\n this.browser.resume();\n this.clock.start();\n if (this.garbageCollectorConfig) {\n this._garbageCollector.start();\n }\n this._logger.debug('Game clock started');\n await this.load(loader !== null && loader !== void 0 ? loader : new _Director_Loader__WEBPACK_IMPORTED_MODULE_28__.Loader());\n // Initialize before ready\n await this._overrideInitialize(this);\n this._isReadyFuture.resolve();\n this.emit('start', new _Events__WEBPACK_IMPORTED_MODULE_26__.GameStartEvent(this));\n return this._isReadyFuture.promise;\n });\n }\n _mainloop(elapsed) {\n this.scope(() => {\n this.emit('preframe', new _Events__WEBPACK_IMPORTED_MODULE_26__.PreFrameEvent(this, this.stats.prevFrame));\n const elapsedMs = elapsed * this.timescale;\n this.currentFrameElapsedMs = elapsedMs;\n // reset frame stats (reuse existing instances)\n const frameId = this.stats.prevFrame.id + 1;\n this.stats.currFrame.reset();\n this.stats.currFrame.id = frameId;\n this.stats.currFrame.elapsedMs = elapsedMs;\n this.stats.currFrame.fps = this.clock.fpsSampler.fps;\n _Graphics_GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_29__.GraphicsDiagnostics.clear();\n const beforeUpdate = this.clock.now();\n const fixedTimestepMs = this.fixedUpdateTimestep;\n if (this.fixedUpdateTimestep) {\n this._lagMs += elapsedMs;\n while (this._lagMs >= fixedTimestepMs) {\n this._update(fixedTimestepMs);\n this._lagMs -= fixedTimestepMs;\n }\n }\n else {\n this._update(elapsedMs);\n }\n const afterUpdate = this.clock.now();\n this.currentFrameLagMs = this._lagMs;\n this._draw(elapsedMs);\n const afterDraw = this.clock.now();\n this.stats.currFrame.duration.update = afterUpdate - beforeUpdate;\n this.stats.currFrame.duration.draw = afterDraw - afterUpdate;\n this.stats.currFrame.graphics.drawnImages = _Graphics_GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_29__.GraphicsDiagnostics.DrawnImagesCount;\n this.stats.currFrame.graphics.drawCalls = _Graphics_GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_29__.GraphicsDiagnostics.DrawCallCount;\n this.emit('postframe', new _Events__WEBPACK_IMPORTED_MODULE_26__.PostFrameEvent(this, this.stats.currFrame));\n this.stats.prevFrame.reset(this.stats.currFrame);\n this._monitorPerformanceThresholdAndTriggerFallback();\n });\n }\n /**\n * Stops Excalibur's main loop, useful for pausing the game.\n */\n stop() {\n if (this.clock.isRunning()) {\n this.emit('stop', new _Events__WEBPACK_IMPORTED_MODULE_26__.GameStopEvent(this));\n this.browser.pause();\n this.clock.stop();\n this._garbageCollector.stop();\n this._logger.debug('Game stopped');\n }\n }\n /**\n * Returns the Engine's running status, Useful for checking whether engine is running or paused.\n */\n isRunning() {\n return this.clock.isRunning();\n }\n /**\n * Takes a screen shot of the current viewport and returns it as an\n * HTML Image Element.\n * @param preserveHiDPIResolution in the case of HiDPI return the full scaled backing image, by default false\n */\n screenshot(preserveHiDPIResolution = false) {\n const screenShotPromise = new Promise((resolve) => {\n this._screenShotRequests.push({ preserveHiDPIResolution, resolve });\n });\n return screenShotPromise;\n }\n _checkForScreenShots() {\n // We must grab the draw buffer before we yield to the browser\n // the draw buffer is cleared after compositing\n // the reason for the asynchrony is setting `preserveDrawingBuffer: true`\n // forces the browser to copy buffers which can have a mass perf impact on mobile\n for (const request of this._screenShotRequests) {\n const finalWidth = request.preserveHiDPIResolution ? this.canvas.width : this.screen.resolution.width;\n const finalHeight = request.preserveHiDPIResolution ? this.canvas.height : this.screen.resolution.height;\n const screenshot = document.createElement('canvas');\n screenshot.width = finalWidth;\n screenshot.height = finalHeight;\n const ctx = screenshot.getContext('2d');\n ctx.imageSmoothingEnabled = this.screen.antialiasing;\n ctx.drawImage(this.canvas, 0, 0, finalWidth, finalHeight);\n const result = new Image();\n const raw = screenshot.toDataURL('image/png');\n result.onload = () => {\n request.resolve(result);\n };\n result.src = raw;\n }\n // Reset state\n this._screenShotRequests.length = 0;\n }\n /**\n * Another option available to you to load resources into the game.\n * Immediately after calling this the game will pause and the loading screen\n * will appear.\n * @param loader Some {@apilink Loadable} such as a {@apilink Loader} collection, {@apilink Sound}, or {@apilink Texture}.\n */\n async load(loader, hideLoader = false) {\n await this.scope(async () => {\n try {\n // early exit if loaded\n if (loader.isLoaded()) {\n return;\n }\n this._loader = loader;\n this._isLoading = true;\n this._hideLoader = hideLoader;\n if (loader instanceof _Director_Loader__WEBPACK_IMPORTED_MODULE_28__.Loader) {\n loader.suppressPlayButton = loader.suppressPlayButton || this._suppressPlayButton;\n }\n this._loader.onInitialize(this);\n await loader.load();\n }\n catch (e) {\n this._logger.error('Error loading resources, things may not behave properly', e);\n await Promise.resolve();\n }\n finally {\n this._isLoading = false;\n this._hideLoader = false;\n this._loader = null;\n }\n });\n }\n}\nEngine.Context = (0,_Context__WEBPACK_IMPORTED_MODULE_1__.createContext)();\nEngine.InstanceCount = 0;\n/**\n * Default {@apilink EngineOptions}\n */\nEngine._DEFAULT_ENGINE_OPTIONS = {\n width: 0,\n height: 0,\n enableCanvasTransparency: true,\n useDrawSorting: true,\n configurePerformanceCanvas2DFallback: {\n allow: false,\n showPlayerMessage: false,\n threshold: { fps: 20, numberOfFrames: 100 }\n },\n canvasElementId: '',\n canvasElement: undefined,\n enableCanvasContextMenu: false,\n snapToPixel: false,\n antialiasing: true,\n pixelArt: false,\n garbageCollection: true,\n powerPreference: 'high-performance',\n pointerScope: _Input_PointerScope__WEBPACK_IMPORTED_MODULE_22__.PointerScope.Canvas,\n suppressConsoleBootMessage: null,\n suppressMinimumBrowserFeatureDetection: null,\n suppressHiDPIScaling: null,\n suppressPlayButton: null,\n grabWindowFocus: true,\n scrollPreventionMode: ScrollPreventionMode.Canvas,\n backgroundColor: _Color__WEBPACK_IMPORTED_MODULE_30__.Color.fromHex('#2185d0') // Excalibur blue\n};\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/Component.ts\":\n/*!********************************************!*\\\n !*** ./EntityComponentSystem/Component.ts ***!\n \\********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Component: () => (/* binding */ Component),\n/* harmony export */ isComponentCtor: () => (/* binding */ isComponentCtor)\n/* harmony export */ });\n/**\n *\n */\nfunction isComponentCtor(value) {\n return !!value && !!value.prototype && !!value.prototype.constructor;\n}\n/**\n * Type guard to check if a component implements clone\n * @param x\n */\nfunction hasClone(x) {\n return !!(x === null || x === void 0 ? void 0 : x.clone);\n}\n/**\n * Components are containers for state in Excalibur, the are meant to convey capabilities that an Entity possesses\n *\n * Implementations of Component must have a zero-arg constructor to support dependencies\n *\n * ```typescript\n * class MyComponent extends ex.Component {\n * // zero arg support required if you want to use component dependencies\n * constructor(public optionalPos?: ex.Vector) {}\n * }\n * ```\n */\nclass Component {\n constructor() {\n // TODO maybe generate a unique id?\n /**\n * Current owning {@apilink Entity}, if any, of this component. Null if not added to any {@apilink Entity}\n */\n this.owner = undefined;\n }\n /**\n * Clones any properties on this component, if that property value has a `clone()` method it will be called\n */\n clone() {\n const newComponent = new this.constructor();\n for (const prop in this) {\n if (this.hasOwnProperty(prop)) {\n const val = this[prop];\n if (hasClone(val) && prop !== 'owner' && prop !== 'clone') {\n newComponent[prop] = val.clone();\n }\n else {\n newComponent[prop] = val;\n }\n }\n }\n return newComponent;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/Components/MotionComponent.ts\":\n/*!*************************************************************!*\\\n !*** ./EntityComponentSystem/Components/MotionComponent.ts ***!\n \\*************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MotionComponent: () => (/* binding */ MotionComponent)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Component */ \"./EntityComponentSystem/Component.ts\");\n\n\nclass MotionComponent extends _Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor() {\n super(...arguments);\n /**\n * The velocity of an entity in pixels per second\n */\n this.vel = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n /**\n * The acceleration of entity in pixels per second^2\n */\n this.acc = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n /**\n * The scale rate of change in scale units per second\n */\n this.scaleFactor = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n /**\n * The angular velocity which is how quickly the entity is rotating in radians per second\n */\n this.angularVelocity = 0;\n /**\n * The amount of torque applied to the entity, angular acceleration is torque * inertia\n */\n this.torque = 0;\n /**\n * Inertia can be thought of as the resistance to motion\n */\n this.inertia = 1;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/Components/TransformComponent.ts\":\n/*!****************************************************************!*\\\n !*** ./EntityComponentSystem/Components/TransformComponent.ts ***!\n \\****************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TransformComponent: () => (/* binding */ TransformComponent)\n/* harmony export */ });\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Math/coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _Math_transform__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math/transform */ \"./Math/transform.ts\");\n/* harmony import */ var _Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Component */ \"./EntityComponentSystem/Component.ts\");\n/* harmony import */ var _Util_Observable__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Util/Observable */ \"./Util/Observable.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n\n\n\n\n\nclass TransformComponent extends _Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor() {\n super(...arguments);\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this._parentComponent = null;\n this._transform = new _Math_transform__WEBPACK_IMPORTED_MODULE_2__.Transform();\n this._addChildTransform = (child) => {\n const childTxComponent = child.get(TransformComponent);\n if (childTxComponent) {\n childTxComponent._transform.parent = this._transform;\n childTxComponent._parentComponent = this;\n }\n };\n /**\n * Observable that emits when the z index changes on this component\n */\n this.zIndexChanged$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_3__.Observable();\n this._coordPlane = _Math_coord_plane__WEBPACK_IMPORTED_MODULE_4__.CoordPlane.World;\n }\n get() {\n return this._transform;\n }\n onAdd(owner) {\n for (const child of owner.children) {\n this._addChildTransform(child);\n }\n owner.childrenAdded$.subscribe((child) => this._addChildTransform(child));\n owner.childrenRemoved$.subscribe((child) => {\n const childTxComponent = child.get(TransformComponent);\n if (childTxComponent) {\n childTxComponent._transform.parent = null;\n childTxComponent._parentComponent = null;\n }\n });\n }\n onRemove(_previousOwner) {\n this._transform.parent = null;\n this._parentComponent = null;\n }\n /**\n * The z-index ordering of the entity, a higher values are drawn on top of lower values.\n * For example z=99 would be drawn on top of z=0.\n */\n get z() {\n return this._transform.z;\n }\n set z(val) {\n const oldz = this._transform.z;\n this._transform.z = val;\n if (oldz !== val) {\n this.zIndexChanged$.notifyAll(val);\n }\n }\n get globalZ() {\n return this._transform.globalZ;\n }\n set globalZ(z) {\n this._transform.globalZ = z;\n }\n /**\n * The {@apilink CoordPlane | `coordinate plane`} for this transform for the entity.\n */\n get coordPlane() {\n if (this._parentComponent) {\n return this._parentComponent.coordPlane;\n }\n return this._coordPlane;\n }\n set coordPlane(value) {\n var _a;\n if (!this._parentComponent) {\n this._coordPlane = value;\n }\n else {\n this._logger.warn(`Cannot set coordinate plane on child entity ${(_a = this.owner) === null || _a === void 0 ? void 0 : _a.name}, children inherit their coordinate plane from their parents.`);\n }\n }\n get pos() {\n return this._transform.pos;\n }\n set pos(v) {\n this._transform.pos = v;\n }\n get globalPos() {\n return this._transform.globalPos;\n }\n set globalPos(v) {\n this._transform.globalPos = v;\n }\n get rotation() {\n return this._transform.rotation;\n }\n set rotation(rotation) {\n this._transform.rotation = rotation;\n }\n get globalRotation() {\n return this._transform.globalRotation;\n }\n set globalRotation(rotation) {\n this._transform.globalRotation = rotation;\n }\n get scale() {\n return this._transform.scale;\n }\n set scale(v) {\n this._transform.scale = v;\n }\n get globalScale() {\n return this._transform.globalScale;\n }\n set globalScale(v) {\n this._transform.globalScale = v;\n }\n applyInverse(v) {\n return this._transform.applyInverse(v);\n }\n apply(v) {\n return this._transform.apply(v);\n }\n clone() {\n const component = new TransformComponent();\n component._transform = this._transform.clone();\n return component;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/Entity.ts\":\n/*!*****************************************!*\\\n !*** ./EntityComponentSystem/Entity.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AddedComponent: () => (/* binding */ AddedComponent),\n/* harmony export */ Entity: () => (/* binding */ Entity),\n/* harmony export */ EntityEvents: () => (/* binding */ EntityEvents),\n/* harmony export */ RemovedComponent: () => (/* binding */ RemovedComponent),\n/* harmony export */ isAddedComponent: () => (/* binding */ isAddedComponent),\n/* harmony export */ isRemovedComponent: () => (/* binding */ isRemovedComponent)\n/* harmony export */ });\n/* harmony import */ var _Component__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Component */ \"./EntityComponentSystem/Component.ts\");\n/* harmony import */ var _Util_Observable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Observable */ \"./Util/Observable.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Util/Util */ \"./Util/Util.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n\n\n\n\n\n\n\n/**\n * AddedComponent message\n */\nclass AddedComponent {\n constructor(data) {\n this.data = data;\n this.type = 'Component Added';\n }\n}\n/**\n * Type guard to know if message is f an Added Component\n */\nfunction isAddedComponent(x) {\n return !!x && x.type === 'Component Added';\n}\n/**\n * RemovedComponent message\n */\nclass RemovedComponent {\n constructor(data) {\n this.data = data;\n this.type = 'Component Removed';\n }\n}\n/**\n * Type guard to know if message is for a Removed Component\n */\nfunction isRemovedComponent(x) {\n return !!x && x.type === 'Component Removed';\n}\nconst EntityEvents = {\n Add: 'add',\n Remove: 'remove',\n Initialize: 'initialize',\n PreUpdate: 'preupdate',\n PostUpdate: 'postupdate',\n Kill: 'kill'\n};\n/**\n * An Entity is the base type of anything that can have behavior in Excalibur, they are part of the built in entity component system\n *\n * Entities can be strongly typed with the components they contain\n *\n * ```typescript\n * const entity = new Entity();\n * entity.components.a; // Type ComponentA\n * entity.components.b; // Type ComponentB\n * ```\n */\nclass Entity {\n constructor(componentsOrOptions, name) {\n /**\n * The unique identifier for the entity\n */\n this.id = Entity._ID++;\n this.name = `Entity#${this.id}`;\n /**\n * Listen to or emit events for an entity\n */\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n this._tags = new Set();\n this.componentAdded$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_1__.Observable();\n this.componentRemoved$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_1__.Observable();\n this.tagAdded$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_1__.Observable();\n this.tagRemoved$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_1__.Observable();\n /**\n * Current components on the entity\n *\n * **Do not modify**\n *\n * Use addComponent/removeComponent otherwise the ECS will not be notified of changes.\n */\n this.components = new Map();\n this.componentValues = [];\n this._componentsToRemove = [];\n /**\n * The current scene that the entity is in, if any\n */\n this.scene = null;\n /**\n * Whether this entity is active, if set to false it will be reclaimed\n */\n this.isActive = true;\n this._parent = null;\n this.childrenAdded$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_1__.Observable();\n this.childrenRemoved$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_1__.Observable();\n this._children = [];\n this._isInitialized = false;\n this._isAdded = false;\n let componentsToAdd;\n let nameToAdd;\n let silence = false;\n if (Array.isArray(componentsOrOptions)) {\n componentsToAdd = componentsOrOptions;\n nameToAdd = name;\n }\n else if (componentsOrOptions && typeof componentsOrOptions === 'object') {\n const { components, name, silenceWarnings } = componentsOrOptions;\n componentsToAdd = components !== null && components !== void 0 ? components : [];\n nameToAdd = name;\n silence = !!silenceWarnings;\n }\n if (nameToAdd) {\n this.name = nameToAdd;\n }\n if (componentsToAdd) {\n for (const component of componentsToAdd) {\n this.addComponent(component);\n }\n }\n if (true) {\n if (!silence) {\n setTimeout(() => {\n if (!this.scene && !this.isInitialized) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_2__.Logger.getInstance().warn(`Entity \"${this.name || this.id}\" was not added to a scene.`);\n }\n }, 5000);\n }\n }\n }\n /**\n * Whether this entity is active, if set to false it will be reclaimed\n * @deprecated use isActive\n */\n get active() {\n return this.isActive;\n }\n /**\n * Whether this entity is active, if set to false it will be reclaimed\n * @deprecated use isActive\n */\n set active(val) {\n this.isActive = val;\n }\n /**\n * Kill the entity, means it will no longer be updated. Kills are deferred to the end of the update.\n * If parented it will be removed from the parent when killed.\n */\n kill() {\n if (this.isActive) {\n this.isActive = false;\n this.unparent();\n }\n this.emit('kill', new _Events__WEBPACK_IMPORTED_MODULE_3__.KillEvent(this));\n }\n isKilled() {\n return !this.isActive;\n }\n /**\n * Specifically get the tags on the entity from {@apilink TagsComponent}\n */\n get tags() {\n return this._tags;\n }\n /**\n * Check if a tag exists on the entity\n * @param tag name to check for\n */\n hasTag(tag) {\n return this._tags.has(tag);\n }\n /**\n * Adds a tag to an entity\n * @param tag\n */\n addTag(tag) {\n this._tags.add(tag);\n this.tagAdded$.notifyAll(tag);\n return this;\n }\n /**\n * Removes a tag on the entity\n *\n * Removals are deferred until the end of update\n * @param tag\n */\n removeTag(tag) {\n this._tags.delete(tag);\n this.tagRemoved$.notifyAll(tag);\n return this;\n }\n /**\n * The types of the components on the Entity\n */\n get types() {\n return Array.from(this.components.keys());\n }\n /**\n * Returns all component instances on entity\n */\n getComponents() {\n return Array.from(this.components.values());\n }\n /**\n * Verifies that an entity has all the required types\n * @param requiredTypes\n */\n hasAll(requiredTypes) {\n for (let i = 0; i < requiredTypes.length; i++) {\n if (!this.components.has(requiredTypes[i])) {\n return false;\n }\n }\n return true;\n }\n /**\n * Verifies that an entity has all the required tags\n * @param requiredTags\n */\n hasAllTags(requiredTags) {\n for (let i = 0; i < requiredTags.length; i++) {\n if (!this.tags.has(requiredTags[i])) {\n return false;\n }\n }\n return true;\n }\n get(type) {\n return this.components.get(type);\n }\n get parent() {\n return this._parent;\n }\n /**\n * Get the direct children of this entity\n */\n get children() {\n return this._children;\n }\n /**\n * Unparents this entity, if there is a parent. Otherwise it does nothing.\n */\n unparent() {\n if (this._parent) {\n this._parent.removeChild(this);\n this._parent = null;\n }\n }\n /**\n * Adds an entity to be a child of this entity\n * @param entity\n */\n addChild(entity) {\n if (entity.parent === null) {\n if (this.getAncestors().includes(entity)) {\n throw new Error('Cycle detected, cannot add entity');\n }\n this._children.push(entity);\n entity._parent = this;\n this.childrenAdded$.notifyAll(entity);\n }\n else {\n throw new Error('Entity already has a parent, cannot add without unparenting');\n }\n return this;\n }\n /**\n * Remove an entity from children if it exists\n * @param entity\n */\n removeChild(entity) {\n if (entity.parent === this) {\n (0,_Util_Util__WEBPACK_IMPORTED_MODULE_4__.removeItemFromArray)(entity, this._children);\n entity._parent = null;\n this.childrenRemoved$.notifyAll(entity);\n }\n return this;\n }\n /**\n * Removes all children from this entity\n */\n removeAllChildren() {\n // Avoid modifying the array issue by walking backwards\n for (let i = this.children.length - 1; i >= 0; i--) {\n this.removeChild(this.children[i]);\n }\n return this;\n }\n /**\n * Returns a list of parent entities starting with the topmost parent. Includes the current entity.\n */\n getAncestors() {\n const result = [this];\n let current = this.parent;\n while (current) {\n result.push(current);\n current = current.parent;\n }\n return result.reverse();\n }\n /**\n * Returns a list of all the entities that descend from this entity. Includes the current entity.\n */\n getDescendants() {\n let result = [this];\n let queue = [this];\n while (queue.length > 0) {\n const curr = queue.pop();\n if (curr) {\n queue = queue.concat(curr.children);\n result = result.concat(curr.children);\n }\n }\n return result;\n }\n /**\n * Creates a deep copy of the entity and a copy of all its components\n */\n clone() {\n const newEntity = new Entity();\n for (const c of this.types) {\n const componentInstance = this.get(c);\n if (componentInstance) {\n newEntity.addComponent(componentInstance.clone());\n }\n }\n for (const child of this.children) {\n newEntity.addChild(child.clone());\n }\n return newEntity;\n }\n /**\n * Adds a copy of all the components from another template entity as a \"prefab\"\n * @param templateEntity Entity to use as a template\n * @param force Force component replacement if it already exists on the target entity\n */\n addTemplate(templateEntity, force = false) {\n for (const c of templateEntity.getComponents()) {\n this.addComponent(c.clone(), force);\n }\n for (const child of templateEntity.children) {\n this.addChild(child.clone().addTemplate(child));\n }\n return this;\n }\n _getClassHierarchyRoot(componentType) {\n var _a, _b;\n let current = componentType;\n let parent = (_a = Object.getPrototypeOf(current.prototype)) === null || _a === void 0 ? void 0 : _a.constructor;\n while (parent && parent !== Object && parent !== _Component__WEBPACK_IMPORTED_MODULE_5__.Component) {\n current = parent;\n parent = (_b = Object.getPrototypeOf(current.prototype)) === null || _b === void 0 ? void 0 : _b.constructor;\n }\n return current;\n }\n /**\n * Adds a component to the entity\n * @param component Component or Entity to add copy of components from\n * @param force Optionally overwrite any existing components of the same type\n */\n addComponent(component, force = false) {\n // if component already exists, skip if not forced\n if (this.has(component.constructor)) {\n if (force) {\n // Remove existing component type if exists when forced\n this.removeComponent(component.constructor, true);\n }\n else {\n // early exit component exits\n return this;\n }\n }\n // TODO circular dependencies will be a problem\n if (component.dependencies && component.dependencies.length) {\n for (const ctor of component.dependencies) {\n this.addComponent(new ctor());\n }\n }\n component.owner = this;\n const rootComponent = this._getClassHierarchyRoot(component.constructor);\n this.components.set(rootComponent, component);\n this.components.set(component.constructor, component);\n this.componentValues.push(component);\n if (component.onAdd) {\n component.onAdd(this);\n }\n this.componentAdded$.notifyAll(component);\n return this;\n }\n /**\n * Removes a component from the entity, by default removals are deferred to the end of entity update to avoid consistency issues\n *\n * Components can be force removed with the `force` flag, the removal is not deferred and happens immediately\n * @param typeOrInstance\n * @param force\n */\n removeComponent(typeOrInstance, force = false) {\n let type;\n if ((0,_Component__WEBPACK_IMPORTED_MODULE_5__.isComponentCtor)(typeOrInstance)) {\n type = typeOrInstance;\n }\n else {\n type = typeOrInstance.constructor;\n }\n if (force) {\n const componentToRemove = this.components.get(type);\n if (componentToRemove) {\n this.componentRemoved$.notifyAll(componentToRemove);\n componentToRemove.owner = undefined;\n if (componentToRemove.onRemove) {\n componentToRemove.onRemove(this);\n }\n const componentIndex = this.componentValues.indexOf(componentToRemove);\n if (componentIndex > -1) {\n this.componentValues.splice(componentIndex, 1);\n }\n }\n const rootComponent = this._getClassHierarchyRoot(type);\n this.components.delete(rootComponent);\n this.components.delete(type); // remove after the notify to preserve typing\n }\n else {\n this._componentsToRemove.push(type);\n }\n return this;\n }\n clearComponents() {\n const components = this.types;\n for (const c of components) {\n this.removeComponent(c);\n }\n }\n /**\n * @hidden\n * @internal\n */\n processComponentRemoval() {\n for (const type of this._componentsToRemove) {\n this.removeComponent(type, true);\n }\n this._componentsToRemove.length = 0;\n }\n /**\n * Check if a component type exists\n * @param type\n */\n has(type) {\n return this.components.has(type);\n }\n /**\n * Gets whether the actor is Initialized\n */\n get isInitialized() {\n return this._isInitialized;\n }\n get isAdded() {\n return this._isAdded;\n }\n /**\n * Initializes this entity, meant to be called by the Scene before first update not by users of Excalibur.\n *\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n * @internal\n */\n _initialize(engine) {\n if (!this.isInitialized) {\n this.onInitialize(engine);\n this.events.emit('initialize', new _Events__WEBPACK_IMPORTED_MODULE_3__.InitializeEvent(engine, this));\n this._isInitialized = true;\n }\n }\n /**\n * Adds this Actor, meant to be called by the Scene when Actor is added.\n *\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n * @internal\n */\n _add(engine) {\n if (!this.isAdded && this.isActive) {\n this.onAdd(engine);\n this.events.emit('add', new _Events__WEBPACK_IMPORTED_MODULE_3__.AddEvent(engine, this));\n this._isAdded = true;\n }\n }\n /**\n * Removes Actor, meant to be called by the Scene when Actor is added.\n *\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n * @internal\n */\n _remove(engine) {\n if (this.isAdded && !this.isActive) {\n this.onRemove(engine);\n this.events.emit('remove', new _Events__WEBPACK_IMPORTED_MODULE_3__.RemoveEvent(engine, this));\n this._isAdded = false;\n }\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _preupdate handler for {@apilink onPreUpdate} lifecycle event\n * @internal\n */\n _preupdate(engine, elapsed) {\n this.events.emit('preupdate', new _Events__WEBPACK_IMPORTED_MODULE_3__.PreUpdateEvent(engine, elapsed, this));\n this.onPreUpdate(engine, elapsed);\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _preupdate handler for {@apilink onPostUpdate} lifecycle event\n * @internal\n */\n _postupdate(engine, elapsed) {\n this.events.emit('postupdate', new _Events__WEBPACK_IMPORTED_MODULE_3__.PostUpdateEvent(engine, elapsed, this));\n this.onPostUpdate(engine, elapsed);\n }\n /**\n * `onInitialize` is called before the first update of the entity. This method is meant to be\n * overridden.\n *\n * Synonymous with the event handler `.on('initialize', (evt) => {...})`\n */\n onInitialize(engine) {\n // Override me\n }\n /**\n * `onAdd` is called when Actor is added to scene. This method is meant to be\n * overridden.\n *\n * Synonymous with the event handler `.on('add', (evt) => {...})`\n */\n onAdd(engine) {\n // Override me\n }\n /**\n * `onRemove` is called when Actor is added to scene. This method is meant to be\n * overridden.\n *\n * Synonymous with the event handler `.on('remove', (evt) => {...})`\n */\n onRemove(engine) {\n // Override me\n }\n /**\n * Safe to override onPreUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPreUpdate` is called directly before an entity is updated.\n */\n onPreUpdate(engine, elapsed) {\n // Override me\n }\n /**\n * Safe to override onPostUpdate lifecycle event handler. Synonymous with `.on('postupdate', (evt) =>{...})`\n *\n * `onPostUpdate` is called directly after an entity is updated.\n */\n onPostUpdate(engine, elapsed) {\n // Override me\n }\n /**\n *\n * Entity update lifecycle, called internally\n * @internal\n * @param engine\n * @param elapsed\n */\n update(engine, elapsed) {\n this._initialize(engine);\n this._add(engine);\n this._preupdate(engine, elapsed);\n for (const child of this.children) {\n child.update(engine, elapsed);\n }\n this._postupdate(engine, elapsed);\n this._remove(engine);\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n if (handler) {\n this.events.off(eventName, handler);\n }\n else {\n this.events.off(eventName);\n }\n }\n}\nEntity._ID = 0;\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/EntityManager.ts\":\n/*!************************************************!*\\\n !*** ./EntityComponentSystem/EntityManager.ts ***!\n \\************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EntityManager: () => (/* binding */ EntityManager)\n/* harmony export */ });\n/* harmony import */ var _Entity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Util */ \"./Util/Util.ts\");\n\n\n// Add/Remove entities and components\nclass EntityManager {\n constructor(_world) {\n this._world = _world;\n this.entities = [];\n this._entityIndex = {};\n this._childAddedHandlerMap = new Map();\n this._childRemovedHandlerMap = new Map();\n this._createChildAddedHandler = () => (e) => {\n this.addEntity(e);\n };\n this._createChildRemovedHandler = () => (e) => {\n this.removeEntity(e, false);\n };\n this._entitiesToRemove = [];\n }\n /**\n * Runs the entity lifecycle\n * @param scene\n * @param elapsed\n */\n updateEntities(scene, elapsed) {\n for (let entityIndex = 0; entityIndex < this.entities.length; entityIndex++) {\n const entity = this.entities[entityIndex];\n entity.update(scene.engine, elapsed);\n if (!entity.isActive) {\n this.removeEntity(entity);\n }\n }\n }\n findEntitiesForRemoval() {\n for (let entityIndex = 0; entityIndex < this.entities.length; entityIndex++) {\n const entity = this.entities[entityIndex];\n if (!entity.isActive) {\n this.removeEntity(entity);\n }\n }\n }\n /**\n * Adds an entity to be tracked by the EntityManager\n * @param entity\n */\n addEntity(entity) {\n entity.isActive = true;\n entity.scene = this._world.scene;\n if (entity && !this._entityIndex[entity.id]) {\n this._entityIndex[entity.id] = entity;\n this.entities.push(entity);\n this._world.queryManager.addEntity(entity);\n // if entity has children\n entity.children.forEach((c) => {\n c.scene = entity.scene;\n this.addEntity(c);\n });\n const childAdded = this._createChildAddedHandler();\n this._childAddedHandlerMap.set(entity, childAdded);\n const childRemoved = this._createChildRemovedHandler();\n this._childRemovedHandlerMap.set(entity, childRemoved);\n entity.childrenAdded$.subscribe(childAdded);\n entity.childrenRemoved$.subscribe(childRemoved);\n }\n }\n removeEntity(idOrEntity, deferred = true) {\n var _a, _b;\n let id = 0;\n if (idOrEntity instanceof _Entity__WEBPACK_IMPORTED_MODULE_0__.Entity) {\n id = idOrEntity.id;\n }\n else {\n id = idOrEntity;\n }\n const entity = this._entityIndex[id];\n if (entity && entity.isActive) {\n entity.isActive = false;\n }\n if (entity && deferred) {\n this._entitiesToRemove.push(entity);\n return;\n }\n delete this._entityIndex[id];\n if (entity) {\n entity.scene = null;\n (0,_Util_Util__WEBPACK_IMPORTED_MODULE_1__.removeItemFromArray)(entity, this.entities);\n this._world.queryManager.removeEntity(entity);\n // if entity has children\n entity.children.forEach((c) => {\n c.scene = null;\n this.removeEntity(c, deferred);\n });\n const childAddedHandler = this._childAddedHandlerMap.get(entity);\n if (childAddedHandler) {\n entity.childrenAdded$.unsubscribe(childAddedHandler);\n }\n const childRemovedHandler = this._childRemovedHandlerMap.get(entity);\n if (childRemovedHandler) {\n entity.childrenRemoved$.unsubscribe(childRemovedHandler);\n }\n // stats\n if ((_b = (_a = this._world) === null || _a === void 0 ? void 0 : _a.scene) === null || _b === void 0 ? void 0 : _b.engine) {\n this._world.scene.engine.stats.currFrame.actors.killed++;\n }\n }\n }\n processEntityRemovals() {\n for (let entityIndex = 0; entityIndex < this._entitiesToRemove.length; entityIndex++) {\n const entity = this._entitiesToRemove[entityIndex];\n if (entity.isActive) {\n continue;\n }\n this.removeEntity(entity, false);\n }\n this._entitiesToRemove.length = 0;\n }\n processComponentRemovals() {\n for (let entityIndex = 0; entityIndex < this.entities.length; entityIndex++) {\n const entity = this.entities[entityIndex];\n entity.processComponentRemoval();\n }\n }\n getById(id) {\n return this._entityIndex[id];\n }\n getByName(name) {\n return this.entities.filter((e) => e.name === name);\n }\n clear() {\n for (let i = this.entities.length - 1; i >= 0; i--) {\n this.removeEntity(this.entities[i]);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/Priority.ts\":\n/*!*******************************************!*\\\n !*** ./EntityComponentSystem/Priority.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SystemPriority: () => (/* binding */ SystemPriority)\n/* harmony export */ });\n/**\n * Higher priorities run earlier than others in the system update\n */\nconst SystemPriority = {\n Highest: -Infinity,\n Higher: -5,\n Average: 0,\n Lower: 5,\n Lowest: Infinity\n};\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/Query.ts\":\n/*!****************************************!*\\\n !*** ./EntityComponentSystem/Query.ts ***!\n \\****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Query: () => (/* binding */ Query)\n/* harmony export */ });\n/* harmony import */ var _Util_Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Util/Observable */ \"./Util/Observable.ts\");\n\n/**\n * Represents query for entities that match a list of types that is cached and observable\n *\n * Queries can be strongly typed by supplying a type union in the optional type parameter\n * ```typescript\n * const queryAB = new ex.Query(['A', 'B']);\n * ```\n */\nclass Query {\n constructor(requiredComponents) {\n this.requiredComponents = requiredComponents;\n this.components = new Set();\n this.entities = [];\n /**\n * This fires right after the component is added\n */\n this.entityAdded$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_0__.Observable();\n /**\n * This fires right before the component is actually removed from the entity, it will still be available for cleanup purposes\n */\n this.entityRemoved$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_0__.Observable();\n if (requiredComponents.length === 0) {\n throw new Error('Cannot create query without components');\n }\n for (const type of requiredComponents) {\n this.components.add(type);\n }\n this.id = Query.createId(requiredComponents);\n }\n static createId(requiredComponents) {\n // TODO what happens if a user defines the same type name as a built in type\n // ! TODO this could be dangerous depending on the bundler's settings for names\n // Maybe some kind of hash function is better here?\n return requiredComponents\n .slice()\n .map((c) => c.name)\n .sort()\n .join('-');\n }\n /**\n * Potentially adds an entity to a query index, returns true if added, false if not\n * @param entity\n */\n checkAndAdd(entity) {\n if (!this.entities.includes(entity) && entity.hasAll(Array.from(this.components))) {\n this.entities.push(entity);\n this.entityAdded$.notifyAll(entity);\n return true;\n }\n return false;\n }\n removeEntity(entity) {\n const index = this.entities.indexOf(entity);\n if (index > -1) {\n this.entities.splice(index, 1);\n this.entityRemoved$.notifyAll(entity);\n }\n }\n /**\n * Returns a list of entities that match the query\n * @param sort Optional sorting function to sort entities returned from the query\n */\n getEntities(sort) {\n if (sort) {\n this.entities.sort(sort);\n }\n return this.entities;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/QueryManager.ts\":\n/*!***********************************************!*\\\n !*** ./EntityComponentSystem/QueryManager.ts ***!\n \\***********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ QueryManager: () => (/* binding */ QueryManager)\n/* harmony export */ });\n/* harmony import */ var _Query__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Query */ \"./EntityComponentSystem/Query.ts\");\n/* harmony import */ var _TagQuery__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./TagQuery */ \"./EntityComponentSystem/TagQuery.ts\");\n\n\n/**\n * The query manager is responsible for updating all queries when entities/components change\n */\nclass QueryManager {\n constructor(_world) {\n this._world = _world;\n this._queries = new Map();\n this._addComponentHandlers = new Map();\n this._removeComponentHandlers = new Map();\n this._componentToQueriesIndex = new Map();\n this._tagQueries = new Map();\n this._addTagHandlers = new Map();\n this._removeTagHandlers = new Map();\n this._tagToQueriesIndex = new Map();\n this._createAddComponentHandler = (entity) => (c) => {\n this.addComponent(entity, c);\n };\n this._createRemoveComponentHandler = (entity) => (c) => {\n this.removeComponent(entity, c);\n };\n this._createAddTagHandler = (entity) => (tag) => {\n this.addTag(entity, tag);\n };\n this._createRemoveTagHandler = (entity) => (tag) => {\n this.removeTag(entity, tag);\n };\n }\n createQuery(requiredComponents) {\n const id = _Query__WEBPACK_IMPORTED_MODULE_0__.Query.createId(requiredComponents);\n if (this._queries.has(id)) {\n // short circuit if query is already created\n return this._queries.get(id);\n }\n const query = new _Query__WEBPACK_IMPORTED_MODULE_0__.Query(requiredComponents);\n this._queries.set(query.id, query);\n // index maintenance\n for (const component of requiredComponents) {\n const queries = this._componentToQueriesIndex.get(component);\n if (!queries) {\n this._componentToQueriesIndex.set(component, [query]);\n }\n else {\n queries.push(query);\n }\n }\n for (const entity of this._world.entities) {\n this.addEntity(entity);\n }\n return query;\n }\n createTagQuery(requiredTags) {\n const id = _TagQuery__WEBPACK_IMPORTED_MODULE_1__.TagQuery.createId(requiredTags);\n if (this._tagQueries.has(id)) {\n // short circuit if query is already created\n return this._tagQueries.get(id);\n }\n const query = new _TagQuery__WEBPACK_IMPORTED_MODULE_1__.TagQuery(requiredTags);\n this._tagQueries.set(query.id, query);\n // index maintenance\n for (const tag of requiredTags) {\n const queries = this._tagToQueriesIndex.get(tag);\n if (!queries) {\n this._tagToQueriesIndex.set(tag, [query]);\n }\n else {\n queries.push(query);\n }\n }\n for (const entity of this._world.entities) {\n this.addEntity(entity);\n }\n return query;\n }\n /**\n * Scans queries and locates any that need this entity added\n * @param entity\n */\n addEntity(entity) {\n const maybeAddComponent = this._addComponentHandlers.get(entity);\n const maybeRemoveComponent = this._removeComponentHandlers.get(entity);\n const addComponent = maybeAddComponent !== null && maybeAddComponent !== void 0 ? maybeAddComponent : this._createAddComponentHandler(entity);\n const removeComponent = maybeRemoveComponent !== null && maybeRemoveComponent !== void 0 ? maybeRemoveComponent : this._createRemoveComponentHandler(entity);\n this._addComponentHandlers.set(entity, addComponent);\n this._removeComponentHandlers.set(entity, removeComponent);\n const maybeAddTag = this._addTagHandlers.get(entity);\n const maybeRemoveTag = this._removeTagHandlers.get(entity);\n const addTag = maybeAddTag !== null && maybeAddTag !== void 0 ? maybeAddTag : this._createAddTagHandler(entity);\n const removeTag = maybeRemoveTag !== null && maybeRemoveTag !== void 0 ? maybeRemoveTag : this._createRemoveTagHandler(entity);\n this._addTagHandlers.set(entity, addTag);\n this._removeTagHandlers.set(entity, removeTag);\n for (const query of this._queries.values()) {\n query.checkAndAdd(entity);\n }\n for (const tagQuery of this._tagQueries.values()) {\n tagQuery.checkAndAdd(entity);\n }\n entity.componentAdded$.subscribe(addComponent);\n entity.componentRemoved$.subscribe(removeComponent);\n entity.tagAdded$.subscribe(addTag);\n entity.tagRemoved$.subscribe(removeTag);\n }\n /**\n * Scans queries and locates any that need this entity removed\n * @param entity\n */\n removeEntity(entity) {\n // Handle components\n const addComponent = this._addComponentHandlers.get(entity);\n const removeComponent = this._removeComponentHandlers.get(entity);\n for (const query of this._queries.values()) {\n query.removeEntity(entity);\n }\n if (addComponent) {\n entity.componentAdded$.unsubscribe(addComponent);\n }\n if (removeComponent) {\n entity.componentRemoved$.unsubscribe(removeComponent);\n }\n // Handle tags\n const addTag = this._addTagHandlers.get(entity);\n const removeTag = this._removeTagHandlers.get(entity);\n for (const tagQuery of this._tagQueries.values()) {\n tagQuery.removeEntity(entity);\n }\n if (addTag) {\n entity.tagAdded$.unsubscribe(addTag);\n }\n if (removeTag) {\n entity.tagRemoved$.unsubscribe(removeTag);\n }\n }\n /**\n * Updates any queries when a component is added to an entity\n * @param entity\n * @param component\n */\n addComponent(entity, component) {\n var _a;\n const queries = (_a = this._componentToQueriesIndex.get(component.constructor)) !== null && _a !== void 0 ? _a : [];\n for (const query of queries) {\n query.checkAndAdd(entity);\n }\n }\n /**\n * Updates any queries when a component is removed from an entity\n * @param entity\n * @param component\n */\n removeComponent(entity, component) {\n var _a;\n const queries = (_a = this._componentToQueriesIndex.get(component.constructor)) !== null && _a !== void 0 ? _a : [];\n for (const query of queries) {\n query.removeEntity(entity);\n }\n }\n /**\n * Updates any queries when a tag is added to an entity\n * @param entity\n * @param tag\n */\n addTag(entity, tag) {\n var _a;\n const queries = (_a = this._tagToQueriesIndex.get(tag)) !== null && _a !== void 0 ? _a : [];\n for (const query of queries) {\n query.checkAndAdd(entity);\n }\n }\n /**\n * Updates any queries when a component is removed from an entity\n * @param entity\n * @param tag\n */\n removeTag(entity, tag) {\n var _a;\n const queries = (_a = this._tagToQueriesIndex.get(tag)) !== null && _a !== void 0 ? _a : [];\n for (const query of queries) {\n query.removeEntity(entity);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/System.ts\":\n/*!*****************************************!*\\\n !*** ./EntityComponentSystem/System.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ System: () => (/* binding */ System),\n/* harmony export */ SystemType: () => (/* binding */ SystemType)\n/* harmony export */ });\n/* harmony import */ var _Priority__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Priority */ \"./EntityComponentSystem/Priority.ts\");\n\n/**\n * Enum that determines whether to run the system in the update or draw phase\n */\nvar SystemType;\n(function (SystemType) {\n SystemType[\"Update\"] = \"update\";\n SystemType[\"Draw\"] = \"draw\";\n})(SystemType || (SystemType = {}));\n/**\n * An Excalibur {@apilink System} that updates entities of certain types.\n * Systems are scene specific\n *\n *\n *\n * Excalibur Systems currently require at least 1 Component type to operated\n *\n * Multiple types are declared as a type union\n * For example:\n *\n * ```typescript\n * class MySystem extends System {\n * static priority = SystemPriority.Lowest;\n * public readonly systemType = SystemType.Update;\n * public query: Query;\n * constructor(public world: World) {\n * super();\n * this.query = this.world.query([TransformComponent]);\n * }\n * public update(elapsed: number) {\n * ...\n * }\n * }\n * ```\n */\nclass System {\n}\n/**\n * System can execute in priority order, by default all systems are priority 0. Lower values indicated higher priority.\n * For a system to execute before all other a lower priority value (-1 for example) must be set.\n * For a system to execute after all other a higher priority value (10 for example) must be set.\n */\nSystem.priority = _Priority__WEBPACK_IMPORTED_MODULE_0__.SystemPriority.Average;\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/SystemManager.ts\":\n/*!************************************************!*\\\n !*** ./EntityComponentSystem/SystemManager.ts ***!\n \\************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SystemManager: () => (/* binding */ SystemManager),\n/* harmony export */ isSystemConstructor: () => (/* binding */ isSystemConstructor)\n/* harmony export */ });\n/* harmony import */ var _System__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Util */ \"./Util/Util.ts\");\n\n\n/**\n *\n */\nfunction isSystemConstructor(x) {\n var _a, _b;\n return !!(x === null || x === void 0 ? void 0 : x.prototype) && !!((_b = (_a = x === null || x === void 0 ? void 0 : x.prototype) === null || _a === void 0 ? void 0 : _a.constructor) === null || _b === void 0 ? void 0 : _b.name);\n}\n/**\n * The SystemManager is responsible for keeping track of all systems in a scene.\n * Systems are scene specific\n */\nclass SystemManager {\n constructor(_world) {\n this._world = _world;\n /**\n * List of systems, to add a new system call {@apilink SystemManager.addSystem}\n */\n this.systems = [];\n this.initialized = false;\n }\n /**\n * Get a system registered in the manager by type\n * @param systemType\n */\n get(systemType) {\n return this.systems.find((s) => s instanceof systemType);\n }\n /**\n * Adds a system to the manager, it will now be updated every frame\n * @param systemOrCtor\n */\n addSystem(systemOrCtor) {\n let system;\n if (systemOrCtor instanceof _System__WEBPACK_IMPORTED_MODULE_0__.System) {\n system = systemOrCtor;\n }\n else {\n system = new systemOrCtor(this._world);\n }\n this.systems.push(system);\n this.systems.sort((a, b) => a.constructor.priority - b.constructor.priority);\n // If systems are added and the manager has already been init'd\n // then immediately init the system\n if (this.initialized && system.initialize) {\n system.initialize(this._world, this._world.scene);\n }\n }\n /**\n * Removes a system from the manager, it will no longer be updated\n * @param system\n */\n removeSystem(system) {\n (0,_Util_Util__WEBPACK_IMPORTED_MODULE_1__.removeItemFromArray)(system, this.systems);\n }\n /**\n * Initialize all systems in the manager\n *\n * Systems added after initialize() will be initialized on add\n */\n initialize() {\n if (!this.initialized) {\n this.initialized = true;\n for (const s of this.systems) {\n if (s.initialize) {\n s.initialize(this._world, this._world.scene);\n }\n }\n }\n }\n /**\n * Updates all systems\n * @param type whether this is an update or draw system\n * @param scene context reference\n * @param elapsed time in milliseconds\n */\n updateSystems(type, scene, elapsed) {\n const systems = this.systems.filter((s) => s.systemType === type);\n for (const s of systems) {\n if (s.preupdate) {\n s.preupdate(scene, elapsed);\n }\n }\n for (const s of systems) {\n s.update(elapsed);\n }\n for (const s of systems) {\n if (s.postupdate) {\n s.postupdate(scene, elapsed);\n }\n }\n }\n clear() {\n for (let i = this.systems.length - 1; i >= 0; i--) {\n this.removeSystem(this.systems[i]);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/TagQuery.ts\":\n/*!*******************************************!*\\\n !*** ./EntityComponentSystem/TagQuery.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TagQuery: () => (/* binding */ TagQuery)\n/* harmony export */ });\n/* harmony import */ var _Util_Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Util/Observable */ \"./Util/Observable.ts\");\n\nclass TagQuery {\n constructor(requiredTags) {\n this.requiredTags = requiredTags;\n this.tags = new Set();\n this.entities = [];\n /**\n * This fires right after the component is added\n */\n this.entityAdded$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_0__.Observable();\n /**\n * This fires right before the component is actually removed from the entity, it will still be available for cleanup purposes\n */\n this.entityRemoved$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_0__.Observable();\n if (requiredTags.length === 0) {\n throw new Error('Cannot create tag query without tags');\n }\n for (const tag of requiredTags) {\n this.tags.add(tag);\n }\n this.id = TagQuery.createId(requiredTags);\n }\n static createId(requiredComponents) {\n return requiredComponents.slice().sort().join('-');\n }\n checkAndAdd(entity) {\n if (!this.entities.includes(entity) && entity.hasAllTags(Array.from(this.tags))) {\n this.entities.push(entity);\n this.entityAdded$.notifyAll(entity);\n return true;\n }\n return false;\n }\n removeEntity(entity) {\n const index = this.entities.indexOf(entity);\n if (index > -1) {\n this.entities.splice(index, 1);\n this.entityRemoved$.notifyAll(entity);\n }\n }\n /**\n * Returns a list of entities that match the query\n * @param sort Optional sorting function to sort entities returned from the query\n */\n getEntities(sort) {\n if (sort) {\n this.entities.sort(sort);\n }\n return this.entities;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/World.ts\":\n/*!****************************************!*\\\n !*** ./EntityComponentSystem/World.ts ***!\n \\****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ World: () => (/* binding */ World)\n/* harmony export */ });\n/* harmony import */ var _Entity__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _EntityManager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./EntityManager */ \"./EntityComponentSystem/EntityManager.ts\");\n/* harmony import */ var _QueryManager__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./QueryManager */ \"./EntityComponentSystem/QueryManager.ts\");\n/* harmony import */ var _System__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _SystemManager__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./SystemManager */ \"./EntityComponentSystem/SystemManager.ts\");\n\n\n\n\n\n/**\n * The World is a self-contained entity component system for a particular context.\n */\nclass World {\n /**\n * The context type is passed to the system updates\n * @param scene\n */\n constructor(scene) {\n this.scene = scene;\n this.queryManager = new _QueryManager__WEBPACK_IMPORTED_MODULE_0__.QueryManager(this);\n this.entityManager = new _EntityManager__WEBPACK_IMPORTED_MODULE_1__.EntityManager(this);\n this.systemManager = new _SystemManager__WEBPACK_IMPORTED_MODULE_2__.SystemManager(this);\n }\n /**\n * Query the ECS world for entities that match your components\n * @param requiredTypes\n */\n query(requiredTypes) {\n return this.queryManager.createQuery(requiredTypes);\n }\n queryTags(requiredTags) {\n return this.queryManager.createTagQuery(requiredTags);\n }\n /**\n * Update systems by type and time elapsed in milliseconds\n */\n update(type, elapsed) {\n if (type === _System__WEBPACK_IMPORTED_MODULE_3__.SystemType.Update) {\n this.entityManager.updateEntities(this.scene, elapsed);\n }\n this.systemManager.updateSystems(type, this.scene, elapsed);\n this.entityManager.findEntitiesForRemoval();\n this.entityManager.processComponentRemovals();\n this.entityManager.processEntityRemovals();\n }\n add(entityOrSystem) {\n if (entityOrSystem instanceof _Entity__WEBPACK_IMPORTED_MODULE_4__.Entity) {\n this.entityManager.addEntity(entityOrSystem);\n }\n if (entityOrSystem instanceof _System__WEBPACK_IMPORTED_MODULE_3__.System || (0,_SystemManager__WEBPACK_IMPORTED_MODULE_2__.isSystemConstructor)(entityOrSystem)) {\n this.systemManager.addSystem(entityOrSystem);\n }\n }\n /**\n * Get a system out of the ECS world\n */\n get(system) {\n return this.systemManager.get(system);\n }\n remove(entityOrSystem, deferred = true) {\n if (entityOrSystem instanceof _Entity__WEBPACK_IMPORTED_MODULE_4__.Entity) {\n this.entityManager.removeEntity(entityOrSystem, deferred);\n }\n if (entityOrSystem instanceof _System__WEBPACK_IMPORTED_MODULE_3__.System) {\n this.systemManager.removeSystem(entityOrSystem);\n }\n }\n get entities() {\n return this.entityManager.entities;\n }\n clearEntities() {\n this.entityManager.clear();\n }\n clearSystems() {\n this.systemManager.clear();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/index.ts\":\n/*!****************************************!*\\\n !*** ./EntityComponentSystem/index.ts ***!\n \\****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AddedComponent: () => (/* reexport safe */ _Entity__WEBPACK_IMPORTED_MODULE_1__.AddedComponent),\n/* harmony export */ Component: () => (/* reexport safe */ _Component__WEBPACK_IMPORTED_MODULE_0__.Component),\n/* harmony export */ Entity: () => (/* reexport safe */ _Entity__WEBPACK_IMPORTED_MODULE_1__.Entity),\n/* harmony export */ EntityEvents: () => (/* reexport safe */ _Entity__WEBPACK_IMPORTED_MODULE_1__.EntityEvents),\n/* harmony export */ EntityManager: () => (/* reexport safe */ _EntityManager__WEBPACK_IMPORTED_MODULE_2__.EntityManager),\n/* harmony export */ MotionComponent: () => (/* reexport safe */ _Components_MotionComponent__WEBPACK_IMPORTED_MODULE_11__.MotionComponent),\n/* harmony export */ Query: () => (/* reexport safe */ _Query__WEBPACK_IMPORTED_MODULE_3__.Query),\n/* harmony export */ QueryManager: () => (/* reexport safe */ _QueryManager__WEBPACK_IMPORTED_MODULE_5__.QueryManager),\n/* harmony export */ RemovedComponent: () => (/* reexport safe */ _Entity__WEBPACK_IMPORTED_MODULE_1__.RemovedComponent),\n/* harmony export */ System: () => (/* reexport safe */ _System__WEBPACK_IMPORTED_MODULE_6__.System),\n/* harmony export */ SystemManager: () => (/* reexport safe */ _SystemManager__WEBPACK_IMPORTED_MODULE_7__.SystemManager),\n/* harmony export */ SystemPriority: () => (/* reexport safe */ _Priority__WEBPACK_IMPORTED_MODULE_9__.SystemPriority),\n/* harmony export */ SystemType: () => (/* reexport safe */ _System__WEBPACK_IMPORTED_MODULE_6__.SystemType),\n/* harmony export */ TagQuery: () => (/* reexport safe */ _TagQuery__WEBPACK_IMPORTED_MODULE_4__.TagQuery),\n/* harmony export */ TransformComponent: () => (/* reexport safe */ _Components_TransformComponent__WEBPACK_IMPORTED_MODULE_10__.TransformComponent),\n/* harmony export */ World: () => (/* reexport safe */ _World__WEBPACK_IMPORTED_MODULE_8__.World),\n/* harmony export */ isAddedComponent: () => (/* reexport safe */ _Entity__WEBPACK_IMPORTED_MODULE_1__.isAddedComponent),\n/* harmony export */ isComponentCtor: () => (/* reexport safe */ _Component__WEBPACK_IMPORTED_MODULE_0__.isComponentCtor),\n/* harmony export */ isRemovedComponent: () => (/* reexport safe */ _Entity__WEBPACK_IMPORTED_MODULE_1__.isRemovedComponent),\n/* harmony export */ isSystemConstructor: () => (/* reexport safe */ _SystemManager__WEBPACK_IMPORTED_MODULE_7__.isSystemConstructor)\n/* harmony export */ });\n/* harmony import */ var _Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Component */ \"./EntityComponentSystem/Component.ts\");\n/* harmony import */ var _Entity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _EntityManager__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./EntityManager */ \"./EntityComponentSystem/EntityManager.ts\");\n/* harmony import */ var _Query__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Query */ \"./EntityComponentSystem/Query.ts\");\n/* harmony import */ var _TagQuery__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./TagQuery */ \"./EntityComponentSystem/TagQuery.ts\");\n/* harmony import */ var _QueryManager__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./QueryManager */ \"./EntityComponentSystem/QueryManager.ts\");\n/* harmony import */ var _System__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _SystemManager__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./SystemManager */ \"./EntityComponentSystem/SystemManager.ts\");\n/* harmony import */ var _World__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./World */ \"./EntityComponentSystem/World.ts\");\n/* harmony import */ var _Priority__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Priority */ \"./EntityComponentSystem/Priority.ts\");\n/* harmony import */ var _Components_TransformComponent__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Components_MotionComponent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./EventEmitter.ts\":\n/*!*************************!*\\\n !*** ./EventEmitter.ts ***!\n \\*************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EventEmitter: () => (/* binding */ EventEmitter)\n/* harmony export */ });\n/**\n * Excalibur's typed event emitter, this allows events to be sent with any string to Type mapping\n */\nclass EventEmitter {\n constructor() {\n this._paused = false;\n this._empty = true;\n this._listeners = {};\n this._listenersOnce = {};\n this._pipes = [];\n }\n /**\n * Removes all listeners and pipes\n */\n clear() {\n this._listeners = {};\n this._listenersOnce = {};\n this._pipes.length = 0;\n this._empty = true;\n }\n on(eventName, handler) {\n var _a;\n this._empty = false;\n this._listeners[eventName] = (_a = this._listeners[eventName]) !== null && _a !== void 0 ? _a : [];\n this._listeners[eventName].push(handler);\n return {\n close: () => this.off(eventName, handler)\n };\n }\n once(eventName, handler) {\n var _a;\n this._empty = false;\n this._listenersOnce[eventName] = (_a = this._listenersOnce[eventName]) !== null && _a !== void 0 ? _a : [];\n this._listenersOnce[eventName].push(handler);\n return {\n close: () => this.off(eventName, handler)\n };\n }\n off(eventName, handler) {\n var _a, _b;\n if (handler) {\n const newListeners = (_a = this._listeners[eventName]) === null || _a === void 0 ? void 0 : _a.filter((h) => h !== handler);\n this._listeners[eventName] = newListeners;\n const newOnceListeners = (_b = this._listenersOnce[eventName]) === null || _b === void 0 ? void 0 : _b.filter((h) => h !== handler);\n this._listenersOnce[eventName] = newOnceListeners;\n }\n else {\n delete this._listeners[eventName];\n }\n }\n emit(eventName, event) {\n if (this._empty) {\n return;\n }\n if (this._paused) {\n return;\n }\n const listeners = this._listeners[eventName];\n if (listeners) {\n for (let i = 0; i < listeners.length; i++) {\n listeners[i](event);\n }\n }\n const onces = this._listenersOnce[eventName];\n this._listenersOnce[eventName] = [];\n if (onces) {\n for (let i = 0; i < onces.length; i++) {\n onces[i](event);\n }\n }\n for (let i = 0; i < this._pipes.length; i++) {\n this._pipes[i].emit(eventName, event);\n }\n }\n /**\n * Replay events from this emitter to another\n * @param emitter\n */\n pipe(emitter) {\n if (this === emitter) {\n throw Error('Cannot pipe to self');\n }\n this._empty = false;\n this._pipes.push(emitter);\n return {\n close: () => {\n const i = this._pipes.indexOf(emitter);\n if (i > -1) {\n this._pipes.splice(i, 1);\n }\n }\n };\n }\n /**\n * Remove any piped emitters\n * @param emitter\n */\n unpipe(emitter) {\n const i = this._pipes.indexOf(emitter);\n if (i > -1) {\n this._pipes.splice(i, 1);\n }\n }\n /**\n * Paused event emitters do not emit events\n */\n pause() {\n this._paused = true;\n }\n /**\n * Unpaused event emitter do emit events\n */\n unpause() {\n this._paused = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Events.ts\":\n/*!*******************!*\\\n !*** ./Events.ts ***!\n \\*******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ActionCompleteEvent: () => (/* binding */ ActionCompleteEvent),\n/* harmony export */ ActionStartEvent: () => (/* binding */ ActionStartEvent),\n/* harmony export */ ActivateEvent: () => (/* binding */ ActivateEvent),\n/* harmony export */ AddEvent: () => (/* binding */ AddEvent),\n/* harmony export */ CollisionEndEvent: () => (/* binding */ CollisionEndEvent),\n/* harmony export */ CollisionPostSolveEvent: () => (/* binding */ CollisionPostSolveEvent),\n/* harmony export */ CollisionPreSolveEvent: () => (/* binding */ CollisionPreSolveEvent),\n/* harmony export */ CollisionStartEvent: () => (/* binding */ CollisionStartEvent),\n/* harmony export */ ContactEndEvent: () => (/* binding */ ContactEndEvent),\n/* harmony export */ ContactStartEvent: () => (/* binding */ ContactStartEvent),\n/* harmony export */ DeactivateEvent: () => (/* binding */ DeactivateEvent),\n/* harmony export */ EnterTriggerEvent: () => (/* binding */ EnterTriggerEvent),\n/* harmony export */ EnterViewPortEvent: () => (/* binding */ EnterViewPortEvent),\n/* harmony export */ EventTypes: () => (/* binding */ EventTypes),\n/* harmony export */ ExitTriggerEvent: () => (/* binding */ ExitTriggerEvent),\n/* harmony export */ ExitViewPortEvent: () => (/* binding */ ExitViewPortEvent),\n/* harmony export */ GameEvent: () => (/* binding */ GameEvent),\n/* harmony export */ GameStartEvent: () => (/* binding */ GameStartEvent),\n/* harmony export */ GameStopEvent: () => (/* binding */ GameStopEvent),\n/* harmony export */ GamepadAxisEvent: () => (/* binding */ GamepadAxisEvent),\n/* harmony export */ GamepadButtonEvent: () => (/* binding */ GamepadButtonEvent),\n/* harmony export */ GamepadConnectEvent: () => (/* binding */ GamepadConnectEvent),\n/* harmony export */ GamepadDisconnectEvent: () => (/* binding */ GamepadDisconnectEvent),\n/* harmony export */ HiddenEvent: () => (/* binding */ HiddenEvent),\n/* harmony export */ InitializeEvent: () => (/* binding */ InitializeEvent),\n/* harmony export */ KillEvent: () => (/* binding */ KillEvent),\n/* harmony export */ PostCollisionEvent: () => (/* binding */ PostCollisionEvent),\n/* harmony export */ PostDebugDrawEvent: () => (/* binding */ PostDebugDrawEvent),\n/* harmony export */ PostDrawEvent: () => (/* binding */ PostDrawEvent),\n/* harmony export */ PostFrameEvent: () => (/* binding */ PostFrameEvent),\n/* harmony export */ PostKillEvent: () => (/* binding */ PostKillEvent),\n/* harmony export */ PostTransformDrawEvent: () => (/* binding */ PostTransformDrawEvent),\n/* harmony export */ PostUpdateEvent: () => (/* binding */ PostUpdateEvent),\n/* harmony export */ PreCollisionEvent: () => (/* binding */ PreCollisionEvent),\n/* harmony export */ PreDebugDrawEvent: () => (/* binding */ PreDebugDrawEvent),\n/* harmony export */ PreDrawEvent: () => (/* binding */ PreDrawEvent),\n/* harmony export */ PreFrameEvent: () => (/* binding */ PreFrameEvent),\n/* harmony export */ PreKillEvent: () => (/* binding */ PreKillEvent),\n/* harmony export */ PreTransformDrawEvent: () => (/* binding */ PreTransformDrawEvent),\n/* harmony export */ PreUpdateEvent: () => (/* binding */ PreUpdateEvent),\n/* harmony export */ RemoveEvent: () => (/* binding */ RemoveEvent),\n/* harmony export */ VisibleEvent: () => (/* binding */ VisibleEvent)\n/* harmony export */ });\nvar EventTypes;\n(function (EventTypes) {\n EventTypes[\"Kill\"] = \"kill\";\n EventTypes[\"PreKill\"] = \"prekill\";\n EventTypes[\"PostKill\"] = \"postkill\";\n EventTypes[\"PreDraw\"] = \"predraw\";\n EventTypes[\"PostDraw\"] = \"postdraw\";\n EventTypes[\"PreDebugDraw\"] = \"predebugdraw\";\n EventTypes[\"PostDebugDraw\"] = \"postdebugdraw\";\n EventTypes[\"PreUpdate\"] = \"preupdate\";\n EventTypes[\"PostUpdate\"] = \"postupdate\";\n EventTypes[\"PreFrame\"] = \"preframe\";\n EventTypes[\"PostFrame\"] = \"postframe\";\n EventTypes[\"PreCollision\"] = \"precollision\";\n EventTypes[\"CollisionStart\"] = \"collisionstart\";\n EventTypes[\"CollisionEnd\"] = \"collisionend\";\n EventTypes[\"PostCollision\"] = \"postcollision\";\n EventTypes[\"Initialize\"] = \"initialize\";\n EventTypes[\"Activate\"] = \"activate\";\n EventTypes[\"Deactivate\"] = \"deactivate\";\n EventTypes[\"ExitViewport\"] = \"exitviewport\";\n EventTypes[\"EnterViewport\"] = \"enterviewport\";\n EventTypes[\"ExitTrigger\"] = \"exit\";\n EventTypes[\"EnterTrigger\"] = \"enter\";\n EventTypes[\"Connect\"] = \"connect\";\n EventTypes[\"Disconnect\"] = \"disconnect\";\n EventTypes[\"Button\"] = \"button\";\n EventTypes[\"Axis\"] = \"axis\";\n EventTypes[\"Visible\"] = \"visible\";\n EventTypes[\"Hidden\"] = \"hidden\";\n EventTypes[\"Start\"] = \"start\";\n EventTypes[\"Stop\"] = \"stop\";\n EventTypes[\"PointerUp\"] = \"pointerup\";\n EventTypes[\"PointerDown\"] = \"pointerdown\";\n EventTypes[\"PointerMove\"] = \"pointermove\";\n EventTypes[\"PointerEnter\"] = \"pointerenter\";\n EventTypes[\"PointerLeave\"] = \"pointerleave\";\n EventTypes[\"PointerCancel\"] = \"pointercancel\";\n EventTypes[\"PointerWheel\"] = \"pointerwheel\";\n EventTypes[\"Up\"] = \"up\";\n EventTypes[\"Down\"] = \"down\";\n EventTypes[\"Move\"] = \"move\";\n EventTypes[\"Enter\"] = \"enter\";\n EventTypes[\"Leave\"] = \"leave\";\n EventTypes[\"Cancel\"] = \"cancel\";\n EventTypes[\"Wheel\"] = \"wheel\";\n EventTypes[\"Press\"] = \"press\";\n EventTypes[\"Release\"] = \"release\";\n EventTypes[\"Hold\"] = \"hold\";\n EventTypes[\"PointerDragStart\"] = \"pointerdragstart\";\n EventTypes[\"PointerDragEnd\"] = \"pointerdragend\";\n EventTypes[\"PointerDragEnter\"] = \"pointerdragenter\";\n EventTypes[\"PointerDragLeave\"] = \"pointerdragleave\";\n EventTypes[\"PointerDragMove\"] = \"pointerdragmove\";\n EventTypes[\"ActionStart\"] = \"actionstart\";\n EventTypes[\"ActionComplete\"] = \"actioncomplete\";\n EventTypes[\"Add\"] = \"add\";\n EventTypes[\"Remove\"] = \"remove\";\n})(EventTypes || (EventTypes = {}));\n/**\n * Base event type in Excalibur that all other event types derive from. Not all event types are thrown on all Excalibur game objects,\n * some events are unique to a type, others are not.\n *\n */\nclass GameEvent {\n constructor() {\n /**\n * Other target object for this event\n */\n this.other = null;\n this._bubbles = true;\n }\n /**\n * If set to false, prevents event from propagating to other actors. If true it will be propagated\n * to all actors that apply.\n */\n get bubbles() {\n return this._bubbles;\n }\n set bubbles(value) {\n this._bubbles = value;\n }\n /**\n * Prevents event from bubbling\n */\n stopPropagation() {\n this.bubbles = false;\n }\n}\n/**\n * The 'kill' event is emitted on actors when it is killed. The target is the actor that was killed.\n */\nclass KillEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'prekill' event is emitted directly before an actor is killed.\n */\nclass PreKillEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'postkill' event is emitted directly after the actor is killed.\n */\nclass PostKillEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'start' event is emitted on engine when has started and is ready for interaction.\n */\nclass GameStartEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'stop' event is emitted on engine when has been stopped and will no longer take input, update or draw.\n */\nclass GameStopEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'predraw' event is emitted on actors, scenes, and engine before drawing starts. Actors' predraw happens inside their graphics\n * transform so that all drawing takes place with the actor as the origin.\n *\n */\nclass PreDrawEvent extends GameEvent {\n constructor(ctx, elapsed, self) {\n super();\n this.ctx = ctx;\n this.elapsed = elapsed;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'postdraw' event is emitted on actors, scenes, and engine after drawing finishes. Actors' postdraw happens inside their graphics\n * transform so that all drawing takes place with the actor as the origin.\n *\n */\nclass PostDrawEvent extends GameEvent {\n constructor(ctx, elapsed, self) {\n super();\n this.ctx = ctx;\n this.elapsed = elapsed;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'pretransformdraw' event is emitted on actors/entities before any graphics transforms have taken place.\n * Useful if you need to completely customize the draw or modify the transform before drawing in the draw step (for example needing\n * latest camera positions)\n *\n */\nclass PreTransformDrawEvent extends GameEvent {\n constructor(ctx, elapsed, self) {\n super();\n this.ctx = ctx;\n this.elapsed = elapsed;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'posttransformdraw' event is emitted on actors/entities after all graphics have been draw and transforms reset.\n * Useful if you need to completely custom the draw after everything is done.\n *\n */\nclass PostTransformDrawEvent extends GameEvent {\n constructor(ctx, elapsed, self) {\n super();\n this.ctx = ctx;\n this.elapsed = elapsed;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'predebugdraw' event is emitted on actors, scenes, and engine before debug drawing starts.\n */\nclass PreDebugDrawEvent extends GameEvent {\n constructor(ctx, self) {\n super();\n this.ctx = ctx;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'postdebugdraw' event is emitted on actors, scenes, and engine after debug drawing starts.\n */\nclass PostDebugDrawEvent extends GameEvent {\n constructor(ctx, self) {\n super();\n this.ctx = ctx;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'preupdate' event is emitted on actors, scenes, camera, and engine before the update starts.\n */\nclass PreUpdateEvent extends GameEvent {\n constructor(engine, elapsed, self) {\n super();\n this.engine = engine;\n this.elapsed = elapsed;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'postupdate' event is emitted on actors, scenes, camera, and engine after the update ends.\n */\nclass PostUpdateEvent extends GameEvent {\n constructor(engine, elapsed, self) {\n super();\n this.engine = engine;\n this.elapsed = elapsed;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'preframe' event is emitted on the engine, before the frame begins.\n */\nclass PreFrameEvent extends GameEvent {\n constructor(engine, prevStats) {\n super();\n this.engine = engine;\n this.prevStats = prevStats;\n this.target = engine;\n }\n}\n/**\n * The 'postframe' event is emitted on the engine, after a frame ends.\n */\nclass PostFrameEvent extends GameEvent {\n constructor(engine, stats) {\n super();\n this.engine = engine;\n this.stats = stats;\n this.target = engine;\n }\n}\n/**\n * Event received when a gamepad is connected to Excalibur. {@apilink Gamepads} receives this event.\n */\nclass GamepadConnectEvent extends GameEvent {\n constructor(index, gamepad) {\n super();\n this.index = index;\n this.gamepad = gamepad;\n this.target = gamepad;\n }\n}\n/**\n * Event received when a gamepad is disconnected from Excalibur. {@apilink Gamepads} receives this event.\n */\nclass GamepadDisconnectEvent extends GameEvent {\n constructor(index, gamepad) {\n super();\n this.index = index;\n this.gamepad = gamepad;\n this.target = gamepad;\n }\n}\n/**\n * Gamepad button event. See {@apilink Gamepads} for information on responding to controller input. {@apilink Gamepad} instances receive this event;\n */\nclass GamepadButtonEvent extends GameEvent {\n /**\n * @param button The Gamepad button\n * @param value A numeric value between 0 and 1\n */\n constructor(button, value, self) {\n super();\n this.button = button;\n this.value = value;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Gamepad axis event. See {@apilink Gamepads} for information on responding to controller input. {@apilink Gamepad} instances receive this event;\n */\nclass GamepadAxisEvent extends GameEvent {\n /**\n * @param axis The Gamepad axis\n * @param value A numeric value between -1 and 1\n */\n constructor(axis, value, self) {\n super();\n this.axis = axis;\n this.value = value;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event received by the {@apilink Engine} when the browser window is visible on a screen.\n */\nclass VisibleEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event received by the {@apilink Engine} when the browser window is hidden from all screens.\n */\nclass HiddenEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event thrown on an {@apilink Actor | `actor`} when a collision will occur this frame if it resolves\n */\nclass PreCollisionEvent extends GameEvent {\n /**\n * @param self The actor the event was thrown on\n * @param other The actor that will collided with the current actor\n * @param side The side that will be collided with the current actor\n * @param intersection Intersection vector\n */\n constructor(self, other, side, intersection, contact) {\n super();\n this.self = self;\n this.other = other;\n this.side = side;\n this.intersection = intersection;\n this.contact = contact;\n this.target = self;\n }\n}\n/**\n * Event thrown on an {@apilink Actor | `actor`} when a collision has been resolved (body reacted) this frame\n */\nclass PostCollisionEvent extends GameEvent {\n /**\n * @param self The actor the event was thrown on\n * @param other The actor that did collide with the current actor\n * @param side The side that did collide with the current actor\n * @param intersection Intersection vector\n */\n constructor(self, other, side, intersection, contact) {\n super();\n this.self = self;\n this.other = other;\n this.side = side;\n this.intersection = intersection;\n this.contact = contact;\n this.target = self;\n }\n}\nclass ContactStartEvent {\n constructor(self, other, side, contact) {\n this.self = self;\n this.other = other;\n this.side = side;\n this.contact = contact;\n }\n}\nclass ContactEndEvent {\n constructor(self, other, side, lastContact) {\n this.self = self;\n this.other = other;\n this.side = side;\n this.lastContact = lastContact;\n }\n}\nclass CollisionPreSolveEvent {\n constructor(self, other, side, intersection, contact) {\n this.self = self;\n this.other = other;\n this.side = side;\n this.intersection = intersection;\n this.contact = contact;\n }\n}\nclass CollisionPostSolveEvent {\n constructor(self, other, side, intersection, contact) {\n this.self = self;\n this.other = other;\n this.side = side;\n this.intersection = intersection;\n this.contact = contact;\n }\n}\n/**\n * Event thrown the first time an {@apilink Actor | `actor`} collides with another, after an actor is in contact normal collision events are fired.\n */\nclass CollisionStartEvent extends GameEvent {\n /**\n *\n * @param self\n * @param other\n * @param side\n * @param contact\n */\n constructor(self, other, side, contact) {\n super();\n this.self = self;\n this.other = other;\n this.side = side;\n this.contact = contact;\n this.target = self;\n }\n}\n/**\n * Event thrown when the {@apilink Actor | `actor`} is no longer colliding with another\n */\nclass CollisionEndEvent extends GameEvent {\n /**\n *\n */\n constructor(self, other, side, lastContact) {\n super();\n this.self = self;\n this.other = other;\n this.side = side;\n this.lastContact = lastContact;\n this.target = self;\n }\n}\n/**\n * Event thrown on an {@apilink Actor}, {@apilink Scene}, and {@apilink Engine} only once before the first update call\n */\nclass InitializeEvent extends GameEvent {\n /**\n * @param engine The reference to the current engine\n */\n constructor(engine, self) {\n super();\n this.engine = engine;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event thrown on a {@apilink Scene} on activation\n */\nclass ActivateEvent extends GameEvent {\n /**\n * @param context The context for the scene activation\n */\n constructor(context, self) {\n super();\n this.context = context;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event thrown on a {@apilink Scene} on deactivation\n */\nclass DeactivateEvent extends GameEvent {\n /**\n * @param context The context for the scene deactivation\n */\n constructor(context, self) {\n super();\n this.context = context;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event thrown on an {@apilink Actor} when the graphics bounds completely leaves the screen.\n */\nclass ExitViewPortEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event thrown on an {@apilink Actor} when any part of the graphics bounds are on screen.\n */\nclass EnterViewPortEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\nclass EnterTriggerEvent extends GameEvent {\n constructor(self, entity) {\n super();\n this.self = self;\n this.entity = entity;\n this.target = self;\n }\n}\nclass ExitTriggerEvent extends GameEvent {\n constructor(self, entity) {\n super();\n this.self = self;\n this.entity = entity;\n this.target = self;\n }\n}\n/**\n * Event thrown on an {@apilink Actor} when an action starts.\n */\nclass ActionStartEvent extends GameEvent {\n constructor(action, self) {\n super();\n this.action = action;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event thrown on an {@apilink Actor} when an action completes.\n */\nclass ActionCompleteEvent extends GameEvent {\n constructor(action, self) {\n super();\n this.action = action;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event thrown on an [[Actor]] when an Actor added to scene.\n */\nclass AddEvent extends GameEvent {\n constructor(engine, self) {\n super();\n this.engine = engine;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event thrown on an [[Actor]] when an Actor removed from scene.\n */\nclass RemoveEvent extends GameEvent {\n constructor(engine, self) {\n super();\n this.engine = engine;\n this.self = self;\n this.target = self;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Events/MediaEvents.ts\":\n/*!*******************************!*\\\n !*** ./Events/MediaEvents.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MediaEvent: () => (/* binding */ MediaEvent),\n/* harmony export */ NativeSoundEvent: () => (/* binding */ NativeSoundEvent),\n/* harmony export */ NativeSoundProcessedEvent: () => (/* binding */ NativeSoundProcessedEvent)\n/* harmony export */ });\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n\nclass MediaEvent extends _Events__WEBPACK_IMPORTED_MODULE_0__.GameEvent {\n /**\n * Media event cannot bubble\n */\n set bubbles(_value) {\n // stubbed\n }\n /**\n * Media event cannot bubble\n */\n get bubbles() {\n return false;\n }\n /**\n * Media event cannot bubble, so they have no path\n */\n get _path() {\n return null;\n }\n /**\n * Media event cannot bubble, so they have no path\n */\n set _path(_val) {\n // stubbed\n }\n constructor(target, _name = 'MediaEvent') {\n super();\n this.target = target;\n this._name = _name;\n }\n /**\n * Prevents event from bubbling\n */\n stopPropagation() {\n /**\n * Stub\n */\n }\n /**\n * Action, that calls when event happens\n */\n action() {\n /**\n * Stub\n */\n }\n /**\n * Propagate event further through event path\n */\n propagate() {\n /**\n * Stub\n */\n }\n layPath(_actor) {\n /**\n * Stub\n */\n }\n}\nclass NativeSoundEvent extends MediaEvent {\n constructor(target, track) {\n super(target, 'NativeSoundEvent');\n this.track = track;\n }\n}\nclass NativeSoundProcessedEvent extends MediaEvent {\n constructor(target, _processedData) {\n super(target, 'NativeSoundProcessedEvent');\n this._processedData = _processedData;\n this.data = this._processedData;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Flags.ts\":\n/*!******************!*\\\n !*** ./Flags.ts ***!\n \\******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Flags: () => (/* binding */ Flags)\n/* harmony export */ });\n/**\n * Flags is a feature flag implementation for Excalibur. They can only be operated **before {@apilink Engine} construction**\n * after which they are frozen and are read-only.\n *\n * Flags are used to enable experimental or preview features in Excalibur.\n */\nclass Flags {\n /**\n * Force excalibur to load the Canvas 2D graphics context fallback\n * @warning not all features of excalibur are supported in the Canvas 2D fallback\n */\n static useCanvasGraphicsContext() {\n Flags.enable('use-canvas-context');\n }\n /**\n * Force excalibur to use the less optimized image renderer\n */\n static useLegacyImageRenderer() {\n Flags.enable('use-legacy-image-renderer');\n }\n /**\n * Freeze all flag modifications making them readonly\n */\n static freeze() {\n Flags._FROZEN = true;\n }\n /**\n * Resets internal flag state, not meant to be called by users. Only used for testing.\n *\n * Calling this in your game is UNSUPPORTED\n * @internal\n */\n static _reset() {\n Flags._FROZEN = false;\n Flags._FLAGS = {};\n }\n /**\n * Enable a specific feature flag by name. **Note: can only be set before {@apilink Engine} constructor time**\n * @param flagName\n */\n static enable(flagName) {\n if (this._FROZEN) {\n throw Error('Feature flags can only be enabled before Engine constructor time');\n }\n Flags._FLAGS[flagName] = true;\n }\n /**\n * Disable a specific feature flag by name. **Note: can only be set before {@apilink Engine} constructor time**\n * @param flagName\n */\n static disable(flagName) {\n if (this._FROZEN) {\n throw Error('Feature flags can only be disabled before Engine constructor time');\n }\n Flags._FLAGS[flagName] = false;\n }\n /**\n * Check if a flag is enabled. If the flag is disabled or does not exist `false` is returned\n * @param flagName\n */\n static isEnabled(flagName) {\n return !!Flags._FLAGS[flagName];\n }\n /**\n * Show a list of currently known flags\n */\n static show() {\n return Object.keys(Flags._FLAGS);\n }\n}\nFlags._FROZEN = false;\nFlags._FLAGS = {};\n\n\n/***/ }),\n\n/***/ \"./GarbageCollector.ts\":\n/*!*****************************!*\\\n !*** ./GarbageCollector.ts ***!\n \\*****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DefaultGarbageCollectionOptions: () => (/* binding */ DefaultGarbageCollectionOptions),\n/* harmony export */ GarbageCollector: () => (/* binding */ GarbageCollector)\n/* harmony export */ });\nconst DefaultGarbageCollectionOptions = {\n textureCollectInterval: 60000\n // TODO future work to integrate the font and text configuration, refactor existing collection mechanism\n // fontCollectInterval: 60_000,\n // textMeasurementCollectInterval: 60_000,\n};\nclass GarbageCollector {\n constructor(options) {\n this.options = options;\n this._running = false;\n this._collectionMap = new Map();\n this._collectors = new Map();\n /**\n * Runs the collection loop to cleanup any stale resources given the registered collect handlers\n */\n this.collectStaleResources = (deadline) => {\n if (!this._running) {\n return;\n }\n for (const [type, [collector, timeoutInterval]] of this._collectors.entries()) {\n const now = this.options.getTimestamp();\n for (const [resource, [resourceType, time]] of this._collectionMap.entries()) {\n if (type !== resourceType || time + timeoutInterval >= now) {\n continue;\n }\n const collected = collector(resource);\n if (collected) {\n this._collectionMap.delete(resource);\n }\n }\n }\n this._collectHandle = requestIdleCallback(this.collectStaleResources);\n };\n }\n /**\n *\n * @param type Resource type\n * @param timeoutInterval If resource type exceeds interval in milliseconds collect() is called\n * @param collect Collection implementation, returns true if collected\n */\n registerCollector(type, timeoutInterval, collect) {\n this._collectors.set(type, [collect, timeoutInterval]);\n }\n /**\n * Add a resource to be tracked for collection\n * @param type\n * @param resource\n */\n addCollectableResource(type, resource) {\n this._collectionMap.set(resource, [type, this.options.getTimestamp()]);\n }\n /**\n * Update the resource last used timestamp preventing collection\n * @param resource\n */\n touch(resource) {\n const collectionData = this._collectionMap.get(resource);\n if (collectionData) {\n this._collectionMap.set(resource, [collectionData[0], this.options.getTimestamp()]);\n }\n }\n /**\n * Force collect all resources, useful for shutting down a game\n * or if you know that you will not use anything you've allocated before now\n */\n forceCollectAll() {\n for (const [_, [collector]] of this._collectors.entries()) {\n for (const [resource] of this._collectionMap.entries()) {\n const collected = collector(resource);\n if (collected) {\n this._collectionMap.delete(resource);\n }\n }\n }\n }\n /**\n * Starts the garbage collection loop\n */\n start() {\n this._running = true;\n this.collectStaleResources();\n }\n /**\n * Stops the garbage collection loop\n */\n stop() {\n this._running = false;\n cancelIdleCallback(this._collectHandle);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Animation.ts\":\n/*!*******************************!*\\\n !*** ./Graphics/Animation.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Animation: () => (/* binding */ Animation),\n/* harmony export */ AnimationDirection: () => (/* binding */ AnimationDirection),\n/* harmony export */ AnimationEvents: () => (/* binding */ AnimationEvents),\n/* harmony export */ AnimationStrategy: () => (/* binding */ AnimationStrategy)\n/* harmony export */ });\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n\nvar AnimationDirection;\n(function (AnimationDirection) {\n /**\n * Animation is playing forwards\n */\n AnimationDirection[\"Forward\"] = \"forward\";\n /**\n * Animation is playing backwards\n */\n AnimationDirection[\"Backward\"] = \"backward\";\n})(AnimationDirection || (AnimationDirection = {}));\nvar AnimationStrategy;\n(function (AnimationStrategy) {\n /**\n * Animation ends without displaying anything\n */\n AnimationStrategy[\"End\"] = \"end\";\n /**\n * Animation loops to the first frame after the last frame\n */\n AnimationStrategy[\"Loop\"] = \"loop\";\n /**\n * Animation plays to the last frame, then backwards to the first frame, then repeats\n */\n AnimationStrategy[\"PingPong\"] = \"pingpong\";\n /**\n * Animation ends stopping on the last frame\n */\n AnimationStrategy[\"Freeze\"] = \"freeze\";\n})(AnimationStrategy || (AnimationStrategy = {}));\nconst AnimationEvents = {\n Frame: 'frame',\n Loop: 'loop',\n End: 'end'\n};\n/**\n * Create an Animation given a list of {@apilink Frame | `frames`} in {@apilink AnimationOptions}\n *\n * To create an Animation from a {@apilink SpriteSheet}, use {@apilink Animation.fromSpriteSheet}\n */\nclass Animation extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n constructor(options) {\n var _a, _b, _c;\n super(options);\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_1__.EventEmitter();\n this.frames = [];\n this.strategy = AnimationStrategy.Loop;\n this.frameDuration = 100;\n this._idempotencyToken = -1;\n this._firstTick = true;\n this._currentFrame = 0;\n this._timeLeftInFrame = 0;\n this._pingPongDirection = 1;\n this._done = false;\n this._playing = true;\n this._speed = 1;\n this._reversed = false;\n this.frames = options.frames;\n this.speed = (_a = options.speed) !== null && _a !== void 0 ? _a : this.speed;\n this.strategy = (_b = options.strategy) !== null && _b !== void 0 ? _b : this.strategy;\n this.frameDuration = options.totalDuration ? options.totalDuration / this.frames.length : (_c = options.frameDuration) !== null && _c !== void 0 ? _c : this.frameDuration;\n if (options.reverse) {\n this.reverse();\n }\n this.goToFrame(0);\n }\n clone() {\n return new Animation({\n frames: this.frames.map((f) => ({ ...f })),\n frameDuration: this.frameDuration,\n speed: this.speed,\n reverse: this._reversed,\n strategy: this.strategy,\n ...this.cloneGraphicOptions()\n });\n }\n get width() {\n const maybeFrame = this.currentFrame;\n if (maybeFrame && maybeFrame.graphic) {\n return Math.abs(maybeFrame.graphic.width * this.scale.x);\n }\n return 0;\n }\n get height() {\n const maybeFrame = this.currentFrame;\n if (maybeFrame && maybeFrame.graphic) {\n return Math.abs(maybeFrame.graphic.height * this.scale.y);\n }\n return 0;\n }\n /**\n * Create an Animation from a {@apilink SpriteSheet}, a list of indices into the sprite sheet, a duration per frame\n * and optional {@apilink AnimationStrategy}\n *\n * Example:\n * ```typescript\n * const spriteSheet = SpriteSheet.fromImageSource({...});\n *\n * const anim = Animation.fromSpriteSheet(spriteSheet, range(0, 5), 200, AnimationStrategy.Loop);\n * ```\n * @param spriteSheet ex.SpriteSheet\n * @param spriteSheetIndex 0 based index from left to right, top down (row major order) of the ex.SpriteSheet\n * @param durationPerFrame duration per frame in milliseconds\n * @param strategy Optional strategy, default AnimationStrategy.Loop\n */\n static fromSpriteSheet(spriteSheet, spriteSheetIndex, durationPerFrame, strategy = AnimationStrategy.Loop) {\n const maxIndex = spriteSheet.sprites.length - 1;\n const invalidIndices = spriteSheetIndex.filter((index) => index < 0 || index > maxIndex);\n if (invalidIndices.length) {\n Animation._LOGGER.warn(`Indices into SpriteSheet were provided that don\\'t exist: ${invalidIndices.join(',')} no frame will be shown`);\n }\n return new Animation({\n frames: spriteSheet.sprites\n .filter((_, index) => spriteSheetIndex.indexOf(index) > -1)\n .map((f) => ({\n graphic: f,\n duration: durationPerFrame\n })),\n strategy: strategy\n });\n }\n /**\n * Create an {@apilink Animation} from a {@apilink SpriteSheet} given a list of coordinates\n *\n * Example:\n * ```typescript\n * const spriteSheet = SpriteSheet.fromImageSource({...});\n *\n * const anim = Animation.fromSpriteSheetCoordinates({\n * spriteSheet,\n * frameCoordinates: [\n * {x: 0, y: 5, duration: 100, options { flipHorizontal: true }},\n * {x: 1, y: 5, duration: 200},\n * {x: 2, y: 5},\n * {x: 3, y: 5}\n * ],\n * strategy: AnimationStrategy.PingPong\n * });\n * ```\n * @param options\n * @returns Animation\n */\n static fromSpriteSheetCoordinates(options) {\n var _a;\n const { spriteSheet, frameCoordinates, durationPerFrame, durationPerFrameMs, speed, strategy, reverse } = options;\n const defaultDuration = (_a = durationPerFrame !== null && durationPerFrame !== void 0 ? durationPerFrame : durationPerFrameMs) !== null && _a !== void 0 ? _a : 100;\n const frames = [];\n for (const coord of frameCoordinates) {\n const { x, y, duration, options } = coord;\n const sprite = spriteSheet.getSprite(x, y, options);\n if (sprite) {\n frames.push({\n graphic: sprite,\n duration: duration !== null && duration !== void 0 ? duration : defaultDuration\n });\n }\n else {\n Animation._LOGGER.warn(`Skipping frame! SpriteSheet does not have coordinate (${x}, ${y}), please check your SpriteSheet to confirm that sprite exists`);\n }\n }\n return new Animation({\n frames,\n strategy,\n speed,\n reverse\n });\n }\n /**\n * Current animation speed\n *\n * 1 meaning normal 1x speed.\n * 2 meaning 2x speed and so on.\n */\n get speed() {\n return this._speed;\n }\n /**\n * Current animation speed\n *\n * 1 meaning normal 1x speed.\n * 2 meaning 2x speed and so on.\n */\n set speed(val) {\n this._speed = (0,_Math_util__WEBPACK_IMPORTED_MODULE_2__.clamp)(Math.abs(val), 0, Infinity);\n }\n /**\n * Returns the current Frame of the animation\n *\n * Use {@apilink Animation.currentFrameIndex} to get the frame number and\n * {@apilink Animation.goToFrame} to set the current frame index\n */\n get currentFrame() {\n if (this._currentFrame >= 0 && this._currentFrame < this.frames.length) {\n return this.frames[this._currentFrame];\n }\n return null;\n }\n /**\n * Returns the current frame index of the animation\n *\n * Use {@apilink Animation.currentFrame} to grab the current {@apilink Frame} object\n */\n get currentFrameIndex() {\n return this._currentFrame;\n }\n /**\n * Returns the amount of time in milliseconds left in the current frame\n */\n get currentFrameTimeLeft() {\n return this._timeLeftInFrame;\n }\n /**\n * Returns `true` if the animation is playing\n */\n get isPlaying() {\n return this._playing;\n }\n get isReversed() {\n return this._reversed;\n }\n /**\n * Reverses the play direction of the Animation, this preserves the current frame\n */\n reverse() {\n // Don't mutate with the original frame list, create a copy\n this.frames = this.frames.slice().reverse();\n this._reversed = !this._reversed;\n }\n /**\n * Returns the current play direction of the animation\n */\n get direction() {\n // Keep logically consistent with ping-pong direction\n // If ping-pong is forward = 1 and reversed is true then we are logically reversed\n const reversed = this._reversed && this._pingPongDirection === 1 ? true : false;\n return reversed ? AnimationDirection.Backward : AnimationDirection.Forward;\n }\n /**\n * Plays or resumes the animation from the current frame\n */\n play() {\n this._playing = true;\n }\n /**\n * Pauses the animation on the current frame\n */\n pause() {\n this._playing = false;\n this._firstTick = true; // firstTick must be set to emit the proper frame event\n }\n /**\n * Reset the animation back to the beginning, including if the animation were done\n */\n reset() {\n this._done = false;\n this._firstTick = true;\n this._currentFrame = 0;\n this._timeLeftInFrame = this.frameDuration;\n const maybeFrame = this.frames[this._currentFrame];\n if (maybeFrame) {\n this._timeLeftInFrame = (maybeFrame === null || maybeFrame === void 0 ? void 0 : maybeFrame.duration) || this.frameDuration;\n }\n }\n /**\n * Returns `true` if the animation can end\n */\n get canFinish() {\n switch (this.strategy) {\n case AnimationStrategy.End:\n case AnimationStrategy.Freeze: {\n return true;\n }\n default: {\n return false;\n }\n }\n }\n /**\n * Returns `true` if the animation is done, for looping type animations\n * `ex.AnimationStrategy.PingPong` and `ex.AnimationStrategy.Loop` this will always return `false`\n *\n * See the `ex.Animation.canFinish()` method to know if an animation type can end\n */\n get done() {\n return this._done;\n }\n /**\n * Jump the animation immediately to a specific frame if it exists\n *\n * Optionally specify an override for the duration of the frame, useful for\n * keeping multiple animations in sync with one another.\n * @param frameNumber\n * @param duration\n */\n goToFrame(frameNumber, duration) {\n this._currentFrame = frameNumber;\n this._timeLeftInFrame = duration !== null && duration !== void 0 ? duration : this.frameDuration;\n const maybeFrame = this.frames[this._currentFrame];\n if (maybeFrame && !this._done) {\n this._timeLeftInFrame = duration !== null && duration !== void 0 ? duration : ((maybeFrame === null || maybeFrame === void 0 ? void 0 : maybeFrame.duration) || this.frameDuration);\n this.events.emit('frame', { ...maybeFrame, frameIndex: this.currentFrameIndex });\n }\n }\n _nextFrame() {\n const currentFrame = this._currentFrame;\n if (this._done) {\n return currentFrame;\n }\n let next = -1;\n switch (this.strategy) {\n case AnimationStrategy.Loop: {\n next = (currentFrame + 1) % this.frames.length;\n if (next === 0) {\n this.events.emit('loop', this);\n }\n break;\n }\n case AnimationStrategy.End: {\n next = currentFrame + 1;\n if (next >= this.frames.length) {\n this._done = true;\n this._currentFrame = this.frames.length;\n this.events.emit('end', this);\n }\n break;\n }\n case AnimationStrategy.Freeze: {\n next = (0,_Math_util__WEBPACK_IMPORTED_MODULE_2__.clamp)(currentFrame + 1, 0, this.frames.length - 1);\n if (next >= this.frames.length - 1) {\n this._done = true;\n this.events.emit('end', this);\n }\n break;\n }\n case AnimationStrategy.PingPong: {\n if (currentFrame + this._pingPongDirection >= this.frames.length) {\n this._pingPongDirection = -1;\n this.events.emit('loop', this);\n }\n if (currentFrame + this._pingPongDirection < 0) {\n this._pingPongDirection = 1;\n this.events.emit('loop', this);\n }\n next = currentFrame + (this._pingPongDirection % this.frames.length);\n break;\n }\n }\n return next;\n }\n /**\n * Called internally by Excalibur to update the state of the animation potential update the current frame\n * @param elapsed Milliseconds elapsed\n * @param idempotencyToken Prevents double ticking in a frame by passing a unique token to the frame\n */\n tick(elapsed, idempotencyToken = 0) {\n if (this._idempotencyToken === idempotencyToken) {\n return;\n }\n this._idempotencyToken = idempotencyToken;\n if (!this._playing) {\n return;\n }\n // if it's the first frame emit frame event\n if (this._firstTick) {\n this._firstTick = false;\n this.events.emit('frame', { ...this.currentFrame, frameIndex: this.currentFrameIndex });\n }\n this._timeLeftInFrame -= elapsed * this._speed;\n if (this._timeLeftInFrame <= 0) {\n this.goToFrame(this._nextFrame());\n }\n }\n _drawImage(ctx, x, y) {\n if (this.currentFrame && this.currentFrame.graphic) {\n this.currentFrame.graphic.draw(ctx, x, y);\n }\n }\n}\nAnimation._LOGGER = _Util_Log__WEBPACK_IMPORTED_MODULE_3__.Logger.getInstance();\n\n\n/***/ }),\n\n/***/ \"./Graphics/Canvas.ts\":\n/*!****************************!*\\\n !*** ./Graphics/Canvas.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Canvas: () => (/* binding */ Canvas)\n/* harmony export */ });\n/* harmony import */ var _Raster__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Raster */ \"./Graphics/Raster.ts\");\n\n/**\n * A canvas {@apilink Graphic} to provide an adapter between the 2D Canvas API and the {@apilink ExcaliburGraphicsContext}.\n *\n * The {@apilink Canvas} works by re-rastering a draw handler to a HTMLCanvasElement for every draw which is then passed\n * to the {@apilink ExcaliburGraphicsContext} implementation as a rendered image.\n *\n * **Low performance API**\n */\nclass Canvas extends _Raster__WEBPACK_IMPORTED_MODULE_0__.Raster {\n /**\n * Return the 2D graphics context of this canvas\n */\n get ctx() {\n return this._ctx;\n }\n constructor(_options = {}) {\n super(_options);\n this._options = _options;\n }\n clone() {\n return new Canvas({\n ...this._options,\n ...this.cloneGraphicOptions(),\n ...this.cloneRasterOptions()\n });\n }\n execute(ctx) {\n var _a, _b;\n if ((_a = this._options) === null || _a === void 0 ? void 0 : _a.draw) {\n (_b = this._options) === null || _b === void 0 ? void 0 : _b.draw(ctx);\n }\n if (!this._options.cache) {\n this.flagDirty();\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Circle.ts\":\n/*!****************************!*\\\n !*** ./Graphics/Circle.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Circle: () => (/* binding */ Circle)\n/* harmony export */ });\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Raster__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Raster */ \"./Graphics/Raster.ts\");\n\n\n/**\n * A circle {@apilink Graphic} for drawing circles to the {@apilink ExcaliburGraphicsContext}\n *\n * Circles default to {@apilink ImageFiltering.Blended}\n */\nclass Circle extends _Raster__WEBPACK_IMPORTED_MODULE_0__.Raster {\n get radius() {\n return this._radius;\n }\n set radius(value) {\n this._radius = value;\n this.width = this._radius * 2;\n this.height = this._radius * 2;\n this.flagDirty();\n }\n constructor(options) {\n var _a, _b, _c;\n super(options);\n this._radius = 0;\n const lineWidth = (_a = options.lineWidth) !== null && _a !== void 0 ? _a : (options.strokeColor ? 1 : 0); // default lineWidth in canvas is 1px\n this.padding = (_b = options.padding) !== null && _b !== void 0 ? _b : 2 + lineWidth / 2; // default 2 padding for circles looks nice\n this.radius = options.radius;\n this.filtering = (_c = options.filtering) !== null && _c !== void 0 ? _c : _Filtering__WEBPACK_IMPORTED_MODULE_1__.ImageFiltering.Blended;\n this.rasterize();\n }\n clone() {\n return new Circle({\n radius: this.radius,\n ...this.cloneGraphicOptions(),\n ...this.cloneRasterOptions()\n });\n }\n execute(ctx) {\n if (this.radius > 0) {\n ctx.beginPath();\n ctx.arc(this.radius, this.radius, this.radius, 0, Math.PI * 2);\n if (this.color) {\n ctx.fill();\n }\n if (this.strokeColor) {\n ctx.stroke();\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/ExcaliburGraphicsContext.ts\":\n/*!******************************************************!*\\\n !*** ./Graphics/Context/ExcaliburGraphicsContext.ts ***!\n \\******************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DefaultAntialiasOptions: () => (/* binding */ DefaultAntialiasOptions),\n/* harmony export */ DefaultPixelArtOptions: () => (/* binding */ DefaultPixelArtOptions)\n/* harmony export */ });\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Filtering */ \"./Graphics/Filtering.ts\");\n\nconst DefaultAntialiasOptions = {\n pixelArtSampler: false,\n nativeContextAntialiasing: false,\n multiSampleAntialiasing: true,\n filtering: _Filtering__WEBPACK_IMPORTED_MODULE_0__.ImageFiltering.Blended,\n canvasImageRendering: 'auto'\n};\nconst DefaultPixelArtOptions = {\n pixelArtSampler: true,\n nativeContextAntialiasing: false,\n multiSampleAntialiasing: true,\n filtering: _Filtering__WEBPACK_IMPORTED_MODULE_0__.ImageFiltering.Blended,\n canvasImageRendering: 'auto'\n};\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/ExcaliburGraphicsContext2DCanvas.ts\":\n/*!**************************************************************!*\\\n !*** ./Graphics/Context/ExcaliburGraphicsContext2DCanvas.ts ***!\n \\**************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ExcaliburGraphicsContext2DCanvas: () => (/* binding */ ExcaliburGraphicsContext2DCanvas)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Color */ \"./Color.ts\");\n/* harmony import */ var _state_stack__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./state-stack */ \"./Graphics/Context/state-stack.ts\");\n/* harmony import */ var _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n/* harmony import */ var _debug_text__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./debug-text */ \"./Graphics/Context/debug-text.ts\");\n\n\n\n\nconst pixelSnapEpsilon = 0.0001;\nclass ExcaliburGraphicsContext2DCanvasDebug {\n constructor(_ex) {\n this._ex = _ex;\n this._debugText = new _debug_text__WEBPACK_IMPORTED_MODULE_0__.DebugText();\n }\n /**\n * Draw a debug rectangle to the context\n * @param x\n * @param y\n * @param width\n * @param height\n */\n drawRect(x, y, width, height) {\n this._ex.__ctx.save();\n this._ex.__ctx.strokeStyle = 'red';\n this._ex.__ctx.strokeRect(this._ex.snapToPixel ? ~~(x + pixelSnapEpsilon) : x, this._ex.snapToPixel ? ~~(y + pixelSnapEpsilon) : y, this._ex.snapToPixel ? ~~(width + pixelSnapEpsilon) : width, this._ex.snapToPixel ? ~~(height + pixelSnapEpsilon) : height);\n this._ex.__ctx.restore();\n }\n drawLine(start, end, lineOptions = { color: _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Black }) {\n var _a, _b;\n this._ex.__ctx.save();\n this._ex.__ctx.beginPath();\n this._ex.__ctx.strokeStyle = (_b = (_a = lineOptions.color) === null || _a === void 0 ? void 0 : _a.toString()) !== null && _b !== void 0 ? _b : '';\n this._ex.__ctx.moveTo(this._ex.snapToPixel ? ~~(start.x + pixelSnapEpsilon) : start.x, this._ex.snapToPixel ? ~~(start.y + pixelSnapEpsilon) : start.y);\n this._ex.__ctx.lineTo(this._ex.snapToPixel ? ~~(end.x + pixelSnapEpsilon) : end.x, this._ex.snapToPixel ? ~~(end.y + pixelSnapEpsilon) : end.y);\n this._ex.__ctx.lineWidth = 2;\n this._ex.__ctx.stroke();\n this._ex.__ctx.closePath();\n this._ex.__ctx.restore();\n }\n drawPoint(point, pointOptions = { color: _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Black, size: 5 }) {\n this._ex.__ctx.save();\n this._ex.__ctx.beginPath();\n this._ex.__ctx.fillStyle = pointOptions.color.toString();\n this._ex.__ctx.arc(this._ex.snapToPixel ? ~~(point.x + pixelSnapEpsilon) : point.x, this._ex.snapToPixel ? ~~(point.y + pixelSnapEpsilon) : point.y, pointOptions.size, 0, Math.PI * 2);\n this._ex.__ctx.fill();\n this._ex.__ctx.closePath();\n this._ex.__ctx.restore();\n }\n drawText(text, pos) {\n this._debugText.write(this._ex, text, pos);\n }\n}\nclass ExcaliburGraphicsContext2DCanvas {\n get width() {\n return this.__ctx.canvas.width;\n }\n get height() {\n return this.__ctx.canvas.height;\n }\n get opacity() {\n return this._state.current.opacity;\n }\n set opacity(value) {\n this._state.current.opacity = value;\n }\n get tint() {\n return this._state.current.tint;\n }\n set tint(color) {\n this._state.current.tint = color;\n }\n get smoothing() {\n return this.__ctx.imageSmoothingEnabled;\n }\n set smoothing(value) {\n this.__ctx.imageSmoothingEnabled = value;\n }\n constructor(options) {\n /**\n * Unused in Canvas implementation\n */\n this.useDrawSorting = false;\n /**\n * Unused in Canvas implementation\n */\n this.z = 0;\n this.backgroundColor = _Color__WEBPACK_IMPORTED_MODULE_1__.Color.ExcaliburBlue;\n this._state = new _state_stack__WEBPACK_IMPORTED_MODULE_2__.StateStack();\n this.snapToPixel = false;\n this.debug = new ExcaliburGraphicsContext2DCanvasDebug(this);\n const { canvasElement, context, enableTransparency, snapToPixel, antialiasing: smoothing, backgroundColor } = options;\n this.__ctx =\n context !== null && context !== void 0 ? context : canvasElement.getContext('2d', {\n alpha: enableTransparency !== null && enableTransparency !== void 0 ? enableTransparency : true\n });\n if (!this.__ctx) {\n throw new Error('Cannot build new ExcaliburGraphicsContext2D for some reason!');\n }\n this.backgroundColor = backgroundColor !== null && backgroundColor !== void 0 ? backgroundColor : this.backgroundColor;\n this.snapToPixel = snapToPixel !== null && snapToPixel !== void 0 ? snapToPixel : this.snapToPixel;\n this.smoothing = smoothing !== null && smoothing !== void 0 ? smoothing : this.smoothing;\n }\n resetTransform() {\n this.__ctx.resetTransform();\n }\n updateViewport(_resolution) {\n // pass\n }\n drawImage(image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight) {\n if (swidth === 0 || sheight === 0) {\n return; // zero dimension dest exit early\n }\n else if (dwidth === 0 || dheight === 0) {\n return; // zero dimension dest exit early\n }\n else if (image.width === 0 || image.height === 0) {\n return; // zero dimension source exit early\n }\n this.__ctx.globalAlpha = this.opacity;\n const args = [image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight]\n .filter((a) => a !== undefined)\n .map((a) => (typeof a === 'number' && this.snapToPixel ? ~~a : a));\n this.__ctx.drawImage.apply(this.__ctx, args);\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_3__.GraphicsDiagnostics.DrawCallCount++;\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_3__.GraphicsDiagnostics.DrawnImagesCount = 1;\n }\n drawLine(start, end, color, thickness = 1) {\n this.__ctx.save();\n this.__ctx.beginPath();\n this.__ctx.strokeStyle = color.toString();\n this.__ctx.moveTo(this.snapToPixel ? ~~(start.x + pixelSnapEpsilon) : start.x, this.snapToPixel ? ~~(start.y + pixelSnapEpsilon) : start.y);\n this.__ctx.lineTo(this.snapToPixel ? ~~(end.x + pixelSnapEpsilon) : end.x, this.snapToPixel ? ~~(end.y + pixelSnapEpsilon) : end.y);\n this.__ctx.lineWidth = thickness;\n this.__ctx.stroke();\n this.__ctx.closePath();\n this.__ctx.restore();\n }\n drawRectangle(pos, width, height, color) {\n this.__ctx.save();\n this.__ctx.fillStyle = color.toString();\n this.__ctx.fillRect(this.snapToPixel ? ~~(pos.x + pixelSnapEpsilon) : pos.x, this.snapToPixel ? ~~(pos.y + pixelSnapEpsilon) : pos.y, this.snapToPixel ? ~~(width + pixelSnapEpsilon) : width, this.snapToPixel ? ~~(height + pixelSnapEpsilon) : height);\n this.__ctx.restore();\n }\n drawCircle(pos, radius, color, stroke, thickness) {\n this.__ctx.save();\n this.__ctx.beginPath();\n if (stroke) {\n this.__ctx.strokeStyle = stroke.toString();\n }\n if (thickness) {\n this.__ctx.lineWidth = thickness;\n }\n this.__ctx.fillStyle = color.toString();\n this.__ctx.arc(this.snapToPixel ? ~~(pos.x + pixelSnapEpsilon) : pos.x, this.snapToPixel ? ~~(pos.y + pixelSnapEpsilon) : pos.y, radius, 0, Math.PI * 2);\n this.__ctx.fill();\n if (stroke) {\n this.__ctx.stroke();\n }\n this.__ctx.closePath();\n this.__ctx.restore();\n }\n /**\n * Save the current state of the canvas to the stack (transforms and opacity)\n */\n save() {\n this.__ctx.save();\n this._state.save();\n }\n /**\n * Restore the state of the canvas from the stack\n */\n restore() {\n this.__ctx.restore();\n this._state.restore();\n }\n /**\n * Translate the origin of the context by an x and y\n * @param x\n * @param y\n */\n translate(x, y) {\n this.__ctx.translate(this.snapToPixel ? ~~(x + pixelSnapEpsilon) : x, this.snapToPixel ? ~~(y + pixelSnapEpsilon) : y);\n }\n /**\n * Rotate the context about the current origin\n */\n rotate(angle) {\n this.__ctx.rotate(angle);\n }\n /**\n * Scale the context by an x and y factor\n * @param x\n * @param y\n */\n scale(x, y) {\n this.__ctx.scale(x, y);\n }\n getTransform() {\n throw new Error('Not implemented');\n }\n multiply(_m) {\n this.__ctx.setTransform(this.__ctx.getTransform().multiply(_m.toDOMMatrix()));\n }\n addPostProcessor(_postprocessor) {\n // pass\n }\n removePostProcessor(_postprocessor) {\n // pass\n }\n clearPostProcessors() {\n // pass\n }\n updatePostProcessors(elapsed) {\n // pass\n }\n beginDrawLifecycle() {\n // pass\n }\n endDrawLifecycle() {\n // pass\n }\n set material(material) {\n this._state.current.material = material;\n }\n get material() {\n return this._state.current.material;\n }\n createMaterial(options) {\n // pass\n return null;\n }\n clear() {\n // Clear frame\n this.__ctx.clearRect(0, 0, this.width, this.height);\n this.__ctx.fillStyle = this.backgroundColor.toString();\n this.__ctx.fillRect(0, 0, this.width, this.height);\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_3__.GraphicsDiagnostics.clear();\n }\n /**\n * Flushes the batched draw calls to the screen\n */\n flush() {\n // pass\n }\n dispose() {\n this.__ctx = undefined;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\":\n/*!***********************************************************!*\\\n !*** ./Graphics/Context/ExcaliburGraphicsContextWebGL.ts ***!\n \\***********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ExcaliburGraphicsContextWebGL: () => (/* binding */ ExcaliburGraphicsContextWebGL),\n/* harmony export */ pixelSnapEpsilon: () => (/* binding */ pixelSnapEpsilon)\n/* harmony export */ });\n/* harmony import */ var _Math_matrix__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../Math/matrix */ \"./Math/matrix.ts\");\n/* harmony import */ var _transform_stack__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./transform-stack */ \"./Graphics/Context/transform-stack.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Color */ \"./Color.ts\");\n/* harmony import */ var _state_stack__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./state-stack */ \"./Graphics/Context/state-stack.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _debug_text__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./debug-text */ \"./Graphics/Context/debug-text.ts\");\n/* harmony import */ var _render_target__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./render-target */ \"./Graphics/Context/render-target.ts\");\n/* harmony import */ var _texture_loader__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./texture-loader */ \"./Graphics/Context/texture-loader.ts\");\n/* harmony import */ var _line_renderer_line_renderer__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./line-renderer/line-renderer */ \"./Graphics/Context/line-renderer/line-renderer.ts\");\n/* harmony import */ var _point_renderer_point_renderer__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./point-renderer/point-renderer */ \"./Graphics/Context/point-renderer/point-renderer.ts\");\n/* harmony import */ var _screen_pass_painter_screen_pass_painter__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./screen-pass-painter/screen-pass-painter */ \"./Graphics/Context/screen-pass-painter/screen-pass-painter.ts\");\n/* harmony import */ var _image_renderer_image_renderer__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./image-renderer/image-renderer */ \"./Graphics/Context/image-renderer/image-renderer.ts\");\n/* harmony import */ var _rectangle_renderer_rectangle_renderer__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./rectangle-renderer/rectangle-renderer */ \"./Graphics/Context/rectangle-renderer/rectangle-renderer.ts\");\n/* harmony import */ var _circle_renderer_circle_renderer__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./circle-renderer/circle-renderer */ \"./Graphics/Context/circle-renderer/circle-renderer.ts\");\n/* harmony import */ var _Util_Pool__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Util/Pool */ \"./Util/Pool.ts\");\n/* harmony import */ var _draw_call__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./draw-call */ \"./Graphics/Context/draw-call.ts\");\n/* harmony import */ var _material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./material */ \"./Graphics/Context/material.ts\");\n/* harmony import */ var _material_renderer_material_renderer__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./material-renderer/material-renderer */ \"./Graphics/Context/material-renderer/material-renderer.ts\");\n/* harmony import */ var _shader__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _particle_renderer_particle_renderer__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./particle-renderer/particle-renderer */ \"./Graphics/Context/particle-renderer/particle-renderer.ts\");\n/* harmony import */ var _image_renderer_v2_image_renderer_v2__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./image-renderer-v2/image-renderer-v2 */ \"./Graphics/Context/image-renderer-v2/image-renderer-v2.ts\");\n/* harmony import */ var _Flags__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Flags */ \"./Flags.ts\");\n\n\n\n\n\n\n\n\n\n// renderers\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst pixelSnapEpsilon = 0.0001;\nclass ExcaliburGraphicsContextWebGLDebug {\n constructor(_webglCtx) {\n this._webglCtx = _webglCtx;\n this._debugText = new _debug_text__WEBPACK_IMPORTED_MODULE_0__.DebugText();\n }\n /**\n * Draw a debugging rectangle to the context\n * @param x\n * @param y\n * @param width\n * @param height\n */\n drawRect(x, y, width, height, rectOptions = { color: _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Black }) {\n this.drawLine((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(x, y), (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(x + width, y), { ...rectOptions });\n this.drawLine((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(x + width, y), (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(x + width, y + height), { ...rectOptions });\n this.drawLine((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(x + width, y + height), (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(x, y + height), { ...rectOptions });\n this.drawLine((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(x, y + height), (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(x, y), { ...rectOptions });\n }\n /**\n * Draw a debugging line to the context\n * @param start\n * @param end\n * @param lineOptions\n */\n drawLine(start, end, lineOptions) {\n var _a;\n this._webglCtx.draw('ex.line', start, end, (_a = lineOptions === null || lineOptions === void 0 ? void 0 : lineOptions.color) !== null && _a !== void 0 ? _a : _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Black);\n }\n /**\n * Draw a debugging point to the context\n * @param point\n * @param pointOptions\n */\n drawPoint(point, pointOptions = { color: _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Black, size: 5 }) {\n this._webglCtx.draw('ex.point', point, pointOptions.color, pointOptions.size);\n }\n drawText(text, pos) {\n this._debugText.write(this._webglCtx, text, pos);\n }\n}\nclass ExcaliburGraphicsContextWebGL {\n get z() {\n return this._state.current.z;\n }\n set z(value) {\n this._state.current.z = value;\n }\n get opacity() {\n return this._state.current.opacity;\n }\n set opacity(value) {\n this._state.current.opacity = value;\n }\n get tint() {\n return this._state.current.tint;\n }\n set tint(color) {\n this._state.current.tint = color;\n }\n get width() {\n return this.__gl.canvas.width;\n }\n get height() {\n return this.__gl.canvas.height;\n }\n get ortho() {\n return this._ortho;\n }\n /**\n * Checks the underlying webgl implementation if the requested internal resolution is supported\n * @param dim\n */\n checkIfResolutionSupported(dim) {\n // Slight hack based on this thread https://groups.google.com/g/webgl-dev-list/c/AHONvz3oQTo\n let supported = true;\n if (dim.width > 4096 || dim.height > 4096) {\n supported = false;\n }\n return supported;\n }\n constructor(options) {\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_3__.Logger.getInstance();\n this._renderers = new Map();\n this.imageRenderer = _Flags__WEBPACK_IMPORTED_MODULE_4__.Flags.isEnabled('use-legacy-image-renderer') ? 'ex.image' : 'ex.image-v2';\n this._isDrawLifecycle = false;\n this.useDrawSorting = true;\n this._drawCallPool = new _Util_Pool__WEBPACK_IMPORTED_MODULE_5__.Pool(() => new _draw_call__WEBPACK_IMPORTED_MODULE_6__.DrawCall(), undefined, 4000);\n this._drawCallIndex = 0;\n this._drawCalls = new Array(4000).fill(null);\n // Postprocessing is a tuple with 2 render targets, these are flip-flopped during the postprocessing process\n this._postProcessTargets = [];\n this._postprocessors = [];\n this._transform = new _transform_stack__WEBPACK_IMPORTED_MODULE_7__.TransformStack();\n this._state = new _state_stack__WEBPACK_IMPORTED_MODULE_8__.StateStack();\n /**\n * Snaps the drawing x/y coordinate to the nearest whole pixel\n */\n this.snapToPixel = false;\n /**\n * Native context smoothing\n */\n this.smoothing = false;\n /**\n * Whether the pixel art sampler is enabled for smooth sub pixel anti-aliasing\n */\n this.pixelArtSampler = false;\n /**\n * UV padding in pixels to use in internal image rendering to prevent texture bleed\n *\n */\n this.uvPadding = 0.01;\n this.backgroundColor = _Color__WEBPACK_IMPORTED_MODULE_1__.Color.ExcaliburBlue;\n this.multiSampleAntialiasing = true;\n this.transparency = true;\n this._isContextLost = false;\n this._disposed = false;\n this._imageToWidth = new Map();\n this._imageToHeight = new Map();\n this.debug = new ExcaliburGraphicsContextWebGLDebug(this);\n this._totalPostProcessorTime = 0;\n const { canvasElement, context, enableTransparency, antialiasing, uvPadding, multiSampleAntialiasing, pixelArtSampler, powerPreference, snapToPixel, backgroundColor, useDrawSorting, garbageCollector, handleContextLost, handleContextRestored } = options;\n this.__gl =\n context !== null && context !== void 0 ? context : canvasElement.getContext('webgl2', {\n antialias: antialiasing !== null && antialiasing !== void 0 ? antialiasing : this.smoothing,\n premultipliedAlpha: false,\n alpha: enableTransparency !== null && enableTransparency !== void 0 ? enableTransparency : this.transparency,\n depth: false,\n powerPreference: powerPreference !== null && powerPreference !== void 0 ? powerPreference : 'high-performance'\n });\n if (!this.__gl) {\n throw Error('Failed to retrieve webgl context from browser');\n }\n if (handleContextLost) {\n this.__gl.canvas.addEventListener('webglcontextlost', handleContextLost, false);\n }\n if (handleContextRestored) {\n this.__gl.canvas.addEventListener('webglcontextrestored', handleContextRestored, false);\n }\n this.__gl.canvas.addEventListener('webglcontextlost', () => {\n this._isContextLost = true;\n });\n this.__gl.canvas.addEventListener('webglcontextrestored', () => {\n this._isContextLost = false;\n });\n this.textureLoader = new _texture_loader__WEBPACK_IMPORTED_MODULE_9__.TextureLoader(this.__gl, garbageCollector);\n this.snapToPixel = snapToPixel !== null && snapToPixel !== void 0 ? snapToPixel : this.snapToPixel;\n this.smoothing = antialiasing !== null && antialiasing !== void 0 ? antialiasing : this.smoothing;\n this.transparency = enableTransparency !== null && enableTransparency !== void 0 ? enableTransparency : this.transparency;\n this.pixelArtSampler = pixelArtSampler !== null && pixelArtSampler !== void 0 ? pixelArtSampler : this.pixelArtSampler;\n this.uvPadding = uvPadding !== null && uvPadding !== void 0 ? uvPadding : this.uvPadding;\n this.multiSampleAntialiasing = typeof multiSampleAntialiasing === 'boolean' ? multiSampleAntialiasing : this.multiSampleAntialiasing;\n this.samples = typeof multiSampleAntialiasing === 'object' ? multiSampleAntialiasing.samples : undefined;\n this.backgroundColor = backgroundColor !== null && backgroundColor !== void 0 ? backgroundColor : this.backgroundColor;\n this.useDrawSorting = useDrawSorting !== null && useDrawSorting !== void 0 ? useDrawSorting : this.useDrawSorting;\n this._drawCallPool.disableWarnings = true;\n this._drawCallPool.preallocate();\n this._init();\n }\n dispose() {\n if (!this._disposed) {\n this._disposed = true;\n this.textureLoader.dispose();\n for (const renderer of this._renderers.values()) {\n renderer.dispose();\n }\n this._renderers.clear();\n this._drawCallPool.dispose();\n this._drawCalls.length = 0;\n this.__gl = null;\n }\n }\n _init() {\n const gl = this.__gl;\n // Setup viewport and view matrix\n this._ortho = _Math_matrix__WEBPACK_IMPORTED_MODULE_10__.Matrix.ortho(0, gl.canvas.width, gl.canvas.height, 0, 400, -400);\n gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);\n // Clear background\n gl.clearColor(this.backgroundColor.r / 255, this.backgroundColor.g / 255, this.backgroundColor.b / 255, this.backgroundColor.a);\n gl.clear(gl.COLOR_BUFFER_BIT);\n // Enable alpha blending\n // https://www.realtimerendering.com/blog/gpus-prefer-premultiplication/\n gl.enable(gl.BLEND);\n gl.blendEquation(gl.FUNC_ADD);\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n gl.blendEquationSeparate(gl.FUNC_ADD, gl.FUNC_ADD);\n gl.blendFuncSeparate(gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n gl.depthMask(false);\n // Setup builtin renderers\n this.register(new _image_renderer_image_renderer__WEBPACK_IMPORTED_MODULE_11__.ImageRenderer({\n uvPadding: this.uvPadding,\n pixelArtSampler: this.pixelArtSampler\n }));\n this.register(new _material_renderer_material_renderer__WEBPACK_IMPORTED_MODULE_12__.MaterialRenderer());\n this.register(new _rectangle_renderer_rectangle_renderer__WEBPACK_IMPORTED_MODULE_13__.RectangleRenderer());\n this.register(new _circle_renderer_circle_renderer__WEBPACK_IMPORTED_MODULE_14__.CircleRenderer());\n this.register(new _point_renderer_point_renderer__WEBPACK_IMPORTED_MODULE_15__.PointRenderer());\n this.register(new _line_renderer_line_renderer__WEBPACK_IMPORTED_MODULE_16__.LineRenderer());\n this.register(new _particle_renderer_particle_renderer__WEBPACK_IMPORTED_MODULE_17__.ParticleRenderer());\n this.register(new _image_renderer_v2_image_renderer_v2__WEBPACK_IMPORTED_MODULE_18__.ImageRendererV2({\n uvPadding: this.uvPadding,\n pixelArtSampler: this.pixelArtSampler\n }));\n this.materialScreenTexture = gl.createTexture();\n if (!this.materialScreenTexture) {\n throw new Error('Could not create screen texture!');\n }\n gl.bindTexture(gl.TEXTURE_2D, this.materialScreenTexture);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT);\n gl.bindTexture(gl.TEXTURE_2D, null);\n this._screenRenderer = new _screen_pass_painter_screen_pass_painter__WEBPACK_IMPORTED_MODULE_19__.ScreenPassPainter(gl);\n this._renderTarget = new _render_target__WEBPACK_IMPORTED_MODULE_20__.RenderTarget({\n gl,\n transparency: this.transparency,\n width: gl.canvas.width,\n height: gl.canvas.height\n });\n this._postProcessTargets = [\n new _render_target__WEBPACK_IMPORTED_MODULE_20__.RenderTarget({\n gl,\n transparency: this.transparency,\n width: gl.canvas.width,\n height: gl.canvas.height\n }),\n new _render_target__WEBPACK_IMPORTED_MODULE_20__.RenderTarget({\n gl,\n transparency: this.transparency,\n width: gl.canvas.width,\n height: gl.canvas.height\n })\n ];\n this._msaaTarget = new _render_target__WEBPACK_IMPORTED_MODULE_20__.RenderTarget({\n gl,\n transparency: this.transparency,\n width: gl.canvas.width,\n height: gl.canvas.height,\n antialias: this.multiSampleAntialiasing,\n samples: this.samples\n });\n }\n register(renderer) {\n this._renderers.set(renderer.type, renderer);\n renderer.initialize(this.__gl, this);\n }\n get(rendererName) {\n return this._renderers.get(rendererName);\n }\n _isCurrentRenderer(renderer) {\n if (!this._currentRenderer || this._currentRenderer === renderer) {\n return true;\n }\n return false;\n }\n beginDrawLifecycle() {\n this._isDrawLifecycle = true;\n }\n endDrawLifecycle() {\n this._isDrawLifecycle = false;\n }\n draw(rendererName, ...args) {\n if (true) {\n if (args.length > 9) {\n throw new Error('Only 10 or less renderer arguments are supported!;');\n }\n }\n if (!this._isDrawLifecycle) {\n this._logger.warnOnce(`Attempting to draw outside the the drawing lifecycle (preDraw/postDraw) is not supported and is a source of bugs/errors.\\n` +\n `If you want to do custom drawing, use Actor.graphics, or any onPreDraw or onPostDraw handler.`);\n }\n if (this._isContextLost) {\n this._logger.errorOnce(`Unable to draw ${rendererName}, the webgl context is lost`);\n return;\n }\n const renderer = this._renderers.get(rendererName);\n if (renderer) {\n if (this.useDrawSorting) {\n const drawCall = this._drawCallPool.get();\n drawCall.z = this._state.current.z;\n drawCall.priority = renderer.priority;\n drawCall.renderer = rendererName;\n this.getTransform().clone(drawCall.transform);\n drawCall.state.z = this._state.current.z;\n drawCall.state.opacity = this._state.current.opacity;\n drawCall.state.tint = this._state.current.tint;\n drawCall.state.material = this._state.current.material;\n drawCall.args[0] = args[0];\n drawCall.args[1] = args[1];\n drawCall.args[2] = args[2];\n drawCall.args[3] = args[3];\n drawCall.args[4] = args[4];\n drawCall.args[5] = args[5];\n drawCall.args[6] = args[6];\n drawCall.args[7] = args[7];\n drawCall.args[8] = args[8];\n drawCall.args[9] = args[9];\n this._drawCalls[this._drawCallIndex++] = drawCall;\n }\n else {\n // Set the current renderer if not defined\n if (!this._currentRenderer) {\n this._currentRenderer = renderer;\n }\n if (!this._isCurrentRenderer(renderer)) {\n // switching graphics means we must flush the previous\n this._currentRenderer.flush();\n }\n // If we are still using the same renderer we can add to the current batch\n renderer.draw(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9]);\n this._currentRenderer = renderer;\n }\n }\n else {\n throw Error(`No renderer with name ${rendererName} has been registered`);\n }\n }\n resetTransform() {\n this._transform.reset();\n }\n updateViewport(resolution) {\n const gl = this.__gl;\n this._ortho = this._ortho = _Math_matrix__WEBPACK_IMPORTED_MODULE_10__.Matrix.ortho(0, resolution.width, resolution.height, 0, 400, -400);\n this._renderTarget.setResolution(gl.canvas.width, gl.canvas.height);\n this._msaaTarget.setResolution(gl.canvas.width, gl.canvas.height);\n this._postProcessTargets[0].setResolution(gl.canvas.width, gl.canvas.height);\n this._postProcessTargets[1].setResolution(gl.canvas.width, gl.canvas.height);\n }\n _getImageWidth(image) {\n let maybeWidth = this._imageToWidth.get(image);\n if (maybeWidth === undefined) {\n maybeWidth = image.width;\n this._imageToWidth.set(image, maybeWidth);\n }\n return maybeWidth;\n }\n _getImageHeight(image) {\n let maybeHeight = this._imageToHeight.get(image);\n if (maybeHeight === undefined) {\n maybeHeight = image.height;\n this._imageToHeight.set(image, maybeHeight);\n }\n return maybeHeight;\n }\n drawImage(image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight) {\n if (swidth === 0 || sheight === 0) {\n return; // zero dimension dest exit early\n }\n else if (dwidth === 0 || dheight === 0) {\n return; // zero dimension dest exit early\n }\n else if (this._getImageWidth(image) === 0 || this._getImageHeight(image) === 0) {\n return; // zero dimension source exit early\n }\n if (!image) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_3__.Logger.getInstance().warn('Cannot draw a null or undefined image');\n // tslint:disable-next-line: no-console\n if (console.trace) {\n // tslint:disable-next-line: no-console\n console.trace();\n }\n return;\n }\n if (this._state.current.material) {\n this.draw('ex.material', image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight);\n }\n else {\n if (this.imageRenderer === 'ex.image') {\n this.draw(this.imageRenderer, image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight);\n }\n else {\n this.draw(this.imageRenderer, image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight);\n }\n }\n }\n drawLine(start, end, color, thickness = 1) {\n this.draw('ex.rectangle', start, end, color, thickness);\n }\n drawRectangle(pos, width, height, color, stroke, strokeThickness) {\n this.draw('ex.rectangle', pos, width, height, color, stroke, strokeThickness);\n }\n drawCircle(pos, radius, color, stroke, thickness) {\n this.draw('ex.circle', pos, radius, color, stroke, thickness);\n }\n save() {\n this._transform.save();\n this._state.save();\n }\n restore() {\n this._transform.restore();\n this._state.restore();\n }\n translate(x, y) {\n this._transform.translate(this.snapToPixel ? ~~(x + pixelSnapEpsilon) : x, this.snapToPixel ? ~~(y + pixelSnapEpsilon) : y);\n }\n rotate(angle) {\n this._transform.rotate(angle);\n }\n scale(x, y) {\n this._transform.scale(x, y);\n }\n transform(matrix) {\n this._transform.current = matrix;\n }\n getTransform() {\n return this._transform.current;\n }\n multiply(m) {\n this._transform.current.multiply(m, this._transform.current);\n }\n addPostProcessor(postprocessor) {\n this._postprocessors.push(postprocessor);\n postprocessor.initialize(this.__gl);\n }\n removePostProcessor(postprocessor) {\n const index = this._postprocessors.indexOf(postprocessor);\n if (index !== -1) {\n this._postprocessors.splice(index, 1);\n }\n }\n clearPostProcessors() {\n this._postprocessors.length = 0;\n }\n updatePostProcessors(elapsed) {\n for (const postprocessor of this._postprocessors) {\n const shader = postprocessor.getShader();\n shader.use();\n const uniforms = shader.getUniforms();\n this._totalPostProcessorTime += elapsed;\n if (uniforms.find((u) => u.name === 'u_time_ms')) {\n shader.setUniformFloat('u_time_ms', this._totalPostProcessorTime);\n }\n if (uniforms.find((u) => u.name === 'u_elapsed_ms')) {\n shader.setUniformFloat('u_elapsed_ms', elapsed);\n }\n if (uniforms.find((u) => u.name === 'u_resolution')) {\n shader.setUniformFloatVector('u_resolution', (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(this.width, this.height));\n }\n if (postprocessor.onUpdate) {\n postprocessor.onUpdate(elapsed);\n }\n }\n }\n set material(material) {\n this._state.current.material = material;\n }\n get material() {\n return this._state.current.material;\n }\n /**\n * Creates and initializes the material which compiles the internal shader\n * @param options\n * @returns Material\n */\n createMaterial(options) {\n const material = new _material__WEBPACK_IMPORTED_MODULE_21__.Material({ ...options, graphicsContext: this });\n return material;\n }\n createShader(options) {\n const gl = this.__gl;\n const { vertexSource, fragmentSource } = options;\n const shader = new _shader__WEBPACK_IMPORTED_MODULE_22__.Shader({\n gl,\n vertexSource,\n fragmentSource\n });\n shader.compile();\n return shader;\n }\n clear() {\n const gl = this.__gl;\n const currentTarget = this.multiSampleAntialiasing ? this._msaaTarget : this._renderTarget;\n currentTarget.use();\n gl.clearColor(this.backgroundColor.r / 255, this.backgroundColor.g / 255, this.backgroundColor.b / 255, this.backgroundColor.a);\n // Clear the context with the newly set color. This is\n // the function call that actually does the drawing.\n gl.clear(gl.COLOR_BUFFER_BIT);\n }\n /**\n * Flushes all batched rendering to the screen\n */\n flush() {\n var _a;\n if (this._isContextLost) {\n this._logger.errorOnce(`Unable to flush the webgl context is lost`);\n return;\n }\n // render target captures all draws and redirects to the render target\n let currentTarget = this.multiSampleAntialiasing ? this._msaaTarget : this._renderTarget;\n currentTarget.use();\n if (this.useDrawSorting) {\n // null out unused draw calls\n for (let i = this._drawCallIndex; i < this._drawCalls.length; i++) {\n this._drawCalls[i] = null;\n }\n // sort draw calls\n // Find the original order of the first instance of the draw call\n const originalSort = new Map();\n for (const [name] of this._renderers) {\n let firstIndex = 0;\n for (firstIndex = 0; firstIndex < this._drawCallIndex; firstIndex++) {\n if (this._drawCalls[firstIndex].renderer === name) {\n break;\n }\n }\n originalSort.set(name, firstIndex);\n }\n this._drawCalls.sort((a, b) => {\n if (a === null || b === null) {\n return 0;\n }\n const zIndex = a.z - b.z;\n const originalSortOrder = originalSort.get(a.renderer) - originalSort.get(b.renderer);\n const priority = a.priority - b.priority;\n if (zIndex === 0) {\n // sort by z first\n if (priority === 0) {\n // sort by priority\n return originalSortOrder; // use the original order to inform draw call packing to maximally preserve painter order\n }\n return priority;\n }\n return zIndex;\n });\n const oldTransform = this._transform.current;\n const oldState = this._state.current;\n if (this._drawCalls.length && this._drawCallIndex) {\n let currentRendererName = this._drawCalls[0].renderer;\n let currentRenderer = this._renderers.get(currentRendererName);\n for (let i = 0; i < this._drawCallIndex; i++) {\n // hydrate the state for renderers\n this._transform.current = this._drawCalls[i].transform;\n this._state.current = this._drawCalls[i].state;\n if (this._drawCalls[i].renderer !== currentRendererName) {\n // switching graphics renderer means we must flush the previous\n currentRenderer.flush();\n currentRendererName = this._drawCalls[i].renderer;\n currentRenderer = this._renderers.get(currentRendererName);\n }\n // ! hack to grab screen texture before materials run because they might want it\n if (currentRenderer instanceof _material_renderer_material_renderer__WEBPACK_IMPORTED_MODULE_12__.MaterialRenderer && ((_a = this.material) === null || _a === void 0 ? void 0 : _a.isUsingScreenTexture)) {\n currentTarget.copyToTexture(this.materialScreenTexture);\n currentTarget.use();\n }\n // If we are still using the same renderer we can add to the current batch\n currentRenderer.draw(...this._drawCalls[i].args);\n }\n if (currentRenderer.hasPendingDraws()) {\n currentRenderer.flush();\n }\n }\n // reset state\n this._transform.current = oldTransform;\n this._state.current = oldState;\n // reclaim draw calls\n this._drawCallPool.done();\n this._drawCallIndex = 0;\n this._imageToHeight.clear();\n this._imageToWidth.clear();\n }\n else {\n // This is the final flush at the moment to draw any leftover pending draw\n for (const renderer of this._renderers.values()) {\n if (renderer.hasPendingDraws()) {\n renderer.flush();\n }\n }\n }\n currentTarget.disable();\n // post process step\n if (this._postprocessors.length > 0) {\n const source = currentTarget.toRenderSource();\n source.use();\n }\n // flip flop render targets for post processing\n for (let i = 0; i < this._postprocessors.length; i++) {\n currentTarget = this._postProcessTargets[i % 2];\n this._postProcessTargets[i % 2].use();\n this._screenRenderer.renderWithPostProcessor(this._postprocessors[i]);\n this._postProcessTargets[i % 2].toRenderSource().use();\n }\n // Final blit to the screen\n currentTarget.blitToScreen();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/circle-renderer/circle-renderer.ts\":\n/*!*************************************************************!*\\\n !*** ./Graphics/Context/circle-renderer/circle-renderer.ts ***!\n \\*************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CircleRenderer: () => (/* binding */ CircleRenderer)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../Color */ \"./Color.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n/* harmony import */ var _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _quad_index_buffer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../quad-index-buffer */ \"./Graphics/Context/quad-index-buffer.ts\");\n/* harmony import */ var _shader__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _vertex_buffer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _vertex_layout__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../vertex-layout */ \"./Graphics/Context/vertex-layout.ts\");\n/* harmony import */ var _circle_renderer_frag_glsl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./circle-renderer.frag.glsl */ \"./Graphics/Context/circle-renderer/circle-renderer.frag.glsl\");\n/* harmony import */ var _circle_renderer_vert_glsl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./circle-renderer.vert.glsl */ \"./Graphics/Context/circle-renderer/circle-renderer.vert.glsl\");\n\n\n\n\n\n\n\n\n\n\nclass CircleRenderer {\n constructor() {\n this.type = 'ex.circle';\n this.priority = 0;\n this._maxCircles = 10922; // max(uint16) / 6 verts\n this._circleCount = 0;\n this._vertexIndex = 0;\n }\n initialize(gl, context) {\n this._gl = gl;\n this._context = context;\n this._shader = new _shader__WEBPACK_IMPORTED_MODULE_0__.Shader({\n gl,\n fragmentSource: _circle_renderer_frag_glsl__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n vertexSource: _circle_renderer_vert_glsl__WEBPACK_IMPORTED_MODULE_2__[\"default\"]\n });\n this._shader.compile();\n // setup uniforms\n this._shader.use();\n this._shader.setUniformMatrix('u_matrix', context.ortho);\n this._buffer = new _vertex_buffer__WEBPACK_IMPORTED_MODULE_3__.VertexBuffer({\n gl,\n size: 14 * 4 * this._maxCircles,\n type: 'dynamic'\n });\n this._layout = new _vertex_layout__WEBPACK_IMPORTED_MODULE_4__.VertexLayout({\n gl,\n shader: this._shader,\n vertexBuffer: this._buffer,\n attributes: [\n ['a_position', 2],\n ['a_uv', 2],\n ['a_opacity', 1],\n ['a_color', 4],\n ['a_strokeColor', 4],\n ['a_strokeThickness', 1]\n ]\n });\n this._quads = new _quad_index_buffer__WEBPACK_IMPORTED_MODULE_5__.QuadIndexBuffer(gl, this._maxCircles, true);\n }\n dispose() {\n this._buffer.dispose();\n this._quads.dispose();\n this._shader.dispose();\n this._context = null;\n this._gl = null;\n }\n _isFull() {\n if (this._circleCount >= this._maxCircles) {\n return true;\n }\n return false;\n }\n draw(pos, radius, color, stroke = _Color__WEBPACK_IMPORTED_MODULE_6__.Color.Transparent, strokeThickness = 0) {\n if (this._isFull()) {\n this.flush();\n }\n this._circleCount++;\n // transform based on current context\n const transform = this._context.getTransform();\n const opacity = this._context.opacity;\n const snapToPixel = this._context.snapToPixel;\n const topLeft = transform.multiply(pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_7__.vec)(-radius, -radius)));\n const topRight = transform.multiply(pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_7__.vec)(radius, -radius)));\n const bottomRight = transform.multiply(pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_7__.vec)(radius, radius)));\n const bottomLeft = transform.multiply(pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_7__.vec)(-radius, radius)));\n if (snapToPixel) {\n topLeft.x = ~~(topLeft.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n topLeft.y = ~~(topLeft.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n topRight.x = ~~(topRight.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n topRight.y = ~~(topRight.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n bottomLeft.x = ~~(bottomLeft.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n bottomLeft.y = ~~(bottomLeft.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n bottomRight.x = ~~(bottomRight.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n bottomRight.y = ~~(bottomRight.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n }\n // TODO UV could be static vertex buffer\n const uvx0 = 0;\n const uvy0 = 0;\n const uvx1 = 1;\n const uvy1 = 1;\n // update data\n const vertexBuffer = this._layout.vertexBuffer.bufferData;\n // (0, 0) - 0\n vertexBuffer[this._vertexIndex++] = topLeft.x;\n vertexBuffer[this._vertexIndex++] = topLeft.y;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness / radius;\n // (0, 1) - 1\n vertexBuffer[this._vertexIndex++] = bottomLeft.x;\n vertexBuffer[this._vertexIndex++] = bottomLeft.y;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness / radius;\n // (1, 0) - 2\n vertexBuffer[this._vertexIndex++] = topRight.x;\n vertexBuffer[this._vertexIndex++] = topRight.y;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness / radius;\n // (1, 1) - 3\n vertexBuffer[this._vertexIndex++] = bottomRight.x;\n vertexBuffer[this._vertexIndex++] = bottomRight.y;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness / radius;\n }\n hasPendingDraws() {\n return this._circleCount !== 0;\n }\n flush() {\n // nothing to draw early exit\n if (this._circleCount === 0) {\n return;\n }\n const gl = this._gl;\n // Bind the shader\n this._shader.use();\n // Bind the memory layout and upload data\n this._layout.use(true);\n // Update ortho matrix uniform\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n // Bind index buffer\n this._quads.bind();\n // Draw all the quads\n gl.drawElements(gl.TRIANGLES, this._circleCount * 6, this._quads.bufferGlType, 0);\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_9__.GraphicsDiagnostics.DrawnImagesCount += this._circleCount;\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_9__.GraphicsDiagnostics.DrawCallCount++;\n // Reset\n this._circleCount = 0;\n this._vertexIndex = 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/debug-text.ts\":\n/*!****************************************!*\\\n !*** ./Graphics/Context/debug-text.ts ***!\n \\****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DebugText: () => (/* binding */ DebugText)\n/* harmony export */ });\n/* harmony import */ var _ImageSource__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ImageSource */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _SpriteFont__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../SpriteFont */ \"./Graphics/SpriteFont.ts\");\n/* harmony import */ var _SpriteSheet__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../SpriteSheet */ \"./Graphics/SpriteSheet.ts\");\n/* harmony import */ var _debug_font_png__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./debug-font.png */ \"./Graphics/Context/debug-font.png\");\n\n\n\n\n/**\n * Internal debug text helper\n */\nclass DebugText {\n constructor() {\n /**\n * base64 font\n */\n this.fontSheet = _debug_font_png__WEBPACK_IMPORTED_MODULE_0__[\"default\"];\n this.size = 16;\n // We fire and forget, we don't care if it's loaded or not\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.load();\n }\n load() {\n this._imageSource = new _ImageSource__WEBPACK_IMPORTED_MODULE_1__.ImageSource(this.fontSheet);\n return this._imageSource.load().then(() => {\n this._spriteSheet = _SpriteSheet__WEBPACK_IMPORTED_MODULE_2__.SpriteSheet.fromImageSource({\n image: this._imageSource,\n grid: {\n rows: 4,\n columns: 16,\n spriteWidth: 16,\n spriteHeight: 16\n }\n });\n this._spriteFont = new _SpriteFont__WEBPACK_IMPORTED_MODULE_3__.SpriteFont({\n alphabet: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ,!\\'&.\"?-()+# ',\n caseInsensitive: true,\n spriteSheet: this._spriteSheet,\n spacing: -6\n });\n });\n }\n /**\n * Writes debug text using the built in sprint font\n * @param ctx\n * @param text\n * @param pos\n */\n write(ctx, text, pos) {\n if (this._imageSource.isLoaded()) {\n this._spriteFont.render(ctx, text, null, pos.x, pos.y);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/draw-call.ts\":\n/*!***************************************!*\\\n !*** ./Graphics/Context/draw-call.ts ***!\n \\***************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DrawCall: () => (/* binding */ DrawCall)\n/* harmony export */ });\n/* harmony import */ var _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/affine-matrix */ \"./Math/affine-matrix.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Color */ \"./Color.ts\");\n\n\nclass DrawCall {\n constructor() {\n this.z = 0;\n this.priority = 0;\n this.renderer = '';\n this.transform = _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_0__.AffineMatrix.identity();\n this.state = {\n z: 0,\n opacity: 1,\n tint: _Color__WEBPACK_IMPORTED_MODULE_1__.Color.White,\n material: null\n };\n this.args = new Array(10);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/image-renderer-v2/image-renderer-v2.ts\":\n/*!*****************************************************************!*\\\n !*** ./Graphics/Context/image-renderer-v2/image-renderer-v2.ts ***!\n \\*****************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ImageRendererV2: () => (/* binding */ ImageRendererV2)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Color */ \"./Color.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n/* harmony import */ var _ImageSource__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../ImageSource */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../Wrapping */ \"./Graphics/Wrapping.ts\");\n/* harmony import */ var _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _shader__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _vertex_buffer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _webgl_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../webgl-util */ \"./Graphics/Context/webgl-util.ts\");\n/* harmony import */ var _image_renderer_v2_frag_glsl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./image-renderer-v2.frag.glsl */ \"./Graphics/Context/image-renderer-v2/image-renderer-v2.frag.glsl\");\n/* harmony import */ var _image_renderer_v2_vert_glsl__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./image-renderer-v2.vert.glsl */ \"./Graphics/Context/image-renderer-v2/image-renderer-v2.vert.glsl\");\n// import { Color } from '../../../Color';\n// import { parseImageFiltering } from '../../Filtering';\n\n\n\n\n\n\n\n\n\n\n\nclass ImageRendererV2 {\n constructor(options) {\n this.type = 'ex.image-v2';\n this.priority = 0;\n // TODO this could be bigger probably\n this._maxImages = 20000; // max(uint16) / 6 verts\n this._maxTextures = 0;\n this._components = 2 + 2 + 2 + 2 + 1 + 2 + 2 + 1 + 2 + 2 + 4;\n // Per flush vars\n this._imageCount = 0;\n this._textures = [];\n this._textureIndex = 0;\n this._textureToIndex = new Map();\n this._images = new Set();\n this._vertexIndex = 0;\n this._imageToWidth = new Map();\n this._imageToHeight = new Map();\n this._view = [0, 0, 0, 0];\n this._dest = [0, 0];\n this._defaultTint = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.White;\n this.pixelArtSampler = options.pixelArtSampler;\n this.uvPadding = options.uvPadding;\n }\n initialize(gl, context) {\n this._gl = gl;\n this._context = context;\n // Transform shader source\n const maxTexture = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS);\n const maxComplexity = (0,_webgl_util__WEBPACK_IMPORTED_MODULE_1__.getMaxShaderComplexity)(gl, maxTexture);\n this._maxTextures = Math.min(maxTexture, maxComplexity);\n const transformedFrag = this._transformFragmentSource(_image_renderer_v2_frag_glsl__WEBPACK_IMPORTED_MODULE_2__[\"default\"], this._maxTextures);\n // Compile shader\n this._shader = new _shader__WEBPACK_IMPORTED_MODULE_3__.Shader({\n gl,\n fragmentSource: transformedFrag,\n vertexSource: _image_renderer_v2_vert_glsl__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n });\n this._shader.compile();\n // setup uniforms\n this._shader.use();\n this._shader.setUniformMatrix('u_matrix', context.ortho);\n // Initialize texture slots to [0, 1, 2, 3, 4, .... maxGPUTextures]\n this._shader.setUniformIntArray('u_textures', [...Array(this._maxTextures)].map((_, i) => i));\n this._vao = gl.createVertexArray();\n gl.bindVertexArray(this._vao);\n this._quadMesh = new Float32Array([\n // pos uv\n 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0,\n 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1\n ]);\n this._meshBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this._meshBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, this._quadMesh, gl.STATIC_DRAW);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 16, 0);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(1, 2, gl.FLOAT, false, 16, 8);\n gl.enableVertexAttribArray(1);\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n // Setup memory layout\n const components = this._components;\n this._transformData = new _vertex_buffer__WEBPACK_IMPORTED_MODULE_5__.VertexBuffer({\n gl,\n size: components * this._maxImages, // components * images\n type: 'dynamic'\n });\n this._transformData.bind();\n // attributes\n let offset = 0;\n let start = 2;\n const bytesPerFloat = 4;\n const totalSize = components * 4;\n // a_offset vec2 - 2\n gl.vertexAttribPointer(start++, 2, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(2);\n offset += 2 * bytesPerFloat;\n // a_mat_column1 vec2 - 2\n gl.vertexAttribPointer(start++, 2, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(3);\n offset += 2 * bytesPerFloat;\n // a_mat_column2 vec2 - 2\n gl.vertexAttribPointer(start++, 2, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(4);\n offset += 2 * bytesPerFloat;\n // a_mat_column3 vec2 - 2\n gl.vertexAttribPointer(start++, 2, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(5);\n offset += 2 * bytesPerFloat;\n // a_opacity float - 1\n gl.vertexAttribPointer(start++, 1, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(6);\n offset += 1 * bytesPerFloat;\n // a_res vec2 - 2\n gl.vertexAttribPointer(start++, 2, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(7);\n offset += 2 * bytesPerFloat;\n // a_size vec2 - 2\n gl.vertexAttribPointer(start++, 2, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(8);\n offset += 2 * bytesPerFloat;\n // a_texture_index - 1\n gl.vertexAttribPointer(start++, 1, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(9);\n offset += 1 * bytesPerFloat;\n // a_uv_min - 2\n gl.vertexAttribPointer(start++, 2, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(10);\n offset += 2 * bytesPerFloat;\n // a_uv_max - 2\n gl.vertexAttribPointer(start++, 2, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(11);\n offset += 2 * bytesPerFloat;\n // a_tint - 4\n gl.vertexAttribPointer(start++, 4, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(12);\n offset += 4 * bytesPerFloat;\n gl.vertexAttribDivisor(2, 1);\n gl.vertexAttribDivisor(3, 1);\n gl.vertexAttribDivisor(4, 1);\n gl.vertexAttribDivisor(5, 1);\n gl.vertexAttribDivisor(6, 1);\n gl.vertexAttribDivisor(7, 1);\n gl.vertexAttribDivisor(8, 1);\n gl.vertexAttribDivisor(9, 1);\n gl.vertexAttribDivisor(10, 1);\n gl.vertexAttribDivisor(11, 1);\n gl.vertexAttribDivisor(12, 1);\n gl.bindVertexArray(null);\n }\n _bindData(gl) {\n // Setup memory layout\n const components = this._components;\n this._transformData.bind();\n this._transformData.upload(components * this._imageCount);\n gl.bindVertexArray(this._vao);\n }\n dispose() {\n this._transformData.dispose();\n this._shader.dispose();\n this._textures.length = 0;\n this._context = null;\n this._gl = null;\n }\n _transformFragmentSource(source, maxTextures) {\n let newSource = source.replace('%%count%%', maxTextures.toString());\n let texturePickerBuilder = '';\n for (let i = 0; i < maxTextures; i++) {\n if (i === 0) {\n texturePickerBuilder += `if (v_texture_index <= ${i}.5) {\\n`;\n }\n else {\n texturePickerBuilder += ` else if (v_texture_index <= ${i}.5) {\\n`;\n }\n texturePickerBuilder += ` color = texture(u_textures[${i}], uv);\\n`;\n texturePickerBuilder += ` }\\n`;\n }\n newSource = newSource.replace('%%texture_picker%%', texturePickerBuilder);\n return newSource;\n }\n _addImageAsTexture(image) {\n if (this._images.has(image)) {\n return;\n }\n const maybeFiltering = image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_6__.ImageSourceAttributeConstants.Filtering);\n const filtering = maybeFiltering ? (0,_Filtering__WEBPACK_IMPORTED_MODULE_7__.parseImageFiltering)(maybeFiltering) : undefined;\n const wrapX = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_8__.parseImageWrapping)(image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_6__.ImageSourceAttributeConstants.WrappingX));\n const wrapY = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_8__.parseImageWrapping)(image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_6__.ImageSourceAttributeConstants.WrappingY));\n const force = image.getAttribute('forceUpload') === 'true' ? true : false;\n const texture = this._context.textureLoader.load(image, {\n filtering,\n wrapping: { x: wrapX, y: wrapY }\n }, force);\n // remove force attribute after upload\n image.removeAttribute('forceUpload');\n if (this._textures.indexOf(texture) === -1) {\n this._textures.push(texture);\n this._textureToIndex.set(texture, this._textureIndex++);\n this._images.add(image);\n }\n }\n _bindTextures(gl) {\n // Bind textures in the correct order\n const max = Math.min(this._textureIndex, this._maxTextures);\n for (let i = 0; i < max; i++) {\n gl.activeTexture(gl.TEXTURE0 + i);\n gl.bindTexture(gl.TEXTURE_2D, this._textures[i] || this._textures[0]);\n }\n }\n _getTextureIdForImage(image) {\n var _a;\n if (image) {\n const maybeTexture = this._context.textureLoader.get(image);\n return (_a = this._textureToIndex.get(maybeTexture)) !== null && _a !== void 0 ? _a : -1; //this._textures.indexOf(maybeTexture);\n }\n return -1;\n }\n _isFull() {\n if (this._imageCount >= this._maxImages) {\n return true;\n }\n if (this._textures.length >= this._maxTextures) {\n return true;\n }\n return false;\n }\n _getImageWidth(image) {\n let maybeWidth = this._imageToWidth.get(image);\n if (maybeWidth === undefined) {\n maybeWidth = image.width;\n this._imageToWidth.set(image, maybeWidth);\n }\n return maybeWidth;\n }\n _getImageHeight(image) {\n let maybeHeight = this._imageToHeight.get(image);\n if (maybeHeight === undefined) {\n maybeHeight = image.height;\n this._imageToHeight.set(image, maybeHeight);\n }\n return maybeHeight;\n }\n draw(image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight) {\n var _a, _b, _c, _d;\n // Force a render if the batch is full\n if (this._isFull()) {\n this.flush();\n }\n this._imageCount++;\n // This creates and uploads the texture if not already done\n this._addImageAsTexture(image);\n const maybeImageWidth = this._getImageWidth(image);\n const maybeImageHeight = this._getImageHeight(image);\n let width = maybeImageWidth || swidth || 0;\n let height = maybeImageHeight || sheight || 0;\n this._view[0] = 0;\n this._view[1] = 0;\n this._view[2] = (_a = swidth !== null && swidth !== void 0 ? swidth : maybeImageWidth) !== null && _a !== void 0 ? _a : 0;\n this._view[3] = (_b = sheight !== null && sheight !== void 0 ? sheight : maybeImageHeight) !== null && _b !== void 0 ? _b : 0;\n this._dest[0] = sx !== null && sx !== void 0 ? sx : 1;\n this._dest[1] = sy !== null && sy !== void 0 ? sy : 1;\n // If destination is specified, update view and dest\n if (dx !== undefined && dy !== undefined && dwidth !== undefined && dheight !== undefined) {\n this._view[0] = sx !== null && sx !== void 0 ? sx : 1;\n this._view[1] = sy !== null && sy !== void 0 ? sy : 1;\n this._view[2] = (_c = swidth !== null && swidth !== void 0 ? swidth : maybeImageWidth) !== null && _c !== void 0 ? _c : 0;\n this._view[3] = (_d = sheight !== null && sheight !== void 0 ? sheight : maybeImageHeight) !== null && _d !== void 0 ? _d : 0;\n this._dest[0] = dx;\n this._dest[1] = dy;\n width = dwidth;\n height = dheight;\n }\n sx = this._view[0];\n sy = this._view[1];\n const sw = this._view[2];\n const sh = this._view[3];\n // transform based on current context\n const transform = this._context.getTransform();\n const opacity = this._context.opacity;\n const snapToPixel = this._context.snapToPixel;\n if (snapToPixel) {\n this._dest[0] = ~~(this._dest[0] + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_9__.pixelSnapEpsilon);\n this._dest[1] = ~~(this._dest[1] + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_9__.pixelSnapEpsilon);\n }\n const tint = this._context.tint || this._defaultTint;\n const textureId = this._getTextureIdForImage(image);\n const imageWidth = maybeImageWidth || width;\n const imageHeight = maybeImageHeight || height;\n const uvx0 = (sx + this.uvPadding) / imageWidth;\n const uvy0 = (sy + this.uvPadding) / imageHeight;\n const uvx1 = (sx + sw - this.uvPadding) / imageWidth;\n const uvy1 = (sy + sh - this.uvPadding) / imageHeight;\n const txWidth = maybeImageWidth;\n const txHeight = maybeImageHeight;\n // update data\n const vertexBuffer = this._transformData.bufferData;\n vertexBuffer[this._vertexIndex++] = this._dest[0];\n vertexBuffer[this._vertexIndex++] = this._dest[1];\n vertexBuffer[this._vertexIndex++] = transform.data[0];\n vertexBuffer[this._vertexIndex++] = transform.data[1];\n vertexBuffer[this._vertexIndex++] = transform.data[2];\n vertexBuffer[this._vertexIndex++] = transform.data[3];\n vertexBuffer[this._vertexIndex++] = transform.data[4];\n vertexBuffer[this._vertexIndex++] = transform.data[5];\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = width;\n vertexBuffer[this._vertexIndex++] = height;\n vertexBuffer[this._vertexIndex++] = txWidth;\n vertexBuffer[this._vertexIndex++] = txHeight;\n vertexBuffer[this._vertexIndex++] = textureId;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = tint.r / 255;\n vertexBuffer[this._vertexIndex++] = tint.g / 255;\n vertexBuffer[this._vertexIndex++] = tint.b / 255;\n vertexBuffer[this._vertexIndex++] = tint.a;\n }\n hasPendingDraws() {\n return this._imageCount !== 0;\n }\n flush() {\n // nothing to draw early exit\n if (this._imageCount === 0) {\n return;\n }\n const gl = this._gl;\n // Bind the shader\n this._shader.use();\n // Bind the memory layout and upload data\n this._bindData(gl);\n // Update ortho matrix uniform\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n // Turn on pixel art aa sampler\n this._shader.setUniformBoolean('u_pixelart', this.pixelArtSampler);\n // Bind textures to\n this._bindTextures(gl);\n // Draw all the quads\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 6, this._imageCount);\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_10__.GraphicsDiagnostics.DrawnImagesCount += this._imageCount;\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_10__.GraphicsDiagnostics.DrawCallCount++;\n gl.bindVertexArray(null);\n // Reset\n this._imageCount = 0;\n this._vertexIndex = 0;\n this._textures.length = 0;\n this._textureIndex = 0;\n this._textureToIndex.clear();\n this._images.clear();\n this._imageToWidth.clear();\n this._imageToHeight.clear();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/image-renderer/image-renderer.ts\":\n/*!***********************************************************!*\\\n !*** ./Graphics/Context/image-renderer/image-renderer.ts ***!\n \\***********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ImageRenderer: () => (/* binding */ ImageRenderer)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Color */ \"./Color.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n/* harmony import */ var _ImageSource__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../ImageSource */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../Wrapping */ \"./Graphics/Wrapping.ts\");\n/* harmony import */ var _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _quad_index_buffer__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../quad-index-buffer */ \"./Graphics/Context/quad-index-buffer.ts\");\n/* harmony import */ var _shader__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _vertex_buffer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _vertex_layout__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../vertex-layout */ \"./Graphics/Context/vertex-layout.ts\");\n/* harmony import */ var _webgl_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../webgl-util */ \"./Graphics/Context/webgl-util.ts\");\n/* harmony import */ var _image_renderer_frag_glsl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./image-renderer.frag.glsl */ \"./Graphics/Context/image-renderer/image-renderer.frag.glsl\");\n/* harmony import */ var _image_renderer_vert_glsl__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./image-renderer.vert.glsl */ \"./Graphics/Context/image-renderer/image-renderer.vert.glsl\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass ImageRenderer {\n constructor(options) {\n this.type = 'ex.image';\n this.priority = 0;\n this._maxImages = 10922; // max(uint16) / 6 verts\n this._maxTextures = 0;\n // Per flush vars\n this._imageCount = 0;\n this._textures = [];\n this._textureIndex = 0;\n this._textureToIndex = new Map();\n this._images = new Set();\n this._vertexIndex = 0;\n this._imageToWidth = new Map();\n this._imageToHeight = new Map();\n this._view = [0, 0, 0, 0];\n this._dest = [0, 0];\n this._quad = [0, 0, 0, 0, 0, 0, 0, 0];\n this._defaultTint = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.White;\n this.pixelArtSampler = options.pixelArtSampler;\n this.uvPadding = options.uvPadding;\n }\n initialize(gl, context) {\n this._gl = gl;\n this._context = context;\n // Transform shader source\n // FIXME: PIXEL 6 complains `ERROR: Expression too complex.` if we use it's reported max texture units, 125 seems to work for now...\n const maxTexture = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS);\n const maxComplexity = (0,_webgl_util__WEBPACK_IMPORTED_MODULE_1__.getMaxShaderComplexity)(gl, maxTexture);\n this._maxTextures = Math.min(maxTexture, maxComplexity);\n const transformedFrag = this._transformFragmentSource(_image_renderer_frag_glsl__WEBPACK_IMPORTED_MODULE_2__[\"default\"], this._maxTextures);\n // Compile shader\n this._shader = new _shader__WEBPACK_IMPORTED_MODULE_3__.Shader({\n gl,\n fragmentSource: transformedFrag,\n vertexSource: _image_renderer_vert_glsl__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n });\n this._shader.compile();\n // setup uniforms\n this._shader.use();\n this._shader.setUniformMatrix('u_matrix', context.ortho);\n // Initialize texture slots to [0, 1, 2, 3, 4, .... maxGPUTextures]\n this._shader.setUniformIntArray('u_textures', [...Array(this._maxTextures)].map((_, i) => i));\n // Setup memory layout\n this._buffer = new _vertex_buffer__WEBPACK_IMPORTED_MODULE_5__.VertexBuffer({\n gl,\n size: 12 * 4 * this._maxImages, // 12 components * 4 verts\n type: 'dynamic'\n });\n this._layout = new _vertex_layout__WEBPACK_IMPORTED_MODULE_6__.VertexLayout({\n gl,\n shader: this._shader,\n vertexBuffer: this._buffer,\n attributes: [\n ['a_position', 2],\n ['a_opacity', 1],\n ['a_res', 2],\n ['a_texcoord', 2],\n ['a_textureIndex', 1],\n ['a_tint', 4]\n ]\n });\n // Setup index buffer\n this._quads = new _quad_index_buffer__WEBPACK_IMPORTED_MODULE_7__.QuadIndexBuffer(gl, this._maxImages, true);\n }\n dispose() {\n this._buffer.dispose();\n this._quads.dispose();\n this._shader.dispose();\n this._textures.length = 0;\n this._context = null;\n this._gl = null;\n }\n _transformFragmentSource(source, maxTextures) {\n let newSource = source.replace('%%count%%', maxTextures.toString());\n let texturePickerBuilder = '';\n for (let i = 0; i < maxTextures; i++) {\n if (i === 0) {\n texturePickerBuilder += `if (v_textureIndex <= ${i}.5) {\\n`;\n }\n else {\n texturePickerBuilder += ` else if (v_textureIndex <= ${i}.5) {\\n`;\n }\n texturePickerBuilder += ` vec2 uv = u_pixelart ? uv_iq(v_texcoord, v_res) : v_texcoord;\\n`;\n texturePickerBuilder += ` color = texture(u_textures[${i}], uv);\\n`;\n texturePickerBuilder += ` }\\n`;\n }\n newSource = newSource.replace('%%texture_picker%%', texturePickerBuilder);\n return newSource;\n }\n _addImageAsTexture(image) {\n if (this._images.has(image)) {\n return;\n }\n const maybeFiltering = image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_8__.ImageSourceAttributeConstants.Filtering);\n const filtering = maybeFiltering ? (0,_Filtering__WEBPACK_IMPORTED_MODULE_9__.parseImageFiltering)(maybeFiltering) : undefined;\n const wrapX = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_10__.parseImageWrapping)(image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_8__.ImageSourceAttributeConstants.WrappingX));\n const wrapY = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_10__.parseImageWrapping)(image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_8__.ImageSourceAttributeConstants.WrappingY));\n const force = image.getAttribute('forceUpload') === 'true' ? true : false;\n const texture = this._context.textureLoader.load(image, {\n filtering,\n wrapping: { x: wrapX, y: wrapY }\n }, force);\n // remove force attribute after upload\n image.removeAttribute('forceUpload');\n if (this._textures.indexOf(texture) === -1) {\n this._textures.push(texture);\n this._textureToIndex.set(texture, this._textureIndex++);\n this._images.add(image);\n }\n }\n _bindTextures(gl) {\n // Bind textures in the correct order\n for (let i = 0; i < this._maxTextures; i++) {\n gl.activeTexture(gl.TEXTURE0 + i);\n gl.bindTexture(gl.TEXTURE_2D, this._textures[i] || this._textures[0]);\n }\n }\n _getTextureIdForImage(image) {\n var _a;\n if (image) {\n const maybeTexture = this._context.textureLoader.get(image);\n return (_a = this._textureToIndex.get(maybeTexture)) !== null && _a !== void 0 ? _a : -1; //this._textures.indexOf(maybeTexture);\n }\n return -1;\n }\n _isFull() {\n if (this._imageCount >= this._maxImages) {\n return true;\n }\n if (this._textures.length >= this._maxTextures) {\n return true;\n }\n return false;\n }\n _getImageWidth(image) {\n let maybeWidth = this._imageToWidth.get(image);\n if (maybeWidth === undefined) {\n maybeWidth = image.width;\n this._imageToWidth.set(image, maybeWidth);\n }\n return maybeWidth;\n }\n _getImageHeight(image) {\n let maybeHeight = this._imageToHeight.get(image);\n if (maybeHeight === undefined) {\n maybeHeight = image.height;\n this._imageToHeight.set(image, maybeHeight);\n }\n return maybeHeight;\n }\n draw(image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight) {\n var _a, _b, _c, _d;\n // Force a render if the batch is full\n if (this._isFull()) {\n this.flush();\n }\n this._imageCount++;\n // This creates and uploads the texture if not already done\n this._addImageAsTexture(image);\n const maybeImageWidth = this._getImageWidth(image);\n const maybeImageHeight = this._getImageHeight(image);\n let width = maybeImageWidth || swidth || 0;\n let height = maybeImageHeight || sheight || 0;\n this._view[0] = 0;\n this._view[1] = 0;\n this._view[2] = (_a = swidth !== null && swidth !== void 0 ? swidth : maybeImageWidth) !== null && _a !== void 0 ? _a : 0;\n this._view[3] = (_b = sheight !== null && sheight !== void 0 ? sheight : maybeImageHeight) !== null && _b !== void 0 ? _b : 0;\n this._dest[0] = sx !== null && sx !== void 0 ? sx : 1;\n this._dest[1] = sy !== null && sy !== void 0 ? sy : 1;\n // If destination is specified, update view and dest\n if (dx !== undefined && dy !== undefined && dwidth !== undefined && dheight !== undefined) {\n this._view[0] = sx !== null && sx !== void 0 ? sx : 1;\n this._view[1] = sy !== null && sy !== void 0 ? sy : 1;\n this._view[2] = (_c = swidth !== null && swidth !== void 0 ? swidth : maybeImageWidth) !== null && _c !== void 0 ? _c : 0;\n this._view[3] = (_d = sheight !== null && sheight !== void 0 ? sheight : maybeImageHeight) !== null && _d !== void 0 ? _d : 0;\n this._dest[0] = dx;\n this._dest[1] = dy;\n width = dwidth;\n height = dheight;\n }\n sx = this._view[0];\n sy = this._view[1];\n const sw = this._view[2];\n const sh = this._view[3];\n // transform based on current context\n const transform = this._context.getTransform();\n const opacity = this._context.opacity;\n const snapToPixel = this._context.snapToPixel;\n // top left\n this._quad[0] = this._dest[0];\n this._quad[1] = this._dest[1];\n // top right\n this._quad[2] = this._dest[0] + width;\n this._quad[3] = this._dest[1];\n // bottom left\n this._quad[4] = this._dest[0];\n this._quad[5] = this._dest[1] + height;\n // bottom right\n this._quad[6] = this._dest[0] + width;\n this._quad[7] = this._dest[1] + height;\n transform.multiplyQuadInPlace(this._quad);\n if (snapToPixel) {\n this._quad[0] = ~~(this._quad[0] + (0,_Math_util__WEBPACK_IMPORTED_MODULE_11__.sign)(this._quad[0]) * _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__.pixelSnapEpsilon);\n this._quad[1] = ~~(this._quad[1] + (0,_Math_util__WEBPACK_IMPORTED_MODULE_11__.sign)(this._quad[1]) * _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__.pixelSnapEpsilon);\n this._quad[2] = ~~(this._quad[2] + (0,_Math_util__WEBPACK_IMPORTED_MODULE_11__.sign)(this._quad[2]) * _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__.pixelSnapEpsilon);\n this._quad[3] = ~~(this._quad[3] + (0,_Math_util__WEBPACK_IMPORTED_MODULE_11__.sign)(this._quad[3]) * _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__.pixelSnapEpsilon);\n this._quad[4] = ~~(this._quad[4] + (0,_Math_util__WEBPACK_IMPORTED_MODULE_11__.sign)(this._quad[4]) * _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__.pixelSnapEpsilon);\n this._quad[5] = ~~(this._quad[5] + (0,_Math_util__WEBPACK_IMPORTED_MODULE_11__.sign)(this._quad[5]) * _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__.pixelSnapEpsilon);\n this._quad[6] = ~~(this._quad[6] + (0,_Math_util__WEBPACK_IMPORTED_MODULE_11__.sign)(this._quad[6]) * _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__.pixelSnapEpsilon);\n this._quad[7] = ~~(this._quad[7] + (0,_Math_util__WEBPACK_IMPORTED_MODULE_11__.sign)(this._quad[7]) * _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__.pixelSnapEpsilon);\n }\n const tint = this._context.tint || this._defaultTint;\n const textureId = this._getTextureIdForImage(image);\n const imageWidth = maybeImageWidth || width;\n const imageHeight = maybeImageHeight || height;\n const uvx0 = (sx + this.uvPadding) / imageWidth;\n const uvy0 = (sy + this.uvPadding) / imageHeight;\n const uvx1 = (sx + sw - this.uvPadding) / imageWidth;\n const uvy1 = (sy + sh - this.uvPadding) / imageHeight;\n const txWidth = maybeImageWidth;\n const txHeight = maybeImageHeight;\n // update data\n const vertexBuffer = this._layout.vertexBuffer.bufferData;\n // (0, 0) - 0\n vertexBuffer[this._vertexIndex++] = this._quad[0];\n vertexBuffer[this._vertexIndex++] = this._quad[1];\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = txWidth;\n vertexBuffer[this._vertexIndex++] = txHeight;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = textureId;\n vertexBuffer[this._vertexIndex++] = tint.r / 255;\n vertexBuffer[this._vertexIndex++] = tint.g / 255;\n vertexBuffer[this._vertexIndex++] = tint.b / 255;\n vertexBuffer[this._vertexIndex++] = tint.a;\n // (0, 1) - 1\n vertexBuffer[this._vertexIndex++] = this._quad[4];\n vertexBuffer[this._vertexIndex++] = this._quad[5];\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = txWidth;\n vertexBuffer[this._vertexIndex++] = txHeight;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = textureId;\n vertexBuffer[this._vertexIndex++] = tint.r / 255;\n vertexBuffer[this._vertexIndex++] = tint.g / 255;\n vertexBuffer[this._vertexIndex++] = tint.b / 255;\n vertexBuffer[this._vertexIndex++] = tint.a;\n // (1, 0) - 2\n vertexBuffer[this._vertexIndex++] = this._quad[2];\n vertexBuffer[this._vertexIndex++] = this._quad[3];\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = txWidth;\n vertexBuffer[this._vertexIndex++] = txHeight;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = textureId;\n vertexBuffer[this._vertexIndex++] = tint.r / 255;\n vertexBuffer[this._vertexIndex++] = tint.g / 255;\n vertexBuffer[this._vertexIndex++] = tint.b / 255;\n vertexBuffer[this._vertexIndex++] = tint.a;\n // (1, 1) - 3\n vertexBuffer[this._vertexIndex++] = this._quad[6];\n vertexBuffer[this._vertexIndex++] = this._quad[7];\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = txWidth;\n vertexBuffer[this._vertexIndex++] = txHeight;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = textureId;\n vertexBuffer[this._vertexIndex++] = tint.r / 255;\n vertexBuffer[this._vertexIndex++] = tint.g / 255;\n vertexBuffer[this._vertexIndex++] = tint.b / 255;\n vertexBuffer[this._vertexIndex++] = tint.a;\n }\n hasPendingDraws() {\n return this._imageCount !== 0;\n }\n flush() {\n // nothing to draw early exit\n if (this._imageCount === 0) {\n return;\n }\n const gl = this._gl;\n // Bind the shader\n this._shader.use();\n // Bind the memory layout and upload data\n this._layout.use(true, 4 * 12 * this._imageCount); // 4 verts * 12 components\n // Update ortho matrix uniform\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n // Turn on pixel art aa sampler\n this._shader.setUniformBoolean('u_pixelart', this.pixelArtSampler);\n // Bind textures to\n this._bindTextures(gl);\n // Bind index buffer\n this._quads.bind();\n // Draw all the quads\n gl.drawElements(gl.TRIANGLES, this._imageCount * 6, this._quads.bufferGlType, 0);\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_13__.GraphicsDiagnostics.DrawnImagesCount += this._imageCount;\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_13__.GraphicsDiagnostics.DrawCallCount++;\n // Reset\n this._imageCount = 0;\n this._vertexIndex = 0;\n this._textures.length = 0;\n this._textureIndex = 0;\n this._textureToIndex.clear();\n this._images.clear();\n this._imageToWidth.clear();\n this._imageToHeight.clear();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/line-renderer/line-renderer.ts\":\n/*!*********************************************************!*\\\n !*** ./Graphics/Context/line-renderer/line-renderer.ts ***!\n \\*********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ LineRenderer: () => (/* binding */ LineRenderer)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _line_vertex_glsl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./line-vertex.glsl */ \"./Graphics/Context/line-renderer/line-vertex.glsl\");\n/* harmony import */ var _line_fragment_glsl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./line-fragment.glsl */ \"./Graphics/Context/line-renderer/line-fragment.glsl\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../.. */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../.. */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../.. */ \"./Graphics/Context/vertex-layout.ts\");\n/* harmony import */ var _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n\n\n\n\n\nclass LineRenderer {\n constructor() {\n this.type = 'ex.line';\n this.priority = 0;\n this._maxLines = 10922;\n this._vertexIndex = 0;\n this._lineCount = 0;\n this._startScratch = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n this._endScratch = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n }\n initialize(gl, context) {\n this._gl = gl;\n this._context = context;\n this._shader = new ___WEBPACK_IMPORTED_MODULE_1__.Shader({\n gl,\n vertexSource: _line_vertex_glsl__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n fragmentSource: _line_fragment_glsl__WEBPACK_IMPORTED_MODULE_3__[\"default\"]\n });\n this._shader.compile();\n this._shader.use();\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n this._vertexBuffer = new ___WEBPACK_IMPORTED_MODULE_4__.VertexBuffer({\n gl,\n size: 6 * 2 * this._maxLines,\n type: 'dynamic'\n });\n this._layout = new ___WEBPACK_IMPORTED_MODULE_5__.VertexLayout({\n gl,\n vertexBuffer: this._vertexBuffer,\n shader: this._shader,\n attributes: [\n ['a_position', 2],\n ['a_color', 4]\n ]\n });\n }\n dispose() {\n this._vertexBuffer.dispose();\n this._shader.dispose();\n this._context = null;\n this._gl = null;\n }\n draw(start, end, color) {\n // Force a render if the batch is full\n if (this._isFull()) {\n this.flush();\n }\n this._lineCount++;\n const transform = this._context.getTransform();\n const finalStart = transform.multiply(start, this._startScratch);\n const finalEnd = transform.multiply(end, this._endScratch);\n const vertexBuffer = this._vertexBuffer.bufferData;\n // Start\n vertexBuffer[this._vertexIndex++] = finalStart.x;\n vertexBuffer[this._vertexIndex++] = finalStart.y;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n // End\n vertexBuffer[this._vertexIndex++] = finalEnd.x;\n vertexBuffer[this._vertexIndex++] = finalEnd.y;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n }\n _isFull() {\n if (this._lineCount >= this._maxLines) {\n return true;\n }\n return false;\n }\n hasPendingDraws() {\n return this._lineCount !== 0;\n }\n flush() {\n // nothing to draw early exit\n if (this._lineCount === 0) {\n return;\n }\n const gl = this._gl;\n this._shader.use();\n this._layout.use(true);\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n gl.drawArrays(gl.LINES, 0, this._lineCount * 2); // 2 verts per line\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_6__.GraphicsDiagnostics.DrawnImagesCount += this._lineCount;\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_6__.GraphicsDiagnostics.DrawCallCount++;\n // reset\n this._vertexIndex = 0;\n this._lineCount = 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/material-renderer/material-renderer.ts\":\n/*!*****************************************************************!*\\\n !*** ./Graphics/Context/material-renderer/material-renderer.ts ***!\n \\*****************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MaterialRenderer: () => (/* binding */ MaterialRenderer)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n/* harmony import */ var _ImageSource__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../ImageSource */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../Wrapping */ \"./Graphics/Wrapping.ts\");\n/* harmony import */ var _quad_index_buffer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../quad-index-buffer */ \"./Graphics/Context/quad-index-buffer.ts\");\n/* harmony import */ var _vertex_buffer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _vertex_layout__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../vertex-layout */ \"./Graphics/Context/vertex-layout.ts\");\n\n\n\n\n\n\n\n\nclass MaterialRenderer {\n constructor() {\n this.type = 'ex.material';\n this.priority = 0;\n this._textures = [];\n }\n initialize(gl, context) {\n this._gl = gl;\n this._context = context;\n // Setup memory layout\n this._buffer = new _vertex_buffer__WEBPACK_IMPORTED_MODULE_0__.VertexBuffer({\n gl,\n size: 6 * 4, // 6 components * 4 verts\n type: 'dynamic'\n });\n // Setup a vertex layout/buffer to the material\n this._layout = new _vertex_layout__WEBPACK_IMPORTED_MODULE_1__.VertexLayout({\n gl,\n vertexBuffer: this._buffer,\n attributes: [\n ['a_position', 2],\n ['a_uv', 2],\n ['a_screenuv', 2]\n ],\n suppressWarnings: true\n });\n // Setup index buffer\n this._quads = new _quad_index_buffer__WEBPACK_IMPORTED_MODULE_2__.QuadIndexBuffer(gl, 1, true);\n }\n dispose() {\n this._buffer.dispose();\n this._quads.dispose();\n this._textures.length = 0;\n this._context = null;\n this._gl = null;\n }\n draw(image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight) {\n var _a, _b, _c, _d;\n const gl = this._gl;\n // Extract context info\n const material = this._context.material;\n if (!material) {\n return;\n }\n const transform = this._context.getTransform();\n const opacity = this._context.opacity;\n // material shader\n const shader = material.getShader();\n // construct geometry, or hold on to it in the material?\n // geometry primitive for drawing rectangles?\n // update data\n const vertexBuffer = this._layout.vertexBuffer.bufferData;\n let vertexIndex = 0;\n let width = (image === null || image === void 0 ? void 0 : image.width) || swidth || 0;\n let height = (image === null || image === void 0 ? void 0 : image.height) || sheight || 0;\n let view = [0, 0, (_a = swidth !== null && swidth !== void 0 ? swidth : image === null || image === void 0 ? void 0 : image.width) !== null && _a !== void 0 ? _a : 0, (_b = sheight !== null && sheight !== void 0 ? sheight : image === null || image === void 0 ? void 0 : image.height) !== null && _b !== void 0 ? _b : 0];\n let dest = [sx !== null && sx !== void 0 ? sx : 1, sy !== null && sy !== void 0 ? sy : 1];\n // If destination is specified, update view and dest\n if (dx !== undefined && dy !== undefined && dwidth !== undefined && dheight !== undefined) {\n view = [sx !== null && sx !== void 0 ? sx : 1, sy !== null && sy !== void 0 ? sy : 1, (_c = swidth !== null && swidth !== void 0 ? swidth : image === null || image === void 0 ? void 0 : image.width) !== null && _c !== void 0 ? _c : 0, (_d = sheight !== null && sheight !== void 0 ? sheight : image === null || image === void 0 ? void 0 : image.height) !== null && _d !== void 0 ? _d : 0];\n dest = [dx, dy];\n width = dwidth;\n height = dheight;\n }\n sx = view[0];\n sy = view[1];\n const sw = view[2];\n const sh = view[3];\n const topLeft = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(dest[0], dest[1]);\n const topRight = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(dest[0] + width, dest[1]);\n const bottomLeft = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(dest[0], dest[1] + height);\n const bottomRight = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(dest[0] + width, dest[1] + height);\n const imageWidth = image.width || width;\n const imageHeight = image.height || height;\n const uvx0 = sx / imageWidth;\n const uvy0 = sy / imageHeight;\n const uvx1 = (sx + sw - 0.01) / imageWidth;\n const uvy1 = (sy + sh - 0.01) / imageHeight;\n const topLeftScreen = transform.getPosition();\n const bottomRightScreen = topLeftScreen.add(bottomRight);\n const screenUVX0 = topLeftScreen.x / this._context.width;\n const screenUVY0 = topLeftScreen.y / this._context.height;\n const screenUVX1 = bottomRightScreen.x / this._context.width;\n const screenUVY1 = bottomRightScreen.y / this._context.height;\n // (0, 0) - 0\n vertexBuffer[vertexIndex++] = topLeft.x;\n vertexBuffer[vertexIndex++] = topLeft.y;\n vertexBuffer[vertexIndex++] = uvx0;\n vertexBuffer[vertexIndex++] = uvy0;\n vertexBuffer[vertexIndex++] = screenUVX0;\n vertexBuffer[vertexIndex++] = screenUVY0;\n // (0, 1) - 1\n vertexBuffer[vertexIndex++] = bottomLeft.x;\n vertexBuffer[vertexIndex++] = bottomLeft.y;\n vertexBuffer[vertexIndex++] = uvx0;\n vertexBuffer[vertexIndex++] = uvy1;\n vertexBuffer[vertexIndex++] = screenUVX0;\n vertexBuffer[vertexIndex++] = screenUVY1;\n // (1, 0) - 2\n vertexBuffer[vertexIndex++] = topRight.x;\n vertexBuffer[vertexIndex++] = topRight.y;\n vertexBuffer[vertexIndex++] = uvx1;\n vertexBuffer[vertexIndex++] = uvy0;\n vertexBuffer[vertexIndex++] = screenUVX1;\n vertexBuffer[vertexIndex++] = screenUVY0;\n // (1, 1) - 3\n vertexBuffer[vertexIndex++] = bottomRight.x;\n vertexBuffer[vertexIndex++] = bottomRight.y;\n vertexBuffer[vertexIndex++] = uvx1;\n vertexBuffer[vertexIndex++] = uvy1;\n vertexBuffer[vertexIndex++] = screenUVX1;\n vertexBuffer[vertexIndex++] = screenUVY1;\n // This creates and uploads the texture if not already done\n const texture = this._addImageAsTexture(image);\n // apply material\n material.use();\n this._layout.shader = shader;\n // apply layout and geometry\n this._layout.use(true);\n // apply time in ms since the page (performance.now())\n shader.trySetUniformFloat('u_time_ms', performance.now());\n // apply opacity\n shader.trySetUniformFloat('u_opacity', opacity);\n // apply resolution\n shader.trySetUniformFloatVector('u_resolution', (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this._context.width, this._context.height));\n // apply graphic resolution\n shader.trySetUniformFloatVector('u_graphic_resolution', (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(imageWidth, imageHeight));\n // apply size\n shader.trySetUniformFloatVector('u_size', (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(sw, sh));\n // apply orthographic projection\n shader.trySetUniformMatrix('u_matrix', this._context.ortho);\n // apply geometry transform\n shader.trySetUniformMatrix('u_transform', transform.to4x4());\n // bind graphic image texture 'uniform sampler2D u_graphic;'\n gl.activeTexture(gl.TEXTURE0 + 0);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n shader.trySetUniformInt('u_graphic', 0);\n // bind the screen texture\n gl.activeTexture(gl.TEXTURE0 + 1);\n gl.bindTexture(gl.TEXTURE_2D, this._context.materialScreenTexture);\n shader.trySetUniformInt('u_screen_texture', 1);\n // bind any additional textures in the material\n material.uploadAndBind(gl);\n // bind quad index buffer\n this._quads.bind();\n // Draw a single quad\n gl.drawElements(gl.TRIANGLES, 6, this._quads.bufferGlType, 0);\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_4__.GraphicsDiagnostics.DrawnImagesCount++;\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_4__.GraphicsDiagnostics.DrawCallCount++;\n }\n _addImageAsTexture(image) {\n const maybeFiltering = image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_5__.ImageSourceAttributeConstants.Filtering);\n const filtering = maybeFiltering ? (0,_Filtering__WEBPACK_IMPORTED_MODULE_6__.parseImageFiltering)(maybeFiltering) : undefined;\n const wrapX = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_7__.parseImageWrapping)(image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_5__.ImageSourceAttributeConstants.WrappingX));\n const wrapY = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_7__.parseImageWrapping)(image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_5__.ImageSourceAttributeConstants.WrappingY));\n const force = image.getAttribute('forceUpload') === 'true' ? true : false;\n const texture = this._context.textureLoader.load(image, {\n filtering,\n wrapping: { x: wrapX, y: wrapY }\n }, force);\n // remove force attribute after upload\n image.removeAttribute('forceUpload');\n if (this._textures.indexOf(texture) === -1) {\n this._textures.push(texture);\n }\n return texture;\n }\n hasPendingDraws() {\n return false;\n }\n flush() {\n // flush does not do anything, material renderer renders immediately per draw\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/material.ts\":\n/*!**************************************!*\\\n !*** ./Graphics/Context/material.ts ***!\n \\**************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Material: () => (/* binding */ Material)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Color */ \"./Color.ts\");\n/* harmony import */ var _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _ImageSource__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ImageSource */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Wrapping */ \"./Graphics/Wrapping.ts\");\n\n\n\n\n\n\nconst defaultVertexSource = `#version 300 es\r\nin vec2 a_position;\r\n\r\nin vec2 a_uv;\r\nout vec2 v_uv;\r\n\r\nin vec2 a_screenuv;\r\nout vec2 v_screenuv;\r\n\r\nuniform mat4 u_matrix;\r\nuniform mat4 u_transform;\r\n\r\nvoid main() {\r\n // Set the vertex position using the ortho & transform matrix\r\n gl_Position = u_matrix * u_transform * vec4(a_position, 0.0, 1.0);\r\n\r\n // Pass through the UV coord to the fragment shader\r\n v_uv = a_uv;\r\n v_screenuv = a_screenuv;\r\n}\r\n`;\nclass Material {\n constructor(options) {\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance();\n this._color = _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Transparent;\n this._initialized = false;\n this._images = new Map();\n this._textures = new Map();\n const { color, name, vertexSource, fragmentSource, graphicsContext, images } = options;\n this._name = name !== null && name !== void 0 ? name : 'anonymous material';\n this._vertexSource = vertexSource !== null && vertexSource !== void 0 ? vertexSource : defaultVertexSource;\n this._fragmentSource = fragmentSource;\n this._color = color !== null && color !== void 0 ? color : this._color;\n if (!graphicsContext) {\n throw Error(`Material ${name} must be provided an excalibur webgl graphics context`);\n }\n if (graphicsContext instanceof _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_2__.ExcaliburGraphicsContextWebGL) {\n this._graphicsContext = graphicsContext;\n this._initialize(graphicsContext);\n }\n else {\n this._logger.warn(`Material ${name} was created in 2D Canvas mode, currently only WebGL is supported`);\n }\n if (images) {\n for (const key in images) {\n this.addImageSource(key, images[key]);\n }\n }\n }\n _initialize(graphicsContextWebGL) {\n if (this._initialized) {\n return;\n }\n const gl = graphicsContextWebGL.__gl;\n // max texture slots - 2 for the graphic texture and screen texture\n this._maxTextureSlots = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS) - 2;\n this._shader = graphicsContextWebGL.createShader({\n vertexSource: this._vertexSource,\n fragmentSource: this._fragmentSource\n });\n this._shader.compile();\n this._initialized = true;\n }\n get color() {\n return this._color;\n }\n set color(c) {\n this._color = c;\n }\n get name() {\n var _a;\n return (_a = this._name) !== null && _a !== void 0 ? _a : 'anonymous material';\n }\n get isUsingScreenTexture() {\n return this._fragmentSource.includes('u_screen_texture');\n }\n update(callback) {\n if (this._shader) {\n this._shader.use();\n callback(this._shader);\n }\n }\n getShader() {\n return this._shader;\n }\n addImageSource(textureUniformName, image) {\n if (this._images.size < this._maxTextureSlots) {\n this._images.set(textureUniformName, image);\n }\n else {\n this._logger.warn(`Max number texture slots ${this._maxTextureSlots} have been reached for material \"${this.name}\", ` +\n `no more textures will be uploaded due to hardware constraints.`);\n }\n }\n removeImageSource(textureName) {\n const image = this._images.get(textureName);\n this._graphicsContext.textureLoader.delete(image.image);\n this._images.delete(textureName);\n }\n _loadImageSource(image) {\n const imageElement = image.image;\n const maybeFiltering = imageElement.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_3__.ImageSourceAttributeConstants.Filtering);\n const filtering = maybeFiltering ? (0,_Filtering__WEBPACK_IMPORTED_MODULE_4__.parseImageFiltering)(maybeFiltering) : undefined;\n const wrapX = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_5__.parseImageWrapping)(imageElement.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_3__.ImageSourceAttributeConstants.WrappingX));\n const wrapY = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_5__.parseImageWrapping)(imageElement.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_3__.ImageSourceAttributeConstants.WrappingY));\n const force = imageElement.getAttribute('forceUpload') === 'true' ? true : false;\n const texture = this._graphicsContext.textureLoader.load(imageElement, {\n filtering,\n wrapping: { x: wrapX, y: wrapY }\n }, force);\n // remove force attribute after upload\n imageElement.removeAttribute('forceUpload');\n if (!this._textures.has(image)) {\n this._textures.set(image, texture);\n }\n return texture;\n }\n uploadAndBind(gl, startingTextureSlot = 2) {\n let textureSlot = startingTextureSlot;\n for (const [textureName, image] of this._images.entries()) {\n if (!image.isLoaded()) {\n this._logger.warnOnce(`Image named ${textureName} in material ${this.name} not loaded, nothing will be uploaded to the shader.` +\n ` Did you forget to add this to a loader? https://excaliburjs.com/docs/loaders/`);\n continue;\n } // skip unloaded images, maybe warn\n const texture = this._loadImageSource(image);\n gl.activeTexture(gl.TEXTURE0 + textureSlot);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n this._shader.trySetUniformInt(textureName, textureSlot);\n textureSlot++;\n }\n }\n use() {\n if (this._initialized) {\n // bind the shader\n this._shader.use();\n // Apply standard uniforms\n this._shader.trySetUniformFloatColor('u_color', this._color);\n }\n else {\n throw Error(`Material ${this.name} not yet initialized, use the ExcaliburGraphicsContext.createMaterial() to work around this.`);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/particle-renderer/particle-renderer.ts\":\n/*!*****************************************************************!*\\\n !*** ./Graphics/Context/particle-renderer/particle-renderer.ts ***!\n \\*****************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ParticleRenderer: () => (/* binding */ ParticleRenderer)\n/* harmony export */ });\n/* harmony import */ var _shader__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _particle_vertex_glsl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./particle-vertex.glsl */ \"./Graphics/Context/particle-renderer/particle-vertex.glsl\");\n/* harmony import */ var _particle_fragment_glsl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./particle-fragment.glsl */ \"./Graphics/Context/particle-renderer/particle-fragment.glsl\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../../Color */ \"./Color.ts\");\n/* harmony import */ var _ImageSource__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../ImageSource */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Wrapping */ \"./Graphics/Wrapping.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Particles_Particles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../Particles/Particles */ \"./Particles/Particles.ts\");\n\n\n\n\n\n\n\n\n\nclass ParticleRenderer {\n constructor() {\n this.type = 'ex.particle';\n this.priority = 0;\n }\n initialize(gl, context) {\n this._gl = gl;\n this._context = context;\n this._shader = new _shader__WEBPACK_IMPORTED_MODULE_0__.Shader({\n gl,\n vertexSource: _particle_vertex_glsl__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n fragmentSource: _particle_fragment_glsl__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n onPreLink: (program) => {\n gl.transformFeedbackVaryings(program, ['finalPosition', 'finalVelocity', 'finalRotation', 'finalAngularVelocity', 'finalLifeMs'], gl.INTERLEAVED_ATTRIBS);\n }\n });\n this._shader.compile();\n this._shader.use();\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n }\n _getTexture(image) {\n const maybeFiltering = image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_3__.ImageSourceAttributeConstants.Filtering);\n const filtering = maybeFiltering ? (0,_Filtering__WEBPACK_IMPORTED_MODULE_4__.parseImageFiltering)(maybeFiltering) : undefined;\n const wrapX = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_5__.parseImageWrapping)(image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_3__.ImageSourceAttributeConstants.WrappingX));\n const wrapY = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_5__.parseImageWrapping)(image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_3__.ImageSourceAttributeConstants.WrappingY));\n const force = image.getAttribute('forceUpload') === 'true' ? true : false;\n const texture = this._context.textureLoader.load(image, {\n filtering,\n wrapping: { x: wrapX, y: wrapY }\n }, force);\n // remove force attribute after upload\n image.removeAttribute('forceUpload');\n return texture;\n }\n draw(renderer, elapsed) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j;\n const gl = this._gl;\n this._shader.use();\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n const transform = renderer.particle.transform === _Particles_Particles__WEBPACK_IMPORTED_MODULE_6__.ParticleTransform.Local\n ? this._context.getTransform()\n : this._context.getTransform().multiply(renderer.emitter.transform.get().inverse);\n this._shader.setUniformAffineMatrix('u_transform', transform);\n this._shader.setUniformBoolean('fade', renderer.particle.fade ? true : false);\n this._shader.setUniformBoolean('useTexture', renderer.particle.graphic ? true : false);\n this._shader.setUniformFloat('maxLifeMs', (_a = renderer.particle.life) !== null && _a !== void 0 ? _a : 2000);\n this._shader.setUniformFloat('deltaMs', elapsed);\n this._shader.setUniformFloatVector('gravity', (_b = renderer.particle.acc) !== null && _b !== void 0 ? _b : (0,_Math_vector__WEBPACK_IMPORTED_MODULE_7__.vec)(0, 0));\n this._shader.setUniformFloatColor('beginColor', (_c = renderer.particle.beginColor) !== null && _c !== void 0 ? _c : _Color__WEBPACK_IMPORTED_MODULE_8__.Color.Transparent);\n this._shader.setUniformFloatColor('endColor', (_d = renderer.particle.endColor) !== null && _d !== void 0 ? _d : _Color__WEBPACK_IMPORTED_MODULE_8__.Color.Transparent);\n let startSize = (_e = renderer.particle.startSize) !== null && _e !== void 0 ? _e : 0;\n let endSize = (_f = renderer.particle.endSize) !== null && _f !== void 0 ? _f : 0;\n const size = (_g = renderer.particle.size) !== null && _g !== void 0 ? _g : 0;\n if (size > 0) {\n startSize = size;\n endSize = size;\n }\n this._shader.setUniformFloat('startSize', startSize !== null && startSize !== void 0 ? startSize : 10);\n this._shader.setUniformFloat('endSize', endSize !== null && endSize !== void 0 ? endSize : 10);\n this._shader.setUniformFloat('startOpacity', (_h = renderer.particle.opacity) !== null && _h !== void 0 ? _h : 1);\n if (renderer.particle.focus) {\n this._shader.setUniformFloatVector('focus', renderer.particle.focus);\n this._shader.setUniformFloat('focusAccel', (_j = renderer.particle.focusAccel) !== null && _j !== void 0 ? _j : 0);\n }\n // Particle Graphic (only Sprites right now)\n if (renderer.particle.graphic) {\n const graphic = renderer.particle.graphic;\n const texture = this._getTexture(graphic.image.image);\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n this._shader.setUniformInt('graphic', 0);\n }\n // Collision Mask\n // gl.activeTexture(gl.TEXTURE0 + 1);\n // gl.bindTexture(gl.TEXTURE_2D, obstacleTex);\n // gl.uniform1i(u_obstacle, 1);\n renderer.draw(gl);\n }\n hasPendingDraws() {\n return false;\n }\n flush() {\n // pass\n }\n dispose() {\n // pass\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/point-renderer/point-renderer.ts\":\n/*!***********************************************************!*\\\n !*** ./Graphics/Context/point-renderer/point-renderer.ts ***!\n \\***********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointRenderer: () => (/* binding */ PointRenderer)\n/* harmony export */ });\n/* harmony import */ var _point_vertex_glsl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./point-vertex.glsl */ \"./Graphics/Context/point-renderer/point-vertex.glsl\");\n/* harmony import */ var _point_fragment_glsl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./point-fragment.glsl */ \"./Graphics/Context/point-renderer/point-fragment.glsl\");\n/* harmony import */ var _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _shader__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _vertex_buffer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _vertex_layout__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../vertex-layout */ \"./Graphics/Context/vertex-layout.ts\");\n/* harmony import */ var _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n\n\n\n\n\n\n\nclass PointRenderer {\n constructor() {\n this.type = 'ex.point';\n this.priority = 0;\n this._maxPoints = 10922;\n this._pointCount = 0;\n this._vertexIndex = 0;\n }\n initialize(gl, context) {\n this._gl = gl;\n this._context = context;\n this._shader = new _shader__WEBPACK_IMPORTED_MODULE_0__.Shader({\n gl,\n vertexSource: _point_vertex_glsl__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n fragmentSource: _point_fragment_glsl__WEBPACK_IMPORTED_MODULE_2__[\"default\"]\n });\n this._shader.compile();\n this._shader.use();\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n this._buffer = new _vertex_buffer__WEBPACK_IMPORTED_MODULE_3__.VertexBuffer({\n gl,\n size: 7 * this._maxPoints,\n type: 'dynamic'\n });\n this._layout = new _vertex_layout__WEBPACK_IMPORTED_MODULE_4__.VertexLayout({\n gl,\n shader: this._shader,\n vertexBuffer: this._buffer,\n attributes: [\n ['a_position', 2],\n ['a_color', 4],\n ['a_size', 1]\n ]\n });\n }\n dispose() {\n this._buffer.dispose();\n this._shader.dispose();\n this._context = null;\n this._gl = null;\n }\n draw(point, color, size) {\n // Force a render if the batch is full\n if (this._isFull()) {\n this.flush();\n }\n this._pointCount++;\n const transform = this._context.getTransform();\n const opacity = this._context.opacity;\n const snapToPixel = this._context.snapToPixel;\n const finalPoint = transform.multiply(point);\n if (snapToPixel) {\n finalPoint.x = ~~(finalPoint.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_5__.pixelSnapEpsilon);\n finalPoint.y = ~~(finalPoint.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_5__.pixelSnapEpsilon);\n }\n const vertexBuffer = this._buffer.bufferData;\n vertexBuffer[this._vertexIndex++] = finalPoint.x;\n vertexBuffer[this._vertexIndex++] = finalPoint.y;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a * opacity;\n vertexBuffer[this._vertexIndex++] = size * Math.max(transform.getScaleX(), transform.getScaleY());\n }\n _isFull() {\n if (this._pointCount >= this._maxPoints) {\n return true;\n }\n return false;\n }\n hasPendingDraws() {\n return this._pointCount !== 0;\n }\n flush() {\n // nothing to draw early exit\n if (this._pointCount === 0) {\n return;\n }\n const gl = this._gl;\n this._shader.use();\n this._layout.use(true);\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n gl.drawArrays(gl.POINTS, 0, this._pointCount);\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_6__.GraphicsDiagnostics.DrawnImagesCount += this._pointCount;\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_6__.GraphicsDiagnostics.DrawCallCount++;\n this._pointCount = 0;\n this._vertexIndex = 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/quad-index-buffer.ts\":\n/*!***********************************************!*\\\n !*** ./Graphics/Context/quad-index-buffer.ts ***!\n \\***********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ QuadIndexBuffer: () => (/* binding */ QuadIndexBuffer)\n/* harmony export */ });\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../.. */ \"./Util/Log.ts\");\n\n/**\n * Helper that defines and index buffer for quad geometry\n *\n * Index buffers allow you to save space in vertex buffers when you share vertices in geometry\n * it is almost always worth it in terms of performance to use an index buffer.\n */\nclass QuadIndexBuffer {\n /**\n * @param gl WebGL2RenderingContext this layout will be attached to, these cannot be reused across contexts.\n * @param numberOfQuads Specify the max number of quads you want to draw\n * @param useUint16 Optionally force a uint16 buffer\n */\n constructor(gl, numberOfQuads, useUint16) {\n this._logger = ___WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance();\n this._gl = gl;\n this.buffer = gl.createBuffer();\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.buffer);\n const totalVertices = numberOfQuads * 6;\n if (!useUint16) {\n this.bufferData = new Uint32Array(totalVertices);\n }\n else {\n // fall back to using gl.UNSIGNED_SHORT or tell the user they are out of luck\n const maxUint16 = 65535;\n const maxUint16Index = Math.floor((maxUint16 - 1) / 4); // max quads\n this.bufferGlType = gl.UNSIGNED_SHORT;\n this.bufferData = new Uint16Array(totalVertices);\n // TODO Should we error if this happens?? maybe not might crash mid game\n if (numberOfQuads > maxUint16Index) {\n this._logger.warn(`Total quads exceeds hardware index buffer limit (uint16), max(${maxUint16Index}) requested quads(${numberOfQuads})`);\n }\n }\n let currentQuad = 0;\n for (let i = 0; i < totalVertices; i += 6) {\n // first triangle\n this.bufferData[i + 0] = currentQuad + 0;\n this.bufferData[i + 1] = currentQuad + 1;\n this.bufferData[i + 2] = currentQuad + 2;\n // second triangle\n this.bufferData[i + 3] = currentQuad + 2;\n this.bufferData[i + 4] = currentQuad + 1;\n this.bufferData[i + 5] = currentQuad + 3;\n currentQuad += 4;\n }\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.bufferData, gl.STATIC_DRAW);\n }\n get size() {\n return this.bufferData.length;\n }\n /**\n * Upload data to the GPU\n */\n upload() {\n const gl = this._gl;\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.buffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.bufferData, gl.STATIC_DRAW);\n }\n /**\n * Bind this index buffer\n */\n bind() {\n const gl = this._gl;\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.buffer);\n }\n dispose() {\n const gl = this._gl;\n gl.deleteBuffer(this.buffer);\n this._gl = null;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/rectangle-renderer/rectangle-renderer.ts\":\n/*!*******************************************************************!*\\\n !*** ./Graphics/Context/rectangle-renderer/rectangle-renderer.ts ***!\n \\*******************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RectangleRenderer: () => (/* binding */ RectangleRenderer)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Color */ \"./Color.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n/* harmony import */ var _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _quad_index_buffer__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../quad-index-buffer */ \"./Graphics/Context/quad-index-buffer.ts\");\n/* harmony import */ var _shader__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _vertex_buffer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _vertex_layout__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../vertex-layout */ \"./Graphics/Context/vertex-layout.ts\");\n/* harmony import */ var _rectangle_renderer_frag_glsl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./rectangle-renderer.frag.glsl */ \"./Graphics/Context/rectangle-renderer/rectangle-renderer.frag.glsl\");\n/* harmony import */ var _rectangle_renderer_vert_glsl__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./rectangle-renderer.vert.glsl */ \"./Graphics/Context/rectangle-renderer/rectangle-renderer.vert.glsl\");\n\n\n\n\n\n\n\n\n\n\nclass RectangleRenderer {\n constructor() {\n this.type = 'ex.rectangle';\n this.priority = 0;\n this._maxRectangles = 10922; // max(uint16) / 6 verts\n this._rectangleCount = 0;\n this._vertexIndex = 0;\n this._transparent = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Transparent;\n this._scratch1 = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0);\n this._scratch2 = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0);\n this._scratch3 = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0);\n this._scratch4 = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0);\n }\n initialize(gl, context) {\n this._gl = gl;\n this._context = context;\n // https://stackoverflow.com/questions/59197671/glsl-rounded-rectangle-with-variable-border\n this._shader = new _shader__WEBPACK_IMPORTED_MODULE_2__.Shader({\n gl,\n fragmentSource: _rectangle_renderer_frag_glsl__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n vertexSource: _rectangle_renderer_vert_glsl__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n });\n this._shader.compile();\n // setup uniforms\n this._shader.use();\n this._shader.setUniformMatrix('u_matrix', context.ortho);\n this._buffer = new _vertex_buffer__WEBPACK_IMPORTED_MODULE_5__.VertexBuffer({\n gl,\n size: 16 * 4 * this._maxRectangles,\n type: 'dynamic'\n });\n this._layout = new _vertex_layout__WEBPACK_IMPORTED_MODULE_6__.VertexLayout({\n gl,\n shader: this._shader,\n vertexBuffer: this._buffer,\n attributes: [\n ['a_position', 2],\n ['a_uv', 2],\n ['a_size', 2],\n ['a_opacity', 1],\n ['a_color', 4],\n ['a_strokeColor', 4],\n ['a_strokeThickness', 1]\n ]\n });\n this._quads = new _quad_index_buffer__WEBPACK_IMPORTED_MODULE_7__.QuadIndexBuffer(gl, this._maxRectangles, true);\n }\n dispose() {\n this._buffer.dispose();\n this._quads.dispose();\n this._shader.dispose();\n this._context = null;\n this._gl = null;\n }\n _isFull() {\n if (this._rectangleCount >= this._maxRectangles) {\n return true;\n }\n return false;\n }\n draw(...args) {\n if (args[0] instanceof _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector && args[1] instanceof _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector) {\n this.drawLine.apply(this, args);\n }\n else {\n this.drawRectangle.apply(this, args);\n }\n }\n drawLine(start, end, color, thickness = 1) {\n if (this._isFull()) {\n this.flush();\n }\n this._rectangleCount++;\n // transform based on current context\n const transform = this._context.getTransform();\n const opacity = this._context.opacity;\n const snapToPixel = this._context.snapToPixel;\n const dir = end.sub(start);\n const length = dir.magnitude;\n const normal = dir.normalize().perpendicular();\n const halfThick = thickness / 2;\n /**\n * +---------------------^----------------------+\n * | | (normal) |\n * (startX, startY)------------------>(endX, endY)\n * | |\n * + -------------------------------------------+\n */\n const startTop = transform.multiply(normal.scale(halfThick, this._scratch1).add(start, this._scratch1), this._scratch1);\n const startBottom = transform.multiply(normal.scale(-halfThick, this._scratch2).add(start, this._scratch2), this._scratch2);\n const endTop = transform.multiply(normal.scale(halfThick, this._scratch3).add(end, this._scratch3), this._scratch3);\n const endBottom = transform.multiply(normal.scale(-halfThick, this._scratch4).add(end, this._scratch4), this._scratch4);\n if (snapToPixel) {\n startTop.x = ~~(startTop.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n startTop.y = ~~(startTop.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n endTop.x = ~~(endTop.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n endTop.y = ~~(endTop.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n startBottom.x = ~~(startBottom.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n startBottom.y = ~~(startBottom.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n endBottom.x = ~~(endBottom.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n endBottom.y = ~~(endBottom.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n }\n // TODO uv could be static vertex buffer\n const uvx0 = 0;\n const uvy0 = 0;\n const uvx1 = 1;\n const uvy1 = 1;\n const stroke = this._transparent;\n const strokeThickness = 0;\n const width = 1;\n // update data\n const vertexBuffer = this._layout.vertexBuffer.bufferData;\n // (0, 0) - 0\n vertexBuffer[this._vertexIndex++] = startTop.x;\n vertexBuffer[this._vertexIndex++] = startTop.y;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = length;\n vertexBuffer[this._vertexIndex++] = thickness;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness / width;\n // (0, 1) - 1\n vertexBuffer[this._vertexIndex++] = startBottom.x;\n vertexBuffer[this._vertexIndex++] = startBottom.y;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = length;\n vertexBuffer[this._vertexIndex++] = thickness;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness / width;\n // (1, 0) - 2\n vertexBuffer[this._vertexIndex++] = endTop.x;\n vertexBuffer[this._vertexIndex++] = endTop.y;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = length;\n vertexBuffer[this._vertexIndex++] = thickness;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness / width;\n // (1, 1) - 3\n vertexBuffer[this._vertexIndex++] = endBottom.x;\n vertexBuffer[this._vertexIndex++] = endBottom.y;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = length;\n vertexBuffer[this._vertexIndex++] = thickness;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness / width;\n }\n drawRectangle(pos, width, height, color, stroke = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Transparent, strokeThickness = 0) {\n if (this._isFull()) {\n this.flush();\n }\n this._rectangleCount++;\n // transform based on current context\n const transform = this._context.getTransform();\n const opacity = this._context.opacity;\n const snapToPixel = this._context.snapToPixel;\n const topLeft = transform.multiply(pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0)));\n const topRight = transform.multiply(pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(width, 0)));\n const bottomRight = transform.multiply(pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(width, height)));\n const bottomLeft = transform.multiply(pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, height)));\n if (snapToPixel) {\n topLeft.x = ~~(topLeft.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n topLeft.y = ~~(topLeft.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n topRight.x = ~~(topRight.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n topRight.y = ~~(topRight.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n bottomLeft.x = ~~(bottomLeft.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n bottomLeft.y = ~~(bottomLeft.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n bottomRight.x = ~~(bottomRight.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n bottomRight.y = ~~(bottomRight.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n }\n // TODO uv could be static vertex buffer\n const uvx0 = 0;\n const uvy0 = 0;\n const uvx1 = 1;\n const uvy1 = 1;\n // update data\n const vertexBuffer = this._layout.vertexBuffer.bufferData;\n // (0, 0) - 0\n vertexBuffer[this._vertexIndex++] = topLeft.x;\n vertexBuffer[this._vertexIndex++] = topLeft.y;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = width;\n vertexBuffer[this._vertexIndex++] = height;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness;\n // (0, 1) - 1\n vertexBuffer[this._vertexIndex++] = bottomLeft.x;\n vertexBuffer[this._vertexIndex++] = bottomLeft.y;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = width;\n vertexBuffer[this._vertexIndex++] = height;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness;\n // (1, 0) - 2\n vertexBuffer[this._vertexIndex++] = topRight.x;\n vertexBuffer[this._vertexIndex++] = topRight.y;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = width;\n vertexBuffer[this._vertexIndex++] = height;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness;\n // (1, 1) - 3\n vertexBuffer[this._vertexIndex++] = bottomRight.x;\n vertexBuffer[this._vertexIndex++] = bottomRight.y;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = width;\n vertexBuffer[this._vertexIndex++] = height;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness;\n }\n hasPendingDraws() {\n return this._rectangleCount !== 0;\n }\n flush() {\n // nothing to draw early exit\n if (this._rectangleCount === 0) {\n return;\n }\n const gl = this._gl;\n // Bind the shader\n this._shader.use();\n // Bind the memory layout and upload data\n this._layout.use(true);\n // Update ortho matrix uniform\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n // Bind index buffer\n this._quads.bind();\n // Draw all the quads\n gl.drawElements(gl.TRIANGLES, this._rectangleCount * 6, this._quads.bufferGlType, 0);\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_9__.GraphicsDiagnostics.DrawnImagesCount += this._rectangleCount;\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_9__.GraphicsDiagnostics.DrawCallCount++;\n // Reset\n this._rectangleCount = 0;\n this._vertexIndex = 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/render-source.ts\":\n/*!*******************************************!*\\\n !*** ./Graphics/Context/render-source.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RenderSource: () => (/* binding */ RenderSource)\n/* harmony export */ });\nclass RenderSource {\n constructor(_gl, _texture) {\n this._gl = _gl;\n this._texture = _texture;\n }\n use() {\n const gl = this._gl;\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, this._texture);\n }\n disable() {\n const gl = this._gl;\n gl.bindTexture(gl.TEXTURE_2D, null);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/render-target.ts\":\n/*!*******************************************!*\\\n !*** ./Graphics/Context/render-target.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RenderTarget: () => (/* binding */ RenderTarget)\n/* harmony export */ });\n/* harmony import */ var _render_source__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./render-source */ \"./Graphics/Context/render-source.ts\");\n\nclass RenderTarget {\n constructor(options) {\n var _a, _b;\n this.antialias = false;\n this.samples = 1;\n this._gl = options.gl;\n this.width = options.width;\n this.height = options.height;\n this.transparency = options.transparency;\n this.antialias = (_a = options.antialias) !== null && _a !== void 0 ? _a : this.antialias;\n this.samples = (_b = options.samples) !== null && _b !== void 0 ? _b : this._gl.getParameter(this._gl.MAX_SAMPLES);\n const gl = this._gl;\n // Determine current context format for blitting later needs to match\n if (gl.drawingBufferFormat) {\n this.bufferFormat = gl.drawingBufferFormat;\n }\n else {\n // Documented in webgl spec\n // https://registry.khronos.org/webgl/specs/latest/1.0/\n if (this.transparency) {\n this.bufferFormat = gl.RGBA8;\n }\n else {\n this.bufferFormat = gl.RGB8;\n }\n }\n this._setupRenderBuffer();\n this._setupFramebuffer();\n }\n setResolution(width, height) {\n const gl = this._gl;\n this.width = width;\n this.height = height;\n // update backing texture size\n gl.bindTexture(gl.TEXTURE_2D, this._frameTexture);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n // update render buffer size\n if (this._renderBuffer) {\n gl.bindRenderbuffer(gl.RENDERBUFFER, this._renderBuffer);\n gl.renderbufferStorageMultisample(gl.RENDERBUFFER, Math.min(this.samples, gl.getParameter(gl.MAX_SAMPLES)), this.bufferFormat, this.width, this.height);\n }\n }\n get renderBuffer() {\n return this._renderBuffer;\n }\n get renderFrameBuffer() {\n return this._renderFrameBuffer;\n }\n get frameBuffer() {\n return this._frameBuffer;\n }\n get frameTexture() {\n return this._frameTexture;\n }\n _setupRenderBuffer() {\n if (this.antialias) {\n const gl = this._gl;\n // Render buffers can be used as an input to a shader\n this._renderBuffer = gl.createRenderbuffer();\n this._renderFrameBuffer = gl.createFramebuffer();\n gl.bindRenderbuffer(gl.RENDERBUFFER, this._renderBuffer);\n gl.renderbufferStorageMultisample(gl.RENDERBUFFER, Math.min(this.samples, gl.getParameter(gl.MAX_SAMPLES)), this.bufferFormat, this.width, this.height);\n gl.bindFramebuffer(gl.FRAMEBUFFER, this._renderFrameBuffer);\n gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, this._renderBuffer);\n }\n }\n _setupFramebuffer() {\n // Allocates frame buffer\n const gl = this._gl;\n this._frameTexture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, this._frameTexture);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n // set the filtering so we don't need mips\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n // attach the texture as the first color attachment\n const attachmentPoint = gl.COLOR_ATTACHMENT0;\n // After this bind all draw calls will draw to this framebuffer texture\n this._frameBuffer = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, this._frameBuffer);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, attachmentPoint, gl.TEXTURE_2D, this._frameTexture, 0);\n // Reset after initialized\n this.disable();\n }\n toRenderSource() {\n if (this.renderBuffer) {\n this.blitRenderBufferToFrameBuffer();\n }\n const source = new _render_source__WEBPACK_IMPORTED_MODULE_0__.RenderSource(this._gl, this._frameTexture);\n return source;\n }\n blitToScreen() {\n const gl = this._gl;\n // set to size of canvas's drawingBuffer\n if (this._renderBuffer) {\n gl.bindFramebuffer(gl.READ_FRAMEBUFFER, this.renderFrameBuffer);\n gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, null);\n gl.clearBufferfv(gl.COLOR, 0, [0.0, 0.0, 1.0, 1.0]);\n gl.blitFramebuffer(0, 0, this.width, this.height, 0, 0, this.width, this.height, gl.COLOR_BUFFER_BIT, gl.LINEAR);\n }\n else {\n gl.bindFramebuffer(gl.READ_FRAMEBUFFER, this.frameBuffer);\n gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, null);\n gl.clearBufferfv(gl.COLOR, 0, [0.0, 0.0, 1.0, 1.0]);\n gl.blitFramebuffer(0, 0, this.width, this.height, 0, 0, this.width, this.height, gl.COLOR_BUFFER_BIT, gl.LINEAR);\n }\n }\n blitRenderBufferToFrameBuffer() {\n if (this._renderBuffer) {\n const gl = this._gl;\n gl.bindFramebuffer(gl.READ_FRAMEBUFFER, this.renderFrameBuffer);\n gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, this.frameBuffer);\n gl.clearBufferfv(gl.COLOR, 0, [0.0, 0.0, 1.0, 1.0]);\n gl.blitFramebuffer(0, 0, this.width, this.height, 0, 0, this.width, this.height, gl.COLOR_BUFFER_BIT, gl.LINEAR);\n }\n }\n copyToTexture(texture) {\n const gl = this._gl;\n if (this._renderBuffer) {\n this.blitRenderBufferToFrameBuffer();\n }\n gl.bindFramebuffer(gl.FRAMEBUFFER, this._frameBuffer);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.copyTexImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 0, 0, this.width, this.height, 0);\n }\n /**\n * When called, all drawing gets redirected to this render target\n */\n use() {\n const gl = this._gl;\n if (this.antialias) {\n gl.bindFramebuffer(gl.FRAMEBUFFER, this._renderFrameBuffer);\n }\n else {\n gl.bindFramebuffer(gl.FRAMEBUFFER, this._frameBuffer);\n }\n // very important to set the viewport to the size of the framebuffer texture\n gl.viewport(0, 0, this.width, this.height);\n }\n /**\n * When called, all drawing is sent back to the canvas\n */\n disable() {\n const gl = this._gl;\n // passing null switches rendering back to the canvas\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.bindTexture(gl.TEXTURE_2D, null);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/screen-pass-painter/screen-pass-painter.ts\":\n/*!*********************************************************************!*\\\n !*** ./Graphics/Context/screen-pass-painter/screen-pass-painter.ts ***!\n \\*********************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ScreenPassPainter: () => (/* binding */ ScreenPassPainter)\n/* harmony export */ });\n/* harmony import */ var _screen_vertex_glsl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./screen-vertex.glsl */ \"./Graphics/Context/screen-pass-painter/screen-vertex.glsl\");\n/* harmony import */ var _screen_fragment_glsl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./screen-fragment.glsl */ \"./Graphics/Context/screen-pass-painter/screen-fragment.glsl\");\n/* harmony import */ var _shader__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _vertex_buffer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _vertex_layout__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../vertex-layout */ \"./Graphics/Context/vertex-layout.ts\");\n\n\n\n\n\n/**\n * This is responsible for painting the entire screen during the render passes\n */\nclass ScreenPassPainter {\n constructor(gl) {\n this._gl = gl;\n this._shader = new _shader__WEBPACK_IMPORTED_MODULE_0__.Shader({\n gl,\n vertexSource: _screen_vertex_glsl__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n fragmentSource: _screen_fragment_glsl__WEBPACK_IMPORTED_MODULE_2__[\"default\"]\n });\n this._shader.compile();\n // Setup memory layout\n this._buffer = new _vertex_buffer__WEBPACK_IMPORTED_MODULE_3__.VertexBuffer({\n gl,\n type: 'static',\n // clip space quad + uv since we don't need a camera\n data: new Float32Array([\n -1, -1, 0, 0, -1, 1, 0, 1, 1, -1, 1, 0,\n 1, -1, 1, 0, -1, 1, 0, 1, 1, 1, 1, 1\n ])\n });\n this._layout = new _vertex_layout__WEBPACK_IMPORTED_MODULE_4__.VertexLayout({\n gl,\n shader: this._shader,\n vertexBuffer: this._buffer,\n attributes: [\n ['a_position', 2],\n ['a_texcoord', 2]\n ]\n });\n this._buffer.upload();\n }\n renderWithPostProcessor(postprocessor) {\n const gl = this._gl;\n postprocessor.getShader().use();\n postprocessor.getLayout().use();\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n }\n renderToScreen() {\n const gl = this._gl;\n this._shader.use();\n this._layout.use();\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/shader.ts\":\n/*!************************************!*\\\n !*** ./Graphics/Context/shader.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Shader: () => (/* binding */ Shader)\n/* harmony export */ });\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../.. */ \"./Util/Log.ts\");\n/* harmony import */ var _webgl_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./webgl-util */ \"./Graphics/Context/webgl-util.ts\");\n\n\nclass Shader {\n get compiled() {\n return this._compiled;\n }\n /**\n * Create a shader program in excalibur\n * @param options specify shader vertex and fragment source\n */\n constructor(options) {\n this._logger = ___WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance();\n this.uniforms = {};\n this.attributes = {};\n this._compiled = false;\n const { gl, vertexSource, fragmentSource, onPreLink, onPostCompile } = options;\n this._gl = gl;\n this.vertexSource = vertexSource;\n this.fragmentSource = fragmentSource;\n this._onPreLink = onPreLink;\n this._onPostCompile = onPostCompile;\n }\n dispose() {\n const gl = this._gl;\n gl.deleteProgram(this.program);\n this._gl = null;\n }\n /**\n * Binds the shader program\n */\n use() {\n const gl = this._gl;\n gl.useProgram(this.program);\n Shader._ACTIVE_SHADER_INSTANCE = this;\n }\n isCurrentlyBound() {\n return Shader._ACTIVE_SHADER_INSTANCE === this;\n }\n /**\n * Compile the current shader against a webgl context\n */\n compile() {\n const gl = this._gl;\n const vertexShader = this._compileShader(gl, this.vertexSource, gl.VERTEX_SHADER);\n const fragmentShader = this._compileShader(gl, this.fragmentSource, gl.FRAGMENT_SHADER);\n this.program = this._createProgram(gl, vertexShader, fragmentShader);\n const attributes = this.getAttributes();\n for (const attribute of attributes) {\n this.attributes[attribute.name] = attribute;\n }\n const uniforms = this.getUniforms();\n for (const uniform of uniforms) {\n this.uniforms[uniform.name] = uniform;\n }\n this._compiled = true;\n if (this._onPostCompile) {\n this._onPostCompile(this);\n }\n return this.program;\n }\n getUniforms() {\n const gl = this._gl;\n const uniformCount = gl.getProgramParameter(this.program, gl.ACTIVE_UNIFORMS);\n const uniforms = [];\n for (let i = 0; i < uniformCount; i++) {\n const uniform = gl.getActiveUniform(this.program, i);\n const uniformLocation = gl.getUniformLocation(this.program, uniform.name);\n uniforms.push({\n name: uniform.name,\n glType: uniform.type,\n location: uniformLocation\n });\n }\n return uniforms;\n }\n getAttributes() {\n const gl = this._gl;\n const attributeCount = gl.getProgramParameter(this.program, gl.ACTIVE_ATTRIBUTES);\n const attributes = [];\n for (let i = 0; i < attributeCount; i++) {\n const attribute = gl.getActiveAttrib(this.program, i);\n const attributeLocation = gl.getAttribLocation(this.program, attribute.name);\n attributes.push({\n name: attribute.name,\n glType: (0,_webgl_util__WEBPACK_IMPORTED_MODULE_1__.getAttributePointerType)(gl, attribute.type),\n size: (0,_webgl_util__WEBPACK_IMPORTED_MODULE_1__.getAttributeComponentSize)(gl, attribute.type),\n location: attributeLocation,\n normalized: false\n });\n }\n return attributes;\n }\n /**\n * Set a texture in a gpu texture slot\n * @param slotNumber\n * @param texture\n */\n setTexture(slotNumber, texture) {\n const gl = this._gl;\n gl.activeTexture(gl.TEXTURE0 + slotNumber);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n }\n /**\n * Set an integer uniform for the current shader\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n setUniformInt(name, value) {\n this.setUniform('uniform1i', name, ~~value);\n }\n /**\n * Set an integer uniform for the current shader, WILL NOT THROW on error.\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n trySetUniformInt(name, value) {\n return this.trySetUniform('uniform1i', name, ~~value);\n }\n /**\n * Set an integer array uniform for the current shader\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n setUniformIntArray(name, value) {\n this.setUniform('uniform1iv', name, value);\n }\n /**\n * Set an integer array uniform for the current shader, WILL NOT THROW on error.\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n trySetUniformIntArray(name, value) {\n return this.trySetUniform('uniform1iv', name, value);\n }\n /**\n * Set a boolean uniform for the current shader\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n setUniformBoolean(name, value) {\n this.setUniform('uniform1i', name, value ? 1 : 0);\n }\n /**\n * Set a boolean uniform for the current shader, WILL NOT THROW on error.\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n trySetUniformBoolean(name, value) {\n return this.trySetUniform('uniform1i', name, value ? 1 : 0);\n }\n /**\n * Set a float uniform for the current shader\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n setUniformFloat(name, value) {\n this.setUniform('uniform1f', name, value);\n }\n /**\n * Set a float uniform for the current shader, WILL NOT THROW on error.\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n trySetUniformFloat(name, value) {\n return this.trySetUniform('uniform1f', name, value);\n }\n /**\n * Set a float array uniform for the current shader\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n setUniformFloatArray(name, value) {\n this.setUniform('uniform1fv', name, value);\n }\n /**\n * Set a float array uniform for the current shader, WILL NOT THROW on error.\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n trySetUniformFloatArray(name, value) {\n return this.trySetUniform('uniform1fv', name, value);\n }\n /**\n * Set a {@apilink Vector} uniform for the current shader\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n setUniformFloatVector(name, value) {\n this.setUniform('uniform2f', name, value.x, value.y);\n }\n /**\n * Set a {@apilink Vector} uniform for the current shader, WILL NOT THROW on error.\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n trySetUniformFloatVector(name, value) {\n return this.trySetUniform('uniform2f', name, value.x, value.y);\n }\n /**\n * Set a {@apilink Color} uniform for the current shader\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n setUniformFloatColor(name, value) {\n this.setUniform('uniform4f', name, value.r / 255, value.g / 255, value.b / 255, value.a);\n }\n /**\n * Set a {@apilink Color} uniform for the current shader, WILL NOT THROW on error.\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n trySetUniformFloatColor(name, value) {\n return this.trySetUniform('uniform4f', name, value.r / 255, value.g / 255, value.b / 255, value.a);\n }\n /**\n * Set an {@apilink Matrix} uniform for the current shader\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n setUniformMatrix(name, value) {\n this.setUniform('uniformMatrix4fv', name, false, value.data);\n }\n setUniformAffineMatrix(name, value) {\n this.setUniform('uniformMatrix4fv', name, false, [\n value.data[0],\n value.data[1],\n 0,\n 0,\n value.data[2],\n value.data[3],\n 0,\n 0,\n 0,\n 0,\n 1,\n 0,\n value.data[4],\n value.data[5],\n 0,\n 1\n ]);\n }\n /**\n * Set an {@apilink Matrix} uniform for the current shader, WILL NOT THROW on error.\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n trySetUniformMatrix(name, value) {\n return this.trySetUniform('uniformMatrix4fv', name, false, value.data);\n }\n /**\n * Set any available uniform type in webgl\n *\n * For example setUniform('uniformMatrix2fv', 'u_my2x2_mat`, ...);\n */\n setUniform(uniformType, name, ...value) {\n if (!this._compiled) {\n throw Error(`Must compile shader before setting a uniform ${uniformType}:${name}`);\n }\n if (!this.isCurrentlyBound()) {\n throw Error('Currently accessed shader instance is not the current active shader in WebGL,' +\n ' must call `shader.use()` before setting uniforms');\n }\n const gl = this._gl;\n const location = gl.getUniformLocation(this.program, name);\n if (location) {\n const args = [location, ...value];\n this._gl[uniformType].apply(this._gl, args);\n }\n else {\n throw Error(`Uniform ${uniformType}:${name} doesn\\'t exist or is not used in the shader source code,` +\n ' unused uniforms are optimized away by most browsers');\n }\n }\n /**\n * Set any available uniform type in webgl. Will try to set the uniform, will return false if the uniform didn't exist,\n * true if it was set.\n *\n * WILL NOT THROW on error\n *\n * For example setUniform('uniformMatrix2fv', 'u_my2x2_mat`, ...);\n *\n */\n trySetUniform(uniformType, name, ...value) {\n if (!this._compiled) {\n this._logger.warn(`Must compile shader before setting a uniform ${uniformType}:${name}`);\n return false;\n }\n if (!this.isCurrentlyBound()) {\n this._logger.warn('Currently accessed shader instance is not the current active shader in WebGL,' +\n ' must call `shader.use()` before setting uniforms');\n return false;\n }\n const gl = this._gl;\n const location = gl.getUniformLocation(this.program, name);\n if (location) {\n const args = [location, ...value];\n this._gl[uniformType].apply(this._gl, args);\n }\n else {\n return false;\n }\n return true;\n }\n _createProgram(gl, vertexShader, fragmentShader) {\n const program = gl.createProgram();\n if (program === null) {\n throw Error('Could not create graphics shader program');\n }\n // attach the shaders.\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n if (this._onPreLink) {\n this._onPreLink(program);\n }\n // link the program.\n gl.linkProgram(program);\n const success = gl.getProgramParameter(program, gl.LINK_STATUS);\n if (!success) {\n throw Error(`Could not link the program: [${gl.getProgramInfoLog(program)}]`);\n }\n return program;\n }\n _compileShader(gl, source, type) {\n const typeName = gl.VERTEX_SHADER === type ? 'vertex' : 'fragment';\n const shader = gl.createShader(type);\n if (shader === null) {\n throw Error(`Could not build shader: [${source}]`);\n }\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n const success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n if (!success) {\n const errorInfo = gl.getShaderInfoLog(shader);\n throw Error(`Could not compile ${typeName} shader:\\n\\n${errorInfo}${this._processSourceForError(source, errorInfo)}`);\n }\n return shader;\n }\n _processSourceForError(source, errorInfo) {\n if (!source) {\n return errorInfo;\n }\n const lines = source.split('\\n');\n const errorLineStart = errorInfo.search(/\\d:\\d/);\n const errorLineEnd = errorInfo.indexOf(' ', errorLineStart);\n const [_, error2] = errorInfo\n .slice(errorLineStart, errorLineEnd)\n .split(':')\n .map((v) => Number(v));\n for (let i = 0; i < lines.length; i++) {\n lines[i] = `${i + 1}: ${lines[i]}${error2 === i + 1 ? ' <----- ERROR!' : ''}`;\n }\n return '\\n\\nSource:\\n' + lines.join('\\n');\n }\n}\nShader._ACTIVE_SHADER_INSTANCE = null;\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/state-stack.ts\":\n/*!*****************************************!*\\\n !*** ./Graphics/Context/state-stack.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ContextState: () => (/* binding */ ContextState),\n/* harmony export */ StateStack: () => (/* binding */ StateStack)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Color */ \"./Color.ts\");\n/* harmony import */ var _Util_RentalPool__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Util/RentalPool */ \"./Util/RentalPool.ts\");\n\n\nclass ContextState {\n constructor() {\n this.opacity = 1;\n this.z = 0;\n this.tint = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.White;\n this.material = null;\n }\n}\nclass StateStack {\n constructor() {\n this._pool = new _Util_RentalPool__WEBPACK_IMPORTED_MODULE_1__.RentalPool(() => new ContextState(), (s) => {\n s.opacity = 1;\n s.z = 0;\n s.tint = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.White;\n s.material = null;\n return s;\n }, 100);\n this.current = this._pool.rent(true);\n this._states = [];\n }\n _cloneState(dest) {\n var _a;\n dest.opacity = this.current.opacity;\n dest.z = this.current.z;\n dest.tint = (_a = this.current.tint) === null || _a === void 0 ? void 0 : _a.clone();\n dest.material = this.current.material; // TODO is this going to cause problems when cloning\n return dest;\n }\n save() {\n this._states.push(this.current);\n this.current = this._cloneState(this._pool.rent());\n }\n restore() {\n this._pool.return(this.current);\n this.current = this._states.pop();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/texture-loader.ts\":\n/*!********************************************!*\\\n !*** ./Graphics/Context/texture-loader.ts ***!\n \\********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TextureLoader: () => (/* binding */ TextureLoader)\n/* harmony export */ });\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Wrapping */ \"./Graphics/Wrapping.ts\");\n\n\n\n/**\n * Manages loading image sources into webgl textures, a unique id is associated with all sources\n */\nclass TextureLoader {\n constructor(gl, _garbageCollector) {\n var _a;\n this._garbageCollector = _garbageCollector;\n this._textureMap = new Map();\n /**\n * Looks for textures that haven't been drawn in a while\n */\n this._collect = (image) => {\n var _a;\n if (this._gl) {\n const name = (_a = image.dataset.originalSrc) !== null && _a !== void 0 ? _a : image.constructor.name;\n TextureLoader._LOGGER.debug(`WebGL Texture for ${name} collected`);\n this.delete(image);\n return true;\n }\n return false;\n };\n this._gl = gl;\n TextureLoader._MAX_TEXTURE_SIZE = gl.getParameter(gl.MAX_TEXTURE_SIZE);\n if (this._garbageCollector) {\n TextureLoader._LOGGER.debug('WebGL Texture collection interval:', this._garbageCollector.collectionInterval);\n (_a = this._garbageCollector.garbageCollector) === null || _a === void 0 ? void 0 : _a.registerCollector('texture', this._garbageCollector.collectionInterval, this._collect);\n }\n }\n dispose() {\n for (const [image] of this._textureMap) {\n this.delete(image);\n }\n this._textureMap.clear();\n this._gl = null;\n }\n /**\n * Get the WebGL Texture from a source image\n * @param image\n */\n get(image) {\n return this._textureMap.get(image);\n }\n /**\n * Returns whether a source image has been loaded as a texture\n * @param image\n */\n has(image) {\n return this._textureMap.has(image);\n }\n /**\n * Loads a graphic into webgl and returns it's texture info, a webgl context must be previously registered\n * @param image Source graphic\n * @param options {ImageSourceOptions} Optionally configure the ImageFiltering and ImageWrapping mode to apply to the loaded texture\n * @param forceUpdate Optionally force a texture to be reloaded, useful if the source graphic has changed\n */\n load(image, options, forceUpdate = false) {\n var _a, _b;\n // Ignore loading if webgl is not registered\n const gl = this._gl;\n if (!gl) {\n return null;\n }\n const { filtering, wrapping } = { ...options };\n let tex = null;\n // If reuse the texture if it's from the same source\n if (this.has(image)) {\n tex = this.get(image);\n }\n // Update existing webgl texture and return early\n if (tex) {\n if (forceUpdate) {\n gl.bindTexture(gl.TEXTURE_2D, tex);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);\n }\n (_a = this._garbageCollector) === null || _a === void 0 ? void 0 : _a.garbageCollector.touch(image);\n return tex;\n }\n // No texture exists create a new one\n tex = gl.createTexture();\n // TODO implement texture gc with weakmap and timer\n TextureLoader.checkImageSizeSupportedAndLog(image);\n gl.bindTexture(gl.TEXTURE_2D, tex);\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);\n let wrappingConfig;\n if (wrapping) {\n if (typeof wrapping === 'string') {\n wrappingConfig = {\n x: wrapping,\n y: wrapping\n };\n }\n else {\n wrappingConfig = {\n x: wrapping.x,\n y: wrapping.y\n };\n }\n }\n const { x: xWrap, y: yWrap } = wrappingConfig !== null && wrappingConfig !== void 0 ? wrappingConfig : TextureLoader.wrapping;\n switch (xWrap) {\n case _Wrapping__WEBPACK_IMPORTED_MODULE_0__.ImageWrapping.Clamp:\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n break;\n case _Wrapping__WEBPACK_IMPORTED_MODULE_0__.ImageWrapping.Repeat:\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT);\n break;\n case _Wrapping__WEBPACK_IMPORTED_MODULE_0__.ImageWrapping.Mirror:\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.MIRRORED_REPEAT);\n break;\n default:\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n }\n switch (yWrap) {\n case _Wrapping__WEBPACK_IMPORTED_MODULE_0__.ImageWrapping.Clamp:\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n break;\n case _Wrapping__WEBPACK_IMPORTED_MODULE_0__.ImageWrapping.Repeat:\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT);\n break;\n case _Wrapping__WEBPACK_IMPORTED_MODULE_0__.ImageWrapping.Mirror:\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.MIRRORED_REPEAT);\n break;\n default:\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n }\n // NEAREST for pixel art, LINEAR for hi-res\n const filterMode = filtering !== null && filtering !== void 0 ? filtering : TextureLoader.filtering;\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filterMode === _Filtering__WEBPACK_IMPORTED_MODULE_1__.ImageFiltering.Pixel ? gl.NEAREST : gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filterMode === _Filtering__WEBPACK_IMPORTED_MODULE_1__.ImageFiltering.Pixel ? gl.NEAREST : gl.LINEAR);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);\n this._textureMap.set(image, tex);\n (_b = this._garbageCollector) === null || _b === void 0 ? void 0 : _b.garbageCollector.addCollectableResource('texture', image);\n return tex;\n }\n delete(image) {\n // Ignore loading if webgl is not registered\n const gl = this._gl;\n if (!gl) {\n return;\n }\n if (this.has(image)) {\n const texture = this.get(image);\n if (texture) {\n this._textureMap.delete(image);\n gl.deleteTexture(texture);\n }\n }\n }\n /**\n * Takes an image and returns if it meets size criteria for hardware\n * @param image\n * @returns if the image will be supported at runtime\n */\n static checkImageSizeSupportedAndLog(image) {\n var _a;\n const originalSrc = (_a = image.dataset.originalSrc) !== null && _a !== void 0 ? _a : 'internal canvas bitmap';\n if (image.width > TextureLoader._MAX_TEXTURE_SIZE || image.height > TextureLoader._MAX_TEXTURE_SIZE) {\n TextureLoader._LOGGER.error(`The image [${originalSrc}] provided to Excalibur is too large for the device's maximum texture size of ` +\n `(${TextureLoader._MAX_TEXTURE_SIZE}x${TextureLoader._MAX_TEXTURE_SIZE}) please resize to an image ` +\n `for excalibur to render properly.\\n\\nImages will likely render as black rectangles.\\n\\n` +\n `Read more here: https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/WebGL_best_practices#understand_system_limits`);\n return false;\n }\n else if (image.width > 4096 || image.height > 4096) {\n // https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/WebGL_best_practices#understand_system_limits\n TextureLoader._LOGGER.warn(`The image [${originalSrc}] provided to excalibur is too large may not work on all mobile devices, ` +\n `it is recommended you resize images to a maximum (4096x4096).\\n\\n` +\n `Images will likely render as black rectangles on some mobile platforms.\\n\\n` +\n `Read more here: https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/WebGL_best_practices#understand_system_limits`);\n }\n return true;\n }\n}\nTextureLoader._LOGGER = _Util_Log__WEBPACK_IMPORTED_MODULE_2__.Logger.getInstance();\n/**\n * Sets the default filtering for the Excalibur texture loader, default {@apilink ImageFiltering.Blended}\n */\nTextureLoader.filtering = _Filtering__WEBPACK_IMPORTED_MODULE_1__.ImageFiltering.Blended;\nTextureLoader.wrapping = { x: _Wrapping__WEBPACK_IMPORTED_MODULE_0__.ImageWrapping.Clamp, y: _Wrapping__WEBPACK_IMPORTED_MODULE_0__.ImageWrapping.Clamp };\nTextureLoader._MAX_TEXTURE_SIZE = 4096;\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/transform-stack.ts\":\n/*!*********************************************!*\\\n !*** ./Graphics/Context/transform-stack.ts ***!\n \\*********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TransformStack: () => (/* binding */ TransformStack)\n/* harmony export */ });\n/* harmony import */ var _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/affine-matrix */ \"./Math/affine-matrix.ts\");\n/* harmony import */ var _Util_RentalPool__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Util/RentalPool */ \"./Util/RentalPool.ts\");\n\n\nclass TransformStack {\n constructor() {\n this._pool = new _Util_RentalPool__WEBPACK_IMPORTED_MODULE_0__.RentalPool(() => _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_1__.AffineMatrix.identity(), (mat) => mat.reset(), 100);\n this._transforms = [];\n this._currentTransform = this._pool.rent(true);\n }\n save() {\n this._transforms.push(this._currentTransform);\n this._currentTransform = this._currentTransform.clone(this._pool.rent());\n }\n restore() {\n this._pool.return(this._currentTransform);\n this._currentTransform = this._transforms.pop();\n }\n translate(x, y) {\n return this._currentTransform.translate(x, y);\n }\n rotate(angle) {\n return this._currentTransform.rotate(angle);\n }\n scale(x, y) {\n return this._currentTransform.scale(x, y);\n }\n reset() {\n this._currentTransform.reset();\n }\n set current(matrix) {\n this._currentTransform = matrix;\n }\n get current() {\n return this._currentTransform;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/vertex-buffer.ts\":\n/*!*******************************************!*\\\n !*** ./Graphics/Context/vertex-buffer.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ VertexBuffer: () => (/* binding */ VertexBuffer)\n/* harmony export */ });\n/**\n * Helper around vertex buffer to simplify creating and uploading geometry\n *\n * Under the hood uses Float32Array\n */\nclass VertexBuffer {\n constructor(options) {\n /**\n * If the vertices never change switching 'static' can be more efficient on the gpu\n *\n * Default is 'dynamic'\n */\n this.type = 'dynamic';\n const { gl, size, type, data } = options;\n this._gl = gl;\n this.buffer = this._gl.createBuffer();\n if (!data && !size) {\n throw Error('Must either provide data or a size to the VertexBuffer');\n }\n if (!data) {\n this.bufferData = new Float32Array(size);\n }\n else {\n this.bufferData = data;\n }\n this.type = type !== null && type !== void 0 ? type : this.type;\n // Allocate buffer\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer);\n gl.bufferData(gl.ARRAY_BUFFER, this.bufferData, this.type === 'static' ? gl.STATIC_DRAW : gl.DYNAMIC_DRAW);\n }\n /**\n * Bind this vertex buffer\n */\n bind() {\n const gl = this._gl;\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer);\n }\n unbind() {\n const gl = this._gl;\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n }\n /**\n * Upload vertex buffer geometry to the GPU\n */\n upload(count) {\n const gl = this._gl;\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer);\n if (count) {\n gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.bufferData, 0, count);\n }\n else {\n // TODO always use bufferSubData? need to perf test it\n gl.bufferData(gl.ARRAY_BUFFER, this.bufferData, this.type === 'static' ? gl.STATIC_DRAW : gl.DYNAMIC_DRAW);\n }\n }\n dispose() {\n const gl = this._gl;\n gl.deleteBuffer(this.buffer);\n this._gl = null;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/vertex-layout.ts\":\n/*!*******************************************!*\\\n !*** ./Graphics/Context/vertex-layout.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ VertexLayout: () => (/* binding */ VertexLayout)\n/* harmony export */ });\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../.. */ \"./Util/Log.ts\");\n/* harmony import */ var _webgl_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./webgl-util */ \"./Graphics/Context/webgl-util.ts\");\n\n\n/**\n * Helper around creating vertex attributes in a given {@apilink VertexBuffer}, this is useful for describing\n * the memory layout for your vertices inside a particular buffer\n *\n * Note: This helper assumes interleaved attributes in one {@apilink VertexBuffer}, not many.\n *\n * Working with `gl.vertexAttribPointer` can be tricky, and this attempts to double check you\n */\nclass VertexLayout {\n get vertexBuffer() {\n return this._vertexBuffer;\n }\n get attributes() {\n return this._attributes;\n }\n constructor(options) {\n this._logger = ___WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance();\n this._suppressWarnings = false;\n this._layout = [];\n this._attributes = [];\n this._vertexTotalSizeBytes = 0;\n this._initialized = false;\n const { gl, shader, vertexBuffer, attributes, suppressWarnings } = options;\n this._gl = gl;\n this._vertexBuffer = vertexBuffer;\n this._attributes = attributes;\n this._shader = shader;\n this._suppressWarnings = suppressWarnings;\n if (shader) {\n this.initialize();\n }\n }\n /**\n * Total number of bytes that the vertex will take up\n */\n get totalVertexSizeBytes() {\n return this._vertexTotalSizeBytes;\n }\n set shader(shader) {\n if (shader && this._shader !== shader) {\n this._shader = shader;\n this.initialize();\n }\n }\n get shader() {\n return this._shader;\n }\n /**\n * Layouts need shader locations and must be bound to a shader\n */\n initialize() {\n if (this._initialized) {\n return;\n }\n if (!this._shader) {\n return;\n }\n if (!this._shader.compiled) {\n throw Error('Shader not compiled, shader must be compiled before defining a vertex layout');\n }\n this._vertexTotalSizeBytes = 0;\n this._layout.length = 0;\n const shaderAttributes = this._shader.attributes;\n for (const attribute of this._attributes) {\n const attrib = shaderAttributes[attribute[0]];\n if (!attrib) {\n if (!(0,_webgl_util__WEBPACK_IMPORTED_MODULE_1__.isAttributeInSource)(this._shader.vertexSource, attribute[0])) {\n throw Error(`The attribute named: ${attribute[0]} size ${attribute[1]}` +\n ` not found in the shader source code:\\n ${this._shader.vertexSource}`);\n }\n if (!this._suppressWarnings) {\n this._logger.warn(`The attribute named: ${attribute[0]} size ${attribute[1]}` +\n ` not found in the compiled shader. This is possibly a bug:\\n` +\n ` 1. Not a bug, but should remove unused code - attribute \"${attribute[0]}\" is unused in` +\n ` vertex/fragment and has been automatically removed by glsl compiler.\\n` +\n ` 2. Definitely a bug, attribute \"${attribute[0]}\" in layout has been mistyped or is missing` +\n ` in shader, check vertex/fragment source.`);\n }\n const glType = (0,_webgl_util__WEBPACK_IMPORTED_MODULE_1__.getGLTypeFromSource)(this._gl, this._shader.vertexSource, attribute[0]);\n // Unused attribute placeholder\n this._layout.push({\n name: attribute[0],\n glType,\n size: attribute[1],\n location: -1,\n normalized: false\n });\n }\n if (attrib) {\n if (attrib.size !== attribute[1]) {\n throw Error(`VertexLayout size definition for attribute: [${attribute[0]}, ${attribute[1]}],` +\n ` doesn\\'t match shader source size ${attrib.size}:\\n ${this._shader.vertexSource}`);\n }\n this._layout.push(attrib);\n }\n }\n // calc size\n let componentsPerVertex = 0;\n for (const vertAttribute of this._layout) {\n const typeSize = (0,_webgl_util__WEBPACK_IMPORTED_MODULE_1__.getGlTypeSizeBytes)(this._gl, vertAttribute.glType);\n this._vertexTotalSizeBytes += typeSize * vertAttribute.size;\n componentsPerVertex += vertAttribute.size;\n }\n if (this._vertexBuffer.bufferData.length % componentsPerVertex !== 0) {\n this._logger.warn(`The vertex component size (${componentsPerVertex}) does NOT divide evenly into the specified vertex buffer` +\n ` (${this._vertexBuffer.bufferData.length})`);\n }\n // create VAO\n const gl = this._gl;\n this._vao = gl.createVertexArray();\n gl.bindVertexArray(this._vao);\n this._vertexBuffer.bind();\n let offset = 0;\n for (const vert of this._layout) {\n // skip unused attributes\n if (vert.location !== -1) {\n if (vert.glType === gl.INT) {\n gl.vertexAttribIPointer(vert.location, vert.size, vert.glType, this.totalVertexSizeBytes, offset);\n }\n else {\n gl.vertexAttribPointer(vert.location, vert.size, vert.glType, vert.normalized, this.totalVertexSizeBytes, offset);\n }\n gl.enableVertexAttribArray(vert.location);\n }\n offset += (0,_webgl_util__WEBPACK_IMPORTED_MODULE_1__.getGlTypeSizeBytes)(gl, vert.glType) * vert.size;\n }\n gl.bindVertexArray(null);\n this._vertexBuffer.unbind();\n this._initialized = true;\n }\n /**\n * Bind this layout with it's associated vertex buffer\n * @param uploadBuffer Optionally indicate you wish to upload the buffer to the GPU associated with this layout\n */\n use(uploadBuffer = false, count) {\n if (!this._shader) {\n throw Error('No shader is associated with this vertex layout, a shader must be set');\n }\n const gl = this._gl;\n if (!this._shader.isCurrentlyBound()) {\n throw Error('Shader associated with this vertex layout is not active! Call shader.use() before layout.use()');\n }\n this._vertexBuffer.bind();\n if (uploadBuffer) {\n this._vertexBuffer.upload(count);\n }\n gl.bindVertexArray(this._vao);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/webgl-util.ts\":\n/*!****************************************!*\\\n !*** ./Graphics/Context/webgl-util.ts ***!\n \\****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ getAttributeComponentSize: () => (/* binding */ getAttributeComponentSize),\n/* harmony export */ getAttributePointerType: () => (/* binding */ getAttributePointerType),\n/* harmony export */ getGLTypeFromSource: () => (/* binding */ getGLTypeFromSource),\n/* harmony export */ getGlTypeSizeBytes: () => (/* binding */ getGlTypeSizeBytes),\n/* harmony export */ getMaxShaderComplexity: () => (/* binding */ getMaxShaderComplexity),\n/* harmony export */ isAttributeInSource: () => (/* binding */ isAttributeInSource)\n/* harmony export */ });\n/**\n * Return the size of the GlType in bytes\n * @param gl\n * @param type\n */\nfunction getGlTypeSizeBytes(gl, type) {\n switch (type) {\n case gl.INT:\n case gl.UNSIGNED_INT:\n case gl.FLOAT:\n return 4;\n case gl.SHORT:\n return 2;\n case gl.UNSIGNED_SHORT:\n return 2;\n case gl.BYTE:\n return 1;\n case gl.UNSIGNED_BYTE:\n return 1;\n default:\n return 1;\n }\n}\n/**\n * Checks if an attribute is present in vertex source\n */\nfunction isAttributeInSource(source, variable) {\n const attributeRegexTemplate = `(?[a-z0-9]+)\\\\s+${variable};`;\n const regex = new RegExp(attributeRegexTemplate, 'g');\n const matches = regex.exec(source);\n return (matches === null || matches === void 0 ? void 0 : matches.length) > 0;\n}\n/**\n * Attempt to discern the glType of an attribute from vertex source\n * @param gl\n * @param source\n * @param variable\n */\nfunction getGLTypeFromSource(gl, source, variable) {\n var _a;\n const attributeRegexTemplate = `(?[a-z0-9]+)\\\\s+${variable};`;\n const regex = new RegExp(attributeRegexTemplate, 'g');\n const matches = regex.exec(source);\n const type = (_a = matches === null || matches === void 0 ? void 0 : matches.groups) === null || _a === void 0 ? void 0 : _a.type;\n switch (type) {\n case 'float':\n case 'vec2':\n case 'vec3':\n case 'vec4':\n return gl.FLOAT;\n case 'int':\n case 'ivec2':\n case 'ivec3':\n case 'ivec4':\n return gl.INT;\n case 'uint':\n case 'uvec2':\n case 'uvec3':\n case 'uvec4':\n return gl.UNSIGNED_INT;\n case 'bool':\n case 'bvec2':\n case 'bvec3':\n case 'bvec4':\n return gl.BOOL;\n case 'short':\n return gl.SHORT;\n case 'ushort':\n return gl.UNSIGNED_SHORT;\n case 'ubyte':\n return gl.UNSIGNED_BYTE;\n case 'byte':\n return gl.BYTE;\n default:\n return gl.FLOAT;\n }\n}\n/**\n * Based on the type return the number of attribute components\n *\n * https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/vertexAttribPointer\n * @param gl\n * @param type\n */\nfunction getAttributeComponentSize(gl, type) {\n switch (type) {\n case gl.LOW_FLOAT:\n case gl.HIGH_FLOAT:\n case gl.FLOAT:\n return 1;\n case gl.FLOAT_VEC2:\n return 2;\n case gl.FLOAT_VEC3:\n return 3;\n case gl.FLOAT_VEC4:\n return 4;\n case gl.BYTE:\n return 1;\n case gl.UNSIGNED_BYTE:\n return 1;\n case gl.UNSIGNED_SHORT:\n case gl.SHORT:\n return 1;\n default:\n return 1;\n }\n}\n/**\n * Based on the attribute return the corresponding supported attrib pointer type\n * https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/vertexAttribPointer\n * @param gl\n * @param type\n */\nfunction getAttributePointerType(gl, type) {\n switch (type) {\n case gl.LOW_FLOAT:\n case gl.HIGH_FLOAT:\n case gl.FLOAT:\n case gl.FLOAT_VEC2:\n case gl.FLOAT_VEC3:\n case gl.FLOAT_VEC4:\n return gl.FLOAT;\n case gl.BYTE:\n return gl.BYTE;\n case gl.UNSIGNED_BYTE:\n return gl.UNSIGNED_BYTE;\n case gl.SHORT:\n return gl.SHORT;\n case gl.UNSIGNED_SHORT:\n return gl.UNSIGNED_SHORT;\n default:\n return gl.FLOAT;\n }\n}\n/**\n *\n */\nfunction getMaxShaderComplexity(gl, numIfs) {\n const assembleTestShader = (numIfs) => {\n const testShader = `#version 300 es\r\n precision mediump float;\r\n out vec4 fragColor;\r\n void main() {\r\n float index = 1.01;\r\n %%complexity%%\r\n }`;\n let testComplexity = '';\n for (let i = 0; i < numIfs; i++) {\n if (i === 0) {\n testComplexity += `if (index <= ${i}.5) {\\n`;\n }\n else {\n testComplexity += ` else if (index <= ${i}.5) {\\n`;\n }\n testComplexity += ` fragColor = vec4(1.0);\\n`;\n testComplexity += ` }\\n`;\n }\n return testShader.replace('%%complexity%%', testComplexity);\n };\n let canCompile = false;\n do {\n const test = assembleTestShader(numIfs);\n const shader = gl.createShader(gl.FRAGMENT_SHADER);\n gl.shaderSource(shader, test);\n gl.compileShader(shader);\n canCompile = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n if (!canCompile) {\n numIfs = (numIfs / 2) | 0;\n }\n } while (!canCompile);\n return numIfs;\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Debug.ts\":\n/*!***************************!*\\\n !*** ./Graphics/Debug.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Debug: () => (/* binding */ Debug)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n\nclass Debug {\n static registerGraphicsContext(ctx) {\n Debug._ctx = ctx;\n }\n static draw(debugDrawCall) {\n this._drawCalls.push(debugDrawCall);\n }\n static drawPoint(point, options) {\n Debug.draw((ctx) => {\n ctx.debug.drawPoint(point, options);\n });\n }\n static drawLine(start, end, options) {\n Debug.draw((ctx) => {\n ctx.debug.drawLine(start, end, options);\n });\n }\n static drawLines(points, options) {\n if (points.length > 1) {\n Debug.draw((ctx) => {\n for (let i = 0; i < points.length - 1; i++) {\n ctx.debug.drawLine(points[i], points[i + 1], options);\n }\n });\n }\n }\n static drawText(text, pos) {\n Debug.draw((ctx) => {\n ctx.debug.drawText(text, pos);\n });\n }\n static drawPolygon(points, options) {\n if (points.length > 1) {\n Debug.draw((ctx) => {\n const firstPoint = points[0];\n const polygon = [...points, firstPoint];\n for (let i = 0; i < polygon.length - 1; i++) {\n ctx.debug.drawLine(polygon[i], polygon[i + 1], options);\n }\n });\n }\n }\n static drawCircle(center, radius, options) {\n const { color, strokeColor, width } = {\n color: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Black,\n strokeColor: undefined,\n width: undefined,\n ...options\n };\n Debug.draw((ctx) => {\n ctx.drawCircle(center, radius, color, strokeColor, width);\n });\n }\n static drawBounds(boundingBox, options) {\n Debug.draw((ctx) => {\n ctx.debug.drawRect(boundingBox.left, boundingBox.top, boundingBox.width, boundingBox.height, options);\n });\n }\n static drawRay(ray, options) {\n const { distance, color } = {\n color: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Blue,\n distance: 10,\n ...options\n };\n Debug.draw((ctx) => {\n const start = ray.pos;\n const end = ray.pos.add(ray.dir.scale(distance));\n ctx.debug.drawLine(start, end, { color });\n });\n }\n static flush(ctx) {\n ctx.save();\n ctx.z = Debug.z;\n for (const drawCall of Debug._drawCalls) {\n drawCall(ctx);\n }\n ctx.restore();\n Debug.clear();\n }\n static clear() {\n Debug._drawCalls.length = 0;\n }\n}\nDebug._drawCalls = [];\nDebug.z = Infinity;\n\n\n/***/ }),\n\n/***/ \"./Graphics/DebugGraphicsComponent.ts\":\n/*!********************************************!*\\\n !*** ./Graphics/DebugGraphicsComponent.ts ***!\n \\********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DebugGraphicsComponent: () => (/* binding */ DebugGraphicsComponent)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Component */ \"./EntityComponentSystem/Component.ts\");\n\n/**\n * Provide arbitrary drawing for the purposes of debugging your game\n *\n * Will only show when the Engine is set to debug mode {@apilink Engine.showDebug} or {@apilink Engine.toggleDebug}\n *\n */\nclass DebugGraphicsComponent extends _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor(draw, useTransform = true) {\n super();\n this.draw = draw;\n this.useTransform = useTransform;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Filtering.ts\":\n/*!*******************************!*\\\n !*** ./Graphics/Filtering.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ImageFiltering: () => (/* binding */ ImageFiltering),\n/* harmony export */ parseImageFiltering: () => (/* binding */ parseImageFiltering)\n/* harmony export */ });\n/**\n * Describes the different image filtering modes\n */\nvar ImageFiltering;\n(function (ImageFiltering) {\n /**\n * Pixel is useful when you do not want smoothing aka antialiasing applied to your graphics.\n *\n * Useful for Pixel art aesthetics.\n */\n ImageFiltering[\"Pixel\"] = \"Pixel\";\n /**\n * Blended is useful when you have high resolution artwork and would like it blended and smoothed\n */\n ImageFiltering[\"Blended\"] = \"Blended\";\n})(ImageFiltering || (ImageFiltering = {}));\n/**\n * Parse the image filtering attribute value, if it doesn't match returns null\n */\nfunction parseImageFiltering(val) {\n switch (val) {\n case ImageFiltering.Pixel:\n return ImageFiltering.Pixel;\n case ImageFiltering.Blended:\n return ImageFiltering.Blended;\n default:\n return undefined;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Font.ts\":\n/*!**************************!*\\\n !*** ./Graphics/Font.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Font: () => (/* binding */ Font)\n/* harmony export */ });\n/* harmony import */ var _Collision_Index__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Collision/Index */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _FontCommon__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./FontCommon */ \"./Graphics/FontCommon.ts\");\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _FontTextInstance__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./FontTextInstance */ \"./Graphics/FontTextInstance.ts\");\n/* harmony import */ var _FontCache__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./FontCache */ \"./Graphics/FontCache.ts\");\n\n\n\n\n\n\n\n/**\n * Represents a system or web font in Excalibur\n *\n * If no options specified, the system sans-serif 10 pixel is used\n *\n * If loading a custom web font be sure to have the font loaded before you use it https://erikonarheim.com/posts/dont-test-fonts/\n */\nclass Font extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n constructor(options = {}) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v;\n super(options); // <- Graphics properties\n /**\n * Set the font filtering mode, by default set to {@apilink ImageFiltering.Blended} regardless of the engine default smoothing\n *\n * If you have a pixel style font that may be a reason to switch this to {@apilink ImageFiltering.Pixel}\n */\n this.filtering = _Filtering__WEBPACK_IMPORTED_MODULE_1__.ImageFiltering.Blended;\n /**\n * Font quality determines the size of the underlying raster text, higher quality means less jagged edges.\n * If quality is set to 1, then just enough raster bitmap is generated to render the text.\n *\n * You can think of quality as how zoomed in to the text you can get before seeing jagged edges.\n *\n * (Default 2)\n */\n this.quality = 2;\n // Raster properties for fonts\n this.padding = 2;\n this.smoothing = false;\n this.lineWidth = 1;\n this.lineDash = [];\n this.color = _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Black;\n this.family = 'sans-serif';\n this.style = _FontCommon__WEBPACK_IMPORTED_MODULE_3__.FontStyle.Normal;\n this.bold = false;\n this.unit = _FontCommon__WEBPACK_IMPORTED_MODULE_3__.FontUnit.Px;\n this.textAlign = _FontCommon__WEBPACK_IMPORTED_MODULE_3__.TextAlign.Left;\n this.baseAlign = _FontCommon__WEBPACK_IMPORTED_MODULE_3__.BaseAlign.Top;\n this.direction = _FontCommon__WEBPACK_IMPORTED_MODULE_3__.Direction.LeftToRight;\n /**\n * Font line height in pixels, default line height if unset\n */\n this.lineHeight = undefined;\n this.size = 10;\n this._textBounds = new _Collision_Index__WEBPACK_IMPORTED_MODULE_4__.BoundingBox();\n this._textMeasurement = new _FontTextInstance__WEBPACK_IMPORTED_MODULE_5__.FontTextInstance(this, '', _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Black);\n // Raster properties\n this.smoothing = (_a = options === null || options === void 0 ? void 0 : options.smoothing) !== null && _a !== void 0 ? _a : this.smoothing;\n this.padding = (_b = options === null || options === void 0 ? void 0 : options.padding) !== null && _b !== void 0 ? _b : this.padding;\n this.color = (_c = options === null || options === void 0 ? void 0 : options.color) !== null && _c !== void 0 ? _c : this.color;\n this.strokeColor = (_d = options === null || options === void 0 ? void 0 : options.strokeColor) !== null && _d !== void 0 ? _d : this.strokeColor;\n this.lineDash = (_e = options === null || options === void 0 ? void 0 : options.lineDash) !== null && _e !== void 0 ? _e : this.lineDash;\n this.lineWidth = (_f = options === null || options === void 0 ? void 0 : options.lineWidth) !== null && _f !== void 0 ? _f : this.lineWidth;\n this.filtering = (_g = options === null || options === void 0 ? void 0 : options.filtering) !== null && _g !== void 0 ? _g : this.filtering;\n // Font specific properties\n this.family = (_h = options === null || options === void 0 ? void 0 : options.family) !== null && _h !== void 0 ? _h : this.family;\n this.style = (_j = options === null || options === void 0 ? void 0 : options.style) !== null && _j !== void 0 ? _j : this.style;\n this.bold = (_k = options === null || options === void 0 ? void 0 : options.bold) !== null && _k !== void 0 ? _k : this.bold;\n this.size = (_l = options === null || options === void 0 ? void 0 : options.size) !== null && _l !== void 0 ? _l : this.size;\n this.unit = (_m = options === null || options === void 0 ? void 0 : options.unit) !== null && _m !== void 0 ? _m : this.unit;\n this.textAlign = (_o = options === null || options === void 0 ? void 0 : options.textAlign) !== null && _o !== void 0 ? _o : this.textAlign;\n this.baseAlign = (_p = options === null || options === void 0 ? void 0 : options.baseAlign) !== null && _p !== void 0 ? _p : this.baseAlign;\n this.direction = (_q = options === null || options === void 0 ? void 0 : options.direction) !== null && _q !== void 0 ? _q : this.direction;\n this.lineHeight = (_r = options === null || options === void 0 ? void 0 : options.lineHeight) !== null && _r !== void 0 ? _r : this.lineHeight;\n this.quality = (_s = options === null || options === void 0 ? void 0 : options.quality) !== null && _s !== void 0 ? _s : this.quality;\n if (options === null || options === void 0 ? void 0 : options.shadow) {\n this.shadow = {};\n this.shadow.blur = (_t = options.shadow.blur) !== null && _t !== void 0 ? _t : this.shadow.blur;\n this.shadow.offset = (_u = options.shadow.offset) !== null && _u !== void 0 ? _u : this.shadow.offset;\n this.shadow.color = (_v = options.shadow.color) !== null && _v !== void 0 ? _v : this.shadow.color;\n }\n }\n clone() {\n return new Font({\n ...this.cloneGraphicOptions(),\n size: this.size,\n unit: this.unit,\n family: this.family,\n style: this.style,\n bold: this.bold,\n textAlign: this.textAlign,\n baseAlign: this.baseAlign,\n direction: this.direction,\n shadow: this.shadow\n ? {\n blur: this.shadow.blur,\n offset: this.shadow.offset,\n color: this.shadow.color\n }\n : undefined\n });\n }\n get fontString() {\n return `${this.style} ${this.bold ? 'bold' : ''} ${this.size}${this.unit} ${this.family}`;\n }\n get localBounds() {\n return this._textBounds;\n }\n _drawImage(_ex, _x, _y) {\n // TODO weird vestigial drawimage\n }\n _rotate(ex) {\n var _a;\n // TODO this needs to change depending on the bounding box...\n const origin = (_a = this.origin) !== null && _a !== void 0 ? _a : this._textBounds.center;\n ex.translate(origin.x, origin.y);\n ex.rotate(this.rotation);\n ex.translate(-origin.x, -origin.y);\n }\n _flip(ex) {\n if (this.flipHorizontal) {\n ex.translate(this._textBounds.width / this.scale.x, 0);\n ex.scale(-1, 1);\n }\n if (this.flipVertical) {\n ex.translate(0, -this._textBounds.height / 2 / this.scale.y);\n ex.scale(1, -1);\n }\n }\n measureTextWithoutCache(text, maxWidth) {\n return this._textMeasurement.measureText(text, maxWidth);\n }\n /**\n * Returns a BoundingBox that is the total size of the text including multiple lines\n *\n * Does not include any padding or adjustment\n * @param text\n * @returns BoundingBox\n */\n measureText(text, maxWidth) {\n return _FontCache__WEBPACK_IMPORTED_MODULE_6__.FontCache.measureText(text, this, maxWidth);\n }\n _postDraw(ex) {\n ex.restore();\n }\n render(ex, text, colorOverride, x, y, maxWidth) {\n const textInstance = _FontCache__WEBPACK_IMPORTED_MODULE_6__.FontCache.getTextInstance(text, this, colorOverride);\n // Apply affine transformations\n this._textBounds = textInstance.dimensions;\n this._preDraw(ex, x, y);\n textInstance.render(ex, x, y, maxWidth);\n this._postDraw(ex);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/FontCache.ts\":\n/*!*******************************!*\\\n !*** ./Graphics/FontCache.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FontCache: () => (/* binding */ FontCache)\n/* harmony export */ });\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _FontTextInstance__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./FontTextInstance */ \"./Graphics/FontTextInstance.ts\");\n\n\nclass FontCache {\n static measureText(text, font, maxWidth) {\n const hash = _FontTextInstance__WEBPACK_IMPORTED_MODULE_0__.FontTextInstance.getHashCode(font, text);\n if (FontCache._MEASURE_CACHE.has(hash)) {\n return FontCache._MEASURE_CACHE.get(hash);\n }\n FontCache._LOGGER.debug('Font text measurement cache miss');\n const measurement = font.measureTextWithoutCache(text, maxWidth);\n FontCache._MEASURE_CACHE.set(hash, measurement);\n return measurement;\n }\n static getTextInstance(text, font, color) {\n const hash = _FontTextInstance__WEBPACK_IMPORTED_MODULE_0__.FontTextInstance.getHashCode(font, text, color);\n let textInstance = FontCache._TEXT_CACHE.get(hash);\n if (!textInstance) {\n textInstance = new _FontTextInstance__WEBPACK_IMPORTED_MODULE_0__.FontTextInstance(font, text, color);\n FontCache._TEXT_CACHE.set(hash, textInstance);\n FontCache._LOGGER.debug('Font text instance cache miss');\n }\n // Cache the bitmap for certain amount of time\n FontCache._TEXT_USAGE.set(textInstance, performance.now());\n return textInstance;\n }\n static checkAndClearCache() {\n const deferred = [];\n const currentHashCodes = new Set();\n for (const [textInstance, time] of FontCache._TEXT_USAGE.entries()) {\n // if bitmap hasn't been used in 100 ms clear it\n if (time + FontCache.FONT_TIMEOUT < performance.now()) {\n FontCache._LOGGER.debug(`Text cache entry timed out ${textInstance.text}`);\n deferred.push(textInstance);\n textInstance.dispose();\n }\n else {\n const hash = textInstance.getHashCode(false);\n currentHashCodes.add(hash);\n }\n }\n // Deferred removal of text instances\n deferred.forEach((t) => {\n FontCache._TEXT_USAGE.delete(t);\n });\n // Regenerate text instance cache\n this._TEXT_CACHE.clear();\n for (const [textInstance] of this._TEXT_USAGE.entries()) {\n this._TEXT_CACHE.set(textInstance.getHashCode(), textInstance);\n }\n // Regenerated measurement cache\n const newTextMeasurementCache = new Map();\n for (const current of currentHashCodes) {\n if (FontCache._MEASURE_CACHE.has(current)) {\n newTextMeasurementCache.set(current, FontCache._MEASURE_CACHE.get(current));\n }\n }\n this._MEASURE_CACHE.clear();\n this._MEASURE_CACHE = newTextMeasurementCache;\n }\n static get cacheSize() {\n return FontCache._TEXT_USAGE.size;\n }\n /**\n * Force clear all cached text bitmaps\n */\n static clearCache() {\n for (const [textInstance] of FontCache._TEXT_USAGE.entries()) {\n textInstance.dispose();\n }\n FontCache._TEXT_USAGE.clear();\n FontCache._TEXT_CACHE.clear();\n FontCache._MEASURE_CACHE.clear();\n }\n}\nFontCache.FONT_TIMEOUT = 500;\nFontCache._LOGGER = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\nFontCache._TEXT_USAGE = new Map();\nFontCache._TEXT_CACHE = new Map();\nFontCache._MEASURE_CACHE = new Map();\n\n\n/***/ }),\n\n/***/ \"./Graphics/FontCommon.ts\":\n/*!********************************!*\\\n !*** ./Graphics/FontCommon.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BaseAlign: () => (/* binding */ BaseAlign),\n/* harmony export */ Direction: () => (/* binding */ Direction),\n/* harmony export */ FontStyle: () => (/* binding */ FontStyle),\n/* harmony export */ FontUnit: () => (/* binding */ FontUnit),\n/* harmony export */ TextAlign: () => (/* binding */ TextAlign)\n/* harmony export */ });\n/**\n * Enum representing the different font size units\n * https://developer.mozilla.org/en-US/docs/Web/CSS/font-size\n */\nvar FontUnit;\n(function (FontUnit) {\n /**\n * Em is a scalable unit, 1 em is equal to the current font size of the current element, parent elements can effect em values\n */\n FontUnit[\"Em\"] = \"em\";\n /**\n * Rem is similar to the Em, it is a scalable unit. 1 rem is equal to the font size of the root element\n */\n FontUnit[\"Rem\"] = \"rem\";\n /**\n * Pixel is a unit of length in screen pixels\n */\n FontUnit[\"Px\"] = \"px\";\n /**\n * Point is a physical unit length (1/72 of an inch)\n */\n FontUnit[\"Pt\"] = \"pt\";\n /**\n * Percent is a scalable unit similar to Em, the only difference is the Em units scale faster when Text-Size stuff\n */\n FontUnit[\"Percent\"] = \"%\";\n})(FontUnit || (FontUnit = {}));\n/**\n * Enum representing the different horizontal text alignments\n */\nvar TextAlign;\n(function (TextAlign) {\n /**\n * The text is left-aligned.\n */\n TextAlign[\"Left\"] = \"left\";\n /**\n * The text is right-aligned.\n */\n TextAlign[\"Right\"] = \"right\";\n /**\n * The text is centered.\n */\n TextAlign[\"Center\"] = \"center\";\n /**\n * The text is aligned at the normal start of the line (left-aligned for left-to-right locales,\n * right-aligned for right-to-left locales).\n */\n TextAlign[\"Start\"] = \"start\";\n /**\n * The text is aligned at the normal end of the line (right-aligned for left-to-right locales,\n * left-aligned for right-to-left locales).\n */\n TextAlign[\"End\"] = \"end\";\n})(TextAlign || (TextAlign = {}));\n/**\n * Enum representing the different baseline text alignments\n */\nvar BaseAlign;\n(function (BaseAlign) {\n /**\n * The text baseline is the top of the em square.\n */\n BaseAlign[\"Top\"] = \"top\";\n /**\n * The text baseline is the hanging baseline. Currently unsupported; this will act like\n * alphabetic.\n */\n BaseAlign[\"Hanging\"] = \"hanging\";\n /**\n * The text baseline is the middle of the em square.\n */\n BaseAlign[\"Middle\"] = \"middle\";\n /**\n * The text baseline is the normal alphabetic baseline.\n */\n BaseAlign[\"Alphabetic\"] = \"alphabetic\";\n /**\n * The text baseline is the ideographic baseline; this is the bottom of\n * the body of the characters, if the main body of characters protrudes\n * beneath the alphabetic baseline. Currently unsupported; this will\n * act like alphabetic.\n */\n BaseAlign[\"Ideographic\"] = \"ideographic\";\n /**\n * The text baseline is the bottom of the bounding box. This differs\n * from the ideographic baseline in that the ideographic baseline\n * doesn't consider descenders.\n */\n BaseAlign[\"Bottom\"] = \"bottom\";\n})(BaseAlign || (BaseAlign = {}));\n/**\n * Enum representing the different possible font styles\n */\nvar FontStyle;\n(function (FontStyle) {\n FontStyle[\"Normal\"] = \"normal\";\n FontStyle[\"Italic\"] = \"italic\";\n FontStyle[\"Oblique\"] = \"oblique\";\n})(FontStyle || (FontStyle = {}));\n/**\n * Enum representing the text direction, useful for other languages, or writing text in reverse\n */\nvar Direction;\n(function (Direction) {\n Direction[\"LeftToRight\"] = \"ltr\";\n Direction[\"RightToLeft\"] = \"rtl\";\n})(Direction || (Direction = {}));\n\n\n/***/ }),\n\n/***/ \"./Graphics/FontTextInstance.ts\":\n/*!**************************************!*\\\n !*** ./Graphics/FontTextInstance.ts ***!\n \\**************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FontTextInstance: () => (/* binding */ FontTextInstance)\n/* harmony export */ });\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Util_DrawUtil__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/DrawUtil */ \"./Util/DrawUtil.ts\");\n/* harmony import */ var _Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Context/ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n\n\n\n\nclass FontTextInstance {\n constructor(font, text, color, maxWidth) {\n this.font = font;\n this.text = text;\n this.color = color;\n this.maxWidth = maxWidth;\n this._textFragments = [];\n this.disposed = false;\n this._dirty = true;\n this.canvas = document.createElement('canvas');\n const ctx = this.canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Unable to create FontTextInstance, internal canvas failed to create');\n }\n this.ctx = ctx;\n this.dimensions = this.measureText(text);\n this._setDimension(this.dimensions, this.ctx);\n this._lastHashCode = this.getHashCode();\n }\n measureText(text, maxWidth) {\n if (this.disposed) {\n throw Error('Accessing disposed text instance! ' + this.text);\n }\n let lines = null;\n if (maxWidth != null) {\n lines = this._getLinesFromText(text, maxWidth);\n }\n else {\n lines = text.split('\\n');\n }\n const maxWidthLine = lines.reduce((a, b) => {\n return a.length > b.length ? a : b;\n });\n this._applyFont(this.ctx); // font must be applied to the context to measure it\n const metrics = this.ctx.measureText(maxWidthLine);\n let textHeight = Math.abs(metrics.actualBoundingBoxAscent) + Math.abs(metrics.actualBoundingBoxDescent);\n // TODO line height makes the text bounds wonky\n const lineAdjustedHeight = textHeight * lines.length;\n textHeight = lineAdjustedHeight;\n const bottomBounds = lineAdjustedHeight - Math.abs(metrics.actualBoundingBoxAscent);\n const x = 0;\n const y = 0;\n const measurement = new _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox({\n left: x - Math.abs(metrics.actualBoundingBoxLeft) - this.font.padding,\n top: y - Math.abs(metrics.actualBoundingBoxAscent) - this.font.padding,\n bottom: y + bottomBounds + this.font.padding,\n right: x + Math.abs(metrics.actualBoundingBoxRight) + this.font.padding\n });\n return measurement;\n }\n _setDimension(textBounds, bitmap) {\n let lineHeightRatio = 1;\n if (this.font.lineHeight) {\n lineHeightRatio = this.font.lineHeight / this.font.size;\n }\n // Changing the width and height clears the context properties\n // We double the bitmap width to account for all possible alignment\n // We scale by \"quality\" so we render text without jaggies\n bitmap.canvas.width = (textBounds.width + this.font.padding * 2) * 2 * this.font.quality;\n bitmap.canvas.height = (textBounds.height + this.font.padding * 2) * 2 * this.font.quality * lineHeightRatio;\n }\n static getHashCode(font, text, color) {\n var _a;\n const hash = text +\n '__hashcode__' +\n font.fontString +\n font.showDebug +\n font.textAlign +\n font.baseAlign +\n font.direction +\n font.lineHeight +\n JSON.stringify(font.shadow) +\n (font.padding.toString() +\n font.smoothing.toString() +\n font.lineWidth.toString() +\n font.lineDash.toString() +\n ((_a = font.strokeColor) === null || _a === void 0 ? void 0 : _a.toString()) +\n (color ? color.toString() : font.color.toString()));\n return hash;\n }\n getHashCode(includeColor = true) {\n return FontTextInstance.getHashCode(this.font, this.text, includeColor ? this.color : undefined);\n }\n _applyRasterProperties(ctx) {\n var _a, _b, _c;\n ctx.translate(this.font.padding, this.font.padding);\n ctx.imageSmoothingEnabled = this.font.smoothing;\n ctx.lineWidth = this.font.lineWidth;\n ctx.setLineDash((_a = this.font.lineDash) !== null && _a !== void 0 ? _a : ctx.getLineDash());\n ctx.strokeStyle = (_c = (_b = this.font.strokeColor) === null || _b === void 0 ? void 0 : _b.toString()) !== null && _c !== void 0 ? _c : '';\n ctx.fillStyle = this.color.toString();\n }\n _applyFont(ctx) {\n ctx.resetTransform();\n ctx.translate(this.font.padding + ctx.canvas.width / 2, this.font.padding + ctx.canvas.height / 2);\n ctx.scale(this.font.quality, this.font.quality);\n ctx.textAlign = this.font.textAlign;\n ctx.textBaseline = this.font.baseAlign;\n ctx.font = this.font.fontString;\n ctx.direction = this.font.direction;\n if (this.font.shadow) {\n if (this.font.shadow.color) {\n ctx.shadowColor = this.font.shadow.color.toString();\n }\n if (this.font.shadow.blur) {\n ctx.shadowBlur = this.font.shadow.blur;\n }\n if (this.font.shadow.offset) {\n ctx.shadowOffsetX = this.font.shadow.offset.x;\n ctx.shadowOffsetY = this.font.shadow.offset.y;\n }\n }\n }\n _drawText(ctx, lines, lineHeight) {\n this._applyRasterProperties(ctx);\n this._applyFont(ctx);\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (this.color) {\n ctx.fillText(line, 0, i * lineHeight);\n }\n if (this.font.strokeColor) {\n ctx.strokeText(line, 0, i * lineHeight);\n }\n }\n if (this.font.showDebug) {\n // Horizontal line\n /* istanbul ignore next */\n (0,_Util_DrawUtil__WEBPACK_IMPORTED_MODULE_1__.line)(ctx, _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Green, -ctx.canvas.width / 2, 0, ctx.canvas.width / 2, 0, 2);\n // Vertical line\n /* istanbul ignore next */\n (0,_Util_DrawUtil__WEBPACK_IMPORTED_MODULE_1__.line)(ctx, _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Red, 0, -ctx.canvas.height / 2, 0, ctx.canvas.height / 2, 2);\n }\n }\n _splitTextBitmap(bitmap) {\n const textImages = [];\n let currentX = 0;\n let currentY = 0;\n // 4k is the max for mobile devices\n const width = Math.min(4096, bitmap.canvas.width);\n const height = Math.min(4096, bitmap.canvas.height);\n // Splits the original bitmap into 4k max chunks\n while (currentX < bitmap.canvas.width) {\n while (currentY < bitmap.canvas.height) {\n // create new bitmap\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Unable to split internal FontTextInstance bitmap, failed to create internal canvas');\n }\n // draw current slice to new bitmap in < 4k chunks\n ctx.drawImage(bitmap.canvas, currentX, currentY, width, height, 0, 0, width, height);\n textImages.push({ x: currentX, y: currentY, canvas });\n currentY += height;\n }\n currentX += width;\n currentY = 0;\n }\n return textImages;\n }\n flagDirty() {\n this._dirty = true;\n }\n render(ex, x, y, maxWidth) {\n var _a;\n if (this.disposed) {\n throw Error('Accessing disposed text instance! ' + this.text);\n }\n this._ex = ex;\n const hashCode = this.getHashCode();\n if (this._lastHashCode !== hashCode) {\n this._dirty = true;\n }\n // Calculate image chunks\n if (this._dirty) {\n this.dimensions = this.measureText(this.text, maxWidth);\n this._setDimension(this.dimensions, this.ctx);\n const lines = this._getLinesFromText(this.text, maxWidth);\n const lineHeight = (_a = this.font.lineHeight) !== null && _a !== void 0 ? _a : this.dimensions.height / lines.length;\n // draws the text to the main bitmap\n this._drawText(this.ctx, lines, lineHeight);\n // clear any out old fragments\n if (ex instanceof _Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_3__.ExcaliburGraphicsContextWebGL) {\n for (const frag of this._textFragments) {\n ex.textureLoader.delete(frag.canvas);\n }\n }\n // splits to < 4k fragments for large text\n this._textFragments = this._splitTextBitmap(this.ctx);\n if (ex instanceof _Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_3__.ExcaliburGraphicsContextWebGL) {\n for (const frag of this._textFragments) {\n ex.textureLoader.load(frag.canvas, { filtering: this.font.filtering }, true);\n }\n }\n this._lastHashCode = hashCode;\n this._dirty = false;\n }\n // draws the bitmap fragments to excalibur graphics context\n for (const frag of this._textFragments) {\n ex.drawImage(frag.canvas, 0, 0, frag.canvas.width, frag.canvas.height, frag.x / this.font.quality + x - this.ctx.canvas.width / this.font.quality / 2, frag.y / this.font.quality + y - this.ctx.canvas.height / this.font.quality / 2, frag.canvas.width / this.font.quality, frag.canvas.height / this.font.quality);\n }\n }\n dispose() {\n this.disposed = true;\n this.dimensions = undefined;\n this.canvas = undefined;\n this.ctx = undefined;\n if (this._ex instanceof _Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_3__.ExcaliburGraphicsContextWebGL) {\n for (const frag of this._textFragments) {\n this._ex.textureLoader.delete(frag.canvas);\n }\n }\n this._textFragments.length = 0;\n }\n _getLinesFromText(text, maxWidth) {\n var _a;\n if (this._cachedText === text && this._cachedRenderWidth === maxWidth && ((_a = this._cachedLines) === null || _a === void 0 ? void 0 : _a.length)) {\n return this._cachedLines;\n }\n const lines = text.split('\\n');\n if (maxWidth == null) {\n return lines;\n }\n // If the current line goes past the maxWidth, append a new line without modifying the underlying text.\n for (let i = 0; i < lines.length; i++) {\n let line = lines[i];\n let newLine = '';\n if (this.measureText(line).width > maxWidth) {\n while (this.measureText(line).width > maxWidth) {\n newLine = line[line.length - 1] + newLine;\n line = line.slice(0, -1); // Remove last character from line\n }\n // Update the array with our new values\n lines[i] = line;\n lines[i + 1] = newLine;\n }\n }\n this._cachedText = text;\n this._cachedLines = lines;\n this._cachedRenderWidth = maxWidth;\n return lines;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Graphic.ts\":\n/*!*****************************!*\\\n !*** ./Graphics/Graphic.ts ***!\n \\*****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Graphic: () => (/* binding */ Graphic)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Util_Watch__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Util/Watch */ \"./Util/Watch.ts\");\n/* harmony import */ var _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/affine-matrix */ \"./Math/affine-matrix.ts\");\n\n\n\n\n/**\n * A Graphic is the base Excalibur primitive for something that can be drawn to the {@apilink ExcaliburGraphicsContext}.\n * {@apilink Sprite}, {@apilink Animation}, {@apilink GraphicsGroup}, {@apilink Canvas}, {@apilink Rectangle}, {@apilink Circle}, and {@apilink Polygon} all derive from the\n * {@apilink Graphic} abstract class.\n *\n * Implementors of a Graphic must override the abstract {@apilink Graphic._drawImage} method to render an image to the graphics context. Graphic\n * handles all the position, rotation, and scale transformations in {@apilink Graphic._preDraw} and {@apilink Graphic._postDraw}\n */\nclass Graphic {\n isStale() {\n return this._transformStale;\n }\n /**\n * Gets or sets the flipHorizontal, which will flip the graphic horizontally (across the y axis)\n */\n get flipHorizontal() {\n return this._flipHorizontal;\n }\n set flipHorizontal(value) {\n this._flipHorizontal = value;\n this._transformStale = true;\n }\n /**\n * Gets or sets the flipVertical, which will flip the graphic vertically (across the x axis)\n */\n get flipVertical() {\n return this._flipVertical;\n }\n set flipVertical(value) {\n this._flipVertical = value;\n this._transformStale = true;\n }\n /**\n * Gets or sets the rotation of the graphic\n */\n get rotation() {\n return this._rotation;\n }\n set rotation(value) {\n this._rotation = value;\n this._transformStale = true;\n }\n /**\n * Gets or sets the scale of the graphic, this affects the width and\n */\n get scale() {\n return this._scale;\n }\n set scale(value) {\n this._scale = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_0__.watch)(value, () => {\n this._transformStale = true;\n });\n this._transformStale = true;\n }\n /**\n * Gets or sets the origin of the graphic, if not set the center of the graphic is the origin\n */\n get origin() {\n return this._origin;\n }\n set origin(value) {\n if (value) {\n this._origin = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_0__.watch)(value, () => {\n this._transformStale = true;\n });\n }\n this._transformStale = true;\n }\n constructor(options) {\n var _a, _b, _c, _d, _e, _f, _g;\n this.id = Graphic._ID++;\n this.transform = _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_1__.AffineMatrix.identity();\n this._transformStale = true;\n /**\n * Gets or sets wether to show debug information about the graphic\n */\n this.showDebug = false;\n this._flipHorizontal = false;\n this._flipVertical = false;\n this._rotation = 0;\n /**\n * Gets or sets the opacity of the graphic, 0 is transparent, 1 is solid (opaque).\n */\n this.opacity = 1;\n this._scale = _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.One;\n this._width = 0;\n this._height = 0;\n if (options) {\n this.origin = (_a = options.origin) !== null && _a !== void 0 ? _a : this.origin;\n this.flipHorizontal = (_b = options.flipHorizontal) !== null && _b !== void 0 ? _b : this.flipHorizontal;\n this.flipVertical = (_c = options.flipVertical) !== null && _c !== void 0 ? _c : this.flipVertical;\n this.rotation = (_d = options.rotation) !== null && _d !== void 0 ? _d : this.rotation;\n this.opacity = (_e = options.opacity) !== null && _e !== void 0 ? _e : this.opacity;\n this.scale = (_f = options.scale) !== null && _f !== void 0 ? _f : this.scale;\n this.tint = (_g = options.tint) !== null && _g !== void 0 ? _g : this.tint;\n if (options.width) {\n this._width = options.width;\n }\n if (options.height) {\n this._height = options.height;\n }\n }\n }\n cloneGraphicOptions() {\n return {\n width: this.width / this.scale.x,\n height: this.height / this.scale.y,\n origin: this.origin ? this.origin.clone() : undefined,\n flipHorizontal: this.flipHorizontal,\n flipVertical: this.flipVertical,\n rotation: this.rotation,\n opacity: this.opacity,\n scale: this.scale ? this.scale.clone() : undefined,\n tint: this.tint ? this.tint.clone() : undefined\n };\n }\n /**\n * Gets or sets the width of the graphic (always positive)\n */\n get width() {\n return Math.abs(this._width * this.scale.x);\n }\n /**\n * Gets or sets the height of the graphic (always positive)\n */\n get height() {\n return Math.abs(this._height * this.scale.y);\n }\n set width(value) {\n this._width = value;\n this._transformStale = true;\n }\n set height(value) {\n this._height = value;\n this._transformStale = true;\n }\n /**\n * Gets a copy of the bounds in pixels occupied by the graphic on the the screen. This includes scale.\n */\n get localBounds() {\n return _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_3__.BoundingBox.fromDimension(this.width, this.height, _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero);\n }\n /**\n * Draw the whole graphic to the context including transform\n * @param ex The excalibur graphics context\n * @param x\n * @param y\n */\n draw(ex, x, y) {\n this._preDraw(ex, x, y);\n this._drawImage(ex, 0, 0);\n this._postDraw(ex);\n }\n /**\n * Apply affine transformations to the graphics context to manipulate the graphic before {@apilink Graphic._drawImage}\n * @param ex\n * @param x\n * @param y\n */\n _preDraw(ex, x, y) {\n ex.save();\n ex.translate(x, y);\n if (this._transformStale) {\n this.transform.reset();\n this.transform.scale(Math.abs(this.scale.x), Math.abs(this.scale.y));\n this._rotate(this.transform);\n this._flip(this.transform);\n this._transformStale = false;\n }\n ex.multiply(this.transform);\n // it is important to multiply alphas so graphics respect the current context\n ex.opacity = ex.opacity * this.opacity;\n if (this.tint) {\n ex.tint = this.tint;\n }\n }\n _rotate(ex) {\n var _a;\n const scaleDirX = this.scale.x > 0 ? 1 : -1;\n const scaleDirY = this.scale.y > 0 ? 1 : -1;\n const origin = (_a = this.origin) !== null && _a !== void 0 ? _a : (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(this.width / 2, this.height / 2);\n ex.translate(origin.x, origin.y);\n ex.rotate(this.rotation);\n // This is for handling direction changes 1 or -1, that way we don't have mismatched translates()\n ex.scale(scaleDirX, scaleDirY);\n ex.translate(-origin.x, -origin.y);\n }\n _flip(ex) {\n if (this.flipHorizontal) {\n ex.translate(this.width / this.scale.x, 0);\n ex.scale(-1, 1);\n }\n if (this.flipVertical) {\n ex.translate(0, this.height / this.scale.y);\n ex.scale(1, -1);\n }\n }\n /**\n * Apply any additional work after {@apilink Graphic._drawImage} and restore the context state.\n * @param ex\n */\n _postDraw(ex) {\n if (this.showDebug) {\n ex.debug.drawRect(0, 0, this.width, this.height);\n }\n ex.restore();\n }\n}\nGraphic._ID = 0;\n\n\n/***/ }),\n\n/***/ \"./Graphics/GraphicsComponent.ts\":\n/*!***************************************!*\\\n !*** ./Graphics/GraphicsComponent.ts ***!\n \\***************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ GraphicsComponent: () => (/* binding */ GraphicsComponent),\n/* harmony export */ hasGraphicsTick: () => (/* binding */ hasGraphicsTick)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Collision_Index__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Collision/Index */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Component */ \"./EntityComponentSystem/Component.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Math_watch_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/watch-vector */ \"./Math/watch-vector.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Graphics_GraphicsGroup__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Graphics/GraphicsGroup */ \"./Graphics/GraphicsGroup.ts\");\n/* harmony import */ var _Raster__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Raster */ \"./Graphics/Raster.ts\");\n/* harmony import */ var _Text__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Text */ \"./Graphics/Text.ts\");\n\n\n\n\n\n\n\n\n\n\n/**\n * Type guard for checking if a Graphic HasTick (used for graphics that change over time like animations)\n * @param graphic\n */\nfunction hasGraphicsTick(graphic) {\n return !!graphic.tick;\n}\n/**\n * Component to manage drawings, using with the position component\n */\nclass GraphicsComponent extends _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n /**\n * Sets or gets wether any drawing should be visible in this component\n * @deprecated use isVisible\n */\n get visible() {\n return this.isVisible;\n }\n /**\n * Sets or gets wether any drawing should be visible in this component\n * @deprecated use isVisible\n */\n set visible(val) {\n this.isVisible = val;\n }\n /**\n * Offset to apply to graphics by default\n */\n get offset() {\n return this._offset;\n }\n set offset(value) {\n this._offset = new _Math_watch_vector__WEBPACK_IMPORTED_MODULE_1__.WatchVector(value, () => this.recalculateBounds());\n this.recalculateBounds();\n }\n /**\n * Anchor to apply to graphics by default\n */\n get anchor() {\n return this._anchor;\n }\n set anchor(value) {\n this._anchor = new _Math_watch_vector__WEBPACK_IMPORTED_MODULE_1__.WatchVector(value, () => this.recalculateBounds());\n this.recalculateBounds();\n }\n /**\n * Sets the color of the actor's current graphic\n */\n get color() {\n return this._color;\n }\n set color(v) {\n if (v) {\n this._color = v.clone();\n const currentGraphic = this.graphics.current;\n if (currentGraphic instanceof _Raster__WEBPACK_IMPORTED_MODULE_2__.Raster || currentGraphic instanceof _Text__WEBPACK_IMPORTED_MODULE_3__.Text) {\n currentGraphic.color = this._color;\n }\n }\n }\n constructor(options) {\n super();\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_4__.Logger.getInstance();\n this._current = 'default';\n this._graphics = {};\n this._options = {};\n this.material = null;\n /**\n * Sets or gets wether any drawing should be visible in this component\n */\n this.isVisible = true;\n /**\n * Optionally force the graphic onscreen, default false. Not recommend to use for perf reasons, only if you known what you're doing.\n */\n this.forceOnScreen = false;\n /**\n * Sets or gets wither all drawings should have an opacity applied\n */\n this.opacity = 1;\n this._offset = new _Math_watch_vector__WEBPACK_IMPORTED_MODULE_1__.WatchVector(_Math_vector__WEBPACK_IMPORTED_MODULE_5__.Vector.Zero, () => this.recalculateBounds());\n this._anchor = new _Math_watch_vector__WEBPACK_IMPORTED_MODULE_1__.WatchVector(_Math_vector__WEBPACK_IMPORTED_MODULE_5__.Vector.Half, () => this.recalculateBounds());\n /**\n * Flip all graphics horizontally along the y-axis\n */\n this.flipHorizontal = false;\n /**\n * Flip all graphics vertically along the x-axis\n */\n this.flipVertical = false;\n /**\n * If set to true graphics added to the component will be copied. This can effect performance, but is useful if you don't want\n * changes to a graphic to effect all the places it is used.\n */\n this.copyGraphics = false;\n // Defaults\n options = {\n visible: this.isVisible,\n graphics: {},\n ...options\n };\n const { current, anchor, color, opacity, visible, graphics, offset, copyGraphics, onPreDraw, onPostDraw, onPreTransformDraw, onPostTransformDraw } = options;\n for (const [key, graphicOrOptions] of Object.entries(graphics)) {\n if (graphicOrOptions instanceof _Graphic__WEBPACK_IMPORTED_MODULE_6__.Graphic) {\n this._graphics[key] = graphicOrOptions;\n }\n else {\n this._graphics[key] = graphicOrOptions.graphic;\n this._options[key] = graphicOrOptions.options;\n }\n }\n this.offset = offset !== null && offset !== void 0 ? offset : this.offset;\n this.opacity = opacity !== null && opacity !== void 0 ? opacity : this.opacity;\n this.anchor = anchor !== null && anchor !== void 0 ? anchor : this.anchor;\n this.color = color !== null && color !== void 0 ? color : this.color;\n this.copyGraphics = copyGraphics !== null && copyGraphics !== void 0 ? copyGraphics : this.copyGraphics;\n this.onPreDraw = onPreDraw !== null && onPreDraw !== void 0 ? onPreDraw : this.onPreDraw;\n this.onPostDraw = onPostDraw !== null && onPostDraw !== void 0 ? onPostDraw : this.onPostDraw;\n this.onPreDraw = onPreTransformDraw !== null && onPreTransformDraw !== void 0 ? onPreTransformDraw : this.onPreTransformDraw;\n this.onPostTransformDraw = onPostTransformDraw !== null && onPostTransformDraw !== void 0 ? onPostTransformDraw : this.onPostTransformDraw;\n this.isVisible = !!visible;\n this._current = current !== null && current !== void 0 ? current : this._current;\n if (current && this._graphics[current]) {\n this.use(current);\n }\n }\n getGraphic(name) {\n return this._graphics[name];\n }\n getOptions(name) {\n return this._options[name];\n }\n /**\n * Get registered graphics names\n */\n getNames() {\n return Object.keys(this._graphics);\n }\n /**\n * Returns the currently displayed graphic\n */\n get current() {\n return this._graphics[this._current];\n }\n /**\n * Returns the currently displayed graphic offsets\n */\n get currentOptions() {\n return this._options[this._current];\n }\n /**\n * Returns all graphics associated with this component\n */\n get graphics() {\n return this._graphics;\n }\n /**\n * Returns all graphics options associated with this component\n */\n get options() {\n return this._options;\n }\n add(nameOrGraphic, graphicOrOptions, options) {\n let name = 'default';\n let graphicToSet = null;\n let optionsToSet = undefined;\n if (typeof nameOrGraphic === 'string' && graphicOrOptions instanceof _Graphic__WEBPACK_IMPORTED_MODULE_6__.Graphic) {\n name = nameOrGraphic;\n graphicToSet = graphicOrOptions;\n optionsToSet = options;\n }\n if (nameOrGraphic instanceof _Graphic__WEBPACK_IMPORTED_MODULE_6__.Graphic && !(graphicOrOptions instanceof _Graphic__WEBPACK_IMPORTED_MODULE_6__.Graphic)) {\n graphicToSet = nameOrGraphic;\n optionsToSet = graphicOrOptions;\n }\n if (!graphicToSet) {\n throw new Error('Need to provide a graphic or valid graphic string');\n }\n this._graphics[name] = this.copyGraphics ? graphicToSet.clone() : graphicToSet;\n this._options[name] = this.copyGraphics ? { ...optionsToSet } : optionsToSet;\n if (name === 'default') {\n this.use('default');\n }\n return graphicToSet;\n }\n /**\n * Removes a registered graphic, if the removed graphic is the current it will switch to the default\n * @param name\n */\n remove(name) {\n delete this._graphics[name];\n delete this._options[name];\n if (this._current === name) {\n this._current = 'default';\n this.recalculateBounds();\n }\n }\n /**\n * Use a graphic only, will set the default graphic. Returns the new {@apilink Graphic}\n *\n * Optionally override the stored options\n * @param nameOrGraphic\n * @param options\n */\n use(nameOrGraphic, options) {\n var _a;\n if (nameOrGraphic instanceof _Graphic__WEBPACK_IMPORTED_MODULE_6__.Graphic) {\n let graphic = nameOrGraphic;\n if (this.copyGraphics) {\n graphic = nameOrGraphic.clone();\n }\n this._current = 'default';\n this._graphics[this._current] = graphic;\n this._options[this._current] = options;\n }\n else {\n this._current = nameOrGraphic;\n this._options[this._current] = options;\n if (!(this._current in this._graphics)) {\n this._logger.warn(`Graphic ${this._current} is not registered with the graphics component owned by ${(_a = this.owner) === null || _a === void 0 ? void 0 : _a.name}. Nothing will be drawn.`);\n }\n }\n this.recalculateBounds();\n return this.current;\n }\n /**\n * Hide currently shown graphic\n */\n hide() {\n this._current = 'ex.none';\n }\n set localBounds(bounds) {\n this._localBounds = bounds;\n }\n recalculateBounds() {\n let bb = new _Collision_Index__WEBPACK_IMPORTED_MODULE_7__.BoundingBox();\n const graphic = this._graphics[this._current];\n const options = this._options[this._current];\n if (!graphic) {\n this._localBounds = bb;\n return;\n }\n let anchor = this.anchor;\n let offset = this.offset;\n if (options === null || options === void 0 ? void 0 : options.anchor) {\n anchor = options.anchor;\n }\n if (options === null || options === void 0 ? void 0 : options.offset) {\n offset = options.offset;\n }\n const bounds = graphic.localBounds;\n const offsetX = -bounds.width * anchor.x + offset.x;\n const offsetY = -bounds.height * anchor.y + offset.y;\n if (graphic instanceof _Graphics_GraphicsGroup__WEBPACK_IMPORTED_MODULE_8__.GraphicsGroup && !graphic.useAnchor) {\n bb = graphic === null || graphic === void 0 ? void 0 : graphic.localBounds.combine(bb);\n }\n else {\n bb = graphic === null || graphic === void 0 ? void 0 : graphic.localBounds.translate((0,_Math_vector__WEBPACK_IMPORTED_MODULE_5__.vec)(offsetX, offsetY)).combine(bb);\n }\n this._localBounds = bb;\n }\n /**\n * Get local bounds of graphics component\n */\n get localBounds() {\n if (!this._localBounds || this._localBounds.hasZeroDimensions()) {\n this.recalculateBounds();\n }\n return this._localBounds; // recalc guarantees type\n }\n /**\n * Get world bounds of graphics component\n */\n get bounds() {\n let bounds = this.localBounds;\n if (this.owner) {\n const tx = this.owner.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_9__.TransformComponent);\n if (tx) {\n bounds = bounds.transform(tx.get().matrix);\n }\n }\n return bounds;\n }\n /**\n * Update underlying graphics if necessary, called internally\n * @param elapsed\n * @internal\n */\n update(elapsed, idempotencyToken = 0) {\n const graphic = this.current;\n if (graphic && hasGraphicsTick(graphic)) {\n graphic.tick(elapsed, idempotencyToken);\n }\n }\n clone() {\n const graphics = new GraphicsComponent();\n graphics._graphics = { ...this._graphics };\n graphics._options = { ...this._options };\n graphics.offset = this.offset.clone();\n if (this.color) {\n graphics.color = this.color.clone();\n }\n graphics.opacity = this.opacity;\n graphics.anchor = this.anchor.clone();\n graphics.copyGraphics = this.copyGraphics;\n graphics.onPreDraw = this.onPreDraw;\n graphics.onPostDraw = this.onPostDraw;\n graphics.isVisible = this.isVisible;\n return graphics;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/GraphicsDiagnostics.ts\":\n/*!*****************************************!*\\\n !*** ./Graphics/GraphicsDiagnostics.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ GraphicsDiagnostics: () => (/* binding */ GraphicsDiagnostics)\n/* harmony export */ });\nclass GraphicsDiagnostics {\n static clear() {\n GraphicsDiagnostics.DrawCallCount = 0;\n GraphicsDiagnostics.DrawnImagesCount = 0;\n }\n}\nGraphicsDiagnostics.DrawCallCount = 0;\nGraphicsDiagnostics.DrawnImagesCount = 0;\n\n\n/***/ }),\n\n/***/ \"./Graphics/GraphicsGroup.ts\":\n/*!***********************************!*\\\n !*** ./Graphics/GraphicsGroup.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ GraphicsGroup: () => (/* binding */ GraphicsGroup)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Animation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Animation */ \"./Graphics/Animation.ts\");\n/* harmony import */ var _Collision_Index__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Collision/Index */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n\n\n\n\n\nclass GraphicsGroup extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n constructor(options) {\n var _a;\n super(options);\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this.useAnchor = true;\n this.members = [];\n this.members = options.members;\n this.useAnchor = (_a = options.useAnchor) !== null && _a !== void 0 ? _a : this.useAnchor;\n this._updateDimensions();\n }\n clone() {\n return new GraphicsGroup({\n members: [...this.members],\n ...this.cloneGraphicOptions()\n });\n }\n _updateDimensions() {\n const bb = this.localBounds;\n this.width = bb.width;\n this.height = bb.height;\n return bb;\n }\n get localBounds() {\n const bb = new _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox();\n for (const member of this.members) {\n if (member instanceof _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic) {\n member.localBounds.combine(bb, bb);\n }\n else {\n const { graphic, offset: pos, useBounds } = member;\n const shouldUseBounds = useBounds === undefined ? true : useBounds;\n if (graphic) {\n if (shouldUseBounds) {\n graphic.localBounds.translate(pos).combine(bb, bb);\n }\n }\n else {\n this._logger.warnOnce(`Graphics group member has an null or undefined graphic, member definition: ${JSON.stringify(member)}.`);\n }\n }\n }\n return bb;\n }\n _isAnimationOrGroup(graphic) {\n return graphic instanceof _Animation__WEBPACK_IMPORTED_MODULE_3__.Animation || graphic instanceof GraphicsGroup;\n }\n tick(elapsed, idempotencyToken) {\n for (const member of this.members) {\n let graphic;\n if (member instanceof _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic) {\n graphic = member;\n }\n else {\n graphic = member.graphic;\n }\n if (this._isAnimationOrGroup(graphic)) {\n graphic.tick(elapsed, idempotencyToken);\n }\n }\n }\n reset() {\n for (const member of this.members) {\n let graphic;\n if (member instanceof _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic) {\n graphic = member;\n }\n else {\n graphic = member.graphic;\n }\n if (this._isAnimationOrGroup(graphic)) {\n graphic.reset();\n }\n }\n }\n _preDraw(ex, x, y) {\n this._updateDimensions();\n super._preDraw(ex, this.useAnchor ? x : 0, this.useAnchor ? y : 0);\n }\n _drawImage(ex, x, y) {\n const pos = _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero;\n for (const member of this.members) {\n let graphic;\n if (member instanceof _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic) {\n graphic = member;\n }\n else {\n graphic = member.graphic;\n member.offset.clone(pos);\n }\n if (!graphic) {\n continue;\n }\n ex.save();\n ex.translate(x, y);\n graphic.draw(ex, pos.x, pos.y);\n if (this.showDebug) {\n /* istanbul ignore next */\n ex.debug.drawRect(0, 0, this.width, this.height);\n }\n ex.restore();\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/GraphicsSystem.ts\":\n/*!************************************!*\\\n !*** ./Graphics/GraphicsSystem.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ GraphicsSystem: () => (/* binding */ GraphicsSystem)\n/* harmony export */ });\n/* harmony import */ var _GraphicsComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Priority.ts\");\n/* harmony import */ var _GraphicsGroup__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./GraphicsGroup */ \"./Graphics/GraphicsGroup.ts\");\n/* harmony import */ var _ParallaxComponent__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./ParallaxComponent */ \"./Graphics/ParallaxComponent.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Math/coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../Collision/BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _FontCache__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./FontCache */ \"./Graphics/FontCache.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _Math_transform__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/transform */ \"./Math/transform.ts\");\n/* harmony import */ var _TransformInterpolation__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./TransformInterpolation */ \"./Graphics/TransformInterpolation.ts\");\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass GraphicsSystem extends _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_0__.System {\n get sortedTransforms() {\n return this._sortedTransforms;\n }\n constructor(world) {\n super();\n this.world = world;\n this.systemType = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_0__.SystemType.Draw;\n this._token = 0;\n this._sortedTransforms = [];\n this._zHasChanged = false;\n this._zIndexUpdate = () => {\n this._zHasChanged = true;\n };\n this._targetInterpolationTransform = new _Math_transform__WEBPACK_IMPORTED_MODULE_1__.Transform();\n this.query = this.world.query([_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent, _GraphicsComponent__WEBPACK_IMPORTED_MODULE_3__.GraphicsComponent]);\n this.query.entityAdded$.subscribe((e) => {\n const tx = e.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n this._sortedTransforms.push(tx);\n tx.zIndexChanged$.subscribe(this._zIndexUpdate);\n this._zHasChanged = true;\n });\n this.query.entityRemoved$.subscribe((e) => {\n const tx = e.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n tx.zIndexChanged$.unsubscribe(this._zIndexUpdate);\n const index = this._sortedTransforms.indexOf(tx);\n if (index > -1) {\n this._sortedTransforms.splice(index, 1);\n }\n });\n }\n initialize(world, scene) {\n this._camera = scene.camera;\n this._engine = scene.engine;\n }\n preupdate() {\n // Graphics context could be switched to fallback in a new frame\n this._graphicsContext = this._engine.graphicsContext;\n if (this._zHasChanged) {\n this._sortedTransforms.sort((a, b) => {\n return a.globalZ - b.globalZ;\n });\n this._zHasChanged = false;\n }\n }\n update(elapsed) {\n this._token++;\n let graphics;\n _FontCache__WEBPACK_IMPORTED_MODULE_4__.FontCache.checkAndClearCache();\n // This is a performance enhancement, most things are in world space\n // so if we can only do this once saves a ton of transform updates\n this._graphicsContext.save();\n if (this._camera) {\n this._camera.draw(this._graphicsContext);\n }\n for (let transformIndex = 0; transformIndex < this._sortedTransforms.length; transformIndex++) {\n const transform = this._sortedTransforms[transformIndex];\n const entity = transform.owner;\n // If the entity is offscreen skip\n if (entity.hasTag('ex.offscreen')) {\n continue;\n }\n graphics = entity.get(_GraphicsComponent__WEBPACK_IMPORTED_MODULE_3__.GraphicsComponent);\n // Exit if graphics set to not visible\n if (!graphics.isVisible) {\n continue;\n }\n // Optionally run the onPreTransformDraw graphics lifecycle draw\n if (graphics.onPreTransformDraw) {\n graphics.onPreTransformDraw(this._graphicsContext, elapsed);\n }\n entity.events.emit('pretransformdraw', new _Events__WEBPACK_IMPORTED_MODULE_5__.PreTransformDrawEvent(this._graphicsContext, elapsed, entity));\n // This optionally sets our camera based on the entity coord plan (world vs. screen)\n if (transform.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__.CoordPlane.Screen) {\n this._graphicsContext.restore();\n }\n this._graphicsContext.save();\n if (transform.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__.CoordPlane.Screen) {\n this._graphicsContext.translate(this._engine.screen.contentArea.left, this._engine.screen.contentArea.top);\n }\n // Tick any graphics state (but only once) for animations and graphics groups\n graphics.update(elapsed, this._token);\n // Apply parallax\n const parallax = entity.get(_ParallaxComponent__WEBPACK_IMPORTED_MODULE_7__.ParallaxComponent);\n if (parallax) {\n // We use the Tiled formula\n // https://doc.mapeditor.org/en/latest/manual/layers/#parallax-scrolling-factor\n // cameraPos * (1 - parallaxFactor)\n const oneMinusFactor = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.One.sub(parallax.parallaxFactor);\n const parallaxOffset = this._camera.drawPos.scale(oneMinusFactor);\n this._graphicsContext.translate(parallaxOffset.x, parallaxOffset.y);\n }\n // Position the entity + estimate lag\n this._applyTransform(entity);\n // If there is a material enable it on the context\n if (graphics.material) {\n this._graphicsContext.material = graphics.material;\n }\n // Optionally run the onPreDraw graphics lifecycle draw\n if (graphics.onPreDraw) {\n graphics.onPreDraw(this._graphicsContext, elapsed);\n }\n entity.events.emit('predraw', new _Events__WEBPACK_IMPORTED_MODULE_5__.PreDrawEvent(this._graphicsContext, elapsed, entity));\n // this._graphicsContext.opacity *= graphics.opacity;\n this._applyOpacity(entity);\n // Draw the graphics component\n this._drawGraphicsComponent(graphics, transform);\n // Optionally run the onPostDraw graphics lifecycle draw\n if (graphics.onPostDraw) {\n graphics.onPostDraw(this._graphicsContext, elapsed);\n }\n entity.events.emit('postdraw', new _Events__WEBPACK_IMPORTED_MODULE_5__.PostDrawEvent(this._graphicsContext, elapsed, entity));\n this._graphicsContext.restore();\n // Reset the transform back to the original world space\n if (transform.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__.CoordPlane.Screen) {\n this._graphicsContext.save();\n if (this._camera) {\n this._camera.draw(this._graphicsContext);\n }\n }\n // Optionally run the onPreTransformDraw graphics lifecycle draw\n if (graphics.onPostTransformDraw) {\n graphics.onPostTransformDraw(this._graphicsContext, elapsed);\n }\n entity.events.emit('posttransformdraw', new _Events__WEBPACK_IMPORTED_MODULE_5__.PostTransformDrawEvent(this._graphicsContext, elapsed, entity));\n }\n this._graphicsContext.restore();\n }\n _drawGraphicsComponent(graphicsComponent, transformComponent) {\n var _a, _b;\n if (graphicsComponent.isVisible) {\n const flipHorizontal = graphicsComponent.flipHorizontal;\n const flipVertical = graphicsComponent.flipVertical;\n const graphic = graphicsComponent.current;\n const options = (_a = graphicsComponent.currentOptions) !== null && _a !== void 0 ? _a : {};\n if (graphic) {\n let anchor = graphicsComponent.anchor;\n let offset = graphicsComponent.offset;\n let scaleX = 1;\n let scaleY = 1;\n // handle specific overrides\n if (options === null || options === void 0 ? void 0 : options.anchor) {\n anchor = options.anchor;\n }\n if (options === null || options === void 0 ? void 0 : options.offset) {\n offset = options.offset;\n }\n const globalScale = transformComponent.globalScale;\n scaleX *= graphic.scale.x * globalScale.x;\n scaleY *= graphic.scale.y * globalScale.y;\n // See https://github.com/excaliburjs/Excalibur/pull/619 for discussion on this formula\n const offsetX = -graphic.width * anchor.x + offset.x * scaleX;\n const offsetY = -graphic.height * anchor.y + offset.y * scaleY;\n const oldFlipHorizontal = graphic.flipHorizontal;\n const oldFlipVertical = graphic.flipVertical;\n if (flipHorizontal || flipVertical) {\n // flip any currently flipped graphics\n graphic.flipHorizontal = flipHorizontal ? !oldFlipHorizontal : oldFlipHorizontal;\n graphic.flipVertical = flipVertical ? !oldFlipVertical : oldFlipVertical;\n }\n graphic === null || graphic === void 0 ? void 0 : graphic.draw(this._graphicsContext, offsetX, offsetY);\n if (flipHorizontal || flipVertical) {\n graphic.flipHorizontal = oldFlipHorizontal;\n graphic.flipVertical = oldFlipVertical;\n }\n // TODO move debug code out?\n if (((_b = this._engine) === null || _b === void 0 ? void 0 : _b.isDebug) && this._engine.debug.graphics.showBounds) {\n const offset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_8__.vec)(offsetX, offsetY);\n if (graphic instanceof _GraphicsGroup__WEBPACK_IMPORTED_MODULE_9__.GraphicsGroup) {\n for (const member of graphic.members) {\n let g;\n let pos = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Zero;\n if (member instanceof _Graphic__WEBPACK_IMPORTED_MODULE_10__.Graphic) {\n g = member;\n }\n else {\n g = member.graphic;\n pos = member.offset;\n }\n if (graphic.useAnchor) {\n g === null || g === void 0 ? void 0 : g.localBounds.translate(offset.add(pos)).draw(this._graphicsContext, this._engine.debug.graphics.boundsColor);\n }\n else {\n g === null || g === void 0 ? void 0 : g.localBounds.translate(pos).draw(this._graphicsContext, this._engine.debug.graphics.boundsColor);\n }\n }\n }\n else {\n /* istanbul ignore next */\n graphic === null || graphic === void 0 ? void 0 : graphic.localBounds.translate(offset).draw(this._graphicsContext, this._engine.debug.graphics.boundsColor);\n }\n }\n }\n }\n }\n /**\n * This applies the current entity transform to the graphics context\n * @param entity\n */\n _applyTransform(entity) {\n const ancestors = entity.getAncestors();\n for (let i = 0; i < ancestors.length; i++) {\n const ancestor = ancestors[i];\n const transform = ancestor === null || ancestor === void 0 ? void 0 : ancestor.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n const optionalBody = ancestor === null || ancestor === void 0 ? void 0 : ancestor.get(_Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_11__.BodyComponent);\n if (transform) {\n let tx = transform.get();\n if (optionalBody) {\n if (this._engine.fixedUpdateTimestep && optionalBody.__oldTransformCaptured && optionalBody.enableFixedUpdateInterpolate) {\n // Interpolate graphics if needed\n const blend = this._engine.currentFrameLagMs / this._engine.fixedUpdateTimestep;\n tx = (0,_TransformInterpolation__WEBPACK_IMPORTED_MODULE_12__.blendTransform)(optionalBody.oldTransform, transform.get(), blend, this._targetInterpolationTransform);\n }\n }\n this._graphicsContext.z = transform.globalZ;\n this._graphicsContext.translate(tx.pos.x, tx.pos.y);\n this._graphicsContext.scale(tx.scale.x, tx.scale.y);\n this._graphicsContext.rotate(tx.rotation);\n }\n }\n }\n _applyOpacity(entity) {\n var _a;\n const ancestors = entity.getAncestors();\n for (let i = 0; i < ancestors.length; i++) {\n const ancestor = ancestors[i];\n const maybeGraphics = ancestor === null || ancestor === void 0 ? void 0 : ancestor.get(_GraphicsComponent__WEBPACK_IMPORTED_MODULE_3__.GraphicsComponent);\n this._graphicsContext.opacity *= (_a = maybeGraphics === null || maybeGraphics === void 0 ? void 0 : maybeGraphics.opacity) !== null && _a !== void 0 ? _a : 1;\n }\n }\n}\nGraphicsSystem.priority = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_13__.SystemPriority.Average;\n\n\n/***/ }),\n\n/***/ \"./Graphics/ImageSource.ts\":\n/*!*********************************!*\\\n !*** ./Graphics/ImageSource.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ImageSource: () => (/* binding */ ImageSource),\n/* harmony export */ ImageSourceAttributeConstants: () => (/* binding */ ImageSourceAttributeConstants)\n/* harmony export */ });\n/* harmony import */ var _Resources_Resource__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Resources/Resource */ \"./Resources/Resource.ts\");\n/* harmony import */ var _Sprite__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Sprite */ \"./Graphics/Sprite.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Future */ \"./Util/Future.ts\");\n/* harmony import */ var _Graphics_Context_texture_loader__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Graphics/Context/texture-loader */ \"./Graphics/Context/texture-loader.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Wrapping */ \"./Graphics/Wrapping.ts\");\n\n\n\n\n\n\n\nconst ImageSourceAttributeConstants = {\n Filtering: 'filtering',\n WrappingX: 'wrapping-x',\n WrappingY: 'wrapping-y'\n};\nclass ImageSource {\n /**\n * The original size of the source image in pixels\n */\n get width() {\n return this.image.naturalWidth;\n }\n /**\n * The original height of the source image in pixels\n */\n get height() {\n return this.image.naturalHeight;\n }\n /**\n * Returns true if the Texture is completely loaded and is ready\n * to be drawn.\n */\n isLoaded() {\n if (!this._src) {\n // this boosts speed of access\n this._src = this.data.src;\n }\n return !!this._src;\n }\n get image() {\n return this.data;\n }\n constructor(pathOrBase64, bustCacheOrOptions, filtering) {\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance();\n /**\n * Access to the underlying html image element\n */\n this.data = new Image();\n this._readyFuture = new _Util_Future__WEBPACK_IMPORTED_MODULE_1__.Future();\n /**\n * Promise the resolves when the image is loaded and ready for use, does not initiate loading\n */\n this.ready = this._readyFuture.promise;\n this.path = pathOrBase64;\n let bustCache = false;\n let wrapping;\n if (typeof bustCacheOrOptions === 'boolean') {\n bustCache = bustCacheOrOptions;\n }\n else {\n ({ filtering, wrapping, bustCache } = { ...bustCacheOrOptions });\n }\n this._resource = new _Resources_Resource__WEBPACK_IMPORTED_MODULE_2__.Resource(pathOrBase64, 'blob', bustCache);\n this.filtering = filtering !== null && filtering !== void 0 ? filtering : this.filtering;\n if (typeof wrapping === 'string') {\n this.wrapping = {\n x: wrapping,\n y: wrapping\n };\n }\n else {\n this.wrapping = wrapping !== null && wrapping !== void 0 ? wrapping : this.wrapping;\n }\n if (pathOrBase64.endsWith('.gif')) {\n this._logger.warn(`Use the ex.Gif type to load gifs, you may have mixed results with ${pathOrBase64} in ex.ImageSource. Fully supported: svg, jpg, bmp, and png`);\n }\n }\n /**\n * Create an ImageSource from and HTML tag element\n * @param image\n */\n static fromHtmlImageElement(image, options) {\n const imageSource = new ImageSource('');\n imageSource._src = 'image-element';\n imageSource.data = image;\n imageSource.data.setAttribute('data-original-src', 'image-element');\n if (options === null || options === void 0 ? void 0 : options.filtering) {\n imageSource.data.setAttribute(ImageSourceAttributeConstants.Filtering, options === null || options === void 0 ? void 0 : options.filtering);\n }\n else {\n imageSource.data.setAttribute(ImageSourceAttributeConstants.Filtering, _Filtering__WEBPACK_IMPORTED_MODULE_3__.ImageFiltering.Blended);\n }\n if (options === null || options === void 0 ? void 0 : options.wrapping) {\n let wrapping;\n if (typeof options.wrapping === 'string') {\n wrapping = {\n x: options.wrapping,\n y: options.wrapping\n };\n }\n else {\n wrapping = {\n x: options.wrapping.x,\n y: options.wrapping.y\n };\n }\n imageSource.data.setAttribute(ImageSourceAttributeConstants.WrappingX, wrapping.x);\n imageSource.data.setAttribute(ImageSourceAttributeConstants.WrappingY, wrapping.y);\n }\n else {\n imageSource.data.setAttribute(ImageSourceAttributeConstants.WrappingX, _Wrapping__WEBPACK_IMPORTED_MODULE_4__.ImageWrapping.Clamp);\n imageSource.data.setAttribute(ImageSourceAttributeConstants.WrappingY, _Wrapping__WEBPACK_IMPORTED_MODULE_4__.ImageWrapping.Clamp);\n }\n _Graphics_Context_texture_loader__WEBPACK_IMPORTED_MODULE_5__.TextureLoader.checkImageSizeSupportedAndLog(image);\n imageSource._readyFuture.resolve(image);\n return imageSource;\n }\n static fromHtmlCanvasElement(image, options) {\n const imageSource = new ImageSource('');\n imageSource._src = 'canvas-element-blob';\n imageSource.data.setAttribute('data-original-src', 'canvas-element-blob');\n if (options === null || options === void 0 ? void 0 : options.filtering) {\n imageSource.data.setAttribute(ImageSourceAttributeConstants.Filtering, options === null || options === void 0 ? void 0 : options.filtering);\n }\n else {\n imageSource.data.setAttribute(ImageSourceAttributeConstants.Filtering, _Filtering__WEBPACK_IMPORTED_MODULE_3__.ImageFiltering.Blended);\n }\n if (options === null || options === void 0 ? void 0 : options.wrapping) {\n let wrapping;\n if (typeof options.wrapping === 'string') {\n wrapping = {\n x: options.wrapping,\n y: options.wrapping\n };\n }\n else {\n wrapping = {\n x: options.wrapping.x,\n y: options.wrapping.y\n };\n }\n imageSource.data.setAttribute(ImageSourceAttributeConstants.WrappingX, wrapping.x);\n imageSource.data.setAttribute(ImageSourceAttributeConstants.WrappingY, wrapping.y);\n }\n else {\n imageSource.data.setAttribute(ImageSourceAttributeConstants.WrappingX, _Wrapping__WEBPACK_IMPORTED_MODULE_4__.ImageWrapping.Clamp);\n imageSource.data.setAttribute(ImageSourceAttributeConstants.WrappingY, _Wrapping__WEBPACK_IMPORTED_MODULE_4__.ImageWrapping.Clamp);\n }\n _Graphics_Context_texture_loader__WEBPACK_IMPORTED_MODULE_5__.TextureLoader.checkImageSizeSupportedAndLog(image);\n image.toBlob((blob) => {\n // TODO throw? if blob null?\n const url = URL.createObjectURL(blob);\n imageSource.image.onload = () => {\n // no longer need to read the blob so it's revoked\n URL.revokeObjectURL(url);\n imageSource.data = imageSource.image;\n imageSource._readyFuture.resolve(imageSource.image);\n };\n imageSource.image.src = url;\n });\n return imageSource;\n }\n static fromSvgString(svgSource, options) {\n const blob = new Blob([svgSource], { type: 'image/svg+xml' });\n const url = URL.createObjectURL(blob);\n return new ImageSource(url, options);\n }\n /**\n * Should excalibur add a cache busting querystring? By default false.\n * Must be set before loading\n */\n get bustCache() {\n return this._resource.bustCache;\n }\n set bustCache(val) {\n this._resource.bustCache = val;\n }\n /**\n * Begins loading the image and returns a promise that resolves when the image is loaded\n */\n async load() {\n var _a, _b, _c, _d;\n if (this.isLoaded()) {\n return this.data;\n }\n try {\n // Load base64 or blob if needed\n let url;\n if (!this.path.includes('data:image/')) {\n const blob = await this._resource.load();\n url = URL.createObjectURL(blob);\n }\n else {\n url = this.path;\n }\n // Decode the image\n const image = new Image();\n // Use Image.onload over Image.decode()\n // https://bugs.chromium.org/p/chromium/issues/detail?id=1055828#c7\n // Otherwise chrome will throw still Image.decode() failures for large textures\n const loadedFuture = new _Util_Future__WEBPACK_IMPORTED_MODULE_1__.Future();\n image.onload = () => loadedFuture.resolve();\n image.src = url;\n image.setAttribute('data-original-src', this.path);\n await loadedFuture.promise;\n // Set results\n // We defer loading the texture into webgl until the first draw that way we avoid a singleton\n // and for the multi-engine case the texture needs to be created in EACH webgl context to work\n // See image-renderer.ts draw()\n this.data = image;\n // emit warning if potentially too big\n _Graphics_Context_texture_loader__WEBPACK_IMPORTED_MODULE_5__.TextureLoader.checkImageSizeSupportedAndLog(this.data);\n }\n catch (error) {\n throw `Error loading ImageSource from path '${this.path}' with error [${error.message}]`;\n }\n // Do a bad thing to pass the filtering as an attribute\n this.data.setAttribute(ImageSourceAttributeConstants.Filtering, this.filtering); // TODO fix type\n this.data.setAttribute(ImageSourceAttributeConstants.WrappingX, (_b = (_a = this.wrapping) === null || _a === void 0 ? void 0 : _a.x) !== null && _b !== void 0 ? _b : _Wrapping__WEBPACK_IMPORTED_MODULE_4__.ImageWrapping.Clamp);\n this.data.setAttribute(ImageSourceAttributeConstants.WrappingY, (_d = (_c = this.wrapping) === null || _c === void 0 ? void 0 : _c.y) !== null && _d !== void 0 ? _d : _Wrapping__WEBPACK_IMPORTED_MODULE_4__.ImageWrapping.Clamp);\n // todo emit complete\n this._readyFuture.resolve(this.data);\n return this.data;\n }\n /**\n * Build a sprite from this ImageSource\n */\n toSprite(options) {\n return _Sprite__WEBPACK_IMPORTED_MODULE_6__.Sprite.from(this, options);\n }\n /**\n * Unload images from memory\n */\n unload() {\n this.data = new Image();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Line.ts\":\n/*!**************************!*\\\n !*** ./Graphics/Line.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Line: () => (/* binding */ Line)\n/* harmony export */ });\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n\n\n\nclass Line extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n constructor(options) {\n super();\n this.color = _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Black;\n this.thickness = 1;\n const { start, end, color, thickness } = options;\n this.start = start;\n this.end = end;\n this.color = color !== null && color !== void 0 ? color : this.color;\n this.thickness = thickness !== null && thickness !== void 0 ? thickness : this.thickness;\n this._localBounds = this._calculateBounds();\n const { width, height } = this._localBounds;\n this.width = width;\n this.height = height;\n }\n get localBounds() {\n return this._localBounds;\n }\n _calculateBounds() {\n const lineNormal = this.end.sub(this.start).normal();\n const halfThickness = this.thickness / 2;\n const points = [\n this.start.add(lineNormal.scale(halfThickness)),\n this.end.add(lineNormal.scale(halfThickness)),\n this.end.add(lineNormal.scale(-halfThickness)),\n this.start.add(lineNormal.scale(-halfThickness))\n ];\n return _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromPoints(points);\n }\n _drawImage(ctx, _x, _y) {\n ctx.drawLine(this.start, this.end, this.color, this.thickness);\n }\n clone() {\n return new Line({\n start: this.start,\n end: this.end,\n color: this.color,\n thickness: this.thickness\n });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/NineSlice.ts\":\n/*!*******************************!*\\\n !*** ./Graphics/NineSlice.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ NineSlice: () => (/* binding */ NineSlice),\n/* harmony export */ NineSliceStretch: () => (/* binding */ NineSliceStretch)\n/* harmony export */ });\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n\n\n\n/**\n * Nine slice stretch mode\n */\nvar NineSliceStretch;\n(function (NineSliceStretch) {\n /**\n * Stretch the image across a dimension\n */\n NineSliceStretch[\"Stretch\"] = \"stretch\";\n /**\n * Tile the image across a dimension\n */\n NineSliceStretch[\"Tile\"] = \"tile\";\n /**\n * Tile the image across a dimension but only by whole image amounts\n */\n NineSliceStretch[\"TileFit\"] = \"tile-fit\";\n})(NineSliceStretch || (NineSliceStretch = {}));\nclass NineSlice extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n constructor(config) {\n super(config);\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this._config = config;\n this._imgSource = config.source;\n this._canvasA = document.createElement('canvas');\n this._canvasB = document.createElement('canvas');\n this._canvasC = document.createElement('canvas');\n this._canvasD = document.createElement('canvas');\n this._canvasE = document.createElement('canvas');\n this._canvasF = document.createElement('canvas');\n this._canvasG = document.createElement('canvas');\n this._canvasH = document.createElement('canvas');\n this._canvasI = document.createElement('canvas');\n this._initialize();\n this._imgSource.ready.then(() => {\n this._initialize();\n });\n }\n /**\n * Sets the target width of the 9 slice (pixels), and recalculates the 9 slice if desired (auto)\n * @param newWidth\n * @param auto\n */\n setTargetWidth(newWidth, auto = false) {\n this._config.width = newWidth;\n if (auto) {\n this._initialize();\n }\n }\n /**\n * Sets the target height of the 9 slice (pixels), and recalculates the 9 slice if desired (auto)\n * @param newHeight\n * @param auto\n */\n setTargetHeight(newHeight, auto = false) {\n this._config.height = newHeight;\n if (auto) {\n this._initialize();\n }\n }\n /**\n * Sets the 9 slice margins (pixels), and recalculates the 9 slice if desired (auto)\n */\n setMargins(left, top, right, bottom, auto = false) {\n this._config.sourceConfig.leftMargin = left;\n this._config.sourceConfig.topMargin = top;\n this._config.sourceConfig.rightMargin = right;\n this._config.sourceConfig.bottomMargin = bottom;\n if (auto) {\n this._initialize();\n }\n }\n /**\n * Sets the stretching strategy for the 9 slice, and recalculates the 9 slice if desired (auto)\n *\n */\n setStretch(type, stretch, auto = false) {\n if (type === 'horizontal') {\n this._config.destinationConfig.horizontalStretch = stretch;\n }\n else if (type === 'vertical') {\n this._config.destinationConfig.verticalStretch = stretch;\n }\n else {\n this._config.destinationConfig.horizontalStretch = stretch;\n this._config.destinationConfig.verticalStretch = stretch;\n }\n if (auto) {\n this._initialize();\n }\n }\n /**\n * Returns the config of the 9 slice\n */\n getConfig() {\n return this._config;\n }\n /**\n * Draws 1 of the 9 tiles based on parameters passed in\n * context is the ExcaliburGraphicsContext from the _drawImage function\n * destinationSize is the size of the destination image as a vector (width,height)\n * targetCanvas is the canvas to draw to\n * horizontalStretch and verticalStretch are the horizontal and vertical stretching strategies\n * marginW and marginH are optional margins for the 9 slice for positioning\n * @param context\n * @param targetCanvas\n * @param destinationSize\n * @param horizontalStretch\n * @param verticalStretch\n * @param marginWidth\n * @param marginHeight\n */\n _drawTile(context, targetCanvas, destinationSize, horizontalStretch, verticalStretch, marginWidth, marginHeight) {\n const tempMarginW = marginWidth || 0;\n const tempMarginH = marginHeight || 0;\n let tempSizeX, tempPositionX, tempSizeY, tempPositionY;\n const numTilesX = this._getNumberOfTiles(targetCanvas.width, destinationSize.x, horizontalStretch);\n const numTilesY = this._getNumberOfTiles(targetCanvas.height, destinationSize.y, verticalStretch);\n for (let i = 0; i < numTilesX; i++) {\n for (let j = 0; j < numTilesY; j++) {\n let { tempSize, tempPosition } = this._calculateParams(i, numTilesX, targetCanvas.width, destinationSize.x, this._config.destinationConfig.horizontalStretch);\n tempSizeX = tempSize;\n tempPositionX = tempPosition;\n ({ tempSize, tempPosition } = this._calculateParams(j, numTilesY, targetCanvas.height, destinationSize.y, this._config.destinationConfig.verticalStretch));\n tempSizeY = tempSize;\n tempPositionY = tempPosition;\n context.drawImage(targetCanvas, 0, 0, targetCanvas.width, targetCanvas.height, tempMarginW + tempPositionX, tempMarginH + tempPositionY, tempSizeX, tempSizeY);\n }\n }\n }\n /**\n * Draws the 9 slices to the canvas\n */\n _drawImage(ex, x, y) {\n if (this._imgSource.isLoaded()) {\n // Top left, no stretching\n this._drawTile(ex, this._canvasA, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.sourceConfig.leftMargin, this._config.sourceConfig.topMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch);\n // Top, middle, horizontal stretching\n this._drawTile(ex, this._canvasB, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.width - this._config.sourceConfig.leftMargin - this._config.sourceConfig.rightMargin, this._config.sourceConfig.topMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch, this._config.sourceConfig.leftMargin, 0);\n // Top right, no stretching\n this._drawTile(ex, this._canvasC, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.sourceConfig.rightMargin, this._config.sourceConfig.topMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch, this._config.width - this._config.sourceConfig.rightMargin, 0);\n // middle, left, vertical stretching\n this._drawTile(ex, this._canvasD, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.sourceConfig.leftMargin, this._config.height - this._config.sourceConfig.bottomMargin - this._config.sourceConfig.topMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch, 0, this._config.sourceConfig.topMargin);\n // center, both stretching\n if (this._config.destinationConfig.drawCenter) {\n this._drawTile(ex, this._canvasE, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.width - this._config.sourceConfig.leftMargin - this._config.sourceConfig.rightMargin, this._config.height - this._config.sourceConfig.bottomMargin - this._config.sourceConfig.topMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch, this._config.sourceConfig.leftMargin, this._config.sourceConfig.topMargin);\n }\n // middle, right, vertical stretching\n this._drawTile(ex, this._canvasF, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.sourceConfig.rightMargin, this._config.height - this._config.sourceConfig.bottomMargin - this._config.sourceConfig.topMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch, this._config.width - this._config.sourceConfig.rightMargin, this._config.sourceConfig.topMargin);\n // bottom left, no stretching\n this._drawTile(ex, this._canvasG, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.sourceConfig.leftMargin, this._config.sourceConfig.bottomMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch, 0, this._config.height - this._config.sourceConfig.bottomMargin);\n // bottom middle, horizontal stretching\n this._drawTile(ex, this._canvasH, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.width - this._config.sourceConfig.leftMargin - this._config.sourceConfig.rightMargin, this._config.sourceConfig.bottomMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch, this._config.sourceConfig.leftMargin, this._config.height - this._config.sourceConfig.bottomMargin);\n // bottom right, no stretching\n this._drawTile(ex, this._canvasI, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.sourceConfig.rightMargin, this._config.sourceConfig.bottomMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch, this._config.width - this._config.sourceConfig.rightMargin, this._config.height - this._config.sourceConfig.bottomMargin);\n }\n else {\n this._logger.warnOnce(`NineSlice ImageSource ${this._imgSource.path}` +\n ` is not yet loaded and won't be drawn. Please call .load() or include in a Loader.\\n\\n` +\n `Read https://excaliburjs.com/docs/imagesource for more information.`);\n }\n }\n /**\n * Slices the source sprite into the 9 slice canvases internally\n */\n _initialize() {\n this._sourceSprite = this._imgSource.image;\n // top left slice\n this._canvasA.width = this._config.sourceConfig.leftMargin;\n this._canvasA.height = this._config.sourceConfig.topMargin;\n const aCtx = this._canvasA.getContext('2d');\n aCtx === null || aCtx === void 0 ? void 0 : aCtx.drawImage(this._sourceSprite, 0, 0, this._canvasA.width, this._canvasA.height, 0, 0, this._canvasA.width, this._canvasA.height);\n // top slice\n this._canvasB.width = this._config.sourceConfig.width - this._config.sourceConfig.leftMargin - this._config.sourceConfig.rightMargin;\n this._canvasB.height = this._config.sourceConfig.topMargin;\n const bCtx = this._canvasB.getContext('2d');\n bCtx === null || bCtx === void 0 ? void 0 : bCtx.drawImage(this._sourceSprite, this._config.sourceConfig.leftMargin, 0, this._canvasB.width, this._canvasB.height, 0, 0, this._canvasB.width, this._canvasB.height);\n // top right slice\n this._canvasC.width = this._config.sourceConfig.rightMargin;\n this._canvasC.height = this._config.sourceConfig.topMargin;\n const cCtx = this._canvasC.getContext('2d');\n cCtx === null || cCtx === void 0 ? void 0 : cCtx.drawImage(this._sourceSprite, this._sourceSprite.width - this._config.sourceConfig.rightMargin, 0, this._canvasC.width, this._canvasC.height, 0, 0, this._canvasC.width, this._canvasC.height);\n // middle left slice\n this._canvasD.width = this._config.sourceConfig.leftMargin;\n this._canvasD.height = this._config.sourceConfig.height - this._config.sourceConfig.topMargin - this._config.sourceConfig.bottomMargin;\n const dCtx = this._canvasD.getContext('2d');\n dCtx === null || dCtx === void 0 ? void 0 : dCtx.drawImage(this._sourceSprite, 0, this._config.sourceConfig.topMargin, this._canvasD.width, this._canvasD.height, 0, 0, this._canvasD.width, this._canvasD.height);\n // middle slice\n this._canvasE.width = this._config.sourceConfig.width - this._config.sourceConfig.leftMargin - this._config.sourceConfig.rightMargin;\n this._canvasE.height = this._config.sourceConfig.height - this._config.sourceConfig.topMargin - this._config.sourceConfig.bottomMargin;\n const eCtx = this._canvasE.getContext('2d');\n eCtx === null || eCtx === void 0 ? void 0 : eCtx.drawImage(this._sourceSprite, this._config.sourceConfig.leftMargin, this._config.sourceConfig.topMargin, this._canvasE.width, this._canvasE.height, 0, 0, this._canvasE.width, this._canvasE.height);\n // middle right slice\n this._canvasF.width = this._config.sourceConfig.rightMargin;\n this._canvasF.height = this._config.sourceConfig.height - this._config.sourceConfig.topMargin - this._config.sourceConfig.bottomMargin;\n const fCtx = this._canvasF.getContext('2d');\n fCtx === null || fCtx === void 0 ? void 0 : fCtx.drawImage(this._sourceSprite, this._config.sourceConfig.width - this._config.sourceConfig.rightMargin, this._config.sourceConfig.topMargin, this._canvasF.width, this._canvasF.height, 0, 0, this._canvasF.width, this._canvasF.height);\n // bottom left slice\n this._canvasG.width = this._config.sourceConfig.leftMargin;\n this._canvasG.height = this._config.sourceConfig.bottomMargin;\n const gCtx = this._canvasG.getContext('2d');\n gCtx === null || gCtx === void 0 ? void 0 : gCtx.drawImage(this._sourceSprite, 0, this._config.sourceConfig.height - this._config.sourceConfig.bottomMargin, this._canvasG.width, this._canvasG.height, 0, 0, this._canvasG.width, this._canvasG.height);\n // bottom slice\n this._canvasH.width = this._config.sourceConfig.width - this._config.sourceConfig.leftMargin - this._config.sourceConfig.rightMargin;\n this._canvasH.height = this._config.sourceConfig.bottomMargin;\n const hCtx = this._canvasH.getContext('2d');\n hCtx === null || hCtx === void 0 ? void 0 : hCtx.drawImage(this._sourceSprite, this._config.sourceConfig.leftMargin, this._config.sourceConfig.height - this._config.sourceConfig.bottomMargin, this._canvasH.width, this._canvasH.height, 0, 0, this._canvasH.width, this._canvasH.height);\n // bottom right slice\n this._canvasI.width = this._config.sourceConfig.rightMargin;\n this._canvasI.height = this._config.sourceConfig.bottomMargin;\n const iCtx = this._canvasI.getContext('2d');\n iCtx === null || iCtx === void 0 ? void 0 : iCtx.drawImage(this._sourceSprite, this._sourceSprite.width - this._config.sourceConfig.rightMargin, this._config.sourceConfig.height - this._config.sourceConfig.bottomMargin, this._canvasI.width, this._canvasI.height, 0, 0, this._canvasI.width, this._canvasI.height);\n }\n /**\n * Clones the 9 slice\n */\n clone() {\n return new NineSlice(this._config);\n }\n /**\n * Returns the number of tiles\n */\n _getNumberOfTiles(tileSize, destinationSize, strategy) {\n switch (strategy) {\n case NineSliceStretch.Stretch:\n return 1;\n case NineSliceStretch.Tile:\n return Math.ceil(destinationSize / tileSize);\n case NineSliceStretch.TileFit:\n return Math.ceil(destinationSize / tileSize);\n }\n }\n /**\n * Returns the position and size of the tile\n */\n _calculateParams(tileNum, numTiles, tileSize, destinationSize, strategy) {\n switch (strategy) {\n case NineSliceStretch.Stretch:\n return {\n tempPosition: 0,\n tempSize: destinationSize\n };\n case NineSliceStretch.Tile:\n // if last tile, adjust size\n if (tileNum === numTiles - 1) {\n //last tile\n return {\n tempPosition: tileNum * tileSize,\n tempSize: tileSize - (numTiles * tileSize - destinationSize)\n };\n }\n else {\n return {\n tempPosition: tileNum * tileSize,\n tempSize: tileSize\n };\n }\n case NineSliceStretch.TileFit:\n const reducedTileSize = destinationSize / numTiles;\n const position = tileNum * reducedTileSize;\n return {\n tempPosition: position,\n tempSize: reducedTileSize\n };\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/OffscreenSystem.ts\":\n/*!*************************************!*\\\n !*** ./Graphics/OffscreenSystem.ts ***!\n \\*************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ OffscreenSystem: () => (/* binding */ OffscreenSystem)\n/* harmony export */ });\n/* harmony import */ var _GraphicsComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _ParallaxComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./ParallaxComponent */ \"./Graphics/ParallaxComponent.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Math/coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Priority.ts\");\n\n\n\n\n\n\n\n\nclass OffscreenSystem extends _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.System {\n constructor(world) {\n super();\n this.world = world;\n this.systemType = _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.SystemType.Draw;\n this.query = this.world.query([_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent, _GraphicsComponent__WEBPACK_IMPORTED_MODULE_2__.GraphicsComponent]);\n }\n initialize(world, scene) {\n this._camera = scene.camera;\n this._screen = scene.engine.screen;\n }\n update() {\n this._worldBounds = this._screen.getWorldBounds();\n let transform;\n let graphics;\n let maybeParallax;\n for (let i = 0; i < this.query.entities.length; i++) {\n const entity = this.query.entities[i];\n graphics = entity.get(_GraphicsComponent__WEBPACK_IMPORTED_MODULE_2__.GraphicsComponent);\n transform = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n maybeParallax = entity.get(_ParallaxComponent__WEBPACK_IMPORTED_MODULE_3__.ParallaxComponent);\n let parallaxOffset;\n if (maybeParallax) {\n // We use the Tiled formula\n // https://doc.mapeditor.org/en/latest/manual/layers/#parallax-scrolling-factor\n // cameraPos * (1 - parallaxFactor)\n const oneMinusFactor = _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.One.sub(maybeParallax.parallaxFactor);\n parallaxOffset = this._camera.pos.scale(oneMinusFactor);\n }\n // Figure out if entities are offscreen\n const entityOffscreen = this._isOffscreen(transform, graphics, parallaxOffset);\n if (entityOffscreen && !entity.hasTag('ex.offscreen')) {\n entity.events.emit('exitviewport', new _Events__WEBPACK_IMPORTED_MODULE_5__.ExitViewPortEvent(entity));\n entity.addTag('ex.offscreen');\n }\n if (!entityOffscreen && entity.hasTag('ex.offscreen')) {\n entity.events.emit('enterviewport', new _Events__WEBPACK_IMPORTED_MODULE_5__.EnterViewPortEvent(entity));\n entity.removeTag('ex.offscreen');\n }\n }\n }\n _isOffscreen(transform, graphics, parallaxOffset) {\n if (graphics.forceOnScreen) {\n return false;\n }\n if (transform.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__.CoordPlane.World) {\n let bounds = graphics.localBounds;\n if (parallaxOffset) {\n bounds = bounds.translate(parallaxOffset);\n }\n const transformedBounds = bounds.transform(transform.get().matrix);\n const graphicsOffscreen = !this._worldBounds.overlaps(transformedBounds);\n return graphicsOffscreen;\n }\n else {\n // TODO screen coordinates\n return false;\n }\n }\n}\nOffscreenSystem.priority = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_7__.SystemPriority.Higher;\n\n\n/***/ }),\n\n/***/ \"./Graphics/ParallaxComponent.ts\":\n/*!***************************************!*\\\n !*** ./Graphics/ParallaxComponent.ts ***!\n \\***************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ParallaxComponent: () => (/* binding */ ParallaxComponent)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Component */ \"./EntityComponentSystem/Component.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n\n\nclass ParallaxComponent extends _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor(parallaxFactor) {\n super();\n this.parallaxFactor = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(1.0, 1.0);\n this.parallaxFactor = parallaxFactor !== null && parallaxFactor !== void 0 ? parallaxFactor : this.parallaxFactor;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Polygon.ts\":\n/*!*****************************!*\\\n !*** ./Graphics/Polygon.ts ***!\n \\*****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Polygon: () => (/* binding */ Polygon)\n/* harmony export */ });\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Raster__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Raster */ \"./Graphics/Raster.ts\");\n\n\n\n/**\n * A polygon {@apilink Graphic} for drawing arbitrary polygons to the {@apilink ExcaliburGraphicsContext}\n *\n * Polygons default to {@apilink ImageFiltering.Blended}\n */\nclass Polygon extends _Raster__WEBPACK_IMPORTED_MODULE_0__.Raster {\n get points() {\n return this._points;\n }\n set points(points) {\n this._points = points;\n const min = this.minPoint;\n this.width = this._points.reduce((max, p) => Math.max(p.x, max), 0) - min.x;\n this.height = this._points.reduce((max, p) => Math.max(p.y, max), 0) - min.y;\n this.flagDirty();\n }\n get minPoint() {\n const minX = this._points.reduce((min, p) => Math.min(p.x, min), Infinity);\n const minY = this._points.reduce((min, p) => Math.min(p.y, min), Infinity);\n return (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(minX, minY);\n }\n constructor(options) {\n super(options);\n this._points = [];\n this.points = options.points;\n this.filtering = _Filtering__WEBPACK_IMPORTED_MODULE_2__.ImageFiltering.Blended;\n this.rasterize();\n }\n clone() {\n return new Polygon({\n points: this.points.map((p) => p.clone()),\n ...this.cloneGraphicOptions(),\n ...this.cloneRasterOptions()\n });\n }\n execute(ctx) {\n if (this.points && this.points.length) {\n ctx.beginPath();\n // Iterate through the supplied points and construct a 'polygon'\n const min = this.minPoint.negate();\n const firstPoint = this.points[0].add(min);\n ctx.moveTo(firstPoint.x, firstPoint.y);\n this.points.forEach((point) => {\n ctx.lineTo(point.x + min.x, point.y + min.y);\n });\n ctx.lineTo(firstPoint.x, firstPoint.y);\n ctx.closePath();\n if (this.color) {\n ctx.fill();\n }\n if (this.strokeColor) {\n ctx.stroke();\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/PostProcessor/ColorBlindnessMode.ts\":\n/*!******************************************************!*\\\n !*** ./Graphics/PostProcessor/ColorBlindnessMode.ts ***!\n \\******************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ColorBlindnessMode: () => (/* binding */ ColorBlindnessMode)\n/* harmony export */ });\nvar ColorBlindnessMode;\n(function (ColorBlindnessMode) {\n ColorBlindnessMode[\"Protanope\"] = \"Protanope\";\n ColorBlindnessMode[\"Deuteranope\"] = \"Deuteranope\";\n ColorBlindnessMode[\"Tritanope\"] = \"Tritanope\";\n})(ColorBlindnessMode || (ColorBlindnessMode = {}));\n\n\n/***/ }),\n\n/***/ \"./Graphics/PostProcessor/ColorBlindnessPostProcessor.ts\":\n/*!***************************************************************!*\\\n !*** ./Graphics/PostProcessor/ColorBlindnessPostProcessor.ts ***!\n \\***************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ColorBlindnessPostProcessor: () => (/* binding */ ColorBlindnessPostProcessor)\n/* harmony export */ });\n/* harmony import */ var _color_blind_fragment_glsl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./color-blind-fragment.glsl */ \"./Graphics/PostProcessor/color-blind-fragment.glsl\");\n/* harmony import */ var _ColorBlindnessMode__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ColorBlindnessMode */ \"./Graphics/PostProcessor/ColorBlindnessMode.ts\");\n/* harmony import */ var _ScreenShader__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ScreenShader */ \"./Graphics/PostProcessor/ScreenShader.ts\");\n\n\n\nclass ColorBlindnessPostProcessor {\n constructor(_colorBlindnessMode, simulate = false) {\n this._colorBlindnessMode = _colorBlindnessMode;\n this._simulate = false;\n this._simulate = simulate;\n }\n initialize(gl) {\n this._shader = new _ScreenShader__WEBPACK_IMPORTED_MODULE_0__.ScreenShader(gl, _color_blind_fragment_glsl__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n this.simulate = this._simulate;\n this.colorBlindnessMode = this._colorBlindnessMode;\n }\n getShader() {\n return this._shader.getShader();\n }\n getLayout() {\n return this._shader.getLayout();\n }\n set colorBlindnessMode(colorBlindMode) {\n this._colorBlindnessMode = colorBlindMode;\n if (this._shader) {\n const shader = this._shader.getShader();\n shader.use();\n if (this._colorBlindnessMode === _ColorBlindnessMode__WEBPACK_IMPORTED_MODULE_2__.ColorBlindnessMode.Protanope) {\n shader.setUniformInt('u_type', 0);\n }\n else if (this._colorBlindnessMode === _ColorBlindnessMode__WEBPACK_IMPORTED_MODULE_2__.ColorBlindnessMode.Deuteranope) {\n shader.setUniformInt('u_type', 1);\n }\n else if (this._colorBlindnessMode === _ColorBlindnessMode__WEBPACK_IMPORTED_MODULE_2__.ColorBlindnessMode.Tritanope) {\n shader.setUniformInt('u_type', 2);\n }\n }\n }\n get colorBlindnessMode() {\n return this._colorBlindnessMode;\n }\n set simulate(value) {\n this._simulate = value;\n if (this._shader) {\n const shader = this._shader.getShader();\n shader.use();\n shader.setUniformBoolean('u_simulate', value);\n }\n }\n get simulate() {\n return this._simulate;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/PostProcessor/ScreenShader.ts\":\n/*!************************************************!*\\\n !*** ./Graphics/PostProcessor/ScreenShader.ts ***!\n \\************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ScreenShader: () => (/* binding */ ScreenShader)\n/* harmony export */ });\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Context_shader__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Context/shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _Context_vertex_buffer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Context/vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _Context_vertex_layout__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Context/vertex-layout */ \"./Graphics/Context/vertex-layout.ts\");\n\n\n\n\n/**\n * Helper that defines a whole screen renderer, just provide a fragment source!\n *\n * Currently supports 1 varying\n * - vec2 a_texcoord between 0-1 which corresponds to screen position\n */\nclass ScreenShader {\n constructor(gl, fragmentSource) {\n if (true) {\n if (fragmentSource.includes('v_texcoord')) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance().warn(`ScreenShader: \"v_texcoord\" is deprecated in postprocessing fragment shaders will be removed in v1.0,` +\n ` use \"v_uv\" instead. Source [${fragmentSource}]`);\n }\n }\n this._shader = new _Context_shader__WEBPACK_IMPORTED_MODULE_1__.Shader({\n gl,\n vertexSource: `#version 300 es\r\n in vec2 a_position;\r\n in vec2 a_uv;\r\n out vec2 v_texcoord;\r\n out vec2 v_uv;\r\n\r\n void main() {\r\n gl_Position = vec4(a_position, 0.0, 1.0);\r\n // Pass the texcoord to the fragment shader.\r\n v_texcoord = a_uv;\r\n v_uv = a_uv;\r\n }`,\n fragmentSource: fragmentSource\n });\n this._shader.compile();\n // Setup memory layout\n this._buffer = new _Context_vertex_buffer__WEBPACK_IMPORTED_MODULE_2__.VertexBuffer({\n gl,\n type: 'static',\n // clip space quad + uv since we don't need a camera\n data: new Float32Array([\n -1, -1, 0, 0, -1, 1, 0, 1, 1, -1, 1, 0,\n 1, -1, 1, 0, -1, 1, 0, 1, 1, 1, 1, 1\n ])\n });\n this._layout = new _Context_vertex_layout__WEBPACK_IMPORTED_MODULE_3__.VertexLayout({\n gl,\n shader: this._shader,\n vertexBuffer: this._buffer,\n attributes: [\n ['a_position', 2],\n ['a_uv', 2]\n ]\n });\n this._buffer.upload();\n }\n getShader() {\n return this._shader;\n }\n getLayout() {\n return this._layout;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Raster.ts\":\n/*!****************************!*\\\n !*** ./Graphics/Raster.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Raster: () => (/* binding */ Raster)\n/* harmony export */ });\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Util_Watch__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Util/Watch */ \"./Util/Watch.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Util */ \"./Util/Util.ts\");\n\n\n\n\n\n\n/**\n * A Raster is a Graphic that needs to be first painted to a HTMLCanvasElement before it can be drawn to the\n * {@apilink ExcaliburGraphicsContext}. This is useful for generating custom images using the 2D canvas api.\n *\n * Implementors must implement the {@apilink Raster.execute} method to rasterize their drawing.\n */\nclass Raster extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n constructor(options) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;\n super((0,_Util_Util__WEBPACK_IMPORTED_MODULE_1__.omit)({ ...options }, ['width', 'height'])); // rasters do some special sauce with width/height\n this.lineCap = 'butt';\n this.quality = 1;\n this._dirty = true;\n this._smoothing = false;\n this._color = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_2__.watch)(_Color__WEBPACK_IMPORTED_MODULE_3__.Color.Black, () => this.flagDirty());\n this._lineWidth = 1;\n this._lineDash = [];\n this._padding = 0;\n if (options) {\n this.quality = (_a = options.quality) !== null && _a !== void 0 ? _a : this.quality;\n this.color = (_b = options.color) !== null && _b !== void 0 ? _b : _Color__WEBPACK_IMPORTED_MODULE_3__.Color.Black;\n this.strokeColor = options === null || options === void 0 ? void 0 : options.strokeColor;\n this.smoothing = (_c = options.smoothing) !== null && _c !== void 0 ? _c : this.smoothing;\n this.lineWidth = (_d = options.lineWidth) !== null && _d !== void 0 ? _d : this.lineWidth;\n this.lineDash = (_e = options.lineDash) !== null && _e !== void 0 ? _e : this.lineDash;\n this.lineCap = (_f = options.lineCap) !== null && _f !== void 0 ? _f : this.lineCap;\n this.padding = (_g = options.padding) !== null && _g !== void 0 ? _g : this.padding;\n this.filtering = (_h = options.filtering) !== null && _h !== void 0 ? _h : this.filtering;\n }\n this._bitmap = document.createElement('canvas');\n // get the default canvas width/height as a fallback\n const bitmapWidth = (_j = options === null || options === void 0 ? void 0 : options.width) !== null && _j !== void 0 ? _j : this._bitmap.width;\n const bitmapHeight = (_k = options === null || options === void 0 ? void 0 : options.height) !== null && _k !== void 0 ? _k : this._bitmap.height;\n this.width = bitmapWidth;\n this.height = bitmapHeight;\n const maybeCtx = this._bitmap.getContext('2d');\n if (!maybeCtx) {\n /* istanbul ignore next */\n throw new Error('Browser does not support 2d canvas drawing, cannot create Raster graphic');\n }\n else {\n this._ctx = maybeCtx;\n }\n }\n cloneRasterOptions() {\n return {\n color: this.color ? this.color.clone() : undefined,\n strokeColor: this.strokeColor ? this.strokeColor.clone() : undefined,\n smoothing: this.smoothing,\n lineWidth: this.lineWidth,\n lineDash: this.lineDash,\n lineCap: this.lineCap,\n quality: this.quality,\n padding: this.padding\n };\n }\n /**\n * Gets whether the graphic is dirty, this means there are changes that haven't been re-rasterized\n */\n get dirty() {\n return this._dirty;\n }\n /**\n * Flags the graphic as dirty, meaning it must be re-rasterized before draw.\n * This should be called any time the graphics state changes such that it affects the outputted drawing\n */\n flagDirty() {\n this._dirty = true;\n }\n /**\n * Gets or sets the current width of the Raster graphic. Setting the width will cause the raster\n * to be flagged dirty causing a re-raster on the next draw.\n *\n * Any `padding`s or `quality` set will be factored into the width\n */\n get width() {\n return Math.abs(this._getTotalWidth() * this.scale.x);\n }\n set width(value) {\n value /= Math.abs(this.scale.x);\n this._bitmap.width = value;\n this._originalWidth = value;\n this.flagDirty();\n }\n /**\n * Gets or sets the current height of the Raster graphic. Setting the height will cause the raster\n * to be flagged dirty causing a re-raster on the next draw.\n *\n * Any `padding` or `quality` set will be factored into the height\n */\n get height() {\n return Math.abs(this._getTotalHeight() * this.scale.y);\n }\n set height(value) {\n value /= Math.abs(this.scale.y);\n this._bitmap.height = value;\n this._originalHeight = value;\n this.flagDirty();\n }\n _getTotalWidth() {\n var _a;\n return (((_a = this._originalWidth) !== null && _a !== void 0 ? _a : this._bitmap.width) + this.padding * 2) * 1;\n }\n _getTotalHeight() {\n var _a;\n return (((_a = this._originalHeight) !== null && _a !== void 0 ? _a : this._bitmap.height) + this.padding * 2) * 1;\n }\n /**\n * Returns the local bounds of the Raster including the padding\n */\n get localBounds() {\n return _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_4__.BoundingBox.fromDimension(this._getTotalWidth() * this.scale.x, this._getTotalHeight() * this.scale.y, _Math_vector__WEBPACK_IMPORTED_MODULE_5__.Vector.Zero);\n }\n /**\n * Gets or sets the smoothing (anti-aliasing of the graphic). Setting the height will cause the raster\n * to be flagged dirty causing a re-raster on the next draw.\n */\n get smoothing() {\n return this._smoothing;\n }\n set smoothing(value) {\n this._smoothing = value;\n this.flagDirty();\n }\n /**\n * Gets or sets the fillStyle of the Raster graphic. Setting the fillStyle will cause the raster to be\n * flagged dirty causing a re-raster on the next draw.\n */\n get color() {\n return this._color;\n }\n set color(value) {\n this.flagDirty();\n this._color = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_2__.watch)(value, () => this.flagDirty());\n }\n /**\n * Gets or sets the strokeStyle of the Raster graphic. Setting the strokeStyle will cause the raster to be\n * flagged dirty causing a re-raster on the next draw.\n */\n get strokeColor() {\n return this._strokeColor;\n }\n set strokeColor(value) {\n this.flagDirty();\n if (value) {\n this._strokeColor = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_2__.watch)(value, () => this.flagDirty());\n }\n }\n /**\n * Gets or sets the line width of the Raster graphic. Setting the lineWidth will cause the raster to be\n * flagged dirty causing a re-raster on the next draw.\n */\n get lineWidth() {\n return this._lineWidth;\n }\n set lineWidth(value) {\n this._lineWidth = value;\n this.flagDirty();\n }\n get lineDash() {\n return this._lineDash;\n }\n set lineDash(value) {\n this._lineDash = value;\n this.flagDirty();\n }\n get padding() {\n return this._padding;\n }\n set padding(value) {\n this._padding = value;\n this.flagDirty();\n }\n /**\n * Rasterize the graphic to a bitmap making it usable as in excalibur. Rasterize is called automatically if\n * the graphic is {@apilink Raster.dirty} on the next {@apilink Graphic.draw} call\n */\n rasterize() {\n this._dirty = false;\n this._ctx.clearRect(0, 0, this._getTotalWidth(), this._getTotalHeight());\n this._ctx.save();\n this._applyRasterProperties(this._ctx);\n this.execute(this._ctx);\n this._ctx.restore();\n }\n _applyRasterProperties(ctx) {\n var _a, _b, _c, _d;\n this._bitmap.width = this._getTotalWidth() * this.quality;\n this._bitmap.height = this._getTotalHeight() * this.quality;\n // Do a bad thing to pass the filtering as an attribute\n this._bitmap.setAttribute('filtering', this.filtering);\n this._bitmap.setAttribute('forceUpload', 'true');\n ctx.scale(this.quality, this.quality);\n ctx.translate(this.padding, this.padding);\n ctx.imageSmoothingEnabled = this.smoothing;\n ctx.lineWidth = this.lineWidth;\n ctx.setLineDash((_a = this.lineDash) !== null && _a !== void 0 ? _a : ctx.getLineDash());\n ctx.lineCap = this.lineCap;\n ctx.strokeStyle = (_c = (_b = this.strokeColor) === null || _b === void 0 ? void 0 : _b.toString()) !== null && _c !== void 0 ? _c : '';\n ctx.fillStyle = (_d = this.color) === null || _d === void 0 ? void 0 : _d.toString();\n }\n _drawImage(ex, x, y) {\n if (this._dirty) {\n this.rasterize();\n }\n ex.scale(1 / this.quality, 1 / this.quality);\n ex.drawImage(this._bitmap, x, y);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Rectangle.ts\":\n/*!*******************************!*\\\n !*** ./Graphics/Rectangle.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Rectangle: () => (/* binding */ Rectangle)\n/* harmony export */ });\n/* harmony import */ var _Raster__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Raster */ \"./Graphics/Raster.ts\");\n\n/**\n * A Rectangle {@apilink Graphic} for drawing rectangles to the {@apilink ExcaliburGraphicsContext}\n */\nclass Rectangle extends _Raster__WEBPACK_IMPORTED_MODULE_0__.Raster {\n constructor(options) {\n super(options);\n this.width = options.width;\n this.height = options.height;\n this.rasterize();\n }\n clone() {\n return new Rectangle({\n width: this.width,\n height: this.height,\n ...this.cloneGraphicOptions(),\n ...this.cloneRasterOptions()\n });\n }\n execute(ctx) {\n if (this.color) {\n ctx.fillRect(0, 0, this.width, this.height);\n }\n if (this.strokeColor) {\n ctx.strokeRect(0, 0, this.width, this.height);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Sprite.ts\":\n/*!****************************!*\\\n !*** ./Graphics/Sprite.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Sprite: () => (/* binding */ Sprite)\n/* harmony export */ });\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n\n\nclass Sprite extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n static from(image, options) {\n return new Sprite({\n image,\n ...options\n });\n }\n constructor(options) {\n var _a, _b;\n super(options);\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this._dirty = true;\n this.image = options.image;\n const { width, height } = options;\n this.sourceView = (_a = options.sourceView) !== null && _a !== void 0 ? _a : { x: 0, y: 0, width: width !== null && width !== void 0 ? width : 0, height: height !== null && height !== void 0 ? height : 0 };\n this.destSize = (_b = options.destSize) !== null && _b !== void 0 ? _b : { width: width !== null && width !== void 0 ? width : 0, height: height !== null && height !== void 0 ? height : 0 };\n this._updateSpriteDimensions();\n // Fire when loaded\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.image.ready.then(() => {\n this._updateSpriteDimensions();\n });\n }\n get width() {\n return Math.abs(this.destSize.width * this.scale.x);\n }\n get height() {\n return Math.abs(this.destSize.height * this.scale.y);\n }\n set width(newWidth) {\n newWidth /= Math.abs(this.scale.x);\n this.destSize.width = newWidth;\n super.width = Math.ceil(this.destSize.width);\n }\n set height(newHeight) {\n newHeight /= Math.abs(this.scale.y);\n this.destSize.height = newHeight;\n super.height = Math.ceil(this.destSize.height);\n }\n _updateSpriteDimensions() {\n var _a, _b, _c, _d, _e, _f;\n const { width: nativeWidth, height: nativeHeight } = this.image;\n // This code uses || to avoid 0's\n // If the source is not specified, use the native dimension\n this.sourceView.width = ((_a = this.sourceView) === null || _a === void 0 ? void 0 : _a.width) || nativeWidth;\n this.sourceView.height = ((_b = this.sourceView) === null || _b === void 0 ? void 0 : _b.height) || nativeHeight;\n // If the destination is not specified, use the source if specified, then native\n this.destSize.width = ((_c = this.destSize) === null || _c === void 0 ? void 0 : _c.width) || ((_d = this.sourceView) === null || _d === void 0 ? void 0 : _d.width) || nativeWidth;\n this.destSize.height = ((_e = this.destSize) === null || _e === void 0 ? void 0 : _e.height) || ((_f = this.sourceView) === null || _f === void 0 ? void 0 : _f.height) || nativeHeight;\n this.width = Math.ceil(this.destSize.width) * this.scale.x;\n this.height = Math.ceil(this.destSize.height) * this.scale.y;\n }\n _preDraw(ex, x, y) {\n if (this.image.isLoaded() && this._dirty) {\n this._dirty = false;\n this._updateSpriteDimensions();\n }\n super._preDraw(ex, x, y);\n }\n _drawImage(ex, x, y) {\n if (this.image.isLoaded()) {\n ex.drawImage(this.image.image, this.sourceView.x, this.sourceView.y, this.sourceView.width, this.sourceView.height, x, y, this.destSize.width, this.destSize.height);\n }\n else {\n this._logger.warnOnce(`ImageSource ${this.image.path}` +\n ` is not yet loaded and won't be drawn. Please call .load() or include in a Loader.\\n\\n` +\n `Read https://excaliburjs.com/docs/imagesource for more information.`);\n }\n }\n clone() {\n return new Sprite({\n image: this.image,\n sourceView: { ...this.sourceView },\n destSize: { ...this.destSize },\n ...this.cloneGraphicOptions()\n });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/SpriteFont.ts\":\n/*!********************************!*\\\n !*** ./Graphics/SpriteFont.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SpriteFont: () => (/* binding */ SpriteFont)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n\n\n\n\nclass SpriteFont extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n constructor(options) {\n super(options);\n this._text = '';\n this.alphabet = '';\n this.shadow = undefined;\n this.caseInsensitive = false;\n this.spacing = 0;\n this.lineHeight = undefined;\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n const { alphabet, spriteSheet, caseInsensitive, spacing, shadow, lineHeight } = options;\n this.alphabet = alphabet;\n this.spriteSheet = spriteSheet;\n this.caseInsensitive = caseInsensitive !== null && caseInsensitive !== void 0 ? caseInsensitive : this.caseInsensitive;\n this.spacing = spacing !== null && spacing !== void 0 ? spacing : this.spacing;\n this.shadow = shadow !== null && shadow !== void 0 ? shadow : this.shadow;\n this.lineHeight = lineHeight !== null && lineHeight !== void 0 ? lineHeight : this.lineHeight;\n }\n _getCharacterSprites(text) {\n const results = [];\n // handle case insensitive\n const textToRender = this.caseInsensitive ? text.toLocaleLowerCase() : text;\n const alphabet = this.caseInsensitive ? this.alphabet.toLocaleLowerCase() : this.alphabet;\n // for each letter in text\n for (let letterIndex = 0; letterIndex < textToRender.length; letterIndex++) {\n // find the sprite index in alphabet , if there is an error pick the first\n const letter = textToRender[letterIndex];\n let spriteIndex = alphabet.indexOf(letter);\n if (spriteIndex === -1) {\n spriteIndex = 0;\n this._logger.warnOnce(`SpriteFont - Cannot find letter '${letter}' in configured alphabet '${alphabet}'.`);\n this._logger.warnOnce('There maybe be more issues in the SpriteFont configuration. No additional warnings will be logged.');\n }\n const letterSprite = this.spriteSheet.sprites[spriteIndex];\n if (letterSprite) {\n results.push(letterSprite);\n }\n else {\n this._logger.warnOnce(`SpriteFont - Cannot find sprite for '${letter}' at index '${spriteIndex}' in configured SpriteSheet`);\n this._logger.warnOnce('There maybe be more issues in the SpriteFont configuration. No additional warnings will be logged.');\n }\n }\n return results;\n }\n measureText(text, maxWidth) {\n const lines = this._getLinesFromText(text, maxWidth);\n const maxWidthLine = lines.reduce((a, b) => {\n return a.length > b.length ? a : b;\n });\n const sprites = this._getCharacterSprites(maxWidthLine);\n let width = 0;\n let height = 0;\n for (const sprite of sprites) {\n width += sprite.width + this.spacing;\n height = Math.max(height, sprite.height);\n }\n return _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromDimension(width * this.scale.x, height * lines.length * this.scale.y, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero);\n }\n _drawImage(ex, x, y, maxWidth) {\n var _a;\n let xCursor = 0;\n let yCursor = 0;\n let height = 0;\n const lines = this._getLinesFromText(this._text, maxWidth);\n for (const line of lines) {\n for (const sprite of this._getCharacterSprites(line)) {\n // draw it in the right spot and increase the cursor by sprite width\n sprite.draw(ex, x + xCursor, y + yCursor);\n xCursor += sprite.width + this.spacing;\n height = Math.max(height, sprite.height);\n }\n xCursor = 0;\n yCursor += (_a = this.lineHeight) !== null && _a !== void 0 ? _a : height;\n }\n }\n render(ex, text, _color, x, y, maxWidth) {\n // SpriteFont doesn't support _color, yet...\n this._text = text;\n const bounds = this.measureText(text, maxWidth);\n this.width = bounds.width;\n this.height = bounds.height;\n if (this.shadow) {\n ex.save();\n ex.translate(this.shadow.offset.x, this.shadow.offset.y);\n this._preDraw(ex, x, y);\n this._drawImage(ex, 0, 0, maxWidth);\n this._postDraw(ex);\n ex.restore();\n }\n this._preDraw(ex, x, y);\n this._drawImage(ex, 0, 0, maxWidth);\n this._postDraw(ex);\n }\n clone() {\n return new SpriteFont({\n alphabet: this.alphabet,\n spriteSheet: this.spriteSheet,\n spacing: this.spacing\n });\n }\n _getLinesFromText(text, maxWidth) {\n var _a;\n if (this._cachedText === text && this._cachedRenderWidth === maxWidth && ((_a = this._cachedLines) === null || _a === void 0 ? void 0 : _a.length)) {\n return this._cachedLines;\n }\n const lines = text.split('\\n');\n if (maxWidth == null) {\n return lines;\n }\n // If the current line goes past the maxWidth, append a new line without modifying the underlying text.\n for (let i = 0; i < lines.length; i++) {\n let line = lines[i];\n let newLine = '';\n // Note: we subtract the spacing to counter the initial padding on the left side.\n if (this.measureText(line).width > maxWidth) {\n while (this.measureText(line).width > maxWidth) {\n newLine = line[line.length - 1] + newLine;\n line = line.slice(0, -1); // Remove last character from line\n }\n // Update the array with our new values\n lines[i] = line;\n lines[i + 1] = newLine;\n }\n }\n this._cachedText = text;\n this._cachedLines = lines;\n this._cachedRenderWidth = maxWidth;\n return lines;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/SpriteSheet.ts\":\n/*!*********************************!*\\\n !*** ./Graphics/SpriteSheet.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SpriteSheet: () => (/* binding */ SpriteSheet)\n/* harmony export */ });\n/* harmony import */ var _Sprite__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Sprite */ \"./Graphics/Sprite.ts\");\n/* harmony import */ var _TiledSprite__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./TiledSprite */ \"./Graphics/TiledSprite.ts\");\n\n\n/**\n * Represents a collection of sprites from a source image with some organization in a grid\n */\nclass SpriteSheet {\n /**\n * Build a new sprite sheet from a list of sprites\n *\n * Use {@apilink SpriteSheet.fromImageSource} to create a SpriteSheet from an {@apilink ImageSource} organized in a grid\n * @param options\n */\n constructor(options) {\n this.sprites = [];\n const { sprites, rows, columns } = options;\n this.sprites = sprites;\n this.rows = rows !== null && rows !== void 0 ? rows : 1;\n this.columns = columns !== null && columns !== void 0 ? columns : this.sprites.length;\n }\n /**\n * Find a sprite by their x/y integer coordinates in the SpriteSheet, for example `getSprite(0, 0)` is the {@apilink Sprite} in the top-left\n * and `getSprite(1, 0)` is the sprite one to the right.\n * @param x\n * @param y\n */\n getSprite(x, y, options) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j;\n if (x >= this.columns || x < 0) {\n throw Error(`No sprite exists in the SpriteSheet at (${x}, ${y}), x: ${x} should be between 0 and ${this.columns - 1} columns`);\n }\n if (y >= this.rows || y < 0) {\n throw Error(`No sprite exists in the SpriteSheet at (${x}, ${y}), y: ${y} should be between 0 and ${this.rows - 1} rows`);\n }\n const spriteIndex = x + y * this.columns;\n const sprite = this.sprites[spriteIndex];\n if (sprite) {\n if (options) {\n const spriteWithOptions = sprite.clone();\n spriteWithOptions.flipHorizontal = (_a = options.flipHorizontal) !== null && _a !== void 0 ? _a : spriteWithOptions.flipHorizontal;\n spriteWithOptions.flipVertical = (_b = options.flipVertical) !== null && _b !== void 0 ? _b : spriteWithOptions.flipVertical;\n spriteWithOptions.width = (_c = options.width) !== null && _c !== void 0 ? _c : spriteWithOptions.width;\n spriteWithOptions.height = (_d = options.height) !== null && _d !== void 0 ? _d : spriteWithOptions.height;\n spriteWithOptions.rotation = (_e = options.rotation) !== null && _e !== void 0 ? _e : spriteWithOptions.rotation;\n spriteWithOptions.scale = (_f = options.scale) !== null && _f !== void 0 ? _f : spriteWithOptions.scale;\n spriteWithOptions.opacity = (_g = options.opacity) !== null && _g !== void 0 ? _g : spriteWithOptions.opacity;\n spriteWithOptions.tint = (_h = options.tint) !== null && _h !== void 0 ? _h : spriteWithOptions.tint;\n spriteWithOptions.origin = (_j = options.origin) !== null && _j !== void 0 ? _j : spriteWithOptions.origin;\n return spriteWithOptions;\n }\n return sprite;\n }\n throw Error(`Invalid sprite coordinates (${x}, ${y})`);\n }\n /**\n * Find a sprite by their x/y integer coordinates in the SpriteSheet and configures tiling to repeat by default,\n * for example `getTiledSprite(0, 0)` is the {@apilink TiledSprite} in the top-left\n * and `getTiledSprite(1, 0)` is the sprite one to the right.\n *\n * Example:\n *\n * ```typescript\n * spriteSheet.getTiledSprite(1, 0, {\n * width: game.screen.width,\n * height: 200,\n * wrapping: {\n * x: ex.ImageWrapping.Repeat,\n * y: ex.ImageWrapping.Clamp\n * }\n * });\n * ```\n * @param x\n * @param y\n * @param options\n */\n getTiledSprite(x, y, options) {\n if (x >= this.columns || x < 0) {\n throw Error(`No sprite exists in the SpriteSheet at (${x}, ${y}), x: ${x} should be between 0 and ${this.columns - 1} columns`);\n }\n if (y >= this.rows || y < 0) {\n throw Error(`No sprite exists in the SpriteSheet at (${x}, ${y}), y: ${y} should be between 0 and ${this.rows - 1} rows`);\n }\n const spriteIndex = x + y * this.columns;\n const sprite = this.sprites[spriteIndex];\n if (sprite) {\n return _TiledSprite__WEBPACK_IMPORTED_MODULE_0__.TiledSprite.fromSprite(sprite, options);\n }\n throw Error(`Invalid sprite coordinates (${x}, ${y})`);\n }\n /**\n * Create a sprite sheet from a sparse set of {@apilink SourceView} rectangles\n * @param options\n */\n static fromImageSourceWithSourceViews(options) {\n const sprites = options.sourceViews.map((sourceView) => {\n return new _Sprite__WEBPACK_IMPORTED_MODULE_1__.Sprite({\n image: options.image,\n sourceView\n });\n });\n return new SpriteSheet({ sprites });\n }\n /**\n * Create a SpriteSheet from an {@apilink ImageSource} organized in a grid\n *\n * Example:\n * ```\n * const spriteSheet = SpriteSheet.fromImageSource({\n * image: imageSource,\n * grid: {\n * rows: 5,\n * columns: 2,\n * spriteWidth: 32, // pixels\n * spriteHeight: 32 // pixels\n * },\n * // Optionally specify spacing\n * spacing: {\n * // pixels from the top left to start the sprite parsing\n * originOffset: {\n * x: 5,\n * y: 5\n * },\n * // pixels between each sprite while parsing\n * margin: {\n * x: 1,\n * y: 1\n * }\n * }\n * })\n * ```\n * @param options\n */\n static fromImageSource(options) {\n var _a;\n const sprites = [];\n options.spacing = (_a = options.spacing) !== null && _a !== void 0 ? _a : {};\n const { image, grid: { rows, columns: cols, spriteWidth, spriteHeight }, spacing: { originOffset, margin } } = options;\n const offsetDefaults = { x: 0, y: 0, ...originOffset };\n const marginDefaults = { x: 0, y: 0, ...margin };\n for (let x = 0; x < cols; x++) {\n for (let y = 0; y < rows; y++) {\n sprites[x + y * cols] = new _Sprite__WEBPACK_IMPORTED_MODULE_1__.Sprite({\n image: image,\n sourceView: {\n x: x * spriteWidth + marginDefaults.x * x + offsetDefaults.x,\n y: y * spriteHeight + marginDefaults.y * y + offsetDefaults.y,\n width: spriteWidth,\n height: spriteHeight\n },\n destSize: { height: spriteHeight, width: spriteWidth }\n });\n }\n }\n return new SpriteSheet({\n sprites: sprites,\n rows: rows,\n columns: cols\n });\n }\n clone() {\n return new SpriteSheet({\n sprites: this.sprites.map((sprite) => sprite.clone()),\n rows: this.rows,\n columns: this.columns\n });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Text.ts\":\n/*!**************************!*\\\n !*** ./Graphics/Text.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Text: () => (/* binding */ Text)\n/* harmony export */ });\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Font__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Font */ \"./Graphics/Font.ts\");\n\n\n\n/**\n * Represent Text graphics in excalibur\n *\n * Useful for in game labels, ui, or overlays\n */\nclass Text extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n constructor(options) {\n var _a, _b;\n super(options);\n this._text = '';\n this._textWidth = 0;\n this._textHeight = 0;\n // This order is important font, color, then text\n this.font = (_a = options.font) !== null && _a !== void 0 ? _a : new _Font__WEBPACK_IMPORTED_MODULE_1__.Font();\n this.color = (_b = options.color) !== null && _b !== void 0 ? _b : this.color;\n this.text = options.text;\n this.maxWidth = options.maxWidth;\n }\n clone() {\n var _a, _b;\n return new Text({\n text: this.text.slice(),\n color: (_b = (_a = this.color) === null || _a === void 0 ? void 0 : _a.clone()) !== null && _b !== void 0 ? _b : _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Black,\n font: this.font.clone(),\n maxWidth: this.maxWidth\n });\n }\n get text() {\n return this._text;\n }\n set text(value) {\n this._text = value;\n this._calculateDimension();\n }\n get font() {\n return this._font;\n }\n set font(font) {\n this._font = font;\n }\n get width() {\n if (this._textWidth === 0) {\n this._calculateDimension();\n }\n return this._textWidth * this.scale.x;\n }\n get height() {\n if (this._textHeight === 0) {\n this._calculateDimension();\n }\n return this._textHeight * this.scale.y;\n }\n _calculateDimension() {\n const { width, height } = this.font.measureText(this._text, this.maxWidth);\n this._textWidth = width;\n this._textHeight = height;\n }\n get localBounds() {\n return this.font.measureText(this._text, this.maxWidth).scale(this.scale);\n }\n _rotate(_ex) {\n // None this is delegated to font\n // This override erases the default behavior\n }\n _flip(_ex) {\n // None this is delegated to font\n // This override erases the default behavior\n }\n _preDraw(ex, x, y) {\n if (this.isStale() || this.font.isStale()) {\n this.font.flipHorizontal = this.flipHorizontal;\n this.font.flipVertical = this.flipVertical;\n this.font.rotation = this.rotation;\n this.font.origin = this.origin;\n this.font.opacity = this.opacity;\n }\n this.font.tint = this.tint;\n super._preDraw(ex, x, y);\n }\n _drawImage(ex, x, y) {\n var _a;\n let color = _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Black;\n if (this.font instanceof _Font__WEBPACK_IMPORTED_MODULE_1__.Font) {\n color = (_a = this.color) !== null && _a !== void 0 ? _a : this.font.color;\n }\n const { width, height } = this.font.measureText(this._text, this.maxWidth);\n this._textWidth = width;\n this._textHeight = height;\n this.font.render(ex, this._text, color, x, y, this.maxWidth);\n if (this.font.showDebug) {\n ex.debug.drawRect(x - width, y - height, width * 2, height * 2);\n if (this.maxWidth != null) {\n ex.debug.drawRect(x, y, this.maxWidth, this.height, {\n color: _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Yellow\n });\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/TiledAnimation.ts\":\n/*!************************************!*\\\n !*** ./Graphics/TiledAnimation.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TiledAnimation: () => (/* binding */ TiledAnimation)\n/* harmony export */ });\n/* harmony import */ var _Sprite__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Sprite */ \"./Graphics/Sprite.ts\");\n/* harmony import */ var _Animation__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Animation */ \"./Graphics/Animation.ts\");\n/* harmony import */ var _TiledSprite__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./TiledSprite */ \"./Graphics/TiledSprite.ts\");\n/* harmony import */ var _Util_Watch__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Util/Watch */ \"./Util/Watch.ts\");\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Future */ \"./Util/Future.ts\");\n\n\n\n\n\nclass TiledAnimation extends _Animation__WEBPACK_IMPORTED_MODULE_0__.Animation {\n constructor(options) {\n super({\n ...options,\n frames: options.animation.frames.slice(),\n strategy: options.animation.strategy,\n frameDuration: options.animation.frameDuration,\n speed: options.animation.speed,\n reverse: options.animation.isReversed\n });\n this._ready = new _Util_Future__WEBPACK_IMPORTED_MODULE_1__.Future();\n this.ready = this._ready.promise;\n this._tiledWidth = 0;\n this._tiledHeight = 0;\n this._sourceView = {};\n this._sourceView = { ...options.sourceView };\n this._tiledWidth = options.width;\n this._tiledHeight = options.height;\n const promises = [];\n for (let i = 0; i < this.frames.length; i++) {\n const graphic = this.frames[i].graphic;\n if (graphic && graphic instanceof _Sprite__WEBPACK_IMPORTED_MODULE_2__.Sprite) {\n const tiledSprite = new _TiledSprite__WEBPACK_IMPORTED_MODULE_3__.TiledSprite({\n image: graphic.image,\n width: options.width,\n height: options.height,\n sourceView: { ...graphic.sourceView },\n wrapping: options.wrapping,\n filtering: options.filtering\n });\n this.frames[i].graphic = tiledSprite;\n // There is a new calc'd sourceView when ready\n tiledSprite.ready.then(() => {\n tiledSprite.sourceView = { ...tiledSprite.sourceView, ...this._sourceView };\n });\n promises.push(tiledSprite.ready);\n }\n }\n Promise.all(promises).then(() => this._ready.resolve());\n }\n static fromAnimation(animation, options) {\n return new TiledAnimation({\n width: animation.width,\n height: animation.height,\n ...options,\n animation\n });\n }\n _updateSourceView() {\n for (let i = 0; i < this.frames.length; i++) {\n const graphic = this.frames[i].graphic;\n if (graphic && graphic instanceof _Sprite__WEBPACK_IMPORTED_MODULE_2__.Sprite) {\n graphic.sourceView = { ...graphic.sourceView, ...this._sourceView };\n }\n }\n }\n get sourceView() {\n return (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_4__.watch)(this._sourceView, () => this._updateSourceView());\n }\n set sourceView(sourceView) {\n this._sourceView = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_4__.watch)(sourceView, () => this._updateSourceView());\n this._updateSourceView();\n }\n _updateWidthHeight() {\n for (let i = 0; i < this.frames.length; i++) {\n const graphic = this.frames[i].graphic;\n if (graphic && graphic instanceof _Sprite__WEBPACK_IMPORTED_MODULE_2__.Sprite) {\n graphic.sourceView.height = this._tiledHeight || graphic.height;\n graphic.destSize.height = this._tiledHeight || graphic.height;\n graphic.sourceView.width = this._tiledWidth || graphic.width;\n graphic.destSize.width = this._tiledWidth || graphic.width;\n }\n }\n }\n get width() {\n return this._tiledWidth;\n }\n get height() {\n return this._tiledHeight;\n }\n set width(width) {\n this._tiledWidth = width;\n this._updateWidthHeight();\n }\n set height(height) {\n this._tiledHeight = height;\n this._updateWidthHeight();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/TiledSprite.ts\":\n/*!*********************************!*\\\n !*** ./Graphics/TiledSprite.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TiledSprite: () => (/* binding */ TiledSprite)\n/* harmony export */ });\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Future */ \"./Util/Future.ts\");\n/* harmony import */ var _ImageSource__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ImageSource */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Sprite__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Sprite */ \"./Graphics/Sprite.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Wrapping */ \"./Graphics/Wrapping.ts\");\n\n\n\n\nclass TiledSprite extends _Sprite__WEBPACK_IMPORTED_MODULE_0__.Sprite {\n constructor(options) {\n super({\n image: options.image,\n sourceView: options.sourceView,\n destSize: { width: options.width, height: options.height },\n flipHorizontal: options.flipHorizontal,\n flipVertical: options.flipVertical,\n rotation: options.rotation,\n scale: options.scale,\n opacity: options.opacity,\n tint: options.tint,\n origin: options.origin\n });\n this._ready = new _Util_Future__WEBPACK_IMPORTED_MODULE_1__.Future();\n this.ready = this._ready.promise;\n this._options = options;\n if (this.image.isLoaded()) {\n this._applyTiling();\n }\n else {\n this.image.ready.then(() => this._applyTiling());\n }\n }\n static fromSprite(sprite, options) {\n return new TiledSprite({\n sourceView: { ...sprite.sourceView },\n width: sprite.width,\n height: sprite.height,\n ...options,\n image: sprite.image\n });\n }\n _applyTiling() {\n const { width, height, filtering, wrapping } = { ...this._options };\n const spriteCanvas = document.createElement('canvas');\n spriteCanvas.width = this.sourceView.width;\n spriteCanvas.height = this.sourceView.height;\n const spriteCtx = spriteCanvas.getContext('2d');\n // prettier-ignore\n spriteCtx.drawImage(this.image.image, this.sourceView.x, this.sourceView.y, this.sourceView.width, this.sourceView.height, 0, 0, this.sourceView.width, this.sourceView.height);\n // prettier-ignore\n const tiledImageSource = _ImageSource__WEBPACK_IMPORTED_MODULE_2__.ImageSource.fromHtmlCanvasElement(spriteCanvas, {\n wrapping: wrapping !== null && wrapping !== void 0 ? wrapping : _Wrapping__WEBPACK_IMPORTED_MODULE_3__.ImageWrapping.Repeat,\n filtering\n });\n if (width) {\n this.destSize.width = width;\n this.sourceView.width = width;\n }\n if (height) {\n this.destSize.height = height;\n this.sourceView.height = height;\n }\n this.sourceView.x = 0;\n this.sourceView.y = 0;\n this.image = tiledImageSource;\n // this._ready.resolve();\n this.image.ready.then(() => this._ready.resolve());\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/TransformInterpolation.ts\":\n/*!********************************************!*\\\n !*** ./Graphics/TransformInterpolation.ts ***!\n \\********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ blendGlobalTransform: () => (/* binding */ blendGlobalTransform),\n/* harmony export */ blendTransform: () => (/* binding */ blendTransform)\n/* harmony export */ });\n/* harmony import */ var _Math_transform__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Math/transform */ \"./Math/transform.ts\");\n\n/**\n * Blend 2 transforms for interpolation, will interpolate from the context of newTx's parent if it exists\n */\nfunction blendTransform(oldTx, newTx, blend, target) {\n if (oldTx.parent !== newTx.parent) {\n // Caller expects a local transform\n // Adjust old tx to be local to the new parent whatever that is\n const oldTxWithNewParent = oldTx.clone();\n const oldGlobalPos = oldTx.globalPos.clone();\n const oldGlobalScale = oldTx.globalScale.clone();\n const oldGlobalRotation = oldTx.globalRotation;\n oldTxWithNewParent.parent = newTx.parent;\n oldTxWithNewParent.globalPos = oldGlobalPos;\n oldTxWithNewParent.globalScale = oldGlobalScale;\n oldTxWithNewParent.globalRotation = oldGlobalRotation;\n oldTx = oldTxWithNewParent;\n }\n let interpolatedPos = newTx.pos;\n let interpolatedScale = newTx.scale;\n let interpolatedRotation = newTx.rotation;\n interpolatedPos = newTx.pos.scale(blend).add(oldTx.pos.scale(1.0 - blend));\n interpolatedScale = newTx.scale.scale(blend).add(oldTx.scale.scale(1.0 - blend));\n // Rotational lerp https://stackoverflow.com/a/30129248\n const cosine = (1.0 - blend) * Math.cos(oldTx.rotation) + blend * Math.cos(newTx.rotation);\n const sine = (1.0 - blend) * Math.sin(oldTx.rotation) + blend * Math.sin(newTx.rotation);\n interpolatedRotation = Math.atan2(sine, cosine);\n const tx = target !== null && target !== void 0 ? target : new _Math_transform__WEBPACK_IMPORTED_MODULE_0__.Transform();\n tx.setTransform(interpolatedPos, interpolatedRotation, interpolatedScale);\n return tx;\n}\n/**\n *\n */\nfunction blendGlobalTransform(oldTx, newTx, blend, target) {\n let interpolatedPos = newTx.globalPos;\n let interpolatedScale = newTx.globalScale;\n let interpolatedRotation = newTx.globalRotation;\n interpolatedPos = newTx.globalPos.scale(blend).add(oldTx.globalPos.scale(1.0 - blend));\n interpolatedScale = newTx.globalScale.scale(blend).add(oldTx.globalScale.scale(1.0 - blend));\n // Rotational lerp https://stackoverflow.com/a/30129248\n const cosine = (1.0 - blend) * Math.cos(oldTx.globalRotation) + blend * Math.cos(newTx.globalRotation);\n const sine = (1.0 - blend) * Math.sin(oldTx.globalRotation) + blend * Math.sin(newTx.globalRotation);\n interpolatedRotation = Math.atan2(sine, cosine);\n const tx = target !== null && target !== void 0 ? target : new _Math_transform__WEBPACK_IMPORTED_MODULE_0__.Transform();\n tx.setTransform(interpolatedPos, interpolatedRotation, interpolatedScale);\n return tx;\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Wrapping.ts\":\n/*!******************************!*\\\n !*** ./Graphics/Wrapping.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ImageWrapping: () => (/* binding */ ImageWrapping),\n/* harmony export */ parseImageWrapping: () => (/* binding */ parseImageWrapping)\n/* harmony export */ });\n/**\n * Describes the different image wrapping modes\n */\nvar ImageWrapping;\n(function (ImageWrapping) {\n ImageWrapping[\"Clamp\"] = \"Clamp\";\n ImageWrapping[\"Repeat\"] = \"Repeat\";\n ImageWrapping[\"Mirror\"] = \"Mirror\";\n})(ImageWrapping || (ImageWrapping = {}));\n/**\n *\n */\nfunction parseImageWrapping(val) {\n switch (val) {\n case ImageWrapping.Clamp:\n return ImageWrapping.Clamp;\n case ImageWrapping.Repeat:\n return ImageWrapping.Repeat;\n case ImageWrapping.Mirror:\n return ImageWrapping.Mirror;\n default:\n return ImageWrapping.Clamp;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/index.ts\":\n/*!***************************!*\\\n !*** ./Graphics/index.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Animation: () => (/* reexport safe */ _Animation__WEBPACK_IMPORTED_MODULE_5__.Animation),\n/* harmony export */ AnimationDirection: () => (/* reexport safe */ _Animation__WEBPACK_IMPORTED_MODULE_5__.AnimationDirection),\n/* harmony export */ AnimationEvents: () => (/* reexport safe */ _Animation__WEBPACK_IMPORTED_MODULE_5__.AnimationEvents),\n/* harmony export */ AnimationStrategy: () => (/* reexport safe */ _Animation__WEBPACK_IMPORTED_MODULE_5__.AnimationStrategy),\n/* harmony export */ BaseAlign: () => (/* reexport safe */ _FontCommon__WEBPACK_IMPORTED_MODULE_17__.BaseAlign),\n/* harmony export */ Canvas: () => (/* reexport safe */ _Canvas__WEBPACK_IMPORTED_MODULE_21__.Canvas),\n/* harmony export */ Circle: () => (/* reexport safe */ _Circle__WEBPACK_IMPORTED_MODULE_13__.Circle),\n/* harmony export */ ColorBlindnessMode: () => (/* reexport safe */ _PostProcessor_ColorBlindnessMode__WEBPACK_IMPORTED_MODULE_31__.ColorBlindnessMode),\n/* harmony export */ ColorBlindnessPostProcessor: () => (/* reexport safe */ _PostProcessor_ColorBlindnessPostProcessor__WEBPACK_IMPORTED_MODULE_32__.ColorBlindnessPostProcessor),\n/* harmony export */ Debug: () => (/* reexport safe */ _Debug__WEBPACK_IMPORTED_MODULE_41__.Debug),\n/* harmony export */ DebugGraphicsComponent: () => (/* reexport safe */ _DebugGraphicsComponent__WEBPACK_IMPORTED_MODULE_8__.DebugGraphicsComponent),\n/* harmony export */ DebugText: () => (/* reexport safe */ _Context_debug_text__WEBPACK_IMPORTED_MODULE_29__.DebugText),\n/* harmony export */ DefaultAntialiasOptions: () => (/* reexport safe */ _Context_ExcaliburGraphicsContext__WEBPACK_IMPORTED_MODULE_25__.DefaultAntialiasOptions),\n/* harmony export */ DefaultPixelArtOptions: () => (/* reexport safe */ _Context_ExcaliburGraphicsContext__WEBPACK_IMPORTED_MODULE_25__.DefaultPixelArtOptions),\n/* harmony export */ Direction: () => (/* reexport safe */ _FontCommon__WEBPACK_IMPORTED_MODULE_17__.Direction),\n/* harmony export */ ExcaliburGraphicsContext2DCanvas: () => (/* reexport safe */ _Context_ExcaliburGraphicsContext2DCanvas__WEBPACK_IMPORTED_MODULE_26__.ExcaliburGraphicsContext2DCanvas),\n/* harmony export */ ExcaliburGraphicsContextWebGL: () => (/* reexport safe */ _Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_27__.ExcaliburGraphicsContextWebGL),\n/* harmony export */ Font: () => (/* reexport safe */ _Font__WEBPACK_IMPORTED_MODULE_18__.Font),\n/* harmony export */ FontCache: () => (/* reexport safe */ _FontCache__WEBPACK_IMPORTED_MODULE_19__.FontCache),\n/* harmony export */ FontStyle: () => (/* reexport safe */ _FontCommon__WEBPACK_IMPORTED_MODULE_17__.FontStyle),\n/* harmony export */ FontUnit: () => (/* reexport safe */ _FontCommon__WEBPACK_IMPORTED_MODULE_17__.FontUnit),\n/* harmony export */ Graphic: () => (/* reexport safe */ _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic),\n/* harmony export */ GraphicsComponent: () => (/* reexport safe */ _GraphicsComponent__WEBPACK_IMPORTED_MODULE_7__.GraphicsComponent),\n/* harmony export */ GraphicsGroup: () => (/* reexport safe */ _GraphicsGroup__WEBPACK_IMPORTED_MODULE_3__.GraphicsGroup),\n/* harmony export */ GraphicsSystem: () => (/* reexport safe */ _GraphicsSystem__WEBPACK_IMPORTED_MODULE_9__.GraphicsSystem),\n/* harmony export */ ImageFiltering: () => (/* reexport safe */ _Filtering__WEBPACK_IMPORTED_MODULE_34__.ImageFiltering),\n/* harmony export */ ImageSource: () => (/* reexport safe */ _ImageSource__WEBPACK_IMPORTED_MODULE_4__.ImageSource),\n/* harmony export */ ImageSourceAttributeConstants: () => (/* reexport safe */ _ImageSource__WEBPACK_IMPORTED_MODULE_4__.ImageSourceAttributeConstants),\n/* harmony export */ ImageWrapping: () => (/* reexport safe */ _Wrapping__WEBPACK_IMPORTED_MODULE_35__.ImageWrapping),\n/* harmony export */ Line: () => (/* reexport safe */ _Line__WEBPACK_IMPORTED_MODULE_6__.Line),\n/* harmony export */ Material: () => (/* reexport safe */ _Context_material__WEBPACK_IMPORTED_MODULE_40__.Material),\n/* harmony export */ NineSlice: () => (/* reexport safe */ _NineSlice__WEBPACK_IMPORTED_MODULE_22__.NineSlice),\n/* harmony export */ NineSliceStretch: () => (/* reexport safe */ _NineSlice__WEBPACK_IMPORTED_MODULE_22__.NineSliceStretch),\n/* harmony export */ OffscreenSystem: () => (/* reexport safe */ _OffscreenSystem__WEBPACK_IMPORTED_MODULE_10__.OffscreenSystem),\n/* harmony export */ ParallaxComponent: () => (/* reexport safe */ _ParallaxComponent__WEBPACK_IMPORTED_MODULE_11__.ParallaxComponent),\n/* harmony export */ ParticleRenderer: () => (/* reexport safe */ _Context_particle_renderer_particle_renderer__WEBPACK_IMPORTED_MODULE_28__.ParticleRenderer),\n/* harmony export */ Polygon: () => (/* reexport safe */ _Polygon__WEBPACK_IMPORTED_MODULE_15__.Polygon),\n/* harmony export */ QuadIndexBuffer: () => (/* reexport safe */ _Context_quad_index_buffer__WEBPACK_IMPORTED_MODULE_39__.QuadIndexBuffer),\n/* harmony export */ Raster: () => (/* reexport safe */ _Raster__WEBPACK_IMPORTED_MODULE_12__.Raster),\n/* harmony export */ Rectangle: () => (/* reexport safe */ _Rectangle__WEBPACK_IMPORTED_MODULE_14__.Rectangle),\n/* harmony export */ ScreenShader: () => (/* reexport safe */ _PostProcessor_ScreenShader__WEBPACK_IMPORTED_MODULE_30__.ScreenShader),\n/* harmony export */ Shader: () => (/* reexport safe */ _Context_shader__WEBPACK_IMPORTED_MODULE_36__.Shader),\n/* harmony export */ Sprite: () => (/* reexport safe */ _Sprite__WEBPACK_IMPORTED_MODULE_1__.Sprite),\n/* harmony export */ SpriteFont: () => (/* reexport safe */ _SpriteFont__WEBPACK_IMPORTED_MODULE_20__.SpriteFont),\n/* harmony export */ SpriteSheet: () => (/* reexport safe */ _SpriteSheet__WEBPACK_IMPORTED_MODULE_2__.SpriteSheet),\n/* harmony export */ Text: () => (/* reexport safe */ _Text__WEBPACK_IMPORTED_MODULE_16__.Text),\n/* harmony export */ TextAlign: () => (/* reexport safe */ _FontCommon__WEBPACK_IMPORTED_MODULE_17__.TextAlign),\n/* harmony export */ TextureLoader: () => (/* reexport safe */ _Context_texture_loader__WEBPACK_IMPORTED_MODULE_33__.TextureLoader),\n/* harmony export */ TiledAnimation: () => (/* reexport safe */ _TiledAnimation__WEBPACK_IMPORTED_MODULE_24__.TiledAnimation),\n/* harmony export */ TiledSprite: () => (/* reexport safe */ _TiledSprite__WEBPACK_IMPORTED_MODULE_23__.TiledSprite),\n/* harmony export */ VertexBuffer: () => (/* reexport safe */ _Context_vertex_buffer__WEBPACK_IMPORTED_MODULE_37__.VertexBuffer),\n/* harmony export */ VertexLayout: () => (/* reexport safe */ _Context_vertex_layout__WEBPACK_IMPORTED_MODULE_38__.VertexLayout),\n/* harmony export */ hasGraphicsTick: () => (/* reexport safe */ _GraphicsComponent__WEBPACK_IMPORTED_MODULE_7__.hasGraphicsTick),\n/* harmony export */ parseImageFiltering: () => (/* reexport safe */ _Filtering__WEBPACK_IMPORTED_MODULE_34__.parseImageFiltering),\n/* harmony export */ parseImageWrapping: () => (/* reexport safe */ _Wrapping__WEBPACK_IMPORTED_MODULE_35__.parseImageWrapping),\n/* harmony export */ pixelSnapEpsilon: () => (/* reexport safe */ _Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_27__.pixelSnapEpsilon),\n/* harmony export */ webgl: () => (/* reexport module object */ _Context_webgl_util__WEBPACK_IMPORTED_MODULE_42__)\n/* harmony export */ });\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Sprite__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Sprite */ \"./Graphics/Sprite.ts\");\n/* harmony import */ var _SpriteSheet__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./SpriteSheet */ \"./Graphics/SpriteSheet.ts\");\n/* harmony import */ var _GraphicsGroup__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./GraphicsGroup */ \"./Graphics/GraphicsGroup.ts\");\n/* harmony import */ var _ImageSource__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./ImageSource */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Animation__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Animation */ \"./Graphics/Animation.ts\");\n/* harmony import */ var _Line__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Line */ \"./Graphics/Line.ts\");\n/* harmony import */ var _GraphicsComponent__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _DebugGraphicsComponent__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./DebugGraphicsComponent */ \"./Graphics/DebugGraphicsComponent.ts\");\n/* harmony import */ var _GraphicsSystem__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./GraphicsSystem */ \"./Graphics/GraphicsSystem.ts\");\n/* harmony import */ var _OffscreenSystem__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./OffscreenSystem */ \"./Graphics/OffscreenSystem.ts\");\n/* harmony import */ var _ParallaxComponent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./ParallaxComponent */ \"./Graphics/ParallaxComponent.ts\");\n/* harmony import */ var _Raster__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Raster */ \"./Graphics/Raster.ts\");\n/* harmony import */ var _Circle__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Circle */ \"./Graphics/Circle.ts\");\n/* harmony import */ var _Rectangle__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Rectangle */ \"./Graphics/Rectangle.ts\");\n/* harmony import */ var _Polygon__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Polygon */ \"./Graphics/Polygon.ts\");\n/* harmony import */ var _Text__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Text */ \"./Graphics/Text.ts\");\n/* harmony import */ var _FontCommon__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./FontCommon */ \"./Graphics/FontCommon.ts\");\n/* harmony import */ var _Font__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Font */ \"./Graphics/Font.ts\");\n/* harmony import */ var _FontCache__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./FontCache */ \"./Graphics/FontCache.ts\");\n/* harmony import */ var _SpriteFont__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./SpriteFont */ \"./Graphics/SpriteFont.ts\");\n/* harmony import */ var _Canvas__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./Canvas */ \"./Graphics/Canvas.ts\");\n/* harmony import */ var _NineSlice__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./NineSlice */ \"./Graphics/NineSlice.ts\");\n/* harmony import */ var _TiledSprite__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./TiledSprite */ \"./Graphics/TiledSprite.ts\");\n/* harmony import */ var _TiledAnimation__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./TiledAnimation */ \"./Graphics/TiledAnimation.ts\");\n/* harmony import */ var _Context_ExcaliburGraphicsContext__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./Context/ExcaliburGraphicsContext */ \"./Graphics/Context/ExcaliburGraphicsContext.ts\");\n/* harmony import */ var _Context_ExcaliburGraphicsContext2DCanvas__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./Context/ExcaliburGraphicsContext2DCanvas */ \"./Graphics/Context/ExcaliburGraphicsContext2DCanvas.ts\");\n/* harmony import */ var _Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./Context/ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _Context_particle_renderer_particle_renderer__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./Context/particle-renderer/particle-renderer */ \"./Graphics/Context/particle-renderer/particle-renderer.ts\");\n/* harmony import */ var _Context_debug_text__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./Context/debug-text */ \"./Graphics/Context/debug-text.ts\");\n/* harmony import */ var _PostProcessor_ScreenShader__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./PostProcessor/ScreenShader */ \"./Graphics/PostProcessor/ScreenShader.ts\");\n/* harmony import */ var _PostProcessor_ColorBlindnessMode__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./PostProcessor/ColorBlindnessMode */ \"./Graphics/PostProcessor/ColorBlindnessMode.ts\");\n/* harmony import */ var _PostProcessor_ColorBlindnessPostProcessor__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./PostProcessor/ColorBlindnessPostProcessor */ \"./Graphics/PostProcessor/ColorBlindnessPostProcessor.ts\");\n/* harmony import */ var _Context_texture_loader__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./Context/texture-loader */ \"./Graphics/Context/texture-loader.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./Wrapping */ \"./Graphics/Wrapping.ts\");\n/* harmony import */ var _Context_shader__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./Context/shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _Context_vertex_buffer__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./Context/vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _Context_vertex_layout__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./Context/vertex-layout */ \"./Graphics/Context/vertex-layout.ts\");\n/* harmony import */ var _Context_quad_index_buffer__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./Context/quad-index-buffer */ \"./Graphics/Context/quad-index-buffer.ts\");\n/* harmony import */ var _Context_material__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./Context/material */ \"./Graphics/Context/material.ts\");\n/* harmony import */ var _Debug__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ./Debug */ \"./Graphics/Debug.ts\");\n/* harmony import */ var _Context_webgl_util__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ./Context/webgl-util */ \"./Graphics/Context/webgl-util.ts\");\n// Graphics\n\n\n\n\n\n\n\n// Graphics ECS\n\n\n\n\n\n// Raster graphics\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// TODO DELETEME\n\n\n// Post Processor\n\n\n\n\n\n\n\n// Rendering\n\n\n\n\n\n\n// Debug\n\n// Util\n\n\n\n\n/***/ }),\n\n/***/ \"./Id.ts\":\n/*!***************!*\\\n !*** ./Id.ts ***!\n \\***************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ createId: () => (/* binding */ createId)\n/* harmony export */ });\n/**\n * Create a branded ID type from a number\n */\nfunction createId(type, value) {\n return { type, value };\n}\n\n\n/***/ }),\n\n/***/ \"./Input/Gamepad.ts\":\n/*!**************************!*\\\n !*** ./Input/Gamepad.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Axes: () => (/* binding */ Axes),\n/* harmony export */ Buttons: () => (/* binding */ Buttons),\n/* harmony export */ Gamepad: () => (/* binding */ Gamepad),\n/* harmony export */ GamepadEvents: () => (/* binding */ GamepadEvents),\n/* harmony export */ Gamepads: () => (/* binding */ Gamepads)\n/* harmony export */ });\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n\n\nconst GamepadEvents = {\n GamepadConnect: 'connect',\n GamepadDisconnect: 'disconnect',\n GamepadButton: 'button',\n GamepadAxis: 'axis'\n};\n/**\n * Excalibur leverages the HTML5 Gamepad API [where it is supported](http://caniuse.com/#feat=gamepad)\n * to provide controller support for your games.\n */\nclass Gamepads {\n constructor() {\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n /**\n * Whether or not to poll for Gamepad input (default: `false`)\n */\n this.enabled = false;\n /**\n * Whether or not Gamepad API is supported\n */\n this.supported = !!navigator.getGamepads;\n this._gamePadTimeStamps = [0, 0, 0, 0];\n this._oldPads = [];\n this._pads = [];\n this._initSuccess = false;\n this._navigator = navigator;\n this._minimumConfiguration = null;\n this._enabled = true;\n }\n init() {\n if (!this.supported) {\n return;\n }\n if (this._initSuccess) {\n return;\n }\n // In Chrome, this will return 4 undefined items until a button is pressed\n // In FF, this will not return any items until a button is pressed\n this._oldPads = this._clonePads(this._navigator.getGamepads());\n if (this._oldPads.length && this._oldPads[0]) {\n this._initSuccess = true;\n }\n }\n toggleEnabled(enabled) {\n this._enabled = enabled;\n }\n /**\n * Sets the minimum gamepad configuration, for example {axis: 4, buttons: 4} means\n * this game requires at minimum 4 axis inputs and 4 buttons, this is not restrictive\n * all other controllers with more axis or buttons are valid as well. If no minimum\n * configuration is set all pads are valid.\n */\n setMinimumGamepadConfiguration(config) {\n this._enableAndUpdate(); // if config is used, implicitly enable\n this._minimumConfiguration = config;\n }\n /**\n * When implicitly enabled, set the enabled flag and run an update so information is updated\n */\n _enableAndUpdate() {\n if (!this.enabled) {\n this.enabled = true;\n this.update();\n }\n }\n /**\n * Checks a navigator gamepad against the minimum configuration if present.\n */\n _isGamepadValid(pad) {\n if (!this._minimumConfiguration) {\n return true;\n }\n if (!pad) {\n return false;\n }\n const axesLength = pad.axes.filter((value) => {\n return typeof value !== undefined;\n }).length;\n const buttonLength = pad.buttons.filter((value) => {\n return typeof value !== undefined;\n }).length;\n return axesLength >= this._minimumConfiguration.axis && buttonLength >= this._minimumConfiguration.buttons && pad.connected;\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n this._enableAndUpdate(); // implicitly enable\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this._enableAndUpdate(); // implicitly enable\n this.events.off(eventName, handler);\n }\n /**\n * Updates Gamepad state and publishes Gamepad events\n */\n update() {\n if (!this.enabled || !this.supported) {\n return;\n }\n if (!this._enabled) {\n return;\n }\n this.init();\n const gamepads = this._navigator.getGamepads();\n for (let i = 0; i < gamepads.length; i++) {\n if (!gamepads[i]) {\n const gamepad = this.at(i);\n // If was connected, but now isn't emit the disconnect event\n if (gamepad.connected) {\n this.events.emit('disconnect', new _Events__WEBPACK_IMPORTED_MODULE_1__.GamepadDisconnectEvent(i, gamepad));\n }\n // Reset connection status\n gamepad.connected = false;\n continue;\n }\n else {\n if (!this.at(i).connected && this._isGamepadValid(gamepads[i])) {\n this.events.emit('connect', new _Events__WEBPACK_IMPORTED_MODULE_1__.GamepadConnectEvent(i, this.at(i)));\n }\n // Set connection status\n this.at(i).connected = true;\n }\n this.at(i).update();\n // Only supported in Chrome\n if (gamepads[i].timestamp && gamepads[i].timestamp === this._gamePadTimeStamps[i]) {\n continue;\n }\n this._gamePadTimeStamps[i] = gamepads[i].timestamp;\n // Add reference to navigator gamepad\n this.at(i).navigatorGamepad = gamepads[i];\n // Buttons\n let b, bi, a, ai, value;\n for (b in Buttons) {\n bi = Buttons[b];\n if (typeof bi === 'number') {\n if (gamepads[i].buttons[bi]) {\n value = gamepads[i].buttons[bi].value;\n if (value !== this._oldPads[i].getButton(bi)) {\n if (gamepads[i].buttons[bi].pressed) {\n this.at(i).updateButton(bi, value);\n this.at(i).events.emit('button', new _Events__WEBPACK_IMPORTED_MODULE_1__.GamepadButtonEvent(bi, value, this.at(i)));\n }\n else {\n this.at(i).updateButton(bi, 0);\n }\n }\n }\n }\n }\n // Axes\n for (a in Axes) {\n ai = Axes[a];\n if (typeof ai === 'number') {\n value = gamepads[i].axes[ai];\n if (value !== this._oldPads[i].getAxes(ai)) {\n this.at(i).updateAxes(ai, value);\n this.at(i).events.emit('axis', new _Events__WEBPACK_IMPORTED_MODULE_1__.GamepadAxisEvent(ai, value, this.at(i)));\n }\n }\n }\n this._oldPads[i] = this._clonePad(gamepads[i]);\n }\n }\n /**\n * Safely retrieves a Gamepad at a specific index and creates one if it doesn't yet exist\n */\n at(index) {\n this._enableAndUpdate(); // implicitly enable gamepads when at() is called\n if (index >= this._pads.length) {\n // Ensure there is a pad to retrieve\n for (let i = this._pads.length - 1, max = index; i < max; i++) {\n this._pads.push(new Gamepad());\n this._oldPads.push(new Gamepad());\n }\n }\n return this._pads[index];\n }\n /**\n * Returns a list of all valid gamepads that meet the minimum configuration requirement.\n */\n getValidGamepads() {\n this._enableAndUpdate();\n const result = [];\n for (let i = 0; i < this._pads.length; i++) {\n if (this._isGamepadValid(this.at(i).navigatorGamepad) && this.at(i).connected) {\n result.push(this.at(i));\n }\n }\n return result;\n }\n /**\n * Gets the number of connected gamepads\n */\n count() {\n return this._pads.filter((p) => p.connected).length;\n }\n _clonePads(pads) {\n const arr = [];\n for (let i = 0, len = pads.length; i < len; i++) {\n arr.push(this._clonePad(pads[i]));\n }\n return arr;\n }\n /**\n * Fastest way to clone a known object is to do it yourself\n */\n _clonePad(pad) {\n let i, len;\n const clonedPad = new Gamepad();\n if (!pad) {\n return clonedPad;\n }\n for (i = 0, len = pad.buttons.length; i < len; i++) {\n if (pad.buttons[i]) {\n clonedPad.updateButton(i, pad.buttons[i].value);\n }\n }\n for (i = 0, len = pad.axes.length; i < len; i++) {\n clonedPad.updateAxes(i, pad.axes[i]);\n }\n return clonedPad;\n }\n}\n/**\n * The minimum value an axis has to move before considering it a change\n */\nGamepads.MinAxisMoveThreshold = 0.05;\n/**\n * Gamepad holds state information for a connected controller. See {@apilink Gamepads}\n * for more information on handling controller input.\n */\nclass Gamepad {\n constructor() {\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n this.connected = false;\n this._axes = new Array(4);\n this._buttons = new Array(16);\n this._buttonsUp = new Array(16);\n this._buttonsDown = new Array(16);\n for (let i = 0; i < this._buttons.length; i++) {\n this._buttons[i] = 0;\n }\n for (let i = 0; i < this._axes.length; i++) {\n this._axes[i] = 0;\n }\n }\n update() {\n // Reset buttonsDown and buttonsUp after update is complete\n this._buttonsDown = new Array(16);\n this._buttonsUp = new Array(16);\n }\n /**\n * Whether or not the given button is pressed\n * @deprecated will be removed in v0.28.0. Use isButtonHeld instead\n * @param button The button to query\n * @param threshold The threshold over which the button is considered to be pressed\n */\n isButtonPressed(button, threshold = 1) {\n return this._buttons[button] >= threshold;\n }\n /**\n * Tests if a certain button is held down. This is persisted between frames.\n * @param button The button to query\n * @param threshold The threshold over which the button is considered to be pressed\n */\n isButtonHeld(button, threshold = 1) {\n return this._buttons[button] >= threshold;\n }\n /**\n * Tests if a certain button was just pressed this frame. This is cleared at the end of the update frame.\n * @param button Test whether a button was just pressed\n * @param threshold The threshold over which the button is considered to be pressed\n */\n wasButtonPressed(button, threshold = 1) {\n return this._buttonsDown[button] >= threshold;\n }\n /**\n * Tests if a certain button was just released this frame. This is cleared at the end of the update frame.\n * @param button Test whether a button was just released\n */\n wasButtonReleased(button) {\n return Boolean(this._buttonsUp[button]);\n }\n /**\n * Gets the given button value between 0 and 1\n */\n getButton(button) {\n return this._buttons[button];\n }\n /**\n * Gets the given axis value between -1 and 1. Values below\n * {@apilink MinAxisMoveThreshold} are considered 0.\n */\n getAxes(axes) {\n const value = this._axes[axes];\n if (Math.abs(value) < Gamepads.MinAxisMoveThreshold) {\n return 0;\n }\n else {\n return value;\n }\n }\n updateButton(buttonIndex, value) {\n // button was just released\n if (value === 0 && this._buttons[buttonIndex]) {\n this._buttonsUp[buttonIndex] = 1;\n // button was just pressed\n }\n else {\n this._buttonsDown[buttonIndex] = value;\n }\n this._buttons[buttonIndex] = value;\n }\n updateAxes(axesIndex, value) {\n this._axes[axesIndex] = value;\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n}\n/**\n * Gamepad Buttons enumeration\n */\nvar Buttons;\n(function (Buttons) {\n /**\n * Face 1 button (e.g. A)\n */\n Buttons[Buttons[\"Face1\"] = 0] = \"Face1\";\n /**\n * Face 2 button (e.g. B)\n */\n Buttons[Buttons[\"Face2\"] = 1] = \"Face2\";\n /**\n * Face 3 button (e.g. X)\n */\n Buttons[Buttons[\"Face3\"] = 2] = \"Face3\";\n /**\n * Face 4 button (e.g. Y)\n */\n Buttons[Buttons[\"Face4\"] = 3] = \"Face4\";\n /**\n * Left bumper button\n */\n Buttons[Buttons[\"LeftBumper\"] = 4] = \"LeftBumper\";\n /**\n * Right bumper button\n */\n Buttons[Buttons[\"RightBumper\"] = 5] = \"RightBumper\";\n /**\n * Left trigger button\n */\n Buttons[Buttons[\"LeftTrigger\"] = 6] = \"LeftTrigger\";\n /**\n * Right trigger button\n */\n Buttons[Buttons[\"RightTrigger\"] = 7] = \"RightTrigger\";\n /**\n * Select button\n */\n Buttons[Buttons[\"Select\"] = 8] = \"Select\";\n /**\n * Start button\n */\n Buttons[Buttons[\"Start\"] = 9] = \"Start\";\n /**\n * Left analog stick press (e.g. L3)\n */\n Buttons[Buttons[\"LeftStick\"] = 10] = \"LeftStick\";\n /**\n * Right analog stick press (e.g. R3)\n */\n Buttons[Buttons[\"RightStick\"] = 11] = \"RightStick\";\n /**\n * D-pad up\n */\n Buttons[Buttons[\"DpadUp\"] = 12] = \"DpadUp\";\n /**\n * D-pad down\n */\n Buttons[Buttons[\"DpadDown\"] = 13] = \"DpadDown\";\n /**\n * D-pad left\n */\n Buttons[Buttons[\"DpadLeft\"] = 14] = \"DpadLeft\";\n /**\n * D-pad right\n */\n Buttons[Buttons[\"DpadRight\"] = 15] = \"DpadRight\";\n})(Buttons || (Buttons = {}));\n/**\n * Gamepad Axes enumeration\n */\nvar Axes;\n(function (Axes) {\n /**\n * Left analogue stick X direction\n */\n Axes[Axes[\"LeftStickX\"] = 0] = \"LeftStickX\";\n /**\n * Left analogue stick Y direction\n */\n Axes[Axes[\"LeftStickY\"] = 1] = \"LeftStickY\";\n /**\n * Right analogue stick X direction\n */\n Axes[Axes[\"RightStickX\"] = 2] = \"RightStickX\";\n /**\n * Right analogue stick Y direction\n */\n Axes[Axes[\"RightStickY\"] = 3] = \"RightStickY\";\n})(Axes || (Axes = {}));\n\n\n/***/ }),\n\n/***/ \"./Input/InputHost.ts\":\n/*!****************************!*\\\n !*** ./Input/InputHost.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ InputHost: () => (/* binding */ InputHost)\n/* harmony export */ });\n/* harmony import */ var _Gamepad__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Gamepad */ \"./Input/Gamepad.ts\");\n/* harmony import */ var _InputMapper__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./InputMapper */ \"./Input/InputMapper.ts\");\n/* harmony import */ var _Keyboard__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Keyboard */ \"./Input/Keyboard.ts\");\n/* harmony import */ var _PointerEventReceiver__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./PointerEventReceiver */ \"./Input/PointerEventReceiver.ts\");\n\n\n\n\nclass InputHost {\n constructor(options) {\n this._enabled = true;\n const { pointerTarget, grabWindowFocus, engine } = options;\n this.keyboard = new _Keyboard__WEBPACK_IMPORTED_MODULE_0__.Keyboard();\n this.pointers = new _PointerEventReceiver__WEBPACK_IMPORTED_MODULE_1__.PointerEventReceiver(pointerTarget, engine);\n this.gamepads = new _Gamepad__WEBPACK_IMPORTED_MODULE_2__.Gamepads();\n this.keyboard.init({ grabWindowFocus });\n this.pointers.init({ grabWindowFocus });\n this.gamepads.init();\n this.inputMapper = new _InputMapper__WEBPACK_IMPORTED_MODULE_3__.InputMapper({\n keyboard: this.keyboard,\n pointers: this.pointers,\n gamepads: this.gamepads\n });\n }\n get enabled() {\n return this._enabled;\n }\n toggleEnabled(enabled) {\n this._enabled = enabled;\n this.keyboard.toggleEnabled(this._enabled);\n this.pointers.toggleEnabled(this._enabled);\n this.gamepads.toggleEnabled(this._enabled);\n }\n update() {\n if (this._enabled) {\n this.inputMapper.execute();\n this.keyboard.update();\n this.gamepads.update();\n }\n }\n clear() {\n this.keyboard.clear();\n this.pointers.clear();\n // this.gamepads.clear();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Input/InputMapper.ts\":\n/*!******************************!*\\\n !*** ./Input/InputMapper.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ InputMapper: () => (/* binding */ InputMapper)\n/* harmony export */ });\n/**\n * This allows you to map multiple inputs to specific commands! This is especially useful when\n * you need to allow multiple input sources to control a specific action.\n */\nclass InputMapper {\n constructor(inputs) {\n this.inputs = inputs;\n this._handlers = new Map();\n }\n /**\n * Executes the input map, called internally by Excalibur\n */\n execute() {\n for (const [input, command] of this._handlers.entries()) {\n const results = input(this.inputs);\n if (results) {\n command(results);\n }\n }\n }\n /**\n * This allows you to map multiple inputs to specific commands! This is useful\n *\n * The inputHandler should return a truthy value if you wish the commandHandler to fire.\n *\n * Example:\n * ```typescript\n * const moveRight = (amount: number) => { actor.vel.x = 100 * amount }\n * const moveLeft = (amount: number) => { actor.vel.x = -100 * amount }\n * const moveUp = (amount: number) => { actor.vel.y = -100 * amount }\n * const moveDown = (amount: number) => { actor.vel.y = 100 * amount }\n *\n * engine.inputMapper.on(({keyboard}) => keyboard.isHeld(ex.Keys.ArrowRight) ? 1 : 0, moveRight);\n * engine.inputMapper.on(({gamepads}) => gamepads.at(0).isButtonPressed(ex.Buttons.DpadRight) ? 1 : 0, moveRight);\n * engine.inputMapper.on(({gamepads}) => gamepads.at(0).getAxes(ex.Axes.LeftStickX) > 0 ?\n * gamepads.at(0).getAxes(ex.Axes.LeftStickX) : 0, moveRight);\n * ```\n * @param inputHandler\n * @param commandHandler\n */\n on(inputHandler, commandHandler) {\n this._handlers.set(inputHandler, commandHandler);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Input/Keyboard.ts\":\n/*!***************************!*\\\n !*** ./Input/Keyboard.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ KeyEvent: () => (/* binding */ KeyEvent),\n/* harmony export */ KeyEvents: () => (/* binding */ KeyEvents),\n/* harmony export */ Keyboard: () => (/* binding */ Keyboard),\n/* harmony export */ Keys: () => (/* binding */ Keys)\n/* harmony export */ });\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _Util_IFrame__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Util/IFrame */ \"./Util/IFrame.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n\n/**\n * Enum representing physical input key codes\n *\n * Spec: https://w3c.github.io/uievents-code/#key-alphanumeric-section\n */\nvar Keys;\n(function (Keys) {\n // Writing System Keys https://w3c.github.io/uievents-code/#key-alphanumeric-writing-system\n Keys[\"Backquote\"] = \"Backquote\";\n Keys[\"Backslash\"] = \"Backslash\";\n Keys[\"BracketLeft\"] = \"BracketLeft\";\n Keys[\"BracketRight\"] = \"BracketRight\";\n Keys[\"Comma\"] = \"Comma\";\n // NUMBERS\n Keys[\"Key0\"] = \"Digit0\";\n Keys[\"Key1\"] = \"Digit1\";\n Keys[\"Key2\"] = \"Digit2\";\n Keys[\"Key3\"] = \"Digit3\";\n Keys[\"Key4\"] = \"Digit4\";\n Keys[\"Key5\"] = \"Digit5\";\n Keys[\"Key6\"] = \"Digit6\";\n Keys[\"Key7\"] = \"Digit7\";\n Keys[\"Key8\"] = \"Digit8\";\n Keys[\"Key9\"] = \"Digit9\";\n Keys[\"Digit0\"] = \"Digit0\";\n Keys[\"Digit1\"] = \"Digit1\";\n Keys[\"Digit2\"] = \"Digit2\";\n Keys[\"Digit3\"] = \"Digit3\";\n Keys[\"Digit4\"] = \"Digit4\";\n Keys[\"Digit5\"] = \"Digit5\";\n Keys[\"Digit6\"] = \"Digit6\";\n Keys[\"Digit7\"] = \"Digit7\";\n Keys[\"Digit8\"] = \"Digit8\";\n Keys[\"Digit9\"] = \"Digit9\";\n Keys[\"Equal\"] = \"Equal\";\n Keys[\"IntlBackslash\"] = \"IntlBackslash\";\n Keys[\"IntlRo\"] = \"IntlRo\";\n Keys[\"IntlYen\"] = \"IntlYen\";\n // LETTERS\n Keys[\"A\"] = \"KeyA\";\n Keys[\"B\"] = \"KeyB\";\n Keys[\"C\"] = \"KeyC\";\n Keys[\"D\"] = \"KeyD\";\n Keys[\"E\"] = \"KeyE\";\n Keys[\"F\"] = \"KeyF\";\n Keys[\"G\"] = \"KeyG\";\n Keys[\"H\"] = \"KeyH\";\n Keys[\"I\"] = \"KeyI\";\n Keys[\"J\"] = \"KeyJ\";\n Keys[\"K\"] = \"KeyK\";\n Keys[\"L\"] = \"KeyL\";\n Keys[\"M\"] = \"KeyM\";\n Keys[\"N\"] = \"KeyN\";\n Keys[\"O\"] = \"KeyO\";\n Keys[\"P\"] = \"KeyP\";\n Keys[\"Q\"] = \"KeyQ\";\n Keys[\"R\"] = \"KeyR\";\n Keys[\"S\"] = \"KeyS\";\n Keys[\"T\"] = \"KeyT\";\n Keys[\"U\"] = \"KeyU\";\n Keys[\"V\"] = \"KeyV\";\n Keys[\"W\"] = \"KeyW\";\n Keys[\"X\"] = \"KeyX\";\n Keys[\"Y\"] = \"KeyY\";\n Keys[\"Z\"] = \"KeyZ\";\n Keys[\"KeyA\"] = \"KeyA\";\n Keys[\"KeyB\"] = \"KeyB\";\n Keys[\"KeyC\"] = \"KeyC\";\n Keys[\"KeyD\"] = \"KeyD\";\n Keys[\"KeyE\"] = \"KeyE\";\n Keys[\"KeyF\"] = \"KeyF\";\n Keys[\"KeyG\"] = \"KeyG\";\n Keys[\"KeyH\"] = \"KeyH\";\n Keys[\"KeyI\"] = \"KeyI\";\n Keys[\"KeyJ\"] = \"KeyJ\";\n Keys[\"KeyK\"] = \"KeyK\";\n Keys[\"KeyL\"] = \"KeyL\";\n Keys[\"KeyM\"] = \"KeyM\";\n Keys[\"KeyN\"] = \"KeyN\";\n Keys[\"KeyO\"] = \"KeyO\";\n Keys[\"KeyP\"] = \"KeyP\";\n Keys[\"KeyQ\"] = \"KeyQ\";\n Keys[\"KeyR\"] = \"KeyR\";\n Keys[\"KeyS\"] = \"KeyS\";\n Keys[\"KeyT\"] = \"KeyT\";\n Keys[\"KeyU\"] = \"KeyU\";\n Keys[\"KeyV\"] = \"KeyV\";\n Keys[\"KeyW\"] = \"KeyW\";\n Keys[\"KeyX\"] = \"KeyX\";\n Keys[\"KeyY\"] = \"KeyY\";\n Keys[\"KeyZ\"] = \"KeyZ\";\n // SYMBOLS\n Keys[\"Minus\"] = \"Minus\";\n Keys[\"Period\"] = \"Period\";\n Keys[\"Quote\"] = \"Quote\";\n Keys[\"Semicolon\"] = \"Semicolon\";\n Keys[\"Slash\"] = \"Slash\";\n // Functional keys https://w3c.github.io/uievents-code/#key-alphanumeric-functional\n Keys[\"AltLeft\"] = \"AltLeft\";\n Keys[\"AltRight\"] = \"AltRight\";\n Keys[\"Alt\"] = \"Alt\";\n Keys[\"AltGraph\"] = \"AltGraph\";\n Keys[\"Backspace\"] = \"Backspace\";\n Keys[\"CapsLock\"] = \"CapsLock\";\n Keys[\"ContextMenu\"] = \"ContextMenu\";\n Keys[\"ControlLeft\"] = \"ControlLeft\";\n Keys[\"ControlRight\"] = \"ControlRight\";\n Keys[\"Enter\"] = \"Enter\";\n Keys[\"MetaLeft\"] = \"MetaLeft\";\n Keys[\"MetaRight\"] = \"MetaRight\";\n Keys[\"ShiftLeft\"] = \"ShiftLeft\";\n Keys[\"ShiftRight\"] = \"ShiftRight\";\n Keys[\"Space\"] = \"Space\";\n Keys[\"Tab\"] = \"Tab\";\n Keys[\"Convert\"] = \"Convert\";\n Keys[\"KanaMode\"] = \"KanaMode\";\n Keys[\"NonConvert\"] = \"NonConvert\";\n // Control Pad https://w3c.github.io/uievents-code/#key-controlpad-section\n Keys[\"Delete\"] = \"Delete\";\n Keys[\"End\"] = \"End\";\n Keys[\"Help\"] = \"Help\";\n Keys[\"Home\"] = \"Home\";\n Keys[\"Insert\"] = \"Insert\";\n Keys[\"PageDown\"] = \"PageDown\";\n Keys[\"PageUp\"] = \"PageUp\";\n // Arrow Pad https://w3c.github.io/uievents-code/#key-arrowpad-section\n Keys[\"Up\"] = \"ArrowUp\";\n Keys[\"Down\"] = \"ArrowDown\";\n Keys[\"Left\"] = \"ArrowLeft\";\n Keys[\"Right\"] = \"ArrowRight\";\n Keys[\"ArrowUp\"] = \"ArrowUp\";\n Keys[\"ArrowDown\"] = \"ArrowDown\";\n Keys[\"ArrowLeft\"] = \"ArrowLeft\";\n Keys[\"ArrowRight\"] = \"ArrowRight\";\n // Numpad Section https://w3c.github.io/uievents-code/#key-numpad-section\n Keys[\"NumLock\"] = \"NumLock\";\n Keys[\"Numpad0\"] = \"Numpad0\";\n Keys[\"Numpad1\"] = \"Numpad1\";\n Keys[\"Numpad2\"] = \"Numpad2\";\n Keys[\"Numpad3\"] = \"Numpad3\";\n Keys[\"Numpad4\"] = \"Numpad4\";\n Keys[\"Numpad5\"] = \"Numpad5\";\n Keys[\"Numpad6\"] = \"Numpad6\";\n Keys[\"Numpad7\"] = \"Numpad7\";\n Keys[\"Numpad8\"] = \"Numpad8\";\n Keys[\"Numpad9\"] = \"Numpad9\";\n Keys[\"Num0\"] = \"Numpad0\";\n Keys[\"Num1\"] = \"Numpad1\";\n Keys[\"Num2\"] = \"Numpad2\";\n Keys[\"Num3\"] = \"Numpad3\";\n Keys[\"Num4\"] = \"Numpad4\";\n Keys[\"Num5\"] = \"Numpad5\";\n Keys[\"Num6\"] = \"Numpad6\";\n Keys[\"Num7\"] = \"Numpad7\";\n Keys[\"Num8\"] = \"Numpad8\";\n Keys[\"Num9\"] = \"Numpad9\";\n Keys[\"NumAdd\"] = \"NumpadAdd\";\n Keys[\"NumpadAdd\"] = \"NumpadAdd\";\n Keys[\"NumDecimal\"] = \"NumpadDecimal\";\n Keys[\"NumpadDecimal\"] = \"NumpadDecimal\";\n Keys[\"NumDivide\"] = \"NumpadDivide\";\n Keys[\"NumpadDivide\"] = \"NumpadDivide\";\n Keys[\"NumEnter\"] = \"NumpadEnter\";\n Keys[\"NumpadEnter\"] = \"NumpadEnter\";\n Keys[\"NumMultiply\"] = \"NumpadMultiply\";\n Keys[\"NumpadMultiply\"] = \"NumpadMultiply\";\n Keys[\"NumSubtract\"] = \"NumpadSubtract\";\n Keys[\"NumpadSubtract\"] = \"NumpadSubtract\";\n // NumComma = 'NumpadComma', // not x-browser\n // NumpadComma = 'NumpadComma', // not x-browser\n // Function section https://w3c.github.io/uievents-code/#key-function-section\n Keys[\"Esc\"] = \"Escape\";\n Keys[\"Escape\"] = \"Escape\";\n Keys[\"F1\"] = \"F1\";\n Keys[\"F2\"] = \"F2\";\n Keys[\"F3\"] = \"F3\";\n Keys[\"F4\"] = \"F4\";\n Keys[\"F5\"] = \"F5\";\n Keys[\"F6\"] = \"F6\";\n Keys[\"F7\"] = \"F7\";\n Keys[\"F8\"] = \"F8\";\n Keys[\"F9\"] = \"F9\";\n Keys[\"F10\"] = \"F10\";\n Keys[\"F11\"] = \"F11\";\n Keys[\"F12\"] = \"F12\";\n Keys[\"F13\"] = \"F13\";\n Keys[\"F14\"] = \"F14\";\n Keys[\"F15\"] = \"F15\";\n Keys[\"F16\"] = \"F16\";\n Keys[\"F17\"] = \"F17\";\n Keys[\"F18\"] = \"F18\";\n Keys[\"F19\"] = \"F19\";\n Keys[\"F20\"] = \"F20\";\n Keys[\"PrintScreen\"] = \"PrintScreen\";\n Keys[\"ScrollLock\"] = \"ScrollLock\";\n Keys[\"Pause\"] = \"Pause\";\n Keys[\"Unidentified\"] = \"Unidentified\";\n})(Keys || (Keys = {}));\n/**\n * Event thrown on a game object for a key event\n */\nclass KeyEvent extends _Events__WEBPACK_IMPORTED_MODULE_0__.GameEvent {\n /**\n * @param key The key responsible for throwing the event\n * @param value The key's typed value the browser detected\n * @param originalEvent The original keyboard event that Excalibur handled\n */\n constructor(key, value, originalEvent) {\n super();\n this.key = key;\n this.value = value;\n this.originalEvent = originalEvent;\n }\n}\nconst KeyEvents = {\n Press: 'press',\n Hold: 'hold',\n Release: 'release'\n};\n/**\n * Provides keyboard support for Excalibur.\n */\nclass Keyboard {\n constructor() {\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_1__.EventEmitter();\n this._enabled = true;\n /**\n * Keys that are currently held down\n */\n this._keys = [];\n /**\n * Keys up in the current frame\n */\n this._keysUp = [];\n /**\n * Keys down in the current frame\n */\n this._keysDown = [];\n this._releaseAllKeys = (ev) => {\n for (const code of this._keys) {\n const keyEvent = new KeyEvent(code, ev.key, ev);\n this.events.emit('up', keyEvent);\n this.events.emit('release', keyEvent);\n }\n this._keysUp = Array.from(new Set(this._keys.concat(this._keysUp)));\n this._keys.length = 0;\n };\n this._handleKeyDown = (ev) => {\n if (!this._enabled) {\n return;\n }\n // handle macos meta key issue\n // https://github.com/excaliburjs/Excalibur/issues/2608\n if (!ev.metaKey && (this._keys.includes(Keys.MetaLeft) || this._keys.includes(Keys.MetaRight))) {\n this._releaseAllKeys(ev);\n }\n const code = ev.code;\n if (this._keys.indexOf(code) === -1) {\n this._keys.push(code);\n this._keysDown.push(code);\n const keyEvent = new KeyEvent(code, ev.key, ev);\n this.events.emit('down', keyEvent);\n this.events.emit('press', keyEvent);\n }\n };\n this._handleKeyUp = (ev) => {\n if (!this._enabled) {\n return;\n }\n const code = ev.code;\n const key = this._keys.indexOf(code);\n this._keys.splice(key, 1);\n this._keysUp.push(code);\n const keyEvent = new KeyEvent(code, ev.key, ev);\n // alias the old api, we may want to deprecate this in the future\n this.events.emit('up', keyEvent);\n this.events.emit('release', keyEvent);\n // handle macos meta key issue\n // https://github.com/excaliburjs/Excalibur/issues/2608\n if (ev.key === 'Meta') {\n this._releaseAllKeys(ev);\n }\n };\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n /**\n * Initialize Keyboard event listeners\n */\n init(keyboardOptions) {\n let { global } = keyboardOptions;\n const { grabWindowFocus } = keyboardOptions;\n if (!global) {\n if ((0,_Util_IFrame__WEBPACK_IMPORTED_MODULE_2__.isCrossOriginIframe)()) {\n global = window;\n // Workaround for iframes like for itch.io or codesandbox\n // https://www.reddit.com/r/gamemaker/comments/kfs5cs/keyboard_inputs_no_longer_working_in_html5_game/\n // https://forum.gamemaker.io/index.php?threads/solved-keyboard-issue-on-itch-io.87336/\n if (grabWindowFocus) {\n window.focus();\n }\n _Util_Log__WEBPACK_IMPORTED_MODULE_3__.Logger.getInstance().warn('Excalibur might be in a cross-origin iframe, in order to receive keyboard events it must be in focus');\n }\n else {\n global = window.top;\n }\n }\n global.addEventListener('blur', () => {\n this._keys.length = 0; // empties array efficiently\n });\n // key up is on window because canvas cannot have focus\n global.addEventListener('keyup', this._handleKeyUp);\n // key down is on window because canvas cannot have focus\n global.addEventListener('keydown', this._handleKeyDown);\n }\n toggleEnabled(enabled) {\n this._enabled = enabled;\n }\n clear() {\n this._keysDown.length = 0;\n this._keysUp.length = 0;\n this._keys.length = 0;\n }\n update() {\n // Reset keysDown and keysUp after update is complete\n this._keysDown.length = 0;\n this._keysUp.length = 0;\n // Emit synthetic \"hold\" event\n for (let i = 0; i < this._keys.length; i++) {\n this.events.emit('hold', new KeyEvent(this._keys[i]));\n }\n }\n /**\n * Gets list of keys being pressed down\n */\n getKeys() {\n return this._keys;\n }\n /**\n * Tests if a certain key was just pressed this frame. This is cleared at the end of the update frame.\n * @param key Test whether a key was just pressed\n */\n wasPressed(key) {\n if (!this._enabled) {\n return false;\n }\n return this._keysDown.indexOf(key) > -1;\n }\n /**\n * Tests if a certain key is held down. This is persisted between frames.\n * @param key Test whether a key is held down\n */\n isHeld(key) {\n if (!this._enabled) {\n return false;\n }\n return this._keys.indexOf(key) > -1;\n }\n /**\n * Tests if a certain key was just released this frame. This is cleared at the end of the update frame.\n * @param key Test whether a key was just released\n */\n wasReleased(key) {\n if (!this._enabled) {\n return false;\n }\n return this._keysUp.indexOf(key) > -1;\n }\n /**\n * Trigger a manual key event\n * @param type\n * @param key\n * @param character\n */\n triggerEvent(type, key, character) {\n if (type === 'down') {\n this._handleKeyDown(new KeyboardEvent('keydown', {\n code: key,\n key: character !== null && character !== void 0 ? character : null\n }));\n }\n if (type === 'up') {\n this._handleKeyUp(new KeyboardEvent('keyup', {\n code: key,\n key: character !== null && character !== void 0 ? character : null\n }));\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Input/NativePointerButton.ts\":\n/*!**************************************!*\\\n !*** ./Input/NativePointerButton.ts ***!\n \\**************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ NativePointerButton: () => (/* binding */ NativePointerButton)\n/* harmony export */ });\n/**\n * Native browser button enumeration\n */\nvar NativePointerButton;\n(function (NativePointerButton) {\n NativePointerButton[NativePointerButton[\"NoButton\"] = -1] = \"NoButton\";\n NativePointerButton[NativePointerButton[\"Left\"] = 0] = \"Left\";\n NativePointerButton[NativePointerButton[\"Middle\"] = 1] = \"Middle\";\n NativePointerButton[NativePointerButton[\"Right\"] = 2] = \"Right\";\n NativePointerButton[NativePointerButton[\"Unknown\"] = 3] = \"Unknown\";\n})(NativePointerButton || (NativePointerButton = {}));\n\n\n/***/ }),\n\n/***/ \"./Input/PointerAbstraction.ts\":\n/*!*************************************!*\\\n !*** ./Input/PointerAbstraction.ts ***!\n \\*************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerAbstraction: () => (/* binding */ PointerAbstraction)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Math_global_coordinates__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Math/global-coordinates */ \"./Math/global-coordinates.ts\");\n\n\n\nclass PointerAbstraction {\n constructor() {\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n /**\n * The last position on the document this pointer was at. Can be `null` if pointer was never active.\n */\n this.lastPagePos = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n /**\n * The last position on the screen this pointer was at. Can be `null` if pointer was never active.\n */\n this.lastScreenPos = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n /**\n * The last position in the game world coordinates this pointer was at. Can be `null` if pointer was never active.\n */\n this.lastWorldPos = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n this._onPointerMove = (ev) => {\n this.lastPagePos = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(ev.pagePos.x, ev.pagePos.y);\n this.lastScreenPos = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(ev.screenPos.x, ev.screenPos.y);\n this.lastWorldPos = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(ev.worldPos.x, ev.worldPos.y);\n };\n this._onPointerDown = (ev) => {\n this.lastPagePos = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(ev.pagePos.x, ev.pagePos.y);\n this.lastScreenPos = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(ev.screenPos.x, ev.screenPos.y);\n this.lastWorldPos = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(ev.worldPos.x, ev.worldPos.y);\n };\n this.on('move', this._onPointerMove);\n this.on('down', this._onPointerDown);\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n /**\n * Called internally by excalibur to keep pointers up to date\n * @internal\n * @param engine\n */\n _updateWorldPosition(engine) {\n const coord = _Math_global_coordinates__WEBPACK_IMPORTED_MODULE_2__.GlobalCoordinates.fromPagePosition(this.lastPagePos, engine);\n this.lastScreenPos = coord.screenPos;\n this.lastWorldPos = coord.worldPos;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Input/PointerButton.ts\":\n/*!********************************!*\\\n !*** ./Input/PointerButton.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerButton: () => (/* binding */ PointerButton)\n/* harmony export */ });\n/**\n * The mouse button being pressed.\n */\nvar PointerButton;\n(function (PointerButton) {\n PointerButton[\"Left\"] = \"Left\";\n PointerButton[\"Middle\"] = \"Middle\";\n PointerButton[\"Right\"] = \"Right\";\n PointerButton[\"Unknown\"] = \"Unknown\";\n PointerButton[\"NoButton\"] = \"NoButton\";\n})(PointerButton || (PointerButton = {}));\n\n\n/***/ }),\n\n/***/ \"./Input/PointerComponent.ts\":\n/*!***********************************!*\\\n !*** ./Input/PointerComponent.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerComponent: () => (/* binding */ PointerComponent)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Component */ \"./EntityComponentSystem/Component.ts\");\n\n/**\n * Add this component to optionally configure how the pointer\n * system detects pointer events.\n *\n * By default the collider shape is used and graphics bounds is not.\n *\n * If both collider shape and graphics bounds are enabled it will fire events if either or\n * are intersecting the pointer.\n */\nclass PointerComponent extends _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor(options) {\n var _a, _b;\n super();\n /**\n * Use any existing Collider component geometry for pointer events. This is useful if you want\n * user pointer events only to trigger on the same collision geometry used in the collider component\n * for collision resolution. Default is `true`.\n */\n this.useColliderShape = true;\n /**\n * Use any existing Graphics component bounds for pointers. This is useful if you want the axis aligned\n * bounds around the graphic to trigger pointer events. Default is `true`.\n */\n this.useGraphicsBounds = true;\n this.useColliderShape = (_a = options === null || options === void 0 ? void 0 : options.useColliderShape) !== null && _a !== void 0 ? _a : this.useColliderShape;\n this.useGraphicsBounds = (_b = options === null || options === void 0 ? void 0 : options.useGraphicsBounds) !== null && _b !== void 0 ? _b : this.useGraphicsBounds;\n this.localBounds = options === null || options === void 0 ? void 0 : options.localBounds;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Input/PointerEvent.ts\":\n/*!*******************************!*\\\n !*** ./Input/PointerEvent.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerEvent: () => (/* binding */ PointerEvent)\n/* harmony export */ });\nclass PointerEvent {\n cancel() {\n this.active = false;\n }\n get pagePos() {\n return this.coordinates.pagePos;\n }\n get screenPos() {\n return this.coordinates.screenPos;\n }\n get worldPos() {\n return this.coordinates.worldPos;\n }\n constructor(type, pointerId, button, pointerType, coordinates, nativeEvent) {\n this.type = type;\n this.pointerId = pointerId;\n this.button = button;\n this.pointerType = pointerType;\n this.coordinates = coordinates;\n this.nativeEvent = nativeEvent;\n this.active = true;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Input/PointerEventReceiver.ts\":\n/*!***************************************!*\\\n !*** ./Input/PointerEventReceiver.ts ***!\n \\***************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerEventReceiver: () => (/* binding */ PointerEventReceiver),\n/* harmony export */ PointerEvents: () => (/* binding */ PointerEvents)\n/* harmony export */ });\n/* harmony import */ var _Engine__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Engine */ \"./Engine.ts\");\n/* harmony import */ var _Math_global_coordinates__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Math/global-coordinates */ \"./Math/global-coordinates.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _PointerEvent__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./PointerEvent */ \"./Input/PointerEvent.ts\");\n/* harmony import */ var _WheelEvent__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./WheelEvent */ \"./Input/WheelEvent.ts\");\n/* harmony import */ var _PointerAbstraction__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./PointerAbstraction */ \"./Input/PointerAbstraction.ts\");\n/* harmony import */ var _WheelDeltaMode__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./WheelDeltaMode */ \"./Input/WheelDeltaMode.ts\");\n/* harmony import */ var _PointerSystem__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./PointerSystem */ \"./Input/PointerSystem.ts\");\n/* harmony import */ var _NativePointerButton__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./NativePointerButton */ \"./Input/NativePointerButton.ts\");\n/* harmony import */ var _PointerButton__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./PointerButton */ \"./Input/PointerButton.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../Util/Util */ \"./Util/Util.ts\");\n/* harmony import */ var _PointerType__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./PointerType */ \"./Input/PointerType.ts\");\n/* harmony import */ var _Util_IFrame__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Util/IFrame */ \"./Util/IFrame.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst PointerEvents = {\n Move: 'move',\n Down: 'down',\n Up: 'up',\n Wheel: 'wheel'\n};\n/**\n * Is this event a native touch event?\n */\nfunction isTouchEvent(value) {\n // Guard for Safari <= 13.1\n return globalThis.TouchEvent && value instanceof globalThis.TouchEvent;\n}\n/**\n * Is this event a native pointer event\n */\nfunction isPointerEvent(value) {\n // Guard for Safari <= 13.1\n return globalThis.PointerEvent && value instanceof globalThis.PointerEvent;\n}\n/**\n * The PointerEventProcessor is responsible for collecting all the events from the canvas and transforming them into GlobalCoordinates\n */\nclass PointerEventReceiver {\n constructor(target, engine) {\n this.target = target;\n this.engine = engine;\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n this.primary = new _PointerAbstraction__WEBPACK_IMPORTED_MODULE_1__.PointerAbstraction();\n this._activeNativePointerIdsToNormalized = new Map();\n this.lastFramePointerCoords = new Map();\n this.currentFramePointerCoords = new Map();\n this.currentFramePointerDown = new Map();\n this.lastFramePointerDown = new Map();\n this.currentFrameDown = [];\n this.currentFrameUp = [];\n this.currentFrameMove = [];\n this.currentFrameCancel = [];\n this.currentFrameWheel = [];\n this._enabled = true;\n this._pointers = [this.primary];\n this._boundHandle = this._handle.bind(this);\n this._boundWheel = this._handleWheel.bind(this);\n }\n toggleEnabled(enabled) {\n this._enabled = enabled;\n }\n /**\n * Creates a new PointerEventReceiver with a new target and engine while preserving existing pointer event\n * handlers.\n * @param target\n * @param engine\n */\n recreate(target, engine) {\n const eventReceiver = new PointerEventReceiver(target, engine);\n eventReceiver.primary = this.primary;\n eventReceiver._pointers = this._pointers;\n return eventReceiver;\n }\n /**\n * Locates a specific pointer by id, creates it if it doesn't exist\n * @param index\n */\n at(index) {\n if (index >= this._pointers.length) {\n // Ensure there is a pointer to retrieve\n for (let i = this._pointers.length - 1, max = index; i < max; i++) {\n this._pointers.push(new _PointerAbstraction__WEBPACK_IMPORTED_MODULE_1__.PointerAbstraction());\n }\n }\n return this._pointers[index];\n }\n /**\n * The number of pointers currently being tracked by excalibur\n */\n count() {\n return this._pointers.length;\n }\n /**\n * Is the specified pointer id down this frame\n * @param pointerId\n */\n isDown(pointerId) {\n var _a;\n if (!this._enabled) {\n return false;\n }\n return (_a = this.currentFramePointerDown.get(pointerId)) !== null && _a !== void 0 ? _a : false;\n }\n /**\n * Was the specified pointer id down last frame\n * @param pointerId\n */\n wasDown(pointerId) {\n var _a;\n if (!this._enabled) {\n return false;\n }\n return (_a = this.lastFramePointerDown.get(pointerId)) !== null && _a !== void 0 ? _a : false;\n }\n /**\n * Whether the Pointer is currently dragging.\n */\n isDragging(pointerId) {\n if (!this._enabled) {\n return false;\n }\n return this.isDown(pointerId);\n }\n /**\n * Whether the Pointer just started dragging.\n */\n isDragStart(pointerId) {\n if (!this._enabled) {\n return false;\n }\n return this.isDown(pointerId) && !this.wasDown(pointerId);\n }\n /**\n * Whether the Pointer just ended dragging.\n */\n isDragEnd(pointerId) {\n if (!this._enabled) {\n return false;\n }\n return !this.isDown(pointerId) && this.wasDown(pointerId);\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n /**\n * Called internally by excalibur\n *\n * Updates the current frame pointer info and emits raw pointer events\n *\n * This does not emit events to entities, see PointerSystem\n * @internal\n */\n update() {\n this.lastFramePointerDown = new Map(this.currentFramePointerDown);\n this.lastFramePointerCoords = new Map(this.currentFramePointerCoords);\n for (const event of this.currentFrameDown) {\n if (!event.active) {\n continue;\n }\n this.emit('down', event);\n const pointer = this.at(event.pointerId);\n pointer.emit('down', event);\n this.primary.emit('pointerdown', event);\n }\n for (const event of this.currentFrameUp) {\n if (!event.active) {\n continue;\n }\n this.emit('up', event);\n const pointer = this.at(event.pointerId);\n pointer.emit('up', event);\n }\n for (const event of this.currentFrameMove) {\n if (!event.active) {\n continue;\n }\n this.emit('move', event);\n const pointer = this.at(event.pointerId);\n pointer.emit('move', event);\n }\n for (const event of this.currentFrameCancel) {\n if (!event.active) {\n continue;\n }\n this.emit('cancel', event);\n const pointer = this.at(event.pointerId);\n pointer.emit('cancel', event);\n }\n for (const event of this.currentFrameWheel) {\n if (!event.active) {\n continue;\n }\n this.emit('pointerwheel', event);\n this.emit('wheel', event);\n this.primary.emit('pointerwheel', event);\n this.primary.emit('wheel', event);\n }\n if (this.engine.currentScene.camera.hasChanged()) {\n for (const pointer of this._pointers) {\n pointer._updateWorldPosition(this.engine);\n }\n }\n }\n /**\n * Clears the current frame event and pointer data\n */\n clear() {\n for (const event of this.currentFrameUp) {\n this.currentFramePointerCoords.delete(event.pointerId);\n const ids = this._activeNativePointerIdsToNormalized.entries();\n for (const [native, normalized] of ids) {\n if (normalized === event.pointerId) {\n this._activeNativePointerIdsToNormalized.delete(native);\n }\n }\n }\n this.currentFrameDown.length = 0;\n this.currentFrameUp.length = 0;\n this.currentFrameMove.length = 0;\n this.currentFrameCancel.length = 0;\n this.currentFrameWheel.length = 0;\n }\n /**\n * Initializes the pointer event receiver so that it can start listening to native\n * browser events.\n */\n init(options) {\n var _a;\n if (this.engine.isDisposed()) {\n return;\n }\n // Disabling the touch action avoids browser/platform gestures from firing on the canvas\n // It is important on mobile to have touch action 'none'\n // https://stackoverflow.com/questions/48124372/pointermove-event-not-working-with-touch-why-not\n if (this.target === this.engine.canvas) {\n this.engine.canvas.style.touchAction = 'none';\n }\n else {\n document.body.style.touchAction = 'none';\n }\n // Preferred pointer events\n if (window.PointerEvent) {\n this.target.addEventListener('pointerdown', this._boundHandle);\n this.target.addEventListener('pointerup', this._boundHandle);\n this.target.addEventListener('pointermove', this._boundHandle);\n this.target.addEventListener('pointercancel', this._boundHandle);\n }\n else {\n // Touch Events\n this.target.addEventListener('touchstart', this._boundHandle);\n this.target.addEventListener('touchend', this._boundHandle);\n this.target.addEventListener('touchmove', this._boundHandle);\n this.target.addEventListener('touchcancel', this._boundHandle);\n // Mouse Events\n this.target.addEventListener('mousedown', this._boundHandle);\n this.target.addEventListener('mouseup', this._boundHandle);\n this.target.addEventListener('mousemove', this._boundHandle);\n }\n // MDN MouseWheelEvent\n const wheelOptions = {\n passive: !(this.engine.pageScrollPreventionMode === _Engine__WEBPACK_IMPORTED_MODULE_2__.ScrollPreventionMode.All ||\n this.engine.pageScrollPreventionMode === _Engine__WEBPACK_IMPORTED_MODULE_2__.ScrollPreventionMode.Canvas)\n };\n if ('onwheel' in document.createElement('div')) {\n // Modern Browsers\n this.target.addEventListener('wheel', this._boundWheel, wheelOptions);\n }\n else if (document.onmousewheel !== undefined) {\n // Webkit and IE\n this.target.addEventListener('mousewheel', this._boundWheel, wheelOptions);\n }\n else {\n // Remaining browser and older Firefox\n this.target.addEventListener('MozMousePixelScroll', this._boundWheel, wheelOptions);\n }\n const grabWindowFocus = (_a = options === null || options === void 0 ? void 0 : options.grabWindowFocus) !== null && _a !== void 0 ? _a : true;\n // Handle cross origin iframe\n if (grabWindowFocus && (0,_Util_IFrame__WEBPACK_IMPORTED_MODULE_3__.isCrossOriginIframe)()) {\n const grabFocus = () => {\n window.focus();\n };\n // Preferred pointer events\n if (window.PointerEvent) {\n this.target.addEventListener('pointerdown', grabFocus);\n }\n else {\n // Touch Events\n this.target.addEventListener('touchstart', grabFocus);\n // Mouse Events\n this.target.addEventListener('mousedown', grabFocus);\n }\n }\n }\n detach() {\n // Preferred pointer events\n if (window.PointerEvent) {\n this.target.removeEventListener('pointerdown', this._boundHandle);\n this.target.removeEventListener('pointerup', this._boundHandle);\n this.target.removeEventListener('pointermove', this._boundHandle);\n this.target.removeEventListener('pointercancel', this._boundHandle);\n }\n else {\n // Touch Events\n this.target.removeEventListener('touchstart', this._boundHandle);\n this.target.removeEventListener('touchend', this._boundHandle);\n this.target.removeEventListener('touchmove', this._boundHandle);\n this.target.removeEventListener('touchcancel', this._boundHandle);\n // Mouse Events\n this.target.removeEventListener('mousedown', this._boundHandle);\n this.target.removeEventListener('mouseup', this._boundHandle);\n this.target.removeEventListener('mousemove', this._boundHandle);\n }\n if ('onwheel' in document.createElement('div')) {\n // Modern Browsers\n this.target.removeEventListener('wheel', this._boundWheel);\n }\n else if (document.onmousewheel !== undefined) {\n // Webkit and IE\n this.target.addEventListener('mousewheel', this._boundWheel);\n }\n else {\n // Remaining browser and older Firefox\n this.target.addEventListener('MozMousePixelScroll', this._boundWheel);\n }\n }\n /**\n * Take native pointer id and map it to index in active pointers\n * @param nativePointerId\n */\n _normalizePointerId(nativePointerId) {\n // Add to the the native pointer set id\n this._activeNativePointerIdsToNormalized.set(nativePointerId, -1);\n // Native pointer ids in ascending order\n const currentPointerIds = Array.from(this._activeNativePointerIdsToNormalized.keys()).sort((a, b) => a - b);\n // The index into sorted ids will be the new id, will always have an id\n const id = currentPointerIds.findIndex((p) => p === nativePointerId);\n // Save the mapping so we can reverse it later\n this._activeNativePointerIdsToNormalized.set(nativePointerId, id);\n // ignore pointer because game isn't watching\n return id;\n }\n /**\n * Responsible for handling and parsing pointer events\n */\n _handle(ev) {\n if (!this._enabled) {\n return;\n }\n ev.preventDefault();\n const eventCoords = new Map();\n let button;\n let pointerType;\n if (isTouchEvent(ev)) {\n button = _PointerButton__WEBPACK_IMPORTED_MODULE_4__.PointerButton.Unknown;\n pointerType = _PointerType__WEBPACK_IMPORTED_MODULE_5__.PointerType.Touch;\n // https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent\n for (let i = 0; i < ev.changedTouches.length; i++) {\n const touch = ev.changedTouches[i];\n const coordinates = _Math_global_coordinates__WEBPACK_IMPORTED_MODULE_6__.GlobalCoordinates.fromPagePosition(touch.pageX, touch.pageY, this.engine);\n const nativePointerId = i + 1;\n const pointerId = this._normalizePointerId(nativePointerId);\n this.currentFramePointerCoords.set(pointerId, coordinates);\n eventCoords.set(pointerId, coordinates);\n }\n }\n else {\n button = this._nativeButtonToPointerButton(ev.button);\n pointerType = _PointerType__WEBPACK_IMPORTED_MODULE_5__.PointerType.Mouse;\n const coordinates = _Math_global_coordinates__WEBPACK_IMPORTED_MODULE_6__.GlobalCoordinates.fromPagePosition(ev.pageX, ev.pageY, this.engine);\n let nativePointerId = 1;\n if (isPointerEvent(ev)) {\n nativePointerId = ev.pointerId;\n pointerType = this._stringToPointerType(ev.pointerType);\n }\n const pointerId = this._normalizePointerId(nativePointerId);\n this.currentFramePointerCoords.set(pointerId, coordinates);\n eventCoords.set(pointerId, coordinates);\n }\n for (const [pointerId, coord] of eventCoords.entries()) {\n switch (ev.type) {\n case 'mousedown':\n case 'pointerdown':\n case 'touchstart':\n this.currentFrameDown.push(new _PointerEvent__WEBPACK_IMPORTED_MODULE_7__.PointerEvent('down', pointerId, button, pointerType, coord, ev));\n this.currentFramePointerDown.set(pointerId, true);\n break;\n case 'mouseup':\n case 'pointerup':\n case 'touchend':\n this.currentFrameUp.push(new _PointerEvent__WEBPACK_IMPORTED_MODULE_7__.PointerEvent('up', pointerId, button, pointerType, coord, ev));\n this.currentFramePointerDown.set(pointerId, false);\n break;\n case 'mousemove':\n case 'pointermove':\n case 'touchmove':\n this.currentFrameMove.push(new _PointerEvent__WEBPACK_IMPORTED_MODULE_7__.PointerEvent('move', pointerId, button, pointerType, coord, ev));\n break;\n case 'touchcancel':\n case 'pointercancel':\n this.currentFrameCancel.push(new _PointerEvent__WEBPACK_IMPORTED_MODULE_7__.PointerEvent('cancel', pointerId, button, pointerType, coord, ev));\n break;\n }\n }\n }\n _handleWheel(ev) {\n if (!this._enabled) {\n return;\n }\n // Should we prevent page scroll because of this event\n if (this.engine.pageScrollPreventionMode === _Engine__WEBPACK_IMPORTED_MODULE_2__.ScrollPreventionMode.All ||\n (this.engine.pageScrollPreventionMode === _Engine__WEBPACK_IMPORTED_MODULE_2__.ScrollPreventionMode.Canvas && ev.target === this.engine.canvas)) {\n ev.preventDefault();\n }\n const screen = this.engine.screen.pageToScreenCoordinates((0,_Math_vector__WEBPACK_IMPORTED_MODULE_8__.vec)(ev.pageX, ev.pageY));\n const world = this.engine.screen.screenToWorldCoordinates(screen);\n /**\n * A constant used to normalize wheel events across different browsers\n *\n * This normalization factor is pulled from\n * https://developer.mozilla.org/en-US/docs/Web/Events/wheel#Listening_to_this_event_across_browser\n */\n const ScrollWheelNormalizationFactor = -1 / 40;\n const deltaX = ev.deltaX || ev.wheelDeltaX * ScrollWheelNormalizationFactor || 0;\n const deltaY = ev.deltaY || ev.wheelDeltaY * ScrollWheelNormalizationFactor || ev.wheelDelta * ScrollWheelNormalizationFactor || ev.detail || 0;\n const deltaZ = ev.deltaZ || 0;\n let deltaMode = _WheelDeltaMode__WEBPACK_IMPORTED_MODULE_9__.WheelDeltaMode.Pixel;\n if (ev.deltaMode) {\n if (ev.deltaMode === 1) {\n deltaMode = _WheelDeltaMode__WEBPACK_IMPORTED_MODULE_9__.WheelDeltaMode.Line;\n }\n else if (ev.deltaMode === 2) {\n deltaMode = _WheelDeltaMode__WEBPACK_IMPORTED_MODULE_9__.WheelDeltaMode.Page;\n }\n }\n const we = new _WheelEvent__WEBPACK_IMPORTED_MODULE_10__.WheelEvent(world.x, world.y, ev.pageX, ev.pageY, screen.x, screen.y, 0, deltaX, deltaY, deltaZ, deltaMode, ev);\n this.currentFrameWheel.push(we);\n }\n /**\n * Triggers an excalibur pointer event in a world space pos\n *\n * Useful for testing pointers in excalibur\n * @param type\n * @param pos\n */\n triggerEvent(type, pos) {\n const page = this.engine.screen.worldToPageCoordinates(pos);\n // Send an event to the event receiver\n if (window.PointerEvent) {\n this._handle(new window.PointerEvent('pointer' + type, {\n pointerId: 0,\n clientX: page.x,\n clientY: page.y\n }));\n }\n else {\n // Safari hack\n this._handle(new window.MouseEvent('mouse' + type, {\n clientX: page.x,\n clientY: page.y\n }));\n }\n // Force update pointer system\n const pointerSystem = this.engine.currentScene.world.get(_PointerSystem__WEBPACK_IMPORTED_MODULE_11__.PointerSystem);\n pointerSystem.preupdate(this.engine.currentScene, 1);\n pointerSystem.update(1);\n }\n _nativeButtonToPointerButton(s) {\n switch (s) {\n case _NativePointerButton__WEBPACK_IMPORTED_MODULE_12__.NativePointerButton.NoButton:\n return _PointerButton__WEBPACK_IMPORTED_MODULE_4__.PointerButton.NoButton;\n case _NativePointerButton__WEBPACK_IMPORTED_MODULE_12__.NativePointerButton.Left:\n return _PointerButton__WEBPACK_IMPORTED_MODULE_4__.PointerButton.Left;\n case _NativePointerButton__WEBPACK_IMPORTED_MODULE_12__.NativePointerButton.Middle:\n return _PointerButton__WEBPACK_IMPORTED_MODULE_4__.PointerButton.Middle;\n case _NativePointerButton__WEBPACK_IMPORTED_MODULE_12__.NativePointerButton.Right:\n return _PointerButton__WEBPACK_IMPORTED_MODULE_4__.PointerButton.Right;\n case _NativePointerButton__WEBPACK_IMPORTED_MODULE_12__.NativePointerButton.Unknown:\n return _PointerButton__WEBPACK_IMPORTED_MODULE_4__.PointerButton.Unknown;\n default:\n return (0,_Util_Util__WEBPACK_IMPORTED_MODULE_13__.fail)(s);\n }\n }\n _stringToPointerType(s) {\n switch (s) {\n case 'touch':\n return _PointerType__WEBPACK_IMPORTED_MODULE_5__.PointerType.Touch;\n case 'mouse':\n return _PointerType__WEBPACK_IMPORTED_MODULE_5__.PointerType.Mouse;\n case 'pen':\n return _PointerType__WEBPACK_IMPORTED_MODULE_5__.PointerType.Pen;\n default:\n return _PointerType__WEBPACK_IMPORTED_MODULE_5__.PointerType.Unknown;\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Input/PointerEventsToObjectDispatcher.ts\":\n/*!**************************************************!*\\\n !*** ./Input/PointerEventsToObjectDispatcher.ts ***!\n \\**************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerEventsToObjectDispatcher: () => (/* binding */ PointerEventsToObjectDispatcher),\n/* harmony export */ PointerTargetObjectProxy: () => (/* binding */ PointerTargetObjectProxy)\n/* harmony export */ });\n/* harmony import */ var _Util_RentalPool__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Util/RentalPool */ \"./Util/RentalPool.ts\");\n\n/**\n *\n */\nfunction hasNestedEvents(object) {\n return object && object._dispatchPointerEvents && object._processPointerToObject;\n}\nclass PointerTargetObjectProxy {\n get events() {\n return this.object.events;\n }\n init(object, contains, active) {\n this.object = object;\n this.contains = contains;\n this.active = active;\n }\n}\nclass PointerEventsToObjectDispatcher {\n constructor() {\n this._proxyPool = new _Util_RentalPool__WEBPACK_IMPORTED_MODULE_0__.RentalPool(() => new PointerTargetObjectProxy(), (p) => p, 100);\n this._objectToProxy = new Map();\n this._proxies = [];\n this._lastFrameObjectToPointers = new Map();\n this._currentFrameObjectToPointers = new Map();\n }\n /**\n * Tracks an object to associate with pointers and their events\n * @param object\n * @param contains\n * @param active\n */\n addObject(object, contains, active) {\n const proxy = this._proxyPool.rent(false);\n proxy.init(object, contains, active);\n this._proxies.push(proxy);\n this._objectToProxy.set(object, proxy);\n }\n _getProxy(object) {\n const proxy = this._objectToProxy.get(object);\n if (proxy) {\n return proxy;\n }\n throw new Error('No PointerTargetProxy for object');\n }\n /**\n * Untracks an object associated with pointers and their events\n * @param object\n */\n removeObject(object) {\n const proxy = this._objectToProxy.get(object);\n if (proxy) {\n const index = this._proxies.indexOf(proxy);\n if (index > -1) {\n this._proxies.splice(index, 1);\n }\n this._proxyPool.return(proxy);\n }\n }\n _objectCurrentlyUnderPointer(object, pointerId) {\n return !!(this._currentFrameObjectToPointers.has(object) && this._currentFrameObjectToPointers.get(object).includes(pointerId));\n }\n _objectWasUnderPointer(object, pointerId) {\n return !!(this._lastFrameObjectToPointers.has(object) && this._lastFrameObjectToPointers.get(object).includes(pointerId));\n }\n _entered(object, pointerId) {\n return this._objectCurrentlyUnderPointer(object, pointerId) && !this._lastFrameObjectToPointers.has(object);\n }\n _left(object, pointerId) {\n return !this._currentFrameObjectToPointers.has(object) && this._objectWasUnderPointer(object, pointerId);\n }\n /**\n * Manually associate a pointer id with an object.\n *\n * This assumes you've checked that the pointer is indeed over the object.\n */\n addPointerToObject(object, pointerId) {\n const maybeProxy = this._objectToProxy.get(object);\n if (maybeProxy) {\n this._addPointerToProxy(maybeProxy, pointerId);\n }\n }\n _addPointerToProxy(object, pointerId) {\n if (!this._currentFrameObjectToPointers.has(object)) {\n this._currentFrameObjectToPointers.set(object, [pointerId]);\n return;\n }\n const pointers = this._currentFrameObjectToPointers.get(object);\n this._currentFrameObjectToPointers.set(object, pointers.concat(pointerId));\n }\n /**\n * Dispatches the appropriate pointer events in sortedObject order on tracked objects\n * @param receiver\n * @param sortedObjects\n */\n dispatchEvents(receiver, sortedObjects) {\n const lastFrameEntities = new Set(this._lastFrameObjectToPointers.keys());\n const currentFrameEntities = new Set(this._currentFrameObjectToPointers.keys());\n // Filter preserves z order\n let lastMovePerPointer;\n let lastUpPerPointer;\n let lastDownPerPointer;\n // Dispatch events in proxy z order\n for (let i = 0; i < sortedObjects.length; i++) {\n const object = sortedObjects[i];\n const proxy = this._getProxy(object);\n if (hasNestedEvents(object)) {\n object._dispatchPointerEvents(receiver);\n }\n if (lastFrameEntities.has(proxy) || currentFrameEntities.has(proxy)) {\n lastDownPerPointer = this._processDownAndEmit(receiver, proxy);\n lastUpPerPointer = this._processUpAndEmit(receiver, proxy);\n lastMovePerPointer = this._processMoveAndEmit(receiver, proxy);\n const lastUpDownMoveEvents = [...lastMovePerPointer.values(), ...lastDownPerPointer.values(), ...lastUpPerPointer.values()];\n this._processEnterLeaveAndEmit(receiver, proxy, lastUpDownMoveEvents);\n this._processCancelAndEmit(receiver, proxy);\n this._processWheelAndEmit(receiver, proxy);\n }\n }\n }\n /**\n * Given the tracked objects, update pointer containment given the provided contains()\n * @param receiver\n * @param objects\n */\n processPointerToObject(receiver, objects) {\n // Pre-process find entities under pointers\n for (let objectIndex = 0; objectIndex < objects.length; objectIndex++) {\n const object = objects[objectIndex];\n const proxy = this._getProxy(object);\n if (hasNestedEvents(object)) {\n object._processPointerToObject(receiver);\n }\n for (const [pointerId, pos] of receiver.currentFramePointerCoords.entries()) {\n if (proxy.contains(pos)) {\n this._addPointerToProxy(proxy, pointerId);\n }\n }\n }\n }\n /**\n * Clear current frames pointer-object associations and track last frame pointer-object associations\n */\n clear() {\n this._lastFrameObjectToPointers.clear();\n this._lastFrameObjectToPointers = new Map(this._currentFrameObjectToPointers);\n this._currentFrameObjectToPointers.clear();\n }\n _processDownAndEmit(receiver, object) {\n const lastDownPerPointer = new Map();\n // Loop through down and dispatch to entities\n for (const event of receiver.currentFrameDown) {\n if (event.active && this._objectCurrentlyUnderPointer(object, event.pointerId)) {\n object.events.emit('pointerdown', event);\n if (receiver.isDragStart(event.pointerId)) {\n object.events.emit('pointerdragstart', event);\n }\n }\n lastDownPerPointer.set(event.pointerId, event);\n }\n return lastDownPerPointer;\n }\n _processUpAndEmit(receiver, object) {\n const lastUpPerPointer = new Map();\n // Loop through up and dispatch to entities\n for (const event of receiver.currentFrameUp) {\n if (event.active && this._objectCurrentlyUnderPointer(object, event.pointerId)) {\n object.events.emit('pointerup', event);\n if (receiver.isDragEnd(event.pointerId)) {\n object.events.emit('pointerdragend', event);\n }\n }\n lastUpPerPointer.set(event.pointerId, event);\n }\n return lastUpPerPointer;\n }\n _processMoveAndEmit(receiver, object) {\n const lastMovePerPointer = new Map();\n // Loop through move and dispatch to entities\n for (const event of receiver.currentFrameMove) {\n if (event.active && object.active() && this._objectCurrentlyUnderPointer(object, event.pointerId)) {\n // move\n object.events.emit('pointermove', event);\n if (receiver.isDragging(event.pointerId)) {\n object.events.emit('pointerdragmove', event);\n }\n }\n lastMovePerPointer.set(event.pointerId, event);\n }\n return lastMovePerPointer;\n }\n _processEnterLeaveAndEmit(receiver, object, lastUpDownMoveEvents) {\n // up, down, and move are considered for enter and leave\n for (const event of lastUpDownMoveEvents) {\n // enter\n if (event.active && object.active() && this._entered(object, event.pointerId)) {\n object.events.emit('pointerenter', event);\n if (receiver.isDragging(event.pointerId)) {\n object.events.emit('pointerdragenter', event);\n }\n break;\n }\n if (event.active &&\n object.active() &&\n // leave can happen on move\n (this._left(object, event.pointerId) ||\n // or leave can happen on pointer up\n (this._objectCurrentlyUnderPointer(object, event.pointerId) && event.type === 'up'))) {\n object.events.emit('pointerleave', event);\n if (receiver.isDragging(event.pointerId)) {\n object.events.emit('pointerdragleave', event);\n }\n break;\n }\n }\n }\n _processCancelAndEmit(receiver, object) {\n // cancel\n for (const event of receiver.currentFrameCancel) {\n if (event.active && object.active() && this._objectCurrentlyUnderPointer(object, event.pointerId)) {\n object.events.emit('pointercancel', event);\n }\n }\n }\n _processWheelAndEmit(receiver, object) {\n // wheel\n for (const event of receiver.currentFrameWheel) {\n // Currently the wheel only fires under the primary pointer '0'\n if (event.active && object.active() && this._objectCurrentlyUnderPointer(object, 0)) {\n object.events.emit('pointerwheel', event);\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Input/PointerScope.ts\":\n/*!*******************************!*\\\n !*** ./Input/PointerScope.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerScope: () => (/* binding */ PointerScope)\n/* harmony export */ });\n/**\n * Determines the scope of handling mouse/touch events.\n */\nvar PointerScope;\n(function (PointerScope) {\n /**\n * Handle events on the `canvas` element only. Events originating outside the\n * `canvas` will not be handled.\n */\n PointerScope[\"Canvas\"] = \"Canvas\";\n /**\n * Handles events on the entire document. All events will be handled by Excalibur.\n */\n PointerScope[\"Document\"] = \"Document\";\n})(PointerScope || (PointerScope = {}));\n\n\n/***/ }),\n\n/***/ \"./Input/PointerSystem.ts\":\n/*!********************************!*\\\n !*** ./Input/PointerSystem.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerSystem: () => (/* binding */ PointerSystem)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Priority.ts\");\n/* harmony import */ var _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Graphics/GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _PointerComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./PointerComponent */ \"./Input/PointerComponent.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Math/coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _Collision_Detection_SparseHashGrid__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Collision/Detection/SparseHashGrid */ \"./Collision/Detection/SparseHashGrid.ts\");\n/* harmony import */ var _PointerEventsToObjectDispatcher__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./PointerEventsToObjectDispatcher */ \"./Input/PointerEventsToObjectDispatcher.ts\");\n\n\n\n\n\n\n/**\n * The PointerSystem is responsible for dispatching pointer events to entities\n * that need them.\n *\n * The PointerSystem can be optionally configured by the {@apilink PointerComponent}, by default Entities use\n * the {@apilink Collider}'s shape for pointer events.\n */\nclass PointerSystem extends _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_0__.System {\n constructor(world) {\n super();\n this.world = world;\n this.systemType = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_0__.SystemType.Update;\n this._graphicsHashGrid = new _Collision_Detection_SparseHashGrid__WEBPACK_IMPORTED_MODULE_1__.SparseHashGrid({ size: 100 });\n this._graphics = [];\n this._entityToPointer = new Map();\n this._pointerEventDispatcher = new _PointerEventsToObjectDispatcher__WEBPACK_IMPORTED_MODULE_2__.PointerEventsToObjectDispatcher();\n /**\n * Optionally override component configuration for all entities\n */\n this.overrideUseColliderShape = false;\n /**\n * Optionally override component configuration for all entities\n */\n this.overrideUseGraphicsBounds = false;\n this._sortedTransforms = [];\n this._sortedEntities = [];\n this._zHasChanged = false;\n this._zIndexUpdate = () => {\n this._zHasChanged = true;\n };\n this.query = this.world.query([_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_3__.TransformComponent, _PointerComponent__WEBPACK_IMPORTED_MODULE_4__.PointerComponent]);\n this.query.entityAdded$.subscribe((e) => {\n const tx = e.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_3__.TransformComponent);\n const pointer = e.get(_PointerComponent__WEBPACK_IMPORTED_MODULE_4__.PointerComponent);\n this._pointerEventDispatcher.addObject(e, (pos) => {\n // If pointer bounds defined\n if (pointer && pointer.localBounds) {\n const pointerBounds = pointer.localBounds.transform(tx.get().matrix);\n return pointerBounds.contains(tx.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_5__.CoordPlane.World ? pos.worldPos : pos.screenPos);\n }\n return false;\n }, () => e.isActive);\n this._entityToPointer.set(e, pointer);\n const maybeGfx = e.get(_Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_6__.GraphicsComponent);\n if (maybeGfx) {\n this._graphics.push(maybeGfx);\n this._graphicsHashGrid.track(maybeGfx);\n }\n this._sortedTransforms.push(tx);\n this._sortedEntities.push(tx.owner);\n tx.zIndexChanged$.subscribe(this._zIndexUpdate);\n this._zHasChanged = true;\n });\n this.query.entityRemoved$.subscribe((e) => {\n this._pointerEventDispatcher.removeObject(e);\n const tx = e.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_3__.TransformComponent);\n this._entityToPointer.delete(e);\n const maybeGfx = e.get(_Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_6__.GraphicsComponent);\n if (maybeGfx) {\n const index = this._graphics.indexOf(maybeGfx);\n if (index > -1) {\n this._graphics.splice(index, 1);\n }\n this._graphicsHashGrid.untrack(maybeGfx);\n }\n tx.zIndexChanged$.unsubscribe(this._zIndexUpdate);\n const index = this._sortedTransforms.indexOf(tx);\n if (index > -1) {\n this._sortedTransforms.splice(index, 1);\n this._sortedEntities.splice(index, 1);\n }\n });\n }\n initialize(world, scene) {\n this._engine = scene.engine;\n this._scene = scene;\n }\n preupdate() {\n if (this._scene.camera.hasChanged()) {\n // if the camera has changed we want to force a transform update so pointers can be correctly calc'd\n this._scene.camera.updateTransform(this._scene.camera.pos);\n }\n // event receiver might change per frame\n this._receivers = [this._engine.input.pointers, this._scene.input.pointers];\n this._engineReceiver = this._engine.input.pointers;\n if (this._zHasChanged) {\n this._sortedTransforms.sort((a, b) => {\n return b.z - a.z;\n });\n this._sortedEntities = this._sortedTransforms.map((t) => t.owner);\n this._zHasChanged = false;\n }\n }\n update() {\n // Update graphics\n this._graphicsHashGrid.update(this._graphics);\n // Locate all the pointer/entity mappings\n for (const [pointerId, pos] of this._engineReceiver.currentFramePointerCoords.entries()) {\n const colliders = this._scene.physics.query(pos.worldPos);\n for (let i = 0; i < colliders.length; i++) {\n const collider = colliders[i];\n const maybePointer = this._entityToPointer.get(collider.owner);\n if (maybePointer && (maybePointer.useColliderShape || this.overrideUseColliderShape)) {\n this._pointerEventDispatcher.addPointerToObject(collider.owner, pointerId);\n }\n }\n const graphics = this._graphicsHashGrid.query(pos.worldPos);\n for (let i = 0; i < graphics.length; i++) {\n const graphic = graphics[i];\n const maybePointer = this._entityToPointer.get(graphic.owner);\n if (maybePointer && (maybePointer.useGraphicsBounds || this.overrideUseGraphicsBounds)) {\n this._pointerEventDispatcher.addPointerToObject(graphic.owner, pointerId);\n }\n }\n }\n this._pointerEventDispatcher.processPointerToObject(this._engineReceiver, this._sortedEntities);\n // Dispatch pointer events on entities\n this._pointerEventDispatcher.dispatchEvents(this._engineReceiver, this._sortedEntities);\n // Dispatch pointer events on top level pointers\n this._receivers.forEach((r) => r.update());\n // Clear last frame's events\n this._pointerEventDispatcher.clear();\n this._receivers.forEach((r) => r.clear());\n }\n}\nPointerSystem.priority = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_7__.SystemPriority.Higher;\n\n\n/***/ }),\n\n/***/ \"./Input/PointerType.ts\":\n/*!******************************!*\\\n !*** ./Input/PointerType.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerType: () => (/* binding */ PointerType)\n/* harmony export */ });\n/**\n * The type of pointer for a {@apilink PointerEvent}.\n */\nvar PointerType;\n(function (PointerType) {\n PointerType[\"Touch\"] = \"Touch\";\n PointerType[\"Mouse\"] = \"Mouse\";\n PointerType[\"Pen\"] = \"Pen\";\n PointerType[\"Unknown\"] = \"Unknown\";\n})(PointerType || (PointerType = {}));\n\n\n/***/ }),\n\n/***/ \"./Input/WheelDeltaMode.ts\":\n/*!*********************************!*\\\n !*** ./Input/WheelDeltaMode.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ WheelDeltaMode: () => (/* binding */ WheelDeltaMode)\n/* harmony export */ });\nvar WheelDeltaMode;\n(function (WheelDeltaMode) {\n WheelDeltaMode[\"Pixel\"] = \"Pixel\";\n WheelDeltaMode[\"Line\"] = \"Line\";\n WheelDeltaMode[\"Page\"] = \"Page\";\n})(WheelDeltaMode || (WheelDeltaMode = {}));\n\n\n/***/ }),\n\n/***/ \"./Input/WheelEvent.ts\":\n/*!*****************************!*\\\n !*** ./Input/WheelEvent.ts ***!\n \\*****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ WheelEvent: () => (/* binding */ WheelEvent)\n/* harmony export */ });\nclass WheelEvent {\n cancel() {\n this.active = false;\n }\n constructor(x, y, pageX, pageY, screenX, screenY, index, deltaX, deltaY, deltaZ, deltaMode, ev) {\n this.x = x;\n this.y = y;\n this.pageX = pageX;\n this.pageY = pageY;\n this.screenX = screenX;\n this.screenY = screenY;\n this.index = index;\n this.deltaX = deltaX;\n this.deltaY = deltaY;\n this.deltaZ = deltaZ;\n this.deltaMode = deltaMode;\n this.ev = ev;\n this.active = true;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Interfaces/AudioImplementation.ts\":\n/*!*******************************************!*\\\n !*** ./Interfaces/AudioImplementation.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ExResponse: () => (/* binding */ ExResponse)\n/* harmony export */ });\nclass ExResponse {\n}\nExResponse.type = {\n any: '',\n blob: 'blob',\n json: 'json',\n text: 'text',\n document: 'document',\n arraybuffer: 'arraybuffer'\n};\n\n\n/***/ }),\n\n/***/ \"./Interfaces/Index.ts\":\n/*!*****************************!*\\\n !*** ./Interfaces/Index.ts ***!\n \\*****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ExResponse: () => (/* reexport safe */ _AudioImplementation__WEBPACK_IMPORTED_MODULE_0__.ExResponse),\n/* harmony export */ hasOnAdd: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.hasOnAdd),\n/* harmony export */ hasOnInitialize: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.hasOnInitialize),\n/* harmony export */ hasOnPostUpdate: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.hasOnPostUpdate),\n/* harmony export */ hasOnPreUpdate: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.hasOnPreUpdate),\n/* harmony export */ hasOnRemove: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.hasOnRemove),\n/* harmony export */ hasPostDraw: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.hasPostDraw),\n/* harmony export */ hasPreDraw: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.hasPreDraw),\n/* harmony export */ has_add: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.has_add),\n/* harmony export */ has_initialize: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.has_initialize),\n/* harmony export */ has_postupdate: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.has_postupdate),\n/* harmony export */ has_preupdate: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.has_preupdate),\n/* harmony export */ has_remove: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.has_remove)\n/* harmony export */ });\n/* harmony import */ var _AudioImplementation__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AudioImplementation */ \"./Interfaces/AudioImplementation.ts\");\n/* harmony import */ var _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./LifecycleEvents */ \"./Interfaces/LifecycleEvents.ts\");\n\n\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Interfaces/LifecycleEvents.ts\":\n/*!***************************************!*\\\n !*** ./Interfaces/LifecycleEvents.ts ***!\n \\***************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ hasOnAdd: () => (/* binding */ hasOnAdd),\n/* harmony export */ hasOnInitialize: () => (/* binding */ hasOnInitialize),\n/* harmony export */ hasOnPostUpdate: () => (/* binding */ hasOnPostUpdate),\n/* harmony export */ hasOnPreUpdate: () => (/* binding */ hasOnPreUpdate),\n/* harmony export */ hasOnRemove: () => (/* binding */ hasOnRemove),\n/* harmony export */ hasPostDraw: () => (/* binding */ hasPostDraw),\n/* harmony export */ hasPreDraw: () => (/* binding */ hasPreDraw),\n/* harmony export */ has_add: () => (/* binding */ has_add),\n/* harmony export */ has_initialize: () => (/* binding */ has_initialize),\n/* harmony export */ has_postupdate: () => (/* binding */ has_postupdate),\n/* harmony export */ has_preupdate: () => (/* binding */ has_preupdate),\n/* harmony export */ has_remove: () => (/* binding */ has_remove)\n/* harmony export */ });\n/**\n * Type guard checking for internal initialize method\n * @internal\n * @param a\n */\nfunction has_initialize(a) {\n return !!a._initialize;\n}\n/**\n *\n */\nfunction has_add(a) {\n return !!a.onAdd;\n}\n/**\n *\n */\nfunction has_remove(a) {\n return !!a.onRemove;\n}\n/**\n *\n */\nfunction hasOnInitialize(a) {\n return !!a.onInitialize;\n}\n/**\n *\n */\nfunction has_preupdate(a) {\n return !!a._preupdate;\n}\n/**\n *\n */\nfunction hasOnPreUpdate(a) {\n return !!a.onPreUpdate;\n}\n/**\n *\n */\nfunction has_postupdate(a) {\n return !!a.onPostUpdate;\n}\n/**\n *\n */\nfunction hasOnPostUpdate(a) {\n return !!a.onPostUpdate;\n}\n/**\n *\n */\nfunction hasOnAdd(a) {\n return !!a.onAdd;\n}\n/**\n *\n */\nfunction hasOnRemove(a) {\n return !!a.onRemove;\n}\n/**\n *\n */\nfunction hasPreDraw(a) {\n return !!a.onPreDraw;\n}\n/**\n *\n */\nfunction hasPostDraw(a) {\n return !!a.onPostDraw;\n}\n\n\n/***/ }),\n\n/***/ \"./Label.ts\":\n/*!******************!*\\\n !*** ./Label.ts ***!\n \\******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Label: () => (/* binding */ Label)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Graphics_Text__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Graphics/Text */ \"./Graphics/Text.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Graphics */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Graphics_Font__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Graphics/Font */ \"./Graphics/Font.ts\");\n/* harmony import */ var _Actor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Actor */ \"./Actor.ts\");\n\n\n\n\n\n/**\n * Labels are the way to draw small amounts of text to the screen. They are\n * actors and inherit all of the benefits and capabilities.\n */\nclass Label extends _Actor__WEBPACK_IMPORTED_MODULE_0__.Actor {\n set maxWidth(width) {\n this._text.maxWidth = width;\n }\n get maxWidth() {\n return this._text.maxWidth;\n }\n get font() {\n return this._font;\n }\n set font(newFont) {\n this._font = newFont;\n this._text.font = newFont;\n }\n /**\n * The text to draw.\n */\n get text() {\n return this._text.text;\n }\n set text(text) {\n this._text.text = text;\n }\n get color() {\n return this._text.color;\n }\n set color(color) {\n if (this._text) {\n this._text.color = color;\n }\n }\n get opacity() {\n return this.graphics.opacity;\n }\n set opacity(opacity) {\n this.graphics.opacity = opacity;\n }\n /**\n * The {@apilink SpriteFont} to use, if any. Overrides {@apilink Font | `font`} if present.\n */\n get spriteFont() {\n return this._spriteFont;\n }\n set spriteFont(sf) {\n if (sf) {\n this._spriteFont = sf;\n this._text.font = this._spriteFont;\n }\n }\n /**\n * Build a new label\n * @param options\n */\n constructor(options) {\n super(options);\n this._font = new _Graphics_Font__WEBPACK_IMPORTED_MODULE_1__.Font();\n this._text = new _Graphics_Text__WEBPACK_IMPORTED_MODULE_2__.Text({ text: '', font: this._font });\n const { text, pos, x, y, spriteFont, font, color, maxWidth } = { text: '', ...options };\n this.pos = pos !== null && pos !== void 0 ? pos : (x && y ? (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(x, y) : this.pos);\n this.text = text !== null && text !== void 0 ? text : this.text;\n this.font = font !== null && font !== void 0 ? font : this.font;\n this.maxWidth = maxWidth !== null && maxWidth !== void 0 ? maxWidth : this.maxWidth;\n this.spriteFont = spriteFont !== null && spriteFont !== void 0 ? spriteFont : this.spriteFont;\n this._text.color = color !== null && color !== void 0 ? color : this.color;\n const gfx = this.get(_Graphics__WEBPACK_IMPORTED_MODULE_4__.GraphicsComponent);\n gfx.anchor = _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero;\n gfx.use(this._text);\n }\n _initialize(engine) {\n super._initialize(engine);\n }\n /**\n * Returns the width of the text in the label (in pixels);\n */\n getTextWidth() {\n return this._text.width;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/Random.ts\":\n/*!************************!*\\\n !*** ./Math/Random.ts ***!\n \\************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Random: () => (/* binding */ Random)\n/* harmony export */ });\n/**\n * @module\n * Pseudo-Random Utility\n *\n * A pseudo-random utility to add seeded random support for help in\n * generating things like terrain or reproducible randomness. Uses the\n * [Mersenne Twister](https://en.wikipedia.org/wiki/Mersenne_Twister) algorithm.\n */\n/**\n * 32-bit mask\n */\nconst BITMASK32 = 0xffffffff;\n/**\n * Pseudo-random number generator following the Mersenne_Twister algorithm. Given a seed this generator will produce the same sequence\n * of numbers each time it is called.\n * See https://en.wikipedia.org/wiki/Mersenne_Twister for more details.\n * Uses the MT19937-32 (2002) implementation documented here http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/emt19937ar.html\n *\n * Api inspired by http://chancejs.com/# https://github.com/chancejs/chancejs\n */\nclass Random {\n /**\n * If no seed is specified, the Date.now() is used\n */\n constructor(seed) {\n this.seed = seed;\n // Separation point of one one word, the number of bits in the lower bitmask 0 <= r <= w-1\n this._lowerMask = 0x7fffffff; // 31 bits same as _r\n this._upperMask = 0x80000000; // 34 high bits\n // Word size, 64 bits\n this._w = 32;\n // Degree of recurrence\n this._n = 624;\n // Middle word, an offset used in the recurrence defining the series x, 1<=m>> 0;\n for (let i = 1; i < this._n; i++) {\n const s = this._mt[i - 1] ^ (this._mt[i - 1] >>> (this._w - 2));\n // numbers are bigger than the JS max safe int, add in 16-bit chunks to prevent IEEE rounding errors on high bits\n this._mt[i] = (((this._f * ((s & 0xffff0000) >>> 16)) << 16) + this._f * (s & 0xffff) + i) >>> 0;\n }\n this._index = this._n;\n }\n /**\n * Apply the twist\n */\n _twist() {\n const mag01 = [0x0, this._a];\n let y = 0, i = 0;\n for (; i < this._n - this._m; i++) {\n y = (this._mt[i] & this._upperMask) | (this._mt[i + 1] & this._lowerMask);\n this._mt[i] = this._mt[i + this._m] ^ (y >>> 1) ^ (mag01[y & 0x1] & BITMASK32);\n }\n for (; i < this._n - 1; i++) {\n y = (this._mt[i] & this._upperMask) | (this._mt[i + 1] & this._lowerMask);\n this._mt[i] = this._mt[i + (this._m - this._n)] ^ (y >>> 1) ^ (mag01[y & 0x1] & BITMASK32);\n }\n y = (this._mt[this._n - 1] & this._upperMask) | (this._mt[0] & this._lowerMask);\n this._mt[this._n - 1] = this._mt[this._m - 1] ^ (y >>> 1) ^ (mag01[y & 0x1] & BITMASK32);\n this._index = 0;\n }\n /**\n * Return next 32 bit integer number in sequence\n */\n nextInt() {\n if (this._index >= this._n) {\n this._twist();\n }\n let y = this._mt[this._index++];\n y ^= y >>> this._u;\n y ^= (y << this._s) & this._b;\n y ^= (y << this._t) & this._c;\n y ^= y >>> this._l;\n return y >>> 0;\n }\n /**\n * Return a random floating point number between [0, 1)\n */\n next() {\n return this.nextInt() * (1.0 / 4294967296.0); // divided by 2^32\n }\n /**\n * Return a random floating point in range [min, max) min is included, max is not included\n */\n floating(min, max) {\n return (max - min) * this.next() + min;\n }\n /**\n * Return a random integer in range [min, max] min is included, max is included.\n * Implemented with rejection sampling, see https://medium.com/@betable/tifu-by-using-math-random-f1c308c4fd9d#.i13tdiu5a\n */\n integer(min, max) {\n return Math.floor((max - min + 1) * this.next() + min);\n }\n /**\n * Returns true or false randomly with 50/50 odds by default.\n * By default the likelihood of returning a true is .5 (50%).\n * @param likelihood takes values between [0, 1]\n */\n bool(likelihood = 0.5) {\n return this.next() <= likelihood;\n }\n /**\n * Returns one element from an array at random\n */\n pickOne(array) {\n return array[this.integer(0, array.length - 1)];\n }\n /**\n * Returns a new array random picking elements from the original\n * @param array Original array to pick from\n * @param numPicks can be any positive number\n * @param allowDuplicates indicates whether the returned set is allowed duplicates (it does not mean there will always be duplicates\n * just that it is possible)\n */\n pickSet(array, numPicks, allowDuplicates = false) {\n if (allowDuplicates) {\n return this._pickSetWithDuplicates(array, numPicks);\n }\n else {\n return this._pickSetWithoutDuplicates(array, numPicks);\n }\n }\n /**\n * Returns a new array randomly picking elements in the original (not reused)\n * @param array Array to pick elements out of\n * @param numPicks must be less than or equal to the number of elements in the array.\n */\n _pickSetWithoutDuplicates(array, numPicks) {\n if (numPicks > array.length || numPicks < 0) {\n throw new Error('Invalid number of elements to pick, must pick a value 0 < n <= length');\n }\n if (numPicks === array.length) {\n return array;\n }\n const result = new Array(numPicks);\n let currentPick = 0;\n const tempArray = array.slice(0);\n while (currentPick < numPicks) {\n const index = this.integer(0, tempArray.length - 1);\n result[currentPick++] = tempArray[index];\n tempArray.splice(index, 1);\n }\n return result;\n }\n /**\n * Returns a new array random picking elements from the original allowing duplicates\n * @param array Array to pick elements out of\n * @param numPicks can be any positive number\n */\n _pickSetWithDuplicates(array, numPicks) {\n // Typescript numbers are all floating point, so do we add check for int? (or floor the input?)\n if (numPicks < 0) {\n throw new Error('Invalid number of elements to pick, must pick a value 0 <= n < MAX_INT');\n }\n const result = new Array(numPicks);\n for (let i = 0; i < numPicks; i++) {\n result[i] = this.pickOne(array);\n }\n return result;\n }\n /**\n * Returns a new array that has its elements shuffled. Using the Fisher/Yates method\n * https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle\n */\n shuffle(array) {\n const tempArray = array.slice(0);\n let swap;\n for (let i = 0; i < tempArray.length - 2; i++) {\n const randomIndex = this.integer(i, tempArray.length - 1);\n swap = tempArray[i];\n tempArray[i] = tempArray[randomIndex];\n tempArray[randomIndex] = swap;\n }\n return tempArray;\n }\n /**\n * Generate a list of random integer numbers\n * @param length the length of the final array\n * @param min the minimum integer number to generate inclusive\n * @param max the maximum integer number to generate inclusive\n */\n range(length, min, max) {\n const result = new Array(length);\n for (let i = 0; i < length; i++) {\n result[i] = this.integer(min, max);\n }\n return result;\n }\n /**\n * Returns the result of a d4 dice roll\n */\n d4() {\n return this.integer(1, 4);\n }\n /**\n * Returns the result of a d6 dice roll\n */\n d6() {\n return this.integer(1, 6);\n }\n /**\n * Returns the result of a d8 dice roll\n */\n d8() {\n return this.integer(1, 8);\n }\n /**\n * Returns the result of a d10 dice roll\n */\n d10() {\n return this.integer(1, 10);\n }\n /**\n * Returns the result of a d12 dice roll\n */\n d12() {\n return this.integer(1, 12);\n }\n /**\n * Returns the result of a d20 dice roll\n */\n d20() {\n return this.integer(1, 20);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/affine-matrix.ts\":\n/*!*******************************!*\\\n !*** ./Math/affine-matrix.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AffineMatrix: () => (/* binding */ AffineMatrix)\n/* harmony export */ });\n/* harmony import */ var _matrix__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./matrix */ \"./Math/matrix.ts\");\n/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./util */ \"./Math/util.ts\");\n/* harmony import */ var _vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vector */ \"./Math/vector.ts\");\n\n\n\nclass AffineMatrix {\n constructor() {\n /**\n * | | | |\n * | ------- | ------- | -------- |\n * | data[0] | data[2] | data[4] |\n * | data[1] | data[3] | data[5] |\n * | 0 | 0 | 1 |\n */\n this.data = new Float64Array(6);\n this._scale = new Float64Array([1, 1]);\n this._scaleSignX = 1;\n this._scaleSignY = 1;\n }\n /**\n * Converts the current matrix into a DOMMatrix\n *\n * This is useful when working with the browser Canvas context\n * @returns {DOMMatrix} DOMMatrix\n */\n toDOMMatrix() {\n return new DOMMatrix([...this.data]);\n }\n static identity() {\n const mat = new AffineMatrix();\n mat.data[0] = 1;\n mat.data[1] = 0;\n mat.data[2] = 0;\n mat.data[3] = 1;\n mat.data[4] = 0;\n mat.data[5] = 0;\n return mat;\n }\n /**\n * Creates a brand new translation matrix at the specified 3d point\n * @param x\n * @param y\n */\n static translation(x, y) {\n const mat = AffineMatrix.identity();\n mat.data[4] = x;\n mat.data[5] = y;\n return mat;\n }\n /**\n * Creates a brand new scaling matrix with the specified scaling factor\n * @param sx\n * @param sy\n */\n static scale(sx, sy) {\n const mat = AffineMatrix.identity();\n mat.data[0] = sx;\n mat.data[3] = sy;\n mat._scale[0] = sx;\n mat._scale[1] = sy;\n return mat;\n }\n /**\n * Creates a brand new rotation matrix with the specified angle in radians\n * @param angle\n */\n static rotation(angle) {\n const mat = AffineMatrix.identity();\n mat.data[0] = Math.cos(angle);\n mat.data[1] = Math.sin(angle);\n mat.data[2] = -Math.sin(angle);\n mat.data[3] = Math.cos(angle);\n return mat;\n }\n setPosition(x, y) {\n this.data[4] = x;\n this.data[5] = y;\n }\n getPosition() {\n return (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.data[4], this.data[5]);\n }\n /**\n * Applies rotation to the current matrix mutating it\n * @param angle in Radians\n */\n rotate(angle) {\n const a11 = this.data[0];\n const a21 = this.data[1];\n const a12 = this.data[2];\n const a22 = this.data[3];\n const sine = Math.sin(angle);\n const cosine = Math.cos(angle);\n this.data[0] = cosine * a11 + sine * a12;\n this.data[1] = cosine * a21 + sine * a22;\n this.data[2] = cosine * a12 - sine * a11;\n this.data[3] = cosine * a22 - sine * a21;\n return this;\n }\n /**\n * Applies translation to the current matrix mutating it\n * @param x\n * @param y\n */\n translate(x, y) {\n const a11 = this.data[0];\n const a21 = this.data[1];\n // const a31 = 0;\n const a12 = this.data[2];\n const a22 = this.data[3];\n // const a32 = 0;\n const a13 = this.data[4];\n const a23 = this.data[5];\n // const a33 = 1;\n // Doesn't change z\n this.data[4] = a11 * x + a12 * y + a13;\n this.data[5] = a21 * x + a22 * y + a23;\n return this;\n }\n /**\n * Applies scaling to the current matrix mutating it\n * @param x\n * @param y\n */\n scale(x, y) {\n const a11 = this.data[0];\n const a21 = this.data[1];\n const a12 = this.data[2];\n const a22 = this.data[3];\n this.data[0] = a11 * x;\n this.data[1] = a21 * x;\n this.data[2] = a12 * y;\n this.data[3] = a22 * y;\n this._scale[0] = x;\n this._scale[1] = y;\n this._scaleSignX = (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(x);\n this._scaleSignY = (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(y);\n return this;\n }\n determinant() {\n return this.data[0] * this.data[3] - this.data[1] * this.data[2];\n }\n /**\n * Return the affine inverse, optionally store it in a target matrix.\n *\n * It's recommended you call .reset() the target unless you know what you're doing\n * @param target\n */\n inverse(target) {\n // See http://negativeprobability.blogspot.com/2011/11/affine-transformations-and-their.html\n // See https://www.mathsisfun.com/algebra/matrix-inverse.html\n // Since we are actually only doing 2D transformations we can use this hack\n // We don't actually use the 3rd or 4th dimension\n const det = this.determinant();\n let inverseDet = det; // default to a zero matrix if we have a singular matrix\n if (det !== 0) {\n inverseDet = 1 / det;\n }\n const a = this.data[0];\n const b = this.data[2];\n const c = this.data[1];\n const d = this.data[3];\n const m = target || AffineMatrix.identity();\n // inverts rotation and scale\n m.data[0] = d * inverseDet;\n m.data[1] = -c * inverseDet;\n m.data[2] = -b * inverseDet;\n m.data[3] = a * inverseDet;\n const tx = this.data[4];\n const ty = this.data[5];\n // invert translation\n // transform translation into the matrix basis created by rot/scale\n m.data[4] = -(tx * m.data[0] + ty * m.data[2]);\n m.data[5] = -(tx * m.data[1] + ty * m.data[3]);\n return m;\n }\n multiply(vectorOrMatrix, dest) {\n if (vectorOrMatrix instanceof _vector__WEBPACK_IMPORTED_MODULE_0__.Vector) {\n const result = dest || new _vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\n const vector = vectorOrMatrix;\n // these shenanigans are to allow dest and vector to be the same instance\n const resultX = vector.x * this.data[0] + vector.y * this.data[2] + this.data[4];\n const resultY = vector.x * this.data[1] + vector.y * this.data[3] + this.data[5];\n result.x = resultX;\n result.y = resultY;\n return result;\n }\n else {\n const result = dest || new AffineMatrix();\n const other = vectorOrMatrix;\n const a11 = this.data[0];\n const a21 = this.data[1];\n // const a31 = 0;\n const a12 = this.data[2];\n const a22 = this.data[3];\n // const a32 = 0;\n const a13 = this.data[4];\n const a23 = this.data[5];\n // const a33 = 1;\n const b11 = other.data[0];\n const b21 = other.data[1];\n // const b31 = 0;\n const b12 = other.data[2];\n const b22 = other.data[3];\n // const b32 = 0;\n const b13 = other.data[4];\n const b23 = other.data[5];\n // const b33 = 1;\n result.data[0] = a11 * b11 + a12 * b21; // + a13 * b31; // zero\n result.data[1] = a21 * b11 + a22 * b21; // + a23 * b31; // zero\n result.data[2] = a11 * b12 + a12 * b22; // + a13 * b32; // zero\n result.data[3] = a21 * b12 + a22 * b22; // + a23 * b32; // zero\n result.data[4] = a11 * b13 + a12 * b23 + a13; // * b33; // one\n result.data[5] = a21 * b13 + a22 * b23 + a23; // * b33; // one\n const signX = this._scaleSignX;\n const signY = this._scaleSignY;\n result._scaleSignX = signX * (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(result._scaleSignX);\n result._scaleSignY = signY * (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(result._scaleSignY);\n return result;\n }\n }\n /**\n * Packed array of length 8, that contains 4 vertices, with 2 components each\n * So: [x0, y0, x1, y1, x2, y2, x3, y3]\n * @param quad\n */\n multiplyQuadInPlace(quad) {\n const resultTopLeftX = quad[0] * this.data[0] + quad[1] * this.data[2] + this.data[4];\n const resultTopLeftY = quad[0] * this.data[1] + quad[1] * this.data[3] + this.data[5];\n quad[0] = resultTopLeftX;\n quad[1] = resultTopLeftY;\n const resultTopRightX = quad[2] * this.data[0] + quad[3] * this.data[2] + this.data[4];\n const resultTopRightY = quad[2] * this.data[1] + quad[3] * this.data[3] + this.data[5];\n quad[2] = resultTopRightX;\n quad[3] = resultTopRightY;\n const resultBottomLeftX = quad[4] * this.data[0] + quad[5] * this.data[2] + this.data[4];\n const resultBottomLeftY = quad[4] * this.data[1] + quad[5] * this.data[3] + this.data[5];\n quad[4] = resultBottomLeftX;\n quad[5] = resultBottomLeftY;\n const resultBottomRightX = quad[6] * this.data[0] + quad[7] * this.data[2] + this.data[4];\n const resultBottomRightY = quad[6] * this.data[1] + quad[7] * this.data[3] + this.data[5];\n quad[6] = resultBottomRightX;\n quad[7] = resultBottomRightY;\n }\n to4x4() {\n const mat = new _matrix__WEBPACK_IMPORTED_MODULE_2__.Matrix();\n mat.data[0] = this.data[0];\n mat.data[1] = this.data[1];\n mat.data[2] = 0;\n mat.data[3] = 0;\n mat.data[4] = this.data[2];\n mat.data[5] = this.data[3];\n mat.data[6] = 0;\n mat.data[7] = 0;\n mat.data[8] = 0;\n mat.data[9] = 0;\n mat.data[10] = 1;\n mat.data[11] = 0;\n mat.data[12] = this.data[4];\n mat.data[13] = this.data[5];\n mat.data[14] = 0;\n mat.data[15] = 1;\n return mat;\n }\n setRotation(angle) {\n const currentScale = this.getScale();\n const sine = Math.sin(angle);\n const cosine = Math.cos(angle);\n this.data[0] = cosine * currentScale.x;\n this.data[1] = sine * currentScale.y;\n this.data[2] = -sine * currentScale.x;\n this.data[3] = cosine * currentScale.y;\n }\n getRotation() {\n const angle = Math.atan2(this.data[1] / this.getScaleY(), this.data[0] / this.getScaleX());\n return (0,_util__WEBPACK_IMPORTED_MODULE_1__.canonicalizeAngle)(angle);\n }\n getScaleX() {\n // absolute scale of the matrix (we lose sign so need to add it back)\n const xScaleSq = this.data[0] * this.data[0] + this.data[2] * this.data[2];\n if (xScaleSq === 1.0) {\n // usually there isn't scale so we can avoid a sqrt\n return this._scaleSignX;\n }\n return this._scaleSignX * Math.sqrt(xScaleSq);\n }\n getScaleY() {\n // absolute scale of the matrix (we lose sign so need to add it back)\n const yScaleSq = this.data[1] * this.data[1] + this.data[3] * this.data[3];\n if (yScaleSq === 1.0) {\n // usually there isn't scale so we can avoid a sqrt\n return this._scaleSignY;\n }\n return this._scaleSignY * Math.sqrt(yScaleSq);\n }\n /**\n * Get the scale of the matrix\n */\n getScale() {\n return (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.getScaleX(), this.getScaleY());\n }\n setScaleX(val) {\n if (val === this._scale[0]) {\n return;\n }\n this._scaleSignX = (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(val);\n // negative scale acts like a 180 rotation, so flip\n const xscale = (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.data[0] * this._scaleSignX, this.data[2] * this._scaleSignX).normalize();\n this.data[0] = xscale.x * val;\n this.data[2] = xscale.y * val;\n this._scale[0] = val;\n }\n setScaleY(val) {\n if (val === this._scale[1]) {\n return;\n }\n this._scaleSignY = (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(val);\n // negative scale acts like a 180 rotation, so flip\n const yscale = (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.data[1] * this._scaleSignY, this.data[3] * this._scaleSignY).normalize();\n this.data[1] = yscale.x * val;\n this.data[3] = yscale.y * val;\n this._scale[1] = val;\n }\n setScale(scale) {\n this.setScaleX(scale.x);\n this.setScaleY(scale.y);\n }\n isIdentity() {\n return this.data[0] === 1 && this.data[1] === 0 && this.data[2] === 0 && this.data[3] === 1 && this.data[4] === 0 && this.data[5] === 0;\n }\n /**\n * Resets the current matrix to the identity matrix, mutating it\n * @returns {AffineMatrix} Current matrix as identity\n */\n reset() {\n const mat = this;\n mat.data[0] = 1;\n mat.data[1] = 0;\n mat.data[2] = 0;\n mat.data[3] = 1;\n mat.data[4] = 0;\n mat.data[5] = 0;\n return mat;\n }\n /**\n * Creates a new Matrix with the same data as the current {@apilink AffineMatrix}\n */\n clone(dest) {\n const mat = dest || new AffineMatrix();\n mat.data[0] = this.data[0];\n mat.data[1] = this.data[1];\n mat.data[2] = this.data[2];\n mat.data[3] = this.data[3];\n mat.data[4] = this.data[4];\n mat.data[5] = this.data[5];\n mat._scaleSignX = this._scaleSignX;\n mat._scaleSignY = this._scaleSignY;\n return mat;\n }\n toString() {\n return `\r\n[${this.data[0]} ${this.data[2]} ${this.data[4]}]\r\n[${this.data[1]} ${this.data[3]} ${this.data[5]}]\r\n[0 0 1]\r\n`;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/bezier-curve.ts\":\n/*!******************************!*\\\n !*** ./Math/bezier-curve.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BezierCurve: () => (/* binding */ BezierCurve)\n/* harmony export */ });\n/* harmony import */ var _lerp__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./lerp */ \"./Math/lerp.ts\");\n\n/**\n * BezierCurve that supports cubic Bezier curves.\n */\nclass BezierCurve {\n constructor(options) {\n var _a;\n // Thanks Freya! https://www.youtube.com/watch?v=aVwxzDHniEw\n this._distLookup = [];\n this.quality = 4;\n if (options.controlPoints.length !== 4) {\n throw new Error('Only cubic bezier curves are supported');\n }\n this._controlPoints = [...options.controlPoints];\n this.quality = (_a = options.quality) !== null && _a !== void 0 ? _a : this.quality;\n this._calculateLookup();\n }\n get arcLength() {\n return this._arcLength;\n }\n get controlPoints() {\n return this._controlPoints;\n }\n set controlPoints(points) {\n this._controlPoints = [...points];\n this._calculateLookup();\n }\n setControlPoint(index, point) {\n this._controlPoints[index] = point;\n this._calculateLookup();\n }\n _calculateLookup() {\n let totalLength = 0;\n this._distLookup.length = 0;\n let prev = this.controlPoints[0];\n const n = this.controlPoints.length * this.quality;\n for (let i = 0; i < n; i++) {\n const t = i / (n - 1);\n const pt = this.getPoint(t);\n const diff = prev.distance(pt);\n totalLength += diff;\n this._distLookup.push(totalLength);\n prev = pt;\n }\n this._arcLength = totalLength;\n }\n _getTimeGivenDistance(distance) {\n const n = this._distLookup.length;\n const arcLength = this.arcLength;\n if (distance >= 0 && distance < arcLength) {\n for (let i = 0; i < n - 1; i++) {\n if (this._distLookup[i] <= distance && distance < this._distLookup[i + 1]) {\n return (0,_lerp__WEBPACK_IMPORTED_MODULE_0__.remap)(this._distLookup[i], this._distLookup[i + 1], i / (n - 1), (i + 1) / (n - 1), distance);\n }\n }\n }\n return distance / arcLength;\n }\n /**\n * Get the point on the Bezier curve at a certain time\n * @param time Between 0-1\n */\n getPoint(time) {\n const points = [...this.controlPoints];\n for (let r = 1; r < points.length; r++) {\n for (let i = 0; i < points.length - r; i++) {\n points[i] = (0,_lerp__WEBPACK_IMPORTED_MODULE_0__.lerpVector)(points[i], points[i + 1], time);\n }\n }\n return points[0];\n }\n /**\n * Get the tangent of the Bezier curve at a certain time\n * @param time Between 0-1\n */\n getTangent(time) {\n const timeSquared = time * time;\n const p0 = this.controlPoints[0];\n const p1 = this.controlPoints[1];\n const p2 = this.controlPoints[2];\n const p3 = this.controlPoints[3];\n // Derivative of Bernstein polynomial\n const pPrime = p0\n .scale(-3 * timeSquared + 6 * time - 3)\n .add(p1.scale(9 * timeSquared - 12 * time + 3).add(p2.scale(-9 * timeSquared + 6 * time).add(p3.scale(3 * timeSquared))));\n return pPrime.normalize();\n }\n /**\n * Get the tangent of the Bezier curve where the distance is uniformly distributed over time\n * @param time\n */\n getUniformTangent(time) {\n const desiredDistance = time * this.arcLength;\n const uniformTime = this._getTimeGivenDistance(desiredDistance);\n return this.getTangent(uniformTime);\n }\n /**\n * Get the normal of the Bezier curve at a certain time\n * @param time Between 0-1\n */\n getNormal(time) {\n return this.getTangent(time).normal();\n }\n /**\n * Get the normal of the Bezier curve where the distance is uniformly distributed over time\n * @param time\n */\n getUniformNormal(time) {\n return this.getUniformTangent(time).normal();\n }\n /**\n * Points are spaced uniformly across the length of the curve over time\n * @param time\n */\n getUniformPoint(time) {\n const desiredDistance = time * this.arcLength;\n const uniformTime = this._getTimeGivenDistance(desiredDistance);\n return this.getPoint(uniformTime);\n }\n clone() {\n return new BezierCurve({\n controlPoints: [...this.controlPoints],\n quality: this.quality\n });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/coord-plane.ts\":\n/*!*****************************!*\\\n !*** ./Math/coord-plane.ts ***!\n \\*****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CoordPlane: () => (/* binding */ CoordPlane)\n/* harmony export */ });\n/**\n * Enum representing the coordinate plane for the position 2D vector in the {@apilink TransformComponent}\n */\nvar CoordPlane;\n(function (CoordPlane) {\n /**\n * The world coordinate plane (default) represents world space, any entities drawn with world\n * space move when the camera moves.\n */\n CoordPlane[\"World\"] = \"world\";\n /**\n * The screen coordinate plane represents screen space, entities drawn in screen space are pinned\n * to screen coordinates ignoring the camera.\n */\n CoordPlane[\"Screen\"] = \"screen\";\n})(CoordPlane || (CoordPlane = {}));\n\n\n/***/ }),\n\n/***/ \"./Math/global-coordinates.ts\":\n/*!************************************!*\\\n !*** ./Math/global-coordinates.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ GlobalCoordinates: () => (/* binding */ GlobalCoordinates)\n/* harmony export */ });\n/* harmony import */ var _vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vector */ \"./Math/vector.ts\");\n\nclass GlobalCoordinates {\n static fromPagePosition(xOrPos, yOrEngine, engineOrUndefined) {\n let pageX;\n let pageY;\n let pagePos;\n let engine;\n if (arguments.length === 3) {\n pageX = xOrPos;\n pageY = yOrEngine;\n pagePos = new _vector__WEBPACK_IMPORTED_MODULE_0__.Vector(pageX, pageY);\n engine = engineOrUndefined;\n }\n else {\n pagePos = xOrPos;\n pageX = pagePos.x;\n pageY = pagePos.y;\n engine = yOrEngine;\n }\n const screenPos = engine.screen.pageToScreenCoordinates(pagePos);\n const worldPos = engine.screen.screenToWorldCoordinates(screenPos);\n return new GlobalCoordinates(worldPos, pagePos, screenPos);\n }\n constructor(worldPos, pagePos, screenPos) {\n this.worldPos = worldPos;\n this.pagePos = pagePos;\n this.screenPos = screenPos;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/index.ts\":\n/*!***********************!*\\\n !*** ./Math/index.ts ***!\n \\***********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AffineMatrix: () => (/* reexport safe */ _affine_matrix__WEBPACK_IMPORTED_MODULE_3__.AffineMatrix),\n/* harmony export */ BezierCurve: () => (/* reexport safe */ _bezier_curve__WEBPACK_IMPORTED_MODULE_12__.BezierCurve),\n/* harmony export */ CoordPlane: () => (/* reexport safe */ _coord_plane__WEBPACK_IMPORTED_MODULE_5__.CoordPlane),\n/* harmony export */ GlobalCoordinates: () => (/* reexport safe */ _global_coordinates__WEBPACK_IMPORTED_MODULE_7__.GlobalCoordinates),\n/* harmony export */ LineSegment: () => (/* reexport safe */ _line_segment__WEBPACK_IMPORTED_MODULE_8__.LineSegment),\n/* harmony export */ Matrix: () => (/* reexport safe */ _matrix__WEBPACK_IMPORTED_MODULE_2__.Matrix),\n/* harmony export */ MatrixLocations: () => (/* reexport safe */ _matrix__WEBPACK_IMPORTED_MODULE_2__.MatrixLocations),\n/* harmony export */ Projection: () => (/* reexport safe */ _projection__WEBPACK_IMPORTED_MODULE_9__.Projection),\n/* harmony export */ Random: () => (/* reexport safe */ _Random__WEBPACK_IMPORTED_MODULE_6__.Random),\n/* harmony export */ Ray: () => (/* reexport safe */ _ray__WEBPACK_IMPORTED_MODULE_10__.Ray),\n/* harmony export */ RotationType: () => (/* reexport safe */ _rotation_type__WEBPACK_IMPORTED_MODULE_14__.RotationType),\n/* harmony export */ Transform: () => (/* reexport safe */ _transform__WEBPACK_IMPORTED_MODULE_4__.Transform),\n/* harmony export */ TwoPI: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.TwoPI),\n/* harmony export */ Vector: () => (/* reexport safe */ _vector__WEBPACK_IMPORTED_MODULE_0__.Vector),\n/* harmony export */ VectorView: () => (/* reexport safe */ _vector_view__WEBPACK_IMPORTED_MODULE_1__.VectorView),\n/* harmony export */ approximatelyEqual: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.approximatelyEqual),\n/* harmony export */ canonicalizeAngle: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.canonicalizeAngle),\n/* harmony export */ clamp: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.clamp),\n/* harmony export */ frac: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.frac),\n/* harmony export */ inverseLerp: () => (/* reexport safe */ _lerp__WEBPACK_IMPORTED_MODULE_11__.inverseLerp),\n/* harmony export */ inverseLerpVector: () => (/* reexport safe */ _lerp__WEBPACK_IMPORTED_MODULE_11__.inverseLerpVector),\n/* harmony export */ lerp: () => (/* reexport safe */ _lerp__WEBPACK_IMPORTED_MODULE_11__.lerp),\n/* harmony export */ lerpAngle: () => (/* reexport safe */ _lerp__WEBPACK_IMPORTED_MODULE_11__.lerpAngle),\n/* harmony export */ lerpVector: () => (/* reexport safe */ _lerp__WEBPACK_IMPORTED_MODULE_11__.lerpVector),\n/* harmony export */ randomInRange: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.randomInRange),\n/* harmony export */ randomIntInRange: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.randomIntInRange),\n/* harmony export */ range: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.range),\n/* harmony export */ remap: () => (/* reexport safe */ _lerp__WEBPACK_IMPORTED_MODULE_11__.remap),\n/* harmony export */ remapVector: () => (/* reexport safe */ _lerp__WEBPACK_IMPORTED_MODULE_11__.remapVector),\n/* harmony export */ sign: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.sign),\n/* harmony export */ toDegrees: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.toDegrees),\n/* harmony export */ toRadians: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.toRadians),\n/* harmony export */ vec: () => (/* reexport safe */ _vector__WEBPACK_IMPORTED_MODULE_0__.vec)\n/* harmony export */ });\n/* harmony import */ var _vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vector */ \"./Math/vector.ts\");\n/* harmony import */ var _vector_view__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./vector-view */ \"./Math/vector-view.ts\");\n/* harmony import */ var _matrix__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./matrix */ \"./Math/matrix.ts\");\n/* harmony import */ var _affine_matrix__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./affine-matrix */ \"./Math/affine-matrix.ts\");\n/* harmony import */ var _transform__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./transform */ \"./Math/transform.ts\");\n/* harmony import */ var _coord_plane__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _Random__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Random */ \"./Math/Random.ts\");\n/* harmony import */ var _global_coordinates__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./global-coordinates */ \"./Math/global-coordinates.ts\");\n/* harmony import */ var _line_segment__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./line-segment */ \"./Math/line-segment.ts\");\n/* harmony import */ var _projection__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./projection */ \"./Math/projection.ts\");\n/* harmony import */ var _ray__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./ray */ \"./Math/ray.ts\");\n/* harmony import */ var _lerp__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./lerp */ \"./Math/lerp.ts\");\n/* harmony import */ var _bezier_curve__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./bezier-curve */ \"./Math/bezier-curve.ts\");\n/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./util */ \"./Math/util.ts\");\n/* harmony import */ var _rotation_type__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./rotation-type */ \"./Math/rotation-type.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Math/lerp.ts\":\n/*!**********************!*\\\n !*** ./Math/lerp.ts ***!\n \\**********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ inverseLerp: () => (/* binding */ inverseLerp),\n/* harmony export */ inverseLerpVector: () => (/* binding */ inverseLerpVector),\n/* harmony export */ lerp: () => (/* binding */ lerp),\n/* harmony export */ lerpAngle: () => (/* binding */ lerpAngle),\n/* harmony export */ lerpVector: () => (/* binding */ lerpVector),\n/* harmony export */ remap: () => (/* binding */ remap),\n/* harmony export */ remapVector: () => (/* binding */ remapVector)\n/* harmony export */ });\n/* harmony import */ var _rotation_type__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./rotation-type */ \"./Math/rotation-type.ts\");\n/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./util */ \"./Math/util.ts\");\n\n\n/**\n * Linear interpolation between `a` and `b`, at `time = 0` the value will be `a` at `time = 1` the value will be `b`\n * @param a\n * @param b\n * @param time\n */\nfunction lerp(a, b, time) {\n return (1 - time) * a + b * time;\n}\n/**\n * Linear interpolation between angles in radians\n * @param startAngle\n * @param endAngle\n * @param rotationType\n * @param time\n */\nfunction lerpAngle(startAngle, endAngle, rotationType, time) {\n const shortestPathIsPositive = (startAngle - endAngle + _util__WEBPACK_IMPORTED_MODULE_0__.TwoPI) % _util__WEBPACK_IMPORTED_MODULE_0__.TwoPI >= Math.PI;\n const distance1 = Math.abs(endAngle - startAngle);\n const distance2 = _util__WEBPACK_IMPORTED_MODULE_0__.TwoPI - distance1;\n let shortDistance = 0;\n let longDistance = 0;\n if (distance1 > distance2) {\n shortDistance = distance2;\n longDistance = distance1;\n }\n else {\n shortDistance = distance1;\n longDistance = distance2;\n }\n let distance = 0;\n let direction = 1;\n switch (rotationType) {\n case _rotation_type__WEBPACK_IMPORTED_MODULE_1__.RotationType.ShortestPath:\n distance = shortDistance;\n direction = shortestPathIsPositive ? 1 : -1;\n break;\n case _rotation_type__WEBPACK_IMPORTED_MODULE_1__.RotationType.LongestPath:\n distance = longDistance;\n direction = shortestPathIsPositive ? -1 : 1;\n break;\n case _rotation_type__WEBPACK_IMPORTED_MODULE_1__.RotationType.Clockwise:\n direction = 1;\n distance = shortestPathIsPositive ? shortDistance : longDistance;\n break;\n case _rotation_type__WEBPACK_IMPORTED_MODULE_1__.RotationType.CounterClockwise:\n direction = -1;\n distance = shortestPathIsPositive ? longDistance : shortDistance;\n break;\n }\n return startAngle + direction * (distance * time);\n}\n/**\n * Linear interpolation between `a` and `b`, at `time = 0` the value will be `a` at `time = 1` the value will be `b`\n * @param a\n * @param b\n * @param time\n */\nfunction lerpVector(a, b, time) {\n return a.scale(1 - time).add(b.scale(time));\n}\n/**\n * Inverse of a linear interpolation, given a `value` in between `a` and `b` return how close to `a` or `b` the `value` is.\n *\n * Example: `a=1`, `b=5`, `value=4` will return `.75`\n * @param a\n * @param b\n * @param value\n */\nfunction inverseLerp(a, b, value) {\n return (value - a) / (b - a);\n}\n/**\n * Inverse of a linear interpolation, given a `value` in between `a` and `b` return how close to `a` or `b` the `value` is.\n *\n * **Warning** assumes that the `value` vector is co-linear with vector `a` and `b`\n *\n * Example: `a=1`, `b=5`, `value=4` will return `.75`\n * @param a\n * @param b\n * @param value\n */\nfunction inverseLerpVector(a, b, value) {\n const numerator = value.sub(a);\n const denominator = b.sub(a);\n const x = numerator.x / denominator.x;\n const y = numerator.y / denominator.y;\n return Math.min(x, y);\n}\n/**\n * Remaps a value from a source domain to a destination\n * @param minSource\n * @param maxSource\n * @param minDestination\n * @param maxDestination\n * @param value\n */\nfunction remap(minSource, maxSource, minDestination, maxDestination, value) {\n const time = inverseLerp(minSource, maxSource, value);\n return lerp(minDestination, maxDestination, time);\n}\n/**\n * Remaps a value from a source domain to a destination\n *\n * **Warning** assumes that the `value` vector is co-linear with vector `minSource` and `maxSource`\n * @param minSource\n * @param maxSource\n * @param minDestination\n * @param maxDestination\n * @param value\n */\nfunction remapVector(minSource, maxSource, minDestination, maxDestination, value) {\n const time = inverseLerpVector(minSource, maxSource, value);\n return lerpVector(minDestination, maxDestination, time);\n}\n\n\n/***/ }),\n\n/***/ \"./Math/line-segment.ts\":\n/*!******************************!*\\\n !*** ./Math/line-segment.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ LineSegment: () => (/* binding */ LineSegment)\n/* harmony export */ });\n/* harmony import */ var _vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vector */ \"./Math/vector.ts\");\n\n/**\n * A 2D line segment\n */\nclass LineSegment {\n /**\n * @param begin The starting point of the line segment\n * @param end The ending point of the line segment\n */\n constructor(begin, end) {\n this.begin = begin;\n this.end = end;\n }\n clone(dest) {\n const result = dest || new LineSegment(this.begin.clone(), this.end.clone());\n result.begin = this.begin.clone(result.begin);\n result.end = this.end.clone(result.end);\n return result;\n }\n transform(matrix, dest) {\n const result = dest || new LineSegment(_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero, _vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero);\n result.begin = matrix.multiply(this.begin, result.begin);\n result.end = matrix.multiply(this.end, result.end);\n return result;\n }\n /**\n * Gets the raw slope (m) of the line. Will return (+/-)Infinity for vertical lines.\n */\n get slope() {\n return (this.end.y - this.begin.y) / (this.end.x - this.begin.x);\n }\n /**\n * Gets the Y-intercept (b) of the line. Will return (+/-)Infinity if there is no intercept.\n */\n get intercept() {\n return this.begin.y - this.slope * this.begin.x;\n }\n /**\n * Gets the normal of the line\n */\n normal() {\n if (this._normal) {\n return this._normal;\n }\n return (this._normal = this.end.sub(this.begin).normal());\n }\n dir() {\n if (this._dir) {\n return this._dir;\n }\n return (this._dir = this.end.sub(this.begin));\n }\n getPoints() {\n return [this.begin, this.end];\n }\n /**\n * Returns the slope of the line in the form of a vector of length 1\n */\n getSlope() {\n if (this._slope) {\n return this._slope;\n }\n const begin = this.begin;\n const end = this.end;\n const distance = begin.distance(end);\n return (this._slope = end.sub(begin).scale(1 / distance));\n }\n /**\n * Returns the edge of the line as vector, the length of the vector is the length of the edge\n */\n getEdge() {\n const begin = this.begin;\n const end = this.end;\n return end.sub(begin);\n }\n /**\n * Returns the length of the line segment in pixels\n */\n getLength() {\n const begin = this.begin;\n const end = this.end;\n const distance = begin.distance(end);\n return distance;\n }\n /**\n * Returns the midpoint of the edge\n */\n get midpoint() {\n return this.begin.add(this.end).scale(0.5);\n }\n /**\n * Flips the direction of the line segment\n */\n flip() {\n return new LineSegment(this.end, this.begin);\n }\n /**\n * Tests if a given point is below the line, points in the normal direction above the line are considered above.\n * @param point\n */\n below(point) {\n const above2 = (this.end.x - this.begin.x) * (point.y - this.begin.y) - (this.end.y - this.begin.y) * (point.x - this.begin.x);\n return above2 >= 0;\n }\n /**\n * Returns the clip point\n * @param sideVector Vector that traces the line\n * @param length Length to clip along side\n */\n clip(sideVector, length, normalize = true) {\n let dir = sideVector;\n if (normalize) {\n dir = dir.normalize();\n }\n const near = dir.dot(this.begin) - length;\n const far = dir.dot(this.end) - length;\n const results = [];\n if (near <= 0) {\n results.push(this.begin);\n }\n if (far <= 0) {\n results.push(this.end);\n }\n if (near * far < 0) {\n const clipTime = near / (near - far);\n results.push(this.begin.add(this.end.sub(this.begin).scale(clipTime)));\n }\n if (results.length !== 2) {\n return null;\n }\n return new LineSegment(results[0], results[1]);\n }\n /**\n * Find the perpendicular distance from the line to a point\n * https://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line\n * @param point\n */\n distanceToPoint(point, signed = false) {\n const x0 = point.x;\n const y0 = point.y;\n const l = this.getLength();\n const dy = this.end.y - this.begin.y;\n const dx = this.end.x - this.begin.x;\n const distance = (dy * x0 - dx * y0 + this.end.x * this.begin.y - this.end.y * this.begin.x) / l;\n return signed ? distance : Math.abs(distance);\n }\n /**\n * Find the perpendicular line from the line to a point\n * https://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line\n * (a - p) - ((a - p) * n)n\n * a is a point on the line\n * p is the arbitrary point above the line\n * n is a unit vector in direction of the line\n * @param point\n */\n findVectorToPoint(point) {\n const aMinusP = this.begin.sub(point);\n const n = this.getSlope();\n return aMinusP.sub(n.scale(aMinusP.dot(n)));\n }\n /**\n * Finds a point on the line given only an X or a Y value. Given an X value, the function returns\n * a new point with the calculated Y value and vice-versa.\n * @param x The known X value of the target point\n * @param y The known Y value of the target point\n * @returns A new point with the other calculated axis value\n */\n findPoint(x = null, y = null) {\n const m = this.slope;\n const b = this.intercept;\n if (x !== null) {\n return new _vector__WEBPACK_IMPORTED_MODULE_0__.Vector(x, m * x + b);\n }\n else if (y !== null) {\n return new _vector__WEBPACK_IMPORTED_MODULE_0__.Vector((y - b) / m, y);\n }\n else {\n throw new Error('You must provide an X or a Y value');\n }\n }\n /**\n * @see http://stackoverflow.com/a/11908158/109458\n */\n hasPoint() {\n let currPoint;\n let threshold = 0;\n if (typeof arguments[0] === 'number' && typeof arguments[1] === 'number') {\n currPoint = new _vector__WEBPACK_IMPORTED_MODULE_0__.Vector(arguments[0], arguments[1]);\n threshold = arguments[2] || 0;\n }\n else if (arguments[0] instanceof _vector__WEBPACK_IMPORTED_MODULE_0__.Vector) {\n currPoint = arguments[0];\n threshold = arguments[1] || 0;\n }\n else {\n throw 'Could not determine the arguments for Vector.hasPoint';\n }\n const dxc = currPoint.x - this.begin.x;\n const dyc = currPoint.y - this.begin.y;\n const dx1 = this.end.x - this.begin.x;\n const dy1 = this.end.y - this.begin.y;\n const cross = dxc * dy1 - dyc * dx1;\n // check whether point lines on the line\n if (Math.abs(cross) > threshold) {\n return false;\n }\n // check whether point lies in-between start and end\n if (Math.abs(dx1) >= Math.abs(dy1)) {\n return dx1 > 0 ? this.begin.x <= currPoint.x && currPoint.x <= this.end.x : this.end.x <= currPoint.x && currPoint.x <= this.begin.x;\n }\n else {\n return dy1 > 0 ? this.begin.y <= currPoint.y && currPoint.y <= this.end.y : this.end.y <= currPoint.y && currPoint.y <= this.begin.y;\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/matrix.ts\":\n/*!************************!*\\\n !*** ./Math/matrix.ts ***!\n \\************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Matrix: () => (/* binding */ Matrix),\n/* harmony export */ MatrixLocations: () => (/* binding */ MatrixLocations)\n/* harmony export */ });\n/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./util */ \"./Math/util.ts\");\n/* harmony import */ var _vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vector */ \"./Math/vector.ts\");\n\n\n\nvar MatrixLocations;\n(function (MatrixLocations) {\n MatrixLocations[MatrixLocations[\"X\"] = 12] = \"X\";\n MatrixLocations[MatrixLocations[\"Y\"] = 13] = \"Y\";\n})(MatrixLocations || (MatrixLocations = {}));\n/**\n * Excalibur Matrix helper for 4x4 matrices\n *\n * Useful for webgl 4x4 matrices\n */\nclass Matrix {\n constructor() {\n /**\n * 4x4 matrix in column major order\n *\n * | | | | |\n * | ------- | ------- | -------- | -------- |\n * | data[0] | data[4] | data[8] | data[12] |\n * | data[1] | data[5] | data[9] | data[13] |\n * | data[2] | data[6] | data[10] | data[14] |\n * | data[3] | data[7] | data[11] | data[15] |\n *\n */\n this.data = new Float32Array(16);\n this._scaleX = 1;\n this._scaleSignX = 1;\n this._scaleY = 1;\n this._scaleSignY = 1;\n }\n /**\n * Creates an orthographic (flat non-perspective) projection\n * https://en.wikipedia.org/wiki/Orthographic_projection\n * @param left\n * @param right\n * @param bottom\n * @param top\n * @param near\n * @param far\n */\n static ortho(left, right, bottom, top, near, far) {\n const mat = new Matrix();\n mat.data[0] = 2 / (right - left);\n mat.data[1] = 0;\n mat.data[2] = 0;\n mat.data[3] = 0;\n mat.data[4] = 0;\n mat.data[5] = 2 / (top - bottom);\n mat.data[6] = 0;\n mat.data[7] = 0;\n mat.data[8] = 0;\n mat.data[9] = 0;\n mat.data[10] = -2 / (far - near);\n mat.data[11] = 0;\n mat.data[12] = -(right + left) / (right - left);\n mat.data[13] = -(top + bottom) / (top - bottom);\n mat.data[14] = -(far + near) / (far - near);\n mat.data[15] = 1;\n return mat;\n }\n /**\n * Creates a new Matrix with the same data as the current 4x4\n */\n clone(dest) {\n const mat = dest || new Matrix();\n mat.data[0] = this.data[0];\n mat.data[1] = this.data[1];\n mat.data[2] = this.data[2];\n mat.data[3] = this.data[3];\n mat.data[4] = this.data[4];\n mat.data[5] = this.data[5];\n mat.data[6] = this.data[6];\n mat.data[7] = this.data[7];\n mat.data[8] = this.data[8];\n mat.data[9] = this.data[9];\n mat.data[10] = this.data[10];\n mat.data[11] = this.data[11];\n mat.data[12] = this.data[12];\n mat.data[13] = this.data[13];\n mat.data[14] = this.data[14];\n mat.data[15] = this.data[15];\n return mat;\n }\n /**\n * Converts the current matrix into a DOMMatrix\n *\n * This is useful when working with the browser Canvas context\n * @returns {DOMMatrix} DOMMatrix\n */\n toDOMMatrix() {\n return new DOMMatrix([...this.data]);\n }\n static fromFloat32Array(data) {\n const matrix = new Matrix();\n matrix.data = data;\n return matrix;\n }\n /**\n * Creates a new identity matrix (a matrix that when applied does nothing)\n */\n static identity() {\n const mat = new Matrix();\n mat.data[0] = 1;\n mat.data[1] = 0;\n mat.data[2] = 0;\n mat.data[3] = 0;\n mat.data[4] = 0;\n mat.data[5] = 1;\n mat.data[6] = 0;\n mat.data[7] = 0;\n mat.data[8] = 0;\n mat.data[9] = 0;\n mat.data[10] = 1;\n mat.data[11] = 0;\n mat.data[12] = 0;\n mat.data[13] = 0;\n mat.data[14] = 0;\n mat.data[15] = 1;\n return mat;\n }\n /**\n * Resets the current matrix to the identity matrix, mutating it\n * @returns {Matrix} Current matrix as identity\n */\n reset() {\n const mat = this;\n mat.data[0] = 1;\n mat.data[1] = 0;\n mat.data[2] = 0;\n mat.data[3] = 0;\n mat.data[4] = 0;\n mat.data[5] = 1;\n mat.data[6] = 0;\n mat.data[7] = 0;\n mat.data[8] = 0;\n mat.data[9] = 0;\n mat.data[10] = 1;\n mat.data[11] = 0;\n mat.data[12] = 0;\n mat.data[13] = 0;\n mat.data[14] = 0;\n mat.data[15] = 1;\n return mat;\n }\n /**\n * Creates a brand new translation matrix at the specified 3d point\n * @param x\n * @param y\n */\n static translation(x, y) {\n const mat = Matrix.identity();\n mat.data[12] = x;\n mat.data[13] = y;\n return mat;\n }\n /**\n * Creates a brand new scaling matrix with the specified scaling factor\n * @param sx\n * @param sy\n */\n static scale(sx, sy) {\n const mat = Matrix.identity();\n mat.data[0] = sx;\n mat.data[5] = sy;\n mat.data[10] = 1;\n mat.data[15] = 1;\n return mat;\n }\n /**\n * Creates a brand new rotation matrix with the specified angle in radians\n * @param angle\n */\n static rotation(angle) {\n const mat = Matrix.identity();\n mat.data[0] = Math.cos(angle);\n mat.data[4] = -Math.sin(angle);\n mat.data[1] = Math.sin(angle);\n mat.data[5] = Math.cos(angle);\n return mat;\n }\n multiply(vectorOrMatrix, dest) {\n if (vectorOrMatrix instanceof _vector__WEBPACK_IMPORTED_MODULE_0__.Vector) {\n const result = dest || new _vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\n const vector = vectorOrMatrix;\n // these shenanigans are to allow dest and vector to be the same instance\n const resultX = vector.x * this.data[0] + vector.y * this.data[4] + this.data[12];\n const resultY = vector.x * this.data[1] + vector.y * this.data[5] + this.data[13];\n result.x = resultX;\n result.y = resultY;\n return result;\n }\n else {\n const result = dest || new Matrix();\n const other = vectorOrMatrix;\n const a11 = this.data[0];\n const a21 = this.data[1];\n const a31 = this.data[2];\n const a41 = this.data[3];\n const a12 = this.data[4];\n const a22 = this.data[5];\n const a32 = this.data[6];\n const a42 = this.data[7];\n const a13 = this.data[8];\n const a23 = this.data[9];\n const a33 = this.data[10];\n const a43 = this.data[11];\n const a14 = this.data[12];\n const a24 = this.data[13];\n const a34 = this.data[14];\n const a44 = this.data[15];\n const b11 = other.data[0];\n const b21 = other.data[1];\n const b31 = other.data[2];\n const b41 = other.data[3];\n const b12 = other.data[4];\n const b22 = other.data[5];\n const b32 = other.data[6];\n const b42 = other.data[7];\n const b13 = other.data[8];\n const b23 = other.data[9];\n const b33 = other.data[10];\n const b43 = other.data[11];\n const b14 = other.data[12];\n const b24 = other.data[13];\n const b34 = other.data[14];\n const b44 = other.data[15];\n result.data[0] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n result.data[1] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n result.data[2] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n result.data[3] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n result.data[4] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n result.data[5] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n result.data[6] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n result.data[7] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n result.data[8] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n result.data[9] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n result.data[10] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n result.data[11] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n result.data[12] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n result.data[13] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n result.data[14] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n result.data[15] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n const s = this.getScale();\n result._scaleSignX = (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(s.x) * (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(result._scaleSignX);\n result._scaleSignY = (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(s.y) * (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(result._scaleSignY);\n return result;\n }\n }\n /**\n * Applies translation to the current matrix mutating it\n * @param x\n * @param y\n */\n translate(x, y) {\n const a11 = this.data[0];\n const a21 = this.data[1];\n const a31 = this.data[2];\n const a41 = this.data[3];\n const a12 = this.data[4];\n const a22 = this.data[5];\n const a32 = this.data[6];\n const a42 = this.data[7];\n const a13 = this.data[8];\n const a23 = this.data[9];\n const a33 = this.data[10];\n const a43 = this.data[11];\n const a14 = this.data[12];\n const a24 = this.data[13];\n const a34 = this.data[14];\n const a44 = this.data[15];\n // Doesn't change z\n const z = 0;\n const w = 1;\n this.data[12] = a11 * x + a12 * y + a13 * z + a14 * w;\n this.data[13] = a21 * x + a22 * y + a23 * z + a24 * w;\n this.data[14] = a31 * x + a32 * y + a33 * z + a34 * w;\n this.data[15] = a41 * x + a42 * y + a43 * z + a44 * w;\n return this;\n }\n setPosition(x, y) {\n this.data[12] = x;\n this.data[13] = y;\n }\n getPosition() {\n return (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.data[12], this.data[13]);\n }\n /**\n * Applies rotation to the current matrix mutating it\n * @param angle in Radians\n */\n rotate(angle) {\n const a11 = this.data[0];\n const a21 = this.data[1];\n const a31 = this.data[2];\n const a41 = this.data[3];\n const a12 = this.data[4];\n const a22 = this.data[5];\n const a32 = this.data[6];\n const a42 = this.data[7];\n const sine = Math.sin(angle);\n const cosine = Math.cos(angle);\n this.data[0] = cosine * a11 + sine * a12;\n this.data[1] = cosine * a21 + sine * a22;\n this.data[2] = cosine * a31 + sine * a32;\n this.data[3] = cosine * a41 + sine * a42;\n this.data[4] = cosine * a12 - sine * a11;\n this.data[5] = cosine * a22 - sine * a21;\n this.data[6] = cosine * a32 - sine * a31;\n this.data[7] = cosine * a42 - sine * a41;\n return this;\n }\n /**\n * Applies scaling to the current matrix mutating it\n * @param x\n * @param y\n */\n scale(x, y) {\n const a11 = this.data[0];\n const a21 = this.data[1];\n const a31 = this.data[2];\n const a41 = this.data[3];\n const a12 = this.data[4];\n const a22 = this.data[5];\n const a32 = this.data[6];\n const a42 = this.data[7];\n this.data[0] = a11 * x;\n this.data[1] = a21 * x;\n this.data[2] = a31 * x;\n this.data[3] = a41 * x;\n this.data[4] = a12 * y;\n this.data[5] = a22 * y;\n this.data[6] = a32 * y;\n this.data[7] = a42 * y;\n return this;\n }\n setRotation(angle) {\n const currentScale = this.getScale();\n const sine = Math.sin(angle);\n const cosine = Math.cos(angle);\n this.data[0] = cosine * currentScale.x;\n this.data[1] = sine * currentScale.y;\n this.data[4] = -sine * currentScale.x;\n this.data[5] = cosine * currentScale.y;\n }\n getRotation() {\n const angle = Math.atan2(this.data[1] / this.getScaleY(), this.data[0] / this.getScaleX());\n return (0,_util__WEBPACK_IMPORTED_MODULE_1__.canonicalizeAngle)(angle);\n }\n getScaleX() {\n // absolute scale of the matrix (we lose sign so need to add it back)\n const xscale = (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.data[0], this.data[4]).magnitude;\n return this._scaleSignX * xscale;\n }\n getScaleY() {\n // absolute scale of the matrix (we lose sign so need to add it back)\n const yscale = (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.data[1], this.data[5]).magnitude;\n return this._scaleSignY * yscale;\n }\n /**\n * Get the scale of the matrix\n */\n getScale() {\n return (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.getScaleX(), this.getScaleY());\n }\n setScaleX(val) {\n if (this._scaleX === val) {\n return;\n }\n this._scaleSignX = (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(val);\n // negative scale acts like a 180 rotation, so flip\n const xscale = (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.data[0] * this._scaleSignX, this.data[4] * this._scaleSignX).normalize();\n this.data[0] = xscale.x * val;\n this.data[4] = xscale.y * val;\n this._scaleX = val;\n }\n setScaleY(val) {\n if (this._scaleY === val) {\n return;\n }\n this._scaleSignY = (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(val);\n // negative scale acts like a 180 rotation, so flip\n const yscale = (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.data[1] * this._scaleSignY, this.data[5] * this._scaleSignY).normalize();\n this.data[1] = yscale.x * val;\n this.data[5] = yscale.y * val;\n this._scaleY = val;\n }\n setScale(scale) {\n this.setScaleX(scale.x);\n this.setScaleY(scale.y);\n }\n /**\n * Determinant of the upper left 2x2 matrix\n */\n getBasisDeterminant() {\n return this.data[0] * this.data[5] - this.data[1] * this.data[4];\n }\n /**\n * Return the affine inverse, optionally store it in a target matrix.\n *\n * It's recommended you call .reset() the target unless you know what you're doing\n * @param target\n */\n getAffineInverse(target) {\n // See http://negativeprobability.blogspot.com/2011/11/affine-transformations-and-their.html\n // See https://www.mathsisfun.com/algebra/matrix-inverse.html\n // Since we are actually only doing 2D transformations we can use this hack\n // We don't actually use the 3rd or 4th dimension\n const det = this.getBasisDeterminant();\n const inverseDet = 1 / det; // todo zero check\n const a = this.data[0];\n const b = this.data[4];\n const c = this.data[1];\n const d = this.data[5];\n const m = target || Matrix.identity();\n // inverts rotation and scale\n m.data[0] = d * inverseDet;\n m.data[1] = -c * inverseDet;\n m.data[4] = -b * inverseDet;\n m.data[5] = a * inverseDet;\n const tx = this.data[12];\n const ty = this.data[13];\n // invert translation\n // transform translation into the matrix basis created by rot/scale\n m.data[12] = -(tx * m.data[0] + ty * m.data[4]);\n m.data[13] = -(tx * m.data[1] + ty * m.data[5]);\n return m;\n }\n isIdentity() {\n return (this.data[0] === 1 &&\n this.data[1] === 0 &&\n this.data[2] === 0 &&\n this.data[3] === 0 &&\n this.data[4] === 0 &&\n this.data[5] === 1 &&\n this.data[6] === 0 &&\n this.data[7] === 0 &&\n this.data[8] === 0 &&\n this.data[9] === 0 &&\n this.data[10] === 1 &&\n this.data[11] === 0 &&\n this.data[12] === 0 &&\n this.data[13] === 0 &&\n this.data[14] === 0 &&\n this.data[15] === 1);\n }\n toString() {\n return `\r\n[${this.data[0]} ${this.data[4]} ${this.data[8]} ${this.data[12]}]\r\n[${this.data[1]} ${this.data[5]} ${this.data[9]} ${this.data[13]}]\r\n[${this.data[2]} ${this.data[6]} ${this.data[10]} ${this.data[14]}]\r\n[${this.data[3]} ${this.data[7]} ${this.data[11]} ${this.data[15]}]\r\n`;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/projection.ts\":\n/*!****************************!*\\\n !*** ./Math/projection.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Projection: () => (/* binding */ Projection)\n/* harmony export */ });\n/**\n * A 1 dimensional projection on an axis, used to test overlaps\n */\nclass Projection {\n constructor(min, max) {\n this.min = min;\n this.max = max;\n }\n overlaps(projection) {\n return this.max > projection.min && projection.max > this.min;\n }\n getOverlap(projection) {\n if (this.overlaps(projection)) {\n if (this.max > projection.max) {\n return projection.max - this.min;\n }\n else {\n return this.max - projection.min;\n }\n }\n return 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/ray.ts\":\n/*!*********************!*\\\n !*** ./Math/ray.ts ***!\n \\*********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Ray: () => (/* binding */ Ray)\n/* harmony export */ });\n/**\n * A 2D ray that can be cast into the scene to do collision detection\n */\nclass Ray {\n /**\n * @param pos The starting position for the ray\n * @param dir The vector indicating the direction of the ray\n */\n constructor(pos, dir) {\n this.pos = pos;\n this.dir = dir.normalize();\n }\n /**\n * Tests a whether this ray intersects with a line segment. Returns a number greater than or equal to 0 on success.\n * This number indicates the mathematical intersection time.\n * @param line The line to test\n */\n intersect(line) {\n const numerator = line.begin.sub(this.pos);\n // Test is line and ray are parallel and non intersecting\n if (this.dir.cross(line.getSlope()) === 0 && numerator.cross(this.dir) !== 0) {\n return -1;\n }\n // Lines are parallel\n const divisor = this.dir.cross(line.getSlope());\n if (divisor === 0) {\n return -1;\n }\n const t = numerator.cross(line.getSlope()) / divisor;\n if (t >= 0) {\n const u = numerator.cross(this.dir) / divisor / line.getLength();\n if (u >= 0 && u <= 1) {\n return t;\n }\n }\n return -1;\n }\n intersectPoint(line) {\n const time = this.intersect(line);\n if (time < 0) {\n return null;\n }\n return this.getPoint(time);\n }\n /**\n * Returns the point of intersection given the intersection time\n */\n getPoint(time) {\n return this.pos.add(this.dir.scale(time));\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/rotation-type.ts\":\n/*!*******************************!*\\\n !*** ./Math/rotation-type.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RotationType: () => (/* binding */ RotationType)\n/* harmony export */ });\n/**\n * An enum that describes the strategies that rotation actions can use\n */\nvar RotationType;\n(function (RotationType) {\n /**\n * Rotation via `ShortestPath` will use the smallest angle\n * between the starting and ending points. This strategy is the default behavior.\n */\n RotationType[\"ShortestPath\"] = \"shortest-path\";\n /**\n * Rotation via `LongestPath` will use the largest angle\n * between the starting and ending points.\n */\n RotationType[\"LongestPath\"] = \"longest-path\";\n /**\n * Rotation via `Clockwise` will travel in a clockwise direction,\n * regardless of the starting and ending points.\n */\n RotationType[\"Clockwise\"] = \"clockwise\";\n /**\n * Rotation via `CounterClockwise` will travel in a counterclockwise direction,\n * regardless of the starting and ending points.\n */\n RotationType[\"CounterClockwise\"] = \"counter-clockwise\";\n})(RotationType || (RotationType = {}));\n\n\n/***/ }),\n\n/***/ \"./Math/transform.ts\":\n/*!***************************!*\\\n !*** ./Math/transform.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Transform: () => (/* binding */ Transform)\n/* harmony export */ });\n/* harmony import */ var _affine_matrix__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./affine-matrix */ \"./Math/affine-matrix.ts\");\n/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./util */ \"./Math/util.ts\");\n/* harmony import */ var _vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./vector */ \"./Math/vector.ts\");\n/* harmony import */ var _vector_view__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./vector-view */ \"./Math/vector-view.ts\");\n/* harmony import */ var _watch_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./watch-vector */ \"./Math/watch-vector.ts\");\n\n\n\n\n\nclass Transform {\n constructor() {\n this._parent = null;\n this._children = [];\n this._pos = new _watch_vector__WEBPACK_IMPORTED_MODULE_0__.WatchVector((0,_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0), () => {\n this.flagDirty();\n });\n this._globalPos = new _vector_view__WEBPACK_IMPORTED_MODULE_2__.VectorView({\n getX: () => this.matrix.data[4],\n getY: () => this.matrix.data[5],\n setX: (x) => {\n if (this.parent) {\n const { x: newX } = this.parent.inverse.multiply((0,_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(x, this.pos.y));\n this.pos.x = newX;\n }\n else {\n this.pos.x = x;\n }\n if (x !== this.matrix.data[4]) {\n this.flagDirty();\n }\n },\n setY: (y) => {\n if (this.parent) {\n const { y: newY } = this.parent.inverse.multiply((0,_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(this.pos.x, y));\n this.pos.y = newY;\n }\n else {\n this.pos.y = y;\n }\n if (y !== this.matrix.data[5]) {\n this.flagDirty();\n }\n }\n });\n this._rotation = 0;\n this._scale = new _watch_vector__WEBPACK_IMPORTED_MODULE_0__.WatchVector((0,_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(1, 1), () => {\n this.flagDirty();\n });\n this._globalScale = new _vector_view__WEBPACK_IMPORTED_MODULE_2__.VectorView({\n getX: () => (this.parent ? this.matrix.getScaleX() : this.scale.x),\n getY: () => (this.parent ? this.matrix.getScaleY() : this.scale.y),\n setX: (x) => {\n if (this.parent) {\n const globalScaleX = this.parent.globalScale.x;\n this.scale.x = x / globalScaleX;\n }\n else {\n this.scale.x = x;\n }\n },\n setY: (y) => {\n if (this.parent) {\n const globalScaleY = this.parent.globalScale.y;\n this.scale.y = y / globalScaleY;\n }\n else {\n this.scale.y = y;\n }\n }\n });\n this._z = 0;\n this._isDirty = false;\n this._isInverseDirty = false;\n this._matrix = _affine_matrix__WEBPACK_IMPORTED_MODULE_3__.AffineMatrix.identity();\n this._inverse = _affine_matrix__WEBPACK_IMPORTED_MODULE_3__.AffineMatrix.identity();\n this._scratch = _affine_matrix__WEBPACK_IMPORTED_MODULE_3__.AffineMatrix.identity();\n }\n get parent() {\n return this._parent;\n }\n set parent(transform) {\n if (this._parent) {\n const index = this._parent._children.indexOf(this);\n if (index > -1) {\n this._parent._children.splice(index, 1);\n }\n }\n this._parent = transform;\n if (this._parent) {\n this._parent._children.push(this);\n }\n this.flagDirty();\n }\n get children() {\n return this._children;\n }\n set pos(v) {\n this._pos.x = v.x;\n this._pos.y = v.y;\n }\n get pos() {\n return this._pos;\n }\n set globalPos(v) {\n let localPos = v.clone();\n if (this.parent) {\n localPos = this.parent.inverse.multiply(v);\n }\n if (!localPos.equals(this._pos)) {\n this._pos = localPos;\n this.flagDirty();\n }\n }\n get globalPos() {\n return this._globalPos;\n }\n set rotation(rotation) {\n const canonRotation = (0,_util__WEBPACK_IMPORTED_MODULE_4__.canonicalizeAngle)(rotation);\n if (canonRotation !== this._rotation) {\n this.flagDirty();\n }\n this._rotation = canonRotation;\n }\n get rotation() {\n return this._rotation;\n }\n set globalRotation(rotation) {\n let inverseRotation = 0;\n if (this.parent) {\n inverseRotation = this.parent.globalRotation;\n }\n const canonRotation = (0,_util__WEBPACK_IMPORTED_MODULE_4__.canonicalizeAngle)(rotation + inverseRotation);\n if (canonRotation !== this._rotation) {\n this.flagDirty();\n }\n this._rotation = canonRotation;\n }\n get globalRotation() {\n if (this.parent) {\n return this.matrix.getRotation();\n }\n return this.rotation;\n }\n set scale(v) {\n this._scale.x = v.x;\n this._scale.y = v.y;\n }\n get scale() {\n return this._scale;\n }\n set globalScale(v) {\n let inverseScale = (0,_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(1, 1);\n if (this.parent) {\n inverseScale = this.parent.globalScale;\n }\n this.scale = v.scale((0,_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(1 / inverseScale.x, 1 / inverseScale.y));\n }\n get globalScale() {\n return this._globalScale;\n }\n set z(z) {\n this._z = z;\n this.flagDirty();\n }\n get z() {\n return this._z;\n }\n set globalZ(z) {\n if (this.parent) {\n this.z = z - this.parent.globalZ;\n }\n else {\n this.z = z;\n }\n }\n get globalZ() {\n if (this.parent) {\n return this.z + this.parent.globalZ;\n }\n return this.z;\n }\n /**\n * Calculates and returns the matrix representation of this transform\n *\n * Avoid mutating the matrix to update the transform, it is not the source of truth.\n * Update the transform pos, rotation, scale.\n */\n get matrix() {\n if (this._isDirty) {\n if (this.parent === null) {\n this._calculateMatrix().clone(this._matrix);\n }\n else {\n this.parent.matrix.multiply(this._calculateMatrix()).clone(this._matrix);\n }\n this._isDirty = false;\n }\n return this._matrix;\n }\n /**\n * Calculates and returns the inverse matrix representation of this transform\n */\n get inverse() {\n if (this._isInverseDirty) {\n this.matrix.inverse(this._inverse);\n this._isInverseDirty = false;\n }\n return this._inverse;\n }\n _calculateMatrix() {\n this._scratch.data[0] = Math.cos(this._rotation);\n this._scratch.data[1] = Math.sin(this._rotation);\n this._scratch.data[2] = -Math.sin(this._rotation);\n this._scratch.data[3] = Math.cos(this.rotation);\n this._scratch.data[4] = this._pos.x;\n this._scratch.data[5] = this._pos.y;\n this._scratch.scale(this._scale.x, this._scale.y);\n return this._scratch;\n }\n flagDirty() {\n this._isDirty = true;\n this._isInverseDirty = true;\n for (let i = 0; i < this._children.length; i++) {\n this._children[i].flagDirty();\n }\n }\n apply(point) {\n return this.matrix.multiply(point);\n }\n applyInverse(point) {\n return this.inverse.multiply(point);\n }\n setTransform(pos, rotation, scale) {\n this._pos.x = pos.x;\n this._pos.y = pos.y;\n this._rotation = (0,_util__WEBPACK_IMPORTED_MODULE_4__.canonicalizeAngle)(rotation);\n this._scale.x = scale.x;\n this._scale.y = scale.y;\n this.flagDirty();\n }\n /**\n * Returns true if the transform has a negative x scale or y scale, but not both\n */\n isMirrored() {\n const signBitX = (0,_util__WEBPACK_IMPORTED_MODULE_4__.sign)(this.scale.x) >>> 31;\n const signBitY = (0,_util__WEBPACK_IMPORTED_MODULE_4__.sign)(this.scale.y) >>> 31;\n const mirrored = signBitX ^ signBitY;\n return !!mirrored;\n }\n /**\n * Clones the current transform\n * **Warning does not clone the parent**\n * @param dest\n */\n clone(dest) {\n const target = dest !== null && dest !== void 0 ? dest : new Transform();\n this._pos.clone(target._pos);\n target._z = this._z;\n target._rotation = this._rotation;\n this._scale.clone(target._scale);\n target.flagDirty();\n return target;\n }\n /**\n * Clones but keeps the same parent reference\n */\n cloneWithParent(dest) {\n const target = dest !== null && dest !== void 0 ? dest : new Transform();\n this._pos.clone(target._pos);\n target._z = this._z;\n target._rotation = this._rotation;\n this._scale.clone(target._scale);\n target.parent = this.parent;\n target.flagDirty();\n return target;\n }\n toString() {\n return this.matrix.toString();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/util.ts\":\n/*!**********************!*\\\n !*** ./Math/util.ts ***!\n \\**********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TwoPI: () => (/* binding */ TwoPI),\n/* harmony export */ approximatelyEqual: () => (/* binding */ approximatelyEqual),\n/* harmony export */ canonicalizeAngle: () => (/* binding */ canonicalizeAngle),\n/* harmony export */ clamp: () => (/* binding */ clamp),\n/* harmony export */ frac: () => (/* binding */ frac),\n/* harmony export */ randomInRange: () => (/* binding */ randomInRange),\n/* harmony export */ randomIntInRange: () => (/* binding */ randomIntInRange),\n/* harmony export */ range: () => (/* binding */ range),\n/* harmony export */ sign: () => (/* binding */ sign),\n/* harmony export */ toDegrees: () => (/* binding */ toDegrees),\n/* harmony export */ toRadians: () => (/* binding */ toRadians)\n/* harmony export */ });\n/* harmony import */ var _Random__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Random */ \"./Math/Random.ts\");\n\n/**\n * Two PI constant\n */\nconst TwoPI = Math.PI * 2;\n/**\n * Returns the fractional part of a number\n * @param x\n */\nfunction frac(x) {\n if (x >= 0) {\n return x - Math.floor(x);\n }\n else {\n return x - Math.ceil(x);\n }\n}\n/**\n * Returns the sign of a number, if 0 returns 0\n */\nfunction sign(val) {\n if (val === 0) {\n return 0;\n }\n return val < 0 ? -1 : 1;\n}\n/**\n * Clamps a value between a min and max inclusive\n */\nfunction clamp(val, min, max) {\n return Math.min(Math.max(min, val), max);\n}\n/**\n * Approximately equals\n */\nfunction approximatelyEqual(val1, val2, tolerance) {\n // https://dev.to/alldanielscott/how-to-compare-numbers-correctly-in-javascript-1l4i\n return Math.abs(val1 - val2) < tolerance;\n}\n/**\n * Convert an angle to be the equivalent in the range [0, 2PI)\n */\nfunction canonicalizeAngle(angle) {\n let tmpAngle = angle;\n if (angle >= TwoPI) {\n while (tmpAngle >= TwoPI) {\n tmpAngle -= TwoPI;\n }\n }\n if (angle < 0) {\n while (tmpAngle < 0) {\n tmpAngle += TwoPI;\n }\n }\n return tmpAngle;\n}\n/**\n * Convert radians to degrees\n */\nfunction toDegrees(radians) {\n return (180 / Math.PI) * radians;\n}\n/**\n * Convert degrees to radians\n */\nfunction toRadians(degrees) {\n return (degrees / 180) * Math.PI;\n}\n/**\n * Generate a range of numbers\n * For example: range(0, 5) -> [0, 1, 2, 3, 4, 5]\n * @param from inclusive\n * @param to inclusive\n */\nconst range = (from, to) => Array.from(new Array(to - from + 1), (_x, i) => i + from);\n/**\n * Find a random floating point number in range\n */\nfunction randomInRange(min, max, random = new _Random__WEBPACK_IMPORTED_MODULE_0__.Random()) {\n return random ? random.floating(min, max) : min + Math.random() * (max - min);\n}\n/**\n * Find a random integer in a range\n */\nfunction randomIntInRange(min, max, random = new _Random__WEBPACK_IMPORTED_MODULE_0__.Random()) {\n return random ? random.integer(min, max) : Math.round(randomInRange(min, max));\n}\n\n\n/***/ }),\n\n/***/ \"./Math/vector-view.ts\":\n/*!*****************************!*\\\n !*** ./Math/vector-view.ts ***!\n \\*****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ VectorView: () => (/* binding */ VectorView)\n/* harmony export */ });\n/* harmony import */ var _vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vector */ \"./Math/vector.ts\");\n\nclass VectorView extends _vector__WEBPACK_IMPORTED_MODULE_0__.Vector {\n constructor(options) {\n super(0, 0);\n this._getX = options.getX;\n this._getY = options.getY;\n this._setX = options.setX;\n this._setY = options.setY;\n }\n get x() {\n return (this._x = this._getX());\n }\n set x(val) {\n this._setX(val);\n this._x = val;\n }\n get y() {\n return (this._y = this._getY());\n }\n set y(val) {\n this._setY(val);\n this._y = val;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/vector.ts\":\n/*!************************!*\\\n !*** ./Math/vector.ts ***!\n \\************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Vector: () => (/* binding */ Vector),\n/* harmony export */ vec: () => (/* binding */ vec)\n/* harmony export */ });\n/* harmony import */ var _rotation_type__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./rotation-type */ \"./Math/rotation-type.ts\");\n/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./util */ \"./Math/util.ts\");\n\n\n/**\n * A 2D vector on a plane.\n */\nclass Vector {\n /**\n * A (0, 0) vector\n */\n static get Zero() {\n return new Vector(0, 0);\n }\n /**\n * A (1, 1) vector\n */\n static get One() {\n return new Vector(1, 1);\n }\n /**\n * A (0.5, 0.5) vector\n */\n static get Half() {\n return new Vector(0.5, 0.5);\n }\n /**\n * A unit vector pointing up (0, -1)\n */\n static get Up() {\n return new Vector(0, -1);\n }\n /**\n * A unit vector pointing down (0, 1)\n */\n static get Down() {\n return new Vector(0, 1);\n }\n /**\n * A unit vector pointing left (-1, 0)\n */\n static get Left() {\n return new Vector(-1, 0);\n }\n /**\n * A unit vector pointing right (1, 0)\n */\n static get Right() {\n return new Vector(1, 0);\n }\n /**\n * Returns a vector of unit length in the direction of the specified angle in Radians.\n * @param angle The angle to generate the vector\n */\n static fromAngle(angle) {\n return new Vector(Math.cos(angle), Math.sin(angle));\n }\n /**\n * Checks if vector is not null, undefined, or if any of its components are NaN or Infinity.\n */\n static isValid(vec) {\n if (vec === null || vec === undefined) {\n return false;\n }\n if (isNaN(vec.x) || isNaN(vec.y)) {\n return false;\n }\n if (vec.x === Infinity || vec.y === Infinity || vec.x === -Infinity || vec.y === -Infinity) {\n return false;\n }\n return true;\n }\n /**\n * Calculates distance between two Vectors\n * @param vec1\n * @param vec2\n */\n static distance(vec1, vec2) {\n return Math.sqrt(Math.pow(vec1.x - vec2.x, 2) + Math.pow(vec1.y - vec2.y, 2));\n }\n static min(vec1, vec2) {\n return new Vector(Math.min(vec1.x, vec2.x), Math.min(vec1.y, vec2.y));\n }\n static max(vec1, vec2) {\n return new Vector(Math.max(vec1.x, vec2.x), Math.max(vec1.y, vec2.y));\n }\n /**\n * @param x X component of the Vector\n * @param y Y component of the Vector\n */\n constructor(x, y) {\n this._x = 0;\n this._y = 0;\n this._x = x;\n this._y = y;\n }\n /**\n * Get the x component of the vector\n */\n get x() {\n return this._x;\n }\n /**\n * Set the x component, THIS MUTATES the current vector. It is usually better to create a new vector.\n * @warning **Be very careful setting components on shared vectors, mutating shared vectors can cause hard to find bugs**\n */\n set x(val) {\n this._x = val;\n }\n /**\n * Get the y component of the vector\n */\n get y() {\n return this._y;\n }\n /**\n * Set the y component, THIS MUTATES the current vector. It is usually better to create a new vector.\n * @warning **Be very careful setting components on shared vectors, mutating shared vectors can cause hard to find bugs**\n */\n set y(val) {\n this._y = val;\n }\n /**\n * Sets the x and y components at once, THIS MUTATES the current vector. It is usually better to create a new vector.\n * @warning **Be very careful using this, mutating vectors can cause hard to find bugs**\n */\n setTo(x, y) {\n this.x = x;\n this.y = y;\n }\n /**\n * Compares this point against another and tests for equality\n * @param vector The other point to compare to\n * @param tolerance Amount of euclidean distance off we are willing to tolerate\n */\n equals(vector, tolerance = Vector.EQUALS_EPSILON) {\n return Math.abs(this.x - vector.x) <= tolerance && Math.abs(this.y - vector.y) <= tolerance;\n }\n /**\n * The distance to another vector. If no other Vector is specified, this will return the {@apilink magnitude}.\n * @param v The other vector. Leave blank to use origin vector.\n */\n distance(v) {\n if (!v) {\n return Math.sqrt(this.x * this.x + this.y * this.y);\n }\n const deltaX = this.x - v.x;\n const deltaY = this.y - v.y;\n return Math.sqrt(deltaX * deltaX + deltaY * deltaY);\n }\n squareDistance(v) {\n if (!v) {\n v = Vector.Zero;\n }\n const deltaX = this.x - v.x;\n const deltaY = this.y - v.y;\n return deltaX * deltaX + deltaY * deltaY;\n }\n /**\n * Clamps the current vector's magnitude mutating it\n * @param magnitude\n */\n clampMagnitude(magnitude) {\n const size = this.magnitude;\n const newSize = (0,_util__WEBPACK_IMPORTED_MODULE_0__.clamp)(size, 0, magnitude);\n this.magnitude = newSize;\n return this;\n }\n /**\n * The size (magnitude) of the Vector\n * @deprecated Will be removed in v1, use Vector.magnitude\n */\n get size() {\n return this.distance();\n }\n /**\n * Setting the size mutates the current vector\n * @warning Can be used to set the size of the vector, **be very careful using this, mutating vectors can cause hard to find bugs**\n * @deprecated Will be removed in v1, use Vector.magnitude\n */\n set size(newLength) {\n const v = this.normalize().scale(newLength);\n this.setTo(v.x, v.y);\n }\n /**\n * The magnitude (length) of the Vector\n */\n get magnitude() {\n return this.distance();\n }\n /**\n * Setting the size mutates the current vector\n * @warning Can be used to set the size of the vector, **be very careful using this, mutating vectors can cause hard to find bugs**\n */\n set magnitude(newMagnitude) {\n this.normalize().scale(newMagnitude, this);\n }\n /**\n * Normalizes a non-zero vector to have a magnitude of 1. Zero vectors return a new zero vector.\n */\n normalize() {\n const distance = this.distance();\n if (distance === 0) {\n return Vector.Zero;\n }\n return new Vector(this.x / distance, this.y / distance);\n }\n /**\n * Returns the average (midpoint) between the current point and the specified\n */\n average(vec) {\n return this.add(vec).scale(0.5);\n }\n scale(sizeOrScale, dest) {\n const result = dest || new Vector(0, 0);\n if (sizeOrScale instanceof Vector) {\n result.x = this.x * sizeOrScale.x;\n result.y = this.y * sizeOrScale.y;\n }\n else {\n result.x = this.x * sizeOrScale;\n result.y = this.y * sizeOrScale;\n }\n return result;\n }\n /**\n * Adds one vector to another\n * @param v The vector to add\n * @param dest Optionally copy the result into a provided vector\n */\n add(v, dest) {\n if (dest) {\n dest.x = this.x + v.x;\n dest.y = this.y + v.y;\n return dest;\n }\n return new Vector(this.x + v.x, this.y + v.y);\n }\n /**\n * Subtracts a vector from another, if you subtract vector `B.sub(A)` the resulting vector points from A -> B\n * @param v The vector to subtract\n */\n sub(v, dest) {\n const result = dest || new Vector(0, 0);\n const x = this.x - v.x;\n const y = this.y - v.y;\n result.x = x;\n result.y = y;\n return result;\n }\n /**\n * Adds one vector to this one modifying the original\n * @param v The vector to add\n * @warning Be very careful using this, mutating vectors can cause hard to find bugs\n */\n addEqual(v) {\n this.setTo(this.x + v.x, this.y + v.y);\n return this;\n }\n /**\n * Subtracts a vector from this one modifying the original\n * @param v The vector to subtract\n * @warning Be very careful using this, mutating vectors can cause hard to find bugs\n */\n subEqual(v) {\n this.setTo(this.x - v.x, this.y - v.y);\n return this;\n }\n /**\n * Scales this vector by a factor of size and modifies the original\n * @warning Be very careful using this, mutating vectors can cause hard to find bugs\n */\n scaleEqual(size) {\n this.setTo(this.x * size, this.y * size);\n return this;\n }\n /**\n * Performs a dot product with another vector\n * @param v The vector to dot\n */\n dot(v) {\n return this.x * v.x + this.y * v.y;\n }\n cross(v) {\n if (v instanceof Vector) {\n return this.x * v.y - this.y * v.x;\n }\n else if (typeof v === 'number') {\n return new Vector(v * this.y, -v * this.x);\n }\n }\n static cross(num, vec) {\n return new Vector(-num * vec.y, num * vec.x);\n }\n /**\n * Returns the perpendicular vector to this one\n */\n perpendicular() {\n return new Vector(this.y, -this.x);\n }\n /**\n * Returns the normal vector to this one, same as the perpendicular of length 1\n */\n normal() {\n return this.perpendicular().normalize();\n }\n /**\n * Negate the current vector\n */\n negate() {\n return this.scale(-1);\n }\n /**\n * Returns the angle of this vector, in range [0, 2*PI)\n */\n toAngle() {\n return (0,_util__WEBPACK_IMPORTED_MODULE_0__.canonicalizeAngle)(Math.atan2(this.y, this.x));\n }\n /**\n * Returns the difference in radians between the angle of this vector and given angle,\n * using the given rotation type.\n * @param angle in radians to which the vector has to be rotated, using {@apilink rotate}\n * @param rotationType what {@apilink RotationType} to use for the rotation\n * @returns the angle by which the vector needs to be rotated to match the given angle\n */\n angleBetween(angle, rotationType) {\n const startAngleRadians = this.toAngle();\n const endAngleRadians = (0,_util__WEBPACK_IMPORTED_MODULE_0__.canonicalizeAngle)(angle);\n let rotationClockwise = 0;\n let rotationAntiClockwise = 0;\n if (endAngleRadians > startAngleRadians) {\n rotationClockwise = endAngleRadians - startAngleRadians;\n }\n else {\n rotationClockwise = (_util__WEBPACK_IMPORTED_MODULE_0__.TwoPI - startAngleRadians + endAngleRadians) % _util__WEBPACK_IMPORTED_MODULE_0__.TwoPI;\n }\n rotationAntiClockwise = (rotationClockwise - _util__WEBPACK_IMPORTED_MODULE_0__.TwoPI) % _util__WEBPACK_IMPORTED_MODULE_0__.TwoPI;\n switch (rotationType) {\n case _rotation_type__WEBPACK_IMPORTED_MODULE_1__.RotationType.ShortestPath:\n if (Math.abs(rotationClockwise) < Math.abs(rotationAntiClockwise)) {\n return rotationClockwise;\n }\n else {\n return rotationAntiClockwise;\n }\n case _rotation_type__WEBPACK_IMPORTED_MODULE_1__.RotationType.LongestPath:\n if (Math.abs(rotationClockwise) > Math.abs(rotationAntiClockwise)) {\n return rotationClockwise;\n }\n else {\n return rotationAntiClockwise;\n }\n case _rotation_type__WEBPACK_IMPORTED_MODULE_1__.RotationType.Clockwise:\n return rotationClockwise;\n case _rotation_type__WEBPACK_IMPORTED_MODULE_1__.RotationType.CounterClockwise:\n return rotationAntiClockwise;\n }\n }\n /**\n * Rotates the current vector around a point by a certain angle in radians.\n * Positive angle means rotation clockwise.\n */\n rotate(angle, anchor, dest) {\n const result = dest || new Vector(0, 0);\n if (!anchor) {\n anchor = new Vector(0, 0);\n }\n const sinAngle = Math.sin(angle);\n const cosAngle = Math.cos(angle);\n const x = cosAngle * (this.x - anchor.x) - sinAngle * (this.y - anchor.y) + anchor.x;\n const y = sinAngle * (this.x - anchor.x) + cosAngle * (this.y - anchor.y) + anchor.y;\n result.x = x;\n result.y = y;\n return result;\n }\n /**\n * Creates new vector that has the same values as the previous.\n */\n clone(dest) {\n const v = dest !== null && dest !== void 0 ? dest : new Vector(0, 0);\n v.x = this.x;\n v.y = this.y;\n return v;\n }\n /**\n * Returns a string representation of the vector.\n */\n toString(fixed) {\n if (fixed) {\n return `(${this.x.toFixed(fixed)}, ${this.y.toFixed(fixed)})`;\n }\n return `(${this.x}, ${this.y})`;\n }\n}\n/**\n * Get or set the vector equals epsilon, by default 0.001 meaning vectors within that tolerance on x or y will be considered equal.\n */\nVector.EQUALS_EPSILON = 0.001;\n/**\n * Shorthand for creating new Vectors - returns a new Vector instance with the\n * provided X and Y components.\n * @param x X component of the Vector\n * @param y Y component of the Vector\n */\nfunction vec(x, y) {\n return new Vector(x, y);\n}\n\n\n/***/ }),\n\n/***/ \"./Math/watch-vector.ts\":\n/*!******************************!*\\\n !*** ./Math/watch-vector.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ WatchVector: () => (/* binding */ WatchVector)\n/* harmony export */ });\n/* harmony import */ var _vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vector */ \"./Math/vector.ts\");\n\n/**\n * Wraps a vector and watches for changes in the x/y, modifies the original vector.\n */\nclass WatchVector extends _vector__WEBPACK_IMPORTED_MODULE_0__.Vector {\n constructor(original, change) {\n super(original.x, original.y);\n this.original = original;\n this.change = change;\n }\n get x() {\n return (this._x = this.original.x);\n }\n set x(newX) {\n if (newX !== this._x) {\n this.change(newX, this._y);\n this._x = this.original.x = newX;\n }\n }\n get y() {\n return (this._y = this.original.y);\n }\n set y(newY) {\n if (newY !== this._y) {\n this.change(this._x, newY);\n this._y = this.original.y = newY;\n }\n }\n setTo(x, y) {\n this.x = x;\n this.y = y;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Particles/EmitterType.ts\":\n/*!**********************************!*\\\n !*** ./Particles/EmitterType.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EmitterType: () => (/* binding */ EmitterType)\n/* harmony export */ });\n/**\n * An enum that represents the types of emitter nozzles\n */\nvar EmitterType;\n(function (EmitterType) {\n /**\n * Constant for the circular emitter type\n */\n EmitterType[\"Circle\"] = \"circle\";\n /**\n * Constant for the rectangular emitter type\n */\n EmitterType[\"Rectangle\"] = \"rectangle\";\n})(EmitterType || (EmitterType = {}));\n\n\n/***/ }),\n\n/***/ \"./Particles/GpuParticleEmitter.ts\":\n/*!*****************************************!*\\\n !*** ./Particles/GpuParticleEmitter.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ GpuParticleEmitter: () => (/* binding */ GpuParticleEmitter)\n/* harmony export */ });\n/* harmony import */ var _Actor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Actor */ \"./Actor.ts\");\n/* harmony import */ var _EmitterType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./EmitterType */ \"./Particles/EmitterType.ts\");\n/* harmony import */ var _Particles__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Particles */ \"./Particles/Particles.ts\");\n/* harmony import */ var _GpuParticleRenderer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./GpuParticleRenderer */ \"./Particles/GpuParticleRenderer.ts\");\n/* harmony import */ var _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Graphics/GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Math_Random__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Math/Random */ \"./Math/Random.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Math */ \"./Math/util.ts\");\n\n\n\n\n\n\n\n\nclass GpuParticleEmitter extends _Actor__WEBPACK_IMPORTED_MODULE_0__.Actor {\n get pos() {\n return this.transform.pos;\n }\n set pos(pos) {\n this.transform.pos = pos;\n }\n get z() {\n return this.transform.z;\n }\n set z(z) {\n this.transform.z = z;\n }\n constructor(config) {\n super({ name: `GpuParticleEmitter`, width: config.width, height: config.height }); // somewhat goofy way of doing width/height\n this.particle = {\n /**\n * Gets or sets the life of each particle in milliseconds\n */\n life: 2000,\n transform: _Particles__WEBPACK_IMPORTED_MODULE_1__.ParticleTransform.Global,\n graphic: undefined,\n opacity: 1,\n angularVelocity: 0,\n focus: undefined,\n focusAccel: undefined,\n randomRotation: false\n };\n this.graphics = new _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_2__.GraphicsComponent();\n this.isEmitting = false;\n this.emitRate = 1;\n this.emitterType = _EmitterType__WEBPACK_IMPORTED_MODULE_3__.EmitterType.Rectangle;\n this.radius = 0;\n this.maxParticles = 2000;\n this._particlesToEmit = 0;\n this.addComponent(this.graphics, true);\n this.graphics.onPostDraw = this.draw.bind(this);\n const { particle, maxParticles, x, y, z, pos, isEmitting, emitRate, emitterType, radius, random } = { ...config };\n this.maxParticles = (0,_Math__WEBPACK_IMPORTED_MODULE_4__.clamp)(maxParticles !== null && maxParticles !== void 0 ? maxParticles : this.maxParticles, 0, _GpuParticleRenderer__WEBPACK_IMPORTED_MODULE_5__.GpuParticleRenderer.GPU_MAX_PARTICLES);\n this.pos = pos !== null && pos !== void 0 ? pos : (0,_Math_vector__WEBPACK_IMPORTED_MODULE_6__.vec)(x !== null && x !== void 0 ? x : 0, y !== null && y !== void 0 ? y : 0);\n this.z = z !== null && z !== void 0 ? z : 0;\n this.isEmitting = isEmitting !== null && isEmitting !== void 0 ? isEmitting : this.isEmitting;\n this.emitRate = emitRate !== null && emitRate !== void 0 ? emitRate : this.emitRate;\n this.emitterType = emitterType !== null && emitterType !== void 0 ? emitterType : this.emitterType;\n this.radius = radius !== null && radius !== void 0 ? radius : this.radius;\n this.particle = { ...this.particle, ...particle };\n this.random = random !== null && random !== void 0 ? random : new _Math_Random__WEBPACK_IMPORTED_MODULE_7__.Random();\n this.renderer = new _GpuParticleRenderer__WEBPACK_IMPORTED_MODULE_5__.GpuParticleRenderer(this, this.random, this.particle);\n }\n _initialize(engine) {\n super._initialize(engine);\n const context = engine.graphicsContext;\n this.renderer.initialize(context.__gl, context);\n }\n update(engine, elapsed) {\n super.update(engine, elapsed);\n if (this.isEmitting) {\n this._particlesToEmit += this.emitRate * (elapsed / 1000);\n if (this._particlesToEmit > 1.0) {\n this.emitParticles(Math.floor(this._particlesToEmit));\n this._particlesToEmit = this._particlesToEmit - Math.floor(this._particlesToEmit);\n }\n }\n this.renderer.update(elapsed);\n }\n emitParticles(particleCount) {\n if (particleCount <= 0) {\n return;\n }\n this.renderer.emitParticles(particleCount | 0); // coerce to integer\n }\n clearParticles() {\n this.renderer.clearParticles();\n }\n draw(ctx, elapsed) {\n ctx.draw('ex.particle', this.renderer, elapsed);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Particles/GpuParticleRenderer.ts\":\n/*!******************************************!*\\\n !*** ./Particles/GpuParticleRenderer.ts ***!\n \\******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ GpuParticleRenderer: () => (/* binding */ GpuParticleRenderer)\n/* harmony export */ });\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Particles__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Particles */ \"./Particles/Particles.ts\");\n/* harmony import */ var _EmitterType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./EmitterType */ \"./Particles/EmitterType.ts\");\n/* harmony import */ var _Util_Assert__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Util/Assert */ \"./Util/Assert.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n\n\n\n\n\n/**\n * Container for the GPU Particle State contains the internal state needed for the GPU\n * to render particles and maintain state.\n */\nclass GpuParticleRenderer {\n constructor(emitter, random, options) {\n var _a;\n this.emitRate = 1;\n this._initialized = false;\n this._vaos = [];\n this._buffers = [];\n this._drawIndex = 0;\n this._numInputFloats = 2 + 2 + 1 + 1 + 1;\n this._particleIndex = 0;\n this._uploadIndex = 0;\n this._wrappedLife = 0;\n this._wrappedParticles = 0;\n this._particleLife = 0;\n this._clearRequested = false;\n this._emitted = [];\n this.emitter = emitter;\n this.particle = options;\n this._particleData = new Float32Array(this.emitter.maxParticles * this._numInputFloats);\n this._random = random;\n this._particleLife = (_a = this.particle.life) !== null && _a !== void 0 ? _a : 2000;\n }\n get isInitialized() {\n return this._initialized;\n }\n get maxParticles() {\n return this.emitter.maxParticles;\n }\n initialize(gl, context) {\n if (this._initialized) {\n return;\n }\n const numParticles = this.emitter.maxParticles;\n const numInputFloats = this._numInputFloats;\n const particleData = this._particleData;\n const bytesPerFloat = 4;\n const particleDataBuffer1 = gl.createBuffer();\n const vao1 = gl.createVertexArray();\n gl.bindVertexArray(vao1);\n gl.bindBuffer(gl.ARRAY_BUFFER, particleDataBuffer1);\n gl.bufferData(gl.ARRAY_BUFFER, numParticles * numInputFloats * bytesPerFloat, gl.DYNAMIC_DRAW);\n gl.bufferSubData(gl.ARRAY_BUFFER, 0, particleData);\n let offset = 0;\n // position\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, numInputFloats * bytesPerFloat, 0);\n offset += bytesPerFloat * 2;\n // velocity\n gl.vertexAttribPointer(1, 2, gl.FLOAT, false, numInputFloats * bytesPerFloat, offset);\n offset += bytesPerFloat * 2;\n // rotation\n gl.vertexAttribPointer(2, 1, gl.FLOAT, false, numInputFloats * bytesPerFloat, offset);\n offset += bytesPerFloat * 1;\n // angularVelocity\n gl.vertexAttribPointer(3, 1, gl.FLOAT, false, numInputFloats * bytesPerFloat, offset);\n offset += bytesPerFloat * 1;\n // life\n gl.vertexAttribPointer(4, 1, gl.FLOAT, false, numInputFloats * bytesPerFloat, offset);\n offset += bytesPerFloat * 1;\n // enable attributes\n gl.enableVertexAttribArray(0);\n gl.enableVertexAttribArray(1);\n gl.enableVertexAttribArray(2);\n gl.enableVertexAttribArray(3);\n gl.enableVertexAttribArray(4);\n this._vaos.push(vao1);\n this._buffers.push(particleDataBuffer1);\n // Clean up\n gl.bindVertexArray(null);\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n const particleDataBuffer2 = gl.createBuffer();\n const vao2 = gl.createVertexArray();\n gl.bindVertexArray(vao2);\n gl.bindBuffer(gl.ARRAY_BUFFER, particleDataBuffer2);\n gl.bufferData(gl.ARRAY_BUFFER, numParticles * numInputFloats * bytesPerFloat, gl.DYNAMIC_DRAW);\n offset = 0;\n // position\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, numInputFloats * bytesPerFloat, 0);\n offset += bytesPerFloat * 2;\n // velocity\n gl.vertexAttribPointer(1, 2, gl.FLOAT, false, numInputFloats * bytesPerFloat, offset);\n offset += bytesPerFloat * 2;\n // rotation\n gl.vertexAttribPointer(2, 1, gl.FLOAT, false, numInputFloats * bytesPerFloat, offset);\n offset += bytesPerFloat * 1;\n // angularVelocity\n gl.vertexAttribPointer(3, 1, gl.FLOAT, false, numInputFloats * bytesPerFloat, offset);\n offset += bytesPerFloat * 1;\n // life\n gl.vertexAttribPointer(4, 1, gl.FLOAT, false, numInputFloats * bytesPerFloat, offset);\n offset += bytesPerFloat * 1;\n // enable attributes\n gl.enableVertexAttribArray(0);\n gl.enableVertexAttribArray(1);\n gl.enableVertexAttribArray(2);\n gl.enableVertexAttribArray(3);\n gl.enableVertexAttribArray(4);\n this._vaos.push(vao2);\n this._buffers.push(particleDataBuffer2);\n // Clean up\n gl.bindVertexArray(null);\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n this._currentVao = this._vaos[this._drawIndex % 2];\n this._currentBuffer = this._buffers[(this._drawIndex + 1) % 2];\n this._initialized = true;\n }\n clearParticles() {\n this._particleData.fill(0);\n this._clearRequested = true;\n }\n emitParticles(particleCount) {\n const startIndex = this._particleIndex;\n const maxSize = this.maxParticles * this._numInputFloats;\n const endIndex = particleCount * this._numInputFloats + startIndex;\n let countParticle = 0;\n for (let i = startIndex; i < endIndex; i += this._numInputFloats) {\n const angle = this._random.floating(this.particle.minAngle || 0, this.particle.maxAngle || _Math_util__WEBPACK_IMPORTED_MODULE_0__.TwoPI);\n const speedX = this._random.floating(this.particle.minSpeed || 0, this.particle.maxSpeed || 0);\n const speedY = this._random.floating(this.particle.minSpeed || 0, this.particle.maxSpeed || 0);\n const dx = speedX * Math.cos(angle);\n const dy = speedY * Math.sin(angle);\n let ranX = 0;\n let ranY = 0;\n if (this.emitter.emitterType === _EmitterType__WEBPACK_IMPORTED_MODULE_1__.EmitterType.Rectangle) {\n ranX = this._random.floating(-0.5, 0.5) * this.emitter.width;\n ranY = this._random.floating(-0.5, 0.5) * this.emitter.height;\n }\n else {\n const radius = this._random.floating(0, this.emitter.radius);\n ranX = radius * Math.cos(angle);\n ranY = radius * Math.sin(angle);\n }\n const tx = this.emitter.transform.apply((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(ranX, ranY));\n const data = [\n this.particle.transform === _Particles__WEBPACK_IMPORTED_MODULE_3__.ParticleTransform.Local ? ranX : tx.x,\n this.particle.transform === _Particles__WEBPACK_IMPORTED_MODULE_3__.ParticleTransform.Local ? ranY : tx.y, // pos in world space\n dx,\n dy, // velocity\n this.particle.randomRotation ? (0,_Math_util__WEBPACK_IMPORTED_MODULE_0__.randomInRange)(0, _Math_util__WEBPACK_IMPORTED_MODULE_0__.TwoPI, this._random) : this.particle.rotation || 0, // rotation\n this.particle.angularVelocity || 0, // angular velocity\n this._particleLife // life\n ];\n countParticle++;\n this._particleData.set(data, i % this._particleData.length);\n }\n if (endIndex >= maxSize) {\n this._wrappedParticles += (endIndex - maxSize) / this._numInputFloats;\n this._wrappedLife = this._particleLife;\n }\n else if (this._wrappedLife > 0) {\n this._wrappedParticles += particleCount;\n }\n this._particleIndex = endIndex % maxSize;\n this._emitted.push([this._particleLife, startIndex]);\n }\n _uploadEmitted(gl) {\n // upload index is the index of the previous upload\n // particle index is the current index of modification\n if (this._particleIndex !== this._uploadIndex) {\n // Bind one buffer to ARRAY_BUFFER and the other to TFB\n gl.bindBuffer(gl.ARRAY_BUFFER, this._buffers[(this._drawIndex + 1) % 2]);\n if (this._particleIndex >= this._uploadIndex) {\n gl.bufferSubData(gl.ARRAY_BUFFER, this._uploadIndex * 4, // dst byte offset 4 bytes per float\n this._particleData, this._uploadIndex, this._particleIndex - this._uploadIndex);\n }\n else {\n // upload before the wrap\n // prettier-ignore\n gl.bufferSubData(gl.ARRAY_BUFFER, this._uploadIndex * 4, this._particleData, this._uploadIndex, this._particleData.length - this._uploadIndex);\n // upload after the wrap if there are any\n if (this._wrappedParticles) {\n // prettier-ignore\n gl.bufferSubData(gl.ARRAY_BUFFER, 0, this._particleData, 0, this._wrappedParticles * this._numInputFloats);\n }\n this._wrappedLife = this._particleLife;\n }\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n }\n this._uploadIndex = this._particleIndex % (this.maxParticles * this._numInputFloats);\n }\n update(elapsed) {\n var _a;\n this._particleLife = (_a = this.particle.life) !== null && _a !== void 0 ? _a : this._particleLife;\n if (this._wrappedLife > 0) {\n this._wrappedLife -= elapsed;\n }\n else {\n this._wrappedLife = 0;\n this._wrappedParticles = 0;\n }\n if (!this._emitted.length) {\n return;\n }\n for (let i = this._emitted.length - 1; i >= 0; i--) {\n const particle = this._emitted[i];\n particle[0] -= elapsed;\n const life = particle[0];\n if (life <= 0) {\n this._emitted.splice(i, 1);\n }\n }\n this._emitted.sort((a, b) => a[0] - b[0]);\n }\n draw(gl) {\n if (this._initialized) {\n // Emit\n if (this._clearRequested) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this._buffers[(this._drawIndex + 1) % 2]);\n gl.bufferSubData(gl.ARRAY_BUFFER, 0, this._particleData);\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n this._clearRequested = false;\n }\n else {\n this._uploadEmitted(gl);\n }\n // Bind one buffer to ARRAY_BUFFER and the other to transform feedback buffer\n gl.bindVertexArray(this._currentVao);\n gl.bindBufferBase(gl.TRANSFORM_FEEDBACK_BUFFER, 0, this._currentBuffer);\n // Perform transform feedback (run the simulation) and the draw call all at once\n if (this._wrappedLife && this._emitted[0] && this._emitted[0][1] > 0) {\n const midpoint = this._emitted[0][1] / this._numInputFloats;\n // draw oldest first (maybe make configurable)\n (0,_Util_Assert__WEBPACK_IMPORTED_MODULE_4__.assert)(`midpoint greater than 0, actual: ${midpoint}`, () => midpoint > 0);\n (0,_Util_Assert__WEBPACK_IMPORTED_MODULE_4__.assert)(`midpoint is less than max, actual: ${midpoint}`, () => midpoint < this.maxParticles);\n gl.bindBufferRange(gl.TRANSFORM_FEEDBACK_BUFFER, 0, this._currentBuffer, this._emitted[0][1] * 4, (this.maxParticles - midpoint) * this._numInputFloats * 4);\n gl.beginTransformFeedback(gl.POINTS);\n gl.drawArrays(gl.POINTS, midpoint, this.maxParticles - midpoint);\n gl.endTransformFeedback();\n // then draw newer particles\n gl.bindBufferRange(gl.TRANSFORM_FEEDBACK_BUFFER, 0, this._currentBuffer, 0, this._emitted[0][1] * 4);\n gl.beginTransformFeedback(gl.POINTS);\n gl.drawArrays(gl.POINTS, 0, midpoint);\n gl.endTransformFeedback();\n }\n else {\n gl.bindBufferRange(gl.TRANSFORM_FEEDBACK_BUFFER, 0, this._currentBuffer, 0, this._particleData.length * 4);\n gl.beginTransformFeedback(gl.POINTS);\n gl.drawArrays(gl.POINTS, 0, this.maxParticles);\n gl.endTransformFeedback();\n }\n // Clean up after ourselves to avoid errors.\n gl.bindVertexArray(null);\n gl.bindBufferBase(gl.TRANSFORM_FEEDBACK_BUFFER, 0, null);\n // flip flop buffers, one will be draw the other simulation\n this._currentVao = this._vaos[this._drawIndex % 2];\n this._currentBuffer = this._buffers[(this._drawIndex + 1) % 2];\n this._drawIndex = (this._drawIndex + 1) % 2;\n }\n }\n}\nGpuParticleRenderer.GPU_MAX_PARTICLES = 100000;\n\n\n/***/ }),\n\n/***/ \"./Particles/ParticleEmitter.ts\":\n/*!**************************************!*\\\n !*** ./Particles/ParticleEmitter.ts ***!\n \\**************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ParticleEmitter: () => (/* binding */ ParticleEmitter)\n/* harmony export */ });\n/* harmony import */ var _Actor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Actor */ \"./Actor.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math_Random__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Math/Random */ \"./Math/Random.ts\");\n/* harmony import */ var _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Collision/CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _EmitterType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./EmitterType */ \"./Particles/EmitterType.ts\");\n/* harmony import */ var _Particles__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Particles */ \"./Particles/Particles.ts\");\n/* harmony import */ var _Util_RentalPool__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/RentalPool */ \"./Util/RentalPool.ts\");\n\n\n\n\n\n\n\n\n/**\n * Using a particle emitter is a great way to create interesting effects\n * in your game, like smoke, fire, water, explosions, etc. `ParticleEmitter`\n * extend {@apilink Actor} allowing you to use all of the features that come with.\n *\n * These particles are simulated on the CPU in JavaScript\n */\nclass ParticleEmitter extends _Actor__WEBPACK_IMPORTED_MODULE_0__.Actor {\n /**\n * @param config particle emitter options bag\n */\n constructor(config) {\n var _a, _b;\n super({ width: (_a = config.width) !== null && _a !== void 0 ? _a : 0, height: (_b = config.height) !== null && _b !== void 0 ? _b : 0 });\n this._particlesToEmit = 0;\n this._particlePool = new _Util_RentalPool__WEBPACK_IMPORTED_MODULE_1__.RentalPool(() => new _Particles__WEBPACK_IMPORTED_MODULE_2__.Particle({}), (p) => p, 500);\n this.numParticles = 0;\n /**\n * Gets or sets the isEmitting flag\n */\n this.isEmitting = true;\n /**\n * Gets or sets the backing deadParticle collection\n */\n this.deadParticles = [];\n /**\n * Gets or sets the emission rate for particles (particles/sec)\n */\n this.emitRate = 1; //particles/sec\n /**\n * Gets or sets the emitter type for the particle emitter\n */\n this.emitterType = _EmitterType__WEBPACK_IMPORTED_MODULE_3__.EmitterType.Rectangle;\n /**\n * Gets or sets the emitter radius, only takes effect when the {@apilink emitterType} is {@apilink EmitterType.Circle}\n */\n this.radius = 0;\n this.particle = {\n /**\n * Gets or sets the life of each particle in milliseconds\n */\n life: 2000,\n transform: _Particles__WEBPACK_IMPORTED_MODULE_2__.ParticleTransform.Global,\n graphic: undefined,\n opacity: 1,\n angularVelocity: 0,\n focus: undefined,\n focusAccel: undefined,\n randomRotation: false\n };\n this._activeParticles = [];\n const { particle, x, y, z, pos, isEmitting, emitRate, emitterType, radius, random } = { ...config };\n this.particle = { ...this.particle, ...particle };\n this.pos = pos !== null && pos !== void 0 ? pos : (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(x !== null && x !== void 0 ? x : 0, y !== null && y !== void 0 ? y : 0);\n this.z = z !== null && z !== void 0 ? z : 0;\n this.isEmitting = isEmitting !== null && isEmitting !== void 0 ? isEmitting : this.isEmitting;\n this.emitRate = emitRate !== null && emitRate !== void 0 ? emitRate : this.emitRate;\n this.emitterType = emitterType !== null && emitterType !== void 0 ? emitterType : this.emitterType;\n this.radius = radius !== null && radius !== void 0 ? radius : this.radius;\n this.body.collisionType = _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_5__.CollisionType.PreventCollision;\n this.random = random !== null && random !== void 0 ? random : new _Math_Random__WEBPACK_IMPORTED_MODULE_6__.Random();\n }\n removeParticle(particle) {\n this.deadParticles.push(particle);\n }\n /**\n * Causes the emitter to emit particles\n * @param particleCount Number of particles to emit right now\n */\n emitParticles(particleCount) {\n var _a;\n if (particleCount <= 0) {\n return;\n }\n particleCount = particleCount | 0; // coerce to int\n for (let i = 0; i < particleCount; i++) {\n const p = this._createParticle();\n if ((_a = this === null || this === void 0 ? void 0 : this.scene) === null || _a === void 0 ? void 0 : _a.world) {\n if (this.particle.transform === _Particles__WEBPACK_IMPORTED_MODULE_2__.ParticleTransform.Global) {\n this.scene.world.add(p);\n }\n else {\n this.addChild(p);\n }\n }\n this._activeParticles.push(p);\n }\n }\n clearParticles() {\n for (let i = 0; i < this._activeParticles.length; i++) {\n this.removeParticle(this._activeParticles[i]);\n }\n }\n // Creates a new particle given the constraints of the emitter\n _createParticle() {\n let ranX = 0;\n let ranY = 0;\n const angle = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.randomInRange)(this.particle.minAngle || 0, this.particle.maxAngle || Math.PI * 2, this.random);\n const vel = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.randomInRange)(this.particle.minSpeed || 0, this.particle.maxSpeed || 0, this.random);\n const size = this.particle.startSize || (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.randomInRange)(this.particle.minSize || 5, this.particle.maxSize || 5, this.random);\n const dx = vel * Math.cos(angle);\n const dy = vel * Math.sin(angle);\n if (this.emitterType === _EmitterType__WEBPACK_IMPORTED_MODULE_3__.EmitterType.Rectangle) {\n ranX = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.randomInRange)(0, this.width, this.random);\n ranY = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.randomInRange)(0, this.height, this.random);\n }\n else if (this.emitterType === _EmitterType__WEBPACK_IMPORTED_MODULE_3__.EmitterType.Circle) {\n const radius = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.randomInRange)(0, this.radius, this.random);\n ranX = radius * Math.cos(angle);\n ranY = radius * Math.sin(angle);\n }\n const p = this._particlePool.rent();\n p.configure({\n life: this.particle.life,\n opacity: this.particle.opacity,\n beginColor: this.particle.beginColor,\n endColor: this.particle.endColor,\n pos: (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(ranX, ranY),\n vel: (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(dx, dy),\n acc: this.particle.acc,\n angularVelocity: this.particle.angularVelocity,\n startSize: this.particle.startSize,\n endSize: this.particle.endSize,\n size: size,\n graphic: this.particle.graphic,\n fade: this.particle.fade\n });\n p.registerEmitter(this);\n if (this.particle.randomRotation) {\n p.transform.rotation = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.randomInRange)(0, Math.PI * 2, this.random);\n }\n if (this.particle.focus) {\n p.focus = this.particle.focus.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(this.pos.x, this.pos.y));\n p.focusAccel = this.particle.focusAccel;\n }\n return p;\n }\n update(engine, elapsed) {\n var _a;\n super.update(engine, elapsed);\n if (this.isEmitting) {\n this._particlesToEmit += this.emitRate * (elapsed / 1000);\n if (this._particlesToEmit > 1.0) {\n this.emitParticles(Math.floor(this._particlesToEmit));\n this._particlesToEmit = this._particlesToEmit - Math.floor(this._particlesToEmit);\n }\n }\n // deferred removal\n for (let i = 0; i < this.deadParticles.length; i++) {\n if ((_a = this === null || this === void 0 ? void 0 : this.scene) === null || _a === void 0 ? void 0 : _a.world) {\n this.scene.world.remove(this.deadParticles[i], false);\n this._particlePool.return(this.deadParticles[i]);\n }\n const index = this._activeParticles.indexOf(this.deadParticles[i]);\n if (index > -1) {\n this._activeParticles.splice(index, 1);\n }\n }\n this.deadParticles.length = 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Particles/Particles.ts\":\n/*!********************************!*\\\n !*** ./Particles/Particles.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Particle: () => (/* binding */ Particle),\n/* harmony export */ ParticleTransform: () => (/* binding */ ParticleTransform)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Graphics/GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _Collision_Integrator__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Collision/Integrator */ \"./Collision/Integrator.ts\");\n\n\n\n\n\n\n\n\n\n/**\n/**\n * CPU Particle is used in a {@apilink ParticleEmitter}\n */\nclass Particle extends _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__.Entity {\n constructor(options) {\n super({ silenceWarnings: true });\n this.beginColor = _Color__WEBPACK_IMPORTED_MODULE_1__.Color.White;\n this.endColor = _Color__WEBPACK_IMPORTED_MODULE_1__.Color.White;\n // Life is counted in ms\n this.life = 300;\n this.fade = false;\n // Color transitions\n this._rRate = 1;\n this._gRate = 1;\n this._bRate = 1;\n this._aRate = 0;\n this._currentColor = _Color__WEBPACK_IMPORTED_MODULE_1__.Color.White;\n this.size = 5;\n this.sizeRate = 0;\n this.visible = true;\n this.isOffscreen = false;\n this.particleTransform = ParticleTransform.Global;\n this.name = `Particle#${this.id}`;\n this.addComponent((this.transform = new _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent()));\n this.addComponent((this.motion = new _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_3__.MotionComponent()));\n this.addComponent((this.graphics = new _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_4__.GraphicsComponent()));\n this.configure(options);\n }\n registerEmitter(emitter) {\n this._emitter = emitter;\n if (this.particleTransform === ParticleTransform.Global) {\n const globalPos = this._emitter.transform.globalPos;\n this.transform.pos = this.transform.pos.add(globalPos);\n this.motion.vel = this.motion.vel.rotate(this._emitter.transform.globalRotation);\n }\n }\n configure(options) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;\n this.particleTransform = (_a = options.transform) !== null && _a !== void 0 ? _a : this.particleTransform;\n this.life = (_b = options.life) !== null && _b !== void 0 ? _b : this.life;\n this.fade = (_c = options.fade) !== null && _c !== void 0 ? _c : this.fade;\n this.size = (_d = options.size) !== null && _d !== void 0 ? _d : this.size;\n this.endColor = (_e = options.endColor) !== null && _e !== void 0 ? _e : this.endColor.clone();\n this.beginColor = (_f = options.beginColor) !== null && _f !== void 0 ? _f : this.beginColor.clone();\n this._currentColor = this.beginColor.clone();\n this.graphic = options.graphic;\n this.graphics.opacity = (_g = options.opacity) !== null && _g !== void 0 ? _g : this.graphics.opacity;\n this.transform.pos = (_h = options.pos) !== null && _h !== void 0 ? _h : this.transform.pos;\n this.transform.rotation = (_j = options.rotation) !== null && _j !== void 0 ? _j : 0;\n this.transform.scale = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_5__.vec)(1, 1);\n this.motion.vel = (_k = options.vel) !== null && _k !== void 0 ? _k : this.motion.vel;\n this.motion.angularVelocity = (_l = options.angularVelocity) !== null && _l !== void 0 ? _l : 0;\n this.motion.acc = (_m = options.acc) !== null && _m !== void 0 ? _m : this.motion.acc;\n this._rRate = (this.endColor.r - this.beginColor.r) / this.life;\n this._gRate = (this.endColor.g - this.beginColor.g) / this.life;\n this._bRate = (this.endColor.b - this.beginColor.b) / this.life;\n this._aRate = this.graphics.opacity / this.life;\n this.startSize = (_o = options.startSize) !== null && _o !== void 0 ? _o : 0;\n this.endSize = (_p = options.endSize) !== null && _p !== void 0 ? _p : 0;\n if (this.endSize > 0 && this.startSize > 0) {\n this.sizeRate = (this.endSize - this.startSize) / this.life;\n this.size = this.startSize;\n }\n if (this.graphic) {\n this.graphics.use(this.graphic);\n this.graphics.onPostDraw = undefined;\n }\n else {\n this.graphics.localBounds = _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox.fromDimension(this.size, this.size, _Math_vector__WEBPACK_IMPORTED_MODULE_5__.Vector.Half);\n this.graphics.onPostDraw = (ctx) => {\n ctx.save();\n ctx.debug.drawPoint((0,_Math_vector__WEBPACK_IMPORTED_MODULE_5__.vec)(0, 0), { color: this._currentColor, size: this.size });\n ctx.restore();\n };\n }\n }\n kill() {\n var _a;\n if ((_a = this._emitter) === null || _a === void 0 ? void 0 : _a.isActive) {\n this._emitter.removeParticle(this);\n }\n else {\n super.kill();\n }\n }\n update(engine, elapsed) {\n this.life = this.life - elapsed;\n if (this.life < 0) {\n this.kill();\n }\n if (this.fade) {\n this.graphics.opacity = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.clamp)(this._aRate * this.life, 0.0001, 1);\n }\n if (this.startSize && this.endSize && this.startSize > 0 && this.endSize > 0) {\n this.size = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.clamp)(this.sizeRate * elapsed + this.size, Math.min(this.startSize, this.endSize), Math.max(this.startSize, this.endSize));\n }\n this._currentColor.r = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.clamp)(this._currentColor.r + this._rRate * elapsed, 0, 255);\n this._currentColor.g = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.clamp)(this._currentColor.g + this._gRate * elapsed, 0, 255);\n this._currentColor.b = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.clamp)(this._currentColor.b + this._bRate * elapsed, 0, 255);\n this._currentColor.a = this.graphics.opacity;\n let accel = this.motion.acc;\n if (this.focus) {\n accel = this.focus\n .sub(this.transform.pos)\n .normalize()\n .scale(this.focusAccel || 0)\n .scale(elapsed / 1000);\n }\n // Update transform and motion based on Euler linear algebra\n _Collision_Integrator__WEBPACK_IMPORTED_MODULE_8__.EulerIntegrator.integrate(this.transform, this.motion, accel, elapsed);\n }\n}\nParticle.DefaultConfig = {\n beginColor: _Color__WEBPACK_IMPORTED_MODULE_1__.Color.White,\n endColor: _Color__WEBPACK_IMPORTED_MODULE_1__.Color.White,\n life: 300,\n fade: false,\n size: 5,\n graphic: undefined,\n startSize: undefined,\n endSize: undefined\n};\nvar ParticleTransform;\n(function (ParticleTransform) {\n /**\n * {@apilink ParticleTransform.Global} is the default and emits particles as if\n * they were world space objects, useful for most effects.\n */\n ParticleTransform[\"Global\"] = \"global\";\n /**\n * {@apilink ParticleTransform.Local} particles are children of the emitter and move relative to the emitter\n * as they would in a parent/child actor relationship.\n */\n ParticleTransform[\"Local\"] = \"local\";\n})(ParticleTransform || (ParticleTransform = {}));\n\n\n/***/ }),\n\n/***/ \"./Particles/index.ts\":\n/*!****************************!*\\\n !*** ./Particles/index.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EmitterType: () => (/* reexport safe */ _EmitterType__WEBPACK_IMPORTED_MODULE_0__.EmitterType),\n/* harmony export */ GpuParticleEmitter: () => (/* reexport safe */ _GpuParticleEmitter__WEBPACK_IMPORTED_MODULE_3__.GpuParticleEmitter),\n/* harmony export */ GpuParticleRenderer: () => (/* reexport safe */ _GpuParticleRenderer__WEBPACK_IMPORTED_MODULE_4__.GpuParticleRenderer),\n/* harmony export */ Particle: () => (/* reexport safe */ _Particles__WEBPACK_IMPORTED_MODULE_1__.Particle),\n/* harmony export */ ParticleEmitter: () => (/* reexport safe */ _ParticleEmitter__WEBPACK_IMPORTED_MODULE_2__.ParticleEmitter),\n/* harmony export */ ParticleTransform: () => (/* reexport safe */ _Particles__WEBPACK_IMPORTED_MODULE_1__.ParticleTransform)\n/* harmony export */ });\n/* harmony import */ var _EmitterType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./EmitterType */ \"./Particles/EmitterType.ts\");\n/* harmony import */ var _Particles__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Particles */ \"./Particles/Particles.ts\");\n/* harmony import */ var _ParticleEmitter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ParticleEmitter */ \"./Particles/ParticleEmitter.ts\");\n/* harmony import */ var _GpuParticleEmitter__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./GpuParticleEmitter */ \"./Particles/GpuParticleEmitter.ts\");\n/* harmony import */ var _GpuParticleRenderer__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./GpuParticleRenderer */ \"./Particles/GpuParticleRenderer.ts\");\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Polyfill.ts\":\n/*!*********************!*\\\n !*** ./Polyfill.ts ***!\n \\*********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ polyfill: () => (/* binding */ polyfill)\n/* harmony export */ });\n/**\n * Polyfill adding function\n */\nfunction polyfill() {\n /* istanbul ignore next */\n if (typeof window === 'undefined') {\n window = {\n audioContext: function () {\n return;\n }\n };\n }\n /* istanbul ignore next */\n if (typeof window !== 'undefined' && !window.requestAnimationFrame) {\n window.requestAnimationFrame =\n window.webkitRequestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n function (callback) {\n window.setInterval(callback, 1000 / 60);\n };\n }\n /* istanbul ignore next */\n if (typeof window !== 'undefined' && !window.cancelAnimationFrame) {\n window.cancelAnimationFrame =\n window.webkitCancelAnimationFrame ||\n window.mozCancelAnimationFrame ||\n function () {\n return;\n };\n }\n /* istanbul ignore next */\n if (typeof window !== 'undefined' && !window.AudioContext) {\n if (window.webkitAudioContext) {\n const ctx = window.webkitAudioContext;\n const replaceMe = ctx.prototype.decodeAudioData;\n window.webkitAudioContext.prototype.decodeAudioData = function (arrayBuffer) {\n return new Promise((resolve, reject) => {\n replaceMe.call(this, arrayBuffer, resolve, reject);\n });\n };\n }\n window.AudioContext =\n window.AudioContext ||\n window.webkitAudioContext ||\n window.mozAudioContext ||\n window.msAudioContext ||\n window.oAudioContext;\n }\n /* istanbul ignore next */\n if (typeof window !== 'undefined' && !window.devicePixelRatio) {\n window.devicePixelRatio = window.devicePixelRatio || 1;\n }\n /* istanbul ignore next */\n if (typeof window !== 'undefined' && !window.requestIdleCallback) {\n // Adapted from https://developer.chrome.com/blog/using-requestidlecallback#checking_for_requestidlecallback\n window.requestIdleCallback =\n window.requestIdleCallback ||\n function (cb) {\n const start = Date.now();\n return setTimeout(function () {\n cb({\n didTimeout: false,\n timeRemaining: function () {\n return Math.max(0, 50 - (Date.now() - start));\n }\n });\n }, 1);\n };\n window.cancelIdleCallback =\n window.cancelIdleCallback ||\n function (id) {\n clearTimeout(id);\n };\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Resources/Font.ts\":\n/*!***************************!*\\\n !*** ./Resources/Font.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FontSource: () => (/* binding */ FontSource)\n/* harmony export */ });\n/* harmony import */ var _Graphics_Font__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Graphics/Font */ \"./Graphics/Font.ts\");\n/* harmony import */ var _Resource__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Resource */ \"./Resources/Resource.ts\");\n\n\nclass FontSource {\n constructor(\n /**\n * Path to the font resource relative from the HTML document hosting the game, or absolute\n */\n path, \n /**\n * The font family name\n */\n family, { bustCache, ...options } = {}) {\n this.path = path;\n this.family = family;\n this._isLoaded = false;\n this._resource = new _Resource__WEBPACK_IMPORTED_MODULE_0__.Resource(path, 'blob', bustCache);\n this._options = options;\n }\n async load() {\n if (this.isLoaded()) {\n return this.data;\n }\n try {\n const blob = await this._resource.load();\n const url = URL.createObjectURL(blob);\n if (!this.data) {\n this.data = new FontFace(this.family, `url(${url})`);\n document.fonts.add(this.data);\n }\n await this.data.load();\n this._isLoaded = true;\n }\n catch (error) {\n throw `Error loading FontSource from path '${this.path}' with error [${error.message}]`;\n }\n return this.data;\n }\n isLoaded() {\n return this._isLoaded;\n }\n /**\n * Build a font from this FontSource.\n * @param options {FontOptions} Override the font options\n */\n toFont(options) {\n return new _Graphics_Font__WEBPACK_IMPORTED_MODULE_1__.Font({ family: this.family, ...this._options, ...options });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Resources/Gif.ts\":\n/*!**************************!*\\\n !*** ./Resources/Gif.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Gif: () => (/* binding */ Gif),\n/* harmony export */ GifParser: () => (/* binding */ GifParser),\n/* harmony export */ Stream: () => (/* binding */ Stream)\n/* harmony export */ });\n/* harmony import */ var _Resource__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Resource */ \"./Resources/Resource.ts\");\n/* harmony import */ var _Graphics_SpriteSheet__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Graphics/SpriteSheet */ \"./Graphics/SpriteSheet.ts\");\n/* harmony import */ var _Graphics_Animation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Graphics/Animation */ \"./Graphics/Animation.ts\");\n/* harmony import */ var _Graphics_ImageSource__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Graphics/ImageSource */ \"./Graphics/ImageSource.ts\");\n\n\n\n\n/**\n * The {@apilink Texture} object allows games built in Excalibur to load image resources.\n * {@apilink Texture} is an {@apilink Loadable} which means it can be passed to a {@apilink Loader}\n * to pre-load before starting a level or game.\n */\nclass Gif {\n /**\n * @param path Path to the image resource\n * @param bustCache Optionally load texture with cache busting\n */\n constructor(path, bustCache = false) {\n this.path = path;\n /**\n * The width of the texture in pixels\n */\n this.width = 0;\n /**\n * The height of the texture in pixels\n */\n this.height = 0;\n this._images = [];\n this.data = [];\n this._sprites = [];\n this._resource = new _Resource__WEBPACK_IMPORTED_MODULE_0__.Resource(path, 'arraybuffer', bustCache);\n }\n /**\n * Should excalibur add a cache busting querystring? By default false.\n * Must be set before loading\n */\n get bustCache() {\n return this._resource.bustCache;\n }\n set bustCache(val) {\n this._resource.bustCache = val;\n }\n /**\n * Begins loading the texture and returns a promise to be resolved on completion\n */\n async load() {\n const arraybuffer = await this._resource.load();\n this._stream = new Stream(arraybuffer);\n this._gif = new GifParser(this._stream);\n const images = this._gif.images.map((i) => new _Graphics_ImageSource__WEBPACK_IMPORTED_MODULE_1__.ImageSource(i.src, false));\n // Load all textures\n await Promise.all(images.map((t) => t.load()));\n this.data = this._images = images;\n this._sprites = this._images.map((image) => {\n return image.toSprite();\n });\n return this.data;\n }\n isLoaded() {\n return !!this.data;\n }\n /**\n * Return a frame of the gif as a sprite by id\n * @param id\n */\n toSprite(id = 0) {\n var _a;\n return (_a = this._sprites[id]) !== null && _a !== void 0 ? _a : null;\n }\n /**\n * Return the gif as a spritesheet\n */\n toSpriteSheet() {\n const sprites = this._sprites;\n if (sprites.length) {\n return new _Graphics_SpriteSheet__WEBPACK_IMPORTED_MODULE_2__.SpriteSheet({ sprites });\n }\n return null;\n }\n /**\n * Transform the GIF into an animation with duration per frame\n * @param durationPerFrame Optionally override duration per frame\n */\n toAnimation(durationPerFrame) {\n var _a;\n const images = (_a = this._gif) === null || _a === void 0 ? void 0 : _a.images;\n if (images === null || images === void 0 ? void 0 : images.length) {\n const frames = images.map((image, index) => {\n var _a;\n return {\n graphic: this._sprites[index],\n duration: ((_a = this._gif) === null || _a === void 0 ? void 0 : _a.frames[index].delayMs) || undefined\n };\n });\n this._animation = new _Graphics_Animation__WEBPACK_IMPORTED_MODULE_3__.Animation({\n frames,\n frameDuration: durationPerFrame\n });\n return this._animation;\n }\n return null;\n }\n get readCheckBytes() {\n var _a, _b;\n return (_b = (_a = this._gif) === null || _a === void 0 ? void 0 : _a.checkBytes) !== null && _b !== void 0 ? _b : [];\n }\n}\nconst bitsToNum = (ba) => {\n return ba.reduce(function (s, n) {\n return s * 2 + n;\n }, 0);\n};\nconst byteToBitArr = (bite) => {\n const a = [];\n for (let i = 7; i >= 0; i--) {\n a.push(!!(bite & (1 << i)));\n }\n return a;\n};\nclass Stream {\n constructor(dataArray) {\n this.len = 0;\n this.position = 0;\n this.readByte = () => {\n if (this.position >= this.data.byteLength) {\n throw new Error('Attempted to read past end of stream.');\n }\n return this.data[this.position++];\n };\n this.readBytes = (n) => {\n const bytes = [];\n for (let i = 0; i < n; i++) {\n bytes.push(this.readByte());\n }\n return bytes;\n };\n this.read = (n) => {\n let s = '';\n for (let i = 0; i < n; i++) {\n s += String.fromCharCode(this.readByte());\n }\n return s;\n };\n this.readUnsigned = () => {\n // Little-endian.\n const a = this.readBytes(2);\n return (a[1] << 8) + a[0];\n };\n this.data = new Uint8Array(dataArray);\n this.len = this.data.byteLength;\n if (this.len === 0) {\n throw new Error('No data loaded from file');\n }\n }\n}\nconst lzwDecode = function (minCodeSize, data) {\n // TODO: Now that the GIF parser is a bit different, maybe this should get an array of bytes instead of a String?\n let pos = 0; // Maybe this streaming thing should be merged with the Stream?\n const readCode = function (size) {\n let code = 0;\n for (let i = 0; i < size; i++) {\n if (data.charCodeAt(pos >> 3) & (1 << (pos & 7))) {\n code |= 1 << i;\n }\n pos++;\n }\n return code;\n };\n const output = [];\n const clearCode = 1 << minCodeSize;\n const eoiCode = clearCode + 1;\n let codeSize = minCodeSize + 1;\n let dict = [];\n const clear = function () {\n dict = [];\n codeSize = minCodeSize + 1;\n for (let i = 0; i < clearCode; i++) {\n dict[i] = [i];\n }\n dict[clearCode] = [];\n dict[eoiCode] = null;\n };\n let code = 0;\n let last = 0;\n while (true) {\n last = code;\n code = readCode(codeSize);\n if (code === clearCode) {\n clear();\n continue;\n }\n if (code === eoiCode) {\n break;\n }\n if (code < dict.length) {\n if (last !== clearCode) {\n dict.push(dict[last].concat(dict[code][0]));\n }\n }\n else {\n if (code !== dict.length) {\n throw new Error('Invalid LZW code.');\n }\n dict.push(dict[last].concat(dict[last][0]));\n }\n output.push.apply(output, dict[code]);\n if (dict.length === 1 << codeSize && codeSize < 12) {\n // If we're at the last code and codeSize is 12, the next code will be a clearCode, and it'll be 12 bits long.\n codeSize++;\n }\n }\n // I don't know if this is technically an error, but some GIFs do it.\n //if (Math.ceil(pos / 8) !== data.length) throw new Error('Extraneous LZW bytes.');\n return output;\n};\n/**\n * GifParser for binary format\n *\n * Roughly based on the documentation https://giflib.sourceforge.net/whatsinagif/index.html\n */\nclass GifParser {\n constructor(stream) {\n this._handler = {};\n this.frames = [];\n this.images = [];\n this.globalColorTableBytes = [];\n this.checkBytes = [];\n this.parseColorTableBytes = (entries) => {\n // Each entry is 3 bytes, for RGB.\n const colorTable = [];\n for (let i = 0; i < entries; i++) {\n const rgb = this._st.readBytes(3);\n colorTable.push(rgb);\n }\n return colorTable;\n };\n this.readSubBlocks = () => {\n let size, data;\n data = '';\n do {\n size = this._st.readByte();\n data += this._st.read(size);\n } while (size !== 0);\n return data;\n };\n this.parseHeader = () => {\n const hdr = {\n sig: '',\n ver: '',\n width: 0,\n height: 0,\n colorResolution: 0,\n globalColorTableSize: 0,\n gctFlag: false,\n sortedFlag: false,\n globalColorTable: [],\n backgroundColorIndex: 0,\n pixelAspectRatio: 0 // if not 0, aspectRatio = (pixelAspectRatio + 15) / 64\n };\n hdr.sig = this._st.read(3);\n hdr.ver = this._st.read(3);\n if (hdr.sig !== 'GIF') {\n throw new Error('Not a GIF file.'); // XXX: This should probably be handled more nicely.\n }\n hdr.width = this._st.readUnsigned();\n hdr.height = this._st.readUnsigned();\n this._currentFrameCanvas.width = hdr.width;\n this._currentFrameCanvas.height = hdr.height;\n const bits = byteToBitArr(this._st.readByte());\n hdr.gctFlag = bits.shift();\n hdr.colorResolution = bitsToNum(bits.splice(0, 3));\n hdr.sortedFlag = bits.shift();\n hdr.globalColorTableSize = bitsToNum(bits.splice(0, 3));\n hdr.backgroundColorIndex = this._st.readByte();\n hdr.pixelAspectRatio = this._st.readByte(); // if not 0, aspectRatio = (pixelAspectRatio + 15) / 64\n if (hdr.gctFlag) {\n // hdr.globalColorTable = this.parseColorTable(1 << (hdr.globalColorTableSize + 1));\n this.globalColorTableBytes = this.parseColorTableBytes(1 << (hdr.globalColorTableSize + 1));\n }\n if (this._handler.hdr && this._handler.hdr(hdr)) {\n this.checkBytes.push(this._handler.hdr);\n }\n };\n this.parseExt = (block) => {\n const parseGCExt = (block) => {\n this.checkBytes.push(this._st.readByte()); // Always 4\n const bits = byteToBitArr(this._st.readByte());\n block.reserved = bits.splice(0, 3); // Reserved; should be 000.\n block.disposalMethod = bitsToNum(bits.splice(0, 3));\n block.userInputFlag = bits.shift();\n block.transparentColorFlag = bits.shift();\n block.delayTime = this._st.readUnsigned();\n block.transparentColorIndex = this._st.readByte();\n block.terminator = this._st.readByte(); // always 0\n if (this._handler.gce && this._handler.gce(block)) {\n this.checkBytes.push(this._handler.gce);\n }\n return block;\n };\n const parseComExt = (block) => {\n block.comment = this.readSubBlocks();\n if (this._handler.com && this._handler.com(block)) {\n this.checkBytes.push(this._handler.com);\n }\n };\n const parsePTExt = (block) => {\n this.checkBytes.push(this._st.readByte()); // Always 12\n block.ptHeader = this._st.readBytes(12);\n block.ptData = this.readSubBlocks();\n if (this._handler.pte && this._handler.pte(block)) {\n this.checkBytes.push(this._handler.pte);\n }\n };\n const parseAppExt = (block) => {\n const parseNetscapeExt = (block) => {\n this.checkBytes.push(this._st.readByte()); // Always 3\n block.unknown = this._st.readByte(); // Q: Always 1? What is this?\n block.iterations = this._st.readUnsigned();\n block.terminator = this._st.readByte();\n if (this._handler.app && this._handler.app.NETSCAPE && this._handler.app.NETSCAPE(block)) {\n this.checkBytes.push(this._handler.app);\n }\n };\n const parseUnknownAppExt = (block) => {\n block.appData = this.readSubBlocks();\n // FIXME: This won't work if a handler wants to match on any identifier.\n if (this._handler.app && this._handler.app[block.identifier] && this._handler.app[block.identifier](block)) {\n this.checkBytes.push(this._handler.app[block.identifier]);\n }\n };\n this.checkBytes.push(this._st.readByte()); // Always 11\n block.identifier = this._st.read(8);\n block.authCode = this._st.read(3);\n switch (block.identifier) {\n case 'NETSCAPE':\n parseNetscapeExt(block);\n break;\n default:\n parseUnknownAppExt(block);\n break;\n }\n };\n const parseUnknownExt = (block) => {\n block.data = this.readSubBlocks();\n if (this._handler.unknown && this._handler.unknown(block)) {\n this.checkBytes.push(this._handler.unknown);\n }\n };\n block.label = this._st.readByte();\n switch (block.label) {\n case 0xf9:\n block.extType = 'gce';\n this._gce = parseGCExt(block);\n break;\n case 0xfe:\n block.extType = 'com';\n parseComExt(block);\n break;\n case 0x01:\n block.extType = 'pte';\n parsePTExt(block);\n break;\n case 0xff:\n block.extType = 'app';\n parseAppExt(block);\n break;\n default:\n block.extType = 'unknown';\n parseUnknownExt(block);\n break;\n }\n };\n this.parseImg = (img) => {\n var _a;\n const deinterlace = (pixels, width) => {\n // Of course this defeats the purpose of interlacing. And it's *probably*\n // the least efficient way it's ever been implemented. But nevertheless...\n const newPixels = new Array(pixels.length);\n const rows = pixels.length / width;\n const cpRow = (toRow, fromRow) => {\n const fromPixels = pixels.slice(fromRow * width, (fromRow + 1) * width);\n newPixels.splice.apply(newPixels, [toRow * width, width].concat(fromPixels));\n };\n const offsets = [0, 4, 2, 1];\n const steps = [8, 8, 4, 2];\n let fromRow = 0;\n for (let pass = 0; pass < 4; pass++) {\n for (let toRow = offsets[pass]; toRow < rows; toRow += steps[pass]) {\n cpRow(toRow, fromRow);\n fromRow++;\n }\n }\n return newPixels;\n };\n img.leftPos = this._st.readUnsigned();\n img.topPos = this._st.readUnsigned();\n img.width = this._st.readUnsigned();\n img.height = this._st.readUnsigned();\n const bits = byteToBitArr(this._st.readByte());\n img.lctFlag = bits.shift();\n img.interlaced = bits.shift();\n img.sorted = bits.shift();\n img.reserved = bits.splice(0, 2);\n img.lctSize = bitsToNum(bits.splice(0, 3));\n if (img.lctFlag) {\n img.lctBytes = this.parseColorTableBytes(1 << (img.lctSize + 1));\n }\n img.lzwMinCodeSize = this._st.readByte();\n const lzwData = this.readSubBlocks();\n img.pixels = lzwDecode(img.lzwMinCodeSize, lzwData);\n if (img.interlaced) {\n // Move\n img.pixels = deinterlace(img.pixels, img.width);\n }\n if ((_a = this._gce) === null || _a === void 0 ? void 0 : _a.delayTime) {\n img.delayMs = this._gce.delayTime * 10;\n }\n this.frames.push(img);\n this.arrayToImage(img, img.lctFlag ? img.lctBytes : this.globalColorTableBytes);\n if (this._handler.img && this._handler.img(img)) {\n this.checkBytes.push(this._handler);\n }\n };\n this.parseBlocks = () => {\n const block = {\n sentinel: this._st.readByte(),\n type: ''\n };\n const blockChar = String.fromCharCode(block.sentinel);\n switch (blockChar) {\n case '!':\n block.type = 'ext';\n this.parseExt(block);\n break;\n case ',':\n block.type = 'img';\n this.parseImg(block);\n break;\n case ';':\n block.type = 'eof';\n if (this._handler.eof && this._handler.eof(block)) {\n this.checkBytes.push(this._handler.eof);\n }\n break;\n default:\n throw new Error('Unknown block: 0x' + block.sentinel.toString(16));\n }\n if (block.type !== 'eof') {\n this.parseBlocks();\n }\n };\n this.arrayToImage = (frame, colorTable) => {\n var _a, _b, _c, _d;\n const canvas = document.createElement('canvas');\n canvas.width = frame.width;\n canvas.height = frame.height;\n const context = canvas.getContext('2d');\n const imageData = context.getImageData(0, 0, canvas.width, canvas.height);\n let transparentColorIndex = -1;\n if ((_a = this._gce) === null || _a === void 0 ? void 0 : _a.transparentColorFlag) {\n transparentColorIndex = this._gce.transparentColorIndex;\n }\n for (let pixel = 0; pixel < frame.pixels.length; pixel++) {\n const colorIndex = frame.pixels[pixel];\n const color = colorTable[colorIndex];\n if (colorIndex === transparentColorIndex) {\n imageData.data.set([0, 0, 0, 0], pixel * 4);\n }\n else {\n imageData.data.set([...color, 255], pixel * 4);\n }\n }\n context.putImageData(imageData, 0, 0);\n // A value of 1 which tells the decoder to leave the image in place and draw the next image on top of it.\n // A value of 2 would have meant that the canvas should be restored to the background color (as indicated by the logical screen descriptor).\n // A value of 3 is defined to mean that the decoder should restore the canvas to its previous state before the current image was drawn.\n // The behavior for values 4-7 are yet to be defined.\n if (((_b = this._gce) === null || _b === void 0 ? void 0 : _b.disposalMethod) === 1 && this.images.length) {\n this._currentFrameContext.drawImage(this.images[this.images.length - 1], 0, 0);\n }\n else if (((_c = this._gce) === null || _c === void 0 ? void 0 : _c.disposalMethod) === 2 && ((_d = this._hdr) === null || _d === void 0 ? void 0 : _d.gctFlag)) {\n const bg = colorTable[this._hdr.backgroundColorIndex];\n this._currentFrameContext.fillStyle = `rgb(${bg[0]}, ${bg[1]}, ${bg[2]})`;\n this._currentFrameContext.fillRect(0, 0, this._hdr.width, this._hdr.height);\n }\n else {\n this._currentFrameContext.clearRect(0, 0, this._currentFrameCanvas.width, this._currentFrameCanvas.height);\n }\n this._currentFrameContext.drawImage(canvas, frame.leftPos, frame.topPos, frame.width, frame.height);\n const img = new Image();\n img.src = this._currentFrameCanvas.toDataURL(); // default is png\n this.images.push(img);\n };\n this._st = stream;\n this._handler = {};\n this._currentFrameCanvas = document.createElement('canvas');\n this._currentFrameContext = this._currentFrameCanvas.getContext('2d');\n this.parseHeader();\n this.parseBlocks();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Resources/Index.ts\":\n/*!****************************!*\\\n !*** ./Resources/Index.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AudioContextFactory: () => (/* reexport safe */ _Sound_Index__WEBPACK_IMPORTED_MODULE_1__.AudioContextFactory),\n/* harmony export */ FontSource: () => (/* reexport safe */ _Font__WEBPACK_IMPORTED_MODULE_3__.FontSource),\n/* harmony export */ Gif: () => (/* reexport safe */ _Gif__WEBPACK_IMPORTED_MODULE_2__.Gif),\n/* harmony export */ GifParser: () => (/* reexport safe */ _Gif__WEBPACK_IMPORTED_MODULE_2__.GifParser),\n/* harmony export */ Resource: () => (/* reexport safe */ _Resource__WEBPACK_IMPORTED_MODULE_0__.Resource),\n/* harmony export */ ResourceEvents: () => (/* reexport safe */ _Resource__WEBPACK_IMPORTED_MODULE_0__.ResourceEvents),\n/* harmony export */ Sound: () => (/* reexport safe */ _Sound_Index__WEBPACK_IMPORTED_MODULE_1__.Sound),\n/* harmony export */ SoundEvents: () => (/* reexport safe */ _Sound_Index__WEBPACK_IMPORTED_MODULE_1__.SoundEvents),\n/* harmony export */ Stream: () => (/* reexport safe */ _Gif__WEBPACK_IMPORTED_MODULE_2__.Stream),\n/* harmony export */ WebAudioInstance: () => (/* reexport safe */ _Sound_Index__WEBPACK_IMPORTED_MODULE_1__.WebAudioInstance)\n/* harmony export */ });\n/* harmony import */ var _Resource__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Resource */ \"./Resources/Resource.ts\");\n/* harmony import */ var _Sound_Index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Sound/Index */ \"./Resources/Sound/Index.ts\");\n/* harmony import */ var _Gif__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Gif */ \"./Resources/Gif.ts\");\n/* harmony import */ var _Font__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Font */ \"./Resources/Font.ts\");\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Resources/Resource.ts\":\n/*!*******************************!*\\\n !*** ./Resources/Resource.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Resource: () => (/* binding */ Resource),\n/* harmony export */ ResourceEvents: () => (/* binding */ ResourceEvents)\n/* harmony export */ });\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n\n\nconst ResourceEvents = {\n Complete: 'complete',\n Load: 'load',\n LoadStart: 'loadstart',\n Progress: 'progress',\n Error: 'error'\n};\n/**\n * The {@apilink Resource} type allows games built in Excalibur to load generic resources.\n * For any type of remote resource it is recommended to use {@apilink Resource} for preloading.\n */\nclass Resource {\n /**\n * @param path Path to the remote resource\n * @param responseType The type to expect as a response: \"\" | \"arraybuffer\" | \"blob\" | \"document\" | \"json\" | \"text\";\n * @param bustCache Whether or not to cache-bust requests\n */\n constructor(path, responseType, bustCache = false) {\n this.path = path;\n this.responseType = responseType;\n this.bustCache = bustCache;\n this.data = null;\n this.logger = _Util_Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance();\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_1__.EventEmitter();\n }\n /**\n * Returns true if the Resource is completely loaded and is ready\n * to be drawn.\n */\n isLoaded() {\n return this.data !== null;\n }\n _cacheBust(uri) {\n const query = /\\?\\w*=\\w*/;\n if (query.test(uri)) {\n uri += '&__=' + Date.now();\n }\n else {\n uri += '?__=' + Date.now();\n }\n return uri;\n }\n /**\n * Begin loading the resource and returns a promise to be resolved on completion\n */\n load() {\n return new Promise((resolve, reject) => {\n // Exit early if we already have data\n if (this.data !== null) {\n this.logger.debug('Already have data for resource', this.path);\n this.events.emit('complete', this.data);\n resolve(this.data);\n return;\n }\n const request = new XMLHttpRequest();\n request.open('GET', this.bustCache ? this._cacheBust(this.path) : this.path, true);\n request.responseType = this.responseType;\n request.addEventListener('loadstart', (e) => this.events.emit('loadstart', e));\n request.addEventListener('progress', (e) => this.events.emit('progress', e));\n request.addEventListener('error', (e) => this.events.emit('error', e));\n request.addEventListener('load', (e) => this.events.emit('load', e));\n request.addEventListener('load', () => {\n // XHR on file:// success status is 0, such as with PhantomJS\n if (request.status !== 0 && request.status !== 200) {\n this.logger.error('Failed to load resource ', this.path, ' server responded with error code', request.status);\n this.events.emit('error', request.response);\n reject(new Error(request.statusText));\n return;\n }\n if (request.response instanceof Blob && request.response.type === 'text/html') {\n const errorText = `Expected blob (usually image) data from the server when loading ${this.path}, but got HTML content instead!\r\n\r\nCheck your server configuration, for example Vite serves static files from the /public folder`;\n this.events.emit('error', request.response);\n reject(new Error(errorText));\n return;\n }\n this.data = request.response;\n this.events.emit('complete', this.data);\n this.logger.debug('Completed loading resource', this.path);\n resolve(this.data);\n });\n request.send();\n });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Resources/Sound/AudioContext.ts\":\n/*!*****************************************!*\\\n !*** ./Resources/Sound/AudioContext.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AudioContextFactory: () => (/* binding */ AudioContextFactory)\n/* harmony export */ });\n/**\n * Internal class used to build instances of AudioContext\n */\n/* istanbul ignore next */\nclass AudioContextFactory {\n static create() {\n if (!this._INSTANCE) {\n if (window.AudioContext || window.webkitAudioContext) {\n this._INSTANCE = new AudioContext();\n }\n }\n return this._INSTANCE;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Resources/Sound/Index.ts\":\n/*!**********************************!*\\\n !*** ./Resources/Sound/Index.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AudioContextFactory: () => (/* reexport safe */ _AudioContext__WEBPACK_IMPORTED_MODULE_1__.AudioContextFactory),\n/* harmony export */ Sound: () => (/* reexport safe */ _Sound__WEBPACK_IMPORTED_MODULE_0__.Sound),\n/* harmony export */ SoundEvents: () => (/* reexport safe */ _Sound__WEBPACK_IMPORTED_MODULE_0__.SoundEvents),\n/* harmony export */ WebAudioInstance: () => (/* reexport safe */ _WebAudioInstance__WEBPACK_IMPORTED_MODULE_2__.WebAudioInstance)\n/* harmony export */ });\n/* harmony import */ var _Sound__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Sound */ \"./Resources/Sound/Sound.ts\");\n/* harmony import */ var _AudioContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./AudioContext */ \"./Resources/Sound/AudioContext.ts\");\n/* harmony import */ var _WebAudioInstance__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./WebAudioInstance */ \"./Resources/Sound/WebAudioInstance.ts\");\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Resources/Sound/Sound.ts\":\n/*!**********************************!*\\\n !*** ./Resources/Sound/Sound.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Sound: () => (/* binding */ Sound),\n/* harmony export */ SoundEvents: () => (/* binding */ SoundEvents)\n/* harmony export */ });\n/* harmony import */ var _Interfaces_AudioImplementation__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Interfaces/AudioImplementation */ \"./Interfaces/AudioImplementation.ts\");\n/* harmony import */ var _Resource__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Resource */ \"./Resources/Resource.ts\");\n/* harmony import */ var _WebAudioInstance__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./WebAudioInstance */ \"./Resources/Sound/WebAudioInstance.ts\");\n/* harmony import */ var _AudioContext__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./AudioContext */ \"./Resources/Sound/AudioContext.ts\");\n/* harmony import */ var _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Events/MediaEvents */ \"./Events/MediaEvents.ts\");\n/* harmony import */ var _Util_Sound__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../Util/Sound */ \"./Util/Sound.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n\n\n\n\n\nconst SoundEvents = {\n VolumeChange: 'volumechange',\n Processed: 'processed',\n Pause: 'pause',\n Stop: 'stop',\n PlaybackEnd: 'playbackend',\n Resume: 'resume',\n PlaybackStart: 'playbackstart'\n};\n/**\n * The {@apilink Sound} object allows games built in Excalibur to load audio\n * components, from soundtracks to sound effects. {@apilink Sound} is an {@apilink Loadable}\n * which means it can be passed to a {@apilink Loader} to pre-load before a game or level.\n */\nclass Sound {\n /**\n * Indicates whether the clip should loop when complete\n * @param value Set the looping flag\n */\n set loop(value) {\n this._loop = value;\n for (const track of this._tracks) {\n track.loop = this._loop;\n }\n this.logger.debug('Set loop for all instances of sound', this.path, 'to', this._loop);\n }\n get loop() {\n return this._loop;\n }\n set volume(value) {\n this._volume = value;\n for (const track of this._tracks) {\n track.volume = this._volume;\n }\n this.events.emit('volumechange', new _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_0__.NativeSoundEvent(this));\n this.logger.debug('Set loop for all instances of sound', this.path, 'to', this._volume);\n }\n get volume() {\n return this._volume;\n }\n /**\n * Get the duration that this audio should play. If unset the total natural playback duration will be used.\n */\n get duration() {\n return this._duration;\n }\n /**\n * Set the duration that this audio should play. If unset the total natural playback duration will be used.\n *\n * Note: if you seek to a specific point the duration will start from that point, for example\n *\n * If you have a 10 second clip, seek to 5 seconds, then set the duration to 2, it will play the clip from 5-7 seconds.\n */\n set duration(duration) {\n this._duration = duration;\n }\n /**\n * Return array of Current AudioInstances playing or being paused\n */\n get instances() {\n return this._tracks;\n }\n get path() {\n return this._resource.path;\n }\n set path(val) {\n this._resource.path = val;\n }\n /**\n * Should excalibur add a cache busting querystring? By default false.\n * Must be set before loading\n */\n get bustCache() {\n return this._resource.bustCache;\n }\n set bustCache(val) {\n this._resource.bustCache = val;\n }\n /**\n * @param paths A list of audio sources (clip.wav, clip.mp3, clip.ogg) for this audio clip. This is done for browser compatibility.\n */\n constructor(...paths) {\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_1__.EventEmitter();\n this.logger = _Util_Log__WEBPACK_IMPORTED_MODULE_2__.Logger.getInstance();\n this._loop = false;\n this._volume = 1;\n this._isStopped = false;\n // private _isPaused = false;\n this._tracks = [];\n this._wasPlayingOnHidden = false;\n this._playbackRate = 1.0;\n this._audioContext = _AudioContext__WEBPACK_IMPORTED_MODULE_3__.AudioContextFactory.create();\n this._resource = new _Resource__WEBPACK_IMPORTED_MODULE_4__.Resource('', _Interfaces_AudioImplementation__WEBPACK_IMPORTED_MODULE_5__.ExResponse.type.arraybuffer);\n /**\n * Chrome : MP3, WAV, Ogg\n * Firefox : WAV, Ogg,\n * IE : MP3, WAV coming soon\n * Safari MP3, WAV, Ogg\n */\n for (const path of paths) {\n if ((0,_Util_Sound__WEBPACK_IMPORTED_MODULE_6__.canPlayFile)(path)) {\n this.path = path;\n break;\n }\n }\n if (!this.path) {\n this.logger.warn('This browser does not support any of the audio files specified:', paths.join(', '));\n this.logger.warn('Attempting to use', paths[0]);\n this.path = paths[0]; // select the first specified\n }\n }\n isLoaded() {\n return !!this.data;\n }\n async load() {\n var _a, _b;\n if (this.data) {\n return this.data;\n }\n const arraybuffer = await this._resource.load();\n const audiobuffer = await this.decodeAudio(arraybuffer.slice(0));\n this._duration = (_b = (_a = this._duration) !== null && _a !== void 0 ? _a : audiobuffer === null || audiobuffer === void 0 ? void 0 : audiobuffer.duration) !== null && _b !== void 0 ? _b : undefined;\n this.events.emit('processed', new _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_0__.NativeSoundProcessedEvent(this, audiobuffer));\n return (this.data = audiobuffer);\n }\n async decodeAudio(data) {\n try {\n return await this._audioContext.decodeAudioData(data.slice(0));\n }\n catch (e) {\n this.logger.error('Unable to decode ' +\n ' this browser may not fully support this format, or the file may be corrupt, ' +\n 'if this is an mp3 try removing id3 tags and album art from the file.');\n return await Promise.reject();\n }\n }\n wireEngine(engine) {\n if (engine) {\n this._engine = engine;\n this._engine.on('hidden', () => {\n if (engine.pauseAudioWhenHidden && this.isPlaying()) {\n this._wasPlayingOnHidden = true;\n this.pause();\n }\n });\n this._engine.on('visible', () => {\n if (engine.pauseAudioWhenHidden && this._wasPlayingOnHidden) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.play();\n this._wasPlayingOnHidden = false;\n }\n });\n this._engine.on('start', () => {\n this._isStopped = false;\n });\n this._engine.on('stop', () => {\n this.stop();\n this._isStopped = true;\n });\n }\n }\n /**\n * Returns how many instances of the sound are currently playing\n */\n instanceCount() {\n return this._tracks.length;\n }\n /**\n * Whether or not the sound is playing right now\n */\n isPlaying() {\n return this._tracks.some((t) => t.isPlaying());\n }\n isPaused() {\n return this._tracks.some((t) => t.isPaused());\n }\n isStopped() {\n return this._tracks.some((t) => t.isStopped());\n }\n /**\n * Play the sound, returns a promise that resolves when the sound is done playing\n * An optional volume argument can be passed in to play the sound. Max volume is 1.0\n */\n play(volume) {\n if (!this.isLoaded()) {\n this.logger.warn('Cannot start playing. Resource', this.path, 'is not loaded yet');\n return Promise.resolve(true);\n }\n if (this._isStopped) {\n this.logger.warn('Cannot start playing. Engine is in a stopped state.');\n return Promise.resolve(false);\n }\n this.volume = volume || this.volume;\n if (this.isPaused()) {\n return this._resumePlayback();\n }\n else {\n return this._startPlayback();\n }\n }\n /**\n * Stop the sound, and do not rewind\n */\n pause() {\n if (!this.isPlaying()) {\n return;\n }\n for (const track of this._tracks) {\n track.pause();\n }\n this.events.emit('pause', new _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_0__.NativeSoundEvent(this));\n this.logger.debug('Paused all instances of sound', this.path);\n }\n /**\n * Stop the sound if it is currently playing and rewind the track. If the sound is not playing, rewinds the track.\n */\n stop() {\n for (const track of this._tracks) {\n track.stop();\n }\n this.events.emit('stop', new _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_0__.NativeSoundEvent(this));\n this._tracks.length = 0;\n this.logger.debug('Stopped all instances of sound', this.path);\n }\n get playbackRate() {\n return this._playbackRate;\n }\n set playbackRate(playbackRate) {\n this._playbackRate = playbackRate;\n this._tracks.forEach((t) => {\n t.playbackRate = this._playbackRate;\n });\n }\n seek(position, trackId = 0) {\n if (this._tracks.length === 0) {\n this._getTrackInstance(this.data);\n }\n this._tracks[trackId].seek(position);\n }\n getTotalPlaybackDuration() {\n if (!this.isLoaded()) {\n this.logger.warnOnce(`Sound from ${this.path} is not loaded, cannot return total playback duration.` +\n `Did you forget to add Sound to a loader? https://excaliburjs.com/docs/loaders/`);\n return 0;\n }\n return this.data.duration;\n }\n /**\n * Return the current playback time of the playing track in seconds from the start.\n *\n * Optionally specify the track to query if multiple are playing at once.\n * @param trackId\n */\n getPlaybackPosition(trackId = 0) {\n if (this._tracks.length) {\n return this._tracks[trackId].getPlaybackPosition();\n }\n return 0;\n }\n /**\n * Get Id of provided AudioInstance in current trackList\n * @param track {@apilink Audio} which Id is to be given\n */\n getTrackId(track) {\n return this._tracks.indexOf(track);\n }\n async _resumePlayback() {\n if (this.isPaused()) {\n const resumed = [];\n // ensure we resume *current* tracks (if paused)\n for (const track of this._tracks) {\n resumed.push(track.play().then(() => {\n this._tracks.splice(this.getTrackId(track), 1);\n return true;\n }));\n }\n this.events.emit('resume', new _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_0__.NativeSoundEvent(this));\n this.logger.debug('Resuming paused instances for sound', this.path, this._tracks);\n // resolve when resumed tracks are done\n await Promise.all(resumed);\n }\n return true;\n }\n /**\n * Starts playback, returns a promise that resolves when playback is complete\n */\n async _startPlayback() {\n const track = this._getTrackInstance(this.data);\n const complete = await track.play(() => {\n this.events.emit('playbackstart', new _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_0__.NativeSoundEvent(this, track));\n this.logger.debug('Playing new instance for sound', this.path);\n });\n this.events.emit('playbackend', new _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_0__.NativeSoundEvent(this, track));\n // cleanup any done tracks\n const trackId = this.getTrackId(track);\n if (trackId !== -1) {\n this._tracks.splice(trackId, 1);\n }\n return complete;\n }\n _getTrackInstance(data) {\n var _a;\n const newTrack = new _WebAudioInstance__WEBPACK_IMPORTED_MODULE_7__.WebAudioInstance(data);\n newTrack.loop = this.loop;\n newTrack.volume = this.volume;\n newTrack.duration = (_a = this.duration) !== null && _a !== void 0 ? _a : 0;\n newTrack.playbackRate = this._playbackRate;\n this._tracks.push(newTrack);\n return newTrack;\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Resources/Sound/WebAudioInstance.ts\":\n/*!*********************************************!*\\\n !*** ./Resources/Sound/WebAudioInstance.ts ***!\n \\*********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ WebAudioInstance: () => (/* binding */ WebAudioInstance)\n/* harmony export */ });\n/* harmony import */ var _Util_StateMachine__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Util/StateMachine */ \"./Util/StateMachine.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _AudioContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./AudioContext */ \"./Resources/Sound/AudioContext.ts\");\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Util/Future */ \"./Util/Future.ts\");\n\n\n\n\n/**\n * Internal class representing a Web Audio AudioBufferSourceNode instance\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API\n */\nclass WebAudioInstance {\n _createNewBufferSource() {\n this._instance = this._audioContext.createBufferSource();\n this._instance.buffer = this._src;\n this._instance.loop = this.loop;\n this._instance.playbackRate.value = this._playbackRate;\n this._instance.connect(this._volumeNode);\n this._volumeNode.connect(this._audioContext.destination);\n }\n _handleEnd() {\n if (!this.loop) {\n this._instance.onended = () => {\n this._playingFuture.resolve(true);\n };\n }\n }\n set loop(value) {\n this._loop = value;\n if (this._instance) {\n this._instance.loop = value;\n if (!this.loop) {\n this._instance.onended = () => {\n this._playingFuture.resolve(true);\n };\n }\n }\n }\n get loop() {\n return this._loop;\n }\n set volume(value) {\n value = (0,_Math_util__WEBPACK_IMPORTED_MODULE_0__.clamp)(value, 0, 1.0);\n this._volume = value;\n if (this._stateMachine.in('PLAYING') && this._volumeNode.gain.setTargetAtTime) {\n // https://developer.mozilla.org/en-US/docs/Web/API/AudioParam/setTargetAtTime\n // After each .1 seconds timestep, the target value will ~63.2% closer to the target value.\n // This exponential ramp provides a more pleasant transition in gain\n this._volumeNode.gain.setTargetAtTime(value, this._audioContext.currentTime, 0.1);\n }\n else {\n this._volumeNode.gain.value = value;\n }\n }\n get volume() {\n return this._volume;\n }\n /**\n * Returns the set duration to play, otherwise returns the total duration if unset\n */\n get duration() {\n var _a;\n return (_a = this._duration) !== null && _a !== void 0 ? _a : this.getTotalPlaybackDuration();\n }\n /**\n * Set the duration that this audio should play.\n *\n * Note: if you seek to a specific point the duration will start from that point, for example\n *\n * If you have a 10 second clip, seek to 5 seconds, then set the duration to 2, it will play the clip from 5-7 seconds.\n */\n set duration(duration) {\n this._duration = duration;\n }\n constructor(_src) {\n this._src = _src;\n this._audioContext = _AudioContext__WEBPACK_IMPORTED_MODULE_1__.AudioContextFactory.create();\n this._volumeNode = this._audioContext.createGain();\n this._playingFuture = new _Util_Future__WEBPACK_IMPORTED_MODULE_2__.Future();\n this._stateMachine = _Util_StateMachine__WEBPACK_IMPORTED_MODULE_3__.StateMachine.create({\n start: 'STOPPED',\n states: {\n PLAYING: {\n onEnter: ({ data }) => {\n // Buffer nodes are single use\n this._createNewBufferSource();\n this._handleEnd();\n if (this.loop) {\n // when looping don't set a duration\n this._instance.start(0, data.pausedAt * this._playbackRate);\n }\n else {\n this._instance.start(0, data.pausedAt * this._playbackRate, this.duration);\n }\n data.startedAt = this._audioContext.currentTime - data.pausedAt;\n data.pausedAt = 0;\n },\n onState: () => this._playStarted(),\n onExit: ({ to }) => {\n // If you've exited early only resolve if explicitly STOPPED\n if (to === 'STOPPED') {\n this._playingFuture.resolve(true);\n }\n // Whenever you're not playing... you stop!\n this._instance.onended = null; // disconnect the wired on-end handler\n this._instance.disconnect();\n this._instance.stop(0);\n this._instance = null;\n },\n transitions: ['STOPPED', 'PAUSED', 'SEEK']\n },\n SEEK: {\n onEnter: ({ eventData: position, data }) => {\n data.pausedAt = (position !== null && position !== void 0 ? position : 0) / this._playbackRate;\n data.startedAt = 0;\n },\n transitions: ['*']\n },\n STOPPED: {\n onEnter: ({ data }) => {\n data.pausedAt = 0;\n data.startedAt = 0;\n this._playingFuture.resolve(true);\n },\n transitions: ['PLAYING', 'PAUSED', 'SEEK']\n },\n PAUSED: {\n onEnter: ({ data }) => {\n // Playback rate will be a scale factor of how fast/slow the audio is being played\n // default is 1.0\n // we need to invert it to get the time scale\n data.pausedAt = this._audioContext.currentTime - data.startedAt;\n },\n transitions: ['PLAYING', 'STOPPED', 'SEEK']\n }\n }\n }, {\n startedAt: 0,\n pausedAt: 0\n });\n this._volume = 1;\n this._loop = false;\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n this._playStarted = () => { };\n this._playbackRate = 1.0;\n this._createNewBufferSource();\n }\n isPlaying() {\n return this._stateMachine.in('PLAYING');\n }\n isPaused() {\n return this._stateMachine.in('PAUSED') || this._stateMachine.in('SEEK');\n }\n isStopped() {\n return this._stateMachine.in('STOPPED');\n }\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n play(playStarted = () => { }) {\n this._playStarted = playStarted;\n this._stateMachine.go('PLAYING');\n return this._playingFuture.promise;\n }\n pause() {\n this._stateMachine.go('PAUSED');\n }\n stop() {\n this._stateMachine.go('STOPPED');\n }\n seek(position) {\n this._stateMachine.go('PAUSED');\n this._stateMachine.go('SEEK', position);\n }\n getTotalPlaybackDuration() {\n return this._src.duration;\n }\n getPlaybackPosition() {\n const { pausedAt, startedAt } = this._stateMachine.data;\n if (pausedAt) {\n return pausedAt * this._playbackRate;\n }\n if (startedAt) {\n return (this._audioContext.currentTime - startedAt) * this._playbackRate;\n }\n return 0;\n }\n set playbackRate(playbackRate) {\n this._instance.playbackRate.value = this._playbackRate = playbackRate;\n }\n get playbackRate() {\n return this._instance.playbackRate.value;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Scene.ts\":\n/*!******************!*\\\n !*** ./Scene.ts ***!\n \\******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PreLoadEvent: () => (/* binding */ PreLoadEvent),\n/* harmony export */ Scene: () => (/* binding */ Scene),\n/* harmony export */ SceneEvents: () => (/* binding */ SceneEvents),\n/* harmony export */ isSceneConstructor: () => (/* binding */ isSceneConstructor)\n/* harmony export */ });\n/* harmony import */ var _ScreenElement__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./ScreenElement */ \"./ScreenElement.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./Events */ \"./Events.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Timer__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./Timer */ \"./Timer.ts\");\n/* harmony import */ var _TileMap__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./TileMap */ \"./TileMap/TileMap.ts\");\n/* harmony import */ var _Camera__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Camera */ \"./Camera.ts\");\n/* harmony import */ var _Actor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Actor */ \"./Actor.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./Util/Util */ \"./Util/Util.ts\");\n/* harmony import */ var _Trigger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Trigger */ \"./Trigger.ts\");\n/* harmony import */ var _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./EntityComponentSystem/System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _EntityComponentSystem_World__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./EntityComponentSystem/World */ \"./EntityComponentSystem/World.ts\");\n/* harmony import */ var _Collision_MotionSystem__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Collision/MotionSystem */ \"./Collision/MotionSystem.ts\");\n/* harmony import */ var _Collision_CollisionSystem__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Collision/CollisionSystem */ \"./Collision/CollisionSystem.ts\");\n/* harmony import */ var _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./EntityComponentSystem/Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _Graphics_GraphicsSystem__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Graphics/GraphicsSystem */ \"./Graphics/GraphicsSystem.ts\");\n/* harmony import */ var _Debug_DebugSystem__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Debug/DebugSystem */ \"./Debug/DebugSystem.ts\");\n/* harmony import */ var _Input_PointerSystem__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Input/PointerSystem */ \"./Input/PointerSystem.ts\");\n/* harmony import */ var _Actions_ActionsSystem__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Actions/ActionsSystem */ \"./Actions/ActionsSystem.ts\");\n/* harmony import */ var _TileMap_IsometricEntitySystem__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./TileMap/IsometricEntitySystem */ \"./TileMap/IsometricEntitySystem.ts\");\n/* harmony import */ var _Graphics_OffscreenSystem__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Graphics/OffscreenSystem */ \"./Graphics/OffscreenSystem.ts\");\n/* harmony import */ var _Collision_PhysicsWorld__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Collision/PhysicsWorld */ \"./Collision/PhysicsWorld.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Input_InputHost__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./Input/InputHost */ \"./Input/InputHost.ts\");\n/* harmony import */ var _Input_PointerScope__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Input/PointerScope */ \"./Input/PointerScope.ts\");\n/* harmony import */ var _Collision_PhysicsConfig__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Collision/PhysicsConfig */ \"./Collision/PhysicsConfig.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass PreLoadEvent {\n}\nconst SceneEvents = {\n Initialize: 'initialize',\n Activate: 'activate',\n Deactivate: 'deactivate',\n PreUpdate: 'preupdate',\n PostUpdate: 'postupdate',\n PreDraw: 'predraw',\n PostDraw: 'postdraw',\n PreDebugDraw: 'predebugdraw',\n PostDebugDraw: 'postdebugdraw',\n PreLoad: 'preload'\n};\n/**\n *\n */\nfunction isSceneConstructor(x) {\n var _a, _b;\n return !!(x === null || x === void 0 ? void 0 : x.prototype) && !!((_b = (_a = x === null || x === void 0 ? void 0 : x.prototype) === null || _a === void 0 ? void 0 : _a.constructor) === null || _b === void 0 ? void 0 : _b.name);\n}\n/**\n * {@apilink Actor | `Actors`} are composed together into groupings called Scenes in\n * Excalibur. The metaphor models the same idea behind real world\n * actors in a scene. Only actors in scenes will be updated and drawn.\n *\n * Typical usages of a scene include: levels, menus, loading screens, etc.\n */\nclass Scene {\n /**\n * The actors in the current scene\n */\n get actors() {\n return this.world.entityManager.entities.filter((e) => {\n return e instanceof _Actor__WEBPACK_IMPORTED_MODULE_0__.Actor;\n });\n }\n /**\n * The entities in the current scene\n */\n get entities() {\n return this.world.entityManager.entities;\n }\n /**\n * The triggers in the current scene\n */\n get triggers() {\n return this.world.entityManager.entities.filter((e) => {\n return e instanceof _Trigger__WEBPACK_IMPORTED_MODULE_1__.Trigger;\n });\n }\n /**\n * The {@apilink TileMap}s in the scene, if any\n */\n get tileMaps() {\n return this.world.entityManager.entities.filter((e) => {\n return e instanceof _TileMap__WEBPACK_IMPORTED_MODULE_2__.TileMap;\n });\n }\n get timers() {\n return this._timers;\n }\n constructor() {\n // Initialize systems\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_3__.Logger.getInstance();\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_4__.EventEmitter();\n /**\n * Gets or sets the current camera for the scene\n */\n this.camera = new _Camera__WEBPACK_IMPORTED_MODULE_5__.Camera();\n /**\n * The ECS world for the scene\n */\n this.world = new _EntityComponentSystem_World__WEBPACK_IMPORTED_MODULE_6__.World(this);\n /**\n * The Excalibur physics world for the scene. Used to interact\n * with colliders included in the scene.\n *\n * Can be used to perform scene ray casts, track colliders, broadphase, and narrowphase.\n */\n this.physics = new _Collision_PhysicsWorld__WEBPACK_IMPORTED_MODULE_7__.PhysicsWorld((0,_Collision_PhysicsConfig__WEBPACK_IMPORTED_MODULE_8__.getDefaultPhysicsConfig)());\n this._isInitialized = false;\n this._timers = [];\n this._cancelQueue = [];\n // Update\n this.world.add(_Actions_ActionsSystem__WEBPACK_IMPORTED_MODULE_9__.ActionsSystem);\n this.world.add(new _Collision_MotionSystem__WEBPACK_IMPORTED_MODULE_10__.MotionSystem(this.world, this.physics));\n this.world.add(new _Collision_CollisionSystem__WEBPACK_IMPORTED_MODULE_11__.CollisionSystem(this.world, this.physics));\n this.world.add(_Input_PointerSystem__WEBPACK_IMPORTED_MODULE_12__.PointerSystem);\n this.world.add(_TileMap_IsometricEntitySystem__WEBPACK_IMPORTED_MODULE_13__.IsometricEntitySystem);\n // Draw\n this.world.add(_Graphics_OffscreenSystem__WEBPACK_IMPORTED_MODULE_14__.OffscreenSystem);\n this.world.add(_Graphics_GraphicsSystem__WEBPACK_IMPORTED_MODULE_15__.GraphicsSystem);\n this.world.add(_Debug_DebugSystem__WEBPACK_IMPORTED_MODULE_16__.DebugSystem);\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n /**\n * Event hook to provide Scenes a way of loading scene specific resources.\n *\n * This is called before the Scene.onInitialize during scene transition. It will only ever fire once for a scene.\n * @param loader\n */\n onPreLoad(loader) {\n // will be overridden\n }\n /**\n * Event hook fired directly before transition, either \"in\" or \"out\" of the scene\n *\n * This overrides the Engine scene definition. However transitions specified in goToScene take highest precedence\n *\n * ```typescript\n * // Overrides all\n * Engine.goToScene('scene', { destinationIn: ..., sourceOut: ... });\n * ```\n *\n * This can be used to configure custom transitions for a scene dynamically\n */\n onTransition(direction) {\n // will be overridden\n return undefined;\n }\n /**\n * This is called before the first update of the {@apilink Scene}. Initializes scene members like the camera. This method is meant to be\n * overridden. This is where initialization of child actors should take place.\n */\n onInitialize(engine) {\n // will be overridden\n }\n /**\n * This is called when the scene is made active and started. It is meant to be overridden,\n * this is where you should setup any DOM UI or event handlers needed for the scene.\n */\n onActivate(context) {\n // will be overridden\n }\n /**\n * This is called when the scene is made transitioned away from and stopped. It is meant to be overridden,\n * this is where you should cleanup any DOM UI or event handlers needed for the scene.\n */\n onDeactivate(context) {\n // will be overridden\n }\n /**\n * Safe to override onPreUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPreUpdate` is called directly before a scene is updated.\n * @param engine reference to the engine\n * @param elapsed Number of milliseconds elapsed since the last draw.\n */\n onPreUpdate(engine, elapsed) {\n // will be overridden\n }\n /**\n * Safe to override onPostUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPostUpdate` is called directly after a scene is updated.\n * @param engine reference to the engine\n * @param elapsed Number of milliseconds elapsed since the last draw.\n */\n onPostUpdate(engine, elapsed) {\n // will be overridden\n }\n /**\n * Safe to override onPreDraw lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPreDraw` is called directly before a scene is drawn.\n *\n */\n onPreDraw(ctx, elapsed) {\n // will be overridden\n }\n /**\n * Safe to override onPostDraw lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPostDraw` is called directly after a scene is drawn.\n *\n */\n onPostDraw(ctx, elapsed) {\n // will be overridden\n }\n /**\n * Initializes actors in the scene\n */\n _initializeChildren() {\n for (const child of this.entities) {\n child._initialize(this.engine);\n }\n }\n /**\n * Gets whether or not the {@apilink Scene} has been initialized\n */\n get isInitialized() {\n return this._isInitialized;\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Initializes the scene before the first update, meant to be called by engine not by users of\n * Excalibur\n * @internal\n */\n async _initialize(engine) {\n var _a;\n if (!this.isInitialized) {\n try {\n this.engine = engine;\n // PhysicsWorld config is watched so things will automagically update\n this.physics.config = this.engine.physics;\n this.input = new _Input_InputHost__WEBPACK_IMPORTED_MODULE_17__.InputHost({\n pointerTarget: engine.pointerScope === _Input_PointerScope__WEBPACK_IMPORTED_MODULE_18__.PointerScope.Canvas ? engine.canvas : document,\n grabWindowFocus: engine.grabWindowFocus,\n engine\n });\n // Initialize camera first\n this.camera._initialize(engine);\n this.world.systemManager.initialize();\n // This order is important! we want to be sure any custom init that add actors\n // fire before the actor init\n await this.onInitialize(engine);\n this._initializeChildren();\n this._logger.debug('Scene.onInitialize', this, engine);\n this.events.emit('initialize', new _Events__WEBPACK_IMPORTED_MODULE_19__.InitializeEvent(engine, this));\n }\n catch (e) {\n this._logger.error(`Error during scene initialization for scene ${(_a = engine.director) === null || _a === void 0 ? void 0 : _a.getSceneName(this)}!`);\n throw e;\n }\n this._isInitialized = true;\n }\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Activates the scene with the base behavior, then calls the overridable `onActivate` implementation.\n * @internal\n */\n async _activate(context) {\n var _a, _b;\n try {\n this._logger.debug('Scene.onActivate', this);\n this.input.toggleEnabled(true);\n await this.onActivate(context);\n }\n catch (e) {\n this._logger.error(`Error during scene activation for scene ${(_b = (_a = this.engine) === null || _a === void 0 ? void 0 : _a.director) === null || _b === void 0 ? void 0 : _b.getSceneName(this)}!`);\n throw e;\n }\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Deactivates the scene with the base behavior, then calls the overridable `onDeactivate` implementation.\n * @internal\n */\n async _deactivate(context) {\n this._logger.debug('Scene.onDeactivate', this);\n this.input.toggleEnabled(false);\n await this.onDeactivate(context);\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _preupdate handler for {@apilink onPreUpdate} lifecycle event\n * @internal\n */\n _preupdate(engine, elapsed) {\n this.emit('preupdate', new _Events__WEBPACK_IMPORTED_MODULE_19__.PreUpdateEvent(engine, elapsed, this));\n this.onPreUpdate(engine, elapsed);\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _preupdate handler for {@apilink onPostUpdate} lifecycle event\n * @internal\n */\n _postupdate(engine, elapsed) {\n this.emit('postupdate', new _Events__WEBPACK_IMPORTED_MODULE_19__.PostUpdateEvent(engine, elapsed, this));\n this.onPostUpdate(engine, elapsed);\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _predraw handler for {@apilink onPreDraw} lifecycle event\n * @internal\n */\n _predraw(ctx, elapsed) {\n this.emit('predraw', new _Events__WEBPACK_IMPORTED_MODULE_19__.PreDrawEvent(ctx, elapsed, this));\n this.onPreDraw(ctx, elapsed);\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _postdraw handler for {@apilink onPostDraw} lifecycle event\n * @internal\n */\n _postdraw(ctx, elapsed) {\n this.emit('postdraw', new _Events__WEBPACK_IMPORTED_MODULE_19__.PostDrawEvent(ctx, elapsed, this));\n this.onPostDraw(ctx, elapsed);\n }\n /**\n * Updates all the actors and timers in the scene. Called by the {@apilink Engine}.\n * @param engine Reference to the current Engine\n * @param elapsed The number of milliseconds since the last update\n */\n update(engine, elapsed) {\n var _a;\n if (!this.isInitialized) {\n this._logger.warnOnce(`Scene update called before initialize for scene ${(_a = engine.director) === null || _a === void 0 ? void 0 : _a.getSceneName(this)}!`);\n return;\n }\n this._preupdate(engine, elapsed);\n // TODO differed entity removal for timers\n let i, len;\n // Remove timers in the cancel queue before updating them\n for (i = 0, len = this._cancelQueue.length; i < len; i++) {\n this.removeTimer(this._cancelQueue[i]);\n }\n this._cancelQueue.length = 0;\n // Cycle through timers updating timers\n for (const timer of this._timers) {\n timer.update(elapsed);\n }\n this.world.update(_EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_20__.SystemType.Update, elapsed);\n // Camera last keeps renders smooth that are based on entity/actor\n if (this.camera) {\n this.camera.update(engine, elapsed);\n }\n this._collectActorStats(engine);\n this._postupdate(engine, elapsed);\n this.input.update();\n }\n /**\n * Draws all the actors in the Scene. Called by the {@apilink Engine}.\n * @param ctx The current rendering context\n * @param elapsed The number of milliseconds since the last draw\n */\n draw(ctx, elapsed) {\n var _a;\n if (!this.isInitialized) {\n this._logger.warnOnce(`Scene draw called before initialize!`);\n return;\n }\n this._predraw(ctx, elapsed);\n this.world.update(_EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_20__.SystemType.Draw, elapsed);\n if ((_a = this.engine) === null || _a === void 0 ? void 0 : _a.isDebug) {\n this.debugDraw(ctx);\n }\n this._postdraw(ctx, elapsed);\n }\n /**\n * Draws all the actors' debug information in the Scene. Called by the {@apilink Engine}.\n * @param ctx The current rendering context\n */\n /* istanbul ignore next */\n debugDraw(ctx) {\n this.emit('predebugdraw', new _Events__WEBPACK_IMPORTED_MODULE_19__.PreDebugDrawEvent(ctx, this));\n // pass\n this.emit('postdebugdraw', new _Events__WEBPACK_IMPORTED_MODULE_19__.PostDebugDrawEvent(ctx, this));\n }\n /**\n * Checks whether an actor is contained in this scene or not\n */\n contains(actor) {\n return this.actors.indexOf(actor) > -1;\n }\n add(entity) {\n this.emit('entityadded', { target: entity });\n this.world.add(entity);\n entity.scene = this;\n if (entity instanceof _Timer__WEBPACK_IMPORTED_MODULE_21__.Timer) {\n if (!_Util_Util__WEBPACK_IMPORTED_MODULE_22__.contains(this._timers, entity)) {\n this.addTimer(entity);\n }\n return;\n }\n }\n /**\n * Removes an {@apilink Entity} (Actor, TileMap, Trigger, etc) or {@apilink Timer} from it's current scene\n * and adds it to this scene.\n *\n * Useful if you want to have an object be present in only 1 scene at a time.\n * @param entity\n */\n transfer(entity) {\n let scene;\n if (entity instanceof _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_23__.Entity && entity.scene && entity.scene !== this) {\n scene = entity.scene;\n entity.scene.world.remove(entity, false);\n }\n if (entity instanceof _Timer__WEBPACK_IMPORTED_MODULE_21__.Timer && entity.scene) {\n scene = entity.scene;\n entity.scene.removeTimer(entity);\n }\n scene === null || scene === void 0 ? void 0 : scene.emit('entityremoved', { target: entity });\n this.add(entity);\n }\n remove(entity) {\n if (entity instanceof _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_23__.Entity) {\n this.emit('entityremoved', { target: entity });\n if (entity.isActive) {\n entity.kill();\n }\n this.world.remove(entity);\n }\n if (entity instanceof _Timer__WEBPACK_IMPORTED_MODULE_21__.Timer) {\n this.removeTimer(entity);\n }\n }\n /**\n * Removes all entities and timers from the scene, optionally indicate whether deferred should or shouldn't be used.\n *\n * By default entities use deferred removal\n * @param deferred\n */\n clear(deferred = true) {\n for (let i = this.entities.length - 1; i >= 0; i--) {\n this.world.remove(this.entities[i], deferred);\n }\n for (let i = this.timers.length - 1; i >= 0; i--) {\n this.removeTimer(this.timers[i]);\n }\n }\n /**\n * Adds a {@apilink Timer} to the scene\n * @param timer The timer to add\n */\n addTimer(timer) {\n this._timers.push(timer);\n timer.scene = this;\n return timer;\n }\n /**\n * Removes a {@apilink Timer} from the scene.\n * @warning Can be dangerous, use {@apilink cancelTimer} instead\n * @param timer The timer to remove\n */\n removeTimer(timer) {\n const i = this._timers.indexOf(timer);\n if (i !== -1) {\n this._timers.splice(i, 1);\n }\n return timer;\n }\n /**\n * Cancels a {@apilink Timer}, removing it from the scene nicely\n * @param timer The timer to cancel\n */\n cancelTimer(timer) {\n this._cancelQueue.push(timer);\n return timer;\n }\n /**\n * Tests whether a {@apilink Timer} is active in the scene\n */\n isTimerActive(timer) {\n return this._timers.indexOf(timer) > -1 && !timer.complete;\n }\n isCurrentScene() {\n if (this.engine) {\n return this.engine.currentScene === this;\n }\n return false;\n }\n _collectActorStats(engine) {\n const actors = this.actors;\n for (let i = 0; i < actors.length; i++) {\n const actor = actors[i];\n if (actor instanceof _ScreenElement__WEBPACK_IMPORTED_MODULE_24__.ScreenElement) {\n engine.stats.currFrame.actors.ui++;\n }\n engine.stats.currFrame.actors.alive++;\n for (let j = 0; j < actor.children.length; j++) {\n const child = actor.children[j];\n if ((0,_ScreenElement__WEBPACK_IMPORTED_MODULE_24__.isScreenElement)(child)) {\n // TODO not true\n engine.stats.currFrame.actors.ui++;\n }\n else {\n engine.stats.currFrame.actors.alive++;\n }\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Screen.ts\":\n/*!*******************!*\\\n !*** ./Screen.ts ***!\n \\*******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DisplayMode: () => (/* binding */ DisplayMode),\n/* harmony export */ Resolution: () => (/* binding */ Resolution),\n/* harmony export */ Screen: () => (/* binding */ Screen),\n/* harmony export */ ScreenEvents: () => (/* binding */ ScreenEvents)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Collision_Index__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Collision/Index */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Util/Util */ \"./Util/Util.ts\");\n/* harmony import */ var _Graphics_Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Graphics/Context/ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _Graphics_Context_ExcaliburGraphicsContext2DCanvas__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Graphics/Context/ExcaliburGraphicsContext2DCanvas */ \"./Graphics/Context/ExcaliburGraphicsContext2DCanvas.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n\n\n\n\n/**\n * Enum representing the different display modes available to Excalibur.\n */\nvar DisplayMode;\n(function (DisplayMode) {\n /**\n * Default, use a specified resolution for the game. Like 800x600 pixels for example.\n */\n DisplayMode[\"Fixed\"] = \"Fixed\";\n /**\n * Fit the aspect ratio given by the game resolution within the container at all times will fill any gaps with canvas.\n * The displayed area outside the aspect ratio is not guaranteed to be on the screen, only the {@apilink Screen.contentArea}\n * is guaranteed to be on screen.\n */\n DisplayMode[\"FitContainerAndFill\"] = \"FitContainerAndFill\";\n /**\n * Fit the aspect ratio given by the game resolution the screen at all times will fill the screen.\n * This displayed area outside the aspect ratio is not guaranteed to be on the screen, only the {@apilink Screen.contentArea}\n * is guaranteed to be on screen.\n */\n DisplayMode[\"FitScreenAndFill\"] = \"FitScreenAndFill\";\n /**\n * Fit the viewport to the parent element maintaining aspect ratio given by the game resolution, but zooms in to avoid the black bars\n * (letterbox) that would otherwise be present in {@apilink FitContainer}.\n *\n * **warning** This will clip some drawable area from the user because of the zoom,\n * use {@apilink Screen.contentArea} to know the safe to draw area.\n */\n DisplayMode[\"FitContainerAndZoom\"] = \"FitContainerAndZoom\";\n /**\n * Fit the viewport to the device screen maintaining aspect ratio given by the game resolution, but zooms in to avoid the black bars\n * (letterbox) that would otherwise be present in {@apilink FitScreen}.\n *\n * **warning** This will clip some drawable area from the user because of the zoom,\n * use {@apilink Screen.contentArea} to know the safe to draw area.\n */\n DisplayMode[\"FitScreenAndZoom\"] = \"FitScreenAndZoom\";\n /**\n * Fit to screen using as much space as possible while maintaining aspect ratio and resolution.\n * This is not the same as {@apilink Screen.goFullScreen} but behaves in a similar way maintaining aspect ratio.\n *\n * You may want to center your game here is an example\n * ```html\n * \n * \n *
\n * \n *
\n * \n * ```\n *\n * ```css\n * // css\n * main {\n * display: flex;\n * align-items: center;\n * justify-content: center;\n * height: 100%;\n * width: 100%;\n * }\n * ```\n */\n DisplayMode[\"FitScreen\"] = \"FitScreen\";\n /**\n * Fill the entire screen's css width/height for the game resolution dynamically. This means the resolution of the game will\n * change dynamically as the window is resized. This is not the same as {@apilink Screen.goFullScreen}\n */\n DisplayMode[\"FillScreen\"] = \"FillScreen\";\n /**\n * Fit to parent element width/height using as much space as possible while maintaining aspect ratio and resolution.\n */\n DisplayMode[\"FitContainer\"] = \"FitContainer\";\n /**\n * Use the parent DOM container's css width/height for the game resolution dynamically\n */\n DisplayMode[\"FillContainer\"] = \"FillContainer\";\n})(DisplayMode || (DisplayMode = {}));\n/**\n * Convenience class for quick resolutions\n * Mostly sourced from https://emulation.gametechwiki.com/index.php/Resolution\n */\nclass Resolution {\n /* istanbul ignore next */\n static get SVGA() {\n return { width: 800, height: 600 };\n }\n /* istanbul ignore next */\n static get Standard() {\n return { width: 1920, height: 1080 };\n }\n /* istanbul ignore next */\n static get Atari2600() {\n return { width: 160, height: 192 };\n }\n /* istanbul ignore next */\n static get GameBoy() {\n return { width: 160, height: 144 };\n }\n /* istanbul ignore next */\n static get GameBoyAdvance() {\n return { width: 240, height: 160 };\n }\n /* istanbul ignore next */\n static get NintendoDS() {\n return { width: 256, height: 192 };\n }\n /* istanbul ignore next */\n static get NES() {\n return { width: 256, height: 224 };\n }\n /* istanbul ignore next */\n static get SNES() {\n return { width: 256, height: 244 };\n }\n}\nconst ScreenEvents = {\n ScreenResize: 'resize',\n PixelRatioChange: 'pixelratio',\n FullScreenChange: 'fullscreen'\n};\n/**\n * The Screen handles all aspects of interacting with the screen for Excalibur.\n */\nclass Screen {\n constructor(options) {\n var _a, _b, _c, _d;\n /**\n * Listen to screen events {@apilink ScreenEvents}\n */\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n this._antialiasing = true;\n this._canvasImageRendering = 'auto';\n this._resolutionStack = [];\n this._viewportStack = [];\n this._pixelRatioOverride = null;\n this._isFullscreen = false;\n this._isDisposed = false;\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this._fullscreenChangeHandler = () => {\n if (this._isDisposed) {\n return;\n }\n this._isFullscreen = !this._isFullscreen;\n this._logger.debug('Fullscreen Change', this._isFullscreen);\n this.events.emit('fullscreen', {\n fullscreen: this.isFullScreen\n });\n };\n this._pixelRatioChangeHandler = () => {\n if (this._isDisposed) {\n return;\n }\n this._logger.debug('Pixel Ratio Change', window.devicePixelRatio);\n this._listenForPixelRatio();\n this._devicePixelRatio = this._calculateDevicePixelRatio();\n this.applyResolutionAndViewport();\n this.events.emit('pixelratio', {\n pixelRatio: this.pixelRatio\n });\n };\n this._resizeHandler = () => {\n if (this._isDisposed) {\n return;\n }\n const parent = this.parent;\n this._logger.debug('View port resized');\n this._setResolutionAndViewportByDisplayMode(parent);\n this.applyResolutionAndViewport();\n // Emit resize event\n this.events.emit('resize', {\n resolution: this.resolution,\n viewport: this.viewport\n });\n };\n // Asking the window.devicePixelRatio is expensive we do it once\n this._devicePixelRatio = this._calculateDevicePixelRatio();\n this._contentArea = new _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox();\n this._unsafeArea = new _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox();\n this.viewport = options.viewport;\n this.resolution = (_a = options.resolution) !== null && _a !== void 0 ? _a : { ...this.viewport };\n this._contentResolution = this.resolution;\n this._displayMode = (_b = options.displayMode) !== null && _b !== void 0 ? _b : DisplayMode.Fixed;\n this._canvas = options.canvas;\n this.graphicsContext = options.context;\n this._antialiasing = (_c = options.antialiasing) !== null && _c !== void 0 ? _c : this._antialiasing;\n this._canvasImageRendering = (_d = options.canvasImageRendering) !== null && _d !== void 0 ? _d : this._canvasImageRendering;\n this._browser = options.browser;\n this._pixelRatioOverride = options.pixelRatio;\n this._applyDisplayMode();\n this._listenForPixelRatio();\n this._canvas.addEventListener('fullscreenchange', this._fullscreenChangeHandler);\n this.applyResolutionAndViewport();\n }\n _listenForPixelRatio() {\n if (this._mediaQueryList && !this._mediaQueryList.addEventListener) {\n // Safari <=13.1 workaround, remove any existing handlers\n this._mediaQueryList.removeListener(this._pixelRatioChangeHandler);\n }\n this._mediaQueryList = this._browser.window.nativeComponent.matchMedia(`(resolution: ${window.devicePixelRatio}dppx)`);\n // Safari <=13.1 workaround\n if (this._mediaQueryList.addEventListener) {\n this._mediaQueryList.addEventListener('change', this._pixelRatioChangeHandler, { once: true });\n }\n else {\n this._mediaQueryList.addListener(this._pixelRatioChangeHandler);\n }\n }\n dispose() {\n if (!this._isDisposed) {\n // Clean up handlers\n this._isDisposed = true;\n this.events.clear();\n this._browser.window.off('resize', this._resizeHandler);\n this._browser.window.clear();\n if (this._resizeObserver) {\n this._resizeObserver.disconnect();\n }\n this.parent.removeEventListener('resize', this._resizeHandler);\n // Safari <=13.1 workaround\n if (this._mediaQueryList.removeEventListener) {\n this._mediaQueryList.removeEventListener('change', this._pixelRatioChangeHandler);\n }\n else {\n this._mediaQueryList.removeListener(this._pixelRatioChangeHandler);\n }\n this._canvas.removeEventListener('fullscreenchange', this._fullscreenChangeHandler);\n this._canvas = null;\n }\n }\n _calculateDevicePixelRatio() {\n if (window.devicePixelRatio < 1) {\n return 1;\n }\n const devicePixelRatio = window.devicePixelRatio || 1;\n return devicePixelRatio;\n }\n /**\n * Returns the computed pixel ratio, first using any override, then the device pixel ratio\n */\n get pixelRatio() {\n if (this._pixelRatioOverride) {\n return this._pixelRatioOverride;\n }\n return this._devicePixelRatio;\n }\n /**\n * This calculates the ratio between excalibur pixels and the HTML pixels.\n *\n * This is useful for scaling HTML UI so that it matches your game.\n */\n get worldToPagePixelRatio() {\n if (this._canvas) {\n const pageOrigin = this.worldToPageCoordinates(_Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero);\n const pageDistance = this.worldToPageCoordinates((0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(1, 0)).sub(pageOrigin);\n const pixelConversion = pageDistance.x;\n return pixelConversion;\n }\n else {\n return 1;\n }\n }\n /**\n * Get or set the pixel ratio override\n *\n * You will need to call applyResolutionAndViewport() affect change on the screen\n */\n get pixelRatioOverride() {\n return this._pixelRatioOverride;\n }\n set pixelRatioOverride(value) {\n this._pixelRatioOverride = value;\n }\n get isHiDpi() {\n return this.pixelRatio !== 1;\n }\n get displayMode() {\n return this._displayMode;\n }\n get canvas() {\n return this._canvas;\n }\n get parent() {\n switch (this.displayMode) {\n case DisplayMode.FillContainer:\n case DisplayMode.FitContainer:\n case DisplayMode.FitContainerAndFill:\n case DisplayMode.FitContainerAndZoom:\n return this.canvas.parentElement || document.body;\n default:\n return window;\n }\n }\n get resolution() {\n return this._resolution;\n }\n set resolution(resolution) {\n this._resolution = resolution;\n }\n /**\n * Returns screen dimensions in pixels or percentage\n */\n get viewport() {\n if (this._viewport) {\n return this._viewport;\n }\n return this._resolution;\n }\n set viewport(viewport) {\n this._viewport = viewport;\n }\n get aspectRatio() {\n return this._resolution.width / this._resolution.height;\n }\n get scaledWidth() {\n return this._resolution.width * this.pixelRatio;\n }\n get scaledHeight() {\n return this._resolution.height * this.pixelRatio;\n }\n setCurrentCamera(camera) {\n this._camera = camera;\n }\n pushResolutionAndViewport() {\n this._resolutionStack.push(this.resolution);\n this._viewportStack.push(this.viewport);\n this.resolution = { ...this.resolution };\n this.viewport = { ...this.viewport };\n }\n peekViewport() {\n return this._viewportStack[this._viewportStack.length - 1];\n }\n peekResolution() {\n return this._resolutionStack[this._resolutionStack.length - 1];\n }\n popResolutionAndViewport() {\n if (this._resolutionStack.length && this._viewportStack.length) {\n this.resolution = this._resolutionStack.pop();\n this.viewport = this._viewportStack.pop();\n }\n }\n applyResolutionAndViewport() {\n if (this.graphicsContext instanceof _Graphics_Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_4__.ExcaliburGraphicsContextWebGL) {\n const scaledResolutionSupported = this.graphicsContext.checkIfResolutionSupported({\n width: this.scaledWidth,\n height: this.scaledHeight\n });\n if (!scaledResolutionSupported) {\n this._logger.warnOnce(`The currently configured resolution (${this.resolution.width}x${this.resolution.height}) and pixel ratio (${this.pixelRatio})` +\n ' are too large for the platform WebGL implementation, this may work but cause WebGL rendering to behave oddly.' +\n ' Try reducing the resolution or disabling Hi DPI scaling to avoid this' +\n ' (read more here https://excaliburjs.com/docs/screens#understanding-viewport--resolution).');\n // Attempt to recover if the user hasn't configured a specific ratio for up scaling\n if (!this.pixelRatioOverride) {\n let currentPixelRatio = Math.max(1, this.pixelRatio - 0.5);\n let newResolutionSupported = false;\n while (currentPixelRatio > 1 && !newResolutionSupported) {\n currentPixelRatio = Math.max(1, currentPixelRatio - 0.5);\n const width = this._resolution.width * currentPixelRatio;\n const height = this._resolution.height * currentPixelRatio;\n newResolutionSupported = this.graphicsContext.checkIfResolutionSupported({ width, height });\n }\n this.pixelRatioOverride = currentPixelRatio;\n this._logger.warnOnce('Scaled resolution too big attempted recovery!' +\n ` Pixel ratio was automatically reduced to (${this.pixelRatio}) to avoid 4k texture limit.` +\n ' Setting `ex.Engine({pixelRatio: ...}) will override any automatic recalculation, do so at your own risk.` ' +\n ' (read more here https://excaliburjs.com/docs/screens#understanding-viewport--resolution).');\n }\n }\n }\n this._canvas.width = this.scaledWidth;\n this._canvas.height = this.scaledHeight;\n if (this._canvasImageRendering === 'auto') {\n this._canvas.style.imageRendering = 'auto';\n }\n else {\n this._canvas.style.imageRendering = 'pixelated';\n // Fall back to 'crisp-edges' if 'pixelated' is not supported\n // Currently for firefox https://developer.mozilla.org/en-US/docs/Web/CSS/image-rendering\n if (this._canvas.style.imageRendering === '') {\n this._canvas.style.imageRendering = 'crisp-edges';\n }\n }\n const widthUnit = this.viewport.widthUnit === 'percent' ? '%' : 'px';\n const heightUnit = this.viewport.heightUnit === 'percent' ? '%' : 'px';\n this._canvas.style.width = this.viewport.width + widthUnit;\n this._canvas.style.height = this.viewport.height + heightUnit;\n // After messing with the canvas width/height the graphics context is invalidated and needs to have some properties reset\n this.graphicsContext.updateViewport(this.resolution);\n this.graphicsContext.resetTransform();\n this.graphicsContext.smoothing = this._antialiasing;\n if (this.graphicsContext instanceof _Graphics_Context_ExcaliburGraphicsContext2DCanvas__WEBPACK_IMPORTED_MODULE_5__.ExcaliburGraphicsContext2DCanvas) {\n this.graphicsContext.scale(this.pixelRatio, this.pixelRatio);\n }\n // Add the excalibur world pixel to page pixel\n document.documentElement.style.setProperty('--ex-pixel-ratio', this.worldToPagePixelRatio.toString());\n }\n /**\n * Get or set screen antialiasing,\n *\n * If true smoothing is applied\n */\n get antialiasing() {\n return this._antialiasing;\n }\n /**\n * Get or set screen antialiasing\n */\n set antialiasing(isSmooth) {\n this._antialiasing = isSmooth;\n this.graphicsContext.smoothing = this._antialiasing;\n }\n /**\n * Returns true if excalibur is fullscreen using the browser fullscreen api\n * @deprecated use isFullscreen()\n */\n get isFullScreen() {\n return this._isFullscreen;\n }\n /**\n * Returns true if excalibur is fullscreen using the browser fullscreen api\n */\n get isFullscreen() {\n return this._isFullscreen;\n }\n /**\n * Requests to go fullscreen using the browser fullscreen api, requires user interaction to be successful.\n * For example, wire this to a user click handler.\n *\n * Optionally specify a target element id to go fullscreen, by default the game canvas is used\n * @param elementId\n * @deprecated use enterFullscreen(...)\n */\n goFullScreen(elementId) {\n return this.enterFullscreen(elementId);\n }\n /**\n * Requests to enter fullscreen using the browser fullscreen api, requires user interaction to be successful.\n * For example, wire this to a user click handler.\n *\n * Optionally specify a target element id to go fullscreen, by default the game canvas is used\n * @param elementId\n */\n enterFullscreen(elementId) {\n if (elementId) {\n const maybeElement = document.getElementById(elementId);\n if (maybeElement) {\n if (!maybeElement.getAttribute('ex-fullscreen-listener')) {\n maybeElement.setAttribute('ex-fullscreen-listener', 'true');\n maybeElement.addEventListener('fullscreenchange', this._fullscreenChangeHandler);\n }\n const fullscreenPromise = maybeElement.requestFullscreen();\n return fullscreenPromise;\n }\n }\n return this._canvas.requestFullscreen();\n }\n /**\n * Requests to exit fullscreen using the browser fullscreen api\n * @deprecated use exitFullscreen()\n */\n exitFullScreen() {\n return this.exitFullscreen();\n }\n exitFullscreen() {\n return document.exitFullscreen();\n }\n _viewportToPixels(viewport) {\n return {\n width: viewport.widthUnit === 'percent' ? this.canvas.offsetWidth : viewport.width,\n height: viewport.heightUnit === 'percent' ? this.canvas.offsetHeight : viewport.height\n };\n }\n /**\n * Takes a coordinate in normal html page space, for example from a pointer move event, and translates it to\n * Excalibur screen space.\n *\n * Excalibur screen space starts at the top left (0, 0) corner of the viewport, and extends to the\n * bottom right corner (resolutionX, resolutionY). When using *AndFill suffixed display modes screen space\n * (0, 0) is the top left of the safe content area bounding box not the viewport.\n * @param point\n */\n pageToScreenCoordinates(point) {\n let newX = point.x;\n let newY = point.y;\n if (!this._isFullscreen) {\n newX -= (0,_Util_Util__WEBPACK_IMPORTED_MODULE_6__.getPosition)(this._canvas).x;\n newY -= (0,_Util_Util__WEBPACK_IMPORTED_MODULE_6__.getPosition)(this._canvas).y;\n }\n const viewport = this._viewportToPixels(this.viewport);\n // if fullscreen api on it centers with black bars\n // we need to adjust the screen to world coordinates in this case\n if (this._isFullscreen) {\n if (window.innerWidth / this.aspectRatio < window.innerHeight) {\n const screenHeight = window.innerWidth / this.aspectRatio;\n const screenMarginY = (window.innerHeight - screenHeight) / 2;\n newY = ((newY - screenMarginY) / screenHeight) * viewport.height;\n newX = (newX / window.innerWidth) * viewport.width;\n }\n else {\n const screenWidth = window.innerHeight * this.aspectRatio;\n const screenMarginX = (window.innerWidth - screenWidth) / 2;\n newX = ((newX - screenMarginX) / screenWidth) * viewport.width;\n newY = (newY / window.innerHeight) * viewport.height;\n }\n }\n newX = (newX / viewport.width) * this.resolution.width;\n newY = (newY / viewport.height) * this.resolution.height;\n // offset by content area\n newX = newX - this.contentArea.left;\n newY = newY - this.contentArea.top;\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(newX, newY);\n }\n /**\n * Takes a coordinate in Excalibur screen space, and translates it to normal html page space. For example,\n * this is where html elements might live if you want to position them relative to Excalibur.\n *\n * Excalibur screen space starts at the top left (0, 0) corner of the viewport, and extends to the\n * bottom right corner (resolutionX, resolutionY)\n * @param point\n */\n screenToPageCoordinates(point) {\n let newX = point.x;\n let newY = point.y;\n // no need to offset by content area, drawing is already offset by this\n const viewport = this._viewportToPixels(this.viewport);\n newX = (newX / this.resolution.width) * viewport.width;\n newY = (newY / this.resolution.height) * viewport.height;\n if (this._isFullscreen) {\n if (window.innerWidth / this.aspectRatio < window.innerHeight) {\n const screenHeight = window.innerWidth / this.aspectRatio;\n const screenMarginY = (window.innerHeight - screenHeight) / 2;\n newY = (newY / viewport.height) * screenHeight + screenMarginY;\n newX = (newX / viewport.width) * window.innerWidth;\n }\n else {\n const screenWidth = window.innerHeight * this.aspectRatio;\n const screenMarginX = (window.innerWidth - screenWidth) / 2;\n newX = (newX / viewport.width) * screenWidth + screenMarginX;\n newY = (newY / viewport.height) * window.innerHeight;\n }\n }\n if (!this._isFullscreen) {\n newX += (0,_Util_Util__WEBPACK_IMPORTED_MODULE_6__.getPosition)(this._canvas).x;\n newY += (0,_Util_Util__WEBPACK_IMPORTED_MODULE_6__.getPosition)(this._canvas).y;\n }\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(newX, newY);\n }\n /**\n * Takes a coordinate in Excalibur screen space, and translates it to Excalibur world space.\n *\n * World space is where {@apilink Entity | `entities`} in Excalibur live by default {@apilink CoordPlane.World}\n * and extends infinitely out relative from the {@apilink Camera}.\n * @param point Screen coordinate to convert\n */\n screenToWorldCoordinates(point) {\n // offset by content area\n point = point.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this.contentArea.left, this.contentArea.top));\n // the only difference between screen & world is the camera transform\n if (this._camera) {\n return this._camera.inverse.multiply(point);\n }\n return point.sub((0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this.resolution.width / 2, this.resolution.height / 2));\n }\n /**\n * Takes a coordinate in Excalibur world space, and translates it to Excalibur screen space.\n *\n * Screen space is where {@apilink ScreenElement | `screen elements`} and {@apilink Entity | `entities`} with {@apilink CoordPlane.Screen} live.\n * @param point World coordinate to convert\n */\n worldToScreenCoordinates(point) {\n if (this._camera) {\n return this._camera.transform.multiply(point);\n }\n return point.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this.resolution.width / 2, this.resolution.height / 2));\n }\n pageToWorldCoordinates(point) {\n const screen = this.pageToScreenCoordinates(point);\n return this.screenToWorldCoordinates(screen);\n }\n worldToPageCoordinates(point) {\n const screen = this.worldToScreenCoordinates(point);\n return this.screenToPageCoordinates(screen);\n }\n /**\n * Returns a BoundingBox of the top left corner of the screen\n * and the bottom right corner of the screen.\n *\n * World bounds are in world coordinates, useful for culling objects offscreen that are in world space\n */\n getWorldBounds() {\n const bounds = _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromDimension(this.resolution.width, this.resolution.height, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Half)\n .scale((0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(1 / this._camera.zoom, 1 / this._camera.zoom))\n .rotate(this._camera.rotation)\n .translate(this._camera.drawPos);\n return bounds;\n }\n /**\n * Returns a BoundingBox of the top left corner of the screen and the bottom right corner of the screen.\n *\n * Screen bounds are in screen coordinates, useful for culling objects offscreen that are in screen space\n */\n getScreenBounds() {\n const bounds = _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromDimension(this.resolution.width, this.resolution.height, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero);\n return bounds;\n }\n /**\n * The width of the game canvas in pixels (physical width component of the\n * resolution of the canvas element)\n */\n get canvasWidth() {\n return this.canvas.width;\n }\n /**\n * Returns half width of the game canvas in pixels (half physical width component)\n */\n get halfCanvasWidth() {\n return this.canvas.width / 2;\n }\n /**\n * The height of the game canvas in pixels, (physical height component of\n * the resolution of the canvas element)\n */\n get canvasHeight() {\n return this.canvas.height;\n }\n /**\n * Returns half height of the game canvas in pixels (half physical height component)\n */\n get halfCanvasHeight() {\n return this.canvas.height / 2;\n }\n /**\n * Returns the width of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get drawWidth() {\n if (this._camera) {\n return this.resolution.width / this._camera.zoom;\n }\n return this.resolution.width;\n }\n /**\n * Returns the width of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get width() {\n if (this._camera) {\n return this.resolution.width / this._camera.zoom;\n }\n return this.resolution.width;\n }\n /**\n * Returns half the width of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get halfDrawWidth() {\n return this.drawWidth / 2;\n }\n /**\n * Returns the height of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get drawHeight() {\n if (this._camera) {\n return this.resolution.height / this._camera.zoom;\n }\n return this.resolution.height;\n }\n get height() {\n if (this._camera) {\n return this.resolution.height / this._camera.zoom;\n }\n return this.resolution.height;\n }\n /**\n * Returns half the height of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get halfDrawHeight() {\n return this.drawHeight / 2;\n }\n /**\n * Returns screen center coordinates including zoom and device pixel ratio.\n */\n get center() {\n return (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this.halfDrawWidth, this.halfDrawHeight);\n }\n /**\n * Returns the content area in screen space where it is safe to place content\n */\n get contentArea() {\n return this._contentArea;\n }\n /**\n * Returns the unsafe area in screen space, this is the full screen and some space may not be onscreen.\n */\n get unsafeArea() {\n return this._unsafeArea;\n }\n _computeFit() {\n document.body.style.margin = '0px';\n document.body.style.overflow = 'hidden';\n const aspect = this.aspectRatio;\n let adjustedWidth = 0;\n let adjustedHeight = 0;\n if (window.innerWidth / aspect < window.innerHeight) {\n adjustedWidth = window.innerWidth;\n adjustedHeight = window.innerWidth / aspect;\n }\n else {\n adjustedWidth = window.innerHeight * aspect;\n adjustedHeight = window.innerHeight;\n }\n this.viewport = {\n width: adjustedWidth,\n height: adjustedHeight\n };\n this._contentArea = _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromDimension(this.resolution.width, this.resolution.height, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero);\n this._unsafeArea = _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromDimension(this.resolution.width, this.resolution.height, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero);\n this.events.emit('resize', {\n resolution: this.resolution,\n viewport: this.viewport\n });\n }\n _computeFitScreenAndFill() {\n document.body.style.margin = '0px';\n document.body.style.overflow = 'hidden';\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n this._computeFitAndFill(vw, vh);\n this.events.emit('resize', {\n resolution: this.resolution,\n viewport: this.viewport\n });\n }\n _computeFitContainerAndFill() {\n this.canvas.style.width = '100%';\n this.canvas.style.height = '100%';\n this._computeFitAndFill(this.canvas.offsetWidth, this.canvas.offsetHeight, {\n width: 100,\n widthUnit: 'percent',\n height: 100,\n heightUnit: 'percent'\n });\n this.events.emit('resize', {\n resolution: this.resolution,\n viewport: this.viewport\n });\n }\n _computeFitAndFill(vw, vh, viewport) {\n this.viewport = viewport !== null && viewport !== void 0 ? viewport : {\n width: vw,\n height: vh\n };\n // if the current screen aspectRatio is less than the original aspectRatio\n if (vw / vh <= this._contentResolution.width / this._contentResolution.height) {\n // compute new resolution to match the original aspect ratio\n this.resolution = {\n width: (vw * this._contentResolution.width) / vw,\n height: (((vw * this._contentResolution.width) / vw) * vh) / vw\n };\n const clip = (this.resolution.height - this._contentResolution.height) / 2;\n this._contentArea = new _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox({\n top: clip,\n left: 0,\n right: this._contentResolution.width,\n bottom: this.resolution.height - clip\n });\n this._unsafeArea = new _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox({\n top: -clip,\n left: 0,\n right: this._contentResolution.width,\n bottom: this.resolution.height + clip\n });\n }\n else {\n this.resolution = {\n width: (((vh * this._contentResolution.height) / vh) * vw) / vh,\n height: (vh * this._contentResolution.height) / vh\n };\n const clip = (this.resolution.width - this._contentResolution.width) / 2;\n this._contentArea = new _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox({\n top: 0,\n left: clip,\n right: this.resolution.width - clip,\n bottom: this._contentResolution.height\n });\n this._unsafeArea = new _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox({\n top: 0,\n left: -clip,\n right: this.resolution.width + clip,\n bottom: this._contentResolution.height\n });\n }\n }\n _computeFitScreenAndZoom() {\n document.body.style.margin = '0px';\n document.body.style.overflow = 'hidden';\n this.canvas.style.position = 'absolute';\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n this._computeFitAndZoom(vw, vh);\n this.events.emit('resize', {\n resolution: this.resolution,\n viewport: this.viewport\n });\n }\n _computeFitContainerAndZoom() {\n this.canvas.style.width = '100%';\n this.canvas.style.height = '100%';\n this.canvas.style.position = 'relative';\n const parent = this.canvas.parentElement;\n parent.style.overflow = 'hidden';\n const { offsetWidth: vw, offsetHeight: vh } = this.canvas;\n this._computeFitAndZoom(vw, vh);\n this.events.emit('resize', {\n resolution: this.resolution,\n viewport: this.viewport\n });\n }\n _computeFitAndZoom(vw, vh) {\n const aspect = this.aspectRatio;\n let adjustedWidth = 0;\n let adjustedHeight = 0;\n if (vw / aspect < vh) {\n adjustedWidth = vw;\n adjustedHeight = vw / aspect;\n }\n else {\n adjustedWidth = vh * aspect;\n adjustedHeight = vh;\n }\n const scaleX = vw / adjustedWidth;\n const scaleY = vh / adjustedHeight;\n const maxScaleFactor = Math.max(scaleX, scaleY);\n const zoomedWidth = adjustedWidth * maxScaleFactor;\n const zoomedHeight = adjustedHeight * maxScaleFactor;\n // Center zoomed dimension if bigger than the screen\n if (zoomedWidth > vw) {\n this.canvas.style.left = -(zoomedWidth - vw) / 2 + 'px';\n }\n else {\n this.canvas.style.left = '';\n }\n if (zoomedHeight > vh) {\n this.canvas.style.top = -(zoomedHeight - vh) / 2 + 'px';\n }\n else {\n this.canvas.style.top = '';\n }\n this.viewport = {\n width: zoomedWidth,\n height: zoomedHeight\n };\n const bounds = _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromDimension(this.viewport.width, this.viewport.height, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero);\n // return safe area\n if (this.viewport.width > vw) {\n const clip = ((this.viewport.width - vw) / this.viewport.width) * this.resolution.width;\n bounds.top = 0;\n bounds.left = clip / 2;\n bounds.right = this.resolution.width - clip / 2;\n bounds.bottom = this.resolution.height;\n }\n if (this.viewport.height > vh) {\n const clip = ((this.viewport.height - vh) / this.viewport.height) * this.resolution.height;\n bounds.top = clip / 2;\n bounds.left = 0;\n bounds.bottom = this.resolution.height - clip / 2;\n bounds.right = this.resolution.width;\n }\n this._contentArea = bounds;\n }\n _computeFitContainer() {\n const aspect = this.aspectRatio;\n let adjustedWidth = 0;\n let adjustedHeight = 0;\n let widthUnit = 'pixel';\n let heightUnit = 'pixel';\n const parent = this.canvas.parentElement;\n if (parent.clientWidth / aspect < parent.clientHeight) {\n this.canvas.style.width = '100%';\n adjustedWidth = 100;\n widthUnit = 'percent';\n adjustedHeight = this.canvas.offsetWidth / aspect;\n }\n else {\n this.canvas.style.height = '100%';\n adjustedHeight = 100;\n heightUnit = 'percent';\n adjustedWidth = this.canvas.offsetHeight * aspect;\n }\n this.viewport = {\n width: adjustedWidth,\n widthUnit,\n height: adjustedHeight,\n heightUnit\n };\n this._contentArea = _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromDimension(this.resolution.width, this.resolution.height, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero);\n this.events.emit('resize', {\n resolution: this.resolution,\n viewport: this.viewport\n });\n }\n _applyDisplayMode() {\n this._setResolutionAndViewportByDisplayMode(this.parent);\n // watch resizing\n if (this.parent instanceof Window) {\n this._browser.window.on('resize', this._resizeHandler);\n }\n else {\n this._resizeObserver = new ResizeObserver(() => {\n this._resizeHandler();\n });\n this._resizeObserver.observe(this.parent);\n }\n this.parent.addEventListener('resize', this._resizeHandler);\n }\n /**\n * Sets the resolution and viewport based on the selected display mode.\n */\n _setResolutionAndViewportByDisplayMode(parent) {\n if (this.displayMode === DisplayMode.FillContainer) {\n this.canvas.style.width = '100%';\n this.canvas.style.height = '100%';\n this.viewport = {\n width: 100,\n widthUnit: 'percent',\n height: 100,\n heightUnit: 'percent'\n };\n this.resolution = {\n width: this.canvas.offsetWidth,\n height: this.canvas.offsetHeight\n };\n }\n if (this.displayMode === DisplayMode.FillScreen) {\n document.body.style.margin = '0px';\n document.body.style.overflow = 'hidden';\n this.resolution = {\n width: parent.innerWidth,\n height: parent.innerHeight\n };\n this.viewport = this.resolution;\n }\n this._contentArea = _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromDimension(this.resolution.width, this.resolution.height, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero);\n if (this.displayMode === DisplayMode.FitScreen) {\n this._computeFit();\n }\n if (this.displayMode === DisplayMode.FitContainer) {\n this._computeFitContainer();\n }\n if (this.displayMode === DisplayMode.FitScreenAndFill) {\n this._computeFitScreenAndFill();\n }\n if (this.displayMode === DisplayMode.FitContainerAndFill) {\n this._computeFitContainerAndFill();\n }\n if (this.displayMode === DisplayMode.FitScreenAndZoom) {\n this._computeFitScreenAndZoom();\n }\n if (this.displayMode === DisplayMode.FitContainerAndZoom) {\n this._computeFitContainerAndZoom();\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./ScreenElement.ts\":\n/*!**************************!*\\\n !*** ./ScreenElement.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ScreenElement: () => (/* binding */ ScreenElement),\n/* harmony export */ isScreenElement: () => (/* binding */ isScreenElement)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Actor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Actor */ \"./Actor.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Collision/CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Math/coord-plane */ \"./Math/coord-plane.ts\");\n\n\n\n\n\n/**\n * Type guard to detect a screen element\n */\nfunction isScreenElement(actor) {\n return actor instanceof ScreenElement;\n}\n/**\n * Helper {@apilink Actor} primitive for drawing UI's, optimized for UI drawing. Does\n * not participate in collisions. Drawn on top of all other actors.\n */\nclass ScreenElement extends _Actor__WEBPACK_IMPORTED_MODULE_0__.Actor {\n constructor(config) {\n var _a, _b;\n super({ ...config });\n this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).coordPlane = _Math_coord_plane__WEBPACK_IMPORTED_MODULE_2__.CoordPlane.Screen;\n this.anchor = (_a = config === null || config === void 0 ? void 0 : config.anchor) !== null && _a !== void 0 ? _a : (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(0, 0);\n this.body.collisionType = (_b = config === null || config === void 0 ? void 0 : config.collisionType) !== null && _b !== void 0 ? _b : _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.PreventCollision;\n this.pointer.useGraphicsBounds = true;\n this.pointer.useColliderShape = false;\n if (!(config === null || config === void 0 ? void 0 : config.collider) && (config === null || config === void 0 ? void 0 : config.width) > 0 && (config === null || config === void 0 ? void 0 : config.height) > 0) {\n this.collider.useBoxCollider(this.width, this.height, this.anchor);\n }\n }\n _initialize(engine) {\n this._engine = engine;\n super._initialize(engine);\n }\n contains(x, y, useWorld = true) {\n if (useWorld) {\n return super.contains(x, y);\n }\n const coords = this._engine.worldToScreenCoordinates(new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(x, y));\n return super.contains(coords.x, coords.y);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./TileMap/IsometricEntityComponent.ts\":\n/*!*********************************************!*\\\n !*** ./TileMap/IsometricEntityComponent.ts ***!\n \\*********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ IsometricEntityComponent: () => (/* binding */ IsometricEntityComponent)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Component */ \"./EntityComponentSystem/Component.ts\");\n\nclass IsometricEntityComponent extends _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n /**\n * Specify the isometric map to use to position this entity's z-index\n * @param mapOrOptions\n */\n constructor(mapOrOptions) {\n super();\n /**\n * Vertical \"height\" in the isometric world\n */\n this.elevation = 0;\n this.columns = mapOrOptions.columns;\n this.rows = mapOrOptions.rows;\n this.tileWidth = mapOrOptions.tileWidth;\n this.tileHeight = mapOrOptions.tileHeight;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./TileMap/IsometricEntitySystem.ts\":\n/*!******************************************!*\\\n !*** ./TileMap/IsometricEntitySystem.ts ***!\n \\******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ IsometricEntitySystem: () => (/* binding */ IsometricEntitySystem)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _IsometricEntityComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./IsometricEntityComponent */ \"./TileMap/IsometricEntityComponent.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Priority.ts\");\n\n\n\n\nclass IsometricEntitySystem extends _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.System {\n constructor(world) {\n super();\n this.world = world;\n this.systemType = _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.SystemType.Update;\n this.query = this.world.query([_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent, _IsometricEntityComponent__WEBPACK_IMPORTED_MODULE_2__.IsometricEntityComponent]);\n }\n update() {\n let transform;\n let iso;\n for (let i = 0; i < this.query.entities.length; i++) {\n const entity = this.query.entities[i];\n transform = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n iso = entity.get(_IsometricEntityComponent__WEBPACK_IMPORTED_MODULE_2__.IsometricEntityComponent);\n const maxZindexPerElevation = Math.max(iso.columns * iso.tileWidth, iso.rows * iso.tileHeight);\n const newZ = maxZindexPerElevation * iso.elevation + transform.pos.y;\n transform.z = newZ;\n }\n }\n}\nIsometricEntitySystem.priority = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_3__.SystemPriority.Lower;\n\n\n/***/ }),\n\n/***/ \"./TileMap/IsometricMap.ts\":\n/*!*********************************!*\\\n !*** ./TileMap/IsometricMap.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ IsometricMap: () => (/* binding */ IsometricMap),\n/* harmony export */ IsometricTile: () => (/* binding */ IsometricTile)\n/* harmony export */ });\n/* harmony import */ var _Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Collision/BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../Collision/ColliderComponent */ \"./Collision/ColliderComponent.ts\");\n/* harmony import */ var _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Collision/CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Collision_Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../Collision/Colliders/CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Graphics */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../Graphics */ \"./Graphics/DebugGraphicsComponent.ts\");\n/* harmony import */ var _IsometricEntityComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./IsometricEntityComponent */ \"./TileMap/IsometricEntityComponent.ts\");\n/* harmony import */ var _Input_PointerComponent__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../Input/PointerComponent */ \"./Input/PointerComponent.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Input_PointerEventsToObjectDispatcher__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../Input/PointerEventsToObjectDispatcher */ \"./Input/PointerEventsToObjectDispatcher.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass IsometricTile extends _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__.Entity {\n getGraphics() {\n return this._graphics;\n }\n /**\n * Tile graphics\n */\n addGraphic(graphic, options) {\n this._graphics.push(graphic);\n this._gfx.isVisible = this.map.isVisible;\n this._gfx.opacity = this.map.opacity;\n if (options === null || options === void 0 ? void 0 : options.offset) {\n this._gfx.offset = options.offset;\n }\n // TODO detect when this changes on the map and apply to all tiles\n this._gfx.localBounds = this._recalculateBounds();\n }\n _recalculateBounds() {\n let bounds = this._tileBounds.clone();\n for (const graphic of this._graphics) {\n const offset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(this.map.graphicsOffset.x - this.map.tileWidth / 2, this.map.graphicsOffset.y - (this.map.renderFromTopOfGraphic ? 0 : graphic.height - this.map.tileHeight));\n bounds = bounds.combine(graphic.localBounds.translate(offset));\n }\n return bounds;\n }\n removeGraphic(graphic) {\n const index = this._graphics.indexOf(graphic);\n if (index > -1) {\n this._graphics.splice(index, 1);\n }\n this._gfx.localBounds = this._recalculateBounds();\n }\n clearGraphics() {\n this._graphics.length = 0;\n this._gfx.isVisible = false;\n this._gfx.localBounds = this._recalculateBounds();\n }\n getColliders() {\n return this._colliders;\n }\n /**\n * Adds a collider to the IsometricTile\n *\n * **Note!** the {@apilink Tile.solid} must be set to true for it to act as a \"fixed\" collider\n * @param collider\n */\n addCollider(collider) {\n this._colliders.push(collider);\n this.map.flagCollidersDirty();\n }\n /**\n * Removes a collider from the IsometricTile\n * @param collider\n */\n removeCollider(collider) {\n const index = this._colliders.indexOf(collider);\n if (index > -1) {\n this._colliders.splice(index, 1);\n }\n this.map.flagCollidersDirty();\n }\n /**\n * Clears all colliders from the IsometricTile\n */\n clearColliders() {\n this._colliders.length = 0;\n this.map.flagCollidersDirty();\n }\n /**\n * Returns the top left corner of the {@apilink IsometricTile} in world space\n */\n get pos() {\n return this.map.tileToWorld((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(this.x, this.y));\n }\n /**\n * Returns the center of the {@apilink IsometricTile}\n */\n get center() {\n return this.pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, this.map.tileHeight / 2));\n }\n /**\n * Construct a new IsometricTile\n * @param x tile coordinate in x (not world position)\n * @param y tile coordinate in y (not world position)\n * @param graphicsOffset offset that tile should be shifted by (default (0, 0))\n * @param map reference to owning IsometricMap\n */\n constructor(x, y, graphicsOffset, map) {\n super([\n new _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent(),\n new _Graphics__WEBPACK_IMPORTED_MODULE_3__.GraphicsComponent({\n offset: graphicsOffset !== null && graphicsOffset !== void 0 ? graphicsOffset : _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero,\n onPostDraw: (gfx, elapsed) => this.draw(gfx, elapsed)\n }),\n new _IsometricEntityComponent__WEBPACK_IMPORTED_MODULE_4__.IsometricEntityComponent(map)\n ]);\n /**\n * Indicates whether this tile is solid\n */\n this.solid = false;\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_5__.EventEmitter();\n this._tileBounds = new _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox();\n this._graphics = [];\n /**\n * Tile colliders\n */\n this._colliders = [];\n /**\n * Arbitrary data storage per tile, useful for any game specific data\n */\n this.data = new Map();\n this.x = x;\n this.y = y;\n this.map = map;\n this._transform = this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n this._isometricEntityComponent = this.get(_IsometricEntityComponent__WEBPACK_IMPORTED_MODULE_4__.IsometricEntityComponent);\n const halfTileWidth = this.map.tileWidth / 2;\n const halfTileHeight = this.map.tileHeight / 2;\n // See https://clintbellanger.net/articles/isometric_math/ for formula\n // The x position shifts left with every y step\n const xPos = (this.x - this.y) * halfTileWidth;\n // The y position needs to go down with every x step\n const yPos = (this.x + this.y) * halfTileHeight;\n this._transform.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(xPos, yPos);\n this._isometricEntityComponent.elevation = map.elevation;\n this._gfx = this.get(_Graphics__WEBPACK_IMPORTED_MODULE_3__.GraphicsComponent);\n this._gfx.isVisible = false; // start not visible\n const totalWidth = this.map.tileWidth;\n const totalHeight = this.map.tileHeight;\n // initial guess at gfx bounds based on the tile\n const offset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, this.map.renderFromTopOfGraphic ? totalHeight : 0);\n this._gfx.localBounds = this._tileBounds = new _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox({\n left: -totalWidth / 2,\n top: -totalHeight,\n right: totalWidth / 2,\n bottom: totalHeight\n }).translate(offset);\n }\n draw(gfx, _elapsed) {\n const halfTileWidth = this.map.tileWidth / 2;\n gfx.save();\n // shift left origin to corner of map, not the left corner of the first sprite\n gfx.translate(-halfTileWidth, 0);\n for (const graphic of this._graphics) {\n graphic.draw(gfx, this.map.graphicsOffset.x, this.map.graphicsOffset.y - (this.map.renderFromTopOfGraphic ? 0 : graphic.height - this.map.tileHeight));\n }\n gfx.restore();\n }\n}\n/**\n * The IsometricMap is a special tile map that provides isometric rendering support to Excalibur\n *\n * The tileWidth and tileHeight should be the height and width in pixels of the parallelogram of the base of the tile art asset.\n * The tileWidth and tileHeight is not necessarily the same as your graphic pixel width and height.\n *\n * Please refer to the docs https://excaliburjs.com for more details calculating what your tile width and height should be given\n * your art assets.\n */\nclass IsometricMap extends _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__.Entity {\n /**\n * Whether tiles should be visible\n * @deprecated use isVisible\n */\n get visible() {\n return this.isVisible;\n }\n /**\n * Whether tiles should be visible\n * @deprecated use isVisible\n */\n set visible(val) {\n this.isVisible = val;\n }\n constructor(options) {\n super([\n new _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent(),\n new _Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_7__.BodyComponent({\n type: _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_8__.CollisionType.Fixed\n }),\n new _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_9__.ColliderComponent(),\n new _Input_PointerComponent__WEBPACK_IMPORTED_MODULE_10__.PointerComponent(),\n new _Graphics__WEBPACK_IMPORTED_MODULE_11__.DebugGraphicsComponent((ctx, debugFlags) => this.debug(ctx, debugFlags), false)\n ], options.name);\n this.elevation = 0;\n /**\n * Whether tiles should be visible\n */\n this.isVisible = true;\n /**\n * Opacity of tiles\n */\n this.opacity = 1.0;\n /**\n * Render the tile graphic from the top instead of the bottom\n *\n * default is `false` meaning rendering from the bottom\n */\n this.renderFromTopOfGraphic = false;\n this.graphicsOffset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0);\n this._collidersDirty = false;\n this._originalOffsets = new WeakMap();\n const { pos, tileWidth, tileHeight, columns: width, rows: height, renderFromTopOfGraphic, graphicsOffset, elevation } = options;\n this.transform = this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n if (pos) {\n this.transform.pos = pos;\n }\n this.collider = this.get(_Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_9__.ColliderComponent);\n if (this.collider) {\n this.collider.set((this._composite = new _Collision_Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_12__.CompositeCollider([])));\n }\n this.pointer = this.get(_Input_PointerComponent__WEBPACK_IMPORTED_MODULE_10__.PointerComponent);\n this.renderFromTopOfGraphic = renderFromTopOfGraphic !== null && renderFromTopOfGraphic !== void 0 ? renderFromTopOfGraphic : this.renderFromTopOfGraphic;\n this.graphicsOffset = graphicsOffset !== null && graphicsOffset !== void 0 ? graphicsOffset : this.graphicsOffset;\n this.elevation = elevation !== null && elevation !== void 0 ? elevation : this.elevation;\n this.tileWidth = tileWidth;\n this.tileHeight = tileHeight;\n this.columns = width;\n this.rows = height;\n this._pointerEventDispatcher = new _Input_PointerEventsToObjectDispatcher__WEBPACK_IMPORTED_MODULE_13__.PointerEventsToObjectDispatcher();\n this.tiles = new Array(width * height);\n // build up tile representation\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const tile = new IsometricTile(x, y, this.graphicsOffset, this);\n this.tiles[x + y * width] = tile;\n this.addChild(tile);\n this._pointerEventDispatcher.addObject(tile, (p) => this.getTileByPoint(p.worldPos) === tile, () => true);\n }\n }\n this.pointer.localBounds = _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox.fromDimension(tileWidth * width * this.transform.scale.x, tileHeight * height * this.transform.scale.y, (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0.5, 0));\n }\n /**\n * @internal\n */\n _processPointerToObject(receiver) {\n this._pointerEventDispatcher.processPointerToObject(receiver, this.tiles);\n }\n /**\n * @internal\n */\n _dispatchPointerEvents(receiver) {\n this._pointerEventDispatcher.dispatchEvents(receiver, this.tiles);\n }\n update() {\n if (this._collidersDirty) {\n this.updateColliders();\n this._collidersDirty = false;\n }\n this._pointerEventDispatcher.clear();\n }\n flagCollidersDirty() {\n this._collidersDirty = true;\n }\n _getOrSetColliderOriginalOffset(collider) {\n var _a;\n if (!this._originalOffsets.has(collider)) {\n const originalOffset = collider.offset;\n this._originalOffsets.set(collider, originalOffset);\n return originalOffset;\n }\n else {\n return (_a = this._originalOffsets.get(collider)) !== null && _a !== void 0 ? _a : _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n }\n }\n updateColliders() {\n this._composite.clearColliders();\n const pos = this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent).pos;\n for (const tile of this.tiles) {\n if (tile.solid) {\n for (const collider of tile.getColliders()) {\n const originalOffset = this._getOrSetColliderOriginalOffset(collider);\n collider.offset = this.tileToWorld((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(tile.x, tile.y))\n .sub(pos)\n .add(originalOffset)\n .sub((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(this.tileWidth / 2, this.tileHeight)); // We need to unshift height based on drawing\n collider.owner = this;\n this._composite.addCollider(collider);\n }\n }\n }\n this.collider.update();\n }\n /**\n * Convert world space coordinates to the tile x, y coordinate\n * @param worldCoordinate\n */\n worldToTile(worldCoordinate) {\n // TODO I don't think this handles parent transform see TileMap\n worldCoordinate = worldCoordinate.sub(this.transform.globalPos);\n const halfTileWidth = this.tileWidth / 2;\n const halfTileHeight = this.tileHeight / 2;\n // See https://clintbellanger.net/articles/isometric_math/ for formula\n return (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(~~((worldCoordinate.x / halfTileWidth + worldCoordinate.y / halfTileHeight) / 2), ~~((worldCoordinate.y / halfTileHeight - worldCoordinate.x / halfTileWidth) / 2));\n }\n /**\n * Given a tile coordinate, return the top left corner in world space\n * @param tileCoordinate\n */\n tileToWorld(tileCoordinate) {\n const halfTileWidth = this.tileWidth / 2;\n const halfTileHeight = this.tileHeight / 2;\n // The x position shifts left with every y step\n const xPos = (tileCoordinate.x - tileCoordinate.y) * halfTileWidth;\n // The y position needs to go down with every x step\n const yPos = (tileCoordinate.x + tileCoordinate.y) * halfTileHeight;\n return (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(xPos, yPos).add(this.transform.pos);\n }\n /**\n * Returns the {@apilink IsometricTile} by its x and y coordinates\n */\n getTile(x, y) {\n if (x < 0 || y < 0 || x >= this.columns || y >= this.rows) {\n return null;\n }\n return this.tiles[x + y * this.columns];\n }\n /**\n * Returns the {@apilink IsometricTile} by testing a point in world coordinates,\n * returns `null` if no Tile was found.\n */\n getTileByPoint(point) {\n const tileCoord = this.worldToTile(point);\n const tile = this.getTile(tileCoord.x, tileCoord.y);\n return tile;\n }\n _getMaxZIndex() {\n let maxZ = Number.NEGATIVE_INFINITY;\n for (const tile of this.tiles) {\n const currentZ = tile.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent).z;\n if (currentZ > maxZ) {\n maxZ = currentZ;\n }\n }\n return maxZ;\n }\n /**\n * Debug draw for IsometricMap, called internally by excalibur when debug mode is toggled on\n * @param gfx\n */\n debug(gfx, debugFlags) {\n const { showAll, showPosition, positionColor, positionSize, showGrid, gridColor, gridWidth, showColliderGeometry } = debugFlags.isometric;\n const { geometryColor, geometryLineWidth, geometryPointSize } = debugFlags.collider;\n gfx.save();\n gfx.z = this._getMaxZIndex() + 0.5;\n if (showAll || showGrid) {\n for (let y = 0; y < this.rows + 1; y++) {\n const left = this.tileToWorld((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, y));\n const right = this.tileToWorld((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(this.columns, y));\n gfx.drawLine(left, right, gridColor, gridWidth);\n }\n for (let x = 0; x < this.columns + 1; x++) {\n const top = this.tileToWorld((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(x, 0));\n const bottom = this.tileToWorld((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(x, this.rows));\n gfx.drawLine(top, bottom, gridColor, gridWidth);\n }\n }\n if (showAll || showPosition) {\n for (const tile of this.tiles) {\n gfx.drawCircle(this.tileToWorld((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(tile.x, tile.y)), positionSize, positionColor);\n }\n }\n if (showAll || showColliderGeometry) {\n for (const tile of this.tiles) {\n if (tile.solid) {\n // only draw solid tiles\n for (const collider of tile.getColliders()) {\n collider.debug(gfx, geometryColor, { lineWidth: geometryLineWidth, pointSize: geometryPointSize });\n }\n }\n }\n }\n gfx.restore();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./TileMap/TileMap.ts\":\n/*!****************************!*\\\n !*** ./TileMap/TileMap.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Tile: () => (/* binding */ Tile),\n/* harmony export */ TileMap: () => (/* binding */ TileMap),\n/* harmony export */ TileMapEvents: () => (/* binding */ TileMapEvents)\n/* harmony export */ });\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Collision/BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Collision/CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Collision_Colliders_Shape__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../Collision/Colliders/Shape */ \"./Collision/Colliders/Shape.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Graphics */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../Graphics */ \"./Graphics/ParallaxComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../Collision/ColliderComponent */ \"./Collision/ColliderComponent.ts\");\n/* harmony import */ var _Graphics_DebugGraphicsComponent__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../Graphics/DebugGraphicsComponent */ \"./Graphics/DebugGraphicsComponent.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../Math/coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Input_PointerComponent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../Input/PointerComponent */ \"./Input/PointerComponent.ts\");\n/* harmony import */ var _Input_PointerEventsToObjectDispatcher__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../Input/PointerEventsToObjectDispatcher */ \"./Input/PointerEventsToObjectDispatcher.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst TileMapEvents = {\n PreUpdate: 'preupdate',\n PostUpdate: 'postupdate',\n PreDraw: 'predraw',\n PostDraw: 'postdraw',\n PointerUp: 'pointerup',\n PointerDown: 'pointerdown',\n PointerMove: 'pointermove',\n PointerCancel: 'pointercancel'\n};\n/**\n * The TileMap provides a mechanism for doing flat 2D tiles rendered in a grid.\n *\n * TileMaps are useful for top down or side scrolling grid oriented games.\n */\nclass TileMap extends _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__.Entity {\n flagCollidersDirty() {\n this._collidersDirty = true;\n }\n flagTilesDirty() {\n for (let i = 0; i < this.tiles.length; i++) {\n if (this.tiles[i]) {\n this.tiles[i].flagDirty();\n }\n }\n }\n get x() {\n var _a;\n return (_a = this.transform.pos.x) !== null && _a !== void 0 ? _a : 0;\n }\n set x(val) {\n var _a;\n if ((_a = this.transform) === null || _a === void 0 ? void 0 : _a.pos) {\n this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(val, this.y);\n }\n }\n get y() {\n var _a, _b;\n return (_b = (_a = this.transform) === null || _a === void 0 ? void 0 : _a.pos.y) !== null && _b !== void 0 ? _b : 0;\n }\n set y(val) {\n var _a;\n if ((_a = this.transform) === null || _a === void 0 ? void 0 : _a.pos) {\n this.transform.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(this.x, val);\n }\n }\n get z() {\n var _a;\n return (_a = this.transform.z) !== null && _a !== void 0 ? _a : 0;\n }\n set z(val) {\n if (this.transform) {\n this.transform.z = val;\n }\n }\n get rotation() {\n var _a, _b;\n return (_b = (_a = this.transform) === null || _a === void 0 ? void 0 : _a.rotation) !== null && _b !== void 0 ? _b : 0;\n }\n set rotation(val) {\n if (this.transform) {\n this.transform.rotation = val;\n }\n }\n get scale() {\n var _a, _b;\n return (_b = (_a = this.transform) === null || _a === void 0 ? void 0 : _a.scale) !== null && _b !== void 0 ? _b : _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.One;\n }\n set scale(val) {\n var _a;\n if ((_a = this.transform) === null || _a === void 0 ? void 0 : _a.scale) {\n this.transform.scale = val;\n }\n }\n get pos() {\n return this.transform.pos;\n }\n set pos(val) {\n this.transform.pos = val;\n }\n get vel() {\n return this._motion.vel;\n }\n set vel(val) {\n this._motion.vel = val;\n }\n /**\n * Width of the whole tile map in pixels\n */\n get width() {\n return this.tileWidth * this.columns * this.scale.x;\n }\n /**\n * Height of the whole tilemap in pixels\n */\n get height() {\n return this.tileHeight * this.rows * this.scale.y;\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n /**\n * @param options\n */\n constructor(options) {\n var _a, _b, _c;\n super([], options.name);\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_3__.EventEmitter();\n this._token = 0;\n this.logger = _Util_Log__WEBPACK_IMPORTED_MODULE_4__.Logger.getInstance();\n this.tiles = [];\n this._rows = [];\n this._cols = [];\n this.renderFromTopOfGraphic = false;\n this.meshingLookBehind = 10;\n this._collidersDirty = true;\n this._oldRotation = 0;\n this._originalOffsets = new WeakMap();\n this.meshingLookBehind = (_a = options.meshingLookBehind) !== null && _a !== void 0 ? _a : this.meshingLookBehind;\n this.addComponent(new _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent());\n this.addComponent(new _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_5__.MotionComponent());\n this.addComponent(new _Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_6__.BodyComponent({\n type: _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_7__.CollisionType.Fixed\n }));\n this.addComponent(new _Graphics__WEBPACK_IMPORTED_MODULE_8__.GraphicsComponent({\n onPostDraw: (ctx, elapsed) => this.draw(ctx, elapsed)\n }));\n this.addComponent(new _Graphics_DebugGraphicsComponent__WEBPACK_IMPORTED_MODULE_9__.DebugGraphicsComponent((ctx, debugFlags) => this.debug(ctx, debugFlags), false));\n this.addComponent(new _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_10__.ColliderComponent());\n this.addComponent(new _Input_PointerComponent__WEBPACK_IMPORTED_MODULE_11__.PointerComponent());\n this.pointer = this.get(_Input_PointerComponent__WEBPACK_IMPORTED_MODULE_11__.PointerComponent);\n this._graphics = this.get(_Graphics__WEBPACK_IMPORTED_MODULE_8__.GraphicsComponent);\n this.transform = this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._motion = this.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_5__.MotionComponent);\n this.collider = this.get(_Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_10__.ColliderComponent);\n this._composite = this.collider.useCompositeCollider([]);\n this.transform.pos = (_b = options.pos) !== null && _b !== void 0 ? _b : _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero;\n this._oldPos = this.transform.pos.clone();\n this._oldScale = this.transform.scale.clone();\n this.renderFromTopOfGraphic = (_c = options.renderFromTopOfGraphic) !== null && _c !== void 0 ? _c : this.renderFromTopOfGraphic;\n this.tileWidth = options.tileWidth;\n this.tileHeight = options.tileHeight;\n this.rows = options.rows;\n this.columns = options.columns;\n this._pointerEventDispatcher = new _Input_PointerEventsToObjectDispatcher__WEBPACK_IMPORTED_MODULE_12__.PointerEventsToObjectDispatcher();\n this.tiles = new Array(this.rows * this.columns);\n this._rows = new Array(this.rows);\n this._cols = new Array(this.columns);\n let currentCol = [];\n for (let i = 0; i < this.columns; i++) {\n for (let j = 0; j < this.rows; j++) {\n const tile = new Tile({\n x: i,\n y: j,\n map: this\n });\n tile.map = this;\n this.tiles[i + j * this.columns] = tile;\n this._pointerEventDispatcher.addObject(tile, (vec) => {\n // TODO handle geometry/graphics\n return tile.bounds.contains(vec.worldPos);\n }, () => true);\n currentCol.push(tile);\n if (!this._rows[j]) {\n this._rows[j] = [];\n }\n this._rows[j].push(tile);\n }\n this._cols[i] = currentCol;\n currentCol = [];\n }\n this._graphics.localBounds = new _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_13__.BoundingBox({\n left: 0,\n top: 0,\n right: this.columns * this.tileWidth * this.scale.x,\n bottom: this.rows * this.tileHeight * this.scale.y\n });\n }\n _initialize(engine) {\n super._initialize(engine);\n this._engine = engine;\n }\n _getOrSetColliderOriginalOffset(collider) {\n var _a;\n if (!this._originalOffsets.has(collider)) {\n const originalOffset = collider.offset;\n this._originalOffsets.set(collider, originalOffset);\n return originalOffset;\n }\n else {\n return (_a = this._originalOffsets.get(collider)) !== null && _a !== void 0 ? _a : _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero;\n }\n }\n /**\n * Tiles colliders based on the solid tiles in the tilemap.\n */\n _updateColliders() {\n this.collider.$colliderRemoved.notifyAll(this._composite);\n this._composite.clearColliders();\n const colliders = [];\n this._composite = this.collider.useCompositeCollider([]);\n let current = null;\n /**\n * Returns wether or not the 2 boxes share an edge and are the same height\n * @param prev\n * @param next\n * @returns true if they share and edge, false if not\n */\n const shareEdges = (prev, next) => {\n if (prev && next) {\n // same top/bottom\n return (prev.top === next.top &&\n prev.bottom === next.bottom &&\n // Shared right/left edge\n prev.right === next.left);\n }\n return false;\n };\n /**\n * Potentially merges the current collider into a list of previous ones, mutating the list\n * If checkAndCombine returns true, the collider was successfully merged and should be thrown away\n * @param current current collider to test\n * @param colliders List of colliders to consider merging with\n * @param maxLookBack The amount of colliders to look back for combination\n * @returns false when no combination found, true when successfully combined\n */\n const checkAndCombine = (current, colliders, maxLookBack = this.meshingLookBehind) => {\n if (!current) {\n return false;\n }\n // walk backwards through the list of colliders and combine with the first that shares an edge\n for (let i = colliders.length - 1; i >= 0; i--) {\n if (maxLookBack-- < 0) {\n // blunt the O(n^2) algorithm a bit\n return false;\n }\n const prev = colliders[i];\n if (shareEdges(prev, current)) {\n colliders[i] = prev.combine(current);\n return true;\n }\n }\n return false;\n };\n // ? configurable bias perhaps, horizontal strips vs. vertical ones\n // Bad tile collider packing algorithm\n for (let i = 0; i < this.columns; i++) {\n // Scan column for colliders\n for (let j = 0; j < this.rows; j++) {\n const tile = this.tiles[i + j * this.columns];\n // Current tile in column is solid build up current collider\n if (tile.solid) {\n // Use custom collider otherwise bounding box\n if (tile.getColliders().length > 0) {\n // tile with custom collider interrupting the current run\n for (const collider of tile.getColliders()) {\n const originalOffset = this._getOrSetColliderOriginalOffset(collider);\n collider.offset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(tile.x * this.tileWidth * this.scale.x, tile.y * this.tileHeight * this.scale.y).add(originalOffset);\n collider.owner = this;\n this._composite.addCollider(collider);\n }\n //we push any current collider before nulling the current run\n if (current && !checkAndCombine(current, colliders)) {\n colliders.push(current);\n }\n current = null;\n // Use the bounding box\n }\n else {\n if (!current) {\n // no current run, start one\n current = tile.defaultGeometry;\n }\n else {\n // combine with current run\n current = current.combine(tile.defaultGeometry);\n }\n }\n }\n else {\n // Not solid skip and cut off the current collider\n // End of run check and combine\n if (current && !checkAndCombine(current, colliders)) {\n colliders.push(current);\n }\n current = null;\n }\n }\n // After a column is complete check to see if it can be merged into the last one\n // Eno of run check and combine\n if (current && !checkAndCombine(current, colliders)) {\n // else new collider if no combination\n colliders.push(current);\n }\n current = null;\n }\n for (const c of colliders) {\n const collider = _Collision_Colliders_Shape__WEBPACK_IMPORTED_MODULE_14__.Shape.Box(c.width, c.height, _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero, (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(c.left - this.pos.x, c.top - this.pos.y));\n collider.owner = this;\n this._composite.addCollider(collider);\n }\n this.collider.update();\n // Notify that colliders have been updated\n this.collider.$colliderAdded.notifyAll(this._composite);\n }\n /**\n * Returns the {@apilink Tile} by index (row major order)\n *\n * Returns null if out of bounds\n */\n getTileByIndex(index) {\n var _a;\n return (_a = this.tiles[index]) !== null && _a !== void 0 ? _a : null;\n }\n /**\n * Returns the {@apilink Tile} by its x and y integer coordinates\n *\n * Returns null if out of bounds\n *\n * For example, if I want the tile in fifth column (x), and second row (y):\n * `getTile(4, 1)` 0 based, so 0 is the first in row/column\n */\n getTile(x, y) {\n if (x < 0 || y < 0 || x >= this.columns || y >= this.rows) {\n return null;\n }\n return this.tiles[x + y * this.columns];\n }\n /**\n * Returns the {@apilink Tile} by testing a point in world coordinates,\n * returns `null` if no Tile was found.\n */\n getTileByPoint(point) {\n const { x, y } = this._getTileCoordinates(point);\n const tile = this.getTile(x, y);\n if (x >= 0 && y >= 0 && x < this.columns && y < this.rows && tile) {\n return tile;\n }\n return null;\n }\n _getTileCoordinates(point) {\n // Convert to Tile Space point\n point = this.transform.applyInverse(point);\n const x = Math.floor(point.x / this.tileWidth);\n const y = Math.floor(point.y / this.tileHeight);\n return { x, y };\n }\n getRows() {\n return this._rows;\n }\n getColumns() {\n return this._cols;\n }\n /**\n * Returns the on screen tiles for a tilemap, this will overshoot by a small amount because of the internal quad tree data structure.\n *\n * Useful if you need to perform specific logic on onscreen tiles\n */\n getOnScreenTiles() {\n let worldBounds = this._engine.screen.getWorldBounds();\n const maybeParallax = this.get(_Graphics__WEBPACK_IMPORTED_MODULE_15__.ParallaxComponent);\n if (maybeParallax && this.isInitialized) {\n let pos = this.pos;\n const oneMinusFactor = _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.One.sub(maybeParallax.parallaxFactor);\n const parallaxOffset = this._engine.currentScene.camera.pos.scale(oneMinusFactor);\n pos = pos.sub(parallaxOffset);\n // adjust world bounds by parallax factor\n worldBounds = worldBounds.translate(pos);\n }\n const bounds = this.transform.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_16__.CoordPlane.Screen ? this._engine.screen.getScreenBounds() : worldBounds;\n const topLeft = this._getTileCoordinates(bounds.topLeft);\n const topRight = this._getTileCoordinates(bounds.topRight);\n const bottomRight = this._getTileCoordinates(bounds.bottomRight);\n const bottomLeft = this._getTileCoordinates(bounds.bottomLeft);\n const tileStartX = Math.min((0,_Math_util__WEBPACK_IMPORTED_MODULE_17__.clamp)(topLeft.x, 0, this.columns - 1), (0,_Math_util__WEBPACK_IMPORTED_MODULE_17__.clamp)(topRight.x, 0, this.columns - 1));\n const tileStartY = Math.min((0,_Math_util__WEBPACK_IMPORTED_MODULE_17__.clamp)(topLeft.y, 0, this.rows - 1), (0,_Math_util__WEBPACK_IMPORTED_MODULE_17__.clamp)(topRight.y, 0, this.rows - 1));\n const tileEndX = Math.max((0,_Math_util__WEBPACK_IMPORTED_MODULE_17__.clamp)(bottomRight.x, 0, this.columns - 1), (0,_Math_util__WEBPACK_IMPORTED_MODULE_17__.clamp)(bottomLeft.x, 0, this.columns - 1));\n const tileEndY = Math.max((0,_Math_util__WEBPACK_IMPORTED_MODULE_17__.clamp)(bottomRight.y, 0, this.rows - 1), (0,_Math_util__WEBPACK_IMPORTED_MODULE_17__.clamp)(bottomLeft.y, 0, this.rows - 1));\n const tiles = [];\n for (let x = tileStartX; x <= tileEndX; x++) {\n for (let y = tileStartY; y <= tileEndY; y++) {\n tiles.push(this.getTile(x, y));\n }\n }\n return tiles;\n }\n /**\n * @internal\n */\n _processPointerToObject(receiver) {\n this._pointerEventDispatcher.processPointerToObject(receiver, this.tiles);\n }\n /**\n * @internal\n */\n _dispatchPointerEvents(receiver) {\n this._pointerEventDispatcher.dispatchEvents(receiver, this.tiles);\n }\n update(engine, elapsed) {\n this._initialize(engine);\n this.onPreUpdate(engine, elapsed);\n this.emit('preupdate', new _Events__WEBPACK_IMPORTED_MODULE_18__.PreUpdateEvent(engine, elapsed, this));\n // Update colliders\n if (!this._oldPos.equals(this.pos) || this._oldRotation !== this.rotation || !this._oldScale.equals(this.scale)) {\n this.flagCollidersDirty();\n this.flagTilesDirty();\n }\n if (this._collidersDirty) {\n this._collidersDirty = false;\n this._updateColliders();\n }\n // Clear last frame's events\n this._pointerEventDispatcher.clear();\n this._token++;\n this.pos.clone(this._oldPos);\n this._oldRotation = this.rotation;\n this.scale.clone(this._oldScale);\n this.transform.pos = this.pos;\n this.onPostUpdate(engine, elapsed);\n this.emit('postupdate', new _Events__WEBPACK_IMPORTED_MODULE_18__.PostUpdateEvent(engine, elapsed, this));\n }\n /**\n * Draws the tile map to the screen. Called by the {@apilink Scene}.\n * @param ctx ExcaliburGraphicsContext\n * @param elapsed The number of milliseconds since the last draw\n */\n draw(ctx, elapsed) {\n if (!this.isInitialized) {\n return;\n }\n this.emit('predraw', new _Events__WEBPACK_IMPORTED_MODULE_18__.PreDrawEvent(ctx, elapsed, this)); // TODO fix event\n let graphics, graphicsIndex, graphicsLen;\n const tiles = this.getOnScreenTiles();\n for (let i = 0; i < tiles.length; i++) {\n const tile = tiles[i];\n // get non-negative tile sprites\n const offsets = tile.getGraphicsOffsets();\n graphics = tile.getGraphics();\n for (graphicsIndex = 0, graphicsLen = graphics.length; graphicsIndex < graphicsLen; graphicsIndex++) {\n // draw sprite, warning if sprite doesn't exist\n const graphic = graphics[graphicsIndex];\n const offset = offsets[graphicsIndex];\n if (graphic) {\n if ((0,_Graphics__WEBPACK_IMPORTED_MODULE_8__.hasGraphicsTick)(graphic)) {\n graphic === null || graphic === void 0 ? void 0 : graphic.tick(elapsed, this._token);\n }\n const offsetY = this.renderFromTopOfGraphic ? 0 : graphic.height - this.tileHeight;\n graphic.draw(ctx, tile.x * this.tileWidth + offset.x, tile.y * this.tileHeight - offsetY + offset.y);\n }\n }\n }\n this.emit('postdraw', new _Events__WEBPACK_IMPORTED_MODULE_18__.PostDrawEvent(ctx, elapsed, this));\n }\n debug(gfx, debugFlags) {\n const { showAll, showGrid, gridColor, gridWidth, showSolidBounds: showColliderBounds, solidBoundsColor: colliderBoundsColor, showColliderGeometry } = debugFlags.tilemap;\n const { geometryColor, geometryLineWidth, geometryPointSize } = debugFlags.collider;\n const width = this.tileWidth * this.columns * this.scale.x;\n const height = this.tileHeight * this.rows * this.scale.y;\n const pos = this.pos;\n if (showGrid || showAll) {\n for (let r = 0; r < this.rows + 1; r++) {\n const yOffset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(0, r * this.tileHeight * this.scale.y);\n gfx.drawLine(pos.add(yOffset), pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(width, yOffset.y)), gridColor, gridWidth);\n }\n for (let c = 0; c < this.columns + 1; c++) {\n const xOffset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(c * this.tileWidth * this.scale.x, 0);\n gfx.drawLine(pos.add(xOffset), pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(xOffset.x, height)), gridColor, gridWidth);\n }\n }\n if (showAll || showColliderBounds || showColliderGeometry) {\n const colliders = this._composite.getColliders();\n gfx.save();\n gfx.translate(this.pos.x, this.pos.y);\n gfx.scale(this.scale.x, this.scale.y);\n for (const collider of colliders) {\n const bounds = collider.localBounds;\n const pos = collider.worldPos.sub(this.pos);\n if (showColliderBounds) {\n gfx.drawRectangle(pos, bounds.width, bounds.height, colliderBoundsColor);\n }\n }\n gfx.restore();\n if (showColliderGeometry) {\n for (const collider of colliders) {\n collider.debug(gfx, geometryColor, { lineWidth: geometryLineWidth, pointSize: geometryPointSize });\n }\n }\n }\n if (showAll || showColliderBounds) {\n gfx.save();\n gfx.z = 999;\n if (showColliderBounds) {\n for (let i = 0; i < this.tiles.length; i++) {\n this.tiles[i].bounds.draw(gfx);\n }\n }\n gfx.restore();\n }\n }\n}\n/**\n * TileMap Tile\n *\n * A light-weight object that occupies a space in a collision map. Generally\n * created by a {@apilink TileMap}.\n *\n * Tiles can draw multiple sprites. Note that the order of drawing is the order\n * of the sprites in the array so the last one will be drawn on top. You can\n * use transparency to create layers this way.\n */\nclass Tile {\n /**\n * Return the world position of the top left corner of the tile\n */\n get pos() {\n if (this._posDirty) {\n this._recalculate();\n this._posDirty = false;\n }\n return this._pos;\n }\n /**\n * Width of the tile in pixels\n */\n get width() {\n return this._width;\n }\n /**\n * Height of the tile in pixels\n */\n get height() {\n return this._height;\n }\n /**\n * Wether this tile should be treated as solid by the tilemap\n */\n get solid() {\n return this._solid;\n }\n /**\n * Wether this tile should be treated as solid by the tilemap\n */\n set solid(val) {\n var _a;\n (_a = this.map) === null || _a === void 0 ? void 0 : _a.flagCollidersDirty();\n this._solid = val;\n }\n /**\n * Current list of graphics for this tile\n */\n getGraphics() {\n return this._graphics;\n }\n /**\n * Current list of offsets for this tile's graphics\n */\n getGraphicsOffsets() {\n return this._offsets;\n }\n /**\n * Add another {@apilink Graphic} to this TileMap tile\n * @param graphic\n */\n addGraphic(graphic, options) {\n this._graphics.push(graphic);\n if (options === null || options === void 0 ? void 0 : options.offset) {\n this._offsets.push(options.offset);\n }\n else {\n this._offsets.push(_Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero);\n }\n }\n /**\n * Remove an instance of a {@apilink Graphic} from this tile\n */\n removeGraphic(graphic) {\n const index = this._graphics.indexOf(graphic);\n if (index > -1) {\n this._graphics.splice(index, 1);\n this._offsets.splice(index, 1);\n }\n }\n /**\n * Clear all graphics from this tile\n */\n clearGraphics() {\n this._graphics.length = 0;\n this._offsets.length = 0;\n }\n /**\n * Returns the list of colliders\n */\n getColliders() {\n return this._colliders;\n }\n /**\n * Adds a custom collider to the {@apilink Tile} to use instead of it's bounds\n *\n * If no collider is set but {@apilink Tile.solid} is set, the tile bounds are used as a collider.\n *\n * **Note!** the {@apilink Tile.solid} must be set to true for it to act as a \"fixed\" collider\n * @param collider\n */\n addCollider(collider) {\n this._colliders.push(collider);\n this.map.flagCollidersDirty();\n }\n /**\n * Removes a collider from the {@apilink Tile}\n * @param collider\n */\n removeCollider(collider) {\n const index = this._colliders.indexOf(collider);\n if (index > -1) {\n this._colliders.splice(index, 1);\n }\n this.map.flagCollidersDirty();\n }\n /**\n * Clears all colliders from the {@apilink Tile}\n */\n clearColliders() {\n this._colliders.length = 0;\n this.map.flagCollidersDirty();\n }\n constructor(options) {\n var _a, _b;\n this._posDirty = false;\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_3__.EventEmitter();\n this._solid = false;\n this._graphics = [];\n this._offsets = [];\n /**\n * Current list of colliders for this tile\n */\n this._colliders = [];\n /**\n * Arbitrary data storage per tile, useful for any game specific data\n */\n this.data = new Map();\n this.x = options.x;\n this.y = options.y;\n this.map = options.map;\n this._width = options.map.tileWidth * this.map.scale.x;\n this._height = options.map.tileHeight * this.map.scale.y;\n this.solid = (_a = options.solid) !== null && _a !== void 0 ? _a : this.solid;\n this._graphics = (_b = options.graphics) !== null && _b !== void 0 ? _b : [];\n this._recalculate();\n }\n flagDirty() {\n return (this._posDirty = true);\n }\n _recalculate() {\n const geometryPos = this.map.pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(this.x * this.map.tileWidth, this.y * this.map.tileHeight));\n this._geometry = new _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_13__.BoundingBox(geometryPos.x, geometryPos.y, geometryPos.x + this.map.tileWidth, geometryPos.y + this.map.tileHeight);\n this._width = this.map.tileWidth * this.map.scale.x;\n this._height = this.map.tileHeight * this.map.scale.y;\n this._pos = this.map.pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(this.x * this._width, this.y * this._height));\n this._bounds = new _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_13__.BoundingBox(this._pos.x, this._pos.y, this._pos.x + this._width, this._pos.y + this._height);\n if (this.map.rotation) {\n this._bounds = this._bounds.rotate(this.map.rotation, this.map.pos);\n }\n this._posDirty = false;\n }\n /**\n * Tile bounds in world space\n */\n get bounds() {\n if (this._posDirty) {\n this._recalculate();\n }\n return this._bounds;\n }\n get defaultGeometry() {\n return this._geometry;\n }\n /**\n * Tile position in world space\n */\n get center() {\n if (this._posDirty) {\n this._recalculate();\n }\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._pos.x + this._width / 2, this._pos.y + this._height / 2);\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n if (handler) {\n this.events.off(eventName, handler);\n }\n else {\n this.events.off(eventName);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./TileMap/index.ts\":\n/*!**************************!*\\\n !*** ./TileMap/index.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ IsometricEntityComponent: () => (/* reexport safe */ _IsometricEntityComponent__WEBPACK_IMPORTED_MODULE_2__.IsometricEntityComponent),\n/* harmony export */ IsometricEntitySystem: () => (/* reexport safe */ _IsometricEntitySystem__WEBPACK_IMPORTED_MODULE_3__.IsometricEntitySystem),\n/* harmony export */ IsometricMap: () => (/* reexport safe */ _IsometricMap__WEBPACK_IMPORTED_MODULE_1__.IsometricMap),\n/* harmony export */ IsometricTile: () => (/* reexport safe */ _IsometricMap__WEBPACK_IMPORTED_MODULE_1__.IsometricTile),\n/* harmony export */ Tile: () => (/* reexport safe */ _TileMap__WEBPACK_IMPORTED_MODULE_0__.Tile),\n/* harmony export */ TileMap: () => (/* reexport safe */ _TileMap__WEBPACK_IMPORTED_MODULE_0__.TileMap),\n/* harmony export */ TileMapEvents: () => (/* reexport safe */ _TileMap__WEBPACK_IMPORTED_MODULE_0__.TileMapEvents)\n/* harmony export */ });\n/* harmony import */ var _TileMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./TileMap */ \"./TileMap/TileMap.ts\");\n/* harmony import */ var _IsometricMap__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./IsometricMap */ \"./TileMap/IsometricMap.ts\");\n/* harmony import */ var _IsometricEntityComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./IsometricEntityComponent */ \"./TileMap/IsometricEntityComponent.ts\");\n/* harmony import */ var _IsometricEntitySystem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./IsometricEntitySystem */ \"./TileMap/IsometricEntitySystem.ts\");\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Timer.ts\":\n/*!******************!*\\\n !*** ./Timer.ts ***!\n \\******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Timer: () => (/* binding */ Timer)\n/* harmony export */ });\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Math_Random__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Math/Random */ \"./Math/Random.ts\");\n\n\n/**\n * The Excalibur timer hooks into the internal timer and fires callbacks,\n * after a certain interval, optionally repeating.\n */\nclass Timer {\n get complete() {\n return this._complete;\n }\n constructor(options) {\n var _a;\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance();\n this.id = 0;\n this._elapsedTime = 0;\n this._totalTimeAlive = 0;\n this._running = false;\n this._numberOfTicks = 0;\n this.interval = 10;\n this.repeats = false;\n this.maxNumberOfRepeats = -1;\n this.randomRange = [0, 0];\n this._baseInterval = 10;\n this._generateRandomInterval = () => {\n return this._baseInterval + this.random.integer(this.randomRange[0], this.randomRange[1]);\n };\n this._complete = false;\n this.scene = null;\n const fcn = (_a = options.action) !== null && _a !== void 0 ? _a : options.fcn;\n const interval = options.interval;\n const repeats = options.repeats;\n const numberOfRepeats = options.numberOfRepeats;\n const randomRange = options.randomRange;\n const random = options.random;\n if (!!numberOfRepeats && numberOfRepeats >= 0) {\n this.maxNumberOfRepeats = numberOfRepeats;\n if (!repeats) {\n throw new Error('repeats must be set to true if numberOfRepeats is set');\n }\n }\n this.id = Timer._MAX_ID++;\n this._callbacks = [];\n this._baseInterval = this.interval = interval;\n if (!!randomRange) {\n if (randomRange[0] > randomRange[1]) {\n throw new Error('min value must be lower than max value for range');\n }\n //We use the instance of ex.Random to generate the range\n this.random = random !== null && random !== void 0 ? random : new _Math_Random__WEBPACK_IMPORTED_MODULE_1__.Random();\n this.randomRange = randomRange;\n this.interval = this._generateRandomInterval();\n this.on(() => {\n this.interval = this._generateRandomInterval();\n });\n }\n this.repeats = repeats || this.repeats;\n if (fcn) {\n this.on(fcn);\n }\n }\n /**\n * Adds a new callback to be fired after the interval is complete\n * @param action The callback to be added to the callback list, to be fired after the interval is complete.\n */\n on(action) {\n this._callbacks.push(action);\n }\n /**\n * Removes a callback from the callback list to be fired after the interval is complete.\n * @param action The callback to be removed from the callback list, to be fired after the interval is complete.\n */\n off(action) {\n const index = this._callbacks.indexOf(action);\n this._callbacks.splice(index, 1);\n }\n /**\n * Updates the timer after a certain number of milliseconds have elapsed. This is used internally by the engine.\n * @param elapsed Number of elapsed milliseconds since the last update.\n */\n update(elapsed) {\n if (this._running) {\n this._totalTimeAlive += elapsed;\n this._elapsedTime += elapsed;\n if (this.maxNumberOfRepeats > -1 && this._numberOfTicks >= this.maxNumberOfRepeats) {\n this._complete = true;\n this._running = false;\n this._elapsedTime = 0;\n }\n if (!this.complete && this._elapsedTime >= this.interval) {\n this._callbacks.forEach((c) => {\n c.call(this);\n });\n this._numberOfTicks++;\n if (this.repeats) {\n this._elapsedTime = 0;\n }\n else {\n this._complete = true;\n this._running = false;\n this._elapsedTime = 0;\n }\n }\n }\n }\n /**\n * Resets the timer so that it can be reused, and optionally reconfigure the timers interval.\n *\n * Warning** you may need to call `timer.start()` again if the timer had completed\n * @param newInterval If specified, sets a new non-negative interval in milliseconds to refire the callback\n * @param newNumberOfRepeats If specified, sets a new non-negative upper limit to the number of time this timer executes\n */\n reset(newInterval, newNumberOfRepeats) {\n if (!!newInterval && newInterval >= 0) {\n this._baseInterval = this.interval = newInterval;\n }\n if (!!this.maxNumberOfRepeats && this.maxNumberOfRepeats >= 0) {\n this.maxNumberOfRepeats = newNumberOfRepeats;\n if (!this.repeats) {\n throw new Error('repeats must be set to true if numberOfRepeats is set');\n }\n }\n this._complete = false;\n this._elapsedTime = 0;\n this._numberOfTicks = 0;\n }\n get timesRepeated() {\n return this._numberOfTicks;\n }\n getTimeRunning() {\n return this._totalTimeAlive;\n }\n /**\n * @returns milliseconds until the next action callback, if complete will return 0\n */\n get timeToNextAction() {\n if (this.complete) {\n return 0;\n }\n return this.interval - this._elapsedTime;\n }\n /**\n * @returns milliseconds elapsed toward the next action\n */\n get timeElapsedTowardNextAction() {\n return this._elapsedTime;\n }\n get isRunning() {\n return this._running;\n }\n /**\n * Pauses the timer, time will no longer increment towards the next call\n */\n pause() {\n this._running = false;\n return this;\n }\n /**\n * Resumes the timer, time will now increment towards the next call.\n */\n resume() {\n this._running = true;\n return this;\n }\n /**\n * Starts the timer, if the timer was complete it will restart the timer and reset the elapsed time counter\n */\n start() {\n if (!this.scene) {\n this._logger.warn('Cannot start a timer not part of a scene, timer wont start until added');\n }\n this._running = true;\n if (this.complete) {\n this._complete = false;\n this._elapsedTime = 0;\n this._numberOfTicks = 0;\n }\n return this;\n }\n /**\n * Stops the timer and resets the elapsed time counter towards the next action invocation\n */\n stop() {\n this._running = false;\n this._elapsedTime = 0;\n this._numberOfTicks = 0;\n return this;\n }\n /**\n * Cancels the timer, preventing any further executions.\n */\n cancel() {\n this.pause();\n if (this.scene) {\n this.scene.cancelTimer(this);\n }\n }\n}\nTimer._MAX_ID = 0;\n\n\n/***/ }),\n\n/***/ \"./Trigger.ts\":\n/*!********************!*\\\n !*** ./Trigger.ts ***!\n \\********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Trigger: () => (/* binding */ Trigger),\n/* harmony export */ TriggerEvents: () => (/* binding */ TriggerEvents)\n/* harmony export */ });\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Events */ \"./Events.ts\");\n/* harmony import */ var _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Collision/CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Actor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Actor */ \"./Actor.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n\nconst TriggerEvents = {\n ExitTrigger: 'exit',\n EnterTrigger: 'enter'\n};\n/**\n * Triggers are a method of firing arbitrary code on collision. These are useful\n * as 'buttons', 'switches', or to trigger effects in a game. By default triggers\n * are invisible, and can only be seen when {@apilink Trigger.visible} is set to `true`.\n */\nclass Trigger extends _Actor__WEBPACK_IMPORTED_MODULE_0__.Actor {\n /**\n * @param options Trigger options\n */\n constructor(options) {\n var _a, _b, _c, _d;\n super({ ...options });\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_1__.EventEmitter();\n this.filter = (_a = options.filter) !== null && _a !== void 0 ? _a : (() => true);\n this.repeat = (_b = options.repeat) !== null && _b !== void 0 ? _b : -1;\n this.action = (_c = options.action) !== null && _c !== void 0 ? _c : (() => undefined);\n this.target = options.target;\n this.graphics.isVisible = (_d = options.visible) !== null && _d !== void 0 ? _d : false;\n this.body.collisionType = _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.Passive;\n this.events.on('collisionstart', ({ other: collider }) => {\n if (!this._matchesTarget(collider.owner)) {\n return;\n }\n this.events.emit('enter', new _Events__WEBPACK_IMPORTED_MODULE_3__.EnterTriggerEvent(this, collider.owner));\n this._dispatchAction(collider.owner);\n // remove trigger if its done, -1 repeat forever\n if (this.repeat === 0) {\n this.kill();\n }\n });\n this.events.on('collisionend', ({ other: collider }) => {\n if (this._matchesTarget(collider.owner)) {\n this.events.emit('exit', new _Events__WEBPACK_IMPORTED_MODULE_3__.ExitTriggerEvent(this, collider.owner));\n }\n });\n }\n _matchesTarget(entity) {\n return this.filter(entity) && (this.target === undefined || this.target === entity);\n }\n _dispatchAction(target) {\n if (this.repeat !== 0) {\n this.action.call(this, target);\n this.repeat--;\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Assert.ts\":\n/*!************************!*\\\n !*** ./Util/Assert.ts ***!\n \\************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ assert: () => (/* binding */ assert)\n/* harmony export */ });\n/**\n * Asserts will throw in `process.env.NODE_ENV === 'development'` builds if the expression evaluates false\n */\nfunction assert(message, expression) {\n if (true) {\n if (!expression()) {\n throw new Error(message);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Browser.ts\":\n/*!*************************!*\\\n !*** ./Util/Browser.ts ***!\n \\*************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BrowserComponent: () => (/* binding */ BrowserComponent),\n/* harmony export */ BrowserEvents: () => (/* binding */ BrowserEvents)\n/* harmony export */ });\nclass BrowserComponent {\n on(eventName, handler) {\n if (this._nativeHandlers[eventName]) {\n this.off(eventName, this._nativeHandlers[eventName]);\n }\n this._nativeHandlers[eventName] = this._decorate(handler);\n this.nativeComponent.addEventListener(eventName, this._nativeHandlers[eventName]);\n }\n off(eventName, handler) {\n if (!handler) {\n handler = this._nativeHandlers[eventName];\n }\n this.nativeComponent.removeEventListener(eventName, handler);\n this._nativeHandlers[eventName] = null;\n }\n _decorate(handler) {\n return (evt) => {\n if (!this._paused) {\n handler(evt);\n }\n };\n }\n pause() {\n this._paused = true;\n }\n resume() {\n this._paused = false;\n }\n clear() {\n for (const event in this._nativeHandlers) {\n this.off(event);\n }\n }\n constructor(nativeComponent) {\n this.nativeComponent = nativeComponent;\n this._paused = false;\n this._nativeHandlers = {};\n }\n}\nclass BrowserEvents {\n constructor(_windowGlobal, _documentGlobal) {\n this._windowGlobal = _windowGlobal;\n this._documentGlobal = _documentGlobal;\n this._windowComponent = new BrowserComponent(this._windowGlobal);\n this._documentComponent = new BrowserComponent(this._documentGlobal);\n }\n get window() {\n return this._windowComponent;\n }\n get document() {\n return this._documentComponent;\n }\n pause() {\n this.window.pause();\n this.document.pause();\n }\n resume() {\n this.window.resume();\n this.document.resume();\n }\n clear() {\n this.window.clear();\n this.document.clear();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Clock.ts\":\n/*!***********************!*\\\n !*** ./Util/Clock.ts ***!\n \\***********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Clock: () => (/* binding */ Clock),\n/* harmony export */ StandardClock: () => (/* binding */ StandardClock),\n/* harmony export */ TestClock: () => (/* binding */ TestClock)\n/* harmony export */ });\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Fps__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Fps */ \"./Util/Fps.ts\");\n\n\n/**\n * Abstract Clock is the base type of all Clocks\n *\n * It has a few opinions\n * 1. It manages the calculation of what \"elapsed\" time means and thus maximum fps\n * 2. The default timing api is implemented in now()\n *\n * To implement your own clock, extend Clock and override start/stop to start and stop the clock, then call update() with whatever\n * method is unique to your clock implementation.\n */\nclass Clock {\n constructor(options) {\n var _a, _b, _c;\n this._onFatalException = () => {\n /* default nothing */\n };\n this._maxFps = Infinity;\n this._lastTime = 0;\n this._elapsed = 1;\n this._scheduledCbs = [];\n this._totalElapsed = 0;\n this._options = options;\n this.tick = options.tick;\n this._lastTime = (_a = this.now()) !== null && _a !== void 0 ? _a : 0;\n this._maxFps = (_b = options.maxFps) !== null && _b !== void 0 ? _b : this._maxFps;\n this._onFatalException = (_c = options.onFatalException) !== null && _c !== void 0 ? _c : this._onFatalException;\n this.fpsSampler = new _Fps__WEBPACK_IMPORTED_MODULE_0__.FpsSampler({\n initialFps: 60,\n nowFn: () => this.now()\n });\n }\n /**\n * Get the elapsed time for the last completed frame\n */\n elapsed() {\n return this._elapsed;\n }\n /**\n * Get the current time in milliseconds\n */\n now() {\n return performance.now();\n }\n toTestClock() {\n const testClock = new TestClock({\n ...this._options,\n defaultUpdateMs: 16.6\n });\n return testClock;\n }\n toStandardClock() {\n const clock = new StandardClock({\n ...this._options\n });\n return clock;\n }\n setFatalExceptionHandler(handler) {\n this._onFatalException = handler;\n }\n /**\n * Schedule a callback to fire given a timeout in milliseconds using the excalibur {@apilink Clock}\n *\n * This is useful to use over the built in browser `setTimeout` because callbacks will be tied to the\n * excalibur update clock, instead of browser time, this means that callbacks wont fire if the game is\n * stopped or paused.\n * @param cb callback to fire\n * @param timeoutMs Optionally specify a timeout in milliseconds from now, default is 0ms which means the next possible tick\n * @param timing Optionally specify a timeout in milliseconds from now, default is 0ms which means the next possible tick\n */\n schedule(cb, timeoutMs = 0, timing = 'preframe') {\n // Scheduled based on internal elapsed time\n const scheduledTime = this._totalElapsed + timeoutMs;\n this._scheduledCbs.push([cb, scheduledTime, timing]);\n }\n /**\n * Called internally to trigger scheduled callbacks in the clock\n * @param timing\n * @internal\n */\n __runScheduledCbs(timing = 'preframe') {\n // walk backwards to delete items as we loop\n for (let i = this._scheduledCbs.length - 1; i > -1; i--) {\n if (timing === this._scheduledCbs[i][2] && this._scheduledCbs[i][1] <= this._totalElapsed) {\n this._scheduledCbs[i][0](this._elapsed);\n this._scheduledCbs.splice(i, 1);\n }\n }\n }\n update(overrideUpdateMs) {\n try {\n this.fpsSampler.start();\n // Get the time to calculate time-elapsed\n const now = this.now();\n let elapsed = now - this._lastTime || 1; // first frame\n // Constrain fps\n const fpsInterval = 1000 / this._maxFps;\n // only run frame if enough time has elapsed\n if (elapsed >= fpsInterval) {\n let leftover = 0;\n if (fpsInterval !== 0) {\n leftover = elapsed % fpsInterval;\n elapsed = elapsed - leftover; // shift elapsed to be \"in phase\" with the current loop fps\n }\n // Resolves issue #138 if the game has been paused, or blurred for\n // more than a 200 milliseconds, reset elapsed time to 1. This improves reliability\n // and provides more expected behavior when the engine comes back\n // into focus\n if (elapsed > 200) {\n elapsed = 1;\n }\n // tick the mainloop and run scheduled callbacks\n this._elapsed = overrideUpdateMs || elapsed;\n this._totalElapsed += this._elapsed;\n this.__runScheduledCbs('preframe');\n this.tick(overrideUpdateMs || elapsed);\n this.__runScheduledCbs('postframe');\n if (fpsInterval !== 0) {\n this._lastTime = now - leftover;\n }\n else {\n this._lastTime = now;\n }\n this.fpsSampler.end();\n }\n }\n catch (e) {\n this._onFatalException(e);\n this.stop();\n }\n }\n}\n/**\n * The {@apilink StandardClock} implements the requestAnimationFrame browser api to run the tick()\n */\nclass StandardClock extends Clock {\n constructor(options) {\n super(options);\n this._running = false;\n }\n isRunning() {\n return this._running;\n }\n start() {\n if (this._running) {\n return;\n }\n this._running = true;\n const mainloop = () => {\n // stop the loop\n if (!this._running) {\n return;\n }\n try {\n // request next loop\n this._requestId = window.requestAnimationFrame(mainloop);\n this.update();\n }\n catch (e) {\n window.cancelAnimationFrame(this._requestId);\n throw e;\n }\n };\n // begin the first frame\n mainloop();\n }\n stop() {\n window.cancelAnimationFrame(this._requestId);\n this._running = false;\n }\n}\n/**\n * The TestClock is meant for debugging interactions in excalibur that require precise timing to replicate or test\n */\nclass TestClock extends Clock {\n constructor(options) {\n super({\n ...options\n });\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this._running = false;\n this._currentTime = 0;\n this._updateMs = options.defaultUpdateMs;\n }\n /**\n * Get the current time in milliseconds\n */\n now() {\n var _a;\n return (_a = this._currentTime) !== null && _a !== void 0 ? _a : 0;\n }\n isRunning() {\n return this._running;\n }\n start() {\n this._running = true;\n }\n stop() {\n this._running = false;\n }\n /**\n * Manually step the clock forward 1 tick, optionally specify an elapsed time in milliseconds\n * @param overrideUpdateMs\n */\n step(overrideUpdateMs) {\n const time = overrideUpdateMs !== null && overrideUpdateMs !== void 0 ? overrideUpdateMs : this._updateMs;\n if (this._running) {\n // to be comparable to RAF this needs to be a full blown Task\n // For example, images cannot decode synchronously in a single step\n this.update(time);\n this._currentTime += time;\n }\n else {\n this._logger.warn('The clock is not running, no step will be performed');\n }\n }\n /**\n * Run a number of steps that tick the clock, optionally specify an elapsed time in milliseconds\n * @param numberOfSteps\n * @param overrideUpdateMs\n */\n run(numberOfSteps, overrideUpdateMs) {\n for (let i = 0; i < numberOfSteps; i++) {\n this.step(overrideUpdateMs !== null && overrideUpdateMs !== void 0 ? overrideUpdateMs : this._updateMs);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Coroutine.ts\":\n/*!***************************!*\\\n !*** ./Util/Coroutine.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ coroutine: () => (/* binding */ coroutine)\n/* harmony export */ });\n/* harmony import */ var _Context__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Context */ \"./Context.ts\");\n/* harmony import */ var _Engine__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Engine */ \"./Engine.ts\");\n/* harmony import */ var _Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Log */ \"./Util/Log.ts\");\n\n\n\nconst InsideCoroutineContext = (0,_Context__WEBPACK_IMPORTED_MODULE_0__.createContext)();\nconst generatorFunctionDeclaration = /^\\s*(?:function)?\\*/;\n/**\n *\n */\nfunction isCoroutineGenerator(x) {\n if (typeof x !== 'function') {\n return false;\n }\n if (generatorFunctionDeclaration.test(Function.prototype.toString.call(x))) {\n return true;\n }\n if (!Object.getPrototypeOf) {\n return false;\n }\n return Object.getPrototypeOf(x) === Object.getPrototypeOf(new Function('return function * () {}')());\n}\n/**\n *\n */\nfunction coroutine(...args) {\n var _a;\n const logger = _Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n let coroutineGenerator;\n let thisArg;\n let options;\n let passedEngine;\n // coroutine(coroutineGenerator: CoroutineGenerator, options?: CoroutineOptions): CoroutineInstance;\n if (isCoroutineGenerator(args[0])) {\n thisArg = globalThis;\n coroutineGenerator = args[0];\n options = args[1];\n }\n // coroutine(thisArg: any, coroutineGenerator: CoroutineGenerator, options?: CoroutineOptions): CoroutineInstance;\n if (isCoroutineGenerator(args[1])) {\n thisArg = args[0];\n coroutineGenerator = args[1];\n options = args[2];\n }\n // coroutine(thisArg: any, engine: Engine, coroutineGenerator: CoroutineGenerator, options?: CoroutineOptions): CoroutineInstance;\n if (args[1] instanceof _Engine__WEBPACK_IMPORTED_MODULE_2__.Engine) {\n thisArg = args[0];\n passedEngine = args[1];\n coroutineGenerator = args[2];\n options = args[3];\n }\n // coroutine(engine: Engine, coroutineGenerator: CoroutineGenerator, options?: CoroutineOptions): CoroutineInstance;\n if (args[0] instanceof _Engine__WEBPACK_IMPORTED_MODULE_2__.Engine) {\n thisArg = globalThis;\n passedEngine = args[0];\n coroutineGenerator = args[1];\n options = args[2];\n }\n const inside = (0,_Context__WEBPACK_IMPORTED_MODULE_0__.useContext)(InsideCoroutineContext);\n const schedule = options === null || options === void 0 ? void 0 : options.timing;\n const autostart = inside ? false : (_a = options === null || options === void 0 ? void 0 : options.autostart) !== null && _a !== void 0 ? _a : true;\n let engine;\n try {\n engine = passedEngine !== null && passedEngine !== void 0 ? passedEngine : _Engine__WEBPACK_IMPORTED_MODULE_2__.Engine.useEngine();\n }\n catch (_) {\n throw Error('Cannot run coroutine without engine parameter outside of an excalibur lifecycle method.\\n' +\n 'Pass an engine parameter to ex.coroutine(engine, function * {...})');\n }\n let started = false;\n let completed = false;\n let cancelled = false;\n const generatorFcn = coroutineGenerator.bind(thisArg);\n const generator = generatorFcn();\n let loop;\n const complete = new Promise((resolve, reject) => {\n loop = (elapsed) => {\n try {\n if (cancelled) {\n completed = true;\n resolve();\n return;\n }\n const { done, value } = InsideCoroutineContext.scope(true, () => generator.next(elapsed));\n if (done || cancelled) {\n completed = true;\n resolve();\n return;\n }\n if (value instanceof Promise) {\n value.then(() => {\n // schedule next loop\n engine.clock.schedule(loop, 0, schedule);\n });\n }\n else if (value === undefined || value === void 0) {\n // schedule next frame\n engine.clock.schedule(loop, 0, schedule);\n }\n else {\n // schedule value milliseconds from now\n engine.clock.schedule(loop, value || 0, schedule);\n }\n }\n catch (e) {\n reject(e);\n return;\n }\n };\n if (autostart) {\n started = true;\n loop(engine.clock.elapsed()); // run first frame immediately\n }\n });\n const co = {\n isRunning: () => {\n return started && !cancelled && !completed;\n },\n isComplete: () => {\n return completed;\n },\n cancel: () => {\n cancelled = true;\n },\n start: () => {\n if (!started) {\n started = true;\n loop(engine.clock.elapsed());\n }\n else {\n logger.warn('.start() was called on a coroutine that was already started, this is probably a bug:\\n', Function.prototype.toString.call(generatorFcn));\n }\n return co;\n },\n generator,\n done: complete,\n then: complete.then.bind(complete),\n [Symbol.iterator]: () => {\n // TODO warn if a coroutine is already running\n // TODO warn if a coroutine is cancelled\n return generator;\n }\n };\n return co;\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Decorators.ts\":\n/*!****************************!*\\\n !*** ./Util/Decorators.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ maxMessages: () => (/* binding */ maxMessages),\n/* harmony export */ obsolete: () => (/* binding */ obsolete),\n/* harmony export */ resetObsoleteCounter: () => (/* binding */ resetObsoleteCounter)\n/* harmony export */ });\n/* harmony import */ var _Flags__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Flags */ \"./Flags.ts\");\n/* harmony import */ var _Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Log */ \"./Util/Log.ts\");\n\n\nconst maxMessages = 5;\nconst obsoleteMessage = {};\nconst resetObsoleteCounter = () => {\n for (const message in obsoleteMessage) {\n obsoleteMessage[message] = 0;\n }\n};\nconst logMessage = (message, options) => {\n const suppressObsoleteMessages = _Flags__WEBPACK_IMPORTED_MODULE_0__.Flags.isEnabled('suppress-obsolete-message');\n if (obsoleteMessage[message] < maxMessages && !suppressObsoleteMessages) {\n _Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance().warn(message);\n // tslint:disable-next-line: no-console\n if (console.trace && options.showStackTrace) {\n // tslint:disable-next-line: no-console\n console.trace();\n }\n }\n obsoleteMessage[message]++;\n};\n/**\n * Obsolete decorator for marking Excalibur methods obsolete, you can optionally specify a custom message and/or alternate replacement\n * method do the deprecated one. Inspired by https://github.com/jayphelps/core-decorators.js\n */\nfunction obsolete(options) {\n options = {\n message: 'This feature will be removed in future versions of Excalibur.',\n alternateMethod: null,\n showStackTrace: false,\n ...options\n };\n return function (target, property, descriptor) {\n if (descriptor &&\n !(typeof descriptor.value === 'function' || typeof descriptor.get === 'function' || typeof descriptor.set === 'function')) {\n throw new SyntaxError('Only classes/functions/getters/setters can be marked as obsolete');\n }\n const methodSignature = `${target.name || ''}${target.name && property ? '.' : ''}${property ? property : ''}`;\n const message = `${methodSignature} is marked obsolete: ${options.message}` +\n (options.alternateMethod ? ` Use ${options.alternateMethod} instead` : '');\n if (!obsoleteMessage[message]) {\n obsoleteMessage[message] = 0;\n }\n // If descriptor is null it is a class\n const method = descriptor ? { ...descriptor } : target;\n if (!descriptor) {\n // with es2015 classes we need to change our decoration tactic\n class DecoratedClass extends method {\n constructor(...args) {\n logMessage(message, options);\n super(...args);\n }\n }\n return DecoratedClass;\n }\n if (descriptor && descriptor.value) {\n method.value = function () {\n logMessage(message, options);\n return descriptor.value.apply(this, arguments);\n };\n return method;\n }\n if (descriptor && descriptor.get) {\n method.get = function () {\n logMessage(message, options);\n return descriptor.get.apply(this, arguments);\n };\n }\n if (descriptor && descriptor.set) {\n method.set = function () {\n logMessage(message, options);\n return descriptor.set.apply(this, arguments);\n };\n }\n return method;\n };\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Detector.ts\":\n/*!**************************!*\\\n !*** ./Util/Detector.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Detector: () => (/* binding */ Detector)\n/* harmony export */ });\n/* harmony import */ var _Log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Log */ \"./Util/Log.ts\");\n\n/**\n * This is the list of features that will be used to log the supported\n * features to the console when Detector.logBrowserFeatures() is called.\n */\nconst REPORTED_FEATURES = {\n webgl: 'WebGL',\n webaudio: 'WebAudio',\n gamepadapi: 'Gamepad API'\n};\n/**\n * Excalibur internal feature detection helper class\n */\nclass Detector {\n constructor() {\n this._features = null;\n this.failedTests = [];\n // critical browser features required for ex to run\n this._criticalTests = {\n // Test canvas/2d context support\n canvasSupport: function () {\n const elem = document.createElement('canvas');\n return !!(elem.getContext && elem.getContext('2d'));\n },\n // Test array buffer support ex uses for downloading binary data\n arrayBufferSupport: function () {\n const xhr = new XMLHttpRequest();\n xhr.open('GET', '/');\n try {\n xhr.responseType = 'arraybuffer';\n }\n catch (e) {\n return false;\n }\n return xhr.responseType === 'arraybuffer';\n },\n // Test data urls ex uses for sprites\n dataUrlSupport: function () {\n const canvas = document.createElement('canvas');\n return canvas.toDataURL('image/png').indexOf('data:image/png') === 0;\n },\n // Test object url support for loading\n objectUrlSupport: function () {\n return 'URL' in window && 'revokeObjectURL' in URL && 'createObjectURL' in URL;\n },\n // RGBA support for colors\n rgbaSupport: function () {\n const style = document.createElement('a').style;\n style.cssText = 'background-color:rgba(150,255,150,.5)';\n return ('' + style.backgroundColor).indexOf('rgba') > -1;\n }\n };\n // warnings excalibur performance will be degraded\n this._warningTest = {\n webAudioSupport: function () {\n return !!(window.AudioContext ||\n window.webkitAudioContext ||\n window.mozAudioContext ||\n window.msAudioContext ||\n window.oAudioContext);\n },\n webglSupport: function () {\n const elem = document.createElement('canvas');\n return !!(elem.getContext && elem.getContext('webgl'));\n }\n };\n this._features = this._loadBrowserFeatures();\n }\n /**\n * Returns a map of currently supported browser features. This method\n * treats the features as a singleton and will only calculate feature\n * support if it has not previously been done.\n */\n getBrowserFeatures() {\n if (this._features === null) {\n this._features = this._loadBrowserFeatures();\n }\n return this._features;\n }\n /**\n * Report on non-critical browser support for debugging purposes.\n * Use native browser console colors for visibility.\n */\n logBrowserFeatures() {\n let msg = '%cSUPPORTED BROWSER FEATURES\\n==========================%c\\n';\n const args = ['font-weight: bold; color: navy', 'font-weight: normal; color: inherit'];\n const supported = this.getBrowserFeatures();\n for (const feature of Object.keys(REPORTED_FEATURES)) {\n if (supported[feature]) {\n msg += '(%c\\u2713%c)'; // (✓)\n args.push('font-weight: bold; color: green');\n args.push('font-weight: normal; color: inherit');\n }\n else {\n msg += '(%c\\u2717%c)'; // (✗)\n args.push('font-weight: bold; color: red');\n args.push('font-weight: normal; color: inherit');\n }\n msg += ' ' + REPORTED_FEATURES[feature] + '\\n';\n }\n args.unshift(msg);\n // eslint-disable-next-line no-console\n console.log.apply(console, args);\n }\n /**\n * Executes several IIFE's to get a constant reference to supported\n * features within the current execution context.\n */\n _loadBrowserFeatures() {\n return {\n // IIFE to check canvas support\n canvas: (() => {\n return this._criticalTests.canvasSupport();\n })(),\n // IIFE to check arraybuffer support\n arraybuffer: (() => {\n return this._criticalTests.arrayBufferSupport();\n })(),\n // IIFE to check dataurl support\n dataurl: (() => {\n return this._criticalTests.dataUrlSupport();\n })(),\n // IIFE to check objecturl support\n objecturl: (() => {\n return this._criticalTests.objectUrlSupport();\n })(),\n // IIFE to check rgba support\n rgba: (() => {\n return this._criticalTests.rgbaSupport();\n })(),\n // IIFE to check webaudio support\n webaudio: (() => {\n return this._warningTest.webAudioSupport();\n })(),\n // IIFE to check webgl support\n webgl: (() => {\n return this._warningTest.webglSupport();\n })(),\n // IIFE to check gamepadapi support\n gamepadapi: (() => {\n return !!navigator.getGamepads;\n })()\n };\n }\n test() {\n // Critical test will for ex not to run\n let failedCritical = false;\n for (const test in this._criticalTests) {\n if (!this._criticalTests[test].call(this)) {\n this.failedTests.push(test);\n _Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance().error('Critical browser feature missing, Excalibur requires:', test);\n failedCritical = true;\n }\n }\n if (failedCritical) {\n return false;\n }\n // Warning tests do not for ex to return false to compatibility\n for (const warning in this._warningTest) {\n if (!this._warningTest[warning]()) {\n _Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance().warn('Warning browser feature missing, Excalibur will have reduced performance:', warning);\n }\n }\n return true;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/DrawUtil.ts\":\n/*!**************************!*\\\n !*** ./Util/DrawUtil.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ circle: () => (/* binding */ circle),\n/* harmony export */ line: () => (/* binding */ line),\n/* harmony export */ point: () => (/* binding */ point),\n/* harmony export */ roundRect: () => (/* binding */ roundRect),\n/* harmony export */ vector: () => (/* binding */ vector)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n\n/* istanbul ignore next */\n/**\n * Draw a line on canvas context\n * @param ctx The canvas context\n * @param color The color of the line\n * @param x1 The start x coordinate\n * @param y1 The start y coordinate\n * @param x2 The ending x coordinate\n * @param y2 The ending y coordinate\n * @param thickness The line thickness\n * @param cap The {@apilink LineCapStyle} (butt, round, or square)\n */\nfunction line(ctx, color = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Red, x1, y1, x2, y2, thickness = 1, cap = 'butt') {\n ctx.save();\n ctx.beginPath();\n ctx.lineWidth = thickness;\n ctx.lineCap = cap;\n ctx.strokeStyle = color.toString();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.closePath();\n ctx.stroke();\n ctx.restore();\n}\n/* istanbul ignore next */\n/**\n * Draw the vector as a point onto the canvas.\n */\nfunction point(ctx, color = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Red, point) {\n ctx.beginPath();\n ctx.strokeStyle = color.toString();\n ctx.arc(point.x, point.y, 5, 0, Math.PI * 2);\n ctx.closePath();\n ctx.stroke();\n}\n/**\n * Draw the vector as a line onto the canvas starting a origin point.\n */\n/* istanbul ignore next */\n/**\n *\n */\nfunction vector(ctx, color, origin, vector, scale = 1.0) {\n const c = color ? color.toString() : 'blue';\n const v = vector.scale(scale);\n ctx.beginPath();\n ctx.strokeStyle = c;\n ctx.moveTo(origin.x, origin.y);\n ctx.lineTo(origin.x + v.x, origin.y + v.y);\n ctx.closePath();\n ctx.stroke();\n}\n/**\n * Draw a round rectangle on a canvas context\n * @param ctx The canvas context\n * @param x The top-left x coordinate\n * @param y The top-left y coordinate\n * @param width The width of the rectangle\n * @param height The height of the rectangle\n * @param radius The border radius of the rectangle\n * @param stroke The {@apilink Color} to stroke rectangle with\n * @param fill The {@apilink Color} to fill rectangle with\n */\nfunction roundRect(ctx, x, y, width, height, radius = 5, stroke = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.White, fill = null) {\n let br;\n if (typeof radius === 'number') {\n br = { tl: radius, tr: radius, br: radius, bl: radius };\n }\n else {\n const defaultRadius = { tl: 0, tr: 0, br: 0, bl: 0 };\n for (const prop in defaultRadius) {\n if (defaultRadius.hasOwnProperty(prop)) {\n const side = prop;\n br[side] = radius[side] || defaultRadius[side];\n }\n }\n }\n ctx.beginPath();\n ctx.moveTo(x + br.tl, y);\n ctx.lineTo(x + width - br.tr, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + br.tr);\n ctx.lineTo(x + width, y + height - br.br);\n ctx.quadraticCurveTo(x + width, y + height, x + width - br.br, y + height);\n ctx.lineTo(x + br.bl, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - br.bl);\n ctx.lineTo(x, y + br.tl);\n ctx.quadraticCurveTo(x, y, x + br.tl, y);\n ctx.closePath();\n if (fill) {\n ctx.fillStyle = fill.toString();\n ctx.fill();\n }\n if (stroke) {\n ctx.strokeStyle = stroke.toString();\n ctx.stroke();\n }\n}\n/**\n *\n */\nfunction circle(ctx, x, y, radius, stroke = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.White, fill = null) {\n ctx.beginPath();\n ctx.arc(x, y, radius, 0, Math.PI * 2);\n ctx.closePath();\n if (fill) {\n ctx.fillStyle = fill.toString();\n ctx.fill();\n }\n if (stroke) {\n ctx.strokeStyle = stroke.toString();\n ctx.stroke();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/EasingFunctions.ts\":\n/*!*********************************!*\\\n !*** ./Util/EasingFunctions.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EasingFunctions: () => (/* binding */ EasingFunctions)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n\n/**\n * Standard easing functions for motion in Excalibur, defined on a domain of [0, duration] and a range from [+startValue,+endValue]\n * Given a time, the function will return a value from positive startValue to positive endValue.\n *\n * ```js\n * function Linear (t) {\n * return t * t;\n * }\n *\n * // accelerating from zero velocity\n * function EaseInQuad (t) {\n * return t * t;\n * }\n *\n * // decelerating to zero velocity\n * function EaseOutQuad (t) {\n * return t * (2 - t);\n * }\n *\n * // acceleration until halfway, then deceleration\n * function EaseInOutQuad (t) {\n * return t < .5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n * }\n *\n * // accelerating from zero velocity\n * function EaseInCubic (t) {\n * return t * t * t;\n * }\n *\n * // decelerating to zero velocity\n * function EaseOutCubic (t) {\n * return (--t) * t * t + 1;\n * }\n *\n * // acceleration until halfway, then deceleration\n * function EaseInOutCubic (t) {\n * return t < .5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1;\n * }\n * ```\n */\nclass EasingFunctions {\n static CreateReversibleEasingFunction(easing) {\n return (time, start, end, duration) => {\n if (end < start) {\n return start - (easing(time, end, start, duration) - end);\n }\n else {\n return easing(time, start, end, duration);\n }\n };\n }\n static CreateVectorEasingFunction(easing) {\n return (time, start, end, duration) => {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(easing(time, start.x, end.x, duration), easing(time, start.y, end.y, duration));\n };\n }\n}\nEasingFunctions.Linear = EasingFunctions.CreateReversibleEasingFunction((currentTime, startValue, endValue, duration) => {\n endValue = endValue - startValue;\n return (endValue * currentTime) / duration + startValue;\n});\nEasingFunctions.EaseInQuad = EasingFunctions.CreateReversibleEasingFunction((currentTime, startValue, endValue, duration) => {\n endValue = endValue - startValue;\n currentTime /= duration;\n return endValue * currentTime * currentTime + startValue;\n});\nEasingFunctions.EaseOutQuad = EasingFunctions.CreateReversibleEasingFunction((currentTime, startValue, endValue, duration) => {\n endValue = endValue - startValue;\n currentTime /= duration;\n return -endValue * currentTime * (currentTime - 2) + startValue;\n});\nEasingFunctions.EaseInOutQuad = EasingFunctions.CreateReversibleEasingFunction((currentTime, startValue, endValue, duration) => {\n endValue = endValue - startValue;\n currentTime /= duration / 2;\n if (currentTime < 1) {\n return (endValue / 2) * currentTime * currentTime + startValue;\n }\n currentTime--;\n return (-endValue / 2) * (currentTime * (currentTime - 2) - 1) + startValue;\n});\nEasingFunctions.EaseInCubic = EasingFunctions.CreateReversibleEasingFunction((currentTime, startValue, endValue, duration) => {\n endValue = endValue - startValue;\n currentTime /= duration;\n return endValue * currentTime * currentTime * currentTime + startValue;\n});\nEasingFunctions.EaseOutCubic = EasingFunctions.CreateReversibleEasingFunction((currentTime, startValue, endValue, duration) => {\n endValue = endValue - startValue;\n currentTime /= duration;\n currentTime--;\n return endValue * (currentTime * currentTime * currentTime + 1) + startValue;\n});\nEasingFunctions.EaseInOutCubic = EasingFunctions.CreateReversibleEasingFunction((currentTime, startValue, endValue, duration) => {\n endValue = endValue - startValue;\n currentTime /= duration / 2;\n if (currentTime < 1) {\n return (endValue / 2) * currentTime * currentTime * currentTime + startValue;\n }\n currentTime -= 2;\n return (endValue / 2) * (currentTime * currentTime * currentTime + 2) + startValue;\n});\n\n\n/***/ }),\n\n/***/ \"./Util/Fps.ts\":\n/*!*********************!*\\\n !*** ./Util/Fps.ts ***!\n \\*********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FpsSampler: () => (/* binding */ FpsSampler)\n/* harmony export */ });\nclass FpsSampler {\n constructor(options) {\n var _a;\n this._samplePeriod = 100;\n this._currentFrameTime = 0;\n this._frames = 0;\n this._previousSampleTime = 0;\n this._beginFrameTime = 0;\n this._fps = options.initialFps;\n this._samplePeriod = (_a = options.samplePeriod) !== null && _a !== void 0 ? _a : this._samplePeriod;\n this._currentFrameTime = 1000 / options.initialFps;\n this._nowFn = options.nowFn;\n this._previousSampleTime = this._nowFn();\n }\n /**\n * Start of code block to sample FPS for\n */\n start() {\n this._beginFrameTime = this._nowFn();\n }\n /**\n * End of code block to sample FPS for\n */\n end() {\n this._frames++;\n const time = this._nowFn();\n this._currentFrameTime = time - this._beginFrameTime;\n if (time >= this._previousSampleTime + this._samplePeriod) {\n this._fps = (this._frames * 1000) / (time - this._previousSampleTime);\n this._previousSampleTime = time;\n this._frames = 0;\n }\n }\n /**\n * Return the currently sampled fps over the last sample period, by default every 100ms\n */\n get fps() {\n return this._fps;\n }\n /**\n * Return the instantaneous fps, this can be less useful because it will fluctuate given the current frames time\n */\n get instant() {\n return 1000 / this._currentFrameTime;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Future.ts\":\n/*!************************!*\\\n !*** ./Util/Future.ts ***!\n \\************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Future: () => (/* binding */ Future)\n/* harmony export */ });\n/**\n * Future is a wrapper around a native browser Promise to allow resolving/rejecting at any time\n */\nclass Future {\n constructor() {\n this._isCompleted = false;\n this.promise = new Promise((resolve, reject) => {\n this._resolver = resolve;\n this._rejecter = reject;\n });\n }\n get isCompleted() {\n return this._isCompleted;\n }\n resolve(value) {\n if (this._isCompleted) {\n return;\n }\n this._isCompleted = true;\n this._resolver(value);\n }\n reject(error) {\n if (this._isCompleted) {\n return;\n }\n this._isCompleted = true;\n this._rejecter(error);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/IFrame.ts\":\n/*!************************!*\\\n !*** ./Util/IFrame.ts ***!\n \\************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ isCrossOriginIframe: () => (/* binding */ isCrossOriginIframe)\n/* harmony export */ });\n/**\n * Checks if excalibur is in a x-origin iframe\n */\nfunction isCrossOriginIframe() {\n try {\n // Try and listen to events on top window frame if within an iframe.\n //\n // See https://github.com/excaliburjs/Excalibur/issues/1294\n //\n // Attempt to add an event listener, which triggers a DOMException on\n // cross-origin iframes\n const noop = () => {\n return;\n };\n window.top.addEventListener('blur', noop);\n window.top.removeEventListener('blur', noop);\n }\n catch (_a) {\n return true;\n }\n return false;\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Index.ts\":\n/*!***********************!*\\\n !*** ./Util/Index.ts ***!\n \\***********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ConsoleAppender: () => (/* reexport safe */ _Log__WEBPACK_IMPORTED_MODULE_1__.ConsoleAppender),\n/* harmony export */ DrawUtil: () => (/* reexport module object */ _DrawUtil__WEBPACK_IMPORTED_MODULE_4__),\n/* harmony export */ EasingFunctions: () => (/* reexport safe */ _EasingFunctions__WEBPACK_IMPORTED_MODULE_3__.EasingFunctions),\n/* harmony export */ LogLevel: () => (/* reexport safe */ _Log__WEBPACK_IMPORTED_MODULE_1__.LogLevel),\n/* harmony export */ Logger: () => (/* reexport safe */ _Log__WEBPACK_IMPORTED_MODULE_1__.Logger),\n/* harmony export */ Observable: () => (/* reexport safe */ _Observable__WEBPACK_IMPORTED_MODULE_2__.Observable),\n/* harmony export */ ScreenAppender: () => (/* reexport safe */ _Log__WEBPACK_IMPORTED_MODULE_1__.ScreenAppender),\n/* harmony export */ addItemToArray: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.addItemToArray),\n/* harmony export */ contains: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.contains),\n/* harmony export */ delay: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.delay),\n/* harmony export */ fail: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.fail),\n/* harmony export */ getPosition: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.getPosition),\n/* harmony export */ isObject: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.isObject),\n/* harmony export */ mergeDeep: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.mergeDeep),\n/* harmony export */ omit: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.omit),\n/* harmony export */ removeItemFromArray: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.removeItemFromArray)\n/* harmony export */ });\n/* harmony import */ var _Util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Util */ \"./Util/Util.ts\");\n/* harmony import */ var _Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Observable */ \"./Util/Observable.ts\");\n/* harmony import */ var _EasingFunctions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./EasingFunctions */ \"./Util/EasingFunctions.ts\");\n/* harmony import */ var _DrawUtil__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./DrawUtil */ \"./Util/DrawUtil.ts\");\n\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Util/Log.ts\":\n/*!*********************!*\\\n !*** ./Util/Log.ts ***!\n \\*********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ConsoleAppender: () => (/* binding */ ConsoleAppender),\n/* harmony export */ LogLevel: () => (/* binding */ LogLevel),\n/* harmony export */ Logger: () => (/* binding */ Logger),\n/* harmony export */ ScreenAppender: () => (/* binding */ ScreenAppender)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* eslint-disable no-console */\n\n\n/**\n * Logging level that Excalibur will tag\n */\nvar LogLevel;\n(function (LogLevel) {\n LogLevel[LogLevel[\"Debug\"] = 0] = \"Debug\";\n LogLevel[LogLevel[\"Info\"] = 1] = \"Info\";\n LogLevel[LogLevel[\"Warn\"] = 2] = \"Warn\";\n LogLevel[LogLevel[\"Error\"] = 3] = \"Error\";\n LogLevel[LogLevel[\"Fatal\"] = 4] = \"Fatal\";\n})(LogLevel || (LogLevel = {}));\n/**\n * Static singleton that represents the logging facility for Excalibur.\n * Excalibur comes built-in with a {@apilink ConsoleAppender} and {@apilink ScreenAppender}.\n * Derive from {@apilink Appender} to create your own logging appenders.\n */\nclass Logger {\n constructor() {\n this._appenders = [];\n /**\n * Gets or sets the default logging level. Excalibur will only log\n * messages if equal to or above this level. Default: {@apilink LogLevel.Info}\n */\n this.defaultLevel = LogLevel.Info;\n this._logOnceSet = new Set();\n if (Logger._INSTANCE) {\n throw new Error('Logger is a singleton');\n }\n Logger._INSTANCE = this;\n // Default console appender\n Logger._INSTANCE.addAppender(new ConsoleAppender());\n return Logger._INSTANCE;\n }\n /**\n * Gets the current static instance of Logger\n */\n static getInstance() {\n if (Logger._INSTANCE == null) {\n Logger._INSTANCE = new Logger();\n }\n return Logger._INSTANCE;\n }\n /**\n * Adds a new {@apilink Appender} to the list of appenders to write to\n */\n addAppender(appender) {\n this._appenders.push(appender);\n }\n /**\n * Clears all appenders from the logger\n */\n clearAppenders() {\n this._appenders.length = 0;\n }\n /**\n * Logs a message at a given LogLevel\n * @param level The LogLevel`to log the message at\n * @param args An array of arguments to write to an appender\n */\n _log(level, args) {\n if (level == null) {\n level = this.defaultLevel;\n }\n const len = this._appenders.length;\n for (let i = 0; i < len; i++) {\n if (level >= this.defaultLevel) {\n this._appenders[i].log(level, args);\n }\n }\n }\n _logOnce(level, args) {\n const serialized = level + args.join('+');\n if (this._logOnceSet.has(serialized)) {\n return;\n }\n else {\n this._logOnceSet.add(serialized);\n this._log(level, args);\n }\n }\n /**\n * Writes a log message at the {@apilink LogLevel.Debug} level\n * @param args Accepts any number of arguments\n */\n debug(...args) {\n this._log(LogLevel.Debug, args);\n }\n /**\n * Writes a log message once at the {@apilink LogLevel.Fatal} level, if it sees the same args again it wont log\n * @param args Accepts any number of arguments\n */\n debugOnce(...args) {\n this._logOnce(LogLevel.Debug, args);\n }\n /**\n * Writes a log message at the {@apilink LogLevel.Info} level\n * @param args Accepts any number of arguments\n */\n info(...args) {\n this._log(LogLevel.Info, args);\n }\n /**\n * Writes a log message once at the {@apilink LogLevel.Info} level, if it sees the same args again it wont log\n * @param args Accepts any number of arguments\n */\n infoOnce(...args) {\n this._logOnce(LogLevel.Info, args);\n }\n /**\n * Writes a log message at the {@apilink LogLevel.Warn} level\n * @param args Accepts any number of arguments\n */\n warn(...args) {\n this._log(LogLevel.Warn, args);\n }\n /**\n * Writes a log message once at the {@apilink LogLevel.Warn} level, if it sees the same args again it won't log\n * @param args Accepts any number of arguments\n */\n warnOnce(...args) {\n this._logOnce(LogLevel.Warn, args);\n }\n /**\n * Writes a log message at the {@apilink LogLevel.Error} level\n * @param args Accepts any number of arguments\n */\n error(...args) {\n this._log(LogLevel.Error, args);\n }\n /**\n * Writes a log message once at the {@apilink LogLevel.Error} level, if it sees the same args again it won't log\n * @param args Accepts any number of arguments\n */\n errorOnce(...args) {\n this._logOnce(LogLevel.Error, args);\n }\n /**\n * Writes a log message at the {@apilink LogLevel.Fatal} level\n * @param args Accepts any number of arguments\n */\n fatal(...args) {\n this._log(LogLevel.Fatal, args);\n }\n /**\n * Writes a log message once at the {@apilink LogLevel.Fatal} level, if it sees the same args again it won't log\n * @param args Accepts any number of arguments\n */\n fatalOnce(...args) {\n this._logOnce(LogLevel.Fatal, args);\n }\n}\nLogger._INSTANCE = null;\n/**\n * Console appender for browsers (i.e. `console.log`)\n */\nclass ConsoleAppender {\n /**\n * Logs a message at the given {@apilink LogLevel}\n * @param level Level to log at\n * @param args Arguments to log\n */\n log(level, args) {\n // Check for console support\n if (!console && !console.log && console.warn && console.error) {\n // todo maybe do something better than nothing\n return;\n }\n // Create a new console args array\n const consoleArgs = [];\n consoleArgs.unshift.apply(consoleArgs, args);\n consoleArgs.unshift('[' + LogLevel[level] + '] : ');\n if (level < LogLevel.Warn) {\n // Call .log for Debug/Info\n if (console.log.apply) {\n // this is required on some older browsers that don't support apply on console.log :(\n console.log.apply(console, consoleArgs);\n }\n else {\n console.log(consoleArgs.join(' '));\n }\n }\n else if (level < LogLevel.Error) {\n // Call .warn for Warn\n if (console.warn.apply) {\n console.warn.apply(console, consoleArgs);\n }\n else {\n console.warn(consoleArgs.join(' '));\n }\n }\n else {\n // Call .error for Error/Fatal\n if (console.error.apply) {\n console.error.apply(console, consoleArgs);\n }\n else {\n console.error(consoleArgs.join(' '));\n }\n }\n }\n}\n/**\n * On-screen (canvas) appender\n */\nclass ScreenAppender {\n constructor(options) {\n var _a, _b;\n this._messages = [];\n this._pos = 10;\n this._color = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Black;\n this._options = options;\n this.canvas = document.createElement('canvas');\n this._ctx = this.canvas.getContext('2d');\n this.canvas.style.position = 'absolute';\n this.canvas.style.zIndex = (_b = (_a = options.zIndex) === null || _a === void 0 ? void 0 : _a.toString()) !== null && _b !== void 0 ? _b : '99';\n document.body.appendChild(this.canvas);\n this._positionScreenAppenderCanvas();\n options.engine.screen.events.on('resize', () => {\n this._positionScreenAppenderCanvas();\n });\n }\n _positionScreenAppenderCanvas() {\n var _a, _b, _c, _d;\n const options = this._options;\n this.canvas.width = (_a = options.width) !== null && _a !== void 0 ? _a : options.engine.screen.resolution.width;\n this.canvas.height = (_b = options.height) !== null && _b !== void 0 ? _b : options.engine.screen.resolution.height;\n this.canvas.style.position = 'absolute';\n const pagePos = options.engine.screen.screenToPageCoordinates((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0));\n this.canvas.style.left = pagePos.x + 'px';\n this.canvas.style.top = pagePos.y + 'px';\n this._pos = (_c = options.xPos) !== null && _c !== void 0 ? _c : this._pos;\n this._color = (_d = options.color) !== null && _d !== void 0 ? _d : this._color;\n }\n /**\n * Logs a message at the given {@apilink LogLevel}\n * @param level Level to log at\n * @param args Arguments to log\n */\n log(level, args) {\n const message = args.join(',');\n this._ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n this._messages.unshift('[' + LogLevel[level] + '] : ' + message);\n let pos = 10;\n this._messages = this._messages.slice(0, 1000);\n for (let i = 0; i < this._messages.length; i++) {\n this._ctx.fillStyle = this._color.toRGBA();\n this._ctx.fillText(this._messages[i], this._pos, pos);\n pos += 10;\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Observable.ts\":\n/*!****************************!*\\\n !*** ./Util/Observable.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Observable: () => (/* binding */ Observable)\n/* harmony export */ });\n/**\n * Simple Observable implementation\n * @template T is the typescript Type that defines the data being observed\n */\nclass Observable {\n constructor() {\n this.observers = [];\n this.subscriptions = [];\n }\n /**\n * Register an observer to listen to this observable\n * @param observer\n */\n register(observer) {\n this.observers.push(observer);\n }\n /**\n * Register a callback to listen to this observable\n * @param func\n */\n subscribe(func) {\n this.subscriptions.push(func);\n }\n /**\n * Remove an observer from the observable\n * @param observer\n */\n unregister(observer) {\n const i = this.observers.indexOf(observer);\n if (i !== -1) {\n this.observers.splice(i, 1);\n }\n }\n /**\n * Remove a callback that is listening to this observable\n * @param func\n */\n unsubscribe(func) {\n const i = this.subscriptions.indexOf(func);\n if (i !== -1) {\n this.subscriptions.splice(i, 1);\n }\n }\n /**\n * Broadcasts a message to all observers and callbacks\n * @param message\n */\n notifyAll(message) {\n const observersLength = this.observers.length;\n for (let i = 0; i < observersLength; i++) {\n this.observers[i].notify(message);\n }\n const subscriptionsLength = this.subscriptions.length;\n for (let i = 0; i < subscriptionsLength; i++) {\n this.subscriptions[i](message);\n }\n }\n /**\n * Removes all observers and callbacks\n */\n clear() {\n this.observers.length = 0;\n this.subscriptions.length = 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Pool.ts\":\n/*!**********************!*\\\n !*** ./Util/Pool.ts ***!\n \\**********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Pool: () => (/* binding */ Pool)\n/* harmony export */ });\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n\nclass Pool {\n constructor(builder, recycler, maxObjects = 100) {\n this.builder = builder;\n this.recycler = recycler;\n this.maxObjects = maxObjects;\n this.totalAllocations = 0;\n this.index = 0;\n this.objects = [];\n this.disableWarnings = false;\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance();\n }\n dispose() {\n this.objects.length = 0;\n }\n preallocate() {\n for (let i = 0; i < this.maxObjects; i++) {\n this.objects[i] = this.builder();\n }\n }\n /**\n * Use many instances out of the in the context and return all to the pool.\n *\n * By returning values out of the context they will be un-hooked from the pool and are free to be passed to consumers\n * @param context\n */\n using(context) {\n const result = context(this);\n if (result) {\n return this.done(...result);\n }\n return this.done();\n }\n /**\n * Use a single instance out of th pool and immediately return it to the pool\n * @param context\n */\n borrow(context) {\n const object = this.get();\n context(object);\n this.index--;\n }\n /**\n * Retrieve a value from the pool, will allocate a new instance if necessary or recycle from the pool\n */\n get() {\n if (this.index === this.maxObjects) {\n if (!this.disableWarnings) {\n this._logger.warn('Max pooled objects reached, possible memory leak? Doubling');\n }\n this.maxObjects = this.maxObjects * 2;\n }\n if (this.objects[this.index]) {\n // Pool has an available object already constructed\n if (this.recycler) {\n return this.recycler(this.objects[this.index++]);\n }\n return this.objects[this.index++];\n }\n else {\n // New allocation\n this.totalAllocations++;\n const object = (this.objects[this.index++] = this.builder());\n return object;\n }\n }\n done(...objects) {\n // All objects in pool now considered \"free\"\n this.index = 0;\n for (const object of objects) {\n const poolIndex = this.objects.indexOf(object);\n // Build a new object to take the pool place\n this.objects[poolIndex] = this.builder();\n this.totalAllocations++;\n }\n return objects;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/RentalPool.ts\":\n/*!****************************!*\\\n !*** ./Util/RentalPool.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RentalPool: () => (/* binding */ RentalPool)\n/* harmony export */ });\nclass RentalPool {\n constructor(builder, cleaner, preAllocate = 1) {\n this.builder = builder;\n this.cleaner = cleaner;\n this._pool = [];\n this._size = 0;\n this.grow(preAllocate);\n }\n /**\n * Grow the pool size by an amount\n * @param amount\n */\n grow(amount) {\n if (amount > 0) {\n this._size += amount;\n for (let i = 0; i < amount; i++) {\n this._pool.push(this.builder());\n }\n }\n }\n /**\n * Rent an object from the pool, optionally clean it. If not cleaned previous state may be set.\n *\n * The pool will automatically double if depleted\n * @param clean\n */\n rent(clean = false) {\n if (this._pool.length === 0) {\n this.grow(this._size);\n }\n return clean ? this.cleaner(this._pool.pop()) : this._pool.pop();\n }\n /**\n * Return an object to the pool\n * @param object\n */\n return(object) {\n this._pool.push(object);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Semaphore.ts\":\n/*!***************************!*\\\n !*** ./Util/Semaphore.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Semaphore: () => (/* binding */ Semaphore)\n/* harmony export */ });\n/* harmony import */ var _Future__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Future */ \"./Util/Future.ts\");\n\nclass AsyncWaitQueue {\n constructor() {\n // Code from StephenCleary https://gist.github.com/StephenCleary/ba50b2da419c03b9cba1d20cb4654d5e\n this._queue = [];\n }\n get length() {\n return this._queue.length;\n }\n enqueue() {\n const future = new _Future__WEBPACK_IMPORTED_MODULE_0__.Future();\n this._queue.push(future);\n return future.promise;\n }\n dequeue(value) {\n const future = this._queue.shift();\n future.resolve(value);\n }\n}\n/**\n * Semaphore allows you to limit the amount of async calls happening between `enter()` and `exit()`\n *\n * This can be useful when limiting the number of http calls, browser api calls, etc either for performance or to work\n * around browser limitations like max Image.decode() calls in chromium being 256.\n */\nclass Semaphore {\n constructor(_count) {\n this._count = _count;\n this._waitQueue = new AsyncWaitQueue();\n }\n get count() {\n return this._count;\n }\n get waiting() {\n return this._waitQueue.length;\n }\n // eslint-disable-next-line require-await\n async enter() {\n if (this._count !== 0) {\n this._count--;\n return Promise.resolve();\n }\n return this._waitQueue.enqueue();\n }\n exit(count = 1) {\n if (count === 0) {\n return;\n }\n while (count !== 0 && this._waitQueue.length !== 0) {\n this._waitQueue.dequeue(null);\n count--;\n }\n this._count += count;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Sound.ts\":\n/*!***********************!*\\\n !*** ./Util/Sound.ts ***!\n \\***********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ canPlayFile: () => (/* binding */ canPlayFile)\n/* harmony export */ });\n/* harmony import */ var _Log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Log */ \"./Util/Log.ts\");\n\n/**\n * Whether or not the browser can play this file as HTML5 Audio\n */\nfunction canPlayFile(file) {\n try {\n const a = new Audio();\n const filetype = /.*\\.([A-Za-z0-9]+)(?:(?:\\?|\\#).*)*$/;\n const type = file.match(filetype)[1];\n if (a.canPlayType('audio/' + type)) {\n return true;\n }\n else {\n return false;\n }\n }\n catch (e) {\n _Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance().warn('Cannot determine audio support, assuming no support for the Audio Tag', e);\n return false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/StateMachine.ts\":\n/*!******************************!*\\\n !*** ./Util/StateMachine.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ StateMachine: () => (/* binding */ StateMachine)\n/* harmony export */ });\nclass StateMachine {\n constructor() {\n this.states = new Map();\n }\n get currentState() {\n return this._currentState;\n }\n set currentState(state) {\n this._currentState = state;\n }\n static create(machineDescription, data) {\n const machine = new StateMachine();\n machine.data = data;\n for (const stateName in machineDescription.states) {\n machine.states.set(stateName, {\n name: stateName,\n ...machineDescription.states[stateName]\n });\n }\n // validate transitions are states\n for (const state of machine.states.values()) {\n for (const transitionState of state.transitions) {\n if (transitionState === '*') {\n continue;\n }\n if (!machine.states.has(transitionState)) {\n throw Error(`Invalid state machine, state [${state.name}] has a transition to another state that doesn't exist [${transitionState}]`);\n }\n }\n }\n machine.currentState = machine.startState = machine.states.get(machineDescription.start);\n return machine;\n }\n in(state) {\n return this.currentState.name === state;\n }\n go(stateName, eventData) {\n var _a, _b;\n if (this.currentState.transitions.includes(stateName) || this.currentState.transitions.includes('*')) {\n const potentialNewState = this.states.get(stateName);\n if (this.currentState.onExit) {\n const canExit = (_a = this.currentState) === null || _a === void 0 ? void 0 : _a.onExit({ to: potentialNewState.name, data: this.data });\n if (canExit === false) {\n return false;\n }\n }\n if (potentialNewState === null || potentialNewState === void 0 ? void 0 : potentialNewState.onEnter) {\n const canEnter = potentialNewState === null || potentialNewState === void 0 ? void 0 : potentialNewState.onEnter({ from: this.currentState.name, eventData, data: this.data });\n if (canEnter === false) {\n return false;\n }\n }\n this.currentState = potentialNewState;\n if ((_b = this.currentState) === null || _b === void 0 ? void 0 : _b.onState) {\n this.currentState.onState();\n }\n return true;\n }\n return false;\n }\n update(elapsed) {\n if (this.currentState.onUpdate) {\n this.currentState.onUpdate(this.data, elapsed);\n }\n }\n save(saveKey) {\n localStorage.setItem(saveKey, JSON.stringify({\n currentState: this.currentState.name,\n data: this.data\n }));\n }\n restore(saveKey) {\n const state = JSON.parse(localStorage.getItem(saveKey));\n this.currentState = this.states.get(state.currentState);\n this.data = state.data;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Toaster.ts\":\n/*!*************************!*\\\n !*** ./Util/Toaster.ts ***!\n \\*************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Toaster: () => (/* binding */ Toaster)\n/* harmony export */ });\n/* harmony import */ var _Toaster_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Toaster.css */ \"./Util/Toaster.css\");\n\n/**\n * The Toaster is only meant to be called from inside Excalibur to display messages to players\n */\nclass Toaster {\n constructor() {\n this._toasterCss = _Toaster_css__WEBPACK_IMPORTED_MODULE_0__[\"default\"].toString();\n this._isInitialized = false;\n }\n _initialize() {\n if (!this._isInitialized) {\n this._container = document.createElement('div');\n this._container.id = 'ex-toast-container';\n document.body.appendChild(this._container);\n this._isInitialized = true;\n this._styleBlock = document.createElement('style');\n this._styleBlock.textContent = this._toasterCss;\n document.head.appendChild(this._styleBlock);\n }\n }\n dispose() {\n this._container.parentElement.removeChild(this._container);\n this._styleBlock.parentElement.removeChild(this._styleBlock);\n this._isInitialized = false;\n }\n _createFragment(message) {\n const toastMessage = document.createElement('span');\n toastMessage.innerText = message;\n return toastMessage;\n }\n /**\n * Display a toast message to a player\n * @param message Text of the message, messages may have a single \"[LINK]\" to influence placement\n * @param linkTarget Optionally specify a link location\n * @param linkName Optionally specify a name for that link location\n */\n toast(message, linkTarget, linkName) {\n this._initialize();\n const toast = document.createElement('div');\n toast.className = 'ex-toast-message';\n const messageFragments = message.split('[LINK]').map((message) => this._createFragment(message));\n if (linkTarget) {\n const link = document.createElement('a');\n link.href = linkTarget;\n if (linkName) {\n link.innerText = linkName;\n }\n else {\n link.innerText = linkTarget;\n }\n messageFragments.splice(1, 0, link);\n }\n // Assembly message\n const finalMessage = document.createElement('div');\n messageFragments.forEach((message) => {\n finalMessage.appendChild(message);\n });\n toast.appendChild(finalMessage);\n // Dismiss button\n const dismissBtn = document.createElement('button');\n dismissBtn.innerText = 'x';\n dismissBtn.addEventListener('click', () => {\n this._container.removeChild(toast);\n });\n toast.appendChild(dismissBtn);\n // Escape to dismiss\n const keydownHandler = (evt) => {\n if (evt.key === 'Escape') {\n try {\n this._container.removeChild(toast);\n }\n catch (_a) {\n // pass\n }\n }\n document.removeEventListener('keydown', keydownHandler);\n };\n document.addEventListener('keydown', keydownHandler);\n // Insert into container\n const first = this._container.firstChild;\n this._container.insertBefore(toast, first);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Util.ts\":\n/*!**********************!*\\\n !*** ./Util/Util.ts ***!\n \\**********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ addItemToArray: () => (/* binding */ addItemToArray),\n/* harmony export */ contains: () => (/* binding */ contains),\n/* harmony export */ delay: () => (/* binding */ delay),\n/* harmony export */ fail: () => (/* binding */ fail),\n/* harmony export */ getPosition: () => (/* binding */ getPosition),\n/* harmony export */ isObject: () => (/* binding */ isObject),\n/* harmony export */ mergeDeep: () => (/* binding */ mergeDeep),\n/* harmony export */ omit: () => (/* binding */ omit),\n/* harmony export */ removeItemFromArray: () => (/* binding */ removeItemFromArray)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Future__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Future */ \"./Util/Future.ts\");\n\n\n/**\n * Find the screen position of an HTML element\n */\nfunction getPosition(el) {\n // do we need the scroll too? technically the offset method before did that\n if (el && el.getBoundingClientRect) {\n const rect = el.getBoundingClientRect();\n return (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(rect.x + window.scrollX, rect.y + window.scrollY);\n }\n return _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero;\n}\n/**\n * Add an item to an array list if it doesn't already exist. Returns true if added, false if not and already exists in the array.\n * @deprecated Will be removed in v0.26.0\n */\nfunction addItemToArray(item, array) {\n if (array.indexOf(item) === -1) {\n array.push(item);\n return true;\n }\n return false;\n}\n/**\n * Remove an item from an list\n * @deprecated Will be removed in v0.26.0\n */\nfunction removeItemFromArray(item, array) {\n let index = -1;\n if ((index = array.indexOf(item)) > -1) {\n array.splice(index, 1);\n return true;\n }\n return false;\n}\n/**\n * See if an array contains something\n */\nfunction contains(array, obj) {\n for (let i = 0; i < array.length; i++) {\n if (array[i] === obj) {\n return true;\n }\n }\n return false;\n}\n/**\n * Used for exhaustive checks at compile time\n */\nfunction fail(message) {\n throw new Error(message);\n}\n/**\n * Create a promise that resolves after a certain number of milliseconds\n *\n * It is strongly recommended you pass the excalibur clock so delays are bound to the\n * excalibur clock which would be unaffected by stop/pause.\n * @param milliseconds\n * @param clock\n */\nfunction delay(milliseconds, clock) {\n var _a;\n const future = new _Future__WEBPACK_IMPORTED_MODULE_1__.Future();\n const schedule = (_a = clock === null || clock === void 0 ? void 0 : clock.schedule.bind(clock)) !== null && _a !== void 0 ? _a : setTimeout;\n schedule(() => {\n future.resolve();\n }, milliseconds);\n return future.promise;\n}\n/**\n * Remove keys from object literals\n * @param object\n * @param keys\n */\nfunction omit(object, keys) {\n const newObj = {};\n for (const key in object) {\n if (!keys.includes(key)) {\n newObj[key] = object[key];\n }\n }\n return newObj;\n}\n/**\n * Simple object check.\n * @param item\n */\nfunction isObject(item) {\n return item && typeof item === 'object' && !Array.isArray(item);\n}\n/**\n * Deep merge two objects.\n * @param target\n * @param sources\n */\nfunction mergeDeep(target, ...sources) {\n if (!sources.length) {\n return target;\n }\n const source = sources.shift();\n if (isObject(target) && isObject(source)) {\n for (const key in source) {\n if (isObject(source[key])) {\n if (!target[key]) {\n Object.assign(target, { [key]: {} });\n }\n mergeDeep(target[key], source[key]);\n }\n else {\n Object.assign(target, { [key]: source[key] });\n }\n }\n }\n return mergeDeep(target, ...sources);\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Watch.ts\":\n/*!***********************!*\\\n !*** ./Util/Watch.ts ***!\n \\***********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ watch: () => (/* binding */ watch),\n/* harmony export */ watchAny: () => (/* binding */ watchAny),\n/* harmony export */ watchDeep: () => (/* binding */ watchDeep)\n/* harmony export */ });\n/**\n * Watch an object with a proxy, only fires if property value is different\n */\nfunction watch(type, change) {\n if (!type) {\n return type;\n }\n if (type.__isProxy === undefined) {\n // expando hack to mark a proxy\n return new Proxy(type, {\n set: (obj, prop, value) => {\n // The default behavior to store the value\n if (obj[prop] !== value) {\n obj[prop] = value;\n // Avoid watching private junk\n if (typeof prop === 'string') {\n if (prop[0] !== '_') {\n change(obj);\n }\n }\n }\n // Indicate success\n return true;\n },\n get: (obj, prop) => {\n if (prop !== '__isProxy') {\n return obj[prop];\n }\n return true;\n }\n });\n }\n return type;\n}\nconst createHandler = (path = [], change, typeType) => ({\n get: (target, key) => {\n if (key === '__isProxy') {\n return true;\n }\n if (typeof target[key] === 'object' && target[key] != null) {\n return new Proxy(target[key], createHandler([...path, key], change, typeType));\n }\n return target[key];\n },\n set: (target, key, value) => {\n if (typeof key === 'string') {\n if (key[0] !== '_') {\n change(typeType);\n }\n }\n target[key] = value;\n return true;\n }\n});\n/**\n *\n */\nfunction watchDeep(type, change) {\n if (!type) {\n return type;\n }\n if (type.__isProxy === undefined) {\n // expando hack to mark a proxy\n return new Proxy(type, createHandler([], change, type));\n }\n return type;\n}\n/**\n * Watch an object with a proxy, fires change on any property value change\n */\nfunction watchAny(type, change) {\n if (!type) {\n return type;\n }\n if (type.__isProxy === undefined) {\n // expando hack to mark a proxy\n return new Proxy(type, {\n set: (obj, prop, value) => {\n // The default behavior to store the value\n obj[prop] = value;\n // Avoid watching private junk\n if (typeof prop === 'string') {\n if (prop[0] !== '_') {\n change(obj);\n }\n }\n // Indicate success\n return true;\n },\n get: (obj, prop) => {\n if (prop !== '__isProxy') {\n return obj[prop];\n }\n return true;\n }\n });\n }\n return type;\n}\n\n\n/***/ }),\n\n/***/ \"./Util/WebAudio.ts\":\n/*!**************************!*\\\n !*** ./Util/WebAudio.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ WebAudio: () => (/* binding */ WebAudio)\n/* harmony export */ });\n/* harmony import */ var _Resources_Sound_AudioContext__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Resources/Sound/AudioContext */ \"./Resources/Sound/AudioContext.ts\");\n/* harmony import */ var _Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Log */ \"./Util/Log.ts\");\n\n\n/**\n * Patch for detecting legacy web audio in browsers\n * @internal\n * @param source\n */\nfunction isLegacyWebAudioSource(source) {\n return !!source.playbackState;\n}\nclass WebAudio {\n /**\n * Play an empty sound to unlock Safari WebAudio context. Call this function\n * right after a user interaction event.\n * @source https://paulbakaus.com/tutorials/html5/web-audio-on-ios/\n */\n static unlock() {\n const promise = new Promise((resolve, reject) => {\n if (WebAudio._UNLOCKED || !_Resources_Sound_AudioContext__WEBPACK_IMPORTED_MODULE_0__.AudioContextFactory.create()) {\n return resolve(true);\n }\n const unlockTimeoutTimer = setTimeout(() => {\n _Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance().warn('Excalibur was unable to unlock the audio context, audio probably will not play in this browser.');\n resolve(false);\n }, 200);\n const audioContext = _Resources_Sound_AudioContext__WEBPACK_IMPORTED_MODULE_0__.AudioContextFactory.create();\n audioContext.resume().then(() => {\n // create empty buffer and play it\n const buffer = audioContext.createBuffer(1, 1, 22050);\n const source = audioContext.createBufferSource();\n let ended = false;\n source.buffer = buffer;\n source.connect(audioContext.destination);\n source.onended = () => (ended = true);\n source.start(0);\n // by checking the play state after some time, we know if we're really unlocked\n setTimeout(() => {\n if (isLegacyWebAudioSource(source)) {\n if (source.playbackState === source.PLAYING_STATE || source.playbackState === source.FINISHED_STATE) {\n WebAudio._UNLOCKED = true;\n }\n }\n else {\n if (audioContext.currentTime > 0 || ended) {\n WebAudio._UNLOCKED = true;\n }\n }\n }, 0);\n clearTimeout(unlockTimeoutTimer);\n resolve(true);\n }, () => {\n reject();\n });\n });\n return promise;\n }\n static isUnlocked() {\n return this._UNLOCKED;\n }\n}\nWebAudio._UNLOCKED = false;\n\n\n/***/ }),\n\n/***/ \"./index.ts\":\n/*!******************!*\\\n !*** ./index.ts ***!\n \\******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ActionCompleteEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.ActionCompleteEvent),\n/* harmony export */ ActionContext: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ActionContext),\n/* harmony export */ ActionQueue: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ActionQueue),\n/* harmony export */ ActionSequence: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ActionSequence),\n/* harmony export */ ActionStartEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.ActionStartEvent),\n/* harmony export */ ActionsComponent: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ActionsComponent),\n/* harmony export */ ActionsSystem: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ActionsSystem),\n/* harmony export */ ActivateEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.ActivateEvent),\n/* harmony export */ Actor: () => (/* reexport safe */ _Actor__WEBPACK_IMPORTED_MODULE_6__.Actor),\n/* harmony export */ ActorEvents: () => (/* reexport safe */ _Actor__WEBPACK_IMPORTED_MODULE_6__.ActorEvents),\n/* harmony export */ AddEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.AddEvent),\n/* harmony export */ AddedComponent: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.AddedComponent),\n/* harmony export */ AffineMatrix: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.AffineMatrix),\n/* harmony export */ Animation: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Animation),\n/* harmony export */ AnimationDirection: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.AnimationDirection),\n/* harmony export */ AnimationEvents: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.AnimationEvents),\n/* harmony export */ AnimationStrategy: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.AnimationStrategy),\n/* harmony export */ ArcadeSolver: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.ArcadeSolver),\n/* harmony export */ AudioContextFactory: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.AudioContextFactory),\n/* harmony export */ Axes: () => (/* reexport safe */ _Input_Gamepad__WEBPACK_IMPORTED_MODULE_40__.Axes),\n/* harmony export */ Axis: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.Axis),\n/* harmony export */ BaseAlign: () => (/* reexport safe */ _Graphics_FontCommon__WEBPACK_IMPORTED_MODULE_14__.BaseAlign),\n/* harmony export */ BezierCurve: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.BezierCurve),\n/* harmony export */ Blink: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.Blink),\n/* harmony export */ BodyComponent: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.BodyComponent),\n/* harmony export */ BoundingBox: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.BoundingBox),\n/* harmony export */ BrowserComponent: () => (/* reexport safe */ _Util_Browser__WEBPACK_IMPORTED_MODULE_45__.BrowserComponent),\n/* harmony export */ BrowserEvents: () => (/* reexport safe */ _Util_Browser__WEBPACK_IMPORTED_MODULE_45__.BrowserEvents),\n/* harmony export */ Buttons: () => (/* reexport safe */ _Input_Gamepad__WEBPACK_IMPORTED_MODULE_40__.Buttons),\n/* harmony export */ Camera: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.Camera),\n/* harmony export */ CameraEvents: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.CameraEvents),\n/* harmony export */ Canvas: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Canvas),\n/* harmony export */ Circle: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Circle),\n/* harmony export */ CircleCollider: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.CircleCollider),\n/* harmony export */ Clock: () => (/* reexport safe */ _Util_Clock__WEBPACK_IMPORTED_MODULE_53__.Clock),\n/* harmony export */ ClosestLineJumpTable: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.ClosestLineJumpTable),\n/* harmony export */ Collider: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.Collider),\n/* harmony export */ ColliderComponent: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.ColliderComponent),\n/* harmony export */ CollisionContact: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.CollisionContact),\n/* harmony export */ CollisionEndEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.CollisionEndEvent),\n/* harmony export */ CollisionGroup: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.CollisionGroup),\n/* harmony export */ CollisionGroupManager: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.CollisionGroupManager),\n/* harmony export */ CollisionJumpTable: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.CollisionJumpTable),\n/* harmony export */ CollisionPostSolveEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.CollisionPostSolveEvent),\n/* harmony export */ CollisionPreSolveEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.CollisionPreSolveEvent),\n/* harmony export */ CollisionStartEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.CollisionStartEvent),\n/* harmony export */ CollisionSystem: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.CollisionSystem),\n/* harmony export */ CollisionType: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.CollisionType),\n/* harmony export */ Color: () => (/* reexport safe */ _Color__WEBPACK_IMPORTED_MODULE_27__.Color),\n/* harmony export */ ColorBlindFlags: () => (/* reexport safe */ _Debug_index__WEBPACK_IMPORTED_MODULE_9__.ColorBlindFlags),\n/* harmony export */ ColorBlindnessMode: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ColorBlindnessMode),\n/* harmony export */ ColorBlindnessPostProcessor: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ColorBlindnessPostProcessor),\n/* harmony export */ Component: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.Component),\n/* harmony export */ CompositeCollider: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.CompositeCollider),\n/* harmony export */ ConsoleAppender: () => (/* reexport safe */ _Util_Log__WEBPACK_IMPORTED_MODULE_50__.ConsoleAppender),\n/* harmony export */ ContactConstraintPoint: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.ContactConstraintPoint),\n/* harmony export */ ContactEndEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.ContactEndEvent),\n/* harmony export */ ContactSolveBias: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.ContactSolveBias),\n/* harmony export */ ContactStartEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.ContactStartEvent),\n/* harmony export */ CoordPlane: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.CoordPlane),\n/* harmony export */ CrossFade: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.CrossFade),\n/* harmony export */ CurveBy: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.CurveBy),\n/* harmony export */ CurveTo: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.CurveTo),\n/* harmony export */ DeactivateEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.DeactivateEvent),\n/* harmony export */ Debug: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Debug),\n/* harmony export */ DebugConfig: () => (/* reexport safe */ _Debug_index__WEBPACK_IMPORTED_MODULE_9__.DebugConfig),\n/* harmony export */ DebugGraphicsComponent: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.DebugGraphicsComponent),\n/* harmony export */ DebugSystem: () => (/* reexport safe */ _Debug_index__WEBPACK_IMPORTED_MODULE_9__.DebugSystem),\n/* harmony export */ DebugText: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.DebugText),\n/* harmony export */ DefaultAntialiasOptions: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.DefaultAntialiasOptions),\n/* harmony export */ DefaultGarbageCollectionOptions: () => (/* reexport safe */ _GarbageCollector__WEBPACK_IMPORTED_MODULE_4__.DefaultGarbageCollectionOptions),\n/* harmony export */ DefaultLoader: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.DefaultLoader),\n/* harmony export */ DefaultPixelArtOptions: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.DefaultPixelArtOptions),\n/* harmony export */ DegreeOfFreedom: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.DegreeOfFreedom),\n/* harmony export */ Delay: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.Delay),\n/* harmony export */ Detector: () => (/* reexport safe */ _Util_Detector__WEBPACK_IMPORTED_MODULE_47__.Detector),\n/* harmony export */ Die: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.Die),\n/* harmony export */ Direction: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Direction),\n/* harmony export */ Director: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.Director),\n/* harmony export */ DirectorEvents: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.DirectorEvents),\n/* harmony export */ DisplayMode: () => (/* reexport safe */ _Screen__WEBPACK_IMPORTED_MODULE_5__.DisplayMode),\n/* harmony export */ DynamicTree: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.DynamicTree),\n/* harmony export */ DynamicTreeCollisionProcessor: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.DynamicTreeCollisionProcessor),\n/* harmony export */ EX_VERSION: () => (/* binding */ EX_VERSION),\n/* harmony export */ EaseBy: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.EaseBy),\n/* harmony export */ EaseTo: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.EaseTo),\n/* harmony export */ EasingFunctions: () => (/* reexport safe */ _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_48__.EasingFunctions),\n/* harmony export */ EdgeCollider: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.EdgeCollider),\n/* harmony export */ ElasticToActorStrategy: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.ElasticToActorStrategy),\n/* harmony export */ EmitterType: () => (/* reexport safe */ _Particles_index__WEBPACK_IMPORTED_MODULE_15__.EmitterType),\n/* harmony export */ Engine: () => (/* reexport safe */ _Engine__WEBPACK_IMPORTED_MODULE_3__.Engine),\n/* harmony export */ EngineEvents: () => (/* reexport safe */ _Engine__WEBPACK_IMPORTED_MODULE_3__.EngineEvents),\n/* harmony export */ EnterTriggerEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.EnterTriggerEvent),\n/* harmony export */ EnterViewPortEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.EnterViewPortEvent),\n/* harmony export */ Entity: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.Entity),\n/* harmony export */ EntityEvents: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.EntityEvents),\n/* harmony export */ EntityManager: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.EntityManager),\n/* harmony export */ EventEmitter: () => (/* reexport safe */ _EventEmitter__WEBPACK_IMPORTED_MODULE_10__.EventEmitter),\n/* harmony export */ EventTypes: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.EventTypes),\n/* harmony export */ Events: () => (/* reexport module object */ _Events__WEBPACK_IMPORTED_MODULE_12__),\n/* harmony export */ ExResponse: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.ExResponse),\n/* harmony export */ ExcaliburGraphicsContext2DCanvas: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ExcaliburGraphicsContext2DCanvas),\n/* harmony export */ ExcaliburGraphicsContextWebGL: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ExcaliburGraphicsContextWebGL),\n/* harmony export */ ExitTriggerEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.ExitTriggerEvent),\n/* harmony export */ ExitViewPortEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.ExitViewPortEvent),\n/* harmony export */ Fade: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.Fade),\n/* harmony export */ FadeInOut: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.FadeInOut),\n/* harmony export */ Flags: () => (/* reexport safe */ _Flags__WEBPACK_IMPORTED_MODULE_1__.Flags),\n/* harmony export */ Flash: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.Flash),\n/* harmony export */ Follow: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.Follow),\n/* harmony export */ Font: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Font),\n/* harmony export */ FontCache: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.FontCache),\n/* harmony export */ FontSource: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.FontSource),\n/* harmony export */ FontStyle: () => (/* reexport safe */ _Graphics_FontCommon__WEBPACK_IMPORTED_MODULE_14__.FontStyle),\n/* harmony export */ FontUnit: () => (/* reexport safe */ _Graphics_FontCommon__WEBPACK_IMPORTED_MODULE_14__.FontUnit),\n/* harmony export */ FpsSampler: () => (/* reexport safe */ _Util_Fps__WEBPACK_IMPORTED_MODULE_52__.FpsSampler),\n/* harmony export */ FrameStats: () => (/* reexport safe */ _Debug_index__WEBPACK_IMPORTED_MODULE_9__.FrameStats),\n/* harmony export */ Future: () => (/* reexport safe */ _Util_Future__WEBPACK_IMPORTED_MODULE_57__.Future),\n/* harmony export */ GameEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.GameEvent),\n/* harmony export */ GameStartEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.GameStartEvent),\n/* harmony export */ GameStopEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.GameStopEvent),\n/* harmony export */ Gamepad: () => (/* reexport safe */ _Input_Gamepad__WEBPACK_IMPORTED_MODULE_40__.Gamepad),\n/* harmony export */ GamepadAxisEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.GamepadAxisEvent),\n/* harmony export */ GamepadButtonEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.GamepadButtonEvent),\n/* harmony export */ GamepadConnectEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.GamepadConnectEvent),\n/* harmony export */ GamepadDisconnectEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.GamepadDisconnectEvent),\n/* harmony export */ Gamepads: () => (/* reexport safe */ _Input_Gamepad__WEBPACK_IMPORTED_MODULE_40__.Gamepads),\n/* harmony export */ GarbageCollector: () => (/* reexport safe */ _GarbageCollector__WEBPACK_IMPORTED_MODULE_4__.GarbageCollector),\n/* harmony export */ Gif: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.Gif),\n/* harmony export */ GifParser: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.GifParser),\n/* harmony export */ GlobalCoordinates: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.GlobalCoordinates),\n/* harmony export */ GpuParticleEmitter: () => (/* reexport safe */ _Particles_index__WEBPACK_IMPORTED_MODULE_15__.GpuParticleEmitter),\n/* harmony export */ GpuParticleRenderer: () => (/* reexport safe */ _Particles_index__WEBPACK_IMPORTED_MODULE_15__.GpuParticleRenderer),\n/* harmony export */ Graphic: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Graphic),\n/* harmony export */ GraphicsComponent: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.GraphicsComponent),\n/* harmony export */ GraphicsGroup: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.GraphicsGroup),\n/* harmony export */ GraphicsSystem: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.GraphicsSystem),\n/* harmony export */ HashColliderProxy: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.HashColliderProxy),\n/* harmony export */ HashGridCell: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.HashGridCell),\n/* harmony export */ HashGridProxy: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.HashGridProxy),\n/* harmony export */ HiddenEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.HiddenEvent),\n/* harmony export */ HorizontalFirst: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.HorizontalFirst),\n/* harmony export */ ImageFiltering: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ImageFiltering),\n/* harmony export */ ImageSource: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ImageSource),\n/* harmony export */ ImageSourceAttributeConstants: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ImageSourceAttributeConstants),\n/* harmony export */ ImageWrapping: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ImageWrapping),\n/* harmony export */ InitializeEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.InitializeEvent),\n/* harmony export */ InputHost: () => (/* reexport safe */ _Input_InputHost__WEBPACK_IMPORTED_MODULE_42__.InputHost),\n/* harmony export */ InputMapper: () => (/* reexport safe */ _Input_InputMapper__WEBPACK_IMPORTED_MODULE_43__.InputMapper),\n/* harmony export */ IsometricEntityComponent: () => (/* reexport safe */ _TileMap_index__WEBPACK_IMPORTED_MODULE_17__.IsometricEntityComponent),\n/* harmony export */ IsometricEntitySystem: () => (/* reexport safe */ _TileMap_index__WEBPACK_IMPORTED_MODULE_17__.IsometricEntitySystem),\n/* harmony export */ IsometricMap: () => (/* reexport safe */ _TileMap_index__WEBPACK_IMPORTED_MODULE_17__.IsometricMap),\n/* harmony export */ IsometricTile: () => (/* reexport safe */ _TileMap_index__WEBPACK_IMPORTED_MODULE_17__.IsometricTile),\n/* harmony export */ KeyEvent: () => (/* reexport safe */ _Input_Keyboard__WEBPACK_IMPORTED_MODULE_41__.KeyEvent),\n/* harmony export */ Keyboard: () => (/* reexport safe */ _Input_Keyboard__WEBPACK_IMPORTED_MODULE_41__.Keyboard),\n/* harmony export */ Keys: () => (/* reexport safe */ _Input_Keyboard__WEBPACK_IMPORTED_MODULE_41__.Keys),\n/* harmony export */ KillEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.KillEvent),\n/* harmony export */ Label: () => (/* reexport safe */ _Label__WEBPACK_IMPORTED_MODULE_13__.Label),\n/* harmony export */ LimitCameraBoundsStrategy: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.LimitCameraBoundsStrategy),\n/* harmony export */ Line: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Line),\n/* harmony export */ LineSegment: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.LineSegment),\n/* harmony export */ Loader: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.Loader),\n/* harmony export */ LoaderEvents: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.LoaderEvents),\n/* harmony export */ LockCameraToActorAxisStrategy: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.LockCameraToActorAxisStrategy),\n/* harmony export */ LockCameraToActorStrategy: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.LockCameraToActorStrategy),\n/* harmony export */ LogLevel: () => (/* reexport safe */ _Util_Log__WEBPACK_IMPORTED_MODULE_50__.LogLevel),\n/* harmony export */ Logger: () => (/* reexport safe */ _Util_Log__WEBPACK_IMPORTED_MODULE_50__.Logger),\n/* harmony export */ Material: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Material),\n/* harmony export */ Matrix: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.Matrix),\n/* harmony export */ MatrixLocations: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.MatrixLocations),\n/* harmony export */ MediaEvent: () => (/* reexport safe */ _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_11__.MediaEvent),\n/* harmony export */ Meet: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.Meet),\n/* harmony export */ MotionComponent: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.MotionComponent),\n/* harmony export */ MotionSystem: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.MotionSystem),\n/* harmony export */ MoveBy: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.MoveBy),\n/* harmony export */ MoveByWithOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.MoveByWithOptions),\n/* harmony export */ MoveTo: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.MoveTo),\n/* harmony export */ MoveToWithOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.MoveToWithOptions),\n/* harmony export */ NativePointerButton: () => (/* reexport safe */ _Input_NativePointerButton__WEBPACK_IMPORTED_MODULE_33__.NativePointerButton),\n/* harmony export */ NativeSoundEvent: () => (/* reexport safe */ _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_11__.NativeSoundEvent),\n/* harmony export */ NativeSoundProcessedEvent: () => (/* reexport safe */ _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_11__.NativeSoundProcessedEvent),\n/* harmony export */ NineSlice: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.NineSlice),\n/* harmony export */ NineSliceStretch: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.NineSliceStretch),\n/* harmony export */ None: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.None),\n/* harmony export */ Observable: () => (/* reexport safe */ _Util_Observable__WEBPACK_IMPORTED_MODULE_49__.Observable),\n/* harmony export */ OffscreenSystem: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.OffscreenSystem),\n/* harmony export */ Pair: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.Pair),\n/* harmony export */ ParallaxComponent: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ParallaxComponent),\n/* harmony export */ ParallelActions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ParallelActions),\n/* harmony export */ Particle: () => (/* reexport safe */ _Particles_index__WEBPACK_IMPORTED_MODULE_15__.Particle),\n/* harmony export */ ParticleEmitter: () => (/* reexport safe */ _Particles_index__WEBPACK_IMPORTED_MODULE_15__.ParticleEmitter),\n/* harmony export */ ParticleRenderer: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ParticleRenderer),\n/* harmony export */ ParticleTransform: () => (/* reexport safe */ _Particles_index__WEBPACK_IMPORTED_MODULE_15__.ParticleTransform),\n/* harmony export */ PhysicsStats: () => (/* reexport safe */ _Debug_index__WEBPACK_IMPORTED_MODULE_9__.PhysicsStats),\n/* harmony export */ PhysicsWorld: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.PhysicsWorld),\n/* harmony export */ PointerAbstraction: () => (/* reexport safe */ _Input_PointerAbstraction__WEBPACK_IMPORTED_MODULE_35__.PointerAbstraction),\n/* harmony export */ PointerButton: () => (/* reexport safe */ _Input_PointerButton__WEBPACK_IMPORTED_MODULE_32__.PointerButton),\n/* harmony export */ PointerComponent: () => (/* reexport safe */ _Input_PointerComponent__WEBPACK_IMPORTED_MODULE_36__.PointerComponent),\n/* harmony export */ PointerEvent: () => (/* reexport safe */ _Input_PointerEvent__WEBPACK_IMPORTED_MODULE_30__.PointerEvent),\n/* harmony export */ PointerEventReceiver: () => (/* reexport safe */ _Input_PointerEventReceiver__WEBPACK_IMPORTED_MODULE_34__.PointerEventReceiver),\n/* harmony export */ PointerScope: () => (/* reexport safe */ _Input_PointerScope__WEBPACK_IMPORTED_MODULE_39__.PointerScope),\n/* harmony export */ PointerSystem: () => (/* reexport safe */ _Input_PointerSystem__WEBPACK_IMPORTED_MODULE_37__.PointerSystem),\n/* harmony export */ PointerType: () => (/* reexport safe */ _Input_PointerType__WEBPACK_IMPORTED_MODULE_38__.PointerType),\n/* harmony export */ Polygon: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Polygon),\n/* harmony export */ PolygonCollider: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.PolygonCollider),\n/* harmony export */ Pool: () => (/* reexport safe */ _Util_Pool__WEBPACK_IMPORTED_MODULE_51__.Pool),\n/* harmony export */ PostCollisionEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PostCollisionEvent),\n/* harmony export */ PostDebugDrawEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PostDebugDrawEvent),\n/* harmony export */ PostDrawEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PostDrawEvent),\n/* harmony export */ PostFrameEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PostFrameEvent),\n/* harmony export */ PostKillEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PostKillEvent),\n/* harmony export */ PostTransformDrawEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PostTransformDrawEvent),\n/* harmony export */ PostUpdateEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PostUpdateEvent),\n/* harmony export */ PreCollisionEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PreCollisionEvent),\n/* harmony export */ PreDebugDrawEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PreDebugDrawEvent),\n/* harmony export */ PreDrawEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PreDrawEvent),\n/* harmony export */ PreFrameEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PreFrameEvent),\n/* harmony export */ PreKillEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PreKillEvent),\n/* harmony export */ PreLoadEvent: () => (/* reexport safe */ _Scene__WEBPACK_IMPORTED_MODULE_16__.PreLoadEvent),\n/* harmony export */ PreTransformDrawEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PreTransformDrawEvent),\n/* harmony export */ PreUpdateEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PreUpdateEvent),\n/* harmony export */ Projection: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.Projection),\n/* harmony export */ QuadIndexBuffer: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.QuadIndexBuffer),\n/* harmony export */ QuadTree: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.QuadTree),\n/* harmony export */ Query: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.Query),\n/* harmony export */ QueryManager: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.QueryManager),\n/* harmony export */ RadiusAroundActorStrategy: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.RadiusAroundActorStrategy),\n/* harmony export */ Random: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.Random),\n/* harmony export */ Raster: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Raster),\n/* harmony export */ Ray: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.Ray),\n/* harmony export */ RealisticSolver: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.RealisticSolver),\n/* harmony export */ Rectangle: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Rectangle),\n/* harmony export */ RemoveEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.RemoveEvent),\n/* harmony export */ RemovedComponent: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.RemovedComponent),\n/* harmony export */ Repeat: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.Repeat),\n/* harmony export */ RepeatForever: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.RepeatForever),\n/* harmony export */ Resolution: () => (/* reexport safe */ _Screen__WEBPACK_IMPORTED_MODULE_5__.Resolution),\n/* harmony export */ Resource: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.Resource),\n/* harmony export */ ResourceEvents: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.ResourceEvents),\n/* harmony export */ RotateBy: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.RotateBy),\n/* harmony export */ RotateByWithOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.RotateByWithOptions),\n/* harmony export */ RotateTo: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.RotateTo),\n/* harmony export */ RotateToWithOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.RotateToWithOptions),\n/* harmony export */ RotationType: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.RotationType),\n/* harmony export */ ScaleBy: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ScaleBy),\n/* harmony export */ ScaleByWithOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ScaleByWithOptions),\n/* harmony export */ ScaleTo: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ScaleTo),\n/* harmony export */ ScaleToWithOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ScaleToWithOptions),\n/* harmony export */ Scene: () => (/* reexport safe */ _Scene__WEBPACK_IMPORTED_MODULE_16__.Scene),\n/* harmony export */ SceneEvents: () => (/* reexport safe */ _Scene__WEBPACK_IMPORTED_MODULE_16__.SceneEvents),\n/* harmony export */ Screen: () => (/* reexport safe */ _Screen__WEBPACK_IMPORTED_MODULE_5__.Screen),\n/* harmony export */ ScreenAppender: () => (/* reexport safe */ _Util_Log__WEBPACK_IMPORTED_MODULE_50__.ScreenAppender),\n/* harmony export */ ScreenElement: () => (/* reexport safe */ _ScreenElement__WEBPACK_IMPORTED_MODULE_20__.ScreenElement),\n/* harmony export */ ScreenEvents: () => (/* reexport safe */ _Screen__WEBPACK_IMPORTED_MODULE_5__.ScreenEvents),\n/* harmony export */ ScreenShader: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ScreenShader),\n/* harmony export */ ScrollPreventionMode: () => (/* reexport safe */ _Engine__WEBPACK_IMPORTED_MODULE_3__.ScrollPreventionMode),\n/* harmony export */ Semaphore: () => (/* reexport safe */ _Util_Semaphore__WEBPACK_IMPORTED_MODULE_58__.Semaphore),\n/* harmony export */ SeparatingAxis: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.SeparatingAxis),\n/* harmony export */ SeparationInfo: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.SeparationInfo),\n/* harmony export */ Shader: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Shader),\n/* harmony export */ Shape: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.Shape),\n/* harmony export */ Side: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.Side),\n/* harmony export */ Slide: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.Slide),\n/* harmony export */ SolverStrategy: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.SolverStrategy),\n/* harmony export */ Sound: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.Sound),\n/* harmony export */ SoundEvents: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.SoundEvents),\n/* harmony export */ SparseHashGrid: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.SparseHashGrid),\n/* harmony export */ SparseHashGridCollisionProcessor: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.SparseHashGridCollisionProcessor),\n/* harmony export */ SpatialPartitionStrategy: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.SpatialPartitionStrategy),\n/* harmony export */ Sprite: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Sprite),\n/* harmony export */ SpriteFont: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.SpriteFont),\n/* harmony export */ SpriteSheet: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.SpriteSheet),\n/* harmony export */ StandardClock: () => (/* reexport safe */ _Util_Clock__WEBPACK_IMPORTED_MODULE_53__.StandardClock),\n/* harmony export */ StateMachine: () => (/* reexport safe */ _Util_StateMachine__WEBPACK_IMPORTED_MODULE_56__.StateMachine),\n/* harmony export */ StrategyContainer: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.StrategyContainer),\n/* harmony export */ Stream: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.Stream),\n/* harmony export */ System: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.System),\n/* harmony export */ SystemManager: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.SystemManager),\n/* harmony export */ SystemPriority: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.SystemPriority),\n/* harmony export */ SystemType: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.SystemType),\n/* harmony export */ TagQuery: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.TagQuery),\n/* harmony export */ TestClock: () => (/* reexport safe */ _Util_Clock__WEBPACK_IMPORTED_MODULE_53__.TestClock),\n/* harmony export */ Text: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Text),\n/* harmony export */ TextAlign: () => (/* reexport safe */ _Graphics_FontCommon__WEBPACK_IMPORTED_MODULE_14__.TextAlign),\n/* harmony export */ TextureLoader: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.TextureLoader),\n/* harmony export */ Tile: () => (/* reexport safe */ _TileMap_index__WEBPACK_IMPORTED_MODULE_17__.Tile),\n/* harmony export */ TileMap: () => (/* reexport safe */ _TileMap_index__WEBPACK_IMPORTED_MODULE_17__.TileMap),\n/* harmony export */ TileMapEvents: () => (/* reexport safe */ _TileMap_index__WEBPACK_IMPORTED_MODULE_17__.TileMapEvents),\n/* harmony export */ TiledAnimation: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.TiledAnimation),\n/* harmony export */ TiledSprite: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.TiledSprite),\n/* harmony export */ Timer: () => (/* reexport safe */ _Timer__WEBPACK_IMPORTED_MODULE_18__.Timer),\n/* harmony export */ Toaster: () => (/* reexport safe */ _Util_Toaster__WEBPACK_IMPORTED_MODULE_55__.Toaster),\n/* harmony export */ Transform: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.Transform),\n/* harmony export */ TransformComponent: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.TransformComponent),\n/* harmony export */ Transition: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.Transition),\n/* harmony export */ TreeNode: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.TreeNode),\n/* harmony export */ Trigger: () => (/* reexport safe */ _Trigger__WEBPACK_IMPORTED_MODULE_19__.Trigger),\n/* harmony export */ TriggerEvents: () => (/* reexport safe */ _Trigger__WEBPACK_IMPORTED_MODULE_19__.TriggerEvents),\n/* harmony export */ TwoPI: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.TwoPI),\n/* harmony export */ Util: () => (/* reexport module object */ _Util_Index__WEBPACK_IMPORTED_MODULE_44__),\n/* harmony export */ Vector: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.Vector),\n/* harmony export */ VectorView: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.VectorView),\n/* harmony export */ VertexBuffer: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.VertexBuffer),\n/* harmony export */ VertexLayout: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.VertexLayout),\n/* harmony export */ VerticalFirst: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.VerticalFirst),\n/* harmony export */ VisibleEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.VisibleEvent),\n/* harmony export */ WebAudio: () => (/* reexport safe */ _Util_WebAudio__WEBPACK_IMPORTED_MODULE_54__.WebAudio),\n/* harmony export */ WebAudioInstance: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.WebAudioInstance),\n/* harmony export */ WheelDeltaMode: () => (/* reexport safe */ _Input_WheelDeltaMode__WEBPACK_IMPORTED_MODULE_31__.WheelDeltaMode),\n/* harmony export */ WheelEvent: () => (/* reexport safe */ _Input_WheelEvent__WEBPACK_IMPORTED_MODULE_29__.WheelEvent),\n/* harmony export */ World: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.World),\n/* harmony export */ approximatelyEqual: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.approximatelyEqual),\n/* harmony export */ assert: () => (/* reexport safe */ _Util_Assert__WEBPACK_IMPORTED_MODULE_60__.assert),\n/* harmony export */ canonicalizeAngle: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.canonicalizeAngle),\n/* harmony export */ clamp: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.clamp),\n/* harmony export */ coroutine: () => (/* reexport safe */ _Util_Coroutine__WEBPACK_IMPORTED_MODULE_59__.coroutine),\n/* harmony export */ createId: () => (/* reexport safe */ _Id__WEBPACK_IMPORTED_MODULE_2__.createId),\n/* harmony export */ frac: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.frac),\n/* harmony export */ getDefaultPhysicsConfig: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.getDefaultPhysicsConfig),\n/* harmony export */ hasGraphicsTick: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.hasGraphicsTick),\n/* harmony export */ hasOnAdd: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.hasOnAdd),\n/* harmony export */ hasOnInitialize: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.hasOnInitialize),\n/* harmony export */ hasOnPostUpdate: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.hasOnPostUpdate),\n/* harmony export */ hasOnPreUpdate: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.hasOnPreUpdate),\n/* harmony export */ hasOnRemove: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.hasOnRemove),\n/* harmony export */ hasPostDraw: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.hasPostDraw),\n/* harmony export */ hasPreDraw: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.hasPreDraw),\n/* harmony export */ has_add: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.has_add),\n/* harmony export */ has_initialize: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.has_initialize),\n/* harmony export */ has_postupdate: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.has_postupdate),\n/* harmony export */ has_preupdate: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.has_preupdate),\n/* harmony export */ has_remove: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.has_remove),\n/* harmony export */ inverseLerp: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.inverseLerp),\n/* harmony export */ inverseLerpVector: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.inverseLerpVector),\n/* harmony export */ isActor: () => (/* reexport safe */ _Actor__WEBPACK_IMPORTED_MODULE_6__.isActor),\n/* harmony export */ isAddedComponent: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.isAddedComponent),\n/* harmony export */ isComponentCtor: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.isComponentCtor),\n/* harmony export */ isLoaderConstructor: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.isLoaderConstructor),\n/* harmony export */ isMoveByOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.isMoveByOptions),\n/* harmony export */ isMoveToOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.isMoveToOptions),\n/* harmony export */ isRemovedComponent: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.isRemovedComponent),\n/* harmony export */ isRotateByOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.isRotateByOptions),\n/* harmony export */ isRotateToOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.isRotateToOptions),\n/* harmony export */ isScaleByOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.isScaleByOptions),\n/* harmony export */ isScaleToOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.isScaleToOptions),\n/* harmony export */ isSceneConstructor: () => (/* reexport safe */ _Scene__WEBPACK_IMPORTED_MODULE_16__.isSceneConstructor),\n/* harmony export */ isScreenElement: () => (/* reexport safe */ _ScreenElement__WEBPACK_IMPORTED_MODULE_20__.isScreenElement),\n/* harmony export */ isSystemConstructor: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.isSystemConstructor),\n/* harmony export */ lerp: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.lerp),\n/* harmony export */ lerpAngle: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.lerpAngle),\n/* harmony export */ lerpVector: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.lerpVector),\n/* harmony export */ maxMessages: () => (/* reexport safe */ _Util_Decorators__WEBPACK_IMPORTED_MODULE_46__.maxMessages),\n/* harmony export */ nextActionId: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.nextActionId),\n/* harmony export */ obsolete: () => (/* reexport safe */ _Util_Decorators__WEBPACK_IMPORTED_MODULE_46__.obsolete),\n/* harmony export */ parseImageFiltering: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.parseImageFiltering),\n/* harmony export */ parseImageWrapping: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.parseImageWrapping),\n/* harmony export */ pixelSnapEpsilon: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.pixelSnapEpsilon),\n/* harmony export */ randomInRange: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.randomInRange),\n/* harmony export */ randomIntInRange: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.randomIntInRange),\n/* harmony export */ range: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.range),\n/* harmony export */ remap: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.remap),\n/* harmony export */ remapVector: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.remapVector),\n/* harmony export */ resetObsoleteCounter: () => (/* reexport safe */ _Util_Decorators__WEBPACK_IMPORTED_MODULE_46__.resetObsoleteCounter),\n/* harmony export */ sign: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.sign),\n/* harmony export */ toDegrees: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.toDegrees),\n/* harmony export */ toRadians: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.toRadians),\n/* harmony export */ vec: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.vec),\n/* harmony export */ webgl: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.webgl)\n/* harmony export */ });\n/* harmony import */ var _Polyfill__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Polyfill */ \"./Polyfill.ts\");\n/* harmony import */ var _Flags__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Flags */ \"./Flags.ts\");\n/* harmony import */ var _Id__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Id */ \"./Id.ts\");\n/* harmony import */ var _Engine__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Engine */ \"./Engine.ts\");\n/* harmony import */ var _GarbageCollector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./GarbageCollector */ \"./GarbageCollector.ts\");\n/* harmony import */ var _Screen__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Screen */ \"./Screen.ts\");\n/* harmony import */ var _Actor__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Actor */ \"./Actor.ts\");\n/* harmony import */ var _Math_index__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Math/index */ \"./Math/index.ts\");\n/* harmony import */ var _Camera__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Camera */ \"./Camera.ts\");\n/* harmony import */ var _Debug_index__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Debug/index */ \"./Debug/index.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Events/MediaEvents */ \"./Events/MediaEvents.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Events */ \"./Events.ts\");\n/* harmony import */ var _Label__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Label */ \"./Label.ts\");\n/* harmony import */ var _Graphics_FontCommon__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Graphics/FontCommon */ \"./Graphics/FontCommon.ts\");\n/* harmony import */ var _Particles_index__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Particles/index */ \"./Particles/index.ts\");\n/* harmony import */ var _Scene__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Scene */ \"./Scene.ts\");\n/* harmony import */ var _TileMap_index__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./TileMap/index */ \"./TileMap/index.ts\");\n/* harmony import */ var _Timer__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Timer */ \"./Timer.ts\");\n/* harmony import */ var _Trigger__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./Trigger */ \"./Trigger.ts\");\n/* harmony import */ var _ScreenElement__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./ScreenElement */ \"./ScreenElement.ts\");\n/* harmony import */ var _Actions_index__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./Actions/index */ \"./Actions/index.ts\");\n/* harmony import */ var _Collision_Index__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./Collision/Index */ \"./Collision/Index.ts\");\n/* harmony import */ var _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./Interfaces/Index */ \"./Interfaces/Index.ts\");\n/* harmony import */ var _Resources_Index__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./Resources/Index */ \"./Resources/Index.ts\");\n/* harmony import */ var _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./EntityComponentSystem/index */ \"./EntityComponentSystem/index.ts\");\n/* harmony import */ var _Director_index__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./Director/index */ \"./Director/index.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./Color */ \"./Color.ts\");\n/* harmony import */ var _Graphics_index__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./Graphics/index */ \"./Graphics/index.ts\");\n/* harmony import */ var _Input_WheelEvent__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./Input/WheelEvent */ \"./Input/WheelEvent.ts\");\n/* harmony import */ var _Input_PointerEvent__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./Input/PointerEvent */ \"./Input/PointerEvent.ts\");\n/* harmony import */ var _Input_WheelDeltaMode__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./Input/WheelDeltaMode */ \"./Input/WheelDeltaMode.ts\");\n/* harmony import */ var _Input_PointerButton__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./Input/PointerButton */ \"./Input/PointerButton.ts\");\n/* harmony import */ var _Input_NativePointerButton__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./Input/NativePointerButton */ \"./Input/NativePointerButton.ts\");\n/* harmony import */ var _Input_PointerEventReceiver__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./Input/PointerEventReceiver */ \"./Input/PointerEventReceiver.ts\");\n/* harmony import */ var _Input_PointerAbstraction__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./Input/PointerAbstraction */ \"./Input/PointerAbstraction.ts\");\n/* harmony import */ var _Input_PointerComponent__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./Input/PointerComponent */ \"./Input/PointerComponent.ts\");\n/* harmony import */ var _Input_PointerSystem__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./Input/PointerSystem */ \"./Input/PointerSystem.ts\");\n/* harmony import */ var _Input_PointerType__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./Input/PointerType */ \"./Input/PointerType.ts\");\n/* harmony import */ var _Input_PointerScope__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./Input/PointerScope */ \"./Input/PointerScope.ts\");\n/* harmony import */ var _Input_Gamepad__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./Input/Gamepad */ \"./Input/Gamepad.ts\");\n/* harmony import */ var _Input_Keyboard__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ./Input/Keyboard */ \"./Input/Keyboard.ts\");\n/* harmony import */ var _Input_InputHost__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ./Input/InputHost */ \"./Input/InputHost.ts\");\n/* harmony import */ var _Input_InputMapper__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ./Input/InputMapper */ \"./Input/InputMapper.ts\");\n/* harmony import */ var _Util_Index__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! ./Util/Index */ \"./Util/Index.ts\");\n/* harmony import */ var _Util_Browser__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! ./Util/Browser */ \"./Util/Browser.ts\");\n/* harmony import */ var _Util_Decorators__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! ./Util/Decorators */ \"./Util/Decorators.ts\");\n/* harmony import */ var _Util_Detector__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! ./Util/Detector */ \"./Util/Detector.ts\");\n/* harmony import */ var _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! ./Util/EasingFunctions */ \"./Util/EasingFunctions.ts\");\n/* harmony import */ var _Util_Observable__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(/*! ./Util/Observable */ \"./Util/Observable.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(/*! ./Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Util_Pool__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(/*! ./Util/Pool */ \"./Util/Pool.ts\");\n/* harmony import */ var _Util_Fps__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(/*! ./Util/Fps */ \"./Util/Fps.ts\");\n/* harmony import */ var _Util_Clock__WEBPACK_IMPORTED_MODULE_53__ = __webpack_require__(/*! ./Util/Clock */ \"./Util/Clock.ts\");\n/* harmony import */ var _Util_WebAudio__WEBPACK_IMPORTED_MODULE_54__ = __webpack_require__(/*! ./Util/WebAudio */ \"./Util/WebAudio.ts\");\n/* harmony import */ var _Util_Toaster__WEBPACK_IMPORTED_MODULE_55__ = __webpack_require__(/*! ./Util/Toaster */ \"./Util/Toaster.ts\");\n/* harmony import */ var _Util_StateMachine__WEBPACK_IMPORTED_MODULE_56__ = __webpack_require__(/*! ./Util/StateMachine */ \"./Util/StateMachine.ts\");\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_57__ = __webpack_require__(/*! ./Util/Future */ \"./Util/Future.ts\");\n/* harmony import */ var _Util_Semaphore__WEBPACK_IMPORTED_MODULE_58__ = __webpack_require__(/*! ./Util/Semaphore */ \"./Util/Semaphore.ts\");\n/* harmony import */ var _Util_Coroutine__WEBPACK_IMPORTED_MODULE_59__ = __webpack_require__(/*! ./Util/Coroutine */ \"./Util/Coroutine.ts\");\n/* harmony import */ var _Util_Assert__WEBPACK_IMPORTED_MODULE_60__ = __webpack_require__(/*! ./Util/Assert */ \"./Util/Assert.ts\");\n/**\n * The current Excalibur version string\n * @description `process.env.__EX_VERSION` gets replaced by Webpack on build\n */\nconst EX_VERSION = \"0.30.1\";\n\n(0,_Polyfill__WEBPACK_IMPORTED_MODULE_0__.polyfill)();\n// This file is used as the bundle entry point and exports everything\n// that will be exposed as the `ex` global variable.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// ex.Events namespace\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// ex.Util namespaces\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// ex.Deprecated\n// import * as deprecated from './Deprecated';\n// export { deprecated as Deprecated };\n// export * from './Deprecated';\n\n\n/***/ }),\n\n/***/ \"./Director/Loader.logo.png\":\n/*!**********************************!*\\\n !*** ./Director/Loader.logo.png ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAdQAAAB2CAYAAABxhGI9AAAACXBIWXMAAAsSAAALEgHS3X78AAAKnUlEQVR42u3dP2wjSx0H8N8hJIonIRmJjsq0SBR+BQ1dcqKhe0lD77SvSwpKkJKGPulpktfRIMUdEqKIqV57rpAokM4dbSiyq7ONPTP7x39ifz7SFbnEnp3xer47O7uzH15fXwMA6OYHmgAABCoACFQAEKgAgEAFAIEKAAIVAAQqACBQAUCgAoBABQCBCgAIVAAQqAAgUAFAoAIAAhUABCoACFQAEKgAgECFLbmOiNeFf2PbAyz68Pr6qhUgbRwR92v+/zwiJrYHMEKFMmcN///UtgcQqFBk1PD/97U9Qx8VCFSgu4EmAIEKAAIVAAQqACBQ4Z25jojP8eX+0WtNAgIVaOY+Im5j+eKh24h41jQgUIEyZ7F5NaPU7wCBCiwYd/w9cOB+qAlgJ3KLLow0EV198803RWvJfvfddx+0lhEqHKu5JgAjVCBvlhmFzjQRXUekHz9+TP79y8uLRjNChXfvoePvAYEKxNtj1e42/O5JoIJABcrdRMRVLM+X3kTEpaaB988cKuzWg9EobTWdMx0Oly8uN4dqhAoARqgnaN3arHfqu7OyH8ItKLVB/P+CEfMTHyGPY3npx1m8zWGDEeoBfUk/xdti57dr/r1Wv2+6EPow3tZ5rRdS72s1neuF97xvWd+XTH0/V+UMttDWqbI/r2nrxfp+jv2uSjSO7S+OXy/A/3lN+9xX5T5HxEUPZZ0tfB71+w57eJ/HFu+z+jkv1u92YX9fbI/HhX3JA9rp5MPr66tWaG9UfUGbrHIzi7cLUyYFf/tpTady03EEeL8mUJ6i7MKYNvWNqr4Pe2jradXO60LrvPAz2PQ5RPX684ah8dxD+2zantnCgVipSVV+m/tgB9W2DDq2Sx/vM95wcHhZhWVJm8yrv58cSgfTdc70+++/X/r522+/tUKSEepBqo+om4ZLPerMjUwuNnQCtx1GWJtee1FwdD5uWd86xLs8UaVt2aNEO1/saZ/Z5rYMW4zq6v34rGV9Bg3q2eZ9SkeNm9qwyUh30OPIHYFKx5FG03C7znSOqYBq+qW/zpQ3anH037TNHluG6f0WPsPhHvab4QFty7ogOeuxDYcNy2/zu2214WNYWxmBurNO8bGn97pNBOO8xy/9uCorZZ4I2r4C7aJgO7ZV9iE49Dm6NvOWx+pWE9CUq3zbdTp9doz38TbXtzqH9RT5CyWe422OaZoZGeZCabrhPQY9HjwsjpTvCg4YtlE2+Ta/j2bzn8fqrDqgm+6yUHOmAvWUjAtGhbNYvsBknDnqH1Qhc7VmxHgeb/NbudA5j/UXlYwif2p6luhAc9teu1npiHKnDs8if6tCm7JLX3NKpgttXe9ruc9mHMd7a83iwdxF5vt8tutARaCeklRnNK9C8WnNF7geJQ4T4XG3JhSnVdilQrG+yOnrlVHfsEGYzhNBn7Lu6tS7+HJafJQ4EMiNlNqWXZ9WPvVgnVYHG5M1ByDXkT6leX2EgTqJtyt45yv7S2qO3sEZjZhDLXeR+YKdJ0Zdk8QocvH9N732KrNtq+FZ/zzIHABcJrYpd+Xv14lOd5ap76SgrduW/VTQ1qcQpqnbgu4ifZvUMNpd9XuoZmvCtPaQ2Y/BCHVLgbrJTeRPDdVf6pfMKDU2fOkHmVFFfXr3MsouLsnNvV5kRoe5+s431PeuoKPqWnaurY/ZPBEeqwceN4l96iwO6H7Mjq4y7VGPVNe10VaZMzVCPVWpI/Z6FZbcv5fMqGCU+dLfFGzj58jP8+bCdJCo7yzKTwdOF0bu9Ug7V4c+yz7FJfYeGoysUss0HssIdVZwYLDujMqlESoCdTtGsZtbHnJBeNdDSJSs0jTKdMJN1HNX54Wv7bvsU9NkVJVa13dX+/wuArV0X/l5RHyo/lnfF4G6p6DrS0kHdtXhy35TGErDPYZUn2WfWqDOo/lVqdMD2O/hKJhD7S/odukymq9s02QN4EEPR/zbaOumZc+r15zK1Zqznl9jsfiemTM1QmV3HUuTkedlg9HIQzRbUD93dfC+2tpj2fIHEH2+RqCCQH13gZq7hWXTNpVu19OB1fc9nQ0AKOKUb5lU0P1kDyOneoWk0lOZ9cIP0x7qu8+2BhCoR2wYu1+e7DmaXzBSsu5vaX1ne2zrpmUPTmxf7PM1Dm4y/vC7ny7Nif7+z/9ZmtM0Z3panPLtPmra9f16bcK0Dpbnwk43Vd/RHtu6zfNQTy1QBy3aqG2g9nVmxml+BOoJyT3NpWmn9xhfFnu4bvDa+44BXhqqfdf3uUF9+yz77AT31Yue2mjecYQ62NLfgkA9ghHqLNEhNem4H1c6vdyDxhf/bpz5m4coW/c39wi6VH2bPtHlcaV9cvXts+zxCe6rTeqc2ndL7uGd93QwM9bFcAzMoZZ7SgTBbWx+asui61h/iq1+RmjqdbnQXQ3T1DNQ63V/U9ucqm/pMzPb1rePsk/1iTOjgvatR4W3Lc8ULB78pELyrnAfeTcj1NU509/86mfJ33/8+Mf00a05UyPUEw7UVCeWG/WNEiExyHRMt5ltW30izUPk18ytt7lNfc8i//DvtvXto+ySA5BjljsLUF8lPkqMPEtW1JomDsiGBZ9Byb4NAvUITSN9GuwsIj6t6UTOqk7jJREkmzqli8xIs96udSO20sX0H1vW92IL9e1a9rgqVyf91gbPsTy9UD9n9lOkT8k+RfkFR5PMNqxOcdSf32PBvg3vilO+zdxE+okx9Wm0ph36XYsRZCpMF993GOk5qvqB3Dct6jvssb67KvuUNJ3frw92bhr8/STSF0JdRPMLpUCgnsgo9S76PZ246ZFk1wWvK5m3vVoYvW1Sz7nN91jfXbQ1ZQc7TW6HeaoOalypG/8/p/rP1aNAc6ZHzSnfdqPUPhdy2PQw6Nz9gSVhuhiqueUHR3uu7y7K3rdDX4u46ZrPbUa0IFBZ0seKQ3XQTRt2vm3W/a2DbNKys++rvm3ep6+y1x2UdP3bWU9lzra47U1GmlctX/sQ23t+aOlByLTh/4NAPaCRxtcdO5HLSJ/6vNtCwGx67VPmPbvWd1q9frKHtp4kAqRJ2HR9j762JfX3bZ//elPtj13PPDx1+D5tqk/Xi6NO8SHz7MmH19dXrdBNfVFP6T2PT1UHNit87/t4m5+aRH+nQBdvqyhZDKJLfZs8h7XPsqdV2ZOV+tanKB8aln0dyxdAXbV4j4gvt4oMOrbP6vbU73NW7TMlbdTnPrWpfqXfh9HKZ9vke7KuTeZRNtXRSe6+1FV//ce/ln5eXfsXgcqXzr6+9261M3moOoa7E6nvTZTfy7iNsmfb7kjfgXGsvxe0vihsEts9HTquPpt1q1vtahu2TqAiUAEEKj0zhwoARqgAu/OnX/442WH+9xc/Wvr58re/Tr7f41/+ZsRqhAoACFQAEKgAcHjMoQJskJsz/eqrr5Z+vvr7v5fmQFevAl5lztQIFQAQqAAgUAHgIJlDBdhgdQ41N2eKESoAIFABQKACwFEwhwoARqgAIFABQKACAAIVAAQqAAhUABCoAIBABQCBCgACFQAEKgAgUAFAoAKAQAUAgQoACFQAEKgAIFABQKACAAIVAAQqAAhUABCoAIBABQCBCgACFQAQqAAgUAFAoAKAQAUAlvwPcFDns1DsH4sAAAAASUVORK5CYII=\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/debug-font.png\":\n/*!*****************************************!*\\\n !*** ./Graphics/Context/debug-font.png ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAABACAYAAAD1Xam+AAAAAXNSR0IArs4c6QAABlFJREFUeJztndmy4yoMRcWt/v9fdr8EWoDAaDD4JntVpeqcxBrMIGQDNhEAAAAAAAAAAAAAAOCrSbMfr+u6yoEpTY+906GV57YtPkjyXj9WZZ+wHWHfo2N3/bU6Tte9Rv6ptruqRyMvKvvIX/zY3I/vjLeqsg6l/CWdp0KHKO/1Y1H2EdsR9j06Ntdfp+N03SvkH2u7i3pu5XkQ+DNTkgNJSok+/183xpcdWZHjgUzpQ2pGD67vaf//KRAGAq3tdhCy2tcMQKPyXyz7iPqrdBjbX5h9g7xbtvWf4ZJvM4D/BKG24Sd+IkQ0TC9aW5NM5FbO2HgrPVzW2vmN50DZNv/QWtl5bfPy85SBtdy9dFmjsf2F2SehTBVE+u+tkE5+lAGcJlFwGuodwRRU2Qe3rx0FhPNflc3HWC7BEh8EDGVR5IMCiLnDONtPp87qhxVH/S/LvzUAuDs/kyGimA5oSONKR1w8vsLpv+v+S9vhmS71JRiX1xB5CWZNw7m6rMrllMag/RJyWb67BEgpDVMWSydc+K47pr35w05kWd7ReEq6116KaG4CsbJ7OmV9PdZLEKkONiC1/7ZONVgDsajLIJPYp2OUAXRpnPcGmnIE6eSK4nv5YQqqSYO52JqnYfYj/PdQXQIY7XszuMofMgZRT/1LdeC5h2I5/0EdWDMY2Yb05WDE1RodVdpSA5r85slArAVnSf+89iP896St0f5bZKVA7Gk/3ja8q+152/+wrLqBWZTem3IBADbRBoDuHgAA4HdAAADgh0EAAOCHQQAA4IdBAADgh0EAAOCHuVsKbJ3P9M7jjuxHzGfv8j9iDt47Dx7hP8cjq5F/o/0T62Aer//ZOgDrajBp6aNlOWTEajKLjgj/Pcs/vfZD/a++3Pc8hNfZ966EVeh5vP75luDRJUAl0KzJfnopaqbaTuzZiulc2BS5lltFXntu3dcQsXadl59Wn1H+dfYNtrt2d6D/LDF9HkCQw6eXFbr8P9X5W/un5Ol8gz1t39p5pWOPn0vLynbgdnfe8maEQw+UIPJdfxdOd/4oTtVD0IYg8wDywGas0I04T5O3P8/qf2UWwPpkn1PbOT1bN2tFe59EM7TvKf+TRFw+erZ2ey4hpS3hp9qBkqq/tjsSU1OYqucBWB1yynt5QxC42Mdk30pAEIio//zRG3feBzLUX+TTjCKwlH83aI/KbpQBVEHgUGF0j/SitcLofHem8q6AyH0wBhFv4WszuOjy0yK2vc/oRWQoP2X9ve78jfaLnpncbBqQSC6s0HnIRT0a2yNZjfxT8+ir8t+yDsDTWaS6X70GP33+d77stp+I5HtBdwEAAPBl8ECApcAA/DBvfSowAGAB7/05ZAAA/DAIAADMMU3fOuS2ggAAwBjrorKoxWiPBxHMAgAg490Ts0VeePdA+ZfJDKcCh7sBqY88mmjklZeOt9iXPrvx2I2QPRnN2/qzyJ84h4gNcbtfasq5mM1rZr+bBWh2A+bIIX13Z9wqL+nQvFno7v3oq4tJItCed7isUT6C/I7BUn9KP95wDicYBYpcjncrO2c/dmW4tBtw4RiRld1IDxDyYsoXMHxF1w3dyz0Nne8033AOFsT6VgRCafl89fenTZUfbm8CGhrgdDcS7anAsvnkkP0IeCfQ+JzYunky6jhNYj5bl7++4fJvN9WDSKS/292A0wyANyKDI91bfkm3kcH7ckaP/SKW/VHKRZAcI14pP3beu0fPyn/DuZQbWMogNnsc16sziE96f7H/iai7uTf0/3N8lwFz/e13T00Djt4OrInCnkeChXT+qOcKOLA21tJpsv/G8/COnGnw97J9QwbTvd6djYSv7fxEVTuV/LzNhj7nOawv6bfbAGCYEpQ6HxFtuxs6sq9tzOYHobQ6Nje+6vo5BwFrPZ4OgMayS4PPt1NlzdLfbRCYBoBc+NaO4JWPwLEf33oN3unY3InKPQBW6Z7nEZzEmrl4iZjC804lqgePPEOguQcwWghUphxm343wyt/pWpWR0OrR+jvyxavHajfb9pTjbt9bH07Z5/expM4TLWfwb7QQqMoC+UDWXZo/4RgA38LOgUvLJAAQ1Td9y9//0ylxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+g79apuVUsS5ZmwAAAABJRU5ErkJggg==\");\n\n/***/ })\n\n/******/ });\n/************************************************************************/\n/******/ // The module cache\n/******/ var __webpack_module_cache__ = {};\n/******/ \n/******/ // The require function\n/******/ function __webpack_require__(moduleId) {\n/******/ \t// Check if module is in cache\n/******/ \tvar cachedModule = __webpack_module_cache__[moduleId];\n/******/ \tif (cachedModule !== undefined) {\n/******/ \t\treturn cachedModule.exports;\n/******/ \t}\n/******/ \t// Create a new module (and put it into the cache)\n/******/ \tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\tid: moduleId,\n/******/ \t\t// no module.loaded needed\n/******/ \t\texports: {}\n/******/ \t};\n/******/ \n/******/ \t// Execute the module function\n/******/ \t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/ \n/******/ \t// Return the exports of the module\n/******/ \treturn module.exports;\n/******/ }\n/******/ \n/************************************************************************/\n/******/ /* webpack/runtime/compat get default export */\n/******/ (() => {\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = (module) => {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t() => (module['default']) :\n/******/ \t\t\t() => (module);\n/******/ \t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\treturn getter;\n/******/ \t};\n/******/ })();\n/******/ \n/******/ /* webpack/runtime/define property getters */\n/******/ (() => {\n/******/ \t// define getter functions for harmony exports\n/******/ \t__webpack_require__.d = (exports, definition) => {\n/******/ \t\tfor(var key in definition) {\n/******/ \t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t}\n/******/ \t\t}\n/******/ \t};\n/******/ })();\n/******/ \n/******/ /* webpack/runtime/hasOwnProperty shorthand */\n/******/ (() => {\n/******/ \t__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))\n/******/ })();\n/******/ \n/******/ /* webpack/runtime/make namespace object */\n/******/ (() => {\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = (exports) => {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/ })();\n/******/ \n/************************************************************************/\n/******/ \n/******/ // startup\n/******/ // Load entry module and return exports\n/******/ // This entry module is referenced by other modules so it can't be inlined\n/******/ var __webpack_exports__ = __webpack_require__(\"./index.ts\");\n/******/ var __webpack_exports__ActionCompleteEvent = __webpack_exports__.ActionCompleteEvent;\n/******/ var __webpack_exports__ActionContext = __webpack_exports__.ActionContext;\n/******/ var __webpack_exports__ActionQueue = __webpack_exports__.ActionQueue;\n/******/ var __webpack_exports__ActionSequence = __webpack_exports__.ActionSequence;\n/******/ var __webpack_exports__ActionStartEvent = __webpack_exports__.ActionStartEvent;\n/******/ var __webpack_exports__ActionsComponent = __webpack_exports__.ActionsComponent;\n/******/ var __webpack_exports__ActionsSystem = __webpack_exports__.ActionsSystem;\n/******/ var __webpack_exports__ActivateEvent = __webpack_exports__.ActivateEvent;\n/******/ var __webpack_exports__Actor = __webpack_exports__.Actor;\n/******/ var __webpack_exports__ActorEvents = __webpack_exports__.ActorEvents;\n/******/ var __webpack_exports__AddEvent = __webpack_exports__.AddEvent;\n/******/ var __webpack_exports__AddedComponent = __webpack_exports__.AddedComponent;\n/******/ var __webpack_exports__AffineMatrix = __webpack_exports__.AffineMatrix;\n/******/ var __webpack_exports__Animation = __webpack_exports__.Animation;\n/******/ var __webpack_exports__AnimationDirection = __webpack_exports__.AnimationDirection;\n/******/ var __webpack_exports__AnimationEvents = __webpack_exports__.AnimationEvents;\n/******/ var __webpack_exports__AnimationStrategy = __webpack_exports__.AnimationStrategy;\n/******/ var __webpack_exports__ArcadeSolver = __webpack_exports__.ArcadeSolver;\n/******/ var __webpack_exports__AudioContextFactory = __webpack_exports__.AudioContextFactory;\n/******/ var __webpack_exports__Axes = __webpack_exports__.Axes;\n/******/ var __webpack_exports__Axis = __webpack_exports__.Axis;\n/******/ var __webpack_exports__BaseAlign = __webpack_exports__.BaseAlign;\n/******/ var __webpack_exports__BezierCurve = __webpack_exports__.BezierCurve;\n/******/ var __webpack_exports__Blink = __webpack_exports__.Blink;\n/******/ var __webpack_exports__BodyComponent = __webpack_exports__.BodyComponent;\n/******/ var __webpack_exports__BoundingBox = __webpack_exports__.BoundingBox;\n/******/ var __webpack_exports__BrowserComponent = __webpack_exports__.BrowserComponent;\n/******/ var __webpack_exports__BrowserEvents = __webpack_exports__.BrowserEvents;\n/******/ var __webpack_exports__Buttons = __webpack_exports__.Buttons;\n/******/ var __webpack_exports__Camera = __webpack_exports__.Camera;\n/******/ var __webpack_exports__CameraEvents = __webpack_exports__.CameraEvents;\n/******/ var __webpack_exports__Canvas = __webpack_exports__.Canvas;\n/******/ var __webpack_exports__Circle = __webpack_exports__.Circle;\n/******/ var __webpack_exports__CircleCollider = __webpack_exports__.CircleCollider;\n/******/ var __webpack_exports__Clock = __webpack_exports__.Clock;\n/******/ var __webpack_exports__ClosestLineJumpTable = __webpack_exports__.ClosestLineJumpTable;\n/******/ var __webpack_exports__Collider = __webpack_exports__.Collider;\n/******/ var __webpack_exports__ColliderComponent = __webpack_exports__.ColliderComponent;\n/******/ var __webpack_exports__CollisionContact = __webpack_exports__.CollisionContact;\n/******/ var __webpack_exports__CollisionEndEvent = __webpack_exports__.CollisionEndEvent;\n/******/ var __webpack_exports__CollisionGroup = __webpack_exports__.CollisionGroup;\n/******/ var __webpack_exports__CollisionGroupManager = __webpack_exports__.CollisionGroupManager;\n/******/ var __webpack_exports__CollisionJumpTable = __webpack_exports__.CollisionJumpTable;\n/******/ var __webpack_exports__CollisionPostSolveEvent = __webpack_exports__.CollisionPostSolveEvent;\n/******/ var __webpack_exports__CollisionPreSolveEvent = __webpack_exports__.CollisionPreSolveEvent;\n/******/ var __webpack_exports__CollisionStartEvent = __webpack_exports__.CollisionStartEvent;\n/******/ var __webpack_exports__CollisionSystem = __webpack_exports__.CollisionSystem;\n/******/ var __webpack_exports__CollisionType = __webpack_exports__.CollisionType;\n/******/ var __webpack_exports__Color = __webpack_exports__.Color;\n/******/ var __webpack_exports__ColorBlindFlags = __webpack_exports__.ColorBlindFlags;\n/******/ var __webpack_exports__ColorBlindnessMode = __webpack_exports__.ColorBlindnessMode;\n/******/ var __webpack_exports__ColorBlindnessPostProcessor = __webpack_exports__.ColorBlindnessPostProcessor;\n/******/ var __webpack_exports__Component = __webpack_exports__.Component;\n/******/ var __webpack_exports__CompositeCollider = __webpack_exports__.CompositeCollider;\n/******/ var __webpack_exports__ConsoleAppender = __webpack_exports__.ConsoleAppender;\n/******/ var __webpack_exports__ContactConstraintPoint = __webpack_exports__.ContactConstraintPoint;\n/******/ var __webpack_exports__ContactEndEvent = __webpack_exports__.ContactEndEvent;\n/******/ var __webpack_exports__ContactSolveBias = __webpack_exports__.ContactSolveBias;\n/******/ var __webpack_exports__ContactStartEvent = __webpack_exports__.ContactStartEvent;\n/******/ var __webpack_exports__CoordPlane = __webpack_exports__.CoordPlane;\n/******/ var __webpack_exports__CrossFade = __webpack_exports__.CrossFade;\n/******/ var __webpack_exports__CurveBy = __webpack_exports__.CurveBy;\n/******/ var __webpack_exports__CurveTo = __webpack_exports__.CurveTo;\n/******/ var __webpack_exports__DeactivateEvent = __webpack_exports__.DeactivateEvent;\n/******/ var __webpack_exports__Debug = __webpack_exports__.Debug;\n/******/ var __webpack_exports__DebugConfig = __webpack_exports__.DebugConfig;\n/******/ var __webpack_exports__DebugGraphicsComponent = __webpack_exports__.DebugGraphicsComponent;\n/******/ var __webpack_exports__DebugSystem = __webpack_exports__.DebugSystem;\n/******/ var __webpack_exports__DebugText = __webpack_exports__.DebugText;\n/******/ var __webpack_exports__DefaultAntialiasOptions = __webpack_exports__.DefaultAntialiasOptions;\n/******/ var __webpack_exports__DefaultGarbageCollectionOptions = __webpack_exports__.DefaultGarbageCollectionOptions;\n/******/ var __webpack_exports__DefaultLoader = __webpack_exports__.DefaultLoader;\n/******/ var __webpack_exports__DefaultPixelArtOptions = __webpack_exports__.DefaultPixelArtOptions;\n/******/ var __webpack_exports__DegreeOfFreedom = __webpack_exports__.DegreeOfFreedom;\n/******/ var __webpack_exports__Delay = __webpack_exports__.Delay;\n/******/ var __webpack_exports__Detector = __webpack_exports__.Detector;\n/******/ var __webpack_exports__Die = __webpack_exports__.Die;\n/******/ var __webpack_exports__Direction = __webpack_exports__.Direction;\n/******/ var __webpack_exports__Director = __webpack_exports__.Director;\n/******/ var __webpack_exports__DirectorEvents = __webpack_exports__.DirectorEvents;\n/******/ var __webpack_exports__DisplayMode = __webpack_exports__.DisplayMode;\n/******/ var __webpack_exports__DynamicTree = __webpack_exports__.DynamicTree;\n/******/ var __webpack_exports__DynamicTreeCollisionProcessor = __webpack_exports__.DynamicTreeCollisionProcessor;\n/******/ var __webpack_exports__EX_VERSION = __webpack_exports__.EX_VERSION;\n/******/ var __webpack_exports__EaseBy = __webpack_exports__.EaseBy;\n/******/ var __webpack_exports__EaseTo = __webpack_exports__.EaseTo;\n/******/ var __webpack_exports__EasingFunctions = __webpack_exports__.EasingFunctions;\n/******/ var __webpack_exports__EdgeCollider = __webpack_exports__.EdgeCollider;\n/******/ var __webpack_exports__ElasticToActorStrategy = __webpack_exports__.ElasticToActorStrategy;\n/******/ var __webpack_exports__EmitterType = __webpack_exports__.EmitterType;\n/******/ var __webpack_exports__Engine = __webpack_exports__.Engine;\n/******/ var __webpack_exports__EngineEvents = __webpack_exports__.EngineEvents;\n/******/ var __webpack_exports__EnterTriggerEvent = __webpack_exports__.EnterTriggerEvent;\n/******/ var __webpack_exports__EnterViewPortEvent = __webpack_exports__.EnterViewPortEvent;\n/******/ var __webpack_exports__Entity = __webpack_exports__.Entity;\n/******/ var __webpack_exports__EntityEvents = __webpack_exports__.EntityEvents;\n/******/ var __webpack_exports__EntityManager = __webpack_exports__.EntityManager;\n/******/ var __webpack_exports__EventEmitter = __webpack_exports__.EventEmitter;\n/******/ var __webpack_exports__EventTypes = __webpack_exports__.EventTypes;\n/******/ var __webpack_exports__Events = __webpack_exports__.Events;\n/******/ var __webpack_exports__ExResponse = __webpack_exports__.ExResponse;\n/******/ var __webpack_exports__ExcaliburGraphicsContext2DCanvas = __webpack_exports__.ExcaliburGraphicsContext2DCanvas;\n/******/ var __webpack_exports__ExcaliburGraphicsContextWebGL = __webpack_exports__.ExcaliburGraphicsContextWebGL;\n/******/ var __webpack_exports__ExitTriggerEvent = __webpack_exports__.ExitTriggerEvent;\n/******/ var __webpack_exports__ExitViewPortEvent = __webpack_exports__.ExitViewPortEvent;\n/******/ var __webpack_exports__Fade = __webpack_exports__.Fade;\n/******/ var __webpack_exports__FadeInOut = __webpack_exports__.FadeInOut;\n/******/ var __webpack_exports__Flags = __webpack_exports__.Flags;\n/******/ var __webpack_exports__Flash = __webpack_exports__.Flash;\n/******/ var __webpack_exports__Follow = __webpack_exports__.Follow;\n/******/ var __webpack_exports__Font = __webpack_exports__.Font;\n/******/ var __webpack_exports__FontCache = __webpack_exports__.FontCache;\n/******/ var __webpack_exports__FontSource = __webpack_exports__.FontSource;\n/******/ var __webpack_exports__FontStyle = __webpack_exports__.FontStyle;\n/******/ var __webpack_exports__FontUnit = __webpack_exports__.FontUnit;\n/******/ var __webpack_exports__FpsSampler = __webpack_exports__.FpsSampler;\n/******/ var __webpack_exports__FrameStats = __webpack_exports__.FrameStats;\n/******/ var __webpack_exports__Future = __webpack_exports__.Future;\n/******/ var __webpack_exports__GameEvent = __webpack_exports__.GameEvent;\n/******/ var __webpack_exports__GameStartEvent = __webpack_exports__.GameStartEvent;\n/******/ var __webpack_exports__GameStopEvent = __webpack_exports__.GameStopEvent;\n/******/ var __webpack_exports__Gamepad = __webpack_exports__.Gamepad;\n/******/ var __webpack_exports__GamepadAxisEvent = __webpack_exports__.GamepadAxisEvent;\n/******/ var __webpack_exports__GamepadButtonEvent = __webpack_exports__.GamepadButtonEvent;\n/******/ var __webpack_exports__GamepadConnectEvent = __webpack_exports__.GamepadConnectEvent;\n/******/ var __webpack_exports__GamepadDisconnectEvent = __webpack_exports__.GamepadDisconnectEvent;\n/******/ var __webpack_exports__Gamepads = __webpack_exports__.Gamepads;\n/******/ var __webpack_exports__GarbageCollector = __webpack_exports__.GarbageCollector;\n/******/ var __webpack_exports__Gif = __webpack_exports__.Gif;\n/******/ var __webpack_exports__GifParser = __webpack_exports__.GifParser;\n/******/ var __webpack_exports__GlobalCoordinates = __webpack_exports__.GlobalCoordinates;\n/******/ var __webpack_exports__GpuParticleEmitter = __webpack_exports__.GpuParticleEmitter;\n/******/ var __webpack_exports__GpuParticleRenderer = __webpack_exports__.GpuParticleRenderer;\n/******/ var __webpack_exports__Graphic = __webpack_exports__.Graphic;\n/******/ var __webpack_exports__GraphicsComponent = __webpack_exports__.GraphicsComponent;\n/******/ var __webpack_exports__GraphicsGroup = __webpack_exports__.GraphicsGroup;\n/******/ var __webpack_exports__GraphicsSystem = __webpack_exports__.GraphicsSystem;\n/******/ var __webpack_exports__HashColliderProxy = __webpack_exports__.HashColliderProxy;\n/******/ var __webpack_exports__HashGridCell = __webpack_exports__.HashGridCell;\n/******/ var __webpack_exports__HashGridProxy = __webpack_exports__.HashGridProxy;\n/******/ var __webpack_exports__HiddenEvent = __webpack_exports__.HiddenEvent;\n/******/ var __webpack_exports__HorizontalFirst = __webpack_exports__.HorizontalFirst;\n/******/ var __webpack_exports__ImageFiltering = __webpack_exports__.ImageFiltering;\n/******/ var __webpack_exports__ImageSource = __webpack_exports__.ImageSource;\n/******/ var __webpack_exports__ImageSourceAttributeConstants = __webpack_exports__.ImageSourceAttributeConstants;\n/******/ var __webpack_exports__ImageWrapping = __webpack_exports__.ImageWrapping;\n/******/ var __webpack_exports__InitializeEvent = __webpack_exports__.InitializeEvent;\n/******/ var __webpack_exports__InputHost = __webpack_exports__.InputHost;\n/******/ var __webpack_exports__InputMapper = __webpack_exports__.InputMapper;\n/******/ var __webpack_exports__IsometricEntityComponent = __webpack_exports__.IsometricEntityComponent;\n/******/ var __webpack_exports__IsometricEntitySystem = __webpack_exports__.IsometricEntitySystem;\n/******/ var __webpack_exports__IsometricMap = __webpack_exports__.IsometricMap;\n/******/ var __webpack_exports__IsometricTile = __webpack_exports__.IsometricTile;\n/******/ var __webpack_exports__KeyEvent = __webpack_exports__.KeyEvent;\n/******/ var __webpack_exports__Keyboard = __webpack_exports__.Keyboard;\n/******/ var __webpack_exports__Keys = __webpack_exports__.Keys;\n/******/ var __webpack_exports__KillEvent = __webpack_exports__.KillEvent;\n/******/ var __webpack_exports__Label = __webpack_exports__.Label;\n/******/ var __webpack_exports__LimitCameraBoundsStrategy = __webpack_exports__.LimitCameraBoundsStrategy;\n/******/ var __webpack_exports__Line = __webpack_exports__.Line;\n/******/ var __webpack_exports__LineSegment = __webpack_exports__.LineSegment;\n/******/ var __webpack_exports__Loader = __webpack_exports__.Loader;\n/******/ var __webpack_exports__LoaderEvents = __webpack_exports__.LoaderEvents;\n/******/ var __webpack_exports__LockCameraToActorAxisStrategy = __webpack_exports__.LockCameraToActorAxisStrategy;\n/******/ var __webpack_exports__LockCameraToActorStrategy = __webpack_exports__.LockCameraToActorStrategy;\n/******/ var __webpack_exports__LogLevel = __webpack_exports__.LogLevel;\n/******/ var __webpack_exports__Logger = __webpack_exports__.Logger;\n/******/ var __webpack_exports__Material = __webpack_exports__.Material;\n/******/ var __webpack_exports__Matrix = __webpack_exports__.Matrix;\n/******/ var __webpack_exports__MatrixLocations = __webpack_exports__.MatrixLocations;\n/******/ var __webpack_exports__MediaEvent = __webpack_exports__.MediaEvent;\n/******/ var __webpack_exports__Meet = __webpack_exports__.Meet;\n/******/ var __webpack_exports__MotionComponent = __webpack_exports__.MotionComponent;\n/******/ var __webpack_exports__MotionSystem = __webpack_exports__.MotionSystem;\n/******/ var __webpack_exports__MoveBy = __webpack_exports__.MoveBy;\n/******/ var __webpack_exports__MoveByWithOptions = __webpack_exports__.MoveByWithOptions;\n/******/ var __webpack_exports__MoveTo = __webpack_exports__.MoveTo;\n/******/ var __webpack_exports__MoveToWithOptions = __webpack_exports__.MoveToWithOptions;\n/******/ var __webpack_exports__NativePointerButton = __webpack_exports__.NativePointerButton;\n/******/ var __webpack_exports__NativeSoundEvent = __webpack_exports__.NativeSoundEvent;\n/******/ var __webpack_exports__NativeSoundProcessedEvent = __webpack_exports__.NativeSoundProcessedEvent;\n/******/ var __webpack_exports__NineSlice = __webpack_exports__.NineSlice;\n/******/ var __webpack_exports__NineSliceStretch = __webpack_exports__.NineSliceStretch;\n/******/ var __webpack_exports__None = __webpack_exports__.None;\n/******/ var __webpack_exports__Observable = __webpack_exports__.Observable;\n/******/ var __webpack_exports__OffscreenSystem = __webpack_exports__.OffscreenSystem;\n/******/ var __webpack_exports__Pair = __webpack_exports__.Pair;\n/******/ var __webpack_exports__ParallaxComponent = __webpack_exports__.ParallaxComponent;\n/******/ var __webpack_exports__ParallelActions = __webpack_exports__.ParallelActions;\n/******/ var __webpack_exports__Particle = __webpack_exports__.Particle;\n/******/ var __webpack_exports__ParticleEmitter = __webpack_exports__.ParticleEmitter;\n/******/ var __webpack_exports__ParticleRenderer = __webpack_exports__.ParticleRenderer;\n/******/ var __webpack_exports__ParticleTransform = __webpack_exports__.ParticleTransform;\n/******/ var __webpack_exports__PhysicsStats = __webpack_exports__.PhysicsStats;\n/******/ var __webpack_exports__PhysicsWorld = __webpack_exports__.PhysicsWorld;\n/******/ var __webpack_exports__PointerAbstraction = __webpack_exports__.PointerAbstraction;\n/******/ var __webpack_exports__PointerButton = __webpack_exports__.PointerButton;\n/******/ var __webpack_exports__PointerComponent = __webpack_exports__.PointerComponent;\n/******/ var __webpack_exports__PointerEvent = __webpack_exports__.PointerEvent;\n/******/ var __webpack_exports__PointerEventReceiver = __webpack_exports__.PointerEventReceiver;\n/******/ var __webpack_exports__PointerScope = __webpack_exports__.PointerScope;\n/******/ var __webpack_exports__PointerSystem = __webpack_exports__.PointerSystem;\n/******/ var __webpack_exports__PointerType = __webpack_exports__.PointerType;\n/******/ var __webpack_exports__Polygon = __webpack_exports__.Polygon;\n/******/ var __webpack_exports__PolygonCollider = __webpack_exports__.PolygonCollider;\n/******/ var __webpack_exports__Pool = __webpack_exports__.Pool;\n/******/ var __webpack_exports__PostCollisionEvent = __webpack_exports__.PostCollisionEvent;\n/******/ var __webpack_exports__PostDebugDrawEvent = __webpack_exports__.PostDebugDrawEvent;\n/******/ var __webpack_exports__PostDrawEvent = __webpack_exports__.PostDrawEvent;\n/******/ var __webpack_exports__PostFrameEvent = __webpack_exports__.PostFrameEvent;\n/******/ var __webpack_exports__PostKillEvent = __webpack_exports__.PostKillEvent;\n/******/ var __webpack_exports__PostTransformDrawEvent = __webpack_exports__.PostTransformDrawEvent;\n/******/ var __webpack_exports__PostUpdateEvent = __webpack_exports__.PostUpdateEvent;\n/******/ var __webpack_exports__PreCollisionEvent = __webpack_exports__.PreCollisionEvent;\n/******/ var __webpack_exports__PreDebugDrawEvent = __webpack_exports__.PreDebugDrawEvent;\n/******/ var __webpack_exports__PreDrawEvent = __webpack_exports__.PreDrawEvent;\n/******/ var __webpack_exports__PreFrameEvent = __webpack_exports__.PreFrameEvent;\n/******/ var __webpack_exports__PreKillEvent = __webpack_exports__.PreKillEvent;\n/******/ var __webpack_exports__PreLoadEvent = __webpack_exports__.PreLoadEvent;\n/******/ var __webpack_exports__PreTransformDrawEvent = __webpack_exports__.PreTransformDrawEvent;\n/******/ var __webpack_exports__PreUpdateEvent = __webpack_exports__.PreUpdateEvent;\n/******/ var __webpack_exports__Projection = __webpack_exports__.Projection;\n/******/ var __webpack_exports__QuadIndexBuffer = __webpack_exports__.QuadIndexBuffer;\n/******/ var __webpack_exports__QuadTree = __webpack_exports__.QuadTree;\n/******/ var __webpack_exports__Query = __webpack_exports__.Query;\n/******/ var __webpack_exports__QueryManager = __webpack_exports__.QueryManager;\n/******/ var __webpack_exports__RadiusAroundActorStrategy = __webpack_exports__.RadiusAroundActorStrategy;\n/******/ var __webpack_exports__Random = __webpack_exports__.Random;\n/******/ var __webpack_exports__Raster = __webpack_exports__.Raster;\n/******/ var __webpack_exports__Ray = __webpack_exports__.Ray;\n/******/ var __webpack_exports__RealisticSolver = __webpack_exports__.RealisticSolver;\n/******/ var __webpack_exports__Rectangle = __webpack_exports__.Rectangle;\n/******/ var __webpack_exports__RemoveEvent = __webpack_exports__.RemoveEvent;\n/******/ var __webpack_exports__RemovedComponent = __webpack_exports__.RemovedComponent;\n/******/ var __webpack_exports__Repeat = __webpack_exports__.Repeat;\n/******/ var __webpack_exports__RepeatForever = __webpack_exports__.RepeatForever;\n/******/ var __webpack_exports__Resolution = __webpack_exports__.Resolution;\n/******/ var __webpack_exports__Resource = __webpack_exports__.Resource;\n/******/ var __webpack_exports__ResourceEvents = __webpack_exports__.ResourceEvents;\n/******/ var __webpack_exports__RotateBy = __webpack_exports__.RotateBy;\n/******/ var __webpack_exports__RotateByWithOptions = __webpack_exports__.RotateByWithOptions;\n/******/ var __webpack_exports__RotateTo = __webpack_exports__.RotateTo;\n/******/ var __webpack_exports__RotateToWithOptions = __webpack_exports__.RotateToWithOptions;\n/******/ var __webpack_exports__RotationType = __webpack_exports__.RotationType;\n/******/ var __webpack_exports__ScaleBy = __webpack_exports__.ScaleBy;\n/******/ var __webpack_exports__ScaleByWithOptions = __webpack_exports__.ScaleByWithOptions;\n/******/ var __webpack_exports__ScaleTo = __webpack_exports__.ScaleTo;\n/******/ var __webpack_exports__ScaleToWithOptions = __webpack_exports__.ScaleToWithOptions;\n/******/ var __webpack_exports__Scene = __webpack_exports__.Scene;\n/******/ var __webpack_exports__SceneEvents = __webpack_exports__.SceneEvents;\n/******/ var __webpack_exports__Screen = __webpack_exports__.Screen;\n/******/ var __webpack_exports__ScreenAppender = __webpack_exports__.ScreenAppender;\n/******/ var __webpack_exports__ScreenElement = __webpack_exports__.ScreenElement;\n/******/ var __webpack_exports__ScreenEvents = __webpack_exports__.ScreenEvents;\n/******/ var __webpack_exports__ScreenShader = __webpack_exports__.ScreenShader;\n/******/ var __webpack_exports__ScrollPreventionMode = __webpack_exports__.ScrollPreventionMode;\n/******/ var __webpack_exports__Semaphore = __webpack_exports__.Semaphore;\n/******/ var __webpack_exports__SeparatingAxis = __webpack_exports__.SeparatingAxis;\n/******/ var __webpack_exports__SeparationInfo = __webpack_exports__.SeparationInfo;\n/******/ var __webpack_exports__Shader = __webpack_exports__.Shader;\n/******/ var __webpack_exports__Shape = __webpack_exports__.Shape;\n/******/ var __webpack_exports__Side = __webpack_exports__.Side;\n/******/ var __webpack_exports__Slide = __webpack_exports__.Slide;\n/******/ var __webpack_exports__SolverStrategy = __webpack_exports__.SolverStrategy;\n/******/ var __webpack_exports__Sound = __webpack_exports__.Sound;\n/******/ var __webpack_exports__SoundEvents = __webpack_exports__.SoundEvents;\n/******/ var __webpack_exports__SparseHashGrid = __webpack_exports__.SparseHashGrid;\n/******/ var __webpack_exports__SparseHashGridCollisionProcessor = __webpack_exports__.SparseHashGridCollisionProcessor;\n/******/ var __webpack_exports__SpatialPartitionStrategy = __webpack_exports__.SpatialPartitionStrategy;\n/******/ var __webpack_exports__Sprite = __webpack_exports__.Sprite;\n/******/ var __webpack_exports__SpriteFont = __webpack_exports__.SpriteFont;\n/******/ var __webpack_exports__SpriteSheet = __webpack_exports__.SpriteSheet;\n/******/ var __webpack_exports__StandardClock = __webpack_exports__.StandardClock;\n/******/ var __webpack_exports__StateMachine = __webpack_exports__.StateMachine;\n/******/ var __webpack_exports__StrategyContainer = __webpack_exports__.StrategyContainer;\n/******/ var __webpack_exports__Stream = __webpack_exports__.Stream;\n/******/ var __webpack_exports__System = __webpack_exports__.System;\n/******/ var __webpack_exports__SystemManager = __webpack_exports__.SystemManager;\n/******/ var __webpack_exports__SystemPriority = __webpack_exports__.SystemPriority;\n/******/ var __webpack_exports__SystemType = __webpack_exports__.SystemType;\n/******/ var __webpack_exports__TagQuery = __webpack_exports__.TagQuery;\n/******/ var __webpack_exports__TestClock = __webpack_exports__.TestClock;\n/******/ var __webpack_exports__Text = __webpack_exports__.Text;\n/******/ var __webpack_exports__TextAlign = __webpack_exports__.TextAlign;\n/******/ var __webpack_exports__TextureLoader = __webpack_exports__.TextureLoader;\n/******/ var __webpack_exports__Tile = __webpack_exports__.Tile;\n/******/ var __webpack_exports__TileMap = __webpack_exports__.TileMap;\n/******/ var __webpack_exports__TileMapEvents = __webpack_exports__.TileMapEvents;\n/******/ var __webpack_exports__TiledAnimation = __webpack_exports__.TiledAnimation;\n/******/ var __webpack_exports__TiledSprite = __webpack_exports__.TiledSprite;\n/******/ var __webpack_exports__Timer = __webpack_exports__.Timer;\n/******/ var __webpack_exports__Toaster = __webpack_exports__.Toaster;\n/******/ var __webpack_exports__Transform = __webpack_exports__.Transform;\n/******/ var __webpack_exports__TransformComponent = __webpack_exports__.TransformComponent;\n/******/ var __webpack_exports__Transition = __webpack_exports__.Transition;\n/******/ var __webpack_exports__TreeNode = __webpack_exports__.TreeNode;\n/******/ var __webpack_exports__Trigger = __webpack_exports__.Trigger;\n/******/ var __webpack_exports__TriggerEvents = __webpack_exports__.TriggerEvents;\n/******/ var __webpack_exports__TwoPI = __webpack_exports__.TwoPI;\n/******/ var __webpack_exports__Util = __webpack_exports__.Util;\n/******/ var __webpack_exports__Vector = __webpack_exports__.Vector;\n/******/ var __webpack_exports__VectorView = __webpack_exports__.VectorView;\n/******/ var __webpack_exports__VertexBuffer = __webpack_exports__.VertexBuffer;\n/******/ var __webpack_exports__VertexLayout = __webpack_exports__.VertexLayout;\n/******/ var __webpack_exports__VerticalFirst = __webpack_exports__.VerticalFirst;\n/******/ var __webpack_exports__VisibleEvent = __webpack_exports__.VisibleEvent;\n/******/ var __webpack_exports__WebAudio = __webpack_exports__.WebAudio;\n/******/ var __webpack_exports__WebAudioInstance = __webpack_exports__.WebAudioInstance;\n/******/ var __webpack_exports__WheelDeltaMode = __webpack_exports__.WheelDeltaMode;\n/******/ var __webpack_exports__WheelEvent = __webpack_exports__.WheelEvent;\n/******/ var __webpack_exports__World = __webpack_exports__.World;\n/******/ var __webpack_exports__approximatelyEqual = __webpack_exports__.approximatelyEqual;\n/******/ var __webpack_exports__assert = __webpack_exports__.assert;\n/******/ var __webpack_exports__canonicalizeAngle = __webpack_exports__.canonicalizeAngle;\n/******/ var __webpack_exports__clamp = __webpack_exports__.clamp;\n/******/ var __webpack_exports__coroutine = __webpack_exports__.coroutine;\n/******/ var __webpack_exports__createId = __webpack_exports__.createId;\n/******/ var __webpack_exports__frac = __webpack_exports__.frac;\n/******/ var __webpack_exports__getDefaultPhysicsConfig = __webpack_exports__.getDefaultPhysicsConfig;\n/******/ var __webpack_exports__hasGraphicsTick = __webpack_exports__.hasGraphicsTick;\n/******/ var __webpack_exports__hasOnAdd = __webpack_exports__.hasOnAdd;\n/******/ var __webpack_exports__hasOnInitialize = __webpack_exports__.hasOnInitialize;\n/******/ var __webpack_exports__hasOnPostUpdate = __webpack_exports__.hasOnPostUpdate;\n/******/ var __webpack_exports__hasOnPreUpdate = __webpack_exports__.hasOnPreUpdate;\n/******/ var __webpack_exports__hasOnRemove = __webpack_exports__.hasOnRemove;\n/******/ var __webpack_exports__hasPostDraw = __webpack_exports__.hasPostDraw;\n/******/ var __webpack_exports__hasPreDraw = __webpack_exports__.hasPreDraw;\n/******/ var __webpack_exports__has_add = __webpack_exports__.has_add;\n/******/ var __webpack_exports__has_initialize = __webpack_exports__.has_initialize;\n/******/ var __webpack_exports__has_postupdate = __webpack_exports__.has_postupdate;\n/******/ var __webpack_exports__has_preupdate = __webpack_exports__.has_preupdate;\n/******/ var __webpack_exports__has_remove = __webpack_exports__.has_remove;\n/******/ var __webpack_exports__inverseLerp = __webpack_exports__.inverseLerp;\n/******/ var __webpack_exports__inverseLerpVector = __webpack_exports__.inverseLerpVector;\n/******/ var __webpack_exports__isActor = __webpack_exports__.isActor;\n/******/ var __webpack_exports__isAddedComponent = __webpack_exports__.isAddedComponent;\n/******/ var __webpack_exports__isComponentCtor = __webpack_exports__.isComponentCtor;\n/******/ var __webpack_exports__isLoaderConstructor = __webpack_exports__.isLoaderConstructor;\n/******/ var __webpack_exports__isMoveByOptions = __webpack_exports__.isMoveByOptions;\n/******/ var __webpack_exports__isMoveToOptions = __webpack_exports__.isMoveToOptions;\n/******/ var __webpack_exports__isRemovedComponent = __webpack_exports__.isRemovedComponent;\n/******/ var __webpack_exports__isRotateByOptions = __webpack_exports__.isRotateByOptions;\n/******/ var __webpack_exports__isRotateToOptions = __webpack_exports__.isRotateToOptions;\n/******/ var __webpack_exports__isScaleByOptions = __webpack_exports__.isScaleByOptions;\n/******/ var __webpack_exports__isScaleToOptions = __webpack_exports__.isScaleToOptions;\n/******/ var __webpack_exports__isSceneConstructor = __webpack_exports__.isSceneConstructor;\n/******/ var __webpack_exports__isScreenElement = __webpack_exports__.isScreenElement;\n/******/ var __webpack_exports__isSystemConstructor = __webpack_exports__.isSystemConstructor;\n/******/ var __webpack_exports__lerp = __webpack_exports__.lerp;\n/******/ var __webpack_exports__lerpAngle = __webpack_exports__.lerpAngle;\n/******/ var __webpack_exports__lerpVector = __webpack_exports__.lerpVector;\n/******/ var __webpack_exports__maxMessages = __webpack_exports__.maxMessages;\n/******/ var __webpack_exports__nextActionId = __webpack_exports__.nextActionId;\n/******/ var __webpack_exports__obsolete = __webpack_exports__.obsolete;\n/******/ var __webpack_exports__parseImageFiltering = __webpack_exports__.parseImageFiltering;\n/******/ var __webpack_exports__parseImageWrapping = __webpack_exports__.parseImageWrapping;\n/******/ var __webpack_exports__pixelSnapEpsilon = __webpack_exports__.pixelSnapEpsilon;\n/******/ var __webpack_exports__randomInRange = __webpack_exports__.randomInRange;\n/******/ var __webpack_exports__randomIntInRange = __webpack_exports__.randomIntInRange;\n/******/ var __webpack_exports__range = __webpack_exports__.range;\n/******/ var __webpack_exports__remap = __webpack_exports__.remap;\n/******/ var __webpack_exports__remapVector = __webpack_exports__.remapVector;\n/******/ var __webpack_exports__resetObsoleteCounter = __webpack_exports__.resetObsoleteCounter;\n/******/ var __webpack_exports__sign = __webpack_exports__.sign;\n/******/ var __webpack_exports__toDegrees = __webpack_exports__.toDegrees;\n/******/ var __webpack_exports__toRadians = __webpack_exports__.toRadians;\n/******/ var __webpack_exports__vec = __webpack_exports__.vec;\n/******/ var __webpack_exports__webgl = __webpack_exports__.webgl;\n/******/ export { __webpack_exports__ActionCompleteEvent as ActionCompleteEvent, __webpack_exports__ActionContext as ActionContext, __webpack_exports__ActionQueue as ActionQueue, __webpack_exports__ActionSequence as ActionSequence, __webpack_exports__ActionStartEvent as ActionStartEvent, __webpack_exports__ActionsComponent as ActionsComponent, __webpack_exports__ActionsSystem as ActionsSystem, __webpack_exports__ActivateEvent as ActivateEvent, __webpack_exports__Actor as Actor, __webpack_exports__ActorEvents as ActorEvents, __webpack_exports__AddEvent as AddEvent, __webpack_exports__AddedComponent as AddedComponent, __webpack_exports__AffineMatrix as AffineMatrix, __webpack_exports__Animation as Animation, __webpack_exports__AnimationDirection as AnimationDirection, __webpack_exports__AnimationEvents as AnimationEvents, __webpack_exports__AnimationStrategy as AnimationStrategy, __webpack_exports__ArcadeSolver as ArcadeSolver, __webpack_exports__AudioContextFactory as AudioContextFactory, __webpack_exports__Axes as Axes, __webpack_exports__Axis as Axis, __webpack_exports__BaseAlign as BaseAlign, __webpack_exports__BezierCurve as BezierCurve, __webpack_exports__Blink as Blink, __webpack_exports__BodyComponent as BodyComponent, __webpack_exports__BoundingBox as BoundingBox, __webpack_exports__BrowserComponent as BrowserComponent, __webpack_exports__BrowserEvents as BrowserEvents, __webpack_exports__Buttons as Buttons, __webpack_exports__Camera as Camera, __webpack_exports__CameraEvents as CameraEvents, __webpack_exports__Canvas as Canvas, __webpack_exports__Circle as Circle, __webpack_exports__CircleCollider as CircleCollider, __webpack_exports__Clock as Clock, __webpack_exports__ClosestLineJumpTable as ClosestLineJumpTable, __webpack_exports__Collider as Collider, __webpack_exports__ColliderComponent as ColliderComponent, __webpack_exports__CollisionContact as CollisionContact, __webpack_exports__CollisionEndEvent as CollisionEndEvent, __webpack_exports__CollisionGroup as CollisionGroup, __webpack_exports__CollisionGroupManager as CollisionGroupManager, __webpack_exports__CollisionJumpTable as CollisionJumpTable, __webpack_exports__CollisionPostSolveEvent as CollisionPostSolveEvent, __webpack_exports__CollisionPreSolveEvent as CollisionPreSolveEvent, __webpack_exports__CollisionStartEvent as CollisionStartEvent, __webpack_exports__CollisionSystem as CollisionSystem, __webpack_exports__CollisionType as CollisionType, __webpack_exports__Color as Color, __webpack_exports__ColorBlindFlags as ColorBlindFlags, __webpack_exports__ColorBlindnessMode as ColorBlindnessMode, __webpack_exports__ColorBlindnessPostProcessor as ColorBlindnessPostProcessor, __webpack_exports__Component as Component, __webpack_exports__CompositeCollider as CompositeCollider, __webpack_exports__ConsoleAppender as ConsoleAppender, __webpack_exports__ContactConstraintPoint as ContactConstraintPoint, __webpack_exports__ContactEndEvent as ContactEndEvent, __webpack_exports__ContactSolveBias as ContactSolveBias, __webpack_exports__ContactStartEvent as ContactStartEvent, __webpack_exports__CoordPlane as CoordPlane, __webpack_exports__CrossFade as CrossFade, __webpack_exports__CurveBy as CurveBy, __webpack_exports__CurveTo as CurveTo, __webpack_exports__DeactivateEvent as DeactivateEvent, __webpack_exports__Debug as Debug, __webpack_exports__DebugConfig as DebugConfig, __webpack_exports__DebugGraphicsComponent as DebugGraphicsComponent, __webpack_exports__DebugSystem as DebugSystem, __webpack_exports__DebugText as DebugText, __webpack_exports__DefaultAntialiasOptions as DefaultAntialiasOptions, __webpack_exports__DefaultGarbageCollectionOptions as DefaultGarbageCollectionOptions, __webpack_exports__DefaultLoader as DefaultLoader, __webpack_exports__DefaultPixelArtOptions as DefaultPixelArtOptions, __webpack_exports__DegreeOfFreedom as DegreeOfFreedom, __webpack_exports__Delay as Delay, __webpack_exports__Detector as Detector, __webpack_exports__Die as Die, __webpack_exports__Direction as Direction, __webpack_exports__Director as Director, __webpack_exports__DirectorEvents as DirectorEvents, __webpack_exports__DisplayMode as DisplayMode, __webpack_exports__DynamicTree as DynamicTree, __webpack_exports__DynamicTreeCollisionProcessor as DynamicTreeCollisionProcessor, __webpack_exports__EX_VERSION as EX_VERSION, __webpack_exports__EaseBy as EaseBy, __webpack_exports__EaseTo as EaseTo, __webpack_exports__EasingFunctions as EasingFunctions, __webpack_exports__EdgeCollider as EdgeCollider, __webpack_exports__ElasticToActorStrategy as ElasticToActorStrategy, __webpack_exports__EmitterType as EmitterType, __webpack_exports__Engine as Engine, __webpack_exports__EngineEvents as EngineEvents, __webpack_exports__EnterTriggerEvent as EnterTriggerEvent, __webpack_exports__EnterViewPortEvent as EnterViewPortEvent, __webpack_exports__Entity as Entity, __webpack_exports__EntityEvents as EntityEvents, __webpack_exports__EntityManager as EntityManager, __webpack_exports__EventEmitter as EventEmitter, __webpack_exports__EventTypes as EventTypes, __webpack_exports__Events as Events, __webpack_exports__ExResponse as ExResponse, __webpack_exports__ExcaliburGraphicsContext2DCanvas as ExcaliburGraphicsContext2DCanvas, __webpack_exports__ExcaliburGraphicsContextWebGL as ExcaliburGraphicsContextWebGL, __webpack_exports__ExitTriggerEvent as ExitTriggerEvent, __webpack_exports__ExitViewPortEvent as ExitViewPortEvent, __webpack_exports__Fade as Fade, __webpack_exports__FadeInOut as FadeInOut, __webpack_exports__Flags as Flags, __webpack_exports__Flash as Flash, __webpack_exports__Follow as Follow, __webpack_exports__Font as Font, __webpack_exports__FontCache as FontCache, __webpack_exports__FontSource as FontSource, __webpack_exports__FontStyle as FontStyle, __webpack_exports__FontUnit as FontUnit, __webpack_exports__FpsSampler as FpsSampler, __webpack_exports__FrameStats as FrameStats, __webpack_exports__Future as Future, __webpack_exports__GameEvent as GameEvent, __webpack_exports__GameStartEvent as GameStartEvent, __webpack_exports__GameStopEvent as GameStopEvent, __webpack_exports__Gamepad as Gamepad, __webpack_exports__GamepadAxisEvent as GamepadAxisEvent, __webpack_exports__GamepadButtonEvent as GamepadButtonEvent, __webpack_exports__GamepadConnectEvent as GamepadConnectEvent, __webpack_exports__GamepadDisconnectEvent as GamepadDisconnectEvent, __webpack_exports__Gamepads as Gamepads, __webpack_exports__GarbageCollector as GarbageCollector, __webpack_exports__Gif as Gif, __webpack_exports__GifParser as GifParser, __webpack_exports__GlobalCoordinates as GlobalCoordinates, __webpack_exports__GpuParticleEmitter as GpuParticleEmitter, __webpack_exports__GpuParticleRenderer as GpuParticleRenderer, __webpack_exports__Graphic as Graphic, __webpack_exports__GraphicsComponent as GraphicsComponent, __webpack_exports__GraphicsGroup as GraphicsGroup, __webpack_exports__GraphicsSystem as GraphicsSystem, __webpack_exports__HashColliderProxy as HashColliderProxy, __webpack_exports__HashGridCell as HashGridCell, __webpack_exports__HashGridProxy as HashGridProxy, __webpack_exports__HiddenEvent as HiddenEvent, __webpack_exports__HorizontalFirst as HorizontalFirst, __webpack_exports__ImageFiltering as ImageFiltering, __webpack_exports__ImageSource as ImageSource, __webpack_exports__ImageSourceAttributeConstants as ImageSourceAttributeConstants, __webpack_exports__ImageWrapping as ImageWrapping, __webpack_exports__InitializeEvent as InitializeEvent, __webpack_exports__InputHost as InputHost, __webpack_exports__InputMapper as InputMapper, __webpack_exports__IsometricEntityComponent as IsometricEntityComponent, __webpack_exports__IsometricEntitySystem as IsometricEntitySystem, __webpack_exports__IsometricMap as IsometricMap, __webpack_exports__IsometricTile as IsometricTile, __webpack_exports__KeyEvent as KeyEvent, __webpack_exports__Keyboard as Keyboard, __webpack_exports__Keys as Keys, __webpack_exports__KillEvent as KillEvent, __webpack_exports__Label as Label, __webpack_exports__LimitCameraBoundsStrategy as LimitCameraBoundsStrategy, __webpack_exports__Line as Line, __webpack_exports__LineSegment as LineSegment, __webpack_exports__Loader as Loader, __webpack_exports__LoaderEvents as LoaderEvents, __webpack_exports__LockCameraToActorAxisStrategy as LockCameraToActorAxisStrategy, __webpack_exports__LockCameraToActorStrategy as LockCameraToActorStrategy, __webpack_exports__LogLevel as LogLevel, __webpack_exports__Logger as Logger, __webpack_exports__Material as Material, __webpack_exports__Matrix as Matrix, __webpack_exports__MatrixLocations as MatrixLocations, __webpack_exports__MediaEvent as MediaEvent, __webpack_exports__Meet as Meet, __webpack_exports__MotionComponent as MotionComponent, __webpack_exports__MotionSystem as MotionSystem, __webpack_exports__MoveBy as MoveBy, __webpack_exports__MoveByWithOptions as MoveByWithOptions, __webpack_exports__MoveTo as MoveTo, __webpack_exports__MoveToWithOptions as MoveToWithOptions, __webpack_exports__NativePointerButton as NativePointerButton, __webpack_exports__NativeSoundEvent as NativeSoundEvent, __webpack_exports__NativeSoundProcessedEvent as NativeSoundProcessedEvent, __webpack_exports__NineSlice as NineSlice, __webpack_exports__NineSliceStretch as NineSliceStretch, __webpack_exports__None as None, __webpack_exports__Observable as Observable, __webpack_exports__OffscreenSystem as OffscreenSystem, __webpack_exports__Pair as Pair, __webpack_exports__ParallaxComponent as ParallaxComponent, __webpack_exports__ParallelActions as ParallelActions, __webpack_exports__Particle as Particle, __webpack_exports__ParticleEmitter as ParticleEmitter, __webpack_exports__ParticleRenderer as ParticleRenderer, __webpack_exports__ParticleTransform as ParticleTransform, __webpack_exports__PhysicsStats as PhysicsStats, __webpack_exports__PhysicsWorld as PhysicsWorld, __webpack_exports__PointerAbstraction as PointerAbstraction, __webpack_exports__PointerButton as PointerButton, __webpack_exports__PointerComponent as PointerComponent, __webpack_exports__PointerEvent as PointerEvent, __webpack_exports__PointerEventReceiver as PointerEventReceiver, __webpack_exports__PointerScope as PointerScope, __webpack_exports__PointerSystem as PointerSystem, __webpack_exports__PointerType as PointerType, __webpack_exports__Polygon as Polygon, __webpack_exports__PolygonCollider as PolygonCollider, __webpack_exports__Pool as Pool, __webpack_exports__PostCollisionEvent as PostCollisionEvent, __webpack_exports__PostDebugDrawEvent as PostDebugDrawEvent, __webpack_exports__PostDrawEvent as PostDrawEvent, __webpack_exports__PostFrameEvent as PostFrameEvent, __webpack_exports__PostKillEvent as PostKillEvent, __webpack_exports__PostTransformDrawEvent as PostTransformDrawEvent, __webpack_exports__PostUpdateEvent as PostUpdateEvent, __webpack_exports__PreCollisionEvent as PreCollisionEvent, __webpack_exports__PreDebugDrawEvent as PreDebugDrawEvent, __webpack_exports__PreDrawEvent as PreDrawEvent, __webpack_exports__PreFrameEvent as PreFrameEvent, __webpack_exports__PreKillEvent as PreKillEvent, __webpack_exports__PreLoadEvent as PreLoadEvent, __webpack_exports__PreTransformDrawEvent as PreTransformDrawEvent, __webpack_exports__PreUpdateEvent as PreUpdateEvent, __webpack_exports__Projection as Projection, __webpack_exports__QuadIndexBuffer as QuadIndexBuffer, __webpack_exports__QuadTree as QuadTree, __webpack_exports__Query as Query, __webpack_exports__QueryManager as QueryManager, __webpack_exports__RadiusAroundActorStrategy as RadiusAroundActorStrategy, __webpack_exports__Random as Random, __webpack_exports__Raster as Raster, __webpack_exports__Ray as Ray, __webpack_exports__RealisticSolver as RealisticSolver, __webpack_exports__Rectangle as Rectangle, __webpack_exports__RemoveEvent as RemoveEvent, __webpack_exports__RemovedComponent as RemovedComponent, __webpack_exports__Repeat as Repeat, __webpack_exports__RepeatForever as RepeatForever, __webpack_exports__Resolution as Resolution, __webpack_exports__Resource as Resource, __webpack_exports__ResourceEvents as ResourceEvents, __webpack_exports__RotateBy as RotateBy, __webpack_exports__RotateByWithOptions as RotateByWithOptions, __webpack_exports__RotateTo as RotateTo, __webpack_exports__RotateToWithOptions as RotateToWithOptions, __webpack_exports__RotationType as RotationType, __webpack_exports__ScaleBy as ScaleBy, __webpack_exports__ScaleByWithOptions as ScaleByWithOptions, __webpack_exports__ScaleTo as ScaleTo, __webpack_exports__ScaleToWithOptions as ScaleToWithOptions, __webpack_exports__Scene as Scene, __webpack_exports__SceneEvents as SceneEvents, __webpack_exports__Screen as Screen, __webpack_exports__ScreenAppender as ScreenAppender, __webpack_exports__ScreenElement as ScreenElement, __webpack_exports__ScreenEvents as ScreenEvents, __webpack_exports__ScreenShader as ScreenShader, __webpack_exports__ScrollPreventionMode as ScrollPreventionMode, __webpack_exports__Semaphore as Semaphore, __webpack_exports__SeparatingAxis as SeparatingAxis, __webpack_exports__SeparationInfo as SeparationInfo, __webpack_exports__Shader as Shader, __webpack_exports__Shape as Shape, __webpack_exports__Side as Side, __webpack_exports__Slide as Slide, __webpack_exports__SolverStrategy as SolverStrategy, __webpack_exports__Sound as Sound, __webpack_exports__SoundEvents as SoundEvents, __webpack_exports__SparseHashGrid as SparseHashGrid, __webpack_exports__SparseHashGridCollisionProcessor as SparseHashGridCollisionProcessor, __webpack_exports__SpatialPartitionStrategy as SpatialPartitionStrategy, __webpack_exports__Sprite as Sprite, __webpack_exports__SpriteFont as SpriteFont, __webpack_exports__SpriteSheet as SpriteSheet, __webpack_exports__StandardClock as StandardClock, __webpack_exports__StateMachine as StateMachine, __webpack_exports__StrategyContainer as StrategyContainer, __webpack_exports__Stream as Stream, __webpack_exports__System as System, __webpack_exports__SystemManager as SystemManager, __webpack_exports__SystemPriority as SystemPriority, __webpack_exports__SystemType as SystemType, __webpack_exports__TagQuery as TagQuery, __webpack_exports__TestClock as TestClock, __webpack_exports__Text as Text, __webpack_exports__TextAlign as TextAlign, __webpack_exports__TextureLoader as TextureLoader, __webpack_exports__Tile as Tile, __webpack_exports__TileMap as TileMap, __webpack_exports__TileMapEvents as TileMapEvents, __webpack_exports__TiledAnimation as TiledAnimation, __webpack_exports__TiledSprite as TiledSprite, __webpack_exports__Timer as Timer, __webpack_exports__Toaster as Toaster, __webpack_exports__Transform as Transform, __webpack_exports__TransformComponent as TransformComponent, __webpack_exports__Transition as Transition, __webpack_exports__TreeNode as TreeNode, __webpack_exports__Trigger as Trigger, __webpack_exports__TriggerEvents as TriggerEvents, __webpack_exports__TwoPI as TwoPI, __webpack_exports__Util as Util, __webpack_exports__Vector as Vector, __webpack_exports__VectorView as VectorView, __webpack_exports__VertexBuffer as VertexBuffer, __webpack_exports__VertexLayout as VertexLayout, __webpack_exports__VerticalFirst as VerticalFirst, __webpack_exports__VisibleEvent as VisibleEvent, __webpack_exports__WebAudio as WebAudio, __webpack_exports__WebAudioInstance as WebAudioInstance, __webpack_exports__WheelDeltaMode as WheelDeltaMode, __webpack_exports__WheelEvent as WheelEvent, __webpack_exports__World as World, __webpack_exports__approximatelyEqual as approximatelyEqual, __webpack_exports__assert as assert, __webpack_exports__canonicalizeAngle as canonicalizeAngle, __webpack_exports__clamp as clamp, __webpack_exports__coroutine as coroutine, __webpack_exports__createId as createId, __webpack_exports__frac as frac, __webpack_exports__getDefaultPhysicsConfig as getDefaultPhysicsConfig, __webpack_exports__hasGraphicsTick as hasGraphicsTick, __webpack_exports__hasOnAdd as hasOnAdd, __webpack_exports__hasOnInitialize as hasOnInitialize, __webpack_exports__hasOnPostUpdate as hasOnPostUpdate, __webpack_exports__hasOnPreUpdate as hasOnPreUpdate, __webpack_exports__hasOnRemove as hasOnRemove, __webpack_exports__hasPostDraw as hasPostDraw, __webpack_exports__hasPreDraw as hasPreDraw, __webpack_exports__has_add as has_add, __webpack_exports__has_initialize as has_initialize, __webpack_exports__has_postupdate as has_postupdate, __webpack_exports__has_preupdate as has_preupdate, __webpack_exports__has_remove as has_remove, __webpack_exports__inverseLerp as inverseLerp, __webpack_exports__inverseLerpVector as inverseLerpVector, __webpack_exports__isActor as isActor, __webpack_exports__isAddedComponent as isAddedComponent, __webpack_exports__isComponentCtor as isComponentCtor, __webpack_exports__isLoaderConstructor as isLoaderConstructor, __webpack_exports__isMoveByOptions as isMoveByOptions, __webpack_exports__isMoveToOptions as isMoveToOptions, __webpack_exports__isRemovedComponent as isRemovedComponent, __webpack_exports__isRotateByOptions as isRotateByOptions, __webpack_exports__isRotateToOptions as isRotateToOptions, __webpack_exports__isScaleByOptions as isScaleByOptions, __webpack_exports__isScaleToOptions as isScaleToOptions, __webpack_exports__isSceneConstructor as isSceneConstructor, __webpack_exports__isScreenElement as isScreenElement, __webpack_exports__isSystemConstructor as isSystemConstructor, __webpack_exports__lerp as lerp, __webpack_exports__lerpAngle as lerpAngle, __webpack_exports__lerpVector as lerpVector, __webpack_exports__maxMessages as maxMessages, __webpack_exports__nextActionId as nextActionId, __webpack_exports__obsolete as obsolete, __webpack_exports__parseImageFiltering as parseImageFiltering, __webpack_exports__parseImageWrapping as parseImageWrapping, __webpack_exports__pixelSnapEpsilon as pixelSnapEpsilon, __webpack_exports__randomInRange as randomInRange, __webpack_exports__randomIntInRange as randomIntInRange, __webpack_exports__range as range, __webpack_exports__remap as remap, __webpack_exports__remapVector as remapVector, __webpack_exports__resetObsoleteCounter as resetObsoleteCounter, __webpack_exports__sign as sign, __webpack_exports__toDegrees as toDegrees, __webpack_exports__toRadians as toRadians, __webpack_exports__vec as vec, __webpack_exports__webgl as webgl };\n/******/ \n\n//# sourceMappingURL=excalibur.development.js.map","var util;\n(function (util) {\n util.assertEqual = (val) => val;\n function assertIs(_arg) { }\n util.assertIs = assertIs;\n function assertNever(_x) {\n throw new Error();\n }\n util.assertNever = assertNever;\n util.arrayToEnum = (items) => {\n const obj = {};\n for (const item of items) {\n obj[item] = item;\n }\n return obj;\n };\n util.getValidEnumValues = (obj) => {\n const validKeys = util.objectKeys(obj).filter((k) => typeof obj[obj[k]] !== \"number\");\n const filtered = {};\n for (const k of validKeys) {\n filtered[k] = obj[k];\n }\n return util.objectValues(filtered);\n };\n util.objectValues = (obj) => {\n return util.objectKeys(obj).map(function (e) {\n return obj[e];\n });\n };\n util.objectKeys = typeof Object.keys === \"function\" // eslint-disable-line ban/ban\n ? (obj) => Object.keys(obj) // eslint-disable-line ban/ban\n : (object) => {\n const keys = [];\n for (const key in object) {\n if (Object.prototype.hasOwnProperty.call(object, key)) {\n keys.push(key);\n }\n }\n return keys;\n };\n util.find = (arr, checker) => {\n for (const item of arr) {\n if (checker(item))\n return item;\n }\n return undefined;\n };\n util.isInteger = typeof Number.isInteger === \"function\"\n ? (val) => Number.isInteger(val) // eslint-disable-line ban/ban\n : (val) => typeof val === \"number\" && isFinite(val) && Math.floor(val) === val;\n function joinValues(array, separator = \" | \") {\n return array\n .map((val) => (typeof val === \"string\" ? `'${val}'` : val))\n .join(separator);\n }\n util.joinValues = joinValues;\n util.jsonStringifyReplacer = (_, value) => {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n };\n})(util || (util = {}));\nvar objectUtil;\n(function (objectUtil) {\n objectUtil.mergeShapes = (first, second) => {\n return {\n ...first,\n ...second, // second overwrites first\n };\n };\n})(objectUtil || (objectUtil = {}));\nconst ZodParsedType = util.arrayToEnum([\n \"string\",\n \"nan\",\n \"number\",\n \"integer\",\n \"float\",\n \"boolean\",\n \"date\",\n \"bigint\",\n \"symbol\",\n \"function\",\n \"undefined\",\n \"null\",\n \"array\",\n \"object\",\n \"unknown\",\n \"promise\",\n \"void\",\n \"never\",\n \"map\",\n \"set\",\n]);\nconst getParsedType = (data) => {\n const t = typeof data;\n switch (t) {\n case \"undefined\":\n return ZodParsedType.undefined;\n case \"string\":\n return ZodParsedType.string;\n case \"number\":\n return isNaN(data) ? ZodParsedType.nan : ZodParsedType.number;\n case \"boolean\":\n return ZodParsedType.boolean;\n case \"function\":\n return ZodParsedType.function;\n case \"bigint\":\n return ZodParsedType.bigint;\n case \"symbol\":\n return ZodParsedType.symbol;\n case \"object\":\n if (Array.isArray(data)) {\n return ZodParsedType.array;\n }\n if (data === null) {\n return ZodParsedType.null;\n }\n if (data.then &&\n typeof data.then === \"function\" &&\n data.catch &&\n typeof data.catch === \"function\") {\n return ZodParsedType.promise;\n }\n if (typeof Map !== \"undefined\" && data instanceof Map) {\n return ZodParsedType.map;\n }\n if (typeof Set !== \"undefined\" && data instanceof Set) {\n return ZodParsedType.set;\n }\n if (typeof Date !== \"undefined\" && data instanceof Date) {\n return ZodParsedType.date;\n }\n return ZodParsedType.object;\n default:\n return ZodParsedType.unknown;\n }\n};\n\nconst ZodIssueCode = util.arrayToEnum([\n \"invalid_type\",\n \"invalid_literal\",\n \"custom\",\n \"invalid_union\",\n \"invalid_union_discriminator\",\n \"invalid_enum_value\",\n \"unrecognized_keys\",\n \"invalid_arguments\",\n \"invalid_return_type\",\n \"invalid_date\",\n \"invalid_string\",\n \"too_small\",\n \"too_big\",\n \"invalid_intersection_types\",\n \"not_multiple_of\",\n \"not_finite\",\n]);\nconst quotelessJson = (obj) => {\n const json = JSON.stringify(obj, null, 2);\n return json.replace(/\"([^\"]+)\":/g, \"$1:\");\n};\nclass ZodError extends Error {\n get errors() {\n return this.issues;\n }\n constructor(issues) {\n super();\n this.issues = [];\n this.addIssue = (sub) => {\n this.issues = [...this.issues, sub];\n };\n this.addIssues = (subs = []) => {\n this.issues = [...this.issues, ...subs];\n };\n const actualProto = new.target.prototype;\n if (Object.setPrototypeOf) {\n // eslint-disable-next-line ban/ban\n Object.setPrototypeOf(this, actualProto);\n }\n else {\n this.__proto__ = actualProto;\n }\n this.name = \"ZodError\";\n this.issues = issues;\n }\n format(_mapper) {\n const mapper = _mapper ||\n function (issue) {\n return issue.message;\n };\n const fieldErrors = { _errors: [] };\n const processError = (error) => {\n for (const issue of error.issues) {\n if (issue.code === \"invalid_union\") {\n issue.unionErrors.map(processError);\n }\n else if (issue.code === \"invalid_return_type\") {\n processError(issue.returnTypeError);\n }\n else if (issue.code === \"invalid_arguments\") {\n processError(issue.argumentsError);\n }\n else if (issue.path.length === 0) {\n fieldErrors._errors.push(mapper(issue));\n }\n else {\n let curr = fieldErrors;\n let i = 0;\n while (i < issue.path.length) {\n const el = issue.path[i];\n const terminal = i === issue.path.length - 1;\n if (!terminal) {\n curr[el] = curr[el] || { _errors: [] };\n // if (typeof el === \"string\") {\n // curr[el] = curr[el] || { _errors: [] };\n // } else if (typeof el === \"number\") {\n // const errorArray: any = [];\n // errorArray._errors = [];\n // curr[el] = curr[el] || errorArray;\n // }\n }\n else {\n curr[el] = curr[el] || { _errors: [] };\n curr[el]._errors.push(mapper(issue));\n }\n curr = curr[el];\n i++;\n }\n }\n }\n };\n processError(this);\n return fieldErrors;\n }\n static assert(value) {\n if (!(value instanceof ZodError)) {\n throw new Error(`Not a ZodError: ${value}`);\n }\n }\n toString() {\n return this.message;\n }\n get message() {\n return JSON.stringify(this.issues, util.jsonStringifyReplacer, 2);\n }\n get isEmpty() {\n return this.issues.length === 0;\n }\n flatten(mapper = (issue) => issue.message) {\n const fieldErrors = {};\n const formErrors = [];\n for (const sub of this.issues) {\n if (sub.path.length > 0) {\n fieldErrors[sub.path[0]] = fieldErrors[sub.path[0]] || [];\n fieldErrors[sub.path[0]].push(mapper(sub));\n }\n else {\n formErrors.push(mapper(sub));\n }\n }\n return { formErrors, fieldErrors };\n }\n get formErrors() {\n return this.flatten();\n }\n}\nZodError.create = (issues) => {\n const error = new ZodError(issues);\n return error;\n};\n\nconst errorMap = (issue, _ctx) => {\n let message;\n switch (issue.code) {\n case ZodIssueCode.invalid_type:\n if (issue.received === ZodParsedType.undefined) {\n message = \"Required\";\n }\n else {\n message = `Expected ${issue.expected}, received ${issue.received}`;\n }\n break;\n case ZodIssueCode.invalid_literal:\n message = `Invalid literal value, expected ${JSON.stringify(issue.expected, util.jsonStringifyReplacer)}`;\n break;\n case ZodIssueCode.unrecognized_keys:\n message = `Unrecognized key(s) in object: ${util.joinValues(issue.keys, \", \")}`;\n break;\n case ZodIssueCode.invalid_union:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_union_discriminator:\n message = `Invalid discriminator value. Expected ${util.joinValues(issue.options)}`;\n break;\n case ZodIssueCode.invalid_enum_value:\n message = `Invalid enum value. Expected ${util.joinValues(issue.options)}, received '${issue.received}'`;\n break;\n case ZodIssueCode.invalid_arguments:\n message = `Invalid function arguments`;\n break;\n case ZodIssueCode.invalid_return_type:\n message = `Invalid function return type`;\n break;\n case ZodIssueCode.invalid_date:\n message = `Invalid date`;\n break;\n case ZodIssueCode.invalid_string:\n if (typeof issue.validation === \"object\") {\n if (\"includes\" in issue.validation) {\n message = `Invalid input: must include \"${issue.validation.includes}\"`;\n if (typeof issue.validation.position === \"number\") {\n message = `${message} at one or more positions greater than or equal to ${issue.validation.position}`;\n }\n }\n else if (\"startsWith\" in issue.validation) {\n message = `Invalid input: must start with \"${issue.validation.startsWith}\"`;\n }\n else if (\"endsWith\" in issue.validation) {\n message = `Invalid input: must end with \"${issue.validation.endsWith}\"`;\n }\n else {\n util.assertNever(issue.validation);\n }\n }\n else if (issue.validation !== \"regex\") {\n message = `Invalid ${issue.validation}`;\n }\n else {\n message = \"Invalid\";\n }\n break;\n case ZodIssueCode.too_small:\n if (issue.type === \"array\")\n message = `Array must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `more than`} ${issue.minimum} element(s)`;\n else if (issue.type === \"string\")\n message = `String must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `over`} ${issue.minimum} character(s)`;\n else if (issue.type === \"number\")\n message = `Number must be ${issue.exact\n ? `exactly equal to `\n : issue.inclusive\n ? `greater than or equal to `\n : `greater than `}${issue.minimum}`;\n else if (issue.type === \"date\")\n message = `Date must be ${issue.exact\n ? `exactly equal to `\n : issue.inclusive\n ? `greater than or equal to `\n : `greater than `}${new Date(Number(issue.minimum))}`;\n else\n message = \"Invalid input\";\n break;\n case ZodIssueCode.too_big:\n if (issue.type === \"array\")\n message = `Array must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `less than`} ${issue.maximum} element(s)`;\n else if (issue.type === \"string\")\n message = `String must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `under`} ${issue.maximum} character(s)`;\n else if (issue.type === \"number\")\n message = `Number must be ${issue.exact\n ? `exactly`\n : issue.inclusive\n ? `less than or equal to`\n : `less than`} ${issue.maximum}`;\n else if (issue.type === \"bigint\")\n message = `BigInt must be ${issue.exact\n ? `exactly`\n : issue.inclusive\n ? `less than or equal to`\n : `less than`} ${issue.maximum}`;\n else if (issue.type === \"date\")\n message = `Date must be ${issue.exact\n ? `exactly`\n : issue.inclusive\n ? `smaller than or equal to`\n : `smaller than`} ${new Date(Number(issue.maximum))}`;\n else\n message = \"Invalid input\";\n break;\n case ZodIssueCode.custom:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_intersection_types:\n message = `Intersection results could not be merged`;\n break;\n case ZodIssueCode.not_multiple_of:\n message = `Number must be a multiple of ${issue.multipleOf}`;\n break;\n case ZodIssueCode.not_finite:\n message = \"Number must be finite\";\n break;\n default:\n message = _ctx.defaultError;\n util.assertNever(issue);\n }\n return { message };\n};\n\nlet overrideErrorMap = errorMap;\nfunction setErrorMap(map) {\n overrideErrorMap = map;\n}\nfunction getErrorMap() {\n return overrideErrorMap;\n}\n\nconst makeIssue = (params) => {\n const { data, path, errorMaps, issueData } = params;\n const fullPath = [...path, ...(issueData.path || [])];\n const fullIssue = {\n ...issueData,\n path: fullPath,\n };\n if (issueData.message !== undefined) {\n return {\n ...issueData,\n path: fullPath,\n message: issueData.message,\n };\n }\n let errorMessage = \"\";\n const maps = errorMaps\n .filter((m) => !!m)\n .slice()\n .reverse();\n for (const map of maps) {\n errorMessage = map(fullIssue, { data, defaultError: errorMessage }).message;\n }\n return {\n ...issueData,\n path: fullPath,\n message: errorMessage,\n };\n};\nconst EMPTY_PATH = [];\nfunction addIssueToContext(ctx, issueData) {\n const overrideMap = getErrorMap();\n const issue = makeIssue({\n issueData: issueData,\n data: ctx.data,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap, // contextual error map is first priority\n ctx.schemaErrorMap, // then schema-bound map if available\n overrideMap, // then global override map\n overrideMap === errorMap ? undefined : errorMap, // then global default map\n ].filter((x) => !!x),\n });\n ctx.common.issues.push(issue);\n}\nclass ParseStatus {\n constructor() {\n this.value = \"valid\";\n }\n dirty() {\n if (this.value === \"valid\")\n this.value = \"dirty\";\n }\n abort() {\n if (this.value !== \"aborted\")\n this.value = \"aborted\";\n }\n static mergeArray(status, results) {\n const arrayValue = [];\n for (const s of results) {\n if (s.status === \"aborted\")\n return INVALID;\n if (s.status === \"dirty\")\n status.dirty();\n arrayValue.push(s.value);\n }\n return { status: status.value, value: arrayValue };\n }\n static async mergeObjectAsync(status, pairs) {\n const syncPairs = [];\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n syncPairs.push({\n key,\n value,\n });\n }\n return ParseStatus.mergeObjectSync(status, syncPairs);\n }\n static mergeObjectSync(status, pairs) {\n const finalObject = {};\n for (const pair of pairs) {\n const { key, value } = pair;\n if (key.status === \"aborted\")\n return INVALID;\n if (value.status === \"aborted\")\n return INVALID;\n if (key.status === \"dirty\")\n status.dirty();\n if (value.status === \"dirty\")\n status.dirty();\n if (key.value !== \"__proto__\" &&\n (typeof value.value !== \"undefined\" || pair.alwaysSet)) {\n finalObject[key.value] = value.value;\n }\n }\n return { status: status.value, value: finalObject };\n }\n}\nconst INVALID = Object.freeze({\n status: \"aborted\",\n});\nconst DIRTY = (value) => ({ status: \"dirty\", value });\nconst OK = (value) => ({ status: \"valid\", value });\nconst isAborted = (x) => x.status === \"aborted\";\nconst isDirty = (x) => x.status === \"dirty\";\nconst isValid = (x) => x.status === \"valid\";\nconst isAsync = (x) => typeof Promise !== \"undefined\" && x instanceof Promise;\n\n/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n\r\nfunction __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nfunction __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\ntypeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\n\nvar errorUtil;\n(function (errorUtil) {\n errorUtil.errToObj = (message) => typeof message === \"string\" ? { message } : message || {};\n errorUtil.toString = (message) => typeof message === \"string\" ? message : message === null || message === void 0 ? void 0 : message.message;\n})(errorUtil || (errorUtil = {}));\n\nvar _ZodEnum_cache, _ZodNativeEnum_cache;\nclass ParseInputLazyPath {\n constructor(parent, value, path, key) {\n this._cachedPath = [];\n this.parent = parent;\n this.data = value;\n this._path = path;\n this._key = key;\n }\n get path() {\n if (!this._cachedPath.length) {\n if (this._key instanceof Array) {\n this._cachedPath.push(...this._path, ...this._key);\n }\n else {\n this._cachedPath.push(...this._path, this._key);\n }\n }\n return this._cachedPath;\n }\n}\nconst handleResult = (ctx, result) => {\n if (isValid(result)) {\n return { success: true, data: result.value };\n }\n else {\n if (!ctx.common.issues.length) {\n throw new Error(\"Validation failed but no issues detected.\");\n }\n return {\n success: false,\n get error() {\n if (this._error)\n return this._error;\n const error = new ZodError(ctx.common.issues);\n this._error = error;\n return this._error;\n },\n };\n }\n};\nfunction processCreateParams(params) {\n if (!params)\n return {};\n const { errorMap, invalid_type_error, required_error, description } = params;\n if (errorMap && (invalid_type_error || required_error)) {\n throw new Error(`Can't use \"invalid_type_error\" or \"required_error\" in conjunction with custom error map.`);\n }\n if (errorMap)\n return { errorMap: errorMap, description };\n const customMap = (iss, ctx) => {\n var _a, _b;\n const { message } = params;\n if (iss.code === \"invalid_enum_value\") {\n return { message: message !== null && message !== void 0 ? message : ctx.defaultError };\n }\n if (typeof ctx.data === \"undefined\") {\n return { message: (_a = message !== null && message !== void 0 ? message : required_error) !== null && _a !== void 0 ? _a : ctx.defaultError };\n }\n if (iss.code !== \"invalid_type\")\n return { message: ctx.defaultError };\n return { message: (_b = message !== null && message !== void 0 ? message : invalid_type_error) !== null && _b !== void 0 ? _b : ctx.defaultError };\n };\n return { errorMap: customMap, description };\n}\nclass ZodType {\n get description() {\n return this._def.description;\n }\n _getType(input) {\n return getParsedType(input.data);\n }\n _getOrReturnCtx(input, ctx) {\n return (ctx || {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent,\n });\n }\n _processInputParams(input) {\n return {\n status: new ParseStatus(),\n ctx: {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent,\n },\n };\n }\n _parseSync(input) {\n const result = this._parse(input);\n if (isAsync(result)) {\n throw new Error(\"Synchronous parse encountered promise.\");\n }\n return result;\n }\n _parseAsync(input) {\n const result = this._parse(input);\n return Promise.resolve(result);\n }\n parse(data, params) {\n const result = this.safeParse(data, params);\n if (result.success)\n return result.data;\n throw result.error;\n }\n safeParse(data, params) {\n var _a;\n const ctx = {\n common: {\n issues: [],\n async: (_a = params === null || params === void 0 ? void 0 : params.async) !== null && _a !== void 0 ? _a : false,\n contextualErrorMap: params === null || params === void 0 ? void 0 : params.errorMap,\n },\n path: (params === null || params === void 0 ? void 0 : params.path) || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n const result = this._parseSync({ data, path: ctx.path, parent: ctx });\n return handleResult(ctx, result);\n }\n \"~validate\"(data) {\n var _a, _b;\n const ctx = {\n common: {\n issues: [],\n async: !!this[\"~standard\"].async,\n },\n path: [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n if (!this[\"~standard\"].async) {\n try {\n const result = this._parseSync({ data, path: [], parent: ctx });\n return isValid(result)\n ? {\n value: result.value,\n }\n : {\n issues: ctx.common.issues,\n };\n }\n catch (err) {\n if ((_b = (_a = err === null || err === void 0 ? void 0 : err.message) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === null || _b === void 0 ? void 0 : _b.includes(\"encountered\")) {\n this[\"~standard\"].async = true;\n }\n ctx.common = {\n issues: [],\n async: true,\n };\n }\n }\n return this._parseAsync({ data, path: [], parent: ctx }).then((result) => isValid(result)\n ? {\n value: result.value,\n }\n : {\n issues: ctx.common.issues,\n });\n }\n async parseAsync(data, params) {\n const result = await this.safeParseAsync(data, params);\n if (result.success)\n return result.data;\n throw result.error;\n }\n async safeParseAsync(data, params) {\n const ctx = {\n common: {\n issues: [],\n contextualErrorMap: params === null || params === void 0 ? void 0 : params.errorMap,\n async: true,\n },\n path: (params === null || params === void 0 ? void 0 : params.path) || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n const maybeAsyncResult = this._parse({ data, path: ctx.path, parent: ctx });\n const result = await (isAsync(maybeAsyncResult)\n ? maybeAsyncResult\n : Promise.resolve(maybeAsyncResult));\n return handleResult(ctx, result);\n }\n refine(check, message) {\n const getIssueProperties = (val) => {\n if (typeof message === \"string\" || typeof message === \"undefined\") {\n return { message };\n }\n else if (typeof message === \"function\") {\n return message(val);\n }\n else {\n return message;\n }\n };\n return this._refinement((val, ctx) => {\n const result = check(val);\n const setError = () => ctx.addIssue({\n code: ZodIssueCode.custom,\n ...getIssueProperties(val),\n });\n if (typeof Promise !== \"undefined\" && result instanceof Promise) {\n return result.then((data) => {\n if (!data) {\n setError();\n return false;\n }\n else {\n return true;\n }\n });\n }\n if (!result) {\n setError();\n return false;\n }\n else {\n return true;\n }\n });\n }\n refinement(check, refinementData) {\n return this._refinement((val, ctx) => {\n if (!check(val)) {\n ctx.addIssue(typeof refinementData === \"function\"\n ? refinementData(val, ctx)\n : refinementData);\n return false;\n }\n else {\n return true;\n }\n });\n }\n _refinement(refinement) {\n return new ZodEffects({\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: { type: \"refinement\", refinement },\n });\n }\n superRefine(refinement) {\n return this._refinement(refinement);\n }\n constructor(def) {\n /** Alias of safeParseAsync */\n this.spa = this.safeParseAsync;\n this._def = def;\n this.parse = this.parse.bind(this);\n this.safeParse = this.safeParse.bind(this);\n this.parseAsync = this.parseAsync.bind(this);\n this.safeParseAsync = this.safeParseAsync.bind(this);\n this.spa = this.spa.bind(this);\n this.refine = this.refine.bind(this);\n this.refinement = this.refinement.bind(this);\n this.superRefine = this.superRefine.bind(this);\n this.optional = this.optional.bind(this);\n this.nullable = this.nullable.bind(this);\n this.nullish = this.nullish.bind(this);\n this.array = this.array.bind(this);\n this.promise = this.promise.bind(this);\n this.or = this.or.bind(this);\n this.and = this.and.bind(this);\n this.transform = this.transform.bind(this);\n this.brand = this.brand.bind(this);\n this.default = this.default.bind(this);\n this.catch = this.catch.bind(this);\n this.describe = this.describe.bind(this);\n this.pipe = this.pipe.bind(this);\n this.readonly = this.readonly.bind(this);\n this.isNullable = this.isNullable.bind(this);\n this.isOptional = this.isOptional.bind(this);\n this[\"~standard\"] = {\n version: 1,\n vendor: \"zod\",\n validate: (data) => this[\"~validate\"](data),\n };\n }\n optional() {\n return ZodOptional.create(this, this._def);\n }\n nullable() {\n return ZodNullable.create(this, this._def);\n }\n nullish() {\n return this.nullable().optional();\n }\n array() {\n return ZodArray.create(this);\n }\n promise() {\n return ZodPromise.create(this, this._def);\n }\n or(option) {\n return ZodUnion.create([this, option], this._def);\n }\n and(incoming) {\n return ZodIntersection.create(this, incoming, this._def);\n }\n transform(transform) {\n return new ZodEffects({\n ...processCreateParams(this._def),\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: { type: \"transform\", transform },\n });\n }\n default(def) {\n const defaultValueFunc = typeof def === \"function\" ? def : () => def;\n return new ZodDefault({\n ...processCreateParams(this._def),\n innerType: this,\n defaultValue: defaultValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodDefault,\n });\n }\n brand() {\n return new ZodBranded({\n typeName: ZodFirstPartyTypeKind.ZodBranded,\n type: this,\n ...processCreateParams(this._def),\n });\n }\n catch(def) {\n const catchValueFunc = typeof def === \"function\" ? def : () => def;\n return new ZodCatch({\n ...processCreateParams(this._def),\n innerType: this,\n catchValue: catchValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodCatch,\n });\n }\n describe(description) {\n const This = this.constructor;\n return new This({\n ...this._def,\n description,\n });\n }\n pipe(target) {\n return ZodPipeline.create(this, target);\n }\n readonly() {\n return ZodReadonly.create(this);\n }\n isOptional() {\n return this.safeParse(undefined).success;\n }\n isNullable() {\n return this.safeParse(null).success;\n }\n}\nconst cuidRegex = /^c[^\\s-]{8,}$/i;\nconst cuid2Regex = /^[0-9a-z]+$/;\nconst ulidRegex = /^[0-9A-HJKMNP-TV-Z]{26}$/i;\n// const uuidRegex =\n// /^([a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[a-f0-9]{4}-[a-f0-9]{12}|00000000-0000-0000-0000-000000000000)$/i;\nconst uuidRegex = /^[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$/i;\nconst nanoidRegex = /^[a-z0-9_-]{21}$/i;\nconst jwtRegex = /^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]*$/;\nconst durationRegex = /^[-+]?P(?!$)(?:(?:[-+]?\\d+Y)|(?:[-+]?\\d+[.,]\\d+Y$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:(?:[-+]?\\d+W)|(?:[-+]?\\d+[.,]\\d+W$))?(?:(?:[-+]?\\d+D)|(?:[-+]?\\d+[.,]\\d+D$))?(?:T(?=[\\d+-])(?:(?:[-+]?\\d+H)|(?:[-+]?\\d+[.,]\\d+H$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:[-+]?\\d+(?:[.,]\\d+)?S)?)??$/;\n// from https://stackoverflow.com/a/46181/1550155\n// old version: too slow, didn't support unicode\n// const emailRegex = /^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/i;\n//old email regex\n// const emailRegex = /^(([^<>()[\\].,;:\\s@\"]+(\\.[^<>()[\\].,;:\\s@\"]+)*)|(\".+\"))@((?!-)([^<>()[\\].,;:\\s@\"]+\\.)+[^<>()[\\].,;:\\s@\"]{1,})[^-<>()[\\].,;:\\s@\"]$/i;\n// eslint-disable-next-line\n// const emailRegex =\n// /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\])|(\\[IPv6:(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))\\])|([A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])*(\\.[A-Za-z]{2,})+))$/;\n// const emailRegex =\n// /^[a-zA-Z0-9\\.\\!\\#\\$\\%\\&\\'\\*\\+\\/\\=\\?\\^\\_\\`\\{\\|\\}\\~\\-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n// const emailRegex =\n// /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])$/i;\nconst emailRegex = /^(?!\\.)(?!.*\\.\\.)([A-Z0-9_'+\\-\\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\\-]*\\.)+[A-Z]{2,}$/i;\n// const emailRegex =\n// /^[a-z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-z0-9-]+(?:\\.[a-z0-9\\-]+)*$/i;\n// from https://thekevinscott.com/emojis-in-javascript/#writing-a-regular-expression\nconst _emojiRegex = `^(\\\\p{Extended_Pictographic}|\\\\p{Emoji_Component})+$`;\nlet emojiRegex;\n// faster, simpler, safer\nconst ipv4Regex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/;\nconst ipv4CidrRegex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/(3[0-2]|[12]?[0-9])$/;\n// const ipv6Regex =\n// /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/;\nconst ipv6Regex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/;\nconst ipv6CidrRegex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/;\n// https://stackoverflow.com/questions/7860392/determine-if-string-is-in-base64-using-javascript\nconst base64Regex = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/;\n// https://base64.guru/standards/base64url\nconst base64urlRegex = /^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/;\n// simple\n// const dateRegexSource = `\\\\d{4}-\\\\d{2}-\\\\d{2}`;\n// no leap year validation\n// const dateRegexSource = `\\\\d{4}-((0[13578]|10|12)-31|(0[13-9]|1[0-2])-30|(0[1-9]|1[0-2])-(0[1-9]|1\\\\d|2\\\\d))`;\n// with leap year validation\nconst dateRegexSource = `((\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\\\d|30)|(02)-(0[1-9]|1\\\\d|2[0-8])))`;\nconst dateRegex = new RegExp(`^${dateRegexSource}$`);\nfunction timeRegexSource(args) {\n // let regex = `\\\\d{2}:\\\\d{2}:\\\\d{2}`;\n let regex = `([01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d`;\n if (args.precision) {\n regex = `${regex}\\\\.\\\\d{${args.precision}}`;\n }\n else if (args.precision == null) {\n regex = `${regex}(\\\\.\\\\d+)?`;\n }\n return regex;\n}\nfunction timeRegex(args) {\n return new RegExp(`^${timeRegexSource(args)}$`);\n}\n// Adapted from https://stackoverflow.com/a/3143231\nfunction datetimeRegex(args) {\n let regex = `${dateRegexSource}T${timeRegexSource(args)}`;\n const opts = [];\n opts.push(args.local ? `Z?` : `Z`);\n if (args.offset)\n opts.push(`([+-]\\\\d{2}:?\\\\d{2})`);\n regex = `${regex}(${opts.join(\"|\")})`;\n return new RegExp(`^${regex}$`);\n}\nfunction isValidIP(ip, version) {\n if ((version === \"v4\" || !version) && ipv4Regex.test(ip)) {\n return true;\n }\n if ((version === \"v6\" || !version) && ipv6Regex.test(ip)) {\n return true;\n }\n return false;\n}\nfunction isValidJWT(jwt, alg) {\n if (!jwtRegex.test(jwt))\n return false;\n try {\n const [header] = jwt.split(\".\");\n // Convert base64url to base64\n const base64 = header\n .replace(/-/g, \"+\")\n .replace(/_/g, \"/\")\n .padEnd(header.length + ((4 - (header.length % 4)) % 4), \"=\");\n const decoded = JSON.parse(atob(base64));\n if (typeof decoded !== \"object\" || decoded === null)\n return false;\n if (!decoded.typ || !decoded.alg)\n return false;\n if (alg && decoded.alg !== alg)\n return false;\n return true;\n }\n catch (_a) {\n return false;\n }\n}\nfunction isValidCidr(ip, version) {\n if ((version === \"v4\" || !version) && ipv4CidrRegex.test(ip)) {\n return true;\n }\n if ((version === \"v6\" || !version) && ipv6CidrRegex.test(ip)) {\n return true;\n }\n return false;\n}\nclass ZodString extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = String(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.string) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.string,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n if (input.data.length < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n if (input.data.length > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"length\") {\n const tooBig = input.data.length > check.value;\n const tooSmall = input.data.length < check.value;\n if (tooBig || tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n if (tooBig) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n exact: true,\n message: check.message,\n });\n }\n else if (tooSmall) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n exact: true,\n message: check.message,\n });\n }\n status.dirty();\n }\n }\n else if (check.kind === \"email\") {\n if (!emailRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"email\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"emoji\") {\n if (!emojiRegex) {\n emojiRegex = new RegExp(_emojiRegex, \"u\");\n }\n if (!emojiRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"emoji\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"uuid\") {\n if (!uuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"uuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"nanoid\") {\n if (!nanoidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"nanoid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cuid\") {\n if (!cuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cuid2\") {\n if (!cuid2Regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid2\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"ulid\") {\n if (!ulidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"ulid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"url\") {\n try {\n new URL(input.data);\n }\n catch (_a) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"url\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"regex\") {\n check.regex.lastIndex = 0;\n const testResult = check.regex.test(input.data);\n if (!testResult) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"regex\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"trim\") {\n input.data = input.data.trim();\n }\n else if (check.kind === \"includes\") {\n if (!input.data.includes(check.value, check.position)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { includes: check.value, position: check.position },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"toLowerCase\") {\n input.data = input.data.toLowerCase();\n }\n else if (check.kind === \"toUpperCase\") {\n input.data = input.data.toUpperCase();\n }\n else if (check.kind === \"startsWith\") {\n if (!input.data.startsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { startsWith: check.value },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"endsWith\") {\n if (!input.data.endsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { endsWith: check.value },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"datetime\") {\n const regex = datetimeRegex(check);\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"datetime\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"date\") {\n const regex = dateRegex;\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"date\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"time\") {\n const regex = timeRegex(check);\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"time\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"duration\") {\n if (!durationRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"duration\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"ip\") {\n if (!isValidIP(input.data, check.version)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"ip\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"jwt\") {\n if (!isValidJWT(input.data, check.alg)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"jwt\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cidr\") {\n if (!isValidCidr(input.data, check.version)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cidr\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"base64\") {\n if (!base64Regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"base64\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"base64url\") {\n if (!base64urlRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"base64url\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n _regex(regex, validation, message) {\n return this.refinement((data) => regex.test(data), {\n validation,\n code: ZodIssueCode.invalid_string,\n ...errorUtil.errToObj(message),\n });\n }\n _addCheck(check) {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n email(message) {\n return this._addCheck({ kind: \"email\", ...errorUtil.errToObj(message) });\n }\n url(message) {\n return this._addCheck({ kind: \"url\", ...errorUtil.errToObj(message) });\n }\n emoji(message) {\n return this._addCheck({ kind: \"emoji\", ...errorUtil.errToObj(message) });\n }\n uuid(message) {\n return this._addCheck({ kind: \"uuid\", ...errorUtil.errToObj(message) });\n }\n nanoid(message) {\n return this._addCheck({ kind: \"nanoid\", ...errorUtil.errToObj(message) });\n }\n cuid(message) {\n return this._addCheck({ kind: \"cuid\", ...errorUtil.errToObj(message) });\n }\n cuid2(message) {\n return this._addCheck({ kind: \"cuid2\", ...errorUtil.errToObj(message) });\n }\n ulid(message) {\n return this._addCheck({ kind: \"ulid\", ...errorUtil.errToObj(message) });\n }\n base64(message) {\n return this._addCheck({ kind: \"base64\", ...errorUtil.errToObj(message) });\n }\n base64url(message) {\n // base64url encoding is a modification of base64 that can safely be used in URLs and filenames\n return this._addCheck({\n kind: \"base64url\",\n ...errorUtil.errToObj(message),\n });\n }\n jwt(options) {\n return this._addCheck({ kind: \"jwt\", ...errorUtil.errToObj(options) });\n }\n ip(options) {\n return this._addCheck({ kind: \"ip\", ...errorUtil.errToObj(options) });\n }\n cidr(options) {\n return this._addCheck({ kind: \"cidr\", ...errorUtil.errToObj(options) });\n }\n datetime(options) {\n var _a, _b;\n if (typeof options === \"string\") {\n return this._addCheck({\n kind: \"datetime\",\n precision: null,\n offset: false,\n local: false,\n message: options,\n });\n }\n return this._addCheck({\n kind: \"datetime\",\n precision: typeof (options === null || options === void 0 ? void 0 : options.precision) === \"undefined\" ? null : options === null || options === void 0 ? void 0 : options.precision,\n offset: (_a = options === null || options === void 0 ? void 0 : options.offset) !== null && _a !== void 0 ? _a : false,\n local: (_b = options === null || options === void 0 ? void 0 : options.local) !== null && _b !== void 0 ? _b : false,\n ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message),\n });\n }\n date(message) {\n return this._addCheck({ kind: \"date\", message });\n }\n time(options) {\n if (typeof options === \"string\") {\n return this._addCheck({\n kind: \"time\",\n precision: null,\n message: options,\n });\n }\n return this._addCheck({\n kind: \"time\",\n precision: typeof (options === null || options === void 0 ? void 0 : options.precision) === \"undefined\" ? null : options === null || options === void 0 ? void 0 : options.precision,\n ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message),\n });\n }\n duration(message) {\n return this._addCheck({ kind: \"duration\", ...errorUtil.errToObj(message) });\n }\n regex(regex, message) {\n return this._addCheck({\n kind: \"regex\",\n regex: regex,\n ...errorUtil.errToObj(message),\n });\n }\n includes(value, options) {\n return this._addCheck({\n kind: \"includes\",\n value: value,\n position: options === null || options === void 0 ? void 0 : options.position,\n ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message),\n });\n }\n startsWith(value, message) {\n return this._addCheck({\n kind: \"startsWith\",\n value: value,\n ...errorUtil.errToObj(message),\n });\n }\n endsWith(value, message) {\n return this._addCheck({\n kind: \"endsWith\",\n value: value,\n ...errorUtil.errToObj(message),\n });\n }\n min(minLength, message) {\n return this._addCheck({\n kind: \"min\",\n value: minLength,\n ...errorUtil.errToObj(message),\n });\n }\n max(maxLength, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxLength,\n ...errorUtil.errToObj(message),\n });\n }\n length(len, message) {\n return this._addCheck({\n kind: \"length\",\n value: len,\n ...errorUtil.errToObj(message),\n });\n }\n /**\n * Equivalent to `.min(1)`\n */\n nonempty(message) {\n return this.min(1, errorUtil.errToObj(message));\n }\n trim() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"trim\" }],\n });\n }\n toLowerCase() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"toLowerCase\" }],\n });\n }\n toUpperCase() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"toUpperCase\" }],\n });\n }\n get isDatetime() {\n return !!this._def.checks.find((ch) => ch.kind === \"datetime\");\n }\n get isDate() {\n return !!this._def.checks.find((ch) => ch.kind === \"date\");\n }\n get isTime() {\n return !!this._def.checks.find((ch) => ch.kind === \"time\");\n }\n get isDuration() {\n return !!this._def.checks.find((ch) => ch.kind === \"duration\");\n }\n get isEmail() {\n return !!this._def.checks.find((ch) => ch.kind === \"email\");\n }\n get isURL() {\n return !!this._def.checks.find((ch) => ch.kind === \"url\");\n }\n get isEmoji() {\n return !!this._def.checks.find((ch) => ch.kind === \"emoji\");\n }\n get isUUID() {\n return !!this._def.checks.find((ch) => ch.kind === \"uuid\");\n }\n get isNANOID() {\n return !!this._def.checks.find((ch) => ch.kind === \"nanoid\");\n }\n get isCUID() {\n return !!this._def.checks.find((ch) => ch.kind === \"cuid\");\n }\n get isCUID2() {\n return !!this._def.checks.find((ch) => ch.kind === \"cuid2\");\n }\n get isULID() {\n return !!this._def.checks.find((ch) => ch.kind === \"ulid\");\n }\n get isIP() {\n return !!this._def.checks.find((ch) => ch.kind === \"ip\");\n }\n get isCIDR() {\n return !!this._def.checks.find((ch) => ch.kind === \"cidr\");\n }\n get isBase64() {\n return !!this._def.checks.find((ch) => ch.kind === \"base64\");\n }\n get isBase64url() {\n // base64url encoding is a modification of base64 that can safely be used in URLs and filenames\n return !!this._def.checks.find((ch) => ch.kind === \"base64url\");\n }\n get minLength() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxLength() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n}\nZodString.create = (params) => {\n var _a;\n return new ZodString({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodString,\n coerce: (_a = params === null || params === void 0 ? void 0 : params.coerce) !== null && _a !== void 0 ? _a : false,\n ...processCreateParams(params),\n });\n};\n// https://stackoverflow.com/questions/3966484/why-does-modulus-operator-return-fractional-number-in-javascript/31711034#31711034\nfunction floatSafeRemainder(val, step) {\n const valDecCount = (val.toString().split(\".\")[1] || \"\").length;\n const stepDecCount = (step.toString().split(\".\")[1] || \"\").length;\n const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount;\n const valInt = parseInt(val.toFixed(decCount).replace(\".\", \"\"));\n const stepInt = parseInt(step.toFixed(decCount).replace(\".\", \"\"));\n return (valInt % stepInt) / Math.pow(10, decCount);\n}\nclass ZodNumber extends ZodType {\n constructor() {\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n this.step = this.multipleOf;\n }\n _parse(input) {\n if (this._def.coerce) {\n input.data = Number(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.number) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.number,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks) {\n if (check.kind === \"int\") {\n if (!util.isInteger(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: \"integer\",\n received: \"float\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"min\") {\n const tooSmall = check.inclusive\n ? input.data < check.value\n : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n const tooBig = check.inclusive\n ? input.data > check.value\n : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"multipleOf\") {\n if (floatSafeRemainder(input.data, check.value) !== 0) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"finite\") {\n if (!Number.isFinite(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_finite,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodNumber({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message),\n },\n ],\n });\n }\n _addCheck(check) {\n return new ZodNumber({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n int(message) {\n return this._addCheck({\n kind: \"int\",\n message: errorUtil.toString(message),\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value: value,\n message: errorUtil.toString(message),\n });\n }\n finite(message) {\n return this._addCheck({\n kind: \"finite\",\n message: errorUtil.toString(message),\n });\n }\n safe(message) {\n return this._addCheck({\n kind: \"min\",\n inclusive: true,\n value: Number.MIN_SAFE_INTEGER,\n message: errorUtil.toString(message),\n })._addCheck({\n kind: \"max\",\n inclusive: true,\n value: Number.MAX_SAFE_INTEGER,\n message: errorUtil.toString(message),\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n get isInt() {\n return !!this._def.checks.find((ch) => ch.kind === \"int\" ||\n (ch.kind === \"multipleOf\" && util.isInteger(ch.value)));\n }\n get isFinite() {\n let max = null, min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"finite\" ||\n ch.kind === \"int\" ||\n ch.kind === \"multipleOf\") {\n return true;\n }\n else if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n else if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return Number.isFinite(min) && Number.isFinite(max);\n }\n}\nZodNumber.create = (params) => {\n return new ZodNumber({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodNumber,\n coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false,\n ...processCreateParams(params),\n });\n};\nclass ZodBigInt extends ZodType {\n constructor() {\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n }\n _parse(input) {\n if (this._def.coerce) {\n try {\n input.data = BigInt(input.data);\n }\n catch (_a) {\n return this._getInvalidInput(input);\n }\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.bigint) {\n return this._getInvalidInput(input);\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n const tooSmall = check.inclusive\n ? input.data < check.value\n : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n type: \"bigint\",\n minimum: check.value,\n inclusive: check.inclusive,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n const tooBig = check.inclusive\n ? input.data > check.value\n : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n type: \"bigint\",\n maximum: check.value,\n inclusive: check.inclusive,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"multipleOf\") {\n if (input.data % check.value !== BigInt(0)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n _getInvalidInput(input) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.bigint,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodBigInt({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message),\n },\n ],\n });\n }\n _addCheck(check) {\n return new ZodBigInt({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value,\n message: errorUtil.toString(message),\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n}\nZodBigInt.create = (params) => {\n var _a;\n return new ZodBigInt({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodBigInt,\n coerce: (_a = params === null || params === void 0 ? void 0 : params.coerce) !== null && _a !== void 0 ? _a : false,\n ...processCreateParams(params),\n });\n};\nclass ZodBoolean extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = Boolean(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.boolean) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.boolean,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodBoolean.create = (params) => {\n return new ZodBoolean({\n typeName: ZodFirstPartyTypeKind.ZodBoolean,\n coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false,\n ...processCreateParams(params),\n });\n};\nclass ZodDate extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = new Date(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.date) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.date,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (isNaN(input.data.getTime())) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_date,\n });\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n if (input.data.getTime() < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n message: check.message,\n inclusive: true,\n exact: false,\n minimum: check.value,\n type: \"date\",\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n if (input.data.getTime() > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n message: check.message,\n inclusive: true,\n exact: false,\n maximum: check.value,\n type: \"date\",\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return {\n status: status.value,\n value: new Date(input.data.getTime()),\n };\n }\n _addCheck(check) {\n return new ZodDate({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n min(minDate, message) {\n return this._addCheck({\n kind: \"min\",\n value: minDate.getTime(),\n message: errorUtil.toString(message),\n });\n }\n max(maxDate, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxDate.getTime(),\n message: errorUtil.toString(message),\n });\n }\n get minDate() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min != null ? new Date(min) : null;\n }\n get maxDate() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max != null ? new Date(max) : null;\n }\n}\nZodDate.create = (params) => {\n return new ZodDate({\n checks: [],\n coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false,\n typeName: ZodFirstPartyTypeKind.ZodDate,\n ...processCreateParams(params),\n });\n};\nclass ZodSymbol extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.symbol) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.symbol,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodSymbol.create = (params) => {\n return new ZodSymbol({\n typeName: ZodFirstPartyTypeKind.ZodSymbol,\n ...processCreateParams(params),\n });\n};\nclass ZodUndefined extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.undefined,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodUndefined.create = (params) => {\n return new ZodUndefined({\n typeName: ZodFirstPartyTypeKind.ZodUndefined,\n ...processCreateParams(params),\n });\n};\nclass ZodNull extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.null) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.null,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodNull.create = (params) => {\n return new ZodNull({\n typeName: ZodFirstPartyTypeKind.ZodNull,\n ...processCreateParams(params),\n });\n};\nclass ZodAny extends ZodType {\n constructor() {\n super(...arguments);\n // to prevent instances of other classes from extending ZodAny. this causes issues with catchall in ZodObject.\n this._any = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodAny.create = (params) => {\n return new ZodAny({\n typeName: ZodFirstPartyTypeKind.ZodAny,\n ...processCreateParams(params),\n });\n};\nclass ZodUnknown extends ZodType {\n constructor() {\n super(...arguments);\n // required\n this._unknown = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodUnknown.create = (params) => {\n return new ZodUnknown({\n typeName: ZodFirstPartyTypeKind.ZodUnknown,\n ...processCreateParams(params),\n });\n};\nclass ZodNever extends ZodType {\n _parse(input) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.never,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n}\nZodNever.create = (params) => {\n return new ZodNever({\n typeName: ZodFirstPartyTypeKind.ZodNever,\n ...processCreateParams(params),\n });\n};\nclass ZodVoid extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.void,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodVoid.create = (params) => {\n return new ZodVoid({\n typeName: ZodFirstPartyTypeKind.ZodVoid,\n ...processCreateParams(params),\n });\n};\nclass ZodArray extends ZodType {\n _parse(input) {\n const { ctx, status } = this._processInputParams(input);\n const def = this._def;\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (def.exactLength !== null) {\n const tooBig = ctx.data.length > def.exactLength.value;\n const tooSmall = ctx.data.length < def.exactLength.value;\n if (tooBig || tooSmall) {\n addIssueToContext(ctx, {\n code: tooBig ? ZodIssueCode.too_big : ZodIssueCode.too_small,\n minimum: (tooSmall ? def.exactLength.value : undefined),\n maximum: (tooBig ? def.exactLength.value : undefined),\n type: \"array\",\n inclusive: true,\n exact: true,\n message: def.exactLength.message,\n });\n status.dirty();\n }\n }\n if (def.minLength !== null) {\n if (ctx.data.length < def.minLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minLength.value,\n type: \"array\",\n inclusive: true,\n exact: false,\n message: def.minLength.message,\n });\n status.dirty();\n }\n }\n if (def.maxLength !== null) {\n if (ctx.data.length > def.maxLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxLength.value,\n type: \"array\",\n inclusive: true,\n exact: false,\n message: def.maxLength.message,\n });\n status.dirty();\n }\n }\n if (ctx.common.async) {\n return Promise.all([...ctx.data].map((item, i) => {\n return def.type._parseAsync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n })).then((result) => {\n return ParseStatus.mergeArray(status, result);\n });\n }\n const result = [...ctx.data].map((item, i) => {\n return def.type._parseSync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n });\n return ParseStatus.mergeArray(status, result);\n }\n get element() {\n return this._def.type;\n }\n min(minLength, message) {\n return new ZodArray({\n ...this._def,\n minLength: { value: minLength, message: errorUtil.toString(message) },\n });\n }\n max(maxLength, message) {\n return new ZodArray({\n ...this._def,\n maxLength: { value: maxLength, message: errorUtil.toString(message) },\n });\n }\n length(len, message) {\n return new ZodArray({\n ...this._def,\n exactLength: { value: len, message: errorUtil.toString(message) },\n });\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodArray.create = (schema, params) => {\n return new ZodArray({\n type: schema,\n minLength: null,\n maxLength: null,\n exactLength: null,\n typeName: ZodFirstPartyTypeKind.ZodArray,\n ...processCreateParams(params),\n });\n};\nfunction deepPartialify(schema) {\n if (schema instanceof ZodObject) {\n const newShape = {};\n for (const key in schema.shape) {\n const fieldSchema = schema.shape[key];\n newShape[key] = ZodOptional.create(deepPartialify(fieldSchema));\n }\n return new ZodObject({\n ...schema._def,\n shape: () => newShape,\n });\n }\n else if (schema instanceof ZodArray) {\n return new ZodArray({\n ...schema._def,\n type: deepPartialify(schema.element),\n });\n }\n else if (schema instanceof ZodOptional) {\n return ZodOptional.create(deepPartialify(schema.unwrap()));\n }\n else if (schema instanceof ZodNullable) {\n return ZodNullable.create(deepPartialify(schema.unwrap()));\n }\n else if (schema instanceof ZodTuple) {\n return ZodTuple.create(schema.items.map((item) => deepPartialify(item)));\n }\n else {\n return schema;\n }\n}\nclass ZodObject extends ZodType {\n constructor() {\n super(...arguments);\n this._cached = null;\n /**\n * @deprecated In most cases, this is no longer needed - unknown properties are now silently stripped.\n * If you want to pass through unknown properties, use `.passthrough()` instead.\n */\n this.nonstrict = this.passthrough;\n // extend<\n // Augmentation extends ZodRawShape,\n // NewOutput extends util.flatten<{\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // }>,\n // NewInput extends util.flatten<{\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }>\n // >(\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape,\n // UnknownKeys,\n // Catchall,\n // NewOutput,\n // NewInput\n // > {\n // return new ZodObject({\n // ...this._def,\n // shape: () => ({\n // ...this._def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // }\n /**\n * @deprecated Use `.extend` instead\n * */\n this.augment = this.extend;\n }\n _getCached() {\n if (this._cached !== null)\n return this._cached;\n const shape = this._def.shape();\n const keys = util.objectKeys(shape);\n return (this._cached = { shape, keys });\n }\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.object) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const { status, ctx } = this._processInputParams(input);\n const { shape, keys: shapeKeys } = this._getCached();\n const extraKeys = [];\n if (!(this._def.catchall instanceof ZodNever &&\n this._def.unknownKeys === \"strip\")) {\n for (const key in ctx.data) {\n if (!shapeKeys.includes(key)) {\n extraKeys.push(key);\n }\n }\n }\n const pairs = [];\n for (const key of shapeKeys) {\n const keyValidator = shape[key];\n const value = ctx.data[key];\n pairs.push({\n key: { status: \"valid\", value: key },\n value: keyValidator._parse(new ParseInputLazyPath(ctx, value, ctx.path, key)),\n alwaysSet: key in ctx.data,\n });\n }\n if (this._def.catchall instanceof ZodNever) {\n const unknownKeys = this._def.unknownKeys;\n if (unknownKeys === \"passthrough\") {\n for (const key of extraKeys) {\n pairs.push({\n key: { status: \"valid\", value: key },\n value: { status: \"valid\", value: ctx.data[key] },\n });\n }\n }\n else if (unknownKeys === \"strict\") {\n if (extraKeys.length > 0) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.unrecognized_keys,\n keys: extraKeys,\n });\n status.dirty();\n }\n }\n else if (unknownKeys === \"strip\") ;\n else {\n throw new Error(`Internal ZodObject error: invalid unknownKeys value.`);\n }\n }\n else {\n // run catchall validation\n const catchall = this._def.catchall;\n for (const key of extraKeys) {\n const value = ctx.data[key];\n pairs.push({\n key: { status: \"valid\", value: key },\n value: catchall._parse(new ParseInputLazyPath(ctx, value, ctx.path, key) //, ctx.child(key), value, getParsedType(value)\n ),\n alwaysSet: key in ctx.data,\n });\n }\n }\n if (ctx.common.async) {\n return Promise.resolve()\n .then(async () => {\n const syncPairs = [];\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n syncPairs.push({\n key,\n value,\n alwaysSet: pair.alwaysSet,\n });\n }\n return syncPairs;\n })\n .then((syncPairs) => {\n return ParseStatus.mergeObjectSync(status, syncPairs);\n });\n }\n else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get shape() {\n return this._def.shape();\n }\n strict(message) {\n errorUtil.errToObj;\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strict\",\n ...(message !== undefined\n ? {\n errorMap: (issue, ctx) => {\n var _a, _b, _c, _d;\n const defaultError = (_c = (_b = (_a = this._def).errorMap) === null || _b === void 0 ? void 0 : _b.call(_a, issue, ctx).message) !== null && _c !== void 0 ? _c : ctx.defaultError;\n if (issue.code === \"unrecognized_keys\")\n return {\n message: (_d = errorUtil.errToObj(message).message) !== null && _d !== void 0 ? _d : defaultError,\n };\n return {\n message: defaultError,\n };\n },\n }\n : {}),\n });\n }\n strip() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strip\",\n });\n }\n passthrough() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"passthrough\",\n });\n }\n // const AugmentFactory =\n // (def: Def) =>\n // (\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape, Augmentation>,\n // Def[\"unknownKeys\"],\n // Def[\"catchall\"]\n // > => {\n // return new ZodObject({\n // ...def,\n // shape: () => ({\n // ...def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // };\n extend(augmentation) {\n return new ZodObject({\n ...this._def,\n shape: () => ({\n ...this._def.shape(),\n ...augmentation,\n }),\n });\n }\n /**\n * Prior to zod@1.0.12 there was a bug in the\n * inferred type of merged objects. Please\n * upgrade if you are experiencing issues.\n */\n merge(merging) {\n const merged = new ZodObject({\n unknownKeys: merging._def.unknownKeys,\n catchall: merging._def.catchall,\n shape: () => ({\n ...this._def.shape(),\n ...merging._def.shape(),\n }),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n });\n return merged;\n }\n // merge<\n // Incoming extends AnyZodObject,\n // Augmentation extends Incoming[\"shape\"],\n // NewOutput extends {\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // },\n // NewInput extends {\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }\n // >(\n // merging: Incoming\n // ): ZodObject<\n // extendShape>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"],\n // NewOutput,\n // NewInput\n // > {\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n setKey(key, schema) {\n return this.augment({ [key]: schema });\n }\n // merge(\n // merging: Incoming\n // ): //ZodObject = (merging) => {\n // ZodObject<\n // extendShape>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"]\n // > {\n // // const mergedShape = objectUtil.mergeShapes(\n // // this._def.shape(),\n // // merging._def.shape()\n // // );\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n catchall(index) {\n return new ZodObject({\n ...this._def,\n catchall: index,\n });\n }\n pick(mask) {\n const shape = {};\n util.objectKeys(mask).forEach((key) => {\n if (mask[key] && this.shape[key]) {\n shape[key] = this.shape[key];\n }\n });\n return new ZodObject({\n ...this._def,\n shape: () => shape,\n });\n }\n omit(mask) {\n const shape = {};\n util.objectKeys(this.shape).forEach((key) => {\n if (!mask[key]) {\n shape[key] = this.shape[key];\n }\n });\n return new ZodObject({\n ...this._def,\n shape: () => shape,\n });\n }\n /**\n * @deprecated\n */\n deepPartial() {\n return deepPartialify(this);\n }\n partial(mask) {\n const newShape = {};\n util.objectKeys(this.shape).forEach((key) => {\n const fieldSchema = this.shape[key];\n if (mask && !mask[key]) {\n newShape[key] = fieldSchema;\n }\n else {\n newShape[key] = fieldSchema.optional();\n }\n });\n return new ZodObject({\n ...this._def,\n shape: () => newShape,\n });\n }\n required(mask) {\n const newShape = {};\n util.objectKeys(this.shape).forEach((key) => {\n if (mask && !mask[key]) {\n newShape[key] = this.shape[key];\n }\n else {\n const fieldSchema = this.shape[key];\n let newField = fieldSchema;\n while (newField instanceof ZodOptional) {\n newField = newField._def.innerType;\n }\n newShape[key] = newField;\n }\n });\n return new ZodObject({\n ...this._def,\n shape: () => newShape,\n });\n }\n keyof() {\n return createZodEnum(util.objectKeys(this.shape));\n }\n}\nZodObject.create = (shape, params) => {\n return new ZodObject({\n shape: () => shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nZodObject.strictCreate = (shape, params) => {\n return new ZodObject({\n shape: () => shape,\n unknownKeys: \"strict\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nZodObject.lazycreate = (shape, params) => {\n return new ZodObject({\n shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nclass ZodUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const options = this._def.options;\n function handleResults(results) {\n // return first issue-free validation if it exists\n for (const result of results) {\n if (result.result.status === \"valid\") {\n return result.result;\n }\n }\n for (const result of results) {\n if (result.result.status === \"dirty\") {\n // add issues from dirty option\n ctx.common.issues.push(...result.ctx.common.issues);\n return result.result;\n }\n }\n // return invalid\n const unionErrors = results.map((result) => new ZodError(result.ctx.common.issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors,\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return Promise.all(options.map(async (option) => {\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n parent: null,\n };\n return {\n result: await option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx,\n }),\n ctx: childCtx,\n };\n })).then(handleResults);\n }\n else {\n let dirty = undefined;\n const issues = [];\n for (const option of options) {\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n parent: null,\n };\n const result = option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx,\n });\n if (result.status === \"valid\") {\n return result;\n }\n else if (result.status === \"dirty\" && !dirty) {\n dirty = { result, ctx: childCtx };\n }\n if (childCtx.common.issues.length) {\n issues.push(childCtx.common.issues);\n }\n }\n if (dirty) {\n ctx.common.issues.push(...dirty.ctx.common.issues);\n return dirty.result;\n }\n const unionErrors = issues.map((issues) => new ZodError(issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors,\n });\n return INVALID;\n }\n }\n get options() {\n return this._def.options;\n }\n}\nZodUnion.create = (types, params) => {\n return new ZodUnion({\n options: types,\n typeName: ZodFirstPartyTypeKind.ZodUnion,\n ...processCreateParams(params),\n });\n};\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\n////////// //////////\n////////// ZodDiscriminatedUnion //////////\n////////// //////////\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\nconst getDiscriminator = (type) => {\n if (type instanceof ZodLazy) {\n return getDiscriminator(type.schema);\n }\n else if (type instanceof ZodEffects) {\n return getDiscriminator(type.innerType());\n }\n else if (type instanceof ZodLiteral) {\n return [type.value];\n }\n else if (type instanceof ZodEnum) {\n return type.options;\n }\n else if (type instanceof ZodNativeEnum) {\n // eslint-disable-next-line ban/ban\n return util.objectValues(type.enum);\n }\n else if (type instanceof ZodDefault) {\n return getDiscriminator(type._def.innerType);\n }\n else if (type instanceof ZodUndefined) {\n return [undefined];\n }\n else if (type instanceof ZodNull) {\n return [null];\n }\n else if (type instanceof ZodOptional) {\n return [undefined, ...getDiscriminator(type.unwrap())];\n }\n else if (type instanceof ZodNullable) {\n return [null, ...getDiscriminator(type.unwrap())];\n }\n else if (type instanceof ZodBranded) {\n return getDiscriminator(type.unwrap());\n }\n else if (type instanceof ZodReadonly) {\n return getDiscriminator(type.unwrap());\n }\n else if (type instanceof ZodCatch) {\n return getDiscriminator(type._def.innerType);\n }\n else {\n return [];\n }\n};\nclass ZodDiscriminatedUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const discriminator = this.discriminator;\n const discriminatorValue = ctx.data[discriminator];\n const option = this.optionsMap.get(discriminatorValue);\n if (!option) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union_discriminator,\n options: Array.from(this.optionsMap.keys()),\n path: [discriminator],\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n }\n else {\n return option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n get discriminator() {\n return this._def.discriminator;\n }\n get options() {\n return this._def.options;\n }\n get optionsMap() {\n return this._def.optionsMap;\n }\n /**\n * The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor.\n * However, it only allows a union of objects, all of which need to share a discriminator property. This property must\n * have a different value for each object in the union.\n * @param discriminator the name of the discriminator property\n * @param types an array of object schemas\n * @param params\n */\n static create(discriminator, options, params) {\n // Get all the valid discriminator values\n const optionsMap = new Map();\n // try {\n for (const type of options) {\n const discriminatorValues = getDiscriminator(type.shape[discriminator]);\n if (!discriminatorValues.length) {\n throw new Error(`A discriminator value for key \\`${discriminator}\\` could not be extracted from all schema options`);\n }\n for (const value of discriminatorValues) {\n if (optionsMap.has(value)) {\n throw new Error(`Discriminator property ${String(discriminator)} has duplicate value ${String(value)}`);\n }\n optionsMap.set(value, type);\n }\n }\n return new ZodDiscriminatedUnion({\n typeName: ZodFirstPartyTypeKind.ZodDiscriminatedUnion,\n discriminator,\n options,\n optionsMap,\n ...processCreateParams(params),\n });\n }\n}\nfunction mergeValues(a, b) {\n const aType = getParsedType(a);\n const bType = getParsedType(b);\n if (a === b) {\n return { valid: true, data: a };\n }\n else if (aType === ZodParsedType.object && bType === ZodParsedType.object) {\n const bKeys = util.objectKeys(b);\n const sharedKeys = util\n .objectKeys(a)\n .filter((key) => bKeys.indexOf(key) !== -1);\n const newObj = { ...a, ...b };\n for (const key of sharedKeys) {\n const sharedValue = mergeValues(a[key], b[key]);\n if (!sharedValue.valid) {\n return { valid: false };\n }\n newObj[key] = sharedValue.data;\n }\n return { valid: true, data: newObj };\n }\n else if (aType === ZodParsedType.array && bType === ZodParsedType.array) {\n if (a.length !== b.length) {\n return { valid: false };\n }\n const newArray = [];\n for (let index = 0; index < a.length; index++) {\n const itemA = a[index];\n const itemB = b[index];\n const sharedValue = mergeValues(itemA, itemB);\n if (!sharedValue.valid) {\n return { valid: false };\n }\n newArray.push(sharedValue.data);\n }\n return { valid: true, data: newArray };\n }\n else if (aType === ZodParsedType.date &&\n bType === ZodParsedType.date &&\n +a === +b) {\n return { valid: true, data: a };\n }\n else {\n return { valid: false };\n }\n}\nclass ZodIntersection extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const handleParsed = (parsedLeft, parsedRight) => {\n if (isAborted(parsedLeft) || isAborted(parsedRight)) {\n return INVALID;\n }\n const merged = mergeValues(parsedLeft.value, parsedRight.value);\n if (!merged.valid) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_intersection_types,\n });\n return INVALID;\n }\n if (isDirty(parsedLeft) || isDirty(parsedRight)) {\n status.dirty();\n }\n return { status: status.value, value: merged.data };\n };\n if (ctx.common.async) {\n return Promise.all([\n this._def.left._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }),\n this._def.right._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }),\n ]).then(([left, right]) => handleParsed(left, right));\n }\n else {\n return handleParsed(this._def.left._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }), this._def.right._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }));\n }\n }\n}\nZodIntersection.create = (left, right, params) => {\n return new ZodIntersection({\n left: left,\n right: right,\n typeName: ZodFirstPartyTypeKind.ZodIntersection,\n ...processCreateParams(params),\n });\n};\nclass ZodTuple extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (ctx.data.length < this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: \"array\",\n });\n return INVALID;\n }\n const rest = this._def.rest;\n if (!rest && ctx.data.length > this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: \"array\",\n });\n status.dirty();\n }\n const items = [...ctx.data]\n .map((item, itemIndex) => {\n const schema = this._def.items[itemIndex] || this._def.rest;\n if (!schema)\n return null;\n return schema._parse(new ParseInputLazyPath(ctx, item, ctx.path, itemIndex));\n })\n .filter((x) => !!x); // filter nulls\n if (ctx.common.async) {\n return Promise.all(items).then((results) => {\n return ParseStatus.mergeArray(status, results);\n });\n }\n else {\n return ParseStatus.mergeArray(status, items);\n }\n }\n get items() {\n return this._def.items;\n }\n rest(rest) {\n return new ZodTuple({\n ...this._def,\n rest,\n });\n }\n}\nZodTuple.create = (schemas, params) => {\n if (!Array.isArray(schemas)) {\n throw new Error(\"You must pass an array of schemas to z.tuple([ ... ])\");\n }\n return new ZodTuple({\n items: schemas,\n typeName: ZodFirstPartyTypeKind.ZodTuple,\n rest: null,\n ...processCreateParams(params),\n });\n};\nclass ZodRecord extends ZodType {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const pairs = [];\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n for (const key in ctx.data) {\n pairs.push({\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, key)),\n value: valueType._parse(new ParseInputLazyPath(ctx, ctx.data[key], ctx.path, key)),\n alwaysSet: key in ctx.data,\n });\n }\n if (ctx.common.async) {\n return ParseStatus.mergeObjectAsync(status, pairs);\n }\n else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get element() {\n return this._def.valueType;\n }\n static create(first, second, third) {\n if (second instanceof ZodType) {\n return new ZodRecord({\n keyType: first,\n valueType: second,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(third),\n });\n }\n return new ZodRecord({\n keyType: ZodString.create(),\n valueType: first,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(second),\n });\n }\n}\nclass ZodMap extends ZodType {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.map) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.map,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n const pairs = [...ctx.data.entries()].map(([key, value], index) => {\n return {\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, [index, \"key\"])),\n value: valueType._parse(new ParseInputLazyPath(ctx, value, ctx.path, [index, \"value\"])),\n };\n });\n if (ctx.common.async) {\n const finalMap = new Map();\n return Promise.resolve().then(async () => {\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return { status: status.value, value: finalMap };\n });\n }\n else {\n const finalMap = new Map();\n for (const pair of pairs) {\n const key = pair.key;\n const value = pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return { status: status.value, value: finalMap };\n }\n }\n}\nZodMap.create = (keyType, valueType, params) => {\n return new ZodMap({\n valueType,\n keyType,\n typeName: ZodFirstPartyTypeKind.ZodMap,\n ...processCreateParams(params),\n });\n};\nclass ZodSet extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.set) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.set,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const def = this._def;\n if (def.minSize !== null) {\n if (ctx.data.size < def.minSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minSize.value,\n type: \"set\",\n inclusive: true,\n exact: false,\n message: def.minSize.message,\n });\n status.dirty();\n }\n }\n if (def.maxSize !== null) {\n if (ctx.data.size > def.maxSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxSize.value,\n type: \"set\",\n inclusive: true,\n exact: false,\n message: def.maxSize.message,\n });\n status.dirty();\n }\n }\n const valueType = this._def.valueType;\n function finalizeSet(elements) {\n const parsedSet = new Set();\n for (const element of elements) {\n if (element.status === \"aborted\")\n return INVALID;\n if (element.status === \"dirty\")\n status.dirty();\n parsedSet.add(element.value);\n }\n return { status: status.value, value: parsedSet };\n }\n const elements = [...ctx.data.values()].map((item, i) => valueType._parse(new ParseInputLazyPath(ctx, item, ctx.path, i)));\n if (ctx.common.async) {\n return Promise.all(elements).then((elements) => finalizeSet(elements));\n }\n else {\n return finalizeSet(elements);\n }\n }\n min(minSize, message) {\n return new ZodSet({\n ...this._def,\n minSize: { value: minSize, message: errorUtil.toString(message) },\n });\n }\n max(maxSize, message) {\n return new ZodSet({\n ...this._def,\n maxSize: { value: maxSize, message: errorUtil.toString(message) },\n });\n }\n size(size, message) {\n return this.min(size, message).max(size, message);\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodSet.create = (valueType, params) => {\n return new ZodSet({\n valueType,\n minSize: null,\n maxSize: null,\n typeName: ZodFirstPartyTypeKind.ZodSet,\n ...processCreateParams(params),\n });\n};\nclass ZodFunction extends ZodType {\n constructor() {\n super(...arguments);\n this.validate = this.implement;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.function) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.function,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n function makeArgsIssue(args, error) {\n return makeIssue({\n data: args,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap,\n ctx.schemaErrorMap,\n getErrorMap(),\n errorMap,\n ].filter((x) => !!x),\n issueData: {\n code: ZodIssueCode.invalid_arguments,\n argumentsError: error,\n },\n });\n }\n function makeReturnsIssue(returns, error) {\n return makeIssue({\n data: returns,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap,\n ctx.schemaErrorMap,\n getErrorMap(),\n errorMap,\n ].filter((x) => !!x),\n issueData: {\n code: ZodIssueCode.invalid_return_type,\n returnTypeError: error,\n },\n });\n }\n const params = { errorMap: ctx.common.contextualErrorMap };\n const fn = ctx.data;\n if (this._def.returns instanceof ZodPromise) {\n // Would love a way to avoid disabling this rule, but we need\n // an alias (using an arrow function was what caused 2651).\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const me = this;\n return OK(async function (...args) {\n const error = new ZodError([]);\n const parsedArgs = await me._def.args\n .parseAsync(args, params)\n .catch((e) => {\n error.addIssue(makeArgsIssue(args, e));\n throw error;\n });\n const result = await Reflect.apply(fn, this, parsedArgs);\n const parsedReturns = await me._def.returns._def.type\n .parseAsync(result, params)\n .catch((e) => {\n error.addIssue(makeReturnsIssue(result, e));\n throw error;\n });\n return parsedReturns;\n });\n }\n else {\n // Would love a way to avoid disabling this rule, but we need\n // an alias (using an arrow function was what caused 2651).\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const me = this;\n return OK(function (...args) {\n const parsedArgs = me._def.args.safeParse(args, params);\n if (!parsedArgs.success) {\n throw new ZodError([makeArgsIssue(args, parsedArgs.error)]);\n }\n const result = Reflect.apply(fn, this, parsedArgs.data);\n const parsedReturns = me._def.returns.safeParse(result, params);\n if (!parsedReturns.success) {\n throw new ZodError([makeReturnsIssue(result, parsedReturns.error)]);\n }\n return parsedReturns.data;\n });\n }\n }\n parameters() {\n return this._def.args;\n }\n returnType() {\n return this._def.returns;\n }\n args(...items) {\n return new ZodFunction({\n ...this._def,\n args: ZodTuple.create(items).rest(ZodUnknown.create()),\n });\n }\n returns(returnType) {\n return new ZodFunction({\n ...this._def,\n returns: returnType,\n });\n }\n implement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n strictImplement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n static create(args, returns, params) {\n return new ZodFunction({\n args: (args\n ? args\n : ZodTuple.create([]).rest(ZodUnknown.create())),\n returns: returns || ZodUnknown.create(),\n typeName: ZodFirstPartyTypeKind.ZodFunction,\n ...processCreateParams(params),\n });\n }\n}\nclass ZodLazy extends ZodType {\n get schema() {\n return this._def.getter();\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const lazySchema = this._def.getter();\n return lazySchema._parse({ data: ctx.data, path: ctx.path, parent: ctx });\n }\n}\nZodLazy.create = (getter, params) => {\n return new ZodLazy({\n getter: getter,\n typeName: ZodFirstPartyTypeKind.ZodLazy,\n ...processCreateParams(params),\n });\n};\nclass ZodLiteral extends ZodType {\n _parse(input) {\n if (input.data !== this._def.value) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_literal,\n expected: this._def.value,\n });\n return INVALID;\n }\n return { status: \"valid\", value: input.data };\n }\n get value() {\n return this._def.value;\n }\n}\nZodLiteral.create = (value, params) => {\n return new ZodLiteral({\n value: value,\n typeName: ZodFirstPartyTypeKind.ZodLiteral,\n ...processCreateParams(params),\n });\n};\nfunction createZodEnum(values, params) {\n return new ZodEnum({\n values,\n typeName: ZodFirstPartyTypeKind.ZodEnum,\n ...processCreateParams(params),\n });\n}\nclass ZodEnum extends ZodType {\n constructor() {\n super(...arguments);\n _ZodEnum_cache.set(this, void 0);\n }\n _parse(input) {\n if (typeof input.data !== \"string\") {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type,\n });\n return INVALID;\n }\n if (!__classPrivateFieldGet(this, _ZodEnum_cache, \"f\")) {\n __classPrivateFieldSet(this, _ZodEnum_cache, new Set(this._def.values), \"f\");\n }\n if (!__classPrivateFieldGet(this, _ZodEnum_cache, \"f\").has(input.data)) {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get options() {\n return this._def.values;\n }\n get enum() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Values() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Enum() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n extract(values, newDef = this._def) {\n return ZodEnum.create(values, {\n ...this._def,\n ...newDef,\n });\n }\n exclude(values, newDef = this._def) {\n return ZodEnum.create(this.options.filter((opt) => !values.includes(opt)), {\n ...this._def,\n ...newDef,\n });\n }\n}\n_ZodEnum_cache = new WeakMap();\nZodEnum.create = createZodEnum;\nclass ZodNativeEnum extends ZodType {\n constructor() {\n super(...arguments);\n _ZodNativeEnum_cache.set(this, void 0);\n }\n _parse(input) {\n const nativeEnumValues = util.getValidEnumValues(this._def.values);\n const ctx = this._getOrReturnCtx(input);\n if (ctx.parsedType !== ZodParsedType.string &&\n ctx.parsedType !== ZodParsedType.number) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type,\n });\n return INVALID;\n }\n if (!__classPrivateFieldGet(this, _ZodNativeEnum_cache, \"f\")) {\n __classPrivateFieldSet(this, _ZodNativeEnum_cache, new Set(util.getValidEnumValues(this._def.values)), \"f\");\n }\n if (!__classPrivateFieldGet(this, _ZodNativeEnum_cache, \"f\").has(input.data)) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get enum() {\n return this._def.values;\n }\n}\n_ZodNativeEnum_cache = new WeakMap();\nZodNativeEnum.create = (values, params) => {\n return new ZodNativeEnum({\n values: values,\n typeName: ZodFirstPartyTypeKind.ZodNativeEnum,\n ...processCreateParams(params),\n });\n};\nclass ZodPromise extends ZodType {\n unwrap() {\n return this._def.type;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.promise &&\n ctx.common.async === false) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.promise,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const promisified = ctx.parsedType === ZodParsedType.promise\n ? ctx.data\n : Promise.resolve(ctx.data);\n return OK(promisified.then((data) => {\n return this._def.type.parseAsync(data, {\n path: ctx.path,\n errorMap: ctx.common.contextualErrorMap,\n });\n }));\n }\n}\nZodPromise.create = (schema, params) => {\n return new ZodPromise({\n type: schema,\n typeName: ZodFirstPartyTypeKind.ZodPromise,\n ...processCreateParams(params),\n });\n};\nclass ZodEffects extends ZodType {\n innerType() {\n return this._def.schema;\n }\n sourceType() {\n return this._def.schema._def.typeName === ZodFirstPartyTypeKind.ZodEffects\n ? this._def.schema.sourceType()\n : this._def.schema;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const effect = this._def.effect || null;\n const checkCtx = {\n addIssue: (arg) => {\n addIssueToContext(ctx, arg);\n if (arg.fatal) {\n status.abort();\n }\n else {\n status.dirty();\n }\n },\n get path() {\n return ctx.path;\n },\n };\n checkCtx.addIssue = checkCtx.addIssue.bind(checkCtx);\n if (effect.type === \"preprocess\") {\n const processed = effect.transform(ctx.data, checkCtx);\n if (ctx.common.async) {\n return Promise.resolve(processed).then(async (processed) => {\n if (status.value === \"aborted\")\n return INVALID;\n const result = await this._def.schema._parseAsync({\n data: processed,\n path: ctx.path,\n parent: ctx,\n });\n if (result.status === \"aborted\")\n return INVALID;\n if (result.status === \"dirty\")\n return DIRTY(result.value);\n if (status.value === \"dirty\")\n return DIRTY(result.value);\n return result;\n });\n }\n else {\n if (status.value === \"aborted\")\n return INVALID;\n const result = this._def.schema._parseSync({\n data: processed,\n path: ctx.path,\n parent: ctx,\n });\n if (result.status === \"aborted\")\n return INVALID;\n if (result.status === \"dirty\")\n return DIRTY(result.value);\n if (status.value === \"dirty\")\n return DIRTY(result.value);\n return result;\n }\n }\n if (effect.type === \"refinement\") {\n const executeRefinement = (acc) => {\n const result = effect.refinement(acc, checkCtx);\n if (ctx.common.async) {\n return Promise.resolve(result);\n }\n if (result instanceof Promise) {\n throw new Error(\"Async refinement encountered during synchronous parse operation. Use .parseAsync instead.\");\n }\n return acc;\n };\n if (ctx.common.async === false) {\n const inner = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inner.status === \"aborted\")\n return INVALID;\n if (inner.status === \"dirty\")\n status.dirty();\n // return value is ignored\n executeRefinement(inner.value);\n return { status: status.value, value: inner.value };\n }\n else {\n return this._def.schema\n ._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx })\n .then((inner) => {\n if (inner.status === \"aborted\")\n return INVALID;\n if (inner.status === \"dirty\")\n status.dirty();\n return executeRefinement(inner.value).then(() => {\n return { status: status.value, value: inner.value };\n });\n });\n }\n }\n if (effect.type === \"transform\") {\n if (ctx.common.async === false) {\n const base = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (!isValid(base))\n return base;\n const result = effect.transform(base.value, checkCtx);\n if (result instanceof Promise) {\n throw new Error(`Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.`);\n }\n return { status: status.value, value: result };\n }\n else {\n return this._def.schema\n ._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx })\n .then((base) => {\n if (!isValid(base))\n return base;\n return Promise.resolve(effect.transform(base.value, checkCtx)).then((result) => ({ status: status.value, value: result }));\n });\n }\n }\n util.assertNever(effect);\n }\n}\nZodEffects.create = (schema, effect, params) => {\n return new ZodEffects({\n schema,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect,\n ...processCreateParams(params),\n });\n};\nZodEffects.createWithPreprocess = (preprocess, schema, params) => {\n return new ZodEffects({\n schema,\n effect: { type: \"preprocess\", transform: preprocess },\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n ...processCreateParams(params),\n });\n};\nclass ZodOptional extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.undefined) {\n return OK(undefined);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodOptional.create = (type, params) => {\n return new ZodOptional({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodOptional,\n ...processCreateParams(params),\n });\n};\nclass ZodNullable extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.null) {\n return OK(null);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodNullable.create = (type, params) => {\n return new ZodNullable({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodNullable,\n ...processCreateParams(params),\n });\n};\nclass ZodDefault extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n let data = ctx.data;\n if (ctx.parsedType === ZodParsedType.undefined) {\n data = this._def.defaultValue();\n }\n return this._def.innerType._parse({\n data,\n path: ctx.path,\n parent: ctx,\n });\n }\n removeDefault() {\n return this._def.innerType;\n }\n}\nZodDefault.create = (type, params) => {\n return new ZodDefault({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodDefault,\n defaultValue: typeof params.default === \"function\"\n ? params.default\n : () => params.default,\n ...processCreateParams(params),\n });\n};\nclass ZodCatch extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n // newCtx is used to not collect issues from inner types in ctx\n const newCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n };\n const result = this._def.innerType._parse({\n data: newCtx.data,\n path: newCtx.path,\n parent: {\n ...newCtx,\n },\n });\n if (isAsync(result)) {\n return result.then((result) => {\n return {\n status: \"valid\",\n value: result.status === \"valid\"\n ? result.value\n : this._def.catchValue({\n get error() {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data,\n }),\n };\n });\n }\n else {\n return {\n status: \"valid\",\n value: result.status === \"valid\"\n ? result.value\n : this._def.catchValue({\n get error() {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data,\n }),\n };\n }\n }\n removeCatch() {\n return this._def.innerType;\n }\n}\nZodCatch.create = (type, params) => {\n return new ZodCatch({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodCatch,\n catchValue: typeof params.catch === \"function\" ? params.catch : () => params.catch,\n ...processCreateParams(params),\n });\n};\nclass ZodNaN extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.nan) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.nan,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return { status: \"valid\", value: input.data };\n }\n}\nZodNaN.create = (params) => {\n return new ZodNaN({\n typeName: ZodFirstPartyTypeKind.ZodNaN,\n ...processCreateParams(params),\n });\n};\nconst BRAND = Symbol(\"zod_brand\");\nclass ZodBranded extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const data = ctx.data;\n return this._def.type._parse({\n data,\n path: ctx.path,\n parent: ctx,\n });\n }\n unwrap() {\n return this._def.type;\n }\n}\nclass ZodPipeline extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.common.async) {\n const handleAsync = async () => {\n const inResult = await this._def.in._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inResult.status === \"aborted\")\n return INVALID;\n if (inResult.status === \"dirty\") {\n status.dirty();\n return DIRTY(inResult.value);\n }\n else {\n return this._def.out._parseAsync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx,\n });\n }\n };\n return handleAsync();\n }\n else {\n const inResult = this._def.in._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inResult.status === \"aborted\")\n return INVALID;\n if (inResult.status === \"dirty\") {\n status.dirty();\n return {\n status: \"dirty\",\n value: inResult.value,\n };\n }\n else {\n return this._def.out._parseSync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n }\n static create(a, b) {\n return new ZodPipeline({\n in: a,\n out: b,\n typeName: ZodFirstPartyTypeKind.ZodPipeline,\n });\n }\n}\nclass ZodReadonly extends ZodType {\n _parse(input) {\n const result = this._def.innerType._parse(input);\n const freeze = (data) => {\n if (isValid(data)) {\n data.value = Object.freeze(data.value);\n }\n return data;\n };\n return isAsync(result)\n ? result.then((data) => freeze(data))\n : freeze(result);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodReadonly.create = (type, params) => {\n return new ZodReadonly({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodReadonly,\n ...processCreateParams(params),\n });\n};\nfunction custom(check, params = {}, \n/**\n * @deprecated\n *\n * Pass `fatal` into the params object instead:\n *\n * ```ts\n * z.string().custom((val) => val.length > 5, { fatal: false })\n * ```\n *\n */\nfatal) {\n if (check)\n return ZodAny.create().superRefine((data, ctx) => {\n var _a, _b;\n if (!check(data)) {\n const p = typeof params === \"function\"\n ? params(data)\n : typeof params === \"string\"\n ? { message: params }\n : params;\n const _fatal = (_b = (_a = p.fatal) !== null && _a !== void 0 ? _a : fatal) !== null && _b !== void 0 ? _b : true;\n const p2 = typeof p === \"string\" ? { message: p } : p;\n ctx.addIssue({ code: \"custom\", ...p2, fatal: _fatal });\n }\n });\n return ZodAny.create();\n}\nconst late = {\n object: ZodObject.lazycreate,\n};\nvar ZodFirstPartyTypeKind;\n(function (ZodFirstPartyTypeKind) {\n ZodFirstPartyTypeKind[\"ZodString\"] = \"ZodString\";\n ZodFirstPartyTypeKind[\"ZodNumber\"] = \"ZodNumber\";\n ZodFirstPartyTypeKind[\"ZodNaN\"] = \"ZodNaN\";\n ZodFirstPartyTypeKind[\"ZodBigInt\"] = \"ZodBigInt\";\n ZodFirstPartyTypeKind[\"ZodBoolean\"] = \"ZodBoolean\";\n ZodFirstPartyTypeKind[\"ZodDate\"] = \"ZodDate\";\n ZodFirstPartyTypeKind[\"ZodSymbol\"] = \"ZodSymbol\";\n ZodFirstPartyTypeKind[\"ZodUndefined\"] = \"ZodUndefined\";\n ZodFirstPartyTypeKind[\"ZodNull\"] = \"ZodNull\";\n ZodFirstPartyTypeKind[\"ZodAny\"] = \"ZodAny\";\n ZodFirstPartyTypeKind[\"ZodUnknown\"] = \"ZodUnknown\";\n ZodFirstPartyTypeKind[\"ZodNever\"] = \"ZodNever\";\n ZodFirstPartyTypeKind[\"ZodVoid\"] = \"ZodVoid\";\n ZodFirstPartyTypeKind[\"ZodArray\"] = \"ZodArray\";\n ZodFirstPartyTypeKind[\"ZodObject\"] = \"ZodObject\";\n ZodFirstPartyTypeKind[\"ZodUnion\"] = \"ZodUnion\";\n ZodFirstPartyTypeKind[\"ZodDiscriminatedUnion\"] = \"ZodDiscriminatedUnion\";\n ZodFirstPartyTypeKind[\"ZodIntersection\"] = \"ZodIntersection\";\n ZodFirstPartyTypeKind[\"ZodTuple\"] = \"ZodTuple\";\n ZodFirstPartyTypeKind[\"ZodRecord\"] = \"ZodRecord\";\n ZodFirstPartyTypeKind[\"ZodMap\"] = \"ZodMap\";\n ZodFirstPartyTypeKind[\"ZodSet\"] = \"ZodSet\";\n ZodFirstPartyTypeKind[\"ZodFunction\"] = \"ZodFunction\";\n ZodFirstPartyTypeKind[\"ZodLazy\"] = \"ZodLazy\";\n ZodFirstPartyTypeKind[\"ZodLiteral\"] = \"ZodLiteral\";\n ZodFirstPartyTypeKind[\"ZodEnum\"] = \"ZodEnum\";\n ZodFirstPartyTypeKind[\"ZodEffects\"] = \"ZodEffects\";\n ZodFirstPartyTypeKind[\"ZodNativeEnum\"] = \"ZodNativeEnum\";\n ZodFirstPartyTypeKind[\"ZodOptional\"] = \"ZodOptional\";\n ZodFirstPartyTypeKind[\"ZodNullable\"] = \"ZodNullable\";\n ZodFirstPartyTypeKind[\"ZodDefault\"] = \"ZodDefault\";\n ZodFirstPartyTypeKind[\"ZodCatch\"] = \"ZodCatch\";\n ZodFirstPartyTypeKind[\"ZodPromise\"] = \"ZodPromise\";\n ZodFirstPartyTypeKind[\"ZodBranded\"] = \"ZodBranded\";\n ZodFirstPartyTypeKind[\"ZodPipeline\"] = \"ZodPipeline\";\n ZodFirstPartyTypeKind[\"ZodReadonly\"] = \"ZodReadonly\";\n})(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {}));\nconst instanceOfType = (\n// const instanceOfType = any>(\ncls, params = {\n message: `Input not instance of ${cls.name}`,\n}) => custom((data) => data instanceof cls, params);\nconst stringType = ZodString.create;\nconst numberType = ZodNumber.create;\nconst nanType = ZodNaN.create;\nconst bigIntType = ZodBigInt.create;\nconst booleanType = ZodBoolean.create;\nconst dateType = ZodDate.create;\nconst symbolType = ZodSymbol.create;\nconst undefinedType = ZodUndefined.create;\nconst nullType = ZodNull.create;\nconst anyType = ZodAny.create;\nconst unknownType = ZodUnknown.create;\nconst neverType = ZodNever.create;\nconst voidType = ZodVoid.create;\nconst arrayType = ZodArray.create;\nconst objectType = ZodObject.create;\nconst strictObjectType = ZodObject.strictCreate;\nconst unionType = ZodUnion.create;\nconst discriminatedUnionType = ZodDiscriminatedUnion.create;\nconst intersectionType = ZodIntersection.create;\nconst tupleType = ZodTuple.create;\nconst recordType = ZodRecord.create;\nconst mapType = ZodMap.create;\nconst setType = ZodSet.create;\nconst functionType = ZodFunction.create;\nconst lazyType = ZodLazy.create;\nconst literalType = ZodLiteral.create;\nconst enumType = ZodEnum.create;\nconst nativeEnumType = ZodNativeEnum.create;\nconst promiseType = ZodPromise.create;\nconst effectsType = ZodEffects.create;\nconst optionalType = ZodOptional.create;\nconst nullableType = ZodNullable.create;\nconst preprocessType = ZodEffects.createWithPreprocess;\nconst pipelineType = ZodPipeline.create;\nconst ostring = () => stringType().optional();\nconst onumber = () => numberType().optional();\nconst oboolean = () => booleanType().optional();\nconst coerce = {\n string: ((arg) => ZodString.create({ ...arg, coerce: true })),\n number: ((arg) => ZodNumber.create({ ...arg, coerce: true })),\n boolean: ((arg) => ZodBoolean.create({\n ...arg,\n coerce: true,\n })),\n bigint: ((arg) => ZodBigInt.create({ ...arg, coerce: true })),\n date: ((arg) => ZodDate.create({ ...arg, coerce: true })),\n};\nconst NEVER = INVALID;\n\nvar z = /*#__PURE__*/Object.freeze({\n __proto__: null,\n defaultErrorMap: errorMap,\n setErrorMap: setErrorMap,\n getErrorMap: getErrorMap,\n makeIssue: makeIssue,\n EMPTY_PATH: EMPTY_PATH,\n addIssueToContext: addIssueToContext,\n ParseStatus: ParseStatus,\n INVALID: INVALID,\n DIRTY: DIRTY,\n OK: OK,\n isAborted: isAborted,\n isDirty: isDirty,\n isValid: isValid,\n isAsync: isAsync,\n get util () { return util; },\n get objectUtil () { return objectUtil; },\n ZodParsedType: ZodParsedType,\n getParsedType: getParsedType,\n ZodType: ZodType,\n datetimeRegex: datetimeRegex,\n ZodString: ZodString,\n ZodNumber: ZodNumber,\n ZodBigInt: ZodBigInt,\n ZodBoolean: ZodBoolean,\n ZodDate: ZodDate,\n ZodSymbol: ZodSymbol,\n ZodUndefined: ZodUndefined,\n ZodNull: ZodNull,\n ZodAny: ZodAny,\n ZodUnknown: ZodUnknown,\n ZodNever: ZodNever,\n ZodVoid: ZodVoid,\n ZodArray: ZodArray,\n ZodObject: ZodObject,\n ZodUnion: ZodUnion,\n ZodDiscriminatedUnion: ZodDiscriminatedUnion,\n ZodIntersection: ZodIntersection,\n ZodTuple: ZodTuple,\n ZodRecord: ZodRecord,\n ZodMap: ZodMap,\n ZodSet: ZodSet,\n ZodFunction: ZodFunction,\n ZodLazy: ZodLazy,\n ZodLiteral: ZodLiteral,\n ZodEnum: ZodEnum,\n ZodNativeEnum: ZodNativeEnum,\n ZodPromise: ZodPromise,\n ZodEffects: ZodEffects,\n ZodTransformer: ZodEffects,\n ZodOptional: ZodOptional,\n ZodNullable: ZodNullable,\n ZodDefault: ZodDefault,\n ZodCatch: ZodCatch,\n ZodNaN: ZodNaN,\n BRAND: BRAND,\n ZodBranded: ZodBranded,\n ZodPipeline: ZodPipeline,\n ZodReadonly: ZodReadonly,\n custom: custom,\n Schema: ZodType,\n ZodSchema: ZodType,\n late: late,\n get ZodFirstPartyTypeKind () { return ZodFirstPartyTypeKind; },\n coerce: coerce,\n any: anyType,\n array: arrayType,\n bigint: bigIntType,\n boolean: booleanType,\n date: dateType,\n discriminatedUnion: discriminatedUnionType,\n effect: effectsType,\n 'enum': enumType,\n 'function': functionType,\n 'instanceof': instanceOfType,\n intersection: intersectionType,\n lazy: lazyType,\n literal: literalType,\n map: mapType,\n nan: nanType,\n nativeEnum: nativeEnumType,\n never: neverType,\n 'null': nullType,\n nullable: nullableType,\n number: numberType,\n object: objectType,\n oboolean: oboolean,\n onumber: onumber,\n optional: optionalType,\n ostring: ostring,\n pipeline: pipelineType,\n preprocess: preprocessType,\n promise: promiseType,\n record: recordType,\n set: setType,\n strictObject: strictObjectType,\n string: stringType,\n symbol: symbolType,\n transformer: effectsType,\n tuple: tupleType,\n 'undefined': undefinedType,\n union: unionType,\n unknown: unknownType,\n 'void': voidType,\n NEVER: NEVER,\n ZodIssueCode: ZodIssueCode,\n quotelessJson: quotelessJson,\n ZodError: ZodError\n});\n\nexport { BRAND, DIRTY, EMPTY_PATH, INVALID, NEVER, OK, ParseStatus, ZodType as Schema, ZodAny, ZodArray, ZodBigInt, ZodBoolean, ZodBranded, ZodCatch, ZodDate, ZodDefault, ZodDiscriminatedUnion, ZodEffects, ZodEnum, ZodError, ZodFirstPartyTypeKind, ZodFunction, ZodIntersection, ZodIssueCode, ZodLazy, ZodLiteral, ZodMap, ZodNaN, ZodNativeEnum, ZodNever, ZodNull, ZodNullable, ZodNumber, ZodObject, ZodOptional, ZodParsedType, ZodPipeline, ZodPromise, ZodReadonly, ZodRecord, ZodType as ZodSchema, ZodSet, ZodString, ZodSymbol, ZodEffects as ZodTransformer, ZodTuple, ZodType, ZodUndefined, ZodUnion, ZodUnknown, ZodVoid, addIssueToContext, anyType as any, arrayType as array, bigIntType as bigint, booleanType as boolean, coerce, custom, dateType as date, datetimeRegex, z as default, errorMap as defaultErrorMap, discriminatedUnionType as discriminatedUnion, effectsType as effect, enumType as enum, functionType as function, getErrorMap, getParsedType, instanceOfType as instanceof, intersectionType as intersection, isAborted, isAsync, isDirty, isValid, late, lazyType as lazy, literalType as literal, makeIssue, mapType as map, nanType as nan, nativeEnumType as nativeEnum, neverType as never, nullType as null, nullableType as nullable, numberType as number, objectType as object, objectUtil, oboolean, onumber, optionalType as optional, ostring, pipelineType as pipeline, preprocessType as preprocess, promiseType as promise, quotelessJson, recordType as record, setType as set, setErrorMap, strictObjectType as strictObject, stringType as string, symbolType as symbol, effectsType as transformer, tupleType as tuple, undefinedType as undefined, unionType as union, unknownType as unknown, util, voidType as void, z };\n","import { ImageFiltering, ImageSource, Loader } from \"excalibur\";\nimport { LdtkResource } from '@excalibur-ldtk';\n\nexport const Resources = {\n HeroSpriteSheetPng: new ImageSource('./Solaria Demo Pack Update 03/Solaria Demo Pack Update 03/16x16/Sprites/Hero 01.png'),\n LdtkResource: new LdtkResource('./spacing-padding/spacing-padding.ldtk', {\n useTilemapCameraStrategy: true,\n useMapBackgroundColor: true,\n }),\n LdtkAutoTile: new LdtkResource('./autotile/autotile.ldtk', {\n useMapBackgroundColor: true,\n }),\n LdtkPureAutoTile: new LdtkResource('./dsml1/dsml1.ldtk', {\n useMapBackgroundColor: true,\n })\n} as const;\n\n\nexport const loader = new Loader();\nfor (let resource of Object.values(Resources)) {\n loader.addResource(resource);\n}","import { Actor, Entity, Vector, vec } from \"excalibur\";\nimport { LdtkResource } from \"./ldtk-resource\";\nimport { LdtkEntityInstance, LdtkLayerInstance } from \"./types\";\nimport { Level } from \"./level\";\n\nexport class EntityLayer {\n public worldPos: Vector;\n public offset: Vector;\n public entities: Entity[] = [];\n public ldtkToEntity = new Map();\n public entityToLdtk = new Map();\n\n constructor(\n level: Level,\n public readonly ldtkLayer: LdtkLayerInstance,\n private resource: LdtkResource,\n public readonly order: number) {\n this.worldPos = vec(level.ldtkLevel.worldX, level.ldtkLevel.worldY);\n this.offset = vec(ldtkLayer.__pxTotalOffsetX, ldtkLayer.__pxTotalOffsetY);\n console.log(\"yo\");\n }\n\n runFactories() {\n const ldtkLayer = this.ldtkLayer;\n const resource = this.resource;\n const order = this.order;\n if (ldtkLayer.entityInstances) {\n for (let entity of ldtkLayer.entityInstances) {\n const entityMetadata = resource.projectMetadata.defs.entities.find(e => {\n return e.identifier === entity.__identifier\n });\n if (resource.factories.has(entity.__identifier)) {\n const factory = resource.factories.get(entity.__identifier);\n if (factory) {\n const newEntity = factory({\n type: entity.__identifier,\n worldPos: vec(entity.px[0], entity.px[1]).add(this.worldPos.add(this.offset)),\n entity,\n definition: entityMetadata,\n layer: this,\n });\n if (newEntity) {\n this.entities.push(newEntity);\n this.ldtkToEntity.set(entity, newEntity);\n this.entityToLdtk.set(newEntity, entity);\n }\n }\n } else {\n if (entity.__tile) {\n const actor = new Actor({\n name: entity.__identifier,\n pos: vec(entity.px[0], entity.px[1]).add(this.worldPos.add(this.offset)),\n width: entity.width,\n height: entity.height,\n anchor: vec(entityMetadata?.pivotX ?? 0, entityMetadata?.pivotY ?? 0),\n z: order\n });\n const ts = resource.tilesets.get(entity.__tile.tilesetUid);\n if (ts) {\n const tsxCoord = Math.floor(entity.__tile.x / entity.__tile.w);\n const tsyCoord = Math.floor(entity.__tile.y / entity.__tile.h);\n const sprite = ts.spritesheet.getSprite(tsxCoord, tsyCoord);\n if (sprite) {\n actor.graphics.use(sprite);\n }\n }\n\n this.entities.push(actor);\n this.ldtkToEntity.set(entity, actor);\n this.entityToLdtk.set(actor, entity);\n }\n }\n }\n }\n\n // for (let entity of this.ldtkLayer.entityInstances) {\n // const factory = this.resource.factories.get(entity.__identifier);\n // if (!factory) { continue }\n //\n // const entityMetadata = this.resource.projectMetadata.defs.entities.find(e => {\n // return e.identifier === entity.__identifier\n // });\n //\n // const newEntity = factory({\n // type: entity.__identifier,\n // worldPos: vec(entity.px[0], entity.px[1]).add(this.worldPos.add(this.offset)),\n // entity,\n // definition: entityMetadata,\n // layer: this,\n // });\n //\n // if (newEntity) {\n // // remove pre-existing entity (e.g. the default actor created for the entity placement)\n // const preExisting = this.ldtkToEntity.get(entity);\n // if (preExisting) {\n // const index = this.entities.indexOf(preExisting);\n // if (index > -1) {\n // this.entities.splice(index, 1);\n // this.ldtkToEntity.delete(entity);\n // this.entityToLdtk.delete(preExisting);\n // }\n // }\n //\n // this.entities.push(newEntity);\n // this.ldtkToEntity.set(entity, newEntity);\n // this.entityToLdtk.set(newEntity, entity);\n // }\n // }\n }\n\n\n getEntitiesByIdentifier(identifier: string): Entity[] {\n const ldtkEntities = this.getLdtkEntitiesByIdentifier(identifier);\n let results: Entity[] = [];\n for (const ldtk of ldtkEntities) {\n const maybeEntity = this.ldtkToEntity.get(ldtk);\n if (maybeEntity) {\n results.push(maybeEntity);\n }\n }\n return results;\n }\n\n getEntitiesByField(fieldIdentifier: string, value?: any): Entity[] {\n const ldtkEntities = this.getLdtkEntitiesByField(fieldIdentifier, value);\n let results: Entity[] = [];\n for (const ldtk of ldtkEntities) {\n const maybeEntity = this.ldtkToEntity.get(ldtk);\n if (maybeEntity) {\n results.push(maybeEntity);\n }\n }\n return results;\n }\n\n /**\n * Search layer for entities that match an identifier (case insensitive)\n * @param identifier \n * @returns \n */\n getLdtkEntitiesByIdentifier(identifier: string): LdtkEntityInstance[] {\n return this.ldtkLayer.entityInstances.filter(e => e.__identifier.toLocaleLowerCase() === identifier.toLowerCase());\n }\n\n /**\n * Search layer for entities that match a field and optionally a value (both case insensitive)\n * @param fieldIdentifier \n * @param value\n */\n getLdtkEntitiesByField(fieldIdentifier: string, value?: any): LdtkEntityInstance[] {\n return this.ldtkLayer.entityInstances.filter(e => {\n if (value !== undefined) {\n let normalizedValue = value;\n if (typeof value === 'string') {\n normalizedValue = value.toLocaleLowerCase();\n }\n\n const field = e.fieldInstances.find(f => f.__identifier.toLocaleLowerCase() === fieldIdentifier.toLocaleLowerCase());\n if (field) {\n return field.__value === normalizedValue;\n }\n return false;\n } else {\n return !!e.fieldInstances.find(f => f.__identifier.toLocaleLowerCase() === fieldIdentifier.toLocaleLowerCase());\n }\n });\n }\n}\n","\n\nexport type FileLoader = (path: string, contentType: 'json' | 'xml') => Promise;\n\nexport const FetchLoader: FileLoader = async (path: string, contentType: 'json' | 'xml') => {\n const response = await fetch(path);\n switch(contentType.toLowerCase()) {\n case 'xml': return await response.text();\n case 'json': return await response.json();\n default: return await response.text();\n }\n}","\nexport * from './ldtk-resource';\nexport * from './entity-layer';\nexport * from './file-loader';\nexport * from './intgrid-layer';\nexport * from './level-resource';\nexport * from './level';\nexport * from './loader-cache';\nexport * from './path-util';\nexport * from './tile-layer';\nexport * from './tileset';\nexport * from './types';","import { GraphicsComponent, TileMap, Vector, vec } from \"excalibur\";\nimport { LdtkLayerInstance } from \"./types\";\nimport { LdtkResource } from \"./ldtk-resource\";\nimport { Level } from \"./level\";\nimport { Tileset } from \"./tileset\";\n\nexport class IntGridLayer {\n\n public ldtkLayer: LdtkLayerInstance;\n public worldPos: Vector;\n public offset: Vector;\n public tilemap!: TileMap;\n public tileset?: Tileset;\n\n constructor(level: Level, ldtkLayer: LdtkLayerInstance, resource: LdtkResource, public readonly order: number) {\n this.worldPos = vec(level.ldtkLevel.worldX, level.ldtkLevel.worldY);\n this.offset = vec(ldtkLayer.__pxTotalOffsetX, ldtkLayer.__pxTotalOffsetY);\n this.ldtkLayer = ldtkLayer;\n if (ldtkLayer.intGridCsv.length || ldtkLayer.autoLayerTiles.length) {\n\n const rows = ldtkLayer.__cHei;\n const columns = ldtkLayer.__cWid;\n this.tilemap = new TileMap({\n name: ldtkLayer.__identifier,\n pos: this.worldPos.add(this.offset),\n tileWidth: ldtkLayer.__gridSize,\n tileHeight: ldtkLayer.__gridSize,\n rows,\n columns,\n });\n this.tilemap.z = order;\n const graphics = this.tilemap.get(GraphicsComponent);\n graphics.isVisible = ldtkLayer.visible;\n\n // find the intgrid metadata\n const layerMetadata = resource.projectMetadata.defs.layers.find(l => {\n return ldtkLayer.__identifier === l.identifier;\n });\n\n if (layerMetadata) {\n const solidValue = layerMetadata.intGridValues.find(val => {\n return val?.identifier?.toLocaleLowerCase() === 'solid';\n });\n\n for (let i = 0; i < ldtkLayer.intGridCsv.length; i++) {\n const xCoord = i % columns;\n const yCoord = Math.floor(i / columns);\n const tile = this.tilemap.getTile(xCoord, yCoord);\n if (solidValue && ldtkLayer.intGridCsv[i] === solidValue.value) {\n tile!.solid = true;\n }\n\n // TODO might be a mistake to treat 1 as solid if there isn't a labelled solid\n if (!solidValue && ldtkLayer.intGridCsv[i] === 1) {\n tile!.solid = true;\n }\n }\n\n if (ldtkLayer.__tilesetDefUid) {\n this.tileset = resource.tilesets.get(ldtkLayer.__tilesetDefUid);\n for (let i = 0; i < ldtkLayer.autoLayerTiles.length; i++) {\n const tile = ldtkLayer.autoLayerTiles[i];\n const xCoord = Math.floor(tile.px[0] / ldtkLayer.__gridSize);\n const yCoord = Math.floor(tile.px[1] / ldtkLayer.__gridSize);\n const exTile = this.tilemap.getTile(xCoord, yCoord);\n if (exTile && this.tileset) {\n const tsxCoord = Math.floor((tile.src[0] - (this.tileset.ldtkTileset.padding ?? 0)) / (this.tileset.ldtkTileset.tileGridSize + (this.tileset.ldtkTileset.spacing ?? 0)));\n const tsyCoord = Math.floor((tile.src[1] - (this.tileset.ldtkTileset.padding ?? 0)) / (this.tileset.ldtkTileset.tileGridSize + (this.tileset.ldtkTileset.spacing ?? 0)));\n // Bit 0 toggles x flip\n // Bit 1 toggles 1 flip\n // Examples: f=0 (no flip), f=1 (X flip only), f=2 (Y flip only), f=3 (both flips)\n const flipHorizontal = !!(tile.f & 0b01);\n const flipVertical = !!(tile.f & 0b10);\n let sprite = this.tileset.spritesheet.getSprite(tsxCoord, tsyCoord);\n if (flipHorizontal || flipVertical) {\n sprite = sprite.clone();\n sprite.flipHorizontal = flipHorizontal;\n sprite.flipVertical = flipVertical;\n }\n if (sprite) {\n exTile!.addGraphic(sprite);\n } else {\n console.error('Could not find sprite in LDtk spritesheet at', tsxCoord, tsyCoord);\n }\n }\n }\n }\n }\n }\n }\n}\n","import { TileLayer } from './tile-layer';\nimport { PathMap, pathRelativeToBase } from './path-util';\nimport { FetchLoader, FileLoader } from './file-loader';\nimport { LdtkEntityDefinition, LdtkEntityInstance, LdtkProjectMetadata } from './types';\nimport { compare } from 'compare-versions';\nimport { LoaderCache } from './loader-cache';\nimport { BoundingBox, Entity, ImageSource, Loadable, Scene, TransformComponent, Vector, vec } from 'excalibur';\nimport { LevelResource } from './level-resource';\nimport { Tileset } from './tileset';\nimport { Level } from './level';\nimport { EntityLayer } from './entity-layer';\nimport { IntGridLayer } from './intgrid-layer';\n\nexport interface AddToSceneOptions {\n /**\n * Optionally set the position to place the levels\n * \n * Default is vec(0, 0)\n */\n pos?: Vector;\n /**\n * Optionally add only specific levels to the scene\n * \n * Default includes all levels\n */\n levelFilter?: string[];\n\n /**\n * Optionally use the level world offsets, this is useful if your levels are arranged the way you want them\n * to appear in your game.\n * \n * Default is true\n */\n useLevelOffsets?: boolean;\n}\n\nexport interface FactoryProps {\n /**\n * Excalibur world position\n */\n worldPos: Vector;\n /**\n * LDtk name in UI\n */\n name?: string;\n /**\n * LDtk type in UI\n */\n type: string;\n /**\n * LDtk entity\n */\n entity: LdtkEntityInstance;\n /**\n * LDtk entity metadata\n */\n definition: LdtkEntityDefinition | undefined;\n /**\n * Layer\n */\n layer: EntityLayer;\n}\n\nexport interface LdtkResourceOptions {\n /**\n * Add a starting z index for the layers to use. By default the layers count up from 0.\n *\n * If you'd like to manually override a z-index on a layer use the 'zindex' custom property on a layer.\n */\n startZIndex?: number;\n\n /**\n * Default true. If false, only tilemap will be parsed and displayed, it's up to you to wire up any excalibur behavior.\n * Automatically wires excalibur to the following\n * * Wire up current scene camera\n *\n * Read more at excaliburjs.com!\n */\n useExcaliburWiring?: boolean;\n\n /**\n * Sets excalibur's background color to match the LDtk map\n */\n useMapBackgroundColor?: boolean;\n\n /**\n * The pathMap helps work around odd things bundlers do with static files by providing a way to redirect the original\n * source paths in the LDtk files to new locations.\n *\n * When the LDtk resource comes across something that matches `path`, it will use the output string instead.\n * \n * Example:\n * ```typescript\n * const newResource = new LdtkResource('./example-city.ldtk', {\n * pathMap: [\n * // If the \"path\" is included in the source path, the output will be used\n * { path: 'cone.png', output: '/static/assets/cone.png' },\n * // Regex matching with special [match] in output string that is replaced with the first match from the regex\n * { path: /(.*\\..*$)/, output: '/static/assets/[match]'}\n * ]\n * }\n * ```\n */\n pathMap?: PathMap;\n\n /**\n * Optionally provide a custom file loader implementation instead of using the built in ajax (fetch) loader\n * that takes a path and returns file data\n * \n */\n fileLoader?: FileLoader;\n\n /**\n * By default `true`, means LDtk files must pass the plugins Typed parse pass.\n *\n * If you have something that the LDtk plugin does not expect, you can set this to false and it will do it's best\n * to parse the LDtk source map file.\n */\n strict?: boolean;\n\n /**\n * Plugin will operate in headless mode and skip all graphics related\n * excalibur items including creating ImageSource's for LDtk items.\n *\n * Default false.\n */\n headless?: boolean;\n\n /**\n * Keeps the camera viewport within the bounds of the TileMap, uses the first tile layer's bounds.\n *\n * Defaults true, if false the camera will use the layer bounds to keep the camera from showing the background.\n */\n useTilemapCameraStrategy?: boolean;\n\n /**\n * Configure custom Actor/Entity factory functions to construct Actors/Entities\n * given a LDtk type name\n */\n entityIdentifierFactories?: Record Entity | undefined>;\n}\n\nexport class LdtkResource implements Loadable {\n public static supportedLdtkVersion = \"1.5.3\";\n public projectMetadata!: LdtkProjectMetadata;\n data!: LdtkProjectMetadata;\n\n\n public tilesets = new Map();\n public levels = new Map();\n public levelsByName = new Map();\n public factories = new Map Entity | undefined>();\n public fileLoader: FileLoader = FetchLoader;\n public pathMap: PathMap | undefined;\n\n private _imageLoader = new LoaderCache(ImageSource);\n private _levelLoader = new LoaderCache(LevelResource);\n\n\n public readonly startZIndex: number = 0;\n public readonly textQuality: number = 4;\n public readonly useExcaliburWiring: boolean = true;\n public readonly useMapBackgroundColor: boolean = false;\n public readonly useTilemapCameraStrategy: boolean = false;\n public readonly headless: boolean = false;\n public readonly strict: boolean = true;\n\n constructor(public readonly path: string, options?: LdtkResourceOptions) {\n const {\n useExcaliburWiring,\n useTilemapCameraStrategy,\n entityIdentifierFactories,\n pathMap,\n useMapBackgroundColor,\n fileLoader,\n strict,\n headless,\n startZIndex\n } = { ...options };\n this.strict = strict ?? this.strict;\n this.headless = headless ?? this.headless;\n this.useExcaliburWiring = useExcaliburWiring ?? this.useExcaliburWiring;\n this.useTilemapCameraStrategy = useTilemapCameraStrategy ?? this.useTilemapCameraStrategy;\n this.useMapBackgroundColor = useMapBackgroundColor ?? this.useMapBackgroundColor;\n this.startZIndex = startZIndex ?? this.startZIndex;\n this.fileLoader = fileLoader ?? this.fileLoader;\n this.pathMap = pathMap;\n for (const key in entityIdentifierFactories) {\n this.registerEntityIdentifierFactory(key, entityIdentifierFactories[key]);\n }\n\n }\n async load(): Promise {\n const data = await this.fileLoader(this.path, 'json');\n if (this.strict) {\n try {\n this.projectMetadata = LdtkProjectMetadata.parse(data);\n } catch (e) {\n console.error(`Could not parse LDtk map from location ${this.path}.\\nExcalibur only supports the latest version of LDtk formats as of the plugin's release.`);\n console.error(`Is your map file corrupted or being interpreted as the wrong type?`)\n throw e;\n }\n } else {\n this.projectMetadata = data as LdtkProjectMetadata;\n }\n\n if (compare(LdtkResource.supportedLdtkVersion, this.projectMetadata.jsonVersion ?? '0.0.0', \">\")) {\n console.warn(`The excalibur ldtk plugin officially supports ${LdtkResource.supportedLdtkVersion}+, the current map has LDtk version ${this.projectMetadata.jsonVersion}`)\n }\n\n // iterate through the defs\n // load the tilesets\n const imagesToLoad: Promise[] = [];\n for (let tileset of this.projectMetadata.defs.tilesets) {\n if (tileset.relPath) {\n const imagePath = pathRelativeToBase(this.path, tileset.relPath, this.pathMap);\n const image = this._imageLoader.getOrAdd(imagePath);\n const friendlyTileset = new Tileset({\n image,\n ldtkTileset: tileset\n });\n this.tilesets.set(tileset.uid, friendlyTileset);\n } else {\n if (tileset.identifier !== 'Internal_Icons') {\n console.warn(`No tileset image provided for ${tileset.identifier}`);\n }\n }\n }\n\n // iterate through the levels\n // load the level metadata\n for (let level of this.projectMetadata.levels) {\n if (level.externalRelPath) {\n // external levels\n const levelPath = pathRelativeToBase(this.path, level.externalRelPath, this.pathMap);\n this._levelLoader.getOrAdd(levelPath, this, {\n headless: this.headless,\n strict: this.strict,\n fileLoader: this.fileLoader,\n imageLoader: this._imageLoader,\n pathMap: this.pathMap\n });\n } else {\n // embedded levels\n const friendlyLevel = new Level(level, this);\n this.levels.set(level.uid, friendlyLevel);\n this.levelsByName.set(level.identifier.toLowerCase(), friendlyLevel);\n }\n }\n\n await Promise.all([this._imageLoader.load(), this._levelLoader.load()]);\n this._levelLoader.values().forEach(level => {\n this.levels.set(level.data.ldtkLevel.uid, level.data);\n this.levelsByName.set(level.data.ldtkLevel.identifier.toLowerCase(), level.data);\n });\n\n return this.data = this.projectMetadata;\n };\n\n isLoaded(): boolean {\n return !!this.data;\n }\n\n registerEntityIdentifierFactory(ldtkEntityIdentifier: string, factory: (props: FactoryProps) => Entity | undefined): void {\n this.factories.set(ldtkEntityIdentifier, factory);\n }\n\n registerEntityIdentifierFactories(factories: Record Entity | undefined>): void {\n for (const key in factories) {\n this.registerEntityIdentifierFactory(key, factories[key]);\n }\n }\n\n /**\n * Get a level by identifier\n * @param identifier \n * @returns \n */\n getLevel(identifier: string): Level | undefined {\n return this.levelsByName.get(identifier.toLowerCase());\n }\n\n /**\n * Get the entity layers, optionally provide a level identifier to filter to\n * @param levelIdentifier \n */\n getEntityLayers(levelIdentifier?: string): EntityLayer[] {\n let results: EntityLayer[] = [];\n if (levelIdentifier) {\n const level = this.getLevel(levelIdentifier);\n if (level) {\n for (let layer of level.layers) {\n if (layer instanceof EntityLayer) {\n results.push(layer);\n }\n }\n }\n } else {\n for (const level of this.levels.values()) {\n for (let layer of level.layers) {\n if (layer instanceof EntityLayer) {\n results.push(layer);\n }\n }\n }\n }\n\n return results\n }\n\n getTileLayers(identifier?: string): TileLayer[] {\n let results: TileLayer[] = [];\n if (identifier) {\n const level = this.getLevel(identifier);\n if (level) {\n for (let layer of level.layers) {\n if (layer instanceof TileLayer) {\n results.push(layer);\n }\n }\n }\n } else {\n for (const level of this.levels.values()) {\n for (let layer of level.layers) {\n if (layer instanceof TileLayer) {\n results.push(layer);\n }\n }\n }\n }\n return results;\n }\n\n getIntGridLayers(identifier?: string): IntGridLayer[] {\n let results: IntGridLayer[] = [];\n if (identifier) {\n const level = this.getLevel(identifier);\n if (level) {\n for (let layer of level.layers) {\n if (layer instanceof IntGridLayer) {\n results.push(layer);\n }\n }\n }\n } else {\n for (const level of this.levels.values()) {\n for (let layer of level.layers) {\n if (layer instanceof IntGridLayer) {\n results.push(layer);\n }\n }\n }\n }\n return results;\n }\n\n /**\n * Search layer for entities that match an identifier (case insensitive)\n * @param identifier \n * @returns \n */\n getLdtkEntitiesByIdentifier(identifier: string, levels?: string[]): LdtkEntityInstance[] {\n let results: LdtkEntityInstance[] = [];\n const levelsToSearch = levels ?? Array.from(this.levels.values()).map(l => l.ldtkLevel.identifier);\n for (const level of levelsToSearch) {\n const layers = this.getEntityLayers(level);\n for (let layer of layers) {\n results = results.concat(layer.getLdtkEntitiesByIdentifier(identifier));\n }\n }\n return results;\n }\n\n /**\n * Search levels for ldtk entities that match a field and optionally a value (both case insensitive)\n * @param fieldIdentifier \n * @param value\n */\n getLdtkEntitiesByField(fieldIdentifier: string, value?: any, levels?: string[]): LdtkEntityInstance[] {\n let results: LdtkEntityInstance[] = [];\n const levelsToSearch = levels ?? Array.from(this.levels.values()).map(l => l.ldtkLevel.identifier);\n for (const level of levelsToSearch) {\n const layers = this.getEntityLayers(level);\n for (let layer of layers) {\n results = results.concat(layer.getLdtkEntitiesByField(fieldIdentifier, value));\n }\n }\n return results;\n }\n\n /**\n * Search levels for excalibur entities that match an identifier (case insensitive)\n * @param identifier\n * @param levels\n */\n getEntitiesByIdentifier(identifier: string, levels?: string[]): Entity[] {\n let results: Entity[] = [];\n const levelsToSearch = levels ?? Array.from(this.levels.values()).map(l => l.ldtkLevel.identifier);\n for (const level of levelsToSearch) {\n const layers = this.getEntityLayers(level);\n for (let layer of layers) {\n results = results.concat(layer.getEntitiesByIdentifier(identifier));\n }\n }\n return results;\n }\n\n /**\n * Search levels for excalibur entities that match a field and optionally a value (both case insensitive)\n * @param fieldIdentifier\n * @param value\n * @param levels\n */\n getEntitiesByField(fieldIdentifier: string, value?: any, levels?: string[]): Entity[] {\n let results: Entity[] = [];\n const levelsToSearch = levels ?? Array.from(this.levels.values()).map(l => l.ldtkLevel.identifier);\n for (const level of levelsToSearch) {\n const layers = this.getEntityLayers(level);\n for (let layer of layers) {\n results = results.concat(layer.getEntitiesByField(fieldIdentifier, value));\n }\n }\n return results;\n }\n\n /**\n * Get the level bounds given a list of level identifiers (case insensitive)\n * @param levels\n */\n getLevelBounds(levels?: string[]): BoundingBox {\n levels = levels ?? Array.from(this.levelsByName.keys());\n let bounds: BoundingBox | null = null;\n for (const level of this.levels.values()) {\n if (!levels.includes(level.ldtkLevel.identifier)) {\n continue;\n }\n const firstTileLayer = this.getTileLayers(level.ldtkLevel.identifier)[0];\n if (firstTileLayer) {\n const tileBounds = BoundingBox.fromDimension(\n firstTileLayer.tilemap.tileWidth * firstTileLayer.tilemap.columns,\n firstTileLayer.tilemap.tileHeight * firstTileLayer.tilemap.rows,\n Vector.Zero,\n firstTileLayer.tilemap.pos);\n if (!bounds) {\n bounds = tileBounds;\n } else {\n bounds = bounds.combine(tileBounds);\n }\n }\n }\n return bounds ?? new BoundingBox();\n }\n\n addToScene(scene: Scene, options?: AddToSceneOptions) {\n const { pos, useLevelOffsets } = {pos: vec(0, 0), useLevelOffsets: true, ...options};\n\n for (let [id, level] of this.levels.entries()) {\n if (options?.levelFilter?.length) {\n if (!options.levelFilter.includes(level.ldtkLevel.identifier)) {\n continue;\n }\n }\n for (let layer of level.layers) {\n if (layer instanceof TileLayer || layer instanceof IntGridLayer) {\n layer.tilemap.pos = layer.tilemap.pos.add(pos);\n if (!useLevelOffsets) {\n layer.tilemap.pos = layer.tilemap.pos.sub(layer.worldPos);\n }\n scene.add(layer.tilemap)\n } else {\n layer.runFactories()\n for (let entity of layer.entities) {\n const tx = entity.get(TransformComponent);\n if (tx) {\n tx.pos = tx.pos.add(pos);\n if (!useLevelOffsets) {\n tx.pos = tx.pos.sub(layer.worldPos);\n }\n }\n scene.add(entity);\n }\n }\n }\n }\n\n if(this.useExcaliburWiring) {\n const camera = this.getLdtkEntitiesByField('camera', true)[0];\n if (camera) {\n scene.camera.pos = vec(camera.px[0], camera.px[0]);\n const zoom = camera.fieldInstances.find(f => f.__identifier.toLocaleLowerCase() === 'zoom');\n if (zoom) {\n scene.camera.zoom = +zoom.__value;\n }\n }\n }\n\n if (this.useTilemapCameraStrategy) {\n let bounds = this.getLevelBounds(options?.levelFilter);\n scene.camera.strategy.limitCameraBounds(bounds);\n }\n\n if (this.useMapBackgroundColor) {\n for (let [id, level] of this.levels.entries()) {\n if (options?.levelFilter?.length) {\n if (!options.levelFilter.includes(level.ldtkLevel.identifier)) {\n continue;\n }\n }\n scene.backgroundColor = level.backgroundColor;\n break;\n }\n }\n\n\n }\n}\n","import { ImageSource, Loadable } from \"excalibur\";\nimport { PathMap } from \"./path-util\";\nimport { LoaderCache } from \"./loader-cache\";\nimport { FetchLoader, FileLoader } from \"./file-loader\";\nimport { Level } from \"./level\";\nimport { LdtkLevel } from \"./types\";\nimport { LdtkResource } from \"./ldtk-resource\";\n\nexport interface LevelResourceOptions {\n headless?: boolean;\n strict?: boolean;\n fileLoader?: FileLoader;\n imageLoader?: LoaderCache;\n pathMap?: PathMap;\n}\n\n/**\n * Loads LDtk levels that are stored in separate files\n */\nexport class LevelResource implements Loadable {\n private fileLoader: FileLoader = FetchLoader;\n private imageLoader: LoaderCache;\n private pathMap?: PathMap;\n public readonly strict: boolean = true;\n public readonly headless: boolean = false;\n constructor(public readonly path: string, public readonly resource: LdtkResource, options?: LevelResourceOptions) {\n const { headless, strict, fileLoader, imageLoader, pathMap } = { ...options };\n this.fileLoader = fileLoader ?? this.fileLoader;\n this.strict = strict ?? this.strict;\n this.headless = headless ?? this.headless;\n this.imageLoader = imageLoader ?? new LoaderCache(ImageSource);\n this.pathMap = pathMap ?? this.pathMap;\n }\n data!: Level;\n async load(): Promise {\n const data = await this.fileLoader(this.path, 'json');\n let level: LdtkLevel;\n if (this.strict) {\n try {\n level = LdtkLevel.parse(data)\n } catch (e) {\n console.error(`Could not parse LDtk level data at ${this.path} are you sure a level is there and not corrupt?`);\n throw e;\n }\n } else {\n level = data as LdtkLevel;\n }\n return this.data = new Level(level, this.resource);\n }\n isLoaded(): boolean {\n return !!this.data;\n }\n\n}","import { Color } from \"excalibur\";\nimport { EntityLayer } from \"./entity-layer\";\nimport { IntGridLayer } from \"./intgrid-layer\";\nimport { LdtkResource } from \"./ldtk-resource\";\nimport { TileLayer } from \"./tile-layer\";\nimport { LdtkLevel } from \"./types\";\n\nexport class Level {\n\n public backgroundColor?: Color;\n public layers: (TileLayer | IntGridLayer | EntityLayer)[] = []; \n\n constructor(public ldtkLevel: LdtkLevel, public resource: LdtkResource) {\n if (ldtkLevel.__bgColor) {\n this.backgroundColor = Color.fromHex(ldtkLevel.__bgColor);\n }\n if (ldtkLevel.layerInstances) {\n let order = resource.startZIndex;\n let layers = ldtkLevel.layerInstances.slice().reverse();\n for (let layer of layers) {\n if (layer.entityInstances?.length !== 0) {\n this.layers.push(new EntityLayer(this, layer, resource, order));\n }\n\n if (layer.gridTiles?.length !== 0) {\n this.layers.push(new TileLayer(this, layer, resource, order));\n }\n\n // Includes standard IntGrid, IntGrid w/ AutoTile & AutoTile layers\n if (layer.intGridCsv?.length !== 0 || layer.autoLayerTiles?.length !== 0) {\n this.layers.push(new IntGridLayer(this, layer, resource, order));\n }\n order++;\n }\n }\n }\n}","export interface CanLoad {\n load(): Promise;\n }\n \n /**\n * Read through cache for loadables\n */\n export class LoaderCache {\n private _loaded = false;\n cache = new Map();\n \n constructor(public readonly type: new (...args: any[]) => T){}\n \n getOrAdd(...args: any[]): T {\n let resource = this.cache.get(args.join('+'));\n if (resource) {\n return resource;\n }\n \n resource = new this.type(...args);\n this.cache.set(args.join('+'), resource);\n return resource;\n }\n \n values(): T[] {\n if (this._loaded) {\n return Array.from(this.cache.values());\n }\n throw new Error(`Read through cache not yet loaded! No values to return!`);\n }\n \n async load() {\n const resources = Array.from(this.cache.entries());\n const results = await Promise.allSettled(resources.map(i => i[1].load()));\n \n // Check for errors loading resources\n let errored = 0;\n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n if (result.status === 'rejected') {\n console.error(`Error loading resource at ${resources[i][0]}, is your pathMap correct? or your LDtk map corrupted?`, result.reason);\n errored++;\n }\n }\n if (errored) {\n throw new Error(`Error loading ${errored} resources`);\n }\n this._loaded = true;\n }\n }","\n\nexport type PathMap = { path: string | RegExp, output: string }[];\n\nexport function filenameFromPath(inputPath: string): string {\n const filenameExpression = /[^/\\\\&\\?]+\\.\\w{2,4}(?=([\\#\\?&].*$|$))/ig\n\n const matches = inputPath.match(filenameExpression);\n\n if (matches) {\n const match = matches[0];\n return match;\n }\n\n throw new Error(`Could not locate filename from path: ${inputPath}`);\n}\n\nexport function mapPath(inputPath: string, pathMap: PathMap): string {\n\n for (const { path, output } of pathMap) {\n if (typeof path === 'string') {\n if (inputPath.includes(path)) {\n return output;\n }\n } else {\n const match = inputPath.match(path);\n if (match) {\n return output.replace('[match]', match[0]);;\n }\n }\n }\n return inputPath;\n}\n\nexport function pathInMap(inputPath: string, pathMap?: PathMap): boolean {\n if (!pathMap) return false;\n for (const { path, output } of pathMap) {\n if (typeof path === 'string') {\n if (inputPath.includes(path)) {\n return true;\n }\n } else {\n const match = inputPath.match(path);\n if (match) {\n return true;\n }\n }\n }\n return false;\n}\n\n\nexport function pathRelativeToBase(basePath: string, relativeToBase: string, pathMap?: PathMap) {\n if (pathInMap(relativeToBase, pathMap) && pathMap) {\n return mapPath(relativeToBase, pathMap);\n }\n\n // Use absolute path if specified\n if (relativeToBase.indexOf('/') === 0) {\n return relativeToBase;\n }\n\n const originSplit = basePath.split('/');\n const relativeSplit = relativeToBase.split('/');\n // if origin path is a file, remove it so it's a directory\n if (originSplit[originSplit.length - 1].includes('.')) {\n originSplit.pop();\n }\n return originSplit.concat(relativeSplit).join('/');\n}","import { GraphicsComponent, TileMap, Vector, vec } from \"excalibur\";\nimport { LdtkResource } from \"./ldtk-resource\";\nimport { LdtkLayerInstance } from \"./types\";\nimport { Level } from \"./level\";\nimport { Tileset } from \"./tileset\";\n\n\nexport class TileLayer {\n public ldtkLayer: LdtkLayerInstance;\n public worldPos: Vector;\n public offset: Vector;\n public tilemap: TileMap;\n public tileset?: Tileset;\n\n constructor(level: Level, ldtkLayer: LdtkLayerInstance, resource: LdtkResource, public readonly order: number) {\n this.worldPos = vec(level.ldtkLevel.worldX, level.ldtkLevel.worldY);\n this.offset = vec(ldtkLayer.__pxTotalOffsetX, ldtkLayer.__pxTotalOffsetY);\n this.ldtkLayer = ldtkLayer;\n this.tilemap = new TileMap({\n name: ldtkLayer.__identifier,\n pos: this.worldPos.add(this.offset),\n tileWidth: ldtkLayer.__gridSize,\n tileHeight: ldtkLayer.__gridSize,\n rows: ldtkLayer.__cHei,\n columns: ldtkLayer.__cWid,\n });\n this.tilemap.z = order;\n const graphics = this.tilemap.get(GraphicsComponent);\n graphics.isVisible = ldtkLayer.visible;\n\n\n if (ldtkLayer.__tilesetDefUid) {\n this.tileset = resource.tilesets.get(ldtkLayer.__tilesetDefUid);\n for (let tile of ldtkLayer.gridTiles) {\n const xCoord = Math.floor(tile.px[0] / ldtkLayer.__gridSize);\n const yCoord = Math.floor(tile.px[1] / ldtkLayer.__gridSize);\n const exTile = this.tilemap.getTile(xCoord, yCoord);\n if (this.tileset) {\n const tsxCoord = Math.floor((tile.src[0] - (this.tileset.ldtkTileset.padding ?? 0)) / (this.tileset.ldtkTileset.tileGridSize + (this.tileset.ldtkTileset.spacing ?? 0)));\n const tsyCoord = Math.floor((tile.src[1] - (this.tileset.ldtkTileset.padding ?? 0)) / (this.tileset.ldtkTileset.tileGridSize + (this.tileset.ldtkTileset.spacing ?? 0)));\n // Bit 0 toggles x flip\n // Bit 1 toggles 1 flip\n // Examples: f=0 (no flip), f=1 (X flip only), f=2 (Y flip only), f=3 (both flips)\n const flipHorizontal = !!(tile.f & 0b01);\n const flipVertical = !!(tile.f & 0b10);\n let sprite = this.tileset.spritesheet.getSprite(tsxCoord, tsyCoord);\n if (flipHorizontal || flipVertical) {\n sprite = sprite.clone();\n sprite.flipHorizontal = flipHorizontal;\n sprite.flipVertical = flipVertical;\n }\n if (sprite) {\n exTile!.addGraphic(sprite);\n } else {\n console.error('Could not find sprite in LDtk spritesheet at', tsxCoord, tsyCoord);\n } \n }\n } \n } else {\n console.error('Could not tileset in LDtk', ldtkLayer.__tilesetDefUid, ldtkLayer.__tilesetRelPath);\n }\n\n }\n}","import { ImageSource, Sprite, SpriteSheet } from \"excalibur\";\nimport { LdtkTilesetDefinition } from \"./types\";\n\nexport interface TilesetOptions {\n image: ImageSource,\n ldtkTileset: LdtkTilesetDefinition\n}\n\nexport class Tileset {\n public readonly image: ImageSource;\n public readonly ldtkTileset: LdtkTilesetDefinition;\n public readonly spritesheet: SpriteSheet;\n constructor(options: TilesetOptions) {\n const {image, ldtkTileset} = options;\n this.image = image;\n this.ldtkTileset = ldtkTileset;\n this.spritesheet = SpriteSheet.fromImageSource({\n image,\n grid: {\n rows: ldtkTileset.pxHei / ldtkTileset.tileGridSize,\n columns: ldtkTileset.pxWid / ldtkTileset.tileGridSize,\n spriteHeight: ldtkTileset.tileGridSize,\n spriteWidth: ldtkTileset.tileGridSize\n },\n spacing: {\n margin: { \n x: ldtkTileset.spacing ?? 0,\n y: ldtkTileset.spacing ?? 0,\n },\n originOffset: {\n x: ldtkTileset.padding ?? 0,\n y: ldtkTileset.padding ?? 0\n }\n }\n });\n }\n}","import { z } from 'zod';\n\n\n\nconst LdtkTilesetRectangle = z.object({\n h: z.number(),\n tilesetUid: z.number(),\n w: z.number(),\n x: z.number(),\n y: z.number()\n});\nconst LdtkPixel = z.tuple([z.number(), z.number()]);\nconst LdtkFieldInstance = z.object({\n __identifier: z.string(),\n __tile: LdtkTilesetRectangle.nullable(),\n __type: z.string(),//z.union([z.literal('Int'), z.literal('Float'), z.literal('String'), z.literal('Bool'), z.literal('Enum')]), // TODO this might not work with ENUM\n __value: z.any(),\n defUid: z.number()\n})\nconst LdtkTileInstance = z.object({\n a: z.number(),\n f: z.number(), // 2-bit int 0bXY flip\n px: LdtkPixel,\n src: LdtkPixel,\n t: z.number()\n});\n\nexport const LdtkEntityInstance = z.object({\n __grid: LdtkPixel,\n __identifier: z.string(),\n __pivot: LdtkPixel,\n __smartColor: z.string(),\n __tags: z.array(z.string()),\n __tile: LdtkTilesetRectangle.nullable(),\n __worldX: z.number().nullable(),\n __worldY: z.number().nullable(),\n defUid: z.number(),\n fieldInstances: z.array(LdtkFieldInstance),\n height: z.number(),\n iid: z.string(),\n px: LdtkPixel,\n width: z.number()\n});\nexport type LdtkEntityInstance = z.infer;\n\nexport const LdtkLayerInstance = z.object({\n __cHei: z.number(),\n __cWid: z.number(),\n __gridSize: z.number(),\n __identifier: z.string(),\n __opacity: z.number(),\n __pxTotalOffsetX: z.number(),\n __pxTotalOffsetY: z.number(),\n __tilesetDefUid: z.number().nullable(),\n __tilesetRelPath:z.string().nullable(),\n __type: z.union([z.literal('IntGrid'), z.literal('Entities'), z.literal('Tiles'), z.literal('AutoLayer')]),\n autoLayerTiles: z.array(LdtkTileInstance), // only in auto layers\n entityInstances: z.array(LdtkEntityInstance),// only in entity layers\n gridTiles: z.array(LdtkTileInstance),\n iid: z.string(),\n intGridCsv: z.array(z.number()), // __cWid x __cHei, 0 means empty, values start at 1\n layerDefUid: z.number(),\n levelId: z.number(),\n overrideTilesetUid: z.number().nullable(),\n pxOffsetX: z.number(),\n pxOffsetY: z.number(),\n visible: z.boolean()\n});\nexport type LdtkLayerInstance = z.infer;\n\nexport const LdtkLevel = z.object({\n __bgColor: z.string().nullable(),\n bgColor: z.string().nullable(),\n __bgPos: z.object({\n cropRect: z.array(z.tuple([z.number(), z.number(), z.number(), z.number()])), // cropX, cropY, cropWidth, cropHeight\n scale: z.tuple([z.number(), z.number()]),\n topLeftPx: LdtkPixel\n }).nullable(),\n __neighbours: z.array(z.object({\n dir: z.union([z.literal('n'), z.literal('s'), z.literal('w'), z.literal('e'), z.literal('ne'), z.literal('nw'), z.literal('se'), z.literal('sw'), z.literal('o'), z.literal('<'), z.literal('>')]),\n levelIid: z.string()\n })),\n bgRelPath: z.string().nullable(),\n externalRelPath: z.string().nullable(),\n fieldInstances: z.array(LdtkFieldInstance),\n identifier: z.string(),\n iid: z.string(),\n layerInstances: z.array(LdtkLayerInstance).nullable(), // null if the save levels separately is enabled\n pxHei: z.number(),\n pxWid: z.number(),\n uid: z.number(),\n worldDepth: z.number(),\n worldX: z.number(),\n worldY: z.number()\n});\nexport type LdtkLevel = z.infer;\n\nconst LdtkWorld = z.object({\n identifier: z.string(),\n iid: z.string(),\n levels: z.array(LdtkLevel),\n worldGridHeight:z.number(),\n worldGridWidth: z.number(),\n // TODO is this a typo Vania?\n worldLayout: z.union([z.literal('Free'), z.literal('GridVania'), z.literal('LinearHorizontal'), z.literal('LinearVertical')]),\n});\nexport type LdtkWorld = z.infer;\n\nconst LdtkEnumValueDefinition = z.object({\n color: z.number(),\n id: z.string(),\n tileRect: LdtkTilesetRectangle.nullable()\n});\n\nconst LdtkEnumDefinition = z.object({\n externalRelPath: z.string().nullable(),\n iconTilesetUid: z.number().nullable(),\n identifier: z.string(),\n tags: z.array(z.string()),\n uid: z.number(),\n values: z.array(LdtkEnumValueDefinition)\n})\n\nexport type LdtkEnumDefinition = z.infer;\n\nconst LdtkTilesetDefinition = z.object({\n __cHei: z.number(),\n __cWid: z.number(),\n customData: z.array(z.object({\n data: z.string(),\n tileId: z.number()\n })),\n embedAtlas: z.string().nullable(),\n enumTags: z.optional(z.array(z.object({\n enumValueId: z.string(),\n tileIds: z.array(z.number())\n }))),\n identifier: z.string(),\n padding: z.number(),\n pxHei: z.number(),\n pxWid: z.number(),\n relPath: z.string().nullable(),\n spacing: z.number(),\n tags: z.array(z.string()),\n tagsSourceEnumUid: z.number().nullable(),\n tileGridSize: z.number(),\n uid: z.number()\n})\nexport type LdtkTilesetDefinition = z.infer;\n\nexport const LdtkLayerDefinition = z.object({\n __type: z.union([z.literal(\"IntGrid\"), z.literal(\"Entities\"), z.literal(\"Tiles\"), z.literal(\"AutoLayer\")]),\n autoSourceLayerDefUid: z.number().nullable(),\n displayOpacity: z.number(),\n gridSize: z.number(),\n identifier: z.string(),\n intGridValues: z.array(z.object({\n color: z.string(),\n groupUid: z.number(),\n identifier: z.string().nullable(),\n tile: LdtkTilesetRectangle.nullable(),\n value: z.number()\n })),\n intGridValuesGroups: z.array(z.object({\n color: z.string().nullable(),\n identifier: z.string().nullable(),\n uid: z.number()\n })),\n parallaxFactorX: z.number(),\n parallaxFactorY: z.number(),\n parallaxScaling: z.boolean(),\n pxOffsetX: z.number(),\n pxOffsetY: z.number(),\n tilesetDefUid: z.number().nullable(),\n uid: z.number(),\n});\nexport type LdtkLayerDefinition = z.infer;\n\nexport const LdtkEntityDefinition = z.object({\n color: z.string(),\n height: z.number(),\n identifier: z.string(),\n nineSliceBorders: z.array(z.number()),\n pivotX: z.number(),\n pivotY: z.number(),\n tileRect: LdtkTilesetRectangle.nullable(),\n tileRenderMode: z.union([\n z.literal(\"Cover\"),\n z.literal(\"FitInside\"),\n z.literal(\"Repeat\"),\n z.literal(\"Stretch\"),\n z.literal(\"FullSizeCropped\"),\n z.literal(\"FullSizeUncropped\"),\n z.literal(\"NineSlice\")\n ]),\n tilesetId: z.number().nullable(),\n uiTileRect: LdtkTilesetRectangle.nullable(),\n uid: z.number(),\n width: z.number()\n});\nexport type LdtkEntityDefinition = z.infer;\n\nconst LdtkDefinitions = z.object({\n tilesets: z.array(LdtkTilesetDefinition),\n enums: z.array(LdtkEnumDefinition),\n layers: z.array(LdtkLayerDefinition),\n entities: z.array(LdtkEntityDefinition)\n})\nexport type LdtkDefinitions = z.infer;\n\nexport const LdtkProjectMetadata = z.object({\n iid: z.string(),\n bgColor: z.string().nullable(),\n defs: LdtkDefinitions,\n externalLevels: z.boolean(),\n jsonVersion: z.string(),\n levels: z.array(LdtkLevel),\n toc: z.array(z.object({\n identifier: z.string(),\n instancesData: z.array(z.object({\n fields: z.any(),\n heiPx: z.number(),\n iids: z.string(),\n widPix: z.number(),\n worldX: z.number(),\n worldY: z.number()\n }))\n })),\n // Moving to worlds array\n worldGridHeight: z.number().nullable(),\n worldGridWidth: z.number().nullable(),\n // TODO is this a LDtk docs typo Vania?\n worldLayout: z.union([z.literal('Free'), z.literal('GridVania'), z.literal('LinearHorizontal'), z.literal('LinearVertical')]).nullable(),\n worlds: z.array(LdtkWorld)\n});\nexport type LdtkProjectMetadata = z.infer;\n\n\n\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","\nimport * as ex from \"excalibur\";\nimport { Player } from './player';\nimport { Resources, loader } from \"./resources\";\nex.Flags.useLegacyImageRenderer();\nconst game = new ex.Engine({\n resolution: {\n width: 256,\n height: 256,\n },\n suppressPlayButton: false,\n pixelArt: true,\n pixelRatio: 4,\n displayMode: ex.DisplayMode.FitScreen,\n});\n\ngame.start(loader).then(() => {\n console.log('Game start!');\n\n Resources.LdtkAutoTile.addToScene(game.currentScene, {\n pos: ex.vec(0, 0)\n });\n});"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/sample/pureautotile/pureautotile.js b/sample/pureautotile/pureautotile.js index 328ebeb..18435d5 100644 --- a/sample/pureautotile/pureautotile.js +++ b/sample/pureautotile/pureautotile.js @@ -570,130 +570,130 @@ __nested_webpack_require_434__.r(__nested_webpack_exports__); var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); // Module -___CSS_LOADER_EXPORT___.push([module.id, `/* Buttons styles start */ - -button#excalibur-play { - display: inline-block; - position: relative; - z-index: 999; - border-radius: 6px; - border: none; - /*border: 3px solid; - border-color: white; - box-shadow: 0 0 10px #ccc;*/ - padding: 1rem 1.5rem 1rem 4rem; - margin: 0; - text-decoration: none; - background: #00b233; - color: #ffffff; - font-family: sans-serif; - font-size: 2rem; - white-space: nowrap; - line-height: 1; - cursor: pointer; - text-align: center; - transition: - background 250ms ease-in-out, - transform 150ms ease; - -webkit-appearance: none; - -moz-appearance: none; - - -webkit-animation: excalibur-button-fadein 200ms; /* Safari, Chrome and Opera > 12.1 */ - -moz-animation: excalibur-button-fadein 200ms; /* Firefox < 16 */ - -ms-animation: excalibur-button-fadein 200ms; /* Internet Explorer */ - -o-animation: excalibur-button-fadein 200ms; /* Opera < 12.1 */ - animation: excalibur-button-fadein 200ms; -} - -/* -button#excalibur-play { - display: none; -}*/ - -button#excalibur-play:after { - position: absolute; - content: ''; - border: 8px solid; - border-color: transparent transparent transparent white; - left: 35px; - top: 24px; - width: 0; - height: 0; -} - -button#excalibur-play:before { - position: absolute; - content: ''; - border: 3px solid; - left: 19px; - top: 14px; - border-radius: 20px; - width: 30px; - height: 30px; -} - -button#excalibur-play:hover, -button#excalibur-play:focus { - background: #00982c; -} - -button#excalibur-play:focus { - outline: 1px solid #fff; - outline-offset: -4px; -} - -button#excalibur-play:active { - transform: scale(0.99); -} - -@keyframes excalibur-button-fadein { - from { - opacity: 0; - } - to { - opacity: 1; - } -} - -/* Firefox < 16 */ -@-moz-keyframes excalibur-button-fadein { - from { - opacity: 0; - } - to { - opacity: 1; - } -} - -/* Safari, Chrome and Opera > 12.1 */ -@-webkit-keyframes excalibur-button-fadein { - from { - opacity: 0; - } - to { - opacity: 1; - } -} - -/* Internet Explorer */ -@-ms-keyframes excalibur-button-fadein { - from { - opacity: 0; - } - to { - opacity: 1; - } -} - -/* Opera < 12.1 */ -@-o-keyframes excalibur-button-fadein { - from { - opacity: 0; - } - to { - opacity: 1; - } -} +___CSS_LOADER_EXPORT___.push([module.id, `/* Buttons styles start */ + +button#excalibur-play { + display: inline-block; + position: relative; + z-index: 999; + border-radius: 6px; + border: none; + /*border: 3px solid; + border-color: white; + box-shadow: 0 0 10px #ccc;*/ + padding: 1rem 1.5rem 1rem 4rem; + margin: 0; + text-decoration: none; + background: #00b233; + color: #ffffff; + font-family: sans-serif; + font-size: 2rem; + white-space: nowrap; + line-height: 1; + cursor: pointer; + text-align: center; + transition: + background 250ms ease-in-out, + transform 150ms ease; + -webkit-appearance: none; + -moz-appearance: none; + + -webkit-animation: excalibur-button-fadein 200ms; /* Safari, Chrome and Opera > 12.1 */ + -moz-animation: excalibur-button-fadein 200ms; /* Firefox < 16 */ + -ms-animation: excalibur-button-fadein 200ms; /* Internet Explorer */ + -o-animation: excalibur-button-fadein 200ms; /* Opera < 12.1 */ + animation: excalibur-button-fadein 200ms; +} + +/* +button#excalibur-play { + display: none; +}*/ + +button#excalibur-play:after { + position: absolute; + content: ''; + border: 8px solid; + border-color: transparent transparent transparent white; + left: 35px; + top: 24px; + width: 0; + height: 0; +} + +button#excalibur-play:before { + position: absolute; + content: ''; + border: 3px solid; + left: 19px; + top: 14px; + border-radius: 20px; + width: 30px; + height: 30px; +} + +button#excalibur-play:hover, +button#excalibur-play:focus { + background: #00982c; +} + +button#excalibur-play:focus { + outline: 1px solid #fff; + outline-offset: -4px; +} + +button#excalibur-play:active { + transform: scale(0.99); +} + +@keyframes excalibur-button-fadein { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +/* Firefox < 16 */ +@-moz-keyframes excalibur-button-fadein { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +/* Safari, Chrome and Opera > 12.1 */ +@-webkit-keyframes excalibur-button-fadein { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +/* Internet Explorer */ +@-ms-keyframes excalibur-button-fadein { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +/* Opera < 12.1 */ +@-o-keyframes excalibur-button-fadein { + from { + opacity: 0; + } + to { + opacity: 1; + } +} `, "",{"version":3,"sources":["webpack://./Director/Loader.css"],"names":[],"mappings":"AAAA,yBAAyB;;AAEzB;EACE,qBAAqB;EACrB,kBAAkB;EAClB,YAAY;EACZ,kBAAkB;EAClB,YAAY;EACZ;;+BAE6B;EAC7B,8BAA8B;EAC9B,SAAS;EACT,qBAAqB;EACrB,mBAAmB;EACnB,cAAc;EACd,uBAAuB;EACvB,eAAe;EACf,mBAAmB;EACnB,cAAc;EACd,eAAe;EACf,kBAAkB;EAClB;;wBAEsB;EACtB,wBAAwB;EACxB,qBAAqB;;EAErB,gDAAgD,EAAE,oCAAoC;EACtF,6CAA6C,EAAE,iBAAiB;EAChE,4CAA4C,EAAE,sBAAsB;EACpE,2CAA2C,EAAE,iBAAiB;EAC9D,wCAAwC;AAC1C;;AAEA;;;EAGE;;AAEF;EACE,kBAAkB;EAClB,WAAW;EACX,iBAAiB;EACjB,uDAAuD;EACvD,UAAU;EACV,SAAS;EACT,QAAQ;EACR,SAAS;AACX;;AAEA;EACE,kBAAkB;EAClB,WAAW;EACX,iBAAiB;EACjB,UAAU;EACV,SAAS;EACT,mBAAmB;EACnB,WAAW;EACX,YAAY;AACd;;AAEA;;EAEE,mBAAmB;AACrB;;AAEA;EACE,uBAAuB;EACvB,oBAAoB;AACtB;;AAEA;EACE,sBAAsB;AACxB;;AAEA;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF;;AAEA,iBAAiB;AACjB;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF;;AAEA,oCAAoC;AACpC;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF;;AAEA,sBAAsB;AACtB;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF;;AAEA,iBAAiB;AACjB;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF","sourcesContent":["/* Buttons styles start */\r\n\r\nbutton#excalibur-play {\r\n display: inline-block;\r\n position: relative;\r\n z-index: 999;\r\n border-radius: 6px;\r\n border: none;\r\n /*border: 3px solid;\r\n border-color: white;\r\n box-shadow: 0 0 10px #ccc;*/\r\n padding: 1rem 1.5rem 1rem 4rem;\r\n margin: 0;\r\n text-decoration: none;\r\n background: #00b233;\r\n color: #ffffff;\r\n font-family: sans-serif;\r\n font-size: 2rem;\r\n white-space: nowrap;\r\n line-height: 1;\r\n cursor: pointer;\r\n text-align: center;\r\n transition:\r\n background 250ms ease-in-out,\r\n transform 150ms ease;\r\n -webkit-appearance: none;\r\n -moz-appearance: none;\r\n\r\n -webkit-animation: excalibur-button-fadein 200ms; /* Safari, Chrome and Opera > 12.1 */\r\n -moz-animation: excalibur-button-fadein 200ms; /* Firefox < 16 */\r\n -ms-animation: excalibur-button-fadein 200ms; /* Internet Explorer */\r\n -o-animation: excalibur-button-fadein 200ms; /* Opera < 12.1 */\r\n animation: excalibur-button-fadein 200ms;\r\n}\r\n\r\n/*\r\nbutton#excalibur-play {\r\n display: none;\r\n}*/\r\n\r\nbutton#excalibur-play:after {\r\n position: absolute;\r\n content: '';\r\n border: 8px solid;\r\n border-color: transparent transparent transparent white;\r\n left: 35px;\r\n top: 24px;\r\n width: 0;\r\n height: 0;\r\n}\r\n\r\nbutton#excalibur-play:before {\r\n position: absolute;\r\n content: '';\r\n border: 3px solid;\r\n left: 19px;\r\n top: 14px;\r\n border-radius: 20px;\r\n width: 30px;\r\n height: 30px;\r\n}\r\n\r\nbutton#excalibur-play:hover,\r\nbutton#excalibur-play:focus {\r\n background: #00982c;\r\n}\r\n\r\nbutton#excalibur-play:focus {\r\n outline: 1px solid #fff;\r\n outline-offset: -4px;\r\n}\r\n\r\nbutton#excalibur-play:active {\r\n transform: scale(0.99);\r\n}\r\n\r\n@keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n/* Firefox < 16 */\r\n@-moz-keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n/* Safari, Chrome and Opera > 12.1 */\r\n@-webkit-keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n/* Internet Explorer */\r\n@-ms-keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n/* Opera < 12.1 */\r\n@-o-keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n"],"sourceRoot":""}]); // Exports /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___); @@ -720,32 +720,32 @@ __nested_webpack_require_8167__.r(__nested_webpack_exports__); var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); // Module -___CSS_LOADER_EXPORT___.push([module.id, `#ex-toast-container { - position: absolute; - height: 0; - min-width: 50%; - left: 50%; - top: 0; -} - -.ex-toast-message { - left: -50%; - position: relative; - display: flex; - justify-content: space-between; - - padding: 10px; - margin-top: 5px; - font-size: 18px; - font-family: sans-serif; - border-radius: 6px; - border: 3px solid #b7b779; - background-color: rgb(253, 253, 192); -} - -.ex-toast-message button { - align-self: flex-start; -} +___CSS_LOADER_EXPORT___.push([module.id, `#ex-toast-container { + position: absolute; + height: 0; + min-width: 50%; + left: 50%; + top: 0; +} + +.ex-toast-message { + left: -50%; + position: relative; + display: flex; + justify-content: space-between; + + padding: 10px; + margin-top: 5px; + font-size: 18px; + font-family: sans-serif; + border-radius: 6px; + border: 3px solid #b7b779; + background-color: rgb(253, 253, 192); +} + +.ex-toast-message button { + align-self: flex-start; +} `, "",{"version":3,"sources":["webpack://./Util/Toaster.css"],"names":[],"mappings":"AAAA;EACE,kBAAkB;EAClB,SAAS;EACT,cAAc;EACd,SAAS;EACT,MAAM;AACR;;AAEA;EACE,UAAU;EACV,kBAAkB;EAClB,aAAa;EACb,8BAA8B;;EAE9B,aAAa;EACb,eAAe;EACf,eAAe;EACf,uBAAuB;EACvB,kBAAkB;EAClB,yBAAyB;EACzB,oCAAoC;AACtC;;AAEA;EACE,sBAAsB;AACxB","sourcesContent":["#ex-toast-container {\r\n position: absolute;\r\n height: 0;\r\n min-width: 50%;\r\n left: 50%;\r\n top: 0;\r\n}\r\n\r\n.ex-toast-message {\r\n left: -50%;\r\n position: relative;\r\n display: flex;\r\n justify-content: space-between;\r\n\r\n padding: 10px;\r\n margin-top: 5px;\r\n font-size: 18px;\r\n font-family: sans-serif;\r\n border-radius: 6px;\r\n border: 3px solid #b7b779;\r\n background-color: rgb(253, 253, 192);\r\n}\r\n\r\n.ex-toast-message button {\r\n align-self: flex-start;\r\n}\r\n"],"sourceRoot":""}]); // Exports /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___); @@ -2316,20 +2316,20 @@ class Flash { this._material = (_a = entity.scene) === null || _a === void 0 ? void 0 : _a.engine.graphicsContext.createMaterial({ name: 'flash-material', color, - fragmentSource: `#version 300 es - - precision mediump float; - uniform float u_blend; - uniform sampler2D u_graphic; - uniform vec4 u_color; - - in vec2 v_uv; - out vec4 color; - - void main() { - vec4 textureColor = texture(u_graphic, v_uv); - color = mix(textureColor, u_color, u_blend * textureColor.a); - color.rgb = color.rgb * color.a; + fragmentSource: `#version 300 es + + precision mediump float; + uniform float u_blend; + uniform sampler2D u_graphic; + uniform vec4 u_color; + + in vec2 v_uv; + out vec4 color; + + void main() { + vec4 textureColor = texture(u_graphic, v_uv); + color = mix(textureColor, u_color, u_blend * textureColor.a); + color.rgb = color.rgb * color.a; }` }); this._total = duration; @@ -11099,9 +11099,9 @@ class CollisionGroup { return _CollisionGroupManager__WEBPACK_IMPORTED_MODULE_0__.CollisionGroupManager.create(combinedName, combinedMask); } toString() { - return ` -category: ${this.category.toString(2).padStart(32, '0')} -mask: ${(this.mask >>> 0).toString(2).padStart(32, '0')} + return ` +category: ${this.category.toString(2).padStart(32, '0')} +mask: ${(this.mask >>> 0).toString(2).padStart(32, '0')} `; } } @@ -15527,22 +15527,22 @@ class Engine { container.style.padding = '10px'; container.style.borderStyle = 'solid 1px'; const div = document.createElement('div'); - div.innerHTML = ` -

There was an issue rendering, please refresh the page.

-
-

WebGL Graphics Context Lost

- - - -

There are a few reasons this might happen:

-
    -
  • Two or more pages are placing a high demand on the GPU
  • -
  • Another page or operation has stalled the GPU and the browser has decided to reset the GPU
  • -
  • The computer has multiple GPUs and the user has switched between them
  • -
  • Graphics driver has crashed or restarted
  • -
  • Graphics driver was updated
  • -
-
+ div.innerHTML = ` +

There was an issue rendering, please refresh the page.

+
+

WebGL Graphics Context Lost

+ + + +

There are a few reasons this might happen:

+
    +
  • Two or more pages are placing a high demand on the GPU
  • +
  • Another page or operation has stalled the GPU and the browser has decided to reset the GPU
  • +
  • The computer has multiple GPUs and the user has switched between them
  • +
  • Graphics driver has crashed or restarted
  • +
  • Graphics driver was updated
  • +
+
`; container.appendChild(div); if ((_a = this.canvas) === null || _a === void 0 ? void 0 : _a.parentElement) { @@ -15600,9 +15600,9 @@ class Engine { // eslint-disable-next-line no-console console.log(`%cPowered by Excalibur.js (v${___WEBPACK_IMPORTED_MODULE_2__.EX_VERSION})`, 'background: #176BAA; color: white; border-radius: 5px; padding: 15px; font-size: 1.5em; line-height: 80px;'); // eslint-disable-next-line no-console - console.log('\n\ - /| ________________\n\ -O|===|* >________________>\n\ + console.log('\n\ + /| ________________\n\ +O|===|* >________________>\n\ \\|'); // eslint-disable-next-line no-console console.log('Visit', 'http://excaliburjs.com', 'for more information'); @@ -22009,26 +22009,26 @@ __nested_webpack_require_937606__.r(__nested_webpack_exports__); -const defaultVertexSource = `#version 300 es -in vec2 a_position; - -in vec2 a_uv; -out vec2 v_uv; - -in vec2 a_screenuv; -out vec2 v_screenuv; - -uniform mat4 u_matrix; -uniform mat4 u_transform; - -void main() { - // Set the vertex position using the ortho & transform matrix - gl_Position = u_matrix * u_transform * vec4(a_position, 0.0, 1.0); - - // Pass through the UV coord to the fragment shader - v_uv = a_uv; - v_screenuv = a_screenuv; -} +const defaultVertexSource = `#version 300 es +in vec2 a_position; + +in vec2 a_uv; +out vec2 v_uv; + +in vec2 a_screenuv; +out vec2 v_screenuv; + +uniform mat4 u_matrix; +uniform mat4 u_transform; + +void main() { + // Set the vertex position using the ortho & transform matrix + gl_Position = u_matrix * u_transform * vec4(a_position, 0.0, 1.0); + + // Pass through the UV coord to the fragment shader + v_uv = a_uv; + v_screenuv = a_screenuv; +} `; class Material { constructor(options) { @@ -24193,12 +24193,12 @@ function getAttributePointerType(gl, type) { */ function getMaxShaderComplexity(gl, numIfs) { const assembleTestShader = (numIfs) => { - const testShader = `#version 300 es - precision mediump float; - out vec4 fragColor; - void main() { - float index = 1.01; - %%complexity%% + const testShader = `#version 300 es + precision mediump float; + out vec4 fragColor; + void main() { + float index = 1.01; + %%complexity%% }`; let testComplexity = ''; for (let i = 0; i < numIfs; i++) { @@ -26982,17 +26982,17 @@ class ScreenShader { } this._shader = new _Context_shader__WEBPACK_IMPORTED_MODULE_1__.Shader({ gl, - vertexSource: `#version 300 es - in vec2 a_position; - in vec2 a_uv; - out vec2 v_texcoord; - out vec2 v_uv; - - void main() { - gl_Position = vec4(a_position, 0.0, 1.0); - // Pass the texcoord to the fragment shader. - v_texcoord = a_uv; - v_uv = a_uv; + vertexSource: `#version 300 es + in vec2 a_position; + in vec2 a_uv; + out vec2 v_texcoord; + out vec2 v_uv; + + void main() { + gl_Position = vec4(a_position, 0.0, 1.0); + // Pass the texcoord to the fragment shader. + v_texcoord = a_uv; + v_uv = a_uv; }`, fragmentSource: fragmentSource }); @@ -31464,10 +31464,10 @@ class AffineMatrix { return mat; } toString() { - return ` -[${this.data[0]} ${this.data[2]} ${this.data[4]}] -[${this.data[1]} ${this.data[3]} ${this.data[5]}] -[0 0 1] + return ` +[${this.data[0]} ${this.data[2]} ${this.data[4]}] +[${this.data[1]} ${this.data[3]} ${this.data[5]}] +[0 0 1] `; } } @@ -32596,11 +32596,11 @@ class Matrix { this.data[15] === 1); } toString() { - return ` -[${this.data[0]} ${this.data[4]} ${this.data[8]} ${this.data[12]}] -[${this.data[1]} ${this.data[5]} ${this.data[9]} ${this.data[13]}] -[${this.data[2]} ${this.data[6]} ${this.data[10]} ${this.data[14]}] -[${this.data[3]} ${this.data[7]} ${this.data[11]} ${this.data[15]}] + return ` +[${this.data[0]} ${this.data[4]} ${this.data[8]} ${this.data[12]}] +[${this.data[1]} ${this.data[5]} ${this.data[9]} ${this.data[13]}] +[${this.data[2]} ${this.data[6]} ${this.data[10]} ${this.data[14]}] +[${this.data[3]} ${this.data[7]} ${this.data[11]} ${this.data[15]}] `; } } @@ -35256,8 +35256,8 @@ class Resource { return; } if (request.response instanceof Blob && request.response.type === 'text/html') { - const errorText = `Expected blob (usually image) data from the server when loading ${this.path}, but got HTML content instead! - + const errorText = `Expected blob (usually image) data from the server when loading ${this.path}, but got HTML content instead! + Check your server configuration, for example Vite serves static files from the /public folder`; this.events.emit('error', request.response); reject(new Error(errorText)); @@ -42409,1715 +42409,385 @@ __nested_webpack_require_1787534__.r(__nested_webpack_exports__); /***/ }), -/***/ "./sample/resources.ts": -/*!*****************************!*\ - !*** ./sample/resources.ts ***! - \*****************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { +/***/ "./node_modules/zod/lib/index.mjs": +/*!****************************************!*\ + !*** ./node_modules/zod/lib/index.mjs ***! + \****************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ Resources: () => (/* binding */ Resources), -/* harmony export */ loader: () => (/* binding */ loader) +/* harmony export */ BRAND: () => (/* binding */ BRAND), +/* harmony export */ DIRTY: () => (/* binding */ DIRTY), +/* harmony export */ EMPTY_PATH: () => (/* binding */ EMPTY_PATH), +/* harmony export */ INVALID: () => (/* binding */ INVALID), +/* harmony export */ NEVER: () => (/* binding */ NEVER), +/* harmony export */ OK: () => (/* binding */ OK), +/* harmony export */ ParseStatus: () => (/* binding */ ParseStatus), +/* harmony export */ Schema: () => (/* binding */ ZodType), +/* harmony export */ ZodAny: () => (/* binding */ ZodAny), +/* harmony export */ ZodArray: () => (/* binding */ ZodArray), +/* harmony export */ ZodBigInt: () => (/* binding */ ZodBigInt), +/* harmony export */ ZodBoolean: () => (/* binding */ ZodBoolean), +/* harmony export */ ZodBranded: () => (/* binding */ ZodBranded), +/* harmony export */ ZodCatch: () => (/* binding */ ZodCatch), +/* harmony export */ ZodDate: () => (/* binding */ ZodDate), +/* harmony export */ ZodDefault: () => (/* binding */ ZodDefault), +/* harmony export */ ZodDiscriminatedUnion: () => (/* binding */ ZodDiscriminatedUnion), +/* harmony export */ ZodEffects: () => (/* binding */ ZodEffects), +/* harmony export */ ZodEnum: () => (/* binding */ ZodEnum), +/* harmony export */ ZodError: () => (/* binding */ ZodError), +/* harmony export */ ZodFirstPartyTypeKind: () => (/* binding */ ZodFirstPartyTypeKind), +/* harmony export */ ZodFunction: () => (/* binding */ ZodFunction), +/* harmony export */ ZodIntersection: () => (/* binding */ ZodIntersection), +/* harmony export */ ZodIssueCode: () => (/* binding */ ZodIssueCode), +/* harmony export */ ZodLazy: () => (/* binding */ ZodLazy), +/* harmony export */ ZodLiteral: () => (/* binding */ ZodLiteral), +/* harmony export */ ZodMap: () => (/* binding */ ZodMap), +/* harmony export */ ZodNaN: () => (/* binding */ ZodNaN), +/* harmony export */ ZodNativeEnum: () => (/* binding */ ZodNativeEnum), +/* harmony export */ ZodNever: () => (/* binding */ ZodNever), +/* harmony export */ ZodNull: () => (/* binding */ ZodNull), +/* harmony export */ ZodNullable: () => (/* binding */ ZodNullable), +/* harmony export */ ZodNumber: () => (/* binding */ ZodNumber), +/* harmony export */ ZodObject: () => (/* binding */ ZodObject), +/* harmony export */ ZodOptional: () => (/* binding */ ZodOptional), +/* harmony export */ ZodParsedType: () => (/* binding */ ZodParsedType), +/* harmony export */ ZodPipeline: () => (/* binding */ ZodPipeline), +/* harmony export */ ZodPromise: () => (/* binding */ ZodPromise), +/* harmony export */ ZodReadonly: () => (/* binding */ ZodReadonly), +/* harmony export */ ZodRecord: () => (/* binding */ ZodRecord), +/* harmony export */ ZodSchema: () => (/* binding */ ZodType), +/* harmony export */ ZodSet: () => (/* binding */ ZodSet), +/* harmony export */ ZodString: () => (/* binding */ ZodString), +/* harmony export */ ZodSymbol: () => (/* binding */ ZodSymbol), +/* harmony export */ ZodTransformer: () => (/* binding */ ZodEffects), +/* harmony export */ ZodTuple: () => (/* binding */ ZodTuple), +/* harmony export */ ZodType: () => (/* binding */ ZodType), +/* harmony export */ ZodUndefined: () => (/* binding */ ZodUndefined), +/* harmony export */ ZodUnion: () => (/* binding */ ZodUnion), +/* harmony export */ ZodUnknown: () => (/* binding */ ZodUnknown), +/* harmony export */ ZodVoid: () => (/* binding */ ZodVoid), +/* harmony export */ addIssueToContext: () => (/* binding */ addIssueToContext), +/* harmony export */ any: () => (/* binding */ anyType), +/* harmony export */ array: () => (/* binding */ arrayType), +/* harmony export */ bigint: () => (/* binding */ bigIntType), +/* harmony export */ boolean: () => (/* binding */ booleanType), +/* harmony export */ coerce: () => (/* binding */ coerce), +/* harmony export */ custom: () => (/* binding */ custom), +/* harmony export */ date: () => (/* binding */ dateType), +/* harmony export */ datetimeRegex: () => (/* binding */ datetimeRegex), +/* harmony export */ "default": () => (/* binding */ z), +/* harmony export */ defaultErrorMap: () => (/* binding */ errorMap), +/* harmony export */ discriminatedUnion: () => (/* binding */ discriminatedUnionType), +/* harmony export */ effect: () => (/* binding */ effectsType), +/* harmony export */ "enum": () => (/* binding */ enumType), +/* harmony export */ "function": () => (/* binding */ functionType), +/* harmony export */ getErrorMap: () => (/* binding */ getErrorMap), +/* harmony export */ getParsedType: () => (/* binding */ getParsedType), +/* harmony export */ "instanceof": () => (/* binding */ instanceOfType), +/* harmony export */ intersection: () => (/* binding */ intersectionType), +/* harmony export */ isAborted: () => (/* binding */ isAborted), +/* harmony export */ isAsync: () => (/* binding */ isAsync), +/* harmony export */ isDirty: () => (/* binding */ isDirty), +/* harmony export */ isValid: () => (/* binding */ isValid), +/* harmony export */ late: () => (/* binding */ late), +/* harmony export */ lazy: () => (/* binding */ lazyType), +/* harmony export */ literal: () => (/* binding */ literalType), +/* harmony export */ makeIssue: () => (/* binding */ makeIssue), +/* harmony export */ map: () => (/* binding */ mapType), +/* harmony export */ nan: () => (/* binding */ nanType), +/* harmony export */ nativeEnum: () => (/* binding */ nativeEnumType), +/* harmony export */ never: () => (/* binding */ neverType), +/* harmony export */ "null": () => (/* binding */ nullType), +/* harmony export */ nullable: () => (/* binding */ nullableType), +/* harmony export */ number: () => (/* binding */ numberType), +/* harmony export */ object: () => (/* binding */ objectType), +/* harmony export */ objectUtil: () => (/* binding */ objectUtil), +/* harmony export */ oboolean: () => (/* binding */ oboolean), +/* harmony export */ onumber: () => (/* binding */ onumber), +/* harmony export */ optional: () => (/* binding */ optionalType), +/* harmony export */ ostring: () => (/* binding */ ostring), +/* harmony export */ pipeline: () => (/* binding */ pipelineType), +/* harmony export */ preprocess: () => (/* binding */ preprocessType), +/* harmony export */ promise: () => (/* binding */ promiseType), +/* harmony export */ quotelessJson: () => (/* binding */ quotelessJson), +/* harmony export */ record: () => (/* binding */ recordType), +/* harmony export */ set: () => (/* binding */ setType), +/* harmony export */ setErrorMap: () => (/* binding */ setErrorMap), +/* harmony export */ strictObject: () => (/* binding */ strictObjectType), +/* harmony export */ string: () => (/* binding */ stringType), +/* harmony export */ symbol: () => (/* binding */ symbolType), +/* harmony export */ transformer: () => (/* binding */ effectsType), +/* harmony export */ tuple: () => (/* binding */ tupleType), +/* harmony export */ undefined: () => (/* binding */ undefinedType), +/* harmony export */ union: () => (/* binding */ unionType), +/* harmony export */ unknown: () => (/* binding */ unknownType), +/* harmony export */ util: () => (/* binding */ util), +/* harmony export */ "void": () => (/* binding */ voidType), +/* harmony export */ z: () => (/* binding */ z) /* harmony export */ }); -/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); -/* harmony import */ var _excalibur_ldtk__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @excalibur-ldtk */ "./src/index.ts"); - - -const Resources = { - HeroSpriteSheetPng: new excalibur__WEBPACK_IMPORTED_MODULE_1__.ImageSource('./Solaria Demo Pack Update 03/Solaria Demo Pack Update 03/16x16/Sprites/Hero 01.png'), - LdtkResource: new _excalibur_ldtk__WEBPACK_IMPORTED_MODULE_0__.LdtkResource('./spacing-padding/spacing-padding.ldtk', { - useTilemapCameraStrategy: true, - useMapBackgroundColor: true, - }), - LdtkAutoTile: new _excalibur_ldtk__WEBPACK_IMPORTED_MODULE_0__.LdtkResource('./autotile/autotile.ldtk', { - useMapBackgroundColor: true, - }), - LdtkPureAutoTile: new _excalibur_ldtk__WEBPACK_IMPORTED_MODULE_0__.LdtkResource('./dsml1/dsml1.ldtk', { - useMapBackgroundColor: true, - }) +var util; +(function (util) { + util.assertEqual = (val) => val; + function assertIs(_arg) { } + util.assertIs = assertIs; + function assertNever(_x) { + throw new Error(); + } + util.assertNever = assertNever; + util.arrayToEnum = (items) => { + const obj = {}; + for (const item of items) { + obj[item] = item; + } + return obj; + }; + util.getValidEnumValues = (obj) => { + const validKeys = util.objectKeys(obj).filter((k) => typeof obj[obj[k]] !== "number"); + const filtered = {}; + for (const k of validKeys) { + filtered[k] = obj[k]; + } + return util.objectValues(filtered); + }; + util.objectValues = (obj) => { + return util.objectKeys(obj).map(function (e) { + return obj[e]; + }); + }; + util.objectKeys = typeof Object.keys === "function" // eslint-disable-line ban/ban + ? (obj) => Object.keys(obj) // eslint-disable-line ban/ban + : (object) => { + const keys = []; + for (const key in object) { + if (Object.prototype.hasOwnProperty.call(object, key)) { + keys.push(key); + } + } + return keys; + }; + util.find = (arr, checker) => { + for (const item of arr) { + if (checker(item)) + return item; + } + return undefined; + }; + util.isInteger = typeof Number.isInteger === "function" + ? (val) => Number.isInteger(val) // eslint-disable-line ban/ban + : (val) => typeof val === "number" && isFinite(val) && Math.floor(val) === val; + function joinValues(array, separator = " | ") { + return array + .map((val) => (typeof val === "string" ? `'${val}'` : val)) + .join(separator); + } + util.joinValues = joinValues; + util.jsonStringifyReplacer = (_, value) => { + if (typeof value === "bigint") { + return value.toString(); + } + return value; + }; +})(util || (util = {})); +var objectUtil; +(function (objectUtil) { + objectUtil.mergeShapes = (first, second) => { + return { + ...first, + ...second, // second overwrites first + }; + }; +})(objectUtil || (objectUtil = {})); +const ZodParsedType = util.arrayToEnum([ + "string", + "nan", + "number", + "integer", + "float", + "boolean", + "date", + "bigint", + "symbol", + "function", + "undefined", + "null", + "array", + "object", + "unknown", + "promise", + "void", + "never", + "map", + "set", +]); +const getParsedType = (data) => { + const t = typeof data; + switch (t) { + case "undefined": + return ZodParsedType.undefined; + case "string": + return ZodParsedType.string; + case "number": + return isNaN(data) ? ZodParsedType.nan : ZodParsedType.number; + case "boolean": + return ZodParsedType.boolean; + case "function": + return ZodParsedType.function; + case "bigint": + return ZodParsedType.bigint; + case "symbol": + return ZodParsedType.symbol; + case "object": + if (Array.isArray(data)) { + return ZodParsedType.array; + } + if (data === null) { + return ZodParsedType.null; + } + if (data.then && + typeof data.then === "function" && + data.catch && + typeof data.catch === "function") { + return ZodParsedType.promise; + } + if (typeof Map !== "undefined" && data instanceof Map) { + return ZodParsedType.map; + } + if (typeof Set !== "undefined" && data instanceof Set) { + return ZodParsedType.set; + } + if (typeof Date !== "undefined" && data instanceof Date) { + return ZodParsedType.date; + } + return ZodParsedType.object; + default: + return ZodParsedType.unknown; + } }; -const loader = new excalibur__WEBPACK_IMPORTED_MODULE_1__.Loader(); -for (let resource of Object.values(Resources)) { - loader.addResource(resource); -} - - -/***/ }), -/***/ "./src/entity-layer.ts": -/*!*****************************!*\ - !*** ./src/entity-layer.ts ***! - \*****************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ EntityLayer: () => (/* binding */ EntityLayer) -/* harmony export */ }); -/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); - -class EntityLayer { - constructor(level, ldtkLayer, resource, order) { - var _a, _b; - this.ldtkLayer = ldtkLayer; - this.resource = resource; - this.order = order; - this.entities = []; - this.ldtkToEntity = new Map(); - this.entityToLdtk = new Map(); - this.worldPos = (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(level.ldtkLevel.worldX, level.ldtkLevel.worldY); - this.offset = (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(ldtkLayer.__pxTotalOffsetX, ldtkLayer.__pxTotalOffsetY); - if (ldtkLayer.entityInstances) { - for (let entity of ldtkLayer.entityInstances) { - const entityMetadata = resource.projectMetadata.defs.entities.find(e => { - return e.identifier === entity.__identifier; - }); - if (resource.factories.has(entity.__identifier)) { - const factory = resource.factories.get(entity.__identifier); - if (factory) { - const newEntity = factory({ - type: entity.__identifier, - worldPos: (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(entity.px[0], entity.px[1]).add(this.worldPos.add(this.offset)), - entity, - definition: entityMetadata, - layer: this, - }); - if (newEntity) { - this.entities.push(newEntity); - this.ldtkToEntity.set(entity, newEntity); - this.entityToLdtk.set(newEntity, entity); - } - } +const ZodIssueCode = util.arrayToEnum([ + "invalid_type", + "invalid_literal", + "custom", + "invalid_union", + "invalid_union_discriminator", + "invalid_enum_value", + "unrecognized_keys", + "invalid_arguments", + "invalid_return_type", + "invalid_date", + "invalid_string", + "too_small", + "too_big", + "invalid_intersection_types", + "not_multiple_of", + "not_finite", +]); +const quotelessJson = (obj) => { + const json = JSON.stringify(obj, null, 2); + return json.replace(/"([^"]+)":/g, "$1:"); +}; +class ZodError extends Error { + get errors() { + return this.issues; + } + constructor(issues) { + super(); + this.issues = []; + this.addIssue = (sub) => { + this.issues = [...this.issues, sub]; + }; + this.addIssues = (subs = []) => { + this.issues = [...this.issues, ...subs]; + }; + const actualProto = new.target.prototype; + if (Object.setPrototypeOf) { + // eslint-disable-next-line ban/ban + Object.setPrototypeOf(this, actualProto); + } + else { + this.__proto__ = actualProto; + } + this.name = "ZodError"; + this.issues = issues; + } + format(_mapper) { + const mapper = _mapper || + function (issue) { + return issue.message; + }; + const fieldErrors = { _errors: [] }; + const processError = (error) => { + for (const issue of error.issues) { + if (issue.code === "invalid_union") { + issue.unionErrors.map(processError); + } + else if (issue.code === "invalid_return_type") { + processError(issue.returnTypeError); + } + else if (issue.code === "invalid_arguments") { + processError(issue.argumentsError); + } + else if (issue.path.length === 0) { + fieldErrors._errors.push(mapper(issue)); } else { - const actor = new excalibur__WEBPACK_IMPORTED_MODULE_0__.Actor({ - name: entity.__identifier, - pos: (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(entity.px[0], entity.px[1]).add(this.worldPos.add(this.offset)), - width: entity.width, - height: entity.height, - anchor: (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)((_a = entityMetadata === null || entityMetadata === void 0 ? void 0 : entityMetadata.pivotX) !== null && _a !== void 0 ? _a : 0, (_b = entityMetadata === null || entityMetadata === void 0 ? void 0 : entityMetadata.pivotY) !== null && _b !== void 0 ? _b : 0), - z: order - }); - if (entity.__tile) { - const ts = resource.tilesets.get(entity.__tile.tilesetUid); - if (ts) { - const tsxCoord = Math.floor(entity.__tile.x / entity.__tile.w); - const tsyCoord = Math.floor(entity.__tile.y / entity.__tile.h); - const sprite = ts.spritesheet.getSprite(tsxCoord, tsyCoord); - if (sprite) { - actor.graphics.use(sprite); - } + let curr = fieldErrors; + let i = 0; + while (i < issue.path.length) { + const el = issue.path[i]; + const terminal = i === issue.path.length - 1; + if (!terminal) { + curr[el] = curr[el] || { _errors: [] }; + // if (typeof el === "string") { + // curr[el] = curr[el] || { _errors: [] }; + // } else if (typeof el === "number") { + // const errorArray: any = []; + // errorArray._errors = []; + // curr[el] = curr[el] || errorArray; + // } + } + else { + curr[el] = curr[el] || { _errors: [] }; + curr[el]._errors.push(mapper(issue)); } + curr = curr[el]; + i++; } - this.entities.push(actor); - this.ldtkToEntity.set(entity, actor); - this.entityToLdtk.set(actor, entity); } } - } + }; + processError(this); + return fieldErrors; } - runFactories() { - for (let entity of this.ldtkLayer.entityInstances) { - const factory = this.resource.factories.get(entity.__identifier); - if (!factory) { - continue; - } - const entityMetadata = this.resource.projectMetadata.defs.entities.find(e => { - return e.identifier === entity.__identifier; - }); - const newEntity = factory({ - type: entity.__identifier, - worldPos: (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(entity.px[0], entity.px[1]).add(this.worldPos.add(this.offset)), - entity, - definition: entityMetadata, - layer: this, - }); - if (newEntity) { - // remove pre-existing entity (e.g. the default actor created for the entity placement) - const preExisting = this.ldtkToEntity.get(entity); - if (preExisting) { - const index = this.entities.indexOf(preExisting); - if (index > -1) { - this.entities.splice(index, 1); - this.ldtkToEntity.delete(entity); - this.entityToLdtk.delete(preExisting); - } - } - this.entities.push(newEntity); - this.ldtkToEntity.set(entity, newEntity); - this.entityToLdtk.set(newEntity, entity); - } + static assert(value) { + if (!(value instanceof ZodError)) { + throw new Error(`Not a ZodError: ${value}`); } } - getEntitiesByIdentifier(identifier) { - const ldtkEntities = this.getLdtkEntitiesByIdentifier(identifier); - let results = []; - for (const ldtk of ldtkEntities) { - const maybeEntity = this.ldtkToEntity.get(ldtk); - if (maybeEntity) { - results.push(maybeEntity); - } - } - return results; + toString() { + return this.message; } - getEntitiesByField(fieldIdentifier, value) { - const ldtkEntities = this.getLdtkEntitiesByField(fieldIdentifier, value); - let results = []; - for (const ldtk of ldtkEntities) { - const maybeEntity = this.ldtkToEntity.get(ldtk); - if (maybeEntity) { - results.push(maybeEntity); + get message() { + return JSON.stringify(this.issues, util.jsonStringifyReplacer, 2); + } + get isEmpty() { + return this.issues.length === 0; + } + flatten(mapper = (issue) => issue.message) { + const fieldErrors = {}; + const formErrors = []; + for (const sub of this.issues) { + if (sub.path.length > 0) { + fieldErrors[sub.path[0]] = fieldErrors[sub.path[0]] || []; + fieldErrors[sub.path[0]].push(mapper(sub)); + } + else { + formErrors.push(mapper(sub)); } } - return results; - } - /** - * Search layer for entities that match an identifier (case insensitive) - * @param identifier - * @returns - */ - getLdtkEntitiesByIdentifier(identifier) { - return this.ldtkLayer.entityInstances.filter(e => e.__identifier.toLocaleLowerCase() === identifier.toLowerCase()); - } - /** - * Search layer for entities that match a field and optionally a value (both case insensitive) - * @param fieldIdentifier - * @param value - */ - getLdtkEntitiesByField(fieldIdentifier, value) { - return this.ldtkLayer.entityInstances.filter(e => { - if (value !== undefined) { - let normalizedValue = value; - if (typeof value === 'string') { - normalizedValue = value.toLocaleLowerCase(); - } - const field = e.fieldInstances.find(f => f.__identifier.toLocaleLowerCase() === fieldIdentifier.toLocaleLowerCase()); - if (field) { - return field.__value === normalizedValue; - } - return false; - } - else { - return !!e.fieldInstances.find(f => f.__identifier.toLocaleLowerCase() === fieldIdentifier.toLocaleLowerCase()); - } - }); - } -} - - -/***/ }), - -/***/ "./src/file-loader.ts": -/*!****************************!*\ - !*** ./src/file-loader.ts ***! - \****************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ FetchLoader: () => (/* binding */ FetchLoader) -/* harmony export */ }); -const FetchLoader = async (path, contentType) => { - const response = await fetch(path); - switch (contentType.toLowerCase()) { - case 'xml': return await response.text(); - case 'json': return await response.json(); - default: return await response.text(); - } -}; - - -/***/ }), - -/***/ "./src/index.ts": -/*!**********************!*\ - !*** ./src/index.ts ***! - \**********************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ EntityLayer: () => (/* reexport safe */ _entity_layer__WEBPACK_IMPORTED_MODULE_1__.EntityLayer), -/* harmony export */ FetchLoader: () => (/* reexport safe */ _file_loader__WEBPACK_IMPORTED_MODULE_2__.FetchLoader), -/* harmony export */ IntGridLayer: () => (/* reexport safe */ _intgrid_layer__WEBPACK_IMPORTED_MODULE_3__.IntGridLayer), -/* harmony export */ LdtkEntityDefinition: () => (/* reexport safe */ _types__WEBPACK_IMPORTED_MODULE_10__.LdtkEntityDefinition), -/* harmony export */ LdtkEntityInstance: () => (/* reexport safe */ _types__WEBPACK_IMPORTED_MODULE_10__.LdtkEntityInstance), -/* harmony export */ LdtkLayerDefinition: () => (/* reexport safe */ _types__WEBPACK_IMPORTED_MODULE_10__.LdtkLayerDefinition), -/* harmony export */ LdtkLayerInstance: () => (/* reexport safe */ _types__WEBPACK_IMPORTED_MODULE_10__.LdtkLayerInstance), -/* harmony export */ LdtkLevel: () => (/* reexport safe */ _types__WEBPACK_IMPORTED_MODULE_10__.LdtkLevel), -/* harmony export */ LdtkProjectMetadata: () => (/* reexport safe */ _types__WEBPACK_IMPORTED_MODULE_10__.LdtkProjectMetadata), -/* harmony export */ LdtkResource: () => (/* reexport safe */ _ldtk_resource__WEBPACK_IMPORTED_MODULE_0__.LdtkResource), -/* harmony export */ Level: () => (/* reexport safe */ _level__WEBPACK_IMPORTED_MODULE_5__.Level), -/* harmony export */ LevelResource: () => (/* reexport safe */ _level_resource__WEBPACK_IMPORTED_MODULE_4__.LevelResource), -/* harmony export */ LoaderCache: () => (/* reexport safe */ _loader_cache__WEBPACK_IMPORTED_MODULE_6__.LoaderCache), -/* harmony export */ TileLayer: () => (/* reexport safe */ _tile_layer__WEBPACK_IMPORTED_MODULE_8__.TileLayer), -/* harmony export */ Tileset: () => (/* reexport safe */ _tileset__WEBPACK_IMPORTED_MODULE_9__.Tileset), -/* harmony export */ filenameFromPath: () => (/* reexport safe */ _path_util__WEBPACK_IMPORTED_MODULE_7__.filenameFromPath), -/* harmony export */ mapPath: () => (/* reexport safe */ _path_util__WEBPACK_IMPORTED_MODULE_7__.mapPath), -/* harmony export */ pathInMap: () => (/* reexport safe */ _path_util__WEBPACK_IMPORTED_MODULE_7__.pathInMap), -/* harmony export */ pathRelativeToBase: () => (/* reexport safe */ _path_util__WEBPACK_IMPORTED_MODULE_7__.pathRelativeToBase) -/* harmony export */ }); -/* harmony import */ var _ldtk_resource__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ldtk-resource */ "./src/ldtk-resource.ts"); -/* harmony import */ var _entity_layer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./entity-layer */ "./src/entity-layer.ts"); -/* harmony import */ var _file_loader__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./file-loader */ "./src/file-loader.ts"); -/* harmony import */ var _intgrid_layer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./intgrid-layer */ "./src/intgrid-layer.ts"); -/* harmony import */ var _level_resource__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./level-resource */ "./src/level-resource.ts"); -/* harmony import */ var _level__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./level */ "./src/level.ts"); -/* harmony import */ var _loader_cache__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./loader-cache */ "./src/loader-cache.ts"); -/* harmony import */ var _path_util__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./path-util */ "./src/path-util.ts"); -/* harmony import */ var _tile_layer__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./tile-layer */ "./src/tile-layer.ts"); -/* harmony import */ var _tileset__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./tileset */ "./src/tileset.ts"); -/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./types */ "./src/types.ts"); - - - - - - - - - - - - - -/***/ }), - -/***/ "./src/intgrid-layer.ts": -/*!******************************!*\ - !*** ./src/intgrid-layer.ts ***! - \******************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ IntGridLayer: () => (/* binding */ IntGridLayer) -/* harmony export */ }); -/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); - -class IntGridLayer { - constructor(level, ldtkLayer, resource, order) { - var _a, _b, _c, _d; - this.order = order; - this.worldPos = (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(level.ldtkLevel.worldX, level.ldtkLevel.worldY); - this.offset = (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(ldtkLayer.__pxTotalOffsetX, ldtkLayer.__pxTotalOffsetY); - this.ldtkLayer = ldtkLayer; - if (ldtkLayer.intGridCsv.length || ldtkLayer.autoLayerTiles.length) { - const rows = ldtkLayer.__cHei; - const columns = ldtkLayer.__cWid; - this.tilemap = new excalibur__WEBPACK_IMPORTED_MODULE_0__.TileMap({ - name: ldtkLayer.__identifier, - pos: this.worldPos.add(this.offset), - tileWidth: ldtkLayer.__gridSize, - tileHeight: ldtkLayer.__gridSize, - rows, - columns, - }); - this.tilemap.z = order; - const graphics = this.tilemap.get(excalibur__WEBPACK_IMPORTED_MODULE_0__.GraphicsComponent); - graphics.isVisible = ldtkLayer.visible; - // find the intgrid metadata - const layerMetadata = resource.projectMetadata.defs.layers.find(l => { - return ldtkLayer.__identifier === l.identifier; - }); - if (layerMetadata) { - const solidValue = layerMetadata.intGridValues.find(val => { - var _a; - return ((_a = val === null || val === void 0 ? void 0 : val.identifier) === null || _a === void 0 ? void 0 : _a.toLocaleLowerCase()) === 'solid'; - }); - for (let i = 0; i < ldtkLayer.intGridCsv.length; i++) { - const xCoord = i % columns; - const yCoord = Math.floor(i / columns); - const tile = this.tilemap.getTile(xCoord, yCoord); - if (solidValue && ldtkLayer.intGridCsv[i] === solidValue.value) { - tile.solid = true; - } - // TODO might be a mistake to treat 1 as solid if there isn't a labelled solid - if (!solidValue && ldtkLayer.intGridCsv[i] === 1) { - tile.solid = true; - } - } - if (ldtkLayer.__tilesetDefUid) { - this.tileset = resource.tilesets.get(ldtkLayer.__tilesetDefUid); - for (let i = 0; i < ldtkLayer.autoLayerTiles.length; i++) { - const tile = ldtkLayer.autoLayerTiles[i]; - const xCoord = Math.floor(tile.px[0] / ldtkLayer.__gridSize); - const yCoord = Math.floor(tile.px[1] / ldtkLayer.__gridSize); - const exTile = this.tilemap.getTile(xCoord, yCoord); - if (exTile && this.tileset) { - const tsxCoord = Math.floor((tile.src[0] - ((_a = this.tileset.ldtkTileset.padding) !== null && _a !== void 0 ? _a : 0)) / (this.tileset.ldtkTileset.tileGridSize + ((_b = this.tileset.ldtkTileset.spacing) !== null && _b !== void 0 ? _b : 0))); - const tsyCoord = Math.floor((tile.src[1] - ((_c = this.tileset.ldtkTileset.padding) !== null && _c !== void 0 ? _c : 0)) / (this.tileset.ldtkTileset.tileGridSize + ((_d = this.tileset.ldtkTileset.spacing) !== null && _d !== void 0 ? _d : 0))); - // Bit 0 toggles x flip - // Bit 1 toggles 1 flip - // Examples: f=0 (no flip), f=1 (X flip only), f=2 (Y flip only), f=3 (both flips) - const flipHorizontal = !!(tile.f & 0b01); - const flipVertical = !!(tile.f & 0b10); - let sprite = this.tileset.spritesheet.getSprite(tsxCoord, tsyCoord); - if (flipHorizontal || flipVertical) { - sprite = sprite.clone(); - sprite.flipHorizontal = flipHorizontal; - sprite.flipVertical = flipVertical; - } - if (sprite) { - exTile.addGraphic(sprite); - } - else { - console.error('Could not find sprite in LDtk spritesheet at', tsxCoord, tsyCoord); - } - } - } - } - } - } - } -} - - -/***/ }), - -/***/ "./src/ldtk-resource.ts": -/*!******************************!*\ - !*** ./src/ldtk-resource.ts ***! - \******************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ LdtkResource: () => (/* binding */ LdtkResource) -/* harmony export */ }); -/* harmony import */ var _tile_layer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./tile-layer */ "./src/tile-layer.ts"); -/* harmony import */ var _path_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./path-util */ "./src/path-util.ts"); -/* harmony import */ var _file_loader__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./file-loader */ "./src/file-loader.ts"); -/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./types */ "./src/types.ts"); -/* harmony import */ var compare_versions__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! compare-versions */ "./node_modules/compare-versions/lib/esm/compare.js"); -/* harmony import */ var _loader_cache__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./loader-cache */ "./src/loader-cache.ts"); -/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); -/* harmony import */ var _level_resource__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./level-resource */ "./src/level-resource.ts"); -/* harmony import */ var _tileset__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./tileset */ "./src/tileset.ts"); -/* harmony import */ var _level__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./level */ "./src/level.ts"); -/* harmony import */ var _entity_layer__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./entity-layer */ "./src/entity-layer.ts"); -/* harmony import */ var _intgrid_layer__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./intgrid-layer */ "./src/intgrid-layer.ts"); - - - - - - - - - - - - -class LdtkResource { - constructor(path, options) { - this.path = path; - this.tilesets = new Map(); - this.levels = new Map(); - this.levelsByName = new Map(); - this.factories = new Map(); - this.fileLoader = _file_loader__WEBPACK_IMPORTED_MODULE_2__.FetchLoader; - this._imageLoader = new _loader_cache__WEBPACK_IMPORTED_MODULE_4__.LoaderCache(excalibur__WEBPACK_IMPORTED_MODULE_10__.ImageSource); - this._levelLoader = new _loader_cache__WEBPACK_IMPORTED_MODULE_4__.LoaderCache(_level_resource__WEBPACK_IMPORTED_MODULE_5__.LevelResource); - this.startZIndex = 0; - this.textQuality = 4; - this.useExcaliburWiring = true; - this.useMapBackgroundColor = false; - this.useTilemapCameraStrategy = false; - this.headless = false; - this.strict = true; - const { useExcaliburWiring, useTilemapCameraStrategy, entityIdentifierFactories, pathMap, useMapBackgroundColor, fileLoader, strict, headless, startZIndex } = { ...options }; - this.strict = strict !== null && strict !== void 0 ? strict : this.strict; - this.headless = headless !== null && headless !== void 0 ? headless : this.headless; - this.useExcaliburWiring = useExcaliburWiring !== null && useExcaliburWiring !== void 0 ? useExcaliburWiring : this.useExcaliburWiring; - this.useTilemapCameraStrategy = useTilemapCameraStrategy !== null && useTilemapCameraStrategy !== void 0 ? useTilemapCameraStrategy : this.useTilemapCameraStrategy; - this.useMapBackgroundColor = useMapBackgroundColor !== null && useMapBackgroundColor !== void 0 ? useMapBackgroundColor : this.useMapBackgroundColor; - this.startZIndex = startZIndex !== null && startZIndex !== void 0 ? startZIndex : this.startZIndex; - this.fileLoader = fileLoader !== null && fileLoader !== void 0 ? fileLoader : this.fileLoader; - this.pathMap = pathMap; - for (const key in entityIdentifierFactories) { - this.registerEntityIdentifierFactory(key, entityIdentifierFactories[key]); - } - } - async load() { - var _a; - const data = await this.fileLoader(this.path, 'json'); - if (this.strict) { - try { - this.projectMetadata = _types__WEBPACK_IMPORTED_MODULE_3__.LdtkProjectMetadata.parse(data); - } - catch (e) { - console.error(`Could not parse LDtk map from location ${this.path}.\nExcalibur only supports the latest version of LDtk formats as of the plugin's release.`); - console.error(`Is your map file corrupted or being interpreted as the wrong type?`); - throw e; - } - } - else { - this.projectMetadata = data; - } - if ((0,compare_versions__WEBPACK_IMPORTED_MODULE_11__.compare)(LdtkResource.supportedLdtkVersion, (_a = this.projectMetadata.jsonVersion) !== null && _a !== void 0 ? _a : '0.0.0', ">")) { - console.warn(`The excalibur ldtk plugin officially supports ${LdtkResource.supportedLdtkVersion}+, the current map has LDtk version ${this.projectMetadata.jsonVersion}`); - } - // iterate through the defs - // load the tilesets - const imagesToLoad = []; - for (let tileset of this.projectMetadata.defs.tilesets) { - if (tileset.relPath) { - const imagePath = (0,_path_util__WEBPACK_IMPORTED_MODULE_1__.pathRelativeToBase)(this.path, tileset.relPath, this.pathMap); - const image = this._imageLoader.getOrAdd(imagePath); - const friendlyTileset = new _tileset__WEBPACK_IMPORTED_MODULE_6__.Tileset({ - image, - ldtkTileset: tileset - }); - this.tilesets.set(tileset.uid, friendlyTileset); - } - else { - if (tileset.identifier !== 'Internal_Icons') { - console.warn(`No tileset image provided for ${tileset.identifier}`); - } - } - } - // iterate through the levels - // load the level metadata - for (let level of this.projectMetadata.levels) { - if (level.externalRelPath) { - // external levels - const levelPath = (0,_path_util__WEBPACK_IMPORTED_MODULE_1__.pathRelativeToBase)(this.path, level.externalRelPath, this.pathMap); - this._levelLoader.getOrAdd(levelPath, this, { - headless: this.headless, - strict: this.strict, - fileLoader: this.fileLoader, - imageLoader: this._imageLoader, - pathMap: this.pathMap - }); - } - else { - // embedded levels - const friendlyLevel = new _level__WEBPACK_IMPORTED_MODULE_7__.Level(level, this); - this.levels.set(level.uid, friendlyLevel); - this.levelsByName.set(level.identifier.toLowerCase(), friendlyLevel); - } - } - await Promise.all([this._imageLoader.load(), this._levelLoader.load()]); - this._levelLoader.values().forEach(level => { - this.levels.set(level.data.ldtkLevel.uid, level.data); - this.levelsByName.set(level.data.ldtkLevel.identifier.toLowerCase(), level.data); - }); - return this.data = this.projectMetadata; - } - ; - isLoaded() { - return !!this.data; - } - registerEntityIdentifierFactory(ldtkEntityIdentifier, factory) { - this.factories.set(ldtkEntityIdentifier, factory); - } - registerEntityIdentifierFactories(factories) { - for (const key in factories) { - this.registerEntityIdentifierFactory(key, factories[key]); - } - } - /** - * Get a level by identifier - * @param identifier - * @returns - */ - getLevel(identifier) { - return this.levelsByName.get(identifier.toLowerCase()); - } - /** - * Get the entity layers, optionally provide a level identifier to filter to - * @param levelIdentifier - */ - getEntityLayers(levelIdentifier) { - let results = []; - if (levelIdentifier) { - const level = this.getLevel(levelIdentifier); - if (level) { - for (let layer of level.layers) { - if (layer instanceof _entity_layer__WEBPACK_IMPORTED_MODULE_8__.EntityLayer) { - results.push(layer); - } - } - } - } - else { - for (const level of this.levels.values()) { - for (let layer of level.layers) { - if (layer instanceof _entity_layer__WEBPACK_IMPORTED_MODULE_8__.EntityLayer) { - results.push(layer); - } - } - } - } - return results; - } - getTileLayers(identifier) { - let results = []; - if (identifier) { - const level = this.getLevel(identifier); - if (level) { - for (let layer of level.layers) { - if (layer instanceof _tile_layer__WEBPACK_IMPORTED_MODULE_0__.TileLayer) { - results.push(layer); - } - } - } - } - else { - for (const level of this.levels.values()) { - for (let layer of level.layers) { - if (layer instanceof _tile_layer__WEBPACK_IMPORTED_MODULE_0__.TileLayer) { - results.push(layer); - } - } - } - } - return results; - } - getIntGridLayers(identifier) { - let results = []; - if (identifier) { - const level = this.getLevel(identifier); - if (level) { - for (let layer of level.layers) { - if (layer instanceof _intgrid_layer__WEBPACK_IMPORTED_MODULE_9__.IntGridLayer) { - results.push(layer); - } - } - } - } - else { - for (const level of this.levels.values()) { - for (let layer of level.layers) { - if (layer instanceof _intgrid_layer__WEBPACK_IMPORTED_MODULE_9__.IntGridLayer) { - results.push(layer); - } - } - } - } - return results; - } - /** - * Search layer for entities that match an identifier (case insensitive) - * @param identifier - * @returns - */ - getLdtkEntitiesByIdentifier(identifier, levels) { - let results = []; - const levelsToSearch = levels !== null && levels !== void 0 ? levels : Array.from(this.levels.values()).map(l => l.ldtkLevel.identifier); - for (const level of levelsToSearch) { - const layers = this.getEntityLayers(level); - for (let layer of layers) { - results = results.concat(layer.getLdtkEntitiesByIdentifier(identifier)); - } - } - return results; - } - /** - * Search levels for ldtk entities that match a field and optionally a value (both case insensitive) - * @param fieldIdentifier - * @param value - */ - getLdtkEntitiesByField(fieldIdentifier, value, levels) { - let results = []; - const levelsToSearch = levels !== null && levels !== void 0 ? levels : Array.from(this.levels.values()).map(l => l.ldtkLevel.identifier); - for (const level of levelsToSearch) { - const layers = this.getEntityLayers(level); - for (let layer of layers) { - results = results.concat(layer.getLdtkEntitiesByField(fieldIdentifier, value)); - } - } - return results; - } - /** - * Search levels for excalibur entities that match an identifier (case insensitive) - * @param identifier - * @param levels - */ - getEntitiesByIdentifier(identifier, levels) { - let results = []; - const levelsToSearch = levels !== null && levels !== void 0 ? levels : Array.from(this.levels.values()).map(l => l.ldtkLevel.identifier); - for (const level of levelsToSearch) { - const layers = this.getEntityLayers(level); - for (let layer of layers) { - results = results.concat(layer.getEntitiesByIdentifier(identifier)); - } - } - return results; - } - /** - * Search levels for excalibur entities that match a field and optionally a value (both case insensitive) - * @param fieldIdentifier - * @param value - * @param levels - */ - getEntitiesByField(fieldIdentifier, value, levels) { - let results = []; - const levelsToSearch = levels !== null && levels !== void 0 ? levels : Array.from(this.levels.values()).map(l => l.ldtkLevel.identifier); - for (const level of levelsToSearch) { - const layers = this.getEntityLayers(level); - for (let layer of layers) { - results = results.concat(layer.getEntitiesByField(fieldIdentifier, value)); - } - } - return results; - } - /** - * Get the level bounds given a list of level identifiers (case insensitive) - * @param levels - */ - getLevelBounds(levels) { - levels = levels !== null && levels !== void 0 ? levels : Array.from(this.levelsByName.keys()); - let bounds = null; - for (const level of this.levels.values()) { - if (!levels.includes(level.ldtkLevel.identifier)) { - continue; - } - const firstTileLayer = this.getTileLayers(level.ldtkLevel.identifier)[0]; - if (firstTileLayer) { - const tileBounds = excalibur__WEBPACK_IMPORTED_MODULE_10__.BoundingBox.fromDimension(firstTileLayer.tilemap.tileWidth * firstTileLayer.tilemap.columns, firstTileLayer.tilemap.tileHeight * firstTileLayer.tilemap.rows, excalibur__WEBPACK_IMPORTED_MODULE_10__.Vector.Zero, firstTileLayer.tilemap.pos); - if (!bounds) { - bounds = tileBounds; - } - else { - bounds = bounds.combine(tileBounds); - } - } - } - return bounds !== null && bounds !== void 0 ? bounds : new excalibur__WEBPACK_IMPORTED_MODULE_10__.BoundingBox(); - } - addToScene(scene, options) { - var _a, _b; - const { pos, useLevelOffsets } = { pos: (0,excalibur__WEBPACK_IMPORTED_MODULE_10__.vec)(0, 0), useLevelOffsets: true, ...options }; - for (let [id, level] of this.levels.entries()) { - if ((_a = options === null || options === void 0 ? void 0 : options.levelFilter) === null || _a === void 0 ? void 0 : _a.length) { - if (!options.levelFilter.includes(level.ldtkLevel.identifier)) { - continue; - } - } - for (let layer of level.layers) { - if (layer instanceof _tile_layer__WEBPACK_IMPORTED_MODULE_0__.TileLayer || layer instanceof _intgrid_layer__WEBPACK_IMPORTED_MODULE_9__.IntGridLayer) { - layer.tilemap.pos = layer.tilemap.pos.add(pos); - if (!useLevelOffsets) { - layer.tilemap.pos = layer.tilemap.pos.sub(layer.worldPos); - } - scene.add(layer.tilemap); - } - else { - layer.runFactories(); - for (let entity of layer.entities) { - const tx = entity.get(excalibur__WEBPACK_IMPORTED_MODULE_10__.TransformComponent); - if (tx) { - tx.pos = tx.pos.add(pos); - if (!useLevelOffsets) { - tx.pos = tx.pos.sub(layer.worldPos); - } - } - scene.add(entity); - } - } - } - } - if (this.useExcaliburWiring) { - const camera = this.getLdtkEntitiesByField('camera', true)[0]; - if (camera) { - scene.camera.pos = (0,excalibur__WEBPACK_IMPORTED_MODULE_10__.vec)(camera.px[0], camera.px[0]); - const zoom = camera.fieldInstances.find(f => f.__identifier.toLocaleLowerCase() === 'zoom'); - if (zoom) { - scene.camera.zoom = +zoom.__value; - } - } - } - if (this.useTilemapCameraStrategy) { - let bounds = this.getLevelBounds(options === null || options === void 0 ? void 0 : options.levelFilter); - scene.camera.strategy.limitCameraBounds(bounds); - } - if (this.useMapBackgroundColor) { - for (let [id, level] of this.levels.entries()) { - if ((_b = options === null || options === void 0 ? void 0 : options.levelFilter) === null || _b === void 0 ? void 0 : _b.length) { - if (!options.levelFilter.includes(level.ldtkLevel.identifier)) { - continue; - } - } - scene.backgroundColor = level.backgroundColor; - break; - } - } - } -} -LdtkResource.supportedLdtkVersion = "1.5.3"; - - -/***/ }), - -/***/ "./src/level-resource.ts": -/*!*******************************!*\ - !*** ./src/level-resource.ts ***! - \*******************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ LevelResource: () => (/* binding */ LevelResource) -/* harmony export */ }); -/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); -/* harmony import */ var _loader_cache__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./loader-cache */ "./src/loader-cache.ts"); -/* harmony import */ var _file_loader__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./file-loader */ "./src/file-loader.ts"); -/* harmony import */ var _level__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./level */ "./src/level.ts"); -/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./types */ "./src/types.ts"); - - - - - -/** - * Loads LDtk levels that are stored in separate files - */ -class LevelResource { - constructor(path, resource, options) { - this.path = path; - this.resource = resource; - this.fileLoader = _file_loader__WEBPACK_IMPORTED_MODULE_1__.FetchLoader; - this.strict = true; - this.headless = false; - const { headless, strict, fileLoader, imageLoader, pathMap } = { ...options }; - this.fileLoader = fileLoader !== null && fileLoader !== void 0 ? fileLoader : this.fileLoader; - this.strict = strict !== null && strict !== void 0 ? strict : this.strict; - this.headless = headless !== null && headless !== void 0 ? headless : this.headless; - this.imageLoader = imageLoader !== null && imageLoader !== void 0 ? imageLoader : new _loader_cache__WEBPACK_IMPORTED_MODULE_0__.LoaderCache(excalibur__WEBPACK_IMPORTED_MODULE_4__.ImageSource); - this.pathMap = pathMap !== null && pathMap !== void 0 ? pathMap : this.pathMap; - } - async load() { - const data = await this.fileLoader(this.path, 'json'); - let level; - if (this.strict) { - try { - level = _types__WEBPACK_IMPORTED_MODULE_3__.LdtkLevel.parse(data); - } - catch (e) { - console.error(`Could not parse LDtk level data at ${this.path} are you sure a level is there and not corrupt?`); - throw e; - } - } - else { - level = data; - } - return this.data = new _level__WEBPACK_IMPORTED_MODULE_2__.Level(level, this.resource); - } - isLoaded() { - return !!this.data; - } -} - - -/***/ }), - -/***/ "./src/level.ts": -/*!**********************!*\ - !*** ./src/level.ts ***! - \**********************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ Level: () => (/* binding */ Level) -/* harmony export */ }); -/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); -/* harmony import */ var _entity_layer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./entity-layer */ "./src/entity-layer.ts"); -/* harmony import */ var _intgrid_layer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./intgrid-layer */ "./src/intgrid-layer.ts"); -/* harmony import */ var _tile_layer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tile-layer */ "./src/tile-layer.ts"); - - - - -class Level { - constructor(ldtkLevel, resource) { - var _a, _b, _c, _d; - this.ldtkLevel = ldtkLevel; - this.resource = resource; - this.layers = []; - if (ldtkLevel.__bgColor) { - this.backgroundColor = excalibur__WEBPACK_IMPORTED_MODULE_3__.Color.fromHex(ldtkLevel.__bgColor); - } - if (ldtkLevel.layerInstances) { - let order = resource.startZIndex; - let layers = ldtkLevel.layerInstances.slice().reverse(); - for (let layer of layers) { - if (((_a = layer.entityInstances) === null || _a === void 0 ? void 0 : _a.length) !== 0) { - this.layers.push(new _entity_layer__WEBPACK_IMPORTED_MODULE_0__.EntityLayer(this, layer, resource, order)); - } - if (((_b = layer.gridTiles) === null || _b === void 0 ? void 0 : _b.length) !== 0) { - this.layers.push(new _tile_layer__WEBPACK_IMPORTED_MODULE_2__.TileLayer(this, layer, resource, order)); - } - // Includes standard IntGrid, IntGrid w/ AutoTile & AutoTile layers - if (((_c = layer.intGridCsv) === null || _c === void 0 ? void 0 : _c.length) !== 0 || ((_d = layer.autoLayerTiles) === null || _d === void 0 ? void 0 : _d.length) !== 0) { - this.layers.push(new _intgrid_layer__WEBPACK_IMPORTED_MODULE_1__.IntGridLayer(this, layer, resource, order)); - } - order++; - } - } - } -} - - -/***/ }), - -/***/ "./src/loader-cache.ts": -/*!*****************************!*\ - !*** ./src/loader-cache.ts ***! - \*****************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ LoaderCache: () => (/* binding */ LoaderCache) -/* harmony export */ }); -/** - * Read through cache for loadables - */ -class LoaderCache { - constructor(type) { - this.type = type; - this._loaded = false; - this.cache = new Map(); - } - getOrAdd(...args) { - let resource = this.cache.get(args.join('+')); - if (resource) { - return resource; - } - resource = new this.type(...args); - this.cache.set(args.join('+'), resource); - return resource; - } - values() { - if (this._loaded) { - return Array.from(this.cache.values()); - } - throw new Error(`Read through cache not yet loaded! No values to return!`); - } - async load() { - const resources = Array.from(this.cache.entries()); - const results = await Promise.allSettled(resources.map(i => i[1].load())); - // Check for errors loading resources - let errored = 0; - for (let i = 0; i < results.length; i++) { - const result = results[i]; - if (result.status === 'rejected') { - console.error(`Error loading resource at ${resources[i][0]}, is your pathMap correct? or your LDtk map corrupted?`, result.reason); - errored++; - } - } - if (errored) { - throw new Error(`Error loading ${errored} resources`); - } - this._loaded = true; - } -} - - -/***/ }), - -/***/ "./src/path-util.ts": -/*!**************************!*\ - !*** ./src/path-util.ts ***! - \**************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ filenameFromPath: () => (/* binding */ filenameFromPath), -/* harmony export */ mapPath: () => (/* binding */ mapPath), -/* harmony export */ pathInMap: () => (/* binding */ pathInMap), -/* harmony export */ pathRelativeToBase: () => (/* binding */ pathRelativeToBase) -/* harmony export */ }); -function filenameFromPath(inputPath) { - const filenameExpression = /[^/\\&\?]+\.\w{2,4}(?=([\#\?&].*$|$))/ig; - const matches = inputPath.match(filenameExpression); - if (matches) { - const match = matches[0]; - return match; - } - throw new Error(`Could not locate filename from path: ${inputPath}`); -} -function mapPath(inputPath, pathMap) { - for (const { path, output } of pathMap) { - if (typeof path === 'string') { - if (inputPath.includes(path)) { - return output; - } - } - else { - const match = inputPath.match(path); - if (match) { - return output.replace('[match]', match[0]); - ; - } - } - } - return inputPath; -} -function pathInMap(inputPath, pathMap) { - if (!pathMap) - return false; - for (const { path, output } of pathMap) { - if (typeof path === 'string') { - if (inputPath.includes(path)) { - return true; - } - } - else { - const match = inputPath.match(path); - if (match) { - return true; - } - } - } - return false; -} -function pathRelativeToBase(basePath, relativeToBase, pathMap) { - if (pathInMap(relativeToBase, pathMap) && pathMap) { - return mapPath(relativeToBase, pathMap); - } - // Use absolute path if specified - if (relativeToBase.indexOf('/') === 0) { - return relativeToBase; - } - const originSplit = basePath.split('/'); - const relativeSplit = relativeToBase.split('/'); - // if origin path is a file, remove it so it's a directory - if (originSplit[originSplit.length - 1].includes('.')) { - originSplit.pop(); - } - return originSplit.concat(relativeSplit).join('/'); -} - - -/***/ }), - -/***/ "./src/tile-layer.ts": -/*!***************************!*\ - !*** ./src/tile-layer.ts ***! - \***************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ TileLayer: () => (/* binding */ TileLayer) -/* harmony export */ }); -/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); - -class TileLayer { - constructor(level, ldtkLayer, resource, order) { - var _a, _b, _c, _d; - this.order = order; - this.worldPos = (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(level.ldtkLevel.worldX, level.ldtkLevel.worldY); - this.offset = (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(ldtkLayer.__pxTotalOffsetX, ldtkLayer.__pxTotalOffsetY); - this.ldtkLayer = ldtkLayer; - this.tilemap = new excalibur__WEBPACK_IMPORTED_MODULE_0__.TileMap({ - name: ldtkLayer.__identifier, - pos: this.worldPos.add(this.offset), - tileWidth: ldtkLayer.__gridSize, - tileHeight: ldtkLayer.__gridSize, - rows: ldtkLayer.__cHei, - columns: ldtkLayer.__cWid, - }); - this.tilemap.z = order; - const graphics = this.tilemap.get(excalibur__WEBPACK_IMPORTED_MODULE_0__.GraphicsComponent); - graphics.isVisible = ldtkLayer.visible; - if (ldtkLayer.__tilesetDefUid) { - this.tileset = resource.tilesets.get(ldtkLayer.__tilesetDefUid); - for (let tile of ldtkLayer.gridTiles) { - const xCoord = Math.floor(tile.px[0] / ldtkLayer.__gridSize); - const yCoord = Math.floor(tile.px[1] / ldtkLayer.__gridSize); - const exTile = this.tilemap.getTile(xCoord, yCoord); - if (this.tileset) { - const tsxCoord = Math.floor((tile.src[0] - ((_a = this.tileset.ldtkTileset.padding) !== null && _a !== void 0 ? _a : 0)) / (this.tileset.ldtkTileset.tileGridSize + ((_b = this.tileset.ldtkTileset.spacing) !== null && _b !== void 0 ? _b : 0))); - const tsyCoord = Math.floor((tile.src[1] - ((_c = this.tileset.ldtkTileset.padding) !== null && _c !== void 0 ? _c : 0)) / (this.tileset.ldtkTileset.tileGridSize + ((_d = this.tileset.ldtkTileset.spacing) !== null && _d !== void 0 ? _d : 0))); - // Bit 0 toggles x flip - // Bit 1 toggles 1 flip - // Examples: f=0 (no flip), f=1 (X flip only), f=2 (Y flip only), f=3 (both flips) - const flipHorizontal = !!(tile.f & 0b01); - const flipVertical = !!(tile.f & 0b10); - let sprite = this.tileset.spritesheet.getSprite(tsxCoord, tsyCoord); - if (flipHorizontal || flipVertical) { - sprite = sprite.clone(); - sprite.flipHorizontal = flipHorizontal; - sprite.flipVertical = flipVertical; - } - if (sprite) { - exTile.addGraphic(sprite); - } - else { - console.error('Could not find sprite in LDtk spritesheet at', tsxCoord, tsyCoord); - } - } - } - } - else { - console.error('Could not tileset in LDtk', ldtkLayer.__tilesetDefUid, ldtkLayer.__tilesetRelPath); - } - } -} - - -/***/ }), - -/***/ "./src/tileset.ts": -/*!************************!*\ - !*** ./src/tileset.ts ***! - \************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ Tileset: () => (/* binding */ Tileset) -/* harmony export */ }); -/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); - -class Tileset { - constructor(options) { - var _a, _b, _c, _d; - const { image, ldtkTileset } = options; - this.image = image; - this.ldtkTileset = ldtkTileset; - this.spritesheet = excalibur__WEBPACK_IMPORTED_MODULE_0__.SpriteSheet.fromImageSource({ - image, - grid: { - rows: ldtkTileset.pxHei / ldtkTileset.tileGridSize, - columns: ldtkTileset.pxWid / ldtkTileset.tileGridSize, - spriteHeight: ldtkTileset.tileGridSize, - spriteWidth: ldtkTileset.tileGridSize - }, - spacing: { - margin: { - x: (_a = ldtkTileset.spacing) !== null && _a !== void 0 ? _a : 0, - y: (_b = ldtkTileset.spacing) !== null && _b !== void 0 ? _b : 0, - }, - originOffset: { - x: (_c = ldtkTileset.padding) !== null && _c !== void 0 ? _c : 0, - y: (_d = ldtkTileset.padding) !== null && _d !== void 0 ? _d : 0 - } - } - }); - } -} - - -/***/ }), - -/***/ "./src/types.ts": -/*!**********************!*\ - !*** ./src/types.ts ***! - \**********************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ LdtkEntityDefinition: () => (/* binding */ LdtkEntityDefinition), -/* harmony export */ LdtkEntityInstance: () => (/* binding */ LdtkEntityInstance), -/* harmony export */ LdtkLayerDefinition: () => (/* binding */ LdtkLayerDefinition), -/* harmony export */ LdtkLayerInstance: () => (/* binding */ LdtkLayerInstance), -/* harmony export */ LdtkLevel: () => (/* binding */ LdtkLevel), -/* harmony export */ LdtkProjectMetadata: () => (/* binding */ LdtkProjectMetadata) -/* harmony export */ }); -/* harmony import */ var zod__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! zod */ "./node_modules/zod/lib/index.mjs"); - -const LdtkTilesetRectangle = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - h: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - tilesetUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - w: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - x: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - y: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() -}); -const LdtkPixel = zod__WEBPACK_IMPORTED_MODULE_0__.z.tuple([zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), zod__WEBPACK_IMPORTED_MODULE_0__.z.number()]); -const LdtkFieldInstance = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - __identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - __tile: LdtkTilesetRectangle.nullable(), - __type: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), //z.union([z.literal('Int'), z.literal('Float'), z.literal('String'), z.literal('Bool'), z.literal('Enum')]), // TODO this might not work with ENUM - __value: zod__WEBPACK_IMPORTED_MODULE_0__.z.any(), - defUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() -}); -const LdtkTileInstance = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - a: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - f: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), // 2-bit int 0bXY flip - px: LdtkPixel, - src: LdtkPixel, - t: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() -}); -const LdtkEntityInstance = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - __grid: LdtkPixel, - __identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - __pivot: LdtkPixel, - __smartColor: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - __tags: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.string()), - __tile: LdtkTilesetRectangle.nullable(), - __worldX: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), - __worldY: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), - defUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - fieldInstances: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkFieldInstance), - height: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - iid: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - px: LdtkPixel, - width: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() -}); -const LdtkLayerInstance = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - __cHei: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - __cWid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - __gridSize: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - __identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - __opacity: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - __pxTotalOffsetX: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - __pxTotalOffsetY: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - __tilesetDefUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), - __tilesetRelPath: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), - __type: zod__WEBPACK_IMPORTED_MODULE_0__.z.union([zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('IntGrid'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('Entities'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('Tiles'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('AutoLayer')]), - autoLayerTiles: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkTileInstance), // only in auto layers - entityInstances: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkEntityInstance), // only in entity layers - gridTiles: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkTileInstance), - iid: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - intGridCsv: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.number()), // __cWid x __cHei, 0 means empty, values start at 1 - layerDefUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - levelId: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - overrideTilesetUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), - pxOffsetX: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - pxOffsetY: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - visible: zod__WEBPACK_IMPORTED_MODULE_0__.z.boolean() -}); -const LdtkLevel = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - __bgColor: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), - bgColor: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), - __bgPos: zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - cropRect: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.tuple([zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), zod__WEBPACK_IMPORTED_MODULE_0__.z.number()])), // cropX, cropY, cropWidth, cropHeight - scale: zod__WEBPACK_IMPORTED_MODULE_0__.z.tuple([zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), zod__WEBPACK_IMPORTED_MODULE_0__.z.number()]), - topLeftPx: LdtkPixel - }).nullable(), - __neighbours: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - dir: zod__WEBPACK_IMPORTED_MODULE_0__.z.union([zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('n'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('s'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('w'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('e'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('ne'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('nw'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('se'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('sw'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('o'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('<'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('>')]), - levelIid: zod__WEBPACK_IMPORTED_MODULE_0__.z.string() - })), - bgRelPath: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), - externalRelPath: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), - fieldInstances: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkFieldInstance), - identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - iid: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - layerInstances: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkLayerInstance).nullable(), // null if the save levels separately is enabled - pxHei: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - pxWid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - uid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - worldDepth: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - worldX: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - worldY: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() -}); -const LdtkWorld = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - iid: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - levels: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkLevel), - worldGridHeight: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - worldGridWidth: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - // TODO is this a typo Vania? - worldLayout: zod__WEBPACK_IMPORTED_MODULE_0__.z.union([zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('Free'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('GridVania'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('LinearHorizontal'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('LinearVertical')]), -}); -const LdtkEnumValueDefinition = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - color: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - id: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - tileRect: LdtkTilesetRectangle.nullable() -}); -const LdtkEnumDefinition = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - externalRelPath: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), - iconTilesetUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), - identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - tags: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.string()), - uid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - values: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkEnumValueDefinition) -}); -const LdtkTilesetDefinition = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - __cHei: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - __cWid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - customData: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - data: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - tileId: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() - })), - embedAtlas: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), - enumTags: zod__WEBPACK_IMPORTED_MODULE_0__.z.optional(zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - enumValueId: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - tileIds: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.number()) - }))), - identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - padding: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - pxHei: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - pxWid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - relPath: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), - spacing: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - tags: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.string()), - tagsSourceEnumUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), - tileGridSize: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - uid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() -}); -const LdtkLayerDefinition = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - __type: zod__WEBPACK_IMPORTED_MODULE_0__.z.union([zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("IntGrid"), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("Entities"), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("Tiles"), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("AutoLayer")]), - autoSourceLayerDefUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), - displayOpacity: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - gridSize: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - intGridValues: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - color: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - groupUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), - tile: LdtkTilesetRectangle.nullable(), - value: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() - })), - intGridValuesGroups: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - color: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), - identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), - uid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() - })), - parallaxFactorX: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - parallaxFactorY: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - parallaxScaling: zod__WEBPACK_IMPORTED_MODULE_0__.z.boolean(), - pxOffsetX: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - pxOffsetY: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - tilesetDefUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), - uid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), -}); -const LdtkEntityDefinition = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - color: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - height: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - nineSliceBorders: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.number()), - pivotX: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - pivotY: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - tileRect: LdtkTilesetRectangle.nullable(), - tileRenderMode: zod__WEBPACK_IMPORTED_MODULE_0__.z.union([ - zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("Cover"), - zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("FitInside"), - zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("Repeat"), - zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("Stretch"), - zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("FullSizeCropped"), - zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("FullSizeUncropped"), - zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("NineSlice") - ]), - tilesetId: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), - uiTileRect: LdtkTilesetRectangle.nullable(), - uid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - width: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() -}); -const LdtkDefinitions = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - tilesets: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkTilesetDefinition), - enums: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkEnumDefinition), - layers: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkLayerDefinition), - entities: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkEntityDefinition) -}); -const LdtkProjectMetadata = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - iid: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - bgColor: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), - defs: LdtkDefinitions, - externalLevels: zod__WEBPACK_IMPORTED_MODULE_0__.z.boolean(), - jsonVersion: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - levels: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkLevel), - toc: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - instancesData: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - fields: zod__WEBPACK_IMPORTED_MODULE_0__.z.any(), - heiPx: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - iids: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - widPix: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - worldX: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - worldY: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() - })) - })), - // Moving to worlds array - worldGridHeight: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), - worldGridWidth: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), - // TODO is this a LDtk docs typo Vania? - worldLayout: zod__WEBPACK_IMPORTED_MODULE_0__.z.union([zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('Free'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('GridVania'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('LinearHorizontal'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('LinearVertical')]).nullable(), - worlds: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkWorld) -}); - - -/***/ }), - -/***/ "./node_modules/zod/lib/index.mjs": -/*!****************************************!*\ - !*** ./node_modules/zod/lib/index.mjs ***! - \****************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ BRAND: () => (/* binding */ BRAND), -/* harmony export */ DIRTY: () => (/* binding */ DIRTY), -/* harmony export */ EMPTY_PATH: () => (/* binding */ EMPTY_PATH), -/* harmony export */ INVALID: () => (/* binding */ INVALID), -/* harmony export */ NEVER: () => (/* binding */ NEVER), -/* harmony export */ OK: () => (/* binding */ OK), -/* harmony export */ ParseStatus: () => (/* binding */ ParseStatus), -/* harmony export */ Schema: () => (/* binding */ ZodType), -/* harmony export */ ZodAny: () => (/* binding */ ZodAny), -/* harmony export */ ZodArray: () => (/* binding */ ZodArray), -/* harmony export */ ZodBigInt: () => (/* binding */ ZodBigInt), -/* harmony export */ ZodBoolean: () => (/* binding */ ZodBoolean), -/* harmony export */ ZodBranded: () => (/* binding */ ZodBranded), -/* harmony export */ ZodCatch: () => (/* binding */ ZodCatch), -/* harmony export */ ZodDate: () => (/* binding */ ZodDate), -/* harmony export */ ZodDefault: () => (/* binding */ ZodDefault), -/* harmony export */ ZodDiscriminatedUnion: () => (/* binding */ ZodDiscriminatedUnion), -/* harmony export */ ZodEffects: () => (/* binding */ ZodEffects), -/* harmony export */ ZodEnum: () => (/* binding */ ZodEnum), -/* harmony export */ ZodError: () => (/* binding */ ZodError), -/* harmony export */ ZodFirstPartyTypeKind: () => (/* binding */ ZodFirstPartyTypeKind), -/* harmony export */ ZodFunction: () => (/* binding */ ZodFunction), -/* harmony export */ ZodIntersection: () => (/* binding */ ZodIntersection), -/* harmony export */ ZodIssueCode: () => (/* binding */ ZodIssueCode), -/* harmony export */ ZodLazy: () => (/* binding */ ZodLazy), -/* harmony export */ ZodLiteral: () => (/* binding */ ZodLiteral), -/* harmony export */ ZodMap: () => (/* binding */ ZodMap), -/* harmony export */ ZodNaN: () => (/* binding */ ZodNaN), -/* harmony export */ ZodNativeEnum: () => (/* binding */ ZodNativeEnum), -/* harmony export */ ZodNever: () => (/* binding */ ZodNever), -/* harmony export */ ZodNull: () => (/* binding */ ZodNull), -/* harmony export */ ZodNullable: () => (/* binding */ ZodNullable), -/* harmony export */ ZodNumber: () => (/* binding */ ZodNumber), -/* harmony export */ ZodObject: () => (/* binding */ ZodObject), -/* harmony export */ ZodOptional: () => (/* binding */ ZodOptional), -/* harmony export */ ZodParsedType: () => (/* binding */ ZodParsedType), -/* harmony export */ ZodPipeline: () => (/* binding */ ZodPipeline), -/* harmony export */ ZodPromise: () => (/* binding */ ZodPromise), -/* harmony export */ ZodReadonly: () => (/* binding */ ZodReadonly), -/* harmony export */ ZodRecord: () => (/* binding */ ZodRecord), -/* harmony export */ ZodSchema: () => (/* binding */ ZodType), -/* harmony export */ ZodSet: () => (/* binding */ ZodSet), -/* harmony export */ ZodString: () => (/* binding */ ZodString), -/* harmony export */ ZodSymbol: () => (/* binding */ ZodSymbol), -/* harmony export */ ZodTransformer: () => (/* binding */ ZodEffects), -/* harmony export */ ZodTuple: () => (/* binding */ ZodTuple), -/* harmony export */ ZodType: () => (/* binding */ ZodType), -/* harmony export */ ZodUndefined: () => (/* binding */ ZodUndefined), -/* harmony export */ ZodUnion: () => (/* binding */ ZodUnion), -/* harmony export */ ZodUnknown: () => (/* binding */ ZodUnknown), -/* harmony export */ ZodVoid: () => (/* binding */ ZodVoid), -/* harmony export */ addIssueToContext: () => (/* binding */ addIssueToContext), -/* harmony export */ any: () => (/* binding */ anyType), -/* harmony export */ array: () => (/* binding */ arrayType), -/* harmony export */ bigint: () => (/* binding */ bigIntType), -/* harmony export */ boolean: () => (/* binding */ booleanType), -/* harmony export */ coerce: () => (/* binding */ coerce), -/* harmony export */ custom: () => (/* binding */ custom), -/* harmony export */ date: () => (/* binding */ dateType), -/* harmony export */ datetimeRegex: () => (/* binding */ datetimeRegex), -/* harmony export */ "default": () => (/* binding */ z), -/* harmony export */ defaultErrorMap: () => (/* binding */ errorMap), -/* harmony export */ discriminatedUnion: () => (/* binding */ discriminatedUnionType), -/* harmony export */ effect: () => (/* binding */ effectsType), -/* harmony export */ "enum": () => (/* binding */ enumType), -/* harmony export */ "function": () => (/* binding */ functionType), -/* harmony export */ getErrorMap: () => (/* binding */ getErrorMap), -/* harmony export */ getParsedType: () => (/* binding */ getParsedType), -/* harmony export */ "instanceof": () => (/* binding */ instanceOfType), -/* harmony export */ intersection: () => (/* binding */ intersectionType), -/* harmony export */ isAborted: () => (/* binding */ isAborted), -/* harmony export */ isAsync: () => (/* binding */ isAsync), -/* harmony export */ isDirty: () => (/* binding */ isDirty), -/* harmony export */ isValid: () => (/* binding */ isValid), -/* harmony export */ late: () => (/* binding */ late), -/* harmony export */ lazy: () => (/* binding */ lazyType), -/* harmony export */ literal: () => (/* binding */ literalType), -/* harmony export */ makeIssue: () => (/* binding */ makeIssue), -/* harmony export */ map: () => (/* binding */ mapType), -/* harmony export */ nan: () => (/* binding */ nanType), -/* harmony export */ nativeEnum: () => (/* binding */ nativeEnumType), -/* harmony export */ never: () => (/* binding */ neverType), -/* harmony export */ "null": () => (/* binding */ nullType), -/* harmony export */ nullable: () => (/* binding */ nullableType), -/* harmony export */ number: () => (/* binding */ numberType), -/* harmony export */ object: () => (/* binding */ objectType), -/* harmony export */ objectUtil: () => (/* binding */ objectUtil), -/* harmony export */ oboolean: () => (/* binding */ oboolean), -/* harmony export */ onumber: () => (/* binding */ onumber), -/* harmony export */ optional: () => (/* binding */ optionalType), -/* harmony export */ ostring: () => (/* binding */ ostring), -/* harmony export */ pipeline: () => (/* binding */ pipelineType), -/* harmony export */ preprocess: () => (/* binding */ preprocessType), -/* harmony export */ promise: () => (/* binding */ promiseType), -/* harmony export */ quotelessJson: () => (/* binding */ quotelessJson), -/* harmony export */ record: () => (/* binding */ recordType), -/* harmony export */ set: () => (/* binding */ setType), -/* harmony export */ setErrorMap: () => (/* binding */ setErrorMap), -/* harmony export */ strictObject: () => (/* binding */ strictObjectType), -/* harmony export */ string: () => (/* binding */ stringType), -/* harmony export */ symbol: () => (/* binding */ symbolType), -/* harmony export */ transformer: () => (/* binding */ effectsType), -/* harmony export */ tuple: () => (/* binding */ tupleType), -/* harmony export */ undefined: () => (/* binding */ undefinedType), -/* harmony export */ union: () => (/* binding */ unionType), -/* harmony export */ unknown: () => (/* binding */ unknownType), -/* harmony export */ util: () => (/* binding */ util), -/* harmony export */ "void": () => (/* binding */ voidType), -/* harmony export */ z: () => (/* binding */ z) -/* harmony export */ }); -var util; -(function (util) { - util.assertEqual = (val) => val; - function assertIs(_arg) { } - util.assertIs = assertIs; - function assertNever(_x) { - throw new Error(); - } - util.assertNever = assertNever; - util.arrayToEnum = (items) => { - const obj = {}; - for (const item of items) { - obj[item] = item; - } - return obj; - }; - util.getValidEnumValues = (obj) => { - const validKeys = util.objectKeys(obj).filter((k) => typeof obj[obj[k]] !== "number"); - const filtered = {}; - for (const k of validKeys) { - filtered[k] = obj[k]; - } - return util.objectValues(filtered); - }; - util.objectValues = (obj) => { - return util.objectKeys(obj).map(function (e) { - return obj[e]; - }); - }; - util.objectKeys = typeof Object.keys === "function" // eslint-disable-line ban/ban - ? (obj) => Object.keys(obj) // eslint-disable-line ban/ban - : (object) => { - const keys = []; - for (const key in object) { - if (Object.prototype.hasOwnProperty.call(object, key)) { - keys.push(key); - } - } - return keys; - }; - util.find = (arr, checker) => { - for (const item of arr) { - if (checker(item)) - return item; - } - return undefined; - }; - util.isInteger = typeof Number.isInteger === "function" - ? (val) => Number.isInteger(val) // eslint-disable-line ban/ban - : (val) => typeof val === "number" && isFinite(val) && Math.floor(val) === val; - function joinValues(array, separator = " | ") { - return array - .map((val) => (typeof val === "string" ? `'${val}'` : val)) - .join(separator); - } - util.joinValues = joinValues; - util.jsonStringifyReplacer = (_, value) => { - if (typeof value === "bigint") { - return value.toString(); - } - return value; - }; -})(util || (util = {})); -var objectUtil; -(function (objectUtil) { - objectUtil.mergeShapes = (first, second) => { - return { - ...first, - ...second, // second overwrites first - }; - }; -})(objectUtil || (objectUtil = {})); -const ZodParsedType = util.arrayToEnum([ - "string", - "nan", - "number", - "integer", - "float", - "boolean", - "date", - "bigint", - "symbol", - "function", - "undefined", - "null", - "array", - "object", - "unknown", - "promise", - "void", - "never", - "map", - "set", -]); -const getParsedType = (data) => { - const t = typeof data; - switch (t) { - case "undefined": - return ZodParsedType.undefined; - case "string": - return ZodParsedType.string; - case "number": - return isNaN(data) ? ZodParsedType.nan : ZodParsedType.number; - case "boolean": - return ZodParsedType.boolean; - case "function": - return ZodParsedType.function; - case "bigint": - return ZodParsedType.bigint; - case "symbol": - return ZodParsedType.symbol; - case "object": - if (Array.isArray(data)) { - return ZodParsedType.array; - } - if (data === null) { - return ZodParsedType.null; - } - if (data.then && - typeof data.then === "function" && - data.catch && - typeof data.catch === "function") { - return ZodParsedType.promise; - } - if (typeof Map !== "undefined" && data instanceof Map) { - return ZodParsedType.map; - } - if (typeof Set !== "undefined" && data instanceof Set) { - return ZodParsedType.set; - } - if (typeof Date !== "undefined" && data instanceof Date) { - return ZodParsedType.date; - } - return ZodParsedType.object; - default: - return ZodParsedType.unknown; - } -}; - -const ZodIssueCode = util.arrayToEnum([ - "invalid_type", - "invalid_literal", - "custom", - "invalid_union", - "invalid_union_discriminator", - "invalid_enum_value", - "unrecognized_keys", - "invalid_arguments", - "invalid_return_type", - "invalid_date", - "invalid_string", - "too_small", - "too_big", - "invalid_intersection_types", - "not_multiple_of", - "not_finite", -]); -const quotelessJson = (obj) => { - const json = JSON.stringify(obj, null, 2); - return json.replace(/"([^"]+)":/g, "$1:"); -}; -class ZodError extends Error { - get errors() { - return this.issues; - } - constructor(issues) { - super(); - this.issues = []; - this.addIssue = (sub) => { - this.issues = [...this.issues, sub]; - }; - this.addIssues = (subs = []) => { - this.issues = [...this.issues, ...subs]; - }; - const actualProto = new.target.prototype; - if (Object.setPrototypeOf) { - // eslint-disable-next-line ban/ban - Object.setPrototypeOf(this, actualProto); - } - else { - this.__proto__ = actualProto; - } - this.name = "ZodError"; - this.issues = issues; - } - format(_mapper) { - const mapper = _mapper || - function (issue) { - return issue.message; - }; - const fieldErrors = { _errors: [] }; - const processError = (error) => { - for (const issue of error.issues) { - if (issue.code === "invalid_union") { - issue.unionErrors.map(processError); - } - else if (issue.code === "invalid_return_type") { - processError(issue.returnTypeError); - } - else if (issue.code === "invalid_arguments") { - processError(issue.argumentsError); - } - else if (issue.path.length === 0) { - fieldErrors._errors.push(mapper(issue)); - } - else { - let curr = fieldErrors; - let i = 0; - while (i < issue.path.length) { - const el = issue.path[i]; - const terminal = i === issue.path.length - 1; - if (!terminal) { - curr[el] = curr[el] || { _errors: [] }; - // if (typeof el === "string") { - // curr[el] = curr[el] || { _errors: [] }; - // } else if (typeof el === "number") { - // const errorArray: any = []; - // errorArray._errors = []; - // curr[el] = curr[el] || errorArray; - // } - } - else { - curr[el] = curr[el] || { _errors: [] }; - curr[el]._errors.push(mapper(issue)); - } - curr = curr[el]; - i++; - } - } - } - }; - processError(this); - return fieldErrors; - } - static assert(value) { - if (!(value instanceof ZodError)) { - throw new Error(`Not a ZodError: ${value}`); - } - } - toString() { - return this.message; - } - get message() { - return JSON.stringify(this.issues, util.jsonStringifyReplacer, 2); - } - get isEmpty() { - return this.issues.length === 0; - } - flatten(mapper = (issue) => issue.message) { - const fieldErrors = {}; - const formErrors = []; - for (const sub of this.issues) { - if (sub.path.length > 0) { - fieldErrors[sub.path[0]] = fieldErrors[sub.path[0]] || []; - fieldErrors[sub.path[0]].push(mapper(sub)); - } - else { - formErrors.push(mapper(sub)); - } - } - return { formErrors, fieldErrors }; + return { formErrors, fieldErrors }; } get formErrors() { return this.flatten(); @@ -44370,37 +43040,37 @@ const isDirty = (x) => x.status === "dirty"; const isValid = (x) => x.status === "valid"; const isAsync = (x) => typeof Promise !== "undefined" && x instanceof Promise; -/****************************************************************************** -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. -***************************************************************************** */ - -function __classPrivateFieldGet(receiver, state, kind, f) { - if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); - return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); -} - -function __classPrivateFieldSet(receiver, state, value, kind, f) { - if (kind === "m") throw new TypeError("Private method is not writable"); - if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); - return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; -} - -typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) { - var e = new Error(message); - return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e; +/****************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ + +function __classPrivateFieldGet(receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); +} + +function __classPrivateFieldSet(receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; +} + +typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) { + var e = new Error(message); + return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e; }; var errorUtil; @@ -45325,115 +43995,550 @@ class ZodString extends ZodType { ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message), }); } - startsWith(value, message) { - return this._addCheck({ - kind: "startsWith", - value: value, - ...errorUtil.errToObj(message), + startsWith(value, message) { + return this._addCheck({ + kind: "startsWith", + value: value, + ...errorUtil.errToObj(message), + }); + } + endsWith(value, message) { + return this._addCheck({ + kind: "endsWith", + value: value, + ...errorUtil.errToObj(message), + }); + } + min(minLength, message) { + return this._addCheck({ + kind: "min", + value: minLength, + ...errorUtil.errToObj(message), + }); + } + max(maxLength, message) { + return this._addCheck({ + kind: "max", + value: maxLength, + ...errorUtil.errToObj(message), + }); + } + length(len, message) { + return this._addCheck({ + kind: "length", + value: len, + ...errorUtil.errToObj(message), + }); + } + /** + * Equivalent to `.min(1)` + */ + nonempty(message) { + return this.min(1, errorUtil.errToObj(message)); + } + trim() { + return new ZodString({ + ...this._def, + checks: [...this._def.checks, { kind: "trim" }], + }); + } + toLowerCase() { + return new ZodString({ + ...this._def, + checks: [...this._def.checks, { kind: "toLowerCase" }], + }); + } + toUpperCase() { + return new ZodString({ + ...this._def, + checks: [...this._def.checks, { kind: "toUpperCase" }], + }); + } + get isDatetime() { + return !!this._def.checks.find((ch) => ch.kind === "datetime"); + } + get isDate() { + return !!this._def.checks.find((ch) => ch.kind === "date"); + } + get isTime() { + return !!this._def.checks.find((ch) => ch.kind === "time"); + } + get isDuration() { + return !!this._def.checks.find((ch) => ch.kind === "duration"); + } + get isEmail() { + return !!this._def.checks.find((ch) => ch.kind === "email"); + } + get isURL() { + return !!this._def.checks.find((ch) => ch.kind === "url"); + } + get isEmoji() { + return !!this._def.checks.find((ch) => ch.kind === "emoji"); + } + get isUUID() { + return !!this._def.checks.find((ch) => ch.kind === "uuid"); + } + get isNANOID() { + return !!this._def.checks.find((ch) => ch.kind === "nanoid"); + } + get isCUID() { + return !!this._def.checks.find((ch) => ch.kind === "cuid"); + } + get isCUID2() { + return !!this._def.checks.find((ch) => ch.kind === "cuid2"); + } + get isULID() { + return !!this._def.checks.find((ch) => ch.kind === "ulid"); + } + get isIP() { + return !!this._def.checks.find((ch) => ch.kind === "ip"); + } + get isCIDR() { + return !!this._def.checks.find((ch) => ch.kind === "cidr"); + } + get isBase64() { + return !!this._def.checks.find((ch) => ch.kind === "base64"); + } + get isBase64url() { + // base64url encoding is a modification of base64 that can safely be used in URLs and filenames + return !!this._def.checks.find((ch) => ch.kind === "base64url"); + } + get minLength() { + let min = null; + for (const ch of this._def.checks) { + if (ch.kind === "min") { + if (min === null || ch.value > min) + min = ch.value; + } + } + return min; + } + get maxLength() { + let max = null; + for (const ch of this._def.checks) { + if (ch.kind === "max") { + if (max === null || ch.value < max) + max = ch.value; + } + } + return max; + } +} +ZodString.create = (params) => { + var _a; + return new ZodString({ + checks: [], + typeName: ZodFirstPartyTypeKind.ZodString, + coerce: (_a = params === null || params === void 0 ? void 0 : params.coerce) !== null && _a !== void 0 ? _a : false, + ...processCreateParams(params), + }); +}; +// https://stackoverflow.com/questions/3966484/why-does-modulus-operator-return-fractional-number-in-javascript/31711034#31711034 +function floatSafeRemainder(val, step) { + const valDecCount = (val.toString().split(".")[1] || "").length; + const stepDecCount = (step.toString().split(".")[1] || "").length; + const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount; + const valInt = parseInt(val.toFixed(decCount).replace(".", "")); + const stepInt = parseInt(step.toFixed(decCount).replace(".", "")); + return (valInt % stepInt) / Math.pow(10, decCount); +} +class ZodNumber extends ZodType { + constructor() { + super(...arguments); + this.min = this.gte; + this.max = this.lte; + this.step = this.multipleOf; + } + _parse(input) { + if (this._def.coerce) { + input.data = Number(input.data); + } + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.number) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.number, + received: ctx.parsedType, + }); + return INVALID; + } + let ctx = undefined; + const status = new ParseStatus(); + for (const check of this._def.checks) { + if (check.kind === "int") { + if (!util.isInteger(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: "integer", + received: "float", + message: check.message, + }); + status.dirty(); + } + } + else if (check.kind === "min") { + const tooSmall = check.inclusive + ? input.data < check.value + : input.data <= check.value; + if (tooSmall) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + minimum: check.value, + type: "number", + inclusive: check.inclusive, + exact: false, + message: check.message, + }); + status.dirty(); + } + } + else if (check.kind === "max") { + const tooBig = check.inclusive + ? input.data > check.value + : input.data >= check.value; + if (tooBig) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + maximum: check.value, + type: "number", + inclusive: check.inclusive, + exact: false, + message: check.message, + }); + status.dirty(); + } + } + else if (check.kind === "multipleOf") { + if (floatSafeRemainder(input.data, check.value) !== 0) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.not_multiple_of, + multipleOf: check.value, + message: check.message, + }); + status.dirty(); + } + } + else if (check.kind === "finite") { + if (!Number.isFinite(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.not_finite, + message: check.message, + }); + status.dirty(); + } + } + else { + util.assertNever(check); + } + } + return { status: status.value, value: input.data }; + } + gte(value, message) { + return this.setLimit("min", value, true, errorUtil.toString(message)); + } + gt(value, message) { + return this.setLimit("min", value, false, errorUtil.toString(message)); + } + lte(value, message) { + return this.setLimit("max", value, true, errorUtil.toString(message)); + } + lt(value, message) { + return this.setLimit("max", value, false, errorUtil.toString(message)); + } + setLimit(kind, value, inclusive, message) { + return new ZodNumber({ + ...this._def, + checks: [ + ...this._def.checks, + { + kind, + value, + inclusive, + message: errorUtil.toString(message), + }, + ], + }); + } + _addCheck(check) { + return new ZodNumber({ + ...this._def, + checks: [...this._def.checks, check], + }); + } + int(message) { + return this._addCheck({ + kind: "int", + message: errorUtil.toString(message), + }); + } + positive(message) { + return this._addCheck({ + kind: "min", + value: 0, + inclusive: false, + message: errorUtil.toString(message), + }); + } + negative(message) { + return this._addCheck({ + kind: "max", + value: 0, + inclusive: false, + message: errorUtil.toString(message), + }); + } + nonpositive(message) { + return this._addCheck({ + kind: "max", + value: 0, + inclusive: true, + message: errorUtil.toString(message), + }); + } + nonnegative(message) { + return this._addCheck({ + kind: "min", + value: 0, + inclusive: true, + message: errorUtil.toString(message), + }); + } + multipleOf(value, message) { + return this._addCheck({ + kind: "multipleOf", + value: value, + message: errorUtil.toString(message), + }); + } + finite(message) { + return this._addCheck({ + kind: "finite", + message: errorUtil.toString(message), + }); + } + safe(message) { + return this._addCheck({ + kind: "min", + inclusive: true, + value: Number.MIN_SAFE_INTEGER, + message: errorUtil.toString(message), + })._addCheck({ + kind: "max", + inclusive: true, + value: Number.MAX_SAFE_INTEGER, + message: errorUtil.toString(message), + }); + } + get minValue() { + let min = null; + for (const ch of this._def.checks) { + if (ch.kind === "min") { + if (min === null || ch.value > min) + min = ch.value; + } + } + return min; + } + get maxValue() { + let max = null; + for (const ch of this._def.checks) { + if (ch.kind === "max") { + if (max === null || ch.value < max) + max = ch.value; + } + } + return max; + } + get isInt() { + return !!this._def.checks.find((ch) => ch.kind === "int" || + (ch.kind === "multipleOf" && util.isInteger(ch.value))); + } + get isFinite() { + let max = null, min = null; + for (const ch of this._def.checks) { + if (ch.kind === "finite" || + ch.kind === "int" || + ch.kind === "multipleOf") { + return true; + } + else if (ch.kind === "min") { + if (min === null || ch.value > min) + min = ch.value; + } + else if (ch.kind === "max") { + if (max === null || ch.value < max) + max = ch.value; + } + } + return Number.isFinite(min) && Number.isFinite(max); + } +} +ZodNumber.create = (params) => { + return new ZodNumber({ + checks: [], + typeName: ZodFirstPartyTypeKind.ZodNumber, + coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false, + ...processCreateParams(params), + }); +}; +class ZodBigInt extends ZodType { + constructor() { + super(...arguments); + this.min = this.gte; + this.max = this.lte; + } + _parse(input) { + if (this._def.coerce) { + try { + input.data = BigInt(input.data); + } + catch (_a) { + return this._getInvalidInput(input); + } + } + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.bigint) { + return this._getInvalidInput(input); + } + let ctx = undefined; + const status = new ParseStatus(); + for (const check of this._def.checks) { + if (check.kind === "min") { + const tooSmall = check.inclusive + ? input.data < check.value + : input.data <= check.value; + if (tooSmall) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + type: "bigint", + minimum: check.value, + inclusive: check.inclusive, + message: check.message, + }); + status.dirty(); + } + } + else if (check.kind === "max") { + const tooBig = check.inclusive + ? input.data > check.value + : input.data >= check.value; + if (tooBig) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + type: "bigint", + maximum: check.value, + inclusive: check.inclusive, + message: check.message, + }); + status.dirty(); + } + } + else if (check.kind === "multipleOf") { + if (input.data % check.value !== BigInt(0)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.not_multiple_of, + multipleOf: check.value, + message: check.message, + }); + status.dirty(); + } + } + else { + util.assertNever(check); + } + } + return { status: status.value, value: input.data }; + } + _getInvalidInput(input) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.bigint, + received: ctx.parsedType, + }); + return INVALID; + } + gte(value, message) { + return this.setLimit("min", value, true, errorUtil.toString(message)); + } + gt(value, message) { + return this.setLimit("min", value, false, errorUtil.toString(message)); + } + lte(value, message) { + return this.setLimit("max", value, true, errorUtil.toString(message)); + } + lt(value, message) { + return this.setLimit("max", value, false, errorUtil.toString(message)); + } + setLimit(kind, value, inclusive, message) { + return new ZodBigInt({ + ...this._def, + checks: [ + ...this._def.checks, + { + kind, + value, + inclusive, + message: errorUtil.toString(message), + }, + ], }); } - endsWith(value, message) { - return this._addCheck({ - kind: "endsWith", - value: value, - ...errorUtil.errToObj(message), + _addCheck(check) { + return new ZodBigInt({ + ...this._def, + checks: [...this._def.checks, check], }); } - min(minLength, message) { + positive(message) { return this._addCheck({ kind: "min", - value: minLength, - ...errorUtil.errToObj(message), + value: BigInt(0), + inclusive: false, + message: errorUtil.toString(message), }); } - max(maxLength, message) { + negative(message) { return this._addCheck({ kind: "max", - value: maxLength, - ...errorUtil.errToObj(message), + value: BigInt(0), + inclusive: false, + message: errorUtil.toString(message), }); } - length(len, message) { + nonpositive(message) { return this._addCheck({ - kind: "length", - value: len, - ...errorUtil.errToObj(message), - }); - } - /** - * Equivalent to `.min(1)` - */ - nonempty(message) { - return this.min(1, errorUtil.errToObj(message)); - } - trim() { - return new ZodString({ - ...this._def, - checks: [...this._def.checks, { kind: "trim" }], + kind: "max", + value: BigInt(0), + inclusive: true, + message: errorUtil.toString(message), }); } - toLowerCase() { - return new ZodString({ - ...this._def, - checks: [...this._def.checks, { kind: "toLowerCase" }], + nonnegative(message) { + return this._addCheck({ + kind: "min", + value: BigInt(0), + inclusive: true, + message: errorUtil.toString(message), }); } - toUpperCase() { - return new ZodString({ - ...this._def, - checks: [...this._def.checks, { kind: "toUpperCase" }], + multipleOf(value, message) { + return this._addCheck({ + kind: "multipleOf", + value, + message: errorUtil.toString(message), }); } - get isDatetime() { - return !!this._def.checks.find((ch) => ch.kind === "datetime"); - } - get isDate() { - return !!this._def.checks.find((ch) => ch.kind === "date"); - } - get isTime() { - return !!this._def.checks.find((ch) => ch.kind === "time"); - } - get isDuration() { - return !!this._def.checks.find((ch) => ch.kind === "duration"); - } - get isEmail() { - return !!this._def.checks.find((ch) => ch.kind === "email"); - } - get isURL() { - return !!this._def.checks.find((ch) => ch.kind === "url"); - } - get isEmoji() { - return !!this._def.checks.find((ch) => ch.kind === "emoji"); - } - get isUUID() { - return !!this._def.checks.find((ch) => ch.kind === "uuid"); - } - get isNANOID() { - return !!this._def.checks.find((ch) => ch.kind === "nanoid"); - } - get isCUID() { - return !!this._def.checks.find((ch) => ch.kind === "cuid"); - } - get isCUID2() { - return !!this._def.checks.find((ch) => ch.kind === "cuid2"); - } - get isULID() { - return !!this._def.checks.find((ch) => ch.kind === "ulid"); - } - get isIP() { - return !!this._def.checks.find((ch) => ch.kind === "ip"); - } - get isCIDR() { - return !!this._def.checks.find((ch) => ch.kind === "cidr"); - } - get isBase64() { - return !!this._def.checks.find((ch) => ch.kind === "base64"); - } - get isBase64url() { - // base64url encoding is a modification of base64 that can safely be used in URLs and filenames - return !!this._def.checks.find((ch) => ch.kind === "base64url"); - } - get minLength() { + get minValue() { let min = null; for (const ch of this._def.checks) { if (ch.kind === "min") { @@ -45443,7 +44548,7 @@ class ZodString extends ZodType { } return min; } - get maxLength() { + get maxValue() { let max = null; for (const ch of this._def.checks) { if (ch.kind === "max") { @@ -45454,111 +44559,89 @@ class ZodString extends ZodType { return max; } } -ZodString.create = (params) => { +ZodBigInt.create = (params) => { var _a; - return new ZodString({ + return new ZodBigInt({ checks: [], - typeName: ZodFirstPartyTypeKind.ZodString, + typeName: ZodFirstPartyTypeKind.ZodBigInt, coerce: (_a = params === null || params === void 0 ? void 0 : params.coerce) !== null && _a !== void 0 ? _a : false, ...processCreateParams(params), }); }; -// https://stackoverflow.com/questions/3966484/why-does-modulus-operator-return-fractional-number-in-javascript/31711034#31711034 -function floatSafeRemainder(val, step) { - const valDecCount = (val.toString().split(".")[1] || "").length; - const stepDecCount = (step.toString().split(".")[1] || "").length; - const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount; - const valInt = parseInt(val.toFixed(decCount).replace(".", "")); - const stepInt = parseInt(step.toFixed(decCount).replace(".", "")); - return (valInt % stepInt) / Math.pow(10, decCount); -} -class ZodNumber extends ZodType { - constructor() { - super(...arguments); - this.min = this.gte; - this.max = this.lte; - this.step = this.multipleOf; +class ZodBoolean extends ZodType { + _parse(input) { + if (this._def.coerce) { + input.data = Boolean(input.data); + } + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.boolean) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.boolean, + received: ctx.parsedType, + }); + return INVALID; + } + return OK(input.data); } +} +ZodBoolean.create = (params) => { + return new ZodBoolean({ + typeName: ZodFirstPartyTypeKind.ZodBoolean, + coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false, + ...processCreateParams(params), + }); +}; +class ZodDate extends ZodType { _parse(input) { if (this._def.coerce) { - input.data = Number(input.data); + input.data = new Date(input.data); } const parsedType = this._getType(input); - if (parsedType !== ZodParsedType.number) { + if (parsedType !== ZodParsedType.date) { const ctx = this._getOrReturnCtx(input); addIssueToContext(ctx, { code: ZodIssueCode.invalid_type, - expected: ZodParsedType.number, + expected: ZodParsedType.date, received: ctx.parsedType, }); return INVALID; } - let ctx = undefined; + if (isNaN(input.data.getTime())) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_date, + }); + return INVALID; + } const status = new ParseStatus(); + let ctx = undefined; for (const check of this._def.checks) { - if (check.kind === "int") { - if (!util.isInteger(input.data)) { - ctx = this._getOrReturnCtx(input, ctx); - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_type, - expected: "integer", - received: "float", - message: check.message, - }); - status.dirty(); - } - } - else if (check.kind === "min") { - const tooSmall = check.inclusive - ? input.data < check.value - : input.data <= check.value; - if (tooSmall) { + if (check.kind === "min") { + if (input.data.getTime() < check.value) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { code: ZodIssueCode.too_small, - minimum: check.value, - type: "number", - inclusive: check.inclusive, - exact: false, message: check.message, + inclusive: true, + exact: false, + minimum: check.value, + type: "date", }); status.dirty(); } } else if (check.kind === "max") { - const tooBig = check.inclusive - ? input.data > check.value - : input.data >= check.value; - if (tooBig) { + if (input.data.getTime() > check.value) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { code: ZodIssueCode.too_big, - maximum: check.value, - type: "number", - inclusive: check.inclusive, - exact: false, - message: check.message, - }); - status.dirty(); - } - } - else if (check.kind === "multipleOf") { - if (floatSafeRemainder(input.data, check.value) !== 0) { - ctx = this._getOrReturnCtx(input, ctx); - addIssueToContext(ctx, { - code: ZodIssueCode.not_multiple_of, - multipleOf: check.value, - message: check.message, - }); - status.dirty(); - } - } - else if (check.kind === "finite") { - if (!Number.isFinite(input.data)) { - ctx = this._getOrReturnCtx(input, ctx); - addIssueToContext(ctx, { - code: ZodIssueCode.not_finite, message: check.message, + inclusive: true, + exact: false, + maximum: check.value, + type: "date", }); status.dirty(); } @@ -45567,2678 +44650,3602 @@ class ZodNumber extends ZodType { util.assertNever(check); } } - return { status: status.value, value: input.data }; + return { + status: status.value, + value: new Date(input.data.getTime()), + }; } - gte(value, message) { - return this.setLimit("min", value, true, errorUtil.toString(message)); + _addCheck(check) { + return new ZodDate({ + ...this._def, + checks: [...this._def.checks, check], + }); } - gt(value, message) { - return this.setLimit("min", value, false, errorUtil.toString(message)); + min(minDate, message) { + return this._addCheck({ + kind: "min", + value: minDate.getTime(), + message: errorUtil.toString(message), + }); } - lte(value, message) { - return this.setLimit("max", value, true, errorUtil.toString(message)); + max(maxDate, message) { + return this._addCheck({ + kind: "max", + value: maxDate.getTime(), + message: errorUtil.toString(message), + }); + } + get minDate() { + let min = null; + for (const ch of this._def.checks) { + if (ch.kind === "min") { + if (min === null || ch.value > min) + min = ch.value; + } + } + return min != null ? new Date(min) : null; + } + get maxDate() { + let max = null; + for (const ch of this._def.checks) { + if (ch.kind === "max") { + if (max === null || ch.value < max) + max = ch.value; + } + } + return max != null ? new Date(max) : null; + } +} +ZodDate.create = (params) => { + return new ZodDate({ + checks: [], + coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false, + typeName: ZodFirstPartyTypeKind.ZodDate, + ...processCreateParams(params), + }); +}; +class ZodSymbol extends ZodType { + _parse(input) { + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.symbol) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.symbol, + received: ctx.parsedType, + }); + return INVALID; + } + return OK(input.data); + } +} +ZodSymbol.create = (params) => { + return new ZodSymbol({ + typeName: ZodFirstPartyTypeKind.ZodSymbol, + ...processCreateParams(params), + }); +}; +class ZodUndefined extends ZodType { + _parse(input) { + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.undefined) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.undefined, + received: ctx.parsedType, + }); + return INVALID; + } + return OK(input.data); + } +} +ZodUndefined.create = (params) => { + return new ZodUndefined({ + typeName: ZodFirstPartyTypeKind.ZodUndefined, + ...processCreateParams(params), + }); +}; +class ZodNull extends ZodType { + _parse(input) { + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.null) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.null, + received: ctx.parsedType, + }); + return INVALID; + } + return OK(input.data); + } +} +ZodNull.create = (params) => { + return new ZodNull({ + typeName: ZodFirstPartyTypeKind.ZodNull, + ...processCreateParams(params), + }); +}; +class ZodAny extends ZodType { + constructor() { + super(...arguments); + // to prevent instances of other classes from extending ZodAny. this causes issues with catchall in ZodObject. + this._any = true; + } + _parse(input) { + return OK(input.data); + } +} +ZodAny.create = (params) => { + return new ZodAny({ + typeName: ZodFirstPartyTypeKind.ZodAny, + ...processCreateParams(params), + }); +}; +class ZodUnknown extends ZodType { + constructor() { + super(...arguments); + // required + this._unknown = true; + } + _parse(input) { + return OK(input.data); + } +} +ZodUnknown.create = (params) => { + return new ZodUnknown({ + typeName: ZodFirstPartyTypeKind.ZodUnknown, + ...processCreateParams(params), + }); +}; +class ZodNever extends ZodType { + _parse(input) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.never, + received: ctx.parsedType, + }); + return INVALID; + } +} +ZodNever.create = (params) => { + return new ZodNever({ + typeName: ZodFirstPartyTypeKind.ZodNever, + ...processCreateParams(params), + }); +}; +class ZodVoid extends ZodType { + _parse(input) { + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.undefined) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.void, + received: ctx.parsedType, + }); + return INVALID; + } + return OK(input.data); + } +} +ZodVoid.create = (params) => { + return new ZodVoid({ + typeName: ZodFirstPartyTypeKind.ZodVoid, + ...processCreateParams(params), + }); +}; +class ZodArray extends ZodType { + _parse(input) { + const { ctx, status } = this._processInputParams(input); + const def = this._def; + if (ctx.parsedType !== ZodParsedType.array) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.array, + received: ctx.parsedType, + }); + return INVALID; + } + if (def.exactLength !== null) { + const tooBig = ctx.data.length > def.exactLength.value; + const tooSmall = ctx.data.length < def.exactLength.value; + if (tooBig || tooSmall) { + addIssueToContext(ctx, { + code: tooBig ? ZodIssueCode.too_big : ZodIssueCode.too_small, + minimum: (tooSmall ? def.exactLength.value : undefined), + maximum: (tooBig ? def.exactLength.value : undefined), + type: "array", + inclusive: true, + exact: true, + message: def.exactLength.message, + }); + status.dirty(); + } + } + if (def.minLength !== null) { + if (ctx.data.length < def.minLength.value) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + minimum: def.minLength.value, + type: "array", + inclusive: true, + exact: false, + message: def.minLength.message, + }); + status.dirty(); + } + } + if (def.maxLength !== null) { + if (ctx.data.length > def.maxLength.value) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + maximum: def.maxLength.value, + type: "array", + inclusive: true, + exact: false, + message: def.maxLength.message, + }); + status.dirty(); + } + } + if (ctx.common.async) { + return Promise.all([...ctx.data].map((item, i) => { + return def.type._parseAsync(new ParseInputLazyPath(ctx, item, ctx.path, i)); + })).then((result) => { + return ParseStatus.mergeArray(status, result); + }); + } + const result = [...ctx.data].map((item, i) => { + return def.type._parseSync(new ParseInputLazyPath(ctx, item, ctx.path, i)); + }); + return ParseStatus.mergeArray(status, result); } - lt(value, message) { - return this.setLimit("max", value, false, errorUtil.toString(message)); + get element() { + return this._def.type; } - setLimit(kind, value, inclusive, message) { - return new ZodNumber({ + min(minLength, message) { + return new ZodArray({ ...this._def, - checks: [ - ...this._def.checks, - { - kind, - value, - inclusive, - message: errorUtil.toString(message), - }, - ], + minLength: { value: minLength, message: errorUtil.toString(message) }, }); } - _addCheck(check) { - return new ZodNumber({ + max(maxLength, message) { + return new ZodArray({ ...this._def, - checks: [...this._def.checks, check], - }); - } - int(message) { - return this._addCheck({ - kind: "int", - message: errorUtil.toString(message), - }); - } - positive(message) { - return this._addCheck({ - kind: "min", - value: 0, - inclusive: false, - message: errorUtil.toString(message), - }); - } - negative(message) { - return this._addCheck({ - kind: "max", - value: 0, - inclusive: false, - message: errorUtil.toString(message), - }); - } - nonpositive(message) { - return this._addCheck({ - kind: "max", - value: 0, - inclusive: true, - message: errorUtil.toString(message), + maxLength: { value: maxLength, message: errorUtil.toString(message) }, }); } - nonnegative(message) { - return this._addCheck({ - kind: "min", - value: 0, - inclusive: true, - message: errorUtil.toString(message), + length(len, message) { + return new ZodArray({ + ...this._def, + exactLength: { value: len, message: errorUtil.toString(message) }, }); } - multipleOf(value, message) { - return this._addCheck({ - kind: "multipleOf", - value: value, - message: errorUtil.toString(message), - }); + nonempty(message) { + return this.min(1, message); } - finite(message) { - return this._addCheck({ - kind: "finite", - message: errorUtil.toString(message), +} +ZodArray.create = (schema, params) => { + return new ZodArray({ + type: schema, + minLength: null, + maxLength: null, + exactLength: null, + typeName: ZodFirstPartyTypeKind.ZodArray, + ...processCreateParams(params), + }); +}; +function deepPartialify(schema) { + if (schema instanceof ZodObject) { + const newShape = {}; + for (const key in schema.shape) { + const fieldSchema = schema.shape[key]; + newShape[key] = ZodOptional.create(deepPartialify(fieldSchema)); + } + return new ZodObject({ + ...schema._def, + shape: () => newShape, }); } - safe(message) { - return this._addCheck({ - kind: "min", - inclusive: true, - value: Number.MIN_SAFE_INTEGER, - message: errorUtil.toString(message), - })._addCheck({ - kind: "max", - inclusive: true, - value: Number.MAX_SAFE_INTEGER, - message: errorUtil.toString(message), + else if (schema instanceof ZodArray) { + return new ZodArray({ + ...schema._def, + type: deepPartialify(schema.element), }); } - get minValue() { - let min = null; - for (const ch of this._def.checks) { - if (ch.kind === "min") { - if (min === null || ch.value > min) - min = ch.value; - } - } - return min; + else if (schema instanceof ZodOptional) { + return ZodOptional.create(deepPartialify(schema.unwrap())); } - get maxValue() { - let max = null; - for (const ch of this._def.checks) { - if (ch.kind === "max") { - if (max === null || ch.value < max) - max = ch.value; - } - } - return max; + else if (schema instanceof ZodNullable) { + return ZodNullable.create(deepPartialify(schema.unwrap())); } - get isInt() { - return !!this._def.checks.find((ch) => ch.kind === "int" || - (ch.kind === "multipleOf" && util.isInteger(ch.value))); + else if (schema instanceof ZodTuple) { + return ZodTuple.create(schema.items.map((item) => deepPartialify(item))); } - get isFinite() { - let max = null, min = null; - for (const ch of this._def.checks) { - if (ch.kind === "finite" || - ch.kind === "int" || - ch.kind === "multipleOf") { - return true; - } - else if (ch.kind === "min") { - if (min === null || ch.value > min) - min = ch.value; - } - else if (ch.kind === "max") { - if (max === null || ch.value < max) - max = ch.value; - } - } - return Number.isFinite(min) && Number.isFinite(max); + else { + return schema; } } -ZodNumber.create = (params) => { - return new ZodNumber({ - checks: [], - typeName: ZodFirstPartyTypeKind.ZodNumber, - coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false, - ...processCreateParams(params), - }); -}; -class ZodBigInt extends ZodType { +class ZodObject extends ZodType { constructor() { super(...arguments); - this.min = this.gte; - this.max = this.lte; + this._cached = null; + /** + * @deprecated In most cases, this is no longer needed - unknown properties are now silently stripped. + * If you want to pass through unknown properties, use `.passthrough()` instead. + */ + this.nonstrict = this.passthrough; + // extend< + // Augmentation extends ZodRawShape, + // NewOutput extends util.flatten<{ + // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation + // ? Augmentation[k]["_output"] + // : k extends keyof Output + // ? Output[k] + // : never; + // }>, + // NewInput extends util.flatten<{ + // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation + // ? Augmentation[k]["_input"] + // : k extends keyof Input + // ? Input[k] + // : never; + // }> + // >( + // augmentation: Augmentation + // ): ZodObject< + // extendShape, + // UnknownKeys, + // Catchall, + // NewOutput, + // NewInput + // > { + // return new ZodObject({ + // ...this._def, + // shape: () => ({ + // ...this._def.shape(), + // ...augmentation, + // }), + // }) as any; + // } + /** + * @deprecated Use `.extend` instead + * */ + this.augment = this.extend; + } + _getCached() { + if (this._cached !== null) + return this._cached; + const shape = this._def.shape(); + const keys = util.objectKeys(shape); + return (this._cached = { shape, keys }); } _parse(input) { - if (this._def.coerce) { - try { - input.data = BigInt(input.data); - } - catch (_a) { - return this._getInvalidInput(input); - } - } const parsedType = this._getType(input); - if (parsedType !== ZodParsedType.bigint) { - return this._getInvalidInput(input); + if (parsedType !== ZodParsedType.object) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.object, + received: ctx.parsedType, + }); + return INVALID; } - let ctx = undefined; - const status = new ParseStatus(); - for (const check of this._def.checks) { - if (check.kind === "min") { - const tooSmall = check.inclusive - ? input.data < check.value - : input.data <= check.value; - if (tooSmall) { - ctx = this._getOrReturnCtx(input, ctx); - addIssueToContext(ctx, { - code: ZodIssueCode.too_small, - type: "bigint", - minimum: check.value, - inclusive: check.inclusive, - message: check.message, - }); - status.dirty(); + const { status, ctx } = this._processInputParams(input); + const { shape, keys: shapeKeys } = this._getCached(); + const extraKeys = []; + if (!(this._def.catchall instanceof ZodNever && + this._def.unknownKeys === "strip")) { + for (const key in ctx.data) { + if (!shapeKeys.includes(key)) { + extraKeys.push(key); } } - else if (check.kind === "max") { - const tooBig = check.inclusive - ? input.data > check.value - : input.data >= check.value; - if (tooBig) { - ctx = this._getOrReturnCtx(input, ctx); - addIssueToContext(ctx, { - code: ZodIssueCode.too_big, - type: "bigint", - maximum: check.value, - inclusive: check.inclusive, - message: check.message, + } + const pairs = []; + for (const key of shapeKeys) { + const keyValidator = shape[key]; + const value = ctx.data[key]; + pairs.push({ + key: { status: "valid", value: key }, + value: keyValidator._parse(new ParseInputLazyPath(ctx, value, ctx.path, key)), + alwaysSet: key in ctx.data, + }); + } + if (this._def.catchall instanceof ZodNever) { + const unknownKeys = this._def.unknownKeys; + if (unknownKeys === "passthrough") { + for (const key of extraKeys) { + pairs.push({ + key: { status: "valid", value: key }, + value: { status: "valid", value: ctx.data[key] }, }); - status.dirty(); } } - else if (check.kind === "multipleOf") { - if (input.data % check.value !== BigInt(0)) { - ctx = this._getOrReturnCtx(input, ctx); + else if (unknownKeys === "strict") { + if (extraKeys.length > 0) { addIssueToContext(ctx, { - code: ZodIssueCode.not_multiple_of, - multipleOf: check.value, - message: check.message, + code: ZodIssueCode.unrecognized_keys, + keys: extraKeys, }); status.dirty(); } } + else if (unknownKeys === "strip") ; else { - util.assertNever(check); + throw new Error(`Internal ZodObject error: invalid unknownKeys value.`); } } - return { status: status.value, value: input.data }; + else { + // run catchall validation + const catchall = this._def.catchall; + for (const key of extraKeys) { + const value = ctx.data[key]; + pairs.push({ + key: { status: "valid", value: key }, + value: catchall._parse(new ParseInputLazyPath(ctx, value, ctx.path, key) //, ctx.child(key), value, getParsedType(value) + ), + alwaysSet: key in ctx.data, + }); + } + } + if (ctx.common.async) { + return Promise.resolve() + .then(async () => { + const syncPairs = []; + for (const pair of pairs) { + const key = await pair.key; + const value = await pair.value; + syncPairs.push({ + key, + value, + alwaysSet: pair.alwaysSet, + }); + } + return syncPairs; + }) + .then((syncPairs) => { + return ParseStatus.mergeObjectSync(status, syncPairs); + }); + } + else { + return ParseStatus.mergeObjectSync(status, pairs); + } } - _getInvalidInput(input) { - const ctx = this._getOrReturnCtx(input); - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_type, - expected: ZodParsedType.bigint, - received: ctx.parsedType, + get shape() { + return this._def.shape(); + } + strict(message) { + errorUtil.errToObj; + return new ZodObject({ + ...this._def, + unknownKeys: "strict", + ...(message !== undefined + ? { + errorMap: (issue, ctx) => { + var _a, _b, _c, _d; + const defaultError = (_c = (_b = (_a = this._def).errorMap) === null || _b === void 0 ? void 0 : _b.call(_a, issue, ctx).message) !== null && _c !== void 0 ? _c : ctx.defaultError; + if (issue.code === "unrecognized_keys") + return { + message: (_d = errorUtil.errToObj(message).message) !== null && _d !== void 0 ? _d : defaultError, + }; + return { + message: defaultError, + }; + }, + } + : {}), }); - return INVALID; } - gte(value, message) { - return this.setLimit("min", value, true, errorUtil.toString(message)); + strip() { + return new ZodObject({ + ...this._def, + unknownKeys: "strip", + }); } - gt(value, message) { - return this.setLimit("min", value, false, errorUtil.toString(message)); + passthrough() { + return new ZodObject({ + ...this._def, + unknownKeys: "passthrough", + }); } - lte(value, message) { - return this.setLimit("max", value, true, errorUtil.toString(message)); + // const AugmentFactory = + // (def: Def) => + // ( + // augmentation: Augmentation + // ): ZodObject< + // extendShape, Augmentation>, + // Def["unknownKeys"], + // Def["catchall"] + // > => { + // return new ZodObject({ + // ...def, + // shape: () => ({ + // ...def.shape(), + // ...augmentation, + // }), + // }) as any; + // }; + extend(augmentation) { + return new ZodObject({ + ...this._def, + shape: () => ({ + ...this._def.shape(), + ...augmentation, + }), + }); } - lt(value, message) { - return this.setLimit("max", value, false, errorUtil.toString(message)); + /** + * Prior to zod@1.0.12 there was a bug in the + * inferred type of merged objects. Please + * upgrade if you are experiencing issues. + */ + merge(merging) { + const merged = new ZodObject({ + unknownKeys: merging._def.unknownKeys, + catchall: merging._def.catchall, + shape: () => ({ + ...this._def.shape(), + ...merging._def.shape(), + }), + typeName: ZodFirstPartyTypeKind.ZodObject, + }); + return merged; } - setLimit(kind, value, inclusive, message) { - return new ZodBigInt({ + // merge< + // Incoming extends AnyZodObject, + // Augmentation extends Incoming["shape"], + // NewOutput extends { + // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation + // ? Augmentation[k]["_output"] + // : k extends keyof Output + // ? Output[k] + // : never; + // }, + // NewInput extends { + // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation + // ? Augmentation[k]["_input"] + // : k extends keyof Input + // ? Input[k] + // : never; + // } + // >( + // merging: Incoming + // ): ZodObject< + // extendShape>, + // Incoming["_def"]["unknownKeys"], + // Incoming["_def"]["catchall"], + // NewOutput, + // NewInput + // > { + // const merged: any = new ZodObject({ + // unknownKeys: merging._def.unknownKeys, + // catchall: merging._def.catchall, + // shape: () => + // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()), + // typeName: ZodFirstPartyTypeKind.ZodObject, + // }) as any; + // return merged; + // } + setKey(key, schema) { + return this.augment({ [key]: schema }); + } + // merge( + // merging: Incoming + // ): //ZodObject = (merging) => { + // ZodObject< + // extendShape>, + // Incoming["_def"]["unknownKeys"], + // Incoming["_def"]["catchall"] + // > { + // // const mergedShape = objectUtil.mergeShapes( + // // this._def.shape(), + // // merging._def.shape() + // // ); + // const merged: any = new ZodObject({ + // unknownKeys: merging._def.unknownKeys, + // catchall: merging._def.catchall, + // shape: () => + // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()), + // typeName: ZodFirstPartyTypeKind.ZodObject, + // }) as any; + // return merged; + // } + catchall(index) { + return new ZodObject({ ...this._def, - checks: [ - ...this._def.checks, - { - kind, - value, - inclusive, - message: errorUtil.toString(message), - }, - ], + catchall: index, + }); + } + pick(mask) { + const shape = {}; + util.objectKeys(mask).forEach((key) => { + if (mask[key] && this.shape[key]) { + shape[key] = this.shape[key]; + } }); - } - _addCheck(check) { - return new ZodBigInt({ + return new ZodObject({ ...this._def, - checks: [...this._def.checks, check], + shape: () => shape, }); } - positive(message) { - return this._addCheck({ - kind: "min", - value: BigInt(0), - inclusive: false, - message: errorUtil.toString(message), + omit(mask) { + const shape = {}; + util.objectKeys(this.shape).forEach((key) => { + if (!mask[key]) { + shape[key] = this.shape[key]; + } }); - } - negative(message) { - return this._addCheck({ - kind: "max", - value: BigInt(0), - inclusive: false, - message: errorUtil.toString(message), + return new ZodObject({ + ...this._def, + shape: () => shape, }); } - nonpositive(message) { - return this._addCheck({ - kind: "max", - value: BigInt(0), - inclusive: true, - message: errorUtil.toString(message), - }); + /** + * @deprecated + */ + deepPartial() { + return deepPartialify(this); } - nonnegative(message) { - return this._addCheck({ - kind: "min", - value: BigInt(0), - inclusive: true, - message: errorUtil.toString(message), + partial(mask) { + const newShape = {}; + util.objectKeys(this.shape).forEach((key) => { + const fieldSchema = this.shape[key]; + if (mask && !mask[key]) { + newShape[key] = fieldSchema; + } + else { + newShape[key] = fieldSchema.optional(); + } }); - } - multipleOf(value, message) { - return this._addCheck({ - kind: "multipleOf", - value, - message: errorUtil.toString(message), + return new ZodObject({ + ...this._def, + shape: () => newShape, }); } - get minValue() { - let min = null; - for (const ch of this._def.checks) { - if (ch.kind === "min") { - if (min === null || ch.value > min) - min = ch.value; + required(mask) { + const newShape = {}; + util.objectKeys(this.shape).forEach((key) => { + if (mask && !mask[key]) { + newShape[key] = this.shape[key]; } - } - return min; - } - get maxValue() { - let max = null; - for (const ch of this._def.checks) { - if (ch.kind === "max") { - if (max === null || ch.value < max) - max = ch.value; + else { + const fieldSchema = this.shape[key]; + let newField = fieldSchema; + while (newField instanceof ZodOptional) { + newField = newField._def.innerType; + } + newShape[key] = newField; } - } - return max; + }); + return new ZodObject({ + ...this._def, + shape: () => newShape, + }); + } + keyof() { + return createZodEnum(util.objectKeys(this.shape)); } } -ZodBigInt.create = (params) => { - var _a; - return new ZodBigInt({ - checks: [], - typeName: ZodFirstPartyTypeKind.ZodBigInt, - coerce: (_a = params === null || params === void 0 ? void 0 : params.coerce) !== null && _a !== void 0 ? _a : false, +ZodObject.create = (shape, params) => { + return new ZodObject({ + shape: () => shape, + unknownKeys: "strip", + catchall: ZodNever.create(), + typeName: ZodFirstPartyTypeKind.ZodObject, ...processCreateParams(params), }); }; -class ZodBoolean extends ZodType { +ZodObject.strictCreate = (shape, params) => { + return new ZodObject({ + shape: () => shape, + unknownKeys: "strict", + catchall: ZodNever.create(), + typeName: ZodFirstPartyTypeKind.ZodObject, + ...processCreateParams(params), + }); +}; +ZodObject.lazycreate = (shape, params) => { + return new ZodObject({ + shape, + unknownKeys: "strip", + catchall: ZodNever.create(), + typeName: ZodFirstPartyTypeKind.ZodObject, + ...processCreateParams(params), + }); +}; +class ZodUnion extends ZodType { _parse(input) { - if (this._def.coerce) { - input.data = Boolean(input.data); + const { ctx } = this._processInputParams(input); + const options = this._def.options; + function handleResults(results) { + // return first issue-free validation if it exists + for (const result of results) { + if (result.result.status === "valid") { + return result.result; + } + } + for (const result of results) { + if (result.result.status === "dirty") { + // add issues from dirty option + ctx.common.issues.push(...result.ctx.common.issues); + return result.result; + } + } + // return invalid + const unionErrors = results.map((result) => new ZodError(result.ctx.common.issues)); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_union, + unionErrors, + }); + return INVALID; } - const parsedType = this._getType(input); - if (parsedType !== ZodParsedType.boolean) { - const ctx = this._getOrReturnCtx(input); + if (ctx.common.async) { + return Promise.all(options.map(async (option) => { + const childCtx = { + ...ctx, + common: { + ...ctx.common, + issues: [], + }, + parent: null, + }; + return { + result: await option._parseAsync({ + data: ctx.data, + path: ctx.path, + parent: childCtx, + }), + ctx: childCtx, + }; + })).then(handleResults); + } + else { + let dirty = undefined; + const issues = []; + for (const option of options) { + const childCtx = { + ...ctx, + common: { + ...ctx.common, + issues: [], + }, + parent: null, + }; + const result = option._parseSync({ + data: ctx.data, + path: ctx.path, + parent: childCtx, + }); + if (result.status === "valid") { + return result; + } + else if (result.status === "dirty" && !dirty) { + dirty = { result, ctx: childCtx }; + } + if (childCtx.common.issues.length) { + issues.push(childCtx.common.issues); + } + } + if (dirty) { + ctx.common.issues.push(...dirty.ctx.common.issues); + return dirty.result; + } + const unionErrors = issues.map((issues) => new ZodError(issues)); addIssueToContext(ctx, { - code: ZodIssueCode.invalid_type, - expected: ZodParsedType.boolean, - received: ctx.parsedType, + code: ZodIssueCode.invalid_union, + unionErrors, }); return INVALID; } - return OK(input.data); + } + get options() { + return this._def.options; } } -ZodBoolean.create = (params) => { - return new ZodBoolean({ - typeName: ZodFirstPartyTypeKind.ZodBoolean, - coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false, +ZodUnion.create = (types, params) => { + return new ZodUnion({ + options: types, + typeName: ZodFirstPartyTypeKind.ZodUnion, ...processCreateParams(params), }); }; -class ZodDate extends ZodType { +///////////////////////////////////////////////////// +///////////////////////////////////////////////////// +////////// ////////// +////////// ZodDiscriminatedUnion ////////// +////////// ////////// +///////////////////////////////////////////////////// +///////////////////////////////////////////////////// +const getDiscriminator = (type) => { + if (type instanceof ZodLazy) { + return getDiscriminator(type.schema); + } + else if (type instanceof ZodEffects) { + return getDiscriminator(type.innerType()); + } + else if (type instanceof ZodLiteral) { + return [type.value]; + } + else if (type instanceof ZodEnum) { + return type.options; + } + else if (type instanceof ZodNativeEnum) { + // eslint-disable-next-line ban/ban + return util.objectValues(type.enum); + } + else if (type instanceof ZodDefault) { + return getDiscriminator(type._def.innerType); + } + else if (type instanceof ZodUndefined) { + return [undefined]; + } + else if (type instanceof ZodNull) { + return [null]; + } + else if (type instanceof ZodOptional) { + return [undefined, ...getDiscriminator(type.unwrap())]; + } + else if (type instanceof ZodNullable) { + return [null, ...getDiscriminator(type.unwrap())]; + } + else if (type instanceof ZodBranded) { + return getDiscriminator(type.unwrap()); + } + else if (type instanceof ZodReadonly) { + return getDiscriminator(type.unwrap()); + } + else if (type instanceof ZodCatch) { + return getDiscriminator(type._def.innerType); + } + else { + return []; + } +}; +class ZodDiscriminatedUnion extends ZodType { _parse(input) { - if (this._def.coerce) { - input.data = new Date(input.data); - } - const parsedType = this._getType(input); - if (parsedType !== ZodParsedType.date) { - const ctx = this._getOrReturnCtx(input); + const { ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.object) { addIssueToContext(ctx, { code: ZodIssueCode.invalid_type, - expected: ZodParsedType.date, + expected: ZodParsedType.object, received: ctx.parsedType, }); return INVALID; } - if (isNaN(input.data.getTime())) { - const ctx = this._getOrReturnCtx(input); + const discriminator = this.discriminator; + const discriminatorValue = ctx.data[discriminator]; + const option = this.optionsMap.get(discriminatorValue); + if (!option) { addIssueToContext(ctx, { - code: ZodIssueCode.invalid_date, + code: ZodIssueCode.invalid_union_discriminator, + options: Array.from(this.optionsMap.keys()), + path: [discriminator], }); return INVALID; } - const status = new ParseStatus(); - let ctx = undefined; - for (const check of this._def.checks) { - if (check.kind === "min") { - if (input.data.getTime() < check.value) { - ctx = this._getOrReturnCtx(input, ctx); - addIssueToContext(ctx, { - code: ZodIssueCode.too_small, - message: check.message, - inclusive: true, - exact: false, - minimum: check.value, - type: "date", - }); - status.dirty(); - } + if (ctx.common.async) { + return option._parseAsync({ + data: ctx.data, + path: ctx.path, + parent: ctx, + }); + } + else { + return option._parseSync({ + data: ctx.data, + path: ctx.path, + parent: ctx, + }); + } + } + get discriminator() { + return this._def.discriminator; + } + get options() { + return this._def.options; + } + get optionsMap() { + return this._def.optionsMap; + } + /** + * The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor. + * However, it only allows a union of objects, all of which need to share a discriminator property. This property must + * have a different value for each object in the union. + * @param discriminator the name of the discriminator property + * @param types an array of object schemas + * @param params + */ + static create(discriminator, options, params) { + // Get all the valid discriminator values + const optionsMap = new Map(); + // try { + for (const type of options) { + const discriminatorValues = getDiscriminator(type.shape[discriminator]); + if (!discriminatorValues.length) { + throw new Error(`A discriminator value for key \`${discriminator}\` could not be extracted from all schema options`); } - else if (check.kind === "max") { - if (input.data.getTime() > check.value) { - ctx = this._getOrReturnCtx(input, ctx); - addIssueToContext(ctx, { - code: ZodIssueCode.too_big, - message: check.message, - inclusive: true, - exact: false, - maximum: check.value, - type: "date", - }); - status.dirty(); + for (const value of discriminatorValues) { + if (optionsMap.has(value)) { + throw new Error(`Discriminator property ${String(discriminator)} has duplicate value ${String(value)}`); } - } - else { - util.assertNever(check); + optionsMap.set(value, type); } } - return { - status: status.value, - value: new Date(input.data.getTime()), - }; - } - _addCheck(check) { - return new ZodDate({ - ...this._def, - checks: [...this._def.checks, check], + return new ZodDiscriminatedUnion({ + typeName: ZodFirstPartyTypeKind.ZodDiscriminatedUnion, + discriminator, + options, + optionsMap, + ...processCreateParams(params), }); } - min(minDate, message) { - return this._addCheck({ - kind: "min", - value: minDate.getTime(), - message: errorUtil.toString(message), - }); +} +function mergeValues(a, b) { + const aType = getParsedType(a); + const bType = getParsedType(b); + if (a === b) { + return { valid: true, data: a }; } - max(maxDate, message) { - return this._addCheck({ - kind: "max", - value: maxDate.getTime(), - message: errorUtil.toString(message), - }); + else if (aType === ZodParsedType.object && bType === ZodParsedType.object) { + const bKeys = util.objectKeys(b); + const sharedKeys = util + .objectKeys(a) + .filter((key) => bKeys.indexOf(key) !== -1); + const newObj = { ...a, ...b }; + for (const key of sharedKeys) { + const sharedValue = mergeValues(a[key], b[key]); + if (!sharedValue.valid) { + return { valid: false }; + } + newObj[key] = sharedValue.data; + } + return { valid: true, data: newObj }; } - get minDate() { - let min = null; - for (const ch of this._def.checks) { - if (ch.kind === "min") { - if (min === null || ch.value > min) - min = ch.value; + else if (aType === ZodParsedType.array && bType === ZodParsedType.array) { + if (a.length !== b.length) { + return { valid: false }; + } + const newArray = []; + for (let index = 0; index < a.length; index++) { + const itemA = a[index]; + const itemB = b[index]; + const sharedValue = mergeValues(itemA, itemB); + if (!sharedValue.valid) { + return { valid: false }; } + newArray.push(sharedValue.data); } - return min != null ? new Date(min) : null; + return { valid: true, data: newArray }; } - get maxDate() { - let max = null; - for (const ch of this._def.checks) { - if (ch.kind === "max") { - if (max === null || ch.value < max) - max = ch.value; + else if (aType === ZodParsedType.date && + bType === ZodParsedType.date && + +a === +b) { + return { valid: true, data: a }; + } + else { + return { valid: false }; + } +} +class ZodIntersection extends ZodType { + _parse(input) { + const { status, ctx } = this._processInputParams(input); + const handleParsed = (parsedLeft, parsedRight) => { + if (isAborted(parsedLeft) || isAborted(parsedRight)) { + return INVALID; + } + const merged = mergeValues(parsedLeft.value, parsedRight.value); + if (!merged.valid) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_intersection_types, + }); + return INVALID; + } + if (isDirty(parsedLeft) || isDirty(parsedRight)) { + status.dirty(); } + return { status: status.value, value: merged.data }; + }; + if (ctx.common.async) { + return Promise.all([ + this._def.left._parseAsync({ + data: ctx.data, + path: ctx.path, + parent: ctx, + }), + this._def.right._parseAsync({ + data: ctx.data, + path: ctx.path, + parent: ctx, + }), + ]).then(([left, right]) => handleParsed(left, right)); + } + else { + return handleParsed(this._def.left._parseSync({ + data: ctx.data, + path: ctx.path, + parent: ctx, + }), this._def.right._parseSync({ + data: ctx.data, + path: ctx.path, + parent: ctx, + })); } - return max != null ? new Date(max) : null; } } -ZodDate.create = (params) => { - return new ZodDate({ - checks: [], - coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false, - typeName: ZodFirstPartyTypeKind.ZodDate, +ZodIntersection.create = (left, right, params) => { + return new ZodIntersection({ + left: left, + right: right, + typeName: ZodFirstPartyTypeKind.ZodIntersection, ...processCreateParams(params), }); }; -class ZodSymbol extends ZodType { +class ZodTuple extends ZodType { _parse(input) { - const parsedType = this._getType(input); - if (parsedType !== ZodParsedType.symbol) { - const ctx = this._getOrReturnCtx(input); + const { status, ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.array) { addIssueToContext(ctx, { code: ZodIssueCode.invalid_type, - expected: ZodParsedType.symbol, + expected: ZodParsedType.array, received: ctx.parsedType, }); return INVALID; } - return OK(input.data); - } -} -ZodSymbol.create = (params) => { - return new ZodSymbol({ - typeName: ZodFirstPartyTypeKind.ZodSymbol, - ...processCreateParams(params), - }); -}; -class ZodUndefined extends ZodType { - _parse(input) { - const parsedType = this._getType(input); - if (parsedType !== ZodParsedType.undefined) { - const ctx = this._getOrReturnCtx(input); + if (ctx.data.length < this._def.items.length) { addIssueToContext(ctx, { - code: ZodIssueCode.invalid_type, - expected: ZodParsedType.undefined, - received: ctx.parsedType, + code: ZodIssueCode.too_small, + minimum: this._def.items.length, + inclusive: true, + exact: false, + type: "array", }); return INVALID; } - return OK(input.data); + const rest = this._def.rest; + if (!rest && ctx.data.length > this._def.items.length) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + maximum: this._def.items.length, + inclusive: true, + exact: false, + type: "array", + }); + status.dirty(); + } + const items = [...ctx.data] + .map((item, itemIndex) => { + const schema = this._def.items[itemIndex] || this._def.rest; + if (!schema) + return null; + return schema._parse(new ParseInputLazyPath(ctx, item, ctx.path, itemIndex)); + }) + .filter((x) => !!x); // filter nulls + if (ctx.common.async) { + return Promise.all(items).then((results) => { + return ParseStatus.mergeArray(status, results); + }); + } + else { + return ParseStatus.mergeArray(status, items); + } + } + get items() { + return this._def.items; + } + rest(rest) { + return new ZodTuple({ + ...this._def, + rest, + }); } } -ZodUndefined.create = (params) => { - return new ZodUndefined({ - typeName: ZodFirstPartyTypeKind.ZodUndefined, +ZodTuple.create = (schemas, params) => { + if (!Array.isArray(schemas)) { + throw new Error("You must pass an array of schemas to z.tuple([ ... ])"); + } + return new ZodTuple({ + items: schemas, + typeName: ZodFirstPartyTypeKind.ZodTuple, + rest: null, ...processCreateParams(params), }); }; -class ZodNull extends ZodType { +class ZodRecord extends ZodType { + get keySchema() { + return this._def.keyType; + } + get valueSchema() { + return this._def.valueType; + } _parse(input) { - const parsedType = this._getType(input); - if (parsedType !== ZodParsedType.null) { - const ctx = this._getOrReturnCtx(input); + const { status, ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.object) { addIssueToContext(ctx, { code: ZodIssueCode.invalid_type, - expected: ZodParsedType.null, + expected: ZodParsedType.object, received: ctx.parsedType, }); return INVALID; } - return OK(input.data); + const pairs = []; + const keyType = this._def.keyType; + const valueType = this._def.valueType; + for (const key in ctx.data) { + pairs.push({ + key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, key)), + value: valueType._parse(new ParseInputLazyPath(ctx, ctx.data[key], ctx.path, key)), + alwaysSet: key in ctx.data, + }); + } + if (ctx.common.async) { + return ParseStatus.mergeObjectAsync(status, pairs); + } + else { + return ParseStatus.mergeObjectSync(status, pairs); + } } -} -ZodNull.create = (params) => { - return new ZodNull({ - typeName: ZodFirstPartyTypeKind.ZodNull, - ...processCreateParams(params), - }); -}; -class ZodAny extends ZodType { - constructor() { - super(...arguments); - // to prevent instances of other classes from extending ZodAny. this causes issues with catchall in ZodObject. - this._any = true; + get element() { + return this._def.valueType; } - _parse(input) { - return OK(input.data); + static create(first, second, third) { + if (second instanceof ZodType) { + return new ZodRecord({ + keyType: first, + valueType: second, + typeName: ZodFirstPartyTypeKind.ZodRecord, + ...processCreateParams(third), + }); + } + return new ZodRecord({ + keyType: ZodString.create(), + valueType: first, + typeName: ZodFirstPartyTypeKind.ZodRecord, + ...processCreateParams(second), + }); } } -ZodAny.create = (params) => { - return new ZodAny({ - typeName: ZodFirstPartyTypeKind.ZodAny, - ...processCreateParams(params), - }); -}; -class ZodUnknown extends ZodType { - constructor() { - super(...arguments); - // required - this._unknown = true; - } - _parse(input) { - return OK(input.data); +class ZodMap extends ZodType { + get keySchema() { + return this._def.keyType; } -} -ZodUnknown.create = (params) => { - return new ZodUnknown({ - typeName: ZodFirstPartyTypeKind.ZodUnknown, - ...processCreateParams(params), - }); -}; -class ZodNever extends ZodType { - _parse(input) { - const ctx = this._getOrReturnCtx(input); - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_type, - expected: ZodParsedType.never, - received: ctx.parsedType, - }); - return INVALID; + get valueSchema() { + return this._def.valueType; } -} -ZodNever.create = (params) => { - return new ZodNever({ - typeName: ZodFirstPartyTypeKind.ZodNever, - ...processCreateParams(params), - }); -}; -class ZodVoid extends ZodType { _parse(input) { - const parsedType = this._getType(input); - if (parsedType !== ZodParsedType.undefined) { - const ctx = this._getOrReturnCtx(input); + const { status, ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.map) { addIssueToContext(ctx, { code: ZodIssueCode.invalid_type, - expected: ZodParsedType.void, + expected: ZodParsedType.map, received: ctx.parsedType, }); return INVALID; } - return OK(input.data); + const keyType = this._def.keyType; + const valueType = this._def.valueType; + const pairs = [...ctx.data.entries()].map(([key, value], index) => { + return { + key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, [index, "key"])), + value: valueType._parse(new ParseInputLazyPath(ctx, value, ctx.path, [index, "value"])), + }; + }); + if (ctx.common.async) { + const finalMap = new Map(); + return Promise.resolve().then(async () => { + for (const pair of pairs) { + const key = await pair.key; + const value = await pair.value; + if (key.status === "aborted" || value.status === "aborted") { + return INVALID; + } + if (key.status === "dirty" || value.status === "dirty") { + status.dirty(); + } + finalMap.set(key.value, value.value); + } + return { status: status.value, value: finalMap }; + }); + } + else { + const finalMap = new Map(); + for (const pair of pairs) { + const key = pair.key; + const value = pair.value; + if (key.status === "aborted" || value.status === "aborted") { + return INVALID; + } + if (key.status === "dirty" || value.status === "dirty") { + status.dirty(); + } + finalMap.set(key.value, value.value); + } + return { status: status.value, value: finalMap }; + } } } -ZodVoid.create = (params) => { - return new ZodVoid({ - typeName: ZodFirstPartyTypeKind.ZodVoid, +ZodMap.create = (keyType, valueType, params) => { + return new ZodMap({ + valueType, + keyType, + typeName: ZodFirstPartyTypeKind.ZodMap, ...processCreateParams(params), }); }; -class ZodArray extends ZodType { +class ZodSet extends ZodType { _parse(input) { - const { ctx, status } = this._processInputParams(input); - const def = this._def; - if (ctx.parsedType !== ZodParsedType.array) { + const { status, ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.set) { addIssueToContext(ctx, { code: ZodIssueCode.invalid_type, - expected: ZodParsedType.array, + expected: ZodParsedType.set, received: ctx.parsedType, }); return INVALID; } - if (def.exactLength !== null) { - const tooBig = ctx.data.length > def.exactLength.value; - const tooSmall = ctx.data.length < def.exactLength.value; - if (tooBig || tooSmall) { - addIssueToContext(ctx, { - code: tooBig ? ZodIssueCode.too_big : ZodIssueCode.too_small, - minimum: (tooSmall ? def.exactLength.value : undefined), - maximum: (tooBig ? def.exactLength.value : undefined), - type: "array", - inclusive: true, - exact: true, - message: def.exactLength.message, - }); - status.dirty(); - } - } - if (def.minLength !== null) { - if (ctx.data.length < def.minLength.value) { + const def = this._def; + if (def.minSize !== null) { + if (ctx.data.size < def.minSize.value) { addIssueToContext(ctx, { code: ZodIssueCode.too_small, - minimum: def.minLength.value, - type: "array", + minimum: def.minSize.value, + type: "set", inclusive: true, exact: false, - message: def.minLength.message, + message: def.minSize.message, }); status.dirty(); } } - if (def.maxLength !== null) { - if (ctx.data.length > def.maxLength.value) { + if (def.maxSize !== null) { + if (ctx.data.size > def.maxSize.value) { addIssueToContext(ctx, { code: ZodIssueCode.too_big, - maximum: def.maxLength.value, - type: "array", + maximum: def.maxSize.value, + type: "set", inclusive: true, exact: false, - message: def.maxLength.message, + message: def.maxSize.message, }); status.dirty(); } } + const valueType = this._def.valueType; + function finalizeSet(elements) { + const parsedSet = new Set(); + for (const element of elements) { + if (element.status === "aborted") + return INVALID; + if (element.status === "dirty") + status.dirty(); + parsedSet.add(element.value); + } + return { status: status.value, value: parsedSet }; + } + const elements = [...ctx.data.values()].map((item, i) => valueType._parse(new ParseInputLazyPath(ctx, item, ctx.path, i))); if (ctx.common.async) { - return Promise.all([...ctx.data].map((item, i) => { - return def.type._parseAsync(new ParseInputLazyPath(ctx, item, ctx.path, i)); - })).then((result) => { - return ParseStatus.mergeArray(status, result); - }); + return Promise.all(elements).then((elements) => finalizeSet(elements)); + } + else { + return finalizeSet(elements); } - const result = [...ctx.data].map((item, i) => { - return def.type._parseSync(new ParseInputLazyPath(ctx, item, ctx.path, i)); - }); - return ParseStatus.mergeArray(status, result); - } - get element() { - return this._def.type; } - min(minLength, message) { - return new ZodArray({ + min(minSize, message) { + return new ZodSet({ ...this._def, - minLength: { value: minLength, message: errorUtil.toString(message) }, + minSize: { value: minSize, message: errorUtil.toString(message) }, }); } - max(maxLength, message) { - return new ZodArray({ + max(maxSize, message) { + return new ZodSet({ ...this._def, - maxLength: { value: maxLength, message: errorUtil.toString(message) }, + maxSize: { value: maxSize, message: errorUtil.toString(message) }, }); } - length(len, message) { - return new ZodArray({ - ...this._def, - exactLength: { value: len, message: errorUtil.toString(message) }, - }); + size(size, message) { + return this.min(size, message).max(size, message); } nonempty(message) { return this.min(1, message); } } -ZodArray.create = (schema, params) => { - return new ZodArray({ - type: schema, - minLength: null, - maxLength: null, - exactLength: null, - typeName: ZodFirstPartyTypeKind.ZodArray, +ZodSet.create = (valueType, params) => { + return new ZodSet({ + valueType, + minSize: null, + maxSize: null, + typeName: ZodFirstPartyTypeKind.ZodSet, ...processCreateParams(params), }); }; -function deepPartialify(schema) { - if (schema instanceof ZodObject) { - const newShape = {}; - for (const key in schema.shape) { - const fieldSchema = schema.shape[key]; - newShape[key] = ZodOptional.create(deepPartialify(fieldSchema)); - } - return new ZodObject({ - ...schema._def, - shape: () => newShape, - }); - } - else if (schema instanceof ZodArray) { - return new ZodArray({ - ...schema._def, - type: deepPartialify(schema.element), - }); - } - else if (schema instanceof ZodOptional) { - return ZodOptional.create(deepPartialify(schema.unwrap())); - } - else if (schema instanceof ZodNullable) { - return ZodNullable.create(deepPartialify(schema.unwrap())); - } - else if (schema instanceof ZodTuple) { - return ZodTuple.create(schema.items.map((item) => deepPartialify(item))); - } - else { - return schema; - } -} -class ZodObject extends ZodType { +class ZodFunction extends ZodType { constructor() { super(...arguments); - this._cached = null; - /** - * @deprecated In most cases, this is no longer needed - unknown properties are now silently stripped. - * If you want to pass through unknown properties, use `.passthrough()` instead. - */ - this.nonstrict = this.passthrough; - // extend< - // Augmentation extends ZodRawShape, - // NewOutput extends util.flatten<{ - // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation - // ? Augmentation[k]["_output"] - // : k extends keyof Output - // ? Output[k] - // : never; - // }>, - // NewInput extends util.flatten<{ - // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation - // ? Augmentation[k]["_input"] - // : k extends keyof Input - // ? Input[k] - // : never; - // }> - // >( - // augmentation: Augmentation - // ): ZodObject< - // extendShape, - // UnknownKeys, - // Catchall, - // NewOutput, - // NewInput - // > { - // return new ZodObject({ - // ...this._def, - // shape: () => ({ - // ...this._def.shape(), - // ...augmentation, - // }), - // }) as any; - // } - /** - * @deprecated Use `.extend` instead - * */ - this.augment = this.extend; - } - _getCached() { - if (this._cached !== null) - return this._cached; - const shape = this._def.shape(); - const keys = util.objectKeys(shape); - return (this._cached = { shape, keys }); + this.validate = this.implement; } _parse(input) { - const parsedType = this._getType(input); - if (parsedType !== ZodParsedType.object) { - const ctx = this._getOrReturnCtx(input); + const { ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.function) { addIssueToContext(ctx, { code: ZodIssueCode.invalid_type, - expected: ZodParsedType.object, + expected: ZodParsedType.function, received: ctx.parsedType, }); return INVALID; } - const { status, ctx } = this._processInputParams(input); - const { shape, keys: shapeKeys } = this._getCached(); - const extraKeys = []; - if (!(this._def.catchall instanceof ZodNever && - this._def.unknownKeys === "strip")) { - for (const key in ctx.data) { - if (!shapeKeys.includes(key)) { - extraKeys.push(key); - } - } - } - const pairs = []; - for (const key of shapeKeys) { - const keyValidator = shape[key]; - const value = ctx.data[key]; - pairs.push({ - key: { status: "valid", value: key }, - value: keyValidator._parse(new ParseInputLazyPath(ctx, value, ctx.path, key)), - alwaysSet: key in ctx.data, + function makeArgsIssue(args, error) { + return makeIssue({ + data: args, + path: ctx.path, + errorMaps: [ + ctx.common.contextualErrorMap, + ctx.schemaErrorMap, + getErrorMap(), + errorMap, + ].filter((x) => !!x), + issueData: { + code: ZodIssueCode.invalid_arguments, + argumentsError: error, + }, }); } - if (this._def.catchall instanceof ZodNever) { - const unknownKeys = this._def.unknownKeys; - if (unknownKeys === "passthrough") { - for (const key of extraKeys) { - pairs.push({ - key: { status: "valid", value: key }, - value: { status: "valid", value: ctx.data[key] }, - }); - } - } - else if (unknownKeys === "strict") { - if (extraKeys.length > 0) { - addIssueToContext(ctx, { - code: ZodIssueCode.unrecognized_keys, - keys: extraKeys, - }); - status.dirty(); - } - } - else if (unknownKeys === "strip") ; - else { - throw new Error(`Internal ZodObject error: invalid unknownKeys value.`); - } + function makeReturnsIssue(returns, error) { + return makeIssue({ + data: returns, + path: ctx.path, + errorMaps: [ + ctx.common.contextualErrorMap, + ctx.schemaErrorMap, + getErrorMap(), + errorMap, + ].filter((x) => !!x), + issueData: { + code: ZodIssueCode.invalid_return_type, + returnTypeError: error, + }, + }); } - else { - // run catchall validation - const catchall = this._def.catchall; - for (const key of extraKeys) { - const value = ctx.data[key]; - pairs.push({ - key: { status: "valid", value: key }, - value: catchall._parse(new ParseInputLazyPath(ctx, value, ctx.path, key) //, ctx.child(key), value, getParsedType(value) - ), - alwaysSet: key in ctx.data, + const params = { errorMap: ctx.common.contextualErrorMap }; + const fn = ctx.data; + if (this._def.returns instanceof ZodPromise) { + // Would love a way to avoid disabling this rule, but we need + // an alias (using an arrow function was what caused 2651). + // eslint-disable-next-line @typescript-eslint/no-this-alias + const me = this; + return OK(async function (...args) { + const error = new ZodError([]); + const parsedArgs = await me._def.args + .parseAsync(args, params) + .catch((e) => { + error.addIssue(makeArgsIssue(args, e)); + throw error; }); - } - } - if (ctx.common.async) { - return Promise.resolve() - .then(async () => { - const syncPairs = []; - for (const pair of pairs) { - const key = await pair.key; - const value = await pair.value; - syncPairs.push({ - key, - value, - alwaysSet: pair.alwaysSet, - }); - } - return syncPairs; - }) - .then((syncPairs) => { - return ParseStatus.mergeObjectSync(status, syncPairs); + const result = await Reflect.apply(fn, this, parsedArgs); + const parsedReturns = await me._def.returns._def.type + .parseAsync(result, params) + .catch((e) => { + error.addIssue(makeReturnsIssue(result, e)); + throw error; + }); + return parsedReturns; }); } else { - return ParseStatus.mergeObjectSync(status, pairs); - } - } - get shape() { - return this._def.shape(); - } - strict(message) { - errorUtil.errToObj; - return new ZodObject({ - ...this._def, - unknownKeys: "strict", - ...(message !== undefined - ? { - errorMap: (issue, ctx) => { - var _a, _b, _c, _d; - const defaultError = (_c = (_b = (_a = this._def).errorMap) === null || _b === void 0 ? void 0 : _b.call(_a, issue, ctx).message) !== null && _c !== void 0 ? _c : ctx.defaultError; - if (issue.code === "unrecognized_keys") - return { - message: (_d = errorUtil.errToObj(message).message) !== null && _d !== void 0 ? _d : defaultError, - }; - return { - message: defaultError, - }; - }, + // Would love a way to avoid disabling this rule, but we need + // an alias (using an arrow function was what caused 2651). + // eslint-disable-next-line @typescript-eslint/no-this-alias + const me = this; + return OK(function (...args) { + const parsedArgs = me._def.args.safeParse(args, params); + if (!parsedArgs.success) { + throw new ZodError([makeArgsIssue(args, parsedArgs.error)]); } - : {}), - }); - } - strip() { - return new ZodObject({ - ...this._def, - unknownKeys: "strip", - }); - } - passthrough() { - return new ZodObject({ - ...this._def, - unknownKeys: "passthrough", - }); - } - // const AugmentFactory = - // (def: Def) => - // ( - // augmentation: Augmentation - // ): ZodObject< - // extendShape, Augmentation>, - // Def["unknownKeys"], - // Def["catchall"] - // > => { - // return new ZodObject({ - // ...def, - // shape: () => ({ - // ...def.shape(), - // ...augmentation, - // }), - // }) as any; - // }; - extend(augmentation) { - return new ZodObject({ - ...this._def, - shape: () => ({ - ...this._def.shape(), - ...augmentation, - }), - }); + const result = Reflect.apply(fn, this, parsedArgs.data); + const parsedReturns = me._def.returns.safeParse(result, params); + if (!parsedReturns.success) { + throw new ZodError([makeReturnsIssue(result, parsedReturns.error)]); + } + return parsedReturns.data; + }); + } } - /** - * Prior to zod@1.0.12 there was a bug in the - * inferred type of merged objects. Please - * upgrade if you are experiencing issues. - */ - merge(merging) { - const merged = new ZodObject({ - unknownKeys: merging._def.unknownKeys, - catchall: merging._def.catchall, - shape: () => ({ - ...this._def.shape(), - ...merging._def.shape(), - }), - typeName: ZodFirstPartyTypeKind.ZodObject, - }); - return merged; + parameters() { + return this._def.args; } - // merge< - // Incoming extends AnyZodObject, - // Augmentation extends Incoming["shape"], - // NewOutput extends { - // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation - // ? Augmentation[k]["_output"] - // : k extends keyof Output - // ? Output[k] - // : never; - // }, - // NewInput extends { - // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation - // ? Augmentation[k]["_input"] - // : k extends keyof Input - // ? Input[k] - // : never; - // } - // >( - // merging: Incoming - // ): ZodObject< - // extendShape>, - // Incoming["_def"]["unknownKeys"], - // Incoming["_def"]["catchall"], - // NewOutput, - // NewInput - // > { - // const merged: any = new ZodObject({ - // unknownKeys: merging._def.unknownKeys, - // catchall: merging._def.catchall, - // shape: () => - // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()), - // typeName: ZodFirstPartyTypeKind.ZodObject, - // }) as any; - // return merged; - // } - setKey(key, schema) { - return this.augment({ [key]: schema }); + returnType() { + return this._def.returns; } - // merge( - // merging: Incoming - // ): //ZodObject = (merging) => { - // ZodObject< - // extendShape>, - // Incoming["_def"]["unknownKeys"], - // Incoming["_def"]["catchall"] - // > { - // // const mergedShape = objectUtil.mergeShapes( - // // this._def.shape(), - // // merging._def.shape() - // // ); - // const merged: any = new ZodObject({ - // unknownKeys: merging._def.unknownKeys, - // catchall: merging._def.catchall, - // shape: () => - // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()), - // typeName: ZodFirstPartyTypeKind.ZodObject, - // }) as any; - // return merged; - // } - catchall(index) { - return new ZodObject({ + args(...items) { + return new ZodFunction({ ...this._def, - catchall: index, + args: ZodTuple.create(items).rest(ZodUnknown.create()), }); } - pick(mask) { - const shape = {}; - util.objectKeys(mask).forEach((key) => { - if (mask[key] && this.shape[key]) { - shape[key] = this.shape[key]; - } - }); - return new ZodObject({ + returns(returnType) { + return new ZodFunction({ ...this._def, - shape: () => shape, + returns: returnType, }); } - omit(mask) { - const shape = {}; - util.objectKeys(this.shape).forEach((key) => { - if (!mask[key]) { - shape[key] = this.shape[key]; - } - }); - return new ZodObject({ - ...this._def, - shape: () => shape, - }); + implement(func) { + const validatedFunc = this.parse(func); + return validatedFunc; } - /** - * @deprecated - */ - deepPartial() { - return deepPartialify(this); + strictImplement(func) { + const validatedFunc = this.parse(func); + return validatedFunc; } - partial(mask) { - const newShape = {}; - util.objectKeys(this.shape).forEach((key) => { - const fieldSchema = this.shape[key]; - if (mask && !mask[key]) { - newShape[key] = fieldSchema; - } - else { - newShape[key] = fieldSchema.optional(); - } - }); - return new ZodObject({ - ...this._def, - shape: () => newShape, + static create(args, returns, params) { + return new ZodFunction({ + args: (args + ? args + : ZodTuple.create([]).rest(ZodUnknown.create())), + returns: returns || ZodUnknown.create(), + typeName: ZodFirstPartyTypeKind.ZodFunction, + ...processCreateParams(params), }); } - required(mask) { - const newShape = {}; - util.objectKeys(this.shape).forEach((key) => { - if (mask && !mask[key]) { - newShape[key] = this.shape[key]; - } - else { - const fieldSchema = this.shape[key]; - let newField = fieldSchema; - while (newField instanceof ZodOptional) { - newField = newField._def.innerType; - } - newShape[key] = newField; - } - }); - return new ZodObject({ - ...this._def, - shape: () => newShape, - }); +} +class ZodLazy extends ZodType { + get schema() { + return this._def.getter(); } - keyof() { - return createZodEnum(util.objectKeys(this.shape)); + _parse(input) { + const { ctx } = this._processInputParams(input); + const lazySchema = this._def.getter(); + return lazySchema._parse({ data: ctx.data, path: ctx.path, parent: ctx }); } } -ZodObject.create = (shape, params) => { - return new ZodObject({ - shape: () => shape, - unknownKeys: "strip", - catchall: ZodNever.create(), - typeName: ZodFirstPartyTypeKind.ZodObject, +ZodLazy.create = (getter, params) => { + return new ZodLazy({ + getter: getter, + typeName: ZodFirstPartyTypeKind.ZodLazy, ...processCreateParams(params), }); }; -ZodObject.strictCreate = (shape, params) => { - return new ZodObject({ - shape: () => shape, - unknownKeys: "strict", - catchall: ZodNever.create(), - typeName: ZodFirstPartyTypeKind.ZodObject, +class ZodLiteral extends ZodType { + _parse(input) { + if (input.data !== this._def.value) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + received: ctx.data, + code: ZodIssueCode.invalid_literal, + expected: this._def.value, + }); + return INVALID; + } + return { status: "valid", value: input.data }; + } + get value() { + return this._def.value; + } +} +ZodLiteral.create = (value, params) => { + return new ZodLiteral({ + value: value, + typeName: ZodFirstPartyTypeKind.ZodLiteral, ...processCreateParams(params), }); }; -ZodObject.lazycreate = (shape, params) => { - return new ZodObject({ - shape, - unknownKeys: "strip", - catchall: ZodNever.create(), - typeName: ZodFirstPartyTypeKind.ZodObject, +function createZodEnum(values, params) { + return new ZodEnum({ + values, + typeName: ZodFirstPartyTypeKind.ZodEnum, ...processCreateParams(params), }); -}; -class ZodUnion extends ZodType { +} +class ZodEnum extends ZodType { + constructor() { + super(...arguments); + _ZodEnum_cache.set(this, void 0); + } _parse(input) { - const { ctx } = this._processInputParams(input); - const options = this._def.options; - function handleResults(results) { - // return first issue-free validation if it exists - for (const result of results) { - if (result.result.status === "valid") { - return result.result; - } - } - for (const result of results) { - if (result.result.status === "dirty") { - // add issues from dirty option - ctx.common.issues.push(...result.ctx.common.issues); - return result.result; - } - } - // return invalid - const unionErrors = results.map((result) => new ZodError(result.ctx.common.issues)); + if (typeof input.data !== "string") { + const ctx = this._getOrReturnCtx(input); + const expectedValues = this._def.values; addIssueToContext(ctx, { - code: ZodIssueCode.invalid_union, - unionErrors, + expected: util.joinValues(expectedValues), + received: ctx.parsedType, + code: ZodIssueCode.invalid_type, }); return INVALID; } - if (ctx.common.async) { - return Promise.all(options.map(async (option) => { - const childCtx = { - ...ctx, - common: { - ...ctx.common, - issues: [], - }, - parent: null, - }; - return { - result: await option._parseAsync({ - data: ctx.data, - path: ctx.path, - parent: childCtx, - }), - ctx: childCtx, - }; - })).then(handleResults); + if (!__classPrivateFieldGet(this, _ZodEnum_cache, "f")) { + __classPrivateFieldSet(this, _ZodEnum_cache, new Set(this._def.values), "f"); } - else { - let dirty = undefined; - const issues = []; - for (const option of options) { - const childCtx = { - ...ctx, - common: { - ...ctx.common, - issues: [], - }, - parent: null, - }; - const result = option._parseSync({ - data: ctx.data, - path: ctx.path, - parent: childCtx, - }); - if (result.status === "valid") { - return result; - } - else if (result.status === "dirty" && !dirty) { - dirty = { result, ctx: childCtx }; - } - if (childCtx.common.issues.length) { - issues.push(childCtx.common.issues); - } - } - if (dirty) { - ctx.common.issues.push(...dirty.ctx.common.issues); - return dirty.result; - } - const unionErrors = issues.map((issues) => new ZodError(issues)); + if (!__classPrivateFieldGet(this, _ZodEnum_cache, "f").has(input.data)) { + const ctx = this._getOrReturnCtx(input); + const expectedValues = this._def.values; + addIssueToContext(ctx, { + received: ctx.data, + code: ZodIssueCode.invalid_enum_value, + options: expectedValues, + }); + return INVALID; + } + return OK(input.data); + } + get options() { + return this._def.values; + } + get enum() { + const enumValues = {}; + for (const val of this._def.values) { + enumValues[val] = val; + } + return enumValues; + } + get Values() { + const enumValues = {}; + for (const val of this._def.values) { + enumValues[val] = val; + } + return enumValues; + } + get Enum() { + const enumValues = {}; + for (const val of this._def.values) { + enumValues[val] = val; + } + return enumValues; + } + extract(values, newDef = this._def) { + return ZodEnum.create(values, { + ...this._def, + ...newDef, + }); + } + exclude(values, newDef = this._def) { + return ZodEnum.create(this.options.filter((opt) => !values.includes(opt)), { + ...this._def, + ...newDef, + }); + } +} +_ZodEnum_cache = new WeakMap(); +ZodEnum.create = createZodEnum; +class ZodNativeEnum extends ZodType { + constructor() { + super(...arguments); + _ZodNativeEnum_cache.set(this, void 0); + } + _parse(input) { + const nativeEnumValues = util.getValidEnumValues(this._def.values); + const ctx = this._getOrReturnCtx(input); + if (ctx.parsedType !== ZodParsedType.string && + ctx.parsedType !== ZodParsedType.number) { + const expectedValues = util.objectValues(nativeEnumValues); + addIssueToContext(ctx, { + expected: util.joinValues(expectedValues), + received: ctx.parsedType, + code: ZodIssueCode.invalid_type, + }); + return INVALID; + } + if (!__classPrivateFieldGet(this, _ZodNativeEnum_cache, "f")) { + __classPrivateFieldSet(this, _ZodNativeEnum_cache, new Set(util.getValidEnumValues(this._def.values)), "f"); + } + if (!__classPrivateFieldGet(this, _ZodNativeEnum_cache, "f").has(input.data)) { + const expectedValues = util.objectValues(nativeEnumValues); addIssueToContext(ctx, { - code: ZodIssueCode.invalid_union, - unionErrors, + received: ctx.data, + code: ZodIssueCode.invalid_enum_value, + options: expectedValues, }); return INVALID; } + return OK(input.data); } - get options() { - return this._def.options; + get enum() { + return this._def.values; } } -ZodUnion.create = (types, params) => { - return new ZodUnion({ - options: types, - typeName: ZodFirstPartyTypeKind.ZodUnion, +_ZodNativeEnum_cache = new WeakMap(); +ZodNativeEnum.create = (values, params) => { + return new ZodNativeEnum({ + values: values, + typeName: ZodFirstPartyTypeKind.ZodNativeEnum, ...processCreateParams(params), }); }; -///////////////////////////////////////////////////// -///////////////////////////////////////////////////// -////////// ////////// -////////// ZodDiscriminatedUnion ////////// -////////// ////////// -///////////////////////////////////////////////////// -///////////////////////////////////////////////////// -const getDiscriminator = (type) => { - if (type instanceof ZodLazy) { - return getDiscriminator(type.schema); - } - else if (type instanceof ZodEffects) { - return getDiscriminator(type.innerType()); - } - else if (type instanceof ZodLiteral) { - return [type.value]; - } - else if (type instanceof ZodEnum) { - return type.options; - } - else if (type instanceof ZodNativeEnum) { - // eslint-disable-next-line ban/ban - return util.objectValues(type.enum); - } - else if (type instanceof ZodDefault) { - return getDiscriminator(type._def.innerType); - } - else if (type instanceof ZodUndefined) { - return [undefined]; - } - else if (type instanceof ZodNull) { - return [null]; - } - else if (type instanceof ZodOptional) { - return [undefined, ...getDiscriminator(type.unwrap())]; - } - else if (type instanceof ZodNullable) { - return [null, ...getDiscriminator(type.unwrap())]; - } - else if (type instanceof ZodBranded) { - return getDiscriminator(type.unwrap()); - } - else if (type instanceof ZodReadonly) { - return getDiscriminator(type.unwrap()); - } - else if (type instanceof ZodCatch) { - return getDiscriminator(type._def.innerType); - } - else { - return []; +class ZodPromise extends ZodType { + unwrap() { + return this._def.type; } -}; -class ZodDiscriminatedUnion extends ZodType { _parse(input) { const { ctx } = this._processInputParams(input); - if (ctx.parsedType !== ZodParsedType.object) { + if (ctx.parsedType !== ZodParsedType.promise && + ctx.common.async === false) { addIssueToContext(ctx, { code: ZodIssueCode.invalid_type, - expected: ZodParsedType.object, + expected: ZodParsedType.promise, received: ctx.parsedType, }); return INVALID; } - const discriminator = this.discriminator; - const discriminatorValue = ctx.data[discriminator]; - const option = this.optionsMap.get(discriminatorValue); - if (!option) { - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_union_discriminator, - options: Array.from(this.optionsMap.keys()), - path: [discriminator], - }); - return INVALID; - } - if (ctx.common.async) { - return option._parseAsync({ - data: ctx.data, - path: ctx.path, - parent: ctx, - }); - } - else { - return option._parseSync({ - data: ctx.data, + const promisified = ctx.parsedType === ZodParsedType.promise + ? ctx.data + : Promise.resolve(ctx.data); + return OK(promisified.then((data) => { + return this._def.type.parseAsync(data, { path: ctx.path, - parent: ctx, + errorMap: ctx.common.contextualErrorMap, }); - } - } - get discriminator() { - return this._def.discriminator; - } - get options() { - return this._def.options; - } - get optionsMap() { - return this._def.optionsMap; - } - /** - * The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor. - * However, it only allows a union of objects, all of which need to share a discriminator property. This property must - * have a different value for each object in the union. - * @param discriminator the name of the discriminator property - * @param types an array of object schemas - * @param params - */ - static create(discriminator, options, params) { - // Get all the valid discriminator values - const optionsMap = new Map(); - // try { - for (const type of options) { - const discriminatorValues = getDiscriminator(type.shape[discriminator]); - if (!discriminatorValues.length) { - throw new Error(`A discriminator value for key \`${discriminator}\` could not be extracted from all schema options`); - } - for (const value of discriminatorValues) { - if (optionsMap.has(value)) { - throw new Error(`Discriminator property ${String(discriminator)} has duplicate value ${String(value)}`); - } - optionsMap.set(value, type); - } - } - return new ZodDiscriminatedUnion({ - typeName: ZodFirstPartyTypeKind.ZodDiscriminatedUnion, - discriminator, - options, - optionsMap, - ...processCreateParams(params), - }); + })); } } -function mergeValues(a, b) { - const aType = getParsedType(a); - const bType = getParsedType(b); - if (a === b) { - return { valid: true, data: a }; - } - else if (aType === ZodParsedType.object && bType === ZodParsedType.object) { - const bKeys = util.objectKeys(b); - const sharedKeys = util - .objectKeys(a) - .filter((key) => bKeys.indexOf(key) !== -1); - const newObj = { ...a, ...b }; - for (const key of sharedKeys) { - const sharedValue = mergeValues(a[key], b[key]); - if (!sharedValue.valid) { - return { valid: false }; - } - newObj[key] = sharedValue.data; - } - return { valid: true, data: newObj }; - } - else if (aType === ZodParsedType.array && bType === ZodParsedType.array) { - if (a.length !== b.length) { - return { valid: false }; - } - const newArray = []; - for (let index = 0; index < a.length; index++) { - const itemA = a[index]; - const itemB = b[index]; - const sharedValue = mergeValues(itemA, itemB); - if (!sharedValue.valid) { - return { valid: false }; - } - newArray.push(sharedValue.data); - } - return { valid: true, data: newArray }; - } - else if (aType === ZodParsedType.date && - bType === ZodParsedType.date && - +a === +b) { - return { valid: true, data: a }; +ZodPromise.create = (schema, params) => { + return new ZodPromise({ + type: schema, + typeName: ZodFirstPartyTypeKind.ZodPromise, + ...processCreateParams(params), + }); +}; +class ZodEffects extends ZodType { + innerType() { + return this._def.schema; } - else { - return { valid: false }; + sourceType() { + return this._def.schema._def.typeName === ZodFirstPartyTypeKind.ZodEffects + ? this._def.schema.sourceType() + : this._def.schema; } -} -class ZodIntersection extends ZodType { _parse(input) { const { status, ctx } = this._processInputParams(input); - const handleParsed = (parsedLeft, parsedRight) => { - if (isAborted(parsedLeft) || isAborted(parsedRight)) { - return INVALID; - } - const merged = mergeValues(parsedLeft.value, parsedRight.value); - if (!merged.valid) { - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_intersection_types, + const effect = this._def.effect || null; + const checkCtx = { + addIssue: (arg) => { + addIssueToContext(ctx, arg); + if (arg.fatal) { + status.abort(); + } + else { + status.dirty(); + } + }, + get path() { + return ctx.path; + }, + }; + checkCtx.addIssue = checkCtx.addIssue.bind(checkCtx); + if (effect.type === "preprocess") { + const processed = effect.transform(ctx.data, checkCtx); + if (ctx.common.async) { + return Promise.resolve(processed).then(async (processed) => { + if (status.value === "aborted") + return INVALID; + const result = await this._def.schema._parseAsync({ + data: processed, + path: ctx.path, + parent: ctx, + }); + if (result.status === "aborted") + return INVALID; + if (result.status === "dirty") + return DIRTY(result.value); + if (status.value === "dirty") + return DIRTY(result.value); + return result; }); - return INVALID; } - if (isDirty(parsedLeft) || isDirty(parsedRight)) { - status.dirty(); + else { + if (status.value === "aborted") + return INVALID; + const result = this._def.schema._parseSync({ + data: processed, + path: ctx.path, + parent: ctx, + }); + if (result.status === "aborted") + return INVALID; + if (result.status === "dirty") + return DIRTY(result.value); + if (status.value === "dirty") + return DIRTY(result.value); + return result; } - return { status: status.value, value: merged.data }; - }; - if (ctx.common.async) { - return Promise.all([ - this._def.left._parseAsync({ + } + if (effect.type === "refinement") { + const executeRefinement = (acc) => { + const result = effect.refinement(acc, checkCtx); + if (ctx.common.async) { + return Promise.resolve(result); + } + if (result instanceof Promise) { + throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead."); + } + return acc; + }; + if (ctx.common.async === false) { + const inner = this._def.schema._parseSync({ data: ctx.data, path: ctx.path, parent: ctx, - }), - this._def.right._parseAsync({ + }); + if (inner.status === "aborted") + return INVALID; + if (inner.status === "dirty") + status.dirty(); + // return value is ignored + executeRefinement(inner.value); + return { status: status.value, value: inner.value }; + } + else { + return this._def.schema + ._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }) + .then((inner) => { + if (inner.status === "aborted") + return INVALID; + if (inner.status === "dirty") + status.dirty(); + return executeRefinement(inner.value).then(() => { + return { status: status.value, value: inner.value }; + }); + }); + } + } + if (effect.type === "transform") { + if (ctx.common.async === false) { + const base = this._def.schema._parseSync({ data: ctx.data, path: ctx.path, parent: ctx, - }), - ]).then(([left, right]) => handleParsed(left, right)); - } - else { - return handleParsed(this._def.left._parseSync({ - data: ctx.data, - path: ctx.path, - parent: ctx, - }), this._def.right._parseSync({ - data: ctx.data, - path: ctx.path, - parent: ctx, - })); + }); + if (!isValid(base)) + return base; + const result = effect.transform(base.value, checkCtx); + if (result instanceof Promise) { + throw new Error(`Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.`); + } + return { status: status.value, value: result }; + } + else { + return this._def.schema + ._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }) + .then((base) => { + if (!isValid(base)) + return base; + return Promise.resolve(effect.transform(base.value, checkCtx)).then((result) => ({ status: status.value, value: result })); + }); + } } + util.assertNever(effect); } } -ZodIntersection.create = (left, right, params) => { - return new ZodIntersection({ - left: left, - right: right, - typeName: ZodFirstPartyTypeKind.ZodIntersection, +ZodEffects.create = (schema, effect, params) => { + return new ZodEffects({ + schema, + typeName: ZodFirstPartyTypeKind.ZodEffects, + effect, ...processCreateParams(params), }); }; -class ZodTuple extends ZodType { +ZodEffects.createWithPreprocess = (preprocess, schema, params) => { + return new ZodEffects({ + schema, + effect: { type: "preprocess", transform: preprocess }, + typeName: ZodFirstPartyTypeKind.ZodEffects, + ...processCreateParams(params), + }); +}; +class ZodOptional extends ZodType { _parse(input) { - const { status, ctx } = this._processInputParams(input); - if (ctx.parsedType !== ZodParsedType.array) { - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_type, - expected: ZodParsedType.array, - received: ctx.parsedType, - }); - return INVALID; + const parsedType = this._getType(input); + if (parsedType === ZodParsedType.undefined) { + return OK(undefined); } - if (ctx.data.length < this._def.items.length) { - addIssueToContext(ctx, { - code: ZodIssueCode.too_small, - minimum: this._def.items.length, - inclusive: true, - exact: false, - type: "array", - }); - return INVALID; + return this._def.innerType._parse(input); + } + unwrap() { + return this._def.innerType; + } +} +ZodOptional.create = (type, params) => { + return new ZodOptional({ + innerType: type, + typeName: ZodFirstPartyTypeKind.ZodOptional, + ...processCreateParams(params), + }); +}; +class ZodNullable extends ZodType { + _parse(input) { + const parsedType = this._getType(input); + if (parsedType === ZodParsedType.null) { + return OK(null); } - const rest = this._def.rest; - if (!rest && ctx.data.length > this._def.items.length) { - addIssueToContext(ctx, { - code: ZodIssueCode.too_big, - maximum: this._def.items.length, - inclusive: true, - exact: false, - type: "array", - }); - status.dirty(); + return this._def.innerType._parse(input); + } + unwrap() { + return this._def.innerType; + } +} +ZodNullable.create = (type, params) => { + return new ZodNullable({ + innerType: type, + typeName: ZodFirstPartyTypeKind.ZodNullable, + ...processCreateParams(params), + }); +}; +class ZodDefault extends ZodType { + _parse(input) { + const { ctx } = this._processInputParams(input); + let data = ctx.data; + if (ctx.parsedType === ZodParsedType.undefined) { + data = this._def.defaultValue(); } - const items = [...ctx.data] - .map((item, itemIndex) => { - const schema = this._def.items[itemIndex] || this._def.rest; - if (!schema) - return null; - return schema._parse(new ParseInputLazyPath(ctx, item, ctx.path, itemIndex)); - }) - .filter((x) => !!x); // filter nulls - if (ctx.common.async) { - return Promise.all(items).then((results) => { - return ParseStatus.mergeArray(status, results); + return this._def.innerType._parse({ + data, + path: ctx.path, + parent: ctx, + }); + } + removeDefault() { + return this._def.innerType; + } +} +ZodDefault.create = (type, params) => { + return new ZodDefault({ + innerType: type, + typeName: ZodFirstPartyTypeKind.ZodDefault, + defaultValue: typeof params.default === "function" + ? params.default + : () => params.default, + ...processCreateParams(params), + }); +}; +class ZodCatch extends ZodType { + _parse(input) { + const { ctx } = this._processInputParams(input); + // newCtx is used to not collect issues from inner types in ctx + const newCtx = { + ...ctx, + common: { + ...ctx.common, + issues: [], + }, + }; + const result = this._def.innerType._parse({ + data: newCtx.data, + path: newCtx.path, + parent: { + ...newCtx, + }, + }); + if (isAsync(result)) { + return result.then((result) => { + return { + status: "valid", + value: result.status === "valid" + ? result.value + : this._def.catchValue({ + get error() { + return new ZodError(newCtx.common.issues); + }, + input: newCtx.data, + }), + }; }); } else { - return ParseStatus.mergeArray(status, items); + return { + status: "valid", + value: result.status === "valid" + ? result.value + : this._def.catchValue({ + get error() { + return new ZodError(newCtx.common.issues); + }, + input: newCtx.data, + }), + }; } } - get items() { - return this._def.items; - } - rest(rest) { - return new ZodTuple({ - ...this._def, - rest, - }); + removeCatch() { + return this._def.innerType; } } -ZodTuple.create = (schemas, params) => { - if (!Array.isArray(schemas)) { - throw new Error("You must pass an array of schemas to z.tuple([ ... ])"); - } - return new ZodTuple({ - items: schemas, - typeName: ZodFirstPartyTypeKind.ZodTuple, - rest: null, +ZodCatch.create = (type, params) => { + return new ZodCatch({ + innerType: type, + typeName: ZodFirstPartyTypeKind.ZodCatch, + catchValue: typeof params.catch === "function" ? params.catch : () => params.catch, ...processCreateParams(params), }); }; -class ZodRecord extends ZodType { - get keySchema() { - return this._def.keyType; - } - get valueSchema() { - return this._def.valueType; - } +class ZodNaN extends ZodType { _parse(input) { - const { status, ctx } = this._processInputParams(input); - if (ctx.parsedType !== ZodParsedType.object) { + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.nan) { + const ctx = this._getOrReturnCtx(input); addIssueToContext(ctx, { code: ZodIssueCode.invalid_type, - expected: ZodParsedType.object, + expected: ZodParsedType.nan, received: ctx.parsedType, }); return INVALID; } - const pairs = []; - const keyType = this._def.keyType; - const valueType = this._def.valueType; - for (const key in ctx.data) { - pairs.push({ - key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, key)), - value: valueType._parse(new ParseInputLazyPath(ctx, ctx.data[key], ctx.path, key)), - alwaysSet: key in ctx.data, - }); - } + return { status: "valid", value: input.data }; + } +} +ZodNaN.create = (params) => { + return new ZodNaN({ + typeName: ZodFirstPartyTypeKind.ZodNaN, + ...processCreateParams(params), + }); +}; +const BRAND = Symbol("zod_brand"); +class ZodBranded extends ZodType { + _parse(input) { + const { ctx } = this._processInputParams(input); + const data = ctx.data; + return this._def.type._parse({ + data, + path: ctx.path, + parent: ctx, + }); + } + unwrap() { + return this._def.type; + } +} +class ZodPipeline extends ZodType { + _parse(input) { + const { status, ctx } = this._processInputParams(input); if (ctx.common.async) { - return ParseStatus.mergeObjectAsync(status, pairs); + const handleAsync = async () => { + const inResult = await this._def.in._parseAsync({ + data: ctx.data, + path: ctx.path, + parent: ctx, + }); + if (inResult.status === "aborted") + return INVALID; + if (inResult.status === "dirty") { + status.dirty(); + return DIRTY(inResult.value); + } + else { + return this._def.out._parseAsync({ + data: inResult.value, + path: ctx.path, + parent: ctx, + }); + } + }; + return handleAsync(); } else { - return ParseStatus.mergeObjectSync(status, pairs); - } - } - get element() { - return this._def.valueType; - } - static create(first, second, third) { - if (second instanceof ZodType) { - return new ZodRecord({ - keyType: first, - valueType: second, - typeName: ZodFirstPartyTypeKind.ZodRecord, - ...processCreateParams(third), + const inResult = this._def.in._parseSync({ + data: ctx.data, + path: ctx.path, + parent: ctx, }); + if (inResult.status === "aborted") + return INVALID; + if (inResult.status === "dirty") { + status.dirty(); + return { + status: "dirty", + value: inResult.value, + }; + } + else { + return this._def.out._parseSync({ + data: inResult.value, + path: ctx.path, + parent: ctx, + }); + } } - return new ZodRecord({ - keyType: ZodString.create(), - valueType: first, - typeName: ZodFirstPartyTypeKind.ZodRecord, - ...processCreateParams(second), + } + static create(a, b) { + return new ZodPipeline({ + in: a, + out: b, + typeName: ZodFirstPartyTypeKind.ZodPipeline, }); } } -class ZodMap extends ZodType { - get keySchema() { - return this._def.keyType; +class ZodReadonly extends ZodType { + _parse(input) { + const result = this._def.innerType._parse(input); + const freeze = (data) => { + if (isValid(data)) { + data.value = Object.freeze(data.value); + } + return data; + }; + return isAsync(result) + ? result.then((data) => freeze(data)) + : freeze(result); } - get valueSchema() { - return this._def.valueType; + unwrap() { + return this._def.innerType; } - _parse(input) { - const { status, ctx } = this._processInputParams(input); - if (ctx.parsedType !== ZodParsedType.map) { - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_type, - expected: ZodParsedType.map, - received: ctx.parsedType, - }); - return INVALID; - } - const keyType = this._def.keyType; - const valueType = this._def.valueType; - const pairs = [...ctx.data.entries()].map(([key, value], index) => { - return { - key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, [index, "key"])), - value: valueType._parse(new ParseInputLazyPath(ctx, value, ctx.path, [index, "value"])), - }; +} +ZodReadonly.create = (type, params) => { + return new ZodReadonly({ + innerType: type, + typeName: ZodFirstPartyTypeKind.ZodReadonly, + ...processCreateParams(params), + }); +}; +function custom(check, params = {}, +/** + * @deprecated + * + * Pass `fatal` into the params object instead: + * + * ```ts + * z.string().custom((val) => val.length > 5, { fatal: false }) + * ``` + * + */ +fatal) { + if (check) + return ZodAny.create().superRefine((data, ctx) => { + var _a, _b; + if (!check(data)) { + const p = typeof params === "function" + ? params(data) + : typeof params === "string" + ? { message: params } + : params; + const _fatal = (_b = (_a = p.fatal) !== null && _a !== void 0 ? _a : fatal) !== null && _b !== void 0 ? _b : true; + const p2 = typeof p === "string" ? { message: p } : p; + ctx.addIssue({ code: "custom", ...p2, fatal: _fatal }); + } }); - if (ctx.common.async) { - const finalMap = new Map(); - return Promise.resolve().then(async () => { - for (const pair of pairs) { - const key = await pair.key; - const value = await pair.value; - if (key.status === "aborted" || value.status === "aborted") { - return INVALID; - } - if (key.status === "dirty" || value.status === "dirty") { - status.dirty(); - } - finalMap.set(key.value, value.value); - } - return { status: status.value, value: finalMap }; - }); - } - else { - const finalMap = new Map(); - for (const pair of pairs) { - const key = pair.key; - const value = pair.value; - if (key.status === "aborted" || value.status === "aborted") { - return INVALID; + return ZodAny.create(); +} +const late = { + object: ZodObject.lazycreate, +}; +var ZodFirstPartyTypeKind; +(function (ZodFirstPartyTypeKind) { + ZodFirstPartyTypeKind["ZodString"] = "ZodString"; + ZodFirstPartyTypeKind["ZodNumber"] = "ZodNumber"; + ZodFirstPartyTypeKind["ZodNaN"] = "ZodNaN"; + ZodFirstPartyTypeKind["ZodBigInt"] = "ZodBigInt"; + ZodFirstPartyTypeKind["ZodBoolean"] = "ZodBoolean"; + ZodFirstPartyTypeKind["ZodDate"] = "ZodDate"; + ZodFirstPartyTypeKind["ZodSymbol"] = "ZodSymbol"; + ZodFirstPartyTypeKind["ZodUndefined"] = "ZodUndefined"; + ZodFirstPartyTypeKind["ZodNull"] = "ZodNull"; + ZodFirstPartyTypeKind["ZodAny"] = "ZodAny"; + ZodFirstPartyTypeKind["ZodUnknown"] = "ZodUnknown"; + ZodFirstPartyTypeKind["ZodNever"] = "ZodNever"; + ZodFirstPartyTypeKind["ZodVoid"] = "ZodVoid"; + ZodFirstPartyTypeKind["ZodArray"] = "ZodArray"; + ZodFirstPartyTypeKind["ZodObject"] = "ZodObject"; + ZodFirstPartyTypeKind["ZodUnion"] = "ZodUnion"; + ZodFirstPartyTypeKind["ZodDiscriminatedUnion"] = "ZodDiscriminatedUnion"; + ZodFirstPartyTypeKind["ZodIntersection"] = "ZodIntersection"; + ZodFirstPartyTypeKind["ZodTuple"] = "ZodTuple"; + ZodFirstPartyTypeKind["ZodRecord"] = "ZodRecord"; + ZodFirstPartyTypeKind["ZodMap"] = "ZodMap"; + ZodFirstPartyTypeKind["ZodSet"] = "ZodSet"; + ZodFirstPartyTypeKind["ZodFunction"] = "ZodFunction"; + ZodFirstPartyTypeKind["ZodLazy"] = "ZodLazy"; + ZodFirstPartyTypeKind["ZodLiteral"] = "ZodLiteral"; + ZodFirstPartyTypeKind["ZodEnum"] = "ZodEnum"; + ZodFirstPartyTypeKind["ZodEffects"] = "ZodEffects"; + ZodFirstPartyTypeKind["ZodNativeEnum"] = "ZodNativeEnum"; + ZodFirstPartyTypeKind["ZodOptional"] = "ZodOptional"; + ZodFirstPartyTypeKind["ZodNullable"] = "ZodNullable"; + ZodFirstPartyTypeKind["ZodDefault"] = "ZodDefault"; + ZodFirstPartyTypeKind["ZodCatch"] = "ZodCatch"; + ZodFirstPartyTypeKind["ZodPromise"] = "ZodPromise"; + ZodFirstPartyTypeKind["ZodBranded"] = "ZodBranded"; + ZodFirstPartyTypeKind["ZodPipeline"] = "ZodPipeline"; + ZodFirstPartyTypeKind["ZodReadonly"] = "ZodReadonly"; +})(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {})); +const instanceOfType = ( +// const instanceOfType = any>( +cls, params = { + message: `Input not instance of ${cls.name}`, +}) => custom((data) => data instanceof cls, params); +const stringType = ZodString.create; +const numberType = ZodNumber.create; +const nanType = ZodNaN.create; +const bigIntType = ZodBigInt.create; +const booleanType = ZodBoolean.create; +const dateType = ZodDate.create; +const symbolType = ZodSymbol.create; +const undefinedType = ZodUndefined.create; +const nullType = ZodNull.create; +const anyType = ZodAny.create; +const unknownType = ZodUnknown.create; +const neverType = ZodNever.create; +const voidType = ZodVoid.create; +const arrayType = ZodArray.create; +const objectType = ZodObject.create; +const strictObjectType = ZodObject.strictCreate; +const unionType = ZodUnion.create; +const discriminatedUnionType = ZodDiscriminatedUnion.create; +const intersectionType = ZodIntersection.create; +const tupleType = ZodTuple.create; +const recordType = ZodRecord.create; +const mapType = ZodMap.create; +const setType = ZodSet.create; +const functionType = ZodFunction.create; +const lazyType = ZodLazy.create; +const literalType = ZodLiteral.create; +const enumType = ZodEnum.create; +const nativeEnumType = ZodNativeEnum.create; +const promiseType = ZodPromise.create; +const effectsType = ZodEffects.create; +const optionalType = ZodOptional.create; +const nullableType = ZodNullable.create; +const preprocessType = ZodEffects.createWithPreprocess; +const pipelineType = ZodPipeline.create; +const ostring = () => stringType().optional(); +const onumber = () => numberType().optional(); +const oboolean = () => booleanType().optional(); +const coerce = { + string: ((arg) => ZodString.create({ ...arg, coerce: true })), + number: ((arg) => ZodNumber.create({ ...arg, coerce: true })), + boolean: ((arg) => ZodBoolean.create({ + ...arg, + coerce: true, + })), + bigint: ((arg) => ZodBigInt.create({ ...arg, coerce: true })), + date: ((arg) => ZodDate.create({ ...arg, coerce: true })), +}; +const NEVER = INVALID; + +var z = /*#__PURE__*/Object.freeze({ + __proto__: null, + defaultErrorMap: errorMap, + setErrorMap: setErrorMap, + getErrorMap: getErrorMap, + makeIssue: makeIssue, + EMPTY_PATH: EMPTY_PATH, + addIssueToContext: addIssueToContext, + ParseStatus: ParseStatus, + INVALID: INVALID, + DIRTY: DIRTY, + OK: OK, + isAborted: isAborted, + isDirty: isDirty, + isValid: isValid, + isAsync: isAsync, + get util () { return util; }, + get objectUtil () { return objectUtil; }, + ZodParsedType: ZodParsedType, + getParsedType: getParsedType, + ZodType: ZodType, + datetimeRegex: datetimeRegex, + ZodString: ZodString, + ZodNumber: ZodNumber, + ZodBigInt: ZodBigInt, + ZodBoolean: ZodBoolean, + ZodDate: ZodDate, + ZodSymbol: ZodSymbol, + ZodUndefined: ZodUndefined, + ZodNull: ZodNull, + ZodAny: ZodAny, + ZodUnknown: ZodUnknown, + ZodNever: ZodNever, + ZodVoid: ZodVoid, + ZodArray: ZodArray, + ZodObject: ZodObject, + ZodUnion: ZodUnion, + ZodDiscriminatedUnion: ZodDiscriminatedUnion, + ZodIntersection: ZodIntersection, + ZodTuple: ZodTuple, + ZodRecord: ZodRecord, + ZodMap: ZodMap, + ZodSet: ZodSet, + ZodFunction: ZodFunction, + ZodLazy: ZodLazy, + ZodLiteral: ZodLiteral, + ZodEnum: ZodEnum, + ZodNativeEnum: ZodNativeEnum, + ZodPromise: ZodPromise, + ZodEffects: ZodEffects, + ZodTransformer: ZodEffects, + ZodOptional: ZodOptional, + ZodNullable: ZodNullable, + ZodDefault: ZodDefault, + ZodCatch: ZodCatch, + ZodNaN: ZodNaN, + BRAND: BRAND, + ZodBranded: ZodBranded, + ZodPipeline: ZodPipeline, + ZodReadonly: ZodReadonly, + custom: custom, + Schema: ZodType, + ZodSchema: ZodType, + late: late, + get ZodFirstPartyTypeKind () { return ZodFirstPartyTypeKind; }, + coerce: coerce, + any: anyType, + array: arrayType, + bigint: bigIntType, + boolean: booleanType, + date: dateType, + discriminatedUnion: discriminatedUnionType, + effect: effectsType, + 'enum': enumType, + 'function': functionType, + 'instanceof': instanceOfType, + intersection: intersectionType, + lazy: lazyType, + literal: literalType, + map: mapType, + nan: nanType, + nativeEnum: nativeEnumType, + never: neverType, + 'null': nullType, + nullable: nullableType, + number: numberType, + object: objectType, + oboolean: oboolean, + onumber: onumber, + optional: optionalType, + ostring: ostring, + pipeline: pipelineType, + preprocess: preprocessType, + promise: promiseType, + record: recordType, + set: setType, + strictObject: strictObjectType, + string: stringType, + symbol: symbolType, + transformer: effectsType, + tuple: tupleType, + 'undefined': undefinedType, + union: unionType, + unknown: unknownType, + 'void': voidType, + NEVER: NEVER, + ZodIssueCode: ZodIssueCode, + quotelessJson: quotelessJson, + ZodError: ZodError +}); + + + + +/***/ }), + +/***/ "./sample/resources.ts": +/*!*****************************!*\ + !*** ./sample/resources.ts ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ Resources: () => (/* binding */ Resources), +/* harmony export */ loader: () => (/* binding */ loader) +/* harmony export */ }); +/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); +/* harmony import */ var _excalibur_ldtk__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @excalibur-ldtk */ "./src/index.ts"); + + +const Resources = { + HeroSpriteSheetPng: new excalibur__WEBPACK_IMPORTED_MODULE_0__.ImageSource('./Solaria Demo Pack Update 03/Solaria Demo Pack Update 03/16x16/Sprites/Hero 01.png'), + LdtkResource: new _excalibur_ldtk__WEBPACK_IMPORTED_MODULE_1__.LdtkResource('./spacing-padding/spacing-padding.ldtk', { + useTilemapCameraStrategy: true, + useMapBackgroundColor: true, + }), + LdtkAutoTile: new _excalibur_ldtk__WEBPACK_IMPORTED_MODULE_1__.LdtkResource('./autotile/autotile.ldtk', { + useMapBackgroundColor: true, + }), + LdtkPureAutoTile: new _excalibur_ldtk__WEBPACK_IMPORTED_MODULE_1__.LdtkResource('./dsml1/dsml1.ldtk', { + useMapBackgroundColor: true, + }) +}; +const loader = new excalibur__WEBPACK_IMPORTED_MODULE_0__.Loader(); +for (let resource of Object.values(Resources)) { + loader.addResource(resource); +} + + +/***/ }), + +/***/ "./src/entity-layer.ts": +/*!*****************************!*\ + !*** ./src/entity-layer.ts ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ EntityLayer: () => (/* binding */ EntityLayer) +/* harmony export */ }); +/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); + +class EntityLayer { + constructor(level, ldtkLayer, resource, order) { + this.ldtkLayer = ldtkLayer; + this.resource = resource; + this.order = order; + this.entities = []; + this.ldtkToEntity = new Map(); + this.entityToLdtk = new Map(); + this.worldPos = (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(level.ldtkLevel.worldX, level.ldtkLevel.worldY); + this.offset = (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(ldtkLayer.__pxTotalOffsetX, ldtkLayer.__pxTotalOffsetY); + console.log("yo"); + } + runFactories() { + var _a, _b; + const ldtkLayer = this.ldtkLayer; + const resource = this.resource; + const order = this.order; + if (ldtkLayer.entityInstances) { + for (let entity of ldtkLayer.entityInstances) { + const entityMetadata = resource.projectMetadata.defs.entities.find(e => { + return e.identifier === entity.__identifier; + }); + if (resource.factories.has(entity.__identifier)) { + const factory = resource.factories.get(entity.__identifier); + if (factory) { + const newEntity = factory({ + type: entity.__identifier, + worldPos: (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(entity.px[0], entity.px[1]).add(this.worldPos.add(this.offset)), + entity, + definition: entityMetadata, + layer: this, + }); + if (newEntity) { + this.entities.push(newEntity); + this.ldtkToEntity.set(entity, newEntity); + this.entityToLdtk.set(newEntity, entity); + } + } } - if (key.status === "dirty" || value.status === "dirty") { - status.dirty(); + else { + if (entity.__tile) { + const actor = new excalibur__WEBPACK_IMPORTED_MODULE_0__.Actor({ + name: entity.__identifier, + pos: (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(entity.px[0], entity.px[1]).add(this.worldPos.add(this.offset)), + width: entity.width, + height: entity.height, + anchor: (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)((_a = entityMetadata === null || entityMetadata === void 0 ? void 0 : entityMetadata.pivotX) !== null && _a !== void 0 ? _a : 0, (_b = entityMetadata === null || entityMetadata === void 0 ? void 0 : entityMetadata.pivotY) !== null && _b !== void 0 ? _b : 0), + z: order + }); + const ts = resource.tilesets.get(entity.__tile.tilesetUid); + if (ts) { + const tsxCoord = Math.floor(entity.__tile.x / entity.__tile.w); + const tsyCoord = Math.floor(entity.__tile.y / entity.__tile.h); + const sprite = ts.spritesheet.getSprite(tsxCoord, tsyCoord); + if (sprite) { + actor.graphics.use(sprite); + } + } + this.entities.push(actor); + this.ldtkToEntity.set(entity, actor); + this.entityToLdtk.set(actor, entity); + } } - finalMap.set(key.value, value.value); } - return { status: status.value, value: finalMap }; } + // for (let entity of this.ldtkLayer.entityInstances) { + // const factory = this.resource.factories.get(entity.__identifier); + // if (!factory) { continue } + // + // const entityMetadata = this.resource.projectMetadata.defs.entities.find(e => { + // return e.identifier === entity.__identifier + // }); + // + // const newEntity = factory({ + // type: entity.__identifier, + // worldPos: vec(entity.px[0], entity.px[1]).add(this.worldPos.add(this.offset)), + // entity, + // definition: entityMetadata, + // layer: this, + // }); + // + // if (newEntity) { + // // remove pre-existing entity (e.g. the default actor created for the entity placement) + // const preExisting = this.ldtkToEntity.get(entity); + // if (preExisting) { + // const index = this.entities.indexOf(preExisting); + // if (index > -1) { + // this.entities.splice(index, 1); + // this.ldtkToEntity.delete(entity); + // this.entityToLdtk.delete(preExisting); + // } + // } + // + // this.entities.push(newEntity); + // this.ldtkToEntity.set(entity, newEntity); + // this.entityToLdtk.set(newEntity, entity); + // } + // } } -} -ZodMap.create = (keyType, valueType, params) => { - return new ZodMap({ - valueType, - keyType, - typeName: ZodFirstPartyTypeKind.ZodMap, - ...processCreateParams(params), - }); -}; -class ZodSet extends ZodType { - _parse(input) { - const { status, ctx } = this._processInputParams(input); - if (ctx.parsedType !== ZodParsedType.set) { - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_type, - expected: ZodParsedType.set, - received: ctx.parsedType, - }); - return INVALID; - } - const def = this._def; - if (def.minSize !== null) { - if (ctx.data.size < def.minSize.value) { - addIssueToContext(ctx, { - code: ZodIssueCode.too_small, - minimum: def.minSize.value, - type: "set", - inclusive: true, - exact: false, - message: def.minSize.message, - }); - status.dirty(); - } - } - if (def.maxSize !== null) { - if (ctx.data.size > def.maxSize.value) { - addIssueToContext(ctx, { - code: ZodIssueCode.too_big, - maximum: def.maxSize.value, - type: "set", - inclusive: true, - exact: false, - message: def.maxSize.message, - }); - status.dirty(); + getEntitiesByIdentifier(identifier) { + const ldtkEntities = this.getLdtkEntitiesByIdentifier(identifier); + let results = []; + for (const ldtk of ldtkEntities) { + const maybeEntity = this.ldtkToEntity.get(ldtk); + if (maybeEntity) { + results.push(maybeEntity); } } - const valueType = this._def.valueType; - function finalizeSet(elements) { - const parsedSet = new Set(); - for (const element of elements) { - if (element.status === "aborted") - return INVALID; - if (element.status === "dirty") - status.dirty(); - parsedSet.add(element.value); + return results; + } + getEntitiesByField(fieldIdentifier, value) { + const ldtkEntities = this.getLdtkEntitiesByField(fieldIdentifier, value); + let results = []; + for (const ldtk of ldtkEntities) { + const maybeEntity = this.ldtkToEntity.get(ldtk); + if (maybeEntity) { + results.push(maybeEntity); } - return { status: status.value, value: parsedSet }; - } - const elements = [...ctx.data.values()].map((item, i) => valueType._parse(new ParseInputLazyPath(ctx, item, ctx.path, i))); - if (ctx.common.async) { - return Promise.all(elements).then((elements) => finalizeSet(elements)); - } - else { - return finalizeSet(elements); } + return results; } - min(minSize, message) { - return new ZodSet({ - ...this._def, - minSize: { value: minSize, message: errorUtil.toString(message) }, - }); + /** + * Search layer for entities that match an identifier (case insensitive) + * @param identifier + * @returns + */ + getLdtkEntitiesByIdentifier(identifier) { + return this.ldtkLayer.entityInstances.filter(e => e.__identifier.toLocaleLowerCase() === identifier.toLowerCase()); } - max(maxSize, message) { - return new ZodSet({ - ...this._def, - maxSize: { value: maxSize, message: errorUtil.toString(message) }, + /** + * Search layer for entities that match a field and optionally a value (both case insensitive) + * @param fieldIdentifier + * @param value + */ + getLdtkEntitiesByField(fieldIdentifier, value) { + return this.ldtkLayer.entityInstances.filter(e => { + if (value !== undefined) { + let normalizedValue = value; + if (typeof value === 'string') { + normalizedValue = value.toLocaleLowerCase(); + } + const field = e.fieldInstances.find(f => f.__identifier.toLocaleLowerCase() === fieldIdentifier.toLocaleLowerCase()); + if (field) { + return field.__value === normalizedValue; + } + return false; + } + else { + return !!e.fieldInstances.find(f => f.__identifier.toLocaleLowerCase() === fieldIdentifier.toLocaleLowerCase()); + } }); } - size(size, message) { - return this.min(size, message).max(size, message); - } - nonempty(message) { - return this.min(1, message); - } } -ZodSet.create = (valueType, params) => { - return new ZodSet({ - valueType, - minSize: null, - maxSize: null, - typeName: ZodFirstPartyTypeKind.ZodSet, - ...processCreateParams(params), - }); -}; -class ZodFunction extends ZodType { - constructor() { - super(...arguments); - this.validate = this.implement; + + +/***/ }), + +/***/ "./src/file-loader.ts": +/*!****************************!*\ + !*** ./src/file-loader.ts ***! + \****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ FetchLoader: () => (/* binding */ FetchLoader) +/* harmony export */ }); +const FetchLoader = async (path, contentType) => { + const response = await fetch(path); + switch (contentType.toLowerCase()) { + case 'xml': return await response.text(); + case 'json': return await response.json(); + default: return await response.text(); } - _parse(input) { - const { ctx } = this._processInputParams(input); - if (ctx.parsedType !== ZodParsedType.function) { - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_type, - expected: ZodParsedType.function, - received: ctx.parsedType, - }); - return INVALID; - } - function makeArgsIssue(args, error) { - return makeIssue({ - data: args, - path: ctx.path, - errorMaps: [ - ctx.common.contextualErrorMap, - ctx.schemaErrorMap, - getErrorMap(), - errorMap, - ].filter((x) => !!x), - issueData: { - code: ZodIssueCode.invalid_arguments, - argumentsError: error, - }, +}; + + +/***/ }), + +/***/ "./src/index.ts": +/*!**********************!*\ + !*** ./src/index.ts ***! + \**********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ EntityLayer: () => (/* reexport safe */ _entity_layer__WEBPACK_IMPORTED_MODULE_1__.EntityLayer), +/* harmony export */ FetchLoader: () => (/* reexport safe */ _file_loader__WEBPACK_IMPORTED_MODULE_2__.FetchLoader), +/* harmony export */ IntGridLayer: () => (/* reexport safe */ _intgrid_layer__WEBPACK_IMPORTED_MODULE_3__.IntGridLayer), +/* harmony export */ LdtkEntityDefinition: () => (/* reexport safe */ _types__WEBPACK_IMPORTED_MODULE_10__.LdtkEntityDefinition), +/* harmony export */ LdtkEntityInstance: () => (/* reexport safe */ _types__WEBPACK_IMPORTED_MODULE_10__.LdtkEntityInstance), +/* harmony export */ LdtkLayerDefinition: () => (/* reexport safe */ _types__WEBPACK_IMPORTED_MODULE_10__.LdtkLayerDefinition), +/* harmony export */ LdtkLayerInstance: () => (/* reexport safe */ _types__WEBPACK_IMPORTED_MODULE_10__.LdtkLayerInstance), +/* harmony export */ LdtkLevel: () => (/* reexport safe */ _types__WEBPACK_IMPORTED_MODULE_10__.LdtkLevel), +/* harmony export */ LdtkProjectMetadata: () => (/* reexport safe */ _types__WEBPACK_IMPORTED_MODULE_10__.LdtkProjectMetadata), +/* harmony export */ LdtkResource: () => (/* reexport safe */ _ldtk_resource__WEBPACK_IMPORTED_MODULE_0__.LdtkResource), +/* harmony export */ Level: () => (/* reexport safe */ _level__WEBPACK_IMPORTED_MODULE_5__.Level), +/* harmony export */ LevelResource: () => (/* reexport safe */ _level_resource__WEBPACK_IMPORTED_MODULE_4__.LevelResource), +/* harmony export */ LoaderCache: () => (/* reexport safe */ _loader_cache__WEBPACK_IMPORTED_MODULE_6__.LoaderCache), +/* harmony export */ TileLayer: () => (/* reexport safe */ _tile_layer__WEBPACK_IMPORTED_MODULE_8__.TileLayer), +/* harmony export */ Tileset: () => (/* reexport safe */ _tileset__WEBPACK_IMPORTED_MODULE_9__.Tileset), +/* harmony export */ filenameFromPath: () => (/* reexport safe */ _path_util__WEBPACK_IMPORTED_MODULE_7__.filenameFromPath), +/* harmony export */ mapPath: () => (/* reexport safe */ _path_util__WEBPACK_IMPORTED_MODULE_7__.mapPath), +/* harmony export */ pathInMap: () => (/* reexport safe */ _path_util__WEBPACK_IMPORTED_MODULE_7__.pathInMap), +/* harmony export */ pathRelativeToBase: () => (/* reexport safe */ _path_util__WEBPACK_IMPORTED_MODULE_7__.pathRelativeToBase) +/* harmony export */ }); +/* harmony import */ var _ldtk_resource__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ldtk-resource */ "./src/ldtk-resource.ts"); +/* harmony import */ var _entity_layer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./entity-layer */ "./src/entity-layer.ts"); +/* harmony import */ var _file_loader__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./file-loader */ "./src/file-loader.ts"); +/* harmony import */ var _intgrid_layer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./intgrid-layer */ "./src/intgrid-layer.ts"); +/* harmony import */ var _level_resource__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./level-resource */ "./src/level-resource.ts"); +/* harmony import */ var _level__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./level */ "./src/level.ts"); +/* harmony import */ var _loader_cache__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./loader-cache */ "./src/loader-cache.ts"); +/* harmony import */ var _path_util__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./path-util */ "./src/path-util.ts"); +/* harmony import */ var _tile_layer__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./tile-layer */ "./src/tile-layer.ts"); +/* harmony import */ var _tileset__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./tileset */ "./src/tileset.ts"); +/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./types */ "./src/types.ts"); + + + + + + + + + + + + + +/***/ }), + +/***/ "./src/intgrid-layer.ts": +/*!******************************!*\ + !*** ./src/intgrid-layer.ts ***! + \******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ IntGridLayer: () => (/* binding */ IntGridLayer) +/* harmony export */ }); +/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); + +class IntGridLayer { + constructor(level, ldtkLayer, resource, order) { + var _a, _b, _c, _d; + this.order = order; + this.worldPos = (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(level.ldtkLevel.worldX, level.ldtkLevel.worldY); + this.offset = (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(ldtkLayer.__pxTotalOffsetX, ldtkLayer.__pxTotalOffsetY); + this.ldtkLayer = ldtkLayer; + if (ldtkLayer.intGridCsv.length || ldtkLayer.autoLayerTiles.length) { + const rows = ldtkLayer.__cHei; + const columns = ldtkLayer.__cWid; + this.tilemap = new excalibur__WEBPACK_IMPORTED_MODULE_0__.TileMap({ + name: ldtkLayer.__identifier, + pos: this.worldPos.add(this.offset), + tileWidth: ldtkLayer.__gridSize, + tileHeight: ldtkLayer.__gridSize, + rows, + columns, }); - } - function makeReturnsIssue(returns, error) { - return makeIssue({ - data: returns, - path: ctx.path, - errorMaps: [ - ctx.common.contextualErrorMap, - ctx.schemaErrorMap, - getErrorMap(), - errorMap, - ].filter((x) => !!x), - issueData: { - code: ZodIssueCode.invalid_return_type, - returnTypeError: error, - }, + this.tilemap.z = order; + const graphics = this.tilemap.get(excalibur__WEBPACK_IMPORTED_MODULE_0__.GraphicsComponent); + graphics.isVisible = ldtkLayer.visible; + // find the intgrid metadata + const layerMetadata = resource.projectMetadata.defs.layers.find(l => { + return ldtkLayer.__identifier === l.identifier; }); - } - const params = { errorMap: ctx.common.contextualErrorMap }; - const fn = ctx.data; - if (this._def.returns instanceof ZodPromise) { - // Would love a way to avoid disabling this rule, but we need - // an alias (using an arrow function was what caused 2651). - // eslint-disable-next-line @typescript-eslint/no-this-alias - const me = this; - return OK(async function (...args) { - const error = new ZodError([]); - const parsedArgs = await me._def.args - .parseAsync(args, params) - .catch((e) => { - error.addIssue(makeArgsIssue(args, e)); - throw error; - }); - const result = await Reflect.apply(fn, this, parsedArgs); - const parsedReturns = await me._def.returns._def.type - .parseAsync(result, params) - .catch((e) => { - error.addIssue(makeReturnsIssue(result, e)); - throw error; + if (layerMetadata) { + const solidValue = layerMetadata.intGridValues.find(val => { + var _a; + return ((_a = val === null || val === void 0 ? void 0 : val.identifier) === null || _a === void 0 ? void 0 : _a.toLocaleLowerCase()) === 'solid'; }); - return parsedReturns; - }); - } - else { - // Would love a way to avoid disabling this rule, but we need - // an alias (using an arrow function was what caused 2651). - // eslint-disable-next-line @typescript-eslint/no-this-alias - const me = this; - return OK(function (...args) { - const parsedArgs = me._def.args.safeParse(args, params); - if (!parsedArgs.success) { - throw new ZodError([makeArgsIssue(args, parsedArgs.error)]); + for (let i = 0; i < ldtkLayer.intGridCsv.length; i++) { + const xCoord = i % columns; + const yCoord = Math.floor(i / columns); + const tile = this.tilemap.getTile(xCoord, yCoord); + if (solidValue && ldtkLayer.intGridCsv[i] === solidValue.value) { + tile.solid = true; + } + // TODO might be a mistake to treat 1 as solid if there isn't a labelled solid + if (!solidValue && ldtkLayer.intGridCsv[i] === 1) { + tile.solid = true; + } } - const result = Reflect.apply(fn, this, parsedArgs.data); - const parsedReturns = me._def.returns.safeParse(result, params); - if (!parsedReturns.success) { - throw new ZodError([makeReturnsIssue(result, parsedReturns.error)]); + if (ldtkLayer.__tilesetDefUid) { + this.tileset = resource.tilesets.get(ldtkLayer.__tilesetDefUid); + for (let i = 0; i < ldtkLayer.autoLayerTiles.length; i++) { + const tile = ldtkLayer.autoLayerTiles[i]; + const xCoord = Math.floor(tile.px[0] / ldtkLayer.__gridSize); + const yCoord = Math.floor(tile.px[1] / ldtkLayer.__gridSize); + const exTile = this.tilemap.getTile(xCoord, yCoord); + if (exTile && this.tileset) { + const tsxCoord = Math.floor((tile.src[0] - ((_a = this.tileset.ldtkTileset.padding) !== null && _a !== void 0 ? _a : 0)) / (this.tileset.ldtkTileset.tileGridSize + ((_b = this.tileset.ldtkTileset.spacing) !== null && _b !== void 0 ? _b : 0))); + const tsyCoord = Math.floor((tile.src[1] - ((_c = this.tileset.ldtkTileset.padding) !== null && _c !== void 0 ? _c : 0)) / (this.tileset.ldtkTileset.tileGridSize + ((_d = this.tileset.ldtkTileset.spacing) !== null && _d !== void 0 ? _d : 0))); + // Bit 0 toggles x flip + // Bit 1 toggles 1 flip + // Examples: f=0 (no flip), f=1 (X flip only), f=2 (Y flip only), f=3 (both flips) + const flipHorizontal = !!(tile.f & 0b01); + const flipVertical = !!(tile.f & 0b10); + let sprite = this.tileset.spritesheet.getSprite(tsxCoord, tsyCoord); + if (flipHorizontal || flipVertical) { + sprite = sprite.clone(); + sprite.flipHorizontal = flipHorizontal; + sprite.flipVertical = flipVertical; + } + if (sprite) { + exTile.addGraphic(sprite); + } + else { + console.error('Could not find sprite in LDtk spritesheet at', tsxCoord, tsyCoord); + } + } + } } - return parsedReturns.data; - }); + } } } - parameters() { - return this._def.args; - } - returnType() { - return this._def.returns; - } - args(...items) { - return new ZodFunction({ - ...this._def, - args: ZodTuple.create(items).rest(ZodUnknown.create()), - }); - } - returns(returnType) { - return new ZodFunction({ - ...this._def, - returns: returnType, - }); - } - implement(func) { - const validatedFunc = this.parse(func); - return validatedFunc; - } - strictImplement(func) { - const validatedFunc = this.parse(func); - return validatedFunc; - } - static create(args, returns, params) { - return new ZodFunction({ - args: (args - ? args - : ZodTuple.create([]).rest(ZodUnknown.create())), - returns: returns || ZodUnknown.create(), - typeName: ZodFirstPartyTypeKind.ZodFunction, - ...processCreateParams(params), - }); - } -} -class ZodLazy extends ZodType { - get schema() { - return this._def.getter(); - } - _parse(input) { - const { ctx } = this._processInputParams(input); - const lazySchema = this._def.getter(); - return lazySchema._parse({ data: ctx.data, path: ctx.path, parent: ctx }); - } } -ZodLazy.create = (getter, params) => { - return new ZodLazy({ - getter: getter, - typeName: ZodFirstPartyTypeKind.ZodLazy, - ...processCreateParams(params), - }); -}; -class ZodLiteral extends ZodType { - _parse(input) { - if (input.data !== this._def.value) { - const ctx = this._getOrReturnCtx(input); - addIssueToContext(ctx, { - received: ctx.data, - code: ZodIssueCode.invalid_literal, - expected: this._def.value, - }); - return INVALID; + + +/***/ }), + +/***/ "./src/ldtk-resource.ts": +/*!******************************!*\ + !*** ./src/ldtk-resource.ts ***! + \******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ LdtkResource: () => (/* binding */ LdtkResource) +/* harmony export */ }); +/* harmony import */ var _tile_layer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./tile-layer */ "./src/tile-layer.ts"); +/* harmony import */ var _path_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./path-util */ "./src/path-util.ts"); +/* harmony import */ var _file_loader__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./file-loader */ "./src/file-loader.ts"); +/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./types */ "./src/types.ts"); +/* harmony import */ var compare_versions__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! compare-versions */ "./node_modules/compare-versions/lib/esm/compare.js"); +/* harmony import */ var _loader_cache__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./loader-cache */ "./src/loader-cache.ts"); +/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); +/* harmony import */ var _level_resource__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./level-resource */ "./src/level-resource.ts"); +/* harmony import */ var _tileset__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./tileset */ "./src/tileset.ts"); +/* harmony import */ var _level__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./level */ "./src/level.ts"); +/* harmony import */ var _entity_layer__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./entity-layer */ "./src/entity-layer.ts"); +/* harmony import */ var _intgrid_layer__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./intgrid-layer */ "./src/intgrid-layer.ts"); + + + + + + + + + + + + +class LdtkResource { + constructor(path, options) { + this.path = path; + this.tilesets = new Map(); + this.levels = new Map(); + this.levelsByName = new Map(); + this.factories = new Map(); + this.fileLoader = _file_loader__WEBPACK_IMPORTED_MODULE_2__.FetchLoader; + this._imageLoader = new _loader_cache__WEBPACK_IMPORTED_MODULE_5__.LoaderCache(excalibur__WEBPACK_IMPORTED_MODULE_6__.ImageSource); + this._levelLoader = new _loader_cache__WEBPACK_IMPORTED_MODULE_5__.LoaderCache(_level_resource__WEBPACK_IMPORTED_MODULE_7__.LevelResource); + this.startZIndex = 0; + this.textQuality = 4; + this.useExcaliburWiring = true; + this.useMapBackgroundColor = false; + this.useTilemapCameraStrategy = false; + this.headless = false; + this.strict = true; + const { useExcaliburWiring, useTilemapCameraStrategy, entityIdentifierFactories, pathMap, useMapBackgroundColor, fileLoader, strict, headless, startZIndex } = { ...options }; + this.strict = strict !== null && strict !== void 0 ? strict : this.strict; + this.headless = headless !== null && headless !== void 0 ? headless : this.headless; + this.useExcaliburWiring = useExcaliburWiring !== null && useExcaliburWiring !== void 0 ? useExcaliburWiring : this.useExcaliburWiring; + this.useTilemapCameraStrategy = useTilemapCameraStrategy !== null && useTilemapCameraStrategy !== void 0 ? useTilemapCameraStrategy : this.useTilemapCameraStrategy; + this.useMapBackgroundColor = useMapBackgroundColor !== null && useMapBackgroundColor !== void 0 ? useMapBackgroundColor : this.useMapBackgroundColor; + this.startZIndex = startZIndex !== null && startZIndex !== void 0 ? startZIndex : this.startZIndex; + this.fileLoader = fileLoader !== null && fileLoader !== void 0 ? fileLoader : this.fileLoader; + this.pathMap = pathMap; + for (const key in entityIdentifierFactories) { + this.registerEntityIdentifierFactory(key, entityIdentifierFactories[key]); } - return { status: "valid", value: input.data }; - } - get value() { - return this._def.value; - } -} -ZodLiteral.create = (value, params) => { - return new ZodLiteral({ - value: value, - typeName: ZodFirstPartyTypeKind.ZodLiteral, - ...processCreateParams(params), - }); -}; -function createZodEnum(values, params) { - return new ZodEnum({ - values, - typeName: ZodFirstPartyTypeKind.ZodEnum, - ...processCreateParams(params), - }); -} -class ZodEnum extends ZodType { - constructor() { - super(...arguments); - _ZodEnum_cache.set(this, void 0); } - _parse(input) { - if (typeof input.data !== "string") { - const ctx = this._getOrReturnCtx(input); - const expectedValues = this._def.values; - addIssueToContext(ctx, { - expected: util.joinValues(expectedValues), - received: ctx.parsedType, - code: ZodIssueCode.invalid_type, - }); - return INVALID; + async load() { + var _a; + const data = await this.fileLoader(this.path, 'json'); + if (this.strict) { + try { + this.projectMetadata = _types__WEBPACK_IMPORTED_MODULE_3__.LdtkProjectMetadata.parse(data); + } + catch (e) { + console.error(`Could not parse LDtk map from location ${this.path}.\nExcalibur only supports the latest version of LDtk formats as of the plugin's release.`); + console.error(`Is your map file corrupted or being interpreted as the wrong type?`); + throw e; + } } - if (!__classPrivateFieldGet(this, _ZodEnum_cache, "f")) { - __classPrivateFieldSet(this, _ZodEnum_cache, new Set(this._def.values), "f"); + else { + this.projectMetadata = data; } - if (!__classPrivateFieldGet(this, _ZodEnum_cache, "f").has(input.data)) { - const ctx = this._getOrReturnCtx(input); - const expectedValues = this._def.values; - addIssueToContext(ctx, { - received: ctx.data, - code: ZodIssueCode.invalid_enum_value, - options: expectedValues, - }); - return INVALID; + if ((0,compare_versions__WEBPACK_IMPORTED_MODULE_4__.compare)(LdtkResource.supportedLdtkVersion, (_a = this.projectMetadata.jsonVersion) !== null && _a !== void 0 ? _a : '0.0.0', ">")) { + console.warn(`The excalibur ldtk plugin officially supports ${LdtkResource.supportedLdtkVersion}+, the current map has LDtk version ${this.projectMetadata.jsonVersion}`); } - return OK(input.data); - } - get options() { - return this._def.values; - } - get enum() { - const enumValues = {}; - for (const val of this._def.values) { - enumValues[val] = val; + // iterate through the defs + // load the tilesets + const imagesToLoad = []; + for (let tileset of this.projectMetadata.defs.tilesets) { + if (tileset.relPath) { + const imagePath = (0,_path_util__WEBPACK_IMPORTED_MODULE_1__.pathRelativeToBase)(this.path, tileset.relPath, this.pathMap); + const image = this._imageLoader.getOrAdd(imagePath); + const friendlyTileset = new _tileset__WEBPACK_IMPORTED_MODULE_8__.Tileset({ + image, + ldtkTileset: tileset + }); + this.tilesets.set(tileset.uid, friendlyTileset); + } + else { + if (tileset.identifier !== 'Internal_Icons') { + console.warn(`No tileset image provided for ${tileset.identifier}`); + } + } } - return enumValues; - } - get Values() { - const enumValues = {}; - for (const val of this._def.values) { - enumValues[val] = val; + // iterate through the levels + // load the level metadata + for (let level of this.projectMetadata.levels) { + if (level.externalRelPath) { + // external levels + const levelPath = (0,_path_util__WEBPACK_IMPORTED_MODULE_1__.pathRelativeToBase)(this.path, level.externalRelPath, this.pathMap); + this._levelLoader.getOrAdd(levelPath, this, { + headless: this.headless, + strict: this.strict, + fileLoader: this.fileLoader, + imageLoader: this._imageLoader, + pathMap: this.pathMap + }); + } + else { + // embedded levels + const friendlyLevel = new _level__WEBPACK_IMPORTED_MODULE_9__.Level(level, this); + this.levels.set(level.uid, friendlyLevel); + this.levelsByName.set(level.identifier.toLowerCase(), friendlyLevel); + } } - return enumValues; + await Promise.all([this._imageLoader.load(), this._levelLoader.load()]); + this._levelLoader.values().forEach(level => { + this.levels.set(level.data.ldtkLevel.uid, level.data); + this.levelsByName.set(level.data.ldtkLevel.identifier.toLowerCase(), level.data); + }); + return this.data = this.projectMetadata; } - get Enum() { - const enumValues = {}; - for (const val of this._def.values) { - enumValues[val] = val; - } - return enumValues; + ; + isLoaded() { + return !!this.data; } - extract(values, newDef = this._def) { - return ZodEnum.create(values, { - ...this._def, - ...newDef, - }); + registerEntityIdentifierFactory(ldtkEntityIdentifier, factory) { + this.factories.set(ldtkEntityIdentifier, factory); } - exclude(values, newDef = this._def) { - return ZodEnum.create(this.options.filter((opt) => !values.includes(opt)), { - ...this._def, - ...newDef, - }); + registerEntityIdentifierFactories(factories) { + for (const key in factories) { + this.registerEntityIdentifierFactory(key, factories[key]); + } } -} -_ZodEnum_cache = new WeakMap(); -ZodEnum.create = createZodEnum; -class ZodNativeEnum extends ZodType { - constructor() { - super(...arguments); - _ZodNativeEnum_cache.set(this, void 0); + /** + * Get a level by identifier + * @param identifier + * @returns + */ + getLevel(identifier) { + return this.levelsByName.get(identifier.toLowerCase()); } - _parse(input) { - const nativeEnumValues = util.getValidEnumValues(this._def.values); - const ctx = this._getOrReturnCtx(input); - if (ctx.parsedType !== ZodParsedType.string && - ctx.parsedType !== ZodParsedType.number) { - const expectedValues = util.objectValues(nativeEnumValues); - addIssueToContext(ctx, { - expected: util.joinValues(expectedValues), - received: ctx.parsedType, - code: ZodIssueCode.invalid_type, - }); - return INVALID; + /** + * Get the entity layers, optionally provide a level identifier to filter to + * @param levelIdentifier + */ + getEntityLayers(levelIdentifier) { + let results = []; + if (levelIdentifier) { + const level = this.getLevel(levelIdentifier); + if (level) { + for (let layer of level.layers) { + if (layer instanceof _entity_layer__WEBPACK_IMPORTED_MODULE_10__.EntityLayer) { + results.push(layer); + } + } + } } - if (!__classPrivateFieldGet(this, _ZodNativeEnum_cache, "f")) { - __classPrivateFieldSet(this, _ZodNativeEnum_cache, new Set(util.getValidEnumValues(this._def.values)), "f"); + else { + for (const level of this.levels.values()) { + for (let layer of level.layers) { + if (layer instanceof _entity_layer__WEBPACK_IMPORTED_MODULE_10__.EntityLayer) { + results.push(layer); + } + } + } } - if (!__classPrivateFieldGet(this, _ZodNativeEnum_cache, "f").has(input.data)) { - const expectedValues = util.objectValues(nativeEnumValues); - addIssueToContext(ctx, { - received: ctx.data, - code: ZodIssueCode.invalid_enum_value, - options: expectedValues, - }); - return INVALID; + return results; + } + getTileLayers(identifier) { + let results = []; + if (identifier) { + const level = this.getLevel(identifier); + if (level) { + for (let layer of level.layers) { + if (layer instanceof _tile_layer__WEBPACK_IMPORTED_MODULE_0__.TileLayer) { + results.push(layer); + } + } + } } - return OK(input.data); + else { + for (const level of this.levels.values()) { + for (let layer of level.layers) { + if (layer instanceof _tile_layer__WEBPACK_IMPORTED_MODULE_0__.TileLayer) { + results.push(layer); + } + } + } + } + return results; } - get enum() { - return this._def.values; + getIntGridLayers(identifier) { + let results = []; + if (identifier) { + const level = this.getLevel(identifier); + if (level) { + for (let layer of level.layers) { + if (layer instanceof _intgrid_layer__WEBPACK_IMPORTED_MODULE_11__.IntGridLayer) { + results.push(layer); + } + } + } + } + else { + for (const level of this.levels.values()) { + for (let layer of level.layers) { + if (layer instanceof _intgrid_layer__WEBPACK_IMPORTED_MODULE_11__.IntGridLayer) { + results.push(layer); + } + } + } + } + return results; } -} -_ZodNativeEnum_cache = new WeakMap(); -ZodNativeEnum.create = (values, params) => { - return new ZodNativeEnum({ - values: values, - typeName: ZodFirstPartyTypeKind.ZodNativeEnum, - ...processCreateParams(params), - }); -}; -class ZodPromise extends ZodType { - unwrap() { - return this._def.type; + /** + * Search layer for entities that match an identifier (case insensitive) + * @param identifier + * @returns + */ + getLdtkEntitiesByIdentifier(identifier, levels) { + let results = []; + const levelsToSearch = levels !== null && levels !== void 0 ? levels : Array.from(this.levels.values()).map(l => l.ldtkLevel.identifier); + for (const level of levelsToSearch) { + const layers = this.getEntityLayers(level); + for (let layer of layers) { + results = results.concat(layer.getLdtkEntitiesByIdentifier(identifier)); + } + } + return results; } - _parse(input) { - const { ctx } = this._processInputParams(input); - if (ctx.parsedType !== ZodParsedType.promise && - ctx.common.async === false) { - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_type, - expected: ZodParsedType.promise, - received: ctx.parsedType, - }); - return INVALID; + /** + * Search levels for ldtk entities that match a field and optionally a value (both case insensitive) + * @param fieldIdentifier + * @param value + */ + getLdtkEntitiesByField(fieldIdentifier, value, levels) { + let results = []; + const levelsToSearch = levels !== null && levels !== void 0 ? levels : Array.from(this.levels.values()).map(l => l.ldtkLevel.identifier); + for (const level of levelsToSearch) { + const layers = this.getEntityLayers(level); + for (let layer of layers) { + results = results.concat(layer.getLdtkEntitiesByField(fieldIdentifier, value)); + } } - const promisified = ctx.parsedType === ZodParsedType.promise - ? ctx.data - : Promise.resolve(ctx.data); - return OK(promisified.then((data) => { - return this._def.type.parseAsync(data, { - path: ctx.path, - errorMap: ctx.common.contextualErrorMap, - }); - })); + return results; } -} -ZodPromise.create = (schema, params) => { - return new ZodPromise({ - type: schema, - typeName: ZodFirstPartyTypeKind.ZodPromise, - ...processCreateParams(params), - }); -}; -class ZodEffects extends ZodType { - innerType() { - return this._def.schema; + /** + * Search levels for excalibur entities that match an identifier (case insensitive) + * @param identifier + * @param levels + */ + getEntitiesByIdentifier(identifier, levels) { + let results = []; + const levelsToSearch = levels !== null && levels !== void 0 ? levels : Array.from(this.levels.values()).map(l => l.ldtkLevel.identifier); + for (const level of levelsToSearch) { + const layers = this.getEntityLayers(level); + for (let layer of layers) { + results = results.concat(layer.getEntitiesByIdentifier(identifier)); + } + } + return results; } - sourceType() { - return this._def.schema._def.typeName === ZodFirstPartyTypeKind.ZodEffects - ? this._def.schema.sourceType() - : this._def.schema; + /** + * Search levels for excalibur entities that match a field and optionally a value (both case insensitive) + * @param fieldIdentifier + * @param value + * @param levels + */ + getEntitiesByField(fieldIdentifier, value, levels) { + let results = []; + const levelsToSearch = levels !== null && levels !== void 0 ? levels : Array.from(this.levels.values()).map(l => l.ldtkLevel.identifier); + for (const level of levelsToSearch) { + const layers = this.getEntityLayers(level); + for (let layer of layers) { + results = results.concat(layer.getEntitiesByField(fieldIdentifier, value)); + } + } + return results; } - _parse(input) { - const { status, ctx } = this._processInputParams(input); - const effect = this._def.effect || null; - const checkCtx = { - addIssue: (arg) => { - addIssueToContext(ctx, arg); - if (arg.fatal) { - status.abort(); + /** + * Get the level bounds given a list of level identifiers (case insensitive) + * @param levels + */ + getLevelBounds(levels) { + levels = levels !== null && levels !== void 0 ? levels : Array.from(this.levelsByName.keys()); + let bounds = null; + for (const level of this.levels.values()) { + if (!levels.includes(level.ldtkLevel.identifier)) { + continue; + } + const firstTileLayer = this.getTileLayers(level.ldtkLevel.identifier)[0]; + if (firstTileLayer) { + const tileBounds = excalibur__WEBPACK_IMPORTED_MODULE_6__.BoundingBox.fromDimension(firstTileLayer.tilemap.tileWidth * firstTileLayer.tilemap.columns, firstTileLayer.tilemap.tileHeight * firstTileLayer.tilemap.rows, excalibur__WEBPACK_IMPORTED_MODULE_6__.Vector.Zero, firstTileLayer.tilemap.pos); + if (!bounds) { + bounds = tileBounds; } else { - status.dirty(); + bounds = bounds.combine(tileBounds); } - }, - get path() { - return ctx.path; - }, - }; - checkCtx.addIssue = checkCtx.addIssue.bind(checkCtx); - if (effect.type === "preprocess") { - const processed = effect.transform(ctx.data, checkCtx); - if (ctx.common.async) { - return Promise.resolve(processed).then(async (processed) => { - if (status.value === "aborted") - return INVALID; - const result = await this._def.schema._parseAsync({ - data: processed, - path: ctx.path, - parent: ctx, - }); - if (result.status === "aborted") - return INVALID; - if (result.status === "dirty") - return DIRTY(result.value); - if (status.value === "dirty") - return DIRTY(result.value); - return result; - }); - } - else { - if (status.value === "aborted") - return INVALID; - const result = this._def.schema._parseSync({ - data: processed, - path: ctx.path, - parent: ctx, - }); - if (result.status === "aborted") - return INVALID; - if (result.status === "dirty") - return DIRTY(result.value); - if (status.value === "dirty") - return DIRTY(result.value); - return result; } } - if (effect.type === "refinement") { - const executeRefinement = (acc) => { - const result = effect.refinement(acc, checkCtx); - if (ctx.common.async) { - return Promise.resolve(result); + return bounds !== null && bounds !== void 0 ? bounds : new excalibur__WEBPACK_IMPORTED_MODULE_6__.BoundingBox(); + } + addToScene(scene, options) { + var _a, _b; + const { pos, useLevelOffsets } = { pos: (0,excalibur__WEBPACK_IMPORTED_MODULE_6__.vec)(0, 0), useLevelOffsets: true, ...options }; + for (let [id, level] of this.levels.entries()) { + if ((_a = options === null || options === void 0 ? void 0 : options.levelFilter) === null || _a === void 0 ? void 0 : _a.length) { + if (!options.levelFilter.includes(level.ldtkLevel.identifier)) { + continue; } - if (result instanceof Promise) { - throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead."); + } + for (let layer of level.layers) { + if (layer instanceof _tile_layer__WEBPACK_IMPORTED_MODULE_0__.TileLayer || layer instanceof _intgrid_layer__WEBPACK_IMPORTED_MODULE_11__.IntGridLayer) { + layer.tilemap.pos = layer.tilemap.pos.add(pos); + if (!useLevelOffsets) { + layer.tilemap.pos = layer.tilemap.pos.sub(layer.worldPos); + } + scene.add(layer.tilemap); + } + else { + layer.runFactories(); + for (let entity of layer.entities) { + const tx = entity.get(excalibur__WEBPACK_IMPORTED_MODULE_6__.TransformComponent); + if (tx) { + tx.pos = tx.pos.add(pos); + if (!useLevelOffsets) { + tx.pos = tx.pos.sub(layer.worldPos); + } + } + scene.add(entity); + } } - return acc; - }; - if (ctx.common.async === false) { - const inner = this._def.schema._parseSync({ - data: ctx.data, - path: ctx.path, - parent: ctx, - }); - if (inner.status === "aborted") - return INVALID; - if (inner.status === "dirty") - status.dirty(); - // return value is ignored - executeRefinement(inner.value); - return { status: status.value, value: inner.value }; } - else { - return this._def.schema - ._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }) - .then((inner) => { - if (inner.status === "aborted") - return INVALID; - if (inner.status === "dirty") - status.dirty(); - return executeRefinement(inner.value).then(() => { - return { status: status.value, value: inner.value }; - }); - }); + } + if (this.useExcaliburWiring) { + const camera = this.getLdtkEntitiesByField('camera', true)[0]; + if (camera) { + scene.camera.pos = (0,excalibur__WEBPACK_IMPORTED_MODULE_6__.vec)(camera.px[0], camera.px[0]); + const zoom = camera.fieldInstances.find(f => f.__identifier.toLocaleLowerCase() === 'zoom'); + if (zoom) { + scene.camera.zoom = +zoom.__value; + } } } - if (effect.type === "transform") { - if (ctx.common.async === false) { - const base = this._def.schema._parseSync({ - data: ctx.data, - path: ctx.path, - parent: ctx, - }); - if (!isValid(base)) - return base; - const result = effect.transform(base.value, checkCtx); - if (result instanceof Promise) { - throw new Error(`Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.`); + if (this.useTilemapCameraStrategy) { + let bounds = this.getLevelBounds(options === null || options === void 0 ? void 0 : options.levelFilter); + scene.camera.strategy.limitCameraBounds(bounds); + } + if (this.useMapBackgroundColor) { + for (let [id, level] of this.levels.entries()) { + if ((_b = options === null || options === void 0 ? void 0 : options.levelFilter) === null || _b === void 0 ? void 0 : _b.length) { + if (!options.levelFilter.includes(level.ldtkLevel.identifier)) { + continue; + } } - return { status: status.value, value: result }; - } - else { - return this._def.schema - ._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }) - .then((base) => { - if (!isValid(base)) - return base; - return Promise.resolve(effect.transform(base.value, checkCtx)).then((result) => ({ status: status.value, value: result })); - }); + scene.backgroundColor = level.backgroundColor; + break; } } - util.assertNever(effect); } } -ZodEffects.create = (schema, effect, params) => { - return new ZodEffects({ - schema, - typeName: ZodFirstPartyTypeKind.ZodEffects, - effect, - ...processCreateParams(params), - }); -}; -ZodEffects.createWithPreprocess = (preprocess, schema, params) => { - return new ZodEffects({ - schema, - effect: { type: "preprocess", transform: preprocess }, - typeName: ZodFirstPartyTypeKind.ZodEffects, - ...processCreateParams(params), - }); -}; -class ZodOptional extends ZodType { - _parse(input) { - const parsedType = this._getType(input); - if (parsedType === ZodParsedType.undefined) { - return OK(undefined); +LdtkResource.supportedLdtkVersion = "1.5.3"; + + +/***/ }), + +/***/ "./src/level-resource.ts": +/*!*******************************!*\ + !*** ./src/level-resource.ts ***! + \*******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ LevelResource: () => (/* binding */ LevelResource) +/* harmony export */ }); +/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); +/* harmony import */ var _loader_cache__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./loader-cache */ "./src/loader-cache.ts"); +/* harmony import */ var _file_loader__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./file-loader */ "./src/file-loader.ts"); +/* harmony import */ var _level__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./level */ "./src/level.ts"); +/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./types */ "./src/types.ts"); + + + + + +/** + * Loads LDtk levels that are stored in separate files + */ +class LevelResource { + constructor(path, resource, options) { + this.path = path; + this.resource = resource; + this.fileLoader = _file_loader__WEBPACK_IMPORTED_MODULE_2__.FetchLoader; + this.strict = true; + this.headless = false; + const { headless, strict, fileLoader, imageLoader, pathMap } = { ...options }; + this.fileLoader = fileLoader !== null && fileLoader !== void 0 ? fileLoader : this.fileLoader; + this.strict = strict !== null && strict !== void 0 ? strict : this.strict; + this.headless = headless !== null && headless !== void 0 ? headless : this.headless; + this.imageLoader = imageLoader !== null && imageLoader !== void 0 ? imageLoader : new _loader_cache__WEBPACK_IMPORTED_MODULE_1__.LoaderCache(excalibur__WEBPACK_IMPORTED_MODULE_0__.ImageSource); + this.pathMap = pathMap !== null && pathMap !== void 0 ? pathMap : this.pathMap; + } + async load() { + const data = await this.fileLoader(this.path, 'json'); + let level; + if (this.strict) { + try { + level = _types__WEBPACK_IMPORTED_MODULE_4__.LdtkLevel.parse(data); + } + catch (e) { + console.error(`Could not parse LDtk level data at ${this.path} are you sure a level is there and not corrupt?`); + throw e; + } } - return this._def.innerType._parse(input); + else { + level = data; + } + return this.data = new _level__WEBPACK_IMPORTED_MODULE_3__.Level(level, this.resource); } - unwrap() { - return this._def.innerType; + isLoaded() { + return !!this.data; } } -ZodOptional.create = (type, params) => { - return new ZodOptional({ - innerType: type, - typeName: ZodFirstPartyTypeKind.ZodOptional, - ...processCreateParams(params), - }); -}; -class ZodNullable extends ZodType { - _parse(input) { - const parsedType = this._getType(input); - if (parsedType === ZodParsedType.null) { - return OK(null); + + +/***/ }), + +/***/ "./src/level.ts": +/*!**********************!*\ + !*** ./src/level.ts ***! + \**********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ Level: () => (/* binding */ Level) +/* harmony export */ }); +/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); +/* harmony import */ var _entity_layer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./entity-layer */ "./src/entity-layer.ts"); +/* harmony import */ var _intgrid_layer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./intgrid-layer */ "./src/intgrid-layer.ts"); +/* harmony import */ var _tile_layer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tile-layer */ "./src/tile-layer.ts"); + + + + +class Level { + constructor(ldtkLevel, resource) { + var _a, _b, _c, _d; + this.ldtkLevel = ldtkLevel; + this.resource = resource; + this.layers = []; + if (ldtkLevel.__bgColor) { + this.backgroundColor = excalibur__WEBPACK_IMPORTED_MODULE_0__.Color.fromHex(ldtkLevel.__bgColor); + } + if (ldtkLevel.layerInstances) { + let order = resource.startZIndex; + let layers = ldtkLevel.layerInstances.slice().reverse(); + for (let layer of layers) { + if (((_a = layer.entityInstances) === null || _a === void 0 ? void 0 : _a.length) !== 0) { + this.layers.push(new _entity_layer__WEBPACK_IMPORTED_MODULE_1__.EntityLayer(this, layer, resource, order)); + } + if (((_b = layer.gridTiles) === null || _b === void 0 ? void 0 : _b.length) !== 0) { + this.layers.push(new _tile_layer__WEBPACK_IMPORTED_MODULE_3__.TileLayer(this, layer, resource, order)); + } + // Includes standard IntGrid, IntGrid w/ AutoTile & AutoTile layers + if (((_c = layer.intGridCsv) === null || _c === void 0 ? void 0 : _c.length) !== 0 || ((_d = layer.autoLayerTiles) === null || _d === void 0 ? void 0 : _d.length) !== 0) { + this.layers.push(new _intgrid_layer__WEBPACK_IMPORTED_MODULE_2__.IntGridLayer(this, layer, resource, order)); + } + order++; + } } - return this._def.innerType._parse(input); - } - unwrap() { - return this._def.innerType; } } -ZodNullable.create = (type, params) => { - return new ZodNullable({ - innerType: type, - typeName: ZodFirstPartyTypeKind.ZodNullable, - ...processCreateParams(params), - }); -}; -class ZodDefault extends ZodType { - _parse(input) { - const { ctx } = this._processInputParams(input); - let data = ctx.data; - if (ctx.parsedType === ZodParsedType.undefined) { - data = this._def.defaultValue(); + + +/***/ }), + +/***/ "./src/loader-cache.ts": +/*!*****************************!*\ + !*** ./src/loader-cache.ts ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ LoaderCache: () => (/* binding */ LoaderCache) +/* harmony export */ }); +/** + * Read through cache for loadables + */ +class LoaderCache { + constructor(type) { + this.type = type; + this._loaded = false; + this.cache = new Map(); + } + getOrAdd(...args) { + let resource = this.cache.get(args.join('+')); + if (resource) { + return resource; } - return this._def.innerType._parse({ - data, - path: ctx.path, - parent: ctx, - }); + resource = new this.type(...args); + this.cache.set(args.join('+'), resource); + return resource; } - removeDefault() { - return this._def.innerType; + values() { + if (this._loaded) { + return Array.from(this.cache.values()); + } + throw new Error(`Read through cache not yet loaded! No values to return!`); } -} -ZodDefault.create = (type, params) => { - return new ZodDefault({ - innerType: type, - typeName: ZodFirstPartyTypeKind.ZodDefault, - defaultValue: typeof params.default === "function" - ? params.default - : () => params.default, - ...processCreateParams(params), - }); -}; -class ZodCatch extends ZodType { - _parse(input) { - const { ctx } = this._processInputParams(input); - // newCtx is used to not collect issues from inner types in ctx - const newCtx = { - ...ctx, - common: { - ...ctx.common, - issues: [], - }, - }; - const result = this._def.innerType._parse({ - data: newCtx.data, - path: newCtx.path, - parent: { - ...newCtx, - }, - }); - if (isAsync(result)) { - return result.then((result) => { - return { - status: "valid", - value: result.status === "valid" - ? result.value - : this._def.catchValue({ - get error() { - return new ZodError(newCtx.common.issues); - }, - input: newCtx.data, - }), - }; - }); + async load() { + const resources = Array.from(this.cache.entries()); + const results = await Promise.allSettled(resources.map(i => i[1].load())); + // Check for errors loading resources + let errored = 0; + for (let i = 0; i < results.length; i++) { + const result = results[i]; + if (result.status === 'rejected') { + console.error(`Error loading resource at ${resources[i][0]}, is your pathMap correct? or your LDtk map corrupted?`, result.reason); + errored++; + } } - else { - return { - status: "valid", - value: result.status === "valid" - ? result.value - : this._def.catchValue({ - get error() { - return new ZodError(newCtx.common.issues); - }, - input: newCtx.data, - }), - }; + if (errored) { + throw new Error(`Error loading ${errored} resources`); } - } - removeCatch() { - return this._def.innerType; + this._loaded = true; } } -ZodCatch.create = (type, params) => { - return new ZodCatch({ - innerType: type, - typeName: ZodFirstPartyTypeKind.ZodCatch, - catchValue: typeof params.catch === "function" ? params.catch : () => params.catch, - ...processCreateParams(params), - }); -}; -class ZodNaN extends ZodType { - _parse(input) { - const parsedType = this._getType(input); - if (parsedType !== ZodParsedType.nan) { - const ctx = this._getOrReturnCtx(input); - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_type, - expected: ZodParsedType.nan, - received: ctx.parsedType, - }); - return INVALID; - } - return { status: "valid", value: input.data }; + + +/***/ }), + +/***/ "./src/path-util.ts": +/*!**************************!*\ + !*** ./src/path-util.ts ***! + \**************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ filenameFromPath: () => (/* binding */ filenameFromPath), +/* harmony export */ mapPath: () => (/* binding */ mapPath), +/* harmony export */ pathInMap: () => (/* binding */ pathInMap), +/* harmony export */ pathRelativeToBase: () => (/* binding */ pathRelativeToBase) +/* harmony export */ }); +function filenameFromPath(inputPath) { + const filenameExpression = /[^/\\&\?]+\.\w{2,4}(?=([\#\?&].*$|$))/ig; + const matches = inputPath.match(filenameExpression); + if (matches) { + const match = matches[0]; + return match; } + throw new Error(`Could not locate filename from path: ${inputPath}`); } -ZodNaN.create = (params) => { - return new ZodNaN({ - typeName: ZodFirstPartyTypeKind.ZodNaN, - ...processCreateParams(params), - }); -}; -const BRAND = Symbol("zod_brand"); -class ZodBranded extends ZodType { - _parse(input) { - const { ctx } = this._processInputParams(input); - const data = ctx.data; - return this._def.type._parse({ - data, - path: ctx.path, - parent: ctx, - }); - } - unwrap() { - return this._def.type; +function mapPath(inputPath, pathMap) { + for (const { path, output } of pathMap) { + if (typeof path === 'string') { + if (inputPath.includes(path)) { + return output; + } + } + else { + const match = inputPath.match(path); + if (match) { + return output.replace('[match]', match[0]); + // removed by dead control flow +{} + } + } } + return inputPath; } -class ZodPipeline extends ZodType { - _parse(input) { - const { status, ctx } = this._processInputParams(input); - if (ctx.common.async) { - const handleAsync = async () => { - const inResult = await this._def.in._parseAsync({ - data: ctx.data, - path: ctx.path, - parent: ctx, - }); - if (inResult.status === "aborted") - return INVALID; - if (inResult.status === "dirty") { - status.dirty(); - return DIRTY(inResult.value); - } - else { - return this._def.out._parseAsync({ - data: inResult.value, - path: ctx.path, - parent: ctx, - }); - } - }; - return handleAsync(); +function pathInMap(inputPath, pathMap) { + if (!pathMap) + return false; + for (const { path, output } of pathMap) { + if (typeof path === 'string') { + if (inputPath.includes(path)) { + return true; + } } else { - const inResult = this._def.in._parseSync({ - data: ctx.data, - path: ctx.path, - parent: ctx, - }); - if (inResult.status === "aborted") - return INVALID; - if (inResult.status === "dirty") { - status.dirty(); - return { - status: "dirty", - value: inResult.value, - }; - } - else { - return this._def.out._parseSync({ - data: inResult.value, - path: ctx.path, - parent: ctx, - }); + const match = inputPath.match(path); + if (match) { + return true; } } } - static create(a, b) { - return new ZodPipeline({ - in: a, - out: b, - typeName: ZodFirstPartyTypeKind.ZodPipeline, - }); - } + return false; } -class ZodReadonly extends ZodType { - _parse(input) { - const result = this._def.innerType._parse(input); - const freeze = (data) => { - if (isValid(data)) { - data.value = Object.freeze(data.value); - } - return data; - }; - return isAsync(result) - ? result.then((data) => freeze(data)) - : freeze(result); +function pathRelativeToBase(basePath, relativeToBase, pathMap) { + if (pathInMap(relativeToBase, pathMap) && pathMap) { + return mapPath(relativeToBase, pathMap); } - unwrap() { - return this._def.innerType; + // Use absolute path if specified + if (relativeToBase.indexOf('/') === 0) { + return relativeToBase; + } + const originSplit = basePath.split('/'); + const relativeSplit = relativeToBase.split('/'); + // if origin path is a file, remove it so it's a directory + if (originSplit[originSplit.length - 1].includes('.')) { + originSplit.pop(); + } + return originSplit.concat(relativeSplit).join('/'); +} + + +/***/ }), + +/***/ "./src/tile-layer.ts": +/*!***************************!*\ + !*** ./src/tile-layer.ts ***! + \***************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ TileLayer: () => (/* binding */ TileLayer) +/* harmony export */ }); +/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); + +class TileLayer { + constructor(level, ldtkLayer, resource, order) { + var _a, _b, _c, _d; + this.order = order; + this.worldPos = (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(level.ldtkLevel.worldX, level.ldtkLevel.worldY); + this.offset = (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(ldtkLayer.__pxTotalOffsetX, ldtkLayer.__pxTotalOffsetY); + this.ldtkLayer = ldtkLayer; + this.tilemap = new excalibur__WEBPACK_IMPORTED_MODULE_0__.TileMap({ + name: ldtkLayer.__identifier, + pos: this.worldPos.add(this.offset), + tileWidth: ldtkLayer.__gridSize, + tileHeight: ldtkLayer.__gridSize, + rows: ldtkLayer.__cHei, + columns: ldtkLayer.__cWid, + }); + this.tilemap.z = order; + const graphics = this.tilemap.get(excalibur__WEBPACK_IMPORTED_MODULE_0__.GraphicsComponent); + graphics.isVisible = ldtkLayer.visible; + if (ldtkLayer.__tilesetDefUid) { + this.tileset = resource.tilesets.get(ldtkLayer.__tilesetDefUid); + for (let tile of ldtkLayer.gridTiles) { + const xCoord = Math.floor(tile.px[0] / ldtkLayer.__gridSize); + const yCoord = Math.floor(tile.px[1] / ldtkLayer.__gridSize); + const exTile = this.tilemap.getTile(xCoord, yCoord); + if (this.tileset) { + const tsxCoord = Math.floor((tile.src[0] - ((_a = this.tileset.ldtkTileset.padding) !== null && _a !== void 0 ? _a : 0)) / (this.tileset.ldtkTileset.tileGridSize + ((_b = this.tileset.ldtkTileset.spacing) !== null && _b !== void 0 ? _b : 0))); + const tsyCoord = Math.floor((tile.src[1] - ((_c = this.tileset.ldtkTileset.padding) !== null && _c !== void 0 ? _c : 0)) / (this.tileset.ldtkTileset.tileGridSize + ((_d = this.tileset.ldtkTileset.spacing) !== null && _d !== void 0 ? _d : 0))); + // Bit 0 toggles x flip + // Bit 1 toggles 1 flip + // Examples: f=0 (no flip), f=1 (X flip only), f=2 (Y flip only), f=3 (both flips) + const flipHorizontal = !!(tile.f & 0b01); + const flipVertical = !!(tile.f & 0b10); + let sprite = this.tileset.spritesheet.getSprite(tsxCoord, tsyCoord); + if (flipHorizontal || flipVertical) { + sprite = sprite.clone(); + sprite.flipHorizontal = flipHorizontal; + sprite.flipVertical = flipVertical; + } + if (sprite) { + exTile.addGraphic(sprite); + } + else { + console.error('Could not find sprite in LDtk spritesheet at', tsxCoord, tsyCoord); + } + } + } + } + else { + console.error('Could not tileset in LDtk', ldtkLayer.__tilesetDefUid, ldtkLayer.__tilesetRelPath); + } } } -ZodReadonly.create = (type, params) => { - return new ZodReadonly({ - innerType: type, - typeName: ZodFirstPartyTypeKind.ZodReadonly, - ...processCreateParams(params), - }); -}; -function custom(check, params = {}, -/** - * @deprecated - * - * Pass `fatal` into the params object instead: - * - * ```ts - * z.string().custom((val) => val.length > 5, { fatal: false }) - * ``` - * - */ -fatal) { - if (check) - return ZodAny.create().superRefine((data, ctx) => { - var _a, _b; - if (!check(data)) { - const p = typeof params === "function" - ? params(data) - : typeof params === "string" - ? { message: params } - : params; - const _fatal = (_b = (_a = p.fatal) !== null && _a !== void 0 ? _a : fatal) !== null && _b !== void 0 ? _b : true; - const p2 = typeof p === "string" ? { message: p } : p; - ctx.addIssue({ code: "custom", ...p2, fatal: _fatal }); + + +/***/ }), + +/***/ "./src/tileset.ts": +/*!************************!*\ + !*** ./src/tileset.ts ***! + \************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ Tileset: () => (/* binding */ Tileset) +/* harmony export */ }); +/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); + +class Tileset { + constructor(options) { + var _a, _b, _c, _d; + const { image, ldtkTileset } = options; + this.image = image; + this.ldtkTileset = ldtkTileset; + this.spritesheet = excalibur__WEBPACK_IMPORTED_MODULE_0__.SpriteSheet.fromImageSource({ + image, + grid: { + rows: ldtkTileset.pxHei / ldtkTileset.tileGridSize, + columns: ldtkTileset.pxWid / ldtkTileset.tileGridSize, + spriteHeight: ldtkTileset.tileGridSize, + spriteWidth: ldtkTileset.tileGridSize + }, + spacing: { + margin: { + x: (_a = ldtkTileset.spacing) !== null && _a !== void 0 ? _a : 0, + y: (_b = ldtkTileset.spacing) !== null && _b !== void 0 ? _b : 0, + }, + originOffset: { + x: (_c = ldtkTileset.padding) !== null && _c !== void 0 ? _c : 0, + y: (_d = ldtkTileset.padding) !== null && _d !== void 0 ? _d : 0 + } } }); - return ZodAny.create(); + } } -const late = { - object: ZodObject.lazycreate, -}; -var ZodFirstPartyTypeKind; -(function (ZodFirstPartyTypeKind) { - ZodFirstPartyTypeKind["ZodString"] = "ZodString"; - ZodFirstPartyTypeKind["ZodNumber"] = "ZodNumber"; - ZodFirstPartyTypeKind["ZodNaN"] = "ZodNaN"; - ZodFirstPartyTypeKind["ZodBigInt"] = "ZodBigInt"; - ZodFirstPartyTypeKind["ZodBoolean"] = "ZodBoolean"; - ZodFirstPartyTypeKind["ZodDate"] = "ZodDate"; - ZodFirstPartyTypeKind["ZodSymbol"] = "ZodSymbol"; - ZodFirstPartyTypeKind["ZodUndefined"] = "ZodUndefined"; - ZodFirstPartyTypeKind["ZodNull"] = "ZodNull"; - ZodFirstPartyTypeKind["ZodAny"] = "ZodAny"; - ZodFirstPartyTypeKind["ZodUnknown"] = "ZodUnknown"; - ZodFirstPartyTypeKind["ZodNever"] = "ZodNever"; - ZodFirstPartyTypeKind["ZodVoid"] = "ZodVoid"; - ZodFirstPartyTypeKind["ZodArray"] = "ZodArray"; - ZodFirstPartyTypeKind["ZodObject"] = "ZodObject"; - ZodFirstPartyTypeKind["ZodUnion"] = "ZodUnion"; - ZodFirstPartyTypeKind["ZodDiscriminatedUnion"] = "ZodDiscriminatedUnion"; - ZodFirstPartyTypeKind["ZodIntersection"] = "ZodIntersection"; - ZodFirstPartyTypeKind["ZodTuple"] = "ZodTuple"; - ZodFirstPartyTypeKind["ZodRecord"] = "ZodRecord"; - ZodFirstPartyTypeKind["ZodMap"] = "ZodMap"; - ZodFirstPartyTypeKind["ZodSet"] = "ZodSet"; - ZodFirstPartyTypeKind["ZodFunction"] = "ZodFunction"; - ZodFirstPartyTypeKind["ZodLazy"] = "ZodLazy"; - ZodFirstPartyTypeKind["ZodLiteral"] = "ZodLiteral"; - ZodFirstPartyTypeKind["ZodEnum"] = "ZodEnum"; - ZodFirstPartyTypeKind["ZodEffects"] = "ZodEffects"; - ZodFirstPartyTypeKind["ZodNativeEnum"] = "ZodNativeEnum"; - ZodFirstPartyTypeKind["ZodOptional"] = "ZodOptional"; - ZodFirstPartyTypeKind["ZodNullable"] = "ZodNullable"; - ZodFirstPartyTypeKind["ZodDefault"] = "ZodDefault"; - ZodFirstPartyTypeKind["ZodCatch"] = "ZodCatch"; - ZodFirstPartyTypeKind["ZodPromise"] = "ZodPromise"; - ZodFirstPartyTypeKind["ZodBranded"] = "ZodBranded"; - ZodFirstPartyTypeKind["ZodPipeline"] = "ZodPipeline"; - ZodFirstPartyTypeKind["ZodReadonly"] = "ZodReadonly"; -})(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {})); -const instanceOfType = ( -// const instanceOfType = any>( -cls, params = { - message: `Input not instance of ${cls.name}`, -}) => custom((data) => data instanceof cls, params); -const stringType = ZodString.create; -const numberType = ZodNumber.create; -const nanType = ZodNaN.create; -const bigIntType = ZodBigInt.create; -const booleanType = ZodBoolean.create; -const dateType = ZodDate.create; -const symbolType = ZodSymbol.create; -const undefinedType = ZodUndefined.create; -const nullType = ZodNull.create; -const anyType = ZodAny.create; -const unknownType = ZodUnknown.create; -const neverType = ZodNever.create; -const voidType = ZodVoid.create; -const arrayType = ZodArray.create; -const objectType = ZodObject.create; -const strictObjectType = ZodObject.strictCreate; -const unionType = ZodUnion.create; -const discriminatedUnionType = ZodDiscriminatedUnion.create; -const intersectionType = ZodIntersection.create; -const tupleType = ZodTuple.create; -const recordType = ZodRecord.create; -const mapType = ZodMap.create; -const setType = ZodSet.create; -const functionType = ZodFunction.create; -const lazyType = ZodLazy.create; -const literalType = ZodLiteral.create; -const enumType = ZodEnum.create; -const nativeEnumType = ZodNativeEnum.create; -const promiseType = ZodPromise.create; -const effectsType = ZodEffects.create; -const optionalType = ZodOptional.create; -const nullableType = ZodNullable.create; -const preprocessType = ZodEffects.createWithPreprocess; -const pipelineType = ZodPipeline.create; -const ostring = () => stringType().optional(); -const onumber = () => numberType().optional(); -const oboolean = () => booleanType().optional(); -const coerce = { - string: ((arg) => ZodString.create({ ...arg, coerce: true })), - number: ((arg) => ZodNumber.create({ ...arg, coerce: true })), - boolean: ((arg) => ZodBoolean.create({ - ...arg, - coerce: true, - })), - bigint: ((arg) => ZodBigInt.create({ ...arg, coerce: true })), - date: ((arg) => ZodDate.create({ ...arg, coerce: true })), -}; -const NEVER = INVALID; -var z = /*#__PURE__*/Object.freeze({ - __proto__: null, - defaultErrorMap: errorMap, - setErrorMap: setErrorMap, - getErrorMap: getErrorMap, - makeIssue: makeIssue, - EMPTY_PATH: EMPTY_PATH, - addIssueToContext: addIssueToContext, - ParseStatus: ParseStatus, - INVALID: INVALID, - DIRTY: DIRTY, - OK: OK, - isAborted: isAborted, - isDirty: isDirty, - isValid: isValid, - isAsync: isAsync, - get util () { return util; }, - get objectUtil () { return objectUtil; }, - ZodParsedType: ZodParsedType, - getParsedType: getParsedType, - ZodType: ZodType, - datetimeRegex: datetimeRegex, - ZodString: ZodString, - ZodNumber: ZodNumber, - ZodBigInt: ZodBigInt, - ZodBoolean: ZodBoolean, - ZodDate: ZodDate, - ZodSymbol: ZodSymbol, - ZodUndefined: ZodUndefined, - ZodNull: ZodNull, - ZodAny: ZodAny, - ZodUnknown: ZodUnknown, - ZodNever: ZodNever, - ZodVoid: ZodVoid, - ZodArray: ZodArray, - ZodObject: ZodObject, - ZodUnion: ZodUnion, - ZodDiscriminatedUnion: ZodDiscriminatedUnion, - ZodIntersection: ZodIntersection, - ZodTuple: ZodTuple, - ZodRecord: ZodRecord, - ZodMap: ZodMap, - ZodSet: ZodSet, - ZodFunction: ZodFunction, - ZodLazy: ZodLazy, - ZodLiteral: ZodLiteral, - ZodEnum: ZodEnum, - ZodNativeEnum: ZodNativeEnum, - ZodPromise: ZodPromise, - ZodEffects: ZodEffects, - ZodTransformer: ZodEffects, - ZodOptional: ZodOptional, - ZodNullable: ZodNullable, - ZodDefault: ZodDefault, - ZodCatch: ZodCatch, - ZodNaN: ZodNaN, - BRAND: BRAND, - ZodBranded: ZodBranded, - ZodPipeline: ZodPipeline, - ZodReadonly: ZodReadonly, - custom: custom, - Schema: ZodType, - ZodSchema: ZodType, - late: late, - get ZodFirstPartyTypeKind () { return ZodFirstPartyTypeKind; }, - coerce: coerce, - any: anyType, - array: arrayType, - bigint: bigIntType, - boolean: booleanType, - date: dateType, - discriminatedUnion: discriminatedUnionType, - effect: effectsType, - 'enum': enumType, - 'function': functionType, - 'instanceof': instanceOfType, - intersection: intersectionType, - lazy: lazyType, - literal: literalType, - map: mapType, - nan: nanType, - nativeEnum: nativeEnumType, - never: neverType, - 'null': nullType, - nullable: nullableType, - number: numberType, - object: objectType, - oboolean: oboolean, - onumber: onumber, - optional: optionalType, - ostring: ostring, - pipeline: pipelineType, - preprocess: preprocessType, - promise: promiseType, - record: recordType, - set: setType, - strictObject: strictObjectType, - string: stringType, - symbol: symbolType, - transformer: effectsType, - tuple: tupleType, - 'undefined': undefinedType, - union: unionType, - unknown: unknownType, - 'void': voidType, - NEVER: NEVER, - ZodIssueCode: ZodIssueCode, - quotelessJson: quotelessJson, - ZodError: ZodError -}); +/***/ }), + +/***/ "./src/types.ts": +/*!**********************!*\ + !*** ./src/types.ts ***! + \**********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ LdtkEntityDefinition: () => (/* binding */ LdtkEntityDefinition), +/* harmony export */ LdtkEntityInstance: () => (/* binding */ LdtkEntityInstance), +/* harmony export */ LdtkLayerDefinition: () => (/* binding */ LdtkLayerDefinition), +/* harmony export */ LdtkLayerInstance: () => (/* binding */ LdtkLayerInstance), +/* harmony export */ LdtkLevel: () => (/* binding */ LdtkLevel), +/* harmony export */ LdtkProjectMetadata: () => (/* binding */ LdtkProjectMetadata) +/* harmony export */ }); +/* harmony import */ var zod__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! zod */ "./node_modules/zod/lib/index.mjs"); +const LdtkTilesetRectangle = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + h: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + tilesetUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + w: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + x: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + y: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() +}); +const LdtkPixel = zod__WEBPACK_IMPORTED_MODULE_0__.z.tuple([zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), zod__WEBPACK_IMPORTED_MODULE_0__.z.number()]); +const LdtkFieldInstance = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + __identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + __tile: LdtkTilesetRectangle.nullable(), + __type: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), //z.union([z.literal('Int'), z.literal('Float'), z.literal('String'), z.literal('Bool'), z.literal('Enum')]), // TODO this might not work with ENUM + __value: zod__WEBPACK_IMPORTED_MODULE_0__.z.any(), + defUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() +}); +const LdtkTileInstance = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + a: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + f: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), // 2-bit int 0bXY flip + px: LdtkPixel, + src: LdtkPixel, + t: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() +}); +const LdtkEntityInstance = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + __grid: LdtkPixel, + __identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + __pivot: LdtkPixel, + __smartColor: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + __tags: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.string()), + __tile: LdtkTilesetRectangle.nullable(), + __worldX: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), + __worldY: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), + defUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + fieldInstances: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkFieldInstance), + height: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + iid: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + px: LdtkPixel, + width: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() +}); +const LdtkLayerInstance = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + __cHei: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + __cWid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + __gridSize: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + __identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + __opacity: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + __pxTotalOffsetX: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + __pxTotalOffsetY: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + __tilesetDefUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), + __tilesetRelPath: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), + __type: zod__WEBPACK_IMPORTED_MODULE_0__.z.union([zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('IntGrid'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('Entities'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('Tiles'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('AutoLayer')]), + autoLayerTiles: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkTileInstance), // only in auto layers + entityInstances: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkEntityInstance), // only in entity layers + gridTiles: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkTileInstance), + iid: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + intGridCsv: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.number()), // __cWid x __cHei, 0 means empty, values start at 1 + layerDefUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + levelId: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + overrideTilesetUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), + pxOffsetX: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + pxOffsetY: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + visible: zod__WEBPACK_IMPORTED_MODULE_0__.z.boolean() +}); +const LdtkLevel = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + __bgColor: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), + bgColor: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), + __bgPos: zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + cropRect: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.tuple([zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), zod__WEBPACK_IMPORTED_MODULE_0__.z.number()])), // cropX, cropY, cropWidth, cropHeight + scale: zod__WEBPACK_IMPORTED_MODULE_0__.z.tuple([zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), zod__WEBPACK_IMPORTED_MODULE_0__.z.number()]), + topLeftPx: LdtkPixel + }).nullable(), + __neighbours: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + dir: zod__WEBPACK_IMPORTED_MODULE_0__.z.union([zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('n'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('s'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('w'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('e'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('ne'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('nw'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('se'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('sw'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('o'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('<'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('>')]), + levelIid: zod__WEBPACK_IMPORTED_MODULE_0__.z.string() + })), + bgRelPath: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), + externalRelPath: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), + fieldInstances: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkFieldInstance), + identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + iid: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + layerInstances: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkLayerInstance).nullable(), // null if the save levels separately is enabled + pxHei: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + pxWid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + uid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + worldDepth: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + worldX: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + worldY: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() +}); +const LdtkWorld = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + iid: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + levels: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkLevel), + worldGridHeight: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + worldGridWidth: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + // TODO is this a typo Vania? + worldLayout: zod__WEBPACK_IMPORTED_MODULE_0__.z.union([zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('Free'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('GridVania'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('LinearHorizontal'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('LinearVertical')]), +}); +const LdtkEnumValueDefinition = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + color: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + id: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + tileRect: LdtkTilesetRectangle.nullable() +}); +const LdtkEnumDefinition = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + externalRelPath: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), + iconTilesetUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), + identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + tags: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.string()), + uid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + values: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkEnumValueDefinition) +}); +const LdtkTilesetDefinition = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + __cHei: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + __cWid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + customData: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + data: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + tileId: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() + })), + embedAtlas: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), + enumTags: zod__WEBPACK_IMPORTED_MODULE_0__.z.optional(zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + enumValueId: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + tileIds: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.number()) + }))), + identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + padding: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + pxHei: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + pxWid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + relPath: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), + spacing: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + tags: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.string()), + tagsSourceEnumUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), + tileGridSize: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + uid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() +}); +const LdtkLayerDefinition = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + __type: zod__WEBPACK_IMPORTED_MODULE_0__.z.union([zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("IntGrid"), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("Entities"), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("Tiles"), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("AutoLayer")]), + autoSourceLayerDefUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), + displayOpacity: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + gridSize: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + intGridValues: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + color: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + groupUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), + tile: LdtkTilesetRectangle.nullable(), + value: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() + })), + intGridValuesGroups: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + color: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), + identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), + uid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() + })), + parallaxFactorX: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + parallaxFactorY: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + parallaxScaling: zod__WEBPACK_IMPORTED_MODULE_0__.z.boolean(), + pxOffsetX: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + pxOffsetY: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + tilesetDefUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), + uid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), +}); +const LdtkEntityDefinition = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + color: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + height: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + nineSliceBorders: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.number()), + pivotX: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + pivotY: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + tileRect: LdtkTilesetRectangle.nullable(), + tileRenderMode: zod__WEBPACK_IMPORTED_MODULE_0__.z.union([ + zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("Cover"), + zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("FitInside"), + zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("Repeat"), + zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("Stretch"), + zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("FullSizeCropped"), + zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("FullSizeUncropped"), + zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("NineSlice") + ]), + tilesetId: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), + uiTileRect: LdtkTilesetRectangle.nullable(), + uid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + width: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() +}); +const LdtkDefinitions = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + tilesets: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkTilesetDefinition), + enums: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkEnumDefinition), + layers: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkLayerDefinition), + entities: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkEntityDefinition) +}); +const LdtkProjectMetadata = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + iid: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + bgColor: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), + defs: LdtkDefinitions, + externalLevels: zod__WEBPACK_IMPORTED_MODULE_0__.z.boolean(), + jsonVersion: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + levels: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkLevel), + toc: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + instancesData: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + fields: zod__WEBPACK_IMPORTED_MODULE_0__.z.any(), + heiPx: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + iids: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + widPix: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + worldX: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + worldY: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() + })) + })), + // Moving to worlds array + worldGridHeight: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), + worldGridWidth: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), + // TODO is this a LDtk docs typo Vania? + worldLayout: zod__WEBPACK_IMPORTED_MODULE_0__.z.union([zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('Free'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('GridVania'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('LinearHorizontal'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('LinearVertical')]).nullable(), + worlds: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkWorld) +}); /***/ }) @@ -48306,12 +48313,12 @@ var __webpack_exports__ = {}; !*** ./sample/pureautotile.ts ***! \********************************/ __webpack_require__.r(__webpack_exports__); -/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); -/* harmony import */ var _resources__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./resources */ "./sample/resources.ts"); +/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); +/* harmony import */ var _resources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./resources */ "./sample/resources.ts"); -excalibur__WEBPACK_IMPORTED_MODULE_1__.Flags.useLegacyImageRenderer(); -const game = new excalibur__WEBPACK_IMPORTED_MODULE_1__.Engine({ +excalibur__WEBPACK_IMPORTED_MODULE_0__.Flags.useLegacyImageRenderer(); +const game = new excalibur__WEBPACK_IMPORTED_MODULE_0__.Engine({ resolution: { width: 256, height: 256, @@ -48319,12 +48326,12 @@ const game = new excalibur__WEBPACK_IMPORTED_MODULE_1__.Engine({ suppressPlayButton: false, pixelArt: true, pixelRatio: 4, - displayMode: excalibur__WEBPACK_IMPORTED_MODULE_1__.DisplayMode.FitScreen, + displayMode: excalibur__WEBPACK_IMPORTED_MODULE_0__.DisplayMode.FitScreen, }); -game.start(_resources__WEBPACK_IMPORTED_MODULE_0__.loader).then(() => { +game.start(_resources__WEBPACK_IMPORTED_MODULE_1__.loader).then(() => { console.log('Game start!'); - _resources__WEBPACK_IMPORTED_MODULE_0__.Resources.LdtkPureAutoTile.addToScene(game.currentScene, { - pos: excalibur__WEBPACK_IMPORTED_MODULE_1__.vec(0, 0) + _resources__WEBPACK_IMPORTED_MODULE_1__.Resources.LdtkPureAutoTile.addToScene(game.currentScene, { + pos: excalibur__WEBPACK_IMPORTED_MODULE_0__.vec(0, 0) }); }); diff --git a/sample/pureautotile/pureautotile.js.map b/sample/pureautotile/pureautotile.js.map index 8a87bd5..513b7d4 100644 --- a/sample/pureautotile/pureautotile.js.map +++ b/sample/pureautotile/pureautotile.js.map @@ -1 +1 @@ -{"version":3,"file":"pureautotile/pureautotile.js","mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD,O;;;;;;;;;;;;;;;ACVuD;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC,qCAAqC;AACrC,qCAAqC;AACrC,sCAAsC;AACtC,sCAAsC;AACtC;AACA;AACO;AACP;AACA;AACA;AACA;AACA,gBAAgB,oEAAe;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,UAAU;AACxF;AACA;AACA,6DAA6D,2BAA2B;AACxF;AACA;AACA;;;;;;;;;;;;;;;AC3C+D;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA,eAAe,2DAAgB;AAC/B,eAAe,2DAAgB;AAC/B;AACA;AACA;AACA;AACA,cAAc,0DAAe;AAC7B;AACA;AACA;AACA;AACA,eAAe,0DAAe;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;AC5BO;AACA;AACP;AACA;AACA;AACA;AACA;AACA,+DAA+D,QAAQ;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP,oBAAoB,kCAAkC;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB,0BAAmB,EAAE,8BAAmB;;AAExD,8BAAmB,GAAG,0BAAmB;AACzC,qBAAqB,8BAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,4GAA4G,8BAAmB;AAC/H,iIAAiI,8BAAmB;AACpJ,qGAAqG,8BAAmB;AACxH,0HAA0H,8BAAmB;AAC7I;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD,iDAAiD;AACjD,gDAAgD;AAChD,+CAA+C;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,8FAA8F,MAAM,YAAY,aAAa,WAAW,YAAY,WAAW,MAAM,OAAO,aAAa,WAAW,YAAY,aAAa,WAAW,YAAY,WAAW,YAAY,WAAW,UAAU,YAAY,OAAO,OAAO,aAAa,cAAc,yBAAyB,yBAAyB,yBAAyB,yBAAyB,aAAa,OAAO,OAAO,MAAM,KAAK,YAAY,WAAW,YAAY,aAAa,WAAW,UAAU,UAAU,UAAU,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,UAAU,YAAY,WAAW,UAAU,MAAM,MAAM,YAAY,OAAO,KAAK,YAAY,aAAa,OAAO,KAAK,YAAY,OAAO,KAAK,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,MAAM,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,MAAM,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,MAAM,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,MAAM,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,kFAAkF,4BAA4B,yBAAyB,mBAAmB,yBAAyB,mBAAmB,0BAA0B,4BAA4B,kCAAkC,uCAAuC,gBAAgB,4BAA4B,0BAA0B,qBAAqB,8BAA8B,sBAAsB,0BAA0B,qBAAqB,sBAAsB,yBAAyB,mFAAmF,+BAA+B,4BAA4B,4DAA4D,0FAA0F,sEAAsE,0EAA0E,iEAAiE,KAAK,qCAAqC,oBAAoB,KAAK,uCAAuC,yBAAyB,kBAAkB,wBAAwB,8DAA8D,iBAAiB,gBAAgB,eAAe,gBAAgB,KAAK,sCAAsC,yBAAyB,kBAAkB,wBAAwB,iBAAiB,gBAAgB,0BAA0B,kBAAkB,mBAAmB,KAAK,qEAAqE,0BAA0B,KAAK,qCAAqC,8BAA8B,2BAA2B,KAAK,sCAAsC,6BAA6B,KAAK,4CAA4C,YAAY,mBAAmB,OAAO,UAAU,mBAAmB,OAAO,KAAK,uEAAuE,YAAY,mBAAmB,OAAO,UAAU,mBAAmB,OAAO,KAAK,6FAA6F,YAAY,mBAAmB,OAAO,UAAU,mBAAmB,OAAO,KAAK,2EAA2E,YAAY,mBAAmB,OAAO,UAAU,mBAAmB,OAAO,KAAK,qEAAqE,YAAY,mBAAmB,OAAO,UAAU,mBAAmB,OAAO,KAAK,uBAAuB;AAClmH;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,gBAAgB,0BAAmB,EAAE,+BAAmB;;AAExD,+BAAmB,GAAG,0BAAmB;AACzC,qBAAqB,+BAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,4GAA4G,+BAAmB;AAC/H,iIAAiI,+BAAmB;AACpJ,qGAAqG,+BAAmB;AACxH,0HAA0H,+BAAmB;AAC7I;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,mFAAmF,YAAY,WAAW,UAAU,UAAU,UAAU,MAAM,KAAK,UAAU,YAAY,WAAW,aAAa,WAAW,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,OAAO,KAAK,YAAY,+CAA+C,yBAAyB,gBAAgB,qBAAqB,gBAAgB,aAAa,KAAK,2BAA2B,iBAAiB,yBAAyB,oBAAoB,qCAAqC,wBAAwB,sBAAsB,sBAAsB,8BAA8B,yBAAyB,gCAAgC,2CAA2C,KAAK,kCAAkC,6BAA6B,KAAK,uBAAuB;AACr2B;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA,gDAAgD;AAChD;AACA;AACA,qFAAqF;AACrF;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,qBAAqB;AACrB;AACA;AACA,qBAAqB;AACrB;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,iBAAiB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,qBAAqB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,sFAAsF,qBAAqB;AAC3G;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,iDAAiD,qBAAqB;AACtE;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,sDAAsD,qBAAqB;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAO;;AAEP;AACA;AACA;AACA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,cAAc;AACrE;AACA;AACA;AACA;AACA;;AAEA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,2GAA2G,oCAAoC,mEAAmE,8DAA8D,uEAAuE,yCAAyC,2BAA2B,qBAAqB,wEAAwE,+BAA+B,uCAAuC,mHAAmH,oCAAoC,wEAAwE,iDAAiD,kHAAkH,4JAA4J,yCAAyC,uCAAuC,2CAA2C,2BAA2B,wEAAwE,kDAAkD,8CAA8C,6BAA6B,KAAK;;AAE57C,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,wGAAwG,yCAAyC,kBAAkB,0CAA0C,wBAAwB,wBAAwB,qBAAqB,8BAA8B,2BAA2B,mCAAmC,gCAAgC,8BAA8B,yBAAyB,6HAA6H,uDAAuD,sFAAsF,gFAAgF,mGAAmG,+GAA+G,KAAK;;AAEt/B,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6GAA6G,0CAA0C,mFAAmF,gCAAgC,iCAAiC,2BAA2B,uBAAuB,+CAA+C,yBAAyB,qBAAqB,2BAA2B,mJAAmJ,qCAAqC,oCAAoC,8BAA8B,iDAAiD,oCAAoC,KAAK,oDAAoD,8CAA8C,KAAK,yDAAyD,0CAA0C,KAAK,iGAAiG,mDAAmD,6CAA6C,KAAK,oBAAoB,+PAA+P,sJAAsJ,wDAAwD,wDAAwD,wEAAwE,oCAAoC,iCAAiC,KAAK;;AAEz2D,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,oHAAoH,0CAA0C,wBAAwB,4CAA4C,6CAA6C,6CAA6C,6CAA6C,8CAA8C,wBAAwB,+FAA+F,mBAAmB,sEAAsE,yDAAyD,mCAAmC,6CAA6C,sBAAsB,6CAA6C,sBAAsB,2CAA2C,oBAAoB,8BAA8B,oBAAoB,uOAAuO,+DAA+D,2EAA2E,gCAAgC,8BAA8B,0BAA0B,0BAA0B,oBAAoB,wCAAwC,sBAAsB,KAAK;;AAEp/C,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6GAA6G,0CAA0C,yDAAyD,mFAAmF,gCAAgC,yCAAyC,uBAAuB,sBAAsB,2BAA2B,mJAAmJ,qCAAqC,sCAAsC,8BAA8B,iDAAiD,sCAAsC,KAAK,oBAAoB,iQAAiQ,uJAAuJ,gCAAgC,6BAA6B,KAAK;;AAE1vC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,wGAAwG,yCAAyC,wBAAwB,+CAA+C,wBAAwB,wCAAwC,mBAAmB,0DAA0D,kCAAkC,uBAAuB,oBAAoB,8BAA8B,oBAAoB,mHAAmH,wFAAwF,qFAAqF,wBAAwB,uGAAuG,kDAAkD,KAAK;;AAE17B,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6GAA6G,yCAAyC,2BAA2B,qBAAqB,0BAA0B,KAAK;;AAErO,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,wGAAwG,oBAAoB,8BAA8B,8BAA8B,qBAAqB,6HAA6H,4DAA4D,KAAK;;AAE3Y,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6GAA6G,kCAAkC,4BAA4B,4BAA4B,gCAAgC,0BAA0B,sBAAsB,+BAA+B,+BAA+B,yBAAyB,uBAAuB,oBAAoB,kDAAkD,2BAA2B,8DAA8D,uBAAuB,0CAA0C,wCAAwC,yMAAyM,+CAA+C,mDAAmD,QAAQ,MAAM,6DAA6D,+CAA+C,sCAAsC,yCAAyC,6DAA6D,sEAAsE,8BAA8B,qEAAqE,kDAAkD,qCAAqC,OAAO,KAAK;;AAE18C,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6GAA6G,8BAA8B,4BAA4B,yBAAyB,uBAAuB,6BAA6B,0BAA0B,6BAA6B,4BAA4B,0BAA0B,kCAAkC,2CAA2C,uCAAuC,wCAAwC,+CAA+C,sCAAsC,uGAAuG,2BAA2B,4BAA4B,mCAAmC,0BAA0B,gBAAgB,8DAA8D,6NAA6N,wDAAwD,4FAA4F,2DAA2D,6CAA6C,2DAA2D,oGAAoG,wDAAwD,iDAAiD,4GAA4G,yEAAyE,+FAA+F,UAAU,sDAAsD,oFAAoF,wGAAwG,iEAAiE,qGAAqG,KAAK;;AAEvxE,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iHAAiH,yBAAyB,2BAA2B,qBAAqB,8CAA8C,2CAA2C,wBAAwB,4BAA4B,4DAA4D,sEAAsE,gCAAgC,sCAAsC,wBAAwB,KAAK;;AAE5iB,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,wGAAwG,oBAAoB,oBAAoB,0BAA0B,0BAA0B,qBAAqB,0DAA0D,kCAAkC,wBAAwB,KAAK;;AAElV,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iHAAiH,oCAAoC,wBAAwB,+EAA+E,8DAA8D,wEAAwE,qDAAqD,2BAA2B,qBAAqB,wIAAwI,qCAAqC,kDAAkD,uCAAuC,kDAAkD,uCAAuC,kHAAkH,8BAA8B,UAAU,MAAM,oCAAoC,SAAS,iCAAiC,qCAAqC,yEAAyE,0EAA0E,gDAAgD,4CAA4C,0JAA0J,4EAA4E,8DAA8D,YAAY,gKAAgK,4EAA4E,8DAA8D,YAAY,2BAA2B,yMAAyM,4EAA4E,2NAA2N,+FAA+F,0FAA0F,YAAY,gDAAgD,4CAA4C,yCAAyC,yEAAyE,mCAAmC,4CAA4C,YAAY,0EAA0E,qEAAqE,qCAAqC,KAAK;;AAEhmG,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,wGAAwG,yCAAyC,kBAAkB,uBAAuB,oBAAoB,0CAA0C,wBAAwB,wBAAwB,qBAAqB,8BAA8B,2BAA2B,mCAAmC,gCAAgC,8BAA8B,yBAAyB,6HAA6H,uDAAuD,kDAAkD,sFAAsF,gFAAgF,mGAAmG,+GAA+G,KAAK;;AAEnlC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6GAA6G,mEAAmE,uDAAuD,2BAA2B,qBAAqB,kDAAkD,KAAK;;AAE9U,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,wGAAwG,2BAA2B,wBAAwB,qBAAqB,+CAA+C,oFAAoF,KAAK;;AAExT,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6GAA6G,gDAAgD,6EAA6E,kDAAkD,kDAAkD,2BAA2B,qBAAqB,6CAA6C,yGAAyG,oEAAoE,uEAAuE,+CAA+C,cAAc,cAAc,2CAA2C,qEAAqE,wCAAwC,yCAAyC,QAAQ,uBAAuB,8DAA8D,iDAAiD,wCAAwC,QAAQ,uBAAuB,4DAA4D,wCAAwC,mDAAmD,OAAO,2DAA2D,kGAAkG,8EAA8E,iFAAiF,oBAAoB,4BAA4B,uBAAuB,8CAA8C,sDAAsD,sDAAsD,kCAAkC,yBAAyB,0DAA0D,+BAA+B,QAAQ,MAAM,oCAAoC,OAAO,KAAK;;AAE7gE,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,8EAA8E,gCAAmB;AACjG,qEAAqE,gCAAmB;AACxF,wEAAwE,gCAAmB;AAC3F,+EAA+E,gCAAmB;AAClG,uEAAuE,gCAAmB;AAC1F,uEAAuE,gCAAmB;AAC1F,yEAAyE,gCAAmB;AAC5F,0EAA0E,gCAAmB;AAC7F,yEAAyE,gCAAmB;AAC5F,yEAAyE,gCAAmB;AAC5F,4EAA4E,gCAAmB;AAC/F,uEAAuE,gCAAmB;AAC1F,uEAAuE,gCAAmB;AAC1F,uEAAuE,gCAAmB;AAC1F,sEAAsE,gCAAmB;AACzF,uEAAuE,gCAAmB;AAC1F,qEAAqE,gCAAmB;AACxF,wEAAwE,gCAAmB;AAC3F,sEAAsE,gCAAmB;AACzF,8DAA8D,gCAAmB;AACjF,uEAAuE,gCAAmB;AAC1F,wEAAwE,gCAAmB;AAC3F,wEAAwE,gCAAmB;;;;;;;;;;;;;;;;;;;;;;;;AAwB3F;AACA;AACA,IAAI,2BAA2B;AAC/B;AACA,QAAQ,iBAAiB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,gCAAmB;;AAEnF;AACA;AACA;AACA,kCAAkC,uCAAuC;AACzE,oDAAoD,eAAe;AACnE;AACA,qBAAqB,wBAAwB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,gCAAmB;AACnF,uEAAuE,gCAAmB;;;AAG1F;AACA;AACA,IAAI,0BAA0B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,oFAAoF,gCAAmB;AACvG,gEAAgE,gCAAmB;;;AAGnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,gCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+EAA+E,gCAAmB;AAClG,8DAA8D,gCAAmB;AACjF,8DAA8D,gCAAmB;AACjF,8DAA8D,gCAAmB;AACjF,8DAA8D,gCAAmB;AACjF,gEAAgE,gCAAmB;;;;AAInF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+EAA+E,gCAAmB;AAClG,8DAA8D,gCAAmB;AACjF,8DAA8D,gCAAmB;AACjF,8DAA8D,gCAAmB;AACjF,8DAA8D,gCAAmB;AACjF,gEAAgE,gCAAmB;;;;AAInF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,gCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,gCAAmB;AACnF,0EAA0E,gCAAmB;;;AAG7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,0GAA0G,gCAAmB;AAC7H,6GAA6G,gCAAmB;AAChI,qEAAqE,gCAAmB;AACxF,gEAAgE,gCAAmB;;;;;AAKnF;AACA,2BAA2B,yDAAyD;AACpF;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6GAA6G,gCAAmB;AAChI,0GAA0G,gCAAmB;AAC7H,qEAAqE,gCAAmB;AACxF,gEAAgE,gCAAmB;;;;;AAKnF;AACA,2BAA2B,sDAAsD;AACjF;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,oFAAoF,gCAAmB;AACvG,kEAAkE,gCAAmB;AACrF,gEAAgE,gCAAmB;;;;AAInF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,oFAAoF,gCAAmB;AACvG,gEAAgE,gCAAmB;;;AAGnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,0GAA0G,gCAAmB;AAC7H,6GAA6G,gCAAmB;AAChI,qEAAqE,gCAAmB;AACxF,gEAAgE,gCAAmB;;;;;AAKnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,0GAA0G,iCAAmB;AAC7H,6GAA6G,iCAAmB;AAChI,qEAAqE,iCAAmB;AACxF,gEAAgE,iCAAmB;;;;;AAKnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,0GAA0G,iCAAmB;AAC7H,6GAA6G,iCAAmB;AAChI,8DAA8D,iCAAmB;AACjF,8DAA8D,iCAAmB;AACjF,qEAAqE,iCAAmB;AACxF,8EAA8E,iCAAmB;AACjG,kEAAkE,iCAAmB;AACrF,gEAAgE,iCAAmB;;;;;;;;AAQnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,0GAA0G,iCAAmB;AAC7H,6GAA6G,iCAAmB;AAChI,8DAA8D,iCAAmB;AACjF,8DAA8D,iCAAmB;AACjF,qEAAqE,iCAAmB;AACxF,8EAA8E,iCAAmB;AACjG,gEAAgE,iCAAmB;;;;;;;AAOnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;;AAEnF;AACA,iCAAiC,gBAAgB,MAAM,wBAAwB;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;;;AAG1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;;;AAG1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,6GAA6G,iCAAmB;AAChI,0GAA0G,iCAAmB;AAC7H,mEAAmE,iCAAmB;AACtF,8DAA8D,iCAAmB;AACjF,8DAA8D,iCAAmB;;;;;;AAMjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,8DAA8D,iCAAmB;AACjF,6GAA6G,iCAAmB;AAChI,0GAA0G,iCAAmB;AAC7H,mEAAmE,iCAAmB;AACtF,8DAA8D,iCAAmB;;;;;;;AAOjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,0GAA0G,iCAAmB;AAC7H,6GAA6G,iCAAmB;AAChI,gEAAgE,iCAAmB;AACnF,8DAA8D,iCAAmB;AACjF,8DAA8D,iCAAmB;;;;;;AAMjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,0GAA0G,iCAAmB;AAC7H,6GAA6G,iCAAmB;AAChI,gEAAgE,iCAAmB;AACnF,8DAA8D,iCAAmB;AACjF,8DAA8D,iCAAmB;;;;;;AAMjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,uEAAuE,iCAAmB;AAC1F,yFAAyF,iCAAmB;AAC5G,0GAA0G,iCAAmB;AAC7H,6GAA6G,iCAAmB;;;;;AAKhI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+EAA+E,iCAAmB;AAClG,sFAAsF,iCAAmB;AACzG,0EAA0E,iCAAmB;;;;AAI7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,uEAAuE,iCAAmB;AAC1F,qEAAqE,iCAAmB;AACxF,gEAAgE,iCAAmB;AACnF,+EAA+E,iCAAmB;AAClG,gFAAgF,iCAAmB;AACnG,uEAAuE,iCAAmB;AAC1F,8EAA8E,iCAAmB;AACjG,sEAAsE,iCAAmB;AACzF,oEAAoE,iCAAmB;AACvF,uEAAuE,iCAAmB;AAC1F,wEAAwE,iCAAmB;AAC3F,sEAAsE,iCAAmB;AACzF,wEAAwE,iCAAmB;AAC3F,sEAAsE,iCAAmB;AACzF,wEAAwE,iCAAmB;AAC3F,wEAAwE,iCAAmB;AAC3F,0EAA0E,iCAAmB;AAC7F,0EAA0E,iCAAmB;AAC7F,yEAAyE,iCAAmB;AAC5F,yEAAyE,iCAAmB;AAC5F,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;AAC1F,yEAAyE,iCAAmB;AAC5F,yEAAyE,iCAAmB;AAC5F,2EAA2E,iCAAmB;AAC9F,wEAAwE,iCAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8B3F,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,iEAAiE,iCAAmB;AACpF,kEAAkE,iCAAmB;AACrF,qEAAqE,iCAAmB;AACxF,kFAAkF,iCAAmB;AACrG,kFAAkF,iCAAmB;AACrG,sFAAsF,iCAAmB;AACzG,6GAA6G,iCAAmB;AAChI,0GAA0G,iCAAmB;AAC7H,oFAAoF,iCAAmB;AACvG,6EAA6E,iCAAmB;AAChG,sFAAsF,iCAAmB;AACzG,oFAAoF,iCAAmB;AACvG,oEAAoE,iCAAmB;AACvF,0EAA0E,iCAAmB;AAC7F,gFAAgF,iCAAmB;AACnG,mFAAmF,iCAAmB;AACtG,0EAA0E,iCAAmB;AAC7F,sEAAsE,iCAAmB;;;;;;;;;;;;;;;;;;;AAmBzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,gBAAgB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qGAAqG,qBAAqB;AAC1H;AACA;AACA;AACA;AACA;AACA,qGAAqG,qBAAqB;AAC1H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uMAAuM;AACvN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE,IAAI;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,oBAAoB;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oGAAoG,IAAI;AACxG;AACA,8FAA8F,eAAe;AAC7G;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,qBAAqB;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uGAAuG,IAAI;AAC3G;AACA,6FAA6F,eAAe;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,UAAU;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,yBAAyB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wGAAwG,IAAI;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0GAA0G,IAAI;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,sBAAsB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,uBAAuB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,8EAA8E,iCAAmB;AACjG,qEAAqE,iCAAmB;AACxF,mEAAmE,iCAAmB;AACtF,gEAAgE,iCAAmB;AACnF,+EAA+E,iCAAmB;AAClG,kEAAkE,iCAAmB;AACrF,4EAA4E,iCAAmB;AAC/F,sEAAsE,iCAAmB;AACzF,kEAAkE,iCAAmB;AACrF,oEAAoE,iCAAmB;AACvF,2EAA2E,iCAAmB;;;;;;;;;;;;AAY9F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,oCAAoC;AACjE;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,wCAAwC;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,iCAAiC;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,oCAAoC;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,oCAAoC;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oBAAoB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,iBAAiB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,iBAAiB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE,gBAAgB;AACrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE,gBAAgB;AACrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,yCAAyC;AAChG,mBAAmB,kBAAkB;AACrC,qBAAqB,kBAAkB,cAAc,iBAAiB;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,sBAAsB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wGAAwG,IAAI;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,uBAAuB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yGAAyG,IAAI;AAC7G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yGAAyG,IAAI;AAC7G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,uEAAuE,iCAAmB;AAC1F,6GAA6G,iCAAmB;AAChI,0GAA0G,iCAAmB;AAC7H,yFAAyF,iCAAmB;AAC5G,8EAA8E,iCAAmB;AACjG,4DAA4D,iCAAmB;AAC/E,oEAAoE,iCAAmB;AACvF,4EAA4E,iCAAmB;AAC/F,wEAAwE,iCAAmB;AAC3F,sEAAsE,iCAAmB;AACzF,uEAAuE,iCAAmB;;;;;;;;;;;;;AAa1F;AACA;AACA;AACA;AACA;AACA,CAAC,0CAA0C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4EAA4E;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,gCAAgC;AAChD;AACA;AACA;AACA;AACA,sCAAsC,0BAA0B;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8GAA8G,qBAAqB;AACnI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,8BAA8B;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,oCAAoC;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,2BAA2B,MAAM,8BAA8B;AACnH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,uBAAuB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,+DAA+D,iCAAmB;AAClF,8DAA8D,iCAAmB;;;;AAIjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,sBAAsB;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,gBAAgB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E,OAAO;AACjF;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,+EAA+E,iCAAmB;AAClG,yFAAyF,iCAAmB;AAC5G,gEAAgE,iCAAmB;AACnF,yEAAyE,iCAAmB;AAC5F,qEAAqE,iCAAmB;AACxF,qFAAqF,iCAAmB;AACxG,yEAAyE,iCAAmB;AAC5F,sEAAsE,iCAAmB;AACzF,+DAA+D,iCAAmB;;;;;;;;;;;AAWlF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,sCAAsC;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,+CAA+C;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,2CAA2C;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,4BAA4B;AAChD;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,4EAA4E,iCAAmB;AAC/F,yEAAyE,iCAAmB;AAC5F,sEAAsE,iCAAmB;AACzF,0EAA0E,iCAAmB;AAC7F,qEAAqE,iCAAmB;AACxF,gEAAgE,iCAAmB;AACnF,kEAAkE,iCAAmB;AACrF,8EAA8E,iCAAmB;AACjG,4EAA4E,iCAAmB;AAC/F,+DAA+D,iCAAmB;AAClF,mEAAmE,iCAAmB;;;;;;;;;;;;;AAatF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qFAAqF,aAAa;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oFAAoF,gBAAgB;AACpG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,YAAY,IAAI,KAAK,cAAc;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,2EAA2E,iCAAmB;AAC9F,qEAAqE,iCAAmB;AACxF,kEAAkE,iCAAmB;AACrF,mEAAmE,iCAAmB;;;;;AAKtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C,4BAA4B,mBAAmB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,4DAA4D,iCAAmB;AAC/E,sEAAsE,iCAAmB;;;;AAIzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,wEAAwE,iCAAmB;AAC3F,oFAAoF,iCAAmB;AACvG,yEAAyE,iCAAmB;AAC5F,sEAAsE,iCAAmB;AACzF,wEAAwE,iCAAmB;AAC3F,2EAA2E,iCAAmB;AAC9F,qEAAqE,iCAAmB;AACxF,+EAA+E,iCAAmB;AAClG,wEAAwE,iCAAmB;AAC3F,4EAA4E,iCAAmB;;;;;;;;;;;AAW/F,2EAA2E;AAC3E,6EAA6E;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,uBAAuB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,0DAA0D,iCAAmB;AAC7E,wEAAwE,iCAAmB;AAC3F,yEAAyE,iCAAmB;AAC5F,qEAAqE,iCAAmB;AACxF,qEAAqE,iCAAmB;AACxF,+EAA+E,iCAAmB;AAClG,iGAAiG,iCAAmB;AACpH,kEAAkE,iCAAmB;AACrF,uEAAuE,iCAAmB;;;;;;;;;;AAU1F;AACA;AACA;AACA;AACA;AACA,sDAAsD,4BAA4B;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,4EAA4E,iCAAmB;AAC/F,wEAAwE,iCAAmB;AAC3F,yEAAyE,iCAAmB;AAC5F,0EAA0E,iCAAmB;AAC7F,2EAA2E,iCAAmB;AAC9F,qEAAqE,iCAAmB;AACxF,kEAAkE,iCAAmB;AACrF,8EAA8E,iCAAmB;AACjG,4EAA4E,iCAAmB;AAC/F,+DAA+D,iCAAmB;;;;;;;;;;;;AAYlF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qFAAqF,aAAa;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kFAAkF,aAAa;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,sEAAsE,iCAAmB;AACzF,uEAAuE,iCAAmB;AAC1F,6EAA6E,iCAAmB;AAChG,wEAAwE,iCAAmB;AAC3F,0EAA0E,iCAAmB;AAC7F,2EAA2E,iCAAmB;AAC9F,qEAAqE,iCAAmB;AACxF,kEAAkE,iCAAmB;AACrF,+EAA+E,iCAAmB;AAClG,kEAAkE,iCAAmB;AACrF,0DAA0D,iCAAmB;AAC7E,0DAA0D,iCAAmB;AAC7E,2DAA2D,iCAAmB;AAC9E,2DAA2D,iCAAmB;AAC9E,2EAA2E,iCAAmB;AAC9F,+DAA+D,iCAAmB;AAClF,wEAAwE,iCAAmB;;;;;;;;;;;;;;;AAe3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,yBAAyB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,8BAA8B,eAAe,4BAA4B;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,4BAA4B;AACrF;AACA;AACA;AACA,wBAAwB,4BAA4B;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,4BAA4B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,iBAAiB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,iBAAiB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,iBAAiB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,iBAAiB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,SAAS;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,SAAS;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,qBAAqB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,qBAAqB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,0BAA0B;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qFAAqF,gBAAgB;AACrG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qFAAqF,gBAAgB;AACrG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oEAAoE,OAAO;AAC3E;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,2EAA2E,iCAAmB;AAC9F,qEAAqE,iCAAmB;AACxF,4EAA4E,iCAAmB;AAC/F,mEAAmE,iCAAmB;;;;;AAKtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,+BAA+B;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,+BAA+B;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yEAAyE,iCAAmB;AAC5F,wEAAwE,iCAAmB;AAC3F,sEAAsE,iCAAmB;AACzF,qEAAqE,iCAAmB;AACxF,qEAAqE,iCAAmB;AACxF,2EAA2E,iCAAmB;AAC9F,0DAA0D,iCAAmB;;;;;;;;AAQ7E;AACA;AACA;AACA;AACA;AACA,yDAAyD,0BAA0B;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,sBAAsB,gDAAgD;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,sBAAsB,oCAAoC;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,sBAAsB,gCAAgC;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,qCAAqC,4BAA4B;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gFAAgF,iCAAmB;AACnG,0GAA0G,iCAAmB;AAC7H,6GAA6G,iCAAmB;AAChI,sFAAsF,iCAAmB;AACzG,iEAAiE,iCAAmB;AACpF,yEAAyE,iCAAmB;AAC5F,6EAA6E,iCAAmB;AAChG,gFAAgF,iCAAmB;AACnG,2EAA2E,iCAAmB;AAC9F,qFAAqF,iCAAmB;AACxG,yEAAyE,iCAAmB;AAC5F,kFAAkF,iCAAmB;AACrG,sEAAsE,iCAAmB;AACzF,wEAAwE,iCAAmB;;;;;;;;;;;;;;;AAe3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,0CAA0C;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA,2BAA2B,gBAAgB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,sCAAsC;;;AAGvC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,uEAAuE,iCAAmB;AAC1F,8DAA8D,iCAAmB;AACjF,uEAAuE,iCAAmB;;;;AAI1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,kEAAkE,iCAAmB;AACrF,uEAAuE,iCAAmB;AAC1F,0DAA0D,iCAAmB;;;;;AAK7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,8DAA8D,iCAAmB;AACjF,sEAAsE,iCAAmB;AACzF,kEAAkE,iCAAmB;AACrF,kEAAkE,iCAAmB;AACrF,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;AAC1F,qFAAqF,iCAAmB;AACxG,8EAA8E,iCAAmB;AACjG,qEAAqE,iCAAmB;AACxF,4DAA4D,iCAAmB;;;;;;;;;;;;AAY/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,uDAAuD,OAAO;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8FAA8F;AAC9F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;;;AAG1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,UAAU,GAAG,UAAU;AAC9C;AACA;AACA,uBAAuB,UAAU,GAAG,UAAU;AAC9C;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,qEAAqE,iCAAmB;;;AAGxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,qEAAqE,iCAAmB;AACxF,yEAAyE,iCAAmB;AAC5F,qEAAqE,iCAAmB;;;;;AAKxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,EAAE,GAAG,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,aAAa;AAC7C,mCAAmC,cAAc;AACjD;AACA;AACA;AACA;AACA,wCAAwC,yBAAyB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,yBAAyB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,mBAAmB;AACrD,qCAAqC,oBAAoB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,mBAAmB;AAC7D,6CAA6C,oBAAoB;AACjE;AACA;AACA;AACA;AACA;AACA,0CAA0C,mBAAmB;AAC7D,6CAA6C,oBAAoB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,4DAA4D,iCAAmB;AAC/E,qEAAqE,iCAAmB;AACxF,mEAAmE,iCAAmB;AACtF,uEAAuE,iCAAmB;AAC1F,qFAAqF,iCAAmB;AACxG,uEAAuE,iCAAmB;AAC1F,8EAA8E,iCAAmB;AACjG,8DAA8D,iCAAmB;AACjF,wEAAwE,iCAAmB;;;;;;;;;;AAU3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8HAA8H,kEAAkE,IAAI,kEAAkE;AACtQ;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,qCAAqC;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,qBAAqB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA,oCAAoC,gCAAgC;AACpE;AACA;AACA;AACA,yCAAyC,kCAAkC;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA,4BAA4B,wBAAwB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA,mBAAmB,gCAAgC;AACnD;AACA;AACA,4DAA4D,mCAAmC;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4DAA4D;;;AAG7D,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+EAA+E,iCAAmB;;AAElG;AACA,mFAAmF,gCAAgC,WAAW,wBAAwB;AACtJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,uCAAuC;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,6CAA6C;AAC1F;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ,YAAY;AACZ;AACA;AACA;AACA;AACA,cAAc,yBAAyB;AACvC;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,wEAAwE,iCAAmB;;AAE3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,kBAAkB;AACvE;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,MAAM;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,uEAAuE,iCAAmB;AAC1F,2EAA2E,iCAAmB;AAC9F,uEAAuE,iCAAmB;AAC1F,wEAAwE,iCAAmB;AAC3F,4EAA4E,iCAAmB;AAC/F,qEAAqE,iCAAmB;AACxF,yEAAyE,iCAAmB;AAC5F,qFAAqF,iCAAmB;AACxG,kFAAkF,iCAAmB;AACrG,gFAAgF,iCAAmB;AACnG,oFAAoF,iCAAmB;AACvG,uFAAuF,iCAAmB;AAC1G,yFAAyF,iCAAmB;AAC5G,mFAAmF,iCAAmB;AACtG,+EAA+E,iCAAmB;AAClG,sFAAsF,iCAAmB;AACzG,yEAAyE,iCAAmB;AAC5F,qFAAqF,iCAAmB;AACxG,gFAAgF,iCAAmB;AACnG,kGAAkG,iCAAmB;AACrH,qGAAqG,iCAAmB;AACxH,mFAAmF,iCAAmB;AACtG,6FAA6F,iCAAmB;AAChH,6EAA6E,iCAAmB;AAChG,8EAA8E,iCAAmB;AACjG,6EAA6E,iCAAmB;AAChG,wFAAwF,iCAAmB;AAC3G,iFAAiF,iCAAmB;AACpG,0EAA0E,iCAAmB;AAC7F,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;AAC1F,wEAAwE,iCAAmB;AAC3F,+DAA+D,iCAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyClF,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;;AAExF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+EAA+E,iCAAmB;AAClG,0GAA0G,iCAAmB;AAC7H,6GAA6G,iCAAmB;AAChI,sFAAsF,iCAAmB;AACzG,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;AAC1F,oEAAoE,iCAAmB;;;;;;;;AAQvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,4BAA4B;AACpD;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,wEAAwE,iCAAmB;AAC3F,4EAA4E,iCAAmB;AAC/F,4FAA4F,iCAAmB;;;;;AAK/G;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;AAGD,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yEAAyE,iCAAmB;AAC5F,+DAA+D,iCAAmB;AAClF,+DAA+D,iCAAmB;AAClF,uEAAuE,iCAAmB;AAC1F,oEAAoE,iCAAmB;AACvF,4FAA4F,iCAAmB;;;;;;AAM/G;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oBAAoB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oBAAoB;;;AAGrB,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA,mBAAmB,gCAAgC;AACnD;AACA;AACA,4DAA4D,mCAAmC;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,wCAAwC;;;AAGzC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,8DAA8D,iCAAmB;AACjF,uEAAuE,iCAAmB;AAC1F,qEAAqE,iCAAmB;;;;;;AAMxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4CAA4C;AAC7C;AACA,kDAAkD,uBAAuB;AACzE;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,uBAAuB;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uBAAuB;AACvC;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;;AAExF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,mEAAmE,iCAAmB;AACtF,uEAAuE,iCAAmB;AAC1F,gFAAgF,iCAAmB;AACnG,8DAA8D,iCAAmB;AACjF,uEAAuE,iCAAmB;AAC1F,sFAAsF,iCAAmB;;;;;;;;AAQzG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,2BAA2B;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,qBAAqB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oCAAoC;AAC5D,4BAA4B,qBAAqB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6EAA6E;AAC7E;AACA,uDAAuD;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oCAAoC;AAC5D,4BAA4B,qBAAqB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA,mCAAmC,qBAAqB;AACxD;AACA,iCAAiC,uBAAuB,GAAG,sBAAsB;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;AAC3C;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,cAAc;AACnD;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,oEAAoE,iCAAmB;AACvF,+DAA+D,iCAAmB;;;AAGlF;AACA;AACA,gDAAgD,gBAAgB;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2EAA2E,2BAA2B;AACtG,iCAAiC,oBAAoB,YAAY;AACjE;AACA;AACA;AACA,4EAA4E,2BAA2B;AACvG,iCAAiC,mBAAmB,uDAAuD;AAC3G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,oBAAoB;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,wBAAwB;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uEAAuE,0BAA0B;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,mGAAmG,iCAAmB;AACtH,4GAA4G,iCAAmB;AAC/H,wGAAwG,iCAAmB;;;;AAI3H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,2GAA2G,iCAAmB;AAC9H,sFAAsF,iCAAmB;AACzG,+EAA+E,iCAAmB;AAClG,gFAAgF,iCAAmB;AACnG,sFAAsF,iCAAmB;AACzG,qEAAqE,iCAAmB;AACxF,mEAAmE,iCAAmB;AACtF,iFAAiF,iCAAmB;AACpG,mFAAmF,iCAAmB;AACtG,gGAAgG,iCAAmB;AACnH,oFAAoF,iCAAmB;AACvG,6EAA6E,iCAAmB;AAChG,yFAAyF,iCAAmB;AAC5G,0EAA0E,iCAAmB;AAC7F,yEAAyE,iCAAmB;;;;;;;;;;;;;;;AAe5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gCAAgC;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mHAAmH,0CAA0C;AAC7J;AACA;AACA,+DAA+D,mBAAmB;AAClF;AACA;AACA;AACA,8DAA8D,gBAAgB;AAC9E;AACA;AACA;AACA,+DAA+D,GAAG,IAAI,8GAA8G;AACpL;AACA;AACA;AACA,iEAAiE,KAAK;AACtE;AACA;AACA;AACA;AACA,oEAAoE,8EAA8E;AAClJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4EAA4E,gBAAgB;AAC5F;AACA;AACA;AACA,2EAA2E,mBAAmB;AAC9F;AACA;AACA;AACA,iEAAiE,UAAU;AAC3E;AACA;AACA;AACA,mEAAmE,iBAAiB;AACpF;AACA;AACA;AACA,qEAAqE,+CAA+C;AACpH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D,uBAAuB;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8GAA8G,qCAAqC;AACnJ;AACA,iFAAiF,kBAAkB;AACnG;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0GAA0G,qCAAqC;AAC/I;AACA,6EAA6E,sBAAsB;AACnG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,kBAAkB;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,oEAAoE,iCAAmB;AACvF,qEAAqE,iCAAmB;;;;;;AAMxF,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,kEAAkE,iCAAmB;AACrF,oEAAoE,iCAAmB;AACvF,qEAAqE,iCAAmB;;;;AAIxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,6BAA6B,GAAG;AAChD,iCAAiC,QAAQ;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,uEAAuE,iCAAmB;AAC1F,yEAAyE,iCAAmB;AAC5F,4EAA4E,iCAAmB;AAC/F,mEAAmE,iCAAmB;AACtF,+EAA+E,iCAAmB;AAClG,qEAAqE,iCAAmB;AACxF,sEAAsE,iCAAmB;AACzF,+DAA+D,iCAAmB;AAClF,mEAAmE,iCAAmB;;;;;;;;;;AAUtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yFAAyF;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,uEAAuE,iCAAmB;AAC1F,+DAA+D,iCAAmB;AAClF,gEAAgE,iCAAmB;AACnF,kEAAkE,iCAAmB;AACrF,gEAAgE,iCAAmB;AACnF,sEAAsE,iCAAmB;;;;;;;AAOzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,eAAe;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,sBAAsB;AAC1C,oBAAoB,uCAAuC;AAC3D,gDAAgD,sCAAsC;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uFAAuF,IAAI;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2EAA2E,YAAY;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,kBAAkB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,iHAAiH;AAClI,iBAAiB,mHAAmH;AACpI;AACA;AACA;AACA,gBAAgB,gDAAgD;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,QAAQ;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,kEAAkE,iCAAmB;AACrF,oEAAoE,iCAAmB;;;;AAIvF;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,iCAAiC,QAAQ;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,uEAAuE,iCAAmB;AAC1F,yEAAyE,iCAAmB;AAC5F,oEAAoE,iCAAmB;AACvF,mEAAmE,iCAAmB;AACtF,sEAAsE,iCAAmB;AACzF,uEAAuE,iCAAmB;AAC1F,kEAAkE,iCAAmB;AACrF,qEAAqE,iCAAmB;;;;;;;;;;AAUxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,iBAAiB,mBAAmB,mBAAmB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA,8EAA8E;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,4DAA4D;AAChF;AACA;AACA;AACA;AACA,gEAAgE,0BAA0B;AAC1F,+DAA+D,0BAA0B;AACzF;AACA;AACA,gEAAgE,yCAAyC;AACzG,+DAA+D,gDAAgD;AAC/G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oFAAoF;AACpF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,kEAAkE,iCAAmB;AACrF,oEAAoE,iCAAmB;AACvF,qEAAqE,iCAAmB;AACxF,8EAA8E,iCAAmB;AACjG,0EAA0E,iCAAmB;;;;;;AAM7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,6BAA6B,GAAG;AAChD;AACA,6BAA6B,QAAQ;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,+EAA+E,iCAAmB;AAClG,+EAA+E,iCAAmB;AAClG,kEAAkE,iCAAmB;AACrF,0EAA0E,iCAAmB;AAC7F,qEAAqE,iCAAmB;AACxF,mEAAmE,iCAAmB;AACtF,8EAA8E,iCAAmB;AACjG,wEAAwE,iCAAmB;AAC3F,kEAAkE,iCAAmB;;;;;;;;;;AAUrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,QAAQ;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D,WAAW;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE,WAAW;AAC3E;AACA;AACA;AACA,gEAAgE,WAAW;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,oEAAoE,iCAAmB;AACvF,mEAAmE,iCAAmB;AACtF,mEAAmE,iCAAmB;AACtF,+DAA+D,iCAAmB;AAClF,kEAAkE,iCAAmB;AACrF,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;;;;;;;;;;AAU1F,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,0DAA0D,iCAAmB;AAC7E,qEAAqE,iCAAmB;AACxF,sEAAsE,iCAAmB;AACzF,6EAA6E,iCAAmB;AAChG,+DAA+D,iCAAmB;AAClF,kEAAkE,iCAAmB;AACrF,iEAAiE,iCAAmB;AACpF,iFAAiF,iCAAmB;AACpG,0EAA0E,iCAAmB;AAC7F,uEAAuE,iCAAmB;AAC1F,iEAAiE,iCAAmB;AACpF,kEAAkE,iCAAmB;AACrF,gEAAgE,iCAAmB;AACnF,gEAAgE,iCAAmB;AACnF,uFAAuF,iCAAmB;AAC1G,4EAA4E,iCAAmB;AAC/F,sEAAsE,iCAAmB;AACzF,mEAAmE,iCAAmB;AACtF,mEAAmE,iCAAmB;AACtF,mEAAmE,iCAAmB;AACtF,mEAAmE,iCAAmB;AACtF,qEAAqE,iCAAmB;AACxF,6EAA6E,iCAAmB;AAChG,uFAAuF,iCAAmB;AAC1G,sEAAsE,iCAAmB;AACzF,4EAA4E,iCAAmB;AAC/F,0EAA0E,iCAAmB;AAC7F,kFAAkF,iCAAmB;AACrG,iEAAiE,iCAAmB;AACpF,2EAA2E,iCAAmB;AAC9F,oEAAoE,iCAAmB;;;;;;;AAOvF;;;;;;;;;;;;;;;;;;;;;;;AAuBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oDAAoD;AACrD;AACA;AACA;AACA,QAAQ,iBAAiB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA;AACA;AACA,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA;AACA;AACA,oBAAoB,gBAAgB,kBAAkB,2BAA2B;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,sBAAsB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,uBAAuB;AAClE;AACA,qDAAqD,uBAAuB;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,0CAA0C,0BAA0B,cAAc,oBAAoB,eAAe,kBAAkB,kBAAkB;AAChN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wGAAwG,wBAAwB;AAChI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,uGAAuG;AACtH;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,qFAAqF,UAAU;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oHAAoH,+CAA+C;AACnK;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,QAAQ;AACxB,cAAc,+BAA+B;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,6BAA6B;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oHAAoH,+CAA+C;AACnK;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,gBAAgB,QAAQ,sBAAsB;AAC7D,8CAA8C,sBAAsB;AACpE;AACA;AACA;AACA;AACA;AACA,kBAAkB,gBAAgB,UAAU,sBAAsB;AAClE,iDAAiD,sBAAsB;AACvE;AACA;AACA;AACA;AACA;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,oBAAoB;AACnD,uCAAuC,gCAAgC;AACvE,mCAAmC,iCAAiC;AACpE;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,gCAAgC;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,gCAAgC;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,kCAAkC;AAC9E,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,mBAAmB,WAAW,iBAAiB,aAAa,eAAe,MAAM,iBAAiB;AAC9H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,gBAAgB,uDAAuD;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,mEAAmE,iCAAmB;;;AAGtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,0EAA0E,iCAAmB;AAC7F,wEAAwE,iCAAmB;AAC3F,mEAAmE,iCAAmB;AACtF,yEAAyE,iCAAmB;AAC5F,kEAAkE,iCAAmB;;;;;;AAMrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,0CAA0C;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6EAA6E,+DAA+D;AAC5I;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mEAAmE,iCAAmB;AACtF,yEAAyE,iCAAmB;AAC5F,gEAAgE,iCAAmB;AACnF,sEAAsE,iCAAmB;AACzF,mEAAmE,iCAAmB;AACtF,kEAAkE,iCAAmB;;;;;;;;AAQrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,QAAQ;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,oCAAoC;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,IAAI;AAChB;AACA;AACA;AACA,oGAAoG,qBAAqB;AACzH;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,yBAAyB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,QAAQ;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,sBAAsB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,uBAAuB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE,IAAI;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D,IAAI;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE,IAAI;AACtE;AACA;AACA;AACA;AACA;AACA,wGAAwG,IAAI;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0GAA0G,IAAI;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,mEAAmE,iCAAmB;;;AAGtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,oCAAoC;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,oCAAoC;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,6CAA6C;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,oCAAoC;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,QAAQ;AACvD;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yEAAyE,iCAAmB;;AAE5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,kEAAkE,iCAAmB;;;AAGrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,kEAAkE,iCAAmB;;AAErF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gCAAgC;AACjC;AACA,iBAAiB,iBAAiB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,mEAAmE,iCAAmB;;;AAGtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,QAAQ;AACtD;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yEAAyE,iCAAmB;;AAE5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,sEAAsE,iCAAmB;AACzF,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;;;;;;AAM1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mEAAmE,iCAAmB;AACtF,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,+DAA+D,iCAAmB;AAClF,kEAAkE,iCAAmB;AACrF,sEAAsE,iCAAmB;AACzF,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,+DAA+D,iCAAmB;AAClF,kEAAkE,iCAAmB;AACrF,wFAAwF,iCAAmB;AAC3G,qFAAqF,iCAAmB;;;;;;;;;;;;;;;;AAgBxG,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,kBAAkB;AAC9C;AACA;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gCAAgC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,mBAAmB;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE,mBAAmB;AACrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,mBAAmB,oDAAoD,kBAAkB;AACvH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,mBAAmB,oDAAoD,kBAAkB;AACrH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,iBAAiB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,iBAAiB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,0BAA0B;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,0BAA0B;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,0BAA0B;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,0BAA0B;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,eAAe,GAAG,eAAe,OAAO,iBAAiB;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,gBAAgB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,gBAAgB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,gBAAgB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,gBAAgB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,gBAAgB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,gBAAgB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA,6FAA6F,iBAAiB;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+EAA+E,iBAAiB;AAChG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gFAAgF,iBAAiB;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA,sBAAsB;AACtB,iEAAiE,iCAAmB;AACpF,kEAAkE,iCAAmB;AACrF,mEAAmE,iCAAmB;AACtF,sEAAsE,iCAAmB;;;;;AAKzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gDAAgD;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,8CAA8C;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,2BAA2B,IAAI;AACvE;AACA,kCAAkC,qBAAqB,OAAO;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,MAAM;AACpD;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,qBAAqB;AACxD,qBAAqB;AACrB;AACA;AACA;AACA,wDAAwD,IAAI;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gGAAgG,0BAA0B;AAC1H;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,SAAS;AACT;AACA;AACA,kBAAkB,oBAAoB,QAAQ,sBAAsB;AACpE;AACA;AACA;AACA,wDAAwD,IAAI;AAC5D;AACA;AACA;AACA;AACA,WAAW,qCAAqC,uBAAuB;AACvE,WAAW,0BAA0B;AACrC,WAAW,WAAW;AACtB,WAAW;AACX;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,gGAAgG;AAChH;AACA;AACA;AACA,oBAAoB,0BAA0B;AAC9C;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,gGAAgG,EAAE,IAAI,EAAE;AACxG;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,sCAAsC;AAClD,QAAQ,8BAA8B;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,iCAAiC,qBAAqB,gBAAgB;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,mDAAmD;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,0DAA0D;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;;AAEnF;AACA,aAAa,kBAAkB,yDAAyD,kCAAkC;AAC1H;AACA,QAAQ,iBAAiB;AACzB,WAAW,mCAAmC;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,mEAAmE,iCAAmB;AACtF,gEAAgE,iCAAmB;;;AAGnF;AACA,aAAa,kBAAkB,4BAA4B;AAC3D;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mHAAmH;AACnH,kGAAkG;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,mEAAmE,iCAAmB;;AAEtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,qEAAqE,iCAAmB;AACxF,6EAA6E,iCAAmB;AAChG,oEAAoE,iCAAmB;;;;;AAKvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,wDAAwD;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,iEAAiE;AACvG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,oGAAoG;AACpH;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,oBAAoB;AACpB;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,sEAAsE,iCAAmB;AACzF,yEAAyE,iCAAmB;AAC5F,qEAAqE,iCAAmB;AACxF,+DAA+D,iCAAmB;AAClF,qEAAqE,iCAAmB;AACxF,kEAAkE,iCAAmB;AACrF,oEAAoE,iCAAmB;AACvF,wEAAwE,iCAAmB;AAC3F,wEAAwE,iCAAmB;AAC3F,sFAAsF,iCAAmB;AACzG,wFAAwF,iCAAmB;AAC3G,kGAAkG,iCAAmB;AACrH,wFAAwF,iCAAmB;AAC3G,gGAAgG,iCAAmB;AACnH,0FAA0F,iCAAmB;AAC7G,mEAAmE,iCAAmB;AACtF,mEAAmE,iCAAmB;AACtF,mEAAmE,iCAAmB;AACtF,8FAA8F,iCAAmB;AACjH,iEAAiE,iCAAmB;AACpF,8FAA8F,iCAAmB;AACjH,8FAA8F,iCAAmB;AACjH,+DAA+D,iCAAmB;;;;;;;;;;AAUlF;;;;;;;;;;;;;;;AAeA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,wDAAwD;AAC1G,kJAAkJ,gBAAgB;AAClK,mKAAmK,gBAAgB;AACnL,oKAAoK,gBAAgB;AACpL,mJAAmJ,gBAAgB;AACnK;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,iEAAiE;AACvG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,2OAA2O;AAC3P;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,IAAI;AAChB;AACA,mFAAmF;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,aAAa;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,cAAc;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,oBAAoB;AACpB;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gFAAgF,mCAAmC;AACnH;AACA;AACA;AACA;AACA,gBAAgB,+BAA+B;AAC/C;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,4BAA4B;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,kCAAkC;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,gCAAgC,yBAAyB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iCAAiC;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,qEAAqE,iCAAmB;AACxF,6EAA6E,iCAAmB;AAChG,uFAAuF,iCAAmB;AAC1G,2EAA2E,iCAAmB;AAC9F,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;AAC1F,mFAAmF,iCAAmB;AACtG,mFAAmF,iCAAmB;;;;;;;;;;;AAWtG;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,oEAAoE,iCAAmB;AACvF,qEAAqE,iCAAmB;AACxF,wEAAwE,iCAAmB;;;;;AAK3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,4EAA4E,iCAAmB;AAC/F,+DAA+D,iCAAmB;;;AAGlF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,mEAAmE,iCAAmB;AACtF,8EAA8E,iCAAmB;AACjG,qEAAqE,iCAAmB;AACxF,kEAAkE,iCAAmB;AACrF,uFAAuF,iCAAmB;AAC1G,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,oEAAoE,iCAAmB;AACvF,qFAAqF,iCAAmB;AACxG,qFAAqF,iCAAmB;AACxG,YAAY,QAAQ;AACpB,YAAY,sBAAsB;;;;;;;;;;;;AAYlC;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA,kEAAkE,EAAE,KAAK;AACzE;AACA;AACA,0EAA0E,EAAE,KAAK;AACjF;AACA,wEAAwE,EAAE,OAAO;AACjF,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sGAAsG;AACtG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,oEAAoE,iCAAmB;AACvF,mEAAmE,iCAAmB;AACtF,8EAA8E,iCAAmB;AACjG,qEAAqE,iCAAmB;AACxF,mEAAmE,iCAAmB;AACtF,wFAAwF,iCAAmB;AAC3G,2EAA2E,iCAAmB;AAC9F,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;AAC1F,oEAAoE,iCAAmB;AACvF,kFAAkF,iCAAmB;AACrG,kFAAkF,iCAAmB;;;;;;;;;;;;;;;AAerG;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA,iEAAiE,EAAE,KAAK;AACxE;AACA;AACA,yEAAyE,EAAE,KAAK;AAChF;AACA,wGAAwG;AACxG,wEAAwE,EAAE,OAAO;AACjF,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sGAAsG;AACtG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,0EAA0E,iCAAmB;AAC7F,4EAA4E,iCAAmB;AAC/F,0DAA0D,iCAAmB;AAC7E,0DAA0D,iCAAmB;AAC7E,0DAA0D,iCAAmB;AAC7E,6EAA6E,iCAAmB;;;;;;AAMhG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,mEAAmE,iCAAmB;AACtF,6EAA6E,iCAAmB;AAChG,qEAAqE,iCAAmB;AACxF,kEAAkE,iCAAmB;AACrF,2EAA2E,iCAAmB;AAC9F,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;;;;;;;;;AAS1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,uFAAuF,iCAAmB;AAC1G,kEAAkE,iCAAmB;AACrF,qEAAqE,iCAAmB;AACxF,mEAAmE,iCAAmB;AACtF,kEAAkE,iCAAmB;;;;;;;AAOrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,qEAAqE;AACrF;AACA;AACA;AACA;AACA;AACA,oCAAoC,MAAM;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,MAAM;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,uBAAuB,kCAAkC,UAAU;AAC7H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,aAAa,cAAc,WAAW;AAC3F;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,WAAW;AAC/C;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,8EAA8E,iCAAmB;AACjG,gFAAgF,iCAAmB;AACnG,qEAAqE,iCAAmB;AACxF,+DAA+D,iCAAmB;AAClF,qEAAqE,iCAAmB;AACxF,kEAAkE,iCAAmB;AACrF,mEAAmE,iCAAmB;AACtF,6EAA6E,iCAAmB;;;;;;;;;;AAUhG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,2EAA2E,iCAAmB;AAC9F,6EAA6E,iCAAmB;AAChG,uFAAuF,iCAAmB;AAC1G,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;AAC1F,6EAA6E,iCAAmB;;;;;;;;AAQhG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,0DAA0D,iCAAmB;;AAE7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oEAAoE;AACpE;AACA;AACA;AACA;AACA,mGAAmG,eAAe,oBAAoB,cAAc;AACpJ;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,qEAAqE,iCAAmB;AACxF,6EAA6E,iCAAmB;AAChG,uFAAuF,iCAAmB;AAC1G,2EAA2E,iCAAmB;AAC9F,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;AAC1F,sFAAsF,iCAAmB;AACzG,sFAAsF,iCAAmB;;;;;;;;;;;AAWzG;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,uEAAuE,iCAAmB;;AAE1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,4EAA4E,iCAAmB;AAC/F,8EAA8E,iCAAmB;AACjG,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;;;;;;AAM1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,0DAA0D,iCAAmB;AAC7E,oEAAoE,iCAAmB;;;AAGvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,6DAA6D;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,iBAAiB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,iBAAiB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,gBAAgB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,gBAAgB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,iBAAiB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,iBAAiB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wEAAwE,YAAY,GAAG,KAAK;AAC5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,YAAY,GAAG,MAAM;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,YAAY,GAAG,KAAK;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,8BAA8B;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,OAAO;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,UAAU,aAAa,UAAU,EAAE,+CAA+C;AAC/H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C,0BAA0B,MAAM,IAAI,SAAS,EAAE,yCAAyC;AACxF;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,+DAA+D,kCAAmB;AAClF,yEAAyE,kCAAmB;;;AAG5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,mEAAmE,kCAAmB;AACtF,kEAAkE,kCAAmB;;;;AAIrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE,MAAM;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,oBAAoB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,sBAAsB,IAAI;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,qBAAqB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,YAAY;AAClE,oBAAoB,gCAAgC,GAAG,gCAAgC;AACvF;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,YAAY;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yEAAyE;AACzE;AACA;AACA,2BAA2B;AAC3B;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,4EAA4E,kCAAmB;AAC/F,yEAAyE,kCAAmB;;;AAG5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uBAAuB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,0DAA0D,kCAAmB;AAC7E,oEAAoE,kCAAmB;;;AAGvF;AACA,wDAAwD,sBAAsB;AAC9E;AACA;AACA,4DAA4D,sBAAsB;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,yDAAyD;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,cAAc,OAAO,aAAa;AAC1F,mEAAmE,0BAA0B;AAC7F;AACA;AACA,8DAA8D,cAAc,OAAO,aAAa;AAChG;AACA,qFAAqF,aAAa;AAClG;AACA,4DAA4D,aAAa;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,gFAAgF,aAAa,IAAI,aAAa;AAC9G,8DAA8D,YAAY,MAAM,0BAA0B;AAC1G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,oBAAoB;AAChF,qBAAqB,qCAAqC;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,UAAU;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,UAAU;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,wBAAwB,YAAY;AACpC;AACA,kDAAkD,EAAE,KAAK;AACzD;AACA;AACA,0DAA0D,EAAE,KAAK;AACjE;AACA,2DAA2D;AAC3D,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,kCAAmB;;AAElF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,gCAAgC,uBAAuB;AACvD;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,wBAAwB;AACxD;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,gBAAgB,4BAA4B;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gBAAgB,kBAAkB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,OAAO;AACpD,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yFAAyF,kCAAmB;;AAE5G;AACA;AACA;AACA,wDAAwD,2BAA2B,IAAI;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,wCAAwC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yEAAyE,kCAAmB;AAC5F,+DAA+D,kCAAmB;AAClF,oEAAoE,kCAAmB;AACvF,iEAAiE,kCAAmB;AACpF,mEAAmE,kCAAmB;AACtF,0EAA0E,kCAAmB;AAC7F,mEAAmE,kCAAmB;;;;;;;;AAQtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA,wBAAwB;AACxB;AACA,2DAA2D,iCAAiC;AAC5F;AACA,kFAAkF;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,kBAAkB,YAAY,EAAE,yBAAyB,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY;AAChG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,0EAA0E,kCAAmB;;;AAG7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE,kBAAkB;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4BAA4B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,8BAA8B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD;AACA,gEAAgE;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,8BAA8B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,8BAA8B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,8BAA8B;;;AAG/B,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+EAA+E,kCAAmB;AAClG,+DAA+D,kCAAmB;AAClF,uEAAuE,kCAAmB;AAC1F,+FAA+F,kCAAmB;;;;;AAKlH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,kCAAkC;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,gCAAgC;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,+EAA+E,kCAAmB;AAClG,oEAAoE,kCAAmB;AACvF,4EAA4E,kCAAmB;;;;;AAK/F;AACA,qFAAqF,kCAAkC;AACvH,IAAI,gBAAgB,GAAG,mBAAmB,GAAG,uBAAuB,GAAG,gBAAgB,GAAG,mBAAmB,GAAG,gBAAgB,OAAO,kBAAkB;AACzJ,IAAI,kBAAkB;AACtB;AACA,yDAAyD,6BAA6B;AACtF,qEAAqE,2BAA2B,KAAK;AACrG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8FAA8F;AAC9F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,6BAA6B;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,iEAAiE,kCAAmB;AACpF,yEAAyE,kCAAmB;AAC5F,yFAAyF,kCAAmB;AAC5G,kEAAkE,kCAAmB;AACrF,2EAA2E,kCAAmB;AAC9F,+EAA+E,kCAAmB;AAClG,gFAAgF,kCAAmB;AACnG,gEAAgE,kCAAmB;AACnF,8DAA8D,kCAAmB;;;;;;;;;;;AAWjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA,gBAAgB,2IAA2I;AAC3J;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,kBAAkB;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,eAAe,yDAAyD,+DAA+D;AACpL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,iEAAiE,kCAAmB;AACpF,mEAAmE,kCAAmB;AACtF,yEAAyE,kCAAmB;AAC5F,kEAAkE,kCAAmB;;;;;;AAMrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kCAAkC;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wHAAwH,uBAAuB;AAC/I;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,2EAA2E,kCAAmB;AAC9F,qEAAqE,kCAAmB;AACxF,6GAA6G,kCAAmB;AAChI,+EAA+E,kCAAmB;AAClG,gFAAgF,kCAAmB;AACnG,uEAAuE,kCAAmB;AAC1F,2EAA2E,kCAAmB;AAC9F,0EAA0E,kCAAmB;AAC7F,kFAAkF,kCAAmB;AACrG,mEAAmE,kCAAmB;AACtF,gEAAgE,kCAAmB;AACnF,wEAAwE,kCAAmB;AAC3F,iFAAiF,kCAAmB;AACpG,kEAAkE,kCAAmB;;;;;;;;;;;;;;AAcrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,gDAAgD;AACrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,4EAA4E,kCAAmB;AAC/F,gEAAgE,kCAAmB;AACnF,kEAAkE,kCAAmB;AACrF,mEAAmE,kCAAmB;AACtF,qEAAqE,kCAAmB;AACxF,yFAAyF,kCAAmB;AAC5G,kEAAkE,kCAAmB;;;;;;;;AAQrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,iCAAiC,IAAI,uBAAuB;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,cAAc;AACjH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,6CAA6C,uBAAuB;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,UAAU,gBAAgB,cAAc;AAClG;AACA;AACA,yFAAyF;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+EAA+E,kCAAmB;AAClG,+DAA+D,kCAAmB;AAClF,iEAAiE,kCAAmB;;;;AAIpF;AACA;AACA;AACA;AACA;AACA,gBAAgB,+BAA+B;AAC/C;AACA;AACA;AACA;AACA;AACA,gBAAgB,gBAAgB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,iEAAiE,kCAAmB;AACpF,kEAAkE,kCAAmB;AACrF,qEAAqE,kCAAmB;;;;AAIxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4CAA4C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,eAAe;AACvC,4BAA4B,eAAe;AAC3C,sBAAsB,yBAAyB;AAC/C;AACA;AACA,mBAAmB,yBAAyB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,qBAAqB;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,2EAA2E,kCAAmB;AAC9F,gEAAgE,kCAAmB;AACnF,6GAA6G,kCAAmB;AAChI,sFAAsF,kCAAmB;AACzG,2EAA2E,kCAAmB;AAC9F,qEAAqE,kCAAmB;AACxF,0EAA0E,kCAAmB;AAC7F,+EAA+E,kCAAmB;;;;;;;;;AASlG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gCAAgC;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yFAAyF,kCAAmB;AAC5G,qEAAqE,kCAAmB;;;AAGxF;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,mEAAmE,kCAAmB;AACtF,qEAAqE,kCAAmB;AACxF,gEAAgE,kCAAmB;;;;AAInF;AACA,cAAc,kBAAkB,uCAAuC;AACvE;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA,CAAC,gDAAgD;;;AAGjD,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,mFAAmF,kCAAmB;AACtG,4EAA4E,kCAAmB;AAC/F,sEAAsE,kCAAmB;;;;AAIzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,wEAAwE,kCAAmB;AAC3F,+EAA+E,kCAAmB;AAClG,+EAA+E,kCAAmB;;;;;AAKlG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,IAAI;AAChB;AACA;AACA,oDAAoD,eAAe;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iEAAiE,kCAAmB;AACpF,+DAA+D,kCAAmB;AAClF,qEAAqE,kCAAmB;AACxF,+EAA+E,kCAAmB;AAClG,oEAAoE,kCAAmB;AACvF,mEAAmE,kCAAmB;;;;;;;AAOtF;AACA;AACA,IAAI,kCAAkC;AACtC;AACA,oCAAoC,yBAAyB;AAC7D;AACA;AACA;AACA;AACA,iEAAiE,YAAY,yBAAyB;AACtG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,uBAAuB,aAAa,uBAAuB;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;;AAEnF;AACA,gBAAgB,kBAAkB,+BAA+B;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iEAAiE,kCAAmB;AACpF,kEAAkE,kCAAmB;;;AAGrF;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,gBAAgB;AAChC,uFAAuF;AACvF,mFAAmF;AACnF;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,2CAA2C;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,gBAAgB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,oBAAoB;AAC9C,wBAAwB,kBAAkB;AAC1C;AACA,SAAS;AACT;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,kEAAkE,kCAAmB;AACrF,iEAAiE,kCAAmB;AACpF,+EAA+E,kCAAmB;;;;;AAKlG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,sEAAsE;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,mCAAmC;AACrE;AACA;AACA;AACA;AACA;AACA,0EAA0E,OAAO,4BAA4B,SAAS;AACtH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,OAAO,cAAc,YAAY;AAC/G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;AACnF,qEAAqE,kCAAmB;;;AAGxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,sCAAsC,iCAAiC,sBAAsB;AACzG;AACA;AACA;AACA;AACA,gBAAgB,yBAAyB;AACzC;AACA;AACA;AACA;AACA;AACA,gHAAgH,iBAAiB;AACjI;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE,EAAE,IAAI,EAAE,QAAQ,GAAG,0BAA0B,kBAAkB;AAClI;AACA;AACA,mEAAmE,EAAE,IAAI,EAAE,QAAQ,GAAG,0BAA0B,eAAe;AAC/H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,EAAE,IAAI,EAAE;AAC3D;AACA;AACA;AACA,kDAAkD,sBAAsB;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE,EAAE,IAAI,EAAE,QAAQ,GAAG,0BAA0B,kBAAkB;AAClI;AACA;AACA,mEAAmE,EAAE,IAAI,EAAE,QAAQ,GAAG,0BAA0B,eAAe;AAC/H;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,EAAE,IAAI,EAAE;AAC3D;AACA;AACA,mDAAmD,qBAAqB;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,iCAAiC,SAAS;AAC1C;AACA;AACA,qCAAqC,sBAAsB;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,eAAe,gDAAgD,aAAa,yBAAyB;AACrH,iCAAiC;AACjC,iCAAiC;AACjC,wBAAwB,UAAU;AAClC,4BAA4B,UAAU;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,gCAAgC;AAChC,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iEAAiE,kCAAmB;AACpF,+DAA+D,kCAAmB;AAClF,8DAA8D,kCAAmB;;;;AAIjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,gBAAgB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,gBAAgB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;AACnF,mEAAmE,kCAAmB;AACtF,qEAAqE,kCAAmB;AACxF,oEAAoE,kCAAmB;AACvF,qEAAqE,kCAAmB;;;;;;AAMxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,uBAAuB;AACzD;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,+CAA+C;AAC/C,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,qEAAqE,kCAAmB;AACxF,gEAAgE,kCAAmB;AACnF,kEAAkE,kCAAmB;;;;;AAKrF;AACA;AACA;AACA;AACA;AACA,wBAAwB,8CAA8C;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,sBAAsB;AAChD;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gBAAgB,qCAAqC,IAAI;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,wEAAwE,kCAAmB;;AAE3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,sCAAsC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,iEAAiE,kCAAmB;AACpF,gEAAgE,kCAAmB;AACnF,qEAAqE,kCAAmB;AACxF,uEAAuE,kCAAmB;AAC1F,qEAAqE,kCAAmB;AACxF,mEAAmE,kCAAmB;AACtF,8DAA8D,kCAAmB;AACjF,2EAA2E,kCAAmB;AAC9F,gFAAgF,kCAAmB;AACnG,wEAAwE,kCAAmB;AAC3F,0EAA0E,kCAAmB;AAC7F,4EAA4E,kCAAmB;AAC/F,iEAAiE,kCAAmB;AACpF,iEAAiE,kCAAmB;AACpF,oEAAoE,kCAAmB;AACvF,kEAAkE,kCAAmB;AACrF,+DAA+D,kCAAmB;AAClF,qEAAqE,kCAAmB;AACxF,+DAA+D,kCAAmB;AAClF,oEAAoE,kCAAmB;AACvF,qEAAqE,kCAAmB;AACxF,iEAAiE,kCAAmB;AACpF,oEAAoE,kCAAmB;AACvF,sEAAsE,kCAAmB;AACzF,yEAAyE,kCAAmB;AAC5F,2FAA2F,kCAAmB;AAC9G,mGAAmG,kCAAmB;AACtH,gGAAgG,kCAAmB;AACnH,sGAAsG,kCAAmB;AACzH,6EAA6E,kCAAmB;AAChG,qFAAqF,kCAAmB;AACxG,2FAA2F,kCAAmB;AAC9G,oGAAoG,kCAAmB;AACvH,iFAAiF,kCAAmB;AACpG,oEAAoE,kCAAmB;AACvF,mEAAmE,kCAAmB;AACtF,yEAAyE,kCAAmB;AAC5F,gFAAgF,kCAAmB;AACnG,gFAAgF,kCAAmB;AACnG,oFAAoF,kCAAmB;AACvG,2EAA2E,kCAAmB;AAC9F,gEAAgE,kCAAmB;AACnF,6EAA6E,kCAAmB;AAChG;;;;;;;;AAQA;;;;;;AAMA;;;;;;;;;;;;;;;;;AAiBA;;;AAGA;;;;;;;;AAQA;;;;;;;AAOA;;AAEA;;;;;AAKA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA,aAAa;AACb;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;AACnF,sEAAsE,kCAAmB;;;AAGzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,qBAAqB;AACjF;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA,6DAA6D,SAAS;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,SAAS;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,SAAS;AACvD;AACA;AACA;AACA;AACA,2CAA2C,SAAS;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oEAAoE;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,+BAA+B;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,0BAA0B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oBAAoB;;;AAGrB,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iEAAiE,kCAAmB;AACpF,qEAAqE,kCAAmB;AACxF,kEAAkE,kCAAmB;AACrF,8EAA8E,kCAAmB;;;;;AAKjG;AACA;AACA;AACA,gBAAgB,yCAAyC;AACzD;AACA;AACA;AACA,6BAA6B,iBAAiB;AAC9C,6BAA6B,iBAAiB;AAC9C;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C,8CAA8C;AAC9C,4CAA4C;AAC5C,8CAA8C;AAC9C;AACA,+BAA+B,SAAS;AACxC,+BAA+B,SAAS;AACxC,+BAA+B,SAAS;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,gEAAgE,kCAAmB;AACnF,qEAAqE,kCAAmB;AACxF,sEAAsE,kCAAmB;;;;;AAKzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oBAAoB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB,gBAAgB,kBAAkB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kDAAkD;;;AAGnD,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,sEAAsE,kCAAmB;AACzF,iFAAiF,kCAAmB;;;;AAIpG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,sCAAsC;;;AAGvC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yFAAyF,kCAAmB;;AAE5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;AACnF,iFAAiF,kCAAmB;AACpG,qEAAqE,kCAAmB;AACxF,sEAAsE,kCAAmB;AACzF,qEAAqE,kCAAmB;AACxF,4EAA4E,kCAAmB;AAC/F,wEAAwE,kCAAmB;AAC3F,wEAAwE,kCAAmB;AAC3F,8EAA8E,kCAAmB;AACjG,uEAAuE,kCAAmB;AAC1F,oEAAoE,kCAAmB;AACvF,qEAAqE,kCAAmB;AACxF,qEAAqE,kCAAmB;AACxF,sEAAsE,kCAAmB;;;;;;;;;;;;;;;AAezF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE,SAAS;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,8BAA8B;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,yEAAyE,kCAAmB;;AAE5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,8BAA8B;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oCAAoC;;;AAGrC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+EAA+E,kCAAmB;AAClG,+EAA+E,kCAAmB;AAClG,+EAA+E,kCAAmB;AAClG,oFAAoF,kCAAmB;AACvG,0EAA0E,kCAAmB;AAC7F,0EAA0E,kCAAmB;AAC7F,4FAA4F,kCAAmB;AAC/G,yFAAyF,kCAAmB;;;;;;;AAO5G;AACA;AACA;AACA;AACA,0DAA0D,0BAA0B;AACpF,QAAQ,kBAAkB;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA,uHAAuH,WAAW;AAClI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,qBAAqB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA,8BAA8B,sBAAsB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kCAAkC;;;AAGnC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA,CAAC,wCAAwC;;;AAGzC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,6EAA6E,kCAAmB;AAChG,yEAAyE,kCAAmB;;;;;;;;;;AAU5F,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,uEAAuE,kCAAmB;AAC1F,kEAAkE,kCAAmB;AACrF,uEAAuE,kCAAmB;AAC1F,+DAA+D,kCAAmB;;;;;;AAMlF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,qBAAqB,2BAA2B,wBAAwB;AACpF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4EAA4E,4BAA4B;AACxG,gBAAgB,qDAAqD,IAAI;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,aAAa;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,uBAAuB;AACtC;AACA;AACA;AACA,eAAe,iBAAiB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,cAAc;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,YAAY;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;AACnF,8DAA8D,kCAAmB;AACjF,gEAAgE,kCAAmB;;;;AAInF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,WAAW;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,gBAAgB;AACpE,oDAAoD,gBAAgB;AACpE,oDAAoD,gBAAgB;AACpE,oDAAoD,gBAAgB;AACpE,0DAA0D,UAAU;AACpE,0DAA0D,UAAU;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,cAAc;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG,cAAc,EAAE,cAAc,EAAE,aAAa;AAChD,GAAG,cAAc,EAAE,cAAc,EAAE,aAAa;AAChD;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,8DAA8D,kCAAmB;;AAEjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,OAAO;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,WAAW;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C,4BAA4B,uBAAuB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA,6EAA6E;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gCAAgC;;;AAGjC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;AACnF,qEAAqE,kCAAmB;AACxF,gEAAgE,kCAAmB;AACnF,uEAAuE,kCAAmB;AAC1F,mEAAmE,kCAAmB;AACtF,qEAAqE,kCAAmB;AACxF,gEAAgE,kCAAmB;AACnF,4EAA4E,kCAAmB;AAC/F,sEAAsE,kCAAmB;AACzF,oEAAoE,kCAAmB;AACvF,8DAA8D,kCAAmB;AACjF,+DAA+D,kCAAmB;AAClF,uEAAuE,kCAAmB;AAC1F,+DAA+D,kCAAmB;AAClF,wEAAwE,kCAAmB;;;;;;;;;;;;;;;;;;AAkB3F,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,uEAAuE,kCAAmB;AAC1F,8DAA8D,kCAAmB;;;AAGjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,8DAA8D,kCAAmB;AACjF,gEAAgE,kCAAmB;;;;AAInF;AACA;AACA;AACA;AACA,CAAC,0CAA0C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,WAAW;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc;AACjE,GAAG,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc;AACjE,GAAG,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,cAAc;AAClE,GAAG,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,cAAc;AAClE;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oCAAoC;;;AAGrC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,uEAAuE,kCAAmB;AAC1F,8DAA8D,kCAAmB;AACjF,gEAAgE,kCAAmB;AACnF,qEAAqE,kCAAmB;AACxF,sEAAsE,kCAAmB;;;;;;AAMzF;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,4BAA4B,UAAU;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,4BAA4B,UAAU;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,uEAAuE,kCAAmB;AAC1F,8DAA8D,kCAAmB;;;AAGjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8FAA8F,mBAAmB;AACjH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6EAA6E;AAC7E,iCAAiC,uBAAuB;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,sBAAsB,IAAI,sBAAsB;AACvE;AACA,mBAAmB,OAAO,IAAI,OAAO;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kCAAkC;;;AAGnC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,kCAAmB;AAClF,qEAAqE,kCAAmB;AACxF,mEAAmE,kCAAmB;AACtF,6EAA6E,kCAAmB;AAChG,oFAAoF,kCAAmB;AACvG,qEAAqE,kCAAmB;AACxF,qEAAqE,kCAAmB;AACxF,8DAA8D,kCAAmB;;;;;;;;;AASjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,wEAAwE,GAAG;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,0FAA0F,IAAI;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,mEAAmE,kCAAmB;AACtF,mEAAmE,kCAAmB;AACtF,qEAAqE,kCAAmB;AACxF,qEAAqE,kCAAmB;AACxF,qEAAqE,kCAAmB;;;;;;AAMxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,cAAc;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,QAAQ;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yGAAyG,SAAS;AAClH,2GAA2G,SAAS;AACpH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,kCAAmB;AAClF,qEAAqE,kCAAmB;AACxF,qEAAqE,kCAAmB;AACxF,iFAAiF,kCAAmB;AACpG,mEAAmE,kCAAmB;AACtF,qEAAqE,kCAAmB;AACxF,mEAAmE,kCAAmB;AACtF,yEAAyE,kCAAmB;;;;;;;;;AAS5F;AACA;AACA;AACA,WAAW,gBAAgB;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,gIAAgI;AAChJ;AACA,uJAAuJ;AACvJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA,wEAAwE,sBAAsB,IAAI;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,4EAA4E,IAAI;AAChG,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kCAAkC;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,+BAA+B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,+DAA+D,kCAAmB;AAClF,qEAAqE,kCAAmB;AACxF,6GAA6G,kCAAmB;AAChI,oFAAoF,kCAAmB;AACvG,sFAAsF,kCAAmB;AACzG,+EAA+E,kCAAmB;AAClG,mEAAmE,kCAAmB;AACtF,+EAA+E,kCAAmB;AAClG,8EAA8E,kCAAmB;;;;;;;;;;AAUjG;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA,gBAAgB,uBAAuB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,QAAQ;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+FAA+F,4CAA4C;AAC3I;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,mCAAmC;AAC3C;AACA;AACA;AACA;AACA,QAAQ,kCAAkC;AAC1C;AACA;AACA;AACA,CAAC,8CAA8C;;;AAG/C,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,mEAAmE,kCAAmB;AACtF,yEAAyE,kCAAmB;AAC5F,4EAA4E,kCAAmB;AAC/F,6EAA6E,kCAAmB;;;;;;;;AAQhG,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,uEAAuE,kCAAmB;AAC1F,kEAAkE,kCAAmB;;;AAGrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,wBAAwB,IAAI;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,IAAI;AACjE;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,UAAU,gBAAgB,cAAc;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,aAAa;AACpC;AACA;AACA,sEAAsE,mDAAmD;AACzH;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,8EAA8E,kCAAmB;AACjG,4EAA4E,kCAAmB;AAC/F,8EAA8E,kCAAmB;;;;;AAKjG;AACA,QAAQ,kBAAkB;AAC1B,IAAI,kBAAkB,OAAO,mBAAmB,mCAAmC;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF,SAAS;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,oBAAoB,QAAQ;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,OAAO;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,OAAO;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,wBAAwB,UAAU;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,eAAe;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,aAAa;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;AACA,oDAAoD,aAAa;AACjE;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D;AAC/D,yDAAyD;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,UAAU;AAC7C,oDAAoD,cAAc;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,6BAA6B;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,MAAM,IAAI,MAAM,IAAI,MAAM;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,qEAAqE,kCAAmB;AACxF,6DAA6D,kCAAmB;AAChF,8DAA8D,kCAAmB;;;;;;;AAOjF,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,sEAAsE,kCAAmB;;;AAGzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,mBAAmB;AAC3B,6DAA6D,mBAAmB;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yGAAyG,UAAU;AACnH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,SAAS;AACT;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA,sBAAsB;AACtB,+DAA+D,kCAAmB;AAClF,sEAAsE,kCAAmB;AACzF,0EAA0E,kCAAmB;;;;;;AAM7F,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,wFAAwF,kCAAmB;AAC3G,kEAAkE,kCAAmB;AACrF,0EAA0E,kCAAmB;AAC7F,sEAAsE,kCAAmB;AACzF,4EAA4E,kCAAmB;AAC/F,oEAAoE,kCAAmB;AACvF,kEAAkE,kCAAmB;AACrF,sEAAsE,kCAAmB;;;;;;;;;AASzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,gBAAgB;AACxB,mDAAmD,gBAAgB,OAAO;AAC1E,sCAAsC,iBAAiB;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,WAAW;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,gBAAgB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,2EAA2E,kCAAmB;AAC9F,mEAAmE,kCAAmB;AACtF,sEAAsE,kCAAmB;AACzF,qEAAqE,kCAAmB;;;;;AAKxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,MAAM;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,+BAA+B,IAAI;AACnC;AACA;AACA;AACA;AACA;AACA,uDAAuD;AACvD;AACA;AACA;AACA,qBAAqB;AACrB;AACA,iBAAiB;AACjB;AACA,gCAAgC,2BAA2B;AAC3D;AACA;AACA,qBAAqB;AACrB;AACA,iBAAiB;AACjB;AACA,gCAAgC,MAAM;AACtC;AACA;AACA;AACA,qBAAqB;AACrB;AACA,iBAAiB;AACjB;AACA,gCAAgC,MAAM;AACtC;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,sBAAsB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA,sBAAsB;AACtB,wEAAwE,kCAAmB;AAC3F,iEAAiE,kCAAmB;AACpF,kEAAkE,kCAAmB;AACrF,gEAAgE,kCAAmB;AACnF,iEAAiE,kCAAmB;AACpF,gEAAgE,kCAAmB;AACnF,+DAA+D,kCAAmB;AAClF,oEAAoE,kCAAmB;AACvF,iEAAiE,kCAAmB;AACpF,uFAAuF,kCAAmB;AAC1G,qFAAqF,kCAAmB;AACxG,iFAAiF,kCAAmB;AACpG,oFAAoF,kCAAmB;AACvG,uFAAuF,kCAAmB;AAC1G,kFAAkF,kCAAmB;AACrG,4EAA4E,kCAAmB;AAC/F,8EAA8E,kCAAmB;AACjG,+EAA+E,kCAAmB;AAClG,wFAAwF,kCAAmB;AAC3G,mFAAmF,kCAAmB;AACtG,gFAAgF,kCAAmB;AACnG,sEAAsE,kCAAmB;AACzF,0EAA0E,kCAAmB;AAC7F,6EAA6E,kCAAmB;AAChG,iFAAiF,kCAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BpG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,2BAA2B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,YAAY,iBAAiB;AAC7B;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,oCAAoC;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,eAAe;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wGAAwG,IAAI;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yGAAyG,IAAI;AAC7G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sGAAsG,IAAI;AAC1G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uGAAuG,IAAI;AAC3G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,gBAAgB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kFAAkF,kFAAkF;AACpK;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E,sIAAsI;AAChN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,sBAAsB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,uBAAuB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,oBAAoB;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,qBAAqB;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE,gBAAgB;AACtF;AACA;AACA;AACA;AACA;AACA;AACA,qFAAqF,kFAAkF;AACvK;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,SAAS;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,gBAAgB;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4EAA4E,gBAAgB;AAC5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,gBAAgB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,iBAAiB,mCAAmC,gBAAgB;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oFAAoF,gBAAgB;AACpG;AACA;AACA;AACA;AACA,yCAAyC,gBAAgB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,QAAQ;AACvD;AACA;AACA,6CAA6C,QAAQ;AACrD;AACA;AACA;AACA;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,gBAAgB;AAClC,uCAAuC,sBAAsB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,eAAe;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA,4BAA4B,2BAA2B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,kEAAkE,kCAAmB;AACrF,yEAAyE,kCAAmB;AAC5F,mEAAmE,kCAAmB;AACtF,wGAAwG,kCAAmB;AAC3H,2GAA2G,kCAAmB;AAC9H,sEAAsE,kCAAmB;;;;;;;;AAQzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oGAAoG;AACpG;AACA;AACA;AACA;AACA;AACA,qGAAqG;AACrG;AACA;AACA;AACA;AACA;AACA,uDAAuD,sBAAsB;AAC7E;AACA;AACA,YAAY,6BAA6B;AACzC;AACA;AACA;AACA;AACA,uDAAuD,mBAAmB;AAC1E;AACA;AACA,YAAY,6BAA6B;AACzC;AACA;AACA;AACA;AACA,gCAAgC,8BAA8B;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6EAA6E;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kCAAkC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,uFAAuF;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+FAA+F,wBAAwB;AACvH;AACA;AACA,6FAA6F,YAAY;AACzG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,8EAA8E,sBAAsB,GAAG,uBAAuB,qBAAqB,gBAAgB;AACnK;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,eAAe;AAClH;AACA;AACA;AACA,sEAAsE,gBAAgB;AACtF,8CAA8C,gBAAgB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,8BAA8B,8BAA8B;AACzF,qDAAqD,gBAAgB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,4CAA4C,KAAK,8BAA8B,MAAM,4BAA4B;AAC/I;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,oCAAoC;AACpD;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,+DAA+D,kCAAmB;AAClF,6GAA6G,kCAAmB;AAChI,iFAAiF,kCAAmB;AACpG,0EAA0E,kCAAmB;;;;;;AAM7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,gBAAgB;AAC3B;AACA;AACA;AACA;AACA;AACA,gBAAgB,WAAW;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yFAAyF,kCAAmB;;AAE5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,sFAAsF,kCAAmB;AACzG,6GAA6G,kCAAmB;AAChI,kFAAkF,kCAAmB;AACrG,+EAA+E,kCAAmB;;;;;AAKlG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gCAAgC;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,iFAAiF,kCAAmB;AACpG,+EAA+E,kCAAmB;AAClG,qFAAqF,kCAAmB;AACxG,iFAAiF,kCAAmB;AACpG,gGAAgG,kCAAmB;AACnH,qEAAqE,kCAAmB;AACxF,6GAA6G,kCAAmB;AAChI,sFAAsF,kCAAmB;AACzG,kEAAkE,kCAAmB;AACrF,mEAAmE,kCAAmB;AACtF,kFAAkF,kCAAmB;AACrG,iFAAiF,kCAAmB;AACpG,sEAAsE,kCAAmB;AACzF,gGAAgG,kCAAmB;;;;;;;;;;;;;;AAcnH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,qBAAqB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,wBAAwB;AACnE;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,8GAA8G;AAC9H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,YAAY;AACpC,4BAA4B,WAAW;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sHAAsH;AACtH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,wBAAwB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,wBAAwB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,2GAA2G;AAC3H,gBAAgB,sDAAsD;AACtE;AACA;AACA;AACA,4BAA4B,mBAAmB;AAC/C;AACA;AACA;AACA;AACA,4BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,4DAA4D;AACzH;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,gFAAgF,kCAAmB;AACnG,qEAAqE,kCAAmB;AACxF,kEAAkE,kCAAmB;AACrF,sFAAsF,kCAAmB;AACzG,6GAA6G,kCAAmB;AAChI,iFAAiF,kCAAmB;AACpG,iFAAiF,kCAAmB;AACpG,oFAAoF,kCAAmB;AACvG,kEAAkE,kCAAmB;AACrF,mEAAmE,kCAAmB;AACtF,0GAA0G,kCAAmB;AAC7H,sFAAsF,kCAAmB;AACzG,yFAAyF,kCAAmB;AAC5G,iEAAiE,kCAAmB;AACpF,sEAAsE,kCAAmB;AACzF,2EAA2E,kCAAmB;AAC9F,oEAAoE,kCAAmB;AACvF,iFAAiF,kCAAmB;AACpG,gGAAgG,kCAAmB;;;;;;;;;;;;;;;;;;;AAmBnH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C,4BAA4B,eAAe;AAC3C;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,QAAQ;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA,4BAA4B,eAAe;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,eAAe;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,eAAe;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,eAAe;AACnC;AACA;AACA;AACA,gBAAgB,OAAO;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,eAAe;AAChD,qCAAqC,eAAe;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,eAAe;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0GAA0G;AAC1G;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA,mEAAmE,6BAA6B;AAChG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,4IAA4I;AAC5J,gBAAgB,sDAAsD;AACtE;AACA;AACA;AACA;AACA,4BAA4B,mBAAmB;AAC/C;AACA;AACA;AACA,4BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,4DAA4D;AACrH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,uBAAuB;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,iBAAiB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,kBAAkB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,eAAe;AACrD;AACA,kCAAkC,qBAAqB;AACvD;AACA,sBAAsB,qBAAqB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,iEAAiE,kCAAmB;AACpF,sEAAsE,kCAAmB;AACzF,kFAAkF,kCAAmB;AACrG,+EAA+E,kCAAmB;;;;;;;AAOlG,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,qEAAqE,kCAAmB;;;AAGxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;AACnF,iFAAiF,kCAAmB;AACpG,+DAA+D,kCAAmB;AAClF,sEAAsE,kCAAmB;;;;;AAKzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,0BAA0B;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,YAAY;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,iBAAiB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,0CAA0C,iBAAiB;AAC3D;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA,QAAQ,IAAI;AACZ;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,6DAA6D,kCAAmB;;;AAGhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,QAAQ;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,wBAAwB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iEAAiE,kCAAmB;AACpF,gEAAgE,kCAAmB;AACnF,6DAA6D,kCAAmB;;;;AAIhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG;AACnG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E,IAAI;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,cAAc;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA,KAAK;AACL;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,+DAA+D,kCAAmB;AAClF,6DAA6D,kCAAmB;;;AAGhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,kBAAkB,EAAE,mCAAmC,EAAE,yBAAyB;AACrH,2BAA2B,iBAAiB,sBAAsB,gBAAgB;AAClF,+CAA+C,yBAAyB;AACxE;AACA;AACA;AACA;AACA,sCAAsC,gBAAgB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6DAA6D,kCAAmB;;AAEhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,oCAAoC;AAC9E;AACA;AACA;AACA,uCAAuC;AACvC,8CAA8C;AAC9C,gDAAgD;AAChD;AACA;AACA,uCAAuC;AACvC,8CAA8C;AAC9C,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,+DAA+D,kCAAmB;;AAElF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,uBAAuB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,gBAAgB;AACtC,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;;AAExF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;AAGD,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,8DAA8D,kCAAmB;AACjF,6DAA6D,kCAAmB;AAChF,oEAAoE,kCAAmB;AACvF,yEAAyE,kCAAmB;AAC5F,kEAAkE,kCAAmB;;;;;;;;;AASrF,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,+DAA+D,kCAAmB;AAClF;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4BAA4B;AAC7B;AACA;AACA,oCAAoC,0BAA0B,KAAK,wBAAwB;AAC3F,gBAAgB,mBAAmB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,mBAAmB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,yBAAyB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,yBAAyB;AAClE;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,wBAAwB;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,wBAAwB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,wBAAwB;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,wBAAwB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,yBAAyB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,yBAAyB;AAClE;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,yBAAyB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,yBAAyB;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA,wBAAwB,yBAAyB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;;AAErF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,YAAY;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6DAA6D,kCAAmB;;AAEhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE,WAAW,0DAA0D,gBAAgB;AACtJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0GAA0G,6CAA6C;AACvJ;AACA;AACA;AACA;AACA;AACA,mIAAmI,0DAA0D;AAC7L;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;;AAExF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,gEAAgE,kCAAmB;;;AAGnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,WAAW;AACvD;AACA;AACA;AACA;AACA,wCAAwC,oBAAoB;AAC5D;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,sFAAsF,kCAAmB;AACzG,6DAA6D,kCAAmB;;;AAGhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,aAAa;AACb;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,+DAA+D,kCAAmB;AAClF,4DAA4D,kCAAmB;AAC/E,gEAAgE,kCAAmB;AACnF,0EAA0E,kCAAmB;AAC7F,gEAAgE,kCAAmB;AACnF,+DAA+D,kCAAmB;AAClF,oEAAoE,kCAAmB;AACvF,gEAAgE,kCAAmB;AACnF,qEAAqE,kCAAmB;AACxF,uEAAuE,kCAAmB;AAC1F,6EAA6E,kCAAmB;AAChG,iEAAiE,kCAAmB;AACpF,gEAAgE,kCAAmB;AACnF,8EAA8E,kCAAmB;AACjG,0EAA0E,kCAAmB;AAC7F,gEAAgE,kCAAmB;AACnF,wEAAwE,kCAAmB;AAC3F,gEAAgE,kCAAmB;AACnF,kEAAkE,kCAAmB;AACrF,wEAAwE,kCAAmB;AAC3F,wEAAwE,kCAAmB;AAC3F,0EAA0E,kCAAmB;AAC7F,2EAA2E,kCAAmB;AAC9F,0EAA0E,kCAAmB;AAC7F,sFAAsF,kCAAmB;AACzG,yEAAyE,kCAAmB;AAC5F,gEAAgE,kCAAmB;AACnF,yEAAyE,kCAAmB;AAC5F,2EAA2E,kCAAmB;AAC9F,6EAA6E,kCAAmB;AAChG,+EAA+E,kCAAmB;AAClG,8EAA8E,kCAAmB;AACjG,oFAAoF,kCAAmB;AACvG,qFAAqF,kCAAmB;AACxG,mFAAmF,kCAAmB;AACtG,iFAAiF,kCAAmB;AACpG,8EAA8E,kCAAmB;AACjG,4EAA4E,kCAAmB;AAC/F,6EAA6E,kCAAmB;AAChG,wEAAwE,kCAAmB;AAC3F,yEAAyE,kCAAmB;AAC5F,0EAA0E,kCAAmB;AAC7F,4EAA4E,kCAAmB;AAC/F,qEAAqE,kCAAmB;AACxF,uEAAuE,kCAAmB;AAC1F,0EAA0E,kCAAmB;AAC7F,wEAAwE,kCAAmB;AAC3F,+EAA+E,kCAAmB;AAClG,0EAA0E,kCAAmB;AAC7F,mEAAmE,kCAAmB;AACtF,oEAAoE,kCAAmB;AACvF,mEAAmE,kCAAmB;AACtF,qEAAqE,kCAAmB;AACxF,wEAAwE,kCAAmB;AAC3F,uEAAuE,kCAAmB;AAC1F,4EAA4E,kCAAmB;AAC/F,sEAAsE,kCAAmB;AACzF,yEAAyE,kCAAmB;AAC5F,yEAAyE,kCAAmB;AAC5F,sEAAsE,kCAAmB;AACzF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA;;;;;;;;;;;;;;;;;;AAkBA;;;;;;;;;;;;;;;;;;;AAmBA;AACA;AACA,YAAY;AACZ;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iFAAiF;;AAEjF,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iFAAiF;;AAEjF,OAAO;;AAEP,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,kBAAkB,kCAAmB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE,kCAAmB;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,kCAAmB;AAC7B;AACA;AACA;AACA,WAAW,kCAAmB,aAAa,WAAW;AACtD;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU,kCAAmB;AAC7B;AACA,eAAe,kCAAmB,wBAAwB,kCAAmB;AAC7E,mDAAmD,wCAAwC;AAC3F;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU,kCAAmB;AAC7B,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU,kCAAmB;AAC7B;AACA,iEAAiE,iBAAiB;AAClF;AACA,0DAA0D,aAAa;AACvE;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,0BAAmB,GAAG,kCAAmB;AACtD,sDAAsD,0BAAmB;AACzE,gDAAgD,0BAAmB;AACnE,8CAA8C,0BAAmB;AACjE,iDAAiD,0BAAmB;AACpE,mDAAmD,0BAAmB;AACtE,mDAAmD,0BAAmB;AACtE,gDAAgD,0BAAmB;AACnE,gDAAgD,0BAAmB;AACnE,wCAAwC,0BAAmB;AAC3D,8CAA8C,0BAAmB;AACjE,2CAA2C,0BAAmB;AAC9D,iDAAiD,0BAAmB;AACpE,+CAA+C,0BAAmB;AAClE,4CAA4C,0BAAmB;AAC/D,qDAAqD,0BAAmB;AACxE,kDAAkD,0BAAmB;AACrE,oDAAoD,0BAAmB;AACvE,+CAA+C,0BAAmB;AAClE,sDAAsD,0BAAmB;AACzE,uCAAuC,0BAAmB;AAC1D,uCAAuC,0BAAmB;AAC1D,4CAA4C,0BAAmB;AAC/D,8CAA8C,0BAAmB;AACjE,wCAAwC,0BAAmB;AAC3D,gDAAgD,0BAAmB;AACnE,8CAA8C,0BAAmB;AACjE,mDAAmD,0BAAmB;AACtE,gDAAgD,0BAAmB;AACnE,0CAA0C,0BAAmB;AAC7D,yCAAyC,0BAAmB;AAC5D,+CAA+C,0BAAmB;AAClE,yCAAyC,0BAAmB;AAC5D,yCAAyC,0BAAmB;AAC5D,iDAAiD,0BAAmB;AACpE,wCAAwC,0BAAmB;AAC3D,uDAAuD,0BAAmB;AAC1E,2CAA2C,0BAAmB;AAC9D,oDAAoD,0BAAmB;AACvE,mDAAmD,0BAAmB;AACtE,oDAAoD,0BAAmB;AACvE,iDAAiD,0BAAmB;AACpE,wDAAwD,0BAAmB;AAC3E,qDAAqD,0BAAmB;AACxE,0DAA0D,0BAAmB;AAC7E,yDAAyD,0BAAmB;AAC5E,sDAAsD,0BAAmB;AACzE,kDAAkD,0BAAmB;AACrE,gDAAgD,0BAAmB;AACnE,wCAAwC,0BAAmB;AAC3D,kDAAkD,0BAAmB;AACrE,qDAAqD,0BAAmB;AACxE,8DAA8D,0BAAmB;AACjF,4CAA4C,0BAAmB;AAC/D,oDAAoD,0BAAmB;AACvE,kDAAkD,0BAAmB;AACrE,yDAAyD,0BAAmB;AAC5E,kDAAkD,0BAAmB;AACrE,mDAAmD,0BAAmB;AACtE,oDAAoD,0BAAmB;AACvE,6CAA6C,0BAAmB;AAChE,4CAA4C,0BAAmB;AAC/D,0CAA0C,0BAAmB;AAC7D,0CAA0C,0BAAmB;AAC7D,kDAAkD,0BAAmB;AACrE,wCAAwC,0BAAmB;AAC3D,8CAA8C,0BAAmB;AACjE,yDAAyD,0BAAmB;AAC5E,8CAA8C,0BAAmB;AACjE,4CAA4C,0BAAmB;AAC/D,0DAA0D,0BAAmB;AAC7E,kEAAkE,0BAAmB;AACrF,gDAAgD,0BAAmB;AACnE,yDAAyD,0BAAmB;AAC5E,kDAAkD,0BAAmB;AACrE,wCAAwC,0BAAmB;AAC3D,2CAA2C,0BAAmB;AAC9D,sCAAsC,0BAAmB;AACzD,4CAA4C,0BAAmB;AAC/D,2CAA2C,0BAAmB;AAC9D,iDAAiD,0BAAmB;AACpE,8CAA8C,0BAAmB;AACjE,8CAA8C,0BAAmB;AACjE,gEAAgE,0BAAmB;AACnF,6CAA6C,0BAAmB;AAChE,yCAAyC,0BAAmB;AAC5D,yCAAyC,0BAAmB;AAC5D,kDAAkD,0BAAmB;AACrE,+CAA+C,0BAAmB;AAClE,yDAAyD,0BAAmB;AAC5E,8CAA8C,0BAAmB;AACjE,yCAAyC,0BAAmB;AAC5D,+CAA+C,0BAAmB;AAClE,oDAAoD,0BAAmB;AACvE,qDAAqD,0BAAmB;AACxE,yCAAyC,0BAAmB;AAC5D,+CAA+C,0BAAmB;AAClE,gDAAgD,0BAAmB;AACnE,+CAA+C,0BAAmB;AAClE,6CAA6C,0BAAmB;AAChE,yCAAyC,0BAAmB;AAC5D,6CAA6C,0BAAmB;AAChE,mEAAmE,0BAAmB;AACtF,gEAAgE,0BAAmB;AACnF,mDAAmD,0BAAmB;AACtE,oDAAoD,0BAAmB;AACvE,uCAAuC,0BAAmB;AAC1D,4CAA4C,0BAAmB;AAC/D,wCAAwC,0BAAmB;AAC3D,wCAAwC,0BAAmB;AAC3D,yCAAyC,0BAAmB;AAC5D,uCAAuC,0BAAmB;AAC1D,4CAA4C,0BAAmB;AAC/D,6CAA6C,0BAAmB;AAChE,4CAA4C,0BAAmB;AAC/D,2CAA2C,0BAAmB;AAC9D,6CAA6C,0BAAmB;AAChE,6CAA6C,0BAAmB;AAChE,yCAAyC,0BAAmB;AAC5D,4CAA4C,0BAAmB;AAC/D,iDAAiD,0BAAmB;AACpE,gDAAgD,0BAAmB;AACnE,0CAA0C,0BAAmB;AAC7D,mDAAmD,0BAAmB;AACtE,qDAAqD,0BAAmB;AACxE,sDAAsD,0BAAmB;AACzE,yDAAyD,0BAAmB;AAC5E,2CAA2C,0BAAmB;AAC9D,mDAAmD,0BAAmB;AACtE,sCAAsC,0BAAmB;AACzD,4CAA4C,0BAAmB;AAC/D,oDAAoD,0BAAmB;AACvE,qDAAqD,0BAAmB;AACxE,sDAAsD,0BAAmB;AACzE,0CAA0C,0BAAmB;AAC7D,oDAAoD,0BAAmB;AACvE,gDAAgD,0BAAmB;AACnE,iDAAiD,0BAAmB;AACpE,oDAAoD,0BAAmB;AACvE,+CAA+C,0BAAmB;AAClE,gDAAgD,0BAAmB;AACnE,8CAA8C,0BAAmB;AACjE,kDAAkD,0BAAmB;AACrE,iDAAiD,0BAAmB;AACpE,8CAA8C,0BAAmB;AACjE,gEAAgE,0BAAmB;AACnF,gDAAgD,0BAAmB;AACnE,kDAAkD,0BAAmB;AACrE,4CAA4C,0BAAmB;AAC/D,8CAA8C,0BAAmB;AACjE,2DAA2D,0BAAmB;AAC9E,wDAAwD,0BAAmB;AAC3E,+CAA+C,0BAAmB;AAClE,gDAAgD,0BAAmB;AACnE,2CAA2C,0BAAmB;AAC9D,2CAA2C,0BAAmB;AAC9D,uCAAuC,0BAAmB;AAC1D,4CAA4C,0BAAmB;AAC/D,wCAAwC,0BAAmB;AAC3D,4DAA4D,0BAAmB;AAC/E,uCAAuC,0BAAmB;AAC1D,8CAA8C,0BAAmB;AACjE,yCAAyC,0BAAmB;AAC5D,+CAA+C,0BAAmB;AAClE,gEAAgE,0BAAmB;AACnF,4DAA4D,0BAAmB;AAC/E,2CAA2C,0BAAmB;AAC9D,yCAAyC,0BAAmB;AAC5D,2CAA2C,0BAAmB;AAC9D,yCAAyC,0BAAmB;AAC5D,kDAAkD,0BAAmB;AACrE,6CAA6C,0BAAmB;AAChE,uCAAuC,0BAAmB;AAC1D,kDAAkD,0BAAmB;AACrE,+CAA+C,0BAAmB;AAClE,yCAAyC,0BAAmB;AAC5D,oDAAoD,0BAAmB;AACvE,yCAAyC,0BAAmB;AAC5D,oDAAoD,0BAAmB;AACvE,sDAAsD,0BAAmB;AACzE,mDAAmD,0BAAmB;AACtE,4DAA4D,0BAAmB;AAC/E,4CAA4C,0BAAmB;AAC/D,mDAAmD,0BAAmB;AACtE,uCAAuC,0BAAmB;AAC1D,6CAA6C,0BAAmB;AAChE,kDAAkD,0BAAmB;AACrE,uCAAuC,0BAAmB;AAC1D,oDAAoD,0BAAmB;AACvE,kDAAkD,0BAAmB;AACrE,2CAA2C,0BAAmB;AAC9D,kDAAkD,0BAAmB;AACrE,mDAAmD,0BAAmB;AACtE,oDAAoD,0BAAmB;AACvE,+CAA+C,0BAAmB;AAClE,+CAA+C,0BAAmB;AAClE,qDAAqD,0BAAmB;AACxE,gDAAgD,0BAAmB;AACnE,mDAAmD,0BAAmB;AACtE,+CAA+C,0BAAmB;AAClE,uDAAuD,0BAAmB;AAC1E,+CAA+C,0BAAmB;AAClE,gDAAgD,0BAAmB;AACnE,8CAA8C,0BAAmB;AACjE,0CAA0C,0BAAmB;AAC7D,kDAAkD,0BAAmB;AACrE,uCAAuC,0BAAmB;AAC1D,qDAAqD,0BAAmB;AACxE,qDAAqD,0BAAmB;AACxE,gDAAgD,0BAAmB;AACnE,iDAAiD,0BAAmB;AACpE,gDAAgD,0BAAmB;AACnE,yDAAyD,0BAAmB;AAC5E,kDAAkD,0BAAmB;AACrE,oDAAoD,0BAAmB;AACvE,oDAAoD,0BAAmB;AACvE,+CAA+C,0BAAmB;AAClE,gDAAgD,0BAAmB;AACnE,+CAA+C,0BAAmB;AAClE,+CAA+C,0BAAmB;AAClE,wDAAwD,0BAAmB;AAC3E,iDAAiD,0BAAmB;AACpE,6CAA6C,0BAAmB;AAChE,kDAAkD,0BAAmB;AACrE,2CAA2C,0BAAmB;AAC9D,wCAAwC,0BAAmB;AAC3D,+CAA+C,0BAAmB;AAClE,4DAA4D,0BAAmB;AAC/E,yCAAyC,0BAAmB;AAC5D,yCAAyC,0BAAmB;AAC5D,sCAAsC,0BAAmB;AACzD,kDAAkD,0BAAmB;AACrE,4CAA4C,0BAAmB;AAC/D,8CAA8C,0BAAmB;AACjE,mDAAmD,0BAAmB;AACtE,yCAAyC,0BAAmB;AAC5D,gDAAgD,0BAAmB;AACnE,6CAA6C,0BAAmB;AAChE,2CAA2C,0BAAmB;AAC9D,iDAAiD,0BAAmB;AACpE,2CAA2C,0BAAmB;AAC9D,sDAAsD,0BAAmB;AACzE,2CAA2C,0BAAmB;AAC9D,sDAAsD,0BAAmB;AACzE,+CAA+C,0BAAmB;AAClE,0CAA0C,0BAAmB;AAC7D,qDAAqD,0BAAmB;AACxE,0CAA0C,0BAAmB;AAC7D,qDAAqD,0BAAmB;AACxE,wCAAwC,0BAAmB;AAC3D,8CAA8C,0BAAmB;AACjE,yCAAyC,0BAAmB;AAC5D,iDAAiD,0BAAmB;AACpE,gDAAgD,0BAAmB;AACnE,+CAA+C,0BAAmB;AAClE,+CAA+C,0BAAmB;AAClE,uDAAuD,0BAAmB;AAC1E,4CAA4C,0BAAmB;AAC/D,iDAAiD,0BAAmB;AACpE,iDAAiD,0BAAmB;AACpE,yCAAyC,0BAAmB;AAC5D,wCAAwC,0BAAmB;AAC3D,uCAAuC,0BAAmB;AAC1D,wCAAwC,0BAAmB;AAC3D,iDAAiD,0BAAmB;AACpE,wCAAwC,0BAAmB;AAC3D,8CAA8C,0BAAmB;AACjE,iDAAiD,0BAAmB;AACpE,mEAAmE,0BAAmB;AACtF,2DAA2D,0BAAmB;AAC9E,yCAAyC,0BAAmB;AAC5D,6CAA6C,0BAAmB;AAChE,8CAA8C,0BAAmB;AACjE,gDAAgD,0BAAmB;AACnE,+CAA+C,0BAAmB;AAClE,oDAAoD,0BAAmB;AACvE,yCAAyC,0BAAmB;AAC5D,yCAAyC,0BAAmB;AAC5D,gDAAgD,0BAAmB;AACnE,iDAAiD,0BAAmB;AACpE,6CAA6C,0BAAmB;AAChE,2CAA2C,0BAAmB;AAC9D,4CAA4C,0BAAmB;AAC/D,uCAAuC,0BAAmB;AAC1D,4CAA4C,0BAAmB;AAC/D,gDAAgD,0BAAmB;AACnE,uCAAuC,0BAAmB;AAC1D,0CAA0C,0BAAmB;AAC7D,gDAAgD,0BAAmB;AACnE,iDAAiD,0BAAmB;AACpE,8CAA8C,0BAAmB;AACjE,wCAAwC,0BAAmB;AAC3D,0CAA0C,0BAAmB;AAC7D,4CAA4C,0BAAmB;AAC/D,qDAAqD,0BAAmB;AACxE,6CAA6C,0BAAmB;AAChE,2CAA2C,0BAAmB;AAC9D,0CAA0C,0BAAmB;AAC7D,gDAAgD,0BAAmB;AACnE,wCAAwC,0BAAmB;AAC3D,uCAAuC,0BAAmB;AAC1D,yCAAyC,0BAAmB;AAC5D,6CAA6C,0BAAmB;AAChE,+CAA+C,0BAAmB;AAClE,+CAA+C,0BAAmB;AAClE,gDAAgD,0BAAmB;AACnE,+CAA+C,0BAAmB;AAClE,2CAA2C,0BAAmB;AAC9D,mDAAmD,0BAAmB;AACtE,iDAAiD,0BAAmB;AACpE,6CAA6C,0BAAmB;AAChE,wCAAwC,0BAAmB;AAC3D,qDAAqD,0BAAmB;AACxE,yCAAyC,0BAAmB;AAC5D,oDAAoD,0BAAmB;AACvE,wCAAwC,0BAAmB;AAC3D,4CAA4C,0BAAmB;AAC/D,2CAA2C,0BAAmB;AAC9D,uCAAuC,0BAAmB;AAC1D,0DAA0D,0BAAmB;AAC7E,kDAAkD,0BAAmB;AACrE,2CAA2C,0BAAmB;AAC9D,kDAAkD,0BAAmB;AACrE,kDAAkD,0BAAmB;AACrE,iDAAiD,0BAAmB;AACpE,8CAA8C,0BAAmB;AACjE,8CAA8C,0BAAmB;AACjE,6CAA6C,0BAAmB;AAChE,0CAA0C,0BAAmB;AAC7D,iDAAiD,0BAAmB;AACpE,iDAAiD,0BAAmB;AACpE,gDAAgD,0BAAmB;AACnE,6CAA6C,0BAAmB;AAChE,8CAA8C,0BAAmB;AACjE,oDAAoD,0BAAmB;AACvE,0CAA0C,0BAAmB;AAC7D,mDAAmD,0BAAmB;AACtE,kDAAkD,0BAAmB;AACrE,sDAAsD,0BAAmB;AACzE,kDAAkD,0BAAmB;AACrE,kDAAkD,0BAAmB;AACrE,qDAAqD,0BAAmB;AACxE,oDAAoD,0BAAmB;AACvE,oDAAoD,0BAAmB;AACvE,mDAAmD,0BAAmB;AACtE,mDAAmD,0BAAmB;AACtE,qDAAqD,0BAAmB;AACxE,kDAAkD,0BAAmB;AACrE,sDAAsD,0BAAmB;AACzE,uCAAuC,0BAAmB;AAC1D,4CAA4C,0BAAmB;AAC/D,6CAA6C,0BAAmB;AAChE,8CAA8C,0BAAmB;AACjE,+CAA+C,0BAAmB;AAClE,2CAA2C,0BAAmB;AAC9D,sDAAsD,0BAAmB;AACzE,qDAAqD,0BAAmB;AACxE,mDAAmD,0BAAmB;AACtE,gDAAgD,0BAAmB;AACnE,mDAAmD,0BAAmB;AACtE,wCAAwC,0BAAmB;AAC3D,wCAAwC,0BAAmB;AAC3D,8CAA8C,0BAAmB;AACjE,uDAAuD,0BAAmB;AAC1E,uCAAuC,0BAAmB;AAC1D,4CAA4C,0BAAmB;AAC/D,4CAA4C,0BAAmB;AAC/D,sCAAsC,0BAAmB;AACzD,wCAAwC,0BAAmB;AAC3D,SAAi5jB;AACj5jB;;AAEA;;;;;;;;;;;;;;;;;ACv4xCgE;AACjB;AAExC,MAAM,SAAS,GAAG;IACrB,kBAAkB,EAAE,IAAI,kDAAW,CAAC,qFAAqF,CAAC;IAC1H,YAAY,EAAE,IAAI,yDAAY,CAAC,wCAAwC,EAAE;QACrE,wBAAwB,EAAE,IAAI;QAC9B,qBAAqB,EAAE,IAAI;KAC9B,CAAC;IACF,YAAY,EAAE,IAAI,yDAAY,CAAC,0BAA0B,EAAE;QACvD,qBAAqB,EAAE,IAAI;KAC9B,CAAC;IACF,gBAAgB,EAAE,IAAI,yDAAY,CAAC,oBAAoB,EAAE;QACrD,qBAAqB,EAAE,IAAI;KAC9B,CAAC;CACI,CAAC;AAGJ,MAAM,MAAM,GAAG,IAAI,6CAAM,EAAE,CAAC;AACnC,KAAK,IAAI,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;IAC5C,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;AACjC,CAAC;;;;;;;;;;;;;;;;ACrBsD;AAKhD,MAAM,WAAW;IAMpB,YAAY,KAAY,EAAkB,SAA4B,EAAU,QAAsB,EAAkB,KAAa;;QAA3F,cAAS,GAAT,SAAS,CAAmB;QAAU,aAAQ,GAAR,QAAQ,CAAc;QAAkB,UAAK,GAAL,KAAK,CAAQ;QAH9H,aAAQ,GAAa,EAAE,CAAC;QACxB,iBAAY,GAAG,IAAI,GAAG,EAA8B,CAAC;QACrD,iBAAY,GAAG,IAAI,GAAG,EAA8B,CAAC;QAExD,IAAI,CAAC,QAAQ,GAAG,8CAAG,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACpE,IAAI,CAAC,MAAM,GAAG,8CAAG,CAAC,SAAS,CAAC,gBAAgB,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC1E,IAAI,SAAS,CAAC,eAAe,EAAE,CAAC;YAC5B,KAAK,IAAI,MAAM,IAAI,SAAS,CAAC,eAAe,EAAE,CAAC;gBAC3C,MAAM,cAAc,GAAG,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;oBACnE,OAAO,CAAC,CAAC,UAAU,KAAK,MAAM,CAAC,YAAY;gBAC/C,CAAC,CAAC,CAAC;gBAEH,IAAI,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;oBAC9C,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;oBAC5D,IAAI,OAAO,EAAE,CAAC;wBACV,MAAM,SAAS,GAAG,OAAO,CAAC;4BACtB,IAAI,EAAE,MAAM,CAAC,YAAY;4BACzB,QAAQ,EAAE,8CAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;4BAC7E,MAAM;4BACN,UAAU,EAAE,cAAc;4BAC1B,KAAK,EAAE,IAAI;yBACd,CAAC,CAAC;wBACH,IAAI,SAAS,EAAE,CAAC;4BACZ,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;4BAC9B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;4BACzC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;wBAC7C,CAAC;oBACL,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACJ,MAAM,KAAK,GAAG,IAAI,4CAAK,CAAC;wBACpB,IAAI,EAAE,MAAM,CAAC,YAAY;wBACzB,GAAG,EAAE,8CAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;wBACxE,KAAK,EAAE,MAAM,CAAC,KAAK;wBACnB,MAAM,EAAE,MAAM,CAAC,MAAM;wBACrB,MAAM,EAAE,8CAAG,CAAC,oBAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,MAAM,mCAAI,CAAC,EAAE,oBAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,MAAM,mCAAI,CAAC,CAAC;wBACrE,CAAC,EAAE,KAAK;qBACX,CAAC,CAAC;oBACH,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;wBAChB,MAAM,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;wBAC3D,IAAI,EAAE,EAAE,CAAC;4BACL,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;4BAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;4BAC/D,MAAM,MAAM,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;4BAC5D,IAAI,MAAM,EAAE,CAAC;gCACT,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;4BAC/B,CAAC;wBACL,CAAC;oBACL,CAAC;oBACD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAC1B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;oBACrC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBACzC,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAED,YAAY;QACR,KAAK,IAAI,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,CAAC;YAChD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YAEjE,IAAI,CAAC,OAAO,EAAE,CAAC;gBAAC,SAAQ;YAAC,CAAC;YAE1B,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;gBACxE,OAAO,CAAC,CAAC,UAAU,KAAK,MAAM,CAAC,YAAY;YAC/C,CAAC,CAAC,CAAC;YAEH,MAAM,SAAS,GAAG,OAAO,CAAC;gBACtB,IAAI,EAAE,MAAM,CAAC,YAAY;gBACzB,QAAQ,EAAE,8CAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC7E,MAAM;gBACN,UAAU,EAAE,cAAc;gBAC1B,KAAK,EAAE,IAAI;aACd,CAAC,CAAC;YAEH,IAAI,SAAS,EAAE,CAAC;gBACZ,uFAAuF;gBACvF,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAClD,IAAI,WAAW,EAAE,CAAC;oBACd,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;oBACjD,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;wBACb,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;wBAC/B,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;wBACjC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;oBAC1C,CAAC;gBACL,CAAC;gBAED,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC9B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;gBACzC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAC7C,CAAC;QACL,CAAC;IACL,CAAC;IAGD,uBAAuB,CAAC,UAAkB;QACtC,MAAM,YAAY,GAAG,IAAI,CAAC,2BAA2B,CAAC,UAAU,CAAC,CAAC;QAClE,IAAI,OAAO,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAC9B,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAChD,IAAI,WAAW,EAAE,CAAC;gBACd,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC9B,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,kBAAkB,CAAC,eAAuB,EAAE,KAAW;QACnD,MAAM,YAAY,GAAG,IAAI,CAAC,sBAAsB,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;QACzE,IAAI,OAAO,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAC9B,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAChD,IAAI,WAAW,EAAE,CAAC;gBACd,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC9B,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;;OAIG;IACH,2BAA2B,CAAC,UAAkB;QAC1C,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,iBAAiB,EAAE,KAAK,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;IACvH,CAAC;IAED;;;;OAIG;IACH,sBAAsB,CAAC,eAAuB,EAAE,KAAW;QACvD,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;YAC7C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACtB,IAAI,eAAe,GAAG,KAAK,CAAC;gBAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;oBAC5B,eAAe,GAAG,KAAK,CAAC,iBAAiB,EAAE,CAAC;gBAChD,CAAC;gBAED,MAAM,KAAK,GAAG,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,iBAAiB,EAAE,KAAK,eAAe,CAAC,iBAAiB,EAAE,CAAC,CAAC;gBACrH,IAAI,KAAK,EAAE,CAAC;oBACR,OAAO,KAAK,CAAC,OAAO,KAAK,eAAe,CAAC;gBAC7C,CAAC;gBACD,OAAO,KAAK,CAAC;YACjB,CAAC;iBAAM,CAAC;gBACJ,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,iBAAiB,EAAE,KAAK,eAAe,CAAC,iBAAiB,EAAE,CAAC,CAAC;YACpH,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;CACJ;;;;;;;;;;;;;;;AC1JM,MAAM,WAAW,GAAe,KAAK,EAAE,IAAY,EAAE,WAA2B,EAAE,EAAE;IACxF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,QAAO,WAAW,CAAC,WAAW,EAAE,EAAE,CAAC;QAChC,KAAK,KAAK,CAAC,CAAC,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACzC,KAAK,MAAM,CAAC,CAAC,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC1C,OAAO,CAAC,CAAC,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACzC,CAAC;AACJ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACV+B;AACD;AACD;AACE;AACC;AACT;AACO;AACH;AACC;AACH;AACF;;;;;;;;;;;;;;;;ACX4C;AAM7D,MAAM,YAAY;IAQrB,YAAY,KAAY,EAAE,SAA4B,EAAE,QAAsB,EAAkB,KAAa;;QAAb,UAAK,GAAL,KAAK,CAAQ;QACzG,IAAI,CAAC,QAAQ,GAAG,8CAAG,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACpE,IAAI,CAAC,MAAM,GAAG,8CAAG,CAAC,SAAS,CAAC,gBAAgB,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC1E,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,IAAI,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;YAEjE,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC;YAC9B,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC;YACjC,IAAI,CAAC,OAAO,GAAG,IAAI,8CAAO,CAAC;gBACvB,IAAI,EAAE,SAAS,CAAC,YAAY;gBAC5B,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;gBACnC,SAAS,EAAE,SAAS,CAAC,UAAU;gBAC/B,UAAU,EAAE,SAAS,CAAC,UAAU;gBAChC,IAAI;gBACJ,OAAO;aACV,CAAC,CAAC;YACH,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC;YACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,wDAAiB,CAAC,CAAC;YACrD,QAAQ,CAAC,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC;YAEvC,4BAA4B;YAC5B,MAAM,aAAa,GAAG,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;gBAChE,OAAO,SAAS,CAAC,YAAY,KAAK,CAAC,CAAC,UAAU,CAAC;YACnD,CAAC,CAAC,CAAC;YAEH,IAAI,aAAa,EAAE,CAAC;gBAChB,MAAM,UAAU,GAAG,aAAa,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;;oBACtD,OAAO,UAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,UAAU,0CAAE,iBAAiB,EAAE,MAAK,OAAO,CAAC;gBAC5D,CAAC,CAAC,CAAC;gBAEH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACnD,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC;oBAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC;oBACvC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;oBAClD,IAAI,UAAU,IAAI,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,KAAK,EAAE,CAAC;wBAC7D,IAAK,CAAC,KAAK,GAAG,IAAI,CAAC;oBACvB,CAAC;oBAED,8EAA8E;oBAC9E,IAAI,CAAC,UAAU,IAAI,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;wBAC/C,IAAK,CAAC,KAAK,GAAG,IAAI,CAAC;oBACvB,CAAC;gBACL,CAAC;gBAED,IAAI,SAAS,CAAC,eAAe,EAAE,CAAC;oBAC5B,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;oBAChE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;wBACvD,MAAM,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;wBACzC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;wBAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;wBAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;wBACpD,IAAI,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;4BACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,UAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,mCAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,GAAG,CAAC,UAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,mCAAI,CAAC,CAAC,CAAC,CAAC,CAAC;4BACzK,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,UAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,mCAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,GAAG,CAAC,UAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,mCAAI,CAAC,CAAC,CAAC,CAAC,CAAC;4BACzK,uBAAuB;4BACvB,uBAAuB;4BACvB,kFAAkF;4BAClF,MAAM,cAAc,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;4BACzC,MAAM,YAAY,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;4BACvC,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;4BACpE,IAAI,cAAc,IAAI,YAAY,EAAE,CAAC;gCACjC,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;gCACxB,MAAM,CAAC,cAAc,GAAG,cAAc,CAAC;gCACvC,MAAM,CAAC,YAAY,GAAG,YAAY,CAAC;4BACvC,CAAC;4BACD,IAAI,MAAM,EAAE,CAAC;gCACT,MAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;4BAC/B,CAAC;iCAAM,CAAC;gCACJ,OAAO,CAAC,KAAK,CAAC,8CAA8C,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;4BACtF,CAAC;wBACL,CAAC;oBACL,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;CACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;AC1FwC;AACiB;AACF;AACgC;AAC7C;AACE;AACkE;AAC9D;AACb;AACJ;AACa;AACE;AAmIxC,MAAM,YAAY;IAyBrB,YAA4B,IAAY,EAAE,OAA6B;QAA3C,SAAI,GAAJ,IAAI,CAAQ;QAnBjC,aAAQ,GAAG,IAAI,GAAG,EAAmB,CAAC;QACtC,WAAM,GAAG,IAAI,GAAG,EAAiB,CAAC;QAClC,iBAAY,GAAG,IAAI,GAAG,EAAiB,CAAC;QACxC,cAAS,GAAG,IAAI,GAAG,EAAuD,CAAC;QAC3E,eAAU,GAAe,qDAAW,CAAC;QAGpC,iBAAY,GAAG,IAAI,sDAAW,CAAC,mDAAW,CAAC,CAAC;QAC5C,iBAAY,GAAG,IAAI,sDAAW,CAAC,0DAAa,CAAC,CAAC;QAGtC,gBAAW,GAAW,CAAC,CAAC;QACxB,gBAAW,GAAW,CAAC,CAAC;QACxB,uBAAkB,GAAY,IAAI,CAAC;QACnC,0BAAqB,GAAY,KAAK,CAAC;QACvC,6BAAwB,GAAY,KAAK,CAAC;QAC1C,aAAQ,GAAY,KAAK,CAAC;QAC1B,WAAM,GAAY,IAAI,CAAC;QAGnC,MAAM,EACF,kBAAkB,EAClB,wBAAwB,EACxB,yBAAyB,EACzB,OAAO,EACP,qBAAqB,EACrB,UAAU,EACV,MAAM,EACN,QAAQ,EACR,WAAW,EACd,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,IAAI,CAAC,MAAM,CAAC;QACpC,IAAI,CAAC,QAAQ,GAAG,QAAQ,aAAR,QAAQ,cAAR,QAAQ,GAAI,IAAI,CAAC,QAAQ,CAAC;QAC1C,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,aAAlB,kBAAkB,cAAlB,kBAAkB,GAAI,IAAI,CAAC,kBAAkB,CAAC;QACxE,IAAI,CAAC,wBAAwB,GAAG,wBAAwB,aAAxB,wBAAwB,cAAxB,wBAAwB,GAAI,IAAI,CAAC,wBAAwB,CAAC;QAC1F,IAAI,CAAC,qBAAqB,GAAG,qBAAqB,aAArB,qBAAqB,cAArB,qBAAqB,GAAI,IAAI,CAAC,qBAAqB,CAAC;QACjF,IAAI,CAAC,WAAW,GAAG,WAAW,aAAX,WAAW,cAAX,WAAW,GAAI,IAAI,CAAC,WAAW,CAAC;QACnD,IAAI,CAAC,UAAU,GAAG,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,IAAI,CAAC,UAAU,CAAC;QAChD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,KAAK,MAAM,GAAG,IAAI,yBAAyB,EAAE,CAAC;YAC1C,IAAI,CAAC,+BAA+B,CAAC,GAAG,EAAE,yBAAyB,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9E,CAAC;IAEL,CAAC;IACD,KAAK,CAAC,IAAI;;QACN,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACtD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,IAAI,CAAC;gBACD,IAAI,CAAC,eAAe,GAAG,uDAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3D,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,OAAO,CAAC,KAAK,CAAC,0CAA0C,IAAI,CAAC,IAAI,2FAA2F,CAAC,CAAC;gBAC9J,OAAO,CAAC,KAAK,CAAC,oEAAoE,CAAC;gBACnF,MAAM,CAAC,CAAC;YACZ,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,eAAe,GAAG,IAA2B,CAAC;QACvD,CAAC;QAED,IAAI,0DAAO,CAAC,YAAY,CAAC,oBAAoB,EAAE,UAAI,CAAC,eAAe,CAAC,WAAW,mCAAI,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC;YAC/F,OAAO,CAAC,IAAI,CAAC,iDAAiD,YAAY,CAAC,oBAAoB,uCAAuC,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC;QAC7K,CAAC;QAED,2BAA2B;QAC3B,oBAAoB;QACpB,MAAM,YAAY,GAAgC,EAAE,CAAC;QACrD,KAAK,IAAI,OAAO,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACrD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBAClB,MAAM,SAAS,GAAG,8DAAkB,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC/E,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;gBACpD,MAAM,eAAe,GAAG,IAAI,6CAAO,CAAC;oBAChC,KAAK;oBACL,WAAW,EAAE,OAAO;iBACvB,CAAC,CAAC;gBACH,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;YACpD,CAAC;iBAAM,CAAC;gBACJ,IAAI,OAAO,CAAC,UAAU,KAAK,gBAAgB,EAAE,CAAC;oBAC1C,OAAO,CAAC,IAAI,CAAC,iCAAiC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;gBACxE,CAAC;YACL,CAAC;QACL,CAAC;QAED,6BAA6B;QAC7B,0BAA0B;QAC1B,KAAK,IAAI,KAAK,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC;YAC5C,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;gBACxB,kBAAkB;gBAClB,MAAM,SAAS,GAAG,8DAAkB,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,eAAe,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;gBACrF,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,EAAE;oBACxC,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,UAAU,EAAE,IAAI,CAAC,UAAU;oBAC3B,WAAW,EAAE,IAAI,CAAC,YAAY;oBAC9B,OAAO,EAAE,IAAI,CAAC,OAAO;iBACxB,CAAC,CAAC;YACP,CAAC;iBAAM,CAAC;gBACJ,kBAAkB;gBAClB,MAAM,aAAa,GAAG,IAAI,yCAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;gBAC7C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;gBAC1C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,aAAa,CAAC,CAAC;YACzE,CAAC;QACL,CAAC;QAED,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACxE,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACvC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACtD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACrF,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC;IAC5C,CAAC;IAAA,CAAC;IAEF,QAAQ;QACJ,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,+BAA+B,CAAC,oBAA4B,EAAE,OAAoD;QAC9G,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;IAED,iCAAiC,CAAC,SAAsE;QACpG,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;YAC1B,IAAI,CAAC,+BAA+B,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9D,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,QAAQ,CAAC,UAAkB;QACvB,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED;;;OAGG;IACH,eAAe,CAAC,eAAwB;QACpC,IAAI,OAAO,GAAkB,EAAE,CAAC;QAChC,IAAI,eAAe,EAAE,CAAC;YAClB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;YAC7C,IAAI,KAAK,EAAE,CAAC;gBACR,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBAC7B,IAAI,KAAK,YAAY,sDAAW,EAAE,CAAC;wBAC/B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACxB,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;gBACvC,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBAC7B,IAAI,KAAK,YAAY,sDAAW,EAAE,CAAC;wBAC/B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACxB,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;QAED,OAAO,OAAO;IAClB,CAAC;IAED,aAAa,CAAC,UAAmB;QAC7B,IAAI,OAAO,GAAgB,EAAE,CAAC;QAC9B,IAAI,UAAU,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YACxC,IAAI,KAAK,EAAE,CAAC;gBACR,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBAC7B,IAAI,KAAK,YAAY,kDAAS,EAAE,CAAC;wBAC7B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACxB,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;gBACvC,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBAC7B,IAAI,KAAK,YAAY,kDAAS,EAAE,CAAC;wBAC7B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACxB,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,gBAAgB,CAAC,UAAmB;QAChC,IAAI,OAAO,GAAmB,EAAE,CAAC;QACjC,IAAI,UAAU,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YACxC,IAAI,KAAK,EAAE,CAAC;gBACR,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBAC7B,IAAI,KAAK,YAAY,wDAAY,EAAE,CAAC;wBAChC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACxB,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;gBACvC,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBAC7B,IAAI,KAAK,YAAY,wDAAY,EAAE,CAAC;wBAChC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACxB,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;;OAIG;IACH,2BAA2B,CAAC,UAAkB,EAAE,MAAiB;QAC7D,IAAI,OAAO,GAAyB,EAAE,CAAC;QACvC,MAAM,cAAc,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACnG,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAC3C,KAAK,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;gBACvB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,CAAC,UAAU,CAAC,CAAC,CAAC;YAC5E,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;;OAIG;IACH,sBAAsB,CAAC,eAAuB,EAAE,KAAW,EAAE,MAAiB;QAC1E,IAAI,OAAO,GAAyB,EAAE,CAAC;QACvC,MAAM,cAAc,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACnG,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAC3C,KAAK,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;gBACvB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC,CAAC;YACnF,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;;OAIG;IACH,uBAAuB,CAAC,UAAkB,EAAE,MAAiB;QACzD,IAAI,OAAO,GAAkB,EAAE,CAAC;QAChC,MAAM,cAAc,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACnG,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAC3C,KAAK,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;gBACvB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,UAAU,CAAC,CAAC,CAAC;YACxE,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;;;OAKG;IACH,kBAAkB,CAAC,eAAuB,EAAE,KAAW,EAAE,MAAiB;QACtE,IAAI,OAAO,GAAkB,EAAE,CAAC;QAChC,MAAM,cAAc,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACnG,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAC3C,KAAK,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;gBACvB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC,CAAC;YAC/E,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;OAGG;IACH,cAAc,CAAC,MAAiB;QAC5B,MAAM,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;QACxD,IAAI,MAAM,GAAuB,IAAI,CAAC;QACtC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACvC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC/C,SAAS;YACb,CAAC;YACD,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;YACzE,IAAI,cAAc,EAAE,CAAC;gBACjB,MAAM,UAAU,GAAG,mDAAW,CAAC,aAAa,CACxC,cAAc,CAAC,OAAO,CAAC,SAAS,GAAG,cAAc,CAAC,OAAO,CAAC,OAAO,EACjE,cAAc,CAAC,OAAO,CAAC,UAAU,GAAG,cAAc,CAAC,OAAO,CAAC,IAAI,EAC/D,8CAAM,CAAC,IAAI,EACX,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBAChC,IAAI,CAAC,MAAM,EAAE,CAAC;oBACV,MAAM,GAAG,UAAU,CAAC;gBACxB,CAAC;qBAAM,CAAC;oBACJ,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBACxC,CAAC;YACL,CAAC;QACL,CAAC;QACD,OAAO,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,IAAI,mDAAW,EAAE,CAAC;IACvC,CAAC;IAED,UAAU,CAAC,KAAY,EAAE,OAA2B;;QAChD,MAAM,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,EAAC,GAAG,EAAE,+CAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,GAAG,OAAO,EAAC,CAAC;QAGrF,KAAK,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;YAC5C,IAAI,aAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,WAAW,0CAAE,MAAM,EAAE,CAAC;gBAC/B,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC5D,SAAS;gBACb,CAAC;YACL,CAAC;YACD,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBAC7B,IAAI,KAAK,YAAY,kDAAS,IAAI,KAAK,YAAY,wDAAY,EAAE,CAAC;oBAC9D,KAAK,CAAC,OAAO,CAAC,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBAC/C,IAAI,CAAC,eAAe,EAAE,CAAC;wBACnB,KAAK,CAAC,OAAO,CAAC,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;oBAC9D,CAAC;oBACD,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC;gBAC5B,CAAC;qBAAM,CAAC;oBACJ,KAAK,CAAC,YAAY,EAAE;oBACpB,KAAK,IAAI,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;wBAChC,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,0DAAkB,CAAC,CAAC;wBAC1C,IAAI,EAAE,EAAE,CAAC;4BACL,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;4BACzB,IAAI,CAAC,eAAe,EAAE,CAAC;gCACnB,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;4BACxC,CAAC;wBACL,CAAC;wBACD,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;oBACtB,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;QAED,IAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9D,IAAI,MAAM,EAAE,CAAC;gBACT,KAAK,CAAC,MAAM,CAAC,GAAG,GAAG,+CAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBACnD,MAAM,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,iBAAiB,EAAE,KAAK,MAAM,CAAC,CAAC;gBAC5F,IAAI,IAAI,EAAE,CAAC;oBACP,KAAK,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;gBACtC,CAAC;YACL,CAAC;QACL,CAAC;QAED,IAAI,IAAI,CAAC,wBAAwB,EAAE,CAAC;YAChC,IAAI,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,WAAW,CAAC,CAAC;YACvD,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC7B,KAAK,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC5C,IAAI,aAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,WAAW,0CAAE,MAAM,EAAE,CAAC;oBAC/B,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;wBAC5D,SAAS;oBACb,CAAC;gBACL,CAAC;gBACD,KAAK,CAAC,eAAe,GAAG,KAAK,CAAC,eAAe,CAAC;gBAC9C,MAAM;YACV,CAAC;QACL,CAAC;IAGL,CAAC;;AApXa,iCAAoB,GAAG,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;AC/IC;AAEL;AACW;AACxB;AACI;AAWpC;;GAEG;AACI,MAAM,aAAa;IAMtB,YAA4B,IAAY,EAAkB,QAAsB,EAAE,OAA8B;QAApF,SAAI,GAAJ,IAAI,CAAQ;QAAkB,aAAQ,GAAR,QAAQ,CAAc;QALxE,eAAU,GAAe,qDAAW,CAAC;QAG7B,WAAM,GAAY,IAAI,CAAC;QACvB,aAAQ,GAAY,KAAK,CAAC;QAEtC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;QAC9E,IAAI,CAAC,UAAU,GAAG,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,IAAI,CAAC,UAAU,CAAC;QAChD,IAAI,CAAC,MAAM,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,IAAI,CAAC,MAAM,CAAC;QACpC,IAAI,CAAC,QAAQ,GAAG,QAAQ,aAAR,QAAQ,cAAR,QAAQ,GAAI,IAAI,CAAC,QAAQ,CAAC;QAC1C,IAAI,CAAC,WAAW,GAAG,WAAW,aAAX,WAAW,cAAX,WAAW,GAAI,IAAI,sDAAW,CAAC,kDAAW,CAAC,CAAC;QAC/D,IAAI,CAAC,OAAO,GAAG,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,IAAI,CAAC,OAAO,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,IAAI;QACN,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACtD,IAAI,KAAgB,CAAC;QACrB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,IAAI,CAAC;gBACD,KAAK,GAAG,6CAAS,CAAC,KAAK,CAAC,IAAI,CAAC;YACjC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,OAAO,CAAC,KAAK,CAAC,sCAAsC,IAAI,CAAC,IAAI,iDAAiD,CAAC,CAAC;gBAChH,MAAM,CAAC,CAAC;YACZ,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,KAAK,GAAG,IAAiB,CAAC;QAC9B,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,GAAG,IAAI,yCAAK,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvD,CAAC;IACD,QAAQ;QACJ,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IACvB,CAAC;CAEJ;;;;;;;;;;;;;;;;;;;ACrDiC;AACW;AACE;AAEN;AAGlC,MAAM,KAAK;IAKd,YAAmB,SAAoB,EAAS,QAAsB;;QAAnD,cAAS,GAAT,SAAS,CAAW;QAAS,aAAQ,GAAR,QAAQ,CAAc;QAF/D,WAAM,GAA+C,EAAE,CAAC;QAG3D,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;YACtB,IAAI,CAAC,eAAe,GAAG,4CAAK,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,SAAS,CAAC,cAAc,EAAE,CAAC;YAC3B,IAAI,KAAK,GAAG,QAAQ,CAAC,WAAW,CAAC;YACjC,IAAI,MAAM,GAAG,SAAS,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC;YACxD,KAAK,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;gBACvB,IAAI,YAAK,CAAC,eAAe,0CAAE,MAAM,MAAK,CAAC,EAAE,CAAC;oBACtC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,sDAAW,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;gBACpE,CAAC;gBAED,IAAI,YAAK,CAAC,SAAS,0CAAE,MAAM,MAAK,CAAC,EAAE,CAAC;oBAChC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,kDAAS,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;gBAClE,CAAC;gBAED,mEAAmE;gBACnE,IAAI,YAAK,CAAC,UAAU,0CAAE,MAAM,MAAK,CAAC,IAAI,YAAK,CAAC,cAAc,0CAAE,MAAM,MAAK,CAAC,EAAE,CAAC;oBACvE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,wDAAY,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;gBACrE,CAAC;gBACD,KAAK,EAAE,CAAC;YACZ,CAAC;QACL,CAAC;IACL,CAAC;CACJ;;;;;;;;;;;;;;;AChCA;;GAEG;AACI,MAAM,WAAW;IAIrB,YAA4B,IAA+B;QAA/B,SAAI,GAAJ,IAAI,CAA2B;QAHnD,YAAO,GAAG,KAAK,CAAC;QACxB,UAAK,GAAG,IAAI,GAAG,EAAa,CAAC;IAEgC,CAAC;IAE9D,QAAQ,CAAC,GAAG,IAAW;QACpB,IAAI,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9C,IAAI,QAAQ,EAAE,CAAC;YACZ,OAAO,QAAQ,CAAC;QACnB,CAAC;QAED,QAAQ,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;QACzC,OAAO,QAAQ,CAAC;IACnB,CAAC;IAED,MAAM;QACH,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAChB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1C,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC9E,CAAC;IAED,KAAK,CAAC,IAAI;QACP,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAE1E,qCAAqC;QACrC,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBAChC,OAAO,CAAC,KAAK,CAAC,6BAA6B,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,wDAAwD,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;gBACnI,OAAO,EAAE,CAAC;YACb,CAAC;QACJ,CAAC;QACD,IAAI,OAAO,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,iBAAiB,OAAO,YAAY,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACvB,CAAC;CACH;;;;;;;;;;;;;;;;;;AC7CK,SAAS,gBAAgB,CAAC,SAAiB;IAC/C,MAAM,kBAAkB,GAAG,yCAAyC;IAEpE,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAEpD,IAAI,OAAO,EAAE,CAAC;QACX,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACzB,OAAO,KAAK,CAAC;IAChB,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,wCAAwC,SAAS,EAAE,CAAC,CAAC;AACxE,CAAC;AAEM,SAAS,OAAO,CAAC,SAAiB,EAAE,OAAgB;IAExD,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;QACtC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5B,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5B,OAAO,MAAM,CAAC;YACjB,CAAC;QACJ,CAAC;aAAM,CAAC;YACL,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,KAAK,EAAE,CAAC;gBACT,OAAO,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAAA,CAAC;YAC/C,CAAC;QACJ,CAAC;IACJ,CAAC;IACD,OAAO,SAAS,CAAC;AACpB,CAAC;AAEM,SAAS,SAAS,CAAC,SAAiB,EAAE,OAAiB;IAC3D,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC3B,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;QACtC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5B,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5B,OAAO,IAAI,CAAC;YACf,CAAC;QACJ,CAAC;aAAM,CAAC;YACL,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,KAAK,EAAE,CAAC;gBACT,OAAO,IAAI,CAAC;YACf,CAAC;QACJ,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AAChB,CAAC;AAGM,SAAS,kBAAkB,CAAC,QAAgB,EAAE,cAAsB,EAAE,OAAiB;IAC3F,IAAI,SAAS,CAAC,cAAc,EAAE,OAAO,CAAC,IAAI,OAAO,EAAE,CAAC;QACjD,OAAO,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,iCAAiC;IACjC,IAAI,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,OAAO,cAAc,CAAC;IACzB,CAAC;IAED,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,aAAa,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAChD,0DAA0D;IAC1D,IAAI,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACrD,WAAW,CAAC,GAAG,EAAE,CAAC;IACrB,CAAC;IACD,OAAO,WAAW,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACtD,CAAC;;;;;;;;;;;;;;;;ACrEmE;AAO7D,MAAM,SAAS;IAOlB,YAAY,KAAY,EAAE,SAA4B,EAAE,QAAsB,EAAkB,KAAa;;QAAb,UAAK,GAAL,KAAK,CAAQ;QACzG,IAAI,CAAC,QAAQ,GAAG,8CAAG,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACpE,IAAI,CAAC,MAAM,GAAG,8CAAG,CAAC,SAAS,CAAC,gBAAgB,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC1E,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,8CAAO,CAAC;YACvB,IAAI,EAAE,SAAS,CAAC,YAAY;YAC5B,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;YACnC,SAAS,EAAE,SAAS,CAAC,UAAU;YAC/B,UAAU,EAAE,SAAS,CAAC,UAAU;YAChC,IAAI,EAAE,SAAS,CAAC,MAAM;YACtB,OAAO,EAAE,SAAS,CAAC,MAAM;SAC5B,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,wDAAiB,CAAC,CAAC;QACrD,QAAQ,CAAC,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC;QAGvC,IAAI,SAAS,CAAC,eAAe,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;YAChE,KAAK,IAAI,IAAI,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;gBACnC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;gBAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;gBAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBACpD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;oBACf,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,UAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,mCAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,GAAG,CAAC,UAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,mCAAI,CAAC,CAAC,CAAC,CAAC,CAAC;oBACzK,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,UAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,mCAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,GAAG,CAAC,UAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,mCAAI,CAAC,CAAC,CAAC,CAAC,CAAC;oBACzK,uBAAuB;oBACvB,uBAAuB;oBACvB,kFAAkF;oBAClF,MAAM,cAAc,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;oBACzC,MAAM,YAAY,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;oBACvC,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;oBACpE,IAAI,cAAc,IAAI,YAAY,EAAE,CAAC;wBACjC,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;wBACxB,MAAM,CAAC,cAAc,GAAG,cAAc,CAAC;wBACvC,MAAM,CAAC,YAAY,GAAG,YAAY,CAAC;oBACvC,CAAC;oBACD,IAAI,MAAM,EAAE,CAAC;wBACT,MAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;oBAC/B,CAAC;yBAAM,CAAC;wBACJ,OAAO,CAAC,KAAK,CAAC,8CAA8C,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;oBACtF,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,SAAS,CAAC,eAAe,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACtG,CAAC;IAEL,CAAC;CACJ;;;;;;;;;;;;;;;;AC/D4D;AAQtD,MAAM,OAAO;IAIhB,YAAY,OAAuB;;QAC/B,MAAM,EAAC,KAAK,EAAE,WAAW,EAAC,GAAG,OAAO,CAAC;QACrC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,WAAW,GAAG,kDAAW,CAAC,eAAe,CAAC;YAC3C,KAAK;YACL,IAAI,EAAE;gBACF,IAAI,EAAE,WAAW,CAAC,KAAK,GAAG,WAAW,CAAC,YAAY;gBAClD,OAAO,EAAE,WAAW,CAAC,KAAK,GAAG,WAAW,CAAC,YAAY;gBACrD,YAAY,EAAE,WAAW,CAAC,YAAY;gBACtC,WAAW,EAAE,WAAW,CAAC,YAAY;aACxC;YACD,OAAO,EAAE;gBACL,MAAM,EAAE;oBACJ,CAAC,EAAE,iBAAW,CAAC,OAAO,mCAAI,CAAC;oBAC3B,CAAC,EAAE,iBAAW,CAAC,OAAO,mCAAI,CAAC;iBAC9B;gBACD,YAAY,EAAE;oBACV,CAAC,EAAE,iBAAW,CAAC,OAAO,mCAAI,CAAC;oBAC3B,CAAC,EAAE,iBAAW,CAAC,OAAO,mCAAI,CAAC;iBAC9B;aACJ;SACJ,CAAC,CAAC;IACP,CAAC;CACJ;;;;;;;;;;;;;;;;;;;;;ACpCuB;AAIxB,MAAM,oBAAoB,GAAG,kCAAC,CAAC,MAAM,CAAC;IAClC,CAAC,EAAE,kCAAC,CAAC,MAAM,EAAE;IACb,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,CAAC,EAAE,kCAAC,CAAC,MAAM,EAAE;IACb,CAAC,EAAE,kCAAC,CAAC,MAAM,EAAE;IACb,CAAC,EAAE,kCAAC,CAAC,MAAM,EAAE;CAChB,CAAC,CAAC;AACH,MAAM,SAAS,GAAG,kCAAC,CAAC,KAAK,CAAC,CAAC,kCAAC,CAAC,MAAM,EAAE,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AACpD,MAAM,iBAAiB,GAAG,kCAAC,CAAC,MAAM,CAAC;IAC/B,YAAY,EAAE,kCAAC,CAAC,MAAM,EAAE;IACxB,MAAM,EAAE,oBAAoB,CAAC,QAAQ,EAAE;IACvC,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE,EAAC,mJAAmJ;IACtK,OAAO,EAAE,kCAAC,CAAC,GAAG,EAAE;IAChB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;CACrB,CAAC;AACF,MAAM,gBAAgB,GAAG,kCAAC,CAAC,MAAM,CAAC;IAC9B,CAAC,EAAE,kCAAC,CAAC,MAAM,EAAE;IACb,CAAC,EAAE,kCAAC,CAAC,MAAM,EAAE,EAAE,sBAAsB;IACrC,EAAE,EAAE,SAAS;IACb,GAAG,EAAE,SAAS;IACd,CAAC,EAAE,kCAAC,CAAC,MAAM,EAAE;CAChB,CAAC,CAAC;AAEI,MAAM,kBAAkB,GAAG,kCAAC,CAAC,MAAM,CAAC;IACvC,MAAM,EAAE,SAAS;IACjB,YAAY,EAAE,kCAAC,CAAC,MAAM,EAAE;IACxB,OAAO,EAAE,SAAS;IAClB,YAAY,EAAE,kCAAC,CAAC,MAAM,EAAE;IACxB,MAAM,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,EAAE,CAAC;IAC3B,MAAM,EAAE,oBAAoB,CAAC,QAAQ,EAAE;IACvC,QAAQ,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,QAAQ,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,cAAc,EAAE,kCAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC;IAC1C,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;IACf,EAAE,EAAE,SAAS;IACb,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;CACpB,CAAC,CAAC;AAGI,MAAM,iBAAiB,GAAG,kCAAC,CAAC,MAAM,CAAC;IACtC,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,YAAY,EAAE,kCAAC,CAAC,MAAM,EAAE;IACxB,SAAS,EAAE,kCAAC,CAAC,MAAM,EAAE;IACrB,gBAAgB,EAAE,kCAAC,CAAC,MAAM,EAAE;IAC5B,gBAAgB,EAAE,kCAAC,CAAC,MAAM,EAAE;IAC5B,eAAe,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACtC,gBAAgB,EAAC,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACtC,MAAM,EAAE,kCAAC,CAAC,KAAK,CAAC,CAAC,kCAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;IAC1G,cAAc,EAAE,kCAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,sBAAsB;IACjE,eAAe,EAAE,kCAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAC,wBAAwB;IACrE,SAAS,EAAE,kCAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC;IACpC,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;IACf,UAAU,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,EAAE,CAAC,EAAE,oDAAoD;IACrF,WAAW,EAAE,kCAAC,CAAC,MAAM,EAAE;IACvB,OAAO,EAAE,kCAAC,CAAC,MAAM,EAAE;IACnB,kBAAkB,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACzC,SAAS,EAAE,kCAAC,CAAC,MAAM,EAAE;IACrB,SAAS,EAAE,kCAAC,CAAC,MAAM,EAAE;IACrB,OAAO,EAAE,kCAAC,CAAC,OAAO,EAAE;CACvB,CAAC,CAAC;AAGI,MAAM,SAAS,GAAG,kCAAC,CAAC,MAAM,CAAC;IAC9B,SAAS,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,OAAO,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,OAAO,EAAE,kCAAC,CAAC,MAAM,CAAC;QACd,QAAQ,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,KAAK,CAAC,CAAC,kCAAC,CAAC,MAAM,EAAE,EAAE,kCAAC,CAAC,MAAM,EAAE,EAAE,kCAAC,CAAC,MAAM,EAAE,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,sCAAsC;QACpH,KAAK,EAAE,kCAAC,CAAC,KAAK,CAAC,CAAC,kCAAC,CAAC,MAAM,EAAE,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACxC,SAAS,EAAE,SAAS;KACvB,CAAC,CAAC,QAAQ,EAAE;IACb,YAAY,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,CAAC;QAC3B,GAAG,EAAE,kCAAC,CAAC,KAAK,CAAC,CAAC,kCAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QAClM,QAAQ,EAAE,kCAAC,CAAC,MAAM,EAAE;KACvB,CAAC,CAAC;IACH,SAAS,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,eAAe,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACtC,cAAc,EAAE,kCAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC;IAC1C,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;IACf,cAAc,EAAE,kCAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,QAAQ,EAAE,EAAE,gDAAgD;IACvG,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;IACjB,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;IACjB,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;IACf,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;CACrB,CAAC,CAAC;AAGH,MAAM,SAAS,GAAG,kCAAC,CAAC,MAAM,CAAC;IACvB,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;IACf,MAAM,EAAE,kCAAC,CAAC,KAAK,CAAC,SAAS,CAAC;IAC1B,eAAe,EAAC,kCAAC,CAAC,MAAM,EAAE;IAC1B,cAAc,EAAE,kCAAC,CAAC,MAAM,EAAE;IAC1B,6BAA6B;IAC7B,WAAW,EAAE,kCAAC,CAAC,KAAK,CAAC,CAAC,kCAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC;CAChI,CAAC,CAAC;AAGH,MAAM,uBAAuB,GAAG,kCAAC,CAAC,MAAM,CAAC;IACrC,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;IACjB,EAAE,EAAE,kCAAC,CAAC,MAAM,EAAE;IACd,QAAQ,EAAE,oBAAoB,CAAC,QAAQ,EAAE;CAC5C,CAAC,CAAC;AAEH,MAAM,kBAAkB,GAAG,kCAAC,CAAC,MAAM,CAAC;IAChC,eAAe,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACtC,cAAc,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACrC,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,IAAI,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,EAAE,CAAC;IACzB,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;IACf,MAAM,EAAE,kCAAC,CAAC,KAAK,CAAC,uBAAuB,CAAC;CAC3C,CAAC;AAIF,MAAM,qBAAqB,GAAG,kCAAC,CAAC,MAAM,CAAC;IACnC,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,UAAU,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,CAAC;QACzB,IAAI,EAAE,kCAAC,CAAC,MAAM,EAAE;QAChB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;KACrB,CAAC,CAAC;IACH,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,QAAQ,EAAE,kCAAC,CAAC,QAAQ,CAAC,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,CAAC;QAClC,WAAW,EAAE,kCAAC,CAAC,MAAM,EAAE;QACvB,OAAO,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,EAAE,CAAC;KAC/B,CAAC,CAAC,CAAC;IACJ,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,OAAO,EAAE,kCAAC,CAAC,MAAM,EAAE;IACnB,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;IACjB,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;IACjB,OAAO,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,OAAO,EAAE,kCAAC,CAAC,MAAM,EAAE;IACnB,IAAI,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,EAAE,CAAC;IACzB,iBAAiB,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACxC,YAAY,EAAE,kCAAC,CAAC,MAAM,EAAE;IACxB,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;CAClB,CAAC;AAGK,MAAM,mBAAmB,GAAG,kCAAC,CAAC,MAAM,CAAC;IACxC,MAAM,EAAE,kCAAC,CAAC,KAAK,CAAC,CAAC,kCAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;IAC1G,qBAAqB,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5C,cAAc,EAAE,kCAAC,CAAC,MAAM,EAAE;IAC1B,QAAQ,EAAE,kCAAC,CAAC,MAAM,EAAE;IACpB,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,aAAa,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,CAAC;QAC5B,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;QACjB,QAAQ,EAAE,kCAAC,CAAC,MAAM,EAAE;QACpB,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QACjC,IAAI,EAAE,oBAAoB,CAAC,QAAQ,EAAE;QACrC,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;KACpB,CAAC,CAAC;IACH,mBAAmB,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,CAAC;QAClC,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC5B,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QACjC,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;KAClB,CAAC,CAAC;IACH,eAAe,EAAE,kCAAC,CAAC,MAAM,EAAE;IAC3B,eAAe,EAAE,kCAAC,CAAC,MAAM,EAAE;IAC3B,eAAe,EAAE,kCAAC,CAAC,OAAO,EAAE;IAC5B,SAAS,EAAE,kCAAC,CAAC,MAAM,EAAE;IACrB,SAAS,EAAE,kCAAC,CAAC,MAAM,EAAE;IACrB,aAAa,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpC,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;CAClB,CAAC,CAAC;AAGI,MAAM,oBAAoB,GAAG,kCAAC,CAAC,MAAM,CAAC;IACzC,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;IACjB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,gBAAgB,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,EAAE,CAAC;IACrC,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,QAAQ,EAAE,oBAAoB,CAAC,QAAQ,EAAE;IACzC,cAAc,EAAE,kCAAC,CAAC,KAAK,CAAC;QACpB,kCAAC,CAAC,OAAO,CAAC,OAAO,CAAC;QAClB,kCAAC,CAAC,OAAO,CAAC,WAAW,CAAC;QACtB,kCAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;QACnB,kCAAC,CAAC,OAAO,CAAC,SAAS,CAAC;QACpB,kCAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC;QAC5B,kCAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC;QAC9B,kCAAC,CAAC,OAAO,CAAC,WAAW,CAAC;KACzB,CAAC;IACF,SAAS,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,UAAU,EAAE,oBAAoB,CAAC,QAAQ,EAAE;IAC3C,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;IACf,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;CACpB,CAAC,CAAC;AAGH,MAAM,eAAe,GAAG,kCAAC,CAAC,MAAM,CAAC;IAC7B,QAAQ,EAAE,kCAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC;IACxC,KAAK,EAAE,kCAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC;IAClC,MAAM,EAAE,kCAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC;IACpC,QAAQ,EAAE,kCAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC;CAC1C,CAAC;AAGK,MAAM,mBAAmB,GAAG,kCAAC,CAAC,MAAM,CAAC;IACxC,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;IACf,OAAO,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,IAAI,EAAE,eAAe;IACrB,cAAc,EAAE,kCAAC,CAAC,OAAO,EAAE;IAC3B,WAAW,EAAE,kCAAC,CAAC,MAAM,EAAE;IACvB,MAAM,EAAE,kCAAC,CAAC,KAAK,CAAC,SAAS,CAAC;IAC1B,GAAG,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,CAAC;QAClB,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;QACtB,aAAa,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,CAAC;YAC5B,MAAM,EAAE,kCAAC,CAAC,GAAG,EAAE;YACf,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;YACjB,IAAI,EAAE,kCAAC,CAAC,MAAM,EAAE;YAChB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;YAClB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;YAClB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;SACrB,CAAC,CAAC;KACN,CAAC,CAAC;IACH,yBAAyB;IACzB,eAAe,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACtC,cAAc,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACrC,uCAAuC;IACvC,WAAW,EAAE,kCAAC,CAAC,KAAK,CAAC,CAAC,kCAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACxI,MAAM,EAAE,kCAAC,CAAC,KAAK,CAAC,SAAS,CAAC;CAC7B,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC1OH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,IAAI;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oBAAoB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gCAAgC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA,0DAA0D;AAC1D,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,MAAM;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,eAAe,aAAa,eAAe;AACjF;AACA;AACA;AACA,yDAAyD,2DAA2D;AACpH;AACA;AACA,wDAAwD,kCAAkC;AAC1F;AACA;AACA;AACA;AACA;AACA,+DAA+D,+BAA+B;AAC9F;AACA;AACA,sDAAsD,+BAA+B,cAAc,eAAe;AAClH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8DAA8D,0BAA0B;AACxF;AACA,qCAAqC,SAAS,oDAAoD,0BAA0B;AAC5H;AACA;AACA;AACA,iEAAiE,4BAA4B;AAC7F;AACA;AACA,+DAA+D,0BAA0B;AACzF;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,iBAAiB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,sEAAsE,EAAE,eAAe;AACvI;AACA,iDAAiD,iEAAiE,EAAE,eAAe;AACnI;AACA,4CAA4C;AAC5C;AACA;AACA;AACA,0CAA0C,EAAE,cAAc;AAC1D;AACA,0CAA0C;AAC1C;AACA;AACA;AACA,0CAA0C,EAAE,gCAAgC;AAC5E;AACA;AACA;AACA;AACA;AACA,gDAAgD,qEAAqE,EAAE,eAAe;AACtI;AACA,iDAAiD,iEAAiE,EAAE,eAAe;AACnI;AACA,4CAA4C;AAC5C;AACA;AACA;AACA,uCAAuC,EAAE,cAAc;AACvD;AACA,4CAA4C;AAC5C;AACA;AACA;AACA,uCAAuC,EAAE,cAAc;AACvD;AACA,0CAA0C;AAC1C;AACA;AACA;AACA,0CAA0C,EAAE,gCAAgC;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,iBAAiB;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY,mCAAmC;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,kCAAkC;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,aAAa;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,CAAC;AACD,4BAA4B,wBAAwB;AACpD,yBAAyB,wBAAwB;AACjD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,sEAAsE,UAAU;AAChF;AACA,CAAC,8BAA8B;;AAE/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,4DAA4D;AACxE;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,gBAAgB,UAAU;AAC1B;AACA,qBAAqB;AACrB;AACA;AACA,qBAAqB;AACrB;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,mCAAmC;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,6BAA6B;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,6BAA6B;AAC/D;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,mCAAmC;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,sBAAsB,gCAAgC;AACtD,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,8BAA8B;AACpD,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,GAAG;AAC/B;AACA,uCAAuC,GAAG;AAC1C;AACA,iBAAiB,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU,GAAG;AACzE,gCAAgC,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,GAAG;AACvG,iCAAiC,GAAG;AACpC;AACA;AACA;AACA;AACA,4DAA4D,GAAG,mFAAmF,GAAG;AACrJ;AACA,sCAAsC,sBAAsB,sCAAsC,uBAAuB,OAAO,GAAG,cAAc;AACjJ;AACA;AACA,uBAAuB,yBAAyB,4DAA4D,EAAE,SAAS,IAAI,MAAM,EAAE,iCAAiC,EAAE,SAAS,IAAI,yBAAyB,IAAI,GAAG,EAAE,aAAa,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,mCAAmC,EAAE,SAAS,IAAI,MAAM,EAAE,iCAAiC,EAAE,SAAS,IAAI,0DAA0D,GAAG;AACrnB;AACA,iDAAiD,IAAI,kCAAkC,KAAK,6CAA6C,KAAK;AAC9I;AACA,gCAAgC,EAAE,+BAA+B,EAAE,2NAA2N,EAAE;AAChS,iGAAiG,GAAG;AACpG;AACA,8BAA8B,EAAE;AAChC;AACA,2BAA2B,sBAAsB,KAAK,gBAAgB;AACtE;AACA;AACA,+EAA+E,EAAE;AACjF,mFAAmF,EAAE;AACrF;AACA,gBAAgB,IAAI,GAAG,EAAE,aAAa,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,mCAAmC,EAAE,SAAS,IAAI,MAAM,EAAE,iCAAiC,EAAE,SAAS,IAAI;AAC5X,kCAAkC,IAAI,GAAG,IAAI,YAAY,IAAI,cAAc,IAAI,GAAG,IAAI,eAAe,IAAI,GAAG,IAAI,aAAa,IAAI,cAAc,IAAI,GAAG,IAAI,cAAc,IAAI,EAAE,IAAI,cAAc,IAAI,GAAG,IAAI,cAAc,IAAI,EAAE,IAAI,cAAc,IAAI,GAAG,IAAI,cAAc,IAAI,EAAE,IAAI,cAAc,IAAI,GAAG,IAAI,cAAc,IAAI,EAAE,IAAI,aAAa,IAAI,gBAAgB,IAAI,EAAE,IAAI,kBAAkB,IAAI,EAAE,IAAI,uBAAuB,IAAI,EAAE,IAAI,aAAa,GAAG,YAAY,IAAI,EAAE,IAAI,GAAG,IAAI,oBAAoB,IAAI,OAAO,IAAI,UAAU,IAAI,mBAAmB,IAAI,OAAO,IAAI,oBAAoB,IAAI,GAAG,IAAI,qBAAqB,IAAI,OAAO,IAAI,UAAU,IAAI,mBAAmB,IAAI,OAAO,IAAI;AAChqB,sCAAsC,IAAI,GAAG,IAAI,YAAY,IAAI,cAAc,IAAI,GAAG,IAAI,eAAe,IAAI,GAAG,IAAI,aAAa,IAAI,cAAc,IAAI,GAAG,IAAI,cAAc,IAAI,EAAE,IAAI,cAAc,IAAI,GAAG,IAAI,cAAc,IAAI,EAAE,IAAI,cAAc,IAAI,GAAG,IAAI,cAAc,IAAI,EAAE,IAAI,cAAc,IAAI,GAAG,IAAI,cAAc,IAAI,EAAE,IAAI,aAAa,IAAI,gBAAgB,IAAI,EAAE,IAAI,kBAAkB,IAAI,EAAE,IAAI,uBAAuB,IAAI,EAAE,IAAI,aAAa,GAAG,YAAY,IAAI,EAAE,IAAI,GAAG,IAAI,oBAAoB,IAAI,OAAO,IAAI,UAAU,IAAI,mBAAmB,IAAI,OAAO,IAAI,oBAAoB,IAAI,GAAG,IAAI,qBAAqB,IAAI,OAAO,IAAI,UAAU,IAAI,mBAAmB,IAAI,OAAO,IAAI;AACpqB;AACA,qCAAqC,EAAE,kBAAkB,EAAE,mBAAmB,EAAE;AAChF;AACA,wCAAwC,EAAE,kBAAkB,EAAE,sBAAsB,EAAE;AACtF;AACA,gCAAgC,EAAE,KAAK,EAAE,KAAK,EAAE;AAChD;AACA,gCAAgC,EAAE;AAClC;AACA,mHAAmH,EAAE;AACrH,iCAAiC,gBAAgB;AACjD;AACA,wBAAwB,EAAE,KAAK,EAAE,KAAK,EAAE;AACxC;AACA;AACA,mBAAmB,MAAM,OAAO,EAAE,gBAAgB;AAClD;AACA;AACA,mBAAmB,MAAM;AACzB;AACA;AACA;AACA;AACA,0BAA0B,sBAAsB;AAChD;AACA;AACA;AACA,mBAAmB,gBAAgB,GAAG,sBAAsB;AAC5D;AACA;AACA;AACA,4BAA4B,EAAE,MAAM,EAAE;AACtC,eAAe,MAAM,GAAG,eAAe;AACvC,0BAA0B,MAAM;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,iDAAiD;AACvF;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,yBAAyB;AAC/D;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,uBAAuB;AAC7D;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gCAAgC,+CAA+C;AAC/E;AACA;AACA,gCAAgC,6CAA6C;AAC7E;AACA;AACA,gCAAgC,+CAA+C;AAC/E;AACA;AACA,gCAAgC,8CAA8C;AAC9E;AACA;AACA,gCAAgC,gDAAgD;AAChF;AACA;AACA,gCAAgC,8CAA8C;AAC9E;AACA;AACA,gCAAgC,+CAA+C;AAC/E;AACA;AACA,gCAAgC,8CAA8C;AAC9E;AACA;AACA,gCAAgC,gDAAgD;AAChF;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gCAAgC,6CAA6C;AAC7E;AACA;AACA,gCAAgC,4CAA4C;AAC5E;AACA;AACA,gCAAgC,8CAA8C;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gCAAgC,uBAAuB;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gCAAgC,kDAAkD;AAClF;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,cAAc;AAC1D,SAAS;AACT;AACA;AACA;AACA;AACA,4CAA4C,qBAAqB;AACjE,SAAS;AACT;AACA;AACA;AACA;AACA,4CAA4C,qBAAqB;AACjE,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,wDAAwD;AACjF,SAAS;AACT;AACA;AACA;AACA;AACA,yBAAyB,wDAAwD;AACjF,SAAS;AACT;AACA;AACA;AACA;AACA,2BAA2B,kDAAkD;AAC7E,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,aAAa;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,gBAAgB,cAAc;AAC9B,gBAAgB,yBAAyB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,6BAA6B;AACpD;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,6BAA6B;AAC5D,iCAAiC,uCAAuC;AACxE,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,6BAA6B;AACxD;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,oBAAoB;AACpB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,8BAA8B,eAAe;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE,cAAc;AACjF;AACA;AACA;AACA,8DAA8D,uBAAuB,sBAAsB,cAAc;AACzH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,4BAA4B,kBAAkB;AAC9C;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,iCAAiC;AACjC;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,sDAAsD;AAC7E,SAAS;AACT;AACA;AACA;AACA;AACA,uBAAuB,sDAAsD;AAC7E,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA,mCAAmC,6CAA6C;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,mCAAmC,6CAA6C;AAChF;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,mCAAmC,6CAA6C;AAChF;AACA;AACA;AACA,uGAAuG,qCAAqC;AAC5I,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,kBAAkB,2CAA2C;AAC7D;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA,yBAAyB;AACzB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,cAAc;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA,qDAAqD,aAAa;AAClE,+BAA+B,sCAAsC;AACrE;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,sDAAsD;AACvD;AACA;AACA;AACA,sCAAsC,SAAS;AAC/C,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,sBAAsB;AAC/D,yCAAyC,sBAAsB;AAC/D;AACA;AACA;AACA,KAAK;AACL,yCAAyC,sBAAsB;AAC/D,qCAAqC,sBAAsB;AAC3D;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,cAAc;AAChC,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,+BAA+B;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAE2rD;;;;;;;UC7xI5rD;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;;;;WCtBA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA;;;;;WCPA;;;;;WCAA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D;;;;;;;;;;;;;ACLgC;AAEgB;AAChD,4CAAQ,CAAC,sBAAsB,EAAE,CAAC;AAClC,MAAM,IAAI,GAAG,IAAI,6CAAS,CAAC;IACvB,UAAU,EAAE;QACR,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,GAAG;KACd;IACD,kBAAkB,EAAE,KAAK;IACzB,QAAQ,EAAE,IAAI;IACd,UAAU,EAAE,CAAC;IACb,WAAW,EAAE,kDAAc,CAAC,SAAS;CACxC,CAAC,CAAC;AAEH,IAAI,CAAC,KAAK,CAAC,8CAAM,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;IACzB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAE3B,iDAAS,CAAC,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE;QACrD,GAAG,EAAE,0CAAM,CAAC,CAAC,EAAE,CAAC,CAAC;KACpB,CAAC,CAAC;AACP,CAAC,CAAC,CAAC","sources":["webpack://@excaliburjs/plugin-ldtk/webpack/universalModuleDefinition","webpack://@excaliburjs/plugin-ldtk/./node_modules/compare-versions/lib/esm/compare.js","webpack://@excaliburjs/plugin-ldtk/./node_modules/compare-versions/lib/esm/compareVersions.js","webpack://@excaliburjs/plugin-ldtk/./node_modules/compare-versions/lib/esm/utils.js","webpack://@excaliburjs/plugin-ldtk/./node_modules/excalibur/build/esm/excalibur.development.js","webpack://@excaliburjs/plugin-ldtk/./sample/resources.ts","webpack://@excaliburjs/plugin-ldtk/./src/entity-layer.ts","webpack://@excaliburjs/plugin-ldtk/./src/file-loader.ts","webpack://@excaliburjs/plugin-ldtk/./src/index.ts","webpack://@excaliburjs/plugin-ldtk/./src/intgrid-layer.ts","webpack://@excaliburjs/plugin-ldtk/./src/ldtk-resource.ts","webpack://@excaliburjs/plugin-ldtk/./src/level-resource.ts","webpack://@excaliburjs/plugin-ldtk/./src/level.ts","webpack://@excaliburjs/plugin-ldtk/./src/loader-cache.ts","webpack://@excaliburjs/plugin-ldtk/./src/path-util.ts","webpack://@excaliburjs/plugin-ldtk/./src/tile-layer.ts","webpack://@excaliburjs/plugin-ldtk/./src/tileset.ts","webpack://@excaliburjs/plugin-ldtk/./src/types.ts","webpack://@excaliburjs/plugin-ldtk/./node_modules/zod/lib/index.mjs","webpack://@excaliburjs/plugin-ldtk/webpack/bootstrap","webpack://@excaliburjs/plugin-ldtk/webpack/runtime/define property getters","webpack://@excaliburjs/plugin-ldtk/webpack/runtime/hasOwnProperty shorthand","webpack://@excaliburjs/plugin-ldtk/webpack/runtime/make namespace object","webpack://@excaliburjs/plugin-ldtk/./sample/pureautotile.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, () => {\nreturn ","import { compareVersions } from './compareVersions.js';\n/**\n * Compare [semver](https://semver.org/) version strings using the specified operator.\n *\n * @param v1 First version to compare\n * @param v2 Second version to compare\n * @param operator Allowed arithmetic operator to use\n * @returns `true` if the comparison between the firstVersion and the secondVersion satisfies the operator, `false` otherwise.\n *\n * @example\n * ```\n * compare('10.1.8', '10.0.4', '>'); // return true\n * compare('10.0.1', '10.0.1', '='); // return true\n * compare('10.1.1', '10.2.2', '<'); // return true\n * compare('10.1.1', '10.2.2', '<='); // return true\n * compare('10.1.1', '10.2.2', '>='); // return false\n * ```\n */\nexport const compare = (v1, v2, operator) => {\n // validate input operator\n assertValidOperator(operator);\n // since result of compareVersions can only be -1 or 0 or 1\n // a simple map can be used to replace switch\n const res = compareVersions(v1, v2);\n return operatorResMap[operator].includes(res);\n};\nconst operatorResMap = {\n '>': [1],\n '>=': [0, 1],\n '=': [0],\n '<=': [-1, 0],\n '<': [-1],\n '!=': [-1, 1],\n};\nconst allowedOperators = Object.keys(operatorResMap);\nconst assertValidOperator = (op) => {\n if (typeof op !== 'string') {\n throw new TypeError(`Invalid operator type, expected string but got ${typeof op}`);\n }\n if (allowedOperators.indexOf(op) === -1) {\n throw new Error(`Invalid operator, expected one of ${allowedOperators.join('|')}`);\n }\n};\n//# sourceMappingURL=compare.js.map","import { compareSegments, validateAndParse } from './utils.js';\n/**\n * Compare [semver](https://semver.org/) version strings to find greater, equal or lesser.\n * This library supports the full semver specification, including comparing versions with different number of digits like `1.0.0`, `1.0`, `1`, and pre-release versions like `1.0.0-alpha`.\n * @param v1 - First version to compare\n * @param v2 - Second version to compare\n * @returns Numeric value compatible with the [Array.sort(fn) interface](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#Parameters).\n */\nexport const compareVersions = (v1, v2) => {\n // validate input and split into segments\n const n1 = validateAndParse(v1);\n const n2 = validateAndParse(v2);\n // pop off the patch\n const p1 = n1.pop();\n const p2 = n2.pop();\n // validate numbers\n const r = compareSegments(n1, n2);\n if (r !== 0)\n return r;\n // validate pre-release\n if (p1 && p2) {\n return compareSegments(p1.split('.'), p2.split('.'));\n }\n else if (p1 || p2) {\n return p1 ? -1 : 1;\n }\n return 0;\n};\n//# sourceMappingURL=compareVersions.js.map","export const semver = /^[v^~<>=]*?(\\d+)(?:\\.([x*]|\\d+)(?:\\.([x*]|\\d+)(?:\\.([x*]|\\d+))?(?:-([\\da-z\\-]+(?:\\.[\\da-z\\-]+)*))?(?:\\+[\\da-z\\-]+(?:\\.[\\da-z\\-]+)*)?)?)?$/i;\nexport const validateAndParse = (version) => {\n if (typeof version !== 'string') {\n throw new TypeError('Invalid argument expected string');\n }\n const match = version.match(semver);\n if (!match) {\n throw new Error(`Invalid argument not valid semver ('${version}' received)`);\n }\n match.shift();\n return match;\n};\nconst isWildcard = (s) => s === '*' || s === 'x' || s === 'X';\nconst tryParse = (v) => {\n const n = parseInt(v, 10);\n return isNaN(n) ? v : n;\n};\nconst forceType = (a, b) => typeof a !== typeof b ? [String(a), String(b)] : [a, b];\nconst compareStrings = (a, b) => {\n if (isWildcard(a) || isWildcard(b))\n return 0;\n const [ap, bp] = forceType(tryParse(a), tryParse(b));\n if (ap > bp)\n return 1;\n if (ap < bp)\n return -1;\n return 0;\n};\nexport const compareSegments = (a, b) => {\n for (let i = 0; i < Math.max(a.length, b.length); i++) {\n const r = compareStrings(a[i] || '0', b[i] || '0');\n if (r !== 0)\n return r;\n }\n return 0;\n};\n//# sourceMappingURL=utils.js.map","/*!\n * excalibur - 0.30.1 - 2024-12-12\n * https://github.com/excaliburjs/Excalibur\n * Copyright (c) 2024 Excalibur.js \n * Licensed BSD-2-Clause\n * @preserve\n */\n/******/ var __webpack_modules__ = ({\n\n/***/ \"./Director/Loader.css\":\n/*!*****************************!*\\\n !*** ./Director/Loader.css ***!\n \\*****************************/\n/***/ ((module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/sourceMaps.js */ \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ \"../../node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `/* Buttons styles start */\r\n\r\nbutton#excalibur-play {\r\n display: inline-block;\r\n position: relative;\r\n z-index: 999;\r\n border-radius: 6px;\r\n border: none;\r\n /*border: 3px solid;\r\n border-color: white;\r\n box-shadow: 0 0 10px #ccc;*/\r\n padding: 1rem 1.5rem 1rem 4rem;\r\n margin: 0;\r\n text-decoration: none;\r\n background: #00b233;\r\n color: #ffffff;\r\n font-family: sans-serif;\r\n font-size: 2rem;\r\n white-space: nowrap;\r\n line-height: 1;\r\n cursor: pointer;\r\n text-align: center;\r\n transition:\r\n background 250ms ease-in-out,\r\n transform 150ms ease;\r\n -webkit-appearance: none;\r\n -moz-appearance: none;\r\n\r\n -webkit-animation: excalibur-button-fadein 200ms; /* Safari, Chrome and Opera > 12.1 */\r\n -moz-animation: excalibur-button-fadein 200ms; /* Firefox < 16 */\r\n -ms-animation: excalibur-button-fadein 200ms; /* Internet Explorer */\r\n -o-animation: excalibur-button-fadein 200ms; /* Opera < 12.1 */\r\n animation: excalibur-button-fadein 200ms;\r\n}\r\n\r\n/*\r\nbutton#excalibur-play {\r\n display: none;\r\n}*/\r\n\r\nbutton#excalibur-play:after {\r\n position: absolute;\r\n content: '';\r\n border: 8px solid;\r\n border-color: transparent transparent transparent white;\r\n left: 35px;\r\n top: 24px;\r\n width: 0;\r\n height: 0;\r\n}\r\n\r\nbutton#excalibur-play:before {\r\n position: absolute;\r\n content: '';\r\n border: 3px solid;\r\n left: 19px;\r\n top: 14px;\r\n border-radius: 20px;\r\n width: 30px;\r\n height: 30px;\r\n}\r\n\r\nbutton#excalibur-play:hover,\r\nbutton#excalibur-play:focus {\r\n background: #00982c;\r\n}\r\n\r\nbutton#excalibur-play:focus {\r\n outline: 1px solid #fff;\r\n outline-offset: -4px;\r\n}\r\n\r\nbutton#excalibur-play:active {\r\n transform: scale(0.99);\r\n}\r\n\r\n@keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n/* Firefox < 16 */\r\n@-moz-keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n/* Safari, Chrome and Opera > 12.1 */\r\n@-webkit-keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n/* Internet Explorer */\r\n@-ms-keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n/* Opera < 12.1 */\r\n@-o-keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./Director/Loader.css\"],\"names\":[],\"mappings\":\"AAAA,yBAAyB;;AAEzB;EACE,qBAAqB;EACrB,kBAAkB;EAClB,YAAY;EACZ,kBAAkB;EAClB,YAAY;EACZ;;+BAE6B;EAC7B,8BAA8B;EAC9B,SAAS;EACT,qBAAqB;EACrB,mBAAmB;EACnB,cAAc;EACd,uBAAuB;EACvB,eAAe;EACf,mBAAmB;EACnB,cAAc;EACd,eAAe;EACf,kBAAkB;EAClB;;wBAEsB;EACtB,wBAAwB;EACxB,qBAAqB;;EAErB,gDAAgD,EAAE,oCAAoC;EACtF,6CAA6C,EAAE,iBAAiB;EAChE,4CAA4C,EAAE,sBAAsB;EACpE,2CAA2C,EAAE,iBAAiB;EAC9D,wCAAwC;AAC1C;;AAEA;;;EAGE;;AAEF;EACE,kBAAkB;EAClB,WAAW;EACX,iBAAiB;EACjB,uDAAuD;EACvD,UAAU;EACV,SAAS;EACT,QAAQ;EACR,SAAS;AACX;;AAEA;EACE,kBAAkB;EAClB,WAAW;EACX,iBAAiB;EACjB,UAAU;EACV,SAAS;EACT,mBAAmB;EACnB,WAAW;EACX,YAAY;AACd;;AAEA;;EAEE,mBAAmB;AACrB;;AAEA;EACE,uBAAuB;EACvB,oBAAoB;AACtB;;AAEA;EACE,sBAAsB;AACxB;;AAEA;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF;;AAEA,iBAAiB;AACjB;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF;;AAEA,oCAAoC;AACpC;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF;;AAEA,sBAAsB;AACtB;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF;;AAEA,iBAAiB;AACjB;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF\",\"sourcesContent\":[\"/* Buttons styles start */\\r\\n\\r\\nbutton#excalibur-play {\\r\\n display: inline-block;\\r\\n position: relative;\\r\\n z-index: 999;\\r\\n border-radius: 6px;\\r\\n border: none;\\r\\n /*border: 3px solid;\\r\\n border-color: white;\\r\\n box-shadow: 0 0 10px #ccc;*/\\r\\n padding: 1rem 1.5rem 1rem 4rem;\\r\\n margin: 0;\\r\\n text-decoration: none;\\r\\n background: #00b233;\\r\\n color: #ffffff;\\r\\n font-family: sans-serif;\\r\\n font-size: 2rem;\\r\\n white-space: nowrap;\\r\\n line-height: 1;\\r\\n cursor: pointer;\\r\\n text-align: center;\\r\\n transition:\\r\\n background 250ms ease-in-out,\\r\\n transform 150ms ease;\\r\\n -webkit-appearance: none;\\r\\n -moz-appearance: none;\\r\\n\\r\\n -webkit-animation: excalibur-button-fadein 200ms; /* Safari, Chrome and Opera > 12.1 */\\r\\n -moz-animation: excalibur-button-fadein 200ms; /* Firefox < 16 */\\r\\n -ms-animation: excalibur-button-fadein 200ms; /* Internet Explorer */\\r\\n -o-animation: excalibur-button-fadein 200ms; /* Opera < 12.1 */\\r\\n animation: excalibur-button-fadein 200ms;\\r\\n}\\r\\n\\r\\n/*\\r\\nbutton#excalibur-play {\\r\\n display: none;\\r\\n}*/\\r\\n\\r\\nbutton#excalibur-play:after {\\r\\n position: absolute;\\r\\n content: '';\\r\\n border: 8px solid;\\r\\n border-color: transparent transparent transparent white;\\r\\n left: 35px;\\r\\n top: 24px;\\r\\n width: 0;\\r\\n height: 0;\\r\\n}\\r\\n\\r\\nbutton#excalibur-play:before {\\r\\n position: absolute;\\r\\n content: '';\\r\\n border: 3px solid;\\r\\n left: 19px;\\r\\n top: 14px;\\r\\n border-radius: 20px;\\r\\n width: 30px;\\r\\n height: 30px;\\r\\n}\\r\\n\\r\\nbutton#excalibur-play:hover,\\r\\nbutton#excalibur-play:focus {\\r\\n background: #00982c;\\r\\n}\\r\\n\\r\\nbutton#excalibur-play:focus {\\r\\n outline: 1px solid #fff;\\r\\n outline-offset: -4px;\\r\\n}\\r\\n\\r\\nbutton#excalibur-play:active {\\r\\n transform: scale(0.99);\\r\\n}\\r\\n\\r\\n@keyframes excalibur-button-fadein {\\r\\n from {\\r\\n opacity: 0;\\r\\n }\\r\\n to {\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n/* Firefox < 16 */\\r\\n@-moz-keyframes excalibur-button-fadein {\\r\\n from {\\r\\n opacity: 0;\\r\\n }\\r\\n to {\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n/* Safari, Chrome and Opera > 12.1 */\\r\\n@-webkit-keyframes excalibur-button-fadein {\\r\\n from {\\r\\n opacity: 0;\\r\\n }\\r\\n to {\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n/* Internet Explorer */\\r\\n@-ms-keyframes excalibur-button-fadein {\\r\\n from {\\r\\n opacity: 0;\\r\\n }\\r\\n to {\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n/* Opera < 12.1 */\\r\\n@-o-keyframes excalibur-button-fadein {\\r\\n from {\\r\\n opacity: 0;\\r\\n }\\r\\n to {\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n\n\n/***/ }),\n\n/***/ \"./Util/Toaster.css\":\n/*!**************************!*\\\n !*** ./Util/Toaster.css ***!\n \\**************************/\n/***/ ((module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/sourceMaps.js */ \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ \"../../node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `#ex-toast-container {\r\n position: absolute;\r\n height: 0;\r\n min-width: 50%;\r\n left: 50%;\r\n top: 0;\r\n}\r\n\r\n.ex-toast-message {\r\n left: -50%;\r\n position: relative;\r\n display: flex;\r\n justify-content: space-between;\r\n\r\n padding: 10px;\r\n margin-top: 5px;\r\n font-size: 18px;\r\n font-family: sans-serif;\r\n border-radius: 6px;\r\n border: 3px solid #b7b779;\r\n background-color: rgb(253, 253, 192);\r\n}\r\n\r\n.ex-toast-message button {\r\n align-self: flex-start;\r\n}\r\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./Util/Toaster.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,kBAAkB;EAClB,SAAS;EACT,cAAc;EACd,SAAS;EACT,MAAM;AACR;;AAEA;EACE,UAAU;EACV,kBAAkB;EAClB,aAAa;EACb,8BAA8B;;EAE9B,aAAa;EACb,eAAe;EACf,eAAe;EACf,uBAAuB;EACvB,kBAAkB;EAClB,yBAAyB;EACzB,oCAAoC;AACtC;;AAEA;EACE,sBAAsB;AACxB\",\"sourcesContent\":[\"#ex-toast-container {\\r\\n position: absolute;\\r\\n height: 0;\\r\\n min-width: 50%;\\r\\n left: 50%;\\r\\n top: 0;\\r\\n}\\r\\n\\r\\n.ex-toast-message {\\r\\n left: -50%;\\r\\n position: relative;\\r\\n display: flex;\\r\\n justify-content: space-between;\\r\\n\\r\\n padding: 10px;\\r\\n margin-top: 5px;\\r\\n font-size: 18px;\\r\\n font-family: sans-serif;\\r\\n border-radius: 6px;\\r\\n border: 3px solid #b7b779;\\r\\n background-color: rgb(253, 253, 192);\\r\\n}\\r\\n\\r\\n.ex-toast-message button {\\r\\n align-self: flex-start;\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n\n\n/***/ }),\n\n/***/ \"../../node_modules/css-loader/dist/runtime/api.js\":\n/*!*********************************************************!*\\\n !*** ../../node_modules/css-loader/dist/runtime/api.js ***!\n \\*********************************************************/\n/***/ ((module) => {\n\n\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\nmodule.exports = function (cssWithMappingToString) {\n var list = [];\n\n // return the list of modules as css string\n list.toString = function toString() {\n return this.map(function (item) {\n var content = \"\";\n var needLayer = typeof item[5] !== \"undefined\";\n if (item[4]) {\n content += \"@supports (\".concat(item[4], \") {\");\n }\n if (item[2]) {\n content += \"@media \".concat(item[2], \" {\");\n }\n if (needLayer) {\n content += \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\");\n }\n content += cssWithMappingToString(item);\n if (needLayer) {\n content += \"}\";\n }\n if (item[2]) {\n content += \"}\";\n }\n if (item[4]) {\n content += \"}\";\n }\n return content;\n }).join(\"\");\n };\n\n // import a list of modules into the list\n list.i = function i(modules, media, dedupe, supports, layer) {\n if (typeof modules === \"string\") {\n modules = [[null, modules, undefined]];\n }\n var alreadyImportedModules = {};\n if (dedupe) {\n for (var k = 0; k < this.length; k++) {\n var id = this[k][0];\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n for (var _k = 0; _k < modules.length; _k++) {\n var item = [].concat(modules[_k]);\n if (dedupe && alreadyImportedModules[item[0]]) {\n continue;\n }\n if (typeof layer !== \"undefined\") {\n if (typeof item[5] === \"undefined\") {\n item[5] = layer;\n } else {\n item[1] = \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\").concat(item[1], \"}\");\n item[5] = layer;\n }\n }\n if (media) {\n if (!item[2]) {\n item[2] = media;\n } else {\n item[1] = \"@media \".concat(item[2], \" {\").concat(item[1], \"}\");\n item[2] = media;\n }\n }\n if (supports) {\n if (!item[4]) {\n item[4] = \"\".concat(supports);\n } else {\n item[1] = \"@supports (\".concat(item[4], \") {\").concat(item[1], \"}\");\n item[4] = supports;\n }\n }\n list.push(item);\n }\n };\n return list;\n};\n\n/***/ }),\n\n/***/ \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\":\n/*!****************************************************************!*\\\n !*** ../../node_modules/css-loader/dist/runtime/sourceMaps.js ***!\n \\****************************************************************/\n/***/ ((module) => {\n\n\n\nmodule.exports = function (item) {\n var content = item[1];\n var cssMapping = item[3];\n if (!cssMapping) {\n return content;\n }\n if (typeof btoa === \"function\") {\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n var sourceMapping = \"/*# \".concat(data, \" */\");\n return [content].concat([sourceMapping]).join(\"\\n\");\n }\n return [content].join(\"\\n\");\n};\n\n/***/ }),\n\n/***/ \"./Graphics/Context/circle-renderer/circle-renderer.frag.glsl\":\n/*!********************************************************************!*\\\n !*** ./Graphics/Context/circle-renderer/circle-renderer.frag.glsl ***!\n \\********************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nprecision highp float;\\r\\n\\r\\n// UV coord\\r\\nin vec2 v_uv;\\r\\n\\r\\n// Color coord to blend with image\\r\\nin lowp vec4 v_color;\\r\\n\\r\\n// Stroke color if used\\r\\nin lowp vec4 v_strokeColor;\\r\\n\\r\\n// Stroke thickness if used\\r\\nin lowp float v_strokeThickness;\\r\\n\\r\\n// Opacity\\r\\nin float v_opacity;\\r\\n\\r\\nout vec4 fragColor;\\r\\n\\r\\nvoid main() {\\r\\n // make (0, 0) the center the uv \\r\\n vec2 uv = v_uv * 2.0 - 1.0;\\r\\n\\r\\n vec4 color = v_color;\\r\\n vec4 strokeColor = v_strokeColor;\\r\\n\\r\\n // circle border is at radius 1.0 \\r\\n // dist is > 0 when inside the circle \\r\\n float d = length(uv);\\r\\n float dist = 1.0 - length(uv);\\r\\n\\r\\n // Fade based on fwidth\\r\\n float fade = fwidth(dot(uv, uv));\\r\\n\\r\\n // if dist is greater than 0 step to 1;\\r\\n // when we cross this 0 threshold add a smooth fade\\r\\n float fill = smoothstep(-fade/2.0, fade/2.0, dist);\\r\\n\\r\\n // if dist is greater than the stroke thickness step to 1\\r\\n float stroke = 1.0 - smoothstep(v_strokeThickness, v_strokeThickness + fade, dist);\\r\\n\\r\\n strokeColor.a *= fill * stroke;\\r\\n strokeColor.rgb *= strokeColor.a;\\r\\n\\r\\n color.a *= fill * (1.0 - stroke);\\r\\n color.rgb *= color.a;\\r\\n\\r\\n vec4 finalColor = mix(vec4(0.0), (color + strokeColor), fill);\\r\\n finalColor.rgb = finalColor.rgb * v_opacity;\\r\\n finalColor.a = finalColor.a * v_opacity;\\r\\n fragColor = finalColor;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/circle-renderer/circle-renderer.vert.glsl\":\n/*!********************************************************************!*\\\n !*** ./Graphics/Context/circle-renderer/circle-renderer.vert.glsl ***!\n \\********************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nin vec2 a_position;\\r\\n\\r\\n// UV coordinate\\r\\nin vec2 a_uv;\\r\\nout vec2 v_uv;\\r\\n\\r\\n// Opacity \\r\\nin float a_opacity;\\r\\nout float v_opacity;\\r\\n\\r\\nin vec4 a_color;\\r\\nout vec4 v_color;\\r\\n\\r\\nin vec4 a_strokeColor;\\r\\nout vec4 v_strokeColor;\\r\\n\\r\\nin float a_strokeThickness;\\r\\nout float v_strokeThickness;\\r\\n\\r\\nuniform mat4 u_matrix;\\r\\n\\r\\n\\r\\nvoid main() {\\r\\n // Set the vertex position using the ortho transform matrix\\r\\n gl_Position = u_matrix * vec4(a_position, 0.0, 1.0);\\r\\n\\r\\n // Pass through UV coords\\r\\n v_uv = a_uv;\\r\\n // Pass through the Opacity to the fragment shader\\r\\n v_opacity = a_opacity;\\r\\n // Pass through the color to the fragment shader\\r\\n v_color = a_color;\\r\\n // Pass through the stroke color to the fragment shader\\r\\n v_strokeColor = a_strokeColor;\\r\\n // Pass through the stroke thickenss to the fragment shader\\r\\n v_strokeThickness = a_strokeThickness;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/image-renderer-v2/image-renderer-v2.frag.glsl\":\n/*!************************************************************************!*\\\n !*** ./Graphics/Context/image-renderer-v2/image-renderer-v2.frag.glsl ***!\n \\************************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nprecision mediump float;\\r\\n\\r\\n// UV coord\\r\\nin vec2 v_texcoord;\\r\\n\\r\\n// Textures in the current draw\\r\\nuniform sampler2D u_textures[%%count%%];\\r\\n\\r\\nuniform bool u_pixelart;\\r\\n\\r\\nin float v_texture_index;\\r\\n\\r\\nin float v_opacity;\\r\\n\\r\\nin vec4 v_tint;\\r\\n\\r\\n// texture resolution\\r\\nin vec2 v_res;\\r\\n\\r\\nin vec2 v_uv_min;\\r\\nin vec2 v_uv_max;\\r\\n\\r\\nout vec4 fragColor;\\r\\n\\r\\n// Inigo Quilez pixel art filter https://jorenjoestar.github.io/post/pixel_art_filtering/\\r\\nvec2 uv_iq(in vec2 uv, in vec2 texture_size) {\\r\\n vec2 pixel = uv * texture_size;\\r\\n\\r\\n vec2 seam=floor(pixel+.5);\\r\\n vec2 dudv=fwidth(pixel);\\r\\n pixel=seam+clamp((pixel-seam)/dudv,-.5,.5);\\r\\n\\r\\n return pixel/texture_size;\\r\\n}\\r\\n\\r\\nfloat lerp(float from, float to, float rel){\\r\\n return ((1. - rel) * from) + (rel * to);\\r\\n}\\r\\n\\r\\nfloat invLerp(float from, float to, float value){\\r\\n return (value - from) / (to - from);\\r\\n}\\r\\n\\r\\nfloat remap(float origFrom, float origTo, float targetFrom, float targetTo, float value){\\r\\n float rel = invLerp(origFrom, origTo, value);\\r\\n return lerp(targetFrom, targetTo, rel);\\r\\n}\\r\\n\\r\\nvoid main(){\\r\\n // In order to support the most efficient sprite batching, we have multiple\\r\\n // textures loaded into the gpu (usually 8) this picker logic skips over textures\\r\\n // that do not apply to a particular sprite.\\r\\n\\r\\n vec4 color=vec4(1.,0,0,1.);\\r\\n\\r\\n // GLSL is templated out to pick the right texture and set the vec4 color\\r\\n vec2 uv = u_pixelart ? uv_iq(v_texcoord, v_res) : v_texcoord;\\r\\n uv.x = remap(0.,1., v_uv_min.x, v_uv_max.x, uv.x);\\r\\n uv.y = remap(0.,1., v_uv_min.y, v_uv_max.y, uv.y);\\r\\n\\r\\n %%texture_picker%%\\r\\n\\r\\n color.rgb = color.rgb * v_opacity;\\r\\n color.a = color.a * v_opacity;\\r\\n fragColor = color * v_tint;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/image-renderer-v2/image-renderer-v2.vert.glsl\":\n/*!************************************************************************!*\\\n !*** ./Graphics/Context/image-renderer-v2/image-renderer-v2.vert.glsl ***!\n \\************************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nlayout(location=0) in vec2 pos;\\r\\nlayout(location=1) in vec2 a_texcoord;\\r\\nout vec2 v_texcoord;\\r\\n\\r\\nlayout(location=2) in vec2 a_offset;\\r\\nlayout(location=3) in vec2 a_mat_column1;\\r\\nlayout(location=4) in vec2 a_mat_column2;\\r\\nlayout(location=5) in vec2 a_mat_column3;\\r\\n\\r\\nlayout(location=6) in float a_opacity;\\r\\nout float v_opacity;\\r\\n\\r\\n// Texture resolution (could be bigger than a_siz)\\r\\nlayout(location=7) in vec2 a_res;\\r\\nout vec2 v_res;\\r\\n\\r\\n// Final size of graphic\\r\\nlayout(location=8) in vec2 a_size;\\r\\n\\r\\nlayout(location=9) in lowp float a_texture_index;\\r\\nout lowp float v_texture_index;\\r\\n\\r\\nlayout(location=10) in vec2 a_uv_min;\\r\\nout vec2 v_uv_min;\\r\\n\\r\\nlayout(location=11) in vec2 a_uv_max;\\r\\nout vec2 v_uv_max;\\r\\n\\r\\nlayout(location=12) in vec4 a_tint;\\r\\nout vec4 v_tint;\\r\\n\\r\\nuniform mat4 u_matrix;\\r\\n\\r\\nvoid main(){\\r\\n mat4 world_mat = mat4(\\r\\n a_mat_column1.x, a_mat_column1.y, 0., 0.,\\r\\n a_mat_column2.x, a_mat_column2.y, 0., 0.,\\r\\n 0. , 0. , 1., 0.,\\r\\n a_mat_column3.x, a_mat_column3.y, 0., 1.\\r\\n );\\r\\n\\r\\n vec2 newPos = vec2(pos.x * a_res.x, pos.y * a_res.y);\\r\\n gl_Position = u_matrix * world_mat * vec4(newPos + a_offset, 0., 1.);\\r\\n\\r\\n v_opacity = a_opacity;\\r\\n v_texcoord = a_texcoord;\\r\\n v_uv_min = a_uv_min;\\r\\n v_uv_max = a_uv_max;\\r\\n v_res = a_res;\\r\\n v_texture_index = a_texture_index;\\r\\n v_tint = a_tint;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/image-renderer/image-renderer.frag.glsl\":\n/*!******************************************************************!*\\\n !*** ./Graphics/Context/image-renderer/image-renderer.frag.glsl ***!\n \\******************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nprecision mediump float;\\r\\n\\r\\n// UV coord\\r\\nin vec2 v_texcoord;\\r\\n\\r\\n// Texture index\\r\\nin lowp float v_textureIndex;\\r\\n\\r\\n// Textures in the current draw\\r\\nuniform sampler2D u_textures[%%count%%];\\r\\n\\r\\nuniform bool u_pixelart;\\r\\n\\r\\n// Opacity\\r\\nin float v_opacity;\\r\\n\\r\\nin vec4 v_tint;\\r\\n\\r\\nin vec2 v_res;\\r\\n\\r\\nout vec4 fragColor;\\r\\n\\r\\n// Inigo Quilez pixel art filter https://jorenjoestar.github.io/post/pixel_art_filtering/\\r\\nvec2 uv_iq(in vec2 uv, in vec2 texture_size) {\\r\\n vec2 pixel = uv * texture_size;\\r\\n \\r\\n vec2 seam=floor(pixel+.5);\\r\\n vec2 dudv=fwidth(pixel);\\r\\n pixel=seam+clamp((pixel-seam)/dudv,-.5,.5);\\r\\n \\r\\n return pixel/texture_size;\\r\\n}\\r\\n\\r\\nvoid main(){\\r\\n // In order to support the most efficient sprite batching, we have multiple\\r\\n // textures loaded into the gpu (usually 8) this picker logic skips over textures\\r\\n // that do not apply to a particular sprite.\\r\\n \\r\\n vec4 color=vec4(1.,0,0,1.);\\r\\n \\r\\n // GLSL is templated out to pick the right texture and set the vec4 color\\r\\n %%texture_picker%%\\r\\n \\r\\n color.rgb=color.rgb*v_opacity;\\r\\n color.a=color.a*v_opacity;\\r\\n fragColor=color*v_tint;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/image-renderer/image-renderer.vert.glsl\":\n/*!******************************************************************!*\\\n !*** ./Graphics/Context/image-renderer/image-renderer.vert.glsl ***!\n \\******************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nin vec2 a_position;\\r\\n\\r\\n// Opacity\\r\\nin float a_opacity;\\r\\nout float v_opacity;\\r\\n\\r\\n// UV coordinate\\r\\nin vec2 a_texcoord;\\r\\nout vec2 v_texcoord;\\r\\n\\r\\n// Texture res\\r\\nin vec2 a_res;\\r\\nout vec2 v_res;\\r\\n\\r\\n// Texture number\\r\\nin lowp float a_textureIndex;\\r\\nout lowp float v_textureIndex;\\r\\n\\r\\nin vec4 a_tint;\\r\\nout vec4 v_tint;\\r\\n\\r\\nuniform mat4 u_matrix;\\r\\n\\r\\nvoid main(){\\r\\n // Set the vertex position using the ortho transform matrix\\r\\n gl_Position=u_matrix*vec4(a_position,0.,1.);\\r\\n \\r\\n // Pass through the Opacity to the fragment shader\\r\\n v_opacity=a_opacity;\\r\\n // Pass through the UV coord to the fragment shader\\r\\n v_texcoord=a_texcoord;\\r\\n\\r\\n v_res = a_res;\\r\\n\\r\\n // Pass through the texture number to the fragment shader\\r\\n v_textureIndex=a_textureIndex;\\r\\n // Pass through the tint\\r\\n v_tint=a_tint;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/line-renderer/line-fragment.glsl\":\n/*!***********************************************************!*\\\n !*** ./Graphics/Context/line-renderer/line-fragment.glsl ***!\n \\***********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nprecision mediump float;\\r\\n\\r\\n// Color\\r\\nin lowp vec4 v_color;\\r\\n\\r\\nout vec4 fragColor;\\r\\n\\r\\nvoid main() {\\r\\n fragColor = v_color;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/line-renderer/line-vertex.glsl\":\n/*!*********************************************************!*\\\n !*** ./Graphics/Context/line-renderer/line-vertex.glsl ***!\n \\*********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nin vec2 a_position;\\r\\nin vec4 a_color;\\r\\n\\r\\nout lowp vec4 v_color;\\r\\n\\r\\nuniform mat4 u_matrix;\\r\\n\\r\\nvoid main() {\\r\\n // Set the vertex position using the ortho transform matrix\\r\\n gl_Position = u_matrix * vec4(a_position, 0.0, 1.0);\\r\\n\\r\\n // Passthrough the color\\r\\n v_color = a_color;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/particle-renderer/particle-fragment.glsl\":\n/*!*******************************************************************!*\\\n !*** ./Graphics/Context/particle-renderer/particle-fragment.glsl ***!\n \\*******************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nprecision mediump float;\\r\\n\\r\\nuniform sampler2D graphic;\\r\\nuniform bool useTexture;\\r\\nuniform float maxLifeMs;\\r\\n\\r\\nuniform vec4 beginColor;\\r\\nuniform vec4 endColor;\\r\\nuniform bool fade;\\r\\nuniform float startOpacity;\\r\\n\\r\\nin float finalRotation;\\r\\nin float finalLifeMs;\\r\\nout vec4 fragColor;\\r\\n\\r\\nvoid main(){\\r\\n\\r\\n float lifePct = finalLifeMs / maxLifeMs;\\r\\n\\r\\n if (useTexture) {\\r\\n /** Draw texture */\\r\\n if (lifePct <= 0.) discard;\\r\\n float mid = .5;\\r\\n float cosine = cos(finalRotation);\\r\\n float sine = sin(finalRotation);\\r\\n vec2 rotated = vec2(cosine * (gl_PointCoord.x - mid) + sine * (gl_PointCoord.y - mid) + mid,\\r\\n cosine * (gl_PointCoord.y - mid) - sine * (gl_PointCoord.x - mid) + mid);\\r\\n vec4 color = texture(graphic, rotated);\\r\\n fragColor = color * (fade ? lifePct : 1.0);\\r\\n } else {\\r\\n /** Draw circle */\\r\\n if (lifePct <= 0.) discard;\\r\\n vec2 uv = gl_PointCoord.xy * 2.0 - 1.0;\\r\\n float dist = 1.0 - length(uv);\\r\\n float edge = fwidth(dot(uv, uv));\\r\\n float circle = smoothstep(-edge/2.0, edge/2.0, dist);\\r\\n vec3 color = mix(beginColor.rgb, endColor.rgb, 1.0 - lifePct);\\r\\n fragColor.rgb = color;\\r\\n fragColor.a = startOpacity * circle * (fade ? lifePct : 1.0);// * mix(beginColor.a, endColor.a, 1.0 - lifePct);\\r\\n fragColor.rgb *= fragColor.a;\\r\\n }\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/particle-renderer/particle-vertex.glsl\":\n/*!*****************************************************************!*\\\n !*** ./Graphics/Context/particle-renderer/particle-vertex.glsl ***!\n \\*****************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nprecision mediump float;\\r\\n\\r\\nuniform float deltaMs;\\r\\nuniform float maxLifeMs;\\r\\nuniform vec2 gravity;\\r\\nuniform vec2 focus;\\r\\nuniform float focusAccel;\\r\\nuniform mat4 u_matrix;\\r\\nuniform mat4 u_transform;\\r\\nuniform float startSize;\\r\\nuniform float endSize;\\r\\n// uniform sampler2D obstacle;\\r\\n\\r\\nlayout(location=0)in vec2 position;\\r\\nlayout(location=1)in vec2 velocity;\\r\\nlayout(location=2)in float rotation;\\r\\nlayout(location=3)in float angularVelocity;\\r\\nlayout(location=4)in float lifeMs;\\r\\n\\r\\n// TODO z index to handle buffer wrapping?\\r\\n\\r\\n// DO NOT RE-ORDER\\r\\nout vec2 finalPosition;\\r\\nout vec2 finalVelocity;\\r\\nout float finalRotation;\\r\\nout float finalAngularVelocity;\\r\\nout float finalLifeMs;\\r\\nvoid main(){\\r\\n // Evolve particle\\r\\n float seconds = deltaMs / 1000.;\\r\\n // euler integration\\r\\n // Weird artifact of re-using the same buffer layout for update/draw\\r\\n // we need differently named variables\\r\\n vec2 finalGravity = gravity + normalize(focus - position) * focusAccel;\\r\\n finalVelocity = velocity + finalGravity * seconds;\\r\\n finalPosition = position + velocity * seconds + finalGravity * .5 * seconds * seconds;\\r\\n finalRotation = rotation + angularVelocity * seconds;\\r\\n finalAngularVelocity = angularVelocity;\\r\\n finalLifeMs = clamp(lifeMs - deltaMs, 0., maxLifeMs);\\r\\n\\r\\n // Collision mask sampling\\r\\n // vec2 samplePoint = finalPosition / vec2(width, height);\\r\\n // vec4 collides = texture(obstacle, samplePoint);\\r\\n // if (distance(collides,vec4(0.)) > .01) {\\r\\n // // non opaque means we collide! recalc final pos/vel\\r\\n // vec2 newVelocity = velocity * -.1;// lose energy\\r\\n // finalVelocity = newVelocity + gravity * seconds;\\r\\n // finalPosition = position + newVelocity * seconds + gravity * .5 * seconds * seconds;\\r\\n // }\\r\\n\\r\\n float lifePercent = finalLifeMs / maxLifeMs;\\r\\n vec2 transformedPos = (u_matrix * u_transform * vec4(finalPosition,0.,1.)).xy;\\r\\n float scale = sqrt(u_transform[0][0] * u_transform[0][0] + u_transform[1][1] * u_transform[1][1]);\\r\\n gl_Position = vec4(transformedPos, 1.0 - lifePercent, 1.); // use life percent to sort z\\r\\n gl_PointSize = mix(startSize, endSize, 1.0 - lifePercent) * scale;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/point-renderer/point-fragment.glsl\":\n/*!*************************************************************!*\\\n !*** ./Graphics/Context/point-renderer/point-fragment.glsl ***!\n \\*************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\n\\r\\nprecision mediump float;\\r\\nin lowp vec4 v_color;\\r\\n\\r\\nout vec4 fragColor;\\r\\n\\r\\nvoid main() {\\r\\n float r = 0.0, delta = 0.0, alpha = 1.0;\\r\\n vec2 cxy = 2.0 * gl_PointCoord - 1.0;\\r\\n r = dot(cxy, cxy);\\r\\n\\r\\n delta = fwidth(r);\\r\\n alpha = 1.0 - smoothstep(1.0 - delta, 1.0 + delta, r);\\r\\n // \\\"premultiply\\\" the color by alpha\\r\\n vec4 color = v_color;\\r\\n color.a = color.a * alpha;\\r\\n color.rgb = color.rgb * color.a;\\r\\n fragColor = color;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/point-renderer/point-vertex.glsl\":\n/*!***********************************************************!*\\\n !*** ./Graphics/Context/point-renderer/point-vertex.glsl ***!\n \\***********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nin vec2 a_position;\\r\\nin vec4 a_color;\\r\\nin float a_size;\\r\\nout lowp vec4 v_color;\\r\\nuniform mat4 u_matrix;\\r\\n\\r\\nvoid main() {\\r\\n gl_Position = u_matrix * vec4(a_position, 0.0, 1.0);\\r\\n gl_PointSize = a_size * 2.0;\\r\\n v_color = a_color;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/rectangle-renderer/rectangle-renderer.frag.glsl\":\n/*!**************************************************************************!*\\\n !*** ./Graphics/Context/rectangle-renderer/rectangle-renderer.frag.glsl ***!\n \\**************************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\n\\r\\nprecision mediump float;\\r\\n\\r\\n// UV coord\\r\\nin vec2 v_uv;\\r\\n\\r\\nin vec2 v_size; // in pixels\\r\\n\\r\\n// Color coord to blend with image\\r\\nin lowp vec4 v_color;\\r\\n\\r\\n// Stroke color if used\\r\\nin lowp vec4 v_strokeColor;\\r\\n\\r\\n// Stroke thickness if used\\r\\nin lowp float v_strokeThickness; // in pixels\\r\\n\\r\\n// Opacity\\r\\nin float v_opacity;\\r\\n\\r\\nout vec4 fragColor;\\r\\n\\r\\nvoid main() {\\r\\n // modified from https://stackoverflow.com/questions/59197671/glsl-rounded-rectangle-with-variable-border\\r\\n vec2 uv = v_uv;\\r\\n vec2 fragCoord = uv * v_size;\\r\\n float maxX = v_size.x - v_strokeThickness;\\r\\n float minX = v_strokeThickness;\\r\\n float maxY = v_size.y - v_strokeThickness;\\r\\n float minY = v_strokeThickness;\\r\\n\\r\\n if (fragCoord.x < maxX && fragCoord.x > minX &&\\r\\n fragCoord.y < maxY && fragCoord.y > minY) {\\r\\n fragColor = v_color;\\r\\n } else {\\r\\n fragColor = v_strokeColor;\\r\\n }\\r\\n fragColor.a *= v_opacity;\\r\\n fragColor.rgb *= fragColor.a;\\r\\n\\r\\n // vec2 v2CenteredPos = abs(fragCoord - v_size.xy / 2.0);\\r\\n // vec2 v2HalfShapeSizePx = v_size.xy/2.0 - v_strokeThickness/2.0;\\r\\n\\r\\n // float fHalfBorderDist = 0.0;\\r\\n // float fHalfBorderThickness = 0.0;\\r\\n\\r\\n // if (fragCoord.x > max(v_radius, v_strokeThickness) && \\r\\n // fragCoord.x < v_size.x - max(v_radius, v_strokeThickness))\\r\\n // {\\r\\n // fHalfBorderDist = v2CenteredPos.y - v2HalfShapeSizePx.y;\\r\\n // fHalfBorderThickness = v_strokeThickness / 2.0;\\r\\n // }\\r\\n // else if (fragCoord.y > max(v_radius, v_strokeThickness) && \\r\\n // fragCoord.y < v_size.y - max(v_radius, v_strokeThickness))\\r\\n // {\\r\\n // fHalfBorderDist = v2CenteredPos.x - v2HalfShapeSizePx.x;\\r\\n // fHalfBorderThickness = v_strokeThickness / 2.0;\\r\\n // }\\r\\n // else\\r\\n // {\\r\\n // vec2 edgeVec = max(vec2(0.0), v_radius - vec2(\\r\\n // uv.x > 0.5 ? v_size.x - fragCoord.x : fragCoord.x,\\r\\n // uv.y > 0.5 ? v_size.y - fragCoord.y : fragCoord.y));\\r\\n \\r\\n // float ellipse_ab = v_radius-v_strokeThickness;\\r\\n // vec2 ellipse_isect = (v_strokeThickness > v_radius || v_strokeThickness > v_radius) ? vec2(0.0) :\\r\\n // edgeVec.xy * ellipse_ab*ellipse_ab / length(ellipse_ab*edgeVec.yx); \\r\\n \\r\\n // fHalfBorderThickness = (v_radius - length(ellipse_isect)) / 2.0;\\r\\n // fHalfBorderDist = length(edgeVec) - (v_radius - fHalfBorderThickness);\\r\\n // }\\r\\n\\r\\n // vec4 v4FromColor = v_strokeColor;\\r\\n // v4FromColor.rgb *= v4FromColor.a;\\r\\n // vec4 v4ToColor = vec4(0.0); // background color is transparent\\r\\n // if (fHalfBorderDist < 0.0) {\\r\\n // v4ToColor = v_color;\\r\\n // v4ToColor.rgb *= v4ToColor.a;\\r\\n // }\\r\\n\\r\\n // float mixPct = abs(fHalfBorderDist) - fHalfBorderThickness;\\r\\n\\r\\n // vec4 finalColor = mix(v4FromColor, v4ToColor, mixPct);\\r\\n // gl_FragColor = finalColor;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/rectangle-renderer/rectangle-renderer.vert.glsl\":\n/*!**************************************************************************!*\\\n !*** ./Graphics/Context/rectangle-renderer/rectangle-renderer.vert.glsl ***!\n \\**************************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nin vec2 a_position;\\r\\n\\r\\n// UV coordinate\\r\\nin vec2 a_uv;\\r\\nout vec2 v_uv;\\r\\n\\r\\nin vec2 a_size;\\r\\nout vec2 v_size;\\r\\n\\r\\n// Opacity \\r\\nin float a_opacity;\\r\\nout float v_opacity;\\r\\n\\r\\nin vec4 a_color;\\r\\nout vec4 v_color;\\r\\n\\r\\nin vec4 a_strokeColor;\\r\\nout vec4 v_strokeColor;\\r\\n\\r\\nin float a_strokeThickness;\\r\\nout float v_strokeThickness;\\r\\n\\r\\nuniform mat4 u_matrix;\\r\\n\\r\\n\\r\\nvoid main() {\\r\\n // Set the vertex position using the ortho transform matrix\\r\\n gl_Position = u_matrix * vec4(a_position, 0.0, 1.0);\\r\\n\\r\\n // Pass through UV coords\\r\\n v_uv = a_uv;\\r\\n // Pass through size\\r\\n v_size = a_size;\\r\\n // Pass through the Opacity to the fragment shader\\r\\n v_opacity = a_opacity;\\r\\n // Pass through the color to the fragment shader\\r\\n v_color = a_color;\\r\\n // Pass through the stroke color to the fragment shader\\r\\n v_strokeColor = a_strokeColor;\\r\\n // Pass through the stroke thickenss to the fragment shader\\r\\n v_strokeThickness = a_strokeThickness;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/screen-pass-painter/screen-fragment.glsl\":\n/*!*******************************************************************!*\\\n !*** ./Graphics/Context/screen-pass-painter/screen-fragment.glsl ***!\n \\*******************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nprecision mediump float;\\r\\n\\r\\n// Passed in from the vertex shader.\\r\\nin vec2 v_texcoord;\\r\\n\\r\\n// The texture.\\r\\nuniform sampler2D u_texture;\\r\\n\\r\\nout vec4 fragColor;\\r\\n\\r\\nvoid main() {\\r\\n fragColor = texture(u_texture, v_texcoord);\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/screen-pass-painter/screen-vertex.glsl\":\n/*!*****************************************************************!*\\\n !*** ./Graphics/Context/screen-pass-painter/screen-vertex.glsl ***!\n \\*****************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nin vec2 a_position;\\r\\n\\r\\nin vec2 a_texcoord;\\r\\nout vec2 v_texcoord;\\r\\n\\r\\nvoid main() {\\r\\n gl_Position = vec4(a_position, 0.0, 1.0);\\r\\n\\r\\n // Pass the texcoord to the fragment shader.\\r\\n v_texcoord = a_texcoord;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/PostProcessor/color-blind-fragment.glsl\":\n/*!**********************************************************!*\\\n !*** ./Graphics/PostProcessor/color-blind-fragment.glsl ***!\n \\**********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nprecision mediump float;\\r\\n// our texture\\r\\nuniform sampler2D u_image;\\r\\n// the texCoords passed in from the vertex shader.\\r\\nin vec2 v_texcoord;\\r\\n\\r\\n// color blind type\\r\\nuniform int u_type;\\r\\n\\r\\n// simulation?\\r\\nuniform bool u_simulate;\\r\\n\\r\\nout vec4 fragColor;\\r\\n\\r\\nvoid main() {\\r\\n vec4 o = texture(u_image, v_texcoord);\\r\\n // RGB to LMS matrix conversion\\r\\n float L = (17.8824 * o.r) + (43.5161 * o.g) + (4.11935 * o.b);\\r\\n float M = (3.45565 * o.r) + (27.1554 * o.g) + (3.86714 * o.b);\\r\\n float S = (0.0299566 * o.r) + (0.184309 * o.g) + (1.46709 * o.b);\\r\\n // Simulate color blindness\\r\\n float l;\\r\\n float m;\\r\\n float s;\\r\\n //MODE CODE//\\r\\n if (u_type == 0) {\\r\\n // Protanope\\r\\n l = 0.0 * L + 2.02344 * M + -2.52581 * S;\\r\\n m = 0.0 * L + 1.0 * M + 0.0 * S;\\r\\n s = 0.0 * L + 0.0 * M + 1.0 * S;;\\r\\n } else if (u_type == 1) {\\r\\n // Deuteranope\\r\\n l = 1.0 * L + 0.0 * M + 0.0 * S;\\r\\n m = 0.494207 * L + 0.0 * M + 1.24827 * S;\\r\\n s = 0.0 * L + 0.0 * M + 1.0 * S;\\r\\n } else if (u_type == 2) {\\r\\n // Tritanope\\r\\n l = 1.0 * L + 0.0 * M + 0.0 * S;\\r\\n m = 0.0 * L + 1.0 * M + 0.0 * S;\\r\\n s = -0.395913 * L + 0.801109 * M + 0.0 * S;\\r\\n }\\r\\n\\r\\n // LMS to RGB matrix conversion\\r\\n vec4 error; // simulate the colors\\r\\n error.r = (0.0809444479 * l) + (-0.130504409 * m) + (0.116721066 * s);\\r\\n error.g = (-0.0102485335 * l) + (0.0540193266 * m) + (-0.113614708 * s);\\r\\n error.b = (-0.000365296938 * l) + (-0.00412161469 * m) + (0.693511405 * s);\\r\\n error.a = 1.0;\\r\\n vec4 diff = o - error;\\r\\n vec4 correction; // correct the colors\\r\\n correction.r = 0.0;\\r\\n correction.g = (diff.r * 0.7) + (diff.g * 1.0);\\r\\n correction.b = (diff.r * 0.7) + (diff.b * 1.0);\\r\\n correction = o + correction;\\r\\n correction.a = o.a;\\r\\n //SIMULATE//\\r\\n\\r\\n // sim \\r\\n if (u_simulate) {\\r\\n fragColor = error.rgba;\\r\\n } else {\\r\\n fragColor = correction.rgba;\\r\\n }\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Actions/Action.ts\":\n/*!***************************!*\\\n !*** ./Actions/Action.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ nextActionId: () => (/* binding */ nextActionId)\n/* harmony export */ });\nlet _ACTION_ID = 0;\n/**\n *\n */\nfunction nextActionId() {\n return _ACTION_ID++;\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/ActionContext.ts\":\n/*!**********************************!*\\\n !*** ./Actions/ActionContext.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ActionContext: () => (/* binding */ ActionContext)\n/* harmony export */ });\n/* harmony import */ var _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Util/EasingFunctions */ \"./Util/EasingFunctions.ts\");\n/* harmony import */ var _ActionQueue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ActionQueue */ \"./Actions/ActionQueue.ts\");\n/* harmony import */ var _Action_Repeat__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./Action/Repeat */ \"./Actions/Action/Repeat.ts\");\n/* harmony import */ var _Action_RepeatForever__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./Action/RepeatForever */ \"./Actions/Action/RepeatForever.ts\");\n/* harmony import */ var _Action_MoveBy__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Action/MoveBy */ \"./Actions/Action/MoveBy.ts\");\n/* harmony import */ var _Action_MoveTo__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Action/MoveTo */ \"./Actions/Action/MoveTo.ts\");\n/* harmony import */ var _Action_RotateTo__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Action/RotateTo */ \"./Actions/Action/RotateTo.ts\");\n/* harmony import */ var _Action_RotateBy__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Action/RotateBy */ \"./Actions/Action/RotateBy.ts\");\n/* harmony import */ var _Action_ScaleTo__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Action/ScaleTo */ \"./Actions/Action/ScaleTo.ts\");\n/* harmony import */ var _Action_ScaleBy__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Action/ScaleBy */ \"./Actions/Action/ScaleBy.ts\");\n/* harmony import */ var _Action_CallMethod__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Action/CallMethod */ \"./Actions/Action/CallMethod.ts\");\n/* harmony import */ var _Action_EaseTo__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Action/EaseTo */ \"./Actions/Action/EaseTo.ts\");\n/* harmony import */ var _Action_EaseBy__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Action/EaseBy */ \"./Actions/Action/EaseBy.ts\");\n/* harmony import */ var _Action_Blink__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Action/Blink */ \"./Actions/Action/Blink.ts\");\n/* harmony import */ var _Action_Fade__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Action/Fade */ \"./Actions/Action/Fade.ts\");\n/* harmony import */ var _Action_Delay__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Action/Delay */ \"./Actions/Action/Delay.ts\");\n/* harmony import */ var _Action_Die__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./Action/Die */ \"./Actions/Action/Die.ts\");\n/* harmony import */ var _Action_Follow__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./Action/Follow */ \"./Actions/Action/Follow.ts\");\n/* harmony import */ var _Action_Meet__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./Action/Meet */ \"./Actions/Action/Meet.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Math */ \"./Math/vector.ts\");\n/* harmony import */ var _Action_Flash__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Action/Flash */ \"./Actions/Action/Flash.ts\");\n/* harmony import */ var _Action_CurveTo__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Action/CurveTo */ \"./Actions/Action/CurveTo.ts\");\n/* harmony import */ var _Action_CurveBy__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Action/CurveBy */ \"./Actions/Action/CurveBy.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * The fluent Action API allows you to perform \"actions\" on\n * {@apilink Actor | `actors`} such as following, moving, rotating, and\n * more. You can implement your own actions by implementing\n * the {@apilink Action} interface.\n */\nclass ActionContext {\n constructor(entity) {\n this._entity = entity;\n this._queue = new _ActionQueue__WEBPACK_IMPORTED_MODULE_0__.ActionQueue(entity);\n }\n getQueue() {\n return this._queue;\n }\n update(elapsed) {\n this._queue.update(elapsed);\n }\n /**\n * Clears all queued actions from the Actor\n */\n clearActions() {\n this._queue.clearActions();\n }\n runAction(action) {\n action.reset();\n this._queue.add(action);\n return this;\n }\n /**\n * Animates an actor with a specified bezier curve by an offset to the current position, the start point is assumed\n * to be the actors current position\n * @param options\n */\n curveBy(options) {\n this._queue.add(new _Action_CurveBy__WEBPACK_IMPORTED_MODULE_1__.CurveBy(this._entity, options));\n return this;\n }\n /**\n * Animates an actor with a specified bezier curve to an absolute world space coordinate, the start point is assumed\n * to be the actors current position\n * @param options\n */\n curveTo(options) {\n this._queue.add(new _Action_CurveTo__WEBPACK_IMPORTED_MODULE_2__.CurveTo(this._entity, options));\n return this;\n }\n easeTo(...args) {\n var _a, _b;\n let x = 0;\n let y = 0;\n let duration = 0;\n let easingFcn = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_3__.EasingFunctions.Linear;\n if (args[0] instanceof _Math__WEBPACK_IMPORTED_MODULE_4__.Vector) {\n x = args[0].x;\n y = args[0].y;\n duration = args[1];\n easingFcn = (_a = args[2]) !== null && _a !== void 0 ? _a : easingFcn;\n }\n else {\n x = args[0];\n y = args[1];\n duration = args[2];\n easingFcn = (_b = args[3]) !== null && _b !== void 0 ? _b : easingFcn;\n }\n this._queue.add(new _Action_EaseTo__WEBPACK_IMPORTED_MODULE_5__.EaseTo(this._entity, x, y, duration, easingFcn));\n return this;\n }\n easeBy(...args) {\n var _a, _b;\n let offsetX = 0;\n let offsetY = 0;\n let duration = 0;\n let easingFcn = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_3__.EasingFunctions.Linear;\n if (args[0] instanceof _Math__WEBPACK_IMPORTED_MODULE_4__.Vector) {\n offsetX = args[0].x;\n offsetY = args[0].y;\n duration = args[1];\n easingFcn = (_a = args[2]) !== null && _a !== void 0 ? _a : easingFcn;\n }\n else {\n offsetX = args[0];\n offsetY = args[1];\n duration = args[2];\n easingFcn = (_b = args[3]) !== null && _b !== void 0 ? _b : easingFcn;\n }\n this._queue.add(new _Action_EaseBy__WEBPACK_IMPORTED_MODULE_6__.EaseBy(this._entity, offsetX, offsetY, duration, easingFcn));\n return this;\n }\n moveTo(xOrPosOrOptions, yOrSpeed, speedOrUndefined) {\n let x = 0;\n let y = 0;\n let speed = 0;\n if (xOrPosOrOptions instanceof _Math__WEBPACK_IMPORTED_MODULE_4__.Vector) {\n x = xOrPosOrOptions.x;\n y = xOrPosOrOptions.y;\n speed = +(yOrSpeed !== null && yOrSpeed !== void 0 ? yOrSpeed : 0);\n this._queue.add(new _Action_MoveTo__WEBPACK_IMPORTED_MODULE_7__.MoveTo(this._entity, x, y, speed));\n }\n else if (typeof xOrPosOrOptions === 'number' && typeof yOrSpeed === 'number' && typeof speedOrUndefined === 'number') {\n x = xOrPosOrOptions;\n y = yOrSpeed;\n speed = speedOrUndefined;\n this._queue.add(new _Action_MoveTo__WEBPACK_IMPORTED_MODULE_7__.MoveTo(this._entity, x, y, speed));\n }\n else if ((0,_Action_MoveTo__WEBPACK_IMPORTED_MODULE_7__.isMoveToOptions)(xOrPosOrOptions)) {\n this._queue.add(new _Action_MoveTo__WEBPACK_IMPORTED_MODULE_7__.MoveToWithOptions(this._entity, xOrPosOrOptions));\n }\n return this;\n }\n moveBy(xOffsetOrVectorOrOptions, yOffsetOrSpeed, speedOrUndefined) {\n let xOffset = 0;\n let yOffset = 0;\n let speed = 0;\n if (xOffsetOrVectorOrOptions instanceof _Math__WEBPACK_IMPORTED_MODULE_4__.Vector && typeof yOffsetOrSpeed === 'number') {\n xOffset = xOffsetOrVectorOrOptions.x;\n yOffset = xOffsetOrVectorOrOptions.y;\n speed = yOffsetOrSpeed;\n this._queue.add(new _Action_MoveBy__WEBPACK_IMPORTED_MODULE_8__.MoveBy(this._entity, xOffset, yOffset, speed));\n }\n else if (typeof xOffsetOrVectorOrOptions === 'number' && typeof yOffsetOrSpeed === 'number' && typeof speedOrUndefined === 'number') {\n xOffset = xOffsetOrVectorOrOptions;\n yOffset = yOffsetOrSpeed;\n speed = speedOrUndefined;\n this._queue.add(new _Action_MoveBy__WEBPACK_IMPORTED_MODULE_8__.MoveBy(this._entity, xOffset, yOffset, speed));\n }\n else if ((0,_Action_MoveBy__WEBPACK_IMPORTED_MODULE_8__.isMoveByOptions)(xOffsetOrVectorOrOptions)) {\n this._queue.add(new _Action_MoveBy__WEBPACK_IMPORTED_MODULE_8__.MoveByWithOptions(this._entity, xOffsetOrVectorOrOptions));\n }\n return this;\n }\n rotateTo(angleRadiansOrOptions, speed, rotationType) {\n if (typeof angleRadiansOrOptions === 'number' && typeof speed === 'number') {\n this._queue.add(new _Action_RotateTo__WEBPACK_IMPORTED_MODULE_9__.RotateTo(this._entity, angleRadiansOrOptions, speed, rotationType));\n }\n else if (typeof angleRadiansOrOptions === 'object') {\n this._queue.add(new _Action_RotateTo__WEBPACK_IMPORTED_MODULE_9__.RotateToWithOptions(this._entity, angleRadiansOrOptions));\n }\n return this;\n }\n rotateBy(angleRadiansOffsetOrOptions, speed, rotationType) {\n if (typeof angleRadiansOffsetOrOptions === 'object') {\n this._queue.add(new _Action_RotateBy__WEBPACK_IMPORTED_MODULE_10__.RotateByWithOptions(this._entity, angleRadiansOffsetOrOptions));\n }\n else {\n this._queue.add(new _Action_RotateBy__WEBPACK_IMPORTED_MODULE_10__.RotateBy(this._entity, angleRadiansOffsetOrOptions, speed, rotationType));\n }\n return this;\n }\n scaleTo(sizeXOrVectorOrOptions, sizeYOrSpeed, speedXOrUndefined, speedYOrUndefined) {\n let sizeX = 1;\n let sizeY = 1;\n let speedX = 0;\n let speedY = 0;\n if ((0,_Action_ScaleTo__WEBPACK_IMPORTED_MODULE_11__.isScaleToOptions)(sizeXOrVectorOrOptions)) {\n this._queue.add(new _Action_ScaleTo__WEBPACK_IMPORTED_MODULE_11__.ScaleToWithOptions(this._entity, sizeXOrVectorOrOptions));\n return this;\n }\n if (sizeXOrVectorOrOptions instanceof _Math__WEBPACK_IMPORTED_MODULE_4__.Vector && sizeYOrSpeed instanceof _Math__WEBPACK_IMPORTED_MODULE_4__.Vector) {\n sizeX = sizeXOrVectorOrOptions.x;\n sizeY = sizeXOrVectorOrOptions.y;\n speedX = sizeYOrSpeed.x;\n speedY = sizeYOrSpeed.y;\n }\n if (typeof sizeXOrVectorOrOptions === 'number' && typeof sizeYOrSpeed === 'number') {\n sizeX = sizeXOrVectorOrOptions;\n sizeY = sizeYOrSpeed;\n speedX = speedXOrUndefined;\n speedY = speedYOrUndefined;\n }\n this._queue.add(new _Action_ScaleTo__WEBPACK_IMPORTED_MODULE_11__.ScaleTo(this._entity, sizeX, sizeY, speedX, speedY));\n return this;\n }\n scaleBy(sizeOffsetXOrVectorOrOptions, sizeOffsetYOrSpeed, speed) {\n if ((0,_Action_ScaleBy__WEBPACK_IMPORTED_MODULE_12__.isScaleByOptions)(sizeOffsetXOrVectorOrOptions)) {\n this._queue.add(new _Action_ScaleBy__WEBPACK_IMPORTED_MODULE_12__.ScaleByWithOptions(this._entity, sizeOffsetXOrVectorOrOptions));\n return this;\n }\n let sizeOffsetX = 1;\n let sizeOffsetY = 1;\n if (sizeOffsetXOrVectorOrOptions instanceof _Math__WEBPACK_IMPORTED_MODULE_4__.Vector) {\n sizeOffsetX = sizeOffsetXOrVectorOrOptions.x;\n sizeOffsetY = sizeOffsetXOrVectorOrOptions.y;\n speed = sizeOffsetYOrSpeed;\n }\n if (typeof sizeOffsetXOrVectorOrOptions === 'number' && typeof sizeOffsetYOrSpeed === 'number') {\n sizeOffsetX = sizeOffsetXOrVectorOrOptions;\n sizeOffsetY = sizeOffsetYOrSpeed;\n }\n this._queue.add(new _Action_ScaleBy__WEBPACK_IMPORTED_MODULE_12__.ScaleBy(this._entity, sizeOffsetX, sizeOffsetY, speed));\n return this;\n }\n /**\n * This method will cause an actor to blink (become visible and not\n * visible). Optionally, you may specify the number of blinks. Specify the amount of time\n * the actor should be visible per blink, and the amount of time not visible.\n * This method is part of the actor 'Action' fluent API allowing action chaining.\n * @param timeVisible The amount of time to stay visible per blink in milliseconds\n * @param timeNotVisible The amount of time to stay not visible per blink in milliseconds\n * @param numBlinks The number of times to blink\n */\n blink(timeVisible, timeNotVisible, numBlinks = 1) {\n this._queue.add(new _Action_Blink__WEBPACK_IMPORTED_MODULE_13__.Blink(this._entity, timeVisible, timeNotVisible, numBlinks));\n return this;\n }\n /**\n * This method will cause an actor's opacity to change from its current value\n * to the provided value by a specified time (in milliseconds). This method is\n * part of the actor 'Action' fluent API allowing action chaining.\n * @param opacity The ending opacity\n * @param duration The time it should take to fade the actor (in milliseconds)\n */\n fade(opacity, duration) {\n this._queue.add(new _Action_Fade__WEBPACK_IMPORTED_MODULE_14__.Fade(this._entity, opacity, duration));\n return this;\n }\n /**\n * This will cause an actor to flash a specific color for a period of time\n * @param color\n * @param duration The duration in milliseconds\n */\n flash(color, duration = 1000) {\n this._queue.add(new _Action_Flash__WEBPACK_IMPORTED_MODULE_15__.Flash(this._entity, color, duration));\n return this;\n }\n /**\n * This method will delay the next action from executing for a certain\n * amount of time (in milliseconds). This method is part of the actor\n * 'Action' fluent API allowing action chaining.\n * @param duration The amount of time to delay the next action in the queue from executing in milliseconds\n */\n delay(duration) {\n this._queue.add(new _Action_Delay__WEBPACK_IMPORTED_MODULE_16__.Delay(duration));\n return this;\n }\n /**\n * This method will add an action to the queue that will remove the actor from the\n * scene once it has completed its previous Any actions on the\n * action queue after this action will not be executed.\n */\n die() {\n this._queue.add(new _Action_Die__WEBPACK_IMPORTED_MODULE_17__.Die(this._entity));\n return this;\n }\n /**\n * This method allows you to call an arbitrary method as the next action in the\n * action queue. This is useful if you want to execute code in after a specific\n * action, i.e An actor arrives at a destination after traversing a path\n */\n callMethod(method) {\n this._queue.add(new _Action_CallMethod__WEBPACK_IMPORTED_MODULE_18__.CallMethod(method));\n return this;\n }\n /**\n * This method will cause the actor to repeat all of the actions built in\n * the `repeatBuilder` callback. If the number of repeats\n * is not specified it will repeat forever. This method is part of\n * the actor 'Action' fluent API allowing action chaining\n *\n * ```typescript\n * // Move up in a zig-zag by repeated moveBy's\n * actor.actions.repeat(repeatCtx => {\n * repeatCtx.moveBy(10, 0, 10);\n * repeatCtx.moveBy(0, 10, 10);\n * }, 5);\n * ```\n * @param repeatBuilder The builder to specify the repeatable list of actions\n * @param times The number of times to repeat all the previous actions in the action queue. If nothing is specified the actions\n * will repeat forever\n */\n repeat(repeatBuilder, times) {\n if (!times) {\n this.repeatForever(repeatBuilder);\n return this;\n }\n this._queue.add(new _Action_Repeat__WEBPACK_IMPORTED_MODULE_19__.Repeat(this._entity, repeatBuilder, times));\n return this;\n }\n /**\n * This method will cause the actor to repeat all of the actions built in\n * the `repeatBuilder` callback. If the number of repeats\n * is not specified it will repeat forever. This method is part of\n * the actor 'Action' fluent API allowing action chaining\n *\n * ```typescript\n * // Move up in a zig-zag by repeated moveBy's\n * actor.actions.repeat(repeatCtx => {\n * repeatCtx.moveBy(10, 0, 10);\n * repeatCtx.moveBy(0, 10, 10);\n * }, 5);\n * ```\n * @param repeatBuilder The builder to specify the repeatable list of actions\n */\n repeatForever(repeatBuilder) {\n this._queue.add(new _Action_RepeatForever__WEBPACK_IMPORTED_MODULE_20__.RepeatForever(this._entity, repeatBuilder));\n return this;\n }\n /**\n * This method will cause the entity to follow another at a specified distance\n * @param entity The entity to follow\n * @param followDistance The distance to maintain when following, if not specified the actor will follow at the current distance.\n */\n follow(entity, followDistance) {\n if (followDistance === undefined) {\n this._queue.add(new _Action_Follow__WEBPACK_IMPORTED_MODULE_21__.Follow(this._entity, entity));\n }\n else {\n this._queue.add(new _Action_Follow__WEBPACK_IMPORTED_MODULE_21__.Follow(this._entity, entity, followDistance));\n }\n return this;\n }\n /**\n * This method will cause the entity to move towards another until they\n * collide \"meet\" at a specified speed.\n * @param entity The entity to meet\n * @param speed The speed in pixels per second to move, if not specified it will match the speed of the other actor\n */\n meet(entity, speed) {\n if (speed === undefined) {\n this._queue.add(new _Action_Meet__WEBPACK_IMPORTED_MODULE_22__.Meet(this._entity, entity));\n }\n else {\n this._queue.add(new _Action_Meet__WEBPACK_IMPORTED_MODULE_22__.Meet(this._entity, entity, speed));\n }\n return this;\n }\n /**\n * Returns a promise that resolves when the current action queue up to now\n * is finished.\n */\n toPromise() {\n const temp = new Promise((resolve) => {\n this._queue.add(new _Action_CallMethod__WEBPACK_IMPORTED_MODULE_18__.CallMethod(() => {\n resolve();\n }));\n });\n return temp;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/ActionQueue.ts\":\n/*!********************************!*\\\n !*** ./Actions/ActionQueue.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ActionQueue: () => (/* binding */ ActionQueue)\n/* harmony export */ });\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n\n/**\n * Action Queues represent an ordered sequence of actions\n *\n * Action queues are part of the {@apilink ActionContext | `Action API`} and\n * store the list of actions to be executed for an {@apilink Actor}.\n *\n * Actors implement {@apilink Actor.actions} which can be manipulated by\n * advanced users to adjust the actions currently being executed in the\n * queue.\n */\nclass ActionQueue {\n constructor(entity) {\n this._actions = [];\n this._currentAction = null;\n this._completedActions = [];\n this._entity = entity;\n }\n /**\n * Add an action to the sequence\n * @param action\n */\n add(action) {\n this._actions.push(action);\n }\n /**\n * Remove an action by reference from the sequence\n * @param action\n */\n remove(action) {\n const index = this._actions.indexOf(action);\n this._actions.splice(index, 1);\n }\n /**\n * Removes all actions from this sequence\n */\n clearActions() {\n this._actions.length = 0;\n this._completedActions.length = 0;\n if (this._currentAction) {\n this._currentAction.stop();\n }\n }\n /**\n *\n * @returns The total list of actions in this sequence complete or not\n */\n getActions() {\n return this._actions.concat(this._completedActions);\n }\n getIncompleteActions() {\n return this._actions;\n }\n getCurrentAction() {\n return this._currentAction;\n }\n /**\n *\n * @returns `true` if there are more actions to process in the sequence\n */\n hasNext() {\n return this._actions.length > 0;\n }\n /**\n * @returns `true` if the current sequence of actions is done\n */\n isComplete() {\n return this._actions.length === 0;\n }\n /**\n * Resets the sequence of actions, this is used to restart a sequence from the beginning\n */\n reset() {\n this._actions = this.getActions();\n const len = this._actions.length;\n for (let i = 0; i < len; i++) {\n this._actions[i].reset();\n }\n this._completedActions = [];\n }\n /**\n * Update the queue which updates actions and handles completing actions\n * @param elapsed\n */\n update(elapsed) {\n if (this._actions.length > 0) {\n if (this._currentAction !== this._actions[0]) {\n this._currentAction = this._actions[0];\n this._entity.emit('actionstart', new _Events__WEBPACK_IMPORTED_MODULE_0__.ActionStartEvent(this._currentAction, this._entity));\n }\n this._currentAction.update(elapsed);\n if (this._currentAction.isComplete(this._entity)) {\n this._entity.emit('actioncomplete', new _Events__WEBPACK_IMPORTED_MODULE_0__.ActionCompleteEvent(this._currentAction, this._entity));\n const complete = this._actions.shift();\n if (complete) {\n this._completedActions.push(complete);\n }\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/ActionSequence.ts\":\n/*!******************************************!*\\\n !*** ./Actions/Action/ActionSequence.ts ***!\n \\******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ActionSequence: () => (/* binding */ ActionSequence)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _ActionContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ActionContext */ \"./Actions/ActionContext.ts\");\n\n\n/**\n * Action that can represent a sequence of actions, this can be useful in conjunction with\n * {@apilink ParallelActions} to run multiple sequences in parallel.\n */\nclass ActionSequence {\n constructor(entity, actionBuilder) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._stopped = false;\n this._sequenceBuilder = actionBuilder;\n this._sequenceContext = new _ActionContext__WEBPACK_IMPORTED_MODULE_1__.ActionContext(entity);\n this._actionQueue = this._sequenceContext.getQueue();\n this._sequenceBuilder(this._sequenceContext);\n }\n update(elapsed) {\n this._actionQueue.update(elapsed);\n }\n isComplete() {\n return this._stopped || this._actionQueue.isComplete();\n }\n stop() {\n this._stopped = true;\n }\n reset() {\n this._stopped = false;\n this._actionQueue.reset();\n }\n clone(entity) {\n return new ActionSequence(entity, this._sequenceBuilder);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/Blink.ts\":\n/*!*********************************!*\\\n !*** ./Actions/Action/Blink.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Blink: () => (/* binding */ Blink)\n/* harmony export */ });\n/* harmony import */ var _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Graphics/GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\nclass Blink {\n constructor(entity, timeVisible, timeNotVisible, numBlinks = 1) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._timeVisible = 0;\n this._timeNotVisible = 0;\n this._elapsedTime = 0;\n this._totalTime = 0;\n this._stopped = false;\n this._started = false;\n this._graphics = entity.get(_Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_1__.GraphicsComponent);\n this._timeVisible = timeVisible;\n this._timeNotVisible = timeNotVisible;\n this._duration = (timeVisible + timeNotVisible) * numBlinks;\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._elapsedTime = 0;\n this._totalTime = 0;\n }\n if (!this._graphics) {\n return;\n }\n this._elapsedTime += elapsed;\n this._totalTime += elapsed;\n if (this._graphics.isVisible && this._elapsedTime >= this._timeVisible) {\n this._graphics.isVisible = false;\n this._elapsedTime = 0;\n }\n if (!this._graphics.isVisible && this._elapsedTime >= this._timeNotVisible) {\n this._graphics.isVisible = true;\n this._elapsedTime = 0;\n }\n if (this.isComplete()) {\n this._graphics.isVisible = true;\n }\n }\n isComplete() {\n return this._stopped || this._totalTime >= this._duration;\n }\n stop() {\n if (this._graphics) {\n this._graphics.isVisible = true;\n }\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n this._elapsedTime = 0;\n this._totalTime = 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/CallMethod.ts\":\n/*!**************************************!*\\\n !*** ./Actions/Action/CallMethod.ts ***!\n \\**************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CallMethod: () => (/* binding */ CallMethod)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\nclass CallMethod {\n constructor(method) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._hasBeenCalled = false;\n this._method = method;\n }\n update(elapsed) {\n this._method();\n this._hasBeenCalled = true;\n }\n isComplete() {\n return this._hasBeenCalled;\n }\n reset() {\n this._hasBeenCalled = false;\n }\n stop() {\n this._hasBeenCalled = true;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/CurveBy.ts\":\n/*!***********************************!*\\\n !*** ./Actions/Action/CurveBy.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CurveBy: () => (/* binding */ CurveBy)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../EntityComponentSystem */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math */ \"./Math/bezier-curve.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math */ \"./Math/vector.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Math */ \"./Math/util.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math */ \"./Math/lerp.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\nclass CurveBy {\n constructor(entity, options) {\n var _a;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._mode = 'dynamic';\n this._entity = entity;\n this._tx = this._entity.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n if (!this._tx) {\n throw new Error(`Entity ${entity.name} has no TransformComponent, can only curveTo on Entities with TransformComponents.`);\n }\n this._curve = this._curve = new _Math__WEBPACK_IMPORTED_MODULE_2__.BezierCurve({\n controlPoints: [(0,_Math__WEBPACK_IMPORTED_MODULE_3__.vec)(0, 0), ...options.controlPoints],\n quality: options.quality\n });\n this._durationMs = options.duration;\n this._mode = (_a = options.mode) !== null && _a !== void 0 ? _a : this._mode;\n this._currentMs = this._durationMs;\n }\n update(elapsed) {\n if (!this._started) {\n this._curve.setControlPoint(0, this._tx.globalPos);\n this._curve.setControlPoint(1, this._curve.controlPoints[1].add(this._tx.globalPos));\n this._curve.setControlPoint(2, this._curve.controlPoints[2].add(this._tx.globalPos));\n this._curve.setControlPoint(3, this._curve.controlPoints[3].add(this._tx.globalPos));\n this._started = true;\n }\n this._currentMs -= elapsed;\n const t = (0,_Math__WEBPACK_IMPORTED_MODULE_4__.clamp)((0,_Math__WEBPACK_IMPORTED_MODULE_5__.remap)(0, this._durationMs, 0, 1, this._durationMs - this._currentMs), 0, 1);\n if (this._mode === 'dynamic') {\n this._tx.pos = this._curve.getPoint(t);\n }\n else {\n this._tx.pos = this._curve.getUniformPoint(t);\n }\n if (this.isComplete(this._entity)) {\n if (this._mode === 'dynamic') {\n this._tx.pos = this._curve.getPoint(1);\n }\n else {\n this._tx.pos = this._curve.getUniformPoint(1);\n }\n }\n }\n isComplete(entity) {\n return this._stopped || this._currentMs < 0;\n }\n reset() {\n this._currentMs = this._durationMs;\n this._started = false;\n this._stopped = false;\n }\n stop() {\n this._stopped = true;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/CurveTo.ts\":\n/*!***********************************!*\\\n !*** ./Actions/Action/CurveTo.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CurveTo: () => (/* binding */ CurveTo)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../EntityComponentSystem */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math */ \"./Math/bezier-curve.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math */ \"./Math/vector.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Math */ \"./Math/util.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math */ \"./Math/lerp.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\nclass CurveTo {\n constructor(entity, options) {\n var _a;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._mode = 'dynamic';\n this._entity = entity;\n this._tx = this._entity.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n if (!this._tx) {\n throw new Error(`Entity ${entity.name} has no TransformComponent, can only curveTo on Entities with TransformComponents.`);\n }\n this._curve = new _Math__WEBPACK_IMPORTED_MODULE_2__.BezierCurve({\n controlPoints: [(0,_Math__WEBPACK_IMPORTED_MODULE_3__.vec)(0, 0), ...options.controlPoints],\n quality: options.quality\n });\n this._durationMs = options.duration;\n this._mode = (_a = options.mode) !== null && _a !== void 0 ? _a : this._mode;\n this._currentMs = this._durationMs;\n }\n update(elapsed) {\n if (!this._started) {\n this._curve.setControlPoint(0, this._tx.globalPos.clone());\n this._started = true;\n }\n this._currentMs -= elapsed;\n const t = (0,_Math__WEBPACK_IMPORTED_MODULE_4__.clamp)((0,_Math__WEBPACK_IMPORTED_MODULE_5__.remap)(0, this._durationMs, 0, 1, this._durationMs - this._currentMs), 0, 1);\n if (this._mode === 'dynamic') {\n this._tx.pos = this._curve.getPoint(t);\n }\n else {\n this._tx.pos = this._curve.getUniformPoint(t);\n }\n if (this.isComplete(this._entity)) {\n if (this._mode === 'dynamic') {\n this._tx.pos = this._curve.getPoint(1);\n }\n else {\n this._tx.pos = this._curve.getUniformPoint(1);\n }\n }\n }\n isComplete(entity) {\n return this._stopped || this._currentMs < 0;\n }\n reset() {\n this._currentMs = this._durationMs;\n this._started = false;\n this._stopped = false;\n }\n stop() {\n this._stopped = true;\n this._currentMs = 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/Delay.ts\":\n/*!*********************************!*\\\n !*** ./Actions/Action/Delay.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Delay: () => (/* binding */ Delay)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\nclass Delay {\n constructor(duration) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._elapsedTime = 0;\n this._started = false;\n this._stopped = false;\n this._delay = duration;\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n }\n this._elapsedTime += elapsed;\n }\n isComplete() {\n return this._stopped || this._elapsedTime >= this._delay;\n }\n stop() {\n this._stopped = true;\n }\n reset() {\n this._elapsedTime = 0;\n this._started = false;\n this._stopped = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/Die.ts\":\n/*!*******************************!*\\\n !*** ./Actions/Action/Die.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Die: () => (/* binding */ Die)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _ActionsComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ActionsComponent */ \"./Actions/ActionsComponent.ts\");\n\n\nclass Die {\n constructor(entity) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._stopped = false;\n this._entity = entity;\n }\n update(elapsed) {\n this._entity.get(_ActionsComponent__WEBPACK_IMPORTED_MODULE_1__.ActionsComponent).clearActions();\n this._entity.kill();\n this._stopped = true;\n }\n isComplete() {\n return this._stopped;\n }\n stop() {\n return;\n }\n reset() {\n return;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/EaseBy.ts\":\n/*!**********************************!*\\\n !*** ./Actions/Action/EaseBy.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EaseBy: () => (/* binding */ EaseBy)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\n\n/**\n * @deprecated use moveBy({offset: Vector, duration: number, easing: EasingFunction})\n */\nclass EaseBy {\n constructor(entity, offsetX, offsetY, duration, easingFcn) {\n this.easingFcn = easingFcn;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._currentLerpTime = 0;\n this._lerpDuration = 1 * 1000; // 1 second\n this._lerpStart = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(0, 0);\n this._lerpEnd = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(0, 0);\n this._initialized = false;\n this._stopped = false;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__.MotionComponent);\n this._lerpDuration = duration;\n this._offset = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(offsetX, offsetY);\n }\n _initialize() {\n this._lerpStart = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this._tx.pos.x, this._tx.pos.y);\n this._currentLerpTime = 0;\n this._lerpEnd = this._lerpStart.add(this._offset);\n }\n update(elapsed) {\n if (!this._initialized) {\n this._initialize();\n this._initialized = true;\n }\n // Need to update lerp time first, otherwise the first update will always be zero\n this._currentLerpTime += elapsed;\n let newX = this._tx.pos.x;\n let newY = this._tx.pos.y;\n if (this._currentLerpTime < this._lerpDuration) {\n if (this._lerpEnd.x < this._lerpStart.x) {\n newX =\n this._lerpStart.x -\n (this.easingFcn(this._currentLerpTime, this._lerpEnd.x, this._lerpStart.x, this._lerpDuration) - this._lerpEnd.x);\n }\n else {\n newX = this.easingFcn(this._currentLerpTime, this._lerpStart.x, this._lerpEnd.x, this._lerpDuration);\n }\n if (this._lerpEnd.y < this._lerpStart.y) {\n newY =\n this._lerpStart.y -\n (this.easingFcn(this._currentLerpTime, this._lerpEnd.y, this._lerpStart.y, this._lerpDuration) - this._lerpEnd.y);\n }\n else {\n newY = this.easingFcn(this._currentLerpTime, this._lerpStart.y, this._lerpEnd.y, this._lerpDuration);\n }\n // Given the lerp position figure out the velocity in pixels per second\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)((newX - this._tx.pos.x) / (elapsed / 1000), (newY - this._tx.pos.y) / (elapsed / 1000));\n }\n else {\n this._tx.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(this._lerpEnd.x, this._lerpEnd.y);\n this._motion.vel = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n }\n }\n isComplete() {\n return this._stopped || this._currentLerpTime >= this._lerpDuration;\n }\n reset() {\n this._initialized = false;\n this._stopped = false;\n this._currentLerpTime = 0;\n }\n stop() {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0);\n this._stopped = true;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/EaseTo.ts\":\n/*!**********************************!*\\\n !*** ./Actions/Action/EaseTo.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EaseTo: () => (/* binding */ EaseTo)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\n\n/**\n * @deprecated use moveTo({pos: Vector, duration: number, easing: EasingFunction})\n */\nclass EaseTo {\n constructor(entity, x, y, duration, easingFcn) {\n this.easingFcn = easingFcn;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._currentLerpTime = 0;\n this._lerpDuration = 1 * 1000; // 1 second\n this._lerpStart = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(0, 0);\n this._lerpEnd = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(0, 0);\n this._initialized = false;\n this._stopped = false;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__.MotionComponent);\n this._lerpDuration = duration;\n this._lerpEnd = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(x, y);\n }\n _initialize() {\n this._lerpStart = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this._tx.pos.x, this._tx.pos.y);\n this._currentLerpTime = 0;\n }\n update(elapsed) {\n if (!this._initialized) {\n this._initialize();\n this._initialized = true;\n }\n // Need to update lerp time first, otherwise the first update will always be zero\n this._currentLerpTime += elapsed;\n let newX = this._tx.pos.x;\n let newY = this._tx.pos.y;\n if (this._currentLerpTime < this._lerpDuration) {\n if (this._lerpEnd.x < this._lerpStart.x) {\n newX =\n this._lerpStart.x -\n (this.easingFcn(this._currentLerpTime, this._lerpEnd.x, this._lerpStart.x, this._lerpDuration) - this._lerpEnd.x);\n }\n else {\n newX = this.easingFcn(this._currentLerpTime, this._lerpStart.x, this._lerpEnd.x, this._lerpDuration);\n }\n if (this._lerpEnd.y < this._lerpStart.y) {\n newY =\n this._lerpStart.y -\n (this.easingFcn(this._currentLerpTime, this._lerpEnd.y, this._lerpStart.y, this._lerpDuration) - this._lerpEnd.y);\n }\n else {\n newY = this.easingFcn(this._currentLerpTime, this._lerpStart.y, this._lerpEnd.y, this._lerpDuration);\n }\n // Given the lerp position figure out the velocity in pixels per second\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)((newX - this._tx.pos.x) / (elapsed / 1000), (newY - this._tx.pos.y) / (elapsed / 1000));\n }\n else {\n this._tx.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(this._lerpEnd.x, this._lerpEnd.y);\n this._motion.vel = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n }\n }\n isComplete() {\n return this._stopped || this._currentLerpTime >= this._lerpDuration;\n }\n reset() {\n this._initialized = false;\n this._stopped = false;\n this._currentLerpTime = 0;\n }\n stop() {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0);\n this._stopped = true;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/Fade.ts\":\n/*!********************************!*\\\n !*** ./Actions/Action/Fade.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Fade: () => (/* binding */ Fade)\n/* harmony export */ });\n/* harmony import */ var _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Graphics/GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\nclass Fade {\n constructor(entity, endOpacity, duration) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._multiplier = 1;\n this._started = false;\n this._stopped = false;\n this._graphics = entity.get(_Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_1__.GraphicsComponent);\n this._endOpacity = endOpacity;\n this._remainingTime = this._originalTime = duration;\n }\n update(elapsed) {\n if (!this._graphics) {\n return;\n }\n if (!this._started) {\n this._started = true;\n this._remainingTime = this._originalTime;\n // determine direction when we start\n if (this._endOpacity < this._graphics.opacity) {\n this._multiplier = -1;\n }\n else {\n this._multiplier = 1;\n }\n }\n if (this._remainingTime > 0) {\n this._graphics.opacity += (this._multiplier * (Math.abs(this._graphics.opacity - this._endOpacity) * elapsed)) / this._remainingTime;\n }\n this._remainingTime -= elapsed;\n if (this.isComplete()) {\n this._graphics.opacity = this._endOpacity;\n }\n _Util_Log__WEBPACK_IMPORTED_MODULE_2__.Logger.getInstance().debug('[Action fade] Actor opacity:', this._graphics.opacity);\n }\n isComplete() {\n return this._stopped || this._remainingTime <= 0;\n }\n stop() {\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n this._remainingTime = this._originalTime;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/Flash.ts\":\n/*!*********************************!*\\\n !*** ./Actions/Action/Flash.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Flash: () => (/* binding */ Flash)\n/* harmony export */ });\n/* harmony import */ var _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Graphics/GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\nclass Flash {\n constructor(entity, color, duration = 1000) {\n var _a;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._stopped = false;\n this._started = false;\n this._total = 0;\n this._currentDuration = 0;\n this._graphics = entity.get(_Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_1__.GraphicsComponent);\n this._duration = duration;\n this._entity = entity;\n this._material = (_a = entity.scene) === null || _a === void 0 ? void 0 : _a.engine.graphicsContext.createMaterial({\n name: 'flash-material',\n color,\n fragmentSource: `#version 300 es\r\n \r\n precision mediump float;\r\n uniform float u_blend;\r\n uniform sampler2D u_graphic;\r\n uniform vec4 u_color;\r\n \r\n in vec2 v_uv; \r\n out vec4 color;\r\n \r\n void main() { \r\n vec4 textureColor = texture(u_graphic, v_uv); \r\n color = mix(textureColor, u_color, u_blend * textureColor.a);\r\n color.rgb = color.rgb * color.a;\r\n }`\n });\n this._total = duration;\n }\n update(elapsed) {\n var _a;\n if (!this._started) {\n this._started = true;\n this._total = this._duration;\n this._currentDuration = this._duration;\n this._entity.graphics.material = this._material;\n }\n if (!this._graphics) {\n return;\n }\n this._currentDuration -= elapsed;\n if (this._graphics) {\n (_a = this._material) === null || _a === void 0 ? void 0 : _a.update((shader) => {\n shader.trySetUniformFloat('u_blend', this._currentDuration / this._total);\n });\n }\n if (this.isComplete()) {\n this._entity.graphics.material = null;\n }\n }\n isComplete() {\n return this._stopped || this._currentDuration <= 0;\n }\n stop() {\n if (this._graphics) {\n this._graphics.isVisible = true;\n }\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/Follow.ts\":\n/*!**********************************!*\\\n !*** ./Actions/Action/Follow.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Follow: () => (/* binding */ Follow)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\n\nclass Follow {\n constructor(entity, entityToFollow, followDistance) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n this._followTx = entityToFollow.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._followMotion = entityToFollow.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n this._current = new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(this._tx.pos.x, this._tx.pos.y);\n this._end = new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(this._followTx.pos.x, this._followTx.pos.y);\n this._maximumDistance = followDistance !== undefined ? followDistance : this._current.distance(this._end);\n this._speed = 0;\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._distanceBetween = this._current.distance(this._end);\n this._dir = this._end.sub(this._current).normalize();\n }\n const actorToFollowSpeed = Math.sqrt(Math.pow(this._followMotion.vel.x, 2) + Math.pow(this._followMotion.vel.y, 2));\n if (actorToFollowSpeed !== 0) {\n this._speed = actorToFollowSpeed;\n }\n this._current = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this._tx.pos.x, this._tx.pos.y);\n this._end = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this._followTx.pos.x, this._followTx.pos.y);\n this._distanceBetween = this._current.distance(this._end);\n this._dir = this._end.sub(this._current).normalize();\n if (this._distanceBetween >= this._maximumDistance) {\n const m = this._dir.scale(this._speed);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(m.x, m.y);\n }\n else {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(0, 0);\n }\n if (this.isComplete()) {\n this._tx.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this._end.x, this._end.y);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(0, 0);\n }\n }\n stop() {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(0, 0);\n this._stopped = true;\n }\n isComplete() {\n // the actor following should never stop unless specified to do so\n return this._stopped;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/Meet.ts\":\n/*!********************************!*\\\n !*** ./Actions/Action/Meet.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Meet: () => (/* binding */ Meet)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\n\nclass Meet {\n constructor(actor, actorToMeet, speed) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._speedWasSpecified = false;\n this._tx = actor.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._motion = actor.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n this._meetTx = actorToMeet.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._meetMotion = actorToMeet.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n this._current = new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(this._tx.pos.x, this._tx.pos.y);\n this._end = new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(this._meetTx.pos.x, this._meetTx.pos.y);\n this._speed = speed || 0;\n if (speed !== undefined) {\n this._speedWasSpecified = true;\n }\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._distanceBetween = this._current.distance(this._end);\n this._dir = this._end.sub(this._current).normalize();\n }\n const actorToMeetSpeed = Math.sqrt(Math.pow(this._meetMotion.vel.x, 2) + Math.pow(this._meetMotion.vel.y, 2));\n if (actorToMeetSpeed !== 0 && !this._speedWasSpecified) {\n this._speed = actorToMeetSpeed;\n }\n this._current = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this._tx.pos.x, this._tx.pos.y);\n this._end = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this._meetTx.pos.x, this._meetTx.pos.y);\n this._distanceBetween = this._current.distance(this._end);\n this._dir = this._end.sub(this._current).normalize();\n const m = this._dir.scale(this._speed);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(m.x, m.y);\n if (this.isComplete()) {\n this._tx.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this._end.x, this._end.y);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(0, 0);\n }\n }\n isComplete() {\n return this._stopped || this._distanceBetween <= 1;\n }\n stop() {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(0, 0);\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n this._distanceBetween = Infinity;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/MoveBy.ts\":\n/*!**********************************!*\\\n !*** ./Actions/Action/MoveBy.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MoveBy: () => (/* binding */ MoveBy),\n/* harmony export */ MoveByWithOptions: () => (/* binding */ MoveByWithOptions),\n/* harmony export */ isMoveByOptions: () => (/* binding */ isMoveByOptions)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math */ \"./Math/util.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../Math */ \"./Math/lerp.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Util/EasingFunctions */ \"./Util/EasingFunctions.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\n\n\n\n\n/**\n *\n */\nfunction isMoveByOptions(x) {\n return x.offset instanceof _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector && typeof x.duration === 'number';\n}\nclass MoveByWithOptions {\n constructor(entity, options) {\n var _a;\n this.entity = entity;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_1__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._easing = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_2__.EasingFunctions.Linear;\n this._offset = options.offset;\n this._easing = (_a = options.easing) !== null && _a !== void 0 ? _a : this._easing;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_4__.MotionComponent);\n if (!this._tx) {\n throw new Error(`Entity ${entity.name} has no TransformComponent, can only MoveBy on Entities with TransformComponents.`);\n }\n this._durationMs = options.duration;\n this._currentMs = this._durationMs;\n }\n update(elapsed) {\n if (!this._started) {\n this._start = this._tx.pos.clone();\n this._end = this._start.add(this._offset);\n this._started = true;\n }\n this._currentMs -= elapsed;\n const t = (0,_Math__WEBPACK_IMPORTED_MODULE_5__.clamp)((0,_Math__WEBPACK_IMPORTED_MODULE_6__.remap)(0, this._durationMs, 0, 1, this._durationMs - this._currentMs), 0, 1);\n const currentPos = this._tx.pos;\n const newPosX = this._easing(t, this._start.x, this._end.x, 1);\n const newPosY = this._easing(t, this._start.y, this._end.y, 1);\n const velX = (newPosX - currentPos.x) / (elapsed / 1000);\n const velY = (newPosY - currentPos.y) / (elapsed / 1000);\n this._motion.vel.x = velX;\n this._motion.vel.y = velY;\n if (this.isComplete(this.entity)) {\n this._tx.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this._end.x, this._end.y);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n }\n }\n isComplete(entity) {\n return this._stopped || this._currentMs < 0;\n }\n stop() {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n this._stopped = true;\n this._currentMs = 0;\n }\n reset() {\n this._currentMs = this._durationMs;\n this._started = false;\n this._stopped = false;\n }\n}\nclass MoveBy {\n constructor(entity, offsetX, offsetY, speed) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_1__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._entity = entity;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_4__.MotionComponent);\n this._speed = speed;\n this._offset = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(offsetX, offsetY);\n if (speed <= 0) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_7__.Logger.getInstance().error('Attempted to moveBy with speed less than or equal to zero : ' + speed);\n throw new Error('Speed must be greater than 0 pixels per second');\n }\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._start = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(this._tx.pos.x, this._tx.pos.y);\n this._end = this._start.add(this._offset);\n this._distance = this._offset.magnitude;\n this._dir = this._end.sub(this._start).normalize();\n }\n if (this.isComplete(this._entity)) {\n this._tx.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this._end.x, this._end.y);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n }\n else {\n this._motion.vel = this._dir.scale(this._speed);\n }\n }\n isComplete(entity) {\n const tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__.TransformComponent);\n return this._stopped || tx.pos.distance(this._start) >= this._distance;\n }\n stop() {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/MoveTo.ts\":\n/*!**********************************!*\\\n !*** ./Actions/Action/MoveTo.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MoveTo: () => (/* binding */ MoveTo),\n/* harmony export */ MoveToWithOptions: () => (/* binding */ MoveToWithOptions),\n/* harmony export */ isMoveToOptions: () => (/* binding */ isMoveToOptions)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math */ \"./Math/util.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../Math */ \"./Math/lerp.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Util/EasingFunctions */ \"./Util/EasingFunctions.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\n\n\n\n/**\n *\n */\nfunction isMoveToOptions(x) {\n return x.pos instanceof _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector && typeof x.duration === 'number';\n}\nclass MoveToWithOptions {\n constructor(entity, options) {\n var _a;\n this.entity = entity;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_1__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._easing = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_2__.EasingFunctions.Linear;\n this._end = options.pos;\n this._easing = (_a = options.easing) !== null && _a !== void 0 ? _a : this._easing;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_4__.MotionComponent);\n if (!this._tx) {\n throw new Error(`Entity ${entity.name} has no TransformComponent, can only moveTo on Entities with TransformComponents.`);\n }\n this._durationMs = options.duration;\n this._currentMs = this._durationMs;\n }\n update(elapsed) {\n if (!this._started) {\n this._start = this._tx.pos.clone();\n this._started = true;\n }\n this._currentMs -= elapsed;\n const t = (0,_Math__WEBPACK_IMPORTED_MODULE_5__.clamp)((0,_Math__WEBPACK_IMPORTED_MODULE_6__.remap)(0, this._durationMs, 0, 1, this._durationMs - this._currentMs), 0, 1);\n const currentPos = this._tx.pos;\n const newPosX = this._easing(t, this._start.x, this._end.x, 1);\n const newPosY = this._easing(t, this._start.y, this._end.y, 1);\n const velX = (newPosX - currentPos.x) / (elapsed / 1000);\n const velY = (newPosY - currentPos.y) / (elapsed / 1000);\n this._motion.vel.x = velX;\n this._motion.vel.y = velY;\n if (this.isComplete(this.entity)) {\n this._tx.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this._end.x, this._end.y);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n }\n }\n isComplete(entity) {\n return this._stopped || this._currentMs < 0;\n }\n stop() {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n this._stopped = true;\n this._currentMs = 0;\n }\n reset() {\n this._currentMs = this._durationMs;\n this._started = false;\n this._stopped = false;\n }\n}\nclass MoveTo {\n constructor(entity, destX, destY, speed) {\n this.entity = entity;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_1__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_4__.MotionComponent);\n this._end = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(destX, destY);\n this._speed = speed;\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._start = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(this._tx.pos.x, this._tx.pos.y);\n this._distance = this._start.distance(this._end);\n this._dir = this._end.sub(this._start).normalize();\n }\n const m = this._dir.scale(this._speed);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(m.x, m.y);\n if (this.isComplete(this.entity)) {\n this._tx.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this._end.x, this._end.y);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n }\n }\n isComplete(entity) {\n const tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__.TransformComponent);\n return this._stopped || new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(tx.pos.x, tx.pos.y).distance(this._start) >= this._distance;\n }\n stop() {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/ParallelActions.ts\":\n/*!*******************************************!*\\\n !*** ./Actions/Action/ParallelActions.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ParallelActions: () => (/* binding */ ParallelActions)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n/**\n * Action that can run multiple {@apilink Action}s or {@apilink ActionSequence}s at the same time\n */\nclass ParallelActions {\n constructor(parallelActions) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._actions = parallelActions;\n }\n update(elapsed) {\n for (let i = 0; i < this._actions.length; i++) {\n this._actions[i].update(elapsed);\n }\n }\n isComplete(entity) {\n return this._actions.every((a) => a.isComplete(entity));\n }\n reset() {\n this._actions.forEach((a) => a.reset());\n }\n stop() {\n this._actions.forEach((a) => a.stop());\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/Repeat.ts\":\n/*!**********************************!*\\\n !*** ./Actions/Action/Repeat.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Repeat: () => (/* binding */ Repeat)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _ActionContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ActionContext */ \"./Actions/ActionContext.ts\");\n\n\nclass Repeat {\n constructor(entity, repeatBuilder, repeat) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._stopped = false;\n this._repeatBuilder = repeatBuilder;\n this._repeatContext = new _ActionContext__WEBPACK_IMPORTED_MODULE_1__.ActionContext(entity);\n this._actionQueue = this._repeatContext.getQueue();\n this._repeat = repeat;\n this._originalRepeat = repeat;\n this._repeatBuilder(this._repeatContext);\n this._repeat--; // current execution is the first repeat\n }\n update(elapsed) {\n if (this._actionQueue.isComplete()) {\n this._actionQueue.clearActions();\n this._repeatBuilder(this._repeatContext);\n this._repeat--;\n }\n this._actionQueue.update(elapsed);\n }\n isComplete() {\n return this._stopped || (this._repeat <= 0 && this._actionQueue.isComplete());\n }\n stop() {\n this._stopped = true;\n }\n reset() {\n this._repeat = this._originalRepeat;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/RepeatForever.ts\":\n/*!*****************************************!*\\\n !*** ./Actions/Action/RepeatForever.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RepeatForever: () => (/* binding */ RepeatForever)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _ActionContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ActionContext */ \"./Actions/ActionContext.ts\");\n\n\n/**\n * RepeatForever Action implementation, it is recommended you use the fluent action\n * context API.\n *\n *\n */\nclass RepeatForever {\n constructor(entity, repeatBuilder) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._stopped = false;\n this._repeatBuilder = repeatBuilder;\n this._repeatContext = new _ActionContext__WEBPACK_IMPORTED_MODULE_1__.ActionContext(entity);\n this._actionQueue = this._repeatContext.getQueue();\n this._repeatBuilder(this._repeatContext);\n }\n update(elapsed) {\n if (this._stopped) {\n return;\n }\n if (this._actionQueue.isComplete()) {\n this._actionQueue.clearActions();\n this._repeatBuilder(this._repeatContext);\n }\n this._actionQueue.update(elapsed);\n }\n isComplete() {\n return this._stopped;\n }\n stop() {\n this._stopped = true;\n this._actionQueue.clearActions();\n }\n reset() {\n return;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/RotateBy.ts\":\n/*!************************************!*\\\n !*** ./Actions/Action/RotateBy.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RotateBy: () => (/* binding */ RotateBy),\n/* harmony export */ RotateByWithOptions: () => (/* binding */ RotateByWithOptions),\n/* harmony export */ isRotateByOptions: () => (/* binding */ isRotateByOptions)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math */ \"./Math/rotation-type.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math */ \"./Math/lerp.ts\");\n\n\n\n\n\n/**\n *\n */\nfunction isRotateByOptions(x) {\n return typeof x.angleRadiansOffset === 'number' && typeof x.duration === 'number';\n}\nclass RotateByWithOptions {\n constructor(entity, options) {\n var _a;\n this.entity = entity;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._offset = 0;\n this._startAngle = 0;\n this._endAngle = 0;\n this._offset = options.angleRadiansOffset;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n if (!this._tx) {\n throw new Error(`Entity ${entity.name} has no TransformComponent, can only RotateBy on Entities with TransformComponents.`);\n }\n this._durationMs = options.duration;\n this._rotationType = (_a = options.rotationType) !== null && _a !== void 0 ? _a : _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.ShortestPath;\n this._currentMs = this._durationMs;\n }\n update(elapsed) {\n if (!this._started) {\n this._startAngle = this._tx.rotation;\n this._endAngle = (0,_Math_util__WEBPACK_IMPORTED_MODULE_4__.canonicalizeAngle)(this._startAngle + this._offset);\n this._started = true;\n }\n this._currentMs -= elapsed;\n const t = (0,_Math_util__WEBPACK_IMPORTED_MODULE_4__.clamp)((0,_Math__WEBPACK_IMPORTED_MODULE_5__.remap)(0, this._durationMs, 0, 1, this._durationMs - this._currentMs), 0, 1);\n const newAngle = (0,_Math__WEBPACK_IMPORTED_MODULE_5__.lerpAngle)(this._startAngle, this._endAngle, this._rotationType, t);\n const currentAngle = this._tx.rotation;\n const rx = (newAngle - currentAngle) / (elapsed / 1000);\n this._motion.angularVelocity = rx;\n if (this.isComplete()) {\n this._tx.rotation = this._endAngle;\n this._motion.angularVelocity = 0;\n }\n }\n isComplete() {\n return this._stopped || this._currentMs < 0;\n }\n stop() {\n this._motion.angularVelocity = 0;\n this._stopped = true;\n this._currentMs = 0;\n }\n reset() {\n this._currentMs = this._durationMs;\n this._started = false;\n this._stopped = false;\n }\n}\nclass RotateBy {\n constructor(entity, angleRadiansOffset, speed, rotationType) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n this._speed = speed;\n this._offset = angleRadiansOffset;\n this._rotationType = rotationType || _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.ShortestPath;\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._start = this._tx.rotation;\n this._currentNonCannonAngle = this._tx.rotation;\n this._end = this._start + this._offset;\n const distance1 = Math.abs(this._end - this._start);\n const distance2 = _Math_util__WEBPACK_IMPORTED_MODULE_4__.TwoPI - distance1;\n if (distance1 > distance2) {\n this._shortDistance = distance2;\n this._longDistance = distance1;\n }\n else {\n this._shortDistance = distance1;\n this._longDistance = distance2;\n }\n this._shortestPathIsPositive = (this._start - this._end + _Math_util__WEBPACK_IMPORTED_MODULE_4__.TwoPI) % _Math_util__WEBPACK_IMPORTED_MODULE_4__.TwoPI >= Math.PI;\n switch (this._rotationType) {\n case _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.ShortestPath:\n this._distance = this._shortDistance;\n if (this._shortestPathIsPositive) {\n this._direction = 1;\n }\n else {\n this._direction = -1;\n }\n break;\n case _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.LongestPath:\n this._distance = this._longDistance;\n if (this._shortestPathIsPositive) {\n this._direction = -1;\n }\n else {\n this._direction = 1;\n }\n break;\n case _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.Clockwise:\n this._direction = 1;\n if (this._shortDistance >= 0) {\n this._distance = this._shortDistance;\n }\n else {\n this._distance = this._longDistance;\n }\n break;\n case _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.CounterClockwise:\n this._direction = -1;\n if (this._shortDistance <= 0) {\n this._distance = this._shortDistance;\n }\n else {\n this._distance = this._longDistance;\n }\n break;\n }\n }\n this._motion.angularVelocity = this._direction * this._speed;\n this._currentNonCannonAngle += this._direction * this._speed * (elapsed / 1000);\n if (this.isComplete()) {\n this._tx.rotation = this._end;\n this._motion.angularVelocity = 0;\n this._stopped = true;\n }\n }\n isComplete() {\n const distanceTraveled = Math.abs(this._currentNonCannonAngle - this._start);\n return this._stopped || distanceTraveled >= Math.abs(this._distance);\n }\n stop() {\n this._motion.angularVelocity = 0;\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n this._start = undefined;\n this._currentNonCannonAngle = undefined;\n this._distance = undefined;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/RotateTo.ts\":\n/*!************************************!*\\\n !*** ./Actions/Action/RotateTo.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RotateTo: () => (/* binding */ RotateTo),\n/* harmony export */ RotateToWithOptions: () => (/* binding */ RotateToWithOptions),\n/* harmony export */ isRotateToOptions: () => (/* binding */ isRotateToOptions)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math */ \"./Math/rotation-type.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math */ \"./Math/lerp.ts\");\n\n\n\n\n\n\n/**\n *\n */\nfunction isRotateToOptions(x) {\n return typeof x.angle === 'number' && typeof x.duration === 'number';\n}\nclass RotateToWithOptions {\n constructor(entity, options) {\n var _a;\n this.entity = entity;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._endAngle = 0;\n this._startAngle = 0;\n this._endAngle = options.angle;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n if (!this._tx) {\n throw new Error(`Entity ${entity.name} has no TransformComponent, can only RotateTo on Entities with TransformComponents.`);\n }\n this._durationMs = options.duration;\n this._rotationType = (_a = options.rotationType) !== null && _a !== void 0 ? _a : _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.ShortestPath;\n this._currentMs = this._durationMs;\n }\n update(elapsed) {\n if (!this._started) {\n this._startAngle = this._tx.rotation;\n this._started = true;\n }\n this._currentMs -= elapsed;\n const t = (0,_Math_util__WEBPACK_IMPORTED_MODULE_4__.clamp)((0,_Math__WEBPACK_IMPORTED_MODULE_5__.remap)(0, this._durationMs, 0, 1, this._durationMs - this._currentMs), 0, 1);\n const newAngle = (0,_Math__WEBPACK_IMPORTED_MODULE_5__.lerpAngle)(this._startAngle, this._endAngle, this._rotationType, t);\n const currentAngle = this._tx.rotation;\n const rx = (newAngle - currentAngle) / (elapsed / 1000);\n this._motion.angularVelocity = rx;\n if (this.isComplete(this.entity)) {\n this._tx.rotation = this._endAngle;\n this._motion.angularVelocity = 0;\n }\n }\n isComplete(entity) {\n return this._stopped || this._currentMs < 0;\n }\n stop() {\n this._motion.angularVelocity = 0;\n this._stopped = true;\n this._currentMs = 0;\n }\n reset() {\n this._currentMs = this._durationMs;\n this._started = false;\n this._stopped = false;\n }\n}\nclass RotateTo {\n constructor(entity, angle, speed, rotationType) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n this._end = angle;\n this._speed = speed;\n this._rotationType = rotationType || _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.ShortestPath;\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._start = this._tx.rotation;\n this._currentNonCannonAngle = this._tx.rotation;\n const distance1 = Math.abs(this._end - this._start);\n const distance2 = _Math_util__WEBPACK_IMPORTED_MODULE_4__.TwoPI - distance1;\n if (distance1 > distance2) {\n this._shortDistance = distance2;\n this._longDistance = distance1;\n }\n else {\n this._shortDistance = distance1;\n this._longDistance = distance2;\n }\n this._shortestPathIsPositive = (this._start - this._end + _Math_util__WEBPACK_IMPORTED_MODULE_4__.TwoPI) % _Math_util__WEBPACK_IMPORTED_MODULE_4__.TwoPI >= Math.PI;\n switch (this._rotationType) {\n case _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.ShortestPath:\n this._distance = this._shortDistance;\n if (this._shortestPathIsPositive) {\n this._direction = 1;\n }\n else {\n this._direction = -1;\n }\n break;\n case _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.LongestPath:\n this._distance = this._longDistance;\n if (this._shortestPathIsPositive) {\n this._direction = -1;\n }\n else {\n this._direction = 1;\n }\n break;\n case _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.Clockwise:\n this._direction = 1;\n if (this._shortestPathIsPositive) {\n this._distance = this._shortDistance;\n }\n else {\n this._distance = this._longDistance;\n }\n break;\n case _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.CounterClockwise:\n this._direction = -1;\n if (!this._shortestPathIsPositive) {\n this._distance = this._shortDistance;\n }\n else {\n this._distance = this._longDistance;\n }\n break;\n }\n }\n this._motion.angularVelocity = this._direction * this._speed;\n this._currentNonCannonAngle += this._direction * this._speed * (elapsed / 1000);\n if (this.isComplete()) {\n this._tx.rotation = this._end;\n this._motion.angularVelocity = 0;\n this._stopped = true;\n }\n }\n isComplete() {\n const distanceTraveled = Math.abs(this._currentNonCannonAngle - this._start);\n return this._stopped || distanceTraveled >= Math.abs(this._distance);\n }\n stop() {\n this._motion.angularVelocity = 0;\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/ScaleBy.ts\":\n/*!***********************************!*\\\n !*** ./Actions/Action/ScaleBy.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ScaleBy: () => (/* binding */ ScaleBy),\n/* harmony export */ ScaleByWithOptions: () => (/* binding */ ScaleByWithOptions),\n/* harmony export */ isScaleByOptions: () => (/* binding */ isScaleByOptions)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Math */ \"./Math/util.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math */ \"./Math/lerp.ts\");\n\n\n\n\n\n/**\n *\n */\nfunction isScaleByOptions(x) {\n return typeof x.scaleOffset === 'object' && typeof x.duration === 'number';\n}\nclass ScaleByWithOptions {\n constructor(entity, options) {\n this.entity = entity;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._endScale = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(1, 1);\n this._scaleOffset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0);\n this._startScale = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(1, 1);\n this._scaleOffset = options.scaleOffset;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__.MotionComponent);\n if (!this._tx) {\n throw new Error(`Entity ${entity.name} has no TransformComponent, can only ScaleBy on Entities with TransformComponents.`);\n }\n this._durationMs = options.duration;\n this._currentMs = this._durationMs;\n }\n update(elapsed) {\n if (!this._started) {\n this._startScale = this._tx.scale;\n this._endScale = this._startScale.add(this._scaleOffset);\n this._started = true;\n }\n this._currentMs -= elapsed;\n const t = (0,_Math__WEBPACK_IMPORTED_MODULE_4__.clamp)((0,_Math__WEBPACK_IMPORTED_MODULE_5__.remap)(0, this._durationMs, 0, 1, this._durationMs - this._currentMs), 0, 1);\n const newScale = (0,_Math__WEBPACK_IMPORTED_MODULE_5__.lerpVector)(this._startScale, this._endScale, t);\n const currentScale = this._tx.scale;\n const sx = newScale.sub(currentScale).scale(1 / (elapsed / 1000));\n this._motion.scaleFactor = sx;\n if (this.isComplete()) {\n this._tx.scale = this._endScale;\n this._motion.angularVelocity = 0;\n }\n }\n isComplete() {\n return this._stopped || this._currentMs < 0;\n }\n stop() {\n this._motion.scaleFactor = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n this._stopped = true;\n this._currentMs = 0;\n }\n reset() {\n this._currentMs = this._durationMs;\n this._started = false;\n this._stopped = false;\n }\n}\nclass ScaleBy {\n constructor(entity, scaleOffsetX, scaleOffsetY, speed) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__.MotionComponent);\n this._offset = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(scaleOffsetX, scaleOffsetY);\n this._speedX = this._speedY = speed;\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._startScale = this._tx.scale.clone();\n this._endScale = this._startScale.add(this._offset);\n this._distanceX = Math.abs(this._endScale.x - this._startScale.x);\n this._distanceY = Math.abs(this._endScale.y - this._startScale.y);\n this._directionX = this._endScale.x < this._startScale.x ? -1 : 1;\n this._directionY = this._endScale.y < this._startScale.y ? -1 : 1;\n }\n this._motion.scaleFactor.x = this._speedX * this._directionX;\n this._motion.scaleFactor.y = this._speedY * this._directionY;\n if (this.isComplete()) {\n this._tx.scale = this._endScale;\n this._motion.scaleFactor.x = 0;\n this._motion.scaleFactor.y = 0;\n }\n }\n isComplete() {\n return (this._stopped ||\n (Math.abs(this._tx.scale.x - this._startScale.x) >= this._distanceX - 0.01 &&\n Math.abs(this._tx.scale.y - this._startScale.y) >= this._distanceY - 0.01));\n }\n stop() {\n this._motion.scaleFactor.x = 0;\n this._motion.scaleFactor.y = 0;\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/ScaleTo.ts\":\n/*!***********************************!*\\\n !*** ./Actions/Action/ScaleTo.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ScaleTo: () => (/* binding */ ScaleTo),\n/* harmony export */ ScaleToWithOptions: () => (/* binding */ ScaleToWithOptions),\n/* harmony export */ isScaleToOptions: () => (/* binding */ isScaleToOptions)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Math */ \"./Math/util.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math */ \"./Math/lerp.ts\");\n\n\n\n\n\n/**\n *\n */\nfunction isScaleToOptions(x) {\n return typeof x.scale === 'object' && typeof x.duration === 'number';\n}\nclass ScaleToWithOptions {\n constructor(entity, options) {\n this.entity = entity;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._endScale = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(1, 1);\n this._startScale = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(1, 1);\n this._endScale = options.scale;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__.MotionComponent);\n if (!this._tx) {\n throw new Error(`Entity ${entity.name} has no TransformComponent, can only ScaleTo on Entities with TransformComponents.`);\n }\n this._durationMs = options.duration;\n this._currentMs = this._durationMs;\n }\n update(elapsed) {\n if (!this._started) {\n this._startScale = this._tx.scale;\n this._started = true;\n }\n this._currentMs -= elapsed;\n const t = (0,_Math__WEBPACK_IMPORTED_MODULE_4__.clamp)((0,_Math__WEBPACK_IMPORTED_MODULE_5__.remap)(0, this._durationMs, 0, 1, this._durationMs - this._currentMs), 0, 1);\n const newScale = (0,_Math__WEBPACK_IMPORTED_MODULE_5__.lerpVector)(this._startScale, this._endScale, t);\n const currentScale = this._tx.scale;\n const sx = newScale.sub(currentScale).scale(1 / (elapsed / 1000));\n this._motion.scaleFactor = sx;\n if (this.isComplete()) {\n this._tx.scale = this._endScale;\n this._motion.angularVelocity = 0;\n }\n }\n isComplete() {\n return this._stopped || this._currentMs < 0;\n }\n stop() {\n this._motion.scaleFactor = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n this._stopped = true;\n this._currentMs = 0;\n }\n reset() {\n this._currentMs = this._durationMs;\n this._started = false;\n this._stopped = false;\n }\n}\nclass ScaleTo {\n constructor(entity, scaleX, scaleY, speedX, speedY) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__.MotionComponent);\n this._endX = scaleX;\n this._endY = scaleY;\n this._speedX = speedX;\n this._speedY = speedY;\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._startX = this._tx.scale.x;\n this._startY = this._tx.scale.y;\n this._distanceX = Math.abs(this._endX - this._startX);\n this._distanceY = Math.abs(this._endY - this._startY);\n }\n if (!(Math.abs(this._tx.scale.x - this._startX) >= this._distanceX)) {\n const directionX = this._endY < this._startY ? -1 : 1;\n this._motion.scaleFactor.x = this._speedX * directionX;\n }\n else {\n this._motion.scaleFactor.x = 0;\n }\n if (!(Math.abs(this._tx.scale.y - this._startY) >= this._distanceY)) {\n const directionY = this._endY < this._startY ? -1 : 1;\n this._motion.scaleFactor.y = this._speedY * directionY;\n }\n else {\n this._motion.scaleFactor.y = 0;\n }\n if (this.isComplete()) {\n this._tx.scale = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(this._endX, this._endY);\n this._motion.scaleFactor.x = 0;\n this._motion.scaleFactor.y = 0;\n }\n }\n isComplete() {\n return (this._stopped ||\n (Math.abs(this._tx.scale.x - this._startX) >= this._distanceX - 0.01 &&\n Math.abs(this._tx.scale.y - this._startY) >= this._distanceY - 0.01));\n }\n stop() {\n this._motion.scaleFactor.x = 0;\n this._motion.scaleFactor.y = 0;\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/ActionsComponent.ts\":\n/*!*************************************!*\\\n !*** ./Actions/ActionsComponent.ts ***!\n \\*************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ActionsComponent: () => (/* binding */ ActionsComponent)\n/* harmony export */ });\n/* harmony import */ var _ActionContext__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./ActionContext */ \"./Actions/ActionContext.ts\");\n/* harmony import */ var _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Component */ \"./EntityComponentSystem/Component.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n\n\n\n\nclass ActionsComponent extends _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor() {\n super(...arguments);\n this.dependencies = [_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent, _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent];\n this._ctx = null;\n }\n onAdd(entity) {\n this._ctx = new _ActionContext__WEBPACK_IMPORTED_MODULE_3__.ActionContext(entity);\n }\n onRemove() {\n this._ctx = null;\n }\n _getCtx() {\n if (!this._ctx) {\n throw new Error('Actions component not attached to an entity, no context available');\n }\n return this._ctx;\n }\n /**\n * Returns the internal action queue\n * @returns action queue\n */\n getQueue() {\n if (!this._ctx) {\n throw new Error('Actions component not attached to an entity, no queue available');\n }\n return this._ctx.getQueue();\n }\n /**\n * Runs a specific action in the action queue\n * @param action\n */\n runAction(action) {\n if (!this._ctx) {\n throw new Error('Actions component not attached to an entity, cannot run action');\n }\n return this._ctx.runAction(action);\n }\n /**\n * Updates the internal action context, performing action and moving through the internal queue\n * @param elapsed\n */\n update(elapsed) {\n var _a;\n return (_a = this._ctx) === null || _a === void 0 ? void 0 : _a.update(elapsed);\n }\n /**\n * Clears all queued actions from the Actor\n */\n clearActions() {\n var _a;\n (_a = this._ctx) === null || _a === void 0 ? void 0 : _a.clearActions();\n }\n /**\n * Animates an actor with a specified bezier curve by an offset to the current position, the start point is assumed\n * to be the actors current position\n * @param options\n */\n curveBy(options) {\n return this._getCtx().curveBy.apply(this._ctx, [options]);\n }\n /**\n * Animates an actor with a specified bezier curve to an absolute world space coordinate, the start point is assumed\n * to be the actors current position\n * @param options\n */\n curveTo(options) {\n return this._getCtx().curveTo.apply(this._ctx, [options]);\n }\n easeTo(...args) {\n return this._getCtx().easeTo.apply(this._ctx, args);\n }\n easeBy(...args) {\n return this._getCtx().easeBy.apply(this._ctx, args);\n }\n moveTo(xOrPosOrOptions, yOrSpeed, speedOrUndefined) {\n return this._getCtx().moveTo.apply(this._ctx, [xOrPosOrOptions, yOrSpeed, speedOrUndefined]);\n }\n moveBy(xOffsetOrVectorOptions, yOffsetOrSpeed, speedOrUndefined) {\n return this._getCtx().moveBy.apply(this._ctx, [xOffsetOrVectorOptions, yOffsetOrSpeed, speedOrUndefined]);\n }\n rotateTo(angle, speed, rotationType) {\n return this._getCtx().rotateTo.apply(this._ctx, [angle, speed, rotationType]);\n }\n rotateBy(angleRadiansOffsetOrOptions, speed, rotationType) {\n return this._getCtx().rotateBy.apply(this._ctx, [angleRadiansOffsetOrOptions, speed, rotationType]);\n }\n scaleTo(sizeXOrVectorOrOptions, sizeYOrSpeed, speedXOrUndefined, speedYOrUndefined) {\n return this._getCtx().scaleTo.apply(this._ctx, [sizeXOrVectorOrOptions, sizeYOrSpeed, speedXOrUndefined, speedYOrUndefined]);\n }\n scaleBy(sizeOffsetXOrVectorOrOptions, sizeOffsetYOrSpeed, speed) {\n return this._getCtx().scaleBy.apply(this._ctx, [sizeOffsetXOrVectorOrOptions, sizeOffsetYOrSpeed, speed]);\n }\n /**\n * This method will cause an actor to blink (become visible and not\n * visible). Optionally, you may specify the number of blinks. Specify the amount of time\n * the actor should be visible per blink, and the amount of time not visible.\n * This method is part of the actor 'Action' fluent API allowing action chaining.\n * @param timeVisible The amount of time to stay visible per blink in milliseconds\n * @param timeNotVisible The amount of time to stay not visible per blink in milliseconds\n * @param numBlinks The number of times to blink\n */\n blink(timeVisible, timeNotVisible, numBlinks) {\n return this._getCtx().blink(timeVisible, timeNotVisible, numBlinks);\n }\n /**\n * This method will cause an actor's opacity to change from its current value\n * to the provided value by a specified time (in milliseconds). This method is\n * part of the actor 'Action' fluent API allowing action chaining.\n * @param opacity The ending opacity\n * @param duration The time it should take to fade the actor (in milliseconds)\n */\n fade(opacity, duration) {\n return this._getCtx().fade(opacity, duration);\n }\n /**\n * This will cause an actor to flash a specific color for a period of time\n * @param color\n * @param duration The duration in milliseconds\n */\n flash(color, duration = 1000) {\n return this._getCtx().flash(color, duration);\n }\n /**\n * This method will delay the next action from executing for a certain\n * amount of time (in milliseconds). This method is part of the actor\n * 'Action' fluent API allowing action chaining.\n * @param duration The amount of time to delay the next action in the queue from executing in milliseconds\n */\n delay(duration) {\n return this._getCtx().delay(duration);\n }\n /**\n * This method will add an action to the queue that will remove the actor from the\n * scene once it has completed its previous Any actions on the\n * action queue after this action will not be executed.\n */\n die() {\n return this._getCtx().die();\n }\n /**\n * This method allows you to call an arbitrary method as the next action in the\n * action queue. This is useful if you want to execute code in after a specific\n * action, i.e An actor arrives at a destination after traversing a path\n */\n callMethod(method) {\n return this._getCtx().callMethod(method);\n }\n /**\n * This method will cause the actor to repeat all of the actions built in\n * the `repeatBuilder` callback. If the number of repeats\n * is not specified it will repeat forever. This method is part of\n * the actor 'Action' fluent API allowing action chaining\n *\n * ```typescript\n * // Move up in a zig-zag by repeated moveBy's\n * actor.actions.repeat(repeatCtx => {\n * repeatCtx.moveBy(10, 0, 10);\n * repeatCtx.moveBy(0, 10, 10);\n * }, 5);\n * ```\n * @param repeatBuilder The builder to specify the repeatable list of actions\n * @param times The number of times to repeat all the previous actions in the action queue. If nothing is specified the actions\n * will repeat forever\n */\n repeat(repeatBuilder, times) {\n return this._getCtx().repeat(repeatBuilder, times);\n }\n /**\n * This method will cause the actor to repeat all of the actions built in\n * the `repeatBuilder` callback. If the number of repeats\n * is not specified it will repeat forever. This method is part of\n * the actor 'Action' fluent API allowing action chaining\n *\n * ```typescript\n * // Move up in a zig-zag by repeated moveBy's\n * actor.actions.repeat(repeatCtx => {\n * repeatCtx.moveBy(10, 0, 10);\n * repeatCtx.moveBy(0, 10, 10);\n * }, 5);\n * ```\n * @param repeatBuilder The builder to specify the repeatable list of actions\n */\n repeatForever(repeatBuilder) {\n return this._getCtx().repeatForever(repeatBuilder);\n }\n /**\n * This method will cause the entity to follow another at a specified distance\n * @param entity The entity to follow\n * @param followDistance The distance to maintain when following, if not specified the actor will follow at the current distance.\n */\n follow(entity, followDistance) {\n return this._getCtx().follow(entity, followDistance);\n }\n /**\n * This method will cause the entity to move towards another until they\n * collide \"meet\" at a specified speed.\n * @param entity The entity to meet\n * @param speed The speed in pixels per second to move, if not specified it will match the speed of the other actor\n */\n meet(entity, speed) {\n return this._getCtx().meet(entity, speed);\n }\n /**\n * Returns a promise that resolves when the current action queue up to now\n * is finished.\n */\n toPromise() {\n return this._getCtx().toPromise();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/ActionsSystem.ts\":\n/*!**********************************!*\\\n !*** ./Actions/ActionsSystem.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ActionsSystem: () => (/* binding */ ActionsSystem)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Priority.ts\");\n/* harmony import */ var _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _ActionsComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ActionsComponent */ \"./Actions/ActionsComponent.ts\");\n\n\n\nclass ActionsSystem extends _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.System {\n constructor(world) {\n super();\n this.world = world;\n this.systemType = _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.SystemType.Update;\n this._actions = [];\n this.query = this.world.query([_ActionsComponent__WEBPACK_IMPORTED_MODULE_1__.ActionsComponent]);\n this.query.entityAdded$.subscribe((e) => this._actions.push(e.get(_ActionsComponent__WEBPACK_IMPORTED_MODULE_1__.ActionsComponent)));\n this.query.entityRemoved$.subscribe((e) => {\n const action = e.get(_ActionsComponent__WEBPACK_IMPORTED_MODULE_1__.ActionsComponent);\n const index = this._actions.indexOf(action);\n if (index > -1) {\n this._actions.splice(index, 1);\n }\n });\n }\n update(elapsed) {\n for (let i = 0; i < this._actions.length; i++) {\n const action = this._actions[i];\n action.update(elapsed);\n }\n }\n}\nActionsSystem.priority = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_2__.SystemPriority.Higher;\n\n\n/***/ }),\n\n/***/ \"./Actions/index.ts\":\n/*!**************************!*\\\n !*** ./Actions/index.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ActionContext: () => (/* reexport safe */ _ActionContext__WEBPACK_IMPORTED_MODULE_0__.ActionContext),\n/* harmony export */ ActionQueue: () => (/* reexport safe */ _ActionQueue__WEBPACK_IMPORTED_MODULE_1__.ActionQueue),\n/* harmony export */ ActionSequence: () => (/* reexport safe */ _Action_ActionSequence__WEBPACK_IMPORTED_MODULE_3__.ActionSequence),\n/* harmony export */ ActionsComponent: () => (/* reexport safe */ _ActionsComponent__WEBPACK_IMPORTED_MODULE_24__.ActionsComponent),\n/* harmony export */ ActionsSystem: () => (/* reexport safe */ _ActionsSystem__WEBPACK_IMPORTED_MODULE_25__.ActionsSystem),\n/* harmony export */ Blink: () => (/* reexport safe */ _Action_Blink__WEBPACK_IMPORTED_MODULE_7__.Blink),\n/* harmony export */ CurveBy: () => (/* reexport safe */ _Action_CurveBy__WEBPACK_IMPORTED_MODULE_23__.CurveBy),\n/* harmony export */ CurveTo: () => (/* reexport safe */ _Action_CurveTo__WEBPACK_IMPORTED_MODULE_22__.CurveTo),\n/* harmony export */ Delay: () => (/* reexport safe */ _Action_Delay__WEBPACK_IMPORTED_MODULE_20__.Delay),\n/* harmony export */ Die: () => (/* reexport safe */ _Action_Die__WEBPACK_IMPORTED_MODULE_8__.Die),\n/* harmony export */ EaseBy: () => (/* reexport safe */ _Action_EaseBy__WEBPACK_IMPORTED_MODULE_10__.EaseBy),\n/* harmony export */ EaseTo: () => (/* reexport safe */ _Action_EaseTo__WEBPACK_IMPORTED_MODULE_9__.EaseTo),\n/* harmony export */ Fade: () => (/* reexport safe */ _Action_Fade__WEBPACK_IMPORTED_MODULE_11__.Fade),\n/* harmony export */ Flash: () => (/* reexport safe */ _Action_Flash__WEBPACK_IMPORTED_MODULE_21__.Flash),\n/* harmony export */ Follow: () => (/* reexport safe */ _Action_Follow__WEBPACK_IMPORTED_MODULE_12__.Follow),\n/* harmony export */ Meet: () => (/* reexport safe */ _Action_Meet__WEBPACK_IMPORTED_MODULE_13__.Meet),\n/* harmony export */ MoveBy: () => (/* reexport safe */ _Action_MoveBy__WEBPACK_IMPORTED_MODULE_14__.MoveBy),\n/* harmony export */ MoveByWithOptions: () => (/* reexport safe */ _Action_MoveBy__WEBPACK_IMPORTED_MODULE_14__.MoveByWithOptions),\n/* harmony export */ MoveTo: () => (/* reexport safe */ _Action_MoveTo__WEBPACK_IMPORTED_MODULE_15__.MoveTo),\n/* harmony export */ MoveToWithOptions: () => (/* reexport safe */ _Action_MoveTo__WEBPACK_IMPORTED_MODULE_15__.MoveToWithOptions),\n/* harmony export */ ParallelActions: () => (/* reexport safe */ _Action_ParallelActions__WEBPACK_IMPORTED_MODULE_4__.ParallelActions),\n/* harmony export */ Repeat: () => (/* reexport safe */ _Action_Repeat__WEBPACK_IMPORTED_MODULE_5__.Repeat),\n/* harmony export */ RepeatForever: () => (/* reexport safe */ _Action_RepeatForever__WEBPACK_IMPORTED_MODULE_6__.RepeatForever),\n/* harmony export */ RotateBy: () => (/* reexport safe */ _Action_RotateBy__WEBPACK_IMPORTED_MODULE_16__.RotateBy),\n/* harmony export */ RotateByWithOptions: () => (/* reexport safe */ _Action_RotateBy__WEBPACK_IMPORTED_MODULE_16__.RotateByWithOptions),\n/* harmony export */ RotateTo: () => (/* reexport safe */ _Action_RotateTo__WEBPACK_IMPORTED_MODULE_17__.RotateTo),\n/* harmony export */ RotateToWithOptions: () => (/* reexport safe */ _Action_RotateTo__WEBPACK_IMPORTED_MODULE_17__.RotateToWithOptions),\n/* harmony export */ ScaleBy: () => (/* reexport safe */ _Action_ScaleBy__WEBPACK_IMPORTED_MODULE_18__.ScaleBy),\n/* harmony export */ ScaleByWithOptions: () => (/* reexport safe */ _Action_ScaleBy__WEBPACK_IMPORTED_MODULE_18__.ScaleByWithOptions),\n/* harmony export */ ScaleTo: () => (/* reexport safe */ _Action_ScaleTo__WEBPACK_IMPORTED_MODULE_19__.ScaleTo),\n/* harmony export */ ScaleToWithOptions: () => (/* reexport safe */ _Action_ScaleTo__WEBPACK_IMPORTED_MODULE_19__.ScaleToWithOptions),\n/* harmony export */ isMoveByOptions: () => (/* reexport safe */ _Action_MoveBy__WEBPACK_IMPORTED_MODULE_14__.isMoveByOptions),\n/* harmony export */ isMoveToOptions: () => (/* reexport safe */ _Action_MoveTo__WEBPACK_IMPORTED_MODULE_15__.isMoveToOptions),\n/* harmony export */ isRotateByOptions: () => (/* reexport safe */ _Action_RotateBy__WEBPACK_IMPORTED_MODULE_16__.isRotateByOptions),\n/* harmony export */ isRotateToOptions: () => (/* reexport safe */ _Action_RotateTo__WEBPACK_IMPORTED_MODULE_17__.isRotateToOptions),\n/* harmony export */ isScaleByOptions: () => (/* reexport safe */ _Action_ScaleBy__WEBPACK_IMPORTED_MODULE_18__.isScaleByOptions),\n/* harmony export */ isScaleToOptions: () => (/* reexport safe */ _Action_ScaleTo__WEBPACK_IMPORTED_MODULE_19__.isScaleToOptions),\n/* harmony export */ nextActionId: () => (/* reexport safe */ _Action__WEBPACK_IMPORTED_MODULE_2__.nextActionId)\n/* harmony export */ });\n/* harmony import */ var _ActionContext__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ActionContext */ \"./Actions/ActionContext.ts\");\n/* harmony import */ var _ActionQueue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ActionQueue */ \"./Actions/ActionQueue.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _Action_ActionSequence__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Action/ActionSequence */ \"./Actions/Action/ActionSequence.ts\");\n/* harmony import */ var _Action_ParallelActions__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Action/ParallelActions */ \"./Actions/Action/ParallelActions.ts\");\n/* harmony import */ var _Action_Repeat__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Action/Repeat */ \"./Actions/Action/Repeat.ts\");\n/* harmony import */ var _Action_RepeatForever__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Action/RepeatForever */ \"./Actions/Action/RepeatForever.ts\");\n/* harmony import */ var _Action_Blink__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Action/Blink */ \"./Actions/Action/Blink.ts\");\n/* harmony import */ var _Action_Die__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Action/Die */ \"./Actions/Action/Die.ts\");\n/* harmony import */ var _Action_EaseTo__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Action/EaseTo */ \"./Actions/Action/EaseTo.ts\");\n/* harmony import */ var _Action_EaseBy__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Action/EaseBy */ \"./Actions/Action/EaseBy.ts\");\n/* harmony import */ var _Action_Fade__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Action/Fade */ \"./Actions/Action/Fade.ts\");\n/* harmony import */ var _Action_Follow__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Action/Follow */ \"./Actions/Action/Follow.ts\");\n/* harmony import */ var _Action_Meet__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Action/Meet */ \"./Actions/Action/Meet.ts\");\n/* harmony import */ var _Action_MoveBy__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Action/MoveBy */ \"./Actions/Action/MoveBy.ts\");\n/* harmony import */ var _Action_MoveTo__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Action/MoveTo */ \"./Actions/Action/MoveTo.ts\");\n/* harmony import */ var _Action_RotateBy__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Action/RotateBy */ \"./Actions/Action/RotateBy.ts\");\n/* harmony import */ var _Action_RotateTo__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./Action/RotateTo */ \"./Actions/Action/RotateTo.ts\");\n/* harmony import */ var _Action_ScaleBy__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Action/ScaleBy */ \"./Actions/Action/ScaleBy.ts\");\n/* harmony import */ var _Action_ScaleTo__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./Action/ScaleTo */ \"./Actions/Action/ScaleTo.ts\");\n/* harmony import */ var _Action_Delay__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./Action/Delay */ \"./Actions/Action/Delay.ts\");\n/* harmony import */ var _Action_Flash__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./Action/Flash */ \"./Actions/Action/Flash.ts\");\n/* harmony import */ var _Action_CurveTo__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./Action/CurveTo */ \"./Actions/Action/CurveTo.ts\");\n/* harmony import */ var _Action_CurveBy__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./Action/CurveBy */ \"./Actions/Action/CurveBy.ts\");\n/* harmony import */ var _ActionsComponent__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./ActionsComponent */ \"./Actions/ActionsComponent.ts\");\n/* harmony import */ var _ActionsSystem__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./ActionsSystem */ \"./Actions/ActionsSystem.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Actor.ts\":\n/*!******************!*\\\n !*** ./Actor.ts ***!\n \\******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Actor: () => (/* binding */ Actor),\n/* harmony export */ ActorEvents: () => (/* binding */ ActorEvents),\n/* harmony export */ isActor: () => (/* binding */ isActor)\n/* harmony export */ });\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./Events */ \"./Events.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Collision/BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Collision/CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./EntityComponentSystem/Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Graphics/GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Graphics_Rectangle__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Graphics/Rectangle */ \"./Graphics/Rectangle.ts\");\n/* harmony import */ var _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Collision/ColliderComponent */ \"./Collision/ColliderComponent.ts\");\n/* harmony import */ var _Collision_Colliders_Shape__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Collision/Colliders/Shape */ \"./Collision/Colliders/Shape.ts\");\n/* harmony import */ var _Util_Watch__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Util/Watch */ \"./Util/Watch.ts\");\n/* harmony import */ var _Graphics_Circle__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Graphics/Circle */ \"./Graphics/Circle.ts\");\n/* harmony import */ var _Input_PointerComponent__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Input/PointerComponent */ \"./Input/PointerComponent.ts\");\n/* harmony import */ var _Actions_ActionsComponent__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Actions/ActionsComponent */ \"./Actions/ActionsComponent.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Math/coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Type guard for checking if something is an Actor\n * @param x\n */\nfunction isActor(x) {\n return x instanceof Actor;\n}\nconst ActorEvents = {\n CollisionStart: 'collisionstart',\n CollisionEnd: 'collisionend',\n PreCollision: 'precollision',\n PostCollision: 'postcollision',\n Kill: 'kill',\n PreKill: 'prekill',\n PostKill: 'postkill',\n PreDraw: 'predraw',\n PostDraw: 'postdraw',\n PreTransformDraw: 'pretransformdraw',\n PostTransformDraw: 'posttransformdraw',\n PreDebugDraw: 'predebugdraw',\n PostDebugDraw: 'postdebugdraw',\n PointerUp: 'pointerup',\n PointerDown: 'pointerdown',\n PointerEnter: 'pointerenter',\n PointerLeave: 'pointerleave',\n PointerMove: 'pointermove',\n PointerCancel: 'pointercancel',\n Wheel: 'pointerwheel',\n PointerDrag: 'pointerdragstart',\n PointerDragEnd: 'pointerdragend',\n PointerDragEnter: 'pointerdragenter',\n PointerDragLeave: 'pointerdragleave',\n PointerDragMove: 'pointerdragmove',\n EnterViewPort: 'enterviewport',\n ExitViewPort: 'exitviewport',\n ActionStart: 'actionstart',\n ActionComplete: 'actioncomplete'\n};\n/**\n * The most important primitive in Excalibur is an `Actor`. Anything that\n * can move on the screen, collide with another `Actor`, respond to events,\n * or interact with the current scene, must be an actor. An `Actor` **must**\n * be part of a {@apilink Scene} for it to be drawn to the screen.\n */\nclass Actor extends _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__.Entity {\n /**\n * Gets the position vector of the actor in pixels\n */\n get pos() {\n return this.transform.pos;\n }\n /**\n * Sets the position vector of the actor in pixels\n */\n set pos(thePos) {\n this.transform.pos = thePos.clone();\n }\n /**\n * Gets the position vector of the actor from the last frame\n */\n get oldPos() {\n return this.body.oldPos;\n }\n /**\n * Gets the global position vector of the actor from the last frame\n */\n get oldGlobalPos() {\n return this.body.oldGlobalPos;\n }\n /**\n * Sets the position vector of the actor in the last frame\n */\n set oldPos(thePos) {\n this.body.oldPos.setTo(thePos.x, thePos.y);\n }\n /**\n * Gets the velocity vector of the actor in pixels/sec\n */\n get vel() {\n return this.motion.vel;\n }\n /**\n * Sets the velocity vector of the actor in pixels/sec\n */\n set vel(theVel) {\n this.motion.vel = theVel.clone();\n }\n /**\n * Gets the velocity vector of the actor from the last frame\n */\n get oldVel() {\n return this.body.oldVel;\n }\n /**\n * Sets the velocity vector of the actor from the last frame\n */\n set oldVel(theVel) {\n this.body.oldVel.setTo(theVel.x, theVel.y);\n }\n /**\n * Gets the acceleration vector of the actor in pixels/second/second. An acceleration pointing down such as (0, 100) may be\n * useful to simulate a gravitational effect.\n */\n get acc() {\n return this.motion.acc;\n }\n /**\n * Sets the acceleration vector of teh actor in pixels/second/second\n */\n set acc(theAcc) {\n this.motion.acc = theAcc.clone();\n }\n /**\n * Sets the acceleration of the actor from the last frame. This does not include the global acc {@apilink Physics.acc}.\n */\n set oldAcc(theAcc) {\n this.body.oldAcc.setTo(theAcc.x, theAcc.y);\n }\n /**\n * Gets the acceleration of the actor from the last frame. This does not include the global acc {@apilink Physics.acc}.\n */\n get oldAcc() {\n return this.body.oldAcc;\n }\n /**\n * Gets the rotation of the actor in radians. 1 radian = 180/PI Degrees.\n */\n get rotation() {\n return this.transform.rotation;\n }\n /**\n * Sets the rotation of the actor in radians. 1 radian = 180/PI Degrees.\n */\n set rotation(theAngle) {\n this.transform.rotation = theAngle;\n }\n /**\n * Gets the rotational velocity of the actor in radians/second\n */\n get angularVelocity() {\n return this.motion.angularVelocity;\n }\n /**\n * Sets the rotational velocity of the actor in radians/sec\n */\n set angularVelocity(angularVelocity) {\n this.motion.angularVelocity = angularVelocity;\n }\n get scale() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).scale;\n }\n set scale(scale) {\n this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).scale = scale;\n }\n /**\n * The anchor to apply all actor related transformations like rotation,\n * translation, and scaling. By default the anchor is in the center of\n * the actor. By default it is set to the center of the actor (.5, .5)\n *\n * An anchor of (.5, .5) will ensure that drawings are centered.\n *\n * Use `anchor.setTo` to set the anchor to a different point using\n * values between 0 and 1. For example, anchoring to the top-left would be\n * `Actor.anchor.setTo(0, 0)` and top-right would be `Actor.anchor.setTo(0, 1)`.\n */\n get anchor() {\n return this._anchor;\n }\n set anchor(vec) {\n this._anchor = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_2__.watch)(vec, (v) => this._handleAnchorChange(v));\n this._handleAnchorChange(vec);\n }\n _handleAnchorChange(v) {\n if (this.graphics) {\n this.graphics.anchor = v;\n }\n }\n /**\n * The offset in pixels to apply to all actor graphics\n *\n * Default offset of (0, 0)\n */\n get offset() {\n return this._offset;\n }\n set offset(vec) {\n this._offset = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_2__.watch)(vec, (v) => this._handleOffsetChange(v));\n this._handleOffsetChange(vec);\n }\n _handleOffsetChange(v) {\n if (this.graphics) {\n this.graphics.offset = v;\n }\n }\n /**\n * Indicates whether the actor is physically in the viewport\n */\n get isOffScreen() {\n return this.hasTag('ex.offscreen');\n }\n get draggable() {\n return this._draggable;\n }\n set draggable(isDraggable) {\n if (isDraggable) {\n if (isDraggable && !this._draggable) {\n this.events.on('pointerdragstart', this._pointerDragStartHandler);\n this.events.on('pointerdragend', this._pointerDragEndHandler);\n this.events.on('pointerdragmove', this._pointerDragMoveHandler);\n this.events.on('pointerdragleave', this._pointerDragLeaveHandler);\n }\n else if (!isDraggable && this._draggable) {\n this.events.off('pointerdragstart', this._pointerDragStartHandler);\n this.events.off('pointerdragend', this._pointerDragEndHandler);\n this.events.off('pointerdragmove', this._pointerDragMoveHandler);\n this.events.off('pointerdragleave', this._pointerDragLeaveHandler);\n }\n this._draggable = isDraggable;\n }\n }\n /**\n * Sets the color of the actor's current graphic\n */\n get color() {\n return this.graphics.color;\n }\n set color(v) {\n this.graphics.color = v;\n }\n // #endregion\n /**\n *\n * @param config\n */\n constructor(config) {\n super();\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_3__.EventEmitter();\n this._anchor = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_2__.watch)(_Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Half, (v) => this._handleAnchorChange(v));\n this._offset = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_2__.watch)(_Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero, (v) => this._handleOffsetChange(v));\n /**\n * Convenience reference to the global logger\n */\n this.logger = _Util_Log__WEBPACK_IMPORTED_MODULE_5__.Logger.getInstance();\n /**\n * Draggable helper\n */\n this._draggable = false;\n this._dragging = false;\n this._pointerDragStartHandler = () => {\n this._dragging = true;\n };\n this._pointerDragEndHandler = () => {\n this._dragging = false;\n };\n this._pointerDragMoveHandler = (pe) => {\n if (this._dragging) {\n this.pos = pe.worldPos;\n }\n };\n this._pointerDragLeaveHandler = (pe) => {\n if (this._dragging) {\n this.pos = pe.worldPos;\n }\n };\n const { name, x, y, pos, coordPlane, scale, width, height, radius, collider, vel, acc, rotation, angularVelocity, z, color, visible, opacity, anchor, offset, collisionType, collisionGroup, silenceWarnings } = {\n ...config\n };\n this.name = name !== null && name !== void 0 ? name : this.name;\n this.anchor = anchor !== null && anchor !== void 0 ? anchor : Actor.defaults.anchor.clone();\n this.offset = offset !== null && offset !== void 0 ? offset : _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero;\n this.transform = new _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent();\n this.addComponent(this.transform);\n this.pos = pos !== null && pos !== void 0 ? pos : (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(x !== null && x !== void 0 ? x : 0, y !== null && y !== void 0 ? y : 0);\n this.rotation = rotation !== null && rotation !== void 0 ? rotation : 0;\n this.scale = scale !== null && scale !== void 0 ? scale : (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(1, 1);\n this.z = z !== null && z !== void 0 ? z : 0;\n this.transform.coordPlane = coordPlane !== null && coordPlane !== void 0 ? coordPlane : _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__.CoordPlane.World;\n this._silenceWarnings = silenceWarnings !== null && silenceWarnings !== void 0 ? silenceWarnings : false;\n this.pointer = new _Input_PointerComponent__WEBPACK_IMPORTED_MODULE_7__.PointerComponent();\n this.addComponent(this.pointer);\n this.graphics = new _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_8__.GraphicsComponent({\n anchor: this.anchor,\n offset: this.offset,\n opacity: opacity\n });\n this.addComponent(this.graphics);\n this.motion = new _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_9__.MotionComponent();\n this.addComponent(this.motion);\n this.vel = vel !== null && vel !== void 0 ? vel : _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero;\n this.acc = acc !== null && acc !== void 0 ? acc : _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero;\n this.angularVelocity = angularVelocity !== null && angularVelocity !== void 0 ? angularVelocity : 0;\n this.actions = new _Actions_ActionsComponent__WEBPACK_IMPORTED_MODULE_10__.ActionsComponent();\n this.addComponent(this.actions);\n this.body = new _Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_11__.BodyComponent();\n this.addComponent(this.body);\n this.body.collisionType = collisionType !== null && collisionType !== void 0 ? collisionType : _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_12__.CollisionType.Passive;\n if (collisionGroup) {\n this.body.group = collisionGroup;\n }\n if (color) {\n this.color = color;\n }\n if (collider) {\n this.collider = new _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_13__.ColliderComponent(collider);\n this.addComponent(this.collider);\n }\n else if (radius) {\n this.collider = new _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_13__.ColliderComponent(_Collision_Colliders_Shape__WEBPACK_IMPORTED_MODULE_14__.Shape.Circle(radius));\n this.addComponent(this.collider);\n if (color) {\n this.graphics.add(new _Graphics_Circle__WEBPACK_IMPORTED_MODULE_15__.Circle({\n color: color,\n radius\n }));\n }\n }\n else {\n if (width > 0 && height > 0) {\n this.collider = new _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_13__.ColliderComponent(_Collision_Colliders_Shape__WEBPACK_IMPORTED_MODULE_14__.Shape.Box(width, height, this.anchor));\n this.addComponent(this.collider);\n if (color && width && height) {\n this.graphics.add(new _Graphics_Rectangle__WEBPACK_IMPORTED_MODULE_16__.Rectangle({\n color: color,\n width,\n height\n }));\n }\n }\n else {\n this.collider = new _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_13__.ColliderComponent();\n this.addComponent(this.collider); // no collider\n }\n }\n this.graphics.isVisible = visible !== null && visible !== void 0 ? visible : true;\n }\n clone() {\n const clone = new Actor({\n silenceWarnings: this._silenceWarnings,\n color: this.color.clone(),\n anchor: this.anchor.clone(),\n offset: this.offset.clone()\n });\n clone.clearComponents();\n clone.processComponentRemoval();\n // Clone builtins, order is important, same as ctor\n clone.addComponent((clone.transform = this.transform.clone()), true);\n clone.addComponent((clone.pointer = this.pointer.clone()), true);\n clone.addComponent((clone.graphics = this.graphics.clone()), true);\n clone.addComponent((clone.motion = this.motion.clone()), true);\n clone.addComponent((clone.actions = this.actions.clone()), true);\n clone.addComponent((clone.body = this.body.clone()), true);\n clone.addComponent((clone.collider = this.collider.clone()), true);\n const builtInComponents = [\n this.transform,\n this.pointer,\n this.graphics,\n this.motion,\n this.actions,\n this.body,\n this.collider\n ];\n // Clone non-builtin the current actors components\n const components = this.getComponents();\n for (const c of components) {\n if (!builtInComponents.includes(c)) {\n clone.addComponent(c.clone(), true);\n }\n }\n return clone;\n }\n /**\n * `onInitialize` is called before the first update of the actor. This method is meant to be\n * overridden. This is where initialization of child actors should take place.\n *\n * Synonymous with the event handler `.on('initialize', (evt) => {...})`\n */\n onInitialize(engine) {\n // Override me\n }\n /**\n * Initializes this actor and all it's child actors, meant to be called by the Scene before first update not by users of Excalibur.\n *\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n * @internal\n */\n _initialize(engine) {\n super._initialize(engine);\n for (const child of this.children) {\n child._initialize(engine);\n }\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n // #endregion\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _prekill handler for {@apilink onPreKill} lifecycle event\n * @internal\n */\n _prekill(scene) {\n this.events.emit('prekill', new _Events__WEBPACK_IMPORTED_MODULE_17__.PreKillEvent(this));\n this.onPreKill(scene);\n }\n /**\n * Safe to override onPreKill lifecycle event handler. Synonymous with `.on('prekill', (evt) =>{...})`\n *\n * `onPreKill` is called directly before an actor is killed and removed from its current {@apilink Scene}.\n */\n onPreKill(scene) {\n // Override me\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _prekill handler for {@apilink onPostKill} lifecycle event\n * @internal\n */\n _postkill(scene) {\n this.events.emit('postkill', new _Events__WEBPACK_IMPORTED_MODULE_17__.PostKillEvent(this));\n this.onPostKill(scene);\n }\n /**\n * Safe to override onPostKill lifecycle event handler. Synonymous with `.on('postkill', (evt) => {...})`\n *\n * `onPostKill` is called directly after an actor is killed and remove from its current {@apilink Scene}.\n */\n onPostKill(scene) {\n // Override me\n }\n /**\n * If the current actor is a member of the scene, this will remove\n * it from the scene graph. It will no longer be drawn or updated.\n */\n kill() {\n if (this.scene) {\n this._prekill(this.scene);\n this.events.emit('kill', new _Events__WEBPACK_IMPORTED_MODULE_17__.KillEvent(this));\n super.kill();\n this._postkill(this.scene);\n }\n else {\n this.logger.warn(`Cannot kill actor named \"${this.name}\", it was never added to the Scene`);\n }\n }\n /**\n * If the current actor is killed, it will now not be killed.\n */\n unkill() {\n this.isActive = true;\n }\n /**\n * Indicates wether the actor has been killed.\n */\n isKilled() {\n return !this.isActive;\n }\n /**\n * Gets the z-index of an actor. The z-index determines the relative order an actor is drawn in.\n * Actors with a higher z-index are drawn on top of actors with a lower z-index\n */\n get z() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).z;\n }\n /**\n * Sets the z-index of an actor and updates it in the drawing list for the scene.\n * The z-index determines the relative order an actor is drawn in.\n * Actors with a higher z-index are drawn on top of actors with a lower z-index\n * @param newZ new z-index to assign\n */\n set z(newZ) {\n this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).z = newZ;\n }\n /**\n * Get the center point of an actor (global position)\n */\n get center() {\n const globalPos = this.getGlobalPos();\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector(globalPos.x + this.width / 2 - this.anchor.x * this.width, globalPos.y + this.height / 2 - this.anchor.y * this.height);\n }\n /**\n * Get the local center point of an actor\n */\n get localCenter() {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector(this.pos.x + this.width / 2 - this.anchor.x * this.width, this.pos.y + this.height / 2 - this.anchor.y * this.height);\n }\n get width() {\n return this.collider.localBounds.width * this.getGlobalScale().x;\n }\n get height() {\n return this.collider.localBounds.height * this.getGlobalScale().y;\n }\n /**\n * Gets this actor's rotation taking into account any parent relationships\n * @returns Rotation angle in radians\n * @deprecated Use {@apilink globalRotation} instead\n */\n getGlobalRotation() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).globalRotation;\n }\n /**\n * The actor's rotation (in radians) taking into account any parent relationships\n */\n get globalRotation() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).globalRotation;\n }\n /**\n * Gets an actor's world position taking into account parent relationships, scaling, rotation, and translation\n * @returns Position in world coordinates\n * @deprecated Use {@apilink globalPos} instead\n */\n getGlobalPos() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).globalPos;\n }\n /**\n * The actor's world position taking into account parent relationships, scaling, rotation, and translation\n */\n get globalPos() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).globalPos;\n }\n /**\n * Gets the global scale of the Actor\n * @deprecated Use {@apilink globalScale} instead\n */\n getGlobalScale() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).globalScale;\n }\n /**\n * The global scale of the Actor\n */\n get globalScale() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).globalScale;\n }\n /**\n * The global z-index of the actor\n */\n get globalZ() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).globalZ;\n }\n // #region Collision\n /**\n * Tests whether the x/y specified are contained in the actor\n * @param x X coordinate to test (in world coordinates)\n * @param y Y coordinate to test (in world coordinates)\n * @param recurse checks whether the x/y are contained in any child actors (if they exist).\n */\n contains(x, y, recurse = false) {\n const point = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(x, y);\n const collider = this.get(_Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_13__.ColliderComponent);\n collider.update();\n const geom = collider.get();\n if (!geom) {\n return false;\n }\n const containment = geom.contains(point);\n if (recurse) {\n return (containment ||\n this.children.some((child) => {\n return child.contains(x, y, true);\n }));\n }\n return containment;\n }\n /**\n * Returns true if the two actor.collider's surfaces are less than or equal to the distance specified from each other\n * @param actor Actor to test\n * @param distance Distance in pixels to test\n */\n within(actor, distance) {\n const collider = this.get(_Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_13__.ColliderComponent);\n const otherCollider = actor.get(_Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_13__.ColliderComponent);\n const me = collider.get();\n const other = otherCollider.get();\n if (me && other) {\n return me.getClosestLineBetween(other).getLength() <= distance;\n }\n return false;\n }\n // #endregion\n // #region Update\n /**\n * Called by the Engine, updates the state of the actor\n * @internal\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n */\n update(engine, elapsed) {\n this._initialize(engine);\n this._add(engine);\n this._preupdate(engine, elapsed);\n this._postupdate(engine, elapsed);\n this._remove(engine);\n }\n /**\n * Safe to override onPreUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPreUpdate` is called directly before an actor is updated.\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n */\n onPreUpdate(engine, elapsed) {\n // Override me\n }\n /**\n * Safe to override onPostUpdate lifecycle event handler. Synonymous with `.on('postupdate', (evt) =>{...})`\n *\n * `onPostUpdate` is called directly after an actor is updated.\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n */\n onPostUpdate(engine, elapsed) {\n // Override me\n }\n /**\n * Fires before every collision resolution for a confirmed contact\n * @param self\n * @param other\n * @param side\n * @param contact\n */\n onPreCollisionResolve(self, other, side, contact) {\n // Override me\n }\n /**\n * Fires after every resolution for a confirmed contact.\n * @param self\n * @param other\n * @param side\n * @param contact\n */\n onPostCollisionResolve(self, other, side, contact) {\n // Override me\n }\n /**\n * Fires once when 2 entities with a ColliderComponent first start colliding or touching, if the Colliders stay in contact this\n * does not continue firing until they separate and re-collide.\n * @param self\n * @param other\n * @param side\n * @param contact\n */\n onCollisionStart(self, other, side, contact) {\n // Override me\n }\n /**\n * Fires once when 2 entities with a ColliderComponent separate after having been in contact.\n * @param self\n * @param other\n * @param side\n * @param lastContact\n */\n onCollisionEnd(self, other, side, lastContact) {\n // Override me\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _preupdate handler for {@apilink onPreUpdate} lifecycle event\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n * @internal\n */\n _preupdate(engine, elapsed) {\n this.events.emit('preupdate', new _Events__WEBPACK_IMPORTED_MODULE_17__.PreUpdateEvent(engine, elapsed, this));\n this.onPreUpdate(engine, elapsed);\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _preupdate handler for {@apilink onPostUpdate} lifecycle event\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n * @internal\n */\n _postupdate(engine, elapsed) {\n this.events.emit('postupdate', new _Events__WEBPACK_IMPORTED_MODULE_17__.PostUpdateEvent(engine, elapsed, this));\n this.onPostUpdate(engine, elapsed);\n }\n}\n// #region Properties\n/**\n * Set defaults for all Actors\n */\nActor.defaults = {\n anchor: _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Half\n};\n\n\n/***/ }),\n\n/***/ \"./Camera.ts\":\n/*!*******************!*\\\n !*** ./Camera.ts ***!\n \\*******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Axis: () => (/* binding */ Axis),\n/* harmony export */ Camera: () => (/* binding */ Camera),\n/* harmony export */ CameraEvents: () => (/* binding */ CameraEvents),\n/* harmony export */ ElasticToActorStrategy: () => (/* binding */ ElasticToActorStrategy),\n/* harmony export */ LimitCameraBoundsStrategy: () => (/* binding */ LimitCameraBoundsStrategy),\n/* harmony export */ LockCameraToActorAxisStrategy: () => (/* binding */ LockCameraToActorAxisStrategy),\n/* harmony export */ LockCameraToActorStrategy: () => (/* binding */ LockCameraToActorStrategy),\n/* harmony export */ RadiusAroundActorStrategy: () => (/* binding */ RadiusAroundActorStrategy),\n/* harmony export */ StrategyContainer: () => (/* binding */ StrategyContainer)\n/* harmony export */ });\n/* harmony import */ var _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Util/EasingFunctions */ \"./Util/EasingFunctions.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Util/Util */ \"./Util/Util.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Events */ \"./Events.ts\");\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Math/affine-matrix */ \"./Math/affine-matrix.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Graphics */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Math_watch_vector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Math/watch-vector */ \"./Math/watch-vector.ts\");\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Container to house convenience strategy methods\n * @internal\n */\nclass StrategyContainer {\n constructor(camera) {\n this.camera = camera;\n }\n /**\n * Creates and adds the {@apilink LockCameraToActorStrategy} on the current camera.\n * @param actor The actor to lock the camera to\n */\n lockToActor(actor) {\n this.camera.addStrategy(new LockCameraToActorStrategy(actor));\n }\n /**\n * Creates and adds the {@apilink LockCameraToActorAxisStrategy} on the current camera\n * @param actor The actor to lock the camera to\n * @param axis The axis to follow the actor on\n */\n lockToActorAxis(actor, axis) {\n this.camera.addStrategy(new LockCameraToActorAxisStrategy(actor, axis));\n }\n /**\n * Creates and adds the {@apilink ElasticToActorStrategy} on the current camera\n * If cameraElasticity < cameraFriction < 1.0, the behavior will be a dampened spring that will slowly end at the target without bouncing\n * If cameraFriction < cameraElasticity < 1.0, the behavior will be an oscillating spring that will over\n * correct and bounce around the target\n * @param actor Target actor to elastically follow\n * @param cameraElasticity [0 - 1.0] The higher the elasticity the more force that will drive the camera towards the target\n * @param cameraFriction [0 - 1.0] The higher the friction the more that the camera will resist motion towards the target\n */\n elasticToActor(actor, cameraElasticity, cameraFriction) {\n this.camera.addStrategy(new ElasticToActorStrategy(actor, cameraElasticity, cameraFriction));\n }\n /**\n * Creates and adds the {@apilink RadiusAroundActorStrategy} on the current camera\n * @param actor Target actor to follow when it is \"radius\" pixels away\n * @param radius Number of pixels away before the camera will follow\n */\n radiusAroundActor(actor, radius) {\n this.camera.addStrategy(new RadiusAroundActorStrategy(actor, radius));\n }\n /**\n * Creates and adds the {@apilink LimitCameraBoundsStrategy} on the current camera\n * @param box The bounding box to limit the camera to.\n */\n limitCameraBounds(box) {\n this.camera.addStrategy(new LimitCameraBoundsStrategy(box));\n }\n}\n/**\n * Camera axis enum\n */\nvar Axis;\n(function (Axis) {\n Axis[Axis[\"X\"] = 0] = \"X\";\n Axis[Axis[\"Y\"] = 1] = \"Y\";\n})(Axis || (Axis = {}));\n/**\n * Lock a camera to the exact x/y position of an actor.\n */\nclass LockCameraToActorStrategy {\n constructor(target) {\n this.target = target;\n this.action = (target, camera, engine, elapsed) => {\n const center = target.center;\n return center;\n };\n }\n}\n/**\n * Lock a camera to a specific axis around an actor.\n */\nclass LockCameraToActorAxisStrategy {\n constructor(target, axis) {\n this.target = target;\n this.axis = axis;\n this.action = (target, cam, _eng, elapsed) => {\n const center = target.center;\n const currentFocus = cam.getFocus();\n if (this.axis === Axis.X) {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(center.x, currentFocus.y);\n }\n else {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(currentFocus.x, center.y);\n }\n };\n }\n}\n/**\n * Using [Hook's law](https://en.wikipedia.org/wiki/Hooke's_law), elastically move the camera towards the target actor.\n */\nclass ElasticToActorStrategy {\n /**\n * If cameraElasticity < cameraFriction < 1.0, the behavior will be a dampened spring that will slowly end at the target without bouncing\n * If cameraFriction < cameraElasticity < 1.0, the behavior will be an oscillating spring that will over\n * correct and bounce around the target\n * @param target Target actor to elastically follow\n * @param cameraElasticity [0 - 1.0] The higher the elasticity the more force that will drive the camera towards the target\n * @param cameraFriction [0 - 1.0] The higher the friction the more that the camera will resist motion towards the target\n */\n constructor(target, cameraElasticity, cameraFriction) {\n this.target = target;\n this.cameraElasticity = cameraElasticity;\n this.cameraFriction = cameraFriction;\n this.action = (target, cam, _eng, elapsed) => {\n const position = target.center;\n let focus = cam.getFocus();\n let cameraVel = cam.vel.clone();\n // Calculate the stretch vector, using the spring equation\n // F = kX\n // https://en.wikipedia.org/wiki/Hooke's_law\n // Apply to the current camera velocity\n const stretch = position.sub(focus).scale(this.cameraElasticity); // stretch is X\n cameraVel = cameraVel.add(stretch);\n // Calculate the friction (-1 to apply a force in the opposition of motion)\n // Apply to the current camera velocity\n const friction = cameraVel.scale(-1).scale(this.cameraFriction);\n cameraVel = cameraVel.add(friction);\n // Update position by velocity deltas\n focus = focus.add(cameraVel);\n return focus;\n };\n }\n}\nclass RadiusAroundActorStrategy {\n /**\n *\n * @param target Target actor to follow when it is \"radius\" pixels away\n * @param radius Number of pixels away before the camera will follow\n */\n constructor(target, radius) {\n this.target = target;\n this.radius = radius;\n this.action = (target, cam, _eng, elapsed) => {\n const position = target.center;\n const focus = cam.getFocus();\n const direction = position.sub(focus);\n const distance = direction.magnitude;\n if (distance >= this.radius) {\n const offset = distance - this.radius;\n return focus.add(direction.normalize().scale(offset));\n }\n return focus;\n };\n }\n}\n/**\n * Prevent a camera from going beyond the given camera dimensions.\n */\nclass LimitCameraBoundsStrategy {\n constructor(target) {\n this.target = target;\n /**\n * Useful for limiting the camera to a {@apilink TileMap}'s dimensions, or a specific area inside the map.\n *\n * Note that this strategy does not perform any movement by itself.\n * It only sets the camera position to within the given bounds when the camera has gone beyond them.\n * Thus, it is a good idea to combine it with other camera strategies and set this strategy as the last one.\n *\n * Make sure that the camera bounds are at least as large as the viewport size.\n * @param target The bounding box to limit the camera to\n */\n this.boundSizeChecked = false; // Check and warn only once\n this.action = (target, cam, _eng, elapsed) => {\n const focus = cam.getFocus();\n if (!this.boundSizeChecked) {\n if (target.bottom - target.top < _eng.drawHeight || target.right - target.left < _eng.drawWidth) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance().warn('Camera bounds should not be smaller than the engine viewport');\n }\n this.boundSizeChecked = true;\n }\n let focusX = focus.x;\n let focusY = focus.y;\n if (focus.x < target.left + _eng.halfDrawWidth) {\n focusX = target.left + _eng.halfDrawWidth;\n }\n else if (focus.x > target.right - _eng.halfDrawWidth) {\n focusX = target.right - _eng.halfDrawWidth;\n }\n if (focus.y < target.top + _eng.halfDrawHeight) {\n focusY = target.top + _eng.halfDrawHeight;\n }\n else if (focus.y > target.bottom - _eng.halfDrawHeight) {\n focusY = target.bottom - _eng.halfDrawHeight;\n }\n return (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(focusX, focusY);\n };\n }\n}\nconst CameraEvents = {\n Initialize: 'initialize',\n PreUpdate: 'preupdate',\n PostUpdate: 'postupdate'\n};\n/**\n * Cameras\n *\n * {@apilink Camera} is the base class for all Excalibur cameras. Cameras are used\n * to move around your game and set focus. They are used to determine\n * what is \"off screen\" and can be used to scale the game.\n *\n */\nclass Camera {\n constructor() {\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_2__.EventEmitter();\n this.transform = _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_3__.AffineMatrix.identity();\n this.inverse = _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_3__.AffineMatrix.identity();\n this._cameraStrategies = [];\n this.strategy = new StrategyContainer(this);\n /**\n * Get or set current zoom of the camera, defaults to 1\n */\n this._z = 1;\n /**\n * Get or set rate of change in zoom, defaults to 0\n */\n this.dz = 0;\n /**\n * Get or set zoom acceleration\n */\n this.az = 0;\n /**\n * Current rotation of the camera\n */\n this.rotation = 0;\n this._angularVelocity = 0;\n this._posChanged = false;\n this._pos = new _Math_watch_vector__WEBPACK_IMPORTED_MODULE_4__.WatchVector(_Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero, () => {\n this._posChanged = true;\n });\n /**\n * Interpolated camera position if more draws are running than updates\n *\n * Enabled when `Engine.fixedUpdateFps` is enabled, in all other cases this will be the same as pos\n */\n this.drawPos = this.pos.clone();\n this._oldPos = this.pos.clone();\n /**\n * Get or set the camera's velocity\n */\n this.vel = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero;\n /**\n * Get or set the camera's acceleration\n */\n this.acc = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero;\n this._cameraMoving = false;\n this._currentLerpTime = 0;\n this._lerpDuration = 1000; // 1 second\n this._lerpStart = null;\n this._lerpEnd = null;\n //camera effects\n this._isShaking = false;\n this._shakeMagnitudeX = 0;\n this._shakeMagnitudeY = 0;\n this._shakeDuration = 0;\n this._elapsedShakeTime = 0;\n this._xShake = 0;\n this._yShake = 0;\n this._isZooming = false;\n this._zoomStart = 1;\n this._zoomEnd = 1;\n this._currentZoomTime = 0;\n this._zoomDuration = 0;\n this._zoomEasing = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_5__.EasingFunctions.EaseInOutCubic;\n this._easing = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_5__.EasingFunctions.EaseInOutCubic;\n this._halfWidth = 0;\n this._halfHeight = 0;\n this._viewport = null;\n this._isInitialized = false;\n this._snapPos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n }\n get zoom() {\n return this._z;\n }\n set zoom(val) {\n this._z = val;\n if (this._engine) {\n this._halfWidth = this._engine.halfDrawWidth;\n this._halfHeight = this._engine.halfDrawHeight;\n }\n }\n /**\n * Get or set the camera's angular velocity\n */\n get angularVelocity() {\n return this._angularVelocity;\n }\n set angularVelocity(value) {\n this._angularVelocity = value;\n }\n /**\n * Get or set the camera's position\n */\n get pos() {\n return this._pos;\n }\n set pos(vec) {\n this._posChanged = true;\n this._pos = new _Math_watch_vector__WEBPACK_IMPORTED_MODULE_4__.WatchVector(vec, () => {\n this._posChanged = true;\n });\n }\n /**\n * Has the position changed since the last update\n */\n hasChanged() {\n return this._posChanged;\n }\n /**\n * Get the camera's x position\n */\n get x() {\n return this.pos.x;\n }\n /**\n * Set the camera's x position (cannot be set when following an {@apilink Actor} or when moving)\n */\n set x(value) {\n if (!this._follow && !this._cameraMoving) {\n this.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(value, this.pos.y);\n }\n }\n /**\n * Get the camera's y position\n */\n get y() {\n return this.pos.y;\n }\n /**\n * Set the camera's y position (cannot be set when following an {@apilink Actor} or when moving)\n */\n set y(value) {\n if (!this._follow && !this._cameraMoving) {\n this.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.pos.x, value);\n }\n }\n /**\n * Get or set the camera's x velocity\n */\n get dx() {\n return this.vel.x;\n }\n set dx(value) {\n this.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(value, this.vel.y);\n }\n /**\n * Get or set the camera's y velocity\n */\n get dy() {\n return this.vel.y;\n }\n set dy(value) {\n this.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.vel.x, value);\n }\n /**\n * Get or set the camera's x acceleration\n */\n get ax() {\n return this.acc.x;\n }\n set ax(value) {\n this.acc = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(value, this.acc.y);\n }\n /**\n * Get or set the camera's y acceleration\n */\n get ay() {\n return this.acc.y;\n }\n set ay(value) {\n this.acc = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.acc.x, value);\n }\n /**\n * Returns the focal point of the camera, a new point giving the x and y position of the camera\n */\n getFocus() {\n return this.pos;\n }\n /**\n * This moves the camera focal point to the specified position using specified easing function. Cannot move when following an Actor.\n * @param pos The target position to move to\n * @param duration The duration in milliseconds the move should last\n * @param [easingFn] An optional easing function ({@apilink EasingFunctions.EaseInOutCubic} by default)\n * @returns A {@apilink Promise} that resolves when movement is finished, including if it's interrupted.\n * The {@apilink Promise} value is the {@apilink Vector} of the target position. It will be rejected if a move cannot be made.\n */\n move(pos, duration, easingFn = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_5__.EasingFunctions.EaseInOutCubic) {\n if (typeof easingFn !== 'function') {\n throw 'Please specify an EasingFunction';\n }\n // cannot move when following an actor\n if (this._follow) {\n return Promise.reject(pos);\n }\n // resolve existing promise, if any\n if (this._lerpPromise && this._lerpResolve) {\n this._lerpResolve(pos);\n }\n this._lerpPromise = new Promise((resolve) => {\n this._lerpResolve = resolve;\n });\n this._lerpStart = this.getFocus().clone();\n this._lerpDuration = duration;\n this._lerpEnd = pos;\n this._currentLerpTime = 0;\n this._cameraMoving = true;\n this._easing = easingFn;\n return this._lerpPromise;\n }\n /**\n * Sets the camera to shake at the specified magnitudes for the specified duration\n * @param magnitudeX The x magnitude of the shake\n * @param magnitudeY The y magnitude of the shake\n * @param duration The duration of the shake in milliseconds\n */\n shake(magnitudeX, magnitudeY, duration) {\n this._isShaking = true;\n this._shakeMagnitudeX = magnitudeX;\n this._shakeMagnitudeY = magnitudeY;\n this._shakeDuration = duration;\n }\n /**\n * Zooms the camera in or out by the specified scale over the specified duration.\n * If no duration is specified, it take effect immediately.\n * @param scale The scale of the zoom\n * @param duration The duration of the zoom in milliseconds\n */\n zoomOverTime(scale, duration = 0, easingFn = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_5__.EasingFunctions.EaseInOutCubic) {\n this._zoomPromise = new Promise((resolve) => {\n this._zoomResolve = resolve;\n });\n if (duration) {\n this._isZooming = true;\n this._zoomEasing = easingFn;\n this._currentZoomTime = 0;\n this._zoomDuration = duration;\n this._zoomStart = this.zoom;\n this._zoomEnd = scale;\n }\n else {\n this._isZooming = false;\n this.zoom = scale;\n return Promise.resolve(true);\n }\n return this._zoomPromise;\n }\n /**\n * Gets the bounding box of the viewport of this camera in world coordinates\n */\n get viewport() {\n if (this._viewport) {\n return this._viewport;\n }\n return new _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox(0, 0, 0, 0);\n }\n /**\n * Adds a new camera strategy to this camera\n * @param cameraStrategy Instance of an {@apilink CameraStrategy}\n */\n addStrategy(cameraStrategy) {\n this._cameraStrategies.push(cameraStrategy);\n }\n /**\n * Removes a camera strategy by reference\n * @param cameraStrategy Instance of an {@apilink CameraStrategy}\n */\n removeStrategy(cameraStrategy) {\n (0,_Util_Util__WEBPACK_IMPORTED_MODULE_7__.removeItemFromArray)(cameraStrategy, this._cameraStrategies);\n }\n /**\n * Clears all camera strategies from the camera\n */\n clearAllStrategies() {\n this._cameraStrategies.length = 0;\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _preupdate handler for {@apilink onPreUpdate} lifecycle event\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n * @internal\n */\n _preupdate(engine, elapsed) {\n this.events.emit('preupdate', new _Events__WEBPACK_IMPORTED_MODULE_8__.PreUpdateEvent(engine, elapsed, this));\n this.onPreUpdate(engine, elapsed);\n }\n /**\n * Safe to override onPreUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPreUpdate` is called directly before a scene is updated.\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n */\n onPreUpdate(engine, elapsed) {\n // Overridable\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _preupdate handler for {@apilink onPostUpdate} lifecycle event\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n * @internal\n */\n _postupdate(engine, elapsed) {\n this.events.emit('postupdate', new _Events__WEBPACK_IMPORTED_MODULE_8__.PostUpdateEvent(engine, elapsed, this));\n this.onPostUpdate(engine, elapsed);\n }\n /**\n * Safe to override onPostUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPostUpdate` is called directly after a scene is updated.\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n */\n onPostUpdate(engine, elapsed) {\n // Overridable\n }\n get isInitialized() {\n return this._isInitialized;\n }\n _initialize(engine) {\n if (!this.isInitialized) {\n this._engine = engine;\n this._screen = engine.screen;\n const currentRes = this._screen.contentArea;\n let center = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(currentRes.width / 2, currentRes.height / 2);\n if (!this._engine.loadingComplete) {\n // If there was a loading screen, we peek the configured resolution\n const res = this._screen.peekResolution();\n if (res) {\n center = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(res.width / 2, res.height / 2);\n }\n }\n this._halfWidth = center.x;\n this._halfHeight = center.y;\n // If the user has not set the camera pos, apply default center screen position\n if (!this._posChanged) {\n this.pos = center;\n }\n this.pos.clone(this.drawPos);\n // First frame bootstrap\n // Ensure camera tx is correct\n // Run update twice to ensure properties are init'd\n this.updateTransform(this.pos);\n // Run strategies for first frame\n this.runStrategies(engine, engine.clock.elapsed());\n // Setup the first frame viewport\n this.updateViewport();\n // It's important to update the camera after strategies\n // This prevents jitter\n this.updateTransform(this.pos);\n this.pos.clone(this._oldPos);\n this.onInitialize(engine);\n this.events.emit('initialize', new _Events__WEBPACK_IMPORTED_MODULE_8__.InitializeEvent(engine, this));\n this._isInitialized = true;\n }\n }\n /**\n * Safe to override onPostUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPostUpdate` is called directly after a scene is updated.\n */\n onInitialize(engine) {\n // Overridable\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n runStrategies(engine, elapsed) {\n for (const s of this._cameraStrategies) {\n this.pos = s.action.call(s, s.target, this, engine, elapsed);\n }\n }\n updateViewport() {\n // recalculate viewport\n this._viewport = new _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox(this.x - this._halfWidth, this.y - this._halfHeight, this.x + this._halfWidth, this.y + this._halfHeight);\n }\n update(engine, elapsed) {\n this._initialize(engine);\n this._preupdate(engine, elapsed);\n this.pos.clone(this._oldPos);\n // Update placements based on linear algebra\n this.pos = this.pos.add(this.vel.scale(elapsed / 1000));\n this.zoom += (this.dz * elapsed) / 1000;\n this.vel = this.vel.add(this.acc.scale(elapsed / 1000));\n this.dz += (this.az * elapsed) / 1000;\n this.rotation += (this.angularVelocity * elapsed) / 1000;\n if (this._isZooming) {\n if (this._currentZoomTime < this._zoomDuration) {\n const zoomEasing = this._zoomEasing;\n const newZoom = zoomEasing(this._currentZoomTime, this._zoomStart, this._zoomEnd, this._zoomDuration);\n this.zoom = newZoom;\n this._currentZoomTime += elapsed;\n }\n else {\n this._isZooming = false;\n this.zoom = this._zoomEnd;\n this._currentZoomTime = 0;\n this._zoomResolve(true);\n }\n }\n if (this._cameraMoving) {\n if (this._currentLerpTime < this._lerpDuration) {\n const moveEasing = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_5__.EasingFunctions.CreateVectorEasingFunction(this._easing);\n const lerpPoint = moveEasing(this._currentLerpTime, this._lerpStart, this._lerpEnd, this._lerpDuration);\n this.pos = lerpPoint;\n this._currentLerpTime += elapsed;\n }\n else {\n this.pos = this._lerpEnd;\n const end = this._lerpEnd.clone();\n this._lerpStart = null;\n this._lerpEnd = null;\n this._currentLerpTime = 0;\n this._cameraMoving = false;\n // Order matters here, resolve should be last so any chain promises have a clean slate\n this._lerpResolve(end);\n }\n }\n if (this._isDoneShaking()) {\n this._isShaking = false;\n this._elapsedShakeTime = 0;\n this._shakeMagnitudeX = 0;\n this._shakeMagnitudeY = 0;\n this._shakeDuration = 0;\n this._xShake = 0;\n this._yShake = 0;\n }\n else {\n this._elapsedShakeTime += elapsed;\n this._xShake = ((Math.random() * this._shakeMagnitudeX) | 0) + 1;\n this._yShake = ((Math.random() * this._shakeMagnitudeY) | 0) + 1;\n }\n this.runStrategies(engine, elapsed);\n this.updateViewport();\n // It's important to update the camera after strategies\n // This prevents jitter\n this.updateTransform(this.pos);\n this._postupdate(engine, elapsed);\n this._posChanged = false;\n }\n /**\n * Applies the relevant transformations to the game canvas to \"move\" or apply effects to the Camera\n * @param ctx Canvas context to apply transformations\n */\n draw(ctx) {\n // default to the current position\n this.pos.clone(this.drawPos);\n // interpolation if fixed update is on\n // must happen on the draw, because more draws are potentially happening than updates\n if (this._engine.fixedUpdateTimestep) {\n const blend = this._engine.currentFrameLagMs / this._engine.fixedUpdateTimestep;\n const interpolatedPos = this.pos.scale(blend).add(this._oldPos.scale(1.0 - blend));\n interpolatedPos.clone(this.drawPos);\n this.updateTransform(interpolatedPos);\n }\n // Snap camera to pixel\n if (ctx.snapToPixel) {\n const snapPos = this.drawPos.clone(this._snapPos);\n snapPos.x = ~~(snapPos.x + _Graphics__WEBPACK_IMPORTED_MODULE_9__.pixelSnapEpsilon * (0,_Math_util__WEBPACK_IMPORTED_MODULE_10__.sign)(snapPos.x));\n snapPos.y = ~~(snapPos.y + _Graphics__WEBPACK_IMPORTED_MODULE_9__.pixelSnapEpsilon * (0,_Math_util__WEBPACK_IMPORTED_MODULE_10__.sign)(snapPos.y));\n snapPos.clone(this.drawPos);\n this.updateTransform(snapPos);\n }\n ctx.multiply(this.transform);\n }\n updateTransform(pos) {\n // center the camera\n const newCanvasWidth = this._screen.resolution.width / this.zoom;\n const newCanvasHeight = this._screen.resolution.height / this.zoom;\n const cameraPos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(-pos.x + newCanvasWidth / 2 + this._xShake, -pos.y + newCanvasHeight / 2 + this._yShake);\n // Calculate camera transform\n this.transform.reset();\n this.transform.scale(this.zoom, this.zoom);\n // rotate about the focus\n this.transform.translate(newCanvasWidth / 2, newCanvasHeight / 2);\n this.transform.rotate(this.rotation);\n this.transform.translate(-newCanvasWidth / 2, -newCanvasHeight / 2);\n this.transform.translate(cameraPos.x, cameraPos.y);\n this.transform.inverse(this.inverse);\n }\n _isDoneShaking() {\n return !this._isShaking || this._elapsedShakeTime >= this._shakeDuration;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/BodyComponent.ts\":\n/*!************************************!*\\\n !*** ./Collision/BodyComponent.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BodyComponent: () => (/* binding */ BodyComponent),\n/* harmony export */ DegreeOfFreedom: () => (/* binding */ DegreeOfFreedom)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Component */ \"./EntityComponentSystem/Component.ts\");\n/* harmony import */ var _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Group/CollisionGroup */ \"./Collision/Group/CollisionGroup.ts\");\n/* harmony import */ var _Id__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Id */ \"./Id.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _ColliderComponent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./ColliderComponent */ \"./Collision/ColliderComponent.ts\");\n/* harmony import */ var _Math_transform__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Math/transform */ \"./Math/transform.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _PhysicsConfig__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./PhysicsConfig */ \"./Collision/PhysicsConfig.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\nvar DegreeOfFreedom;\n(function (DegreeOfFreedom) {\n DegreeOfFreedom[\"Rotation\"] = \"rotation\";\n DegreeOfFreedom[\"X\"] = \"x\";\n DegreeOfFreedom[\"Y\"] = \"y\";\n})(DegreeOfFreedom || (DegreeOfFreedom = {}));\n/**\n * Body describes all the physical properties pos, vel, acc, rotation, angular velocity for the purpose of\n * of physics simulation.\n */\nclass BodyComponent extends _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor(options) {\n var _a, _b, _c;\n super();\n this.dependencies = [_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent, _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent];\n this.id = (0,_Id__WEBPACK_IMPORTED_MODULE_3__.createId)('body', BodyComponent._ID++);\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_4__.EventEmitter();\n this.oldTransform = new _Math_transform__WEBPACK_IMPORTED_MODULE_5__.Transform();\n /**\n * Indicates whether the old transform has been captured at least once for interpolation\n * @internal\n */\n this.__oldTransformCaptured = false;\n /**\n * Enable or disabled the fixed update interpolation, by default interpolation is on.\n */\n this.enableFixedUpdateInterpolate = true;\n /**\n * Collision type for the rigidbody physics simulation, by default {@apilink CollisionType.PreventCollision}\n */\n this.collisionType = _CollisionType__WEBPACK_IMPORTED_MODULE_6__.CollisionType.PreventCollision;\n /**\n * The collision group for the body's colliders, by default body colliders collide with everything\n */\n this.group = _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_7__.CollisionGroup.All;\n this._sleeping = false;\n /**\n * The also known as coefficient of restitution of this actor, represents the amount of energy preserved after collision or the\n * bounciness. If 1, it is 100% bouncy, 0 it completely absorbs.\n */\n this.bounciness = 0.2;\n /**\n * The coefficient of friction on this actor.\n *\n * The {@apilink SolverStrategy.Arcade} does not support this property.\n *\n */\n this.friction = 0.99;\n /**\n * Should use global gravity {@apilink Physics.gravity} in it's physics simulation, default is true\n */\n this.useGravity = true;\n /**\n * Degrees of freedom to limit\n *\n * Note: this only limits responses in the realistic solver, if velocity/angularVelocity is set the actor will still respond\n */\n this.limitDegreeOfFreedom = [];\n this._oldGlobalPos = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Zero;\n /**\n * The velocity of the actor last frame (vx, vy) in pixels/second\n */\n this.oldVel = new _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector(0, 0);\n /**\n * Gets/sets the acceleration of the actor from the last frame. This does not include the global acc {@apilink Physics.acc}.\n */\n this.oldAcc = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Zero;\n this._impulseScratch = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_8__.vec)(0, 0);\n this._distanceFromCenterScratch = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_8__.vec)(0, 0);\n if (options) {\n this.collisionType = (_a = options.type) !== null && _a !== void 0 ? _a : this.collisionType;\n this.group = (_b = options.group) !== null && _b !== void 0 ? _b : this.group;\n this.useGravity = (_c = options.useGravity) !== null && _c !== void 0 ? _c : this.useGravity;\n this._bodyConfig = {\n ...(0,_PhysicsConfig__WEBPACK_IMPORTED_MODULE_9__.getDefaultPhysicsConfig)().bodies,\n ...options.config\n };\n }\n else {\n this._bodyConfig = {\n ...(0,_PhysicsConfig__WEBPACK_IMPORTED_MODULE_9__.getDefaultPhysicsConfig)().bodies\n };\n }\n this.updatePhysicsConfig(this._bodyConfig);\n this._mass = BodyComponent._DEFAULT_CONFIG.defaultMass;\n }\n get matrix() {\n return this.transform.get().matrix;\n }\n /**\n * Called by excalibur to update physics config defaults if they change\n * @param config\n */\n updatePhysicsConfig(config) {\n this._bodyConfig = {\n ...(0,_PhysicsConfig__WEBPACK_IMPORTED_MODULE_9__.getDefaultPhysicsConfig)().bodies,\n ...config\n };\n this.canSleep = this._bodyConfig.canSleepByDefault;\n this.sleepMotion = this._bodyConfig.sleepEpsilon * 5;\n this.wakeThreshold = this._bodyConfig.wakeThreshold;\n }\n /**\n * Called by excalibur to update defaults\n * @param config\n */\n static updateDefaultPhysicsConfig(config) {\n BodyComponent._DEFAULT_CONFIG = config;\n }\n get mass() {\n return this._mass;\n }\n set mass(newMass) {\n this._mass = newMass;\n this._cachedInertia = undefined;\n this._cachedInverseInertia = undefined;\n }\n /**\n * The inverse mass (1/mass) of the body. If {@apilink CollisionType.Fixed} this is 0, meaning \"infinite\" mass\n */\n get inverseMass() {\n return this.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_6__.CollisionType.Fixed ? 0 : 1 / this.mass;\n }\n /**\n * Whether this body is sleeping or not\n * @deprecated use isSleeping\n */\n get sleeping() {\n return this.isSleeping;\n }\n /**\n * Whether this body is sleeping or not\n */\n get isSleeping() {\n return this._sleeping;\n }\n /**\n * Set the sleep state of the body\n * @param sleeping\n * @deprecated use isSleeping\n */\n setSleeping(sleeping) {\n this.isSleeping = sleeping;\n }\n set isSleeping(sleeping) {\n this._sleeping = sleeping;\n if (!sleeping) {\n // Give it a kick to keep it from falling asleep immediately\n this.sleepMotion = this._bodyConfig.sleepEpsilon * 5;\n }\n else {\n this.vel = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Zero;\n this.acc = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Zero;\n this.angularVelocity = 0;\n this.sleepMotion = 0;\n }\n }\n /**\n * Update body's {@apilink BodyComponent.sleepMotion} for the purpose of sleeping\n */\n updateMotion() {\n if (this._sleeping) {\n this.isSleeping = true;\n }\n const currentMotion = this.vel.magnitude * this.vel.magnitude + Math.abs(this.angularVelocity * this.angularVelocity);\n const bias = this._bodyConfig.sleepBias;\n this.sleepMotion = bias * this.sleepMotion + (1 - bias) * currentMotion;\n this.sleepMotion = (0,_Math_util__WEBPACK_IMPORTED_MODULE_10__.clamp)(this.sleepMotion, 0, 10 * this._bodyConfig.sleepEpsilon);\n if (this.canSleep && this.sleepMotion < this._bodyConfig.sleepEpsilon) {\n this.isSleeping = true;\n }\n }\n /**\n * Get the moment of inertia from the {@apilink ColliderComponent}\n */\n get inertia() {\n if (this._cachedInertia) {\n return this._cachedInertia;\n }\n // Inertia is a property of the geometry, so this is a little goofy but seems to be okay?\n const collider = this.owner.get(_ColliderComponent__WEBPACK_IMPORTED_MODULE_11__.ColliderComponent);\n if (collider) {\n collider.$colliderAdded.subscribe(() => {\n this._cachedInertia = null;\n });\n collider.$colliderRemoved.subscribe(() => {\n this._cachedInertia = null;\n });\n const maybeCollider = collider.get();\n if (maybeCollider) {\n return (this._cachedInertia = maybeCollider.getInertia(this.mass));\n }\n }\n return 0;\n }\n /**\n * Get the inverse moment of inertial from the {@apilink ColliderComponent}. If {@apilink CollisionType.Fixed} this is 0, meaning \"infinite\" mass\n */\n get inverseInertia() {\n if (this._cachedInverseInertia) {\n return this._cachedInverseInertia;\n }\n return (this._cachedInverseInertia = this.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_6__.CollisionType.Fixed ? 0 : 1 / this.inertia);\n }\n /**\n * Returns if the owner is active\n * @deprecated use isActive\n */\n get active() {\n var _a;\n return !!((_a = this.owner) === null || _a === void 0 ? void 0 : _a.isActive);\n }\n /**\n * Returns if the owner is active\n */\n get isActive() {\n var _a;\n return !!((_a = this.owner) === null || _a === void 0 ? void 0 : _a.isActive);\n }\n /**\n * @deprecated Use globalPos\n */\n get center() {\n return this.globalPos;\n }\n onAdd(owner) {\n var _a, _b;\n this.transform = (_a = this.owner) === null || _a === void 0 ? void 0 : _a.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this.motion = (_b = this.owner) === null || _b === void 0 ? void 0 : _b.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n }\n get pos() {\n return this.transform.pos;\n }\n set pos(val) {\n this.transform.pos = val;\n }\n /**\n * The (x, y) position of the actor this will be in the middle of the actor if the\n * {@apilink Actor.anchor} is set to (0.5, 0.5) which is default.\n * If you want the (x, y) position to be the top left of the actor specify an anchor of (0, 0).\n */\n get globalPos() {\n return this.transform.globalPos;\n }\n set globalPos(val) {\n this.transform.globalPos = val;\n }\n /**\n * The position of the actor last frame (x, y) in pixels\n */\n get oldPos() {\n return this.oldTransform.pos;\n }\n /**\n * The global position of the actor last frame (x, y) in pixels\n */\n get oldGlobalPos() {\n return this._oldGlobalPos;\n }\n /**\n * The current velocity vector (vx, vy) of the actor in pixels/second\n */\n get vel() {\n return this.motion.vel;\n }\n set vel(val) {\n this.motion.vel = val;\n }\n /**\n * The current acceleration vector (ax, ay) of the actor in pixels/second/second. An acceleration pointing down such as (0, 100) may\n * be useful to simulate a gravitational effect.\n */\n get acc() {\n return this.motion.acc;\n }\n set acc(val) {\n this.motion.acc = val;\n }\n /**\n * The current torque applied to the actor\n */\n get torque() {\n return this.motion.torque;\n }\n set torque(val) {\n this.motion.torque = val;\n }\n /**\n * Gets/sets the rotation of the body from the last frame.\n */\n get oldRotation() {\n return this.oldTransform.rotation;\n }\n /**\n * The rotation of the body in radians\n */\n get rotation() {\n return this.transform.globalRotation;\n }\n set rotation(val) {\n this.transform.globalRotation = val;\n }\n /**\n * The scale vector of the actor\n */\n get scale() {\n return this.transform.globalScale;\n }\n set scale(val) {\n this.transform.globalScale = val;\n }\n /**\n * The scale of the actor last frame\n */\n get oldScale() {\n return this.oldTransform.scale;\n }\n /**\n * The scale rate of change of the actor in scale/second\n */\n get scaleFactor() {\n return this.motion.scaleFactor;\n }\n set scaleFactor(scaleFactor) {\n this.motion.scaleFactor = scaleFactor;\n }\n /**\n * Get the angular velocity in radians/second\n */\n get angularVelocity() {\n return this.motion.angularVelocity;\n }\n /**\n * Set the angular velocity in radians/second\n */\n set angularVelocity(value) {\n this.motion.angularVelocity = value;\n }\n /**\n * Apply a specific impulse to the body\n * @param point\n * @param impulse\n */\n applyImpulse(point, impulse) {\n if (this.collisionType !== _CollisionType__WEBPACK_IMPORTED_MODULE_6__.CollisionType.Active) {\n return; // only active objects participate in the simulation\n }\n const finalImpulse = impulse.scale(this.inverseMass, this._impulseScratch);\n if (this.limitDegreeOfFreedom.indexOf(DegreeOfFreedom.X) > -1) {\n finalImpulse.x = 0;\n }\n if (this.limitDegreeOfFreedom.indexOf(DegreeOfFreedom.Y) > -1) {\n finalImpulse.y = 0;\n }\n this.vel.addEqual(finalImpulse);\n if (!this.limitDegreeOfFreedom.includes(DegreeOfFreedom.Rotation)) {\n const distanceFromCenter = point.sub(this.globalPos, this._distanceFromCenterScratch);\n this.angularVelocity += this.inverseInertia * distanceFromCenter.cross(impulse);\n }\n }\n /**\n * Apply only linear impulse to the body\n * @param impulse\n */\n applyLinearImpulse(impulse) {\n if (this.collisionType !== _CollisionType__WEBPACK_IMPORTED_MODULE_6__.CollisionType.Active) {\n return; // only active objects participate in the simulation\n }\n const finalImpulse = impulse.scale(this.inverseMass);\n if (this.limitDegreeOfFreedom.includes(DegreeOfFreedom.X)) {\n finalImpulse.x = 0;\n }\n if (this.limitDegreeOfFreedom.includes(DegreeOfFreedom.Y)) {\n finalImpulse.y = 0;\n }\n this.vel = this.vel.add(finalImpulse);\n }\n /**\n * Apply only angular impulse to the body\n * @param point\n * @param impulse\n */\n applyAngularImpulse(point, impulse) {\n if (this.collisionType !== _CollisionType__WEBPACK_IMPORTED_MODULE_6__.CollisionType.Active) {\n return; // only active objects participate in the simulation\n }\n if (!this.limitDegreeOfFreedom.includes(DegreeOfFreedom.Rotation)) {\n const distanceFromCenter = point.sub(this.globalPos);\n this.angularVelocity += this.inverseInertia * distanceFromCenter.cross(impulse);\n }\n }\n /**\n * Sets the old versions of pos, vel, acc, and scale.\n */\n captureOldTransform() {\n // Capture old values before integration step updates them\n this.__oldTransformCaptured = true;\n const tx = this.transform.get();\n tx.clone(this.oldTransform);\n this.oldTransform.parent = tx.parent; // also grab parent\n this.oldVel.setTo(this.vel.x, this.vel.y);\n this.oldAcc.setTo(this.acc.x, this.acc.y);\n this.oldGlobalPos.setTo(this.globalPos.x, this.globalPos.y);\n }\n clone() {\n const component = super.clone();\n return component;\n }\n}\nBodyComponent._ID = 0;\nBodyComponent._DEFAULT_CONFIG = {\n ...(0,_PhysicsConfig__WEBPACK_IMPORTED_MODULE_9__.getDefaultPhysicsConfig)().bodies\n};\n\n\n/***/ }),\n\n/***/ \"./Collision/BoundingBox.ts\":\n/*!**********************************!*\\\n !*** ./Collision/BoundingBox.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BoundingBox: () => (/* binding */ BoundingBox)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Side__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Side */ \"./Collision/Side.ts\");\n\n\n\n/**\n * Axis Aligned collision primitive for Excalibur.\n */\nclass BoundingBox {\n /**\n * Constructor allows passing of either an object with all coordinate components,\n * or the coordinate components passed separately.\n * @param leftOrOptions Either x coordinate of the left edge or an options object\n * containing the four coordinate components.\n * @param top y coordinate of the top edge\n * @param right x coordinate of the right edge\n * @param bottom y coordinate of the bottom edge\n */\n constructor(leftOrOptions = 0, top = 0, right = 0, bottom = 0) {\n // Cache bounding box point returns\n this._points = [];\n if (typeof leftOrOptions === 'object') {\n this.left = leftOrOptions.left;\n this.top = leftOrOptions.top;\n this.right = leftOrOptions.right;\n this.bottom = leftOrOptions.bottom;\n }\n else if (typeof leftOrOptions === 'number') {\n this.left = leftOrOptions;\n this.top = top;\n this.right = right;\n this.bottom = bottom;\n }\n }\n /**\n * Returns a new instance of {@apilink BoundingBox} that is a copy of the current instance\n */\n clone(dest) {\n const result = dest || new BoundingBox(0, 0, 0, 0);\n result.left = this.left;\n result.right = this.right;\n result.top = this.top;\n result.bottom = this.bottom;\n return result;\n }\n /**\n * Resets the bounds to a zero width/height box\n */\n reset() {\n this.left = 0;\n this.top = 0;\n this.bottom = 0;\n this.right = 0;\n }\n /**\n * Given bounding box A & B, returns the side relative to A when intersection is performed.\n * @param intersection Intersection vector between 2 bounding boxes\n */\n static getSideFromIntersection(intersection) {\n if (!intersection) {\n return _Side__WEBPACK_IMPORTED_MODULE_0__.Side.None;\n }\n if (intersection) {\n if (Math.abs(intersection.x) > Math.abs(intersection.y)) {\n if (intersection.x < 0) {\n return _Side__WEBPACK_IMPORTED_MODULE_0__.Side.Right;\n }\n return _Side__WEBPACK_IMPORTED_MODULE_0__.Side.Left;\n }\n else {\n if (intersection.y < 0) {\n return _Side__WEBPACK_IMPORTED_MODULE_0__.Side.Bottom;\n }\n return _Side__WEBPACK_IMPORTED_MODULE_0__.Side.Top;\n }\n }\n return _Side__WEBPACK_IMPORTED_MODULE_0__.Side.None;\n }\n static fromPoints(points) {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (let i = 0; i < points.length; i++) {\n if (points[i].x < minX) {\n minX = points[i].x;\n }\n if (points[i].x > maxX) {\n maxX = points[i].x;\n }\n if (points[i].y < minY) {\n minY = points[i].y;\n }\n if (points[i].y > maxY) {\n maxY = points[i].y;\n }\n }\n return new BoundingBox(minX, minY, maxX, maxY);\n }\n /**\n * Creates a bounding box from a width and height\n * @param width\n * @param height\n * @param anchor Default Vector.Half\n * @param pos Default Vector.Zero\n */\n static fromDimension(width, height, anchor = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Half, pos = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero) {\n return new BoundingBox(-width * anchor.x + pos.x, -height * anchor.y + pos.y, width - width * anchor.x + pos.x, height - height * anchor.y + pos.y);\n }\n /**\n * Returns the calculated width of the bounding box\n */\n get width() {\n return this.right - this.left;\n }\n /**\n * Returns the calculated height of the bounding box\n */\n get height() {\n return this.bottom - this.top;\n }\n /**\n * Return whether the bounding box has zero dimensions in height,width or both\n */\n hasZeroDimensions() {\n return this.width === 0 || this.height === 0;\n }\n /**\n * Returns the center of the bounding box\n */\n get center() {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector((this.left + this.right) / 2, (this.top + this.bottom) / 2);\n }\n get topLeft() {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.left, this.top);\n }\n get bottomRight() {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.right, this.bottom);\n }\n get topRight() {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.right, this.top);\n }\n get bottomLeft() {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.left, this.bottom);\n }\n translate(pos) {\n return new BoundingBox(this.left + pos.x, this.top + pos.y, this.right + pos.x, this.bottom + pos.y);\n }\n /**\n * Rotates a bounding box by and angle and around a point, if no point is specified (0, 0) is used by default. The resulting bounding\n * box is also axis-align. This is useful when a new axis-aligned bounding box is needed for rotated geometry.\n */\n rotate(angle, point = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero) {\n const points = this.getPoints().map((p) => p.rotate(angle, point));\n return BoundingBox.fromPoints(points);\n }\n /**\n * Scale a bounding box by a scale factor, optionally provide a point\n * @param scale\n * @param point\n */\n scale(scale, point = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero) {\n const shifted = this.translate(point);\n return new BoundingBox(shifted.left * scale.x, shifted.top * scale.y, shifted.right * scale.x, shifted.bottom * scale.y);\n }\n /**\n * Transform the axis aligned bounding box by a {@apilink Matrix}, producing a new axis aligned bounding box\n * @param matrix\n */\n transform(matrix) {\n // inlined these calculations to not use vectors would speed it up slightly\n // const matFirstColumn = vec(matrix.data[0], matrix.data[1]);\n // const xa = matFirstColumn.scale(this.left);\n const xa1 = matrix.data[0] * this.left;\n const xa2 = matrix.data[1] * this.left;\n // const xb = matFirstColumn.scale(this.right);\n const xb1 = matrix.data[0] * this.right;\n const xb2 = matrix.data[1] * this.right;\n // const matSecondColumn = vec(matrix.data[2], matrix.data[3]);\n // const ya = matSecondColumn.scale(this.top);\n const ya1 = matrix.data[2] * this.top;\n const ya2 = matrix.data[3] * this.top;\n // const yb = matSecondColumn.scale(this.bottom);\n const yb1 = matrix.data[2] * this.bottom;\n const yb2 = matrix.data[3] * this.bottom;\n const matrixPos = matrix.getPosition();\n // const topLeft = Vector.min(xa, xb).add(Vector.min(ya, yb)).add(matrixPos);\n // const bottomRight = Vector.max(xa, xb).add(Vector.max(ya, yb)).add(matrixPos);\n const left = Math.min(xa1, xb1) + Math.min(ya1, yb1) + matrixPos.x;\n const top = Math.min(xa2, xb2) + Math.min(ya2, yb2) + matrixPos.y;\n const right = Math.max(xa1, xb1) + Math.max(ya1, yb1) + matrixPos.x;\n const bottom = Math.max(xa2, xb2) + Math.max(ya2, yb2) + matrixPos.y;\n return new BoundingBox({\n left, //: topLeft.x,\n top, //: topLeft.y,\n right, //: bottomRight.x,\n bottom //: bottomRight.y\n });\n }\n /**\n * Returns the perimeter of the bounding box\n */\n getPerimeter() {\n const wx = this.width;\n const wy = this.height;\n return 2 * (wx + wy);\n }\n /**\n * Returns the world space points that make up the corners of the bounding box as a polygon\n */\n getPoints() {\n if (this._left !== this.left || this._right !== this.right || this._top !== this.top || this._bottom !== this.bottom) {\n this._points.length = 0;\n this._points.push(new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.left, this.top));\n this._points.push(new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.right, this.top));\n this._points.push(new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.right, this.bottom));\n this._points.push(new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.left, this.bottom));\n this._left = this.left;\n this._right = this.right;\n this._top = this.top;\n this._bottom = this.bottom;\n }\n return this._points;\n }\n /**\n * Determines whether a ray intersects with a bounding box\n */\n rayCast(ray, farClipDistance = Infinity) {\n // algorithm from https://tavianator.com/fast-branchless-raybounding-box-intersections/\n let tMin = -Infinity;\n let tMax = +Infinity;\n const xInv = ray.dir.x === 0 ? Number.MAX_VALUE : 1 / ray.dir.x;\n const yInv = ray.dir.y === 0 ? Number.MAX_VALUE : 1 / ray.dir.y;\n const tx1 = (this.left - ray.pos.x) * xInv;\n const tx2 = (this.right - ray.pos.x) * xInv;\n tMin = Math.min(tx1, tx2);\n tMax = Math.max(tx1, tx2);\n const ty1 = (this.top - ray.pos.y) * yInv;\n const ty2 = (this.bottom - ray.pos.y) * yInv;\n tMin = Math.max(tMin, Math.min(ty1, ty2));\n tMax = Math.min(tMax, Math.max(ty1, ty2));\n return tMax >= Math.max(0, tMin) && tMin < farClipDistance;\n }\n rayCastTime(ray, farClipDistance = Infinity) {\n // algorithm from https://tavianator.com/fast-branchless-raybounding-box-intersections/\n let tMin = -Infinity;\n let tMax = +Infinity;\n const xInv = ray.dir.x === 0 ? Number.MAX_VALUE : 1 / ray.dir.x;\n const yInv = ray.dir.y === 0 ? Number.MAX_VALUE : 1 / ray.dir.y;\n const tx1 = (this.left - ray.pos.x) * xInv;\n const tx2 = (this.right - ray.pos.x) * xInv;\n tMin = Math.min(tx1, tx2);\n tMax = Math.max(tx1, tx2);\n const ty1 = (this.top - ray.pos.y) * yInv;\n const ty2 = (this.bottom - ray.pos.y) * yInv;\n tMin = Math.max(tMin, Math.min(ty1, ty2));\n tMax = Math.min(tMax, Math.max(ty1, ty2));\n if (tMax >= Math.max(0, tMin) && tMin < farClipDistance) {\n return tMin;\n }\n return -1;\n }\n contains(val) {\n if (val instanceof _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector) {\n return this.left <= val.x && this.top <= val.y && val.y <= this.bottom && val.x <= this.right;\n }\n else if (val instanceof BoundingBox) {\n return this.left <= val.left && this.top <= val.top && val.bottom <= this.bottom && val.right <= this.right;\n }\n return false;\n }\n /**\n * Combines this bounding box and another together returning a new bounding box\n * @param other The bounding box to combine\n */\n combine(other, dest) {\n const compositeBB = dest || new BoundingBox(0, 0, 0, 0);\n const left = Math.min(this.left, other.left);\n const top = Math.min(this.top, other.top);\n const right = Math.max(this.right, other.right);\n const bottom = Math.max(this.bottom, other.bottom);\n compositeBB.left = left;\n compositeBB.top = top;\n compositeBB.right = right;\n compositeBB.bottom = bottom;\n return compositeBB;\n }\n get dimensions() {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.width, this.height);\n }\n /**\n * Returns true if the bounding boxes overlap.\n * @param other\n * @param epsilon Optionally specify a small epsilon (default 0) as amount of overlap to ignore as overlap.\n * This epsilon is useful in stable collision simulations.\n */\n overlaps(other, epsilon) {\n const e = epsilon || 0;\n if (other.hasZeroDimensions()) {\n return this.contains(other);\n }\n if (this.hasZeroDimensions()) {\n return other.contains(this);\n }\n const totalBoundingBox = this.combine(other);\n return totalBoundingBox.width + e < other.width + this.width && totalBoundingBox.height + e < other.height + this.height;\n }\n /**\n * Test wether this bounding box intersects with another returning\n * the intersection vector that can be used to resolve the collision. If there\n * is no intersection null is returned.\n * @param other Other {@apilink BoundingBox} to test intersection with\n * @returns A Vector in the direction of the current BoundingBox, this <- other\n */\n intersect(other) {\n const totalBoundingBox = this.combine(other);\n // If the total bounding box is less than or equal the sum of the 2 bounds then there is collision\n if (totalBoundingBox.width < other.width + this.width &&\n totalBoundingBox.height < other.height + this.height &&\n !totalBoundingBox.dimensions.equals(other.dimensions) &&\n !totalBoundingBox.dimensions.equals(this.dimensions)) {\n // collision\n let overlapX = 0;\n // right edge is between the other's left and right edge\n /**\n * +-this-+\n * | |\n * | +-other-+\n * +----|-+ |\n * | |\n * +-------+\n * <---\n * ^ overlap\n */\n if (this.right >= other.left && this.right <= other.right) {\n overlapX = other.left - this.right;\n // right edge is past the other's right edge\n /**\n * +-other-+\n * | |\n * | +-this-+\n * +----|--+ |\n * | |\n * +------+\n * --->\n * ^ overlap\n */\n }\n else {\n overlapX = other.right - this.left;\n }\n let overlapY = 0;\n // top edge is between the other's top and bottom edge\n /**\n * +-other-+\n * | |\n * | +-this-+ | <- overlap\n * +----|--+ | |\n * | | \\ /\n * +------+ '\n */\n if (this.top <= other.bottom && this.top >= other.top) {\n overlapY = other.bottom - this.top;\n // top edge is above the other top edge\n /**\n * +-this-+ .\n * | | / \\\n * | +-other-+ | <- overlap\n * +----|-+ | |\n * | |\n * +-------+\n */\n }\n else {\n overlapY = other.top - this.bottom;\n }\n if (Math.abs(overlapX) < Math.abs(overlapY)) {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(overlapX, 0);\n }\n else {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(0, overlapY);\n }\n // Case of total containment of one bounding box by another\n }\n else if (totalBoundingBox.dimensions.equals(other.dimensions) || totalBoundingBox.dimensions.equals(this.dimensions)) {\n let overlapX = 0;\n // this is wider than the other\n if (this.width - other.width >= 0) {\n // This right edge is closest to the others right edge\n if (this.right - other.right <= other.left - this.left) {\n overlapX = other.left - this.right;\n // This left edge is closest to the others left edge\n }\n else {\n overlapX = other.right - this.left;\n }\n // other is wider than this\n }\n else {\n // This right edge is closest to the others right edge\n if (other.right - this.right <= this.left - other.left) {\n overlapX = this.left - other.right;\n // This left edge is closest to the others left edge\n }\n else {\n overlapX = this.right - other.left;\n }\n }\n let overlapY = 0;\n // this is taller than other\n if (this.height - other.height >= 0) {\n // The bottom edge is closest to the others bottom edge\n if (this.bottom - other.bottom <= other.top - this.top) {\n overlapY = other.top - this.bottom;\n }\n else {\n overlapY = other.bottom - this.top;\n }\n // other is taller than this\n }\n else {\n // The bottom edge is closest to the others bottom edge\n if (other.bottom - this.bottom <= this.top - other.top) {\n overlapY = this.top - other.bottom;\n }\n else {\n overlapY = this.bottom - other.top;\n }\n }\n if (Math.abs(overlapX) < Math.abs(overlapY)) {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(overlapX, 0);\n }\n else {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(0, overlapY);\n }\n }\n else {\n return null;\n }\n }\n /**\n * Test whether the bounding box has intersected with another bounding box, returns the side of the current bb that intersected.\n * @param bb The other actor to test\n */\n intersectWithSide(bb) {\n const intersect = this.intersect(bb);\n return BoundingBox.getSideFromIntersection(intersect);\n }\n /**\n * Draw a debug bounding box\n * @param ex\n * @param color\n */\n draw(ex, color = _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Yellow) {\n ex.debug.drawRect(this.left, this.top, this.width, this.height, { color });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/ColliderComponent.ts\":\n/*!****************************************!*\\\n !*** ./Collision/ColliderComponent.ts ***!\n \\****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ColliderComponent: () => (/* binding */ ColliderComponent)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Component */ \"./EntityComponentSystem/Component.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _Util_Observable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Util/Observable */ \"./Util/Observable.ts\");\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Colliders/CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var _Colliders_Shape__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Colliders/Shape */ \"./Collision/Colliders/Shape.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Actor__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Actor */ \"./Actor.ts\");\n\n\n\n\n\n\n\n\n\n\nclass ColliderComponent extends _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor(collider) {\n super();\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_1__.EventEmitter();\n /**\n * Observable that notifies when a collider is added to the body\n */\n this.$colliderAdded = new _Util_Observable__WEBPACK_IMPORTED_MODULE_2__.Observable();\n /**\n * Observable that notifies when a collider is removed from the body\n */\n this.$colliderRemoved = new _Util_Observable__WEBPACK_IMPORTED_MODULE_2__.Observable();\n this._collidersToRemove = [];\n this.set(collider);\n }\n /**\n * Get the current collider geometry\n */\n get() {\n return this._collider;\n }\n /**\n * Set the collider geometry\n * @param collider\n * @returns the collider you set\n */\n set(collider) {\n this.clear();\n if (collider) {\n this._collider = collider;\n this._collider.owner = this.owner;\n collider.events.pipe(this.events);\n this.$colliderAdded.notifyAll(collider);\n this.update();\n }\n return collider;\n }\n /**\n * Remove collider geometry from collider component\n */\n clear() {\n if (this._collider) {\n this._collidersToRemove.push(this._collider);\n this._collider = null;\n }\n }\n processColliderRemoval() {\n for (const collider of this._collidersToRemove) {\n collider.events.unpipe(this.events);\n this.$colliderRemoved.notifyAll(collider);\n collider.owner = null;\n }\n }\n clone() {\n const clone = new ColliderComponent(this._collider.clone());\n return clone;\n }\n /**\n * Return world space bounds\n */\n get bounds() {\n var _a, _b;\n return (_b = (_a = this._collider) === null || _a === void 0 ? void 0 : _a.bounds) !== null && _b !== void 0 ? _b : new _BoundingBox__WEBPACK_IMPORTED_MODULE_3__.BoundingBox();\n }\n /**\n * Return local space bounds\n */\n get localBounds() {\n var _a, _b;\n return (_b = (_a = this._collider) === null || _a === void 0 ? void 0 : _a.localBounds) !== null && _b !== void 0 ? _b : new _BoundingBox__WEBPACK_IMPORTED_MODULE_3__.BoundingBox();\n }\n /**\n * Update the collider's transformed geometry\n */\n update() {\n var _a;\n const tx = (_a = this.owner) === null || _a === void 0 ? void 0 : _a.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__.TransformComponent);\n if (this._collider) {\n this._collider.owner = this.owner;\n if (tx) {\n this._collider.update(tx.get());\n }\n }\n }\n /**\n * Collide component with another\n * @param other\n */\n collide(other) {\n let colliderA = this._collider;\n let colliderB = other._collider;\n if (!colliderA || !colliderB) {\n return [];\n }\n // If we have a composite left hand side :(\n // Might bite us, but to avoid updating all the handlers make composite always left side\n let flipped = false;\n if (colliderB instanceof _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_5__.CompositeCollider) {\n colliderA = colliderB;\n colliderB = this._collider;\n flipped = true;\n }\n if (this._collider) {\n const contacts = colliderA.collide(colliderB);\n if (contacts) {\n if (flipped) {\n contacts.forEach((contact) => {\n contact.mtv = contact.mtv.negate();\n contact.normal = contact.normal.negate();\n contact.tangent = contact.normal.perpendicular();\n contact.colliderA = this._collider;\n contact.colliderB = other._collider;\n });\n }\n return contacts;\n }\n return [];\n }\n return [];\n }\n onAdd(entity) {\n if (this._collider) {\n this.update();\n }\n // Wire up the collider events to the owning entity\n this.events.on('precollision', (evt) => {\n const precollision = evt;\n entity.events.emit('precollision', new _Events__WEBPACK_IMPORTED_MODULE_6__.PreCollisionEvent(precollision.self, precollision.other, precollision.side, precollision.intersection, precollision.contact));\n if (entity instanceof _Actor__WEBPACK_IMPORTED_MODULE_7__.Actor) {\n entity.onPreCollisionResolve(precollision.self, precollision.other, precollision.side, precollision.contact);\n }\n });\n this.events.on('postcollision', (evt) => {\n const postcollision = evt;\n entity.events.emit('postcollision', new _Events__WEBPACK_IMPORTED_MODULE_6__.PostCollisionEvent(postcollision.self, postcollision.other, postcollision.side, postcollision.intersection, postcollision.contact));\n if (entity instanceof _Actor__WEBPACK_IMPORTED_MODULE_7__.Actor) {\n entity.onPostCollisionResolve(postcollision.self, postcollision.other, postcollision.side, postcollision.contact);\n }\n });\n this.events.on('collisionstart', (evt) => {\n const start = evt;\n entity.events.emit('collisionstart', new _Events__WEBPACK_IMPORTED_MODULE_6__.CollisionStartEvent(start.self, start.other, start.side, start.contact));\n if (entity instanceof _Actor__WEBPACK_IMPORTED_MODULE_7__.Actor) {\n entity.onCollisionStart(start.self, start.other, start.side, start.contact);\n }\n });\n this.events.on('collisionend', (evt) => {\n const end = evt;\n entity.events.emit('collisionend', new _Events__WEBPACK_IMPORTED_MODULE_6__.CollisionEndEvent(end.self, end.other, end.side, end.lastContact));\n if (entity instanceof _Actor__WEBPACK_IMPORTED_MODULE_7__.Actor) {\n entity.onCollisionEnd(end.self, end.other, end.side, end.lastContact);\n }\n });\n }\n onRemove() {\n this.events.clear();\n this.$colliderRemoved.notifyAll(this._collider);\n }\n /**\n * Sets up a box geometry based on the current bounds of the associated actor of this physics body.\n *\n * If no width/height are specified the body will attempt to use the associated actor's width/height.\n *\n * By default, the box is center is at (0, 0) which means it is centered around the actors anchor.\n */\n useBoxCollider(width, height, anchor = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Half, center = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Zero) {\n const collider = _Colliders_Shape__WEBPACK_IMPORTED_MODULE_9__.Shape.Box(width, height, anchor, center);\n return this.set(collider);\n }\n /**\n * Sets up a {@apilink PolygonCollider | `polygon`} collision geometry based on a list of of points relative\n * to the anchor of the associated actor\n * of this physics body.\n *\n * Only [convex polygon](https://en.wikipedia.org/wiki/Convex_polygon) definitions are supported.\n *\n * By default, the box is center is at (0, 0) which means it is centered around the actors anchor.\n */\n usePolygonCollider(points, center = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Zero) {\n const poly = _Colliders_Shape__WEBPACK_IMPORTED_MODULE_9__.Shape.Polygon(points, center);\n return this.set(poly);\n }\n /**\n * Sets up a {@apilink Circle | `circle collision geometry`} as the only collider with a specified radius in pixels.\n *\n * By default, the box is center is at (0, 0) which means it is centered around the actors anchor.\n */\n useCircleCollider(radius, center = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Zero) {\n const collider = _Colliders_Shape__WEBPACK_IMPORTED_MODULE_9__.Shape.Circle(radius, center);\n return this.set(collider);\n }\n /**\n * Sets up an {@apilink Edge | `edge collision geometry`} with a start point and an end point relative to the anchor of the associated actor\n * of this physics body.\n *\n * By default, the box is center is at (0, 0) which means it is centered around the actors anchor.\n */\n useEdgeCollider(begin, end) {\n const collider = _Colliders_Shape__WEBPACK_IMPORTED_MODULE_9__.Shape.Edge(begin, end);\n return this.set(collider);\n }\n /**\n * Setups up a {@apilink CompositeCollider} which can define any arbitrary set of excalibur colliders\n * @param colliders\n */\n useCompositeCollider(colliders) {\n return this.set(new _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_5__.CompositeCollider(colliders));\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/CircleCollider.ts\":\n/*!***********************************************!*\\\n !*** ./Collision/Colliders/CircleCollider.ts ***!\n \\***********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CircleCollider: () => (/* binding */ CircleCollider)\n/* harmony export */ });\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./CollisionJumpTable */ \"./Collision/Colliders/CollisionJumpTable.ts\");\n/* harmony import */ var _PolygonCollider__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./PolygonCollider */ \"./Collision/Colliders/PolygonCollider.ts\");\n/* harmony import */ var _EdgeCollider__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./EdgeCollider */ \"./Collision/Colliders/EdgeCollider.ts\");\n/* harmony import */ var _Math_projection__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../Math/projection */ \"./Math/projection.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../Color */ \"./Color.ts\");\n/* harmony import */ var _Collider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Collider */ \"./Collision/Colliders/Collider.ts\");\n/* harmony import */ var _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./ClosestLineJumpTable */ \"./Collision/Colliders/ClosestLineJumpTable.ts\");\n/* harmony import */ var _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math/affine-matrix */ \"./Math/affine-matrix.ts\");\n/* harmony import */ var _Index__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Index */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math/util */ \"./Math/util.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * This is a circle collider for the excalibur rigid body physics simulation\n */\nclass CircleCollider extends _Collider__WEBPACK_IMPORTED_MODULE_0__.Collider {\n get worldPos() {\n return this._globalMatrix.getPosition();\n }\n /**\n * Get the radius of the circle\n */\n get radius() {\n var _a;\n if (this._radius) {\n return this._radius;\n }\n const tx = this._transform;\n const scale = (_a = tx === null || tx === void 0 ? void 0 : tx.globalScale) !== null && _a !== void 0 ? _a : _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.One;\n // This is a trade off, the alternative is retooling circles to support ellipse collisions\n return (this._radius = this._naturalRadius * Math.min(scale.x, scale.y));\n }\n /**\n * Set the radius of the circle\n */\n set radius(val) {\n var _a;\n const tx = this._transform;\n const scale = (_a = tx === null || tx === void 0 ? void 0 : tx.globalScale) !== null && _a !== void 0 ? _a : _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.One;\n // This is a trade off, the alternative is retooling circles to support ellipse collisions\n this._naturalRadius = val / Math.min(scale.x, scale.y);\n this._localBoundsDirty = true;\n this._radius = val;\n }\n constructor(options) {\n super();\n /**\n * Position of the circle relative to the collider, by default (0, 0).\n */\n this.offset = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n this._globalMatrix = _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_2__.AffineMatrix.identity();\n this._localBoundsDirty = true;\n this.offset = options.offset || _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n this.radius = options.radius || 0;\n this._globalMatrix.translate(this.offset.x, this.offset.y);\n }\n /**\n * Returns a clone of this shape, not associated with any collider\n */\n clone() {\n return new CircleCollider({\n offset: this.offset.clone(),\n radius: this.radius\n });\n }\n /**\n * Get the center of the collider in world coordinates\n */\n get center() {\n return this._globalMatrix.getPosition();\n }\n /**\n * Tests if a point is contained in this collider\n */\n contains(point) {\n var _a, _b;\n const pos = (_b = (_a = this._transform) === null || _a === void 0 ? void 0 : _a.pos) !== null && _b !== void 0 ? _b : this.offset;\n const distance = pos.distance(point);\n if (distance <= this.radius) {\n return true;\n }\n return false;\n }\n /**\n * Casts a ray at the Circle collider and returns the nearest point of collision\n * @param ray\n */\n rayCast(ray, max = Infinity) {\n var _a, _b;\n // https://en.wikipedia.org/wiki/Intersection_(geometry)#A_line_and_a_circle\n const c = this.center;\n const dir = ray.dir;\n const orig = ray.pos;\n const u = c.sub(orig);\n const u1 = dir.scale(u.dot(dir));\n const u2 = u.sub(u1);\n const d = u2.magnitude;\n if (d > this.radius) {\n return null;\n }\n else {\n // tangent case\n let toi = 0;\n if ((0,_Math_util__WEBPACK_IMPORTED_MODULE_3__.approximatelyEqual)(d, this.radius, 0.0001)) {\n toi = -dir.dot(orig.sub(c));\n if (toi > 0 && toi < max) {\n const point = ray.getPoint(toi);\n return {\n point,\n normal: point.sub(c).normalize(),\n collider: this,\n body: (_a = this.owner) === null || _a === void 0 ? void 0 : _a.get(_Index__WEBPACK_IMPORTED_MODULE_4__.BodyComponent),\n distance: toi\n };\n }\n return null;\n }\n else {\n // two point\n const discriminant = Math.sqrt(Math.pow(dir.dot(orig.sub(c)), 2) - Math.pow(orig.sub(c).distance(), 2) + Math.pow(this.radius, 2));\n const toi1 = -dir.dot(orig.sub(c)) + discriminant;\n const toi2 = -dir.dot(orig.sub(c)) - discriminant;\n const positiveToi = [];\n if (toi1 >= 0) {\n positiveToi.push(toi1);\n }\n if (toi2 >= 0) {\n positiveToi.push(toi2);\n }\n const minToi = Math.min(...positiveToi);\n if (minToi <= max) {\n const point = ray.getPoint(minToi);\n return {\n point,\n normal: point.sub(c).normalize(),\n collider: this,\n body: (_b = this.owner) === null || _b === void 0 ? void 0 : _b.get(_Index__WEBPACK_IMPORTED_MODULE_4__.BodyComponent),\n distance: minToi\n };\n }\n return null;\n }\n }\n }\n getClosestLineBetween(shape) {\n if (shape instanceof CircleCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_5__.ClosestLineJumpTable.CircleCircleClosestLine(this, shape);\n }\n else if (shape instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_6__.PolygonCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_5__.ClosestLineJumpTable.PolygonCircleClosestLine(shape, this).flip();\n }\n else if (shape instanceof _EdgeCollider__WEBPACK_IMPORTED_MODULE_7__.EdgeCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_5__.ClosestLineJumpTable.CircleEdgeClosestLine(this, shape).flip();\n }\n else {\n throw new Error(`Polygon could not collide with unknown CollisionShape ${typeof shape}`);\n }\n }\n /**\n * @inheritdoc\n */\n collide(collider) {\n if (collider instanceof CircleCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_8__.CollisionJumpTable.CollideCircleCircle(this, collider);\n }\n else if (collider instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_6__.PolygonCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_8__.CollisionJumpTable.CollideCirclePolygon(this, collider);\n }\n else if (collider instanceof _EdgeCollider__WEBPACK_IMPORTED_MODULE_7__.EdgeCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_8__.CollisionJumpTable.CollideCircleEdge(this, collider);\n }\n else {\n throw new Error(`Circle could not collide with unknown CollisionShape ${typeof collider}`);\n }\n }\n /**\n * Find the point on the collider furthest in the direction specified\n */\n getFurthestPoint(direction) {\n return this.center.add(direction.normalize().scale(this.radius));\n }\n /**\n * Find the local point on the shape in the direction specified\n * @param direction\n */\n getFurthestLocalPoint(direction) {\n const dir = direction.normalize();\n return dir.scale(this.radius);\n }\n /**\n * Get the axis aligned bounding box for the circle collider in world coordinates\n */\n get bounds() {\n return this.localBounds.transform(this._globalMatrix);\n }\n /**\n * Get the axis aligned bounding box for the circle collider in local coordinates\n */\n get localBounds() {\n if (this._localBoundsDirty) {\n this._localBounds = new _BoundingBox__WEBPACK_IMPORTED_MODULE_9__.BoundingBox(-this._naturalRadius, -this._naturalRadius, +this._naturalRadius, +this._naturalRadius);\n this._localBoundsDirty = false;\n }\n return this._localBounds;\n }\n /**\n * Get axis not implemented on circles, since there are infinite axis in a circle\n */\n get axes() {\n return [];\n }\n /**\n * Returns the moment of inertia of a circle given it's mass\n * https://en.wikipedia.org/wiki/List_of_moments_of_inertia\n */\n getInertia(mass) {\n return (mass * this.radius * this.radius) / 2;\n }\n /* istanbul ignore next */\n update(transform) {\n var _a;\n this._transform = transform;\n const globalMat = (_a = transform.matrix) !== null && _a !== void 0 ? _a : this._globalMatrix;\n globalMat.clone(this._globalMatrix);\n this._globalMatrix.translate(this.offset.x, this.offset.y);\n this._radius = undefined;\n }\n /**\n * Project the circle along a specified axis\n */\n project(axis) {\n const scalars = [];\n const point = this.center;\n const dotProduct = point.dot(axis);\n scalars.push(dotProduct);\n scalars.push(dotProduct + this.radius);\n scalars.push(dotProduct - this.radius);\n return new _Math_projection__WEBPACK_IMPORTED_MODULE_10__.Projection(Math.min.apply(Math, scalars), Math.max.apply(Math, scalars));\n }\n debug(ex, color, options) {\n var _a, _b, _c, _d;\n const { lineWidth } = { ...{ lineWidth: 1 }, ...options };\n const tx = this._transform;\n const scale = (_a = tx === null || tx === void 0 ? void 0 : tx.globalScale) !== null && _a !== void 0 ? _a : _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.One;\n const rotation = (_b = tx === null || tx === void 0 ? void 0 : tx.globalRotation) !== null && _b !== void 0 ? _b : 0;\n const pos = (_c = tx === null || tx === void 0 ? void 0 : tx.globalPos) !== null && _c !== void 0 ? _c : _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n ex.save();\n ex.translate(pos.x, pos.y);\n ex.rotate(rotation);\n ex.scale(scale.x, scale.y);\n ex.drawCircle((_d = this.offset) !== null && _d !== void 0 ? _d : _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero, this._naturalRadius, _Color__WEBPACK_IMPORTED_MODULE_11__.Color.Transparent, color, lineWidth);\n ex.restore();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/ClosestLineJumpTable.ts\":\n/*!*****************************************************!*\\\n !*** ./Collision/Colliders/ClosestLineJumpTable.ts ***!\n \\*****************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ClosestLineJumpTable: () => (/* binding */ ClosestLineJumpTable)\n/* harmony export */ });\n/* harmony import */ var _Math_line_segment__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/line-segment */ \"./Math/line-segment.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math_ray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math/ray */ \"./Math/ray.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/util */ \"./Math/util.ts\");\n\n\n\n\n/**\n * Finds the closest line segment between two given line segments.\n */\nfunction ClosestLine(line1, line2) {\n // https://math.stackexchange.com/questions/1993953/closest-points-between-2-lines-in-2d\n const EPSILON = 1e-9;\n const line1Dir = line1.dir();\n const line2Dir = line2.dir();\n const d1Squared = line1Dir.dot(line1Dir);\n const d2Squared = line2Dir.dot(line2Dir);\n if (d1Squared < EPSILON && d2Squared < EPSILON) {\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_0__.LineSegment(line1.begin, line2.begin);\n }\n if (d1Squared < EPSILON) {\n const t = (0,_Math_util__WEBPACK_IMPORTED_MODULE_1__.clamp)(line2Dir.dot(line1.begin.sub(line2.begin)) / d2Squared, 0, 1);\n const closestPoint = line2.begin.add(line2Dir.scale(t));\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_0__.LineSegment(line1.begin, closestPoint);\n }\n if (d2Squared < EPSILON) {\n const t = (0,_Math_util__WEBPACK_IMPORTED_MODULE_1__.clamp)(line1Dir.dot(line2.begin.sub(line1.begin)) / d1Squared, 0, 1);\n const closestPoint = line1.begin.add(line1Dir.scale(t));\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_0__.LineSegment(closestPoint, line2.begin);\n }\n const r = line1.begin.sub(line2.begin);\n const a = d1Squared;\n const e = d2Squared;\n const f = line2Dir.dot(r);\n const denom = a * e - Math.pow(line1Dir.dot(line2Dir), 2);\n let s = 0;\n let t = 0;\n if (Math.abs(denom) > EPSILON) {\n s = (0,_Math_util__WEBPACK_IMPORTED_MODULE_1__.clamp)((line1Dir.dot(line2Dir) * f - e * line1Dir.dot(r)) / denom, 0, 1);\n }\n else {\n // lines are parallel\n s = (0,_Math_util__WEBPACK_IMPORTED_MODULE_1__.clamp)(line1Dir.dot(r) / a, 0, 1);\n }\n if (Math.abs(e) > EPSILON) {\n t = (0,_Math_util__WEBPACK_IMPORTED_MODULE_1__.clamp)((line1Dir.dot(line2Dir) * s + f) / e, 0, 1);\n }\n else {\n // line2 is a degenerate point\n t = 0;\n }\n const closestPointOnLine1 = line1.begin.add(line1Dir.scale(s));\n const closestPointOnLine2 = line2.begin.add(line2Dir.scale(t));\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_0__.LineSegment(closestPointOnLine1, closestPointOnLine2);\n}\nconst ClosestLineJumpTable = {\n PolygonPolygonClosestLine(polygonA, polygonB) {\n const aSides = polygonA.getSides();\n const bSides = polygonB.getSides();\n let minDistance = Number.MAX_VALUE;\n let closestLine = null;\n for (let i = 0; i < aSides.length; i++) {\n for (let j = 0; j < bSides.length; j++) {\n const line = ClosestLine(aSides[i], bSides[j]);\n const distance = line.getLength();\n if (distance < minDistance) {\n minDistance = distance;\n closestLine = line;\n }\n }\n }\n return closestLine;\n },\n PolygonEdgeClosestLine(polygon, edge) {\n // Find the 2 closest faces on each polygon\n const otherWorldPos = edge.worldPos;\n const otherDirection = otherWorldPos.sub(polygon.worldPos);\n const rayTowardsOther = new _Math_ray__WEBPACK_IMPORTED_MODULE_2__.Ray(polygon.worldPos, otherDirection);\n const thisPoint = polygon.rayCast(rayTowardsOther).point.add(rayTowardsOther.dir.scale(0.1));\n const thisFace = polygon.getClosestFace(thisPoint);\n // L1 = P(s) = p0 + s * u, where s is time and p0 is the start of the line\n // L2 = Q(t) = q0 + t * v, where t is time and q0 is the start of the line\n const edgeLine = edge.asLine();\n return ClosestLine(thisFace.face, edgeLine);\n },\n PolygonCircleClosestLine(polygon, circle) {\n // https://math.stackexchange.com/questions/1919177/how-to-find-point-on-line-closest-to-sphere\n // Find the 2 closest faces on each polygon\n const otherWorldPos = circle.worldPos;\n const otherDirection = otherWorldPos.sub(polygon.worldPos);\n const rayTowardsOther = new _Math_ray__WEBPACK_IMPORTED_MODULE_2__.Ray(polygon.worldPos, otherDirection.normalize());\n const thisPoint = polygon.rayCast(rayTowardsOther).point.add(rayTowardsOther.dir.scale(0.1));\n const thisFace = polygon.getClosestFace(thisPoint);\n // L1 = P(s) = p0 + s * u, where s is time and p0 is the start of the line\n const p0 = thisFace.face.begin;\n const u = thisFace.face.getEdge();\n // Time of minimum distance\n let t = (u.x * (otherWorldPos.x - p0.x) + u.y * (otherWorldPos.y - p0.y)) / (u.x * u.x + u.y * u.y);\n // If time of minimum is past the edge clamp\n if (t > 1) {\n t = 1;\n }\n else if (t < 0) {\n t = 0;\n }\n // Minimum distance\n const d = Math.sqrt(Math.pow(p0.x + u.x * t - otherWorldPos.x, 2) + Math.pow(p0.y + u.y * t - otherWorldPos.y, 2)) - circle.radius;\n const circlex = ((p0.x + u.x * t - otherWorldPos.x) * circle.radius) / (circle.radius + d);\n const circley = ((p0.y + u.y * t - otherWorldPos.y) * circle.radius) / (circle.radius + d);\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_0__.LineSegment(u.scale(t).add(p0), new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(otherWorldPos.x + circlex, otherWorldPos.y + circley));\n },\n CircleCircleClosestLine(circleA, circleB) {\n // Find the 2 closest faces on each polygon\n const otherWorldPos = circleB.worldPos;\n const otherDirection = otherWorldPos.sub(circleA.worldPos);\n const thisWorldPos = circleA.worldPos;\n const thisDirection = thisWorldPos.sub(circleB.worldPos);\n const rayTowardsOther = new _Math_ray__WEBPACK_IMPORTED_MODULE_2__.Ray(circleA.worldPos, otherDirection);\n const rayTowardsThis = new _Math_ray__WEBPACK_IMPORTED_MODULE_2__.Ray(circleB.worldPos, thisDirection);\n const thisPoint = circleA.rayCast(rayTowardsOther);\n const otherPoint = circleB.rayCast(rayTowardsThis);\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_0__.LineSegment(thisPoint.point, otherPoint.point);\n },\n CircleEdgeClosestLine(circle, edge) {\n // https://math.stackexchange.com/questions/1919177/how-to-find-point-on-line-closest-to-sphere\n const circleWorldPos = circle.worldPos;\n // L1 = P(s) = p0 + s * u, where s is time and p0 is the start of the line\n const edgeLine = edge.asLine();\n const edgeStart = edgeLine.begin;\n const edgeVector = edgeLine.getEdge();\n const p0 = edgeStart;\n const u = edgeVector;\n // Time of minimum distance\n let t = (u.x * (circleWorldPos.x - p0.x) + u.y * (circleWorldPos.y - p0.y)) / (u.x * u.x + u.y * u.y);\n // If time of minimum is past the edge clamp to edge\n if (t > 1) {\n t = 1;\n }\n else if (t < 0) {\n t = 0;\n }\n // Minimum distance\n const d = Math.sqrt(Math.pow(p0.x + u.x * t - circleWorldPos.x, 2) + Math.pow(p0.y + u.y * t - circleWorldPos.y, 2)) - circle.radius;\n const circlex = ((p0.x + u.x * t - circleWorldPos.x) * circle.radius) / (circle.radius + d);\n const circley = ((p0.y + u.y * t - circleWorldPos.y) * circle.radius) / (circle.radius + d);\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_0__.LineSegment(u.scale(t).add(p0), new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(circleWorldPos.x + circlex, circleWorldPos.y + circley));\n },\n EdgeEdgeClosestLine(edgeA, edgeB) {\n // L1 = P(s) = p0 + s * u, where s is time and p0 is the start of the line\n const edgeLineA = edgeA.asLine();\n // L2 = Q(t) = q0 + t * v, where t is time and q0 is the start of the line\n const edgeLineB = edgeB.asLine();\n return ClosestLine(edgeLineA, edgeLineB);\n }\n};\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/Collider.ts\":\n/*!*****************************************!*\\\n !*** ./Collision/Colliders/Collider.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Collider: () => (/* binding */ Collider)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Id__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Id */ \"./Id.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n/**\n * A collision collider specifies the geometry that can detect when other collision colliders intersect\n * for the purposes of colliding 2 objects in excalibur.\n */\nclass Collider {\n constructor() {\n this.id = (0,_Id__WEBPACK_IMPORTED_MODULE_0__.createId)('collider', Collider._ID++);\n /**\n * Composite collider if any this collider is attached to\n *\n * **WARNING** do not tamper with this property\n */\n this.composite = null;\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_1__.EventEmitter();\n /**\n * Pixel offset of the collision collider relative to the collider, by default (0, 0) meaning the collider is positioned\n * on top of the collider.\n */\n this.offset = _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero;\n }\n /**\n * Returns a boolean indicating whether this body collided with\n * or was in stationary contact with\n * the body of the other {@apilink Collider}\n */\n touching(other) {\n const contact = this.collide(other);\n if (contact) {\n return true;\n }\n return false;\n }\n}\nCollider._ID = 0;\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/CollisionJumpTable.ts\":\n/*!***************************************************!*\\\n !*** ./Collision/Colliders/CollisionJumpTable.ts ***!\n \\***************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CollisionJumpTable: () => (/* binding */ CollisionJumpTable)\n/* harmony export */ });\n/* harmony import */ var _CircleCollider__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./CircleCollider */ \"./Collision/Colliders/CircleCollider.ts\");\n/* harmony import */ var _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Detection/CollisionContact */ \"./Collision/Detection/CollisionContact.ts\");\n/* harmony import */ var _PolygonCollider__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./PolygonCollider */ \"./Collision/Colliders/PolygonCollider.ts\");\n/* harmony import */ var _EdgeCollider__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./EdgeCollider */ \"./Collision/Colliders/EdgeCollider.ts\");\n/* harmony import */ var _SeparatingAxis__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./SeparatingAxis */ \"./Collision/Colliders/SeparatingAxis.ts\");\n/* harmony import */ var _Math_line_segment__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../Math/line-segment */ \"./Math/line-segment.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../EntityComponentSystem */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Detection_Pair__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Detection/Pair */ \"./Collision/Detection/Pair.ts\");\n/* harmony import */ var _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/affine-matrix */ \"./Math/affine-matrix.ts\");\n\n\n\n\n\n\n\n\n\n\nconst ScratchZero = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero; // TODO constant vector\nconst ScratchNormal = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero; // TODO constant vector\nconst ScratchMatrix = _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_1__.AffineMatrix.identity();\nconst CollisionJumpTable = {\n CollideCircleCircle(circleA, circleB) {\n const circleAPos = circleA.worldPos;\n const circleBPos = circleB.worldPos;\n const combinedRadius = circleA.radius + circleB.radius;\n const distance = circleAPos.distance(circleBPos);\n if (distance > combinedRadius) {\n return [];\n }\n // negative means overlap\n const separation = combinedRadius - distance;\n // Normal points from A -> B\n const normal = circleBPos.sub(circleAPos).normalize();\n const tangent = normal.perpendicular();\n const mvt = normal.scale(separation);\n const point = circleA.getFurthestPoint(normal);\n const local = circleA.getFurthestLocalPoint(normal);\n const info = {\n collider: circleA,\n separation,\n axis: normal,\n point: point\n };\n return [new _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_2__.CollisionContact(circleA, circleB, mvt, normal, tangent, [point], [local], info)];\n },\n CollideCirclePolygon(circle, polygon) {\n var _a, _b;\n let minAxis = _SeparatingAxis__WEBPACK_IMPORTED_MODULE_3__.SeparatingAxis.findCirclePolygonSeparation(circle, polygon);\n if (!minAxis) {\n return [];\n }\n // make sure that the minAxis is pointing away from circle\n const sameDir = minAxis.dot(polygon.center.sub(circle.center));\n minAxis = sameDir < 0 ? minAxis.negate() : minAxis;\n const point = circle.getFurthestPoint(minAxis);\n const xf = (_b = (_a = circle.owner) === null || _a === void 0 ? void 0 : _a.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__.TransformComponent)) !== null && _b !== void 0 ? _b : new _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__.TransformComponent();\n const local = xf.applyInverse(point);\n const normal = minAxis.normalize();\n const info = {\n collider: circle,\n separation: -minAxis.magnitude,\n axis: normal,\n point: point,\n localPoint: local,\n side: polygon.findSide(normal.negate()),\n localSide: polygon.findLocalSide(normal.negate())\n };\n return [new _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_2__.CollisionContact(circle, polygon, minAxis, normal, normal.perpendicular(), [point], [local], info)];\n },\n CollideCircleEdge(circle, edge) {\n // TODO not sure this actually abides by local/world collisions\n // Are edge.begin and edge.end local space or world space? I think they should be local\n // center of the circle in world pos\n const cc = circle.center;\n // vector in the direction of the edge\n const edgeWorld = edge.asLine();\n const e = edgeWorld.end.sub(edgeWorld.begin);\n // amount of overlap with the circle's center along the edge direction\n const u = e.dot(edgeWorld.end.sub(cc));\n const v = e.dot(cc.sub(edgeWorld.begin));\n const side = edge.asLine();\n const localSide = edge.asLocalLine();\n // Potential region A collision (circle is on the left side of the edge, before the beginning)\n if (v <= 0) {\n const da = edgeWorld.begin.sub(cc);\n const dda = da.dot(da); // quick and dirty way of calc'n distance in r^2 terms saves some sqrts\n // save some sqrts\n if (dda > circle.radius * circle.radius) {\n return []; // no collision\n }\n const normal = da.normalize();\n const separation = circle.radius - Math.sqrt(dda);\n const info = {\n collider: circle,\n separation: separation,\n axis: normal,\n point: side.begin,\n side: side,\n localSide: localSide\n };\n return [\n new _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_2__.CollisionContact(circle, edge, normal.scale(separation), normal, normal.perpendicular(), [side.begin], [localSide.begin], info)\n ];\n }\n // Potential region B collision (circle is on the right side of the edge, after the end)\n if (u <= 0) {\n const db = edgeWorld.end.sub(cc);\n const ddb = db.dot(db);\n if (ddb > circle.radius * circle.radius) {\n return [];\n }\n const normal = db.normalize();\n const separation = circle.radius - Math.sqrt(ddb);\n const info = {\n collider: circle,\n separation: separation,\n axis: normal,\n point: side.end,\n side: side,\n localSide: localSide\n };\n return [\n new _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_2__.CollisionContact(circle, edge, normal.scale(separation), normal, normal.perpendicular(), [side.end], [localSide.end], info)\n ];\n }\n // Otherwise potential region AB collision (circle is in the middle of the edge between the beginning and end)\n const den = e.dot(e);\n const pointOnEdge = edgeWorld.begin\n .scale(u)\n .add(edgeWorld.end.scale(v))\n .scale(1 / den);\n const d = cc.sub(pointOnEdge);\n const dd = d.dot(d);\n if (dd > circle.radius * circle.radius) {\n return []; // no collision\n }\n let normal = e.perpendicular();\n // flip correct direction\n if (normal.dot(cc.sub(edgeWorld.begin)) < 0) {\n normal.x = -normal.x;\n normal.y = -normal.y;\n }\n normal = normal.normalize();\n const separation = circle.radius - Math.sqrt(dd);\n const mvt = normal.scale(separation);\n const info = {\n collider: circle,\n separation: separation,\n axis: normal,\n point: pointOnEdge,\n side: side,\n localSide: localSide\n };\n return [\n new _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_2__.CollisionContact(circle, edge, mvt, normal.negate(), normal.negate().perpendicular(), [pointOnEdge], [pointOnEdge.sub(edge.worldPos)], info)\n ];\n },\n CollideEdgeEdge() {\n // Edge-edge collision doesn't make sense\n return [];\n },\n CollidePolygonEdge(polygon, edge) {\n var _a;\n const pc = polygon.center;\n const ec = edge.center;\n const dir = ec.sub(pc).normalize();\n // build a temporary polygon from the edge to use SAT\n const linePoly = new _PolygonCollider__WEBPACK_IMPORTED_MODULE_5__.PolygonCollider({\n points: [edge.begin, edge.end, edge.end.add(dir.scale(100)), edge.begin.add(dir.scale(100))],\n offset: edge.offset\n });\n linePoly.owner = edge.owner;\n const tx = (_a = edge.owner) === null || _a === void 0 ? void 0 : _a.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__.TransformComponent);\n if (tx) {\n linePoly.update(edge.owner.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__.TransformComponent).get());\n }\n // Gross hack but poly-poly works well\n const contact = this.CollidePolygonPolygon(polygon, linePoly);\n if (contact.length) {\n // Fudge the contact back to edge\n contact[0].colliderB = edge;\n contact[0].id = _Detection_Pair__WEBPACK_IMPORTED_MODULE_6__.Pair.calculatePairHash(polygon.id, edge.id);\n }\n return contact;\n },\n CollidePolygonPolygon(polyA, polyB) {\n // Multi contact from SAT\n // https://gamedev.stackexchange.com/questions/111390/multiple-contacts-for-sat-collision-detection\n // do a SAT test to find a min axis if it exists\n const separationA = _SeparatingAxis__WEBPACK_IMPORTED_MODULE_3__.SeparatingAxis.findPolygonPolygonSeparation(polyA, polyB);\n // If there is no overlap from boxA's perspective we can end early\n if (separationA.separation > 0) {\n return [];\n }\n const separationB = _SeparatingAxis__WEBPACK_IMPORTED_MODULE_3__.SeparatingAxis.findPolygonPolygonSeparation(polyB, polyA);\n // If there is no overlap from boxB's perspective exit now\n if (separationB.separation > 0) {\n return [];\n }\n // Separations are both negative, we want to pick the least negative (minimal movement)\n const separation = separationA.separation > separationB.separation ? separationA : separationB;\n // The incident side is the most opposite from the axes of collision on the other collider\n const other = separation.collider === polyA ? polyB : polyA;\n const main = separation.collider === polyA ? polyA : polyB;\n const toIncidentFrame = other.transform.inverse.multiply(main.transform.matrix, ScratchMatrix);\n const toIncidentFrameRotation = toIncidentFrame.getRotation();\n const referenceEdgeNormal = main.normals[separation.sideId].rotate(toIncidentFrameRotation, ScratchZero, ScratchNormal);\n let minEdge = Number.MAX_VALUE;\n let incidentEdgeIndex = 0;\n for (let i = 0; i < other.normals.length; i++) {\n const value = referenceEdgeNormal.dot(other.normals[i]);\n if (value < minEdge) {\n minEdge = value;\n incidentEdgeIndex = i;\n }\n }\n // Clip incident side by the perpendicular lines at each end of the reference side\n // https://en.wikipedia.org/wiki/Sutherland%E2%80%93Hodgman_algorithm\n const referenceSide = separation.localSide.transform(toIncidentFrame);\n const referenceDirection = separation.localAxis.perpendicular().negate().rotate(toIncidentFrameRotation);\n const incidentSide = new _Math_line_segment__WEBPACK_IMPORTED_MODULE_7__.LineSegment(other.points[incidentEdgeIndex], other.points[(incidentEdgeIndex + 1) % other.points.length]);\n const clipRight = incidentSide.clip(referenceDirection.negate(), -referenceDirection.dot(referenceSide.begin), false);\n let clipLeft = null;\n if (clipRight) {\n clipLeft = clipRight.clip(referenceDirection, referenceDirection.dot(referenceSide.end), false);\n }\n if (clipLeft) {\n const localPoints = [];\n const points = [];\n const clipPoints = clipLeft.getPoints();\n for (let i = 0; i < clipPoints.length; i++) {\n const p = clipPoints[i];\n if (referenceSide.below(p)) {\n localPoints.push(p);\n points.push(other.transform.apply(p));\n }\n }\n let normal = separation.axis;\n let tangent = normal.perpendicular();\n // Point Contact A -> B\n if (polyB.center.sub(polyA.center).dot(normal) < 0) {\n normal = normal.negate();\n tangent = normal.perpendicular();\n }\n return [new _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_2__.CollisionContact(polyA, polyB, normal.scale(-separation.separation), normal, tangent, points, localPoints, separation)];\n }\n return [];\n },\n FindContactSeparation(contact, localPoint) {\n var _a, _b, _c, _d;\n const shapeA = contact.colliderA;\n const txA = (_b = (_a = contact.bodyA) === null || _a === void 0 ? void 0 : _a.transform) !== null && _b !== void 0 ? _b : new _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__.TransformComponent();\n const shapeB = contact.colliderB;\n const txB = (_d = (_c = contact.bodyB) === null || _c === void 0 ? void 0 : _c.transform) !== null && _d !== void 0 ? _d : new _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__.TransformComponent();\n // both are circles\n if (shapeA instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_8__.CircleCollider && shapeB instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_8__.CircleCollider) {\n const combinedRadius = shapeA.radius + shapeB.radius;\n const distance = txA.pos.distance(txB.pos);\n const separation = combinedRadius - distance;\n return -separation;\n }\n // both are polygons\n if (shapeA instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_5__.PolygonCollider && shapeB instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_5__.PolygonCollider) {\n if (contact.info.localSide) {\n let side;\n let worldPoint;\n if (contact.info.collider === shapeA) {\n side = new _Math_line_segment__WEBPACK_IMPORTED_MODULE_7__.LineSegment(txA.apply(contact.info.localSide.begin), txA.apply(contact.info.localSide.end));\n worldPoint = txB.apply(localPoint);\n }\n else {\n side = new _Math_line_segment__WEBPACK_IMPORTED_MODULE_7__.LineSegment(txB.apply(contact.info.localSide.begin), txB.apply(contact.info.localSide.end));\n worldPoint = txA.apply(localPoint);\n }\n return side.distanceToPoint(worldPoint, true);\n }\n }\n // polygon v circle\n if ((shapeA instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_5__.PolygonCollider && shapeB instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_8__.CircleCollider) ||\n (shapeB instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_5__.PolygonCollider && shapeA instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_8__.CircleCollider)) {\n const worldPoint = txA.apply(localPoint);\n if (contact.info.side) {\n return contact.info.side.distanceToPoint(worldPoint, true);\n }\n }\n // polygon v edge\n if ((shapeA instanceof _EdgeCollider__WEBPACK_IMPORTED_MODULE_9__.EdgeCollider && shapeB instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_5__.PolygonCollider) ||\n (shapeB instanceof _EdgeCollider__WEBPACK_IMPORTED_MODULE_9__.EdgeCollider && shapeA instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_5__.PolygonCollider)) {\n let worldPoint;\n if (contact.info.collider === shapeA) {\n worldPoint = txB.apply(localPoint);\n }\n else {\n worldPoint = txA.apply(localPoint);\n }\n if (contact.info.side) {\n return contact.info.side.distanceToPoint(worldPoint, true);\n }\n }\n // circle v edge\n if ((shapeA instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_8__.CircleCollider && shapeB instanceof _EdgeCollider__WEBPACK_IMPORTED_MODULE_9__.EdgeCollider) ||\n (shapeB instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_8__.CircleCollider && shapeA instanceof _EdgeCollider__WEBPACK_IMPORTED_MODULE_9__.EdgeCollider)) {\n // Local point is always on the edge which is always shapeB\n const worldPoint = txB.apply(localPoint);\n let circlePoint;\n if (shapeA instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_8__.CircleCollider) {\n circlePoint = shapeA.getFurthestPoint(contact.normal);\n }\n const dist = worldPoint.distance(circlePoint);\n if (contact.info.side) {\n return dist > 0 ? -dist : 0;\n }\n }\n return 0;\n }\n};\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/CompositeCollider.ts\":\n/*!**************************************************!*\\\n !*** ./Collision/Colliders/CompositeCollider.ts ***!\n \\**************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CompositeCollider: () => (/* binding */ CompositeCollider)\n/* harmony export */ });\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../.. */ \"./Util/Util.ts\");\n/* harmony import */ var _Detection_Pair__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Detection/Pair */ \"./Collision/Detection/Pair.ts\");\n/* harmony import */ var _Math_projection__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../Math/projection */ \"./Math/projection.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Detection_DynamicTree__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Detection/DynamicTree */ \"./Collision/Detection/DynamicTree.ts\");\n/* harmony import */ var _Detection_DynamicTreeCollisionProcessor__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Detection/DynamicTreeCollisionProcessor */ \"./Collision/Detection/DynamicTreeCollisionProcessor.ts\");\n/* harmony import */ var _Collider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Collider */ \"./Collision/Colliders/Collider.ts\");\n/* harmony import */ var _PhysicsConfig__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../PhysicsConfig */ \"./Collision/PhysicsConfig.ts\");\n\n\n\n\n\n\n\n\n\nclass CompositeCollider extends _Collider__WEBPACK_IMPORTED_MODULE_0__.Collider {\n /**\n * Treat composite collider's member colliders as either separate colliders for the purposes of onCollisionStart/onCollision\n * or as a single collider together.\n *\n * This property can be overridden on individual {@apilink CompositeColliders}.\n *\n * For composites without gaps or small groups of colliders, you probably want 'together'\n *\n * For composites with deliberate gaps, like a platforming level layout, you probably want 'separate'\n *\n * Default is 'together' if unset\n */\n set compositeStrategy(value) {\n this._compositeStrategy = value;\n }\n get compositeStrategy() {\n return this._compositeStrategy;\n }\n constructor(colliders) {\n super();\n this._collisionProcessor = new _Detection_DynamicTreeCollisionProcessor__WEBPACK_IMPORTED_MODULE_1__.DynamicTreeCollisionProcessor({\n ...(0,_PhysicsConfig__WEBPACK_IMPORTED_MODULE_2__.getDefaultPhysicsConfig)()\n });\n this._dynamicAABBTree = new _Detection_DynamicTree__WEBPACK_IMPORTED_MODULE_3__.DynamicTree({\n boundsPadding: 5,\n velocityMultiplier: 2\n });\n this._colliders = [];\n for (const c of colliders) {\n this.addCollider(c);\n }\n }\n clearColliders() {\n this._colliders = [];\n }\n addCollider(collider) {\n let colliders;\n if (collider instanceof CompositeCollider) {\n colliders = collider.getColliders();\n colliders.forEach((c) => c.offset.addEqual(collider.offset));\n }\n else {\n colliders = [collider];\n }\n // Flatten composites\n for (const c of colliders) {\n c.events.pipe(this.events);\n c.composite = this;\n this._colliders.push(c);\n this._collisionProcessor.track(c);\n this._dynamicAABBTree.trackCollider(c);\n }\n }\n removeCollider(collider) {\n collider.events.pipe(this.events);\n collider.composite = null;\n ___WEBPACK_IMPORTED_MODULE_4__.removeItemFromArray(collider, this._colliders);\n this._collisionProcessor.untrack(collider);\n this._dynamicAABBTree.untrackCollider(collider);\n }\n getColliders() {\n return this._colliders;\n }\n get worldPos() {\n var _a, _b;\n return ((_b = (_a = this._transform) === null || _a === void 0 ? void 0 : _a.pos) !== null && _b !== void 0 ? _b : _Math_vector__WEBPACK_IMPORTED_MODULE_5__.Vector.Zero).add(this.offset);\n }\n get center() {\n var _a, _b;\n return ((_b = (_a = this._transform) === null || _a === void 0 ? void 0 : _a.pos) !== null && _b !== void 0 ? _b : _Math_vector__WEBPACK_IMPORTED_MODULE_5__.Vector.Zero).add(this.offset);\n }\n get bounds() {\n var _a, _b;\n // TODO cache this\n const colliders = this.getColliders();\n const results = colliders.reduce((acc, collider) => acc.combine(collider.bounds), (_b = (_a = colliders[0]) === null || _a === void 0 ? void 0 : _a.bounds) !== null && _b !== void 0 ? _b : new _BoundingBox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox().translate(this.worldPos));\n return results.translate(this.offset);\n }\n get localBounds() {\n var _a, _b;\n // TODO cache this\n const colliders = this.getColliders();\n const results = colliders.reduce((acc, collider) => acc.combine(collider.localBounds), (_b = (_a = colliders[0]) === null || _a === void 0 ? void 0 : _a.localBounds) !== null && _b !== void 0 ? _b : new _BoundingBox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox());\n return results;\n }\n get axes() {\n // TODO cache this\n const colliders = this.getColliders();\n let axes = [];\n for (const collider of colliders) {\n axes = axes.concat(collider.axes);\n }\n return axes;\n }\n getFurthestPoint(direction) {\n const colliders = this.getColliders();\n const furthestPoints = [];\n for (const collider of colliders) {\n furthestPoints.push(collider.getFurthestPoint(direction));\n }\n // Pick best point from all colliders\n let bestPoint = furthestPoints[0];\n let maxDistance = -Number.MAX_VALUE;\n for (const point of furthestPoints) {\n const distance = point.dot(direction);\n if (distance > maxDistance) {\n bestPoint = point;\n maxDistance = distance;\n }\n }\n return bestPoint;\n }\n getInertia(mass) {\n const colliders = this.getColliders();\n let totalInertia = 0;\n for (const collider of colliders) {\n totalInertia += collider.getInertia(mass);\n }\n return totalInertia;\n }\n collide(other) {\n let otherColliders = [other];\n if (other instanceof CompositeCollider) {\n otherColliders = other.getColliders();\n }\n const pairs = [];\n for (const c of otherColliders) {\n this._dynamicAABBTree.query(c, (potentialCollider) => {\n pairs.push(new _Detection_Pair__WEBPACK_IMPORTED_MODULE_7__.Pair(c, potentialCollider));\n return false;\n });\n }\n let contacts = [];\n for (const p of pairs) {\n contacts = contacts.concat(p.collide());\n }\n return contacts;\n }\n getClosestLineBetween(other) {\n const colliders = this.getColliders();\n const lines = [];\n if (other instanceof CompositeCollider) {\n const otherColliders = other.getColliders();\n for (const colliderA of colliders) {\n for (const colliderB of otherColliders) {\n const maybeLine = colliderA.getClosestLineBetween(colliderB);\n if (maybeLine) {\n lines.push(maybeLine);\n }\n }\n }\n }\n else {\n for (const collider of colliders) {\n const maybeLine = other.getClosestLineBetween(collider);\n if (maybeLine) {\n lines.push(maybeLine);\n }\n }\n }\n if (lines.length) {\n let minLength = lines[0].getLength();\n let minLine = lines[0];\n for (const line of lines) {\n const length = line.getLength();\n if (length < minLength) {\n minLength = length;\n minLine = line;\n }\n }\n return minLine;\n }\n return null;\n }\n contains(point) {\n const colliders = this.getColliders();\n for (const collider of colliders) {\n if (collider.contains(point)) {\n return true;\n }\n }\n return false;\n }\n rayCast(ray, max) {\n const colliders = this.getColliders();\n const hits = [];\n for (const collider of colliders) {\n const hit = collider.rayCast(ray, max);\n if (hit) {\n hits.push(hit);\n }\n }\n if (hits.length) {\n let minHit = hits[0];\n let minDistance = minHit.point.dot(ray.dir);\n for (const hit of hits) {\n const distance = ray.dir.dot(hit.point);\n if (distance < minDistance) {\n minHit = hit;\n minDistance = distance;\n }\n }\n return minHit;\n }\n return null;\n }\n project(axis) {\n const colliders = this.getColliders();\n const projections = [];\n for (const collider of colliders) {\n const proj = collider.project(axis);\n if (proj) {\n projections.push(proj);\n }\n }\n // Merge all proj's on the same axis\n if (projections.length) {\n const newProjection = new _Math_projection__WEBPACK_IMPORTED_MODULE_8__.Projection(projections[0].min, projections[0].max);\n for (const proj of projections) {\n newProjection.min = Math.min(proj.min, newProjection.min);\n newProjection.max = Math.max(proj.max, newProjection.max);\n }\n return newProjection;\n }\n return null;\n }\n update(transform) {\n if (transform) {\n const colliders = this.getColliders();\n for (const collider of colliders) {\n collider.owner = this.owner;\n collider.update(transform);\n }\n }\n }\n debug(ex, color, options) {\n const colliders = this.getColliders();\n ex.save();\n ex.translate(this.offset.x, this.offset.y);\n for (const collider of colliders) {\n collider.debug(ex, color, options);\n }\n ex.restore();\n }\n clone() {\n const result = new CompositeCollider(this._colliders.map((c) => c.clone()));\n result.offset = this.offset.clone();\n return result;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/EdgeCollider.ts\":\n/*!*********************************************!*\\\n !*** ./Collision/Colliders/EdgeCollider.ts ***!\n \\*********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EdgeCollider: () => (/* binding */ EdgeCollider)\n/* harmony export */ });\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./CollisionJumpTable */ \"./Collision/Colliders/CollisionJumpTable.ts\");\n/* harmony import */ var _CircleCollider__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./CircleCollider */ \"./Collision/Colliders/CircleCollider.ts\");\n/* harmony import */ var _PolygonCollider__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./PolygonCollider */ \"./Collision/Colliders/PolygonCollider.ts\");\n/* harmony import */ var _Math_projection__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../Math/projection */ \"./Math/projection.ts\");\n/* harmony import */ var _Math_line_segment__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../Math/line-segment */ \"./Math/line-segment.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Collider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Collider */ \"./Collision/Colliders/Collider.ts\");\n/* harmony import */ var _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./ClosestLineJumpTable */ \"./Collision/Colliders/ClosestLineJumpTable.ts\");\n/* harmony import */ var _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/affine-matrix */ \"./Math/affine-matrix.ts\");\n/* harmony import */ var _Index__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Index */ \"./Collision/BodyComponent.ts\");\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Edge is a single line collider to create collisions with a single line.\n */\nclass EdgeCollider extends _Collider__WEBPACK_IMPORTED_MODULE_0__.Collider {\n constructor(options) {\n var _a;\n super();\n this._globalMatrix = _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_1__.AffineMatrix.identity();\n this.begin = options.begin || _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero;\n this.end = options.end || _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero;\n this.offset = (_a = options.offset) !== null && _a !== void 0 ? _a : _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero;\n }\n /**\n * Returns a clone of this Edge, not associated with any collider\n */\n clone() {\n return new EdgeCollider({\n begin: this.begin.clone(),\n end: this.end.clone()\n });\n }\n get worldPos() {\n var _a;\n const tx = this._transform;\n return (_a = tx === null || tx === void 0 ? void 0 : tx.globalPos.add(this.offset)) !== null && _a !== void 0 ? _a : this.offset;\n }\n /**\n * Get the center of the collision area in world coordinates\n */\n get center() {\n const begin = this._getTransformedBegin();\n const end = this._getTransformedEnd();\n const pos = begin.average(end);\n return pos;\n }\n _getTransformedBegin() {\n return this._globalMatrix.multiply(this.begin);\n }\n _getTransformedEnd() {\n return this._globalMatrix.multiply(this.end);\n }\n /**\n * Returns the slope of the line in the form of a vector\n */\n getSlope() {\n const begin = this._getTransformedBegin();\n const end = this._getTransformedEnd();\n const distance = begin.distance(end);\n return end.sub(begin).scale(1 / distance);\n }\n /**\n * Returns the length of the line segment in pixels\n */\n getLength() {\n const begin = this._getTransformedBegin();\n const end = this._getTransformedEnd();\n const distance = begin.distance(end);\n return distance;\n }\n /**\n * Tests if a point is contained in this collision area\n */\n contains() {\n return false;\n }\n /**\n * @inheritdoc\n */\n rayCast(ray, max = Infinity) {\n var _a;\n const numerator = this._getTransformedBegin().sub(ray.pos);\n // Test is line and ray are parallel and non intersecting\n if (ray.dir.cross(this.getSlope()) === 0 && numerator.cross(ray.dir) !== 0) {\n return null;\n }\n // Lines are parallel\n const divisor = ray.dir.cross(this.getSlope());\n if (divisor === 0) {\n return null;\n }\n const t = numerator.cross(this.getSlope()) / divisor;\n if (t >= 0 && t <= max) {\n const u = numerator.cross(ray.dir) / divisor / this.getLength();\n if (u >= 0 && u <= 1) {\n return {\n distance: t,\n normal: this.asLine().normal(),\n collider: this,\n body: (_a = this.owner) === null || _a === void 0 ? void 0 : _a.get(_Index__WEBPACK_IMPORTED_MODULE_3__.BodyComponent),\n point: ray.getPoint(t)\n };\n }\n }\n return null;\n }\n /**\n * Returns the closes line between this and another collider, from this -> collider\n * @param shape\n */\n getClosestLineBetween(shape) {\n if (shape instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_4__.CircleCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_5__.ClosestLineJumpTable.CircleEdgeClosestLine(shape, this);\n }\n else if (shape instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_6__.PolygonCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_5__.ClosestLineJumpTable.PolygonEdgeClosestLine(shape, this).flip();\n }\n else if (shape instanceof EdgeCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_5__.ClosestLineJumpTable.EdgeEdgeClosestLine(this, shape);\n }\n else {\n throw new Error(`Polygon could not collide with unknown CollisionShape ${typeof shape}`);\n }\n }\n /**\n * @inheritdoc\n */\n collide(shape) {\n if (shape instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_4__.CircleCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_7__.CollisionJumpTable.CollideCircleEdge(shape, this);\n }\n else if (shape instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_6__.PolygonCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_7__.CollisionJumpTable.CollidePolygonEdge(shape, this);\n }\n else if (shape instanceof EdgeCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_7__.CollisionJumpTable.CollideEdgeEdge();\n }\n else {\n throw new Error(`Edge could not collide with unknown CollisionShape ${typeof shape}`);\n }\n }\n /**\n * Find the point on the collider furthest in the direction specified\n */\n getFurthestPoint(direction) {\n const transformedBegin = this._getTransformedBegin();\n const transformedEnd = this._getTransformedEnd();\n if (direction.dot(transformedBegin) > 0) {\n return transformedBegin;\n }\n else {\n return transformedEnd;\n }\n }\n _boundsFromBeginEnd(begin, end, padding = 10) {\n // A perfectly vertical or horizontal edge would have a bounds 0 width or height\n // this causes problems for the collision system so we give them some padding\n return new _BoundingBox__WEBPACK_IMPORTED_MODULE_8__.BoundingBox(Math.min(begin.x, end.x) - padding, Math.min(begin.y, end.y) - padding, Math.max(begin.x, end.x) + padding, Math.max(begin.y, end.y) + padding);\n }\n /**\n * Get the axis aligned bounding box for the edge collider in world space\n */\n get bounds() {\n const transformedBegin = this._getTransformedBegin();\n const transformedEnd = this._getTransformedEnd();\n return this._boundsFromBeginEnd(transformedBegin, transformedEnd);\n }\n /**\n * Get the axis aligned bounding box for the edge collider in local space\n */\n get localBounds() {\n return this._boundsFromBeginEnd(this.begin, this.end);\n }\n /**\n * Returns this edge represented as a line in world coordinates\n */\n asLine() {\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_9__.LineSegment(this._getTransformedBegin(), this._getTransformedEnd());\n }\n /**\n * Return this edge as a line in local line coordinates (relative to the position)\n */\n asLocalLine() {\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_9__.LineSegment(this.begin, this.end);\n }\n /**\n * Get the axis associated with the edge\n */\n get axes() {\n const e = this._getTransformedEnd().sub(this._getTransformedBegin());\n const edgeNormal = e.normal();\n const axes = [];\n axes.push(edgeNormal);\n axes.push(edgeNormal.negate());\n axes.push(edgeNormal.normal());\n axes.push(edgeNormal.normal().negate());\n return axes;\n }\n /**\n * Get the moment of inertia for an edge\n * https://en.wikipedia.org/wiki/List_of_moments_of_inertia\n */\n getInertia(mass) {\n const length = this.end.sub(this.begin).distance() / 2;\n return mass * length * length;\n }\n /**\n * @inheritdoc\n */\n update(transform) {\n var _a;\n this._transform = transform;\n const globalMat = (_a = transform.matrix) !== null && _a !== void 0 ? _a : this._globalMatrix;\n globalMat.clone(this._globalMatrix);\n this._globalMatrix.translate(this.offset.x, this.offset.y);\n }\n /**\n * Project the edge along a specified axis\n */\n project(axis) {\n const scalars = [];\n const points = [this._getTransformedBegin(), this._getTransformedEnd()];\n const len = points.length;\n for (let i = 0; i < len; i++) {\n scalars.push(points[i].dot(axis));\n }\n return new _Math_projection__WEBPACK_IMPORTED_MODULE_10__.Projection(Math.min.apply(Math, scalars), Math.max.apply(Math, scalars));\n }\n debug(ex, color) {\n const begin = this._getTransformedBegin();\n const end = this._getTransformedEnd();\n ex.drawLine(begin, end, color, 2);\n ex.drawCircle(begin, 2, color);\n ex.drawCircle(end, 2, color);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/PolygonCollider.ts\":\n/*!************************************************!*\\\n !*** ./Collision/Colliders/PolygonCollider.ts ***!\n \\************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PolygonCollider: () => (/* binding */ PolygonCollider)\n/* harmony export */ });\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _EdgeCollider__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./EdgeCollider */ \"./Collision/Colliders/EdgeCollider.ts\");\n/* harmony import */ var _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./CollisionJumpTable */ \"./Collision/Colliders/CollisionJumpTable.ts\");\n/* harmony import */ var _CircleCollider__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./CircleCollider */ \"./Collision/Colliders/CircleCollider.ts\");\n/* harmony import */ var _Math_projection__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../Math/projection */ \"./Math/projection.ts\");\n/* harmony import */ var _Math_line_segment__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../Math/line-segment */ \"./Math/line-segment.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math_ray__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../Math/ray */ \"./Math/ray.ts\");\n/* harmony import */ var _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./ClosestLineJumpTable */ \"./Collision/Colliders/ClosestLineJumpTable.ts\");\n/* harmony import */ var _Collider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Collider */ \"./Collision/Colliders/Collider.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../.. */ \"./Util/Log.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../.. */ \"./Math/util.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../.. */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../.. */ \"./Graphics/Debug.ts\");\n/* harmony import */ var _CompositeCollider__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var _Shape__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Shape */ \"./Collision/Colliders/Shape.ts\");\n/* harmony import */ var _Math_transform__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math/transform */ \"./Math/transform.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Polygon collider for detecting collisions\n */\nclass PolygonCollider extends _Collider__WEBPACK_IMPORTED_MODULE_0__.Collider {\n flagDirty() {\n this._localBoundsDirty = true;\n this._localSidesDirty = true;\n this._transformedPointsDirty = true;\n this._sidesDirty = true;\n }\n get normals() {\n return this._normals;\n }\n /**\n * Points in the polygon in order around the perimeter in local coordinates. These are relative from the body transform position.\n * Excalibur stores these in counter-clockwise order\n */\n set points(points) {\n if (points.length < 3) {\n throw new Error('PolygonCollider cannot be created with less that 3 points');\n }\n this._points = points;\n this._checkAndUpdateWinding(this._points);\n this._calculateNormals();\n this.flagDirty();\n }\n _calculateNormals() {\n const normals = [];\n for (let i = 0; i < this._points.length; i++) {\n normals.push(this._points[(i + 1) % this._points.length].sub(this._points[i]).normal());\n }\n this._normals = normals;\n }\n /**\n * Points in the polygon in order around the perimeter in local coordinates. These are relative from the body transform position.\n * Excalibur stores these in counter-clockwise order\n */\n get points() {\n return this._points;\n }\n get transform() {\n return this._transform;\n }\n constructor(options) {\n var _a;\n super();\n this._logger = ___WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this._transform = new _Math_transform__WEBPACK_IMPORTED_MODULE_2__.Transform();\n this._transformedPoints = [];\n this._sides = [];\n this._localSides = [];\n this._transformedPointsDirty = true;\n this._sidesDirty = true;\n this._localSidesDirty = true;\n this._localBoundsDirty = true;\n this.offset = (_a = options.offset) !== null && _a !== void 0 ? _a : _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero;\n this._transform.pos.x += this.offset.x;\n this._transform.pos.y += this.offset.y;\n this.points = options.points;\n if (!this.isConvex()) {\n if (!options.suppressConvexWarning) {\n this._logger.warn('Excalibur only supports convex polygon colliders and will not behave properly.' +\n 'Call PolygonCollider.triangulate() to build a new collider composed of smaller convex triangles');\n }\n }\n // calculate initial transformation\n this._calculateTransformation();\n }\n _checkAndUpdateWinding(points) {\n const counterClockwise = this._isCounterClockwiseWinding(points);\n if (!counterClockwise) {\n points.reverse();\n }\n }\n _isCounterClockwiseWinding(points) {\n // https://stackoverflow.com/a/1165943\n let sum = 0;\n for (let i = 0; i < points.length; i++) {\n sum += (points[(i + 1) % points.length].x - points[i].x) * (points[(i + 1) % points.length].y + points[i].y);\n }\n return sum < 0;\n }\n /**\n * Returns if the polygon collider is convex, Excalibur does not handle non-convex collision shapes.\n * Call {@apilink Polygon.triangulate} to generate a {@apilink CompositeCollider} from this non-convex shape\n */\n isConvex() {\n // From SO: https://stackoverflow.com/a/45372025\n if (this.points.length < 3) {\n return false;\n }\n let oldPoint = this.points[this.points.length - 2];\n let newPoint = this.points[this.points.length - 1];\n let direction = Math.atan2(newPoint.y - oldPoint.y, newPoint.x - oldPoint.x);\n let oldDirection = 0;\n let orientation = 0;\n let angleSum = 0;\n for (const [i, point] of this.points.entries()) {\n oldPoint = newPoint;\n oldDirection = direction;\n newPoint = point;\n direction = Math.atan2(newPoint.y - oldPoint.y, newPoint.x - oldPoint.x);\n if (oldPoint.equals(newPoint)) {\n return false; // repeat point\n }\n let angle = direction - oldDirection;\n if (angle <= -Math.PI) {\n angle += Math.PI * 2;\n }\n else if (angle > Math.PI) {\n angle -= Math.PI * 2;\n }\n if (i === 0) {\n if (angle === 0.0) {\n return false;\n }\n orientation = angle > 0 ? 1 : -1;\n }\n else {\n if (orientation * angle <= 0) {\n return false;\n }\n }\n angleSum += angle;\n }\n return Math.abs(Math.round(angleSum / (Math.PI * 2))) === 1;\n }\n /**\n * Tessellates the polygon into a triangle fan as a {@apilink CompositeCollider} of triangle polygons\n */\n tessellate() {\n const polygons = [];\n for (let i = 1; i < this.points.length - 2; i++) {\n polygons.push([this.points[0], this.points[i + 1], this.points[i + 2]]);\n }\n polygons.push([this.points[0], this.points[1], this.points[2]]);\n return new _CompositeCollider__WEBPACK_IMPORTED_MODULE_4__.CompositeCollider(polygons.map((points) => _Shape__WEBPACK_IMPORTED_MODULE_5__.Shape.Polygon(points)));\n }\n /**\n * Triangulate the polygon collider using the \"Ear Clipping\" algorithm.\n * Returns a new {@apilink CompositeCollider} made up of smaller triangles.\n */\n triangulate() {\n // https://www.youtube.com/watch?v=hTJFcHutls8\n if (this.points.length < 3) {\n throw Error('Invalid polygon');\n }\n const triangles = [];\n // algorithm likes clockwise\n const vertices = [...this.points].reverse();\n let vertexCount = vertices.length;\n /**\n * Returns the previous index based on the current vertex\n */\n function getPrevIndex(index) {\n return index === 0 ? vertexCount - 1 : index - 1;\n }\n /**\n * Retrieves the next index based on the current vertex\n */\n function getNextIndex(index) {\n return index === vertexCount - 1 ? 0 : index + 1;\n }\n /**\n * Whether or not the angle at this vertex index is convex\n */\n function isConvex(index) {\n const prev = getPrevIndex(index);\n const next = getNextIndex(index);\n const va = vertices[prev];\n const vb = vertices[index];\n const vc = vertices[next];\n // Check convexity\n const leftArm = va.sub(vb);\n const rightArm = vc.sub(vb);\n // Positive cross product is convex\n if (leftArm.cross(rightArm) < 0) {\n return false;\n }\n return true;\n }\n const convexVertices = vertices.map((_, i) => isConvex(i));\n /**\n * Quick test for point in triangle\n */\n function isPointInTriangle(point, a, b, c) {\n const ab = b.sub(a);\n const bc = c.sub(b);\n const ca = a.sub(c);\n const ap = point.sub(a);\n const bp = point.sub(b);\n const cp = point.sub(c);\n const cross1 = ab.cross(ap);\n const cross2 = bc.cross(bp);\n const cross3 = ca.cross(cp);\n if (cross1 > 0 || cross2 > 0 || cross3 > 0) {\n return false;\n }\n return true;\n }\n /**\n * Calculate the area of the triangle\n */\n // function triangleArea(a: Vector, b: Vector, c: Vector) {\n // return Math.abs(a.x * (b.y - c.y) + b.x * (c.y - a.y) + c.x * (a.y - c.y))/2;\n // }\n /**\n * Find the next suitable ear tip\n */\n function findEarTip() {\n for (let i = 0; i < vertexCount; i++) {\n if (convexVertices[i]) {\n const prev = getPrevIndex(i);\n const next = getNextIndex(i);\n const va = vertices[prev];\n const vb = vertices[i];\n const vc = vertices[next];\n let isEar = true;\n // Check that if any vertices are in the triangle a, b, c\n for (let j = 0; j < vertexCount; j++) {\n // We can skip these verts because they are the triangle we are testing\n if (j === i || j === prev || j === next) {\n continue;\n }\n const point = vertices[j];\n if (isPointInTriangle(point, va, vb, vc)) {\n isEar = false;\n break;\n }\n }\n // Add ear to polygon list and remove from list\n if (isEar) {\n return i;\n }\n }\n }\n // Fall back to any convex vertex\n for (let i = 0; i < vertexCount; i++) {\n if (convexVertices[i]) {\n return i;\n }\n }\n // bail and return the first one?\n return 0;\n }\n /**\n * Cut the ear and produce a triangle, update internal state\n */\n function cutEarTip(index) {\n const prev = getPrevIndex(index);\n const next = getNextIndex(index);\n const va = vertices[prev];\n const vb = vertices[index];\n const vc = vertices[next];\n // Clockwise winding\n // if (triangleArea(va, vb, vc) > 0) {\n triangles.push([va, vb, vc]);\n // }\n vertices.splice(index, 1);\n convexVertices.splice(index, 1);\n vertexCount--;\n }\n // Loop over all the vertices finding ears\n while (vertexCount > 3) {\n const earIndex = findEarTip();\n cutEarTip(earIndex);\n // reclassify vertices\n for (let i = 0; i < vertexCount; i++) {\n convexVertices[i] = isConvex(i);\n }\n }\n // Last triangle after the loop\n triangles.push([vertices[0], vertices[1], vertices[2]]);\n // FIXME: there is a colinear triangle that sneaks in here sometimes\n return new _CompositeCollider__WEBPACK_IMPORTED_MODULE_4__.CompositeCollider(triangles.map((points) => _Shape__WEBPACK_IMPORTED_MODULE_5__.Shape.Polygon(points, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero, true)));\n }\n /**\n * Returns a clone of this ConvexPolygon, not associated with any collider\n */\n clone() {\n return new PolygonCollider({\n offset: this.offset.clone(),\n points: this.points.map((p) => p.clone())\n });\n }\n /**\n * Returns the world position of the collider, which is the current body transform plus any defined offset\n */\n get worldPos() {\n return this._transform.pos;\n }\n /**\n * Get the center of the collider in world coordinates\n */\n get center() {\n return this.bounds.center;\n }\n /**\n * Calculates the underlying transformation from the body relative space to world space\n */\n _calculateTransformation() {\n const points = this.points;\n const len = points.length;\n this._transformedPoints.length = 0; // clear out old transform\n for (let i = 0; i < len; i++) {\n this._transformedPoints[i] = this._transform.apply(points[i].clone());\n }\n }\n /**\n * Gets the points that make up the polygon in world space, from actor relative space (if specified)\n */\n getTransformedPoints() {\n if (this._transformedPointsDirty) {\n this._calculateTransformation();\n this._transformedPointsDirty = false;\n }\n return this._transformedPoints;\n }\n /**\n * Gets the sides of the polygon in world space\n */\n getSides() {\n if (this._sidesDirty) {\n const lines = [];\n const points = this.getTransformedPoints();\n const len = points.length;\n for (let i = 0; i < len; i++) {\n // This winding is important\n lines.push(new _Math_line_segment__WEBPACK_IMPORTED_MODULE_6__.LineSegment(points[i], points[(i + 1) % len]));\n }\n this._sides = lines;\n this._sidesDirty = false;\n }\n return this._sides;\n }\n /**\n * Returns the local coordinate space sides\n */\n getLocalSides() {\n if (this._localSidesDirty) {\n const lines = [];\n const points = this.points;\n const len = points.length;\n for (let i = 0; i < len; i++) {\n // This winding is important\n lines.push(new _Math_line_segment__WEBPACK_IMPORTED_MODULE_6__.LineSegment(points[i], points[(i + 1) % len]));\n }\n this._localSides = lines;\n this._localSidesDirty = false;\n }\n return this._localSides;\n }\n /**\n * Given a direction vector find the world space side that is most in that direction\n * @param direction\n */\n findSide(direction) {\n const sides = this.getSides();\n let bestSide = sides[0];\n let maxDistance = -Number.MAX_VALUE;\n for (let side = 0; side < sides.length; side++) {\n const currentSide = sides[side];\n const sideNormal = currentSide.normal();\n const mostDirection = sideNormal.dot(direction);\n if (mostDirection > maxDistance) {\n bestSide = currentSide;\n maxDistance = mostDirection;\n }\n }\n return bestSide;\n }\n /**\n * Given a direction vector find the local space side that is most in that direction\n * @param direction\n */\n findLocalSide(direction) {\n const sides = this.getLocalSides();\n let bestSide = sides[0];\n let maxDistance = -Number.MAX_VALUE;\n for (let side = 0; side < sides.length; side++) {\n const currentSide = sides[side];\n const sideNormal = currentSide.normal();\n const mostDirection = sideNormal.dot(direction);\n if (mostDirection > maxDistance) {\n bestSide = currentSide;\n maxDistance = mostDirection;\n }\n }\n return bestSide;\n }\n /**\n * Get the axis associated with the convex polygon\n */\n get axes() {\n const axes = [];\n const sides = this.getSides();\n for (let i = 0; i < sides.length; i++) {\n axes.push(sides[i].normal());\n }\n return axes;\n }\n /**\n * Updates the transform for the collision geometry\n *\n * Collision geometry (points/bounds) will not change until this is called.\n * @param transform\n */\n update(transform) {\n if (transform) {\n // This change means an update must be performed in order for geometry to update\n transform.cloneWithParent(this._transform);\n this._transformedPointsDirty = true;\n this._sidesDirty = true;\n if (this.offset.x !== 0 || this.offset.y !== 0) {\n this._transform.pos.x += this.offset.x;\n this._transform.pos.y += this.offset.y;\n }\n if (this._transform.isMirrored()) {\n // negative transforms really mess with things in collision local space\n // flatten out the negatives by applying to geometry\n this.points = this.points.map((p) => (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(p.x * (0,___WEBPACK_IMPORTED_MODULE_7__.sign)(this._transform.scale.x), p.y * (0,___WEBPACK_IMPORTED_MODULE_7__.sign)(this._transform.scale.y)));\n this._transform.scale.x = Math.abs(this._transform.scale.x);\n this._transform.scale.y = Math.abs(this._transform.scale.y);\n }\n }\n }\n /**\n * Tests if a point is contained in this collider in world space\n */\n contains(point) {\n // Always cast to the right, as long as we cast in a consistent fixed direction we\n // will be fine\n const localPoint = this._transform.applyInverse(point);\n const testRay = new _Math_ray__WEBPACK_IMPORTED_MODULE_8__.Ray(localPoint, new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(1, 0));\n let intersectCount = 0;\n const sides = this.getLocalSides();\n for (let sideIndex = 0; sideIndex < sides.length; sideIndex++) {\n const side = sides[sideIndex];\n if (testRay.intersect(side) >= 0) {\n intersectCount++;\n }\n }\n if (intersectCount % 2 === 0) {\n return false;\n }\n return true;\n }\n getClosestLineBetween(collider) {\n if (collider instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_9__.CircleCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_10__.ClosestLineJumpTable.PolygonCircleClosestLine(this, collider);\n }\n else if (collider instanceof PolygonCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_10__.ClosestLineJumpTable.PolygonPolygonClosestLine(this, collider);\n }\n else if (collider instanceof _EdgeCollider__WEBPACK_IMPORTED_MODULE_11__.EdgeCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_10__.ClosestLineJumpTable.PolygonEdgeClosestLine(this, collider);\n }\n else {\n throw new Error(`Polygon could not collide with unknown CollisionShape ${typeof collider}`);\n }\n }\n /**\n * Returns a collision contact if the 2 colliders collide, otherwise collide will\n * return null.\n * @param collider\n */\n collide(collider) {\n if (collider instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_9__.CircleCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_12__.CollisionJumpTable.CollideCirclePolygon(collider, this);\n }\n else if (collider instanceof PolygonCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_12__.CollisionJumpTable.CollidePolygonPolygon(this, collider);\n }\n else if (collider instanceof _EdgeCollider__WEBPACK_IMPORTED_MODULE_11__.EdgeCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_12__.CollisionJumpTable.CollidePolygonEdge(this, collider);\n }\n else {\n throw new Error(`Polygon could not collide with unknown CollisionShape ${typeof collider}`);\n }\n }\n /**\n * Find the point on the collider furthest in the direction specified\n */\n getFurthestPoint(direction) {\n const pts = this.getTransformedPoints();\n let furthestPoint = null;\n let maxDistance = -Number.MAX_VALUE;\n for (let i = 0; i < pts.length; i++) {\n const distance = direction.dot(pts[i]);\n if (distance > maxDistance) {\n maxDistance = distance;\n furthestPoint = pts[i];\n }\n }\n return furthestPoint;\n }\n /**\n * Find the local point on the collider furthest in the direction specified\n * @param direction\n */\n getFurthestLocalPoint(direction) {\n const pts = this.points;\n let furthestPoint = pts[0];\n let maxDistance = -Number.MAX_VALUE;\n for (let i = 0; i < pts.length; i++) {\n const distance = direction.dot(pts[i]);\n if (distance > maxDistance) {\n maxDistance = distance;\n furthestPoint = pts[i];\n }\n }\n return furthestPoint;\n }\n /**\n * Finds the closes face to the point using perpendicular distance\n * @param point point to test against polygon\n */\n getClosestFace(point) {\n const sides = this.getSides();\n let min = Number.POSITIVE_INFINITY;\n let faceIndex = -1;\n let distance = -1;\n for (let i = 0; i < sides.length; i++) {\n const dist = sides[i].distanceToPoint(point);\n if (dist < min) {\n min = dist;\n faceIndex = i;\n distance = dist;\n }\n }\n if (faceIndex !== -1) {\n return {\n distance: sides[faceIndex].normal().scale(distance),\n face: sides[faceIndex]\n };\n }\n return null;\n }\n /**\n * Get the axis aligned bounding box for the polygon collider in world coordinates\n */\n get bounds() {\n return this.localBounds.transform(this._transform.matrix);\n }\n /**\n * Get the axis aligned bounding box for the polygon collider in local coordinates\n */\n get localBounds() {\n if (this._localBoundsDirty) {\n this._localBounds = _BoundingBox__WEBPACK_IMPORTED_MODULE_13__.BoundingBox.fromPoints(this.points);\n this._localBoundsDirty = false;\n }\n return this._localBounds;\n }\n /**\n * Get the moment of inertia for an arbitrary polygon\n * https://en.wikipedia.org/wiki/List_of_moments_of_inertia\n */\n getInertia(mass) {\n if (this._cachedMass === mass && this._cachedInertia) {\n return this._cachedInertia;\n }\n let numerator = 0;\n let denominator = 0;\n const points = this.points;\n for (let i = 0; i < points.length; i++) {\n const iplusone = (i + 1) % points.length;\n const crossTerm = points[iplusone].cross(points[i]);\n numerator += crossTerm * (points[i].dot(points[i]) + points[i].dot(points[iplusone]) + points[iplusone].dot(points[iplusone]));\n denominator += crossTerm;\n }\n this._cachedMass = mass;\n return (this._cachedInertia = (mass / 6) * (numerator / denominator));\n }\n /**\n * Casts a ray into the polygon and returns a vector representing the point of contact (in world space) or null if no collision.\n */\n rayCast(ray, max = Infinity) {\n var _a;\n // find the minimum contact time greater than 0\n // contact times less than 0 are behind the ray and we don't want those\n const sides = this.getSides();\n const len = sides.length;\n let minContactTime = Number.MAX_VALUE;\n let contactSide;\n let contactIndex = -1;\n for (let i = 0; i < len; i++) {\n const contactTime = ray.intersect(sides[i]);\n if (contactTime >= 0 && contactTime < minContactTime && contactTime <= max) {\n minContactTime = contactTime;\n contactSide = sides[i];\n contactIndex = i;\n }\n }\n // contact was found\n if (contactIndex >= 0) {\n return {\n collider: this,\n distance: minContactTime,\n body: (_a = this.owner) === null || _a === void 0 ? void 0 : _a.get(___WEBPACK_IMPORTED_MODULE_14__.BodyComponent),\n point: ray.getPoint(minContactTime),\n normal: contactSide.normal()\n };\n }\n // no contact found\n return null;\n }\n /**\n * Project the edges of the polygon along a specified axis\n */\n project(axis) {\n const points = this.getTransformedPoints();\n const len = points.length;\n let min = Number.MAX_VALUE;\n let max = -Number.MAX_VALUE;\n for (let i = 0; i < len; i++) {\n const scalar = points[i].dot(axis);\n min = Math.min(min, scalar);\n max = Math.max(max, scalar);\n }\n return new _Math_projection__WEBPACK_IMPORTED_MODULE_15__.Projection(min, max);\n }\n debug(ex, color, options) {\n const points = this.getTransformedPoints();\n ___WEBPACK_IMPORTED_MODULE_16__.Debug.drawPolygon(points, { color });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/SeparatingAxis.ts\":\n/*!***********************************************!*\\\n !*** ./Collision/Colliders/SeparatingAxis.ts ***!\n \\***********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SeparatingAxis: () => (/* binding */ SeparatingAxis),\n/* harmony export */ SeparationInfo: () => (/* binding */ SeparationInfo)\n/* harmony export */ });\n/* harmony import */ var _Math_line_segment__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/line-segment */ \"./Math/line-segment.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math/affine-matrix */ \"./Math/affine-matrix.ts\");\n/* harmony import */ var _Util_Pool__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Util/Pool */ \"./Util/Pool.ts\");\n\n\n\n\n/**\n * Specific information about a contact and it's separation\n */\nclass SeparationInfo {\n constructor() {\n /**\n * Axis of separation from the collider's perspective\n */\n this.axis = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n /**\n * Local axis of separation from the collider's perspective\n */\n this.localAxis = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n /**\n * Side of separation (reference) from the collider's perspective\n */\n this.side = new _Math_line_segment__WEBPACK_IMPORTED_MODULE_1__.LineSegment((0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0), (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0));\n /**\n * Local side of separation (reference) from the collider's perspective\n */\n this.localSide = new _Math_line_segment__WEBPACK_IMPORTED_MODULE_1__.LineSegment((0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0), (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0));\n /**\n * Point on collider B (incident point)\n */\n this.point = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n /**\n * Local point on collider B (incident point)\n */\n this.localPoint = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n }\n}\nclass SeparatingAxis {\n static findPolygonPolygonSeparation(polyA, polyB) {\n // if polyB has 0 scale we need to hop back to degenerate separation\n if (polyB.transform.matrix.determinant() === 0) {\n return SeparatingAxis.findPolygonPolygonSeparationDegenerate(polyA, polyB);\n }\n // Multi contact from SAT\n // https://gamedev.stackexchange.com/questions/111390/multiple-contacts-for-sat-collision-detection\n // do a SAT test to find a min axis if it exists\n let bestSeparation = -Number.MAX_VALUE;\n let bestSideIndex = -1;\n let localPoint;\n // Work inside polyB reference frame\n // inv polyB converts to local space from polyA world space\n const toPolyBSpace = polyB.transform.inverse.multiply(polyA.transform.matrix, SeparatingAxis._SCRATCH_MATRIX);\n const toPolyBSpaceRotation = toPolyBSpace.getRotation();\n const normalsA = polyA.normals;\n const pointsA = polyA.points;\n const pointsB = polyB.points;\n for (let pointsAIndex = 0; pointsAIndex < pointsA.length; pointsAIndex++) {\n const normal = normalsA[pointsAIndex].rotate(toPolyBSpaceRotation, SeparatingAxis._ZERO, SeparatingAxis._SCRATCH_NORMAL);\n const point = toPolyBSpace.multiply(pointsA[pointsAIndex], SeparatingAxis._SCRATCH_POINT);\n // For every point in polyB\n // We want to see how much overlap there is on the axis provided by the normal\n // We want to find the minimum overlap among all points\n let smallestPointDistance = Number.MAX_VALUE;\n let smallestLocalPoint;\n for (let pointsBIndex = 0; pointsBIndex < pointsB.length; pointsBIndex++) {\n const distance = normal.dot(pointsB[pointsBIndex].sub(point, SeparatingAxis._SCRATCH_SUB_POINT));\n if (distance < smallestPointDistance) {\n smallestPointDistance = distance;\n smallestLocalPoint = pointsB[pointsBIndex];\n }\n }\n // We take the maximum overlap as the separation between the\n // A negative separation means there were no gaps between the two shapes\n if (smallestPointDistance > bestSeparation) {\n bestSeparation = smallestPointDistance;\n bestSideIndex = pointsAIndex;\n localPoint = smallestLocalPoint;\n }\n }\n // TODO can we avoid applying world space transforms?\n const bestSide2 = (bestSideIndex + 1) % pointsA.length;\n const separationInfo = SeparatingAxis.SeparationPool.get();\n separationInfo.collider = polyA;\n separationInfo.separation = bestSeparation;\n if (bestSeparation > 0) {\n // early out because if separation is > 0 then no local point\n return separationInfo;\n }\n normalsA[bestSideIndex].clone(separationInfo.localAxis);\n normalsA[bestSideIndex].rotate(polyA.transform.rotation, SeparatingAxis._ZERO, separationInfo.axis);\n polyA.transform.matrix.multiply(pointsA[bestSideIndex], separationInfo.side.begin);\n polyA.transform.matrix.multiply(pointsA[bestSide2], separationInfo.side.end);\n polyB.transform.matrix.multiply(localPoint, separationInfo.point);\n separationInfo.sideId = bestSideIndex;\n localPoint.clone(separationInfo.localPoint);\n pointsA[bestSideIndex].clone(separationInfo.localSide.begin);\n pointsA[bestSide2].clone(separationInfo.localSide.end);\n return separationInfo;\n }\n static findCirclePolygonSeparation(circle, polygon) {\n const axes = polygon.axes;\n const pc = polygon.center;\n // Special SAT with circles\n const polyDir = pc.sub(circle.worldPos);\n const closestPointOnPoly = polygon.getFurthestPoint(polyDir.negate());\n axes.push(closestPointOnPoly.sub(circle.worldPos).normalize());\n let minOverlap = Number.MAX_VALUE;\n let minAxis = null;\n let minIndex = -1;\n for (let i = 0; i < axes.length; i++) {\n const proj1 = polygon.project(axes[i]);\n const proj2 = circle.project(axes[i]);\n const overlap = proj1.getOverlap(proj2);\n if (overlap <= 0) {\n return null;\n }\n else {\n if (overlap < minOverlap) {\n minOverlap = overlap;\n minAxis = axes[i];\n minIndex = i;\n }\n }\n }\n if (minIndex < 0) {\n return null;\n }\n return minAxis.normalize().scale(minOverlap);\n }\n static findPolygonPolygonSeparationDegenerate(polyA, polyB) {\n let bestSeparation = -Number.MAX_VALUE;\n let bestSide = null;\n let bestAxis = null;\n let bestSideIndex = -1;\n let bestOtherPoint = null;\n const sides = polyA.getSides();\n const localSides = polyA.getLocalSides();\n for (let i = 0; i < sides.length; i++) {\n const side = sides[i];\n const axis = side.normal();\n const vertB = polyB.getFurthestPoint(axis.negate());\n // Separation on side i's axis\n // We are looking for the largest separation between poly A's sides\n const vertSeparation = side.distanceToPoint(vertB, true);\n if (vertSeparation > bestSeparation) {\n bestSeparation = vertSeparation;\n bestSide = side;\n bestAxis = axis;\n bestSideIndex = i;\n bestOtherPoint = vertB;\n }\n }\n return {\n collider: polyA,\n separation: bestAxis ? bestSeparation : 99,\n axis: bestAxis,\n side: bestSide,\n localSide: localSides[bestSideIndex],\n sideId: bestSideIndex,\n point: bestOtherPoint,\n localPoint: bestAxis ? polyB.getFurthestLocalPoint(bestAxis.negate()) : null\n };\n }\n}\nSeparatingAxis.SeparationPool = new _Util_Pool__WEBPACK_IMPORTED_MODULE_2__.Pool(() => new SeparationInfo(), (i) => i, // no recycle\n500);\nSeparatingAxis._ZERO = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\nSeparatingAxis._SCRATCH_POINT = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\nSeparatingAxis._SCRATCH_SUB_POINT = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\nSeparatingAxis._SCRATCH_NORMAL = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\nSeparatingAxis._SCRATCH_MATRIX = _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_3__.AffineMatrix.identity();\nSeparatingAxis.SeparationPool.disableWarnings = true;\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/Shape.ts\":\n/*!**************************************!*\\\n !*** ./Collision/Colliders/Shape.ts ***!\n \\**************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Shape: () => (/* binding */ Shape)\n/* harmony export */ });\n/* harmony import */ var _PolygonCollider__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./PolygonCollider */ \"./Collision/Colliders/PolygonCollider.ts\");\n/* harmony import */ var _CircleCollider__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./CircleCollider */ \"./Collision/Colliders/CircleCollider.ts\");\n/* harmony import */ var _EdgeCollider__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./EdgeCollider */ \"./Collision/Colliders/EdgeCollider.ts\");\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _CompositeCollider__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../.. */ \"./Util/Log.ts\");\n\n\n\n\n\n\n\n/**\n * Excalibur helper for defining colliders quickly\n */\nclass Shape {\n /**\n * Creates a box collider, under the hood defines a {@apilink PolygonCollider} collider\n * @param width Width of the box\n * @param height Height of the box\n * @param anchor Anchor of the box (default (.5, .5)) which positions the box relative to the center of the collider's position\n * @param offset Optional offset relative to the collider in local coordinates\n */\n static Box(width, height, anchor = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Half, offset = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero) {\n return new _PolygonCollider__WEBPACK_IMPORTED_MODULE_1__.PolygonCollider({\n points: new _BoundingBox__WEBPACK_IMPORTED_MODULE_2__.BoundingBox(-width * anchor.x, -height * anchor.y, width - width * anchor.x, height - height * anchor.y).getPoints(),\n offset: offset\n });\n }\n /**\n * Creates a new {@apilink PolygonCollider | `arbitrary polygon`} collider\n *\n * PolygonColliders are useful for creating convex polygon shapes\n * @param points Points specified in counter clockwise\n * @param offset Optional offset relative to the collider in local coordinates\n */\n static Polygon(points, offset = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero, suppressConvexWarning = false) {\n return new _PolygonCollider__WEBPACK_IMPORTED_MODULE_1__.PolygonCollider({\n points: points,\n offset: offset,\n suppressConvexWarning\n });\n }\n /**\n * Creates a new {@apilink CircleCollider | `circle`} collider\n *\n * Circle colliders are useful for balls, or to make collisions more forgiving on sharp edges\n * @param radius Radius of the circle collider\n * @param offset Optional offset relative to the collider in local coordinates\n */\n static Circle(radius, offset = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero) {\n return new _CircleCollider__WEBPACK_IMPORTED_MODULE_3__.CircleCollider({\n radius: radius,\n offset: offset\n });\n }\n /**\n * Creates a new {@apilink EdgeCollider | `edge`} collider\n *\n * Edge colliders are useful for floors, walls, and other barriers\n * @param begin Beginning of the edge in local coordinates to the collider\n * @param end Ending of the edge in local coordinates to the collider\n */\n static Edge(begin, end) {\n return new _EdgeCollider__WEBPACK_IMPORTED_MODULE_4__.EdgeCollider({\n begin: begin,\n end: end\n });\n }\n /**\n * Creates a new capsule shaped {@apilink CompositeCollider} using 2 circles and a box\n *\n * Capsule colliders are useful for platformers with incline or jagged floors to have a smooth\n * player experience.\n * @param width\n * @param height\n * @param offset Optional offset\n */\n static Capsule(width, height, offset = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero) {\n const logger = ___WEBPACK_IMPORTED_MODULE_5__.Logger.getInstance();\n if (width === height) {\n logger.warn('A capsule collider with equal width and height is a circle, consider using a ex.Shape.Circle or ex.CircleCollider');\n }\n const vertical = height >= width;\n if (vertical) {\n // height > width, if equal maybe use a circle\n const capsule = new _CompositeCollider__WEBPACK_IMPORTED_MODULE_6__.CompositeCollider([\n Shape.Circle(width / 2, (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, -height / 2 + width / 2).add(offset)),\n Shape.Box(width, height - width, _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Half, offset),\n Shape.Circle(width / 2, (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, height / 2 - width / 2).add(offset))\n ]);\n return capsule;\n }\n else {\n // width > height, if equal maybe use a circle\n const capsule = new _CompositeCollider__WEBPACK_IMPORTED_MODULE_6__.CompositeCollider([\n Shape.Circle(height / 2, (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(-width / 2 + height / 2, 0).add(offset)),\n Shape.Box(width - height, height, _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Half, offset),\n Shape.Circle(height / 2, (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(width / 2 - height / 2, 0).add(offset))\n ]);\n return capsule;\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/CollisionSystem.ts\":\n/*!**************************************!*\\\n !*** ./Collision/CollisionSystem.ts ***!\n \\**************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CollisionSystem: () => (/* binding */ CollisionSystem)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Priority.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _SolverStrategy__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./SolverStrategy */ \"./Collision/SolverStrategy.ts\");\n/* harmony import */ var _Solver_ArcadeSolver__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Solver/ArcadeSolver */ \"./Collision/Solver/ArcadeSolver.ts\");\n/* harmony import */ var _Solver_RealisticSolver__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Solver/RealisticSolver */ \"./Collision/Solver/RealisticSolver.ts\");\n/* harmony import */ var _ColliderComponent__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./ColliderComponent */ \"./Collision/ColliderComponent.ts\");\n/* harmony import */ var _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Colliders/CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var _Collision_Side__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../Collision/Side */ \"./Collision/Side.ts\");\n/* harmony import */ var _Colliders_SeparatingAxis__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Colliders/SeparatingAxis */ \"./Collision/Colliders/SeparatingAxis.ts\");\n/* harmony import */ var _MotionSystem__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./MotionSystem */ \"./Collision/MotionSystem.ts\");\n/* harmony import */ var _Detection_Pair__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Detection/Pair */ \"./Collision/Detection/Pair.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass CollisionSystem extends _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.System {\n get _processor() {\n return this._physics.collisionProcessor;\n }\n constructor(world, _physics) {\n super();\n this._physics = _physics;\n this.systemType = _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.SystemType.Update;\n this._configDirty = false;\n this._lastFrameContacts = new Map();\n this._currentFrameContacts = new Map();\n this._arcadeSolver = new _Solver_ArcadeSolver__WEBPACK_IMPORTED_MODULE_1__.ArcadeSolver(_physics.config.arcade);\n this._realisticSolver = new _Solver_RealisticSolver__WEBPACK_IMPORTED_MODULE_2__.RealisticSolver(_physics.config.realistic);\n this._physics.$configUpdate.subscribe(() => (this._configDirty = true));\n this._trackCollider = (c) => this._processor.track(c);\n this._untrackCollider = (c) => this._processor.untrack(c);\n this.query = world.query([_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__.TransformComponent, _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_4__.MotionComponent, _ColliderComponent__WEBPACK_IMPORTED_MODULE_5__.ColliderComponent]);\n this.query.entityAdded$.subscribe((e) => {\n const colliderComponent = e.get(_ColliderComponent__WEBPACK_IMPORTED_MODULE_5__.ColliderComponent);\n colliderComponent.$colliderAdded.subscribe(this._trackCollider);\n colliderComponent.$colliderRemoved.subscribe(this._untrackCollider);\n const collider = colliderComponent.get();\n if (collider) {\n this._processor.track(collider);\n }\n });\n this.query.entityRemoved$.subscribe((e) => {\n const colliderComponent = e.get(_ColliderComponent__WEBPACK_IMPORTED_MODULE_5__.ColliderComponent);\n const collider = colliderComponent.get();\n if (colliderComponent && collider) {\n this._processor.untrack(collider);\n }\n });\n this._motionSystem = world.get(_MotionSystem__WEBPACK_IMPORTED_MODULE_6__.MotionSystem);\n }\n initialize(world, scene) {\n this._engine = scene.engine;\n }\n update(elapsed) {\n var _a, _b, _c, _d;\n if (!this._physics.config.enabled) {\n return;\n }\n // TODO do we need to do this every frame?\n // Collect up all the colliders and update them\n let colliders = [];\n for (let entityIndex = 0; entityIndex < this.query.entities.length; entityIndex++) {\n const entity = this.query.entities[entityIndex];\n const colliderComp = entity.get(_ColliderComponent__WEBPACK_IMPORTED_MODULE_5__.ColliderComponent);\n const collider = colliderComp === null || colliderComp === void 0 ? void 0 : colliderComp.get();\n if (colliderComp && ((_a = colliderComp.owner) === null || _a === void 0 ? void 0 : _a.isActive) && collider) {\n colliderComp.update();\n // Flatten composite colliders\n if (collider instanceof _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_7__.CompositeCollider) {\n const compositeColliders = collider.getColliders();\n if (!collider.compositeStrategy) {\n collider.compositeStrategy = this._physics.config.colliders.compositeStrategy;\n }\n colliders = colliders.concat(compositeColliders);\n }\n else {\n colliders.push(collider);\n }\n }\n }\n // Update the spatial partitioning data structures\n // TODO if collider invalid it will break the processor\n // TODO rename \"update\" to something more specific\n this._processor.update(colliders, elapsed);\n // Run broadphase on all colliders and locates potential collisions\n let pairs = this._processor.broadphase(colliders, elapsed);\n this._currentFrameContacts.clear();\n // Given possible pairs find actual contacts\n let contacts = []; // = this._processor.narrowphase(pairs, this._engine?.debug?.stats?.currFrame);\n const solver = this.getSolver();\n // Solve, this resolves the position/velocity so entities aren't overlapping\n const substep = this._physics.config.substep;\n for (let step = 0; step < substep; step++) {\n if (step > 0) {\n // first step is run by the MotionSystem when configured, so skip\n this._motionSystem.update(elapsed);\n }\n // Re-use pairs from previous collision\n if (contacts.length) {\n pairs = contacts.map((c) => new _Detection_Pair__WEBPACK_IMPORTED_MODULE_8__.Pair(c.colliderA, c.colliderB));\n }\n if (pairs.length) {\n contacts = this._processor.narrowphase(pairs, (_d = (_c = (_b = this._engine) === null || _b === void 0 ? void 0 : _b.debug) === null || _c === void 0 ? void 0 : _c.stats) === null || _d === void 0 ? void 0 : _d.currFrame);\n contacts = solver.solve(contacts);\n // Record contacts for start/end\n for (const contact of contacts) {\n if (contact.isCanceled()) {\n continue;\n }\n // Process composite ids, things with the same composite id are treated as the same collider for start/end\n const index = contact.id.indexOf('|');\n if (index > 0) {\n const compositeId = contact.id.substring(index + 1);\n this._currentFrameContacts.set(compositeId, contact);\n }\n else {\n this._currentFrameContacts.set(contact.id, contact);\n }\n }\n }\n }\n // Emit contact start/end events\n this.runContactStartEnd();\n // reset the last frame cache\n this._lastFrameContacts.clear();\n // Keep track of collisions contacts that have started or ended\n this._lastFrameContacts = new Map(this._currentFrameContacts);\n // Process deferred collider removals\n for (const entity of this.query.entities) {\n const collider = entity.get(_ColliderComponent__WEBPACK_IMPORTED_MODULE_5__.ColliderComponent);\n if (collider) {\n collider.processColliderRemoval();\n }\n }\n }\n postupdate() {\n _Colliders_SeparatingAxis__WEBPACK_IMPORTED_MODULE_9__.SeparatingAxis.SeparationPool.done();\n }\n getSolver() {\n if (this._configDirty) {\n this._configDirty = false;\n this._arcadeSolver = new _Solver_ArcadeSolver__WEBPACK_IMPORTED_MODULE_1__.ArcadeSolver(this._physics.config.arcade);\n this._realisticSolver = new _Solver_RealisticSolver__WEBPACK_IMPORTED_MODULE_2__.RealisticSolver(this._physics.config.realistic);\n }\n return this._physics.config.solver === _SolverStrategy__WEBPACK_IMPORTED_MODULE_10__.SolverStrategy.Realistic ? this._realisticSolver : this._arcadeSolver;\n }\n debug(ex) {\n this._processor.debug(ex, 0);\n }\n runContactStartEnd() {\n // If composite colliders are 'together' collisions may have a duplicate id because we want to treat those as a singular start/end\n for (const [id, c] of this._currentFrameContacts) {\n // find all new contacts\n if (!this._lastFrameContacts.has(id)) {\n const colliderA = c.colliderA;\n const colliderB = c.colliderB;\n const side = _Collision_Side__WEBPACK_IMPORTED_MODULE_11__.Side.fromDirection(c.mtv);\n const opposite = _Collision_Side__WEBPACK_IMPORTED_MODULE_11__.Side.getOpposite(side);\n colliderA.events.emit('collisionstart', new _Events__WEBPACK_IMPORTED_MODULE_12__.CollisionStartEvent(colliderA, colliderB, side, c));\n colliderA.events.emit('contactstart', new _Events__WEBPACK_IMPORTED_MODULE_12__.ContactStartEvent(colliderA, colliderB, side, c));\n colliderB.events.emit('collisionstart', new _Events__WEBPACK_IMPORTED_MODULE_12__.CollisionStartEvent(colliderB, colliderA, opposite, c));\n colliderB.events.emit('contactstart', new _Events__WEBPACK_IMPORTED_MODULE_12__.ContactStartEvent(colliderB, colliderA, opposite, c));\n }\n }\n // find all contacts that have ceased\n for (const [id, c] of this._lastFrameContacts) {\n if (!this._currentFrameContacts.has(id)) {\n const colliderA = c.colliderA;\n const colliderB = c.colliderB;\n const side = _Collision_Side__WEBPACK_IMPORTED_MODULE_11__.Side.fromDirection(c.mtv);\n const opposite = _Collision_Side__WEBPACK_IMPORTED_MODULE_11__.Side.getOpposite(side);\n colliderA.events.emit('collisionend', new _Events__WEBPACK_IMPORTED_MODULE_12__.CollisionEndEvent(colliderA, colliderB, side, c));\n colliderA.events.emit('contactend', new _Events__WEBPACK_IMPORTED_MODULE_12__.ContactEndEvent(colliderA, colliderB, side, c));\n colliderB.events.emit('collisionend', new _Events__WEBPACK_IMPORTED_MODULE_12__.CollisionEndEvent(colliderB, colliderA, opposite, c));\n colliderB.events.emit('contactend', new _Events__WEBPACK_IMPORTED_MODULE_12__.ContactEndEvent(colliderB, colliderA, opposite, c));\n }\n }\n }\n}\nCollisionSystem.priority = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_13__.SystemPriority.Higher;\n\n\n/***/ }),\n\n/***/ \"./Collision/CollisionType.ts\":\n/*!************************************!*\\\n !*** ./Collision/CollisionType.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CollisionType: () => (/* binding */ CollisionType)\n/* harmony export */ });\n/**\n * An enum that describes the types of collisions bodies can participate in\n */\nvar CollisionType;\n(function (CollisionType) {\n /**\n * Bodies with the `PreventCollision` setting do not participate in any\n * collisions and do not raise collision events.\n */\n CollisionType[\"PreventCollision\"] = \"PreventCollision\";\n /**\n * Bodies with the `Passive` setting only raise collision events, but are not\n * influenced or moved by other bodies and do not influence or move other bodies.\n * This is useful for use in trigger type behavior.\n */\n CollisionType[\"Passive\"] = \"Passive\";\n /**\n * Bodies with the `Active` setting raise collision events and participate\n * in collisions with other bodies and will be push or moved by bodies sharing\n * the `Active` or `Fixed` setting.\n */\n CollisionType[\"Active\"] = \"Active\";\n /**\n * Bodies with the `Fixed` setting raise collision events and participate in\n * collisions with other bodies. Actors with the `Fixed` setting will not be\n * pushed or moved by other bodies sharing the `Fixed`. Think of Fixed\n * bodies as \"immovable/unstoppable\" objects. If two `Fixed` bodies meet they will\n * not be pushed or moved by each other, they will not interact except to throw\n * collision events.\n */\n CollisionType[\"Fixed\"] = \"Fixed\";\n})(CollisionType || (CollisionType = {}));\n\n\n/***/ }),\n\n/***/ \"./Collision/Detection/CollisionContact.ts\":\n/*!*************************************************!*\\\n !*** ./Collision/Detection/CollisionContact.ts ***!\n \\*************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CollisionContact: () => (/* binding */ CollisionContact)\n/* harmony export */ });\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Pair__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Pair */ \"./Collision/Detection/Pair.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../BodyComponent */ \"./Collision/BodyComponent.ts\");\n\n\n\n/**\n * Collision contacts are used internally by Excalibur to resolve collision between colliders. This\n * Pair prevents collisions from being evaluated more than one time\n */\nclass CollisionContact {\n constructor(colliderA, colliderB, mtv, normal, tangent, points, localPoints, info) {\n var _a, _b, _c, _d, _e, _f;\n this._canceled = false;\n this.bodyA = null;\n this.bodyB = null;\n this.colliderA = colliderA;\n this.colliderB = colliderB;\n this.mtv = mtv;\n this.normal = normal;\n this.tangent = tangent;\n this.points = points;\n this.localPoints = localPoints;\n this.info = info;\n this.id = _Pair__WEBPACK_IMPORTED_MODULE_0__.Pair.calculatePairHash(colliderA.id, colliderB.id);\n if (colliderA.composite || colliderB.composite) {\n // Add on the parent composite pair for start/end contact if 'together\n const colliderAId = ((_a = colliderA.composite) === null || _a === void 0 ? void 0 : _a.compositeStrategy) === 'separate' ? colliderA.id : (_c = (_b = colliderA.composite) === null || _b === void 0 ? void 0 : _b.id) !== null && _c !== void 0 ? _c : colliderA.id;\n const colliderBId = ((_d = colliderB.composite) === null || _d === void 0 ? void 0 : _d.compositeStrategy) === 'separate' ? colliderB.id : (_f = (_e = colliderB.composite) === null || _e === void 0 ? void 0 : _e.id) !== null && _f !== void 0 ? _f : colliderB.id;\n this.id += '|' + _Pair__WEBPACK_IMPORTED_MODULE_0__.Pair.calculatePairHash(colliderAId, colliderBId);\n }\n if (this.colliderA.owner) {\n this.bodyA = this.colliderA.owner.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_1__.BodyComponent);\n }\n if (this.colliderB.owner) {\n this.bodyB = this.colliderB.owner.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_1__.BodyComponent);\n }\n }\n /**\n * Match contact awake state, except if body's are Fixed\n */\n matchAwake() {\n const bodyA = this.bodyA;\n const bodyB = this.bodyB;\n if (bodyA && bodyB) {\n if (bodyA.isSleeping !== bodyB.isSleeping) {\n if (bodyA.isSleeping && bodyA.collisionType !== _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.Fixed && bodyB.sleepMotion >= bodyA.wakeThreshold) {\n bodyA.isSleeping = false;\n }\n if (bodyB.isSleeping && bodyB.collisionType !== _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.Fixed && bodyA.sleepMotion >= bodyB.wakeThreshold) {\n bodyB.isSleeping = false;\n }\n }\n }\n }\n isCanceled() {\n return this._canceled;\n }\n cancel() {\n this._canceled = true;\n }\n /**\n * Biases the contact so that the given collider is colliderA\n */\n bias(collider) {\n if (collider !== this.colliderA && collider !== this.colliderB) {\n throw new Error('Collider must be either colliderA or colliderB from this contact');\n }\n if (collider === this.colliderA) {\n return this;\n }\n const colliderA = this.colliderA;\n const colliderB = this.colliderB;\n this.colliderB = colliderA;\n this.colliderA = colliderB;\n this.mtv = this.mtv.negate();\n this.normal = this.normal.negate();\n this.tangent = this.tangent.negate();\n return this;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Detection/DynamicTree.ts\":\n/*!********************************************!*\\\n !*** ./Collision/Detection/DynamicTree.ts ***!\n \\********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DynamicTree: () => (/* binding */ DynamicTree),\n/* harmony export */ TreeNode: () => (/* binding */ TreeNode)\n/* harmony export */ });\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../.. */ \"./Color.ts\");\n\n\n\n\n/**\n * Dynamic Tree Node used for tracking bounds within the tree\n */\nclass TreeNode {\n constructor(parent) {\n this.parent = parent;\n this.parent = parent || null;\n this.data = null;\n this.bounds = new _BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox();\n this.left = null;\n this.right = null;\n this.height = 0;\n }\n isLeaf() {\n return !this.left && !this.right;\n }\n}\n/**\n * The DynamicTrees provides a spatial partitioning data structure for quickly querying for overlapping bounding boxes for\n * all tracked bodies. The worst case performance of this is O(n*log(n)) where n is the number of bodies in the tree.\n *\n * Internally the bounding boxes are organized as a balanced binary tree of bounding boxes, where the leaf nodes are tracked bodies.\n * Every non-leaf node is a bounding box that contains child bounding boxes.\n */\nclass DynamicTree {\n constructor(_config, worldBounds = new _BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox(-Number.MAX_VALUE, -Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE)) {\n this._config = _config;\n this.worldBounds = worldBounds;\n this.root = null;\n this.nodes = {};\n }\n /**\n * Inserts a node into the dynamic tree\n */\n _insert(leaf) {\n // If there are no nodes in the tree, make this the root leaf\n if (this.root === null) {\n this.root = leaf;\n this.root.parent = null;\n return;\n }\n // Search the tree for a node that is not a leaf and find the best place to insert\n const leafAABB = leaf.bounds;\n let currentRoot = this.root;\n while (!currentRoot.isLeaf()) {\n const left = currentRoot.left;\n const right = currentRoot.right;\n const area = currentRoot.bounds.getPerimeter();\n const combinedAABB = currentRoot.bounds.combine(leafAABB);\n const combinedArea = combinedAABB.getPerimeter();\n // Calculate cost heuristic for creating a new parent and leaf\n const cost = 2 * combinedArea;\n // Minimum cost of pushing the leaf down the tree\n const inheritanceCost = 2 * (combinedArea - area);\n // Cost of descending\n let leftCost = 0;\n const leftCombined = leafAABB.combine(left.bounds);\n let newArea;\n let oldArea;\n if (left.isLeaf()) {\n leftCost = leftCombined.getPerimeter() + inheritanceCost;\n }\n else {\n oldArea = left.bounds.getPerimeter();\n newArea = leftCombined.getPerimeter();\n leftCost = newArea - oldArea + inheritanceCost;\n }\n let rightCost = 0;\n const rightCombined = leafAABB.combine(right.bounds);\n if (right.isLeaf()) {\n rightCost = rightCombined.getPerimeter() + inheritanceCost;\n }\n else {\n oldArea = right.bounds.getPerimeter();\n newArea = rightCombined.getPerimeter();\n rightCost = newArea - oldArea + inheritanceCost;\n }\n // cost is acceptable\n if (cost < leftCost && cost < rightCost) {\n break;\n }\n // Descend to the depths\n if (leftCost < rightCost) {\n currentRoot = left;\n }\n else {\n currentRoot = right;\n }\n }\n // Create the new parent node and insert into the tree\n const oldParent = currentRoot.parent;\n const newParent = new TreeNode(oldParent);\n newParent.bounds = leafAABB.combine(currentRoot.bounds);\n newParent.height = currentRoot.height + 1;\n if (oldParent !== null) {\n // The sibling node was not the root\n if (oldParent.left === currentRoot) {\n oldParent.left = newParent;\n }\n else {\n oldParent.right = newParent;\n }\n newParent.left = currentRoot;\n newParent.right = leaf;\n currentRoot.parent = newParent;\n leaf.parent = newParent;\n }\n else {\n // The sibling node was the root\n newParent.left = currentRoot;\n newParent.right = leaf;\n currentRoot.parent = newParent;\n leaf.parent = newParent;\n this.root = newParent;\n }\n // Walk up the tree fixing heights and AABBs\n let currentNode = leaf.parent;\n while (currentNode) {\n currentNode = this._balance(currentNode);\n if (!currentNode.left) {\n throw new Error('Parent of current leaf cannot have a null left child' + currentNode);\n }\n if (!currentNode.right) {\n throw new Error('Parent of current leaf cannot have a null right child' + currentNode);\n }\n currentNode.height = 1 + Math.max(currentNode.left.height, currentNode.right.height);\n currentNode.bounds = currentNode.left.bounds.combine(currentNode.right.bounds);\n currentNode = currentNode.parent;\n }\n }\n /**\n * Removes a node from the dynamic tree\n */\n _remove(leaf) {\n if (leaf === this.root) {\n this.root = null;\n return;\n }\n const parent = leaf.parent;\n const grandParent = parent.parent;\n let sibling;\n if (parent.left === leaf) {\n sibling = parent.right;\n }\n else {\n sibling = parent.left;\n }\n if (grandParent) {\n if (grandParent.left === parent) {\n grandParent.left = sibling;\n }\n else {\n grandParent.right = sibling;\n }\n sibling.parent = grandParent;\n let currentNode = grandParent;\n while (currentNode) {\n currentNode = this._balance(currentNode);\n currentNode.bounds = currentNode.left.bounds.combine(currentNode.right.bounds);\n currentNode.height = 1 + Math.max(currentNode.left.height, currentNode.right.height);\n currentNode = currentNode.parent;\n }\n }\n else {\n this.root = sibling;\n sibling.parent = null;\n }\n }\n /**\n * Tracks a body in the dynamic tree\n */\n trackCollider(collider) {\n const node = new TreeNode();\n node.data = collider;\n node.bounds = collider.bounds;\n node.bounds.left -= 2;\n node.bounds.top -= 2;\n node.bounds.right += 2;\n node.bounds.bottom += 2;\n this.nodes[collider.id.value] = node;\n this._insert(node);\n }\n /**\n * Updates the dynamic tree given the current bounds of each body being tracked\n */\n updateCollider(collider) {\n var _a;\n const node = this.nodes[collider.id.value];\n if (!node) {\n return false;\n }\n const b = collider.bounds;\n // if the body is outside the world no longer update it\n if (!this.worldBounds.contains(b)) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance().warn('Collider with id ' + collider.id.value + ' is outside the world bounds and will no longer be tracked for physics');\n this.untrackCollider(collider);\n return false;\n }\n if (node.bounds.contains(b)) {\n return false;\n }\n this._remove(node);\n b.left -= this._config.boundsPadding;\n b.top -= this._config.boundsPadding;\n b.right += this._config.boundsPadding;\n b.bottom += this._config.boundsPadding;\n // THIS IS CAUSING UNNECESSARY CHECKS\n if (collider.owner) {\n const body = (_a = collider.owner) === null || _a === void 0 ? void 0 : _a.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_2__.BodyComponent);\n if (body) {\n const multdx = ((body.vel.x * 32) / 1000) * this._config.velocityMultiplier;\n const multdy = ((body.vel.y * 32) / 1000) * this._config.velocityMultiplier;\n if (multdx < 0) {\n b.left += multdx;\n }\n else {\n b.right += multdx;\n }\n if (multdy < 0) {\n b.top += multdy;\n }\n else {\n b.bottom += multdy;\n }\n }\n }\n node.bounds = b;\n this._insert(node);\n return true;\n }\n /**\n * Untracks a body from the dynamic tree\n */\n untrackCollider(collider) {\n const node = this.nodes[collider.id.value];\n if (!node) {\n return;\n }\n this._remove(node);\n this.nodes[collider.id.value] = null;\n delete this.nodes[collider.id.value];\n }\n /**\n * Balances the tree about a node\n */\n _balance(node) {\n if (node === null) {\n throw new Error('Cannot balance at null node');\n }\n if (node.isLeaf() || node.height < 2) {\n return node;\n }\n const left = node.left;\n const right = node.right;\n const a = node;\n const b = left;\n const c = right;\n const d = left.left;\n const e = left.right;\n const f = right.left;\n const g = right.right;\n const balance = c.height - b.height;\n // Rotate c node up\n if (balance > 1) {\n // Swap the right node with it's parent\n c.left = a;\n c.parent = a.parent;\n a.parent = c;\n // The original node's old parent should point to the right node\n // this is mega confusing\n if (c.parent) {\n if (c.parent.left === a) {\n c.parent.left = c;\n }\n else {\n c.parent.right = c;\n }\n }\n else {\n this.root = c;\n }\n // Rotate\n if (f.height > g.height) {\n c.right = f;\n a.right = g;\n g.parent = a;\n a.bounds = b.bounds.combine(g.bounds);\n c.bounds = a.bounds.combine(f.bounds);\n a.height = 1 + Math.max(b.height, g.height);\n c.height = 1 + Math.max(a.height, f.height);\n }\n else {\n c.right = g;\n a.right = f;\n f.parent = a;\n a.bounds = b.bounds.combine(f.bounds);\n c.bounds = a.bounds.combine(g.bounds);\n a.height = 1 + Math.max(b.height, f.height);\n c.height = 1 + Math.max(a.height, g.height);\n }\n return c;\n }\n // Rotate left node up\n if (balance < -1) {\n // swap\n b.left = a;\n b.parent = a.parent;\n a.parent = b;\n // node's old parent should point to b\n if (b.parent) {\n if (b.parent.left === a) {\n b.parent.left = b;\n }\n else {\n if (b.parent.right !== a) {\n throw 'Error rotating Dynamic Tree';\n }\n b.parent.right = b;\n }\n }\n else {\n this.root = b;\n }\n // rotate\n if (d.height > e.height) {\n b.right = d;\n a.left = e;\n e.parent = a;\n a.bounds = c.bounds.combine(e.bounds);\n b.bounds = a.bounds.combine(d.bounds);\n a.height = 1 + Math.max(c.height, e.height);\n b.height = 1 + Math.max(a.height, d.height);\n }\n else {\n b.right = e;\n a.left = d;\n d.parent = a;\n a.bounds = c.bounds.combine(d.bounds);\n b.bounds = a.bounds.combine(e.bounds);\n a.height = 1 + Math.max(c.height, d.height);\n b.height = 1 + Math.max(a.height, e.height);\n }\n return b;\n }\n return node;\n }\n /**\n * Returns the internal height of the tree, shorter trees are better. Performance drops as the tree grows\n */\n getHeight() {\n if (this.root === null) {\n return 0;\n }\n return this.root.height;\n }\n /**\n * Queries the Dynamic Axis Aligned Tree for bodies that could be colliding with the provided body.\n *\n * In the query callback, it will be passed a potential collider. Returning true from this callback indicates\n * that you are complete with your query and you do not want to continue. Returning false will continue searching\n * the tree until all possible colliders have been returned.\n */\n query(collider, callback) {\n const bounds = collider.bounds;\n const helper = (currentNode) => {\n if (currentNode && currentNode.bounds.overlaps(bounds)) {\n if (currentNode.isLeaf() && currentNode.data !== collider) {\n if (callback.call(collider, currentNode.data)) {\n return true;\n }\n }\n else {\n return helper(currentNode.left) || helper(currentNode.right);\n }\n }\n return false;\n };\n helper(this.root);\n }\n /**\n * Queries the Dynamic Axis Aligned Tree for bodies that could be intersecting. By default the raycast query uses an infinitely\n * long ray to test the tree specified by `max`.\n *\n * In the query callback, it will be passed a potential body that intersects with the raycast. Returning true from this\n * callback indicates that your are complete with your query and do not want to continue. Return false will continue searching\n * the tree until all possible bodies that would intersect with the ray have been returned.\n */\n rayCastQuery(ray, max = Infinity, callback) {\n const helper = (currentNode) => {\n if (currentNode && currentNode.bounds.rayCast(ray, max)) {\n if (currentNode.isLeaf()) {\n if (callback.call(ray, currentNode.data)) {\n // ray hit a leaf! return the body\n return true;\n }\n }\n else {\n // ray hit but not at a leaf, recurse deeper\n return helper(currentNode.left) || helper(currentNode.right);\n }\n }\n return false; // ray missed\n };\n helper(this.root);\n }\n getNodes() {\n const helper = (currentNode) => {\n if (currentNode) {\n return [currentNode].concat(helper(currentNode.left), helper(currentNode.right));\n }\n else {\n return [];\n }\n };\n return helper(this.root);\n }\n debug(ex) {\n // draw all the nodes in the Dynamic Tree\n const helper = (currentNode) => {\n if (currentNode) {\n if (currentNode.isLeaf()) {\n currentNode.bounds.draw(ex, ___WEBPACK_IMPORTED_MODULE_3__.Color.Green);\n }\n else {\n currentNode.bounds.draw(ex, ___WEBPACK_IMPORTED_MODULE_3__.Color.White);\n }\n if (currentNode.left) {\n helper(currentNode.left);\n }\n if (currentNode.right) {\n helper(currentNode.right);\n }\n }\n };\n helper(this.root);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Detection/DynamicTreeCollisionProcessor.ts\":\n/*!**************************************************************!*\\\n !*** ./Collision/Detection/DynamicTreeCollisionProcessor.ts ***!\n \\**************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DynamicTreeCollisionProcessor: () => (/* binding */ DynamicTreeCollisionProcessor)\n/* harmony export */ });\n/* harmony import */ var _DynamicTree__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./DynamicTree */ \"./Collision/Detection/DynamicTree.ts\");\n/* harmony import */ var _Pair__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Pair */ \"./Collision/Detection/Pair.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math_ray__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../Math/ray */ \"./Math/ray.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Colliders/CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Group/CollisionGroup */ \"./Collision/Group/CollisionGroup.ts\");\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Id__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Id */ \"./Id.ts\");\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Responsible for performing the collision broadphase (locating potential collisions) and\n * the narrowphase (actual collision contacts)\n */\nclass DynamicTreeCollisionProcessor {\n constructor(_config) {\n this._config = _config;\n this._pairs = new Set();\n this._collisionPairCache = [];\n this._colliders = [];\n this._dynamicCollisionTree = new _DynamicTree__WEBPACK_IMPORTED_MODULE_0__.DynamicTree(_config.dynamicTree);\n }\n getColliders() {\n return this._colliders;\n }\n query(pointOrBounds) {\n const results = [];\n if (pointOrBounds instanceof _BoundingBox__WEBPACK_IMPORTED_MODULE_1__.BoundingBox) {\n this._dynamicCollisionTree.query({\n id: (0,_Id__WEBPACK_IMPORTED_MODULE_2__.createId)('collider', -1),\n owner: null,\n bounds: pointOrBounds\n }, (other) => {\n results.push(other);\n return false;\n });\n }\n else {\n this._dynamicCollisionTree.query({\n id: (0,_Id__WEBPACK_IMPORTED_MODULE_2__.createId)('collider', -1),\n owner: null,\n bounds: new _BoundingBox__WEBPACK_IMPORTED_MODULE_1__.BoundingBox(pointOrBounds.x, pointOrBounds.y, pointOrBounds.x, pointOrBounds.y)\n }, (other) => {\n results.push(other);\n return false;\n });\n }\n return results;\n }\n rayCast(ray, options) {\n var _a, _b, _c;\n const results = [];\n const maxDistance = (_a = options === null || options === void 0 ? void 0 : options.maxDistance) !== null && _a !== void 0 ? _a : Infinity;\n const collisionGroup = options === null || options === void 0 ? void 0 : options.collisionGroup;\n const collisionMask = !collisionGroup ? (_b = options === null || options === void 0 ? void 0 : options.collisionMask) !== null && _b !== void 0 ? _b : _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_3__.CollisionGroup.All.category : collisionGroup.category;\n const searchAllColliders = (_c = options === null || options === void 0 ? void 0 : options.searchAllColliders) !== null && _c !== void 0 ? _c : false;\n this._dynamicCollisionTree.rayCastQuery(ray, maxDistance, (collider) => {\n const owner = collider.owner;\n const maybeBody = owner.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_4__.BodyComponent);\n if ((options === null || options === void 0 ? void 0 : options.ignoreCollisionGroupAll) && maybeBody.group === _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_3__.CollisionGroup.All) {\n return false;\n }\n const canCollide = (collisionMask & maybeBody.group.category) !== 0;\n // Early exit if not the right group\n if ((maybeBody === null || maybeBody === void 0 ? void 0 : maybeBody.group) && !canCollide) {\n return false;\n }\n const hit = collider.rayCast(ray, maxDistance);\n if (hit) {\n if (options === null || options === void 0 ? void 0 : options.filter) {\n if (options.filter(hit)) {\n results.push(hit);\n if (!searchAllColliders) {\n // returning true exits the search\n return true;\n }\n }\n }\n else {\n results.push(hit);\n if (!searchAllColliders) {\n // returning true exits the search\n return true;\n }\n }\n }\n return false;\n });\n return results;\n }\n /**\n * Tracks a physics body for collisions\n */\n track(target) {\n if (!target) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_5__.Logger.getInstance().warn('Cannot track null collider');\n return;\n }\n if (target instanceof _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_6__.CompositeCollider) {\n const colliders = target.getColliders();\n for (const c of colliders) {\n c.owner = target.owner;\n this._colliders.push(c);\n this._dynamicCollisionTree.trackCollider(c);\n }\n }\n else {\n this._colliders.push(target);\n this._dynamicCollisionTree.trackCollider(target);\n }\n }\n /**\n * Untracks a physics body\n */\n untrack(target) {\n if (!target) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_5__.Logger.getInstance().warn('Cannot untrack a null collider');\n return;\n }\n if (target instanceof _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_6__.CompositeCollider) {\n const colliders = target.getColliders();\n for (const c of colliders) {\n const index = this._colliders.indexOf(c);\n if (index !== -1) {\n this._colliders.splice(index, 1);\n }\n this._dynamicCollisionTree.untrackCollider(c);\n }\n }\n else {\n const index = this._colliders.indexOf(target);\n if (index !== -1) {\n this._colliders.splice(index, 1);\n }\n this._dynamicCollisionTree.untrackCollider(target);\n }\n }\n _pairExists(colliderA, colliderB) {\n // if the collision pair has been calculated already short circuit\n const hash = _Pair__WEBPACK_IMPORTED_MODULE_7__.Pair.calculatePairHash(colliderA.id, colliderB.id);\n return this._pairs.has(hash);\n }\n /**\n * Detects potential collision pairs in a broadphase approach with the dynamic AABB tree strategy\n */\n broadphase(targets, elapsed, stats) {\n const seconds = elapsed / 1000;\n // Retrieve the list of potential colliders, exclude killed, prevented, and self\n const potentialColliders = targets.filter((other) => {\n var _a, _b;\n const body = (_a = other.owner) === null || _a === void 0 ? void 0 : _a.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_4__.BodyComponent);\n return ((_b = other.owner) === null || _b === void 0 ? void 0 : _b.isActive) && body.collisionType !== _CollisionType__WEBPACK_IMPORTED_MODULE_8__.CollisionType.PreventCollision;\n });\n // clear old list of collision pairs\n this._collisionPairCache = [];\n this._pairs.clear();\n // check for normal collision pairs\n let collider;\n for (let j = 0, l = potentialColliders.length; j < l; j++) {\n collider = potentialColliders[j];\n // Query the collision tree for potential colliders\n this._dynamicCollisionTree.query(collider, (other) => {\n if (!this._pairExists(collider, other) && _Pair__WEBPACK_IMPORTED_MODULE_7__.Pair.canCollide(collider, other)) {\n const pair = new _Pair__WEBPACK_IMPORTED_MODULE_7__.Pair(collider, other);\n this._pairs.add(pair.id);\n this._collisionPairCache.push(pair);\n }\n // Always return false, to query whole tree. Returning true in the query method stops searching\n return false;\n });\n }\n if (stats) {\n stats.physics.pairs = this._collisionPairCache.length;\n }\n // Check dynamic tree for fast moving objects\n // Fast moving objects are those moving at least there smallest bound per frame\n if (this._config.continuous.checkForFastBodies) {\n for (const collider of potentialColliders) {\n const body = collider.owner.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_4__.BodyComponent);\n // Skip non-active objects. Does not make sense on other collision types\n if (body.collisionType !== _CollisionType__WEBPACK_IMPORTED_MODULE_8__.CollisionType.Active) {\n continue;\n }\n // Maximum travel distance next frame\n const updateDistance = body.vel.magnitude * seconds + // velocity term\n body.acc.magnitude * 0.5 * seconds * seconds; // acc term\n // Find the minimum dimension\n const minDimension = Math.min(collider.bounds.height, collider.bounds.width);\n if (this._config.continuous.disableMinimumSpeedForFastBody || updateDistance > minDimension / 2) {\n if (stats) {\n stats.physics.fastBodies++;\n }\n // start with the oldPos because the integration for actors has already happened\n // objects resting on a surface may be slightly penetrating in the current position\n const updateVec = body.globalPos.sub(body.oldPos);\n const centerPoint = collider.center;\n const furthestPoint = collider.getFurthestPoint(body.vel);\n const origin = furthestPoint.sub(updateVec);\n const ray = new _Math_ray__WEBPACK_IMPORTED_MODULE_9__.Ray(origin, body.vel);\n // back the ray up by -2x surfaceEpsilon to account for fast moving objects starting on the surface\n ray.pos = ray.pos.add(ray.dir.scale(-2 * this._config.continuous.surfaceEpsilon));\n let minCollider;\n let minTranslate = new _Math_vector__WEBPACK_IMPORTED_MODULE_10__.Vector(Infinity, Infinity);\n this._dynamicCollisionTree.rayCastQuery(ray, updateDistance + this._config.continuous.surfaceEpsilon * 2, (other) => {\n if (!this._pairExists(collider, other) && _Pair__WEBPACK_IMPORTED_MODULE_7__.Pair.canCollide(collider, other)) {\n const hit = other.rayCast(ray, updateDistance + this._config.continuous.surfaceEpsilon * 10);\n if (hit) {\n const translate = hit.point.sub(origin);\n if (translate.magnitude < minTranslate.magnitude) {\n minTranslate = translate;\n minCollider = other;\n }\n }\n }\n return false;\n });\n if (minCollider && _Math_vector__WEBPACK_IMPORTED_MODULE_10__.Vector.isValid(minTranslate)) {\n const pair = new _Pair__WEBPACK_IMPORTED_MODULE_7__.Pair(collider, minCollider);\n if (!this._pairs.has(pair.id)) {\n this._pairs.add(pair.id);\n this._collisionPairCache.push(pair);\n }\n // move the fast moving object to the other body\n // need to push into the surface by ex.Physics.surfaceEpsilon\n const shift = centerPoint.sub(furthestPoint);\n body.globalPos = origin\n .add(shift)\n .add(minTranslate)\n .add(ray.dir.scale(10 * this._config.continuous.surfaceEpsilon)); // needed to push the shape slightly into contact\n collider.update(body.transform.get());\n if (stats) {\n stats.physics.fastBodyCollisions++;\n }\n }\n }\n }\n }\n // return cache\n return this._collisionPairCache;\n }\n /**\n * Applies narrow phase on collision pairs to find actual area intersections\n * Adds actual colliding pairs to stats' Frame data\n */\n narrowphase(pairs, stats) {\n let contacts = [];\n for (let i = 0; i < pairs.length; i++) {\n const newContacts = pairs[i].collide();\n contacts = contacts.concat(newContacts);\n if (stats && newContacts.length > 0) {\n for (const c of newContacts) {\n stats.physics.contacts.set(c.id, c);\n }\n }\n }\n if (stats) {\n stats.physics.collisions += contacts.length;\n }\n return contacts;\n }\n /**\n * Update the dynamic tree positions\n */\n update(targets) {\n let updated = 0;\n const len = targets.length;\n for (let i = 0; i < len; i++) {\n if (this._dynamicCollisionTree.updateCollider(targets[i])) {\n updated++;\n }\n }\n return updated;\n }\n debug(ex) {\n this._dynamicCollisionTree.debug(ex);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Detection/Pair.ts\":\n/*!*************************************!*\\\n !*** ./Collision/Detection/Pair.ts ***!\n \\*************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Pair: () => (/* binding */ Pair)\n/* harmony export */ });\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../BodyComponent */ \"./Collision/BodyComponent.ts\");\n\n\n/**\n * Models a potential collision between 2 colliders\n */\nclass Pair {\n constructor(colliderA, colliderB) {\n this.colliderA = colliderA;\n this.colliderB = colliderB;\n this.id = null;\n this.id = Pair.calculatePairHash(colliderA.id, colliderB.id);\n }\n /**\n * Returns whether a it is allowed for 2 colliders in a Pair to collide\n * @param colliderA\n * @param colliderB\n */\n static canCollide(colliderA, colliderB) {\n var _a, _b;\n // Prevent self collision\n if (colliderA.id === colliderB.id) {\n return false;\n }\n // Colliders with the same owner do not collide (composite colliders)\n if (colliderA.owner && colliderB.owner && colliderA.owner.id === colliderB.owner.id) {\n return false;\n }\n // if the pair has a member with zero dimension don't collide\n if (colliderA.localBounds.hasZeroDimensions() || colliderB.localBounds.hasZeroDimensions()) {\n return false;\n }\n const bodyA = (_a = colliderA === null || colliderA === void 0 ? void 0 : colliderA.owner) === null || _a === void 0 ? void 0 : _a.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_0__.BodyComponent);\n const bodyB = (_b = colliderB === null || colliderB === void 0 ? void 0 : colliderB.owner) === null || _b === void 0 ? void 0 : _b.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_0__.BodyComponent);\n // Body's needed for collision in the current state\n // TODO can we collide without a body?\n if (!bodyA || !bodyB) {\n return false;\n }\n // If both are in the same collision group short circuit\n if (!bodyA.group.canCollide(bodyB.group)) {\n return false;\n }\n // if both are fixed short circuit\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_1__.CollisionType.Fixed && bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_1__.CollisionType.Fixed) {\n return false;\n }\n // if the either is prevent collision short circuit\n if (bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_1__.CollisionType.PreventCollision || bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_1__.CollisionType.PreventCollision) {\n return false;\n }\n // if either is dead short circuit\n if (!bodyA.isActive || !bodyB.isActive) {\n return false;\n }\n return true;\n }\n /**\n * Returns whether or not it is possible for the pairs to collide\n */\n get canCollide() {\n const colliderA = this.colliderA;\n const colliderB = this.colliderB;\n return Pair.canCollide(colliderA, colliderB);\n }\n /**\n * Runs the collision intersection logic on the members of this pair\n */\n collide() {\n return this.colliderA.collide(this.colliderB);\n }\n /**\n * Check if the collider is part of the pair\n * @param collider\n */\n hasCollider(collider) {\n return collider === this.colliderA || collider === this.colliderB;\n }\n /**\n * Calculates the unique pair hash id for this collision pair (owning id)\n */\n static calculatePairHash(idA, idB) {\n if (idA.value < idB.value) {\n return `#${idA.value}+${idB.value}`;\n }\n else {\n return `#${idB.value}+${idA.value}`;\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Detection/QuadTree.ts\":\n/*!*****************************************!*\\\n !*** ./Collision/Detection/QuadTree.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ QuadTree: () => (/* binding */ QuadTree)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Color */ \"./Color.ts\");\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n\n\n/**\n * QuadTree spatial data structure. Useful for quickly retrieving all objects that might\n * be in a specific location.\n */\nclass QuadTree {\n constructor(bounds, options) {\n this.bounds = bounds;\n this.options = options;\n this._defaultOptions = {\n maxDepth: 10,\n capacity: 10,\n level: 0\n };\n this.items = [];\n this._isDivided = false;\n this.topLeft = null;\n this.topRight = null;\n this.bottomLeft = null;\n this.bottomRight = null;\n this.options = { ...this._defaultOptions, ...options };\n this.halfWidth = bounds.width / 2;\n this.halfHeight = bounds.height / 2;\n }\n /**\n * Splits the quad tree one level deeper\n */\n _split() {\n this._isDivided = true;\n const newLevelOptions = {\n maxDepth: this.options.maxDepth,\n capacity: this.options.capacity,\n level: this.options.level + 1\n };\n this.topLeft = new QuadTree(new _BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox({\n left: this.bounds.left,\n top: this.bounds.top,\n right: this.bounds.left + this.halfWidth,\n bottom: this.bounds.top + this.halfHeight\n }), newLevelOptions);\n this.topRight = new QuadTree(new _BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox({\n left: this.bounds.left + this.halfWidth,\n top: this.bounds.top,\n right: this.bounds.right,\n bottom: this.bounds.top + this.halfHeight\n }), newLevelOptions);\n this.bottomLeft = new QuadTree(new _BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox({\n left: this.bounds.left,\n top: this.bounds.top + this.halfHeight,\n right: this.bounds.left + this.halfWidth,\n bottom: this.bounds.bottom\n }), newLevelOptions);\n this.bottomRight = new QuadTree(new _BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox({\n left: this.bounds.left + this.halfWidth,\n top: this.bounds.top + this.halfHeight,\n right: this.bounds.right,\n bottom: this.bounds.bottom\n }), newLevelOptions);\n }\n _insertIntoSubNodes(item) {\n var _a, _b, _c, _d;\n if ((_a = this.topLeft) === null || _a === void 0 ? void 0 : _a.bounds.overlaps(item.bounds)) {\n this.topLeft.insert(item);\n }\n if ((_b = this.topRight) === null || _b === void 0 ? void 0 : _b.bounds.overlaps(item.bounds)) {\n this.topRight.insert(item);\n }\n if ((_c = this.bottomLeft) === null || _c === void 0 ? void 0 : _c.bounds.overlaps(item.bounds)) {\n this.bottomLeft.insert(item);\n }\n if ((_d = this.bottomRight) === null || _d === void 0 ? void 0 : _d.bounds.overlaps(item.bounds)) {\n this.bottomRight.insert(item);\n }\n }\n /**\n * Insert an item to be tracked in the QuadTree\n * @param item\n */\n insert(item) {\n // add to subnodes if it matches\n if (this._isDivided) {\n this._insertIntoSubNodes(item);\n return;\n }\n // leaf case\n this.items.push(item);\n // capacity\n if (this.items.length > this.options.capacity && this.options.level < this.options.maxDepth) {\n if (!this._isDivided) {\n this._split();\n }\n // divide this level's items into it's subnodes\n for (const item of this.items) {\n this._insertIntoSubNodes(item);\n }\n // clear this level\n this.items.length = 0;\n }\n }\n /**\n * Remove a tracked item in the QuadTree\n * @param item\n */\n remove(item) {\n var _a, _b, _c, _d;\n if (!this.bounds.overlaps(item.bounds)) {\n return;\n }\n if (!this._isDivided) {\n const index = this.items.indexOf(item);\n if (index > -1) {\n this.items.splice(index, 1);\n }\n return;\n }\n if ((_a = this.topLeft) === null || _a === void 0 ? void 0 : _a.bounds.overlaps(item.bounds)) {\n this.topLeft.remove(item);\n }\n if ((_b = this.topRight) === null || _b === void 0 ? void 0 : _b.bounds.overlaps(item.bounds)) {\n this.topRight.remove(item);\n }\n if ((_c = this.bottomLeft) === null || _c === void 0 ? void 0 : _c.bounds.overlaps(item.bounds)) {\n this.bottomLeft.remove(item);\n }\n if ((_d = this.bottomRight) === null || _d === void 0 ? void 0 : _d.bounds.overlaps(item.bounds)) {\n this.bottomRight.remove(item);\n }\n }\n /**\n * Query the structure for all objects that intersect the bounding box\n * @param boundingBox\n * @returns items\n */\n query(boundingBox) {\n let results = this.items;\n if (this._isDivided) {\n if (this.topLeft.bounds.overlaps(boundingBox)) {\n results = results.concat(this.topLeft.query(boundingBox));\n }\n if (this.topRight.bounds.overlaps(boundingBox)) {\n results = results.concat(this.topRight.query(boundingBox));\n }\n if (this.bottomLeft.bounds.overlaps(boundingBox)) {\n results = results.concat(this.bottomLeft.query(boundingBox));\n }\n if (this.bottomRight.bounds.overlaps(boundingBox)) {\n results = results.concat(this.bottomRight.query(boundingBox));\n }\n }\n results = results.filter((item, index) => {\n return results.indexOf(item) >= index;\n });\n return results;\n }\n clear() {\n this.items = [];\n this._isDivided = false;\n this.topLeft = null;\n this.topRight = null;\n this.bottomLeft = null;\n this.bottomRight = null;\n }\n getAllItems() {\n let results = this.items;\n if (this._isDivided) {\n results = results.concat(this.topLeft.getAllItems());\n results = results.concat(this.topRight.getAllItems());\n results = results.concat(this.bottomLeft.getAllItems());\n results = results.concat(this.bottomRight.getAllItems());\n }\n results = results.filter((item, index) => {\n return results.indexOf(item) >= index;\n });\n return results;\n }\n getTreeDepth() {\n if (!this._isDivided) {\n return 0;\n }\n return (1 +\n Math.max(this.topLeft.getTreeDepth(), this.topRight.getTreeDepth(), this.bottomLeft.getTreeDepth(), this.bottomRight.getTreeDepth()));\n }\n debug(ctx) {\n this.bounds.draw(ctx, _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Yellow);\n if (this._isDivided) {\n this.topLeft.bounds.draw(ctx, _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Yellow);\n this.topRight.bounds.draw(ctx, _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Yellow);\n this.bottomLeft.bounds.draw(ctx, _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Yellow);\n this.bottomRight.bounds.draw(ctx, _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Yellow);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Detection/SparseHashGrid.ts\":\n/*!***********************************************!*\\\n !*** ./Collision/Detection/SparseHashGrid.ts ***!\n \\***********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ HashGridCell: () => (/* binding */ HashGridCell),\n/* harmony export */ HashGridProxy: () => (/* binding */ HashGridProxy),\n/* harmony export */ SparseHashGrid: () => (/* binding */ SparseHashGrid)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Color */ \"./Color.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_RentalPool__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Util/RentalPool */ \"./Util/RentalPool.ts\");\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n\n\n\n\nclass HashGridProxy {\n constructor(object, gridSize) {\n this.object = object;\n this.id = -1;\n this.cells = [];\n this.hasZeroBounds = false;\n this.gridSize = gridSize;\n this.bounds = object.bounds;\n this.hasZeroBounds = this.bounds.hasZeroDimensions();\n this.leftX = Math.floor(this.bounds.left / this.gridSize);\n this.rightX = Math.floor(this.bounds.right / this.gridSize);\n this.bottomY = Math.floor(this.bounds.bottom / this.gridSize);\n this.topY = Math.floor(this.bounds.top / this.gridSize);\n }\n /**\n * Has the hashed bounds changed\n */\n hasChanged() {\n const bounds = this.object.bounds;\n const leftX = Math.floor(bounds.left / this.gridSize);\n const rightX = Math.floor(bounds.right / this.gridSize);\n const bottomY = Math.floor(bounds.bottom / this.gridSize);\n const topY = Math.floor(bounds.top / this.gridSize);\n if (this.leftX !== leftX || this.rightX !== rightX || this.bottomY !== bottomY || this.topY !== topY) {\n return true;\n }\n return false;\n }\n /**\n * Clears all collider references\n */\n clear() {\n for (const cell of this.cells) {\n const index = cell.proxies.indexOf(this);\n if (index > -1) {\n cell.proxies.splice(index, 1);\n }\n // TODO reclaim cell in pool if empty?\n }\n }\n /**\n * Update bounds of the proxy\n */\n updateBounds() {\n this.bounds = this.object.bounds;\n }\n /**\n * Updates the hashed bounds coordinates\n */\n update() {\n this.bounds = this.object.bounds;\n this.leftX = Math.floor(this.bounds.left / this.gridSize);\n this.rightX = Math.floor(this.bounds.right / this.gridSize);\n this.bottomY = Math.floor(this.bounds.bottom / this.gridSize);\n this.topY = Math.floor(this.bounds.top / this.gridSize);\n this.hasZeroBounds = this.object.bounds.hasZeroDimensions();\n }\n}\nclass HashGridCell {\n constructor() {\n this.proxies = [];\n }\n configure(x, y) {\n this.x = x;\n this.y = y;\n this.key = HashGridCell.calculateHashKey(x, y);\n }\n static calculateHashKey(x, y) {\n return `${x}+${y}`;\n }\n}\nclass SparseHashGrid {\n constructor(options) {\n this.bounds = new _BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox();\n this._hashGridCellPool = new _Util_RentalPool__WEBPACK_IMPORTED_MODULE_1__.RentalPool(() => new HashGridCell(), (instance) => {\n instance.configure(0, 0);\n instance.proxies.length = 0;\n return instance;\n }, 1000);\n this.gridSize = options.size;\n this.sparseHashGrid = new Map();\n this.objectToProxy = new Map();\n if (options.proxyFactory) {\n this._buildProxy = (object) => options.proxyFactory(object, this.gridSize);\n }\n else {\n this._buildProxy = (object) => new HashGridProxy(object, this.gridSize);\n }\n // TODO dynamic grid size potentially larger than the largest collider\n // TODO Re-hash the objects if the median proves to be different\n }\n query(boundsOrPoint) {\n const results = new Set();\n if (boundsOrPoint instanceof _BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox) {\n const bounds = boundsOrPoint;\n const leftX = Math.floor(bounds.left / this.gridSize);\n const rightX = Math.floor(bounds.right / this.gridSize);\n const bottomY = Math.floor(bounds.bottom / this.gridSize);\n const topY = Math.floor(bounds.top / this.gridSize);\n for (let x = leftX; x <= rightX; x++) {\n for (let y = topY; y <= bottomY; y++) {\n const key = HashGridCell.calculateHashKey(x, y);\n // Hash bounds into appropriate cell\n const cell = this.sparseHashGrid.get(key);\n if (cell) {\n for (let i = 0; i < cell.proxies.length; i++) {\n cell.proxies[i].updateBounds();\n if (cell.proxies[i].bounds.intersect(bounds)) {\n results.add(cell.proxies[i].object);\n }\n }\n }\n }\n }\n }\n else {\n const point = boundsOrPoint;\n const key = HashGridCell.calculateHashKey(Math.floor(point.x / this.gridSize), Math.floor(point.y / this.gridSize));\n // Hash points into appropriate cell\n const cell = this.sparseHashGrid.get(key);\n if (cell) {\n for (let i = 0; i < cell.proxies.length; i++) {\n cell.proxies[i].updateBounds();\n if (cell.proxies[i].bounds.contains(point)) {\n results.add(cell.proxies[i].object);\n }\n }\n }\n }\n return Array.from(results);\n }\n get(xCoord, yCoord) {\n const key = HashGridCell.calculateHashKey(xCoord, yCoord);\n const cell = this.sparseHashGrid.get(key);\n return cell;\n }\n _insert(x, y, proxy) {\n const key = HashGridCell.calculateHashKey(x, y);\n // Hash collider into appropriate cell\n let cell = this.sparseHashGrid.get(key);\n if (!cell) {\n cell = this._hashGridCellPool.rent();\n cell.configure(x, y);\n this.sparseHashGrid.set(cell.key, cell);\n }\n cell.proxies.push(proxy);\n proxy.cells.push(cell); // TODO dupes, doesn't seem to be a problem\n this.bounds.combine(proxy.bounds, this.bounds);\n }\n _remove(x, y, proxy) {\n const key = HashGridCell.calculateHashKey(x, y);\n // Hash collider into appropriate cell\n const cell = this.sparseHashGrid.get(key);\n if (cell) {\n const proxyIndex = cell.proxies.indexOf(proxy);\n if (proxyIndex > -1) {\n cell.proxies.splice(proxyIndex, 1);\n }\n const cellIndex = proxy.cells.indexOf(cell);\n if (cellIndex > -1) {\n proxy.cells.splice(cellIndex, 1);\n }\n if (cell.proxies.length === 0) {\n this._hashGridCellPool.return(cell);\n this.sparseHashGrid.delete(key);\n }\n }\n }\n track(target) {\n const proxy = this._buildProxy(target);\n this.objectToProxy.set(target, proxy);\n for (let x = proxy.leftX; x <= proxy.rightX; x++) {\n for (let y = proxy.topY; y <= proxy.bottomY; y++) {\n this._insert(x, y, proxy);\n }\n }\n }\n untrack(target) {\n const proxy = this.objectToProxy.get(target);\n if (proxy) {\n proxy.clear();\n this.objectToProxy.delete(target);\n }\n }\n update(targets) {\n let updated = 0;\n // FIXME resetting bounds is wrong, if nothing has updated then\n // the bounds stay 0\n // this.bounds.reset();\n for (const target of targets) {\n const proxy = this.objectToProxy.get(target);\n if (!proxy) {\n continue;\n }\n if (proxy.hasChanged()) {\n // TODO slightly wasteful only remove from changed\n for (let x = proxy.leftX; x <= proxy.rightX; x++) {\n for (let y = proxy.topY; y <= proxy.bottomY; y++) {\n this._remove(x, y, proxy);\n }\n }\n proxy.update();\n // TODO slightly wasteful only add new\n for (let x = proxy.leftX; x <= proxy.rightX; x++) {\n for (let y = proxy.topY; y <= proxy.bottomY; y++) {\n this._insert(x, y, proxy);\n }\n }\n updated++;\n }\n }\n return updated;\n }\n debug(ex, elapsed) {\n const transparent = _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Transparent;\n const color = _Color__WEBPACK_IMPORTED_MODULE_2__.Color.White;\n for (const cell of this.sparseHashGrid.values()) {\n ex.drawRectangle((0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(cell.x * this.gridSize, cell.y * this.gridSize), this.gridSize, this.gridSize, transparent, color, 2);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Detection/SparseHashGridCollisionProcessor.ts\":\n/*!*****************************************************************!*\\\n !*** ./Collision/Detection/SparseHashGridCollisionProcessor.ts ***!\n \\*****************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ HashColliderProxy: () => (/* binding */ HashColliderProxy),\n/* harmony export */ SparseHashGridCollisionProcessor: () => (/* binding */ SparseHashGridCollisionProcessor)\n/* harmony export */ });\n/* harmony import */ var _Id__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Id */ \"./Id.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_Pool__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Util/Pool */ \"./Util/Pool.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Colliders/CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Group/CollisionGroup */ \"./Collision/Group/CollisionGroup.ts\");\n/* harmony import */ var _Pair__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Pair */ \"./Collision/Detection/Pair.ts\");\n/* harmony import */ var _SparseHashGrid__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./SparseHashGrid */ \"./Collision/Detection/SparseHashGrid.ts\");\n\n\n\n\n\n\n\n\n\n/**\n * Proxy type to stash collision info\n */\nclass HashColliderProxy extends _SparseHashGrid__WEBPACK_IMPORTED_MODULE_0__.HashGridProxy {\n constructor(collider, gridSize) {\n var _a, _b;\n super(collider, gridSize);\n this.collider = collider;\n this.id = -1;\n this.hasZeroBounds = false;\n /**\n * References to the hash cell the collider is a current member of\n */\n this.cells = [];\n this.gridSize = gridSize;\n const bounds = collider.bounds;\n this.hasZeroBounds = bounds.hasZeroDimensions();\n this.leftX = Math.floor(bounds.left / this.gridSize);\n this.rightX = Math.floor(bounds.right / this.gridSize);\n this.bottomY = Math.floor(bounds.bottom / this.gridSize);\n this.topY = Math.floor(bounds.top / this.gridSize);\n this.owner = collider.owner;\n this.body = (_a = this.owner) === null || _a === void 0 ? void 0 : _a.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_1__.BodyComponent);\n this.collisionType = (_b = this.body.collisionType) !== null && _b !== void 0 ? _b : _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.PreventCollision;\n }\n /**\n * Updates the hashed bounds coordinates\n */\n update() {\n var _a, _b;\n super.update();\n this.body = (_a = this.owner) === null || _a === void 0 ? void 0 : _a.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_1__.BodyComponent);\n this.collisionType = (_b = this.body.collisionType) !== null && _b !== void 0 ? _b : _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.PreventCollision;\n this.hasZeroBounds = this.collider.localBounds.hasZeroDimensions();\n }\n}\n/**\n * This collision processor uses a sparsely populated grid of uniform cells to bucket potential\n * colliders together for the purpose of detecting collision pairs and collisions.\n */\nclass SparseHashGridCollisionProcessor {\n constructor(options) {\n this._pairs = new Set();\n this._nonPairs = new Set();\n this._pairPool = new _Util_Pool__WEBPACK_IMPORTED_MODULE_3__.Pool(() => new _Pair__WEBPACK_IMPORTED_MODULE_4__.Pair({ id: (0,_Id__WEBPACK_IMPORTED_MODULE_5__.createId)('collider', 0) }, { id: (0,_Id__WEBPACK_IMPORTED_MODULE_5__.createId)('collider', 0) }), (instance) => {\n instance.colliderA = null;\n instance.colliderB = null;\n return instance;\n }, 200);\n this.gridSize = options.size;\n this.hashGrid = new _SparseHashGrid__WEBPACK_IMPORTED_MODULE_0__.SparseHashGrid({\n size: this.gridSize,\n proxyFactory: (collider, size) => new HashColliderProxy(collider, size)\n });\n this._pairPool.disableWarnings = true;\n // TODO dynamic grid size potentially larger than the largest collider\n // TODO Re-hash the objects if the median proves to be different\n }\n getColliders() {\n return Array.from(this.hashGrid.objectToProxy.keys());\n }\n query(boundsOrPoint) {\n // FIXME workaround TS: https://github.com/microsoft/TypeScript/issues/14107\n return this.hashGrid.query(boundsOrPoint);\n }\n rayCast(ray, options) {\n var _a, _b, _c;\n // DDA raycast algo\n const results = [];\n const maxDistance = (_a = options === null || options === void 0 ? void 0 : options.maxDistance) !== null && _a !== void 0 ? _a : Infinity;\n const collisionGroup = options === null || options === void 0 ? void 0 : options.collisionGroup;\n const collisionMask = !collisionGroup ? (_b = options === null || options === void 0 ? void 0 : options.collisionMask) !== null && _b !== void 0 ? _b : _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_6__.CollisionGroup.All.category : collisionGroup.category;\n const searchAllColliders = (_c = options === null || options === void 0 ? void 0 : options.searchAllColliders) !== null && _c !== void 0 ? _c : false;\n const unitRay = ray.dir.normalize();\n const dydx = unitRay.y / unitRay.x;\n const dxdy = unitRay.x / unitRay.y;\n const unitStepX = Math.sqrt(1 + dydx * dydx) * this.gridSize;\n const unitStepY = Math.sqrt(1 + dxdy * dxdy) * this.gridSize;\n const startXCoord = ray.pos.x / this.gridSize;\n const startYCoord = ray.pos.y / this.gridSize;\n const stepDir = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_7__.vec)(1, 1);\n let currentXCoord = ~~startXCoord;\n let currentYCoord = ~~startYCoord;\n let currentRayLengthX = 0;\n let currentRayLengthY = 0;\n if (unitRay.x < 0) {\n stepDir.x = -1;\n currentRayLengthX = (startXCoord - currentXCoord) * unitStepX;\n }\n else {\n stepDir.x = 1;\n currentRayLengthX = (currentXCoord + 1 - startXCoord) * unitStepX;\n }\n if (unitRay.y < 0) {\n stepDir.y = -1;\n currentRayLengthY = (startYCoord - currentYCoord) * unitStepY;\n }\n else {\n stepDir.y = 1;\n currentRayLengthY = (currentYCoord + 1 - startYCoord) * unitStepY;\n }\n const collidersVisited = new Set();\n let done = false;\n let maxIterations = 9999;\n while (!done && maxIterations > 0) {\n maxIterations--; // safety exit\n // exit if exhausted max hash grid coordinate, bounds of the sparse grid\n if (!this.hashGrid.bounds.contains((0,_Math_vector__WEBPACK_IMPORTED_MODULE_7__.vec)(currentXCoord * this.gridSize, currentYCoord * this.gridSize))) {\n break;\n }\n // Test colliders at cell\n const key = _SparseHashGrid__WEBPACK_IMPORTED_MODULE_0__.HashGridCell.calculateHashKey(currentXCoord, currentYCoord);\n const cell = this.hashGrid.sparseHashGrid.get(key);\n if (cell) {\n const cellHits = [];\n for (let colliderIndex = 0; colliderIndex < cell.proxies.length; colliderIndex++) {\n const collider = cell.proxies[colliderIndex];\n if (!collidersVisited.has(collider.collider.id.value)) {\n collidersVisited.add(collider.collider.id.value);\n if ((options === null || options === void 0 ? void 0 : options.ignoreCollisionGroupAll) && collider.body.group === _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_6__.CollisionGroup.All) {\n continue;\n }\n const canCollide = (collisionMask & collider.body.group.category) !== 0;\n // Early exit if not the right group\n if (collider.body.group && !canCollide) {\n continue;\n }\n const hit = collider.collider.rayCast(ray, maxDistance);\n // Collect up all the colliders that hit inside a cell\n // they can be in any order so we need to sort them next\n if (hit) {\n cellHits.push(hit);\n }\n }\n }\n cellHits.sort((hit1, hit2) => hit1.distance - hit2.distance);\n for (let i = 0; i < cellHits.length; i++) {\n const hit = cellHits[i];\n if (options === null || options === void 0 ? void 0 : options.filter) {\n if (options.filter(hit)) {\n results.push(hit);\n if (!searchAllColliders) {\n done = true;\n break;\n }\n }\n }\n else {\n results.push(hit);\n if (!searchAllColliders) {\n done = true;\n break;\n }\n }\n }\n }\n if (currentRayLengthX < currentRayLengthY) {\n currentXCoord += stepDir.x;\n currentRayLengthX += unitStepX;\n }\n else {\n currentYCoord += stepDir.y;\n currentRayLengthY += unitStepY;\n }\n }\n // Sort by distance\n results.sort((hit1, hit2) => hit1.distance - hit2.distance);\n if (!searchAllColliders && results.length) {\n return [results[0]];\n }\n return results;\n }\n /**\n * Adds the collider to the internal data structure for collision tracking\n * @param target\n */\n track(target) {\n let colliders = [target];\n if (target instanceof _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_8__.CompositeCollider) {\n const compColliders = target.getColliders();\n for (const c of compColliders) {\n c.owner = target.owner;\n }\n colliders = compColliders;\n }\n for (const target of colliders) {\n this.hashGrid.track(target);\n }\n }\n /**\n * Removes a collider from the internal data structure for tracking collisions\n * @param target\n */\n untrack(target) {\n let colliders = [target];\n if (target instanceof _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_8__.CompositeCollider) {\n colliders = target.getColliders();\n }\n for (const target of colliders) {\n this.hashGrid.untrack(target);\n }\n }\n _canCollide(colliderA, colliderB) {\n // Prevent self collision\n if (colliderA.collider.id === colliderB.collider.id) {\n return false;\n }\n // Colliders with the same owner do not collide (composite colliders)\n if (colliderA.owner && colliderB.owner && colliderA.owner.id === colliderB.owner.id) {\n return false;\n }\n // if the pair has a member with zero dimension don't collide\n if (colliderA.hasZeroBounds || colliderB.hasZeroBounds) {\n return false;\n }\n // If both are in the same collision group short circuit\n if (!colliderA.body.group.canCollide(colliderB.body.group)) {\n return false;\n }\n // if both are fixed short circuit\n if (colliderA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.Fixed && colliderB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.Fixed) {\n return false;\n }\n // if the either is prevent collision short circuit\n if (colliderA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.PreventCollision || colliderB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.PreventCollision) {\n return false;\n }\n // if either is dead short circuit\n if (!colliderA.owner.isActive || !colliderB.owner.isActive) {\n return false;\n }\n return true;\n }\n /**\n * Runs the broadphase sweep over tracked colliders and returns possible collision pairs\n * @param targets\n * @param elapsed\n */\n broadphase(targets, elapsed) {\n const pairs = [];\n this._pairs.clear();\n this._nonPairs.clear();\n let proxyId = 0;\n for (const proxy of this.hashGrid.objectToProxy.values()) {\n proxy.id = proxyId++; // track proxies we've already processed\n if (!proxy.owner.isActive || proxy.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.PreventCollision) {\n continue;\n }\n // for every cell proxy collider is member of\n for (let cellIndex = 0; cellIndex < proxy.cells.length; cellIndex++) {\n const cell = proxy.cells[cellIndex];\n // TODO Can we skip any cells or make this iteration faster?\n // maybe a linked list here\n for (let otherIndex = 0; otherIndex < cell.proxies.length; otherIndex++) {\n const other = cell.proxies[otherIndex];\n if (other.id === proxy.id) {\n // skip duplicates\n continue;\n }\n const id = _Pair__WEBPACK_IMPORTED_MODULE_4__.Pair.calculatePairHash(proxy.collider.id, other.collider.id);\n if (this._nonPairs.has(id)) {\n continue; // Is there a way we can re-use the non-pair cache\n }\n if (!this._pairs.has(id) && this._canCollide(proxy, other) && proxy.object.bounds.overlaps(other.object.bounds)) {\n const pair = this._pairPool.get();\n pair.colliderA = proxy.collider;\n pair.colliderB = other.collider;\n pair.id = id;\n this._pairs.add(id);\n pairs.push(pair);\n }\n else {\n this._nonPairs.add(id);\n }\n }\n }\n }\n return pairs;\n }\n /**\n * Runs a fine grain pass on collision pairs and does geometry intersection tests producing any contacts\n * @param pairs\n * @param stats\n */\n narrowphase(pairs, stats) {\n const contacts = [];\n for (let i = 0; i < pairs.length; i++) {\n const newContacts = pairs[i].collide();\n for (let j = 0; j < newContacts.length; j++) {\n const c = newContacts[j];\n contacts.push(c);\n if (stats) {\n stats.physics.contacts.set(c.id, c);\n }\n }\n }\n this._pairPool.done();\n if (stats) {\n stats.physics.collisions += contacts.length;\n }\n return contacts; // TODO maybe we can re-use contacts as likely pairs next frame\n }\n /**\n * Perform data structure maintenance, returns number of colliders updated\n */\n update(targets, elapsed) {\n return this.hashGrid.update(targets);\n }\n /**\n * Draws the internal data structure\n * @param ex\n * @param elapsed\n */\n debug(ex, elapsed) {\n this.hashGrid.debug(ex, elapsed);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Detection/SpatialPartitionStrategy.ts\":\n/*!*********************************************************!*\\\n !*** ./Collision/Detection/SpatialPartitionStrategy.ts ***!\n \\*********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SpatialPartitionStrategy: () => (/* binding */ SpatialPartitionStrategy)\n/* harmony export */ });\n/**\n * Possible collision resolution strategies\n *\n * The default is {@apilink SolverStrategy.Arcade} which performs simple axis aligned arcade style physics. This is useful for things\n * like platformers or top down games.\n *\n * More advanced rigid body physics are enabled by setting {@apilink SolverStrategy.Realistic} which allows for complicated\n * simulated physical interactions.\n */\nvar SpatialPartitionStrategy;\n(function (SpatialPartitionStrategy) {\n SpatialPartitionStrategy[\"DynamicTree\"] = \"dynamic-tree\";\n SpatialPartitionStrategy[\"SparseHashGrid\"] = \"sparse-hash-grid\";\n})(SpatialPartitionStrategy || (SpatialPartitionStrategy = {}));\n\n\n/***/ }),\n\n/***/ \"./Collision/Group/CollisionGroup.ts\":\n/*!*******************************************!*\\\n !*** ./Collision/Group/CollisionGroup.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CollisionGroup: () => (/* binding */ CollisionGroup)\n/* harmony export */ });\n/* harmony import */ var _CollisionGroupManager__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./CollisionGroupManager */ \"./Collision/Group/CollisionGroupManager.ts\");\n\n/**\n * CollisionGroups indicate like members that do not collide with each other. Use {@apilink CollisionGroupManager} to create {@apilink CollisionGroup}s\n *\n * For example:\n *\n * Players have collision group \"player\"\n *\n * ![Player Collision Group](/assets/images/docs/CollisionGroupsPlayer.png)\n *\n * Enemies have collision group \"enemy\"\n *\n * ![Enemy Collision Group](/assets/images/docs/CollisionGroupsEnemy.png)\n *\n * Blocks have collision group \"ground\"\n *\n * ![Ground collision group](/assets/images/docs/CollisionGroupsGround.png)\n *\n * Players don't collide with each other, but enemies and blocks. Likewise, enemies don't collide with each other but collide\n * with players and blocks.\n *\n * This is done with bitmasking, see the following pseudo-code\n *\n * PlayerGroup = `0b001`\n * PlayerGroupMask = `0b110`\n *\n * EnemyGroup = `0b010`\n * EnemyGroupMask = `0b101`\n *\n * BlockGroup = `0b100`\n * BlockGroupMask = `0b011`\n *\n * Should Players collide? No because the bitwise mask evaluates to 0\n * `(player1.group & player2.mask) === 0`\n * `(0b001 & 0b110) === 0`\n *\n * Should Players and Enemies collide? Yes because the bitwise mask is non-zero\n * `(player1.group & enemy1.mask) === 1`\n * `(0b001 & 0b101) === 1`\n *\n * Should Players and Blocks collide? Yes because the bitwise mask is non-zero\n * `(player1.group & blocks1.mask) === 1`\n * `(0b001 & 0b011) === 1`\n */\nclass CollisionGroup {\n /**\n * STOP!!** It is preferred that {@apilink CollisionGroupManager.create} is used to create collision groups\n * unless you know how to construct the proper bitmasks. See https://github.com/excaliburjs/Excalibur/issues/1091 for more info.\n * @param name Name of the collision group\n * @param category 32 bit category for the group, should be a unique power of 2. For example `0b001` or `0b010`\n * @param mask 32 bit mask of category, or `~category` generally. For a category of `0b001`, the mask would be `0b110`\n */\n constructor(name, category, mask) {\n this._name = name;\n this._category = category;\n this._mask = mask;\n }\n /**\n * Get the name of the collision group\n */\n get name() {\n return this._name;\n }\n /**\n * Get the category of the collision group, a 32 bit number which should be a unique power of 2\n */\n get category() {\n return this._category;\n }\n /**\n * Get the mask for this collision group\n */\n get mask() {\n return this._mask;\n }\n /**\n * Evaluates whether 2 collision groups can collide\n *\n * This means the mask has the same bit set the other category and vice versa\n * @param other CollisionGroup\n */\n canCollide(other) {\n const overlap1 = this.category & other.mask;\n const overlap2 = this.mask & other.category;\n return overlap1 !== 0 && overlap2 !== 0;\n }\n /**\n * Inverts the collision group. For example, if before the group specified \"players\",\n * inverting would specify all groups except players\n * @returns CollisionGroup\n */\n invert() {\n const group = _CollisionGroupManager__WEBPACK_IMPORTED_MODULE_0__.CollisionGroupManager.create('~(' + this.name + ')', ~this.mask | 0);\n group._category = ~this.category;\n return group;\n }\n /**\n * Combine collision groups with each other. The new group includes all of the previous groups.\n * @param collisionGroups\n */\n static combine(collisionGroups) {\n const combinedName = collisionGroups.map((c) => c.name).join('+');\n const combinedCategory = collisionGroups.reduce((current, g) => g.category | current, 0b0);\n const combinedMask = ~combinedCategory;\n return _CollisionGroupManager__WEBPACK_IMPORTED_MODULE_0__.CollisionGroupManager.create(combinedName, combinedMask);\n }\n /**\n * Creates a collision group that collides with the listed groups\n * @param collisionGroups\n */\n static collidesWith(collisionGroups) {\n const combinedName = `collidesWith(${collisionGroups.map((c) => c.name).join('+')})`;\n const combinedMask = collisionGroups.reduce((current, g) => g.category | current, 0b0);\n return _CollisionGroupManager__WEBPACK_IMPORTED_MODULE_0__.CollisionGroupManager.create(combinedName, combinedMask);\n }\n toString() {\n return `\r\ncategory: ${this.category.toString(2).padStart(32, '0')}\r\nmask: ${(this.mask >>> 0).toString(2).padStart(32, '0')}\r\n `;\n }\n}\n/**\n * The `All` {@apilink CollisionGroup} is a special group that collides with all other groups including itself,\n * it is the default collision group on colliders.\n */\nCollisionGroup.All = new CollisionGroup('Collide with all groups', -1, -1);\n\n\n/***/ }),\n\n/***/ \"./Collision/Group/CollisionGroupManager.ts\":\n/*!**************************************************!*\\\n !*** ./Collision/Group/CollisionGroupManager.ts ***!\n \\**************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CollisionGroupManager: () => (/* binding */ CollisionGroupManager)\n/* harmony export */ });\n/* harmony import */ var _CollisionGroup__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./CollisionGroup */ \"./Collision/Group/CollisionGroup.ts\");\n\n/**\n * Static class for managing collision groups in excalibur, there is a maximum of 32 collision groups possible in excalibur\n */\nclass CollisionGroupManager {\n /**\n * Create a new named collision group up to a max of 32.\n * @param name Name for the collision group\n * @param mask Optionally provide your own 32-bit mask, if none is provide the manager will generate one\n */\n static create(name, mask) {\n if (this._CURRENT_GROUP > this._MAX_GROUPS) {\n throw new Error(`Cannot have more than ${this._MAX_GROUPS} collision groups`);\n }\n if (this._GROUPS.get(name)) {\n const existingGroup = this._GROUPS.get(name);\n if (existingGroup.mask === mask) {\n return existingGroup;\n }\n throw new Error(`Collision group ${name} already exists with a different mask!`);\n }\n const group = new _CollisionGroup__WEBPACK_IMPORTED_MODULE_0__.CollisionGroup(name, this._CURRENT_BIT, mask !== undefined ? mask : ~this._CURRENT_BIT);\n this._CURRENT_BIT = (this._CURRENT_BIT << 1) | 0;\n this._CURRENT_GROUP++;\n this._GROUPS.set(name, group);\n return group;\n }\n /**\n * Get all collision groups currently tracked by excalibur\n */\n static get groups() {\n return Array.from(this._GROUPS.values());\n }\n /**\n * Get a collision group by it's name\n * @param name\n */\n static groupByName(name) {\n return this._GROUPS.get(name);\n }\n /**\n * Resets the managers internal group management state\n */\n static reset() {\n this._GROUPS = new Map();\n this._CURRENT_BIT = this._STARTING_BIT;\n this._CURRENT_GROUP = 1;\n }\n}\n// using bitmasking the maximum number of groups is 32, because that is the highest 32bit integer that JS can present.\nCollisionGroupManager._STARTING_BIT = 0b1 | 0;\nCollisionGroupManager._MAX_GROUPS = 32;\nCollisionGroupManager._CURRENT_GROUP = 1;\nCollisionGroupManager._CURRENT_BIT = CollisionGroupManager._STARTING_BIT;\nCollisionGroupManager._GROUPS = new Map();\n\n\n/***/ }),\n\n/***/ \"./Collision/Index.ts\":\n/*!****************************!*\\\n !*** ./Collision/Index.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ArcadeSolver: () => (/* reexport safe */ _Solver_ArcadeSolver__WEBPACK_IMPORTED_MODULE_24__.ArcadeSolver),\n/* harmony export */ BodyComponent: () => (/* reexport safe */ _BodyComponent__WEBPACK_IMPORTED_MODULE_0__.BodyComponent),\n/* harmony export */ BoundingBox: () => (/* reexport safe */ _BoundingBox__WEBPACK_IMPORTED_MODULE_5__.BoundingBox),\n/* harmony export */ CircleCollider: () => (/* reexport safe */ _Colliders_CircleCollider__WEBPACK_IMPORTED_MODULE_8__.CircleCollider),\n/* harmony export */ ClosestLineJumpTable: () => (/* reexport safe */ _Colliders_ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_12__.ClosestLineJumpTable),\n/* harmony export */ Collider: () => (/* reexport safe */ _Colliders_Collider__WEBPACK_IMPORTED_MODULE_4__.Collider),\n/* harmony export */ ColliderComponent: () => (/* reexport safe */ _ColliderComponent__WEBPACK_IMPORTED_MODULE_1__.ColliderComponent),\n/* harmony export */ CollisionContact: () => (/* reexport safe */ _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_17__.CollisionContact),\n/* harmony export */ CollisionGroup: () => (/* reexport safe */ _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_14__.CollisionGroup),\n/* harmony export */ CollisionGroupManager: () => (/* reexport safe */ _Group_CollisionGroupManager__WEBPACK_IMPORTED_MODULE_15__.CollisionGroupManager),\n/* harmony export */ CollisionJumpTable: () => (/* reexport safe */ _Colliders_CollisionJumpTable__WEBPACK_IMPORTED_MODULE_11__.CollisionJumpTable),\n/* harmony export */ CollisionSystem: () => (/* reexport safe */ _CollisionSystem__WEBPACK_IMPORTED_MODULE_28__.CollisionSystem),\n/* harmony export */ CollisionType: () => (/* reexport safe */ _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType),\n/* harmony export */ CompositeCollider: () => (/* reexport safe */ _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_7__.CompositeCollider),\n/* harmony export */ ContactConstraintPoint: () => (/* reexport safe */ _Solver_ContactConstraintPoint__WEBPACK_IMPORTED_MODULE_26__.ContactConstraintPoint),\n/* harmony export */ ContactSolveBias: () => (/* reexport safe */ _Solver_ContactBias__WEBPACK_IMPORTED_MODULE_25__.ContactSolveBias),\n/* harmony export */ DegreeOfFreedom: () => (/* reexport safe */ _BodyComponent__WEBPACK_IMPORTED_MODULE_0__.DegreeOfFreedom),\n/* harmony export */ DynamicTree: () => (/* reexport safe */ _Detection_DynamicTree__WEBPACK_IMPORTED_MODULE_18__.DynamicTree),\n/* harmony export */ DynamicTreeCollisionProcessor: () => (/* reexport safe */ _Detection_DynamicTreeCollisionProcessor__WEBPACK_IMPORTED_MODULE_19__.DynamicTreeCollisionProcessor),\n/* harmony export */ EdgeCollider: () => (/* reexport safe */ _Colliders_EdgeCollider__WEBPACK_IMPORTED_MODULE_9__.EdgeCollider),\n/* harmony export */ HashColliderProxy: () => (/* reexport safe */ _Detection_SparseHashGridCollisionProcessor__WEBPACK_IMPORTED_MODULE_20__.HashColliderProxy),\n/* harmony export */ HashGridCell: () => (/* reexport safe */ _Detection_SparseHashGrid__WEBPACK_IMPORTED_MODULE_21__.HashGridCell),\n/* harmony export */ HashGridProxy: () => (/* reexport safe */ _Detection_SparseHashGrid__WEBPACK_IMPORTED_MODULE_21__.HashGridProxy),\n/* harmony export */ HorizontalFirst: () => (/* reexport safe */ _Solver_ContactBias__WEBPACK_IMPORTED_MODULE_25__.HorizontalFirst),\n/* harmony export */ MotionSystem: () => (/* reexport safe */ _MotionSystem__WEBPACK_IMPORTED_MODULE_29__.MotionSystem),\n/* harmony export */ None: () => (/* reexport safe */ _Solver_ContactBias__WEBPACK_IMPORTED_MODULE_25__.None),\n/* harmony export */ Pair: () => (/* reexport safe */ _Detection_Pair__WEBPACK_IMPORTED_MODULE_16__.Pair),\n/* harmony export */ PhysicsWorld: () => (/* reexport safe */ _PhysicsWorld__WEBPACK_IMPORTED_MODULE_30__.PhysicsWorld),\n/* harmony export */ PolygonCollider: () => (/* reexport safe */ _Colliders_PolygonCollider__WEBPACK_IMPORTED_MODULE_10__.PolygonCollider),\n/* harmony export */ QuadTree: () => (/* reexport safe */ _Detection_QuadTree__WEBPACK_IMPORTED_MODULE_23__.QuadTree),\n/* harmony export */ RealisticSolver: () => (/* reexport safe */ _Solver_RealisticSolver__WEBPACK_IMPORTED_MODULE_27__.RealisticSolver),\n/* harmony export */ SeparatingAxis: () => (/* reexport safe */ _Colliders_SeparatingAxis__WEBPACK_IMPORTED_MODULE_13__.SeparatingAxis),\n/* harmony export */ SeparationInfo: () => (/* reexport safe */ _Colliders_SeparatingAxis__WEBPACK_IMPORTED_MODULE_13__.SeparationInfo),\n/* harmony export */ Shape: () => (/* reexport safe */ _Colliders_Shape__WEBPACK_IMPORTED_MODULE_6__.Shape),\n/* harmony export */ Side: () => (/* reexport safe */ _Side__WEBPACK_IMPORTED_MODULE_32__.Side),\n/* harmony export */ SolverStrategy: () => (/* reexport safe */ _SolverStrategy__WEBPACK_IMPORTED_MODULE_3__.SolverStrategy),\n/* harmony export */ SparseHashGrid: () => (/* reexport safe */ _Detection_SparseHashGrid__WEBPACK_IMPORTED_MODULE_21__.SparseHashGrid),\n/* harmony export */ SparseHashGridCollisionProcessor: () => (/* reexport safe */ _Detection_SparseHashGridCollisionProcessor__WEBPACK_IMPORTED_MODULE_20__.SparseHashGridCollisionProcessor),\n/* harmony export */ SpatialPartitionStrategy: () => (/* reexport safe */ _Detection_SpatialPartitionStrategy__WEBPACK_IMPORTED_MODULE_22__.SpatialPartitionStrategy),\n/* harmony export */ TreeNode: () => (/* reexport safe */ _Detection_DynamicTree__WEBPACK_IMPORTED_MODULE_18__.TreeNode),\n/* harmony export */ VerticalFirst: () => (/* reexport safe */ _Solver_ContactBias__WEBPACK_IMPORTED_MODULE_25__.VerticalFirst),\n/* harmony export */ getDefaultPhysicsConfig: () => (/* reexport safe */ _PhysicsConfig__WEBPACK_IMPORTED_MODULE_31__.getDefaultPhysicsConfig)\n/* harmony export */ });\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _ColliderComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ColliderComponent */ \"./Collision/ColliderComponent.ts\");\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _SolverStrategy__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./SolverStrategy */ \"./Collision/SolverStrategy.ts\");\n/* harmony import */ var _Colliders_Collider__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Colliders/Collider */ \"./Collision/Colliders/Collider.ts\");\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Colliders_Shape__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Colliders/Shape */ \"./Collision/Colliders/Shape.ts\");\n/* harmony import */ var _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Colliders/CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var _Colliders_CircleCollider__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Colliders/CircleCollider */ \"./Collision/Colliders/CircleCollider.ts\");\n/* harmony import */ var _Colliders_EdgeCollider__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Colliders/EdgeCollider */ \"./Collision/Colliders/EdgeCollider.ts\");\n/* harmony import */ var _Colliders_PolygonCollider__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Colliders/PolygonCollider */ \"./Collision/Colliders/PolygonCollider.ts\");\n/* harmony import */ var _Colliders_CollisionJumpTable__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Colliders/CollisionJumpTable */ \"./Collision/Colliders/CollisionJumpTable.ts\");\n/* harmony import */ var _Colliders_ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Colliders/ClosestLineJumpTable */ \"./Collision/Colliders/ClosestLineJumpTable.ts\");\n/* harmony import */ var _Colliders_SeparatingAxis__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Colliders/SeparatingAxis */ \"./Collision/Colliders/SeparatingAxis.ts\");\n/* harmony import */ var _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Group/CollisionGroup */ \"./Collision/Group/CollisionGroup.ts\");\n/* harmony import */ var _Group_CollisionGroupManager__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Group/CollisionGroupManager */ \"./Collision/Group/CollisionGroupManager.ts\");\n/* harmony import */ var _Detection_Pair__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Detection/Pair */ \"./Collision/Detection/Pair.ts\");\n/* harmony import */ var _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./Detection/CollisionContact */ \"./Collision/Detection/CollisionContact.ts\");\n/* harmony import */ var _Detection_DynamicTree__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Detection/DynamicTree */ \"./Collision/Detection/DynamicTree.ts\");\n/* harmony import */ var _Detection_DynamicTreeCollisionProcessor__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./Detection/DynamicTreeCollisionProcessor */ \"./Collision/Detection/DynamicTreeCollisionProcessor.ts\");\n/* harmony import */ var _Detection_SparseHashGridCollisionProcessor__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./Detection/SparseHashGridCollisionProcessor */ \"./Collision/Detection/SparseHashGridCollisionProcessor.ts\");\n/* harmony import */ var _Detection_SparseHashGrid__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./Detection/SparseHashGrid */ \"./Collision/Detection/SparseHashGrid.ts\");\n/* harmony import */ var _Detection_SpatialPartitionStrategy__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./Detection/SpatialPartitionStrategy */ \"./Collision/Detection/SpatialPartitionStrategy.ts\");\n/* harmony import */ var _Detection_QuadTree__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./Detection/QuadTree */ \"./Collision/Detection/QuadTree.ts\");\n/* harmony import */ var _Solver_ArcadeSolver__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./Solver/ArcadeSolver */ \"./Collision/Solver/ArcadeSolver.ts\");\n/* harmony import */ var _Solver_ContactBias__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./Solver/ContactBias */ \"./Collision/Solver/ContactBias.ts\");\n/* harmony import */ var _Solver_ContactConstraintPoint__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./Solver/ContactConstraintPoint */ \"./Collision/Solver/ContactConstraintPoint.ts\");\n/* harmony import */ var _Solver_RealisticSolver__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./Solver/RealisticSolver */ \"./Collision/Solver/RealisticSolver.ts\");\n/* harmony import */ var _CollisionSystem__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./CollisionSystem */ \"./Collision/CollisionSystem.ts\");\n/* harmony import */ var _MotionSystem__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./MotionSystem */ \"./Collision/MotionSystem.ts\");\n/* harmony import */ var _PhysicsWorld__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./PhysicsWorld */ \"./Collision/PhysicsWorld.ts\");\n/* harmony import */ var _PhysicsConfig__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./PhysicsConfig */ \"./Collision/PhysicsConfig.ts\");\n/* harmony import */ var _Side__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./Side */ \"./Collision/Side.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Collision/Integrator.ts\":\n/*!*********************************!*\\\n !*** ./Collision/Integrator.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EulerIntegrator: () => (/* binding */ EulerIntegrator)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n\nclass EulerIntegrator {\n static integrate(transform, motion, totalAcc, elapsed) {\n const seconds = elapsed / 1000;\n // This code looks a little wild, but it's to avoid creating any new Vector instances\n // integration is done in a tight loop so this is key to avoid GC'ing\n motion.vel.addEqual(totalAcc.scale(seconds, EulerIntegrator._ACC));\n transform.pos\n .add(motion.vel.scale(seconds, EulerIntegrator._VEL), EulerIntegrator._POS)\n .addEqual(totalAcc.scale(0.5 * seconds * seconds, EulerIntegrator._VEL_ACC));\n motion.angularVelocity += motion.torque * (1.0 / motion.inertia) * seconds;\n const rotation = transform.rotation + motion.angularVelocity * seconds;\n transform.scale.add(motion.scaleFactor.scale(seconds, this._SCALE_FACTOR), EulerIntegrator._SCALE);\n const tx = transform.get();\n tx.setTransform(EulerIntegrator._POS, rotation, EulerIntegrator._SCALE);\n }\n}\n// Scratch vectors to avoid allocation\nEulerIntegrator._POS = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\nEulerIntegrator._SCALE = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(1, 1);\nEulerIntegrator._ACC = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\nEulerIntegrator._VEL = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\nEulerIntegrator._VEL_ACC = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\nEulerIntegrator._SCALE_FACTOR = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\n\n\n/***/ }),\n\n/***/ \"./Collision/MotionSystem.ts\":\n/*!***********************************!*\\\n !*** ./Collision/MotionSystem.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MotionSystem: () => (/* binding */ MotionSystem)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Priority.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Integrator__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Integrator */ \"./Collision/Integrator.ts\");\n\n\n\n\n\n\n\nclass MotionSystem extends _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.System {\n constructor(world, physics) {\n super();\n this.world = world;\n this.physics = physics;\n this.systemType = _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.SystemType.Update;\n this._physicsConfigDirty = false;\n physics.$configUpdate.subscribe(() => (this._physicsConfigDirty = true));\n this.query = this.world.query([_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent, _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent]);\n }\n update(elapsed) {\n let transform;\n let motion;\n const entities = this.query.entities;\n const substep = this.physics.config.substep;\n for (let i = 0; i < entities.length; i++) {\n transform = entities[i].get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n motion = entities[i].get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n const optionalBody = entities[i].get(_BodyComponent__WEBPACK_IMPORTED_MODULE_3__.BodyComponent);\n if (this._physicsConfigDirty && optionalBody) {\n optionalBody.updatePhysicsConfig(this.physics.config.bodies);\n }\n if (optionalBody === null || optionalBody === void 0 ? void 0 : optionalBody.isSleeping) {\n continue;\n }\n const totalAcc = motion.acc.clone();\n if ((optionalBody === null || optionalBody === void 0 ? void 0 : optionalBody.collisionType) === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Active && (optionalBody === null || optionalBody === void 0 ? void 0 : optionalBody.useGravity)) {\n totalAcc.addEqual(this.physics.config.gravity);\n }\n // capture old transform of this entity and all of its children so that\n // any transform properties that derived from their parents are properly captured\n if (!entities[i].parent) {\n this.captureOldTransformWithChildren(entities[i]);\n }\n // Update transform and motion based on Euler linear algebra\n _Integrator__WEBPACK_IMPORTED_MODULE_5__.EulerIntegrator.integrate(transform, motion, totalAcc, elapsed / substep);\n }\n this._physicsConfigDirty = false;\n }\n captureOldTransformWithChildren(entity) {\n var _a;\n (_a = entity.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_3__.BodyComponent)) === null || _a === void 0 ? void 0 : _a.captureOldTransform();\n for (let i = 0; i < entity.children.length; i++) {\n this.captureOldTransformWithChildren(entity.children[i]);\n }\n }\n}\nMotionSystem.priority = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_6__.SystemPriority.Higher;\n\n\n/***/ }),\n\n/***/ \"./Collision/PhysicsConfig.ts\":\n/*!************************************!*\\\n !*** ./Collision/PhysicsConfig.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ getDefaultPhysicsConfig: () => (/* binding */ getDefaultPhysicsConfig)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _SolverStrategy__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./SolverStrategy */ \"./Collision/SolverStrategy.ts\");\n/* harmony import */ var _Solver_ContactBias__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Solver/ContactBias */ \"./Collision/Solver/ContactBias.ts\");\n/* harmony import */ var _Detection_SpatialPartitionStrategy__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Detection/SpatialPartitionStrategy */ \"./Collision/Detection/SpatialPartitionStrategy.ts\");\n\n\n\n\nconst getDefaultPhysicsConfig = () => ({\n enabled: true,\n gravity: (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0).clone(),\n solver: _SolverStrategy__WEBPACK_IMPORTED_MODULE_1__.SolverStrategy.Arcade,\n substep: 1,\n colliders: {\n compositeStrategy: 'together'\n },\n continuous: {\n checkForFastBodies: true,\n disableMinimumSpeedForFastBody: false,\n surfaceEpsilon: 0.1\n },\n bodies: {\n canSleepByDefault: false,\n sleepEpsilon: 0.07,\n wakeThreshold: 0.07 * 3,\n sleepBias: 0.9,\n defaultMass: 10\n },\n spatialPartition: _Detection_SpatialPartitionStrategy__WEBPACK_IMPORTED_MODULE_2__.SpatialPartitionStrategy.SparseHashGrid,\n sparseHashGrid: {\n size: 100\n },\n dynamicTree: {\n boundsPadding: 5,\n velocityMultiplier: 2\n },\n arcade: {\n contactSolveBias: _Solver_ContactBias__WEBPACK_IMPORTED_MODULE_3__.ContactSolveBias.None\n },\n realistic: {\n positionIterations: 3,\n velocityIterations: 8,\n slop: 1,\n steeringFactor: 0.2,\n warmStart: true\n }\n});\n\n\n/***/ }),\n\n/***/ \"./Collision/PhysicsWorld.ts\":\n/*!***********************************!*\\\n !*** ./Collision/PhysicsWorld.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PhysicsWorld: () => (/* binding */ PhysicsWorld)\n/* harmony export */ });\n/* harmony import */ var _Util_Observable__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Util/Observable */ \"./Util/Observable.ts\");\n/* harmony import */ var _Index__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Index */ \"./Collision/Detection/SparseHashGridCollisionProcessor.ts\");\n/* harmony import */ var _Index__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Index */ \"./Collision/Detection/DynamicTreeCollisionProcessor.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Util_Watch__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Util/Watch */ \"./Util/Watch.ts\");\n/* harmony import */ var _Detection_SpatialPartitionStrategy__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Detection/SpatialPartitionStrategy */ \"./Collision/Detection/SpatialPartitionStrategy.ts\");\n\n\n\n\n\nclass PhysicsWorld {\n get config() {\n return (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_0__.watchDeep)(this._config, (change) => {\n this.$configUpdate.notifyAll(change);\n });\n }\n set config(newConfig) {\n this._config = newConfig;\n this.$configUpdate.notifyAll(newConfig);\n }\n /**\n * Spatial data structure for locating potential collision pairs and ray casts\n */\n get collisionProcessor() {\n if (this._configDirty) {\n this._configDirty = false;\n // preserve tracked colliders if config updates\n const colliders = this._collisionProcessor.getColliders();\n if (this._config.spatialPartition === _Detection_SpatialPartitionStrategy__WEBPACK_IMPORTED_MODULE_1__.SpatialPartitionStrategy.SparseHashGrid) {\n this._collisionProcessor = new _Index__WEBPACK_IMPORTED_MODULE_2__.SparseHashGridCollisionProcessor(this._config.sparseHashGrid);\n }\n else {\n this._collisionProcessor = new _Index__WEBPACK_IMPORTED_MODULE_3__.DynamicTreeCollisionProcessor(this._config);\n }\n for (const collider of colliders) {\n this._collisionProcessor.track(collider);\n }\n }\n return this._collisionProcessor;\n }\n constructor(config) {\n this.$configUpdate = new _Util_Observable__WEBPACK_IMPORTED_MODULE_4__.Observable();\n this._configDirty = false;\n this.config = config;\n this.$configUpdate.subscribe((config) => {\n this._configDirty = true;\n _BodyComponent__WEBPACK_IMPORTED_MODULE_5__.BodyComponent.updateDefaultPhysicsConfig(config.bodies);\n });\n if (this._config.spatialPartition === _Detection_SpatialPartitionStrategy__WEBPACK_IMPORTED_MODULE_1__.SpatialPartitionStrategy.SparseHashGrid) {\n this._collisionProcessor = new _Index__WEBPACK_IMPORTED_MODULE_2__.SparseHashGridCollisionProcessor(this._config.sparseHashGrid);\n }\n else {\n this._collisionProcessor = new _Index__WEBPACK_IMPORTED_MODULE_3__.DynamicTreeCollisionProcessor(this._config);\n }\n }\n /**\n * Raycast into the scene's physics world\n * @param ray\n * @param options\n */\n rayCast(ray, options) {\n return this.collisionProcessor.rayCast(ray, options);\n }\n query(pointOrBounds) {\n // FIXME workaround TS: https://github.com/microsoft/TypeScript/issues/14107\n return this._collisionProcessor.query(pointOrBounds);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Side.ts\":\n/*!***************************!*\\\n !*** ./Collision/Side.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Side: () => (/* binding */ Side)\n/* harmony export */ });\n/**\n * An enum that describes the sides of an axis aligned box for collision\n */\nvar Side;\n(function (Side) {\n Side[\"None\"] = \"None\";\n Side[\"Top\"] = \"Top\";\n Side[\"Bottom\"] = \"Bottom\";\n Side[\"Left\"] = \"Left\";\n Side[\"Right\"] = \"Right\";\n})(Side || (Side = {}));\n(function (Side) {\n /**\n * Returns the opposite side from the current\n */\n function getOpposite(side) {\n if (side === Side.Top) {\n return Side.Bottom;\n }\n if (side === Side.Bottom) {\n return Side.Top;\n }\n if (side === Side.Left) {\n return Side.Right;\n }\n if (side === Side.Right) {\n return Side.Left;\n }\n return Side.None;\n }\n Side.getOpposite = getOpposite;\n /**\n * Given a vector, return the Side most in that direction\n */\n function fromDirection(direction) {\n if (Math.abs(direction.x) >= Math.abs(direction.y)) {\n if (direction.x <= 0) {\n return Side.Left;\n }\n return Side.Right;\n }\n if (direction.y <= 0) {\n return Side.Top;\n }\n return Side.Bottom;\n }\n Side.fromDirection = fromDirection;\n})(Side || (Side = {}));\n\n\n/***/ }),\n\n/***/ \"./Collision/SolverStrategy.ts\":\n/*!*************************************!*\\\n !*** ./Collision/SolverStrategy.ts ***!\n \\*************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SolverStrategy: () => (/* binding */ SolverStrategy)\n/* harmony export */ });\n/**\n * Possible collision resolution strategies\n *\n * The default is {@apilink SolverStrategy.Arcade} which performs simple axis aligned arcade style physics. This is useful for things\n * like platformers or top down games.\n *\n * More advanced rigid body physics are enabled by setting {@apilink SolverStrategy.Realistic} which allows for complicated\n * simulated physical interactions.\n */\nvar SolverStrategy;\n(function (SolverStrategy) {\n SolverStrategy[\"Arcade\"] = \"arcade\";\n SolverStrategy[\"Realistic\"] = \"realistic\";\n})(SolverStrategy || (SolverStrategy = {}));\n\n\n/***/ }),\n\n/***/ \"./Collision/Solver/ArcadeSolver.ts\":\n/*!******************************************!*\\\n !*** ./Collision/Solver/ArcadeSolver.ts ***!\n \\******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ArcadeSolver: () => (/* binding */ ArcadeSolver)\n/* harmony export */ });\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Events */ \"./Events.ts\");\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Side__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Side */ \"./Collision/Side.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _ContactBias__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ContactBias */ \"./Collision/Solver/ContactBias.ts\");\n\n\n\n\n\n/**\n * ArcadeSolver is the default in Excalibur. It solves collisions so that there is no overlap between contacts,\n * and negates velocity along the collision normal.\n *\n * This is usually the type of collisions used for 2D games that don't need a more realistic collision simulation.\n *\n */\nclass ArcadeSolver {\n constructor(config) {\n this.config = config;\n this.directionMap = new Map();\n this.distanceMap = new Map();\n }\n solve(contacts) {\n // Events and init\n this.preSolve(contacts);\n // Remove any canceled contacts\n contacts = contacts.filter((c) => !c.isCanceled());\n // Locate collision bias order\n let bias;\n switch (this.config.contactSolveBias) {\n case _ContactBias__WEBPACK_IMPORTED_MODULE_0__.ContactSolveBias.HorizontalFirst: {\n bias = _ContactBias__WEBPACK_IMPORTED_MODULE_0__.HorizontalFirst;\n break;\n }\n case _ContactBias__WEBPACK_IMPORTED_MODULE_0__.ContactSolveBias.VerticalFirst: {\n bias = _ContactBias__WEBPACK_IMPORTED_MODULE_0__.VerticalFirst;\n break;\n }\n default: {\n bias = _ContactBias__WEBPACK_IMPORTED_MODULE_0__.None;\n }\n }\n // Sort by bias (None, VerticalFirst, HorizontalFirst) to avoid artifacts with seams\n // Sort contacts by distance to avoid artifacts with seams\n // It's important to solve in a specific order\n contacts.sort((a, b) => {\n const aDir = this.directionMap.get(a.id);\n const bDir = this.directionMap.get(b.id);\n const aDist = this.distanceMap.get(a.id);\n const bDist = this.distanceMap.get(b.id);\n return bias[aDir] - bias[bDir] || aDist - bDist;\n });\n for (const contact of contacts) {\n // Solve position first in arcade\n this.solvePosition(contact);\n // Solve velocity second in arcade\n this.solveVelocity(contact);\n }\n // Events and any contact house-keeping the solver needs\n this.postSolve(contacts);\n return contacts;\n }\n preSolve(contacts) {\n const epsilon = 0.0001;\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n if (Math.abs(contact.mtv.x) < epsilon && Math.abs(contact.mtv.y) < epsilon) {\n // Cancel near 0 mtv collisions\n contact.cancel();\n continue;\n }\n const side = _Side__WEBPACK_IMPORTED_MODULE_1__.Side.fromDirection(contact.mtv);\n const mtv = contact.mtv.negate();\n const distance = Math.abs(contact.info.separation);\n this.distanceMap.set(contact.id, distance);\n this.directionMap.set(contact.id, side === _Side__WEBPACK_IMPORTED_MODULE_1__.Side.Left || side === _Side__WEBPACK_IMPORTED_MODULE_1__.Side.Right ? 'horizontal' : 'vertical');\n // Publish collision events on both participants\n contact.colliderA.events.emit('precollision', new _Events__WEBPACK_IMPORTED_MODULE_2__.PreCollisionEvent(contact.colliderA, contact.colliderB, side, mtv, contact));\n contact.colliderB.events.emit('precollision', new _Events__WEBPACK_IMPORTED_MODULE_2__.PreCollisionEvent(contact.colliderB, contact.colliderA, _Side__WEBPACK_IMPORTED_MODULE_1__.Side.getOpposite(side), mtv.negate(), contact));\n }\n }\n postSolve(contacts) {\n var _a, _b;\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n if (contact.isCanceled()) {\n continue;\n }\n const colliderA = contact.colliderA;\n const colliderB = contact.colliderB;\n const bodyA = (_a = colliderA.owner) === null || _a === void 0 ? void 0 : _a.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_3__.BodyComponent);\n const bodyB = (_b = colliderB.owner) === null || _b === void 0 ? void 0 : _b.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_3__.BodyComponent);\n if (bodyA && bodyB) {\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Passive || bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Passive) {\n continue;\n }\n }\n const side = _Side__WEBPACK_IMPORTED_MODULE_1__.Side.fromDirection(contact.mtv);\n const mtv = contact.mtv.negate();\n // Publish collision events on both participants\n contact.colliderA.events.emit('postcollision', new _Events__WEBPACK_IMPORTED_MODULE_2__.PostCollisionEvent(contact.colliderA, contact.colliderB, side, mtv, contact));\n contact.colliderB.events.emit('postcollision', new _Events__WEBPACK_IMPORTED_MODULE_2__.PostCollisionEvent(contact.colliderB, contact.colliderA, _Side__WEBPACK_IMPORTED_MODULE_1__.Side.getOpposite(side), mtv.negate(), contact));\n }\n }\n solvePosition(contact) {\n var _a, _b;\n const epsilon = 0.0001;\n // if bounds no longer intersect skip to the next\n // this removes jitter from overlapping/stacked solid tiles or a wall of solid tiles\n if (!contact.colliderA.bounds.overlaps(contact.colliderB.bounds, epsilon)) {\n // Cancel the contact to prevent and solving\n contact.cancel();\n return;\n }\n if (Math.abs(contact.mtv.x) < epsilon && Math.abs(contact.mtv.y) < epsilon) {\n // Cancel near 0 mtv collisions\n contact.cancel();\n return;\n }\n let mtv = contact.mtv;\n const colliderA = contact.colliderA;\n const colliderB = contact.colliderB;\n const bodyA = (_a = colliderA.owner) === null || _a === void 0 ? void 0 : _a.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_3__.BodyComponent);\n const bodyB = (_b = colliderB.owner) === null || _b === void 0 ? void 0 : _b.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_3__.BodyComponent);\n if (bodyA && bodyB) {\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Passive || bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Passive) {\n return;\n }\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Active && bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Active) {\n // split overlaps if both are Active\n mtv = mtv.scale(0.5);\n }\n // Resolve overlaps\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Active) {\n bodyA.globalPos.x -= mtv.x;\n bodyA.globalPos.y -= mtv.y;\n colliderA.update(bodyA.transform.get());\n }\n if (bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Active) {\n bodyB.globalPos.x += mtv.x;\n bodyB.globalPos.y += mtv.y;\n colliderB.update(bodyB.transform.get());\n }\n }\n }\n solveVelocity(contact) {\n var _a, _b;\n if (contact.isCanceled()) {\n return;\n }\n const colliderA = contact.colliderA;\n const colliderB = contact.colliderB;\n const bodyA = (_a = colliderA.owner) === null || _a === void 0 ? void 0 : _a.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_3__.BodyComponent);\n const bodyB = (_b = colliderB.owner) === null || _b === void 0 ? void 0 : _b.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_3__.BodyComponent);\n if (bodyA && bodyB) {\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Passive || bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Passive) {\n return;\n }\n const normal = contact.normal;\n const opposite = normal.negate();\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Active) {\n // only adjust velocity if the contact normal is opposite to the current velocity\n // this avoids catching edges on a platform when sliding off\n if (bodyA.vel.normalize().dot(opposite) < 0) {\n // Cancel out velocity opposite direction of collision normal\n const velAdj = normal.scale(normal.dot(bodyA.vel.negate()));\n bodyA.vel = bodyA.vel.add(velAdj);\n }\n }\n if (bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Active) {\n // only adjust velocity if the contact normal is opposite to the current velocity\n // this avoids catching edges on a platform\n if (bodyB.vel.normalize().dot(normal) < 0) {\n const velAdj = opposite.scale(opposite.dot(bodyB.vel.negate()));\n bodyB.vel = bodyB.vel.add(velAdj);\n }\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Solver/ContactBias.ts\":\n/*!*****************************************!*\\\n !*** ./Collision/Solver/ContactBias.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ContactSolveBias: () => (/* binding */ ContactSolveBias),\n/* harmony export */ HorizontalFirst: () => (/* binding */ HorizontalFirst),\n/* harmony export */ None: () => (/* binding */ None),\n/* harmony export */ VerticalFirst: () => (/* binding */ VerticalFirst)\n/* harmony export */ });\n/**\n * Tells the Arcade collision solver to prefer certain contacts over others\n */\nvar ContactSolveBias;\n(function (ContactSolveBias) {\n ContactSolveBias[\"None\"] = \"none\";\n ContactSolveBias[\"VerticalFirst\"] = \"vertical-first\";\n ContactSolveBias[\"HorizontalFirst\"] = \"horizontal-first\";\n})(ContactSolveBias || (ContactSolveBias = {}));\n/**\n * Vertical First contact solve bias Used by the {@apilink ArcadeSolver} to sort contacts\n */\nconst VerticalFirst = {\n vertical: 1,\n horizontal: 2\n};\n/**\n * Horizontal First contact solve bias Used by the {@apilink ArcadeSolver} to sort contacts\n */\nconst HorizontalFirst = {\n horizontal: 1,\n vertical: 2\n};\n/**\n * None value, {@apilink ArcadeSolver} sorts contacts using distance by default\n */\nconst None = {\n horizontal: 0,\n vertical: 0\n};\n\n\n/***/ }),\n\n/***/ \"./Collision/Solver/ContactConstraintPoint.ts\":\n/*!****************************************************!*\\\n !*** ./Collision/Solver/ContactConstraintPoint.ts ***!\n \\****************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ContactConstraintPoint: () => (/* binding */ ContactConstraintPoint)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n\n/**\n * Holds information about contact points, meant to be reused over multiple frames of contact\n */\nclass ContactConstraintPoint {\n constructor(point, local, contact) {\n this.point = point;\n this.local = local;\n this.contact = contact;\n /**\n * Impulse accumulated over time in normal direction\n */\n this.normalImpulse = 0;\n /**\n * Impulse accumulated over time in the tangent direction\n */\n this.tangentImpulse = 0;\n /**\n * Effective mass seen in the normal direction\n */\n this.normalMass = 0;\n /**\n * Effective mass seen in the tangent direction\n */\n this.tangentMass = 0;\n /**\n * Direction from center of mass of bodyA to contact point\n */\n this.aToContact = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\n /**\n * Direction from center of mass of bodyB to contact point\n */\n this.bToContact = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\n /**\n * Original contact velocity combined with bounciness\n */\n this.originalVelocityAndRestitution = 0;\n this.update();\n }\n /**\n * Updates the contact information\n */\n update() {\n const bodyA = this.contact.bodyA;\n const bodyB = this.contact.bodyB;\n if (bodyA && bodyB) {\n const normal = this.contact.normal;\n const tangent = this.contact.tangent;\n this.aToContact = this.point.sub(bodyA.globalPos);\n this.bToContact = this.point.sub(bodyB.globalPos);\n const aToContactNormal = this.aToContact.cross(normal);\n const bToContactNormal = this.bToContact.cross(normal);\n this.normalMass =\n bodyA.inverseMass +\n bodyB.inverseMass +\n bodyA.inverseInertia * aToContactNormal * aToContactNormal +\n bodyB.inverseInertia * bToContactNormal * bToContactNormal;\n const aToContactTangent = this.aToContact.cross(tangent);\n const bToContactTangent = this.bToContact.cross(tangent);\n this.tangentMass =\n bodyA.inverseMass +\n bodyB.inverseMass +\n bodyA.inverseInertia * aToContactTangent * aToContactTangent +\n bodyB.inverseInertia * bToContactTangent * bToContactTangent;\n }\n return this;\n }\n /**\n * Returns the relative velocity between bodyA and bodyB\n */\n getRelativeVelocity() {\n const bodyA = this.contact.bodyA;\n const bodyB = this.contact.bodyB;\n if (bodyA && bodyB) {\n // Relative velocity in linear terms\n // Angular to linear velocity formula -> omega = velocity/radius so omega x radius = velocity\n const velA = bodyA.vel.add(_Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.cross(bodyA.angularVelocity, this.aToContact));\n const velB = bodyB.vel.add(_Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.cross(bodyB.angularVelocity, this.bToContact));\n return velB.sub(velA);\n }\n return _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Solver/RealisticSolver.ts\":\n/*!*********************************************!*\\\n !*** ./Collision/Solver/RealisticSolver.ts ***!\n \\*********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RealisticSolver: () => (/* binding */ RealisticSolver)\n/* harmony export */ });\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Events */ \"./Events.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _ContactConstraintPoint__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ContactConstraintPoint */ \"./Collision/Solver/ContactConstraintPoint.ts\");\n/* harmony import */ var _Side__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Side */ \"./Collision/Side.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Colliders_CollisionJumpTable__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Colliders/CollisionJumpTable */ \"./Collision/Colliders/CollisionJumpTable.ts\");\n\n\n\n\n\n\n\nclass RealisticSolver {\n constructor(config) {\n this.config = config;\n this.lastFrameContacts = new Map();\n // map contact id to contact points\n this.idToContactConstraint = new Map();\n }\n getContactConstraints(id) {\n var _a;\n return (_a = this.idToContactConstraint.get(id)) !== null && _a !== void 0 ? _a : [];\n }\n solve(contacts) {\n // Events and init\n this.preSolve(contacts);\n // Remove any canceled contacts\n contacts = contacts.filter((c) => !c.isCanceled());\n // Solve velocity first\n this.solveVelocity(contacts);\n // Solve position last because non-overlap is the most important\n this.solvePosition(contacts);\n // Events and any contact house-keeping the solver needs\n this.postSolve(contacts);\n return contacts;\n }\n preSolve(contacts) {\n var _a, _b, _c;\n const epsilon = 0.0001;\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n if (Math.abs(contact.mtv.x) < epsilon && Math.abs(contact.mtv.y) < epsilon) {\n // Cancel near 0 mtv collisions\n contact.cancel();\n continue;\n }\n // Publish collision events on both participants\n const side = _Side__WEBPACK_IMPORTED_MODULE_0__.Side.fromDirection(contact.mtv);\n contact.colliderA.events.emit('precollision', new _Events__WEBPACK_IMPORTED_MODULE_1__.PreCollisionEvent(contact.colliderA, contact.colliderB, side, contact.mtv, contact));\n contact.colliderA.events.emit('beforecollisionresolve', new _Events__WEBPACK_IMPORTED_MODULE_1__.CollisionPreSolveEvent(contact.colliderA, contact.colliderB, side, contact.mtv, contact));\n contact.colliderB.events.emit('precollision', new _Events__WEBPACK_IMPORTED_MODULE_1__.PreCollisionEvent(contact.colliderB, contact.colliderA, _Side__WEBPACK_IMPORTED_MODULE_0__.Side.getOpposite(side), contact.mtv.negate(), contact));\n contact.colliderB.events.emit('beforecollisionresolve', new _Events__WEBPACK_IMPORTED_MODULE_1__.CollisionPreSolveEvent(contact.colliderB, contact.colliderA, _Side__WEBPACK_IMPORTED_MODULE_0__.Side.getOpposite(side), contact.mtv.negate(), contact));\n // Match awake state for sleeping\n contact.matchAwake();\n }\n // Keep track of contacts that done\n const finishedContactIds = Array.from(this.idToContactConstraint.keys());\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n // Remove all current contacts that are not done\n const index = finishedContactIds.indexOf(contact.id);\n if (index > -1) {\n finishedContactIds.splice(index, 1);\n }\n const contactPoints = (_a = this.idToContactConstraint.get(contact.id)) !== null && _a !== void 0 ? _a : [];\n let pointIndex = 0;\n const bodyA = contact.bodyA;\n const bodyB = contact.bodyB;\n if (bodyA && bodyB) {\n for (let j = 0; j < contact.points.length; j++) {\n const point = contact.points[j];\n const normal = contact.normal;\n const tangent = contact.tangent;\n const aToContact = point.sub(bodyA.globalPos);\n const bToContact = point.sub(bodyB.globalPos);\n const aToContactNormal = aToContact.cross(normal);\n const bToContactNormal = bToContact.cross(normal);\n const normalMass = bodyA.inverseMass +\n bodyB.inverseMass +\n bodyA.inverseInertia * aToContactNormal * aToContactNormal +\n bodyB.inverseInertia * bToContactNormal * bToContactNormal;\n const aToContactTangent = aToContact.cross(tangent);\n const bToContactTangent = bToContact.cross(tangent);\n const tangentMass = bodyA.inverseMass +\n bodyB.inverseMass +\n bodyA.inverseInertia * aToContactTangent * aToContactTangent +\n bodyB.inverseInertia * bToContactTangent * bToContactTangent;\n // Preserve normal/tangent impulse by re-using the contact point if it's close\n if (contactPoints[pointIndex] && ((_c = (_b = contactPoints[pointIndex]) === null || _b === void 0 ? void 0 : _b.point) === null || _c === void 0 ? void 0 : _c.squareDistance(point)) < 4) {\n contactPoints[pointIndex].point = point;\n contactPoints[pointIndex].local = contact.localPoints[pointIndex];\n }\n else {\n // new contact if it's not close or doesn't exist\n contactPoints[pointIndex] = new _ContactConstraintPoint__WEBPACK_IMPORTED_MODULE_2__.ContactConstraintPoint(point, contact.localPoints[pointIndex], contact);\n }\n // Update contact point calculations\n contactPoints[pointIndex].aToContact = aToContact;\n contactPoints[pointIndex].bToContact = bToContact;\n contactPoints[pointIndex].normalMass = 1.0 / normalMass;\n contactPoints[pointIndex].tangentMass = 1.0 / tangentMass;\n // Calculate relative velocity before solving to accurately do restitution\n const restitution = bodyA.bounciness > bodyB.bounciness ? bodyA.bounciness : bodyB.bounciness;\n const relativeVelocity = contact.normal.dot(contactPoints[pointIndex].getRelativeVelocity());\n contactPoints[pointIndex].originalVelocityAndRestitution = 0;\n if (relativeVelocity < -0.1) {\n // TODO what's a good threshold here?\n contactPoints[pointIndex].originalVelocityAndRestitution = -restitution * relativeVelocity;\n }\n pointIndex++;\n }\n }\n this.idToContactConstraint.set(contact.id, contactPoints);\n }\n // Clean up any contacts that did not occur last frame\n for (const id of finishedContactIds) {\n this.idToContactConstraint.delete(id);\n }\n // Warm contacts with accumulated impulse\n // Useful for tall stacks\n if (this.config.warmStart) {\n this.warmStart(contacts);\n }\n else {\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n const contactPoints = this.getContactConstraints(contact.id);\n for (const point of contactPoints) {\n point.normalImpulse = 0;\n point.tangentImpulse = 0;\n }\n }\n }\n }\n postSolve(contacts) {\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n const bodyA = contact.bodyA;\n const bodyB = contact.bodyB;\n if (bodyA && bodyB) {\n // Skip post solve for active+passive collisions\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_3__.CollisionType.Passive || bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_3__.CollisionType.Passive) {\n continue;\n }\n // Update motion values for sleeping\n bodyA.updateMotion();\n bodyB.updateMotion();\n }\n // Publish collision events on both participants\n const side = _Side__WEBPACK_IMPORTED_MODULE_0__.Side.fromDirection(contact.mtv);\n contact.colliderA.events.emit('postcollision', new _Events__WEBPACK_IMPORTED_MODULE_1__.PostCollisionEvent(contact.colliderA, contact.colliderB, side, contact.mtv, contact));\n contact.colliderA.events.emit('aftercollisionresolve', new _Events__WEBPACK_IMPORTED_MODULE_1__.CollisionPostSolveEvent(contact.colliderA, contact.colliderB, side, contact.mtv, contact));\n contact.colliderB.events.emit('postcollision', new _Events__WEBPACK_IMPORTED_MODULE_1__.PostCollisionEvent(contact.colliderB, contact.colliderA, _Side__WEBPACK_IMPORTED_MODULE_0__.Side.getOpposite(side), contact.mtv.negate(), contact));\n contact.colliderB.events.emit('aftercollisionresolve', new _Events__WEBPACK_IMPORTED_MODULE_1__.CollisionPostSolveEvent(contact.colliderB, contact.colliderA, _Side__WEBPACK_IMPORTED_MODULE_0__.Side.getOpposite(side), contact.mtv.negate(), contact));\n }\n // Store contacts\n this.lastFrameContacts.clear();\n for (let i = 0; i < contacts.length; i++) {\n const c = contacts[i];\n this.lastFrameContacts.set(c.id, c);\n }\n }\n /**\n * Warm up body's based on previous frame contact points\n * @param contacts\n */\n warmStart(contacts) {\n var _a;\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n const bodyA = contact.bodyA;\n const bodyB = contact.bodyB;\n if (bodyA && bodyB) {\n const contactPoints = (_a = this.idToContactConstraint.get(contact.id)) !== null && _a !== void 0 ? _a : [];\n for (const point of contactPoints) {\n if (this.config.warmStart) {\n const normalImpulse = contact.normal.scale(point.normalImpulse);\n const tangentImpulse = contact.tangent.scale(point.tangentImpulse);\n const impulse = normalImpulse.add(tangentImpulse);\n bodyA.applyImpulse(point.point, impulse.negate());\n bodyB.applyImpulse(point.point, impulse);\n }\n else {\n point.normalImpulse = 0;\n point.tangentImpulse = 0;\n }\n }\n }\n }\n }\n /**\n * Iteratively solve the position overlap constraint\n * @param contacts\n */\n solvePosition(contacts) {\n var _a;\n for (let i = 0; i < this.config.positionIterations; i++) {\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n const bodyA = contact.bodyA;\n const bodyB = contact.bodyB;\n if (bodyA && bodyB) {\n // Skip solving active+passive\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_3__.CollisionType.Passive || bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_3__.CollisionType.Passive) {\n continue;\n }\n const constraints = (_a = this.idToContactConstraint.get(contact.id)) !== null && _a !== void 0 ? _a : [];\n for (const point of constraints) {\n const normal = contact.normal;\n const separation = _Colliders_CollisionJumpTable__WEBPACK_IMPORTED_MODULE_4__.CollisionJumpTable.FindContactSeparation(contact, point.local);\n const steeringConstant = this.config.steeringFactor; //0.2;\n const maxCorrection = -5;\n const slop = this.config.slop; //1;\n // Clamp to avoid over-correction\n // Remember that we are shooting for 0 overlap in the end\n const steeringForce = (0,_Math_util__WEBPACK_IMPORTED_MODULE_5__.clamp)(steeringConstant * (separation + slop), maxCorrection, 0);\n const impulse = normal.scale(-steeringForce * point.normalMass);\n // This is a pseudo impulse, meaning we aren't doing a real impulse calculation\n // We adjust position and rotation instead of doing the velocity\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_3__.CollisionType.Active) {\n // TODO make applyPseudoImpulse function?\n const impulseForce = impulse.negate().scale(bodyA.inverseMass);\n if (bodyA.limitDegreeOfFreedom.includes(_BodyComponent__WEBPACK_IMPORTED_MODULE_6__.DegreeOfFreedom.X)) {\n impulseForce.x = 0;\n }\n if (bodyA.limitDegreeOfFreedom.includes(_BodyComponent__WEBPACK_IMPORTED_MODULE_6__.DegreeOfFreedom.Y)) {\n impulseForce.y = 0;\n }\n bodyA.globalPos = bodyA.globalPos.add(impulseForce);\n if (!bodyA.limitDegreeOfFreedom.includes(_BodyComponent__WEBPACK_IMPORTED_MODULE_6__.DegreeOfFreedom.Rotation)) {\n bodyA.rotation -= point.aToContact.cross(impulse) * bodyA.inverseInertia;\n }\n }\n if (bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_3__.CollisionType.Active) {\n const impulseForce = impulse.scale(bodyB.inverseMass);\n if (bodyB.limitDegreeOfFreedom.includes(_BodyComponent__WEBPACK_IMPORTED_MODULE_6__.DegreeOfFreedom.X)) {\n impulseForce.x = 0;\n }\n if (bodyB.limitDegreeOfFreedom.includes(_BodyComponent__WEBPACK_IMPORTED_MODULE_6__.DegreeOfFreedom.Y)) {\n impulseForce.y = 0;\n }\n bodyB.globalPos = bodyB.globalPos.add(impulseForce);\n if (!bodyB.limitDegreeOfFreedom.includes(_BodyComponent__WEBPACK_IMPORTED_MODULE_6__.DegreeOfFreedom.Rotation)) {\n bodyB.rotation += point.bToContact.cross(impulse) * bodyB.inverseInertia;\n }\n }\n }\n }\n }\n }\n }\n solveVelocity(contacts) {\n var _a;\n for (let i = 0; i < this.config.velocityIterations; i++) {\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n const bodyA = contact.bodyA;\n const bodyB = contact.bodyB;\n if (bodyA && bodyB) {\n // Skip solving active+passive\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_3__.CollisionType.Passive || bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_3__.CollisionType.Passive) {\n continue;\n }\n const friction = Math.min(bodyA.friction, bodyB.friction);\n const constraints = (_a = this.idToContactConstraint.get(contact.id)) !== null && _a !== void 0 ? _a : [];\n // Friction constraint\n for (const point of constraints) {\n const relativeVelocity = point.getRelativeVelocity();\n // Negate velocity in tangent direction to simulate friction\n const tangentVelocity = -relativeVelocity.dot(contact.tangent);\n let impulseDelta = tangentVelocity * point.tangentMass;\n // Clamping based in Erin Catto's GDC 2006 talk\n // Correct clamping https://github.com/erincatto/box2d-lite/blob/master/docs/GDC2006_Catto_Erin_PhysicsTutorial.pdf\n // Accumulated fiction impulse is always between -uMaxFriction < dT < uMaxFriction\n // But deltas can vary\n const maxFriction = friction * point.normalImpulse;\n const newImpulse = (0,_Math_util__WEBPACK_IMPORTED_MODULE_5__.clamp)(point.tangentImpulse + impulseDelta, -maxFriction, maxFriction);\n impulseDelta = newImpulse - point.tangentImpulse;\n point.tangentImpulse = newImpulse;\n const impulse = contact.tangent.scale(impulseDelta);\n bodyA.applyImpulse(point.point, impulse.negate());\n bodyB.applyImpulse(point.point, impulse);\n }\n // Bounce constraint\n for (const point of constraints) {\n // Need to recalc relative velocity because the previous step could have changed vel\n const relativeVelocity = point.getRelativeVelocity();\n // Compute impulse in normal direction\n const normalVelocity = relativeVelocity.dot(contact.normal);\n // Per Erin it is a mistake to apply the restitution inside the iteration\n // From Erin Catto's Box2D we keep original contact velocity and adjust by small impulses\n let impulseDelta = -point.normalMass * (normalVelocity - point.originalVelocityAndRestitution);\n // Clamping based in Erin Catto's GDC 2014 talk\n // Accumulated impulse stored in the contact is always positive (dV > 0)\n // But deltas can be negative\n const newImpulse = Math.max(point.normalImpulse + impulseDelta, 0);\n impulseDelta = newImpulse - point.normalImpulse;\n point.normalImpulse = newImpulse;\n const impulse = contact.normal.scale(impulseDelta);\n bodyA.applyImpulse(point.point, impulse.negate());\n bodyB.applyImpulse(point.point, impulse);\n }\n }\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Color.ts\":\n/*!******************!*\\\n !*** ./Color.ts ***!\n \\******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Color: () => (/* binding */ Color)\n/* harmony export */ });\n/**\n * Provides standard colors (e.g. {@apilink Color.Black})\n * but you can also create custom colors using RGB, HSL, or Hex. Also provides\n * useful color operations like {@apilink Color.lighten}, {@apilink Color.darken}, and more.\n */\nclass Color {\n /**\n * Creates a new instance of Color from an r, g, b, a\n * @param r The red component of color (0-255)\n * @param g The green component of color (0-255)\n * @param b The blue component of color (0-255)\n * @param a The alpha component of color (0-1.0)\n */\n constructor(r, g, b, a) {\n this.r = r;\n this.g = g;\n this.b = b;\n this.a = a != null ? a : 1;\n }\n /**\n * Creates a new instance of Color from an r, g, b, a\n * @param r The red component of color (0-255)\n * @param g The green component of color (0-255)\n * @param b The blue component of color (0-255)\n * @param a The alpha component of color (0-1.0)\n */\n static fromRGB(r, g, b, a) {\n return new Color(r, g, b, a);\n }\n /**\n * Creates a new instance of Color from a rgb string\n * @param string CSS color string of the form rgba(255, 255, 255, 1) or rgb(255, 255, 255)\n */\n static fromRGBString(string) {\n const rgbaRegEx = /^rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*(\\d+(?:\\.\\d+)?))?\\)/i;\n let match = null;\n if ((match = string.match(rgbaRegEx))) {\n const r = parseInt(match[1], 10);\n const g = parseInt(match[2], 10);\n const b = parseInt(match[3], 10);\n let a = 1;\n if (match[4]) {\n a = parseFloat(match[4]);\n }\n return new Color(r, g, b, a);\n }\n else {\n throw new Error('Invalid rgb/a string: ' + string);\n }\n }\n /**\n * Creates a new instance of Color from a hex string\n * @param hex CSS color string of the form #ffffff, the alpha component is optional\n */\n static fromHex(hex) {\n const hexRegEx = /^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})?$/i;\n let match = null;\n if ((match = hex.match(hexRegEx))) {\n const r = parseInt(match[1], 16);\n const g = parseInt(match[2], 16);\n const b = parseInt(match[3], 16);\n let a = 1;\n if (match[4]) {\n a = parseInt(match[4], 16) / 255;\n }\n return new Color(r, g, b, a);\n }\n else {\n throw new Error('Invalid hex string: ' + hex);\n }\n }\n /**\n * Creates a new instance of Color from hsla values\n * @param h Hue is represented [0-1]\n * @param s Saturation is represented [0-1]\n * @param l Luminance is represented [0-1]\n * @param a Alpha is represented [0-1]\n */\n static fromHSL(h, s, l, a = 1.0) {\n const temp = new HSLColor(h, s, l, a);\n return temp.toRGBA();\n }\n /**\n * Lightens the current color by a specified amount\n * @param factor The amount to lighten by [0-1]\n */\n lighten(factor = 0.1) {\n const temp = HSLColor.fromRGBA(this.r, this.g, this.b, this.a);\n temp.l += (1 - temp.l) * factor;\n return temp.toRGBA();\n }\n /**\n * Darkens the current color by a specified amount\n * @param factor The amount to darken by [0-1]\n */\n darken(factor = 0.1) {\n const temp = HSLColor.fromRGBA(this.r, this.g, this.b, this.a);\n temp.l -= temp.l * factor;\n return temp.toRGBA();\n }\n /**\n * Saturates the current color by a specified amount\n * @param factor The amount to saturate by [0-1]\n */\n saturate(factor = 0.1) {\n const temp = HSLColor.fromRGBA(this.r, this.g, this.b, this.a);\n temp.s += temp.s * factor;\n return temp.toRGBA();\n }\n /**\n * Desaturates the current color by a specified amount\n * @param factor The amount to desaturate by [0-1]\n */\n desaturate(factor = 0.1) {\n const temp = HSLColor.fromRGBA(this.r, this.g, this.b, this.a);\n temp.s -= temp.s * factor;\n return temp.toRGBA();\n }\n /**\n * Multiplies a color by another, results in a darker color\n * @param color The other color\n */\n multiply(color) {\n const newR = (((color.r / 255) * this.r) / 255) * 255;\n const newG = (((color.g / 255) * this.g) / 255) * 255;\n const newB = (((color.b / 255) * this.b) / 255) * 255;\n const newA = color.a * this.a;\n return new Color(newR, newG, newB, newA);\n }\n /**\n * Screens a color by another, results in a lighter color\n * @param color The other color\n */\n screen(color) {\n const color1 = color.invert();\n const color2 = color.invert();\n return color1.multiply(color2).invert();\n }\n /**\n * Inverts the current color\n */\n invert() {\n return new Color(255 - this.r, 255 - this.g, 255 - this.b, 1.0 - this.a);\n }\n /**\n * Averages the current color with another\n * @param color The other color\n */\n average(color) {\n const newR = (color.r + this.r) / 2;\n const newG = (color.g + this.g) / 2;\n const newB = (color.b + this.b) / 2;\n const newA = (color.a + this.a) / 2;\n return new Color(newR, newG, newB, newA);\n }\n equal(color) {\n return this.toString() === color.toString();\n }\n /**\n * Returns a CSS string representation of a color.\n * @param format Color representation, accepts: rgb, hsl, or hex\n */\n toString(format = 'rgb') {\n switch (format) {\n case 'rgb':\n return this.toRGBA();\n case 'hsl':\n return this.toHSLA();\n case 'hex':\n return this.toHex();\n default:\n throw new Error('Invalid Color format');\n }\n }\n /**\n * Returns Hex Value of a color component\n * @param c color component\n * @see https://stackoverflow.com/questions/5623838/rgb-to-hex-and-hex-to-rgb\n */\n _componentToHex(c) {\n // Handle negative and fractional numbers\n const hex = Math.max(Math.round(c), 0).toString(16);\n return hex.length === 1 ? '0' + hex : hex;\n }\n /**\n * Return Hex representation of a color.\n */\n toHex() {\n let hexRepresentation = '#' + this._componentToHex(this.r) + this._componentToHex(this.g) + this._componentToHex(this.b);\n if (this.a !== 1) {\n hexRepresentation += this._componentToHex(this.a * 255);\n }\n return hexRepresentation;\n }\n /**\n * Return RGBA representation of a color.\n */\n toRGBA() {\n const result = String(this.r.toFixed(0)) + ', ' + String(this.g.toFixed(0)) + ', ' + String(this.b.toFixed(0));\n if (this.a !== undefined || this.a !== null) {\n return 'rgba(' + result + ', ' + String(this.a) + ')';\n }\n return 'rgb(' + result + ')';\n }\n /**\n * Return HSLA representation of a color.\n */\n toHSLA() {\n return HSLColor.fromRGBA(this.r, this.g, this.b, this.a).toString();\n }\n /**\n * Returns a CSS string representation of a color.\n */\n fillStyle() {\n return this.toString();\n }\n /**\n * Returns a clone of the current color.\n */\n clone(dest) {\n const result = dest || new Color(this.r, this.g, this.b, this.a);\n result.r = this.r;\n result.g = this.g;\n result.b = this.b;\n result.a = this.a;\n return result;\n }\n /**\n * Black (#000000)\n */\n static get Black() {\n return Color.fromHex('#000000');\n }\n /**\n * White (#FFFFFF)\n */\n static get White() {\n return Color.fromHex('#FFFFFF');\n }\n /**\n * Gray (#808080)\n */\n static get Gray() {\n return Color.fromHex('#808080');\n }\n /**\n * Light gray (#D3D3D3)\n */\n static get LightGray() {\n return Color.fromHex('#D3D3D3');\n }\n /**\n * Dark gray (#A9A9A9)\n */\n static get DarkGray() {\n return Color.fromHex('#A9A9A9');\n }\n /**\n * Yellow (#FFFF00)\n */\n static get Yellow() {\n return Color.fromHex('#FFFF00');\n }\n /**\n * Orange (#FFA500)\n */\n static get Orange() {\n return Color.fromHex('#FFA500');\n }\n /**\n * Red (#FF0000)\n */\n static get Red() {\n return Color.fromHex('#FF0000');\n }\n /**\n * Vermilion (#FF5B31)\n */\n static get Vermilion() {\n return Color.fromHex('#FF5B31');\n }\n /**\n * Rose (#FF007F)\n */\n static get Rose() {\n return Color.fromHex('#FF007F');\n }\n /**\n * Pink (#FFC0CB)\n */\n static get Pink() {\n return Color.fromHex('#FFC0CB');\n }\n /**\n * Magenta (#FF00FF)\n */\n static get Magenta() {\n return Color.fromHex('#FF00FF');\n }\n /**\n * Violet (#7F00FF)\n */\n static get Violet() {\n return Color.fromHex('#7F00FF');\n }\n /**\n * Purple (#800080)\n */\n static get Purple() {\n return Color.fromHex('#800080');\n }\n /**\n * Blue (#0000FF)\n */\n static get Blue() {\n return Color.fromHex('#0000FF');\n }\n /**\n * Azure (#007FFF)\n */\n static get Azure() {\n return Color.fromHex('#007FFF');\n }\n /**\n * Cyan (#00FFFF)\n */\n static get Cyan() {\n return Color.fromHex('#00FFFF');\n }\n /**\n * Viridian (#59978F)\n */\n static get Viridian() {\n return Color.fromHex('#59978F');\n }\n /**\n * Teal (#008080)\n */\n static get Teal() {\n return Color.fromHex('#008080');\n }\n /**\n * Green (#00FF00)\n */\n static get Green() {\n return Color.fromHex('#00FF00');\n }\n /**\n * Chartreuse (#7FFF00)\n */\n static get Chartreuse() {\n return Color.fromHex('#7FFF00');\n }\n /**\n * Transparent (#FFFFFF00)\n */\n static get Transparent() {\n return Color.fromHex('#FFFFFF00');\n }\n /**\n * ExcaliburBlue (#176BAA)\n */\n static get ExcaliburBlue() {\n return Color.fromHex('#176BAA');\n }\n /**\n * Brown (#964B00)\n */\n static get Brown() {\n return Color.fromHex('#964B00');\n }\n}\n/**\n * Internal HSL Color representation\n *\n * http://en.wikipedia.org/wiki/HSL_and_HSV\n * http://axonflux.com/handy-rgb-to-hsl-and-rgb-to-hsv-color-model-c\n */\nclass HSLColor {\n constructor(h, s, l, a) {\n this.h = h;\n this.s = s;\n this.l = l;\n this.a = a;\n }\n static hue2rgb(p, q, t) {\n if (t < 0) {\n t += 1;\n }\n if (t > 1) {\n t -= 1;\n }\n if (t < 1 / 6) {\n return p + (q - p) * 6 * t;\n }\n if (t < 1 / 2) {\n return q;\n }\n if (t < 2 / 3) {\n return p + (q - p) * (2 / 3 - t) * 6;\n }\n return p;\n }\n static fromRGBA(r, g, b, a) {\n r /= 255;\n g /= 255;\n b /= 255;\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h, s;\n const l = (max + min) / 2;\n if (max === min) {\n h = s = 0; // achromatic\n }\n else {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n h /= 6;\n }\n return new HSLColor(h, s, l, a);\n }\n toRGBA() {\n let r, g, b;\n if (this.s === 0) {\n r = g = b = this.l; // achromatic\n }\n else {\n const q = this.l < 0.5 ? this.l * (1 + this.s) : this.l + this.s - this.l * this.s;\n const p = 2 * this.l - q;\n r = HSLColor.hue2rgb(p, q, this.h + 1 / 3);\n g = HSLColor.hue2rgb(p, q, this.h);\n b = HSLColor.hue2rgb(p, q, this.h - 1 / 3);\n }\n return new Color(r * 255, g * 255, b * 255, this.a);\n }\n toString() {\n const h = this.h.toFixed(0), s = this.s.toFixed(0), l = this.l.toFixed(0), a = this.a.toFixed(0);\n return `hsla(${h}, ${s}, ${l}, ${a})`;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Context.ts\":\n/*!********************!*\\\n !*** ./Context.ts ***!\n \\********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ createContext: () => (/* binding */ createContext),\n/* harmony export */ useContext: () => (/* binding */ useContext)\n/* harmony export */ });\n/**\n * Creates a injectable context that can be retrieved later with `useContext(context)`\n *\n * Example\n * ```typescript\n *\n * const AppContext = createContext({some: 'value'});\n * context.scope(val, () => {\n * const value = useContext(AppContext);\n * })\n *\n * ```\n */\nfunction createContext() {\n const ctx = {\n scope: (value, cb) => {\n const old = ctx.value;\n ctx.value = value;\n try {\n return cb();\n }\n catch (e) {\n throw e;\n }\n finally {\n ctx.value = old;\n }\n },\n value: undefined\n };\n return ctx;\n}\n/**\n * Retrieves the value from the current context\n */\nfunction useContext(context) {\n return context.value;\n}\n\n\n/***/ }),\n\n/***/ \"./Debug/DebugConfig.ts\":\n/*!******************************!*\\\n !*** ./Debug/DebugConfig.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DebugConfig: () => (/* binding */ DebugConfig),\n/* harmony export */ FrameStats: () => (/* binding */ FrameStats),\n/* harmony export */ PhysicsStats: () => (/* binding */ PhysicsStats)\n/* harmony export */ });\n/* harmony import */ var _DebugFlags__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./DebugFlags */ \"./Debug/DebugFlags.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n\n\n/**\n * Debug statistics and flags for Excalibur. If polling these values, it would be\n * best to do so on the `postupdate` event for {@apilink Engine}, after all values have been\n * updated during a frame.\n */\nclass DebugConfig {\n constructor(engine) {\n /**\n * Performance statistics\n */\n this.stats = {\n /**\n * Current frame statistics. Engine reuses this instance, use {@apilink FrameStats.clone} to copy frame stats.\n * Best accessed on {@apilink postframe} event. See {@apilink FrameStats}\n */\n currFrame: new FrameStats(),\n /**\n * Previous frame statistics. Engine reuses this instance, use {@apilink FrameStats.clone} to copy frame stats.\n * Best accessed on {@apilink preframe} event. Best inspected on engine event `preframe`. See {@apilink FrameStats}\n */\n prevFrame: new FrameStats()\n };\n /**\n * Filter debug context to named entities or entity ids\n */\n this.filter = {\n /**\n * Toggle filter on or off (default off) must be on for DebugDraw to use filters\n */\n useFilter: false,\n /**\n * Query for entities by name, if the entity name contains `nameQuery` it will be included\n */\n nameQuery: '',\n /**\n * Query for Entity ids, if the id matches it will be included\n */\n ids: []\n };\n /**\n * Entity debug settings\n */\n this.entity = {\n showAll: false,\n showId: false,\n showName: false\n };\n /**\n * Transform component debug settings\n */\n this.transform = {\n showAll: false,\n debugZIndex: 10000000,\n showPosition: false,\n showPositionLabel: false,\n positionColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Yellow,\n showZIndex: false,\n showScale: false,\n scaleColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Green,\n showRotation: false,\n rotationColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Blue\n };\n /**\n * Graphics component debug settings\n */\n this.graphics = {\n showAll: false,\n showBounds: false,\n boundsColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Yellow\n };\n /**\n * Collider component debug settings\n */\n this.collider = {\n showAll: false,\n showBounds: false,\n boundsColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Blue,\n showOwner: false,\n showGeometry: true,\n geometryColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Green,\n geometryLineWidth: 1,\n geometryPointSize: 0.5\n };\n /**\n * Physics simulation debug settings\n */\n this.physics = {\n showAll: false,\n showBroadphaseSpacePartitionDebug: false,\n showCollisionNormals: false,\n collisionNormalColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Cyan,\n showCollisionContacts: true,\n contactSize: 2,\n collisionContactColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Red\n };\n /**\n * Motion component debug settings\n */\n this.motion = {\n showAll: false,\n showVelocity: false,\n velocityColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Yellow,\n showAcceleration: false,\n accelerationColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Red\n };\n /**\n * Body component debug settings\n */\n this.body = {\n showAll: false,\n showCollisionGroup: false,\n showCollisionType: false,\n showSleeping: false,\n showMotion: false,\n showMass: false\n };\n /**\n * Camera debug settings\n */\n this.camera = {\n showAll: false,\n showFocus: false,\n focusColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Red,\n showZoom: false\n };\n this.tilemap = {\n showAll: false,\n showGrid: false,\n gridColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Red,\n gridWidth: 0.5,\n showSolidBounds: false,\n solidBoundsColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.fromHex('#8080807F'), // grayish\n showColliderGeometry: true\n };\n this.isometric = {\n showAll: false,\n showPosition: false,\n positionColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Yellow,\n positionSize: 1,\n showGrid: false,\n gridColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Red,\n gridWidth: 1,\n showColliderGeometry: true\n };\n this._engine = engine;\n this.colorBlindMode = new _DebugFlags__WEBPACK_IMPORTED_MODULE_1__.ColorBlindFlags(this._engine);\n }\n /**\n * Switch the current excalibur clock with the {@apilink TestClock} and return\n * it in the same running state.\n *\n * This is useful when you need to debug frame by frame.\n */\n useTestClock() {\n const clock = this._engine.clock;\n const wasRunning = clock.isRunning();\n clock.stop();\n const testClock = clock.toTestClock();\n if (wasRunning) {\n testClock.start();\n }\n this._engine.clock = testClock;\n return testClock;\n }\n /**\n * Switch the current excalibur clock with the {@apilink StandardClock} and\n * return it in the same running state.\n *\n * This is useful when you need to switch back to normal mode after\n * debugging.\n */\n useStandardClock() {\n const currentClock = this._engine.clock;\n const wasRunning = currentClock.isRunning();\n currentClock.stop();\n const standardClock = currentClock.toStandardClock();\n if (wasRunning) {\n standardClock.start();\n }\n this._engine.clock = standardClock;\n return standardClock;\n }\n}\n/**\n * Implementation of a frame's stats. Meant to have values copied via {@apilink FrameStats.reset}, avoid\n * creating instances of this every frame.\n */\nclass FrameStats {\n constructor() {\n this._id = 0;\n this._elapsedMs = 0;\n this._fps = 0;\n this._actorStats = {\n alive: 0,\n killed: 0,\n ui: 0,\n get remaining() {\n return this.alive - this.killed;\n },\n get total() {\n return this.remaining + this.ui;\n }\n };\n this._durationStats = {\n update: 0,\n draw: 0,\n get total() {\n return this.update + this.draw;\n }\n };\n this._physicsStats = new PhysicsStats();\n this._graphicsStats = {\n drawCalls: 0,\n drawnImages: 0\n };\n }\n /**\n * Zero out values or clone other IFrameStat stats. Allows instance reuse.\n * @param [otherStats] Optional stats to clone\n */\n reset(otherStats) {\n if (otherStats) {\n this.id = otherStats.id;\n this.elapsedMs = otherStats.elapsedMs;\n this.fps = otherStats.fps;\n this.actors.alive = otherStats.actors.alive;\n this.actors.killed = otherStats.actors.killed;\n this.actors.ui = otherStats.actors.ui;\n this.duration.update = otherStats.duration.update;\n this.duration.draw = otherStats.duration.draw;\n this._physicsStats.reset(otherStats.physics);\n this.graphics.drawCalls = otherStats.graphics.drawCalls;\n this.graphics.drawnImages = otherStats.graphics.drawnImages;\n }\n else {\n this.id = this.elapsedMs = this.fps = 0;\n this.actors.alive = this.actors.killed = this.actors.ui = 0;\n this.duration.update = this.duration.draw = 0;\n this._physicsStats.reset();\n this.graphics.drawnImages = this.graphics.drawCalls = 0;\n }\n }\n /**\n * Provides a clone of this instance.\n */\n clone() {\n const fs = new FrameStats();\n fs.reset(this);\n return fs;\n }\n /**\n * Gets the frame's id\n */\n get id() {\n return this._id;\n }\n /**\n * Sets the frame's id\n */\n set id(value) {\n this._id = value;\n }\n /**\n * Gets the frame's delta (time since last frame)\n */\n get elapsedMs() {\n return this._elapsedMs;\n }\n /**\n * Sets the frame's delta (time since last frame). Internal use only.\n * @internal\n */\n set elapsedMs(value) {\n this._elapsedMs = value;\n }\n /**\n * Gets the frame's frames-per-second (FPS)\n */\n get fps() {\n return this._fps;\n }\n /**\n * Sets the frame's frames-per-second (FPS). Internal use only.\n * @internal\n */\n set fps(value) {\n this._fps = value;\n }\n /**\n * Gets the frame's actor statistics\n */\n get actors() {\n return this._actorStats;\n }\n /**\n * Gets the frame's duration statistics\n */\n get duration() {\n return this._durationStats;\n }\n /**\n * Gets the frame's physics statistics\n */\n get physics() {\n return this._physicsStats;\n }\n /**\n * Gets the frame's graphics statistics\n */\n get graphics() {\n return this._graphicsStats;\n }\n}\nclass PhysicsStats {\n constructor() {\n this._pairs = 0;\n this._collisions = 0;\n this._contacts = new Map();\n this._fastBodies = 0;\n this._fastBodyCollisions = 0;\n this._broadphase = 0;\n this._narrowphase = 0;\n }\n /**\n * Zero out values or clone other IPhysicsStats stats. Allows instance reuse.\n * @param [otherStats] Optional stats to clone\n */\n reset(otherStats) {\n if (otherStats) {\n this.pairs = otherStats.pairs;\n this.collisions = otherStats.collisions;\n this.contacts = otherStats.contacts;\n this.fastBodies = otherStats.fastBodies;\n this.fastBodyCollisions = otherStats.fastBodyCollisions;\n this.broadphase = otherStats.broadphase;\n this.narrowphase = otherStats.narrowphase;\n }\n else {\n this.pairs = this.collisions = this.fastBodies = 0;\n this.fastBodyCollisions = this.broadphase = this.narrowphase = 0;\n this.contacts.clear();\n }\n }\n /**\n * Provides a clone of this instance.\n */\n clone() {\n const ps = new PhysicsStats();\n ps.reset(this);\n return ps;\n }\n get pairs() {\n return this._pairs;\n }\n set pairs(value) {\n this._pairs = value;\n }\n get collisions() {\n return this._collisions;\n }\n set collisions(value) {\n this._collisions = value;\n }\n get contacts() {\n return this._contacts;\n }\n set contacts(contacts) {\n this._contacts = contacts;\n }\n get fastBodies() {\n return this._fastBodies;\n }\n set fastBodies(value) {\n this._fastBodies = value;\n }\n get fastBodyCollisions() {\n return this._fastBodyCollisions;\n }\n set fastBodyCollisions(value) {\n this._fastBodyCollisions = value;\n }\n get broadphase() {\n return this._broadphase;\n }\n set broadphase(value) {\n this._broadphase = value;\n }\n get narrowphase() {\n return this._narrowphase;\n }\n set narrowphase(value) {\n this._narrowphase = value;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Debug/DebugFlags.ts\":\n/*!*****************************!*\\\n !*** ./Debug/DebugFlags.ts ***!\n \\*****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ColorBlindFlags: () => (/* binding */ ColorBlindFlags)\n/* harmony export */ });\n/* harmony import */ var _Graphics_PostProcessor_ColorBlindnessMode__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Graphics/PostProcessor/ColorBlindnessMode */ \"./Graphics/PostProcessor/ColorBlindnessMode.ts\");\n/* harmony import */ var _Graphics_PostProcessor_ColorBlindnessPostProcessor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Graphics/PostProcessor/ColorBlindnessPostProcessor */ \"./Graphics/PostProcessor/ColorBlindnessPostProcessor.ts\");\n/* harmony import */ var _Graphics_Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Graphics/Context/ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n\n\n\nclass ColorBlindFlags {\n constructor(engine) {\n this._engine = engine;\n this._colorBlindPostProcessor = new _Graphics_PostProcessor_ColorBlindnessPostProcessor__WEBPACK_IMPORTED_MODULE_0__.ColorBlindnessPostProcessor(_Graphics_PostProcessor_ColorBlindnessMode__WEBPACK_IMPORTED_MODULE_1__.ColorBlindnessMode.Protanope);\n }\n /**\n * Correct colors for a specified color blindness\n * @param colorBlindness\n */\n correct(colorBlindness) {\n if (this._engine.graphicsContext instanceof _Graphics_Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_2__.ExcaliburGraphicsContextWebGL) {\n this.clear();\n this._colorBlindPostProcessor.colorBlindnessMode = colorBlindness;\n this._colorBlindPostProcessor.simulate = false;\n this._engine.graphicsContext.addPostProcessor(this._colorBlindPostProcessor);\n }\n }\n /**\n * Simulate colors for a specified color blindness\n * @param colorBlindness\n */\n simulate(colorBlindness) {\n if (this._engine.graphicsContext instanceof _Graphics_Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_2__.ExcaliburGraphicsContextWebGL) {\n this.clear();\n this._colorBlindPostProcessor.colorBlindnessMode = colorBlindness;\n this._colorBlindPostProcessor.simulate = true;\n this._engine.graphicsContext.addPostProcessor(this._colorBlindPostProcessor);\n }\n }\n /**\n * Remove color blindness post processor\n */\n clear() {\n this._engine.graphicsContext.removePostProcessor(this._colorBlindPostProcessor);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Debug/DebugSystem.ts\":\n/*!******************************!*\\\n !*** ./Debug/DebugSystem.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DebugSystem: () => (/* binding */ DebugSystem)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../Collision/ColliderComponent */ \"./Collision/ColliderComponent.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Priority.ts\");\n/* harmony import */ var _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../Collision/BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Collision_CollisionSystem__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Collision/CollisionSystem */ \"./Collision/CollisionSystem.ts\");\n/* harmony import */ var _Collision_Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../Collision/Colliders/CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Graphics/GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Particles_Particles__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Particles/Particles */ \"./Particles/Particles.ts\");\n/* harmony import */ var _Graphics_DebugGraphicsComponent__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Graphics/DebugGraphicsComponent */ \"./Graphics/DebugGraphicsComponent.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Math/coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _Graphics_Debug__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../Graphics/Debug */ \"./Graphics/Debug.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass DebugSystem extends _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.System {\n constructor(world) {\n super();\n this.world = world;\n this.systemType = _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.SystemType.Draw;\n this.query = this.world.query([_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_1__.TransformComponent]);\n }\n initialize(world, scene) {\n this._graphicsContext = scene.engine.graphicsContext;\n this._camera = scene.camera;\n this._engine = scene.engine;\n this._collisionSystem = world.systemManager.get(_Collision_CollisionSystem__WEBPACK_IMPORTED_MODULE_2__.CollisionSystem);\n }\n update() {\n var _a;\n if (!this._engine.isDebug) {\n return;\n }\n const filterSettings = this._engine.debug.filter;\n let id;\n let name;\n const entitySettings = this._engine.debug.entity;\n let tx;\n const txSettings = this._engine.debug.transform;\n let motion;\n const motionSettings = this._engine.debug.motion;\n let colliderComp;\n const colliderSettings = this._engine.debug.collider;\n const physicsSettings = this._engine.debug.physics;\n let graphics;\n const graphicsSettings = this._engine.debug.graphics;\n let debugDraw;\n let body;\n const bodySettings = this._engine.debug.body;\n const cameraSettings = this._engine.debug.camera;\n for (let i = 0; i < this.query.entities.length; i++) {\n const entity = this.query.entities[i];\n if (entity.hasTag('offscreen')) {\n // skip offscreen entities\n continue;\n }\n if (entity instanceof _Particles_Particles__WEBPACK_IMPORTED_MODULE_3__.Particle) {\n // Particles crush the renderer :(\n continue;\n }\n if (filterSettings.useFilter) {\n const allIds = filterSettings.ids.length === 0;\n const idMatch = allIds || filterSettings.ids.includes(entity.id);\n if (!idMatch) {\n continue;\n }\n const allNames = filterSettings.nameQuery === '';\n const nameMatch = allNames || entity.name.includes(filterSettings.nameQuery);\n if (!nameMatch) {\n continue;\n }\n }\n let cursor = _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero;\n const lineHeight = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(0, 16);\n id = entity.id;\n name = entity.name;\n tx = entity.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n // This optionally sets our camera based on the entity coord plan (world vs. screen)\n this._pushCameraTransform(tx);\n this._graphicsContext.save();\n if (tx.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_5__.CoordPlane.Screen) {\n this._graphicsContext.translate(this._engine.screen.contentArea.left, this._engine.screen.contentArea.top);\n }\n this._graphicsContext.z = txSettings.debugZIndex;\n this._applyTransform(entity);\n if (tx) {\n if (txSettings.showAll || txSettings.showPosition) {\n this._graphicsContext.debug.drawPoint(_Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero, { size: 4, color: txSettings.positionColor });\n }\n if (txSettings.showAll || txSettings.showPositionLabel) {\n this._graphicsContext.debug.drawText(`pos${tx.pos.toString(2)}`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (txSettings.showAll || txSettings.showZIndex) {\n this._graphicsContext.debug.drawText(`z(${tx.z.toFixed(1)})`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (entitySettings.showAll || entitySettings.showId) {\n this._graphicsContext.debug.drawText(`id(${id}) ${entity.parent ? 'child of id(' + ((_a = entity.parent) === null || _a === void 0 ? void 0 : _a.id) + ')' : ''}`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (entitySettings.showAll || entitySettings.showName) {\n this._graphicsContext.debug.drawText(`name(${name})`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (txSettings.showAll || txSettings.showRotation) {\n this._graphicsContext.drawLine(_Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero, _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.fromAngle(tx.rotation).scale(50).add(_Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero), txSettings.rotationColor, 2);\n this._graphicsContext.debug.drawText(`rot deg(${(0,_Math_util__WEBPACK_IMPORTED_MODULE_6__.toDegrees)(tx.rotation).toFixed(2)})`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (txSettings.showAll || txSettings.showScale) {\n this._graphicsContext.drawLine(_Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero, tx.scale.add(_Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero), txSettings.scaleColor, 2);\n }\n }\n graphics = entity.get(_Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_7__.GraphicsComponent);\n if (graphics) {\n if (graphicsSettings.showAll || graphicsSettings.showBounds) {\n const bounds = graphics.localBounds;\n bounds.draw(this._graphicsContext, graphicsSettings.boundsColor);\n }\n }\n debugDraw = entity.get(_Graphics_DebugGraphicsComponent__WEBPACK_IMPORTED_MODULE_8__.DebugGraphicsComponent);\n if (debugDraw) {\n if (!debugDraw.useTransform) {\n this._graphicsContext.restore();\n }\n debugDraw.draw(this._graphicsContext, this._engine.debug);\n if (!debugDraw.useTransform) {\n this._graphicsContext.save();\n this._applyTransform(entity);\n }\n }\n body = entity.get(_Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_9__.BodyComponent);\n if (body) {\n if (bodySettings.showAll || bodySettings.showCollisionGroup) {\n this._graphicsContext.debug.drawText(`collision group(${body.group.name})`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (bodySettings.showAll || bodySettings.showCollisionType) {\n this._graphicsContext.debug.drawText(`collision type(${body.collisionType})`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (bodySettings.showAll || bodySettings.showMass) {\n this._graphicsContext.debug.drawText(`mass(${body.mass})`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (bodySettings.showAll || bodySettings.showMotion) {\n this._graphicsContext.debug.drawText(`motion(${body.sleepMotion})`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (bodySettings.showAll || bodySettings.showSleeping) {\n this._graphicsContext.debug.drawText(`sleeping(${body.canSleep ? body.isSleeping : 'cant sleep'})`, cursor);\n cursor = cursor.add(lineHeight);\n }\n }\n this._graphicsContext.restore();\n // World space\n this._graphicsContext.save();\n if (tx.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_5__.CoordPlane.Screen) {\n this._graphicsContext.translate(this._engine.screen.contentArea.left, this._engine.screen.contentArea.top);\n }\n this._graphicsContext.z = txSettings.debugZIndex;\n motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_10__.MotionComponent);\n if (motion) {\n if (motionSettings.showAll || motionSettings.showVelocity) {\n this._graphicsContext.debug.drawText(`vel${motion.vel.toString(2)}`, cursor.add(tx.globalPos));\n this._graphicsContext.drawLine(tx.globalPos, tx.globalPos.add(motion.vel), motionSettings.velocityColor, 2);\n cursor = cursor.add(lineHeight);\n }\n if (motionSettings.showAll || motionSettings.showAcceleration) {\n this._graphicsContext.drawLine(tx.globalPos, tx.globalPos.add(motion.acc), motionSettings.accelerationColor, 2);\n }\n }\n // Colliders live in world space already so after the restore()\n colliderComp = entity.get(_Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_11__.ColliderComponent);\n if (colliderComp) {\n const collider = colliderComp.get();\n if ((colliderSettings.showAll || colliderSettings.showGeometry) && collider) {\n collider.debug(this._graphicsContext, colliderSettings.geometryColor, {\n lineWidth: colliderSettings.geometryLineWidth,\n pointSize: colliderSettings.geometryPointSize\n });\n }\n if (colliderSettings.showAll || colliderSettings.showBounds) {\n if (collider instanceof _Collision_Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_12__.CompositeCollider) {\n const colliders = collider.getColliders();\n for (const collider of colliders) {\n const bounds = collider.bounds;\n const pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(bounds.left, bounds.top);\n this._graphicsContext.debug.drawRect(pos.x, pos.y, bounds.width, bounds.height, { color: colliderSettings.boundsColor });\n if (colliderSettings.showAll || colliderSettings.showOwner) {\n this._graphicsContext.debug.drawText(`owner id(${collider.owner.id})`, pos);\n }\n }\n colliderComp.bounds.draw(this._graphicsContext, colliderSettings.boundsColor);\n }\n else if (collider) {\n const bounds = colliderComp.bounds;\n const pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(bounds.left, bounds.top);\n this._graphicsContext.debug.drawRect(pos.x, pos.y, bounds.width, bounds.height, { color: colliderSettings.boundsColor });\n if (colliderSettings.showAll || colliderSettings.showOwner) {\n this._graphicsContext.debug.drawText(`owner id(${colliderComp.owner.id})`, pos);\n }\n }\n }\n }\n this._graphicsContext.restore();\n this._popCameraTransform(tx);\n }\n this._graphicsContext.save();\n this._camera.draw(this._graphicsContext);\n if (physicsSettings.showAll || physicsSettings.showBroadphaseSpacePartitionDebug) {\n this._collisionSystem.debug(this._graphicsContext);\n }\n if (physicsSettings.showAll || physicsSettings.showCollisionContacts || physicsSettings.showCollisionNormals) {\n for (const [_, contact] of this._engine.debug.stats.currFrame.physics.contacts) {\n if (physicsSettings.showAll || physicsSettings.showCollisionContacts) {\n for (const point of contact.points) {\n this._graphicsContext.debug.drawPoint(point, {\n size: physicsSettings.contactSize,\n color: physicsSettings.collisionContactColor\n });\n }\n }\n if (physicsSettings.showAll || physicsSettings.showCollisionNormals) {\n for (const point of contact.points) {\n this._graphicsContext.debug.drawLine(point, contact.normal.scale(30).add(point), {\n color: physicsSettings.collisionNormalColor\n });\n }\n }\n }\n }\n this._graphicsContext.restore();\n if (cameraSettings) {\n this._graphicsContext.save();\n this._camera.draw(this._graphicsContext);\n if (cameraSettings.showAll || cameraSettings.showFocus) {\n this._graphicsContext.drawCircle(this._camera.pos, 4, cameraSettings.focusColor);\n }\n if (cameraSettings.showAll || cameraSettings.showZoom) {\n this._graphicsContext.debug.drawText(`zoom(${this._camera.zoom})`, this._camera.pos);\n }\n this._graphicsContext.restore();\n }\n this._graphicsContext.flush();\n }\n postupdate(engine, elapsed) {\n if (this._engine.isDebug) {\n this._graphicsContext.save();\n if (this._camera) {\n this._camera.draw(this._graphicsContext);\n }\n _Graphics_Debug__WEBPACK_IMPORTED_MODULE_13__.Debug.flush(this._graphicsContext);\n this._graphicsContext.restore();\n }\n }\n /**\n * This applies the current entity transform to the graphics context\n * @param entity\n */\n _applyTransform(entity) {\n const ancestors = entity.getAncestors();\n for (const ancestor of ancestors) {\n const transform = ancestor === null || ancestor === void 0 ? void 0 : ancestor.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n if (transform) {\n this._graphicsContext.translate(transform.pos.x, transform.pos.y);\n this._graphicsContext.scale(transform.scale.x, transform.scale.y);\n this._graphicsContext.rotate(transform.rotation);\n }\n }\n }\n /**\n * Applies the current camera transform if in world coordinates\n * @param transform\n */\n _pushCameraTransform(transform) {\n // Establish camera offset per entity\n if (transform.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_5__.CoordPlane.World) {\n this._graphicsContext.save();\n if (this._camera) {\n this._camera.draw(this._graphicsContext);\n }\n }\n }\n /**\n * Resets the current camera transform if in world coordinates\n * @param transform\n */\n _popCameraTransform(transform) {\n if (transform.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_5__.CoordPlane.World) {\n // Apply camera world offset\n this._graphicsContext.restore();\n }\n }\n}\nDebugSystem.priority = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_14__.SystemPriority.Lowest;\n\n\n/***/ }),\n\n/***/ \"./Debug/index.ts\":\n/*!************************!*\\\n !*** ./Debug/index.ts ***!\n \\************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ColorBlindFlags: () => (/* reexport safe */ _DebugFlags__WEBPACK_IMPORTED_MODULE_1__.ColorBlindFlags),\n/* harmony export */ DebugConfig: () => (/* reexport safe */ _DebugConfig__WEBPACK_IMPORTED_MODULE_0__.DebugConfig),\n/* harmony export */ DebugSystem: () => (/* reexport safe */ _DebugSystem__WEBPACK_IMPORTED_MODULE_2__.DebugSystem),\n/* harmony export */ FrameStats: () => (/* reexport safe */ _DebugConfig__WEBPACK_IMPORTED_MODULE_0__.FrameStats),\n/* harmony export */ PhysicsStats: () => (/* reexport safe */ _DebugConfig__WEBPACK_IMPORTED_MODULE_0__.PhysicsStats)\n/* harmony export */ });\n/* harmony import */ var _DebugConfig__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./DebugConfig */ \"./Debug/DebugConfig.ts\");\n/* harmony import */ var _DebugFlags__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./DebugFlags */ \"./Debug/DebugFlags.ts\");\n/* harmony import */ var _DebugSystem__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./DebugSystem */ \"./Debug/DebugSystem.ts\");\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Director/CrossFade.ts\":\n/*!*******************************!*\\\n !*** ./Director/CrossFade.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CrossFade: () => (/* binding */ CrossFade)\n/* harmony export */ });\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Graphics */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Transition__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Transition */ \"./Director/Transition.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n\n\n\n/**\n * CrossFades between the previous scene and the destination scene\n *\n * Note: CrossFade only works as an \"in\" transition\n */\nclass CrossFade extends _Transition__WEBPACK_IMPORTED_MODULE_0__.Transition {\n constructor(options) {\n super({ direction: 'in', ...options }); // default the correct direction\n this.name = `CrossFade#${this.id}`;\n }\n async onPreviousSceneDeactivate(scene) {\n this.image = await scene.engine.screenshot(true);\n // Firefox is particularly slow\n // needed in case the image isn't ready yet\n await this.image.decode();\n }\n onInitialize(engine) {\n this.engine = engine;\n this.transform.pos = engine.screen.unsafeArea.topLeft;\n this.screenCover = _Graphics__WEBPACK_IMPORTED_MODULE_1__.ImageSource.fromHtmlImageElement(this.image).toSprite();\n this.graphics.add(this.screenCover);\n // This is because we preserve hidpi res on the screen shot which COULD be bigger than the logical resolution\n this.transform.scale = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(1 / engine.screen.pixelRatio, 1 / engine.screen.pixelRatio);\n this.graphics.opacity = this.progress;\n }\n onStart(_progress) {\n this.graphics.opacity = this.progress;\n }\n onReset() {\n this.graphics.opacity = this.progress;\n }\n onEnd(progress) {\n this.graphics.opacity = progress;\n }\n onUpdate(progress) {\n this.graphics.opacity = progress;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Director/DefaultLoader.ts\":\n/*!***********************************!*\\\n !*** ./Director/DefaultLoader.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DefaultLoader: () => (/* binding */ DefaultLoader),\n/* harmony export */ LoaderEvents: () => (/* binding */ LoaderEvents),\n/* harmony export */ isLoaderConstructor: () => (/* binding */ isLoaderConstructor)\n/* harmony export */ });\n/* harmony import */ var _Util_WebAudio__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Util/WebAudio */ \"./Util/WebAudio.ts\");\n/* harmony import */ var _Graphics_Canvas__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Graphics/Canvas */ \"./Graphics/Canvas.ts\");\n/* harmony import */ var _Graphics_Filtering__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Graphics/Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Resources_Sound_Sound__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Resources/Sound/Sound */ \"./Resources/Sound/Sound.ts\");\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Util/Future */ \"./Util/Future.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Util/Util */ \"./Util/Util.ts\");\n\n\n\n\n\n\n\n\n\nconst LoaderEvents = {\n // Add event types here\n BeforeLoad: 'beforeload',\n AfterLoad: 'afterload',\n UserAction: 'useraction',\n LoadResourceStart: 'loadresourcestart',\n LoadResourceEnd: 'loadresourceend'\n};\n/**\n * Returns true if the constructor is for an Excalibur Loader\n */\nfunction isLoaderConstructor(x) {\n var _a, _b;\n return !!(x === null || x === void 0 ? void 0 : x.prototype) && !!((_b = (_a = x === null || x === void 0 ? void 0 : x.prototype) === null || _a === void 0 ? void 0 : _a.constructor) === null || _b === void 0 ? void 0 : _b.name);\n}\nclass DefaultLoader {\n get resources() {\n return this._resources;\n }\n /**\n * @param options Optionally provide the list of resources you want to load at constructor time\n */\n constructor(options) {\n var _a;\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n this.canvas = new _Graphics_Canvas__WEBPACK_IMPORTED_MODULE_1__.Canvas({\n filtering: _Graphics_Filtering__WEBPACK_IMPORTED_MODULE_2__.ImageFiltering.Blended,\n smoothing: true,\n cache: false,\n draw: this.onDraw.bind(this)\n });\n this._resources = [];\n this._numLoaded = 0;\n this._totalTimeMs = 0;\n this._loadingFuture = new _Util_Future__WEBPACK_IMPORTED_MODULE_3__.Future();\n if (options && ((_a = options.loadables) === null || _a === void 0 ? void 0 : _a.length)) {\n this.addResources(options.loadables);\n }\n }\n /**\n * Called by the engine before loading\n * @param engine\n */\n onInitialize(engine) {\n this.engine = engine;\n this.canvas.width = this.engine.screen.resolution.width;\n this.canvas.height = this.engine.screen.resolution.height;\n }\n /**\n * Return a promise that resolves when the user interacts with the loading screen in some way, usually a click.\n *\n * It's important to implement this in order to unlock the audio context in the browser. Browsers automatically prevent\n * audio from playing until the user performs an action.\n *\n */\n async onUserAction() {\n return await Promise.resolve();\n }\n /**\n * Overridable lifecycle method, called directly before loading starts\n */\n async onBeforeLoad() {\n // override me\n }\n /**\n * Overridable lifecycle method, called after loading has completed\n */\n async onAfterLoad() {\n // override me\n await (0,_Util_Util__WEBPACK_IMPORTED_MODULE_4__.delay)(500, this.engine.clock); // avoid a flicker\n }\n /**\n * Add a resource to the loader to load\n * @param loadable Resource to add\n */\n addResource(loadable) {\n this._resources.push(loadable);\n }\n /**\n * Add a list of resources to the loader to load\n * @param loadables The list of resources to load\n */\n addResources(loadables) {\n let i = 0;\n const len = loadables.length;\n for (i; i < len; i++) {\n this.addResource(loadables[i]);\n }\n }\n markResourceComplete() {\n this._numLoaded++;\n }\n /**\n * Returns the progress of the loader as a number between [0, 1] inclusive.\n */\n get progress() {\n const total = this._resources.length;\n return total > 0 ? (0,_Math_util__WEBPACK_IMPORTED_MODULE_5__.clamp)(this._numLoaded, 0, total) / total : 1;\n }\n /**\n * Returns true if the loader has completely loaded all resources\n */\n isLoaded() {\n return this._numLoaded === this._resources.length;\n }\n /**\n * Optionally override the onUpdate\n * @param engine\n * @param elapsed\n */\n onUpdate(engine, elapsed) {\n this._totalTimeMs += elapsed;\n // override me\n }\n /**\n * Optionally override the onDraw\n */\n onDraw(ctx) {\n const seconds = this._totalTimeMs / 1000;\n ctx.fillStyle = _Color__WEBPACK_IMPORTED_MODULE_6__.Color.Black.toRGBA();\n ctx.fillRect(0, 0, this.engine.screen.resolution.width, this.engine.screen.resolution.height);\n ctx.save();\n ctx.translate(this.engine.screen.resolution.width / 2, this.engine.screen.resolution.height / 2);\n const speed = seconds * 10;\n ctx.strokeStyle = 'white';\n ctx.lineWidth = 10;\n ctx.lineCap = 'round';\n ctx.arc(0, 0, 40, speed, speed + (Math.PI * 3) / 2);\n ctx.stroke();\n ctx.fillStyle = 'white';\n ctx.font = '16px sans-serif';\n const text = (this.progress * 100).toFixed(0) + '%';\n const textbox = ctx.measureText(text);\n const width = Math.abs(textbox.actualBoundingBoxLeft) + Math.abs(textbox.actualBoundingBoxRight);\n const height = Math.abs(textbox.actualBoundingBoxAscent) + Math.abs(textbox.actualBoundingBoxDescent);\n ctx.fillText(text, -width / 2, height / 2); // center\n ctx.restore();\n }\n areResourcesLoaded() {\n if (this._resources.length === 0) {\n // special case no resources mean loaded;\n return Promise.resolve();\n }\n return this._loadingFuture.promise;\n }\n /**\n * Not meant to be overridden\n *\n * Begin loading all of the supplied resources, returning a promise\n * that resolves when loading of all is complete AND the user has interacted with the loading screen\n */\n async load() {\n await this.onBeforeLoad();\n this.events.emit('beforeload');\n this.canvas.flagDirty();\n await Promise.all(this._resources.map(async (r) => {\n this.events.emit('loadresourcestart', r);\n await r.load().finally(() => {\n // capture progress\n this._numLoaded++;\n this.canvas.flagDirty();\n this.events.emit('loadresourceend', r);\n });\n }));\n // Wire all sound to the engine\n for (const resource of this._resources) {\n if (resource instanceof _Resources_Sound_Sound__WEBPACK_IMPORTED_MODULE_7__.Sound) {\n resource.wireEngine(this.engine);\n }\n }\n this._loadingFuture.resolve();\n this.canvas.flagDirty();\n // Unlock browser AudioContext in after user gesture\n // See: https://github.com/excaliburjs/Excalibur/issues/262\n // See: https://github.com/excaliburjs/Excalibur/issues/1031\n await this.onUserAction();\n this.events.emit('useraction');\n await _Util_WebAudio__WEBPACK_IMPORTED_MODULE_8__.WebAudio.unlock();\n await this.onAfterLoad();\n this.events.emit('afterload');\n return (this.data = this._resources);\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Director/Director.ts\":\n/*!******************************!*\\\n !*** ./Director/Director.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Director: () => (/* binding */ Director),\n/* harmony export */ DirectorEvents: () => (/* binding */ DirectorEvents)\n/* harmony export */ });\n/* harmony import */ var _DefaultLoader__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./DefaultLoader */ \"./Director/DefaultLoader.ts\");\n/* harmony import */ var _Scene__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Scene */ \"./Scene.ts\");\n/* harmony import */ var _Loader__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Loader */ \"./Director/Loader.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n\n\n\nconst DirectorEvents = {\n NavigationStart: 'navigationstart',\n Navigation: 'navigation',\n NavigationEnd: 'navigationend'\n};\n/**\n * The Director is responsible for managing scenes and changing scenes in Excalibur.\n *\n * It deals with transitions, scene loaders, switching scenes\n *\n * This is used internally by Excalibur, generally not mean to\n * be instantiated end users directly.\n */\nclass Director {\n /**\n * Gets whether the director currently transitioning between scenes\n *\n * Useful if you need to block behavior during transition\n */\n get isTransitioning() {\n return this._isTransitioning;\n }\n constructor(_engine, scenes) {\n this._engine = _engine;\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this._initialized = false;\n /**\n * All registered scenes in Excalibur\n */\n this.scenes = {};\n /**\n * Holds all instantiated scenes\n */\n this._sceneToInstance = new Map();\n this._sceneToLoader = new Map();\n this._sceneToTransition = new Map();\n /**\n * Used to keep track of scenes that have already been loaded so we don't load multiple times\n */\n this._loadedScenes = new Set();\n this._isTransitioning = false;\n this.rootScene = this.currentScene = new _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene();\n this.add('root', this.rootScene);\n this.currentScene = this.rootScene;\n this.currentSceneName = 'root';\n for (const sceneKey in scenes) {\n const sceneOrOptions = scenes[sceneKey];\n this.add(sceneKey, sceneOrOptions);\n if (sceneKey === 'root') {\n this.rootScene = this.getSceneInstance('root'); // always a root scene\n this.currentScene = this.rootScene;\n }\n }\n }\n /**\n * Initialize the director's internal state\n */\n async onInitialize() {\n if (!this._initialized) {\n this._initialized = true;\n if (this._deferredGoto) {\n const deferredScene = this._deferredGoto;\n this._deferredGoto = undefined;\n const deferredTransition = this._deferredTransition;\n this._deferredTransition = undefined;\n const deferredSceneInstance = this.getSceneInstance(deferredScene);\n if (deferredSceneInstance && deferredTransition) {\n deferredTransition._addToTargetScene(this._engine, deferredSceneInstance);\n }\n await this.swapScene(deferredScene);\n if (deferredSceneInstance && deferredTransition) {\n await this.playTransition(deferredTransition, deferredSceneInstance);\n }\n }\n else {\n await this.swapScene('root');\n }\n }\n }\n get isInitialized() {\n return this._initialized;\n }\n /**\n * Configures the start scene, and optionally the transition & loader for the director\n *\n * Typically this is called at the beginning of the game to the start scene and transition and never again.\n * @param startScene\n * @param options\n */\n configureStart(startScene, options) {\n const maybeLoaderOrCtor = options === null || options === void 0 ? void 0 : options.loader;\n if (maybeLoaderOrCtor instanceof _DefaultLoader__WEBPACK_IMPORTED_MODULE_3__.DefaultLoader) {\n this.mainLoader = maybeLoaderOrCtor;\n }\n else if ((0,_DefaultLoader__WEBPACK_IMPORTED_MODULE_3__.isLoaderConstructor)(maybeLoaderOrCtor)) {\n this.mainLoader = new maybeLoaderOrCtor();\n }\n else {\n this.mainLoader = new _Loader__WEBPACK_IMPORTED_MODULE_4__.Loader();\n }\n let maybeStartTransition;\n if (options === null || options === void 0 ? void 0 : options.inTransition) {\n const { inTransition } = options;\n maybeStartTransition = inTransition;\n }\n this.startScene = startScene;\n // Fire and forget promise for the initial scene\n if (maybeStartTransition) {\n const startSceneInstance = this.getSceneInstance(this.startScene);\n if (startSceneInstance) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n maybeStartTransition._addToTargetScene(this._engine, startSceneInstance);\n this.swapScene(this.startScene).then(() => {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n return this.playTransition(maybeStartTransition, startSceneInstance);\n });\n }\n }\n else {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.swapScene(this.startScene);\n }\n this.currentSceneName = this.startScene;\n }\n _getLoader(sceneName) {\n return this._sceneToLoader.get(sceneName);\n }\n _getInTransition(sceneName) {\n var _a;\n const sceneOrRoute = this.scenes[sceneName];\n if (sceneOrRoute instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene || (0,_Scene__WEBPACK_IMPORTED_MODULE_2__.isSceneConstructor)(sceneOrRoute)) {\n return undefined;\n }\n return (_a = sceneOrRoute === null || sceneOrRoute === void 0 ? void 0 : sceneOrRoute.transitions) === null || _a === void 0 ? void 0 : _a.in;\n }\n _getOutTransition(sceneName) {\n var _a;\n const sceneOrRoute = this.scenes[sceneName];\n if (sceneOrRoute instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene || (0,_Scene__WEBPACK_IMPORTED_MODULE_2__.isSceneConstructor)(sceneOrRoute)) {\n return undefined;\n }\n return (_a = sceneOrRoute === null || sceneOrRoute === void 0 ? void 0 : sceneOrRoute.transitions) === null || _a === void 0 ? void 0 : _a.out;\n }\n getDeferredScene() {\n const maybeDeferred = this.getSceneDefinition(this._deferredGoto);\n if (this._deferredGoto && maybeDeferred) {\n return maybeDeferred;\n }\n return null;\n }\n /**\n * Returns a scene by name if it exists, might be the constructor and not the instance of a scene\n * @param name\n */\n getSceneDefinition(name) {\n const maybeScene = this.scenes[name];\n if (maybeScene instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene || (0,_Scene__WEBPACK_IMPORTED_MODULE_2__.isSceneConstructor)(maybeScene)) {\n return maybeScene;\n }\n else if (maybeScene) {\n return maybeScene.scene;\n }\n return undefined;\n }\n /**\n * Returns the name of the registered scene, null if none can be found\n * @param scene\n */\n getSceneName(scene) {\n for (const [name, maybeScene] of Object.entries(this.scenes)) {\n if (maybeScene instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene) {\n if (scene === maybeScene) {\n return name;\n }\n }\n else if (!(0,_Scene__WEBPACK_IMPORTED_MODULE_2__.isSceneConstructor)(maybeScene)) {\n if (scene === maybeScene.scene) {\n return name;\n }\n }\n }\n for (const [name, maybeScene] of Object.entries(this.scenes)) {\n if ((0,_Scene__WEBPACK_IMPORTED_MODULE_2__.isSceneConstructor)(maybeScene)) {\n if (scene.constructor === maybeScene) {\n return name;\n }\n }\n else if (!(maybeScene instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene)) {\n if (scene.constructor === maybeScene.scene) {\n return name;\n }\n }\n }\n return null;\n }\n /**\n * Returns the same Director, but asserts a scene DOES exist to the type system\n * @param name\n */\n assertAdded(name) {\n return this;\n }\n /**\n * Returns the same Director, but asserts a scene DOES NOT exist to the type system\n * @param name\n */\n assertRemoved(name) {\n return this;\n }\n /**\n * Adds additional Scenes to the game!\n * @param name\n * @param sceneOrRoute\n */\n add(name, sceneOrRoute) {\n if (!(sceneOrRoute instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene) && !(0,_Scene__WEBPACK_IMPORTED_MODULE_2__.isSceneConstructor)(sceneOrRoute)) {\n const { loader, transitions } = sceneOrRoute;\n const { in: inTransition, out: outTransition } = transitions !== null && transitions !== void 0 ? transitions : {};\n this._sceneToTransition.set(name, { in: inTransition, out: outTransition });\n if ((0,_DefaultLoader__WEBPACK_IMPORTED_MODULE_3__.isLoaderConstructor)(loader)) {\n this._sceneToLoader.set(name, new loader());\n }\n else if (loader) {\n this._sceneToLoader.set(name, loader);\n }\n }\n if (this.scenes[name]) {\n this._logger.warn('Scene', name, 'already exists overwriting');\n }\n this.scenes[name] = sceneOrRoute;\n return this.assertAdded(name);\n }\n remove(nameOrScene) {\n if (nameOrScene instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene || (0,_Scene__WEBPACK_IMPORTED_MODULE_2__.isSceneConstructor)(nameOrScene)) {\n const sceneOrCtor = nameOrScene;\n // remove scene\n for (const key in this.scenes) {\n if (this.scenes.hasOwnProperty(key)) {\n const potentialSceneOrOptions = this.scenes[key];\n let scene;\n if (potentialSceneOrOptions instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene || (0,_Scene__WEBPACK_IMPORTED_MODULE_2__.isSceneConstructor)(potentialSceneOrOptions)) {\n scene = potentialSceneOrOptions;\n }\n else {\n scene = potentialSceneOrOptions.scene;\n }\n if (scene === sceneOrCtor) {\n if (key === this.currentSceneName) {\n throw new Error(`Cannot remove a currently active scene: ${key}`);\n }\n this._sceneToInstance.delete(key);\n this._sceneToTransition.delete(key);\n this._sceneToLoader.delete(key);\n delete this.scenes[key];\n }\n }\n }\n }\n if (typeof nameOrScene === 'string') {\n if (nameOrScene === this.currentSceneName) {\n throw new Error(`Cannot remove a currently active scene: ${nameOrScene}`);\n }\n // remove scene\n this._sceneToInstance.delete(nameOrScene);\n this._sceneToTransition.delete(nameOrScene);\n this._sceneToLoader.delete(nameOrScene);\n delete this.scenes[nameOrScene];\n }\n }\n /**\n * Go to a specific scene, and optionally override loaders and transitions\n * @param destinationScene\n * @param options\n */\n async goToScene(destinationScene, options) {\n var _a, _b, _c, _d, _e, _f;\n const maybeDest = this.getSceneInstance(destinationScene);\n if (!maybeDest) {\n this._logger.warn(`Scene ${destinationScene} does not exist! Check the name, are you sure you added it?`);\n return;\n }\n const sourceSceneInstance = this.currentScene;\n const sourceScene = this.currentSceneName;\n const engineInputEnabled = (_b = (_a = this._engine.input) === null || _a === void 0 ? void 0 : _a.enabled) !== null && _b !== void 0 ? _b : true;\n this._isTransitioning = true;\n const maybeSourceOut = (_c = this.getSceneInstance(sourceScene)) === null || _c === void 0 ? void 0 : _c.onTransition('out');\n const maybeDestinationIn = maybeDest === null || maybeDest === void 0 ? void 0 : maybeDest.onTransition('in');\n options = {\n // Engine configuration then dynamic scene transitions\n ...{ sourceOut: (_d = this._getOutTransition(this.currentSceneName)) !== null && _d !== void 0 ? _d : maybeSourceOut },\n ...{ destinationIn: (_e = this._getInTransition(destinationScene)) !== null && _e !== void 0 ? _e : maybeDestinationIn },\n // Goto options\n ...options\n };\n const { sourceOut, destinationIn, sceneActivationData } = options;\n const outTransition = sourceOut !== null && sourceOut !== void 0 ? sourceOut : this._getOutTransition(this.currentSceneName);\n const inTransition = destinationIn !== null && destinationIn !== void 0 ? destinationIn : this._getInTransition(destinationScene);\n const hideLoader = (outTransition === null || outTransition === void 0 ? void 0 : outTransition.hideLoader) || (inTransition === null || inTransition === void 0 ? void 0 : inTransition.hideLoader);\n if (hideLoader) {\n // Start hidden loader early and take advantage of the transition\n // Don't await and block on a hidden loader\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.maybeLoadScene(destinationScene, hideLoader);\n }\n this._emitEvent('navigationstart', sourceScene, destinationScene);\n // Run the out transition on the current scene if present\n if (outTransition) {\n await this.playTransition(outTransition, sourceSceneInstance);\n }\n // Run the loader if present\n await this.maybeLoadScene(destinationScene, hideLoader);\n // Give incoming transition a chance to grab info from previous\n if (inTransition) {\n await inTransition.onPreviousSceneDeactivate(this.currentScene);\n }\n // Setup the in transition on the destination scene if present\n // this is important to it can be initialized with the\n if (inTransition) {\n inTransition._addToTargetScene(this._engine, maybeDest);\n }\n // Swap to the new scene\n // Runs scene lifecycle init and activate\n await this.swapScene(destinationScene, sceneActivationData);\n this._emitEvent('navigation', sourceScene, destinationScene);\n // Run the in transition on the new scene if present\n if (inTransition) {\n await this.playTransition(inTransition, maybeDest);\n }\n this._emitEvent('navigationend', sourceScene, destinationScene);\n (_f = this._engine.input) === null || _f === void 0 ? void 0 : _f.toggleEnabled(engineInputEnabled);\n this._isTransitioning = false;\n }\n /**\n * Retrieves a scene instance by key if it's registered.\n *\n * This will call any constructors that were given as a definition\n * @param scene\n */\n getSceneInstance(scene) {\n const sceneDefinition = this.getSceneDefinition(scene);\n if (!sceneDefinition) {\n return undefined;\n }\n if (this._sceneToInstance.has(scene)) {\n return this._sceneToInstance.get(scene);\n }\n if (sceneDefinition instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene) {\n this._sceneToInstance.set(scene, sceneDefinition);\n return sceneDefinition;\n }\n const newScene = new sceneDefinition();\n this._sceneToInstance.set(scene, newScene);\n return newScene;\n }\n /**\n * Triggers scene loading if has not already been loaded\n * @param scene\n * @param hideLoader\n */\n async maybeLoadScene(scene, hideLoader = false) {\n var _a;\n const loader = (_a = this._getLoader(scene)) !== null && _a !== void 0 ? _a : new _DefaultLoader__WEBPACK_IMPORTED_MODULE_3__.DefaultLoader();\n const sceneToLoad = this.getSceneDefinition(scene);\n const sceneToLoadInstance = this.getSceneInstance(scene);\n if (sceneToLoad && sceneToLoadInstance && !this._loadedScenes.has(sceneToLoadInstance)) {\n sceneToLoadInstance.onPreLoad(loader);\n sceneToLoadInstance.events.emit('preload', { loader });\n if (hideLoader) {\n // Don't await a hidden loader\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this._engine.load(loader, hideLoader);\n }\n else {\n await this._engine.load(loader);\n }\n this._loadedScenes.add(sceneToLoadInstance);\n }\n }\n /**\n * Plays a transition in the current scene and does book keeping for input.\n * @param transition\n */\n async playTransition(transition, targetScene) {\n var _a, _b, _c, _d, _e, _f, _g;\n if (!this.isInitialized) {\n this._deferredTransition = transition;\n return;\n }\n if (transition) {\n this.currentTransition = transition;\n const sceneInputEnabled = (_b = (_a = targetScene.input) === null || _a === void 0 ? void 0 : _a.enabled) !== null && _b !== void 0 ? _b : true;\n (_c = targetScene.input) === null || _c === void 0 ? void 0 : _c.toggleEnabled(!transition.blockInput);\n (_d = this._engine.input) === null || _d === void 0 ? void 0 : _d.toggleEnabled(!transition.blockInput);\n this.currentTransition._addToTargetScene(this._engine, targetScene);\n await this.currentTransition._play();\n (_e = targetScene.input) === null || _e === void 0 ? void 0 : _e.toggleEnabled(sceneInputEnabled);\n }\n (_f = this.currentTransition) === null || _f === void 0 ? void 0 : _f.kill();\n (_g = this.currentTransition) === null || _g === void 0 ? void 0 : _g.reset();\n this.currentTransition = undefined;\n }\n /**\n * Swaps the current and destination scene after performing required lifecycle events\n * @param destinationScene\n * @param data\n */\n async swapScene(destinationScene, data) {\n const engine = this._engine;\n // if not yet initialized defer goToScene\n if (!this.isInitialized) {\n this._deferredGoto = destinationScene;\n return;\n }\n const maybeDest = this.getSceneInstance(destinationScene);\n if (maybeDest) {\n const previousScene = this.currentScene;\n const nextScene = maybeDest;\n this._logger.debug('Going to scene:', destinationScene);\n // only deactivate when initialized\n if (this.currentScene.isInitialized) {\n const context = { engine, previousScene, nextScene };\n await this.currentScene._deactivate(context);\n this.currentScene.events.emit('deactivate', new _Events__WEBPACK_IMPORTED_MODULE_5__.DeactivateEvent(context, this.currentScene));\n this.currentScene.input.clear();\n }\n // wait for the scene to be loaded if needed\n const destLoader = this._sceneToLoader.get(destinationScene);\n await (destLoader === null || destLoader === void 0 ? void 0 : destLoader.areResourcesLoaded());\n // set current scene to new one\n this.currentScene = nextScene;\n this.currentSceneName = destinationScene;\n engine.screen.setCurrentCamera(nextScene.camera);\n // initialize the current scene if has not been already\n await this.currentScene._initialize(engine);\n const context = { engine, previousScene, nextScene, data };\n await this.currentScene._activate(context);\n this.currentScene.events.emit('activate', new _Events__WEBPACK_IMPORTED_MODULE_5__.ActivateEvent(context, this.currentScene));\n }\n else {\n this._logger.error('Scene', destinationScene, 'does not exist!');\n }\n }\n _emitEvent(eventName, sourceScene, destinationScene) {\n const source = this.getSceneDefinition(sourceScene);\n const dest = this.getSceneDefinition(destinationScene);\n this.events.emit(eventName, {\n sourceScene: source,\n sourceName: sourceScene,\n destinationScene: dest,\n destinationName: destinationScene\n });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Director/FadeInOut.ts\":\n/*!*******************************!*\\\n !*** ./Director/FadeInOut.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FadeInOut: () => (/* binding */ FadeInOut)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Graphics */ \"./Graphics/Rectangle.ts\");\n/* harmony import */ var _Transition__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Transition */ \"./Director/Transition.ts\");\n\n\n\nclass FadeInOut extends _Transition__WEBPACK_IMPORTED_MODULE_0__.Transition {\n constructor(options) {\n var _a, _b;\n super({\n ...options,\n duration: (_a = options.duration) !== null && _a !== void 0 ? _a : 2000\n });\n this.name = `FadeInOut#${this.id}`;\n this.color = (_b = options.color) !== null && _b !== void 0 ? _b : _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Black;\n }\n onInitialize(engine) {\n this.transform.pos = engine.screen.unsafeArea.topLeft;\n this.screenCover = new _Graphics__WEBPACK_IMPORTED_MODULE_2__.Rectangle({\n width: engine.screen.resolution.width,\n height: engine.screen.resolution.height,\n color: this.color\n });\n this.graphics.add(this.screenCover);\n this.graphics.opacity = this.progress;\n }\n onReset() {\n this.graphics.opacity = this.progress;\n }\n onStart(progress) {\n this.graphics.opacity = progress;\n }\n onEnd(progress) {\n this.graphics.opacity = progress;\n }\n onUpdate(progress) {\n this.graphics.opacity = progress;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Director/Loader.ts\":\n/*!****************************!*\\\n !*** ./Director/Loader.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Loader: () => (/* binding */ Loader)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Util_DrawUtil__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Util/DrawUtil */ \"./Util/DrawUtil.ts\");\n/* harmony import */ var _Loader_logo_png__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Loader.logo.png */ \"./Director/Loader.logo.png\");\n/* harmony import */ var _Loader_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Loader.css */ \"./Director/Loader.css\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Util/Util */ \"./Util/Util.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _DefaultLoader__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./DefaultLoader */ \"./Director/DefaultLoader.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Util/Future */ \"./Util/Future.ts\");\n\n\n\n\n\n\n\n\n\n/**\n * Pre-loading assets\n *\n * The loader provides a mechanism to preload multiple resources at\n * one time. The loader must be passed to the engine in order to\n * trigger the loading progress bar.\n *\n * The {@apilink Loader} itself implements {@apilink Loadable} so you can load loaders.\n *\n * ## Example: Pre-loading resources for a game\n *\n * ```js\n * // create a loader\n * var loader = new ex.Loader();\n *\n * // create a resource dictionary (best practice is to keep a separate file)\n * var resources = {\n * TextureGround: new ex.Texture(\"/images/textures/ground.png\"),\n * SoundDeath: new ex.Sound(\"/sound/death.wav\", \"/sound/death.mp3\")\n * };\n *\n * // loop through dictionary and add to loader\n * for (var loadable in resources) {\n * if (resources.hasOwnProperty(loadable)) {\n * loader.addResource(resources[loadable]);\n * }\n * }\n *\n * // start game\n * game.start(loader).then(function () {\n * console.log(\"Game started!\");\n * });\n * ```\n *\n * ## Customize the Loader\n *\n * The loader can be customized to show different, text, logo, background color, and button.\n *\n * ```typescript\n * const loader = new ex.Loader([playerTexture]);\n *\n * // The loaders button text can simply modified using this\n * loader.playButtonText = 'Start the best game ever';\n *\n * // The logo can be changed by inserting a base64 image string here\n *\n * loader.logo = 'data:image/png;base64,iVBORw...';\n * loader.logoWidth = 15;\n * loader.logoHeight = 14;\n *\n * // The background color can be changed like so by supplying a valid CSS color string\n *\n * loader.backgroundColor = 'red'\n * loader.backgroundColor = '#176BAA'\n *\n * // To build a completely new button\n * loader.startButtonFactory = () => {\n * let myButton = document.createElement('button');\n * myButton.textContent = 'The best button';\n * return myButton;\n * };\n *\n * engine.start(loader).then(() => {});\n * ```\n */\nclass Loader extends _DefaultLoader__WEBPACK_IMPORTED_MODULE_0__.DefaultLoader {\n get _image() {\n if (!this._imageElement) {\n this._imageElement = new Image();\n this._imageElement.onload = () => this._imageLoaded.resolve();\n this._imageElement.src = this.logo;\n }\n return this._imageElement;\n }\n get playButtonRootElement() {\n return this._playButtonRootElement;\n }\n get playButtonElement() {\n return this._playButtonElement;\n }\n get _playButton() {\n const existingRoot = document.getElementById('excalibur-play-root');\n if (existingRoot) {\n this._playButtonRootElement = existingRoot;\n }\n if (!this._playButtonRootElement) {\n this._playButtonRootElement = document.createElement('div');\n this._playButtonRootElement.id = 'excalibur-play-root';\n this._playButtonRootElement.style.position = 'absolute';\n document.body.appendChild(this._playButtonRootElement);\n }\n if (!this._styleBlock) {\n this._styleBlock = document.createElement('style');\n this._styleBlock.textContent = this._playButtonStyles;\n document.head.appendChild(this._styleBlock);\n }\n if (!this._playButtonElement) {\n this._playButtonElement = this.startButtonFactory();\n this._playButtonRootElement.appendChild(this._playButtonElement);\n }\n return this._playButtonElement;\n }\n constructor(loadablesOrOptions) {\n const options = Array.isArray(loadablesOrOptions)\n ? {\n loadables: loadablesOrOptions\n }\n : loadablesOrOptions;\n super(options);\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this._originalOptions = { loadables: [] };\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_2__.EventEmitter();\n this._playButtonShown = false;\n // logo drawing stuff\n // base64 string encoding of the excalibur logo (logo-white.png)\n this.logo = _Loader_logo_png__WEBPACK_IMPORTED_MODULE_3__[\"default\"];\n this.logoWidth = 468;\n this.logoHeight = 118;\n /**\n * Gets or sets the color of the loading bar, default is {@apilink Color.White}\n */\n this.loadingBarColor = _Color__WEBPACK_IMPORTED_MODULE_4__.Color.White;\n /**\n * Gets or sets the background color of the loader as a hex string\n */\n this.backgroundColor = '#176BAA';\n this._imageLoaded = new _Util_Future__WEBPACK_IMPORTED_MODULE_5__.Future();\n this.suppressPlayButton = false;\n /** Loads the css from Loader.css */\n this._playButtonStyles = _Loader_css__WEBPACK_IMPORTED_MODULE_6__[\"default\"].toString();\n /**\n * Get/set play button text\n */\n this.playButtonText = 'Play game';\n /**\n * Return a html button element for excalibur to use as a play button\n */\n this.startButtonFactory = () => {\n let buttonElement = document.getElementById('excalibur-play');\n if (!buttonElement) {\n buttonElement = document.createElement('button');\n }\n buttonElement.id = 'excalibur-play';\n buttonElement.textContent = this.playButtonText;\n buttonElement.style.display = 'none';\n return buttonElement;\n };\n this._originalOptions = { ...Loader._DEFAULT_LOADER_OPTIONS, ...options };\n }\n onInitialize(engine) {\n this.engine = engine;\n this.screen = engine.screen;\n this.canvas.width = this.engine.canvas.width;\n this.canvas.height = this.engine.canvas.height;\n this.screen.events.on('resize', () => {\n this.canvas.width = this.engine.canvas.width;\n this.canvas.height = this.engine.canvas.height;\n });\n }\n /**\n * Shows the play button and returns a promise that resolves when clicked\n */\n async showPlayButton() {\n var _a, _b;\n if (this.suppressPlayButton) {\n this.hidePlayButton();\n // Delay is to give the logo a chance to show, otherwise don't delay\n await (0,_Util_Util__WEBPACK_IMPORTED_MODULE_7__.delay)(500, (_a = this.engine) === null || _a === void 0 ? void 0 : _a.clock);\n }\n else {\n const resizeHandler = () => {\n try {\n this._positionPlayButton();\n }\n catch (_a) {\n // swallow if can't position\n }\n };\n if ((_b = this.engine) === null || _b === void 0 ? void 0 : _b.browser) {\n this.engine.browser.window.on('resize', resizeHandler);\n }\n this._playButtonShown = true;\n this._playButton.style.display = 'block';\n document.body.addEventListener('keyup', (evt) => {\n if (evt.key === 'Enter') {\n this._playButton.click();\n }\n });\n this._positionPlayButton();\n const playButtonClicked = new Promise((resolve) => {\n const startButtonHandler = (e) => {\n var _a;\n // We want to stop propagation to keep bubbling to the engine pointer handlers\n e.stopPropagation();\n // Hide Button after click\n this.hidePlayButton();\n if ((_a = this.engine) === null || _a === void 0 ? void 0 : _a.browser) {\n this.engine.browser.window.off('resize', resizeHandler);\n }\n if (this._originalOptions.fullscreenAfterLoad) {\n try {\n this._logger.info('requesting fullscreen');\n if (this._originalOptions.fullscreenContainer instanceof HTMLElement) {\n this._originalOptions.fullscreenContainer.requestFullscreen();\n }\n else {\n this.engine.screen.goFullScreen(this._originalOptions.fullscreenContainer);\n }\n }\n catch (error) {\n this._logger.error('could not go fullscreen', error);\n }\n }\n resolve();\n };\n this._playButton.addEventListener('click', startButtonHandler);\n this._playButton.addEventListener('touchend', startButtonHandler);\n this._playButton.addEventListener('pointerup', startButtonHandler);\n });\n return await playButtonClicked;\n }\n }\n hidePlayButton() {\n this._playButtonShown = false;\n this._playButton.style.display = 'none';\n }\n /**\n * Clean up generated elements for the loader\n */\n dispose() {\n if (this._playButtonRootElement.parentElement) {\n this._playButtonRootElement.removeChild(this._playButtonElement);\n document.body.removeChild(this._playButtonRootElement);\n document.head.removeChild(this._styleBlock);\n this._playButtonRootElement = null;\n this._playButtonElement = null;\n this._styleBlock = null;\n }\n }\n async onUserAction() {\n var _a;\n // short delay in showing the button for aesthetics\n await (0,_Util_Util__WEBPACK_IMPORTED_MODULE_7__.delay)(200, (_a = this.engine) === null || _a === void 0 ? void 0 : _a.clock);\n this.canvas.flagDirty();\n // show play button\n await this.showPlayButton();\n }\n async onBeforeLoad() {\n this.screen.pushResolutionAndViewport();\n this.screen.resolution = { width: this.canvas.width, height: this.canvas.height };\n this.screen.applyResolutionAndViewport();\n const image = this._image;\n await this._imageLoaded.promise;\n await (image === null || image === void 0 ? void 0 : image.decode()); // decode logo if it exists\n }\n // eslint-disable-next-line require-await\n async onAfterLoad() {\n this.screen.popResolutionAndViewport();\n this.screen.applyResolutionAndViewport();\n this.dispose();\n }\n _positionPlayButton() {\n if (this.engine) {\n const { x: left, y: top, width: screenWidth, height: screenHeight } = this.engine.canvas.getBoundingClientRect();\n if (this._playButtonRootElement) {\n const buttonWidth = this._playButton.clientWidth;\n const buttonHeight = this._playButton.clientHeight;\n if (this.playButtonPosition) {\n this._playButtonRootElement.style.left = `${this.playButtonPosition.x}px`;\n this._playButtonRootElement.style.top = `${this.playButtonPosition.y}px`;\n }\n else {\n this._playButtonRootElement.style.left = `${left + screenWidth / 2 - buttonWidth / 2}px`;\n this._playButtonRootElement.style.top = `${top + screenHeight / 2 - buttonHeight / 2 + 100}px`;\n }\n }\n }\n }\n /**\n * Loader draw function. Draws the default Excalibur loading screen.\n * Override `logo`, `logoWidth`, `logoHeight` and `backgroundColor` properties\n * to customize the drawing, or just override entire method.\n */\n onDraw(ctx) {\n const canvasHeight = this.engine.canvasHeight / this.engine.pixelRatio;\n const canvasWidth = this.engine.canvasWidth / this.engine.pixelRatio;\n this._positionPlayButton();\n ctx.fillStyle = this.backgroundColor;\n ctx.fillRect(0, 0, canvasWidth, canvasHeight);\n let logoY = canvasHeight / 2;\n const width = Math.min(this.logoWidth, canvasWidth * 0.75);\n let logoX = canvasWidth / 2 - width / 2;\n if (this.logoPosition) {\n logoX = this.logoPosition.x;\n logoY = this.logoPosition.y;\n }\n const imageHeight = Math.floor(width * (this.logoHeight / this.logoWidth)); // OG height/width factor\n const oldAntialias = this.engine.screen.antialiasing;\n this.engine.screen.antialiasing = true;\n if (!this.logoPosition) {\n ctx.drawImage(this._image, 0, 0, this.logoWidth, this.logoHeight, logoX, logoY - imageHeight - 20, width, imageHeight);\n }\n else {\n ctx.drawImage(this._image, 0, 0, this.logoWidth, this.logoHeight, logoX, logoY, width, imageHeight);\n }\n // loading box\n if (!this.suppressPlayButton && this._playButtonShown) {\n this.engine.screen.antialiasing = oldAntialias;\n return;\n }\n let loadingX = logoX;\n let loadingY = logoY;\n if (this.loadingBarPosition) {\n loadingX = this.loadingBarPosition.x;\n loadingY = this.loadingBarPosition.y;\n }\n ctx.lineWidth = 2;\n _Util_DrawUtil__WEBPACK_IMPORTED_MODULE_8__.roundRect(ctx, loadingX, loadingY, width, 20, 10, this.loadingBarColor);\n const progress = width * this.progress;\n const margin = 5;\n const progressWidth = progress - margin * 2;\n const height = 20 - margin * 2;\n _Util_DrawUtil__WEBPACK_IMPORTED_MODULE_8__.roundRect(ctx, loadingX + margin, loadingY + margin, progressWidth > 10 ? progressWidth : 10, height, 5, null, this.loadingBarColor);\n this.engine.screen.antialiasing = oldAntialias;\n }\n}\nLoader._DEFAULT_LOADER_OPTIONS = {\n loadables: [],\n fullscreenAfterLoad: false,\n fullscreenContainer: undefined\n};\n\n\n/***/ }),\n\n/***/ \"./Director/Slide.ts\":\n/*!***************************!*\\\n !*** ./Director/Slide.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Slide: () => (/* binding */ Slide)\n/* harmony export */ });\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Graphics */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Transition__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Transition */ \"./Director/Transition.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/EasingFunctions */ \"./Util/EasingFunctions.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Math/coord-plane */ \"./Math/coord-plane.ts\");\n\n\n\n\n\n/**\n * Slide`s between the previous scene and the destination scene\n *\n * Note: Slide` only works as an \"in\" transition\n */\nclass Slide extends _Transition__WEBPACK_IMPORTED_MODULE_0__.Transition {\n constructor(options) {\n var _a;\n super({ direction: 'in', ...options }); // default the correct direction\n this._easing = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_1__.EasingFunctions.Linear;\n this.name = `Slide#${this.id}`;\n this.slideDirection = options.slideDirection;\n this.transform.coordPlane = _Math_coord_plane__WEBPACK_IMPORTED_MODULE_2__.CoordPlane.World;\n this.graphics.forceOnScreen = true;\n this._easing = (_a = options.easingFunction) !== null && _a !== void 0 ? _a : this._easing;\n this._vectorEasing = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_1__.EasingFunctions.CreateVectorEasingFunction(this._easing);\n }\n async onPreviousSceneDeactivate(scene) {\n this._image = await scene.engine.screenshot(true);\n // Firefox is particularly slow\n // needed in case the image isn't ready yet\n await this._image.decode();\n this._screenCover = _Graphics__WEBPACK_IMPORTED_MODULE_3__.ImageSource.fromHtmlImageElement(this._image).toSprite();\n }\n onInitialize(engine) {\n this._engine = engine;\n switch (this.slideDirection) {\n case 'up': {\n this._directionOffset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(0, -engine.screen.resolution.height);\n break;\n }\n case 'down': {\n this._directionOffset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(0, engine.screen.resolution.height);\n break;\n }\n case 'left': {\n this._directionOffset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(-engine.screen.resolution.width, 0);\n break;\n }\n case 'right': {\n this._directionOffset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(engine.screen.resolution.width, 0);\n break;\n }\n }\n this._camera = this._engine.currentScene.camera;\n this._destinationCameraPosition = this._camera.pos.clone();\n // For sliding shift the camera and the transition slide by offset\n this._camera.pos = this._camera.pos.add(this._directionOffset);\n this.transform.pos = this.transform.pos.add(this._directionOffset);\n this._startCameraPosition = this._camera.pos.clone();\n this.graphics.use(this._screenCover);\n // This is because we preserve hidpi res on the screen shot which COULD be bigger than the logical resolution\n this.transform.scale = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(1 / engine.screen.pixelRatio, 1 / engine.screen.pixelRatio);\n }\n onUpdate(progress) {\n // in-transitions count down from 1 -> 0, so our \"end\" is swapped\n this._camera.pos = this._vectorEasing(progress, this._destinationCameraPosition, this._startCameraPosition, 1);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Director/Transition.ts\":\n/*!********************************!*\\\n !*** ./Director/Transition.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Transition: () => (/* binding */ Transition)\n/* harmony export */ });\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Util/Future */ \"./Util/Future.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Graphics */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Math/coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Util/EasingFunctions */ \"./Util/EasingFunctions.ts\");\n/* harmony import */ var _Util_Coroutine__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../Util/Coroutine */ \"./Util/Coroutine.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n\n\n\n\n\n\n\n\n\n/**\n * Base Transition that can be extended to provide custom scene transitions in Excalibur.\n */\nclass Transition extends _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_0__.Entity {\n /**\n * Returns a number between [0, 1] indicating what state the transition is in.\n *\n * * For 'out' direction transitions start at 0 and end at 1\n * * For 'in' direction transitions start at 1 and end at 0\n */\n get progress() {\n return this._currentProgress;\n }\n get complete() {\n if (this.direction === 'out') {\n return this.progress >= 1;\n }\n else {\n return this.progress <= 0;\n }\n }\n constructor(options) {\n var _a, _b, _c, _d;\n super();\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this.transform = new _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_2__.TransformComponent();\n this.graphics = new _Graphics__WEBPACK_IMPORTED_MODULE_3__.GraphicsComponent();\n this._completeFuture = new _Util_Future__WEBPACK_IMPORTED_MODULE_4__.Future();\n // State needs to be reset between uses\n this.started = false;\n this._currentDistance = 0;\n this._currentProgress = 0;\n this.done = this._completeFuture.promise;\n this.name = `Transition#${this.id}`;\n this.duration = options.duration;\n this.easing = (_a = options.easing) !== null && _a !== void 0 ? _a : _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_5__.EasingFunctions.Linear;\n this.direction = (_b = options.direction) !== null && _b !== void 0 ? _b : 'out';\n this.hideLoader = (_c = options.hideLoader) !== null && _c !== void 0 ? _c : false;\n this.blockInput = (_d = options.blockInput) !== null && _d !== void 0 ? _d : false;\n this.transform.coordPlane = _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__.CoordPlane.Screen;\n this.transform.pos = _Math_vector__WEBPACK_IMPORTED_MODULE_7__.Vector.Zero;\n this.transform.z = Infinity; // Transitions sit on top of everything\n this.graphics.anchor = _Math_vector__WEBPACK_IMPORTED_MODULE_7__.Vector.Zero;\n this.addComponent(this.transform);\n this.addComponent(this.graphics);\n if (this.direction === 'out') {\n this._currentProgress = 0;\n }\n else {\n this._currentProgress = 1;\n }\n }\n /**\n * Overridable lifecycle method, called before each update.\n *\n * **WARNING BE SURE** to call `super.updateTransition()` if overriding in your own custom implementation\n * @param engine\n * @param elapsed\n */\n updateTransition(engine, elapsed) {\n if (this.complete) {\n return;\n }\n this._currentDistance += (0,_Math_util__WEBPACK_IMPORTED_MODULE_8__.clamp)(elapsed / this.duration, 0, 1);\n if (this._currentDistance >= 1) {\n this._currentDistance = 1;\n }\n if (this.direction === 'out') {\n this._currentProgress = (0,_Math_util__WEBPACK_IMPORTED_MODULE_8__.clamp)(this.easing(this._currentDistance, 0, 1, 1), 0, 1);\n }\n else {\n this._currentProgress = (0,_Math_util__WEBPACK_IMPORTED_MODULE_8__.clamp)(this.easing(this._currentDistance, 1, 0, 1), 0, 1);\n }\n }\n /**\n * Overridable lifecycle method, called right before the previous scene has deactivated.\n *\n * This gives incoming transition a chance to grab info from previous scene if desired\n * @param scene\n */\n async onPreviousSceneDeactivate(scene) {\n // override me\n }\n /**\n * Overridable lifecycle method, called once at the beginning of the transition\n *\n * `progress` is given between 0 and 1\n * @param progress\n */\n onStart(progress) {\n // override me\n }\n /**\n * Overridable lifecycle method, called every frame of the transition\n *\n * `progress` is given between 0 and 1\n * @param progress\n */\n onUpdate(progress) {\n // override me\n }\n /**\n * Overridable lifecycle method, called at the end of the transition,\n *\n * `progress` is given between 0 and 1\n * @param progress\n */\n onEnd(progress) {\n // override me\n }\n /**\n * Overridable lifecycle method, called when the transition is reset\n *\n * Use this to override and provide your own reset logic for internal state in custom transition implementations\n */\n onReset() {\n // override me\n }\n /**\n * reset() is called by the engine to reset transitions\n */\n reset() {\n this.started = false;\n this._completeFuture = new _Util_Future__WEBPACK_IMPORTED_MODULE_4__.Future();\n this.done = this._completeFuture.promise;\n this._currentDistance = 0;\n if (this.direction === 'out') {\n this._currentProgress = 0;\n }\n else {\n this._currentProgress = 1;\n }\n this.onReset();\n }\n /**\n * @internal\n */\n _addToTargetScene(engine, targetScene) {\n const currentScene = targetScene;\n if (this.started) {\n this._logger.warn(`Attempted to add a transition ${this.name} that is already playing.`);\n }\n if (currentScene.world.entityManager.getById(this.id)) {\n return this._co;\n }\n this._engine = engine;\n currentScene.add(this);\n const self = this;\n this._co = (0,_Util_Coroutine__WEBPACK_IMPORTED_MODULE_9__.coroutine)(engine, function* () {\n while (!self.complete) {\n const elapsed = yield; // per frame\n self.updateTransition(self._engine, elapsed);\n self._execute();\n }\n }, {\n autostart: false\n });\n return this._co;\n }\n /**\n * Called internally by excalibur to swap scenes with transition\n * @internal\n */\n async _play() {\n if (this.started) {\n this.reset();\n this._logger.warn(`Attempted to play a transition ${this.name} that is already playing, reset transition.`);\n }\n if (!this._engine || !this._co) {\n this.reset();\n this._logger.warn(`Attempted to play a transition ${this.name} that hasn't been added`);\n }\n if (this._co) {\n await this._co.start();\n }\n }\n /**\n * execute() is called by the engine every frame to update the Transition lifecycle onStart/onUpdate/onEnd\n * @internal\n */\n _execute() {\n if (!this.isInitialized) {\n return;\n }\n if (!this.started) {\n this.started = true;\n this.onStart(this.progress);\n }\n this.onUpdate(this.progress);\n if (this.complete && !this._completeFuture.isCompleted) {\n this.onEnd(this.progress);\n this._completeFuture.resolve();\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Director/index.ts\":\n/*!***************************!*\\\n !*** ./Director/index.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CrossFade: () => (/* reexport safe */ _CrossFade__WEBPACK_IMPORTED_MODULE_2__.CrossFade),\n/* harmony export */ DefaultLoader: () => (/* reexport safe */ _DefaultLoader__WEBPACK_IMPORTED_MODULE_6__.DefaultLoader),\n/* harmony export */ Director: () => (/* reexport safe */ _Director__WEBPACK_IMPORTED_MODULE_4__.Director),\n/* harmony export */ DirectorEvents: () => (/* reexport safe */ _Director__WEBPACK_IMPORTED_MODULE_4__.DirectorEvents),\n/* harmony export */ FadeInOut: () => (/* reexport safe */ _FadeInOut__WEBPACK_IMPORTED_MODULE_1__.FadeInOut),\n/* harmony export */ Loader: () => (/* reexport safe */ _Loader__WEBPACK_IMPORTED_MODULE_5__.Loader),\n/* harmony export */ LoaderEvents: () => (/* reexport safe */ _DefaultLoader__WEBPACK_IMPORTED_MODULE_6__.LoaderEvents),\n/* harmony export */ Slide: () => (/* reexport safe */ _Slide__WEBPACK_IMPORTED_MODULE_3__.Slide),\n/* harmony export */ Transition: () => (/* reexport safe */ _Transition__WEBPACK_IMPORTED_MODULE_0__.Transition),\n/* harmony export */ isLoaderConstructor: () => (/* reexport safe */ _DefaultLoader__WEBPACK_IMPORTED_MODULE_6__.isLoaderConstructor)\n/* harmony export */ });\n/* harmony import */ var _Transition__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Transition */ \"./Director/Transition.ts\");\n/* harmony import */ var _FadeInOut__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./FadeInOut */ \"./Director/FadeInOut.ts\");\n/* harmony import */ var _CrossFade__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./CrossFade */ \"./Director/CrossFade.ts\");\n/* harmony import */ var _Slide__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Slide */ \"./Director/Slide.ts\");\n/* harmony import */ var _Director__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Director */ \"./Director/Director.ts\");\n/* harmony import */ var _Loader__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Loader */ \"./Director/Loader.ts\");\n/* harmony import */ var _DefaultLoader__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./DefaultLoader */ \"./Director/DefaultLoader.ts\");\n\n\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Engine.ts\":\n/*!*******************!*\\\n !*** ./Engine.ts ***!\n \\*******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Engine: () => (/* binding */ Engine),\n/* harmony export */ EngineEvents: () => (/* binding */ EngineEvents),\n/* harmony export */ ScrollPreventionMode: () => (/* binding */ ScrollPreventionMode)\n/* harmony export */ });\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ */ \"./index.ts\");\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Util/Future */ \"./Util/Future.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Input_PointerScope__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./Input/PointerScope */ \"./Input/PointerScope.ts\");\n/* harmony import */ var _Flags__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Flags */ \"./Flags.ts\");\n/* harmony import */ var _Polyfill__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Polyfill */ \"./Polyfill.ts\");\n/* harmony import */ var _Screen__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Screen */ \"./Screen.ts\");\n/* harmony import */ var _Director_DefaultLoader__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./Director/DefaultLoader */ \"./Director/DefaultLoader.ts\");\n/* harmony import */ var _Director_Loader__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./Director/Loader */ \"./Director/Loader.ts\");\n/* harmony import */ var _Util_Detector__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Util/Detector */ \"./Util/Detector.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./Events */ \"./Events.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./Color */ \"./Color.ts\");\n/* harmony import */ var _Scene__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./Scene */ \"./Scene.ts\");\n/* harmony import */ var _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./EntityComponentSystem/Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _Debug_DebugConfig__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./Debug/DebugConfig */ \"./Debug/DebugConfig.ts\");\n/* harmony import */ var _Util_Browser__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Util/Browser */ \"./Util/Browser.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Graphics */ \"./Graphics/Context/ExcaliburGraphicsContext.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Graphics */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Graphics */ \"./Graphics/Context/ExcaliburGraphicsContext2DCanvas.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Graphics */ \"./Graphics/Context/texture-loader.ts\");\n/* harmony import */ var _Util_Clock__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./Util/Clock */ \"./Util/Clock.ts\");\n/* harmony import */ var _Graphics_Filtering__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Graphics/Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Graphics_GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./Graphics/GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n/* harmony import */ var _Util_Toaster__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Util/Toaster */ \"./Util/Toaster.ts\");\n/* harmony import */ var _Director_Director__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./Director/Director */ \"./Director/Director.ts\");\n/* harmony import */ var _Input_InputHost__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./Input/InputHost */ \"./Input/InputHost.ts\");\n/* harmony import */ var _Collision_PhysicsConfig__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Collision/PhysicsConfig */ \"./Collision/PhysicsConfig.ts\");\n/* harmony import */ var _Context__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Context */ \"./Context.ts\");\n/* harmony import */ var _GarbageCollector__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./GarbageCollector */ \"./GarbageCollector.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./Util/Util */ \"./Util/Util.ts\");\n\n\n\n\n\n\n(0,_Polyfill__WEBPACK_IMPORTED_MODULE_0__.polyfill)();\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst EngineEvents = {\n FallbackGraphicsContext: 'fallbackgraphicscontext',\n Initialize: 'initialize',\n Visible: 'visible',\n Hidden: 'hidden',\n Start: 'start',\n Stop: 'stop',\n PreUpdate: 'preupdate',\n PostUpdate: 'postupdate',\n PreFrame: 'preframe',\n PostFrame: 'postframe',\n PreDraw: 'predraw',\n PostDraw: 'postdraw'\n};\n/**\n * Enum representing the different mousewheel event bubble prevention\n */\nvar ScrollPreventionMode;\n(function (ScrollPreventionMode) {\n /**\n * Do not prevent any page scrolling\n */\n ScrollPreventionMode[ScrollPreventionMode[\"None\"] = 0] = \"None\";\n /**\n * Prevent page scroll if mouse is over the game canvas\n */\n ScrollPreventionMode[ScrollPreventionMode[\"Canvas\"] = 1] = \"Canvas\";\n /**\n * Prevent all page scrolling via mouse wheel\n */\n ScrollPreventionMode[ScrollPreventionMode[\"All\"] = 2] = \"All\";\n})(ScrollPreventionMode || (ScrollPreventionMode = {}));\n/**\n * The Excalibur Engine\n *\n * The {@apilink Engine} is the main driver for a game. It is responsible for\n * starting/stopping the game, maintaining state, transmitting events,\n * loading resources, and managing the scene.\n */\nclass Engine {\n static useEngine() {\n const value = (0,_Context__WEBPACK_IMPORTED_MODULE_1__.useContext)(Engine.Context);\n if (!value) {\n throw new Error('Cannot inject engine with `useEngine()`, `useEngine()` was called outside of Engine lifecycle scope.');\n }\n return value;\n }\n /**\n * The width of the game canvas in pixels (physical width component of the\n * resolution of the canvas element)\n */\n get canvasWidth() {\n return this.screen.canvasWidth;\n }\n /**\n * Returns half width of the game canvas in pixels (half physical width component)\n */\n get halfCanvasWidth() {\n return this.screen.halfCanvasWidth;\n }\n /**\n * The height of the game canvas in pixels, (physical height component of\n * the resolution of the canvas element)\n */\n get canvasHeight() {\n return this.screen.canvasHeight;\n }\n /**\n * Returns half height of the game canvas in pixels (half physical height component)\n */\n get halfCanvasHeight() {\n return this.screen.halfCanvasHeight;\n }\n /**\n * Returns the width of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get drawWidth() {\n return this.screen.drawWidth;\n }\n /**\n * Returns half the width of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get halfDrawWidth() {\n return this.screen.halfDrawWidth;\n }\n /**\n * Returns the height of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get drawHeight() {\n return this.screen.drawHeight;\n }\n /**\n * Returns half the height of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get halfDrawHeight() {\n return this.screen.halfDrawHeight;\n }\n /**\n * Returns whether excalibur detects the current screen to be HiDPI\n */\n get isHiDpi() {\n return this.screen.isHiDpi;\n }\n /**\n * Access {@apilink stats} that holds frame statistics.\n */\n get stats() {\n return this.debug.stats;\n }\n /**\n * The current {@apilink Scene} being drawn and updated on screen\n */\n get currentScene() {\n return this.director.currentScene;\n }\n /**\n * The current {@apilink Scene} being drawn and updated on screen\n */\n get currentSceneName() {\n return this.director.currentSceneName;\n }\n /**\n * The default {@apilink Scene} of the game, use {@apilink Engine.goToScene} to transition to different scenes.\n */\n get rootScene() {\n return this.director.rootScene;\n }\n /**\n * Contains all the scenes currently registered with Excalibur\n */\n get scenes() {\n return this.director.scenes;\n }\n /**\n * Indicates whether the engine is set to fullscreen or not\n */\n get isFullscreen() {\n return this.screen.isFullScreen;\n }\n /**\n * Indicates the current {@apilink DisplayMode} of the engine.\n */\n get displayMode() {\n return this.screen.displayMode;\n }\n /**\n * Returns the calculated pixel ration for use in rendering\n */\n get pixelRatio() {\n return this.screen.pixelRatio;\n }\n get isDebug() {\n return this._isDebug;\n }\n /**\n * Hints the graphics context to truncate fractional world space coordinates\n */\n get snapToPixel() {\n return this.graphicsContext.snapToPixel;\n }\n set snapToPixel(shouldSnapToPixel) {\n this.graphicsContext.snapToPixel = shouldSnapToPixel;\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n /**\n * Creates a new game using the given {@apilink EngineOptions}. By default, if no options are provided,\n * the game will be rendered full screen (taking up all available browser window space).\n * You can customize the game rendering through {@apilink EngineOptions}.\n *\n * Example:\n *\n * ```js\n * var game = new ex.Engine({\n * width: 0, // the width of the canvas\n * height: 0, // the height of the canvas\n * enableCanvasTransparency: true, // the transparencySection of the canvas\n * canvasElementId: '', // the DOM canvas element ID, if you are providing your own\n * displayMode: ex.DisplayMode.FullScreen, // the display mode\n * pointerScope: ex.PointerScope.Document, // the scope of capturing pointer (mouse/touch) events\n * backgroundColor: ex.Color.fromHex('#2185d0') // background color of the engine\n * });\n *\n * // call game.start, which is a Promise\n * game.start().then(function () {\n * // ready, set, go!\n * });\n * ```\n */\n constructor(options) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j;\n /**\n * Anything run under scope can use `useEngine()` to inject the current engine\n * @param cb\n */\n this.scope = (cb) => Engine.Context.scope(this, cb);\n /**\n * Current Excalibur version string\n *\n * Useful for plugins or other tools that need to know what features are available\n */\n this.version = ___WEBPACK_IMPORTED_MODULE_2__.EX_VERSION;\n /**\n * Listen to and emit events on the Engine\n */\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_3__.EventEmitter();\n /**\n * Optionally set the maximum fps if not set Excalibur will go as fast as the device allows.\n *\n * You may want to constrain max fps if your game cannot maintain fps consistently, it can look and feel better to have a 30fps game than\n * one that bounces between 30fps and 60fps\n */\n this.maxFps = Number.POSITIVE_INFINITY;\n this._inputEnabled = true;\n this._suppressPlayButton = false;\n /**\n * Indicates whether audio should be paused when the game is no longer visible.\n */\n this.pauseAudioWhenHidden = true;\n /**\n * Indicates whether the engine should draw with debug information\n */\n this._isDebug = false;\n /**\n * Sets the Transparency for the engine.\n */\n this.enableCanvasTransparency = true;\n /**\n * The action to take when a fatal exception is thrown\n */\n this.onFatalException = (e) => {\n _Util_Log__WEBPACK_IMPORTED_MODULE_4__.Logger.getInstance().fatal(e, e.stack);\n };\n this._toaster = new _Util_Toaster__WEBPACK_IMPORTED_MODULE_5__.Toaster();\n this._timescale = 1.0;\n this._isInitialized = false;\n this._originalOptions = {};\n this._handleWebGLContextLost = (e) => {\n var _a;\n e.preventDefault();\n this.clock.stop();\n this._logger.fatalOnce('WebGL Graphics Lost', e);\n const container = document.createElement('div');\n container.id = 'ex-webgl-graphics-context-lost';\n container.style.position = 'absolute';\n container.style.zIndex = '99';\n container.style.left = '50%';\n container.style.top = '50%';\n container.style.display = 'flex';\n container.style.flexDirection = 'column';\n container.style.transform = 'translate(-50%, -50%)';\n container.style.backgroundColor = 'white';\n container.style.padding = '10px';\n container.style.borderStyle = 'solid 1px';\n const div = document.createElement('div');\n div.innerHTML = `\r\n

There was an issue rendering, please refresh the page.

\r\n
\r\n

WebGL Graphics Context Lost

\r\n\r\n \r\n\r\n

There are a few reasons this might happen:

\r\n
    \r\n
  • Two or more pages are placing a high demand on the GPU
  • \r\n
  • Another page or operation has stalled the GPU and the browser has decided to reset the GPU
  • \r\n
  • The computer has multiple GPUs and the user has switched between them
  • \r\n
  • Graphics driver has crashed or restarted
  • \r\n
  • Graphics driver was updated
  • \r\n
\r\n
\r\n `;\n container.appendChild(div);\n if ((_a = this.canvas) === null || _a === void 0 ? void 0 : _a.parentElement) {\n this.canvas.parentElement.appendChild(container);\n const button = div.querySelector('#ex-webgl-graphics-reload');\n button === null || button === void 0 ? void 0 : button.addEventListener('click', () => location.reload());\n }\n };\n this._performanceThresholdTriggered = false;\n this._fpsSamples = [];\n this._disposed = false;\n this._isLoading = false;\n this._hideLoader = false;\n this._isReadyFuture = new _Util_Future__WEBPACK_IMPORTED_MODULE_6__.Future();\n /**\n * Returns the current frames elapsed milliseconds\n */\n this.currentFrameElapsedMs = 0;\n /**\n * Returns the current frame lag when in fixed update mode\n */\n this.currentFrameLagMs = 0;\n this._lagMs = 0;\n this._screenShotRequests = [];\n options = { ...Engine._DEFAULT_ENGINE_OPTIONS, ...options };\n this._originalOptions = options;\n _Flags__WEBPACK_IMPORTED_MODULE_7__.Flags.freeze();\n // Initialize browser events facade\n this.browser = new _Util_Browser__WEBPACK_IMPORTED_MODULE_8__.BrowserEvents(window, document);\n // Check compatibility\n const detector = new _Util_Detector__WEBPACK_IMPORTED_MODULE_9__.Detector();\n if (!options.suppressMinimumBrowserFeatureDetection && !(this._compatible = detector.test())) {\n const message = document.createElement('div');\n message.innerText = 'Sorry, your browser does not support all the features needed for Excalibur';\n document.body.appendChild(message);\n detector.failedTests.forEach(function (test) {\n const testMessage = document.createElement('div');\n testMessage.innerText = 'Browser feature missing ' + test;\n document.body.appendChild(testMessage);\n });\n if (options.canvasElementId) {\n const canvas = document.getElementById(options.canvasElementId);\n if (canvas) {\n canvas.parentElement.removeChild(canvas);\n }\n }\n return;\n }\n else {\n this._compatible = true;\n }\n // Use native console API for color fun\n // eslint-disable-next-line no-console\n if (console.log && !options.suppressConsoleBootMessage) {\n // eslint-disable-next-line no-console\n console.log(`%cPowered by Excalibur.js (v${___WEBPACK_IMPORTED_MODULE_2__.EX_VERSION})`, 'background: #176BAA; color: white; border-radius: 5px; padding: 15px; font-size: 1.5em; line-height: 80px;');\n // eslint-disable-next-line no-console\n console.log('\\n\\\r\n /| ________________\\n\\\r\nO|===|* >________________>\\n\\\r\n \\\\|');\n // eslint-disable-next-line no-console\n console.log('Visit', 'http://excaliburjs.com', 'for more information');\n }\n // Suppress play button\n if (options.suppressPlayButton) {\n this._suppressPlayButton = true;\n }\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_4__.Logger.getInstance();\n // If debug is enabled, let's log browser features to the console.\n if (this._logger.defaultLevel === _Util_Log__WEBPACK_IMPORTED_MODULE_4__.LogLevel.Debug) {\n detector.logBrowserFeatures();\n }\n this._logger.debug('Building engine...');\n if (options.garbageCollection === true) {\n this.garbageCollectorConfig = {\n ..._GarbageCollector__WEBPACK_IMPORTED_MODULE_10__.DefaultGarbageCollectionOptions\n };\n }\n else if (options.garbageCollection === false) {\n this._logger.warn('WebGL Garbage Collection Disabled!!! If you leak any images over time your game will crash when GPU memory is exhausted');\n this.garbageCollectorConfig = null;\n }\n else {\n this.garbageCollectorConfig = {\n ..._GarbageCollector__WEBPACK_IMPORTED_MODULE_10__.DefaultGarbageCollectionOptions,\n ...options.garbageCollection\n };\n }\n this._garbageCollector = new _GarbageCollector__WEBPACK_IMPORTED_MODULE_10__.GarbageCollector({ getTimestamp: Date.now });\n this.canvasElementId = options.canvasElementId;\n if (options.canvasElementId) {\n this._logger.debug('Using Canvas element specified: ' + options.canvasElementId);\n //test for existence of element\n if (document.getElementById(options.canvasElementId) === null) {\n throw new Error('Cannot find existing element in the DOM, please ensure element is created prior to engine creation.');\n }\n this.canvas = document.getElementById(options.canvasElementId);\n }\n else if (options.canvasElement) {\n this._logger.debug('Using Canvas element specified:', options.canvasElement);\n this.canvas = options.canvasElement;\n }\n else {\n this._logger.debug('Using generated canvas element');\n this.canvas = document.createElement('canvas');\n }\n if (this.canvas && !options.enableCanvasContextMenu) {\n this.canvas.addEventListener('contextmenu', (evt) => {\n evt.preventDefault();\n });\n }\n let displayMode = (_a = options.displayMode) !== null && _a !== void 0 ? _a : _Screen__WEBPACK_IMPORTED_MODULE_11__.DisplayMode.Fixed;\n if ((options.width && options.height) || options.viewport) {\n if (options.displayMode === undefined) {\n displayMode = _Screen__WEBPACK_IMPORTED_MODULE_11__.DisplayMode.Fixed;\n }\n this._logger.debug('Engine viewport is size ' + options.width + ' x ' + options.height);\n }\n else if (!options.displayMode) {\n this._logger.debug('Engine viewport is fit');\n displayMode = _Screen__WEBPACK_IMPORTED_MODULE_11__.DisplayMode.FitScreen;\n }\n this.grabWindowFocus = options.grabWindowFocus;\n this.pointerScope = options.pointerScope;\n this._originalDisplayMode = displayMode;\n let pixelArtSampler;\n let uvPadding;\n let nativeContextAntialiasing;\n let canvasImageRendering;\n let filtering;\n let multiSampleAntialiasing;\n if (typeof options.antialiasing === 'object') {\n ({ pixelArtSampler, nativeContextAntialiasing, multiSampleAntialiasing, filtering, canvasImageRendering } = {\n ...(options.pixelArt ? _Graphics__WEBPACK_IMPORTED_MODULE_12__.DefaultPixelArtOptions : _Graphics__WEBPACK_IMPORTED_MODULE_12__.DefaultAntialiasOptions),\n ...options.antialiasing\n });\n }\n else {\n pixelArtSampler = !!options.pixelArt;\n nativeContextAntialiasing = false;\n multiSampleAntialiasing = options.antialiasing;\n canvasImageRendering = options.antialiasing ? 'auto' : 'pixelated';\n filtering = options.antialiasing ? _Graphics_Filtering__WEBPACK_IMPORTED_MODULE_13__.ImageFiltering.Blended : _Graphics_Filtering__WEBPACK_IMPORTED_MODULE_13__.ImageFiltering.Pixel;\n }\n if (nativeContextAntialiasing && multiSampleAntialiasing) {\n this._logger.warnOnce(`Cannot use antialias setting nativeContextAntialiasing and multiSampleAntialiasing` +\n ` at the same time, they are incompatible settings. If you aren\\'t sure use multiSampleAntialiasing`);\n }\n if (options.pixelArt) {\n uvPadding = 0.25;\n }\n if (!options.antialiasing || filtering === _Graphics_Filtering__WEBPACK_IMPORTED_MODULE_13__.ImageFiltering.Pixel) {\n uvPadding = 0;\n }\n // Override with any user option, if non default to .25 for pixel art, 0.01 for everything else\n uvPadding = (_c = (_b = options.uvPadding) !== null && _b !== void 0 ? _b : uvPadding) !== null && _c !== void 0 ? _c : 0.01;\n // Canvas 2D fallback can be flagged on\n let useCanvasGraphicsContext = _Flags__WEBPACK_IMPORTED_MODULE_7__.Flags.isEnabled('use-canvas-context');\n if (!useCanvasGraphicsContext) {\n // Attempt webgl first\n try {\n this.graphicsContext = new _Graphics__WEBPACK_IMPORTED_MODULE_14__.ExcaliburGraphicsContextWebGL({\n canvasElement: this.canvas,\n enableTransparency: this.enableCanvasTransparency,\n pixelArtSampler: pixelArtSampler,\n antialiasing: nativeContextAntialiasing,\n multiSampleAntialiasing: multiSampleAntialiasing,\n uvPadding: uvPadding,\n powerPreference: options.powerPreference,\n backgroundColor: options.backgroundColor,\n snapToPixel: options.snapToPixel,\n useDrawSorting: options.useDrawSorting,\n garbageCollector: this.garbageCollectorConfig\n ? {\n garbageCollector: this._garbageCollector,\n collectionInterval: this.garbageCollectorConfig.textureCollectInterval\n }\n : null,\n handleContextLost: (_d = options.handleContextLost) !== null && _d !== void 0 ? _d : this._handleWebGLContextLost,\n handleContextRestored: options.handleContextRestored\n });\n }\n catch (e) {\n this._logger.warn(`Excalibur could not load webgl for some reason (${e.message}) and loaded a Canvas 2D fallback. ` +\n `Some features of Excalibur will not work in this mode. \\n\\n` +\n 'Read more about this issue at https://excaliburjs.com/docs/performance');\n // fallback to canvas in case of failure\n useCanvasGraphicsContext = true;\n }\n }\n if (useCanvasGraphicsContext) {\n this.graphicsContext = new _Graphics__WEBPACK_IMPORTED_MODULE_15__.ExcaliburGraphicsContext2DCanvas({\n canvasElement: this.canvas,\n enableTransparency: this.enableCanvasTransparency,\n antialiasing: nativeContextAntialiasing,\n backgroundColor: options.backgroundColor,\n snapToPixel: options.snapToPixel,\n useDrawSorting: options.useDrawSorting\n });\n }\n this.screen = new _Screen__WEBPACK_IMPORTED_MODULE_11__.Screen({\n canvas: this.canvas,\n context: this.graphicsContext,\n antialiasing: nativeContextAntialiasing,\n canvasImageRendering: canvasImageRendering,\n browser: this.browser,\n viewport: (_e = options.viewport) !== null && _e !== void 0 ? _e : (options.width && options.height ? { width: options.width, height: options.height } : _Screen__WEBPACK_IMPORTED_MODULE_11__.Resolution.SVGA),\n resolution: options.resolution,\n displayMode,\n pixelRatio: options.suppressHiDPIScaling ? 1 : (_f = options.pixelRatio) !== null && _f !== void 0 ? _f : null\n });\n // TODO REMOVE STATIC!!!\n // Set default filtering based on antialiasing\n _Graphics__WEBPACK_IMPORTED_MODULE_16__.TextureLoader.filtering = filtering;\n if (options.backgroundColor) {\n this.backgroundColor = options.backgroundColor.clone();\n }\n this.maxFps = (_g = options.maxFps) !== null && _g !== void 0 ? _g : this.maxFps;\n this.fixedUpdateTimestep = (_h = options.fixedUpdateTimestep) !== null && _h !== void 0 ? _h : this.fixedUpdateTimestep;\n this.fixedUpdateFps = (_j = options.fixedUpdateFps) !== null && _j !== void 0 ? _j : this.fixedUpdateFps;\n this.fixedUpdateTimestep = this.fixedUpdateTimestep || 1000 / this.fixedUpdateFps;\n this.clock = new _Util_Clock__WEBPACK_IMPORTED_MODULE_17__.StandardClock({\n maxFps: this.maxFps,\n tick: this._mainloop.bind(this),\n onFatalException: (e) => this.onFatalException(e)\n });\n this.enableCanvasTransparency = options.enableCanvasTransparency;\n if (typeof options.physics === 'boolean') {\n this.physics = {\n ...(0,_Collision_PhysicsConfig__WEBPACK_IMPORTED_MODULE_18__.getDefaultPhysicsConfig)(),\n enabled: options.physics\n };\n }\n else {\n this.physics = {\n ...(0,_Collision_PhysicsConfig__WEBPACK_IMPORTED_MODULE_18__.getDefaultPhysicsConfig)()\n };\n (0,_Util_Util__WEBPACK_IMPORTED_MODULE_19__.mergeDeep)(this.physics, options.physics);\n }\n this.debug = new _Debug_DebugConfig__WEBPACK_IMPORTED_MODULE_20__.DebugConfig(this);\n this.director = new _Director_Director__WEBPACK_IMPORTED_MODULE_21__.Director(this, options.scenes);\n this._initialize(options);\n window.___EXCALIBUR_DEVTOOL = this;\n Engine.InstanceCount++;\n }\n _monitorPerformanceThresholdAndTriggerFallback() {\n const { allow } = this._originalOptions.configurePerformanceCanvas2DFallback;\n let { threshold, showPlayerMessage } = this._originalOptions.configurePerformanceCanvas2DFallback;\n if (threshold === undefined) {\n threshold = Engine._DEFAULT_ENGINE_OPTIONS.configurePerformanceCanvas2DFallback.threshold;\n }\n if (showPlayerMessage === undefined) {\n showPlayerMessage = Engine._DEFAULT_ENGINE_OPTIONS.configurePerformanceCanvas2DFallback.showPlayerMessage;\n }\n if (!_Flags__WEBPACK_IMPORTED_MODULE_7__.Flags.isEnabled('use-canvas-context') && allow && this.ready && !this._performanceThresholdTriggered) {\n // Calculate Average fps for last X number of frames after start\n if (this._fpsSamples.length === threshold.numberOfFrames) {\n this._fpsSamples.splice(0, 1);\n }\n this._fpsSamples.push(this.clock.fpsSampler.fps);\n let total = 0;\n for (let i = 0; i < this._fpsSamples.length; i++) {\n total += this._fpsSamples[i];\n }\n const average = total / this._fpsSamples.length;\n if (this._fpsSamples.length === threshold.numberOfFrames) {\n if (average <= threshold.fps) {\n this._performanceThresholdTriggered = true;\n this._logger.warn(`Switching to browser 2D Canvas fallback due to performance. Some features of Excalibur will not work in this mode.\\n` +\n \"this might mean your browser doesn't have webgl enabled or hardware acceleration is unavailable.\\n\\n\" +\n 'If in Chrome:\\n' +\n ' * Visit Settings > Advanced > System, and ensure \"Use Hardware Acceleration\" is checked.\\n' +\n ' * Visit chrome://flags/#ignore-gpu-blocklist and ensure \"Override software rendering list\" is \"enabled\"\\n' +\n 'If in Firefox, visit about:config\\n' +\n ' * Ensure webgl.disabled = false\\n' +\n ' * Ensure webgl.force-enabled = true\\n' +\n ' * Ensure layers.acceleration.force-enabled = true\\n\\n' +\n 'Read more about this issue at https://excaliburjs.com/docs/performance');\n if (showPlayerMessage) {\n this._toaster.toast('Excalibur is encountering performance issues. ' +\n \"It's possible that your browser doesn't have hardware acceleration enabled. \" +\n 'Visit [LINK] for more information and potential solutions.', 'https://excaliburjs.com/docs/performance');\n }\n this.useCanvas2DFallback();\n this.emit('fallbackgraphicscontext', this.graphicsContext);\n }\n }\n }\n }\n /**\n * Switches the engine's graphics context to the 2D Canvas.\n * @warning Some features of Excalibur will not work in this mode.\n */\n useCanvas2DFallback() {\n var _a, _b, _c;\n // Swap out the canvas\n const newCanvas = this.canvas.cloneNode(false);\n this.canvas.parentNode.replaceChild(newCanvas, this.canvas);\n this.canvas = newCanvas;\n const options = { ...this._originalOptions, antialiasing: this.screen.antialiasing };\n const displayMode = this._originalDisplayMode;\n // New graphics context\n this.graphicsContext = new _Graphics__WEBPACK_IMPORTED_MODULE_15__.ExcaliburGraphicsContext2DCanvas({\n canvasElement: this.canvas,\n enableTransparency: this.enableCanvasTransparency,\n antialiasing: options.antialiasing,\n backgroundColor: options.backgroundColor,\n snapToPixel: options.snapToPixel,\n useDrawSorting: options.useDrawSorting\n });\n // Reset screen\n if (this.screen) {\n this.screen.dispose();\n }\n this.screen = new _Screen__WEBPACK_IMPORTED_MODULE_11__.Screen({\n canvas: this.canvas,\n context: this.graphicsContext,\n antialiasing: (_a = options.antialiasing) !== null && _a !== void 0 ? _a : true,\n browser: this.browser,\n viewport: (_b = options.viewport) !== null && _b !== void 0 ? _b : (options.width && options.height ? { width: options.width, height: options.height } : _Screen__WEBPACK_IMPORTED_MODULE_11__.Resolution.SVGA),\n resolution: options.resolution,\n displayMode,\n pixelRatio: options.suppressHiDPIScaling ? 1 : (_c = options.pixelRatio) !== null && _c !== void 0 ? _c : null\n });\n this.screen.setCurrentCamera(this.currentScene.camera);\n // Reset pointers\n this.input.pointers.detach();\n const pointerTarget = options && options.pointerScope === _Input_PointerScope__WEBPACK_IMPORTED_MODULE_22__.PointerScope.Document ? document : this.canvas;\n this.input.pointers = this.input.pointers.recreate(pointerTarget, this);\n this.input.pointers.init();\n }\n /**\n * Attempts to completely clean up excalibur resources, including removing the canvas from the dom.\n *\n * To start again you will need to new up an Engine.\n */\n dispose() {\n if (!this._disposed) {\n this._disposed = true;\n this.stop();\n this._garbageCollector.forceCollectAll();\n this.input.toggleEnabled(false);\n this.canvas.parentNode.removeChild(this.canvas);\n this.canvas = null;\n this.screen.dispose();\n this.graphicsContext.dispose();\n this.graphicsContext = null;\n Engine.InstanceCount--;\n }\n }\n isDisposed() {\n return this._disposed;\n }\n /**\n * Returns a BoundingBox of the top left corner of the screen\n * and the bottom right corner of the screen.\n */\n getWorldBounds() {\n return this.screen.getWorldBounds();\n }\n /**\n * Gets the current engine timescale factor (default is 1.0 which is 1:1 time)\n */\n get timescale() {\n return this._timescale;\n }\n /**\n * Sets the current engine timescale factor. Useful for creating slow-motion effects or fast-forward effects\n * when using time-based movement.\n */\n set timescale(value) {\n if (value < 0) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_4__.Logger.getInstance().warnOnce('engine.timescale to a value less than 0 are ignored');\n return;\n }\n this._timescale = value;\n }\n /**\n * Adds a {@apilink Timer} to the {@apilink currentScene}.\n * @param timer The timer to add to the {@apilink currentScene}.\n */\n addTimer(timer) {\n return this.currentScene.addTimer(timer);\n }\n /**\n * Removes a {@apilink Timer} from the {@apilink currentScene}.\n * @param timer The timer to remove to the {@apilink currentScene}.\n */\n removeTimer(timer) {\n return this.currentScene.removeTimer(timer);\n }\n /**\n * Adds a {@apilink Scene} to the engine, think of scenes in Excalibur as you\n * would levels or menus.\n * @param key The name of the scene, must be unique\n * @param scene The scene to add to the engine\n */\n addScene(key, scene) {\n this.director.add(key, scene);\n return this;\n }\n /**\n * @internal\n */\n removeScene(entity) {\n this.director.remove(entity);\n }\n add(entity) {\n if (arguments.length === 2) {\n this.director.add(arguments[0], arguments[1]);\n return;\n }\n const maybeDeferred = this.director.getDeferredScene();\n if (maybeDeferred instanceof _Scene__WEBPACK_IMPORTED_MODULE_23__.Scene) {\n maybeDeferred.add(entity);\n }\n else {\n this.currentScene.add(entity);\n }\n }\n remove(entity) {\n if (entity instanceof _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_24__.Entity) {\n this.currentScene.remove(entity);\n }\n if (entity instanceof _Scene__WEBPACK_IMPORTED_MODULE_23__.Scene || (0,_Scene__WEBPACK_IMPORTED_MODULE_23__.isSceneConstructor)(entity)) {\n this.removeScene(entity);\n }\n if (typeof entity === 'string') {\n this.removeScene(entity);\n }\n }\n /**\n * Changes the current scene with optionally supplied:\n * * Activation data\n * * Transitions\n * * Loaders\n *\n * Example:\n * ```typescript\n * game.goToScene('myScene', {\n * sceneActivationData: {any: 'thing at all'},\n * destinationIn: new FadeInOut({duration: 1000, direction: 'in'}),\n * sourceOut: new FadeInOut({duration: 1000, direction: 'out'}),\n * loader: MyLoader\n * });\n * ```\n *\n * Scenes are defined in the Engine constructor\n * ```typescript\n * const engine = new ex.Engine({\n scenes: {...}\n });\n * ```\n * Or by adding dynamically\n *\n * ```typescript\n * engine.addScene('myScene', new ex.Scene());\n * ```\n * @param destinationScene\n * @param options\n */\n async goToScene(destinationScene, options) {\n await this.scope(async () => {\n await this.director.goToScene(destinationScene, options);\n });\n }\n /**\n * Transforms the current x, y from screen coordinates to world coordinates\n * @param point Screen coordinate to convert\n */\n screenToWorldCoordinates(point) {\n return this.screen.screenToWorldCoordinates(point);\n }\n /**\n * Transforms a world coordinate, to a screen coordinate\n * @param point World coordinate to convert\n */\n worldToScreenCoordinates(point) {\n return this.screen.worldToScreenCoordinates(point);\n }\n /**\n * Initializes the internal canvas, rendering context, display mode, and native event listeners\n */\n _initialize(options) {\n var _a, _b;\n this.pageScrollPreventionMode = options.scrollPreventionMode;\n // initialize inputs\n const pointerTarget = options && options.pointerScope === _Input_PointerScope__WEBPACK_IMPORTED_MODULE_22__.PointerScope.Document ? document : this.canvas;\n const grabWindowFocus = (_b = (_a = this._originalOptions) === null || _a === void 0 ? void 0 : _a.grabWindowFocus) !== null && _b !== void 0 ? _b : true;\n this.input = new _Input_InputHost__WEBPACK_IMPORTED_MODULE_25__.InputHost({\n pointerTarget,\n grabWindowFocus,\n engine: this\n });\n this.inputMapper = this.input.inputMapper;\n // Issue #385 make use of the visibility api\n // https://developer.mozilla.org/en-US/docs/Web/Guide/User_experience/Using_the_Page_Visibility_API\n this.browser.document.on('visibilitychange', () => {\n if (document.visibilityState === 'hidden') {\n this.events.emit('hidden', new _Events__WEBPACK_IMPORTED_MODULE_26__.HiddenEvent(this));\n this._logger.debug('Window hidden');\n }\n else if (document.visibilityState === 'visible') {\n this.events.emit('visible', new _Events__WEBPACK_IMPORTED_MODULE_26__.VisibleEvent(this));\n this._logger.debug('Window visible');\n }\n });\n if (!this.canvasElementId && !options.canvasElement) {\n document.body.appendChild(this.canvas);\n }\n }\n toggleInputEnabled(enabled) {\n this._inputEnabled = enabled;\n this.input.toggleEnabled(this._inputEnabled);\n }\n onInitialize(engine) {\n // Override me\n }\n /**\n * Gets whether the actor is Initialized\n */\n get isInitialized() {\n return this._isInitialized;\n }\n async _overrideInitialize(engine) {\n if (!this.isInitialized) {\n await this.director.onInitialize();\n await this.onInitialize(engine);\n this.events.emit('initialize', new _Events__WEBPACK_IMPORTED_MODULE_26__.InitializeEvent(engine, this));\n this._isInitialized = true;\n }\n }\n /**\n * Updates the entire state of the game\n * @param elapsed Number of milliseconds elapsed since the last update.\n */\n _update(elapsed) {\n var _a;\n if (this._isLoading) {\n // suspend updates until loading is finished\n (_a = this._loader) === null || _a === void 0 ? void 0 : _a.onUpdate(this, elapsed);\n // Update input listeners\n this.input.update();\n return;\n }\n // Publish preupdate events\n this.clock.__runScheduledCbs('preupdate');\n this._preupdate(elapsed);\n // process engine level events\n this.currentScene.update(this, elapsed);\n // Update graphics postprocessors\n this.graphicsContext.updatePostProcessors(elapsed);\n // Publish update event\n this.clock.__runScheduledCbs('postupdate');\n this._postupdate(elapsed);\n // Update input listeners\n this.input.update();\n }\n /**\n * @internal\n */\n _preupdate(elapsed) {\n this.emit('preupdate', new _Events__WEBPACK_IMPORTED_MODULE_26__.PreUpdateEvent(this, elapsed, this));\n this.onPreUpdate(this, elapsed);\n }\n /**\n * Safe to override method\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n */\n onPreUpdate(engine, elapsed) {\n // Override me\n }\n /**\n * @internal\n */\n _postupdate(elapsed) {\n this.emit('postupdate', new _Events__WEBPACK_IMPORTED_MODULE_26__.PostUpdateEvent(this, elapsed, this));\n this.onPostUpdate(this, elapsed);\n }\n /**\n * Safe to override method\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n */\n onPostUpdate(engine, elapsed) {\n // Override me\n }\n /**\n * Draws the entire game\n * @param elapsed Number of milliseconds elapsed since the last draw.\n */\n _draw(elapsed) {\n var _a, _b;\n // Use scene background color if present, fallback to engine\n this.graphicsContext.backgroundColor = (_a = this.currentScene.backgroundColor) !== null && _a !== void 0 ? _a : this.backgroundColor;\n this.graphicsContext.beginDrawLifecycle();\n this.graphicsContext.clear();\n this.clock.__runScheduledCbs('predraw');\n this._predraw(this.graphicsContext, elapsed);\n // Drawing nothing else while loading\n if (this._isLoading) {\n if (!this._hideLoader) {\n (_b = this._loader) === null || _b === void 0 ? void 0 : _b.canvas.draw(this.graphicsContext, 0, 0);\n this.clock.__runScheduledCbs('postdraw');\n this.graphicsContext.flush();\n this.graphicsContext.endDrawLifecycle();\n }\n return;\n }\n this.currentScene.draw(this.graphicsContext, elapsed);\n this.clock.__runScheduledCbs('postdraw');\n this._postdraw(this.graphicsContext, elapsed);\n // Flush any pending drawings\n this.graphicsContext.flush();\n this.graphicsContext.endDrawLifecycle();\n this._checkForScreenShots();\n }\n /**\n * @internal\n */\n _predraw(ctx, elapsed) {\n this.emit('predraw', new _Events__WEBPACK_IMPORTED_MODULE_26__.PreDrawEvent(ctx, elapsed, this));\n this.onPreDraw(ctx, elapsed);\n }\n /**\n * Safe to override method to hook into pre draw\n * @param ctx {@link ExcaliburGraphicsContext} for drawing\n * @param elapsed Number of milliseconds elapsed since the last draw.\n */\n onPreDraw(ctx, elapsed) {\n // Override me\n }\n /**\n * @internal\n */\n _postdraw(ctx, elapsed) {\n this.emit('postdraw', new _Events__WEBPACK_IMPORTED_MODULE_26__.PostDrawEvent(ctx, elapsed, this));\n this.onPostDraw(ctx, elapsed);\n }\n /**\n * Safe to override method to hook into pre draw\n * @param ctx {@link ExcaliburGraphicsContext} for drawing\n * @param elapsed Number of milliseconds elapsed since the last draw.\n */\n onPostDraw(ctx, elapsed) {\n // Override me\n }\n /**\n * Enable or disable Excalibur debugging functionality.\n * @param toggle a value that debug drawing will be changed to\n */\n showDebug(toggle) {\n this._isDebug = toggle;\n }\n /**\n * Toggle Excalibur debugging functionality.\n */\n toggleDebug() {\n this._isDebug = !this._isDebug;\n return this._isDebug;\n }\n /**\n * Returns true when loading is totally complete and the player has clicked start\n */\n get loadingComplete() {\n return !this._isLoading;\n }\n get ready() {\n return this._isReadyFuture.isCompleted;\n }\n isReady() {\n return this._isReadyFuture.promise;\n }\n async start(sceneNameOrLoader, options) {\n await this.scope(async () => {\n if (!this._compatible) {\n throw new Error('Excalibur is incompatible with your browser');\n }\n this._isLoading = true;\n let loader;\n if (sceneNameOrLoader instanceof _Director_DefaultLoader__WEBPACK_IMPORTED_MODULE_27__.DefaultLoader) {\n loader = sceneNameOrLoader;\n }\n else if (typeof sceneNameOrLoader === 'string') {\n this.director.configureStart(sceneNameOrLoader, options);\n loader = this.director.mainLoader;\n }\n // Start the excalibur clock which drives the mainloop\n this._logger.debug('Starting game clock...');\n this.browser.resume();\n this.clock.start();\n if (this.garbageCollectorConfig) {\n this._garbageCollector.start();\n }\n this._logger.debug('Game clock started');\n await this.load(loader !== null && loader !== void 0 ? loader : new _Director_Loader__WEBPACK_IMPORTED_MODULE_28__.Loader());\n // Initialize before ready\n await this._overrideInitialize(this);\n this._isReadyFuture.resolve();\n this.emit('start', new _Events__WEBPACK_IMPORTED_MODULE_26__.GameStartEvent(this));\n return this._isReadyFuture.promise;\n });\n }\n _mainloop(elapsed) {\n this.scope(() => {\n this.emit('preframe', new _Events__WEBPACK_IMPORTED_MODULE_26__.PreFrameEvent(this, this.stats.prevFrame));\n const elapsedMs = elapsed * this.timescale;\n this.currentFrameElapsedMs = elapsedMs;\n // reset frame stats (reuse existing instances)\n const frameId = this.stats.prevFrame.id + 1;\n this.stats.currFrame.reset();\n this.stats.currFrame.id = frameId;\n this.stats.currFrame.elapsedMs = elapsedMs;\n this.stats.currFrame.fps = this.clock.fpsSampler.fps;\n _Graphics_GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_29__.GraphicsDiagnostics.clear();\n const beforeUpdate = this.clock.now();\n const fixedTimestepMs = this.fixedUpdateTimestep;\n if (this.fixedUpdateTimestep) {\n this._lagMs += elapsedMs;\n while (this._lagMs >= fixedTimestepMs) {\n this._update(fixedTimestepMs);\n this._lagMs -= fixedTimestepMs;\n }\n }\n else {\n this._update(elapsedMs);\n }\n const afterUpdate = this.clock.now();\n this.currentFrameLagMs = this._lagMs;\n this._draw(elapsedMs);\n const afterDraw = this.clock.now();\n this.stats.currFrame.duration.update = afterUpdate - beforeUpdate;\n this.stats.currFrame.duration.draw = afterDraw - afterUpdate;\n this.stats.currFrame.graphics.drawnImages = _Graphics_GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_29__.GraphicsDiagnostics.DrawnImagesCount;\n this.stats.currFrame.graphics.drawCalls = _Graphics_GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_29__.GraphicsDiagnostics.DrawCallCount;\n this.emit('postframe', new _Events__WEBPACK_IMPORTED_MODULE_26__.PostFrameEvent(this, this.stats.currFrame));\n this.stats.prevFrame.reset(this.stats.currFrame);\n this._monitorPerformanceThresholdAndTriggerFallback();\n });\n }\n /**\n * Stops Excalibur's main loop, useful for pausing the game.\n */\n stop() {\n if (this.clock.isRunning()) {\n this.emit('stop', new _Events__WEBPACK_IMPORTED_MODULE_26__.GameStopEvent(this));\n this.browser.pause();\n this.clock.stop();\n this._garbageCollector.stop();\n this._logger.debug('Game stopped');\n }\n }\n /**\n * Returns the Engine's running status, Useful for checking whether engine is running or paused.\n */\n isRunning() {\n return this.clock.isRunning();\n }\n /**\n * Takes a screen shot of the current viewport and returns it as an\n * HTML Image Element.\n * @param preserveHiDPIResolution in the case of HiDPI return the full scaled backing image, by default false\n */\n screenshot(preserveHiDPIResolution = false) {\n const screenShotPromise = new Promise((resolve) => {\n this._screenShotRequests.push({ preserveHiDPIResolution, resolve });\n });\n return screenShotPromise;\n }\n _checkForScreenShots() {\n // We must grab the draw buffer before we yield to the browser\n // the draw buffer is cleared after compositing\n // the reason for the asynchrony is setting `preserveDrawingBuffer: true`\n // forces the browser to copy buffers which can have a mass perf impact on mobile\n for (const request of this._screenShotRequests) {\n const finalWidth = request.preserveHiDPIResolution ? this.canvas.width : this.screen.resolution.width;\n const finalHeight = request.preserveHiDPIResolution ? this.canvas.height : this.screen.resolution.height;\n const screenshot = document.createElement('canvas');\n screenshot.width = finalWidth;\n screenshot.height = finalHeight;\n const ctx = screenshot.getContext('2d');\n ctx.imageSmoothingEnabled = this.screen.antialiasing;\n ctx.drawImage(this.canvas, 0, 0, finalWidth, finalHeight);\n const result = new Image();\n const raw = screenshot.toDataURL('image/png');\n result.onload = () => {\n request.resolve(result);\n };\n result.src = raw;\n }\n // Reset state\n this._screenShotRequests.length = 0;\n }\n /**\n * Another option available to you to load resources into the game.\n * Immediately after calling this the game will pause and the loading screen\n * will appear.\n * @param loader Some {@apilink Loadable} such as a {@apilink Loader} collection, {@apilink Sound}, or {@apilink Texture}.\n */\n async load(loader, hideLoader = false) {\n await this.scope(async () => {\n try {\n // early exit if loaded\n if (loader.isLoaded()) {\n return;\n }\n this._loader = loader;\n this._isLoading = true;\n this._hideLoader = hideLoader;\n if (loader instanceof _Director_Loader__WEBPACK_IMPORTED_MODULE_28__.Loader) {\n loader.suppressPlayButton = loader.suppressPlayButton || this._suppressPlayButton;\n }\n this._loader.onInitialize(this);\n await loader.load();\n }\n catch (e) {\n this._logger.error('Error loading resources, things may not behave properly', e);\n await Promise.resolve();\n }\n finally {\n this._isLoading = false;\n this._hideLoader = false;\n this._loader = null;\n }\n });\n }\n}\nEngine.Context = (0,_Context__WEBPACK_IMPORTED_MODULE_1__.createContext)();\nEngine.InstanceCount = 0;\n/**\n * Default {@apilink EngineOptions}\n */\nEngine._DEFAULT_ENGINE_OPTIONS = {\n width: 0,\n height: 0,\n enableCanvasTransparency: true,\n useDrawSorting: true,\n configurePerformanceCanvas2DFallback: {\n allow: false,\n showPlayerMessage: false,\n threshold: { fps: 20, numberOfFrames: 100 }\n },\n canvasElementId: '',\n canvasElement: undefined,\n enableCanvasContextMenu: false,\n snapToPixel: false,\n antialiasing: true,\n pixelArt: false,\n garbageCollection: true,\n powerPreference: 'high-performance',\n pointerScope: _Input_PointerScope__WEBPACK_IMPORTED_MODULE_22__.PointerScope.Canvas,\n suppressConsoleBootMessage: null,\n suppressMinimumBrowserFeatureDetection: null,\n suppressHiDPIScaling: null,\n suppressPlayButton: null,\n grabWindowFocus: true,\n scrollPreventionMode: ScrollPreventionMode.Canvas,\n backgroundColor: _Color__WEBPACK_IMPORTED_MODULE_30__.Color.fromHex('#2185d0') // Excalibur blue\n};\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/Component.ts\":\n/*!********************************************!*\\\n !*** ./EntityComponentSystem/Component.ts ***!\n \\********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Component: () => (/* binding */ Component),\n/* harmony export */ isComponentCtor: () => (/* binding */ isComponentCtor)\n/* harmony export */ });\n/**\n *\n */\nfunction isComponentCtor(value) {\n return !!value && !!value.prototype && !!value.prototype.constructor;\n}\n/**\n * Type guard to check if a component implements clone\n * @param x\n */\nfunction hasClone(x) {\n return !!(x === null || x === void 0 ? void 0 : x.clone);\n}\n/**\n * Components are containers for state in Excalibur, the are meant to convey capabilities that an Entity possesses\n *\n * Implementations of Component must have a zero-arg constructor to support dependencies\n *\n * ```typescript\n * class MyComponent extends ex.Component {\n * // zero arg support required if you want to use component dependencies\n * constructor(public optionalPos?: ex.Vector) {}\n * }\n * ```\n */\nclass Component {\n constructor() {\n // TODO maybe generate a unique id?\n /**\n * Current owning {@apilink Entity}, if any, of this component. Null if not added to any {@apilink Entity}\n */\n this.owner = undefined;\n }\n /**\n * Clones any properties on this component, if that property value has a `clone()` method it will be called\n */\n clone() {\n const newComponent = new this.constructor();\n for (const prop in this) {\n if (this.hasOwnProperty(prop)) {\n const val = this[prop];\n if (hasClone(val) && prop !== 'owner' && prop !== 'clone') {\n newComponent[prop] = val.clone();\n }\n else {\n newComponent[prop] = val;\n }\n }\n }\n return newComponent;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/Components/MotionComponent.ts\":\n/*!*************************************************************!*\\\n !*** ./EntityComponentSystem/Components/MotionComponent.ts ***!\n \\*************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MotionComponent: () => (/* binding */ MotionComponent)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Component */ \"./EntityComponentSystem/Component.ts\");\n\n\nclass MotionComponent extends _Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor() {\n super(...arguments);\n /**\n * The velocity of an entity in pixels per second\n */\n this.vel = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n /**\n * The acceleration of entity in pixels per second^2\n */\n this.acc = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n /**\n * The scale rate of change in scale units per second\n */\n this.scaleFactor = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n /**\n * The angular velocity which is how quickly the entity is rotating in radians per second\n */\n this.angularVelocity = 0;\n /**\n * The amount of torque applied to the entity, angular acceleration is torque * inertia\n */\n this.torque = 0;\n /**\n * Inertia can be thought of as the resistance to motion\n */\n this.inertia = 1;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/Components/TransformComponent.ts\":\n/*!****************************************************************!*\\\n !*** ./EntityComponentSystem/Components/TransformComponent.ts ***!\n \\****************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TransformComponent: () => (/* binding */ TransformComponent)\n/* harmony export */ });\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Math/coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _Math_transform__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math/transform */ \"./Math/transform.ts\");\n/* harmony import */ var _Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Component */ \"./EntityComponentSystem/Component.ts\");\n/* harmony import */ var _Util_Observable__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Util/Observable */ \"./Util/Observable.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n\n\n\n\n\nclass TransformComponent extends _Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor() {\n super(...arguments);\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this._parentComponent = null;\n this._transform = new _Math_transform__WEBPACK_IMPORTED_MODULE_2__.Transform();\n this._addChildTransform = (child) => {\n const childTxComponent = child.get(TransformComponent);\n if (childTxComponent) {\n childTxComponent._transform.parent = this._transform;\n childTxComponent._parentComponent = this;\n }\n };\n /**\n * Observable that emits when the z index changes on this component\n */\n this.zIndexChanged$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_3__.Observable();\n this._coordPlane = _Math_coord_plane__WEBPACK_IMPORTED_MODULE_4__.CoordPlane.World;\n }\n get() {\n return this._transform;\n }\n onAdd(owner) {\n for (const child of owner.children) {\n this._addChildTransform(child);\n }\n owner.childrenAdded$.subscribe((child) => this._addChildTransform(child));\n owner.childrenRemoved$.subscribe((child) => {\n const childTxComponent = child.get(TransformComponent);\n if (childTxComponent) {\n childTxComponent._transform.parent = null;\n childTxComponent._parentComponent = null;\n }\n });\n }\n onRemove(_previousOwner) {\n this._transform.parent = null;\n this._parentComponent = null;\n }\n /**\n * The z-index ordering of the entity, a higher values are drawn on top of lower values.\n * For example z=99 would be drawn on top of z=0.\n */\n get z() {\n return this._transform.z;\n }\n set z(val) {\n const oldz = this._transform.z;\n this._transform.z = val;\n if (oldz !== val) {\n this.zIndexChanged$.notifyAll(val);\n }\n }\n get globalZ() {\n return this._transform.globalZ;\n }\n set globalZ(z) {\n this._transform.globalZ = z;\n }\n /**\n * The {@apilink CoordPlane | `coordinate plane`} for this transform for the entity.\n */\n get coordPlane() {\n if (this._parentComponent) {\n return this._parentComponent.coordPlane;\n }\n return this._coordPlane;\n }\n set coordPlane(value) {\n var _a;\n if (!this._parentComponent) {\n this._coordPlane = value;\n }\n else {\n this._logger.warn(`Cannot set coordinate plane on child entity ${(_a = this.owner) === null || _a === void 0 ? void 0 : _a.name}, children inherit their coordinate plane from their parents.`);\n }\n }\n get pos() {\n return this._transform.pos;\n }\n set pos(v) {\n this._transform.pos = v;\n }\n get globalPos() {\n return this._transform.globalPos;\n }\n set globalPos(v) {\n this._transform.globalPos = v;\n }\n get rotation() {\n return this._transform.rotation;\n }\n set rotation(rotation) {\n this._transform.rotation = rotation;\n }\n get globalRotation() {\n return this._transform.globalRotation;\n }\n set globalRotation(rotation) {\n this._transform.globalRotation = rotation;\n }\n get scale() {\n return this._transform.scale;\n }\n set scale(v) {\n this._transform.scale = v;\n }\n get globalScale() {\n return this._transform.globalScale;\n }\n set globalScale(v) {\n this._transform.globalScale = v;\n }\n applyInverse(v) {\n return this._transform.applyInverse(v);\n }\n apply(v) {\n return this._transform.apply(v);\n }\n clone() {\n const component = new TransformComponent();\n component._transform = this._transform.clone();\n return component;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/Entity.ts\":\n/*!*****************************************!*\\\n !*** ./EntityComponentSystem/Entity.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AddedComponent: () => (/* binding */ AddedComponent),\n/* harmony export */ Entity: () => (/* binding */ Entity),\n/* harmony export */ EntityEvents: () => (/* binding */ EntityEvents),\n/* harmony export */ RemovedComponent: () => (/* binding */ RemovedComponent),\n/* harmony export */ isAddedComponent: () => (/* binding */ isAddedComponent),\n/* harmony export */ isRemovedComponent: () => (/* binding */ isRemovedComponent)\n/* harmony export */ });\n/* harmony import */ var _Component__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Component */ \"./EntityComponentSystem/Component.ts\");\n/* harmony import */ var _Util_Observable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Observable */ \"./Util/Observable.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Util/Util */ \"./Util/Util.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n\n\n\n\n\n\n\n/**\n * AddedComponent message\n */\nclass AddedComponent {\n constructor(data) {\n this.data = data;\n this.type = 'Component Added';\n }\n}\n/**\n * Type guard to know if message is f an Added Component\n */\nfunction isAddedComponent(x) {\n return !!x && x.type === 'Component Added';\n}\n/**\n * RemovedComponent message\n */\nclass RemovedComponent {\n constructor(data) {\n this.data = data;\n this.type = 'Component Removed';\n }\n}\n/**\n * Type guard to know if message is for a Removed Component\n */\nfunction isRemovedComponent(x) {\n return !!x && x.type === 'Component Removed';\n}\nconst EntityEvents = {\n Add: 'add',\n Remove: 'remove',\n Initialize: 'initialize',\n PreUpdate: 'preupdate',\n PostUpdate: 'postupdate',\n Kill: 'kill'\n};\n/**\n * An Entity is the base type of anything that can have behavior in Excalibur, they are part of the built in entity component system\n *\n * Entities can be strongly typed with the components they contain\n *\n * ```typescript\n * const entity = new Entity();\n * entity.components.a; // Type ComponentA\n * entity.components.b; // Type ComponentB\n * ```\n */\nclass Entity {\n constructor(componentsOrOptions, name) {\n /**\n * The unique identifier for the entity\n */\n this.id = Entity._ID++;\n this.name = `Entity#${this.id}`;\n /**\n * Listen to or emit events for an entity\n */\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n this._tags = new Set();\n this.componentAdded$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_1__.Observable();\n this.componentRemoved$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_1__.Observable();\n this.tagAdded$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_1__.Observable();\n this.tagRemoved$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_1__.Observable();\n /**\n * Current components on the entity\n *\n * **Do not modify**\n *\n * Use addComponent/removeComponent otherwise the ECS will not be notified of changes.\n */\n this.components = new Map();\n this.componentValues = [];\n this._componentsToRemove = [];\n /**\n * The current scene that the entity is in, if any\n */\n this.scene = null;\n /**\n * Whether this entity is active, if set to false it will be reclaimed\n */\n this.isActive = true;\n this._parent = null;\n this.childrenAdded$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_1__.Observable();\n this.childrenRemoved$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_1__.Observable();\n this._children = [];\n this._isInitialized = false;\n this._isAdded = false;\n let componentsToAdd;\n let nameToAdd;\n let silence = false;\n if (Array.isArray(componentsOrOptions)) {\n componentsToAdd = componentsOrOptions;\n nameToAdd = name;\n }\n else if (componentsOrOptions && typeof componentsOrOptions === 'object') {\n const { components, name, silenceWarnings } = componentsOrOptions;\n componentsToAdd = components !== null && components !== void 0 ? components : [];\n nameToAdd = name;\n silence = !!silenceWarnings;\n }\n if (nameToAdd) {\n this.name = nameToAdd;\n }\n if (componentsToAdd) {\n for (const component of componentsToAdd) {\n this.addComponent(component);\n }\n }\n if (true) {\n if (!silence) {\n setTimeout(() => {\n if (!this.scene && !this.isInitialized) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_2__.Logger.getInstance().warn(`Entity \"${this.name || this.id}\" was not added to a scene.`);\n }\n }, 5000);\n }\n }\n }\n /**\n * Whether this entity is active, if set to false it will be reclaimed\n * @deprecated use isActive\n */\n get active() {\n return this.isActive;\n }\n /**\n * Whether this entity is active, if set to false it will be reclaimed\n * @deprecated use isActive\n */\n set active(val) {\n this.isActive = val;\n }\n /**\n * Kill the entity, means it will no longer be updated. Kills are deferred to the end of the update.\n * If parented it will be removed from the parent when killed.\n */\n kill() {\n if (this.isActive) {\n this.isActive = false;\n this.unparent();\n }\n this.emit('kill', new _Events__WEBPACK_IMPORTED_MODULE_3__.KillEvent(this));\n }\n isKilled() {\n return !this.isActive;\n }\n /**\n * Specifically get the tags on the entity from {@apilink TagsComponent}\n */\n get tags() {\n return this._tags;\n }\n /**\n * Check if a tag exists on the entity\n * @param tag name to check for\n */\n hasTag(tag) {\n return this._tags.has(tag);\n }\n /**\n * Adds a tag to an entity\n * @param tag\n */\n addTag(tag) {\n this._tags.add(tag);\n this.tagAdded$.notifyAll(tag);\n return this;\n }\n /**\n * Removes a tag on the entity\n *\n * Removals are deferred until the end of update\n * @param tag\n */\n removeTag(tag) {\n this._tags.delete(tag);\n this.tagRemoved$.notifyAll(tag);\n return this;\n }\n /**\n * The types of the components on the Entity\n */\n get types() {\n return Array.from(this.components.keys());\n }\n /**\n * Returns all component instances on entity\n */\n getComponents() {\n return Array.from(this.components.values());\n }\n /**\n * Verifies that an entity has all the required types\n * @param requiredTypes\n */\n hasAll(requiredTypes) {\n for (let i = 0; i < requiredTypes.length; i++) {\n if (!this.components.has(requiredTypes[i])) {\n return false;\n }\n }\n return true;\n }\n /**\n * Verifies that an entity has all the required tags\n * @param requiredTags\n */\n hasAllTags(requiredTags) {\n for (let i = 0; i < requiredTags.length; i++) {\n if (!this.tags.has(requiredTags[i])) {\n return false;\n }\n }\n return true;\n }\n get(type) {\n return this.components.get(type);\n }\n get parent() {\n return this._parent;\n }\n /**\n * Get the direct children of this entity\n */\n get children() {\n return this._children;\n }\n /**\n * Unparents this entity, if there is a parent. Otherwise it does nothing.\n */\n unparent() {\n if (this._parent) {\n this._parent.removeChild(this);\n this._parent = null;\n }\n }\n /**\n * Adds an entity to be a child of this entity\n * @param entity\n */\n addChild(entity) {\n if (entity.parent === null) {\n if (this.getAncestors().includes(entity)) {\n throw new Error('Cycle detected, cannot add entity');\n }\n this._children.push(entity);\n entity._parent = this;\n this.childrenAdded$.notifyAll(entity);\n }\n else {\n throw new Error('Entity already has a parent, cannot add without unparenting');\n }\n return this;\n }\n /**\n * Remove an entity from children if it exists\n * @param entity\n */\n removeChild(entity) {\n if (entity.parent === this) {\n (0,_Util_Util__WEBPACK_IMPORTED_MODULE_4__.removeItemFromArray)(entity, this._children);\n entity._parent = null;\n this.childrenRemoved$.notifyAll(entity);\n }\n return this;\n }\n /**\n * Removes all children from this entity\n */\n removeAllChildren() {\n // Avoid modifying the array issue by walking backwards\n for (let i = this.children.length - 1; i >= 0; i--) {\n this.removeChild(this.children[i]);\n }\n return this;\n }\n /**\n * Returns a list of parent entities starting with the topmost parent. Includes the current entity.\n */\n getAncestors() {\n const result = [this];\n let current = this.parent;\n while (current) {\n result.push(current);\n current = current.parent;\n }\n return result.reverse();\n }\n /**\n * Returns a list of all the entities that descend from this entity. Includes the current entity.\n */\n getDescendants() {\n let result = [this];\n let queue = [this];\n while (queue.length > 0) {\n const curr = queue.pop();\n if (curr) {\n queue = queue.concat(curr.children);\n result = result.concat(curr.children);\n }\n }\n return result;\n }\n /**\n * Creates a deep copy of the entity and a copy of all its components\n */\n clone() {\n const newEntity = new Entity();\n for (const c of this.types) {\n const componentInstance = this.get(c);\n if (componentInstance) {\n newEntity.addComponent(componentInstance.clone());\n }\n }\n for (const child of this.children) {\n newEntity.addChild(child.clone());\n }\n return newEntity;\n }\n /**\n * Adds a copy of all the components from another template entity as a \"prefab\"\n * @param templateEntity Entity to use as a template\n * @param force Force component replacement if it already exists on the target entity\n */\n addTemplate(templateEntity, force = false) {\n for (const c of templateEntity.getComponents()) {\n this.addComponent(c.clone(), force);\n }\n for (const child of templateEntity.children) {\n this.addChild(child.clone().addTemplate(child));\n }\n return this;\n }\n _getClassHierarchyRoot(componentType) {\n var _a, _b;\n let current = componentType;\n let parent = (_a = Object.getPrototypeOf(current.prototype)) === null || _a === void 0 ? void 0 : _a.constructor;\n while (parent && parent !== Object && parent !== _Component__WEBPACK_IMPORTED_MODULE_5__.Component) {\n current = parent;\n parent = (_b = Object.getPrototypeOf(current.prototype)) === null || _b === void 0 ? void 0 : _b.constructor;\n }\n return current;\n }\n /**\n * Adds a component to the entity\n * @param component Component or Entity to add copy of components from\n * @param force Optionally overwrite any existing components of the same type\n */\n addComponent(component, force = false) {\n // if component already exists, skip if not forced\n if (this.has(component.constructor)) {\n if (force) {\n // Remove existing component type if exists when forced\n this.removeComponent(component.constructor, true);\n }\n else {\n // early exit component exits\n return this;\n }\n }\n // TODO circular dependencies will be a problem\n if (component.dependencies && component.dependencies.length) {\n for (const ctor of component.dependencies) {\n this.addComponent(new ctor());\n }\n }\n component.owner = this;\n const rootComponent = this._getClassHierarchyRoot(component.constructor);\n this.components.set(rootComponent, component);\n this.components.set(component.constructor, component);\n this.componentValues.push(component);\n if (component.onAdd) {\n component.onAdd(this);\n }\n this.componentAdded$.notifyAll(component);\n return this;\n }\n /**\n * Removes a component from the entity, by default removals are deferred to the end of entity update to avoid consistency issues\n *\n * Components can be force removed with the `force` flag, the removal is not deferred and happens immediately\n * @param typeOrInstance\n * @param force\n */\n removeComponent(typeOrInstance, force = false) {\n let type;\n if ((0,_Component__WEBPACK_IMPORTED_MODULE_5__.isComponentCtor)(typeOrInstance)) {\n type = typeOrInstance;\n }\n else {\n type = typeOrInstance.constructor;\n }\n if (force) {\n const componentToRemove = this.components.get(type);\n if (componentToRemove) {\n this.componentRemoved$.notifyAll(componentToRemove);\n componentToRemove.owner = undefined;\n if (componentToRemove.onRemove) {\n componentToRemove.onRemove(this);\n }\n const componentIndex = this.componentValues.indexOf(componentToRemove);\n if (componentIndex > -1) {\n this.componentValues.splice(componentIndex, 1);\n }\n }\n const rootComponent = this._getClassHierarchyRoot(type);\n this.components.delete(rootComponent);\n this.components.delete(type); // remove after the notify to preserve typing\n }\n else {\n this._componentsToRemove.push(type);\n }\n return this;\n }\n clearComponents() {\n const components = this.types;\n for (const c of components) {\n this.removeComponent(c);\n }\n }\n /**\n * @hidden\n * @internal\n */\n processComponentRemoval() {\n for (const type of this._componentsToRemove) {\n this.removeComponent(type, true);\n }\n this._componentsToRemove.length = 0;\n }\n /**\n * Check if a component type exists\n * @param type\n */\n has(type) {\n return this.components.has(type);\n }\n /**\n * Gets whether the actor is Initialized\n */\n get isInitialized() {\n return this._isInitialized;\n }\n get isAdded() {\n return this._isAdded;\n }\n /**\n * Initializes this entity, meant to be called by the Scene before first update not by users of Excalibur.\n *\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n * @internal\n */\n _initialize(engine) {\n if (!this.isInitialized) {\n this.onInitialize(engine);\n this.events.emit('initialize', new _Events__WEBPACK_IMPORTED_MODULE_3__.InitializeEvent(engine, this));\n this._isInitialized = true;\n }\n }\n /**\n * Adds this Actor, meant to be called by the Scene when Actor is added.\n *\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n * @internal\n */\n _add(engine) {\n if (!this.isAdded && this.isActive) {\n this.onAdd(engine);\n this.events.emit('add', new _Events__WEBPACK_IMPORTED_MODULE_3__.AddEvent(engine, this));\n this._isAdded = true;\n }\n }\n /**\n * Removes Actor, meant to be called by the Scene when Actor is added.\n *\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n * @internal\n */\n _remove(engine) {\n if (this.isAdded && !this.isActive) {\n this.onRemove(engine);\n this.events.emit('remove', new _Events__WEBPACK_IMPORTED_MODULE_3__.RemoveEvent(engine, this));\n this._isAdded = false;\n }\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _preupdate handler for {@apilink onPreUpdate} lifecycle event\n * @internal\n */\n _preupdate(engine, elapsed) {\n this.events.emit('preupdate', new _Events__WEBPACK_IMPORTED_MODULE_3__.PreUpdateEvent(engine, elapsed, this));\n this.onPreUpdate(engine, elapsed);\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _preupdate handler for {@apilink onPostUpdate} lifecycle event\n * @internal\n */\n _postupdate(engine, elapsed) {\n this.events.emit('postupdate', new _Events__WEBPACK_IMPORTED_MODULE_3__.PostUpdateEvent(engine, elapsed, this));\n this.onPostUpdate(engine, elapsed);\n }\n /**\n * `onInitialize` is called before the first update of the entity. This method is meant to be\n * overridden.\n *\n * Synonymous with the event handler `.on('initialize', (evt) => {...})`\n */\n onInitialize(engine) {\n // Override me\n }\n /**\n * `onAdd` is called when Actor is added to scene. This method is meant to be\n * overridden.\n *\n * Synonymous with the event handler `.on('add', (evt) => {...})`\n */\n onAdd(engine) {\n // Override me\n }\n /**\n * `onRemove` is called when Actor is added to scene. This method is meant to be\n * overridden.\n *\n * Synonymous with the event handler `.on('remove', (evt) => {...})`\n */\n onRemove(engine) {\n // Override me\n }\n /**\n * Safe to override onPreUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPreUpdate` is called directly before an entity is updated.\n */\n onPreUpdate(engine, elapsed) {\n // Override me\n }\n /**\n * Safe to override onPostUpdate lifecycle event handler. Synonymous with `.on('postupdate', (evt) =>{...})`\n *\n * `onPostUpdate` is called directly after an entity is updated.\n */\n onPostUpdate(engine, elapsed) {\n // Override me\n }\n /**\n *\n * Entity update lifecycle, called internally\n * @internal\n * @param engine\n * @param elapsed\n */\n update(engine, elapsed) {\n this._initialize(engine);\n this._add(engine);\n this._preupdate(engine, elapsed);\n for (const child of this.children) {\n child.update(engine, elapsed);\n }\n this._postupdate(engine, elapsed);\n this._remove(engine);\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n if (handler) {\n this.events.off(eventName, handler);\n }\n else {\n this.events.off(eventName);\n }\n }\n}\nEntity._ID = 0;\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/EntityManager.ts\":\n/*!************************************************!*\\\n !*** ./EntityComponentSystem/EntityManager.ts ***!\n \\************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EntityManager: () => (/* binding */ EntityManager)\n/* harmony export */ });\n/* harmony import */ var _Entity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Util */ \"./Util/Util.ts\");\n\n\n// Add/Remove entities and components\nclass EntityManager {\n constructor(_world) {\n this._world = _world;\n this.entities = [];\n this._entityIndex = {};\n this._childAddedHandlerMap = new Map();\n this._childRemovedHandlerMap = new Map();\n this._createChildAddedHandler = () => (e) => {\n this.addEntity(e);\n };\n this._createChildRemovedHandler = () => (e) => {\n this.removeEntity(e, false);\n };\n this._entitiesToRemove = [];\n }\n /**\n * Runs the entity lifecycle\n * @param scene\n * @param elapsed\n */\n updateEntities(scene, elapsed) {\n for (let entityIndex = 0; entityIndex < this.entities.length; entityIndex++) {\n const entity = this.entities[entityIndex];\n entity.update(scene.engine, elapsed);\n if (!entity.isActive) {\n this.removeEntity(entity);\n }\n }\n }\n findEntitiesForRemoval() {\n for (let entityIndex = 0; entityIndex < this.entities.length; entityIndex++) {\n const entity = this.entities[entityIndex];\n if (!entity.isActive) {\n this.removeEntity(entity);\n }\n }\n }\n /**\n * Adds an entity to be tracked by the EntityManager\n * @param entity\n */\n addEntity(entity) {\n entity.isActive = true;\n entity.scene = this._world.scene;\n if (entity && !this._entityIndex[entity.id]) {\n this._entityIndex[entity.id] = entity;\n this.entities.push(entity);\n this._world.queryManager.addEntity(entity);\n // if entity has children\n entity.children.forEach((c) => {\n c.scene = entity.scene;\n this.addEntity(c);\n });\n const childAdded = this._createChildAddedHandler();\n this._childAddedHandlerMap.set(entity, childAdded);\n const childRemoved = this._createChildRemovedHandler();\n this._childRemovedHandlerMap.set(entity, childRemoved);\n entity.childrenAdded$.subscribe(childAdded);\n entity.childrenRemoved$.subscribe(childRemoved);\n }\n }\n removeEntity(idOrEntity, deferred = true) {\n var _a, _b;\n let id = 0;\n if (idOrEntity instanceof _Entity__WEBPACK_IMPORTED_MODULE_0__.Entity) {\n id = idOrEntity.id;\n }\n else {\n id = idOrEntity;\n }\n const entity = this._entityIndex[id];\n if (entity && entity.isActive) {\n entity.isActive = false;\n }\n if (entity && deferred) {\n this._entitiesToRemove.push(entity);\n return;\n }\n delete this._entityIndex[id];\n if (entity) {\n entity.scene = null;\n (0,_Util_Util__WEBPACK_IMPORTED_MODULE_1__.removeItemFromArray)(entity, this.entities);\n this._world.queryManager.removeEntity(entity);\n // if entity has children\n entity.children.forEach((c) => {\n c.scene = null;\n this.removeEntity(c, deferred);\n });\n const childAddedHandler = this._childAddedHandlerMap.get(entity);\n if (childAddedHandler) {\n entity.childrenAdded$.unsubscribe(childAddedHandler);\n }\n const childRemovedHandler = this._childRemovedHandlerMap.get(entity);\n if (childRemovedHandler) {\n entity.childrenRemoved$.unsubscribe(childRemovedHandler);\n }\n // stats\n if ((_b = (_a = this._world) === null || _a === void 0 ? void 0 : _a.scene) === null || _b === void 0 ? void 0 : _b.engine) {\n this._world.scene.engine.stats.currFrame.actors.killed++;\n }\n }\n }\n processEntityRemovals() {\n for (let entityIndex = 0; entityIndex < this._entitiesToRemove.length; entityIndex++) {\n const entity = this._entitiesToRemove[entityIndex];\n if (entity.isActive) {\n continue;\n }\n this.removeEntity(entity, false);\n }\n this._entitiesToRemove.length = 0;\n }\n processComponentRemovals() {\n for (let entityIndex = 0; entityIndex < this.entities.length; entityIndex++) {\n const entity = this.entities[entityIndex];\n entity.processComponentRemoval();\n }\n }\n getById(id) {\n return this._entityIndex[id];\n }\n getByName(name) {\n return this.entities.filter((e) => e.name === name);\n }\n clear() {\n for (let i = this.entities.length - 1; i >= 0; i--) {\n this.removeEntity(this.entities[i]);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/Priority.ts\":\n/*!*******************************************!*\\\n !*** ./EntityComponentSystem/Priority.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SystemPriority: () => (/* binding */ SystemPriority)\n/* harmony export */ });\n/**\n * Higher priorities run earlier than others in the system update\n */\nconst SystemPriority = {\n Highest: -Infinity,\n Higher: -5,\n Average: 0,\n Lower: 5,\n Lowest: Infinity\n};\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/Query.ts\":\n/*!****************************************!*\\\n !*** ./EntityComponentSystem/Query.ts ***!\n \\****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Query: () => (/* binding */ Query)\n/* harmony export */ });\n/* harmony import */ var _Util_Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Util/Observable */ \"./Util/Observable.ts\");\n\n/**\n * Represents query for entities that match a list of types that is cached and observable\n *\n * Queries can be strongly typed by supplying a type union in the optional type parameter\n * ```typescript\n * const queryAB = new ex.Query(['A', 'B']);\n * ```\n */\nclass Query {\n constructor(requiredComponents) {\n this.requiredComponents = requiredComponents;\n this.components = new Set();\n this.entities = [];\n /**\n * This fires right after the component is added\n */\n this.entityAdded$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_0__.Observable();\n /**\n * This fires right before the component is actually removed from the entity, it will still be available for cleanup purposes\n */\n this.entityRemoved$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_0__.Observable();\n if (requiredComponents.length === 0) {\n throw new Error('Cannot create query without components');\n }\n for (const type of requiredComponents) {\n this.components.add(type);\n }\n this.id = Query.createId(requiredComponents);\n }\n static createId(requiredComponents) {\n // TODO what happens if a user defines the same type name as a built in type\n // ! TODO this could be dangerous depending on the bundler's settings for names\n // Maybe some kind of hash function is better here?\n return requiredComponents\n .slice()\n .map((c) => c.name)\n .sort()\n .join('-');\n }\n /**\n * Potentially adds an entity to a query index, returns true if added, false if not\n * @param entity\n */\n checkAndAdd(entity) {\n if (!this.entities.includes(entity) && entity.hasAll(Array.from(this.components))) {\n this.entities.push(entity);\n this.entityAdded$.notifyAll(entity);\n return true;\n }\n return false;\n }\n removeEntity(entity) {\n const index = this.entities.indexOf(entity);\n if (index > -1) {\n this.entities.splice(index, 1);\n this.entityRemoved$.notifyAll(entity);\n }\n }\n /**\n * Returns a list of entities that match the query\n * @param sort Optional sorting function to sort entities returned from the query\n */\n getEntities(sort) {\n if (sort) {\n this.entities.sort(sort);\n }\n return this.entities;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/QueryManager.ts\":\n/*!***********************************************!*\\\n !*** ./EntityComponentSystem/QueryManager.ts ***!\n \\***********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ QueryManager: () => (/* binding */ QueryManager)\n/* harmony export */ });\n/* harmony import */ var _Query__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Query */ \"./EntityComponentSystem/Query.ts\");\n/* harmony import */ var _TagQuery__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./TagQuery */ \"./EntityComponentSystem/TagQuery.ts\");\n\n\n/**\n * The query manager is responsible for updating all queries when entities/components change\n */\nclass QueryManager {\n constructor(_world) {\n this._world = _world;\n this._queries = new Map();\n this._addComponentHandlers = new Map();\n this._removeComponentHandlers = new Map();\n this._componentToQueriesIndex = new Map();\n this._tagQueries = new Map();\n this._addTagHandlers = new Map();\n this._removeTagHandlers = new Map();\n this._tagToQueriesIndex = new Map();\n this._createAddComponentHandler = (entity) => (c) => {\n this.addComponent(entity, c);\n };\n this._createRemoveComponentHandler = (entity) => (c) => {\n this.removeComponent(entity, c);\n };\n this._createAddTagHandler = (entity) => (tag) => {\n this.addTag(entity, tag);\n };\n this._createRemoveTagHandler = (entity) => (tag) => {\n this.removeTag(entity, tag);\n };\n }\n createQuery(requiredComponents) {\n const id = _Query__WEBPACK_IMPORTED_MODULE_0__.Query.createId(requiredComponents);\n if (this._queries.has(id)) {\n // short circuit if query is already created\n return this._queries.get(id);\n }\n const query = new _Query__WEBPACK_IMPORTED_MODULE_0__.Query(requiredComponents);\n this._queries.set(query.id, query);\n // index maintenance\n for (const component of requiredComponents) {\n const queries = this._componentToQueriesIndex.get(component);\n if (!queries) {\n this._componentToQueriesIndex.set(component, [query]);\n }\n else {\n queries.push(query);\n }\n }\n for (const entity of this._world.entities) {\n this.addEntity(entity);\n }\n return query;\n }\n createTagQuery(requiredTags) {\n const id = _TagQuery__WEBPACK_IMPORTED_MODULE_1__.TagQuery.createId(requiredTags);\n if (this._tagQueries.has(id)) {\n // short circuit if query is already created\n return this._tagQueries.get(id);\n }\n const query = new _TagQuery__WEBPACK_IMPORTED_MODULE_1__.TagQuery(requiredTags);\n this._tagQueries.set(query.id, query);\n // index maintenance\n for (const tag of requiredTags) {\n const queries = this._tagToQueriesIndex.get(tag);\n if (!queries) {\n this._tagToQueriesIndex.set(tag, [query]);\n }\n else {\n queries.push(query);\n }\n }\n for (const entity of this._world.entities) {\n this.addEntity(entity);\n }\n return query;\n }\n /**\n * Scans queries and locates any that need this entity added\n * @param entity\n */\n addEntity(entity) {\n const maybeAddComponent = this._addComponentHandlers.get(entity);\n const maybeRemoveComponent = this._removeComponentHandlers.get(entity);\n const addComponent = maybeAddComponent !== null && maybeAddComponent !== void 0 ? maybeAddComponent : this._createAddComponentHandler(entity);\n const removeComponent = maybeRemoveComponent !== null && maybeRemoveComponent !== void 0 ? maybeRemoveComponent : this._createRemoveComponentHandler(entity);\n this._addComponentHandlers.set(entity, addComponent);\n this._removeComponentHandlers.set(entity, removeComponent);\n const maybeAddTag = this._addTagHandlers.get(entity);\n const maybeRemoveTag = this._removeTagHandlers.get(entity);\n const addTag = maybeAddTag !== null && maybeAddTag !== void 0 ? maybeAddTag : this._createAddTagHandler(entity);\n const removeTag = maybeRemoveTag !== null && maybeRemoveTag !== void 0 ? maybeRemoveTag : this._createRemoveTagHandler(entity);\n this._addTagHandlers.set(entity, addTag);\n this._removeTagHandlers.set(entity, removeTag);\n for (const query of this._queries.values()) {\n query.checkAndAdd(entity);\n }\n for (const tagQuery of this._tagQueries.values()) {\n tagQuery.checkAndAdd(entity);\n }\n entity.componentAdded$.subscribe(addComponent);\n entity.componentRemoved$.subscribe(removeComponent);\n entity.tagAdded$.subscribe(addTag);\n entity.tagRemoved$.subscribe(removeTag);\n }\n /**\n * Scans queries and locates any that need this entity removed\n * @param entity\n */\n removeEntity(entity) {\n // Handle components\n const addComponent = this._addComponentHandlers.get(entity);\n const removeComponent = this._removeComponentHandlers.get(entity);\n for (const query of this._queries.values()) {\n query.removeEntity(entity);\n }\n if (addComponent) {\n entity.componentAdded$.unsubscribe(addComponent);\n }\n if (removeComponent) {\n entity.componentRemoved$.unsubscribe(removeComponent);\n }\n // Handle tags\n const addTag = this._addTagHandlers.get(entity);\n const removeTag = this._removeTagHandlers.get(entity);\n for (const tagQuery of this._tagQueries.values()) {\n tagQuery.removeEntity(entity);\n }\n if (addTag) {\n entity.tagAdded$.unsubscribe(addTag);\n }\n if (removeTag) {\n entity.tagRemoved$.unsubscribe(removeTag);\n }\n }\n /**\n * Updates any queries when a component is added to an entity\n * @param entity\n * @param component\n */\n addComponent(entity, component) {\n var _a;\n const queries = (_a = this._componentToQueriesIndex.get(component.constructor)) !== null && _a !== void 0 ? _a : [];\n for (const query of queries) {\n query.checkAndAdd(entity);\n }\n }\n /**\n * Updates any queries when a component is removed from an entity\n * @param entity\n * @param component\n */\n removeComponent(entity, component) {\n var _a;\n const queries = (_a = this._componentToQueriesIndex.get(component.constructor)) !== null && _a !== void 0 ? _a : [];\n for (const query of queries) {\n query.removeEntity(entity);\n }\n }\n /**\n * Updates any queries when a tag is added to an entity\n * @param entity\n * @param tag\n */\n addTag(entity, tag) {\n var _a;\n const queries = (_a = this._tagToQueriesIndex.get(tag)) !== null && _a !== void 0 ? _a : [];\n for (const query of queries) {\n query.checkAndAdd(entity);\n }\n }\n /**\n * Updates any queries when a component is removed from an entity\n * @param entity\n * @param tag\n */\n removeTag(entity, tag) {\n var _a;\n const queries = (_a = this._tagToQueriesIndex.get(tag)) !== null && _a !== void 0 ? _a : [];\n for (const query of queries) {\n query.removeEntity(entity);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/System.ts\":\n/*!*****************************************!*\\\n !*** ./EntityComponentSystem/System.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ System: () => (/* binding */ System),\n/* harmony export */ SystemType: () => (/* binding */ SystemType)\n/* harmony export */ });\n/* harmony import */ var _Priority__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Priority */ \"./EntityComponentSystem/Priority.ts\");\n\n/**\n * Enum that determines whether to run the system in the update or draw phase\n */\nvar SystemType;\n(function (SystemType) {\n SystemType[\"Update\"] = \"update\";\n SystemType[\"Draw\"] = \"draw\";\n})(SystemType || (SystemType = {}));\n/**\n * An Excalibur {@apilink System} that updates entities of certain types.\n * Systems are scene specific\n *\n *\n *\n * Excalibur Systems currently require at least 1 Component type to operated\n *\n * Multiple types are declared as a type union\n * For example:\n *\n * ```typescript\n * class MySystem extends System {\n * static priority = SystemPriority.Lowest;\n * public readonly systemType = SystemType.Update;\n * public query: Query;\n * constructor(public world: World) {\n * super();\n * this.query = this.world.query([TransformComponent]);\n * }\n * public update(elapsed: number) {\n * ...\n * }\n * }\n * ```\n */\nclass System {\n}\n/**\n * System can execute in priority order, by default all systems are priority 0. Lower values indicated higher priority.\n * For a system to execute before all other a lower priority value (-1 for example) must be set.\n * For a system to execute after all other a higher priority value (10 for example) must be set.\n */\nSystem.priority = _Priority__WEBPACK_IMPORTED_MODULE_0__.SystemPriority.Average;\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/SystemManager.ts\":\n/*!************************************************!*\\\n !*** ./EntityComponentSystem/SystemManager.ts ***!\n \\************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SystemManager: () => (/* binding */ SystemManager),\n/* harmony export */ isSystemConstructor: () => (/* binding */ isSystemConstructor)\n/* harmony export */ });\n/* harmony import */ var _System__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Util */ \"./Util/Util.ts\");\n\n\n/**\n *\n */\nfunction isSystemConstructor(x) {\n var _a, _b;\n return !!(x === null || x === void 0 ? void 0 : x.prototype) && !!((_b = (_a = x === null || x === void 0 ? void 0 : x.prototype) === null || _a === void 0 ? void 0 : _a.constructor) === null || _b === void 0 ? void 0 : _b.name);\n}\n/**\n * The SystemManager is responsible for keeping track of all systems in a scene.\n * Systems are scene specific\n */\nclass SystemManager {\n constructor(_world) {\n this._world = _world;\n /**\n * List of systems, to add a new system call {@apilink SystemManager.addSystem}\n */\n this.systems = [];\n this.initialized = false;\n }\n /**\n * Get a system registered in the manager by type\n * @param systemType\n */\n get(systemType) {\n return this.systems.find((s) => s instanceof systemType);\n }\n /**\n * Adds a system to the manager, it will now be updated every frame\n * @param systemOrCtor\n */\n addSystem(systemOrCtor) {\n let system;\n if (systemOrCtor instanceof _System__WEBPACK_IMPORTED_MODULE_0__.System) {\n system = systemOrCtor;\n }\n else {\n system = new systemOrCtor(this._world);\n }\n this.systems.push(system);\n this.systems.sort((a, b) => a.constructor.priority - b.constructor.priority);\n // If systems are added and the manager has already been init'd\n // then immediately init the system\n if (this.initialized && system.initialize) {\n system.initialize(this._world, this._world.scene);\n }\n }\n /**\n * Removes a system from the manager, it will no longer be updated\n * @param system\n */\n removeSystem(system) {\n (0,_Util_Util__WEBPACK_IMPORTED_MODULE_1__.removeItemFromArray)(system, this.systems);\n }\n /**\n * Initialize all systems in the manager\n *\n * Systems added after initialize() will be initialized on add\n */\n initialize() {\n if (!this.initialized) {\n this.initialized = true;\n for (const s of this.systems) {\n if (s.initialize) {\n s.initialize(this._world, this._world.scene);\n }\n }\n }\n }\n /**\n * Updates all systems\n * @param type whether this is an update or draw system\n * @param scene context reference\n * @param elapsed time in milliseconds\n */\n updateSystems(type, scene, elapsed) {\n const systems = this.systems.filter((s) => s.systemType === type);\n for (const s of systems) {\n if (s.preupdate) {\n s.preupdate(scene, elapsed);\n }\n }\n for (const s of systems) {\n s.update(elapsed);\n }\n for (const s of systems) {\n if (s.postupdate) {\n s.postupdate(scene, elapsed);\n }\n }\n }\n clear() {\n for (let i = this.systems.length - 1; i >= 0; i--) {\n this.removeSystem(this.systems[i]);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/TagQuery.ts\":\n/*!*******************************************!*\\\n !*** ./EntityComponentSystem/TagQuery.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TagQuery: () => (/* binding */ TagQuery)\n/* harmony export */ });\n/* harmony import */ var _Util_Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Util/Observable */ \"./Util/Observable.ts\");\n\nclass TagQuery {\n constructor(requiredTags) {\n this.requiredTags = requiredTags;\n this.tags = new Set();\n this.entities = [];\n /**\n * This fires right after the component is added\n */\n this.entityAdded$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_0__.Observable();\n /**\n * This fires right before the component is actually removed from the entity, it will still be available for cleanup purposes\n */\n this.entityRemoved$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_0__.Observable();\n if (requiredTags.length === 0) {\n throw new Error('Cannot create tag query without tags');\n }\n for (const tag of requiredTags) {\n this.tags.add(tag);\n }\n this.id = TagQuery.createId(requiredTags);\n }\n static createId(requiredComponents) {\n return requiredComponents.slice().sort().join('-');\n }\n checkAndAdd(entity) {\n if (!this.entities.includes(entity) && entity.hasAllTags(Array.from(this.tags))) {\n this.entities.push(entity);\n this.entityAdded$.notifyAll(entity);\n return true;\n }\n return false;\n }\n removeEntity(entity) {\n const index = this.entities.indexOf(entity);\n if (index > -1) {\n this.entities.splice(index, 1);\n this.entityRemoved$.notifyAll(entity);\n }\n }\n /**\n * Returns a list of entities that match the query\n * @param sort Optional sorting function to sort entities returned from the query\n */\n getEntities(sort) {\n if (sort) {\n this.entities.sort(sort);\n }\n return this.entities;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/World.ts\":\n/*!****************************************!*\\\n !*** ./EntityComponentSystem/World.ts ***!\n \\****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ World: () => (/* binding */ World)\n/* harmony export */ });\n/* harmony import */ var _Entity__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _EntityManager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./EntityManager */ \"./EntityComponentSystem/EntityManager.ts\");\n/* harmony import */ var _QueryManager__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./QueryManager */ \"./EntityComponentSystem/QueryManager.ts\");\n/* harmony import */ var _System__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _SystemManager__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./SystemManager */ \"./EntityComponentSystem/SystemManager.ts\");\n\n\n\n\n\n/**\n * The World is a self-contained entity component system for a particular context.\n */\nclass World {\n /**\n * The context type is passed to the system updates\n * @param scene\n */\n constructor(scene) {\n this.scene = scene;\n this.queryManager = new _QueryManager__WEBPACK_IMPORTED_MODULE_0__.QueryManager(this);\n this.entityManager = new _EntityManager__WEBPACK_IMPORTED_MODULE_1__.EntityManager(this);\n this.systemManager = new _SystemManager__WEBPACK_IMPORTED_MODULE_2__.SystemManager(this);\n }\n /**\n * Query the ECS world for entities that match your components\n * @param requiredTypes\n */\n query(requiredTypes) {\n return this.queryManager.createQuery(requiredTypes);\n }\n queryTags(requiredTags) {\n return this.queryManager.createTagQuery(requiredTags);\n }\n /**\n * Update systems by type and time elapsed in milliseconds\n */\n update(type, elapsed) {\n if (type === _System__WEBPACK_IMPORTED_MODULE_3__.SystemType.Update) {\n this.entityManager.updateEntities(this.scene, elapsed);\n }\n this.systemManager.updateSystems(type, this.scene, elapsed);\n this.entityManager.findEntitiesForRemoval();\n this.entityManager.processComponentRemovals();\n this.entityManager.processEntityRemovals();\n }\n add(entityOrSystem) {\n if (entityOrSystem instanceof _Entity__WEBPACK_IMPORTED_MODULE_4__.Entity) {\n this.entityManager.addEntity(entityOrSystem);\n }\n if (entityOrSystem instanceof _System__WEBPACK_IMPORTED_MODULE_3__.System || (0,_SystemManager__WEBPACK_IMPORTED_MODULE_2__.isSystemConstructor)(entityOrSystem)) {\n this.systemManager.addSystem(entityOrSystem);\n }\n }\n /**\n * Get a system out of the ECS world\n */\n get(system) {\n return this.systemManager.get(system);\n }\n remove(entityOrSystem, deferred = true) {\n if (entityOrSystem instanceof _Entity__WEBPACK_IMPORTED_MODULE_4__.Entity) {\n this.entityManager.removeEntity(entityOrSystem, deferred);\n }\n if (entityOrSystem instanceof _System__WEBPACK_IMPORTED_MODULE_3__.System) {\n this.systemManager.removeSystem(entityOrSystem);\n }\n }\n get entities() {\n return this.entityManager.entities;\n }\n clearEntities() {\n this.entityManager.clear();\n }\n clearSystems() {\n this.systemManager.clear();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/index.ts\":\n/*!****************************************!*\\\n !*** ./EntityComponentSystem/index.ts ***!\n \\****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AddedComponent: () => (/* reexport safe */ _Entity__WEBPACK_IMPORTED_MODULE_1__.AddedComponent),\n/* harmony export */ Component: () => (/* reexport safe */ _Component__WEBPACK_IMPORTED_MODULE_0__.Component),\n/* harmony export */ Entity: () => (/* reexport safe */ _Entity__WEBPACK_IMPORTED_MODULE_1__.Entity),\n/* harmony export */ EntityEvents: () => (/* reexport safe */ _Entity__WEBPACK_IMPORTED_MODULE_1__.EntityEvents),\n/* harmony export */ EntityManager: () => (/* reexport safe */ _EntityManager__WEBPACK_IMPORTED_MODULE_2__.EntityManager),\n/* harmony export */ MotionComponent: () => (/* reexport safe */ _Components_MotionComponent__WEBPACK_IMPORTED_MODULE_11__.MotionComponent),\n/* harmony export */ Query: () => (/* reexport safe */ _Query__WEBPACK_IMPORTED_MODULE_3__.Query),\n/* harmony export */ QueryManager: () => (/* reexport safe */ _QueryManager__WEBPACK_IMPORTED_MODULE_5__.QueryManager),\n/* harmony export */ RemovedComponent: () => (/* reexport safe */ _Entity__WEBPACK_IMPORTED_MODULE_1__.RemovedComponent),\n/* harmony export */ System: () => (/* reexport safe */ _System__WEBPACK_IMPORTED_MODULE_6__.System),\n/* harmony export */ SystemManager: () => (/* reexport safe */ _SystemManager__WEBPACK_IMPORTED_MODULE_7__.SystemManager),\n/* harmony export */ SystemPriority: () => (/* reexport safe */ _Priority__WEBPACK_IMPORTED_MODULE_9__.SystemPriority),\n/* harmony export */ SystemType: () => (/* reexport safe */ _System__WEBPACK_IMPORTED_MODULE_6__.SystemType),\n/* harmony export */ TagQuery: () => (/* reexport safe */ _TagQuery__WEBPACK_IMPORTED_MODULE_4__.TagQuery),\n/* harmony export */ TransformComponent: () => (/* reexport safe */ _Components_TransformComponent__WEBPACK_IMPORTED_MODULE_10__.TransformComponent),\n/* harmony export */ World: () => (/* reexport safe */ _World__WEBPACK_IMPORTED_MODULE_8__.World),\n/* harmony export */ isAddedComponent: () => (/* reexport safe */ _Entity__WEBPACK_IMPORTED_MODULE_1__.isAddedComponent),\n/* harmony export */ isComponentCtor: () => (/* reexport safe */ _Component__WEBPACK_IMPORTED_MODULE_0__.isComponentCtor),\n/* harmony export */ isRemovedComponent: () => (/* reexport safe */ _Entity__WEBPACK_IMPORTED_MODULE_1__.isRemovedComponent),\n/* harmony export */ isSystemConstructor: () => (/* reexport safe */ _SystemManager__WEBPACK_IMPORTED_MODULE_7__.isSystemConstructor)\n/* harmony export */ });\n/* harmony import */ var _Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Component */ \"./EntityComponentSystem/Component.ts\");\n/* harmony import */ var _Entity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _EntityManager__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./EntityManager */ \"./EntityComponentSystem/EntityManager.ts\");\n/* harmony import */ var _Query__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Query */ \"./EntityComponentSystem/Query.ts\");\n/* harmony import */ var _TagQuery__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./TagQuery */ \"./EntityComponentSystem/TagQuery.ts\");\n/* harmony import */ var _QueryManager__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./QueryManager */ \"./EntityComponentSystem/QueryManager.ts\");\n/* harmony import */ var _System__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _SystemManager__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./SystemManager */ \"./EntityComponentSystem/SystemManager.ts\");\n/* harmony import */ var _World__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./World */ \"./EntityComponentSystem/World.ts\");\n/* harmony import */ var _Priority__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Priority */ \"./EntityComponentSystem/Priority.ts\");\n/* harmony import */ var _Components_TransformComponent__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Components_MotionComponent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./EventEmitter.ts\":\n/*!*************************!*\\\n !*** ./EventEmitter.ts ***!\n \\*************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EventEmitter: () => (/* binding */ EventEmitter)\n/* harmony export */ });\n/**\n * Excalibur's typed event emitter, this allows events to be sent with any string to Type mapping\n */\nclass EventEmitter {\n constructor() {\n this._paused = false;\n this._empty = true;\n this._listeners = {};\n this._listenersOnce = {};\n this._pipes = [];\n }\n /**\n * Removes all listeners and pipes\n */\n clear() {\n this._listeners = {};\n this._listenersOnce = {};\n this._pipes.length = 0;\n this._empty = true;\n }\n on(eventName, handler) {\n var _a;\n this._empty = false;\n this._listeners[eventName] = (_a = this._listeners[eventName]) !== null && _a !== void 0 ? _a : [];\n this._listeners[eventName].push(handler);\n return {\n close: () => this.off(eventName, handler)\n };\n }\n once(eventName, handler) {\n var _a;\n this._empty = false;\n this._listenersOnce[eventName] = (_a = this._listenersOnce[eventName]) !== null && _a !== void 0 ? _a : [];\n this._listenersOnce[eventName].push(handler);\n return {\n close: () => this.off(eventName, handler)\n };\n }\n off(eventName, handler) {\n var _a, _b;\n if (handler) {\n const newListeners = (_a = this._listeners[eventName]) === null || _a === void 0 ? void 0 : _a.filter((h) => h !== handler);\n this._listeners[eventName] = newListeners;\n const newOnceListeners = (_b = this._listenersOnce[eventName]) === null || _b === void 0 ? void 0 : _b.filter((h) => h !== handler);\n this._listenersOnce[eventName] = newOnceListeners;\n }\n else {\n delete this._listeners[eventName];\n }\n }\n emit(eventName, event) {\n if (this._empty) {\n return;\n }\n if (this._paused) {\n return;\n }\n const listeners = this._listeners[eventName];\n if (listeners) {\n for (let i = 0; i < listeners.length; i++) {\n listeners[i](event);\n }\n }\n const onces = this._listenersOnce[eventName];\n this._listenersOnce[eventName] = [];\n if (onces) {\n for (let i = 0; i < onces.length; i++) {\n onces[i](event);\n }\n }\n for (let i = 0; i < this._pipes.length; i++) {\n this._pipes[i].emit(eventName, event);\n }\n }\n /**\n * Replay events from this emitter to another\n * @param emitter\n */\n pipe(emitter) {\n if (this === emitter) {\n throw Error('Cannot pipe to self');\n }\n this._empty = false;\n this._pipes.push(emitter);\n return {\n close: () => {\n const i = this._pipes.indexOf(emitter);\n if (i > -1) {\n this._pipes.splice(i, 1);\n }\n }\n };\n }\n /**\n * Remove any piped emitters\n * @param emitter\n */\n unpipe(emitter) {\n const i = this._pipes.indexOf(emitter);\n if (i > -1) {\n this._pipes.splice(i, 1);\n }\n }\n /**\n * Paused event emitters do not emit events\n */\n pause() {\n this._paused = true;\n }\n /**\n * Unpaused event emitter do emit events\n */\n unpause() {\n this._paused = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Events.ts\":\n/*!*******************!*\\\n !*** ./Events.ts ***!\n \\*******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ActionCompleteEvent: () => (/* binding */ ActionCompleteEvent),\n/* harmony export */ ActionStartEvent: () => (/* binding */ ActionStartEvent),\n/* harmony export */ ActivateEvent: () => (/* binding */ ActivateEvent),\n/* harmony export */ AddEvent: () => (/* binding */ AddEvent),\n/* harmony export */ CollisionEndEvent: () => (/* binding */ CollisionEndEvent),\n/* harmony export */ CollisionPostSolveEvent: () => (/* binding */ CollisionPostSolveEvent),\n/* harmony export */ CollisionPreSolveEvent: () => (/* binding */ CollisionPreSolveEvent),\n/* harmony export */ CollisionStartEvent: () => (/* binding */ CollisionStartEvent),\n/* harmony export */ ContactEndEvent: () => (/* binding */ ContactEndEvent),\n/* harmony export */ ContactStartEvent: () => (/* binding */ ContactStartEvent),\n/* harmony export */ DeactivateEvent: () => (/* binding */ DeactivateEvent),\n/* harmony export */ EnterTriggerEvent: () => (/* binding */ EnterTriggerEvent),\n/* harmony export */ EnterViewPortEvent: () => (/* binding */ EnterViewPortEvent),\n/* harmony export */ EventTypes: () => (/* binding */ EventTypes),\n/* harmony export */ ExitTriggerEvent: () => (/* binding */ ExitTriggerEvent),\n/* harmony export */ ExitViewPortEvent: () => (/* binding */ ExitViewPortEvent),\n/* harmony export */ GameEvent: () => (/* binding */ GameEvent),\n/* harmony export */ GameStartEvent: () => (/* binding */ GameStartEvent),\n/* harmony export */ GameStopEvent: () => (/* binding */ GameStopEvent),\n/* harmony export */ GamepadAxisEvent: () => (/* binding */ GamepadAxisEvent),\n/* harmony export */ GamepadButtonEvent: () => (/* binding */ GamepadButtonEvent),\n/* harmony export */ GamepadConnectEvent: () => (/* binding */ GamepadConnectEvent),\n/* harmony export */ GamepadDisconnectEvent: () => (/* binding */ GamepadDisconnectEvent),\n/* harmony export */ HiddenEvent: () => (/* binding */ HiddenEvent),\n/* harmony export */ InitializeEvent: () => (/* binding */ InitializeEvent),\n/* harmony export */ KillEvent: () => (/* binding */ KillEvent),\n/* harmony export */ PostCollisionEvent: () => (/* binding */ PostCollisionEvent),\n/* harmony export */ PostDebugDrawEvent: () => (/* binding */ PostDebugDrawEvent),\n/* harmony export */ PostDrawEvent: () => (/* binding */ PostDrawEvent),\n/* harmony export */ PostFrameEvent: () => (/* binding */ PostFrameEvent),\n/* harmony export */ PostKillEvent: () => (/* binding */ PostKillEvent),\n/* harmony export */ PostTransformDrawEvent: () => (/* binding */ PostTransformDrawEvent),\n/* harmony export */ PostUpdateEvent: () => (/* binding */ PostUpdateEvent),\n/* harmony export */ PreCollisionEvent: () => (/* binding */ PreCollisionEvent),\n/* harmony export */ PreDebugDrawEvent: () => (/* binding */ PreDebugDrawEvent),\n/* harmony export */ PreDrawEvent: () => (/* binding */ PreDrawEvent),\n/* harmony export */ PreFrameEvent: () => (/* binding */ PreFrameEvent),\n/* harmony export */ PreKillEvent: () => (/* binding */ PreKillEvent),\n/* harmony export */ PreTransformDrawEvent: () => (/* binding */ PreTransformDrawEvent),\n/* harmony export */ PreUpdateEvent: () => (/* binding */ PreUpdateEvent),\n/* harmony export */ RemoveEvent: () => (/* binding */ RemoveEvent),\n/* harmony export */ VisibleEvent: () => (/* binding */ VisibleEvent)\n/* harmony export */ });\nvar EventTypes;\n(function (EventTypes) {\n EventTypes[\"Kill\"] = \"kill\";\n EventTypes[\"PreKill\"] = \"prekill\";\n EventTypes[\"PostKill\"] = \"postkill\";\n EventTypes[\"PreDraw\"] = \"predraw\";\n EventTypes[\"PostDraw\"] = \"postdraw\";\n EventTypes[\"PreDebugDraw\"] = \"predebugdraw\";\n EventTypes[\"PostDebugDraw\"] = \"postdebugdraw\";\n EventTypes[\"PreUpdate\"] = \"preupdate\";\n EventTypes[\"PostUpdate\"] = \"postupdate\";\n EventTypes[\"PreFrame\"] = \"preframe\";\n EventTypes[\"PostFrame\"] = \"postframe\";\n EventTypes[\"PreCollision\"] = \"precollision\";\n EventTypes[\"CollisionStart\"] = \"collisionstart\";\n EventTypes[\"CollisionEnd\"] = \"collisionend\";\n EventTypes[\"PostCollision\"] = \"postcollision\";\n EventTypes[\"Initialize\"] = \"initialize\";\n EventTypes[\"Activate\"] = \"activate\";\n EventTypes[\"Deactivate\"] = \"deactivate\";\n EventTypes[\"ExitViewport\"] = \"exitviewport\";\n EventTypes[\"EnterViewport\"] = \"enterviewport\";\n EventTypes[\"ExitTrigger\"] = \"exit\";\n EventTypes[\"EnterTrigger\"] = \"enter\";\n EventTypes[\"Connect\"] = \"connect\";\n EventTypes[\"Disconnect\"] = \"disconnect\";\n EventTypes[\"Button\"] = \"button\";\n EventTypes[\"Axis\"] = \"axis\";\n EventTypes[\"Visible\"] = \"visible\";\n EventTypes[\"Hidden\"] = \"hidden\";\n EventTypes[\"Start\"] = \"start\";\n EventTypes[\"Stop\"] = \"stop\";\n EventTypes[\"PointerUp\"] = \"pointerup\";\n EventTypes[\"PointerDown\"] = \"pointerdown\";\n EventTypes[\"PointerMove\"] = \"pointermove\";\n EventTypes[\"PointerEnter\"] = \"pointerenter\";\n EventTypes[\"PointerLeave\"] = \"pointerleave\";\n EventTypes[\"PointerCancel\"] = \"pointercancel\";\n EventTypes[\"PointerWheel\"] = \"pointerwheel\";\n EventTypes[\"Up\"] = \"up\";\n EventTypes[\"Down\"] = \"down\";\n EventTypes[\"Move\"] = \"move\";\n EventTypes[\"Enter\"] = \"enter\";\n EventTypes[\"Leave\"] = \"leave\";\n EventTypes[\"Cancel\"] = \"cancel\";\n EventTypes[\"Wheel\"] = \"wheel\";\n EventTypes[\"Press\"] = \"press\";\n EventTypes[\"Release\"] = \"release\";\n EventTypes[\"Hold\"] = \"hold\";\n EventTypes[\"PointerDragStart\"] = \"pointerdragstart\";\n EventTypes[\"PointerDragEnd\"] = \"pointerdragend\";\n EventTypes[\"PointerDragEnter\"] = \"pointerdragenter\";\n EventTypes[\"PointerDragLeave\"] = \"pointerdragleave\";\n EventTypes[\"PointerDragMove\"] = \"pointerdragmove\";\n EventTypes[\"ActionStart\"] = \"actionstart\";\n EventTypes[\"ActionComplete\"] = \"actioncomplete\";\n EventTypes[\"Add\"] = \"add\";\n EventTypes[\"Remove\"] = \"remove\";\n})(EventTypes || (EventTypes = {}));\n/**\n * Base event type in Excalibur that all other event types derive from. Not all event types are thrown on all Excalibur game objects,\n * some events are unique to a type, others are not.\n *\n */\nclass GameEvent {\n constructor() {\n /**\n * Other target object for this event\n */\n this.other = null;\n this._bubbles = true;\n }\n /**\n * If set to false, prevents event from propagating to other actors. If true it will be propagated\n * to all actors that apply.\n */\n get bubbles() {\n return this._bubbles;\n }\n set bubbles(value) {\n this._bubbles = value;\n }\n /**\n * Prevents event from bubbling\n */\n stopPropagation() {\n this.bubbles = false;\n }\n}\n/**\n * The 'kill' event is emitted on actors when it is killed. The target is the actor that was killed.\n */\nclass KillEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'prekill' event is emitted directly before an actor is killed.\n */\nclass PreKillEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'postkill' event is emitted directly after the actor is killed.\n */\nclass PostKillEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'start' event is emitted on engine when has started and is ready for interaction.\n */\nclass GameStartEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'stop' event is emitted on engine when has been stopped and will no longer take input, update or draw.\n */\nclass GameStopEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'predraw' event is emitted on actors, scenes, and engine before drawing starts. Actors' predraw happens inside their graphics\n * transform so that all drawing takes place with the actor as the origin.\n *\n */\nclass PreDrawEvent extends GameEvent {\n constructor(ctx, elapsed, self) {\n super();\n this.ctx = ctx;\n this.elapsed = elapsed;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'postdraw' event is emitted on actors, scenes, and engine after drawing finishes. Actors' postdraw happens inside their graphics\n * transform so that all drawing takes place with the actor as the origin.\n *\n */\nclass PostDrawEvent extends GameEvent {\n constructor(ctx, elapsed, self) {\n super();\n this.ctx = ctx;\n this.elapsed = elapsed;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'pretransformdraw' event is emitted on actors/entities before any graphics transforms have taken place.\n * Useful if you need to completely customize the draw or modify the transform before drawing in the draw step (for example needing\n * latest camera positions)\n *\n */\nclass PreTransformDrawEvent extends GameEvent {\n constructor(ctx, elapsed, self) {\n super();\n this.ctx = ctx;\n this.elapsed = elapsed;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'posttransformdraw' event is emitted on actors/entities after all graphics have been draw and transforms reset.\n * Useful if you need to completely custom the draw after everything is done.\n *\n */\nclass PostTransformDrawEvent extends GameEvent {\n constructor(ctx, elapsed, self) {\n super();\n this.ctx = ctx;\n this.elapsed = elapsed;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'predebugdraw' event is emitted on actors, scenes, and engine before debug drawing starts.\n */\nclass PreDebugDrawEvent extends GameEvent {\n constructor(ctx, self) {\n super();\n this.ctx = ctx;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'postdebugdraw' event is emitted on actors, scenes, and engine after debug drawing starts.\n */\nclass PostDebugDrawEvent extends GameEvent {\n constructor(ctx, self) {\n super();\n this.ctx = ctx;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'preupdate' event is emitted on actors, scenes, camera, and engine before the update starts.\n */\nclass PreUpdateEvent extends GameEvent {\n constructor(engine, elapsed, self) {\n super();\n this.engine = engine;\n this.elapsed = elapsed;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'postupdate' event is emitted on actors, scenes, camera, and engine after the update ends.\n */\nclass PostUpdateEvent extends GameEvent {\n constructor(engine, elapsed, self) {\n super();\n this.engine = engine;\n this.elapsed = elapsed;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'preframe' event is emitted on the engine, before the frame begins.\n */\nclass PreFrameEvent extends GameEvent {\n constructor(engine, prevStats) {\n super();\n this.engine = engine;\n this.prevStats = prevStats;\n this.target = engine;\n }\n}\n/**\n * The 'postframe' event is emitted on the engine, after a frame ends.\n */\nclass PostFrameEvent extends GameEvent {\n constructor(engine, stats) {\n super();\n this.engine = engine;\n this.stats = stats;\n this.target = engine;\n }\n}\n/**\n * Event received when a gamepad is connected to Excalibur. {@apilink Gamepads} receives this event.\n */\nclass GamepadConnectEvent extends GameEvent {\n constructor(index, gamepad) {\n super();\n this.index = index;\n this.gamepad = gamepad;\n this.target = gamepad;\n }\n}\n/**\n * Event received when a gamepad is disconnected from Excalibur. {@apilink Gamepads} receives this event.\n */\nclass GamepadDisconnectEvent extends GameEvent {\n constructor(index, gamepad) {\n super();\n this.index = index;\n this.gamepad = gamepad;\n this.target = gamepad;\n }\n}\n/**\n * Gamepad button event. See {@apilink Gamepads} for information on responding to controller input. {@apilink Gamepad} instances receive this event;\n */\nclass GamepadButtonEvent extends GameEvent {\n /**\n * @param button The Gamepad button\n * @param value A numeric value between 0 and 1\n */\n constructor(button, value, self) {\n super();\n this.button = button;\n this.value = value;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Gamepad axis event. See {@apilink Gamepads} for information on responding to controller input. {@apilink Gamepad} instances receive this event;\n */\nclass GamepadAxisEvent extends GameEvent {\n /**\n * @param axis The Gamepad axis\n * @param value A numeric value between -1 and 1\n */\n constructor(axis, value, self) {\n super();\n this.axis = axis;\n this.value = value;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event received by the {@apilink Engine} when the browser window is visible on a screen.\n */\nclass VisibleEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event received by the {@apilink Engine} when the browser window is hidden from all screens.\n */\nclass HiddenEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event thrown on an {@apilink Actor | `actor`} when a collision will occur this frame if it resolves\n */\nclass PreCollisionEvent extends GameEvent {\n /**\n * @param self The actor the event was thrown on\n * @param other The actor that will collided with the current actor\n * @param side The side that will be collided with the current actor\n * @param intersection Intersection vector\n */\n constructor(self, other, side, intersection, contact) {\n super();\n this.self = self;\n this.other = other;\n this.side = side;\n this.intersection = intersection;\n this.contact = contact;\n this.target = self;\n }\n}\n/**\n * Event thrown on an {@apilink Actor | `actor`} when a collision has been resolved (body reacted) this frame\n */\nclass PostCollisionEvent extends GameEvent {\n /**\n * @param self The actor the event was thrown on\n * @param other The actor that did collide with the current actor\n * @param side The side that did collide with the current actor\n * @param intersection Intersection vector\n */\n constructor(self, other, side, intersection, contact) {\n super();\n this.self = self;\n this.other = other;\n this.side = side;\n this.intersection = intersection;\n this.contact = contact;\n this.target = self;\n }\n}\nclass ContactStartEvent {\n constructor(self, other, side, contact) {\n this.self = self;\n this.other = other;\n this.side = side;\n this.contact = contact;\n }\n}\nclass ContactEndEvent {\n constructor(self, other, side, lastContact) {\n this.self = self;\n this.other = other;\n this.side = side;\n this.lastContact = lastContact;\n }\n}\nclass CollisionPreSolveEvent {\n constructor(self, other, side, intersection, contact) {\n this.self = self;\n this.other = other;\n this.side = side;\n this.intersection = intersection;\n this.contact = contact;\n }\n}\nclass CollisionPostSolveEvent {\n constructor(self, other, side, intersection, contact) {\n this.self = self;\n this.other = other;\n this.side = side;\n this.intersection = intersection;\n this.contact = contact;\n }\n}\n/**\n * Event thrown the first time an {@apilink Actor | `actor`} collides with another, after an actor is in contact normal collision events are fired.\n */\nclass CollisionStartEvent extends GameEvent {\n /**\n *\n * @param self\n * @param other\n * @param side\n * @param contact\n */\n constructor(self, other, side, contact) {\n super();\n this.self = self;\n this.other = other;\n this.side = side;\n this.contact = contact;\n this.target = self;\n }\n}\n/**\n * Event thrown when the {@apilink Actor | `actor`} is no longer colliding with another\n */\nclass CollisionEndEvent extends GameEvent {\n /**\n *\n */\n constructor(self, other, side, lastContact) {\n super();\n this.self = self;\n this.other = other;\n this.side = side;\n this.lastContact = lastContact;\n this.target = self;\n }\n}\n/**\n * Event thrown on an {@apilink Actor}, {@apilink Scene}, and {@apilink Engine} only once before the first update call\n */\nclass InitializeEvent extends GameEvent {\n /**\n * @param engine The reference to the current engine\n */\n constructor(engine, self) {\n super();\n this.engine = engine;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event thrown on a {@apilink Scene} on activation\n */\nclass ActivateEvent extends GameEvent {\n /**\n * @param context The context for the scene activation\n */\n constructor(context, self) {\n super();\n this.context = context;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event thrown on a {@apilink Scene} on deactivation\n */\nclass DeactivateEvent extends GameEvent {\n /**\n * @param context The context for the scene deactivation\n */\n constructor(context, self) {\n super();\n this.context = context;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event thrown on an {@apilink Actor} when the graphics bounds completely leaves the screen.\n */\nclass ExitViewPortEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event thrown on an {@apilink Actor} when any part of the graphics bounds are on screen.\n */\nclass EnterViewPortEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\nclass EnterTriggerEvent extends GameEvent {\n constructor(self, entity) {\n super();\n this.self = self;\n this.entity = entity;\n this.target = self;\n }\n}\nclass ExitTriggerEvent extends GameEvent {\n constructor(self, entity) {\n super();\n this.self = self;\n this.entity = entity;\n this.target = self;\n }\n}\n/**\n * Event thrown on an {@apilink Actor} when an action starts.\n */\nclass ActionStartEvent extends GameEvent {\n constructor(action, self) {\n super();\n this.action = action;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event thrown on an {@apilink Actor} when an action completes.\n */\nclass ActionCompleteEvent extends GameEvent {\n constructor(action, self) {\n super();\n this.action = action;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event thrown on an [[Actor]] when an Actor added to scene.\n */\nclass AddEvent extends GameEvent {\n constructor(engine, self) {\n super();\n this.engine = engine;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event thrown on an [[Actor]] when an Actor removed from scene.\n */\nclass RemoveEvent extends GameEvent {\n constructor(engine, self) {\n super();\n this.engine = engine;\n this.self = self;\n this.target = self;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Events/MediaEvents.ts\":\n/*!*******************************!*\\\n !*** ./Events/MediaEvents.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MediaEvent: () => (/* binding */ MediaEvent),\n/* harmony export */ NativeSoundEvent: () => (/* binding */ NativeSoundEvent),\n/* harmony export */ NativeSoundProcessedEvent: () => (/* binding */ NativeSoundProcessedEvent)\n/* harmony export */ });\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n\nclass MediaEvent extends _Events__WEBPACK_IMPORTED_MODULE_0__.GameEvent {\n /**\n * Media event cannot bubble\n */\n set bubbles(_value) {\n // stubbed\n }\n /**\n * Media event cannot bubble\n */\n get bubbles() {\n return false;\n }\n /**\n * Media event cannot bubble, so they have no path\n */\n get _path() {\n return null;\n }\n /**\n * Media event cannot bubble, so they have no path\n */\n set _path(_val) {\n // stubbed\n }\n constructor(target, _name = 'MediaEvent') {\n super();\n this.target = target;\n this._name = _name;\n }\n /**\n * Prevents event from bubbling\n */\n stopPropagation() {\n /**\n * Stub\n */\n }\n /**\n * Action, that calls when event happens\n */\n action() {\n /**\n * Stub\n */\n }\n /**\n * Propagate event further through event path\n */\n propagate() {\n /**\n * Stub\n */\n }\n layPath(_actor) {\n /**\n * Stub\n */\n }\n}\nclass NativeSoundEvent extends MediaEvent {\n constructor(target, track) {\n super(target, 'NativeSoundEvent');\n this.track = track;\n }\n}\nclass NativeSoundProcessedEvent extends MediaEvent {\n constructor(target, _processedData) {\n super(target, 'NativeSoundProcessedEvent');\n this._processedData = _processedData;\n this.data = this._processedData;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Flags.ts\":\n/*!******************!*\\\n !*** ./Flags.ts ***!\n \\******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Flags: () => (/* binding */ Flags)\n/* harmony export */ });\n/**\n * Flags is a feature flag implementation for Excalibur. They can only be operated **before {@apilink Engine} construction**\n * after which they are frozen and are read-only.\n *\n * Flags are used to enable experimental or preview features in Excalibur.\n */\nclass Flags {\n /**\n * Force excalibur to load the Canvas 2D graphics context fallback\n * @warning not all features of excalibur are supported in the Canvas 2D fallback\n */\n static useCanvasGraphicsContext() {\n Flags.enable('use-canvas-context');\n }\n /**\n * Force excalibur to use the less optimized image renderer\n */\n static useLegacyImageRenderer() {\n Flags.enable('use-legacy-image-renderer');\n }\n /**\n * Freeze all flag modifications making them readonly\n */\n static freeze() {\n Flags._FROZEN = true;\n }\n /**\n * Resets internal flag state, not meant to be called by users. Only used for testing.\n *\n * Calling this in your game is UNSUPPORTED\n * @internal\n */\n static _reset() {\n Flags._FROZEN = false;\n Flags._FLAGS = {};\n }\n /**\n * Enable a specific feature flag by name. **Note: can only be set before {@apilink Engine} constructor time**\n * @param flagName\n */\n static enable(flagName) {\n if (this._FROZEN) {\n throw Error('Feature flags can only be enabled before Engine constructor time');\n }\n Flags._FLAGS[flagName] = true;\n }\n /**\n * Disable a specific feature flag by name. **Note: can only be set before {@apilink Engine} constructor time**\n * @param flagName\n */\n static disable(flagName) {\n if (this._FROZEN) {\n throw Error('Feature flags can only be disabled before Engine constructor time');\n }\n Flags._FLAGS[flagName] = false;\n }\n /**\n * Check if a flag is enabled. If the flag is disabled or does not exist `false` is returned\n * @param flagName\n */\n static isEnabled(flagName) {\n return !!Flags._FLAGS[flagName];\n }\n /**\n * Show a list of currently known flags\n */\n static show() {\n return Object.keys(Flags._FLAGS);\n }\n}\nFlags._FROZEN = false;\nFlags._FLAGS = {};\n\n\n/***/ }),\n\n/***/ \"./GarbageCollector.ts\":\n/*!*****************************!*\\\n !*** ./GarbageCollector.ts ***!\n \\*****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DefaultGarbageCollectionOptions: () => (/* binding */ DefaultGarbageCollectionOptions),\n/* harmony export */ GarbageCollector: () => (/* binding */ GarbageCollector)\n/* harmony export */ });\nconst DefaultGarbageCollectionOptions = {\n textureCollectInterval: 60000\n // TODO future work to integrate the font and text configuration, refactor existing collection mechanism\n // fontCollectInterval: 60_000,\n // textMeasurementCollectInterval: 60_000,\n};\nclass GarbageCollector {\n constructor(options) {\n this.options = options;\n this._running = false;\n this._collectionMap = new Map();\n this._collectors = new Map();\n /**\n * Runs the collection loop to cleanup any stale resources given the registered collect handlers\n */\n this.collectStaleResources = (deadline) => {\n if (!this._running) {\n return;\n }\n for (const [type, [collector, timeoutInterval]] of this._collectors.entries()) {\n const now = this.options.getTimestamp();\n for (const [resource, [resourceType, time]] of this._collectionMap.entries()) {\n if (type !== resourceType || time + timeoutInterval >= now) {\n continue;\n }\n const collected = collector(resource);\n if (collected) {\n this._collectionMap.delete(resource);\n }\n }\n }\n this._collectHandle = requestIdleCallback(this.collectStaleResources);\n };\n }\n /**\n *\n * @param type Resource type\n * @param timeoutInterval If resource type exceeds interval in milliseconds collect() is called\n * @param collect Collection implementation, returns true if collected\n */\n registerCollector(type, timeoutInterval, collect) {\n this._collectors.set(type, [collect, timeoutInterval]);\n }\n /**\n * Add a resource to be tracked for collection\n * @param type\n * @param resource\n */\n addCollectableResource(type, resource) {\n this._collectionMap.set(resource, [type, this.options.getTimestamp()]);\n }\n /**\n * Update the resource last used timestamp preventing collection\n * @param resource\n */\n touch(resource) {\n const collectionData = this._collectionMap.get(resource);\n if (collectionData) {\n this._collectionMap.set(resource, [collectionData[0], this.options.getTimestamp()]);\n }\n }\n /**\n * Force collect all resources, useful for shutting down a game\n * or if you know that you will not use anything you've allocated before now\n */\n forceCollectAll() {\n for (const [_, [collector]] of this._collectors.entries()) {\n for (const [resource] of this._collectionMap.entries()) {\n const collected = collector(resource);\n if (collected) {\n this._collectionMap.delete(resource);\n }\n }\n }\n }\n /**\n * Starts the garbage collection loop\n */\n start() {\n this._running = true;\n this.collectStaleResources();\n }\n /**\n * Stops the garbage collection loop\n */\n stop() {\n this._running = false;\n cancelIdleCallback(this._collectHandle);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Animation.ts\":\n/*!*******************************!*\\\n !*** ./Graphics/Animation.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Animation: () => (/* binding */ Animation),\n/* harmony export */ AnimationDirection: () => (/* binding */ AnimationDirection),\n/* harmony export */ AnimationEvents: () => (/* binding */ AnimationEvents),\n/* harmony export */ AnimationStrategy: () => (/* binding */ AnimationStrategy)\n/* harmony export */ });\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n\nvar AnimationDirection;\n(function (AnimationDirection) {\n /**\n * Animation is playing forwards\n */\n AnimationDirection[\"Forward\"] = \"forward\";\n /**\n * Animation is playing backwards\n */\n AnimationDirection[\"Backward\"] = \"backward\";\n})(AnimationDirection || (AnimationDirection = {}));\nvar AnimationStrategy;\n(function (AnimationStrategy) {\n /**\n * Animation ends without displaying anything\n */\n AnimationStrategy[\"End\"] = \"end\";\n /**\n * Animation loops to the first frame after the last frame\n */\n AnimationStrategy[\"Loop\"] = \"loop\";\n /**\n * Animation plays to the last frame, then backwards to the first frame, then repeats\n */\n AnimationStrategy[\"PingPong\"] = \"pingpong\";\n /**\n * Animation ends stopping on the last frame\n */\n AnimationStrategy[\"Freeze\"] = \"freeze\";\n})(AnimationStrategy || (AnimationStrategy = {}));\nconst AnimationEvents = {\n Frame: 'frame',\n Loop: 'loop',\n End: 'end'\n};\n/**\n * Create an Animation given a list of {@apilink Frame | `frames`} in {@apilink AnimationOptions}\n *\n * To create an Animation from a {@apilink SpriteSheet}, use {@apilink Animation.fromSpriteSheet}\n */\nclass Animation extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n constructor(options) {\n var _a, _b, _c;\n super(options);\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_1__.EventEmitter();\n this.frames = [];\n this.strategy = AnimationStrategy.Loop;\n this.frameDuration = 100;\n this._idempotencyToken = -1;\n this._firstTick = true;\n this._currentFrame = 0;\n this._timeLeftInFrame = 0;\n this._pingPongDirection = 1;\n this._done = false;\n this._playing = true;\n this._speed = 1;\n this._reversed = false;\n this.frames = options.frames;\n this.speed = (_a = options.speed) !== null && _a !== void 0 ? _a : this.speed;\n this.strategy = (_b = options.strategy) !== null && _b !== void 0 ? _b : this.strategy;\n this.frameDuration = options.totalDuration ? options.totalDuration / this.frames.length : (_c = options.frameDuration) !== null && _c !== void 0 ? _c : this.frameDuration;\n if (options.reverse) {\n this.reverse();\n }\n this.goToFrame(0);\n }\n clone() {\n return new Animation({\n frames: this.frames.map((f) => ({ ...f })),\n frameDuration: this.frameDuration,\n speed: this.speed,\n reverse: this._reversed,\n strategy: this.strategy,\n ...this.cloneGraphicOptions()\n });\n }\n get width() {\n const maybeFrame = this.currentFrame;\n if (maybeFrame && maybeFrame.graphic) {\n return Math.abs(maybeFrame.graphic.width * this.scale.x);\n }\n return 0;\n }\n get height() {\n const maybeFrame = this.currentFrame;\n if (maybeFrame && maybeFrame.graphic) {\n return Math.abs(maybeFrame.graphic.height * this.scale.y);\n }\n return 0;\n }\n /**\n * Create an Animation from a {@apilink SpriteSheet}, a list of indices into the sprite sheet, a duration per frame\n * and optional {@apilink AnimationStrategy}\n *\n * Example:\n * ```typescript\n * const spriteSheet = SpriteSheet.fromImageSource({...});\n *\n * const anim = Animation.fromSpriteSheet(spriteSheet, range(0, 5), 200, AnimationStrategy.Loop);\n * ```\n * @param spriteSheet ex.SpriteSheet\n * @param spriteSheetIndex 0 based index from left to right, top down (row major order) of the ex.SpriteSheet\n * @param durationPerFrame duration per frame in milliseconds\n * @param strategy Optional strategy, default AnimationStrategy.Loop\n */\n static fromSpriteSheet(spriteSheet, spriteSheetIndex, durationPerFrame, strategy = AnimationStrategy.Loop) {\n const maxIndex = spriteSheet.sprites.length - 1;\n const invalidIndices = spriteSheetIndex.filter((index) => index < 0 || index > maxIndex);\n if (invalidIndices.length) {\n Animation._LOGGER.warn(`Indices into SpriteSheet were provided that don\\'t exist: ${invalidIndices.join(',')} no frame will be shown`);\n }\n return new Animation({\n frames: spriteSheet.sprites\n .filter((_, index) => spriteSheetIndex.indexOf(index) > -1)\n .map((f) => ({\n graphic: f,\n duration: durationPerFrame\n })),\n strategy: strategy\n });\n }\n /**\n * Create an {@apilink Animation} from a {@apilink SpriteSheet} given a list of coordinates\n *\n * Example:\n * ```typescript\n * const spriteSheet = SpriteSheet.fromImageSource({...});\n *\n * const anim = Animation.fromSpriteSheetCoordinates({\n * spriteSheet,\n * frameCoordinates: [\n * {x: 0, y: 5, duration: 100, options { flipHorizontal: true }},\n * {x: 1, y: 5, duration: 200},\n * {x: 2, y: 5},\n * {x: 3, y: 5}\n * ],\n * strategy: AnimationStrategy.PingPong\n * });\n * ```\n * @param options\n * @returns Animation\n */\n static fromSpriteSheetCoordinates(options) {\n var _a;\n const { spriteSheet, frameCoordinates, durationPerFrame, durationPerFrameMs, speed, strategy, reverse } = options;\n const defaultDuration = (_a = durationPerFrame !== null && durationPerFrame !== void 0 ? durationPerFrame : durationPerFrameMs) !== null && _a !== void 0 ? _a : 100;\n const frames = [];\n for (const coord of frameCoordinates) {\n const { x, y, duration, options } = coord;\n const sprite = spriteSheet.getSprite(x, y, options);\n if (sprite) {\n frames.push({\n graphic: sprite,\n duration: duration !== null && duration !== void 0 ? duration : defaultDuration\n });\n }\n else {\n Animation._LOGGER.warn(`Skipping frame! SpriteSheet does not have coordinate (${x}, ${y}), please check your SpriteSheet to confirm that sprite exists`);\n }\n }\n return new Animation({\n frames,\n strategy,\n speed,\n reverse\n });\n }\n /**\n * Current animation speed\n *\n * 1 meaning normal 1x speed.\n * 2 meaning 2x speed and so on.\n */\n get speed() {\n return this._speed;\n }\n /**\n * Current animation speed\n *\n * 1 meaning normal 1x speed.\n * 2 meaning 2x speed and so on.\n */\n set speed(val) {\n this._speed = (0,_Math_util__WEBPACK_IMPORTED_MODULE_2__.clamp)(Math.abs(val), 0, Infinity);\n }\n /**\n * Returns the current Frame of the animation\n *\n * Use {@apilink Animation.currentFrameIndex} to get the frame number and\n * {@apilink Animation.goToFrame} to set the current frame index\n */\n get currentFrame() {\n if (this._currentFrame >= 0 && this._currentFrame < this.frames.length) {\n return this.frames[this._currentFrame];\n }\n return null;\n }\n /**\n * Returns the current frame index of the animation\n *\n * Use {@apilink Animation.currentFrame} to grab the current {@apilink Frame} object\n */\n get currentFrameIndex() {\n return this._currentFrame;\n }\n /**\n * Returns the amount of time in milliseconds left in the current frame\n */\n get currentFrameTimeLeft() {\n return this._timeLeftInFrame;\n }\n /**\n * Returns `true` if the animation is playing\n */\n get isPlaying() {\n return this._playing;\n }\n get isReversed() {\n return this._reversed;\n }\n /**\n * Reverses the play direction of the Animation, this preserves the current frame\n */\n reverse() {\n // Don't mutate with the original frame list, create a copy\n this.frames = this.frames.slice().reverse();\n this._reversed = !this._reversed;\n }\n /**\n * Returns the current play direction of the animation\n */\n get direction() {\n // Keep logically consistent with ping-pong direction\n // If ping-pong is forward = 1 and reversed is true then we are logically reversed\n const reversed = this._reversed && this._pingPongDirection === 1 ? true : false;\n return reversed ? AnimationDirection.Backward : AnimationDirection.Forward;\n }\n /**\n * Plays or resumes the animation from the current frame\n */\n play() {\n this._playing = true;\n }\n /**\n * Pauses the animation on the current frame\n */\n pause() {\n this._playing = false;\n this._firstTick = true; // firstTick must be set to emit the proper frame event\n }\n /**\n * Reset the animation back to the beginning, including if the animation were done\n */\n reset() {\n this._done = false;\n this._firstTick = true;\n this._currentFrame = 0;\n this._timeLeftInFrame = this.frameDuration;\n const maybeFrame = this.frames[this._currentFrame];\n if (maybeFrame) {\n this._timeLeftInFrame = (maybeFrame === null || maybeFrame === void 0 ? void 0 : maybeFrame.duration) || this.frameDuration;\n }\n }\n /**\n * Returns `true` if the animation can end\n */\n get canFinish() {\n switch (this.strategy) {\n case AnimationStrategy.End:\n case AnimationStrategy.Freeze: {\n return true;\n }\n default: {\n return false;\n }\n }\n }\n /**\n * Returns `true` if the animation is done, for looping type animations\n * `ex.AnimationStrategy.PingPong` and `ex.AnimationStrategy.Loop` this will always return `false`\n *\n * See the `ex.Animation.canFinish()` method to know if an animation type can end\n */\n get done() {\n return this._done;\n }\n /**\n * Jump the animation immediately to a specific frame if it exists\n *\n * Optionally specify an override for the duration of the frame, useful for\n * keeping multiple animations in sync with one another.\n * @param frameNumber\n * @param duration\n */\n goToFrame(frameNumber, duration) {\n this._currentFrame = frameNumber;\n this._timeLeftInFrame = duration !== null && duration !== void 0 ? duration : this.frameDuration;\n const maybeFrame = this.frames[this._currentFrame];\n if (maybeFrame && !this._done) {\n this._timeLeftInFrame = duration !== null && duration !== void 0 ? duration : ((maybeFrame === null || maybeFrame === void 0 ? void 0 : maybeFrame.duration) || this.frameDuration);\n this.events.emit('frame', { ...maybeFrame, frameIndex: this.currentFrameIndex });\n }\n }\n _nextFrame() {\n const currentFrame = this._currentFrame;\n if (this._done) {\n return currentFrame;\n }\n let next = -1;\n switch (this.strategy) {\n case AnimationStrategy.Loop: {\n next = (currentFrame + 1) % this.frames.length;\n if (next === 0) {\n this.events.emit('loop', this);\n }\n break;\n }\n case AnimationStrategy.End: {\n next = currentFrame + 1;\n if (next >= this.frames.length) {\n this._done = true;\n this._currentFrame = this.frames.length;\n this.events.emit('end', this);\n }\n break;\n }\n case AnimationStrategy.Freeze: {\n next = (0,_Math_util__WEBPACK_IMPORTED_MODULE_2__.clamp)(currentFrame + 1, 0, this.frames.length - 1);\n if (next >= this.frames.length - 1) {\n this._done = true;\n this.events.emit('end', this);\n }\n break;\n }\n case AnimationStrategy.PingPong: {\n if (currentFrame + this._pingPongDirection >= this.frames.length) {\n this._pingPongDirection = -1;\n this.events.emit('loop', this);\n }\n if (currentFrame + this._pingPongDirection < 0) {\n this._pingPongDirection = 1;\n this.events.emit('loop', this);\n }\n next = currentFrame + (this._pingPongDirection % this.frames.length);\n break;\n }\n }\n return next;\n }\n /**\n * Called internally by Excalibur to update the state of the animation potential update the current frame\n * @param elapsed Milliseconds elapsed\n * @param idempotencyToken Prevents double ticking in a frame by passing a unique token to the frame\n */\n tick(elapsed, idempotencyToken = 0) {\n if (this._idempotencyToken === idempotencyToken) {\n return;\n }\n this._idempotencyToken = idempotencyToken;\n if (!this._playing) {\n return;\n }\n // if it's the first frame emit frame event\n if (this._firstTick) {\n this._firstTick = false;\n this.events.emit('frame', { ...this.currentFrame, frameIndex: this.currentFrameIndex });\n }\n this._timeLeftInFrame -= elapsed * this._speed;\n if (this._timeLeftInFrame <= 0) {\n this.goToFrame(this._nextFrame());\n }\n }\n _drawImage(ctx, x, y) {\n if (this.currentFrame && this.currentFrame.graphic) {\n this.currentFrame.graphic.draw(ctx, x, y);\n }\n }\n}\nAnimation._LOGGER = _Util_Log__WEBPACK_IMPORTED_MODULE_3__.Logger.getInstance();\n\n\n/***/ }),\n\n/***/ \"./Graphics/Canvas.ts\":\n/*!****************************!*\\\n !*** ./Graphics/Canvas.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Canvas: () => (/* binding */ Canvas)\n/* harmony export */ });\n/* harmony import */ var _Raster__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Raster */ \"./Graphics/Raster.ts\");\n\n/**\n * A canvas {@apilink Graphic} to provide an adapter between the 2D Canvas API and the {@apilink ExcaliburGraphicsContext}.\n *\n * The {@apilink Canvas} works by re-rastering a draw handler to a HTMLCanvasElement for every draw which is then passed\n * to the {@apilink ExcaliburGraphicsContext} implementation as a rendered image.\n *\n * **Low performance API**\n */\nclass Canvas extends _Raster__WEBPACK_IMPORTED_MODULE_0__.Raster {\n /**\n * Return the 2D graphics context of this canvas\n */\n get ctx() {\n return this._ctx;\n }\n constructor(_options = {}) {\n super(_options);\n this._options = _options;\n }\n clone() {\n return new Canvas({\n ...this._options,\n ...this.cloneGraphicOptions(),\n ...this.cloneRasterOptions()\n });\n }\n execute(ctx) {\n var _a, _b;\n if ((_a = this._options) === null || _a === void 0 ? void 0 : _a.draw) {\n (_b = this._options) === null || _b === void 0 ? void 0 : _b.draw(ctx);\n }\n if (!this._options.cache) {\n this.flagDirty();\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Circle.ts\":\n/*!****************************!*\\\n !*** ./Graphics/Circle.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Circle: () => (/* binding */ Circle)\n/* harmony export */ });\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Raster__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Raster */ \"./Graphics/Raster.ts\");\n\n\n/**\n * A circle {@apilink Graphic} for drawing circles to the {@apilink ExcaliburGraphicsContext}\n *\n * Circles default to {@apilink ImageFiltering.Blended}\n */\nclass Circle extends _Raster__WEBPACK_IMPORTED_MODULE_0__.Raster {\n get radius() {\n return this._radius;\n }\n set radius(value) {\n this._radius = value;\n this.width = this._radius * 2;\n this.height = this._radius * 2;\n this.flagDirty();\n }\n constructor(options) {\n var _a, _b, _c;\n super(options);\n this._radius = 0;\n const lineWidth = (_a = options.lineWidth) !== null && _a !== void 0 ? _a : (options.strokeColor ? 1 : 0); // default lineWidth in canvas is 1px\n this.padding = (_b = options.padding) !== null && _b !== void 0 ? _b : 2 + lineWidth / 2; // default 2 padding for circles looks nice\n this.radius = options.radius;\n this.filtering = (_c = options.filtering) !== null && _c !== void 0 ? _c : _Filtering__WEBPACK_IMPORTED_MODULE_1__.ImageFiltering.Blended;\n this.rasterize();\n }\n clone() {\n return new Circle({\n radius: this.radius,\n ...this.cloneGraphicOptions(),\n ...this.cloneRasterOptions()\n });\n }\n execute(ctx) {\n if (this.radius > 0) {\n ctx.beginPath();\n ctx.arc(this.radius, this.radius, this.radius, 0, Math.PI * 2);\n if (this.color) {\n ctx.fill();\n }\n if (this.strokeColor) {\n ctx.stroke();\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/ExcaliburGraphicsContext.ts\":\n/*!******************************************************!*\\\n !*** ./Graphics/Context/ExcaliburGraphicsContext.ts ***!\n \\******************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DefaultAntialiasOptions: () => (/* binding */ DefaultAntialiasOptions),\n/* harmony export */ DefaultPixelArtOptions: () => (/* binding */ DefaultPixelArtOptions)\n/* harmony export */ });\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Filtering */ \"./Graphics/Filtering.ts\");\n\nconst DefaultAntialiasOptions = {\n pixelArtSampler: false,\n nativeContextAntialiasing: false,\n multiSampleAntialiasing: true,\n filtering: _Filtering__WEBPACK_IMPORTED_MODULE_0__.ImageFiltering.Blended,\n canvasImageRendering: 'auto'\n};\nconst DefaultPixelArtOptions = {\n pixelArtSampler: true,\n nativeContextAntialiasing: false,\n multiSampleAntialiasing: true,\n filtering: _Filtering__WEBPACK_IMPORTED_MODULE_0__.ImageFiltering.Blended,\n canvasImageRendering: 'auto'\n};\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/ExcaliburGraphicsContext2DCanvas.ts\":\n/*!**************************************************************!*\\\n !*** ./Graphics/Context/ExcaliburGraphicsContext2DCanvas.ts ***!\n \\**************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ExcaliburGraphicsContext2DCanvas: () => (/* binding */ ExcaliburGraphicsContext2DCanvas)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Color */ \"./Color.ts\");\n/* harmony import */ var _state_stack__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./state-stack */ \"./Graphics/Context/state-stack.ts\");\n/* harmony import */ var _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n/* harmony import */ var _debug_text__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./debug-text */ \"./Graphics/Context/debug-text.ts\");\n\n\n\n\nconst pixelSnapEpsilon = 0.0001;\nclass ExcaliburGraphicsContext2DCanvasDebug {\n constructor(_ex) {\n this._ex = _ex;\n this._debugText = new _debug_text__WEBPACK_IMPORTED_MODULE_0__.DebugText();\n }\n /**\n * Draw a debug rectangle to the context\n * @param x\n * @param y\n * @param width\n * @param height\n */\n drawRect(x, y, width, height) {\n this._ex.__ctx.save();\n this._ex.__ctx.strokeStyle = 'red';\n this._ex.__ctx.strokeRect(this._ex.snapToPixel ? ~~(x + pixelSnapEpsilon) : x, this._ex.snapToPixel ? ~~(y + pixelSnapEpsilon) : y, this._ex.snapToPixel ? ~~(width + pixelSnapEpsilon) : width, this._ex.snapToPixel ? ~~(height + pixelSnapEpsilon) : height);\n this._ex.__ctx.restore();\n }\n drawLine(start, end, lineOptions = { color: _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Black }) {\n var _a, _b;\n this._ex.__ctx.save();\n this._ex.__ctx.beginPath();\n this._ex.__ctx.strokeStyle = (_b = (_a = lineOptions.color) === null || _a === void 0 ? void 0 : _a.toString()) !== null && _b !== void 0 ? _b : '';\n this._ex.__ctx.moveTo(this._ex.snapToPixel ? ~~(start.x + pixelSnapEpsilon) : start.x, this._ex.snapToPixel ? ~~(start.y + pixelSnapEpsilon) : start.y);\n this._ex.__ctx.lineTo(this._ex.snapToPixel ? ~~(end.x + pixelSnapEpsilon) : end.x, this._ex.snapToPixel ? ~~(end.y + pixelSnapEpsilon) : end.y);\n this._ex.__ctx.lineWidth = 2;\n this._ex.__ctx.stroke();\n this._ex.__ctx.closePath();\n this._ex.__ctx.restore();\n }\n drawPoint(point, pointOptions = { color: _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Black, size: 5 }) {\n this._ex.__ctx.save();\n this._ex.__ctx.beginPath();\n this._ex.__ctx.fillStyle = pointOptions.color.toString();\n this._ex.__ctx.arc(this._ex.snapToPixel ? ~~(point.x + pixelSnapEpsilon) : point.x, this._ex.snapToPixel ? ~~(point.y + pixelSnapEpsilon) : point.y, pointOptions.size, 0, Math.PI * 2);\n this._ex.__ctx.fill();\n this._ex.__ctx.closePath();\n this._ex.__ctx.restore();\n }\n drawText(text, pos) {\n this._debugText.write(this._ex, text, pos);\n }\n}\nclass ExcaliburGraphicsContext2DCanvas {\n get width() {\n return this.__ctx.canvas.width;\n }\n get height() {\n return this.__ctx.canvas.height;\n }\n get opacity() {\n return this._state.current.opacity;\n }\n set opacity(value) {\n this._state.current.opacity = value;\n }\n get tint() {\n return this._state.current.tint;\n }\n set tint(color) {\n this._state.current.tint = color;\n }\n get smoothing() {\n return this.__ctx.imageSmoothingEnabled;\n }\n set smoothing(value) {\n this.__ctx.imageSmoothingEnabled = value;\n }\n constructor(options) {\n /**\n * Unused in Canvas implementation\n */\n this.useDrawSorting = false;\n /**\n * Unused in Canvas implementation\n */\n this.z = 0;\n this.backgroundColor = _Color__WEBPACK_IMPORTED_MODULE_1__.Color.ExcaliburBlue;\n this._state = new _state_stack__WEBPACK_IMPORTED_MODULE_2__.StateStack();\n this.snapToPixel = false;\n this.debug = new ExcaliburGraphicsContext2DCanvasDebug(this);\n const { canvasElement, context, enableTransparency, snapToPixel, antialiasing: smoothing, backgroundColor } = options;\n this.__ctx =\n context !== null && context !== void 0 ? context : canvasElement.getContext('2d', {\n alpha: enableTransparency !== null && enableTransparency !== void 0 ? enableTransparency : true\n });\n if (!this.__ctx) {\n throw new Error('Cannot build new ExcaliburGraphicsContext2D for some reason!');\n }\n this.backgroundColor = backgroundColor !== null && backgroundColor !== void 0 ? backgroundColor : this.backgroundColor;\n this.snapToPixel = snapToPixel !== null && snapToPixel !== void 0 ? snapToPixel : this.snapToPixel;\n this.smoothing = smoothing !== null && smoothing !== void 0 ? smoothing : this.smoothing;\n }\n resetTransform() {\n this.__ctx.resetTransform();\n }\n updateViewport(_resolution) {\n // pass\n }\n drawImage(image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight) {\n if (swidth === 0 || sheight === 0) {\n return; // zero dimension dest exit early\n }\n else if (dwidth === 0 || dheight === 0) {\n return; // zero dimension dest exit early\n }\n else if (image.width === 0 || image.height === 0) {\n return; // zero dimension source exit early\n }\n this.__ctx.globalAlpha = this.opacity;\n const args = [image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight]\n .filter((a) => a !== undefined)\n .map((a) => (typeof a === 'number' && this.snapToPixel ? ~~a : a));\n this.__ctx.drawImage.apply(this.__ctx, args);\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_3__.GraphicsDiagnostics.DrawCallCount++;\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_3__.GraphicsDiagnostics.DrawnImagesCount = 1;\n }\n drawLine(start, end, color, thickness = 1) {\n this.__ctx.save();\n this.__ctx.beginPath();\n this.__ctx.strokeStyle = color.toString();\n this.__ctx.moveTo(this.snapToPixel ? ~~(start.x + pixelSnapEpsilon) : start.x, this.snapToPixel ? ~~(start.y + pixelSnapEpsilon) : start.y);\n this.__ctx.lineTo(this.snapToPixel ? ~~(end.x + pixelSnapEpsilon) : end.x, this.snapToPixel ? ~~(end.y + pixelSnapEpsilon) : end.y);\n this.__ctx.lineWidth = thickness;\n this.__ctx.stroke();\n this.__ctx.closePath();\n this.__ctx.restore();\n }\n drawRectangle(pos, width, height, color) {\n this.__ctx.save();\n this.__ctx.fillStyle = color.toString();\n this.__ctx.fillRect(this.snapToPixel ? ~~(pos.x + pixelSnapEpsilon) : pos.x, this.snapToPixel ? ~~(pos.y + pixelSnapEpsilon) : pos.y, this.snapToPixel ? ~~(width + pixelSnapEpsilon) : width, this.snapToPixel ? ~~(height + pixelSnapEpsilon) : height);\n this.__ctx.restore();\n }\n drawCircle(pos, radius, color, stroke, thickness) {\n this.__ctx.save();\n this.__ctx.beginPath();\n if (stroke) {\n this.__ctx.strokeStyle = stroke.toString();\n }\n if (thickness) {\n this.__ctx.lineWidth = thickness;\n }\n this.__ctx.fillStyle = color.toString();\n this.__ctx.arc(this.snapToPixel ? ~~(pos.x + pixelSnapEpsilon) : pos.x, this.snapToPixel ? ~~(pos.y + pixelSnapEpsilon) : pos.y, radius, 0, Math.PI * 2);\n this.__ctx.fill();\n if (stroke) {\n this.__ctx.stroke();\n }\n this.__ctx.closePath();\n this.__ctx.restore();\n }\n /**\n * Save the current state of the canvas to the stack (transforms and opacity)\n */\n save() {\n this.__ctx.save();\n this._state.save();\n }\n /**\n * Restore the state of the canvas from the stack\n */\n restore() {\n this.__ctx.restore();\n this._state.restore();\n }\n /**\n * Translate the origin of the context by an x and y\n * @param x\n * @param y\n */\n translate(x, y) {\n this.__ctx.translate(this.snapToPixel ? ~~(x + pixelSnapEpsilon) : x, this.snapToPixel ? ~~(y + pixelSnapEpsilon) : y);\n }\n /**\n * Rotate the context about the current origin\n */\n rotate(angle) {\n this.__ctx.rotate(angle);\n }\n /**\n * Scale the context by an x and y factor\n * @param x\n * @param y\n */\n scale(x, y) {\n this.__ctx.scale(x, y);\n }\n getTransform() {\n throw new Error('Not implemented');\n }\n multiply(_m) {\n this.__ctx.setTransform(this.__ctx.getTransform().multiply(_m.toDOMMatrix()));\n }\n addPostProcessor(_postprocessor) {\n // pass\n }\n removePostProcessor(_postprocessor) {\n // pass\n }\n clearPostProcessors() {\n // pass\n }\n updatePostProcessors(elapsed) {\n // pass\n }\n beginDrawLifecycle() {\n // pass\n }\n endDrawLifecycle() {\n // pass\n }\n set material(material) {\n this._state.current.material = material;\n }\n get material() {\n return this._state.current.material;\n }\n createMaterial(options) {\n // pass\n return null;\n }\n clear() {\n // Clear frame\n this.__ctx.clearRect(0, 0, this.width, this.height);\n this.__ctx.fillStyle = this.backgroundColor.toString();\n this.__ctx.fillRect(0, 0, this.width, this.height);\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_3__.GraphicsDiagnostics.clear();\n }\n /**\n * Flushes the batched draw calls to the screen\n */\n flush() {\n // pass\n }\n dispose() {\n this.__ctx = undefined;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\":\n/*!***********************************************************!*\\\n !*** ./Graphics/Context/ExcaliburGraphicsContextWebGL.ts ***!\n \\***********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ExcaliburGraphicsContextWebGL: () => (/* binding */ ExcaliburGraphicsContextWebGL),\n/* harmony export */ pixelSnapEpsilon: () => (/* binding */ pixelSnapEpsilon)\n/* harmony export */ });\n/* harmony import */ var _Math_matrix__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../Math/matrix */ \"./Math/matrix.ts\");\n/* harmony import */ var _transform_stack__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./transform-stack */ \"./Graphics/Context/transform-stack.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Color */ \"./Color.ts\");\n/* harmony import */ var _state_stack__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./state-stack */ \"./Graphics/Context/state-stack.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _debug_text__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./debug-text */ \"./Graphics/Context/debug-text.ts\");\n/* harmony import */ var _render_target__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./render-target */ \"./Graphics/Context/render-target.ts\");\n/* harmony import */ var _texture_loader__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./texture-loader */ \"./Graphics/Context/texture-loader.ts\");\n/* harmony import */ var _line_renderer_line_renderer__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./line-renderer/line-renderer */ \"./Graphics/Context/line-renderer/line-renderer.ts\");\n/* harmony import */ var _point_renderer_point_renderer__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./point-renderer/point-renderer */ \"./Graphics/Context/point-renderer/point-renderer.ts\");\n/* harmony import */ var _screen_pass_painter_screen_pass_painter__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./screen-pass-painter/screen-pass-painter */ \"./Graphics/Context/screen-pass-painter/screen-pass-painter.ts\");\n/* harmony import */ var _image_renderer_image_renderer__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./image-renderer/image-renderer */ \"./Graphics/Context/image-renderer/image-renderer.ts\");\n/* harmony import */ var _rectangle_renderer_rectangle_renderer__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./rectangle-renderer/rectangle-renderer */ \"./Graphics/Context/rectangle-renderer/rectangle-renderer.ts\");\n/* harmony import */ var _circle_renderer_circle_renderer__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./circle-renderer/circle-renderer */ \"./Graphics/Context/circle-renderer/circle-renderer.ts\");\n/* harmony import */ var _Util_Pool__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Util/Pool */ \"./Util/Pool.ts\");\n/* harmony import */ var _draw_call__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./draw-call */ \"./Graphics/Context/draw-call.ts\");\n/* harmony import */ var _material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./material */ \"./Graphics/Context/material.ts\");\n/* harmony import */ var _material_renderer_material_renderer__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./material-renderer/material-renderer */ \"./Graphics/Context/material-renderer/material-renderer.ts\");\n/* harmony import */ var _shader__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _particle_renderer_particle_renderer__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./particle-renderer/particle-renderer */ \"./Graphics/Context/particle-renderer/particle-renderer.ts\");\n/* harmony import */ var _image_renderer_v2_image_renderer_v2__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./image-renderer-v2/image-renderer-v2 */ \"./Graphics/Context/image-renderer-v2/image-renderer-v2.ts\");\n/* harmony import */ var _Flags__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Flags */ \"./Flags.ts\");\n\n\n\n\n\n\n\n\n\n// renderers\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst pixelSnapEpsilon = 0.0001;\nclass ExcaliburGraphicsContextWebGLDebug {\n constructor(_webglCtx) {\n this._webglCtx = _webglCtx;\n this._debugText = new _debug_text__WEBPACK_IMPORTED_MODULE_0__.DebugText();\n }\n /**\n * Draw a debugging rectangle to the context\n * @param x\n * @param y\n * @param width\n * @param height\n */\n drawRect(x, y, width, height, rectOptions = { color: _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Black }) {\n this.drawLine((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(x, y), (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(x + width, y), { ...rectOptions });\n this.drawLine((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(x + width, y), (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(x + width, y + height), { ...rectOptions });\n this.drawLine((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(x + width, y + height), (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(x, y + height), { ...rectOptions });\n this.drawLine((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(x, y + height), (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(x, y), { ...rectOptions });\n }\n /**\n * Draw a debugging line to the context\n * @param start\n * @param end\n * @param lineOptions\n */\n drawLine(start, end, lineOptions) {\n var _a;\n this._webglCtx.draw('ex.line', start, end, (_a = lineOptions === null || lineOptions === void 0 ? void 0 : lineOptions.color) !== null && _a !== void 0 ? _a : _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Black);\n }\n /**\n * Draw a debugging point to the context\n * @param point\n * @param pointOptions\n */\n drawPoint(point, pointOptions = { color: _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Black, size: 5 }) {\n this._webglCtx.draw('ex.point', point, pointOptions.color, pointOptions.size);\n }\n drawText(text, pos) {\n this._debugText.write(this._webglCtx, text, pos);\n }\n}\nclass ExcaliburGraphicsContextWebGL {\n get z() {\n return this._state.current.z;\n }\n set z(value) {\n this._state.current.z = value;\n }\n get opacity() {\n return this._state.current.opacity;\n }\n set opacity(value) {\n this._state.current.opacity = value;\n }\n get tint() {\n return this._state.current.tint;\n }\n set tint(color) {\n this._state.current.tint = color;\n }\n get width() {\n return this.__gl.canvas.width;\n }\n get height() {\n return this.__gl.canvas.height;\n }\n get ortho() {\n return this._ortho;\n }\n /**\n * Checks the underlying webgl implementation if the requested internal resolution is supported\n * @param dim\n */\n checkIfResolutionSupported(dim) {\n // Slight hack based on this thread https://groups.google.com/g/webgl-dev-list/c/AHONvz3oQTo\n let supported = true;\n if (dim.width > 4096 || dim.height > 4096) {\n supported = false;\n }\n return supported;\n }\n constructor(options) {\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_3__.Logger.getInstance();\n this._renderers = new Map();\n this.imageRenderer = _Flags__WEBPACK_IMPORTED_MODULE_4__.Flags.isEnabled('use-legacy-image-renderer') ? 'ex.image' : 'ex.image-v2';\n this._isDrawLifecycle = false;\n this.useDrawSorting = true;\n this._drawCallPool = new _Util_Pool__WEBPACK_IMPORTED_MODULE_5__.Pool(() => new _draw_call__WEBPACK_IMPORTED_MODULE_6__.DrawCall(), undefined, 4000);\n this._drawCallIndex = 0;\n this._drawCalls = new Array(4000).fill(null);\n // Postprocessing is a tuple with 2 render targets, these are flip-flopped during the postprocessing process\n this._postProcessTargets = [];\n this._postprocessors = [];\n this._transform = new _transform_stack__WEBPACK_IMPORTED_MODULE_7__.TransformStack();\n this._state = new _state_stack__WEBPACK_IMPORTED_MODULE_8__.StateStack();\n /**\n * Snaps the drawing x/y coordinate to the nearest whole pixel\n */\n this.snapToPixel = false;\n /**\n * Native context smoothing\n */\n this.smoothing = false;\n /**\n * Whether the pixel art sampler is enabled for smooth sub pixel anti-aliasing\n */\n this.pixelArtSampler = false;\n /**\n * UV padding in pixels to use in internal image rendering to prevent texture bleed\n *\n */\n this.uvPadding = 0.01;\n this.backgroundColor = _Color__WEBPACK_IMPORTED_MODULE_1__.Color.ExcaliburBlue;\n this.multiSampleAntialiasing = true;\n this.transparency = true;\n this._isContextLost = false;\n this._disposed = false;\n this._imageToWidth = new Map();\n this._imageToHeight = new Map();\n this.debug = new ExcaliburGraphicsContextWebGLDebug(this);\n this._totalPostProcessorTime = 0;\n const { canvasElement, context, enableTransparency, antialiasing, uvPadding, multiSampleAntialiasing, pixelArtSampler, powerPreference, snapToPixel, backgroundColor, useDrawSorting, garbageCollector, handleContextLost, handleContextRestored } = options;\n this.__gl =\n context !== null && context !== void 0 ? context : canvasElement.getContext('webgl2', {\n antialias: antialiasing !== null && antialiasing !== void 0 ? antialiasing : this.smoothing,\n premultipliedAlpha: false,\n alpha: enableTransparency !== null && enableTransparency !== void 0 ? enableTransparency : this.transparency,\n depth: false,\n powerPreference: powerPreference !== null && powerPreference !== void 0 ? powerPreference : 'high-performance'\n });\n if (!this.__gl) {\n throw Error('Failed to retrieve webgl context from browser');\n }\n if (handleContextLost) {\n this.__gl.canvas.addEventListener('webglcontextlost', handleContextLost, false);\n }\n if (handleContextRestored) {\n this.__gl.canvas.addEventListener('webglcontextrestored', handleContextRestored, false);\n }\n this.__gl.canvas.addEventListener('webglcontextlost', () => {\n this._isContextLost = true;\n });\n this.__gl.canvas.addEventListener('webglcontextrestored', () => {\n this._isContextLost = false;\n });\n this.textureLoader = new _texture_loader__WEBPACK_IMPORTED_MODULE_9__.TextureLoader(this.__gl, garbageCollector);\n this.snapToPixel = snapToPixel !== null && snapToPixel !== void 0 ? snapToPixel : this.snapToPixel;\n this.smoothing = antialiasing !== null && antialiasing !== void 0 ? antialiasing : this.smoothing;\n this.transparency = enableTransparency !== null && enableTransparency !== void 0 ? enableTransparency : this.transparency;\n this.pixelArtSampler = pixelArtSampler !== null && pixelArtSampler !== void 0 ? pixelArtSampler : this.pixelArtSampler;\n this.uvPadding = uvPadding !== null && uvPadding !== void 0 ? uvPadding : this.uvPadding;\n this.multiSampleAntialiasing = typeof multiSampleAntialiasing === 'boolean' ? multiSampleAntialiasing : this.multiSampleAntialiasing;\n this.samples = typeof multiSampleAntialiasing === 'object' ? multiSampleAntialiasing.samples : undefined;\n this.backgroundColor = backgroundColor !== null && backgroundColor !== void 0 ? backgroundColor : this.backgroundColor;\n this.useDrawSorting = useDrawSorting !== null && useDrawSorting !== void 0 ? useDrawSorting : this.useDrawSorting;\n this._drawCallPool.disableWarnings = true;\n this._drawCallPool.preallocate();\n this._init();\n }\n dispose() {\n if (!this._disposed) {\n this._disposed = true;\n this.textureLoader.dispose();\n for (const renderer of this._renderers.values()) {\n renderer.dispose();\n }\n this._renderers.clear();\n this._drawCallPool.dispose();\n this._drawCalls.length = 0;\n this.__gl = null;\n }\n }\n _init() {\n const gl = this.__gl;\n // Setup viewport and view matrix\n this._ortho = _Math_matrix__WEBPACK_IMPORTED_MODULE_10__.Matrix.ortho(0, gl.canvas.width, gl.canvas.height, 0, 400, -400);\n gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);\n // Clear background\n gl.clearColor(this.backgroundColor.r / 255, this.backgroundColor.g / 255, this.backgroundColor.b / 255, this.backgroundColor.a);\n gl.clear(gl.COLOR_BUFFER_BIT);\n // Enable alpha blending\n // https://www.realtimerendering.com/blog/gpus-prefer-premultiplication/\n gl.enable(gl.BLEND);\n gl.blendEquation(gl.FUNC_ADD);\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n gl.blendEquationSeparate(gl.FUNC_ADD, gl.FUNC_ADD);\n gl.blendFuncSeparate(gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n gl.depthMask(false);\n // Setup builtin renderers\n this.register(new _image_renderer_image_renderer__WEBPACK_IMPORTED_MODULE_11__.ImageRenderer({\n uvPadding: this.uvPadding,\n pixelArtSampler: this.pixelArtSampler\n }));\n this.register(new _material_renderer_material_renderer__WEBPACK_IMPORTED_MODULE_12__.MaterialRenderer());\n this.register(new _rectangle_renderer_rectangle_renderer__WEBPACK_IMPORTED_MODULE_13__.RectangleRenderer());\n this.register(new _circle_renderer_circle_renderer__WEBPACK_IMPORTED_MODULE_14__.CircleRenderer());\n this.register(new _point_renderer_point_renderer__WEBPACK_IMPORTED_MODULE_15__.PointRenderer());\n this.register(new _line_renderer_line_renderer__WEBPACK_IMPORTED_MODULE_16__.LineRenderer());\n this.register(new _particle_renderer_particle_renderer__WEBPACK_IMPORTED_MODULE_17__.ParticleRenderer());\n this.register(new _image_renderer_v2_image_renderer_v2__WEBPACK_IMPORTED_MODULE_18__.ImageRendererV2({\n uvPadding: this.uvPadding,\n pixelArtSampler: this.pixelArtSampler\n }));\n this.materialScreenTexture = gl.createTexture();\n if (!this.materialScreenTexture) {\n throw new Error('Could not create screen texture!');\n }\n gl.bindTexture(gl.TEXTURE_2D, this.materialScreenTexture);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT);\n gl.bindTexture(gl.TEXTURE_2D, null);\n this._screenRenderer = new _screen_pass_painter_screen_pass_painter__WEBPACK_IMPORTED_MODULE_19__.ScreenPassPainter(gl);\n this._renderTarget = new _render_target__WEBPACK_IMPORTED_MODULE_20__.RenderTarget({\n gl,\n transparency: this.transparency,\n width: gl.canvas.width,\n height: gl.canvas.height\n });\n this._postProcessTargets = [\n new _render_target__WEBPACK_IMPORTED_MODULE_20__.RenderTarget({\n gl,\n transparency: this.transparency,\n width: gl.canvas.width,\n height: gl.canvas.height\n }),\n new _render_target__WEBPACK_IMPORTED_MODULE_20__.RenderTarget({\n gl,\n transparency: this.transparency,\n width: gl.canvas.width,\n height: gl.canvas.height\n })\n ];\n this._msaaTarget = new _render_target__WEBPACK_IMPORTED_MODULE_20__.RenderTarget({\n gl,\n transparency: this.transparency,\n width: gl.canvas.width,\n height: gl.canvas.height,\n antialias: this.multiSampleAntialiasing,\n samples: this.samples\n });\n }\n register(renderer) {\n this._renderers.set(renderer.type, renderer);\n renderer.initialize(this.__gl, this);\n }\n get(rendererName) {\n return this._renderers.get(rendererName);\n }\n _isCurrentRenderer(renderer) {\n if (!this._currentRenderer || this._currentRenderer === renderer) {\n return true;\n }\n return false;\n }\n beginDrawLifecycle() {\n this._isDrawLifecycle = true;\n }\n endDrawLifecycle() {\n this._isDrawLifecycle = false;\n }\n draw(rendererName, ...args) {\n if (true) {\n if (args.length > 9) {\n throw new Error('Only 10 or less renderer arguments are supported!;');\n }\n }\n if (!this._isDrawLifecycle) {\n this._logger.warnOnce(`Attempting to draw outside the the drawing lifecycle (preDraw/postDraw) is not supported and is a source of bugs/errors.\\n` +\n `If you want to do custom drawing, use Actor.graphics, or any onPreDraw or onPostDraw handler.`);\n }\n if (this._isContextLost) {\n this._logger.errorOnce(`Unable to draw ${rendererName}, the webgl context is lost`);\n return;\n }\n const renderer = this._renderers.get(rendererName);\n if (renderer) {\n if (this.useDrawSorting) {\n const drawCall = this._drawCallPool.get();\n drawCall.z = this._state.current.z;\n drawCall.priority = renderer.priority;\n drawCall.renderer = rendererName;\n this.getTransform().clone(drawCall.transform);\n drawCall.state.z = this._state.current.z;\n drawCall.state.opacity = this._state.current.opacity;\n drawCall.state.tint = this._state.current.tint;\n drawCall.state.material = this._state.current.material;\n drawCall.args[0] = args[0];\n drawCall.args[1] = args[1];\n drawCall.args[2] = args[2];\n drawCall.args[3] = args[3];\n drawCall.args[4] = args[4];\n drawCall.args[5] = args[5];\n drawCall.args[6] = args[6];\n drawCall.args[7] = args[7];\n drawCall.args[8] = args[8];\n drawCall.args[9] = args[9];\n this._drawCalls[this._drawCallIndex++] = drawCall;\n }\n else {\n // Set the current renderer if not defined\n if (!this._currentRenderer) {\n this._currentRenderer = renderer;\n }\n if (!this._isCurrentRenderer(renderer)) {\n // switching graphics means we must flush the previous\n this._currentRenderer.flush();\n }\n // If we are still using the same renderer we can add to the current batch\n renderer.draw(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9]);\n this._currentRenderer = renderer;\n }\n }\n else {\n throw Error(`No renderer with name ${rendererName} has been registered`);\n }\n }\n resetTransform() {\n this._transform.reset();\n }\n updateViewport(resolution) {\n const gl = this.__gl;\n this._ortho = this._ortho = _Math_matrix__WEBPACK_IMPORTED_MODULE_10__.Matrix.ortho(0, resolution.width, resolution.height, 0, 400, -400);\n this._renderTarget.setResolution(gl.canvas.width, gl.canvas.height);\n this._msaaTarget.setResolution(gl.canvas.width, gl.canvas.height);\n this._postProcessTargets[0].setResolution(gl.canvas.width, gl.canvas.height);\n this._postProcessTargets[1].setResolution(gl.canvas.width, gl.canvas.height);\n }\n _getImageWidth(image) {\n let maybeWidth = this._imageToWidth.get(image);\n if (maybeWidth === undefined) {\n maybeWidth = image.width;\n this._imageToWidth.set(image, maybeWidth);\n }\n return maybeWidth;\n }\n _getImageHeight(image) {\n let maybeHeight = this._imageToHeight.get(image);\n if (maybeHeight === undefined) {\n maybeHeight = image.height;\n this._imageToHeight.set(image, maybeHeight);\n }\n return maybeHeight;\n }\n drawImage(image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight) {\n if (swidth === 0 || sheight === 0) {\n return; // zero dimension dest exit early\n }\n else if (dwidth === 0 || dheight === 0) {\n return; // zero dimension dest exit early\n }\n else if (this._getImageWidth(image) === 0 || this._getImageHeight(image) === 0) {\n return; // zero dimension source exit early\n }\n if (!image) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_3__.Logger.getInstance().warn('Cannot draw a null or undefined image');\n // tslint:disable-next-line: no-console\n if (console.trace) {\n // tslint:disable-next-line: no-console\n console.trace();\n }\n return;\n }\n if (this._state.current.material) {\n this.draw('ex.material', image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight);\n }\n else {\n if (this.imageRenderer === 'ex.image') {\n this.draw(this.imageRenderer, image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight);\n }\n else {\n this.draw(this.imageRenderer, image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight);\n }\n }\n }\n drawLine(start, end, color, thickness = 1) {\n this.draw('ex.rectangle', start, end, color, thickness);\n }\n drawRectangle(pos, width, height, color, stroke, strokeThickness) {\n this.draw('ex.rectangle', pos, width, height, color, stroke, strokeThickness);\n }\n drawCircle(pos, radius, color, stroke, thickness) {\n this.draw('ex.circle', pos, radius, color, stroke, thickness);\n }\n save() {\n this._transform.save();\n this._state.save();\n }\n restore() {\n this._transform.restore();\n this._state.restore();\n }\n translate(x, y) {\n this._transform.translate(this.snapToPixel ? ~~(x + pixelSnapEpsilon) : x, this.snapToPixel ? ~~(y + pixelSnapEpsilon) : y);\n }\n rotate(angle) {\n this._transform.rotate(angle);\n }\n scale(x, y) {\n this._transform.scale(x, y);\n }\n transform(matrix) {\n this._transform.current = matrix;\n }\n getTransform() {\n return this._transform.current;\n }\n multiply(m) {\n this._transform.current.multiply(m, this._transform.current);\n }\n addPostProcessor(postprocessor) {\n this._postprocessors.push(postprocessor);\n postprocessor.initialize(this.__gl);\n }\n removePostProcessor(postprocessor) {\n const index = this._postprocessors.indexOf(postprocessor);\n if (index !== -1) {\n this._postprocessors.splice(index, 1);\n }\n }\n clearPostProcessors() {\n this._postprocessors.length = 0;\n }\n updatePostProcessors(elapsed) {\n for (const postprocessor of this._postprocessors) {\n const shader = postprocessor.getShader();\n shader.use();\n const uniforms = shader.getUniforms();\n this._totalPostProcessorTime += elapsed;\n if (uniforms.find((u) => u.name === 'u_time_ms')) {\n shader.setUniformFloat('u_time_ms', this._totalPostProcessorTime);\n }\n if (uniforms.find((u) => u.name === 'u_elapsed_ms')) {\n shader.setUniformFloat('u_elapsed_ms', elapsed);\n }\n if (uniforms.find((u) => u.name === 'u_resolution')) {\n shader.setUniformFloatVector('u_resolution', (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(this.width, this.height));\n }\n if (postprocessor.onUpdate) {\n postprocessor.onUpdate(elapsed);\n }\n }\n }\n set material(material) {\n this._state.current.material = material;\n }\n get material() {\n return this._state.current.material;\n }\n /**\n * Creates and initializes the material which compiles the internal shader\n * @param options\n * @returns Material\n */\n createMaterial(options) {\n const material = new _material__WEBPACK_IMPORTED_MODULE_21__.Material({ ...options, graphicsContext: this });\n return material;\n }\n createShader(options) {\n const gl = this.__gl;\n const { vertexSource, fragmentSource } = options;\n const shader = new _shader__WEBPACK_IMPORTED_MODULE_22__.Shader({\n gl,\n vertexSource,\n fragmentSource\n });\n shader.compile();\n return shader;\n }\n clear() {\n const gl = this.__gl;\n const currentTarget = this.multiSampleAntialiasing ? this._msaaTarget : this._renderTarget;\n currentTarget.use();\n gl.clearColor(this.backgroundColor.r / 255, this.backgroundColor.g / 255, this.backgroundColor.b / 255, this.backgroundColor.a);\n // Clear the context with the newly set color. This is\n // the function call that actually does the drawing.\n gl.clear(gl.COLOR_BUFFER_BIT);\n }\n /**\n * Flushes all batched rendering to the screen\n */\n flush() {\n var _a;\n if (this._isContextLost) {\n this._logger.errorOnce(`Unable to flush the webgl context is lost`);\n return;\n }\n // render target captures all draws and redirects to the render target\n let currentTarget = this.multiSampleAntialiasing ? this._msaaTarget : this._renderTarget;\n currentTarget.use();\n if (this.useDrawSorting) {\n // null out unused draw calls\n for (let i = this._drawCallIndex; i < this._drawCalls.length; i++) {\n this._drawCalls[i] = null;\n }\n // sort draw calls\n // Find the original order of the first instance of the draw call\n const originalSort = new Map();\n for (const [name] of this._renderers) {\n let firstIndex = 0;\n for (firstIndex = 0; firstIndex < this._drawCallIndex; firstIndex++) {\n if (this._drawCalls[firstIndex].renderer === name) {\n break;\n }\n }\n originalSort.set(name, firstIndex);\n }\n this._drawCalls.sort((a, b) => {\n if (a === null || b === null) {\n return 0;\n }\n const zIndex = a.z - b.z;\n const originalSortOrder = originalSort.get(a.renderer) - originalSort.get(b.renderer);\n const priority = a.priority - b.priority;\n if (zIndex === 0) {\n // sort by z first\n if (priority === 0) {\n // sort by priority\n return originalSortOrder; // use the original order to inform draw call packing to maximally preserve painter order\n }\n return priority;\n }\n return zIndex;\n });\n const oldTransform = this._transform.current;\n const oldState = this._state.current;\n if (this._drawCalls.length && this._drawCallIndex) {\n let currentRendererName = this._drawCalls[0].renderer;\n let currentRenderer = this._renderers.get(currentRendererName);\n for (let i = 0; i < this._drawCallIndex; i++) {\n // hydrate the state for renderers\n this._transform.current = this._drawCalls[i].transform;\n this._state.current = this._drawCalls[i].state;\n if (this._drawCalls[i].renderer !== currentRendererName) {\n // switching graphics renderer means we must flush the previous\n currentRenderer.flush();\n currentRendererName = this._drawCalls[i].renderer;\n currentRenderer = this._renderers.get(currentRendererName);\n }\n // ! hack to grab screen texture before materials run because they might want it\n if (currentRenderer instanceof _material_renderer_material_renderer__WEBPACK_IMPORTED_MODULE_12__.MaterialRenderer && ((_a = this.material) === null || _a === void 0 ? void 0 : _a.isUsingScreenTexture)) {\n currentTarget.copyToTexture(this.materialScreenTexture);\n currentTarget.use();\n }\n // If we are still using the same renderer we can add to the current batch\n currentRenderer.draw(...this._drawCalls[i].args);\n }\n if (currentRenderer.hasPendingDraws()) {\n currentRenderer.flush();\n }\n }\n // reset state\n this._transform.current = oldTransform;\n this._state.current = oldState;\n // reclaim draw calls\n this._drawCallPool.done();\n this._drawCallIndex = 0;\n this._imageToHeight.clear();\n this._imageToWidth.clear();\n }\n else {\n // This is the final flush at the moment to draw any leftover pending draw\n for (const renderer of this._renderers.values()) {\n if (renderer.hasPendingDraws()) {\n renderer.flush();\n }\n }\n }\n currentTarget.disable();\n // post process step\n if (this._postprocessors.length > 0) {\n const source = currentTarget.toRenderSource();\n source.use();\n }\n // flip flop render targets for post processing\n for (let i = 0; i < this._postprocessors.length; i++) {\n currentTarget = this._postProcessTargets[i % 2];\n this._postProcessTargets[i % 2].use();\n this._screenRenderer.renderWithPostProcessor(this._postprocessors[i]);\n this._postProcessTargets[i % 2].toRenderSource().use();\n }\n // Final blit to the screen\n currentTarget.blitToScreen();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/circle-renderer/circle-renderer.ts\":\n/*!*************************************************************!*\\\n !*** ./Graphics/Context/circle-renderer/circle-renderer.ts ***!\n \\*************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CircleRenderer: () => (/* binding */ CircleRenderer)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../Color */ \"./Color.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n/* harmony import */ var _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _quad_index_buffer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../quad-index-buffer */ \"./Graphics/Context/quad-index-buffer.ts\");\n/* harmony import */ var _shader__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _vertex_buffer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _vertex_layout__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../vertex-layout */ \"./Graphics/Context/vertex-layout.ts\");\n/* harmony import */ var _circle_renderer_frag_glsl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./circle-renderer.frag.glsl */ \"./Graphics/Context/circle-renderer/circle-renderer.frag.glsl\");\n/* harmony import */ var _circle_renderer_vert_glsl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./circle-renderer.vert.glsl */ \"./Graphics/Context/circle-renderer/circle-renderer.vert.glsl\");\n\n\n\n\n\n\n\n\n\n\nclass CircleRenderer {\n constructor() {\n this.type = 'ex.circle';\n this.priority = 0;\n this._maxCircles = 10922; // max(uint16) / 6 verts\n this._circleCount = 0;\n this._vertexIndex = 0;\n }\n initialize(gl, context) {\n this._gl = gl;\n this._context = context;\n this._shader = new _shader__WEBPACK_IMPORTED_MODULE_0__.Shader({\n gl,\n fragmentSource: _circle_renderer_frag_glsl__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n vertexSource: _circle_renderer_vert_glsl__WEBPACK_IMPORTED_MODULE_2__[\"default\"]\n });\n this._shader.compile();\n // setup uniforms\n this._shader.use();\n this._shader.setUniformMatrix('u_matrix', context.ortho);\n this._buffer = new _vertex_buffer__WEBPACK_IMPORTED_MODULE_3__.VertexBuffer({\n gl,\n size: 14 * 4 * this._maxCircles,\n type: 'dynamic'\n });\n this._layout = new _vertex_layout__WEBPACK_IMPORTED_MODULE_4__.VertexLayout({\n gl,\n shader: this._shader,\n vertexBuffer: this._buffer,\n attributes: [\n ['a_position', 2],\n ['a_uv', 2],\n ['a_opacity', 1],\n ['a_color', 4],\n ['a_strokeColor', 4],\n ['a_strokeThickness', 1]\n ]\n });\n this._quads = new _quad_index_buffer__WEBPACK_IMPORTED_MODULE_5__.QuadIndexBuffer(gl, this._maxCircles, true);\n }\n dispose() {\n this._buffer.dispose();\n this._quads.dispose();\n this._shader.dispose();\n this._context = null;\n this._gl = null;\n }\n _isFull() {\n if (this._circleCount >= this._maxCircles) {\n return true;\n }\n return false;\n }\n draw(pos, radius, color, stroke = _Color__WEBPACK_IMPORTED_MODULE_6__.Color.Transparent, strokeThickness = 0) {\n if (this._isFull()) {\n this.flush();\n }\n this._circleCount++;\n // transform based on current context\n const transform = this._context.getTransform();\n const opacity = this._context.opacity;\n const snapToPixel = this._context.snapToPixel;\n const topLeft = transform.multiply(pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_7__.vec)(-radius, -radius)));\n const topRight = transform.multiply(pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_7__.vec)(radius, -radius)));\n const bottomRight = transform.multiply(pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_7__.vec)(radius, radius)));\n const bottomLeft = transform.multiply(pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_7__.vec)(-radius, radius)));\n if (snapToPixel) {\n topLeft.x = ~~(topLeft.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n topLeft.y = ~~(topLeft.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n topRight.x = ~~(topRight.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n topRight.y = ~~(topRight.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n bottomLeft.x = ~~(bottomLeft.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n bottomLeft.y = ~~(bottomLeft.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n bottomRight.x = ~~(bottomRight.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n bottomRight.y = ~~(bottomRight.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n }\n // TODO UV could be static vertex buffer\n const uvx0 = 0;\n const uvy0 = 0;\n const uvx1 = 1;\n const uvy1 = 1;\n // update data\n const vertexBuffer = this._layout.vertexBuffer.bufferData;\n // (0, 0) - 0\n vertexBuffer[this._vertexIndex++] = topLeft.x;\n vertexBuffer[this._vertexIndex++] = topLeft.y;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness / radius;\n // (0, 1) - 1\n vertexBuffer[this._vertexIndex++] = bottomLeft.x;\n vertexBuffer[this._vertexIndex++] = bottomLeft.y;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness / radius;\n // (1, 0) - 2\n vertexBuffer[this._vertexIndex++] = topRight.x;\n vertexBuffer[this._vertexIndex++] = topRight.y;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness / radius;\n // (1, 1) - 3\n vertexBuffer[this._vertexIndex++] = bottomRight.x;\n vertexBuffer[this._vertexIndex++] = bottomRight.y;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness / radius;\n }\n hasPendingDraws() {\n return this._circleCount !== 0;\n }\n flush() {\n // nothing to draw early exit\n if (this._circleCount === 0) {\n return;\n }\n const gl = this._gl;\n // Bind the shader\n this._shader.use();\n // Bind the memory layout and upload data\n this._layout.use(true);\n // Update ortho matrix uniform\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n // Bind index buffer\n this._quads.bind();\n // Draw all the quads\n gl.drawElements(gl.TRIANGLES, this._circleCount * 6, this._quads.bufferGlType, 0);\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_9__.GraphicsDiagnostics.DrawnImagesCount += this._circleCount;\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_9__.GraphicsDiagnostics.DrawCallCount++;\n // Reset\n this._circleCount = 0;\n this._vertexIndex = 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/debug-text.ts\":\n/*!****************************************!*\\\n !*** ./Graphics/Context/debug-text.ts ***!\n \\****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DebugText: () => (/* binding */ DebugText)\n/* harmony export */ });\n/* harmony import */ var _ImageSource__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ImageSource */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _SpriteFont__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../SpriteFont */ \"./Graphics/SpriteFont.ts\");\n/* harmony import */ var _SpriteSheet__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../SpriteSheet */ \"./Graphics/SpriteSheet.ts\");\n/* harmony import */ var _debug_font_png__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./debug-font.png */ \"./Graphics/Context/debug-font.png\");\n\n\n\n\n/**\n * Internal debug text helper\n */\nclass DebugText {\n constructor() {\n /**\n * base64 font\n */\n this.fontSheet = _debug_font_png__WEBPACK_IMPORTED_MODULE_0__[\"default\"];\n this.size = 16;\n // We fire and forget, we don't care if it's loaded or not\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.load();\n }\n load() {\n this._imageSource = new _ImageSource__WEBPACK_IMPORTED_MODULE_1__.ImageSource(this.fontSheet);\n return this._imageSource.load().then(() => {\n this._spriteSheet = _SpriteSheet__WEBPACK_IMPORTED_MODULE_2__.SpriteSheet.fromImageSource({\n image: this._imageSource,\n grid: {\n rows: 4,\n columns: 16,\n spriteWidth: 16,\n spriteHeight: 16\n }\n });\n this._spriteFont = new _SpriteFont__WEBPACK_IMPORTED_MODULE_3__.SpriteFont({\n alphabet: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ,!\\'&.\"?-()+# ',\n caseInsensitive: true,\n spriteSheet: this._spriteSheet,\n spacing: -6\n });\n });\n }\n /**\n * Writes debug text using the built in sprint font\n * @param ctx\n * @param text\n * @param pos\n */\n write(ctx, text, pos) {\n if (this._imageSource.isLoaded()) {\n this._spriteFont.render(ctx, text, null, pos.x, pos.y);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/draw-call.ts\":\n/*!***************************************!*\\\n !*** ./Graphics/Context/draw-call.ts ***!\n \\***************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DrawCall: () => (/* binding */ DrawCall)\n/* harmony export */ });\n/* harmony import */ var _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/affine-matrix */ \"./Math/affine-matrix.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Color */ \"./Color.ts\");\n\n\nclass DrawCall {\n constructor() {\n this.z = 0;\n this.priority = 0;\n this.renderer = '';\n this.transform = _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_0__.AffineMatrix.identity();\n this.state = {\n z: 0,\n opacity: 1,\n tint: _Color__WEBPACK_IMPORTED_MODULE_1__.Color.White,\n material: null\n };\n this.args = new Array(10);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/image-renderer-v2/image-renderer-v2.ts\":\n/*!*****************************************************************!*\\\n !*** ./Graphics/Context/image-renderer-v2/image-renderer-v2.ts ***!\n \\*****************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ImageRendererV2: () => (/* binding */ ImageRendererV2)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Color */ \"./Color.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n/* harmony import */ var _ImageSource__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../ImageSource */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../Wrapping */ \"./Graphics/Wrapping.ts\");\n/* harmony import */ var _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _shader__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _vertex_buffer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _webgl_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../webgl-util */ \"./Graphics/Context/webgl-util.ts\");\n/* harmony import */ var _image_renderer_v2_frag_glsl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./image-renderer-v2.frag.glsl */ \"./Graphics/Context/image-renderer-v2/image-renderer-v2.frag.glsl\");\n/* harmony import */ var _image_renderer_v2_vert_glsl__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./image-renderer-v2.vert.glsl */ \"./Graphics/Context/image-renderer-v2/image-renderer-v2.vert.glsl\");\n// import { Color } from '../../../Color';\n// import { parseImageFiltering } from '../../Filtering';\n\n\n\n\n\n\n\n\n\n\n\nclass ImageRendererV2 {\n constructor(options) {\n this.type = 'ex.image-v2';\n this.priority = 0;\n // TODO this could be bigger probably\n this._maxImages = 20000; // max(uint16) / 6 verts\n this._maxTextures = 0;\n this._components = 2 + 2 + 2 + 2 + 1 + 2 + 2 + 1 + 2 + 2 + 4;\n // Per flush vars\n this._imageCount = 0;\n this._textures = [];\n this._textureIndex = 0;\n this._textureToIndex = new Map();\n this._images = new Set();\n this._vertexIndex = 0;\n this._imageToWidth = new Map();\n this._imageToHeight = new Map();\n this._view = [0, 0, 0, 0];\n this._dest = [0, 0];\n this._defaultTint = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.White;\n this.pixelArtSampler = options.pixelArtSampler;\n this.uvPadding = options.uvPadding;\n }\n initialize(gl, context) {\n this._gl = gl;\n this._context = context;\n // Transform shader source\n const maxTexture = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS);\n const maxComplexity = (0,_webgl_util__WEBPACK_IMPORTED_MODULE_1__.getMaxShaderComplexity)(gl, maxTexture);\n this._maxTextures = Math.min(maxTexture, maxComplexity);\n const transformedFrag = this._transformFragmentSource(_image_renderer_v2_frag_glsl__WEBPACK_IMPORTED_MODULE_2__[\"default\"], this._maxTextures);\n // Compile shader\n this._shader = new _shader__WEBPACK_IMPORTED_MODULE_3__.Shader({\n gl,\n fragmentSource: transformedFrag,\n vertexSource: _image_renderer_v2_vert_glsl__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n });\n this._shader.compile();\n // setup uniforms\n this._shader.use();\n this._shader.setUniformMatrix('u_matrix', context.ortho);\n // Initialize texture slots to [0, 1, 2, 3, 4, .... maxGPUTextures]\n this._shader.setUniformIntArray('u_textures', [...Array(this._maxTextures)].map((_, i) => i));\n this._vao = gl.createVertexArray();\n gl.bindVertexArray(this._vao);\n this._quadMesh = new Float32Array([\n // pos uv\n 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0,\n 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1\n ]);\n this._meshBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this._meshBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, this._quadMesh, gl.STATIC_DRAW);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 16, 0);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(1, 2, gl.FLOAT, false, 16, 8);\n gl.enableVertexAttribArray(1);\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n // Setup memory layout\n const components = this._components;\n this._transformData = new _vertex_buffer__WEBPACK_IMPORTED_MODULE_5__.VertexBuffer({\n gl,\n size: components * this._maxImages, // components * images\n type: 'dynamic'\n });\n this._transformData.bind();\n // attributes\n let offset = 0;\n let start = 2;\n const bytesPerFloat = 4;\n const totalSize = components * 4;\n // a_offset vec2 - 2\n gl.vertexAttribPointer(start++, 2, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(2);\n offset += 2 * bytesPerFloat;\n // a_mat_column1 vec2 - 2\n gl.vertexAttribPointer(start++, 2, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(3);\n offset += 2 * bytesPerFloat;\n // a_mat_column2 vec2 - 2\n gl.vertexAttribPointer(start++, 2, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(4);\n offset += 2 * bytesPerFloat;\n // a_mat_column3 vec2 - 2\n gl.vertexAttribPointer(start++, 2, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(5);\n offset += 2 * bytesPerFloat;\n // a_opacity float - 1\n gl.vertexAttribPointer(start++, 1, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(6);\n offset += 1 * bytesPerFloat;\n // a_res vec2 - 2\n gl.vertexAttribPointer(start++, 2, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(7);\n offset += 2 * bytesPerFloat;\n // a_size vec2 - 2\n gl.vertexAttribPointer(start++, 2, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(8);\n offset += 2 * bytesPerFloat;\n // a_texture_index - 1\n gl.vertexAttribPointer(start++, 1, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(9);\n offset += 1 * bytesPerFloat;\n // a_uv_min - 2\n gl.vertexAttribPointer(start++, 2, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(10);\n offset += 2 * bytesPerFloat;\n // a_uv_max - 2\n gl.vertexAttribPointer(start++, 2, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(11);\n offset += 2 * bytesPerFloat;\n // a_tint - 4\n gl.vertexAttribPointer(start++, 4, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(12);\n offset += 4 * bytesPerFloat;\n gl.vertexAttribDivisor(2, 1);\n gl.vertexAttribDivisor(3, 1);\n gl.vertexAttribDivisor(4, 1);\n gl.vertexAttribDivisor(5, 1);\n gl.vertexAttribDivisor(6, 1);\n gl.vertexAttribDivisor(7, 1);\n gl.vertexAttribDivisor(8, 1);\n gl.vertexAttribDivisor(9, 1);\n gl.vertexAttribDivisor(10, 1);\n gl.vertexAttribDivisor(11, 1);\n gl.vertexAttribDivisor(12, 1);\n gl.bindVertexArray(null);\n }\n _bindData(gl) {\n // Setup memory layout\n const components = this._components;\n this._transformData.bind();\n this._transformData.upload(components * this._imageCount);\n gl.bindVertexArray(this._vao);\n }\n dispose() {\n this._transformData.dispose();\n this._shader.dispose();\n this._textures.length = 0;\n this._context = null;\n this._gl = null;\n }\n _transformFragmentSource(source, maxTextures) {\n let newSource = source.replace('%%count%%', maxTextures.toString());\n let texturePickerBuilder = '';\n for (let i = 0; i < maxTextures; i++) {\n if (i === 0) {\n texturePickerBuilder += `if (v_texture_index <= ${i}.5) {\\n`;\n }\n else {\n texturePickerBuilder += ` else if (v_texture_index <= ${i}.5) {\\n`;\n }\n texturePickerBuilder += ` color = texture(u_textures[${i}], uv);\\n`;\n texturePickerBuilder += ` }\\n`;\n }\n newSource = newSource.replace('%%texture_picker%%', texturePickerBuilder);\n return newSource;\n }\n _addImageAsTexture(image) {\n if (this._images.has(image)) {\n return;\n }\n const maybeFiltering = image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_6__.ImageSourceAttributeConstants.Filtering);\n const filtering = maybeFiltering ? (0,_Filtering__WEBPACK_IMPORTED_MODULE_7__.parseImageFiltering)(maybeFiltering) : undefined;\n const wrapX = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_8__.parseImageWrapping)(image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_6__.ImageSourceAttributeConstants.WrappingX));\n const wrapY = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_8__.parseImageWrapping)(image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_6__.ImageSourceAttributeConstants.WrappingY));\n const force = image.getAttribute('forceUpload') === 'true' ? true : false;\n const texture = this._context.textureLoader.load(image, {\n filtering,\n wrapping: { x: wrapX, y: wrapY }\n }, force);\n // remove force attribute after upload\n image.removeAttribute('forceUpload');\n if (this._textures.indexOf(texture) === -1) {\n this._textures.push(texture);\n this._textureToIndex.set(texture, this._textureIndex++);\n this._images.add(image);\n }\n }\n _bindTextures(gl) {\n // Bind textures in the correct order\n const max = Math.min(this._textureIndex, this._maxTextures);\n for (let i = 0; i < max; i++) {\n gl.activeTexture(gl.TEXTURE0 + i);\n gl.bindTexture(gl.TEXTURE_2D, this._textures[i] || this._textures[0]);\n }\n }\n _getTextureIdForImage(image) {\n var _a;\n if (image) {\n const maybeTexture = this._context.textureLoader.get(image);\n return (_a = this._textureToIndex.get(maybeTexture)) !== null && _a !== void 0 ? _a : -1; //this._textures.indexOf(maybeTexture);\n }\n return -1;\n }\n _isFull() {\n if (this._imageCount >= this._maxImages) {\n return true;\n }\n if (this._textures.length >= this._maxTextures) {\n return true;\n }\n return false;\n }\n _getImageWidth(image) {\n let maybeWidth = this._imageToWidth.get(image);\n if (maybeWidth === undefined) {\n maybeWidth = image.width;\n this._imageToWidth.set(image, maybeWidth);\n }\n return maybeWidth;\n }\n _getImageHeight(image) {\n let maybeHeight = this._imageToHeight.get(image);\n if (maybeHeight === undefined) {\n maybeHeight = image.height;\n this._imageToHeight.set(image, maybeHeight);\n }\n return maybeHeight;\n }\n draw(image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight) {\n var _a, _b, _c, _d;\n // Force a render if the batch is full\n if (this._isFull()) {\n this.flush();\n }\n this._imageCount++;\n // This creates and uploads the texture if not already done\n this._addImageAsTexture(image);\n const maybeImageWidth = this._getImageWidth(image);\n const maybeImageHeight = this._getImageHeight(image);\n let width = maybeImageWidth || swidth || 0;\n let height = maybeImageHeight || sheight || 0;\n this._view[0] = 0;\n this._view[1] = 0;\n this._view[2] = (_a = swidth !== null && swidth !== void 0 ? swidth : maybeImageWidth) !== null && _a !== void 0 ? _a : 0;\n this._view[3] = (_b = sheight !== null && sheight !== void 0 ? sheight : maybeImageHeight) !== null && _b !== void 0 ? _b : 0;\n this._dest[0] = sx !== null && sx !== void 0 ? sx : 1;\n this._dest[1] = sy !== null && sy !== void 0 ? sy : 1;\n // If destination is specified, update view and dest\n if (dx !== undefined && dy !== undefined && dwidth !== undefined && dheight !== undefined) {\n this._view[0] = sx !== null && sx !== void 0 ? sx : 1;\n this._view[1] = sy !== null && sy !== void 0 ? sy : 1;\n this._view[2] = (_c = swidth !== null && swidth !== void 0 ? swidth : maybeImageWidth) !== null && _c !== void 0 ? _c : 0;\n this._view[3] = (_d = sheight !== null && sheight !== void 0 ? sheight : maybeImageHeight) !== null && _d !== void 0 ? _d : 0;\n this._dest[0] = dx;\n this._dest[1] = dy;\n width = dwidth;\n height = dheight;\n }\n sx = this._view[0];\n sy = this._view[1];\n const sw = this._view[2];\n const sh = this._view[3];\n // transform based on current context\n const transform = this._context.getTransform();\n const opacity = this._context.opacity;\n const snapToPixel = this._context.snapToPixel;\n if (snapToPixel) {\n this._dest[0] = ~~(this._dest[0] + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_9__.pixelSnapEpsilon);\n this._dest[1] = ~~(this._dest[1] + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_9__.pixelSnapEpsilon);\n }\n const tint = this._context.tint || this._defaultTint;\n const textureId = this._getTextureIdForImage(image);\n const imageWidth = maybeImageWidth || width;\n const imageHeight = maybeImageHeight || height;\n const uvx0 = (sx + this.uvPadding) / imageWidth;\n const uvy0 = (sy + this.uvPadding) / imageHeight;\n const uvx1 = (sx + sw - this.uvPadding) / imageWidth;\n const uvy1 = (sy + sh - this.uvPadding) / imageHeight;\n const txWidth = maybeImageWidth;\n const txHeight = maybeImageHeight;\n // update data\n const vertexBuffer = this._transformData.bufferData;\n vertexBuffer[this._vertexIndex++] = this._dest[0];\n vertexBuffer[this._vertexIndex++] = this._dest[1];\n vertexBuffer[this._vertexIndex++] = transform.data[0];\n vertexBuffer[this._vertexIndex++] = transform.data[1];\n vertexBuffer[this._vertexIndex++] = transform.data[2];\n vertexBuffer[this._vertexIndex++] = transform.data[3];\n vertexBuffer[this._vertexIndex++] = transform.data[4];\n vertexBuffer[this._vertexIndex++] = transform.data[5];\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = width;\n vertexBuffer[this._vertexIndex++] = height;\n vertexBuffer[this._vertexIndex++] = txWidth;\n vertexBuffer[this._vertexIndex++] = txHeight;\n vertexBuffer[this._vertexIndex++] = textureId;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = tint.r / 255;\n vertexBuffer[this._vertexIndex++] = tint.g / 255;\n vertexBuffer[this._vertexIndex++] = tint.b / 255;\n vertexBuffer[this._vertexIndex++] = tint.a;\n }\n hasPendingDraws() {\n return this._imageCount !== 0;\n }\n flush() {\n // nothing to draw early exit\n if (this._imageCount === 0) {\n return;\n }\n const gl = this._gl;\n // Bind the shader\n this._shader.use();\n // Bind the memory layout and upload data\n this._bindData(gl);\n // Update ortho matrix uniform\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n // Turn on pixel art aa sampler\n this._shader.setUniformBoolean('u_pixelart', this.pixelArtSampler);\n // Bind textures to\n this._bindTextures(gl);\n // Draw all the quads\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 6, this._imageCount);\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_10__.GraphicsDiagnostics.DrawnImagesCount += this._imageCount;\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_10__.GraphicsDiagnostics.DrawCallCount++;\n gl.bindVertexArray(null);\n // Reset\n this._imageCount = 0;\n this._vertexIndex = 0;\n this._textures.length = 0;\n this._textureIndex = 0;\n this._textureToIndex.clear();\n this._images.clear();\n this._imageToWidth.clear();\n this._imageToHeight.clear();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/image-renderer/image-renderer.ts\":\n/*!***********************************************************!*\\\n !*** ./Graphics/Context/image-renderer/image-renderer.ts ***!\n \\***********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ImageRenderer: () => (/* binding */ ImageRenderer)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Color */ \"./Color.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n/* harmony import */ var _ImageSource__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../ImageSource */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../Wrapping */ \"./Graphics/Wrapping.ts\");\n/* harmony import */ var _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _quad_index_buffer__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../quad-index-buffer */ \"./Graphics/Context/quad-index-buffer.ts\");\n/* harmony import */ var _shader__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _vertex_buffer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _vertex_layout__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../vertex-layout */ \"./Graphics/Context/vertex-layout.ts\");\n/* harmony import */ var _webgl_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../webgl-util */ \"./Graphics/Context/webgl-util.ts\");\n/* harmony import */ var _image_renderer_frag_glsl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./image-renderer.frag.glsl */ \"./Graphics/Context/image-renderer/image-renderer.frag.glsl\");\n/* harmony import */ var _image_renderer_vert_glsl__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./image-renderer.vert.glsl */ \"./Graphics/Context/image-renderer/image-renderer.vert.glsl\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass ImageRenderer {\n constructor(options) {\n this.type = 'ex.image';\n this.priority = 0;\n this._maxImages = 10922; // max(uint16) / 6 verts\n this._maxTextures = 0;\n // Per flush vars\n this._imageCount = 0;\n this._textures = [];\n this._textureIndex = 0;\n this._textureToIndex = new Map();\n this._images = new Set();\n this._vertexIndex = 0;\n this._imageToWidth = new Map();\n this._imageToHeight = new Map();\n this._view = [0, 0, 0, 0];\n this._dest = [0, 0];\n this._quad = [0, 0, 0, 0, 0, 0, 0, 0];\n this._defaultTint = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.White;\n this.pixelArtSampler = options.pixelArtSampler;\n this.uvPadding = options.uvPadding;\n }\n initialize(gl, context) {\n this._gl = gl;\n this._context = context;\n // Transform shader source\n // FIXME: PIXEL 6 complains `ERROR: Expression too complex.` if we use it's reported max texture units, 125 seems to work for now...\n const maxTexture = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS);\n const maxComplexity = (0,_webgl_util__WEBPACK_IMPORTED_MODULE_1__.getMaxShaderComplexity)(gl, maxTexture);\n this._maxTextures = Math.min(maxTexture, maxComplexity);\n const transformedFrag = this._transformFragmentSource(_image_renderer_frag_glsl__WEBPACK_IMPORTED_MODULE_2__[\"default\"], this._maxTextures);\n // Compile shader\n this._shader = new _shader__WEBPACK_IMPORTED_MODULE_3__.Shader({\n gl,\n fragmentSource: transformedFrag,\n vertexSource: _image_renderer_vert_glsl__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n });\n this._shader.compile();\n // setup uniforms\n this._shader.use();\n this._shader.setUniformMatrix('u_matrix', context.ortho);\n // Initialize texture slots to [0, 1, 2, 3, 4, .... maxGPUTextures]\n this._shader.setUniformIntArray('u_textures', [...Array(this._maxTextures)].map((_, i) => i));\n // Setup memory layout\n this._buffer = new _vertex_buffer__WEBPACK_IMPORTED_MODULE_5__.VertexBuffer({\n gl,\n size: 12 * 4 * this._maxImages, // 12 components * 4 verts\n type: 'dynamic'\n });\n this._layout = new _vertex_layout__WEBPACK_IMPORTED_MODULE_6__.VertexLayout({\n gl,\n shader: this._shader,\n vertexBuffer: this._buffer,\n attributes: [\n ['a_position', 2],\n ['a_opacity', 1],\n ['a_res', 2],\n ['a_texcoord', 2],\n ['a_textureIndex', 1],\n ['a_tint', 4]\n ]\n });\n // Setup index buffer\n this._quads = new _quad_index_buffer__WEBPACK_IMPORTED_MODULE_7__.QuadIndexBuffer(gl, this._maxImages, true);\n }\n dispose() {\n this._buffer.dispose();\n this._quads.dispose();\n this._shader.dispose();\n this._textures.length = 0;\n this._context = null;\n this._gl = null;\n }\n _transformFragmentSource(source, maxTextures) {\n let newSource = source.replace('%%count%%', maxTextures.toString());\n let texturePickerBuilder = '';\n for (let i = 0; i < maxTextures; i++) {\n if (i === 0) {\n texturePickerBuilder += `if (v_textureIndex <= ${i}.5) {\\n`;\n }\n else {\n texturePickerBuilder += ` else if (v_textureIndex <= ${i}.5) {\\n`;\n }\n texturePickerBuilder += ` vec2 uv = u_pixelart ? uv_iq(v_texcoord, v_res) : v_texcoord;\\n`;\n texturePickerBuilder += ` color = texture(u_textures[${i}], uv);\\n`;\n texturePickerBuilder += ` }\\n`;\n }\n newSource = newSource.replace('%%texture_picker%%', texturePickerBuilder);\n return newSource;\n }\n _addImageAsTexture(image) {\n if (this._images.has(image)) {\n return;\n }\n const maybeFiltering = image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_8__.ImageSourceAttributeConstants.Filtering);\n const filtering = maybeFiltering ? (0,_Filtering__WEBPACK_IMPORTED_MODULE_9__.parseImageFiltering)(maybeFiltering) : undefined;\n const wrapX = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_10__.parseImageWrapping)(image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_8__.ImageSourceAttributeConstants.WrappingX));\n const wrapY = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_10__.parseImageWrapping)(image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_8__.ImageSourceAttributeConstants.WrappingY));\n const force = image.getAttribute('forceUpload') === 'true' ? true : false;\n const texture = this._context.textureLoader.load(image, {\n filtering,\n wrapping: { x: wrapX, y: wrapY }\n }, force);\n // remove force attribute after upload\n image.removeAttribute('forceUpload');\n if (this._textures.indexOf(texture) === -1) {\n this._textures.push(texture);\n this._textureToIndex.set(texture, this._textureIndex++);\n this._images.add(image);\n }\n }\n _bindTextures(gl) {\n // Bind textures in the correct order\n for (let i = 0; i < this._maxTextures; i++) {\n gl.activeTexture(gl.TEXTURE0 + i);\n gl.bindTexture(gl.TEXTURE_2D, this._textures[i] || this._textures[0]);\n }\n }\n _getTextureIdForImage(image) {\n var _a;\n if (image) {\n const maybeTexture = this._context.textureLoader.get(image);\n return (_a = this._textureToIndex.get(maybeTexture)) !== null && _a !== void 0 ? _a : -1; //this._textures.indexOf(maybeTexture);\n }\n return -1;\n }\n _isFull() {\n if (this._imageCount >= this._maxImages) {\n return true;\n }\n if (this._textures.length >= this._maxTextures) {\n return true;\n }\n return false;\n }\n _getImageWidth(image) {\n let maybeWidth = this._imageToWidth.get(image);\n if (maybeWidth === undefined) {\n maybeWidth = image.width;\n this._imageToWidth.set(image, maybeWidth);\n }\n return maybeWidth;\n }\n _getImageHeight(image) {\n let maybeHeight = this._imageToHeight.get(image);\n if (maybeHeight === undefined) {\n maybeHeight = image.height;\n this._imageToHeight.set(image, maybeHeight);\n }\n return maybeHeight;\n }\n draw(image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight) {\n var _a, _b, _c, _d;\n // Force a render if the batch is full\n if (this._isFull()) {\n this.flush();\n }\n this._imageCount++;\n // This creates and uploads the texture if not already done\n this._addImageAsTexture(image);\n const maybeImageWidth = this._getImageWidth(image);\n const maybeImageHeight = this._getImageHeight(image);\n let width = maybeImageWidth || swidth || 0;\n let height = maybeImageHeight || sheight || 0;\n this._view[0] = 0;\n this._view[1] = 0;\n this._view[2] = (_a = swidth !== null && swidth !== void 0 ? swidth : maybeImageWidth) !== null && _a !== void 0 ? _a : 0;\n this._view[3] = (_b = sheight !== null && sheight !== void 0 ? sheight : maybeImageHeight) !== null && _b !== void 0 ? _b : 0;\n this._dest[0] = sx !== null && sx !== void 0 ? sx : 1;\n this._dest[1] = sy !== null && sy !== void 0 ? sy : 1;\n // If destination is specified, update view and dest\n if (dx !== undefined && dy !== undefined && dwidth !== undefined && dheight !== undefined) {\n this._view[0] = sx !== null && sx !== void 0 ? sx : 1;\n this._view[1] = sy !== null && sy !== void 0 ? sy : 1;\n this._view[2] = (_c = swidth !== null && swidth !== void 0 ? swidth : maybeImageWidth) !== null && _c !== void 0 ? _c : 0;\n this._view[3] = (_d = sheight !== null && sheight !== void 0 ? sheight : maybeImageHeight) !== null && _d !== void 0 ? _d : 0;\n this._dest[0] = dx;\n this._dest[1] = dy;\n width = dwidth;\n height = dheight;\n }\n sx = this._view[0];\n sy = this._view[1];\n const sw = this._view[2];\n const sh = this._view[3];\n // transform based on current context\n const transform = this._context.getTransform();\n const opacity = this._context.opacity;\n const snapToPixel = this._context.snapToPixel;\n // top left\n this._quad[0] = this._dest[0];\n this._quad[1] = this._dest[1];\n // top right\n this._quad[2] = this._dest[0] + width;\n this._quad[3] = this._dest[1];\n // bottom left\n this._quad[4] = this._dest[0];\n this._quad[5] = this._dest[1] + height;\n // bottom right\n this._quad[6] = this._dest[0] + width;\n this._quad[7] = this._dest[1] + height;\n transform.multiplyQuadInPlace(this._quad);\n if (snapToPixel) {\n this._quad[0] = ~~(this._quad[0] + (0,_Math_util__WEBPACK_IMPORTED_MODULE_11__.sign)(this._quad[0]) * _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__.pixelSnapEpsilon);\n this._quad[1] = ~~(this._quad[1] + (0,_Math_util__WEBPACK_IMPORTED_MODULE_11__.sign)(this._quad[1]) * _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__.pixelSnapEpsilon);\n this._quad[2] = ~~(this._quad[2] + (0,_Math_util__WEBPACK_IMPORTED_MODULE_11__.sign)(this._quad[2]) * _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__.pixelSnapEpsilon);\n this._quad[3] = ~~(this._quad[3] + (0,_Math_util__WEBPACK_IMPORTED_MODULE_11__.sign)(this._quad[3]) * _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__.pixelSnapEpsilon);\n this._quad[4] = ~~(this._quad[4] + (0,_Math_util__WEBPACK_IMPORTED_MODULE_11__.sign)(this._quad[4]) * _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__.pixelSnapEpsilon);\n this._quad[5] = ~~(this._quad[5] + (0,_Math_util__WEBPACK_IMPORTED_MODULE_11__.sign)(this._quad[5]) * _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__.pixelSnapEpsilon);\n this._quad[6] = ~~(this._quad[6] + (0,_Math_util__WEBPACK_IMPORTED_MODULE_11__.sign)(this._quad[6]) * _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__.pixelSnapEpsilon);\n this._quad[7] = ~~(this._quad[7] + (0,_Math_util__WEBPACK_IMPORTED_MODULE_11__.sign)(this._quad[7]) * _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__.pixelSnapEpsilon);\n }\n const tint = this._context.tint || this._defaultTint;\n const textureId = this._getTextureIdForImage(image);\n const imageWidth = maybeImageWidth || width;\n const imageHeight = maybeImageHeight || height;\n const uvx0 = (sx + this.uvPadding) / imageWidth;\n const uvy0 = (sy + this.uvPadding) / imageHeight;\n const uvx1 = (sx + sw - this.uvPadding) / imageWidth;\n const uvy1 = (sy + sh - this.uvPadding) / imageHeight;\n const txWidth = maybeImageWidth;\n const txHeight = maybeImageHeight;\n // update data\n const vertexBuffer = this._layout.vertexBuffer.bufferData;\n // (0, 0) - 0\n vertexBuffer[this._vertexIndex++] = this._quad[0];\n vertexBuffer[this._vertexIndex++] = this._quad[1];\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = txWidth;\n vertexBuffer[this._vertexIndex++] = txHeight;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = textureId;\n vertexBuffer[this._vertexIndex++] = tint.r / 255;\n vertexBuffer[this._vertexIndex++] = tint.g / 255;\n vertexBuffer[this._vertexIndex++] = tint.b / 255;\n vertexBuffer[this._vertexIndex++] = tint.a;\n // (0, 1) - 1\n vertexBuffer[this._vertexIndex++] = this._quad[4];\n vertexBuffer[this._vertexIndex++] = this._quad[5];\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = txWidth;\n vertexBuffer[this._vertexIndex++] = txHeight;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = textureId;\n vertexBuffer[this._vertexIndex++] = tint.r / 255;\n vertexBuffer[this._vertexIndex++] = tint.g / 255;\n vertexBuffer[this._vertexIndex++] = tint.b / 255;\n vertexBuffer[this._vertexIndex++] = tint.a;\n // (1, 0) - 2\n vertexBuffer[this._vertexIndex++] = this._quad[2];\n vertexBuffer[this._vertexIndex++] = this._quad[3];\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = txWidth;\n vertexBuffer[this._vertexIndex++] = txHeight;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = textureId;\n vertexBuffer[this._vertexIndex++] = tint.r / 255;\n vertexBuffer[this._vertexIndex++] = tint.g / 255;\n vertexBuffer[this._vertexIndex++] = tint.b / 255;\n vertexBuffer[this._vertexIndex++] = tint.a;\n // (1, 1) - 3\n vertexBuffer[this._vertexIndex++] = this._quad[6];\n vertexBuffer[this._vertexIndex++] = this._quad[7];\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = txWidth;\n vertexBuffer[this._vertexIndex++] = txHeight;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = textureId;\n vertexBuffer[this._vertexIndex++] = tint.r / 255;\n vertexBuffer[this._vertexIndex++] = tint.g / 255;\n vertexBuffer[this._vertexIndex++] = tint.b / 255;\n vertexBuffer[this._vertexIndex++] = tint.a;\n }\n hasPendingDraws() {\n return this._imageCount !== 0;\n }\n flush() {\n // nothing to draw early exit\n if (this._imageCount === 0) {\n return;\n }\n const gl = this._gl;\n // Bind the shader\n this._shader.use();\n // Bind the memory layout and upload data\n this._layout.use(true, 4 * 12 * this._imageCount); // 4 verts * 12 components\n // Update ortho matrix uniform\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n // Turn on pixel art aa sampler\n this._shader.setUniformBoolean('u_pixelart', this.pixelArtSampler);\n // Bind textures to\n this._bindTextures(gl);\n // Bind index buffer\n this._quads.bind();\n // Draw all the quads\n gl.drawElements(gl.TRIANGLES, this._imageCount * 6, this._quads.bufferGlType, 0);\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_13__.GraphicsDiagnostics.DrawnImagesCount += this._imageCount;\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_13__.GraphicsDiagnostics.DrawCallCount++;\n // Reset\n this._imageCount = 0;\n this._vertexIndex = 0;\n this._textures.length = 0;\n this._textureIndex = 0;\n this._textureToIndex.clear();\n this._images.clear();\n this._imageToWidth.clear();\n this._imageToHeight.clear();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/line-renderer/line-renderer.ts\":\n/*!*********************************************************!*\\\n !*** ./Graphics/Context/line-renderer/line-renderer.ts ***!\n \\*********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ LineRenderer: () => (/* binding */ LineRenderer)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _line_vertex_glsl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./line-vertex.glsl */ \"./Graphics/Context/line-renderer/line-vertex.glsl\");\n/* harmony import */ var _line_fragment_glsl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./line-fragment.glsl */ \"./Graphics/Context/line-renderer/line-fragment.glsl\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../.. */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../.. */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../.. */ \"./Graphics/Context/vertex-layout.ts\");\n/* harmony import */ var _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n\n\n\n\n\nclass LineRenderer {\n constructor() {\n this.type = 'ex.line';\n this.priority = 0;\n this._maxLines = 10922;\n this._vertexIndex = 0;\n this._lineCount = 0;\n this._startScratch = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n this._endScratch = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n }\n initialize(gl, context) {\n this._gl = gl;\n this._context = context;\n this._shader = new ___WEBPACK_IMPORTED_MODULE_1__.Shader({\n gl,\n vertexSource: _line_vertex_glsl__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n fragmentSource: _line_fragment_glsl__WEBPACK_IMPORTED_MODULE_3__[\"default\"]\n });\n this._shader.compile();\n this._shader.use();\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n this._vertexBuffer = new ___WEBPACK_IMPORTED_MODULE_4__.VertexBuffer({\n gl,\n size: 6 * 2 * this._maxLines,\n type: 'dynamic'\n });\n this._layout = new ___WEBPACK_IMPORTED_MODULE_5__.VertexLayout({\n gl,\n vertexBuffer: this._vertexBuffer,\n shader: this._shader,\n attributes: [\n ['a_position', 2],\n ['a_color', 4]\n ]\n });\n }\n dispose() {\n this._vertexBuffer.dispose();\n this._shader.dispose();\n this._context = null;\n this._gl = null;\n }\n draw(start, end, color) {\n // Force a render if the batch is full\n if (this._isFull()) {\n this.flush();\n }\n this._lineCount++;\n const transform = this._context.getTransform();\n const finalStart = transform.multiply(start, this._startScratch);\n const finalEnd = transform.multiply(end, this._endScratch);\n const vertexBuffer = this._vertexBuffer.bufferData;\n // Start\n vertexBuffer[this._vertexIndex++] = finalStart.x;\n vertexBuffer[this._vertexIndex++] = finalStart.y;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n // End\n vertexBuffer[this._vertexIndex++] = finalEnd.x;\n vertexBuffer[this._vertexIndex++] = finalEnd.y;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n }\n _isFull() {\n if (this._lineCount >= this._maxLines) {\n return true;\n }\n return false;\n }\n hasPendingDraws() {\n return this._lineCount !== 0;\n }\n flush() {\n // nothing to draw early exit\n if (this._lineCount === 0) {\n return;\n }\n const gl = this._gl;\n this._shader.use();\n this._layout.use(true);\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n gl.drawArrays(gl.LINES, 0, this._lineCount * 2); // 2 verts per line\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_6__.GraphicsDiagnostics.DrawnImagesCount += this._lineCount;\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_6__.GraphicsDiagnostics.DrawCallCount++;\n // reset\n this._vertexIndex = 0;\n this._lineCount = 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/material-renderer/material-renderer.ts\":\n/*!*****************************************************************!*\\\n !*** ./Graphics/Context/material-renderer/material-renderer.ts ***!\n \\*****************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MaterialRenderer: () => (/* binding */ MaterialRenderer)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n/* harmony import */ var _ImageSource__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../ImageSource */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../Wrapping */ \"./Graphics/Wrapping.ts\");\n/* harmony import */ var _quad_index_buffer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../quad-index-buffer */ \"./Graphics/Context/quad-index-buffer.ts\");\n/* harmony import */ var _vertex_buffer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _vertex_layout__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../vertex-layout */ \"./Graphics/Context/vertex-layout.ts\");\n\n\n\n\n\n\n\n\nclass MaterialRenderer {\n constructor() {\n this.type = 'ex.material';\n this.priority = 0;\n this._textures = [];\n }\n initialize(gl, context) {\n this._gl = gl;\n this._context = context;\n // Setup memory layout\n this._buffer = new _vertex_buffer__WEBPACK_IMPORTED_MODULE_0__.VertexBuffer({\n gl,\n size: 6 * 4, // 6 components * 4 verts\n type: 'dynamic'\n });\n // Setup a vertex layout/buffer to the material\n this._layout = new _vertex_layout__WEBPACK_IMPORTED_MODULE_1__.VertexLayout({\n gl,\n vertexBuffer: this._buffer,\n attributes: [\n ['a_position', 2],\n ['a_uv', 2],\n ['a_screenuv', 2]\n ],\n suppressWarnings: true\n });\n // Setup index buffer\n this._quads = new _quad_index_buffer__WEBPACK_IMPORTED_MODULE_2__.QuadIndexBuffer(gl, 1, true);\n }\n dispose() {\n this._buffer.dispose();\n this._quads.dispose();\n this._textures.length = 0;\n this._context = null;\n this._gl = null;\n }\n draw(image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight) {\n var _a, _b, _c, _d;\n const gl = this._gl;\n // Extract context info\n const material = this._context.material;\n if (!material) {\n return;\n }\n const transform = this._context.getTransform();\n const opacity = this._context.opacity;\n // material shader\n const shader = material.getShader();\n // construct geometry, or hold on to it in the material?\n // geometry primitive for drawing rectangles?\n // update data\n const vertexBuffer = this._layout.vertexBuffer.bufferData;\n let vertexIndex = 0;\n let width = (image === null || image === void 0 ? void 0 : image.width) || swidth || 0;\n let height = (image === null || image === void 0 ? void 0 : image.height) || sheight || 0;\n let view = [0, 0, (_a = swidth !== null && swidth !== void 0 ? swidth : image === null || image === void 0 ? void 0 : image.width) !== null && _a !== void 0 ? _a : 0, (_b = sheight !== null && sheight !== void 0 ? sheight : image === null || image === void 0 ? void 0 : image.height) !== null && _b !== void 0 ? _b : 0];\n let dest = [sx !== null && sx !== void 0 ? sx : 1, sy !== null && sy !== void 0 ? sy : 1];\n // If destination is specified, update view and dest\n if (dx !== undefined && dy !== undefined && dwidth !== undefined && dheight !== undefined) {\n view = [sx !== null && sx !== void 0 ? sx : 1, sy !== null && sy !== void 0 ? sy : 1, (_c = swidth !== null && swidth !== void 0 ? swidth : image === null || image === void 0 ? void 0 : image.width) !== null && _c !== void 0 ? _c : 0, (_d = sheight !== null && sheight !== void 0 ? sheight : image === null || image === void 0 ? void 0 : image.height) !== null && _d !== void 0 ? _d : 0];\n dest = [dx, dy];\n width = dwidth;\n height = dheight;\n }\n sx = view[0];\n sy = view[1];\n const sw = view[2];\n const sh = view[3];\n const topLeft = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(dest[0], dest[1]);\n const topRight = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(dest[0] + width, dest[1]);\n const bottomLeft = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(dest[0], dest[1] + height);\n const bottomRight = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(dest[0] + width, dest[1] + height);\n const imageWidth = image.width || width;\n const imageHeight = image.height || height;\n const uvx0 = sx / imageWidth;\n const uvy0 = sy / imageHeight;\n const uvx1 = (sx + sw - 0.01) / imageWidth;\n const uvy1 = (sy + sh - 0.01) / imageHeight;\n const topLeftScreen = transform.getPosition();\n const bottomRightScreen = topLeftScreen.add(bottomRight);\n const screenUVX0 = topLeftScreen.x / this._context.width;\n const screenUVY0 = topLeftScreen.y / this._context.height;\n const screenUVX1 = bottomRightScreen.x / this._context.width;\n const screenUVY1 = bottomRightScreen.y / this._context.height;\n // (0, 0) - 0\n vertexBuffer[vertexIndex++] = topLeft.x;\n vertexBuffer[vertexIndex++] = topLeft.y;\n vertexBuffer[vertexIndex++] = uvx0;\n vertexBuffer[vertexIndex++] = uvy0;\n vertexBuffer[vertexIndex++] = screenUVX0;\n vertexBuffer[vertexIndex++] = screenUVY0;\n // (0, 1) - 1\n vertexBuffer[vertexIndex++] = bottomLeft.x;\n vertexBuffer[vertexIndex++] = bottomLeft.y;\n vertexBuffer[vertexIndex++] = uvx0;\n vertexBuffer[vertexIndex++] = uvy1;\n vertexBuffer[vertexIndex++] = screenUVX0;\n vertexBuffer[vertexIndex++] = screenUVY1;\n // (1, 0) - 2\n vertexBuffer[vertexIndex++] = topRight.x;\n vertexBuffer[vertexIndex++] = topRight.y;\n vertexBuffer[vertexIndex++] = uvx1;\n vertexBuffer[vertexIndex++] = uvy0;\n vertexBuffer[vertexIndex++] = screenUVX1;\n vertexBuffer[vertexIndex++] = screenUVY0;\n // (1, 1) - 3\n vertexBuffer[vertexIndex++] = bottomRight.x;\n vertexBuffer[vertexIndex++] = bottomRight.y;\n vertexBuffer[vertexIndex++] = uvx1;\n vertexBuffer[vertexIndex++] = uvy1;\n vertexBuffer[vertexIndex++] = screenUVX1;\n vertexBuffer[vertexIndex++] = screenUVY1;\n // This creates and uploads the texture if not already done\n const texture = this._addImageAsTexture(image);\n // apply material\n material.use();\n this._layout.shader = shader;\n // apply layout and geometry\n this._layout.use(true);\n // apply time in ms since the page (performance.now())\n shader.trySetUniformFloat('u_time_ms', performance.now());\n // apply opacity\n shader.trySetUniformFloat('u_opacity', opacity);\n // apply resolution\n shader.trySetUniformFloatVector('u_resolution', (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this._context.width, this._context.height));\n // apply graphic resolution\n shader.trySetUniformFloatVector('u_graphic_resolution', (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(imageWidth, imageHeight));\n // apply size\n shader.trySetUniformFloatVector('u_size', (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(sw, sh));\n // apply orthographic projection\n shader.trySetUniformMatrix('u_matrix', this._context.ortho);\n // apply geometry transform\n shader.trySetUniformMatrix('u_transform', transform.to4x4());\n // bind graphic image texture 'uniform sampler2D u_graphic;'\n gl.activeTexture(gl.TEXTURE0 + 0);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n shader.trySetUniformInt('u_graphic', 0);\n // bind the screen texture\n gl.activeTexture(gl.TEXTURE0 + 1);\n gl.bindTexture(gl.TEXTURE_2D, this._context.materialScreenTexture);\n shader.trySetUniformInt('u_screen_texture', 1);\n // bind any additional textures in the material\n material.uploadAndBind(gl);\n // bind quad index buffer\n this._quads.bind();\n // Draw a single quad\n gl.drawElements(gl.TRIANGLES, 6, this._quads.bufferGlType, 0);\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_4__.GraphicsDiagnostics.DrawnImagesCount++;\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_4__.GraphicsDiagnostics.DrawCallCount++;\n }\n _addImageAsTexture(image) {\n const maybeFiltering = image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_5__.ImageSourceAttributeConstants.Filtering);\n const filtering = maybeFiltering ? (0,_Filtering__WEBPACK_IMPORTED_MODULE_6__.parseImageFiltering)(maybeFiltering) : undefined;\n const wrapX = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_7__.parseImageWrapping)(image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_5__.ImageSourceAttributeConstants.WrappingX));\n const wrapY = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_7__.parseImageWrapping)(image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_5__.ImageSourceAttributeConstants.WrappingY));\n const force = image.getAttribute('forceUpload') === 'true' ? true : false;\n const texture = this._context.textureLoader.load(image, {\n filtering,\n wrapping: { x: wrapX, y: wrapY }\n }, force);\n // remove force attribute after upload\n image.removeAttribute('forceUpload');\n if (this._textures.indexOf(texture) === -1) {\n this._textures.push(texture);\n }\n return texture;\n }\n hasPendingDraws() {\n return false;\n }\n flush() {\n // flush does not do anything, material renderer renders immediately per draw\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/material.ts\":\n/*!**************************************!*\\\n !*** ./Graphics/Context/material.ts ***!\n \\**************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Material: () => (/* binding */ Material)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Color */ \"./Color.ts\");\n/* harmony import */ var _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _ImageSource__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ImageSource */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Wrapping */ \"./Graphics/Wrapping.ts\");\n\n\n\n\n\n\nconst defaultVertexSource = `#version 300 es\r\nin vec2 a_position;\r\n\r\nin vec2 a_uv;\r\nout vec2 v_uv;\r\n\r\nin vec2 a_screenuv;\r\nout vec2 v_screenuv;\r\n\r\nuniform mat4 u_matrix;\r\nuniform mat4 u_transform;\r\n\r\nvoid main() {\r\n // Set the vertex position using the ortho & transform matrix\r\n gl_Position = u_matrix * u_transform * vec4(a_position, 0.0, 1.0);\r\n\r\n // Pass through the UV coord to the fragment shader\r\n v_uv = a_uv;\r\n v_screenuv = a_screenuv;\r\n}\r\n`;\nclass Material {\n constructor(options) {\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance();\n this._color = _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Transparent;\n this._initialized = false;\n this._images = new Map();\n this._textures = new Map();\n const { color, name, vertexSource, fragmentSource, graphicsContext, images } = options;\n this._name = name !== null && name !== void 0 ? name : 'anonymous material';\n this._vertexSource = vertexSource !== null && vertexSource !== void 0 ? vertexSource : defaultVertexSource;\n this._fragmentSource = fragmentSource;\n this._color = color !== null && color !== void 0 ? color : this._color;\n if (!graphicsContext) {\n throw Error(`Material ${name} must be provided an excalibur webgl graphics context`);\n }\n if (graphicsContext instanceof _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_2__.ExcaliburGraphicsContextWebGL) {\n this._graphicsContext = graphicsContext;\n this._initialize(graphicsContext);\n }\n else {\n this._logger.warn(`Material ${name} was created in 2D Canvas mode, currently only WebGL is supported`);\n }\n if (images) {\n for (const key in images) {\n this.addImageSource(key, images[key]);\n }\n }\n }\n _initialize(graphicsContextWebGL) {\n if (this._initialized) {\n return;\n }\n const gl = graphicsContextWebGL.__gl;\n // max texture slots - 2 for the graphic texture and screen texture\n this._maxTextureSlots = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS) - 2;\n this._shader = graphicsContextWebGL.createShader({\n vertexSource: this._vertexSource,\n fragmentSource: this._fragmentSource\n });\n this._shader.compile();\n this._initialized = true;\n }\n get color() {\n return this._color;\n }\n set color(c) {\n this._color = c;\n }\n get name() {\n var _a;\n return (_a = this._name) !== null && _a !== void 0 ? _a : 'anonymous material';\n }\n get isUsingScreenTexture() {\n return this._fragmentSource.includes('u_screen_texture');\n }\n update(callback) {\n if (this._shader) {\n this._shader.use();\n callback(this._shader);\n }\n }\n getShader() {\n return this._shader;\n }\n addImageSource(textureUniformName, image) {\n if (this._images.size < this._maxTextureSlots) {\n this._images.set(textureUniformName, image);\n }\n else {\n this._logger.warn(`Max number texture slots ${this._maxTextureSlots} have been reached for material \"${this.name}\", ` +\n `no more textures will be uploaded due to hardware constraints.`);\n }\n }\n removeImageSource(textureName) {\n const image = this._images.get(textureName);\n this._graphicsContext.textureLoader.delete(image.image);\n this._images.delete(textureName);\n }\n _loadImageSource(image) {\n const imageElement = image.image;\n const maybeFiltering = imageElement.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_3__.ImageSourceAttributeConstants.Filtering);\n const filtering = maybeFiltering ? (0,_Filtering__WEBPACK_IMPORTED_MODULE_4__.parseImageFiltering)(maybeFiltering) : undefined;\n const wrapX = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_5__.parseImageWrapping)(imageElement.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_3__.ImageSourceAttributeConstants.WrappingX));\n const wrapY = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_5__.parseImageWrapping)(imageElement.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_3__.ImageSourceAttributeConstants.WrappingY));\n const force = imageElement.getAttribute('forceUpload') === 'true' ? true : false;\n const texture = this._graphicsContext.textureLoader.load(imageElement, {\n filtering,\n wrapping: { x: wrapX, y: wrapY }\n }, force);\n // remove force attribute after upload\n imageElement.removeAttribute('forceUpload');\n if (!this._textures.has(image)) {\n this._textures.set(image, texture);\n }\n return texture;\n }\n uploadAndBind(gl, startingTextureSlot = 2) {\n let textureSlot = startingTextureSlot;\n for (const [textureName, image] of this._images.entries()) {\n if (!image.isLoaded()) {\n this._logger.warnOnce(`Image named ${textureName} in material ${this.name} not loaded, nothing will be uploaded to the shader.` +\n ` Did you forget to add this to a loader? https://excaliburjs.com/docs/loaders/`);\n continue;\n } // skip unloaded images, maybe warn\n const texture = this._loadImageSource(image);\n gl.activeTexture(gl.TEXTURE0 + textureSlot);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n this._shader.trySetUniformInt(textureName, textureSlot);\n textureSlot++;\n }\n }\n use() {\n if (this._initialized) {\n // bind the shader\n this._shader.use();\n // Apply standard uniforms\n this._shader.trySetUniformFloatColor('u_color', this._color);\n }\n else {\n throw Error(`Material ${this.name} not yet initialized, use the ExcaliburGraphicsContext.createMaterial() to work around this.`);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/particle-renderer/particle-renderer.ts\":\n/*!*****************************************************************!*\\\n !*** ./Graphics/Context/particle-renderer/particle-renderer.ts ***!\n \\*****************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ParticleRenderer: () => (/* binding */ ParticleRenderer)\n/* harmony export */ });\n/* harmony import */ var _shader__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _particle_vertex_glsl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./particle-vertex.glsl */ \"./Graphics/Context/particle-renderer/particle-vertex.glsl\");\n/* harmony import */ var _particle_fragment_glsl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./particle-fragment.glsl */ \"./Graphics/Context/particle-renderer/particle-fragment.glsl\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../../Color */ \"./Color.ts\");\n/* harmony import */ var _ImageSource__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../ImageSource */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Wrapping */ \"./Graphics/Wrapping.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Particles_Particles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../Particles/Particles */ \"./Particles/Particles.ts\");\n\n\n\n\n\n\n\n\n\nclass ParticleRenderer {\n constructor() {\n this.type = 'ex.particle';\n this.priority = 0;\n }\n initialize(gl, context) {\n this._gl = gl;\n this._context = context;\n this._shader = new _shader__WEBPACK_IMPORTED_MODULE_0__.Shader({\n gl,\n vertexSource: _particle_vertex_glsl__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n fragmentSource: _particle_fragment_glsl__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n onPreLink: (program) => {\n gl.transformFeedbackVaryings(program, ['finalPosition', 'finalVelocity', 'finalRotation', 'finalAngularVelocity', 'finalLifeMs'], gl.INTERLEAVED_ATTRIBS);\n }\n });\n this._shader.compile();\n this._shader.use();\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n }\n _getTexture(image) {\n const maybeFiltering = image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_3__.ImageSourceAttributeConstants.Filtering);\n const filtering = maybeFiltering ? (0,_Filtering__WEBPACK_IMPORTED_MODULE_4__.parseImageFiltering)(maybeFiltering) : undefined;\n const wrapX = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_5__.parseImageWrapping)(image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_3__.ImageSourceAttributeConstants.WrappingX));\n const wrapY = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_5__.parseImageWrapping)(image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_3__.ImageSourceAttributeConstants.WrappingY));\n const force = image.getAttribute('forceUpload') === 'true' ? true : false;\n const texture = this._context.textureLoader.load(image, {\n filtering,\n wrapping: { x: wrapX, y: wrapY }\n }, force);\n // remove force attribute after upload\n image.removeAttribute('forceUpload');\n return texture;\n }\n draw(renderer, elapsed) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j;\n const gl = this._gl;\n this._shader.use();\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n const transform = renderer.particle.transform === _Particles_Particles__WEBPACK_IMPORTED_MODULE_6__.ParticleTransform.Local\n ? this._context.getTransform()\n : this._context.getTransform().multiply(renderer.emitter.transform.get().inverse);\n this._shader.setUniformAffineMatrix('u_transform', transform);\n this._shader.setUniformBoolean('fade', renderer.particle.fade ? true : false);\n this._shader.setUniformBoolean('useTexture', renderer.particle.graphic ? true : false);\n this._shader.setUniformFloat('maxLifeMs', (_a = renderer.particle.life) !== null && _a !== void 0 ? _a : 2000);\n this._shader.setUniformFloat('deltaMs', elapsed);\n this._shader.setUniformFloatVector('gravity', (_b = renderer.particle.acc) !== null && _b !== void 0 ? _b : (0,_Math_vector__WEBPACK_IMPORTED_MODULE_7__.vec)(0, 0));\n this._shader.setUniformFloatColor('beginColor', (_c = renderer.particle.beginColor) !== null && _c !== void 0 ? _c : _Color__WEBPACK_IMPORTED_MODULE_8__.Color.Transparent);\n this._shader.setUniformFloatColor('endColor', (_d = renderer.particle.endColor) !== null && _d !== void 0 ? _d : _Color__WEBPACK_IMPORTED_MODULE_8__.Color.Transparent);\n let startSize = (_e = renderer.particle.startSize) !== null && _e !== void 0 ? _e : 0;\n let endSize = (_f = renderer.particle.endSize) !== null && _f !== void 0 ? _f : 0;\n const size = (_g = renderer.particle.size) !== null && _g !== void 0 ? _g : 0;\n if (size > 0) {\n startSize = size;\n endSize = size;\n }\n this._shader.setUniformFloat('startSize', startSize !== null && startSize !== void 0 ? startSize : 10);\n this._shader.setUniformFloat('endSize', endSize !== null && endSize !== void 0 ? endSize : 10);\n this._shader.setUniformFloat('startOpacity', (_h = renderer.particle.opacity) !== null && _h !== void 0 ? _h : 1);\n if (renderer.particle.focus) {\n this._shader.setUniformFloatVector('focus', renderer.particle.focus);\n this._shader.setUniformFloat('focusAccel', (_j = renderer.particle.focusAccel) !== null && _j !== void 0 ? _j : 0);\n }\n // Particle Graphic (only Sprites right now)\n if (renderer.particle.graphic) {\n const graphic = renderer.particle.graphic;\n const texture = this._getTexture(graphic.image.image);\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n this._shader.setUniformInt('graphic', 0);\n }\n // Collision Mask\n // gl.activeTexture(gl.TEXTURE0 + 1);\n // gl.bindTexture(gl.TEXTURE_2D, obstacleTex);\n // gl.uniform1i(u_obstacle, 1);\n renderer.draw(gl);\n }\n hasPendingDraws() {\n return false;\n }\n flush() {\n // pass\n }\n dispose() {\n // pass\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/point-renderer/point-renderer.ts\":\n/*!***********************************************************!*\\\n !*** ./Graphics/Context/point-renderer/point-renderer.ts ***!\n \\***********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointRenderer: () => (/* binding */ PointRenderer)\n/* harmony export */ });\n/* harmony import */ var _point_vertex_glsl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./point-vertex.glsl */ \"./Graphics/Context/point-renderer/point-vertex.glsl\");\n/* harmony import */ var _point_fragment_glsl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./point-fragment.glsl */ \"./Graphics/Context/point-renderer/point-fragment.glsl\");\n/* harmony import */ var _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _shader__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _vertex_buffer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _vertex_layout__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../vertex-layout */ \"./Graphics/Context/vertex-layout.ts\");\n/* harmony import */ var _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n\n\n\n\n\n\n\nclass PointRenderer {\n constructor() {\n this.type = 'ex.point';\n this.priority = 0;\n this._maxPoints = 10922;\n this._pointCount = 0;\n this._vertexIndex = 0;\n }\n initialize(gl, context) {\n this._gl = gl;\n this._context = context;\n this._shader = new _shader__WEBPACK_IMPORTED_MODULE_0__.Shader({\n gl,\n vertexSource: _point_vertex_glsl__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n fragmentSource: _point_fragment_glsl__WEBPACK_IMPORTED_MODULE_2__[\"default\"]\n });\n this._shader.compile();\n this._shader.use();\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n this._buffer = new _vertex_buffer__WEBPACK_IMPORTED_MODULE_3__.VertexBuffer({\n gl,\n size: 7 * this._maxPoints,\n type: 'dynamic'\n });\n this._layout = new _vertex_layout__WEBPACK_IMPORTED_MODULE_4__.VertexLayout({\n gl,\n shader: this._shader,\n vertexBuffer: this._buffer,\n attributes: [\n ['a_position', 2],\n ['a_color', 4],\n ['a_size', 1]\n ]\n });\n }\n dispose() {\n this._buffer.dispose();\n this._shader.dispose();\n this._context = null;\n this._gl = null;\n }\n draw(point, color, size) {\n // Force a render if the batch is full\n if (this._isFull()) {\n this.flush();\n }\n this._pointCount++;\n const transform = this._context.getTransform();\n const opacity = this._context.opacity;\n const snapToPixel = this._context.snapToPixel;\n const finalPoint = transform.multiply(point);\n if (snapToPixel) {\n finalPoint.x = ~~(finalPoint.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_5__.pixelSnapEpsilon);\n finalPoint.y = ~~(finalPoint.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_5__.pixelSnapEpsilon);\n }\n const vertexBuffer = this._buffer.bufferData;\n vertexBuffer[this._vertexIndex++] = finalPoint.x;\n vertexBuffer[this._vertexIndex++] = finalPoint.y;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a * opacity;\n vertexBuffer[this._vertexIndex++] = size * Math.max(transform.getScaleX(), transform.getScaleY());\n }\n _isFull() {\n if (this._pointCount >= this._maxPoints) {\n return true;\n }\n return false;\n }\n hasPendingDraws() {\n return this._pointCount !== 0;\n }\n flush() {\n // nothing to draw early exit\n if (this._pointCount === 0) {\n return;\n }\n const gl = this._gl;\n this._shader.use();\n this._layout.use(true);\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n gl.drawArrays(gl.POINTS, 0, this._pointCount);\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_6__.GraphicsDiagnostics.DrawnImagesCount += this._pointCount;\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_6__.GraphicsDiagnostics.DrawCallCount++;\n this._pointCount = 0;\n this._vertexIndex = 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/quad-index-buffer.ts\":\n/*!***********************************************!*\\\n !*** ./Graphics/Context/quad-index-buffer.ts ***!\n \\***********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ QuadIndexBuffer: () => (/* binding */ QuadIndexBuffer)\n/* harmony export */ });\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../.. */ \"./Util/Log.ts\");\n\n/**\n * Helper that defines and index buffer for quad geometry\n *\n * Index buffers allow you to save space in vertex buffers when you share vertices in geometry\n * it is almost always worth it in terms of performance to use an index buffer.\n */\nclass QuadIndexBuffer {\n /**\n * @param gl WebGL2RenderingContext this layout will be attached to, these cannot be reused across contexts.\n * @param numberOfQuads Specify the max number of quads you want to draw\n * @param useUint16 Optionally force a uint16 buffer\n */\n constructor(gl, numberOfQuads, useUint16) {\n this._logger = ___WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance();\n this._gl = gl;\n this.buffer = gl.createBuffer();\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.buffer);\n const totalVertices = numberOfQuads * 6;\n if (!useUint16) {\n this.bufferData = new Uint32Array(totalVertices);\n }\n else {\n // fall back to using gl.UNSIGNED_SHORT or tell the user they are out of luck\n const maxUint16 = 65535;\n const maxUint16Index = Math.floor((maxUint16 - 1) / 4); // max quads\n this.bufferGlType = gl.UNSIGNED_SHORT;\n this.bufferData = new Uint16Array(totalVertices);\n // TODO Should we error if this happens?? maybe not might crash mid game\n if (numberOfQuads > maxUint16Index) {\n this._logger.warn(`Total quads exceeds hardware index buffer limit (uint16), max(${maxUint16Index}) requested quads(${numberOfQuads})`);\n }\n }\n let currentQuad = 0;\n for (let i = 0; i < totalVertices; i += 6) {\n // first triangle\n this.bufferData[i + 0] = currentQuad + 0;\n this.bufferData[i + 1] = currentQuad + 1;\n this.bufferData[i + 2] = currentQuad + 2;\n // second triangle\n this.bufferData[i + 3] = currentQuad + 2;\n this.bufferData[i + 4] = currentQuad + 1;\n this.bufferData[i + 5] = currentQuad + 3;\n currentQuad += 4;\n }\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.bufferData, gl.STATIC_DRAW);\n }\n get size() {\n return this.bufferData.length;\n }\n /**\n * Upload data to the GPU\n */\n upload() {\n const gl = this._gl;\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.buffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.bufferData, gl.STATIC_DRAW);\n }\n /**\n * Bind this index buffer\n */\n bind() {\n const gl = this._gl;\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.buffer);\n }\n dispose() {\n const gl = this._gl;\n gl.deleteBuffer(this.buffer);\n this._gl = null;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/rectangle-renderer/rectangle-renderer.ts\":\n/*!*******************************************************************!*\\\n !*** ./Graphics/Context/rectangle-renderer/rectangle-renderer.ts ***!\n \\*******************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RectangleRenderer: () => (/* binding */ RectangleRenderer)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Color */ \"./Color.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n/* harmony import */ var _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _quad_index_buffer__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../quad-index-buffer */ \"./Graphics/Context/quad-index-buffer.ts\");\n/* harmony import */ var _shader__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _vertex_buffer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _vertex_layout__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../vertex-layout */ \"./Graphics/Context/vertex-layout.ts\");\n/* harmony import */ var _rectangle_renderer_frag_glsl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./rectangle-renderer.frag.glsl */ \"./Graphics/Context/rectangle-renderer/rectangle-renderer.frag.glsl\");\n/* harmony import */ var _rectangle_renderer_vert_glsl__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./rectangle-renderer.vert.glsl */ \"./Graphics/Context/rectangle-renderer/rectangle-renderer.vert.glsl\");\n\n\n\n\n\n\n\n\n\n\nclass RectangleRenderer {\n constructor() {\n this.type = 'ex.rectangle';\n this.priority = 0;\n this._maxRectangles = 10922; // max(uint16) / 6 verts\n this._rectangleCount = 0;\n this._vertexIndex = 0;\n this._transparent = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Transparent;\n this._scratch1 = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0);\n this._scratch2 = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0);\n this._scratch3 = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0);\n this._scratch4 = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0);\n }\n initialize(gl, context) {\n this._gl = gl;\n this._context = context;\n // https://stackoverflow.com/questions/59197671/glsl-rounded-rectangle-with-variable-border\n this._shader = new _shader__WEBPACK_IMPORTED_MODULE_2__.Shader({\n gl,\n fragmentSource: _rectangle_renderer_frag_glsl__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n vertexSource: _rectangle_renderer_vert_glsl__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n });\n this._shader.compile();\n // setup uniforms\n this._shader.use();\n this._shader.setUniformMatrix('u_matrix', context.ortho);\n this._buffer = new _vertex_buffer__WEBPACK_IMPORTED_MODULE_5__.VertexBuffer({\n gl,\n size: 16 * 4 * this._maxRectangles,\n type: 'dynamic'\n });\n this._layout = new _vertex_layout__WEBPACK_IMPORTED_MODULE_6__.VertexLayout({\n gl,\n shader: this._shader,\n vertexBuffer: this._buffer,\n attributes: [\n ['a_position', 2],\n ['a_uv', 2],\n ['a_size', 2],\n ['a_opacity', 1],\n ['a_color', 4],\n ['a_strokeColor', 4],\n ['a_strokeThickness', 1]\n ]\n });\n this._quads = new _quad_index_buffer__WEBPACK_IMPORTED_MODULE_7__.QuadIndexBuffer(gl, this._maxRectangles, true);\n }\n dispose() {\n this._buffer.dispose();\n this._quads.dispose();\n this._shader.dispose();\n this._context = null;\n this._gl = null;\n }\n _isFull() {\n if (this._rectangleCount >= this._maxRectangles) {\n return true;\n }\n return false;\n }\n draw(...args) {\n if (args[0] instanceof _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector && args[1] instanceof _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector) {\n this.drawLine.apply(this, args);\n }\n else {\n this.drawRectangle.apply(this, args);\n }\n }\n drawLine(start, end, color, thickness = 1) {\n if (this._isFull()) {\n this.flush();\n }\n this._rectangleCount++;\n // transform based on current context\n const transform = this._context.getTransform();\n const opacity = this._context.opacity;\n const snapToPixel = this._context.snapToPixel;\n const dir = end.sub(start);\n const length = dir.magnitude;\n const normal = dir.normalize().perpendicular();\n const halfThick = thickness / 2;\n /**\n * +---------------------^----------------------+\n * | | (normal) |\n * (startX, startY)------------------>(endX, endY)\n * | |\n * + -------------------------------------------+\n */\n const startTop = transform.multiply(normal.scale(halfThick, this._scratch1).add(start, this._scratch1), this._scratch1);\n const startBottom = transform.multiply(normal.scale(-halfThick, this._scratch2).add(start, this._scratch2), this._scratch2);\n const endTop = transform.multiply(normal.scale(halfThick, this._scratch3).add(end, this._scratch3), this._scratch3);\n const endBottom = transform.multiply(normal.scale(-halfThick, this._scratch4).add(end, this._scratch4), this._scratch4);\n if (snapToPixel) {\n startTop.x = ~~(startTop.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n startTop.y = ~~(startTop.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n endTop.x = ~~(endTop.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n endTop.y = ~~(endTop.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n startBottom.x = ~~(startBottom.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n startBottom.y = ~~(startBottom.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n endBottom.x = ~~(endBottom.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n endBottom.y = ~~(endBottom.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n }\n // TODO uv could be static vertex buffer\n const uvx0 = 0;\n const uvy0 = 0;\n const uvx1 = 1;\n const uvy1 = 1;\n const stroke = this._transparent;\n const strokeThickness = 0;\n const width = 1;\n // update data\n const vertexBuffer = this._layout.vertexBuffer.bufferData;\n // (0, 0) - 0\n vertexBuffer[this._vertexIndex++] = startTop.x;\n vertexBuffer[this._vertexIndex++] = startTop.y;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = length;\n vertexBuffer[this._vertexIndex++] = thickness;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness / width;\n // (0, 1) - 1\n vertexBuffer[this._vertexIndex++] = startBottom.x;\n vertexBuffer[this._vertexIndex++] = startBottom.y;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = length;\n vertexBuffer[this._vertexIndex++] = thickness;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness / width;\n // (1, 0) - 2\n vertexBuffer[this._vertexIndex++] = endTop.x;\n vertexBuffer[this._vertexIndex++] = endTop.y;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = length;\n vertexBuffer[this._vertexIndex++] = thickness;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness / width;\n // (1, 1) - 3\n vertexBuffer[this._vertexIndex++] = endBottom.x;\n vertexBuffer[this._vertexIndex++] = endBottom.y;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = length;\n vertexBuffer[this._vertexIndex++] = thickness;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness / width;\n }\n drawRectangle(pos, width, height, color, stroke = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Transparent, strokeThickness = 0) {\n if (this._isFull()) {\n this.flush();\n }\n this._rectangleCount++;\n // transform based on current context\n const transform = this._context.getTransform();\n const opacity = this._context.opacity;\n const snapToPixel = this._context.snapToPixel;\n const topLeft = transform.multiply(pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0)));\n const topRight = transform.multiply(pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(width, 0)));\n const bottomRight = transform.multiply(pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(width, height)));\n const bottomLeft = transform.multiply(pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, height)));\n if (snapToPixel) {\n topLeft.x = ~~(topLeft.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n topLeft.y = ~~(topLeft.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n topRight.x = ~~(topRight.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n topRight.y = ~~(topRight.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n bottomLeft.x = ~~(bottomLeft.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n bottomLeft.y = ~~(bottomLeft.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n bottomRight.x = ~~(bottomRight.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n bottomRight.y = ~~(bottomRight.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n }\n // TODO uv could be static vertex buffer\n const uvx0 = 0;\n const uvy0 = 0;\n const uvx1 = 1;\n const uvy1 = 1;\n // update data\n const vertexBuffer = this._layout.vertexBuffer.bufferData;\n // (0, 0) - 0\n vertexBuffer[this._vertexIndex++] = topLeft.x;\n vertexBuffer[this._vertexIndex++] = topLeft.y;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = width;\n vertexBuffer[this._vertexIndex++] = height;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness;\n // (0, 1) - 1\n vertexBuffer[this._vertexIndex++] = bottomLeft.x;\n vertexBuffer[this._vertexIndex++] = bottomLeft.y;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = width;\n vertexBuffer[this._vertexIndex++] = height;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness;\n // (1, 0) - 2\n vertexBuffer[this._vertexIndex++] = topRight.x;\n vertexBuffer[this._vertexIndex++] = topRight.y;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = width;\n vertexBuffer[this._vertexIndex++] = height;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness;\n // (1, 1) - 3\n vertexBuffer[this._vertexIndex++] = bottomRight.x;\n vertexBuffer[this._vertexIndex++] = bottomRight.y;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = width;\n vertexBuffer[this._vertexIndex++] = height;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness;\n }\n hasPendingDraws() {\n return this._rectangleCount !== 0;\n }\n flush() {\n // nothing to draw early exit\n if (this._rectangleCount === 0) {\n return;\n }\n const gl = this._gl;\n // Bind the shader\n this._shader.use();\n // Bind the memory layout and upload data\n this._layout.use(true);\n // Update ortho matrix uniform\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n // Bind index buffer\n this._quads.bind();\n // Draw all the quads\n gl.drawElements(gl.TRIANGLES, this._rectangleCount * 6, this._quads.bufferGlType, 0);\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_9__.GraphicsDiagnostics.DrawnImagesCount += this._rectangleCount;\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_9__.GraphicsDiagnostics.DrawCallCount++;\n // Reset\n this._rectangleCount = 0;\n this._vertexIndex = 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/render-source.ts\":\n/*!*******************************************!*\\\n !*** ./Graphics/Context/render-source.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RenderSource: () => (/* binding */ RenderSource)\n/* harmony export */ });\nclass RenderSource {\n constructor(_gl, _texture) {\n this._gl = _gl;\n this._texture = _texture;\n }\n use() {\n const gl = this._gl;\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, this._texture);\n }\n disable() {\n const gl = this._gl;\n gl.bindTexture(gl.TEXTURE_2D, null);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/render-target.ts\":\n/*!*******************************************!*\\\n !*** ./Graphics/Context/render-target.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RenderTarget: () => (/* binding */ RenderTarget)\n/* harmony export */ });\n/* harmony import */ var _render_source__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./render-source */ \"./Graphics/Context/render-source.ts\");\n\nclass RenderTarget {\n constructor(options) {\n var _a, _b;\n this.antialias = false;\n this.samples = 1;\n this._gl = options.gl;\n this.width = options.width;\n this.height = options.height;\n this.transparency = options.transparency;\n this.antialias = (_a = options.antialias) !== null && _a !== void 0 ? _a : this.antialias;\n this.samples = (_b = options.samples) !== null && _b !== void 0 ? _b : this._gl.getParameter(this._gl.MAX_SAMPLES);\n const gl = this._gl;\n // Determine current context format for blitting later needs to match\n if (gl.drawingBufferFormat) {\n this.bufferFormat = gl.drawingBufferFormat;\n }\n else {\n // Documented in webgl spec\n // https://registry.khronos.org/webgl/specs/latest/1.0/\n if (this.transparency) {\n this.bufferFormat = gl.RGBA8;\n }\n else {\n this.bufferFormat = gl.RGB8;\n }\n }\n this._setupRenderBuffer();\n this._setupFramebuffer();\n }\n setResolution(width, height) {\n const gl = this._gl;\n this.width = width;\n this.height = height;\n // update backing texture size\n gl.bindTexture(gl.TEXTURE_2D, this._frameTexture);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n // update render buffer size\n if (this._renderBuffer) {\n gl.bindRenderbuffer(gl.RENDERBUFFER, this._renderBuffer);\n gl.renderbufferStorageMultisample(gl.RENDERBUFFER, Math.min(this.samples, gl.getParameter(gl.MAX_SAMPLES)), this.bufferFormat, this.width, this.height);\n }\n }\n get renderBuffer() {\n return this._renderBuffer;\n }\n get renderFrameBuffer() {\n return this._renderFrameBuffer;\n }\n get frameBuffer() {\n return this._frameBuffer;\n }\n get frameTexture() {\n return this._frameTexture;\n }\n _setupRenderBuffer() {\n if (this.antialias) {\n const gl = this._gl;\n // Render buffers can be used as an input to a shader\n this._renderBuffer = gl.createRenderbuffer();\n this._renderFrameBuffer = gl.createFramebuffer();\n gl.bindRenderbuffer(gl.RENDERBUFFER, this._renderBuffer);\n gl.renderbufferStorageMultisample(gl.RENDERBUFFER, Math.min(this.samples, gl.getParameter(gl.MAX_SAMPLES)), this.bufferFormat, this.width, this.height);\n gl.bindFramebuffer(gl.FRAMEBUFFER, this._renderFrameBuffer);\n gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, this._renderBuffer);\n }\n }\n _setupFramebuffer() {\n // Allocates frame buffer\n const gl = this._gl;\n this._frameTexture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, this._frameTexture);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n // set the filtering so we don't need mips\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n // attach the texture as the first color attachment\n const attachmentPoint = gl.COLOR_ATTACHMENT0;\n // After this bind all draw calls will draw to this framebuffer texture\n this._frameBuffer = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, this._frameBuffer);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, attachmentPoint, gl.TEXTURE_2D, this._frameTexture, 0);\n // Reset after initialized\n this.disable();\n }\n toRenderSource() {\n if (this.renderBuffer) {\n this.blitRenderBufferToFrameBuffer();\n }\n const source = new _render_source__WEBPACK_IMPORTED_MODULE_0__.RenderSource(this._gl, this._frameTexture);\n return source;\n }\n blitToScreen() {\n const gl = this._gl;\n // set to size of canvas's drawingBuffer\n if (this._renderBuffer) {\n gl.bindFramebuffer(gl.READ_FRAMEBUFFER, this.renderFrameBuffer);\n gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, null);\n gl.clearBufferfv(gl.COLOR, 0, [0.0, 0.0, 1.0, 1.0]);\n gl.blitFramebuffer(0, 0, this.width, this.height, 0, 0, this.width, this.height, gl.COLOR_BUFFER_BIT, gl.LINEAR);\n }\n else {\n gl.bindFramebuffer(gl.READ_FRAMEBUFFER, this.frameBuffer);\n gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, null);\n gl.clearBufferfv(gl.COLOR, 0, [0.0, 0.0, 1.0, 1.0]);\n gl.blitFramebuffer(0, 0, this.width, this.height, 0, 0, this.width, this.height, gl.COLOR_BUFFER_BIT, gl.LINEAR);\n }\n }\n blitRenderBufferToFrameBuffer() {\n if (this._renderBuffer) {\n const gl = this._gl;\n gl.bindFramebuffer(gl.READ_FRAMEBUFFER, this.renderFrameBuffer);\n gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, this.frameBuffer);\n gl.clearBufferfv(gl.COLOR, 0, [0.0, 0.0, 1.0, 1.0]);\n gl.blitFramebuffer(0, 0, this.width, this.height, 0, 0, this.width, this.height, gl.COLOR_BUFFER_BIT, gl.LINEAR);\n }\n }\n copyToTexture(texture) {\n const gl = this._gl;\n if (this._renderBuffer) {\n this.blitRenderBufferToFrameBuffer();\n }\n gl.bindFramebuffer(gl.FRAMEBUFFER, this._frameBuffer);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.copyTexImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 0, 0, this.width, this.height, 0);\n }\n /**\n * When called, all drawing gets redirected to this render target\n */\n use() {\n const gl = this._gl;\n if (this.antialias) {\n gl.bindFramebuffer(gl.FRAMEBUFFER, this._renderFrameBuffer);\n }\n else {\n gl.bindFramebuffer(gl.FRAMEBUFFER, this._frameBuffer);\n }\n // very important to set the viewport to the size of the framebuffer texture\n gl.viewport(0, 0, this.width, this.height);\n }\n /**\n * When called, all drawing is sent back to the canvas\n */\n disable() {\n const gl = this._gl;\n // passing null switches rendering back to the canvas\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.bindTexture(gl.TEXTURE_2D, null);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/screen-pass-painter/screen-pass-painter.ts\":\n/*!*********************************************************************!*\\\n !*** ./Graphics/Context/screen-pass-painter/screen-pass-painter.ts ***!\n \\*********************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ScreenPassPainter: () => (/* binding */ ScreenPassPainter)\n/* harmony export */ });\n/* harmony import */ var _screen_vertex_glsl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./screen-vertex.glsl */ \"./Graphics/Context/screen-pass-painter/screen-vertex.glsl\");\n/* harmony import */ var _screen_fragment_glsl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./screen-fragment.glsl */ \"./Graphics/Context/screen-pass-painter/screen-fragment.glsl\");\n/* harmony import */ var _shader__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _vertex_buffer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _vertex_layout__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../vertex-layout */ \"./Graphics/Context/vertex-layout.ts\");\n\n\n\n\n\n/**\n * This is responsible for painting the entire screen during the render passes\n */\nclass ScreenPassPainter {\n constructor(gl) {\n this._gl = gl;\n this._shader = new _shader__WEBPACK_IMPORTED_MODULE_0__.Shader({\n gl,\n vertexSource: _screen_vertex_glsl__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n fragmentSource: _screen_fragment_glsl__WEBPACK_IMPORTED_MODULE_2__[\"default\"]\n });\n this._shader.compile();\n // Setup memory layout\n this._buffer = new _vertex_buffer__WEBPACK_IMPORTED_MODULE_3__.VertexBuffer({\n gl,\n type: 'static',\n // clip space quad + uv since we don't need a camera\n data: new Float32Array([\n -1, -1, 0, 0, -1, 1, 0, 1, 1, -1, 1, 0,\n 1, -1, 1, 0, -1, 1, 0, 1, 1, 1, 1, 1\n ])\n });\n this._layout = new _vertex_layout__WEBPACK_IMPORTED_MODULE_4__.VertexLayout({\n gl,\n shader: this._shader,\n vertexBuffer: this._buffer,\n attributes: [\n ['a_position', 2],\n ['a_texcoord', 2]\n ]\n });\n this._buffer.upload();\n }\n renderWithPostProcessor(postprocessor) {\n const gl = this._gl;\n postprocessor.getShader().use();\n postprocessor.getLayout().use();\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n }\n renderToScreen() {\n const gl = this._gl;\n this._shader.use();\n this._layout.use();\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/shader.ts\":\n/*!************************************!*\\\n !*** ./Graphics/Context/shader.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Shader: () => (/* binding */ Shader)\n/* harmony export */ });\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../.. */ \"./Util/Log.ts\");\n/* harmony import */ var _webgl_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./webgl-util */ \"./Graphics/Context/webgl-util.ts\");\n\n\nclass Shader {\n get compiled() {\n return this._compiled;\n }\n /**\n * Create a shader program in excalibur\n * @param options specify shader vertex and fragment source\n */\n constructor(options) {\n this._logger = ___WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance();\n this.uniforms = {};\n this.attributes = {};\n this._compiled = false;\n const { gl, vertexSource, fragmentSource, onPreLink, onPostCompile } = options;\n this._gl = gl;\n this.vertexSource = vertexSource;\n this.fragmentSource = fragmentSource;\n this._onPreLink = onPreLink;\n this._onPostCompile = onPostCompile;\n }\n dispose() {\n const gl = this._gl;\n gl.deleteProgram(this.program);\n this._gl = null;\n }\n /**\n * Binds the shader program\n */\n use() {\n const gl = this._gl;\n gl.useProgram(this.program);\n Shader._ACTIVE_SHADER_INSTANCE = this;\n }\n isCurrentlyBound() {\n return Shader._ACTIVE_SHADER_INSTANCE === this;\n }\n /**\n * Compile the current shader against a webgl context\n */\n compile() {\n const gl = this._gl;\n const vertexShader = this._compileShader(gl, this.vertexSource, gl.VERTEX_SHADER);\n const fragmentShader = this._compileShader(gl, this.fragmentSource, gl.FRAGMENT_SHADER);\n this.program = this._createProgram(gl, vertexShader, fragmentShader);\n const attributes = this.getAttributes();\n for (const attribute of attributes) {\n this.attributes[attribute.name] = attribute;\n }\n const uniforms = this.getUniforms();\n for (const uniform of uniforms) {\n this.uniforms[uniform.name] = uniform;\n }\n this._compiled = true;\n if (this._onPostCompile) {\n this._onPostCompile(this);\n }\n return this.program;\n }\n getUniforms() {\n const gl = this._gl;\n const uniformCount = gl.getProgramParameter(this.program, gl.ACTIVE_UNIFORMS);\n const uniforms = [];\n for (let i = 0; i < uniformCount; i++) {\n const uniform = gl.getActiveUniform(this.program, i);\n const uniformLocation = gl.getUniformLocation(this.program, uniform.name);\n uniforms.push({\n name: uniform.name,\n glType: uniform.type,\n location: uniformLocation\n });\n }\n return uniforms;\n }\n getAttributes() {\n const gl = this._gl;\n const attributeCount = gl.getProgramParameter(this.program, gl.ACTIVE_ATTRIBUTES);\n const attributes = [];\n for (let i = 0; i < attributeCount; i++) {\n const attribute = gl.getActiveAttrib(this.program, i);\n const attributeLocation = gl.getAttribLocation(this.program, attribute.name);\n attributes.push({\n name: attribute.name,\n glType: (0,_webgl_util__WEBPACK_IMPORTED_MODULE_1__.getAttributePointerType)(gl, attribute.type),\n size: (0,_webgl_util__WEBPACK_IMPORTED_MODULE_1__.getAttributeComponentSize)(gl, attribute.type),\n location: attributeLocation,\n normalized: false\n });\n }\n return attributes;\n }\n /**\n * Set a texture in a gpu texture slot\n * @param slotNumber\n * @param texture\n */\n setTexture(slotNumber, texture) {\n const gl = this._gl;\n gl.activeTexture(gl.TEXTURE0 + slotNumber);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n }\n /**\n * Set an integer uniform for the current shader\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n setUniformInt(name, value) {\n this.setUniform('uniform1i', name, ~~value);\n }\n /**\n * Set an integer uniform for the current shader, WILL NOT THROW on error.\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n trySetUniformInt(name, value) {\n return this.trySetUniform('uniform1i', name, ~~value);\n }\n /**\n * Set an integer array uniform for the current shader\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n setUniformIntArray(name, value) {\n this.setUniform('uniform1iv', name, value);\n }\n /**\n * Set an integer array uniform for the current shader, WILL NOT THROW on error.\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n trySetUniformIntArray(name, value) {\n return this.trySetUniform('uniform1iv', name, value);\n }\n /**\n * Set a boolean uniform for the current shader\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n setUniformBoolean(name, value) {\n this.setUniform('uniform1i', name, value ? 1 : 0);\n }\n /**\n * Set a boolean uniform for the current shader, WILL NOT THROW on error.\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n trySetUniformBoolean(name, value) {\n return this.trySetUniform('uniform1i', name, value ? 1 : 0);\n }\n /**\n * Set a float uniform for the current shader\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n setUniformFloat(name, value) {\n this.setUniform('uniform1f', name, value);\n }\n /**\n * Set a float uniform for the current shader, WILL NOT THROW on error.\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n trySetUniformFloat(name, value) {\n return this.trySetUniform('uniform1f', name, value);\n }\n /**\n * Set a float array uniform for the current shader\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n setUniformFloatArray(name, value) {\n this.setUniform('uniform1fv', name, value);\n }\n /**\n * Set a float array uniform for the current shader, WILL NOT THROW on error.\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n trySetUniformFloatArray(name, value) {\n return this.trySetUniform('uniform1fv', name, value);\n }\n /**\n * Set a {@apilink Vector} uniform for the current shader\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n setUniformFloatVector(name, value) {\n this.setUniform('uniform2f', name, value.x, value.y);\n }\n /**\n * Set a {@apilink Vector} uniform for the current shader, WILL NOT THROW on error.\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n trySetUniformFloatVector(name, value) {\n return this.trySetUniform('uniform2f', name, value.x, value.y);\n }\n /**\n * Set a {@apilink Color} uniform for the current shader\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n setUniformFloatColor(name, value) {\n this.setUniform('uniform4f', name, value.r / 255, value.g / 255, value.b / 255, value.a);\n }\n /**\n * Set a {@apilink Color} uniform for the current shader, WILL NOT THROW on error.\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n trySetUniformFloatColor(name, value) {\n return this.trySetUniform('uniform4f', name, value.r / 255, value.g / 255, value.b / 255, value.a);\n }\n /**\n * Set an {@apilink Matrix} uniform for the current shader\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n setUniformMatrix(name, value) {\n this.setUniform('uniformMatrix4fv', name, false, value.data);\n }\n setUniformAffineMatrix(name, value) {\n this.setUniform('uniformMatrix4fv', name, false, [\n value.data[0],\n value.data[1],\n 0,\n 0,\n value.data[2],\n value.data[3],\n 0,\n 0,\n 0,\n 0,\n 1,\n 0,\n value.data[4],\n value.data[5],\n 0,\n 1\n ]);\n }\n /**\n * Set an {@apilink Matrix} uniform for the current shader, WILL NOT THROW on error.\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n trySetUniformMatrix(name, value) {\n return this.trySetUniform('uniformMatrix4fv', name, false, value.data);\n }\n /**\n * Set any available uniform type in webgl\n *\n * For example setUniform('uniformMatrix2fv', 'u_my2x2_mat`, ...);\n */\n setUniform(uniformType, name, ...value) {\n if (!this._compiled) {\n throw Error(`Must compile shader before setting a uniform ${uniformType}:${name}`);\n }\n if (!this.isCurrentlyBound()) {\n throw Error('Currently accessed shader instance is not the current active shader in WebGL,' +\n ' must call `shader.use()` before setting uniforms');\n }\n const gl = this._gl;\n const location = gl.getUniformLocation(this.program, name);\n if (location) {\n const args = [location, ...value];\n this._gl[uniformType].apply(this._gl, args);\n }\n else {\n throw Error(`Uniform ${uniformType}:${name} doesn\\'t exist or is not used in the shader source code,` +\n ' unused uniforms are optimized away by most browsers');\n }\n }\n /**\n * Set any available uniform type in webgl. Will try to set the uniform, will return false if the uniform didn't exist,\n * true if it was set.\n *\n * WILL NOT THROW on error\n *\n * For example setUniform('uniformMatrix2fv', 'u_my2x2_mat`, ...);\n *\n */\n trySetUniform(uniformType, name, ...value) {\n if (!this._compiled) {\n this._logger.warn(`Must compile shader before setting a uniform ${uniformType}:${name}`);\n return false;\n }\n if (!this.isCurrentlyBound()) {\n this._logger.warn('Currently accessed shader instance is not the current active shader in WebGL,' +\n ' must call `shader.use()` before setting uniforms');\n return false;\n }\n const gl = this._gl;\n const location = gl.getUniformLocation(this.program, name);\n if (location) {\n const args = [location, ...value];\n this._gl[uniformType].apply(this._gl, args);\n }\n else {\n return false;\n }\n return true;\n }\n _createProgram(gl, vertexShader, fragmentShader) {\n const program = gl.createProgram();\n if (program === null) {\n throw Error('Could not create graphics shader program');\n }\n // attach the shaders.\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n if (this._onPreLink) {\n this._onPreLink(program);\n }\n // link the program.\n gl.linkProgram(program);\n const success = gl.getProgramParameter(program, gl.LINK_STATUS);\n if (!success) {\n throw Error(`Could not link the program: [${gl.getProgramInfoLog(program)}]`);\n }\n return program;\n }\n _compileShader(gl, source, type) {\n const typeName = gl.VERTEX_SHADER === type ? 'vertex' : 'fragment';\n const shader = gl.createShader(type);\n if (shader === null) {\n throw Error(`Could not build shader: [${source}]`);\n }\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n const success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n if (!success) {\n const errorInfo = gl.getShaderInfoLog(shader);\n throw Error(`Could not compile ${typeName} shader:\\n\\n${errorInfo}${this._processSourceForError(source, errorInfo)}`);\n }\n return shader;\n }\n _processSourceForError(source, errorInfo) {\n if (!source) {\n return errorInfo;\n }\n const lines = source.split('\\n');\n const errorLineStart = errorInfo.search(/\\d:\\d/);\n const errorLineEnd = errorInfo.indexOf(' ', errorLineStart);\n const [_, error2] = errorInfo\n .slice(errorLineStart, errorLineEnd)\n .split(':')\n .map((v) => Number(v));\n for (let i = 0; i < lines.length; i++) {\n lines[i] = `${i + 1}: ${lines[i]}${error2 === i + 1 ? ' <----- ERROR!' : ''}`;\n }\n return '\\n\\nSource:\\n' + lines.join('\\n');\n }\n}\nShader._ACTIVE_SHADER_INSTANCE = null;\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/state-stack.ts\":\n/*!*****************************************!*\\\n !*** ./Graphics/Context/state-stack.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ContextState: () => (/* binding */ ContextState),\n/* harmony export */ StateStack: () => (/* binding */ StateStack)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Color */ \"./Color.ts\");\n/* harmony import */ var _Util_RentalPool__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Util/RentalPool */ \"./Util/RentalPool.ts\");\n\n\nclass ContextState {\n constructor() {\n this.opacity = 1;\n this.z = 0;\n this.tint = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.White;\n this.material = null;\n }\n}\nclass StateStack {\n constructor() {\n this._pool = new _Util_RentalPool__WEBPACK_IMPORTED_MODULE_1__.RentalPool(() => new ContextState(), (s) => {\n s.opacity = 1;\n s.z = 0;\n s.tint = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.White;\n s.material = null;\n return s;\n }, 100);\n this.current = this._pool.rent(true);\n this._states = [];\n }\n _cloneState(dest) {\n var _a;\n dest.opacity = this.current.opacity;\n dest.z = this.current.z;\n dest.tint = (_a = this.current.tint) === null || _a === void 0 ? void 0 : _a.clone();\n dest.material = this.current.material; // TODO is this going to cause problems when cloning\n return dest;\n }\n save() {\n this._states.push(this.current);\n this.current = this._cloneState(this._pool.rent());\n }\n restore() {\n this._pool.return(this.current);\n this.current = this._states.pop();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/texture-loader.ts\":\n/*!********************************************!*\\\n !*** ./Graphics/Context/texture-loader.ts ***!\n \\********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TextureLoader: () => (/* binding */ TextureLoader)\n/* harmony export */ });\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Wrapping */ \"./Graphics/Wrapping.ts\");\n\n\n\n/**\n * Manages loading image sources into webgl textures, a unique id is associated with all sources\n */\nclass TextureLoader {\n constructor(gl, _garbageCollector) {\n var _a;\n this._garbageCollector = _garbageCollector;\n this._textureMap = new Map();\n /**\n * Looks for textures that haven't been drawn in a while\n */\n this._collect = (image) => {\n var _a;\n if (this._gl) {\n const name = (_a = image.dataset.originalSrc) !== null && _a !== void 0 ? _a : image.constructor.name;\n TextureLoader._LOGGER.debug(`WebGL Texture for ${name} collected`);\n this.delete(image);\n return true;\n }\n return false;\n };\n this._gl = gl;\n TextureLoader._MAX_TEXTURE_SIZE = gl.getParameter(gl.MAX_TEXTURE_SIZE);\n if (this._garbageCollector) {\n TextureLoader._LOGGER.debug('WebGL Texture collection interval:', this._garbageCollector.collectionInterval);\n (_a = this._garbageCollector.garbageCollector) === null || _a === void 0 ? void 0 : _a.registerCollector('texture', this._garbageCollector.collectionInterval, this._collect);\n }\n }\n dispose() {\n for (const [image] of this._textureMap) {\n this.delete(image);\n }\n this._textureMap.clear();\n this._gl = null;\n }\n /**\n * Get the WebGL Texture from a source image\n * @param image\n */\n get(image) {\n return this._textureMap.get(image);\n }\n /**\n * Returns whether a source image has been loaded as a texture\n * @param image\n */\n has(image) {\n return this._textureMap.has(image);\n }\n /**\n * Loads a graphic into webgl and returns it's texture info, a webgl context must be previously registered\n * @param image Source graphic\n * @param options {ImageSourceOptions} Optionally configure the ImageFiltering and ImageWrapping mode to apply to the loaded texture\n * @param forceUpdate Optionally force a texture to be reloaded, useful if the source graphic has changed\n */\n load(image, options, forceUpdate = false) {\n var _a, _b;\n // Ignore loading if webgl is not registered\n const gl = this._gl;\n if (!gl) {\n return null;\n }\n const { filtering, wrapping } = { ...options };\n let tex = null;\n // If reuse the texture if it's from the same source\n if (this.has(image)) {\n tex = this.get(image);\n }\n // Update existing webgl texture and return early\n if (tex) {\n if (forceUpdate) {\n gl.bindTexture(gl.TEXTURE_2D, tex);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);\n }\n (_a = this._garbageCollector) === null || _a === void 0 ? void 0 : _a.garbageCollector.touch(image);\n return tex;\n }\n // No texture exists create a new one\n tex = gl.createTexture();\n // TODO implement texture gc with weakmap and timer\n TextureLoader.checkImageSizeSupportedAndLog(image);\n gl.bindTexture(gl.TEXTURE_2D, tex);\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);\n let wrappingConfig;\n if (wrapping) {\n if (typeof wrapping === 'string') {\n wrappingConfig = {\n x: wrapping,\n y: wrapping\n };\n }\n else {\n wrappingConfig = {\n x: wrapping.x,\n y: wrapping.y\n };\n }\n }\n const { x: xWrap, y: yWrap } = wrappingConfig !== null && wrappingConfig !== void 0 ? wrappingConfig : TextureLoader.wrapping;\n switch (xWrap) {\n case _Wrapping__WEBPACK_IMPORTED_MODULE_0__.ImageWrapping.Clamp:\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n break;\n case _Wrapping__WEBPACK_IMPORTED_MODULE_0__.ImageWrapping.Repeat:\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT);\n break;\n case _Wrapping__WEBPACK_IMPORTED_MODULE_0__.ImageWrapping.Mirror:\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.MIRRORED_REPEAT);\n break;\n default:\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n }\n switch (yWrap) {\n case _Wrapping__WEBPACK_IMPORTED_MODULE_0__.ImageWrapping.Clamp:\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n break;\n case _Wrapping__WEBPACK_IMPORTED_MODULE_0__.ImageWrapping.Repeat:\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT);\n break;\n case _Wrapping__WEBPACK_IMPORTED_MODULE_0__.ImageWrapping.Mirror:\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.MIRRORED_REPEAT);\n break;\n default:\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n }\n // NEAREST for pixel art, LINEAR for hi-res\n const filterMode = filtering !== null && filtering !== void 0 ? filtering : TextureLoader.filtering;\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filterMode === _Filtering__WEBPACK_IMPORTED_MODULE_1__.ImageFiltering.Pixel ? gl.NEAREST : gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filterMode === _Filtering__WEBPACK_IMPORTED_MODULE_1__.ImageFiltering.Pixel ? gl.NEAREST : gl.LINEAR);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);\n this._textureMap.set(image, tex);\n (_b = this._garbageCollector) === null || _b === void 0 ? void 0 : _b.garbageCollector.addCollectableResource('texture', image);\n return tex;\n }\n delete(image) {\n // Ignore loading if webgl is not registered\n const gl = this._gl;\n if (!gl) {\n return;\n }\n if (this.has(image)) {\n const texture = this.get(image);\n if (texture) {\n this._textureMap.delete(image);\n gl.deleteTexture(texture);\n }\n }\n }\n /**\n * Takes an image and returns if it meets size criteria for hardware\n * @param image\n * @returns if the image will be supported at runtime\n */\n static checkImageSizeSupportedAndLog(image) {\n var _a;\n const originalSrc = (_a = image.dataset.originalSrc) !== null && _a !== void 0 ? _a : 'internal canvas bitmap';\n if (image.width > TextureLoader._MAX_TEXTURE_SIZE || image.height > TextureLoader._MAX_TEXTURE_SIZE) {\n TextureLoader._LOGGER.error(`The image [${originalSrc}] provided to Excalibur is too large for the device's maximum texture size of ` +\n `(${TextureLoader._MAX_TEXTURE_SIZE}x${TextureLoader._MAX_TEXTURE_SIZE}) please resize to an image ` +\n `for excalibur to render properly.\\n\\nImages will likely render as black rectangles.\\n\\n` +\n `Read more here: https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/WebGL_best_practices#understand_system_limits`);\n return false;\n }\n else if (image.width > 4096 || image.height > 4096) {\n // https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/WebGL_best_practices#understand_system_limits\n TextureLoader._LOGGER.warn(`The image [${originalSrc}] provided to excalibur is too large may not work on all mobile devices, ` +\n `it is recommended you resize images to a maximum (4096x4096).\\n\\n` +\n `Images will likely render as black rectangles on some mobile platforms.\\n\\n` +\n `Read more here: https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/WebGL_best_practices#understand_system_limits`);\n }\n return true;\n }\n}\nTextureLoader._LOGGER = _Util_Log__WEBPACK_IMPORTED_MODULE_2__.Logger.getInstance();\n/**\n * Sets the default filtering for the Excalibur texture loader, default {@apilink ImageFiltering.Blended}\n */\nTextureLoader.filtering = _Filtering__WEBPACK_IMPORTED_MODULE_1__.ImageFiltering.Blended;\nTextureLoader.wrapping = { x: _Wrapping__WEBPACK_IMPORTED_MODULE_0__.ImageWrapping.Clamp, y: _Wrapping__WEBPACK_IMPORTED_MODULE_0__.ImageWrapping.Clamp };\nTextureLoader._MAX_TEXTURE_SIZE = 4096;\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/transform-stack.ts\":\n/*!*********************************************!*\\\n !*** ./Graphics/Context/transform-stack.ts ***!\n \\*********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TransformStack: () => (/* binding */ TransformStack)\n/* harmony export */ });\n/* harmony import */ var _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/affine-matrix */ \"./Math/affine-matrix.ts\");\n/* harmony import */ var _Util_RentalPool__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Util/RentalPool */ \"./Util/RentalPool.ts\");\n\n\nclass TransformStack {\n constructor() {\n this._pool = new _Util_RentalPool__WEBPACK_IMPORTED_MODULE_0__.RentalPool(() => _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_1__.AffineMatrix.identity(), (mat) => mat.reset(), 100);\n this._transforms = [];\n this._currentTransform = this._pool.rent(true);\n }\n save() {\n this._transforms.push(this._currentTransform);\n this._currentTransform = this._currentTransform.clone(this._pool.rent());\n }\n restore() {\n this._pool.return(this._currentTransform);\n this._currentTransform = this._transforms.pop();\n }\n translate(x, y) {\n return this._currentTransform.translate(x, y);\n }\n rotate(angle) {\n return this._currentTransform.rotate(angle);\n }\n scale(x, y) {\n return this._currentTransform.scale(x, y);\n }\n reset() {\n this._currentTransform.reset();\n }\n set current(matrix) {\n this._currentTransform = matrix;\n }\n get current() {\n return this._currentTransform;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/vertex-buffer.ts\":\n/*!*******************************************!*\\\n !*** ./Graphics/Context/vertex-buffer.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ VertexBuffer: () => (/* binding */ VertexBuffer)\n/* harmony export */ });\n/**\n * Helper around vertex buffer to simplify creating and uploading geometry\n *\n * Under the hood uses Float32Array\n */\nclass VertexBuffer {\n constructor(options) {\n /**\n * If the vertices never change switching 'static' can be more efficient on the gpu\n *\n * Default is 'dynamic'\n */\n this.type = 'dynamic';\n const { gl, size, type, data } = options;\n this._gl = gl;\n this.buffer = this._gl.createBuffer();\n if (!data && !size) {\n throw Error('Must either provide data or a size to the VertexBuffer');\n }\n if (!data) {\n this.bufferData = new Float32Array(size);\n }\n else {\n this.bufferData = data;\n }\n this.type = type !== null && type !== void 0 ? type : this.type;\n // Allocate buffer\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer);\n gl.bufferData(gl.ARRAY_BUFFER, this.bufferData, this.type === 'static' ? gl.STATIC_DRAW : gl.DYNAMIC_DRAW);\n }\n /**\n * Bind this vertex buffer\n */\n bind() {\n const gl = this._gl;\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer);\n }\n unbind() {\n const gl = this._gl;\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n }\n /**\n * Upload vertex buffer geometry to the GPU\n */\n upload(count) {\n const gl = this._gl;\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer);\n if (count) {\n gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.bufferData, 0, count);\n }\n else {\n // TODO always use bufferSubData? need to perf test it\n gl.bufferData(gl.ARRAY_BUFFER, this.bufferData, this.type === 'static' ? gl.STATIC_DRAW : gl.DYNAMIC_DRAW);\n }\n }\n dispose() {\n const gl = this._gl;\n gl.deleteBuffer(this.buffer);\n this._gl = null;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/vertex-layout.ts\":\n/*!*******************************************!*\\\n !*** ./Graphics/Context/vertex-layout.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ VertexLayout: () => (/* binding */ VertexLayout)\n/* harmony export */ });\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../.. */ \"./Util/Log.ts\");\n/* harmony import */ var _webgl_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./webgl-util */ \"./Graphics/Context/webgl-util.ts\");\n\n\n/**\n * Helper around creating vertex attributes in a given {@apilink VertexBuffer}, this is useful for describing\n * the memory layout for your vertices inside a particular buffer\n *\n * Note: This helper assumes interleaved attributes in one {@apilink VertexBuffer}, not many.\n *\n * Working with `gl.vertexAttribPointer` can be tricky, and this attempts to double check you\n */\nclass VertexLayout {\n get vertexBuffer() {\n return this._vertexBuffer;\n }\n get attributes() {\n return this._attributes;\n }\n constructor(options) {\n this._logger = ___WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance();\n this._suppressWarnings = false;\n this._layout = [];\n this._attributes = [];\n this._vertexTotalSizeBytes = 0;\n this._initialized = false;\n const { gl, shader, vertexBuffer, attributes, suppressWarnings } = options;\n this._gl = gl;\n this._vertexBuffer = vertexBuffer;\n this._attributes = attributes;\n this._shader = shader;\n this._suppressWarnings = suppressWarnings;\n if (shader) {\n this.initialize();\n }\n }\n /**\n * Total number of bytes that the vertex will take up\n */\n get totalVertexSizeBytes() {\n return this._vertexTotalSizeBytes;\n }\n set shader(shader) {\n if (shader && this._shader !== shader) {\n this._shader = shader;\n this.initialize();\n }\n }\n get shader() {\n return this._shader;\n }\n /**\n * Layouts need shader locations and must be bound to a shader\n */\n initialize() {\n if (this._initialized) {\n return;\n }\n if (!this._shader) {\n return;\n }\n if (!this._shader.compiled) {\n throw Error('Shader not compiled, shader must be compiled before defining a vertex layout');\n }\n this._vertexTotalSizeBytes = 0;\n this._layout.length = 0;\n const shaderAttributes = this._shader.attributes;\n for (const attribute of this._attributes) {\n const attrib = shaderAttributes[attribute[0]];\n if (!attrib) {\n if (!(0,_webgl_util__WEBPACK_IMPORTED_MODULE_1__.isAttributeInSource)(this._shader.vertexSource, attribute[0])) {\n throw Error(`The attribute named: ${attribute[0]} size ${attribute[1]}` +\n ` not found in the shader source code:\\n ${this._shader.vertexSource}`);\n }\n if (!this._suppressWarnings) {\n this._logger.warn(`The attribute named: ${attribute[0]} size ${attribute[1]}` +\n ` not found in the compiled shader. This is possibly a bug:\\n` +\n ` 1. Not a bug, but should remove unused code - attribute \"${attribute[0]}\" is unused in` +\n ` vertex/fragment and has been automatically removed by glsl compiler.\\n` +\n ` 2. Definitely a bug, attribute \"${attribute[0]}\" in layout has been mistyped or is missing` +\n ` in shader, check vertex/fragment source.`);\n }\n const glType = (0,_webgl_util__WEBPACK_IMPORTED_MODULE_1__.getGLTypeFromSource)(this._gl, this._shader.vertexSource, attribute[0]);\n // Unused attribute placeholder\n this._layout.push({\n name: attribute[0],\n glType,\n size: attribute[1],\n location: -1,\n normalized: false\n });\n }\n if (attrib) {\n if (attrib.size !== attribute[1]) {\n throw Error(`VertexLayout size definition for attribute: [${attribute[0]}, ${attribute[1]}],` +\n ` doesn\\'t match shader source size ${attrib.size}:\\n ${this._shader.vertexSource}`);\n }\n this._layout.push(attrib);\n }\n }\n // calc size\n let componentsPerVertex = 0;\n for (const vertAttribute of this._layout) {\n const typeSize = (0,_webgl_util__WEBPACK_IMPORTED_MODULE_1__.getGlTypeSizeBytes)(this._gl, vertAttribute.glType);\n this._vertexTotalSizeBytes += typeSize * vertAttribute.size;\n componentsPerVertex += vertAttribute.size;\n }\n if (this._vertexBuffer.bufferData.length % componentsPerVertex !== 0) {\n this._logger.warn(`The vertex component size (${componentsPerVertex}) does NOT divide evenly into the specified vertex buffer` +\n ` (${this._vertexBuffer.bufferData.length})`);\n }\n // create VAO\n const gl = this._gl;\n this._vao = gl.createVertexArray();\n gl.bindVertexArray(this._vao);\n this._vertexBuffer.bind();\n let offset = 0;\n for (const vert of this._layout) {\n // skip unused attributes\n if (vert.location !== -1) {\n if (vert.glType === gl.INT) {\n gl.vertexAttribIPointer(vert.location, vert.size, vert.glType, this.totalVertexSizeBytes, offset);\n }\n else {\n gl.vertexAttribPointer(vert.location, vert.size, vert.glType, vert.normalized, this.totalVertexSizeBytes, offset);\n }\n gl.enableVertexAttribArray(vert.location);\n }\n offset += (0,_webgl_util__WEBPACK_IMPORTED_MODULE_1__.getGlTypeSizeBytes)(gl, vert.glType) * vert.size;\n }\n gl.bindVertexArray(null);\n this._vertexBuffer.unbind();\n this._initialized = true;\n }\n /**\n * Bind this layout with it's associated vertex buffer\n * @param uploadBuffer Optionally indicate you wish to upload the buffer to the GPU associated with this layout\n */\n use(uploadBuffer = false, count) {\n if (!this._shader) {\n throw Error('No shader is associated with this vertex layout, a shader must be set');\n }\n const gl = this._gl;\n if (!this._shader.isCurrentlyBound()) {\n throw Error('Shader associated with this vertex layout is not active! Call shader.use() before layout.use()');\n }\n this._vertexBuffer.bind();\n if (uploadBuffer) {\n this._vertexBuffer.upload(count);\n }\n gl.bindVertexArray(this._vao);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/webgl-util.ts\":\n/*!****************************************!*\\\n !*** ./Graphics/Context/webgl-util.ts ***!\n \\****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ getAttributeComponentSize: () => (/* binding */ getAttributeComponentSize),\n/* harmony export */ getAttributePointerType: () => (/* binding */ getAttributePointerType),\n/* harmony export */ getGLTypeFromSource: () => (/* binding */ getGLTypeFromSource),\n/* harmony export */ getGlTypeSizeBytes: () => (/* binding */ getGlTypeSizeBytes),\n/* harmony export */ getMaxShaderComplexity: () => (/* binding */ getMaxShaderComplexity),\n/* harmony export */ isAttributeInSource: () => (/* binding */ isAttributeInSource)\n/* harmony export */ });\n/**\n * Return the size of the GlType in bytes\n * @param gl\n * @param type\n */\nfunction getGlTypeSizeBytes(gl, type) {\n switch (type) {\n case gl.INT:\n case gl.UNSIGNED_INT:\n case gl.FLOAT:\n return 4;\n case gl.SHORT:\n return 2;\n case gl.UNSIGNED_SHORT:\n return 2;\n case gl.BYTE:\n return 1;\n case gl.UNSIGNED_BYTE:\n return 1;\n default:\n return 1;\n }\n}\n/**\n * Checks if an attribute is present in vertex source\n */\nfunction isAttributeInSource(source, variable) {\n const attributeRegexTemplate = `(?[a-z0-9]+)\\\\s+${variable};`;\n const regex = new RegExp(attributeRegexTemplate, 'g');\n const matches = regex.exec(source);\n return (matches === null || matches === void 0 ? void 0 : matches.length) > 0;\n}\n/**\n * Attempt to discern the glType of an attribute from vertex source\n * @param gl\n * @param source\n * @param variable\n */\nfunction getGLTypeFromSource(gl, source, variable) {\n var _a;\n const attributeRegexTemplate = `(?[a-z0-9]+)\\\\s+${variable};`;\n const regex = new RegExp(attributeRegexTemplate, 'g');\n const matches = regex.exec(source);\n const type = (_a = matches === null || matches === void 0 ? void 0 : matches.groups) === null || _a === void 0 ? void 0 : _a.type;\n switch (type) {\n case 'float':\n case 'vec2':\n case 'vec3':\n case 'vec4':\n return gl.FLOAT;\n case 'int':\n case 'ivec2':\n case 'ivec3':\n case 'ivec4':\n return gl.INT;\n case 'uint':\n case 'uvec2':\n case 'uvec3':\n case 'uvec4':\n return gl.UNSIGNED_INT;\n case 'bool':\n case 'bvec2':\n case 'bvec3':\n case 'bvec4':\n return gl.BOOL;\n case 'short':\n return gl.SHORT;\n case 'ushort':\n return gl.UNSIGNED_SHORT;\n case 'ubyte':\n return gl.UNSIGNED_BYTE;\n case 'byte':\n return gl.BYTE;\n default:\n return gl.FLOAT;\n }\n}\n/**\n * Based on the type return the number of attribute components\n *\n * https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/vertexAttribPointer\n * @param gl\n * @param type\n */\nfunction getAttributeComponentSize(gl, type) {\n switch (type) {\n case gl.LOW_FLOAT:\n case gl.HIGH_FLOAT:\n case gl.FLOAT:\n return 1;\n case gl.FLOAT_VEC2:\n return 2;\n case gl.FLOAT_VEC3:\n return 3;\n case gl.FLOAT_VEC4:\n return 4;\n case gl.BYTE:\n return 1;\n case gl.UNSIGNED_BYTE:\n return 1;\n case gl.UNSIGNED_SHORT:\n case gl.SHORT:\n return 1;\n default:\n return 1;\n }\n}\n/**\n * Based on the attribute return the corresponding supported attrib pointer type\n * https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/vertexAttribPointer\n * @param gl\n * @param type\n */\nfunction getAttributePointerType(gl, type) {\n switch (type) {\n case gl.LOW_FLOAT:\n case gl.HIGH_FLOAT:\n case gl.FLOAT:\n case gl.FLOAT_VEC2:\n case gl.FLOAT_VEC3:\n case gl.FLOAT_VEC4:\n return gl.FLOAT;\n case gl.BYTE:\n return gl.BYTE;\n case gl.UNSIGNED_BYTE:\n return gl.UNSIGNED_BYTE;\n case gl.SHORT:\n return gl.SHORT;\n case gl.UNSIGNED_SHORT:\n return gl.UNSIGNED_SHORT;\n default:\n return gl.FLOAT;\n }\n}\n/**\n *\n */\nfunction getMaxShaderComplexity(gl, numIfs) {\n const assembleTestShader = (numIfs) => {\n const testShader = `#version 300 es\r\n precision mediump float;\r\n out vec4 fragColor;\r\n void main() {\r\n float index = 1.01;\r\n %%complexity%%\r\n }`;\n let testComplexity = '';\n for (let i = 0; i < numIfs; i++) {\n if (i === 0) {\n testComplexity += `if (index <= ${i}.5) {\\n`;\n }\n else {\n testComplexity += ` else if (index <= ${i}.5) {\\n`;\n }\n testComplexity += ` fragColor = vec4(1.0);\\n`;\n testComplexity += ` }\\n`;\n }\n return testShader.replace('%%complexity%%', testComplexity);\n };\n let canCompile = false;\n do {\n const test = assembleTestShader(numIfs);\n const shader = gl.createShader(gl.FRAGMENT_SHADER);\n gl.shaderSource(shader, test);\n gl.compileShader(shader);\n canCompile = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n if (!canCompile) {\n numIfs = (numIfs / 2) | 0;\n }\n } while (!canCompile);\n return numIfs;\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Debug.ts\":\n/*!***************************!*\\\n !*** ./Graphics/Debug.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Debug: () => (/* binding */ Debug)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n\nclass Debug {\n static registerGraphicsContext(ctx) {\n Debug._ctx = ctx;\n }\n static draw(debugDrawCall) {\n this._drawCalls.push(debugDrawCall);\n }\n static drawPoint(point, options) {\n Debug.draw((ctx) => {\n ctx.debug.drawPoint(point, options);\n });\n }\n static drawLine(start, end, options) {\n Debug.draw((ctx) => {\n ctx.debug.drawLine(start, end, options);\n });\n }\n static drawLines(points, options) {\n if (points.length > 1) {\n Debug.draw((ctx) => {\n for (let i = 0; i < points.length - 1; i++) {\n ctx.debug.drawLine(points[i], points[i + 1], options);\n }\n });\n }\n }\n static drawText(text, pos) {\n Debug.draw((ctx) => {\n ctx.debug.drawText(text, pos);\n });\n }\n static drawPolygon(points, options) {\n if (points.length > 1) {\n Debug.draw((ctx) => {\n const firstPoint = points[0];\n const polygon = [...points, firstPoint];\n for (let i = 0; i < polygon.length - 1; i++) {\n ctx.debug.drawLine(polygon[i], polygon[i + 1], options);\n }\n });\n }\n }\n static drawCircle(center, radius, options) {\n const { color, strokeColor, width } = {\n color: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Black,\n strokeColor: undefined,\n width: undefined,\n ...options\n };\n Debug.draw((ctx) => {\n ctx.drawCircle(center, radius, color, strokeColor, width);\n });\n }\n static drawBounds(boundingBox, options) {\n Debug.draw((ctx) => {\n ctx.debug.drawRect(boundingBox.left, boundingBox.top, boundingBox.width, boundingBox.height, options);\n });\n }\n static drawRay(ray, options) {\n const { distance, color } = {\n color: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Blue,\n distance: 10,\n ...options\n };\n Debug.draw((ctx) => {\n const start = ray.pos;\n const end = ray.pos.add(ray.dir.scale(distance));\n ctx.debug.drawLine(start, end, { color });\n });\n }\n static flush(ctx) {\n ctx.save();\n ctx.z = Debug.z;\n for (const drawCall of Debug._drawCalls) {\n drawCall(ctx);\n }\n ctx.restore();\n Debug.clear();\n }\n static clear() {\n Debug._drawCalls.length = 0;\n }\n}\nDebug._drawCalls = [];\nDebug.z = Infinity;\n\n\n/***/ }),\n\n/***/ \"./Graphics/DebugGraphicsComponent.ts\":\n/*!********************************************!*\\\n !*** ./Graphics/DebugGraphicsComponent.ts ***!\n \\********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DebugGraphicsComponent: () => (/* binding */ DebugGraphicsComponent)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Component */ \"./EntityComponentSystem/Component.ts\");\n\n/**\n * Provide arbitrary drawing for the purposes of debugging your game\n *\n * Will only show when the Engine is set to debug mode {@apilink Engine.showDebug} or {@apilink Engine.toggleDebug}\n *\n */\nclass DebugGraphicsComponent extends _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor(draw, useTransform = true) {\n super();\n this.draw = draw;\n this.useTransform = useTransform;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Filtering.ts\":\n/*!*******************************!*\\\n !*** ./Graphics/Filtering.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ImageFiltering: () => (/* binding */ ImageFiltering),\n/* harmony export */ parseImageFiltering: () => (/* binding */ parseImageFiltering)\n/* harmony export */ });\n/**\n * Describes the different image filtering modes\n */\nvar ImageFiltering;\n(function (ImageFiltering) {\n /**\n * Pixel is useful when you do not want smoothing aka antialiasing applied to your graphics.\n *\n * Useful for Pixel art aesthetics.\n */\n ImageFiltering[\"Pixel\"] = \"Pixel\";\n /**\n * Blended is useful when you have high resolution artwork and would like it blended and smoothed\n */\n ImageFiltering[\"Blended\"] = \"Blended\";\n})(ImageFiltering || (ImageFiltering = {}));\n/**\n * Parse the image filtering attribute value, if it doesn't match returns null\n */\nfunction parseImageFiltering(val) {\n switch (val) {\n case ImageFiltering.Pixel:\n return ImageFiltering.Pixel;\n case ImageFiltering.Blended:\n return ImageFiltering.Blended;\n default:\n return undefined;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Font.ts\":\n/*!**************************!*\\\n !*** ./Graphics/Font.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Font: () => (/* binding */ Font)\n/* harmony export */ });\n/* harmony import */ var _Collision_Index__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Collision/Index */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _FontCommon__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./FontCommon */ \"./Graphics/FontCommon.ts\");\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _FontTextInstance__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./FontTextInstance */ \"./Graphics/FontTextInstance.ts\");\n/* harmony import */ var _FontCache__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./FontCache */ \"./Graphics/FontCache.ts\");\n\n\n\n\n\n\n\n/**\n * Represents a system or web font in Excalibur\n *\n * If no options specified, the system sans-serif 10 pixel is used\n *\n * If loading a custom web font be sure to have the font loaded before you use it https://erikonarheim.com/posts/dont-test-fonts/\n */\nclass Font extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n constructor(options = {}) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v;\n super(options); // <- Graphics properties\n /**\n * Set the font filtering mode, by default set to {@apilink ImageFiltering.Blended} regardless of the engine default smoothing\n *\n * If you have a pixel style font that may be a reason to switch this to {@apilink ImageFiltering.Pixel}\n */\n this.filtering = _Filtering__WEBPACK_IMPORTED_MODULE_1__.ImageFiltering.Blended;\n /**\n * Font quality determines the size of the underlying raster text, higher quality means less jagged edges.\n * If quality is set to 1, then just enough raster bitmap is generated to render the text.\n *\n * You can think of quality as how zoomed in to the text you can get before seeing jagged edges.\n *\n * (Default 2)\n */\n this.quality = 2;\n // Raster properties for fonts\n this.padding = 2;\n this.smoothing = false;\n this.lineWidth = 1;\n this.lineDash = [];\n this.color = _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Black;\n this.family = 'sans-serif';\n this.style = _FontCommon__WEBPACK_IMPORTED_MODULE_3__.FontStyle.Normal;\n this.bold = false;\n this.unit = _FontCommon__WEBPACK_IMPORTED_MODULE_3__.FontUnit.Px;\n this.textAlign = _FontCommon__WEBPACK_IMPORTED_MODULE_3__.TextAlign.Left;\n this.baseAlign = _FontCommon__WEBPACK_IMPORTED_MODULE_3__.BaseAlign.Top;\n this.direction = _FontCommon__WEBPACK_IMPORTED_MODULE_3__.Direction.LeftToRight;\n /**\n * Font line height in pixels, default line height if unset\n */\n this.lineHeight = undefined;\n this.size = 10;\n this._textBounds = new _Collision_Index__WEBPACK_IMPORTED_MODULE_4__.BoundingBox();\n this._textMeasurement = new _FontTextInstance__WEBPACK_IMPORTED_MODULE_5__.FontTextInstance(this, '', _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Black);\n // Raster properties\n this.smoothing = (_a = options === null || options === void 0 ? void 0 : options.smoothing) !== null && _a !== void 0 ? _a : this.smoothing;\n this.padding = (_b = options === null || options === void 0 ? void 0 : options.padding) !== null && _b !== void 0 ? _b : this.padding;\n this.color = (_c = options === null || options === void 0 ? void 0 : options.color) !== null && _c !== void 0 ? _c : this.color;\n this.strokeColor = (_d = options === null || options === void 0 ? void 0 : options.strokeColor) !== null && _d !== void 0 ? _d : this.strokeColor;\n this.lineDash = (_e = options === null || options === void 0 ? void 0 : options.lineDash) !== null && _e !== void 0 ? _e : this.lineDash;\n this.lineWidth = (_f = options === null || options === void 0 ? void 0 : options.lineWidth) !== null && _f !== void 0 ? _f : this.lineWidth;\n this.filtering = (_g = options === null || options === void 0 ? void 0 : options.filtering) !== null && _g !== void 0 ? _g : this.filtering;\n // Font specific properties\n this.family = (_h = options === null || options === void 0 ? void 0 : options.family) !== null && _h !== void 0 ? _h : this.family;\n this.style = (_j = options === null || options === void 0 ? void 0 : options.style) !== null && _j !== void 0 ? _j : this.style;\n this.bold = (_k = options === null || options === void 0 ? void 0 : options.bold) !== null && _k !== void 0 ? _k : this.bold;\n this.size = (_l = options === null || options === void 0 ? void 0 : options.size) !== null && _l !== void 0 ? _l : this.size;\n this.unit = (_m = options === null || options === void 0 ? void 0 : options.unit) !== null && _m !== void 0 ? _m : this.unit;\n this.textAlign = (_o = options === null || options === void 0 ? void 0 : options.textAlign) !== null && _o !== void 0 ? _o : this.textAlign;\n this.baseAlign = (_p = options === null || options === void 0 ? void 0 : options.baseAlign) !== null && _p !== void 0 ? _p : this.baseAlign;\n this.direction = (_q = options === null || options === void 0 ? void 0 : options.direction) !== null && _q !== void 0 ? _q : this.direction;\n this.lineHeight = (_r = options === null || options === void 0 ? void 0 : options.lineHeight) !== null && _r !== void 0 ? _r : this.lineHeight;\n this.quality = (_s = options === null || options === void 0 ? void 0 : options.quality) !== null && _s !== void 0 ? _s : this.quality;\n if (options === null || options === void 0 ? void 0 : options.shadow) {\n this.shadow = {};\n this.shadow.blur = (_t = options.shadow.blur) !== null && _t !== void 0 ? _t : this.shadow.blur;\n this.shadow.offset = (_u = options.shadow.offset) !== null && _u !== void 0 ? _u : this.shadow.offset;\n this.shadow.color = (_v = options.shadow.color) !== null && _v !== void 0 ? _v : this.shadow.color;\n }\n }\n clone() {\n return new Font({\n ...this.cloneGraphicOptions(),\n size: this.size,\n unit: this.unit,\n family: this.family,\n style: this.style,\n bold: this.bold,\n textAlign: this.textAlign,\n baseAlign: this.baseAlign,\n direction: this.direction,\n shadow: this.shadow\n ? {\n blur: this.shadow.blur,\n offset: this.shadow.offset,\n color: this.shadow.color\n }\n : undefined\n });\n }\n get fontString() {\n return `${this.style} ${this.bold ? 'bold' : ''} ${this.size}${this.unit} ${this.family}`;\n }\n get localBounds() {\n return this._textBounds;\n }\n _drawImage(_ex, _x, _y) {\n // TODO weird vestigial drawimage\n }\n _rotate(ex) {\n var _a;\n // TODO this needs to change depending on the bounding box...\n const origin = (_a = this.origin) !== null && _a !== void 0 ? _a : this._textBounds.center;\n ex.translate(origin.x, origin.y);\n ex.rotate(this.rotation);\n ex.translate(-origin.x, -origin.y);\n }\n _flip(ex) {\n if (this.flipHorizontal) {\n ex.translate(this._textBounds.width / this.scale.x, 0);\n ex.scale(-1, 1);\n }\n if (this.flipVertical) {\n ex.translate(0, -this._textBounds.height / 2 / this.scale.y);\n ex.scale(1, -1);\n }\n }\n measureTextWithoutCache(text, maxWidth) {\n return this._textMeasurement.measureText(text, maxWidth);\n }\n /**\n * Returns a BoundingBox that is the total size of the text including multiple lines\n *\n * Does not include any padding or adjustment\n * @param text\n * @returns BoundingBox\n */\n measureText(text, maxWidth) {\n return _FontCache__WEBPACK_IMPORTED_MODULE_6__.FontCache.measureText(text, this, maxWidth);\n }\n _postDraw(ex) {\n ex.restore();\n }\n render(ex, text, colorOverride, x, y, maxWidth) {\n const textInstance = _FontCache__WEBPACK_IMPORTED_MODULE_6__.FontCache.getTextInstance(text, this, colorOverride);\n // Apply affine transformations\n this._textBounds = textInstance.dimensions;\n this._preDraw(ex, x, y);\n textInstance.render(ex, x, y, maxWidth);\n this._postDraw(ex);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/FontCache.ts\":\n/*!*******************************!*\\\n !*** ./Graphics/FontCache.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FontCache: () => (/* binding */ FontCache)\n/* harmony export */ });\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _FontTextInstance__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./FontTextInstance */ \"./Graphics/FontTextInstance.ts\");\n\n\nclass FontCache {\n static measureText(text, font, maxWidth) {\n const hash = _FontTextInstance__WEBPACK_IMPORTED_MODULE_0__.FontTextInstance.getHashCode(font, text);\n if (FontCache._MEASURE_CACHE.has(hash)) {\n return FontCache._MEASURE_CACHE.get(hash);\n }\n FontCache._LOGGER.debug('Font text measurement cache miss');\n const measurement = font.measureTextWithoutCache(text, maxWidth);\n FontCache._MEASURE_CACHE.set(hash, measurement);\n return measurement;\n }\n static getTextInstance(text, font, color) {\n const hash = _FontTextInstance__WEBPACK_IMPORTED_MODULE_0__.FontTextInstance.getHashCode(font, text, color);\n let textInstance = FontCache._TEXT_CACHE.get(hash);\n if (!textInstance) {\n textInstance = new _FontTextInstance__WEBPACK_IMPORTED_MODULE_0__.FontTextInstance(font, text, color);\n FontCache._TEXT_CACHE.set(hash, textInstance);\n FontCache._LOGGER.debug('Font text instance cache miss');\n }\n // Cache the bitmap for certain amount of time\n FontCache._TEXT_USAGE.set(textInstance, performance.now());\n return textInstance;\n }\n static checkAndClearCache() {\n const deferred = [];\n const currentHashCodes = new Set();\n for (const [textInstance, time] of FontCache._TEXT_USAGE.entries()) {\n // if bitmap hasn't been used in 100 ms clear it\n if (time + FontCache.FONT_TIMEOUT < performance.now()) {\n FontCache._LOGGER.debug(`Text cache entry timed out ${textInstance.text}`);\n deferred.push(textInstance);\n textInstance.dispose();\n }\n else {\n const hash = textInstance.getHashCode(false);\n currentHashCodes.add(hash);\n }\n }\n // Deferred removal of text instances\n deferred.forEach((t) => {\n FontCache._TEXT_USAGE.delete(t);\n });\n // Regenerate text instance cache\n this._TEXT_CACHE.clear();\n for (const [textInstance] of this._TEXT_USAGE.entries()) {\n this._TEXT_CACHE.set(textInstance.getHashCode(), textInstance);\n }\n // Regenerated measurement cache\n const newTextMeasurementCache = new Map();\n for (const current of currentHashCodes) {\n if (FontCache._MEASURE_CACHE.has(current)) {\n newTextMeasurementCache.set(current, FontCache._MEASURE_CACHE.get(current));\n }\n }\n this._MEASURE_CACHE.clear();\n this._MEASURE_CACHE = newTextMeasurementCache;\n }\n static get cacheSize() {\n return FontCache._TEXT_USAGE.size;\n }\n /**\n * Force clear all cached text bitmaps\n */\n static clearCache() {\n for (const [textInstance] of FontCache._TEXT_USAGE.entries()) {\n textInstance.dispose();\n }\n FontCache._TEXT_USAGE.clear();\n FontCache._TEXT_CACHE.clear();\n FontCache._MEASURE_CACHE.clear();\n }\n}\nFontCache.FONT_TIMEOUT = 500;\nFontCache._LOGGER = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\nFontCache._TEXT_USAGE = new Map();\nFontCache._TEXT_CACHE = new Map();\nFontCache._MEASURE_CACHE = new Map();\n\n\n/***/ }),\n\n/***/ \"./Graphics/FontCommon.ts\":\n/*!********************************!*\\\n !*** ./Graphics/FontCommon.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BaseAlign: () => (/* binding */ BaseAlign),\n/* harmony export */ Direction: () => (/* binding */ Direction),\n/* harmony export */ FontStyle: () => (/* binding */ FontStyle),\n/* harmony export */ FontUnit: () => (/* binding */ FontUnit),\n/* harmony export */ TextAlign: () => (/* binding */ TextAlign)\n/* harmony export */ });\n/**\n * Enum representing the different font size units\n * https://developer.mozilla.org/en-US/docs/Web/CSS/font-size\n */\nvar FontUnit;\n(function (FontUnit) {\n /**\n * Em is a scalable unit, 1 em is equal to the current font size of the current element, parent elements can effect em values\n */\n FontUnit[\"Em\"] = \"em\";\n /**\n * Rem is similar to the Em, it is a scalable unit. 1 rem is equal to the font size of the root element\n */\n FontUnit[\"Rem\"] = \"rem\";\n /**\n * Pixel is a unit of length in screen pixels\n */\n FontUnit[\"Px\"] = \"px\";\n /**\n * Point is a physical unit length (1/72 of an inch)\n */\n FontUnit[\"Pt\"] = \"pt\";\n /**\n * Percent is a scalable unit similar to Em, the only difference is the Em units scale faster when Text-Size stuff\n */\n FontUnit[\"Percent\"] = \"%\";\n})(FontUnit || (FontUnit = {}));\n/**\n * Enum representing the different horizontal text alignments\n */\nvar TextAlign;\n(function (TextAlign) {\n /**\n * The text is left-aligned.\n */\n TextAlign[\"Left\"] = \"left\";\n /**\n * The text is right-aligned.\n */\n TextAlign[\"Right\"] = \"right\";\n /**\n * The text is centered.\n */\n TextAlign[\"Center\"] = \"center\";\n /**\n * The text is aligned at the normal start of the line (left-aligned for left-to-right locales,\n * right-aligned for right-to-left locales).\n */\n TextAlign[\"Start\"] = \"start\";\n /**\n * The text is aligned at the normal end of the line (right-aligned for left-to-right locales,\n * left-aligned for right-to-left locales).\n */\n TextAlign[\"End\"] = \"end\";\n})(TextAlign || (TextAlign = {}));\n/**\n * Enum representing the different baseline text alignments\n */\nvar BaseAlign;\n(function (BaseAlign) {\n /**\n * The text baseline is the top of the em square.\n */\n BaseAlign[\"Top\"] = \"top\";\n /**\n * The text baseline is the hanging baseline. Currently unsupported; this will act like\n * alphabetic.\n */\n BaseAlign[\"Hanging\"] = \"hanging\";\n /**\n * The text baseline is the middle of the em square.\n */\n BaseAlign[\"Middle\"] = \"middle\";\n /**\n * The text baseline is the normal alphabetic baseline.\n */\n BaseAlign[\"Alphabetic\"] = \"alphabetic\";\n /**\n * The text baseline is the ideographic baseline; this is the bottom of\n * the body of the characters, if the main body of characters protrudes\n * beneath the alphabetic baseline. Currently unsupported; this will\n * act like alphabetic.\n */\n BaseAlign[\"Ideographic\"] = \"ideographic\";\n /**\n * The text baseline is the bottom of the bounding box. This differs\n * from the ideographic baseline in that the ideographic baseline\n * doesn't consider descenders.\n */\n BaseAlign[\"Bottom\"] = \"bottom\";\n})(BaseAlign || (BaseAlign = {}));\n/**\n * Enum representing the different possible font styles\n */\nvar FontStyle;\n(function (FontStyle) {\n FontStyle[\"Normal\"] = \"normal\";\n FontStyle[\"Italic\"] = \"italic\";\n FontStyle[\"Oblique\"] = \"oblique\";\n})(FontStyle || (FontStyle = {}));\n/**\n * Enum representing the text direction, useful for other languages, or writing text in reverse\n */\nvar Direction;\n(function (Direction) {\n Direction[\"LeftToRight\"] = \"ltr\";\n Direction[\"RightToLeft\"] = \"rtl\";\n})(Direction || (Direction = {}));\n\n\n/***/ }),\n\n/***/ \"./Graphics/FontTextInstance.ts\":\n/*!**************************************!*\\\n !*** ./Graphics/FontTextInstance.ts ***!\n \\**************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FontTextInstance: () => (/* binding */ FontTextInstance)\n/* harmony export */ });\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Util_DrawUtil__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/DrawUtil */ \"./Util/DrawUtil.ts\");\n/* harmony import */ var _Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Context/ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n\n\n\n\nclass FontTextInstance {\n constructor(font, text, color, maxWidth) {\n this.font = font;\n this.text = text;\n this.color = color;\n this.maxWidth = maxWidth;\n this._textFragments = [];\n this.disposed = false;\n this._dirty = true;\n this.canvas = document.createElement('canvas');\n const ctx = this.canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Unable to create FontTextInstance, internal canvas failed to create');\n }\n this.ctx = ctx;\n this.dimensions = this.measureText(text);\n this._setDimension(this.dimensions, this.ctx);\n this._lastHashCode = this.getHashCode();\n }\n measureText(text, maxWidth) {\n if (this.disposed) {\n throw Error('Accessing disposed text instance! ' + this.text);\n }\n let lines = null;\n if (maxWidth != null) {\n lines = this._getLinesFromText(text, maxWidth);\n }\n else {\n lines = text.split('\\n');\n }\n const maxWidthLine = lines.reduce((a, b) => {\n return a.length > b.length ? a : b;\n });\n this._applyFont(this.ctx); // font must be applied to the context to measure it\n const metrics = this.ctx.measureText(maxWidthLine);\n let textHeight = Math.abs(metrics.actualBoundingBoxAscent) + Math.abs(metrics.actualBoundingBoxDescent);\n // TODO line height makes the text bounds wonky\n const lineAdjustedHeight = textHeight * lines.length;\n textHeight = lineAdjustedHeight;\n const bottomBounds = lineAdjustedHeight - Math.abs(metrics.actualBoundingBoxAscent);\n const x = 0;\n const y = 0;\n const measurement = new _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox({\n left: x - Math.abs(metrics.actualBoundingBoxLeft) - this.font.padding,\n top: y - Math.abs(metrics.actualBoundingBoxAscent) - this.font.padding,\n bottom: y + bottomBounds + this.font.padding,\n right: x + Math.abs(metrics.actualBoundingBoxRight) + this.font.padding\n });\n return measurement;\n }\n _setDimension(textBounds, bitmap) {\n let lineHeightRatio = 1;\n if (this.font.lineHeight) {\n lineHeightRatio = this.font.lineHeight / this.font.size;\n }\n // Changing the width and height clears the context properties\n // We double the bitmap width to account for all possible alignment\n // We scale by \"quality\" so we render text without jaggies\n bitmap.canvas.width = (textBounds.width + this.font.padding * 2) * 2 * this.font.quality;\n bitmap.canvas.height = (textBounds.height + this.font.padding * 2) * 2 * this.font.quality * lineHeightRatio;\n }\n static getHashCode(font, text, color) {\n var _a;\n const hash = text +\n '__hashcode__' +\n font.fontString +\n font.showDebug +\n font.textAlign +\n font.baseAlign +\n font.direction +\n font.lineHeight +\n JSON.stringify(font.shadow) +\n (font.padding.toString() +\n font.smoothing.toString() +\n font.lineWidth.toString() +\n font.lineDash.toString() +\n ((_a = font.strokeColor) === null || _a === void 0 ? void 0 : _a.toString()) +\n (color ? color.toString() : font.color.toString()));\n return hash;\n }\n getHashCode(includeColor = true) {\n return FontTextInstance.getHashCode(this.font, this.text, includeColor ? this.color : undefined);\n }\n _applyRasterProperties(ctx) {\n var _a, _b, _c;\n ctx.translate(this.font.padding, this.font.padding);\n ctx.imageSmoothingEnabled = this.font.smoothing;\n ctx.lineWidth = this.font.lineWidth;\n ctx.setLineDash((_a = this.font.lineDash) !== null && _a !== void 0 ? _a : ctx.getLineDash());\n ctx.strokeStyle = (_c = (_b = this.font.strokeColor) === null || _b === void 0 ? void 0 : _b.toString()) !== null && _c !== void 0 ? _c : '';\n ctx.fillStyle = this.color.toString();\n }\n _applyFont(ctx) {\n ctx.resetTransform();\n ctx.translate(this.font.padding + ctx.canvas.width / 2, this.font.padding + ctx.canvas.height / 2);\n ctx.scale(this.font.quality, this.font.quality);\n ctx.textAlign = this.font.textAlign;\n ctx.textBaseline = this.font.baseAlign;\n ctx.font = this.font.fontString;\n ctx.direction = this.font.direction;\n if (this.font.shadow) {\n if (this.font.shadow.color) {\n ctx.shadowColor = this.font.shadow.color.toString();\n }\n if (this.font.shadow.blur) {\n ctx.shadowBlur = this.font.shadow.blur;\n }\n if (this.font.shadow.offset) {\n ctx.shadowOffsetX = this.font.shadow.offset.x;\n ctx.shadowOffsetY = this.font.shadow.offset.y;\n }\n }\n }\n _drawText(ctx, lines, lineHeight) {\n this._applyRasterProperties(ctx);\n this._applyFont(ctx);\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (this.color) {\n ctx.fillText(line, 0, i * lineHeight);\n }\n if (this.font.strokeColor) {\n ctx.strokeText(line, 0, i * lineHeight);\n }\n }\n if (this.font.showDebug) {\n // Horizontal line\n /* istanbul ignore next */\n (0,_Util_DrawUtil__WEBPACK_IMPORTED_MODULE_1__.line)(ctx, _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Green, -ctx.canvas.width / 2, 0, ctx.canvas.width / 2, 0, 2);\n // Vertical line\n /* istanbul ignore next */\n (0,_Util_DrawUtil__WEBPACK_IMPORTED_MODULE_1__.line)(ctx, _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Red, 0, -ctx.canvas.height / 2, 0, ctx.canvas.height / 2, 2);\n }\n }\n _splitTextBitmap(bitmap) {\n const textImages = [];\n let currentX = 0;\n let currentY = 0;\n // 4k is the max for mobile devices\n const width = Math.min(4096, bitmap.canvas.width);\n const height = Math.min(4096, bitmap.canvas.height);\n // Splits the original bitmap into 4k max chunks\n while (currentX < bitmap.canvas.width) {\n while (currentY < bitmap.canvas.height) {\n // create new bitmap\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Unable to split internal FontTextInstance bitmap, failed to create internal canvas');\n }\n // draw current slice to new bitmap in < 4k chunks\n ctx.drawImage(bitmap.canvas, currentX, currentY, width, height, 0, 0, width, height);\n textImages.push({ x: currentX, y: currentY, canvas });\n currentY += height;\n }\n currentX += width;\n currentY = 0;\n }\n return textImages;\n }\n flagDirty() {\n this._dirty = true;\n }\n render(ex, x, y, maxWidth) {\n var _a;\n if (this.disposed) {\n throw Error('Accessing disposed text instance! ' + this.text);\n }\n this._ex = ex;\n const hashCode = this.getHashCode();\n if (this._lastHashCode !== hashCode) {\n this._dirty = true;\n }\n // Calculate image chunks\n if (this._dirty) {\n this.dimensions = this.measureText(this.text, maxWidth);\n this._setDimension(this.dimensions, this.ctx);\n const lines = this._getLinesFromText(this.text, maxWidth);\n const lineHeight = (_a = this.font.lineHeight) !== null && _a !== void 0 ? _a : this.dimensions.height / lines.length;\n // draws the text to the main bitmap\n this._drawText(this.ctx, lines, lineHeight);\n // clear any out old fragments\n if (ex instanceof _Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_3__.ExcaliburGraphicsContextWebGL) {\n for (const frag of this._textFragments) {\n ex.textureLoader.delete(frag.canvas);\n }\n }\n // splits to < 4k fragments for large text\n this._textFragments = this._splitTextBitmap(this.ctx);\n if (ex instanceof _Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_3__.ExcaliburGraphicsContextWebGL) {\n for (const frag of this._textFragments) {\n ex.textureLoader.load(frag.canvas, { filtering: this.font.filtering }, true);\n }\n }\n this._lastHashCode = hashCode;\n this._dirty = false;\n }\n // draws the bitmap fragments to excalibur graphics context\n for (const frag of this._textFragments) {\n ex.drawImage(frag.canvas, 0, 0, frag.canvas.width, frag.canvas.height, frag.x / this.font.quality + x - this.ctx.canvas.width / this.font.quality / 2, frag.y / this.font.quality + y - this.ctx.canvas.height / this.font.quality / 2, frag.canvas.width / this.font.quality, frag.canvas.height / this.font.quality);\n }\n }\n dispose() {\n this.disposed = true;\n this.dimensions = undefined;\n this.canvas = undefined;\n this.ctx = undefined;\n if (this._ex instanceof _Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_3__.ExcaliburGraphicsContextWebGL) {\n for (const frag of this._textFragments) {\n this._ex.textureLoader.delete(frag.canvas);\n }\n }\n this._textFragments.length = 0;\n }\n _getLinesFromText(text, maxWidth) {\n var _a;\n if (this._cachedText === text && this._cachedRenderWidth === maxWidth && ((_a = this._cachedLines) === null || _a === void 0 ? void 0 : _a.length)) {\n return this._cachedLines;\n }\n const lines = text.split('\\n');\n if (maxWidth == null) {\n return lines;\n }\n // If the current line goes past the maxWidth, append a new line without modifying the underlying text.\n for (let i = 0; i < lines.length; i++) {\n let line = lines[i];\n let newLine = '';\n if (this.measureText(line).width > maxWidth) {\n while (this.measureText(line).width > maxWidth) {\n newLine = line[line.length - 1] + newLine;\n line = line.slice(0, -1); // Remove last character from line\n }\n // Update the array with our new values\n lines[i] = line;\n lines[i + 1] = newLine;\n }\n }\n this._cachedText = text;\n this._cachedLines = lines;\n this._cachedRenderWidth = maxWidth;\n return lines;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Graphic.ts\":\n/*!*****************************!*\\\n !*** ./Graphics/Graphic.ts ***!\n \\*****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Graphic: () => (/* binding */ Graphic)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Util_Watch__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Util/Watch */ \"./Util/Watch.ts\");\n/* harmony import */ var _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/affine-matrix */ \"./Math/affine-matrix.ts\");\n\n\n\n\n/**\n * A Graphic is the base Excalibur primitive for something that can be drawn to the {@apilink ExcaliburGraphicsContext}.\n * {@apilink Sprite}, {@apilink Animation}, {@apilink GraphicsGroup}, {@apilink Canvas}, {@apilink Rectangle}, {@apilink Circle}, and {@apilink Polygon} all derive from the\n * {@apilink Graphic} abstract class.\n *\n * Implementors of a Graphic must override the abstract {@apilink Graphic._drawImage} method to render an image to the graphics context. Graphic\n * handles all the position, rotation, and scale transformations in {@apilink Graphic._preDraw} and {@apilink Graphic._postDraw}\n */\nclass Graphic {\n isStale() {\n return this._transformStale;\n }\n /**\n * Gets or sets the flipHorizontal, which will flip the graphic horizontally (across the y axis)\n */\n get flipHorizontal() {\n return this._flipHorizontal;\n }\n set flipHorizontal(value) {\n this._flipHorizontal = value;\n this._transformStale = true;\n }\n /**\n * Gets or sets the flipVertical, which will flip the graphic vertically (across the x axis)\n */\n get flipVertical() {\n return this._flipVertical;\n }\n set flipVertical(value) {\n this._flipVertical = value;\n this._transformStale = true;\n }\n /**\n * Gets or sets the rotation of the graphic\n */\n get rotation() {\n return this._rotation;\n }\n set rotation(value) {\n this._rotation = value;\n this._transformStale = true;\n }\n /**\n * Gets or sets the scale of the graphic, this affects the width and\n */\n get scale() {\n return this._scale;\n }\n set scale(value) {\n this._scale = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_0__.watch)(value, () => {\n this._transformStale = true;\n });\n this._transformStale = true;\n }\n /**\n * Gets or sets the origin of the graphic, if not set the center of the graphic is the origin\n */\n get origin() {\n return this._origin;\n }\n set origin(value) {\n if (value) {\n this._origin = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_0__.watch)(value, () => {\n this._transformStale = true;\n });\n }\n this._transformStale = true;\n }\n constructor(options) {\n var _a, _b, _c, _d, _e, _f, _g;\n this.id = Graphic._ID++;\n this.transform = _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_1__.AffineMatrix.identity();\n this._transformStale = true;\n /**\n * Gets or sets wether to show debug information about the graphic\n */\n this.showDebug = false;\n this._flipHorizontal = false;\n this._flipVertical = false;\n this._rotation = 0;\n /**\n * Gets or sets the opacity of the graphic, 0 is transparent, 1 is solid (opaque).\n */\n this.opacity = 1;\n this._scale = _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.One;\n this._width = 0;\n this._height = 0;\n if (options) {\n this.origin = (_a = options.origin) !== null && _a !== void 0 ? _a : this.origin;\n this.flipHorizontal = (_b = options.flipHorizontal) !== null && _b !== void 0 ? _b : this.flipHorizontal;\n this.flipVertical = (_c = options.flipVertical) !== null && _c !== void 0 ? _c : this.flipVertical;\n this.rotation = (_d = options.rotation) !== null && _d !== void 0 ? _d : this.rotation;\n this.opacity = (_e = options.opacity) !== null && _e !== void 0 ? _e : this.opacity;\n this.scale = (_f = options.scale) !== null && _f !== void 0 ? _f : this.scale;\n this.tint = (_g = options.tint) !== null && _g !== void 0 ? _g : this.tint;\n if (options.width) {\n this._width = options.width;\n }\n if (options.height) {\n this._height = options.height;\n }\n }\n }\n cloneGraphicOptions() {\n return {\n width: this.width / this.scale.x,\n height: this.height / this.scale.y,\n origin: this.origin ? this.origin.clone() : undefined,\n flipHorizontal: this.flipHorizontal,\n flipVertical: this.flipVertical,\n rotation: this.rotation,\n opacity: this.opacity,\n scale: this.scale ? this.scale.clone() : undefined,\n tint: this.tint ? this.tint.clone() : undefined\n };\n }\n /**\n * Gets or sets the width of the graphic (always positive)\n */\n get width() {\n return Math.abs(this._width * this.scale.x);\n }\n /**\n * Gets or sets the height of the graphic (always positive)\n */\n get height() {\n return Math.abs(this._height * this.scale.y);\n }\n set width(value) {\n this._width = value;\n this._transformStale = true;\n }\n set height(value) {\n this._height = value;\n this._transformStale = true;\n }\n /**\n * Gets a copy of the bounds in pixels occupied by the graphic on the the screen. This includes scale.\n */\n get localBounds() {\n return _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_3__.BoundingBox.fromDimension(this.width, this.height, _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero);\n }\n /**\n * Draw the whole graphic to the context including transform\n * @param ex The excalibur graphics context\n * @param x\n * @param y\n */\n draw(ex, x, y) {\n this._preDraw(ex, x, y);\n this._drawImage(ex, 0, 0);\n this._postDraw(ex);\n }\n /**\n * Apply affine transformations to the graphics context to manipulate the graphic before {@apilink Graphic._drawImage}\n * @param ex\n * @param x\n * @param y\n */\n _preDraw(ex, x, y) {\n ex.save();\n ex.translate(x, y);\n if (this._transformStale) {\n this.transform.reset();\n this.transform.scale(Math.abs(this.scale.x), Math.abs(this.scale.y));\n this._rotate(this.transform);\n this._flip(this.transform);\n this._transformStale = false;\n }\n ex.multiply(this.transform);\n // it is important to multiply alphas so graphics respect the current context\n ex.opacity = ex.opacity * this.opacity;\n if (this.tint) {\n ex.tint = this.tint;\n }\n }\n _rotate(ex) {\n var _a;\n const scaleDirX = this.scale.x > 0 ? 1 : -1;\n const scaleDirY = this.scale.y > 0 ? 1 : -1;\n const origin = (_a = this.origin) !== null && _a !== void 0 ? _a : (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(this.width / 2, this.height / 2);\n ex.translate(origin.x, origin.y);\n ex.rotate(this.rotation);\n // This is for handling direction changes 1 or -1, that way we don't have mismatched translates()\n ex.scale(scaleDirX, scaleDirY);\n ex.translate(-origin.x, -origin.y);\n }\n _flip(ex) {\n if (this.flipHorizontal) {\n ex.translate(this.width / this.scale.x, 0);\n ex.scale(-1, 1);\n }\n if (this.flipVertical) {\n ex.translate(0, this.height / this.scale.y);\n ex.scale(1, -1);\n }\n }\n /**\n * Apply any additional work after {@apilink Graphic._drawImage} and restore the context state.\n * @param ex\n */\n _postDraw(ex) {\n if (this.showDebug) {\n ex.debug.drawRect(0, 0, this.width, this.height);\n }\n ex.restore();\n }\n}\nGraphic._ID = 0;\n\n\n/***/ }),\n\n/***/ \"./Graphics/GraphicsComponent.ts\":\n/*!***************************************!*\\\n !*** ./Graphics/GraphicsComponent.ts ***!\n \\***************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ GraphicsComponent: () => (/* binding */ GraphicsComponent),\n/* harmony export */ hasGraphicsTick: () => (/* binding */ hasGraphicsTick)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Collision_Index__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Collision/Index */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Component */ \"./EntityComponentSystem/Component.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Math_watch_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/watch-vector */ \"./Math/watch-vector.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Graphics_GraphicsGroup__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Graphics/GraphicsGroup */ \"./Graphics/GraphicsGroup.ts\");\n/* harmony import */ var _Raster__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Raster */ \"./Graphics/Raster.ts\");\n/* harmony import */ var _Text__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Text */ \"./Graphics/Text.ts\");\n\n\n\n\n\n\n\n\n\n\n/**\n * Type guard for checking if a Graphic HasTick (used for graphics that change over time like animations)\n * @param graphic\n */\nfunction hasGraphicsTick(graphic) {\n return !!graphic.tick;\n}\n/**\n * Component to manage drawings, using with the position component\n */\nclass GraphicsComponent extends _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n /**\n * Sets or gets wether any drawing should be visible in this component\n * @deprecated use isVisible\n */\n get visible() {\n return this.isVisible;\n }\n /**\n * Sets or gets wether any drawing should be visible in this component\n * @deprecated use isVisible\n */\n set visible(val) {\n this.isVisible = val;\n }\n /**\n * Offset to apply to graphics by default\n */\n get offset() {\n return this._offset;\n }\n set offset(value) {\n this._offset = new _Math_watch_vector__WEBPACK_IMPORTED_MODULE_1__.WatchVector(value, () => this.recalculateBounds());\n this.recalculateBounds();\n }\n /**\n * Anchor to apply to graphics by default\n */\n get anchor() {\n return this._anchor;\n }\n set anchor(value) {\n this._anchor = new _Math_watch_vector__WEBPACK_IMPORTED_MODULE_1__.WatchVector(value, () => this.recalculateBounds());\n this.recalculateBounds();\n }\n /**\n * Sets the color of the actor's current graphic\n */\n get color() {\n return this._color;\n }\n set color(v) {\n if (v) {\n this._color = v.clone();\n const currentGraphic = this.graphics.current;\n if (currentGraphic instanceof _Raster__WEBPACK_IMPORTED_MODULE_2__.Raster || currentGraphic instanceof _Text__WEBPACK_IMPORTED_MODULE_3__.Text) {\n currentGraphic.color = this._color;\n }\n }\n }\n constructor(options) {\n super();\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_4__.Logger.getInstance();\n this._current = 'default';\n this._graphics = {};\n this._options = {};\n this.material = null;\n /**\n * Sets or gets wether any drawing should be visible in this component\n */\n this.isVisible = true;\n /**\n * Optionally force the graphic onscreen, default false. Not recommend to use for perf reasons, only if you known what you're doing.\n */\n this.forceOnScreen = false;\n /**\n * Sets or gets wither all drawings should have an opacity applied\n */\n this.opacity = 1;\n this._offset = new _Math_watch_vector__WEBPACK_IMPORTED_MODULE_1__.WatchVector(_Math_vector__WEBPACK_IMPORTED_MODULE_5__.Vector.Zero, () => this.recalculateBounds());\n this._anchor = new _Math_watch_vector__WEBPACK_IMPORTED_MODULE_1__.WatchVector(_Math_vector__WEBPACK_IMPORTED_MODULE_5__.Vector.Half, () => this.recalculateBounds());\n /**\n * Flip all graphics horizontally along the y-axis\n */\n this.flipHorizontal = false;\n /**\n * Flip all graphics vertically along the x-axis\n */\n this.flipVertical = false;\n /**\n * If set to true graphics added to the component will be copied. This can effect performance, but is useful if you don't want\n * changes to a graphic to effect all the places it is used.\n */\n this.copyGraphics = false;\n // Defaults\n options = {\n visible: this.isVisible,\n graphics: {},\n ...options\n };\n const { current, anchor, color, opacity, visible, graphics, offset, copyGraphics, onPreDraw, onPostDraw, onPreTransformDraw, onPostTransformDraw } = options;\n for (const [key, graphicOrOptions] of Object.entries(graphics)) {\n if (graphicOrOptions instanceof _Graphic__WEBPACK_IMPORTED_MODULE_6__.Graphic) {\n this._graphics[key] = graphicOrOptions;\n }\n else {\n this._graphics[key] = graphicOrOptions.graphic;\n this._options[key] = graphicOrOptions.options;\n }\n }\n this.offset = offset !== null && offset !== void 0 ? offset : this.offset;\n this.opacity = opacity !== null && opacity !== void 0 ? opacity : this.opacity;\n this.anchor = anchor !== null && anchor !== void 0 ? anchor : this.anchor;\n this.color = color !== null && color !== void 0 ? color : this.color;\n this.copyGraphics = copyGraphics !== null && copyGraphics !== void 0 ? copyGraphics : this.copyGraphics;\n this.onPreDraw = onPreDraw !== null && onPreDraw !== void 0 ? onPreDraw : this.onPreDraw;\n this.onPostDraw = onPostDraw !== null && onPostDraw !== void 0 ? onPostDraw : this.onPostDraw;\n this.onPreDraw = onPreTransformDraw !== null && onPreTransformDraw !== void 0 ? onPreTransformDraw : this.onPreTransformDraw;\n this.onPostTransformDraw = onPostTransformDraw !== null && onPostTransformDraw !== void 0 ? onPostTransformDraw : this.onPostTransformDraw;\n this.isVisible = !!visible;\n this._current = current !== null && current !== void 0 ? current : this._current;\n if (current && this._graphics[current]) {\n this.use(current);\n }\n }\n getGraphic(name) {\n return this._graphics[name];\n }\n getOptions(name) {\n return this._options[name];\n }\n /**\n * Get registered graphics names\n */\n getNames() {\n return Object.keys(this._graphics);\n }\n /**\n * Returns the currently displayed graphic\n */\n get current() {\n return this._graphics[this._current];\n }\n /**\n * Returns the currently displayed graphic offsets\n */\n get currentOptions() {\n return this._options[this._current];\n }\n /**\n * Returns all graphics associated with this component\n */\n get graphics() {\n return this._graphics;\n }\n /**\n * Returns all graphics options associated with this component\n */\n get options() {\n return this._options;\n }\n add(nameOrGraphic, graphicOrOptions, options) {\n let name = 'default';\n let graphicToSet = null;\n let optionsToSet = undefined;\n if (typeof nameOrGraphic === 'string' && graphicOrOptions instanceof _Graphic__WEBPACK_IMPORTED_MODULE_6__.Graphic) {\n name = nameOrGraphic;\n graphicToSet = graphicOrOptions;\n optionsToSet = options;\n }\n if (nameOrGraphic instanceof _Graphic__WEBPACK_IMPORTED_MODULE_6__.Graphic && !(graphicOrOptions instanceof _Graphic__WEBPACK_IMPORTED_MODULE_6__.Graphic)) {\n graphicToSet = nameOrGraphic;\n optionsToSet = graphicOrOptions;\n }\n if (!graphicToSet) {\n throw new Error('Need to provide a graphic or valid graphic string');\n }\n this._graphics[name] = this.copyGraphics ? graphicToSet.clone() : graphicToSet;\n this._options[name] = this.copyGraphics ? { ...optionsToSet } : optionsToSet;\n if (name === 'default') {\n this.use('default');\n }\n return graphicToSet;\n }\n /**\n * Removes a registered graphic, if the removed graphic is the current it will switch to the default\n * @param name\n */\n remove(name) {\n delete this._graphics[name];\n delete this._options[name];\n if (this._current === name) {\n this._current = 'default';\n this.recalculateBounds();\n }\n }\n /**\n * Use a graphic only, will set the default graphic. Returns the new {@apilink Graphic}\n *\n * Optionally override the stored options\n * @param nameOrGraphic\n * @param options\n */\n use(nameOrGraphic, options) {\n var _a;\n if (nameOrGraphic instanceof _Graphic__WEBPACK_IMPORTED_MODULE_6__.Graphic) {\n let graphic = nameOrGraphic;\n if (this.copyGraphics) {\n graphic = nameOrGraphic.clone();\n }\n this._current = 'default';\n this._graphics[this._current] = graphic;\n this._options[this._current] = options;\n }\n else {\n this._current = nameOrGraphic;\n this._options[this._current] = options;\n if (!(this._current in this._graphics)) {\n this._logger.warn(`Graphic ${this._current} is not registered with the graphics component owned by ${(_a = this.owner) === null || _a === void 0 ? void 0 : _a.name}. Nothing will be drawn.`);\n }\n }\n this.recalculateBounds();\n return this.current;\n }\n /**\n * Hide currently shown graphic\n */\n hide() {\n this._current = 'ex.none';\n }\n set localBounds(bounds) {\n this._localBounds = bounds;\n }\n recalculateBounds() {\n let bb = new _Collision_Index__WEBPACK_IMPORTED_MODULE_7__.BoundingBox();\n const graphic = this._graphics[this._current];\n const options = this._options[this._current];\n if (!graphic) {\n this._localBounds = bb;\n return;\n }\n let anchor = this.anchor;\n let offset = this.offset;\n if (options === null || options === void 0 ? void 0 : options.anchor) {\n anchor = options.anchor;\n }\n if (options === null || options === void 0 ? void 0 : options.offset) {\n offset = options.offset;\n }\n const bounds = graphic.localBounds;\n const offsetX = -bounds.width * anchor.x + offset.x;\n const offsetY = -bounds.height * anchor.y + offset.y;\n if (graphic instanceof _Graphics_GraphicsGroup__WEBPACK_IMPORTED_MODULE_8__.GraphicsGroup && !graphic.useAnchor) {\n bb = graphic === null || graphic === void 0 ? void 0 : graphic.localBounds.combine(bb);\n }\n else {\n bb = graphic === null || graphic === void 0 ? void 0 : graphic.localBounds.translate((0,_Math_vector__WEBPACK_IMPORTED_MODULE_5__.vec)(offsetX, offsetY)).combine(bb);\n }\n this._localBounds = bb;\n }\n /**\n * Get local bounds of graphics component\n */\n get localBounds() {\n if (!this._localBounds || this._localBounds.hasZeroDimensions()) {\n this.recalculateBounds();\n }\n return this._localBounds; // recalc guarantees type\n }\n /**\n * Get world bounds of graphics component\n */\n get bounds() {\n let bounds = this.localBounds;\n if (this.owner) {\n const tx = this.owner.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_9__.TransformComponent);\n if (tx) {\n bounds = bounds.transform(tx.get().matrix);\n }\n }\n return bounds;\n }\n /**\n * Update underlying graphics if necessary, called internally\n * @param elapsed\n * @internal\n */\n update(elapsed, idempotencyToken = 0) {\n const graphic = this.current;\n if (graphic && hasGraphicsTick(graphic)) {\n graphic.tick(elapsed, idempotencyToken);\n }\n }\n clone() {\n const graphics = new GraphicsComponent();\n graphics._graphics = { ...this._graphics };\n graphics._options = { ...this._options };\n graphics.offset = this.offset.clone();\n if (this.color) {\n graphics.color = this.color.clone();\n }\n graphics.opacity = this.opacity;\n graphics.anchor = this.anchor.clone();\n graphics.copyGraphics = this.copyGraphics;\n graphics.onPreDraw = this.onPreDraw;\n graphics.onPostDraw = this.onPostDraw;\n graphics.isVisible = this.isVisible;\n return graphics;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/GraphicsDiagnostics.ts\":\n/*!*****************************************!*\\\n !*** ./Graphics/GraphicsDiagnostics.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ GraphicsDiagnostics: () => (/* binding */ GraphicsDiagnostics)\n/* harmony export */ });\nclass GraphicsDiagnostics {\n static clear() {\n GraphicsDiagnostics.DrawCallCount = 0;\n GraphicsDiagnostics.DrawnImagesCount = 0;\n }\n}\nGraphicsDiagnostics.DrawCallCount = 0;\nGraphicsDiagnostics.DrawnImagesCount = 0;\n\n\n/***/ }),\n\n/***/ \"./Graphics/GraphicsGroup.ts\":\n/*!***********************************!*\\\n !*** ./Graphics/GraphicsGroup.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ GraphicsGroup: () => (/* binding */ GraphicsGroup)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Animation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Animation */ \"./Graphics/Animation.ts\");\n/* harmony import */ var _Collision_Index__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Collision/Index */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n\n\n\n\n\nclass GraphicsGroup extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n constructor(options) {\n var _a;\n super(options);\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this.useAnchor = true;\n this.members = [];\n this.members = options.members;\n this.useAnchor = (_a = options.useAnchor) !== null && _a !== void 0 ? _a : this.useAnchor;\n this._updateDimensions();\n }\n clone() {\n return new GraphicsGroup({\n members: [...this.members],\n ...this.cloneGraphicOptions()\n });\n }\n _updateDimensions() {\n const bb = this.localBounds;\n this.width = bb.width;\n this.height = bb.height;\n return bb;\n }\n get localBounds() {\n const bb = new _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox();\n for (const member of this.members) {\n if (member instanceof _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic) {\n member.localBounds.combine(bb, bb);\n }\n else {\n const { graphic, offset: pos, useBounds } = member;\n const shouldUseBounds = useBounds === undefined ? true : useBounds;\n if (graphic) {\n if (shouldUseBounds) {\n graphic.localBounds.translate(pos).combine(bb, bb);\n }\n }\n else {\n this._logger.warnOnce(`Graphics group member has an null or undefined graphic, member definition: ${JSON.stringify(member)}.`);\n }\n }\n }\n return bb;\n }\n _isAnimationOrGroup(graphic) {\n return graphic instanceof _Animation__WEBPACK_IMPORTED_MODULE_3__.Animation || graphic instanceof GraphicsGroup;\n }\n tick(elapsed, idempotencyToken) {\n for (const member of this.members) {\n let graphic;\n if (member instanceof _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic) {\n graphic = member;\n }\n else {\n graphic = member.graphic;\n }\n if (this._isAnimationOrGroup(graphic)) {\n graphic.tick(elapsed, idempotencyToken);\n }\n }\n }\n reset() {\n for (const member of this.members) {\n let graphic;\n if (member instanceof _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic) {\n graphic = member;\n }\n else {\n graphic = member.graphic;\n }\n if (this._isAnimationOrGroup(graphic)) {\n graphic.reset();\n }\n }\n }\n _preDraw(ex, x, y) {\n this._updateDimensions();\n super._preDraw(ex, this.useAnchor ? x : 0, this.useAnchor ? y : 0);\n }\n _drawImage(ex, x, y) {\n const pos = _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero;\n for (const member of this.members) {\n let graphic;\n if (member instanceof _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic) {\n graphic = member;\n }\n else {\n graphic = member.graphic;\n member.offset.clone(pos);\n }\n if (!graphic) {\n continue;\n }\n ex.save();\n ex.translate(x, y);\n graphic.draw(ex, pos.x, pos.y);\n if (this.showDebug) {\n /* istanbul ignore next */\n ex.debug.drawRect(0, 0, this.width, this.height);\n }\n ex.restore();\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/GraphicsSystem.ts\":\n/*!************************************!*\\\n !*** ./Graphics/GraphicsSystem.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ GraphicsSystem: () => (/* binding */ GraphicsSystem)\n/* harmony export */ });\n/* harmony import */ var _GraphicsComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Priority.ts\");\n/* harmony import */ var _GraphicsGroup__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./GraphicsGroup */ \"./Graphics/GraphicsGroup.ts\");\n/* harmony import */ var _ParallaxComponent__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./ParallaxComponent */ \"./Graphics/ParallaxComponent.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Math/coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../Collision/BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _FontCache__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./FontCache */ \"./Graphics/FontCache.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _Math_transform__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/transform */ \"./Math/transform.ts\");\n/* harmony import */ var _TransformInterpolation__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./TransformInterpolation */ \"./Graphics/TransformInterpolation.ts\");\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass GraphicsSystem extends _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_0__.System {\n get sortedTransforms() {\n return this._sortedTransforms;\n }\n constructor(world) {\n super();\n this.world = world;\n this.systemType = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_0__.SystemType.Draw;\n this._token = 0;\n this._sortedTransforms = [];\n this._zHasChanged = false;\n this._zIndexUpdate = () => {\n this._zHasChanged = true;\n };\n this._targetInterpolationTransform = new _Math_transform__WEBPACK_IMPORTED_MODULE_1__.Transform();\n this.query = this.world.query([_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent, _GraphicsComponent__WEBPACK_IMPORTED_MODULE_3__.GraphicsComponent]);\n this.query.entityAdded$.subscribe((e) => {\n const tx = e.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n this._sortedTransforms.push(tx);\n tx.zIndexChanged$.subscribe(this._zIndexUpdate);\n this._zHasChanged = true;\n });\n this.query.entityRemoved$.subscribe((e) => {\n const tx = e.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n tx.zIndexChanged$.unsubscribe(this._zIndexUpdate);\n const index = this._sortedTransforms.indexOf(tx);\n if (index > -1) {\n this._sortedTransforms.splice(index, 1);\n }\n });\n }\n initialize(world, scene) {\n this._camera = scene.camera;\n this._engine = scene.engine;\n }\n preupdate() {\n // Graphics context could be switched to fallback in a new frame\n this._graphicsContext = this._engine.graphicsContext;\n if (this._zHasChanged) {\n this._sortedTransforms.sort((a, b) => {\n return a.globalZ - b.globalZ;\n });\n this._zHasChanged = false;\n }\n }\n update(elapsed) {\n this._token++;\n let graphics;\n _FontCache__WEBPACK_IMPORTED_MODULE_4__.FontCache.checkAndClearCache();\n // This is a performance enhancement, most things are in world space\n // so if we can only do this once saves a ton of transform updates\n this._graphicsContext.save();\n if (this._camera) {\n this._camera.draw(this._graphicsContext);\n }\n for (let transformIndex = 0; transformIndex < this._sortedTransforms.length; transformIndex++) {\n const transform = this._sortedTransforms[transformIndex];\n const entity = transform.owner;\n // If the entity is offscreen skip\n if (entity.hasTag('ex.offscreen')) {\n continue;\n }\n graphics = entity.get(_GraphicsComponent__WEBPACK_IMPORTED_MODULE_3__.GraphicsComponent);\n // Exit if graphics set to not visible\n if (!graphics.isVisible) {\n continue;\n }\n // Optionally run the onPreTransformDraw graphics lifecycle draw\n if (graphics.onPreTransformDraw) {\n graphics.onPreTransformDraw(this._graphicsContext, elapsed);\n }\n entity.events.emit('pretransformdraw', new _Events__WEBPACK_IMPORTED_MODULE_5__.PreTransformDrawEvent(this._graphicsContext, elapsed, entity));\n // This optionally sets our camera based on the entity coord plan (world vs. screen)\n if (transform.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__.CoordPlane.Screen) {\n this._graphicsContext.restore();\n }\n this._graphicsContext.save();\n if (transform.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__.CoordPlane.Screen) {\n this._graphicsContext.translate(this._engine.screen.contentArea.left, this._engine.screen.contentArea.top);\n }\n // Tick any graphics state (but only once) for animations and graphics groups\n graphics.update(elapsed, this._token);\n // Apply parallax\n const parallax = entity.get(_ParallaxComponent__WEBPACK_IMPORTED_MODULE_7__.ParallaxComponent);\n if (parallax) {\n // We use the Tiled formula\n // https://doc.mapeditor.org/en/latest/manual/layers/#parallax-scrolling-factor\n // cameraPos * (1 - parallaxFactor)\n const oneMinusFactor = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.One.sub(parallax.parallaxFactor);\n const parallaxOffset = this._camera.drawPos.scale(oneMinusFactor);\n this._graphicsContext.translate(parallaxOffset.x, parallaxOffset.y);\n }\n // Position the entity + estimate lag\n this._applyTransform(entity);\n // If there is a material enable it on the context\n if (graphics.material) {\n this._graphicsContext.material = graphics.material;\n }\n // Optionally run the onPreDraw graphics lifecycle draw\n if (graphics.onPreDraw) {\n graphics.onPreDraw(this._graphicsContext, elapsed);\n }\n entity.events.emit('predraw', new _Events__WEBPACK_IMPORTED_MODULE_5__.PreDrawEvent(this._graphicsContext, elapsed, entity));\n // this._graphicsContext.opacity *= graphics.opacity;\n this._applyOpacity(entity);\n // Draw the graphics component\n this._drawGraphicsComponent(graphics, transform);\n // Optionally run the onPostDraw graphics lifecycle draw\n if (graphics.onPostDraw) {\n graphics.onPostDraw(this._graphicsContext, elapsed);\n }\n entity.events.emit('postdraw', new _Events__WEBPACK_IMPORTED_MODULE_5__.PostDrawEvent(this._graphicsContext, elapsed, entity));\n this._graphicsContext.restore();\n // Reset the transform back to the original world space\n if (transform.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__.CoordPlane.Screen) {\n this._graphicsContext.save();\n if (this._camera) {\n this._camera.draw(this._graphicsContext);\n }\n }\n // Optionally run the onPreTransformDraw graphics lifecycle draw\n if (graphics.onPostTransformDraw) {\n graphics.onPostTransformDraw(this._graphicsContext, elapsed);\n }\n entity.events.emit('posttransformdraw', new _Events__WEBPACK_IMPORTED_MODULE_5__.PostTransformDrawEvent(this._graphicsContext, elapsed, entity));\n }\n this._graphicsContext.restore();\n }\n _drawGraphicsComponent(graphicsComponent, transformComponent) {\n var _a, _b;\n if (graphicsComponent.isVisible) {\n const flipHorizontal = graphicsComponent.flipHorizontal;\n const flipVertical = graphicsComponent.flipVertical;\n const graphic = graphicsComponent.current;\n const options = (_a = graphicsComponent.currentOptions) !== null && _a !== void 0 ? _a : {};\n if (graphic) {\n let anchor = graphicsComponent.anchor;\n let offset = graphicsComponent.offset;\n let scaleX = 1;\n let scaleY = 1;\n // handle specific overrides\n if (options === null || options === void 0 ? void 0 : options.anchor) {\n anchor = options.anchor;\n }\n if (options === null || options === void 0 ? void 0 : options.offset) {\n offset = options.offset;\n }\n const globalScale = transformComponent.globalScale;\n scaleX *= graphic.scale.x * globalScale.x;\n scaleY *= graphic.scale.y * globalScale.y;\n // See https://github.com/excaliburjs/Excalibur/pull/619 for discussion on this formula\n const offsetX = -graphic.width * anchor.x + offset.x * scaleX;\n const offsetY = -graphic.height * anchor.y + offset.y * scaleY;\n const oldFlipHorizontal = graphic.flipHorizontal;\n const oldFlipVertical = graphic.flipVertical;\n if (flipHorizontal || flipVertical) {\n // flip any currently flipped graphics\n graphic.flipHorizontal = flipHorizontal ? !oldFlipHorizontal : oldFlipHorizontal;\n graphic.flipVertical = flipVertical ? !oldFlipVertical : oldFlipVertical;\n }\n graphic === null || graphic === void 0 ? void 0 : graphic.draw(this._graphicsContext, offsetX, offsetY);\n if (flipHorizontal || flipVertical) {\n graphic.flipHorizontal = oldFlipHorizontal;\n graphic.flipVertical = oldFlipVertical;\n }\n // TODO move debug code out?\n if (((_b = this._engine) === null || _b === void 0 ? void 0 : _b.isDebug) && this._engine.debug.graphics.showBounds) {\n const offset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_8__.vec)(offsetX, offsetY);\n if (graphic instanceof _GraphicsGroup__WEBPACK_IMPORTED_MODULE_9__.GraphicsGroup) {\n for (const member of graphic.members) {\n let g;\n let pos = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Zero;\n if (member instanceof _Graphic__WEBPACK_IMPORTED_MODULE_10__.Graphic) {\n g = member;\n }\n else {\n g = member.graphic;\n pos = member.offset;\n }\n if (graphic.useAnchor) {\n g === null || g === void 0 ? void 0 : g.localBounds.translate(offset.add(pos)).draw(this._graphicsContext, this._engine.debug.graphics.boundsColor);\n }\n else {\n g === null || g === void 0 ? void 0 : g.localBounds.translate(pos).draw(this._graphicsContext, this._engine.debug.graphics.boundsColor);\n }\n }\n }\n else {\n /* istanbul ignore next */\n graphic === null || graphic === void 0 ? void 0 : graphic.localBounds.translate(offset).draw(this._graphicsContext, this._engine.debug.graphics.boundsColor);\n }\n }\n }\n }\n }\n /**\n * This applies the current entity transform to the graphics context\n * @param entity\n */\n _applyTransform(entity) {\n const ancestors = entity.getAncestors();\n for (let i = 0; i < ancestors.length; i++) {\n const ancestor = ancestors[i];\n const transform = ancestor === null || ancestor === void 0 ? void 0 : ancestor.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n const optionalBody = ancestor === null || ancestor === void 0 ? void 0 : ancestor.get(_Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_11__.BodyComponent);\n if (transform) {\n let tx = transform.get();\n if (optionalBody) {\n if (this._engine.fixedUpdateTimestep && optionalBody.__oldTransformCaptured && optionalBody.enableFixedUpdateInterpolate) {\n // Interpolate graphics if needed\n const blend = this._engine.currentFrameLagMs / this._engine.fixedUpdateTimestep;\n tx = (0,_TransformInterpolation__WEBPACK_IMPORTED_MODULE_12__.blendTransform)(optionalBody.oldTransform, transform.get(), blend, this._targetInterpolationTransform);\n }\n }\n this._graphicsContext.z = transform.globalZ;\n this._graphicsContext.translate(tx.pos.x, tx.pos.y);\n this._graphicsContext.scale(tx.scale.x, tx.scale.y);\n this._graphicsContext.rotate(tx.rotation);\n }\n }\n }\n _applyOpacity(entity) {\n var _a;\n const ancestors = entity.getAncestors();\n for (let i = 0; i < ancestors.length; i++) {\n const ancestor = ancestors[i];\n const maybeGraphics = ancestor === null || ancestor === void 0 ? void 0 : ancestor.get(_GraphicsComponent__WEBPACK_IMPORTED_MODULE_3__.GraphicsComponent);\n this._graphicsContext.opacity *= (_a = maybeGraphics === null || maybeGraphics === void 0 ? void 0 : maybeGraphics.opacity) !== null && _a !== void 0 ? _a : 1;\n }\n }\n}\nGraphicsSystem.priority = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_13__.SystemPriority.Average;\n\n\n/***/ }),\n\n/***/ \"./Graphics/ImageSource.ts\":\n/*!*********************************!*\\\n !*** ./Graphics/ImageSource.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ImageSource: () => (/* binding */ ImageSource),\n/* harmony export */ ImageSourceAttributeConstants: () => (/* binding */ ImageSourceAttributeConstants)\n/* harmony export */ });\n/* harmony import */ var _Resources_Resource__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Resources/Resource */ \"./Resources/Resource.ts\");\n/* harmony import */ var _Sprite__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Sprite */ \"./Graphics/Sprite.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Future */ \"./Util/Future.ts\");\n/* harmony import */ var _Graphics_Context_texture_loader__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Graphics/Context/texture-loader */ \"./Graphics/Context/texture-loader.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Wrapping */ \"./Graphics/Wrapping.ts\");\n\n\n\n\n\n\n\nconst ImageSourceAttributeConstants = {\n Filtering: 'filtering',\n WrappingX: 'wrapping-x',\n WrappingY: 'wrapping-y'\n};\nclass ImageSource {\n /**\n * The original size of the source image in pixels\n */\n get width() {\n return this.image.naturalWidth;\n }\n /**\n * The original height of the source image in pixels\n */\n get height() {\n return this.image.naturalHeight;\n }\n /**\n * Returns true if the Texture is completely loaded and is ready\n * to be drawn.\n */\n isLoaded() {\n if (!this._src) {\n // this boosts speed of access\n this._src = this.data.src;\n }\n return !!this._src;\n }\n get image() {\n return this.data;\n }\n constructor(pathOrBase64, bustCacheOrOptions, filtering) {\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance();\n /**\n * Access to the underlying html image element\n */\n this.data = new Image();\n this._readyFuture = new _Util_Future__WEBPACK_IMPORTED_MODULE_1__.Future();\n /**\n * Promise the resolves when the image is loaded and ready for use, does not initiate loading\n */\n this.ready = this._readyFuture.promise;\n this.path = pathOrBase64;\n let bustCache = false;\n let wrapping;\n if (typeof bustCacheOrOptions === 'boolean') {\n bustCache = bustCacheOrOptions;\n }\n else {\n ({ filtering, wrapping, bustCache } = { ...bustCacheOrOptions });\n }\n this._resource = new _Resources_Resource__WEBPACK_IMPORTED_MODULE_2__.Resource(pathOrBase64, 'blob', bustCache);\n this.filtering = filtering !== null && filtering !== void 0 ? filtering : this.filtering;\n if (typeof wrapping === 'string') {\n this.wrapping = {\n x: wrapping,\n y: wrapping\n };\n }\n else {\n this.wrapping = wrapping !== null && wrapping !== void 0 ? wrapping : this.wrapping;\n }\n if (pathOrBase64.endsWith('.gif')) {\n this._logger.warn(`Use the ex.Gif type to load gifs, you may have mixed results with ${pathOrBase64} in ex.ImageSource. Fully supported: svg, jpg, bmp, and png`);\n }\n }\n /**\n * Create an ImageSource from and HTML tag element\n * @param image\n */\n static fromHtmlImageElement(image, options) {\n const imageSource = new ImageSource('');\n imageSource._src = 'image-element';\n imageSource.data = image;\n imageSource.data.setAttribute('data-original-src', 'image-element');\n if (options === null || options === void 0 ? void 0 : options.filtering) {\n imageSource.data.setAttribute(ImageSourceAttributeConstants.Filtering, options === null || options === void 0 ? void 0 : options.filtering);\n }\n else {\n imageSource.data.setAttribute(ImageSourceAttributeConstants.Filtering, _Filtering__WEBPACK_IMPORTED_MODULE_3__.ImageFiltering.Blended);\n }\n if (options === null || options === void 0 ? void 0 : options.wrapping) {\n let wrapping;\n if (typeof options.wrapping === 'string') {\n wrapping = {\n x: options.wrapping,\n y: options.wrapping\n };\n }\n else {\n wrapping = {\n x: options.wrapping.x,\n y: options.wrapping.y\n };\n }\n imageSource.data.setAttribute(ImageSourceAttributeConstants.WrappingX, wrapping.x);\n imageSource.data.setAttribute(ImageSourceAttributeConstants.WrappingY, wrapping.y);\n }\n else {\n imageSource.data.setAttribute(ImageSourceAttributeConstants.WrappingX, _Wrapping__WEBPACK_IMPORTED_MODULE_4__.ImageWrapping.Clamp);\n imageSource.data.setAttribute(ImageSourceAttributeConstants.WrappingY, _Wrapping__WEBPACK_IMPORTED_MODULE_4__.ImageWrapping.Clamp);\n }\n _Graphics_Context_texture_loader__WEBPACK_IMPORTED_MODULE_5__.TextureLoader.checkImageSizeSupportedAndLog(image);\n imageSource._readyFuture.resolve(image);\n return imageSource;\n }\n static fromHtmlCanvasElement(image, options) {\n const imageSource = new ImageSource('');\n imageSource._src = 'canvas-element-blob';\n imageSource.data.setAttribute('data-original-src', 'canvas-element-blob');\n if (options === null || options === void 0 ? void 0 : options.filtering) {\n imageSource.data.setAttribute(ImageSourceAttributeConstants.Filtering, options === null || options === void 0 ? void 0 : options.filtering);\n }\n else {\n imageSource.data.setAttribute(ImageSourceAttributeConstants.Filtering, _Filtering__WEBPACK_IMPORTED_MODULE_3__.ImageFiltering.Blended);\n }\n if (options === null || options === void 0 ? void 0 : options.wrapping) {\n let wrapping;\n if (typeof options.wrapping === 'string') {\n wrapping = {\n x: options.wrapping,\n y: options.wrapping\n };\n }\n else {\n wrapping = {\n x: options.wrapping.x,\n y: options.wrapping.y\n };\n }\n imageSource.data.setAttribute(ImageSourceAttributeConstants.WrappingX, wrapping.x);\n imageSource.data.setAttribute(ImageSourceAttributeConstants.WrappingY, wrapping.y);\n }\n else {\n imageSource.data.setAttribute(ImageSourceAttributeConstants.WrappingX, _Wrapping__WEBPACK_IMPORTED_MODULE_4__.ImageWrapping.Clamp);\n imageSource.data.setAttribute(ImageSourceAttributeConstants.WrappingY, _Wrapping__WEBPACK_IMPORTED_MODULE_4__.ImageWrapping.Clamp);\n }\n _Graphics_Context_texture_loader__WEBPACK_IMPORTED_MODULE_5__.TextureLoader.checkImageSizeSupportedAndLog(image);\n image.toBlob((blob) => {\n // TODO throw? if blob null?\n const url = URL.createObjectURL(blob);\n imageSource.image.onload = () => {\n // no longer need to read the blob so it's revoked\n URL.revokeObjectURL(url);\n imageSource.data = imageSource.image;\n imageSource._readyFuture.resolve(imageSource.image);\n };\n imageSource.image.src = url;\n });\n return imageSource;\n }\n static fromSvgString(svgSource, options) {\n const blob = new Blob([svgSource], { type: 'image/svg+xml' });\n const url = URL.createObjectURL(blob);\n return new ImageSource(url, options);\n }\n /**\n * Should excalibur add a cache busting querystring? By default false.\n * Must be set before loading\n */\n get bustCache() {\n return this._resource.bustCache;\n }\n set bustCache(val) {\n this._resource.bustCache = val;\n }\n /**\n * Begins loading the image and returns a promise that resolves when the image is loaded\n */\n async load() {\n var _a, _b, _c, _d;\n if (this.isLoaded()) {\n return this.data;\n }\n try {\n // Load base64 or blob if needed\n let url;\n if (!this.path.includes('data:image/')) {\n const blob = await this._resource.load();\n url = URL.createObjectURL(blob);\n }\n else {\n url = this.path;\n }\n // Decode the image\n const image = new Image();\n // Use Image.onload over Image.decode()\n // https://bugs.chromium.org/p/chromium/issues/detail?id=1055828#c7\n // Otherwise chrome will throw still Image.decode() failures for large textures\n const loadedFuture = new _Util_Future__WEBPACK_IMPORTED_MODULE_1__.Future();\n image.onload = () => loadedFuture.resolve();\n image.src = url;\n image.setAttribute('data-original-src', this.path);\n await loadedFuture.promise;\n // Set results\n // We defer loading the texture into webgl until the first draw that way we avoid a singleton\n // and for the multi-engine case the texture needs to be created in EACH webgl context to work\n // See image-renderer.ts draw()\n this.data = image;\n // emit warning if potentially too big\n _Graphics_Context_texture_loader__WEBPACK_IMPORTED_MODULE_5__.TextureLoader.checkImageSizeSupportedAndLog(this.data);\n }\n catch (error) {\n throw `Error loading ImageSource from path '${this.path}' with error [${error.message}]`;\n }\n // Do a bad thing to pass the filtering as an attribute\n this.data.setAttribute(ImageSourceAttributeConstants.Filtering, this.filtering); // TODO fix type\n this.data.setAttribute(ImageSourceAttributeConstants.WrappingX, (_b = (_a = this.wrapping) === null || _a === void 0 ? void 0 : _a.x) !== null && _b !== void 0 ? _b : _Wrapping__WEBPACK_IMPORTED_MODULE_4__.ImageWrapping.Clamp);\n this.data.setAttribute(ImageSourceAttributeConstants.WrappingY, (_d = (_c = this.wrapping) === null || _c === void 0 ? void 0 : _c.y) !== null && _d !== void 0 ? _d : _Wrapping__WEBPACK_IMPORTED_MODULE_4__.ImageWrapping.Clamp);\n // todo emit complete\n this._readyFuture.resolve(this.data);\n return this.data;\n }\n /**\n * Build a sprite from this ImageSource\n */\n toSprite(options) {\n return _Sprite__WEBPACK_IMPORTED_MODULE_6__.Sprite.from(this, options);\n }\n /**\n * Unload images from memory\n */\n unload() {\n this.data = new Image();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Line.ts\":\n/*!**************************!*\\\n !*** ./Graphics/Line.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Line: () => (/* binding */ Line)\n/* harmony export */ });\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n\n\n\nclass Line extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n constructor(options) {\n super();\n this.color = _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Black;\n this.thickness = 1;\n const { start, end, color, thickness } = options;\n this.start = start;\n this.end = end;\n this.color = color !== null && color !== void 0 ? color : this.color;\n this.thickness = thickness !== null && thickness !== void 0 ? thickness : this.thickness;\n this._localBounds = this._calculateBounds();\n const { width, height } = this._localBounds;\n this.width = width;\n this.height = height;\n }\n get localBounds() {\n return this._localBounds;\n }\n _calculateBounds() {\n const lineNormal = this.end.sub(this.start).normal();\n const halfThickness = this.thickness / 2;\n const points = [\n this.start.add(lineNormal.scale(halfThickness)),\n this.end.add(lineNormal.scale(halfThickness)),\n this.end.add(lineNormal.scale(-halfThickness)),\n this.start.add(lineNormal.scale(-halfThickness))\n ];\n return _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromPoints(points);\n }\n _drawImage(ctx, _x, _y) {\n ctx.drawLine(this.start, this.end, this.color, this.thickness);\n }\n clone() {\n return new Line({\n start: this.start,\n end: this.end,\n color: this.color,\n thickness: this.thickness\n });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/NineSlice.ts\":\n/*!*******************************!*\\\n !*** ./Graphics/NineSlice.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ NineSlice: () => (/* binding */ NineSlice),\n/* harmony export */ NineSliceStretch: () => (/* binding */ NineSliceStretch)\n/* harmony export */ });\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n\n\n\n/**\n * Nine slice stretch mode\n */\nvar NineSliceStretch;\n(function (NineSliceStretch) {\n /**\n * Stretch the image across a dimension\n */\n NineSliceStretch[\"Stretch\"] = \"stretch\";\n /**\n * Tile the image across a dimension\n */\n NineSliceStretch[\"Tile\"] = \"tile\";\n /**\n * Tile the image across a dimension but only by whole image amounts\n */\n NineSliceStretch[\"TileFit\"] = \"tile-fit\";\n})(NineSliceStretch || (NineSliceStretch = {}));\nclass NineSlice extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n constructor(config) {\n super(config);\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this._config = config;\n this._imgSource = config.source;\n this._canvasA = document.createElement('canvas');\n this._canvasB = document.createElement('canvas');\n this._canvasC = document.createElement('canvas');\n this._canvasD = document.createElement('canvas');\n this._canvasE = document.createElement('canvas');\n this._canvasF = document.createElement('canvas');\n this._canvasG = document.createElement('canvas');\n this._canvasH = document.createElement('canvas');\n this._canvasI = document.createElement('canvas');\n this._initialize();\n this._imgSource.ready.then(() => {\n this._initialize();\n });\n }\n /**\n * Sets the target width of the 9 slice (pixels), and recalculates the 9 slice if desired (auto)\n * @param newWidth\n * @param auto\n */\n setTargetWidth(newWidth, auto = false) {\n this._config.width = newWidth;\n if (auto) {\n this._initialize();\n }\n }\n /**\n * Sets the target height of the 9 slice (pixels), and recalculates the 9 slice if desired (auto)\n * @param newHeight\n * @param auto\n */\n setTargetHeight(newHeight, auto = false) {\n this._config.height = newHeight;\n if (auto) {\n this._initialize();\n }\n }\n /**\n * Sets the 9 slice margins (pixels), and recalculates the 9 slice if desired (auto)\n */\n setMargins(left, top, right, bottom, auto = false) {\n this._config.sourceConfig.leftMargin = left;\n this._config.sourceConfig.topMargin = top;\n this._config.sourceConfig.rightMargin = right;\n this._config.sourceConfig.bottomMargin = bottom;\n if (auto) {\n this._initialize();\n }\n }\n /**\n * Sets the stretching strategy for the 9 slice, and recalculates the 9 slice if desired (auto)\n *\n */\n setStretch(type, stretch, auto = false) {\n if (type === 'horizontal') {\n this._config.destinationConfig.horizontalStretch = stretch;\n }\n else if (type === 'vertical') {\n this._config.destinationConfig.verticalStretch = stretch;\n }\n else {\n this._config.destinationConfig.horizontalStretch = stretch;\n this._config.destinationConfig.verticalStretch = stretch;\n }\n if (auto) {\n this._initialize();\n }\n }\n /**\n * Returns the config of the 9 slice\n */\n getConfig() {\n return this._config;\n }\n /**\n * Draws 1 of the 9 tiles based on parameters passed in\n * context is the ExcaliburGraphicsContext from the _drawImage function\n * destinationSize is the size of the destination image as a vector (width,height)\n * targetCanvas is the canvas to draw to\n * horizontalStretch and verticalStretch are the horizontal and vertical stretching strategies\n * marginW and marginH are optional margins for the 9 slice for positioning\n * @param context\n * @param targetCanvas\n * @param destinationSize\n * @param horizontalStretch\n * @param verticalStretch\n * @param marginWidth\n * @param marginHeight\n */\n _drawTile(context, targetCanvas, destinationSize, horizontalStretch, verticalStretch, marginWidth, marginHeight) {\n const tempMarginW = marginWidth || 0;\n const tempMarginH = marginHeight || 0;\n let tempSizeX, tempPositionX, tempSizeY, tempPositionY;\n const numTilesX = this._getNumberOfTiles(targetCanvas.width, destinationSize.x, horizontalStretch);\n const numTilesY = this._getNumberOfTiles(targetCanvas.height, destinationSize.y, verticalStretch);\n for (let i = 0; i < numTilesX; i++) {\n for (let j = 0; j < numTilesY; j++) {\n let { tempSize, tempPosition } = this._calculateParams(i, numTilesX, targetCanvas.width, destinationSize.x, this._config.destinationConfig.horizontalStretch);\n tempSizeX = tempSize;\n tempPositionX = tempPosition;\n ({ tempSize, tempPosition } = this._calculateParams(j, numTilesY, targetCanvas.height, destinationSize.y, this._config.destinationConfig.verticalStretch));\n tempSizeY = tempSize;\n tempPositionY = tempPosition;\n context.drawImage(targetCanvas, 0, 0, targetCanvas.width, targetCanvas.height, tempMarginW + tempPositionX, tempMarginH + tempPositionY, tempSizeX, tempSizeY);\n }\n }\n }\n /**\n * Draws the 9 slices to the canvas\n */\n _drawImage(ex, x, y) {\n if (this._imgSource.isLoaded()) {\n // Top left, no stretching\n this._drawTile(ex, this._canvasA, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.sourceConfig.leftMargin, this._config.sourceConfig.topMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch);\n // Top, middle, horizontal stretching\n this._drawTile(ex, this._canvasB, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.width - this._config.sourceConfig.leftMargin - this._config.sourceConfig.rightMargin, this._config.sourceConfig.topMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch, this._config.sourceConfig.leftMargin, 0);\n // Top right, no stretching\n this._drawTile(ex, this._canvasC, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.sourceConfig.rightMargin, this._config.sourceConfig.topMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch, this._config.width - this._config.sourceConfig.rightMargin, 0);\n // middle, left, vertical stretching\n this._drawTile(ex, this._canvasD, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.sourceConfig.leftMargin, this._config.height - this._config.sourceConfig.bottomMargin - this._config.sourceConfig.topMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch, 0, this._config.sourceConfig.topMargin);\n // center, both stretching\n if (this._config.destinationConfig.drawCenter) {\n this._drawTile(ex, this._canvasE, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.width - this._config.sourceConfig.leftMargin - this._config.sourceConfig.rightMargin, this._config.height - this._config.sourceConfig.bottomMargin - this._config.sourceConfig.topMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch, this._config.sourceConfig.leftMargin, this._config.sourceConfig.topMargin);\n }\n // middle, right, vertical stretching\n this._drawTile(ex, this._canvasF, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.sourceConfig.rightMargin, this._config.height - this._config.sourceConfig.bottomMargin - this._config.sourceConfig.topMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch, this._config.width - this._config.sourceConfig.rightMargin, this._config.sourceConfig.topMargin);\n // bottom left, no stretching\n this._drawTile(ex, this._canvasG, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.sourceConfig.leftMargin, this._config.sourceConfig.bottomMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch, 0, this._config.height - this._config.sourceConfig.bottomMargin);\n // bottom middle, horizontal stretching\n this._drawTile(ex, this._canvasH, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.width - this._config.sourceConfig.leftMargin - this._config.sourceConfig.rightMargin, this._config.sourceConfig.bottomMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch, this._config.sourceConfig.leftMargin, this._config.height - this._config.sourceConfig.bottomMargin);\n // bottom right, no stretching\n this._drawTile(ex, this._canvasI, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.sourceConfig.rightMargin, this._config.sourceConfig.bottomMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch, this._config.width - this._config.sourceConfig.rightMargin, this._config.height - this._config.sourceConfig.bottomMargin);\n }\n else {\n this._logger.warnOnce(`NineSlice ImageSource ${this._imgSource.path}` +\n ` is not yet loaded and won't be drawn. Please call .load() or include in a Loader.\\n\\n` +\n `Read https://excaliburjs.com/docs/imagesource for more information.`);\n }\n }\n /**\n * Slices the source sprite into the 9 slice canvases internally\n */\n _initialize() {\n this._sourceSprite = this._imgSource.image;\n // top left slice\n this._canvasA.width = this._config.sourceConfig.leftMargin;\n this._canvasA.height = this._config.sourceConfig.topMargin;\n const aCtx = this._canvasA.getContext('2d');\n aCtx === null || aCtx === void 0 ? void 0 : aCtx.drawImage(this._sourceSprite, 0, 0, this._canvasA.width, this._canvasA.height, 0, 0, this._canvasA.width, this._canvasA.height);\n // top slice\n this._canvasB.width = this._config.sourceConfig.width - this._config.sourceConfig.leftMargin - this._config.sourceConfig.rightMargin;\n this._canvasB.height = this._config.sourceConfig.topMargin;\n const bCtx = this._canvasB.getContext('2d');\n bCtx === null || bCtx === void 0 ? void 0 : bCtx.drawImage(this._sourceSprite, this._config.sourceConfig.leftMargin, 0, this._canvasB.width, this._canvasB.height, 0, 0, this._canvasB.width, this._canvasB.height);\n // top right slice\n this._canvasC.width = this._config.sourceConfig.rightMargin;\n this._canvasC.height = this._config.sourceConfig.topMargin;\n const cCtx = this._canvasC.getContext('2d');\n cCtx === null || cCtx === void 0 ? void 0 : cCtx.drawImage(this._sourceSprite, this._sourceSprite.width - this._config.sourceConfig.rightMargin, 0, this._canvasC.width, this._canvasC.height, 0, 0, this._canvasC.width, this._canvasC.height);\n // middle left slice\n this._canvasD.width = this._config.sourceConfig.leftMargin;\n this._canvasD.height = this._config.sourceConfig.height - this._config.sourceConfig.topMargin - this._config.sourceConfig.bottomMargin;\n const dCtx = this._canvasD.getContext('2d');\n dCtx === null || dCtx === void 0 ? void 0 : dCtx.drawImage(this._sourceSprite, 0, this._config.sourceConfig.topMargin, this._canvasD.width, this._canvasD.height, 0, 0, this._canvasD.width, this._canvasD.height);\n // middle slice\n this._canvasE.width = this._config.sourceConfig.width - this._config.sourceConfig.leftMargin - this._config.sourceConfig.rightMargin;\n this._canvasE.height = this._config.sourceConfig.height - this._config.sourceConfig.topMargin - this._config.sourceConfig.bottomMargin;\n const eCtx = this._canvasE.getContext('2d');\n eCtx === null || eCtx === void 0 ? void 0 : eCtx.drawImage(this._sourceSprite, this._config.sourceConfig.leftMargin, this._config.sourceConfig.topMargin, this._canvasE.width, this._canvasE.height, 0, 0, this._canvasE.width, this._canvasE.height);\n // middle right slice\n this._canvasF.width = this._config.sourceConfig.rightMargin;\n this._canvasF.height = this._config.sourceConfig.height - this._config.sourceConfig.topMargin - this._config.sourceConfig.bottomMargin;\n const fCtx = this._canvasF.getContext('2d');\n fCtx === null || fCtx === void 0 ? void 0 : fCtx.drawImage(this._sourceSprite, this._config.sourceConfig.width - this._config.sourceConfig.rightMargin, this._config.sourceConfig.topMargin, this._canvasF.width, this._canvasF.height, 0, 0, this._canvasF.width, this._canvasF.height);\n // bottom left slice\n this._canvasG.width = this._config.sourceConfig.leftMargin;\n this._canvasG.height = this._config.sourceConfig.bottomMargin;\n const gCtx = this._canvasG.getContext('2d');\n gCtx === null || gCtx === void 0 ? void 0 : gCtx.drawImage(this._sourceSprite, 0, this._config.sourceConfig.height - this._config.sourceConfig.bottomMargin, this._canvasG.width, this._canvasG.height, 0, 0, this._canvasG.width, this._canvasG.height);\n // bottom slice\n this._canvasH.width = this._config.sourceConfig.width - this._config.sourceConfig.leftMargin - this._config.sourceConfig.rightMargin;\n this._canvasH.height = this._config.sourceConfig.bottomMargin;\n const hCtx = this._canvasH.getContext('2d');\n hCtx === null || hCtx === void 0 ? void 0 : hCtx.drawImage(this._sourceSprite, this._config.sourceConfig.leftMargin, this._config.sourceConfig.height - this._config.sourceConfig.bottomMargin, this._canvasH.width, this._canvasH.height, 0, 0, this._canvasH.width, this._canvasH.height);\n // bottom right slice\n this._canvasI.width = this._config.sourceConfig.rightMargin;\n this._canvasI.height = this._config.sourceConfig.bottomMargin;\n const iCtx = this._canvasI.getContext('2d');\n iCtx === null || iCtx === void 0 ? void 0 : iCtx.drawImage(this._sourceSprite, this._sourceSprite.width - this._config.sourceConfig.rightMargin, this._config.sourceConfig.height - this._config.sourceConfig.bottomMargin, this._canvasI.width, this._canvasI.height, 0, 0, this._canvasI.width, this._canvasI.height);\n }\n /**\n * Clones the 9 slice\n */\n clone() {\n return new NineSlice(this._config);\n }\n /**\n * Returns the number of tiles\n */\n _getNumberOfTiles(tileSize, destinationSize, strategy) {\n switch (strategy) {\n case NineSliceStretch.Stretch:\n return 1;\n case NineSliceStretch.Tile:\n return Math.ceil(destinationSize / tileSize);\n case NineSliceStretch.TileFit:\n return Math.ceil(destinationSize / tileSize);\n }\n }\n /**\n * Returns the position and size of the tile\n */\n _calculateParams(tileNum, numTiles, tileSize, destinationSize, strategy) {\n switch (strategy) {\n case NineSliceStretch.Stretch:\n return {\n tempPosition: 0,\n tempSize: destinationSize\n };\n case NineSliceStretch.Tile:\n // if last tile, adjust size\n if (tileNum === numTiles - 1) {\n //last tile\n return {\n tempPosition: tileNum * tileSize,\n tempSize: tileSize - (numTiles * tileSize - destinationSize)\n };\n }\n else {\n return {\n tempPosition: tileNum * tileSize,\n tempSize: tileSize\n };\n }\n case NineSliceStretch.TileFit:\n const reducedTileSize = destinationSize / numTiles;\n const position = tileNum * reducedTileSize;\n return {\n tempPosition: position,\n tempSize: reducedTileSize\n };\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/OffscreenSystem.ts\":\n/*!*************************************!*\\\n !*** ./Graphics/OffscreenSystem.ts ***!\n \\*************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ OffscreenSystem: () => (/* binding */ OffscreenSystem)\n/* harmony export */ });\n/* harmony import */ var _GraphicsComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _ParallaxComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./ParallaxComponent */ \"./Graphics/ParallaxComponent.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Math/coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Priority.ts\");\n\n\n\n\n\n\n\n\nclass OffscreenSystem extends _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.System {\n constructor(world) {\n super();\n this.world = world;\n this.systemType = _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.SystemType.Draw;\n this.query = this.world.query([_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent, _GraphicsComponent__WEBPACK_IMPORTED_MODULE_2__.GraphicsComponent]);\n }\n initialize(world, scene) {\n this._camera = scene.camera;\n this._screen = scene.engine.screen;\n }\n update() {\n this._worldBounds = this._screen.getWorldBounds();\n let transform;\n let graphics;\n let maybeParallax;\n for (let i = 0; i < this.query.entities.length; i++) {\n const entity = this.query.entities[i];\n graphics = entity.get(_GraphicsComponent__WEBPACK_IMPORTED_MODULE_2__.GraphicsComponent);\n transform = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n maybeParallax = entity.get(_ParallaxComponent__WEBPACK_IMPORTED_MODULE_3__.ParallaxComponent);\n let parallaxOffset;\n if (maybeParallax) {\n // We use the Tiled formula\n // https://doc.mapeditor.org/en/latest/manual/layers/#parallax-scrolling-factor\n // cameraPos * (1 - parallaxFactor)\n const oneMinusFactor = _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.One.sub(maybeParallax.parallaxFactor);\n parallaxOffset = this._camera.pos.scale(oneMinusFactor);\n }\n // Figure out if entities are offscreen\n const entityOffscreen = this._isOffscreen(transform, graphics, parallaxOffset);\n if (entityOffscreen && !entity.hasTag('ex.offscreen')) {\n entity.events.emit('exitviewport', new _Events__WEBPACK_IMPORTED_MODULE_5__.ExitViewPortEvent(entity));\n entity.addTag('ex.offscreen');\n }\n if (!entityOffscreen && entity.hasTag('ex.offscreen')) {\n entity.events.emit('enterviewport', new _Events__WEBPACK_IMPORTED_MODULE_5__.EnterViewPortEvent(entity));\n entity.removeTag('ex.offscreen');\n }\n }\n }\n _isOffscreen(transform, graphics, parallaxOffset) {\n if (graphics.forceOnScreen) {\n return false;\n }\n if (transform.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__.CoordPlane.World) {\n let bounds = graphics.localBounds;\n if (parallaxOffset) {\n bounds = bounds.translate(parallaxOffset);\n }\n const transformedBounds = bounds.transform(transform.get().matrix);\n const graphicsOffscreen = !this._worldBounds.overlaps(transformedBounds);\n return graphicsOffscreen;\n }\n else {\n // TODO screen coordinates\n return false;\n }\n }\n}\nOffscreenSystem.priority = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_7__.SystemPriority.Higher;\n\n\n/***/ }),\n\n/***/ \"./Graphics/ParallaxComponent.ts\":\n/*!***************************************!*\\\n !*** ./Graphics/ParallaxComponent.ts ***!\n \\***************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ParallaxComponent: () => (/* binding */ ParallaxComponent)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Component */ \"./EntityComponentSystem/Component.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n\n\nclass ParallaxComponent extends _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor(parallaxFactor) {\n super();\n this.parallaxFactor = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(1.0, 1.0);\n this.parallaxFactor = parallaxFactor !== null && parallaxFactor !== void 0 ? parallaxFactor : this.parallaxFactor;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Polygon.ts\":\n/*!*****************************!*\\\n !*** ./Graphics/Polygon.ts ***!\n \\*****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Polygon: () => (/* binding */ Polygon)\n/* harmony export */ });\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Raster__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Raster */ \"./Graphics/Raster.ts\");\n\n\n\n/**\n * A polygon {@apilink Graphic} for drawing arbitrary polygons to the {@apilink ExcaliburGraphicsContext}\n *\n * Polygons default to {@apilink ImageFiltering.Blended}\n */\nclass Polygon extends _Raster__WEBPACK_IMPORTED_MODULE_0__.Raster {\n get points() {\n return this._points;\n }\n set points(points) {\n this._points = points;\n const min = this.minPoint;\n this.width = this._points.reduce((max, p) => Math.max(p.x, max), 0) - min.x;\n this.height = this._points.reduce((max, p) => Math.max(p.y, max), 0) - min.y;\n this.flagDirty();\n }\n get minPoint() {\n const minX = this._points.reduce((min, p) => Math.min(p.x, min), Infinity);\n const minY = this._points.reduce((min, p) => Math.min(p.y, min), Infinity);\n return (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(minX, minY);\n }\n constructor(options) {\n super(options);\n this._points = [];\n this.points = options.points;\n this.filtering = _Filtering__WEBPACK_IMPORTED_MODULE_2__.ImageFiltering.Blended;\n this.rasterize();\n }\n clone() {\n return new Polygon({\n points: this.points.map((p) => p.clone()),\n ...this.cloneGraphicOptions(),\n ...this.cloneRasterOptions()\n });\n }\n execute(ctx) {\n if (this.points && this.points.length) {\n ctx.beginPath();\n // Iterate through the supplied points and construct a 'polygon'\n const min = this.minPoint.negate();\n const firstPoint = this.points[0].add(min);\n ctx.moveTo(firstPoint.x, firstPoint.y);\n this.points.forEach((point) => {\n ctx.lineTo(point.x + min.x, point.y + min.y);\n });\n ctx.lineTo(firstPoint.x, firstPoint.y);\n ctx.closePath();\n if (this.color) {\n ctx.fill();\n }\n if (this.strokeColor) {\n ctx.stroke();\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/PostProcessor/ColorBlindnessMode.ts\":\n/*!******************************************************!*\\\n !*** ./Graphics/PostProcessor/ColorBlindnessMode.ts ***!\n \\******************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ColorBlindnessMode: () => (/* binding */ ColorBlindnessMode)\n/* harmony export */ });\nvar ColorBlindnessMode;\n(function (ColorBlindnessMode) {\n ColorBlindnessMode[\"Protanope\"] = \"Protanope\";\n ColorBlindnessMode[\"Deuteranope\"] = \"Deuteranope\";\n ColorBlindnessMode[\"Tritanope\"] = \"Tritanope\";\n})(ColorBlindnessMode || (ColorBlindnessMode = {}));\n\n\n/***/ }),\n\n/***/ \"./Graphics/PostProcessor/ColorBlindnessPostProcessor.ts\":\n/*!***************************************************************!*\\\n !*** ./Graphics/PostProcessor/ColorBlindnessPostProcessor.ts ***!\n \\***************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ColorBlindnessPostProcessor: () => (/* binding */ ColorBlindnessPostProcessor)\n/* harmony export */ });\n/* harmony import */ var _color_blind_fragment_glsl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./color-blind-fragment.glsl */ \"./Graphics/PostProcessor/color-blind-fragment.glsl\");\n/* harmony import */ var _ColorBlindnessMode__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ColorBlindnessMode */ \"./Graphics/PostProcessor/ColorBlindnessMode.ts\");\n/* harmony import */ var _ScreenShader__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ScreenShader */ \"./Graphics/PostProcessor/ScreenShader.ts\");\n\n\n\nclass ColorBlindnessPostProcessor {\n constructor(_colorBlindnessMode, simulate = false) {\n this._colorBlindnessMode = _colorBlindnessMode;\n this._simulate = false;\n this._simulate = simulate;\n }\n initialize(gl) {\n this._shader = new _ScreenShader__WEBPACK_IMPORTED_MODULE_0__.ScreenShader(gl, _color_blind_fragment_glsl__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n this.simulate = this._simulate;\n this.colorBlindnessMode = this._colorBlindnessMode;\n }\n getShader() {\n return this._shader.getShader();\n }\n getLayout() {\n return this._shader.getLayout();\n }\n set colorBlindnessMode(colorBlindMode) {\n this._colorBlindnessMode = colorBlindMode;\n if (this._shader) {\n const shader = this._shader.getShader();\n shader.use();\n if (this._colorBlindnessMode === _ColorBlindnessMode__WEBPACK_IMPORTED_MODULE_2__.ColorBlindnessMode.Protanope) {\n shader.setUniformInt('u_type', 0);\n }\n else if (this._colorBlindnessMode === _ColorBlindnessMode__WEBPACK_IMPORTED_MODULE_2__.ColorBlindnessMode.Deuteranope) {\n shader.setUniformInt('u_type', 1);\n }\n else if (this._colorBlindnessMode === _ColorBlindnessMode__WEBPACK_IMPORTED_MODULE_2__.ColorBlindnessMode.Tritanope) {\n shader.setUniformInt('u_type', 2);\n }\n }\n }\n get colorBlindnessMode() {\n return this._colorBlindnessMode;\n }\n set simulate(value) {\n this._simulate = value;\n if (this._shader) {\n const shader = this._shader.getShader();\n shader.use();\n shader.setUniformBoolean('u_simulate', value);\n }\n }\n get simulate() {\n return this._simulate;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/PostProcessor/ScreenShader.ts\":\n/*!************************************************!*\\\n !*** ./Graphics/PostProcessor/ScreenShader.ts ***!\n \\************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ScreenShader: () => (/* binding */ ScreenShader)\n/* harmony export */ });\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Context_shader__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Context/shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _Context_vertex_buffer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Context/vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _Context_vertex_layout__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Context/vertex-layout */ \"./Graphics/Context/vertex-layout.ts\");\n\n\n\n\n/**\n * Helper that defines a whole screen renderer, just provide a fragment source!\n *\n * Currently supports 1 varying\n * - vec2 a_texcoord between 0-1 which corresponds to screen position\n */\nclass ScreenShader {\n constructor(gl, fragmentSource) {\n if (true) {\n if (fragmentSource.includes('v_texcoord')) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance().warn(`ScreenShader: \"v_texcoord\" is deprecated in postprocessing fragment shaders will be removed in v1.0,` +\n ` use \"v_uv\" instead. Source [${fragmentSource}]`);\n }\n }\n this._shader = new _Context_shader__WEBPACK_IMPORTED_MODULE_1__.Shader({\n gl,\n vertexSource: `#version 300 es\r\n in vec2 a_position;\r\n in vec2 a_uv;\r\n out vec2 v_texcoord;\r\n out vec2 v_uv;\r\n\r\n void main() {\r\n gl_Position = vec4(a_position, 0.0, 1.0);\r\n // Pass the texcoord to the fragment shader.\r\n v_texcoord = a_uv;\r\n v_uv = a_uv;\r\n }`,\n fragmentSource: fragmentSource\n });\n this._shader.compile();\n // Setup memory layout\n this._buffer = new _Context_vertex_buffer__WEBPACK_IMPORTED_MODULE_2__.VertexBuffer({\n gl,\n type: 'static',\n // clip space quad + uv since we don't need a camera\n data: new Float32Array([\n -1, -1, 0, 0, -1, 1, 0, 1, 1, -1, 1, 0,\n 1, -1, 1, 0, -1, 1, 0, 1, 1, 1, 1, 1\n ])\n });\n this._layout = new _Context_vertex_layout__WEBPACK_IMPORTED_MODULE_3__.VertexLayout({\n gl,\n shader: this._shader,\n vertexBuffer: this._buffer,\n attributes: [\n ['a_position', 2],\n ['a_uv', 2]\n ]\n });\n this._buffer.upload();\n }\n getShader() {\n return this._shader;\n }\n getLayout() {\n return this._layout;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Raster.ts\":\n/*!****************************!*\\\n !*** ./Graphics/Raster.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Raster: () => (/* binding */ Raster)\n/* harmony export */ });\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Util_Watch__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Util/Watch */ \"./Util/Watch.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Util */ \"./Util/Util.ts\");\n\n\n\n\n\n\n/**\n * A Raster is a Graphic that needs to be first painted to a HTMLCanvasElement before it can be drawn to the\n * {@apilink ExcaliburGraphicsContext}. This is useful for generating custom images using the 2D canvas api.\n *\n * Implementors must implement the {@apilink Raster.execute} method to rasterize their drawing.\n */\nclass Raster extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n constructor(options) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;\n super((0,_Util_Util__WEBPACK_IMPORTED_MODULE_1__.omit)({ ...options }, ['width', 'height'])); // rasters do some special sauce with width/height\n this.lineCap = 'butt';\n this.quality = 1;\n this._dirty = true;\n this._smoothing = false;\n this._color = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_2__.watch)(_Color__WEBPACK_IMPORTED_MODULE_3__.Color.Black, () => this.flagDirty());\n this._lineWidth = 1;\n this._lineDash = [];\n this._padding = 0;\n if (options) {\n this.quality = (_a = options.quality) !== null && _a !== void 0 ? _a : this.quality;\n this.color = (_b = options.color) !== null && _b !== void 0 ? _b : _Color__WEBPACK_IMPORTED_MODULE_3__.Color.Black;\n this.strokeColor = options === null || options === void 0 ? void 0 : options.strokeColor;\n this.smoothing = (_c = options.smoothing) !== null && _c !== void 0 ? _c : this.smoothing;\n this.lineWidth = (_d = options.lineWidth) !== null && _d !== void 0 ? _d : this.lineWidth;\n this.lineDash = (_e = options.lineDash) !== null && _e !== void 0 ? _e : this.lineDash;\n this.lineCap = (_f = options.lineCap) !== null && _f !== void 0 ? _f : this.lineCap;\n this.padding = (_g = options.padding) !== null && _g !== void 0 ? _g : this.padding;\n this.filtering = (_h = options.filtering) !== null && _h !== void 0 ? _h : this.filtering;\n }\n this._bitmap = document.createElement('canvas');\n // get the default canvas width/height as a fallback\n const bitmapWidth = (_j = options === null || options === void 0 ? void 0 : options.width) !== null && _j !== void 0 ? _j : this._bitmap.width;\n const bitmapHeight = (_k = options === null || options === void 0 ? void 0 : options.height) !== null && _k !== void 0 ? _k : this._bitmap.height;\n this.width = bitmapWidth;\n this.height = bitmapHeight;\n const maybeCtx = this._bitmap.getContext('2d');\n if (!maybeCtx) {\n /* istanbul ignore next */\n throw new Error('Browser does not support 2d canvas drawing, cannot create Raster graphic');\n }\n else {\n this._ctx = maybeCtx;\n }\n }\n cloneRasterOptions() {\n return {\n color: this.color ? this.color.clone() : undefined,\n strokeColor: this.strokeColor ? this.strokeColor.clone() : undefined,\n smoothing: this.smoothing,\n lineWidth: this.lineWidth,\n lineDash: this.lineDash,\n lineCap: this.lineCap,\n quality: this.quality,\n padding: this.padding\n };\n }\n /**\n * Gets whether the graphic is dirty, this means there are changes that haven't been re-rasterized\n */\n get dirty() {\n return this._dirty;\n }\n /**\n * Flags the graphic as dirty, meaning it must be re-rasterized before draw.\n * This should be called any time the graphics state changes such that it affects the outputted drawing\n */\n flagDirty() {\n this._dirty = true;\n }\n /**\n * Gets or sets the current width of the Raster graphic. Setting the width will cause the raster\n * to be flagged dirty causing a re-raster on the next draw.\n *\n * Any `padding`s or `quality` set will be factored into the width\n */\n get width() {\n return Math.abs(this._getTotalWidth() * this.scale.x);\n }\n set width(value) {\n value /= Math.abs(this.scale.x);\n this._bitmap.width = value;\n this._originalWidth = value;\n this.flagDirty();\n }\n /**\n * Gets or sets the current height of the Raster graphic. Setting the height will cause the raster\n * to be flagged dirty causing a re-raster on the next draw.\n *\n * Any `padding` or `quality` set will be factored into the height\n */\n get height() {\n return Math.abs(this._getTotalHeight() * this.scale.y);\n }\n set height(value) {\n value /= Math.abs(this.scale.y);\n this._bitmap.height = value;\n this._originalHeight = value;\n this.flagDirty();\n }\n _getTotalWidth() {\n var _a;\n return (((_a = this._originalWidth) !== null && _a !== void 0 ? _a : this._bitmap.width) + this.padding * 2) * 1;\n }\n _getTotalHeight() {\n var _a;\n return (((_a = this._originalHeight) !== null && _a !== void 0 ? _a : this._bitmap.height) + this.padding * 2) * 1;\n }\n /**\n * Returns the local bounds of the Raster including the padding\n */\n get localBounds() {\n return _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_4__.BoundingBox.fromDimension(this._getTotalWidth() * this.scale.x, this._getTotalHeight() * this.scale.y, _Math_vector__WEBPACK_IMPORTED_MODULE_5__.Vector.Zero);\n }\n /**\n * Gets or sets the smoothing (anti-aliasing of the graphic). Setting the height will cause the raster\n * to be flagged dirty causing a re-raster on the next draw.\n */\n get smoothing() {\n return this._smoothing;\n }\n set smoothing(value) {\n this._smoothing = value;\n this.flagDirty();\n }\n /**\n * Gets or sets the fillStyle of the Raster graphic. Setting the fillStyle will cause the raster to be\n * flagged dirty causing a re-raster on the next draw.\n */\n get color() {\n return this._color;\n }\n set color(value) {\n this.flagDirty();\n this._color = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_2__.watch)(value, () => this.flagDirty());\n }\n /**\n * Gets or sets the strokeStyle of the Raster graphic. Setting the strokeStyle will cause the raster to be\n * flagged dirty causing a re-raster on the next draw.\n */\n get strokeColor() {\n return this._strokeColor;\n }\n set strokeColor(value) {\n this.flagDirty();\n if (value) {\n this._strokeColor = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_2__.watch)(value, () => this.flagDirty());\n }\n }\n /**\n * Gets or sets the line width of the Raster graphic. Setting the lineWidth will cause the raster to be\n * flagged dirty causing a re-raster on the next draw.\n */\n get lineWidth() {\n return this._lineWidth;\n }\n set lineWidth(value) {\n this._lineWidth = value;\n this.flagDirty();\n }\n get lineDash() {\n return this._lineDash;\n }\n set lineDash(value) {\n this._lineDash = value;\n this.flagDirty();\n }\n get padding() {\n return this._padding;\n }\n set padding(value) {\n this._padding = value;\n this.flagDirty();\n }\n /**\n * Rasterize the graphic to a bitmap making it usable as in excalibur. Rasterize is called automatically if\n * the graphic is {@apilink Raster.dirty} on the next {@apilink Graphic.draw} call\n */\n rasterize() {\n this._dirty = false;\n this._ctx.clearRect(0, 0, this._getTotalWidth(), this._getTotalHeight());\n this._ctx.save();\n this._applyRasterProperties(this._ctx);\n this.execute(this._ctx);\n this._ctx.restore();\n }\n _applyRasterProperties(ctx) {\n var _a, _b, _c, _d;\n this._bitmap.width = this._getTotalWidth() * this.quality;\n this._bitmap.height = this._getTotalHeight() * this.quality;\n // Do a bad thing to pass the filtering as an attribute\n this._bitmap.setAttribute('filtering', this.filtering);\n this._bitmap.setAttribute('forceUpload', 'true');\n ctx.scale(this.quality, this.quality);\n ctx.translate(this.padding, this.padding);\n ctx.imageSmoothingEnabled = this.smoothing;\n ctx.lineWidth = this.lineWidth;\n ctx.setLineDash((_a = this.lineDash) !== null && _a !== void 0 ? _a : ctx.getLineDash());\n ctx.lineCap = this.lineCap;\n ctx.strokeStyle = (_c = (_b = this.strokeColor) === null || _b === void 0 ? void 0 : _b.toString()) !== null && _c !== void 0 ? _c : '';\n ctx.fillStyle = (_d = this.color) === null || _d === void 0 ? void 0 : _d.toString();\n }\n _drawImage(ex, x, y) {\n if (this._dirty) {\n this.rasterize();\n }\n ex.scale(1 / this.quality, 1 / this.quality);\n ex.drawImage(this._bitmap, x, y);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Rectangle.ts\":\n/*!*******************************!*\\\n !*** ./Graphics/Rectangle.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Rectangle: () => (/* binding */ Rectangle)\n/* harmony export */ });\n/* harmony import */ var _Raster__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Raster */ \"./Graphics/Raster.ts\");\n\n/**\n * A Rectangle {@apilink Graphic} for drawing rectangles to the {@apilink ExcaliburGraphicsContext}\n */\nclass Rectangle extends _Raster__WEBPACK_IMPORTED_MODULE_0__.Raster {\n constructor(options) {\n super(options);\n this.width = options.width;\n this.height = options.height;\n this.rasterize();\n }\n clone() {\n return new Rectangle({\n width: this.width,\n height: this.height,\n ...this.cloneGraphicOptions(),\n ...this.cloneRasterOptions()\n });\n }\n execute(ctx) {\n if (this.color) {\n ctx.fillRect(0, 0, this.width, this.height);\n }\n if (this.strokeColor) {\n ctx.strokeRect(0, 0, this.width, this.height);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Sprite.ts\":\n/*!****************************!*\\\n !*** ./Graphics/Sprite.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Sprite: () => (/* binding */ Sprite)\n/* harmony export */ });\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n\n\nclass Sprite extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n static from(image, options) {\n return new Sprite({\n image,\n ...options\n });\n }\n constructor(options) {\n var _a, _b;\n super(options);\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this._dirty = true;\n this.image = options.image;\n const { width, height } = options;\n this.sourceView = (_a = options.sourceView) !== null && _a !== void 0 ? _a : { x: 0, y: 0, width: width !== null && width !== void 0 ? width : 0, height: height !== null && height !== void 0 ? height : 0 };\n this.destSize = (_b = options.destSize) !== null && _b !== void 0 ? _b : { width: width !== null && width !== void 0 ? width : 0, height: height !== null && height !== void 0 ? height : 0 };\n this._updateSpriteDimensions();\n // Fire when loaded\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.image.ready.then(() => {\n this._updateSpriteDimensions();\n });\n }\n get width() {\n return Math.abs(this.destSize.width * this.scale.x);\n }\n get height() {\n return Math.abs(this.destSize.height * this.scale.y);\n }\n set width(newWidth) {\n newWidth /= Math.abs(this.scale.x);\n this.destSize.width = newWidth;\n super.width = Math.ceil(this.destSize.width);\n }\n set height(newHeight) {\n newHeight /= Math.abs(this.scale.y);\n this.destSize.height = newHeight;\n super.height = Math.ceil(this.destSize.height);\n }\n _updateSpriteDimensions() {\n var _a, _b, _c, _d, _e, _f;\n const { width: nativeWidth, height: nativeHeight } = this.image;\n // This code uses || to avoid 0's\n // If the source is not specified, use the native dimension\n this.sourceView.width = ((_a = this.sourceView) === null || _a === void 0 ? void 0 : _a.width) || nativeWidth;\n this.sourceView.height = ((_b = this.sourceView) === null || _b === void 0 ? void 0 : _b.height) || nativeHeight;\n // If the destination is not specified, use the source if specified, then native\n this.destSize.width = ((_c = this.destSize) === null || _c === void 0 ? void 0 : _c.width) || ((_d = this.sourceView) === null || _d === void 0 ? void 0 : _d.width) || nativeWidth;\n this.destSize.height = ((_e = this.destSize) === null || _e === void 0 ? void 0 : _e.height) || ((_f = this.sourceView) === null || _f === void 0 ? void 0 : _f.height) || nativeHeight;\n this.width = Math.ceil(this.destSize.width) * this.scale.x;\n this.height = Math.ceil(this.destSize.height) * this.scale.y;\n }\n _preDraw(ex, x, y) {\n if (this.image.isLoaded() && this._dirty) {\n this._dirty = false;\n this._updateSpriteDimensions();\n }\n super._preDraw(ex, x, y);\n }\n _drawImage(ex, x, y) {\n if (this.image.isLoaded()) {\n ex.drawImage(this.image.image, this.sourceView.x, this.sourceView.y, this.sourceView.width, this.sourceView.height, x, y, this.destSize.width, this.destSize.height);\n }\n else {\n this._logger.warnOnce(`ImageSource ${this.image.path}` +\n ` is not yet loaded and won't be drawn. Please call .load() or include in a Loader.\\n\\n` +\n `Read https://excaliburjs.com/docs/imagesource for more information.`);\n }\n }\n clone() {\n return new Sprite({\n image: this.image,\n sourceView: { ...this.sourceView },\n destSize: { ...this.destSize },\n ...this.cloneGraphicOptions()\n });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/SpriteFont.ts\":\n/*!********************************!*\\\n !*** ./Graphics/SpriteFont.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SpriteFont: () => (/* binding */ SpriteFont)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n\n\n\n\nclass SpriteFont extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n constructor(options) {\n super(options);\n this._text = '';\n this.alphabet = '';\n this.shadow = undefined;\n this.caseInsensitive = false;\n this.spacing = 0;\n this.lineHeight = undefined;\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n const { alphabet, spriteSheet, caseInsensitive, spacing, shadow, lineHeight } = options;\n this.alphabet = alphabet;\n this.spriteSheet = spriteSheet;\n this.caseInsensitive = caseInsensitive !== null && caseInsensitive !== void 0 ? caseInsensitive : this.caseInsensitive;\n this.spacing = spacing !== null && spacing !== void 0 ? spacing : this.spacing;\n this.shadow = shadow !== null && shadow !== void 0 ? shadow : this.shadow;\n this.lineHeight = lineHeight !== null && lineHeight !== void 0 ? lineHeight : this.lineHeight;\n }\n _getCharacterSprites(text) {\n const results = [];\n // handle case insensitive\n const textToRender = this.caseInsensitive ? text.toLocaleLowerCase() : text;\n const alphabet = this.caseInsensitive ? this.alphabet.toLocaleLowerCase() : this.alphabet;\n // for each letter in text\n for (let letterIndex = 0; letterIndex < textToRender.length; letterIndex++) {\n // find the sprite index in alphabet , if there is an error pick the first\n const letter = textToRender[letterIndex];\n let spriteIndex = alphabet.indexOf(letter);\n if (spriteIndex === -1) {\n spriteIndex = 0;\n this._logger.warnOnce(`SpriteFont - Cannot find letter '${letter}' in configured alphabet '${alphabet}'.`);\n this._logger.warnOnce('There maybe be more issues in the SpriteFont configuration. No additional warnings will be logged.');\n }\n const letterSprite = this.spriteSheet.sprites[spriteIndex];\n if (letterSprite) {\n results.push(letterSprite);\n }\n else {\n this._logger.warnOnce(`SpriteFont - Cannot find sprite for '${letter}' at index '${spriteIndex}' in configured SpriteSheet`);\n this._logger.warnOnce('There maybe be more issues in the SpriteFont configuration. No additional warnings will be logged.');\n }\n }\n return results;\n }\n measureText(text, maxWidth) {\n const lines = this._getLinesFromText(text, maxWidth);\n const maxWidthLine = lines.reduce((a, b) => {\n return a.length > b.length ? a : b;\n });\n const sprites = this._getCharacterSprites(maxWidthLine);\n let width = 0;\n let height = 0;\n for (const sprite of sprites) {\n width += sprite.width + this.spacing;\n height = Math.max(height, sprite.height);\n }\n return _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromDimension(width * this.scale.x, height * lines.length * this.scale.y, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero);\n }\n _drawImage(ex, x, y, maxWidth) {\n var _a;\n let xCursor = 0;\n let yCursor = 0;\n let height = 0;\n const lines = this._getLinesFromText(this._text, maxWidth);\n for (const line of lines) {\n for (const sprite of this._getCharacterSprites(line)) {\n // draw it in the right spot and increase the cursor by sprite width\n sprite.draw(ex, x + xCursor, y + yCursor);\n xCursor += sprite.width + this.spacing;\n height = Math.max(height, sprite.height);\n }\n xCursor = 0;\n yCursor += (_a = this.lineHeight) !== null && _a !== void 0 ? _a : height;\n }\n }\n render(ex, text, _color, x, y, maxWidth) {\n // SpriteFont doesn't support _color, yet...\n this._text = text;\n const bounds = this.measureText(text, maxWidth);\n this.width = bounds.width;\n this.height = bounds.height;\n if (this.shadow) {\n ex.save();\n ex.translate(this.shadow.offset.x, this.shadow.offset.y);\n this._preDraw(ex, x, y);\n this._drawImage(ex, 0, 0, maxWidth);\n this._postDraw(ex);\n ex.restore();\n }\n this._preDraw(ex, x, y);\n this._drawImage(ex, 0, 0, maxWidth);\n this._postDraw(ex);\n }\n clone() {\n return new SpriteFont({\n alphabet: this.alphabet,\n spriteSheet: this.spriteSheet,\n spacing: this.spacing\n });\n }\n _getLinesFromText(text, maxWidth) {\n var _a;\n if (this._cachedText === text && this._cachedRenderWidth === maxWidth && ((_a = this._cachedLines) === null || _a === void 0 ? void 0 : _a.length)) {\n return this._cachedLines;\n }\n const lines = text.split('\\n');\n if (maxWidth == null) {\n return lines;\n }\n // If the current line goes past the maxWidth, append a new line without modifying the underlying text.\n for (let i = 0; i < lines.length; i++) {\n let line = lines[i];\n let newLine = '';\n // Note: we subtract the spacing to counter the initial padding on the left side.\n if (this.measureText(line).width > maxWidth) {\n while (this.measureText(line).width > maxWidth) {\n newLine = line[line.length - 1] + newLine;\n line = line.slice(0, -1); // Remove last character from line\n }\n // Update the array with our new values\n lines[i] = line;\n lines[i + 1] = newLine;\n }\n }\n this._cachedText = text;\n this._cachedLines = lines;\n this._cachedRenderWidth = maxWidth;\n return lines;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/SpriteSheet.ts\":\n/*!*********************************!*\\\n !*** ./Graphics/SpriteSheet.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SpriteSheet: () => (/* binding */ SpriteSheet)\n/* harmony export */ });\n/* harmony import */ var _Sprite__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Sprite */ \"./Graphics/Sprite.ts\");\n/* harmony import */ var _TiledSprite__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./TiledSprite */ \"./Graphics/TiledSprite.ts\");\n\n\n/**\n * Represents a collection of sprites from a source image with some organization in a grid\n */\nclass SpriteSheet {\n /**\n * Build a new sprite sheet from a list of sprites\n *\n * Use {@apilink SpriteSheet.fromImageSource} to create a SpriteSheet from an {@apilink ImageSource} organized in a grid\n * @param options\n */\n constructor(options) {\n this.sprites = [];\n const { sprites, rows, columns } = options;\n this.sprites = sprites;\n this.rows = rows !== null && rows !== void 0 ? rows : 1;\n this.columns = columns !== null && columns !== void 0 ? columns : this.sprites.length;\n }\n /**\n * Find a sprite by their x/y integer coordinates in the SpriteSheet, for example `getSprite(0, 0)` is the {@apilink Sprite} in the top-left\n * and `getSprite(1, 0)` is the sprite one to the right.\n * @param x\n * @param y\n */\n getSprite(x, y, options) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j;\n if (x >= this.columns || x < 0) {\n throw Error(`No sprite exists in the SpriteSheet at (${x}, ${y}), x: ${x} should be between 0 and ${this.columns - 1} columns`);\n }\n if (y >= this.rows || y < 0) {\n throw Error(`No sprite exists in the SpriteSheet at (${x}, ${y}), y: ${y} should be between 0 and ${this.rows - 1} rows`);\n }\n const spriteIndex = x + y * this.columns;\n const sprite = this.sprites[spriteIndex];\n if (sprite) {\n if (options) {\n const spriteWithOptions = sprite.clone();\n spriteWithOptions.flipHorizontal = (_a = options.flipHorizontal) !== null && _a !== void 0 ? _a : spriteWithOptions.flipHorizontal;\n spriteWithOptions.flipVertical = (_b = options.flipVertical) !== null && _b !== void 0 ? _b : spriteWithOptions.flipVertical;\n spriteWithOptions.width = (_c = options.width) !== null && _c !== void 0 ? _c : spriteWithOptions.width;\n spriteWithOptions.height = (_d = options.height) !== null && _d !== void 0 ? _d : spriteWithOptions.height;\n spriteWithOptions.rotation = (_e = options.rotation) !== null && _e !== void 0 ? _e : spriteWithOptions.rotation;\n spriteWithOptions.scale = (_f = options.scale) !== null && _f !== void 0 ? _f : spriteWithOptions.scale;\n spriteWithOptions.opacity = (_g = options.opacity) !== null && _g !== void 0 ? _g : spriteWithOptions.opacity;\n spriteWithOptions.tint = (_h = options.tint) !== null && _h !== void 0 ? _h : spriteWithOptions.tint;\n spriteWithOptions.origin = (_j = options.origin) !== null && _j !== void 0 ? _j : spriteWithOptions.origin;\n return spriteWithOptions;\n }\n return sprite;\n }\n throw Error(`Invalid sprite coordinates (${x}, ${y})`);\n }\n /**\n * Find a sprite by their x/y integer coordinates in the SpriteSheet and configures tiling to repeat by default,\n * for example `getTiledSprite(0, 0)` is the {@apilink TiledSprite} in the top-left\n * and `getTiledSprite(1, 0)` is the sprite one to the right.\n *\n * Example:\n *\n * ```typescript\n * spriteSheet.getTiledSprite(1, 0, {\n * width: game.screen.width,\n * height: 200,\n * wrapping: {\n * x: ex.ImageWrapping.Repeat,\n * y: ex.ImageWrapping.Clamp\n * }\n * });\n * ```\n * @param x\n * @param y\n * @param options\n */\n getTiledSprite(x, y, options) {\n if (x >= this.columns || x < 0) {\n throw Error(`No sprite exists in the SpriteSheet at (${x}, ${y}), x: ${x} should be between 0 and ${this.columns - 1} columns`);\n }\n if (y >= this.rows || y < 0) {\n throw Error(`No sprite exists in the SpriteSheet at (${x}, ${y}), y: ${y} should be between 0 and ${this.rows - 1} rows`);\n }\n const spriteIndex = x + y * this.columns;\n const sprite = this.sprites[spriteIndex];\n if (sprite) {\n return _TiledSprite__WEBPACK_IMPORTED_MODULE_0__.TiledSprite.fromSprite(sprite, options);\n }\n throw Error(`Invalid sprite coordinates (${x}, ${y})`);\n }\n /**\n * Create a sprite sheet from a sparse set of {@apilink SourceView} rectangles\n * @param options\n */\n static fromImageSourceWithSourceViews(options) {\n const sprites = options.sourceViews.map((sourceView) => {\n return new _Sprite__WEBPACK_IMPORTED_MODULE_1__.Sprite({\n image: options.image,\n sourceView\n });\n });\n return new SpriteSheet({ sprites });\n }\n /**\n * Create a SpriteSheet from an {@apilink ImageSource} organized in a grid\n *\n * Example:\n * ```\n * const spriteSheet = SpriteSheet.fromImageSource({\n * image: imageSource,\n * grid: {\n * rows: 5,\n * columns: 2,\n * spriteWidth: 32, // pixels\n * spriteHeight: 32 // pixels\n * },\n * // Optionally specify spacing\n * spacing: {\n * // pixels from the top left to start the sprite parsing\n * originOffset: {\n * x: 5,\n * y: 5\n * },\n * // pixels between each sprite while parsing\n * margin: {\n * x: 1,\n * y: 1\n * }\n * }\n * })\n * ```\n * @param options\n */\n static fromImageSource(options) {\n var _a;\n const sprites = [];\n options.spacing = (_a = options.spacing) !== null && _a !== void 0 ? _a : {};\n const { image, grid: { rows, columns: cols, spriteWidth, spriteHeight }, spacing: { originOffset, margin } } = options;\n const offsetDefaults = { x: 0, y: 0, ...originOffset };\n const marginDefaults = { x: 0, y: 0, ...margin };\n for (let x = 0; x < cols; x++) {\n for (let y = 0; y < rows; y++) {\n sprites[x + y * cols] = new _Sprite__WEBPACK_IMPORTED_MODULE_1__.Sprite({\n image: image,\n sourceView: {\n x: x * spriteWidth + marginDefaults.x * x + offsetDefaults.x,\n y: y * spriteHeight + marginDefaults.y * y + offsetDefaults.y,\n width: spriteWidth,\n height: spriteHeight\n },\n destSize: { height: spriteHeight, width: spriteWidth }\n });\n }\n }\n return new SpriteSheet({\n sprites: sprites,\n rows: rows,\n columns: cols\n });\n }\n clone() {\n return new SpriteSheet({\n sprites: this.sprites.map((sprite) => sprite.clone()),\n rows: this.rows,\n columns: this.columns\n });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Text.ts\":\n/*!**************************!*\\\n !*** ./Graphics/Text.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Text: () => (/* binding */ Text)\n/* harmony export */ });\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Font__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Font */ \"./Graphics/Font.ts\");\n\n\n\n/**\n * Represent Text graphics in excalibur\n *\n * Useful for in game labels, ui, or overlays\n */\nclass Text extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n constructor(options) {\n var _a, _b;\n super(options);\n this._text = '';\n this._textWidth = 0;\n this._textHeight = 0;\n // This order is important font, color, then text\n this.font = (_a = options.font) !== null && _a !== void 0 ? _a : new _Font__WEBPACK_IMPORTED_MODULE_1__.Font();\n this.color = (_b = options.color) !== null && _b !== void 0 ? _b : this.color;\n this.text = options.text;\n this.maxWidth = options.maxWidth;\n }\n clone() {\n var _a, _b;\n return new Text({\n text: this.text.slice(),\n color: (_b = (_a = this.color) === null || _a === void 0 ? void 0 : _a.clone()) !== null && _b !== void 0 ? _b : _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Black,\n font: this.font.clone(),\n maxWidth: this.maxWidth\n });\n }\n get text() {\n return this._text;\n }\n set text(value) {\n this._text = value;\n this._calculateDimension();\n }\n get font() {\n return this._font;\n }\n set font(font) {\n this._font = font;\n }\n get width() {\n if (this._textWidth === 0) {\n this._calculateDimension();\n }\n return this._textWidth * this.scale.x;\n }\n get height() {\n if (this._textHeight === 0) {\n this._calculateDimension();\n }\n return this._textHeight * this.scale.y;\n }\n _calculateDimension() {\n const { width, height } = this.font.measureText(this._text, this.maxWidth);\n this._textWidth = width;\n this._textHeight = height;\n }\n get localBounds() {\n return this.font.measureText(this._text, this.maxWidth).scale(this.scale);\n }\n _rotate(_ex) {\n // None this is delegated to font\n // This override erases the default behavior\n }\n _flip(_ex) {\n // None this is delegated to font\n // This override erases the default behavior\n }\n _preDraw(ex, x, y) {\n if (this.isStale() || this.font.isStale()) {\n this.font.flipHorizontal = this.flipHorizontal;\n this.font.flipVertical = this.flipVertical;\n this.font.rotation = this.rotation;\n this.font.origin = this.origin;\n this.font.opacity = this.opacity;\n }\n this.font.tint = this.tint;\n super._preDraw(ex, x, y);\n }\n _drawImage(ex, x, y) {\n var _a;\n let color = _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Black;\n if (this.font instanceof _Font__WEBPACK_IMPORTED_MODULE_1__.Font) {\n color = (_a = this.color) !== null && _a !== void 0 ? _a : this.font.color;\n }\n const { width, height } = this.font.measureText(this._text, this.maxWidth);\n this._textWidth = width;\n this._textHeight = height;\n this.font.render(ex, this._text, color, x, y, this.maxWidth);\n if (this.font.showDebug) {\n ex.debug.drawRect(x - width, y - height, width * 2, height * 2);\n if (this.maxWidth != null) {\n ex.debug.drawRect(x, y, this.maxWidth, this.height, {\n color: _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Yellow\n });\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/TiledAnimation.ts\":\n/*!************************************!*\\\n !*** ./Graphics/TiledAnimation.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TiledAnimation: () => (/* binding */ TiledAnimation)\n/* harmony export */ });\n/* harmony import */ var _Sprite__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Sprite */ \"./Graphics/Sprite.ts\");\n/* harmony import */ var _Animation__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Animation */ \"./Graphics/Animation.ts\");\n/* harmony import */ var _TiledSprite__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./TiledSprite */ \"./Graphics/TiledSprite.ts\");\n/* harmony import */ var _Util_Watch__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Util/Watch */ \"./Util/Watch.ts\");\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Future */ \"./Util/Future.ts\");\n\n\n\n\n\nclass TiledAnimation extends _Animation__WEBPACK_IMPORTED_MODULE_0__.Animation {\n constructor(options) {\n super({\n ...options,\n frames: options.animation.frames.slice(),\n strategy: options.animation.strategy,\n frameDuration: options.animation.frameDuration,\n speed: options.animation.speed,\n reverse: options.animation.isReversed\n });\n this._ready = new _Util_Future__WEBPACK_IMPORTED_MODULE_1__.Future();\n this.ready = this._ready.promise;\n this._tiledWidth = 0;\n this._tiledHeight = 0;\n this._sourceView = {};\n this._sourceView = { ...options.sourceView };\n this._tiledWidth = options.width;\n this._tiledHeight = options.height;\n const promises = [];\n for (let i = 0; i < this.frames.length; i++) {\n const graphic = this.frames[i].graphic;\n if (graphic && graphic instanceof _Sprite__WEBPACK_IMPORTED_MODULE_2__.Sprite) {\n const tiledSprite = new _TiledSprite__WEBPACK_IMPORTED_MODULE_3__.TiledSprite({\n image: graphic.image,\n width: options.width,\n height: options.height,\n sourceView: { ...graphic.sourceView },\n wrapping: options.wrapping,\n filtering: options.filtering\n });\n this.frames[i].graphic = tiledSprite;\n // There is a new calc'd sourceView when ready\n tiledSprite.ready.then(() => {\n tiledSprite.sourceView = { ...tiledSprite.sourceView, ...this._sourceView };\n });\n promises.push(tiledSprite.ready);\n }\n }\n Promise.all(promises).then(() => this._ready.resolve());\n }\n static fromAnimation(animation, options) {\n return new TiledAnimation({\n width: animation.width,\n height: animation.height,\n ...options,\n animation\n });\n }\n _updateSourceView() {\n for (let i = 0; i < this.frames.length; i++) {\n const graphic = this.frames[i].graphic;\n if (graphic && graphic instanceof _Sprite__WEBPACK_IMPORTED_MODULE_2__.Sprite) {\n graphic.sourceView = { ...graphic.sourceView, ...this._sourceView };\n }\n }\n }\n get sourceView() {\n return (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_4__.watch)(this._sourceView, () => this._updateSourceView());\n }\n set sourceView(sourceView) {\n this._sourceView = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_4__.watch)(sourceView, () => this._updateSourceView());\n this._updateSourceView();\n }\n _updateWidthHeight() {\n for (let i = 0; i < this.frames.length; i++) {\n const graphic = this.frames[i].graphic;\n if (graphic && graphic instanceof _Sprite__WEBPACK_IMPORTED_MODULE_2__.Sprite) {\n graphic.sourceView.height = this._tiledHeight || graphic.height;\n graphic.destSize.height = this._tiledHeight || graphic.height;\n graphic.sourceView.width = this._tiledWidth || graphic.width;\n graphic.destSize.width = this._tiledWidth || graphic.width;\n }\n }\n }\n get width() {\n return this._tiledWidth;\n }\n get height() {\n return this._tiledHeight;\n }\n set width(width) {\n this._tiledWidth = width;\n this._updateWidthHeight();\n }\n set height(height) {\n this._tiledHeight = height;\n this._updateWidthHeight();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/TiledSprite.ts\":\n/*!*********************************!*\\\n !*** ./Graphics/TiledSprite.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TiledSprite: () => (/* binding */ TiledSprite)\n/* harmony export */ });\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Future */ \"./Util/Future.ts\");\n/* harmony import */ var _ImageSource__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ImageSource */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Sprite__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Sprite */ \"./Graphics/Sprite.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Wrapping */ \"./Graphics/Wrapping.ts\");\n\n\n\n\nclass TiledSprite extends _Sprite__WEBPACK_IMPORTED_MODULE_0__.Sprite {\n constructor(options) {\n super({\n image: options.image,\n sourceView: options.sourceView,\n destSize: { width: options.width, height: options.height },\n flipHorizontal: options.flipHorizontal,\n flipVertical: options.flipVertical,\n rotation: options.rotation,\n scale: options.scale,\n opacity: options.opacity,\n tint: options.tint,\n origin: options.origin\n });\n this._ready = new _Util_Future__WEBPACK_IMPORTED_MODULE_1__.Future();\n this.ready = this._ready.promise;\n this._options = options;\n if (this.image.isLoaded()) {\n this._applyTiling();\n }\n else {\n this.image.ready.then(() => this._applyTiling());\n }\n }\n static fromSprite(sprite, options) {\n return new TiledSprite({\n sourceView: { ...sprite.sourceView },\n width: sprite.width,\n height: sprite.height,\n ...options,\n image: sprite.image\n });\n }\n _applyTiling() {\n const { width, height, filtering, wrapping } = { ...this._options };\n const spriteCanvas = document.createElement('canvas');\n spriteCanvas.width = this.sourceView.width;\n spriteCanvas.height = this.sourceView.height;\n const spriteCtx = spriteCanvas.getContext('2d');\n // prettier-ignore\n spriteCtx.drawImage(this.image.image, this.sourceView.x, this.sourceView.y, this.sourceView.width, this.sourceView.height, 0, 0, this.sourceView.width, this.sourceView.height);\n // prettier-ignore\n const tiledImageSource = _ImageSource__WEBPACK_IMPORTED_MODULE_2__.ImageSource.fromHtmlCanvasElement(spriteCanvas, {\n wrapping: wrapping !== null && wrapping !== void 0 ? wrapping : _Wrapping__WEBPACK_IMPORTED_MODULE_3__.ImageWrapping.Repeat,\n filtering\n });\n if (width) {\n this.destSize.width = width;\n this.sourceView.width = width;\n }\n if (height) {\n this.destSize.height = height;\n this.sourceView.height = height;\n }\n this.sourceView.x = 0;\n this.sourceView.y = 0;\n this.image = tiledImageSource;\n // this._ready.resolve();\n this.image.ready.then(() => this._ready.resolve());\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/TransformInterpolation.ts\":\n/*!********************************************!*\\\n !*** ./Graphics/TransformInterpolation.ts ***!\n \\********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ blendGlobalTransform: () => (/* binding */ blendGlobalTransform),\n/* harmony export */ blendTransform: () => (/* binding */ blendTransform)\n/* harmony export */ });\n/* harmony import */ var _Math_transform__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Math/transform */ \"./Math/transform.ts\");\n\n/**\n * Blend 2 transforms for interpolation, will interpolate from the context of newTx's parent if it exists\n */\nfunction blendTransform(oldTx, newTx, blend, target) {\n if (oldTx.parent !== newTx.parent) {\n // Caller expects a local transform\n // Adjust old tx to be local to the new parent whatever that is\n const oldTxWithNewParent = oldTx.clone();\n const oldGlobalPos = oldTx.globalPos.clone();\n const oldGlobalScale = oldTx.globalScale.clone();\n const oldGlobalRotation = oldTx.globalRotation;\n oldTxWithNewParent.parent = newTx.parent;\n oldTxWithNewParent.globalPos = oldGlobalPos;\n oldTxWithNewParent.globalScale = oldGlobalScale;\n oldTxWithNewParent.globalRotation = oldGlobalRotation;\n oldTx = oldTxWithNewParent;\n }\n let interpolatedPos = newTx.pos;\n let interpolatedScale = newTx.scale;\n let interpolatedRotation = newTx.rotation;\n interpolatedPos = newTx.pos.scale(blend).add(oldTx.pos.scale(1.0 - blend));\n interpolatedScale = newTx.scale.scale(blend).add(oldTx.scale.scale(1.0 - blend));\n // Rotational lerp https://stackoverflow.com/a/30129248\n const cosine = (1.0 - blend) * Math.cos(oldTx.rotation) + blend * Math.cos(newTx.rotation);\n const sine = (1.0 - blend) * Math.sin(oldTx.rotation) + blend * Math.sin(newTx.rotation);\n interpolatedRotation = Math.atan2(sine, cosine);\n const tx = target !== null && target !== void 0 ? target : new _Math_transform__WEBPACK_IMPORTED_MODULE_0__.Transform();\n tx.setTransform(interpolatedPos, interpolatedRotation, interpolatedScale);\n return tx;\n}\n/**\n *\n */\nfunction blendGlobalTransform(oldTx, newTx, blend, target) {\n let interpolatedPos = newTx.globalPos;\n let interpolatedScale = newTx.globalScale;\n let interpolatedRotation = newTx.globalRotation;\n interpolatedPos = newTx.globalPos.scale(blend).add(oldTx.globalPos.scale(1.0 - blend));\n interpolatedScale = newTx.globalScale.scale(blend).add(oldTx.globalScale.scale(1.0 - blend));\n // Rotational lerp https://stackoverflow.com/a/30129248\n const cosine = (1.0 - blend) * Math.cos(oldTx.globalRotation) + blend * Math.cos(newTx.globalRotation);\n const sine = (1.0 - blend) * Math.sin(oldTx.globalRotation) + blend * Math.sin(newTx.globalRotation);\n interpolatedRotation = Math.atan2(sine, cosine);\n const tx = target !== null && target !== void 0 ? target : new _Math_transform__WEBPACK_IMPORTED_MODULE_0__.Transform();\n tx.setTransform(interpolatedPos, interpolatedRotation, interpolatedScale);\n return tx;\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Wrapping.ts\":\n/*!******************************!*\\\n !*** ./Graphics/Wrapping.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ImageWrapping: () => (/* binding */ ImageWrapping),\n/* harmony export */ parseImageWrapping: () => (/* binding */ parseImageWrapping)\n/* harmony export */ });\n/**\n * Describes the different image wrapping modes\n */\nvar ImageWrapping;\n(function (ImageWrapping) {\n ImageWrapping[\"Clamp\"] = \"Clamp\";\n ImageWrapping[\"Repeat\"] = \"Repeat\";\n ImageWrapping[\"Mirror\"] = \"Mirror\";\n})(ImageWrapping || (ImageWrapping = {}));\n/**\n *\n */\nfunction parseImageWrapping(val) {\n switch (val) {\n case ImageWrapping.Clamp:\n return ImageWrapping.Clamp;\n case ImageWrapping.Repeat:\n return ImageWrapping.Repeat;\n case ImageWrapping.Mirror:\n return ImageWrapping.Mirror;\n default:\n return ImageWrapping.Clamp;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/index.ts\":\n/*!***************************!*\\\n !*** ./Graphics/index.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Animation: () => (/* reexport safe */ _Animation__WEBPACK_IMPORTED_MODULE_5__.Animation),\n/* harmony export */ AnimationDirection: () => (/* reexport safe */ _Animation__WEBPACK_IMPORTED_MODULE_5__.AnimationDirection),\n/* harmony export */ AnimationEvents: () => (/* reexport safe */ _Animation__WEBPACK_IMPORTED_MODULE_5__.AnimationEvents),\n/* harmony export */ AnimationStrategy: () => (/* reexport safe */ _Animation__WEBPACK_IMPORTED_MODULE_5__.AnimationStrategy),\n/* harmony export */ BaseAlign: () => (/* reexport safe */ _FontCommon__WEBPACK_IMPORTED_MODULE_17__.BaseAlign),\n/* harmony export */ Canvas: () => (/* reexport safe */ _Canvas__WEBPACK_IMPORTED_MODULE_21__.Canvas),\n/* harmony export */ Circle: () => (/* reexport safe */ _Circle__WEBPACK_IMPORTED_MODULE_13__.Circle),\n/* harmony export */ ColorBlindnessMode: () => (/* reexport safe */ _PostProcessor_ColorBlindnessMode__WEBPACK_IMPORTED_MODULE_31__.ColorBlindnessMode),\n/* harmony export */ ColorBlindnessPostProcessor: () => (/* reexport safe */ _PostProcessor_ColorBlindnessPostProcessor__WEBPACK_IMPORTED_MODULE_32__.ColorBlindnessPostProcessor),\n/* harmony export */ Debug: () => (/* reexport safe */ _Debug__WEBPACK_IMPORTED_MODULE_41__.Debug),\n/* harmony export */ DebugGraphicsComponent: () => (/* reexport safe */ _DebugGraphicsComponent__WEBPACK_IMPORTED_MODULE_8__.DebugGraphicsComponent),\n/* harmony export */ DebugText: () => (/* reexport safe */ _Context_debug_text__WEBPACK_IMPORTED_MODULE_29__.DebugText),\n/* harmony export */ DefaultAntialiasOptions: () => (/* reexport safe */ _Context_ExcaliburGraphicsContext__WEBPACK_IMPORTED_MODULE_25__.DefaultAntialiasOptions),\n/* harmony export */ DefaultPixelArtOptions: () => (/* reexport safe */ _Context_ExcaliburGraphicsContext__WEBPACK_IMPORTED_MODULE_25__.DefaultPixelArtOptions),\n/* harmony export */ Direction: () => (/* reexport safe */ _FontCommon__WEBPACK_IMPORTED_MODULE_17__.Direction),\n/* harmony export */ ExcaliburGraphicsContext2DCanvas: () => (/* reexport safe */ _Context_ExcaliburGraphicsContext2DCanvas__WEBPACK_IMPORTED_MODULE_26__.ExcaliburGraphicsContext2DCanvas),\n/* harmony export */ ExcaliburGraphicsContextWebGL: () => (/* reexport safe */ _Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_27__.ExcaliburGraphicsContextWebGL),\n/* harmony export */ Font: () => (/* reexport safe */ _Font__WEBPACK_IMPORTED_MODULE_18__.Font),\n/* harmony export */ FontCache: () => (/* reexport safe */ _FontCache__WEBPACK_IMPORTED_MODULE_19__.FontCache),\n/* harmony export */ FontStyle: () => (/* reexport safe */ _FontCommon__WEBPACK_IMPORTED_MODULE_17__.FontStyle),\n/* harmony export */ FontUnit: () => (/* reexport safe */ _FontCommon__WEBPACK_IMPORTED_MODULE_17__.FontUnit),\n/* harmony export */ Graphic: () => (/* reexport safe */ _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic),\n/* harmony export */ GraphicsComponent: () => (/* reexport safe */ _GraphicsComponent__WEBPACK_IMPORTED_MODULE_7__.GraphicsComponent),\n/* harmony export */ GraphicsGroup: () => (/* reexport safe */ _GraphicsGroup__WEBPACK_IMPORTED_MODULE_3__.GraphicsGroup),\n/* harmony export */ GraphicsSystem: () => (/* reexport safe */ _GraphicsSystem__WEBPACK_IMPORTED_MODULE_9__.GraphicsSystem),\n/* harmony export */ ImageFiltering: () => (/* reexport safe */ _Filtering__WEBPACK_IMPORTED_MODULE_34__.ImageFiltering),\n/* harmony export */ ImageSource: () => (/* reexport safe */ _ImageSource__WEBPACK_IMPORTED_MODULE_4__.ImageSource),\n/* harmony export */ ImageSourceAttributeConstants: () => (/* reexport safe */ _ImageSource__WEBPACK_IMPORTED_MODULE_4__.ImageSourceAttributeConstants),\n/* harmony export */ ImageWrapping: () => (/* reexport safe */ _Wrapping__WEBPACK_IMPORTED_MODULE_35__.ImageWrapping),\n/* harmony export */ Line: () => (/* reexport safe */ _Line__WEBPACK_IMPORTED_MODULE_6__.Line),\n/* harmony export */ Material: () => (/* reexport safe */ _Context_material__WEBPACK_IMPORTED_MODULE_40__.Material),\n/* harmony export */ NineSlice: () => (/* reexport safe */ _NineSlice__WEBPACK_IMPORTED_MODULE_22__.NineSlice),\n/* harmony export */ NineSliceStretch: () => (/* reexport safe */ _NineSlice__WEBPACK_IMPORTED_MODULE_22__.NineSliceStretch),\n/* harmony export */ OffscreenSystem: () => (/* reexport safe */ _OffscreenSystem__WEBPACK_IMPORTED_MODULE_10__.OffscreenSystem),\n/* harmony export */ ParallaxComponent: () => (/* reexport safe */ _ParallaxComponent__WEBPACK_IMPORTED_MODULE_11__.ParallaxComponent),\n/* harmony export */ ParticleRenderer: () => (/* reexport safe */ _Context_particle_renderer_particle_renderer__WEBPACK_IMPORTED_MODULE_28__.ParticleRenderer),\n/* harmony export */ Polygon: () => (/* reexport safe */ _Polygon__WEBPACK_IMPORTED_MODULE_15__.Polygon),\n/* harmony export */ QuadIndexBuffer: () => (/* reexport safe */ _Context_quad_index_buffer__WEBPACK_IMPORTED_MODULE_39__.QuadIndexBuffer),\n/* harmony export */ Raster: () => (/* reexport safe */ _Raster__WEBPACK_IMPORTED_MODULE_12__.Raster),\n/* harmony export */ Rectangle: () => (/* reexport safe */ _Rectangle__WEBPACK_IMPORTED_MODULE_14__.Rectangle),\n/* harmony export */ ScreenShader: () => (/* reexport safe */ _PostProcessor_ScreenShader__WEBPACK_IMPORTED_MODULE_30__.ScreenShader),\n/* harmony export */ Shader: () => (/* reexport safe */ _Context_shader__WEBPACK_IMPORTED_MODULE_36__.Shader),\n/* harmony export */ Sprite: () => (/* reexport safe */ _Sprite__WEBPACK_IMPORTED_MODULE_1__.Sprite),\n/* harmony export */ SpriteFont: () => (/* reexport safe */ _SpriteFont__WEBPACK_IMPORTED_MODULE_20__.SpriteFont),\n/* harmony export */ SpriteSheet: () => (/* reexport safe */ _SpriteSheet__WEBPACK_IMPORTED_MODULE_2__.SpriteSheet),\n/* harmony export */ Text: () => (/* reexport safe */ _Text__WEBPACK_IMPORTED_MODULE_16__.Text),\n/* harmony export */ TextAlign: () => (/* reexport safe */ _FontCommon__WEBPACK_IMPORTED_MODULE_17__.TextAlign),\n/* harmony export */ TextureLoader: () => (/* reexport safe */ _Context_texture_loader__WEBPACK_IMPORTED_MODULE_33__.TextureLoader),\n/* harmony export */ TiledAnimation: () => (/* reexport safe */ _TiledAnimation__WEBPACK_IMPORTED_MODULE_24__.TiledAnimation),\n/* harmony export */ TiledSprite: () => (/* reexport safe */ _TiledSprite__WEBPACK_IMPORTED_MODULE_23__.TiledSprite),\n/* harmony export */ VertexBuffer: () => (/* reexport safe */ _Context_vertex_buffer__WEBPACK_IMPORTED_MODULE_37__.VertexBuffer),\n/* harmony export */ VertexLayout: () => (/* reexport safe */ _Context_vertex_layout__WEBPACK_IMPORTED_MODULE_38__.VertexLayout),\n/* harmony export */ hasGraphicsTick: () => (/* reexport safe */ _GraphicsComponent__WEBPACK_IMPORTED_MODULE_7__.hasGraphicsTick),\n/* harmony export */ parseImageFiltering: () => (/* reexport safe */ _Filtering__WEBPACK_IMPORTED_MODULE_34__.parseImageFiltering),\n/* harmony export */ parseImageWrapping: () => (/* reexport safe */ _Wrapping__WEBPACK_IMPORTED_MODULE_35__.parseImageWrapping),\n/* harmony export */ pixelSnapEpsilon: () => (/* reexport safe */ _Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_27__.pixelSnapEpsilon),\n/* harmony export */ webgl: () => (/* reexport module object */ _Context_webgl_util__WEBPACK_IMPORTED_MODULE_42__)\n/* harmony export */ });\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Sprite__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Sprite */ \"./Graphics/Sprite.ts\");\n/* harmony import */ var _SpriteSheet__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./SpriteSheet */ \"./Graphics/SpriteSheet.ts\");\n/* harmony import */ var _GraphicsGroup__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./GraphicsGroup */ \"./Graphics/GraphicsGroup.ts\");\n/* harmony import */ var _ImageSource__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./ImageSource */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Animation__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Animation */ \"./Graphics/Animation.ts\");\n/* harmony import */ var _Line__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Line */ \"./Graphics/Line.ts\");\n/* harmony import */ var _GraphicsComponent__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _DebugGraphicsComponent__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./DebugGraphicsComponent */ \"./Graphics/DebugGraphicsComponent.ts\");\n/* harmony import */ var _GraphicsSystem__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./GraphicsSystem */ \"./Graphics/GraphicsSystem.ts\");\n/* harmony import */ var _OffscreenSystem__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./OffscreenSystem */ \"./Graphics/OffscreenSystem.ts\");\n/* harmony import */ var _ParallaxComponent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./ParallaxComponent */ \"./Graphics/ParallaxComponent.ts\");\n/* harmony import */ var _Raster__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Raster */ \"./Graphics/Raster.ts\");\n/* harmony import */ var _Circle__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Circle */ \"./Graphics/Circle.ts\");\n/* harmony import */ var _Rectangle__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Rectangle */ \"./Graphics/Rectangle.ts\");\n/* harmony import */ var _Polygon__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Polygon */ \"./Graphics/Polygon.ts\");\n/* harmony import */ var _Text__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Text */ \"./Graphics/Text.ts\");\n/* harmony import */ var _FontCommon__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./FontCommon */ \"./Graphics/FontCommon.ts\");\n/* harmony import */ var _Font__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Font */ \"./Graphics/Font.ts\");\n/* harmony import */ var _FontCache__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./FontCache */ \"./Graphics/FontCache.ts\");\n/* harmony import */ var _SpriteFont__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./SpriteFont */ \"./Graphics/SpriteFont.ts\");\n/* harmony import */ var _Canvas__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./Canvas */ \"./Graphics/Canvas.ts\");\n/* harmony import */ var _NineSlice__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./NineSlice */ \"./Graphics/NineSlice.ts\");\n/* harmony import */ var _TiledSprite__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./TiledSprite */ \"./Graphics/TiledSprite.ts\");\n/* harmony import */ var _TiledAnimation__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./TiledAnimation */ \"./Graphics/TiledAnimation.ts\");\n/* harmony import */ var _Context_ExcaliburGraphicsContext__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./Context/ExcaliburGraphicsContext */ \"./Graphics/Context/ExcaliburGraphicsContext.ts\");\n/* harmony import */ var _Context_ExcaliburGraphicsContext2DCanvas__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./Context/ExcaliburGraphicsContext2DCanvas */ \"./Graphics/Context/ExcaliburGraphicsContext2DCanvas.ts\");\n/* harmony import */ var _Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./Context/ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _Context_particle_renderer_particle_renderer__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./Context/particle-renderer/particle-renderer */ \"./Graphics/Context/particle-renderer/particle-renderer.ts\");\n/* harmony import */ var _Context_debug_text__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./Context/debug-text */ \"./Graphics/Context/debug-text.ts\");\n/* harmony import */ var _PostProcessor_ScreenShader__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./PostProcessor/ScreenShader */ \"./Graphics/PostProcessor/ScreenShader.ts\");\n/* harmony import */ var _PostProcessor_ColorBlindnessMode__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./PostProcessor/ColorBlindnessMode */ \"./Graphics/PostProcessor/ColorBlindnessMode.ts\");\n/* harmony import */ var _PostProcessor_ColorBlindnessPostProcessor__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./PostProcessor/ColorBlindnessPostProcessor */ \"./Graphics/PostProcessor/ColorBlindnessPostProcessor.ts\");\n/* harmony import */ var _Context_texture_loader__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./Context/texture-loader */ \"./Graphics/Context/texture-loader.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./Wrapping */ \"./Graphics/Wrapping.ts\");\n/* harmony import */ var _Context_shader__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./Context/shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _Context_vertex_buffer__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./Context/vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _Context_vertex_layout__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./Context/vertex-layout */ \"./Graphics/Context/vertex-layout.ts\");\n/* harmony import */ var _Context_quad_index_buffer__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./Context/quad-index-buffer */ \"./Graphics/Context/quad-index-buffer.ts\");\n/* harmony import */ var _Context_material__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./Context/material */ \"./Graphics/Context/material.ts\");\n/* harmony import */ var _Debug__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ./Debug */ \"./Graphics/Debug.ts\");\n/* harmony import */ var _Context_webgl_util__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ./Context/webgl-util */ \"./Graphics/Context/webgl-util.ts\");\n// Graphics\n\n\n\n\n\n\n\n// Graphics ECS\n\n\n\n\n\n// Raster graphics\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// TODO DELETEME\n\n\n// Post Processor\n\n\n\n\n\n\n\n// Rendering\n\n\n\n\n\n\n// Debug\n\n// Util\n\n\n\n\n/***/ }),\n\n/***/ \"./Id.ts\":\n/*!***************!*\\\n !*** ./Id.ts ***!\n \\***************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ createId: () => (/* binding */ createId)\n/* harmony export */ });\n/**\n * Create a branded ID type from a number\n */\nfunction createId(type, value) {\n return { type, value };\n}\n\n\n/***/ }),\n\n/***/ \"./Input/Gamepad.ts\":\n/*!**************************!*\\\n !*** ./Input/Gamepad.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Axes: () => (/* binding */ Axes),\n/* harmony export */ Buttons: () => (/* binding */ Buttons),\n/* harmony export */ Gamepad: () => (/* binding */ Gamepad),\n/* harmony export */ GamepadEvents: () => (/* binding */ GamepadEvents),\n/* harmony export */ Gamepads: () => (/* binding */ Gamepads)\n/* harmony export */ });\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n\n\nconst GamepadEvents = {\n GamepadConnect: 'connect',\n GamepadDisconnect: 'disconnect',\n GamepadButton: 'button',\n GamepadAxis: 'axis'\n};\n/**\n * Excalibur leverages the HTML5 Gamepad API [where it is supported](http://caniuse.com/#feat=gamepad)\n * to provide controller support for your games.\n */\nclass Gamepads {\n constructor() {\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n /**\n * Whether or not to poll for Gamepad input (default: `false`)\n */\n this.enabled = false;\n /**\n * Whether or not Gamepad API is supported\n */\n this.supported = !!navigator.getGamepads;\n this._gamePadTimeStamps = [0, 0, 0, 0];\n this._oldPads = [];\n this._pads = [];\n this._initSuccess = false;\n this._navigator = navigator;\n this._minimumConfiguration = null;\n this._enabled = true;\n }\n init() {\n if (!this.supported) {\n return;\n }\n if (this._initSuccess) {\n return;\n }\n // In Chrome, this will return 4 undefined items until a button is pressed\n // In FF, this will not return any items until a button is pressed\n this._oldPads = this._clonePads(this._navigator.getGamepads());\n if (this._oldPads.length && this._oldPads[0]) {\n this._initSuccess = true;\n }\n }\n toggleEnabled(enabled) {\n this._enabled = enabled;\n }\n /**\n * Sets the minimum gamepad configuration, for example {axis: 4, buttons: 4} means\n * this game requires at minimum 4 axis inputs and 4 buttons, this is not restrictive\n * all other controllers with more axis or buttons are valid as well. If no minimum\n * configuration is set all pads are valid.\n */\n setMinimumGamepadConfiguration(config) {\n this._enableAndUpdate(); // if config is used, implicitly enable\n this._minimumConfiguration = config;\n }\n /**\n * When implicitly enabled, set the enabled flag and run an update so information is updated\n */\n _enableAndUpdate() {\n if (!this.enabled) {\n this.enabled = true;\n this.update();\n }\n }\n /**\n * Checks a navigator gamepad against the minimum configuration if present.\n */\n _isGamepadValid(pad) {\n if (!this._minimumConfiguration) {\n return true;\n }\n if (!pad) {\n return false;\n }\n const axesLength = pad.axes.filter((value) => {\n return typeof value !== undefined;\n }).length;\n const buttonLength = pad.buttons.filter((value) => {\n return typeof value !== undefined;\n }).length;\n return axesLength >= this._minimumConfiguration.axis && buttonLength >= this._minimumConfiguration.buttons && pad.connected;\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n this._enableAndUpdate(); // implicitly enable\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this._enableAndUpdate(); // implicitly enable\n this.events.off(eventName, handler);\n }\n /**\n * Updates Gamepad state and publishes Gamepad events\n */\n update() {\n if (!this.enabled || !this.supported) {\n return;\n }\n if (!this._enabled) {\n return;\n }\n this.init();\n const gamepads = this._navigator.getGamepads();\n for (let i = 0; i < gamepads.length; i++) {\n if (!gamepads[i]) {\n const gamepad = this.at(i);\n // If was connected, but now isn't emit the disconnect event\n if (gamepad.connected) {\n this.events.emit('disconnect', new _Events__WEBPACK_IMPORTED_MODULE_1__.GamepadDisconnectEvent(i, gamepad));\n }\n // Reset connection status\n gamepad.connected = false;\n continue;\n }\n else {\n if (!this.at(i).connected && this._isGamepadValid(gamepads[i])) {\n this.events.emit('connect', new _Events__WEBPACK_IMPORTED_MODULE_1__.GamepadConnectEvent(i, this.at(i)));\n }\n // Set connection status\n this.at(i).connected = true;\n }\n this.at(i).update();\n // Only supported in Chrome\n if (gamepads[i].timestamp && gamepads[i].timestamp === this._gamePadTimeStamps[i]) {\n continue;\n }\n this._gamePadTimeStamps[i] = gamepads[i].timestamp;\n // Add reference to navigator gamepad\n this.at(i).navigatorGamepad = gamepads[i];\n // Buttons\n let b, bi, a, ai, value;\n for (b in Buttons) {\n bi = Buttons[b];\n if (typeof bi === 'number') {\n if (gamepads[i].buttons[bi]) {\n value = gamepads[i].buttons[bi].value;\n if (value !== this._oldPads[i].getButton(bi)) {\n if (gamepads[i].buttons[bi].pressed) {\n this.at(i).updateButton(bi, value);\n this.at(i).events.emit('button', new _Events__WEBPACK_IMPORTED_MODULE_1__.GamepadButtonEvent(bi, value, this.at(i)));\n }\n else {\n this.at(i).updateButton(bi, 0);\n }\n }\n }\n }\n }\n // Axes\n for (a in Axes) {\n ai = Axes[a];\n if (typeof ai === 'number') {\n value = gamepads[i].axes[ai];\n if (value !== this._oldPads[i].getAxes(ai)) {\n this.at(i).updateAxes(ai, value);\n this.at(i).events.emit('axis', new _Events__WEBPACK_IMPORTED_MODULE_1__.GamepadAxisEvent(ai, value, this.at(i)));\n }\n }\n }\n this._oldPads[i] = this._clonePad(gamepads[i]);\n }\n }\n /**\n * Safely retrieves a Gamepad at a specific index and creates one if it doesn't yet exist\n */\n at(index) {\n this._enableAndUpdate(); // implicitly enable gamepads when at() is called\n if (index >= this._pads.length) {\n // Ensure there is a pad to retrieve\n for (let i = this._pads.length - 1, max = index; i < max; i++) {\n this._pads.push(new Gamepad());\n this._oldPads.push(new Gamepad());\n }\n }\n return this._pads[index];\n }\n /**\n * Returns a list of all valid gamepads that meet the minimum configuration requirement.\n */\n getValidGamepads() {\n this._enableAndUpdate();\n const result = [];\n for (let i = 0; i < this._pads.length; i++) {\n if (this._isGamepadValid(this.at(i).navigatorGamepad) && this.at(i).connected) {\n result.push(this.at(i));\n }\n }\n return result;\n }\n /**\n * Gets the number of connected gamepads\n */\n count() {\n return this._pads.filter((p) => p.connected).length;\n }\n _clonePads(pads) {\n const arr = [];\n for (let i = 0, len = pads.length; i < len; i++) {\n arr.push(this._clonePad(pads[i]));\n }\n return arr;\n }\n /**\n * Fastest way to clone a known object is to do it yourself\n */\n _clonePad(pad) {\n let i, len;\n const clonedPad = new Gamepad();\n if (!pad) {\n return clonedPad;\n }\n for (i = 0, len = pad.buttons.length; i < len; i++) {\n if (pad.buttons[i]) {\n clonedPad.updateButton(i, pad.buttons[i].value);\n }\n }\n for (i = 0, len = pad.axes.length; i < len; i++) {\n clonedPad.updateAxes(i, pad.axes[i]);\n }\n return clonedPad;\n }\n}\n/**\n * The minimum value an axis has to move before considering it a change\n */\nGamepads.MinAxisMoveThreshold = 0.05;\n/**\n * Gamepad holds state information for a connected controller. See {@apilink Gamepads}\n * for more information on handling controller input.\n */\nclass Gamepad {\n constructor() {\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n this.connected = false;\n this._axes = new Array(4);\n this._buttons = new Array(16);\n this._buttonsUp = new Array(16);\n this._buttonsDown = new Array(16);\n for (let i = 0; i < this._buttons.length; i++) {\n this._buttons[i] = 0;\n }\n for (let i = 0; i < this._axes.length; i++) {\n this._axes[i] = 0;\n }\n }\n update() {\n // Reset buttonsDown and buttonsUp after update is complete\n this._buttonsDown = new Array(16);\n this._buttonsUp = new Array(16);\n }\n /**\n * Whether or not the given button is pressed\n * @deprecated will be removed in v0.28.0. Use isButtonHeld instead\n * @param button The button to query\n * @param threshold The threshold over which the button is considered to be pressed\n */\n isButtonPressed(button, threshold = 1) {\n return this._buttons[button] >= threshold;\n }\n /**\n * Tests if a certain button is held down. This is persisted between frames.\n * @param button The button to query\n * @param threshold The threshold over which the button is considered to be pressed\n */\n isButtonHeld(button, threshold = 1) {\n return this._buttons[button] >= threshold;\n }\n /**\n * Tests if a certain button was just pressed this frame. This is cleared at the end of the update frame.\n * @param button Test whether a button was just pressed\n * @param threshold The threshold over which the button is considered to be pressed\n */\n wasButtonPressed(button, threshold = 1) {\n return this._buttonsDown[button] >= threshold;\n }\n /**\n * Tests if a certain button was just released this frame. This is cleared at the end of the update frame.\n * @param button Test whether a button was just released\n */\n wasButtonReleased(button) {\n return Boolean(this._buttonsUp[button]);\n }\n /**\n * Gets the given button value between 0 and 1\n */\n getButton(button) {\n return this._buttons[button];\n }\n /**\n * Gets the given axis value between -1 and 1. Values below\n * {@apilink MinAxisMoveThreshold} are considered 0.\n */\n getAxes(axes) {\n const value = this._axes[axes];\n if (Math.abs(value) < Gamepads.MinAxisMoveThreshold) {\n return 0;\n }\n else {\n return value;\n }\n }\n updateButton(buttonIndex, value) {\n // button was just released\n if (value === 0 && this._buttons[buttonIndex]) {\n this._buttonsUp[buttonIndex] = 1;\n // button was just pressed\n }\n else {\n this._buttonsDown[buttonIndex] = value;\n }\n this._buttons[buttonIndex] = value;\n }\n updateAxes(axesIndex, value) {\n this._axes[axesIndex] = value;\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n}\n/**\n * Gamepad Buttons enumeration\n */\nvar Buttons;\n(function (Buttons) {\n /**\n * Face 1 button (e.g. A)\n */\n Buttons[Buttons[\"Face1\"] = 0] = \"Face1\";\n /**\n * Face 2 button (e.g. B)\n */\n Buttons[Buttons[\"Face2\"] = 1] = \"Face2\";\n /**\n * Face 3 button (e.g. X)\n */\n Buttons[Buttons[\"Face3\"] = 2] = \"Face3\";\n /**\n * Face 4 button (e.g. Y)\n */\n Buttons[Buttons[\"Face4\"] = 3] = \"Face4\";\n /**\n * Left bumper button\n */\n Buttons[Buttons[\"LeftBumper\"] = 4] = \"LeftBumper\";\n /**\n * Right bumper button\n */\n Buttons[Buttons[\"RightBumper\"] = 5] = \"RightBumper\";\n /**\n * Left trigger button\n */\n Buttons[Buttons[\"LeftTrigger\"] = 6] = \"LeftTrigger\";\n /**\n * Right trigger button\n */\n Buttons[Buttons[\"RightTrigger\"] = 7] = \"RightTrigger\";\n /**\n * Select button\n */\n Buttons[Buttons[\"Select\"] = 8] = \"Select\";\n /**\n * Start button\n */\n Buttons[Buttons[\"Start\"] = 9] = \"Start\";\n /**\n * Left analog stick press (e.g. L3)\n */\n Buttons[Buttons[\"LeftStick\"] = 10] = \"LeftStick\";\n /**\n * Right analog stick press (e.g. R3)\n */\n Buttons[Buttons[\"RightStick\"] = 11] = \"RightStick\";\n /**\n * D-pad up\n */\n Buttons[Buttons[\"DpadUp\"] = 12] = \"DpadUp\";\n /**\n * D-pad down\n */\n Buttons[Buttons[\"DpadDown\"] = 13] = \"DpadDown\";\n /**\n * D-pad left\n */\n Buttons[Buttons[\"DpadLeft\"] = 14] = \"DpadLeft\";\n /**\n * D-pad right\n */\n Buttons[Buttons[\"DpadRight\"] = 15] = \"DpadRight\";\n})(Buttons || (Buttons = {}));\n/**\n * Gamepad Axes enumeration\n */\nvar Axes;\n(function (Axes) {\n /**\n * Left analogue stick X direction\n */\n Axes[Axes[\"LeftStickX\"] = 0] = \"LeftStickX\";\n /**\n * Left analogue stick Y direction\n */\n Axes[Axes[\"LeftStickY\"] = 1] = \"LeftStickY\";\n /**\n * Right analogue stick X direction\n */\n Axes[Axes[\"RightStickX\"] = 2] = \"RightStickX\";\n /**\n * Right analogue stick Y direction\n */\n Axes[Axes[\"RightStickY\"] = 3] = \"RightStickY\";\n})(Axes || (Axes = {}));\n\n\n/***/ }),\n\n/***/ \"./Input/InputHost.ts\":\n/*!****************************!*\\\n !*** ./Input/InputHost.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ InputHost: () => (/* binding */ InputHost)\n/* harmony export */ });\n/* harmony import */ var _Gamepad__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Gamepad */ \"./Input/Gamepad.ts\");\n/* harmony import */ var _InputMapper__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./InputMapper */ \"./Input/InputMapper.ts\");\n/* harmony import */ var _Keyboard__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Keyboard */ \"./Input/Keyboard.ts\");\n/* harmony import */ var _PointerEventReceiver__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./PointerEventReceiver */ \"./Input/PointerEventReceiver.ts\");\n\n\n\n\nclass InputHost {\n constructor(options) {\n this._enabled = true;\n const { pointerTarget, grabWindowFocus, engine } = options;\n this.keyboard = new _Keyboard__WEBPACK_IMPORTED_MODULE_0__.Keyboard();\n this.pointers = new _PointerEventReceiver__WEBPACK_IMPORTED_MODULE_1__.PointerEventReceiver(pointerTarget, engine);\n this.gamepads = new _Gamepad__WEBPACK_IMPORTED_MODULE_2__.Gamepads();\n this.keyboard.init({ grabWindowFocus });\n this.pointers.init({ grabWindowFocus });\n this.gamepads.init();\n this.inputMapper = new _InputMapper__WEBPACK_IMPORTED_MODULE_3__.InputMapper({\n keyboard: this.keyboard,\n pointers: this.pointers,\n gamepads: this.gamepads\n });\n }\n get enabled() {\n return this._enabled;\n }\n toggleEnabled(enabled) {\n this._enabled = enabled;\n this.keyboard.toggleEnabled(this._enabled);\n this.pointers.toggleEnabled(this._enabled);\n this.gamepads.toggleEnabled(this._enabled);\n }\n update() {\n if (this._enabled) {\n this.inputMapper.execute();\n this.keyboard.update();\n this.gamepads.update();\n }\n }\n clear() {\n this.keyboard.clear();\n this.pointers.clear();\n // this.gamepads.clear();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Input/InputMapper.ts\":\n/*!******************************!*\\\n !*** ./Input/InputMapper.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ InputMapper: () => (/* binding */ InputMapper)\n/* harmony export */ });\n/**\n * This allows you to map multiple inputs to specific commands! This is especially useful when\n * you need to allow multiple input sources to control a specific action.\n */\nclass InputMapper {\n constructor(inputs) {\n this.inputs = inputs;\n this._handlers = new Map();\n }\n /**\n * Executes the input map, called internally by Excalibur\n */\n execute() {\n for (const [input, command] of this._handlers.entries()) {\n const results = input(this.inputs);\n if (results) {\n command(results);\n }\n }\n }\n /**\n * This allows you to map multiple inputs to specific commands! This is useful\n *\n * The inputHandler should return a truthy value if you wish the commandHandler to fire.\n *\n * Example:\n * ```typescript\n * const moveRight = (amount: number) => { actor.vel.x = 100 * amount }\n * const moveLeft = (amount: number) => { actor.vel.x = -100 * amount }\n * const moveUp = (amount: number) => { actor.vel.y = -100 * amount }\n * const moveDown = (amount: number) => { actor.vel.y = 100 * amount }\n *\n * engine.inputMapper.on(({keyboard}) => keyboard.isHeld(ex.Keys.ArrowRight) ? 1 : 0, moveRight);\n * engine.inputMapper.on(({gamepads}) => gamepads.at(0).isButtonPressed(ex.Buttons.DpadRight) ? 1 : 0, moveRight);\n * engine.inputMapper.on(({gamepads}) => gamepads.at(0).getAxes(ex.Axes.LeftStickX) > 0 ?\n * gamepads.at(0).getAxes(ex.Axes.LeftStickX) : 0, moveRight);\n * ```\n * @param inputHandler\n * @param commandHandler\n */\n on(inputHandler, commandHandler) {\n this._handlers.set(inputHandler, commandHandler);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Input/Keyboard.ts\":\n/*!***************************!*\\\n !*** ./Input/Keyboard.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ KeyEvent: () => (/* binding */ KeyEvent),\n/* harmony export */ KeyEvents: () => (/* binding */ KeyEvents),\n/* harmony export */ Keyboard: () => (/* binding */ Keyboard),\n/* harmony export */ Keys: () => (/* binding */ Keys)\n/* harmony export */ });\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _Util_IFrame__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Util/IFrame */ \"./Util/IFrame.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n\n/**\n * Enum representing physical input key codes\n *\n * Spec: https://w3c.github.io/uievents-code/#key-alphanumeric-section\n */\nvar Keys;\n(function (Keys) {\n // Writing System Keys https://w3c.github.io/uievents-code/#key-alphanumeric-writing-system\n Keys[\"Backquote\"] = \"Backquote\";\n Keys[\"Backslash\"] = \"Backslash\";\n Keys[\"BracketLeft\"] = \"BracketLeft\";\n Keys[\"BracketRight\"] = \"BracketRight\";\n Keys[\"Comma\"] = \"Comma\";\n // NUMBERS\n Keys[\"Key0\"] = \"Digit0\";\n Keys[\"Key1\"] = \"Digit1\";\n Keys[\"Key2\"] = \"Digit2\";\n Keys[\"Key3\"] = \"Digit3\";\n Keys[\"Key4\"] = \"Digit4\";\n Keys[\"Key5\"] = \"Digit5\";\n Keys[\"Key6\"] = \"Digit6\";\n Keys[\"Key7\"] = \"Digit7\";\n Keys[\"Key8\"] = \"Digit8\";\n Keys[\"Key9\"] = \"Digit9\";\n Keys[\"Digit0\"] = \"Digit0\";\n Keys[\"Digit1\"] = \"Digit1\";\n Keys[\"Digit2\"] = \"Digit2\";\n Keys[\"Digit3\"] = \"Digit3\";\n Keys[\"Digit4\"] = \"Digit4\";\n Keys[\"Digit5\"] = \"Digit5\";\n Keys[\"Digit6\"] = \"Digit6\";\n Keys[\"Digit7\"] = \"Digit7\";\n Keys[\"Digit8\"] = \"Digit8\";\n Keys[\"Digit9\"] = \"Digit9\";\n Keys[\"Equal\"] = \"Equal\";\n Keys[\"IntlBackslash\"] = \"IntlBackslash\";\n Keys[\"IntlRo\"] = \"IntlRo\";\n Keys[\"IntlYen\"] = \"IntlYen\";\n // LETTERS\n Keys[\"A\"] = \"KeyA\";\n Keys[\"B\"] = \"KeyB\";\n Keys[\"C\"] = \"KeyC\";\n Keys[\"D\"] = \"KeyD\";\n Keys[\"E\"] = \"KeyE\";\n Keys[\"F\"] = \"KeyF\";\n Keys[\"G\"] = \"KeyG\";\n Keys[\"H\"] = \"KeyH\";\n Keys[\"I\"] = \"KeyI\";\n Keys[\"J\"] = \"KeyJ\";\n Keys[\"K\"] = \"KeyK\";\n Keys[\"L\"] = \"KeyL\";\n Keys[\"M\"] = \"KeyM\";\n Keys[\"N\"] = \"KeyN\";\n Keys[\"O\"] = \"KeyO\";\n Keys[\"P\"] = \"KeyP\";\n Keys[\"Q\"] = \"KeyQ\";\n Keys[\"R\"] = \"KeyR\";\n Keys[\"S\"] = \"KeyS\";\n Keys[\"T\"] = \"KeyT\";\n Keys[\"U\"] = \"KeyU\";\n Keys[\"V\"] = \"KeyV\";\n Keys[\"W\"] = \"KeyW\";\n Keys[\"X\"] = \"KeyX\";\n Keys[\"Y\"] = \"KeyY\";\n Keys[\"Z\"] = \"KeyZ\";\n Keys[\"KeyA\"] = \"KeyA\";\n Keys[\"KeyB\"] = \"KeyB\";\n Keys[\"KeyC\"] = \"KeyC\";\n Keys[\"KeyD\"] = \"KeyD\";\n Keys[\"KeyE\"] = \"KeyE\";\n Keys[\"KeyF\"] = \"KeyF\";\n Keys[\"KeyG\"] = \"KeyG\";\n Keys[\"KeyH\"] = \"KeyH\";\n Keys[\"KeyI\"] = \"KeyI\";\n Keys[\"KeyJ\"] = \"KeyJ\";\n Keys[\"KeyK\"] = \"KeyK\";\n Keys[\"KeyL\"] = \"KeyL\";\n Keys[\"KeyM\"] = \"KeyM\";\n Keys[\"KeyN\"] = \"KeyN\";\n Keys[\"KeyO\"] = \"KeyO\";\n Keys[\"KeyP\"] = \"KeyP\";\n Keys[\"KeyQ\"] = \"KeyQ\";\n Keys[\"KeyR\"] = \"KeyR\";\n Keys[\"KeyS\"] = \"KeyS\";\n Keys[\"KeyT\"] = \"KeyT\";\n Keys[\"KeyU\"] = \"KeyU\";\n Keys[\"KeyV\"] = \"KeyV\";\n Keys[\"KeyW\"] = \"KeyW\";\n Keys[\"KeyX\"] = \"KeyX\";\n Keys[\"KeyY\"] = \"KeyY\";\n Keys[\"KeyZ\"] = \"KeyZ\";\n // SYMBOLS\n Keys[\"Minus\"] = \"Minus\";\n Keys[\"Period\"] = \"Period\";\n Keys[\"Quote\"] = \"Quote\";\n Keys[\"Semicolon\"] = \"Semicolon\";\n Keys[\"Slash\"] = \"Slash\";\n // Functional keys https://w3c.github.io/uievents-code/#key-alphanumeric-functional\n Keys[\"AltLeft\"] = \"AltLeft\";\n Keys[\"AltRight\"] = \"AltRight\";\n Keys[\"Alt\"] = \"Alt\";\n Keys[\"AltGraph\"] = \"AltGraph\";\n Keys[\"Backspace\"] = \"Backspace\";\n Keys[\"CapsLock\"] = \"CapsLock\";\n Keys[\"ContextMenu\"] = \"ContextMenu\";\n Keys[\"ControlLeft\"] = \"ControlLeft\";\n Keys[\"ControlRight\"] = \"ControlRight\";\n Keys[\"Enter\"] = \"Enter\";\n Keys[\"MetaLeft\"] = \"MetaLeft\";\n Keys[\"MetaRight\"] = \"MetaRight\";\n Keys[\"ShiftLeft\"] = \"ShiftLeft\";\n Keys[\"ShiftRight\"] = \"ShiftRight\";\n Keys[\"Space\"] = \"Space\";\n Keys[\"Tab\"] = \"Tab\";\n Keys[\"Convert\"] = \"Convert\";\n Keys[\"KanaMode\"] = \"KanaMode\";\n Keys[\"NonConvert\"] = \"NonConvert\";\n // Control Pad https://w3c.github.io/uievents-code/#key-controlpad-section\n Keys[\"Delete\"] = \"Delete\";\n Keys[\"End\"] = \"End\";\n Keys[\"Help\"] = \"Help\";\n Keys[\"Home\"] = \"Home\";\n Keys[\"Insert\"] = \"Insert\";\n Keys[\"PageDown\"] = \"PageDown\";\n Keys[\"PageUp\"] = \"PageUp\";\n // Arrow Pad https://w3c.github.io/uievents-code/#key-arrowpad-section\n Keys[\"Up\"] = \"ArrowUp\";\n Keys[\"Down\"] = \"ArrowDown\";\n Keys[\"Left\"] = \"ArrowLeft\";\n Keys[\"Right\"] = \"ArrowRight\";\n Keys[\"ArrowUp\"] = \"ArrowUp\";\n Keys[\"ArrowDown\"] = \"ArrowDown\";\n Keys[\"ArrowLeft\"] = \"ArrowLeft\";\n Keys[\"ArrowRight\"] = \"ArrowRight\";\n // Numpad Section https://w3c.github.io/uievents-code/#key-numpad-section\n Keys[\"NumLock\"] = \"NumLock\";\n Keys[\"Numpad0\"] = \"Numpad0\";\n Keys[\"Numpad1\"] = \"Numpad1\";\n Keys[\"Numpad2\"] = \"Numpad2\";\n Keys[\"Numpad3\"] = \"Numpad3\";\n Keys[\"Numpad4\"] = \"Numpad4\";\n Keys[\"Numpad5\"] = \"Numpad5\";\n Keys[\"Numpad6\"] = \"Numpad6\";\n Keys[\"Numpad7\"] = \"Numpad7\";\n Keys[\"Numpad8\"] = \"Numpad8\";\n Keys[\"Numpad9\"] = \"Numpad9\";\n Keys[\"Num0\"] = \"Numpad0\";\n Keys[\"Num1\"] = \"Numpad1\";\n Keys[\"Num2\"] = \"Numpad2\";\n Keys[\"Num3\"] = \"Numpad3\";\n Keys[\"Num4\"] = \"Numpad4\";\n Keys[\"Num5\"] = \"Numpad5\";\n Keys[\"Num6\"] = \"Numpad6\";\n Keys[\"Num7\"] = \"Numpad7\";\n Keys[\"Num8\"] = \"Numpad8\";\n Keys[\"Num9\"] = \"Numpad9\";\n Keys[\"NumAdd\"] = \"NumpadAdd\";\n Keys[\"NumpadAdd\"] = \"NumpadAdd\";\n Keys[\"NumDecimal\"] = \"NumpadDecimal\";\n Keys[\"NumpadDecimal\"] = \"NumpadDecimal\";\n Keys[\"NumDivide\"] = \"NumpadDivide\";\n Keys[\"NumpadDivide\"] = \"NumpadDivide\";\n Keys[\"NumEnter\"] = \"NumpadEnter\";\n Keys[\"NumpadEnter\"] = \"NumpadEnter\";\n Keys[\"NumMultiply\"] = \"NumpadMultiply\";\n Keys[\"NumpadMultiply\"] = \"NumpadMultiply\";\n Keys[\"NumSubtract\"] = \"NumpadSubtract\";\n Keys[\"NumpadSubtract\"] = \"NumpadSubtract\";\n // NumComma = 'NumpadComma', // not x-browser\n // NumpadComma = 'NumpadComma', // not x-browser\n // Function section https://w3c.github.io/uievents-code/#key-function-section\n Keys[\"Esc\"] = \"Escape\";\n Keys[\"Escape\"] = \"Escape\";\n Keys[\"F1\"] = \"F1\";\n Keys[\"F2\"] = \"F2\";\n Keys[\"F3\"] = \"F3\";\n Keys[\"F4\"] = \"F4\";\n Keys[\"F5\"] = \"F5\";\n Keys[\"F6\"] = \"F6\";\n Keys[\"F7\"] = \"F7\";\n Keys[\"F8\"] = \"F8\";\n Keys[\"F9\"] = \"F9\";\n Keys[\"F10\"] = \"F10\";\n Keys[\"F11\"] = \"F11\";\n Keys[\"F12\"] = \"F12\";\n Keys[\"F13\"] = \"F13\";\n Keys[\"F14\"] = \"F14\";\n Keys[\"F15\"] = \"F15\";\n Keys[\"F16\"] = \"F16\";\n Keys[\"F17\"] = \"F17\";\n Keys[\"F18\"] = \"F18\";\n Keys[\"F19\"] = \"F19\";\n Keys[\"F20\"] = \"F20\";\n Keys[\"PrintScreen\"] = \"PrintScreen\";\n Keys[\"ScrollLock\"] = \"ScrollLock\";\n Keys[\"Pause\"] = \"Pause\";\n Keys[\"Unidentified\"] = \"Unidentified\";\n})(Keys || (Keys = {}));\n/**\n * Event thrown on a game object for a key event\n */\nclass KeyEvent extends _Events__WEBPACK_IMPORTED_MODULE_0__.GameEvent {\n /**\n * @param key The key responsible for throwing the event\n * @param value The key's typed value the browser detected\n * @param originalEvent The original keyboard event that Excalibur handled\n */\n constructor(key, value, originalEvent) {\n super();\n this.key = key;\n this.value = value;\n this.originalEvent = originalEvent;\n }\n}\nconst KeyEvents = {\n Press: 'press',\n Hold: 'hold',\n Release: 'release'\n};\n/**\n * Provides keyboard support for Excalibur.\n */\nclass Keyboard {\n constructor() {\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_1__.EventEmitter();\n this._enabled = true;\n /**\n * Keys that are currently held down\n */\n this._keys = [];\n /**\n * Keys up in the current frame\n */\n this._keysUp = [];\n /**\n * Keys down in the current frame\n */\n this._keysDown = [];\n this._releaseAllKeys = (ev) => {\n for (const code of this._keys) {\n const keyEvent = new KeyEvent(code, ev.key, ev);\n this.events.emit('up', keyEvent);\n this.events.emit('release', keyEvent);\n }\n this._keysUp = Array.from(new Set(this._keys.concat(this._keysUp)));\n this._keys.length = 0;\n };\n this._handleKeyDown = (ev) => {\n if (!this._enabled) {\n return;\n }\n // handle macos meta key issue\n // https://github.com/excaliburjs/Excalibur/issues/2608\n if (!ev.metaKey && (this._keys.includes(Keys.MetaLeft) || this._keys.includes(Keys.MetaRight))) {\n this._releaseAllKeys(ev);\n }\n const code = ev.code;\n if (this._keys.indexOf(code) === -1) {\n this._keys.push(code);\n this._keysDown.push(code);\n const keyEvent = new KeyEvent(code, ev.key, ev);\n this.events.emit('down', keyEvent);\n this.events.emit('press', keyEvent);\n }\n };\n this._handleKeyUp = (ev) => {\n if (!this._enabled) {\n return;\n }\n const code = ev.code;\n const key = this._keys.indexOf(code);\n this._keys.splice(key, 1);\n this._keysUp.push(code);\n const keyEvent = new KeyEvent(code, ev.key, ev);\n // alias the old api, we may want to deprecate this in the future\n this.events.emit('up', keyEvent);\n this.events.emit('release', keyEvent);\n // handle macos meta key issue\n // https://github.com/excaliburjs/Excalibur/issues/2608\n if (ev.key === 'Meta') {\n this._releaseAllKeys(ev);\n }\n };\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n /**\n * Initialize Keyboard event listeners\n */\n init(keyboardOptions) {\n let { global } = keyboardOptions;\n const { grabWindowFocus } = keyboardOptions;\n if (!global) {\n if ((0,_Util_IFrame__WEBPACK_IMPORTED_MODULE_2__.isCrossOriginIframe)()) {\n global = window;\n // Workaround for iframes like for itch.io or codesandbox\n // https://www.reddit.com/r/gamemaker/comments/kfs5cs/keyboard_inputs_no_longer_working_in_html5_game/\n // https://forum.gamemaker.io/index.php?threads/solved-keyboard-issue-on-itch-io.87336/\n if (grabWindowFocus) {\n window.focus();\n }\n _Util_Log__WEBPACK_IMPORTED_MODULE_3__.Logger.getInstance().warn('Excalibur might be in a cross-origin iframe, in order to receive keyboard events it must be in focus');\n }\n else {\n global = window.top;\n }\n }\n global.addEventListener('blur', () => {\n this._keys.length = 0; // empties array efficiently\n });\n // key up is on window because canvas cannot have focus\n global.addEventListener('keyup', this._handleKeyUp);\n // key down is on window because canvas cannot have focus\n global.addEventListener('keydown', this._handleKeyDown);\n }\n toggleEnabled(enabled) {\n this._enabled = enabled;\n }\n clear() {\n this._keysDown.length = 0;\n this._keysUp.length = 0;\n this._keys.length = 0;\n }\n update() {\n // Reset keysDown and keysUp after update is complete\n this._keysDown.length = 0;\n this._keysUp.length = 0;\n // Emit synthetic \"hold\" event\n for (let i = 0; i < this._keys.length; i++) {\n this.events.emit('hold', new KeyEvent(this._keys[i]));\n }\n }\n /**\n * Gets list of keys being pressed down\n */\n getKeys() {\n return this._keys;\n }\n /**\n * Tests if a certain key was just pressed this frame. This is cleared at the end of the update frame.\n * @param key Test whether a key was just pressed\n */\n wasPressed(key) {\n if (!this._enabled) {\n return false;\n }\n return this._keysDown.indexOf(key) > -1;\n }\n /**\n * Tests if a certain key is held down. This is persisted between frames.\n * @param key Test whether a key is held down\n */\n isHeld(key) {\n if (!this._enabled) {\n return false;\n }\n return this._keys.indexOf(key) > -1;\n }\n /**\n * Tests if a certain key was just released this frame. This is cleared at the end of the update frame.\n * @param key Test whether a key was just released\n */\n wasReleased(key) {\n if (!this._enabled) {\n return false;\n }\n return this._keysUp.indexOf(key) > -1;\n }\n /**\n * Trigger a manual key event\n * @param type\n * @param key\n * @param character\n */\n triggerEvent(type, key, character) {\n if (type === 'down') {\n this._handleKeyDown(new KeyboardEvent('keydown', {\n code: key,\n key: character !== null && character !== void 0 ? character : null\n }));\n }\n if (type === 'up') {\n this._handleKeyUp(new KeyboardEvent('keyup', {\n code: key,\n key: character !== null && character !== void 0 ? character : null\n }));\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Input/NativePointerButton.ts\":\n/*!**************************************!*\\\n !*** ./Input/NativePointerButton.ts ***!\n \\**************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ NativePointerButton: () => (/* binding */ NativePointerButton)\n/* harmony export */ });\n/**\n * Native browser button enumeration\n */\nvar NativePointerButton;\n(function (NativePointerButton) {\n NativePointerButton[NativePointerButton[\"NoButton\"] = -1] = \"NoButton\";\n NativePointerButton[NativePointerButton[\"Left\"] = 0] = \"Left\";\n NativePointerButton[NativePointerButton[\"Middle\"] = 1] = \"Middle\";\n NativePointerButton[NativePointerButton[\"Right\"] = 2] = \"Right\";\n NativePointerButton[NativePointerButton[\"Unknown\"] = 3] = \"Unknown\";\n})(NativePointerButton || (NativePointerButton = {}));\n\n\n/***/ }),\n\n/***/ \"./Input/PointerAbstraction.ts\":\n/*!*************************************!*\\\n !*** ./Input/PointerAbstraction.ts ***!\n \\*************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerAbstraction: () => (/* binding */ PointerAbstraction)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Math_global_coordinates__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Math/global-coordinates */ \"./Math/global-coordinates.ts\");\n\n\n\nclass PointerAbstraction {\n constructor() {\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n /**\n * The last position on the document this pointer was at. Can be `null` if pointer was never active.\n */\n this.lastPagePos = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n /**\n * The last position on the screen this pointer was at. Can be `null` if pointer was never active.\n */\n this.lastScreenPos = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n /**\n * The last position in the game world coordinates this pointer was at. Can be `null` if pointer was never active.\n */\n this.lastWorldPos = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n this._onPointerMove = (ev) => {\n this.lastPagePos = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(ev.pagePos.x, ev.pagePos.y);\n this.lastScreenPos = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(ev.screenPos.x, ev.screenPos.y);\n this.lastWorldPos = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(ev.worldPos.x, ev.worldPos.y);\n };\n this._onPointerDown = (ev) => {\n this.lastPagePos = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(ev.pagePos.x, ev.pagePos.y);\n this.lastScreenPos = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(ev.screenPos.x, ev.screenPos.y);\n this.lastWorldPos = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(ev.worldPos.x, ev.worldPos.y);\n };\n this.on('move', this._onPointerMove);\n this.on('down', this._onPointerDown);\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n /**\n * Called internally by excalibur to keep pointers up to date\n * @internal\n * @param engine\n */\n _updateWorldPosition(engine) {\n const coord = _Math_global_coordinates__WEBPACK_IMPORTED_MODULE_2__.GlobalCoordinates.fromPagePosition(this.lastPagePos, engine);\n this.lastScreenPos = coord.screenPos;\n this.lastWorldPos = coord.worldPos;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Input/PointerButton.ts\":\n/*!********************************!*\\\n !*** ./Input/PointerButton.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerButton: () => (/* binding */ PointerButton)\n/* harmony export */ });\n/**\n * The mouse button being pressed.\n */\nvar PointerButton;\n(function (PointerButton) {\n PointerButton[\"Left\"] = \"Left\";\n PointerButton[\"Middle\"] = \"Middle\";\n PointerButton[\"Right\"] = \"Right\";\n PointerButton[\"Unknown\"] = \"Unknown\";\n PointerButton[\"NoButton\"] = \"NoButton\";\n})(PointerButton || (PointerButton = {}));\n\n\n/***/ }),\n\n/***/ \"./Input/PointerComponent.ts\":\n/*!***********************************!*\\\n !*** ./Input/PointerComponent.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerComponent: () => (/* binding */ PointerComponent)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Component */ \"./EntityComponentSystem/Component.ts\");\n\n/**\n * Add this component to optionally configure how the pointer\n * system detects pointer events.\n *\n * By default the collider shape is used and graphics bounds is not.\n *\n * If both collider shape and graphics bounds are enabled it will fire events if either or\n * are intersecting the pointer.\n */\nclass PointerComponent extends _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor(options) {\n var _a, _b;\n super();\n /**\n * Use any existing Collider component geometry for pointer events. This is useful if you want\n * user pointer events only to trigger on the same collision geometry used in the collider component\n * for collision resolution. Default is `true`.\n */\n this.useColliderShape = true;\n /**\n * Use any existing Graphics component bounds for pointers. This is useful if you want the axis aligned\n * bounds around the graphic to trigger pointer events. Default is `true`.\n */\n this.useGraphicsBounds = true;\n this.useColliderShape = (_a = options === null || options === void 0 ? void 0 : options.useColliderShape) !== null && _a !== void 0 ? _a : this.useColliderShape;\n this.useGraphicsBounds = (_b = options === null || options === void 0 ? void 0 : options.useGraphicsBounds) !== null && _b !== void 0 ? _b : this.useGraphicsBounds;\n this.localBounds = options === null || options === void 0 ? void 0 : options.localBounds;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Input/PointerEvent.ts\":\n/*!*******************************!*\\\n !*** ./Input/PointerEvent.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerEvent: () => (/* binding */ PointerEvent)\n/* harmony export */ });\nclass PointerEvent {\n cancel() {\n this.active = false;\n }\n get pagePos() {\n return this.coordinates.pagePos;\n }\n get screenPos() {\n return this.coordinates.screenPos;\n }\n get worldPos() {\n return this.coordinates.worldPos;\n }\n constructor(type, pointerId, button, pointerType, coordinates, nativeEvent) {\n this.type = type;\n this.pointerId = pointerId;\n this.button = button;\n this.pointerType = pointerType;\n this.coordinates = coordinates;\n this.nativeEvent = nativeEvent;\n this.active = true;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Input/PointerEventReceiver.ts\":\n/*!***************************************!*\\\n !*** ./Input/PointerEventReceiver.ts ***!\n \\***************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerEventReceiver: () => (/* binding */ PointerEventReceiver),\n/* harmony export */ PointerEvents: () => (/* binding */ PointerEvents)\n/* harmony export */ });\n/* harmony import */ var _Engine__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Engine */ \"./Engine.ts\");\n/* harmony import */ var _Math_global_coordinates__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Math/global-coordinates */ \"./Math/global-coordinates.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _PointerEvent__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./PointerEvent */ \"./Input/PointerEvent.ts\");\n/* harmony import */ var _WheelEvent__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./WheelEvent */ \"./Input/WheelEvent.ts\");\n/* harmony import */ var _PointerAbstraction__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./PointerAbstraction */ \"./Input/PointerAbstraction.ts\");\n/* harmony import */ var _WheelDeltaMode__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./WheelDeltaMode */ \"./Input/WheelDeltaMode.ts\");\n/* harmony import */ var _PointerSystem__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./PointerSystem */ \"./Input/PointerSystem.ts\");\n/* harmony import */ var _NativePointerButton__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./NativePointerButton */ \"./Input/NativePointerButton.ts\");\n/* harmony import */ var _PointerButton__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./PointerButton */ \"./Input/PointerButton.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../Util/Util */ \"./Util/Util.ts\");\n/* harmony import */ var _PointerType__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./PointerType */ \"./Input/PointerType.ts\");\n/* harmony import */ var _Util_IFrame__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Util/IFrame */ \"./Util/IFrame.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst PointerEvents = {\n Move: 'move',\n Down: 'down',\n Up: 'up',\n Wheel: 'wheel'\n};\n/**\n * Is this event a native touch event?\n */\nfunction isTouchEvent(value) {\n // Guard for Safari <= 13.1\n return globalThis.TouchEvent && value instanceof globalThis.TouchEvent;\n}\n/**\n * Is this event a native pointer event\n */\nfunction isPointerEvent(value) {\n // Guard for Safari <= 13.1\n return globalThis.PointerEvent && value instanceof globalThis.PointerEvent;\n}\n/**\n * The PointerEventProcessor is responsible for collecting all the events from the canvas and transforming them into GlobalCoordinates\n */\nclass PointerEventReceiver {\n constructor(target, engine) {\n this.target = target;\n this.engine = engine;\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n this.primary = new _PointerAbstraction__WEBPACK_IMPORTED_MODULE_1__.PointerAbstraction();\n this._activeNativePointerIdsToNormalized = new Map();\n this.lastFramePointerCoords = new Map();\n this.currentFramePointerCoords = new Map();\n this.currentFramePointerDown = new Map();\n this.lastFramePointerDown = new Map();\n this.currentFrameDown = [];\n this.currentFrameUp = [];\n this.currentFrameMove = [];\n this.currentFrameCancel = [];\n this.currentFrameWheel = [];\n this._enabled = true;\n this._pointers = [this.primary];\n this._boundHandle = this._handle.bind(this);\n this._boundWheel = this._handleWheel.bind(this);\n }\n toggleEnabled(enabled) {\n this._enabled = enabled;\n }\n /**\n * Creates a new PointerEventReceiver with a new target and engine while preserving existing pointer event\n * handlers.\n * @param target\n * @param engine\n */\n recreate(target, engine) {\n const eventReceiver = new PointerEventReceiver(target, engine);\n eventReceiver.primary = this.primary;\n eventReceiver._pointers = this._pointers;\n return eventReceiver;\n }\n /**\n * Locates a specific pointer by id, creates it if it doesn't exist\n * @param index\n */\n at(index) {\n if (index >= this._pointers.length) {\n // Ensure there is a pointer to retrieve\n for (let i = this._pointers.length - 1, max = index; i < max; i++) {\n this._pointers.push(new _PointerAbstraction__WEBPACK_IMPORTED_MODULE_1__.PointerAbstraction());\n }\n }\n return this._pointers[index];\n }\n /**\n * The number of pointers currently being tracked by excalibur\n */\n count() {\n return this._pointers.length;\n }\n /**\n * Is the specified pointer id down this frame\n * @param pointerId\n */\n isDown(pointerId) {\n var _a;\n if (!this._enabled) {\n return false;\n }\n return (_a = this.currentFramePointerDown.get(pointerId)) !== null && _a !== void 0 ? _a : false;\n }\n /**\n * Was the specified pointer id down last frame\n * @param pointerId\n */\n wasDown(pointerId) {\n var _a;\n if (!this._enabled) {\n return false;\n }\n return (_a = this.lastFramePointerDown.get(pointerId)) !== null && _a !== void 0 ? _a : false;\n }\n /**\n * Whether the Pointer is currently dragging.\n */\n isDragging(pointerId) {\n if (!this._enabled) {\n return false;\n }\n return this.isDown(pointerId);\n }\n /**\n * Whether the Pointer just started dragging.\n */\n isDragStart(pointerId) {\n if (!this._enabled) {\n return false;\n }\n return this.isDown(pointerId) && !this.wasDown(pointerId);\n }\n /**\n * Whether the Pointer just ended dragging.\n */\n isDragEnd(pointerId) {\n if (!this._enabled) {\n return false;\n }\n return !this.isDown(pointerId) && this.wasDown(pointerId);\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n /**\n * Called internally by excalibur\n *\n * Updates the current frame pointer info and emits raw pointer events\n *\n * This does not emit events to entities, see PointerSystem\n * @internal\n */\n update() {\n this.lastFramePointerDown = new Map(this.currentFramePointerDown);\n this.lastFramePointerCoords = new Map(this.currentFramePointerCoords);\n for (const event of this.currentFrameDown) {\n if (!event.active) {\n continue;\n }\n this.emit('down', event);\n const pointer = this.at(event.pointerId);\n pointer.emit('down', event);\n this.primary.emit('pointerdown', event);\n }\n for (const event of this.currentFrameUp) {\n if (!event.active) {\n continue;\n }\n this.emit('up', event);\n const pointer = this.at(event.pointerId);\n pointer.emit('up', event);\n }\n for (const event of this.currentFrameMove) {\n if (!event.active) {\n continue;\n }\n this.emit('move', event);\n const pointer = this.at(event.pointerId);\n pointer.emit('move', event);\n }\n for (const event of this.currentFrameCancel) {\n if (!event.active) {\n continue;\n }\n this.emit('cancel', event);\n const pointer = this.at(event.pointerId);\n pointer.emit('cancel', event);\n }\n for (const event of this.currentFrameWheel) {\n if (!event.active) {\n continue;\n }\n this.emit('pointerwheel', event);\n this.emit('wheel', event);\n this.primary.emit('pointerwheel', event);\n this.primary.emit('wheel', event);\n }\n if (this.engine.currentScene.camera.hasChanged()) {\n for (const pointer of this._pointers) {\n pointer._updateWorldPosition(this.engine);\n }\n }\n }\n /**\n * Clears the current frame event and pointer data\n */\n clear() {\n for (const event of this.currentFrameUp) {\n this.currentFramePointerCoords.delete(event.pointerId);\n const ids = this._activeNativePointerIdsToNormalized.entries();\n for (const [native, normalized] of ids) {\n if (normalized === event.pointerId) {\n this._activeNativePointerIdsToNormalized.delete(native);\n }\n }\n }\n this.currentFrameDown.length = 0;\n this.currentFrameUp.length = 0;\n this.currentFrameMove.length = 0;\n this.currentFrameCancel.length = 0;\n this.currentFrameWheel.length = 0;\n }\n /**\n * Initializes the pointer event receiver so that it can start listening to native\n * browser events.\n */\n init(options) {\n var _a;\n if (this.engine.isDisposed()) {\n return;\n }\n // Disabling the touch action avoids browser/platform gestures from firing on the canvas\n // It is important on mobile to have touch action 'none'\n // https://stackoverflow.com/questions/48124372/pointermove-event-not-working-with-touch-why-not\n if (this.target === this.engine.canvas) {\n this.engine.canvas.style.touchAction = 'none';\n }\n else {\n document.body.style.touchAction = 'none';\n }\n // Preferred pointer events\n if (window.PointerEvent) {\n this.target.addEventListener('pointerdown', this._boundHandle);\n this.target.addEventListener('pointerup', this._boundHandle);\n this.target.addEventListener('pointermove', this._boundHandle);\n this.target.addEventListener('pointercancel', this._boundHandle);\n }\n else {\n // Touch Events\n this.target.addEventListener('touchstart', this._boundHandle);\n this.target.addEventListener('touchend', this._boundHandle);\n this.target.addEventListener('touchmove', this._boundHandle);\n this.target.addEventListener('touchcancel', this._boundHandle);\n // Mouse Events\n this.target.addEventListener('mousedown', this._boundHandle);\n this.target.addEventListener('mouseup', this._boundHandle);\n this.target.addEventListener('mousemove', this._boundHandle);\n }\n // MDN MouseWheelEvent\n const wheelOptions = {\n passive: !(this.engine.pageScrollPreventionMode === _Engine__WEBPACK_IMPORTED_MODULE_2__.ScrollPreventionMode.All ||\n this.engine.pageScrollPreventionMode === _Engine__WEBPACK_IMPORTED_MODULE_2__.ScrollPreventionMode.Canvas)\n };\n if ('onwheel' in document.createElement('div')) {\n // Modern Browsers\n this.target.addEventListener('wheel', this._boundWheel, wheelOptions);\n }\n else if (document.onmousewheel !== undefined) {\n // Webkit and IE\n this.target.addEventListener('mousewheel', this._boundWheel, wheelOptions);\n }\n else {\n // Remaining browser and older Firefox\n this.target.addEventListener('MozMousePixelScroll', this._boundWheel, wheelOptions);\n }\n const grabWindowFocus = (_a = options === null || options === void 0 ? void 0 : options.grabWindowFocus) !== null && _a !== void 0 ? _a : true;\n // Handle cross origin iframe\n if (grabWindowFocus && (0,_Util_IFrame__WEBPACK_IMPORTED_MODULE_3__.isCrossOriginIframe)()) {\n const grabFocus = () => {\n window.focus();\n };\n // Preferred pointer events\n if (window.PointerEvent) {\n this.target.addEventListener('pointerdown', grabFocus);\n }\n else {\n // Touch Events\n this.target.addEventListener('touchstart', grabFocus);\n // Mouse Events\n this.target.addEventListener('mousedown', grabFocus);\n }\n }\n }\n detach() {\n // Preferred pointer events\n if (window.PointerEvent) {\n this.target.removeEventListener('pointerdown', this._boundHandle);\n this.target.removeEventListener('pointerup', this._boundHandle);\n this.target.removeEventListener('pointermove', this._boundHandle);\n this.target.removeEventListener('pointercancel', this._boundHandle);\n }\n else {\n // Touch Events\n this.target.removeEventListener('touchstart', this._boundHandle);\n this.target.removeEventListener('touchend', this._boundHandle);\n this.target.removeEventListener('touchmove', this._boundHandle);\n this.target.removeEventListener('touchcancel', this._boundHandle);\n // Mouse Events\n this.target.removeEventListener('mousedown', this._boundHandle);\n this.target.removeEventListener('mouseup', this._boundHandle);\n this.target.removeEventListener('mousemove', this._boundHandle);\n }\n if ('onwheel' in document.createElement('div')) {\n // Modern Browsers\n this.target.removeEventListener('wheel', this._boundWheel);\n }\n else if (document.onmousewheel !== undefined) {\n // Webkit and IE\n this.target.addEventListener('mousewheel', this._boundWheel);\n }\n else {\n // Remaining browser and older Firefox\n this.target.addEventListener('MozMousePixelScroll', this._boundWheel);\n }\n }\n /**\n * Take native pointer id and map it to index in active pointers\n * @param nativePointerId\n */\n _normalizePointerId(nativePointerId) {\n // Add to the the native pointer set id\n this._activeNativePointerIdsToNormalized.set(nativePointerId, -1);\n // Native pointer ids in ascending order\n const currentPointerIds = Array.from(this._activeNativePointerIdsToNormalized.keys()).sort((a, b) => a - b);\n // The index into sorted ids will be the new id, will always have an id\n const id = currentPointerIds.findIndex((p) => p === nativePointerId);\n // Save the mapping so we can reverse it later\n this._activeNativePointerIdsToNormalized.set(nativePointerId, id);\n // ignore pointer because game isn't watching\n return id;\n }\n /**\n * Responsible for handling and parsing pointer events\n */\n _handle(ev) {\n if (!this._enabled) {\n return;\n }\n ev.preventDefault();\n const eventCoords = new Map();\n let button;\n let pointerType;\n if (isTouchEvent(ev)) {\n button = _PointerButton__WEBPACK_IMPORTED_MODULE_4__.PointerButton.Unknown;\n pointerType = _PointerType__WEBPACK_IMPORTED_MODULE_5__.PointerType.Touch;\n // https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent\n for (let i = 0; i < ev.changedTouches.length; i++) {\n const touch = ev.changedTouches[i];\n const coordinates = _Math_global_coordinates__WEBPACK_IMPORTED_MODULE_6__.GlobalCoordinates.fromPagePosition(touch.pageX, touch.pageY, this.engine);\n const nativePointerId = i + 1;\n const pointerId = this._normalizePointerId(nativePointerId);\n this.currentFramePointerCoords.set(pointerId, coordinates);\n eventCoords.set(pointerId, coordinates);\n }\n }\n else {\n button = this._nativeButtonToPointerButton(ev.button);\n pointerType = _PointerType__WEBPACK_IMPORTED_MODULE_5__.PointerType.Mouse;\n const coordinates = _Math_global_coordinates__WEBPACK_IMPORTED_MODULE_6__.GlobalCoordinates.fromPagePosition(ev.pageX, ev.pageY, this.engine);\n let nativePointerId = 1;\n if (isPointerEvent(ev)) {\n nativePointerId = ev.pointerId;\n pointerType = this._stringToPointerType(ev.pointerType);\n }\n const pointerId = this._normalizePointerId(nativePointerId);\n this.currentFramePointerCoords.set(pointerId, coordinates);\n eventCoords.set(pointerId, coordinates);\n }\n for (const [pointerId, coord] of eventCoords.entries()) {\n switch (ev.type) {\n case 'mousedown':\n case 'pointerdown':\n case 'touchstart':\n this.currentFrameDown.push(new _PointerEvent__WEBPACK_IMPORTED_MODULE_7__.PointerEvent('down', pointerId, button, pointerType, coord, ev));\n this.currentFramePointerDown.set(pointerId, true);\n break;\n case 'mouseup':\n case 'pointerup':\n case 'touchend':\n this.currentFrameUp.push(new _PointerEvent__WEBPACK_IMPORTED_MODULE_7__.PointerEvent('up', pointerId, button, pointerType, coord, ev));\n this.currentFramePointerDown.set(pointerId, false);\n break;\n case 'mousemove':\n case 'pointermove':\n case 'touchmove':\n this.currentFrameMove.push(new _PointerEvent__WEBPACK_IMPORTED_MODULE_7__.PointerEvent('move', pointerId, button, pointerType, coord, ev));\n break;\n case 'touchcancel':\n case 'pointercancel':\n this.currentFrameCancel.push(new _PointerEvent__WEBPACK_IMPORTED_MODULE_7__.PointerEvent('cancel', pointerId, button, pointerType, coord, ev));\n break;\n }\n }\n }\n _handleWheel(ev) {\n if (!this._enabled) {\n return;\n }\n // Should we prevent page scroll because of this event\n if (this.engine.pageScrollPreventionMode === _Engine__WEBPACK_IMPORTED_MODULE_2__.ScrollPreventionMode.All ||\n (this.engine.pageScrollPreventionMode === _Engine__WEBPACK_IMPORTED_MODULE_2__.ScrollPreventionMode.Canvas && ev.target === this.engine.canvas)) {\n ev.preventDefault();\n }\n const screen = this.engine.screen.pageToScreenCoordinates((0,_Math_vector__WEBPACK_IMPORTED_MODULE_8__.vec)(ev.pageX, ev.pageY));\n const world = this.engine.screen.screenToWorldCoordinates(screen);\n /**\n * A constant used to normalize wheel events across different browsers\n *\n * This normalization factor is pulled from\n * https://developer.mozilla.org/en-US/docs/Web/Events/wheel#Listening_to_this_event_across_browser\n */\n const ScrollWheelNormalizationFactor = -1 / 40;\n const deltaX = ev.deltaX || ev.wheelDeltaX * ScrollWheelNormalizationFactor || 0;\n const deltaY = ev.deltaY || ev.wheelDeltaY * ScrollWheelNormalizationFactor || ev.wheelDelta * ScrollWheelNormalizationFactor || ev.detail || 0;\n const deltaZ = ev.deltaZ || 0;\n let deltaMode = _WheelDeltaMode__WEBPACK_IMPORTED_MODULE_9__.WheelDeltaMode.Pixel;\n if (ev.deltaMode) {\n if (ev.deltaMode === 1) {\n deltaMode = _WheelDeltaMode__WEBPACK_IMPORTED_MODULE_9__.WheelDeltaMode.Line;\n }\n else if (ev.deltaMode === 2) {\n deltaMode = _WheelDeltaMode__WEBPACK_IMPORTED_MODULE_9__.WheelDeltaMode.Page;\n }\n }\n const we = new _WheelEvent__WEBPACK_IMPORTED_MODULE_10__.WheelEvent(world.x, world.y, ev.pageX, ev.pageY, screen.x, screen.y, 0, deltaX, deltaY, deltaZ, deltaMode, ev);\n this.currentFrameWheel.push(we);\n }\n /**\n * Triggers an excalibur pointer event in a world space pos\n *\n * Useful for testing pointers in excalibur\n * @param type\n * @param pos\n */\n triggerEvent(type, pos) {\n const page = this.engine.screen.worldToPageCoordinates(pos);\n // Send an event to the event receiver\n if (window.PointerEvent) {\n this._handle(new window.PointerEvent('pointer' + type, {\n pointerId: 0,\n clientX: page.x,\n clientY: page.y\n }));\n }\n else {\n // Safari hack\n this._handle(new window.MouseEvent('mouse' + type, {\n clientX: page.x,\n clientY: page.y\n }));\n }\n // Force update pointer system\n const pointerSystem = this.engine.currentScene.world.get(_PointerSystem__WEBPACK_IMPORTED_MODULE_11__.PointerSystem);\n pointerSystem.preupdate(this.engine.currentScene, 1);\n pointerSystem.update(1);\n }\n _nativeButtonToPointerButton(s) {\n switch (s) {\n case _NativePointerButton__WEBPACK_IMPORTED_MODULE_12__.NativePointerButton.NoButton:\n return _PointerButton__WEBPACK_IMPORTED_MODULE_4__.PointerButton.NoButton;\n case _NativePointerButton__WEBPACK_IMPORTED_MODULE_12__.NativePointerButton.Left:\n return _PointerButton__WEBPACK_IMPORTED_MODULE_4__.PointerButton.Left;\n case _NativePointerButton__WEBPACK_IMPORTED_MODULE_12__.NativePointerButton.Middle:\n return _PointerButton__WEBPACK_IMPORTED_MODULE_4__.PointerButton.Middle;\n case _NativePointerButton__WEBPACK_IMPORTED_MODULE_12__.NativePointerButton.Right:\n return _PointerButton__WEBPACK_IMPORTED_MODULE_4__.PointerButton.Right;\n case _NativePointerButton__WEBPACK_IMPORTED_MODULE_12__.NativePointerButton.Unknown:\n return _PointerButton__WEBPACK_IMPORTED_MODULE_4__.PointerButton.Unknown;\n default:\n return (0,_Util_Util__WEBPACK_IMPORTED_MODULE_13__.fail)(s);\n }\n }\n _stringToPointerType(s) {\n switch (s) {\n case 'touch':\n return _PointerType__WEBPACK_IMPORTED_MODULE_5__.PointerType.Touch;\n case 'mouse':\n return _PointerType__WEBPACK_IMPORTED_MODULE_5__.PointerType.Mouse;\n case 'pen':\n return _PointerType__WEBPACK_IMPORTED_MODULE_5__.PointerType.Pen;\n default:\n return _PointerType__WEBPACK_IMPORTED_MODULE_5__.PointerType.Unknown;\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Input/PointerEventsToObjectDispatcher.ts\":\n/*!**************************************************!*\\\n !*** ./Input/PointerEventsToObjectDispatcher.ts ***!\n \\**************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerEventsToObjectDispatcher: () => (/* binding */ PointerEventsToObjectDispatcher),\n/* harmony export */ PointerTargetObjectProxy: () => (/* binding */ PointerTargetObjectProxy)\n/* harmony export */ });\n/* harmony import */ var _Util_RentalPool__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Util/RentalPool */ \"./Util/RentalPool.ts\");\n\n/**\n *\n */\nfunction hasNestedEvents(object) {\n return object && object._dispatchPointerEvents && object._processPointerToObject;\n}\nclass PointerTargetObjectProxy {\n get events() {\n return this.object.events;\n }\n init(object, contains, active) {\n this.object = object;\n this.contains = contains;\n this.active = active;\n }\n}\nclass PointerEventsToObjectDispatcher {\n constructor() {\n this._proxyPool = new _Util_RentalPool__WEBPACK_IMPORTED_MODULE_0__.RentalPool(() => new PointerTargetObjectProxy(), (p) => p, 100);\n this._objectToProxy = new Map();\n this._proxies = [];\n this._lastFrameObjectToPointers = new Map();\n this._currentFrameObjectToPointers = new Map();\n }\n /**\n * Tracks an object to associate with pointers and their events\n * @param object\n * @param contains\n * @param active\n */\n addObject(object, contains, active) {\n const proxy = this._proxyPool.rent(false);\n proxy.init(object, contains, active);\n this._proxies.push(proxy);\n this._objectToProxy.set(object, proxy);\n }\n _getProxy(object) {\n const proxy = this._objectToProxy.get(object);\n if (proxy) {\n return proxy;\n }\n throw new Error('No PointerTargetProxy for object');\n }\n /**\n * Untracks an object associated with pointers and their events\n * @param object\n */\n removeObject(object) {\n const proxy = this._objectToProxy.get(object);\n if (proxy) {\n const index = this._proxies.indexOf(proxy);\n if (index > -1) {\n this._proxies.splice(index, 1);\n }\n this._proxyPool.return(proxy);\n }\n }\n _objectCurrentlyUnderPointer(object, pointerId) {\n return !!(this._currentFrameObjectToPointers.has(object) && this._currentFrameObjectToPointers.get(object).includes(pointerId));\n }\n _objectWasUnderPointer(object, pointerId) {\n return !!(this._lastFrameObjectToPointers.has(object) && this._lastFrameObjectToPointers.get(object).includes(pointerId));\n }\n _entered(object, pointerId) {\n return this._objectCurrentlyUnderPointer(object, pointerId) && !this._lastFrameObjectToPointers.has(object);\n }\n _left(object, pointerId) {\n return !this._currentFrameObjectToPointers.has(object) && this._objectWasUnderPointer(object, pointerId);\n }\n /**\n * Manually associate a pointer id with an object.\n *\n * This assumes you've checked that the pointer is indeed over the object.\n */\n addPointerToObject(object, pointerId) {\n const maybeProxy = this._objectToProxy.get(object);\n if (maybeProxy) {\n this._addPointerToProxy(maybeProxy, pointerId);\n }\n }\n _addPointerToProxy(object, pointerId) {\n if (!this._currentFrameObjectToPointers.has(object)) {\n this._currentFrameObjectToPointers.set(object, [pointerId]);\n return;\n }\n const pointers = this._currentFrameObjectToPointers.get(object);\n this._currentFrameObjectToPointers.set(object, pointers.concat(pointerId));\n }\n /**\n * Dispatches the appropriate pointer events in sortedObject order on tracked objects\n * @param receiver\n * @param sortedObjects\n */\n dispatchEvents(receiver, sortedObjects) {\n const lastFrameEntities = new Set(this._lastFrameObjectToPointers.keys());\n const currentFrameEntities = new Set(this._currentFrameObjectToPointers.keys());\n // Filter preserves z order\n let lastMovePerPointer;\n let lastUpPerPointer;\n let lastDownPerPointer;\n // Dispatch events in proxy z order\n for (let i = 0; i < sortedObjects.length; i++) {\n const object = sortedObjects[i];\n const proxy = this._getProxy(object);\n if (hasNestedEvents(object)) {\n object._dispatchPointerEvents(receiver);\n }\n if (lastFrameEntities.has(proxy) || currentFrameEntities.has(proxy)) {\n lastDownPerPointer = this._processDownAndEmit(receiver, proxy);\n lastUpPerPointer = this._processUpAndEmit(receiver, proxy);\n lastMovePerPointer = this._processMoveAndEmit(receiver, proxy);\n const lastUpDownMoveEvents = [...lastMovePerPointer.values(), ...lastDownPerPointer.values(), ...lastUpPerPointer.values()];\n this._processEnterLeaveAndEmit(receiver, proxy, lastUpDownMoveEvents);\n this._processCancelAndEmit(receiver, proxy);\n this._processWheelAndEmit(receiver, proxy);\n }\n }\n }\n /**\n * Given the tracked objects, update pointer containment given the provided contains()\n * @param receiver\n * @param objects\n */\n processPointerToObject(receiver, objects) {\n // Pre-process find entities under pointers\n for (let objectIndex = 0; objectIndex < objects.length; objectIndex++) {\n const object = objects[objectIndex];\n const proxy = this._getProxy(object);\n if (hasNestedEvents(object)) {\n object._processPointerToObject(receiver);\n }\n for (const [pointerId, pos] of receiver.currentFramePointerCoords.entries()) {\n if (proxy.contains(pos)) {\n this._addPointerToProxy(proxy, pointerId);\n }\n }\n }\n }\n /**\n * Clear current frames pointer-object associations and track last frame pointer-object associations\n */\n clear() {\n this._lastFrameObjectToPointers.clear();\n this._lastFrameObjectToPointers = new Map(this._currentFrameObjectToPointers);\n this._currentFrameObjectToPointers.clear();\n }\n _processDownAndEmit(receiver, object) {\n const lastDownPerPointer = new Map();\n // Loop through down and dispatch to entities\n for (const event of receiver.currentFrameDown) {\n if (event.active && this._objectCurrentlyUnderPointer(object, event.pointerId)) {\n object.events.emit('pointerdown', event);\n if (receiver.isDragStart(event.pointerId)) {\n object.events.emit('pointerdragstart', event);\n }\n }\n lastDownPerPointer.set(event.pointerId, event);\n }\n return lastDownPerPointer;\n }\n _processUpAndEmit(receiver, object) {\n const lastUpPerPointer = new Map();\n // Loop through up and dispatch to entities\n for (const event of receiver.currentFrameUp) {\n if (event.active && this._objectCurrentlyUnderPointer(object, event.pointerId)) {\n object.events.emit('pointerup', event);\n if (receiver.isDragEnd(event.pointerId)) {\n object.events.emit('pointerdragend', event);\n }\n }\n lastUpPerPointer.set(event.pointerId, event);\n }\n return lastUpPerPointer;\n }\n _processMoveAndEmit(receiver, object) {\n const lastMovePerPointer = new Map();\n // Loop through move and dispatch to entities\n for (const event of receiver.currentFrameMove) {\n if (event.active && object.active() && this._objectCurrentlyUnderPointer(object, event.pointerId)) {\n // move\n object.events.emit('pointermove', event);\n if (receiver.isDragging(event.pointerId)) {\n object.events.emit('pointerdragmove', event);\n }\n }\n lastMovePerPointer.set(event.pointerId, event);\n }\n return lastMovePerPointer;\n }\n _processEnterLeaveAndEmit(receiver, object, lastUpDownMoveEvents) {\n // up, down, and move are considered for enter and leave\n for (const event of lastUpDownMoveEvents) {\n // enter\n if (event.active && object.active() && this._entered(object, event.pointerId)) {\n object.events.emit('pointerenter', event);\n if (receiver.isDragging(event.pointerId)) {\n object.events.emit('pointerdragenter', event);\n }\n break;\n }\n if (event.active &&\n object.active() &&\n // leave can happen on move\n (this._left(object, event.pointerId) ||\n // or leave can happen on pointer up\n (this._objectCurrentlyUnderPointer(object, event.pointerId) && event.type === 'up'))) {\n object.events.emit('pointerleave', event);\n if (receiver.isDragging(event.pointerId)) {\n object.events.emit('pointerdragleave', event);\n }\n break;\n }\n }\n }\n _processCancelAndEmit(receiver, object) {\n // cancel\n for (const event of receiver.currentFrameCancel) {\n if (event.active && object.active() && this._objectCurrentlyUnderPointer(object, event.pointerId)) {\n object.events.emit('pointercancel', event);\n }\n }\n }\n _processWheelAndEmit(receiver, object) {\n // wheel\n for (const event of receiver.currentFrameWheel) {\n // Currently the wheel only fires under the primary pointer '0'\n if (event.active && object.active() && this._objectCurrentlyUnderPointer(object, 0)) {\n object.events.emit('pointerwheel', event);\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Input/PointerScope.ts\":\n/*!*******************************!*\\\n !*** ./Input/PointerScope.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerScope: () => (/* binding */ PointerScope)\n/* harmony export */ });\n/**\n * Determines the scope of handling mouse/touch events.\n */\nvar PointerScope;\n(function (PointerScope) {\n /**\n * Handle events on the `canvas` element only. Events originating outside the\n * `canvas` will not be handled.\n */\n PointerScope[\"Canvas\"] = \"Canvas\";\n /**\n * Handles events on the entire document. All events will be handled by Excalibur.\n */\n PointerScope[\"Document\"] = \"Document\";\n})(PointerScope || (PointerScope = {}));\n\n\n/***/ }),\n\n/***/ \"./Input/PointerSystem.ts\":\n/*!********************************!*\\\n !*** ./Input/PointerSystem.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerSystem: () => (/* binding */ PointerSystem)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Priority.ts\");\n/* harmony import */ var _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Graphics/GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _PointerComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./PointerComponent */ \"./Input/PointerComponent.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Math/coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _Collision_Detection_SparseHashGrid__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Collision/Detection/SparseHashGrid */ \"./Collision/Detection/SparseHashGrid.ts\");\n/* harmony import */ var _PointerEventsToObjectDispatcher__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./PointerEventsToObjectDispatcher */ \"./Input/PointerEventsToObjectDispatcher.ts\");\n\n\n\n\n\n\n/**\n * The PointerSystem is responsible for dispatching pointer events to entities\n * that need them.\n *\n * The PointerSystem can be optionally configured by the {@apilink PointerComponent}, by default Entities use\n * the {@apilink Collider}'s shape for pointer events.\n */\nclass PointerSystem extends _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_0__.System {\n constructor(world) {\n super();\n this.world = world;\n this.systemType = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_0__.SystemType.Update;\n this._graphicsHashGrid = new _Collision_Detection_SparseHashGrid__WEBPACK_IMPORTED_MODULE_1__.SparseHashGrid({ size: 100 });\n this._graphics = [];\n this._entityToPointer = new Map();\n this._pointerEventDispatcher = new _PointerEventsToObjectDispatcher__WEBPACK_IMPORTED_MODULE_2__.PointerEventsToObjectDispatcher();\n /**\n * Optionally override component configuration for all entities\n */\n this.overrideUseColliderShape = false;\n /**\n * Optionally override component configuration for all entities\n */\n this.overrideUseGraphicsBounds = false;\n this._sortedTransforms = [];\n this._sortedEntities = [];\n this._zHasChanged = false;\n this._zIndexUpdate = () => {\n this._zHasChanged = true;\n };\n this.query = this.world.query([_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_3__.TransformComponent, _PointerComponent__WEBPACK_IMPORTED_MODULE_4__.PointerComponent]);\n this.query.entityAdded$.subscribe((e) => {\n const tx = e.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_3__.TransformComponent);\n const pointer = e.get(_PointerComponent__WEBPACK_IMPORTED_MODULE_4__.PointerComponent);\n this._pointerEventDispatcher.addObject(e, (pos) => {\n // If pointer bounds defined\n if (pointer && pointer.localBounds) {\n const pointerBounds = pointer.localBounds.transform(tx.get().matrix);\n return pointerBounds.contains(tx.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_5__.CoordPlane.World ? pos.worldPos : pos.screenPos);\n }\n return false;\n }, () => e.isActive);\n this._entityToPointer.set(e, pointer);\n const maybeGfx = e.get(_Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_6__.GraphicsComponent);\n if (maybeGfx) {\n this._graphics.push(maybeGfx);\n this._graphicsHashGrid.track(maybeGfx);\n }\n this._sortedTransforms.push(tx);\n this._sortedEntities.push(tx.owner);\n tx.zIndexChanged$.subscribe(this._zIndexUpdate);\n this._zHasChanged = true;\n });\n this.query.entityRemoved$.subscribe((e) => {\n this._pointerEventDispatcher.removeObject(e);\n const tx = e.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_3__.TransformComponent);\n this._entityToPointer.delete(e);\n const maybeGfx = e.get(_Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_6__.GraphicsComponent);\n if (maybeGfx) {\n const index = this._graphics.indexOf(maybeGfx);\n if (index > -1) {\n this._graphics.splice(index, 1);\n }\n this._graphicsHashGrid.untrack(maybeGfx);\n }\n tx.zIndexChanged$.unsubscribe(this._zIndexUpdate);\n const index = this._sortedTransforms.indexOf(tx);\n if (index > -1) {\n this._sortedTransforms.splice(index, 1);\n this._sortedEntities.splice(index, 1);\n }\n });\n }\n initialize(world, scene) {\n this._engine = scene.engine;\n this._scene = scene;\n }\n preupdate() {\n if (this._scene.camera.hasChanged()) {\n // if the camera has changed we want to force a transform update so pointers can be correctly calc'd\n this._scene.camera.updateTransform(this._scene.camera.pos);\n }\n // event receiver might change per frame\n this._receivers = [this._engine.input.pointers, this._scene.input.pointers];\n this._engineReceiver = this._engine.input.pointers;\n if (this._zHasChanged) {\n this._sortedTransforms.sort((a, b) => {\n return b.z - a.z;\n });\n this._sortedEntities = this._sortedTransforms.map((t) => t.owner);\n this._zHasChanged = false;\n }\n }\n update() {\n // Update graphics\n this._graphicsHashGrid.update(this._graphics);\n // Locate all the pointer/entity mappings\n for (const [pointerId, pos] of this._engineReceiver.currentFramePointerCoords.entries()) {\n const colliders = this._scene.physics.query(pos.worldPos);\n for (let i = 0; i < colliders.length; i++) {\n const collider = colliders[i];\n const maybePointer = this._entityToPointer.get(collider.owner);\n if (maybePointer && (maybePointer.useColliderShape || this.overrideUseColliderShape)) {\n this._pointerEventDispatcher.addPointerToObject(collider.owner, pointerId);\n }\n }\n const graphics = this._graphicsHashGrid.query(pos.worldPos);\n for (let i = 0; i < graphics.length; i++) {\n const graphic = graphics[i];\n const maybePointer = this._entityToPointer.get(graphic.owner);\n if (maybePointer && (maybePointer.useGraphicsBounds || this.overrideUseGraphicsBounds)) {\n this._pointerEventDispatcher.addPointerToObject(graphic.owner, pointerId);\n }\n }\n }\n this._pointerEventDispatcher.processPointerToObject(this._engineReceiver, this._sortedEntities);\n // Dispatch pointer events on entities\n this._pointerEventDispatcher.dispatchEvents(this._engineReceiver, this._sortedEntities);\n // Dispatch pointer events on top level pointers\n this._receivers.forEach((r) => r.update());\n // Clear last frame's events\n this._pointerEventDispatcher.clear();\n this._receivers.forEach((r) => r.clear());\n }\n}\nPointerSystem.priority = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_7__.SystemPriority.Higher;\n\n\n/***/ }),\n\n/***/ \"./Input/PointerType.ts\":\n/*!******************************!*\\\n !*** ./Input/PointerType.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerType: () => (/* binding */ PointerType)\n/* harmony export */ });\n/**\n * The type of pointer for a {@apilink PointerEvent}.\n */\nvar PointerType;\n(function (PointerType) {\n PointerType[\"Touch\"] = \"Touch\";\n PointerType[\"Mouse\"] = \"Mouse\";\n PointerType[\"Pen\"] = \"Pen\";\n PointerType[\"Unknown\"] = \"Unknown\";\n})(PointerType || (PointerType = {}));\n\n\n/***/ }),\n\n/***/ \"./Input/WheelDeltaMode.ts\":\n/*!*********************************!*\\\n !*** ./Input/WheelDeltaMode.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ WheelDeltaMode: () => (/* binding */ WheelDeltaMode)\n/* harmony export */ });\nvar WheelDeltaMode;\n(function (WheelDeltaMode) {\n WheelDeltaMode[\"Pixel\"] = \"Pixel\";\n WheelDeltaMode[\"Line\"] = \"Line\";\n WheelDeltaMode[\"Page\"] = \"Page\";\n})(WheelDeltaMode || (WheelDeltaMode = {}));\n\n\n/***/ }),\n\n/***/ \"./Input/WheelEvent.ts\":\n/*!*****************************!*\\\n !*** ./Input/WheelEvent.ts ***!\n \\*****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ WheelEvent: () => (/* binding */ WheelEvent)\n/* harmony export */ });\nclass WheelEvent {\n cancel() {\n this.active = false;\n }\n constructor(x, y, pageX, pageY, screenX, screenY, index, deltaX, deltaY, deltaZ, deltaMode, ev) {\n this.x = x;\n this.y = y;\n this.pageX = pageX;\n this.pageY = pageY;\n this.screenX = screenX;\n this.screenY = screenY;\n this.index = index;\n this.deltaX = deltaX;\n this.deltaY = deltaY;\n this.deltaZ = deltaZ;\n this.deltaMode = deltaMode;\n this.ev = ev;\n this.active = true;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Interfaces/AudioImplementation.ts\":\n/*!*******************************************!*\\\n !*** ./Interfaces/AudioImplementation.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ExResponse: () => (/* binding */ ExResponse)\n/* harmony export */ });\nclass ExResponse {\n}\nExResponse.type = {\n any: '',\n blob: 'blob',\n json: 'json',\n text: 'text',\n document: 'document',\n arraybuffer: 'arraybuffer'\n};\n\n\n/***/ }),\n\n/***/ \"./Interfaces/Index.ts\":\n/*!*****************************!*\\\n !*** ./Interfaces/Index.ts ***!\n \\*****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ExResponse: () => (/* reexport safe */ _AudioImplementation__WEBPACK_IMPORTED_MODULE_0__.ExResponse),\n/* harmony export */ hasOnAdd: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.hasOnAdd),\n/* harmony export */ hasOnInitialize: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.hasOnInitialize),\n/* harmony export */ hasOnPostUpdate: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.hasOnPostUpdate),\n/* harmony export */ hasOnPreUpdate: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.hasOnPreUpdate),\n/* harmony export */ hasOnRemove: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.hasOnRemove),\n/* harmony export */ hasPostDraw: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.hasPostDraw),\n/* harmony export */ hasPreDraw: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.hasPreDraw),\n/* harmony export */ has_add: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.has_add),\n/* harmony export */ has_initialize: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.has_initialize),\n/* harmony export */ has_postupdate: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.has_postupdate),\n/* harmony export */ has_preupdate: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.has_preupdate),\n/* harmony export */ has_remove: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.has_remove)\n/* harmony export */ });\n/* harmony import */ var _AudioImplementation__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AudioImplementation */ \"./Interfaces/AudioImplementation.ts\");\n/* harmony import */ var _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./LifecycleEvents */ \"./Interfaces/LifecycleEvents.ts\");\n\n\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Interfaces/LifecycleEvents.ts\":\n/*!***************************************!*\\\n !*** ./Interfaces/LifecycleEvents.ts ***!\n \\***************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ hasOnAdd: () => (/* binding */ hasOnAdd),\n/* harmony export */ hasOnInitialize: () => (/* binding */ hasOnInitialize),\n/* harmony export */ hasOnPostUpdate: () => (/* binding */ hasOnPostUpdate),\n/* harmony export */ hasOnPreUpdate: () => (/* binding */ hasOnPreUpdate),\n/* harmony export */ hasOnRemove: () => (/* binding */ hasOnRemove),\n/* harmony export */ hasPostDraw: () => (/* binding */ hasPostDraw),\n/* harmony export */ hasPreDraw: () => (/* binding */ hasPreDraw),\n/* harmony export */ has_add: () => (/* binding */ has_add),\n/* harmony export */ has_initialize: () => (/* binding */ has_initialize),\n/* harmony export */ has_postupdate: () => (/* binding */ has_postupdate),\n/* harmony export */ has_preupdate: () => (/* binding */ has_preupdate),\n/* harmony export */ has_remove: () => (/* binding */ has_remove)\n/* harmony export */ });\n/**\n * Type guard checking for internal initialize method\n * @internal\n * @param a\n */\nfunction has_initialize(a) {\n return !!a._initialize;\n}\n/**\n *\n */\nfunction has_add(a) {\n return !!a.onAdd;\n}\n/**\n *\n */\nfunction has_remove(a) {\n return !!a.onRemove;\n}\n/**\n *\n */\nfunction hasOnInitialize(a) {\n return !!a.onInitialize;\n}\n/**\n *\n */\nfunction has_preupdate(a) {\n return !!a._preupdate;\n}\n/**\n *\n */\nfunction hasOnPreUpdate(a) {\n return !!a.onPreUpdate;\n}\n/**\n *\n */\nfunction has_postupdate(a) {\n return !!a.onPostUpdate;\n}\n/**\n *\n */\nfunction hasOnPostUpdate(a) {\n return !!a.onPostUpdate;\n}\n/**\n *\n */\nfunction hasOnAdd(a) {\n return !!a.onAdd;\n}\n/**\n *\n */\nfunction hasOnRemove(a) {\n return !!a.onRemove;\n}\n/**\n *\n */\nfunction hasPreDraw(a) {\n return !!a.onPreDraw;\n}\n/**\n *\n */\nfunction hasPostDraw(a) {\n return !!a.onPostDraw;\n}\n\n\n/***/ }),\n\n/***/ \"./Label.ts\":\n/*!******************!*\\\n !*** ./Label.ts ***!\n \\******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Label: () => (/* binding */ Label)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Graphics_Text__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Graphics/Text */ \"./Graphics/Text.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Graphics */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Graphics_Font__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Graphics/Font */ \"./Graphics/Font.ts\");\n/* harmony import */ var _Actor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Actor */ \"./Actor.ts\");\n\n\n\n\n\n/**\n * Labels are the way to draw small amounts of text to the screen. They are\n * actors and inherit all of the benefits and capabilities.\n */\nclass Label extends _Actor__WEBPACK_IMPORTED_MODULE_0__.Actor {\n set maxWidth(width) {\n this._text.maxWidth = width;\n }\n get maxWidth() {\n return this._text.maxWidth;\n }\n get font() {\n return this._font;\n }\n set font(newFont) {\n this._font = newFont;\n this._text.font = newFont;\n }\n /**\n * The text to draw.\n */\n get text() {\n return this._text.text;\n }\n set text(text) {\n this._text.text = text;\n }\n get color() {\n return this._text.color;\n }\n set color(color) {\n if (this._text) {\n this._text.color = color;\n }\n }\n get opacity() {\n return this.graphics.opacity;\n }\n set opacity(opacity) {\n this.graphics.opacity = opacity;\n }\n /**\n * The {@apilink SpriteFont} to use, if any. Overrides {@apilink Font | `font`} if present.\n */\n get spriteFont() {\n return this._spriteFont;\n }\n set spriteFont(sf) {\n if (sf) {\n this._spriteFont = sf;\n this._text.font = this._spriteFont;\n }\n }\n /**\n * Build a new label\n * @param options\n */\n constructor(options) {\n super(options);\n this._font = new _Graphics_Font__WEBPACK_IMPORTED_MODULE_1__.Font();\n this._text = new _Graphics_Text__WEBPACK_IMPORTED_MODULE_2__.Text({ text: '', font: this._font });\n const { text, pos, x, y, spriteFont, font, color, maxWidth } = { text: '', ...options };\n this.pos = pos !== null && pos !== void 0 ? pos : (x && y ? (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(x, y) : this.pos);\n this.text = text !== null && text !== void 0 ? text : this.text;\n this.font = font !== null && font !== void 0 ? font : this.font;\n this.maxWidth = maxWidth !== null && maxWidth !== void 0 ? maxWidth : this.maxWidth;\n this.spriteFont = spriteFont !== null && spriteFont !== void 0 ? spriteFont : this.spriteFont;\n this._text.color = color !== null && color !== void 0 ? color : this.color;\n const gfx = this.get(_Graphics__WEBPACK_IMPORTED_MODULE_4__.GraphicsComponent);\n gfx.anchor = _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero;\n gfx.use(this._text);\n }\n _initialize(engine) {\n super._initialize(engine);\n }\n /**\n * Returns the width of the text in the label (in pixels);\n */\n getTextWidth() {\n return this._text.width;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/Random.ts\":\n/*!************************!*\\\n !*** ./Math/Random.ts ***!\n \\************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Random: () => (/* binding */ Random)\n/* harmony export */ });\n/**\n * @module\n * Pseudo-Random Utility\n *\n * A pseudo-random utility to add seeded random support for help in\n * generating things like terrain or reproducible randomness. Uses the\n * [Mersenne Twister](https://en.wikipedia.org/wiki/Mersenne_Twister) algorithm.\n */\n/**\n * 32-bit mask\n */\nconst BITMASK32 = 0xffffffff;\n/**\n * Pseudo-random number generator following the Mersenne_Twister algorithm. Given a seed this generator will produce the same sequence\n * of numbers each time it is called.\n * See https://en.wikipedia.org/wiki/Mersenne_Twister for more details.\n * Uses the MT19937-32 (2002) implementation documented here http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/emt19937ar.html\n *\n * Api inspired by http://chancejs.com/# https://github.com/chancejs/chancejs\n */\nclass Random {\n /**\n * If no seed is specified, the Date.now() is used\n */\n constructor(seed) {\n this.seed = seed;\n // Separation point of one one word, the number of bits in the lower bitmask 0 <= r <= w-1\n this._lowerMask = 0x7fffffff; // 31 bits same as _r\n this._upperMask = 0x80000000; // 34 high bits\n // Word size, 64 bits\n this._w = 32;\n // Degree of recurrence\n this._n = 624;\n // Middle word, an offset used in the recurrence defining the series x, 1<=m>> 0;\n for (let i = 1; i < this._n; i++) {\n const s = this._mt[i - 1] ^ (this._mt[i - 1] >>> (this._w - 2));\n // numbers are bigger than the JS max safe int, add in 16-bit chunks to prevent IEEE rounding errors on high bits\n this._mt[i] = (((this._f * ((s & 0xffff0000) >>> 16)) << 16) + this._f * (s & 0xffff) + i) >>> 0;\n }\n this._index = this._n;\n }\n /**\n * Apply the twist\n */\n _twist() {\n const mag01 = [0x0, this._a];\n let y = 0, i = 0;\n for (; i < this._n - this._m; i++) {\n y = (this._mt[i] & this._upperMask) | (this._mt[i + 1] & this._lowerMask);\n this._mt[i] = this._mt[i + this._m] ^ (y >>> 1) ^ (mag01[y & 0x1] & BITMASK32);\n }\n for (; i < this._n - 1; i++) {\n y = (this._mt[i] & this._upperMask) | (this._mt[i + 1] & this._lowerMask);\n this._mt[i] = this._mt[i + (this._m - this._n)] ^ (y >>> 1) ^ (mag01[y & 0x1] & BITMASK32);\n }\n y = (this._mt[this._n - 1] & this._upperMask) | (this._mt[0] & this._lowerMask);\n this._mt[this._n - 1] = this._mt[this._m - 1] ^ (y >>> 1) ^ (mag01[y & 0x1] & BITMASK32);\n this._index = 0;\n }\n /**\n * Return next 32 bit integer number in sequence\n */\n nextInt() {\n if (this._index >= this._n) {\n this._twist();\n }\n let y = this._mt[this._index++];\n y ^= y >>> this._u;\n y ^= (y << this._s) & this._b;\n y ^= (y << this._t) & this._c;\n y ^= y >>> this._l;\n return y >>> 0;\n }\n /**\n * Return a random floating point number between [0, 1)\n */\n next() {\n return this.nextInt() * (1.0 / 4294967296.0); // divided by 2^32\n }\n /**\n * Return a random floating point in range [min, max) min is included, max is not included\n */\n floating(min, max) {\n return (max - min) * this.next() + min;\n }\n /**\n * Return a random integer in range [min, max] min is included, max is included.\n * Implemented with rejection sampling, see https://medium.com/@betable/tifu-by-using-math-random-f1c308c4fd9d#.i13tdiu5a\n */\n integer(min, max) {\n return Math.floor((max - min + 1) * this.next() + min);\n }\n /**\n * Returns true or false randomly with 50/50 odds by default.\n * By default the likelihood of returning a true is .5 (50%).\n * @param likelihood takes values between [0, 1]\n */\n bool(likelihood = 0.5) {\n return this.next() <= likelihood;\n }\n /**\n * Returns one element from an array at random\n */\n pickOne(array) {\n return array[this.integer(0, array.length - 1)];\n }\n /**\n * Returns a new array random picking elements from the original\n * @param array Original array to pick from\n * @param numPicks can be any positive number\n * @param allowDuplicates indicates whether the returned set is allowed duplicates (it does not mean there will always be duplicates\n * just that it is possible)\n */\n pickSet(array, numPicks, allowDuplicates = false) {\n if (allowDuplicates) {\n return this._pickSetWithDuplicates(array, numPicks);\n }\n else {\n return this._pickSetWithoutDuplicates(array, numPicks);\n }\n }\n /**\n * Returns a new array randomly picking elements in the original (not reused)\n * @param array Array to pick elements out of\n * @param numPicks must be less than or equal to the number of elements in the array.\n */\n _pickSetWithoutDuplicates(array, numPicks) {\n if (numPicks > array.length || numPicks < 0) {\n throw new Error('Invalid number of elements to pick, must pick a value 0 < n <= length');\n }\n if (numPicks === array.length) {\n return array;\n }\n const result = new Array(numPicks);\n let currentPick = 0;\n const tempArray = array.slice(0);\n while (currentPick < numPicks) {\n const index = this.integer(0, tempArray.length - 1);\n result[currentPick++] = tempArray[index];\n tempArray.splice(index, 1);\n }\n return result;\n }\n /**\n * Returns a new array random picking elements from the original allowing duplicates\n * @param array Array to pick elements out of\n * @param numPicks can be any positive number\n */\n _pickSetWithDuplicates(array, numPicks) {\n // Typescript numbers are all floating point, so do we add check for int? (or floor the input?)\n if (numPicks < 0) {\n throw new Error('Invalid number of elements to pick, must pick a value 0 <= n < MAX_INT');\n }\n const result = new Array(numPicks);\n for (let i = 0; i < numPicks; i++) {\n result[i] = this.pickOne(array);\n }\n return result;\n }\n /**\n * Returns a new array that has its elements shuffled. Using the Fisher/Yates method\n * https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle\n */\n shuffle(array) {\n const tempArray = array.slice(0);\n let swap;\n for (let i = 0; i < tempArray.length - 2; i++) {\n const randomIndex = this.integer(i, tempArray.length - 1);\n swap = tempArray[i];\n tempArray[i] = tempArray[randomIndex];\n tempArray[randomIndex] = swap;\n }\n return tempArray;\n }\n /**\n * Generate a list of random integer numbers\n * @param length the length of the final array\n * @param min the minimum integer number to generate inclusive\n * @param max the maximum integer number to generate inclusive\n */\n range(length, min, max) {\n const result = new Array(length);\n for (let i = 0; i < length; i++) {\n result[i] = this.integer(min, max);\n }\n return result;\n }\n /**\n * Returns the result of a d4 dice roll\n */\n d4() {\n return this.integer(1, 4);\n }\n /**\n * Returns the result of a d6 dice roll\n */\n d6() {\n return this.integer(1, 6);\n }\n /**\n * Returns the result of a d8 dice roll\n */\n d8() {\n return this.integer(1, 8);\n }\n /**\n * Returns the result of a d10 dice roll\n */\n d10() {\n return this.integer(1, 10);\n }\n /**\n * Returns the result of a d12 dice roll\n */\n d12() {\n return this.integer(1, 12);\n }\n /**\n * Returns the result of a d20 dice roll\n */\n d20() {\n return this.integer(1, 20);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/affine-matrix.ts\":\n/*!*******************************!*\\\n !*** ./Math/affine-matrix.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AffineMatrix: () => (/* binding */ AffineMatrix)\n/* harmony export */ });\n/* harmony import */ var _matrix__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./matrix */ \"./Math/matrix.ts\");\n/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./util */ \"./Math/util.ts\");\n/* harmony import */ var _vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vector */ \"./Math/vector.ts\");\n\n\n\nclass AffineMatrix {\n constructor() {\n /**\n * | | | |\n * | ------- | ------- | -------- |\n * | data[0] | data[2] | data[4] |\n * | data[1] | data[3] | data[5] |\n * | 0 | 0 | 1 |\n */\n this.data = new Float64Array(6);\n this._scale = new Float64Array([1, 1]);\n this._scaleSignX = 1;\n this._scaleSignY = 1;\n }\n /**\n * Converts the current matrix into a DOMMatrix\n *\n * This is useful when working with the browser Canvas context\n * @returns {DOMMatrix} DOMMatrix\n */\n toDOMMatrix() {\n return new DOMMatrix([...this.data]);\n }\n static identity() {\n const mat = new AffineMatrix();\n mat.data[0] = 1;\n mat.data[1] = 0;\n mat.data[2] = 0;\n mat.data[3] = 1;\n mat.data[4] = 0;\n mat.data[5] = 0;\n return mat;\n }\n /**\n * Creates a brand new translation matrix at the specified 3d point\n * @param x\n * @param y\n */\n static translation(x, y) {\n const mat = AffineMatrix.identity();\n mat.data[4] = x;\n mat.data[5] = y;\n return mat;\n }\n /**\n * Creates a brand new scaling matrix with the specified scaling factor\n * @param sx\n * @param sy\n */\n static scale(sx, sy) {\n const mat = AffineMatrix.identity();\n mat.data[0] = sx;\n mat.data[3] = sy;\n mat._scale[0] = sx;\n mat._scale[1] = sy;\n return mat;\n }\n /**\n * Creates a brand new rotation matrix with the specified angle in radians\n * @param angle\n */\n static rotation(angle) {\n const mat = AffineMatrix.identity();\n mat.data[0] = Math.cos(angle);\n mat.data[1] = Math.sin(angle);\n mat.data[2] = -Math.sin(angle);\n mat.data[3] = Math.cos(angle);\n return mat;\n }\n setPosition(x, y) {\n this.data[4] = x;\n this.data[5] = y;\n }\n getPosition() {\n return (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.data[4], this.data[5]);\n }\n /**\n * Applies rotation to the current matrix mutating it\n * @param angle in Radians\n */\n rotate(angle) {\n const a11 = this.data[0];\n const a21 = this.data[1];\n const a12 = this.data[2];\n const a22 = this.data[3];\n const sine = Math.sin(angle);\n const cosine = Math.cos(angle);\n this.data[0] = cosine * a11 + sine * a12;\n this.data[1] = cosine * a21 + sine * a22;\n this.data[2] = cosine * a12 - sine * a11;\n this.data[3] = cosine * a22 - sine * a21;\n return this;\n }\n /**\n * Applies translation to the current matrix mutating it\n * @param x\n * @param y\n */\n translate(x, y) {\n const a11 = this.data[0];\n const a21 = this.data[1];\n // const a31 = 0;\n const a12 = this.data[2];\n const a22 = this.data[3];\n // const a32 = 0;\n const a13 = this.data[4];\n const a23 = this.data[5];\n // const a33 = 1;\n // Doesn't change z\n this.data[4] = a11 * x + a12 * y + a13;\n this.data[5] = a21 * x + a22 * y + a23;\n return this;\n }\n /**\n * Applies scaling to the current matrix mutating it\n * @param x\n * @param y\n */\n scale(x, y) {\n const a11 = this.data[0];\n const a21 = this.data[1];\n const a12 = this.data[2];\n const a22 = this.data[3];\n this.data[0] = a11 * x;\n this.data[1] = a21 * x;\n this.data[2] = a12 * y;\n this.data[3] = a22 * y;\n this._scale[0] = x;\n this._scale[1] = y;\n this._scaleSignX = (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(x);\n this._scaleSignY = (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(y);\n return this;\n }\n determinant() {\n return this.data[0] * this.data[3] - this.data[1] * this.data[2];\n }\n /**\n * Return the affine inverse, optionally store it in a target matrix.\n *\n * It's recommended you call .reset() the target unless you know what you're doing\n * @param target\n */\n inverse(target) {\n // See http://negativeprobability.blogspot.com/2011/11/affine-transformations-and-their.html\n // See https://www.mathsisfun.com/algebra/matrix-inverse.html\n // Since we are actually only doing 2D transformations we can use this hack\n // We don't actually use the 3rd or 4th dimension\n const det = this.determinant();\n let inverseDet = det; // default to a zero matrix if we have a singular matrix\n if (det !== 0) {\n inverseDet = 1 / det;\n }\n const a = this.data[0];\n const b = this.data[2];\n const c = this.data[1];\n const d = this.data[3];\n const m = target || AffineMatrix.identity();\n // inverts rotation and scale\n m.data[0] = d * inverseDet;\n m.data[1] = -c * inverseDet;\n m.data[2] = -b * inverseDet;\n m.data[3] = a * inverseDet;\n const tx = this.data[4];\n const ty = this.data[5];\n // invert translation\n // transform translation into the matrix basis created by rot/scale\n m.data[4] = -(tx * m.data[0] + ty * m.data[2]);\n m.data[5] = -(tx * m.data[1] + ty * m.data[3]);\n return m;\n }\n multiply(vectorOrMatrix, dest) {\n if (vectorOrMatrix instanceof _vector__WEBPACK_IMPORTED_MODULE_0__.Vector) {\n const result = dest || new _vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\n const vector = vectorOrMatrix;\n // these shenanigans are to allow dest and vector to be the same instance\n const resultX = vector.x * this.data[0] + vector.y * this.data[2] + this.data[4];\n const resultY = vector.x * this.data[1] + vector.y * this.data[3] + this.data[5];\n result.x = resultX;\n result.y = resultY;\n return result;\n }\n else {\n const result = dest || new AffineMatrix();\n const other = vectorOrMatrix;\n const a11 = this.data[0];\n const a21 = this.data[1];\n // const a31 = 0;\n const a12 = this.data[2];\n const a22 = this.data[3];\n // const a32 = 0;\n const a13 = this.data[4];\n const a23 = this.data[5];\n // const a33 = 1;\n const b11 = other.data[0];\n const b21 = other.data[1];\n // const b31 = 0;\n const b12 = other.data[2];\n const b22 = other.data[3];\n // const b32 = 0;\n const b13 = other.data[4];\n const b23 = other.data[5];\n // const b33 = 1;\n result.data[0] = a11 * b11 + a12 * b21; // + a13 * b31; // zero\n result.data[1] = a21 * b11 + a22 * b21; // + a23 * b31; // zero\n result.data[2] = a11 * b12 + a12 * b22; // + a13 * b32; // zero\n result.data[3] = a21 * b12 + a22 * b22; // + a23 * b32; // zero\n result.data[4] = a11 * b13 + a12 * b23 + a13; // * b33; // one\n result.data[5] = a21 * b13 + a22 * b23 + a23; // * b33; // one\n const signX = this._scaleSignX;\n const signY = this._scaleSignY;\n result._scaleSignX = signX * (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(result._scaleSignX);\n result._scaleSignY = signY * (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(result._scaleSignY);\n return result;\n }\n }\n /**\n * Packed array of length 8, that contains 4 vertices, with 2 components each\n * So: [x0, y0, x1, y1, x2, y2, x3, y3]\n * @param quad\n */\n multiplyQuadInPlace(quad) {\n const resultTopLeftX = quad[0] * this.data[0] + quad[1] * this.data[2] + this.data[4];\n const resultTopLeftY = quad[0] * this.data[1] + quad[1] * this.data[3] + this.data[5];\n quad[0] = resultTopLeftX;\n quad[1] = resultTopLeftY;\n const resultTopRightX = quad[2] * this.data[0] + quad[3] * this.data[2] + this.data[4];\n const resultTopRightY = quad[2] * this.data[1] + quad[3] * this.data[3] + this.data[5];\n quad[2] = resultTopRightX;\n quad[3] = resultTopRightY;\n const resultBottomLeftX = quad[4] * this.data[0] + quad[5] * this.data[2] + this.data[4];\n const resultBottomLeftY = quad[4] * this.data[1] + quad[5] * this.data[3] + this.data[5];\n quad[4] = resultBottomLeftX;\n quad[5] = resultBottomLeftY;\n const resultBottomRightX = quad[6] * this.data[0] + quad[7] * this.data[2] + this.data[4];\n const resultBottomRightY = quad[6] * this.data[1] + quad[7] * this.data[3] + this.data[5];\n quad[6] = resultBottomRightX;\n quad[7] = resultBottomRightY;\n }\n to4x4() {\n const mat = new _matrix__WEBPACK_IMPORTED_MODULE_2__.Matrix();\n mat.data[0] = this.data[0];\n mat.data[1] = this.data[1];\n mat.data[2] = 0;\n mat.data[3] = 0;\n mat.data[4] = this.data[2];\n mat.data[5] = this.data[3];\n mat.data[6] = 0;\n mat.data[7] = 0;\n mat.data[8] = 0;\n mat.data[9] = 0;\n mat.data[10] = 1;\n mat.data[11] = 0;\n mat.data[12] = this.data[4];\n mat.data[13] = this.data[5];\n mat.data[14] = 0;\n mat.data[15] = 1;\n return mat;\n }\n setRotation(angle) {\n const currentScale = this.getScale();\n const sine = Math.sin(angle);\n const cosine = Math.cos(angle);\n this.data[0] = cosine * currentScale.x;\n this.data[1] = sine * currentScale.y;\n this.data[2] = -sine * currentScale.x;\n this.data[3] = cosine * currentScale.y;\n }\n getRotation() {\n const angle = Math.atan2(this.data[1] / this.getScaleY(), this.data[0] / this.getScaleX());\n return (0,_util__WEBPACK_IMPORTED_MODULE_1__.canonicalizeAngle)(angle);\n }\n getScaleX() {\n // absolute scale of the matrix (we lose sign so need to add it back)\n const xScaleSq = this.data[0] * this.data[0] + this.data[2] * this.data[2];\n if (xScaleSq === 1.0) {\n // usually there isn't scale so we can avoid a sqrt\n return this._scaleSignX;\n }\n return this._scaleSignX * Math.sqrt(xScaleSq);\n }\n getScaleY() {\n // absolute scale of the matrix (we lose sign so need to add it back)\n const yScaleSq = this.data[1] * this.data[1] + this.data[3] * this.data[3];\n if (yScaleSq === 1.0) {\n // usually there isn't scale so we can avoid a sqrt\n return this._scaleSignY;\n }\n return this._scaleSignY * Math.sqrt(yScaleSq);\n }\n /**\n * Get the scale of the matrix\n */\n getScale() {\n return (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.getScaleX(), this.getScaleY());\n }\n setScaleX(val) {\n if (val === this._scale[0]) {\n return;\n }\n this._scaleSignX = (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(val);\n // negative scale acts like a 180 rotation, so flip\n const xscale = (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.data[0] * this._scaleSignX, this.data[2] * this._scaleSignX).normalize();\n this.data[0] = xscale.x * val;\n this.data[2] = xscale.y * val;\n this._scale[0] = val;\n }\n setScaleY(val) {\n if (val === this._scale[1]) {\n return;\n }\n this._scaleSignY = (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(val);\n // negative scale acts like a 180 rotation, so flip\n const yscale = (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.data[1] * this._scaleSignY, this.data[3] * this._scaleSignY).normalize();\n this.data[1] = yscale.x * val;\n this.data[3] = yscale.y * val;\n this._scale[1] = val;\n }\n setScale(scale) {\n this.setScaleX(scale.x);\n this.setScaleY(scale.y);\n }\n isIdentity() {\n return this.data[0] === 1 && this.data[1] === 0 && this.data[2] === 0 && this.data[3] === 1 && this.data[4] === 0 && this.data[5] === 0;\n }\n /**\n * Resets the current matrix to the identity matrix, mutating it\n * @returns {AffineMatrix} Current matrix as identity\n */\n reset() {\n const mat = this;\n mat.data[0] = 1;\n mat.data[1] = 0;\n mat.data[2] = 0;\n mat.data[3] = 1;\n mat.data[4] = 0;\n mat.data[5] = 0;\n return mat;\n }\n /**\n * Creates a new Matrix with the same data as the current {@apilink AffineMatrix}\n */\n clone(dest) {\n const mat = dest || new AffineMatrix();\n mat.data[0] = this.data[0];\n mat.data[1] = this.data[1];\n mat.data[2] = this.data[2];\n mat.data[3] = this.data[3];\n mat.data[4] = this.data[4];\n mat.data[5] = this.data[5];\n mat._scaleSignX = this._scaleSignX;\n mat._scaleSignY = this._scaleSignY;\n return mat;\n }\n toString() {\n return `\r\n[${this.data[0]} ${this.data[2]} ${this.data[4]}]\r\n[${this.data[1]} ${this.data[3]} ${this.data[5]}]\r\n[0 0 1]\r\n`;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/bezier-curve.ts\":\n/*!******************************!*\\\n !*** ./Math/bezier-curve.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BezierCurve: () => (/* binding */ BezierCurve)\n/* harmony export */ });\n/* harmony import */ var _lerp__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./lerp */ \"./Math/lerp.ts\");\n\n/**\n * BezierCurve that supports cubic Bezier curves.\n */\nclass BezierCurve {\n constructor(options) {\n var _a;\n // Thanks Freya! https://www.youtube.com/watch?v=aVwxzDHniEw\n this._distLookup = [];\n this.quality = 4;\n if (options.controlPoints.length !== 4) {\n throw new Error('Only cubic bezier curves are supported');\n }\n this._controlPoints = [...options.controlPoints];\n this.quality = (_a = options.quality) !== null && _a !== void 0 ? _a : this.quality;\n this._calculateLookup();\n }\n get arcLength() {\n return this._arcLength;\n }\n get controlPoints() {\n return this._controlPoints;\n }\n set controlPoints(points) {\n this._controlPoints = [...points];\n this._calculateLookup();\n }\n setControlPoint(index, point) {\n this._controlPoints[index] = point;\n this._calculateLookup();\n }\n _calculateLookup() {\n let totalLength = 0;\n this._distLookup.length = 0;\n let prev = this.controlPoints[0];\n const n = this.controlPoints.length * this.quality;\n for (let i = 0; i < n; i++) {\n const t = i / (n - 1);\n const pt = this.getPoint(t);\n const diff = prev.distance(pt);\n totalLength += diff;\n this._distLookup.push(totalLength);\n prev = pt;\n }\n this._arcLength = totalLength;\n }\n _getTimeGivenDistance(distance) {\n const n = this._distLookup.length;\n const arcLength = this.arcLength;\n if (distance >= 0 && distance < arcLength) {\n for (let i = 0; i < n - 1; i++) {\n if (this._distLookup[i] <= distance && distance < this._distLookup[i + 1]) {\n return (0,_lerp__WEBPACK_IMPORTED_MODULE_0__.remap)(this._distLookup[i], this._distLookup[i + 1], i / (n - 1), (i + 1) / (n - 1), distance);\n }\n }\n }\n return distance / arcLength;\n }\n /**\n * Get the point on the Bezier curve at a certain time\n * @param time Between 0-1\n */\n getPoint(time) {\n const points = [...this.controlPoints];\n for (let r = 1; r < points.length; r++) {\n for (let i = 0; i < points.length - r; i++) {\n points[i] = (0,_lerp__WEBPACK_IMPORTED_MODULE_0__.lerpVector)(points[i], points[i + 1], time);\n }\n }\n return points[0];\n }\n /**\n * Get the tangent of the Bezier curve at a certain time\n * @param time Between 0-1\n */\n getTangent(time) {\n const timeSquared = time * time;\n const p0 = this.controlPoints[0];\n const p1 = this.controlPoints[1];\n const p2 = this.controlPoints[2];\n const p3 = this.controlPoints[3];\n // Derivative of Bernstein polynomial\n const pPrime = p0\n .scale(-3 * timeSquared + 6 * time - 3)\n .add(p1.scale(9 * timeSquared - 12 * time + 3).add(p2.scale(-9 * timeSquared + 6 * time).add(p3.scale(3 * timeSquared))));\n return pPrime.normalize();\n }\n /**\n * Get the tangent of the Bezier curve where the distance is uniformly distributed over time\n * @param time\n */\n getUniformTangent(time) {\n const desiredDistance = time * this.arcLength;\n const uniformTime = this._getTimeGivenDistance(desiredDistance);\n return this.getTangent(uniformTime);\n }\n /**\n * Get the normal of the Bezier curve at a certain time\n * @param time Between 0-1\n */\n getNormal(time) {\n return this.getTangent(time).normal();\n }\n /**\n * Get the normal of the Bezier curve where the distance is uniformly distributed over time\n * @param time\n */\n getUniformNormal(time) {\n return this.getUniformTangent(time).normal();\n }\n /**\n * Points are spaced uniformly across the length of the curve over time\n * @param time\n */\n getUniformPoint(time) {\n const desiredDistance = time * this.arcLength;\n const uniformTime = this._getTimeGivenDistance(desiredDistance);\n return this.getPoint(uniformTime);\n }\n clone() {\n return new BezierCurve({\n controlPoints: [...this.controlPoints],\n quality: this.quality\n });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/coord-plane.ts\":\n/*!*****************************!*\\\n !*** ./Math/coord-plane.ts ***!\n \\*****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CoordPlane: () => (/* binding */ CoordPlane)\n/* harmony export */ });\n/**\n * Enum representing the coordinate plane for the position 2D vector in the {@apilink TransformComponent}\n */\nvar CoordPlane;\n(function (CoordPlane) {\n /**\n * The world coordinate plane (default) represents world space, any entities drawn with world\n * space move when the camera moves.\n */\n CoordPlane[\"World\"] = \"world\";\n /**\n * The screen coordinate plane represents screen space, entities drawn in screen space are pinned\n * to screen coordinates ignoring the camera.\n */\n CoordPlane[\"Screen\"] = \"screen\";\n})(CoordPlane || (CoordPlane = {}));\n\n\n/***/ }),\n\n/***/ \"./Math/global-coordinates.ts\":\n/*!************************************!*\\\n !*** ./Math/global-coordinates.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ GlobalCoordinates: () => (/* binding */ GlobalCoordinates)\n/* harmony export */ });\n/* harmony import */ var _vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vector */ \"./Math/vector.ts\");\n\nclass GlobalCoordinates {\n static fromPagePosition(xOrPos, yOrEngine, engineOrUndefined) {\n let pageX;\n let pageY;\n let pagePos;\n let engine;\n if (arguments.length === 3) {\n pageX = xOrPos;\n pageY = yOrEngine;\n pagePos = new _vector__WEBPACK_IMPORTED_MODULE_0__.Vector(pageX, pageY);\n engine = engineOrUndefined;\n }\n else {\n pagePos = xOrPos;\n pageX = pagePos.x;\n pageY = pagePos.y;\n engine = yOrEngine;\n }\n const screenPos = engine.screen.pageToScreenCoordinates(pagePos);\n const worldPos = engine.screen.screenToWorldCoordinates(screenPos);\n return new GlobalCoordinates(worldPos, pagePos, screenPos);\n }\n constructor(worldPos, pagePos, screenPos) {\n this.worldPos = worldPos;\n this.pagePos = pagePos;\n this.screenPos = screenPos;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/index.ts\":\n/*!***********************!*\\\n !*** ./Math/index.ts ***!\n \\***********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AffineMatrix: () => (/* reexport safe */ _affine_matrix__WEBPACK_IMPORTED_MODULE_3__.AffineMatrix),\n/* harmony export */ BezierCurve: () => (/* reexport safe */ _bezier_curve__WEBPACK_IMPORTED_MODULE_12__.BezierCurve),\n/* harmony export */ CoordPlane: () => (/* reexport safe */ _coord_plane__WEBPACK_IMPORTED_MODULE_5__.CoordPlane),\n/* harmony export */ GlobalCoordinates: () => (/* reexport safe */ _global_coordinates__WEBPACK_IMPORTED_MODULE_7__.GlobalCoordinates),\n/* harmony export */ LineSegment: () => (/* reexport safe */ _line_segment__WEBPACK_IMPORTED_MODULE_8__.LineSegment),\n/* harmony export */ Matrix: () => (/* reexport safe */ _matrix__WEBPACK_IMPORTED_MODULE_2__.Matrix),\n/* harmony export */ MatrixLocations: () => (/* reexport safe */ _matrix__WEBPACK_IMPORTED_MODULE_2__.MatrixLocations),\n/* harmony export */ Projection: () => (/* reexport safe */ _projection__WEBPACK_IMPORTED_MODULE_9__.Projection),\n/* harmony export */ Random: () => (/* reexport safe */ _Random__WEBPACK_IMPORTED_MODULE_6__.Random),\n/* harmony export */ Ray: () => (/* reexport safe */ _ray__WEBPACK_IMPORTED_MODULE_10__.Ray),\n/* harmony export */ RotationType: () => (/* reexport safe */ _rotation_type__WEBPACK_IMPORTED_MODULE_14__.RotationType),\n/* harmony export */ Transform: () => (/* reexport safe */ _transform__WEBPACK_IMPORTED_MODULE_4__.Transform),\n/* harmony export */ TwoPI: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.TwoPI),\n/* harmony export */ Vector: () => (/* reexport safe */ _vector__WEBPACK_IMPORTED_MODULE_0__.Vector),\n/* harmony export */ VectorView: () => (/* reexport safe */ _vector_view__WEBPACK_IMPORTED_MODULE_1__.VectorView),\n/* harmony export */ approximatelyEqual: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.approximatelyEqual),\n/* harmony export */ canonicalizeAngle: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.canonicalizeAngle),\n/* harmony export */ clamp: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.clamp),\n/* harmony export */ frac: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.frac),\n/* harmony export */ inverseLerp: () => (/* reexport safe */ _lerp__WEBPACK_IMPORTED_MODULE_11__.inverseLerp),\n/* harmony export */ inverseLerpVector: () => (/* reexport safe */ _lerp__WEBPACK_IMPORTED_MODULE_11__.inverseLerpVector),\n/* harmony export */ lerp: () => (/* reexport safe */ _lerp__WEBPACK_IMPORTED_MODULE_11__.lerp),\n/* harmony export */ lerpAngle: () => (/* reexport safe */ _lerp__WEBPACK_IMPORTED_MODULE_11__.lerpAngle),\n/* harmony export */ lerpVector: () => (/* reexport safe */ _lerp__WEBPACK_IMPORTED_MODULE_11__.lerpVector),\n/* harmony export */ randomInRange: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.randomInRange),\n/* harmony export */ randomIntInRange: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.randomIntInRange),\n/* harmony export */ range: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.range),\n/* harmony export */ remap: () => (/* reexport safe */ _lerp__WEBPACK_IMPORTED_MODULE_11__.remap),\n/* harmony export */ remapVector: () => (/* reexport safe */ _lerp__WEBPACK_IMPORTED_MODULE_11__.remapVector),\n/* harmony export */ sign: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.sign),\n/* harmony export */ toDegrees: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.toDegrees),\n/* harmony export */ toRadians: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.toRadians),\n/* harmony export */ vec: () => (/* reexport safe */ _vector__WEBPACK_IMPORTED_MODULE_0__.vec)\n/* harmony export */ });\n/* harmony import */ var _vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vector */ \"./Math/vector.ts\");\n/* harmony import */ var _vector_view__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./vector-view */ \"./Math/vector-view.ts\");\n/* harmony import */ var _matrix__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./matrix */ \"./Math/matrix.ts\");\n/* harmony import */ var _affine_matrix__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./affine-matrix */ \"./Math/affine-matrix.ts\");\n/* harmony import */ var _transform__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./transform */ \"./Math/transform.ts\");\n/* harmony import */ var _coord_plane__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _Random__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Random */ \"./Math/Random.ts\");\n/* harmony import */ var _global_coordinates__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./global-coordinates */ \"./Math/global-coordinates.ts\");\n/* harmony import */ var _line_segment__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./line-segment */ \"./Math/line-segment.ts\");\n/* harmony import */ var _projection__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./projection */ \"./Math/projection.ts\");\n/* harmony import */ var _ray__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./ray */ \"./Math/ray.ts\");\n/* harmony import */ var _lerp__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./lerp */ \"./Math/lerp.ts\");\n/* harmony import */ var _bezier_curve__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./bezier-curve */ \"./Math/bezier-curve.ts\");\n/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./util */ \"./Math/util.ts\");\n/* harmony import */ var _rotation_type__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./rotation-type */ \"./Math/rotation-type.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Math/lerp.ts\":\n/*!**********************!*\\\n !*** ./Math/lerp.ts ***!\n \\**********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ inverseLerp: () => (/* binding */ inverseLerp),\n/* harmony export */ inverseLerpVector: () => (/* binding */ inverseLerpVector),\n/* harmony export */ lerp: () => (/* binding */ lerp),\n/* harmony export */ lerpAngle: () => (/* binding */ lerpAngle),\n/* harmony export */ lerpVector: () => (/* binding */ lerpVector),\n/* harmony export */ remap: () => (/* binding */ remap),\n/* harmony export */ remapVector: () => (/* binding */ remapVector)\n/* harmony export */ });\n/* harmony import */ var _rotation_type__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./rotation-type */ \"./Math/rotation-type.ts\");\n/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./util */ \"./Math/util.ts\");\n\n\n/**\n * Linear interpolation between `a` and `b`, at `time = 0` the value will be `a` at `time = 1` the value will be `b`\n * @param a\n * @param b\n * @param time\n */\nfunction lerp(a, b, time) {\n return (1 - time) * a + b * time;\n}\n/**\n * Linear interpolation between angles in radians\n * @param startAngle\n * @param endAngle\n * @param rotationType\n * @param time\n */\nfunction lerpAngle(startAngle, endAngle, rotationType, time) {\n const shortestPathIsPositive = (startAngle - endAngle + _util__WEBPACK_IMPORTED_MODULE_0__.TwoPI) % _util__WEBPACK_IMPORTED_MODULE_0__.TwoPI >= Math.PI;\n const distance1 = Math.abs(endAngle - startAngle);\n const distance2 = _util__WEBPACK_IMPORTED_MODULE_0__.TwoPI - distance1;\n let shortDistance = 0;\n let longDistance = 0;\n if (distance1 > distance2) {\n shortDistance = distance2;\n longDistance = distance1;\n }\n else {\n shortDistance = distance1;\n longDistance = distance2;\n }\n let distance = 0;\n let direction = 1;\n switch (rotationType) {\n case _rotation_type__WEBPACK_IMPORTED_MODULE_1__.RotationType.ShortestPath:\n distance = shortDistance;\n direction = shortestPathIsPositive ? 1 : -1;\n break;\n case _rotation_type__WEBPACK_IMPORTED_MODULE_1__.RotationType.LongestPath:\n distance = longDistance;\n direction = shortestPathIsPositive ? -1 : 1;\n break;\n case _rotation_type__WEBPACK_IMPORTED_MODULE_1__.RotationType.Clockwise:\n direction = 1;\n distance = shortestPathIsPositive ? shortDistance : longDistance;\n break;\n case _rotation_type__WEBPACK_IMPORTED_MODULE_1__.RotationType.CounterClockwise:\n direction = -1;\n distance = shortestPathIsPositive ? longDistance : shortDistance;\n break;\n }\n return startAngle + direction * (distance * time);\n}\n/**\n * Linear interpolation between `a` and `b`, at `time = 0` the value will be `a` at `time = 1` the value will be `b`\n * @param a\n * @param b\n * @param time\n */\nfunction lerpVector(a, b, time) {\n return a.scale(1 - time).add(b.scale(time));\n}\n/**\n * Inverse of a linear interpolation, given a `value` in between `a` and `b` return how close to `a` or `b` the `value` is.\n *\n * Example: `a=1`, `b=5`, `value=4` will return `.75`\n * @param a\n * @param b\n * @param value\n */\nfunction inverseLerp(a, b, value) {\n return (value - a) / (b - a);\n}\n/**\n * Inverse of a linear interpolation, given a `value` in between `a` and `b` return how close to `a` or `b` the `value` is.\n *\n * **Warning** assumes that the `value` vector is co-linear with vector `a` and `b`\n *\n * Example: `a=1`, `b=5`, `value=4` will return `.75`\n * @param a\n * @param b\n * @param value\n */\nfunction inverseLerpVector(a, b, value) {\n const numerator = value.sub(a);\n const denominator = b.sub(a);\n const x = numerator.x / denominator.x;\n const y = numerator.y / denominator.y;\n return Math.min(x, y);\n}\n/**\n * Remaps a value from a source domain to a destination\n * @param minSource\n * @param maxSource\n * @param minDestination\n * @param maxDestination\n * @param value\n */\nfunction remap(minSource, maxSource, minDestination, maxDestination, value) {\n const time = inverseLerp(minSource, maxSource, value);\n return lerp(minDestination, maxDestination, time);\n}\n/**\n * Remaps a value from a source domain to a destination\n *\n * **Warning** assumes that the `value` vector is co-linear with vector `minSource` and `maxSource`\n * @param minSource\n * @param maxSource\n * @param minDestination\n * @param maxDestination\n * @param value\n */\nfunction remapVector(minSource, maxSource, minDestination, maxDestination, value) {\n const time = inverseLerpVector(minSource, maxSource, value);\n return lerpVector(minDestination, maxDestination, time);\n}\n\n\n/***/ }),\n\n/***/ \"./Math/line-segment.ts\":\n/*!******************************!*\\\n !*** ./Math/line-segment.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ LineSegment: () => (/* binding */ LineSegment)\n/* harmony export */ });\n/* harmony import */ var _vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vector */ \"./Math/vector.ts\");\n\n/**\n * A 2D line segment\n */\nclass LineSegment {\n /**\n * @param begin The starting point of the line segment\n * @param end The ending point of the line segment\n */\n constructor(begin, end) {\n this.begin = begin;\n this.end = end;\n }\n clone(dest) {\n const result = dest || new LineSegment(this.begin.clone(), this.end.clone());\n result.begin = this.begin.clone(result.begin);\n result.end = this.end.clone(result.end);\n return result;\n }\n transform(matrix, dest) {\n const result = dest || new LineSegment(_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero, _vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero);\n result.begin = matrix.multiply(this.begin, result.begin);\n result.end = matrix.multiply(this.end, result.end);\n return result;\n }\n /**\n * Gets the raw slope (m) of the line. Will return (+/-)Infinity for vertical lines.\n */\n get slope() {\n return (this.end.y - this.begin.y) / (this.end.x - this.begin.x);\n }\n /**\n * Gets the Y-intercept (b) of the line. Will return (+/-)Infinity if there is no intercept.\n */\n get intercept() {\n return this.begin.y - this.slope * this.begin.x;\n }\n /**\n * Gets the normal of the line\n */\n normal() {\n if (this._normal) {\n return this._normal;\n }\n return (this._normal = this.end.sub(this.begin).normal());\n }\n dir() {\n if (this._dir) {\n return this._dir;\n }\n return (this._dir = this.end.sub(this.begin));\n }\n getPoints() {\n return [this.begin, this.end];\n }\n /**\n * Returns the slope of the line in the form of a vector of length 1\n */\n getSlope() {\n if (this._slope) {\n return this._slope;\n }\n const begin = this.begin;\n const end = this.end;\n const distance = begin.distance(end);\n return (this._slope = end.sub(begin).scale(1 / distance));\n }\n /**\n * Returns the edge of the line as vector, the length of the vector is the length of the edge\n */\n getEdge() {\n const begin = this.begin;\n const end = this.end;\n return end.sub(begin);\n }\n /**\n * Returns the length of the line segment in pixels\n */\n getLength() {\n const begin = this.begin;\n const end = this.end;\n const distance = begin.distance(end);\n return distance;\n }\n /**\n * Returns the midpoint of the edge\n */\n get midpoint() {\n return this.begin.add(this.end).scale(0.5);\n }\n /**\n * Flips the direction of the line segment\n */\n flip() {\n return new LineSegment(this.end, this.begin);\n }\n /**\n * Tests if a given point is below the line, points in the normal direction above the line are considered above.\n * @param point\n */\n below(point) {\n const above2 = (this.end.x - this.begin.x) * (point.y - this.begin.y) - (this.end.y - this.begin.y) * (point.x - this.begin.x);\n return above2 >= 0;\n }\n /**\n * Returns the clip point\n * @param sideVector Vector that traces the line\n * @param length Length to clip along side\n */\n clip(sideVector, length, normalize = true) {\n let dir = sideVector;\n if (normalize) {\n dir = dir.normalize();\n }\n const near = dir.dot(this.begin) - length;\n const far = dir.dot(this.end) - length;\n const results = [];\n if (near <= 0) {\n results.push(this.begin);\n }\n if (far <= 0) {\n results.push(this.end);\n }\n if (near * far < 0) {\n const clipTime = near / (near - far);\n results.push(this.begin.add(this.end.sub(this.begin).scale(clipTime)));\n }\n if (results.length !== 2) {\n return null;\n }\n return new LineSegment(results[0], results[1]);\n }\n /**\n * Find the perpendicular distance from the line to a point\n * https://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line\n * @param point\n */\n distanceToPoint(point, signed = false) {\n const x0 = point.x;\n const y0 = point.y;\n const l = this.getLength();\n const dy = this.end.y - this.begin.y;\n const dx = this.end.x - this.begin.x;\n const distance = (dy * x0 - dx * y0 + this.end.x * this.begin.y - this.end.y * this.begin.x) / l;\n return signed ? distance : Math.abs(distance);\n }\n /**\n * Find the perpendicular line from the line to a point\n * https://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line\n * (a - p) - ((a - p) * n)n\n * a is a point on the line\n * p is the arbitrary point above the line\n * n is a unit vector in direction of the line\n * @param point\n */\n findVectorToPoint(point) {\n const aMinusP = this.begin.sub(point);\n const n = this.getSlope();\n return aMinusP.sub(n.scale(aMinusP.dot(n)));\n }\n /**\n * Finds a point on the line given only an X or a Y value. Given an X value, the function returns\n * a new point with the calculated Y value and vice-versa.\n * @param x The known X value of the target point\n * @param y The known Y value of the target point\n * @returns A new point with the other calculated axis value\n */\n findPoint(x = null, y = null) {\n const m = this.slope;\n const b = this.intercept;\n if (x !== null) {\n return new _vector__WEBPACK_IMPORTED_MODULE_0__.Vector(x, m * x + b);\n }\n else if (y !== null) {\n return new _vector__WEBPACK_IMPORTED_MODULE_0__.Vector((y - b) / m, y);\n }\n else {\n throw new Error('You must provide an X or a Y value');\n }\n }\n /**\n * @see http://stackoverflow.com/a/11908158/109458\n */\n hasPoint() {\n let currPoint;\n let threshold = 0;\n if (typeof arguments[0] === 'number' && typeof arguments[1] === 'number') {\n currPoint = new _vector__WEBPACK_IMPORTED_MODULE_0__.Vector(arguments[0], arguments[1]);\n threshold = arguments[2] || 0;\n }\n else if (arguments[0] instanceof _vector__WEBPACK_IMPORTED_MODULE_0__.Vector) {\n currPoint = arguments[0];\n threshold = arguments[1] || 0;\n }\n else {\n throw 'Could not determine the arguments for Vector.hasPoint';\n }\n const dxc = currPoint.x - this.begin.x;\n const dyc = currPoint.y - this.begin.y;\n const dx1 = this.end.x - this.begin.x;\n const dy1 = this.end.y - this.begin.y;\n const cross = dxc * dy1 - dyc * dx1;\n // check whether point lines on the line\n if (Math.abs(cross) > threshold) {\n return false;\n }\n // check whether point lies in-between start and end\n if (Math.abs(dx1) >= Math.abs(dy1)) {\n return dx1 > 0 ? this.begin.x <= currPoint.x && currPoint.x <= this.end.x : this.end.x <= currPoint.x && currPoint.x <= this.begin.x;\n }\n else {\n return dy1 > 0 ? this.begin.y <= currPoint.y && currPoint.y <= this.end.y : this.end.y <= currPoint.y && currPoint.y <= this.begin.y;\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/matrix.ts\":\n/*!************************!*\\\n !*** ./Math/matrix.ts ***!\n \\************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Matrix: () => (/* binding */ Matrix),\n/* harmony export */ MatrixLocations: () => (/* binding */ MatrixLocations)\n/* harmony export */ });\n/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./util */ \"./Math/util.ts\");\n/* harmony import */ var _vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vector */ \"./Math/vector.ts\");\n\n\n\nvar MatrixLocations;\n(function (MatrixLocations) {\n MatrixLocations[MatrixLocations[\"X\"] = 12] = \"X\";\n MatrixLocations[MatrixLocations[\"Y\"] = 13] = \"Y\";\n})(MatrixLocations || (MatrixLocations = {}));\n/**\n * Excalibur Matrix helper for 4x4 matrices\n *\n * Useful for webgl 4x4 matrices\n */\nclass Matrix {\n constructor() {\n /**\n * 4x4 matrix in column major order\n *\n * | | | | |\n * | ------- | ------- | -------- | -------- |\n * | data[0] | data[4] | data[8] | data[12] |\n * | data[1] | data[5] | data[9] | data[13] |\n * | data[2] | data[6] | data[10] | data[14] |\n * | data[3] | data[7] | data[11] | data[15] |\n *\n */\n this.data = new Float32Array(16);\n this._scaleX = 1;\n this._scaleSignX = 1;\n this._scaleY = 1;\n this._scaleSignY = 1;\n }\n /**\n * Creates an orthographic (flat non-perspective) projection\n * https://en.wikipedia.org/wiki/Orthographic_projection\n * @param left\n * @param right\n * @param bottom\n * @param top\n * @param near\n * @param far\n */\n static ortho(left, right, bottom, top, near, far) {\n const mat = new Matrix();\n mat.data[0] = 2 / (right - left);\n mat.data[1] = 0;\n mat.data[2] = 0;\n mat.data[3] = 0;\n mat.data[4] = 0;\n mat.data[5] = 2 / (top - bottom);\n mat.data[6] = 0;\n mat.data[7] = 0;\n mat.data[8] = 0;\n mat.data[9] = 0;\n mat.data[10] = -2 / (far - near);\n mat.data[11] = 0;\n mat.data[12] = -(right + left) / (right - left);\n mat.data[13] = -(top + bottom) / (top - bottom);\n mat.data[14] = -(far + near) / (far - near);\n mat.data[15] = 1;\n return mat;\n }\n /**\n * Creates a new Matrix with the same data as the current 4x4\n */\n clone(dest) {\n const mat = dest || new Matrix();\n mat.data[0] = this.data[0];\n mat.data[1] = this.data[1];\n mat.data[2] = this.data[2];\n mat.data[3] = this.data[3];\n mat.data[4] = this.data[4];\n mat.data[5] = this.data[5];\n mat.data[6] = this.data[6];\n mat.data[7] = this.data[7];\n mat.data[8] = this.data[8];\n mat.data[9] = this.data[9];\n mat.data[10] = this.data[10];\n mat.data[11] = this.data[11];\n mat.data[12] = this.data[12];\n mat.data[13] = this.data[13];\n mat.data[14] = this.data[14];\n mat.data[15] = this.data[15];\n return mat;\n }\n /**\n * Converts the current matrix into a DOMMatrix\n *\n * This is useful when working with the browser Canvas context\n * @returns {DOMMatrix} DOMMatrix\n */\n toDOMMatrix() {\n return new DOMMatrix([...this.data]);\n }\n static fromFloat32Array(data) {\n const matrix = new Matrix();\n matrix.data = data;\n return matrix;\n }\n /**\n * Creates a new identity matrix (a matrix that when applied does nothing)\n */\n static identity() {\n const mat = new Matrix();\n mat.data[0] = 1;\n mat.data[1] = 0;\n mat.data[2] = 0;\n mat.data[3] = 0;\n mat.data[4] = 0;\n mat.data[5] = 1;\n mat.data[6] = 0;\n mat.data[7] = 0;\n mat.data[8] = 0;\n mat.data[9] = 0;\n mat.data[10] = 1;\n mat.data[11] = 0;\n mat.data[12] = 0;\n mat.data[13] = 0;\n mat.data[14] = 0;\n mat.data[15] = 1;\n return mat;\n }\n /**\n * Resets the current matrix to the identity matrix, mutating it\n * @returns {Matrix} Current matrix as identity\n */\n reset() {\n const mat = this;\n mat.data[0] = 1;\n mat.data[1] = 0;\n mat.data[2] = 0;\n mat.data[3] = 0;\n mat.data[4] = 0;\n mat.data[5] = 1;\n mat.data[6] = 0;\n mat.data[7] = 0;\n mat.data[8] = 0;\n mat.data[9] = 0;\n mat.data[10] = 1;\n mat.data[11] = 0;\n mat.data[12] = 0;\n mat.data[13] = 0;\n mat.data[14] = 0;\n mat.data[15] = 1;\n return mat;\n }\n /**\n * Creates a brand new translation matrix at the specified 3d point\n * @param x\n * @param y\n */\n static translation(x, y) {\n const mat = Matrix.identity();\n mat.data[12] = x;\n mat.data[13] = y;\n return mat;\n }\n /**\n * Creates a brand new scaling matrix with the specified scaling factor\n * @param sx\n * @param sy\n */\n static scale(sx, sy) {\n const mat = Matrix.identity();\n mat.data[0] = sx;\n mat.data[5] = sy;\n mat.data[10] = 1;\n mat.data[15] = 1;\n return mat;\n }\n /**\n * Creates a brand new rotation matrix with the specified angle in radians\n * @param angle\n */\n static rotation(angle) {\n const mat = Matrix.identity();\n mat.data[0] = Math.cos(angle);\n mat.data[4] = -Math.sin(angle);\n mat.data[1] = Math.sin(angle);\n mat.data[5] = Math.cos(angle);\n return mat;\n }\n multiply(vectorOrMatrix, dest) {\n if (vectorOrMatrix instanceof _vector__WEBPACK_IMPORTED_MODULE_0__.Vector) {\n const result = dest || new _vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\n const vector = vectorOrMatrix;\n // these shenanigans are to allow dest and vector to be the same instance\n const resultX = vector.x * this.data[0] + vector.y * this.data[4] + this.data[12];\n const resultY = vector.x * this.data[1] + vector.y * this.data[5] + this.data[13];\n result.x = resultX;\n result.y = resultY;\n return result;\n }\n else {\n const result = dest || new Matrix();\n const other = vectorOrMatrix;\n const a11 = this.data[0];\n const a21 = this.data[1];\n const a31 = this.data[2];\n const a41 = this.data[3];\n const a12 = this.data[4];\n const a22 = this.data[5];\n const a32 = this.data[6];\n const a42 = this.data[7];\n const a13 = this.data[8];\n const a23 = this.data[9];\n const a33 = this.data[10];\n const a43 = this.data[11];\n const a14 = this.data[12];\n const a24 = this.data[13];\n const a34 = this.data[14];\n const a44 = this.data[15];\n const b11 = other.data[0];\n const b21 = other.data[1];\n const b31 = other.data[2];\n const b41 = other.data[3];\n const b12 = other.data[4];\n const b22 = other.data[5];\n const b32 = other.data[6];\n const b42 = other.data[7];\n const b13 = other.data[8];\n const b23 = other.data[9];\n const b33 = other.data[10];\n const b43 = other.data[11];\n const b14 = other.data[12];\n const b24 = other.data[13];\n const b34 = other.data[14];\n const b44 = other.data[15];\n result.data[0] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n result.data[1] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n result.data[2] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n result.data[3] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n result.data[4] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n result.data[5] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n result.data[6] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n result.data[7] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n result.data[8] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n result.data[9] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n result.data[10] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n result.data[11] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n result.data[12] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n result.data[13] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n result.data[14] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n result.data[15] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n const s = this.getScale();\n result._scaleSignX = (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(s.x) * (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(result._scaleSignX);\n result._scaleSignY = (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(s.y) * (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(result._scaleSignY);\n return result;\n }\n }\n /**\n * Applies translation to the current matrix mutating it\n * @param x\n * @param y\n */\n translate(x, y) {\n const a11 = this.data[0];\n const a21 = this.data[1];\n const a31 = this.data[2];\n const a41 = this.data[3];\n const a12 = this.data[4];\n const a22 = this.data[5];\n const a32 = this.data[6];\n const a42 = this.data[7];\n const a13 = this.data[8];\n const a23 = this.data[9];\n const a33 = this.data[10];\n const a43 = this.data[11];\n const a14 = this.data[12];\n const a24 = this.data[13];\n const a34 = this.data[14];\n const a44 = this.data[15];\n // Doesn't change z\n const z = 0;\n const w = 1;\n this.data[12] = a11 * x + a12 * y + a13 * z + a14 * w;\n this.data[13] = a21 * x + a22 * y + a23 * z + a24 * w;\n this.data[14] = a31 * x + a32 * y + a33 * z + a34 * w;\n this.data[15] = a41 * x + a42 * y + a43 * z + a44 * w;\n return this;\n }\n setPosition(x, y) {\n this.data[12] = x;\n this.data[13] = y;\n }\n getPosition() {\n return (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.data[12], this.data[13]);\n }\n /**\n * Applies rotation to the current matrix mutating it\n * @param angle in Radians\n */\n rotate(angle) {\n const a11 = this.data[0];\n const a21 = this.data[1];\n const a31 = this.data[2];\n const a41 = this.data[3];\n const a12 = this.data[4];\n const a22 = this.data[5];\n const a32 = this.data[6];\n const a42 = this.data[7];\n const sine = Math.sin(angle);\n const cosine = Math.cos(angle);\n this.data[0] = cosine * a11 + sine * a12;\n this.data[1] = cosine * a21 + sine * a22;\n this.data[2] = cosine * a31 + sine * a32;\n this.data[3] = cosine * a41 + sine * a42;\n this.data[4] = cosine * a12 - sine * a11;\n this.data[5] = cosine * a22 - sine * a21;\n this.data[6] = cosine * a32 - sine * a31;\n this.data[7] = cosine * a42 - sine * a41;\n return this;\n }\n /**\n * Applies scaling to the current matrix mutating it\n * @param x\n * @param y\n */\n scale(x, y) {\n const a11 = this.data[0];\n const a21 = this.data[1];\n const a31 = this.data[2];\n const a41 = this.data[3];\n const a12 = this.data[4];\n const a22 = this.data[5];\n const a32 = this.data[6];\n const a42 = this.data[7];\n this.data[0] = a11 * x;\n this.data[1] = a21 * x;\n this.data[2] = a31 * x;\n this.data[3] = a41 * x;\n this.data[4] = a12 * y;\n this.data[5] = a22 * y;\n this.data[6] = a32 * y;\n this.data[7] = a42 * y;\n return this;\n }\n setRotation(angle) {\n const currentScale = this.getScale();\n const sine = Math.sin(angle);\n const cosine = Math.cos(angle);\n this.data[0] = cosine * currentScale.x;\n this.data[1] = sine * currentScale.y;\n this.data[4] = -sine * currentScale.x;\n this.data[5] = cosine * currentScale.y;\n }\n getRotation() {\n const angle = Math.atan2(this.data[1] / this.getScaleY(), this.data[0] / this.getScaleX());\n return (0,_util__WEBPACK_IMPORTED_MODULE_1__.canonicalizeAngle)(angle);\n }\n getScaleX() {\n // absolute scale of the matrix (we lose sign so need to add it back)\n const xscale = (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.data[0], this.data[4]).magnitude;\n return this._scaleSignX * xscale;\n }\n getScaleY() {\n // absolute scale of the matrix (we lose sign so need to add it back)\n const yscale = (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.data[1], this.data[5]).magnitude;\n return this._scaleSignY * yscale;\n }\n /**\n * Get the scale of the matrix\n */\n getScale() {\n return (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.getScaleX(), this.getScaleY());\n }\n setScaleX(val) {\n if (this._scaleX === val) {\n return;\n }\n this._scaleSignX = (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(val);\n // negative scale acts like a 180 rotation, so flip\n const xscale = (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.data[0] * this._scaleSignX, this.data[4] * this._scaleSignX).normalize();\n this.data[0] = xscale.x * val;\n this.data[4] = xscale.y * val;\n this._scaleX = val;\n }\n setScaleY(val) {\n if (this._scaleY === val) {\n return;\n }\n this._scaleSignY = (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(val);\n // negative scale acts like a 180 rotation, so flip\n const yscale = (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.data[1] * this._scaleSignY, this.data[5] * this._scaleSignY).normalize();\n this.data[1] = yscale.x * val;\n this.data[5] = yscale.y * val;\n this._scaleY = val;\n }\n setScale(scale) {\n this.setScaleX(scale.x);\n this.setScaleY(scale.y);\n }\n /**\n * Determinant of the upper left 2x2 matrix\n */\n getBasisDeterminant() {\n return this.data[0] * this.data[5] - this.data[1] * this.data[4];\n }\n /**\n * Return the affine inverse, optionally store it in a target matrix.\n *\n * It's recommended you call .reset() the target unless you know what you're doing\n * @param target\n */\n getAffineInverse(target) {\n // See http://negativeprobability.blogspot.com/2011/11/affine-transformations-and-their.html\n // See https://www.mathsisfun.com/algebra/matrix-inverse.html\n // Since we are actually only doing 2D transformations we can use this hack\n // We don't actually use the 3rd or 4th dimension\n const det = this.getBasisDeterminant();\n const inverseDet = 1 / det; // todo zero check\n const a = this.data[0];\n const b = this.data[4];\n const c = this.data[1];\n const d = this.data[5];\n const m = target || Matrix.identity();\n // inverts rotation and scale\n m.data[0] = d * inverseDet;\n m.data[1] = -c * inverseDet;\n m.data[4] = -b * inverseDet;\n m.data[5] = a * inverseDet;\n const tx = this.data[12];\n const ty = this.data[13];\n // invert translation\n // transform translation into the matrix basis created by rot/scale\n m.data[12] = -(tx * m.data[0] + ty * m.data[4]);\n m.data[13] = -(tx * m.data[1] + ty * m.data[5]);\n return m;\n }\n isIdentity() {\n return (this.data[0] === 1 &&\n this.data[1] === 0 &&\n this.data[2] === 0 &&\n this.data[3] === 0 &&\n this.data[4] === 0 &&\n this.data[5] === 1 &&\n this.data[6] === 0 &&\n this.data[7] === 0 &&\n this.data[8] === 0 &&\n this.data[9] === 0 &&\n this.data[10] === 1 &&\n this.data[11] === 0 &&\n this.data[12] === 0 &&\n this.data[13] === 0 &&\n this.data[14] === 0 &&\n this.data[15] === 1);\n }\n toString() {\n return `\r\n[${this.data[0]} ${this.data[4]} ${this.data[8]} ${this.data[12]}]\r\n[${this.data[1]} ${this.data[5]} ${this.data[9]} ${this.data[13]}]\r\n[${this.data[2]} ${this.data[6]} ${this.data[10]} ${this.data[14]}]\r\n[${this.data[3]} ${this.data[7]} ${this.data[11]} ${this.data[15]}]\r\n`;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/projection.ts\":\n/*!****************************!*\\\n !*** ./Math/projection.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Projection: () => (/* binding */ Projection)\n/* harmony export */ });\n/**\n * A 1 dimensional projection on an axis, used to test overlaps\n */\nclass Projection {\n constructor(min, max) {\n this.min = min;\n this.max = max;\n }\n overlaps(projection) {\n return this.max > projection.min && projection.max > this.min;\n }\n getOverlap(projection) {\n if (this.overlaps(projection)) {\n if (this.max > projection.max) {\n return projection.max - this.min;\n }\n else {\n return this.max - projection.min;\n }\n }\n return 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/ray.ts\":\n/*!*********************!*\\\n !*** ./Math/ray.ts ***!\n \\*********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Ray: () => (/* binding */ Ray)\n/* harmony export */ });\n/**\n * A 2D ray that can be cast into the scene to do collision detection\n */\nclass Ray {\n /**\n * @param pos The starting position for the ray\n * @param dir The vector indicating the direction of the ray\n */\n constructor(pos, dir) {\n this.pos = pos;\n this.dir = dir.normalize();\n }\n /**\n * Tests a whether this ray intersects with a line segment. Returns a number greater than or equal to 0 on success.\n * This number indicates the mathematical intersection time.\n * @param line The line to test\n */\n intersect(line) {\n const numerator = line.begin.sub(this.pos);\n // Test is line and ray are parallel and non intersecting\n if (this.dir.cross(line.getSlope()) === 0 && numerator.cross(this.dir) !== 0) {\n return -1;\n }\n // Lines are parallel\n const divisor = this.dir.cross(line.getSlope());\n if (divisor === 0) {\n return -1;\n }\n const t = numerator.cross(line.getSlope()) / divisor;\n if (t >= 0) {\n const u = numerator.cross(this.dir) / divisor / line.getLength();\n if (u >= 0 && u <= 1) {\n return t;\n }\n }\n return -1;\n }\n intersectPoint(line) {\n const time = this.intersect(line);\n if (time < 0) {\n return null;\n }\n return this.getPoint(time);\n }\n /**\n * Returns the point of intersection given the intersection time\n */\n getPoint(time) {\n return this.pos.add(this.dir.scale(time));\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/rotation-type.ts\":\n/*!*******************************!*\\\n !*** ./Math/rotation-type.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RotationType: () => (/* binding */ RotationType)\n/* harmony export */ });\n/**\n * An enum that describes the strategies that rotation actions can use\n */\nvar RotationType;\n(function (RotationType) {\n /**\n * Rotation via `ShortestPath` will use the smallest angle\n * between the starting and ending points. This strategy is the default behavior.\n */\n RotationType[\"ShortestPath\"] = \"shortest-path\";\n /**\n * Rotation via `LongestPath` will use the largest angle\n * between the starting and ending points.\n */\n RotationType[\"LongestPath\"] = \"longest-path\";\n /**\n * Rotation via `Clockwise` will travel in a clockwise direction,\n * regardless of the starting and ending points.\n */\n RotationType[\"Clockwise\"] = \"clockwise\";\n /**\n * Rotation via `CounterClockwise` will travel in a counterclockwise direction,\n * regardless of the starting and ending points.\n */\n RotationType[\"CounterClockwise\"] = \"counter-clockwise\";\n})(RotationType || (RotationType = {}));\n\n\n/***/ }),\n\n/***/ \"./Math/transform.ts\":\n/*!***************************!*\\\n !*** ./Math/transform.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Transform: () => (/* binding */ Transform)\n/* harmony export */ });\n/* harmony import */ var _affine_matrix__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./affine-matrix */ \"./Math/affine-matrix.ts\");\n/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./util */ \"./Math/util.ts\");\n/* harmony import */ var _vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./vector */ \"./Math/vector.ts\");\n/* harmony import */ var _vector_view__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./vector-view */ \"./Math/vector-view.ts\");\n/* harmony import */ var _watch_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./watch-vector */ \"./Math/watch-vector.ts\");\n\n\n\n\n\nclass Transform {\n constructor() {\n this._parent = null;\n this._children = [];\n this._pos = new _watch_vector__WEBPACK_IMPORTED_MODULE_0__.WatchVector((0,_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0), () => {\n this.flagDirty();\n });\n this._globalPos = new _vector_view__WEBPACK_IMPORTED_MODULE_2__.VectorView({\n getX: () => this.matrix.data[4],\n getY: () => this.matrix.data[5],\n setX: (x) => {\n if (this.parent) {\n const { x: newX } = this.parent.inverse.multiply((0,_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(x, this.pos.y));\n this.pos.x = newX;\n }\n else {\n this.pos.x = x;\n }\n if (x !== this.matrix.data[4]) {\n this.flagDirty();\n }\n },\n setY: (y) => {\n if (this.parent) {\n const { y: newY } = this.parent.inverse.multiply((0,_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(this.pos.x, y));\n this.pos.y = newY;\n }\n else {\n this.pos.y = y;\n }\n if (y !== this.matrix.data[5]) {\n this.flagDirty();\n }\n }\n });\n this._rotation = 0;\n this._scale = new _watch_vector__WEBPACK_IMPORTED_MODULE_0__.WatchVector((0,_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(1, 1), () => {\n this.flagDirty();\n });\n this._globalScale = new _vector_view__WEBPACK_IMPORTED_MODULE_2__.VectorView({\n getX: () => (this.parent ? this.matrix.getScaleX() : this.scale.x),\n getY: () => (this.parent ? this.matrix.getScaleY() : this.scale.y),\n setX: (x) => {\n if (this.parent) {\n const globalScaleX = this.parent.globalScale.x;\n this.scale.x = x / globalScaleX;\n }\n else {\n this.scale.x = x;\n }\n },\n setY: (y) => {\n if (this.parent) {\n const globalScaleY = this.parent.globalScale.y;\n this.scale.y = y / globalScaleY;\n }\n else {\n this.scale.y = y;\n }\n }\n });\n this._z = 0;\n this._isDirty = false;\n this._isInverseDirty = false;\n this._matrix = _affine_matrix__WEBPACK_IMPORTED_MODULE_3__.AffineMatrix.identity();\n this._inverse = _affine_matrix__WEBPACK_IMPORTED_MODULE_3__.AffineMatrix.identity();\n this._scratch = _affine_matrix__WEBPACK_IMPORTED_MODULE_3__.AffineMatrix.identity();\n }\n get parent() {\n return this._parent;\n }\n set parent(transform) {\n if (this._parent) {\n const index = this._parent._children.indexOf(this);\n if (index > -1) {\n this._parent._children.splice(index, 1);\n }\n }\n this._parent = transform;\n if (this._parent) {\n this._parent._children.push(this);\n }\n this.flagDirty();\n }\n get children() {\n return this._children;\n }\n set pos(v) {\n this._pos.x = v.x;\n this._pos.y = v.y;\n }\n get pos() {\n return this._pos;\n }\n set globalPos(v) {\n let localPos = v.clone();\n if (this.parent) {\n localPos = this.parent.inverse.multiply(v);\n }\n if (!localPos.equals(this._pos)) {\n this._pos = localPos;\n this.flagDirty();\n }\n }\n get globalPos() {\n return this._globalPos;\n }\n set rotation(rotation) {\n const canonRotation = (0,_util__WEBPACK_IMPORTED_MODULE_4__.canonicalizeAngle)(rotation);\n if (canonRotation !== this._rotation) {\n this.flagDirty();\n }\n this._rotation = canonRotation;\n }\n get rotation() {\n return this._rotation;\n }\n set globalRotation(rotation) {\n let inverseRotation = 0;\n if (this.parent) {\n inverseRotation = this.parent.globalRotation;\n }\n const canonRotation = (0,_util__WEBPACK_IMPORTED_MODULE_4__.canonicalizeAngle)(rotation + inverseRotation);\n if (canonRotation !== this._rotation) {\n this.flagDirty();\n }\n this._rotation = canonRotation;\n }\n get globalRotation() {\n if (this.parent) {\n return this.matrix.getRotation();\n }\n return this.rotation;\n }\n set scale(v) {\n this._scale.x = v.x;\n this._scale.y = v.y;\n }\n get scale() {\n return this._scale;\n }\n set globalScale(v) {\n let inverseScale = (0,_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(1, 1);\n if (this.parent) {\n inverseScale = this.parent.globalScale;\n }\n this.scale = v.scale((0,_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(1 / inverseScale.x, 1 / inverseScale.y));\n }\n get globalScale() {\n return this._globalScale;\n }\n set z(z) {\n this._z = z;\n this.flagDirty();\n }\n get z() {\n return this._z;\n }\n set globalZ(z) {\n if (this.parent) {\n this.z = z - this.parent.globalZ;\n }\n else {\n this.z = z;\n }\n }\n get globalZ() {\n if (this.parent) {\n return this.z + this.parent.globalZ;\n }\n return this.z;\n }\n /**\n * Calculates and returns the matrix representation of this transform\n *\n * Avoid mutating the matrix to update the transform, it is not the source of truth.\n * Update the transform pos, rotation, scale.\n */\n get matrix() {\n if (this._isDirty) {\n if (this.parent === null) {\n this._calculateMatrix().clone(this._matrix);\n }\n else {\n this.parent.matrix.multiply(this._calculateMatrix()).clone(this._matrix);\n }\n this._isDirty = false;\n }\n return this._matrix;\n }\n /**\n * Calculates and returns the inverse matrix representation of this transform\n */\n get inverse() {\n if (this._isInverseDirty) {\n this.matrix.inverse(this._inverse);\n this._isInverseDirty = false;\n }\n return this._inverse;\n }\n _calculateMatrix() {\n this._scratch.data[0] = Math.cos(this._rotation);\n this._scratch.data[1] = Math.sin(this._rotation);\n this._scratch.data[2] = -Math.sin(this._rotation);\n this._scratch.data[3] = Math.cos(this.rotation);\n this._scratch.data[4] = this._pos.x;\n this._scratch.data[5] = this._pos.y;\n this._scratch.scale(this._scale.x, this._scale.y);\n return this._scratch;\n }\n flagDirty() {\n this._isDirty = true;\n this._isInverseDirty = true;\n for (let i = 0; i < this._children.length; i++) {\n this._children[i].flagDirty();\n }\n }\n apply(point) {\n return this.matrix.multiply(point);\n }\n applyInverse(point) {\n return this.inverse.multiply(point);\n }\n setTransform(pos, rotation, scale) {\n this._pos.x = pos.x;\n this._pos.y = pos.y;\n this._rotation = (0,_util__WEBPACK_IMPORTED_MODULE_4__.canonicalizeAngle)(rotation);\n this._scale.x = scale.x;\n this._scale.y = scale.y;\n this.flagDirty();\n }\n /**\n * Returns true if the transform has a negative x scale or y scale, but not both\n */\n isMirrored() {\n const signBitX = (0,_util__WEBPACK_IMPORTED_MODULE_4__.sign)(this.scale.x) >>> 31;\n const signBitY = (0,_util__WEBPACK_IMPORTED_MODULE_4__.sign)(this.scale.y) >>> 31;\n const mirrored = signBitX ^ signBitY;\n return !!mirrored;\n }\n /**\n * Clones the current transform\n * **Warning does not clone the parent**\n * @param dest\n */\n clone(dest) {\n const target = dest !== null && dest !== void 0 ? dest : new Transform();\n this._pos.clone(target._pos);\n target._z = this._z;\n target._rotation = this._rotation;\n this._scale.clone(target._scale);\n target.flagDirty();\n return target;\n }\n /**\n * Clones but keeps the same parent reference\n */\n cloneWithParent(dest) {\n const target = dest !== null && dest !== void 0 ? dest : new Transform();\n this._pos.clone(target._pos);\n target._z = this._z;\n target._rotation = this._rotation;\n this._scale.clone(target._scale);\n target.parent = this.parent;\n target.flagDirty();\n return target;\n }\n toString() {\n return this.matrix.toString();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/util.ts\":\n/*!**********************!*\\\n !*** ./Math/util.ts ***!\n \\**********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TwoPI: () => (/* binding */ TwoPI),\n/* harmony export */ approximatelyEqual: () => (/* binding */ approximatelyEqual),\n/* harmony export */ canonicalizeAngle: () => (/* binding */ canonicalizeAngle),\n/* harmony export */ clamp: () => (/* binding */ clamp),\n/* harmony export */ frac: () => (/* binding */ frac),\n/* harmony export */ randomInRange: () => (/* binding */ randomInRange),\n/* harmony export */ randomIntInRange: () => (/* binding */ randomIntInRange),\n/* harmony export */ range: () => (/* binding */ range),\n/* harmony export */ sign: () => (/* binding */ sign),\n/* harmony export */ toDegrees: () => (/* binding */ toDegrees),\n/* harmony export */ toRadians: () => (/* binding */ toRadians)\n/* harmony export */ });\n/* harmony import */ var _Random__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Random */ \"./Math/Random.ts\");\n\n/**\n * Two PI constant\n */\nconst TwoPI = Math.PI * 2;\n/**\n * Returns the fractional part of a number\n * @param x\n */\nfunction frac(x) {\n if (x >= 0) {\n return x - Math.floor(x);\n }\n else {\n return x - Math.ceil(x);\n }\n}\n/**\n * Returns the sign of a number, if 0 returns 0\n */\nfunction sign(val) {\n if (val === 0) {\n return 0;\n }\n return val < 0 ? -1 : 1;\n}\n/**\n * Clamps a value between a min and max inclusive\n */\nfunction clamp(val, min, max) {\n return Math.min(Math.max(min, val), max);\n}\n/**\n * Approximately equals\n */\nfunction approximatelyEqual(val1, val2, tolerance) {\n // https://dev.to/alldanielscott/how-to-compare-numbers-correctly-in-javascript-1l4i\n return Math.abs(val1 - val2) < tolerance;\n}\n/**\n * Convert an angle to be the equivalent in the range [0, 2PI)\n */\nfunction canonicalizeAngle(angle) {\n let tmpAngle = angle;\n if (angle >= TwoPI) {\n while (tmpAngle >= TwoPI) {\n tmpAngle -= TwoPI;\n }\n }\n if (angle < 0) {\n while (tmpAngle < 0) {\n tmpAngle += TwoPI;\n }\n }\n return tmpAngle;\n}\n/**\n * Convert radians to degrees\n */\nfunction toDegrees(radians) {\n return (180 / Math.PI) * radians;\n}\n/**\n * Convert degrees to radians\n */\nfunction toRadians(degrees) {\n return (degrees / 180) * Math.PI;\n}\n/**\n * Generate a range of numbers\n * For example: range(0, 5) -> [0, 1, 2, 3, 4, 5]\n * @param from inclusive\n * @param to inclusive\n */\nconst range = (from, to) => Array.from(new Array(to - from + 1), (_x, i) => i + from);\n/**\n * Find a random floating point number in range\n */\nfunction randomInRange(min, max, random = new _Random__WEBPACK_IMPORTED_MODULE_0__.Random()) {\n return random ? random.floating(min, max) : min + Math.random() * (max - min);\n}\n/**\n * Find a random integer in a range\n */\nfunction randomIntInRange(min, max, random = new _Random__WEBPACK_IMPORTED_MODULE_0__.Random()) {\n return random ? random.integer(min, max) : Math.round(randomInRange(min, max));\n}\n\n\n/***/ }),\n\n/***/ \"./Math/vector-view.ts\":\n/*!*****************************!*\\\n !*** ./Math/vector-view.ts ***!\n \\*****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ VectorView: () => (/* binding */ VectorView)\n/* harmony export */ });\n/* harmony import */ var _vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vector */ \"./Math/vector.ts\");\n\nclass VectorView extends _vector__WEBPACK_IMPORTED_MODULE_0__.Vector {\n constructor(options) {\n super(0, 0);\n this._getX = options.getX;\n this._getY = options.getY;\n this._setX = options.setX;\n this._setY = options.setY;\n }\n get x() {\n return (this._x = this._getX());\n }\n set x(val) {\n this._setX(val);\n this._x = val;\n }\n get y() {\n return (this._y = this._getY());\n }\n set y(val) {\n this._setY(val);\n this._y = val;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/vector.ts\":\n/*!************************!*\\\n !*** ./Math/vector.ts ***!\n \\************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Vector: () => (/* binding */ Vector),\n/* harmony export */ vec: () => (/* binding */ vec)\n/* harmony export */ });\n/* harmony import */ var _rotation_type__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./rotation-type */ \"./Math/rotation-type.ts\");\n/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./util */ \"./Math/util.ts\");\n\n\n/**\n * A 2D vector on a plane.\n */\nclass Vector {\n /**\n * A (0, 0) vector\n */\n static get Zero() {\n return new Vector(0, 0);\n }\n /**\n * A (1, 1) vector\n */\n static get One() {\n return new Vector(1, 1);\n }\n /**\n * A (0.5, 0.5) vector\n */\n static get Half() {\n return new Vector(0.5, 0.5);\n }\n /**\n * A unit vector pointing up (0, -1)\n */\n static get Up() {\n return new Vector(0, -1);\n }\n /**\n * A unit vector pointing down (0, 1)\n */\n static get Down() {\n return new Vector(0, 1);\n }\n /**\n * A unit vector pointing left (-1, 0)\n */\n static get Left() {\n return new Vector(-1, 0);\n }\n /**\n * A unit vector pointing right (1, 0)\n */\n static get Right() {\n return new Vector(1, 0);\n }\n /**\n * Returns a vector of unit length in the direction of the specified angle in Radians.\n * @param angle The angle to generate the vector\n */\n static fromAngle(angle) {\n return new Vector(Math.cos(angle), Math.sin(angle));\n }\n /**\n * Checks if vector is not null, undefined, or if any of its components are NaN or Infinity.\n */\n static isValid(vec) {\n if (vec === null || vec === undefined) {\n return false;\n }\n if (isNaN(vec.x) || isNaN(vec.y)) {\n return false;\n }\n if (vec.x === Infinity || vec.y === Infinity || vec.x === -Infinity || vec.y === -Infinity) {\n return false;\n }\n return true;\n }\n /**\n * Calculates distance between two Vectors\n * @param vec1\n * @param vec2\n */\n static distance(vec1, vec2) {\n return Math.sqrt(Math.pow(vec1.x - vec2.x, 2) + Math.pow(vec1.y - vec2.y, 2));\n }\n static min(vec1, vec2) {\n return new Vector(Math.min(vec1.x, vec2.x), Math.min(vec1.y, vec2.y));\n }\n static max(vec1, vec2) {\n return new Vector(Math.max(vec1.x, vec2.x), Math.max(vec1.y, vec2.y));\n }\n /**\n * @param x X component of the Vector\n * @param y Y component of the Vector\n */\n constructor(x, y) {\n this._x = 0;\n this._y = 0;\n this._x = x;\n this._y = y;\n }\n /**\n * Get the x component of the vector\n */\n get x() {\n return this._x;\n }\n /**\n * Set the x component, THIS MUTATES the current vector. It is usually better to create a new vector.\n * @warning **Be very careful setting components on shared vectors, mutating shared vectors can cause hard to find bugs**\n */\n set x(val) {\n this._x = val;\n }\n /**\n * Get the y component of the vector\n */\n get y() {\n return this._y;\n }\n /**\n * Set the y component, THIS MUTATES the current vector. It is usually better to create a new vector.\n * @warning **Be very careful setting components on shared vectors, mutating shared vectors can cause hard to find bugs**\n */\n set y(val) {\n this._y = val;\n }\n /**\n * Sets the x and y components at once, THIS MUTATES the current vector. It is usually better to create a new vector.\n * @warning **Be very careful using this, mutating vectors can cause hard to find bugs**\n */\n setTo(x, y) {\n this.x = x;\n this.y = y;\n }\n /**\n * Compares this point against another and tests for equality\n * @param vector The other point to compare to\n * @param tolerance Amount of euclidean distance off we are willing to tolerate\n */\n equals(vector, tolerance = Vector.EQUALS_EPSILON) {\n return Math.abs(this.x - vector.x) <= tolerance && Math.abs(this.y - vector.y) <= tolerance;\n }\n /**\n * The distance to another vector. If no other Vector is specified, this will return the {@apilink magnitude}.\n * @param v The other vector. Leave blank to use origin vector.\n */\n distance(v) {\n if (!v) {\n return Math.sqrt(this.x * this.x + this.y * this.y);\n }\n const deltaX = this.x - v.x;\n const deltaY = this.y - v.y;\n return Math.sqrt(deltaX * deltaX + deltaY * deltaY);\n }\n squareDistance(v) {\n if (!v) {\n v = Vector.Zero;\n }\n const deltaX = this.x - v.x;\n const deltaY = this.y - v.y;\n return deltaX * deltaX + deltaY * deltaY;\n }\n /**\n * Clamps the current vector's magnitude mutating it\n * @param magnitude\n */\n clampMagnitude(magnitude) {\n const size = this.magnitude;\n const newSize = (0,_util__WEBPACK_IMPORTED_MODULE_0__.clamp)(size, 0, magnitude);\n this.magnitude = newSize;\n return this;\n }\n /**\n * The size (magnitude) of the Vector\n * @deprecated Will be removed in v1, use Vector.magnitude\n */\n get size() {\n return this.distance();\n }\n /**\n * Setting the size mutates the current vector\n * @warning Can be used to set the size of the vector, **be very careful using this, mutating vectors can cause hard to find bugs**\n * @deprecated Will be removed in v1, use Vector.magnitude\n */\n set size(newLength) {\n const v = this.normalize().scale(newLength);\n this.setTo(v.x, v.y);\n }\n /**\n * The magnitude (length) of the Vector\n */\n get magnitude() {\n return this.distance();\n }\n /**\n * Setting the size mutates the current vector\n * @warning Can be used to set the size of the vector, **be very careful using this, mutating vectors can cause hard to find bugs**\n */\n set magnitude(newMagnitude) {\n this.normalize().scale(newMagnitude, this);\n }\n /**\n * Normalizes a non-zero vector to have a magnitude of 1. Zero vectors return a new zero vector.\n */\n normalize() {\n const distance = this.distance();\n if (distance === 0) {\n return Vector.Zero;\n }\n return new Vector(this.x / distance, this.y / distance);\n }\n /**\n * Returns the average (midpoint) between the current point and the specified\n */\n average(vec) {\n return this.add(vec).scale(0.5);\n }\n scale(sizeOrScale, dest) {\n const result = dest || new Vector(0, 0);\n if (sizeOrScale instanceof Vector) {\n result.x = this.x * sizeOrScale.x;\n result.y = this.y * sizeOrScale.y;\n }\n else {\n result.x = this.x * sizeOrScale;\n result.y = this.y * sizeOrScale;\n }\n return result;\n }\n /**\n * Adds one vector to another\n * @param v The vector to add\n * @param dest Optionally copy the result into a provided vector\n */\n add(v, dest) {\n if (dest) {\n dest.x = this.x + v.x;\n dest.y = this.y + v.y;\n return dest;\n }\n return new Vector(this.x + v.x, this.y + v.y);\n }\n /**\n * Subtracts a vector from another, if you subtract vector `B.sub(A)` the resulting vector points from A -> B\n * @param v The vector to subtract\n */\n sub(v, dest) {\n const result = dest || new Vector(0, 0);\n const x = this.x - v.x;\n const y = this.y - v.y;\n result.x = x;\n result.y = y;\n return result;\n }\n /**\n * Adds one vector to this one modifying the original\n * @param v The vector to add\n * @warning Be very careful using this, mutating vectors can cause hard to find bugs\n */\n addEqual(v) {\n this.setTo(this.x + v.x, this.y + v.y);\n return this;\n }\n /**\n * Subtracts a vector from this one modifying the original\n * @param v The vector to subtract\n * @warning Be very careful using this, mutating vectors can cause hard to find bugs\n */\n subEqual(v) {\n this.setTo(this.x - v.x, this.y - v.y);\n return this;\n }\n /**\n * Scales this vector by a factor of size and modifies the original\n * @warning Be very careful using this, mutating vectors can cause hard to find bugs\n */\n scaleEqual(size) {\n this.setTo(this.x * size, this.y * size);\n return this;\n }\n /**\n * Performs a dot product with another vector\n * @param v The vector to dot\n */\n dot(v) {\n return this.x * v.x + this.y * v.y;\n }\n cross(v) {\n if (v instanceof Vector) {\n return this.x * v.y - this.y * v.x;\n }\n else if (typeof v === 'number') {\n return new Vector(v * this.y, -v * this.x);\n }\n }\n static cross(num, vec) {\n return new Vector(-num * vec.y, num * vec.x);\n }\n /**\n * Returns the perpendicular vector to this one\n */\n perpendicular() {\n return new Vector(this.y, -this.x);\n }\n /**\n * Returns the normal vector to this one, same as the perpendicular of length 1\n */\n normal() {\n return this.perpendicular().normalize();\n }\n /**\n * Negate the current vector\n */\n negate() {\n return this.scale(-1);\n }\n /**\n * Returns the angle of this vector, in range [0, 2*PI)\n */\n toAngle() {\n return (0,_util__WEBPACK_IMPORTED_MODULE_0__.canonicalizeAngle)(Math.atan2(this.y, this.x));\n }\n /**\n * Returns the difference in radians between the angle of this vector and given angle,\n * using the given rotation type.\n * @param angle in radians to which the vector has to be rotated, using {@apilink rotate}\n * @param rotationType what {@apilink RotationType} to use for the rotation\n * @returns the angle by which the vector needs to be rotated to match the given angle\n */\n angleBetween(angle, rotationType) {\n const startAngleRadians = this.toAngle();\n const endAngleRadians = (0,_util__WEBPACK_IMPORTED_MODULE_0__.canonicalizeAngle)(angle);\n let rotationClockwise = 0;\n let rotationAntiClockwise = 0;\n if (endAngleRadians > startAngleRadians) {\n rotationClockwise = endAngleRadians - startAngleRadians;\n }\n else {\n rotationClockwise = (_util__WEBPACK_IMPORTED_MODULE_0__.TwoPI - startAngleRadians + endAngleRadians) % _util__WEBPACK_IMPORTED_MODULE_0__.TwoPI;\n }\n rotationAntiClockwise = (rotationClockwise - _util__WEBPACK_IMPORTED_MODULE_0__.TwoPI) % _util__WEBPACK_IMPORTED_MODULE_0__.TwoPI;\n switch (rotationType) {\n case _rotation_type__WEBPACK_IMPORTED_MODULE_1__.RotationType.ShortestPath:\n if (Math.abs(rotationClockwise) < Math.abs(rotationAntiClockwise)) {\n return rotationClockwise;\n }\n else {\n return rotationAntiClockwise;\n }\n case _rotation_type__WEBPACK_IMPORTED_MODULE_1__.RotationType.LongestPath:\n if (Math.abs(rotationClockwise) > Math.abs(rotationAntiClockwise)) {\n return rotationClockwise;\n }\n else {\n return rotationAntiClockwise;\n }\n case _rotation_type__WEBPACK_IMPORTED_MODULE_1__.RotationType.Clockwise:\n return rotationClockwise;\n case _rotation_type__WEBPACK_IMPORTED_MODULE_1__.RotationType.CounterClockwise:\n return rotationAntiClockwise;\n }\n }\n /**\n * Rotates the current vector around a point by a certain angle in radians.\n * Positive angle means rotation clockwise.\n */\n rotate(angle, anchor, dest) {\n const result = dest || new Vector(0, 0);\n if (!anchor) {\n anchor = new Vector(0, 0);\n }\n const sinAngle = Math.sin(angle);\n const cosAngle = Math.cos(angle);\n const x = cosAngle * (this.x - anchor.x) - sinAngle * (this.y - anchor.y) + anchor.x;\n const y = sinAngle * (this.x - anchor.x) + cosAngle * (this.y - anchor.y) + anchor.y;\n result.x = x;\n result.y = y;\n return result;\n }\n /**\n * Creates new vector that has the same values as the previous.\n */\n clone(dest) {\n const v = dest !== null && dest !== void 0 ? dest : new Vector(0, 0);\n v.x = this.x;\n v.y = this.y;\n return v;\n }\n /**\n * Returns a string representation of the vector.\n */\n toString(fixed) {\n if (fixed) {\n return `(${this.x.toFixed(fixed)}, ${this.y.toFixed(fixed)})`;\n }\n return `(${this.x}, ${this.y})`;\n }\n}\n/**\n * Get or set the vector equals epsilon, by default 0.001 meaning vectors within that tolerance on x or y will be considered equal.\n */\nVector.EQUALS_EPSILON = 0.001;\n/**\n * Shorthand for creating new Vectors - returns a new Vector instance with the\n * provided X and Y components.\n * @param x X component of the Vector\n * @param y Y component of the Vector\n */\nfunction vec(x, y) {\n return new Vector(x, y);\n}\n\n\n/***/ }),\n\n/***/ \"./Math/watch-vector.ts\":\n/*!******************************!*\\\n !*** ./Math/watch-vector.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ WatchVector: () => (/* binding */ WatchVector)\n/* harmony export */ });\n/* harmony import */ var _vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vector */ \"./Math/vector.ts\");\n\n/**\n * Wraps a vector and watches for changes in the x/y, modifies the original vector.\n */\nclass WatchVector extends _vector__WEBPACK_IMPORTED_MODULE_0__.Vector {\n constructor(original, change) {\n super(original.x, original.y);\n this.original = original;\n this.change = change;\n }\n get x() {\n return (this._x = this.original.x);\n }\n set x(newX) {\n if (newX !== this._x) {\n this.change(newX, this._y);\n this._x = this.original.x = newX;\n }\n }\n get y() {\n return (this._y = this.original.y);\n }\n set y(newY) {\n if (newY !== this._y) {\n this.change(this._x, newY);\n this._y = this.original.y = newY;\n }\n }\n setTo(x, y) {\n this.x = x;\n this.y = y;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Particles/EmitterType.ts\":\n/*!**********************************!*\\\n !*** ./Particles/EmitterType.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EmitterType: () => (/* binding */ EmitterType)\n/* harmony export */ });\n/**\n * An enum that represents the types of emitter nozzles\n */\nvar EmitterType;\n(function (EmitterType) {\n /**\n * Constant for the circular emitter type\n */\n EmitterType[\"Circle\"] = \"circle\";\n /**\n * Constant for the rectangular emitter type\n */\n EmitterType[\"Rectangle\"] = \"rectangle\";\n})(EmitterType || (EmitterType = {}));\n\n\n/***/ }),\n\n/***/ \"./Particles/GpuParticleEmitter.ts\":\n/*!*****************************************!*\\\n !*** ./Particles/GpuParticleEmitter.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ GpuParticleEmitter: () => (/* binding */ GpuParticleEmitter)\n/* harmony export */ });\n/* harmony import */ var _Actor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Actor */ \"./Actor.ts\");\n/* harmony import */ var _EmitterType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./EmitterType */ \"./Particles/EmitterType.ts\");\n/* harmony import */ var _Particles__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Particles */ \"./Particles/Particles.ts\");\n/* harmony import */ var _GpuParticleRenderer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./GpuParticleRenderer */ \"./Particles/GpuParticleRenderer.ts\");\n/* harmony import */ var _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Graphics/GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Math_Random__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Math/Random */ \"./Math/Random.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Math */ \"./Math/util.ts\");\n\n\n\n\n\n\n\n\nclass GpuParticleEmitter extends _Actor__WEBPACK_IMPORTED_MODULE_0__.Actor {\n get pos() {\n return this.transform.pos;\n }\n set pos(pos) {\n this.transform.pos = pos;\n }\n get z() {\n return this.transform.z;\n }\n set z(z) {\n this.transform.z = z;\n }\n constructor(config) {\n super({ name: `GpuParticleEmitter`, width: config.width, height: config.height }); // somewhat goofy way of doing width/height\n this.particle = {\n /**\n * Gets or sets the life of each particle in milliseconds\n */\n life: 2000,\n transform: _Particles__WEBPACK_IMPORTED_MODULE_1__.ParticleTransform.Global,\n graphic: undefined,\n opacity: 1,\n angularVelocity: 0,\n focus: undefined,\n focusAccel: undefined,\n randomRotation: false\n };\n this.graphics = new _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_2__.GraphicsComponent();\n this.isEmitting = false;\n this.emitRate = 1;\n this.emitterType = _EmitterType__WEBPACK_IMPORTED_MODULE_3__.EmitterType.Rectangle;\n this.radius = 0;\n this.maxParticles = 2000;\n this._particlesToEmit = 0;\n this.addComponent(this.graphics, true);\n this.graphics.onPostDraw = this.draw.bind(this);\n const { particle, maxParticles, x, y, z, pos, isEmitting, emitRate, emitterType, radius, random } = { ...config };\n this.maxParticles = (0,_Math__WEBPACK_IMPORTED_MODULE_4__.clamp)(maxParticles !== null && maxParticles !== void 0 ? maxParticles : this.maxParticles, 0, _GpuParticleRenderer__WEBPACK_IMPORTED_MODULE_5__.GpuParticleRenderer.GPU_MAX_PARTICLES);\n this.pos = pos !== null && pos !== void 0 ? pos : (0,_Math_vector__WEBPACK_IMPORTED_MODULE_6__.vec)(x !== null && x !== void 0 ? x : 0, y !== null && y !== void 0 ? y : 0);\n this.z = z !== null && z !== void 0 ? z : 0;\n this.isEmitting = isEmitting !== null && isEmitting !== void 0 ? isEmitting : this.isEmitting;\n this.emitRate = emitRate !== null && emitRate !== void 0 ? emitRate : this.emitRate;\n this.emitterType = emitterType !== null && emitterType !== void 0 ? emitterType : this.emitterType;\n this.radius = radius !== null && radius !== void 0 ? radius : this.radius;\n this.particle = { ...this.particle, ...particle };\n this.random = random !== null && random !== void 0 ? random : new _Math_Random__WEBPACK_IMPORTED_MODULE_7__.Random();\n this.renderer = new _GpuParticleRenderer__WEBPACK_IMPORTED_MODULE_5__.GpuParticleRenderer(this, this.random, this.particle);\n }\n _initialize(engine) {\n super._initialize(engine);\n const context = engine.graphicsContext;\n this.renderer.initialize(context.__gl, context);\n }\n update(engine, elapsed) {\n super.update(engine, elapsed);\n if (this.isEmitting) {\n this._particlesToEmit += this.emitRate * (elapsed / 1000);\n if (this._particlesToEmit > 1.0) {\n this.emitParticles(Math.floor(this._particlesToEmit));\n this._particlesToEmit = this._particlesToEmit - Math.floor(this._particlesToEmit);\n }\n }\n this.renderer.update(elapsed);\n }\n emitParticles(particleCount) {\n if (particleCount <= 0) {\n return;\n }\n this.renderer.emitParticles(particleCount | 0); // coerce to integer\n }\n clearParticles() {\n this.renderer.clearParticles();\n }\n draw(ctx, elapsed) {\n ctx.draw('ex.particle', this.renderer, elapsed);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Particles/GpuParticleRenderer.ts\":\n/*!******************************************!*\\\n !*** ./Particles/GpuParticleRenderer.ts ***!\n \\******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ GpuParticleRenderer: () => (/* binding */ GpuParticleRenderer)\n/* harmony export */ });\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Particles__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Particles */ \"./Particles/Particles.ts\");\n/* harmony import */ var _EmitterType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./EmitterType */ \"./Particles/EmitterType.ts\");\n/* harmony import */ var _Util_Assert__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Util/Assert */ \"./Util/Assert.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n\n\n\n\n\n/**\n * Container for the GPU Particle State contains the internal state needed for the GPU\n * to render particles and maintain state.\n */\nclass GpuParticleRenderer {\n constructor(emitter, random, options) {\n var _a;\n this.emitRate = 1;\n this._initialized = false;\n this._vaos = [];\n this._buffers = [];\n this._drawIndex = 0;\n this._numInputFloats = 2 + 2 + 1 + 1 + 1;\n this._particleIndex = 0;\n this._uploadIndex = 0;\n this._wrappedLife = 0;\n this._wrappedParticles = 0;\n this._particleLife = 0;\n this._clearRequested = false;\n this._emitted = [];\n this.emitter = emitter;\n this.particle = options;\n this._particleData = new Float32Array(this.emitter.maxParticles * this._numInputFloats);\n this._random = random;\n this._particleLife = (_a = this.particle.life) !== null && _a !== void 0 ? _a : 2000;\n }\n get isInitialized() {\n return this._initialized;\n }\n get maxParticles() {\n return this.emitter.maxParticles;\n }\n initialize(gl, context) {\n if (this._initialized) {\n return;\n }\n const numParticles = this.emitter.maxParticles;\n const numInputFloats = this._numInputFloats;\n const particleData = this._particleData;\n const bytesPerFloat = 4;\n const particleDataBuffer1 = gl.createBuffer();\n const vao1 = gl.createVertexArray();\n gl.bindVertexArray(vao1);\n gl.bindBuffer(gl.ARRAY_BUFFER, particleDataBuffer1);\n gl.bufferData(gl.ARRAY_BUFFER, numParticles * numInputFloats * bytesPerFloat, gl.DYNAMIC_DRAW);\n gl.bufferSubData(gl.ARRAY_BUFFER, 0, particleData);\n let offset = 0;\n // position\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, numInputFloats * bytesPerFloat, 0);\n offset += bytesPerFloat * 2;\n // velocity\n gl.vertexAttribPointer(1, 2, gl.FLOAT, false, numInputFloats * bytesPerFloat, offset);\n offset += bytesPerFloat * 2;\n // rotation\n gl.vertexAttribPointer(2, 1, gl.FLOAT, false, numInputFloats * bytesPerFloat, offset);\n offset += bytesPerFloat * 1;\n // angularVelocity\n gl.vertexAttribPointer(3, 1, gl.FLOAT, false, numInputFloats * bytesPerFloat, offset);\n offset += bytesPerFloat * 1;\n // life\n gl.vertexAttribPointer(4, 1, gl.FLOAT, false, numInputFloats * bytesPerFloat, offset);\n offset += bytesPerFloat * 1;\n // enable attributes\n gl.enableVertexAttribArray(0);\n gl.enableVertexAttribArray(1);\n gl.enableVertexAttribArray(2);\n gl.enableVertexAttribArray(3);\n gl.enableVertexAttribArray(4);\n this._vaos.push(vao1);\n this._buffers.push(particleDataBuffer1);\n // Clean up\n gl.bindVertexArray(null);\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n const particleDataBuffer2 = gl.createBuffer();\n const vao2 = gl.createVertexArray();\n gl.bindVertexArray(vao2);\n gl.bindBuffer(gl.ARRAY_BUFFER, particleDataBuffer2);\n gl.bufferData(gl.ARRAY_BUFFER, numParticles * numInputFloats * bytesPerFloat, gl.DYNAMIC_DRAW);\n offset = 0;\n // position\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, numInputFloats * bytesPerFloat, 0);\n offset += bytesPerFloat * 2;\n // velocity\n gl.vertexAttribPointer(1, 2, gl.FLOAT, false, numInputFloats * bytesPerFloat, offset);\n offset += bytesPerFloat * 2;\n // rotation\n gl.vertexAttribPointer(2, 1, gl.FLOAT, false, numInputFloats * bytesPerFloat, offset);\n offset += bytesPerFloat * 1;\n // angularVelocity\n gl.vertexAttribPointer(3, 1, gl.FLOAT, false, numInputFloats * bytesPerFloat, offset);\n offset += bytesPerFloat * 1;\n // life\n gl.vertexAttribPointer(4, 1, gl.FLOAT, false, numInputFloats * bytesPerFloat, offset);\n offset += bytesPerFloat * 1;\n // enable attributes\n gl.enableVertexAttribArray(0);\n gl.enableVertexAttribArray(1);\n gl.enableVertexAttribArray(2);\n gl.enableVertexAttribArray(3);\n gl.enableVertexAttribArray(4);\n this._vaos.push(vao2);\n this._buffers.push(particleDataBuffer2);\n // Clean up\n gl.bindVertexArray(null);\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n this._currentVao = this._vaos[this._drawIndex % 2];\n this._currentBuffer = this._buffers[(this._drawIndex + 1) % 2];\n this._initialized = true;\n }\n clearParticles() {\n this._particleData.fill(0);\n this._clearRequested = true;\n }\n emitParticles(particleCount) {\n const startIndex = this._particleIndex;\n const maxSize = this.maxParticles * this._numInputFloats;\n const endIndex = particleCount * this._numInputFloats + startIndex;\n let countParticle = 0;\n for (let i = startIndex; i < endIndex; i += this._numInputFloats) {\n const angle = this._random.floating(this.particle.minAngle || 0, this.particle.maxAngle || _Math_util__WEBPACK_IMPORTED_MODULE_0__.TwoPI);\n const speedX = this._random.floating(this.particle.minSpeed || 0, this.particle.maxSpeed || 0);\n const speedY = this._random.floating(this.particle.minSpeed || 0, this.particle.maxSpeed || 0);\n const dx = speedX * Math.cos(angle);\n const dy = speedY * Math.sin(angle);\n let ranX = 0;\n let ranY = 0;\n if (this.emitter.emitterType === _EmitterType__WEBPACK_IMPORTED_MODULE_1__.EmitterType.Rectangle) {\n ranX = this._random.floating(-0.5, 0.5) * this.emitter.width;\n ranY = this._random.floating(-0.5, 0.5) * this.emitter.height;\n }\n else {\n const radius = this._random.floating(0, this.emitter.radius);\n ranX = radius * Math.cos(angle);\n ranY = radius * Math.sin(angle);\n }\n const tx = this.emitter.transform.apply((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(ranX, ranY));\n const data = [\n this.particle.transform === _Particles__WEBPACK_IMPORTED_MODULE_3__.ParticleTransform.Local ? ranX : tx.x,\n this.particle.transform === _Particles__WEBPACK_IMPORTED_MODULE_3__.ParticleTransform.Local ? ranY : tx.y, // pos in world space\n dx,\n dy, // velocity\n this.particle.randomRotation ? (0,_Math_util__WEBPACK_IMPORTED_MODULE_0__.randomInRange)(0, _Math_util__WEBPACK_IMPORTED_MODULE_0__.TwoPI, this._random) : this.particle.rotation || 0, // rotation\n this.particle.angularVelocity || 0, // angular velocity\n this._particleLife // life\n ];\n countParticle++;\n this._particleData.set(data, i % this._particleData.length);\n }\n if (endIndex >= maxSize) {\n this._wrappedParticles += (endIndex - maxSize) / this._numInputFloats;\n this._wrappedLife = this._particleLife;\n }\n else if (this._wrappedLife > 0) {\n this._wrappedParticles += particleCount;\n }\n this._particleIndex = endIndex % maxSize;\n this._emitted.push([this._particleLife, startIndex]);\n }\n _uploadEmitted(gl) {\n // upload index is the index of the previous upload\n // particle index is the current index of modification\n if (this._particleIndex !== this._uploadIndex) {\n // Bind one buffer to ARRAY_BUFFER and the other to TFB\n gl.bindBuffer(gl.ARRAY_BUFFER, this._buffers[(this._drawIndex + 1) % 2]);\n if (this._particleIndex >= this._uploadIndex) {\n gl.bufferSubData(gl.ARRAY_BUFFER, this._uploadIndex * 4, // dst byte offset 4 bytes per float\n this._particleData, this._uploadIndex, this._particleIndex - this._uploadIndex);\n }\n else {\n // upload before the wrap\n // prettier-ignore\n gl.bufferSubData(gl.ARRAY_BUFFER, this._uploadIndex * 4, this._particleData, this._uploadIndex, this._particleData.length - this._uploadIndex);\n // upload after the wrap if there are any\n if (this._wrappedParticles) {\n // prettier-ignore\n gl.bufferSubData(gl.ARRAY_BUFFER, 0, this._particleData, 0, this._wrappedParticles * this._numInputFloats);\n }\n this._wrappedLife = this._particleLife;\n }\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n }\n this._uploadIndex = this._particleIndex % (this.maxParticles * this._numInputFloats);\n }\n update(elapsed) {\n var _a;\n this._particleLife = (_a = this.particle.life) !== null && _a !== void 0 ? _a : this._particleLife;\n if (this._wrappedLife > 0) {\n this._wrappedLife -= elapsed;\n }\n else {\n this._wrappedLife = 0;\n this._wrappedParticles = 0;\n }\n if (!this._emitted.length) {\n return;\n }\n for (let i = this._emitted.length - 1; i >= 0; i--) {\n const particle = this._emitted[i];\n particle[0] -= elapsed;\n const life = particle[0];\n if (life <= 0) {\n this._emitted.splice(i, 1);\n }\n }\n this._emitted.sort((a, b) => a[0] - b[0]);\n }\n draw(gl) {\n if (this._initialized) {\n // Emit\n if (this._clearRequested) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this._buffers[(this._drawIndex + 1) % 2]);\n gl.bufferSubData(gl.ARRAY_BUFFER, 0, this._particleData);\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n this._clearRequested = false;\n }\n else {\n this._uploadEmitted(gl);\n }\n // Bind one buffer to ARRAY_BUFFER and the other to transform feedback buffer\n gl.bindVertexArray(this._currentVao);\n gl.bindBufferBase(gl.TRANSFORM_FEEDBACK_BUFFER, 0, this._currentBuffer);\n // Perform transform feedback (run the simulation) and the draw call all at once\n if (this._wrappedLife && this._emitted[0] && this._emitted[0][1] > 0) {\n const midpoint = this._emitted[0][1] / this._numInputFloats;\n // draw oldest first (maybe make configurable)\n (0,_Util_Assert__WEBPACK_IMPORTED_MODULE_4__.assert)(`midpoint greater than 0, actual: ${midpoint}`, () => midpoint > 0);\n (0,_Util_Assert__WEBPACK_IMPORTED_MODULE_4__.assert)(`midpoint is less than max, actual: ${midpoint}`, () => midpoint < this.maxParticles);\n gl.bindBufferRange(gl.TRANSFORM_FEEDBACK_BUFFER, 0, this._currentBuffer, this._emitted[0][1] * 4, (this.maxParticles - midpoint) * this._numInputFloats * 4);\n gl.beginTransformFeedback(gl.POINTS);\n gl.drawArrays(gl.POINTS, midpoint, this.maxParticles - midpoint);\n gl.endTransformFeedback();\n // then draw newer particles\n gl.bindBufferRange(gl.TRANSFORM_FEEDBACK_BUFFER, 0, this._currentBuffer, 0, this._emitted[0][1] * 4);\n gl.beginTransformFeedback(gl.POINTS);\n gl.drawArrays(gl.POINTS, 0, midpoint);\n gl.endTransformFeedback();\n }\n else {\n gl.bindBufferRange(gl.TRANSFORM_FEEDBACK_BUFFER, 0, this._currentBuffer, 0, this._particleData.length * 4);\n gl.beginTransformFeedback(gl.POINTS);\n gl.drawArrays(gl.POINTS, 0, this.maxParticles);\n gl.endTransformFeedback();\n }\n // Clean up after ourselves to avoid errors.\n gl.bindVertexArray(null);\n gl.bindBufferBase(gl.TRANSFORM_FEEDBACK_BUFFER, 0, null);\n // flip flop buffers, one will be draw the other simulation\n this._currentVao = this._vaos[this._drawIndex % 2];\n this._currentBuffer = this._buffers[(this._drawIndex + 1) % 2];\n this._drawIndex = (this._drawIndex + 1) % 2;\n }\n }\n}\nGpuParticleRenderer.GPU_MAX_PARTICLES = 100000;\n\n\n/***/ }),\n\n/***/ \"./Particles/ParticleEmitter.ts\":\n/*!**************************************!*\\\n !*** ./Particles/ParticleEmitter.ts ***!\n \\**************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ParticleEmitter: () => (/* binding */ ParticleEmitter)\n/* harmony export */ });\n/* harmony import */ var _Actor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Actor */ \"./Actor.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math_Random__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Math/Random */ \"./Math/Random.ts\");\n/* harmony import */ var _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Collision/CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _EmitterType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./EmitterType */ \"./Particles/EmitterType.ts\");\n/* harmony import */ var _Particles__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Particles */ \"./Particles/Particles.ts\");\n/* harmony import */ var _Util_RentalPool__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/RentalPool */ \"./Util/RentalPool.ts\");\n\n\n\n\n\n\n\n\n/**\n * Using a particle emitter is a great way to create interesting effects\n * in your game, like smoke, fire, water, explosions, etc. `ParticleEmitter`\n * extend {@apilink Actor} allowing you to use all of the features that come with.\n *\n * These particles are simulated on the CPU in JavaScript\n */\nclass ParticleEmitter extends _Actor__WEBPACK_IMPORTED_MODULE_0__.Actor {\n /**\n * @param config particle emitter options bag\n */\n constructor(config) {\n var _a, _b;\n super({ width: (_a = config.width) !== null && _a !== void 0 ? _a : 0, height: (_b = config.height) !== null && _b !== void 0 ? _b : 0 });\n this._particlesToEmit = 0;\n this._particlePool = new _Util_RentalPool__WEBPACK_IMPORTED_MODULE_1__.RentalPool(() => new _Particles__WEBPACK_IMPORTED_MODULE_2__.Particle({}), (p) => p, 500);\n this.numParticles = 0;\n /**\n * Gets or sets the isEmitting flag\n */\n this.isEmitting = true;\n /**\n * Gets or sets the backing deadParticle collection\n */\n this.deadParticles = [];\n /**\n * Gets or sets the emission rate for particles (particles/sec)\n */\n this.emitRate = 1; //particles/sec\n /**\n * Gets or sets the emitter type for the particle emitter\n */\n this.emitterType = _EmitterType__WEBPACK_IMPORTED_MODULE_3__.EmitterType.Rectangle;\n /**\n * Gets or sets the emitter radius, only takes effect when the {@apilink emitterType} is {@apilink EmitterType.Circle}\n */\n this.radius = 0;\n this.particle = {\n /**\n * Gets or sets the life of each particle in milliseconds\n */\n life: 2000,\n transform: _Particles__WEBPACK_IMPORTED_MODULE_2__.ParticleTransform.Global,\n graphic: undefined,\n opacity: 1,\n angularVelocity: 0,\n focus: undefined,\n focusAccel: undefined,\n randomRotation: false\n };\n this._activeParticles = [];\n const { particle, x, y, z, pos, isEmitting, emitRate, emitterType, radius, random } = { ...config };\n this.particle = { ...this.particle, ...particle };\n this.pos = pos !== null && pos !== void 0 ? pos : (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(x !== null && x !== void 0 ? x : 0, y !== null && y !== void 0 ? y : 0);\n this.z = z !== null && z !== void 0 ? z : 0;\n this.isEmitting = isEmitting !== null && isEmitting !== void 0 ? isEmitting : this.isEmitting;\n this.emitRate = emitRate !== null && emitRate !== void 0 ? emitRate : this.emitRate;\n this.emitterType = emitterType !== null && emitterType !== void 0 ? emitterType : this.emitterType;\n this.radius = radius !== null && radius !== void 0 ? radius : this.radius;\n this.body.collisionType = _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_5__.CollisionType.PreventCollision;\n this.random = random !== null && random !== void 0 ? random : new _Math_Random__WEBPACK_IMPORTED_MODULE_6__.Random();\n }\n removeParticle(particle) {\n this.deadParticles.push(particle);\n }\n /**\n * Causes the emitter to emit particles\n * @param particleCount Number of particles to emit right now\n */\n emitParticles(particleCount) {\n var _a;\n if (particleCount <= 0) {\n return;\n }\n particleCount = particleCount | 0; // coerce to int\n for (let i = 0; i < particleCount; i++) {\n const p = this._createParticle();\n if ((_a = this === null || this === void 0 ? void 0 : this.scene) === null || _a === void 0 ? void 0 : _a.world) {\n if (this.particle.transform === _Particles__WEBPACK_IMPORTED_MODULE_2__.ParticleTransform.Global) {\n this.scene.world.add(p);\n }\n else {\n this.addChild(p);\n }\n }\n this._activeParticles.push(p);\n }\n }\n clearParticles() {\n for (let i = 0; i < this._activeParticles.length; i++) {\n this.removeParticle(this._activeParticles[i]);\n }\n }\n // Creates a new particle given the constraints of the emitter\n _createParticle() {\n let ranX = 0;\n let ranY = 0;\n const angle = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.randomInRange)(this.particle.minAngle || 0, this.particle.maxAngle || Math.PI * 2, this.random);\n const vel = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.randomInRange)(this.particle.minSpeed || 0, this.particle.maxSpeed || 0, this.random);\n const size = this.particle.startSize || (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.randomInRange)(this.particle.minSize || 5, this.particle.maxSize || 5, this.random);\n const dx = vel * Math.cos(angle);\n const dy = vel * Math.sin(angle);\n if (this.emitterType === _EmitterType__WEBPACK_IMPORTED_MODULE_3__.EmitterType.Rectangle) {\n ranX = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.randomInRange)(0, this.width, this.random);\n ranY = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.randomInRange)(0, this.height, this.random);\n }\n else if (this.emitterType === _EmitterType__WEBPACK_IMPORTED_MODULE_3__.EmitterType.Circle) {\n const radius = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.randomInRange)(0, this.radius, this.random);\n ranX = radius * Math.cos(angle);\n ranY = radius * Math.sin(angle);\n }\n const p = this._particlePool.rent();\n p.configure({\n life: this.particle.life,\n opacity: this.particle.opacity,\n beginColor: this.particle.beginColor,\n endColor: this.particle.endColor,\n pos: (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(ranX, ranY),\n vel: (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(dx, dy),\n acc: this.particle.acc,\n angularVelocity: this.particle.angularVelocity,\n startSize: this.particle.startSize,\n endSize: this.particle.endSize,\n size: size,\n graphic: this.particle.graphic,\n fade: this.particle.fade\n });\n p.registerEmitter(this);\n if (this.particle.randomRotation) {\n p.transform.rotation = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.randomInRange)(0, Math.PI * 2, this.random);\n }\n if (this.particle.focus) {\n p.focus = this.particle.focus.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(this.pos.x, this.pos.y));\n p.focusAccel = this.particle.focusAccel;\n }\n return p;\n }\n update(engine, elapsed) {\n var _a;\n super.update(engine, elapsed);\n if (this.isEmitting) {\n this._particlesToEmit += this.emitRate * (elapsed / 1000);\n if (this._particlesToEmit > 1.0) {\n this.emitParticles(Math.floor(this._particlesToEmit));\n this._particlesToEmit = this._particlesToEmit - Math.floor(this._particlesToEmit);\n }\n }\n // deferred removal\n for (let i = 0; i < this.deadParticles.length; i++) {\n if ((_a = this === null || this === void 0 ? void 0 : this.scene) === null || _a === void 0 ? void 0 : _a.world) {\n this.scene.world.remove(this.deadParticles[i], false);\n this._particlePool.return(this.deadParticles[i]);\n }\n const index = this._activeParticles.indexOf(this.deadParticles[i]);\n if (index > -1) {\n this._activeParticles.splice(index, 1);\n }\n }\n this.deadParticles.length = 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Particles/Particles.ts\":\n/*!********************************!*\\\n !*** ./Particles/Particles.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Particle: () => (/* binding */ Particle),\n/* harmony export */ ParticleTransform: () => (/* binding */ ParticleTransform)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Graphics/GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _Collision_Integrator__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Collision/Integrator */ \"./Collision/Integrator.ts\");\n\n\n\n\n\n\n\n\n\n/**\n/**\n * CPU Particle is used in a {@apilink ParticleEmitter}\n */\nclass Particle extends _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__.Entity {\n constructor(options) {\n super({ silenceWarnings: true });\n this.beginColor = _Color__WEBPACK_IMPORTED_MODULE_1__.Color.White;\n this.endColor = _Color__WEBPACK_IMPORTED_MODULE_1__.Color.White;\n // Life is counted in ms\n this.life = 300;\n this.fade = false;\n // Color transitions\n this._rRate = 1;\n this._gRate = 1;\n this._bRate = 1;\n this._aRate = 0;\n this._currentColor = _Color__WEBPACK_IMPORTED_MODULE_1__.Color.White;\n this.size = 5;\n this.sizeRate = 0;\n this.visible = true;\n this.isOffscreen = false;\n this.particleTransform = ParticleTransform.Global;\n this.name = `Particle#${this.id}`;\n this.addComponent((this.transform = new _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent()));\n this.addComponent((this.motion = new _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_3__.MotionComponent()));\n this.addComponent((this.graphics = new _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_4__.GraphicsComponent()));\n this.configure(options);\n }\n registerEmitter(emitter) {\n this._emitter = emitter;\n if (this.particleTransform === ParticleTransform.Global) {\n const globalPos = this._emitter.transform.globalPos;\n this.transform.pos = this.transform.pos.add(globalPos);\n this.motion.vel = this.motion.vel.rotate(this._emitter.transform.globalRotation);\n }\n }\n configure(options) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;\n this.particleTransform = (_a = options.transform) !== null && _a !== void 0 ? _a : this.particleTransform;\n this.life = (_b = options.life) !== null && _b !== void 0 ? _b : this.life;\n this.fade = (_c = options.fade) !== null && _c !== void 0 ? _c : this.fade;\n this.size = (_d = options.size) !== null && _d !== void 0 ? _d : this.size;\n this.endColor = (_e = options.endColor) !== null && _e !== void 0 ? _e : this.endColor.clone();\n this.beginColor = (_f = options.beginColor) !== null && _f !== void 0 ? _f : this.beginColor.clone();\n this._currentColor = this.beginColor.clone();\n this.graphic = options.graphic;\n this.graphics.opacity = (_g = options.opacity) !== null && _g !== void 0 ? _g : this.graphics.opacity;\n this.transform.pos = (_h = options.pos) !== null && _h !== void 0 ? _h : this.transform.pos;\n this.transform.rotation = (_j = options.rotation) !== null && _j !== void 0 ? _j : 0;\n this.transform.scale = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_5__.vec)(1, 1);\n this.motion.vel = (_k = options.vel) !== null && _k !== void 0 ? _k : this.motion.vel;\n this.motion.angularVelocity = (_l = options.angularVelocity) !== null && _l !== void 0 ? _l : 0;\n this.motion.acc = (_m = options.acc) !== null && _m !== void 0 ? _m : this.motion.acc;\n this._rRate = (this.endColor.r - this.beginColor.r) / this.life;\n this._gRate = (this.endColor.g - this.beginColor.g) / this.life;\n this._bRate = (this.endColor.b - this.beginColor.b) / this.life;\n this._aRate = this.graphics.opacity / this.life;\n this.startSize = (_o = options.startSize) !== null && _o !== void 0 ? _o : 0;\n this.endSize = (_p = options.endSize) !== null && _p !== void 0 ? _p : 0;\n if (this.endSize > 0 && this.startSize > 0) {\n this.sizeRate = (this.endSize - this.startSize) / this.life;\n this.size = this.startSize;\n }\n if (this.graphic) {\n this.graphics.use(this.graphic);\n this.graphics.onPostDraw = undefined;\n }\n else {\n this.graphics.localBounds = _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox.fromDimension(this.size, this.size, _Math_vector__WEBPACK_IMPORTED_MODULE_5__.Vector.Half);\n this.graphics.onPostDraw = (ctx) => {\n ctx.save();\n ctx.debug.drawPoint((0,_Math_vector__WEBPACK_IMPORTED_MODULE_5__.vec)(0, 0), { color: this._currentColor, size: this.size });\n ctx.restore();\n };\n }\n }\n kill() {\n var _a;\n if ((_a = this._emitter) === null || _a === void 0 ? void 0 : _a.isActive) {\n this._emitter.removeParticle(this);\n }\n else {\n super.kill();\n }\n }\n update(engine, elapsed) {\n this.life = this.life - elapsed;\n if (this.life < 0) {\n this.kill();\n }\n if (this.fade) {\n this.graphics.opacity = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.clamp)(this._aRate * this.life, 0.0001, 1);\n }\n if (this.startSize && this.endSize && this.startSize > 0 && this.endSize > 0) {\n this.size = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.clamp)(this.sizeRate * elapsed + this.size, Math.min(this.startSize, this.endSize), Math.max(this.startSize, this.endSize));\n }\n this._currentColor.r = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.clamp)(this._currentColor.r + this._rRate * elapsed, 0, 255);\n this._currentColor.g = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.clamp)(this._currentColor.g + this._gRate * elapsed, 0, 255);\n this._currentColor.b = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.clamp)(this._currentColor.b + this._bRate * elapsed, 0, 255);\n this._currentColor.a = this.graphics.opacity;\n let accel = this.motion.acc;\n if (this.focus) {\n accel = this.focus\n .sub(this.transform.pos)\n .normalize()\n .scale(this.focusAccel || 0)\n .scale(elapsed / 1000);\n }\n // Update transform and motion based on Euler linear algebra\n _Collision_Integrator__WEBPACK_IMPORTED_MODULE_8__.EulerIntegrator.integrate(this.transform, this.motion, accel, elapsed);\n }\n}\nParticle.DefaultConfig = {\n beginColor: _Color__WEBPACK_IMPORTED_MODULE_1__.Color.White,\n endColor: _Color__WEBPACK_IMPORTED_MODULE_1__.Color.White,\n life: 300,\n fade: false,\n size: 5,\n graphic: undefined,\n startSize: undefined,\n endSize: undefined\n};\nvar ParticleTransform;\n(function (ParticleTransform) {\n /**\n * {@apilink ParticleTransform.Global} is the default and emits particles as if\n * they were world space objects, useful for most effects.\n */\n ParticleTransform[\"Global\"] = \"global\";\n /**\n * {@apilink ParticleTransform.Local} particles are children of the emitter and move relative to the emitter\n * as they would in a parent/child actor relationship.\n */\n ParticleTransform[\"Local\"] = \"local\";\n})(ParticleTransform || (ParticleTransform = {}));\n\n\n/***/ }),\n\n/***/ \"./Particles/index.ts\":\n/*!****************************!*\\\n !*** ./Particles/index.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EmitterType: () => (/* reexport safe */ _EmitterType__WEBPACK_IMPORTED_MODULE_0__.EmitterType),\n/* harmony export */ GpuParticleEmitter: () => (/* reexport safe */ _GpuParticleEmitter__WEBPACK_IMPORTED_MODULE_3__.GpuParticleEmitter),\n/* harmony export */ GpuParticleRenderer: () => (/* reexport safe */ _GpuParticleRenderer__WEBPACK_IMPORTED_MODULE_4__.GpuParticleRenderer),\n/* harmony export */ Particle: () => (/* reexport safe */ _Particles__WEBPACK_IMPORTED_MODULE_1__.Particle),\n/* harmony export */ ParticleEmitter: () => (/* reexport safe */ _ParticleEmitter__WEBPACK_IMPORTED_MODULE_2__.ParticleEmitter),\n/* harmony export */ ParticleTransform: () => (/* reexport safe */ _Particles__WEBPACK_IMPORTED_MODULE_1__.ParticleTransform)\n/* harmony export */ });\n/* harmony import */ var _EmitterType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./EmitterType */ \"./Particles/EmitterType.ts\");\n/* harmony import */ var _Particles__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Particles */ \"./Particles/Particles.ts\");\n/* harmony import */ var _ParticleEmitter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ParticleEmitter */ \"./Particles/ParticleEmitter.ts\");\n/* harmony import */ var _GpuParticleEmitter__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./GpuParticleEmitter */ \"./Particles/GpuParticleEmitter.ts\");\n/* harmony import */ var _GpuParticleRenderer__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./GpuParticleRenderer */ \"./Particles/GpuParticleRenderer.ts\");\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Polyfill.ts\":\n/*!*********************!*\\\n !*** ./Polyfill.ts ***!\n \\*********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ polyfill: () => (/* binding */ polyfill)\n/* harmony export */ });\n/**\n * Polyfill adding function\n */\nfunction polyfill() {\n /* istanbul ignore next */\n if (typeof window === 'undefined') {\n window = {\n audioContext: function () {\n return;\n }\n };\n }\n /* istanbul ignore next */\n if (typeof window !== 'undefined' && !window.requestAnimationFrame) {\n window.requestAnimationFrame =\n window.webkitRequestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n function (callback) {\n window.setInterval(callback, 1000 / 60);\n };\n }\n /* istanbul ignore next */\n if (typeof window !== 'undefined' && !window.cancelAnimationFrame) {\n window.cancelAnimationFrame =\n window.webkitCancelAnimationFrame ||\n window.mozCancelAnimationFrame ||\n function () {\n return;\n };\n }\n /* istanbul ignore next */\n if (typeof window !== 'undefined' && !window.AudioContext) {\n if (window.webkitAudioContext) {\n const ctx = window.webkitAudioContext;\n const replaceMe = ctx.prototype.decodeAudioData;\n window.webkitAudioContext.prototype.decodeAudioData = function (arrayBuffer) {\n return new Promise((resolve, reject) => {\n replaceMe.call(this, arrayBuffer, resolve, reject);\n });\n };\n }\n window.AudioContext =\n window.AudioContext ||\n window.webkitAudioContext ||\n window.mozAudioContext ||\n window.msAudioContext ||\n window.oAudioContext;\n }\n /* istanbul ignore next */\n if (typeof window !== 'undefined' && !window.devicePixelRatio) {\n window.devicePixelRatio = window.devicePixelRatio || 1;\n }\n /* istanbul ignore next */\n if (typeof window !== 'undefined' && !window.requestIdleCallback) {\n // Adapted from https://developer.chrome.com/blog/using-requestidlecallback#checking_for_requestidlecallback\n window.requestIdleCallback =\n window.requestIdleCallback ||\n function (cb) {\n const start = Date.now();\n return setTimeout(function () {\n cb({\n didTimeout: false,\n timeRemaining: function () {\n return Math.max(0, 50 - (Date.now() - start));\n }\n });\n }, 1);\n };\n window.cancelIdleCallback =\n window.cancelIdleCallback ||\n function (id) {\n clearTimeout(id);\n };\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Resources/Font.ts\":\n/*!***************************!*\\\n !*** ./Resources/Font.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FontSource: () => (/* binding */ FontSource)\n/* harmony export */ });\n/* harmony import */ var _Graphics_Font__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Graphics/Font */ \"./Graphics/Font.ts\");\n/* harmony import */ var _Resource__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Resource */ \"./Resources/Resource.ts\");\n\n\nclass FontSource {\n constructor(\n /**\n * Path to the font resource relative from the HTML document hosting the game, or absolute\n */\n path, \n /**\n * The font family name\n */\n family, { bustCache, ...options } = {}) {\n this.path = path;\n this.family = family;\n this._isLoaded = false;\n this._resource = new _Resource__WEBPACK_IMPORTED_MODULE_0__.Resource(path, 'blob', bustCache);\n this._options = options;\n }\n async load() {\n if (this.isLoaded()) {\n return this.data;\n }\n try {\n const blob = await this._resource.load();\n const url = URL.createObjectURL(blob);\n if (!this.data) {\n this.data = new FontFace(this.family, `url(${url})`);\n document.fonts.add(this.data);\n }\n await this.data.load();\n this._isLoaded = true;\n }\n catch (error) {\n throw `Error loading FontSource from path '${this.path}' with error [${error.message}]`;\n }\n return this.data;\n }\n isLoaded() {\n return this._isLoaded;\n }\n /**\n * Build a font from this FontSource.\n * @param options {FontOptions} Override the font options\n */\n toFont(options) {\n return new _Graphics_Font__WEBPACK_IMPORTED_MODULE_1__.Font({ family: this.family, ...this._options, ...options });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Resources/Gif.ts\":\n/*!**************************!*\\\n !*** ./Resources/Gif.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Gif: () => (/* binding */ Gif),\n/* harmony export */ GifParser: () => (/* binding */ GifParser),\n/* harmony export */ Stream: () => (/* binding */ Stream)\n/* harmony export */ });\n/* harmony import */ var _Resource__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Resource */ \"./Resources/Resource.ts\");\n/* harmony import */ var _Graphics_SpriteSheet__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Graphics/SpriteSheet */ \"./Graphics/SpriteSheet.ts\");\n/* harmony import */ var _Graphics_Animation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Graphics/Animation */ \"./Graphics/Animation.ts\");\n/* harmony import */ var _Graphics_ImageSource__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Graphics/ImageSource */ \"./Graphics/ImageSource.ts\");\n\n\n\n\n/**\n * The {@apilink Texture} object allows games built in Excalibur to load image resources.\n * {@apilink Texture} is an {@apilink Loadable} which means it can be passed to a {@apilink Loader}\n * to pre-load before starting a level or game.\n */\nclass Gif {\n /**\n * @param path Path to the image resource\n * @param bustCache Optionally load texture with cache busting\n */\n constructor(path, bustCache = false) {\n this.path = path;\n /**\n * The width of the texture in pixels\n */\n this.width = 0;\n /**\n * The height of the texture in pixels\n */\n this.height = 0;\n this._images = [];\n this.data = [];\n this._sprites = [];\n this._resource = new _Resource__WEBPACK_IMPORTED_MODULE_0__.Resource(path, 'arraybuffer', bustCache);\n }\n /**\n * Should excalibur add a cache busting querystring? By default false.\n * Must be set before loading\n */\n get bustCache() {\n return this._resource.bustCache;\n }\n set bustCache(val) {\n this._resource.bustCache = val;\n }\n /**\n * Begins loading the texture and returns a promise to be resolved on completion\n */\n async load() {\n const arraybuffer = await this._resource.load();\n this._stream = new Stream(arraybuffer);\n this._gif = new GifParser(this._stream);\n const images = this._gif.images.map((i) => new _Graphics_ImageSource__WEBPACK_IMPORTED_MODULE_1__.ImageSource(i.src, false));\n // Load all textures\n await Promise.all(images.map((t) => t.load()));\n this.data = this._images = images;\n this._sprites = this._images.map((image) => {\n return image.toSprite();\n });\n return this.data;\n }\n isLoaded() {\n return !!this.data;\n }\n /**\n * Return a frame of the gif as a sprite by id\n * @param id\n */\n toSprite(id = 0) {\n var _a;\n return (_a = this._sprites[id]) !== null && _a !== void 0 ? _a : null;\n }\n /**\n * Return the gif as a spritesheet\n */\n toSpriteSheet() {\n const sprites = this._sprites;\n if (sprites.length) {\n return new _Graphics_SpriteSheet__WEBPACK_IMPORTED_MODULE_2__.SpriteSheet({ sprites });\n }\n return null;\n }\n /**\n * Transform the GIF into an animation with duration per frame\n * @param durationPerFrame Optionally override duration per frame\n */\n toAnimation(durationPerFrame) {\n var _a;\n const images = (_a = this._gif) === null || _a === void 0 ? void 0 : _a.images;\n if (images === null || images === void 0 ? void 0 : images.length) {\n const frames = images.map((image, index) => {\n var _a;\n return {\n graphic: this._sprites[index],\n duration: ((_a = this._gif) === null || _a === void 0 ? void 0 : _a.frames[index].delayMs) || undefined\n };\n });\n this._animation = new _Graphics_Animation__WEBPACK_IMPORTED_MODULE_3__.Animation({\n frames,\n frameDuration: durationPerFrame\n });\n return this._animation;\n }\n return null;\n }\n get readCheckBytes() {\n var _a, _b;\n return (_b = (_a = this._gif) === null || _a === void 0 ? void 0 : _a.checkBytes) !== null && _b !== void 0 ? _b : [];\n }\n}\nconst bitsToNum = (ba) => {\n return ba.reduce(function (s, n) {\n return s * 2 + n;\n }, 0);\n};\nconst byteToBitArr = (bite) => {\n const a = [];\n for (let i = 7; i >= 0; i--) {\n a.push(!!(bite & (1 << i)));\n }\n return a;\n};\nclass Stream {\n constructor(dataArray) {\n this.len = 0;\n this.position = 0;\n this.readByte = () => {\n if (this.position >= this.data.byteLength) {\n throw new Error('Attempted to read past end of stream.');\n }\n return this.data[this.position++];\n };\n this.readBytes = (n) => {\n const bytes = [];\n for (let i = 0; i < n; i++) {\n bytes.push(this.readByte());\n }\n return bytes;\n };\n this.read = (n) => {\n let s = '';\n for (let i = 0; i < n; i++) {\n s += String.fromCharCode(this.readByte());\n }\n return s;\n };\n this.readUnsigned = () => {\n // Little-endian.\n const a = this.readBytes(2);\n return (a[1] << 8) + a[0];\n };\n this.data = new Uint8Array(dataArray);\n this.len = this.data.byteLength;\n if (this.len === 0) {\n throw new Error('No data loaded from file');\n }\n }\n}\nconst lzwDecode = function (minCodeSize, data) {\n // TODO: Now that the GIF parser is a bit different, maybe this should get an array of bytes instead of a String?\n let pos = 0; // Maybe this streaming thing should be merged with the Stream?\n const readCode = function (size) {\n let code = 0;\n for (let i = 0; i < size; i++) {\n if (data.charCodeAt(pos >> 3) & (1 << (pos & 7))) {\n code |= 1 << i;\n }\n pos++;\n }\n return code;\n };\n const output = [];\n const clearCode = 1 << minCodeSize;\n const eoiCode = clearCode + 1;\n let codeSize = minCodeSize + 1;\n let dict = [];\n const clear = function () {\n dict = [];\n codeSize = minCodeSize + 1;\n for (let i = 0; i < clearCode; i++) {\n dict[i] = [i];\n }\n dict[clearCode] = [];\n dict[eoiCode] = null;\n };\n let code = 0;\n let last = 0;\n while (true) {\n last = code;\n code = readCode(codeSize);\n if (code === clearCode) {\n clear();\n continue;\n }\n if (code === eoiCode) {\n break;\n }\n if (code < dict.length) {\n if (last !== clearCode) {\n dict.push(dict[last].concat(dict[code][0]));\n }\n }\n else {\n if (code !== dict.length) {\n throw new Error('Invalid LZW code.');\n }\n dict.push(dict[last].concat(dict[last][0]));\n }\n output.push.apply(output, dict[code]);\n if (dict.length === 1 << codeSize && codeSize < 12) {\n // If we're at the last code and codeSize is 12, the next code will be a clearCode, and it'll be 12 bits long.\n codeSize++;\n }\n }\n // I don't know if this is technically an error, but some GIFs do it.\n //if (Math.ceil(pos / 8) !== data.length) throw new Error('Extraneous LZW bytes.');\n return output;\n};\n/**\n * GifParser for binary format\n *\n * Roughly based on the documentation https://giflib.sourceforge.net/whatsinagif/index.html\n */\nclass GifParser {\n constructor(stream) {\n this._handler = {};\n this.frames = [];\n this.images = [];\n this.globalColorTableBytes = [];\n this.checkBytes = [];\n this.parseColorTableBytes = (entries) => {\n // Each entry is 3 bytes, for RGB.\n const colorTable = [];\n for (let i = 0; i < entries; i++) {\n const rgb = this._st.readBytes(3);\n colorTable.push(rgb);\n }\n return colorTable;\n };\n this.readSubBlocks = () => {\n let size, data;\n data = '';\n do {\n size = this._st.readByte();\n data += this._st.read(size);\n } while (size !== 0);\n return data;\n };\n this.parseHeader = () => {\n const hdr = {\n sig: '',\n ver: '',\n width: 0,\n height: 0,\n colorResolution: 0,\n globalColorTableSize: 0,\n gctFlag: false,\n sortedFlag: false,\n globalColorTable: [],\n backgroundColorIndex: 0,\n pixelAspectRatio: 0 // if not 0, aspectRatio = (pixelAspectRatio + 15) / 64\n };\n hdr.sig = this._st.read(3);\n hdr.ver = this._st.read(3);\n if (hdr.sig !== 'GIF') {\n throw new Error('Not a GIF file.'); // XXX: This should probably be handled more nicely.\n }\n hdr.width = this._st.readUnsigned();\n hdr.height = this._st.readUnsigned();\n this._currentFrameCanvas.width = hdr.width;\n this._currentFrameCanvas.height = hdr.height;\n const bits = byteToBitArr(this._st.readByte());\n hdr.gctFlag = bits.shift();\n hdr.colorResolution = bitsToNum(bits.splice(0, 3));\n hdr.sortedFlag = bits.shift();\n hdr.globalColorTableSize = bitsToNum(bits.splice(0, 3));\n hdr.backgroundColorIndex = this._st.readByte();\n hdr.pixelAspectRatio = this._st.readByte(); // if not 0, aspectRatio = (pixelAspectRatio + 15) / 64\n if (hdr.gctFlag) {\n // hdr.globalColorTable = this.parseColorTable(1 << (hdr.globalColorTableSize + 1));\n this.globalColorTableBytes = this.parseColorTableBytes(1 << (hdr.globalColorTableSize + 1));\n }\n if (this._handler.hdr && this._handler.hdr(hdr)) {\n this.checkBytes.push(this._handler.hdr);\n }\n };\n this.parseExt = (block) => {\n const parseGCExt = (block) => {\n this.checkBytes.push(this._st.readByte()); // Always 4\n const bits = byteToBitArr(this._st.readByte());\n block.reserved = bits.splice(0, 3); // Reserved; should be 000.\n block.disposalMethod = bitsToNum(bits.splice(0, 3));\n block.userInputFlag = bits.shift();\n block.transparentColorFlag = bits.shift();\n block.delayTime = this._st.readUnsigned();\n block.transparentColorIndex = this._st.readByte();\n block.terminator = this._st.readByte(); // always 0\n if (this._handler.gce && this._handler.gce(block)) {\n this.checkBytes.push(this._handler.gce);\n }\n return block;\n };\n const parseComExt = (block) => {\n block.comment = this.readSubBlocks();\n if (this._handler.com && this._handler.com(block)) {\n this.checkBytes.push(this._handler.com);\n }\n };\n const parsePTExt = (block) => {\n this.checkBytes.push(this._st.readByte()); // Always 12\n block.ptHeader = this._st.readBytes(12);\n block.ptData = this.readSubBlocks();\n if (this._handler.pte && this._handler.pte(block)) {\n this.checkBytes.push(this._handler.pte);\n }\n };\n const parseAppExt = (block) => {\n const parseNetscapeExt = (block) => {\n this.checkBytes.push(this._st.readByte()); // Always 3\n block.unknown = this._st.readByte(); // Q: Always 1? What is this?\n block.iterations = this._st.readUnsigned();\n block.terminator = this._st.readByte();\n if (this._handler.app && this._handler.app.NETSCAPE && this._handler.app.NETSCAPE(block)) {\n this.checkBytes.push(this._handler.app);\n }\n };\n const parseUnknownAppExt = (block) => {\n block.appData = this.readSubBlocks();\n // FIXME: This won't work if a handler wants to match on any identifier.\n if (this._handler.app && this._handler.app[block.identifier] && this._handler.app[block.identifier](block)) {\n this.checkBytes.push(this._handler.app[block.identifier]);\n }\n };\n this.checkBytes.push(this._st.readByte()); // Always 11\n block.identifier = this._st.read(8);\n block.authCode = this._st.read(3);\n switch (block.identifier) {\n case 'NETSCAPE':\n parseNetscapeExt(block);\n break;\n default:\n parseUnknownAppExt(block);\n break;\n }\n };\n const parseUnknownExt = (block) => {\n block.data = this.readSubBlocks();\n if (this._handler.unknown && this._handler.unknown(block)) {\n this.checkBytes.push(this._handler.unknown);\n }\n };\n block.label = this._st.readByte();\n switch (block.label) {\n case 0xf9:\n block.extType = 'gce';\n this._gce = parseGCExt(block);\n break;\n case 0xfe:\n block.extType = 'com';\n parseComExt(block);\n break;\n case 0x01:\n block.extType = 'pte';\n parsePTExt(block);\n break;\n case 0xff:\n block.extType = 'app';\n parseAppExt(block);\n break;\n default:\n block.extType = 'unknown';\n parseUnknownExt(block);\n break;\n }\n };\n this.parseImg = (img) => {\n var _a;\n const deinterlace = (pixels, width) => {\n // Of course this defeats the purpose of interlacing. And it's *probably*\n // the least efficient way it's ever been implemented. But nevertheless...\n const newPixels = new Array(pixels.length);\n const rows = pixels.length / width;\n const cpRow = (toRow, fromRow) => {\n const fromPixels = pixels.slice(fromRow * width, (fromRow + 1) * width);\n newPixels.splice.apply(newPixels, [toRow * width, width].concat(fromPixels));\n };\n const offsets = [0, 4, 2, 1];\n const steps = [8, 8, 4, 2];\n let fromRow = 0;\n for (let pass = 0; pass < 4; pass++) {\n for (let toRow = offsets[pass]; toRow < rows; toRow += steps[pass]) {\n cpRow(toRow, fromRow);\n fromRow++;\n }\n }\n return newPixels;\n };\n img.leftPos = this._st.readUnsigned();\n img.topPos = this._st.readUnsigned();\n img.width = this._st.readUnsigned();\n img.height = this._st.readUnsigned();\n const bits = byteToBitArr(this._st.readByte());\n img.lctFlag = bits.shift();\n img.interlaced = bits.shift();\n img.sorted = bits.shift();\n img.reserved = bits.splice(0, 2);\n img.lctSize = bitsToNum(bits.splice(0, 3));\n if (img.lctFlag) {\n img.lctBytes = this.parseColorTableBytes(1 << (img.lctSize + 1));\n }\n img.lzwMinCodeSize = this._st.readByte();\n const lzwData = this.readSubBlocks();\n img.pixels = lzwDecode(img.lzwMinCodeSize, lzwData);\n if (img.interlaced) {\n // Move\n img.pixels = deinterlace(img.pixels, img.width);\n }\n if ((_a = this._gce) === null || _a === void 0 ? void 0 : _a.delayTime) {\n img.delayMs = this._gce.delayTime * 10;\n }\n this.frames.push(img);\n this.arrayToImage(img, img.lctFlag ? img.lctBytes : this.globalColorTableBytes);\n if (this._handler.img && this._handler.img(img)) {\n this.checkBytes.push(this._handler);\n }\n };\n this.parseBlocks = () => {\n const block = {\n sentinel: this._st.readByte(),\n type: ''\n };\n const blockChar = String.fromCharCode(block.sentinel);\n switch (blockChar) {\n case '!':\n block.type = 'ext';\n this.parseExt(block);\n break;\n case ',':\n block.type = 'img';\n this.parseImg(block);\n break;\n case ';':\n block.type = 'eof';\n if (this._handler.eof && this._handler.eof(block)) {\n this.checkBytes.push(this._handler.eof);\n }\n break;\n default:\n throw new Error('Unknown block: 0x' + block.sentinel.toString(16));\n }\n if (block.type !== 'eof') {\n this.parseBlocks();\n }\n };\n this.arrayToImage = (frame, colorTable) => {\n var _a, _b, _c, _d;\n const canvas = document.createElement('canvas');\n canvas.width = frame.width;\n canvas.height = frame.height;\n const context = canvas.getContext('2d');\n const imageData = context.getImageData(0, 0, canvas.width, canvas.height);\n let transparentColorIndex = -1;\n if ((_a = this._gce) === null || _a === void 0 ? void 0 : _a.transparentColorFlag) {\n transparentColorIndex = this._gce.transparentColorIndex;\n }\n for (let pixel = 0; pixel < frame.pixels.length; pixel++) {\n const colorIndex = frame.pixels[pixel];\n const color = colorTable[colorIndex];\n if (colorIndex === transparentColorIndex) {\n imageData.data.set([0, 0, 0, 0], pixel * 4);\n }\n else {\n imageData.data.set([...color, 255], pixel * 4);\n }\n }\n context.putImageData(imageData, 0, 0);\n // A value of 1 which tells the decoder to leave the image in place and draw the next image on top of it.\n // A value of 2 would have meant that the canvas should be restored to the background color (as indicated by the logical screen descriptor).\n // A value of 3 is defined to mean that the decoder should restore the canvas to its previous state before the current image was drawn.\n // The behavior for values 4-7 are yet to be defined.\n if (((_b = this._gce) === null || _b === void 0 ? void 0 : _b.disposalMethod) === 1 && this.images.length) {\n this._currentFrameContext.drawImage(this.images[this.images.length - 1], 0, 0);\n }\n else if (((_c = this._gce) === null || _c === void 0 ? void 0 : _c.disposalMethod) === 2 && ((_d = this._hdr) === null || _d === void 0 ? void 0 : _d.gctFlag)) {\n const bg = colorTable[this._hdr.backgroundColorIndex];\n this._currentFrameContext.fillStyle = `rgb(${bg[0]}, ${bg[1]}, ${bg[2]})`;\n this._currentFrameContext.fillRect(0, 0, this._hdr.width, this._hdr.height);\n }\n else {\n this._currentFrameContext.clearRect(0, 0, this._currentFrameCanvas.width, this._currentFrameCanvas.height);\n }\n this._currentFrameContext.drawImage(canvas, frame.leftPos, frame.topPos, frame.width, frame.height);\n const img = new Image();\n img.src = this._currentFrameCanvas.toDataURL(); // default is png\n this.images.push(img);\n };\n this._st = stream;\n this._handler = {};\n this._currentFrameCanvas = document.createElement('canvas');\n this._currentFrameContext = this._currentFrameCanvas.getContext('2d');\n this.parseHeader();\n this.parseBlocks();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Resources/Index.ts\":\n/*!****************************!*\\\n !*** ./Resources/Index.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AudioContextFactory: () => (/* reexport safe */ _Sound_Index__WEBPACK_IMPORTED_MODULE_1__.AudioContextFactory),\n/* harmony export */ FontSource: () => (/* reexport safe */ _Font__WEBPACK_IMPORTED_MODULE_3__.FontSource),\n/* harmony export */ Gif: () => (/* reexport safe */ _Gif__WEBPACK_IMPORTED_MODULE_2__.Gif),\n/* harmony export */ GifParser: () => (/* reexport safe */ _Gif__WEBPACK_IMPORTED_MODULE_2__.GifParser),\n/* harmony export */ Resource: () => (/* reexport safe */ _Resource__WEBPACK_IMPORTED_MODULE_0__.Resource),\n/* harmony export */ ResourceEvents: () => (/* reexport safe */ _Resource__WEBPACK_IMPORTED_MODULE_0__.ResourceEvents),\n/* harmony export */ Sound: () => (/* reexport safe */ _Sound_Index__WEBPACK_IMPORTED_MODULE_1__.Sound),\n/* harmony export */ SoundEvents: () => (/* reexport safe */ _Sound_Index__WEBPACK_IMPORTED_MODULE_1__.SoundEvents),\n/* harmony export */ Stream: () => (/* reexport safe */ _Gif__WEBPACK_IMPORTED_MODULE_2__.Stream),\n/* harmony export */ WebAudioInstance: () => (/* reexport safe */ _Sound_Index__WEBPACK_IMPORTED_MODULE_1__.WebAudioInstance)\n/* harmony export */ });\n/* harmony import */ var _Resource__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Resource */ \"./Resources/Resource.ts\");\n/* harmony import */ var _Sound_Index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Sound/Index */ \"./Resources/Sound/Index.ts\");\n/* harmony import */ var _Gif__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Gif */ \"./Resources/Gif.ts\");\n/* harmony import */ var _Font__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Font */ \"./Resources/Font.ts\");\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Resources/Resource.ts\":\n/*!*******************************!*\\\n !*** ./Resources/Resource.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Resource: () => (/* binding */ Resource),\n/* harmony export */ ResourceEvents: () => (/* binding */ ResourceEvents)\n/* harmony export */ });\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n\n\nconst ResourceEvents = {\n Complete: 'complete',\n Load: 'load',\n LoadStart: 'loadstart',\n Progress: 'progress',\n Error: 'error'\n};\n/**\n * The {@apilink Resource} type allows games built in Excalibur to load generic resources.\n * For any type of remote resource it is recommended to use {@apilink Resource} for preloading.\n */\nclass Resource {\n /**\n * @param path Path to the remote resource\n * @param responseType The type to expect as a response: \"\" | \"arraybuffer\" | \"blob\" | \"document\" | \"json\" | \"text\";\n * @param bustCache Whether or not to cache-bust requests\n */\n constructor(path, responseType, bustCache = false) {\n this.path = path;\n this.responseType = responseType;\n this.bustCache = bustCache;\n this.data = null;\n this.logger = _Util_Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance();\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_1__.EventEmitter();\n }\n /**\n * Returns true if the Resource is completely loaded and is ready\n * to be drawn.\n */\n isLoaded() {\n return this.data !== null;\n }\n _cacheBust(uri) {\n const query = /\\?\\w*=\\w*/;\n if (query.test(uri)) {\n uri += '&__=' + Date.now();\n }\n else {\n uri += '?__=' + Date.now();\n }\n return uri;\n }\n /**\n * Begin loading the resource and returns a promise to be resolved on completion\n */\n load() {\n return new Promise((resolve, reject) => {\n // Exit early if we already have data\n if (this.data !== null) {\n this.logger.debug('Already have data for resource', this.path);\n this.events.emit('complete', this.data);\n resolve(this.data);\n return;\n }\n const request = new XMLHttpRequest();\n request.open('GET', this.bustCache ? this._cacheBust(this.path) : this.path, true);\n request.responseType = this.responseType;\n request.addEventListener('loadstart', (e) => this.events.emit('loadstart', e));\n request.addEventListener('progress', (e) => this.events.emit('progress', e));\n request.addEventListener('error', (e) => this.events.emit('error', e));\n request.addEventListener('load', (e) => this.events.emit('load', e));\n request.addEventListener('load', () => {\n // XHR on file:// success status is 0, such as with PhantomJS\n if (request.status !== 0 && request.status !== 200) {\n this.logger.error('Failed to load resource ', this.path, ' server responded with error code', request.status);\n this.events.emit('error', request.response);\n reject(new Error(request.statusText));\n return;\n }\n if (request.response instanceof Blob && request.response.type === 'text/html') {\n const errorText = `Expected blob (usually image) data from the server when loading ${this.path}, but got HTML content instead!\r\n\r\nCheck your server configuration, for example Vite serves static files from the /public folder`;\n this.events.emit('error', request.response);\n reject(new Error(errorText));\n return;\n }\n this.data = request.response;\n this.events.emit('complete', this.data);\n this.logger.debug('Completed loading resource', this.path);\n resolve(this.data);\n });\n request.send();\n });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Resources/Sound/AudioContext.ts\":\n/*!*****************************************!*\\\n !*** ./Resources/Sound/AudioContext.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AudioContextFactory: () => (/* binding */ AudioContextFactory)\n/* harmony export */ });\n/**\n * Internal class used to build instances of AudioContext\n */\n/* istanbul ignore next */\nclass AudioContextFactory {\n static create() {\n if (!this._INSTANCE) {\n if (window.AudioContext || window.webkitAudioContext) {\n this._INSTANCE = new AudioContext();\n }\n }\n return this._INSTANCE;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Resources/Sound/Index.ts\":\n/*!**********************************!*\\\n !*** ./Resources/Sound/Index.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AudioContextFactory: () => (/* reexport safe */ _AudioContext__WEBPACK_IMPORTED_MODULE_1__.AudioContextFactory),\n/* harmony export */ Sound: () => (/* reexport safe */ _Sound__WEBPACK_IMPORTED_MODULE_0__.Sound),\n/* harmony export */ SoundEvents: () => (/* reexport safe */ _Sound__WEBPACK_IMPORTED_MODULE_0__.SoundEvents),\n/* harmony export */ WebAudioInstance: () => (/* reexport safe */ _WebAudioInstance__WEBPACK_IMPORTED_MODULE_2__.WebAudioInstance)\n/* harmony export */ });\n/* harmony import */ var _Sound__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Sound */ \"./Resources/Sound/Sound.ts\");\n/* harmony import */ var _AudioContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./AudioContext */ \"./Resources/Sound/AudioContext.ts\");\n/* harmony import */ var _WebAudioInstance__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./WebAudioInstance */ \"./Resources/Sound/WebAudioInstance.ts\");\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Resources/Sound/Sound.ts\":\n/*!**********************************!*\\\n !*** ./Resources/Sound/Sound.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Sound: () => (/* binding */ Sound),\n/* harmony export */ SoundEvents: () => (/* binding */ SoundEvents)\n/* harmony export */ });\n/* harmony import */ var _Interfaces_AudioImplementation__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Interfaces/AudioImplementation */ \"./Interfaces/AudioImplementation.ts\");\n/* harmony import */ var _Resource__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Resource */ \"./Resources/Resource.ts\");\n/* harmony import */ var _WebAudioInstance__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./WebAudioInstance */ \"./Resources/Sound/WebAudioInstance.ts\");\n/* harmony import */ var _AudioContext__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./AudioContext */ \"./Resources/Sound/AudioContext.ts\");\n/* harmony import */ var _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Events/MediaEvents */ \"./Events/MediaEvents.ts\");\n/* harmony import */ var _Util_Sound__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../Util/Sound */ \"./Util/Sound.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n\n\n\n\n\nconst SoundEvents = {\n VolumeChange: 'volumechange',\n Processed: 'processed',\n Pause: 'pause',\n Stop: 'stop',\n PlaybackEnd: 'playbackend',\n Resume: 'resume',\n PlaybackStart: 'playbackstart'\n};\n/**\n * The {@apilink Sound} object allows games built in Excalibur to load audio\n * components, from soundtracks to sound effects. {@apilink Sound} is an {@apilink Loadable}\n * which means it can be passed to a {@apilink Loader} to pre-load before a game or level.\n */\nclass Sound {\n /**\n * Indicates whether the clip should loop when complete\n * @param value Set the looping flag\n */\n set loop(value) {\n this._loop = value;\n for (const track of this._tracks) {\n track.loop = this._loop;\n }\n this.logger.debug('Set loop for all instances of sound', this.path, 'to', this._loop);\n }\n get loop() {\n return this._loop;\n }\n set volume(value) {\n this._volume = value;\n for (const track of this._tracks) {\n track.volume = this._volume;\n }\n this.events.emit('volumechange', new _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_0__.NativeSoundEvent(this));\n this.logger.debug('Set loop for all instances of sound', this.path, 'to', this._volume);\n }\n get volume() {\n return this._volume;\n }\n /**\n * Get the duration that this audio should play. If unset the total natural playback duration will be used.\n */\n get duration() {\n return this._duration;\n }\n /**\n * Set the duration that this audio should play. If unset the total natural playback duration will be used.\n *\n * Note: if you seek to a specific point the duration will start from that point, for example\n *\n * If you have a 10 second clip, seek to 5 seconds, then set the duration to 2, it will play the clip from 5-7 seconds.\n */\n set duration(duration) {\n this._duration = duration;\n }\n /**\n * Return array of Current AudioInstances playing or being paused\n */\n get instances() {\n return this._tracks;\n }\n get path() {\n return this._resource.path;\n }\n set path(val) {\n this._resource.path = val;\n }\n /**\n * Should excalibur add a cache busting querystring? By default false.\n * Must be set before loading\n */\n get bustCache() {\n return this._resource.bustCache;\n }\n set bustCache(val) {\n this._resource.bustCache = val;\n }\n /**\n * @param paths A list of audio sources (clip.wav, clip.mp3, clip.ogg) for this audio clip. This is done for browser compatibility.\n */\n constructor(...paths) {\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_1__.EventEmitter();\n this.logger = _Util_Log__WEBPACK_IMPORTED_MODULE_2__.Logger.getInstance();\n this._loop = false;\n this._volume = 1;\n this._isStopped = false;\n // private _isPaused = false;\n this._tracks = [];\n this._wasPlayingOnHidden = false;\n this._playbackRate = 1.0;\n this._audioContext = _AudioContext__WEBPACK_IMPORTED_MODULE_3__.AudioContextFactory.create();\n this._resource = new _Resource__WEBPACK_IMPORTED_MODULE_4__.Resource('', _Interfaces_AudioImplementation__WEBPACK_IMPORTED_MODULE_5__.ExResponse.type.arraybuffer);\n /**\n * Chrome : MP3, WAV, Ogg\n * Firefox : WAV, Ogg,\n * IE : MP3, WAV coming soon\n * Safari MP3, WAV, Ogg\n */\n for (const path of paths) {\n if ((0,_Util_Sound__WEBPACK_IMPORTED_MODULE_6__.canPlayFile)(path)) {\n this.path = path;\n break;\n }\n }\n if (!this.path) {\n this.logger.warn('This browser does not support any of the audio files specified:', paths.join(', '));\n this.logger.warn('Attempting to use', paths[0]);\n this.path = paths[0]; // select the first specified\n }\n }\n isLoaded() {\n return !!this.data;\n }\n async load() {\n var _a, _b;\n if (this.data) {\n return this.data;\n }\n const arraybuffer = await this._resource.load();\n const audiobuffer = await this.decodeAudio(arraybuffer.slice(0));\n this._duration = (_b = (_a = this._duration) !== null && _a !== void 0 ? _a : audiobuffer === null || audiobuffer === void 0 ? void 0 : audiobuffer.duration) !== null && _b !== void 0 ? _b : undefined;\n this.events.emit('processed', new _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_0__.NativeSoundProcessedEvent(this, audiobuffer));\n return (this.data = audiobuffer);\n }\n async decodeAudio(data) {\n try {\n return await this._audioContext.decodeAudioData(data.slice(0));\n }\n catch (e) {\n this.logger.error('Unable to decode ' +\n ' this browser may not fully support this format, or the file may be corrupt, ' +\n 'if this is an mp3 try removing id3 tags and album art from the file.');\n return await Promise.reject();\n }\n }\n wireEngine(engine) {\n if (engine) {\n this._engine = engine;\n this._engine.on('hidden', () => {\n if (engine.pauseAudioWhenHidden && this.isPlaying()) {\n this._wasPlayingOnHidden = true;\n this.pause();\n }\n });\n this._engine.on('visible', () => {\n if (engine.pauseAudioWhenHidden && this._wasPlayingOnHidden) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.play();\n this._wasPlayingOnHidden = false;\n }\n });\n this._engine.on('start', () => {\n this._isStopped = false;\n });\n this._engine.on('stop', () => {\n this.stop();\n this._isStopped = true;\n });\n }\n }\n /**\n * Returns how many instances of the sound are currently playing\n */\n instanceCount() {\n return this._tracks.length;\n }\n /**\n * Whether or not the sound is playing right now\n */\n isPlaying() {\n return this._tracks.some((t) => t.isPlaying());\n }\n isPaused() {\n return this._tracks.some((t) => t.isPaused());\n }\n isStopped() {\n return this._tracks.some((t) => t.isStopped());\n }\n /**\n * Play the sound, returns a promise that resolves when the sound is done playing\n * An optional volume argument can be passed in to play the sound. Max volume is 1.0\n */\n play(volume) {\n if (!this.isLoaded()) {\n this.logger.warn('Cannot start playing. Resource', this.path, 'is not loaded yet');\n return Promise.resolve(true);\n }\n if (this._isStopped) {\n this.logger.warn('Cannot start playing. Engine is in a stopped state.');\n return Promise.resolve(false);\n }\n this.volume = volume || this.volume;\n if (this.isPaused()) {\n return this._resumePlayback();\n }\n else {\n return this._startPlayback();\n }\n }\n /**\n * Stop the sound, and do not rewind\n */\n pause() {\n if (!this.isPlaying()) {\n return;\n }\n for (const track of this._tracks) {\n track.pause();\n }\n this.events.emit('pause', new _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_0__.NativeSoundEvent(this));\n this.logger.debug('Paused all instances of sound', this.path);\n }\n /**\n * Stop the sound if it is currently playing and rewind the track. If the sound is not playing, rewinds the track.\n */\n stop() {\n for (const track of this._tracks) {\n track.stop();\n }\n this.events.emit('stop', new _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_0__.NativeSoundEvent(this));\n this._tracks.length = 0;\n this.logger.debug('Stopped all instances of sound', this.path);\n }\n get playbackRate() {\n return this._playbackRate;\n }\n set playbackRate(playbackRate) {\n this._playbackRate = playbackRate;\n this._tracks.forEach((t) => {\n t.playbackRate = this._playbackRate;\n });\n }\n seek(position, trackId = 0) {\n if (this._tracks.length === 0) {\n this._getTrackInstance(this.data);\n }\n this._tracks[trackId].seek(position);\n }\n getTotalPlaybackDuration() {\n if (!this.isLoaded()) {\n this.logger.warnOnce(`Sound from ${this.path} is not loaded, cannot return total playback duration.` +\n `Did you forget to add Sound to a loader? https://excaliburjs.com/docs/loaders/`);\n return 0;\n }\n return this.data.duration;\n }\n /**\n * Return the current playback time of the playing track in seconds from the start.\n *\n * Optionally specify the track to query if multiple are playing at once.\n * @param trackId\n */\n getPlaybackPosition(trackId = 0) {\n if (this._tracks.length) {\n return this._tracks[trackId].getPlaybackPosition();\n }\n return 0;\n }\n /**\n * Get Id of provided AudioInstance in current trackList\n * @param track {@apilink Audio} which Id is to be given\n */\n getTrackId(track) {\n return this._tracks.indexOf(track);\n }\n async _resumePlayback() {\n if (this.isPaused()) {\n const resumed = [];\n // ensure we resume *current* tracks (if paused)\n for (const track of this._tracks) {\n resumed.push(track.play().then(() => {\n this._tracks.splice(this.getTrackId(track), 1);\n return true;\n }));\n }\n this.events.emit('resume', new _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_0__.NativeSoundEvent(this));\n this.logger.debug('Resuming paused instances for sound', this.path, this._tracks);\n // resolve when resumed tracks are done\n await Promise.all(resumed);\n }\n return true;\n }\n /**\n * Starts playback, returns a promise that resolves when playback is complete\n */\n async _startPlayback() {\n const track = this._getTrackInstance(this.data);\n const complete = await track.play(() => {\n this.events.emit('playbackstart', new _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_0__.NativeSoundEvent(this, track));\n this.logger.debug('Playing new instance for sound', this.path);\n });\n this.events.emit('playbackend', new _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_0__.NativeSoundEvent(this, track));\n // cleanup any done tracks\n const trackId = this.getTrackId(track);\n if (trackId !== -1) {\n this._tracks.splice(trackId, 1);\n }\n return complete;\n }\n _getTrackInstance(data) {\n var _a;\n const newTrack = new _WebAudioInstance__WEBPACK_IMPORTED_MODULE_7__.WebAudioInstance(data);\n newTrack.loop = this.loop;\n newTrack.volume = this.volume;\n newTrack.duration = (_a = this.duration) !== null && _a !== void 0 ? _a : 0;\n newTrack.playbackRate = this._playbackRate;\n this._tracks.push(newTrack);\n return newTrack;\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Resources/Sound/WebAudioInstance.ts\":\n/*!*********************************************!*\\\n !*** ./Resources/Sound/WebAudioInstance.ts ***!\n \\*********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ WebAudioInstance: () => (/* binding */ WebAudioInstance)\n/* harmony export */ });\n/* harmony import */ var _Util_StateMachine__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Util/StateMachine */ \"./Util/StateMachine.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _AudioContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./AudioContext */ \"./Resources/Sound/AudioContext.ts\");\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Util/Future */ \"./Util/Future.ts\");\n\n\n\n\n/**\n * Internal class representing a Web Audio AudioBufferSourceNode instance\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API\n */\nclass WebAudioInstance {\n _createNewBufferSource() {\n this._instance = this._audioContext.createBufferSource();\n this._instance.buffer = this._src;\n this._instance.loop = this.loop;\n this._instance.playbackRate.value = this._playbackRate;\n this._instance.connect(this._volumeNode);\n this._volumeNode.connect(this._audioContext.destination);\n }\n _handleEnd() {\n if (!this.loop) {\n this._instance.onended = () => {\n this._playingFuture.resolve(true);\n };\n }\n }\n set loop(value) {\n this._loop = value;\n if (this._instance) {\n this._instance.loop = value;\n if (!this.loop) {\n this._instance.onended = () => {\n this._playingFuture.resolve(true);\n };\n }\n }\n }\n get loop() {\n return this._loop;\n }\n set volume(value) {\n value = (0,_Math_util__WEBPACK_IMPORTED_MODULE_0__.clamp)(value, 0, 1.0);\n this._volume = value;\n if (this._stateMachine.in('PLAYING') && this._volumeNode.gain.setTargetAtTime) {\n // https://developer.mozilla.org/en-US/docs/Web/API/AudioParam/setTargetAtTime\n // After each .1 seconds timestep, the target value will ~63.2% closer to the target value.\n // This exponential ramp provides a more pleasant transition in gain\n this._volumeNode.gain.setTargetAtTime(value, this._audioContext.currentTime, 0.1);\n }\n else {\n this._volumeNode.gain.value = value;\n }\n }\n get volume() {\n return this._volume;\n }\n /**\n * Returns the set duration to play, otherwise returns the total duration if unset\n */\n get duration() {\n var _a;\n return (_a = this._duration) !== null && _a !== void 0 ? _a : this.getTotalPlaybackDuration();\n }\n /**\n * Set the duration that this audio should play.\n *\n * Note: if you seek to a specific point the duration will start from that point, for example\n *\n * If you have a 10 second clip, seek to 5 seconds, then set the duration to 2, it will play the clip from 5-7 seconds.\n */\n set duration(duration) {\n this._duration = duration;\n }\n constructor(_src) {\n this._src = _src;\n this._audioContext = _AudioContext__WEBPACK_IMPORTED_MODULE_1__.AudioContextFactory.create();\n this._volumeNode = this._audioContext.createGain();\n this._playingFuture = new _Util_Future__WEBPACK_IMPORTED_MODULE_2__.Future();\n this._stateMachine = _Util_StateMachine__WEBPACK_IMPORTED_MODULE_3__.StateMachine.create({\n start: 'STOPPED',\n states: {\n PLAYING: {\n onEnter: ({ data }) => {\n // Buffer nodes are single use\n this._createNewBufferSource();\n this._handleEnd();\n if (this.loop) {\n // when looping don't set a duration\n this._instance.start(0, data.pausedAt * this._playbackRate);\n }\n else {\n this._instance.start(0, data.pausedAt * this._playbackRate, this.duration);\n }\n data.startedAt = this._audioContext.currentTime - data.pausedAt;\n data.pausedAt = 0;\n },\n onState: () => this._playStarted(),\n onExit: ({ to }) => {\n // If you've exited early only resolve if explicitly STOPPED\n if (to === 'STOPPED') {\n this._playingFuture.resolve(true);\n }\n // Whenever you're not playing... you stop!\n this._instance.onended = null; // disconnect the wired on-end handler\n this._instance.disconnect();\n this._instance.stop(0);\n this._instance = null;\n },\n transitions: ['STOPPED', 'PAUSED', 'SEEK']\n },\n SEEK: {\n onEnter: ({ eventData: position, data }) => {\n data.pausedAt = (position !== null && position !== void 0 ? position : 0) / this._playbackRate;\n data.startedAt = 0;\n },\n transitions: ['*']\n },\n STOPPED: {\n onEnter: ({ data }) => {\n data.pausedAt = 0;\n data.startedAt = 0;\n this._playingFuture.resolve(true);\n },\n transitions: ['PLAYING', 'PAUSED', 'SEEK']\n },\n PAUSED: {\n onEnter: ({ data }) => {\n // Playback rate will be a scale factor of how fast/slow the audio is being played\n // default is 1.0\n // we need to invert it to get the time scale\n data.pausedAt = this._audioContext.currentTime - data.startedAt;\n },\n transitions: ['PLAYING', 'STOPPED', 'SEEK']\n }\n }\n }, {\n startedAt: 0,\n pausedAt: 0\n });\n this._volume = 1;\n this._loop = false;\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n this._playStarted = () => { };\n this._playbackRate = 1.0;\n this._createNewBufferSource();\n }\n isPlaying() {\n return this._stateMachine.in('PLAYING');\n }\n isPaused() {\n return this._stateMachine.in('PAUSED') || this._stateMachine.in('SEEK');\n }\n isStopped() {\n return this._stateMachine.in('STOPPED');\n }\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n play(playStarted = () => { }) {\n this._playStarted = playStarted;\n this._stateMachine.go('PLAYING');\n return this._playingFuture.promise;\n }\n pause() {\n this._stateMachine.go('PAUSED');\n }\n stop() {\n this._stateMachine.go('STOPPED');\n }\n seek(position) {\n this._stateMachine.go('PAUSED');\n this._stateMachine.go('SEEK', position);\n }\n getTotalPlaybackDuration() {\n return this._src.duration;\n }\n getPlaybackPosition() {\n const { pausedAt, startedAt } = this._stateMachine.data;\n if (pausedAt) {\n return pausedAt * this._playbackRate;\n }\n if (startedAt) {\n return (this._audioContext.currentTime - startedAt) * this._playbackRate;\n }\n return 0;\n }\n set playbackRate(playbackRate) {\n this._instance.playbackRate.value = this._playbackRate = playbackRate;\n }\n get playbackRate() {\n return this._instance.playbackRate.value;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Scene.ts\":\n/*!******************!*\\\n !*** ./Scene.ts ***!\n \\******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PreLoadEvent: () => (/* binding */ PreLoadEvent),\n/* harmony export */ Scene: () => (/* binding */ Scene),\n/* harmony export */ SceneEvents: () => (/* binding */ SceneEvents),\n/* harmony export */ isSceneConstructor: () => (/* binding */ isSceneConstructor)\n/* harmony export */ });\n/* harmony import */ var _ScreenElement__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./ScreenElement */ \"./ScreenElement.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./Events */ \"./Events.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Timer__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./Timer */ \"./Timer.ts\");\n/* harmony import */ var _TileMap__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./TileMap */ \"./TileMap/TileMap.ts\");\n/* harmony import */ var _Camera__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Camera */ \"./Camera.ts\");\n/* harmony import */ var _Actor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Actor */ \"./Actor.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./Util/Util */ \"./Util/Util.ts\");\n/* harmony import */ var _Trigger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Trigger */ \"./Trigger.ts\");\n/* harmony import */ var _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./EntityComponentSystem/System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _EntityComponentSystem_World__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./EntityComponentSystem/World */ \"./EntityComponentSystem/World.ts\");\n/* harmony import */ var _Collision_MotionSystem__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Collision/MotionSystem */ \"./Collision/MotionSystem.ts\");\n/* harmony import */ var _Collision_CollisionSystem__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Collision/CollisionSystem */ \"./Collision/CollisionSystem.ts\");\n/* harmony import */ var _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./EntityComponentSystem/Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _Graphics_GraphicsSystem__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Graphics/GraphicsSystem */ \"./Graphics/GraphicsSystem.ts\");\n/* harmony import */ var _Debug_DebugSystem__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Debug/DebugSystem */ \"./Debug/DebugSystem.ts\");\n/* harmony import */ var _Input_PointerSystem__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Input/PointerSystem */ \"./Input/PointerSystem.ts\");\n/* harmony import */ var _Actions_ActionsSystem__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Actions/ActionsSystem */ \"./Actions/ActionsSystem.ts\");\n/* harmony import */ var _TileMap_IsometricEntitySystem__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./TileMap/IsometricEntitySystem */ \"./TileMap/IsometricEntitySystem.ts\");\n/* harmony import */ var _Graphics_OffscreenSystem__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Graphics/OffscreenSystem */ \"./Graphics/OffscreenSystem.ts\");\n/* harmony import */ var _Collision_PhysicsWorld__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Collision/PhysicsWorld */ \"./Collision/PhysicsWorld.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Input_InputHost__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./Input/InputHost */ \"./Input/InputHost.ts\");\n/* harmony import */ var _Input_PointerScope__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Input/PointerScope */ \"./Input/PointerScope.ts\");\n/* harmony import */ var _Collision_PhysicsConfig__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Collision/PhysicsConfig */ \"./Collision/PhysicsConfig.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass PreLoadEvent {\n}\nconst SceneEvents = {\n Initialize: 'initialize',\n Activate: 'activate',\n Deactivate: 'deactivate',\n PreUpdate: 'preupdate',\n PostUpdate: 'postupdate',\n PreDraw: 'predraw',\n PostDraw: 'postdraw',\n PreDebugDraw: 'predebugdraw',\n PostDebugDraw: 'postdebugdraw',\n PreLoad: 'preload'\n};\n/**\n *\n */\nfunction isSceneConstructor(x) {\n var _a, _b;\n return !!(x === null || x === void 0 ? void 0 : x.prototype) && !!((_b = (_a = x === null || x === void 0 ? void 0 : x.prototype) === null || _a === void 0 ? void 0 : _a.constructor) === null || _b === void 0 ? void 0 : _b.name);\n}\n/**\n * {@apilink Actor | `Actors`} are composed together into groupings called Scenes in\n * Excalibur. The metaphor models the same idea behind real world\n * actors in a scene. Only actors in scenes will be updated and drawn.\n *\n * Typical usages of a scene include: levels, menus, loading screens, etc.\n */\nclass Scene {\n /**\n * The actors in the current scene\n */\n get actors() {\n return this.world.entityManager.entities.filter((e) => {\n return e instanceof _Actor__WEBPACK_IMPORTED_MODULE_0__.Actor;\n });\n }\n /**\n * The entities in the current scene\n */\n get entities() {\n return this.world.entityManager.entities;\n }\n /**\n * The triggers in the current scene\n */\n get triggers() {\n return this.world.entityManager.entities.filter((e) => {\n return e instanceof _Trigger__WEBPACK_IMPORTED_MODULE_1__.Trigger;\n });\n }\n /**\n * The {@apilink TileMap}s in the scene, if any\n */\n get tileMaps() {\n return this.world.entityManager.entities.filter((e) => {\n return e instanceof _TileMap__WEBPACK_IMPORTED_MODULE_2__.TileMap;\n });\n }\n get timers() {\n return this._timers;\n }\n constructor() {\n // Initialize systems\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_3__.Logger.getInstance();\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_4__.EventEmitter();\n /**\n * Gets or sets the current camera for the scene\n */\n this.camera = new _Camera__WEBPACK_IMPORTED_MODULE_5__.Camera();\n /**\n * The ECS world for the scene\n */\n this.world = new _EntityComponentSystem_World__WEBPACK_IMPORTED_MODULE_6__.World(this);\n /**\n * The Excalibur physics world for the scene. Used to interact\n * with colliders included in the scene.\n *\n * Can be used to perform scene ray casts, track colliders, broadphase, and narrowphase.\n */\n this.physics = new _Collision_PhysicsWorld__WEBPACK_IMPORTED_MODULE_7__.PhysicsWorld((0,_Collision_PhysicsConfig__WEBPACK_IMPORTED_MODULE_8__.getDefaultPhysicsConfig)());\n this._isInitialized = false;\n this._timers = [];\n this._cancelQueue = [];\n // Update\n this.world.add(_Actions_ActionsSystem__WEBPACK_IMPORTED_MODULE_9__.ActionsSystem);\n this.world.add(new _Collision_MotionSystem__WEBPACK_IMPORTED_MODULE_10__.MotionSystem(this.world, this.physics));\n this.world.add(new _Collision_CollisionSystem__WEBPACK_IMPORTED_MODULE_11__.CollisionSystem(this.world, this.physics));\n this.world.add(_Input_PointerSystem__WEBPACK_IMPORTED_MODULE_12__.PointerSystem);\n this.world.add(_TileMap_IsometricEntitySystem__WEBPACK_IMPORTED_MODULE_13__.IsometricEntitySystem);\n // Draw\n this.world.add(_Graphics_OffscreenSystem__WEBPACK_IMPORTED_MODULE_14__.OffscreenSystem);\n this.world.add(_Graphics_GraphicsSystem__WEBPACK_IMPORTED_MODULE_15__.GraphicsSystem);\n this.world.add(_Debug_DebugSystem__WEBPACK_IMPORTED_MODULE_16__.DebugSystem);\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n /**\n * Event hook to provide Scenes a way of loading scene specific resources.\n *\n * This is called before the Scene.onInitialize during scene transition. It will only ever fire once for a scene.\n * @param loader\n */\n onPreLoad(loader) {\n // will be overridden\n }\n /**\n * Event hook fired directly before transition, either \"in\" or \"out\" of the scene\n *\n * This overrides the Engine scene definition. However transitions specified in goToScene take highest precedence\n *\n * ```typescript\n * // Overrides all\n * Engine.goToScene('scene', { destinationIn: ..., sourceOut: ... });\n * ```\n *\n * This can be used to configure custom transitions for a scene dynamically\n */\n onTransition(direction) {\n // will be overridden\n return undefined;\n }\n /**\n * This is called before the first update of the {@apilink Scene}. Initializes scene members like the camera. This method is meant to be\n * overridden. This is where initialization of child actors should take place.\n */\n onInitialize(engine) {\n // will be overridden\n }\n /**\n * This is called when the scene is made active and started. It is meant to be overridden,\n * this is where you should setup any DOM UI or event handlers needed for the scene.\n */\n onActivate(context) {\n // will be overridden\n }\n /**\n * This is called when the scene is made transitioned away from and stopped. It is meant to be overridden,\n * this is where you should cleanup any DOM UI or event handlers needed for the scene.\n */\n onDeactivate(context) {\n // will be overridden\n }\n /**\n * Safe to override onPreUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPreUpdate` is called directly before a scene is updated.\n * @param engine reference to the engine\n * @param elapsed Number of milliseconds elapsed since the last draw.\n */\n onPreUpdate(engine, elapsed) {\n // will be overridden\n }\n /**\n * Safe to override onPostUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPostUpdate` is called directly after a scene is updated.\n * @param engine reference to the engine\n * @param elapsed Number of milliseconds elapsed since the last draw.\n */\n onPostUpdate(engine, elapsed) {\n // will be overridden\n }\n /**\n * Safe to override onPreDraw lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPreDraw` is called directly before a scene is drawn.\n *\n */\n onPreDraw(ctx, elapsed) {\n // will be overridden\n }\n /**\n * Safe to override onPostDraw lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPostDraw` is called directly after a scene is drawn.\n *\n */\n onPostDraw(ctx, elapsed) {\n // will be overridden\n }\n /**\n * Initializes actors in the scene\n */\n _initializeChildren() {\n for (const child of this.entities) {\n child._initialize(this.engine);\n }\n }\n /**\n * Gets whether or not the {@apilink Scene} has been initialized\n */\n get isInitialized() {\n return this._isInitialized;\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Initializes the scene before the first update, meant to be called by engine not by users of\n * Excalibur\n * @internal\n */\n async _initialize(engine) {\n var _a;\n if (!this.isInitialized) {\n try {\n this.engine = engine;\n // PhysicsWorld config is watched so things will automagically update\n this.physics.config = this.engine.physics;\n this.input = new _Input_InputHost__WEBPACK_IMPORTED_MODULE_17__.InputHost({\n pointerTarget: engine.pointerScope === _Input_PointerScope__WEBPACK_IMPORTED_MODULE_18__.PointerScope.Canvas ? engine.canvas : document,\n grabWindowFocus: engine.grabWindowFocus,\n engine\n });\n // Initialize camera first\n this.camera._initialize(engine);\n this.world.systemManager.initialize();\n // This order is important! we want to be sure any custom init that add actors\n // fire before the actor init\n await this.onInitialize(engine);\n this._initializeChildren();\n this._logger.debug('Scene.onInitialize', this, engine);\n this.events.emit('initialize', new _Events__WEBPACK_IMPORTED_MODULE_19__.InitializeEvent(engine, this));\n }\n catch (e) {\n this._logger.error(`Error during scene initialization for scene ${(_a = engine.director) === null || _a === void 0 ? void 0 : _a.getSceneName(this)}!`);\n throw e;\n }\n this._isInitialized = true;\n }\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Activates the scene with the base behavior, then calls the overridable `onActivate` implementation.\n * @internal\n */\n async _activate(context) {\n var _a, _b;\n try {\n this._logger.debug('Scene.onActivate', this);\n this.input.toggleEnabled(true);\n await this.onActivate(context);\n }\n catch (e) {\n this._logger.error(`Error during scene activation for scene ${(_b = (_a = this.engine) === null || _a === void 0 ? void 0 : _a.director) === null || _b === void 0 ? void 0 : _b.getSceneName(this)}!`);\n throw e;\n }\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Deactivates the scene with the base behavior, then calls the overridable `onDeactivate` implementation.\n * @internal\n */\n async _deactivate(context) {\n this._logger.debug('Scene.onDeactivate', this);\n this.input.toggleEnabled(false);\n await this.onDeactivate(context);\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _preupdate handler for {@apilink onPreUpdate} lifecycle event\n * @internal\n */\n _preupdate(engine, elapsed) {\n this.emit('preupdate', new _Events__WEBPACK_IMPORTED_MODULE_19__.PreUpdateEvent(engine, elapsed, this));\n this.onPreUpdate(engine, elapsed);\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _preupdate handler for {@apilink onPostUpdate} lifecycle event\n * @internal\n */\n _postupdate(engine, elapsed) {\n this.emit('postupdate', new _Events__WEBPACK_IMPORTED_MODULE_19__.PostUpdateEvent(engine, elapsed, this));\n this.onPostUpdate(engine, elapsed);\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _predraw handler for {@apilink onPreDraw} lifecycle event\n * @internal\n */\n _predraw(ctx, elapsed) {\n this.emit('predraw', new _Events__WEBPACK_IMPORTED_MODULE_19__.PreDrawEvent(ctx, elapsed, this));\n this.onPreDraw(ctx, elapsed);\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _postdraw handler for {@apilink onPostDraw} lifecycle event\n * @internal\n */\n _postdraw(ctx, elapsed) {\n this.emit('postdraw', new _Events__WEBPACK_IMPORTED_MODULE_19__.PostDrawEvent(ctx, elapsed, this));\n this.onPostDraw(ctx, elapsed);\n }\n /**\n * Updates all the actors and timers in the scene. Called by the {@apilink Engine}.\n * @param engine Reference to the current Engine\n * @param elapsed The number of milliseconds since the last update\n */\n update(engine, elapsed) {\n var _a;\n if (!this.isInitialized) {\n this._logger.warnOnce(`Scene update called before initialize for scene ${(_a = engine.director) === null || _a === void 0 ? void 0 : _a.getSceneName(this)}!`);\n return;\n }\n this._preupdate(engine, elapsed);\n // TODO differed entity removal for timers\n let i, len;\n // Remove timers in the cancel queue before updating them\n for (i = 0, len = this._cancelQueue.length; i < len; i++) {\n this.removeTimer(this._cancelQueue[i]);\n }\n this._cancelQueue.length = 0;\n // Cycle through timers updating timers\n for (const timer of this._timers) {\n timer.update(elapsed);\n }\n this.world.update(_EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_20__.SystemType.Update, elapsed);\n // Camera last keeps renders smooth that are based on entity/actor\n if (this.camera) {\n this.camera.update(engine, elapsed);\n }\n this._collectActorStats(engine);\n this._postupdate(engine, elapsed);\n this.input.update();\n }\n /**\n * Draws all the actors in the Scene. Called by the {@apilink Engine}.\n * @param ctx The current rendering context\n * @param elapsed The number of milliseconds since the last draw\n */\n draw(ctx, elapsed) {\n var _a;\n if (!this.isInitialized) {\n this._logger.warnOnce(`Scene draw called before initialize!`);\n return;\n }\n this._predraw(ctx, elapsed);\n this.world.update(_EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_20__.SystemType.Draw, elapsed);\n if ((_a = this.engine) === null || _a === void 0 ? void 0 : _a.isDebug) {\n this.debugDraw(ctx);\n }\n this._postdraw(ctx, elapsed);\n }\n /**\n * Draws all the actors' debug information in the Scene. Called by the {@apilink Engine}.\n * @param ctx The current rendering context\n */\n /* istanbul ignore next */\n debugDraw(ctx) {\n this.emit('predebugdraw', new _Events__WEBPACK_IMPORTED_MODULE_19__.PreDebugDrawEvent(ctx, this));\n // pass\n this.emit('postdebugdraw', new _Events__WEBPACK_IMPORTED_MODULE_19__.PostDebugDrawEvent(ctx, this));\n }\n /**\n * Checks whether an actor is contained in this scene or not\n */\n contains(actor) {\n return this.actors.indexOf(actor) > -1;\n }\n add(entity) {\n this.emit('entityadded', { target: entity });\n this.world.add(entity);\n entity.scene = this;\n if (entity instanceof _Timer__WEBPACK_IMPORTED_MODULE_21__.Timer) {\n if (!_Util_Util__WEBPACK_IMPORTED_MODULE_22__.contains(this._timers, entity)) {\n this.addTimer(entity);\n }\n return;\n }\n }\n /**\n * Removes an {@apilink Entity} (Actor, TileMap, Trigger, etc) or {@apilink Timer} from it's current scene\n * and adds it to this scene.\n *\n * Useful if you want to have an object be present in only 1 scene at a time.\n * @param entity\n */\n transfer(entity) {\n let scene;\n if (entity instanceof _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_23__.Entity && entity.scene && entity.scene !== this) {\n scene = entity.scene;\n entity.scene.world.remove(entity, false);\n }\n if (entity instanceof _Timer__WEBPACK_IMPORTED_MODULE_21__.Timer && entity.scene) {\n scene = entity.scene;\n entity.scene.removeTimer(entity);\n }\n scene === null || scene === void 0 ? void 0 : scene.emit('entityremoved', { target: entity });\n this.add(entity);\n }\n remove(entity) {\n if (entity instanceof _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_23__.Entity) {\n this.emit('entityremoved', { target: entity });\n if (entity.isActive) {\n entity.kill();\n }\n this.world.remove(entity);\n }\n if (entity instanceof _Timer__WEBPACK_IMPORTED_MODULE_21__.Timer) {\n this.removeTimer(entity);\n }\n }\n /**\n * Removes all entities and timers from the scene, optionally indicate whether deferred should or shouldn't be used.\n *\n * By default entities use deferred removal\n * @param deferred\n */\n clear(deferred = true) {\n for (let i = this.entities.length - 1; i >= 0; i--) {\n this.world.remove(this.entities[i], deferred);\n }\n for (let i = this.timers.length - 1; i >= 0; i--) {\n this.removeTimer(this.timers[i]);\n }\n }\n /**\n * Adds a {@apilink Timer} to the scene\n * @param timer The timer to add\n */\n addTimer(timer) {\n this._timers.push(timer);\n timer.scene = this;\n return timer;\n }\n /**\n * Removes a {@apilink Timer} from the scene.\n * @warning Can be dangerous, use {@apilink cancelTimer} instead\n * @param timer The timer to remove\n */\n removeTimer(timer) {\n const i = this._timers.indexOf(timer);\n if (i !== -1) {\n this._timers.splice(i, 1);\n }\n return timer;\n }\n /**\n * Cancels a {@apilink Timer}, removing it from the scene nicely\n * @param timer The timer to cancel\n */\n cancelTimer(timer) {\n this._cancelQueue.push(timer);\n return timer;\n }\n /**\n * Tests whether a {@apilink Timer} is active in the scene\n */\n isTimerActive(timer) {\n return this._timers.indexOf(timer) > -1 && !timer.complete;\n }\n isCurrentScene() {\n if (this.engine) {\n return this.engine.currentScene === this;\n }\n return false;\n }\n _collectActorStats(engine) {\n const actors = this.actors;\n for (let i = 0; i < actors.length; i++) {\n const actor = actors[i];\n if (actor instanceof _ScreenElement__WEBPACK_IMPORTED_MODULE_24__.ScreenElement) {\n engine.stats.currFrame.actors.ui++;\n }\n engine.stats.currFrame.actors.alive++;\n for (let j = 0; j < actor.children.length; j++) {\n const child = actor.children[j];\n if ((0,_ScreenElement__WEBPACK_IMPORTED_MODULE_24__.isScreenElement)(child)) {\n // TODO not true\n engine.stats.currFrame.actors.ui++;\n }\n else {\n engine.stats.currFrame.actors.alive++;\n }\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Screen.ts\":\n/*!*******************!*\\\n !*** ./Screen.ts ***!\n \\*******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DisplayMode: () => (/* binding */ DisplayMode),\n/* harmony export */ Resolution: () => (/* binding */ Resolution),\n/* harmony export */ Screen: () => (/* binding */ Screen),\n/* harmony export */ ScreenEvents: () => (/* binding */ ScreenEvents)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Collision_Index__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Collision/Index */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Util/Util */ \"./Util/Util.ts\");\n/* harmony import */ var _Graphics_Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Graphics/Context/ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _Graphics_Context_ExcaliburGraphicsContext2DCanvas__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Graphics/Context/ExcaliburGraphicsContext2DCanvas */ \"./Graphics/Context/ExcaliburGraphicsContext2DCanvas.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n\n\n\n\n/**\n * Enum representing the different display modes available to Excalibur.\n */\nvar DisplayMode;\n(function (DisplayMode) {\n /**\n * Default, use a specified resolution for the game. Like 800x600 pixels for example.\n */\n DisplayMode[\"Fixed\"] = \"Fixed\";\n /**\n * Fit the aspect ratio given by the game resolution within the container at all times will fill any gaps with canvas.\n * The displayed area outside the aspect ratio is not guaranteed to be on the screen, only the {@apilink Screen.contentArea}\n * is guaranteed to be on screen.\n */\n DisplayMode[\"FitContainerAndFill\"] = \"FitContainerAndFill\";\n /**\n * Fit the aspect ratio given by the game resolution the screen at all times will fill the screen.\n * This displayed area outside the aspect ratio is not guaranteed to be on the screen, only the {@apilink Screen.contentArea}\n * is guaranteed to be on screen.\n */\n DisplayMode[\"FitScreenAndFill\"] = \"FitScreenAndFill\";\n /**\n * Fit the viewport to the parent element maintaining aspect ratio given by the game resolution, but zooms in to avoid the black bars\n * (letterbox) that would otherwise be present in {@apilink FitContainer}.\n *\n * **warning** This will clip some drawable area from the user because of the zoom,\n * use {@apilink Screen.contentArea} to know the safe to draw area.\n */\n DisplayMode[\"FitContainerAndZoom\"] = \"FitContainerAndZoom\";\n /**\n * Fit the viewport to the device screen maintaining aspect ratio given by the game resolution, but zooms in to avoid the black bars\n * (letterbox) that would otherwise be present in {@apilink FitScreen}.\n *\n * **warning** This will clip some drawable area from the user because of the zoom,\n * use {@apilink Screen.contentArea} to know the safe to draw area.\n */\n DisplayMode[\"FitScreenAndZoom\"] = \"FitScreenAndZoom\";\n /**\n * Fit to screen using as much space as possible while maintaining aspect ratio and resolution.\n * This is not the same as {@apilink Screen.goFullScreen} but behaves in a similar way maintaining aspect ratio.\n *\n * You may want to center your game here is an example\n * ```html\n * \n * \n *
\n * \n *
\n * \n * ```\n *\n * ```css\n * // css\n * main {\n * display: flex;\n * align-items: center;\n * justify-content: center;\n * height: 100%;\n * width: 100%;\n * }\n * ```\n */\n DisplayMode[\"FitScreen\"] = \"FitScreen\";\n /**\n * Fill the entire screen's css width/height for the game resolution dynamically. This means the resolution of the game will\n * change dynamically as the window is resized. This is not the same as {@apilink Screen.goFullScreen}\n */\n DisplayMode[\"FillScreen\"] = \"FillScreen\";\n /**\n * Fit to parent element width/height using as much space as possible while maintaining aspect ratio and resolution.\n */\n DisplayMode[\"FitContainer\"] = \"FitContainer\";\n /**\n * Use the parent DOM container's css width/height for the game resolution dynamically\n */\n DisplayMode[\"FillContainer\"] = \"FillContainer\";\n})(DisplayMode || (DisplayMode = {}));\n/**\n * Convenience class for quick resolutions\n * Mostly sourced from https://emulation.gametechwiki.com/index.php/Resolution\n */\nclass Resolution {\n /* istanbul ignore next */\n static get SVGA() {\n return { width: 800, height: 600 };\n }\n /* istanbul ignore next */\n static get Standard() {\n return { width: 1920, height: 1080 };\n }\n /* istanbul ignore next */\n static get Atari2600() {\n return { width: 160, height: 192 };\n }\n /* istanbul ignore next */\n static get GameBoy() {\n return { width: 160, height: 144 };\n }\n /* istanbul ignore next */\n static get GameBoyAdvance() {\n return { width: 240, height: 160 };\n }\n /* istanbul ignore next */\n static get NintendoDS() {\n return { width: 256, height: 192 };\n }\n /* istanbul ignore next */\n static get NES() {\n return { width: 256, height: 224 };\n }\n /* istanbul ignore next */\n static get SNES() {\n return { width: 256, height: 244 };\n }\n}\nconst ScreenEvents = {\n ScreenResize: 'resize',\n PixelRatioChange: 'pixelratio',\n FullScreenChange: 'fullscreen'\n};\n/**\n * The Screen handles all aspects of interacting with the screen for Excalibur.\n */\nclass Screen {\n constructor(options) {\n var _a, _b, _c, _d;\n /**\n * Listen to screen events {@apilink ScreenEvents}\n */\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n this._antialiasing = true;\n this._canvasImageRendering = 'auto';\n this._resolutionStack = [];\n this._viewportStack = [];\n this._pixelRatioOverride = null;\n this._isFullscreen = false;\n this._isDisposed = false;\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this._fullscreenChangeHandler = () => {\n if (this._isDisposed) {\n return;\n }\n this._isFullscreen = !this._isFullscreen;\n this._logger.debug('Fullscreen Change', this._isFullscreen);\n this.events.emit('fullscreen', {\n fullscreen: this.isFullScreen\n });\n };\n this._pixelRatioChangeHandler = () => {\n if (this._isDisposed) {\n return;\n }\n this._logger.debug('Pixel Ratio Change', window.devicePixelRatio);\n this._listenForPixelRatio();\n this._devicePixelRatio = this._calculateDevicePixelRatio();\n this.applyResolutionAndViewport();\n this.events.emit('pixelratio', {\n pixelRatio: this.pixelRatio\n });\n };\n this._resizeHandler = () => {\n if (this._isDisposed) {\n return;\n }\n const parent = this.parent;\n this._logger.debug('View port resized');\n this._setResolutionAndViewportByDisplayMode(parent);\n this.applyResolutionAndViewport();\n // Emit resize event\n this.events.emit('resize', {\n resolution: this.resolution,\n viewport: this.viewport\n });\n };\n // Asking the window.devicePixelRatio is expensive we do it once\n this._devicePixelRatio = this._calculateDevicePixelRatio();\n this._contentArea = new _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox();\n this._unsafeArea = new _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox();\n this.viewport = options.viewport;\n this.resolution = (_a = options.resolution) !== null && _a !== void 0 ? _a : { ...this.viewport };\n this._contentResolution = this.resolution;\n this._displayMode = (_b = options.displayMode) !== null && _b !== void 0 ? _b : DisplayMode.Fixed;\n this._canvas = options.canvas;\n this.graphicsContext = options.context;\n this._antialiasing = (_c = options.antialiasing) !== null && _c !== void 0 ? _c : this._antialiasing;\n this._canvasImageRendering = (_d = options.canvasImageRendering) !== null && _d !== void 0 ? _d : this._canvasImageRendering;\n this._browser = options.browser;\n this._pixelRatioOverride = options.pixelRatio;\n this._applyDisplayMode();\n this._listenForPixelRatio();\n this._canvas.addEventListener('fullscreenchange', this._fullscreenChangeHandler);\n this.applyResolutionAndViewport();\n }\n _listenForPixelRatio() {\n if (this._mediaQueryList && !this._mediaQueryList.addEventListener) {\n // Safari <=13.1 workaround, remove any existing handlers\n this._mediaQueryList.removeListener(this._pixelRatioChangeHandler);\n }\n this._mediaQueryList = this._browser.window.nativeComponent.matchMedia(`(resolution: ${window.devicePixelRatio}dppx)`);\n // Safari <=13.1 workaround\n if (this._mediaQueryList.addEventListener) {\n this._mediaQueryList.addEventListener('change', this._pixelRatioChangeHandler, { once: true });\n }\n else {\n this._mediaQueryList.addListener(this._pixelRatioChangeHandler);\n }\n }\n dispose() {\n if (!this._isDisposed) {\n // Clean up handlers\n this._isDisposed = true;\n this.events.clear();\n this._browser.window.off('resize', this._resizeHandler);\n this._browser.window.clear();\n if (this._resizeObserver) {\n this._resizeObserver.disconnect();\n }\n this.parent.removeEventListener('resize', this._resizeHandler);\n // Safari <=13.1 workaround\n if (this._mediaQueryList.removeEventListener) {\n this._mediaQueryList.removeEventListener('change', this._pixelRatioChangeHandler);\n }\n else {\n this._mediaQueryList.removeListener(this._pixelRatioChangeHandler);\n }\n this._canvas.removeEventListener('fullscreenchange', this._fullscreenChangeHandler);\n this._canvas = null;\n }\n }\n _calculateDevicePixelRatio() {\n if (window.devicePixelRatio < 1) {\n return 1;\n }\n const devicePixelRatio = window.devicePixelRatio || 1;\n return devicePixelRatio;\n }\n /**\n * Returns the computed pixel ratio, first using any override, then the device pixel ratio\n */\n get pixelRatio() {\n if (this._pixelRatioOverride) {\n return this._pixelRatioOverride;\n }\n return this._devicePixelRatio;\n }\n /**\n * This calculates the ratio between excalibur pixels and the HTML pixels.\n *\n * This is useful for scaling HTML UI so that it matches your game.\n */\n get worldToPagePixelRatio() {\n if (this._canvas) {\n const pageOrigin = this.worldToPageCoordinates(_Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero);\n const pageDistance = this.worldToPageCoordinates((0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(1, 0)).sub(pageOrigin);\n const pixelConversion = pageDistance.x;\n return pixelConversion;\n }\n else {\n return 1;\n }\n }\n /**\n * Get or set the pixel ratio override\n *\n * You will need to call applyResolutionAndViewport() affect change on the screen\n */\n get pixelRatioOverride() {\n return this._pixelRatioOverride;\n }\n set pixelRatioOverride(value) {\n this._pixelRatioOverride = value;\n }\n get isHiDpi() {\n return this.pixelRatio !== 1;\n }\n get displayMode() {\n return this._displayMode;\n }\n get canvas() {\n return this._canvas;\n }\n get parent() {\n switch (this.displayMode) {\n case DisplayMode.FillContainer:\n case DisplayMode.FitContainer:\n case DisplayMode.FitContainerAndFill:\n case DisplayMode.FitContainerAndZoom:\n return this.canvas.parentElement || document.body;\n default:\n return window;\n }\n }\n get resolution() {\n return this._resolution;\n }\n set resolution(resolution) {\n this._resolution = resolution;\n }\n /**\n * Returns screen dimensions in pixels or percentage\n */\n get viewport() {\n if (this._viewport) {\n return this._viewport;\n }\n return this._resolution;\n }\n set viewport(viewport) {\n this._viewport = viewport;\n }\n get aspectRatio() {\n return this._resolution.width / this._resolution.height;\n }\n get scaledWidth() {\n return this._resolution.width * this.pixelRatio;\n }\n get scaledHeight() {\n return this._resolution.height * this.pixelRatio;\n }\n setCurrentCamera(camera) {\n this._camera = camera;\n }\n pushResolutionAndViewport() {\n this._resolutionStack.push(this.resolution);\n this._viewportStack.push(this.viewport);\n this.resolution = { ...this.resolution };\n this.viewport = { ...this.viewport };\n }\n peekViewport() {\n return this._viewportStack[this._viewportStack.length - 1];\n }\n peekResolution() {\n return this._resolutionStack[this._resolutionStack.length - 1];\n }\n popResolutionAndViewport() {\n if (this._resolutionStack.length && this._viewportStack.length) {\n this.resolution = this._resolutionStack.pop();\n this.viewport = this._viewportStack.pop();\n }\n }\n applyResolutionAndViewport() {\n if (this.graphicsContext instanceof _Graphics_Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_4__.ExcaliburGraphicsContextWebGL) {\n const scaledResolutionSupported = this.graphicsContext.checkIfResolutionSupported({\n width: this.scaledWidth,\n height: this.scaledHeight\n });\n if (!scaledResolutionSupported) {\n this._logger.warnOnce(`The currently configured resolution (${this.resolution.width}x${this.resolution.height}) and pixel ratio (${this.pixelRatio})` +\n ' are too large for the platform WebGL implementation, this may work but cause WebGL rendering to behave oddly.' +\n ' Try reducing the resolution or disabling Hi DPI scaling to avoid this' +\n ' (read more here https://excaliburjs.com/docs/screens#understanding-viewport--resolution).');\n // Attempt to recover if the user hasn't configured a specific ratio for up scaling\n if (!this.pixelRatioOverride) {\n let currentPixelRatio = Math.max(1, this.pixelRatio - 0.5);\n let newResolutionSupported = false;\n while (currentPixelRatio > 1 && !newResolutionSupported) {\n currentPixelRatio = Math.max(1, currentPixelRatio - 0.5);\n const width = this._resolution.width * currentPixelRatio;\n const height = this._resolution.height * currentPixelRatio;\n newResolutionSupported = this.graphicsContext.checkIfResolutionSupported({ width, height });\n }\n this.pixelRatioOverride = currentPixelRatio;\n this._logger.warnOnce('Scaled resolution too big attempted recovery!' +\n ` Pixel ratio was automatically reduced to (${this.pixelRatio}) to avoid 4k texture limit.` +\n ' Setting `ex.Engine({pixelRatio: ...}) will override any automatic recalculation, do so at your own risk.` ' +\n ' (read more here https://excaliburjs.com/docs/screens#understanding-viewport--resolution).');\n }\n }\n }\n this._canvas.width = this.scaledWidth;\n this._canvas.height = this.scaledHeight;\n if (this._canvasImageRendering === 'auto') {\n this._canvas.style.imageRendering = 'auto';\n }\n else {\n this._canvas.style.imageRendering = 'pixelated';\n // Fall back to 'crisp-edges' if 'pixelated' is not supported\n // Currently for firefox https://developer.mozilla.org/en-US/docs/Web/CSS/image-rendering\n if (this._canvas.style.imageRendering === '') {\n this._canvas.style.imageRendering = 'crisp-edges';\n }\n }\n const widthUnit = this.viewport.widthUnit === 'percent' ? '%' : 'px';\n const heightUnit = this.viewport.heightUnit === 'percent' ? '%' : 'px';\n this._canvas.style.width = this.viewport.width + widthUnit;\n this._canvas.style.height = this.viewport.height + heightUnit;\n // After messing with the canvas width/height the graphics context is invalidated and needs to have some properties reset\n this.graphicsContext.updateViewport(this.resolution);\n this.graphicsContext.resetTransform();\n this.graphicsContext.smoothing = this._antialiasing;\n if (this.graphicsContext instanceof _Graphics_Context_ExcaliburGraphicsContext2DCanvas__WEBPACK_IMPORTED_MODULE_5__.ExcaliburGraphicsContext2DCanvas) {\n this.graphicsContext.scale(this.pixelRatio, this.pixelRatio);\n }\n // Add the excalibur world pixel to page pixel\n document.documentElement.style.setProperty('--ex-pixel-ratio', this.worldToPagePixelRatio.toString());\n }\n /**\n * Get or set screen antialiasing,\n *\n * If true smoothing is applied\n */\n get antialiasing() {\n return this._antialiasing;\n }\n /**\n * Get or set screen antialiasing\n */\n set antialiasing(isSmooth) {\n this._antialiasing = isSmooth;\n this.graphicsContext.smoothing = this._antialiasing;\n }\n /**\n * Returns true if excalibur is fullscreen using the browser fullscreen api\n * @deprecated use isFullscreen()\n */\n get isFullScreen() {\n return this._isFullscreen;\n }\n /**\n * Returns true if excalibur is fullscreen using the browser fullscreen api\n */\n get isFullscreen() {\n return this._isFullscreen;\n }\n /**\n * Requests to go fullscreen using the browser fullscreen api, requires user interaction to be successful.\n * For example, wire this to a user click handler.\n *\n * Optionally specify a target element id to go fullscreen, by default the game canvas is used\n * @param elementId\n * @deprecated use enterFullscreen(...)\n */\n goFullScreen(elementId) {\n return this.enterFullscreen(elementId);\n }\n /**\n * Requests to enter fullscreen using the browser fullscreen api, requires user interaction to be successful.\n * For example, wire this to a user click handler.\n *\n * Optionally specify a target element id to go fullscreen, by default the game canvas is used\n * @param elementId\n */\n enterFullscreen(elementId) {\n if (elementId) {\n const maybeElement = document.getElementById(elementId);\n if (maybeElement) {\n if (!maybeElement.getAttribute('ex-fullscreen-listener')) {\n maybeElement.setAttribute('ex-fullscreen-listener', 'true');\n maybeElement.addEventListener('fullscreenchange', this._fullscreenChangeHandler);\n }\n const fullscreenPromise = maybeElement.requestFullscreen();\n return fullscreenPromise;\n }\n }\n return this._canvas.requestFullscreen();\n }\n /**\n * Requests to exit fullscreen using the browser fullscreen api\n * @deprecated use exitFullscreen()\n */\n exitFullScreen() {\n return this.exitFullscreen();\n }\n exitFullscreen() {\n return document.exitFullscreen();\n }\n _viewportToPixels(viewport) {\n return {\n width: viewport.widthUnit === 'percent' ? this.canvas.offsetWidth : viewport.width,\n height: viewport.heightUnit === 'percent' ? this.canvas.offsetHeight : viewport.height\n };\n }\n /**\n * Takes a coordinate in normal html page space, for example from a pointer move event, and translates it to\n * Excalibur screen space.\n *\n * Excalibur screen space starts at the top left (0, 0) corner of the viewport, and extends to the\n * bottom right corner (resolutionX, resolutionY). When using *AndFill suffixed display modes screen space\n * (0, 0) is the top left of the safe content area bounding box not the viewport.\n * @param point\n */\n pageToScreenCoordinates(point) {\n let newX = point.x;\n let newY = point.y;\n if (!this._isFullscreen) {\n newX -= (0,_Util_Util__WEBPACK_IMPORTED_MODULE_6__.getPosition)(this._canvas).x;\n newY -= (0,_Util_Util__WEBPACK_IMPORTED_MODULE_6__.getPosition)(this._canvas).y;\n }\n const viewport = this._viewportToPixels(this.viewport);\n // if fullscreen api on it centers with black bars\n // we need to adjust the screen to world coordinates in this case\n if (this._isFullscreen) {\n if (window.innerWidth / this.aspectRatio < window.innerHeight) {\n const screenHeight = window.innerWidth / this.aspectRatio;\n const screenMarginY = (window.innerHeight - screenHeight) / 2;\n newY = ((newY - screenMarginY) / screenHeight) * viewport.height;\n newX = (newX / window.innerWidth) * viewport.width;\n }\n else {\n const screenWidth = window.innerHeight * this.aspectRatio;\n const screenMarginX = (window.innerWidth - screenWidth) / 2;\n newX = ((newX - screenMarginX) / screenWidth) * viewport.width;\n newY = (newY / window.innerHeight) * viewport.height;\n }\n }\n newX = (newX / viewport.width) * this.resolution.width;\n newY = (newY / viewport.height) * this.resolution.height;\n // offset by content area\n newX = newX - this.contentArea.left;\n newY = newY - this.contentArea.top;\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(newX, newY);\n }\n /**\n * Takes a coordinate in Excalibur screen space, and translates it to normal html page space. For example,\n * this is where html elements might live if you want to position them relative to Excalibur.\n *\n * Excalibur screen space starts at the top left (0, 0) corner of the viewport, and extends to the\n * bottom right corner (resolutionX, resolutionY)\n * @param point\n */\n screenToPageCoordinates(point) {\n let newX = point.x;\n let newY = point.y;\n // no need to offset by content area, drawing is already offset by this\n const viewport = this._viewportToPixels(this.viewport);\n newX = (newX / this.resolution.width) * viewport.width;\n newY = (newY / this.resolution.height) * viewport.height;\n if (this._isFullscreen) {\n if (window.innerWidth / this.aspectRatio < window.innerHeight) {\n const screenHeight = window.innerWidth / this.aspectRatio;\n const screenMarginY = (window.innerHeight - screenHeight) / 2;\n newY = (newY / viewport.height) * screenHeight + screenMarginY;\n newX = (newX / viewport.width) * window.innerWidth;\n }\n else {\n const screenWidth = window.innerHeight * this.aspectRatio;\n const screenMarginX = (window.innerWidth - screenWidth) / 2;\n newX = (newX / viewport.width) * screenWidth + screenMarginX;\n newY = (newY / viewport.height) * window.innerHeight;\n }\n }\n if (!this._isFullscreen) {\n newX += (0,_Util_Util__WEBPACK_IMPORTED_MODULE_6__.getPosition)(this._canvas).x;\n newY += (0,_Util_Util__WEBPACK_IMPORTED_MODULE_6__.getPosition)(this._canvas).y;\n }\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(newX, newY);\n }\n /**\n * Takes a coordinate in Excalibur screen space, and translates it to Excalibur world space.\n *\n * World space is where {@apilink Entity | `entities`} in Excalibur live by default {@apilink CoordPlane.World}\n * and extends infinitely out relative from the {@apilink Camera}.\n * @param point Screen coordinate to convert\n */\n screenToWorldCoordinates(point) {\n // offset by content area\n point = point.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this.contentArea.left, this.contentArea.top));\n // the only difference between screen & world is the camera transform\n if (this._camera) {\n return this._camera.inverse.multiply(point);\n }\n return point.sub((0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this.resolution.width / 2, this.resolution.height / 2));\n }\n /**\n * Takes a coordinate in Excalibur world space, and translates it to Excalibur screen space.\n *\n * Screen space is where {@apilink ScreenElement | `screen elements`} and {@apilink Entity | `entities`} with {@apilink CoordPlane.Screen} live.\n * @param point World coordinate to convert\n */\n worldToScreenCoordinates(point) {\n if (this._camera) {\n return this._camera.transform.multiply(point);\n }\n return point.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this.resolution.width / 2, this.resolution.height / 2));\n }\n pageToWorldCoordinates(point) {\n const screen = this.pageToScreenCoordinates(point);\n return this.screenToWorldCoordinates(screen);\n }\n worldToPageCoordinates(point) {\n const screen = this.worldToScreenCoordinates(point);\n return this.screenToPageCoordinates(screen);\n }\n /**\n * Returns a BoundingBox of the top left corner of the screen\n * and the bottom right corner of the screen.\n *\n * World bounds are in world coordinates, useful for culling objects offscreen that are in world space\n */\n getWorldBounds() {\n const bounds = _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromDimension(this.resolution.width, this.resolution.height, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Half)\n .scale((0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(1 / this._camera.zoom, 1 / this._camera.zoom))\n .rotate(this._camera.rotation)\n .translate(this._camera.drawPos);\n return bounds;\n }\n /**\n * Returns a BoundingBox of the top left corner of the screen and the bottom right corner of the screen.\n *\n * Screen bounds are in screen coordinates, useful for culling objects offscreen that are in screen space\n */\n getScreenBounds() {\n const bounds = _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromDimension(this.resolution.width, this.resolution.height, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero);\n return bounds;\n }\n /**\n * The width of the game canvas in pixels (physical width component of the\n * resolution of the canvas element)\n */\n get canvasWidth() {\n return this.canvas.width;\n }\n /**\n * Returns half width of the game canvas in pixels (half physical width component)\n */\n get halfCanvasWidth() {\n return this.canvas.width / 2;\n }\n /**\n * The height of the game canvas in pixels, (physical height component of\n * the resolution of the canvas element)\n */\n get canvasHeight() {\n return this.canvas.height;\n }\n /**\n * Returns half height of the game canvas in pixels (half physical height component)\n */\n get halfCanvasHeight() {\n return this.canvas.height / 2;\n }\n /**\n * Returns the width of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get drawWidth() {\n if (this._camera) {\n return this.resolution.width / this._camera.zoom;\n }\n return this.resolution.width;\n }\n /**\n * Returns the width of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get width() {\n if (this._camera) {\n return this.resolution.width / this._camera.zoom;\n }\n return this.resolution.width;\n }\n /**\n * Returns half the width of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get halfDrawWidth() {\n return this.drawWidth / 2;\n }\n /**\n * Returns the height of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get drawHeight() {\n if (this._camera) {\n return this.resolution.height / this._camera.zoom;\n }\n return this.resolution.height;\n }\n get height() {\n if (this._camera) {\n return this.resolution.height / this._camera.zoom;\n }\n return this.resolution.height;\n }\n /**\n * Returns half the height of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get halfDrawHeight() {\n return this.drawHeight / 2;\n }\n /**\n * Returns screen center coordinates including zoom and device pixel ratio.\n */\n get center() {\n return (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this.halfDrawWidth, this.halfDrawHeight);\n }\n /**\n * Returns the content area in screen space where it is safe to place content\n */\n get contentArea() {\n return this._contentArea;\n }\n /**\n * Returns the unsafe area in screen space, this is the full screen and some space may not be onscreen.\n */\n get unsafeArea() {\n return this._unsafeArea;\n }\n _computeFit() {\n document.body.style.margin = '0px';\n document.body.style.overflow = 'hidden';\n const aspect = this.aspectRatio;\n let adjustedWidth = 0;\n let adjustedHeight = 0;\n if (window.innerWidth / aspect < window.innerHeight) {\n adjustedWidth = window.innerWidth;\n adjustedHeight = window.innerWidth / aspect;\n }\n else {\n adjustedWidth = window.innerHeight * aspect;\n adjustedHeight = window.innerHeight;\n }\n this.viewport = {\n width: adjustedWidth,\n height: adjustedHeight\n };\n this._contentArea = _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromDimension(this.resolution.width, this.resolution.height, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero);\n this._unsafeArea = _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromDimension(this.resolution.width, this.resolution.height, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero);\n this.events.emit('resize', {\n resolution: this.resolution,\n viewport: this.viewport\n });\n }\n _computeFitScreenAndFill() {\n document.body.style.margin = '0px';\n document.body.style.overflow = 'hidden';\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n this._computeFitAndFill(vw, vh);\n this.events.emit('resize', {\n resolution: this.resolution,\n viewport: this.viewport\n });\n }\n _computeFitContainerAndFill() {\n this.canvas.style.width = '100%';\n this.canvas.style.height = '100%';\n this._computeFitAndFill(this.canvas.offsetWidth, this.canvas.offsetHeight, {\n width: 100,\n widthUnit: 'percent',\n height: 100,\n heightUnit: 'percent'\n });\n this.events.emit('resize', {\n resolution: this.resolution,\n viewport: this.viewport\n });\n }\n _computeFitAndFill(vw, vh, viewport) {\n this.viewport = viewport !== null && viewport !== void 0 ? viewport : {\n width: vw,\n height: vh\n };\n // if the current screen aspectRatio is less than the original aspectRatio\n if (vw / vh <= this._contentResolution.width / this._contentResolution.height) {\n // compute new resolution to match the original aspect ratio\n this.resolution = {\n width: (vw * this._contentResolution.width) / vw,\n height: (((vw * this._contentResolution.width) / vw) * vh) / vw\n };\n const clip = (this.resolution.height - this._contentResolution.height) / 2;\n this._contentArea = new _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox({\n top: clip,\n left: 0,\n right: this._contentResolution.width,\n bottom: this.resolution.height - clip\n });\n this._unsafeArea = new _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox({\n top: -clip,\n left: 0,\n right: this._contentResolution.width,\n bottom: this.resolution.height + clip\n });\n }\n else {\n this.resolution = {\n width: (((vh * this._contentResolution.height) / vh) * vw) / vh,\n height: (vh * this._contentResolution.height) / vh\n };\n const clip = (this.resolution.width - this._contentResolution.width) / 2;\n this._contentArea = new _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox({\n top: 0,\n left: clip,\n right: this.resolution.width - clip,\n bottom: this._contentResolution.height\n });\n this._unsafeArea = new _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox({\n top: 0,\n left: -clip,\n right: this.resolution.width + clip,\n bottom: this._contentResolution.height\n });\n }\n }\n _computeFitScreenAndZoom() {\n document.body.style.margin = '0px';\n document.body.style.overflow = 'hidden';\n this.canvas.style.position = 'absolute';\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n this._computeFitAndZoom(vw, vh);\n this.events.emit('resize', {\n resolution: this.resolution,\n viewport: this.viewport\n });\n }\n _computeFitContainerAndZoom() {\n this.canvas.style.width = '100%';\n this.canvas.style.height = '100%';\n this.canvas.style.position = 'relative';\n const parent = this.canvas.parentElement;\n parent.style.overflow = 'hidden';\n const { offsetWidth: vw, offsetHeight: vh } = this.canvas;\n this._computeFitAndZoom(vw, vh);\n this.events.emit('resize', {\n resolution: this.resolution,\n viewport: this.viewport\n });\n }\n _computeFitAndZoom(vw, vh) {\n const aspect = this.aspectRatio;\n let adjustedWidth = 0;\n let adjustedHeight = 0;\n if (vw / aspect < vh) {\n adjustedWidth = vw;\n adjustedHeight = vw / aspect;\n }\n else {\n adjustedWidth = vh * aspect;\n adjustedHeight = vh;\n }\n const scaleX = vw / adjustedWidth;\n const scaleY = vh / adjustedHeight;\n const maxScaleFactor = Math.max(scaleX, scaleY);\n const zoomedWidth = adjustedWidth * maxScaleFactor;\n const zoomedHeight = adjustedHeight * maxScaleFactor;\n // Center zoomed dimension if bigger than the screen\n if (zoomedWidth > vw) {\n this.canvas.style.left = -(zoomedWidth - vw) / 2 + 'px';\n }\n else {\n this.canvas.style.left = '';\n }\n if (zoomedHeight > vh) {\n this.canvas.style.top = -(zoomedHeight - vh) / 2 + 'px';\n }\n else {\n this.canvas.style.top = '';\n }\n this.viewport = {\n width: zoomedWidth,\n height: zoomedHeight\n };\n const bounds = _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromDimension(this.viewport.width, this.viewport.height, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero);\n // return safe area\n if (this.viewport.width > vw) {\n const clip = ((this.viewport.width - vw) / this.viewport.width) * this.resolution.width;\n bounds.top = 0;\n bounds.left = clip / 2;\n bounds.right = this.resolution.width - clip / 2;\n bounds.bottom = this.resolution.height;\n }\n if (this.viewport.height > vh) {\n const clip = ((this.viewport.height - vh) / this.viewport.height) * this.resolution.height;\n bounds.top = clip / 2;\n bounds.left = 0;\n bounds.bottom = this.resolution.height - clip / 2;\n bounds.right = this.resolution.width;\n }\n this._contentArea = bounds;\n }\n _computeFitContainer() {\n const aspect = this.aspectRatio;\n let adjustedWidth = 0;\n let adjustedHeight = 0;\n let widthUnit = 'pixel';\n let heightUnit = 'pixel';\n const parent = this.canvas.parentElement;\n if (parent.clientWidth / aspect < parent.clientHeight) {\n this.canvas.style.width = '100%';\n adjustedWidth = 100;\n widthUnit = 'percent';\n adjustedHeight = this.canvas.offsetWidth / aspect;\n }\n else {\n this.canvas.style.height = '100%';\n adjustedHeight = 100;\n heightUnit = 'percent';\n adjustedWidth = this.canvas.offsetHeight * aspect;\n }\n this.viewport = {\n width: adjustedWidth,\n widthUnit,\n height: adjustedHeight,\n heightUnit\n };\n this._contentArea = _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromDimension(this.resolution.width, this.resolution.height, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero);\n this.events.emit('resize', {\n resolution: this.resolution,\n viewport: this.viewport\n });\n }\n _applyDisplayMode() {\n this._setResolutionAndViewportByDisplayMode(this.parent);\n // watch resizing\n if (this.parent instanceof Window) {\n this._browser.window.on('resize', this._resizeHandler);\n }\n else {\n this._resizeObserver = new ResizeObserver(() => {\n this._resizeHandler();\n });\n this._resizeObserver.observe(this.parent);\n }\n this.parent.addEventListener('resize', this._resizeHandler);\n }\n /**\n * Sets the resolution and viewport based on the selected display mode.\n */\n _setResolutionAndViewportByDisplayMode(parent) {\n if (this.displayMode === DisplayMode.FillContainer) {\n this.canvas.style.width = '100%';\n this.canvas.style.height = '100%';\n this.viewport = {\n width: 100,\n widthUnit: 'percent',\n height: 100,\n heightUnit: 'percent'\n };\n this.resolution = {\n width: this.canvas.offsetWidth,\n height: this.canvas.offsetHeight\n };\n }\n if (this.displayMode === DisplayMode.FillScreen) {\n document.body.style.margin = '0px';\n document.body.style.overflow = 'hidden';\n this.resolution = {\n width: parent.innerWidth,\n height: parent.innerHeight\n };\n this.viewport = this.resolution;\n }\n this._contentArea = _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromDimension(this.resolution.width, this.resolution.height, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero);\n if (this.displayMode === DisplayMode.FitScreen) {\n this._computeFit();\n }\n if (this.displayMode === DisplayMode.FitContainer) {\n this._computeFitContainer();\n }\n if (this.displayMode === DisplayMode.FitScreenAndFill) {\n this._computeFitScreenAndFill();\n }\n if (this.displayMode === DisplayMode.FitContainerAndFill) {\n this._computeFitContainerAndFill();\n }\n if (this.displayMode === DisplayMode.FitScreenAndZoom) {\n this._computeFitScreenAndZoom();\n }\n if (this.displayMode === DisplayMode.FitContainerAndZoom) {\n this._computeFitContainerAndZoom();\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./ScreenElement.ts\":\n/*!**************************!*\\\n !*** ./ScreenElement.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ScreenElement: () => (/* binding */ ScreenElement),\n/* harmony export */ isScreenElement: () => (/* binding */ isScreenElement)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Actor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Actor */ \"./Actor.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Collision/CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Math/coord-plane */ \"./Math/coord-plane.ts\");\n\n\n\n\n\n/**\n * Type guard to detect a screen element\n */\nfunction isScreenElement(actor) {\n return actor instanceof ScreenElement;\n}\n/**\n * Helper {@apilink Actor} primitive for drawing UI's, optimized for UI drawing. Does\n * not participate in collisions. Drawn on top of all other actors.\n */\nclass ScreenElement extends _Actor__WEBPACK_IMPORTED_MODULE_0__.Actor {\n constructor(config) {\n var _a, _b;\n super({ ...config });\n this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).coordPlane = _Math_coord_plane__WEBPACK_IMPORTED_MODULE_2__.CoordPlane.Screen;\n this.anchor = (_a = config === null || config === void 0 ? void 0 : config.anchor) !== null && _a !== void 0 ? _a : (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(0, 0);\n this.body.collisionType = (_b = config === null || config === void 0 ? void 0 : config.collisionType) !== null && _b !== void 0 ? _b : _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.PreventCollision;\n this.pointer.useGraphicsBounds = true;\n this.pointer.useColliderShape = false;\n if (!(config === null || config === void 0 ? void 0 : config.collider) && (config === null || config === void 0 ? void 0 : config.width) > 0 && (config === null || config === void 0 ? void 0 : config.height) > 0) {\n this.collider.useBoxCollider(this.width, this.height, this.anchor);\n }\n }\n _initialize(engine) {\n this._engine = engine;\n super._initialize(engine);\n }\n contains(x, y, useWorld = true) {\n if (useWorld) {\n return super.contains(x, y);\n }\n const coords = this._engine.worldToScreenCoordinates(new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(x, y));\n return super.contains(coords.x, coords.y);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./TileMap/IsometricEntityComponent.ts\":\n/*!*********************************************!*\\\n !*** ./TileMap/IsometricEntityComponent.ts ***!\n \\*********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ IsometricEntityComponent: () => (/* binding */ IsometricEntityComponent)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Component */ \"./EntityComponentSystem/Component.ts\");\n\nclass IsometricEntityComponent extends _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n /**\n * Specify the isometric map to use to position this entity's z-index\n * @param mapOrOptions\n */\n constructor(mapOrOptions) {\n super();\n /**\n * Vertical \"height\" in the isometric world\n */\n this.elevation = 0;\n this.columns = mapOrOptions.columns;\n this.rows = mapOrOptions.rows;\n this.tileWidth = mapOrOptions.tileWidth;\n this.tileHeight = mapOrOptions.tileHeight;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./TileMap/IsometricEntitySystem.ts\":\n/*!******************************************!*\\\n !*** ./TileMap/IsometricEntitySystem.ts ***!\n \\******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ IsometricEntitySystem: () => (/* binding */ IsometricEntitySystem)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _IsometricEntityComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./IsometricEntityComponent */ \"./TileMap/IsometricEntityComponent.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Priority.ts\");\n\n\n\n\nclass IsometricEntitySystem extends _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.System {\n constructor(world) {\n super();\n this.world = world;\n this.systemType = _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.SystemType.Update;\n this.query = this.world.query([_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent, _IsometricEntityComponent__WEBPACK_IMPORTED_MODULE_2__.IsometricEntityComponent]);\n }\n update() {\n let transform;\n let iso;\n for (let i = 0; i < this.query.entities.length; i++) {\n const entity = this.query.entities[i];\n transform = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n iso = entity.get(_IsometricEntityComponent__WEBPACK_IMPORTED_MODULE_2__.IsometricEntityComponent);\n const maxZindexPerElevation = Math.max(iso.columns * iso.tileWidth, iso.rows * iso.tileHeight);\n const newZ = maxZindexPerElevation * iso.elevation + transform.pos.y;\n transform.z = newZ;\n }\n }\n}\nIsometricEntitySystem.priority = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_3__.SystemPriority.Lower;\n\n\n/***/ }),\n\n/***/ \"./TileMap/IsometricMap.ts\":\n/*!*********************************!*\\\n !*** ./TileMap/IsometricMap.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ IsometricMap: () => (/* binding */ IsometricMap),\n/* harmony export */ IsometricTile: () => (/* binding */ IsometricTile)\n/* harmony export */ });\n/* harmony import */ var _Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Collision/BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../Collision/ColliderComponent */ \"./Collision/ColliderComponent.ts\");\n/* harmony import */ var _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Collision/CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Collision_Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../Collision/Colliders/CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Graphics */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../Graphics */ \"./Graphics/DebugGraphicsComponent.ts\");\n/* harmony import */ var _IsometricEntityComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./IsometricEntityComponent */ \"./TileMap/IsometricEntityComponent.ts\");\n/* harmony import */ var _Input_PointerComponent__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../Input/PointerComponent */ \"./Input/PointerComponent.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Input_PointerEventsToObjectDispatcher__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../Input/PointerEventsToObjectDispatcher */ \"./Input/PointerEventsToObjectDispatcher.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass IsometricTile extends _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__.Entity {\n getGraphics() {\n return this._graphics;\n }\n /**\n * Tile graphics\n */\n addGraphic(graphic, options) {\n this._graphics.push(graphic);\n this._gfx.isVisible = this.map.isVisible;\n this._gfx.opacity = this.map.opacity;\n if (options === null || options === void 0 ? void 0 : options.offset) {\n this._gfx.offset = options.offset;\n }\n // TODO detect when this changes on the map and apply to all tiles\n this._gfx.localBounds = this._recalculateBounds();\n }\n _recalculateBounds() {\n let bounds = this._tileBounds.clone();\n for (const graphic of this._graphics) {\n const offset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(this.map.graphicsOffset.x - this.map.tileWidth / 2, this.map.graphicsOffset.y - (this.map.renderFromTopOfGraphic ? 0 : graphic.height - this.map.tileHeight));\n bounds = bounds.combine(graphic.localBounds.translate(offset));\n }\n return bounds;\n }\n removeGraphic(graphic) {\n const index = this._graphics.indexOf(graphic);\n if (index > -1) {\n this._graphics.splice(index, 1);\n }\n this._gfx.localBounds = this._recalculateBounds();\n }\n clearGraphics() {\n this._graphics.length = 0;\n this._gfx.isVisible = false;\n this._gfx.localBounds = this._recalculateBounds();\n }\n getColliders() {\n return this._colliders;\n }\n /**\n * Adds a collider to the IsometricTile\n *\n * **Note!** the {@apilink Tile.solid} must be set to true for it to act as a \"fixed\" collider\n * @param collider\n */\n addCollider(collider) {\n this._colliders.push(collider);\n this.map.flagCollidersDirty();\n }\n /**\n * Removes a collider from the IsometricTile\n * @param collider\n */\n removeCollider(collider) {\n const index = this._colliders.indexOf(collider);\n if (index > -1) {\n this._colliders.splice(index, 1);\n }\n this.map.flagCollidersDirty();\n }\n /**\n * Clears all colliders from the IsometricTile\n */\n clearColliders() {\n this._colliders.length = 0;\n this.map.flagCollidersDirty();\n }\n /**\n * Returns the top left corner of the {@apilink IsometricTile} in world space\n */\n get pos() {\n return this.map.tileToWorld((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(this.x, this.y));\n }\n /**\n * Returns the center of the {@apilink IsometricTile}\n */\n get center() {\n return this.pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, this.map.tileHeight / 2));\n }\n /**\n * Construct a new IsometricTile\n * @param x tile coordinate in x (not world position)\n * @param y tile coordinate in y (not world position)\n * @param graphicsOffset offset that tile should be shifted by (default (0, 0))\n * @param map reference to owning IsometricMap\n */\n constructor(x, y, graphicsOffset, map) {\n super([\n new _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent(),\n new _Graphics__WEBPACK_IMPORTED_MODULE_3__.GraphicsComponent({\n offset: graphicsOffset !== null && graphicsOffset !== void 0 ? graphicsOffset : _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero,\n onPostDraw: (gfx, elapsed) => this.draw(gfx, elapsed)\n }),\n new _IsometricEntityComponent__WEBPACK_IMPORTED_MODULE_4__.IsometricEntityComponent(map)\n ]);\n /**\n * Indicates whether this tile is solid\n */\n this.solid = false;\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_5__.EventEmitter();\n this._tileBounds = new _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox();\n this._graphics = [];\n /**\n * Tile colliders\n */\n this._colliders = [];\n /**\n * Arbitrary data storage per tile, useful for any game specific data\n */\n this.data = new Map();\n this.x = x;\n this.y = y;\n this.map = map;\n this._transform = this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n this._isometricEntityComponent = this.get(_IsometricEntityComponent__WEBPACK_IMPORTED_MODULE_4__.IsometricEntityComponent);\n const halfTileWidth = this.map.tileWidth / 2;\n const halfTileHeight = this.map.tileHeight / 2;\n // See https://clintbellanger.net/articles/isometric_math/ for formula\n // The x position shifts left with every y step\n const xPos = (this.x - this.y) * halfTileWidth;\n // The y position needs to go down with every x step\n const yPos = (this.x + this.y) * halfTileHeight;\n this._transform.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(xPos, yPos);\n this._isometricEntityComponent.elevation = map.elevation;\n this._gfx = this.get(_Graphics__WEBPACK_IMPORTED_MODULE_3__.GraphicsComponent);\n this._gfx.isVisible = false; // start not visible\n const totalWidth = this.map.tileWidth;\n const totalHeight = this.map.tileHeight;\n // initial guess at gfx bounds based on the tile\n const offset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, this.map.renderFromTopOfGraphic ? totalHeight : 0);\n this._gfx.localBounds = this._tileBounds = new _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox({\n left: -totalWidth / 2,\n top: -totalHeight,\n right: totalWidth / 2,\n bottom: totalHeight\n }).translate(offset);\n }\n draw(gfx, _elapsed) {\n const halfTileWidth = this.map.tileWidth / 2;\n gfx.save();\n // shift left origin to corner of map, not the left corner of the first sprite\n gfx.translate(-halfTileWidth, 0);\n for (const graphic of this._graphics) {\n graphic.draw(gfx, this.map.graphicsOffset.x, this.map.graphicsOffset.y - (this.map.renderFromTopOfGraphic ? 0 : graphic.height - this.map.tileHeight));\n }\n gfx.restore();\n }\n}\n/**\n * The IsometricMap is a special tile map that provides isometric rendering support to Excalibur\n *\n * The tileWidth and tileHeight should be the height and width in pixels of the parallelogram of the base of the tile art asset.\n * The tileWidth and tileHeight is not necessarily the same as your graphic pixel width and height.\n *\n * Please refer to the docs https://excaliburjs.com for more details calculating what your tile width and height should be given\n * your art assets.\n */\nclass IsometricMap extends _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__.Entity {\n /**\n * Whether tiles should be visible\n * @deprecated use isVisible\n */\n get visible() {\n return this.isVisible;\n }\n /**\n * Whether tiles should be visible\n * @deprecated use isVisible\n */\n set visible(val) {\n this.isVisible = val;\n }\n constructor(options) {\n super([\n new _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent(),\n new _Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_7__.BodyComponent({\n type: _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_8__.CollisionType.Fixed\n }),\n new _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_9__.ColliderComponent(),\n new _Input_PointerComponent__WEBPACK_IMPORTED_MODULE_10__.PointerComponent(),\n new _Graphics__WEBPACK_IMPORTED_MODULE_11__.DebugGraphicsComponent((ctx, debugFlags) => this.debug(ctx, debugFlags), false)\n ], options.name);\n this.elevation = 0;\n /**\n * Whether tiles should be visible\n */\n this.isVisible = true;\n /**\n * Opacity of tiles\n */\n this.opacity = 1.0;\n /**\n * Render the tile graphic from the top instead of the bottom\n *\n * default is `false` meaning rendering from the bottom\n */\n this.renderFromTopOfGraphic = false;\n this.graphicsOffset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0);\n this._collidersDirty = false;\n this._originalOffsets = new WeakMap();\n const { pos, tileWidth, tileHeight, columns: width, rows: height, renderFromTopOfGraphic, graphicsOffset, elevation } = options;\n this.transform = this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n if (pos) {\n this.transform.pos = pos;\n }\n this.collider = this.get(_Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_9__.ColliderComponent);\n if (this.collider) {\n this.collider.set((this._composite = new _Collision_Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_12__.CompositeCollider([])));\n }\n this.pointer = this.get(_Input_PointerComponent__WEBPACK_IMPORTED_MODULE_10__.PointerComponent);\n this.renderFromTopOfGraphic = renderFromTopOfGraphic !== null && renderFromTopOfGraphic !== void 0 ? renderFromTopOfGraphic : this.renderFromTopOfGraphic;\n this.graphicsOffset = graphicsOffset !== null && graphicsOffset !== void 0 ? graphicsOffset : this.graphicsOffset;\n this.elevation = elevation !== null && elevation !== void 0 ? elevation : this.elevation;\n this.tileWidth = tileWidth;\n this.tileHeight = tileHeight;\n this.columns = width;\n this.rows = height;\n this._pointerEventDispatcher = new _Input_PointerEventsToObjectDispatcher__WEBPACK_IMPORTED_MODULE_13__.PointerEventsToObjectDispatcher();\n this.tiles = new Array(width * height);\n // build up tile representation\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const tile = new IsometricTile(x, y, this.graphicsOffset, this);\n this.tiles[x + y * width] = tile;\n this.addChild(tile);\n this._pointerEventDispatcher.addObject(tile, (p) => this.getTileByPoint(p.worldPos) === tile, () => true);\n }\n }\n this.pointer.localBounds = _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox.fromDimension(tileWidth * width * this.transform.scale.x, tileHeight * height * this.transform.scale.y, (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0.5, 0));\n }\n /**\n * @internal\n */\n _processPointerToObject(receiver) {\n this._pointerEventDispatcher.processPointerToObject(receiver, this.tiles);\n }\n /**\n * @internal\n */\n _dispatchPointerEvents(receiver) {\n this._pointerEventDispatcher.dispatchEvents(receiver, this.tiles);\n }\n update() {\n if (this._collidersDirty) {\n this.updateColliders();\n this._collidersDirty = false;\n }\n this._pointerEventDispatcher.clear();\n }\n flagCollidersDirty() {\n this._collidersDirty = true;\n }\n _getOrSetColliderOriginalOffset(collider) {\n var _a;\n if (!this._originalOffsets.has(collider)) {\n const originalOffset = collider.offset;\n this._originalOffsets.set(collider, originalOffset);\n return originalOffset;\n }\n else {\n return (_a = this._originalOffsets.get(collider)) !== null && _a !== void 0 ? _a : _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n }\n }\n updateColliders() {\n this._composite.clearColliders();\n const pos = this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent).pos;\n for (const tile of this.tiles) {\n if (tile.solid) {\n for (const collider of tile.getColliders()) {\n const originalOffset = this._getOrSetColliderOriginalOffset(collider);\n collider.offset = this.tileToWorld((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(tile.x, tile.y))\n .sub(pos)\n .add(originalOffset)\n .sub((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(this.tileWidth / 2, this.tileHeight)); // We need to unshift height based on drawing\n collider.owner = this;\n this._composite.addCollider(collider);\n }\n }\n }\n this.collider.update();\n }\n /**\n * Convert world space coordinates to the tile x, y coordinate\n * @param worldCoordinate\n */\n worldToTile(worldCoordinate) {\n // TODO I don't think this handles parent transform see TileMap\n worldCoordinate = worldCoordinate.sub(this.transform.globalPos);\n const halfTileWidth = this.tileWidth / 2;\n const halfTileHeight = this.tileHeight / 2;\n // See https://clintbellanger.net/articles/isometric_math/ for formula\n return (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(~~((worldCoordinate.x / halfTileWidth + worldCoordinate.y / halfTileHeight) / 2), ~~((worldCoordinate.y / halfTileHeight - worldCoordinate.x / halfTileWidth) / 2));\n }\n /**\n * Given a tile coordinate, return the top left corner in world space\n * @param tileCoordinate\n */\n tileToWorld(tileCoordinate) {\n const halfTileWidth = this.tileWidth / 2;\n const halfTileHeight = this.tileHeight / 2;\n // The x position shifts left with every y step\n const xPos = (tileCoordinate.x - tileCoordinate.y) * halfTileWidth;\n // The y position needs to go down with every x step\n const yPos = (tileCoordinate.x + tileCoordinate.y) * halfTileHeight;\n return (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(xPos, yPos).add(this.transform.pos);\n }\n /**\n * Returns the {@apilink IsometricTile} by its x and y coordinates\n */\n getTile(x, y) {\n if (x < 0 || y < 0 || x >= this.columns || y >= this.rows) {\n return null;\n }\n return this.tiles[x + y * this.columns];\n }\n /**\n * Returns the {@apilink IsometricTile} by testing a point in world coordinates,\n * returns `null` if no Tile was found.\n */\n getTileByPoint(point) {\n const tileCoord = this.worldToTile(point);\n const tile = this.getTile(tileCoord.x, tileCoord.y);\n return tile;\n }\n _getMaxZIndex() {\n let maxZ = Number.NEGATIVE_INFINITY;\n for (const tile of this.tiles) {\n const currentZ = tile.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent).z;\n if (currentZ > maxZ) {\n maxZ = currentZ;\n }\n }\n return maxZ;\n }\n /**\n * Debug draw for IsometricMap, called internally by excalibur when debug mode is toggled on\n * @param gfx\n */\n debug(gfx, debugFlags) {\n const { showAll, showPosition, positionColor, positionSize, showGrid, gridColor, gridWidth, showColliderGeometry } = debugFlags.isometric;\n const { geometryColor, geometryLineWidth, geometryPointSize } = debugFlags.collider;\n gfx.save();\n gfx.z = this._getMaxZIndex() + 0.5;\n if (showAll || showGrid) {\n for (let y = 0; y < this.rows + 1; y++) {\n const left = this.tileToWorld((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, y));\n const right = this.tileToWorld((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(this.columns, y));\n gfx.drawLine(left, right, gridColor, gridWidth);\n }\n for (let x = 0; x < this.columns + 1; x++) {\n const top = this.tileToWorld((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(x, 0));\n const bottom = this.tileToWorld((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(x, this.rows));\n gfx.drawLine(top, bottom, gridColor, gridWidth);\n }\n }\n if (showAll || showPosition) {\n for (const tile of this.tiles) {\n gfx.drawCircle(this.tileToWorld((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(tile.x, tile.y)), positionSize, positionColor);\n }\n }\n if (showAll || showColliderGeometry) {\n for (const tile of this.tiles) {\n if (tile.solid) {\n // only draw solid tiles\n for (const collider of tile.getColliders()) {\n collider.debug(gfx, geometryColor, { lineWidth: geometryLineWidth, pointSize: geometryPointSize });\n }\n }\n }\n }\n gfx.restore();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./TileMap/TileMap.ts\":\n/*!****************************!*\\\n !*** ./TileMap/TileMap.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Tile: () => (/* binding */ Tile),\n/* harmony export */ TileMap: () => (/* binding */ TileMap),\n/* harmony export */ TileMapEvents: () => (/* binding */ TileMapEvents)\n/* harmony export */ });\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Collision/BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Collision/CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Collision_Colliders_Shape__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../Collision/Colliders/Shape */ \"./Collision/Colliders/Shape.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Graphics */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../Graphics */ \"./Graphics/ParallaxComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../Collision/ColliderComponent */ \"./Collision/ColliderComponent.ts\");\n/* harmony import */ var _Graphics_DebugGraphicsComponent__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../Graphics/DebugGraphicsComponent */ \"./Graphics/DebugGraphicsComponent.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../Math/coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Input_PointerComponent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../Input/PointerComponent */ \"./Input/PointerComponent.ts\");\n/* harmony import */ var _Input_PointerEventsToObjectDispatcher__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../Input/PointerEventsToObjectDispatcher */ \"./Input/PointerEventsToObjectDispatcher.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst TileMapEvents = {\n PreUpdate: 'preupdate',\n PostUpdate: 'postupdate',\n PreDraw: 'predraw',\n PostDraw: 'postdraw',\n PointerUp: 'pointerup',\n PointerDown: 'pointerdown',\n PointerMove: 'pointermove',\n PointerCancel: 'pointercancel'\n};\n/**\n * The TileMap provides a mechanism for doing flat 2D tiles rendered in a grid.\n *\n * TileMaps are useful for top down or side scrolling grid oriented games.\n */\nclass TileMap extends _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__.Entity {\n flagCollidersDirty() {\n this._collidersDirty = true;\n }\n flagTilesDirty() {\n for (let i = 0; i < this.tiles.length; i++) {\n if (this.tiles[i]) {\n this.tiles[i].flagDirty();\n }\n }\n }\n get x() {\n var _a;\n return (_a = this.transform.pos.x) !== null && _a !== void 0 ? _a : 0;\n }\n set x(val) {\n var _a;\n if ((_a = this.transform) === null || _a === void 0 ? void 0 : _a.pos) {\n this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(val, this.y);\n }\n }\n get y() {\n var _a, _b;\n return (_b = (_a = this.transform) === null || _a === void 0 ? void 0 : _a.pos.y) !== null && _b !== void 0 ? _b : 0;\n }\n set y(val) {\n var _a;\n if ((_a = this.transform) === null || _a === void 0 ? void 0 : _a.pos) {\n this.transform.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(this.x, val);\n }\n }\n get z() {\n var _a;\n return (_a = this.transform.z) !== null && _a !== void 0 ? _a : 0;\n }\n set z(val) {\n if (this.transform) {\n this.transform.z = val;\n }\n }\n get rotation() {\n var _a, _b;\n return (_b = (_a = this.transform) === null || _a === void 0 ? void 0 : _a.rotation) !== null && _b !== void 0 ? _b : 0;\n }\n set rotation(val) {\n if (this.transform) {\n this.transform.rotation = val;\n }\n }\n get scale() {\n var _a, _b;\n return (_b = (_a = this.transform) === null || _a === void 0 ? void 0 : _a.scale) !== null && _b !== void 0 ? _b : _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.One;\n }\n set scale(val) {\n var _a;\n if ((_a = this.transform) === null || _a === void 0 ? void 0 : _a.scale) {\n this.transform.scale = val;\n }\n }\n get pos() {\n return this.transform.pos;\n }\n set pos(val) {\n this.transform.pos = val;\n }\n get vel() {\n return this._motion.vel;\n }\n set vel(val) {\n this._motion.vel = val;\n }\n /**\n * Width of the whole tile map in pixels\n */\n get width() {\n return this.tileWidth * this.columns * this.scale.x;\n }\n /**\n * Height of the whole tilemap in pixels\n */\n get height() {\n return this.tileHeight * this.rows * this.scale.y;\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n /**\n * @param options\n */\n constructor(options) {\n var _a, _b, _c;\n super([], options.name);\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_3__.EventEmitter();\n this._token = 0;\n this.logger = _Util_Log__WEBPACK_IMPORTED_MODULE_4__.Logger.getInstance();\n this.tiles = [];\n this._rows = [];\n this._cols = [];\n this.renderFromTopOfGraphic = false;\n this.meshingLookBehind = 10;\n this._collidersDirty = true;\n this._oldRotation = 0;\n this._originalOffsets = new WeakMap();\n this.meshingLookBehind = (_a = options.meshingLookBehind) !== null && _a !== void 0 ? _a : this.meshingLookBehind;\n this.addComponent(new _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent());\n this.addComponent(new _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_5__.MotionComponent());\n this.addComponent(new _Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_6__.BodyComponent({\n type: _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_7__.CollisionType.Fixed\n }));\n this.addComponent(new _Graphics__WEBPACK_IMPORTED_MODULE_8__.GraphicsComponent({\n onPostDraw: (ctx, elapsed) => this.draw(ctx, elapsed)\n }));\n this.addComponent(new _Graphics_DebugGraphicsComponent__WEBPACK_IMPORTED_MODULE_9__.DebugGraphicsComponent((ctx, debugFlags) => this.debug(ctx, debugFlags), false));\n this.addComponent(new _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_10__.ColliderComponent());\n this.addComponent(new _Input_PointerComponent__WEBPACK_IMPORTED_MODULE_11__.PointerComponent());\n this.pointer = this.get(_Input_PointerComponent__WEBPACK_IMPORTED_MODULE_11__.PointerComponent);\n this._graphics = this.get(_Graphics__WEBPACK_IMPORTED_MODULE_8__.GraphicsComponent);\n this.transform = this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._motion = this.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_5__.MotionComponent);\n this.collider = this.get(_Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_10__.ColliderComponent);\n this._composite = this.collider.useCompositeCollider([]);\n this.transform.pos = (_b = options.pos) !== null && _b !== void 0 ? _b : _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero;\n this._oldPos = this.transform.pos.clone();\n this._oldScale = this.transform.scale.clone();\n this.renderFromTopOfGraphic = (_c = options.renderFromTopOfGraphic) !== null && _c !== void 0 ? _c : this.renderFromTopOfGraphic;\n this.tileWidth = options.tileWidth;\n this.tileHeight = options.tileHeight;\n this.rows = options.rows;\n this.columns = options.columns;\n this._pointerEventDispatcher = new _Input_PointerEventsToObjectDispatcher__WEBPACK_IMPORTED_MODULE_12__.PointerEventsToObjectDispatcher();\n this.tiles = new Array(this.rows * this.columns);\n this._rows = new Array(this.rows);\n this._cols = new Array(this.columns);\n let currentCol = [];\n for (let i = 0; i < this.columns; i++) {\n for (let j = 0; j < this.rows; j++) {\n const tile = new Tile({\n x: i,\n y: j,\n map: this\n });\n tile.map = this;\n this.tiles[i + j * this.columns] = tile;\n this._pointerEventDispatcher.addObject(tile, (vec) => {\n // TODO handle geometry/graphics\n return tile.bounds.contains(vec.worldPos);\n }, () => true);\n currentCol.push(tile);\n if (!this._rows[j]) {\n this._rows[j] = [];\n }\n this._rows[j].push(tile);\n }\n this._cols[i] = currentCol;\n currentCol = [];\n }\n this._graphics.localBounds = new _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_13__.BoundingBox({\n left: 0,\n top: 0,\n right: this.columns * this.tileWidth * this.scale.x,\n bottom: this.rows * this.tileHeight * this.scale.y\n });\n }\n _initialize(engine) {\n super._initialize(engine);\n this._engine = engine;\n }\n _getOrSetColliderOriginalOffset(collider) {\n var _a;\n if (!this._originalOffsets.has(collider)) {\n const originalOffset = collider.offset;\n this._originalOffsets.set(collider, originalOffset);\n return originalOffset;\n }\n else {\n return (_a = this._originalOffsets.get(collider)) !== null && _a !== void 0 ? _a : _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero;\n }\n }\n /**\n * Tiles colliders based on the solid tiles in the tilemap.\n */\n _updateColliders() {\n this.collider.$colliderRemoved.notifyAll(this._composite);\n this._composite.clearColliders();\n const colliders = [];\n this._composite = this.collider.useCompositeCollider([]);\n let current = null;\n /**\n * Returns wether or not the 2 boxes share an edge and are the same height\n * @param prev\n * @param next\n * @returns true if they share and edge, false if not\n */\n const shareEdges = (prev, next) => {\n if (prev && next) {\n // same top/bottom\n return (prev.top === next.top &&\n prev.bottom === next.bottom &&\n // Shared right/left edge\n prev.right === next.left);\n }\n return false;\n };\n /**\n * Potentially merges the current collider into a list of previous ones, mutating the list\n * If checkAndCombine returns true, the collider was successfully merged and should be thrown away\n * @param current current collider to test\n * @param colliders List of colliders to consider merging with\n * @param maxLookBack The amount of colliders to look back for combination\n * @returns false when no combination found, true when successfully combined\n */\n const checkAndCombine = (current, colliders, maxLookBack = this.meshingLookBehind) => {\n if (!current) {\n return false;\n }\n // walk backwards through the list of colliders and combine with the first that shares an edge\n for (let i = colliders.length - 1; i >= 0; i--) {\n if (maxLookBack-- < 0) {\n // blunt the O(n^2) algorithm a bit\n return false;\n }\n const prev = colliders[i];\n if (shareEdges(prev, current)) {\n colliders[i] = prev.combine(current);\n return true;\n }\n }\n return false;\n };\n // ? configurable bias perhaps, horizontal strips vs. vertical ones\n // Bad tile collider packing algorithm\n for (let i = 0; i < this.columns; i++) {\n // Scan column for colliders\n for (let j = 0; j < this.rows; j++) {\n const tile = this.tiles[i + j * this.columns];\n // Current tile in column is solid build up current collider\n if (tile.solid) {\n // Use custom collider otherwise bounding box\n if (tile.getColliders().length > 0) {\n // tile with custom collider interrupting the current run\n for (const collider of tile.getColliders()) {\n const originalOffset = this._getOrSetColliderOriginalOffset(collider);\n collider.offset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(tile.x * this.tileWidth * this.scale.x, tile.y * this.tileHeight * this.scale.y).add(originalOffset);\n collider.owner = this;\n this._composite.addCollider(collider);\n }\n //we push any current collider before nulling the current run\n if (current && !checkAndCombine(current, colliders)) {\n colliders.push(current);\n }\n current = null;\n // Use the bounding box\n }\n else {\n if (!current) {\n // no current run, start one\n current = tile.defaultGeometry;\n }\n else {\n // combine with current run\n current = current.combine(tile.defaultGeometry);\n }\n }\n }\n else {\n // Not solid skip and cut off the current collider\n // End of run check and combine\n if (current && !checkAndCombine(current, colliders)) {\n colliders.push(current);\n }\n current = null;\n }\n }\n // After a column is complete check to see if it can be merged into the last one\n // Eno of run check and combine\n if (current && !checkAndCombine(current, colliders)) {\n // else new collider if no combination\n colliders.push(current);\n }\n current = null;\n }\n for (const c of colliders) {\n const collider = _Collision_Colliders_Shape__WEBPACK_IMPORTED_MODULE_14__.Shape.Box(c.width, c.height, _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero, (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(c.left - this.pos.x, c.top - this.pos.y));\n collider.owner = this;\n this._composite.addCollider(collider);\n }\n this.collider.update();\n // Notify that colliders have been updated\n this.collider.$colliderAdded.notifyAll(this._composite);\n }\n /**\n * Returns the {@apilink Tile} by index (row major order)\n *\n * Returns null if out of bounds\n */\n getTileByIndex(index) {\n var _a;\n return (_a = this.tiles[index]) !== null && _a !== void 0 ? _a : null;\n }\n /**\n * Returns the {@apilink Tile} by its x and y integer coordinates\n *\n * Returns null if out of bounds\n *\n * For example, if I want the tile in fifth column (x), and second row (y):\n * `getTile(4, 1)` 0 based, so 0 is the first in row/column\n */\n getTile(x, y) {\n if (x < 0 || y < 0 || x >= this.columns || y >= this.rows) {\n return null;\n }\n return this.tiles[x + y * this.columns];\n }\n /**\n * Returns the {@apilink Tile} by testing a point in world coordinates,\n * returns `null` if no Tile was found.\n */\n getTileByPoint(point) {\n const { x, y } = this._getTileCoordinates(point);\n const tile = this.getTile(x, y);\n if (x >= 0 && y >= 0 && x < this.columns && y < this.rows && tile) {\n return tile;\n }\n return null;\n }\n _getTileCoordinates(point) {\n // Convert to Tile Space point\n point = this.transform.applyInverse(point);\n const x = Math.floor(point.x / this.tileWidth);\n const y = Math.floor(point.y / this.tileHeight);\n return { x, y };\n }\n getRows() {\n return this._rows;\n }\n getColumns() {\n return this._cols;\n }\n /**\n * Returns the on screen tiles for a tilemap, this will overshoot by a small amount because of the internal quad tree data structure.\n *\n * Useful if you need to perform specific logic on onscreen tiles\n */\n getOnScreenTiles() {\n let worldBounds = this._engine.screen.getWorldBounds();\n const maybeParallax = this.get(_Graphics__WEBPACK_IMPORTED_MODULE_15__.ParallaxComponent);\n if (maybeParallax && this.isInitialized) {\n let pos = this.pos;\n const oneMinusFactor = _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.One.sub(maybeParallax.parallaxFactor);\n const parallaxOffset = this._engine.currentScene.camera.pos.scale(oneMinusFactor);\n pos = pos.sub(parallaxOffset);\n // adjust world bounds by parallax factor\n worldBounds = worldBounds.translate(pos);\n }\n const bounds = this.transform.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_16__.CoordPlane.Screen ? this._engine.screen.getScreenBounds() : worldBounds;\n const topLeft = this._getTileCoordinates(bounds.topLeft);\n const topRight = this._getTileCoordinates(bounds.topRight);\n const bottomRight = this._getTileCoordinates(bounds.bottomRight);\n const bottomLeft = this._getTileCoordinates(bounds.bottomLeft);\n const tileStartX = Math.min((0,_Math_util__WEBPACK_IMPORTED_MODULE_17__.clamp)(topLeft.x, 0, this.columns - 1), (0,_Math_util__WEBPACK_IMPORTED_MODULE_17__.clamp)(topRight.x, 0, this.columns - 1));\n const tileStartY = Math.min((0,_Math_util__WEBPACK_IMPORTED_MODULE_17__.clamp)(topLeft.y, 0, this.rows - 1), (0,_Math_util__WEBPACK_IMPORTED_MODULE_17__.clamp)(topRight.y, 0, this.rows - 1));\n const tileEndX = Math.max((0,_Math_util__WEBPACK_IMPORTED_MODULE_17__.clamp)(bottomRight.x, 0, this.columns - 1), (0,_Math_util__WEBPACK_IMPORTED_MODULE_17__.clamp)(bottomLeft.x, 0, this.columns - 1));\n const tileEndY = Math.max((0,_Math_util__WEBPACK_IMPORTED_MODULE_17__.clamp)(bottomRight.y, 0, this.rows - 1), (0,_Math_util__WEBPACK_IMPORTED_MODULE_17__.clamp)(bottomLeft.y, 0, this.rows - 1));\n const tiles = [];\n for (let x = tileStartX; x <= tileEndX; x++) {\n for (let y = tileStartY; y <= tileEndY; y++) {\n tiles.push(this.getTile(x, y));\n }\n }\n return tiles;\n }\n /**\n * @internal\n */\n _processPointerToObject(receiver) {\n this._pointerEventDispatcher.processPointerToObject(receiver, this.tiles);\n }\n /**\n * @internal\n */\n _dispatchPointerEvents(receiver) {\n this._pointerEventDispatcher.dispatchEvents(receiver, this.tiles);\n }\n update(engine, elapsed) {\n this._initialize(engine);\n this.onPreUpdate(engine, elapsed);\n this.emit('preupdate', new _Events__WEBPACK_IMPORTED_MODULE_18__.PreUpdateEvent(engine, elapsed, this));\n // Update colliders\n if (!this._oldPos.equals(this.pos) || this._oldRotation !== this.rotation || !this._oldScale.equals(this.scale)) {\n this.flagCollidersDirty();\n this.flagTilesDirty();\n }\n if (this._collidersDirty) {\n this._collidersDirty = false;\n this._updateColliders();\n }\n // Clear last frame's events\n this._pointerEventDispatcher.clear();\n this._token++;\n this.pos.clone(this._oldPos);\n this._oldRotation = this.rotation;\n this.scale.clone(this._oldScale);\n this.transform.pos = this.pos;\n this.onPostUpdate(engine, elapsed);\n this.emit('postupdate', new _Events__WEBPACK_IMPORTED_MODULE_18__.PostUpdateEvent(engine, elapsed, this));\n }\n /**\n * Draws the tile map to the screen. Called by the {@apilink Scene}.\n * @param ctx ExcaliburGraphicsContext\n * @param elapsed The number of milliseconds since the last draw\n */\n draw(ctx, elapsed) {\n if (!this.isInitialized) {\n return;\n }\n this.emit('predraw', new _Events__WEBPACK_IMPORTED_MODULE_18__.PreDrawEvent(ctx, elapsed, this)); // TODO fix event\n let graphics, graphicsIndex, graphicsLen;\n const tiles = this.getOnScreenTiles();\n for (let i = 0; i < tiles.length; i++) {\n const tile = tiles[i];\n // get non-negative tile sprites\n const offsets = tile.getGraphicsOffsets();\n graphics = tile.getGraphics();\n for (graphicsIndex = 0, graphicsLen = graphics.length; graphicsIndex < graphicsLen; graphicsIndex++) {\n // draw sprite, warning if sprite doesn't exist\n const graphic = graphics[graphicsIndex];\n const offset = offsets[graphicsIndex];\n if (graphic) {\n if ((0,_Graphics__WEBPACK_IMPORTED_MODULE_8__.hasGraphicsTick)(graphic)) {\n graphic === null || graphic === void 0 ? void 0 : graphic.tick(elapsed, this._token);\n }\n const offsetY = this.renderFromTopOfGraphic ? 0 : graphic.height - this.tileHeight;\n graphic.draw(ctx, tile.x * this.tileWidth + offset.x, tile.y * this.tileHeight - offsetY + offset.y);\n }\n }\n }\n this.emit('postdraw', new _Events__WEBPACK_IMPORTED_MODULE_18__.PostDrawEvent(ctx, elapsed, this));\n }\n debug(gfx, debugFlags) {\n const { showAll, showGrid, gridColor, gridWidth, showSolidBounds: showColliderBounds, solidBoundsColor: colliderBoundsColor, showColliderGeometry } = debugFlags.tilemap;\n const { geometryColor, geometryLineWidth, geometryPointSize } = debugFlags.collider;\n const width = this.tileWidth * this.columns * this.scale.x;\n const height = this.tileHeight * this.rows * this.scale.y;\n const pos = this.pos;\n if (showGrid || showAll) {\n for (let r = 0; r < this.rows + 1; r++) {\n const yOffset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(0, r * this.tileHeight * this.scale.y);\n gfx.drawLine(pos.add(yOffset), pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(width, yOffset.y)), gridColor, gridWidth);\n }\n for (let c = 0; c < this.columns + 1; c++) {\n const xOffset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(c * this.tileWidth * this.scale.x, 0);\n gfx.drawLine(pos.add(xOffset), pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(xOffset.x, height)), gridColor, gridWidth);\n }\n }\n if (showAll || showColliderBounds || showColliderGeometry) {\n const colliders = this._composite.getColliders();\n gfx.save();\n gfx.translate(this.pos.x, this.pos.y);\n gfx.scale(this.scale.x, this.scale.y);\n for (const collider of colliders) {\n const bounds = collider.localBounds;\n const pos = collider.worldPos.sub(this.pos);\n if (showColliderBounds) {\n gfx.drawRectangle(pos, bounds.width, bounds.height, colliderBoundsColor);\n }\n }\n gfx.restore();\n if (showColliderGeometry) {\n for (const collider of colliders) {\n collider.debug(gfx, geometryColor, { lineWidth: geometryLineWidth, pointSize: geometryPointSize });\n }\n }\n }\n if (showAll || showColliderBounds) {\n gfx.save();\n gfx.z = 999;\n if (showColliderBounds) {\n for (let i = 0; i < this.tiles.length; i++) {\n this.tiles[i].bounds.draw(gfx);\n }\n }\n gfx.restore();\n }\n }\n}\n/**\n * TileMap Tile\n *\n * A light-weight object that occupies a space in a collision map. Generally\n * created by a {@apilink TileMap}.\n *\n * Tiles can draw multiple sprites. Note that the order of drawing is the order\n * of the sprites in the array so the last one will be drawn on top. You can\n * use transparency to create layers this way.\n */\nclass Tile {\n /**\n * Return the world position of the top left corner of the tile\n */\n get pos() {\n if (this._posDirty) {\n this._recalculate();\n this._posDirty = false;\n }\n return this._pos;\n }\n /**\n * Width of the tile in pixels\n */\n get width() {\n return this._width;\n }\n /**\n * Height of the tile in pixels\n */\n get height() {\n return this._height;\n }\n /**\n * Wether this tile should be treated as solid by the tilemap\n */\n get solid() {\n return this._solid;\n }\n /**\n * Wether this tile should be treated as solid by the tilemap\n */\n set solid(val) {\n var _a;\n (_a = this.map) === null || _a === void 0 ? void 0 : _a.flagCollidersDirty();\n this._solid = val;\n }\n /**\n * Current list of graphics for this tile\n */\n getGraphics() {\n return this._graphics;\n }\n /**\n * Current list of offsets for this tile's graphics\n */\n getGraphicsOffsets() {\n return this._offsets;\n }\n /**\n * Add another {@apilink Graphic} to this TileMap tile\n * @param graphic\n */\n addGraphic(graphic, options) {\n this._graphics.push(graphic);\n if (options === null || options === void 0 ? void 0 : options.offset) {\n this._offsets.push(options.offset);\n }\n else {\n this._offsets.push(_Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero);\n }\n }\n /**\n * Remove an instance of a {@apilink Graphic} from this tile\n */\n removeGraphic(graphic) {\n const index = this._graphics.indexOf(graphic);\n if (index > -1) {\n this._graphics.splice(index, 1);\n this._offsets.splice(index, 1);\n }\n }\n /**\n * Clear all graphics from this tile\n */\n clearGraphics() {\n this._graphics.length = 0;\n this._offsets.length = 0;\n }\n /**\n * Returns the list of colliders\n */\n getColliders() {\n return this._colliders;\n }\n /**\n * Adds a custom collider to the {@apilink Tile} to use instead of it's bounds\n *\n * If no collider is set but {@apilink Tile.solid} is set, the tile bounds are used as a collider.\n *\n * **Note!** the {@apilink Tile.solid} must be set to true for it to act as a \"fixed\" collider\n * @param collider\n */\n addCollider(collider) {\n this._colliders.push(collider);\n this.map.flagCollidersDirty();\n }\n /**\n * Removes a collider from the {@apilink Tile}\n * @param collider\n */\n removeCollider(collider) {\n const index = this._colliders.indexOf(collider);\n if (index > -1) {\n this._colliders.splice(index, 1);\n }\n this.map.flagCollidersDirty();\n }\n /**\n * Clears all colliders from the {@apilink Tile}\n */\n clearColliders() {\n this._colliders.length = 0;\n this.map.flagCollidersDirty();\n }\n constructor(options) {\n var _a, _b;\n this._posDirty = false;\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_3__.EventEmitter();\n this._solid = false;\n this._graphics = [];\n this._offsets = [];\n /**\n * Current list of colliders for this tile\n */\n this._colliders = [];\n /**\n * Arbitrary data storage per tile, useful for any game specific data\n */\n this.data = new Map();\n this.x = options.x;\n this.y = options.y;\n this.map = options.map;\n this._width = options.map.tileWidth * this.map.scale.x;\n this._height = options.map.tileHeight * this.map.scale.y;\n this.solid = (_a = options.solid) !== null && _a !== void 0 ? _a : this.solid;\n this._graphics = (_b = options.graphics) !== null && _b !== void 0 ? _b : [];\n this._recalculate();\n }\n flagDirty() {\n return (this._posDirty = true);\n }\n _recalculate() {\n const geometryPos = this.map.pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(this.x * this.map.tileWidth, this.y * this.map.tileHeight));\n this._geometry = new _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_13__.BoundingBox(geometryPos.x, geometryPos.y, geometryPos.x + this.map.tileWidth, geometryPos.y + this.map.tileHeight);\n this._width = this.map.tileWidth * this.map.scale.x;\n this._height = this.map.tileHeight * this.map.scale.y;\n this._pos = this.map.pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(this.x * this._width, this.y * this._height));\n this._bounds = new _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_13__.BoundingBox(this._pos.x, this._pos.y, this._pos.x + this._width, this._pos.y + this._height);\n if (this.map.rotation) {\n this._bounds = this._bounds.rotate(this.map.rotation, this.map.pos);\n }\n this._posDirty = false;\n }\n /**\n * Tile bounds in world space\n */\n get bounds() {\n if (this._posDirty) {\n this._recalculate();\n }\n return this._bounds;\n }\n get defaultGeometry() {\n return this._geometry;\n }\n /**\n * Tile position in world space\n */\n get center() {\n if (this._posDirty) {\n this._recalculate();\n }\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._pos.x + this._width / 2, this._pos.y + this._height / 2);\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n if (handler) {\n this.events.off(eventName, handler);\n }\n else {\n this.events.off(eventName);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./TileMap/index.ts\":\n/*!**************************!*\\\n !*** ./TileMap/index.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ IsometricEntityComponent: () => (/* reexport safe */ _IsometricEntityComponent__WEBPACK_IMPORTED_MODULE_2__.IsometricEntityComponent),\n/* harmony export */ IsometricEntitySystem: () => (/* reexport safe */ _IsometricEntitySystem__WEBPACK_IMPORTED_MODULE_3__.IsometricEntitySystem),\n/* harmony export */ IsometricMap: () => (/* reexport safe */ _IsometricMap__WEBPACK_IMPORTED_MODULE_1__.IsometricMap),\n/* harmony export */ IsometricTile: () => (/* reexport safe */ _IsometricMap__WEBPACK_IMPORTED_MODULE_1__.IsometricTile),\n/* harmony export */ Tile: () => (/* reexport safe */ _TileMap__WEBPACK_IMPORTED_MODULE_0__.Tile),\n/* harmony export */ TileMap: () => (/* reexport safe */ _TileMap__WEBPACK_IMPORTED_MODULE_0__.TileMap),\n/* harmony export */ TileMapEvents: () => (/* reexport safe */ _TileMap__WEBPACK_IMPORTED_MODULE_0__.TileMapEvents)\n/* harmony export */ });\n/* harmony import */ var _TileMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./TileMap */ \"./TileMap/TileMap.ts\");\n/* harmony import */ var _IsometricMap__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./IsometricMap */ \"./TileMap/IsometricMap.ts\");\n/* harmony import */ var _IsometricEntityComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./IsometricEntityComponent */ \"./TileMap/IsometricEntityComponent.ts\");\n/* harmony import */ var _IsometricEntitySystem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./IsometricEntitySystem */ \"./TileMap/IsometricEntitySystem.ts\");\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Timer.ts\":\n/*!******************!*\\\n !*** ./Timer.ts ***!\n \\******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Timer: () => (/* binding */ Timer)\n/* harmony export */ });\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Math_Random__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Math/Random */ \"./Math/Random.ts\");\n\n\n/**\n * The Excalibur timer hooks into the internal timer and fires callbacks,\n * after a certain interval, optionally repeating.\n */\nclass Timer {\n get complete() {\n return this._complete;\n }\n constructor(options) {\n var _a;\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance();\n this.id = 0;\n this._elapsedTime = 0;\n this._totalTimeAlive = 0;\n this._running = false;\n this._numberOfTicks = 0;\n this.interval = 10;\n this.repeats = false;\n this.maxNumberOfRepeats = -1;\n this.randomRange = [0, 0];\n this._baseInterval = 10;\n this._generateRandomInterval = () => {\n return this._baseInterval + this.random.integer(this.randomRange[0], this.randomRange[1]);\n };\n this._complete = false;\n this.scene = null;\n const fcn = (_a = options.action) !== null && _a !== void 0 ? _a : options.fcn;\n const interval = options.interval;\n const repeats = options.repeats;\n const numberOfRepeats = options.numberOfRepeats;\n const randomRange = options.randomRange;\n const random = options.random;\n if (!!numberOfRepeats && numberOfRepeats >= 0) {\n this.maxNumberOfRepeats = numberOfRepeats;\n if (!repeats) {\n throw new Error('repeats must be set to true if numberOfRepeats is set');\n }\n }\n this.id = Timer._MAX_ID++;\n this._callbacks = [];\n this._baseInterval = this.interval = interval;\n if (!!randomRange) {\n if (randomRange[0] > randomRange[1]) {\n throw new Error('min value must be lower than max value for range');\n }\n //We use the instance of ex.Random to generate the range\n this.random = random !== null && random !== void 0 ? random : new _Math_Random__WEBPACK_IMPORTED_MODULE_1__.Random();\n this.randomRange = randomRange;\n this.interval = this._generateRandomInterval();\n this.on(() => {\n this.interval = this._generateRandomInterval();\n });\n }\n this.repeats = repeats || this.repeats;\n if (fcn) {\n this.on(fcn);\n }\n }\n /**\n * Adds a new callback to be fired after the interval is complete\n * @param action The callback to be added to the callback list, to be fired after the interval is complete.\n */\n on(action) {\n this._callbacks.push(action);\n }\n /**\n * Removes a callback from the callback list to be fired after the interval is complete.\n * @param action The callback to be removed from the callback list, to be fired after the interval is complete.\n */\n off(action) {\n const index = this._callbacks.indexOf(action);\n this._callbacks.splice(index, 1);\n }\n /**\n * Updates the timer after a certain number of milliseconds have elapsed. This is used internally by the engine.\n * @param elapsed Number of elapsed milliseconds since the last update.\n */\n update(elapsed) {\n if (this._running) {\n this._totalTimeAlive += elapsed;\n this._elapsedTime += elapsed;\n if (this.maxNumberOfRepeats > -1 && this._numberOfTicks >= this.maxNumberOfRepeats) {\n this._complete = true;\n this._running = false;\n this._elapsedTime = 0;\n }\n if (!this.complete && this._elapsedTime >= this.interval) {\n this._callbacks.forEach((c) => {\n c.call(this);\n });\n this._numberOfTicks++;\n if (this.repeats) {\n this._elapsedTime = 0;\n }\n else {\n this._complete = true;\n this._running = false;\n this._elapsedTime = 0;\n }\n }\n }\n }\n /**\n * Resets the timer so that it can be reused, and optionally reconfigure the timers interval.\n *\n * Warning** you may need to call `timer.start()` again if the timer had completed\n * @param newInterval If specified, sets a new non-negative interval in milliseconds to refire the callback\n * @param newNumberOfRepeats If specified, sets a new non-negative upper limit to the number of time this timer executes\n */\n reset(newInterval, newNumberOfRepeats) {\n if (!!newInterval && newInterval >= 0) {\n this._baseInterval = this.interval = newInterval;\n }\n if (!!this.maxNumberOfRepeats && this.maxNumberOfRepeats >= 0) {\n this.maxNumberOfRepeats = newNumberOfRepeats;\n if (!this.repeats) {\n throw new Error('repeats must be set to true if numberOfRepeats is set');\n }\n }\n this._complete = false;\n this._elapsedTime = 0;\n this._numberOfTicks = 0;\n }\n get timesRepeated() {\n return this._numberOfTicks;\n }\n getTimeRunning() {\n return this._totalTimeAlive;\n }\n /**\n * @returns milliseconds until the next action callback, if complete will return 0\n */\n get timeToNextAction() {\n if (this.complete) {\n return 0;\n }\n return this.interval - this._elapsedTime;\n }\n /**\n * @returns milliseconds elapsed toward the next action\n */\n get timeElapsedTowardNextAction() {\n return this._elapsedTime;\n }\n get isRunning() {\n return this._running;\n }\n /**\n * Pauses the timer, time will no longer increment towards the next call\n */\n pause() {\n this._running = false;\n return this;\n }\n /**\n * Resumes the timer, time will now increment towards the next call.\n */\n resume() {\n this._running = true;\n return this;\n }\n /**\n * Starts the timer, if the timer was complete it will restart the timer and reset the elapsed time counter\n */\n start() {\n if (!this.scene) {\n this._logger.warn('Cannot start a timer not part of a scene, timer wont start until added');\n }\n this._running = true;\n if (this.complete) {\n this._complete = false;\n this._elapsedTime = 0;\n this._numberOfTicks = 0;\n }\n return this;\n }\n /**\n * Stops the timer and resets the elapsed time counter towards the next action invocation\n */\n stop() {\n this._running = false;\n this._elapsedTime = 0;\n this._numberOfTicks = 0;\n return this;\n }\n /**\n * Cancels the timer, preventing any further executions.\n */\n cancel() {\n this.pause();\n if (this.scene) {\n this.scene.cancelTimer(this);\n }\n }\n}\nTimer._MAX_ID = 0;\n\n\n/***/ }),\n\n/***/ \"./Trigger.ts\":\n/*!********************!*\\\n !*** ./Trigger.ts ***!\n \\********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Trigger: () => (/* binding */ Trigger),\n/* harmony export */ TriggerEvents: () => (/* binding */ TriggerEvents)\n/* harmony export */ });\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Events */ \"./Events.ts\");\n/* harmony import */ var _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Collision/CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Actor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Actor */ \"./Actor.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n\nconst TriggerEvents = {\n ExitTrigger: 'exit',\n EnterTrigger: 'enter'\n};\n/**\n * Triggers are a method of firing arbitrary code on collision. These are useful\n * as 'buttons', 'switches', or to trigger effects in a game. By default triggers\n * are invisible, and can only be seen when {@apilink Trigger.visible} is set to `true`.\n */\nclass Trigger extends _Actor__WEBPACK_IMPORTED_MODULE_0__.Actor {\n /**\n * @param options Trigger options\n */\n constructor(options) {\n var _a, _b, _c, _d;\n super({ ...options });\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_1__.EventEmitter();\n this.filter = (_a = options.filter) !== null && _a !== void 0 ? _a : (() => true);\n this.repeat = (_b = options.repeat) !== null && _b !== void 0 ? _b : -1;\n this.action = (_c = options.action) !== null && _c !== void 0 ? _c : (() => undefined);\n this.target = options.target;\n this.graphics.isVisible = (_d = options.visible) !== null && _d !== void 0 ? _d : false;\n this.body.collisionType = _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.Passive;\n this.events.on('collisionstart', ({ other: collider }) => {\n if (!this._matchesTarget(collider.owner)) {\n return;\n }\n this.events.emit('enter', new _Events__WEBPACK_IMPORTED_MODULE_3__.EnterTriggerEvent(this, collider.owner));\n this._dispatchAction(collider.owner);\n // remove trigger if its done, -1 repeat forever\n if (this.repeat === 0) {\n this.kill();\n }\n });\n this.events.on('collisionend', ({ other: collider }) => {\n if (this._matchesTarget(collider.owner)) {\n this.events.emit('exit', new _Events__WEBPACK_IMPORTED_MODULE_3__.ExitTriggerEvent(this, collider.owner));\n }\n });\n }\n _matchesTarget(entity) {\n return this.filter(entity) && (this.target === undefined || this.target === entity);\n }\n _dispatchAction(target) {\n if (this.repeat !== 0) {\n this.action.call(this, target);\n this.repeat--;\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Assert.ts\":\n/*!************************!*\\\n !*** ./Util/Assert.ts ***!\n \\************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ assert: () => (/* binding */ assert)\n/* harmony export */ });\n/**\n * Asserts will throw in `process.env.NODE_ENV === 'development'` builds if the expression evaluates false\n */\nfunction assert(message, expression) {\n if (true) {\n if (!expression()) {\n throw new Error(message);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Browser.ts\":\n/*!*************************!*\\\n !*** ./Util/Browser.ts ***!\n \\*************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BrowserComponent: () => (/* binding */ BrowserComponent),\n/* harmony export */ BrowserEvents: () => (/* binding */ BrowserEvents)\n/* harmony export */ });\nclass BrowserComponent {\n on(eventName, handler) {\n if (this._nativeHandlers[eventName]) {\n this.off(eventName, this._nativeHandlers[eventName]);\n }\n this._nativeHandlers[eventName] = this._decorate(handler);\n this.nativeComponent.addEventListener(eventName, this._nativeHandlers[eventName]);\n }\n off(eventName, handler) {\n if (!handler) {\n handler = this._nativeHandlers[eventName];\n }\n this.nativeComponent.removeEventListener(eventName, handler);\n this._nativeHandlers[eventName] = null;\n }\n _decorate(handler) {\n return (evt) => {\n if (!this._paused) {\n handler(evt);\n }\n };\n }\n pause() {\n this._paused = true;\n }\n resume() {\n this._paused = false;\n }\n clear() {\n for (const event in this._nativeHandlers) {\n this.off(event);\n }\n }\n constructor(nativeComponent) {\n this.nativeComponent = nativeComponent;\n this._paused = false;\n this._nativeHandlers = {};\n }\n}\nclass BrowserEvents {\n constructor(_windowGlobal, _documentGlobal) {\n this._windowGlobal = _windowGlobal;\n this._documentGlobal = _documentGlobal;\n this._windowComponent = new BrowserComponent(this._windowGlobal);\n this._documentComponent = new BrowserComponent(this._documentGlobal);\n }\n get window() {\n return this._windowComponent;\n }\n get document() {\n return this._documentComponent;\n }\n pause() {\n this.window.pause();\n this.document.pause();\n }\n resume() {\n this.window.resume();\n this.document.resume();\n }\n clear() {\n this.window.clear();\n this.document.clear();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Clock.ts\":\n/*!***********************!*\\\n !*** ./Util/Clock.ts ***!\n \\***********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Clock: () => (/* binding */ Clock),\n/* harmony export */ StandardClock: () => (/* binding */ StandardClock),\n/* harmony export */ TestClock: () => (/* binding */ TestClock)\n/* harmony export */ });\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Fps__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Fps */ \"./Util/Fps.ts\");\n\n\n/**\n * Abstract Clock is the base type of all Clocks\n *\n * It has a few opinions\n * 1. It manages the calculation of what \"elapsed\" time means and thus maximum fps\n * 2. The default timing api is implemented in now()\n *\n * To implement your own clock, extend Clock and override start/stop to start and stop the clock, then call update() with whatever\n * method is unique to your clock implementation.\n */\nclass Clock {\n constructor(options) {\n var _a, _b, _c;\n this._onFatalException = () => {\n /* default nothing */\n };\n this._maxFps = Infinity;\n this._lastTime = 0;\n this._elapsed = 1;\n this._scheduledCbs = [];\n this._totalElapsed = 0;\n this._options = options;\n this.tick = options.tick;\n this._lastTime = (_a = this.now()) !== null && _a !== void 0 ? _a : 0;\n this._maxFps = (_b = options.maxFps) !== null && _b !== void 0 ? _b : this._maxFps;\n this._onFatalException = (_c = options.onFatalException) !== null && _c !== void 0 ? _c : this._onFatalException;\n this.fpsSampler = new _Fps__WEBPACK_IMPORTED_MODULE_0__.FpsSampler({\n initialFps: 60,\n nowFn: () => this.now()\n });\n }\n /**\n * Get the elapsed time for the last completed frame\n */\n elapsed() {\n return this._elapsed;\n }\n /**\n * Get the current time in milliseconds\n */\n now() {\n return performance.now();\n }\n toTestClock() {\n const testClock = new TestClock({\n ...this._options,\n defaultUpdateMs: 16.6\n });\n return testClock;\n }\n toStandardClock() {\n const clock = new StandardClock({\n ...this._options\n });\n return clock;\n }\n setFatalExceptionHandler(handler) {\n this._onFatalException = handler;\n }\n /**\n * Schedule a callback to fire given a timeout in milliseconds using the excalibur {@apilink Clock}\n *\n * This is useful to use over the built in browser `setTimeout` because callbacks will be tied to the\n * excalibur update clock, instead of browser time, this means that callbacks wont fire if the game is\n * stopped or paused.\n * @param cb callback to fire\n * @param timeoutMs Optionally specify a timeout in milliseconds from now, default is 0ms which means the next possible tick\n * @param timing Optionally specify a timeout in milliseconds from now, default is 0ms which means the next possible tick\n */\n schedule(cb, timeoutMs = 0, timing = 'preframe') {\n // Scheduled based on internal elapsed time\n const scheduledTime = this._totalElapsed + timeoutMs;\n this._scheduledCbs.push([cb, scheduledTime, timing]);\n }\n /**\n * Called internally to trigger scheduled callbacks in the clock\n * @param timing\n * @internal\n */\n __runScheduledCbs(timing = 'preframe') {\n // walk backwards to delete items as we loop\n for (let i = this._scheduledCbs.length - 1; i > -1; i--) {\n if (timing === this._scheduledCbs[i][2] && this._scheduledCbs[i][1] <= this._totalElapsed) {\n this._scheduledCbs[i][0](this._elapsed);\n this._scheduledCbs.splice(i, 1);\n }\n }\n }\n update(overrideUpdateMs) {\n try {\n this.fpsSampler.start();\n // Get the time to calculate time-elapsed\n const now = this.now();\n let elapsed = now - this._lastTime || 1; // first frame\n // Constrain fps\n const fpsInterval = 1000 / this._maxFps;\n // only run frame if enough time has elapsed\n if (elapsed >= fpsInterval) {\n let leftover = 0;\n if (fpsInterval !== 0) {\n leftover = elapsed % fpsInterval;\n elapsed = elapsed - leftover; // shift elapsed to be \"in phase\" with the current loop fps\n }\n // Resolves issue #138 if the game has been paused, or blurred for\n // more than a 200 milliseconds, reset elapsed time to 1. This improves reliability\n // and provides more expected behavior when the engine comes back\n // into focus\n if (elapsed > 200) {\n elapsed = 1;\n }\n // tick the mainloop and run scheduled callbacks\n this._elapsed = overrideUpdateMs || elapsed;\n this._totalElapsed += this._elapsed;\n this.__runScheduledCbs('preframe');\n this.tick(overrideUpdateMs || elapsed);\n this.__runScheduledCbs('postframe');\n if (fpsInterval !== 0) {\n this._lastTime = now - leftover;\n }\n else {\n this._lastTime = now;\n }\n this.fpsSampler.end();\n }\n }\n catch (e) {\n this._onFatalException(e);\n this.stop();\n }\n }\n}\n/**\n * The {@apilink StandardClock} implements the requestAnimationFrame browser api to run the tick()\n */\nclass StandardClock extends Clock {\n constructor(options) {\n super(options);\n this._running = false;\n }\n isRunning() {\n return this._running;\n }\n start() {\n if (this._running) {\n return;\n }\n this._running = true;\n const mainloop = () => {\n // stop the loop\n if (!this._running) {\n return;\n }\n try {\n // request next loop\n this._requestId = window.requestAnimationFrame(mainloop);\n this.update();\n }\n catch (e) {\n window.cancelAnimationFrame(this._requestId);\n throw e;\n }\n };\n // begin the first frame\n mainloop();\n }\n stop() {\n window.cancelAnimationFrame(this._requestId);\n this._running = false;\n }\n}\n/**\n * The TestClock is meant for debugging interactions in excalibur that require precise timing to replicate or test\n */\nclass TestClock extends Clock {\n constructor(options) {\n super({\n ...options\n });\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this._running = false;\n this._currentTime = 0;\n this._updateMs = options.defaultUpdateMs;\n }\n /**\n * Get the current time in milliseconds\n */\n now() {\n var _a;\n return (_a = this._currentTime) !== null && _a !== void 0 ? _a : 0;\n }\n isRunning() {\n return this._running;\n }\n start() {\n this._running = true;\n }\n stop() {\n this._running = false;\n }\n /**\n * Manually step the clock forward 1 tick, optionally specify an elapsed time in milliseconds\n * @param overrideUpdateMs\n */\n step(overrideUpdateMs) {\n const time = overrideUpdateMs !== null && overrideUpdateMs !== void 0 ? overrideUpdateMs : this._updateMs;\n if (this._running) {\n // to be comparable to RAF this needs to be a full blown Task\n // For example, images cannot decode synchronously in a single step\n this.update(time);\n this._currentTime += time;\n }\n else {\n this._logger.warn('The clock is not running, no step will be performed');\n }\n }\n /**\n * Run a number of steps that tick the clock, optionally specify an elapsed time in milliseconds\n * @param numberOfSteps\n * @param overrideUpdateMs\n */\n run(numberOfSteps, overrideUpdateMs) {\n for (let i = 0; i < numberOfSteps; i++) {\n this.step(overrideUpdateMs !== null && overrideUpdateMs !== void 0 ? overrideUpdateMs : this._updateMs);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Coroutine.ts\":\n/*!***************************!*\\\n !*** ./Util/Coroutine.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ coroutine: () => (/* binding */ coroutine)\n/* harmony export */ });\n/* harmony import */ var _Context__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Context */ \"./Context.ts\");\n/* harmony import */ var _Engine__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Engine */ \"./Engine.ts\");\n/* harmony import */ var _Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Log */ \"./Util/Log.ts\");\n\n\n\nconst InsideCoroutineContext = (0,_Context__WEBPACK_IMPORTED_MODULE_0__.createContext)();\nconst generatorFunctionDeclaration = /^\\s*(?:function)?\\*/;\n/**\n *\n */\nfunction isCoroutineGenerator(x) {\n if (typeof x !== 'function') {\n return false;\n }\n if (generatorFunctionDeclaration.test(Function.prototype.toString.call(x))) {\n return true;\n }\n if (!Object.getPrototypeOf) {\n return false;\n }\n return Object.getPrototypeOf(x) === Object.getPrototypeOf(new Function('return function * () {}')());\n}\n/**\n *\n */\nfunction coroutine(...args) {\n var _a;\n const logger = _Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n let coroutineGenerator;\n let thisArg;\n let options;\n let passedEngine;\n // coroutine(coroutineGenerator: CoroutineGenerator, options?: CoroutineOptions): CoroutineInstance;\n if (isCoroutineGenerator(args[0])) {\n thisArg = globalThis;\n coroutineGenerator = args[0];\n options = args[1];\n }\n // coroutine(thisArg: any, coroutineGenerator: CoroutineGenerator, options?: CoroutineOptions): CoroutineInstance;\n if (isCoroutineGenerator(args[1])) {\n thisArg = args[0];\n coroutineGenerator = args[1];\n options = args[2];\n }\n // coroutine(thisArg: any, engine: Engine, coroutineGenerator: CoroutineGenerator, options?: CoroutineOptions): CoroutineInstance;\n if (args[1] instanceof _Engine__WEBPACK_IMPORTED_MODULE_2__.Engine) {\n thisArg = args[0];\n passedEngine = args[1];\n coroutineGenerator = args[2];\n options = args[3];\n }\n // coroutine(engine: Engine, coroutineGenerator: CoroutineGenerator, options?: CoroutineOptions): CoroutineInstance;\n if (args[0] instanceof _Engine__WEBPACK_IMPORTED_MODULE_2__.Engine) {\n thisArg = globalThis;\n passedEngine = args[0];\n coroutineGenerator = args[1];\n options = args[2];\n }\n const inside = (0,_Context__WEBPACK_IMPORTED_MODULE_0__.useContext)(InsideCoroutineContext);\n const schedule = options === null || options === void 0 ? void 0 : options.timing;\n const autostart = inside ? false : (_a = options === null || options === void 0 ? void 0 : options.autostart) !== null && _a !== void 0 ? _a : true;\n let engine;\n try {\n engine = passedEngine !== null && passedEngine !== void 0 ? passedEngine : _Engine__WEBPACK_IMPORTED_MODULE_2__.Engine.useEngine();\n }\n catch (_) {\n throw Error('Cannot run coroutine without engine parameter outside of an excalibur lifecycle method.\\n' +\n 'Pass an engine parameter to ex.coroutine(engine, function * {...})');\n }\n let started = false;\n let completed = false;\n let cancelled = false;\n const generatorFcn = coroutineGenerator.bind(thisArg);\n const generator = generatorFcn();\n let loop;\n const complete = new Promise((resolve, reject) => {\n loop = (elapsed) => {\n try {\n if (cancelled) {\n completed = true;\n resolve();\n return;\n }\n const { done, value } = InsideCoroutineContext.scope(true, () => generator.next(elapsed));\n if (done || cancelled) {\n completed = true;\n resolve();\n return;\n }\n if (value instanceof Promise) {\n value.then(() => {\n // schedule next loop\n engine.clock.schedule(loop, 0, schedule);\n });\n }\n else if (value === undefined || value === void 0) {\n // schedule next frame\n engine.clock.schedule(loop, 0, schedule);\n }\n else {\n // schedule value milliseconds from now\n engine.clock.schedule(loop, value || 0, schedule);\n }\n }\n catch (e) {\n reject(e);\n return;\n }\n };\n if (autostart) {\n started = true;\n loop(engine.clock.elapsed()); // run first frame immediately\n }\n });\n const co = {\n isRunning: () => {\n return started && !cancelled && !completed;\n },\n isComplete: () => {\n return completed;\n },\n cancel: () => {\n cancelled = true;\n },\n start: () => {\n if (!started) {\n started = true;\n loop(engine.clock.elapsed());\n }\n else {\n logger.warn('.start() was called on a coroutine that was already started, this is probably a bug:\\n', Function.prototype.toString.call(generatorFcn));\n }\n return co;\n },\n generator,\n done: complete,\n then: complete.then.bind(complete),\n [Symbol.iterator]: () => {\n // TODO warn if a coroutine is already running\n // TODO warn if a coroutine is cancelled\n return generator;\n }\n };\n return co;\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Decorators.ts\":\n/*!****************************!*\\\n !*** ./Util/Decorators.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ maxMessages: () => (/* binding */ maxMessages),\n/* harmony export */ obsolete: () => (/* binding */ obsolete),\n/* harmony export */ resetObsoleteCounter: () => (/* binding */ resetObsoleteCounter)\n/* harmony export */ });\n/* harmony import */ var _Flags__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Flags */ \"./Flags.ts\");\n/* harmony import */ var _Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Log */ \"./Util/Log.ts\");\n\n\nconst maxMessages = 5;\nconst obsoleteMessage = {};\nconst resetObsoleteCounter = () => {\n for (const message in obsoleteMessage) {\n obsoleteMessage[message] = 0;\n }\n};\nconst logMessage = (message, options) => {\n const suppressObsoleteMessages = _Flags__WEBPACK_IMPORTED_MODULE_0__.Flags.isEnabled('suppress-obsolete-message');\n if (obsoleteMessage[message] < maxMessages && !suppressObsoleteMessages) {\n _Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance().warn(message);\n // tslint:disable-next-line: no-console\n if (console.trace && options.showStackTrace) {\n // tslint:disable-next-line: no-console\n console.trace();\n }\n }\n obsoleteMessage[message]++;\n};\n/**\n * Obsolete decorator for marking Excalibur methods obsolete, you can optionally specify a custom message and/or alternate replacement\n * method do the deprecated one. Inspired by https://github.com/jayphelps/core-decorators.js\n */\nfunction obsolete(options) {\n options = {\n message: 'This feature will be removed in future versions of Excalibur.',\n alternateMethod: null,\n showStackTrace: false,\n ...options\n };\n return function (target, property, descriptor) {\n if (descriptor &&\n !(typeof descriptor.value === 'function' || typeof descriptor.get === 'function' || typeof descriptor.set === 'function')) {\n throw new SyntaxError('Only classes/functions/getters/setters can be marked as obsolete');\n }\n const methodSignature = `${target.name || ''}${target.name && property ? '.' : ''}${property ? property : ''}`;\n const message = `${methodSignature} is marked obsolete: ${options.message}` +\n (options.alternateMethod ? ` Use ${options.alternateMethod} instead` : '');\n if (!obsoleteMessage[message]) {\n obsoleteMessage[message] = 0;\n }\n // If descriptor is null it is a class\n const method = descriptor ? { ...descriptor } : target;\n if (!descriptor) {\n // with es2015 classes we need to change our decoration tactic\n class DecoratedClass extends method {\n constructor(...args) {\n logMessage(message, options);\n super(...args);\n }\n }\n return DecoratedClass;\n }\n if (descriptor && descriptor.value) {\n method.value = function () {\n logMessage(message, options);\n return descriptor.value.apply(this, arguments);\n };\n return method;\n }\n if (descriptor && descriptor.get) {\n method.get = function () {\n logMessage(message, options);\n return descriptor.get.apply(this, arguments);\n };\n }\n if (descriptor && descriptor.set) {\n method.set = function () {\n logMessage(message, options);\n return descriptor.set.apply(this, arguments);\n };\n }\n return method;\n };\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Detector.ts\":\n/*!**************************!*\\\n !*** ./Util/Detector.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Detector: () => (/* binding */ Detector)\n/* harmony export */ });\n/* harmony import */ var _Log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Log */ \"./Util/Log.ts\");\n\n/**\n * This is the list of features that will be used to log the supported\n * features to the console when Detector.logBrowserFeatures() is called.\n */\nconst REPORTED_FEATURES = {\n webgl: 'WebGL',\n webaudio: 'WebAudio',\n gamepadapi: 'Gamepad API'\n};\n/**\n * Excalibur internal feature detection helper class\n */\nclass Detector {\n constructor() {\n this._features = null;\n this.failedTests = [];\n // critical browser features required for ex to run\n this._criticalTests = {\n // Test canvas/2d context support\n canvasSupport: function () {\n const elem = document.createElement('canvas');\n return !!(elem.getContext && elem.getContext('2d'));\n },\n // Test array buffer support ex uses for downloading binary data\n arrayBufferSupport: function () {\n const xhr = new XMLHttpRequest();\n xhr.open('GET', '/');\n try {\n xhr.responseType = 'arraybuffer';\n }\n catch (e) {\n return false;\n }\n return xhr.responseType === 'arraybuffer';\n },\n // Test data urls ex uses for sprites\n dataUrlSupport: function () {\n const canvas = document.createElement('canvas');\n return canvas.toDataURL('image/png').indexOf('data:image/png') === 0;\n },\n // Test object url support for loading\n objectUrlSupport: function () {\n return 'URL' in window && 'revokeObjectURL' in URL && 'createObjectURL' in URL;\n },\n // RGBA support for colors\n rgbaSupport: function () {\n const style = document.createElement('a').style;\n style.cssText = 'background-color:rgba(150,255,150,.5)';\n return ('' + style.backgroundColor).indexOf('rgba') > -1;\n }\n };\n // warnings excalibur performance will be degraded\n this._warningTest = {\n webAudioSupport: function () {\n return !!(window.AudioContext ||\n window.webkitAudioContext ||\n window.mozAudioContext ||\n window.msAudioContext ||\n window.oAudioContext);\n },\n webglSupport: function () {\n const elem = document.createElement('canvas');\n return !!(elem.getContext && elem.getContext('webgl'));\n }\n };\n this._features = this._loadBrowserFeatures();\n }\n /**\n * Returns a map of currently supported browser features. This method\n * treats the features as a singleton and will only calculate feature\n * support if it has not previously been done.\n */\n getBrowserFeatures() {\n if (this._features === null) {\n this._features = this._loadBrowserFeatures();\n }\n return this._features;\n }\n /**\n * Report on non-critical browser support for debugging purposes.\n * Use native browser console colors for visibility.\n */\n logBrowserFeatures() {\n let msg = '%cSUPPORTED BROWSER FEATURES\\n==========================%c\\n';\n const args = ['font-weight: bold; color: navy', 'font-weight: normal; color: inherit'];\n const supported = this.getBrowserFeatures();\n for (const feature of Object.keys(REPORTED_FEATURES)) {\n if (supported[feature]) {\n msg += '(%c\\u2713%c)'; // (✓)\n args.push('font-weight: bold; color: green');\n args.push('font-weight: normal; color: inherit');\n }\n else {\n msg += '(%c\\u2717%c)'; // (✗)\n args.push('font-weight: bold; color: red');\n args.push('font-weight: normal; color: inherit');\n }\n msg += ' ' + REPORTED_FEATURES[feature] + '\\n';\n }\n args.unshift(msg);\n // eslint-disable-next-line no-console\n console.log.apply(console, args);\n }\n /**\n * Executes several IIFE's to get a constant reference to supported\n * features within the current execution context.\n */\n _loadBrowserFeatures() {\n return {\n // IIFE to check canvas support\n canvas: (() => {\n return this._criticalTests.canvasSupport();\n })(),\n // IIFE to check arraybuffer support\n arraybuffer: (() => {\n return this._criticalTests.arrayBufferSupport();\n })(),\n // IIFE to check dataurl support\n dataurl: (() => {\n return this._criticalTests.dataUrlSupport();\n })(),\n // IIFE to check objecturl support\n objecturl: (() => {\n return this._criticalTests.objectUrlSupport();\n })(),\n // IIFE to check rgba support\n rgba: (() => {\n return this._criticalTests.rgbaSupport();\n })(),\n // IIFE to check webaudio support\n webaudio: (() => {\n return this._warningTest.webAudioSupport();\n })(),\n // IIFE to check webgl support\n webgl: (() => {\n return this._warningTest.webglSupport();\n })(),\n // IIFE to check gamepadapi support\n gamepadapi: (() => {\n return !!navigator.getGamepads;\n })()\n };\n }\n test() {\n // Critical test will for ex not to run\n let failedCritical = false;\n for (const test in this._criticalTests) {\n if (!this._criticalTests[test].call(this)) {\n this.failedTests.push(test);\n _Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance().error('Critical browser feature missing, Excalibur requires:', test);\n failedCritical = true;\n }\n }\n if (failedCritical) {\n return false;\n }\n // Warning tests do not for ex to return false to compatibility\n for (const warning in this._warningTest) {\n if (!this._warningTest[warning]()) {\n _Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance().warn('Warning browser feature missing, Excalibur will have reduced performance:', warning);\n }\n }\n return true;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/DrawUtil.ts\":\n/*!**************************!*\\\n !*** ./Util/DrawUtil.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ circle: () => (/* binding */ circle),\n/* harmony export */ line: () => (/* binding */ line),\n/* harmony export */ point: () => (/* binding */ point),\n/* harmony export */ roundRect: () => (/* binding */ roundRect),\n/* harmony export */ vector: () => (/* binding */ vector)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n\n/* istanbul ignore next */\n/**\n * Draw a line on canvas context\n * @param ctx The canvas context\n * @param color The color of the line\n * @param x1 The start x coordinate\n * @param y1 The start y coordinate\n * @param x2 The ending x coordinate\n * @param y2 The ending y coordinate\n * @param thickness The line thickness\n * @param cap The {@apilink LineCapStyle} (butt, round, or square)\n */\nfunction line(ctx, color = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Red, x1, y1, x2, y2, thickness = 1, cap = 'butt') {\n ctx.save();\n ctx.beginPath();\n ctx.lineWidth = thickness;\n ctx.lineCap = cap;\n ctx.strokeStyle = color.toString();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.closePath();\n ctx.stroke();\n ctx.restore();\n}\n/* istanbul ignore next */\n/**\n * Draw the vector as a point onto the canvas.\n */\nfunction point(ctx, color = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Red, point) {\n ctx.beginPath();\n ctx.strokeStyle = color.toString();\n ctx.arc(point.x, point.y, 5, 0, Math.PI * 2);\n ctx.closePath();\n ctx.stroke();\n}\n/**\n * Draw the vector as a line onto the canvas starting a origin point.\n */\n/* istanbul ignore next */\n/**\n *\n */\nfunction vector(ctx, color, origin, vector, scale = 1.0) {\n const c = color ? color.toString() : 'blue';\n const v = vector.scale(scale);\n ctx.beginPath();\n ctx.strokeStyle = c;\n ctx.moveTo(origin.x, origin.y);\n ctx.lineTo(origin.x + v.x, origin.y + v.y);\n ctx.closePath();\n ctx.stroke();\n}\n/**\n * Draw a round rectangle on a canvas context\n * @param ctx The canvas context\n * @param x The top-left x coordinate\n * @param y The top-left y coordinate\n * @param width The width of the rectangle\n * @param height The height of the rectangle\n * @param radius The border radius of the rectangle\n * @param stroke The {@apilink Color} to stroke rectangle with\n * @param fill The {@apilink Color} to fill rectangle with\n */\nfunction roundRect(ctx, x, y, width, height, radius = 5, stroke = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.White, fill = null) {\n let br;\n if (typeof radius === 'number') {\n br = { tl: radius, tr: radius, br: radius, bl: radius };\n }\n else {\n const defaultRadius = { tl: 0, tr: 0, br: 0, bl: 0 };\n for (const prop in defaultRadius) {\n if (defaultRadius.hasOwnProperty(prop)) {\n const side = prop;\n br[side] = radius[side] || defaultRadius[side];\n }\n }\n }\n ctx.beginPath();\n ctx.moveTo(x + br.tl, y);\n ctx.lineTo(x + width - br.tr, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + br.tr);\n ctx.lineTo(x + width, y + height - br.br);\n ctx.quadraticCurveTo(x + width, y + height, x + width - br.br, y + height);\n ctx.lineTo(x + br.bl, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - br.bl);\n ctx.lineTo(x, y + br.tl);\n ctx.quadraticCurveTo(x, y, x + br.tl, y);\n ctx.closePath();\n if (fill) {\n ctx.fillStyle = fill.toString();\n ctx.fill();\n }\n if (stroke) {\n ctx.strokeStyle = stroke.toString();\n ctx.stroke();\n }\n}\n/**\n *\n */\nfunction circle(ctx, x, y, radius, stroke = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.White, fill = null) {\n ctx.beginPath();\n ctx.arc(x, y, radius, 0, Math.PI * 2);\n ctx.closePath();\n if (fill) {\n ctx.fillStyle = fill.toString();\n ctx.fill();\n }\n if (stroke) {\n ctx.strokeStyle = stroke.toString();\n ctx.stroke();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/EasingFunctions.ts\":\n/*!*********************************!*\\\n !*** ./Util/EasingFunctions.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EasingFunctions: () => (/* binding */ EasingFunctions)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n\n/**\n * Standard easing functions for motion in Excalibur, defined on a domain of [0, duration] and a range from [+startValue,+endValue]\n * Given a time, the function will return a value from positive startValue to positive endValue.\n *\n * ```js\n * function Linear (t) {\n * return t * t;\n * }\n *\n * // accelerating from zero velocity\n * function EaseInQuad (t) {\n * return t * t;\n * }\n *\n * // decelerating to zero velocity\n * function EaseOutQuad (t) {\n * return t * (2 - t);\n * }\n *\n * // acceleration until halfway, then deceleration\n * function EaseInOutQuad (t) {\n * return t < .5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n * }\n *\n * // accelerating from zero velocity\n * function EaseInCubic (t) {\n * return t * t * t;\n * }\n *\n * // decelerating to zero velocity\n * function EaseOutCubic (t) {\n * return (--t) * t * t + 1;\n * }\n *\n * // acceleration until halfway, then deceleration\n * function EaseInOutCubic (t) {\n * return t < .5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1;\n * }\n * ```\n */\nclass EasingFunctions {\n static CreateReversibleEasingFunction(easing) {\n return (time, start, end, duration) => {\n if (end < start) {\n return start - (easing(time, end, start, duration) - end);\n }\n else {\n return easing(time, start, end, duration);\n }\n };\n }\n static CreateVectorEasingFunction(easing) {\n return (time, start, end, duration) => {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(easing(time, start.x, end.x, duration), easing(time, start.y, end.y, duration));\n };\n }\n}\nEasingFunctions.Linear = EasingFunctions.CreateReversibleEasingFunction((currentTime, startValue, endValue, duration) => {\n endValue = endValue - startValue;\n return (endValue * currentTime) / duration + startValue;\n});\nEasingFunctions.EaseInQuad = EasingFunctions.CreateReversibleEasingFunction((currentTime, startValue, endValue, duration) => {\n endValue = endValue - startValue;\n currentTime /= duration;\n return endValue * currentTime * currentTime + startValue;\n});\nEasingFunctions.EaseOutQuad = EasingFunctions.CreateReversibleEasingFunction((currentTime, startValue, endValue, duration) => {\n endValue = endValue - startValue;\n currentTime /= duration;\n return -endValue * currentTime * (currentTime - 2) + startValue;\n});\nEasingFunctions.EaseInOutQuad = EasingFunctions.CreateReversibleEasingFunction((currentTime, startValue, endValue, duration) => {\n endValue = endValue - startValue;\n currentTime /= duration / 2;\n if (currentTime < 1) {\n return (endValue / 2) * currentTime * currentTime + startValue;\n }\n currentTime--;\n return (-endValue / 2) * (currentTime * (currentTime - 2) - 1) + startValue;\n});\nEasingFunctions.EaseInCubic = EasingFunctions.CreateReversibleEasingFunction((currentTime, startValue, endValue, duration) => {\n endValue = endValue - startValue;\n currentTime /= duration;\n return endValue * currentTime * currentTime * currentTime + startValue;\n});\nEasingFunctions.EaseOutCubic = EasingFunctions.CreateReversibleEasingFunction((currentTime, startValue, endValue, duration) => {\n endValue = endValue - startValue;\n currentTime /= duration;\n currentTime--;\n return endValue * (currentTime * currentTime * currentTime + 1) + startValue;\n});\nEasingFunctions.EaseInOutCubic = EasingFunctions.CreateReversibleEasingFunction((currentTime, startValue, endValue, duration) => {\n endValue = endValue - startValue;\n currentTime /= duration / 2;\n if (currentTime < 1) {\n return (endValue / 2) * currentTime * currentTime * currentTime + startValue;\n }\n currentTime -= 2;\n return (endValue / 2) * (currentTime * currentTime * currentTime + 2) + startValue;\n});\n\n\n/***/ }),\n\n/***/ \"./Util/Fps.ts\":\n/*!*********************!*\\\n !*** ./Util/Fps.ts ***!\n \\*********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FpsSampler: () => (/* binding */ FpsSampler)\n/* harmony export */ });\nclass FpsSampler {\n constructor(options) {\n var _a;\n this._samplePeriod = 100;\n this._currentFrameTime = 0;\n this._frames = 0;\n this._previousSampleTime = 0;\n this._beginFrameTime = 0;\n this._fps = options.initialFps;\n this._samplePeriod = (_a = options.samplePeriod) !== null && _a !== void 0 ? _a : this._samplePeriod;\n this._currentFrameTime = 1000 / options.initialFps;\n this._nowFn = options.nowFn;\n this._previousSampleTime = this._nowFn();\n }\n /**\n * Start of code block to sample FPS for\n */\n start() {\n this._beginFrameTime = this._nowFn();\n }\n /**\n * End of code block to sample FPS for\n */\n end() {\n this._frames++;\n const time = this._nowFn();\n this._currentFrameTime = time - this._beginFrameTime;\n if (time >= this._previousSampleTime + this._samplePeriod) {\n this._fps = (this._frames * 1000) / (time - this._previousSampleTime);\n this._previousSampleTime = time;\n this._frames = 0;\n }\n }\n /**\n * Return the currently sampled fps over the last sample period, by default every 100ms\n */\n get fps() {\n return this._fps;\n }\n /**\n * Return the instantaneous fps, this can be less useful because it will fluctuate given the current frames time\n */\n get instant() {\n return 1000 / this._currentFrameTime;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Future.ts\":\n/*!************************!*\\\n !*** ./Util/Future.ts ***!\n \\************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Future: () => (/* binding */ Future)\n/* harmony export */ });\n/**\n * Future is a wrapper around a native browser Promise to allow resolving/rejecting at any time\n */\nclass Future {\n constructor() {\n this._isCompleted = false;\n this.promise = new Promise((resolve, reject) => {\n this._resolver = resolve;\n this._rejecter = reject;\n });\n }\n get isCompleted() {\n return this._isCompleted;\n }\n resolve(value) {\n if (this._isCompleted) {\n return;\n }\n this._isCompleted = true;\n this._resolver(value);\n }\n reject(error) {\n if (this._isCompleted) {\n return;\n }\n this._isCompleted = true;\n this._rejecter(error);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/IFrame.ts\":\n/*!************************!*\\\n !*** ./Util/IFrame.ts ***!\n \\************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ isCrossOriginIframe: () => (/* binding */ isCrossOriginIframe)\n/* harmony export */ });\n/**\n * Checks if excalibur is in a x-origin iframe\n */\nfunction isCrossOriginIframe() {\n try {\n // Try and listen to events on top window frame if within an iframe.\n //\n // See https://github.com/excaliburjs/Excalibur/issues/1294\n //\n // Attempt to add an event listener, which triggers a DOMException on\n // cross-origin iframes\n const noop = () => {\n return;\n };\n window.top.addEventListener('blur', noop);\n window.top.removeEventListener('blur', noop);\n }\n catch (_a) {\n return true;\n }\n return false;\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Index.ts\":\n/*!***********************!*\\\n !*** ./Util/Index.ts ***!\n \\***********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ConsoleAppender: () => (/* reexport safe */ _Log__WEBPACK_IMPORTED_MODULE_1__.ConsoleAppender),\n/* harmony export */ DrawUtil: () => (/* reexport module object */ _DrawUtil__WEBPACK_IMPORTED_MODULE_4__),\n/* harmony export */ EasingFunctions: () => (/* reexport safe */ _EasingFunctions__WEBPACK_IMPORTED_MODULE_3__.EasingFunctions),\n/* harmony export */ LogLevel: () => (/* reexport safe */ _Log__WEBPACK_IMPORTED_MODULE_1__.LogLevel),\n/* harmony export */ Logger: () => (/* reexport safe */ _Log__WEBPACK_IMPORTED_MODULE_1__.Logger),\n/* harmony export */ Observable: () => (/* reexport safe */ _Observable__WEBPACK_IMPORTED_MODULE_2__.Observable),\n/* harmony export */ ScreenAppender: () => (/* reexport safe */ _Log__WEBPACK_IMPORTED_MODULE_1__.ScreenAppender),\n/* harmony export */ addItemToArray: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.addItemToArray),\n/* harmony export */ contains: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.contains),\n/* harmony export */ delay: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.delay),\n/* harmony export */ fail: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.fail),\n/* harmony export */ getPosition: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.getPosition),\n/* harmony export */ isObject: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.isObject),\n/* harmony export */ mergeDeep: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.mergeDeep),\n/* harmony export */ omit: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.omit),\n/* harmony export */ removeItemFromArray: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.removeItemFromArray)\n/* harmony export */ });\n/* harmony import */ var _Util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Util */ \"./Util/Util.ts\");\n/* harmony import */ var _Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Observable */ \"./Util/Observable.ts\");\n/* harmony import */ var _EasingFunctions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./EasingFunctions */ \"./Util/EasingFunctions.ts\");\n/* harmony import */ var _DrawUtil__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./DrawUtil */ \"./Util/DrawUtil.ts\");\n\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Util/Log.ts\":\n/*!*********************!*\\\n !*** ./Util/Log.ts ***!\n \\*********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ConsoleAppender: () => (/* binding */ ConsoleAppender),\n/* harmony export */ LogLevel: () => (/* binding */ LogLevel),\n/* harmony export */ Logger: () => (/* binding */ Logger),\n/* harmony export */ ScreenAppender: () => (/* binding */ ScreenAppender)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* eslint-disable no-console */\n\n\n/**\n * Logging level that Excalibur will tag\n */\nvar LogLevel;\n(function (LogLevel) {\n LogLevel[LogLevel[\"Debug\"] = 0] = \"Debug\";\n LogLevel[LogLevel[\"Info\"] = 1] = \"Info\";\n LogLevel[LogLevel[\"Warn\"] = 2] = \"Warn\";\n LogLevel[LogLevel[\"Error\"] = 3] = \"Error\";\n LogLevel[LogLevel[\"Fatal\"] = 4] = \"Fatal\";\n})(LogLevel || (LogLevel = {}));\n/**\n * Static singleton that represents the logging facility for Excalibur.\n * Excalibur comes built-in with a {@apilink ConsoleAppender} and {@apilink ScreenAppender}.\n * Derive from {@apilink Appender} to create your own logging appenders.\n */\nclass Logger {\n constructor() {\n this._appenders = [];\n /**\n * Gets or sets the default logging level. Excalibur will only log\n * messages if equal to or above this level. Default: {@apilink LogLevel.Info}\n */\n this.defaultLevel = LogLevel.Info;\n this._logOnceSet = new Set();\n if (Logger._INSTANCE) {\n throw new Error('Logger is a singleton');\n }\n Logger._INSTANCE = this;\n // Default console appender\n Logger._INSTANCE.addAppender(new ConsoleAppender());\n return Logger._INSTANCE;\n }\n /**\n * Gets the current static instance of Logger\n */\n static getInstance() {\n if (Logger._INSTANCE == null) {\n Logger._INSTANCE = new Logger();\n }\n return Logger._INSTANCE;\n }\n /**\n * Adds a new {@apilink Appender} to the list of appenders to write to\n */\n addAppender(appender) {\n this._appenders.push(appender);\n }\n /**\n * Clears all appenders from the logger\n */\n clearAppenders() {\n this._appenders.length = 0;\n }\n /**\n * Logs a message at a given LogLevel\n * @param level The LogLevel`to log the message at\n * @param args An array of arguments to write to an appender\n */\n _log(level, args) {\n if (level == null) {\n level = this.defaultLevel;\n }\n const len = this._appenders.length;\n for (let i = 0; i < len; i++) {\n if (level >= this.defaultLevel) {\n this._appenders[i].log(level, args);\n }\n }\n }\n _logOnce(level, args) {\n const serialized = level + args.join('+');\n if (this._logOnceSet.has(serialized)) {\n return;\n }\n else {\n this._logOnceSet.add(serialized);\n this._log(level, args);\n }\n }\n /**\n * Writes a log message at the {@apilink LogLevel.Debug} level\n * @param args Accepts any number of arguments\n */\n debug(...args) {\n this._log(LogLevel.Debug, args);\n }\n /**\n * Writes a log message once at the {@apilink LogLevel.Fatal} level, if it sees the same args again it wont log\n * @param args Accepts any number of arguments\n */\n debugOnce(...args) {\n this._logOnce(LogLevel.Debug, args);\n }\n /**\n * Writes a log message at the {@apilink LogLevel.Info} level\n * @param args Accepts any number of arguments\n */\n info(...args) {\n this._log(LogLevel.Info, args);\n }\n /**\n * Writes a log message once at the {@apilink LogLevel.Info} level, if it sees the same args again it wont log\n * @param args Accepts any number of arguments\n */\n infoOnce(...args) {\n this._logOnce(LogLevel.Info, args);\n }\n /**\n * Writes a log message at the {@apilink LogLevel.Warn} level\n * @param args Accepts any number of arguments\n */\n warn(...args) {\n this._log(LogLevel.Warn, args);\n }\n /**\n * Writes a log message once at the {@apilink LogLevel.Warn} level, if it sees the same args again it won't log\n * @param args Accepts any number of arguments\n */\n warnOnce(...args) {\n this._logOnce(LogLevel.Warn, args);\n }\n /**\n * Writes a log message at the {@apilink LogLevel.Error} level\n * @param args Accepts any number of arguments\n */\n error(...args) {\n this._log(LogLevel.Error, args);\n }\n /**\n * Writes a log message once at the {@apilink LogLevel.Error} level, if it sees the same args again it won't log\n * @param args Accepts any number of arguments\n */\n errorOnce(...args) {\n this._logOnce(LogLevel.Error, args);\n }\n /**\n * Writes a log message at the {@apilink LogLevel.Fatal} level\n * @param args Accepts any number of arguments\n */\n fatal(...args) {\n this._log(LogLevel.Fatal, args);\n }\n /**\n * Writes a log message once at the {@apilink LogLevel.Fatal} level, if it sees the same args again it won't log\n * @param args Accepts any number of arguments\n */\n fatalOnce(...args) {\n this._logOnce(LogLevel.Fatal, args);\n }\n}\nLogger._INSTANCE = null;\n/**\n * Console appender for browsers (i.e. `console.log`)\n */\nclass ConsoleAppender {\n /**\n * Logs a message at the given {@apilink LogLevel}\n * @param level Level to log at\n * @param args Arguments to log\n */\n log(level, args) {\n // Check for console support\n if (!console && !console.log && console.warn && console.error) {\n // todo maybe do something better than nothing\n return;\n }\n // Create a new console args array\n const consoleArgs = [];\n consoleArgs.unshift.apply(consoleArgs, args);\n consoleArgs.unshift('[' + LogLevel[level] + '] : ');\n if (level < LogLevel.Warn) {\n // Call .log for Debug/Info\n if (console.log.apply) {\n // this is required on some older browsers that don't support apply on console.log :(\n console.log.apply(console, consoleArgs);\n }\n else {\n console.log(consoleArgs.join(' '));\n }\n }\n else if (level < LogLevel.Error) {\n // Call .warn for Warn\n if (console.warn.apply) {\n console.warn.apply(console, consoleArgs);\n }\n else {\n console.warn(consoleArgs.join(' '));\n }\n }\n else {\n // Call .error for Error/Fatal\n if (console.error.apply) {\n console.error.apply(console, consoleArgs);\n }\n else {\n console.error(consoleArgs.join(' '));\n }\n }\n }\n}\n/**\n * On-screen (canvas) appender\n */\nclass ScreenAppender {\n constructor(options) {\n var _a, _b;\n this._messages = [];\n this._pos = 10;\n this._color = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Black;\n this._options = options;\n this.canvas = document.createElement('canvas');\n this._ctx = this.canvas.getContext('2d');\n this.canvas.style.position = 'absolute';\n this.canvas.style.zIndex = (_b = (_a = options.zIndex) === null || _a === void 0 ? void 0 : _a.toString()) !== null && _b !== void 0 ? _b : '99';\n document.body.appendChild(this.canvas);\n this._positionScreenAppenderCanvas();\n options.engine.screen.events.on('resize', () => {\n this._positionScreenAppenderCanvas();\n });\n }\n _positionScreenAppenderCanvas() {\n var _a, _b, _c, _d;\n const options = this._options;\n this.canvas.width = (_a = options.width) !== null && _a !== void 0 ? _a : options.engine.screen.resolution.width;\n this.canvas.height = (_b = options.height) !== null && _b !== void 0 ? _b : options.engine.screen.resolution.height;\n this.canvas.style.position = 'absolute';\n const pagePos = options.engine.screen.screenToPageCoordinates((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0));\n this.canvas.style.left = pagePos.x + 'px';\n this.canvas.style.top = pagePos.y + 'px';\n this._pos = (_c = options.xPos) !== null && _c !== void 0 ? _c : this._pos;\n this._color = (_d = options.color) !== null && _d !== void 0 ? _d : this._color;\n }\n /**\n * Logs a message at the given {@apilink LogLevel}\n * @param level Level to log at\n * @param args Arguments to log\n */\n log(level, args) {\n const message = args.join(',');\n this._ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n this._messages.unshift('[' + LogLevel[level] + '] : ' + message);\n let pos = 10;\n this._messages = this._messages.slice(0, 1000);\n for (let i = 0; i < this._messages.length; i++) {\n this._ctx.fillStyle = this._color.toRGBA();\n this._ctx.fillText(this._messages[i], this._pos, pos);\n pos += 10;\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Observable.ts\":\n/*!****************************!*\\\n !*** ./Util/Observable.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Observable: () => (/* binding */ Observable)\n/* harmony export */ });\n/**\n * Simple Observable implementation\n * @template T is the typescript Type that defines the data being observed\n */\nclass Observable {\n constructor() {\n this.observers = [];\n this.subscriptions = [];\n }\n /**\n * Register an observer to listen to this observable\n * @param observer\n */\n register(observer) {\n this.observers.push(observer);\n }\n /**\n * Register a callback to listen to this observable\n * @param func\n */\n subscribe(func) {\n this.subscriptions.push(func);\n }\n /**\n * Remove an observer from the observable\n * @param observer\n */\n unregister(observer) {\n const i = this.observers.indexOf(observer);\n if (i !== -1) {\n this.observers.splice(i, 1);\n }\n }\n /**\n * Remove a callback that is listening to this observable\n * @param func\n */\n unsubscribe(func) {\n const i = this.subscriptions.indexOf(func);\n if (i !== -1) {\n this.subscriptions.splice(i, 1);\n }\n }\n /**\n * Broadcasts a message to all observers and callbacks\n * @param message\n */\n notifyAll(message) {\n const observersLength = this.observers.length;\n for (let i = 0; i < observersLength; i++) {\n this.observers[i].notify(message);\n }\n const subscriptionsLength = this.subscriptions.length;\n for (let i = 0; i < subscriptionsLength; i++) {\n this.subscriptions[i](message);\n }\n }\n /**\n * Removes all observers and callbacks\n */\n clear() {\n this.observers.length = 0;\n this.subscriptions.length = 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Pool.ts\":\n/*!**********************!*\\\n !*** ./Util/Pool.ts ***!\n \\**********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Pool: () => (/* binding */ Pool)\n/* harmony export */ });\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n\nclass Pool {\n constructor(builder, recycler, maxObjects = 100) {\n this.builder = builder;\n this.recycler = recycler;\n this.maxObjects = maxObjects;\n this.totalAllocations = 0;\n this.index = 0;\n this.objects = [];\n this.disableWarnings = false;\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance();\n }\n dispose() {\n this.objects.length = 0;\n }\n preallocate() {\n for (let i = 0; i < this.maxObjects; i++) {\n this.objects[i] = this.builder();\n }\n }\n /**\n * Use many instances out of the in the context and return all to the pool.\n *\n * By returning values out of the context they will be un-hooked from the pool and are free to be passed to consumers\n * @param context\n */\n using(context) {\n const result = context(this);\n if (result) {\n return this.done(...result);\n }\n return this.done();\n }\n /**\n * Use a single instance out of th pool and immediately return it to the pool\n * @param context\n */\n borrow(context) {\n const object = this.get();\n context(object);\n this.index--;\n }\n /**\n * Retrieve a value from the pool, will allocate a new instance if necessary or recycle from the pool\n */\n get() {\n if (this.index === this.maxObjects) {\n if (!this.disableWarnings) {\n this._logger.warn('Max pooled objects reached, possible memory leak? Doubling');\n }\n this.maxObjects = this.maxObjects * 2;\n }\n if (this.objects[this.index]) {\n // Pool has an available object already constructed\n if (this.recycler) {\n return this.recycler(this.objects[this.index++]);\n }\n return this.objects[this.index++];\n }\n else {\n // New allocation\n this.totalAllocations++;\n const object = (this.objects[this.index++] = this.builder());\n return object;\n }\n }\n done(...objects) {\n // All objects in pool now considered \"free\"\n this.index = 0;\n for (const object of objects) {\n const poolIndex = this.objects.indexOf(object);\n // Build a new object to take the pool place\n this.objects[poolIndex] = this.builder();\n this.totalAllocations++;\n }\n return objects;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/RentalPool.ts\":\n/*!****************************!*\\\n !*** ./Util/RentalPool.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RentalPool: () => (/* binding */ RentalPool)\n/* harmony export */ });\nclass RentalPool {\n constructor(builder, cleaner, preAllocate = 1) {\n this.builder = builder;\n this.cleaner = cleaner;\n this._pool = [];\n this._size = 0;\n this.grow(preAllocate);\n }\n /**\n * Grow the pool size by an amount\n * @param amount\n */\n grow(amount) {\n if (amount > 0) {\n this._size += amount;\n for (let i = 0; i < amount; i++) {\n this._pool.push(this.builder());\n }\n }\n }\n /**\n * Rent an object from the pool, optionally clean it. If not cleaned previous state may be set.\n *\n * The pool will automatically double if depleted\n * @param clean\n */\n rent(clean = false) {\n if (this._pool.length === 0) {\n this.grow(this._size);\n }\n return clean ? this.cleaner(this._pool.pop()) : this._pool.pop();\n }\n /**\n * Return an object to the pool\n * @param object\n */\n return(object) {\n this._pool.push(object);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Semaphore.ts\":\n/*!***************************!*\\\n !*** ./Util/Semaphore.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Semaphore: () => (/* binding */ Semaphore)\n/* harmony export */ });\n/* harmony import */ var _Future__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Future */ \"./Util/Future.ts\");\n\nclass AsyncWaitQueue {\n constructor() {\n // Code from StephenCleary https://gist.github.com/StephenCleary/ba50b2da419c03b9cba1d20cb4654d5e\n this._queue = [];\n }\n get length() {\n return this._queue.length;\n }\n enqueue() {\n const future = new _Future__WEBPACK_IMPORTED_MODULE_0__.Future();\n this._queue.push(future);\n return future.promise;\n }\n dequeue(value) {\n const future = this._queue.shift();\n future.resolve(value);\n }\n}\n/**\n * Semaphore allows you to limit the amount of async calls happening between `enter()` and `exit()`\n *\n * This can be useful when limiting the number of http calls, browser api calls, etc either for performance or to work\n * around browser limitations like max Image.decode() calls in chromium being 256.\n */\nclass Semaphore {\n constructor(_count) {\n this._count = _count;\n this._waitQueue = new AsyncWaitQueue();\n }\n get count() {\n return this._count;\n }\n get waiting() {\n return this._waitQueue.length;\n }\n // eslint-disable-next-line require-await\n async enter() {\n if (this._count !== 0) {\n this._count--;\n return Promise.resolve();\n }\n return this._waitQueue.enqueue();\n }\n exit(count = 1) {\n if (count === 0) {\n return;\n }\n while (count !== 0 && this._waitQueue.length !== 0) {\n this._waitQueue.dequeue(null);\n count--;\n }\n this._count += count;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Sound.ts\":\n/*!***********************!*\\\n !*** ./Util/Sound.ts ***!\n \\***********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ canPlayFile: () => (/* binding */ canPlayFile)\n/* harmony export */ });\n/* harmony import */ var _Log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Log */ \"./Util/Log.ts\");\n\n/**\n * Whether or not the browser can play this file as HTML5 Audio\n */\nfunction canPlayFile(file) {\n try {\n const a = new Audio();\n const filetype = /.*\\.([A-Za-z0-9]+)(?:(?:\\?|\\#).*)*$/;\n const type = file.match(filetype)[1];\n if (a.canPlayType('audio/' + type)) {\n return true;\n }\n else {\n return false;\n }\n }\n catch (e) {\n _Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance().warn('Cannot determine audio support, assuming no support for the Audio Tag', e);\n return false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/StateMachine.ts\":\n/*!******************************!*\\\n !*** ./Util/StateMachine.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ StateMachine: () => (/* binding */ StateMachine)\n/* harmony export */ });\nclass StateMachine {\n constructor() {\n this.states = new Map();\n }\n get currentState() {\n return this._currentState;\n }\n set currentState(state) {\n this._currentState = state;\n }\n static create(machineDescription, data) {\n const machine = new StateMachine();\n machine.data = data;\n for (const stateName in machineDescription.states) {\n machine.states.set(stateName, {\n name: stateName,\n ...machineDescription.states[stateName]\n });\n }\n // validate transitions are states\n for (const state of machine.states.values()) {\n for (const transitionState of state.transitions) {\n if (transitionState === '*') {\n continue;\n }\n if (!machine.states.has(transitionState)) {\n throw Error(`Invalid state machine, state [${state.name}] has a transition to another state that doesn't exist [${transitionState}]`);\n }\n }\n }\n machine.currentState = machine.startState = machine.states.get(machineDescription.start);\n return machine;\n }\n in(state) {\n return this.currentState.name === state;\n }\n go(stateName, eventData) {\n var _a, _b;\n if (this.currentState.transitions.includes(stateName) || this.currentState.transitions.includes('*')) {\n const potentialNewState = this.states.get(stateName);\n if (this.currentState.onExit) {\n const canExit = (_a = this.currentState) === null || _a === void 0 ? void 0 : _a.onExit({ to: potentialNewState.name, data: this.data });\n if (canExit === false) {\n return false;\n }\n }\n if (potentialNewState === null || potentialNewState === void 0 ? void 0 : potentialNewState.onEnter) {\n const canEnter = potentialNewState === null || potentialNewState === void 0 ? void 0 : potentialNewState.onEnter({ from: this.currentState.name, eventData, data: this.data });\n if (canEnter === false) {\n return false;\n }\n }\n this.currentState = potentialNewState;\n if ((_b = this.currentState) === null || _b === void 0 ? void 0 : _b.onState) {\n this.currentState.onState();\n }\n return true;\n }\n return false;\n }\n update(elapsed) {\n if (this.currentState.onUpdate) {\n this.currentState.onUpdate(this.data, elapsed);\n }\n }\n save(saveKey) {\n localStorage.setItem(saveKey, JSON.stringify({\n currentState: this.currentState.name,\n data: this.data\n }));\n }\n restore(saveKey) {\n const state = JSON.parse(localStorage.getItem(saveKey));\n this.currentState = this.states.get(state.currentState);\n this.data = state.data;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Toaster.ts\":\n/*!*************************!*\\\n !*** ./Util/Toaster.ts ***!\n \\*************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Toaster: () => (/* binding */ Toaster)\n/* harmony export */ });\n/* harmony import */ var _Toaster_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Toaster.css */ \"./Util/Toaster.css\");\n\n/**\n * The Toaster is only meant to be called from inside Excalibur to display messages to players\n */\nclass Toaster {\n constructor() {\n this._toasterCss = _Toaster_css__WEBPACK_IMPORTED_MODULE_0__[\"default\"].toString();\n this._isInitialized = false;\n }\n _initialize() {\n if (!this._isInitialized) {\n this._container = document.createElement('div');\n this._container.id = 'ex-toast-container';\n document.body.appendChild(this._container);\n this._isInitialized = true;\n this._styleBlock = document.createElement('style');\n this._styleBlock.textContent = this._toasterCss;\n document.head.appendChild(this._styleBlock);\n }\n }\n dispose() {\n this._container.parentElement.removeChild(this._container);\n this._styleBlock.parentElement.removeChild(this._styleBlock);\n this._isInitialized = false;\n }\n _createFragment(message) {\n const toastMessage = document.createElement('span');\n toastMessage.innerText = message;\n return toastMessage;\n }\n /**\n * Display a toast message to a player\n * @param message Text of the message, messages may have a single \"[LINK]\" to influence placement\n * @param linkTarget Optionally specify a link location\n * @param linkName Optionally specify a name for that link location\n */\n toast(message, linkTarget, linkName) {\n this._initialize();\n const toast = document.createElement('div');\n toast.className = 'ex-toast-message';\n const messageFragments = message.split('[LINK]').map((message) => this._createFragment(message));\n if (linkTarget) {\n const link = document.createElement('a');\n link.href = linkTarget;\n if (linkName) {\n link.innerText = linkName;\n }\n else {\n link.innerText = linkTarget;\n }\n messageFragments.splice(1, 0, link);\n }\n // Assembly message\n const finalMessage = document.createElement('div');\n messageFragments.forEach((message) => {\n finalMessage.appendChild(message);\n });\n toast.appendChild(finalMessage);\n // Dismiss button\n const dismissBtn = document.createElement('button');\n dismissBtn.innerText = 'x';\n dismissBtn.addEventListener('click', () => {\n this._container.removeChild(toast);\n });\n toast.appendChild(dismissBtn);\n // Escape to dismiss\n const keydownHandler = (evt) => {\n if (evt.key === 'Escape') {\n try {\n this._container.removeChild(toast);\n }\n catch (_a) {\n // pass\n }\n }\n document.removeEventListener('keydown', keydownHandler);\n };\n document.addEventListener('keydown', keydownHandler);\n // Insert into container\n const first = this._container.firstChild;\n this._container.insertBefore(toast, first);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Util.ts\":\n/*!**********************!*\\\n !*** ./Util/Util.ts ***!\n \\**********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ addItemToArray: () => (/* binding */ addItemToArray),\n/* harmony export */ contains: () => (/* binding */ contains),\n/* harmony export */ delay: () => (/* binding */ delay),\n/* harmony export */ fail: () => (/* binding */ fail),\n/* harmony export */ getPosition: () => (/* binding */ getPosition),\n/* harmony export */ isObject: () => (/* binding */ isObject),\n/* harmony export */ mergeDeep: () => (/* binding */ mergeDeep),\n/* harmony export */ omit: () => (/* binding */ omit),\n/* harmony export */ removeItemFromArray: () => (/* binding */ removeItemFromArray)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Future__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Future */ \"./Util/Future.ts\");\n\n\n/**\n * Find the screen position of an HTML element\n */\nfunction getPosition(el) {\n // do we need the scroll too? technically the offset method before did that\n if (el && el.getBoundingClientRect) {\n const rect = el.getBoundingClientRect();\n return (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(rect.x + window.scrollX, rect.y + window.scrollY);\n }\n return _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero;\n}\n/**\n * Add an item to an array list if it doesn't already exist. Returns true if added, false if not and already exists in the array.\n * @deprecated Will be removed in v0.26.0\n */\nfunction addItemToArray(item, array) {\n if (array.indexOf(item) === -1) {\n array.push(item);\n return true;\n }\n return false;\n}\n/**\n * Remove an item from an list\n * @deprecated Will be removed in v0.26.0\n */\nfunction removeItemFromArray(item, array) {\n let index = -1;\n if ((index = array.indexOf(item)) > -1) {\n array.splice(index, 1);\n return true;\n }\n return false;\n}\n/**\n * See if an array contains something\n */\nfunction contains(array, obj) {\n for (let i = 0; i < array.length; i++) {\n if (array[i] === obj) {\n return true;\n }\n }\n return false;\n}\n/**\n * Used for exhaustive checks at compile time\n */\nfunction fail(message) {\n throw new Error(message);\n}\n/**\n * Create a promise that resolves after a certain number of milliseconds\n *\n * It is strongly recommended you pass the excalibur clock so delays are bound to the\n * excalibur clock which would be unaffected by stop/pause.\n * @param milliseconds\n * @param clock\n */\nfunction delay(milliseconds, clock) {\n var _a;\n const future = new _Future__WEBPACK_IMPORTED_MODULE_1__.Future();\n const schedule = (_a = clock === null || clock === void 0 ? void 0 : clock.schedule.bind(clock)) !== null && _a !== void 0 ? _a : setTimeout;\n schedule(() => {\n future.resolve();\n }, milliseconds);\n return future.promise;\n}\n/**\n * Remove keys from object literals\n * @param object\n * @param keys\n */\nfunction omit(object, keys) {\n const newObj = {};\n for (const key in object) {\n if (!keys.includes(key)) {\n newObj[key] = object[key];\n }\n }\n return newObj;\n}\n/**\n * Simple object check.\n * @param item\n */\nfunction isObject(item) {\n return item && typeof item === 'object' && !Array.isArray(item);\n}\n/**\n * Deep merge two objects.\n * @param target\n * @param sources\n */\nfunction mergeDeep(target, ...sources) {\n if (!sources.length) {\n return target;\n }\n const source = sources.shift();\n if (isObject(target) && isObject(source)) {\n for (const key in source) {\n if (isObject(source[key])) {\n if (!target[key]) {\n Object.assign(target, { [key]: {} });\n }\n mergeDeep(target[key], source[key]);\n }\n else {\n Object.assign(target, { [key]: source[key] });\n }\n }\n }\n return mergeDeep(target, ...sources);\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Watch.ts\":\n/*!***********************!*\\\n !*** ./Util/Watch.ts ***!\n \\***********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ watch: () => (/* binding */ watch),\n/* harmony export */ watchAny: () => (/* binding */ watchAny),\n/* harmony export */ watchDeep: () => (/* binding */ watchDeep)\n/* harmony export */ });\n/**\n * Watch an object with a proxy, only fires if property value is different\n */\nfunction watch(type, change) {\n if (!type) {\n return type;\n }\n if (type.__isProxy === undefined) {\n // expando hack to mark a proxy\n return new Proxy(type, {\n set: (obj, prop, value) => {\n // The default behavior to store the value\n if (obj[prop] !== value) {\n obj[prop] = value;\n // Avoid watching private junk\n if (typeof prop === 'string') {\n if (prop[0] !== '_') {\n change(obj);\n }\n }\n }\n // Indicate success\n return true;\n },\n get: (obj, prop) => {\n if (prop !== '__isProxy') {\n return obj[prop];\n }\n return true;\n }\n });\n }\n return type;\n}\nconst createHandler = (path = [], change, typeType) => ({\n get: (target, key) => {\n if (key === '__isProxy') {\n return true;\n }\n if (typeof target[key] === 'object' && target[key] != null) {\n return new Proxy(target[key], createHandler([...path, key], change, typeType));\n }\n return target[key];\n },\n set: (target, key, value) => {\n if (typeof key === 'string') {\n if (key[0] !== '_') {\n change(typeType);\n }\n }\n target[key] = value;\n return true;\n }\n});\n/**\n *\n */\nfunction watchDeep(type, change) {\n if (!type) {\n return type;\n }\n if (type.__isProxy === undefined) {\n // expando hack to mark a proxy\n return new Proxy(type, createHandler([], change, type));\n }\n return type;\n}\n/**\n * Watch an object with a proxy, fires change on any property value change\n */\nfunction watchAny(type, change) {\n if (!type) {\n return type;\n }\n if (type.__isProxy === undefined) {\n // expando hack to mark a proxy\n return new Proxy(type, {\n set: (obj, prop, value) => {\n // The default behavior to store the value\n obj[prop] = value;\n // Avoid watching private junk\n if (typeof prop === 'string') {\n if (prop[0] !== '_') {\n change(obj);\n }\n }\n // Indicate success\n return true;\n },\n get: (obj, prop) => {\n if (prop !== '__isProxy') {\n return obj[prop];\n }\n return true;\n }\n });\n }\n return type;\n}\n\n\n/***/ }),\n\n/***/ \"./Util/WebAudio.ts\":\n/*!**************************!*\\\n !*** ./Util/WebAudio.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ WebAudio: () => (/* binding */ WebAudio)\n/* harmony export */ });\n/* harmony import */ var _Resources_Sound_AudioContext__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Resources/Sound/AudioContext */ \"./Resources/Sound/AudioContext.ts\");\n/* harmony import */ var _Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Log */ \"./Util/Log.ts\");\n\n\n/**\n * Patch for detecting legacy web audio in browsers\n * @internal\n * @param source\n */\nfunction isLegacyWebAudioSource(source) {\n return !!source.playbackState;\n}\nclass WebAudio {\n /**\n * Play an empty sound to unlock Safari WebAudio context. Call this function\n * right after a user interaction event.\n * @source https://paulbakaus.com/tutorials/html5/web-audio-on-ios/\n */\n static unlock() {\n const promise = new Promise((resolve, reject) => {\n if (WebAudio._UNLOCKED || !_Resources_Sound_AudioContext__WEBPACK_IMPORTED_MODULE_0__.AudioContextFactory.create()) {\n return resolve(true);\n }\n const unlockTimeoutTimer = setTimeout(() => {\n _Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance().warn('Excalibur was unable to unlock the audio context, audio probably will not play in this browser.');\n resolve(false);\n }, 200);\n const audioContext = _Resources_Sound_AudioContext__WEBPACK_IMPORTED_MODULE_0__.AudioContextFactory.create();\n audioContext.resume().then(() => {\n // create empty buffer and play it\n const buffer = audioContext.createBuffer(1, 1, 22050);\n const source = audioContext.createBufferSource();\n let ended = false;\n source.buffer = buffer;\n source.connect(audioContext.destination);\n source.onended = () => (ended = true);\n source.start(0);\n // by checking the play state after some time, we know if we're really unlocked\n setTimeout(() => {\n if (isLegacyWebAudioSource(source)) {\n if (source.playbackState === source.PLAYING_STATE || source.playbackState === source.FINISHED_STATE) {\n WebAudio._UNLOCKED = true;\n }\n }\n else {\n if (audioContext.currentTime > 0 || ended) {\n WebAudio._UNLOCKED = true;\n }\n }\n }, 0);\n clearTimeout(unlockTimeoutTimer);\n resolve(true);\n }, () => {\n reject();\n });\n });\n return promise;\n }\n static isUnlocked() {\n return this._UNLOCKED;\n }\n}\nWebAudio._UNLOCKED = false;\n\n\n/***/ }),\n\n/***/ \"./index.ts\":\n/*!******************!*\\\n !*** ./index.ts ***!\n \\******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ActionCompleteEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.ActionCompleteEvent),\n/* harmony export */ ActionContext: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ActionContext),\n/* harmony export */ ActionQueue: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ActionQueue),\n/* harmony export */ ActionSequence: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ActionSequence),\n/* harmony export */ ActionStartEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.ActionStartEvent),\n/* harmony export */ ActionsComponent: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ActionsComponent),\n/* harmony export */ ActionsSystem: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ActionsSystem),\n/* harmony export */ ActivateEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.ActivateEvent),\n/* harmony export */ Actor: () => (/* reexport safe */ _Actor__WEBPACK_IMPORTED_MODULE_6__.Actor),\n/* harmony export */ ActorEvents: () => (/* reexport safe */ _Actor__WEBPACK_IMPORTED_MODULE_6__.ActorEvents),\n/* harmony export */ AddEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.AddEvent),\n/* harmony export */ AddedComponent: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.AddedComponent),\n/* harmony export */ AffineMatrix: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.AffineMatrix),\n/* harmony export */ Animation: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Animation),\n/* harmony export */ AnimationDirection: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.AnimationDirection),\n/* harmony export */ AnimationEvents: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.AnimationEvents),\n/* harmony export */ AnimationStrategy: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.AnimationStrategy),\n/* harmony export */ ArcadeSolver: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.ArcadeSolver),\n/* harmony export */ AudioContextFactory: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.AudioContextFactory),\n/* harmony export */ Axes: () => (/* reexport safe */ _Input_Gamepad__WEBPACK_IMPORTED_MODULE_40__.Axes),\n/* harmony export */ Axis: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.Axis),\n/* harmony export */ BaseAlign: () => (/* reexport safe */ _Graphics_FontCommon__WEBPACK_IMPORTED_MODULE_14__.BaseAlign),\n/* harmony export */ BezierCurve: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.BezierCurve),\n/* harmony export */ Blink: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.Blink),\n/* harmony export */ BodyComponent: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.BodyComponent),\n/* harmony export */ BoundingBox: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.BoundingBox),\n/* harmony export */ BrowserComponent: () => (/* reexport safe */ _Util_Browser__WEBPACK_IMPORTED_MODULE_45__.BrowserComponent),\n/* harmony export */ BrowserEvents: () => (/* reexport safe */ _Util_Browser__WEBPACK_IMPORTED_MODULE_45__.BrowserEvents),\n/* harmony export */ Buttons: () => (/* reexport safe */ _Input_Gamepad__WEBPACK_IMPORTED_MODULE_40__.Buttons),\n/* harmony export */ Camera: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.Camera),\n/* harmony export */ CameraEvents: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.CameraEvents),\n/* harmony export */ Canvas: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Canvas),\n/* harmony export */ Circle: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Circle),\n/* harmony export */ CircleCollider: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.CircleCollider),\n/* harmony export */ Clock: () => (/* reexport safe */ _Util_Clock__WEBPACK_IMPORTED_MODULE_53__.Clock),\n/* harmony export */ ClosestLineJumpTable: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.ClosestLineJumpTable),\n/* harmony export */ Collider: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.Collider),\n/* harmony export */ ColliderComponent: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.ColliderComponent),\n/* harmony export */ CollisionContact: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.CollisionContact),\n/* harmony export */ CollisionEndEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.CollisionEndEvent),\n/* harmony export */ CollisionGroup: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.CollisionGroup),\n/* harmony export */ CollisionGroupManager: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.CollisionGroupManager),\n/* harmony export */ CollisionJumpTable: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.CollisionJumpTable),\n/* harmony export */ CollisionPostSolveEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.CollisionPostSolveEvent),\n/* harmony export */ CollisionPreSolveEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.CollisionPreSolveEvent),\n/* harmony export */ CollisionStartEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.CollisionStartEvent),\n/* harmony export */ CollisionSystem: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.CollisionSystem),\n/* harmony export */ CollisionType: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.CollisionType),\n/* harmony export */ Color: () => (/* reexport safe */ _Color__WEBPACK_IMPORTED_MODULE_27__.Color),\n/* harmony export */ ColorBlindFlags: () => (/* reexport safe */ _Debug_index__WEBPACK_IMPORTED_MODULE_9__.ColorBlindFlags),\n/* harmony export */ ColorBlindnessMode: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ColorBlindnessMode),\n/* harmony export */ ColorBlindnessPostProcessor: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ColorBlindnessPostProcessor),\n/* harmony export */ Component: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.Component),\n/* harmony export */ CompositeCollider: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.CompositeCollider),\n/* harmony export */ ConsoleAppender: () => (/* reexport safe */ _Util_Log__WEBPACK_IMPORTED_MODULE_50__.ConsoleAppender),\n/* harmony export */ ContactConstraintPoint: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.ContactConstraintPoint),\n/* harmony export */ ContactEndEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.ContactEndEvent),\n/* harmony export */ ContactSolveBias: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.ContactSolveBias),\n/* harmony export */ ContactStartEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.ContactStartEvent),\n/* harmony export */ CoordPlane: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.CoordPlane),\n/* harmony export */ CrossFade: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.CrossFade),\n/* harmony export */ CurveBy: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.CurveBy),\n/* harmony export */ CurveTo: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.CurveTo),\n/* harmony export */ DeactivateEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.DeactivateEvent),\n/* harmony export */ Debug: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Debug),\n/* harmony export */ DebugConfig: () => (/* reexport safe */ _Debug_index__WEBPACK_IMPORTED_MODULE_9__.DebugConfig),\n/* harmony export */ DebugGraphicsComponent: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.DebugGraphicsComponent),\n/* harmony export */ DebugSystem: () => (/* reexport safe */ _Debug_index__WEBPACK_IMPORTED_MODULE_9__.DebugSystem),\n/* harmony export */ DebugText: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.DebugText),\n/* harmony export */ DefaultAntialiasOptions: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.DefaultAntialiasOptions),\n/* harmony export */ DefaultGarbageCollectionOptions: () => (/* reexport safe */ _GarbageCollector__WEBPACK_IMPORTED_MODULE_4__.DefaultGarbageCollectionOptions),\n/* harmony export */ DefaultLoader: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.DefaultLoader),\n/* harmony export */ DefaultPixelArtOptions: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.DefaultPixelArtOptions),\n/* harmony export */ DegreeOfFreedom: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.DegreeOfFreedom),\n/* harmony export */ Delay: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.Delay),\n/* harmony export */ Detector: () => (/* reexport safe */ _Util_Detector__WEBPACK_IMPORTED_MODULE_47__.Detector),\n/* harmony export */ Die: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.Die),\n/* harmony export */ Direction: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Direction),\n/* harmony export */ Director: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.Director),\n/* harmony export */ DirectorEvents: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.DirectorEvents),\n/* harmony export */ DisplayMode: () => (/* reexport safe */ _Screen__WEBPACK_IMPORTED_MODULE_5__.DisplayMode),\n/* harmony export */ DynamicTree: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.DynamicTree),\n/* harmony export */ DynamicTreeCollisionProcessor: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.DynamicTreeCollisionProcessor),\n/* harmony export */ EX_VERSION: () => (/* binding */ EX_VERSION),\n/* harmony export */ EaseBy: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.EaseBy),\n/* harmony export */ EaseTo: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.EaseTo),\n/* harmony export */ EasingFunctions: () => (/* reexport safe */ _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_48__.EasingFunctions),\n/* harmony export */ EdgeCollider: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.EdgeCollider),\n/* harmony export */ ElasticToActorStrategy: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.ElasticToActorStrategy),\n/* harmony export */ EmitterType: () => (/* reexport safe */ _Particles_index__WEBPACK_IMPORTED_MODULE_15__.EmitterType),\n/* harmony export */ Engine: () => (/* reexport safe */ _Engine__WEBPACK_IMPORTED_MODULE_3__.Engine),\n/* harmony export */ EngineEvents: () => (/* reexport safe */ _Engine__WEBPACK_IMPORTED_MODULE_3__.EngineEvents),\n/* harmony export */ EnterTriggerEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.EnterTriggerEvent),\n/* harmony export */ EnterViewPortEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.EnterViewPortEvent),\n/* harmony export */ Entity: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.Entity),\n/* harmony export */ EntityEvents: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.EntityEvents),\n/* harmony export */ EntityManager: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.EntityManager),\n/* harmony export */ EventEmitter: () => (/* reexport safe */ _EventEmitter__WEBPACK_IMPORTED_MODULE_10__.EventEmitter),\n/* harmony export */ EventTypes: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.EventTypes),\n/* harmony export */ Events: () => (/* reexport module object */ _Events__WEBPACK_IMPORTED_MODULE_12__),\n/* harmony export */ ExResponse: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.ExResponse),\n/* harmony export */ ExcaliburGraphicsContext2DCanvas: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ExcaliburGraphicsContext2DCanvas),\n/* harmony export */ ExcaliburGraphicsContextWebGL: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ExcaliburGraphicsContextWebGL),\n/* harmony export */ ExitTriggerEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.ExitTriggerEvent),\n/* harmony export */ ExitViewPortEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.ExitViewPortEvent),\n/* harmony export */ Fade: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.Fade),\n/* harmony export */ FadeInOut: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.FadeInOut),\n/* harmony export */ Flags: () => (/* reexport safe */ _Flags__WEBPACK_IMPORTED_MODULE_1__.Flags),\n/* harmony export */ Flash: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.Flash),\n/* harmony export */ Follow: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.Follow),\n/* harmony export */ Font: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Font),\n/* harmony export */ FontCache: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.FontCache),\n/* harmony export */ FontSource: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.FontSource),\n/* harmony export */ FontStyle: () => (/* reexport safe */ _Graphics_FontCommon__WEBPACK_IMPORTED_MODULE_14__.FontStyle),\n/* harmony export */ FontUnit: () => (/* reexport safe */ _Graphics_FontCommon__WEBPACK_IMPORTED_MODULE_14__.FontUnit),\n/* harmony export */ FpsSampler: () => (/* reexport safe */ _Util_Fps__WEBPACK_IMPORTED_MODULE_52__.FpsSampler),\n/* harmony export */ FrameStats: () => (/* reexport safe */ _Debug_index__WEBPACK_IMPORTED_MODULE_9__.FrameStats),\n/* harmony export */ Future: () => (/* reexport safe */ _Util_Future__WEBPACK_IMPORTED_MODULE_57__.Future),\n/* harmony export */ GameEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.GameEvent),\n/* harmony export */ GameStartEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.GameStartEvent),\n/* harmony export */ GameStopEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.GameStopEvent),\n/* harmony export */ Gamepad: () => (/* reexport safe */ _Input_Gamepad__WEBPACK_IMPORTED_MODULE_40__.Gamepad),\n/* harmony export */ GamepadAxisEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.GamepadAxisEvent),\n/* harmony export */ GamepadButtonEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.GamepadButtonEvent),\n/* harmony export */ GamepadConnectEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.GamepadConnectEvent),\n/* harmony export */ GamepadDisconnectEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.GamepadDisconnectEvent),\n/* harmony export */ Gamepads: () => (/* reexport safe */ _Input_Gamepad__WEBPACK_IMPORTED_MODULE_40__.Gamepads),\n/* harmony export */ GarbageCollector: () => (/* reexport safe */ _GarbageCollector__WEBPACK_IMPORTED_MODULE_4__.GarbageCollector),\n/* harmony export */ Gif: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.Gif),\n/* harmony export */ GifParser: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.GifParser),\n/* harmony export */ GlobalCoordinates: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.GlobalCoordinates),\n/* harmony export */ GpuParticleEmitter: () => (/* reexport safe */ _Particles_index__WEBPACK_IMPORTED_MODULE_15__.GpuParticleEmitter),\n/* harmony export */ GpuParticleRenderer: () => (/* reexport safe */ _Particles_index__WEBPACK_IMPORTED_MODULE_15__.GpuParticleRenderer),\n/* harmony export */ Graphic: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Graphic),\n/* harmony export */ GraphicsComponent: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.GraphicsComponent),\n/* harmony export */ GraphicsGroup: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.GraphicsGroup),\n/* harmony export */ GraphicsSystem: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.GraphicsSystem),\n/* harmony export */ HashColliderProxy: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.HashColliderProxy),\n/* harmony export */ HashGridCell: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.HashGridCell),\n/* harmony export */ HashGridProxy: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.HashGridProxy),\n/* harmony export */ HiddenEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.HiddenEvent),\n/* harmony export */ HorizontalFirst: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.HorizontalFirst),\n/* harmony export */ ImageFiltering: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ImageFiltering),\n/* harmony export */ ImageSource: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ImageSource),\n/* harmony export */ ImageSourceAttributeConstants: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ImageSourceAttributeConstants),\n/* harmony export */ ImageWrapping: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ImageWrapping),\n/* harmony export */ InitializeEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.InitializeEvent),\n/* harmony export */ InputHost: () => (/* reexport safe */ _Input_InputHost__WEBPACK_IMPORTED_MODULE_42__.InputHost),\n/* harmony export */ InputMapper: () => (/* reexport safe */ _Input_InputMapper__WEBPACK_IMPORTED_MODULE_43__.InputMapper),\n/* harmony export */ IsometricEntityComponent: () => (/* reexport safe */ _TileMap_index__WEBPACK_IMPORTED_MODULE_17__.IsometricEntityComponent),\n/* harmony export */ IsometricEntitySystem: () => (/* reexport safe */ _TileMap_index__WEBPACK_IMPORTED_MODULE_17__.IsometricEntitySystem),\n/* harmony export */ IsometricMap: () => (/* reexport safe */ _TileMap_index__WEBPACK_IMPORTED_MODULE_17__.IsometricMap),\n/* harmony export */ IsometricTile: () => (/* reexport safe */ _TileMap_index__WEBPACK_IMPORTED_MODULE_17__.IsometricTile),\n/* harmony export */ KeyEvent: () => (/* reexport safe */ _Input_Keyboard__WEBPACK_IMPORTED_MODULE_41__.KeyEvent),\n/* harmony export */ Keyboard: () => (/* reexport safe */ _Input_Keyboard__WEBPACK_IMPORTED_MODULE_41__.Keyboard),\n/* harmony export */ Keys: () => (/* reexport safe */ _Input_Keyboard__WEBPACK_IMPORTED_MODULE_41__.Keys),\n/* harmony export */ KillEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.KillEvent),\n/* harmony export */ Label: () => (/* reexport safe */ _Label__WEBPACK_IMPORTED_MODULE_13__.Label),\n/* harmony export */ LimitCameraBoundsStrategy: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.LimitCameraBoundsStrategy),\n/* harmony export */ Line: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Line),\n/* harmony export */ LineSegment: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.LineSegment),\n/* harmony export */ Loader: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.Loader),\n/* harmony export */ LoaderEvents: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.LoaderEvents),\n/* harmony export */ LockCameraToActorAxisStrategy: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.LockCameraToActorAxisStrategy),\n/* harmony export */ LockCameraToActorStrategy: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.LockCameraToActorStrategy),\n/* harmony export */ LogLevel: () => (/* reexport safe */ _Util_Log__WEBPACK_IMPORTED_MODULE_50__.LogLevel),\n/* harmony export */ Logger: () => (/* reexport safe */ _Util_Log__WEBPACK_IMPORTED_MODULE_50__.Logger),\n/* harmony export */ Material: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Material),\n/* harmony export */ Matrix: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.Matrix),\n/* harmony export */ MatrixLocations: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.MatrixLocations),\n/* harmony export */ MediaEvent: () => (/* reexport safe */ _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_11__.MediaEvent),\n/* harmony export */ Meet: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.Meet),\n/* harmony export */ MotionComponent: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.MotionComponent),\n/* harmony export */ MotionSystem: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.MotionSystem),\n/* harmony export */ MoveBy: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.MoveBy),\n/* harmony export */ MoveByWithOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.MoveByWithOptions),\n/* harmony export */ MoveTo: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.MoveTo),\n/* harmony export */ MoveToWithOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.MoveToWithOptions),\n/* harmony export */ NativePointerButton: () => (/* reexport safe */ _Input_NativePointerButton__WEBPACK_IMPORTED_MODULE_33__.NativePointerButton),\n/* harmony export */ NativeSoundEvent: () => (/* reexport safe */ _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_11__.NativeSoundEvent),\n/* harmony export */ NativeSoundProcessedEvent: () => (/* reexport safe */ _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_11__.NativeSoundProcessedEvent),\n/* harmony export */ NineSlice: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.NineSlice),\n/* harmony export */ NineSliceStretch: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.NineSliceStretch),\n/* harmony export */ None: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.None),\n/* harmony export */ Observable: () => (/* reexport safe */ _Util_Observable__WEBPACK_IMPORTED_MODULE_49__.Observable),\n/* harmony export */ OffscreenSystem: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.OffscreenSystem),\n/* harmony export */ Pair: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.Pair),\n/* harmony export */ ParallaxComponent: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ParallaxComponent),\n/* harmony export */ ParallelActions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ParallelActions),\n/* harmony export */ Particle: () => (/* reexport safe */ _Particles_index__WEBPACK_IMPORTED_MODULE_15__.Particle),\n/* harmony export */ ParticleEmitter: () => (/* reexport safe */ _Particles_index__WEBPACK_IMPORTED_MODULE_15__.ParticleEmitter),\n/* harmony export */ ParticleRenderer: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ParticleRenderer),\n/* harmony export */ ParticleTransform: () => (/* reexport safe */ _Particles_index__WEBPACK_IMPORTED_MODULE_15__.ParticleTransform),\n/* harmony export */ PhysicsStats: () => (/* reexport safe */ _Debug_index__WEBPACK_IMPORTED_MODULE_9__.PhysicsStats),\n/* harmony export */ PhysicsWorld: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.PhysicsWorld),\n/* harmony export */ PointerAbstraction: () => (/* reexport safe */ _Input_PointerAbstraction__WEBPACK_IMPORTED_MODULE_35__.PointerAbstraction),\n/* harmony export */ PointerButton: () => (/* reexport safe */ _Input_PointerButton__WEBPACK_IMPORTED_MODULE_32__.PointerButton),\n/* harmony export */ PointerComponent: () => (/* reexport safe */ _Input_PointerComponent__WEBPACK_IMPORTED_MODULE_36__.PointerComponent),\n/* harmony export */ PointerEvent: () => (/* reexport safe */ _Input_PointerEvent__WEBPACK_IMPORTED_MODULE_30__.PointerEvent),\n/* harmony export */ PointerEventReceiver: () => (/* reexport safe */ _Input_PointerEventReceiver__WEBPACK_IMPORTED_MODULE_34__.PointerEventReceiver),\n/* harmony export */ PointerScope: () => (/* reexport safe */ _Input_PointerScope__WEBPACK_IMPORTED_MODULE_39__.PointerScope),\n/* harmony export */ PointerSystem: () => (/* reexport safe */ _Input_PointerSystem__WEBPACK_IMPORTED_MODULE_37__.PointerSystem),\n/* harmony export */ PointerType: () => (/* reexport safe */ _Input_PointerType__WEBPACK_IMPORTED_MODULE_38__.PointerType),\n/* harmony export */ Polygon: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Polygon),\n/* harmony export */ PolygonCollider: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.PolygonCollider),\n/* harmony export */ Pool: () => (/* reexport safe */ _Util_Pool__WEBPACK_IMPORTED_MODULE_51__.Pool),\n/* harmony export */ PostCollisionEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PostCollisionEvent),\n/* harmony export */ PostDebugDrawEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PostDebugDrawEvent),\n/* harmony export */ PostDrawEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PostDrawEvent),\n/* harmony export */ PostFrameEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PostFrameEvent),\n/* harmony export */ PostKillEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PostKillEvent),\n/* harmony export */ PostTransformDrawEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PostTransformDrawEvent),\n/* harmony export */ PostUpdateEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PostUpdateEvent),\n/* harmony export */ PreCollisionEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PreCollisionEvent),\n/* harmony export */ PreDebugDrawEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PreDebugDrawEvent),\n/* harmony export */ PreDrawEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PreDrawEvent),\n/* harmony export */ PreFrameEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PreFrameEvent),\n/* harmony export */ PreKillEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PreKillEvent),\n/* harmony export */ PreLoadEvent: () => (/* reexport safe */ _Scene__WEBPACK_IMPORTED_MODULE_16__.PreLoadEvent),\n/* harmony export */ PreTransformDrawEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PreTransformDrawEvent),\n/* harmony export */ PreUpdateEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PreUpdateEvent),\n/* harmony export */ Projection: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.Projection),\n/* harmony export */ QuadIndexBuffer: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.QuadIndexBuffer),\n/* harmony export */ QuadTree: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.QuadTree),\n/* harmony export */ Query: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.Query),\n/* harmony export */ QueryManager: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.QueryManager),\n/* harmony export */ RadiusAroundActorStrategy: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.RadiusAroundActorStrategy),\n/* harmony export */ Random: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.Random),\n/* harmony export */ Raster: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Raster),\n/* harmony export */ Ray: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.Ray),\n/* harmony export */ RealisticSolver: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.RealisticSolver),\n/* harmony export */ Rectangle: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Rectangle),\n/* harmony export */ RemoveEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.RemoveEvent),\n/* harmony export */ RemovedComponent: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.RemovedComponent),\n/* harmony export */ Repeat: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.Repeat),\n/* harmony export */ RepeatForever: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.RepeatForever),\n/* harmony export */ Resolution: () => (/* reexport safe */ _Screen__WEBPACK_IMPORTED_MODULE_5__.Resolution),\n/* harmony export */ Resource: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.Resource),\n/* harmony export */ ResourceEvents: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.ResourceEvents),\n/* harmony export */ RotateBy: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.RotateBy),\n/* harmony export */ RotateByWithOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.RotateByWithOptions),\n/* harmony export */ RotateTo: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.RotateTo),\n/* harmony export */ RotateToWithOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.RotateToWithOptions),\n/* harmony export */ RotationType: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.RotationType),\n/* harmony export */ ScaleBy: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ScaleBy),\n/* harmony export */ ScaleByWithOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ScaleByWithOptions),\n/* harmony export */ ScaleTo: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ScaleTo),\n/* harmony export */ ScaleToWithOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ScaleToWithOptions),\n/* harmony export */ Scene: () => (/* reexport safe */ _Scene__WEBPACK_IMPORTED_MODULE_16__.Scene),\n/* harmony export */ SceneEvents: () => (/* reexport safe */ _Scene__WEBPACK_IMPORTED_MODULE_16__.SceneEvents),\n/* harmony export */ Screen: () => (/* reexport safe */ _Screen__WEBPACK_IMPORTED_MODULE_5__.Screen),\n/* harmony export */ ScreenAppender: () => (/* reexport safe */ _Util_Log__WEBPACK_IMPORTED_MODULE_50__.ScreenAppender),\n/* harmony export */ ScreenElement: () => (/* reexport safe */ _ScreenElement__WEBPACK_IMPORTED_MODULE_20__.ScreenElement),\n/* harmony export */ ScreenEvents: () => (/* reexport safe */ _Screen__WEBPACK_IMPORTED_MODULE_5__.ScreenEvents),\n/* harmony export */ ScreenShader: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ScreenShader),\n/* harmony export */ ScrollPreventionMode: () => (/* reexport safe */ _Engine__WEBPACK_IMPORTED_MODULE_3__.ScrollPreventionMode),\n/* harmony export */ Semaphore: () => (/* reexport safe */ _Util_Semaphore__WEBPACK_IMPORTED_MODULE_58__.Semaphore),\n/* harmony export */ SeparatingAxis: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.SeparatingAxis),\n/* harmony export */ SeparationInfo: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.SeparationInfo),\n/* harmony export */ Shader: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Shader),\n/* harmony export */ Shape: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.Shape),\n/* harmony export */ Side: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.Side),\n/* harmony export */ Slide: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.Slide),\n/* harmony export */ SolverStrategy: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.SolverStrategy),\n/* harmony export */ Sound: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.Sound),\n/* harmony export */ SoundEvents: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.SoundEvents),\n/* harmony export */ SparseHashGrid: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.SparseHashGrid),\n/* harmony export */ SparseHashGridCollisionProcessor: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.SparseHashGridCollisionProcessor),\n/* harmony export */ SpatialPartitionStrategy: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.SpatialPartitionStrategy),\n/* harmony export */ Sprite: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Sprite),\n/* harmony export */ SpriteFont: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.SpriteFont),\n/* harmony export */ SpriteSheet: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.SpriteSheet),\n/* harmony export */ StandardClock: () => (/* reexport safe */ _Util_Clock__WEBPACK_IMPORTED_MODULE_53__.StandardClock),\n/* harmony export */ StateMachine: () => (/* reexport safe */ _Util_StateMachine__WEBPACK_IMPORTED_MODULE_56__.StateMachine),\n/* harmony export */ StrategyContainer: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.StrategyContainer),\n/* harmony export */ Stream: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.Stream),\n/* harmony export */ System: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.System),\n/* harmony export */ SystemManager: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.SystemManager),\n/* harmony export */ SystemPriority: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.SystemPriority),\n/* harmony export */ SystemType: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.SystemType),\n/* harmony export */ TagQuery: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.TagQuery),\n/* harmony export */ TestClock: () => (/* reexport safe */ _Util_Clock__WEBPACK_IMPORTED_MODULE_53__.TestClock),\n/* harmony export */ Text: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Text),\n/* harmony export */ TextAlign: () => (/* reexport safe */ _Graphics_FontCommon__WEBPACK_IMPORTED_MODULE_14__.TextAlign),\n/* harmony export */ TextureLoader: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.TextureLoader),\n/* harmony export */ Tile: () => (/* reexport safe */ _TileMap_index__WEBPACK_IMPORTED_MODULE_17__.Tile),\n/* harmony export */ TileMap: () => (/* reexport safe */ _TileMap_index__WEBPACK_IMPORTED_MODULE_17__.TileMap),\n/* harmony export */ TileMapEvents: () => (/* reexport safe */ _TileMap_index__WEBPACK_IMPORTED_MODULE_17__.TileMapEvents),\n/* harmony export */ TiledAnimation: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.TiledAnimation),\n/* harmony export */ TiledSprite: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.TiledSprite),\n/* harmony export */ Timer: () => (/* reexport safe */ _Timer__WEBPACK_IMPORTED_MODULE_18__.Timer),\n/* harmony export */ Toaster: () => (/* reexport safe */ _Util_Toaster__WEBPACK_IMPORTED_MODULE_55__.Toaster),\n/* harmony export */ Transform: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.Transform),\n/* harmony export */ TransformComponent: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.TransformComponent),\n/* harmony export */ Transition: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.Transition),\n/* harmony export */ TreeNode: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.TreeNode),\n/* harmony export */ Trigger: () => (/* reexport safe */ _Trigger__WEBPACK_IMPORTED_MODULE_19__.Trigger),\n/* harmony export */ TriggerEvents: () => (/* reexport safe */ _Trigger__WEBPACK_IMPORTED_MODULE_19__.TriggerEvents),\n/* harmony export */ TwoPI: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.TwoPI),\n/* harmony export */ Util: () => (/* reexport module object */ _Util_Index__WEBPACK_IMPORTED_MODULE_44__),\n/* harmony export */ Vector: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.Vector),\n/* harmony export */ VectorView: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.VectorView),\n/* harmony export */ VertexBuffer: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.VertexBuffer),\n/* harmony export */ VertexLayout: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.VertexLayout),\n/* harmony export */ VerticalFirst: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.VerticalFirst),\n/* harmony export */ VisibleEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.VisibleEvent),\n/* harmony export */ WebAudio: () => (/* reexport safe */ _Util_WebAudio__WEBPACK_IMPORTED_MODULE_54__.WebAudio),\n/* harmony export */ WebAudioInstance: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.WebAudioInstance),\n/* harmony export */ WheelDeltaMode: () => (/* reexport safe */ _Input_WheelDeltaMode__WEBPACK_IMPORTED_MODULE_31__.WheelDeltaMode),\n/* harmony export */ WheelEvent: () => (/* reexport safe */ _Input_WheelEvent__WEBPACK_IMPORTED_MODULE_29__.WheelEvent),\n/* harmony export */ World: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.World),\n/* harmony export */ approximatelyEqual: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.approximatelyEqual),\n/* harmony export */ assert: () => (/* reexport safe */ _Util_Assert__WEBPACK_IMPORTED_MODULE_60__.assert),\n/* harmony export */ canonicalizeAngle: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.canonicalizeAngle),\n/* harmony export */ clamp: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.clamp),\n/* harmony export */ coroutine: () => (/* reexport safe */ _Util_Coroutine__WEBPACK_IMPORTED_MODULE_59__.coroutine),\n/* harmony export */ createId: () => (/* reexport safe */ _Id__WEBPACK_IMPORTED_MODULE_2__.createId),\n/* harmony export */ frac: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.frac),\n/* harmony export */ getDefaultPhysicsConfig: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.getDefaultPhysicsConfig),\n/* harmony export */ hasGraphicsTick: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.hasGraphicsTick),\n/* harmony export */ hasOnAdd: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.hasOnAdd),\n/* harmony export */ hasOnInitialize: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.hasOnInitialize),\n/* harmony export */ hasOnPostUpdate: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.hasOnPostUpdate),\n/* harmony export */ hasOnPreUpdate: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.hasOnPreUpdate),\n/* harmony export */ hasOnRemove: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.hasOnRemove),\n/* harmony export */ hasPostDraw: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.hasPostDraw),\n/* harmony export */ hasPreDraw: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.hasPreDraw),\n/* harmony export */ has_add: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.has_add),\n/* harmony export */ has_initialize: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.has_initialize),\n/* harmony export */ has_postupdate: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.has_postupdate),\n/* harmony export */ has_preupdate: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.has_preupdate),\n/* harmony export */ has_remove: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.has_remove),\n/* harmony export */ inverseLerp: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.inverseLerp),\n/* harmony export */ inverseLerpVector: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.inverseLerpVector),\n/* harmony export */ isActor: () => (/* reexport safe */ _Actor__WEBPACK_IMPORTED_MODULE_6__.isActor),\n/* harmony export */ isAddedComponent: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.isAddedComponent),\n/* harmony export */ isComponentCtor: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.isComponentCtor),\n/* harmony export */ isLoaderConstructor: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.isLoaderConstructor),\n/* harmony export */ isMoveByOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.isMoveByOptions),\n/* harmony export */ isMoveToOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.isMoveToOptions),\n/* harmony export */ isRemovedComponent: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.isRemovedComponent),\n/* harmony export */ isRotateByOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.isRotateByOptions),\n/* harmony export */ isRotateToOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.isRotateToOptions),\n/* harmony export */ isScaleByOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.isScaleByOptions),\n/* harmony export */ isScaleToOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.isScaleToOptions),\n/* harmony export */ isSceneConstructor: () => (/* reexport safe */ _Scene__WEBPACK_IMPORTED_MODULE_16__.isSceneConstructor),\n/* harmony export */ isScreenElement: () => (/* reexport safe */ _ScreenElement__WEBPACK_IMPORTED_MODULE_20__.isScreenElement),\n/* harmony export */ isSystemConstructor: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.isSystemConstructor),\n/* harmony export */ lerp: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.lerp),\n/* harmony export */ lerpAngle: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.lerpAngle),\n/* harmony export */ lerpVector: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.lerpVector),\n/* harmony export */ maxMessages: () => (/* reexport safe */ _Util_Decorators__WEBPACK_IMPORTED_MODULE_46__.maxMessages),\n/* harmony export */ nextActionId: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.nextActionId),\n/* harmony export */ obsolete: () => (/* reexport safe */ _Util_Decorators__WEBPACK_IMPORTED_MODULE_46__.obsolete),\n/* harmony export */ parseImageFiltering: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.parseImageFiltering),\n/* harmony export */ parseImageWrapping: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.parseImageWrapping),\n/* harmony export */ pixelSnapEpsilon: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.pixelSnapEpsilon),\n/* harmony export */ randomInRange: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.randomInRange),\n/* harmony export */ randomIntInRange: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.randomIntInRange),\n/* harmony export */ range: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.range),\n/* harmony export */ remap: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.remap),\n/* harmony export */ remapVector: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.remapVector),\n/* harmony export */ resetObsoleteCounter: () => (/* reexport safe */ _Util_Decorators__WEBPACK_IMPORTED_MODULE_46__.resetObsoleteCounter),\n/* harmony export */ sign: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.sign),\n/* harmony export */ toDegrees: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.toDegrees),\n/* harmony export */ toRadians: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.toRadians),\n/* harmony export */ vec: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.vec),\n/* harmony export */ webgl: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.webgl)\n/* harmony export */ });\n/* harmony import */ var _Polyfill__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Polyfill */ \"./Polyfill.ts\");\n/* harmony import */ var _Flags__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Flags */ \"./Flags.ts\");\n/* harmony import */ var _Id__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Id */ \"./Id.ts\");\n/* harmony import */ var _Engine__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Engine */ \"./Engine.ts\");\n/* harmony import */ var _GarbageCollector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./GarbageCollector */ \"./GarbageCollector.ts\");\n/* harmony import */ var _Screen__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Screen */ \"./Screen.ts\");\n/* harmony import */ var _Actor__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Actor */ \"./Actor.ts\");\n/* harmony import */ var _Math_index__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Math/index */ \"./Math/index.ts\");\n/* harmony import */ var _Camera__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Camera */ \"./Camera.ts\");\n/* harmony import */ var _Debug_index__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Debug/index */ \"./Debug/index.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Events/MediaEvents */ \"./Events/MediaEvents.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Events */ \"./Events.ts\");\n/* harmony import */ var _Label__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Label */ \"./Label.ts\");\n/* harmony import */ var _Graphics_FontCommon__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Graphics/FontCommon */ \"./Graphics/FontCommon.ts\");\n/* harmony import */ var _Particles_index__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Particles/index */ \"./Particles/index.ts\");\n/* harmony import */ var _Scene__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Scene */ \"./Scene.ts\");\n/* harmony import */ var _TileMap_index__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./TileMap/index */ \"./TileMap/index.ts\");\n/* harmony import */ var _Timer__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Timer */ \"./Timer.ts\");\n/* harmony import */ var _Trigger__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./Trigger */ \"./Trigger.ts\");\n/* harmony import */ var _ScreenElement__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./ScreenElement */ \"./ScreenElement.ts\");\n/* harmony import */ var _Actions_index__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./Actions/index */ \"./Actions/index.ts\");\n/* harmony import */ var _Collision_Index__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./Collision/Index */ \"./Collision/Index.ts\");\n/* harmony import */ var _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./Interfaces/Index */ \"./Interfaces/Index.ts\");\n/* harmony import */ var _Resources_Index__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./Resources/Index */ \"./Resources/Index.ts\");\n/* harmony import */ var _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./EntityComponentSystem/index */ \"./EntityComponentSystem/index.ts\");\n/* harmony import */ var _Director_index__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./Director/index */ \"./Director/index.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./Color */ \"./Color.ts\");\n/* harmony import */ var _Graphics_index__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./Graphics/index */ \"./Graphics/index.ts\");\n/* harmony import */ var _Input_WheelEvent__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./Input/WheelEvent */ \"./Input/WheelEvent.ts\");\n/* harmony import */ var _Input_PointerEvent__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./Input/PointerEvent */ \"./Input/PointerEvent.ts\");\n/* harmony import */ var _Input_WheelDeltaMode__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./Input/WheelDeltaMode */ \"./Input/WheelDeltaMode.ts\");\n/* harmony import */ var _Input_PointerButton__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./Input/PointerButton */ \"./Input/PointerButton.ts\");\n/* harmony import */ var _Input_NativePointerButton__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./Input/NativePointerButton */ \"./Input/NativePointerButton.ts\");\n/* harmony import */ var _Input_PointerEventReceiver__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./Input/PointerEventReceiver */ \"./Input/PointerEventReceiver.ts\");\n/* harmony import */ var _Input_PointerAbstraction__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./Input/PointerAbstraction */ \"./Input/PointerAbstraction.ts\");\n/* harmony import */ var _Input_PointerComponent__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./Input/PointerComponent */ \"./Input/PointerComponent.ts\");\n/* harmony import */ var _Input_PointerSystem__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./Input/PointerSystem */ \"./Input/PointerSystem.ts\");\n/* harmony import */ var _Input_PointerType__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./Input/PointerType */ \"./Input/PointerType.ts\");\n/* harmony import */ var _Input_PointerScope__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./Input/PointerScope */ \"./Input/PointerScope.ts\");\n/* harmony import */ var _Input_Gamepad__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./Input/Gamepad */ \"./Input/Gamepad.ts\");\n/* harmony import */ var _Input_Keyboard__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ./Input/Keyboard */ \"./Input/Keyboard.ts\");\n/* harmony import */ var _Input_InputHost__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ./Input/InputHost */ \"./Input/InputHost.ts\");\n/* harmony import */ var _Input_InputMapper__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ./Input/InputMapper */ \"./Input/InputMapper.ts\");\n/* harmony import */ var _Util_Index__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! ./Util/Index */ \"./Util/Index.ts\");\n/* harmony import */ var _Util_Browser__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! ./Util/Browser */ \"./Util/Browser.ts\");\n/* harmony import */ var _Util_Decorators__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! ./Util/Decorators */ \"./Util/Decorators.ts\");\n/* harmony import */ var _Util_Detector__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! ./Util/Detector */ \"./Util/Detector.ts\");\n/* harmony import */ var _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! ./Util/EasingFunctions */ \"./Util/EasingFunctions.ts\");\n/* harmony import */ var _Util_Observable__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(/*! ./Util/Observable */ \"./Util/Observable.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(/*! ./Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Util_Pool__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(/*! ./Util/Pool */ \"./Util/Pool.ts\");\n/* harmony import */ var _Util_Fps__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(/*! ./Util/Fps */ \"./Util/Fps.ts\");\n/* harmony import */ var _Util_Clock__WEBPACK_IMPORTED_MODULE_53__ = __webpack_require__(/*! ./Util/Clock */ \"./Util/Clock.ts\");\n/* harmony import */ var _Util_WebAudio__WEBPACK_IMPORTED_MODULE_54__ = __webpack_require__(/*! ./Util/WebAudio */ \"./Util/WebAudio.ts\");\n/* harmony import */ var _Util_Toaster__WEBPACK_IMPORTED_MODULE_55__ = __webpack_require__(/*! ./Util/Toaster */ \"./Util/Toaster.ts\");\n/* harmony import */ var _Util_StateMachine__WEBPACK_IMPORTED_MODULE_56__ = __webpack_require__(/*! ./Util/StateMachine */ \"./Util/StateMachine.ts\");\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_57__ = __webpack_require__(/*! ./Util/Future */ \"./Util/Future.ts\");\n/* harmony import */ var _Util_Semaphore__WEBPACK_IMPORTED_MODULE_58__ = __webpack_require__(/*! ./Util/Semaphore */ \"./Util/Semaphore.ts\");\n/* harmony import */ var _Util_Coroutine__WEBPACK_IMPORTED_MODULE_59__ = __webpack_require__(/*! ./Util/Coroutine */ \"./Util/Coroutine.ts\");\n/* harmony import */ var _Util_Assert__WEBPACK_IMPORTED_MODULE_60__ = __webpack_require__(/*! ./Util/Assert */ \"./Util/Assert.ts\");\n/**\n * The current Excalibur version string\n * @description `process.env.__EX_VERSION` gets replaced by Webpack on build\n */\nconst EX_VERSION = \"0.30.1\";\n\n(0,_Polyfill__WEBPACK_IMPORTED_MODULE_0__.polyfill)();\n// This file is used as the bundle entry point and exports everything\n// that will be exposed as the `ex` global variable.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// ex.Events namespace\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// ex.Util namespaces\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// ex.Deprecated\n// import * as deprecated from './Deprecated';\n// export { deprecated as Deprecated };\n// export * from './Deprecated';\n\n\n/***/ }),\n\n/***/ \"./Director/Loader.logo.png\":\n/*!**********************************!*\\\n !*** ./Director/Loader.logo.png ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAdQAAAB2CAYAAABxhGI9AAAACXBIWXMAAAsSAAALEgHS3X78AAAKnUlEQVR42u3dP2wjSx0H8N8hJIonIRmJjsq0SBR+BQ1dcqKhe0lD77SvSwpKkJKGPulpktfRIMUdEqKIqV57rpAokM4dbSiyq7ONPTP7x39ifz7SFbnEnp3xer47O7uzH15fXwMA6OYHmgAABCoACFQAEKgAgEAFAIEKAAIVAAQqACBQAUCgAoBABQCBCgAIVAAQqAAgUAFAoAIAAhUABCoACFQAEKgAgECFLbmOiNeFf2PbAyz68Pr6qhUgbRwR92v+/zwiJrYHMEKFMmcN///UtgcQqFBk1PD/97U9Qx8VCFSgu4EmAIEKAAIVAAQqACBQ4Z25jojP8eX+0WtNAgIVaOY+Im5j+eKh24h41jQgUIEyZ7F5NaPU7wCBCiwYd/w9cOB+qAlgJ3KLLow0EV198803RWvJfvfddx+0lhEqHKu5JgAjVCBvlhmFzjQRXUekHz9+TP79y8uLRjNChXfvoePvAYEKxNtj1e42/O5JoIJABcrdRMRVLM+X3kTEpaaB988cKuzWg9EobTWdMx0Oly8uN4dqhAoARqgnaN3arHfqu7OyH8ItKLVB/P+CEfMTHyGPY3npx1m8zWGDEeoBfUk/xdti57dr/r1Wv2+6EPow3tZ5rRdS72s1neuF97xvWd+XTH0/V+UMttDWqbI/r2nrxfp+jv2uSjSO7S+OXy/A/3lN+9xX5T5HxEUPZZ0tfB71+w57eJ/HFu+z+jkv1u92YX9fbI/HhX3JA9rp5MPr66tWaG9UfUGbrHIzi7cLUyYFf/tpTady03EEeL8mUJ6i7MKYNvWNqr4Pe2jradXO60LrvPAz2PQ5RPX684ah8dxD+2zantnCgVipSVV+m/tgB9W2DDq2Sx/vM95wcHhZhWVJm8yrv58cSgfTdc70+++/X/r522+/tUKSEepBqo+om4ZLPerMjUwuNnQCtx1GWJtee1FwdD5uWd86xLs8UaVt2aNEO1/saZ/Z5rYMW4zq6v34rGV9Bg3q2eZ9SkeNm9qwyUh30OPIHYFKx5FG03C7znSOqYBq+qW/zpQ3anH037TNHluG6f0WPsPhHvab4QFty7ogOeuxDYcNy2/zu2214WNYWxmBurNO8bGn97pNBOO8xy/9uCorZZ4I2r4C7aJgO7ZV9iE49Dm6NvOWx+pWE9CUq3zbdTp9doz38TbXtzqH9RT5CyWe422OaZoZGeZCabrhPQY9HjwsjpTvCg4YtlE2+Ta/j2bzn8fqrDqgm+6yUHOmAvWUjAtGhbNYvsBknDnqH1Qhc7VmxHgeb/NbudA5j/UXlYwif2p6luhAc9teu1npiHKnDs8if6tCm7JLX3NKpgttXe9ruc9mHMd7a83iwdxF5vt8tutARaCeklRnNK9C8WnNF7geJQ4T4XG3JhSnVdilQrG+yOnrlVHfsEGYzhNBn7Lu6tS7+HJafJQ4EMiNlNqWXZ9WPvVgnVYHG5M1ByDXkT6leX2EgTqJtyt45yv7S2qO3sEZjZhDLXeR+YKdJ0Zdk8QocvH9N732KrNtq+FZ/zzIHABcJrYpd+Xv14lOd5ap76SgrduW/VTQ1qcQpqnbgu4ifZvUMNpd9XuoZmvCtPaQ2Y/BCHVLgbrJTeRPDdVf6pfMKDU2fOkHmVFFfXr3MsouLsnNvV5kRoe5+s431PeuoKPqWnaurY/ZPBEeqwceN4l96iwO6H7Mjq4y7VGPVNe10VaZMzVCPVWpI/Z6FZbcv5fMqGCU+dLfFGzj58jP8+bCdJCo7yzKTwdOF0bu9Ug7V4c+yz7FJfYeGoysUss0HssIdVZwYLDujMqlESoCdTtGsZtbHnJBeNdDSJSs0jTKdMJN1HNX54Wv7bvsU9NkVJVa13dX+/wuArV0X/l5RHyo/lnfF4G6p6DrS0kHdtXhy35TGErDPYZUn2WfWqDOo/lVqdMD2O/hKJhD7S/odukymq9s02QN4EEPR/zbaOumZc+r15zK1Zqznl9jsfiemTM1QmV3HUuTkedlg9HIQzRbUD93dfC+2tpj2fIHEH2+RqCCQH13gZq7hWXTNpVu19OB1fc9nQ0AKOKUb5lU0P1kDyOneoWk0lOZ9cIP0x7qu8+2BhCoR2wYu1+e7DmaXzBSsu5vaX1ne2zrpmUPTmxf7PM1Dm4y/vC7ny7Nif7+z/9ZmtM0Z3panPLtPmra9f16bcK0Dpbnwk43Vd/RHtu6zfNQTy1QBy3aqG2g9nVmxml+BOoJyT3NpWmn9xhfFnu4bvDa+44BXhqqfdf3uUF9+yz77AT31Yue2mjecYQ62NLfgkA9ghHqLNEhNem4H1c6vdyDxhf/bpz5m4coW/c39wi6VH2bPtHlcaV9cvXts+zxCe6rTeqc2ndL7uGd93QwM9bFcAzMoZZ7SgTBbWx+asui61h/iq1+RmjqdbnQXQ3T1DNQ63V/U9ucqm/pMzPb1rePsk/1iTOjgvatR4W3Lc8ULB78pELyrnAfeTcj1NU509/86mfJ33/8+Mf00a05UyPUEw7UVCeWG/WNEiExyHRMt5ltW30izUPk18ytt7lNfc8i//DvtvXto+ySA5BjljsLUF8lPkqMPEtW1JomDsiGBZ9Byb4NAvUITSN9GuwsIj6t6UTOqk7jJREkmzqli8xIs96udSO20sX0H1vW92IL9e1a9rgqVyf91gbPsTy9UD9n9lOkT8k+RfkFR5PMNqxOcdSf32PBvg3vilO+zdxE+okx9Wm0ph36XYsRZCpMF993GOk5qvqB3Dct6jvssb67KvuUNJ3frw92bhr8/STSF0JdRPMLpUCgnsgo9S76PZ246ZFk1wWvK5m3vVoYvW1Sz7nN91jfXbQ1ZQc7TW6HeaoOalypG/8/p/rP1aNAc6ZHzSnfdqPUPhdy2PQw6Nz9gSVhuhiqueUHR3uu7y7K3rdDX4u46ZrPbUa0IFBZ0seKQ3XQTRt2vm3W/a2DbNKys++rvm3ep6+y1x2UdP3bWU9lzra47U1GmlctX/sQ23t+aOlByLTh/4NAPaCRxtcdO5HLSJ/6vNtCwGx67VPmPbvWd1q9frKHtp4kAqRJ2HR9j762JfX3bZ//elPtj13PPDx1+D5tqk/Xi6NO8SHz7MmH19dXrdBNfVFP6T2PT1UHNit87/t4m5+aRH+nQBdvqyhZDKJLfZs8h7XPsqdV2ZOV+tanKB8aln0dyxdAXbV4j4gvt4oMOrbP6vbU73NW7TMlbdTnPrWpfqXfh9HKZ9vke7KuTeZRNtXRSe6+1FV//ce/ln5eXfsXgcqXzr6+9261M3moOoa7E6nvTZTfy7iNsmfb7kjfgXGsvxe0vihsEts9HTquPpt1q1vtahu2TqAiUAEEKj0zhwoARqgAu/OnX/442WH+9xc/Wvr58re/Tr7f41/+ZsRqhAoACFQAEKgAcHjMoQJskJsz/eqrr5Z+vvr7v5fmQFevAl5lztQIFQAQqAAgUAHgIJlDBdhgdQ41N2eKESoAIFABQKACwFEwhwoARqgAIFABQKACAAIVAAQqAAhUABCoAIBABQCBCgACFQAEKgAgUAFAoAKAQAUAgQoACFQAEKgAIFABQKACAAIVAAQqAAhUABCoAIBABQCBCgACFQAQqAAgUAFAoAKAQAUAlvwPcFDns1DsH4sAAAAASUVORK5CYII=\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/debug-font.png\":\n/*!*****************************************!*\\\n !*** ./Graphics/Context/debug-font.png ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAABACAYAAAD1Xam+AAAAAXNSR0IArs4c6QAABlFJREFUeJztndmy4yoMRcWt/v9fdr8EWoDAaDD4JntVpeqcxBrMIGQDNhEAAAAAAAAAAAAAAOCrSbMfr+u6yoEpTY+906GV57YtPkjyXj9WZZ+wHWHfo2N3/bU6Tte9Rv6ptruqRyMvKvvIX/zY3I/vjLeqsg6l/CWdp0KHKO/1Y1H2EdsR9j06Ntdfp+N03SvkH2u7i3pu5XkQ+DNTkgNJSok+/183xpcdWZHjgUzpQ2pGD67vaf//KRAGAq3tdhCy2tcMQKPyXyz7iPqrdBjbX5h9g7xbtvWf4ZJvM4D/BKG24Sd+IkQ0TC9aW5NM5FbO2HgrPVzW2vmN50DZNv/QWtl5bfPy85SBtdy9dFmjsf2F2SehTBVE+u+tkE5+lAGcJlFwGuodwRRU2Qe3rx0FhPNflc3HWC7BEh8EDGVR5IMCiLnDONtPp87qhxVH/S/LvzUAuDs/kyGimA5oSONKR1w8vsLpv+v+S9vhmS71JRiX1xB5CWZNw7m6rMrllMag/RJyWb67BEgpDVMWSydc+K47pr35w05kWd7ReEq6116KaG4CsbJ7OmV9PdZLEKkONiC1/7ZONVgDsajLIJPYp2OUAXRpnPcGmnIE6eSK4nv5YQqqSYO52JqnYfYj/PdQXQIY7XszuMofMgZRT/1LdeC5h2I5/0EdWDMY2Yb05WDE1RodVdpSA5r85slArAVnSf+89iP896St0f5bZKVA7Gk/3ja8q+152/+wrLqBWZTem3IBADbRBoDuHgAA4HdAAADgh0EAAOCHQQAA4IdBAADgh0EAAOCHuVsKbJ3P9M7jjuxHzGfv8j9iDt47Dx7hP8cjq5F/o/0T62Aer//ZOgDrajBp6aNlOWTEajKLjgj/Pcs/vfZD/a++3Pc8hNfZ966EVeh5vP75luDRJUAl0KzJfnopaqbaTuzZiulc2BS5lltFXntu3dcQsXadl59Wn1H+dfYNtrt2d6D/LDF9HkCQw6eXFbr8P9X5W/un5Ol8gz1t39p5pWOPn0vLynbgdnfe8maEQw+UIPJdfxdOd/4oTtVD0IYg8wDywGas0I04T5O3P8/qf2UWwPpkn1PbOT1bN2tFe59EM7TvKf+TRFw+erZ2ey4hpS3hp9qBkqq/tjsSU1OYqucBWB1yynt5QxC42Mdk30pAEIio//zRG3feBzLUX+TTjCKwlH83aI/KbpQBVEHgUGF0j/SitcLofHem8q6AyH0wBhFv4WszuOjy0yK2vc/oRWQoP2X9ve78jfaLnpncbBqQSC6s0HnIRT0a2yNZjfxT8+ir8t+yDsDTWaS6X70GP33+d77stp+I5HtBdwEAAPBl8ECApcAA/DBvfSowAGAB7/05ZAAA/DAIAADMMU3fOuS2ggAAwBjrorKoxWiPBxHMAgAg490Ts0VeePdA+ZfJDKcCh7sBqY88mmjklZeOt9iXPrvx2I2QPRnN2/qzyJ84h4gNcbtfasq5mM1rZr+bBWh2A+bIIX13Z9wqL+nQvFno7v3oq4tJItCed7isUT6C/I7BUn9KP95wDicYBYpcjncrO2c/dmW4tBtw4RiRld1IDxDyYsoXMHxF1w3dyz0Nne8033AOFsT6VgRCafl89fenTZUfbm8CGhrgdDcS7anAsvnkkP0IeCfQ+JzYunky6jhNYj5bl7++4fJvN9WDSKS/292A0wyANyKDI91bfkm3kcH7ckaP/SKW/VHKRZAcI14pP3beu0fPyn/DuZQbWMogNnsc16sziE96f7H/iai7uTf0/3N8lwFz/e13T00Djt4OrInCnkeChXT+qOcKOLA21tJpsv/G8/COnGnw97J9QwbTvd6djYSv7fxEVTuV/LzNhj7nOawv6bfbAGCYEpQ6HxFtuxs6sq9tzOYHobQ6Nje+6vo5BwFrPZ4OgMayS4PPt1NlzdLfbRCYBoBc+NaO4JWPwLEf33oN3unY3InKPQBW6Z7nEZzEmrl4iZjC804lqgePPEOguQcwWghUphxm343wyt/pWpWR0OrR+jvyxavHajfb9pTjbt9bH07Z5/expM4TLWfwb7QQqMoC+UDWXZo/4RgA38LOgUvLJAAQ1Td9y9//0ylxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+g79apuVUsS5ZmwAAAABJRU5ErkJggg==\");\n\n/***/ })\n\n/******/ });\n/************************************************************************/\n/******/ // The module cache\n/******/ var __webpack_module_cache__ = {};\n/******/ \n/******/ // The require function\n/******/ function __webpack_require__(moduleId) {\n/******/ \t// Check if module is in cache\n/******/ \tvar cachedModule = __webpack_module_cache__[moduleId];\n/******/ \tif (cachedModule !== undefined) {\n/******/ \t\treturn cachedModule.exports;\n/******/ \t}\n/******/ \t// Create a new module (and put it into the cache)\n/******/ \tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\tid: moduleId,\n/******/ \t\t// no module.loaded needed\n/******/ \t\texports: {}\n/******/ \t};\n/******/ \n/******/ \t// Execute the module function\n/******/ \t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/ \n/******/ \t// Return the exports of the module\n/******/ \treturn module.exports;\n/******/ }\n/******/ \n/************************************************************************/\n/******/ /* webpack/runtime/compat get default export */\n/******/ (() => {\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = (module) => {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t() => (module['default']) :\n/******/ \t\t\t() => (module);\n/******/ \t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\treturn getter;\n/******/ \t};\n/******/ })();\n/******/ \n/******/ /* webpack/runtime/define property getters */\n/******/ (() => {\n/******/ \t// define getter functions for harmony exports\n/******/ \t__webpack_require__.d = (exports, definition) => {\n/******/ \t\tfor(var key in definition) {\n/******/ \t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t}\n/******/ \t\t}\n/******/ \t};\n/******/ })();\n/******/ \n/******/ /* webpack/runtime/hasOwnProperty shorthand */\n/******/ (() => {\n/******/ \t__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))\n/******/ })();\n/******/ \n/******/ /* webpack/runtime/make namespace object */\n/******/ (() => {\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = (exports) => {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/ })();\n/******/ \n/************************************************************************/\n/******/ \n/******/ // startup\n/******/ // Load entry module and return exports\n/******/ // This entry module is referenced by other modules so it can't be inlined\n/******/ var __webpack_exports__ = __webpack_require__(\"./index.ts\");\n/******/ var __webpack_exports__ActionCompleteEvent = __webpack_exports__.ActionCompleteEvent;\n/******/ var __webpack_exports__ActionContext = __webpack_exports__.ActionContext;\n/******/ var __webpack_exports__ActionQueue = __webpack_exports__.ActionQueue;\n/******/ var __webpack_exports__ActionSequence = __webpack_exports__.ActionSequence;\n/******/ var __webpack_exports__ActionStartEvent = __webpack_exports__.ActionStartEvent;\n/******/ var __webpack_exports__ActionsComponent = __webpack_exports__.ActionsComponent;\n/******/ var __webpack_exports__ActionsSystem = __webpack_exports__.ActionsSystem;\n/******/ var __webpack_exports__ActivateEvent = __webpack_exports__.ActivateEvent;\n/******/ var __webpack_exports__Actor = __webpack_exports__.Actor;\n/******/ var __webpack_exports__ActorEvents = __webpack_exports__.ActorEvents;\n/******/ var __webpack_exports__AddEvent = __webpack_exports__.AddEvent;\n/******/ var __webpack_exports__AddedComponent = __webpack_exports__.AddedComponent;\n/******/ var __webpack_exports__AffineMatrix = __webpack_exports__.AffineMatrix;\n/******/ var __webpack_exports__Animation = __webpack_exports__.Animation;\n/******/ var __webpack_exports__AnimationDirection = __webpack_exports__.AnimationDirection;\n/******/ var __webpack_exports__AnimationEvents = __webpack_exports__.AnimationEvents;\n/******/ var __webpack_exports__AnimationStrategy = __webpack_exports__.AnimationStrategy;\n/******/ var __webpack_exports__ArcadeSolver = __webpack_exports__.ArcadeSolver;\n/******/ var __webpack_exports__AudioContextFactory = __webpack_exports__.AudioContextFactory;\n/******/ var __webpack_exports__Axes = __webpack_exports__.Axes;\n/******/ var __webpack_exports__Axis = __webpack_exports__.Axis;\n/******/ var __webpack_exports__BaseAlign = __webpack_exports__.BaseAlign;\n/******/ var __webpack_exports__BezierCurve = __webpack_exports__.BezierCurve;\n/******/ var __webpack_exports__Blink = __webpack_exports__.Blink;\n/******/ var __webpack_exports__BodyComponent = __webpack_exports__.BodyComponent;\n/******/ var __webpack_exports__BoundingBox = __webpack_exports__.BoundingBox;\n/******/ var __webpack_exports__BrowserComponent = __webpack_exports__.BrowserComponent;\n/******/ var __webpack_exports__BrowserEvents = __webpack_exports__.BrowserEvents;\n/******/ var __webpack_exports__Buttons = __webpack_exports__.Buttons;\n/******/ var __webpack_exports__Camera = __webpack_exports__.Camera;\n/******/ var __webpack_exports__CameraEvents = __webpack_exports__.CameraEvents;\n/******/ var __webpack_exports__Canvas = __webpack_exports__.Canvas;\n/******/ var __webpack_exports__Circle = __webpack_exports__.Circle;\n/******/ var __webpack_exports__CircleCollider = __webpack_exports__.CircleCollider;\n/******/ var __webpack_exports__Clock = __webpack_exports__.Clock;\n/******/ var __webpack_exports__ClosestLineJumpTable = __webpack_exports__.ClosestLineJumpTable;\n/******/ var __webpack_exports__Collider = __webpack_exports__.Collider;\n/******/ var __webpack_exports__ColliderComponent = __webpack_exports__.ColliderComponent;\n/******/ var __webpack_exports__CollisionContact = __webpack_exports__.CollisionContact;\n/******/ var __webpack_exports__CollisionEndEvent = __webpack_exports__.CollisionEndEvent;\n/******/ var __webpack_exports__CollisionGroup = __webpack_exports__.CollisionGroup;\n/******/ var __webpack_exports__CollisionGroupManager = __webpack_exports__.CollisionGroupManager;\n/******/ var __webpack_exports__CollisionJumpTable = __webpack_exports__.CollisionJumpTable;\n/******/ var __webpack_exports__CollisionPostSolveEvent = __webpack_exports__.CollisionPostSolveEvent;\n/******/ var __webpack_exports__CollisionPreSolveEvent = __webpack_exports__.CollisionPreSolveEvent;\n/******/ var __webpack_exports__CollisionStartEvent = __webpack_exports__.CollisionStartEvent;\n/******/ var __webpack_exports__CollisionSystem = __webpack_exports__.CollisionSystem;\n/******/ var __webpack_exports__CollisionType = __webpack_exports__.CollisionType;\n/******/ var __webpack_exports__Color = __webpack_exports__.Color;\n/******/ var __webpack_exports__ColorBlindFlags = __webpack_exports__.ColorBlindFlags;\n/******/ var __webpack_exports__ColorBlindnessMode = __webpack_exports__.ColorBlindnessMode;\n/******/ var __webpack_exports__ColorBlindnessPostProcessor = __webpack_exports__.ColorBlindnessPostProcessor;\n/******/ var __webpack_exports__Component = __webpack_exports__.Component;\n/******/ var __webpack_exports__CompositeCollider = __webpack_exports__.CompositeCollider;\n/******/ var __webpack_exports__ConsoleAppender = __webpack_exports__.ConsoleAppender;\n/******/ var __webpack_exports__ContactConstraintPoint = __webpack_exports__.ContactConstraintPoint;\n/******/ var __webpack_exports__ContactEndEvent = __webpack_exports__.ContactEndEvent;\n/******/ var __webpack_exports__ContactSolveBias = __webpack_exports__.ContactSolveBias;\n/******/ var __webpack_exports__ContactStartEvent = __webpack_exports__.ContactStartEvent;\n/******/ var __webpack_exports__CoordPlane = __webpack_exports__.CoordPlane;\n/******/ var __webpack_exports__CrossFade = __webpack_exports__.CrossFade;\n/******/ var __webpack_exports__CurveBy = __webpack_exports__.CurveBy;\n/******/ var __webpack_exports__CurveTo = __webpack_exports__.CurveTo;\n/******/ var __webpack_exports__DeactivateEvent = __webpack_exports__.DeactivateEvent;\n/******/ var __webpack_exports__Debug = __webpack_exports__.Debug;\n/******/ var __webpack_exports__DebugConfig = __webpack_exports__.DebugConfig;\n/******/ var __webpack_exports__DebugGraphicsComponent = __webpack_exports__.DebugGraphicsComponent;\n/******/ var __webpack_exports__DebugSystem = __webpack_exports__.DebugSystem;\n/******/ var __webpack_exports__DebugText = __webpack_exports__.DebugText;\n/******/ var __webpack_exports__DefaultAntialiasOptions = __webpack_exports__.DefaultAntialiasOptions;\n/******/ var __webpack_exports__DefaultGarbageCollectionOptions = __webpack_exports__.DefaultGarbageCollectionOptions;\n/******/ var __webpack_exports__DefaultLoader = __webpack_exports__.DefaultLoader;\n/******/ var __webpack_exports__DefaultPixelArtOptions = __webpack_exports__.DefaultPixelArtOptions;\n/******/ var __webpack_exports__DegreeOfFreedom = __webpack_exports__.DegreeOfFreedom;\n/******/ var __webpack_exports__Delay = __webpack_exports__.Delay;\n/******/ var __webpack_exports__Detector = __webpack_exports__.Detector;\n/******/ var __webpack_exports__Die = __webpack_exports__.Die;\n/******/ var __webpack_exports__Direction = __webpack_exports__.Direction;\n/******/ var __webpack_exports__Director = __webpack_exports__.Director;\n/******/ var __webpack_exports__DirectorEvents = __webpack_exports__.DirectorEvents;\n/******/ var __webpack_exports__DisplayMode = __webpack_exports__.DisplayMode;\n/******/ var __webpack_exports__DynamicTree = __webpack_exports__.DynamicTree;\n/******/ var __webpack_exports__DynamicTreeCollisionProcessor = __webpack_exports__.DynamicTreeCollisionProcessor;\n/******/ var __webpack_exports__EX_VERSION = __webpack_exports__.EX_VERSION;\n/******/ var __webpack_exports__EaseBy = __webpack_exports__.EaseBy;\n/******/ var __webpack_exports__EaseTo = __webpack_exports__.EaseTo;\n/******/ var __webpack_exports__EasingFunctions = __webpack_exports__.EasingFunctions;\n/******/ var __webpack_exports__EdgeCollider = __webpack_exports__.EdgeCollider;\n/******/ var __webpack_exports__ElasticToActorStrategy = __webpack_exports__.ElasticToActorStrategy;\n/******/ var __webpack_exports__EmitterType = __webpack_exports__.EmitterType;\n/******/ var __webpack_exports__Engine = __webpack_exports__.Engine;\n/******/ var __webpack_exports__EngineEvents = __webpack_exports__.EngineEvents;\n/******/ var __webpack_exports__EnterTriggerEvent = __webpack_exports__.EnterTriggerEvent;\n/******/ var __webpack_exports__EnterViewPortEvent = __webpack_exports__.EnterViewPortEvent;\n/******/ var __webpack_exports__Entity = __webpack_exports__.Entity;\n/******/ var __webpack_exports__EntityEvents = __webpack_exports__.EntityEvents;\n/******/ var __webpack_exports__EntityManager = __webpack_exports__.EntityManager;\n/******/ var __webpack_exports__EventEmitter = __webpack_exports__.EventEmitter;\n/******/ var __webpack_exports__EventTypes = __webpack_exports__.EventTypes;\n/******/ var __webpack_exports__Events = __webpack_exports__.Events;\n/******/ var __webpack_exports__ExResponse = __webpack_exports__.ExResponse;\n/******/ var __webpack_exports__ExcaliburGraphicsContext2DCanvas = __webpack_exports__.ExcaliburGraphicsContext2DCanvas;\n/******/ var __webpack_exports__ExcaliburGraphicsContextWebGL = __webpack_exports__.ExcaliburGraphicsContextWebGL;\n/******/ var __webpack_exports__ExitTriggerEvent = __webpack_exports__.ExitTriggerEvent;\n/******/ var __webpack_exports__ExitViewPortEvent = __webpack_exports__.ExitViewPortEvent;\n/******/ var __webpack_exports__Fade = __webpack_exports__.Fade;\n/******/ var __webpack_exports__FadeInOut = __webpack_exports__.FadeInOut;\n/******/ var __webpack_exports__Flags = __webpack_exports__.Flags;\n/******/ var __webpack_exports__Flash = __webpack_exports__.Flash;\n/******/ var __webpack_exports__Follow = __webpack_exports__.Follow;\n/******/ var __webpack_exports__Font = __webpack_exports__.Font;\n/******/ var __webpack_exports__FontCache = __webpack_exports__.FontCache;\n/******/ var __webpack_exports__FontSource = __webpack_exports__.FontSource;\n/******/ var __webpack_exports__FontStyle = __webpack_exports__.FontStyle;\n/******/ var __webpack_exports__FontUnit = __webpack_exports__.FontUnit;\n/******/ var __webpack_exports__FpsSampler = __webpack_exports__.FpsSampler;\n/******/ var __webpack_exports__FrameStats = __webpack_exports__.FrameStats;\n/******/ var __webpack_exports__Future = __webpack_exports__.Future;\n/******/ var __webpack_exports__GameEvent = __webpack_exports__.GameEvent;\n/******/ var __webpack_exports__GameStartEvent = __webpack_exports__.GameStartEvent;\n/******/ var __webpack_exports__GameStopEvent = __webpack_exports__.GameStopEvent;\n/******/ var __webpack_exports__Gamepad = __webpack_exports__.Gamepad;\n/******/ var __webpack_exports__GamepadAxisEvent = __webpack_exports__.GamepadAxisEvent;\n/******/ var __webpack_exports__GamepadButtonEvent = __webpack_exports__.GamepadButtonEvent;\n/******/ var __webpack_exports__GamepadConnectEvent = __webpack_exports__.GamepadConnectEvent;\n/******/ var __webpack_exports__GamepadDisconnectEvent = __webpack_exports__.GamepadDisconnectEvent;\n/******/ var __webpack_exports__Gamepads = __webpack_exports__.Gamepads;\n/******/ var __webpack_exports__GarbageCollector = __webpack_exports__.GarbageCollector;\n/******/ var __webpack_exports__Gif = __webpack_exports__.Gif;\n/******/ var __webpack_exports__GifParser = __webpack_exports__.GifParser;\n/******/ var __webpack_exports__GlobalCoordinates = __webpack_exports__.GlobalCoordinates;\n/******/ var __webpack_exports__GpuParticleEmitter = __webpack_exports__.GpuParticleEmitter;\n/******/ var __webpack_exports__GpuParticleRenderer = __webpack_exports__.GpuParticleRenderer;\n/******/ var __webpack_exports__Graphic = __webpack_exports__.Graphic;\n/******/ var __webpack_exports__GraphicsComponent = __webpack_exports__.GraphicsComponent;\n/******/ var __webpack_exports__GraphicsGroup = __webpack_exports__.GraphicsGroup;\n/******/ var __webpack_exports__GraphicsSystem = __webpack_exports__.GraphicsSystem;\n/******/ var __webpack_exports__HashColliderProxy = __webpack_exports__.HashColliderProxy;\n/******/ var __webpack_exports__HashGridCell = __webpack_exports__.HashGridCell;\n/******/ var __webpack_exports__HashGridProxy = __webpack_exports__.HashGridProxy;\n/******/ var __webpack_exports__HiddenEvent = __webpack_exports__.HiddenEvent;\n/******/ var __webpack_exports__HorizontalFirst = __webpack_exports__.HorizontalFirst;\n/******/ var __webpack_exports__ImageFiltering = __webpack_exports__.ImageFiltering;\n/******/ var __webpack_exports__ImageSource = __webpack_exports__.ImageSource;\n/******/ var __webpack_exports__ImageSourceAttributeConstants = __webpack_exports__.ImageSourceAttributeConstants;\n/******/ var __webpack_exports__ImageWrapping = __webpack_exports__.ImageWrapping;\n/******/ var __webpack_exports__InitializeEvent = __webpack_exports__.InitializeEvent;\n/******/ var __webpack_exports__InputHost = __webpack_exports__.InputHost;\n/******/ var __webpack_exports__InputMapper = __webpack_exports__.InputMapper;\n/******/ var __webpack_exports__IsometricEntityComponent = __webpack_exports__.IsometricEntityComponent;\n/******/ var __webpack_exports__IsometricEntitySystem = __webpack_exports__.IsometricEntitySystem;\n/******/ var __webpack_exports__IsometricMap = __webpack_exports__.IsometricMap;\n/******/ var __webpack_exports__IsometricTile = __webpack_exports__.IsometricTile;\n/******/ var __webpack_exports__KeyEvent = __webpack_exports__.KeyEvent;\n/******/ var __webpack_exports__Keyboard = __webpack_exports__.Keyboard;\n/******/ var __webpack_exports__Keys = __webpack_exports__.Keys;\n/******/ var __webpack_exports__KillEvent = __webpack_exports__.KillEvent;\n/******/ var __webpack_exports__Label = __webpack_exports__.Label;\n/******/ var __webpack_exports__LimitCameraBoundsStrategy = __webpack_exports__.LimitCameraBoundsStrategy;\n/******/ var __webpack_exports__Line = __webpack_exports__.Line;\n/******/ var __webpack_exports__LineSegment = __webpack_exports__.LineSegment;\n/******/ var __webpack_exports__Loader = __webpack_exports__.Loader;\n/******/ var __webpack_exports__LoaderEvents = __webpack_exports__.LoaderEvents;\n/******/ var __webpack_exports__LockCameraToActorAxisStrategy = __webpack_exports__.LockCameraToActorAxisStrategy;\n/******/ var __webpack_exports__LockCameraToActorStrategy = __webpack_exports__.LockCameraToActorStrategy;\n/******/ var __webpack_exports__LogLevel = __webpack_exports__.LogLevel;\n/******/ var __webpack_exports__Logger = __webpack_exports__.Logger;\n/******/ var __webpack_exports__Material = __webpack_exports__.Material;\n/******/ var __webpack_exports__Matrix = __webpack_exports__.Matrix;\n/******/ var __webpack_exports__MatrixLocations = __webpack_exports__.MatrixLocations;\n/******/ var __webpack_exports__MediaEvent = __webpack_exports__.MediaEvent;\n/******/ var __webpack_exports__Meet = __webpack_exports__.Meet;\n/******/ var __webpack_exports__MotionComponent = __webpack_exports__.MotionComponent;\n/******/ var __webpack_exports__MotionSystem = __webpack_exports__.MotionSystem;\n/******/ var __webpack_exports__MoveBy = __webpack_exports__.MoveBy;\n/******/ var __webpack_exports__MoveByWithOptions = __webpack_exports__.MoveByWithOptions;\n/******/ var __webpack_exports__MoveTo = __webpack_exports__.MoveTo;\n/******/ var __webpack_exports__MoveToWithOptions = __webpack_exports__.MoveToWithOptions;\n/******/ var __webpack_exports__NativePointerButton = __webpack_exports__.NativePointerButton;\n/******/ var __webpack_exports__NativeSoundEvent = __webpack_exports__.NativeSoundEvent;\n/******/ var __webpack_exports__NativeSoundProcessedEvent = __webpack_exports__.NativeSoundProcessedEvent;\n/******/ var __webpack_exports__NineSlice = __webpack_exports__.NineSlice;\n/******/ var __webpack_exports__NineSliceStretch = __webpack_exports__.NineSliceStretch;\n/******/ var __webpack_exports__None = __webpack_exports__.None;\n/******/ var __webpack_exports__Observable = __webpack_exports__.Observable;\n/******/ var __webpack_exports__OffscreenSystem = __webpack_exports__.OffscreenSystem;\n/******/ var __webpack_exports__Pair = __webpack_exports__.Pair;\n/******/ var __webpack_exports__ParallaxComponent = __webpack_exports__.ParallaxComponent;\n/******/ var __webpack_exports__ParallelActions = __webpack_exports__.ParallelActions;\n/******/ var __webpack_exports__Particle = __webpack_exports__.Particle;\n/******/ var __webpack_exports__ParticleEmitter = __webpack_exports__.ParticleEmitter;\n/******/ var __webpack_exports__ParticleRenderer = __webpack_exports__.ParticleRenderer;\n/******/ var __webpack_exports__ParticleTransform = __webpack_exports__.ParticleTransform;\n/******/ var __webpack_exports__PhysicsStats = __webpack_exports__.PhysicsStats;\n/******/ var __webpack_exports__PhysicsWorld = __webpack_exports__.PhysicsWorld;\n/******/ var __webpack_exports__PointerAbstraction = __webpack_exports__.PointerAbstraction;\n/******/ var __webpack_exports__PointerButton = __webpack_exports__.PointerButton;\n/******/ var __webpack_exports__PointerComponent = __webpack_exports__.PointerComponent;\n/******/ var __webpack_exports__PointerEvent = __webpack_exports__.PointerEvent;\n/******/ var __webpack_exports__PointerEventReceiver = __webpack_exports__.PointerEventReceiver;\n/******/ var __webpack_exports__PointerScope = __webpack_exports__.PointerScope;\n/******/ var __webpack_exports__PointerSystem = __webpack_exports__.PointerSystem;\n/******/ var __webpack_exports__PointerType = __webpack_exports__.PointerType;\n/******/ var __webpack_exports__Polygon = __webpack_exports__.Polygon;\n/******/ var __webpack_exports__PolygonCollider = __webpack_exports__.PolygonCollider;\n/******/ var __webpack_exports__Pool = __webpack_exports__.Pool;\n/******/ var __webpack_exports__PostCollisionEvent = __webpack_exports__.PostCollisionEvent;\n/******/ var __webpack_exports__PostDebugDrawEvent = __webpack_exports__.PostDebugDrawEvent;\n/******/ var __webpack_exports__PostDrawEvent = __webpack_exports__.PostDrawEvent;\n/******/ var __webpack_exports__PostFrameEvent = __webpack_exports__.PostFrameEvent;\n/******/ var __webpack_exports__PostKillEvent = __webpack_exports__.PostKillEvent;\n/******/ var __webpack_exports__PostTransformDrawEvent = __webpack_exports__.PostTransformDrawEvent;\n/******/ var __webpack_exports__PostUpdateEvent = __webpack_exports__.PostUpdateEvent;\n/******/ var __webpack_exports__PreCollisionEvent = __webpack_exports__.PreCollisionEvent;\n/******/ var __webpack_exports__PreDebugDrawEvent = __webpack_exports__.PreDebugDrawEvent;\n/******/ var __webpack_exports__PreDrawEvent = __webpack_exports__.PreDrawEvent;\n/******/ var __webpack_exports__PreFrameEvent = __webpack_exports__.PreFrameEvent;\n/******/ var __webpack_exports__PreKillEvent = __webpack_exports__.PreKillEvent;\n/******/ var __webpack_exports__PreLoadEvent = __webpack_exports__.PreLoadEvent;\n/******/ var __webpack_exports__PreTransformDrawEvent = __webpack_exports__.PreTransformDrawEvent;\n/******/ var __webpack_exports__PreUpdateEvent = __webpack_exports__.PreUpdateEvent;\n/******/ var __webpack_exports__Projection = __webpack_exports__.Projection;\n/******/ var __webpack_exports__QuadIndexBuffer = __webpack_exports__.QuadIndexBuffer;\n/******/ var __webpack_exports__QuadTree = __webpack_exports__.QuadTree;\n/******/ var __webpack_exports__Query = __webpack_exports__.Query;\n/******/ var __webpack_exports__QueryManager = __webpack_exports__.QueryManager;\n/******/ var __webpack_exports__RadiusAroundActorStrategy = __webpack_exports__.RadiusAroundActorStrategy;\n/******/ var __webpack_exports__Random = __webpack_exports__.Random;\n/******/ var __webpack_exports__Raster = __webpack_exports__.Raster;\n/******/ var __webpack_exports__Ray = __webpack_exports__.Ray;\n/******/ var __webpack_exports__RealisticSolver = __webpack_exports__.RealisticSolver;\n/******/ var __webpack_exports__Rectangle = __webpack_exports__.Rectangle;\n/******/ var __webpack_exports__RemoveEvent = __webpack_exports__.RemoveEvent;\n/******/ var __webpack_exports__RemovedComponent = __webpack_exports__.RemovedComponent;\n/******/ var __webpack_exports__Repeat = __webpack_exports__.Repeat;\n/******/ var __webpack_exports__RepeatForever = __webpack_exports__.RepeatForever;\n/******/ var __webpack_exports__Resolution = __webpack_exports__.Resolution;\n/******/ var __webpack_exports__Resource = __webpack_exports__.Resource;\n/******/ var __webpack_exports__ResourceEvents = __webpack_exports__.ResourceEvents;\n/******/ var __webpack_exports__RotateBy = __webpack_exports__.RotateBy;\n/******/ var __webpack_exports__RotateByWithOptions = __webpack_exports__.RotateByWithOptions;\n/******/ var __webpack_exports__RotateTo = __webpack_exports__.RotateTo;\n/******/ var __webpack_exports__RotateToWithOptions = __webpack_exports__.RotateToWithOptions;\n/******/ var __webpack_exports__RotationType = __webpack_exports__.RotationType;\n/******/ var __webpack_exports__ScaleBy = __webpack_exports__.ScaleBy;\n/******/ var __webpack_exports__ScaleByWithOptions = __webpack_exports__.ScaleByWithOptions;\n/******/ var __webpack_exports__ScaleTo = __webpack_exports__.ScaleTo;\n/******/ var __webpack_exports__ScaleToWithOptions = __webpack_exports__.ScaleToWithOptions;\n/******/ var __webpack_exports__Scene = __webpack_exports__.Scene;\n/******/ var __webpack_exports__SceneEvents = __webpack_exports__.SceneEvents;\n/******/ var __webpack_exports__Screen = __webpack_exports__.Screen;\n/******/ var __webpack_exports__ScreenAppender = __webpack_exports__.ScreenAppender;\n/******/ var __webpack_exports__ScreenElement = __webpack_exports__.ScreenElement;\n/******/ var __webpack_exports__ScreenEvents = __webpack_exports__.ScreenEvents;\n/******/ var __webpack_exports__ScreenShader = __webpack_exports__.ScreenShader;\n/******/ var __webpack_exports__ScrollPreventionMode = __webpack_exports__.ScrollPreventionMode;\n/******/ var __webpack_exports__Semaphore = __webpack_exports__.Semaphore;\n/******/ var __webpack_exports__SeparatingAxis = __webpack_exports__.SeparatingAxis;\n/******/ var __webpack_exports__SeparationInfo = __webpack_exports__.SeparationInfo;\n/******/ var __webpack_exports__Shader = __webpack_exports__.Shader;\n/******/ var __webpack_exports__Shape = __webpack_exports__.Shape;\n/******/ var __webpack_exports__Side = __webpack_exports__.Side;\n/******/ var __webpack_exports__Slide = __webpack_exports__.Slide;\n/******/ var __webpack_exports__SolverStrategy = __webpack_exports__.SolverStrategy;\n/******/ var __webpack_exports__Sound = __webpack_exports__.Sound;\n/******/ var __webpack_exports__SoundEvents = __webpack_exports__.SoundEvents;\n/******/ var __webpack_exports__SparseHashGrid = __webpack_exports__.SparseHashGrid;\n/******/ var __webpack_exports__SparseHashGridCollisionProcessor = __webpack_exports__.SparseHashGridCollisionProcessor;\n/******/ var __webpack_exports__SpatialPartitionStrategy = __webpack_exports__.SpatialPartitionStrategy;\n/******/ var __webpack_exports__Sprite = __webpack_exports__.Sprite;\n/******/ var __webpack_exports__SpriteFont = __webpack_exports__.SpriteFont;\n/******/ var __webpack_exports__SpriteSheet = __webpack_exports__.SpriteSheet;\n/******/ var __webpack_exports__StandardClock = __webpack_exports__.StandardClock;\n/******/ var __webpack_exports__StateMachine = __webpack_exports__.StateMachine;\n/******/ var __webpack_exports__StrategyContainer = __webpack_exports__.StrategyContainer;\n/******/ var __webpack_exports__Stream = __webpack_exports__.Stream;\n/******/ var __webpack_exports__System = __webpack_exports__.System;\n/******/ var __webpack_exports__SystemManager = __webpack_exports__.SystemManager;\n/******/ var __webpack_exports__SystemPriority = __webpack_exports__.SystemPriority;\n/******/ var __webpack_exports__SystemType = __webpack_exports__.SystemType;\n/******/ var __webpack_exports__TagQuery = __webpack_exports__.TagQuery;\n/******/ var __webpack_exports__TestClock = __webpack_exports__.TestClock;\n/******/ var __webpack_exports__Text = __webpack_exports__.Text;\n/******/ var __webpack_exports__TextAlign = __webpack_exports__.TextAlign;\n/******/ var __webpack_exports__TextureLoader = __webpack_exports__.TextureLoader;\n/******/ var __webpack_exports__Tile = __webpack_exports__.Tile;\n/******/ var __webpack_exports__TileMap = __webpack_exports__.TileMap;\n/******/ var __webpack_exports__TileMapEvents = __webpack_exports__.TileMapEvents;\n/******/ var __webpack_exports__TiledAnimation = __webpack_exports__.TiledAnimation;\n/******/ var __webpack_exports__TiledSprite = __webpack_exports__.TiledSprite;\n/******/ var __webpack_exports__Timer = __webpack_exports__.Timer;\n/******/ var __webpack_exports__Toaster = __webpack_exports__.Toaster;\n/******/ var __webpack_exports__Transform = __webpack_exports__.Transform;\n/******/ var __webpack_exports__TransformComponent = __webpack_exports__.TransformComponent;\n/******/ var __webpack_exports__Transition = __webpack_exports__.Transition;\n/******/ var __webpack_exports__TreeNode = __webpack_exports__.TreeNode;\n/******/ var __webpack_exports__Trigger = __webpack_exports__.Trigger;\n/******/ var __webpack_exports__TriggerEvents = __webpack_exports__.TriggerEvents;\n/******/ var __webpack_exports__TwoPI = __webpack_exports__.TwoPI;\n/******/ var __webpack_exports__Util = __webpack_exports__.Util;\n/******/ var __webpack_exports__Vector = __webpack_exports__.Vector;\n/******/ var __webpack_exports__VectorView = __webpack_exports__.VectorView;\n/******/ var __webpack_exports__VertexBuffer = __webpack_exports__.VertexBuffer;\n/******/ var __webpack_exports__VertexLayout = __webpack_exports__.VertexLayout;\n/******/ var __webpack_exports__VerticalFirst = __webpack_exports__.VerticalFirst;\n/******/ var __webpack_exports__VisibleEvent = __webpack_exports__.VisibleEvent;\n/******/ var __webpack_exports__WebAudio = __webpack_exports__.WebAudio;\n/******/ var __webpack_exports__WebAudioInstance = __webpack_exports__.WebAudioInstance;\n/******/ var __webpack_exports__WheelDeltaMode = __webpack_exports__.WheelDeltaMode;\n/******/ var __webpack_exports__WheelEvent = __webpack_exports__.WheelEvent;\n/******/ var __webpack_exports__World = __webpack_exports__.World;\n/******/ var __webpack_exports__approximatelyEqual = __webpack_exports__.approximatelyEqual;\n/******/ var __webpack_exports__assert = __webpack_exports__.assert;\n/******/ var __webpack_exports__canonicalizeAngle = __webpack_exports__.canonicalizeAngle;\n/******/ var __webpack_exports__clamp = __webpack_exports__.clamp;\n/******/ var __webpack_exports__coroutine = __webpack_exports__.coroutine;\n/******/ var __webpack_exports__createId = __webpack_exports__.createId;\n/******/ var __webpack_exports__frac = __webpack_exports__.frac;\n/******/ var __webpack_exports__getDefaultPhysicsConfig = __webpack_exports__.getDefaultPhysicsConfig;\n/******/ var __webpack_exports__hasGraphicsTick = __webpack_exports__.hasGraphicsTick;\n/******/ var __webpack_exports__hasOnAdd = __webpack_exports__.hasOnAdd;\n/******/ var __webpack_exports__hasOnInitialize = __webpack_exports__.hasOnInitialize;\n/******/ var __webpack_exports__hasOnPostUpdate = __webpack_exports__.hasOnPostUpdate;\n/******/ var __webpack_exports__hasOnPreUpdate = __webpack_exports__.hasOnPreUpdate;\n/******/ var __webpack_exports__hasOnRemove = __webpack_exports__.hasOnRemove;\n/******/ var __webpack_exports__hasPostDraw = __webpack_exports__.hasPostDraw;\n/******/ var __webpack_exports__hasPreDraw = __webpack_exports__.hasPreDraw;\n/******/ var __webpack_exports__has_add = __webpack_exports__.has_add;\n/******/ var __webpack_exports__has_initialize = __webpack_exports__.has_initialize;\n/******/ var __webpack_exports__has_postupdate = __webpack_exports__.has_postupdate;\n/******/ var __webpack_exports__has_preupdate = __webpack_exports__.has_preupdate;\n/******/ var __webpack_exports__has_remove = __webpack_exports__.has_remove;\n/******/ var __webpack_exports__inverseLerp = __webpack_exports__.inverseLerp;\n/******/ var __webpack_exports__inverseLerpVector = __webpack_exports__.inverseLerpVector;\n/******/ var __webpack_exports__isActor = __webpack_exports__.isActor;\n/******/ var __webpack_exports__isAddedComponent = __webpack_exports__.isAddedComponent;\n/******/ var __webpack_exports__isComponentCtor = __webpack_exports__.isComponentCtor;\n/******/ var __webpack_exports__isLoaderConstructor = __webpack_exports__.isLoaderConstructor;\n/******/ var __webpack_exports__isMoveByOptions = __webpack_exports__.isMoveByOptions;\n/******/ var __webpack_exports__isMoveToOptions = __webpack_exports__.isMoveToOptions;\n/******/ var __webpack_exports__isRemovedComponent = __webpack_exports__.isRemovedComponent;\n/******/ var __webpack_exports__isRotateByOptions = __webpack_exports__.isRotateByOptions;\n/******/ var __webpack_exports__isRotateToOptions = __webpack_exports__.isRotateToOptions;\n/******/ var __webpack_exports__isScaleByOptions = __webpack_exports__.isScaleByOptions;\n/******/ var __webpack_exports__isScaleToOptions = __webpack_exports__.isScaleToOptions;\n/******/ var __webpack_exports__isSceneConstructor = __webpack_exports__.isSceneConstructor;\n/******/ var __webpack_exports__isScreenElement = __webpack_exports__.isScreenElement;\n/******/ var __webpack_exports__isSystemConstructor = __webpack_exports__.isSystemConstructor;\n/******/ var __webpack_exports__lerp = __webpack_exports__.lerp;\n/******/ var __webpack_exports__lerpAngle = __webpack_exports__.lerpAngle;\n/******/ var __webpack_exports__lerpVector = __webpack_exports__.lerpVector;\n/******/ var __webpack_exports__maxMessages = __webpack_exports__.maxMessages;\n/******/ var __webpack_exports__nextActionId = __webpack_exports__.nextActionId;\n/******/ var __webpack_exports__obsolete = __webpack_exports__.obsolete;\n/******/ var __webpack_exports__parseImageFiltering = __webpack_exports__.parseImageFiltering;\n/******/ var __webpack_exports__parseImageWrapping = __webpack_exports__.parseImageWrapping;\n/******/ var __webpack_exports__pixelSnapEpsilon = __webpack_exports__.pixelSnapEpsilon;\n/******/ var __webpack_exports__randomInRange = __webpack_exports__.randomInRange;\n/******/ var __webpack_exports__randomIntInRange = __webpack_exports__.randomIntInRange;\n/******/ var __webpack_exports__range = __webpack_exports__.range;\n/******/ var __webpack_exports__remap = __webpack_exports__.remap;\n/******/ var __webpack_exports__remapVector = __webpack_exports__.remapVector;\n/******/ var __webpack_exports__resetObsoleteCounter = __webpack_exports__.resetObsoleteCounter;\n/******/ var __webpack_exports__sign = __webpack_exports__.sign;\n/******/ var __webpack_exports__toDegrees = __webpack_exports__.toDegrees;\n/******/ var __webpack_exports__toRadians = __webpack_exports__.toRadians;\n/******/ var __webpack_exports__vec = __webpack_exports__.vec;\n/******/ var __webpack_exports__webgl = __webpack_exports__.webgl;\n/******/ export { __webpack_exports__ActionCompleteEvent as ActionCompleteEvent, __webpack_exports__ActionContext as ActionContext, __webpack_exports__ActionQueue as ActionQueue, __webpack_exports__ActionSequence as ActionSequence, __webpack_exports__ActionStartEvent as ActionStartEvent, __webpack_exports__ActionsComponent as ActionsComponent, __webpack_exports__ActionsSystem as ActionsSystem, __webpack_exports__ActivateEvent as ActivateEvent, __webpack_exports__Actor as Actor, __webpack_exports__ActorEvents as ActorEvents, __webpack_exports__AddEvent as AddEvent, __webpack_exports__AddedComponent as AddedComponent, __webpack_exports__AffineMatrix as AffineMatrix, __webpack_exports__Animation as Animation, __webpack_exports__AnimationDirection as AnimationDirection, __webpack_exports__AnimationEvents as AnimationEvents, __webpack_exports__AnimationStrategy as AnimationStrategy, __webpack_exports__ArcadeSolver as ArcadeSolver, __webpack_exports__AudioContextFactory as AudioContextFactory, __webpack_exports__Axes as Axes, __webpack_exports__Axis as Axis, __webpack_exports__BaseAlign as BaseAlign, __webpack_exports__BezierCurve as BezierCurve, __webpack_exports__Blink as Blink, __webpack_exports__BodyComponent as BodyComponent, __webpack_exports__BoundingBox as BoundingBox, __webpack_exports__BrowserComponent as BrowserComponent, __webpack_exports__BrowserEvents as BrowserEvents, __webpack_exports__Buttons as Buttons, __webpack_exports__Camera as Camera, __webpack_exports__CameraEvents as CameraEvents, __webpack_exports__Canvas as Canvas, __webpack_exports__Circle as Circle, __webpack_exports__CircleCollider as CircleCollider, __webpack_exports__Clock as Clock, __webpack_exports__ClosestLineJumpTable as ClosestLineJumpTable, __webpack_exports__Collider as Collider, __webpack_exports__ColliderComponent as ColliderComponent, __webpack_exports__CollisionContact as CollisionContact, __webpack_exports__CollisionEndEvent as CollisionEndEvent, __webpack_exports__CollisionGroup as CollisionGroup, __webpack_exports__CollisionGroupManager as CollisionGroupManager, __webpack_exports__CollisionJumpTable as CollisionJumpTable, __webpack_exports__CollisionPostSolveEvent as CollisionPostSolveEvent, __webpack_exports__CollisionPreSolveEvent as CollisionPreSolveEvent, __webpack_exports__CollisionStartEvent as CollisionStartEvent, __webpack_exports__CollisionSystem as CollisionSystem, __webpack_exports__CollisionType as CollisionType, __webpack_exports__Color as Color, __webpack_exports__ColorBlindFlags as ColorBlindFlags, __webpack_exports__ColorBlindnessMode as ColorBlindnessMode, __webpack_exports__ColorBlindnessPostProcessor as ColorBlindnessPostProcessor, __webpack_exports__Component as Component, __webpack_exports__CompositeCollider as CompositeCollider, __webpack_exports__ConsoleAppender as ConsoleAppender, __webpack_exports__ContactConstraintPoint as ContactConstraintPoint, __webpack_exports__ContactEndEvent as ContactEndEvent, __webpack_exports__ContactSolveBias as ContactSolveBias, __webpack_exports__ContactStartEvent as ContactStartEvent, __webpack_exports__CoordPlane as CoordPlane, __webpack_exports__CrossFade as CrossFade, __webpack_exports__CurveBy as CurveBy, __webpack_exports__CurveTo as CurveTo, __webpack_exports__DeactivateEvent as DeactivateEvent, __webpack_exports__Debug as Debug, __webpack_exports__DebugConfig as DebugConfig, __webpack_exports__DebugGraphicsComponent as DebugGraphicsComponent, __webpack_exports__DebugSystem as DebugSystem, __webpack_exports__DebugText as DebugText, __webpack_exports__DefaultAntialiasOptions as DefaultAntialiasOptions, __webpack_exports__DefaultGarbageCollectionOptions as DefaultGarbageCollectionOptions, __webpack_exports__DefaultLoader as DefaultLoader, __webpack_exports__DefaultPixelArtOptions as DefaultPixelArtOptions, __webpack_exports__DegreeOfFreedom as DegreeOfFreedom, __webpack_exports__Delay as Delay, __webpack_exports__Detector as Detector, __webpack_exports__Die as Die, __webpack_exports__Direction as Direction, __webpack_exports__Director as Director, __webpack_exports__DirectorEvents as DirectorEvents, __webpack_exports__DisplayMode as DisplayMode, __webpack_exports__DynamicTree as DynamicTree, __webpack_exports__DynamicTreeCollisionProcessor as DynamicTreeCollisionProcessor, __webpack_exports__EX_VERSION as EX_VERSION, __webpack_exports__EaseBy as EaseBy, __webpack_exports__EaseTo as EaseTo, __webpack_exports__EasingFunctions as EasingFunctions, __webpack_exports__EdgeCollider as EdgeCollider, __webpack_exports__ElasticToActorStrategy as ElasticToActorStrategy, __webpack_exports__EmitterType as EmitterType, __webpack_exports__Engine as Engine, __webpack_exports__EngineEvents as EngineEvents, __webpack_exports__EnterTriggerEvent as EnterTriggerEvent, __webpack_exports__EnterViewPortEvent as EnterViewPortEvent, __webpack_exports__Entity as Entity, __webpack_exports__EntityEvents as EntityEvents, __webpack_exports__EntityManager as EntityManager, __webpack_exports__EventEmitter as EventEmitter, __webpack_exports__EventTypes as EventTypes, __webpack_exports__Events as Events, __webpack_exports__ExResponse as ExResponse, __webpack_exports__ExcaliburGraphicsContext2DCanvas as ExcaliburGraphicsContext2DCanvas, __webpack_exports__ExcaliburGraphicsContextWebGL as ExcaliburGraphicsContextWebGL, __webpack_exports__ExitTriggerEvent as ExitTriggerEvent, __webpack_exports__ExitViewPortEvent as ExitViewPortEvent, __webpack_exports__Fade as Fade, __webpack_exports__FadeInOut as FadeInOut, __webpack_exports__Flags as Flags, __webpack_exports__Flash as Flash, __webpack_exports__Follow as Follow, __webpack_exports__Font as Font, __webpack_exports__FontCache as FontCache, __webpack_exports__FontSource as FontSource, __webpack_exports__FontStyle as FontStyle, __webpack_exports__FontUnit as FontUnit, __webpack_exports__FpsSampler as FpsSampler, __webpack_exports__FrameStats as FrameStats, __webpack_exports__Future as Future, __webpack_exports__GameEvent as GameEvent, __webpack_exports__GameStartEvent as GameStartEvent, __webpack_exports__GameStopEvent as GameStopEvent, __webpack_exports__Gamepad as Gamepad, __webpack_exports__GamepadAxisEvent as GamepadAxisEvent, __webpack_exports__GamepadButtonEvent as GamepadButtonEvent, __webpack_exports__GamepadConnectEvent as GamepadConnectEvent, __webpack_exports__GamepadDisconnectEvent as GamepadDisconnectEvent, __webpack_exports__Gamepads as Gamepads, __webpack_exports__GarbageCollector as GarbageCollector, __webpack_exports__Gif as Gif, __webpack_exports__GifParser as GifParser, __webpack_exports__GlobalCoordinates as GlobalCoordinates, __webpack_exports__GpuParticleEmitter as GpuParticleEmitter, __webpack_exports__GpuParticleRenderer as GpuParticleRenderer, __webpack_exports__Graphic as Graphic, __webpack_exports__GraphicsComponent as GraphicsComponent, __webpack_exports__GraphicsGroup as GraphicsGroup, __webpack_exports__GraphicsSystem as GraphicsSystem, __webpack_exports__HashColliderProxy as HashColliderProxy, __webpack_exports__HashGridCell as HashGridCell, __webpack_exports__HashGridProxy as HashGridProxy, __webpack_exports__HiddenEvent as HiddenEvent, __webpack_exports__HorizontalFirst as HorizontalFirst, __webpack_exports__ImageFiltering as ImageFiltering, __webpack_exports__ImageSource as ImageSource, __webpack_exports__ImageSourceAttributeConstants as ImageSourceAttributeConstants, __webpack_exports__ImageWrapping as ImageWrapping, __webpack_exports__InitializeEvent as InitializeEvent, __webpack_exports__InputHost as InputHost, __webpack_exports__InputMapper as InputMapper, __webpack_exports__IsometricEntityComponent as IsometricEntityComponent, __webpack_exports__IsometricEntitySystem as IsometricEntitySystem, __webpack_exports__IsometricMap as IsometricMap, __webpack_exports__IsometricTile as IsometricTile, __webpack_exports__KeyEvent as KeyEvent, __webpack_exports__Keyboard as Keyboard, __webpack_exports__Keys as Keys, __webpack_exports__KillEvent as KillEvent, __webpack_exports__Label as Label, __webpack_exports__LimitCameraBoundsStrategy as LimitCameraBoundsStrategy, __webpack_exports__Line as Line, __webpack_exports__LineSegment as LineSegment, __webpack_exports__Loader as Loader, __webpack_exports__LoaderEvents as LoaderEvents, __webpack_exports__LockCameraToActorAxisStrategy as LockCameraToActorAxisStrategy, __webpack_exports__LockCameraToActorStrategy as LockCameraToActorStrategy, __webpack_exports__LogLevel as LogLevel, __webpack_exports__Logger as Logger, __webpack_exports__Material as Material, __webpack_exports__Matrix as Matrix, __webpack_exports__MatrixLocations as MatrixLocations, __webpack_exports__MediaEvent as MediaEvent, __webpack_exports__Meet as Meet, __webpack_exports__MotionComponent as MotionComponent, __webpack_exports__MotionSystem as MotionSystem, __webpack_exports__MoveBy as MoveBy, __webpack_exports__MoveByWithOptions as MoveByWithOptions, __webpack_exports__MoveTo as MoveTo, __webpack_exports__MoveToWithOptions as MoveToWithOptions, __webpack_exports__NativePointerButton as NativePointerButton, __webpack_exports__NativeSoundEvent as NativeSoundEvent, __webpack_exports__NativeSoundProcessedEvent as NativeSoundProcessedEvent, __webpack_exports__NineSlice as NineSlice, __webpack_exports__NineSliceStretch as NineSliceStretch, __webpack_exports__None as None, __webpack_exports__Observable as Observable, __webpack_exports__OffscreenSystem as OffscreenSystem, __webpack_exports__Pair as Pair, __webpack_exports__ParallaxComponent as ParallaxComponent, __webpack_exports__ParallelActions as ParallelActions, __webpack_exports__Particle as Particle, __webpack_exports__ParticleEmitter as ParticleEmitter, __webpack_exports__ParticleRenderer as ParticleRenderer, __webpack_exports__ParticleTransform as ParticleTransform, __webpack_exports__PhysicsStats as PhysicsStats, __webpack_exports__PhysicsWorld as PhysicsWorld, __webpack_exports__PointerAbstraction as PointerAbstraction, __webpack_exports__PointerButton as PointerButton, __webpack_exports__PointerComponent as PointerComponent, __webpack_exports__PointerEvent as PointerEvent, __webpack_exports__PointerEventReceiver as PointerEventReceiver, __webpack_exports__PointerScope as PointerScope, __webpack_exports__PointerSystem as PointerSystem, __webpack_exports__PointerType as PointerType, __webpack_exports__Polygon as Polygon, __webpack_exports__PolygonCollider as PolygonCollider, __webpack_exports__Pool as Pool, __webpack_exports__PostCollisionEvent as PostCollisionEvent, __webpack_exports__PostDebugDrawEvent as PostDebugDrawEvent, __webpack_exports__PostDrawEvent as PostDrawEvent, __webpack_exports__PostFrameEvent as PostFrameEvent, __webpack_exports__PostKillEvent as PostKillEvent, __webpack_exports__PostTransformDrawEvent as PostTransformDrawEvent, __webpack_exports__PostUpdateEvent as PostUpdateEvent, __webpack_exports__PreCollisionEvent as PreCollisionEvent, __webpack_exports__PreDebugDrawEvent as PreDebugDrawEvent, __webpack_exports__PreDrawEvent as PreDrawEvent, __webpack_exports__PreFrameEvent as PreFrameEvent, __webpack_exports__PreKillEvent as PreKillEvent, __webpack_exports__PreLoadEvent as PreLoadEvent, __webpack_exports__PreTransformDrawEvent as PreTransformDrawEvent, __webpack_exports__PreUpdateEvent as PreUpdateEvent, __webpack_exports__Projection as Projection, __webpack_exports__QuadIndexBuffer as QuadIndexBuffer, __webpack_exports__QuadTree as QuadTree, __webpack_exports__Query as Query, __webpack_exports__QueryManager as QueryManager, __webpack_exports__RadiusAroundActorStrategy as RadiusAroundActorStrategy, __webpack_exports__Random as Random, __webpack_exports__Raster as Raster, __webpack_exports__Ray as Ray, __webpack_exports__RealisticSolver as RealisticSolver, __webpack_exports__Rectangle as Rectangle, __webpack_exports__RemoveEvent as RemoveEvent, __webpack_exports__RemovedComponent as RemovedComponent, __webpack_exports__Repeat as Repeat, __webpack_exports__RepeatForever as RepeatForever, __webpack_exports__Resolution as Resolution, __webpack_exports__Resource as Resource, __webpack_exports__ResourceEvents as ResourceEvents, __webpack_exports__RotateBy as RotateBy, __webpack_exports__RotateByWithOptions as RotateByWithOptions, __webpack_exports__RotateTo as RotateTo, __webpack_exports__RotateToWithOptions as RotateToWithOptions, __webpack_exports__RotationType as RotationType, __webpack_exports__ScaleBy as ScaleBy, __webpack_exports__ScaleByWithOptions as ScaleByWithOptions, __webpack_exports__ScaleTo as ScaleTo, __webpack_exports__ScaleToWithOptions as ScaleToWithOptions, __webpack_exports__Scene as Scene, __webpack_exports__SceneEvents as SceneEvents, __webpack_exports__Screen as Screen, __webpack_exports__ScreenAppender as ScreenAppender, __webpack_exports__ScreenElement as ScreenElement, __webpack_exports__ScreenEvents as ScreenEvents, __webpack_exports__ScreenShader as ScreenShader, __webpack_exports__ScrollPreventionMode as ScrollPreventionMode, __webpack_exports__Semaphore as Semaphore, __webpack_exports__SeparatingAxis as SeparatingAxis, __webpack_exports__SeparationInfo as SeparationInfo, __webpack_exports__Shader as Shader, __webpack_exports__Shape as Shape, __webpack_exports__Side as Side, __webpack_exports__Slide as Slide, __webpack_exports__SolverStrategy as SolverStrategy, __webpack_exports__Sound as Sound, __webpack_exports__SoundEvents as SoundEvents, __webpack_exports__SparseHashGrid as SparseHashGrid, __webpack_exports__SparseHashGridCollisionProcessor as SparseHashGridCollisionProcessor, __webpack_exports__SpatialPartitionStrategy as SpatialPartitionStrategy, __webpack_exports__Sprite as Sprite, __webpack_exports__SpriteFont as SpriteFont, __webpack_exports__SpriteSheet as SpriteSheet, __webpack_exports__StandardClock as StandardClock, __webpack_exports__StateMachine as StateMachine, __webpack_exports__StrategyContainer as StrategyContainer, __webpack_exports__Stream as Stream, __webpack_exports__System as System, __webpack_exports__SystemManager as SystemManager, __webpack_exports__SystemPriority as SystemPriority, __webpack_exports__SystemType as SystemType, __webpack_exports__TagQuery as TagQuery, __webpack_exports__TestClock as TestClock, __webpack_exports__Text as Text, __webpack_exports__TextAlign as TextAlign, __webpack_exports__TextureLoader as TextureLoader, __webpack_exports__Tile as Tile, __webpack_exports__TileMap as TileMap, __webpack_exports__TileMapEvents as TileMapEvents, __webpack_exports__TiledAnimation as TiledAnimation, __webpack_exports__TiledSprite as TiledSprite, __webpack_exports__Timer as Timer, __webpack_exports__Toaster as Toaster, __webpack_exports__Transform as Transform, __webpack_exports__TransformComponent as TransformComponent, __webpack_exports__Transition as Transition, __webpack_exports__TreeNode as TreeNode, __webpack_exports__Trigger as Trigger, __webpack_exports__TriggerEvents as TriggerEvents, __webpack_exports__TwoPI as TwoPI, __webpack_exports__Util as Util, __webpack_exports__Vector as Vector, __webpack_exports__VectorView as VectorView, __webpack_exports__VertexBuffer as VertexBuffer, __webpack_exports__VertexLayout as VertexLayout, __webpack_exports__VerticalFirst as VerticalFirst, __webpack_exports__VisibleEvent as VisibleEvent, __webpack_exports__WebAudio as WebAudio, __webpack_exports__WebAudioInstance as WebAudioInstance, __webpack_exports__WheelDeltaMode as WheelDeltaMode, __webpack_exports__WheelEvent as WheelEvent, __webpack_exports__World as World, __webpack_exports__approximatelyEqual as approximatelyEqual, __webpack_exports__assert as assert, __webpack_exports__canonicalizeAngle as canonicalizeAngle, __webpack_exports__clamp as clamp, __webpack_exports__coroutine as coroutine, __webpack_exports__createId as createId, __webpack_exports__frac as frac, __webpack_exports__getDefaultPhysicsConfig as getDefaultPhysicsConfig, __webpack_exports__hasGraphicsTick as hasGraphicsTick, __webpack_exports__hasOnAdd as hasOnAdd, __webpack_exports__hasOnInitialize as hasOnInitialize, __webpack_exports__hasOnPostUpdate as hasOnPostUpdate, __webpack_exports__hasOnPreUpdate as hasOnPreUpdate, __webpack_exports__hasOnRemove as hasOnRemove, __webpack_exports__hasPostDraw as hasPostDraw, __webpack_exports__hasPreDraw as hasPreDraw, __webpack_exports__has_add as has_add, __webpack_exports__has_initialize as has_initialize, __webpack_exports__has_postupdate as has_postupdate, __webpack_exports__has_preupdate as has_preupdate, __webpack_exports__has_remove as has_remove, __webpack_exports__inverseLerp as inverseLerp, __webpack_exports__inverseLerpVector as inverseLerpVector, __webpack_exports__isActor as isActor, __webpack_exports__isAddedComponent as isAddedComponent, __webpack_exports__isComponentCtor as isComponentCtor, __webpack_exports__isLoaderConstructor as isLoaderConstructor, __webpack_exports__isMoveByOptions as isMoveByOptions, __webpack_exports__isMoveToOptions as isMoveToOptions, __webpack_exports__isRemovedComponent as isRemovedComponent, __webpack_exports__isRotateByOptions as isRotateByOptions, __webpack_exports__isRotateToOptions as isRotateToOptions, __webpack_exports__isScaleByOptions as isScaleByOptions, __webpack_exports__isScaleToOptions as isScaleToOptions, __webpack_exports__isSceneConstructor as isSceneConstructor, __webpack_exports__isScreenElement as isScreenElement, __webpack_exports__isSystemConstructor as isSystemConstructor, __webpack_exports__lerp as lerp, __webpack_exports__lerpAngle as lerpAngle, __webpack_exports__lerpVector as lerpVector, __webpack_exports__maxMessages as maxMessages, __webpack_exports__nextActionId as nextActionId, __webpack_exports__obsolete as obsolete, __webpack_exports__parseImageFiltering as parseImageFiltering, __webpack_exports__parseImageWrapping as parseImageWrapping, __webpack_exports__pixelSnapEpsilon as pixelSnapEpsilon, __webpack_exports__randomInRange as randomInRange, __webpack_exports__randomIntInRange as randomIntInRange, __webpack_exports__range as range, __webpack_exports__remap as remap, __webpack_exports__remapVector as remapVector, __webpack_exports__resetObsoleteCounter as resetObsoleteCounter, __webpack_exports__sign as sign, __webpack_exports__toDegrees as toDegrees, __webpack_exports__toRadians as toRadians, __webpack_exports__vec as vec, __webpack_exports__webgl as webgl };\n/******/ \n\n//# sourceMappingURL=excalibur.development.js.map","import { ImageFiltering, ImageSource, Loader } from \"excalibur\";\r\nimport { LdtkResource } from '@excalibur-ldtk';\r\n\r\nexport const Resources = {\r\n HeroSpriteSheetPng: new ImageSource('./Solaria Demo Pack Update 03/Solaria Demo Pack Update 03/16x16/Sprites/Hero 01.png'),\r\n LdtkResource: new LdtkResource('./spacing-padding/spacing-padding.ldtk', {\r\n useTilemapCameraStrategy: true,\r\n useMapBackgroundColor: true,\r\n }),\r\n LdtkAutoTile: new LdtkResource('./autotile/autotile.ldtk', {\r\n useMapBackgroundColor: true,\r\n }),\r\n LdtkPureAutoTile: new LdtkResource('./dsml1/dsml1.ldtk', {\r\n useMapBackgroundColor: true,\r\n })\r\n} as const;\r\n\r\n\r\nexport const loader = new Loader();\r\nfor (let resource of Object.values(Resources)) {\r\n loader.addResource(resource);\r\n}","import { Actor, Entity, Vector, vec } from \"excalibur\";\r\nimport { LdtkResource } from \"./ldtk-resource\";\r\nimport { LdtkEntityInstance, LdtkLayerInstance } from \"./types\";\r\nimport { Level } from \"./level\";\r\n\r\nexport class EntityLayer {\r\n public worldPos: Vector;\r\n public offset: Vector;\r\n public entities: Entity[] = [];\r\n public ldtkToEntity = new Map();\r\n public entityToLdtk = new Map();\r\n constructor(level: Level, public readonly ldtkLayer: LdtkLayerInstance, private resource: LdtkResource, public readonly order: number) {\r\n this.worldPos = vec(level.ldtkLevel.worldX, level.ldtkLevel.worldY);\r\n this.offset = vec(ldtkLayer.__pxTotalOffsetX, ldtkLayer.__pxTotalOffsetY);\r\n if (ldtkLayer.entityInstances) {\r\n for (let entity of ldtkLayer.entityInstances) {\r\n const entityMetadata = resource.projectMetadata.defs.entities.find(e => {\r\n return e.identifier === entity.__identifier\r\n });\r\n \r\n if (resource.factories.has(entity.__identifier)) {\r\n const factory = resource.factories.get(entity.__identifier);\r\n if (factory) {\r\n const newEntity = factory({\r\n type: entity.__identifier,\r\n worldPos: vec(entity.px[0], entity.px[1]).add(this.worldPos.add(this.offset)),\r\n entity,\r\n definition: entityMetadata,\r\n layer: this,\r\n });\r\n if (newEntity) {\r\n this.entities.push(newEntity);\r\n this.ldtkToEntity.set(entity, newEntity);\r\n this.entityToLdtk.set(newEntity, entity);\r\n }\r\n }\r\n } else {\r\n const actor = new Actor({\r\n name: entity.__identifier,\r\n pos: vec(entity.px[0], entity.px[1]).add(this.worldPos.add(this.offset)),\r\n width: entity.width,\r\n height: entity.height,\r\n anchor: vec(entityMetadata?.pivotX ?? 0, entityMetadata?.pivotY ?? 0),\r\n z: order\r\n });\r\n if (entity.__tile) {\r\n const ts = resource.tilesets.get(entity.__tile.tilesetUid);\r\n if (ts) {\r\n const tsxCoord = Math.floor(entity.__tile.x / entity.__tile.w);\r\n const tsyCoord = Math.floor(entity.__tile.y / entity.__tile.h);\r\n const sprite = ts.spritesheet.getSprite(tsxCoord, tsyCoord);\r\n if (sprite) {\r\n actor.graphics.use(sprite);\r\n }\r\n }\r\n }\r\n this.entities.push(actor);\r\n this.ldtkToEntity.set(entity, actor);\r\n this.entityToLdtk.set(actor, entity);\r\n }\r\n }\r\n }\r\n }\r\n\r\n runFactories() {\r\n for (let entity of this.ldtkLayer.entityInstances) {\r\n const factory = this.resource.factories.get(entity.__identifier);\r\n \r\n if (!factory) { continue }\r\n\r\n const entityMetadata = this.resource.projectMetadata.defs.entities.find(e => {\r\n return e.identifier === entity.__identifier\r\n });\r\n\r\n const newEntity = factory({\r\n type: entity.__identifier,\r\n worldPos: vec(entity.px[0], entity.px[1]).add(this.worldPos.add(this.offset)),\r\n entity,\r\n definition: entityMetadata,\r\n layer: this,\r\n });\r\n\r\n if (newEntity) {\r\n // remove pre-existing entity (e.g. the default actor created for the entity placement)\r\n const preExisting = this.ldtkToEntity.get(entity);\r\n if (preExisting) {\r\n const index = this.entities.indexOf(preExisting);\r\n if (index > -1) {\r\n this.entities.splice(index, 1);\r\n this.ldtkToEntity.delete(entity);\r\n this.entityToLdtk.delete(preExisting);\r\n }\r\n }\r\n \r\n this.entities.push(newEntity);\r\n this.ldtkToEntity.set(entity, newEntity);\r\n this.entityToLdtk.set(newEntity, entity);\r\n }\r\n }\r\n }\r\n\r\n\r\n getEntitiesByIdentifier(identifier: string): Entity[] {\r\n const ldtkEntities = this.getLdtkEntitiesByIdentifier(identifier);\r\n let results: Entity[] = [];\r\n for (const ldtk of ldtkEntities) {\r\n const maybeEntity = this.ldtkToEntity.get(ldtk);\r\n if (maybeEntity) {\r\n results.push(maybeEntity);\r\n }\r\n }\r\n return results;\r\n }\r\n\r\n getEntitiesByField(fieldIdentifier: string, value?: any): Entity[] {\r\n const ldtkEntities = this.getLdtkEntitiesByField(fieldIdentifier, value);\r\n let results: Entity[] = [];\r\n for (const ldtk of ldtkEntities) {\r\n const maybeEntity = this.ldtkToEntity.get(ldtk);\r\n if (maybeEntity) {\r\n results.push(maybeEntity);\r\n }\r\n }\r\n return results;\r\n }\r\n\r\n /**\r\n * Search layer for entities that match an identifier (case insensitive)\r\n * @param identifier \r\n * @returns \r\n */\r\n getLdtkEntitiesByIdentifier(identifier: string): LdtkEntityInstance[] {\r\n return this.ldtkLayer.entityInstances.filter(e => e.__identifier.toLocaleLowerCase() === identifier.toLowerCase());\r\n }\r\n\r\n /**\r\n * Search layer for entities that match a field and optionally a value (both case insensitive)\r\n * @param fieldIdentifier \r\n * @param value\r\n */\r\n getLdtkEntitiesByField(fieldIdentifier: string, value?: any): LdtkEntityInstance[] {\r\n return this.ldtkLayer.entityInstances.filter(e => {\r\n if (value !== undefined) {\r\n let normalizedValue = value;\r\n if (typeof value === 'string') {\r\n normalizedValue = value.toLocaleLowerCase();\r\n }\r\n\r\n const field = e.fieldInstances.find(f => f.__identifier.toLocaleLowerCase() === fieldIdentifier.toLocaleLowerCase());\r\n if (field) {\r\n return field.__value === normalizedValue;\r\n }\r\n return false;\r\n } else {\r\n return !!e.fieldInstances.find(f => f.__identifier.toLocaleLowerCase() === fieldIdentifier.toLocaleLowerCase());\r\n }\r\n });\r\n }\r\n}","\r\n\r\nexport type FileLoader = (path: string, contentType: 'json' | 'xml') => Promise;\r\n\r\nexport const FetchLoader: FileLoader = async (path: string, contentType: 'json' | 'xml') => {\r\n const response = await fetch(path);\r\n switch(contentType.toLowerCase()) {\r\n case 'xml': return await response.text();\r\n case 'json': return await response.json();\r\n default: return await response.text();\r\n }\r\n}","\r\nexport * from './ldtk-resource';\r\nexport * from './entity-layer';\r\nexport * from './file-loader';\r\nexport * from './intgrid-layer';\r\nexport * from './level-resource';\r\nexport * from './level';\r\nexport * from './loader-cache';\r\nexport * from './path-util';\r\nexport * from './tile-layer';\r\nexport * from './tileset';\r\nexport * from './types';","import { GraphicsComponent, TileMap, Vector, vec } from \"excalibur\";\r\nimport { LdtkLayerInstance } from \"./types\";\r\nimport { LdtkResource } from \"./ldtk-resource\";\r\nimport { Level } from \"./level\";\r\nimport { Tileset } from \"./tileset\";\r\n\r\nexport class IntGridLayer {\r\n\r\n public ldtkLayer: LdtkLayerInstance;\r\n public worldPos: Vector;\r\n public offset: Vector;\r\n public tilemap!: TileMap;\r\n public tileset?: Tileset;\r\n\r\n constructor(level: Level, ldtkLayer: LdtkLayerInstance, resource: LdtkResource, public readonly order: number) {\r\n this.worldPos = vec(level.ldtkLevel.worldX, level.ldtkLevel.worldY);\r\n this.offset = vec(ldtkLayer.__pxTotalOffsetX, ldtkLayer.__pxTotalOffsetY);\r\n this.ldtkLayer = ldtkLayer;\r\n if (ldtkLayer.intGridCsv.length || ldtkLayer.autoLayerTiles.length) {\r\n\r\n const rows = ldtkLayer.__cHei;\r\n const columns = ldtkLayer.__cWid;\r\n this.tilemap = new TileMap({\r\n name: ldtkLayer.__identifier,\r\n pos: this.worldPos.add(this.offset),\r\n tileWidth: ldtkLayer.__gridSize,\r\n tileHeight: ldtkLayer.__gridSize,\r\n rows,\r\n columns,\r\n });\r\n this.tilemap.z = order;\r\n const graphics = this.tilemap.get(GraphicsComponent);\r\n graphics.isVisible = ldtkLayer.visible;\r\n\r\n // find the intgrid metadata\r\n const layerMetadata = resource.projectMetadata.defs.layers.find(l => {\r\n return ldtkLayer.__identifier === l.identifier;\r\n });\r\n\r\n if (layerMetadata) {\r\n const solidValue = layerMetadata.intGridValues.find(val => {\r\n return val?.identifier?.toLocaleLowerCase() === 'solid';\r\n });\r\n\r\n for (let i = 0; i < ldtkLayer.intGridCsv.length; i++) {\r\n const xCoord = i % columns;\r\n const yCoord = Math.floor(i / columns);\r\n const tile = this.tilemap.getTile(xCoord, yCoord);\r\n if (solidValue && ldtkLayer.intGridCsv[i] === solidValue.value) {\r\n tile!.solid = true;\r\n }\r\n\r\n // TODO might be a mistake to treat 1 as solid if there isn't a labelled solid\r\n if (!solidValue && ldtkLayer.intGridCsv[i] === 1) {\r\n tile!.solid = true;\r\n }\r\n }\r\n\r\n if (ldtkLayer.__tilesetDefUid) {\r\n this.tileset = resource.tilesets.get(ldtkLayer.__tilesetDefUid);\r\n for (let i = 0; i < ldtkLayer.autoLayerTiles.length; i++) {\r\n const tile = ldtkLayer.autoLayerTiles[i];\r\n const xCoord = Math.floor(tile.px[0] / ldtkLayer.__gridSize);\r\n const yCoord = Math.floor(tile.px[1] / ldtkLayer.__gridSize);\r\n const exTile = this.tilemap.getTile(xCoord, yCoord);\r\n if (exTile && this.tileset) {\r\n const tsxCoord = Math.floor((tile.src[0] - (this.tileset.ldtkTileset.padding ?? 0)) / (this.tileset.ldtkTileset.tileGridSize + (this.tileset.ldtkTileset.spacing ?? 0)));\r\n const tsyCoord = Math.floor((tile.src[1] - (this.tileset.ldtkTileset.padding ?? 0)) / (this.tileset.ldtkTileset.tileGridSize + (this.tileset.ldtkTileset.spacing ?? 0)));\r\n // Bit 0 toggles x flip\r\n // Bit 1 toggles 1 flip\r\n // Examples: f=0 (no flip), f=1 (X flip only), f=2 (Y flip only), f=3 (both flips)\r\n const flipHorizontal = !!(tile.f & 0b01);\r\n const flipVertical = !!(tile.f & 0b10);\r\n let sprite = this.tileset.spritesheet.getSprite(tsxCoord, tsyCoord);\r\n if (flipHorizontal || flipVertical) {\r\n sprite = sprite.clone();\r\n sprite.flipHorizontal = flipHorizontal;\r\n sprite.flipVertical = flipVertical;\r\n }\r\n if (sprite) {\r\n exTile!.addGraphic(sprite);\r\n } else {\r\n console.error('Could not find sprite in LDtk spritesheet at', tsxCoord, tsyCoord);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}","import { TileLayer } from './tile-layer';\r\nimport { PathMap, pathRelativeToBase } from './path-util';\r\nimport { FetchLoader, FileLoader } from './file-loader';\r\nimport { LdtkEntityDefinition, LdtkEntityInstance, LdtkProjectMetadata } from './types';\r\nimport { compare } from 'compare-versions';\r\nimport { LoaderCache } from './loader-cache';\r\nimport { BoundingBox, Entity, ImageSource, Loadable, Scene, TransformComponent, Vector, vec } from 'excalibur';\r\nimport { LevelResource } from './level-resource';\r\nimport { Tileset } from './tileset';\r\nimport { Level } from './level';\r\nimport { EntityLayer } from './entity-layer';\r\nimport { IntGridLayer } from './intgrid-layer';\r\n\r\nexport interface AddToSceneOptions {\r\n /**\r\n * Optionally set the position to place the levels\r\n * \r\n * Default is vec(0, 0)\r\n */\r\n pos?: Vector;\r\n /**\r\n * Optionally add only specific levels to the scene\r\n * \r\n * Default includes all levels\r\n */\r\n levelFilter?: string[];\r\n\r\n /**\r\n * Optionally use the level world offsets, this is useful if your levels are arranged the way you want them\r\n * to appear in your game.\r\n * \r\n * Default is true\r\n */\r\n useLevelOffsets?: boolean;\r\n}\r\n\r\nexport interface FactoryProps {\r\n /**\r\n * Excalibur world position\r\n */\r\n worldPos: Vector;\r\n /**\r\n * LDtk name in UI\r\n */\r\n name?: string;\r\n /**\r\n * LDtk type in UI\r\n */\r\n type: string;\r\n /**\r\n * LDtk entity\r\n */\r\n entity: LdtkEntityInstance;\r\n /**\r\n * LDtk entity metadata\r\n */\r\n definition: LdtkEntityDefinition | undefined;\r\n /**\r\n * Layer\r\n */\r\n layer: EntityLayer;\r\n}\r\n\r\nexport interface LdtkResourceOptions {\r\n /**\r\n * Add a starting z index for the layers to use. By default the layers count up from 0.\r\n *\r\n * If you'd like to manually override a z-index on a layer use the 'zindex' custom property on a layer.\r\n */\r\n startZIndex?: number;\r\n\r\n /**\r\n * Default true. If false, only tilemap will be parsed and displayed, it's up to you to wire up any excalibur behavior.\r\n * Automatically wires excalibur to the following\r\n * * Wire up current scene camera\r\n *\r\n * Read more at excaliburjs.com!\r\n */\r\n useExcaliburWiring?: boolean;\r\n\r\n /**\r\n * Sets excalibur's background color to match the LDtk map\r\n */\r\n useMapBackgroundColor?: boolean;\r\n\r\n /**\r\n * The pathMap helps work around odd things bundlers do with static files by providing a way to redirect the original\r\n * source paths in the LDtk files to new locations.\r\n *\r\n * When the LDtk resource comes across something that matches `path`, it will use the output string instead.\r\n * \r\n * Example:\r\n * ```typescript\r\n * const newResource = new LdtkResource('./example-city.ldtk', {\r\n * pathMap: [\r\n * // If the \"path\" is included in the source path, the output will be used\r\n * { path: 'cone.png', output: '/static/assets/cone.png' },\r\n * // Regex matching with special [match] in output string that is replaced with the first match from the regex\r\n * { path: /(.*\\..*$)/, output: '/static/assets/[match]'}\r\n * ]\r\n * }\r\n * ```\r\n */\r\n pathMap?: PathMap;\r\n\r\n /**\r\n * Optionally provide a custom file loader implementation instead of using the built in ajax (fetch) loader\r\n * that takes a path and returns file data\r\n * \r\n */\r\n fileLoader?: FileLoader;\r\n\r\n /**\r\n * By default `true`, means LDtk files must pass the plugins Typed parse pass.\r\n *\r\n * If you have something that the LDtk plugin does not expect, you can set this to false and it will do it's best\r\n * to parse the LDtk source map file.\r\n */\r\n strict?: boolean;\r\n\r\n /**\r\n * Plugin will operate in headless mode and skip all graphics related\r\n * excalibur items including creating ImageSource's for LDtk items.\r\n *\r\n * Default false.\r\n */\r\n headless?: boolean;\r\n\r\n /**\r\n * Keeps the camera viewport within the bounds of the TileMap, uses the first tile layer's bounds.\r\n *\r\n * Defaults true, if false the camera will use the layer bounds to keep the camera from showing the background.\r\n */\r\n useTilemapCameraStrategy?: boolean;\r\n\r\n /**\r\n * Configure custom Actor/Entity factory functions to construct Actors/Entities\r\n * given a LDtk type name\r\n */\r\n entityIdentifierFactories?: Record Entity | undefined>;\r\n}\r\n\r\nexport class LdtkResource implements Loadable {\r\n public static supportedLdtkVersion = \"1.5.3\";\r\n public projectMetadata!: LdtkProjectMetadata;\r\n data!: LdtkProjectMetadata;\r\n\r\n\r\n public tilesets = new Map();\r\n public levels = new Map();\r\n public levelsByName = new Map();\r\n public factories = new Map Entity | undefined>();\r\n public fileLoader: FileLoader = FetchLoader;\r\n public pathMap: PathMap | undefined;\r\n\r\n private _imageLoader = new LoaderCache(ImageSource);\r\n private _levelLoader = new LoaderCache(LevelResource);\r\n\r\n\r\n public readonly startZIndex: number = 0;\r\n public readonly textQuality: number = 4;\r\n public readonly useExcaliburWiring: boolean = true;\r\n public readonly useMapBackgroundColor: boolean = false;\r\n public readonly useTilemapCameraStrategy: boolean = false;\r\n public readonly headless: boolean = false;\r\n public readonly strict: boolean = true;\r\n\r\n constructor(public readonly path: string, options?: LdtkResourceOptions) {\r\n const {\r\n useExcaliburWiring,\r\n useTilemapCameraStrategy,\r\n entityIdentifierFactories,\r\n pathMap,\r\n useMapBackgroundColor,\r\n fileLoader,\r\n strict,\r\n headless,\r\n startZIndex\r\n } = { ...options };\r\n this.strict = strict ?? this.strict;\r\n this.headless = headless ?? this.headless;\r\n this.useExcaliburWiring = useExcaliburWiring ?? this.useExcaliburWiring;\r\n this.useTilemapCameraStrategy = useTilemapCameraStrategy ?? this.useTilemapCameraStrategy;\r\n this.useMapBackgroundColor = useMapBackgroundColor ?? this.useMapBackgroundColor;\r\n this.startZIndex = startZIndex ?? this.startZIndex;\r\n this.fileLoader = fileLoader ?? this.fileLoader;\r\n this.pathMap = pathMap;\r\n for (const key in entityIdentifierFactories) {\r\n this.registerEntityIdentifierFactory(key, entityIdentifierFactories[key]);\r\n }\r\n\r\n }\r\n async load(): Promise {\r\n const data = await this.fileLoader(this.path, 'json');\r\n if (this.strict) {\r\n try {\r\n this.projectMetadata = LdtkProjectMetadata.parse(data);\r\n } catch (e) {\r\n console.error(`Could not parse LDtk map from location ${this.path}.\\nExcalibur only supports the latest version of LDtk formats as of the plugin's release.`);\r\n console.error(`Is your map file corrupted or being interpreted as the wrong type?`)\r\n throw e;\r\n }\r\n } else {\r\n this.projectMetadata = data as LdtkProjectMetadata;\r\n }\r\n\r\n if (compare(LdtkResource.supportedLdtkVersion, this.projectMetadata.jsonVersion ?? '0.0.0', \">\")) {\r\n console.warn(`The excalibur ldtk plugin officially supports ${LdtkResource.supportedLdtkVersion}+, the current map has LDtk version ${this.projectMetadata.jsonVersion}`)\r\n }\r\n\r\n // iterate through the defs\r\n // load the tilesets\r\n const imagesToLoad: Promise[] = [];\r\n for (let tileset of this.projectMetadata.defs.tilesets) {\r\n if (tileset.relPath) {\r\n const imagePath = pathRelativeToBase(this.path, tileset.relPath, this.pathMap);\r\n const image = this._imageLoader.getOrAdd(imagePath);\r\n const friendlyTileset = new Tileset({\r\n image,\r\n ldtkTileset: tileset\r\n });\r\n this.tilesets.set(tileset.uid, friendlyTileset);\r\n } else {\r\n if (tileset.identifier !== 'Internal_Icons') {\r\n console.warn(`No tileset image provided for ${tileset.identifier}`);\r\n }\r\n }\r\n }\r\n\r\n // iterate through the levels\r\n // load the level metadata\r\n for (let level of this.projectMetadata.levels) {\r\n if (level.externalRelPath) {\r\n // external levels\r\n const levelPath = pathRelativeToBase(this.path, level.externalRelPath, this.pathMap);\r\n this._levelLoader.getOrAdd(levelPath, this, {\r\n headless: this.headless,\r\n strict: this.strict,\r\n fileLoader: this.fileLoader,\r\n imageLoader: this._imageLoader,\r\n pathMap: this.pathMap\r\n });\r\n } else {\r\n // embedded levels\r\n const friendlyLevel = new Level(level, this);\r\n this.levels.set(level.uid, friendlyLevel);\r\n this.levelsByName.set(level.identifier.toLowerCase(), friendlyLevel);\r\n }\r\n }\r\n\r\n await Promise.all([this._imageLoader.load(), this._levelLoader.load()]);\r\n this._levelLoader.values().forEach(level => {\r\n this.levels.set(level.data.ldtkLevel.uid, level.data);\r\n this.levelsByName.set(level.data.ldtkLevel.identifier.toLowerCase(), level.data);\r\n });\r\n\r\n return this.data = this.projectMetadata;\r\n };\r\n\r\n isLoaded(): boolean {\r\n return !!this.data;\r\n }\r\n\r\n registerEntityIdentifierFactory(ldtkEntityIdentifier: string, factory: (props: FactoryProps) => Entity | undefined): void {\r\n this.factories.set(ldtkEntityIdentifier, factory);\r\n }\r\n\r\n registerEntityIdentifierFactories(factories: Record Entity | undefined>): void {\r\n for (const key in factories) {\r\n this.registerEntityIdentifierFactory(key, factories[key]);\r\n }\r\n }\r\n\r\n /**\r\n * Get a level by identifier\r\n * @param identifier \r\n * @returns \r\n */\r\n getLevel(identifier: string): Level | undefined {\r\n return this.levelsByName.get(identifier.toLowerCase());\r\n }\r\n\r\n /**\r\n * Get the entity layers, optionally provide a level identifier to filter to\r\n * @param levelIdentifier \r\n */\r\n getEntityLayers(levelIdentifier?: string): EntityLayer[] {\r\n let results: EntityLayer[] = [];\r\n if (levelIdentifier) {\r\n const level = this.getLevel(levelIdentifier);\r\n if (level) {\r\n for (let layer of level.layers) {\r\n if (layer instanceof EntityLayer) {\r\n results.push(layer);\r\n }\r\n }\r\n }\r\n } else {\r\n for (const level of this.levels.values()) {\r\n for (let layer of level.layers) {\r\n if (layer instanceof EntityLayer) {\r\n results.push(layer);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return results\r\n }\r\n\r\n getTileLayers(identifier?: string): TileLayer[] {\r\n let results: TileLayer[] = [];\r\n if (identifier) {\r\n const level = this.getLevel(identifier);\r\n if (level) {\r\n for (let layer of level.layers) {\r\n if (layer instanceof TileLayer) {\r\n results.push(layer);\r\n }\r\n }\r\n }\r\n } else {\r\n for (const level of this.levels.values()) {\r\n for (let layer of level.layers) {\r\n if (layer instanceof TileLayer) {\r\n results.push(layer);\r\n }\r\n }\r\n }\r\n }\r\n return results;\r\n }\r\n\r\n getIntGridLayers(identifier?: string): IntGridLayer[] {\r\n let results: IntGridLayer[] = [];\r\n if (identifier) {\r\n const level = this.getLevel(identifier);\r\n if (level) {\r\n for (let layer of level.layers) {\r\n if (layer instanceof IntGridLayer) {\r\n results.push(layer);\r\n }\r\n }\r\n }\r\n } else {\r\n for (const level of this.levels.values()) {\r\n for (let layer of level.layers) {\r\n if (layer instanceof IntGridLayer) {\r\n results.push(layer);\r\n }\r\n }\r\n }\r\n }\r\n return results;\r\n }\r\n\r\n /**\r\n * Search layer for entities that match an identifier (case insensitive)\r\n * @param identifier \r\n * @returns \r\n */\r\n getLdtkEntitiesByIdentifier(identifier: string, levels?: string[]): LdtkEntityInstance[] {\r\n let results: LdtkEntityInstance[] = [];\r\n const levelsToSearch = levels ?? Array.from(this.levels.values()).map(l => l.ldtkLevel.identifier);\r\n for (const level of levelsToSearch) {\r\n const layers = this.getEntityLayers(level);\r\n for (let layer of layers) {\r\n results = results.concat(layer.getLdtkEntitiesByIdentifier(identifier));\r\n }\r\n }\r\n return results;\r\n }\r\n\r\n /**\r\n * Search levels for ldtk entities that match a field and optionally a value (both case insensitive)\r\n * @param fieldIdentifier \r\n * @param value\r\n */\r\n getLdtkEntitiesByField(fieldIdentifier: string, value?: any, levels?: string[]): LdtkEntityInstance[] {\r\n let results: LdtkEntityInstance[] = [];\r\n const levelsToSearch = levels ?? Array.from(this.levels.values()).map(l => l.ldtkLevel.identifier);\r\n for (const level of levelsToSearch) {\r\n const layers = this.getEntityLayers(level);\r\n for (let layer of layers) {\r\n results = results.concat(layer.getLdtkEntitiesByField(fieldIdentifier, value));\r\n }\r\n }\r\n return results;\r\n }\r\n\r\n /**\r\n * Search levels for excalibur entities that match an identifier (case insensitive)\r\n * @param identifier\r\n * @param levels\r\n */\r\n getEntitiesByIdentifier(identifier: string, levels?: string[]): Entity[] {\r\n let results: Entity[] = [];\r\n const levelsToSearch = levels ?? Array.from(this.levels.values()).map(l => l.ldtkLevel.identifier);\r\n for (const level of levelsToSearch) {\r\n const layers = this.getEntityLayers(level);\r\n for (let layer of layers) {\r\n results = results.concat(layer.getEntitiesByIdentifier(identifier));\r\n }\r\n }\r\n return results;\r\n }\r\n\r\n /**\r\n * Search levels for excalibur entities that match a field and optionally a value (both case insensitive)\r\n * @param fieldIdentifier\r\n * @param value\r\n * @param levels\r\n */\r\n getEntitiesByField(fieldIdentifier: string, value?: any, levels?: string[]): Entity[] {\r\n let results: Entity[] = [];\r\n const levelsToSearch = levels ?? Array.from(this.levels.values()).map(l => l.ldtkLevel.identifier);\r\n for (const level of levelsToSearch) {\r\n const layers = this.getEntityLayers(level);\r\n for (let layer of layers) {\r\n results = results.concat(layer.getEntitiesByField(fieldIdentifier, value));\r\n }\r\n }\r\n return results;\r\n }\r\n\r\n /**\r\n * Get the level bounds given a list of level identifiers (case insensitive)\r\n * @param levels\r\n */\r\n getLevelBounds(levels?: string[]): BoundingBox {\r\n levels = levels ?? Array.from(this.levelsByName.keys());\r\n let bounds: BoundingBox | null = null;\r\n for (const level of this.levels.values()) {\r\n if (!levels.includes(level.ldtkLevel.identifier)) {\r\n continue;\r\n }\r\n const firstTileLayer = this.getTileLayers(level.ldtkLevel.identifier)[0];\r\n if (firstTileLayer) {\r\n const tileBounds = BoundingBox.fromDimension(\r\n firstTileLayer.tilemap.tileWidth * firstTileLayer.tilemap.columns,\r\n firstTileLayer.tilemap.tileHeight * firstTileLayer.tilemap.rows,\r\n Vector.Zero,\r\n firstTileLayer.tilemap.pos);\r\n if (!bounds) {\r\n bounds = tileBounds;\r\n } else {\r\n bounds = bounds.combine(tileBounds);\r\n }\r\n }\r\n }\r\n return bounds ?? new BoundingBox();\r\n }\r\n\r\n addToScene(scene: Scene, options?: AddToSceneOptions) {\r\n const { pos, useLevelOffsets } = {pos: vec(0, 0), useLevelOffsets: true, ...options};\r\n\r\n \r\n for (let [id, level] of this.levels.entries()) {\r\n if (options?.levelFilter?.length) {\r\n if (!options.levelFilter.includes(level.ldtkLevel.identifier)) {\r\n continue;\r\n }\r\n }\r\n for (let layer of level.layers) {\r\n if (layer instanceof TileLayer || layer instanceof IntGridLayer) {\r\n layer.tilemap.pos = layer.tilemap.pos.add(pos);\r\n if (!useLevelOffsets) {\r\n layer.tilemap.pos = layer.tilemap.pos.sub(layer.worldPos);\r\n }\r\n scene.add(layer.tilemap)\r\n } else {\r\n layer.runFactories()\r\n for (let entity of layer.entities) {\r\n const tx = entity.get(TransformComponent);\r\n if (tx) {\r\n tx.pos = tx.pos.add(pos);\r\n if (!useLevelOffsets) {\r\n tx.pos = tx.pos.sub(layer.worldPos);\r\n }\r\n }\r\n scene.add(entity);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if(this.useExcaliburWiring) {\r\n const camera = this.getLdtkEntitiesByField('camera', true)[0];\r\n if (camera) {\r\n scene.camera.pos = vec(camera.px[0], camera.px[0]);\r\n const zoom = camera.fieldInstances.find(f => f.__identifier.toLocaleLowerCase() === 'zoom');\r\n if (zoom) {\r\n scene.camera.zoom = +zoom.__value;\r\n }\r\n }\r\n }\r\n\r\n if (this.useTilemapCameraStrategy) {\r\n let bounds = this.getLevelBounds(options?.levelFilter);\r\n scene.camera.strategy.limitCameraBounds(bounds);\r\n }\r\n\r\n if (this.useMapBackgroundColor) {\r\n for (let [id, level] of this.levels.entries()) {\r\n if (options?.levelFilter?.length) {\r\n if (!options.levelFilter.includes(level.ldtkLevel.identifier)) {\r\n continue;\r\n }\r\n }\r\n scene.backgroundColor = level.backgroundColor;\r\n break;\r\n }\r\n }\r\n\r\n\r\n }\r\n}","import { ImageSource, Loadable } from \"excalibur\";\r\nimport { PathMap } from \"./path-util\";\r\nimport { LoaderCache } from \"./loader-cache\";\r\nimport { FetchLoader, FileLoader } from \"./file-loader\";\r\nimport { Level } from \"./level\";\r\nimport { LdtkLevel } from \"./types\";\r\nimport { LdtkResource } from \"./ldtk-resource\";\r\n\r\nexport interface LevelResourceOptions {\r\n headless?: boolean;\r\n strict?: boolean;\r\n fileLoader?: FileLoader;\r\n imageLoader?: LoaderCache;\r\n pathMap?: PathMap;\r\n}\r\n\r\n/**\r\n * Loads LDtk levels that are stored in separate files\r\n */\r\nexport class LevelResource implements Loadable {\r\n private fileLoader: FileLoader = FetchLoader;\r\n private imageLoader: LoaderCache;\r\n private pathMap?: PathMap;\r\n public readonly strict: boolean = true;\r\n public readonly headless: boolean = false;\r\n constructor(public readonly path: string, public readonly resource: LdtkResource, options?: LevelResourceOptions) {\r\n const { headless, strict, fileLoader, imageLoader, pathMap } = { ...options };\r\n this.fileLoader = fileLoader ?? this.fileLoader;\r\n this.strict = strict ?? this.strict;\r\n this.headless = headless ?? this.headless;\r\n this.imageLoader = imageLoader ?? new LoaderCache(ImageSource);\r\n this.pathMap = pathMap ?? this.pathMap;\r\n }\r\n data!: Level;\r\n async load(): Promise {\r\n const data = await this.fileLoader(this.path, 'json');\r\n let level: LdtkLevel;\r\n if (this.strict) {\r\n try {\r\n level = LdtkLevel.parse(data)\r\n } catch (e) {\r\n console.error(`Could not parse LDtk level data at ${this.path} are you sure a level is there and not corrupt?`);\r\n throw e;\r\n }\r\n } else {\r\n level = data as LdtkLevel;\r\n }\r\n return this.data = new Level(level, this.resource);\r\n }\r\n isLoaded(): boolean {\r\n return !!this.data;\r\n }\r\n\r\n}","import { Color } from \"excalibur\";\r\nimport { EntityLayer } from \"./entity-layer\";\r\nimport { IntGridLayer } from \"./intgrid-layer\";\r\nimport { LdtkResource } from \"./ldtk-resource\";\r\nimport { TileLayer } from \"./tile-layer\";\r\nimport { LdtkLevel } from \"./types\";\r\n\r\nexport class Level {\r\n\r\n public backgroundColor?: Color;\r\n public layers: (TileLayer | IntGridLayer | EntityLayer)[] = []; \r\n\r\n constructor(public ldtkLevel: LdtkLevel, public resource: LdtkResource) {\r\n if (ldtkLevel.__bgColor) {\r\n this.backgroundColor = Color.fromHex(ldtkLevel.__bgColor);\r\n }\r\n if (ldtkLevel.layerInstances) {\r\n let order = resource.startZIndex;\r\n let layers = ldtkLevel.layerInstances.slice().reverse();\r\n for (let layer of layers) {\r\n if (layer.entityInstances?.length !== 0) {\r\n this.layers.push(new EntityLayer(this, layer, resource, order));\r\n }\r\n\r\n if (layer.gridTiles?.length !== 0) {\r\n this.layers.push(new TileLayer(this, layer, resource, order));\r\n }\r\n\r\n // Includes standard IntGrid, IntGrid w/ AutoTile & AutoTile layers\r\n if (layer.intGridCsv?.length !== 0 || layer.autoLayerTiles?.length !== 0) {\r\n this.layers.push(new IntGridLayer(this, layer, resource, order));\r\n }\r\n order++;\r\n }\r\n }\r\n }\r\n}","export interface CanLoad {\r\n load(): Promise;\r\n }\r\n \r\n /**\r\n * Read through cache for loadables\r\n */\r\n export class LoaderCache {\r\n private _loaded = false;\r\n cache = new Map();\r\n \r\n constructor(public readonly type: new (...args: any[]) => T){}\r\n \r\n getOrAdd(...args: any[]): T {\r\n let resource = this.cache.get(args.join('+'));\r\n if (resource) {\r\n return resource;\r\n }\r\n \r\n resource = new this.type(...args);\r\n this.cache.set(args.join('+'), resource);\r\n return resource;\r\n }\r\n \r\n values(): T[] {\r\n if (this._loaded) {\r\n return Array.from(this.cache.values());\r\n }\r\n throw new Error(`Read through cache not yet loaded! No values to return!`);\r\n }\r\n \r\n async load() {\r\n const resources = Array.from(this.cache.entries());\r\n const results = await Promise.allSettled(resources.map(i => i[1].load()));\r\n \r\n // Check for errors loading resources\r\n let errored = 0;\r\n for (let i = 0; i < results.length; i++) {\r\n const result = results[i];\r\n if (result.status === 'rejected') {\r\n console.error(`Error loading resource at ${resources[i][0]}, is your pathMap correct? or your LDtk map corrupted?`, result.reason);\r\n errored++;\r\n }\r\n }\r\n if (errored) {\r\n throw new Error(`Error loading ${errored} resources`);\r\n }\r\n this._loaded = true;\r\n }\r\n }","\r\n\r\nexport type PathMap = { path: string | RegExp, output: string }[];\r\n\r\nexport function filenameFromPath(inputPath: string): string {\r\n const filenameExpression = /[^/\\\\&\\?]+\\.\\w{2,4}(?=([\\#\\?&].*$|$))/ig\r\n\r\n const matches = inputPath.match(filenameExpression);\r\n\r\n if (matches) {\r\n const match = matches[0];\r\n return match;\r\n }\r\n\r\n throw new Error(`Could not locate filename from path: ${inputPath}`);\r\n}\r\n\r\nexport function mapPath(inputPath: string, pathMap: PathMap): string {\r\n\r\n for (const { path, output } of pathMap) {\r\n if (typeof path === 'string') {\r\n if (inputPath.includes(path)) {\r\n return output;\r\n }\r\n } else {\r\n const match = inputPath.match(path);\r\n if (match) {\r\n return output.replace('[match]', match[0]);;\r\n }\r\n }\r\n }\r\n return inputPath;\r\n}\r\n\r\nexport function pathInMap(inputPath: string, pathMap?: PathMap): boolean {\r\n if (!pathMap) return false;\r\n for (const { path, output } of pathMap) {\r\n if (typeof path === 'string') {\r\n if (inputPath.includes(path)) {\r\n return true;\r\n }\r\n } else {\r\n const match = inputPath.match(path);\r\n if (match) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n}\r\n\r\n\r\nexport function pathRelativeToBase(basePath: string, relativeToBase: string, pathMap?: PathMap) {\r\n if (pathInMap(relativeToBase, pathMap) && pathMap) {\r\n return mapPath(relativeToBase, pathMap);\r\n }\r\n\r\n // Use absolute path if specified\r\n if (relativeToBase.indexOf('/') === 0) {\r\n return relativeToBase;\r\n }\r\n\r\n const originSplit = basePath.split('/');\r\n const relativeSplit = relativeToBase.split('/');\r\n // if origin path is a file, remove it so it's a directory\r\n if (originSplit[originSplit.length - 1].includes('.')) {\r\n originSplit.pop();\r\n }\r\n return originSplit.concat(relativeSplit).join('/');\r\n}","import { GraphicsComponent, TileMap, Vector, vec } from \"excalibur\";\r\nimport { LdtkResource } from \"./ldtk-resource\";\r\nimport { LdtkLayerInstance } from \"./types\";\r\nimport { Level } from \"./level\";\r\nimport { Tileset } from \"./tileset\";\r\n\r\n\r\nexport class TileLayer {\r\n public ldtkLayer: LdtkLayerInstance;\r\n public worldPos: Vector;\r\n public offset: Vector;\r\n public tilemap: TileMap;\r\n public tileset?: Tileset;\r\n\r\n constructor(level: Level, ldtkLayer: LdtkLayerInstance, resource: LdtkResource, public readonly order: number) {\r\n this.worldPos = vec(level.ldtkLevel.worldX, level.ldtkLevel.worldY);\r\n this.offset = vec(ldtkLayer.__pxTotalOffsetX, ldtkLayer.__pxTotalOffsetY);\r\n this.ldtkLayer = ldtkLayer;\r\n this.tilemap = new TileMap({\r\n name: ldtkLayer.__identifier,\r\n pos: this.worldPos.add(this.offset),\r\n tileWidth: ldtkLayer.__gridSize,\r\n tileHeight: ldtkLayer.__gridSize,\r\n rows: ldtkLayer.__cHei,\r\n columns: ldtkLayer.__cWid,\r\n });\r\n this.tilemap.z = order;\r\n const graphics = this.tilemap.get(GraphicsComponent);\r\n graphics.isVisible = ldtkLayer.visible;\r\n\r\n\r\n if (ldtkLayer.__tilesetDefUid) {\r\n this.tileset = resource.tilesets.get(ldtkLayer.__tilesetDefUid);\r\n for (let tile of ldtkLayer.gridTiles) {\r\n const xCoord = Math.floor(tile.px[0] / ldtkLayer.__gridSize);\r\n const yCoord = Math.floor(tile.px[1] / ldtkLayer.__gridSize);\r\n const exTile = this.tilemap.getTile(xCoord, yCoord);\r\n if (this.tileset) {\r\n const tsxCoord = Math.floor((tile.src[0] - (this.tileset.ldtkTileset.padding ?? 0)) / (this.tileset.ldtkTileset.tileGridSize + (this.tileset.ldtkTileset.spacing ?? 0)));\r\n const tsyCoord = Math.floor((tile.src[1] - (this.tileset.ldtkTileset.padding ?? 0)) / (this.tileset.ldtkTileset.tileGridSize + (this.tileset.ldtkTileset.spacing ?? 0)));\r\n // Bit 0 toggles x flip\r\n // Bit 1 toggles 1 flip\r\n // Examples: f=0 (no flip), f=1 (X flip only), f=2 (Y flip only), f=3 (both flips)\r\n const flipHorizontal = !!(tile.f & 0b01);\r\n const flipVertical = !!(tile.f & 0b10);\r\n let sprite = this.tileset.spritesheet.getSprite(tsxCoord, tsyCoord);\r\n if (flipHorizontal || flipVertical) {\r\n sprite = sprite.clone();\r\n sprite.flipHorizontal = flipHorizontal;\r\n sprite.flipVertical = flipVertical;\r\n }\r\n if (sprite) {\r\n exTile!.addGraphic(sprite);\r\n } else {\r\n console.error('Could not find sprite in LDtk spritesheet at', tsxCoord, tsyCoord);\r\n } \r\n }\r\n } \r\n } else {\r\n console.error('Could not tileset in LDtk', ldtkLayer.__tilesetDefUid, ldtkLayer.__tilesetRelPath);\r\n }\r\n\r\n }\r\n}","import { ImageSource, Sprite, SpriteSheet } from \"excalibur\";\r\nimport { LdtkTilesetDefinition } from \"./types\";\r\n\r\nexport interface TilesetOptions {\r\n image: ImageSource,\r\n ldtkTileset: LdtkTilesetDefinition\r\n}\r\n\r\nexport class Tileset {\r\n public readonly image: ImageSource;\r\n public readonly ldtkTileset: LdtkTilesetDefinition;\r\n public readonly spritesheet: SpriteSheet;\r\n constructor(options: TilesetOptions) {\r\n const {image, ldtkTileset} = options;\r\n this.image = image;\r\n this.ldtkTileset = ldtkTileset;\r\n this.spritesheet = SpriteSheet.fromImageSource({\r\n image,\r\n grid: {\r\n rows: ldtkTileset.pxHei / ldtkTileset.tileGridSize,\r\n columns: ldtkTileset.pxWid / ldtkTileset.tileGridSize,\r\n spriteHeight: ldtkTileset.tileGridSize,\r\n spriteWidth: ldtkTileset.tileGridSize\r\n },\r\n spacing: {\r\n margin: { \r\n x: ldtkTileset.spacing ?? 0,\r\n y: ldtkTileset.spacing ?? 0,\r\n },\r\n originOffset: {\r\n x: ldtkTileset.padding ?? 0,\r\n y: ldtkTileset.padding ?? 0\r\n }\r\n }\r\n });\r\n }\r\n}","import { z } from 'zod';\r\n\r\n\r\n\r\nconst LdtkTilesetRectangle = z.object({\r\n h: z.number(),\r\n tilesetUid: z.number(),\r\n w: z.number(),\r\n x: z.number(),\r\n y: z.number()\r\n});\r\nconst LdtkPixel = z.tuple([z.number(), z.number()]);\r\nconst LdtkFieldInstance = z.object({\r\n __identifier: z.string(),\r\n __tile: LdtkTilesetRectangle.nullable(),\r\n __type: z.string(),//z.union([z.literal('Int'), z.literal('Float'), z.literal('String'), z.literal('Bool'), z.literal('Enum')]), // TODO this might not work with ENUM\r\n __value: z.any(),\r\n defUid: z.number()\r\n})\r\nconst LdtkTileInstance = z.object({\r\n a: z.number(),\r\n f: z.number(), // 2-bit int 0bXY flip\r\n px: LdtkPixel,\r\n src: LdtkPixel,\r\n t: z.number()\r\n});\r\n\r\nexport const LdtkEntityInstance = z.object({\r\n __grid: LdtkPixel,\r\n __identifier: z.string(),\r\n __pivot: LdtkPixel,\r\n __smartColor: z.string(),\r\n __tags: z.array(z.string()),\r\n __tile: LdtkTilesetRectangle.nullable(),\r\n __worldX: z.number().nullable(),\r\n __worldY: z.number().nullable(),\r\n defUid: z.number(),\r\n fieldInstances: z.array(LdtkFieldInstance),\r\n height: z.number(),\r\n iid: z.string(),\r\n px: LdtkPixel,\r\n width: z.number()\r\n});\r\nexport type LdtkEntityInstance = z.infer;\r\n\r\nexport const LdtkLayerInstance = z.object({\r\n __cHei: z.number(),\r\n __cWid: z.number(),\r\n __gridSize: z.number(),\r\n __identifier: z.string(),\r\n __opacity: z.number(),\r\n __pxTotalOffsetX: z.number(),\r\n __pxTotalOffsetY: z.number(),\r\n __tilesetDefUid: z.number().nullable(),\r\n __tilesetRelPath:z.string().nullable(),\r\n __type: z.union([z.literal('IntGrid'), z.literal('Entities'), z.literal('Tiles'), z.literal('AutoLayer')]),\r\n autoLayerTiles: z.array(LdtkTileInstance), // only in auto layers\r\n entityInstances: z.array(LdtkEntityInstance),// only in entity layers\r\n gridTiles: z.array(LdtkTileInstance),\r\n iid: z.string(),\r\n intGridCsv: z.array(z.number()), // __cWid x __cHei, 0 means empty, values start at 1\r\n layerDefUid: z.number(),\r\n levelId: z.number(),\r\n overrideTilesetUid: z.number().nullable(),\r\n pxOffsetX: z.number(),\r\n pxOffsetY: z.number(),\r\n visible: z.boolean()\r\n});\r\nexport type LdtkLayerInstance = z.infer;\r\n\r\nexport const LdtkLevel = z.object({\r\n __bgColor: z.string().nullable(),\r\n bgColor: z.string().nullable(),\r\n __bgPos: z.object({\r\n cropRect: z.array(z.tuple([z.number(), z.number(), z.number(), z.number()])), // cropX, cropY, cropWidth, cropHeight\r\n scale: z.tuple([z.number(), z.number()]),\r\n topLeftPx: LdtkPixel\r\n }).nullable(),\r\n __neighbours: z.array(z.object({\r\n dir: z.union([z.literal('n'), z.literal('s'), z.literal('w'), z.literal('e'), z.literal('ne'), z.literal('nw'), z.literal('se'), z.literal('sw'), z.literal('o'), z.literal('<'), z.literal('>')]),\r\n levelIid: z.string()\r\n })),\r\n bgRelPath: z.string().nullable(),\r\n externalRelPath: z.string().nullable(),\r\n fieldInstances: z.array(LdtkFieldInstance),\r\n identifier: z.string(),\r\n iid: z.string(),\r\n layerInstances: z.array(LdtkLayerInstance).nullable(), // null if the save levels separately is enabled\r\n pxHei: z.number(),\r\n pxWid: z.number(),\r\n uid: z.number(),\r\n worldDepth: z.number(),\r\n worldX: z.number(),\r\n worldY: z.number()\r\n});\r\nexport type LdtkLevel = z.infer;\r\n\r\nconst LdtkWorld = z.object({\r\n identifier: z.string(),\r\n iid: z.string(),\r\n levels: z.array(LdtkLevel),\r\n worldGridHeight:z.number(),\r\n worldGridWidth: z.number(),\r\n // TODO is this a typo Vania?\r\n worldLayout: z.union([z.literal('Free'), z.literal('GridVania'), z.literal('LinearHorizontal'), z.literal('LinearVertical')]),\r\n});\r\nexport type LdtkWorld = z.infer;\r\n\r\nconst LdtkEnumValueDefinition = z.object({\r\n color: z.number(),\r\n id: z.string(),\r\n tileRect: LdtkTilesetRectangle.nullable()\r\n});\r\n\r\nconst LdtkEnumDefinition = z.object({\r\n externalRelPath: z.string().nullable(),\r\n iconTilesetUid: z.number().nullable(),\r\n identifier: z.string(),\r\n tags: z.array(z.string()),\r\n uid: z.number(),\r\n values: z.array(LdtkEnumValueDefinition)\r\n})\r\n\r\nexport type LdtkEnumDefinition = z.infer;\r\n\r\nconst LdtkTilesetDefinition = z.object({\r\n __cHei: z.number(),\r\n __cWid: z.number(),\r\n customData: z.array(z.object({\r\n data: z.string(),\r\n tileId: z.number()\r\n })),\r\n embedAtlas: z.string().nullable(),\r\n enumTags: z.optional(z.array(z.object({\r\n enumValueId: z.string(),\r\n tileIds: z.array(z.number())\r\n }))),\r\n identifier: z.string(),\r\n padding: z.number(),\r\n pxHei: z.number(),\r\n pxWid: z.number(),\r\n relPath: z.string().nullable(),\r\n spacing: z.number(),\r\n tags: z.array(z.string()),\r\n tagsSourceEnumUid: z.number().nullable(),\r\n tileGridSize: z.number(),\r\n uid: z.number()\r\n})\r\nexport type LdtkTilesetDefinition = z.infer;\r\n\r\nexport const LdtkLayerDefinition = z.object({\r\n __type: z.union([z.literal(\"IntGrid\"), z.literal(\"Entities\"), z.literal(\"Tiles\"), z.literal(\"AutoLayer\")]),\r\n autoSourceLayerDefUid: z.number().nullable(),\r\n displayOpacity: z.number(),\r\n gridSize: z.number(),\r\n identifier: z.string(),\r\n intGridValues: z.array(z.object({\r\n color: z.string(),\r\n groupUid: z.number(),\r\n identifier: z.string().nullable(),\r\n tile: LdtkTilesetRectangle.nullable(),\r\n value: z.number()\r\n })),\r\n intGridValuesGroups: z.array(z.object({\r\n color: z.string().nullable(),\r\n identifier: z.string().nullable(),\r\n uid: z.number()\r\n })),\r\n parallaxFactorX: z.number(),\r\n parallaxFactorY: z.number(),\r\n parallaxScaling: z.boolean(),\r\n pxOffsetX: z.number(),\r\n pxOffsetY: z.number(),\r\n tilesetDefUid: z.number().nullable(),\r\n uid: z.number(),\r\n});\r\nexport type LdtkLayerDefinition = z.infer;\r\n\r\nexport const LdtkEntityDefinition = z.object({\r\n color: z.string(),\r\n height: z.number(),\r\n identifier: z.string(),\r\n nineSliceBorders: z.array(z.number()),\r\n pivotX: z.number(),\r\n pivotY: z.number(),\r\n tileRect: LdtkTilesetRectangle.nullable(),\r\n tileRenderMode: z.union([\r\n z.literal(\"Cover\"),\r\n z.literal(\"FitInside\"),\r\n z.literal(\"Repeat\"),\r\n z.literal(\"Stretch\"),\r\n z.literal(\"FullSizeCropped\"),\r\n z.literal(\"FullSizeUncropped\"),\r\n z.literal(\"NineSlice\")\r\n ]),\r\n tilesetId: z.number().nullable(),\r\n uiTileRect: LdtkTilesetRectangle.nullable(),\r\n uid: z.number(),\r\n width: z.number()\r\n});\r\nexport type LdtkEntityDefinition = z.infer;\r\n\r\nconst LdtkDefinitions = z.object({\r\n tilesets: z.array(LdtkTilesetDefinition),\r\n enums: z.array(LdtkEnumDefinition),\r\n layers: z.array(LdtkLayerDefinition),\r\n entities: z.array(LdtkEntityDefinition)\r\n})\r\nexport type LdtkDefinitions = z.infer;\r\n\r\nexport const LdtkProjectMetadata = z.object({\r\n iid: z.string(),\r\n bgColor: z.string().nullable(),\r\n defs: LdtkDefinitions,\r\n externalLevels: z.boolean(),\r\n jsonVersion: z.string(),\r\n levels: z.array(LdtkLevel),\r\n toc: z.array(z.object({\r\n identifier: z.string(),\r\n instancesData: z.array(z.object({\r\n fields: z.any(),\r\n heiPx: z.number(),\r\n iids: z.string(),\r\n widPix: z.number(),\r\n worldX: z.number(),\r\n worldY: z.number()\r\n }))\r\n })),\r\n // Moving to worlds array\r\n worldGridHeight: z.number().nullable(),\r\n worldGridWidth: z.number().nullable(),\r\n // TODO is this a LDtk docs typo Vania?\r\n worldLayout: z.union([z.literal('Free'), z.literal('GridVania'), z.literal('LinearHorizontal'), z.literal('LinearVertical')]).nullable(),\r\n worlds: z.array(LdtkWorld)\r\n});\r\nexport type LdtkProjectMetadata = z.infer;\r\n\r\n\r\n\r\n","var util;\n(function (util) {\n util.assertEqual = (val) => val;\n function assertIs(_arg) { }\n util.assertIs = assertIs;\n function assertNever(_x) {\n throw new Error();\n }\n util.assertNever = assertNever;\n util.arrayToEnum = (items) => {\n const obj = {};\n for (const item of items) {\n obj[item] = item;\n }\n return obj;\n };\n util.getValidEnumValues = (obj) => {\n const validKeys = util.objectKeys(obj).filter((k) => typeof obj[obj[k]] !== \"number\");\n const filtered = {};\n for (const k of validKeys) {\n filtered[k] = obj[k];\n }\n return util.objectValues(filtered);\n };\n util.objectValues = (obj) => {\n return util.objectKeys(obj).map(function (e) {\n return obj[e];\n });\n };\n util.objectKeys = typeof Object.keys === \"function\" // eslint-disable-line ban/ban\n ? (obj) => Object.keys(obj) // eslint-disable-line ban/ban\n : (object) => {\n const keys = [];\n for (const key in object) {\n if (Object.prototype.hasOwnProperty.call(object, key)) {\n keys.push(key);\n }\n }\n return keys;\n };\n util.find = (arr, checker) => {\n for (const item of arr) {\n if (checker(item))\n return item;\n }\n return undefined;\n };\n util.isInteger = typeof Number.isInteger === \"function\"\n ? (val) => Number.isInteger(val) // eslint-disable-line ban/ban\n : (val) => typeof val === \"number\" && isFinite(val) && Math.floor(val) === val;\n function joinValues(array, separator = \" | \") {\n return array\n .map((val) => (typeof val === \"string\" ? `'${val}'` : val))\n .join(separator);\n }\n util.joinValues = joinValues;\n util.jsonStringifyReplacer = (_, value) => {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n };\n})(util || (util = {}));\nvar objectUtil;\n(function (objectUtil) {\n objectUtil.mergeShapes = (first, second) => {\n return {\n ...first,\n ...second, // second overwrites first\n };\n };\n})(objectUtil || (objectUtil = {}));\nconst ZodParsedType = util.arrayToEnum([\n \"string\",\n \"nan\",\n \"number\",\n \"integer\",\n \"float\",\n \"boolean\",\n \"date\",\n \"bigint\",\n \"symbol\",\n \"function\",\n \"undefined\",\n \"null\",\n \"array\",\n \"object\",\n \"unknown\",\n \"promise\",\n \"void\",\n \"never\",\n \"map\",\n \"set\",\n]);\nconst getParsedType = (data) => {\n const t = typeof data;\n switch (t) {\n case \"undefined\":\n return ZodParsedType.undefined;\n case \"string\":\n return ZodParsedType.string;\n case \"number\":\n return isNaN(data) ? ZodParsedType.nan : ZodParsedType.number;\n case \"boolean\":\n return ZodParsedType.boolean;\n case \"function\":\n return ZodParsedType.function;\n case \"bigint\":\n return ZodParsedType.bigint;\n case \"symbol\":\n return ZodParsedType.symbol;\n case \"object\":\n if (Array.isArray(data)) {\n return ZodParsedType.array;\n }\n if (data === null) {\n return ZodParsedType.null;\n }\n if (data.then &&\n typeof data.then === \"function\" &&\n data.catch &&\n typeof data.catch === \"function\") {\n return ZodParsedType.promise;\n }\n if (typeof Map !== \"undefined\" && data instanceof Map) {\n return ZodParsedType.map;\n }\n if (typeof Set !== \"undefined\" && data instanceof Set) {\n return ZodParsedType.set;\n }\n if (typeof Date !== \"undefined\" && data instanceof Date) {\n return ZodParsedType.date;\n }\n return ZodParsedType.object;\n default:\n return ZodParsedType.unknown;\n }\n};\n\nconst ZodIssueCode = util.arrayToEnum([\n \"invalid_type\",\n \"invalid_literal\",\n \"custom\",\n \"invalid_union\",\n \"invalid_union_discriminator\",\n \"invalid_enum_value\",\n \"unrecognized_keys\",\n \"invalid_arguments\",\n \"invalid_return_type\",\n \"invalid_date\",\n \"invalid_string\",\n \"too_small\",\n \"too_big\",\n \"invalid_intersection_types\",\n \"not_multiple_of\",\n \"not_finite\",\n]);\nconst quotelessJson = (obj) => {\n const json = JSON.stringify(obj, null, 2);\n return json.replace(/\"([^\"]+)\":/g, \"$1:\");\n};\nclass ZodError extends Error {\n get errors() {\n return this.issues;\n }\n constructor(issues) {\n super();\n this.issues = [];\n this.addIssue = (sub) => {\n this.issues = [...this.issues, sub];\n };\n this.addIssues = (subs = []) => {\n this.issues = [...this.issues, ...subs];\n };\n const actualProto = new.target.prototype;\n if (Object.setPrototypeOf) {\n // eslint-disable-next-line ban/ban\n Object.setPrototypeOf(this, actualProto);\n }\n else {\n this.__proto__ = actualProto;\n }\n this.name = \"ZodError\";\n this.issues = issues;\n }\n format(_mapper) {\n const mapper = _mapper ||\n function (issue) {\n return issue.message;\n };\n const fieldErrors = { _errors: [] };\n const processError = (error) => {\n for (const issue of error.issues) {\n if (issue.code === \"invalid_union\") {\n issue.unionErrors.map(processError);\n }\n else if (issue.code === \"invalid_return_type\") {\n processError(issue.returnTypeError);\n }\n else if (issue.code === \"invalid_arguments\") {\n processError(issue.argumentsError);\n }\n else if (issue.path.length === 0) {\n fieldErrors._errors.push(mapper(issue));\n }\n else {\n let curr = fieldErrors;\n let i = 0;\n while (i < issue.path.length) {\n const el = issue.path[i];\n const terminal = i === issue.path.length - 1;\n if (!terminal) {\n curr[el] = curr[el] || { _errors: [] };\n // if (typeof el === \"string\") {\n // curr[el] = curr[el] || { _errors: [] };\n // } else if (typeof el === \"number\") {\n // const errorArray: any = [];\n // errorArray._errors = [];\n // curr[el] = curr[el] || errorArray;\n // }\n }\n else {\n curr[el] = curr[el] || { _errors: [] };\n curr[el]._errors.push(mapper(issue));\n }\n curr = curr[el];\n i++;\n }\n }\n }\n };\n processError(this);\n return fieldErrors;\n }\n static assert(value) {\n if (!(value instanceof ZodError)) {\n throw new Error(`Not a ZodError: ${value}`);\n }\n }\n toString() {\n return this.message;\n }\n get message() {\n return JSON.stringify(this.issues, util.jsonStringifyReplacer, 2);\n }\n get isEmpty() {\n return this.issues.length === 0;\n }\n flatten(mapper = (issue) => issue.message) {\n const fieldErrors = {};\n const formErrors = [];\n for (const sub of this.issues) {\n if (sub.path.length > 0) {\n fieldErrors[sub.path[0]] = fieldErrors[sub.path[0]] || [];\n fieldErrors[sub.path[0]].push(mapper(sub));\n }\n else {\n formErrors.push(mapper(sub));\n }\n }\n return { formErrors, fieldErrors };\n }\n get formErrors() {\n return this.flatten();\n }\n}\nZodError.create = (issues) => {\n const error = new ZodError(issues);\n return error;\n};\n\nconst errorMap = (issue, _ctx) => {\n let message;\n switch (issue.code) {\n case ZodIssueCode.invalid_type:\n if (issue.received === ZodParsedType.undefined) {\n message = \"Required\";\n }\n else {\n message = `Expected ${issue.expected}, received ${issue.received}`;\n }\n break;\n case ZodIssueCode.invalid_literal:\n message = `Invalid literal value, expected ${JSON.stringify(issue.expected, util.jsonStringifyReplacer)}`;\n break;\n case ZodIssueCode.unrecognized_keys:\n message = `Unrecognized key(s) in object: ${util.joinValues(issue.keys, \", \")}`;\n break;\n case ZodIssueCode.invalid_union:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_union_discriminator:\n message = `Invalid discriminator value. Expected ${util.joinValues(issue.options)}`;\n break;\n case ZodIssueCode.invalid_enum_value:\n message = `Invalid enum value. Expected ${util.joinValues(issue.options)}, received '${issue.received}'`;\n break;\n case ZodIssueCode.invalid_arguments:\n message = `Invalid function arguments`;\n break;\n case ZodIssueCode.invalid_return_type:\n message = `Invalid function return type`;\n break;\n case ZodIssueCode.invalid_date:\n message = `Invalid date`;\n break;\n case ZodIssueCode.invalid_string:\n if (typeof issue.validation === \"object\") {\n if (\"includes\" in issue.validation) {\n message = `Invalid input: must include \"${issue.validation.includes}\"`;\n if (typeof issue.validation.position === \"number\") {\n message = `${message} at one or more positions greater than or equal to ${issue.validation.position}`;\n }\n }\n else if (\"startsWith\" in issue.validation) {\n message = `Invalid input: must start with \"${issue.validation.startsWith}\"`;\n }\n else if (\"endsWith\" in issue.validation) {\n message = `Invalid input: must end with \"${issue.validation.endsWith}\"`;\n }\n else {\n util.assertNever(issue.validation);\n }\n }\n else if (issue.validation !== \"regex\") {\n message = `Invalid ${issue.validation}`;\n }\n else {\n message = \"Invalid\";\n }\n break;\n case ZodIssueCode.too_small:\n if (issue.type === \"array\")\n message = `Array must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `more than`} ${issue.minimum} element(s)`;\n else if (issue.type === \"string\")\n message = `String must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `over`} ${issue.minimum} character(s)`;\n else if (issue.type === \"number\")\n message = `Number must be ${issue.exact\n ? `exactly equal to `\n : issue.inclusive\n ? `greater than or equal to `\n : `greater than `}${issue.minimum}`;\n else if (issue.type === \"date\")\n message = `Date must be ${issue.exact\n ? `exactly equal to `\n : issue.inclusive\n ? `greater than or equal to `\n : `greater than `}${new Date(Number(issue.minimum))}`;\n else\n message = \"Invalid input\";\n break;\n case ZodIssueCode.too_big:\n if (issue.type === \"array\")\n message = `Array must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `less than`} ${issue.maximum} element(s)`;\n else if (issue.type === \"string\")\n message = `String must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `under`} ${issue.maximum} character(s)`;\n else if (issue.type === \"number\")\n message = `Number must be ${issue.exact\n ? `exactly`\n : issue.inclusive\n ? `less than or equal to`\n : `less than`} ${issue.maximum}`;\n else if (issue.type === \"bigint\")\n message = `BigInt must be ${issue.exact\n ? `exactly`\n : issue.inclusive\n ? `less than or equal to`\n : `less than`} ${issue.maximum}`;\n else if (issue.type === \"date\")\n message = `Date must be ${issue.exact\n ? `exactly`\n : issue.inclusive\n ? `smaller than or equal to`\n : `smaller than`} ${new Date(Number(issue.maximum))}`;\n else\n message = \"Invalid input\";\n break;\n case ZodIssueCode.custom:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_intersection_types:\n message = `Intersection results could not be merged`;\n break;\n case ZodIssueCode.not_multiple_of:\n message = `Number must be a multiple of ${issue.multipleOf}`;\n break;\n case ZodIssueCode.not_finite:\n message = \"Number must be finite\";\n break;\n default:\n message = _ctx.defaultError;\n util.assertNever(issue);\n }\n return { message };\n};\n\nlet overrideErrorMap = errorMap;\nfunction setErrorMap(map) {\n overrideErrorMap = map;\n}\nfunction getErrorMap() {\n return overrideErrorMap;\n}\n\nconst makeIssue = (params) => {\n const { data, path, errorMaps, issueData } = params;\n const fullPath = [...path, ...(issueData.path || [])];\n const fullIssue = {\n ...issueData,\n path: fullPath,\n };\n if (issueData.message !== undefined) {\n return {\n ...issueData,\n path: fullPath,\n message: issueData.message,\n };\n }\n let errorMessage = \"\";\n const maps = errorMaps\n .filter((m) => !!m)\n .slice()\n .reverse();\n for (const map of maps) {\n errorMessage = map(fullIssue, { data, defaultError: errorMessage }).message;\n }\n return {\n ...issueData,\n path: fullPath,\n message: errorMessage,\n };\n};\nconst EMPTY_PATH = [];\nfunction addIssueToContext(ctx, issueData) {\n const overrideMap = getErrorMap();\n const issue = makeIssue({\n issueData: issueData,\n data: ctx.data,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap, // contextual error map is first priority\n ctx.schemaErrorMap, // then schema-bound map if available\n overrideMap, // then global override map\n overrideMap === errorMap ? undefined : errorMap, // then global default map\n ].filter((x) => !!x),\n });\n ctx.common.issues.push(issue);\n}\nclass ParseStatus {\n constructor() {\n this.value = \"valid\";\n }\n dirty() {\n if (this.value === \"valid\")\n this.value = \"dirty\";\n }\n abort() {\n if (this.value !== \"aborted\")\n this.value = \"aborted\";\n }\n static mergeArray(status, results) {\n const arrayValue = [];\n for (const s of results) {\n if (s.status === \"aborted\")\n return INVALID;\n if (s.status === \"dirty\")\n status.dirty();\n arrayValue.push(s.value);\n }\n return { status: status.value, value: arrayValue };\n }\n static async mergeObjectAsync(status, pairs) {\n const syncPairs = [];\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n syncPairs.push({\n key,\n value,\n });\n }\n return ParseStatus.mergeObjectSync(status, syncPairs);\n }\n static mergeObjectSync(status, pairs) {\n const finalObject = {};\n for (const pair of pairs) {\n const { key, value } = pair;\n if (key.status === \"aborted\")\n return INVALID;\n if (value.status === \"aborted\")\n return INVALID;\n if (key.status === \"dirty\")\n status.dirty();\n if (value.status === \"dirty\")\n status.dirty();\n if (key.value !== \"__proto__\" &&\n (typeof value.value !== \"undefined\" || pair.alwaysSet)) {\n finalObject[key.value] = value.value;\n }\n }\n return { status: status.value, value: finalObject };\n }\n}\nconst INVALID = Object.freeze({\n status: \"aborted\",\n});\nconst DIRTY = (value) => ({ status: \"dirty\", value });\nconst OK = (value) => ({ status: \"valid\", value });\nconst isAborted = (x) => x.status === \"aborted\";\nconst isDirty = (x) => x.status === \"dirty\";\nconst isValid = (x) => x.status === \"valid\";\nconst isAsync = (x) => typeof Promise !== \"undefined\" && x instanceof Promise;\n\n/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n\r\nfunction __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nfunction __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\ntypeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\n\nvar errorUtil;\n(function (errorUtil) {\n errorUtil.errToObj = (message) => typeof message === \"string\" ? { message } : message || {};\n errorUtil.toString = (message) => typeof message === \"string\" ? message : message === null || message === void 0 ? void 0 : message.message;\n})(errorUtil || (errorUtil = {}));\n\nvar _ZodEnum_cache, _ZodNativeEnum_cache;\nclass ParseInputLazyPath {\n constructor(parent, value, path, key) {\n this._cachedPath = [];\n this.parent = parent;\n this.data = value;\n this._path = path;\n this._key = key;\n }\n get path() {\n if (!this._cachedPath.length) {\n if (this._key instanceof Array) {\n this._cachedPath.push(...this._path, ...this._key);\n }\n else {\n this._cachedPath.push(...this._path, this._key);\n }\n }\n return this._cachedPath;\n }\n}\nconst handleResult = (ctx, result) => {\n if (isValid(result)) {\n return { success: true, data: result.value };\n }\n else {\n if (!ctx.common.issues.length) {\n throw new Error(\"Validation failed but no issues detected.\");\n }\n return {\n success: false,\n get error() {\n if (this._error)\n return this._error;\n const error = new ZodError(ctx.common.issues);\n this._error = error;\n return this._error;\n },\n };\n }\n};\nfunction processCreateParams(params) {\n if (!params)\n return {};\n const { errorMap, invalid_type_error, required_error, description } = params;\n if (errorMap && (invalid_type_error || required_error)) {\n throw new Error(`Can't use \"invalid_type_error\" or \"required_error\" in conjunction with custom error map.`);\n }\n if (errorMap)\n return { errorMap: errorMap, description };\n const customMap = (iss, ctx) => {\n var _a, _b;\n const { message } = params;\n if (iss.code === \"invalid_enum_value\") {\n return { message: message !== null && message !== void 0 ? message : ctx.defaultError };\n }\n if (typeof ctx.data === \"undefined\") {\n return { message: (_a = message !== null && message !== void 0 ? message : required_error) !== null && _a !== void 0 ? _a : ctx.defaultError };\n }\n if (iss.code !== \"invalid_type\")\n return { message: ctx.defaultError };\n return { message: (_b = message !== null && message !== void 0 ? message : invalid_type_error) !== null && _b !== void 0 ? _b : ctx.defaultError };\n };\n return { errorMap: customMap, description };\n}\nclass ZodType {\n get description() {\n return this._def.description;\n }\n _getType(input) {\n return getParsedType(input.data);\n }\n _getOrReturnCtx(input, ctx) {\n return (ctx || {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent,\n });\n }\n _processInputParams(input) {\n return {\n status: new ParseStatus(),\n ctx: {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent,\n },\n };\n }\n _parseSync(input) {\n const result = this._parse(input);\n if (isAsync(result)) {\n throw new Error(\"Synchronous parse encountered promise.\");\n }\n return result;\n }\n _parseAsync(input) {\n const result = this._parse(input);\n return Promise.resolve(result);\n }\n parse(data, params) {\n const result = this.safeParse(data, params);\n if (result.success)\n return result.data;\n throw result.error;\n }\n safeParse(data, params) {\n var _a;\n const ctx = {\n common: {\n issues: [],\n async: (_a = params === null || params === void 0 ? void 0 : params.async) !== null && _a !== void 0 ? _a : false,\n contextualErrorMap: params === null || params === void 0 ? void 0 : params.errorMap,\n },\n path: (params === null || params === void 0 ? void 0 : params.path) || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n const result = this._parseSync({ data, path: ctx.path, parent: ctx });\n return handleResult(ctx, result);\n }\n \"~validate\"(data) {\n var _a, _b;\n const ctx = {\n common: {\n issues: [],\n async: !!this[\"~standard\"].async,\n },\n path: [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n if (!this[\"~standard\"].async) {\n try {\n const result = this._parseSync({ data, path: [], parent: ctx });\n return isValid(result)\n ? {\n value: result.value,\n }\n : {\n issues: ctx.common.issues,\n };\n }\n catch (err) {\n if ((_b = (_a = err === null || err === void 0 ? void 0 : err.message) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === null || _b === void 0 ? void 0 : _b.includes(\"encountered\")) {\n this[\"~standard\"].async = true;\n }\n ctx.common = {\n issues: [],\n async: true,\n };\n }\n }\n return this._parseAsync({ data, path: [], parent: ctx }).then((result) => isValid(result)\n ? {\n value: result.value,\n }\n : {\n issues: ctx.common.issues,\n });\n }\n async parseAsync(data, params) {\n const result = await this.safeParseAsync(data, params);\n if (result.success)\n return result.data;\n throw result.error;\n }\n async safeParseAsync(data, params) {\n const ctx = {\n common: {\n issues: [],\n contextualErrorMap: params === null || params === void 0 ? void 0 : params.errorMap,\n async: true,\n },\n path: (params === null || params === void 0 ? void 0 : params.path) || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n const maybeAsyncResult = this._parse({ data, path: ctx.path, parent: ctx });\n const result = await (isAsync(maybeAsyncResult)\n ? maybeAsyncResult\n : Promise.resolve(maybeAsyncResult));\n return handleResult(ctx, result);\n }\n refine(check, message) {\n const getIssueProperties = (val) => {\n if (typeof message === \"string\" || typeof message === \"undefined\") {\n return { message };\n }\n else if (typeof message === \"function\") {\n return message(val);\n }\n else {\n return message;\n }\n };\n return this._refinement((val, ctx) => {\n const result = check(val);\n const setError = () => ctx.addIssue({\n code: ZodIssueCode.custom,\n ...getIssueProperties(val),\n });\n if (typeof Promise !== \"undefined\" && result instanceof Promise) {\n return result.then((data) => {\n if (!data) {\n setError();\n return false;\n }\n else {\n return true;\n }\n });\n }\n if (!result) {\n setError();\n return false;\n }\n else {\n return true;\n }\n });\n }\n refinement(check, refinementData) {\n return this._refinement((val, ctx) => {\n if (!check(val)) {\n ctx.addIssue(typeof refinementData === \"function\"\n ? refinementData(val, ctx)\n : refinementData);\n return false;\n }\n else {\n return true;\n }\n });\n }\n _refinement(refinement) {\n return new ZodEffects({\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: { type: \"refinement\", refinement },\n });\n }\n superRefine(refinement) {\n return this._refinement(refinement);\n }\n constructor(def) {\n /** Alias of safeParseAsync */\n this.spa = this.safeParseAsync;\n this._def = def;\n this.parse = this.parse.bind(this);\n this.safeParse = this.safeParse.bind(this);\n this.parseAsync = this.parseAsync.bind(this);\n this.safeParseAsync = this.safeParseAsync.bind(this);\n this.spa = this.spa.bind(this);\n this.refine = this.refine.bind(this);\n this.refinement = this.refinement.bind(this);\n this.superRefine = this.superRefine.bind(this);\n this.optional = this.optional.bind(this);\n this.nullable = this.nullable.bind(this);\n this.nullish = this.nullish.bind(this);\n this.array = this.array.bind(this);\n this.promise = this.promise.bind(this);\n this.or = this.or.bind(this);\n this.and = this.and.bind(this);\n this.transform = this.transform.bind(this);\n this.brand = this.brand.bind(this);\n this.default = this.default.bind(this);\n this.catch = this.catch.bind(this);\n this.describe = this.describe.bind(this);\n this.pipe = this.pipe.bind(this);\n this.readonly = this.readonly.bind(this);\n this.isNullable = this.isNullable.bind(this);\n this.isOptional = this.isOptional.bind(this);\n this[\"~standard\"] = {\n version: 1,\n vendor: \"zod\",\n validate: (data) => this[\"~validate\"](data),\n };\n }\n optional() {\n return ZodOptional.create(this, this._def);\n }\n nullable() {\n return ZodNullable.create(this, this._def);\n }\n nullish() {\n return this.nullable().optional();\n }\n array() {\n return ZodArray.create(this);\n }\n promise() {\n return ZodPromise.create(this, this._def);\n }\n or(option) {\n return ZodUnion.create([this, option], this._def);\n }\n and(incoming) {\n return ZodIntersection.create(this, incoming, this._def);\n }\n transform(transform) {\n return new ZodEffects({\n ...processCreateParams(this._def),\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: { type: \"transform\", transform },\n });\n }\n default(def) {\n const defaultValueFunc = typeof def === \"function\" ? def : () => def;\n return new ZodDefault({\n ...processCreateParams(this._def),\n innerType: this,\n defaultValue: defaultValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodDefault,\n });\n }\n brand() {\n return new ZodBranded({\n typeName: ZodFirstPartyTypeKind.ZodBranded,\n type: this,\n ...processCreateParams(this._def),\n });\n }\n catch(def) {\n const catchValueFunc = typeof def === \"function\" ? def : () => def;\n return new ZodCatch({\n ...processCreateParams(this._def),\n innerType: this,\n catchValue: catchValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodCatch,\n });\n }\n describe(description) {\n const This = this.constructor;\n return new This({\n ...this._def,\n description,\n });\n }\n pipe(target) {\n return ZodPipeline.create(this, target);\n }\n readonly() {\n return ZodReadonly.create(this);\n }\n isOptional() {\n return this.safeParse(undefined).success;\n }\n isNullable() {\n return this.safeParse(null).success;\n }\n}\nconst cuidRegex = /^c[^\\s-]{8,}$/i;\nconst cuid2Regex = /^[0-9a-z]+$/;\nconst ulidRegex = /^[0-9A-HJKMNP-TV-Z]{26}$/i;\n// const uuidRegex =\n// /^([a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[a-f0-9]{4}-[a-f0-9]{12}|00000000-0000-0000-0000-000000000000)$/i;\nconst uuidRegex = /^[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$/i;\nconst nanoidRegex = /^[a-z0-9_-]{21}$/i;\nconst jwtRegex = /^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]*$/;\nconst durationRegex = /^[-+]?P(?!$)(?:(?:[-+]?\\d+Y)|(?:[-+]?\\d+[.,]\\d+Y$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:(?:[-+]?\\d+W)|(?:[-+]?\\d+[.,]\\d+W$))?(?:(?:[-+]?\\d+D)|(?:[-+]?\\d+[.,]\\d+D$))?(?:T(?=[\\d+-])(?:(?:[-+]?\\d+H)|(?:[-+]?\\d+[.,]\\d+H$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:[-+]?\\d+(?:[.,]\\d+)?S)?)??$/;\n// from https://stackoverflow.com/a/46181/1550155\n// old version: too slow, didn't support unicode\n// const emailRegex = /^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/i;\n//old email regex\n// const emailRegex = /^(([^<>()[\\].,;:\\s@\"]+(\\.[^<>()[\\].,;:\\s@\"]+)*)|(\".+\"))@((?!-)([^<>()[\\].,;:\\s@\"]+\\.)+[^<>()[\\].,;:\\s@\"]{1,})[^-<>()[\\].,;:\\s@\"]$/i;\n// eslint-disable-next-line\n// const emailRegex =\n// /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\])|(\\[IPv6:(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))\\])|([A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])*(\\.[A-Za-z]{2,})+))$/;\n// const emailRegex =\n// /^[a-zA-Z0-9\\.\\!\\#\\$\\%\\&\\'\\*\\+\\/\\=\\?\\^\\_\\`\\{\\|\\}\\~\\-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n// const emailRegex =\n// /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])$/i;\nconst emailRegex = /^(?!\\.)(?!.*\\.\\.)([A-Z0-9_'+\\-\\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\\-]*\\.)+[A-Z]{2,}$/i;\n// const emailRegex =\n// /^[a-z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-z0-9-]+(?:\\.[a-z0-9\\-]+)*$/i;\n// from https://thekevinscott.com/emojis-in-javascript/#writing-a-regular-expression\nconst _emojiRegex = `^(\\\\p{Extended_Pictographic}|\\\\p{Emoji_Component})+$`;\nlet emojiRegex;\n// faster, simpler, safer\nconst ipv4Regex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/;\nconst ipv4CidrRegex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/(3[0-2]|[12]?[0-9])$/;\n// const ipv6Regex =\n// /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/;\nconst ipv6Regex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/;\nconst ipv6CidrRegex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/;\n// https://stackoverflow.com/questions/7860392/determine-if-string-is-in-base64-using-javascript\nconst base64Regex = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/;\n// https://base64.guru/standards/base64url\nconst base64urlRegex = /^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/;\n// simple\n// const dateRegexSource = `\\\\d{4}-\\\\d{2}-\\\\d{2}`;\n// no leap year validation\n// const dateRegexSource = `\\\\d{4}-((0[13578]|10|12)-31|(0[13-9]|1[0-2])-30|(0[1-9]|1[0-2])-(0[1-9]|1\\\\d|2\\\\d))`;\n// with leap year validation\nconst dateRegexSource = `((\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\\\d|30)|(02)-(0[1-9]|1\\\\d|2[0-8])))`;\nconst dateRegex = new RegExp(`^${dateRegexSource}$`);\nfunction timeRegexSource(args) {\n // let regex = `\\\\d{2}:\\\\d{2}:\\\\d{2}`;\n let regex = `([01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d`;\n if (args.precision) {\n regex = `${regex}\\\\.\\\\d{${args.precision}}`;\n }\n else if (args.precision == null) {\n regex = `${regex}(\\\\.\\\\d+)?`;\n }\n return regex;\n}\nfunction timeRegex(args) {\n return new RegExp(`^${timeRegexSource(args)}$`);\n}\n// Adapted from https://stackoverflow.com/a/3143231\nfunction datetimeRegex(args) {\n let regex = `${dateRegexSource}T${timeRegexSource(args)}`;\n const opts = [];\n opts.push(args.local ? `Z?` : `Z`);\n if (args.offset)\n opts.push(`([+-]\\\\d{2}:?\\\\d{2})`);\n regex = `${regex}(${opts.join(\"|\")})`;\n return new RegExp(`^${regex}$`);\n}\nfunction isValidIP(ip, version) {\n if ((version === \"v4\" || !version) && ipv4Regex.test(ip)) {\n return true;\n }\n if ((version === \"v6\" || !version) && ipv6Regex.test(ip)) {\n return true;\n }\n return false;\n}\nfunction isValidJWT(jwt, alg) {\n if (!jwtRegex.test(jwt))\n return false;\n try {\n const [header] = jwt.split(\".\");\n // Convert base64url to base64\n const base64 = header\n .replace(/-/g, \"+\")\n .replace(/_/g, \"/\")\n .padEnd(header.length + ((4 - (header.length % 4)) % 4), \"=\");\n const decoded = JSON.parse(atob(base64));\n if (typeof decoded !== \"object\" || decoded === null)\n return false;\n if (!decoded.typ || !decoded.alg)\n return false;\n if (alg && decoded.alg !== alg)\n return false;\n return true;\n }\n catch (_a) {\n return false;\n }\n}\nfunction isValidCidr(ip, version) {\n if ((version === \"v4\" || !version) && ipv4CidrRegex.test(ip)) {\n return true;\n }\n if ((version === \"v6\" || !version) && ipv6CidrRegex.test(ip)) {\n return true;\n }\n return false;\n}\nclass ZodString extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = String(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.string) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.string,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n if (input.data.length < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n if (input.data.length > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"length\") {\n const tooBig = input.data.length > check.value;\n const tooSmall = input.data.length < check.value;\n if (tooBig || tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n if (tooBig) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n exact: true,\n message: check.message,\n });\n }\n else if (tooSmall) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n exact: true,\n message: check.message,\n });\n }\n status.dirty();\n }\n }\n else if (check.kind === \"email\") {\n if (!emailRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"email\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"emoji\") {\n if (!emojiRegex) {\n emojiRegex = new RegExp(_emojiRegex, \"u\");\n }\n if (!emojiRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"emoji\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"uuid\") {\n if (!uuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"uuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"nanoid\") {\n if (!nanoidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"nanoid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cuid\") {\n if (!cuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cuid2\") {\n if (!cuid2Regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid2\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"ulid\") {\n if (!ulidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"ulid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"url\") {\n try {\n new URL(input.data);\n }\n catch (_a) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"url\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"regex\") {\n check.regex.lastIndex = 0;\n const testResult = check.regex.test(input.data);\n if (!testResult) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"regex\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"trim\") {\n input.data = input.data.trim();\n }\n else if (check.kind === \"includes\") {\n if (!input.data.includes(check.value, check.position)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { includes: check.value, position: check.position },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"toLowerCase\") {\n input.data = input.data.toLowerCase();\n }\n else if (check.kind === \"toUpperCase\") {\n input.data = input.data.toUpperCase();\n }\n else if (check.kind === \"startsWith\") {\n if (!input.data.startsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { startsWith: check.value },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"endsWith\") {\n if (!input.data.endsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { endsWith: check.value },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"datetime\") {\n const regex = datetimeRegex(check);\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"datetime\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"date\") {\n const regex = dateRegex;\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"date\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"time\") {\n const regex = timeRegex(check);\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"time\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"duration\") {\n if (!durationRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"duration\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"ip\") {\n if (!isValidIP(input.data, check.version)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"ip\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"jwt\") {\n if (!isValidJWT(input.data, check.alg)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"jwt\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cidr\") {\n if (!isValidCidr(input.data, check.version)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cidr\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"base64\") {\n if (!base64Regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"base64\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"base64url\") {\n if (!base64urlRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"base64url\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n _regex(regex, validation, message) {\n return this.refinement((data) => regex.test(data), {\n validation,\n code: ZodIssueCode.invalid_string,\n ...errorUtil.errToObj(message),\n });\n }\n _addCheck(check) {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n email(message) {\n return this._addCheck({ kind: \"email\", ...errorUtil.errToObj(message) });\n }\n url(message) {\n return this._addCheck({ kind: \"url\", ...errorUtil.errToObj(message) });\n }\n emoji(message) {\n return this._addCheck({ kind: \"emoji\", ...errorUtil.errToObj(message) });\n }\n uuid(message) {\n return this._addCheck({ kind: \"uuid\", ...errorUtil.errToObj(message) });\n }\n nanoid(message) {\n return this._addCheck({ kind: \"nanoid\", ...errorUtil.errToObj(message) });\n }\n cuid(message) {\n return this._addCheck({ kind: \"cuid\", ...errorUtil.errToObj(message) });\n }\n cuid2(message) {\n return this._addCheck({ kind: \"cuid2\", ...errorUtil.errToObj(message) });\n }\n ulid(message) {\n return this._addCheck({ kind: \"ulid\", ...errorUtil.errToObj(message) });\n }\n base64(message) {\n return this._addCheck({ kind: \"base64\", ...errorUtil.errToObj(message) });\n }\n base64url(message) {\n // base64url encoding is a modification of base64 that can safely be used in URLs and filenames\n return this._addCheck({\n kind: \"base64url\",\n ...errorUtil.errToObj(message),\n });\n }\n jwt(options) {\n return this._addCheck({ kind: \"jwt\", ...errorUtil.errToObj(options) });\n }\n ip(options) {\n return this._addCheck({ kind: \"ip\", ...errorUtil.errToObj(options) });\n }\n cidr(options) {\n return this._addCheck({ kind: \"cidr\", ...errorUtil.errToObj(options) });\n }\n datetime(options) {\n var _a, _b;\n if (typeof options === \"string\") {\n return this._addCheck({\n kind: \"datetime\",\n precision: null,\n offset: false,\n local: false,\n message: options,\n });\n }\n return this._addCheck({\n kind: \"datetime\",\n precision: typeof (options === null || options === void 0 ? void 0 : options.precision) === \"undefined\" ? null : options === null || options === void 0 ? void 0 : options.precision,\n offset: (_a = options === null || options === void 0 ? void 0 : options.offset) !== null && _a !== void 0 ? _a : false,\n local: (_b = options === null || options === void 0 ? void 0 : options.local) !== null && _b !== void 0 ? _b : false,\n ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message),\n });\n }\n date(message) {\n return this._addCheck({ kind: \"date\", message });\n }\n time(options) {\n if (typeof options === \"string\") {\n return this._addCheck({\n kind: \"time\",\n precision: null,\n message: options,\n });\n }\n return this._addCheck({\n kind: \"time\",\n precision: typeof (options === null || options === void 0 ? void 0 : options.precision) === \"undefined\" ? null : options === null || options === void 0 ? void 0 : options.precision,\n ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message),\n });\n }\n duration(message) {\n return this._addCheck({ kind: \"duration\", ...errorUtil.errToObj(message) });\n }\n regex(regex, message) {\n return this._addCheck({\n kind: \"regex\",\n regex: regex,\n ...errorUtil.errToObj(message),\n });\n }\n includes(value, options) {\n return this._addCheck({\n kind: \"includes\",\n value: value,\n position: options === null || options === void 0 ? void 0 : options.position,\n ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message),\n });\n }\n startsWith(value, message) {\n return this._addCheck({\n kind: \"startsWith\",\n value: value,\n ...errorUtil.errToObj(message),\n });\n }\n endsWith(value, message) {\n return this._addCheck({\n kind: \"endsWith\",\n value: value,\n ...errorUtil.errToObj(message),\n });\n }\n min(minLength, message) {\n return this._addCheck({\n kind: \"min\",\n value: minLength,\n ...errorUtil.errToObj(message),\n });\n }\n max(maxLength, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxLength,\n ...errorUtil.errToObj(message),\n });\n }\n length(len, message) {\n return this._addCheck({\n kind: \"length\",\n value: len,\n ...errorUtil.errToObj(message),\n });\n }\n /**\n * Equivalent to `.min(1)`\n */\n nonempty(message) {\n return this.min(1, errorUtil.errToObj(message));\n }\n trim() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"trim\" }],\n });\n }\n toLowerCase() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"toLowerCase\" }],\n });\n }\n toUpperCase() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"toUpperCase\" }],\n });\n }\n get isDatetime() {\n return !!this._def.checks.find((ch) => ch.kind === \"datetime\");\n }\n get isDate() {\n return !!this._def.checks.find((ch) => ch.kind === \"date\");\n }\n get isTime() {\n return !!this._def.checks.find((ch) => ch.kind === \"time\");\n }\n get isDuration() {\n return !!this._def.checks.find((ch) => ch.kind === \"duration\");\n }\n get isEmail() {\n return !!this._def.checks.find((ch) => ch.kind === \"email\");\n }\n get isURL() {\n return !!this._def.checks.find((ch) => ch.kind === \"url\");\n }\n get isEmoji() {\n return !!this._def.checks.find((ch) => ch.kind === \"emoji\");\n }\n get isUUID() {\n return !!this._def.checks.find((ch) => ch.kind === \"uuid\");\n }\n get isNANOID() {\n return !!this._def.checks.find((ch) => ch.kind === \"nanoid\");\n }\n get isCUID() {\n return !!this._def.checks.find((ch) => ch.kind === \"cuid\");\n }\n get isCUID2() {\n return !!this._def.checks.find((ch) => ch.kind === \"cuid2\");\n }\n get isULID() {\n return !!this._def.checks.find((ch) => ch.kind === \"ulid\");\n }\n get isIP() {\n return !!this._def.checks.find((ch) => ch.kind === \"ip\");\n }\n get isCIDR() {\n return !!this._def.checks.find((ch) => ch.kind === \"cidr\");\n }\n get isBase64() {\n return !!this._def.checks.find((ch) => ch.kind === \"base64\");\n }\n get isBase64url() {\n // base64url encoding is a modification of base64 that can safely be used in URLs and filenames\n return !!this._def.checks.find((ch) => ch.kind === \"base64url\");\n }\n get minLength() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxLength() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n}\nZodString.create = (params) => {\n var _a;\n return new ZodString({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodString,\n coerce: (_a = params === null || params === void 0 ? void 0 : params.coerce) !== null && _a !== void 0 ? _a : false,\n ...processCreateParams(params),\n });\n};\n// https://stackoverflow.com/questions/3966484/why-does-modulus-operator-return-fractional-number-in-javascript/31711034#31711034\nfunction floatSafeRemainder(val, step) {\n const valDecCount = (val.toString().split(\".\")[1] || \"\").length;\n const stepDecCount = (step.toString().split(\".\")[1] || \"\").length;\n const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount;\n const valInt = parseInt(val.toFixed(decCount).replace(\".\", \"\"));\n const stepInt = parseInt(step.toFixed(decCount).replace(\".\", \"\"));\n return (valInt % stepInt) / Math.pow(10, decCount);\n}\nclass ZodNumber extends ZodType {\n constructor() {\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n this.step = this.multipleOf;\n }\n _parse(input) {\n if (this._def.coerce) {\n input.data = Number(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.number) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.number,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks) {\n if (check.kind === \"int\") {\n if (!util.isInteger(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: \"integer\",\n received: \"float\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"min\") {\n const tooSmall = check.inclusive\n ? input.data < check.value\n : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n const tooBig = check.inclusive\n ? input.data > check.value\n : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"multipleOf\") {\n if (floatSafeRemainder(input.data, check.value) !== 0) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"finite\") {\n if (!Number.isFinite(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_finite,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodNumber({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message),\n },\n ],\n });\n }\n _addCheck(check) {\n return new ZodNumber({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n int(message) {\n return this._addCheck({\n kind: \"int\",\n message: errorUtil.toString(message),\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value: value,\n message: errorUtil.toString(message),\n });\n }\n finite(message) {\n return this._addCheck({\n kind: \"finite\",\n message: errorUtil.toString(message),\n });\n }\n safe(message) {\n return this._addCheck({\n kind: \"min\",\n inclusive: true,\n value: Number.MIN_SAFE_INTEGER,\n message: errorUtil.toString(message),\n })._addCheck({\n kind: \"max\",\n inclusive: true,\n value: Number.MAX_SAFE_INTEGER,\n message: errorUtil.toString(message),\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n get isInt() {\n return !!this._def.checks.find((ch) => ch.kind === \"int\" ||\n (ch.kind === \"multipleOf\" && util.isInteger(ch.value)));\n }\n get isFinite() {\n let max = null, min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"finite\" ||\n ch.kind === \"int\" ||\n ch.kind === \"multipleOf\") {\n return true;\n }\n else if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n else if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return Number.isFinite(min) && Number.isFinite(max);\n }\n}\nZodNumber.create = (params) => {\n return new ZodNumber({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodNumber,\n coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false,\n ...processCreateParams(params),\n });\n};\nclass ZodBigInt extends ZodType {\n constructor() {\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n }\n _parse(input) {\n if (this._def.coerce) {\n try {\n input.data = BigInt(input.data);\n }\n catch (_a) {\n return this._getInvalidInput(input);\n }\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.bigint) {\n return this._getInvalidInput(input);\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n const tooSmall = check.inclusive\n ? input.data < check.value\n : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n type: \"bigint\",\n minimum: check.value,\n inclusive: check.inclusive,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n const tooBig = check.inclusive\n ? input.data > check.value\n : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n type: \"bigint\",\n maximum: check.value,\n inclusive: check.inclusive,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"multipleOf\") {\n if (input.data % check.value !== BigInt(0)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n _getInvalidInput(input) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.bigint,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodBigInt({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message),\n },\n ],\n });\n }\n _addCheck(check) {\n return new ZodBigInt({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value,\n message: errorUtil.toString(message),\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n}\nZodBigInt.create = (params) => {\n var _a;\n return new ZodBigInt({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodBigInt,\n coerce: (_a = params === null || params === void 0 ? void 0 : params.coerce) !== null && _a !== void 0 ? _a : false,\n ...processCreateParams(params),\n });\n};\nclass ZodBoolean extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = Boolean(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.boolean) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.boolean,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodBoolean.create = (params) => {\n return new ZodBoolean({\n typeName: ZodFirstPartyTypeKind.ZodBoolean,\n coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false,\n ...processCreateParams(params),\n });\n};\nclass ZodDate extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = new Date(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.date) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.date,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (isNaN(input.data.getTime())) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_date,\n });\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n if (input.data.getTime() < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n message: check.message,\n inclusive: true,\n exact: false,\n minimum: check.value,\n type: \"date\",\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n if (input.data.getTime() > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n message: check.message,\n inclusive: true,\n exact: false,\n maximum: check.value,\n type: \"date\",\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return {\n status: status.value,\n value: new Date(input.data.getTime()),\n };\n }\n _addCheck(check) {\n return new ZodDate({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n min(minDate, message) {\n return this._addCheck({\n kind: \"min\",\n value: minDate.getTime(),\n message: errorUtil.toString(message),\n });\n }\n max(maxDate, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxDate.getTime(),\n message: errorUtil.toString(message),\n });\n }\n get minDate() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min != null ? new Date(min) : null;\n }\n get maxDate() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max != null ? new Date(max) : null;\n }\n}\nZodDate.create = (params) => {\n return new ZodDate({\n checks: [],\n coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false,\n typeName: ZodFirstPartyTypeKind.ZodDate,\n ...processCreateParams(params),\n });\n};\nclass ZodSymbol extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.symbol) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.symbol,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodSymbol.create = (params) => {\n return new ZodSymbol({\n typeName: ZodFirstPartyTypeKind.ZodSymbol,\n ...processCreateParams(params),\n });\n};\nclass ZodUndefined extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.undefined,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodUndefined.create = (params) => {\n return new ZodUndefined({\n typeName: ZodFirstPartyTypeKind.ZodUndefined,\n ...processCreateParams(params),\n });\n};\nclass ZodNull extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.null) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.null,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodNull.create = (params) => {\n return new ZodNull({\n typeName: ZodFirstPartyTypeKind.ZodNull,\n ...processCreateParams(params),\n });\n};\nclass ZodAny extends ZodType {\n constructor() {\n super(...arguments);\n // to prevent instances of other classes from extending ZodAny. this causes issues with catchall in ZodObject.\n this._any = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodAny.create = (params) => {\n return new ZodAny({\n typeName: ZodFirstPartyTypeKind.ZodAny,\n ...processCreateParams(params),\n });\n};\nclass ZodUnknown extends ZodType {\n constructor() {\n super(...arguments);\n // required\n this._unknown = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodUnknown.create = (params) => {\n return new ZodUnknown({\n typeName: ZodFirstPartyTypeKind.ZodUnknown,\n ...processCreateParams(params),\n });\n};\nclass ZodNever extends ZodType {\n _parse(input) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.never,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n}\nZodNever.create = (params) => {\n return new ZodNever({\n typeName: ZodFirstPartyTypeKind.ZodNever,\n ...processCreateParams(params),\n });\n};\nclass ZodVoid extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.void,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodVoid.create = (params) => {\n return new ZodVoid({\n typeName: ZodFirstPartyTypeKind.ZodVoid,\n ...processCreateParams(params),\n });\n};\nclass ZodArray extends ZodType {\n _parse(input) {\n const { ctx, status } = this._processInputParams(input);\n const def = this._def;\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (def.exactLength !== null) {\n const tooBig = ctx.data.length > def.exactLength.value;\n const tooSmall = ctx.data.length < def.exactLength.value;\n if (tooBig || tooSmall) {\n addIssueToContext(ctx, {\n code: tooBig ? ZodIssueCode.too_big : ZodIssueCode.too_small,\n minimum: (tooSmall ? def.exactLength.value : undefined),\n maximum: (tooBig ? def.exactLength.value : undefined),\n type: \"array\",\n inclusive: true,\n exact: true,\n message: def.exactLength.message,\n });\n status.dirty();\n }\n }\n if (def.minLength !== null) {\n if (ctx.data.length < def.minLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minLength.value,\n type: \"array\",\n inclusive: true,\n exact: false,\n message: def.minLength.message,\n });\n status.dirty();\n }\n }\n if (def.maxLength !== null) {\n if (ctx.data.length > def.maxLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxLength.value,\n type: \"array\",\n inclusive: true,\n exact: false,\n message: def.maxLength.message,\n });\n status.dirty();\n }\n }\n if (ctx.common.async) {\n return Promise.all([...ctx.data].map((item, i) => {\n return def.type._parseAsync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n })).then((result) => {\n return ParseStatus.mergeArray(status, result);\n });\n }\n const result = [...ctx.data].map((item, i) => {\n return def.type._parseSync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n });\n return ParseStatus.mergeArray(status, result);\n }\n get element() {\n return this._def.type;\n }\n min(minLength, message) {\n return new ZodArray({\n ...this._def,\n minLength: { value: minLength, message: errorUtil.toString(message) },\n });\n }\n max(maxLength, message) {\n return new ZodArray({\n ...this._def,\n maxLength: { value: maxLength, message: errorUtil.toString(message) },\n });\n }\n length(len, message) {\n return new ZodArray({\n ...this._def,\n exactLength: { value: len, message: errorUtil.toString(message) },\n });\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodArray.create = (schema, params) => {\n return new ZodArray({\n type: schema,\n minLength: null,\n maxLength: null,\n exactLength: null,\n typeName: ZodFirstPartyTypeKind.ZodArray,\n ...processCreateParams(params),\n });\n};\nfunction deepPartialify(schema) {\n if (schema instanceof ZodObject) {\n const newShape = {};\n for (const key in schema.shape) {\n const fieldSchema = schema.shape[key];\n newShape[key] = ZodOptional.create(deepPartialify(fieldSchema));\n }\n return new ZodObject({\n ...schema._def,\n shape: () => newShape,\n });\n }\n else if (schema instanceof ZodArray) {\n return new ZodArray({\n ...schema._def,\n type: deepPartialify(schema.element),\n });\n }\n else if (schema instanceof ZodOptional) {\n return ZodOptional.create(deepPartialify(schema.unwrap()));\n }\n else if (schema instanceof ZodNullable) {\n return ZodNullable.create(deepPartialify(schema.unwrap()));\n }\n else if (schema instanceof ZodTuple) {\n return ZodTuple.create(schema.items.map((item) => deepPartialify(item)));\n }\n else {\n return schema;\n }\n}\nclass ZodObject extends ZodType {\n constructor() {\n super(...arguments);\n this._cached = null;\n /**\n * @deprecated In most cases, this is no longer needed - unknown properties are now silently stripped.\n * If you want to pass through unknown properties, use `.passthrough()` instead.\n */\n this.nonstrict = this.passthrough;\n // extend<\n // Augmentation extends ZodRawShape,\n // NewOutput extends util.flatten<{\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // }>,\n // NewInput extends util.flatten<{\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }>\n // >(\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape,\n // UnknownKeys,\n // Catchall,\n // NewOutput,\n // NewInput\n // > {\n // return new ZodObject({\n // ...this._def,\n // shape: () => ({\n // ...this._def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // }\n /**\n * @deprecated Use `.extend` instead\n * */\n this.augment = this.extend;\n }\n _getCached() {\n if (this._cached !== null)\n return this._cached;\n const shape = this._def.shape();\n const keys = util.objectKeys(shape);\n return (this._cached = { shape, keys });\n }\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.object) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const { status, ctx } = this._processInputParams(input);\n const { shape, keys: shapeKeys } = this._getCached();\n const extraKeys = [];\n if (!(this._def.catchall instanceof ZodNever &&\n this._def.unknownKeys === \"strip\")) {\n for (const key in ctx.data) {\n if (!shapeKeys.includes(key)) {\n extraKeys.push(key);\n }\n }\n }\n const pairs = [];\n for (const key of shapeKeys) {\n const keyValidator = shape[key];\n const value = ctx.data[key];\n pairs.push({\n key: { status: \"valid\", value: key },\n value: keyValidator._parse(new ParseInputLazyPath(ctx, value, ctx.path, key)),\n alwaysSet: key in ctx.data,\n });\n }\n if (this._def.catchall instanceof ZodNever) {\n const unknownKeys = this._def.unknownKeys;\n if (unknownKeys === \"passthrough\") {\n for (const key of extraKeys) {\n pairs.push({\n key: { status: \"valid\", value: key },\n value: { status: \"valid\", value: ctx.data[key] },\n });\n }\n }\n else if (unknownKeys === \"strict\") {\n if (extraKeys.length > 0) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.unrecognized_keys,\n keys: extraKeys,\n });\n status.dirty();\n }\n }\n else if (unknownKeys === \"strip\") ;\n else {\n throw new Error(`Internal ZodObject error: invalid unknownKeys value.`);\n }\n }\n else {\n // run catchall validation\n const catchall = this._def.catchall;\n for (const key of extraKeys) {\n const value = ctx.data[key];\n pairs.push({\n key: { status: \"valid\", value: key },\n value: catchall._parse(new ParseInputLazyPath(ctx, value, ctx.path, key) //, ctx.child(key), value, getParsedType(value)\n ),\n alwaysSet: key in ctx.data,\n });\n }\n }\n if (ctx.common.async) {\n return Promise.resolve()\n .then(async () => {\n const syncPairs = [];\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n syncPairs.push({\n key,\n value,\n alwaysSet: pair.alwaysSet,\n });\n }\n return syncPairs;\n })\n .then((syncPairs) => {\n return ParseStatus.mergeObjectSync(status, syncPairs);\n });\n }\n else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get shape() {\n return this._def.shape();\n }\n strict(message) {\n errorUtil.errToObj;\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strict\",\n ...(message !== undefined\n ? {\n errorMap: (issue, ctx) => {\n var _a, _b, _c, _d;\n const defaultError = (_c = (_b = (_a = this._def).errorMap) === null || _b === void 0 ? void 0 : _b.call(_a, issue, ctx).message) !== null && _c !== void 0 ? _c : ctx.defaultError;\n if (issue.code === \"unrecognized_keys\")\n return {\n message: (_d = errorUtil.errToObj(message).message) !== null && _d !== void 0 ? _d : defaultError,\n };\n return {\n message: defaultError,\n };\n },\n }\n : {}),\n });\n }\n strip() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strip\",\n });\n }\n passthrough() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"passthrough\",\n });\n }\n // const AugmentFactory =\n // (def: Def) =>\n // (\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape, Augmentation>,\n // Def[\"unknownKeys\"],\n // Def[\"catchall\"]\n // > => {\n // return new ZodObject({\n // ...def,\n // shape: () => ({\n // ...def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // };\n extend(augmentation) {\n return new ZodObject({\n ...this._def,\n shape: () => ({\n ...this._def.shape(),\n ...augmentation,\n }),\n });\n }\n /**\n * Prior to zod@1.0.12 there was a bug in the\n * inferred type of merged objects. Please\n * upgrade if you are experiencing issues.\n */\n merge(merging) {\n const merged = new ZodObject({\n unknownKeys: merging._def.unknownKeys,\n catchall: merging._def.catchall,\n shape: () => ({\n ...this._def.shape(),\n ...merging._def.shape(),\n }),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n });\n return merged;\n }\n // merge<\n // Incoming extends AnyZodObject,\n // Augmentation extends Incoming[\"shape\"],\n // NewOutput extends {\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // },\n // NewInput extends {\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }\n // >(\n // merging: Incoming\n // ): ZodObject<\n // extendShape>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"],\n // NewOutput,\n // NewInput\n // > {\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n setKey(key, schema) {\n return this.augment({ [key]: schema });\n }\n // merge(\n // merging: Incoming\n // ): //ZodObject = (merging) => {\n // ZodObject<\n // extendShape>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"]\n // > {\n // // const mergedShape = objectUtil.mergeShapes(\n // // this._def.shape(),\n // // merging._def.shape()\n // // );\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n catchall(index) {\n return new ZodObject({\n ...this._def,\n catchall: index,\n });\n }\n pick(mask) {\n const shape = {};\n util.objectKeys(mask).forEach((key) => {\n if (mask[key] && this.shape[key]) {\n shape[key] = this.shape[key];\n }\n });\n return new ZodObject({\n ...this._def,\n shape: () => shape,\n });\n }\n omit(mask) {\n const shape = {};\n util.objectKeys(this.shape).forEach((key) => {\n if (!mask[key]) {\n shape[key] = this.shape[key];\n }\n });\n return new ZodObject({\n ...this._def,\n shape: () => shape,\n });\n }\n /**\n * @deprecated\n */\n deepPartial() {\n return deepPartialify(this);\n }\n partial(mask) {\n const newShape = {};\n util.objectKeys(this.shape).forEach((key) => {\n const fieldSchema = this.shape[key];\n if (mask && !mask[key]) {\n newShape[key] = fieldSchema;\n }\n else {\n newShape[key] = fieldSchema.optional();\n }\n });\n return new ZodObject({\n ...this._def,\n shape: () => newShape,\n });\n }\n required(mask) {\n const newShape = {};\n util.objectKeys(this.shape).forEach((key) => {\n if (mask && !mask[key]) {\n newShape[key] = this.shape[key];\n }\n else {\n const fieldSchema = this.shape[key];\n let newField = fieldSchema;\n while (newField instanceof ZodOptional) {\n newField = newField._def.innerType;\n }\n newShape[key] = newField;\n }\n });\n return new ZodObject({\n ...this._def,\n shape: () => newShape,\n });\n }\n keyof() {\n return createZodEnum(util.objectKeys(this.shape));\n }\n}\nZodObject.create = (shape, params) => {\n return new ZodObject({\n shape: () => shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nZodObject.strictCreate = (shape, params) => {\n return new ZodObject({\n shape: () => shape,\n unknownKeys: \"strict\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nZodObject.lazycreate = (shape, params) => {\n return new ZodObject({\n shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nclass ZodUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const options = this._def.options;\n function handleResults(results) {\n // return first issue-free validation if it exists\n for (const result of results) {\n if (result.result.status === \"valid\") {\n return result.result;\n }\n }\n for (const result of results) {\n if (result.result.status === \"dirty\") {\n // add issues from dirty option\n ctx.common.issues.push(...result.ctx.common.issues);\n return result.result;\n }\n }\n // return invalid\n const unionErrors = results.map((result) => new ZodError(result.ctx.common.issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors,\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return Promise.all(options.map(async (option) => {\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n parent: null,\n };\n return {\n result: await option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx,\n }),\n ctx: childCtx,\n };\n })).then(handleResults);\n }\n else {\n let dirty = undefined;\n const issues = [];\n for (const option of options) {\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n parent: null,\n };\n const result = option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx,\n });\n if (result.status === \"valid\") {\n return result;\n }\n else if (result.status === \"dirty\" && !dirty) {\n dirty = { result, ctx: childCtx };\n }\n if (childCtx.common.issues.length) {\n issues.push(childCtx.common.issues);\n }\n }\n if (dirty) {\n ctx.common.issues.push(...dirty.ctx.common.issues);\n return dirty.result;\n }\n const unionErrors = issues.map((issues) => new ZodError(issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors,\n });\n return INVALID;\n }\n }\n get options() {\n return this._def.options;\n }\n}\nZodUnion.create = (types, params) => {\n return new ZodUnion({\n options: types,\n typeName: ZodFirstPartyTypeKind.ZodUnion,\n ...processCreateParams(params),\n });\n};\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\n////////// //////////\n////////// ZodDiscriminatedUnion //////////\n////////// //////////\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\nconst getDiscriminator = (type) => {\n if (type instanceof ZodLazy) {\n return getDiscriminator(type.schema);\n }\n else if (type instanceof ZodEffects) {\n return getDiscriminator(type.innerType());\n }\n else if (type instanceof ZodLiteral) {\n return [type.value];\n }\n else if (type instanceof ZodEnum) {\n return type.options;\n }\n else if (type instanceof ZodNativeEnum) {\n // eslint-disable-next-line ban/ban\n return util.objectValues(type.enum);\n }\n else if (type instanceof ZodDefault) {\n return getDiscriminator(type._def.innerType);\n }\n else if (type instanceof ZodUndefined) {\n return [undefined];\n }\n else if (type instanceof ZodNull) {\n return [null];\n }\n else if (type instanceof ZodOptional) {\n return [undefined, ...getDiscriminator(type.unwrap())];\n }\n else if (type instanceof ZodNullable) {\n return [null, ...getDiscriminator(type.unwrap())];\n }\n else if (type instanceof ZodBranded) {\n return getDiscriminator(type.unwrap());\n }\n else if (type instanceof ZodReadonly) {\n return getDiscriminator(type.unwrap());\n }\n else if (type instanceof ZodCatch) {\n return getDiscriminator(type._def.innerType);\n }\n else {\n return [];\n }\n};\nclass ZodDiscriminatedUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const discriminator = this.discriminator;\n const discriminatorValue = ctx.data[discriminator];\n const option = this.optionsMap.get(discriminatorValue);\n if (!option) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union_discriminator,\n options: Array.from(this.optionsMap.keys()),\n path: [discriminator],\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n }\n else {\n return option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n get discriminator() {\n return this._def.discriminator;\n }\n get options() {\n return this._def.options;\n }\n get optionsMap() {\n return this._def.optionsMap;\n }\n /**\n * The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor.\n * However, it only allows a union of objects, all of which need to share a discriminator property. This property must\n * have a different value for each object in the union.\n * @param discriminator the name of the discriminator property\n * @param types an array of object schemas\n * @param params\n */\n static create(discriminator, options, params) {\n // Get all the valid discriminator values\n const optionsMap = new Map();\n // try {\n for (const type of options) {\n const discriminatorValues = getDiscriminator(type.shape[discriminator]);\n if (!discriminatorValues.length) {\n throw new Error(`A discriminator value for key \\`${discriminator}\\` could not be extracted from all schema options`);\n }\n for (const value of discriminatorValues) {\n if (optionsMap.has(value)) {\n throw new Error(`Discriminator property ${String(discriminator)} has duplicate value ${String(value)}`);\n }\n optionsMap.set(value, type);\n }\n }\n return new ZodDiscriminatedUnion({\n typeName: ZodFirstPartyTypeKind.ZodDiscriminatedUnion,\n discriminator,\n options,\n optionsMap,\n ...processCreateParams(params),\n });\n }\n}\nfunction mergeValues(a, b) {\n const aType = getParsedType(a);\n const bType = getParsedType(b);\n if (a === b) {\n return { valid: true, data: a };\n }\n else if (aType === ZodParsedType.object && bType === ZodParsedType.object) {\n const bKeys = util.objectKeys(b);\n const sharedKeys = util\n .objectKeys(a)\n .filter((key) => bKeys.indexOf(key) !== -1);\n const newObj = { ...a, ...b };\n for (const key of sharedKeys) {\n const sharedValue = mergeValues(a[key], b[key]);\n if (!sharedValue.valid) {\n return { valid: false };\n }\n newObj[key] = sharedValue.data;\n }\n return { valid: true, data: newObj };\n }\n else if (aType === ZodParsedType.array && bType === ZodParsedType.array) {\n if (a.length !== b.length) {\n return { valid: false };\n }\n const newArray = [];\n for (let index = 0; index < a.length; index++) {\n const itemA = a[index];\n const itemB = b[index];\n const sharedValue = mergeValues(itemA, itemB);\n if (!sharedValue.valid) {\n return { valid: false };\n }\n newArray.push(sharedValue.data);\n }\n return { valid: true, data: newArray };\n }\n else if (aType === ZodParsedType.date &&\n bType === ZodParsedType.date &&\n +a === +b) {\n return { valid: true, data: a };\n }\n else {\n return { valid: false };\n }\n}\nclass ZodIntersection extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const handleParsed = (parsedLeft, parsedRight) => {\n if (isAborted(parsedLeft) || isAborted(parsedRight)) {\n return INVALID;\n }\n const merged = mergeValues(parsedLeft.value, parsedRight.value);\n if (!merged.valid) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_intersection_types,\n });\n return INVALID;\n }\n if (isDirty(parsedLeft) || isDirty(parsedRight)) {\n status.dirty();\n }\n return { status: status.value, value: merged.data };\n };\n if (ctx.common.async) {\n return Promise.all([\n this._def.left._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }),\n this._def.right._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }),\n ]).then(([left, right]) => handleParsed(left, right));\n }\n else {\n return handleParsed(this._def.left._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }), this._def.right._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }));\n }\n }\n}\nZodIntersection.create = (left, right, params) => {\n return new ZodIntersection({\n left: left,\n right: right,\n typeName: ZodFirstPartyTypeKind.ZodIntersection,\n ...processCreateParams(params),\n });\n};\nclass ZodTuple extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (ctx.data.length < this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: \"array\",\n });\n return INVALID;\n }\n const rest = this._def.rest;\n if (!rest && ctx.data.length > this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: \"array\",\n });\n status.dirty();\n }\n const items = [...ctx.data]\n .map((item, itemIndex) => {\n const schema = this._def.items[itemIndex] || this._def.rest;\n if (!schema)\n return null;\n return schema._parse(new ParseInputLazyPath(ctx, item, ctx.path, itemIndex));\n })\n .filter((x) => !!x); // filter nulls\n if (ctx.common.async) {\n return Promise.all(items).then((results) => {\n return ParseStatus.mergeArray(status, results);\n });\n }\n else {\n return ParseStatus.mergeArray(status, items);\n }\n }\n get items() {\n return this._def.items;\n }\n rest(rest) {\n return new ZodTuple({\n ...this._def,\n rest,\n });\n }\n}\nZodTuple.create = (schemas, params) => {\n if (!Array.isArray(schemas)) {\n throw new Error(\"You must pass an array of schemas to z.tuple([ ... ])\");\n }\n return new ZodTuple({\n items: schemas,\n typeName: ZodFirstPartyTypeKind.ZodTuple,\n rest: null,\n ...processCreateParams(params),\n });\n};\nclass ZodRecord extends ZodType {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const pairs = [];\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n for (const key in ctx.data) {\n pairs.push({\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, key)),\n value: valueType._parse(new ParseInputLazyPath(ctx, ctx.data[key], ctx.path, key)),\n alwaysSet: key in ctx.data,\n });\n }\n if (ctx.common.async) {\n return ParseStatus.mergeObjectAsync(status, pairs);\n }\n else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get element() {\n return this._def.valueType;\n }\n static create(first, second, third) {\n if (second instanceof ZodType) {\n return new ZodRecord({\n keyType: first,\n valueType: second,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(third),\n });\n }\n return new ZodRecord({\n keyType: ZodString.create(),\n valueType: first,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(second),\n });\n }\n}\nclass ZodMap extends ZodType {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.map) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.map,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n const pairs = [...ctx.data.entries()].map(([key, value], index) => {\n return {\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, [index, \"key\"])),\n value: valueType._parse(new ParseInputLazyPath(ctx, value, ctx.path, [index, \"value\"])),\n };\n });\n if (ctx.common.async) {\n const finalMap = new Map();\n return Promise.resolve().then(async () => {\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return { status: status.value, value: finalMap };\n });\n }\n else {\n const finalMap = new Map();\n for (const pair of pairs) {\n const key = pair.key;\n const value = pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return { status: status.value, value: finalMap };\n }\n }\n}\nZodMap.create = (keyType, valueType, params) => {\n return new ZodMap({\n valueType,\n keyType,\n typeName: ZodFirstPartyTypeKind.ZodMap,\n ...processCreateParams(params),\n });\n};\nclass ZodSet extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.set) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.set,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const def = this._def;\n if (def.minSize !== null) {\n if (ctx.data.size < def.minSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minSize.value,\n type: \"set\",\n inclusive: true,\n exact: false,\n message: def.minSize.message,\n });\n status.dirty();\n }\n }\n if (def.maxSize !== null) {\n if (ctx.data.size > def.maxSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxSize.value,\n type: \"set\",\n inclusive: true,\n exact: false,\n message: def.maxSize.message,\n });\n status.dirty();\n }\n }\n const valueType = this._def.valueType;\n function finalizeSet(elements) {\n const parsedSet = new Set();\n for (const element of elements) {\n if (element.status === \"aborted\")\n return INVALID;\n if (element.status === \"dirty\")\n status.dirty();\n parsedSet.add(element.value);\n }\n return { status: status.value, value: parsedSet };\n }\n const elements = [...ctx.data.values()].map((item, i) => valueType._parse(new ParseInputLazyPath(ctx, item, ctx.path, i)));\n if (ctx.common.async) {\n return Promise.all(elements).then((elements) => finalizeSet(elements));\n }\n else {\n return finalizeSet(elements);\n }\n }\n min(minSize, message) {\n return new ZodSet({\n ...this._def,\n minSize: { value: minSize, message: errorUtil.toString(message) },\n });\n }\n max(maxSize, message) {\n return new ZodSet({\n ...this._def,\n maxSize: { value: maxSize, message: errorUtil.toString(message) },\n });\n }\n size(size, message) {\n return this.min(size, message).max(size, message);\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodSet.create = (valueType, params) => {\n return new ZodSet({\n valueType,\n minSize: null,\n maxSize: null,\n typeName: ZodFirstPartyTypeKind.ZodSet,\n ...processCreateParams(params),\n });\n};\nclass ZodFunction extends ZodType {\n constructor() {\n super(...arguments);\n this.validate = this.implement;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.function) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.function,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n function makeArgsIssue(args, error) {\n return makeIssue({\n data: args,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap,\n ctx.schemaErrorMap,\n getErrorMap(),\n errorMap,\n ].filter((x) => !!x),\n issueData: {\n code: ZodIssueCode.invalid_arguments,\n argumentsError: error,\n },\n });\n }\n function makeReturnsIssue(returns, error) {\n return makeIssue({\n data: returns,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap,\n ctx.schemaErrorMap,\n getErrorMap(),\n errorMap,\n ].filter((x) => !!x),\n issueData: {\n code: ZodIssueCode.invalid_return_type,\n returnTypeError: error,\n },\n });\n }\n const params = { errorMap: ctx.common.contextualErrorMap };\n const fn = ctx.data;\n if (this._def.returns instanceof ZodPromise) {\n // Would love a way to avoid disabling this rule, but we need\n // an alias (using an arrow function was what caused 2651).\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const me = this;\n return OK(async function (...args) {\n const error = new ZodError([]);\n const parsedArgs = await me._def.args\n .parseAsync(args, params)\n .catch((e) => {\n error.addIssue(makeArgsIssue(args, e));\n throw error;\n });\n const result = await Reflect.apply(fn, this, parsedArgs);\n const parsedReturns = await me._def.returns._def.type\n .parseAsync(result, params)\n .catch((e) => {\n error.addIssue(makeReturnsIssue(result, e));\n throw error;\n });\n return parsedReturns;\n });\n }\n else {\n // Would love a way to avoid disabling this rule, but we need\n // an alias (using an arrow function was what caused 2651).\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const me = this;\n return OK(function (...args) {\n const parsedArgs = me._def.args.safeParse(args, params);\n if (!parsedArgs.success) {\n throw new ZodError([makeArgsIssue(args, parsedArgs.error)]);\n }\n const result = Reflect.apply(fn, this, parsedArgs.data);\n const parsedReturns = me._def.returns.safeParse(result, params);\n if (!parsedReturns.success) {\n throw new ZodError([makeReturnsIssue(result, parsedReturns.error)]);\n }\n return parsedReturns.data;\n });\n }\n }\n parameters() {\n return this._def.args;\n }\n returnType() {\n return this._def.returns;\n }\n args(...items) {\n return new ZodFunction({\n ...this._def,\n args: ZodTuple.create(items).rest(ZodUnknown.create()),\n });\n }\n returns(returnType) {\n return new ZodFunction({\n ...this._def,\n returns: returnType,\n });\n }\n implement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n strictImplement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n static create(args, returns, params) {\n return new ZodFunction({\n args: (args\n ? args\n : ZodTuple.create([]).rest(ZodUnknown.create())),\n returns: returns || ZodUnknown.create(),\n typeName: ZodFirstPartyTypeKind.ZodFunction,\n ...processCreateParams(params),\n });\n }\n}\nclass ZodLazy extends ZodType {\n get schema() {\n return this._def.getter();\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const lazySchema = this._def.getter();\n return lazySchema._parse({ data: ctx.data, path: ctx.path, parent: ctx });\n }\n}\nZodLazy.create = (getter, params) => {\n return new ZodLazy({\n getter: getter,\n typeName: ZodFirstPartyTypeKind.ZodLazy,\n ...processCreateParams(params),\n });\n};\nclass ZodLiteral extends ZodType {\n _parse(input) {\n if (input.data !== this._def.value) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_literal,\n expected: this._def.value,\n });\n return INVALID;\n }\n return { status: \"valid\", value: input.data };\n }\n get value() {\n return this._def.value;\n }\n}\nZodLiteral.create = (value, params) => {\n return new ZodLiteral({\n value: value,\n typeName: ZodFirstPartyTypeKind.ZodLiteral,\n ...processCreateParams(params),\n });\n};\nfunction createZodEnum(values, params) {\n return new ZodEnum({\n values,\n typeName: ZodFirstPartyTypeKind.ZodEnum,\n ...processCreateParams(params),\n });\n}\nclass ZodEnum extends ZodType {\n constructor() {\n super(...arguments);\n _ZodEnum_cache.set(this, void 0);\n }\n _parse(input) {\n if (typeof input.data !== \"string\") {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type,\n });\n return INVALID;\n }\n if (!__classPrivateFieldGet(this, _ZodEnum_cache, \"f\")) {\n __classPrivateFieldSet(this, _ZodEnum_cache, new Set(this._def.values), \"f\");\n }\n if (!__classPrivateFieldGet(this, _ZodEnum_cache, \"f\").has(input.data)) {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get options() {\n return this._def.values;\n }\n get enum() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Values() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Enum() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n extract(values, newDef = this._def) {\n return ZodEnum.create(values, {\n ...this._def,\n ...newDef,\n });\n }\n exclude(values, newDef = this._def) {\n return ZodEnum.create(this.options.filter((opt) => !values.includes(opt)), {\n ...this._def,\n ...newDef,\n });\n }\n}\n_ZodEnum_cache = new WeakMap();\nZodEnum.create = createZodEnum;\nclass ZodNativeEnum extends ZodType {\n constructor() {\n super(...arguments);\n _ZodNativeEnum_cache.set(this, void 0);\n }\n _parse(input) {\n const nativeEnumValues = util.getValidEnumValues(this._def.values);\n const ctx = this._getOrReturnCtx(input);\n if (ctx.parsedType !== ZodParsedType.string &&\n ctx.parsedType !== ZodParsedType.number) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type,\n });\n return INVALID;\n }\n if (!__classPrivateFieldGet(this, _ZodNativeEnum_cache, \"f\")) {\n __classPrivateFieldSet(this, _ZodNativeEnum_cache, new Set(util.getValidEnumValues(this._def.values)), \"f\");\n }\n if (!__classPrivateFieldGet(this, _ZodNativeEnum_cache, \"f\").has(input.data)) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get enum() {\n return this._def.values;\n }\n}\n_ZodNativeEnum_cache = new WeakMap();\nZodNativeEnum.create = (values, params) => {\n return new ZodNativeEnum({\n values: values,\n typeName: ZodFirstPartyTypeKind.ZodNativeEnum,\n ...processCreateParams(params),\n });\n};\nclass ZodPromise extends ZodType {\n unwrap() {\n return this._def.type;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.promise &&\n ctx.common.async === false) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.promise,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const promisified = ctx.parsedType === ZodParsedType.promise\n ? ctx.data\n : Promise.resolve(ctx.data);\n return OK(promisified.then((data) => {\n return this._def.type.parseAsync(data, {\n path: ctx.path,\n errorMap: ctx.common.contextualErrorMap,\n });\n }));\n }\n}\nZodPromise.create = (schema, params) => {\n return new ZodPromise({\n type: schema,\n typeName: ZodFirstPartyTypeKind.ZodPromise,\n ...processCreateParams(params),\n });\n};\nclass ZodEffects extends ZodType {\n innerType() {\n return this._def.schema;\n }\n sourceType() {\n return this._def.schema._def.typeName === ZodFirstPartyTypeKind.ZodEffects\n ? this._def.schema.sourceType()\n : this._def.schema;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const effect = this._def.effect || null;\n const checkCtx = {\n addIssue: (arg) => {\n addIssueToContext(ctx, arg);\n if (arg.fatal) {\n status.abort();\n }\n else {\n status.dirty();\n }\n },\n get path() {\n return ctx.path;\n },\n };\n checkCtx.addIssue = checkCtx.addIssue.bind(checkCtx);\n if (effect.type === \"preprocess\") {\n const processed = effect.transform(ctx.data, checkCtx);\n if (ctx.common.async) {\n return Promise.resolve(processed).then(async (processed) => {\n if (status.value === \"aborted\")\n return INVALID;\n const result = await this._def.schema._parseAsync({\n data: processed,\n path: ctx.path,\n parent: ctx,\n });\n if (result.status === \"aborted\")\n return INVALID;\n if (result.status === \"dirty\")\n return DIRTY(result.value);\n if (status.value === \"dirty\")\n return DIRTY(result.value);\n return result;\n });\n }\n else {\n if (status.value === \"aborted\")\n return INVALID;\n const result = this._def.schema._parseSync({\n data: processed,\n path: ctx.path,\n parent: ctx,\n });\n if (result.status === \"aborted\")\n return INVALID;\n if (result.status === \"dirty\")\n return DIRTY(result.value);\n if (status.value === \"dirty\")\n return DIRTY(result.value);\n return result;\n }\n }\n if (effect.type === \"refinement\") {\n const executeRefinement = (acc) => {\n const result = effect.refinement(acc, checkCtx);\n if (ctx.common.async) {\n return Promise.resolve(result);\n }\n if (result instanceof Promise) {\n throw new Error(\"Async refinement encountered during synchronous parse operation. Use .parseAsync instead.\");\n }\n return acc;\n };\n if (ctx.common.async === false) {\n const inner = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inner.status === \"aborted\")\n return INVALID;\n if (inner.status === \"dirty\")\n status.dirty();\n // return value is ignored\n executeRefinement(inner.value);\n return { status: status.value, value: inner.value };\n }\n else {\n return this._def.schema\n ._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx })\n .then((inner) => {\n if (inner.status === \"aborted\")\n return INVALID;\n if (inner.status === \"dirty\")\n status.dirty();\n return executeRefinement(inner.value).then(() => {\n return { status: status.value, value: inner.value };\n });\n });\n }\n }\n if (effect.type === \"transform\") {\n if (ctx.common.async === false) {\n const base = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (!isValid(base))\n return base;\n const result = effect.transform(base.value, checkCtx);\n if (result instanceof Promise) {\n throw new Error(`Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.`);\n }\n return { status: status.value, value: result };\n }\n else {\n return this._def.schema\n ._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx })\n .then((base) => {\n if (!isValid(base))\n return base;\n return Promise.resolve(effect.transform(base.value, checkCtx)).then((result) => ({ status: status.value, value: result }));\n });\n }\n }\n util.assertNever(effect);\n }\n}\nZodEffects.create = (schema, effect, params) => {\n return new ZodEffects({\n schema,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect,\n ...processCreateParams(params),\n });\n};\nZodEffects.createWithPreprocess = (preprocess, schema, params) => {\n return new ZodEffects({\n schema,\n effect: { type: \"preprocess\", transform: preprocess },\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n ...processCreateParams(params),\n });\n};\nclass ZodOptional extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.undefined) {\n return OK(undefined);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodOptional.create = (type, params) => {\n return new ZodOptional({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodOptional,\n ...processCreateParams(params),\n });\n};\nclass ZodNullable extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.null) {\n return OK(null);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodNullable.create = (type, params) => {\n return new ZodNullable({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodNullable,\n ...processCreateParams(params),\n });\n};\nclass ZodDefault extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n let data = ctx.data;\n if (ctx.parsedType === ZodParsedType.undefined) {\n data = this._def.defaultValue();\n }\n return this._def.innerType._parse({\n data,\n path: ctx.path,\n parent: ctx,\n });\n }\n removeDefault() {\n return this._def.innerType;\n }\n}\nZodDefault.create = (type, params) => {\n return new ZodDefault({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodDefault,\n defaultValue: typeof params.default === \"function\"\n ? params.default\n : () => params.default,\n ...processCreateParams(params),\n });\n};\nclass ZodCatch extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n // newCtx is used to not collect issues from inner types in ctx\n const newCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n };\n const result = this._def.innerType._parse({\n data: newCtx.data,\n path: newCtx.path,\n parent: {\n ...newCtx,\n },\n });\n if (isAsync(result)) {\n return result.then((result) => {\n return {\n status: \"valid\",\n value: result.status === \"valid\"\n ? result.value\n : this._def.catchValue({\n get error() {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data,\n }),\n };\n });\n }\n else {\n return {\n status: \"valid\",\n value: result.status === \"valid\"\n ? result.value\n : this._def.catchValue({\n get error() {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data,\n }),\n };\n }\n }\n removeCatch() {\n return this._def.innerType;\n }\n}\nZodCatch.create = (type, params) => {\n return new ZodCatch({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodCatch,\n catchValue: typeof params.catch === \"function\" ? params.catch : () => params.catch,\n ...processCreateParams(params),\n });\n};\nclass ZodNaN extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.nan) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.nan,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return { status: \"valid\", value: input.data };\n }\n}\nZodNaN.create = (params) => {\n return new ZodNaN({\n typeName: ZodFirstPartyTypeKind.ZodNaN,\n ...processCreateParams(params),\n });\n};\nconst BRAND = Symbol(\"zod_brand\");\nclass ZodBranded extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const data = ctx.data;\n return this._def.type._parse({\n data,\n path: ctx.path,\n parent: ctx,\n });\n }\n unwrap() {\n return this._def.type;\n }\n}\nclass ZodPipeline extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.common.async) {\n const handleAsync = async () => {\n const inResult = await this._def.in._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inResult.status === \"aborted\")\n return INVALID;\n if (inResult.status === \"dirty\") {\n status.dirty();\n return DIRTY(inResult.value);\n }\n else {\n return this._def.out._parseAsync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx,\n });\n }\n };\n return handleAsync();\n }\n else {\n const inResult = this._def.in._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inResult.status === \"aborted\")\n return INVALID;\n if (inResult.status === \"dirty\") {\n status.dirty();\n return {\n status: \"dirty\",\n value: inResult.value,\n };\n }\n else {\n return this._def.out._parseSync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n }\n static create(a, b) {\n return new ZodPipeline({\n in: a,\n out: b,\n typeName: ZodFirstPartyTypeKind.ZodPipeline,\n });\n }\n}\nclass ZodReadonly extends ZodType {\n _parse(input) {\n const result = this._def.innerType._parse(input);\n const freeze = (data) => {\n if (isValid(data)) {\n data.value = Object.freeze(data.value);\n }\n return data;\n };\n return isAsync(result)\n ? result.then((data) => freeze(data))\n : freeze(result);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodReadonly.create = (type, params) => {\n return new ZodReadonly({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodReadonly,\n ...processCreateParams(params),\n });\n};\nfunction custom(check, params = {}, \n/**\n * @deprecated\n *\n * Pass `fatal` into the params object instead:\n *\n * ```ts\n * z.string().custom((val) => val.length > 5, { fatal: false })\n * ```\n *\n */\nfatal) {\n if (check)\n return ZodAny.create().superRefine((data, ctx) => {\n var _a, _b;\n if (!check(data)) {\n const p = typeof params === \"function\"\n ? params(data)\n : typeof params === \"string\"\n ? { message: params }\n : params;\n const _fatal = (_b = (_a = p.fatal) !== null && _a !== void 0 ? _a : fatal) !== null && _b !== void 0 ? _b : true;\n const p2 = typeof p === \"string\" ? { message: p } : p;\n ctx.addIssue({ code: \"custom\", ...p2, fatal: _fatal });\n }\n });\n return ZodAny.create();\n}\nconst late = {\n object: ZodObject.lazycreate,\n};\nvar ZodFirstPartyTypeKind;\n(function (ZodFirstPartyTypeKind) {\n ZodFirstPartyTypeKind[\"ZodString\"] = \"ZodString\";\n ZodFirstPartyTypeKind[\"ZodNumber\"] = \"ZodNumber\";\n ZodFirstPartyTypeKind[\"ZodNaN\"] = \"ZodNaN\";\n ZodFirstPartyTypeKind[\"ZodBigInt\"] = \"ZodBigInt\";\n ZodFirstPartyTypeKind[\"ZodBoolean\"] = \"ZodBoolean\";\n ZodFirstPartyTypeKind[\"ZodDate\"] = \"ZodDate\";\n ZodFirstPartyTypeKind[\"ZodSymbol\"] = \"ZodSymbol\";\n ZodFirstPartyTypeKind[\"ZodUndefined\"] = \"ZodUndefined\";\n ZodFirstPartyTypeKind[\"ZodNull\"] = \"ZodNull\";\n ZodFirstPartyTypeKind[\"ZodAny\"] = \"ZodAny\";\n ZodFirstPartyTypeKind[\"ZodUnknown\"] = \"ZodUnknown\";\n ZodFirstPartyTypeKind[\"ZodNever\"] = \"ZodNever\";\n ZodFirstPartyTypeKind[\"ZodVoid\"] = \"ZodVoid\";\n ZodFirstPartyTypeKind[\"ZodArray\"] = \"ZodArray\";\n ZodFirstPartyTypeKind[\"ZodObject\"] = \"ZodObject\";\n ZodFirstPartyTypeKind[\"ZodUnion\"] = \"ZodUnion\";\n ZodFirstPartyTypeKind[\"ZodDiscriminatedUnion\"] = \"ZodDiscriminatedUnion\";\n ZodFirstPartyTypeKind[\"ZodIntersection\"] = \"ZodIntersection\";\n ZodFirstPartyTypeKind[\"ZodTuple\"] = \"ZodTuple\";\n ZodFirstPartyTypeKind[\"ZodRecord\"] = \"ZodRecord\";\n ZodFirstPartyTypeKind[\"ZodMap\"] = \"ZodMap\";\n ZodFirstPartyTypeKind[\"ZodSet\"] = \"ZodSet\";\n ZodFirstPartyTypeKind[\"ZodFunction\"] = \"ZodFunction\";\n ZodFirstPartyTypeKind[\"ZodLazy\"] = \"ZodLazy\";\n ZodFirstPartyTypeKind[\"ZodLiteral\"] = \"ZodLiteral\";\n ZodFirstPartyTypeKind[\"ZodEnum\"] = \"ZodEnum\";\n ZodFirstPartyTypeKind[\"ZodEffects\"] = \"ZodEffects\";\n ZodFirstPartyTypeKind[\"ZodNativeEnum\"] = \"ZodNativeEnum\";\n ZodFirstPartyTypeKind[\"ZodOptional\"] = \"ZodOptional\";\n ZodFirstPartyTypeKind[\"ZodNullable\"] = \"ZodNullable\";\n ZodFirstPartyTypeKind[\"ZodDefault\"] = \"ZodDefault\";\n ZodFirstPartyTypeKind[\"ZodCatch\"] = \"ZodCatch\";\n ZodFirstPartyTypeKind[\"ZodPromise\"] = \"ZodPromise\";\n ZodFirstPartyTypeKind[\"ZodBranded\"] = \"ZodBranded\";\n ZodFirstPartyTypeKind[\"ZodPipeline\"] = \"ZodPipeline\";\n ZodFirstPartyTypeKind[\"ZodReadonly\"] = \"ZodReadonly\";\n})(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {}));\nconst instanceOfType = (\n// const instanceOfType = any>(\ncls, params = {\n message: `Input not instance of ${cls.name}`,\n}) => custom((data) => data instanceof cls, params);\nconst stringType = ZodString.create;\nconst numberType = ZodNumber.create;\nconst nanType = ZodNaN.create;\nconst bigIntType = ZodBigInt.create;\nconst booleanType = ZodBoolean.create;\nconst dateType = ZodDate.create;\nconst symbolType = ZodSymbol.create;\nconst undefinedType = ZodUndefined.create;\nconst nullType = ZodNull.create;\nconst anyType = ZodAny.create;\nconst unknownType = ZodUnknown.create;\nconst neverType = ZodNever.create;\nconst voidType = ZodVoid.create;\nconst arrayType = ZodArray.create;\nconst objectType = ZodObject.create;\nconst strictObjectType = ZodObject.strictCreate;\nconst unionType = ZodUnion.create;\nconst discriminatedUnionType = ZodDiscriminatedUnion.create;\nconst intersectionType = ZodIntersection.create;\nconst tupleType = ZodTuple.create;\nconst recordType = ZodRecord.create;\nconst mapType = ZodMap.create;\nconst setType = ZodSet.create;\nconst functionType = ZodFunction.create;\nconst lazyType = ZodLazy.create;\nconst literalType = ZodLiteral.create;\nconst enumType = ZodEnum.create;\nconst nativeEnumType = ZodNativeEnum.create;\nconst promiseType = ZodPromise.create;\nconst effectsType = ZodEffects.create;\nconst optionalType = ZodOptional.create;\nconst nullableType = ZodNullable.create;\nconst preprocessType = ZodEffects.createWithPreprocess;\nconst pipelineType = ZodPipeline.create;\nconst ostring = () => stringType().optional();\nconst onumber = () => numberType().optional();\nconst oboolean = () => booleanType().optional();\nconst coerce = {\n string: ((arg) => ZodString.create({ ...arg, coerce: true })),\n number: ((arg) => ZodNumber.create({ ...arg, coerce: true })),\n boolean: ((arg) => ZodBoolean.create({\n ...arg,\n coerce: true,\n })),\n bigint: ((arg) => ZodBigInt.create({ ...arg, coerce: true })),\n date: ((arg) => ZodDate.create({ ...arg, coerce: true })),\n};\nconst NEVER = INVALID;\n\nvar z = /*#__PURE__*/Object.freeze({\n __proto__: null,\n defaultErrorMap: errorMap,\n setErrorMap: setErrorMap,\n getErrorMap: getErrorMap,\n makeIssue: makeIssue,\n EMPTY_PATH: EMPTY_PATH,\n addIssueToContext: addIssueToContext,\n ParseStatus: ParseStatus,\n INVALID: INVALID,\n DIRTY: DIRTY,\n OK: OK,\n isAborted: isAborted,\n isDirty: isDirty,\n isValid: isValid,\n isAsync: isAsync,\n get util () { return util; },\n get objectUtil () { return objectUtil; },\n ZodParsedType: ZodParsedType,\n getParsedType: getParsedType,\n ZodType: ZodType,\n datetimeRegex: datetimeRegex,\n ZodString: ZodString,\n ZodNumber: ZodNumber,\n ZodBigInt: ZodBigInt,\n ZodBoolean: ZodBoolean,\n ZodDate: ZodDate,\n ZodSymbol: ZodSymbol,\n ZodUndefined: ZodUndefined,\n ZodNull: ZodNull,\n ZodAny: ZodAny,\n ZodUnknown: ZodUnknown,\n ZodNever: ZodNever,\n ZodVoid: ZodVoid,\n ZodArray: ZodArray,\n ZodObject: ZodObject,\n ZodUnion: ZodUnion,\n ZodDiscriminatedUnion: ZodDiscriminatedUnion,\n ZodIntersection: ZodIntersection,\n ZodTuple: ZodTuple,\n ZodRecord: ZodRecord,\n ZodMap: ZodMap,\n ZodSet: ZodSet,\n ZodFunction: ZodFunction,\n ZodLazy: ZodLazy,\n ZodLiteral: ZodLiteral,\n ZodEnum: ZodEnum,\n ZodNativeEnum: ZodNativeEnum,\n ZodPromise: ZodPromise,\n ZodEffects: ZodEffects,\n ZodTransformer: ZodEffects,\n ZodOptional: ZodOptional,\n ZodNullable: ZodNullable,\n ZodDefault: ZodDefault,\n ZodCatch: ZodCatch,\n ZodNaN: ZodNaN,\n BRAND: BRAND,\n ZodBranded: ZodBranded,\n ZodPipeline: ZodPipeline,\n ZodReadonly: ZodReadonly,\n custom: custom,\n Schema: ZodType,\n ZodSchema: ZodType,\n late: late,\n get ZodFirstPartyTypeKind () { return ZodFirstPartyTypeKind; },\n coerce: coerce,\n any: anyType,\n array: arrayType,\n bigint: bigIntType,\n boolean: booleanType,\n date: dateType,\n discriminatedUnion: discriminatedUnionType,\n effect: effectsType,\n 'enum': enumType,\n 'function': functionType,\n 'instanceof': instanceOfType,\n intersection: intersectionType,\n lazy: lazyType,\n literal: literalType,\n map: mapType,\n nan: nanType,\n nativeEnum: nativeEnumType,\n never: neverType,\n 'null': nullType,\n nullable: nullableType,\n number: numberType,\n object: objectType,\n oboolean: oboolean,\n onumber: onumber,\n optional: optionalType,\n ostring: ostring,\n pipeline: pipelineType,\n preprocess: preprocessType,\n promise: promiseType,\n record: recordType,\n set: setType,\n strictObject: strictObjectType,\n string: stringType,\n symbol: symbolType,\n transformer: effectsType,\n tuple: tupleType,\n 'undefined': undefinedType,\n union: unionType,\n unknown: unknownType,\n 'void': voidType,\n NEVER: NEVER,\n ZodIssueCode: ZodIssueCode,\n quotelessJson: quotelessJson,\n ZodError: ZodError\n});\n\nexport { BRAND, DIRTY, EMPTY_PATH, INVALID, NEVER, OK, ParseStatus, ZodType as Schema, ZodAny, ZodArray, ZodBigInt, ZodBoolean, ZodBranded, ZodCatch, ZodDate, ZodDefault, ZodDiscriminatedUnion, ZodEffects, ZodEnum, ZodError, ZodFirstPartyTypeKind, ZodFunction, ZodIntersection, ZodIssueCode, ZodLazy, ZodLiteral, ZodMap, ZodNaN, ZodNativeEnum, ZodNever, ZodNull, ZodNullable, ZodNumber, ZodObject, ZodOptional, ZodParsedType, ZodPipeline, ZodPromise, ZodReadonly, ZodRecord, ZodType as ZodSchema, ZodSet, ZodString, ZodSymbol, ZodEffects as ZodTransformer, ZodTuple, ZodType, ZodUndefined, ZodUnion, ZodUnknown, ZodVoid, addIssueToContext, anyType as any, arrayType as array, bigIntType as bigint, booleanType as boolean, coerce, custom, dateType as date, datetimeRegex, z as default, errorMap as defaultErrorMap, discriminatedUnionType as discriminatedUnion, effectsType as effect, enumType as enum, functionType as function, getErrorMap, getParsedType, instanceOfType as instanceof, intersectionType as intersection, isAborted, isAsync, isDirty, isValid, late, lazyType as lazy, literalType as literal, makeIssue, mapType as map, nanType as nan, nativeEnumType as nativeEnum, neverType as never, nullType as null, nullableType as nullable, numberType as number, objectType as object, objectUtil, oboolean, onumber, optionalType as optional, ostring, pipelineType as pipeline, preprocessType as preprocess, promiseType as promise, quotelessJson, recordType as record, setType as set, setErrorMap, strictObjectType as strictObject, stringType as string, symbolType as symbol, effectsType as transformer, tupleType as tuple, undefinedType as undefined, unionType as union, unknownType as unknown, util, voidType as void, z };\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","\r\nimport * as ex from \"excalibur\";\r\nimport { Player } from './player';\r\nimport { Resources, loader } from \"./resources\";\r\nex.Flags.useLegacyImageRenderer();\r\nconst game = new ex.Engine({\r\n resolution: {\r\n width: 256,\r\n height: 256,\r\n },\r\n suppressPlayButton: false,\r\n pixelArt: true,\r\n pixelRatio: 4,\r\n displayMode: ex.DisplayMode.FitScreen,\r\n});\r\n\r\ngame.start(loader).then(() => {\r\n console.log('Game start!');\r\n\r\n Resources.LdtkPureAutoTile.addToScene(game.currentScene, {\r\n pos: ex.vec(0, 0)\r\n });\r\n});"],"names":[],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"pureautotile/pureautotile.js","mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD,O;;;;;;;;;;;;;;;ACVuD;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC,qCAAqC;AACrC,qCAAqC;AACrC,sCAAsC;AACtC,sCAAsC;AACtC;AACA;AACO;AACP;AACA;AACA;AACA;AACA,gBAAgB,oEAAe;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,UAAU;AACxF;AACA;AACA,6DAA6D,2BAA2B;AACxF;AACA;AACA,mC;;;;;;;;;;;;;;;AC3C+D;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA,eAAe,2DAAgB;AAC/B,eAAe,2DAAgB;AAC/B;AACA;AACA;AACA;AACA,cAAc,0DAAe;AAC7B;AACA;AACA;AACA;AACA,eAAe,0DAAe;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA,2C;;;;;;;;;;;;;;;;AC5BO;AACA;AACP;AACA;AACA;AACA;AACA;AACA,+DAA+D,QAAQ;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP,oBAAoB,kCAAkC;AACtD;AACA;AACA;AACA;AACA;AACA;AACA,iC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB,0BAAmB,EAAE,8BAAmB;;AAExD,8BAAmB,GAAG,0BAAmB;AACzC,qBAAqB,8BAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,4GAA4G,8BAAmB;AAC/H,iIAAiI,8BAAmB;AACpJ,qGAAqG,8BAAmB;AACxH,0HAA0H,8BAAmB;AAC7I;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD,iDAAiD;AACjD,gDAAgD;AAChD,+CAA+C;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,8FAA8F,MAAM,YAAY,aAAa,WAAW,YAAY,WAAW,MAAM,OAAO,aAAa,WAAW,YAAY,aAAa,WAAW,YAAY,WAAW,YAAY,WAAW,UAAU,YAAY,OAAO,OAAO,aAAa,cAAc,yBAAyB,yBAAyB,yBAAyB,yBAAyB,aAAa,OAAO,OAAO,MAAM,KAAK,YAAY,WAAW,YAAY,aAAa,WAAW,UAAU,UAAU,UAAU,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,UAAU,YAAY,WAAW,UAAU,MAAM,MAAM,YAAY,OAAO,KAAK,YAAY,aAAa,OAAO,KAAK,YAAY,OAAO,KAAK,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,MAAM,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,MAAM,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,MAAM,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,MAAM,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,kFAAkF,4BAA4B,yBAAyB,mBAAmB,yBAAyB,mBAAmB,0BAA0B,4BAA4B,kCAAkC,uCAAuC,gBAAgB,4BAA4B,0BAA0B,qBAAqB,8BAA8B,sBAAsB,0BAA0B,qBAAqB,sBAAsB,yBAAyB,mFAAmF,+BAA+B,4BAA4B,4DAA4D,0FAA0F,sEAAsE,0EAA0E,iEAAiE,KAAK,qCAAqC,oBAAoB,KAAK,uCAAuC,yBAAyB,kBAAkB,wBAAwB,8DAA8D,iBAAiB,gBAAgB,eAAe,gBAAgB,KAAK,sCAAsC,yBAAyB,kBAAkB,wBAAwB,iBAAiB,gBAAgB,0BAA0B,kBAAkB,mBAAmB,KAAK,qEAAqE,0BAA0B,KAAK,qCAAqC,8BAA8B,2BAA2B,KAAK,sCAAsC,6BAA6B,KAAK,4CAA4C,YAAY,mBAAmB,OAAO,UAAU,mBAAmB,OAAO,KAAK,uEAAuE,YAAY,mBAAmB,OAAO,UAAU,mBAAmB,OAAO,KAAK,6FAA6F,YAAY,mBAAmB,OAAO,UAAU,mBAAmB,OAAO,KAAK,2EAA2E,YAAY,mBAAmB,OAAO,UAAU,mBAAmB,OAAO,KAAK,qEAAqE,YAAY,mBAAmB,OAAO,UAAU,mBAAmB,OAAO,KAAK,uBAAuB;AAClmH;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,gBAAgB,0BAAmB,EAAE,+BAAmB;;AAExD,+BAAmB,GAAG,0BAAmB;AACzC,qBAAqB,+BAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,4GAA4G,+BAAmB;AAC/H,iIAAiI,+BAAmB;AACpJ,qGAAqG,+BAAmB;AACxH,0HAA0H,+BAAmB;AAC7I;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,mFAAmF,YAAY,WAAW,UAAU,UAAU,UAAU,MAAM,KAAK,UAAU,YAAY,WAAW,aAAa,WAAW,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,OAAO,KAAK,YAAY,+CAA+C,yBAAyB,gBAAgB,qBAAqB,gBAAgB,aAAa,KAAK,2BAA2B,iBAAiB,yBAAyB,oBAAoB,qCAAqC,wBAAwB,sBAAsB,sBAAsB,8BAA8B,yBAAyB,gCAAgC,2CAA2C,KAAK,kCAAkC,6BAA6B,KAAK,uBAAuB;AACr2B;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA,gDAAgD;AAChD;AACA;AACA,qFAAqF;AACrF;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,qBAAqB;AACrB;AACA;AACA,qBAAqB;AACrB;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,iBAAiB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,qBAAqB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,sFAAsF,qBAAqB;AAC3G;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,iDAAiD,qBAAqB;AACtE;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,sDAAsD,qBAAqB;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAO;;AAEP;AACA;AACA;AACA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,cAAc;AACrE;AACA;AACA;AACA;AACA;;AAEA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,2GAA2G,oCAAoC,mEAAmE,8DAA8D,uEAAuE,yCAAyC,2BAA2B,qBAAqB,wEAAwE,+BAA+B,uCAAuC,mHAAmH,oCAAoC,wEAAwE,iDAAiD,kHAAkH,4JAA4J,yCAAyC,uCAAuC,2CAA2C,2BAA2B,wEAAwE,kDAAkD,8CAA8C,6BAA6B,KAAK;;AAE57C,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,wGAAwG,yCAAyC,kBAAkB,0CAA0C,wBAAwB,wBAAwB,qBAAqB,8BAA8B,2BAA2B,mCAAmC,gCAAgC,8BAA8B,yBAAyB,6HAA6H,uDAAuD,sFAAsF,gFAAgF,mGAAmG,+GAA+G,KAAK;;AAEt/B,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6GAA6G,0CAA0C,mFAAmF,gCAAgC,iCAAiC,2BAA2B,uBAAuB,+CAA+C,yBAAyB,qBAAqB,2BAA2B,mJAAmJ,qCAAqC,oCAAoC,8BAA8B,iDAAiD,oCAAoC,KAAK,oDAAoD,8CAA8C,KAAK,yDAAyD,0CAA0C,KAAK,iGAAiG,mDAAmD,6CAA6C,KAAK,oBAAoB,+PAA+P,sJAAsJ,wDAAwD,wDAAwD,wEAAwE,oCAAoC,iCAAiC,KAAK;;AAEz2D,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,oHAAoH,0CAA0C,wBAAwB,4CAA4C,6CAA6C,6CAA6C,6CAA6C,8CAA8C,wBAAwB,+FAA+F,mBAAmB,sEAAsE,yDAAyD,mCAAmC,6CAA6C,sBAAsB,6CAA6C,sBAAsB,2CAA2C,oBAAoB,8BAA8B,oBAAoB,uOAAuO,+DAA+D,2EAA2E,gCAAgC,8BAA8B,0BAA0B,0BAA0B,oBAAoB,wCAAwC,sBAAsB,KAAK;;AAEp/C,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6GAA6G,0CAA0C,yDAAyD,mFAAmF,gCAAgC,yCAAyC,uBAAuB,sBAAsB,2BAA2B,mJAAmJ,qCAAqC,sCAAsC,8BAA8B,iDAAiD,sCAAsC,KAAK,oBAAoB,iQAAiQ,uJAAuJ,gCAAgC,6BAA6B,KAAK;;AAE1vC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,wGAAwG,yCAAyC,wBAAwB,+CAA+C,wBAAwB,wCAAwC,mBAAmB,0DAA0D,kCAAkC,uBAAuB,oBAAoB,8BAA8B,oBAAoB,mHAAmH,wFAAwF,qFAAqF,wBAAwB,uGAAuG,kDAAkD,KAAK;;AAE17B,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6GAA6G,yCAAyC,2BAA2B,qBAAqB,0BAA0B,KAAK;;AAErO,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,wGAAwG,oBAAoB,8BAA8B,8BAA8B,qBAAqB,6HAA6H,4DAA4D,KAAK;;AAE3Y,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6GAA6G,kCAAkC,4BAA4B,4BAA4B,gCAAgC,0BAA0B,sBAAsB,+BAA+B,+BAA+B,yBAAyB,uBAAuB,oBAAoB,kDAAkD,2BAA2B,8DAA8D,uBAAuB,0CAA0C,wCAAwC,yMAAyM,+CAA+C,mDAAmD,QAAQ,MAAM,6DAA6D,+CAA+C,sCAAsC,yCAAyC,6DAA6D,sEAAsE,8BAA8B,qEAAqE,kDAAkD,qCAAqC,OAAO,KAAK;;AAE18C,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6GAA6G,8BAA8B,4BAA4B,yBAAyB,uBAAuB,6BAA6B,0BAA0B,6BAA6B,4BAA4B,0BAA0B,kCAAkC,2CAA2C,uCAAuC,wCAAwC,+CAA+C,sCAAsC,uGAAuG,2BAA2B,4BAA4B,mCAAmC,0BAA0B,gBAAgB,8DAA8D,6NAA6N,wDAAwD,4FAA4F,2DAA2D,6CAA6C,2DAA2D,oGAAoG,wDAAwD,iDAAiD,4GAA4G,yEAAyE,+FAA+F,UAAU,sDAAsD,oFAAoF,wGAAwG,iEAAiE,qGAAqG,KAAK;;AAEvxE,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iHAAiH,yBAAyB,2BAA2B,qBAAqB,8CAA8C,2CAA2C,wBAAwB,4BAA4B,4DAA4D,sEAAsE,gCAAgC,sCAAsC,wBAAwB,KAAK;;AAE5iB,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,wGAAwG,oBAAoB,oBAAoB,0BAA0B,0BAA0B,qBAAqB,0DAA0D,kCAAkC,wBAAwB,KAAK;;AAElV,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iHAAiH,oCAAoC,wBAAwB,+EAA+E,8DAA8D,wEAAwE,qDAAqD,2BAA2B,qBAAqB,wIAAwI,qCAAqC,kDAAkD,uCAAuC,kDAAkD,uCAAuC,kHAAkH,8BAA8B,UAAU,MAAM,oCAAoC,SAAS,iCAAiC,qCAAqC,yEAAyE,0EAA0E,gDAAgD,4CAA4C,0JAA0J,4EAA4E,8DAA8D,YAAY,gKAAgK,4EAA4E,8DAA8D,YAAY,2BAA2B,yMAAyM,4EAA4E,2NAA2N,+FAA+F,0FAA0F,YAAY,gDAAgD,4CAA4C,yCAAyC,yEAAyE,mCAAmC,4CAA4C,YAAY,0EAA0E,qEAAqE,qCAAqC,KAAK;;AAEhmG,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,wGAAwG,yCAAyC,kBAAkB,uBAAuB,oBAAoB,0CAA0C,wBAAwB,wBAAwB,qBAAqB,8BAA8B,2BAA2B,mCAAmC,gCAAgC,8BAA8B,yBAAyB,6HAA6H,uDAAuD,kDAAkD,sFAAsF,gFAAgF,mGAAmG,+GAA+G,KAAK;;AAEnlC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6GAA6G,mEAAmE,uDAAuD,2BAA2B,qBAAqB,kDAAkD,KAAK;;AAE9U,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,wGAAwG,2BAA2B,wBAAwB,qBAAqB,+CAA+C,oFAAoF,KAAK;;AAExT,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6GAA6G,gDAAgD,6EAA6E,kDAAkD,kDAAkD,2BAA2B,qBAAqB,6CAA6C,yGAAyG,oEAAoE,uEAAuE,+CAA+C,cAAc,cAAc,2CAA2C,qEAAqE,wCAAwC,yCAAyC,QAAQ,uBAAuB,8DAA8D,iDAAiD,wCAAwC,QAAQ,uBAAuB,4DAA4D,wCAAwC,mDAAmD,OAAO,2DAA2D,kGAAkG,8EAA8E,iFAAiF,oBAAoB,4BAA4B,uBAAuB,8CAA8C,sDAAsD,sDAAsD,kCAAkC,yBAAyB,0DAA0D,+BAA+B,QAAQ,MAAM,oCAAoC,OAAO,KAAK;;AAE7gE,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,8EAA8E,gCAAmB;AACjG,qEAAqE,gCAAmB;AACxF,wEAAwE,gCAAmB;AAC3F,+EAA+E,gCAAmB;AAClG,uEAAuE,gCAAmB;AAC1F,uEAAuE,gCAAmB;AAC1F,yEAAyE,gCAAmB;AAC5F,0EAA0E,gCAAmB;AAC7F,yEAAyE,gCAAmB;AAC5F,yEAAyE,gCAAmB;AAC5F,4EAA4E,gCAAmB;AAC/F,uEAAuE,gCAAmB;AAC1F,uEAAuE,gCAAmB;AAC1F,uEAAuE,gCAAmB;AAC1F,sEAAsE,gCAAmB;AACzF,uEAAuE,gCAAmB;AAC1F,qEAAqE,gCAAmB;AACxF,wEAAwE,gCAAmB;AAC3F,sEAAsE,gCAAmB;AACzF,8DAA8D,gCAAmB;AACjF,uEAAuE,gCAAmB;AAC1F,wEAAwE,gCAAmB;AAC3F,wEAAwE,gCAAmB;;;;;;;;;;;;;;;;;;;;;;;;AAwB3F;AACA;AACA,IAAI,2BAA2B;AAC/B;AACA,QAAQ,iBAAiB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,gCAAmB;;AAEnF;AACA;AACA;AACA,kCAAkC,uCAAuC;AACzE,oDAAoD,eAAe;AACnE;AACA,qBAAqB,wBAAwB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,gCAAmB;AACnF,uEAAuE,gCAAmB;;;AAG1F;AACA;AACA,IAAI,0BAA0B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,oFAAoF,gCAAmB;AACvG,gEAAgE,gCAAmB;;;AAGnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,gCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+EAA+E,gCAAmB;AAClG,8DAA8D,gCAAmB;AACjF,8DAA8D,gCAAmB;AACjF,8DAA8D,gCAAmB;AACjF,8DAA8D,gCAAmB;AACjF,gEAAgE,gCAAmB;;;;AAInF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+EAA+E,gCAAmB;AAClG,8DAA8D,gCAAmB;AACjF,8DAA8D,gCAAmB;AACjF,8DAA8D,gCAAmB;AACjF,8DAA8D,gCAAmB;AACjF,gEAAgE,gCAAmB;;;;AAInF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,gCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,gCAAmB;AACnF,0EAA0E,gCAAmB;;;AAG7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,0GAA0G,gCAAmB;AAC7H,6GAA6G,gCAAmB;AAChI,qEAAqE,gCAAmB;AACxF,gEAAgE,gCAAmB;;;;;AAKnF;AACA,2BAA2B,yDAAyD;AACpF;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6GAA6G,gCAAmB;AAChI,0GAA0G,gCAAmB;AAC7H,qEAAqE,gCAAmB;AACxF,gEAAgE,gCAAmB;;;;;AAKnF;AACA,2BAA2B,sDAAsD;AACjF;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,oFAAoF,gCAAmB;AACvG,kEAAkE,gCAAmB;AACrF,gEAAgE,gCAAmB;;;;AAInF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,oFAAoF,gCAAmB;AACvG,gEAAgE,gCAAmB;;;AAGnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,0GAA0G,gCAAmB;AAC7H,6GAA6G,gCAAmB;AAChI,qEAAqE,gCAAmB;AACxF,gEAAgE,gCAAmB;;;;;AAKnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,0GAA0G,iCAAmB;AAC7H,6GAA6G,iCAAmB;AAChI,qEAAqE,iCAAmB;AACxF,gEAAgE,iCAAmB;;;;;AAKnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,0GAA0G,iCAAmB;AAC7H,6GAA6G,iCAAmB;AAChI,8DAA8D,iCAAmB;AACjF,8DAA8D,iCAAmB;AACjF,qEAAqE,iCAAmB;AACxF,8EAA8E,iCAAmB;AACjG,kEAAkE,iCAAmB;AACrF,gEAAgE,iCAAmB;;;;;;;;AAQnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,0GAA0G,iCAAmB;AAC7H,6GAA6G,iCAAmB;AAChI,8DAA8D,iCAAmB;AACjF,8DAA8D,iCAAmB;AACjF,qEAAqE,iCAAmB;AACxF,8EAA8E,iCAAmB;AACjG,gEAAgE,iCAAmB;;;;;;;AAOnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;;AAEnF;AACA,iCAAiC,gBAAgB,MAAM,wBAAwB;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;;;AAG1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;;;AAG1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,6GAA6G,iCAAmB;AAChI,0GAA0G,iCAAmB;AAC7H,mEAAmE,iCAAmB;AACtF,8DAA8D,iCAAmB;AACjF,8DAA8D,iCAAmB;;;;;;AAMjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,8DAA8D,iCAAmB;AACjF,6GAA6G,iCAAmB;AAChI,0GAA0G,iCAAmB;AAC7H,mEAAmE,iCAAmB;AACtF,8DAA8D,iCAAmB;;;;;;;AAOjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,0GAA0G,iCAAmB;AAC7H,6GAA6G,iCAAmB;AAChI,gEAAgE,iCAAmB;AACnF,8DAA8D,iCAAmB;AACjF,8DAA8D,iCAAmB;;;;;;AAMjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,0GAA0G,iCAAmB;AAC7H,6GAA6G,iCAAmB;AAChI,gEAAgE,iCAAmB;AACnF,8DAA8D,iCAAmB;AACjF,8DAA8D,iCAAmB;;;;;;AAMjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,uEAAuE,iCAAmB;AAC1F,yFAAyF,iCAAmB;AAC5G,0GAA0G,iCAAmB;AAC7H,6GAA6G,iCAAmB;;;;;AAKhI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+EAA+E,iCAAmB;AAClG,sFAAsF,iCAAmB;AACzG,0EAA0E,iCAAmB;;;;AAI7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,uEAAuE,iCAAmB;AAC1F,qEAAqE,iCAAmB;AACxF,gEAAgE,iCAAmB;AACnF,+EAA+E,iCAAmB;AAClG,gFAAgF,iCAAmB;AACnG,uEAAuE,iCAAmB;AAC1F,8EAA8E,iCAAmB;AACjG,sEAAsE,iCAAmB;AACzF,oEAAoE,iCAAmB;AACvF,uEAAuE,iCAAmB;AAC1F,wEAAwE,iCAAmB;AAC3F,sEAAsE,iCAAmB;AACzF,wEAAwE,iCAAmB;AAC3F,sEAAsE,iCAAmB;AACzF,wEAAwE,iCAAmB;AAC3F,wEAAwE,iCAAmB;AAC3F,0EAA0E,iCAAmB;AAC7F,0EAA0E,iCAAmB;AAC7F,yEAAyE,iCAAmB;AAC5F,yEAAyE,iCAAmB;AAC5F,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;AAC1F,yEAAyE,iCAAmB;AAC5F,yEAAyE,iCAAmB;AAC5F,2EAA2E,iCAAmB;AAC9F,wEAAwE,iCAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8B3F,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,iEAAiE,iCAAmB;AACpF,kEAAkE,iCAAmB;AACrF,qEAAqE,iCAAmB;AACxF,kFAAkF,iCAAmB;AACrG,kFAAkF,iCAAmB;AACrG,sFAAsF,iCAAmB;AACzG,6GAA6G,iCAAmB;AAChI,0GAA0G,iCAAmB;AAC7H,oFAAoF,iCAAmB;AACvG,6EAA6E,iCAAmB;AAChG,sFAAsF,iCAAmB;AACzG,oFAAoF,iCAAmB;AACvG,oEAAoE,iCAAmB;AACvF,0EAA0E,iCAAmB;AAC7F,gFAAgF,iCAAmB;AACnG,mFAAmF,iCAAmB;AACtG,0EAA0E,iCAAmB;AAC7F,sEAAsE,iCAAmB;;;;;;;;;;;;;;;;;;;AAmBzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,gBAAgB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qGAAqG,qBAAqB;AAC1H;AACA;AACA;AACA;AACA;AACA,qGAAqG,qBAAqB;AAC1H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uMAAuM;AACvN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE,IAAI;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,oBAAoB;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oGAAoG,IAAI;AACxG;AACA,8FAA8F,eAAe;AAC7G;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,qBAAqB;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uGAAuG,IAAI;AAC3G;AACA,6FAA6F,eAAe;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,UAAU;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,yBAAyB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wGAAwG,IAAI;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0GAA0G,IAAI;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,sBAAsB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,uBAAuB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,8EAA8E,iCAAmB;AACjG,qEAAqE,iCAAmB;AACxF,mEAAmE,iCAAmB;AACtF,gEAAgE,iCAAmB;AACnF,+EAA+E,iCAAmB;AAClG,kEAAkE,iCAAmB;AACrF,4EAA4E,iCAAmB;AAC/F,sEAAsE,iCAAmB;AACzF,kEAAkE,iCAAmB;AACrF,oEAAoE,iCAAmB;AACvF,2EAA2E,iCAAmB;;;;;;;;;;;;AAY9F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,oCAAoC;AACjE;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,wCAAwC;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,iCAAiC;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,oCAAoC;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,oCAAoC;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oBAAoB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,iBAAiB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,iBAAiB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE,gBAAgB;AACrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE,gBAAgB;AACrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,yCAAyC;AAChG,mBAAmB,kBAAkB;AACrC,qBAAqB,kBAAkB,cAAc,iBAAiB;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,sBAAsB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wGAAwG,IAAI;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,uBAAuB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yGAAyG,IAAI;AAC7G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yGAAyG,IAAI;AAC7G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,uEAAuE,iCAAmB;AAC1F,6GAA6G,iCAAmB;AAChI,0GAA0G,iCAAmB;AAC7H,yFAAyF,iCAAmB;AAC5G,8EAA8E,iCAAmB;AACjG,4DAA4D,iCAAmB;AAC/E,oEAAoE,iCAAmB;AACvF,4EAA4E,iCAAmB;AAC/F,wEAAwE,iCAAmB;AAC3F,sEAAsE,iCAAmB;AACzF,uEAAuE,iCAAmB;;;;;;;;;;;;;AAa1F;AACA;AACA;AACA;AACA;AACA,CAAC,0CAA0C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4EAA4E;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,gCAAgC;AAChD;AACA;AACA;AACA;AACA,sCAAsC,0BAA0B;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8GAA8G,qBAAqB;AACnI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,8BAA8B;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,oCAAoC;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,2BAA2B,MAAM,8BAA8B;AACnH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,uBAAuB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,+DAA+D,iCAAmB;AAClF,8DAA8D,iCAAmB;;;;AAIjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,sBAAsB;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,gBAAgB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E,OAAO;AACjF;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,+EAA+E,iCAAmB;AAClG,yFAAyF,iCAAmB;AAC5G,gEAAgE,iCAAmB;AACnF,yEAAyE,iCAAmB;AAC5F,qEAAqE,iCAAmB;AACxF,qFAAqF,iCAAmB;AACxG,yEAAyE,iCAAmB;AAC5F,sEAAsE,iCAAmB;AACzF,+DAA+D,iCAAmB;;;;;;;;;;;AAWlF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,sCAAsC;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,+CAA+C;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,2CAA2C;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,4BAA4B;AAChD;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,4EAA4E,iCAAmB;AAC/F,yEAAyE,iCAAmB;AAC5F,sEAAsE,iCAAmB;AACzF,0EAA0E,iCAAmB;AAC7F,qEAAqE,iCAAmB;AACxF,gEAAgE,iCAAmB;AACnF,kEAAkE,iCAAmB;AACrF,8EAA8E,iCAAmB;AACjG,4EAA4E,iCAAmB;AAC/F,+DAA+D,iCAAmB;AAClF,mEAAmE,iCAAmB;;;;;;;;;;;;;AAatF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qFAAqF,aAAa;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oFAAoF,gBAAgB;AACpG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,YAAY,IAAI,KAAK,cAAc;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,2EAA2E,iCAAmB;AAC9F,qEAAqE,iCAAmB;AACxF,kEAAkE,iCAAmB;AACrF,mEAAmE,iCAAmB;;;;;AAKtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C,4BAA4B,mBAAmB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,4DAA4D,iCAAmB;AAC/E,sEAAsE,iCAAmB;;;;AAIzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,wEAAwE,iCAAmB;AAC3F,oFAAoF,iCAAmB;AACvG,yEAAyE,iCAAmB;AAC5F,sEAAsE,iCAAmB;AACzF,wEAAwE,iCAAmB;AAC3F,2EAA2E,iCAAmB;AAC9F,qEAAqE,iCAAmB;AACxF,+EAA+E,iCAAmB;AAClG,wEAAwE,iCAAmB;AAC3F,4EAA4E,iCAAmB;;;;;;;;;;;AAW/F,2EAA2E;AAC3E,6EAA6E;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,uBAAuB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,0DAA0D,iCAAmB;AAC7E,wEAAwE,iCAAmB;AAC3F,yEAAyE,iCAAmB;AAC5F,qEAAqE,iCAAmB;AACxF,qEAAqE,iCAAmB;AACxF,+EAA+E,iCAAmB;AAClG,iGAAiG,iCAAmB;AACpH,kEAAkE,iCAAmB;AACrF,uEAAuE,iCAAmB;;;;;;;;;;AAU1F;AACA;AACA;AACA;AACA;AACA,sDAAsD,4BAA4B;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,4EAA4E,iCAAmB;AAC/F,wEAAwE,iCAAmB;AAC3F,yEAAyE,iCAAmB;AAC5F,0EAA0E,iCAAmB;AAC7F,2EAA2E,iCAAmB;AAC9F,qEAAqE,iCAAmB;AACxF,kEAAkE,iCAAmB;AACrF,8EAA8E,iCAAmB;AACjG,4EAA4E,iCAAmB;AAC/F,+DAA+D,iCAAmB;;;;;;;;;;;;AAYlF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qFAAqF,aAAa;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kFAAkF,aAAa;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,sEAAsE,iCAAmB;AACzF,uEAAuE,iCAAmB;AAC1F,6EAA6E,iCAAmB;AAChG,wEAAwE,iCAAmB;AAC3F,0EAA0E,iCAAmB;AAC7F,2EAA2E,iCAAmB;AAC9F,qEAAqE,iCAAmB;AACxF,kEAAkE,iCAAmB;AACrF,+EAA+E,iCAAmB;AAClG,kEAAkE,iCAAmB;AACrF,0DAA0D,iCAAmB;AAC7E,0DAA0D,iCAAmB;AAC7E,2DAA2D,iCAAmB;AAC9E,2DAA2D,iCAAmB;AAC9E,2EAA2E,iCAAmB;AAC9F,+DAA+D,iCAAmB;AAClF,wEAAwE,iCAAmB;;;;;;;;;;;;;;;AAe3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,yBAAyB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,8BAA8B,eAAe,4BAA4B;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,4BAA4B;AACrF;AACA;AACA;AACA,wBAAwB,4BAA4B;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,4BAA4B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,iBAAiB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,iBAAiB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,iBAAiB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,iBAAiB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,SAAS;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,SAAS;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,qBAAqB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,qBAAqB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,0BAA0B;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qFAAqF,gBAAgB;AACrG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qFAAqF,gBAAgB;AACrG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oEAAoE,OAAO;AAC3E;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,2EAA2E,iCAAmB;AAC9F,qEAAqE,iCAAmB;AACxF,4EAA4E,iCAAmB;AAC/F,mEAAmE,iCAAmB;;;;;AAKtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,+BAA+B;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,+BAA+B;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yEAAyE,iCAAmB;AAC5F,wEAAwE,iCAAmB;AAC3F,sEAAsE,iCAAmB;AACzF,qEAAqE,iCAAmB;AACxF,qEAAqE,iCAAmB;AACxF,2EAA2E,iCAAmB;AAC9F,0DAA0D,iCAAmB;;;;;;;;AAQ7E;AACA;AACA;AACA;AACA;AACA,yDAAyD,0BAA0B;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,sBAAsB,gDAAgD;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,sBAAsB,oCAAoC;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,sBAAsB,gCAAgC;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,qCAAqC,4BAA4B;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gFAAgF,iCAAmB;AACnG,0GAA0G,iCAAmB;AAC7H,6GAA6G,iCAAmB;AAChI,sFAAsF,iCAAmB;AACzG,iEAAiE,iCAAmB;AACpF,yEAAyE,iCAAmB;AAC5F,6EAA6E,iCAAmB;AAChG,gFAAgF,iCAAmB;AACnG,2EAA2E,iCAAmB;AAC9F,qFAAqF,iCAAmB;AACxG,yEAAyE,iCAAmB;AAC5F,kFAAkF,iCAAmB;AACrG,sEAAsE,iCAAmB;AACzF,wEAAwE,iCAAmB;;;;;;;;;;;;;;;AAe3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,0CAA0C;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA,2BAA2B,gBAAgB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,sCAAsC;;;AAGvC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,uEAAuE,iCAAmB;AAC1F,8DAA8D,iCAAmB;AACjF,uEAAuE,iCAAmB;;;;AAI1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,kEAAkE,iCAAmB;AACrF,uEAAuE,iCAAmB;AAC1F,0DAA0D,iCAAmB;;;;;AAK7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,8DAA8D,iCAAmB;AACjF,sEAAsE,iCAAmB;AACzF,kEAAkE,iCAAmB;AACrF,kEAAkE,iCAAmB;AACrF,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;AAC1F,qFAAqF,iCAAmB;AACxG,8EAA8E,iCAAmB;AACjG,qEAAqE,iCAAmB;AACxF,4DAA4D,iCAAmB;;;;;;;;;;;;AAY/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,uDAAuD,OAAO;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8FAA8F;AAC9F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;;;AAG1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,UAAU,GAAG,UAAU;AAC9C;AACA;AACA,uBAAuB,UAAU,GAAG,UAAU;AAC9C;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,qEAAqE,iCAAmB;;;AAGxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,qEAAqE,iCAAmB;AACxF,yEAAyE,iCAAmB;AAC5F,qEAAqE,iCAAmB;;;;;AAKxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,EAAE,GAAG,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,aAAa;AAC7C,mCAAmC,cAAc;AACjD;AACA;AACA;AACA;AACA,wCAAwC,yBAAyB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,yBAAyB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,mBAAmB;AACrD,qCAAqC,oBAAoB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,mBAAmB;AAC7D,6CAA6C,oBAAoB;AACjE;AACA;AACA;AACA;AACA;AACA,0CAA0C,mBAAmB;AAC7D,6CAA6C,oBAAoB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,4DAA4D,iCAAmB;AAC/E,qEAAqE,iCAAmB;AACxF,mEAAmE,iCAAmB;AACtF,uEAAuE,iCAAmB;AAC1F,qFAAqF,iCAAmB;AACxG,uEAAuE,iCAAmB;AAC1F,8EAA8E,iCAAmB;AACjG,8DAA8D,iCAAmB;AACjF,wEAAwE,iCAAmB;;;;;;;;;;AAU3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8HAA8H,kEAAkE,IAAI,kEAAkE;AACtQ;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,qCAAqC;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,qBAAqB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA,oCAAoC,gCAAgC;AACpE;AACA;AACA;AACA,yCAAyC,kCAAkC;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA,4BAA4B,wBAAwB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA,mBAAmB,gCAAgC;AACnD;AACA;AACA,4DAA4D,mCAAmC;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4DAA4D;;;AAG7D,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+EAA+E,iCAAmB;;AAElG;AACA,mFAAmF,gCAAgC,WAAW,wBAAwB;AACtJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,uCAAuC;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,6CAA6C;AAC1F;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ,YAAY;AACZ;AACA;AACA;AACA;AACA,cAAc,yBAAyB;AACvC;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,wEAAwE,iCAAmB;;AAE3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,kBAAkB;AACvE;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,MAAM;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,uEAAuE,iCAAmB;AAC1F,2EAA2E,iCAAmB;AAC9F,uEAAuE,iCAAmB;AAC1F,wEAAwE,iCAAmB;AAC3F,4EAA4E,iCAAmB;AAC/F,qEAAqE,iCAAmB;AACxF,yEAAyE,iCAAmB;AAC5F,qFAAqF,iCAAmB;AACxG,kFAAkF,iCAAmB;AACrG,gFAAgF,iCAAmB;AACnG,oFAAoF,iCAAmB;AACvG,uFAAuF,iCAAmB;AAC1G,yFAAyF,iCAAmB;AAC5G,mFAAmF,iCAAmB;AACtG,+EAA+E,iCAAmB;AAClG,sFAAsF,iCAAmB;AACzG,yEAAyE,iCAAmB;AAC5F,qFAAqF,iCAAmB;AACxG,gFAAgF,iCAAmB;AACnG,kGAAkG,iCAAmB;AACrH,qGAAqG,iCAAmB;AACxH,mFAAmF,iCAAmB;AACtG,6FAA6F,iCAAmB;AAChH,6EAA6E,iCAAmB;AAChG,8EAA8E,iCAAmB;AACjG,6EAA6E,iCAAmB;AAChG,wFAAwF,iCAAmB;AAC3G,iFAAiF,iCAAmB;AACpG,0EAA0E,iCAAmB;AAC7F,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;AAC1F,wEAAwE,iCAAmB;AAC3F,+DAA+D,iCAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyClF,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;;AAExF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+EAA+E,iCAAmB;AAClG,0GAA0G,iCAAmB;AAC7H,6GAA6G,iCAAmB;AAChI,sFAAsF,iCAAmB;AACzG,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;AAC1F,oEAAoE,iCAAmB;;;;;;;;AAQvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,4BAA4B;AACpD;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,wEAAwE,iCAAmB;AAC3F,4EAA4E,iCAAmB;AAC/F,4FAA4F,iCAAmB;;;;;AAK/G;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;AAGD,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yEAAyE,iCAAmB;AAC5F,+DAA+D,iCAAmB;AAClF,+DAA+D,iCAAmB;AAClF,uEAAuE,iCAAmB;AAC1F,oEAAoE,iCAAmB;AACvF,4FAA4F,iCAAmB;;;;;;AAM/G;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oBAAoB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oBAAoB;;;AAGrB,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA,mBAAmB,gCAAgC;AACnD;AACA;AACA,4DAA4D,mCAAmC;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,wCAAwC;;;AAGzC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,8DAA8D,iCAAmB;AACjF,uEAAuE,iCAAmB;AAC1F,qEAAqE,iCAAmB;;;;;;AAMxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4CAA4C;AAC7C;AACA,kDAAkD,uBAAuB;AACzE;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,uBAAuB;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uBAAuB;AACvC;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;;AAExF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,mEAAmE,iCAAmB;AACtF,uEAAuE,iCAAmB;AAC1F,gFAAgF,iCAAmB;AACnG,8DAA8D,iCAAmB;AACjF,uEAAuE,iCAAmB;AAC1F,sFAAsF,iCAAmB;;;;;;;;AAQzG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,2BAA2B;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,qBAAqB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oCAAoC;AAC5D,4BAA4B,qBAAqB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6EAA6E;AAC7E;AACA,uDAAuD;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oCAAoC;AAC5D,4BAA4B,qBAAqB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA,mCAAmC,qBAAqB;AACxD;AACA,iCAAiC,uBAAuB,GAAG,sBAAsB;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;AAC3C;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,cAAc;AACnD;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,oEAAoE,iCAAmB;AACvF,+DAA+D,iCAAmB;;;AAGlF;AACA;AACA,gDAAgD,gBAAgB;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2EAA2E,2BAA2B;AACtG,iCAAiC,oBAAoB,YAAY;AACjE;AACA;AACA;AACA,4EAA4E,2BAA2B;AACvG,iCAAiC,mBAAmB,uDAAuD;AAC3G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,oBAAoB;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,wBAAwB;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uEAAuE,0BAA0B;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,mGAAmG,iCAAmB;AACtH,4GAA4G,iCAAmB;AAC/H,wGAAwG,iCAAmB;;;;AAI3H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,2GAA2G,iCAAmB;AAC9H,sFAAsF,iCAAmB;AACzG,+EAA+E,iCAAmB;AAClG,gFAAgF,iCAAmB;AACnG,sFAAsF,iCAAmB;AACzG,qEAAqE,iCAAmB;AACxF,mEAAmE,iCAAmB;AACtF,iFAAiF,iCAAmB;AACpG,mFAAmF,iCAAmB;AACtG,gGAAgG,iCAAmB;AACnH,oFAAoF,iCAAmB;AACvG,6EAA6E,iCAAmB;AAChG,yFAAyF,iCAAmB;AAC5G,0EAA0E,iCAAmB;AAC7F,yEAAyE,iCAAmB;;;;;;;;;;;;;;;AAe5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gCAAgC;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mHAAmH,0CAA0C;AAC7J;AACA;AACA,+DAA+D,mBAAmB;AAClF;AACA;AACA;AACA,8DAA8D,gBAAgB;AAC9E;AACA;AACA;AACA,+DAA+D,GAAG,IAAI,8GAA8G;AACpL;AACA;AACA;AACA,iEAAiE,KAAK;AACtE;AACA;AACA;AACA;AACA,oEAAoE,8EAA8E;AAClJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4EAA4E,gBAAgB;AAC5F;AACA;AACA;AACA,2EAA2E,mBAAmB;AAC9F;AACA;AACA;AACA,iEAAiE,UAAU;AAC3E;AACA;AACA;AACA,mEAAmE,iBAAiB;AACpF;AACA;AACA;AACA,qEAAqE,+CAA+C;AACpH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D,uBAAuB;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8GAA8G,qCAAqC;AACnJ;AACA,iFAAiF,kBAAkB;AACnG;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0GAA0G,qCAAqC;AAC/I;AACA,6EAA6E,sBAAsB;AACnG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,kBAAkB;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,oEAAoE,iCAAmB;AACvF,qEAAqE,iCAAmB;;;;;;AAMxF,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,kEAAkE,iCAAmB;AACrF,oEAAoE,iCAAmB;AACvF,qEAAqE,iCAAmB;;;;AAIxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,6BAA6B,GAAG;AAChD,iCAAiC,QAAQ;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,uEAAuE,iCAAmB;AAC1F,yEAAyE,iCAAmB;AAC5F,4EAA4E,iCAAmB;AAC/F,mEAAmE,iCAAmB;AACtF,+EAA+E,iCAAmB;AAClG,qEAAqE,iCAAmB;AACxF,sEAAsE,iCAAmB;AACzF,+DAA+D,iCAAmB;AAClF,mEAAmE,iCAAmB;;;;;;;;;;AAUtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yFAAyF;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,uEAAuE,iCAAmB;AAC1F,+DAA+D,iCAAmB;AAClF,gEAAgE,iCAAmB;AACnF,kEAAkE,iCAAmB;AACrF,gEAAgE,iCAAmB;AACnF,sEAAsE,iCAAmB;;;;;;;AAOzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,eAAe;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,sBAAsB;AAC1C,oBAAoB,uCAAuC;AAC3D,gDAAgD,sCAAsC;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uFAAuF,IAAI;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2EAA2E,YAAY;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,kBAAkB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,iHAAiH;AAClI,iBAAiB,mHAAmH;AACpI;AACA;AACA;AACA,gBAAgB,gDAAgD;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,QAAQ;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,kEAAkE,iCAAmB;AACrF,oEAAoE,iCAAmB;;;;AAIvF;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,iCAAiC,QAAQ;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,uEAAuE,iCAAmB;AAC1F,yEAAyE,iCAAmB;AAC5F,oEAAoE,iCAAmB;AACvF,mEAAmE,iCAAmB;AACtF,sEAAsE,iCAAmB;AACzF,uEAAuE,iCAAmB;AAC1F,kEAAkE,iCAAmB;AACrF,qEAAqE,iCAAmB;;;;;;;;;;AAUxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,iBAAiB,mBAAmB,mBAAmB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA,8EAA8E;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,4DAA4D;AAChF;AACA;AACA;AACA;AACA,gEAAgE,0BAA0B;AAC1F,+DAA+D,0BAA0B;AACzF;AACA;AACA,gEAAgE,yCAAyC;AACzG,+DAA+D,gDAAgD;AAC/G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oFAAoF;AACpF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,kEAAkE,iCAAmB;AACrF,oEAAoE,iCAAmB;AACvF,qEAAqE,iCAAmB;AACxF,8EAA8E,iCAAmB;AACjG,0EAA0E,iCAAmB;;;;;;AAM7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,6BAA6B,GAAG;AAChD;AACA,6BAA6B,QAAQ;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,+EAA+E,iCAAmB;AAClG,+EAA+E,iCAAmB;AAClG,kEAAkE,iCAAmB;AACrF,0EAA0E,iCAAmB;AAC7F,qEAAqE,iCAAmB;AACxF,mEAAmE,iCAAmB;AACtF,8EAA8E,iCAAmB;AACjG,wEAAwE,iCAAmB;AAC3F,kEAAkE,iCAAmB;;;;;;;;;;AAUrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,QAAQ;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D,WAAW;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE,WAAW;AAC3E;AACA;AACA;AACA,gEAAgE,WAAW;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,oEAAoE,iCAAmB;AACvF,mEAAmE,iCAAmB;AACtF,mEAAmE,iCAAmB;AACtF,+DAA+D,iCAAmB;AAClF,kEAAkE,iCAAmB;AACrF,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;;;;;;;;;;AAU1F,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,0DAA0D,iCAAmB;AAC7E,qEAAqE,iCAAmB;AACxF,sEAAsE,iCAAmB;AACzF,6EAA6E,iCAAmB;AAChG,+DAA+D,iCAAmB;AAClF,kEAAkE,iCAAmB;AACrF,iEAAiE,iCAAmB;AACpF,iFAAiF,iCAAmB;AACpG,0EAA0E,iCAAmB;AAC7F,uEAAuE,iCAAmB;AAC1F,iEAAiE,iCAAmB;AACpF,kEAAkE,iCAAmB;AACrF,gEAAgE,iCAAmB;AACnF,gEAAgE,iCAAmB;AACnF,uFAAuF,iCAAmB;AAC1G,4EAA4E,iCAAmB;AAC/F,sEAAsE,iCAAmB;AACzF,mEAAmE,iCAAmB;AACtF,mEAAmE,iCAAmB;AACtF,mEAAmE,iCAAmB;AACtF,mEAAmE,iCAAmB;AACtF,qEAAqE,iCAAmB;AACxF,6EAA6E,iCAAmB;AAChG,uFAAuF,iCAAmB;AAC1G,sEAAsE,iCAAmB;AACzF,4EAA4E,iCAAmB;AAC/F,0EAA0E,iCAAmB;AAC7F,kFAAkF,iCAAmB;AACrG,iEAAiE,iCAAmB;AACpF,2EAA2E,iCAAmB;AAC9F,oEAAoE,iCAAmB;;;;;;;AAOvF;;;;;;;;;;;;;;;;;;;;;;;AAuBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oDAAoD;AACrD;AACA;AACA;AACA,QAAQ,iBAAiB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA;AACA;AACA,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA;AACA;AACA,oBAAoB,gBAAgB,kBAAkB,2BAA2B;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,sBAAsB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,uBAAuB;AAClE;AACA,qDAAqD,uBAAuB;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,0CAA0C,0BAA0B,cAAc,oBAAoB,eAAe,kBAAkB,kBAAkB;AAChN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wGAAwG,wBAAwB;AAChI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,uGAAuG;AACtH;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,qFAAqF,UAAU;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oHAAoH,+CAA+C;AACnK;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,QAAQ;AACxB,cAAc,+BAA+B;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,6BAA6B;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oHAAoH,+CAA+C;AACnK;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,gBAAgB,QAAQ,sBAAsB;AAC7D,8CAA8C,sBAAsB;AACpE;AACA;AACA;AACA;AACA;AACA,kBAAkB,gBAAgB,UAAU,sBAAsB;AAClE,iDAAiD,sBAAsB;AACvE;AACA;AACA;AACA;AACA;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,oBAAoB;AACnD,uCAAuC,gCAAgC;AACvE,mCAAmC,iCAAiC;AACpE;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,gCAAgC;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,gCAAgC;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,kCAAkC;AAC9E,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,mBAAmB,WAAW,iBAAiB,aAAa,eAAe,MAAM,iBAAiB;AAC9H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,gBAAgB,uDAAuD;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,mEAAmE,iCAAmB;;;AAGtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,0EAA0E,iCAAmB;AAC7F,wEAAwE,iCAAmB;AAC3F,mEAAmE,iCAAmB;AACtF,yEAAyE,iCAAmB;AAC5F,kEAAkE,iCAAmB;;;;;;AAMrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,0CAA0C;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6EAA6E,+DAA+D;AAC5I;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mEAAmE,iCAAmB;AACtF,yEAAyE,iCAAmB;AAC5F,gEAAgE,iCAAmB;AACnF,sEAAsE,iCAAmB;AACzF,mEAAmE,iCAAmB;AACtF,kEAAkE,iCAAmB;;;;;;;;AAQrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,QAAQ;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,oCAAoC;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,IAAI;AAChB;AACA;AACA;AACA,oGAAoG,qBAAqB;AACzH;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,yBAAyB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,QAAQ;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,sBAAsB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,uBAAuB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE,IAAI;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D,IAAI;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE,IAAI;AACtE;AACA;AACA;AACA;AACA;AACA,wGAAwG,IAAI;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0GAA0G,IAAI;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,mEAAmE,iCAAmB;;;AAGtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,oCAAoC;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,oCAAoC;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,6CAA6C;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,oCAAoC;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,QAAQ;AACvD;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yEAAyE,iCAAmB;;AAE5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,kEAAkE,iCAAmB;;;AAGrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,kEAAkE,iCAAmB;;AAErF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gCAAgC;AACjC;AACA,iBAAiB,iBAAiB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,mEAAmE,iCAAmB;;;AAGtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,QAAQ;AACtD;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yEAAyE,iCAAmB;;AAE5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,sEAAsE,iCAAmB;AACzF,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;;;;;;AAM1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mEAAmE,iCAAmB;AACtF,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,+DAA+D,iCAAmB;AAClF,kEAAkE,iCAAmB;AACrF,sEAAsE,iCAAmB;AACzF,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,+DAA+D,iCAAmB;AAClF,kEAAkE,iCAAmB;AACrF,wFAAwF,iCAAmB;AAC3G,qFAAqF,iCAAmB;;;;;;;;;;;;;;;;AAgBxG,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,kBAAkB;AAC9C;AACA;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gCAAgC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,mBAAmB;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE,mBAAmB;AACrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,mBAAmB,oDAAoD,kBAAkB;AACvH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,mBAAmB,oDAAoD,kBAAkB;AACrH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,iBAAiB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,iBAAiB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,0BAA0B;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,0BAA0B;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,0BAA0B;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,0BAA0B;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,eAAe,GAAG,eAAe,OAAO,iBAAiB;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,gBAAgB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,gBAAgB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,gBAAgB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,gBAAgB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,gBAAgB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,gBAAgB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA,6FAA6F,iBAAiB;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+EAA+E,iBAAiB;AAChG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gFAAgF,iBAAiB;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA,sBAAsB;AACtB,iEAAiE,iCAAmB;AACpF,kEAAkE,iCAAmB;AACrF,mEAAmE,iCAAmB;AACtF,sEAAsE,iCAAmB;;;;;AAKzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gDAAgD;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,8CAA8C;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,2BAA2B,IAAI;AACvE;AACA,kCAAkC,qBAAqB,OAAO;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,MAAM;AACpD;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,qBAAqB;AACxD,qBAAqB;AACrB;AACA;AACA;AACA,wDAAwD,IAAI;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gGAAgG,0BAA0B;AAC1H;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,SAAS;AACT;AACA;AACA,kBAAkB,oBAAoB,QAAQ,sBAAsB;AACpE;AACA;AACA;AACA,wDAAwD,IAAI;AAC5D;AACA;AACA;AACA;AACA,WAAW,qCAAqC,uBAAuB;AACvE,WAAW,0BAA0B;AACrC,WAAW,WAAW;AACtB,WAAW;AACX;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,gGAAgG;AAChH;AACA;AACA;AACA,oBAAoB,0BAA0B;AAC9C;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,gGAAgG,EAAE,IAAI,EAAE;AACxG;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,sCAAsC;AAClD,QAAQ,8BAA8B;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,iCAAiC,qBAAqB,gBAAgB;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,mDAAmD;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,0DAA0D;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;;AAEnF;AACA,aAAa,kBAAkB,yDAAyD,kCAAkC;AAC1H;AACA,QAAQ,iBAAiB;AACzB,WAAW,mCAAmC;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,mEAAmE,iCAAmB;AACtF,gEAAgE,iCAAmB;;;AAGnF;AACA,aAAa,kBAAkB,4BAA4B;AAC3D;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mHAAmH;AACnH,kGAAkG;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,mEAAmE,iCAAmB;;AAEtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,qEAAqE,iCAAmB;AACxF,6EAA6E,iCAAmB;AAChG,oEAAoE,iCAAmB;;;;;AAKvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,wDAAwD;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,iEAAiE;AACvG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,oGAAoG;AACpH;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,oBAAoB;AACpB;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,sEAAsE,iCAAmB;AACzF,yEAAyE,iCAAmB;AAC5F,qEAAqE,iCAAmB;AACxF,+DAA+D,iCAAmB;AAClF,qEAAqE,iCAAmB;AACxF,kEAAkE,iCAAmB;AACrF,oEAAoE,iCAAmB;AACvF,wEAAwE,iCAAmB;AAC3F,wEAAwE,iCAAmB;AAC3F,sFAAsF,iCAAmB;AACzG,wFAAwF,iCAAmB;AAC3G,kGAAkG,iCAAmB;AACrH,wFAAwF,iCAAmB;AAC3G,gGAAgG,iCAAmB;AACnH,0FAA0F,iCAAmB;AAC7G,mEAAmE,iCAAmB;AACtF,mEAAmE,iCAAmB;AACtF,mEAAmE,iCAAmB;AACtF,8FAA8F,iCAAmB;AACjH,iEAAiE,iCAAmB;AACpF,8FAA8F,iCAAmB;AACjH,8FAA8F,iCAAmB;AACjH,+DAA+D,iCAAmB;;;;;;;;;;AAUlF;;;;;;;;;;;;;;;AAeA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,wDAAwD;AAC1G,kJAAkJ,gBAAgB;AAClK,mKAAmK,gBAAgB;AACnL,oKAAoK,gBAAgB;AACpL,mJAAmJ,gBAAgB;AACnK;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,iEAAiE;AACvG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,2OAA2O;AAC3P;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,IAAI;AAChB;AACA,mFAAmF;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,aAAa;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,cAAc;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,oBAAoB;AACpB;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gFAAgF,mCAAmC;AACnH;AACA;AACA;AACA;AACA,gBAAgB,+BAA+B;AAC/C;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,4BAA4B;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,kCAAkC;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,gCAAgC,yBAAyB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iCAAiC;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,qEAAqE,iCAAmB;AACxF,6EAA6E,iCAAmB;AAChG,uFAAuF,iCAAmB;AAC1G,2EAA2E,iCAAmB;AAC9F,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;AAC1F,mFAAmF,iCAAmB;AACtG,mFAAmF,iCAAmB;;;;;;;;;;;AAWtG;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,oEAAoE,iCAAmB;AACvF,qEAAqE,iCAAmB;AACxF,wEAAwE,iCAAmB;;;;;AAK3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,4EAA4E,iCAAmB;AAC/F,+DAA+D,iCAAmB;;;AAGlF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,mEAAmE,iCAAmB;AACtF,8EAA8E,iCAAmB;AACjG,qEAAqE,iCAAmB;AACxF,kEAAkE,iCAAmB;AACrF,uFAAuF,iCAAmB;AAC1G,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,oEAAoE,iCAAmB;AACvF,qFAAqF,iCAAmB;AACxG,qFAAqF,iCAAmB;AACxG,YAAY,QAAQ;AACpB,YAAY,sBAAsB;;;;;;;;;;;;AAYlC;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA,kEAAkE,EAAE,KAAK;AACzE;AACA;AACA,0EAA0E,EAAE,KAAK;AACjF;AACA,wEAAwE,EAAE,OAAO;AACjF,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sGAAsG;AACtG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,oEAAoE,iCAAmB;AACvF,mEAAmE,iCAAmB;AACtF,8EAA8E,iCAAmB;AACjG,qEAAqE,iCAAmB;AACxF,mEAAmE,iCAAmB;AACtF,wFAAwF,iCAAmB;AAC3G,2EAA2E,iCAAmB;AAC9F,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;AAC1F,oEAAoE,iCAAmB;AACvF,kFAAkF,iCAAmB;AACrG,kFAAkF,iCAAmB;;;;;;;;;;;;;;;AAerG;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA,iEAAiE,EAAE,KAAK;AACxE;AACA;AACA,yEAAyE,EAAE,KAAK;AAChF;AACA,wGAAwG;AACxG,wEAAwE,EAAE,OAAO;AACjF,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sGAAsG;AACtG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,0EAA0E,iCAAmB;AAC7F,4EAA4E,iCAAmB;AAC/F,0DAA0D,iCAAmB;AAC7E,0DAA0D,iCAAmB;AAC7E,0DAA0D,iCAAmB;AAC7E,6EAA6E,iCAAmB;;;;;;AAMhG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,mEAAmE,iCAAmB;AACtF,6EAA6E,iCAAmB;AAChG,qEAAqE,iCAAmB;AACxF,kEAAkE,iCAAmB;AACrF,2EAA2E,iCAAmB;AAC9F,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;;;;;;;;;AAS1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,uFAAuF,iCAAmB;AAC1G,kEAAkE,iCAAmB;AACrF,qEAAqE,iCAAmB;AACxF,mEAAmE,iCAAmB;AACtF,kEAAkE,iCAAmB;;;;;;;AAOrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,qEAAqE;AACrF;AACA;AACA;AACA;AACA;AACA,oCAAoC,MAAM;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,MAAM;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,uBAAuB,kCAAkC,UAAU;AAC7H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,aAAa,cAAc,WAAW;AAC3F;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,WAAW;AAC/C;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,8EAA8E,iCAAmB;AACjG,gFAAgF,iCAAmB;AACnG,qEAAqE,iCAAmB;AACxF,+DAA+D,iCAAmB;AAClF,qEAAqE,iCAAmB;AACxF,kEAAkE,iCAAmB;AACrF,mEAAmE,iCAAmB;AACtF,6EAA6E,iCAAmB;;;;;;;;;;AAUhG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,2EAA2E,iCAAmB;AAC9F,6EAA6E,iCAAmB;AAChG,uFAAuF,iCAAmB;AAC1G,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;AAC1F,6EAA6E,iCAAmB;;;;;;;;AAQhG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,0DAA0D,iCAAmB;;AAE7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oEAAoE;AACpE;AACA;AACA;AACA;AACA,mGAAmG,eAAe,oBAAoB,cAAc;AACpJ;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,qEAAqE,iCAAmB;AACxF,6EAA6E,iCAAmB;AAChG,uFAAuF,iCAAmB;AAC1G,2EAA2E,iCAAmB;AAC9F,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;AAC1F,sFAAsF,iCAAmB;AACzG,sFAAsF,iCAAmB;;;;;;;;;;;AAWzG;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,uEAAuE,iCAAmB;;AAE1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,4EAA4E,iCAAmB;AAC/F,8EAA8E,iCAAmB;AACjG,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;;;;;;AAM1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,0DAA0D,iCAAmB;AAC7E,oEAAoE,iCAAmB;;;AAGvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,6DAA6D;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,iBAAiB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,iBAAiB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,gBAAgB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,gBAAgB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,iBAAiB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,iBAAiB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wEAAwE,YAAY,GAAG,KAAK;AAC5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,YAAY,GAAG,MAAM;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,YAAY,GAAG,KAAK;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,8BAA8B;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,OAAO;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,UAAU,aAAa,UAAU,EAAE,+CAA+C;AAC/H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C,0BAA0B,MAAM,IAAI,SAAS,EAAE,yCAAyC;AACxF;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,+DAA+D,kCAAmB;AAClF,yEAAyE,kCAAmB;;;AAG5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,mEAAmE,kCAAmB;AACtF,kEAAkE,kCAAmB;;;;AAIrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE,MAAM;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,oBAAoB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,sBAAsB,IAAI;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,qBAAqB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,YAAY;AAClE,oBAAoB,gCAAgC,GAAG,gCAAgC;AACvF;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,YAAY;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yEAAyE;AACzE;AACA;AACA,2BAA2B;AAC3B;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,4EAA4E,kCAAmB;AAC/F,yEAAyE,kCAAmB;;;AAG5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uBAAuB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,0DAA0D,kCAAmB;AAC7E,oEAAoE,kCAAmB;;;AAGvF;AACA,wDAAwD,sBAAsB;AAC9E;AACA;AACA,4DAA4D,sBAAsB;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,yDAAyD;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,cAAc,OAAO,aAAa;AAC1F,mEAAmE,0BAA0B;AAC7F;AACA;AACA,8DAA8D,cAAc,OAAO,aAAa;AAChG;AACA,qFAAqF,aAAa;AAClG;AACA,4DAA4D,aAAa;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,gFAAgF,aAAa,IAAI,aAAa;AAC9G,8DAA8D,YAAY,MAAM,0BAA0B;AAC1G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,oBAAoB;AAChF,qBAAqB,qCAAqC;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,UAAU;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,UAAU;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,wBAAwB,YAAY;AACpC;AACA,kDAAkD,EAAE,KAAK;AACzD;AACA;AACA,0DAA0D,EAAE,KAAK;AACjE;AACA,2DAA2D;AAC3D,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,kCAAmB;;AAElF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,gCAAgC,uBAAuB;AACvD;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,wBAAwB;AACxD;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,gBAAgB,4BAA4B;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gBAAgB,kBAAkB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,OAAO;AACpD,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yFAAyF,kCAAmB;;AAE5G;AACA;AACA;AACA,wDAAwD,2BAA2B,IAAI;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,wCAAwC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yEAAyE,kCAAmB;AAC5F,+DAA+D,kCAAmB;AAClF,oEAAoE,kCAAmB;AACvF,iEAAiE,kCAAmB;AACpF,mEAAmE,kCAAmB;AACtF,0EAA0E,kCAAmB;AAC7F,mEAAmE,kCAAmB;;;;;;;;AAQtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA,wBAAwB;AACxB;AACA,2DAA2D,iCAAiC;AAC5F;AACA,kFAAkF;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,kBAAkB,YAAY,EAAE,yBAAyB,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY;AAChG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,0EAA0E,kCAAmB;;;AAG7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE,kBAAkB;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4BAA4B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,8BAA8B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD;AACA,gEAAgE;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,8BAA8B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,8BAA8B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,8BAA8B;;;AAG/B,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+EAA+E,kCAAmB;AAClG,+DAA+D,kCAAmB;AAClF,uEAAuE,kCAAmB;AAC1F,+FAA+F,kCAAmB;;;;;AAKlH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,kCAAkC;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,gCAAgC;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,+EAA+E,kCAAmB;AAClG,oEAAoE,kCAAmB;AACvF,4EAA4E,kCAAmB;;;;;AAK/F;AACA,qFAAqF,kCAAkC;AACvH,IAAI,gBAAgB,GAAG,mBAAmB,GAAG,uBAAuB,GAAG,gBAAgB,GAAG,mBAAmB,GAAG,gBAAgB,OAAO,kBAAkB;AACzJ,IAAI,kBAAkB;AACtB;AACA,yDAAyD,6BAA6B;AACtF,qEAAqE,2BAA2B,KAAK;AACrG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8FAA8F;AAC9F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,6BAA6B;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,iEAAiE,kCAAmB;AACpF,yEAAyE,kCAAmB;AAC5F,yFAAyF,kCAAmB;AAC5G,kEAAkE,kCAAmB;AACrF,2EAA2E,kCAAmB;AAC9F,+EAA+E,kCAAmB;AAClG,gFAAgF,kCAAmB;AACnG,gEAAgE,kCAAmB;AACnF,8DAA8D,kCAAmB;;;;;;;;;;;AAWjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA,gBAAgB,2IAA2I;AAC3J;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,kBAAkB;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,eAAe,yDAAyD,+DAA+D;AACpL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,iEAAiE,kCAAmB;AACpF,mEAAmE,kCAAmB;AACtF,yEAAyE,kCAAmB;AAC5F,kEAAkE,kCAAmB;;;;;;AAMrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kCAAkC;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wHAAwH,uBAAuB;AAC/I;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,2EAA2E,kCAAmB;AAC9F,qEAAqE,kCAAmB;AACxF,6GAA6G,kCAAmB;AAChI,+EAA+E,kCAAmB;AAClG,gFAAgF,kCAAmB;AACnG,uEAAuE,kCAAmB;AAC1F,2EAA2E,kCAAmB;AAC9F,0EAA0E,kCAAmB;AAC7F,kFAAkF,kCAAmB;AACrG,mEAAmE,kCAAmB;AACtF,gEAAgE,kCAAmB;AACnF,wEAAwE,kCAAmB;AAC3F,iFAAiF,kCAAmB;AACpG,kEAAkE,kCAAmB;;;;;;;;;;;;;;AAcrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,gDAAgD;AACrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,4EAA4E,kCAAmB;AAC/F,gEAAgE,kCAAmB;AACnF,kEAAkE,kCAAmB;AACrF,mEAAmE,kCAAmB;AACtF,qEAAqE,kCAAmB;AACxF,yFAAyF,kCAAmB;AAC5G,kEAAkE,kCAAmB;;;;;;;;AAQrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,iCAAiC,IAAI,uBAAuB;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,cAAc;AACjH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,6CAA6C,uBAAuB;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,UAAU,gBAAgB,cAAc;AAClG;AACA;AACA,yFAAyF;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+EAA+E,kCAAmB;AAClG,+DAA+D,kCAAmB;AAClF,iEAAiE,kCAAmB;;;;AAIpF;AACA;AACA;AACA;AACA;AACA,gBAAgB,+BAA+B;AAC/C;AACA;AACA;AACA;AACA;AACA,gBAAgB,gBAAgB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,iEAAiE,kCAAmB;AACpF,kEAAkE,kCAAmB;AACrF,qEAAqE,kCAAmB;;;;AAIxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4CAA4C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,eAAe;AACvC,4BAA4B,eAAe;AAC3C,sBAAsB,yBAAyB;AAC/C;AACA;AACA,mBAAmB,yBAAyB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,qBAAqB;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,2EAA2E,kCAAmB;AAC9F,gEAAgE,kCAAmB;AACnF,6GAA6G,kCAAmB;AAChI,sFAAsF,kCAAmB;AACzG,2EAA2E,kCAAmB;AAC9F,qEAAqE,kCAAmB;AACxF,0EAA0E,kCAAmB;AAC7F,+EAA+E,kCAAmB;;;;;;;;;AASlG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gCAAgC;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yFAAyF,kCAAmB;AAC5G,qEAAqE,kCAAmB;;;AAGxF;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,mEAAmE,kCAAmB;AACtF,qEAAqE,kCAAmB;AACxF,gEAAgE,kCAAmB;;;;AAInF;AACA,cAAc,kBAAkB,uCAAuC;AACvE;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA,CAAC,gDAAgD;;;AAGjD,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,mFAAmF,kCAAmB;AACtG,4EAA4E,kCAAmB;AAC/F,sEAAsE,kCAAmB;;;;AAIzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,wEAAwE,kCAAmB;AAC3F,+EAA+E,kCAAmB;AAClG,+EAA+E,kCAAmB;;;;;AAKlG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,IAAI;AAChB;AACA;AACA,oDAAoD,eAAe;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iEAAiE,kCAAmB;AACpF,+DAA+D,kCAAmB;AAClF,qEAAqE,kCAAmB;AACxF,+EAA+E,kCAAmB;AAClG,oEAAoE,kCAAmB;AACvF,mEAAmE,kCAAmB;;;;;;;AAOtF;AACA;AACA,IAAI,kCAAkC;AACtC;AACA,oCAAoC,yBAAyB;AAC7D;AACA;AACA;AACA;AACA,iEAAiE,YAAY,yBAAyB;AACtG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,uBAAuB,aAAa,uBAAuB;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;;AAEnF;AACA,gBAAgB,kBAAkB,+BAA+B;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iEAAiE,kCAAmB;AACpF,kEAAkE,kCAAmB;;;AAGrF;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,gBAAgB;AAChC,uFAAuF;AACvF,mFAAmF;AACnF;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,2CAA2C;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,gBAAgB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,oBAAoB;AAC9C,wBAAwB,kBAAkB;AAC1C;AACA,SAAS;AACT;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,kEAAkE,kCAAmB;AACrF,iEAAiE,kCAAmB;AACpF,+EAA+E,kCAAmB;;;;;AAKlG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,sEAAsE;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,mCAAmC;AACrE;AACA;AACA;AACA;AACA;AACA,0EAA0E,OAAO,4BAA4B,SAAS;AACtH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,OAAO,cAAc,YAAY;AAC/G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;AACnF,qEAAqE,kCAAmB;;;AAGxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,sCAAsC,iCAAiC,sBAAsB;AACzG;AACA;AACA;AACA;AACA,gBAAgB,yBAAyB;AACzC;AACA;AACA;AACA;AACA;AACA,gHAAgH,iBAAiB;AACjI;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE,EAAE,IAAI,EAAE,QAAQ,GAAG,0BAA0B,kBAAkB;AAClI;AACA;AACA,mEAAmE,EAAE,IAAI,EAAE,QAAQ,GAAG,0BAA0B,eAAe;AAC/H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,EAAE,IAAI,EAAE;AAC3D;AACA;AACA;AACA,kDAAkD,sBAAsB;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE,EAAE,IAAI,EAAE,QAAQ,GAAG,0BAA0B,kBAAkB;AAClI;AACA;AACA,mEAAmE,EAAE,IAAI,EAAE,QAAQ,GAAG,0BAA0B,eAAe;AAC/H;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,EAAE,IAAI,EAAE;AAC3D;AACA;AACA,mDAAmD,qBAAqB;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,iCAAiC,SAAS;AAC1C;AACA;AACA,qCAAqC,sBAAsB;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,eAAe,gDAAgD,aAAa,yBAAyB;AACrH,iCAAiC;AACjC,iCAAiC;AACjC,wBAAwB,UAAU;AAClC,4BAA4B,UAAU;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,gCAAgC;AAChC,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iEAAiE,kCAAmB;AACpF,+DAA+D,kCAAmB;AAClF,8DAA8D,kCAAmB;;;;AAIjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,gBAAgB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,gBAAgB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;AACnF,mEAAmE,kCAAmB;AACtF,qEAAqE,kCAAmB;AACxF,oEAAoE,kCAAmB;AACvF,qEAAqE,kCAAmB;;;;;;AAMxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,uBAAuB;AACzD;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,+CAA+C;AAC/C,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,qEAAqE,kCAAmB;AACxF,gEAAgE,kCAAmB;AACnF,kEAAkE,kCAAmB;;;;;AAKrF;AACA;AACA;AACA;AACA;AACA,wBAAwB,8CAA8C;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,sBAAsB;AAChD;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gBAAgB,qCAAqC,IAAI;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,wEAAwE,kCAAmB;;AAE3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,sCAAsC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,iEAAiE,kCAAmB;AACpF,gEAAgE,kCAAmB;AACnF,qEAAqE,kCAAmB;AACxF,uEAAuE,kCAAmB;AAC1F,qEAAqE,kCAAmB;AACxF,mEAAmE,kCAAmB;AACtF,8DAA8D,kCAAmB;AACjF,2EAA2E,kCAAmB;AAC9F,gFAAgF,kCAAmB;AACnG,wEAAwE,kCAAmB;AAC3F,0EAA0E,kCAAmB;AAC7F,4EAA4E,kCAAmB;AAC/F,iEAAiE,kCAAmB;AACpF,iEAAiE,kCAAmB;AACpF,oEAAoE,kCAAmB;AACvF,kEAAkE,kCAAmB;AACrF,+DAA+D,kCAAmB;AAClF,qEAAqE,kCAAmB;AACxF,+DAA+D,kCAAmB;AAClF,oEAAoE,kCAAmB;AACvF,qEAAqE,kCAAmB;AACxF,iEAAiE,kCAAmB;AACpF,oEAAoE,kCAAmB;AACvF,sEAAsE,kCAAmB;AACzF,yEAAyE,kCAAmB;AAC5F,2FAA2F,kCAAmB;AAC9G,mGAAmG,kCAAmB;AACtH,gGAAgG,kCAAmB;AACnH,sGAAsG,kCAAmB;AACzH,6EAA6E,kCAAmB;AAChG,qFAAqF,kCAAmB;AACxG,2FAA2F,kCAAmB;AAC9G,oGAAoG,kCAAmB;AACvH,iFAAiF,kCAAmB;AACpG,oEAAoE,kCAAmB;AACvF,mEAAmE,kCAAmB;AACtF,yEAAyE,kCAAmB;AAC5F,gFAAgF,kCAAmB;AACnG,gFAAgF,kCAAmB;AACnG,oFAAoF,kCAAmB;AACvG,2EAA2E,kCAAmB;AAC9F,gEAAgE,kCAAmB;AACnF,6EAA6E,kCAAmB;AAChG;;;;;;;;AAQA;;;;;;AAMA;;;;;;;;;;;;;;;;;AAiBA;;;AAGA;;;;;;;;AAQA;;;;;;;AAOA;;AAEA;;;;;AAKA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA,aAAa;AACb;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;AACnF,sEAAsE,kCAAmB;;;AAGzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,qBAAqB;AACjF;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA,6DAA6D,SAAS;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,SAAS;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,SAAS;AACvD;AACA;AACA;AACA;AACA,2CAA2C,SAAS;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oEAAoE;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,+BAA+B;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,0BAA0B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oBAAoB;;;AAGrB,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iEAAiE,kCAAmB;AACpF,qEAAqE,kCAAmB;AACxF,kEAAkE,kCAAmB;AACrF,8EAA8E,kCAAmB;;;;;AAKjG;AACA;AACA;AACA,gBAAgB,yCAAyC;AACzD;AACA;AACA;AACA,6BAA6B,iBAAiB;AAC9C,6BAA6B,iBAAiB;AAC9C;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C,8CAA8C;AAC9C,4CAA4C;AAC5C,8CAA8C;AAC9C;AACA,+BAA+B,SAAS;AACxC,+BAA+B,SAAS;AACxC,+BAA+B,SAAS;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,gEAAgE,kCAAmB;AACnF,qEAAqE,kCAAmB;AACxF,sEAAsE,kCAAmB;;;;;AAKzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oBAAoB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB,gBAAgB,kBAAkB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kDAAkD;;;AAGnD,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,sEAAsE,kCAAmB;AACzF,iFAAiF,kCAAmB;;;;AAIpG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,sCAAsC;;;AAGvC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yFAAyF,kCAAmB;;AAE5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;AACnF,iFAAiF,kCAAmB;AACpG,qEAAqE,kCAAmB;AACxF,sEAAsE,kCAAmB;AACzF,qEAAqE,kCAAmB;AACxF,4EAA4E,kCAAmB;AAC/F,wEAAwE,kCAAmB;AAC3F,wEAAwE,kCAAmB;AAC3F,8EAA8E,kCAAmB;AACjG,uEAAuE,kCAAmB;AAC1F,oEAAoE,kCAAmB;AACvF,qEAAqE,kCAAmB;AACxF,qEAAqE,kCAAmB;AACxF,sEAAsE,kCAAmB;;;;;;;;;;;;;;;AAezF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE,SAAS;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,8BAA8B;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,yEAAyE,kCAAmB;;AAE5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,8BAA8B;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oCAAoC;;;AAGrC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+EAA+E,kCAAmB;AAClG,+EAA+E,kCAAmB;AAClG,+EAA+E,kCAAmB;AAClG,oFAAoF,kCAAmB;AACvG,0EAA0E,kCAAmB;AAC7F,0EAA0E,kCAAmB;AAC7F,4FAA4F,kCAAmB;AAC/G,yFAAyF,kCAAmB;;;;;;;AAO5G;AACA;AACA;AACA;AACA,0DAA0D,0BAA0B;AACpF,QAAQ,kBAAkB;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA,uHAAuH,WAAW;AAClI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,qBAAqB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA,8BAA8B,sBAAsB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kCAAkC;;;AAGnC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA,CAAC,wCAAwC;;;AAGzC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,6EAA6E,kCAAmB;AAChG,yEAAyE,kCAAmB;;;;;;;;;;AAU5F,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,uEAAuE,kCAAmB;AAC1F,kEAAkE,kCAAmB;AACrF,uEAAuE,kCAAmB;AAC1F,+DAA+D,kCAAmB;;;;;;AAMlF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,qBAAqB,2BAA2B,wBAAwB;AACpF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4EAA4E,4BAA4B;AACxG,gBAAgB,qDAAqD,IAAI;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,aAAa;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,uBAAuB;AACtC;AACA;AACA;AACA,eAAe,iBAAiB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,cAAc;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,YAAY;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;AACnF,8DAA8D,kCAAmB;AACjF,gEAAgE,kCAAmB;;;;AAInF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,WAAW;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,gBAAgB;AACpE,oDAAoD,gBAAgB;AACpE,oDAAoD,gBAAgB;AACpE,oDAAoD,gBAAgB;AACpE,0DAA0D,UAAU;AACpE,0DAA0D,UAAU;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,cAAc;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG,cAAc,EAAE,cAAc,EAAE,aAAa;AAChD,GAAG,cAAc,EAAE,cAAc,EAAE,aAAa;AAChD;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,8DAA8D,kCAAmB;;AAEjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,OAAO;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,WAAW;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C,4BAA4B,uBAAuB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA,6EAA6E;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gCAAgC;;;AAGjC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;AACnF,qEAAqE,kCAAmB;AACxF,gEAAgE,kCAAmB;AACnF,uEAAuE,kCAAmB;AAC1F,mEAAmE,kCAAmB;AACtF,qEAAqE,kCAAmB;AACxF,gEAAgE,kCAAmB;AACnF,4EAA4E,kCAAmB;AAC/F,sEAAsE,kCAAmB;AACzF,oEAAoE,kCAAmB;AACvF,8DAA8D,kCAAmB;AACjF,+DAA+D,kCAAmB;AAClF,uEAAuE,kCAAmB;AAC1F,+DAA+D,kCAAmB;AAClF,wEAAwE,kCAAmB;;;;;;;;;;;;;;;;;;AAkB3F,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,uEAAuE,kCAAmB;AAC1F,8DAA8D,kCAAmB;;;AAGjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,8DAA8D,kCAAmB;AACjF,gEAAgE,kCAAmB;;;;AAInF;AACA;AACA;AACA;AACA,CAAC,0CAA0C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,WAAW;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc;AACjE,GAAG,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc;AACjE,GAAG,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,cAAc;AAClE,GAAG,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,cAAc;AAClE;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oCAAoC;;;AAGrC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,uEAAuE,kCAAmB;AAC1F,8DAA8D,kCAAmB;AACjF,gEAAgE,kCAAmB;AACnF,qEAAqE,kCAAmB;AACxF,sEAAsE,kCAAmB;;;;;;AAMzF;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,4BAA4B,UAAU;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,4BAA4B,UAAU;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,uEAAuE,kCAAmB;AAC1F,8DAA8D,kCAAmB;;;AAGjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8FAA8F,mBAAmB;AACjH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6EAA6E;AAC7E,iCAAiC,uBAAuB;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,sBAAsB,IAAI,sBAAsB;AACvE;AACA,mBAAmB,OAAO,IAAI,OAAO;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kCAAkC;;;AAGnC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,kCAAmB;AAClF,qEAAqE,kCAAmB;AACxF,mEAAmE,kCAAmB;AACtF,6EAA6E,kCAAmB;AAChG,oFAAoF,kCAAmB;AACvG,qEAAqE,kCAAmB;AACxF,qEAAqE,kCAAmB;AACxF,8DAA8D,kCAAmB;;;;;;;;;AASjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,wEAAwE,GAAG;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,0FAA0F,IAAI;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,mEAAmE,kCAAmB;AACtF,mEAAmE,kCAAmB;AACtF,qEAAqE,kCAAmB;AACxF,qEAAqE,kCAAmB;AACxF,qEAAqE,kCAAmB;;;;;;AAMxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,cAAc;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,QAAQ;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yGAAyG,SAAS;AAClH,2GAA2G,SAAS;AACpH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,kCAAmB;AAClF,qEAAqE,kCAAmB;AACxF,qEAAqE,kCAAmB;AACxF,iFAAiF,kCAAmB;AACpG,mEAAmE,kCAAmB;AACtF,qEAAqE,kCAAmB;AACxF,mEAAmE,kCAAmB;AACtF,yEAAyE,kCAAmB;;;;;;;;;AAS5F;AACA;AACA;AACA,WAAW,gBAAgB;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,gIAAgI;AAChJ;AACA,uJAAuJ;AACvJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA,wEAAwE,sBAAsB,IAAI;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,4EAA4E,IAAI;AAChG,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kCAAkC;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,+BAA+B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,+DAA+D,kCAAmB;AAClF,qEAAqE,kCAAmB;AACxF,6GAA6G,kCAAmB;AAChI,oFAAoF,kCAAmB;AACvG,sFAAsF,kCAAmB;AACzG,+EAA+E,kCAAmB;AAClG,mEAAmE,kCAAmB;AACtF,+EAA+E,kCAAmB;AAClG,8EAA8E,kCAAmB;;;;;;;;;;AAUjG;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA,gBAAgB,uBAAuB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,QAAQ;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+FAA+F,4CAA4C;AAC3I;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,mCAAmC;AAC3C;AACA;AACA;AACA;AACA,QAAQ,kCAAkC;AAC1C;AACA;AACA;AACA,CAAC,8CAA8C;;;AAG/C,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,mEAAmE,kCAAmB;AACtF,yEAAyE,kCAAmB;AAC5F,4EAA4E,kCAAmB;AAC/F,6EAA6E,kCAAmB;;;;;;;;AAQhG,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,uEAAuE,kCAAmB;AAC1F,kEAAkE,kCAAmB;;;AAGrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,wBAAwB,IAAI;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,IAAI;AACjE;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,UAAU,gBAAgB,cAAc;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,aAAa;AACpC;AACA;AACA,sEAAsE,mDAAmD;AACzH;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,8EAA8E,kCAAmB;AACjG,4EAA4E,kCAAmB;AAC/F,8EAA8E,kCAAmB;;;;;AAKjG;AACA,QAAQ,kBAAkB;AAC1B,IAAI,kBAAkB,OAAO,mBAAmB,mCAAmC;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF,SAAS;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,oBAAoB,QAAQ;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,OAAO;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,OAAO;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,wBAAwB,UAAU;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,eAAe;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,aAAa;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;AACA,oDAAoD,aAAa;AACjE;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D;AAC/D,yDAAyD;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,UAAU;AAC7C,oDAAoD,cAAc;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,6BAA6B;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,MAAM,IAAI,MAAM,IAAI,MAAM;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,qEAAqE,kCAAmB;AACxF,6DAA6D,kCAAmB;AAChF,8DAA8D,kCAAmB;;;;;;;AAOjF,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,sEAAsE,kCAAmB;;;AAGzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,mBAAmB;AAC3B,6DAA6D,mBAAmB;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yGAAyG,UAAU;AACnH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,SAAS;AACT;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA,sBAAsB;AACtB,+DAA+D,kCAAmB;AAClF,sEAAsE,kCAAmB;AACzF,0EAA0E,kCAAmB;;;;;;AAM7F,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,wFAAwF,kCAAmB;AAC3G,kEAAkE,kCAAmB;AACrF,0EAA0E,kCAAmB;AAC7F,sEAAsE,kCAAmB;AACzF,4EAA4E,kCAAmB;AAC/F,oEAAoE,kCAAmB;AACvF,kEAAkE,kCAAmB;AACrF,sEAAsE,kCAAmB;;;;;;;;;AASzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,gBAAgB;AACxB,mDAAmD,gBAAgB,OAAO;AAC1E,sCAAsC,iBAAiB;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,WAAW;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,gBAAgB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,2EAA2E,kCAAmB;AAC9F,mEAAmE,kCAAmB;AACtF,sEAAsE,kCAAmB;AACzF,qEAAqE,kCAAmB;;;;;AAKxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,MAAM;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,+BAA+B,IAAI;AACnC;AACA;AACA;AACA;AACA;AACA,uDAAuD;AACvD;AACA;AACA;AACA,qBAAqB;AACrB;AACA,iBAAiB;AACjB;AACA,gCAAgC,2BAA2B;AAC3D;AACA;AACA,qBAAqB;AACrB;AACA,iBAAiB;AACjB;AACA,gCAAgC,MAAM;AACtC;AACA;AACA;AACA,qBAAqB;AACrB;AACA,iBAAiB;AACjB;AACA,gCAAgC,MAAM;AACtC;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,sBAAsB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA,sBAAsB;AACtB,wEAAwE,kCAAmB;AAC3F,iEAAiE,kCAAmB;AACpF,kEAAkE,kCAAmB;AACrF,gEAAgE,kCAAmB;AACnF,iEAAiE,kCAAmB;AACpF,gEAAgE,kCAAmB;AACnF,+DAA+D,kCAAmB;AAClF,oEAAoE,kCAAmB;AACvF,iEAAiE,kCAAmB;AACpF,uFAAuF,kCAAmB;AAC1G,qFAAqF,kCAAmB;AACxG,iFAAiF,kCAAmB;AACpG,oFAAoF,kCAAmB;AACvG,uFAAuF,kCAAmB;AAC1G,kFAAkF,kCAAmB;AACrG,4EAA4E,kCAAmB;AAC/F,8EAA8E,kCAAmB;AACjG,+EAA+E,kCAAmB;AAClG,wFAAwF,kCAAmB;AAC3G,mFAAmF,kCAAmB;AACtG,gFAAgF,kCAAmB;AACnG,sEAAsE,kCAAmB;AACzF,0EAA0E,kCAAmB;AAC7F,6EAA6E,kCAAmB;AAChG,iFAAiF,kCAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BpG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,2BAA2B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,YAAY,iBAAiB;AAC7B;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,oCAAoC;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,eAAe;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wGAAwG,IAAI;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yGAAyG,IAAI;AAC7G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sGAAsG,IAAI;AAC1G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uGAAuG,IAAI;AAC3G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,gBAAgB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kFAAkF,kFAAkF;AACpK;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E,sIAAsI;AAChN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,sBAAsB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,uBAAuB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,oBAAoB;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,qBAAqB;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE,gBAAgB;AACtF;AACA;AACA;AACA;AACA;AACA;AACA,qFAAqF,kFAAkF;AACvK;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,SAAS;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,gBAAgB;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4EAA4E,gBAAgB;AAC5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,gBAAgB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,iBAAiB,mCAAmC,gBAAgB;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oFAAoF,gBAAgB;AACpG;AACA;AACA;AACA;AACA,yCAAyC,gBAAgB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,QAAQ;AACvD;AACA;AACA,6CAA6C,QAAQ;AACrD;AACA;AACA;AACA;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,gBAAgB;AAClC,uCAAuC,sBAAsB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,eAAe;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA,4BAA4B,2BAA2B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,kEAAkE,kCAAmB;AACrF,yEAAyE,kCAAmB;AAC5F,mEAAmE,kCAAmB;AACtF,wGAAwG,kCAAmB;AAC3H,2GAA2G,kCAAmB;AAC9H,sEAAsE,kCAAmB;;;;;;;;AAQzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oGAAoG;AACpG;AACA;AACA;AACA;AACA;AACA,qGAAqG;AACrG;AACA;AACA;AACA;AACA;AACA,uDAAuD,sBAAsB;AAC7E;AACA;AACA,YAAY,6BAA6B;AACzC;AACA;AACA;AACA;AACA,uDAAuD,mBAAmB;AAC1E;AACA;AACA,YAAY,6BAA6B;AACzC;AACA;AACA;AACA;AACA,gCAAgC,8BAA8B;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6EAA6E;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kCAAkC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,uFAAuF;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+FAA+F,wBAAwB;AACvH;AACA;AACA,6FAA6F,YAAY;AACzG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,8EAA8E,sBAAsB,GAAG,uBAAuB,qBAAqB,gBAAgB;AACnK;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,eAAe;AAClH;AACA;AACA;AACA,sEAAsE,gBAAgB;AACtF,8CAA8C,gBAAgB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,8BAA8B,8BAA8B;AACzF,qDAAqD,gBAAgB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,4CAA4C,KAAK,8BAA8B,MAAM,4BAA4B;AAC/I;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,oCAAoC;AACpD;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,+DAA+D,kCAAmB;AAClF,6GAA6G,kCAAmB;AAChI,iFAAiF,kCAAmB;AACpG,0EAA0E,kCAAmB;;;;;;AAM7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,gBAAgB;AAC3B;AACA;AACA;AACA;AACA;AACA,gBAAgB,WAAW;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yFAAyF,kCAAmB;;AAE5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,sFAAsF,kCAAmB;AACzG,6GAA6G,kCAAmB;AAChI,kFAAkF,kCAAmB;AACrG,+EAA+E,kCAAmB;;;;;AAKlG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gCAAgC;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,iFAAiF,kCAAmB;AACpG,+EAA+E,kCAAmB;AAClG,qFAAqF,kCAAmB;AACxG,iFAAiF,kCAAmB;AACpG,gGAAgG,kCAAmB;AACnH,qEAAqE,kCAAmB;AACxF,6GAA6G,kCAAmB;AAChI,sFAAsF,kCAAmB;AACzG,kEAAkE,kCAAmB;AACrF,mEAAmE,kCAAmB;AACtF,kFAAkF,kCAAmB;AACrG,iFAAiF,kCAAmB;AACpG,sEAAsE,kCAAmB;AACzF,gGAAgG,kCAAmB;;;;;;;;;;;;;;AAcnH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,qBAAqB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,wBAAwB;AACnE;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,8GAA8G;AAC9H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,YAAY;AACpC,4BAA4B,WAAW;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sHAAsH;AACtH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,wBAAwB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,wBAAwB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,2GAA2G;AAC3H,gBAAgB,sDAAsD;AACtE;AACA;AACA;AACA,4BAA4B,mBAAmB;AAC/C;AACA;AACA;AACA;AACA,4BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,4DAA4D;AACzH;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,gFAAgF,kCAAmB;AACnG,qEAAqE,kCAAmB;AACxF,kEAAkE,kCAAmB;AACrF,sFAAsF,kCAAmB;AACzG,6GAA6G,kCAAmB;AAChI,iFAAiF,kCAAmB;AACpG,iFAAiF,kCAAmB;AACpG,oFAAoF,kCAAmB;AACvG,kEAAkE,kCAAmB;AACrF,mEAAmE,kCAAmB;AACtF,0GAA0G,kCAAmB;AAC7H,sFAAsF,kCAAmB;AACzG,yFAAyF,kCAAmB;AAC5G,iEAAiE,kCAAmB;AACpF,sEAAsE,kCAAmB;AACzF,2EAA2E,kCAAmB;AAC9F,oEAAoE,kCAAmB;AACvF,iFAAiF,kCAAmB;AACpG,gGAAgG,kCAAmB;;;;;;;;;;;;;;;;;;;AAmBnH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C,4BAA4B,eAAe;AAC3C;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,QAAQ;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA,4BAA4B,eAAe;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,eAAe;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,eAAe;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,eAAe;AACnC;AACA;AACA;AACA,gBAAgB,OAAO;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,eAAe;AAChD,qCAAqC,eAAe;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,eAAe;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0GAA0G;AAC1G;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA,mEAAmE,6BAA6B;AAChG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,4IAA4I;AAC5J,gBAAgB,sDAAsD;AACtE;AACA;AACA;AACA;AACA,4BAA4B,mBAAmB;AAC/C;AACA;AACA;AACA,4BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,4DAA4D;AACrH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,uBAAuB;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,iBAAiB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,kBAAkB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,eAAe;AACrD;AACA,kCAAkC,qBAAqB;AACvD;AACA,sBAAsB,qBAAqB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,iEAAiE,kCAAmB;AACpF,sEAAsE,kCAAmB;AACzF,kFAAkF,kCAAmB;AACrG,+EAA+E,kCAAmB;;;;;;;AAOlG,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,qEAAqE,kCAAmB;;;AAGxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;AACnF,iFAAiF,kCAAmB;AACpG,+DAA+D,kCAAmB;AAClF,sEAAsE,kCAAmB;;;;;AAKzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,0BAA0B;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,YAAY;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,iBAAiB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,0CAA0C,iBAAiB;AAC3D;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA,QAAQ,IAAI;AACZ;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,6DAA6D,kCAAmB;;;AAGhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,QAAQ;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,wBAAwB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iEAAiE,kCAAmB;AACpF,gEAAgE,kCAAmB;AACnF,6DAA6D,kCAAmB;;;;AAIhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG;AACnG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E,IAAI;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,cAAc;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA,KAAK;AACL;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,+DAA+D,kCAAmB;AAClF,6DAA6D,kCAAmB;;;AAGhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,kBAAkB,EAAE,mCAAmC,EAAE,yBAAyB;AACrH,2BAA2B,iBAAiB,sBAAsB,gBAAgB;AAClF,+CAA+C,yBAAyB;AACxE;AACA;AACA;AACA;AACA,sCAAsC,gBAAgB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6DAA6D,kCAAmB;;AAEhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,oCAAoC;AAC9E;AACA;AACA;AACA,uCAAuC;AACvC,8CAA8C;AAC9C,gDAAgD;AAChD;AACA;AACA,uCAAuC;AACvC,8CAA8C;AAC9C,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,+DAA+D,kCAAmB;;AAElF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,uBAAuB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,gBAAgB;AACtC,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;;AAExF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;AAGD,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,8DAA8D,kCAAmB;AACjF,6DAA6D,kCAAmB;AAChF,oEAAoE,kCAAmB;AACvF,yEAAyE,kCAAmB;AAC5F,kEAAkE,kCAAmB;;;;;;;;;AASrF,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,+DAA+D,kCAAmB;AAClF;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4BAA4B;AAC7B;AACA;AACA,oCAAoC,0BAA0B,KAAK,wBAAwB;AAC3F,gBAAgB,mBAAmB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,mBAAmB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,yBAAyB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,yBAAyB;AAClE;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,wBAAwB;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,wBAAwB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,wBAAwB;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,wBAAwB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,yBAAyB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,yBAAyB;AAClE;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,yBAAyB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,yBAAyB;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA,wBAAwB,yBAAyB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;;AAErF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,YAAY;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6DAA6D,kCAAmB;;AAEhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE,WAAW,0DAA0D,gBAAgB;AACtJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0GAA0G,6CAA6C;AACvJ;AACA;AACA;AACA;AACA;AACA,mIAAmI,0DAA0D;AAC7L;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;;AAExF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,gEAAgE,kCAAmB;;;AAGnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,WAAW;AACvD;AACA;AACA;AACA;AACA,wCAAwC,oBAAoB;AAC5D;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,sFAAsF,kCAAmB;AACzG,6DAA6D,kCAAmB;;;AAGhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,aAAa;AACb;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,+DAA+D,kCAAmB;AAClF,4DAA4D,kCAAmB;AAC/E,gEAAgE,kCAAmB;AACnF,0EAA0E,kCAAmB;AAC7F,gEAAgE,kCAAmB;AACnF,+DAA+D,kCAAmB;AAClF,oEAAoE,kCAAmB;AACvF,gEAAgE,kCAAmB;AACnF,qEAAqE,kCAAmB;AACxF,uEAAuE,kCAAmB;AAC1F,6EAA6E,kCAAmB;AAChG,iEAAiE,kCAAmB;AACpF,gEAAgE,kCAAmB;AACnF,8EAA8E,kCAAmB;AACjG,0EAA0E,kCAAmB;AAC7F,gEAAgE,kCAAmB;AACnF,wEAAwE,kCAAmB;AAC3F,gEAAgE,kCAAmB;AACnF,kEAAkE,kCAAmB;AACrF,wEAAwE,kCAAmB;AAC3F,wEAAwE,kCAAmB;AAC3F,0EAA0E,kCAAmB;AAC7F,2EAA2E,kCAAmB;AAC9F,0EAA0E,kCAAmB;AAC7F,sFAAsF,kCAAmB;AACzG,yEAAyE,kCAAmB;AAC5F,gEAAgE,kCAAmB;AACnF,yEAAyE,kCAAmB;AAC5F,2EAA2E,kCAAmB;AAC9F,6EAA6E,kCAAmB;AAChG,+EAA+E,kCAAmB;AAClG,8EAA8E,kCAAmB;AACjG,oFAAoF,kCAAmB;AACvG,qFAAqF,kCAAmB;AACxG,mFAAmF,kCAAmB;AACtG,iFAAiF,kCAAmB;AACpG,8EAA8E,kCAAmB;AACjG,4EAA4E,kCAAmB;AAC/F,6EAA6E,kCAAmB;AAChG,wEAAwE,kCAAmB;AAC3F,yEAAyE,kCAAmB;AAC5F,0EAA0E,kCAAmB;AAC7F,4EAA4E,kCAAmB;AAC/F,qEAAqE,kCAAmB;AACxF,uEAAuE,kCAAmB;AAC1F,0EAA0E,kCAAmB;AAC7F,wEAAwE,kCAAmB;AAC3F,+EAA+E,kCAAmB;AAClG,0EAA0E,kCAAmB;AAC7F,mEAAmE,kCAAmB;AACtF,oEAAoE,kCAAmB;AACvF,mEAAmE,kCAAmB;AACtF,qEAAqE,kCAAmB;AACxF,wEAAwE,kCAAmB;AAC3F,uEAAuE,kCAAmB;AAC1F,4EAA4E,kCAAmB;AAC/F,sEAAsE,kCAAmB;AACzF,yEAAyE,kCAAmB;AAC5F,yEAAyE,kCAAmB;AAC5F,sEAAsE,kCAAmB;AACzF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA;;;;;;;;;;;;;;;;;;AAkBA;;;;;;;;;;;;;;;;;;;AAmBA;AACA;AACA,YAAY;AACZ;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iFAAiF;;AAEjF,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iFAAiF;;AAEjF,OAAO;;AAEP,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,kBAAkB,kCAAmB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE,kCAAmB;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,kCAAmB;AAC7B;AACA;AACA;AACA,WAAW,kCAAmB,aAAa,WAAW;AACtD;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU,kCAAmB;AAC7B;AACA,eAAe,kCAAmB,wBAAwB,kCAAmB;AAC7E,mDAAmD,wCAAwC;AAC3F;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU,kCAAmB;AAC7B,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU,kCAAmB;AAC7B;AACA,iEAAiE,iBAAiB;AAClF;AACA,0DAA0D,aAAa;AACvE;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,0BAAmB,GAAG,kCAAmB;AACtD,sDAAsD,0BAAmB;AACzE,gDAAgD,0BAAmB;AACnE,8CAA8C,0BAAmB;AACjE,iDAAiD,0BAAmB;AACpE,mDAAmD,0BAAmB;AACtE,mDAAmD,0BAAmB;AACtE,gDAAgD,0BAAmB;AACnE,gDAAgD,0BAAmB;AACnE,wCAAwC,0BAAmB;AAC3D,8CAA8C,0BAAmB;AACjE,2CAA2C,0BAAmB;AAC9D,iDAAiD,0BAAmB;AACpE,+CAA+C,0BAAmB;AAClE,4CAA4C,0BAAmB;AAC/D,qDAAqD,0BAAmB;AACxE,kDAAkD,0BAAmB;AACrE,oDAAoD,0BAAmB;AACvE,+CAA+C,0BAAmB;AAClE,sDAAsD,0BAAmB;AACzE,uCAAuC,0BAAmB;AAC1D,uCAAuC,0BAAmB;AAC1D,4CAA4C,0BAAmB;AAC/D,8CAA8C,0BAAmB;AACjE,wCAAwC,0BAAmB;AAC3D,gDAAgD,0BAAmB;AACnE,8CAA8C,0BAAmB;AACjE,mDAAmD,0BAAmB;AACtE,gDAAgD,0BAAmB;AACnE,0CAA0C,0BAAmB;AAC7D,yCAAyC,0BAAmB;AAC5D,+CAA+C,0BAAmB;AAClE,yCAAyC,0BAAmB;AAC5D,yCAAyC,0BAAmB;AAC5D,iDAAiD,0BAAmB;AACpE,wCAAwC,0BAAmB;AAC3D,uDAAuD,0BAAmB;AAC1E,2CAA2C,0BAAmB;AAC9D,oDAAoD,0BAAmB;AACvE,mDAAmD,0BAAmB;AACtE,oDAAoD,0BAAmB;AACvE,iDAAiD,0BAAmB;AACpE,wDAAwD,0BAAmB;AAC3E,qDAAqD,0BAAmB;AACxE,0DAA0D,0BAAmB;AAC7E,yDAAyD,0BAAmB;AAC5E,sDAAsD,0BAAmB;AACzE,kDAAkD,0BAAmB;AACrE,gDAAgD,0BAAmB;AACnE,wCAAwC,0BAAmB;AAC3D,kDAAkD,0BAAmB;AACrE,qDAAqD,0BAAmB;AACxE,8DAA8D,0BAAmB;AACjF,4CAA4C,0BAAmB;AAC/D,oDAAoD,0BAAmB;AACvE,kDAAkD,0BAAmB;AACrE,yDAAyD,0BAAmB;AAC5E,kDAAkD,0BAAmB;AACrE,mDAAmD,0BAAmB;AACtE,oDAAoD,0BAAmB;AACvE,6CAA6C,0BAAmB;AAChE,4CAA4C,0BAAmB;AAC/D,0CAA0C,0BAAmB;AAC7D,0CAA0C,0BAAmB;AAC7D,kDAAkD,0BAAmB;AACrE,wCAAwC,0BAAmB;AAC3D,8CAA8C,0BAAmB;AACjE,yDAAyD,0BAAmB;AAC5E,8CAA8C,0BAAmB;AACjE,4CAA4C,0BAAmB;AAC/D,0DAA0D,0BAAmB;AAC7E,kEAAkE,0BAAmB;AACrF,gDAAgD,0BAAmB;AACnE,yDAAyD,0BAAmB;AAC5E,kDAAkD,0BAAmB;AACrE,wCAAwC,0BAAmB;AAC3D,2CAA2C,0BAAmB;AAC9D,sCAAsC,0BAAmB;AACzD,4CAA4C,0BAAmB;AAC/D,2CAA2C,0BAAmB;AAC9D,iDAAiD,0BAAmB;AACpE,8CAA8C,0BAAmB;AACjE,8CAA8C,0BAAmB;AACjE,gEAAgE,0BAAmB;AACnF,6CAA6C,0BAAmB;AAChE,yCAAyC,0BAAmB;AAC5D,yCAAyC,0BAAmB;AAC5D,kDAAkD,0BAAmB;AACrE,+CAA+C,0BAAmB;AAClE,yDAAyD,0BAAmB;AAC5E,8CAA8C,0BAAmB;AACjE,yCAAyC,0BAAmB;AAC5D,+CAA+C,0BAAmB;AAClE,oDAAoD,0BAAmB;AACvE,qDAAqD,0BAAmB;AACxE,yCAAyC,0BAAmB;AAC5D,+CAA+C,0BAAmB;AAClE,gDAAgD,0BAAmB;AACnE,+CAA+C,0BAAmB;AAClE,6CAA6C,0BAAmB;AAChE,yCAAyC,0BAAmB;AAC5D,6CAA6C,0BAAmB;AAChE,mEAAmE,0BAAmB;AACtF,gEAAgE,0BAAmB;AACnF,mDAAmD,0BAAmB;AACtE,oDAAoD,0BAAmB;AACvE,uCAAuC,0BAAmB;AAC1D,4CAA4C,0BAAmB;AAC/D,wCAAwC,0BAAmB;AAC3D,wCAAwC,0BAAmB;AAC3D,yCAAyC,0BAAmB;AAC5D,uCAAuC,0BAAmB;AAC1D,4CAA4C,0BAAmB;AAC/D,6CAA6C,0BAAmB;AAChE,4CAA4C,0BAAmB;AAC/D,2CAA2C,0BAAmB;AAC9D,6CAA6C,0BAAmB;AAChE,6CAA6C,0BAAmB;AAChE,yCAAyC,0BAAmB;AAC5D,4CAA4C,0BAAmB;AAC/D,iDAAiD,0BAAmB;AACpE,gDAAgD,0BAAmB;AACnE,0CAA0C,0BAAmB;AAC7D,mDAAmD,0BAAmB;AACtE,qDAAqD,0BAAmB;AACxE,sDAAsD,0BAAmB;AACzE,yDAAyD,0BAAmB;AAC5E,2CAA2C,0BAAmB;AAC9D,mDAAmD,0BAAmB;AACtE,sCAAsC,0BAAmB;AACzD,4CAA4C,0BAAmB;AAC/D,oDAAoD,0BAAmB;AACvE,qDAAqD,0BAAmB;AACxE,sDAAsD,0BAAmB;AACzE,0CAA0C,0BAAmB;AAC7D,oDAAoD,0BAAmB;AACvE,gDAAgD,0BAAmB;AACnE,iDAAiD,0BAAmB;AACpE,oDAAoD,0BAAmB;AACvE,+CAA+C,0BAAmB;AAClE,gDAAgD,0BAAmB;AACnE,8CAA8C,0BAAmB;AACjE,kDAAkD,0BAAmB;AACrE,iDAAiD,0BAAmB;AACpE,8CAA8C,0BAAmB;AACjE,gEAAgE,0BAAmB;AACnF,gDAAgD,0BAAmB;AACnE,kDAAkD,0BAAmB;AACrE,4CAA4C,0BAAmB;AAC/D,8CAA8C,0BAAmB;AACjE,2DAA2D,0BAAmB;AAC9E,wDAAwD,0BAAmB;AAC3E,+CAA+C,0BAAmB;AAClE,gDAAgD,0BAAmB;AACnE,2CAA2C,0BAAmB;AAC9D,2CAA2C,0BAAmB;AAC9D,uCAAuC,0BAAmB;AAC1D,4CAA4C,0BAAmB;AAC/D,wCAAwC,0BAAmB;AAC3D,4DAA4D,0BAAmB;AAC/E,uCAAuC,0BAAmB;AAC1D,8CAA8C,0BAAmB;AACjE,yCAAyC,0BAAmB;AAC5D,+CAA+C,0BAAmB;AAClE,gEAAgE,0BAAmB;AACnF,4DAA4D,0BAAmB;AAC/E,2CAA2C,0BAAmB;AAC9D,yCAAyC,0BAAmB;AAC5D,2CAA2C,0BAAmB;AAC9D,yCAAyC,0BAAmB;AAC5D,kDAAkD,0BAAmB;AACrE,6CAA6C,0BAAmB;AAChE,uCAAuC,0BAAmB;AAC1D,kDAAkD,0BAAmB;AACrE,+CAA+C,0BAAmB;AAClE,yCAAyC,0BAAmB;AAC5D,oDAAoD,0BAAmB;AACvE,yCAAyC,0BAAmB;AAC5D,oDAAoD,0BAAmB;AACvE,sDAAsD,0BAAmB;AACzE,mDAAmD,0BAAmB;AACtE,4DAA4D,0BAAmB;AAC/E,4CAA4C,0BAAmB;AAC/D,mDAAmD,0BAAmB;AACtE,uCAAuC,0BAAmB;AAC1D,6CAA6C,0BAAmB;AAChE,kDAAkD,0BAAmB;AACrE,uCAAuC,0BAAmB;AAC1D,oDAAoD,0BAAmB;AACvE,kDAAkD,0BAAmB;AACrE,2CAA2C,0BAAmB;AAC9D,kDAAkD,0BAAmB;AACrE,mDAAmD,0BAAmB;AACtE,oDAAoD,0BAAmB;AACvE,+CAA+C,0BAAmB;AAClE,+CAA+C,0BAAmB;AAClE,qDAAqD,0BAAmB;AACxE,gDAAgD,0BAAmB;AACnE,mDAAmD,0BAAmB;AACtE,+CAA+C,0BAAmB;AAClE,uDAAuD,0BAAmB;AAC1E,+CAA+C,0BAAmB;AAClE,gDAAgD,0BAAmB;AACnE,8CAA8C,0BAAmB;AACjE,0CAA0C,0BAAmB;AAC7D,kDAAkD,0BAAmB;AACrE,uCAAuC,0BAAmB;AAC1D,qDAAqD,0BAAmB;AACxE,qDAAqD,0BAAmB;AACxE,gDAAgD,0BAAmB;AACnE,iDAAiD,0BAAmB;AACpE,gDAAgD,0BAAmB;AACnE,yDAAyD,0BAAmB;AAC5E,kDAAkD,0BAAmB;AACrE,oDAAoD,0BAAmB;AACvE,oDAAoD,0BAAmB;AACvE,+CAA+C,0BAAmB;AAClE,gDAAgD,0BAAmB;AACnE,+CAA+C,0BAAmB;AAClE,+CAA+C,0BAAmB;AAClE,wDAAwD,0BAAmB;AAC3E,iDAAiD,0BAAmB;AACpE,6CAA6C,0BAAmB;AAChE,kDAAkD,0BAAmB;AACrE,2CAA2C,0BAAmB;AAC9D,wCAAwC,0BAAmB;AAC3D,+CAA+C,0BAAmB;AAClE,4DAA4D,0BAAmB;AAC/E,yCAAyC,0BAAmB;AAC5D,yCAAyC,0BAAmB;AAC5D,sCAAsC,0BAAmB;AACzD,kDAAkD,0BAAmB;AACrE,4CAA4C,0BAAmB;AAC/D,8CAA8C,0BAAmB;AACjE,mDAAmD,0BAAmB;AACtE,yCAAyC,0BAAmB;AAC5D,gDAAgD,0BAAmB;AACnE,6CAA6C,0BAAmB;AAChE,2CAA2C,0BAAmB;AAC9D,iDAAiD,0BAAmB;AACpE,2CAA2C,0BAAmB;AAC9D,sDAAsD,0BAAmB;AACzE,2CAA2C,0BAAmB;AAC9D,sDAAsD,0BAAmB;AACzE,+CAA+C,0BAAmB;AAClE,0CAA0C,0BAAmB;AAC7D,qDAAqD,0BAAmB;AACxE,0CAA0C,0BAAmB;AAC7D,qDAAqD,0BAAmB;AACxE,wCAAwC,0BAAmB;AAC3D,8CAA8C,0BAAmB;AACjE,yCAAyC,0BAAmB;AAC5D,iDAAiD,0BAAmB;AACpE,gDAAgD,0BAAmB;AACnE,+CAA+C,0BAAmB;AAClE,+CAA+C,0BAAmB;AAClE,uDAAuD,0BAAmB;AAC1E,4CAA4C,0BAAmB;AAC/D,iDAAiD,0BAAmB;AACpE,iDAAiD,0BAAmB;AACpE,yCAAyC,0BAAmB;AAC5D,wCAAwC,0BAAmB;AAC3D,uCAAuC,0BAAmB;AAC1D,wCAAwC,0BAAmB;AAC3D,iDAAiD,0BAAmB;AACpE,wCAAwC,0BAAmB;AAC3D,8CAA8C,0BAAmB;AACjE,iDAAiD,0BAAmB;AACpE,mEAAmE,0BAAmB;AACtF,2DAA2D,0BAAmB;AAC9E,yCAAyC,0BAAmB;AAC5D,6CAA6C,0BAAmB;AAChE,8CAA8C,0BAAmB;AACjE,gDAAgD,0BAAmB;AACnE,+CAA+C,0BAAmB;AAClE,oDAAoD,0BAAmB;AACvE,yCAAyC,0BAAmB;AAC5D,yCAAyC,0BAAmB;AAC5D,gDAAgD,0BAAmB;AACnE,iDAAiD,0BAAmB;AACpE,6CAA6C,0BAAmB;AAChE,2CAA2C,0BAAmB;AAC9D,4CAA4C,0BAAmB;AAC/D,uCAAuC,0BAAmB;AAC1D,4CAA4C,0BAAmB;AAC/D,gDAAgD,0BAAmB;AACnE,uCAAuC,0BAAmB;AAC1D,0CAA0C,0BAAmB;AAC7D,gDAAgD,0BAAmB;AACnE,iDAAiD,0BAAmB;AACpE,8CAA8C,0BAAmB;AACjE,wCAAwC,0BAAmB;AAC3D,0CAA0C,0BAAmB;AAC7D,4CAA4C,0BAAmB;AAC/D,qDAAqD,0BAAmB;AACxE,6CAA6C,0BAAmB;AAChE,2CAA2C,0BAAmB;AAC9D,0CAA0C,0BAAmB;AAC7D,gDAAgD,0BAAmB;AACnE,wCAAwC,0BAAmB;AAC3D,uCAAuC,0BAAmB;AAC1D,yCAAyC,0BAAmB;AAC5D,6CAA6C,0BAAmB;AAChE,+CAA+C,0BAAmB;AAClE,+CAA+C,0BAAmB;AAClE,gDAAgD,0BAAmB;AACnE,+CAA+C,0BAAmB;AAClE,2CAA2C,0BAAmB;AAC9D,mDAAmD,0BAAmB;AACtE,iDAAiD,0BAAmB;AACpE,6CAA6C,0BAAmB;AAChE,wCAAwC,0BAAmB;AAC3D,qDAAqD,0BAAmB;AACxE,yCAAyC,0BAAmB;AAC5D,oDAAoD,0BAAmB;AACvE,wCAAwC,0BAAmB;AAC3D,4CAA4C,0BAAmB;AAC/D,2CAA2C,0BAAmB;AAC9D,uCAAuC,0BAAmB;AAC1D,0DAA0D,0BAAmB;AAC7E,kDAAkD,0BAAmB;AACrE,2CAA2C,0BAAmB;AAC9D,kDAAkD,0BAAmB;AACrE,kDAAkD,0BAAmB;AACrE,iDAAiD,0BAAmB;AACpE,8CAA8C,0BAAmB;AACjE,8CAA8C,0BAAmB;AACjE,6CAA6C,0BAAmB;AAChE,0CAA0C,0BAAmB;AAC7D,iDAAiD,0BAAmB;AACpE,iDAAiD,0BAAmB;AACpE,gDAAgD,0BAAmB;AACnE,6CAA6C,0BAAmB;AAChE,8CAA8C,0BAAmB;AACjE,oDAAoD,0BAAmB;AACvE,0CAA0C,0BAAmB;AAC7D,mDAAmD,0BAAmB;AACtE,kDAAkD,0BAAmB;AACrE,sDAAsD,0BAAmB;AACzE,kDAAkD,0BAAmB;AACrE,kDAAkD,0BAAmB;AACrE,qDAAqD,0BAAmB;AACxE,oDAAoD,0BAAmB;AACvE,oDAAoD,0BAAmB;AACvE,mDAAmD,0BAAmB;AACtE,mDAAmD,0BAAmB;AACtE,qDAAqD,0BAAmB;AACxE,kDAAkD,0BAAmB;AACrE,sDAAsD,0BAAmB;AACzE,uCAAuC,0BAAmB;AAC1D,4CAA4C,0BAAmB;AAC/D,6CAA6C,0BAAmB;AAChE,8CAA8C,0BAAmB;AACjE,+CAA+C,0BAAmB;AAClE,2CAA2C,0BAAmB;AAC9D,sDAAsD,0BAAmB;AACzE,qDAAqD,0BAAmB;AACxE,mDAAmD,0BAAmB;AACtE,gDAAgD,0BAAmB;AACnE,mDAAmD,0BAAmB;AACtE,wCAAwC,0BAAmB;AAC3D,wCAAwC,0BAAmB;AAC3D,8CAA8C,0BAAmB;AACjE,uDAAuD,0BAAmB;AAC1E,uCAAuC,0BAAmB;AAC1D,4CAA4C,0BAAmB;AAC/D,4CAA4C,0BAAmB;AAC/D,sCAAsC,0BAAmB;AACzD,wCAAwC,0BAAmB;AAC3D,SAAi5jB;AACj5jB;;AAEA,iD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACv4xCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,IAAI;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oBAAoB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gCAAgC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA,0DAA0D;AAC1D,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,MAAM;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,eAAe,aAAa,eAAe;AACjF;AACA;AACA;AACA,yDAAyD,2DAA2D;AACpH;AACA;AACA,wDAAwD,kCAAkC;AAC1F;AACA;AACA;AACA;AACA;AACA,+DAA+D,+BAA+B;AAC9F;AACA;AACA,sDAAsD,+BAA+B,cAAc,eAAe;AAClH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8DAA8D,0BAA0B;AACxF;AACA,qCAAqC,SAAS,oDAAoD,0BAA0B;AAC5H;AACA;AACA;AACA,iEAAiE,4BAA4B;AAC7F;AACA;AACA,+DAA+D,0BAA0B;AACzF;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,iBAAiB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,sEAAsE,EAAE,eAAe;AACvI;AACA,iDAAiD,iEAAiE,EAAE,eAAe;AACnI;AACA,4CAA4C;AAC5C;AACA;AACA;AACA,0CAA0C,EAAE,cAAc;AAC1D;AACA,0CAA0C;AAC1C;AACA;AACA;AACA,0CAA0C,EAAE,gCAAgC;AAC5E;AACA;AACA;AACA;AACA;AACA,gDAAgD,qEAAqE,EAAE,eAAe;AACtI;AACA,iDAAiD,iEAAiE,EAAE,eAAe;AACnI;AACA,4CAA4C;AAC5C;AACA;AACA;AACA,uCAAuC,EAAE,cAAc;AACvD;AACA,4CAA4C;AAC5C;AACA;AACA;AACA,uCAAuC,EAAE,cAAc;AACvD;AACA,0CAA0C;AAC1C;AACA;AACA;AACA,0CAA0C,EAAE,gCAAgC;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,iBAAiB;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY,mCAAmC;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,kCAAkC;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,aAAa;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,CAAC;AACD,4BAA4B,wBAAwB;AACpD,yBAAyB,wBAAwB;AACjD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,sEAAsE,UAAU;AAChF;AACA,CAAC,8BAA8B;;AAE/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,4DAA4D;AACxE;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,gBAAgB,UAAU;AAC1B;AACA,qBAAqB;AACrB;AACA;AACA,qBAAqB;AACrB;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,mCAAmC;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,6BAA6B;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,6BAA6B;AAC/D;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,mCAAmC;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,sBAAsB,gCAAgC;AACtD,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,8BAA8B;AACpD,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,GAAG;AAC/B;AACA,uCAAuC,GAAG;AAC1C;AACA,iBAAiB,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU,GAAG;AACzE,gCAAgC,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,GAAG;AACvG,iCAAiC,GAAG;AACpC;AACA;AACA;AACA;AACA,4DAA4D,GAAG,mFAAmF,GAAG;AACrJ;AACA,sCAAsC,sBAAsB,sCAAsC,uBAAuB,OAAO,GAAG,cAAc;AACjJ;AACA;AACA,uBAAuB,yBAAyB,4DAA4D,EAAE,SAAS,IAAI,MAAM,EAAE,iCAAiC,EAAE,SAAS,IAAI,yBAAyB,IAAI,GAAG,EAAE,aAAa,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,mCAAmC,EAAE,SAAS,IAAI,MAAM,EAAE,iCAAiC,EAAE,SAAS,IAAI,0DAA0D,GAAG;AACrnB;AACA,iDAAiD,IAAI,kCAAkC,KAAK,6CAA6C,KAAK;AAC9I;AACA,gCAAgC,EAAE,+BAA+B,EAAE,2NAA2N,EAAE;AAChS,iGAAiG,GAAG;AACpG;AACA,8BAA8B,EAAE;AAChC;AACA,2BAA2B,sBAAsB,KAAK,gBAAgB;AACtE;AACA;AACA,+EAA+E,EAAE;AACjF,mFAAmF,EAAE;AACrF;AACA,gBAAgB,IAAI,GAAG,EAAE,aAAa,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,mCAAmC,EAAE,SAAS,IAAI,MAAM,EAAE,iCAAiC,EAAE,SAAS,IAAI;AAC5X,kCAAkC,IAAI,GAAG,IAAI,YAAY,IAAI,cAAc,IAAI,GAAG,IAAI,eAAe,IAAI,GAAG,IAAI,aAAa,IAAI,cAAc,IAAI,GAAG,IAAI,cAAc,IAAI,EAAE,IAAI,cAAc,IAAI,GAAG,IAAI,cAAc,IAAI,EAAE,IAAI,cAAc,IAAI,GAAG,IAAI,cAAc,IAAI,EAAE,IAAI,cAAc,IAAI,GAAG,IAAI,cAAc,IAAI,EAAE,IAAI,aAAa,IAAI,gBAAgB,IAAI,EAAE,IAAI,kBAAkB,IAAI,EAAE,IAAI,uBAAuB,IAAI,EAAE,IAAI,aAAa,GAAG,YAAY,IAAI,EAAE,IAAI,GAAG,IAAI,oBAAoB,IAAI,OAAO,IAAI,UAAU,IAAI,mBAAmB,IAAI,OAAO,IAAI,oBAAoB,IAAI,GAAG,IAAI,qBAAqB,IAAI,OAAO,IAAI,UAAU,IAAI,mBAAmB,IAAI,OAAO,IAAI;AAChqB,sCAAsC,IAAI,GAAG,IAAI,YAAY,IAAI,cAAc,IAAI,GAAG,IAAI,eAAe,IAAI,GAAG,IAAI,aAAa,IAAI,cAAc,IAAI,GAAG,IAAI,cAAc,IAAI,EAAE,IAAI,cAAc,IAAI,GAAG,IAAI,cAAc,IAAI,EAAE,IAAI,cAAc,IAAI,GAAG,IAAI,cAAc,IAAI,EAAE,IAAI,cAAc,IAAI,GAAG,IAAI,cAAc,IAAI,EAAE,IAAI,aAAa,IAAI,gBAAgB,IAAI,EAAE,IAAI,kBAAkB,IAAI,EAAE,IAAI,uBAAuB,IAAI,EAAE,IAAI,aAAa,GAAG,YAAY,IAAI,EAAE,IAAI,GAAG,IAAI,oBAAoB,IAAI,OAAO,IAAI,UAAU,IAAI,mBAAmB,IAAI,OAAO,IAAI,oBAAoB,IAAI,GAAG,IAAI,qBAAqB,IAAI,OAAO,IAAI,UAAU,IAAI,mBAAmB,IAAI,OAAO,IAAI;AACpqB;AACA,qCAAqC,EAAE,kBAAkB,EAAE,mBAAmB,EAAE;AAChF;AACA,wCAAwC,EAAE,kBAAkB,EAAE,sBAAsB,EAAE;AACtF;AACA,gCAAgC,EAAE,KAAK,EAAE,KAAK,EAAE;AAChD;AACA,gCAAgC,EAAE;AAClC;AACA,mHAAmH,EAAE;AACrH,iCAAiC,gBAAgB;AACjD;AACA,wBAAwB,EAAE,KAAK,EAAE,KAAK,EAAE;AACxC;AACA;AACA,mBAAmB,MAAM,OAAO,EAAE,gBAAgB;AAClD;AACA;AACA,mBAAmB,MAAM;AACzB;AACA;AACA;AACA;AACA,0BAA0B,sBAAsB;AAChD;AACA;AACA;AACA,mBAAmB,gBAAgB,GAAG,sBAAsB;AAC5D;AACA;AACA;AACA,4BAA4B,EAAE,MAAM,EAAE;AACtC,eAAe,MAAM,GAAG,eAAe;AACvC,0BAA0B,MAAM;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,iDAAiD;AACvF;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,yBAAyB;AAC/D;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,uBAAuB;AAC7D;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gCAAgC,+CAA+C;AAC/E;AACA;AACA,gCAAgC,6CAA6C;AAC7E;AACA;AACA,gCAAgC,+CAA+C;AAC/E;AACA;AACA,gCAAgC,8CAA8C;AAC9E;AACA;AACA,gCAAgC,gDAAgD;AAChF;AACA;AACA,gCAAgC,8CAA8C;AAC9E;AACA;AACA,gCAAgC,+CAA+C;AAC/E;AACA;AACA,gCAAgC,8CAA8C;AAC9E;AACA;AACA,gCAAgC,gDAAgD;AAChF;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gCAAgC,6CAA6C;AAC7E;AACA;AACA,gCAAgC,4CAA4C;AAC5E;AACA;AACA,gCAAgC,8CAA8C;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gCAAgC,uBAAuB;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gCAAgC,kDAAkD;AAClF;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,cAAc;AAC1D,SAAS;AACT;AACA;AACA;AACA;AACA,4CAA4C,qBAAqB;AACjE,SAAS;AACT;AACA;AACA;AACA;AACA,4CAA4C,qBAAqB;AACjE,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,wDAAwD;AACjF,SAAS;AACT;AACA;AACA;AACA;AACA,yBAAyB,wDAAwD;AACjF,SAAS;AACT;AACA;AACA;AACA;AACA,2BAA2B,kDAAkD;AAC7E,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,aAAa;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,gBAAgB,cAAc;AAC9B,gBAAgB,yBAAyB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,6BAA6B;AACpD;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,6BAA6B;AAC5D,iCAAiC,uCAAuC;AACxE,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,6BAA6B;AACxD;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,oBAAoB;AACpB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,8BAA8B,eAAe;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE,cAAc;AACjF;AACA;AACA;AACA,8DAA8D,uBAAuB,sBAAsB,cAAc;AACzH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,4BAA4B,kBAAkB;AAC9C;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,iCAAiC;AACjC;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,sDAAsD;AAC7E,SAAS;AACT;AACA;AACA;AACA;AACA,uBAAuB,sDAAsD;AAC7E,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA,mCAAmC,6CAA6C;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,mCAAmC,6CAA6C;AAChF;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,mCAAmC,6CAA6C;AAChF;AACA;AACA;AACA,uGAAuG,qCAAqC;AAC5I,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,kBAAkB,2CAA2C;AAC7D;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA,yBAAyB;AACzB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,cAAc;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA,qDAAqD,aAAa;AAClE,+BAA+B,sCAAsC;AACrE;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,sDAAsD;AACvD;AACA;AACA;AACA,sCAAsC,SAAS;AAC/C,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,sBAAsB;AAC/D,yCAAyC,sBAAsB;AAC/D;AACA;AACA;AACA,KAAK;AACL,yCAAyC,sBAAsB;AAC/D,qCAAqC,sBAAsB;AAC3D;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,cAAc;AAChC,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,+BAA+B;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAE2rD;;;;;;;;;;;;;;;;;;AC7xI5nD;AACjB;AAExC,MAAM,SAAS,GAAG;IACrB,kBAAkB,EAAE,IAAI,kDAAW,CAAC,qFAAqF,CAAC;IAC1H,YAAY,EAAE,IAAI,yDAAY,CAAC,wCAAwC,EAAE;QACrE,wBAAwB,EAAE,IAAI;QAC9B,qBAAqB,EAAE,IAAI;KAC9B,CAAC;IACF,YAAY,EAAE,IAAI,yDAAY,CAAC,0BAA0B,EAAE;QACvD,qBAAqB,EAAE,IAAI;KAC9B,CAAC;IACF,gBAAgB,EAAE,IAAI,yDAAY,CAAC,oBAAoB,EAAE;QACrD,qBAAqB,EAAE,IAAI;KAC9B,CAAC;CACI,CAAC;AAGJ,MAAM,MAAM,GAAG,IAAI,6CAAM,EAAE,CAAC;AACnC,KAAK,IAAI,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;IAC5C,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;AACjC,CAAC;;;;;;;;;;;;;;;;ACrBsD;AAKhD,MAAM,WAAW;IAOtB,YACE,KAAY,EACI,SAA4B,EACpC,QAAsB,EACd,KAAa;QAFb,cAAS,GAAT,SAAS,CAAmB;QACpC,aAAQ,GAAR,QAAQ,CAAc;QACd,UAAK,GAAL,KAAK,CAAQ;QARxB,aAAQ,GAAa,EAAE,CAAC;QACxB,iBAAY,GAAG,IAAI,GAAG,EAA8B,CAAC;QACrD,iBAAY,GAAG,IAAI,GAAG,EAA8B,CAAC;QAO1D,IAAI,CAAC,QAAQ,GAAG,8CAAG,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACpE,IAAI,CAAC,MAAM,GAAG,8CAAG,CAAC,SAAS,CAAC,gBAAgB,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IAED,YAAY;;QACV,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,IAAI,SAAS,CAAC,eAAe,EAAE,CAAC;YAC9B,KAAK,IAAI,MAAM,IAAI,SAAS,CAAC,eAAe,EAAE,CAAC;gBAC7C,MAAM,cAAc,GAAG,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;oBACrE,OAAO,CAAC,CAAC,UAAU,KAAK,MAAM,CAAC,YAAY;gBAC7C,CAAC,CAAC,CAAC;gBACH,IAAI,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;oBAChD,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;oBAC5D,IAAI,OAAO,EAAE,CAAC;wBACZ,MAAM,SAAS,GAAG,OAAO,CAAC;4BACxB,IAAI,EAAE,MAAM,CAAC,YAAY;4BACzB,QAAQ,EAAE,8CAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;4BAC7E,MAAM;4BACN,UAAU,EAAE,cAAc;4BAC1B,KAAK,EAAE,IAAI;yBACZ,CAAC,CAAC;wBACH,IAAI,SAAS,EAAE,CAAC;4BACd,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;4BAC9B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;4BACzC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;wBAC3C,CAAC;oBACH,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;wBAClB,MAAM,KAAK,GAAG,IAAI,4CAAK,CAAC;4BACtB,IAAI,EAAE,MAAM,CAAC,YAAY;4BACzB,GAAG,EAAE,8CAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;4BACxE,KAAK,EAAE,MAAM,CAAC,KAAK;4BACnB,MAAM,EAAE,MAAM,CAAC,MAAM;4BACrB,MAAM,EAAE,8CAAG,CAAC,oBAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,MAAM,mCAAI,CAAC,EAAE,oBAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,MAAM,mCAAI,CAAC,CAAC;4BACrE,CAAC,EAAE,KAAK;yBACT,CAAC,CAAC;wBACH,MAAM,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;wBAC3D,IAAI,EAAE,EAAE,CAAC;4BACP,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;4BAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;4BAC/D,MAAM,MAAM,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;4BAC5D,IAAI,MAAM,EAAE,CAAC;gCACX,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;4BAC7B,CAAC;wBACH,CAAC;wBAED,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;wBAC1B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;wBACrC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;oBACvC,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,uDAAuD;QACvD,sEAAsE;QACtE,+BAA+B;QAC/B,EAAE;QACF,mFAAmF;QACnF,kDAAkD;QAClD,QAAQ;QACR,EAAE;QACF,gCAAgC;QAChC,iCAAiC;QACjC,qFAAqF;QACrF,cAAc;QACd,kCAAkC;QAClC,mBAAmB;QACnB,QAAQ;QACR,EAAE;QACF,qBAAqB;QACrB,8FAA8F;QAC9F,yDAAyD;QACzD,yBAAyB;QACzB,0DAA0D;QAC1D,0BAA0B;QAC1B,0CAA0C;QAC1C,4CAA4C;QAC5C,iDAAiD;QACjD,UAAU;QACV,QAAQ;QACR,EAAE;QACF,qCAAqC;QACrC,gDAAgD;QAChD,gDAAgD;QAChD,MAAM;QACN,IAAI;IACN,CAAC;IAGD,uBAAuB,CAAC,UAAkB;QACxC,MAAM,YAAY,GAAG,IAAI,CAAC,2BAA2B,CAAC,UAAU,CAAC,CAAC;QAClE,IAAI,OAAO,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAChC,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAChD,IAAI,WAAW,EAAE,CAAC;gBAChB,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,kBAAkB,CAAC,eAAuB,EAAE,KAAW;QACrD,MAAM,YAAY,GAAG,IAAI,CAAC,sBAAsB,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;QACzE,IAAI,OAAO,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAChC,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAChD,IAAI,WAAW,EAAE,CAAC;gBAChB,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;OAIG;IACH,2BAA2B,CAAC,UAAkB;QAC5C,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,iBAAiB,EAAE,KAAK,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;IACrH,CAAC;IAED;;;;OAIG;IACH,sBAAsB,CAAC,eAAuB,EAAE,KAAW;QACzD,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;YAC/C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,IAAI,eAAe,GAAG,KAAK,CAAC;gBAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;oBAC9B,eAAe,GAAG,KAAK,CAAC,iBAAiB,EAAE,CAAC;gBAC9C,CAAC;gBAED,MAAM,KAAK,GAAG,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,iBAAiB,EAAE,KAAK,eAAe,CAAC,iBAAiB,EAAE,CAAC,CAAC;gBACrH,IAAI,KAAK,EAAE,CAAC;oBACV,OAAO,KAAK,CAAC,OAAO,KAAK,eAAe,CAAC;gBAC3C,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,iBAAiB,EAAE,KAAK,eAAe,CAAC,iBAAiB,EAAE,CAAC,CAAC;YAClH,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;CACF;;;;;;;;;;;;;;;ACnKM,MAAM,WAAW,GAAe,KAAK,EAAE,IAAY,EAAE,WAA2B,EAAE,EAAE;IACxF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,QAAO,WAAW,CAAC,WAAW,EAAE,EAAE,CAAC;QAChC,KAAK,KAAK,CAAC,CAAC,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACzC,KAAK,MAAM,CAAC,CAAC,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC1C,OAAO,CAAC,CAAC,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACzC,CAAC;AACJ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACV+B;AACD;AACD;AACE;AACC;AACT;AACO;AACH;AACC;AACH;AACF;;;;;;;;;;;;;;;;ACX4C;AAM7D,MAAM,YAAY;IAQrB,YAAY,KAAY,EAAE,SAA4B,EAAE,QAAsB,EAAkB,KAAa;;QAAb,UAAK,GAAL,KAAK,CAAQ;QACzG,IAAI,CAAC,QAAQ,GAAG,8CAAG,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACpE,IAAI,CAAC,MAAM,GAAG,8CAAG,CAAC,SAAS,CAAC,gBAAgB,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC1E,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,IAAI,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;YAEjE,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC;YAC9B,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC;YACjC,IAAI,CAAC,OAAO,GAAG,IAAI,8CAAO,CAAC;gBACvB,IAAI,EAAE,SAAS,CAAC,YAAY;gBAC5B,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;gBACnC,SAAS,EAAE,SAAS,CAAC,UAAU;gBAC/B,UAAU,EAAE,SAAS,CAAC,UAAU;gBAChC,IAAI;gBACJ,OAAO;aACV,CAAC,CAAC;YACH,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC;YACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,wDAAiB,CAAC,CAAC;YACrD,QAAQ,CAAC,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC;YAEvC,4BAA4B;YAC5B,MAAM,aAAa,GAAG,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;gBAChE,OAAO,SAAS,CAAC,YAAY,KAAK,CAAC,CAAC,UAAU,CAAC;YACnD,CAAC,CAAC,CAAC;YAEH,IAAI,aAAa,EAAE,CAAC;gBAChB,MAAM,UAAU,GAAG,aAAa,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;;oBACtD,OAAO,UAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,UAAU,0CAAE,iBAAiB,EAAE,MAAK,OAAO,CAAC;gBAC5D,CAAC,CAAC,CAAC;gBAEH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACnD,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC;oBAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC;oBACvC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;oBAClD,IAAI,UAAU,IAAI,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,KAAK,EAAE,CAAC;wBAC7D,IAAK,CAAC,KAAK,GAAG,IAAI,CAAC;oBACvB,CAAC;oBAED,8EAA8E;oBAC9E,IAAI,CAAC,UAAU,IAAI,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;wBAC/C,IAAK,CAAC,KAAK,GAAG,IAAI,CAAC;oBACvB,CAAC;gBACL,CAAC;gBAED,IAAI,SAAS,CAAC,eAAe,EAAE,CAAC;oBAC5B,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;oBAChE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;wBACvD,MAAM,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;wBACzC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;wBAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;wBAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;wBACpD,IAAI,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;4BACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,UAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,mCAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,GAAG,CAAC,UAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,mCAAI,CAAC,CAAC,CAAC,CAAC,CAAC;4BACzK,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,UAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,mCAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,GAAG,CAAC,UAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,mCAAI,CAAC,CAAC,CAAC,CAAC,CAAC;4BACzK,uBAAuB;4BACvB,uBAAuB;4BACvB,kFAAkF;4BAClF,MAAM,cAAc,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;4BACzC,MAAM,YAAY,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;4BACvC,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;4BACpE,IAAI,cAAc,IAAI,YAAY,EAAE,CAAC;gCACjC,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;gCACxB,MAAM,CAAC,cAAc,GAAG,cAAc,CAAC;gCACvC,MAAM,CAAC,YAAY,GAAG,YAAY,CAAC;4BACvC,CAAC;4BACD,IAAI,MAAM,EAAE,CAAC;gCACT,MAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;4BAC/B,CAAC;iCAAM,CAAC;gCACJ,OAAO,CAAC,KAAK,CAAC,8CAA8C,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;4BACtF,CAAC;wBACL,CAAC;oBACL,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;CACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;AC1FwC;AACiB;AACF;AACgC;AAC7C;AACE;AACkE;AAC9D;AACb;AACJ;AACa;AACE;AAmIxC,MAAM,YAAY;IAyBrB,YAA4B,IAAY,EAAE,OAA6B;QAA3C,SAAI,GAAJ,IAAI,CAAQ;QAnBjC,aAAQ,GAAG,IAAI,GAAG,EAAmB,CAAC;QACtC,WAAM,GAAG,IAAI,GAAG,EAAiB,CAAC;QAClC,iBAAY,GAAG,IAAI,GAAG,EAAiB,CAAC;QACxC,cAAS,GAAG,IAAI,GAAG,EAAuD,CAAC;QAC3E,eAAU,GAAe,qDAAW,CAAC;QAGpC,iBAAY,GAAG,IAAI,sDAAW,CAAC,kDAAW,CAAC,CAAC;QAC5C,iBAAY,GAAG,IAAI,sDAAW,CAAC,0DAAa,CAAC,CAAC;QAGtC,gBAAW,GAAW,CAAC,CAAC;QACxB,gBAAW,GAAW,CAAC,CAAC;QACxB,uBAAkB,GAAY,IAAI,CAAC;QACnC,0BAAqB,GAAY,KAAK,CAAC;QACvC,6BAAwB,GAAY,KAAK,CAAC;QAC1C,aAAQ,GAAY,KAAK,CAAC;QAC1B,WAAM,GAAY,IAAI,CAAC;QAGnC,MAAM,EACF,kBAAkB,EAClB,wBAAwB,EACxB,yBAAyB,EACzB,OAAO,EACP,qBAAqB,EACrB,UAAU,EACV,MAAM,EACN,QAAQ,EACR,WAAW,EACd,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,IAAI,CAAC,MAAM,CAAC;QACpC,IAAI,CAAC,QAAQ,GAAG,QAAQ,aAAR,QAAQ,cAAR,QAAQ,GAAI,IAAI,CAAC,QAAQ,CAAC;QAC1C,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,aAAlB,kBAAkB,cAAlB,kBAAkB,GAAI,IAAI,CAAC,kBAAkB,CAAC;QACxE,IAAI,CAAC,wBAAwB,GAAG,wBAAwB,aAAxB,wBAAwB,cAAxB,wBAAwB,GAAI,IAAI,CAAC,wBAAwB,CAAC;QAC1F,IAAI,CAAC,qBAAqB,GAAG,qBAAqB,aAArB,qBAAqB,cAArB,qBAAqB,GAAI,IAAI,CAAC,qBAAqB,CAAC;QACjF,IAAI,CAAC,WAAW,GAAG,WAAW,aAAX,WAAW,cAAX,WAAW,GAAI,IAAI,CAAC,WAAW,CAAC;QACnD,IAAI,CAAC,UAAU,GAAG,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,IAAI,CAAC,UAAU,CAAC;QAChD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,KAAK,MAAM,GAAG,IAAI,yBAAyB,EAAE,CAAC;YAC1C,IAAI,CAAC,+BAA+B,CAAC,GAAG,EAAE,yBAAyB,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9E,CAAC;IAEL,CAAC;IACD,KAAK,CAAC,IAAI;;QACN,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACtD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,IAAI,CAAC;gBACD,IAAI,CAAC,eAAe,GAAG,uDAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3D,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,OAAO,CAAC,KAAK,CAAC,0CAA0C,IAAI,CAAC,IAAI,2FAA2F,CAAC,CAAC;gBAC9J,OAAO,CAAC,KAAK,CAAC,oEAAoE,CAAC;gBACnF,MAAM,CAAC,CAAC;YACZ,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,eAAe,GAAG,IAA2B,CAAC;QACvD,CAAC;QAED,IAAI,yDAAO,CAAC,YAAY,CAAC,oBAAoB,EAAE,UAAI,CAAC,eAAe,CAAC,WAAW,mCAAI,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC;YAC/F,OAAO,CAAC,IAAI,CAAC,iDAAiD,YAAY,CAAC,oBAAoB,uCAAuC,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC;QAC7K,CAAC;QAED,2BAA2B;QAC3B,oBAAoB;QACpB,MAAM,YAAY,GAAgC,EAAE,CAAC;QACrD,KAAK,IAAI,OAAO,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACrD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBAClB,MAAM,SAAS,GAAG,8DAAkB,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC/E,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;gBACpD,MAAM,eAAe,GAAG,IAAI,6CAAO,CAAC;oBAChC,KAAK;oBACL,WAAW,EAAE,OAAO;iBACvB,CAAC,CAAC;gBACH,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;YACpD,CAAC;iBAAM,CAAC;gBACJ,IAAI,OAAO,CAAC,UAAU,KAAK,gBAAgB,EAAE,CAAC;oBAC1C,OAAO,CAAC,IAAI,CAAC,iCAAiC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;gBACxE,CAAC;YACL,CAAC;QACL,CAAC;QAED,6BAA6B;QAC7B,0BAA0B;QAC1B,KAAK,IAAI,KAAK,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC;YAC5C,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;gBACxB,kBAAkB;gBAClB,MAAM,SAAS,GAAG,8DAAkB,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,eAAe,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;gBACrF,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,EAAE;oBACxC,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,UAAU,EAAE,IAAI,CAAC,UAAU;oBAC3B,WAAW,EAAE,IAAI,CAAC,YAAY;oBAC9B,OAAO,EAAE,IAAI,CAAC,OAAO;iBACxB,CAAC,CAAC;YACP,CAAC;iBAAM,CAAC;gBACJ,kBAAkB;gBAClB,MAAM,aAAa,GAAG,IAAI,yCAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;gBAC7C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;gBAC1C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,aAAa,CAAC,CAAC;YACzE,CAAC;QACL,CAAC;QAED,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACxE,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACvC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACtD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACrF,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC;IAC5C,CAAC;IAAA,CAAC;IAEF,QAAQ;QACJ,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,+BAA+B,CAAC,oBAA4B,EAAE,OAAoD;QAC9G,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;IAED,iCAAiC,CAAC,SAAsE;QACpG,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;YAC1B,IAAI,CAAC,+BAA+B,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9D,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,QAAQ,CAAC,UAAkB;QACvB,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED;;;OAGG;IACH,eAAe,CAAC,eAAwB;QACpC,IAAI,OAAO,GAAkB,EAAE,CAAC;QAChC,IAAI,eAAe,EAAE,CAAC;YAClB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;YAC7C,IAAI,KAAK,EAAE,CAAC;gBACR,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBAC7B,IAAI,KAAK,YAAY,uDAAW,EAAE,CAAC;wBAC/B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACxB,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;gBACvC,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBAC7B,IAAI,KAAK,YAAY,uDAAW,EAAE,CAAC;wBAC/B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACxB,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;QAED,OAAO,OAAO;IAClB,CAAC;IAED,aAAa,CAAC,UAAmB;QAC7B,IAAI,OAAO,GAAgB,EAAE,CAAC;QAC9B,IAAI,UAAU,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YACxC,IAAI,KAAK,EAAE,CAAC;gBACR,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBAC7B,IAAI,KAAK,YAAY,kDAAS,EAAE,CAAC;wBAC7B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACxB,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;gBACvC,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBAC7B,IAAI,KAAK,YAAY,kDAAS,EAAE,CAAC;wBAC7B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACxB,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,gBAAgB,CAAC,UAAmB;QAChC,IAAI,OAAO,GAAmB,EAAE,CAAC;QACjC,IAAI,UAAU,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YACxC,IAAI,KAAK,EAAE,CAAC;gBACR,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBAC7B,IAAI,KAAK,YAAY,yDAAY,EAAE,CAAC;wBAChC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACxB,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;gBACvC,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBAC7B,IAAI,KAAK,YAAY,yDAAY,EAAE,CAAC;wBAChC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACxB,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;;OAIG;IACH,2BAA2B,CAAC,UAAkB,EAAE,MAAiB;QAC7D,IAAI,OAAO,GAAyB,EAAE,CAAC;QACvC,MAAM,cAAc,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACnG,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAC3C,KAAK,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;gBACvB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,CAAC,UAAU,CAAC,CAAC,CAAC;YAC5E,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;;OAIG;IACH,sBAAsB,CAAC,eAAuB,EAAE,KAAW,EAAE,MAAiB;QAC1E,IAAI,OAAO,GAAyB,EAAE,CAAC;QACvC,MAAM,cAAc,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACnG,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAC3C,KAAK,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;gBACvB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC,CAAC;YACnF,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;;OAIG;IACH,uBAAuB,CAAC,UAAkB,EAAE,MAAiB;QACzD,IAAI,OAAO,GAAkB,EAAE,CAAC;QAChC,MAAM,cAAc,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACnG,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAC3C,KAAK,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;gBACvB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,UAAU,CAAC,CAAC,CAAC;YACxE,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;;;OAKG;IACH,kBAAkB,CAAC,eAAuB,EAAE,KAAW,EAAE,MAAiB;QACtE,IAAI,OAAO,GAAkB,EAAE,CAAC;QAChC,MAAM,cAAc,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACnG,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAC3C,KAAK,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;gBACvB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC,CAAC;YAC/E,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;OAGG;IACH,cAAc,CAAC,MAAiB;QAC5B,MAAM,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;QACxD,IAAI,MAAM,GAAuB,IAAI,CAAC;QACtC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACvC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC/C,SAAS;YACb,CAAC;YACD,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;YACzE,IAAI,cAAc,EAAE,CAAC;gBACjB,MAAM,UAAU,GAAG,kDAAW,CAAC,aAAa,CACxC,cAAc,CAAC,OAAO,CAAC,SAAS,GAAG,cAAc,CAAC,OAAO,CAAC,OAAO,EACjE,cAAc,CAAC,OAAO,CAAC,UAAU,GAAG,cAAc,CAAC,OAAO,CAAC,IAAI,EAC/D,6CAAM,CAAC,IAAI,EACX,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBAChC,IAAI,CAAC,MAAM,EAAE,CAAC;oBACV,MAAM,GAAG,UAAU,CAAC;gBACxB,CAAC;qBAAM,CAAC;oBACJ,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBACxC,CAAC;YACL,CAAC;QACL,CAAC;QACD,OAAO,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,IAAI,kDAAW,EAAE,CAAC;IACvC,CAAC;IAED,UAAU,CAAC,KAAY,EAAE,OAA2B;;QAChD,MAAM,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,EAAC,GAAG,EAAE,8CAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,GAAG,OAAO,EAAC,CAAC;QAErF,KAAK,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;YAC5C,IAAI,aAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,WAAW,0CAAE,MAAM,EAAE,CAAC;gBAC/B,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC5D,SAAS;gBACb,CAAC;YACL,CAAC;YACD,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBAC7B,IAAI,KAAK,YAAY,kDAAS,IAAI,KAAK,YAAY,yDAAY,EAAE,CAAC;oBAC9D,KAAK,CAAC,OAAO,CAAC,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBAC/C,IAAI,CAAC,eAAe,EAAE,CAAC;wBACnB,KAAK,CAAC,OAAO,CAAC,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;oBAC9D,CAAC;oBACD,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC;gBAC5B,CAAC;qBAAM,CAAC;oBACJ,KAAK,CAAC,YAAY,EAAE;oBACpB,KAAK,IAAI,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;wBAChC,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,yDAAkB,CAAC,CAAC;wBAC1C,IAAI,EAAE,EAAE,CAAC;4BACL,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;4BACzB,IAAI,CAAC,eAAe,EAAE,CAAC;gCACnB,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;4BACxC,CAAC;wBACL,CAAC;wBACD,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;oBACtB,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;QAED,IAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9D,IAAI,MAAM,EAAE,CAAC;gBACT,KAAK,CAAC,MAAM,CAAC,GAAG,GAAG,8CAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBACnD,MAAM,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,iBAAiB,EAAE,KAAK,MAAM,CAAC,CAAC;gBAC5F,IAAI,IAAI,EAAE,CAAC;oBACP,KAAK,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;gBACtC,CAAC;YACL,CAAC;QACL,CAAC;QAED,IAAI,IAAI,CAAC,wBAAwB,EAAE,CAAC;YAChC,IAAI,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,WAAW,CAAC,CAAC;YACvD,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC7B,KAAK,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC5C,IAAI,aAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,WAAW,0CAAE,MAAM,EAAE,CAAC;oBAC/B,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;wBAC5D,SAAS;oBACb,CAAC;gBACL,CAAC;gBACD,KAAK,CAAC,eAAe,GAAG,KAAK,CAAC,eAAe,CAAC;gBAC9C,MAAM;YACV,CAAC;QACL,CAAC;IAGL,CAAC;;AAnXa,iCAAoB,GAAG,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;AC/IC;AAEL;AACW;AACxB;AACI;AAWpC;;GAEG;AACI,MAAM,aAAa;IAMtB,YAA4B,IAAY,EAAkB,QAAsB,EAAE,OAA8B;QAApF,SAAI,GAAJ,IAAI,CAAQ;QAAkB,aAAQ,GAAR,QAAQ,CAAc;QALxE,eAAU,GAAe,qDAAW,CAAC;QAG7B,WAAM,GAAY,IAAI,CAAC;QACvB,aAAQ,GAAY,KAAK,CAAC;QAEtC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;QAC9E,IAAI,CAAC,UAAU,GAAG,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,IAAI,CAAC,UAAU,CAAC;QAChD,IAAI,CAAC,MAAM,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,IAAI,CAAC,MAAM,CAAC;QACpC,IAAI,CAAC,QAAQ,GAAG,QAAQ,aAAR,QAAQ,cAAR,QAAQ,GAAI,IAAI,CAAC,QAAQ,CAAC;QAC1C,IAAI,CAAC,WAAW,GAAG,WAAW,aAAX,WAAW,cAAX,WAAW,GAAI,IAAI,sDAAW,CAAC,kDAAW,CAAC,CAAC;QAC/D,IAAI,CAAC,OAAO,GAAG,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,IAAI,CAAC,OAAO,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,IAAI;QACN,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACtD,IAAI,KAAgB,CAAC;QACrB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,IAAI,CAAC;gBACD,KAAK,GAAG,6CAAS,CAAC,KAAK,CAAC,IAAI,CAAC;YACjC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,OAAO,CAAC,KAAK,CAAC,sCAAsC,IAAI,CAAC,IAAI,iDAAiD,CAAC,CAAC;gBAChH,MAAM,CAAC,CAAC;YACZ,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,KAAK,GAAG,IAAiB,CAAC;QAC9B,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,GAAG,IAAI,yCAAK,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvD,CAAC;IACD,QAAQ;QACJ,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IACvB,CAAC;CAEJ;;;;;;;;;;;;;;;;;;;ACrDiC;AACW;AACE;AAEN;AAGlC,MAAM,KAAK;IAKd,YAAmB,SAAoB,EAAS,QAAsB;;QAAnD,cAAS,GAAT,SAAS,CAAW;QAAS,aAAQ,GAAR,QAAQ,CAAc;QAF/D,WAAM,GAA+C,EAAE,CAAC;QAG3D,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;YACtB,IAAI,CAAC,eAAe,GAAG,4CAAK,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,SAAS,CAAC,cAAc,EAAE,CAAC;YAC3B,IAAI,KAAK,GAAG,QAAQ,CAAC,WAAW,CAAC;YACjC,IAAI,MAAM,GAAG,SAAS,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC;YACxD,KAAK,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;gBACvB,IAAI,YAAK,CAAC,eAAe,0CAAE,MAAM,MAAK,CAAC,EAAE,CAAC;oBACtC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,sDAAW,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;gBACpE,CAAC;gBAED,IAAI,YAAK,CAAC,SAAS,0CAAE,MAAM,MAAK,CAAC,EAAE,CAAC;oBAChC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,kDAAS,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;gBAClE,CAAC;gBAED,mEAAmE;gBACnE,IAAI,YAAK,CAAC,UAAU,0CAAE,MAAM,MAAK,CAAC,IAAI,YAAK,CAAC,cAAc,0CAAE,MAAM,MAAK,CAAC,EAAE,CAAC;oBACvE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,wDAAY,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;gBACrE,CAAC;gBACD,KAAK,EAAE,CAAC;YACZ,CAAC;QACL,CAAC;IACL,CAAC;CACJ;;;;;;;;;;;;;;;AChCA;;GAEG;AACI,MAAM,WAAW;IAIrB,YAA4B,IAA+B;QAA/B,SAAI,GAAJ,IAAI,CAA2B;QAHnD,YAAO,GAAG,KAAK,CAAC;QACxB,UAAK,GAAG,IAAI,GAAG,EAAa,CAAC;IAEgC,CAAC;IAE9D,QAAQ,CAAC,GAAG,IAAW;QACpB,IAAI,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9C,IAAI,QAAQ,EAAE,CAAC;YACZ,OAAO,QAAQ,CAAC;QACnB,CAAC;QAED,QAAQ,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;QACzC,OAAO,QAAQ,CAAC;IACnB,CAAC;IAED,MAAM;QACH,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAChB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1C,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC9E,CAAC;IAED,KAAK,CAAC,IAAI;QACP,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAE1E,qCAAqC;QACrC,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBAChC,OAAO,CAAC,KAAK,CAAC,6BAA6B,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,wDAAwD,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;gBACnI,OAAO,EAAE,CAAC;YACb,CAAC;QACJ,CAAC;QACD,IAAI,OAAO,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,iBAAiB,OAAO,YAAY,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACvB,CAAC;CACH;;;;;;;;;;;;;;;;;;AC7CK,SAAS,gBAAgB,CAAC,SAAiB;IAC/C,MAAM,kBAAkB,GAAG,yCAAyC;IAEpE,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAEpD,IAAI,OAAO,EAAE,CAAC;QACX,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACzB,OAAO,KAAK,CAAC;IAChB,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,wCAAwC,SAAS,EAAE,CAAC,CAAC;AACxE,CAAC;AAEM,SAAS,OAAO,CAAC,SAAiB,EAAE,OAAgB;IAExD,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;QACtC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5B,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5B,OAAO,MAAM,CAAC;YACjB,CAAC;QACJ,CAAC;aAAM,CAAC;YACL,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,KAAK,EAAE,CAAC;gBACT,OAAO,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAAA;AAAA,EAAC;YAC/C,CAAC;QACJ,CAAC;IACJ,CAAC;IACD,OAAO,SAAS,CAAC;AACpB,CAAC;AAEM,SAAS,SAAS,CAAC,SAAiB,EAAE,OAAiB;IAC3D,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC3B,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;QACtC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5B,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5B,OAAO,IAAI,CAAC;YACf,CAAC;QACJ,CAAC;aAAM,CAAC;YACL,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,KAAK,EAAE,CAAC;gBACT,OAAO,IAAI,CAAC;YACf,CAAC;QACJ,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AAChB,CAAC;AAGM,SAAS,kBAAkB,CAAC,QAAgB,EAAE,cAAsB,EAAE,OAAiB;IAC3F,IAAI,SAAS,CAAC,cAAc,EAAE,OAAO,CAAC,IAAI,OAAO,EAAE,CAAC;QACjD,OAAO,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,iCAAiC;IACjC,IAAI,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,OAAO,cAAc,CAAC;IACzB,CAAC;IAED,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,aAAa,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAChD,0DAA0D;IAC1D,IAAI,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACrD,WAAW,CAAC,GAAG,EAAE,CAAC;IACrB,CAAC;IACD,OAAO,WAAW,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACtD,CAAC;;;;;;;;;;;;;;;;ACrEmE;AAO7D,MAAM,SAAS;IAOlB,YAAY,KAAY,EAAE,SAA4B,EAAE,QAAsB,EAAkB,KAAa;;QAAb,UAAK,GAAL,KAAK,CAAQ;QACzG,IAAI,CAAC,QAAQ,GAAG,8CAAG,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACpE,IAAI,CAAC,MAAM,GAAG,8CAAG,CAAC,SAAS,CAAC,gBAAgB,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC1E,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,8CAAO,CAAC;YACvB,IAAI,EAAE,SAAS,CAAC,YAAY;YAC5B,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;YACnC,SAAS,EAAE,SAAS,CAAC,UAAU;YAC/B,UAAU,EAAE,SAAS,CAAC,UAAU;YAChC,IAAI,EAAE,SAAS,CAAC,MAAM;YACtB,OAAO,EAAE,SAAS,CAAC,MAAM;SAC5B,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,wDAAiB,CAAC,CAAC;QACrD,QAAQ,CAAC,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC;QAGvC,IAAI,SAAS,CAAC,eAAe,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;YAChE,KAAK,IAAI,IAAI,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;gBACnC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;gBAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;gBAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBACpD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;oBACf,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,UAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,mCAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,GAAG,CAAC,UAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,mCAAI,CAAC,CAAC,CAAC,CAAC,CAAC;oBACzK,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,UAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,mCAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,GAAG,CAAC,UAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,mCAAI,CAAC,CAAC,CAAC,CAAC,CAAC;oBACzK,uBAAuB;oBACvB,uBAAuB;oBACvB,kFAAkF;oBAClF,MAAM,cAAc,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;oBACzC,MAAM,YAAY,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;oBACvC,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;oBACpE,IAAI,cAAc,IAAI,YAAY,EAAE,CAAC;wBACjC,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;wBACxB,MAAM,CAAC,cAAc,GAAG,cAAc,CAAC;wBACvC,MAAM,CAAC,YAAY,GAAG,YAAY,CAAC;oBACvC,CAAC;oBACD,IAAI,MAAM,EAAE,CAAC;wBACT,MAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;oBAC/B,CAAC;yBAAM,CAAC;wBACJ,OAAO,CAAC,KAAK,CAAC,8CAA8C,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;oBACtF,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,SAAS,CAAC,eAAe,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACtG,CAAC;IAEL,CAAC;CACJ;;;;;;;;;;;;;;;;AC/D4D;AAQtD,MAAM,OAAO;IAIhB,YAAY,OAAuB;;QAC/B,MAAM,EAAC,KAAK,EAAE,WAAW,EAAC,GAAG,OAAO,CAAC;QACrC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,WAAW,GAAG,kDAAW,CAAC,eAAe,CAAC;YAC3C,KAAK;YACL,IAAI,EAAE;gBACF,IAAI,EAAE,WAAW,CAAC,KAAK,GAAG,WAAW,CAAC,YAAY;gBAClD,OAAO,EAAE,WAAW,CAAC,KAAK,GAAG,WAAW,CAAC,YAAY;gBACrD,YAAY,EAAE,WAAW,CAAC,YAAY;gBACtC,WAAW,EAAE,WAAW,CAAC,YAAY;aACxC;YACD,OAAO,EAAE;gBACL,MAAM,EAAE;oBACJ,CAAC,EAAE,iBAAW,CAAC,OAAO,mCAAI,CAAC;oBAC3B,CAAC,EAAE,iBAAW,CAAC,OAAO,mCAAI,CAAC;iBAC9B;gBACD,YAAY,EAAE;oBACV,CAAC,EAAE,iBAAW,CAAC,OAAO,mCAAI,CAAC;oBAC3B,CAAC,EAAE,iBAAW,CAAC,OAAO,mCAAI,CAAC;iBAC9B;aACJ;SACJ,CAAC,CAAC;IACP,CAAC;CACJ;;;;;;;;;;;;;;;;;;;;;ACpCuB;AAIxB,MAAM,oBAAoB,GAAG,kCAAC,CAAC,MAAM,CAAC;IAClC,CAAC,EAAE,kCAAC,CAAC,MAAM,EAAE;IACb,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,CAAC,EAAE,kCAAC,CAAC,MAAM,EAAE;IACb,CAAC,EAAE,kCAAC,CAAC,MAAM,EAAE;IACb,CAAC,EAAE,kCAAC,CAAC,MAAM,EAAE;CAChB,CAAC,CAAC;AACH,MAAM,SAAS,GAAG,kCAAC,CAAC,KAAK,CAAC,CAAC,kCAAC,CAAC,MAAM,EAAE,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AACpD,MAAM,iBAAiB,GAAG,kCAAC,CAAC,MAAM,CAAC;IAC/B,YAAY,EAAE,kCAAC,CAAC,MAAM,EAAE;IACxB,MAAM,EAAE,oBAAoB,CAAC,QAAQ,EAAE;IACvC,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE,EAAC,mJAAmJ;IACtK,OAAO,EAAE,kCAAC,CAAC,GAAG,EAAE;IAChB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;CACrB,CAAC;AACF,MAAM,gBAAgB,GAAG,kCAAC,CAAC,MAAM,CAAC;IAC9B,CAAC,EAAE,kCAAC,CAAC,MAAM,EAAE;IACb,CAAC,EAAE,kCAAC,CAAC,MAAM,EAAE,EAAE,sBAAsB;IACrC,EAAE,EAAE,SAAS;IACb,GAAG,EAAE,SAAS;IACd,CAAC,EAAE,kCAAC,CAAC,MAAM,EAAE;CAChB,CAAC,CAAC;AAEI,MAAM,kBAAkB,GAAG,kCAAC,CAAC,MAAM,CAAC;IACvC,MAAM,EAAE,SAAS;IACjB,YAAY,EAAE,kCAAC,CAAC,MAAM,EAAE;IACxB,OAAO,EAAE,SAAS;IAClB,YAAY,EAAE,kCAAC,CAAC,MAAM,EAAE;IACxB,MAAM,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,EAAE,CAAC;IAC3B,MAAM,EAAE,oBAAoB,CAAC,QAAQ,EAAE;IACvC,QAAQ,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,QAAQ,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,cAAc,EAAE,kCAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC;IAC1C,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;IACf,EAAE,EAAE,SAAS;IACb,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;CACpB,CAAC,CAAC;AAGI,MAAM,iBAAiB,GAAG,kCAAC,CAAC,MAAM,CAAC;IACtC,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,YAAY,EAAE,kCAAC,CAAC,MAAM,EAAE;IACxB,SAAS,EAAE,kCAAC,CAAC,MAAM,EAAE;IACrB,gBAAgB,EAAE,kCAAC,CAAC,MAAM,EAAE;IAC5B,gBAAgB,EAAE,kCAAC,CAAC,MAAM,EAAE;IAC5B,eAAe,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACtC,gBAAgB,EAAC,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACtC,MAAM,EAAE,kCAAC,CAAC,KAAK,CAAC,CAAC,kCAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;IAC1G,cAAc,EAAE,kCAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,sBAAsB;IACjE,eAAe,EAAE,kCAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAC,wBAAwB;IACrE,SAAS,EAAE,kCAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC;IACpC,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;IACf,UAAU,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,EAAE,CAAC,EAAE,oDAAoD;IACrF,WAAW,EAAE,kCAAC,CAAC,MAAM,EAAE;IACvB,OAAO,EAAE,kCAAC,CAAC,MAAM,EAAE;IACnB,kBAAkB,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACzC,SAAS,EAAE,kCAAC,CAAC,MAAM,EAAE;IACrB,SAAS,EAAE,kCAAC,CAAC,MAAM,EAAE;IACrB,OAAO,EAAE,kCAAC,CAAC,OAAO,EAAE;CACvB,CAAC,CAAC;AAGI,MAAM,SAAS,GAAG,kCAAC,CAAC,MAAM,CAAC;IAC9B,SAAS,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,OAAO,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,OAAO,EAAE,kCAAC,CAAC,MAAM,CAAC;QACd,QAAQ,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,KAAK,CAAC,CAAC,kCAAC,CAAC,MAAM,EAAE,EAAE,kCAAC,CAAC,MAAM,EAAE,EAAE,kCAAC,CAAC,MAAM,EAAE,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,sCAAsC;QACpH,KAAK,EAAE,kCAAC,CAAC,KAAK,CAAC,CAAC,kCAAC,CAAC,MAAM,EAAE,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACxC,SAAS,EAAE,SAAS;KACvB,CAAC,CAAC,QAAQ,EAAE;IACb,YAAY,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,CAAC;QAC3B,GAAG,EAAE,kCAAC,CAAC,KAAK,CAAC,CAAC,kCAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QAClM,QAAQ,EAAE,kCAAC,CAAC,MAAM,EAAE;KACvB,CAAC,CAAC;IACH,SAAS,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,eAAe,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACtC,cAAc,EAAE,kCAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC;IAC1C,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;IACf,cAAc,EAAE,kCAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,QAAQ,EAAE,EAAE,gDAAgD;IACvG,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;IACjB,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;IACjB,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;IACf,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;CACrB,CAAC,CAAC;AAGH,MAAM,SAAS,GAAG,kCAAC,CAAC,MAAM,CAAC;IACvB,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;IACf,MAAM,EAAE,kCAAC,CAAC,KAAK,CAAC,SAAS,CAAC;IAC1B,eAAe,EAAC,kCAAC,CAAC,MAAM,EAAE;IAC1B,cAAc,EAAE,kCAAC,CAAC,MAAM,EAAE;IAC1B,6BAA6B;IAC7B,WAAW,EAAE,kCAAC,CAAC,KAAK,CAAC,CAAC,kCAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC;CAChI,CAAC,CAAC;AAGH,MAAM,uBAAuB,GAAG,kCAAC,CAAC,MAAM,CAAC;IACrC,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;IACjB,EAAE,EAAE,kCAAC,CAAC,MAAM,EAAE;IACd,QAAQ,EAAE,oBAAoB,CAAC,QAAQ,EAAE;CAC5C,CAAC,CAAC;AAEH,MAAM,kBAAkB,GAAG,kCAAC,CAAC,MAAM,CAAC;IAChC,eAAe,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACtC,cAAc,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACrC,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,IAAI,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,EAAE,CAAC;IACzB,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;IACf,MAAM,EAAE,kCAAC,CAAC,KAAK,CAAC,uBAAuB,CAAC;CAC3C,CAAC;AAIF,MAAM,qBAAqB,GAAG,kCAAC,CAAC,MAAM,CAAC;IACnC,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,UAAU,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,CAAC;QACzB,IAAI,EAAE,kCAAC,CAAC,MAAM,EAAE;QAChB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;KACrB,CAAC,CAAC;IACH,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,QAAQ,EAAE,kCAAC,CAAC,QAAQ,CAAC,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,CAAC;QAClC,WAAW,EAAE,kCAAC,CAAC,MAAM,EAAE;QACvB,OAAO,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,EAAE,CAAC;KAC/B,CAAC,CAAC,CAAC;IACJ,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,OAAO,EAAE,kCAAC,CAAC,MAAM,EAAE;IACnB,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;IACjB,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;IACjB,OAAO,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,OAAO,EAAE,kCAAC,CAAC,MAAM,EAAE;IACnB,IAAI,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,EAAE,CAAC;IACzB,iBAAiB,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACxC,YAAY,EAAE,kCAAC,CAAC,MAAM,EAAE;IACxB,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;CAClB,CAAC;AAGK,MAAM,mBAAmB,GAAG,kCAAC,CAAC,MAAM,CAAC;IACxC,MAAM,EAAE,kCAAC,CAAC,KAAK,CAAC,CAAC,kCAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;IAC1G,qBAAqB,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5C,cAAc,EAAE,kCAAC,CAAC,MAAM,EAAE;IAC1B,QAAQ,EAAE,kCAAC,CAAC,MAAM,EAAE;IACpB,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,aAAa,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,CAAC;QAC5B,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;QACjB,QAAQ,EAAE,kCAAC,CAAC,MAAM,EAAE;QACpB,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QACjC,IAAI,EAAE,oBAAoB,CAAC,QAAQ,EAAE;QACrC,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;KACpB,CAAC,CAAC;IACH,mBAAmB,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,CAAC;QAClC,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC5B,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QACjC,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;KAClB,CAAC,CAAC;IACH,eAAe,EAAE,kCAAC,CAAC,MAAM,EAAE;IAC3B,eAAe,EAAE,kCAAC,CAAC,MAAM,EAAE;IAC3B,eAAe,EAAE,kCAAC,CAAC,OAAO,EAAE;IAC5B,SAAS,EAAE,kCAAC,CAAC,MAAM,EAAE;IACrB,SAAS,EAAE,kCAAC,CAAC,MAAM,EAAE;IACrB,aAAa,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpC,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;CAClB,CAAC,CAAC;AAGI,MAAM,oBAAoB,GAAG,kCAAC,CAAC,MAAM,CAAC;IACzC,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;IACjB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,gBAAgB,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,EAAE,CAAC;IACrC,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,QAAQ,EAAE,oBAAoB,CAAC,QAAQ,EAAE;IACzC,cAAc,EAAE,kCAAC,CAAC,KAAK,CAAC;QACpB,kCAAC,CAAC,OAAO,CAAC,OAAO,CAAC;QAClB,kCAAC,CAAC,OAAO,CAAC,WAAW,CAAC;QACtB,kCAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;QACnB,kCAAC,CAAC,OAAO,CAAC,SAAS,CAAC;QACpB,kCAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC;QAC5B,kCAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC;QAC9B,kCAAC,CAAC,OAAO,CAAC,WAAW,CAAC;KACzB,CAAC;IACF,SAAS,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,UAAU,EAAE,oBAAoB,CAAC,QAAQ,EAAE;IAC3C,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;IACf,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;CACpB,CAAC,CAAC;AAGH,MAAM,eAAe,GAAG,kCAAC,CAAC,MAAM,CAAC;IAC7B,QAAQ,EAAE,kCAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC;IACxC,KAAK,EAAE,kCAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC;IAClC,MAAM,EAAE,kCAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC;IACpC,QAAQ,EAAE,kCAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC;CAC1C,CAAC;AAGK,MAAM,mBAAmB,GAAG,kCAAC,CAAC,MAAM,CAAC;IACxC,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;IACf,OAAO,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,IAAI,EAAE,eAAe;IACrB,cAAc,EAAE,kCAAC,CAAC,OAAO,EAAE;IAC3B,WAAW,EAAE,kCAAC,CAAC,MAAM,EAAE;IACvB,MAAM,EAAE,kCAAC,CAAC,KAAK,CAAC,SAAS,CAAC;IAC1B,GAAG,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,CAAC;QAClB,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;QACtB,aAAa,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,CAAC;YAC5B,MAAM,EAAE,kCAAC,CAAC,GAAG,EAAE;YACf,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;YACjB,IAAI,EAAE,kCAAC,CAAC,MAAM,EAAE;YAChB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;YAClB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;YAClB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;SACrB,CAAC,CAAC;KACN,CAAC,CAAC;IACH,yBAAyB;IACzB,eAAe,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACtC,cAAc,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACrC,uCAAuC;IACvC,WAAW,EAAE,kCAAC,CAAC,KAAK,CAAC,CAAC,kCAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACxI,MAAM,EAAE,kCAAC,CAAC,KAAK,CAAC,SAAS,CAAC;CAC7B,CAAC,CAAC;;;;;;;UC1OH;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;;;;WCtBA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA,E;;;;;WCPA,wF;;;;;WCAA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D,E;;;;;;;;;;;;;ACLgC;AAEgB;AAChD,4CAAQ,CAAC,sBAAsB,EAAE,CAAC;AAClC,MAAM,IAAI,GAAG,IAAI,6CAAS,CAAC;IACvB,UAAU,EAAE;QACR,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,GAAG;KACd;IACD,kBAAkB,EAAE,KAAK;IACzB,QAAQ,EAAE,IAAI;IACd,UAAU,EAAE,CAAC;IACb,WAAW,EAAE,kDAAc,CAAC,SAAS;CACxC,CAAC,CAAC;AAEH,IAAI,CAAC,KAAK,CAAC,8CAAM,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;IACzB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAE3B,iDAAS,CAAC,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE;QACrD,GAAG,EAAE,0CAAM,CAAC,CAAC,EAAE,CAAC,CAAC;KACpB,CAAC,CAAC;AACP,CAAC,CAAC,CAAC","sources":["webpack://@excaliburjs/plugin-ldtk/webpack/universalModuleDefinition","webpack://@excaliburjs/plugin-ldtk/./node_modules/compare-versions/lib/esm/compare.js","webpack://@excaliburjs/plugin-ldtk/./node_modules/compare-versions/lib/esm/compareVersions.js","webpack://@excaliburjs/plugin-ldtk/./node_modules/compare-versions/lib/esm/utils.js","webpack://@excaliburjs/plugin-ldtk/./node_modules/excalibur/build/esm/excalibur.development.js","webpack://@excaliburjs/plugin-ldtk/./node_modules/zod/lib/index.mjs","webpack://@excaliburjs/plugin-ldtk/./sample/resources.ts","webpack://@excaliburjs/plugin-ldtk/./src/entity-layer.ts","webpack://@excaliburjs/plugin-ldtk/./src/file-loader.ts","webpack://@excaliburjs/plugin-ldtk/./src/index.ts","webpack://@excaliburjs/plugin-ldtk/./src/intgrid-layer.ts","webpack://@excaliburjs/plugin-ldtk/./src/ldtk-resource.ts","webpack://@excaliburjs/plugin-ldtk/./src/level-resource.ts","webpack://@excaliburjs/plugin-ldtk/./src/level.ts","webpack://@excaliburjs/plugin-ldtk/./src/loader-cache.ts","webpack://@excaliburjs/plugin-ldtk/./src/path-util.ts","webpack://@excaliburjs/plugin-ldtk/./src/tile-layer.ts","webpack://@excaliburjs/plugin-ldtk/./src/tileset.ts","webpack://@excaliburjs/plugin-ldtk/./src/types.ts","webpack://@excaliburjs/plugin-ldtk/webpack/bootstrap","webpack://@excaliburjs/plugin-ldtk/webpack/runtime/define property getters","webpack://@excaliburjs/plugin-ldtk/webpack/runtime/hasOwnProperty shorthand","webpack://@excaliburjs/plugin-ldtk/webpack/runtime/make namespace object","webpack://@excaliburjs/plugin-ldtk/./sample/pureautotile.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, () => {\nreturn ","import { compareVersions } from './compareVersions.js';\n/**\n * Compare [semver](https://semver.org/) version strings using the specified operator.\n *\n * @param v1 First version to compare\n * @param v2 Second version to compare\n * @param operator Allowed arithmetic operator to use\n * @returns `true` if the comparison between the firstVersion and the secondVersion satisfies the operator, `false` otherwise.\n *\n * @example\n * ```\n * compare('10.1.8', '10.0.4', '>'); // return true\n * compare('10.0.1', '10.0.1', '='); // return true\n * compare('10.1.1', '10.2.2', '<'); // return true\n * compare('10.1.1', '10.2.2', '<='); // return true\n * compare('10.1.1', '10.2.2', '>='); // return false\n * ```\n */\nexport const compare = (v1, v2, operator) => {\n // validate input operator\n assertValidOperator(operator);\n // since result of compareVersions can only be -1 or 0 or 1\n // a simple map can be used to replace switch\n const res = compareVersions(v1, v2);\n return operatorResMap[operator].includes(res);\n};\nconst operatorResMap = {\n '>': [1],\n '>=': [0, 1],\n '=': [0],\n '<=': [-1, 0],\n '<': [-1],\n '!=': [-1, 1],\n};\nconst allowedOperators = Object.keys(operatorResMap);\nconst assertValidOperator = (op) => {\n if (typeof op !== 'string') {\n throw new TypeError(`Invalid operator type, expected string but got ${typeof op}`);\n }\n if (allowedOperators.indexOf(op) === -1) {\n throw new Error(`Invalid operator, expected one of ${allowedOperators.join('|')}`);\n }\n};\n//# sourceMappingURL=compare.js.map","import { compareSegments, validateAndParse } from './utils.js';\n/**\n * Compare [semver](https://semver.org/) version strings to find greater, equal or lesser.\n * This library supports the full semver specification, including comparing versions with different number of digits like `1.0.0`, `1.0`, `1`, and pre-release versions like `1.0.0-alpha`.\n * @param v1 - First version to compare\n * @param v2 - Second version to compare\n * @returns Numeric value compatible with the [Array.sort(fn) interface](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#Parameters).\n */\nexport const compareVersions = (v1, v2) => {\n // validate input and split into segments\n const n1 = validateAndParse(v1);\n const n2 = validateAndParse(v2);\n // pop off the patch\n const p1 = n1.pop();\n const p2 = n2.pop();\n // validate numbers\n const r = compareSegments(n1, n2);\n if (r !== 0)\n return r;\n // validate pre-release\n if (p1 && p2) {\n return compareSegments(p1.split('.'), p2.split('.'));\n }\n else if (p1 || p2) {\n return p1 ? -1 : 1;\n }\n return 0;\n};\n//# sourceMappingURL=compareVersions.js.map","export const semver = /^[v^~<>=]*?(\\d+)(?:\\.([x*]|\\d+)(?:\\.([x*]|\\d+)(?:\\.([x*]|\\d+))?(?:-([\\da-z\\-]+(?:\\.[\\da-z\\-]+)*))?(?:\\+[\\da-z\\-]+(?:\\.[\\da-z\\-]+)*)?)?)?$/i;\nexport const validateAndParse = (version) => {\n if (typeof version !== 'string') {\n throw new TypeError('Invalid argument expected string');\n }\n const match = version.match(semver);\n if (!match) {\n throw new Error(`Invalid argument not valid semver ('${version}' received)`);\n }\n match.shift();\n return match;\n};\nconst isWildcard = (s) => s === '*' || s === 'x' || s === 'X';\nconst tryParse = (v) => {\n const n = parseInt(v, 10);\n return isNaN(n) ? v : n;\n};\nconst forceType = (a, b) => typeof a !== typeof b ? [String(a), String(b)] : [a, b];\nconst compareStrings = (a, b) => {\n if (isWildcard(a) || isWildcard(b))\n return 0;\n const [ap, bp] = forceType(tryParse(a), tryParse(b));\n if (ap > bp)\n return 1;\n if (ap < bp)\n return -1;\n return 0;\n};\nexport const compareSegments = (a, b) => {\n for (let i = 0; i < Math.max(a.length, b.length); i++) {\n const r = compareStrings(a[i] || '0', b[i] || '0');\n if (r !== 0)\n return r;\n }\n return 0;\n};\n//# sourceMappingURL=utils.js.map","/*!\n * excalibur - 0.30.1 - 2024-12-12\n * https://github.com/excaliburjs/Excalibur\n * Copyright (c) 2024 Excalibur.js \n * Licensed BSD-2-Clause\n * @preserve\n */\n/******/ var __webpack_modules__ = ({\n\n/***/ \"./Director/Loader.css\":\n/*!*****************************!*\\\n !*** ./Director/Loader.css ***!\n \\*****************************/\n/***/ ((module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/sourceMaps.js */ \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ \"../../node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `/* Buttons styles start */\r\n\r\nbutton#excalibur-play {\r\n display: inline-block;\r\n position: relative;\r\n z-index: 999;\r\n border-radius: 6px;\r\n border: none;\r\n /*border: 3px solid;\r\n border-color: white;\r\n box-shadow: 0 0 10px #ccc;*/\r\n padding: 1rem 1.5rem 1rem 4rem;\r\n margin: 0;\r\n text-decoration: none;\r\n background: #00b233;\r\n color: #ffffff;\r\n font-family: sans-serif;\r\n font-size: 2rem;\r\n white-space: nowrap;\r\n line-height: 1;\r\n cursor: pointer;\r\n text-align: center;\r\n transition:\r\n background 250ms ease-in-out,\r\n transform 150ms ease;\r\n -webkit-appearance: none;\r\n -moz-appearance: none;\r\n\r\n -webkit-animation: excalibur-button-fadein 200ms; /* Safari, Chrome and Opera > 12.1 */\r\n -moz-animation: excalibur-button-fadein 200ms; /* Firefox < 16 */\r\n -ms-animation: excalibur-button-fadein 200ms; /* Internet Explorer */\r\n -o-animation: excalibur-button-fadein 200ms; /* Opera < 12.1 */\r\n animation: excalibur-button-fadein 200ms;\r\n}\r\n\r\n/*\r\nbutton#excalibur-play {\r\n display: none;\r\n}*/\r\n\r\nbutton#excalibur-play:after {\r\n position: absolute;\r\n content: '';\r\n border: 8px solid;\r\n border-color: transparent transparent transparent white;\r\n left: 35px;\r\n top: 24px;\r\n width: 0;\r\n height: 0;\r\n}\r\n\r\nbutton#excalibur-play:before {\r\n position: absolute;\r\n content: '';\r\n border: 3px solid;\r\n left: 19px;\r\n top: 14px;\r\n border-radius: 20px;\r\n width: 30px;\r\n height: 30px;\r\n}\r\n\r\nbutton#excalibur-play:hover,\r\nbutton#excalibur-play:focus {\r\n background: #00982c;\r\n}\r\n\r\nbutton#excalibur-play:focus {\r\n outline: 1px solid #fff;\r\n outline-offset: -4px;\r\n}\r\n\r\nbutton#excalibur-play:active {\r\n transform: scale(0.99);\r\n}\r\n\r\n@keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n/* Firefox < 16 */\r\n@-moz-keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n/* Safari, Chrome and Opera > 12.1 */\r\n@-webkit-keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n/* Internet Explorer */\r\n@-ms-keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n/* Opera < 12.1 */\r\n@-o-keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./Director/Loader.css\"],\"names\":[],\"mappings\":\"AAAA,yBAAyB;;AAEzB;EACE,qBAAqB;EACrB,kBAAkB;EAClB,YAAY;EACZ,kBAAkB;EAClB,YAAY;EACZ;;+BAE6B;EAC7B,8BAA8B;EAC9B,SAAS;EACT,qBAAqB;EACrB,mBAAmB;EACnB,cAAc;EACd,uBAAuB;EACvB,eAAe;EACf,mBAAmB;EACnB,cAAc;EACd,eAAe;EACf,kBAAkB;EAClB;;wBAEsB;EACtB,wBAAwB;EACxB,qBAAqB;;EAErB,gDAAgD,EAAE,oCAAoC;EACtF,6CAA6C,EAAE,iBAAiB;EAChE,4CAA4C,EAAE,sBAAsB;EACpE,2CAA2C,EAAE,iBAAiB;EAC9D,wCAAwC;AAC1C;;AAEA;;;EAGE;;AAEF;EACE,kBAAkB;EAClB,WAAW;EACX,iBAAiB;EACjB,uDAAuD;EACvD,UAAU;EACV,SAAS;EACT,QAAQ;EACR,SAAS;AACX;;AAEA;EACE,kBAAkB;EAClB,WAAW;EACX,iBAAiB;EACjB,UAAU;EACV,SAAS;EACT,mBAAmB;EACnB,WAAW;EACX,YAAY;AACd;;AAEA;;EAEE,mBAAmB;AACrB;;AAEA;EACE,uBAAuB;EACvB,oBAAoB;AACtB;;AAEA;EACE,sBAAsB;AACxB;;AAEA;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF;;AAEA,iBAAiB;AACjB;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF;;AAEA,oCAAoC;AACpC;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF;;AAEA,sBAAsB;AACtB;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF;;AAEA,iBAAiB;AACjB;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF\",\"sourcesContent\":[\"/* Buttons styles start */\\r\\n\\r\\nbutton#excalibur-play {\\r\\n display: inline-block;\\r\\n position: relative;\\r\\n z-index: 999;\\r\\n border-radius: 6px;\\r\\n border: none;\\r\\n /*border: 3px solid;\\r\\n border-color: white;\\r\\n box-shadow: 0 0 10px #ccc;*/\\r\\n padding: 1rem 1.5rem 1rem 4rem;\\r\\n margin: 0;\\r\\n text-decoration: none;\\r\\n background: #00b233;\\r\\n color: #ffffff;\\r\\n font-family: sans-serif;\\r\\n font-size: 2rem;\\r\\n white-space: nowrap;\\r\\n line-height: 1;\\r\\n cursor: pointer;\\r\\n text-align: center;\\r\\n transition:\\r\\n background 250ms ease-in-out,\\r\\n transform 150ms ease;\\r\\n -webkit-appearance: none;\\r\\n -moz-appearance: none;\\r\\n\\r\\n -webkit-animation: excalibur-button-fadein 200ms; /* Safari, Chrome and Opera > 12.1 */\\r\\n -moz-animation: excalibur-button-fadein 200ms; /* Firefox < 16 */\\r\\n -ms-animation: excalibur-button-fadein 200ms; /* Internet Explorer */\\r\\n -o-animation: excalibur-button-fadein 200ms; /* Opera < 12.1 */\\r\\n animation: excalibur-button-fadein 200ms;\\r\\n}\\r\\n\\r\\n/*\\r\\nbutton#excalibur-play {\\r\\n display: none;\\r\\n}*/\\r\\n\\r\\nbutton#excalibur-play:after {\\r\\n position: absolute;\\r\\n content: '';\\r\\n border: 8px solid;\\r\\n border-color: transparent transparent transparent white;\\r\\n left: 35px;\\r\\n top: 24px;\\r\\n width: 0;\\r\\n height: 0;\\r\\n}\\r\\n\\r\\nbutton#excalibur-play:before {\\r\\n position: absolute;\\r\\n content: '';\\r\\n border: 3px solid;\\r\\n left: 19px;\\r\\n top: 14px;\\r\\n border-radius: 20px;\\r\\n width: 30px;\\r\\n height: 30px;\\r\\n}\\r\\n\\r\\nbutton#excalibur-play:hover,\\r\\nbutton#excalibur-play:focus {\\r\\n background: #00982c;\\r\\n}\\r\\n\\r\\nbutton#excalibur-play:focus {\\r\\n outline: 1px solid #fff;\\r\\n outline-offset: -4px;\\r\\n}\\r\\n\\r\\nbutton#excalibur-play:active {\\r\\n transform: scale(0.99);\\r\\n}\\r\\n\\r\\n@keyframes excalibur-button-fadein {\\r\\n from {\\r\\n opacity: 0;\\r\\n }\\r\\n to {\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n/* Firefox < 16 */\\r\\n@-moz-keyframes excalibur-button-fadein {\\r\\n from {\\r\\n opacity: 0;\\r\\n }\\r\\n to {\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n/* Safari, Chrome and Opera > 12.1 */\\r\\n@-webkit-keyframes excalibur-button-fadein {\\r\\n from {\\r\\n opacity: 0;\\r\\n }\\r\\n to {\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n/* Internet Explorer */\\r\\n@-ms-keyframes excalibur-button-fadein {\\r\\n from {\\r\\n opacity: 0;\\r\\n }\\r\\n to {\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n/* Opera < 12.1 */\\r\\n@-o-keyframes excalibur-button-fadein {\\r\\n from {\\r\\n opacity: 0;\\r\\n }\\r\\n to {\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n\n\n/***/ }),\n\n/***/ \"./Util/Toaster.css\":\n/*!**************************!*\\\n !*** ./Util/Toaster.css ***!\n \\**************************/\n/***/ ((module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/sourceMaps.js */ \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ \"../../node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `#ex-toast-container {\r\n position: absolute;\r\n height: 0;\r\n min-width: 50%;\r\n left: 50%;\r\n top: 0;\r\n}\r\n\r\n.ex-toast-message {\r\n left: -50%;\r\n position: relative;\r\n display: flex;\r\n justify-content: space-between;\r\n\r\n padding: 10px;\r\n margin-top: 5px;\r\n font-size: 18px;\r\n font-family: sans-serif;\r\n border-radius: 6px;\r\n border: 3px solid #b7b779;\r\n background-color: rgb(253, 253, 192);\r\n}\r\n\r\n.ex-toast-message button {\r\n align-self: flex-start;\r\n}\r\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./Util/Toaster.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,kBAAkB;EAClB,SAAS;EACT,cAAc;EACd,SAAS;EACT,MAAM;AACR;;AAEA;EACE,UAAU;EACV,kBAAkB;EAClB,aAAa;EACb,8BAA8B;;EAE9B,aAAa;EACb,eAAe;EACf,eAAe;EACf,uBAAuB;EACvB,kBAAkB;EAClB,yBAAyB;EACzB,oCAAoC;AACtC;;AAEA;EACE,sBAAsB;AACxB\",\"sourcesContent\":[\"#ex-toast-container {\\r\\n position: absolute;\\r\\n height: 0;\\r\\n min-width: 50%;\\r\\n left: 50%;\\r\\n top: 0;\\r\\n}\\r\\n\\r\\n.ex-toast-message {\\r\\n left: -50%;\\r\\n position: relative;\\r\\n display: flex;\\r\\n justify-content: space-between;\\r\\n\\r\\n padding: 10px;\\r\\n margin-top: 5px;\\r\\n font-size: 18px;\\r\\n font-family: sans-serif;\\r\\n border-radius: 6px;\\r\\n border: 3px solid #b7b779;\\r\\n background-color: rgb(253, 253, 192);\\r\\n}\\r\\n\\r\\n.ex-toast-message button {\\r\\n align-self: flex-start;\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n\n\n/***/ }),\n\n/***/ \"../../node_modules/css-loader/dist/runtime/api.js\":\n/*!*********************************************************!*\\\n !*** ../../node_modules/css-loader/dist/runtime/api.js ***!\n \\*********************************************************/\n/***/ ((module) => {\n\n\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\nmodule.exports = function (cssWithMappingToString) {\n var list = [];\n\n // return the list of modules as css string\n list.toString = function toString() {\n return this.map(function (item) {\n var content = \"\";\n var needLayer = typeof item[5] !== \"undefined\";\n if (item[4]) {\n content += \"@supports (\".concat(item[4], \") {\");\n }\n if (item[2]) {\n content += \"@media \".concat(item[2], \" {\");\n }\n if (needLayer) {\n content += \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\");\n }\n content += cssWithMappingToString(item);\n if (needLayer) {\n content += \"}\";\n }\n if (item[2]) {\n content += \"}\";\n }\n if (item[4]) {\n content += \"}\";\n }\n return content;\n }).join(\"\");\n };\n\n // import a list of modules into the list\n list.i = function i(modules, media, dedupe, supports, layer) {\n if (typeof modules === \"string\") {\n modules = [[null, modules, undefined]];\n }\n var alreadyImportedModules = {};\n if (dedupe) {\n for (var k = 0; k < this.length; k++) {\n var id = this[k][0];\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n for (var _k = 0; _k < modules.length; _k++) {\n var item = [].concat(modules[_k]);\n if (dedupe && alreadyImportedModules[item[0]]) {\n continue;\n }\n if (typeof layer !== \"undefined\") {\n if (typeof item[5] === \"undefined\") {\n item[5] = layer;\n } else {\n item[1] = \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\").concat(item[1], \"}\");\n item[5] = layer;\n }\n }\n if (media) {\n if (!item[2]) {\n item[2] = media;\n } else {\n item[1] = \"@media \".concat(item[2], \" {\").concat(item[1], \"}\");\n item[2] = media;\n }\n }\n if (supports) {\n if (!item[4]) {\n item[4] = \"\".concat(supports);\n } else {\n item[1] = \"@supports (\".concat(item[4], \") {\").concat(item[1], \"}\");\n item[4] = supports;\n }\n }\n list.push(item);\n }\n };\n return list;\n};\n\n/***/ }),\n\n/***/ \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\":\n/*!****************************************************************!*\\\n !*** ../../node_modules/css-loader/dist/runtime/sourceMaps.js ***!\n \\****************************************************************/\n/***/ ((module) => {\n\n\n\nmodule.exports = function (item) {\n var content = item[1];\n var cssMapping = item[3];\n if (!cssMapping) {\n return content;\n }\n if (typeof btoa === \"function\") {\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n var sourceMapping = \"/*# \".concat(data, \" */\");\n return [content].concat([sourceMapping]).join(\"\\n\");\n }\n return [content].join(\"\\n\");\n};\n\n/***/ }),\n\n/***/ \"./Graphics/Context/circle-renderer/circle-renderer.frag.glsl\":\n/*!********************************************************************!*\\\n !*** ./Graphics/Context/circle-renderer/circle-renderer.frag.glsl ***!\n \\********************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nprecision highp float;\\r\\n\\r\\n// UV coord\\r\\nin vec2 v_uv;\\r\\n\\r\\n// Color coord to blend with image\\r\\nin lowp vec4 v_color;\\r\\n\\r\\n// Stroke color if used\\r\\nin lowp vec4 v_strokeColor;\\r\\n\\r\\n// Stroke thickness if used\\r\\nin lowp float v_strokeThickness;\\r\\n\\r\\n// Opacity\\r\\nin float v_opacity;\\r\\n\\r\\nout vec4 fragColor;\\r\\n\\r\\nvoid main() {\\r\\n // make (0, 0) the center the uv \\r\\n vec2 uv = v_uv * 2.0 - 1.0;\\r\\n\\r\\n vec4 color = v_color;\\r\\n vec4 strokeColor = v_strokeColor;\\r\\n\\r\\n // circle border is at radius 1.0 \\r\\n // dist is > 0 when inside the circle \\r\\n float d = length(uv);\\r\\n float dist = 1.0 - length(uv);\\r\\n\\r\\n // Fade based on fwidth\\r\\n float fade = fwidth(dot(uv, uv));\\r\\n\\r\\n // if dist is greater than 0 step to 1;\\r\\n // when we cross this 0 threshold add a smooth fade\\r\\n float fill = smoothstep(-fade/2.0, fade/2.0, dist);\\r\\n\\r\\n // if dist is greater than the stroke thickness step to 1\\r\\n float stroke = 1.0 - smoothstep(v_strokeThickness, v_strokeThickness + fade, dist);\\r\\n\\r\\n strokeColor.a *= fill * stroke;\\r\\n strokeColor.rgb *= strokeColor.a;\\r\\n\\r\\n color.a *= fill * (1.0 - stroke);\\r\\n color.rgb *= color.a;\\r\\n\\r\\n vec4 finalColor = mix(vec4(0.0), (color + strokeColor), fill);\\r\\n finalColor.rgb = finalColor.rgb * v_opacity;\\r\\n finalColor.a = finalColor.a * v_opacity;\\r\\n fragColor = finalColor;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/circle-renderer/circle-renderer.vert.glsl\":\n/*!********************************************************************!*\\\n !*** ./Graphics/Context/circle-renderer/circle-renderer.vert.glsl ***!\n \\********************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nin vec2 a_position;\\r\\n\\r\\n// UV coordinate\\r\\nin vec2 a_uv;\\r\\nout vec2 v_uv;\\r\\n\\r\\n// Opacity \\r\\nin float a_opacity;\\r\\nout float v_opacity;\\r\\n\\r\\nin vec4 a_color;\\r\\nout vec4 v_color;\\r\\n\\r\\nin vec4 a_strokeColor;\\r\\nout vec4 v_strokeColor;\\r\\n\\r\\nin float a_strokeThickness;\\r\\nout float v_strokeThickness;\\r\\n\\r\\nuniform mat4 u_matrix;\\r\\n\\r\\n\\r\\nvoid main() {\\r\\n // Set the vertex position using the ortho transform matrix\\r\\n gl_Position = u_matrix * vec4(a_position, 0.0, 1.0);\\r\\n\\r\\n // Pass through UV coords\\r\\n v_uv = a_uv;\\r\\n // Pass through the Opacity to the fragment shader\\r\\n v_opacity = a_opacity;\\r\\n // Pass through the color to the fragment shader\\r\\n v_color = a_color;\\r\\n // Pass through the stroke color to the fragment shader\\r\\n v_strokeColor = a_strokeColor;\\r\\n // Pass through the stroke thickenss to the fragment shader\\r\\n v_strokeThickness = a_strokeThickness;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/image-renderer-v2/image-renderer-v2.frag.glsl\":\n/*!************************************************************************!*\\\n !*** ./Graphics/Context/image-renderer-v2/image-renderer-v2.frag.glsl ***!\n \\************************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nprecision mediump float;\\r\\n\\r\\n// UV coord\\r\\nin vec2 v_texcoord;\\r\\n\\r\\n// Textures in the current draw\\r\\nuniform sampler2D u_textures[%%count%%];\\r\\n\\r\\nuniform bool u_pixelart;\\r\\n\\r\\nin float v_texture_index;\\r\\n\\r\\nin float v_opacity;\\r\\n\\r\\nin vec4 v_tint;\\r\\n\\r\\n// texture resolution\\r\\nin vec2 v_res;\\r\\n\\r\\nin vec2 v_uv_min;\\r\\nin vec2 v_uv_max;\\r\\n\\r\\nout vec4 fragColor;\\r\\n\\r\\n// Inigo Quilez pixel art filter https://jorenjoestar.github.io/post/pixel_art_filtering/\\r\\nvec2 uv_iq(in vec2 uv, in vec2 texture_size) {\\r\\n vec2 pixel = uv * texture_size;\\r\\n\\r\\n vec2 seam=floor(pixel+.5);\\r\\n vec2 dudv=fwidth(pixel);\\r\\n pixel=seam+clamp((pixel-seam)/dudv,-.5,.5);\\r\\n\\r\\n return pixel/texture_size;\\r\\n}\\r\\n\\r\\nfloat lerp(float from, float to, float rel){\\r\\n return ((1. - rel) * from) + (rel * to);\\r\\n}\\r\\n\\r\\nfloat invLerp(float from, float to, float value){\\r\\n return (value - from) / (to - from);\\r\\n}\\r\\n\\r\\nfloat remap(float origFrom, float origTo, float targetFrom, float targetTo, float value){\\r\\n float rel = invLerp(origFrom, origTo, value);\\r\\n return lerp(targetFrom, targetTo, rel);\\r\\n}\\r\\n\\r\\nvoid main(){\\r\\n // In order to support the most efficient sprite batching, we have multiple\\r\\n // textures loaded into the gpu (usually 8) this picker logic skips over textures\\r\\n // that do not apply to a particular sprite.\\r\\n\\r\\n vec4 color=vec4(1.,0,0,1.);\\r\\n\\r\\n // GLSL is templated out to pick the right texture and set the vec4 color\\r\\n vec2 uv = u_pixelart ? uv_iq(v_texcoord, v_res) : v_texcoord;\\r\\n uv.x = remap(0.,1., v_uv_min.x, v_uv_max.x, uv.x);\\r\\n uv.y = remap(0.,1., v_uv_min.y, v_uv_max.y, uv.y);\\r\\n\\r\\n %%texture_picker%%\\r\\n\\r\\n color.rgb = color.rgb * v_opacity;\\r\\n color.a = color.a * v_opacity;\\r\\n fragColor = color * v_tint;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/image-renderer-v2/image-renderer-v2.vert.glsl\":\n/*!************************************************************************!*\\\n !*** ./Graphics/Context/image-renderer-v2/image-renderer-v2.vert.glsl ***!\n \\************************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nlayout(location=0) in vec2 pos;\\r\\nlayout(location=1) in vec2 a_texcoord;\\r\\nout vec2 v_texcoord;\\r\\n\\r\\nlayout(location=2) in vec2 a_offset;\\r\\nlayout(location=3) in vec2 a_mat_column1;\\r\\nlayout(location=4) in vec2 a_mat_column2;\\r\\nlayout(location=5) in vec2 a_mat_column3;\\r\\n\\r\\nlayout(location=6) in float a_opacity;\\r\\nout float v_opacity;\\r\\n\\r\\n// Texture resolution (could be bigger than a_siz)\\r\\nlayout(location=7) in vec2 a_res;\\r\\nout vec2 v_res;\\r\\n\\r\\n// Final size of graphic\\r\\nlayout(location=8) in vec2 a_size;\\r\\n\\r\\nlayout(location=9) in lowp float a_texture_index;\\r\\nout lowp float v_texture_index;\\r\\n\\r\\nlayout(location=10) in vec2 a_uv_min;\\r\\nout vec2 v_uv_min;\\r\\n\\r\\nlayout(location=11) in vec2 a_uv_max;\\r\\nout vec2 v_uv_max;\\r\\n\\r\\nlayout(location=12) in vec4 a_tint;\\r\\nout vec4 v_tint;\\r\\n\\r\\nuniform mat4 u_matrix;\\r\\n\\r\\nvoid main(){\\r\\n mat4 world_mat = mat4(\\r\\n a_mat_column1.x, a_mat_column1.y, 0., 0.,\\r\\n a_mat_column2.x, a_mat_column2.y, 0., 0.,\\r\\n 0. , 0. , 1., 0.,\\r\\n a_mat_column3.x, a_mat_column3.y, 0., 1.\\r\\n );\\r\\n\\r\\n vec2 newPos = vec2(pos.x * a_res.x, pos.y * a_res.y);\\r\\n gl_Position = u_matrix * world_mat * vec4(newPos + a_offset, 0., 1.);\\r\\n\\r\\n v_opacity = a_opacity;\\r\\n v_texcoord = a_texcoord;\\r\\n v_uv_min = a_uv_min;\\r\\n v_uv_max = a_uv_max;\\r\\n v_res = a_res;\\r\\n v_texture_index = a_texture_index;\\r\\n v_tint = a_tint;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/image-renderer/image-renderer.frag.glsl\":\n/*!******************************************************************!*\\\n !*** ./Graphics/Context/image-renderer/image-renderer.frag.glsl ***!\n \\******************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nprecision mediump float;\\r\\n\\r\\n// UV coord\\r\\nin vec2 v_texcoord;\\r\\n\\r\\n// Texture index\\r\\nin lowp float v_textureIndex;\\r\\n\\r\\n// Textures in the current draw\\r\\nuniform sampler2D u_textures[%%count%%];\\r\\n\\r\\nuniform bool u_pixelart;\\r\\n\\r\\n// Opacity\\r\\nin float v_opacity;\\r\\n\\r\\nin vec4 v_tint;\\r\\n\\r\\nin vec2 v_res;\\r\\n\\r\\nout vec4 fragColor;\\r\\n\\r\\n// Inigo Quilez pixel art filter https://jorenjoestar.github.io/post/pixel_art_filtering/\\r\\nvec2 uv_iq(in vec2 uv, in vec2 texture_size) {\\r\\n vec2 pixel = uv * texture_size;\\r\\n \\r\\n vec2 seam=floor(pixel+.5);\\r\\n vec2 dudv=fwidth(pixel);\\r\\n pixel=seam+clamp((pixel-seam)/dudv,-.5,.5);\\r\\n \\r\\n return pixel/texture_size;\\r\\n}\\r\\n\\r\\nvoid main(){\\r\\n // In order to support the most efficient sprite batching, we have multiple\\r\\n // textures loaded into the gpu (usually 8) this picker logic skips over textures\\r\\n // that do not apply to a particular sprite.\\r\\n \\r\\n vec4 color=vec4(1.,0,0,1.);\\r\\n \\r\\n // GLSL is templated out to pick the right texture and set the vec4 color\\r\\n %%texture_picker%%\\r\\n \\r\\n color.rgb=color.rgb*v_opacity;\\r\\n color.a=color.a*v_opacity;\\r\\n fragColor=color*v_tint;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/image-renderer/image-renderer.vert.glsl\":\n/*!******************************************************************!*\\\n !*** ./Graphics/Context/image-renderer/image-renderer.vert.glsl ***!\n \\******************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nin vec2 a_position;\\r\\n\\r\\n// Opacity\\r\\nin float a_opacity;\\r\\nout float v_opacity;\\r\\n\\r\\n// UV coordinate\\r\\nin vec2 a_texcoord;\\r\\nout vec2 v_texcoord;\\r\\n\\r\\n// Texture res\\r\\nin vec2 a_res;\\r\\nout vec2 v_res;\\r\\n\\r\\n// Texture number\\r\\nin lowp float a_textureIndex;\\r\\nout lowp float v_textureIndex;\\r\\n\\r\\nin vec4 a_tint;\\r\\nout vec4 v_tint;\\r\\n\\r\\nuniform mat4 u_matrix;\\r\\n\\r\\nvoid main(){\\r\\n // Set the vertex position using the ortho transform matrix\\r\\n gl_Position=u_matrix*vec4(a_position,0.,1.);\\r\\n \\r\\n // Pass through the Opacity to the fragment shader\\r\\n v_opacity=a_opacity;\\r\\n // Pass through the UV coord to the fragment shader\\r\\n v_texcoord=a_texcoord;\\r\\n\\r\\n v_res = a_res;\\r\\n\\r\\n // Pass through the texture number to the fragment shader\\r\\n v_textureIndex=a_textureIndex;\\r\\n // Pass through the tint\\r\\n v_tint=a_tint;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/line-renderer/line-fragment.glsl\":\n/*!***********************************************************!*\\\n !*** ./Graphics/Context/line-renderer/line-fragment.glsl ***!\n \\***********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nprecision mediump float;\\r\\n\\r\\n// Color\\r\\nin lowp vec4 v_color;\\r\\n\\r\\nout vec4 fragColor;\\r\\n\\r\\nvoid main() {\\r\\n fragColor = v_color;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/line-renderer/line-vertex.glsl\":\n/*!*********************************************************!*\\\n !*** ./Graphics/Context/line-renderer/line-vertex.glsl ***!\n \\*********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nin vec2 a_position;\\r\\nin vec4 a_color;\\r\\n\\r\\nout lowp vec4 v_color;\\r\\n\\r\\nuniform mat4 u_matrix;\\r\\n\\r\\nvoid main() {\\r\\n // Set the vertex position using the ortho transform matrix\\r\\n gl_Position = u_matrix * vec4(a_position, 0.0, 1.0);\\r\\n\\r\\n // Passthrough the color\\r\\n v_color = a_color;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/particle-renderer/particle-fragment.glsl\":\n/*!*******************************************************************!*\\\n !*** ./Graphics/Context/particle-renderer/particle-fragment.glsl ***!\n \\*******************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nprecision mediump float;\\r\\n\\r\\nuniform sampler2D graphic;\\r\\nuniform bool useTexture;\\r\\nuniform float maxLifeMs;\\r\\n\\r\\nuniform vec4 beginColor;\\r\\nuniform vec4 endColor;\\r\\nuniform bool fade;\\r\\nuniform float startOpacity;\\r\\n\\r\\nin float finalRotation;\\r\\nin float finalLifeMs;\\r\\nout vec4 fragColor;\\r\\n\\r\\nvoid main(){\\r\\n\\r\\n float lifePct = finalLifeMs / maxLifeMs;\\r\\n\\r\\n if (useTexture) {\\r\\n /** Draw texture */\\r\\n if (lifePct <= 0.) discard;\\r\\n float mid = .5;\\r\\n float cosine = cos(finalRotation);\\r\\n float sine = sin(finalRotation);\\r\\n vec2 rotated = vec2(cosine * (gl_PointCoord.x - mid) + sine * (gl_PointCoord.y - mid) + mid,\\r\\n cosine * (gl_PointCoord.y - mid) - sine * (gl_PointCoord.x - mid) + mid);\\r\\n vec4 color = texture(graphic, rotated);\\r\\n fragColor = color * (fade ? lifePct : 1.0);\\r\\n } else {\\r\\n /** Draw circle */\\r\\n if (lifePct <= 0.) discard;\\r\\n vec2 uv = gl_PointCoord.xy * 2.0 - 1.0;\\r\\n float dist = 1.0 - length(uv);\\r\\n float edge = fwidth(dot(uv, uv));\\r\\n float circle = smoothstep(-edge/2.0, edge/2.0, dist);\\r\\n vec3 color = mix(beginColor.rgb, endColor.rgb, 1.0 - lifePct);\\r\\n fragColor.rgb = color;\\r\\n fragColor.a = startOpacity * circle * (fade ? lifePct : 1.0);// * mix(beginColor.a, endColor.a, 1.0 - lifePct);\\r\\n fragColor.rgb *= fragColor.a;\\r\\n }\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/particle-renderer/particle-vertex.glsl\":\n/*!*****************************************************************!*\\\n !*** ./Graphics/Context/particle-renderer/particle-vertex.glsl ***!\n \\*****************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nprecision mediump float;\\r\\n\\r\\nuniform float deltaMs;\\r\\nuniform float maxLifeMs;\\r\\nuniform vec2 gravity;\\r\\nuniform vec2 focus;\\r\\nuniform float focusAccel;\\r\\nuniform mat4 u_matrix;\\r\\nuniform mat4 u_transform;\\r\\nuniform float startSize;\\r\\nuniform float endSize;\\r\\n// uniform sampler2D obstacle;\\r\\n\\r\\nlayout(location=0)in vec2 position;\\r\\nlayout(location=1)in vec2 velocity;\\r\\nlayout(location=2)in float rotation;\\r\\nlayout(location=3)in float angularVelocity;\\r\\nlayout(location=4)in float lifeMs;\\r\\n\\r\\n// TODO z index to handle buffer wrapping?\\r\\n\\r\\n// DO NOT RE-ORDER\\r\\nout vec2 finalPosition;\\r\\nout vec2 finalVelocity;\\r\\nout float finalRotation;\\r\\nout float finalAngularVelocity;\\r\\nout float finalLifeMs;\\r\\nvoid main(){\\r\\n // Evolve particle\\r\\n float seconds = deltaMs / 1000.;\\r\\n // euler integration\\r\\n // Weird artifact of re-using the same buffer layout for update/draw\\r\\n // we need differently named variables\\r\\n vec2 finalGravity = gravity + normalize(focus - position) * focusAccel;\\r\\n finalVelocity = velocity + finalGravity * seconds;\\r\\n finalPosition = position + velocity * seconds + finalGravity * .5 * seconds * seconds;\\r\\n finalRotation = rotation + angularVelocity * seconds;\\r\\n finalAngularVelocity = angularVelocity;\\r\\n finalLifeMs = clamp(lifeMs - deltaMs, 0., maxLifeMs);\\r\\n\\r\\n // Collision mask sampling\\r\\n // vec2 samplePoint = finalPosition / vec2(width, height);\\r\\n // vec4 collides = texture(obstacle, samplePoint);\\r\\n // if (distance(collides,vec4(0.)) > .01) {\\r\\n // // non opaque means we collide! recalc final pos/vel\\r\\n // vec2 newVelocity = velocity * -.1;// lose energy\\r\\n // finalVelocity = newVelocity + gravity * seconds;\\r\\n // finalPosition = position + newVelocity * seconds + gravity * .5 * seconds * seconds;\\r\\n // }\\r\\n\\r\\n float lifePercent = finalLifeMs / maxLifeMs;\\r\\n vec2 transformedPos = (u_matrix * u_transform * vec4(finalPosition,0.,1.)).xy;\\r\\n float scale = sqrt(u_transform[0][0] * u_transform[0][0] + u_transform[1][1] * u_transform[1][1]);\\r\\n gl_Position = vec4(transformedPos, 1.0 - lifePercent, 1.); // use life percent to sort z\\r\\n gl_PointSize = mix(startSize, endSize, 1.0 - lifePercent) * scale;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/point-renderer/point-fragment.glsl\":\n/*!*************************************************************!*\\\n !*** ./Graphics/Context/point-renderer/point-fragment.glsl ***!\n \\*************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\n\\r\\nprecision mediump float;\\r\\nin lowp vec4 v_color;\\r\\n\\r\\nout vec4 fragColor;\\r\\n\\r\\nvoid main() {\\r\\n float r = 0.0, delta = 0.0, alpha = 1.0;\\r\\n vec2 cxy = 2.0 * gl_PointCoord - 1.0;\\r\\n r = dot(cxy, cxy);\\r\\n\\r\\n delta = fwidth(r);\\r\\n alpha = 1.0 - smoothstep(1.0 - delta, 1.0 + delta, r);\\r\\n // \\\"premultiply\\\" the color by alpha\\r\\n vec4 color = v_color;\\r\\n color.a = color.a * alpha;\\r\\n color.rgb = color.rgb * color.a;\\r\\n fragColor = color;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/point-renderer/point-vertex.glsl\":\n/*!***********************************************************!*\\\n !*** ./Graphics/Context/point-renderer/point-vertex.glsl ***!\n \\***********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nin vec2 a_position;\\r\\nin vec4 a_color;\\r\\nin float a_size;\\r\\nout lowp vec4 v_color;\\r\\nuniform mat4 u_matrix;\\r\\n\\r\\nvoid main() {\\r\\n gl_Position = u_matrix * vec4(a_position, 0.0, 1.0);\\r\\n gl_PointSize = a_size * 2.0;\\r\\n v_color = a_color;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/rectangle-renderer/rectangle-renderer.frag.glsl\":\n/*!**************************************************************************!*\\\n !*** ./Graphics/Context/rectangle-renderer/rectangle-renderer.frag.glsl ***!\n \\**************************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\n\\r\\nprecision mediump float;\\r\\n\\r\\n// UV coord\\r\\nin vec2 v_uv;\\r\\n\\r\\nin vec2 v_size; // in pixels\\r\\n\\r\\n// Color coord to blend with image\\r\\nin lowp vec4 v_color;\\r\\n\\r\\n// Stroke color if used\\r\\nin lowp vec4 v_strokeColor;\\r\\n\\r\\n// Stroke thickness if used\\r\\nin lowp float v_strokeThickness; // in pixels\\r\\n\\r\\n// Opacity\\r\\nin float v_opacity;\\r\\n\\r\\nout vec4 fragColor;\\r\\n\\r\\nvoid main() {\\r\\n // modified from https://stackoverflow.com/questions/59197671/glsl-rounded-rectangle-with-variable-border\\r\\n vec2 uv = v_uv;\\r\\n vec2 fragCoord = uv * v_size;\\r\\n float maxX = v_size.x - v_strokeThickness;\\r\\n float minX = v_strokeThickness;\\r\\n float maxY = v_size.y - v_strokeThickness;\\r\\n float minY = v_strokeThickness;\\r\\n\\r\\n if (fragCoord.x < maxX && fragCoord.x > minX &&\\r\\n fragCoord.y < maxY && fragCoord.y > minY) {\\r\\n fragColor = v_color;\\r\\n } else {\\r\\n fragColor = v_strokeColor;\\r\\n }\\r\\n fragColor.a *= v_opacity;\\r\\n fragColor.rgb *= fragColor.a;\\r\\n\\r\\n // vec2 v2CenteredPos = abs(fragCoord - v_size.xy / 2.0);\\r\\n // vec2 v2HalfShapeSizePx = v_size.xy/2.0 - v_strokeThickness/2.0;\\r\\n\\r\\n // float fHalfBorderDist = 0.0;\\r\\n // float fHalfBorderThickness = 0.0;\\r\\n\\r\\n // if (fragCoord.x > max(v_radius, v_strokeThickness) && \\r\\n // fragCoord.x < v_size.x - max(v_radius, v_strokeThickness))\\r\\n // {\\r\\n // fHalfBorderDist = v2CenteredPos.y - v2HalfShapeSizePx.y;\\r\\n // fHalfBorderThickness = v_strokeThickness / 2.0;\\r\\n // }\\r\\n // else if (fragCoord.y > max(v_radius, v_strokeThickness) && \\r\\n // fragCoord.y < v_size.y - max(v_radius, v_strokeThickness))\\r\\n // {\\r\\n // fHalfBorderDist = v2CenteredPos.x - v2HalfShapeSizePx.x;\\r\\n // fHalfBorderThickness = v_strokeThickness / 2.0;\\r\\n // }\\r\\n // else\\r\\n // {\\r\\n // vec2 edgeVec = max(vec2(0.0), v_radius - vec2(\\r\\n // uv.x > 0.5 ? v_size.x - fragCoord.x : fragCoord.x,\\r\\n // uv.y > 0.5 ? v_size.y - fragCoord.y : fragCoord.y));\\r\\n \\r\\n // float ellipse_ab = v_radius-v_strokeThickness;\\r\\n // vec2 ellipse_isect = (v_strokeThickness > v_radius || v_strokeThickness > v_radius) ? vec2(0.0) :\\r\\n // edgeVec.xy * ellipse_ab*ellipse_ab / length(ellipse_ab*edgeVec.yx); \\r\\n \\r\\n // fHalfBorderThickness = (v_radius - length(ellipse_isect)) / 2.0;\\r\\n // fHalfBorderDist = length(edgeVec) - (v_radius - fHalfBorderThickness);\\r\\n // }\\r\\n\\r\\n // vec4 v4FromColor = v_strokeColor;\\r\\n // v4FromColor.rgb *= v4FromColor.a;\\r\\n // vec4 v4ToColor = vec4(0.0); // background color is transparent\\r\\n // if (fHalfBorderDist < 0.0) {\\r\\n // v4ToColor = v_color;\\r\\n // v4ToColor.rgb *= v4ToColor.a;\\r\\n // }\\r\\n\\r\\n // float mixPct = abs(fHalfBorderDist) - fHalfBorderThickness;\\r\\n\\r\\n // vec4 finalColor = mix(v4FromColor, v4ToColor, mixPct);\\r\\n // gl_FragColor = finalColor;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/rectangle-renderer/rectangle-renderer.vert.glsl\":\n/*!**************************************************************************!*\\\n !*** ./Graphics/Context/rectangle-renderer/rectangle-renderer.vert.glsl ***!\n \\**************************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nin vec2 a_position;\\r\\n\\r\\n// UV coordinate\\r\\nin vec2 a_uv;\\r\\nout vec2 v_uv;\\r\\n\\r\\nin vec2 a_size;\\r\\nout vec2 v_size;\\r\\n\\r\\n// Opacity \\r\\nin float a_opacity;\\r\\nout float v_opacity;\\r\\n\\r\\nin vec4 a_color;\\r\\nout vec4 v_color;\\r\\n\\r\\nin vec4 a_strokeColor;\\r\\nout vec4 v_strokeColor;\\r\\n\\r\\nin float a_strokeThickness;\\r\\nout float v_strokeThickness;\\r\\n\\r\\nuniform mat4 u_matrix;\\r\\n\\r\\n\\r\\nvoid main() {\\r\\n // Set the vertex position using the ortho transform matrix\\r\\n gl_Position = u_matrix * vec4(a_position, 0.0, 1.0);\\r\\n\\r\\n // Pass through UV coords\\r\\n v_uv = a_uv;\\r\\n // Pass through size\\r\\n v_size = a_size;\\r\\n // Pass through the Opacity to the fragment shader\\r\\n v_opacity = a_opacity;\\r\\n // Pass through the color to the fragment shader\\r\\n v_color = a_color;\\r\\n // Pass through the stroke color to the fragment shader\\r\\n v_strokeColor = a_strokeColor;\\r\\n // Pass through the stroke thickenss to the fragment shader\\r\\n v_strokeThickness = a_strokeThickness;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/screen-pass-painter/screen-fragment.glsl\":\n/*!*******************************************************************!*\\\n !*** ./Graphics/Context/screen-pass-painter/screen-fragment.glsl ***!\n \\*******************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nprecision mediump float;\\r\\n\\r\\n// Passed in from the vertex shader.\\r\\nin vec2 v_texcoord;\\r\\n\\r\\n// The texture.\\r\\nuniform sampler2D u_texture;\\r\\n\\r\\nout vec4 fragColor;\\r\\n\\r\\nvoid main() {\\r\\n fragColor = texture(u_texture, v_texcoord);\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/screen-pass-painter/screen-vertex.glsl\":\n/*!*****************************************************************!*\\\n !*** ./Graphics/Context/screen-pass-painter/screen-vertex.glsl ***!\n \\*****************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nin vec2 a_position;\\r\\n\\r\\nin vec2 a_texcoord;\\r\\nout vec2 v_texcoord;\\r\\n\\r\\nvoid main() {\\r\\n gl_Position = vec4(a_position, 0.0, 1.0);\\r\\n\\r\\n // Pass the texcoord to the fragment shader.\\r\\n v_texcoord = a_texcoord;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/PostProcessor/color-blind-fragment.glsl\":\n/*!**********************************************************!*\\\n !*** ./Graphics/PostProcessor/color-blind-fragment.glsl ***!\n \\**********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nprecision mediump float;\\r\\n// our texture\\r\\nuniform sampler2D u_image;\\r\\n// the texCoords passed in from the vertex shader.\\r\\nin vec2 v_texcoord;\\r\\n\\r\\n// color blind type\\r\\nuniform int u_type;\\r\\n\\r\\n// simulation?\\r\\nuniform bool u_simulate;\\r\\n\\r\\nout vec4 fragColor;\\r\\n\\r\\nvoid main() {\\r\\n vec4 o = texture(u_image, v_texcoord);\\r\\n // RGB to LMS matrix conversion\\r\\n float L = (17.8824 * o.r) + (43.5161 * o.g) + (4.11935 * o.b);\\r\\n float M = (3.45565 * o.r) + (27.1554 * o.g) + (3.86714 * o.b);\\r\\n float S = (0.0299566 * o.r) + (0.184309 * o.g) + (1.46709 * o.b);\\r\\n // Simulate color blindness\\r\\n float l;\\r\\n float m;\\r\\n float s;\\r\\n //MODE CODE//\\r\\n if (u_type == 0) {\\r\\n // Protanope\\r\\n l = 0.0 * L + 2.02344 * M + -2.52581 * S;\\r\\n m = 0.0 * L + 1.0 * M + 0.0 * S;\\r\\n s = 0.0 * L + 0.0 * M + 1.0 * S;;\\r\\n } else if (u_type == 1) {\\r\\n // Deuteranope\\r\\n l = 1.0 * L + 0.0 * M + 0.0 * S;\\r\\n m = 0.494207 * L + 0.0 * M + 1.24827 * S;\\r\\n s = 0.0 * L + 0.0 * M + 1.0 * S;\\r\\n } else if (u_type == 2) {\\r\\n // Tritanope\\r\\n l = 1.0 * L + 0.0 * M + 0.0 * S;\\r\\n m = 0.0 * L + 1.0 * M + 0.0 * S;\\r\\n s = -0.395913 * L + 0.801109 * M + 0.0 * S;\\r\\n }\\r\\n\\r\\n // LMS to RGB matrix conversion\\r\\n vec4 error; // simulate the colors\\r\\n error.r = (0.0809444479 * l) + (-0.130504409 * m) + (0.116721066 * s);\\r\\n error.g = (-0.0102485335 * l) + (0.0540193266 * m) + (-0.113614708 * s);\\r\\n error.b = (-0.000365296938 * l) + (-0.00412161469 * m) + (0.693511405 * s);\\r\\n error.a = 1.0;\\r\\n vec4 diff = o - error;\\r\\n vec4 correction; // correct the colors\\r\\n correction.r = 0.0;\\r\\n correction.g = (diff.r * 0.7) + (diff.g * 1.0);\\r\\n correction.b = (diff.r * 0.7) + (diff.b * 1.0);\\r\\n correction = o + correction;\\r\\n correction.a = o.a;\\r\\n //SIMULATE//\\r\\n\\r\\n // sim \\r\\n if (u_simulate) {\\r\\n fragColor = error.rgba;\\r\\n } else {\\r\\n fragColor = correction.rgba;\\r\\n }\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Actions/Action.ts\":\n/*!***************************!*\\\n !*** ./Actions/Action.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ nextActionId: () => (/* binding */ nextActionId)\n/* harmony export */ });\nlet _ACTION_ID = 0;\n/**\n *\n */\nfunction nextActionId() {\n return _ACTION_ID++;\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/ActionContext.ts\":\n/*!**********************************!*\\\n !*** ./Actions/ActionContext.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ActionContext: () => (/* binding */ ActionContext)\n/* harmony export */ });\n/* harmony import */ var _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Util/EasingFunctions */ \"./Util/EasingFunctions.ts\");\n/* harmony import */ var _ActionQueue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ActionQueue */ \"./Actions/ActionQueue.ts\");\n/* harmony import */ var _Action_Repeat__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./Action/Repeat */ \"./Actions/Action/Repeat.ts\");\n/* harmony import */ var _Action_RepeatForever__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./Action/RepeatForever */ \"./Actions/Action/RepeatForever.ts\");\n/* harmony import */ var _Action_MoveBy__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Action/MoveBy */ \"./Actions/Action/MoveBy.ts\");\n/* harmony import */ var _Action_MoveTo__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Action/MoveTo */ \"./Actions/Action/MoveTo.ts\");\n/* harmony import */ var _Action_RotateTo__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Action/RotateTo */ \"./Actions/Action/RotateTo.ts\");\n/* harmony import */ var _Action_RotateBy__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Action/RotateBy */ \"./Actions/Action/RotateBy.ts\");\n/* harmony import */ var _Action_ScaleTo__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Action/ScaleTo */ \"./Actions/Action/ScaleTo.ts\");\n/* harmony import */ var _Action_ScaleBy__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Action/ScaleBy */ \"./Actions/Action/ScaleBy.ts\");\n/* harmony import */ var _Action_CallMethod__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Action/CallMethod */ \"./Actions/Action/CallMethod.ts\");\n/* harmony import */ var _Action_EaseTo__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Action/EaseTo */ \"./Actions/Action/EaseTo.ts\");\n/* harmony import */ var _Action_EaseBy__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Action/EaseBy */ \"./Actions/Action/EaseBy.ts\");\n/* harmony import */ var _Action_Blink__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Action/Blink */ \"./Actions/Action/Blink.ts\");\n/* harmony import */ var _Action_Fade__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Action/Fade */ \"./Actions/Action/Fade.ts\");\n/* harmony import */ var _Action_Delay__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Action/Delay */ \"./Actions/Action/Delay.ts\");\n/* harmony import */ var _Action_Die__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./Action/Die */ \"./Actions/Action/Die.ts\");\n/* harmony import */ var _Action_Follow__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./Action/Follow */ \"./Actions/Action/Follow.ts\");\n/* harmony import */ var _Action_Meet__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./Action/Meet */ \"./Actions/Action/Meet.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Math */ \"./Math/vector.ts\");\n/* harmony import */ var _Action_Flash__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Action/Flash */ \"./Actions/Action/Flash.ts\");\n/* harmony import */ var _Action_CurveTo__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Action/CurveTo */ \"./Actions/Action/CurveTo.ts\");\n/* harmony import */ var _Action_CurveBy__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Action/CurveBy */ \"./Actions/Action/CurveBy.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * The fluent Action API allows you to perform \"actions\" on\n * {@apilink Actor | `actors`} such as following, moving, rotating, and\n * more. You can implement your own actions by implementing\n * the {@apilink Action} interface.\n */\nclass ActionContext {\n constructor(entity) {\n this._entity = entity;\n this._queue = new _ActionQueue__WEBPACK_IMPORTED_MODULE_0__.ActionQueue(entity);\n }\n getQueue() {\n return this._queue;\n }\n update(elapsed) {\n this._queue.update(elapsed);\n }\n /**\n * Clears all queued actions from the Actor\n */\n clearActions() {\n this._queue.clearActions();\n }\n runAction(action) {\n action.reset();\n this._queue.add(action);\n return this;\n }\n /**\n * Animates an actor with a specified bezier curve by an offset to the current position, the start point is assumed\n * to be the actors current position\n * @param options\n */\n curveBy(options) {\n this._queue.add(new _Action_CurveBy__WEBPACK_IMPORTED_MODULE_1__.CurveBy(this._entity, options));\n return this;\n }\n /**\n * Animates an actor with a specified bezier curve to an absolute world space coordinate, the start point is assumed\n * to be the actors current position\n * @param options\n */\n curveTo(options) {\n this._queue.add(new _Action_CurveTo__WEBPACK_IMPORTED_MODULE_2__.CurveTo(this._entity, options));\n return this;\n }\n easeTo(...args) {\n var _a, _b;\n let x = 0;\n let y = 0;\n let duration = 0;\n let easingFcn = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_3__.EasingFunctions.Linear;\n if (args[0] instanceof _Math__WEBPACK_IMPORTED_MODULE_4__.Vector) {\n x = args[0].x;\n y = args[0].y;\n duration = args[1];\n easingFcn = (_a = args[2]) !== null && _a !== void 0 ? _a : easingFcn;\n }\n else {\n x = args[0];\n y = args[1];\n duration = args[2];\n easingFcn = (_b = args[3]) !== null && _b !== void 0 ? _b : easingFcn;\n }\n this._queue.add(new _Action_EaseTo__WEBPACK_IMPORTED_MODULE_5__.EaseTo(this._entity, x, y, duration, easingFcn));\n return this;\n }\n easeBy(...args) {\n var _a, _b;\n let offsetX = 0;\n let offsetY = 0;\n let duration = 0;\n let easingFcn = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_3__.EasingFunctions.Linear;\n if (args[0] instanceof _Math__WEBPACK_IMPORTED_MODULE_4__.Vector) {\n offsetX = args[0].x;\n offsetY = args[0].y;\n duration = args[1];\n easingFcn = (_a = args[2]) !== null && _a !== void 0 ? _a : easingFcn;\n }\n else {\n offsetX = args[0];\n offsetY = args[1];\n duration = args[2];\n easingFcn = (_b = args[3]) !== null && _b !== void 0 ? _b : easingFcn;\n }\n this._queue.add(new _Action_EaseBy__WEBPACK_IMPORTED_MODULE_6__.EaseBy(this._entity, offsetX, offsetY, duration, easingFcn));\n return this;\n }\n moveTo(xOrPosOrOptions, yOrSpeed, speedOrUndefined) {\n let x = 0;\n let y = 0;\n let speed = 0;\n if (xOrPosOrOptions instanceof _Math__WEBPACK_IMPORTED_MODULE_4__.Vector) {\n x = xOrPosOrOptions.x;\n y = xOrPosOrOptions.y;\n speed = +(yOrSpeed !== null && yOrSpeed !== void 0 ? yOrSpeed : 0);\n this._queue.add(new _Action_MoveTo__WEBPACK_IMPORTED_MODULE_7__.MoveTo(this._entity, x, y, speed));\n }\n else if (typeof xOrPosOrOptions === 'number' && typeof yOrSpeed === 'number' && typeof speedOrUndefined === 'number') {\n x = xOrPosOrOptions;\n y = yOrSpeed;\n speed = speedOrUndefined;\n this._queue.add(new _Action_MoveTo__WEBPACK_IMPORTED_MODULE_7__.MoveTo(this._entity, x, y, speed));\n }\n else if ((0,_Action_MoveTo__WEBPACK_IMPORTED_MODULE_7__.isMoveToOptions)(xOrPosOrOptions)) {\n this._queue.add(new _Action_MoveTo__WEBPACK_IMPORTED_MODULE_7__.MoveToWithOptions(this._entity, xOrPosOrOptions));\n }\n return this;\n }\n moveBy(xOffsetOrVectorOrOptions, yOffsetOrSpeed, speedOrUndefined) {\n let xOffset = 0;\n let yOffset = 0;\n let speed = 0;\n if (xOffsetOrVectorOrOptions instanceof _Math__WEBPACK_IMPORTED_MODULE_4__.Vector && typeof yOffsetOrSpeed === 'number') {\n xOffset = xOffsetOrVectorOrOptions.x;\n yOffset = xOffsetOrVectorOrOptions.y;\n speed = yOffsetOrSpeed;\n this._queue.add(new _Action_MoveBy__WEBPACK_IMPORTED_MODULE_8__.MoveBy(this._entity, xOffset, yOffset, speed));\n }\n else if (typeof xOffsetOrVectorOrOptions === 'number' && typeof yOffsetOrSpeed === 'number' && typeof speedOrUndefined === 'number') {\n xOffset = xOffsetOrVectorOrOptions;\n yOffset = yOffsetOrSpeed;\n speed = speedOrUndefined;\n this._queue.add(new _Action_MoveBy__WEBPACK_IMPORTED_MODULE_8__.MoveBy(this._entity, xOffset, yOffset, speed));\n }\n else if ((0,_Action_MoveBy__WEBPACK_IMPORTED_MODULE_8__.isMoveByOptions)(xOffsetOrVectorOrOptions)) {\n this._queue.add(new _Action_MoveBy__WEBPACK_IMPORTED_MODULE_8__.MoveByWithOptions(this._entity, xOffsetOrVectorOrOptions));\n }\n return this;\n }\n rotateTo(angleRadiansOrOptions, speed, rotationType) {\n if (typeof angleRadiansOrOptions === 'number' && typeof speed === 'number') {\n this._queue.add(new _Action_RotateTo__WEBPACK_IMPORTED_MODULE_9__.RotateTo(this._entity, angleRadiansOrOptions, speed, rotationType));\n }\n else if (typeof angleRadiansOrOptions === 'object') {\n this._queue.add(new _Action_RotateTo__WEBPACK_IMPORTED_MODULE_9__.RotateToWithOptions(this._entity, angleRadiansOrOptions));\n }\n return this;\n }\n rotateBy(angleRadiansOffsetOrOptions, speed, rotationType) {\n if (typeof angleRadiansOffsetOrOptions === 'object') {\n this._queue.add(new _Action_RotateBy__WEBPACK_IMPORTED_MODULE_10__.RotateByWithOptions(this._entity, angleRadiansOffsetOrOptions));\n }\n else {\n this._queue.add(new _Action_RotateBy__WEBPACK_IMPORTED_MODULE_10__.RotateBy(this._entity, angleRadiansOffsetOrOptions, speed, rotationType));\n }\n return this;\n }\n scaleTo(sizeXOrVectorOrOptions, sizeYOrSpeed, speedXOrUndefined, speedYOrUndefined) {\n let sizeX = 1;\n let sizeY = 1;\n let speedX = 0;\n let speedY = 0;\n if ((0,_Action_ScaleTo__WEBPACK_IMPORTED_MODULE_11__.isScaleToOptions)(sizeXOrVectorOrOptions)) {\n this._queue.add(new _Action_ScaleTo__WEBPACK_IMPORTED_MODULE_11__.ScaleToWithOptions(this._entity, sizeXOrVectorOrOptions));\n return this;\n }\n if (sizeXOrVectorOrOptions instanceof _Math__WEBPACK_IMPORTED_MODULE_4__.Vector && sizeYOrSpeed instanceof _Math__WEBPACK_IMPORTED_MODULE_4__.Vector) {\n sizeX = sizeXOrVectorOrOptions.x;\n sizeY = sizeXOrVectorOrOptions.y;\n speedX = sizeYOrSpeed.x;\n speedY = sizeYOrSpeed.y;\n }\n if (typeof sizeXOrVectorOrOptions === 'number' && typeof sizeYOrSpeed === 'number') {\n sizeX = sizeXOrVectorOrOptions;\n sizeY = sizeYOrSpeed;\n speedX = speedXOrUndefined;\n speedY = speedYOrUndefined;\n }\n this._queue.add(new _Action_ScaleTo__WEBPACK_IMPORTED_MODULE_11__.ScaleTo(this._entity, sizeX, sizeY, speedX, speedY));\n return this;\n }\n scaleBy(sizeOffsetXOrVectorOrOptions, sizeOffsetYOrSpeed, speed) {\n if ((0,_Action_ScaleBy__WEBPACK_IMPORTED_MODULE_12__.isScaleByOptions)(sizeOffsetXOrVectorOrOptions)) {\n this._queue.add(new _Action_ScaleBy__WEBPACK_IMPORTED_MODULE_12__.ScaleByWithOptions(this._entity, sizeOffsetXOrVectorOrOptions));\n return this;\n }\n let sizeOffsetX = 1;\n let sizeOffsetY = 1;\n if (sizeOffsetXOrVectorOrOptions instanceof _Math__WEBPACK_IMPORTED_MODULE_4__.Vector) {\n sizeOffsetX = sizeOffsetXOrVectorOrOptions.x;\n sizeOffsetY = sizeOffsetXOrVectorOrOptions.y;\n speed = sizeOffsetYOrSpeed;\n }\n if (typeof sizeOffsetXOrVectorOrOptions === 'number' && typeof sizeOffsetYOrSpeed === 'number') {\n sizeOffsetX = sizeOffsetXOrVectorOrOptions;\n sizeOffsetY = sizeOffsetYOrSpeed;\n }\n this._queue.add(new _Action_ScaleBy__WEBPACK_IMPORTED_MODULE_12__.ScaleBy(this._entity, sizeOffsetX, sizeOffsetY, speed));\n return this;\n }\n /**\n * This method will cause an actor to blink (become visible and not\n * visible). Optionally, you may specify the number of blinks. Specify the amount of time\n * the actor should be visible per blink, and the amount of time not visible.\n * This method is part of the actor 'Action' fluent API allowing action chaining.\n * @param timeVisible The amount of time to stay visible per blink in milliseconds\n * @param timeNotVisible The amount of time to stay not visible per blink in milliseconds\n * @param numBlinks The number of times to blink\n */\n blink(timeVisible, timeNotVisible, numBlinks = 1) {\n this._queue.add(new _Action_Blink__WEBPACK_IMPORTED_MODULE_13__.Blink(this._entity, timeVisible, timeNotVisible, numBlinks));\n return this;\n }\n /**\n * This method will cause an actor's opacity to change from its current value\n * to the provided value by a specified time (in milliseconds). This method is\n * part of the actor 'Action' fluent API allowing action chaining.\n * @param opacity The ending opacity\n * @param duration The time it should take to fade the actor (in milliseconds)\n */\n fade(opacity, duration) {\n this._queue.add(new _Action_Fade__WEBPACK_IMPORTED_MODULE_14__.Fade(this._entity, opacity, duration));\n return this;\n }\n /**\n * This will cause an actor to flash a specific color for a period of time\n * @param color\n * @param duration The duration in milliseconds\n */\n flash(color, duration = 1000) {\n this._queue.add(new _Action_Flash__WEBPACK_IMPORTED_MODULE_15__.Flash(this._entity, color, duration));\n return this;\n }\n /**\n * This method will delay the next action from executing for a certain\n * amount of time (in milliseconds). This method is part of the actor\n * 'Action' fluent API allowing action chaining.\n * @param duration The amount of time to delay the next action in the queue from executing in milliseconds\n */\n delay(duration) {\n this._queue.add(new _Action_Delay__WEBPACK_IMPORTED_MODULE_16__.Delay(duration));\n return this;\n }\n /**\n * This method will add an action to the queue that will remove the actor from the\n * scene once it has completed its previous Any actions on the\n * action queue after this action will not be executed.\n */\n die() {\n this._queue.add(new _Action_Die__WEBPACK_IMPORTED_MODULE_17__.Die(this._entity));\n return this;\n }\n /**\n * This method allows you to call an arbitrary method as the next action in the\n * action queue. This is useful if you want to execute code in after a specific\n * action, i.e An actor arrives at a destination after traversing a path\n */\n callMethod(method) {\n this._queue.add(new _Action_CallMethod__WEBPACK_IMPORTED_MODULE_18__.CallMethod(method));\n return this;\n }\n /**\n * This method will cause the actor to repeat all of the actions built in\n * the `repeatBuilder` callback. If the number of repeats\n * is not specified it will repeat forever. This method is part of\n * the actor 'Action' fluent API allowing action chaining\n *\n * ```typescript\n * // Move up in a zig-zag by repeated moveBy's\n * actor.actions.repeat(repeatCtx => {\n * repeatCtx.moveBy(10, 0, 10);\n * repeatCtx.moveBy(0, 10, 10);\n * }, 5);\n * ```\n * @param repeatBuilder The builder to specify the repeatable list of actions\n * @param times The number of times to repeat all the previous actions in the action queue. If nothing is specified the actions\n * will repeat forever\n */\n repeat(repeatBuilder, times) {\n if (!times) {\n this.repeatForever(repeatBuilder);\n return this;\n }\n this._queue.add(new _Action_Repeat__WEBPACK_IMPORTED_MODULE_19__.Repeat(this._entity, repeatBuilder, times));\n return this;\n }\n /**\n * This method will cause the actor to repeat all of the actions built in\n * the `repeatBuilder` callback. If the number of repeats\n * is not specified it will repeat forever. This method is part of\n * the actor 'Action' fluent API allowing action chaining\n *\n * ```typescript\n * // Move up in a zig-zag by repeated moveBy's\n * actor.actions.repeat(repeatCtx => {\n * repeatCtx.moveBy(10, 0, 10);\n * repeatCtx.moveBy(0, 10, 10);\n * }, 5);\n * ```\n * @param repeatBuilder The builder to specify the repeatable list of actions\n */\n repeatForever(repeatBuilder) {\n this._queue.add(new _Action_RepeatForever__WEBPACK_IMPORTED_MODULE_20__.RepeatForever(this._entity, repeatBuilder));\n return this;\n }\n /**\n * This method will cause the entity to follow another at a specified distance\n * @param entity The entity to follow\n * @param followDistance The distance to maintain when following, if not specified the actor will follow at the current distance.\n */\n follow(entity, followDistance) {\n if (followDistance === undefined) {\n this._queue.add(new _Action_Follow__WEBPACK_IMPORTED_MODULE_21__.Follow(this._entity, entity));\n }\n else {\n this._queue.add(new _Action_Follow__WEBPACK_IMPORTED_MODULE_21__.Follow(this._entity, entity, followDistance));\n }\n return this;\n }\n /**\n * This method will cause the entity to move towards another until they\n * collide \"meet\" at a specified speed.\n * @param entity The entity to meet\n * @param speed The speed in pixels per second to move, if not specified it will match the speed of the other actor\n */\n meet(entity, speed) {\n if (speed === undefined) {\n this._queue.add(new _Action_Meet__WEBPACK_IMPORTED_MODULE_22__.Meet(this._entity, entity));\n }\n else {\n this._queue.add(new _Action_Meet__WEBPACK_IMPORTED_MODULE_22__.Meet(this._entity, entity, speed));\n }\n return this;\n }\n /**\n * Returns a promise that resolves when the current action queue up to now\n * is finished.\n */\n toPromise() {\n const temp = new Promise((resolve) => {\n this._queue.add(new _Action_CallMethod__WEBPACK_IMPORTED_MODULE_18__.CallMethod(() => {\n resolve();\n }));\n });\n return temp;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/ActionQueue.ts\":\n/*!********************************!*\\\n !*** ./Actions/ActionQueue.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ActionQueue: () => (/* binding */ ActionQueue)\n/* harmony export */ });\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n\n/**\n * Action Queues represent an ordered sequence of actions\n *\n * Action queues are part of the {@apilink ActionContext | `Action API`} and\n * store the list of actions to be executed for an {@apilink Actor}.\n *\n * Actors implement {@apilink Actor.actions} which can be manipulated by\n * advanced users to adjust the actions currently being executed in the\n * queue.\n */\nclass ActionQueue {\n constructor(entity) {\n this._actions = [];\n this._currentAction = null;\n this._completedActions = [];\n this._entity = entity;\n }\n /**\n * Add an action to the sequence\n * @param action\n */\n add(action) {\n this._actions.push(action);\n }\n /**\n * Remove an action by reference from the sequence\n * @param action\n */\n remove(action) {\n const index = this._actions.indexOf(action);\n this._actions.splice(index, 1);\n }\n /**\n * Removes all actions from this sequence\n */\n clearActions() {\n this._actions.length = 0;\n this._completedActions.length = 0;\n if (this._currentAction) {\n this._currentAction.stop();\n }\n }\n /**\n *\n * @returns The total list of actions in this sequence complete or not\n */\n getActions() {\n return this._actions.concat(this._completedActions);\n }\n getIncompleteActions() {\n return this._actions;\n }\n getCurrentAction() {\n return this._currentAction;\n }\n /**\n *\n * @returns `true` if there are more actions to process in the sequence\n */\n hasNext() {\n return this._actions.length > 0;\n }\n /**\n * @returns `true` if the current sequence of actions is done\n */\n isComplete() {\n return this._actions.length === 0;\n }\n /**\n * Resets the sequence of actions, this is used to restart a sequence from the beginning\n */\n reset() {\n this._actions = this.getActions();\n const len = this._actions.length;\n for (let i = 0; i < len; i++) {\n this._actions[i].reset();\n }\n this._completedActions = [];\n }\n /**\n * Update the queue which updates actions and handles completing actions\n * @param elapsed\n */\n update(elapsed) {\n if (this._actions.length > 0) {\n if (this._currentAction !== this._actions[0]) {\n this._currentAction = this._actions[0];\n this._entity.emit('actionstart', new _Events__WEBPACK_IMPORTED_MODULE_0__.ActionStartEvent(this._currentAction, this._entity));\n }\n this._currentAction.update(elapsed);\n if (this._currentAction.isComplete(this._entity)) {\n this._entity.emit('actioncomplete', new _Events__WEBPACK_IMPORTED_MODULE_0__.ActionCompleteEvent(this._currentAction, this._entity));\n const complete = this._actions.shift();\n if (complete) {\n this._completedActions.push(complete);\n }\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/ActionSequence.ts\":\n/*!******************************************!*\\\n !*** ./Actions/Action/ActionSequence.ts ***!\n \\******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ActionSequence: () => (/* binding */ ActionSequence)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _ActionContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ActionContext */ \"./Actions/ActionContext.ts\");\n\n\n/**\n * Action that can represent a sequence of actions, this can be useful in conjunction with\n * {@apilink ParallelActions} to run multiple sequences in parallel.\n */\nclass ActionSequence {\n constructor(entity, actionBuilder) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._stopped = false;\n this._sequenceBuilder = actionBuilder;\n this._sequenceContext = new _ActionContext__WEBPACK_IMPORTED_MODULE_1__.ActionContext(entity);\n this._actionQueue = this._sequenceContext.getQueue();\n this._sequenceBuilder(this._sequenceContext);\n }\n update(elapsed) {\n this._actionQueue.update(elapsed);\n }\n isComplete() {\n return this._stopped || this._actionQueue.isComplete();\n }\n stop() {\n this._stopped = true;\n }\n reset() {\n this._stopped = false;\n this._actionQueue.reset();\n }\n clone(entity) {\n return new ActionSequence(entity, this._sequenceBuilder);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/Blink.ts\":\n/*!*********************************!*\\\n !*** ./Actions/Action/Blink.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Blink: () => (/* binding */ Blink)\n/* harmony export */ });\n/* harmony import */ var _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Graphics/GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\nclass Blink {\n constructor(entity, timeVisible, timeNotVisible, numBlinks = 1) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._timeVisible = 0;\n this._timeNotVisible = 0;\n this._elapsedTime = 0;\n this._totalTime = 0;\n this._stopped = false;\n this._started = false;\n this._graphics = entity.get(_Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_1__.GraphicsComponent);\n this._timeVisible = timeVisible;\n this._timeNotVisible = timeNotVisible;\n this._duration = (timeVisible + timeNotVisible) * numBlinks;\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._elapsedTime = 0;\n this._totalTime = 0;\n }\n if (!this._graphics) {\n return;\n }\n this._elapsedTime += elapsed;\n this._totalTime += elapsed;\n if (this._graphics.isVisible && this._elapsedTime >= this._timeVisible) {\n this._graphics.isVisible = false;\n this._elapsedTime = 0;\n }\n if (!this._graphics.isVisible && this._elapsedTime >= this._timeNotVisible) {\n this._graphics.isVisible = true;\n this._elapsedTime = 0;\n }\n if (this.isComplete()) {\n this._graphics.isVisible = true;\n }\n }\n isComplete() {\n return this._stopped || this._totalTime >= this._duration;\n }\n stop() {\n if (this._graphics) {\n this._graphics.isVisible = true;\n }\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n this._elapsedTime = 0;\n this._totalTime = 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/CallMethod.ts\":\n/*!**************************************!*\\\n !*** ./Actions/Action/CallMethod.ts ***!\n \\**************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CallMethod: () => (/* binding */ CallMethod)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\nclass CallMethod {\n constructor(method) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._hasBeenCalled = false;\n this._method = method;\n }\n update(elapsed) {\n this._method();\n this._hasBeenCalled = true;\n }\n isComplete() {\n return this._hasBeenCalled;\n }\n reset() {\n this._hasBeenCalled = false;\n }\n stop() {\n this._hasBeenCalled = true;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/CurveBy.ts\":\n/*!***********************************!*\\\n !*** ./Actions/Action/CurveBy.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CurveBy: () => (/* binding */ CurveBy)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../EntityComponentSystem */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math */ \"./Math/bezier-curve.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math */ \"./Math/vector.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Math */ \"./Math/util.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math */ \"./Math/lerp.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\nclass CurveBy {\n constructor(entity, options) {\n var _a;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._mode = 'dynamic';\n this._entity = entity;\n this._tx = this._entity.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n if (!this._tx) {\n throw new Error(`Entity ${entity.name} has no TransformComponent, can only curveTo on Entities with TransformComponents.`);\n }\n this._curve = this._curve = new _Math__WEBPACK_IMPORTED_MODULE_2__.BezierCurve({\n controlPoints: [(0,_Math__WEBPACK_IMPORTED_MODULE_3__.vec)(0, 0), ...options.controlPoints],\n quality: options.quality\n });\n this._durationMs = options.duration;\n this._mode = (_a = options.mode) !== null && _a !== void 0 ? _a : this._mode;\n this._currentMs = this._durationMs;\n }\n update(elapsed) {\n if (!this._started) {\n this._curve.setControlPoint(0, this._tx.globalPos);\n this._curve.setControlPoint(1, this._curve.controlPoints[1].add(this._tx.globalPos));\n this._curve.setControlPoint(2, this._curve.controlPoints[2].add(this._tx.globalPos));\n this._curve.setControlPoint(3, this._curve.controlPoints[3].add(this._tx.globalPos));\n this._started = true;\n }\n this._currentMs -= elapsed;\n const t = (0,_Math__WEBPACK_IMPORTED_MODULE_4__.clamp)((0,_Math__WEBPACK_IMPORTED_MODULE_5__.remap)(0, this._durationMs, 0, 1, this._durationMs - this._currentMs), 0, 1);\n if (this._mode === 'dynamic') {\n this._tx.pos = this._curve.getPoint(t);\n }\n else {\n this._tx.pos = this._curve.getUniformPoint(t);\n }\n if (this.isComplete(this._entity)) {\n if (this._mode === 'dynamic') {\n this._tx.pos = this._curve.getPoint(1);\n }\n else {\n this._tx.pos = this._curve.getUniformPoint(1);\n }\n }\n }\n isComplete(entity) {\n return this._stopped || this._currentMs < 0;\n }\n reset() {\n this._currentMs = this._durationMs;\n this._started = false;\n this._stopped = false;\n }\n stop() {\n this._stopped = true;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/CurveTo.ts\":\n/*!***********************************!*\\\n !*** ./Actions/Action/CurveTo.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CurveTo: () => (/* binding */ CurveTo)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../EntityComponentSystem */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math */ \"./Math/bezier-curve.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math */ \"./Math/vector.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Math */ \"./Math/util.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math */ \"./Math/lerp.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\nclass CurveTo {\n constructor(entity, options) {\n var _a;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._mode = 'dynamic';\n this._entity = entity;\n this._tx = this._entity.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n if (!this._tx) {\n throw new Error(`Entity ${entity.name} has no TransformComponent, can only curveTo on Entities with TransformComponents.`);\n }\n this._curve = new _Math__WEBPACK_IMPORTED_MODULE_2__.BezierCurve({\n controlPoints: [(0,_Math__WEBPACK_IMPORTED_MODULE_3__.vec)(0, 0), ...options.controlPoints],\n quality: options.quality\n });\n this._durationMs = options.duration;\n this._mode = (_a = options.mode) !== null && _a !== void 0 ? _a : this._mode;\n this._currentMs = this._durationMs;\n }\n update(elapsed) {\n if (!this._started) {\n this._curve.setControlPoint(0, this._tx.globalPos.clone());\n this._started = true;\n }\n this._currentMs -= elapsed;\n const t = (0,_Math__WEBPACK_IMPORTED_MODULE_4__.clamp)((0,_Math__WEBPACK_IMPORTED_MODULE_5__.remap)(0, this._durationMs, 0, 1, this._durationMs - this._currentMs), 0, 1);\n if (this._mode === 'dynamic') {\n this._tx.pos = this._curve.getPoint(t);\n }\n else {\n this._tx.pos = this._curve.getUniformPoint(t);\n }\n if (this.isComplete(this._entity)) {\n if (this._mode === 'dynamic') {\n this._tx.pos = this._curve.getPoint(1);\n }\n else {\n this._tx.pos = this._curve.getUniformPoint(1);\n }\n }\n }\n isComplete(entity) {\n return this._stopped || this._currentMs < 0;\n }\n reset() {\n this._currentMs = this._durationMs;\n this._started = false;\n this._stopped = false;\n }\n stop() {\n this._stopped = true;\n this._currentMs = 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/Delay.ts\":\n/*!*********************************!*\\\n !*** ./Actions/Action/Delay.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Delay: () => (/* binding */ Delay)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\nclass Delay {\n constructor(duration) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._elapsedTime = 0;\n this._started = false;\n this._stopped = false;\n this._delay = duration;\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n }\n this._elapsedTime += elapsed;\n }\n isComplete() {\n return this._stopped || this._elapsedTime >= this._delay;\n }\n stop() {\n this._stopped = true;\n }\n reset() {\n this._elapsedTime = 0;\n this._started = false;\n this._stopped = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/Die.ts\":\n/*!*******************************!*\\\n !*** ./Actions/Action/Die.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Die: () => (/* binding */ Die)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _ActionsComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ActionsComponent */ \"./Actions/ActionsComponent.ts\");\n\n\nclass Die {\n constructor(entity) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._stopped = false;\n this._entity = entity;\n }\n update(elapsed) {\n this._entity.get(_ActionsComponent__WEBPACK_IMPORTED_MODULE_1__.ActionsComponent).clearActions();\n this._entity.kill();\n this._stopped = true;\n }\n isComplete() {\n return this._stopped;\n }\n stop() {\n return;\n }\n reset() {\n return;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/EaseBy.ts\":\n/*!**********************************!*\\\n !*** ./Actions/Action/EaseBy.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EaseBy: () => (/* binding */ EaseBy)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\n\n/**\n * @deprecated use moveBy({offset: Vector, duration: number, easing: EasingFunction})\n */\nclass EaseBy {\n constructor(entity, offsetX, offsetY, duration, easingFcn) {\n this.easingFcn = easingFcn;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._currentLerpTime = 0;\n this._lerpDuration = 1 * 1000; // 1 second\n this._lerpStart = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(0, 0);\n this._lerpEnd = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(0, 0);\n this._initialized = false;\n this._stopped = false;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__.MotionComponent);\n this._lerpDuration = duration;\n this._offset = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(offsetX, offsetY);\n }\n _initialize() {\n this._lerpStart = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this._tx.pos.x, this._tx.pos.y);\n this._currentLerpTime = 0;\n this._lerpEnd = this._lerpStart.add(this._offset);\n }\n update(elapsed) {\n if (!this._initialized) {\n this._initialize();\n this._initialized = true;\n }\n // Need to update lerp time first, otherwise the first update will always be zero\n this._currentLerpTime += elapsed;\n let newX = this._tx.pos.x;\n let newY = this._tx.pos.y;\n if (this._currentLerpTime < this._lerpDuration) {\n if (this._lerpEnd.x < this._lerpStart.x) {\n newX =\n this._lerpStart.x -\n (this.easingFcn(this._currentLerpTime, this._lerpEnd.x, this._lerpStart.x, this._lerpDuration) - this._lerpEnd.x);\n }\n else {\n newX = this.easingFcn(this._currentLerpTime, this._lerpStart.x, this._lerpEnd.x, this._lerpDuration);\n }\n if (this._lerpEnd.y < this._lerpStart.y) {\n newY =\n this._lerpStart.y -\n (this.easingFcn(this._currentLerpTime, this._lerpEnd.y, this._lerpStart.y, this._lerpDuration) - this._lerpEnd.y);\n }\n else {\n newY = this.easingFcn(this._currentLerpTime, this._lerpStart.y, this._lerpEnd.y, this._lerpDuration);\n }\n // Given the lerp position figure out the velocity in pixels per second\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)((newX - this._tx.pos.x) / (elapsed / 1000), (newY - this._tx.pos.y) / (elapsed / 1000));\n }\n else {\n this._tx.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(this._lerpEnd.x, this._lerpEnd.y);\n this._motion.vel = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n }\n }\n isComplete() {\n return this._stopped || this._currentLerpTime >= this._lerpDuration;\n }\n reset() {\n this._initialized = false;\n this._stopped = false;\n this._currentLerpTime = 0;\n }\n stop() {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0);\n this._stopped = true;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/EaseTo.ts\":\n/*!**********************************!*\\\n !*** ./Actions/Action/EaseTo.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EaseTo: () => (/* binding */ EaseTo)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\n\n/**\n * @deprecated use moveTo({pos: Vector, duration: number, easing: EasingFunction})\n */\nclass EaseTo {\n constructor(entity, x, y, duration, easingFcn) {\n this.easingFcn = easingFcn;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._currentLerpTime = 0;\n this._lerpDuration = 1 * 1000; // 1 second\n this._lerpStart = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(0, 0);\n this._lerpEnd = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(0, 0);\n this._initialized = false;\n this._stopped = false;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__.MotionComponent);\n this._lerpDuration = duration;\n this._lerpEnd = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(x, y);\n }\n _initialize() {\n this._lerpStart = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this._tx.pos.x, this._tx.pos.y);\n this._currentLerpTime = 0;\n }\n update(elapsed) {\n if (!this._initialized) {\n this._initialize();\n this._initialized = true;\n }\n // Need to update lerp time first, otherwise the first update will always be zero\n this._currentLerpTime += elapsed;\n let newX = this._tx.pos.x;\n let newY = this._tx.pos.y;\n if (this._currentLerpTime < this._lerpDuration) {\n if (this._lerpEnd.x < this._lerpStart.x) {\n newX =\n this._lerpStart.x -\n (this.easingFcn(this._currentLerpTime, this._lerpEnd.x, this._lerpStart.x, this._lerpDuration) - this._lerpEnd.x);\n }\n else {\n newX = this.easingFcn(this._currentLerpTime, this._lerpStart.x, this._lerpEnd.x, this._lerpDuration);\n }\n if (this._lerpEnd.y < this._lerpStart.y) {\n newY =\n this._lerpStart.y -\n (this.easingFcn(this._currentLerpTime, this._lerpEnd.y, this._lerpStart.y, this._lerpDuration) - this._lerpEnd.y);\n }\n else {\n newY = this.easingFcn(this._currentLerpTime, this._lerpStart.y, this._lerpEnd.y, this._lerpDuration);\n }\n // Given the lerp position figure out the velocity in pixels per second\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)((newX - this._tx.pos.x) / (elapsed / 1000), (newY - this._tx.pos.y) / (elapsed / 1000));\n }\n else {\n this._tx.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(this._lerpEnd.x, this._lerpEnd.y);\n this._motion.vel = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n }\n }\n isComplete() {\n return this._stopped || this._currentLerpTime >= this._lerpDuration;\n }\n reset() {\n this._initialized = false;\n this._stopped = false;\n this._currentLerpTime = 0;\n }\n stop() {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0);\n this._stopped = true;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/Fade.ts\":\n/*!********************************!*\\\n !*** ./Actions/Action/Fade.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Fade: () => (/* binding */ Fade)\n/* harmony export */ });\n/* harmony import */ var _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Graphics/GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\nclass Fade {\n constructor(entity, endOpacity, duration) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._multiplier = 1;\n this._started = false;\n this._stopped = false;\n this._graphics = entity.get(_Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_1__.GraphicsComponent);\n this._endOpacity = endOpacity;\n this._remainingTime = this._originalTime = duration;\n }\n update(elapsed) {\n if (!this._graphics) {\n return;\n }\n if (!this._started) {\n this._started = true;\n this._remainingTime = this._originalTime;\n // determine direction when we start\n if (this._endOpacity < this._graphics.opacity) {\n this._multiplier = -1;\n }\n else {\n this._multiplier = 1;\n }\n }\n if (this._remainingTime > 0) {\n this._graphics.opacity += (this._multiplier * (Math.abs(this._graphics.opacity - this._endOpacity) * elapsed)) / this._remainingTime;\n }\n this._remainingTime -= elapsed;\n if (this.isComplete()) {\n this._graphics.opacity = this._endOpacity;\n }\n _Util_Log__WEBPACK_IMPORTED_MODULE_2__.Logger.getInstance().debug('[Action fade] Actor opacity:', this._graphics.opacity);\n }\n isComplete() {\n return this._stopped || this._remainingTime <= 0;\n }\n stop() {\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n this._remainingTime = this._originalTime;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/Flash.ts\":\n/*!*********************************!*\\\n !*** ./Actions/Action/Flash.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Flash: () => (/* binding */ Flash)\n/* harmony export */ });\n/* harmony import */ var _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Graphics/GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\nclass Flash {\n constructor(entity, color, duration = 1000) {\n var _a;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._stopped = false;\n this._started = false;\n this._total = 0;\n this._currentDuration = 0;\n this._graphics = entity.get(_Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_1__.GraphicsComponent);\n this._duration = duration;\n this._entity = entity;\n this._material = (_a = entity.scene) === null || _a === void 0 ? void 0 : _a.engine.graphicsContext.createMaterial({\n name: 'flash-material',\n color,\n fragmentSource: `#version 300 es\r\n \r\n precision mediump float;\r\n uniform float u_blend;\r\n uniform sampler2D u_graphic;\r\n uniform vec4 u_color;\r\n \r\n in vec2 v_uv; \r\n out vec4 color;\r\n \r\n void main() { \r\n vec4 textureColor = texture(u_graphic, v_uv); \r\n color = mix(textureColor, u_color, u_blend * textureColor.a);\r\n color.rgb = color.rgb * color.a;\r\n }`\n });\n this._total = duration;\n }\n update(elapsed) {\n var _a;\n if (!this._started) {\n this._started = true;\n this._total = this._duration;\n this._currentDuration = this._duration;\n this._entity.graphics.material = this._material;\n }\n if (!this._graphics) {\n return;\n }\n this._currentDuration -= elapsed;\n if (this._graphics) {\n (_a = this._material) === null || _a === void 0 ? void 0 : _a.update((shader) => {\n shader.trySetUniformFloat('u_blend', this._currentDuration / this._total);\n });\n }\n if (this.isComplete()) {\n this._entity.graphics.material = null;\n }\n }\n isComplete() {\n return this._stopped || this._currentDuration <= 0;\n }\n stop() {\n if (this._graphics) {\n this._graphics.isVisible = true;\n }\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/Follow.ts\":\n/*!**********************************!*\\\n !*** ./Actions/Action/Follow.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Follow: () => (/* binding */ Follow)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\n\nclass Follow {\n constructor(entity, entityToFollow, followDistance) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n this._followTx = entityToFollow.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._followMotion = entityToFollow.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n this._current = new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(this._tx.pos.x, this._tx.pos.y);\n this._end = new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(this._followTx.pos.x, this._followTx.pos.y);\n this._maximumDistance = followDistance !== undefined ? followDistance : this._current.distance(this._end);\n this._speed = 0;\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._distanceBetween = this._current.distance(this._end);\n this._dir = this._end.sub(this._current).normalize();\n }\n const actorToFollowSpeed = Math.sqrt(Math.pow(this._followMotion.vel.x, 2) + Math.pow(this._followMotion.vel.y, 2));\n if (actorToFollowSpeed !== 0) {\n this._speed = actorToFollowSpeed;\n }\n this._current = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this._tx.pos.x, this._tx.pos.y);\n this._end = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this._followTx.pos.x, this._followTx.pos.y);\n this._distanceBetween = this._current.distance(this._end);\n this._dir = this._end.sub(this._current).normalize();\n if (this._distanceBetween >= this._maximumDistance) {\n const m = this._dir.scale(this._speed);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(m.x, m.y);\n }\n else {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(0, 0);\n }\n if (this.isComplete()) {\n this._tx.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this._end.x, this._end.y);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(0, 0);\n }\n }\n stop() {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(0, 0);\n this._stopped = true;\n }\n isComplete() {\n // the actor following should never stop unless specified to do so\n return this._stopped;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/Meet.ts\":\n/*!********************************!*\\\n !*** ./Actions/Action/Meet.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Meet: () => (/* binding */ Meet)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\n\nclass Meet {\n constructor(actor, actorToMeet, speed) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._speedWasSpecified = false;\n this._tx = actor.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._motion = actor.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n this._meetTx = actorToMeet.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._meetMotion = actorToMeet.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n this._current = new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(this._tx.pos.x, this._tx.pos.y);\n this._end = new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(this._meetTx.pos.x, this._meetTx.pos.y);\n this._speed = speed || 0;\n if (speed !== undefined) {\n this._speedWasSpecified = true;\n }\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._distanceBetween = this._current.distance(this._end);\n this._dir = this._end.sub(this._current).normalize();\n }\n const actorToMeetSpeed = Math.sqrt(Math.pow(this._meetMotion.vel.x, 2) + Math.pow(this._meetMotion.vel.y, 2));\n if (actorToMeetSpeed !== 0 && !this._speedWasSpecified) {\n this._speed = actorToMeetSpeed;\n }\n this._current = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this._tx.pos.x, this._tx.pos.y);\n this._end = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this._meetTx.pos.x, this._meetTx.pos.y);\n this._distanceBetween = this._current.distance(this._end);\n this._dir = this._end.sub(this._current).normalize();\n const m = this._dir.scale(this._speed);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(m.x, m.y);\n if (this.isComplete()) {\n this._tx.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this._end.x, this._end.y);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(0, 0);\n }\n }\n isComplete() {\n return this._stopped || this._distanceBetween <= 1;\n }\n stop() {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(0, 0);\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n this._distanceBetween = Infinity;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/MoveBy.ts\":\n/*!**********************************!*\\\n !*** ./Actions/Action/MoveBy.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MoveBy: () => (/* binding */ MoveBy),\n/* harmony export */ MoveByWithOptions: () => (/* binding */ MoveByWithOptions),\n/* harmony export */ isMoveByOptions: () => (/* binding */ isMoveByOptions)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math */ \"./Math/util.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../Math */ \"./Math/lerp.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Util/EasingFunctions */ \"./Util/EasingFunctions.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\n\n\n\n\n/**\n *\n */\nfunction isMoveByOptions(x) {\n return x.offset instanceof _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector && typeof x.duration === 'number';\n}\nclass MoveByWithOptions {\n constructor(entity, options) {\n var _a;\n this.entity = entity;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_1__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._easing = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_2__.EasingFunctions.Linear;\n this._offset = options.offset;\n this._easing = (_a = options.easing) !== null && _a !== void 0 ? _a : this._easing;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_4__.MotionComponent);\n if (!this._tx) {\n throw new Error(`Entity ${entity.name} has no TransformComponent, can only MoveBy on Entities with TransformComponents.`);\n }\n this._durationMs = options.duration;\n this._currentMs = this._durationMs;\n }\n update(elapsed) {\n if (!this._started) {\n this._start = this._tx.pos.clone();\n this._end = this._start.add(this._offset);\n this._started = true;\n }\n this._currentMs -= elapsed;\n const t = (0,_Math__WEBPACK_IMPORTED_MODULE_5__.clamp)((0,_Math__WEBPACK_IMPORTED_MODULE_6__.remap)(0, this._durationMs, 0, 1, this._durationMs - this._currentMs), 0, 1);\n const currentPos = this._tx.pos;\n const newPosX = this._easing(t, this._start.x, this._end.x, 1);\n const newPosY = this._easing(t, this._start.y, this._end.y, 1);\n const velX = (newPosX - currentPos.x) / (elapsed / 1000);\n const velY = (newPosY - currentPos.y) / (elapsed / 1000);\n this._motion.vel.x = velX;\n this._motion.vel.y = velY;\n if (this.isComplete(this.entity)) {\n this._tx.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this._end.x, this._end.y);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n }\n }\n isComplete(entity) {\n return this._stopped || this._currentMs < 0;\n }\n stop() {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n this._stopped = true;\n this._currentMs = 0;\n }\n reset() {\n this._currentMs = this._durationMs;\n this._started = false;\n this._stopped = false;\n }\n}\nclass MoveBy {\n constructor(entity, offsetX, offsetY, speed) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_1__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._entity = entity;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_4__.MotionComponent);\n this._speed = speed;\n this._offset = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(offsetX, offsetY);\n if (speed <= 0) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_7__.Logger.getInstance().error('Attempted to moveBy with speed less than or equal to zero : ' + speed);\n throw new Error('Speed must be greater than 0 pixels per second');\n }\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._start = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(this._tx.pos.x, this._tx.pos.y);\n this._end = this._start.add(this._offset);\n this._distance = this._offset.magnitude;\n this._dir = this._end.sub(this._start).normalize();\n }\n if (this.isComplete(this._entity)) {\n this._tx.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this._end.x, this._end.y);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n }\n else {\n this._motion.vel = this._dir.scale(this._speed);\n }\n }\n isComplete(entity) {\n const tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__.TransformComponent);\n return this._stopped || tx.pos.distance(this._start) >= this._distance;\n }\n stop() {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/MoveTo.ts\":\n/*!**********************************!*\\\n !*** ./Actions/Action/MoveTo.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MoveTo: () => (/* binding */ MoveTo),\n/* harmony export */ MoveToWithOptions: () => (/* binding */ MoveToWithOptions),\n/* harmony export */ isMoveToOptions: () => (/* binding */ isMoveToOptions)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math */ \"./Math/util.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../Math */ \"./Math/lerp.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Util/EasingFunctions */ \"./Util/EasingFunctions.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\n\n\n\n/**\n *\n */\nfunction isMoveToOptions(x) {\n return x.pos instanceof _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector && typeof x.duration === 'number';\n}\nclass MoveToWithOptions {\n constructor(entity, options) {\n var _a;\n this.entity = entity;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_1__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._easing = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_2__.EasingFunctions.Linear;\n this._end = options.pos;\n this._easing = (_a = options.easing) !== null && _a !== void 0 ? _a : this._easing;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_4__.MotionComponent);\n if (!this._tx) {\n throw new Error(`Entity ${entity.name} has no TransformComponent, can only moveTo on Entities with TransformComponents.`);\n }\n this._durationMs = options.duration;\n this._currentMs = this._durationMs;\n }\n update(elapsed) {\n if (!this._started) {\n this._start = this._tx.pos.clone();\n this._started = true;\n }\n this._currentMs -= elapsed;\n const t = (0,_Math__WEBPACK_IMPORTED_MODULE_5__.clamp)((0,_Math__WEBPACK_IMPORTED_MODULE_6__.remap)(0, this._durationMs, 0, 1, this._durationMs - this._currentMs), 0, 1);\n const currentPos = this._tx.pos;\n const newPosX = this._easing(t, this._start.x, this._end.x, 1);\n const newPosY = this._easing(t, this._start.y, this._end.y, 1);\n const velX = (newPosX - currentPos.x) / (elapsed / 1000);\n const velY = (newPosY - currentPos.y) / (elapsed / 1000);\n this._motion.vel.x = velX;\n this._motion.vel.y = velY;\n if (this.isComplete(this.entity)) {\n this._tx.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this._end.x, this._end.y);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n }\n }\n isComplete(entity) {\n return this._stopped || this._currentMs < 0;\n }\n stop() {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n this._stopped = true;\n this._currentMs = 0;\n }\n reset() {\n this._currentMs = this._durationMs;\n this._started = false;\n this._stopped = false;\n }\n}\nclass MoveTo {\n constructor(entity, destX, destY, speed) {\n this.entity = entity;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_1__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_4__.MotionComponent);\n this._end = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(destX, destY);\n this._speed = speed;\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._start = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(this._tx.pos.x, this._tx.pos.y);\n this._distance = this._start.distance(this._end);\n this._dir = this._end.sub(this._start).normalize();\n }\n const m = this._dir.scale(this._speed);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(m.x, m.y);\n if (this.isComplete(this.entity)) {\n this._tx.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this._end.x, this._end.y);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n }\n }\n isComplete(entity) {\n const tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__.TransformComponent);\n return this._stopped || new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(tx.pos.x, tx.pos.y).distance(this._start) >= this._distance;\n }\n stop() {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/ParallelActions.ts\":\n/*!*******************************************!*\\\n !*** ./Actions/Action/ParallelActions.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ParallelActions: () => (/* binding */ ParallelActions)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n/**\n * Action that can run multiple {@apilink Action}s or {@apilink ActionSequence}s at the same time\n */\nclass ParallelActions {\n constructor(parallelActions) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._actions = parallelActions;\n }\n update(elapsed) {\n for (let i = 0; i < this._actions.length; i++) {\n this._actions[i].update(elapsed);\n }\n }\n isComplete(entity) {\n return this._actions.every((a) => a.isComplete(entity));\n }\n reset() {\n this._actions.forEach((a) => a.reset());\n }\n stop() {\n this._actions.forEach((a) => a.stop());\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/Repeat.ts\":\n/*!**********************************!*\\\n !*** ./Actions/Action/Repeat.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Repeat: () => (/* binding */ Repeat)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _ActionContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ActionContext */ \"./Actions/ActionContext.ts\");\n\n\nclass Repeat {\n constructor(entity, repeatBuilder, repeat) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._stopped = false;\n this._repeatBuilder = repeatBuilder;\n this._repeatContext = new _ActionContext__WEBPACK_IMPORTED_MODULE_1__.ActionContext(entity);\n this._actionQueue = this._repeatContext.getQueue();\n this._repeat = repeat;\n this._originalRepeat = repeat;\n this._repeatBuilder(this._repeatContext);\n this._repeat--; // current execution is the first repeat\n }\n update(elapsed) {\n if (this._actionQueue.isComplete()) {\n this._actionQueue.clearActions();\n this._repeatBuilder(this._repeatContext);\n this._repeat--;\n }\n this._actionQueue.update(elapsed);\n }\n isComplete() {\n return this._stopped || (this._repeat <= 0 && this._actionQueue.isComplete());\n }\n stop() {\n this._stopped = true;\n }\n reset() {\n this._repeat = this._originalRepeat;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/RepeatForever.ts\":\n/*!*****************************************!*\\\n !*** ./Actions/Action/RepeatForever.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RepeatForever: () => (/* binding */ RepeatForever)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _ActionContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ActionContext */ \"./Actions/ActionContext.ts\");\n\n\n/**\n * RepeatForever Action implementation, it is recommended you use the fluent action\n * context API.\n *\n *\n */\nclass RepeatForever {\n constructor(entity, repeatBuilder) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._stopped = false;\n this._repeatBuilder = repeatBuilder;\n this._repeatContext = new _ActionContext__WEBPACK_IMPORTED_MODULE_1__.ActionContext(entity);\n this._actionQueue = this._repeatContext.getQueue();\n this._repeatBuilder(this._repeatContext);\n }\n update(elapsed) {\n if (this._stopped) {\n return;\n }\n if (this._actionQueue.isComplete()) {\n this._actionQueue.clearActions();\n this._repeatBuilder(this._repeatContext);\n }\n this._actionQueue.update(elapsed);\n }\n isComplete() {\n return this._stopped;\n }\n stop() {\n this._stopped = true;\n this._actionQueue.clearActions();\n }\n reset() {\n return;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/RotateBy.ts\":\n/*!************************************!*\\\n !*** ./Actions/Action/RotateBy.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RotateBy: () => (/* binding */ RotateBy),\n/* harmony export */ RotateByWithOptions: () => (/* binding */ RotateByWithOptions),\n/* harmony export */ isRotateByOptions: () => (/* binding */ isRotateByOptions)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math */ \"./Math/rotation-type.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math */ \"./Math/lerp.ts\");\n\n\n\n\n\n/**\n *\n */\nfunction isRotateByOptions(x) {\n return typeof x.angleRadiansOffset === 'number' && typeof x.duration === 'number';\n}\nclass RotateByWithOptions {\n constructor(entity, options) {\n var _a;\n this.entity = entity;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._offset = 0;\n this._startAngle = 0;\n this._endAngle = 0;\n this._offset = options.angleRadiansOffset;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n if (!this._tx) {\n throw new Error(`Entity ${entity.name} has no TransformComponent, can only RotateBy on Entities with TransformComponents.`);\n }\n this._durationMs = options.duration;\n this._rotationType = (_a = options.rotationType) !== null && _a !== void 0 ? _a : _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.ShortestPath;\n this._currentMs = this._durationMs;\n }\n update(elapsed) {\n if (!this._started) {\n this._startAngle = this._tx.rotation;\n this._endAngle = (0,_Math_util__WEBPACK_IMPORTED_MODULE_4__.canonicalizeAngle)(this._startAngle + this._offset);\n this._started = true;\n }\n this._currentMs -= elapsed;\n const t = (0,_Math_util__WEBPACK_IMPORTED_MODULE_4__.clamp)((0,_Math__WEBPACK_IMPORTED_MODULE_5__.remap)(0, this._durationMs, 0, 1, this._durationMs - this._currentMs), 0, 1);\n const newAngle = (0,_Math__WEBPACK_IMPORTED_MODULE_5__.lerpAngle)(this._startAngle, this._endAngle, this._rotationType, t);\n const currentAngle = this._tx.rotation;\n const rx = (newAngle - currentAngle) / (elapsed / 1000);\n this._motion.angularVelocity = rx;\n if (this.isComplete()) {\n this._tx.rotation = this._endAngle;\n this._motion.angularVelocity = 0;\n }\n }\n isComplete() {\n return this._stopped || this._currentMs < 0;\n }\n stop() {\n this._motion.angularVelocity = 0;\n this._stopped = true;\n this._currentMs = 0;\n }\n reset() {\n this._currentMs = this._durationMs;\n this._started = false;\n this._stopped = false;\n }\n}\nclass RotateBy {\n constructor(entity, angleRadiansOffset, speed, rotationType) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n this._speed = speed;\n this._offset = angleRadiansOffset;\n this._rotationType = rotationType || _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.ShortestPath;\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._start = this._tx.rotation;\n this._currentNonCannonAngle = this._tx.rotation;\n this._end = this._start + this._offset;\n const distance1 = Math.abs(this._end - this._start);\n const distance2 = _Math_util__WEBPACK_IMPORTED_MODULE_4__.TwoPI - distance1;\n if (distance1 > distance2) {\n this._shortDistance = distance2;\n this._longDistance = distance1;\n }\n else {\n this._shortDistance = distance1;\n this._longDistance = distance2;\n }\n this._shortestPathIsPositive = (this._start - this._end + _Math_util__WEBPACK_IMPORTED_MODULE_4__.TwoPI) % _Math_util__WEBPACK_IMPORTED_MODULE_4__.TwoPI >= Math.PI;\n switch (this._rotationType) {\n case _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.ShortestPath:\n this._distance = this._shortDistance;\n if (this._shortestPathIsPositive) {\n this._direction = 1;\n }\n else {\n this._direction = -1;\n }\n break;\n case _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.LongestPath:\n this._distance = this._longDistance;\n if (this._shortestPathIsPositive) {\n this._direction = -1;\n }\n else {\n this._direction = 1;\n }\n break;\n case _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.Clockwise:\n this._direction = 1;\n if (this._shortDistance >= 0) {\n this._distance = this._shortDistance;\n }\n else {\n this._distance = this._longDistance;\n }\n break;\n case _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.CounterClockwise:\n this._direction = -1;\n if (this._shortDistance <= 0) {\n this._distance = this._shortDistance;\n }\n else {\n this._distance = this._longDistance;\n }\n break;\n }\n }\n this._motion.angularVelocity = this._direction * this._speed;\n this._currentNonCannonAngle += this._direction * this._speed * (elapsed / 1000);\n if (this.isComplete()) {\n this._tx.rotation = this._end;\n this._motion.angularVelocity = 0;\n this._stopped = true;\n }\n }\n isComplete() {\n const distanceTraveled = Math.abs(this._currentNonCannonAngle - this._start);\n return this._stopped || distanceTraveled >= Math.abs(this._distance);\n }\n stop() {\n this._motion.angularVelocity = 0;\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n this._start = undefined;\n this._currentNonCannonAngle = undefined;\n this._distance = undefined;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/RotateTo.ts\":\n/*!************************************!*\\\n !*** ./Actions/Action/RotateTo.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RotateTo: () => (/* binding */ RotateTo),\n/* harmony export */ RotateToWithOptions: () => (/* binding */ RotateToWithOptions),\n/* harmony export */ isRotateToOptions: () => (/* binding */ isRotateToOptions)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math */ \"./Math/rotation-type.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math */ \"./Math/lerp.ts\");\n\n\n\n\n\n\n/**\n *\n */\nfunction isRotateToOptions(x) {\n return typeof x.angle === 'number' && typeof x.duration === 'number';\n}\nclass RotateToWithOptions {\n constructor(entity, options) {\n var _a;\n this.entity = entity;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._endAngle = 0;\n this._startAngle = 0;\n this._endAngle = options.angle;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n if (!this._tx) {\n throw new Error(`Entity ${entity.name} has no TransformComponent, can only RotateTo on Entities with TransformComponents.`);\n }\n this._durationMs = options.duration;\n this._rotationType = (_a = options.rotationType) !== null && _a !== void 0 ? _a : _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.ShortestPath;\n this._currentMs = this._durationMs;\n }\n update(elapsed) {\n if (!this._started) {\n this._startAngle = this._tx.rotation;\n this._started = true;\n }\n this._currentMs -= elapsed;\n const t = (0,_Math_util__WEBPACK_IMPORTED_MODULE_4__.clamp)((0,_Math__WEBPACK_IMPORTED_MODULE_5__.remap)(0, this._durationMs, 0, 1, this._durationMs - this._currentMs), 0, 1);\n const newAngle = (0,_Math__WEBPACK_IMPORTED_MODULE_5__.lerpAngle)(this._startAngle, this._endAngle, this._rotationType, t);\n const currentAngle = this._tx.rotation;\n const rx = (newAngle - currentAngle) / (elapsed / 1000);\n this._motion.angularVelocity = rx;\n if (this.isComplete(this.entity)) {\n this._tx.rotation = this._endAngle;\n this._motion.angularVelocity = 0;\n }\n }\n isComplete(entity) {\n return this._stopped || this._currentMs < 0;\n }\n stop() {\n this._motion.angularVelocity = 0;\n this._stopped = true;\n this._currentMs = 0;\n }\n reset() {\n this._currentMs = this._durationMs;\n this._started = false;\n this._stopped = false;\n }\n}\nclass RotateTo {\n constructor(entity, angle, speed, rotationType) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n this._end = angle;\n this._speed = speed;\n this._rotationType = rotationType || _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.ShortestPath;\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._start = this._tx.rotation;\n this._currentNonCannonAngle = this._tx.rotation;\n const distance1 = Math.abs(this._end - this._start);\n const distance2 = _Math_util__WEBPACK_IMPORTED_MODULE_4__.TwoPI - distance1;\n if (distance1 > distance2) {\n this._shortDistance = distance2;\n this._longDistance = distance1;\n }\n else {\n this._shortDistance = distance1;\n this._longDistance = distance2;\n }\n this._shortestPathIsPositive = (this._start - this._end + _Math_util__WEBPACK_IMPORTED_MODULE_4__.TwoPI) % _Math_util__WEBPACK_IMPORTED_MODULE_4__.TwoPI >= Math.PI;\n switch (this._rotationType) {\n case _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.ShortestPath:\n this._distance = this._shortDistance;\n if (this._shortestPathIsPositive) {\n this._direction = 1;\n }\n else {\n this._direction = -1;\n }\n break;\n case _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.LongestPath:\n this._distance = this._longDistance;\n if (this._shortestPathIsPositive) {\n this._direction = -1;\n }\n else {\n this._direction = 1;\n }\n break;\n case _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.Clockwise:\n this._direction = 1;\n if (this._shortestPathIsPositive) {\n this._distance = this._shortDistance;\n }\n else {\n this._distance = this._longDistance;\n }\n break;\n case _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.CounterClockwise:\n this._direction = -1;\n if (!this._shortestPathIsPositive) {\n this._distance = this._shortDistance;\n }\n else {\n this._distance = this._longDistance;\n }\n break;\n }\n }\n this._motion.angularVelocity = this._direction * this._speed;\n this._currentNonCannonAngle += this._direction * this._speed * (elapsed / 1000);\n if (this.isComplete()) {\n this._tx.rotation = this._end;\n this._motion.angularVelocity = 0;\n this._stopped = true;\n }\n }\n isComplete() {\n const distanceTraveled = Math.abs(this._currentNonCannonAngle - this._start);\n return this._stopped || distanceTraveled >= Math.abs(this._distance);\n }\n stop() {\n this._motion.angularVelocity = 0;\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/ScaleBy.ts\":\n/*!***********************************!*\\\n !*** ./Actions/Action/ScaleBy.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ScaleBy: () => (/* binding */ ScaleBy),\n/* harmony export */ ScaleByWithOptions: () => (/* binding */ ScaleByWithOptions),\n/* harmony export */ isScaleByOptions: () => (/* binding */ isScaleByOptions)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Math */ \"./Math/util.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math */ \"./Math/lerp.ts\");\n\n\n\n\n\n/**\n *\n */\nfunction isScaleByOptions(x) {\n return typeof x.scaleOffset === 'object' && typeof x.duration === 'number';\n}\nclass ScaleByWithOptions {\n constructor(entity, options) {\n this.entity = entity;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._endScale = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(1, 1);\n this._scaleOffset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0);\n this._startScale = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(1, 1);\n this._scaleOffset = options.scaleOffset;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__.MotionComponent);\n if (!this._tx) {\n throw new Error(`Entity ${entity.name} has no TransformComponent, can only ScaleBy on Entities with TransformComponents.`);\n }\n this._durationMs = options.duration;\n this._currentMs = this._durationMs;\n }\n update(elapsed) {\n if (!this._started) {\n this._startScale = this._tx.scale;\n this._endScale = this._startScale.add(this._scaleOffset);\n this._started = true;\n }\n this._currentMs -= elapsed;\n const t = (0,_Math__WEBPACK_IMPORTED_MODULE_4__.clamp)((0,_Math__WEBPACK_IMPORTED_MODULE_5__.remap)(0, this._durationMs, 0, 1, this._durationMs - this._currentMs), 0, 1);\n const newScale = (0,_Math__WEBPACK_IMPORTED_MODULE_5__.lerpVector)(this._startScale, this._endScale, t);\n const currentScale = this._tx.scale;\n const sx = newScale.sub(currentScale).scale(1 / (elapsed / 1000));\n this._motion.scaleFactor = sx;\n if (this.isComplete()) {\n this._tx.scale = this._endScale;\n this._motion.angularVelocity = 0;\n }\n }\n isComplete() {\n return this._stopped || this._currentMs < 0;\n }\n stop() {\n this._motion.scaleFactor = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n this._stopped = true;\n this._currentMs = 0;\n }\n reset() {\n this._currentMs = this._durationMs;\n this._started = false;\n this._stopped = false;\n }\n}\nclass ScaleBy {\n constructor(entity, scaleOffsetX, scaleOffsetY, speed) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__.MotionComponent);\n this._offset = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(scaleOffsetX, scaleOffsetY);\n this._speedX = this._speedY = speed;\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._startScale = this._tx.scale.clone();\n this._endScale = this._startScale.add(this._offset);\n this._distanceX = Math.abs(this._endScale.x - this._startScale.x);\n this._distanceY = Math.abs(this._endScale.y - this._startScale.y);\n this._directionX = this._endScale.x < this._startScale.x ? -1 : 1;\n this._directionY = this._endScale.y < this._startScale.y ? -1 : 1;\n }\n this._motion.scaleFactor.x = this._speedX * this._directionX;\n this._motion.scaleFactor.y = this._speedY * this._directionY;\n if (this.isComplete()) {\n this._tx.scale = this._endScale;\n this._motion.scaleFactor.x = 0;\n this._motion.scaleFactor.y = 0;\n }\n }\n isComplete() {\n return (this._stopped ||\n (Math.abs(this._tx.scale.x - this._startScale.x) >= this._distanceX - 0.01 &&\n Math.abs(this._tx.scale.y - this._startScale.y) >= this._distanceY - 0.01));\n }\n stop() {\n this._motion.scaleFactor.x = 0;\n this._motion.scaleFactor.y = 0;\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/ScaleTo.ts\":\n/*!***********************************!*\\\n !*** ./Actions/Action/ScaleTo.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ScaleTo: () => (/* binding */ ScaleTo),\n/* harmony export */ ScaleToWithOptions: () => (/* binding */ ScaleToWithOptions),\n/* harmony export */ isScaleToOptions: () => (/* binding */ isScaleToOptions)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Math */ \"./Math/util.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math */ \"./Math/lerp.ts\");\n\n\n\n\n\n/**\n *\n */\nfunction isScaleToOptions(x) {\n return typeof x.scale === 'object' && typeof x.duration === 'number';\n}\nclass ScaleToWithOptions {\n constructor(entity, options) {\n this.entity = entity;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._endScale = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(1, 1);\n this._startScale = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(1, 1);\n this._endScale = options.scale;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__.MotionComponent);\n if (!this._tx) {\n throw new Error(`Entity ${entity.name} has no TransformComponent, can only ScaleTo on Entities with TransformComponents.`);\n }\n this._durationMs = options.duration;\n this._currentMs = this._durationMs;\n }\n update(elapsed) {\n if (!this._started) {\n this._startScale = this._tx.scale;\n this._started = true;\n }\n this._currentMs -= elapsed;\n const t = (0,_Math__WEBPACK_IMPORTED_MODULE_4__.clamp)((0,_Math__WEBPACK_IMPORTED_MODULE_5__.remap)(0, this._durationMs, 0, 1, this._durationMs - this._currentMs), 0, 1);\n const newScale = (0,_Math__WEBPACK_IMPORTED_MODULE_5__.lerpVector)(this._startScale, this._endScale, t);\n const currentScale = this._tx.scale;\n const sx = newScale.sub(currentScale).scale(1 / (elapsed / 1000));\n this._motion.scaleFactor = sx;\n if (this.isComplete()) {\n this._tx.scale = this._endScale;\n this._motion.angularVelocity = 0;\n }\n }\n isComplete() {\n return this._stopped || this._currentMs < 0;\n }\n stop() {\n this._motion.scaleFactor = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n this._stopped = true;\n this._currentMs = 0;\n }\n reset() {\n this._currentMs = this._durationMs;\n this._started = false;\n this._stopped = false;\n }\n}\nclass ScaleTo {\n constructor(entity, scaleX, scaleY, speedX, speedY) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__.MotionComponent);\n this._endX = scaleX;\n this._endY = scaleY;\n this._speedX = speedX;\n this._speedY = speedY;\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._startX = this._tx.scale.x;\n this._startY = this._tx.scale.y;\n this._distanceX = Math.abs(this._endX - this._startX);\n this._distanceY = Math.abs(this._endY - this._startY);\n }\n if (!(Math.abs(this._tx.scale.x - this._startX) >= this._distanceX)) {\n const directionX = this._endY < this._startY ? -1 : 1;\n this._motion.scaleFactor.x = this._speedX * directionX;\n }\n else {\n this._motion.scaleFactor.x = 0;\n }\n if (!(Math.abs(this._tx.scale.y - this._startY) >= this._distanceY)) {\n const directionY = this._endY < this._startY ? -1 : 1;\n this._motion.scaleFactor.y = this._speedY * directionY;\n }\n else {\n this._motion.scaleFactor.y = 0;\n }\n if (this.isComplete()) {\n this._tx.scale = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(this._endX, this._endY);\n this._motion.scaleFactor.x = 0;\n this._motion.scaleFactor.y = 0;\n }\n }\n isComplete() {\n return (this._stopped ||\n (Math.abs(this._tx.scale.x - this._startX) >= this._distanceX - 0.01 &&\n Math.abs(this._tx.scale.y - this._startY) >= this._distanceY - 0.01));\n }\n stop() {\n this._motion.scaleFactor.x = 0;\n this._motion.scaleFactor.y = 0;\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/ActionsComponent.ts\":\n/*!*************************************!*\\\n !*** ./Actions/ActionsComponent.ts ***!\n \\*************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ActionsComponent: () => (/* binding */ ActionsComponent)\n/* harmony export */ });\n/* harmony import */ var _ActionContext__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./ActionContext */ \"./Actions/ActionContext.ts\");\n/* harmony import */ var _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Component */ \"./EntityComponentSystem/Component.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n\n\n\n\nclass ActionsComponent extends _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor() {\n super(...arguments);\n this.dependencies = [_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent, _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent];\n this._ctx = null;\n }\n onAdd(entity) {\n this._ctx = new _ActionContext__WEBPACK_IMPORTED_MODULE_3__.ActionContext(entity);\n }\n onRemove() {\n this._ctx = null;\n }\n _getCtx() {\n if (!this._ctx) {\n throw new Error('Actions component not attached to an entity, no context available');\n }\n return this._ctx;\n }\n /**\n * Returns the internal action queue\n * @returns action queue\n */\n getQueue() {\n if (!this._ctx) {\n throw new Error('Actions component not attached to an entity, no queue available');\n }\n return this._ctx.getQueue();\n }\n /**\n * Runs a specific action in the action queue\n * @param action\n */\n runAction(action) {\n if (!this._ctx) {\n throw new Error('Actions component not attached to an entity, cannot run action');\n }\n return this._ctx.runAction(action);\n }\n /**\n * Updates the internal action context, performing action and moving through the internal queue\n * @param elapsed\n */\n update(elapsed) {\n var _a;\n return (_a = this._ctx) === null || _a === void 0 ? void 0 : _a.update(elapsed);\n }\n /**\n * Clears all queued actions from the Actor\n */\n clearActions() {\n var _a;\n (_a = this._ctx) === null || _a === void 0 ? void 0 : _a.clearActions();\n }\n /**\n * Animates an actor with a specified bezier curve by an offset to the current position, the start point is assumed\n * to be the actors current position\n * @param options\n */\n curveBy(options) {\n return this._getCtx().curveBy.apply(this._ctx, [options]);\n }\n /**\n * Animates an actor with a specified bezier curve to an absolute world space coordinate, the start point is assumed\n * to be the actors current position\n * @param options\n */\n curveTo(options) {\n return this._getCtx().curveTo.apply(this._ctx, [options]);\n }\n easeTo(...args) {\n return this._getCtx().easeTo.apply(this._ctx, args);\n }\n easeBy(...args) {\n return this._getCtx().easeBy.apply(this._ctx, args);\n }\n moveTo(xOrPosOrOptions, yOrSpeed, speedOrUndefined) {\n return this._getCtx().moveTo.apply(this._ctx, [xOrPosOrOptions, yOrSpeed, speedOrUndefined]);\n }\n moveBy(xOffsetOrVectorOptions, yOffsetOrSpeed, speedOrUndefined) {\n return this._getCtx().moveBy.apply(this._ctx, [xOffsetOrVectorOptions, yOffsetOrSpeed, speedOrUndefined]);\n }\n rotateTo(angle, speed, rotationType) {\n return this._getCtx().rotateTo.apply(this._ctx, [angle, speed, rotationType]);\n }\n rotateBy(angleRadiansOffsetOrOptions, speed, rotationType) {\n return this._getCtx().rotateBy.apply(this._ctx, [angleRadiansOffsetOrOptions, speed, rotationType]);\n }\n scaleTo(sizeXOrVectorOrOptions, sizeYOrSpeed, speedXOrUndefined, speedYOrUndefined) {\n return this._getCtx().scaleTo.apply(this._ctx, [sizeXOrVectorOrOptions, sizeYOrSpeed, speedXOrUndefined, speedYOrUndefined]);\n }\n scaleBy(sizeOffsetXOrVectorOrOptions, sizeOffsetYOrSpeed, speed) {\n return this._getCtx().scaleBy.apply(this._ctx, [sizeOffsetXOrVectorOrOptions, sizeOffsetYOrSpeed, speed]);\n }\n /**\n * This method will cause an actor to blink (become visible and not\n * visible). Optionally, you may specify the number of blinks. Specify the amount of time\n * the actor should be visible per blink, and the amount of time not visible.\n * This method is part of the actor 'Action' fluent API allowing action chaining.\n * @param timeVisible The amount of time to stay visible per blink in milliseconds\n * @param timeNotVisible The amount of time to stay not visible per blink in milliseconds\n * @param numBlinks The number of times to blink\n */\n blink(timeVisible, timeNotVisible, numBlinks) {\n return this._getCtx().blink(timeVisible, timeNotVisible, numBlinks);\n }\n /**\n * This method will cause an actor's opacity to change from its current value\n * to the provided value by a specified time (in milliseconds). This method is\n * part of the actor 'Action' fluent API allowing action chaining.\n * @param opacity The ending opacity\n * @param duration The time it should take to fade the actor (in milliseconds)\n */\n fade(opacity, duration) {\n return this._getCtx().fade(opacity, duration);\n }\n /**\n * This will cause an actor to flash a specific color for a period of time\n * @param color\n * @param duration The duration in milliseconds\n */\n flash(color, duration = 1000) {\n return this._getCtx().flash(color, duration);\n }\n /**\n * This method will delay the next action from executing for a certain\n * amount of time (in milliseconds). This method is part of the actor\n * 'Action' fluent API allowing action chaining.\n * @param duration The amount of time to delay the next action in the queue from executing in milliseconds\n */\n delay(duration) {\n return this._getCtx().delay(duration);\n }\n /**\n * This method will add an action to the queue that will remove the actor from the\n * scene once it has completed its previous Any actions on the\n * action queue after this action will not be executed.\n */\n die() {\n return this._getCtx().die();\n }\n /**\n * This method allows you to call an arbitrary method as the next action in the\n * action queue. This is useful if you want to execute code in after a specific\n * action, i.e An actor arrives at a destination after traversing a path\n */\n callMethod(method) {\n return this._getCtx().callMethod(method);\n }\n /**\n * This method will cause the actor to repeat all of the actions built in\n * the `repeatBuilder` callback. If the number of repeats\n * is not specified it will repeat forever. This method is part of\n * the actor 'Action' fluent API allowing action chaining\n *\n * ```typescript\n * // Move up in a zig-zag by repeated moveBy's\n * actor.actions.repeat(repeatCtx => {\n * repeatCtx.moveBy(10, 0, 10);\n * repeatCtx.moveBy(0, 10, 10);\n * }, 5);\n * ```\n * @param repeatBuilder The builder to specify the repeatable list of actions\n * @param times The number of times to repeat all the previous actions in the action queue. If nothing is specified the actions\n * will repeat forever\n */\n repeat(repeatBuilder, times) {\n return this._getCtx().repeat(repeatBuilder, times);\n }\n /**\n * This method will cause the actor to repeat all of the actions built in\n * the `repeatBuilder` callback. If the number of repeats\n * is not specified it will repeat forever. This method is part of\n * the actor 'Action' fluent API allowing action chaining\n *\n * ```typescript\n * // Move up in a zig-zag by repeated moveBy's\n * actor.actions.repeat(repeatCtx => {\n * repeatCtx.moveBy(10, 0, 10);\n * repeatCtx.moveBy(0, 10, 10);\n * }, 5);\n * ```\n * @param repeatBuilder The builder to specify the repeatable list of actions\n */\n repeatForever(repeatBuilder) {\n return this._getCtx().repeatForever(repeatBuilder);\n }\n /**\n * This method will cause the entity to follow another at a specified distance\n * @param entity The entity to follow\n * @param followDistance The distance to maintain when following, if not specified the actor will follow at the current distance.\n */\n follow(entity, followDistance) {\n return this._getCtx().follow(entity, followDistance);\n }\n /**\n * This method will cause the entity to move towards another until they\n * collide \"meet\" at a specified speed.\n * @param entity The entity to meet\n * @param speed The speed in pixels per second to move, if not specified it will match the speed of the other actor\n */\n meet(entity, speed) {\n return this._getCtx().meet(entity, speed);\n }\n /**\n * Returns a promise that resolves when the current action queue up to now\n * is finished.\n */\n toPromise() {\n return this._getCtx().toPromise();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/ActionsSystem.ts\":\n/*!**********************************!*\\\n !*** ./Actions/ActionsSystem.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ActionsSystem: () => (/* binding */ ActionsSystem)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Priority.ts\");\n/* harmony import */ var _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _ActionsComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ActionsComponent */ \"./Actions/ActionsComponent.ts\");\n\n\n\nclass ActionsSystem extends _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.System {\n constructor(world) {\n super();\n this.world = world;\n this.systemType = _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.SystemType.Update;\n this._actions = [];\n this.query = this.world.query([_ActionsComponent__WEBPACK_IMPORTED_MODULE_1__.ActionsComponent]);\n this.query.entityAdded$.subscribe((e) => this._actions.push(e.get(_ActionsComponent__WEBPACK_IMPORTED_MODULE_1__.ActionsComponent)));\n this.query.entityRemoved$.subscribe((e) => {\n const action = e.get(_ActionsComponent__WEBPACK_IMPORTED_MODULE_1__.ActionsComponent);\n const index = this._actions.indexOf(action);\n if (index > -1) {\n this._actions.splice(index, 1);\n }\n });\n }\n update(elapsed) {\n for (let i = 0; i < this._actions.length; i++) {\n const action = this._actions[i];\n action.update(elapsed);\n }\n }\n}\nActionsSystem.priority = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_2__.SystemPriority.Higher;\n\n\n/***/ }),\n\n/***/ \"./Actions/index.ts\":\n/*!**************************!*\\\n !*** ./Actions/index.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ActionContext: () => (/* reexport safe */ _ActionContext__WEBPACK_IMPORTED_MODULE_0__.ActionContext),\n/* harmony export */ ActionQueue: () => (/* reexport safe */ _ActionQueue__WEBPACK_IMPORTED_MODULE_1__.ActionQueue),\n/* harmony export */ ActionSequence: () => (/* reexport safe */ _Action_ActionSequence__WEBPACK_IMPORTED_MODULE_3__.ActionSequence),\n/* harmony export */ ActionsComponent: () => (/* reexport safe */ _ActionsComponent__WEBPACK_IMPORTED_MODULE_24__.ActionsComponent),\n/* harmony export */ ActionsSystem: () => (/* reexport safe */ _ActionsSystem__WEBPACK_IMPORTED_MODULE_25__.ActionsSystem),\n/* harmony export */ Blink: () => (/* reexport safe */ _Action_Blink__WEBPACK_IMPORTED_MODULE_7__.Blink),\n/* harmony export */ CurveBy: () => (/* reexport safe */ _Action_CurveBy__WEBPACK_IMPORTED_MODULE_23__.CurveBy),\n/* harmony export */ CurveTo: () => (/* reexport safe */ _Action_CurveTo__WEBPACK_IMPORTED_MODULE_22__.CurveTo),\n/* harmony export */ Delay: () => (/* reexport safe */ _Action_Delay__WEBPACK_IMPORTED_MODULE_20__.Delay),\n/* harmony export */ Die: () => (/* reexport safe */ _Action_Die__WEBPACK_IMPORTED_MODULE_8__.Die),\n/* harmony export */ EaseBy: () => (/* reexport safe */ _Action_EaseBy__WEBPACK_IMPORTED_MODULE_10__.EaseBy),\n/* harmony export */ EaseTo: () => (/* reexport safe */ _Action_EaseTo__WEBPACK_IMPORTED_MODULE_9__.EaseTo),\n/* harmony export */ Fade: () => (/* reexport safe */ _Action_Fade__WEBPACK_IMPORTED_MODULE_11__.Fade),\n/* harmony export */ Flash: () => (/* reexport safe */ _Action_Flash__WEBPACK_IMPORTED_MODULE_21__.Flash),\n/* harmony export */ Follow: () => (/* reexport safe */ _Action_Follow__WEBPACK_IMPORTED_MODULE_12__.Follow),\n/* harmony export */ Meet: () => (/* reexport safe */ _Action_Meet__WEBPACK_IMPORTED_MODULE_13__.Meet),\n/* harmony export */ MoveBy: () => (/* reexport safe */ _Action_MoveBy__WEBPACK_IMPORTED_MODULE_14__.MoveBy),\n/* harmony export */ MoveByWithOptions: () => (/* reexport safe */ _Action_MoveBy__WEBPACK_IMPORTED_MODULE_14__.MoveByWithOptions),\n/* harmony export */ MoveTo: () => (/* reexport safe */ _Action_MoveTo__WEBPACK_IMPORTED_MODULE_15__.MoveTo),\n/* harmony export */ MoveToWithOptions: () => (/* reexport safe */ _Action_MoveTo__WEBPACK_IMPORTED_MODULE_15__.MoveToWithOptions),\n/* harmony export */ ParallelActions: () => (/* reexport safe */ _Action_ParallelActions__WEBPACK_IMPORTED_MODULE_4__.ParallelActions),\n/* harmony export */ Repeat: () => (/* reexport safe */ _Action_Repeat__WEBPACK_IMPORTED_MODULE_5__.Repeat),\n/* harmony export */ RepeatForever: () => (/* reexport safe */ _Action_RepeatForever__WEBPACK_IMPORTED_MODULE_6__.RepeatForever),\n/* harmony export */ RotateBy: () => (/* reexport safe */ _Action_RotateBy__WEBPACK_IMPORTED_MODULE_16__.RotateBy),\n/* harmony export */ RotateByWithOptions: () => (/* reexport safe */ _Action_RotateBy__WEBPACK_IMPORTED_MODULE_16__.RotateByWithOptions),\n/* harmony export */ RotateTo: () => (/* reexport safe */ _Action_RotateTo__WEBPACK_IMPORTED_MODULE_17__.RotateTo),\n/* harmony export */ RotateToWithOptions: () => (/* reexport safe */ _Action_RotateTo__WEBPACK_IMPORTED_MODULE_17__.RotateToWithOptions),\n/* harmony export */ ScaleBy: () => (/* reexport safe */ _Action_ScaleBy__WEBPACK_IMPORTED_MODULE_18__.ScaleBy),\n/* harmony export */ ScaleByWithOptions: () => (/* reexport safe */ _Action_ScaleBy__WEBPACK_IMPORTED_MODULE_18__.ScaleByWithOptions),\n/* harmony export */ ScaleTo: () => (/* reexport safe */ _Action_ScaleTo__WEBPACK_IMPORTED_MODULE_19__.ScaleTo),\n/* harmony export */ ScaleToWithOptions: () => (/* reexport safe */ _Action_ScaleTo__WEBPACK_IMPORTED_MODULE_19__.ScaleToWithOptions),\n/* harmony export */ isMoveByOptions: () => (/* reexport safe */ _Action_MoveBy__WEBPACK_IMPORTED_MODULE_14__.isMoveByOptions),\n/* harmony export */ isMoveToOptions: () => (/* reexport safe */ _Action_MoveTo__WEBPACK_IMPORTED_MODULE_15__.isMoveToOptions),\n/* harmony export */ isRotateByOptions: () => (/* reexport safe */ _Action_RotateBy__WEBPACK_IMPORTED_MODULE_16__.isRotateByOptions),\n/* harmony export */ isRotateToOptions: () => (/* reexport safe */ _Action_RotateTo__WEBPACK_IMPORTED_MODULE_17__.isRotateToOptions),\n/* harmony export */ isScaleByOptions: () => (/* reexport safe */ _Action_ScaleBy__WEBPACK_IMPORTED_MODULE_18__.isScaleByOptions),\n/* harmony export */ isScaleToOptions: () => (/* reexport safe */ _Action_ScaleTo__WEBPACK_IMPORTED_MODULE_19__.isScaleToOptions),\n/* harmony export */ nextActionId: () => (/* reexport safe */ _Action__WEBPACK_IMPORTED_MODULE_2__.nextActionId)\n/* harmony export */ });\n/* harmony import */ var _ActionContext__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ActionContext */ \"./Actions/ActionContext.ts\");\n/* harmony import */ var _ActionQueue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ActionQueue */ \"./Actions/ActionQueue.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _Action_ActionSequence__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Action/ActionSequence */ \"./Actions/Action/ActionSequence.ts\");\n/* harmony import */ var _Action_ParallelActions__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Action/ParallelActions */ \"./Actions/Action/ParallelActions.ts\");\n/* harmony import */ var _Action_Repeat__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Action/Repeat */ \"./Actions/Action/Repeat.ts\");\n/* harmony import */ var _Action_RepeatForever__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Action/RepeatForever */ \"./Actions/Action/RepeatForever.ts\");\n/* harmony import */ var _Action_Blink__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Action/Blink */ \"./Actions/Action/Blink.ts\");\n/* harmony import */ var _Action_Die__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Action/Die */ \"./Actions/Action/Die.ts\");\n/* harmony import */ var _Action_EaseTo__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Action/EaseTo */ \"./Actions/Action/EaseTo.ts\");\n/* harmony import */ var _Action_EaseBy__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Action/EaseBy */ \"./Actions/Action/EaseBy.ts\");\n/* harmony import */ var _Action_Fade__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Action/Fade */ \"./Actions/Action/Fade.ts\");\n/* harmony import */ var _Action_Follow__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Action/Follow */ \"./Actions/Action/Follow.ts\");\n/* harmony import */ var _Action_Meet__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Action/Meet */ \"./Actions/Action/Meet.ts\");\n/* harmony import */ var _Action_MoveBy__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Action/MoveBy */ \"./Actions/Action/MoveBy.ts\");\n/* harmony import */ var _Action_MoveTo__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Action/MoveTo */ \"./Actions/Action/MoveTo.ts\");\n/* harmony import */ var _Action_RotateBy__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Action/RotateBy */ \"./Actions/Action/RotateBy.ts\");\n/* harmony import */ var _Action_RotateTo__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./Action/RotateTo */ \"./Actions/Action/RotateTo.ts\");\n/* harmony import */ var _Action_ScaleBy__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Action/ScaleBy */ \"./Actions/Action/ScaleBy.ts\");\n/* harmony import */ var _Action_ScaleTo__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./Action/ScaleTo */ \"./Actions/Action/ScaleTo.ts\");\n/* harmony import */ var _Action_Delay__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./Action/Delay */ \"./Actions/Action/Delay.ts\");\n/* harmony import */ var _Action_Flash__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./Action/Flash */ \"./Actions/Action/Flash.ts\");\n/* harmony import */ var _Action_CurveTo__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./Action/CurveTo */ \"./Actions/Action/CurveTo.ts\");\n/* harmony import */ var _Action_CurveBy__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./Action/CurveBy */ \"./Actions/Action/CurveBy.ts\");\n/* harmony import */ var _ActionsComponent__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./ActionsComponent */ \"./Actions/ActionsComponent.ts\");\n/* harmony import */ var _ActionsSystem__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./ActionsSystem */ \"./Actions/ActionsSystem.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Actor.ts\":\n/*!******************!*\\\n !*** ./Actor.ts ***!\n \\******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Actor: () => (/* binding */ Actor),\n/* harmony export */ ActorEvents: () => (/* binding */ ActorEvents),\n/* harmony export */ isActor: () => (/* binding */ isActor)\n/* harmony export */ });\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./Events */ \"./Events.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Collision/BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Collision/CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./EntityComponentSystem/Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Graphics/GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Graphics_Rectangle__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Graphics/Rectangle */ \"./Graphics/Rectangle.ts\");\n/* harmony import */ var _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Collision/ColliderComponent */ \"./Collision/ColliderComponent.ts\");\n/* harmony import */ var _Collision_Colliders_Shape__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Collision/Colliders/Shape */ \"./Collision/Colliders/Shape.ts\");\n/* harmony import */ var _Util_Watch__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Util/Watch */ \"./Util/Watch.ts\");\n/* harmony import */ var _Graphics_Circle__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Graphics/Circle */ \"./Graphics/Circle.ts\");\n/* harmony import */ var _Input_PointerComponent__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Input/PointerComponent */ \"./Input/PointerComponent.ts\");\n/* harmony import */ var _Actions_ActionsComponent__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Actions/ActionsComponent */ \"./Actions/ActionsComponent.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Math/coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Type guard for checking if something is an Actor\n * @param x\n */\nfunction isActor(x) {\n return x instanceof Actor;\n}\nconst ActorEvents = {\n CollisionStart: 'collisionstart',\n CollisionEnd: 'collisionend',\n PreCollision: 'precollision',\n PostCollision: 'postcollision',\n Kill: 'kill',\n PreKill: 'prekill',\n PostKill: 'postkill',\n PreDraw: 'predraw',\n PostDraw: 'postdraw',\n PreTransformDraw: 'pretransformdraw',\n PostTransformDraw: 'posttransformdraw',\n PreDebugDraw: 'predebugdraw',\n PostDebugDraw: 'postdebugdraw',\n PointerUp: 'pointerup',\n PointerDown: 'pointerdown',\n PointerEnter: 'pointerenter',\n PointerLeave: 'pointerleave',\n PointerMove: 'pointermove',\n PointerCancel: 'pointercancel',\n Wheel: 'pointerwheel',\n PointerDrag: 'pointerdragstart',\n PointerDragEnd: 'pointerdragend',\n PointerDragEnter: 'pointerdragenter',\n PointerDragLeave: 'pointerdragleave',\n PointerDragMove: 'pointerdragmove',\n EnterViewPort: 'enterviewport',\n ExitViewPort: 'exitviewport',\n ActionStart: 'actionstart',\n ActionComplete: 'actioncomplete'\n};\n/**\n * The most important primitive in Excalibur is an `Actor`. Anything that\n * can move on the screen, collide with another `Actor`, respond to events,\n * or interact with the current scene, must be an actor. An `Actor` **must**\n * be part of a {@apilink Scene} for it to be drawn to the screen.\n */\nclass Actor extends _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__.Entity {\n /**\n * Gets the position vector of the actor in pixels\n */\n get pos() {\n return this.transform.pos;\n }\n /**\n * Sets the position vector of the actor in pixels\n */\n set pos(thePos) {\n this.transform.pos = thePos.clone();\n }\n /**\n * Gets the position vector of the actor from the last frame\n */\n get oldPos() {\n return this.body.oldPos;\n }\n /**\n * Gets the global position vector of the actor from the last frame\n */\n get oldGlobalPos() {\n return this.body.oldGlobalPos;\n }\n /**\n * Sets the position vector of the actor in the last frame\n */\n set oldPos(thePos) {\n this.body.oldPos.setTo(thePos.x, thePos.y);\n }\n /**\n * Gets the velocity vector of the actor in pixels/sec\n */\n get vel() {\n return this.motion.vel;\n }\n /**\n * Sets the velocity vector of the actor in pixels/sec\n */\n set vel(theVel) {\n this.motion.vel = theVel.clone();\n }\n /**\n * Gets the velocity vector of the actor from the last frame\n */\n get oldVel() {\n return this.body.oldVel;\n }\n /**\n * Sets the velocity vector of the actor from the last frame\n */\n set oldVel(theVel) {\n this.body.oldVel.setTo(theVel.x, theVel.y);\n }\n /**\n * Gets the acceleration vector of the actor in pixels/second/second. An acceleration pointing down such as (0, 100) may be\n * useful to simulate a gravitational effect.\n */\n get acc() {\n return this.motion.acc;\n }\n /**\n * Sets the acceleration vector of teh actor in pixels/second/second\n */\n set acc(theAcc) {\n this.motion.acc = theAcc.clone();\n }\n /**\n * Sets the acceleration of the actor from the last frame. This does not include the global acc {@apilink Physics.acc}.\n */\n set oldAcc(theAcc) {\n this.body.oldAcc.setTo(theAcc.x, theAcc.y);\n }\n /**\n * Gets the acceleration of the actor from the last frame. This does not include the global acc {@apilink Physics.acc}.\n */\n get oldAcc() {\n return this.body.oldAcc;\n }\n /**\n * Gets the rotation of the actor in radians. 1 radian = 180/PI Degrees.\n */\n get rotation() {\n return this.transform.rotation;\n }\n /**\n * Sets the rotation of the actor in radians. 1 radian = 180/PI Degrees.\n */\n set rotation(theAngle) {\n this.transform.rotation = theAngle;\n }\n /**\n * Gets the rotational velocity of the actor in radians/second\n */\n get angularVelocity() {\n return this.motion.angularVelocity;\n }\n /**\n * Sets the rotational velocity of the actor in radians/sec\n */\n set angularVelocity(angularVelocity) {\n this.motion.angularVelocity = angularVelocity;\n }\n get scale() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).scale;\n }\n set scale(scale) {\n this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).scale = scale;\n }\n /**\n * The anchor to apply all actor related transformations like rotation,\n * translation, and scaling. By default the anchor is in the center of\n * the actor. By default it is set to the center of the actor (.5, .5)\n *\n * An anchor of (.5, .5) will ensure that drawings are centered.\n *\n * Use `anchor.setTo` to set the anchor to a different point using\n * values between 0 and 1. For example, anchoring to the top-left would be\n * `Actor.anchor.setTo(0, 0)` and top-right would be `Actor.anchor.setTo(0, 1)`.\n */\n get anchor() {\n return this._anchor;\n }\n set anchor(vec) {\n this._anchor = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_2__.watch)(vec, (v) => this._handleAnchorChange(v));\n this._handleAnchorChange(vec);\n }\n _handleAnchorChange(v) {\n if (this.graphics) {\n this.graphics.anchor = v;\n }\n }\n /**\n * The offset in pixels to apply to all actor graphics\n *\n * Default offset of (0, 0)\n */\n get offset() {\n return this._offset;\n }\n set offset(vec) {\n this._offset = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_2__.watch)(vec, (v) => this._handleOffsetChange(v));\n this._handleOffsetChange(vec);\n }\n _handleOffsetChange(v) {\n if (this.graphics) {\n this.graphics.offset = v;\n }\n }\n /**\n * Indicates whether the actor is physically in the viewport\n */\n get isOffScreen() {\n return this.hasTag('ex.offscreen');\n }\n get draggable() {\n return this._draggable;\n }\n set draggable(isDraggable) {\n if (isDraggable) {\n if (isDraggable && !this._draggable) {\n this.events.on('pointerdragstart', this._pointerDragStartHandler);\n this.events.on('pointerdragend', this._pointerDragEndHandler);\n this.events.on('pointerdragmove', this._pointerDragMoveHandler);\n this.events.on('pointerdragleave', this._pointerDragLeaveHandler);\n }\n else if (!isDraggable && this._draggable) {\n this.events.off('pointerdragstart', this._pointerDragStartHandler);\n this.events.off('pointerdragend', this._pointerDragEndHandler);\n this.events.off('pointerdragmove', this._pointerDragMoveHandler);\n this.events.off('pointerdragleave', this._pointerDragLeaveHandler);\n }\n this._draggable = isDraggable;\n }\n }\n /**\n * Sets the color of the actor's current graphic\n */\n get color() {\n return this.graphics.color;\n }\n set color(v) {\n this.graphics.color = v;\n }\n // #endregion\n /**\n *\n * @param config\n */\n constructor(config) {\n super();\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_3__.EventEmitter();\n this._anchor = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_2__.watch)(_Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Half, (v) => this._handleAnchorChange(v));\n this._offset = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_2__.watch)(_Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero, (v) => this._handleOffsetChange(v));\n /**\n * Convenience reference to the global logger\n */\n this.logger = _Util_Log__WEBPACK_IMPORTED_MODULE_5__.Logger.getInstance();\n /**\n * Draggable helper\n */\n this._draggable = false;\n this._dragging = false;\n this._pointerDragStartHandler = () => {\n this._dragging = true;\n };\n this._pointerDragEndHandler = () => {\n this._dragging = false;\n };\n this._pointerDragMoveHandler = (pe) => {\n if (this._dragging) {\n this.pos = pe.worldPos;\n }\n };\n this._pointerDragLeaveHandler = (pe) => {\n if (this._dragging) {\n this.pos = pe.worldPos;\n }\n };\n const { name, x, y, pos, coordPlane, scale, width, height, radius, collider, vel, acc, rotation, angularVelocity, z, color, visible, opacity, anchor, offset, collisionType, collisionGroup, silenceWarnings } = {\n ...config\n };\n this.name = name !== null && name !== void 0 ? name : this.name;\n this.anchor = anchor !== null && anchor !== void 0 ? anchor : Actor.defaults.anchor.clone();\n this.offset = offset !== null && offset !== void 0 ? offset : _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero;\n this.transform = new _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent();\n this.addComponent(this.transform);\n this.pos = pos !== null && pos !== void 0 ? pos : (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(x !== null && x !== void 0 ? x : 0, y !== null && y !== void 0 ? y : 0);\n this.rotation = rotation !== null && rotation !== void 0 ? rotation : 0;\n this.scale = scale !== null && scale !== void 0 ? scale : (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(1, 1);\n this.z = z !== null && z !== void 0 ? z : 0;\n this.transform.coordPlane = coordPlane !== null && coordPlane !== void 0 ? coordPlane : _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__.CoordPlane.World;\n this._silenceWarnings = silenceWarnings !== null && silenceWarnings !== void 0 ? silenceWarnings : false;\n this.pointer = new _Input_PointerComponent__WEBPACK_IMPORTED_MODULE_7__.PointerComponent();\n this.addComponent(this.pointer);\n this.graphics = new _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_8__.GraphicsComponent({\n anchor: this.anchor,\n offset: this.offset,\n opacity: opacity\n });\n this.addComponent(this.graphics);\n this.motion = new _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_9__.MotionComponent();\n this.addComponent(this.motion);\n this.vel = vel !== null && vel !== void 0 ? vel : _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero;\n this.acc = acc !== null && acc !== void 0 ? acc : _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero;\n this.angularVelocity = angularVelocity !== null && angularVelocity !== void 0 ? angularVelocity : 0;\n this.actions = new _Actions_ActionsComponent__WEBPACK_IMPORTED_MODULE_10__.ActionsComponent();\n this.addComponent(this.actions);\n this.body = new _Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_11__.BodyComponent();\n this.addComponent(this.body);\n this.body.collisionType = collisionType !== null && collisionType !== void 0 ? collisionType : _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_12__.CollisionType.Passive;\n if (collisionGroup) {\n this.body.group = collisionGroup;\n }\n if (color) {\n this.color = color;\n }\n if (collider) {\n this.collider = new _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_13__.ColliderComponent(collider);\n this.addComponent(this.collider);\n }\n else if (radius) {\n this.collider = new _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_13__.ColliderComponent(_Collision_Colliders_Shape__WEBPACK_IMPORTED_MODULE_14__.Shape.Circle(radius));\n this.addComponent(this.collider);\n if (color) {\n this.graphics.add(new _Graphics_Circle__WEBPACK_IMPORTED_MODULE_15__.Circle({\n color: color,\n radius\n }));\n }\n }\n else {\n if (width > 0 && height > 0) {\n this.collider = new _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_13__.ColliderComponent(_Collision_Colliders_Shape__WEBPACK_IMPORTED_MODULE_14__.Shape.Box(width, height, this.anchor));\n this.addComponent(this.collider);\n if (color && width && height) {\n this.graphics.add(new _Graphics_Rectangle__WEBPACK_IMPORTED_MODULE_16__.Rectangle({\n color: color,\n width,\n height\n }));\n }\n }\n else {\n this.collider = new _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_13__.ColliderComponent();\n this.addComponent(this.collider); // no collider\n }\n }\n this.graphics.isVisible = visible !== null && visible !== void 0 ? visible : true;\n }\n clone() {\n const clone = new Actor({\n silenceWarnings: this._silenceWarnings,\n color: this.color.clone(),\n anchor: this.anchor.clone(),\n offset: this.offset.clone()\n });\n clone.clearComponents();\n clone.processComponentRemoval();\n // Clone builtins, order is important, same as ctor\n clone.addComponent((clone.transform = this.transform.clone()), true);\n clone.addComponent((clone.pointer = this.pointer.clone()), true);\n clone.addComponent((clone.graphics = this.graphics.clone()), true);\n clone.addComponent((clone.motion = this.motion.clone()), true);\n clone.addComponent((clone.actions = this.actions.clone()), true);\n clone.addComponent((clone.body = this.body.clone()), true);\n clone.addComponent((clone.collider = this.collider.clone()), true);\n const builtInComponents = [\n this.transform,\n this.pointer,\n this.graphics,\n this.motion,\n this.actions,\n this.body,\n this.collider\n ];\n // Clone non-builtin the current actors components\n const components = this.getComponents();\n for (const c of components) {\n if (!builtInComponents.includes(c)) {\n clone.addComponent(c.clone(), true);\n }\n }\n return clone;\n }\n /**\n * `onInitialize` is called before the first update of the actor. This method is meant to be\n * overridden. This is where initialization of child actors should take place.\n *\n * Synonymous with the event handler `.on('initialize', (evt) => {...})`\n */\n onInitialize(engine) {\n // Override me\n }\n /**\n * Initializes this actor and all it's child actors, meant to be called by the Scene before first update not by users of Excalibur.\n *\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n * @internal\n */\n _initialize(engine) {\n super._initialize(engine);\n for (const child of this.children) {\n child._initialize(engine);\n }\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n // #endregion\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _prekill handler for {@apilink onPreKill} lifecycle event\n * @internal\n */\n _prekill(scene) {\n this.events.emit('prekill', new _Events__WEBPACK_IMPORTED_MODULE_17__.PreKillEvent(this));\n this.onPreKill(scene);\n }\n /**\n * Safe to override onPreKill lifecycle event handler. Synonymous with `.on('prekill', (evt) =>{...})`\n *\n * `onPreKill` is called directly before an actor is killed and removed from its current {@apilink Scene}.\n */\n onPreKill(scene) {\n // Override me\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _prekill handler for {@apilink onPostKill} lifecycle event\n * @internal\n */\n _postkill(scene) {\n this.events.emit('postkill', new _Events__WEBPACK_IMPORTED_MODULE_17__.PostKillEvent(this));\n this.onPostKill(scene);\n }\n /**\n * Safe to override onPostKill lifecycle event handler. Synonymous with `.on('postkill', (evt) => {...})`\n *\n * `onPostKill` is called directly after an actor is killed and remove from its current {@apilink Scene}.\n */\n onPostKill(scene) {\n // Override me\n }\n /**\n * If the current actor is a member of the scene, this will remove\n * it from the scene graph. It will no longer be drawn or updated.\n */\n kill() {\n if (this.scene) {\n this._prekill(this.scene);\n this.events.emit('kill', new _Events__WEBPACK_IMPORTED_MODULE_17__.KillEvent(this));\n super.kill();\n this._postkill(this.scene);\n }\n else {\n this.logger.warn(`Cannot kill actor named \"${this.name}\", it was never added to the Scene`);\n }\n }\n /**\n * If the current actor is killed, it will now not be killed.\n */\n unkill() {\n this.isActive = true;\n }\n /**\n * Indicates wether the actor has been killed.\n */\n isKilled() {\n return !this.isActive;\n }\n /**\n * Gets the z-index of an actor. The z-index determines the relative order an actor is drawn in.\n * Actors with a higher z-index are drawn on top of actors with a lower z-index\n */\n get z() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).z;\n }\n /**\n * Sets the z-index of an actor and updates it in the drawing list for the scene.\n * The z-index determines the relative order an actor is drawn in.\n * Actors with a higher z-index are drawn on top of actors with a lower z-index\n * @param newZ new z-index to assign\n */\n set z(newZ) {\n this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).z = newZ;\n }\n /**\n * Get the center point of an actor (global position)\n */\n get center() {\n const globalPos = this.getGlobalPos();\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector(globalPos.x + this.width / 2 - this.anchor.x * this.width, globalPos.y + this.height / 2 - this.anchor.y * this.height);\n }\n /**\n * Get the local center point of an actor\n */\n get localCenter() {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector(this.pos.x + this.width / 2 - this.anchor.x * this.width, this.pos.y + this.height / 2 - this.anchor.y * this.height);\n }\n get width() {\n return this.collider.localBounds.width * this.getGlobalScale().x;\n }\n get height() {\n return this.collider.localBounds.height * this.getGlobalScale().y;\n }\n /**\n * Gets this actor's rotation taking into account any parent relationships\n * @returns Rotation angle in radians\n * @deprecated Use {@apilink globalRotation} instead\n */\n getGlobalRotation() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).globalRotation;\n }\n /**\n * The actor's rotation (in radians) taking into account any parent relationships\n */\n get globalRotation() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).globalRotation;\n }\n /**\n * Gets an actor's world position taking into account parent relationships, scaling, rotation, and translation\n * @returns Position in world coordinates\n * @deprecated Use {@apilink globalPos} instead\n */\n getGlobalPos() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).globalPos;\n }\n /**\n * The actor's world position taking into account parent relationships, scaling, rotation, and translation\n */\n get globalPos() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).globalPos;\n }\n /**\n * Gets the global scale of the Actor\n * @deprecated Use {@apilink globalScale} instead\n */\n getGlobalScale() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).globalScale;\n }\n /**\n * The global scale of the Actor\n */\n get globalScale() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).globalScale;\n }\n /**\n * The global z-index of the actor\n */\n get globalZ() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).globalZ;\n }\n // #region Collision\n /**\n * Tests whether the x/y specified are contained in the actor\n * @param x X coordinate to test (in world coordinates)\n * @param y Y coordinate to test (in world coordinates)\n * @param recurse checks whether the x/y are contained in any child actors (if they exist).\n */\n contains(x, y, recurse = false) {\n const point = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(x, y);\n const collider = this.get(_Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_13__.ColliderComponent);\n collider.update();\n const geom = collider.get();\n if (!geom) {\n return false;\n }\n const containment = geom.contains(point);\n if (recurse) {\n return (containment ||\n this.children.some((child) => {\n return child.contains(x, y, true);\n }));\n }\n return containment;\n }\n /**\n * Returns true if the two actor.collider's surfaces are less than or equal to the distance specified from each other\n * @param actor Actor to test\n * @param distance Distance in pixels to test\n */\n within(actor, distance) {\n const collider = this.get(_Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_13__.ColliderComponent);\n const otherCollider = actor.get(_Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_13__.ColliderComponent);\n const me = collider.get();\n const other = otherCollider.get();\n if (me && other) {\n return me.getClosestLineBetween(other).getLength() <= distance;\n }\n return false;\n }\n // #endregion\n // #region Update\n /**\n * Called by the Engine, updates the state of the actor\n * @internal\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n */\n update(engine, elapsed) {\n this._initialize(engine);\n this._add(engine);\n this._preupdate(engine, elapsed);\n this._postupdate(engine, elapsed);\n this._remove(engine);\n }\n /**\n * Safe to override onPreUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPreUpdate` is called directly before an actor is updated.\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n */\n onPreUpdate(engine, elapsed) {\n // Override me\n }\n /**\n * Safe to override onPostUpdate lifecycle event handler. Synonymous with `.on('postupdate', (evt) =>{...})`\n *\n * `onPostUpdate` is called directly after an actor is updated.\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n */\n onPostUpdate(engine, elapsed) {\n // Override me\n }\n /**\n * Fires before every collision resolution for a confirmed contact\n * @param self\n * @param other\n * @param side\n * @param contact\n */\n onPreCollisionResolve(self, other, side, contact) {\n // Override me\n }\n /**\n * Fires after every resolution for a confirmed contact.\n * @param self\n * @param other\n * @param side\n * @param contact\n */\n onPostCollisionResolve(self, other, side, contact) {\n // Override me\n }\n /**\n * Fires once when 2 entities with a ColliderComponent first start colliding or touching, if the Colliders stay in contact this\n * does not continue firing until they separate and re-collide.\n * @param self\n * @param other\n * @param side\n * @param contact\n */\n onCollisionStart(self, other, side, contact) {\n // Override me\n }\n /**\n * Fires once when 2 entities with a ColliderComponent separate after having been in contact.\n * @param self\n * @param other\n * @param side\n * @param lastContact\n */\n onCollisionEnd(self, other, side, lastContact) {\n // Override me\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _preupdate handler for {@apilink onPreUpdate} lifecycle event\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n * @internal\n */\n _preupdate(engine, elapsed) {\n this.events.emit('preupdate', new _Events__WEBPACK_IMPORTED_MODULE_17__.PreUpdateEvent(engine, elapsed, this));\n this.onPreUpdate(engine, elapsed);\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _preupdate handler for {@apilink onPostUpdate} lifecycle event\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n * @internal\n */\n _postupdate(engine, elapsed) {\n this.events.emit('postupdate', new _Events__WEBPACK_IMPORTED_MODULE_17__.PostUpdateEvent(engine, elapsed, this));\n this.onPostUpdate(engine, elapsed);\n }\n}\n// #region Properties\n/**\n * Set defaults for all Actors\n */\nActor.defaults = {\n anchor: _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Half\n};\n\n\n/***/ }),\n\n/***/ \"./Camera.ts\":\n/*!*******************!*\\\n !*** ./Camera.ts ***!\n \\*******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Axis: () => (/* binding */ Axis),\n/* harmony export */ Camera: () => (/* binding */ Camera),\n/* harmony export */ CameraEvents: () => (/* binding */ CameraEvents),\n/* harmony export */ ElasticToActorStrategy: () => (/* binding */ ElasticToActorStrategy),\n/* harmony export */ LimitCameraBoundsStrategy: () => (/* binding */ LimitCameraBoundsStrategy),\n/* harmony export */ LockCameraToActorAxisStrategy: () => (/* binding */ LockCameraToActorAxisStrategy),\n/* harmony export */ LockCameraToActorStrategy: () => (/* binding */ LockCameraToActorStrategy),\n/* harmony export */ RadiusAroundActorStrategy: () => (/* binding */ RadiusAroundActorStrategy),\n/* harmony export */ StrategyContainer: () => (/* binding */ StrategyContainer)\n/* harmony export */ });\n/* harmony import */ var _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Util/EasingFunctions */ \"./Util/EasingFunctions.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Util/Util */ \"./Util/Util.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Events */ \"./Events.ts\");\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Math/affine-matrix */ \"./Math/affine-matrix.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Graphics */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Math_watch_vector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Math/watch-vector */ \"./Math/watch-vector.ts\");\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Container to house convenience strategy methods\n * @internal\n */\nclass StrategyContainer {\n constructor(camera) {\n this.camera = camera;\n }\n /**\n * Creates and adds the {@apilink LockCameraToActorStrategy} on the current camera.\n * @param actor The actor to lock the camera to\n */\n lockToActor(actor) {\n this.camera.addStrategy(new LockCameraToActorStrategy(actor));\n }\n /**\n * Creates and adds the {@apilink LockCameraToActorAxisStrategy} on the current camera\n * @param actor The actor to lock the camera to\n * @param axis The axis to follow the actor on\n */\n lockToActorAxis(actor, axis) {\n this.camera.addStrategy(new LockCameraToActorAxisStrategy(actor, axis));\n }\n /**\n * Creates and adds the {@apilink ElasticToActorStrategy} on the current camera\n * If cameraElasticity < cameraFriction < 1.0, the behavior will be a dampened spring that will slowly end at the target without bouncing\n * If cameraFriction < cameraElasticity < 1.0, the behavior will be an oscillating spring that will over\n * correct and bounce around the target\n * @param actor Target actor to elastically follow\n * @param cameraElasticity [0 - 1.0] The higher the elasticity the more force that will drive the camera towards the target\n * @param cameraFriction [0 - 1.0] The higher the friction the more that the camera will resist motion towards the target\n */\n elasticToActor(actor, cameraElasticity, cameraFriction) {\n this.camera.addStrategy(new ElasticToActorStrategy(actor, cameraElasticity, cameraFriction));\n }\n /**\n * Creates and adds the {@apilink RadiusAroundActorStrategy} on the current camera\n * @param actor Target actor to follow when it is \"radius\" pixels away\n * @param radius Number of pixels away before the camera will follow\n */\n radiusAroundActor(actor, radius) {\n this.camera.addStrategy(new RadiusAroundActorStrategy(actor, radius));\n }\n /**\n * Creates and adds the {@apilink LimitCameraBoundsStrategy} on the current camera\n * @param box The bounding box to limit the camera to.\n */\n limitCameraBounds(box) {\n this.camera.addStrategy(new LimitCameraBoundsStrategy(box));\n }\n}\n/**\n * Camera axis enum\n */\nvar Axis;\n(function (Axis) {\n Axis[Axis[\"X\"] = 0] = \"X\";\n Axis[Axis[\"Y\"] = 1] = \"Y\";\n})(Axis || (Axis = {}));\n/**\n * Lock a camera to the exact x/y position of an actor.\n */\nclass LockCameraToActorStrategy {\n constructor(target) {\n this.target = target;\n this.action = (target, camera, engine, elapsed) => {\n const center = target.center;\n return center;\n };\n }\n}\n/**\n * Lock a camera to a specific axis around an actor.\n */\nclass LockCameraToActorAxisStrategy {\n constructor(target, axis) {\n this.target = target;\n this.axis = axis;\n this.action = (target, cam, _eng, elapsed) => {\n const center = target.center;\n const currentFocus = cam.getFocus();\n if (this.axis === Axis.X) {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(center.x, currentFocus.y);\n }\n else {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(currentFocus.x, center.y);\n }\n };\n }\n}\n/**\n * Using [Hook's law](https://en.wikipedia.org/wiki/Hooke's_law), elastically move the camera towards the target actor.\n */\nclass ElasticToActorStrategy {\n /**\n * If cameraElasticity < cameraFriction < 1.0, the behavior will be a dampened spring that will slowly end at the target without bouncing\n * If cameraFriction < cameraElasticity < 1.0, the behavior will be an oscillating spring that will over\n * correct and bounce around the target\n * @param target Target actor to elastically follow\n * @param cameraElasticity [0 - 1.0] The higher the elasticity the more force that will drive the camera towards the target\n * @param cameraFriction [0 - 1.0] The higher the friction the more that the camera will resist motion towards the target\n */\n constructor(target, cameraElasticity, cameraFriction) {\n this.target = target;\n this.cameraElasticity = cameraElasticity;\n this.cameraFriction = cameraFriction;\n this.action = (target, cam, _eng, elapsed) => {\n const position = target.center;\n let focus = cam.getFocus();\n let cameraVel = cam.vel.clone();\n // Calculate the stretch vector, using the spring equation\n // F = kX\n // https://en.wikipedia.org/wiki/Hooke's_law\n // Apply to the current camera velocity\n const stretch = position.sub(focus).scale(this.cameraElasticity); // stretch is X\n cameraVel = cameraVel.add(stretch);\n // Calculate the friction (-1 to apply a force in the opposition of motion)\n // Apply to the current camera velocity\n const friction = cameraVel.scale(-1).scale(this.cameraFriction);\n cameraVel = cameraVel.add(friction);\n // Update position by velocity deltas\n focus = focus.add(cameraVel);\n return focus;\n };\n }\n}\nclass RadiusAroundActorStrategy {\n /**\n *\n * @param target Target actor to follow when it is \"radius\" pixels away\n * @param radius Number of pixels away before the camera will follow\n */\n constructor(target, radius) {\n this.target = target;\n this.radius = radius;\n this.action = (target, cam, _eng, elapsed) => {\n const position = target.center;\n const focus = cam.getFocus();\n const direction = position.sub(focus);\n const distance = direction.magnitude;\n if (distance >= this.radius) {\n const offset = distance - this.radius;\n return focus.add(direction.normalize().scale(offset));\n }\n return focus;\n };\n }\n}\n/**\n * Prevent a camera from going beyond the given camera dimensions.\n */\nclass LimitCameraBoundsStrategy {\n constructor(target) {\n this.target = target;\n /**\n * Useful for limiting the camera to a {@apilink TileMap}'s dimensions, or a specific area inside the map.\n *\n * Note that this strategy does not perform any movement by itself.\n * It only sets the camera position to within the given bounds when the camera has gone beyond them.\n * Thus, it is a good idea to combine it with other camera strategies and set this strategy as the last one.\n *\n * Make sure that the camera bounds are at least as large as the viewport size.\n * @param target The bounding box to limit the camera to\n */\n this.boundSizeChecked = false; // Check and warn only once\n this.action = (target, cam, _eng, elapsed) => {\n const focus = cam.getFocus();\n if (!this.boundSizeChecked) {\n if (target.bottom - target.top < _eng.drawHeight || target.right - target.left < _eng.drawWidth) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance().warn('Camera bounds should not be smaller than the engine viewport');\n }\n this.boundSizeChecked = true;\n }\n let focusX = focus.x;\n let focusY = focus.y;\n if (focus.x < target.left + _eng.halfDrawWidth) {\n focusX = target.left + _eng.halfDrawWidth;\n }\n else if (focus.x > target.right - _eng.halfDrawWidth) {\n focusX = target.right - _eng.halfDrawWidth;\n }\n if (focus.y < target.top + _eng.halfDrawHeight) {\n focusY = target.top + _eng.halfDrawHeight;\n }\n else if (focus.y > target.bottom - _eng.halfDrawHeight) {\n focusY = target.bottom - _eng.halfDrawHeight;\n }\n return (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(focusX, focusY);\n };\n }\n}\nconst CameraEvents = {\n Initialize: 'initialize',\n PreUpdate: 'preupdate',\n PostUpdate: 'postupdate'\n};\n/**\n * Cameras\n *\n * {@apilink Camera} is the base class for all Excalibur cameras. Cameras are used\n * to move around your game and set focus. They are used to determine\n * what is \"off screen\" and can be used to scale the game.\n *\n */\nclass Camera {\n constructor() {\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_2__.EventEmitter();\n this.transform = _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_3__.AffineMatrix.identity();\n this.inverse = _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_3__.AffineMatrix.identity();\n this._cameraStrategies = [];\n this.strategy = new StrategyContainer(this);\n /**\n * Get or set current zoom of the camera, defaults to 1\n */\n this._z = 1;\n /**\n * Get or set rate of change in zoom, defaults to 0\n */\n this.dz = 0;\n /**\n * Get or set zoom acceleration\n */\n this.az = 0;\n /**\n * Current rotation of the camera\n */\n this.rotation = 0;\n this._angularVelocity = 0;\n this._posChanged = false;\n this._pos = new _Math_watch_vector__WEBPACK_IMPORTED_MODULE_4__.WatchVector(_Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero, () => {\n this._posChanged = true;\n });\n /**\n * Interpolated camera position if more draws are running than updates\n *\n * Enabled when `Engine.fixedUpdateFps` is enabled, in all other cases this will be the same as pos\n */\n this.drawPos = this.pos.clone();\n this._oldPos = this.pos.clone();\n /**\n * Get or set the camera's velocity\n */\n this.vel = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero;\n /**\n * Get or set the camera's acceleration\n */\n this.acc = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero;\n this._cameraMoving = false;\n this._currentLerpTime = 0;\n this._lerpDuration = 1000; // 1 second\n this._lerpStart = null;\n this._lerpEnd = null;\n //camera effects\n this._isShaking = false;\n this._shakeMagnitudeX = 0;\n this._shakeMagnitudeY = 0;\n this._shakeDuration = 0;\n this._elapsedShakeTime = 0;\n this._xShake = 0;\n this._yShake = 0;\n this._isZooming = false;\n this._zoomStart = 1;\n this._zoomEnd = 1;\n this._currentZoomTime = 0;\n this._zoomDuration = 0;\n this._zoomEasing = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_5__.EasingFunctions.EaseInOutCubic;\n this._easing = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_5__.EasingFunctions.EaseInOutCubic;\n this._halfWidth = 0;\n this._halfHeight = 0;\n this._viewport = null;\n this._isInitialized = false;\n this._snapPos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n }\n get zoom() {\n return this._z;\n }\n set zoom(val) {\n this._z = val;\n if (this._engine) {\n this._halfWidth = this._engine.halfDrawWidth;\n this._halfHeight = this._engine.halfDrawHeight;\n }\n }\n /**\n * Get or set the camera's angular velocity\n */\n get angularVelocity() {\n return this._angularVelocity;\n }\n set angularVelocity(value) {\n this._angularVelocity = value;\n }\n /**\n * Get or set the camera's position\n */\n get pos() {\n return this._pos;\n }\n set pos(vec) {\n this._posChanged = true;\n this._pos = new _Math_watch_vector__WEBPACK_IMPORTED_MODULE_4__.WatchVector(vec, () => {\n this._posChanged = true;\n });\n }\n /**\n * Has the position changed since the last update\n */\n hasChanged() {\n return this._posChanged;\n }\n /**\n * Get the camera's x position\n */\n get x() {\n return this.pos.x;\n }\n /**\n * Set the camera's x position (cannot be set when following an {@apilink Actor} or when moving)\n */\n set x(value) {\n if (!this._follow && !this._cameraMoving) {\n this.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(value, this.pos.y);\n }\n }\n /**\n * Get the camera's y position\n */\n get y() {\n return this.pos.y;\n }\n /**\n * Set the camera's y position (cannot be set when following an {@apilink Actor} or when moving)\n */\n set y(value) {\n if (!this._follow && !this._cameraMoving) {\n this.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.pos.x, value);\n }\n }\n /**\n * Get or set the camera's x velocity\n */\n get dx() {\n return this.vel.x;\n }\n set dx(value) {\n this.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(value, this.vel.y);\n }\n /**\n * Get or set the camera's y velocity\n */\n get dy() {\n return this.vel.y;\n }\n set dy(value) {\n this.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.vel.x, value);\n }\n /**\n * Get or set the camera's x acceleration\n */\n get ax() {\n return this.acc.x;\n }\n set ax(value) {\n this.acc = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(value, this.acc.y);\n }\n /**\n * Get or set the camera's y acceleration\n */\n get ay() {\n return this.acc.y;\n }\n set ay(value) {\n this.acc = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.acc.x, value);\n }\n /**\n * Returns the focal point of the camera, a new point giving the x and y position of the camera\n */\n getFocus() {\n return this.pos;\n }\n /**\n * This moves the camera focal point to the specified position using specified easing function. Cannot move when following an Actor.\n * @param pos The target position to move to\n * @param duration The duration in milliseconds the move should last\n * @param [easingFn] An optional easing function ({@apilink EasingFunctions.EaseInOutCubic} by default)\n * @returns A {@apilink Promise} that resolves when movement is finished, including if it's interrupted.\n * The {@apilink Promise} value is the {@apilink Vector} of the target position. It will be rejected if a move cannot be made.\n */\n move(pos, duration, easingFn = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_5__.EasingFunctions.EaseInOutCubic) {\n if (typeof easingFn !== 'function') {\n throw 'Please specify an EasingFunction';\n }\n // cannot move when following an actor\n if (this._follow) {\n return Promise.reject(pos);\n }\n // resolve existing promise, if any\n if (this._lerpPromise && this._lerpResolve) {\n this._lerpResolve(pos);\n }\n this._lerpPromise = new Promise((resolve) => {\n this._lerpResolve = resolve;\n });\n this._lerpStart = this.getFocus().clone();\n this._lerpDuration = duration;\n this._lerpEnd = pos;\n this._currentLerpTime = 0;\n this._cameraMoving = true;\n this._easing = easingFn;\n return this._lerpPromise;\n }\n /**\n * Sets the camera to shake at the specified magnitudes for the specified duration\n * @param magnitudeX The x magnitude of the shake\n * @param magnitudeY The y magnitude of the shake\n * @param duration The duration of the shake in milliseconds\n */\n shake(magnitudeX, magnitudeY, duration) {\n this._isShaking = true;\n this._shakeMagnitudeX = magnitudeX;\n this._shakeMagnitudeY = magnitudeY;\n this._shakeDuration = duration;\n }\n /**\n * Zooms the camera in or out by the specified scale over the specified duration.\n * If no duration is specified, it take effect immediately.\n * @param scale The scale of the zoom\n * @param duration The duration of the zoom in milliseconds\n */\n zoomOverTime(scale, duration = 0, easingFn = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_5__.EasingFunctions.EaseInOutCubic) {\n this._zoomPromise = new Promise((resolve) => {\n this._zoomResolve = resolve;\n });\n if (duration) {\n this._isZooming = true;\n this._zoomEasing = easingFn;\n this._currentZoomTime = 0;\n this._zoomDuration = duration;\n this._zoomStart = this.zoom;\n this._zoomEnd = scale;\n }\n else {\n this._isZooming = false;\n this.zoom = scale;\n return Promise.resolve(true);\n }\n return this._zoomPromise;\n }\n /**\n * Gets the bounding box of the viewport of this camera in world coordinates\n */\n get viewport() {\n if (this._viewport) {\n return this._viewport;\n }\n return new _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox(0, 0, 0, 0);\n }\n /**\n * Adds a new camera strategy to this camera\n * @param cameraStrategy Instance of an {@apilink CameraStrategy}\n */\n addStrategy(cameraStrategy) {\n this._cameraStrategies.push(cameraStrategy);\n }\n /**\n * Removes a camera strategy by reference\n * @param cameraStrategy Instance of an {@apilink CameraStrategy}\n */\n removeStrategy(cameraStrategy) {\n (0,_Util_Util__WEBPACK_IMPORTED_MODULE_7__.removeItemFromArray)(cameraStrategy, this._cameraStrategies);\n }\n /**\n * Clears all camera strategies from the camera\n */\n clearAllStrategies() {\n this._cameraStrategies.length = 0;\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _preupdate handler for {@apilink onPreUpdate} lifecycle event\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n * @internal\n */\n _preupdate(engine, elapsed) {\n this.events.emit('preupdate', new _Events__WEBPACK_IMPORTED_MODULE_8__.PreUpdateEvent(engine, elapsed, this));\n this.onPreUpdate(engine, elapsed);\n }\n /**\n * Safe to override onPreUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPreUpdate` is called directly before a scene is updated.\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n */\n onPreUpdate(engine, elapsed) {\n // Overridable\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _preupdate handler for {@apilink onPostUpdate} lifecycle event\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n * @internal\n */\n _postupdate(engine, elapsed) {\n this.events.emit('postupdate', new _Events__WEBPACK_IMPORTED_MODULE_8__.PostUpdateEvent(engine, elapsed, this));\n this.onPostUpdate(engine, elapsed);\n }\n /**\n * Safe to override onPostUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPostUpdate` is called directly after a scene is updated.\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n */\n onPostUpdate(engine, elapsed) {\n // Overridable\n }\n get isInitialized() {\n return this._isInitialized;\n }\n _initialize(engine) {\n if (!this.isInitialized) {\n this._engine = engine;\n this._screen = engine.screen;\n const currentRes = this._screen.contentArea;\n let center = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(currentRes.width / 2, currentRes.height / 2);\n if (!this._engine.loadingComplete) {\n // If there was a loading screen, we peek the configured resolution\n const res = this._screen.peekResolution();\n if (res) {\n center = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(res.width / 2, res.height / 2);\n }\n }\n this._halfWidth = center.x;\n this._halfHeight = center.y;\n // If the user has not set the camera pos, apply default center screen position\n if (!this._posChanged) {\n this.pos = center;\n }\n this.pos.clone(this.drawPos);\n // First frame bootstrap\n // Ensure camera tx is correct\n // Run update twice to ensure properties are init'd\n this.updateTransform(this.pos);\n // Run strategies for first frame\n this.runStrategies(engine, engine.clock.elapsed());\n // Setup the first frame viewport\n this.updateViewport();\n // It's important to update the camera after strategies\n // This prevents jitter\n this.updateTransform(this.pos);\n this.pos.clone(this._oldPos);\n this.onInitialize(engine);\n this.events.emit('initialize', new _Events__WEBPACK_IMPORTED_MODULE_8__.InitializeEvent(engine, this));\n this._isInitialized = true;\n }\n }\n /**\n * Safe to override onPostUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPostUpdate` is called directly after a scene is updated.\n */\n onInitialize(engine) {\n // Overridable\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n runStrategies(engine, elapsed) {\n for (const s of this._cameraStrategies) {\n this.pos = s.action.call(s, s.target, this, engine, elapsed);\n }\n }\n updateViewport() {\n // recalculate viewport\n this._viewport = new _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox(this.x - this._halfWidth, this.y - this._halfHeight, this.x + this._halfWidth, this.y + this._halfHeight);\n }\n update(engine, elapsed) {\n this._initialize(engine);\n this._preupdate(engine, elapsed);\n this.pos.clone(this._oldPos);\n // Update placements based on linear algebra\n this.pos = this.pos.add(this.vel.scale(elapsed / 1000));\n this.zoom += (this.dz * elapsed) / 1000;\n this.vel = this.vel.add(this.acc.scale(elapsed / 1000));\n this.dz += (this.az * elapsed) / 1000;\n this.rotation += (this.angularVelocity * elapsed) / 1000;\n if (this._isZooming) {\n if (this._currentZoomTime < this._zoomDuration) {\n const zoomEasing = this._zoomEasing;\n const newZoom = zoomEasing(this._currentZoomTime, this._zoomStart, this._zoomEnd, this._zoomDuration);\n this.zoom = newZoom;\n this._currentZoomTime += elapsed;\n }\n else {\n this._isZooming = false;\n this.zoom = this._zoomEnd;\n this._currentZoomTime = 0;\n this._zoomResolve(true);\n }\n }\n if (this._cameraMoving) {\n if (this._currentLerpTime < this._lerpDuration) {\n const moveEasing = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_5__.EasingFunctions.CreateVectorEasingFunction(this._easing);\n const lerpPoint = moveEasing(this._currentLerpTime, this._lerpStart, this._lerpEnd, this._lerpDuration);\n this.pos = lerpPoint;\n this._currentLerpTime += elapsed;\n }\n else {\n this.pos = this._lerpEnd;\n const end = this._lerpEnd.clone();\n this._lerpStart = null;\n this._lerpEnd = null;\n this._currentLerpTime = 0;\n this._cameraMoving = false;\n // Order matters here, resolve should be last so any chain promises have a clean slate\n this._lerpResolve(end);\n }\n }\n if (this._isDoneShaking()) {\n this._isShaking = false;\n this._elapsedShakeTime = 0;\n this._shakeMagnitudeX = 0;\n this._shakeMagnitudeY = 0;\n this._shakeDuration = 0;\n this._xShake = 0;\n this._yShake = 0;\n }\n else {\n this._elapsedShakeTime += elapsed;\n this._xShake = ((Math.random() * this._shakeMagnitudeX) | 0) + 1;\n this._yShake = ((Math.random() * this._shakeMagnitudeY) | 0) + 1;\n }\n this.runStrategies(engine, elapsed);\n this.updateViewport();\n // It's important to update the camera after strategies\n // This prevents jitter\n this.updateTransform(this.pos);\n this._postupdate(engine, elapsed);\n this._posChanged = false;\n }\n /**\n * Applies the relevant transformations to the game canvas to \"move\" or apply effects to the Camera\n * @param ctx Canvas context to apply transformations\n */\n draw(ctx) {\n // default to the current position\n this.pos.clone(this.drawPos);\n // interpolation if fixed update is on\n // must happen on the draw, because more draws are potentially happening than updates\n if (this._engine.fixedUpdateTimestep) {\n const blend = this._engine.currentFrameLagMs / this._engine.fixedUpdateTimestep;\n const interpolatedPos = this.pos.scale(blend).add(this._oldPos.scale(1.0 - blend));\n interpolatedPos.clone(this.drawPos);\n this.updateTransform(interpolatedPos);\n }\n // Snap camera to pixel\n if (ctx.snapToPixel) {\n const snapPos = this.drawPos.clone(this._snapPos);\n snapPos.x = ~~(snapPos.x + _Graphics__WEBPACK_IMPORTED_MODULE_9__.pixelSnapEpsilon * (0,_Math_util__WEBPACK_IMPORTED_MODULE_10__.sign)(snapPos.x));\n snapPos.y = ~~(snapPos.y + _Graphics__WEBPACK_IMPORTED_MODULE_9__.pixelSnapEpsilon * (0,_Math_util__WEBPACK_IMPORTED_MODULE_10__.sign)(snapPos.y));\n snapPos.clone(this.drawPos);\n this.updateTransform(snapPos);\n }\n ctx.multiply(this.transform);\n }\n updateTransform(pos) {\n // center the camera\n const newCanvasWidth = this._screen.resolution.width / this.zoom;\n const newCanvasHeight = this._screen.resolution.height / this.zoom;\n const cameraPos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(-pos.x + newCanvasWidth / 2 + this._xShake, -pos.y + newCanvasHeight / 2 + this._yShake);\n // Calculate camera transform\n this.transform.reset();\n this.transform.scale(this.zoom, this.zoom);\n // rotate about the focus\n this.transform.translate(newCanvasWidth / 2, newCanvasHeight / 2);\n this.transform.rotate(this.rotation);\n this.transform.translate(-newCanvasWidth / 2, -newCanvasHeight / 2);\n this.transform.translate(cameraPos.x, cameraPos.y);\n this.transform.inverse(this.inverse);\n }\n _isDoneShaking() {\n return !this._isShaking || this._elapsedShakeTime >= this._shakeDuration;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/BodyComponent.ts\":\n/*!************************************!*\\\n !*** ./Collision/BodyComponent.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BodyComponent: () => (/* binding */ BodyComponent),\n/* harmony export */ DegreeOfFreedom: () => (/* binding */ DegreeOfFreedom)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Component */ \"./EntityComponentSystem/Component.ts\");\n/* harmony import */ var _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Group/CollisionGroup */ \"./Collision/Group/CollisionGroup.ts\");\n/* harmony import */ var _Id__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Id */ \"./Id.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _ColliderComponent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./ColliderComponent */ \"./Collision/ColliderComponent.ts\");\n/* harmony import */ var _Math_transform__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Math/transform */ \"./Math/transform.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _PhysicsConfig__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./PhysicsConfig */ \"./Collision/PhysicsConfig.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\nvar DegreeOfFreedom;\n(function (DegreeOfFreedom) {\n DegreeOfFreedom[\"Rotation\"] = \"rotation\";\n DegreeOfFreedom[\"X\"] = \"x\";\n DegreeOfFreedom[\"Y\"] = \"y\";\n})(DegreeOfFreedom || (DegreeOfFreedom = {}));\n/**\n * Body describes all the physical properties pos, vel, acc, rotation, angular velocity for the purpose of\n * of physics simulation.\n */\nclass BodyComponent extends _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor(options) {\n var _a, _b, _c;\n super();\n this.dependencies = [_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent, _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent];\n this.id = (0,_Id__WEBPACK_IMPORTED_MODULE_3__.createId)('body', BodyComponent._ID++);\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_4__.EventEmitter();\n this.oldTransform = new _Math_transform__WEBPACK_IMPORTED_MODULE_5__.Transform();\n /**\n * Indicates whether the old transform has been captured at least once for interpolation\n * @internal\n */\n this.__oldTransformCaptured = false;\n /**\n * Enable or disabled the fixed update interpolation, by default interpolation is on.\n */\n this.enableFixedUpdateInterpolate = true;\n /**\n * Collision type for the rigidbody physics simulation, by default {@apilink CollisionType.PreventCollision}\n */\n this.collisionType = _CollisionType__WEBPACK_IMPORTED_MODULE_6__.CollisionType.PreventCollision;\n /**\n * The collision group for the body's colliders, by default body colliders collide with everything\n */\n this.group = _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_7__.CollisionGroup.All;\n this._sleeping = false;\n /**\n * The also known as coefficient of restitution of this actor, represents the amount of energy preserved after collision or the\n * bounciness. If 1, it is 100% bouncy, 0 it completely absorbs.\n */\n this.bounciness = 0.2;\n /**\n * The coefficient of friction on this actor.\n *\n * The {@apilink SolverStrategy.Arcade} does not support this property.\n *\n */\n this.friction = 0.99;\n /**\n * Should use global gravity {@apilink Physics.gravity} in it's physics simulation, default is true\n */\n this.useGravity = true;\n /**\n * Degrees of freedom to limit\n *\n * Note: this only limits responses in the realistic solver, if velocity/angularVelocity is set the actor will still respond\n */\n this.limitDegreeOfFreedom = [];\n this._oldGlobalPos = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Zero;\n /**\n * The velocity of the actor last frame (vx, vy) in pixels/second\n */\n this.oldVel = new _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector(0, 0);\n /**\n * Gets/sets the acceleration of the actor from the last frame. This does not include the global acc {@apilink Physics.acc}.\n */\n this.oldAcc = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Zero;\n this._impulseScratch = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_8__.vec)(0, 0);\n this._distanceFromCenterScratch = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_8__.vec)(0, 0);\n if (options) {\n this.collisionType = (_a = options.type) !== null && _a !== void 0 ? _a : this.collisionType;\n this.group = (_b = options.group) !== null && _b !== void 0 ? _b : this.group;\n this.useGravity = (_c = options.useGravity) !== null && _c !== void 0 ? _c : this.useGravity;\n this._bodyConfig = {\n ...(0,_PhysicsConfig__WEBPACK_IMPORTED_MODULE_9__.getDefaultPhysicsConfig)().bodies,\n ...options.config\n };\n }\n else {\n this._bodyConfig = {\n ...(0,_PhysicsConfig__WEBPACK_IMPORTED_MODULE_9__.getDefaultPhysicsConfig)().bodies\n };\n }\n this.updatePhysicsConfig(this._bodyConfig);\n this._mass = BodyComponent._DEFAULT_CONFIG.defaultMass;\n }\n get matrix() {\n return this.transform.get().matrix;\n }\n /**\n * Called by excalibur to update physics config defaults if they change\n * @param config\n */\n updatePhysicsConfig(config) {\n this._bodyConfig = {\n ...(0,_PhysicsConfig__WEBPACK_IMPORTED_MODULE_9__.getDefaultPhysicsConfig)().bodies,\n ...config\n };\n this.canSleep = this._bodyConfig.canSleepByDefault;\n this.sleepMotion = this._bodyConfig.sleepEpsilon * 5;\n this.wakeThreshold = this._bodyConfig.wakeThreshold;\n }\n /**\n * Called by excalibur to update defaults\n * @param config\n */\n static updateDefaultPhysicsConfig(config) {\n BodyComponent._DEFAULT_CONFIG = config;\n }\n get mass() {\n return this._mass;\n }\n set mass(newMass) {\n this._mass = newMass;\n this._cachedInertia = undefined;\n this._cachedInverseInertia = undefined;\n }\n /**\n * The inverse mass (1/mass) of the body. If {@apilink CollisionType.Fixed} this is 0, meaning \"infinite\" mass\n */\n get inverseMass() {\n return this.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_6__.CollisionType.Fixed ? 0 : 1 / this.mass;\n }\n /**\n * Whether this body is sleeping or not\n * @deprecated use isSleeping\n */\n get sleeping() {\n return this.isSleeping;\n }\n /**\n * Whether this body is sleeping or not\n */\n get isSleeping() {\n return this._sleeping;\n }\n /**\n * Set the sleep state of the body\n * @param sleeping\n * @deprecated use isSleeping\n */\n setSleeping(sleeping) {\n this.isSleeping = sleeping;\n }\n set isSleeping(sleeping) {\n this._sleeping = sleeping;\n if (!sleeping) {\n // Give it a kick to keep it from falling asleep immediately\n this.sleepMotion = this._bodyConfig.sleepEpsilon * 5;\n }\n else {\n this.vel = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Zero;\n this.acc = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Zero;\n this.angularVelocity = 0;\n this.sleepMotion = 0;\n }\n }\n /**\n * Update body's {@apilink BodyComponent.sleepMotion} for the purpose of sleeping\n */\n updateMotion() {\n if (this._sleeping) {\n this.isSleeping = true;\n }\n const currentMotion = this.vel.magnitude * this.vel.magnitude + Math.abs(this.angularVelocity * this.angularVelocity);\n const bias = this._bodyConfig.sleepBias;\n this.sleepMotion = bias * this.sleepMotion + (1 - bias) * currentMotion;\n this.sleepMotion = (0,_Math_util__WEBPACK_IMPORTED_MODULE_10__.clamp)(this.sleepMotion, 0, 10 * this._bodyConfig.sleepEpsilon);\n if (this.canSleep && this.sleepMotion < this._bodyConfig.sleepEpsilon) {\n this.isSleeping = true;\n }\n }\n /**\n * Get the moment of inertia from the {@apilink ColliderComponent}\n */\n get inertia() {\n if (this._cachedInertia) {\n return this._cachedInertia;\n }\n // Inertia is a property of the geometry, so this is a little goofy but seems to be okay?\n const collider = this.owner.get(_ColliderComponent__WEBPACK_IMPORTED_MODULE_11__.ColliderComponent);\n if (collider) {\n collider.$colliderAdded.subscribe(() => {\n this._cachedInertia = null;\n });\n collider.$colliderRemoved.subscribe(() => {\n this._cachedInertia = null;\n });\n const maybeCollider = collider.get();\n if (maybeCollider) {\n return (this._cachedInertia = maybeCollider.getInertia(this.mass));\n }\n }\n return 0;\n }\n /**\n * Get the inverse moment of inertial from the {@apilink ColliderComponent}. If {@apilink CollisionType.Fixed} this is 0, meaning \"infinite\" mass\n */\n get inverseInertia() {\n if (this._cachedInverseInertia) {\n return this._cachedInverseInertia;\n }\n return (this._cachedInverseInertia = this.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_6__.CollisionType.Fixed ? 0 : 1 / this.inertia);\n }\n /**\n * Returns if the owner is active\n * @deprecated use isActive\n */\n get active() {\n var _a;\n return !!((_a = this.owner) === null || _a === void 0 ? void 0 : _a.isActive);\n }\n /**\n * Returns if the owner is active\n */\n get isActive() {\n var _a;\n return !!((_a = this.owner) === null || _a === void 0 ? void 0 : _a.isActive);\n }\n /**\n * @deprecated Use globalPos\n */\n get center() {\n return this.globalPos;\n }\n onAdd(owner) {\n var _a, _b;\n this.transform = (_a = this.owner) === null || _a === void 0 ? void 0 : _a.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this.motion = (_b = this.owner) === null || _b === void 0 ? void 0 : _b.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n }\n get pos() {\n return this.transform.pos;\n }\n set pos(val) {\n this.transform.pos = val;\n }\n /**\n * The (x, y) position of the actor this will be in the middle of the actor if the\n * {@apilink Actor.anchor} is set to (0.5, 0.5) which is default.\n * If you want the (x, y) position to be the top left of the actor specify an anchor of (0, 0).\n */\n get globalPos() {\n return this.transform.globalPos;\n }\n set globalPos(val) {\n this.transform.globalPos = val;\n }\n /**\n * The position of the actor last frame (x, y) in pixels\n */\n get oldPos() {\n return this.oldTransform.pos;\n }\n /**\n * The global position of the actor last frame (x, y) in pixels\n */\n get oldGlobalPos() {\n return this._oldGlobalPos;\n }\n /**\n * The current velocity vector (vx, vy) of the actor in pixels/second\n */\n get vel() {\n return this.motion.vel;\n }\n set vel(val) {\n this.motion.vel = val;\n }\n /**\n * The current acceleration vector (ax, ay) of the actor in pixels/second/second. An acceleration pointing down such as (0, 100) may\n * be useful to simulate a gravitational effect.\n */\n get acc() {\n return this.motion.acc;\n }\n set acc(val) {\n this.motion.acc = val;\n }\n /**\n * The current torque applied to the actor\n */\n get torque() {\n return this.motion.torque;\n }\n set torque(val) {\n this.motion.torque = val;\n }\n /**\n * Gets/sets the rotation of the body from the last frame.\n */\n get oldRotation() {\n return this.oldTransform.rotation;\n }\n /**\n * The rotation of the body in radians\n */\n get rotation() {\n return this.transform.globalRotation;\n }\n set rotation(val) {\n this.transform.globalRotation = val;\n }\n /**\n * The scale vector of the actor\n */\n get scale() {\n return this.transform.globalScale;\n }\n set scale(val) {\n this.transform.globalScale = val;\n }\n /**\n * The scale of the actor last frame\n */\n get oldScale() {\n return this.oldTransform.scale;\n }\n /**\n * The scale rate of change of the actor in scale/second\n */\n get scaleFactor() {\n return this.motion.scaleFactor;\n }\n set scaleFactor(scaleFactor) {\n this.motion.scaleFactor = scaleFactor;\n }\n /**\n * Get the angular velocity in radians/second\n */\n get angularVelocity() {\n return this.motion.angularVelocity;\n }\n /**\n * Set the angular velocity in radians/second\n */\n set angularVelocity(value) {\n this.motion.angularVelocity = value;\n }\n /**\n * Apply a specific impulse to the body\n * @param point\n * @param impulse\n */\n applyImpulse(point, impulse) {\n if (this.collisionType !== _CollisionType__WEBPACK_IMPORTED_MODULE_6__.CollisionType.Active) {\n return; // only active objects participate in the simulation\n }\n const finalImpulse = impulse.scale(this.inverseMass, this._impulseScratch);\n if (this.limitDegreeOfFreedom.indexOf(DegreeOfFreedom.X) > -1) {\n finalImpulse.x = 0;\n }\n if (this.limitDegreeOfFreedom.indexOf(DegreeOfFreedom.Y) > -1) {\n finalImpulse.y = 0;\n }\n this.vel.addEqual(finalImpulse);\n if (!this.limitDegreeOfFreedom.includes(DegreeOfFreedom.Rotation)) {\n const distanceFromCenter = point.sub(this.globalPos, this._distanceFromCenterScratch);\n this.angularVelocity += this.inverseInertia * distanceFromCenter.cross(impulse);\n }\n }\n /**\n * Apply only linear impulse to the body\n * @param impulse\n */\n applyLinearImpulse(impulse) {\n if (this.collisionType !== _CollisionType__WEBPACK_IMPORTED_MODULE_6__.CollisionType.Active) {\n return; // only active objects participate in the simulation\n }\n const finalImpulse = impulse.scale(this.inverseMass);\n if (this.limitDegreeOfFreedom.includes(DegreeOfFreedom.X)) {\n finalImpulse.x = 0;\n }\n if (this.limitDegreeOfFreedom.includes(DegreeOfFreedom.Y)) {\n finalImpulse.y = 0;\n }\n this.vel = this.vel.add(finalImpulse);\n }\n /**\n * Apply only angular impulse to the body\n * @param point\n * @param impulse\n */\n applyAngularImpulse(point, impulse) {\n if (this.collisionType !== _CollisionType__WEBPACK_IMPORTED_MODULE_6__.CollisionType.Active) {\n return; // only active objects participate in the simulation\n }\n if (!this.limitDegreeOfFreedom.includes(DegreeOfFreedom.Rotation)) {\n const distanceFromCenter = point.sub(this.globalPos);\n this.angularVelocity += this.inverseInertia * distanceFromCenter.cross(impulse);\n }\n }\n /**\n * Sets the old versions of pos, vel, acc, and scale.\n */\n captureOldTransform() {\n // Capture old values before integration step updates them\n this.__oldTransformCaptured = true;\n const tx = this.transform.get();\n tx.clone(this.oldTransform);\n this.oldTransform.parent = tx.parent; // also grab parent\n this.oldVel.setTo(this.vel.x, this.vel.y);\n this.oldAcc.setTo(this.acc.x, this.acc.y);\n this.oldGlobalPos.setTo(this.globalPos.x, this.globalPos.y);\n }\n clone() {\n const component = super.clone();\n return component;\n }\n}\nBodyComponent._ID = 0;\nBodyComponent._DEFAULT_CONFIG = {\n ...(0,_PhysicsConfig__WEBPACK_IMPORTED_MODULE_9__.getDefaultPhysicsConfig)().bodies\n};\n\n\n/***/ }),\n\n/***/ \"./Collision/BoundingBox.ts\":\n/*!**********************************!*\\\n !*** ./Collision/BoundingBox.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BoundingBox: () => (/* binding */ BoundingBox)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Side__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Side */ \"./Collision/Side.ts\");\n\n\n\n/**\n * Axis Aligned collision primitive for Excalibur.\n */\nclass BoundingBox {\n /**\n * Constructor allows passing of either an object with all coordinate components,\n * or the coordinate components passed separately.\n * @param leftOrOptions Either x coordinate of the left edge or an options object\n * containing the four coordinate components.\n * @param top y coordinate of the top edge\n * @param right x coordinate of the right edge\n * @param bottom y coordinate of the bottom edge\n */\n constructor(leftOrOptions = 0, top = 0, right = 0, bottom = 0) {\n // Cache bounding box point returns\n this._points = [];\n if (typeof leftOrOptions === 'object') {\n this.left = leftOrOptions.left;\n this.top = leftOrOptions.top;\n this.right = leftOrOptions.right;\n this.bottom = leftOrOptions.bottom;\n }\n else if (typeof leftOrOptions === 'number') {\n this.left = leftOrOptions;\n this.top = top;\n this.right = right;\n this.bottom = bottom;\n }\n }\n /**\n * Returns a new instance of {@apilink BoundingBox} that is a copy of the current instance\n */\n clone(dest) {\n const result = dest || new BoundingBox(0, 0, 0, 0);\n result.left = this.left;\n result.right = this.right;\n result.top = this.top;\n result.bottom = this.bottom;\n return result;\n }\n /**\n * Resets the bounds to a zero width/height box\n */\n reset() {\n this.left = 0;\n this.top = 0;\n this.bottom = 0;\n this.right = 0;\n }\n /**\n * Given bounding box A & B, returns the side relative to A when intersection is performed.\n * @param intersection Intersection vector between 2 bounding boxes\n */\n static getSideFromIntersection(intersection) {\n if (!intersection) {\n return _Side__WEBPACK_IMPORTED_MODULE_0__.Side.None;\n }\n if (intersection) {\n if (Math.abs(intersection.x) > Math.abs(intersection.y)) {\n if (intersection.x < 0) {\n return _Side__WEBPACK_IMPORTED_MODULE_0__.Side.Right;\n }\n return _Side__WEBPACK_IMPORTED_MODULE_0__.Side.Left;\n }\n else {\n if (intersection.y < 0) {\n return _Side__WEBPACK_IMPORTED_MODULE_0__.Side.Bottom;\n }\n return _Side__WEBPACK_IMPORTED_MODULE_0__.Side.Top;\n }\n }\n return _Side__WEBPACK_IMPORTED_MODULE_0__.Side.None;\n }\n static fromPoints(points) {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (let i = 0; i < points.length; i++) {\n if (points[i].x < minX) {\n minX = points[i].x;\n }\n if (points[i].x > maxX) {\n maxX = points[i].x;\n }\n if (points[i].y < minY) {\n minY = points[i].y;\n }\n if (points[i].y > maxY) {\n maxY = points[i].y;\n }\n }\n return new BoundingBox(minX, minY, maxX, maxY);\n }\n /**\n * Creates a bounding box from a width and height\n * @param width\n * @param height\n * @param anchor Default Vector.Half\n * @param pos Default Vector.Zero\n */\n static fromDimension(width, height, anchor = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Half, pos = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero) {\n return new BoundingBox(-width * anchor.x + pos.x, -height * anchor.y + pos.y, width - width * anchor.x + pos.x, height - height * anchor.y + pos.y);\n }\n /**\n * Returns the calculated width of the bounding box\n */\n get width() {\n return this.right - this.left;\n }\n /**\n * Returns the calculated height of the bounding box\n */\n get height() {\n return this.bottom - this.top;\n }\n /**\n * Return whether the bounding box has zero dimensions in height,width or both\n */\n hasZeroDimensions() {\n return this.width === 0 || this.height === 0;\n }\n /**\n * Returns the center of the bounding box\n */\n get center() {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector((this.left + this.right) / 2, (this.top + this.bottom) / 2);\n }\n get topLeft() {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.left, this.top);\n }\n get bottomRight() {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.right, this.bottom);\n }\n get topRight() {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.right, this.top);\n }\n get bottomLeft() {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.left, this.bottom);\n }\n translate(pos) {\n return new BoundingBox(this.left + pos.x, this.top + pos.y, this.right + pos.x, this.bottom + pos.y);\n }\n /**\n * Rotates a bounding box by and angle and around a point, if no point is specified (0, 0) is used by default. The resulting bounding\n * box is also axis-align. This is useful when a new axis-aligned bounding box is needed for rotated geometry.\n */\n rotate(angle, point = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero) {\n const points = this.getPoints().map((p) => p.rotate(angle, point));\n return BoundingBox.fromPoints(points);\n }\n /**\n * Scale a bounding box by a scale factor, optionally provide a point\n * @param scale\n * @param point\n */\n scale(scale, point = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero) {\n const shifted = this.translate(point);\n return new BoundingBox(shifted.left * scale.x, shifted.top * scale.y, shifted.right * scale.x, shifted.bottom * scale.y);\n }\n /**\n * Transform the axis aligned bounding box by a {@apilink Matrix}, producing a new axis aligned bounding box\n * @param matrix\n */\n transform(matrix) {\n // inlined these calculations to not use vectors would speed it up slightly\n // const matFirstColumn = vec(matrix.data[0], matrix.data[1]);\n // const xa = matFirstColumn.scale(this.left);\n const xa1 = matrix.data[0] * this.left;\n const xa2 = matrix.data[1] * this.left;\n // const xb = matFirstColumn.scale(this.right);\n const xb1 = matrix.data[0] * this.right;\n const xb2 = matrix.data[1] * this.right;\n // const matSecondColumn = vec(matrix.data[2], matrix.data[3]);\n // const ya = matSecondColumn.scale(this.top);\n const ya1 = matrix.data[2] * this.top;\n const ya2 = matrix.data[3] * this.top;\n // const yb = matSecondColumn.scale(this.bottom);\n const yb1 = matrix.data[2] * this.bottom;\n const yb2 = matrix.data[3] * this.bottom;\n const matrixPos = matrix.getPosition();\n // const topLeft = Vector.min(xa, xb).add(Vector.min(ya, yb)).add(matrixPos);\n // const bottomRight = Vector.max(xa, xb).add(Vector.max(ya, yb)).add(matrixPos);\n const left = Math.min(xa1, xb1) + Math.min(ya1, yb1) + matrixPos.x;\n const top = Math.min(xa2, xb2) + Math.min(ya2, yb2) + matrixPos.y;\n const right = Math.max(xa1, xb1) + Math.max(ya1, yb1) + matrixPos.x;\n const bottom = Math.max(xa2, xb2) + Math.max(ya2, yb2) + matrixPos.y;\n return new BoundingBox({\n left, //: topLeft.x,\n top, //: topLeft.y,\n right, //: bottomRight.x,\n bottom //: bottomRight.y\n });\n }\n /**\n * Returns the perimeter of the bounding box\n */\n getPerimeter() {\n const wx = this.width;\n const wy = this.height;\n return 2 * (wx + wy);\n }\n /**\n * Returns the world space points that make up the corners of the bounding box as a polygon\n */\n getPoints() {\n if (this._left !== this.left || this._right !== this.right || this._top !== this.top || this._bottom !== this.bottom) {\n this._points.length = 0;\n this._points.push(new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.left, this.top));\n this._points.push(new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.right, this.top));\n this._points.push(new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.right, this.bottom));\n this._points.push(new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.left, this.bottom));\n this._left = this.left;\n this._right = this.right;\n this._top = this.top;\n this._bottom = this.bottom;\n }\n return this._points;\n }\n /**\n * Determines whether a ray intersects with a bounding box\n */\n rayCast(ray, farClipDistance = Infinity) {\n // algorithm from https://tavianator.com/fast-branchless-raybounding-box-intersections/\n let tMin = -Infinity;\n let tMax = +Infinity;\n const xInv = ray.dir.x === 0 ? Number.MAX_VALUE : 1 / ray.dir.x;\n const yInv = ray.dir.y === 0 ? Number.MAX_VALUE : 1 / ray.dir.y;\n const tx1 = (this.left - ray.pos.x) * xInv;\n const tx2 = (this.right - ray.pos.x) * xInv;\n tMin = Math.min(tx1, tx2);\n tMax = Math.max(tx1, tx2);\n const ty1 = (this.top - ray.pos.y) * yInv;\n const ty2 = (this.bottom - ray.pos.y) * yInv;\n tMin = Math.max(tMin, Math.min(ty1, ty2));\n tMax = Math.min(tMax, Math.max(ty1, ty2));\n return tMax >= Math.max(0, tMin) && tMin < farClipDistance;\n }\n rayCastTime(ray, farClipDistance = Infinity) {\n // algorithm from https://tavianator.com/fast-branchless-raybounding-box-intersections/\n let tMin = -Infinity;\n let tMax = +Infinity;\n const xInv = ray.dir.x === 0 ? Number.MAX_VALUE : 1 / ray.dir.x;\n const yInv = ray.dir.y === 0 ? Number.MAX_VALUE : 1 / ray.dir.y;\n const tx1 = (this.left - ray.pos.x) * xInv;\n const tx2 = (this.right - ray.pos.x) * xInv;\n tMin = Math.min(tx1, tx2);\n tMax = Math.max(tx1, tx2);\n const ty1 = (this.top - ray.pos.y) * yInv;\n const ty2 = (this.bottom - ray.pos.y) * yInv;\n tMin = Math.max(tMin, Math.min(ty1, ty2));\n tMax = Math.min(tMax, Math.max(ty1, ty2));\n if (tMax >= Math.max(0, tMin) && tMin < farClipDistance) {\n return tMin;\n }\n return -1;\n }\n contains(val) {\n if (val instanceof _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector) {\n return this.left <= val.x && this.top <= val.y && val.y <= this.bottom && val.x <= this.right;\n }\n else if (val instanceof BoundingBox) {\n return this.left <= val.left && this.top <= val.top && val.bottom <= this.bottom && val.right <= this.right;\n }\n return false;\n }\n /**\n * Combines this bounding box and another together returning a new bounding box\n * @param other The bounding box to combine\n */\n combine(other, dest) {\n const compositeBB = dest || new BoundingBox(0, 0, 0, 0);\n const left = Math.min(this.left, other.left);\n const top = Math.min(this.top, other.top);\n const right = Math.max(this.right, other.right);\n const bottom = Math.max(this.bottom, other.bottom);\n compositeBB.left = left;\n compositeBB.top = top;\n compositeBB.right = right;\n compositeBB.bottom = bottom;\n return compositeBB;\n }\n get dimensions() {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.width, this.height);\n }\n /**\n * Returns true if the bounding boxes overlap.\n * @param other\n * @param epsilon Optionally specify a small epsilon (default 0) as amount of overlap to ignore as overlap.\n * This epsilon is useful in stable collision simulations.\n */\n overlaps(other, epsilon) {\n const e = epsilon || 0;\n if (other.hasZeroDimensions()) {\n return this.contains(other);\n }\n if (this.hasZeroDimensions()) {\n return other.contains(this);\n }\n const totalBoundingBox = this.combine(other);\n return totalBoundingBox.width + e < other.width + this.width && totalBoundingBox.height + e < other.height + this.height;\n }\n /**\n * Test wether this bounding box intersects with another returning\n * the intersection vector that can be used to resolve the collision. If there\n * is no intersection null is returned.\n * @param other Other {@apilink BoundingBox} to test intersection with\n * @returns A Vector in the direction of the current BoundingBox, this <- other\n */\n intersect(other) {\n const totalBoundingBox = this.combine(other);\n // If the total bounding box is less than or equal the sum of the 2 bounds then there is collision\n if (totalBoundingBox.width < other.width + this.width &&\n totalBoundingBox.height < other.height + this.height &&\n !totalBoundingBox.dimensions.equals(other.dimensions) &&\n !totalBoundingBox.dimensions.equals(this.dimensions)) {\n // collision\n let overlapX = 0;\n // right edge is between the other's left and right edge\n /**\n * +-this-+\n * | |\n * | +-other-+\n * +----|-+ |\n * | |\n * +-------+\n * <---\n * ^ overlap\n */\n if (this.right >= other.left && this.right <= other.right) {\n overlapX = other.left - this.right;\n // right edge is past the other's right edge\n /**\n * +-other-+\n * | |\n * | +-this-+\n * +----|--+ |\n * | |\n * +------+\n * --->\n * ^ overlap\n */\n }\n else {\n overlapX = other.right - this.left;\n }\n let overlapY = 0;\n // top edge is between the other's top and bottom edge\n /**\n * +-other-+\n * | |\n * | +-this-+ | <- overlap\n * +----|--+ | |\n * | | \\ /\n * +------+ '\n */\n if (this.top <= other.bottom && this.top >= other.top) {\n overlapY = other.bottom - this.top;\n // top edge is above the other top edge\n /**\n * +-this-+ .\n * | | / \\\n * | +-other-+ | <- overlap\n * +----|-+ | |\n * | |\n * +-------+\n */\n }\n else {\n overlapY = other.top - this.bottom;\n }\n if (Math.abs(overlapX) < Math.abs(overlapY)) {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(overlapX, 0);\n }\n else {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(0, overlapY);\n }\n // Case of total containment of one bounding box by another\n }\n else if (totalBoundingBox.dimensions.equals(other.dimensions) || totalBoundingBox.dimensions.equals(this.dimensions)) {\n let overlapX = 0;\n // this is wider than the other\n if (this.width - other.width >= 0) {\n // This right edge is closest to the others right edge\n if (this.right - other.right <= other.left - this.left) {\n overlapX = other.left - this.right;\n // This left edge is closest to the others left edge\n }\n else {\n overlapX = other.right - this.left;\n }\n // other is wider than this\n }\n else {\n // This right edge is closest to the others right edge\n if (other.right - this.right <= this.left - other.left) {\n overlapX = this.left - other.right;\n // This left edge is closest to the others left edge\n }\n else {\n overlapX = this.right - other.left;\n }\n }\n let overlapY = 0;\n // this is taller than other\n if (this.height - other.height >= 0) {\n // The bottom edge is closest to the others bottom edge\n if (this.bottom - other.bottom <= other.top - this.top) {\n overlapY = other.top - this.bottom;\n }\n else {\n overlapY = other.bottom - this.top;\n }\n // other is taller than this\n }\n else {\n // The bottom edge is closest to the others bottom edge\n if (other.bottom - this.bottom <= this.top - other.top) {\n overlapY = this.top - other.bottom;\n }\n else {\n overlapY = this.bottom - other.top;\n }\n }\n if (Math.abs(overlapX) < Math.abs(overlapY)) {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(overlapX, 0);\n }\n else {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(0, overlapY);\n }\n }\n else {\n return null;\n }\n }\n /**\n * Test whether the bounding box has intersected with another bounding box, returns the side of the current bb that intersected.\n * @param bb The other actor to test\n */\n intersectWithSide(bb) {\n const intersect = this.intersect(bb);\n return BoundingBox.getSideFromIntersection(intersect);\n }\n /**\n * Draw a debug bounding box\n * @param ex\n * @param color\n */\n draw(ex, color = _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Yellow) {\n ex.debug.drawRect(this.left, this.top, this.width, this.height, { color });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/ColliderComponent.ts\":\n/*!****************************************!*\\\n !*** ./Collision/ColliderComponent.ts ***!\n \\****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ColliderComponent: () => (/* binding */ ColliderComponent)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Component */ \"./EntityComponentSystem/Component.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _Util_Observable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Util/Observable */ \"./Util/Observable.ts\");\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Colliders/CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var _Colliders_Shape__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Colliders/Shape */ \"./Collision/Colliders/Shape.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Actor__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Actor */ \"./Actor.ts\");\n\n\n\n\n\n\n\n\n\n\nclass ColliderComponent extends _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor(collider) {\n super();\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_1__.EventEmitter();\n /**\n * Observable that notifies when a collider is added to the body\n */\n this.$colliderAdded = new _Util_Observable__WEBPACK_IMPORTED_MODULE_2__.Observable();\n /**\n * Observable that notifies when a collider is removed from the body\n */\n this.$colliderRemoved = new _Util_Observable__WEBPACK_IMPORTED_MODULE_2__.Observable();\n this._collidersToRemove = [];\n this.set(collider);\n }\n /**\n * Get the current collider geometry\n */\n get() {\n return this._collider;\n }\n /**\n * Set the collider geometry\n * @param collider\n * @returns the collider you set\n */\n set(collider) {\n this.clear();\n if (collider) {\n this._collider = collider;\n this._collider.owner = this.owner;\n collider.events.pipe(this.events);\n this.$colliderAdded.notifyAll(collider);\n this.update();\n }\n return collider;\n }\n /**\n * Remove collider geometry from collider component\n */\n clear() {\n if (this._collider) {\n this._collidersToRemove.push(this._collider);\n this._collider = null;\n }\n }\n processColliderRemoval() {\n for (const collider of this._collidersToRemove) {\n collider.events.unpipe(this.events);\n this.$colliderRemoved.notifyAll(collider);\n collider.owner = null;\n }\n }\n clone() {\n const clone = new ColliderComponent(this._collider.clone());\n return clone;\n }\n /**\n * Return world space bounds\n */\n get bounds() {\n var _a, _b;\n return (_b = (_a = this._collider) === null || _a === void 0 ? void 0 : _a.bounds) !== null && _b !== void 0 ? _b : new _BoundingBox__WEBPACK_IMPORTED_MODULE_3__.BoundingBox();\n }\n /**\n * Return local space bounds\n */\n get localBounds() {\n var _a, _b;\n return (_b = (_a = this._collider) === null || _a === void 0 ? void 0 : _a.localBounds) !== null && _b !== void 0 ? _b : new _BoundingBox__WEBPACK_IMPORTED_MODULE_3__.BoundingBox();\n }\n /**\n * Update the collider's transformed geometry\n */\n update() {\n var _a;\n const tx = (_a = this.owner) === null || _a === void 0 ? void 0 : _a.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__.TransformComponent);\n if (this._collider) {\n this._collider.owner = this.owner;\n if (tx) {\n this._collider.update(tx.get());\n }\n }\n }\n /**\n * Collide component with another\n * @param other\n */\n collide(other) {\n let colliderA = this._collider;\n let colliderB = other._collider;\n if (!colliderA || !colliderB) {\n return [];\n }\n // If we have a composite left hand side :(\n // Might bite us, but to avoid updating all the handlers make composite always left side\n let flipped = false;\n if (colliderB instanceof _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_5__.CompositeCollider) {\n colliderA = colliderB;\n colliderB = this._collider;\n flipped = true;\n }\n if (this._collider) {\n const contacts = colliderA.collide(colliderB);\n if (contacts) {\n if (flipped) {\n contacts.forEach((contact) => {\n contact.mtv = contact.mtv.negate();\n contact.normal = contact.normal.negate();\n contact.tangent = contact.normal.perpendicular();\n contact.colliderA = this._collider;\n contact.colliderB = other._collider;\n });\n }\n return contacts;\n }\n return [];\n }\n return [];\n }\n onAdd(entity) {\n if (this._collider) {\n this.update();\n }\n // Wire up the collider events to the owning entity\n this.events.on('precollision', (evt) => {\n const precollision = evt;\n entity.events.emit('precollision', new _Events__WEBPACK_IMPORTED_MODULE_6__.PreCollisionEvent(precollision.self, precollision.other, precollision.side, precollision.intersection, precollision.contact));\n if (entity instanceof _Actor__WEBPACK_IMPORTED_MODULE_7__.Actor) {\n entity.onPreCollisionResolve(precollision.self, precollision.other, precollision.side, precollision.contact);\n }\n });\n this.events.on('postcollision', (evt) => {\n const postcollision = evt;\n entity.events.emit('postcollision', new _Events__WEBPACK_IMPORTED_MODULE_6__.PostCollisionEvent(postcollision.self, postcollision.other, postcollision.side, postcollision.intersection, postcollision.contact));\n if (entity instanceof _Actor__WEBPACK_IMPORTED_MODULE_7__.Actor) {\n entity.onPostCollisionResolve(postcollision.self, postcollision.other, postcollision.side, postcollision.contact);\n }\n });\n this.events.on('collisionstart', (evt) => {\n const start = evt;\n entity.events.emit('collisionstart', new _Events__WEBPACK_IMPORTED_MODULE_6__.CollisionStartEvent(start.self, start.other, start.side, start.contact));\n if (entity instanceof _Actor__WEBPACK_IMPORTED_MODULE_7__.Actor) {\n entity.onCollisionStart(start.self, start.other, start.side, start.contact);\n }\n });\n this.events.on('collisionend', (evt) => {\n const end = evt;\n entity.events.emit('collisionend', new _Events__WEBPACK_IMPORTED_MODULE_6__.CollisionEndEvent(end.self, end.other, end.side, end.lastContact));\n if (entity instanceof _Actor__WEBPACK_IMPORTED_MODULE_7__.Actor) {\n entity.onCollisionEnd(end.self, end.other, end.side, end.lastContact);\n }\n });\n }\n onRemove() {\n this.events.clear();\n this.$colliderRemoved.notifyAll(this._collider);\n }\n /**\n * Sets up a box geometry based on the current bounds of the associated actor of this physics body.\n *\n * If no width/height are specified the body will attempt to use the associated actor's width/height.\n *\n * By default, the box is center is at (0, 0) which means it is centered around the actors anchor.\n */\n useBoxCollider(width, height, anchor = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Half, center = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Zero) {\n const collider = _Colliders_Shape__WEBPACK_IMPORTED_MODULE_9__.Shape.Box(width, height, anchor, center);\n return this.set(collider);\n }\n /**\n * Sets up a {@apilink PolygonCollider | `polygon`} collision geometry based on a list of of points relative\n * to the anchor of the associated actor\n * of this physics body.\n *\n * Only [convex polygon](https://en.wikipedia.org/wiki/Convex_polygon) definitions are supported.\n *\n * By default, the box is center is at (0, 0) which means it is centered around the actors anchor.\n */\n usePolygonCollider(points, center = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Zero) {\n const poly = _Colliders_Shape__WEBPACK_IMPORTED_MODULE_9__.Shape.Polygon(points, center);\n return this.set(poly);\n }\n /**\n * Sets up a {@apilink Circle | `circle collision geometry`} as the only collider with a specified radius in pixels.\n *\n * By default, the box is center is at (0, 0) which means it is centered around the actors anchor.\n */\n useCircleCollider(radius, center = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Zero) {\n const collider = _Colliders_Shape__WEBPACK_IMPORTED_MODULE_9__.Shape.Circle(radius, center);\n return this.set(collider);\n }\n /**\n * Sets up an {@apilink Edge | `edge collision geometry`} with a start point and an end point relative to the anchor of the associated actor\n * of this physics body.\n *\n * By default, the box is center is at (0, 0) which means it is centered around the actors anchor.\n */\n useEdgeCollider(begin, end) {\n const collider = _Colliders_Shape__WEBPACK_IMPORTED_MODULE_9__.Shape.Edge(begin, end);\n return this.set(collider);\n }\n /**\n * Setups up a {@apilink CompositeCollider} which can define any arbitrary set of excalibur colliders\n * @param colliders\n */\n useCompositeCollider(colliders) {\n return this.set(new _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_5__.CompositeCollider(colliders));\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/CircleCollider.ts\":\n/*!***********************************************!*\\\n !*** ./Collision/Colliders/CircleCollider.ts ***!\n \\***********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CircleCollider: () => (/* binding */ CircleCollider)\n/* harmony export */ });\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./CollisionJumpTable */ \"./Collision/Colliders/CollisionJumpTable.ts\");\n/* harmony import */ var _PolygonCollider__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./PolygonCollider */ \"./Collision/Colliders/PolygonCollider.ts\");\n/* harmony import */ var _EdgeCollider__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./EdgeCollider */ \"./Collision/Colliders/EdgeCollider.ts\");\n/* harmony import */ var _Math_projection__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../Math/projection */ \"./Math/projection.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../Color */ \"./Color.ts\");\n/* harmony import */ var _Collider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Collider */ \"./Collision/Colliders/Collider.ts\");\n/* harmony import */ var _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./ClosestLineJumpTable */ \"./Collision/Colliders/ClosestLineJumpTable.ts\");\n/* harmony import */ var _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math/affine-matrix */ \"./Math/affine-matrix.ts\");\n/* harmony import */ var _Index__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Index */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math/util */ \"./Math/util.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * This is a circle collider for the excalibur rigid body physics simulation\n */\nclass CircleCollider extends _Collider__WEBPACK_IMPORTED_MODULE_0__.Collider {\n get worldPos() {\n return this._globalMatrix.getPosition();\n }\n /**\n * Get the radius of the circle\n */\n get radius() {\n var _a;\n if (this._radius) {\n return this._radius;\n }\n const tx = this._transform;\n const scale = (_a = tx === null || tx === void 0 ? void 0 : tx.globalScale) !== null && _a !== void 0 ? _a : _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.One;\n // This is a trade off, the alternative is retooling circles to support ellipse collisions\n return (this._radius = this._naturalRadius * Math.min(scale.x, scale.y));\n }\n /**\n * Set the radius of the circle\n */\n set radius(val) {\n var _a;\n const tx = this._transform;\n const scale = (_a = tx === null || tx === void 0 ? void 0 : tx.globalScale) !== null && _a !== void 0 ? _a : _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.One;\n // This is a trade off, the alternative is retooling circles to support ellipse collisions\n this._naturalRadius = val / Math.min(scale.x, scale.y);\n this._localBoundsDirty = true;\n this._radius = val;\n }\n constructor(options) {\n super();\n /**\n * Position of the circle relative to the collider, by default (0, 0).\n */\n this.offset = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n this._globalMatrix = _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_2__.AffineMatrix.identity();\n this._localBoundsDirty = true;\n this.offset = options.offset || _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n this.radius = options.radius || 0;\n this._globalMatrix.translate(this.offset.x, this.offset.y);\n }\n /**\n * Returns a clone of this shape, not associated with any collider\n */\n clone() {\n return new CircleCollider({\n offset: this.offset.clone(),\n radius: this.radius\n });\n }\n /**\n * Get the center of the collider in world coordinates\n */\n get center() {\n return this._globalMatrix.getPosition();\n }\n /**\n * Tests if a point is contained in this collider\n */\n contains(point) {\n var _a, _b;\n const pos = (_b = (_a = this._transform) === null || _a === void 0 ? void 0 : _a.pos) !== null && _b !== void 0 ? _b : this.offset;\n const distance = pos.distance(point);\n if (distance <= this.radius) {\n return true;\n }\n return false;\n }\n /**\n * Casts a ray at the Circle collider and returns the nearest point of collision\n * @param ray\n */\n rayCast(ray, max = Infinity) {\n var _a, _b;\n // https://en.wikipedia.org/wiki/Intersection_(geometry)#A_line_and_a_circle\n const c = this.center;\n const dir = ray.dir;\n const orig = ray.pos;\n const u = c.sub(orig);\n const u1 = dir.scale(u.dot(dir));\n const u2 = u.sub(u1);\n const d = u2.magnitude;\n if (d > this.radius) {\n return null;\n }\n else {\n // tangent case\n let toi = 0;\n if ((0,_Math_util__WEBPACK_IMPORTED_MODULE_3__.approximatelyEqual)(d, this.radius, 0.0001)) {\n toi = -dir.dot(orig.sub(c));\n if (toi > 0 && toi < max) {\n const point = ray.getPoint(toi);\n return {\n point,\n normal: point.sub(c).normalize(),\n collider: this,\n body: (_a = this.owner) === null || _a === void 0 ? void 0 : _a.get(_Index__WEBPACK_IMPORTED_MODULE_4__.BodyComponent),\n distance: toi\n };\n }\n return null;\n }\n else {\n // two point\n const discriminant = Math.sqrt(Math.pow(dir.dot(orig.sub(c)), 2) - Math.pow(orig.sub(c).distance(), 2) + Math.pow(this.radius, 2));\n const toi1 = -dir.dot(orig.sub(c)) + discriminant;\n const toi2 = -dir.dot(orig.sub(c)) - discriminant;\n const positiveToi = [];\n if (toi1 >= 0) {\n positiveToi.push(toi1);\n }\n if (toi2 >= 0) {\n positiveToi.push(toi2);\n }\n const minToi = Math.min(...positiveToi);\n if (minToi <= max) {\n const point = ray.getPoint(minToi);\n return {\n point,\n normal: point.sub(c).normalize(),\n collider: this,\n body: (_b = this.owner) === null || _b === void 0 ? void 0 : _b.get(_Index__WEBPACK_IMPORTED_MODULE_4__.BodyComponent),\n distance: minToi\n };\n }\n return null;\n }\n }\n }\n getClosestLineBetween(shape) {\n if (shape instanceof CircleCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_5__.ClosestLineJumpTable.CircleCircleClosestLine(this, shape);\n }\n else if (shape instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_6__.PolygonCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_5__.ClosestLineJumpTable.PolygonCircleClosestLine(shape, this).flip();\n }\n else if (shape instanceof _EdgeCollider__WEBPACK_IMPORTED_MODULE_7__.EdgeCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_5__.ClosestLineJumpTable.CircleEdgeClosestLine(this, shape).flip();\n }\n else {\n throw new Error(`Polygon could not collide with unknown CollisionShape ${typeof shape}`);\n }\n }\n /**\n * @inheritdoc\n */\n collide(collider) {\n if (collider instanceof CircleCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_8__.CollisionJumpTable.CollideCircleCircle(this, collider);\n }\n else if (collider instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_6__.PolygonCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_8__.CollisionJumpTable.CollideCirclePolygon(this, collider);\n }\n else if (collider instanceof _EdgeCollider__WEBPACK_IMPORTED_MODULE_7__.EdgeCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_8__.CollisionJumpTable.CollideCircleEdge(this, collider);\n }\n else {\n throw new Error(`Circle could not collide with unknown CollisionShape ${typeof collider}`);\n }\n }\n /**\n * Find the point on the collider furthest in the direction specified\n */\n getFurthestPoint(direction) {\n return this.center.add(direction.normalize().scale(this.radius));\n }\n /**\n * Find the local point on the shape in the direction specified\n * @param direction\n */\n getFurthestLocalPoint(direction) {\n const dir = direction.normalize();\n return dir.scale(this.radius);\n }\n /**\n * Get the axis aligned bounding box for the circle collider in world coordinates\n */\n get bounds() {\n return this.localBounds.transform(this._globalMatrix);\n }\n /**\n * Get the axis aligned bounding box for the circle collider in local coordinates\n */\n get localBounds() {\n if (this._localBoundsDirty) {\n this._localBounds = new _BoundingBox__WEBPACK_IMPORTED_MODULE_9__.BoundingBox(-this._naturalRadius, -this._naturalRadius, +this._naturalRadius, +this._naturalRadius);\n this._localBoundsDirty = false;\n }\n return this._localBounds;\n }\n /**\n * Get axis not implemented on circles, since there are infinite axis in a circle\n */\n get axes() {\n return [];\n }\n /**\n * Returns the moment of inertia of a circle given it's mass\n * https://en.wikipedia.org/wiki/List_of_moments_of_inertia\n */\n getInertia(mass) {\n return (mass * this.radius * this.radius) / 2;\n }\n /* istanbul ignore next */\n update(transform) {\n var _a;\n this._transform = transform;\n const globalMat = (_a = transform.matrix) !== null && _a !== void 0 ? _a : this._globalMatrix;\n globalMat.clone(this._globalMatrix);\n this._globalMatrix.translate(this.offset.x, this.offset.y);\n this._radius = undefined;\n }\n /**\n * Project the circle along a specified axis\n */\n project(axis) {\n const scalars = [];\n const point = this.center;\n const dotProduct = point.dot(axis);\n scalars.push(dotProduct);\n scalars.push(dotProduct + this.radius);\n scalars.push(dotProduct - this.radius);\n return new _Math_projection__WEBPACK_IMPORTED_MODULE_10__.Projection(Math.min.apply(Math, scalars), Math.max.apply(Math, scalars));\n }\n debug(ex, color, options) {\n var _a, _b, _c, _d;\n const { lineWidth } = { ...{ lineWidth: 1 }, ...options };\n const tx = this._transform;\n const scale = (_a = tx === null || tx === void 0 ? void 0 : tx.globalScale) !== null && _a !== void 0 ? _a : _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.One;\n const rotation = (_b = tx === null || tx === void 0 ? void 0 : tx.globalRotation) !== null && _b !== void 0 ? _b : 0;\n const pos = (_c = tx === null || tx === void 0 ? void 0 : tx.globalPos) !== null && _c !== void 0 ? _c : _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n ex.save();\n ex.translate(pos.x, pos.y);\n ex.rotate(rotation);\n ex.scale(scale.x, scale.y);\n ex.drawCircle((_d = this.offset) !== null && _d !== void 0 ? _d : _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero, this._naturalRadius, _Color__WEBPACK_IMPORTED_MODULE_11__.Color.Transparent, color, lineWidth);\n ex.restore();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/ClosestLineJumpTable.ts\":\n/*!*****************************************************!*\\\n !*** ./Collision/Colliders/ClosestLineJumpTable.ts ***!\n \\*****************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ClosestLineJumpTable: () => (/* binding */ ClosestLineJumpTable)\n/* harmony export */ });\n/* harmony import */ var _Math_line_segment__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/line-segment */ \"./Math/line-segment.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math_ray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math/ray */ \"./Math/ray.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/util */ \"./Math/util.ts\");\n\n\n\n\n/**\n * Finds the closest line segment between two given line segments.\n */\nfunction ClosestLine(line1, line2) {\n // https://math.stackexchange.com/questions/1993953/closest-points-between-2-lines-in-2d\n const EPSILON = 1e-9;\n const line1Dir = line1.dir();\n const line2Dir = line2.dir();\n const d1Squared = line1Dir.dot(line1Dir);\n const d2Squared = line2Dir.dot(line2Dir);\n if (d1Squared < EPSILON && d2Squared < EPSILON) {\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_0__.LineSegment(line1.begin, line2.begin);\n }\n if (d1Squared < EPSILON) {\n const t = (0,_Math_util__WEBPACK_IMPORTED_MODULE_1__.clamp)(line2Dir.dot(line1.begin.sub(line2.begin)) / d2Squared, 0, 1);\n const closestPoint = line2.begin.add(line2Dir.scale(t));\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_0__.LineSegment(line1.begin, closestPoint);\n }\n if (d2Squared < EPSILON) {\n const t = (0,_Math_util__WEBPACK_IMPORTED_MODULE_1__.clamp)(line1Dir.dot(line2.begin.sub(line1.begin)) / d1Squared, 0, 1);\n const closestPoint = line1.begin.add(line1Dir.scale(t));\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_0__.LineSegment(closestPoint, line2.begin);\n }\n const r = line1.begin.sub(line2.begin);\n const a = d1Squared;\n const e = d2Squared;\n const f = line2Dir.dot(r);\n const denom = a * e - Math.pow(line1Dir.dot(line2Dir), 2);\n let s = 0;\n let t = 0;\n if (Math.abs(denom) > EPSILON) {\n s = (0,_Math_util__WEBPACK_IMPORTED_MODULE_1__.clamp)((line1Dir.dot(line2Dir) * f - e * line1Dir.dot(r)) / denom, 0, 1);\n }\n else {\n // lines are parallel\n s = (0,_Math_util__WEBPACK_IMPORTED_MODULE_1__.clamp)(line1Dir.dot(r) / a, 0, 1);\n }\n if (Math.abs(e) > EPSILON) {\n t = (0,_Math_util__WEBPACK_IMPORTED_MODULE_1__.clamp)((line1Dir.dot(line2Dir) * s + f) / e, 0, 1);\n }\n else {\n // line2 is a degenerate point\n t = 0;\n }\n const closestPointOnLine1 = line1.begin.add(line1Dir.scale(s));\n const closestPointOnLine2 = line2.begin.add(line2Dir.scale(t));\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_0__.LineSegment(closestPointOnLine1, closestPointOnLine2);\n}\nconst ClosestLineJumpTable = {\n PolygonPolygonClosestLine(polygonA, polygonB) {\n const aSides = polygonA.getSides();\n const bSides = polygonB.getSides();\n let minDistance = Number.MAX_VALUE;\n let closestLine = null;\n for (let i = 0; i < aSides.length; i++) {\n for (let j = 0; j < bSides.length; j++) {\n const line = ClosestLine(aSides[i], bSides[j]);\n const distance = line.getLength();\n if (distance < minDistance) {\n minDistance = distance;\n closestLine = line;\n }\n }\n }\n return closestLine;\n },\n PolygonEdgeClosestLine(polygon, edge) {\n // Find the 2 closest faces on each polygon\n const otherWorldPos = edge.worldPos;\n const otherDirection = otherWorldPos.sub(polygon.worldPos);\n const rayTowardsOther = new _Math_ray__WEBPACK_IMPORTED_MODULE_2__.Ray(polygon.worldPos, otherDirection);\n const thisPoint = polygon.rayCast(rayTowardsOther).point.add(rayTowardsOther.dir.scale(0.1));\n const thisFace = polygon.getClosestFace(thisPoint);\n // L1 = P(s) = p0 + s * u, where s is time and p0 is the start of the line\n // L2 = Q(t) = q0 + t * v, where t is time and q0 is the start of the line\n const edgeLine = edge.asLine();\n return ClosestLine(thisFace.face, edgeLine);\n },\n PolygonCircleClosestLine(polygon, circle) {\n // https://math.stackexchange.com/questions/1919177/how-to-find-point-on-line-closest-to-sphere\n // Find the 2 closest faces on each polygon\n const otherWorldPos = circle.worldPos;\n const otherDirection = otherWorldPos.sub(polygon.worldPos);\n const rayTowardsOther = new _Math_ray__WEBPACK_IMPORTED_MODULE_2__.Ray(polygon.worldPos, otherDirection.normalize());\n const thisPoint = polygon.rayCast(rayTowardsOther).point.add(rayTowardsOther.dir.scale(0.1));\n const thisFace = polygon.getClosestFace(thisPoint);\n // L1 = P(s) = p0 + s * u, where s is time and p0 is the start of the line\n const p0 = thisFace.face.begin;\n const u = thisFace.face.getEdge();\n // Time of minimum distance\n let t = (u.x * (otherWorldPos.x - p0.x) + u.y * (otherWorldPos.y - p0.y)) / (u.x * u.x + u.y * u.y);\n // If time of minimum is past the edge clamp\n if (t > 1) {\n t = 1;\n }\n else if (t < 0) {\n t = 0;\n }\n // Minimum distance\n const d = Math.sqrt(Math.pow(p0.x + u.x * t - otherWorldPos.x, 2) + Math.pow(p0.y + u.y * t - otherWorldPos.y, 2)) - circle.radius;\n const circlex = ((p0.x + u.x * t - otherWorldPos.x) * circle.radius) / (circle.radius + d);\n const circley = ((p0.y + u.y * t - otherWorldPos.y) * circle.radius) / (circle.radius + d);\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_0__.LineSegment(u.scale(t).add(p0), new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(otherWorldPos.x + circlex, otherWorldPos.y + circley));\n },\n CircleCircleClosestLine(circleA, circleB) {\n // Find the 2 closest faces on each polygon\n const otherWorldPos = circleB.worldPos;\n const otherDirection = otherWorldPos.sub(circleA.worldPos);\n const thisWorldPos = circleA.worldPos;\n const thisDirection = thisWorldPos.sub(circleB.worldPos);\n const rayTowardsOther = new _Math_ray__WEBPACK_IMPORTED_MODULE_2__.Ray(circleA.worldPos, otherDirection);\n const rayTowardsThis = new _Math_ray__WEBPACK_IMPORTED_MODULE_2__.Ray(circleB.worldPos, thisDirection);\n const thisPoint = circleA.rayCast(rayTowardsOther);\n const otherPoint = circleB.rayCast(rayTowardsThis);\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_0__.LineSegment(thisPoint.point, otherPoint.point);\n },\n CircleEdgeClosestLine(circle, edge) {\n // https://math.stackexchange.com/questions/1919177/how-to-find-point-on-line-closest-to-sphere\n const circleWorldPos = circle.worldPos;\n // L1 = P(s) = p0 + s * u, where s is time and p0 is the start of the line\n const edgeLine = edge.asLine();\n const edgeStart = edgeLine.begin;\n const edgeVector = edgeLine.getEdge();\n const p0 = edgeStart;\n const u = edgeVector;\n // Time of minimum distance\n let t = (u.x * (circleWorldPos.x - p0.x) + u.y * (circleWorldPos.y - p0.y)) / (u.x * u.x + u.y * u.y);\n // If time of minimum is past the edge clamp to edge\n if (t > 1) {\n t = 1;\n }\n else if (t < 0) {\n t = 0;\n }\n // Minimum distance\n const d = Math.sqrt(Math.pow(p0.x + u.x * t - circleWorldPos.x, 2) + Math.pow(p0.y + u.y * t - circleWorldPos.y, 2)) - circle.radius;\n const circlex = ((p0.x + u.x * t - circleWorldPos.x) * circle.radius) / (circle.radius + d);\n const circley = ((p0.y + u.y * t - circleWorldPos.y) * circle.radius) / (circle.radius + d);\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_0__.LineSegment(u.scale(t).add(p0), new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(circleWorldPos.x + circlex, circleWorldPos.y + circley));\n },\n EdgeEdgeClosestLine(edgeA, edgeB) {\n // L1 = P(s) = p0 + s * u, where s is time and p0 is the start of the line\n const edgeLineA = edgeA.asLine();\n // L2 = Q(t) = q0 + t * v, where t is time and q0 is the start of the line\n const edgeLineB = edgeB.asLine();\n return ClosestLine(edgeLineA, edgeLineB);\n }\n};\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/Collider.ts\":\n/*!*****************************************!*\\\n !*** ./Collision/Colliders/Collider.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Collider: () => (/* binding */ Collider)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Id__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Id */ \"./Id.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n/**\n * A collision collider specifies the geometry that can detect when other collision colliders intersect\n * for the purposes of colliding 2 objects in excalibur.\n */\nclass Collider {\n constructor() {\n this.id = (0,_Id__WEBPACK_IMPORTED_MODULE_0__.createId)('collider', Collider._ID++);\n /**\n * Composite collider if any this collider is attached to\n *\n * **WARNING** do not tamper with this property\n */\n this.composite = null;\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_1__.EventEmitter();\n /**\n * Pixel offset of the collision collider relative to the collider, by default (0, 0) meaning the collider is positioned\n * on top of the collider.\n */\n this.offset = _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero;\n }\n /**\n * Returns a boolean indicating whether this body collided with\n * or was in stationary contact with\n * the body of the other {@apilink Collider}\n */\n touching(other) {\n const contact = this.collide(other);\n if (contact) {\n return true;\n }\n return false;\n }\n}\nCollider._ID = 0;\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/CollisionJumpTable.ts\":\n/*!***************************************************!*\\\n !*** ./Collision/Colliders/CollisionJumpTable.ts ***!\n \\***************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CollisionJumpTable: () => (/* binding */ CollisionJumpTable)\n/* harmony export */ });\n/* harmony import */ var _CircleCollider__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./CircleCollider */ \"./Collision/Colliders/CircleCollider.ts\");\n/* harmony import */ var _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Detection/CollisionContact */ \"./Collision/Detection/CollisionContact.ts\");\n/* harmony import */ var _PolygonCollider__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./PolygonCollider */ \"./Collision/Colliders/PolygonCollider.ts\");\n/* harmony import */ var _EdgeCollider__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./EdgeCollider */ \"./Collision/Colliders/EdgeCollider.ts\");\n/* harmony import */ var _SeparatingAxis__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./SeparatingAxis */ \"./Collision/Colliders/SeparatingAxis.ts\");\n/* harmony import */ var _Math_line_segment__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../Math/line-segment */ \"./Math/line-segment.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../EntityComponentSystem */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Detection_Pair__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Detection/Pair */ \"./Collision/Detection/Pair.ts\");\n/* harmony import */ var _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/affine-matrix */ \"./Math/affine-matrix.ts\");\n\n\n\n\n\n\n\n\n\n\nconst ScratchZero = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero; // TODO constant vector\nconst ScratchNormal = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero; // TODO constant vector\nconst ScratchMatrix = _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_1__.AffineMatrix.identity();\nconst CollisionJumpTable = {\n CollideCircleCircle(circleA, circleB) {\n const circleAPos = circleA.worldPos;\n const circleBPos = circleB.worldPos;\n const combinedRadius = circleA.radius + circleB.radius;\n const distance = circleAPos.distance(circleBPos);\n if (distance > combinedRadius) {\n return [];\n }\n // negative means overlap\n const separation = combinedRadius - distance;\n // Normal points from A -> B\n const normal = circleBPos.sub(circleAPos).normalize();\n const tangent = normal.perpendicular();\n const mvt = normal.scale(separation);\n const point = circleA.getFurthestPoint(normal);\n const local = circleA.getFurthestLocalPoint(normal);\n const info = {\n collider: circleA,\n separation,\n axis: normal,\n point: point\n };\n return [new _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_2__.CollisionContact(circleA, circleB, mvt, normal, tangent, [point], [local], info)];\n },\n CollideCirclePolygon(circle, polygon) {\n var _a, _b;\n let minAxis = _SeparatingAxis__WEBPACK_IMPORTED_MODULE_3__.SeparatingAxis.findCirclePolygonSeparation(circle, polygon);\n if (!minAxis) {\n return [];\n }\n // make sure that the minAxis is pointing away from circle\n const sameDir = minAxis.dot(polygon.center.sub(circle.center));\n minAxis = sameDir < 0 ? minAxis.negate() : minAxis;\n const point = circle.getFurthestPoint(minAxis);\n const xf = (_b = (_a = circle.owner) === null || _a === void 0 ? void 0 : _a.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__.TransformComponent)) !== null && _b !== void 0 ? _b : new _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__.TransformComponent();\n const local = xf.applyInverse(point);\n const normal = minAxis.normalize();\n const info = {\n collider: circle,\n separation: -minAxis.magnitude,\n axis: normal,\n point: point,\n localPoint: local,\n side: polygon.findSide(normal.negate()),\n localSide: polygon.findLocalSide(normal.negate())\n };\n return [new _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_2__.CollisionContact(circle, polygon, minAxis, normal, normal.perpendicular(), [point], [local], info)];\n },\n CollideCircleEdge(circle, edge) {\n // TODO not sure this actually abides by local/world collisions\n // Are edge.begin and edge.end local space or world space? I think they should be local\n // center of the circle in world pos\n const cc = circle.center;\n // vector in the direction of the edge\n const edgeWorld = edge.asLine();\n const e = edgeWorld.end.sub(edgeWorld.begin);\n // amount of overlap with the circle's center along the edge direction\n const u = e.dot(edgeWorld.end.sub(cc));\n const v = e.dot(cc.sub(edgeWorld.begin));\n const side = edge.asLine();\n const localSide = edge.asLocalLine();\n // Potential region A collision (circle is on the left side of the edge, before the beginning)\n if (v <= 0) {\n const da = edgeWorld.begin.sub(cc);\n const dda = da.dot(da); // quick and dirty way of calc'n distance in r^2 terms saves some sqrts\n // save some sqrts\n if (dda > circle.radius * circle.radius) {\n return []; // no collision\n }\n const normal = da.normalize();\n const separation = circle.radius - Math.sqrt(dda);\n const info = {\n collider: circle,\n separation: separation,\n axis: normal,\n point: side.begin,\n side: side,\n localSide: localSide\n };\n return [\n new _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_2__.CollisionContact(circle, edge, normal.scale(separation), normal, normal.perpendicular(), [side.begin], [localSide.begin], info)\n ];\n }\n // Potential region B collision (circle is on the right side of the edge, after the end)\n if (u <= 0) {\n const db = edgeWorld.end.sub(cc);\n const ddb = db.dot(db);\n if (ddb > circle.radius * circle.radius) {\n return [];\n }\n const normal = db.normalize();\n const separation = circle.radius - Math.sqrt(ddb);\n const info = {\n collider: circle,\n separation: separation,\n axis: normal,\n point: side.end,\n side: side,\n localSide: localSide\n };\n return [\n new _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_2__.CollisionContact(circle, edge, normal.scale(separation), normal, normal.perpendicular(), [side.end], [localSide.end], info)\n ];\n }\n // Otherwise potential region AB collision (circle is in the middle of the edge between the beginning and end)\n const den = e.dot(e);\n const pointOnEdge = edgeWorld.begin\n .scale(u)\n .add(edgeWorld.end.scale(v))\n .scale(1 / den);\n const d = cc.sub(pointOnEdge);\n const dd = d.dot(d);\n if (dd > circle.radius * circle.radius) {\n return []; // no collision\n }\n let normal = e.perpendicular();\n // flip correct direction\n if (normal.dot(cc.sub(edgeWorld.begin)) < 0) {\n normal.x = -normal.x;\n normal.y = -normal.y;\n }\n normal = normal.normalize();\n const separation = circle.radius - Math.sqrt(dd);\n const mvt = normal.scale(separation);\n const info = {\n collider: circle,\n separation: separation,\n axis: normal,\n point: pointOnEdge,\n side: side,\n localSide: localSide\n };\n return [\n new _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_2__.CollisionContact(circle, edge, mvt, normal.negate(), normal.negate().perpendicular(), [pointOnEdge], [pointOnEdge.sub(edge.worldPos)], info)\n ];\n },\n CollideEdgeEdge() {\n // Edge-edge collision doesn't make sense\n return [];\n },\n CollidePolygonEdge(polygon, edge) {\n var _a;\n const pc = polygon.center;\n const ec = edge.center;\n const dir = ec.sub(pc).normalize();\n // build a temporary polygon from the edge to use SAT\n const linePoly = new _PolygonCollider__WEBPACK_IMPORTED_MODULE_5__.PolygonCollider({\n points: [edge.begin, edge.end, edge.end.add(dir.scale(100)), edge.begin.add(dir.scale(100))],\n offset: edge.offset\n });\n linePoly.owner = edge.owner;\n const tx = (_a = edge.owner) === null || _a === void 0 ? void 0 : _a.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__.TransformComponent);\n if (tx) {\n linePoly.update(edge.owner.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__.TransformComponent).get());\n }\n // Gross hack but poly-poly works well\n const contact = this.CollidePolygonPolygon(polygon, linePoly);\n if (contact.length) {\n // Fudge the contact back to edge\n contact[0].colliderB = edge;\n contact[0].id = _Detection_Pair__WEBPACK_IMPORTED_MODULE_6__.Pair.calculatePairHash(polygon.id, edge.id);\n }\n return contact;\n },\n CollidePolygonPolygon(polyA, polyB) {\n // Multi contact from SAT\n // https://gamedev.stackexchange.com/questions/111390/multiple-contacts-for-sat-collision-detection\n // do a SAT test to find a min axis if it exists\n const separationA = _SeparatingAxis__WEBPACK_IMPORTED_MODULE_3__.SeparatingAxis.findPolygonPolygonSeparation(polyA, polyB);\n // If there is no overlap from boxA's perspective we can end early\n if (separationA.separation > 0) {\n return [];\n }\n const separationB = _SeparatingAxis__WEBPACK_IMPORTED_MODULE_3__.SeparatingAxis.findPolygonPolygonSeparation(polyB, polyA);\n // If there is no overlap from boxB's perspective exit now\n if (separationB.separation > 0) {\n return [];\n }\n // Separations are both negative, we want to pick the least negative (minimal movement)\n const separation = separationA.separation > separationB.separation ? separationA : separationB;\n // The incident side is the most opposite from the axes of collision on the other collider\n const other = separation.collider === polyA ? polyB : polyA;\n const main = separation.collider === polyA ? polyA : polyB;\n const toIncidentFrame = other.transform.inverse.multiply(main.transform.matrix, ScratchMatrix);\n const toIncidentFrameRotation = toIncidentFrame.getRotation();\n const referenceEdgeNormal = main.normals[separation.sideId].rotate(toIncidentFrameRotation, ScratchZero, ScratchNormal);\n let minEdge = Number.MAX_VALUE;\n let incidentEdgeIndex = 0;\n for (let i = 0; i < other.normals.length; i++) {\n const value = referenceEdgeNormal.dot(other.normals[i]);\n if (value < minEdge) {\n minEdge = value;\n incidentEdgeIndex = i;\n }\n }\n // Clip incident side by the perpendicular lines at each end of the reference side\n // https://en.wikipedia.org/wiki/Sutherland%E2%80%93Hodgman_algorithm\n const referenceSide = separation.localSide.transform(toIncidentFrame);\n const referenceDirection = separation.localAxis.perpendicular().negate().rotate(toIncidentFrameRotation);\n const incidentSide = new _Math_line_segment__WEBPACK_IMPORTED_MODULE_7__.LineSegment(other.points[incidentEdgeIndex], other.points[(incidentEdgeIndex + 1) % other.points.length]);\n const clipRight = incidentSide.clip(referenceDirection.negate(), -referenceDirection.dot(referenceSide.begin), false);\n let clipLeft = null;\n if (clipRight) {\n clipLeft = clipRight.clip(referenceDirection, referenceDirection.dot(referenceSide.end), false);\n }\n if (clipLeft) {\n const localPoints = [];\n const points = [];\n const clipPoints = clipLeft.getPoints();\n for (let i = 0; i < clipPoints.length; i++) {\n const p = clipPoints[i];\n if (referenceSide.below(p)) {\n localPoints.push(p);\n points.push(other.transform.apply(p));\n }\n }\n let normal = separation.axis;\n let tangent = normal.perpendicular();\n // Point Contact A -> B\n if (polyB.center.sub(polyA.center).dot(normal) < 0) {\n normal = normal.negate();\n tangent = normal.perpendicular();\n }\n return [new _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_2__.CollisionContact(polyA, polyB, normal.scale(-separation.separation), normal, tangent, points, localPoints, separation)];\n }\n return [];\n },\n FindContactSeparation(contact, localPoint) {\n var _a, _b, _c, _d;\n const shapeA = contact.colliderA;\n const txA = (_b = (_a = contact.bodyA) === null || _a === void 0 ? void 0 : _a.transform) !== null && _b !== void 0 ? _b : new _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__.TransformComponent();\n const shapeB = contact.colliderB;\n const txB = (_d = (_c = contact.bodyB) === null || _c === void 0 ? void 0 : _c.transform) !== null && _d !== void 0 ? _d : new _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__.TransformComponent();\n // both are circles\n if (shapeA instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_8__.CircleCollider && shapeB instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_8__.CircleCollider) {\n const combinedRadius = shapeA.radius + shapeB.radius;\n const distance = txA.pos.distance(txB.pos);\n const separation = combinedRadius - distance;\n return -separation;\n }\n // both are polygons\n if (shapeA instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_5__.PolygonCollider && shapeB instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_5__.PolygonCollider) {\n if (contact.info.localSide) {\n let side;\n let worldPoint;\n if (contact.info.collider === shapeA) {\n side = new _Math_line_segment__WEBPACK_IMPORTED_MODULE_7__.LineSegment(txA.apply(contact.info.localSide.begin), txA.apply(contact.info.localSide.end));\n worldPoint = txB.apply(localPoint);\n }\n else {\n side = new _Math_line_segment__WEBPACK_IMPORTED_MODULE_7__.LineSegment(txB.apply(contact.info.localSide.begin), txB.apply(contact.info.localSide.end));\n worldPoint = txA.apply(localPoint);\n }\n return side.distanceToPoint(worldPoint, true);\n }\n }\n // polygon v circle\n if ((shapeA instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_5__.PolygonCollider && shapeB instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_8__.CircleCollider) ||\n (shapeB instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_5__.PolygonCollider && shapeA instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_8__.CircleCollider)) {\n const worldPoint = txA.apply(localPoint);\n if (contact.info.side) {\n return contact.info.side.distanceToPoint(worldPoint, true);\n }\n }\n // polygon v edge\n if ((shapeA instanceof _EdgeCollider__WEBPACK_IMPORTED_MODULE_9__.EdgeCollider && shapeB instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_5__.PolygonCollider) ||\n (shapeB instanceof _EdgeCollider__WEBPACK_IMPORTED_MODULE_9__.EdgeCollider && shapeA instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_5__.PolygonCollider)) {\n let worldPoint;\n if (contact.info.collider === shapeA) {\n worldPoint = txB.apply(localPoint);\n }\n else {\n worldPoint = txA.apply(localPoint);\n }\n if (contact.info.side) {\n return contact.info.side.distanceToPoint(worldPoint, true);\n }\n }\n // circle v edge\n if ((shapeA instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_8__.CircleCollider && shapeB instanceof _EdgeCollider__WEBPACK_IMPORTED_MODULE_9__.EdgeCollider) ||\n (shapeB instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_8__.CircleCollider && shapeA instanceof _EdgeCollider__WEBPACK_IMPORTED_MODULE_9__.EdgeCollider)) {\n // Local point is always on the edge which is always shapeB\n const worldPoint = txB.apply(localPoint);\n let circlePoint;\n if (shapeA instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_8__.CircleCollider) {\n circlePoint = shapeA.getFurthestPoint(contact.normal);\n }\n const dist = worldPoint.distance(circlePoint);\n if (contact.info.side) {\n return dist > 0 ? -dist : 0;\n }\n }\n return 0;\n }\n};\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/CompositeCollider.ts\":\n/*!**************************************************!*\\\n !*** ./Collision/Colliders/CompositeCollider.ts ***!\n \\**************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CompositeCollider: () => (/* binding */ CompositeCollider)\n/* harmony export */ });\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../.. */ \"./Util/Util.ts\");\n/* harmony import */ var _Detection_Pair__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Detection/Pair */ \"./Collision/Detection/Pair.ts\");\n/* harmony import */ var _Math_projection__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../Math/projection */ \"./Math/projection.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Detection_DynamicTree__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Detection/DynamicTree */ \"./Collision/Detection/DynamicTree.ts\");\n/* harmony import */ var _Detection_DynamicTreeCollisionProcessor__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Detection/DynamicTreeCollisionProcessor */ \"./Collision/Detection/DynamicTreeCollisionProcessor.ts\");\n/* harmony import */ var _Collider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Collider */ \"./Collision/Colliders/Collider.ts\");\n/* harmony import */ var _PhysicsConfig__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../PhysicsConfig */ \"./Collision/PhysicsConfig.ts\");\n\n\n\n\n\n\n\n\n\nclass CompositeCollider extends _Collider__WEBPACK_IMPORTED_MODULE_0__.Collider {\n /**\n * Treat composite collider's member colliders as either separate colliders for the purposes of onCollisionStart/onCollision\n * or as a single collider together.\n *\n * This property can be overridden on individual {@apilink CompositeColliders}.\n *\n * For composites without gaps or small groups of colliders, you probably want 'together'\n *\n * For composites with deliberate gaps, like a platforming level layout, you probably want 'separate'\n *\n * Default is 'together' if unset\n */\n set compositeStrategy(value) {\n this._compositeStrategy = value;\n }\n get compositeStrategy() {\n return this._compositeStrategy;\n }\n constructor(colliders) {\n super();\n this._collisionProcessor = new _Detection_DynamicTreeCollisionProcessor__WEBPACK_IMPORTED_MODULE_1__.DynamicTreeCollisionProcessor({\n ...(0,_PhysicsConfig__WEBPACK_IMPORTED_MODULE_2__.getDefaultPhysicsConfig)()\n });\n this._dynamicAABBTree = new _Detection_DynamicTree__WEBPACK_IMPORTED_MODULE_3__.DynamicTree({\n boundsPadding: 5,\n velocityMultiplier: 2\n });\n this._colliders = [];\n for (const c of colliders) {\n this.addCollider(c);\n }\n }\n clearColliders() {\n this._colliders = [];\n }\n addCollider(collider) {\n let colliders;\n if (collider instanceof CompositeCollider) {\n colliders = collider.getColliders();\n colliders.forEach((c) => c.offset.addEqual(collider.offset));\n }\n else {\n colliders = [collider];\n }\n // Flatten composites\n for (const c of colliders) {\n c.events.pipe(this.events);\n c.composite = this;\n this._colliders.push(c);\n this._collisionProcessor.track(c);\n this._dynamicAABBTree.trackCollider(c);\n }\n }\n removeCollider(collider) {\n collider.events.pipe(this.events);\n collider.composite = null;\n ___WEBPACK_IMPORTED_MODULE_4__.removeItemFromArray(collider, this._colliders);\n this._collisionProcessor.untrack(collider);\n this._dynamicAABBTree.untrackCollider(collider);\n }\n getColliders() {\n return this._colliders;\n }\n get worldPos() {\n var _a, _b;\n return ((_b = (_a = this._transform) === null || _a === void 0 ? void 0 : _a.pos) !== null && _b !== void 0 ? _b : _Math_vector__WEBPACK_IMPORTED_MODULE_5__.Vector.Zero).add(this.offset);\n }\n get center() {\n var _a, _b;\n return ((_b = (_a = this._transform) === null || _a === void 0 ? void 0 : _a.pos) !== null && _b !== void 0 ? _b : _Math_vector__WEBPACK_IMPORTED_MODULE_5__.Vector.Zero).add(this.offset);\n }\n get bounds() {\n var _a, _b;\n // TODO cache this\n const colliders = this.getColliders();\n const results = colliders.reduce((acc, collider) => acc.combine(collider.bounds), (_b = (_a = colliders[0]) === null || _a === void 0 ? void 0 : _a.bounds) !== null && _b !== void 0 ? _b : new _BoundingBox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox().translate(this.worldPos));\n return results.translate(this.offset);\n }\n get localBounds() {\n var _a, _b;\n // TODO cache this\n const colliders = this.getColliders();\n const results = colliders.reduce((acc, collider) => acc.combine(collider.localBounds), (_b = (_a = colliders[0]) === null || _a === void 0 ? void 0 : _a.localBounds) !== null && _b !== void 0 ? _b : new _BoundingBox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox());\n return results;\n }\n get axes() {\n // TODO cache this\n const colliders = this.getColliders();\n let axes = [];\n for (const collider of colliders) {\n axes = axes.concat(collider.axes);\n }\n return axes;\n }\n getFurthestPoint(direction) {\n const colliders = this.getColliders();\n const furthestPoints = [];\n for (const collider of colliders) {\n furthestPoints.push(collider.getFurthestPoint(direction));\n }\n // Pick best point from all colliders\n let bestPoint = furthestPoints[0];\n let maxDistance = -Number.MAX_VALUE;\n for (const point of furthestPoints) {\n const distance = point.dot(direction);\n if (distance > maxDistance) {\n bestPoint = point;\n maxDistance = distance;\n }\n }\n return bestPoint;\n }\n getInertia(mass) {\n const colliders = this.getColliders();\n let totalInertia = 0;\n for (const collider of colliders) {\n totalInertia += collider.getInertia(mass);\n }\n return totalInertia;\n }\n collide(other) {\n let otherColliders = [other];\n if (other instanceof CompositeCollider) {\n otherColliders = other.getColliders();\n }\n const pairs = [];\n for (const c of otherColliders) {\n this._dynamicAABBTree.query(c, (potentialCollider) => {\n pairs.push(new _Detection_Pair__WEBPACK_IMPORTED_MODULE_7__.Pair(c, potentialCollider));\n return false;\n });\n }\n let contacts = [];\n for (const p of pairs) {\n contacts = contacts.concat(p.collide());\n }\n return contacts;\n }\n getClosestLineBetween(other) {\n const colliders = this.getColliders();\n const lines = [];\n if (other instanceof CompositeCollider) {\n const otherColliders = other.getColliders();\n for (const colliderA of colliders) {\n for (const colliderB of otherColliders) {\n const maybeLine = colliderA.getClosestLineBetween(colliderB);\n if (maybeLine) {\n lines.push(maybeLine);\n }\n }\n }\n }\n else {\n for (const collider of colliders) {\n const maybeLine = other.getClosestLineBetween(collider);\n if (maybeLine) {\n lines.push(maybeLine);\n }\n }\n }\n if (lines.length) {\n let minLength = lines[0].getLength();\n let minLine = lines[0];\n for (const line of lines) {\n const length = line.getLength();\n if (length < minLength) {\n minLength = length;\n minLine = line;\n }\n }\n return minLine;\n }\n return null;\n }\n contains(point) {\n const colliders = this.getColliders();\n for (const collider of colliders) {\n if (collider.contains(point)) {\n return true;\n }\n }\n return false;\n }\n rayCast(ray, max) {\n const colliders = this.getColliders();\n const hits = [];\n for (const collider of colliders) {\n const hit = collider.rayCast(ray, max);\n if (hit) {\n hits.push(hit);\n }\n }\n if (hits.length) {\n let minHit = hits[0];\n let minDistance = minHit.point.dot(ray.dir);\n for (const hit of hits) {\n const distance = ray.dir.dot(hit.point);\n if (distance < minDistance) {\n minHit = hit;\n minDistance = distance;\n }\n }\n return minHit;\n }\n return null;\n }\n project(axis) {\n const colliders = this.getColliders();\n const projections = [];\n for (const collider of colliders) {\n const proj = collider.project(axis);\n if (proj) {\n projections.push(proj);\n }\n }\n // Merge all proj's on the same axis\n if (projections.length) {\n const newProjection = new _Math_projection__WEBPACK_IMPORTED_MODULE_8__.Projection(projections[0].min, projections[0].max);\n for (const proj of projections) {\n newProjection.min = Math.min(proj.min, newProjection.min);\n newProjection.max = Math.max(proj.max, newProjection.max);\n }\n return newProjection;\n }\n return null;\n }\n update(transform) {\n if (transform) {\n const colliders = this.getColliders();\n for (const collider of colliders) {\n collider.owner = this.owner;\n collider.update(transform);\n }\n }\n }\n debug(ex, color, options) {\n const colliders = this.getColliders();\n ex.save();\n ex.translate(this.offset.x, this.offset.y);\n for (const collider of colliders) {\n collider.debug(ex, color, options);\n }\n ex.restore();\n }\n clone() {\n const result = new CompositeCollider(this._colliders.map((c) => c.clone()));\n result.offset = this.offset.clone();\n return result;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/EdgeCollider.ts\":\n/*!*********************************************!*\\\n !*** ./Collision/Colliders/EdgeCollider.ts ***!\n \\*********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EdgeCollider: () => (/* binding */ EdgeCollider)\n/* harmony export */ });\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./CollisionJumpTable */ \"./Collision/Colliders/CollisionJumpTable.ts\");\n/* harmony import */ var _CircleCollider__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./CircleCollider */ \"./Collision/Colliders/CircleCollider.ts\");\n/* harmony import */ var _PolygonCollider__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./PolygonCollider */ \"./Collision/Colliders/PolygonCollider.ts\");\n/* harmony import */ var _Math_projection__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../Math/projection */ \"./Math/projection.ts\");\n/* harmony import */ var _Math_line_segment__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../Math/line-segment */ \"./Math/line-segment.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Collider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Collider */ \"./Collision/Colliders/Collider.ts\");\n/* harmony import */ var _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./ClosestLineJumpTable */ \"./Collision/Colliders/ClosestLineJumpTable.ts\");\n/* harmony import */ var _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/affine-matrix */ \"./Math/affine-matrix.ts\");\n/* harmony import */ var _Index__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Index */ \"./Collision/BodyComponent.ts\");\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Edge is a single line collider to create collisions with a single line.\n */\nclass EdgeCollider extends _Collider__WEBPACK_IMPORTED_MODULE_0__.Collider {\n constructor(options) {\n var _a;\n super();\n this._globalMatrix = _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_1__.AffineMatrix.identity();\n this.begin = options.begin || _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero;\n this.end = options.end || _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero;\n this.offset = (_a = options.offset) !== null && _a !== void 0 ? _a : _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero;\n }\n /**\n * Returns a clone of this Edge, not associated with any collider\n */\n clone() {\n return new EdgeCollider({\n begin: this.begin.clone(),\n end: this.end.clone()\n });\n }\n get worldPos() {\n var _a;\n const tx = this._transform;\n return (_a = tx === null || tx === void 0 ? void 0 : tx.globalPos.add(this.offset)) !== null && _a !== void 0 ? _a : this.offset;\n }\n /**\n * Get the center of the collision area in world coordinates\n */\n get center() {\n const begin = this._getTransformedBegin();\n const end = this._getTransformedEnd();\n const pos = begin.average(end);\n return pos;\n }\n _getTransformedBegin() {\n return this._globalMatrix.multiply(this.begin);\n }\n _getTransformedEnd() {\n return this._globalMatrix.multiply(this.end);\n }\n /**\n * Returns the slope of the line in the form of a vector\n */\n getSlope() {\n const begin = this._getTransformedBegin();\n const end = this._getTransformedEnd();\n const distance = begin.distance(end);\n return end.sub(begin).scale(1 / distance);\n }\n /**\n * Returns the length of the line segment in pixels\n */\n getLength() {\n const begin = this._getTransformedBegin();\n const end = this._getTransformedEnd();\n const distance = begin.distance(end);\n return distance;\n }\n /**\n * Tests if a point is contained in this collision area\n */\n contains() {\n return false;\n }\n /**\n * @inheritdoc\n */\n rayCast(ray, max = Infinity) {\n var _a;\n const numerator = this._getTransformedBegin().sub(ray.pos);\n // Test is line and ray are parallel and non intersecting\n if (ray.dir.cross(this.getSlope()) === 0 && numerator.cross(ray.dir) !== 0) {\n return null;\n }\n // Lines are parallel\n const divisor = ray.dir.cross(this.getSlope());\n if (divisor === 0) {\n return null;\n }\n const t = numerator.cross(this.getSlope()) / divisor;\n if (t >= 0 && t <= max) {\n const u = numerator.cross(ray.dir) / divisor / this.getLength();\n if (u >= 0 && u <= 1) {\n return {\n distance: t,\n normal: this.asLine().normal(),\n collider: this,\n body: (_a = this.owner) === null || _a === void 0 ? void 0 : _a.get(_Index__WEBPACK_IMPORTED_MODULE_3__.BodyComponent),\n point: ray.getPoint(t)\n };\n }\n }\n return null;\n }\n /**\n * Returns the closes line between this and another collider, from this -> collider\n * @param shape\n */\n getClosestLineBetween(shape) {\n if (shape instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_4__.CircleCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_5__.ClosestLineJumpTable.CircleEdgeClosestLine(shape, this);\n }\n else if (shape instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_6__.PolygonCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_5__.ClosestLineJumpTable.PolygonEdgeClosestLine(shape, this).flip();\n }\n else if (shape instanceof EdgeCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_5__.ClosestLineJumpTable.EdgeEdgeClosestLine(this, shape);\n }\n else {\n throw new Error(`Polygon could not collide with unknown CollisionShape ${typeof shape}`);\n }\n }\n /**\n * @inheritdoc\n */\n collide(shape) {\n if (shape instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_4__.CircleCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_7__.CollisionJumpTable.CollideCircleEdge(shape, this);\n }\n else if (shape instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_6__.PolygonCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_7__.CollisionJumpTable.CollidePolygonEdge(shape, this);\n }\n else if (shape instanceof EdgeCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_7__.CollisionJumpTable.CollideEdgeEdge();\n }\n else {\n throw new Error(`Edge could not collide with unknown CollisionShape ${typeof shape}`);\n }\n }\n /**\n * Find the point on the collider furthest in the direction specified\n */\n getFurthestPoint(direction) {\n const transformedBegin = this._getTransformedBegin();\n const transformedEnd = this._getTransformedEnd();\n if (direction.dot(transformedBegin) > 0) {\n return transformedBegin;\n }\n else {\n return transformedEnd;\n }\n }\n _boundsFromBeginEnd(begin, end, padding = 10) {\n // A perfectly vertical or horizontal edge would have a bounds 0 width or height\n // this causes problems for the collision system so we give them some padding\n return new _BoundingBox__WEBPACK_IMPORTED_MODULE_8__.BoundingBox(Math.min(begin.x, end.x) - padding, Math.min(begin.y, end.y) - padding, Math.max(begin.x, end.x) + padding, Math.max(begin.y, end.y) + padding);\n }\n /**\n * Get the axis aligned bounding box for the edge collider in world space\n */\n get bounds() {\n const transformedBegin = this._getTransformedBegin();\n const transformedEnd = this._getTransformedEnd();\n return this._boundsFromBeginEnd(transformedBegin, transformedEnd);\n }\n /**\n * Get the axis aligned bounding box for the edge collider in local space\n */\n get localBounds() {\n return this._boundsFromBeginEnd(this.begin, this.end);\n }\n /**\n * Returns this edge represented as a line in world coordinates\n */\n asLine() {\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_9__.LineSegment(this._getTransformedBegin(), this._getTransformedEnd());\n }\n /**\n * Return this edge as a line in local line coordinates (relative to the position)\n */\n asLocalLine() {\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_9__.LineSegment(this.begin, this.end);\n }\n /**\n * Get the axis associated with the edge\n */\n get axes() {\n const e = this._getTransformedEnd().sub(this._getTransformedBegin());\n const edgeNormal = e.normal();\n const axes = [];\n axes.push(edgeNormal);\n axes.push(edgeNormal.negate());\n axes.push(edgeNormal.normal());\n axes.push(edgeNormal.normal().negate());\n return axes;\n }\n /**\n * Get the moment of inertia for an edge\n * https://en.wikipedia.org/wiki/List_of_moments_of_inertia\n */\n getInertia(mass) {\n const length = this.end.sub(this.begin).distance() / 2;\n return mass * length * length;\n }\n /**\n * @inheritdoc\n */\n update(transform) {\n var _a;\n this._transform = transform;\n const globalMat = (_a = transform.matrix) !== null && _a !== void 0 ? _a : this._globalMatrix;\n globalMat.clone(this._globalMatrix);\n this._globalMatrix.translate(this.offset.x, this.offset.y);\n }\n /**\n * Project the edge along a specified axis\n */\n project(axis) {\n const scalars = [];\n const points = [this._getTransformedBegin(), this._getTransformedEnd()];\n const len = points.length;\n for (let i = 0; i < len; i++) {\n scalars.push(points[i].dot(axis));\n }\n return new _Math_projection__WEBPACK_IMPORTED_MODULE_10__.Projection(Math.min.apply(Math, scalars), Math.max.apply(Math, scalars));\n }\n debug(ex, color) {\n const begin = this._getTransformedBegin();\n const end = this._getTransformedEnd();\n ex.drawLine(begin, end, color, 2);\n ex.drawCircle(begin, 2, color);\n ex.drawCircle(end, 2, color);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/PolygonCollider.ts\":\n/*!************************************************!*\\\n !*** ./Collision/Colliders/PolygonCollider.ts ***!\n \\************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PolygonCollider: () => (/* binding */ PolygonCollider)\n/* harmony export */ });\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _EdgeCollider__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./EdgeCollider */ \"./Collision/Colliders/EdgeCollider.ts\");\n/* harmony import */ var _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./CollisionJumpTable */ \"./Collision/Colliders/CollisionJumpTable.ts\");\n/* harmony import */ var _CircleCollider__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./CircleCollider */ \"./Collision/Colliders/CircleCollider.ts\");\n/* harmony import */ var _Math_projection__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../Math/projection */ \"./Math/projection.ts\");\n/* harmony import */ var _Math_line_segment__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../Math/line-segment */ \"./Math/line-segment.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math_ray__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../Math/ray */ \"./Math/ray.ts\");\n/* harmony import */ var _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./ClosestLineJumpTable */ \"./Collision/Colliders/ClosestLineJumpTable.ts\");\n/* harmony import */ var _Collider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Collider */ \"./Collision/Colliders/Collider.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../.. */ \"./Util/Log.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../.. */ \"./Math/util.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../.. */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../.. */ \"./Graphics/Debug.ts\");\n/* harmony import */ var _CompositeCollider__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var _Shape__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Shape */ \"./Collision/Colliders/Shape.ts\");\n/* harmony import */ var _Math_transform__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math/transform */ \"./Math/transform.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Polygon collider for detecting collisions\n */\nclass PolygonCollider extends _Collider__WEBPACK_IMPORTED_MODULE_0__.Collider {\n flagDirty() {\n this._localBoundsDirty = true;\n this._localSidesDirty = true;\n this._transformedPointsDirty = true;\n this._sidesDirty = true;\n }\n get normals() {\n return this._normals;\n }\n /**\n * Points in the polygon in order around the perimeter in local coordinates. These are relative from the body transform position.\n * Excalibur stores these in counter-clockwise order\n */\n set points(points) {\n if (points.length < 3) {\n throw new Error('PolygonCollider cannot be created with less that 3 points');\n }\n this._points = points;\n this._checkAndUpdateWinding(this._points);\n this._calculateNormals();\n this.flagDirty();\n }\n _calculateNormals() {\n const normals = [];\n for (let i = 0; i < this._points.length; i++) {\n normals.push(this._points[(i + 1) % this._points.length].sub(this._points[i]).normal());\n }\n this._normals = normals;\n }\n /**\n * Points in the polygon in order around the perimeter in local coordinates. These are relative from the body transform position.\n * Excalibur stores these in counter-clockwise order\n */\n get points() {\n return this._points;\n }\n get transform() {\n return this._transform;\n }\n constructor(options) {\n var _a;\n super();\n this._logger = ___WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this._transform = new _Math_transform__WEBPACK_IMPORTED_MODULE_2__.Transform();\n this._transformedPoints = [];\n this._sides = [];\n this._localSides = [];\n this._transformedPointsDirty = true;\n this._sidesDirty = true;\n this._localSidesDirty = true;\n this._localBoundsDirty = true;\n this.offset = (_a = options.offset) !== null && _a !== void 0 ? _a : _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero;\n this._transform.pos.x += this.offset.x;\n this._transform.pos.y += this.offset.y;\n this.points = options.points;\n if (!this.isConvex()) {\n if (!options.suppressConvexWarning) {\n this._logger.warn('Excalibur only supports convex polygon colliders and will not behave properly.' +\n 'Call PolygonCollider.triangulate() to build a new collider composed of smaller convex triangles');\n }\n }\n // calculate initial transformation\n this._calculateTransformation();\n }\n _checkAndUpdateWinding(points) {\n const counterClockwise = this._isCounterClockwiseWinding(points);\n if (!counterClockwise) {\n points.reverse();\n }\n }\n _isCounterClockwiseWinding(points) {\n // https://stackoverflow.com/a/1165943\n let sum = 0;\n for (let i = 0; i < points.length; i++) {\n sum += (points[(i + 1) % points.length].x - points[i].x) * (points[(i + 1) % points.length].y + points[i].y);\n }\n return sum < 0;\n }\n /**\n * Returns if the polygon collider is convex, Excalibur does not handle non-convex collision shapes.\n * Call {@apilink Polygon.triangulate} to generate a {@apilink CompositeCollider} from this non-convex shape\n */\n isConvex() {\n // From SO: https://stackoverflow.com/a/45372025\n if (this.points.length < 3) {\n return false;\n }\n let oldPoint = this.points[this.points.length - 2];\n let newPoint = this.points[this.points.length - 1];\n let direction = Math.atan2(newPoint.y - oldPoint.y, newPoint.x - oldPoint.x);\n let oldDirection = 0;\n let orientation = 0;\n let angleSum = 0;\n for (const [i, point] of this.points.entries()) {\n oldPoint = newPoint;\n oldDirection = direction;\n newPoint = point;\n direction = Math.atan2(newPoint.y - oldPoint.y, newPoint.x - oldPoint.x);\n if (oldPoint.equals(newPoint)) {\n return false; // repeat point\n }\n let angle = direction - oldDirection;\n if (angle <= -Math.PI) {\n angle += Math.PI * 2;\n }\n else if (angle > Math.PI) {\n angle -= Math.PI * 2;\n }\n if (i === 0) {\n if (angle === 0.0) {\n return false;\n }\n orientation = angle > 0 ? 1 : -1;\n }\n else {\n if (orientation * angle <= 0) {\n return false;\n }\n }\n angleSum += angle;\n }\n return Math.abs(Math.round(angleSum / (Math.PI * 2))) === 1;\n }\n /**\n * Tessellates the polygon into a triangle fan as a {@apilink CompositeCollider} of triangle polygons\n */\n tessellate() {\n const polygons = [];\n for (let i = 1; i < this.points.length - 2; i++) {\n polygons.push([this.points[0], this.points[i + 1], this.points[i + 2]]);\n }\n polygons.push([this.points[0], this.points[1], this.points[2]]);\n return new _CompositeCollider__WEBPACK_IMPORTED_MODULE_4__.CompositeCollider(polygons.map((points) => _Shape__WEBPACK_IMPORTED_MODULE_5__.Shape.Polygon(points)));\n }\n /**\n * Triangulate the polygon collider using the \"Ear Clipping\" algorithm.\n * Returns a new {@apilink CompositeCollider} made up of smaller triangles.\n */\n triangulate() {\n // https://www.youtube.com/watch?v=hTJFcHutls8\n if (this.points.length < 3) {\n throw Error('Invalid polygon');\n }\n const triangles = [];\n // algorithm likes clockwise\n const vertices = [...this.points].reverse();\n let vertexCount = vertices.length;\n /**\n * Returns the previous index based on the current vertex\n */\n function getPrevIndex(index) {\n return index === 0 ? vertexCount - 1 : index - 1;\n }\n /**\n * Retrieves the next index based on the current vertex\n */\n function getNextIndex(index) {\n return index === vertexCount - 1 ? 0 : index + 1;\n }\n /**\n * Whether or not the angle at this vertex index is convex\n */\n function isConvex(index) {\n const prev = getPrevIndex(index);\n const next = getNextIndex(index);\n const va = vertices[prev];\n const vb = vertices[index];\n const vc = vertices[next];\n // Check convexity\n const leftArm = va.sub(vb);\n const rightArm = vc.sub(vb);\n // Positive cross product is convex\n if (leftArm.cross(rightArm) < 0) {\n return false;\n }\n return true;\n }\n const convexVertices = vertices.map((_, i) => isConvex(i));\n /**\n * Quick test for point in triangle\n */\n function isPointInTriangle(point, a, b, c) {\n const ab = b.sub(a);\n const bc = c.sub(b);\n const ca = a.sub(c);\n const ap = point.sub(a);\n const bp = point.sub(b);\n const cp = point.sub(c);\n const cross1 = ab.cross(ap);\n const cross2 = bc.cross(bp);\n const cross3 = ca.cross(cp);\n if (cross1 > 0 || cross2 > 0 || cross3 > 0) {\n return false;\n }\n return true;\n }\n /**\n * Calculate the area of the triangle\n */\n // function triangleArea(a: Vector, b: Vector, c: Vector) {\n // return Math.abs(a.x * (b.y - c.y) + b.x * (c.y - a.y) + c.x * (a.y - c.y))/2;\n // }\n /**\n * Find the next suitable ear tip\n */\n function findEarTip() {\n for (let i = 0; i < vertexCount; i++) {\n if (convexVertices[i]) {\n const prev = getPrevIndex(i);\n const next = getNextIndex(i);\n const va = vertices[prev];\n const vb = vertices[i];\n const vc = vertices[next];\n let isEar = true;\n // Check that if any vertices are in the triangle a, b, c\n for (let j = 0; j < vertexCount; j++) {\n // We can skip these verts because they are the triangle we are testing\n if (j === i || j === prev || j === next) {\n continue;\n }\n const point = vertices[j];\n if (isPointInTriangle(point, va, vb, vc)) {\n isEar = false;\n break;\n }\n }\n // Add ear to polygon list and remove from list\n if (isEar) {\n return i;\n }\n }\n }\n // Fall back to any convex vertex\n for (let i = 0; i < vertexCount; i++) {\n if (convexVertices[i]) {\n return i;\n }\n }\n // bail and return the first one?\n return 0;\n }\n /**\n * Cut the ear and produce a triangle, update internal state\n */\n function cutEarTip(index) {\n const prev = getPrevIndex(index);\n const next = getNextIndex(index);\n const va = vertices[prev];\n const vb = vertices[index];\n const vc = vertices[next];\n // Clockwise winding\n // if (triangleArea(va, vb, vc) > 0) {\n triangles.push([va, vb, vc]);\n // }\n vertices.splice(index, 1);\n convexVertices.splice(index, 1);\n vertexCount--;\n }\n // Loop over all the vertices finding ears\n while (vertexCount > 3) {\n const earIndex = findEarTip();\n cutEarTip(earIndex);\n // reclassify vertices\n for (let i = 0; i < vertexCount; i++) {\n convexVertices[i] = isConvex(i);\n }\n }\n // Last triangle after the loop\n triangles.push([vertices[0], vertices[1], vertices[2]]);\n // FIXME: there is a colinear triangle that sneaks in here sometimes\n return new _CompositeCollider__WEBPACK_IMPORTED_MODULE_4__.CompositeCollider(triangles.map((points) => _Shape__WEBPACK_IMPORTED_MODULE_5__.Shape.Polygon(points, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero, true)));\n }\n /**\n * Returns a clone of this ConvexPolygon, not associated with any collider\n */\n clone() {\n return new PolygonCollider({\n offset: this.offset.clone(),\n points: this.points.map((p) => p.clone())\n });\n }\n /**\n * Returns the world position of the collider, which is the current body transform plus any defined offset\n */\n get worldPos() {\n return this._transform.pos;\n }\n /**\n * Get the center of the collider in world coordinates\n */\n get center() {\n return this.bounds.center;\n }\n /**\n * Calculates the underlying transformation from the body relative space to world space\n */\n _calculateTransformation() {\n const points = this.points;\n const len = points.length;\n this._transformedPoints.length = 0; // clear out old transform\n for (let i = 0; i < len; i++) {\n this._transformedPoints[i] = this._transform.apply(points[i].clone());\n }\n }\n /**\n * Gets the points that make up the polygon in world space, from actor relative space (if specified)\n */\n getTransformedPoints() {\n if (this._transformedPointsDirty) {\n this._calculateTransformation();\n this._transformedPointsDirty = false;\n }\n return this._transformedPoints;\n }\n /**\n * Gets the sides of the polygon in world space\n */\n getSides() {\n if (this._sidesDirty) {\n const lines = [];\n const points = this.getTransformedPoints();\n const len = points.length;\n for (let i = 0; i < len; i++) {\n // This winding is important\n lines.push(new _Math_line_segment__WEBPACK_IMPORTED_MODULE_6__.LineSegment(points[i], points[(i + 1) % len]));\n }\n this._sides = lines;\n this._sidesDirty = false;\n }\n return this._sides;\n }\n /**\n * Returns the local coordinate space sides\n */\n getLocalSides() {\n if (this._localSidesDirty) {\n const lines = [];\n const points = this.points;\n const len = points.length;\n for (let i = 0; i < len; i++) {\n // This winding is important\n lines.push(new _Math_line_segment__WEBPACK_IMPORTED_MODULE_6__.LineSegment(points[i], points[(i + 1) % len]));\n }\n this._localSides = lines;\n this._localSidesDirty = false;\n }\n return this._localSides;\n }\n /**\n * Given a direction vector find the world space side that is most in that direction\n * @param direction\n */\n findSide(direction) {\n const sides = this.getSides();\n let bestSide = sides[0];\n let maxDistance = -Number.MAX_VALUE;\n for (let side = 0; side < sides.length; side++) {\n const currentSide = sides[side];\n const sideNormal = currentSide.normal();\n const mostDirection = sideNormal.dot(direction);\n if (mostDirection > maxDistance) {\n bestSide = currentSide;\n maxDistance = mostDirection;\n }\n }\n return bestSide;\n }\n /**\n * Given a direction vector find the local space side that is most in that direction\n * @param direction\n */\n findLocalSide(direction) {\n const sides = this.getLocalSides();\n let bestSide = sides[0];\n let maxDistance = -Number.MAX_VALUE;\n for (let side = 0; side < sides.length; side++) {\n const currentSide = sides[side];\n const sideNormal = currentSide.normal();\n const mostDirection = sideNormal.dot(direction);\n if (mostDirection > maxDistance) {\n bestSide = currentSide;\n maxDistance = mostDirection;\n }\n }\n return bestSide;\n }\n /**\n * Get the axis associated with the convex polygon\n */\n get axes() {\n const axes = [];\n const sides = this.getSides();\n for (let i = 0; i < sides.length; i++) {\n axes.push(sides[i].normal());\n }\n return axes;\n }\n /**\n * Updates the transform for the collision geometry\n *\n * Collision geometry (points/bounds) will not change until this is called.\n * @param transform\n */\n update(transform) {\n if (transform) {\n // This change means an update must be performed in order for geometry to update\n transform.cloneWithParent(this._transform);\n this._transformedPointsDirty = true;\n this._sidesDirty = true;\n if (this.offset.x !== 0 || this.offset.y !== 0) {\n this._transform.pos.x += this.offset.x;\n this._transform.pos.y += this.offset.y;\n }\n if (this._transform.isMirrored()) {\n // negative transforms really mess with things in collision local space\n // flatten out the negatives by applying to geometry\n this.points = this.points.map((p) => (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(p.x * (0,___WEBPACK_IMPORTED_MODULE_7__.sign)(this._transform.scale.x), p.y * (0,___WEBPACK_IMPORTED_MODULE_7__.sign)(this._transform.scale.y)));\n this._transform.scale.x = Math.abs(this._transform.scale.x);\n this._transform.scale.y = Math.abs(this._transform.scale.y);\n }\n }\n }\n /**\n * Tests if a point is contained in this collider in world space\n */\n contains(point) {\n // Always cast to the right, as long as we cast in a consistent fixed direction we\n // will be fine\n const localPoint = this._transform.applyInverse(point);\n const testRay = new _Math_ray__WEBPACK_IMPORTED_MODULE_8__.Ray(localPoint, new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(1, 0));\n let intersectCount = 0;\n const sides = this.getLocalSides();\n for (let sideIndex = 0; sideIndex < sides.length; sideIndex++) {\n const side = sides[sideIndex];\n if (testRay.intersect(side) >= 0) {\n intersectCount++;\n }\n }\n if (intersectCount % 2 === 0) {\n return false;\n }\n return true;\n }\n getClosestLineBetween(collider) {\n if (collider instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_9__.CircleCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_10__.ClosestLineJumpTable.PolygonCircleClosestLine(this, collider);\n }\n else if (collider instanceof PolygonCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_10__.ClosestLineJumpTable.PolygonPolygonClosestLine(this, collider);\n }\n else if (collider instanceof _EdgeCollider__WEBPACK_IMPORTED_MODULE_11__.EdgeCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_10__.ClosestLineJumpTable.PolygonEdgeClosestLine(this, collider);\n }\n else {\n throw new Error(`Polygon could not collide with unknown CollisionShape ${typeof collider}`);\n }\n }\n /**\n * Returns a collision contact if the 2 colliders collide, otherwise collide will\n * return null.\n * @param collider\n */\n collide(collider) {\n if (collider instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_9__.CircleCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_12__.CollisionJumpTable.CollideCirclePolygon(collider, this);\n }\n else if (collider instanceof PolygonCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_12__.CollisionJumpTable.CollidePolygonPolygon(this, collider);\n }\n else if (collider instanceof _EdgeCollider__WEBPACK_IMPORTED_MODULE_11__.EdgeCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_12__.CollisionJumpTable.CollidePolygonEdge(this, collider);\n }\n else {\n throw new Error(`Polygon could not collide with unknown CollisionShape ${typeof collider}`);\n }\n }\n /**\n * Find the point on the collider furthest in the direction specified\n */\n getFurthestPoint(direction) {\n const pts = this.getTransformedPoints();\n let furthestPoint = null;\n let maxDistance = -Number.MAX_VALUE;\n for (let i = 0; i < pts.length; i++) {\n const distance = direction.dot(pts[i]);\n if (distance > maxDistance) {\n maxDistance = distance;\n furthestPoint = pts[i];\n }\n }\n return furthestPoint;\n }\n /**\n * Find the local point on the collider furthest in the direction specified\n * @param direction\n */\n getFurthestLocalPoint(direction) {\n const pts = this.points;\n let furthestPoint = pts[0];\n let maxDistance = -Number.MAX_VALUE;\n for (let i = 0; i < pts.length; i++) {\n const distance = direction.dot(pts[i]);\n if (distance > maxDistance) {\n maxDistance = distance;\n furthestPoint = pts[i];\n }\n }\n return furthestPoint;\n }\n /**\n * Finds the closes face to the point using perpendicular distance\n * @param point point to test against polygon\n */\n getClosestFace(point) {\n const sides = this.getSides();\n let min = Number.POSITIVE_INFINITY;\n let faceIndex = -1;\n let distance = -1;\n for (let i = 0; i < sides.length; i++) {\n const dist = sides[i].distanceToPoint(point);\n if (dist < min) {\n min = dist;\n faceIndex = i;\n distance = dist;\n }\n }\n if (faceIndex !== -1) {\n return {\n distance: sides[faceIndex].normal().scale(distance),\n face: sides[faceIndex]\n };\n }\n return null;\n }\n /**\n * Get the axis aligned bounding box for the polygon collider in world coordinates\n */\n get bounds() {\n return this.localBounds.transform(this._transform.matrix);\n }\n /**\n * Get the axis aligned bounding box for the polygon collider in local coordinates\n */\n get localBounds() {\n if (this._localBoundsDirty) {\n this._localBounds = _BoundingBox__WEBPACK_IMPORTED_MODULE_13__.BoundingBox.fromPoints(this.points);\n this._localBoundsDirty = false;\n }\n return this._localBounds;\n }\n /**\n * Get the moment of inertia for an arbitrary polygon\n * https://en.wikipedia.org/wiki/List_of_moments_of_inertia\n */\n getInertia(mass) {\n if (this._cachedMass === mass && this._cachedInertia) {\n return this._cachedInertia;\n }\n let numerator = 0;\n let denominator = 0;\n const points = this.points;\n for (let i = 0; i < points.length; i++) {\n const iplusone = (i + 1) % points.length;\n const crossTerm = points[iplusone].cross(points[i]);\n numerator += crossTerm * (points[i].dot(points[i]) + points[i].dot(points[iplusone]) + points[iplusone].dot(points[iplusone]));\n denominator += crossTerm;\n }\n this._cachedMass = mass;\n return (this._cachedInertia = (mass / 6) * (numerator / denominator));\n }\n /**\n * Casts a ray into the polygon and returns a vector representing the point of contact (in world space) or null if no collision.\n */\n rayCast(ray, max = Infinity) {\n var _a;\n // find the minimum contact time greater than 0\n // contact times less than 0 are behind the ray and we don't want those\n const sides = this.getSides();\n const len = sides.length;\n let minContactTime = Number.MAX_VALUE;\n let contactSide;\n let contactIndex = -1;\n for (let i = 0; i < len; i++) {\n const contactTime = ray.intersect(sides[i]);\n if (contactTime >= 0 && contactTime < minContactTime && contactTime <= max) {\n minContactTime = contactTime;\n contactSide = sides[i];\n contactIndex = i;\n }\n }\n // contact was found\n if (contactIndex >= 0) {\n return {\n collider: this,\n distance: minContactTime,\n body: (_a = this.owner) === null || _a === void 0 ? void 0 : _a.get(___WEBPACK_IMPORTED_MODULE_14__.BodyComponent),\n point: ray.getPoint(minContactTime),\n normal: contactSide.normal()\n };\n }\n // no contact found\n return null;\n }\n /**\n * Project the edges of the polygon along a specified axis\n */\n project(axis) {\n const points = this.getTransformedPoints();\n const len = points.length;\n let min = Number.MAX_VALUE;\n let max = -Number.MAX_VALUE;\n for (let i = 0; i < len; i++) {\n const scalar = points[i].dot(axis);\n min = Math.min(min, scalar);\n max = Math.max(max, scalar);\n }\n return new _Math_projection__WEBPACK_IMPORTED_MODULE_15__.Projection(min, max);\n }\n debug(ex, color, options) {\n const points = this.getTransformedPoints();\n ___WEBPACK_IMPORTED_MODULE_16__.Debug.drawPolygon(points, { color });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/SeparatingAxis.ts\":\n/*!***********************************************!*\\\n !*** ./Collision/Colliders/SeparatingAxis.ts ***!\n \\***********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SeparatingAxis: () => (/* binding */ SeparatingAxis),\n/* harmony export */ SeparationInfo: () => (/* binding */ SeparationInfo)\n/* harmony export */ });\n/* harmony import */ var _Math_line_segment__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/line-segment */ \"./Math/line-segment.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math/affine-matrix */ \"./Math/affine-matrix.ts\");\n/* harmony import */ var _Util_Pool__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Util/Pool */ \"./Util/Pool.ts\");\n\n\n\n\n/**\n * Specific information about a contact and it's separation\n */\nclass SeparationInfo {\n constructor() {\n /**\n * Axis of separation from the collider's perspective\n */\n this.axis = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n /**\n * Local axis of separation from the collider's perspective\n */\n this.localAxis = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n /**\n * Side of separation (reference) from the collider's perspective\n */\n this.side = new _Math_line_segment__WEBPACK_IMPORTED_MODULE_1__.LineSegment((0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0), (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0));\n /**\n * Local side of separation (reference) from the collider's perspective\n */\n this.localSide = new _Math_line_segment__WEBPACK_IMPORTED_MODULE_1__.LineSegment((0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0), (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0));\n /**\n * Point on collider B (incident point)\n */\n this.point = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n /**\n * Local point on collider B (incident point)\n */\n this.localPoint = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n }\n}\nclass SeparatingAxis {\n static findPolygonPolygonSeparation(polyA, polyB) {\n // if polyB has 0 scale we need to hop back to degenerate separation\n if (polyB.transform.matrix.determinant() === 0) {\n return SeparatingAxis.findPolygonPolygonSeparationDegenerate(polyA, polyB);\n }\n // Multi contact from SAT\n // https://gamedev.stackexchange.com/questions/111390/multiple-contacts-for-sat-collision-detection\n // do a SAT test to find a min axis if it exists\n let bestSeparation = -Number.MAX_VALUE;\n let bestSideIndex = -1;\n let localPoint;\n // Work inside polyB reference frame\n // inv polyB converts to local space from polyA world space\n const toPolyBSpace = polyB.transform.inverse.multiply(polyA.transform.matrix, SeparatingAxis._SCRATCH_MATRIX);\n const toPolyBSpaceRotation = toPolyBSpace.getRotation();\n const normalsA = polyA.normals;\n const pointsA = polyA.points;\n const pointsB = polyB.points;\n for (let pointsAIndex = 0; pointsAIndex < pointsA.length; pointsAIndex++) {\n const normal = normalsA[pointsAIndex].rotate(toPolyBSpaceRotation, SeparatingAxis._ZERO, SeparatingAxis._SCRATCH_NORMAL);\n const point = toPolyBSpace.multiply(pointsA[pointsAIndex], SeparatingAxis._SCRATCH_POINT);\n // For every point in polyB\n // We want to see how much overlap there is on the axis provided by the normal\n // We want to find the minimum overlap among all points\n let smallestPointDistance = Number.MAX_VALUE;\n let smallestLocalPoint;\n for (let pointsBIndex = 0; pointsBIndex < pointsB.length; pointsBIndex++) {\n const distance = normal.dot(pointsB[pointsBIndex].sub(point, SeparatingAxis._SCRATCH_SUB_POINT));\n if (distance < smallestPointDistance) {\n smallestPointDistance = distance;\n smallestLocalPoint = pointsB[pointsBIndex];\n }\n }\n // We take the maximum overlap as the separation between the\n // A negative separation means there were no gaps between the two shapes\n if (smallestPointDistance > bestSeparation) {\n bestSeparation = smallestPointDistance;\n bestSideIndex = pointsAIndex;\n localPoint = smallestLocalPoint;\n }\n }\n // TODO can we avoid applying world space transforms?\n const bestSide2 = (bestSideIndex + 1) % pointsA.length;\n const separationInfo = SeparatingAxis.SeparationPool.get();\n separationInfo.collider = polyA;\n separationInfo.separation = bestSeparation;\n if (bestSeparation > 0) {\n // early out because if separation is > 0 then no local point\n return separationInfo;\n }\n normalsA[bestSideIndex].clone(separationInfo.localAxis);\n normalsA[bestSideIndex].rotate(polyA.transform.rotation, SeparatingAxis._ZERO, separationInfo.axis);\n polyA.transform.matrix.multiply(pointsA[bestSideIndex], separationInfo.side.begin);\n polyA.transform.matrix.multiply(pointsA[bestSide2], separationInfo.side.end);\n polyB.transform.matrix.multiply(localPoint, separationInfo.point);\n separationInfo.sideId = bestSideIndex;\n localPoint.clone(separationInfo.localPoint);\n pointsA[bestSideIndex].clone(separationInfo.localSide.begin);\n pointsA[bestSide2].clone(separationInfo.localSide.end);\n return separationInfo;\n }\n static findCirclePolygonSeparation(circle, polygon) {\n const axes = polygon.axes;\n const pc = polygon.center;\n // Special SAT with circles\n const polyDir = pc.sub(circle.worldPos);\n const closestPointOnPoly = polygon.getFurthestPoint(polyDir.negate());\n axes.push(closestPointOnPoly.sub(circle.worldPos).normalize());\n let minOverlap = Number.MAX_VALUE;\n let minAxis = null;\n let minIndex = -1;\n for (let i = 0; i < axes.length; i++) {\n const proj1 = polygon.project(axes[i]);\n const proj2 = circle.project(axes[i]);\n const overlap = proj1.getOverlap(proj2);\n if (overlap <= 0) {\n return null;\n }\n else {\n if (overlap < minOverlap) {\n minOverlap = overlap;\n minAxis = axes[i];\n minIndex = i;\n }\n }\n }\n if (minIndex < 0) {\n return null;\n }\n return minAxis.normalize().scale(minOverlap);\n }\n static findPolygonPolygonSeparationDegenerate(polyA, polyB) {\n let bestSeparation = -Number.MAX_VALUE;\n let bestSide = null;\n let bestAxis = null;\n let bestSideIndex = -1;\n let bestOtherPoint = null;\n const sides = polyA.getSides();\n const localSides = polyA.getLocalSides();\n for (let i = 0; i < sides.length; i++) {\n const side = sides[i];\n const axis = side.normal();\n const vertB = polyB.getFurthestPoint(axis.negate());\n // Separation on side i's axis\n // We are looking for the largest separation between poly A's sides\n const vertSeparation = side.distanceToPoint(vertB, true);\n if (vertSeparation > bestSeparation) {\n bestSeparation = vertSeparation;\n bestSide = side;\n bestAxis = axis;\n bestSideIndex = i;\n bestOtherPoint = vertB;\n }\n }\n return {\n collider: polyA,\n separation: bestAxis ? bestSeparation : 99,\n axis: bestAxis,\n side: bestSide,\n localSide: localSides[bestSideIndex],\n sideId: bestSideIndex,\n point: bestOtherPoint,\n localPoint: bestAxis ? polyB.getFurthestLocalPoint(bestAxis.negate()) : null\n };\n }\n}\nSeparatingAxis.SeparationPool = new _Util_Pool__WEBPACK_IMPORTED_MODULE_2__.Pool(() => new SeparationInfo(), (i) => i, // no recycle\n500);\nSeparatingAxis._ZERO = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\nSeparatingAxis._SCRATCH_POINT = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\nSeparatingAxis._SCRATCH_SUB_POINT = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\nSeparatingAxis._SCRATCH_NORMAL = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\nSeparatingAxis._SCRATCH_MATRIX = _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_3__.AffineMatrix.identity();\nSeparatingAxis.SeparationPool.disableWarnings = true;\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/Shape.ts\":\n/*!**************************************!*\\\n !*** ./Collision/Colliders/Shape.ts ***!\n \\**************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Shape: () => (/* binding */ Shape)\n/* harmony export */ });\n/* harmony import */ var _PolygonCollider__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./PolygonCollider */ \"./Collision/Colliders/PolygonCollider.ts\");\n/* harmony import */ var _CircleCollider__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./CircleCollider */ \"./Collision/Colliders/CircleCollider.ts\");\n/* harmony import */ var _EdgeCollider__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./EdgeCollider */ \"./Collision/Colliders/EdgeCollider.ts\");\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _CompositeCollider__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../.. */ \"./Util/Log.ts\");\n\n\n\n\n\n\n\n/**\n * Excalibur helper for defining colliders quickly\n */\nclass Shape {\n /**\n * Creates a box collider, under the hood defines a {@apilink PolygonCollider} collider\n * @param width Width of the box\n * @param height Height of the box\n * @param anchor Anchor of the box (default (.5, .5)) which positions the box relative to the center of the collider's position\n * @param offset Optional offset relative to the collider in local coordinates\n */\n static Box(width, height, anchor = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Half, offset = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero) {\n return new _PolygonCollider__WEBPACK_IMPORTED_MODULE_1__.PolygonCollider({\n points: new _BoundingBox__WEBPACK_IMPORTED_MODULE_2__.BoundingBox(-width * anchor.x, -height * anchor.y, width - width * anchor.x, height - height * anchor.y).getPoints(),\n offset: offset\n });\n }\n /**\n * Creates a new {@apilink PolygonCollider | `arbitrary polygon`} collider\n *\n * PolygonColliders are useful for creating convex polygon shapes\n * @param points Points specified in counter clockwise\n * @param offset Optional offset relative to the collider in local coordinates\n */\n static Polygon(points, offset = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero, suppressConvexWarning = false) {\n return new _PolygonCollider__WEBPACK_IMPORTED_MODULE_1__.PolygonCollider({\n points: points,\n offset: offset,\n suppressConvexWarning\n });\n }\n /**\n * Creates a new {@apilink CircleCollider | `circle`} collider\n *\n * Circle colliders are useful for balls, or to make collisions more forgiving on sharp edges\n * @param radius Radius of the circle collider\n * @param offset Optional offset relative to the collider in local coordinates\n */\n static Circle(radius, offset = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero) {\n return new _CircleCollider__WEBPACK_IMPORTED_MODULE_3__.CircleCollider({\n radius: radius,\n offset: offset\n });\n }\n /**\n * Creates a new {@apilink EdgeCollider | `edge`} collider\n *\n * Edge colliders are useful for floors, walls, and other barriers\n * @param begin Beginning of the edge in local coordinates to the collider\n * @param end Ending of the edge in local coordinates to the collider\n */\n static Edge(begin, end) {\n return new _EdgeCollider__WEBPACK_IMPORTED_MODULE_4__.EdgeCollider({\n begin: begin,\n end: end\n });\n }\n /**\n * Creates a new capsule shaped {@apilink CompositeCollider} using 2 circles and a box\n *\n * Capsule colliders are useful for platformers with incline or jagged floors to have a smooth\n * player experience.\n * @param width\n * @param height\n * @param offset Optional offset\n */\n static Capsule(width, height, offset = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero) {\n const logger = ___WEBPACK_IMPORTED_MODULE_5__.Logger.getInstance();\n if (width === height) {\n logger.warn('A capsule collider with equal width and height is a circle, consider using a ex.Shape.Circle or ex.CircleCollider');\n }\n const vertical = height >= width;\n if (vertical) {\n // height > width, if equal maybe use a circle\n const capsule = new _CompositeCollider__WEBPACK_IMPORTED_MODULE_6__.CompositeCollider([\n Shape.Circle(width / 2, (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, -height / 2 + width / 2).add(offset)),\n Shape.Box(width, height - width, _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Half, offset),\n Shape.Circle(width / 2, (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, height / 2 - width / 2).add(offset))\n ]);\n return capsule;\n }\n else {\n // width > height, if equal maybe use a circle\n const capsule = new _CompositeCollider__WEBPACK_IMPORTED_MODULE_6__.CompositeCollider([\n Shape.Circle(height / 2, (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(-width / 2 + height / 2, 0).add(offset)),\n Shape.Box(width - height, height, _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Half, offset),\n Shape.Circle(height / 2, (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(width / 2 - height / 2, 0).add(offset))\n ]);\n return capsule;\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/CollisionSystem.ts\":\n/*!**************************************!*\\\n !*** ./Collision/CollisionSystem.ts ***!\n \\**************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CollisionSystem: () => (/* binding */ CollisionSystem)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Priority.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _SolverStrategy__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./SolverStrategy */ \"./Collision/SolverStrategy.ts\");\n/* harmony import */ var _Solver_ArcadeSolver__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Solver/ArcadeSolver */ \"./Collision/Solver/ArcadeSolver.ts\");\n/* harmony import */ var _Solver_RealisticSolver__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Solver/RealisticSolver */ \"./Collision/Solver/RealisticSolver.ts\");\n/* harmony import */ var _ColliderComponent__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./ColliderComponent */ \"./Collision/ColliderComponent.ts\");\n/* harmony import */ var _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Colliders/CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var _Collision_Side__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../Collision/Side */ \"./Collision/Side.ts\");\n/* harmony import */ var _Colliders_SeparatingAxis__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Colliders/SeparatingAxis */ \"./Collision/Colliders/SeparatingAxis.ts\");\n/* harmony import */ var _MotionSystem__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./MotionSystem */ \"./Collision/MotionSystem.ts\");\n/* harmony import */ var _Detection_Pair__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Detection/Pair */ \"./Collision/Detection/Pair.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass CollisionSystem extends _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.System {\n get _processor() {\n return this._physics.collisionProcessor;\n }\n constructor(world, _physics) {\n super();\n this._physics = _physics;\n this.systemType = _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.SystemType.Update;\n this._configDirty = false;\n this._lastFrameContacts = new Map();\n this._currentFrameContacts = new Map();\n this._arcadeSolver = new _Solver_ArcadeSolver__WEBPACK_IMPORTED_MODULE_1__.ArcadeSolver(_physics.config.arcade);\n this._realisticSolver = new _Solver_RealisticSolver__WEBPACK_IMPORTED_MODULE_2__.RealisticSolver(_physics.config.realistic);\n this._physics.$configUpdate.subscribe(() => (this._configDirty = true));\n this._trackCollider = (c) => this._processor.track(c);\n this._untrackCollider = (c) => this._processor.untrack(c);\n this.query = world.query([_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__.TransformComponent, _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_4__.MotionComponent, _ColliderComponent__WEBPACK_IMPORTED_MODULE_5__.ColliderComponent]);\n this.query.entityAdded$.subscribe((e) => {\n const colliderComponent = e.get(_ColliderComponent__WEBPACK_IMPORTED_MODULE_5__.ColliderComponent);\n colliderComponent.$colliderAdded.subscribe(this._trackCollider);\n colliderComponent.$colliderRemoved.subscribe(this._untrackCollider);\n const collider = colliderComponent.get();\n if (collider) {\n this._processor.track(collider);\n }\n });\n this.query.entityRemoved$.subscribe((e) => {\n const colliderComponent = e.get(_ColliderComponent__WEBPACK_IMPORTED_MODULE_5__.ColliderComponent);\n const collider = colliderComponent.get();\n if (colliderComponent && collider) {\n this._processor.untrack(collider);\n }\n });\n this._motionSystem = world.get(_MotionSystem__WEBPACK_IMPORTED_MODULE_6__.MotionSystem);\n }\n initialize(world, scene) {\n this._engine = scene.engine;\n }\n update(elapsed) {\n var _a, _b, _c, _d;\n if (!this._physics.config.enabled) {\n return;\n }\n // TODO do we need to do this every frame?\n // Collect up all the colliders and update them\n let colliders = [];\n for (let entityIndex = 0; entityIndex < this.query.entities.length; entityIndex++) {\n const entity = this.query.entities[entityIndex];\n const colliderComp = entity.get(_ColliderComponent__WEBPACK_IMPORTED_MODULE_5__.ColliderComponent);\n const collider = colliderComp === null || colliderComp === void 0 ? void 0 : colliderComp.get();\n if (colliderComp && ((_a = colliderComp.owner) === null || _a === void 0 ? void 0 : _a.isActive) && collider) {\n colliderComp.update();\n // Flatten composite colliders\n if (collider instanceof _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_7__.CompositeCollider) {\n const compositeColliders = collider.getColliders();\n if (!collider.compositeStrategy) {\n collider.compositeStrategy = this._physics.config.colliders.compositeStrategy;\n }\n colliders = colliders.concat(compositeColliders);\n }\n else {\n colliders.push(collider);\n }\n }\n }\n // Update the spatial partitioning data structures\n // TODO if collider invalid it will break the processor\n // TODO rename \"update\" to something more specific\n this._processor.update(colliders, elapsed);\n // Run broadphase on all colliders and locates potential collisions\n let pairs = this._processor.broadphase(colliders, elapsed);\n this._currentFrameContacts.clear();\n // Given possible pairs find actual contacts\n let contacts = []; // = this._processor.narrowphase(pairs, this._engine?.debug?.stats?.currFrame);\n const solver = this.getSolver();\n // Solve, this resolves the position/velocity so entities aren't overlapping\n const substep = this._physics.config.substep;\n for (let step = 0; step < substep; step++) {\n if (step > 0) {\n // first step is run by the MotionSystem when configured, so skip\n this._motionSystem.update(elapsed);\n }\n // Re-use pairs from previous collision\n if (contacts.length) {\n pairs = contacts.map((c) => new _Detection_Pair__WEBPACK_IMPORTED_MODULE_8__.Pair(c.colliderA, c.colliderB));\n }\n if (pairs.length) {\n contacts = this._processor.narrowphase(pairs, (_d = (_c = (_b = this._engine) === null || _b === void 0 ? void 0 : _b.debug) === null || _c === void 0 ? void 0 : _c.stats) === null || _d === void 0 ? void 0 : _d.currFrame);\n contacts = solver.solve(contacts);\n // Record contacts for start/end\n for (const contact of contacts) {\n if (contact.isCanceled()) {\n continue;\n }\n // Process composite ids, things with the same composite id are treated as the same collider for start/end\n const index = contact.id.indexOf('|');\n if (index > 0) {\n const compositeId = contact.id.substring(index + 1);\n this._currentFrameContacts.set(compositeId, contact);\n }\n else {\n this._currentFrameContacts.set(contact.id, contact);\n }\n }\n }\n }\n // Emit contact start/end events\n this.runContactStartEnd();\n // reset the last frame cache\n this._lastFrameContacts.clear();\n // Keep track of collisions contacts that have started or ended\n this._lastFrameContacts = new Map(this._currentFrameContacts);\n // Process deferred collider removals\n for (const entity of this.query.entities) {\n const collider = entity.get(_ColliderComponent__WEBPACK_IMPORTED_MODULE_5__.ColliderComponent);\n if (collider) {\n collider.processColliderRemoval();\n }\n }\n }\n postupdate() {\n _Colliders_SeparatingAxis__WEBPACK_IMPORTED_MODULE_9__.SeparatingAxis.SeparationPool.done();\n }\n getSolver() {\n if (this._configDirty) {\n this._configDirty = false;\n this._arcadeSolver = new _Solver_ArcadeSolver__WEBPACK_IMPORTED_MODULE_1__.ArcadeSolver(this._physics.config.arcade);\n this._realisticSolver = new _Solver_RealisticSolver__WEBPACK_IMPORTED_MODULE_2__.RealisticSolver(this._physics.config.realistic);\n }\n return this._physics.config.solver === _SolverStrategy__WEBPACK_IMPORTED_MODULE_10__.SolverStrategy.Realistic ? this._realisticSolver : this._arcadeSolver;\n }\n debug(ex) {\n this._processor.debug(ex, 0);\n }\n runContactStartEnd() {\n // If composite colliders are 'together' collisions may have a duplicate id because we want to treat those as a singular start/end\n for (const [id, c] of this._currentFrameContacts) {\n // find all new contacts\n if (!this._lastFrameContacts.has(id)) {\n const colliderA = c.colliderA;\n const colliderB = c.colliderB;\n const side = _Collision_Side__WEBPACK_IMPORTED_MODULE_11__.Side.fromDirection(c.mtv);\n const opposite = _Collision_Side__WEBPACK_IMPORTED_MODULE_11__.Side.getOpposite(side);\n colliderA.events.emit('collisionstart', new _Events__WEBPACK_IMPORTED_MODULE_12__.CollisionStartEvent(colliderA, colliderB, side, c));\n colliderA.events.emit('contactstart', new _Events__WEBPACK_IMPORTED_MODULE_12__.ContactStartEvent(colliderA, colliderB, side, c));\n colliderB.events.emit('collisionstart', new _Events__WEBPACK_IMPORTED_MODULE_12__.CollisionStartEvent(colliderB, colliderA, opposite, c));\n colliderB.events.emit('contactstart', new _Events__WEBPACK_IMPORTED_MODULE_12__.ContactStartEvent(colliderB, colliderA, opposite, c));\n }\n }\n // find all contacts that have ceased\n for (const [id, c] of this._lastFrameContacts) {\n if (!this._currentFrameContacts.has(id)) {\n const colliderA = c.colliderA;\n const colliderB = c.colliderB;\n const side = _Collision_Side__WEBPACK_IMPORTED_MODULE_11__.Side.fromDirection(c.mtv);\n const opposite = _Collision_Side__WEBPACK_IMPORTED_MODULE_11__.Side.getOpposite(side);\n colliderA.events.emit('collisionend', new _Events__WEBPACK_IMPORTED_MODULE_12__.CollisionEndEvent(colliderA, colliderB, side, c));\n colliderA.events.emit('contactend', new _Events__WEBPACK_IMPORTED_MODULE_12__.ContactEndEvent(colliderA, colliderB, side, c));\n colliderB.events.emit('collisionend', new _Events__WEBPACK_IMPORTED_MODULE_12__.CollisionEndEvent(colliderB, colliderA, opposite, c));\n colliderB.events.emit('contactend', new _Events__WEBPACK_IMPORTED_MODULE_12__.ContactEndEvent(colliderB, colliderA, opposite, c));\n }\n }\n }\n}\nCollisionSystem.priority = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_13__.SystemPriority.Higher;\n\n\n/***/ }),\n\n/***/ \"./Collision/CollisionType.ts\":\n/*!************************************!*\\\n !*** ./Collision/CollisionType.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CollisionType: () => (/* binding */ CollisionType)\n/* harmony export */ });\n/**\n * An enum that describes the types of collisions bodies can participate in\n */\nvar CollisionType;\n(function (CollisionType) {\n /**\n * Bodies with the `PreventCollision` setting do not participate in any\n * collisions and do not raise collision events.\n */\n CollisionType[\"PreventCollision\"] = \"PreventCollision\";\n /**\n * Bodies with the `Passive` setting only raise collision events, but are not\n * influenced or moved by other bodies and do not influence or move other bodies.\n * This is useful for use in trigger type behavior.\n */\n CollisionType[\"Passive\"] = \"Passive\";\n /**\n * Bodies with the `Active` setting raise collision events and participate\n * in collisions with other bodies and will be push or moved by bodies sharing\n * the `Active` or `Fixed` setting.\n */\n CollisionType[\"Active\"] = \"Active\";\n /**\n * Bodies with the `Fixed` setting raise collision events and participate in\n * collisions with other bodies. Actors with the `Fixed` setting will not be\n * pushed or moved by other bodies sharing the `Fixed`. Think of Fixed\n * bodies as \"immovable/unstoppable\" objects. If two `Fixed` bodies meet they will\n * not be pushed or moved by each other, they will not interact except to throw\n * collision events.\n */\n CollisionType[\"Fixed\"] = \"Fixed\";\n})(CollisionType || (CollisionType = {}));\n\n\n/***/ }),\n\n/***/ \"./Collision/Detection/CollisionContact.ts\":\n/*!*************************************************!*\\\n !*** ./Collision/Detection/CollisionContact.ts ***!\n \\*************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CollisionContact: () => (/* binding */ CollisionContact)\n/* harmony export */ });\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Pair__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Pair */ \"./Collision/Detection/Pair.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../BodyComponent */ \"./Collision/BodyComponent.ts\");\n\n\n\n/**\n * Collision contacts are used internally by Excalibur to resolve collision between colliders. This\n * Pair prevents collisions from being evaluated more than one time\n */\nclass CollisionContact {\n constructor(colliderA, colliderB, mtv, normal, tangent, points, localPoints, info) {\n var _a, _b, _c, _d, _e, _f;\n this._canceled = false;\n this.bodyA = null;\n this.bodyB = null;\n this.colliderA = colliderA;\n this.colliderB = colliderB;\n this.mtv = mtv;\n this.normal = normal;\n this.tangent = tangent;\n this.points = points;\n this.localPoints = localPoints;\n this.info = info;\n this.id = _Pair__WEBPACK_IMPORTED_MODULE_0__.Pair.calculatePairHash(colliderA.id, colliderB.id);\n if (colliderA.composite || colliderB.composite) {\n // Add on the parent composite pair for start/end contact if 'together\n const colliderAId = ((_a = colliderA.composite) === null || _a === void 0 ? void 0 : _a.compositeStrategy) === 'separate' ? colliderA.id : (_c = (_b = colliderA.composite) === null || _b === void 0 ? void 0 : _b.id) !== null && _c !== void 0 ? _c : colliderA.id;\n const colliderBId = ((_d = colliderB.composite) === null || _d === void 0 ? void 0 : _d.compositeStrategy) === 'separate' ? colliderB.id : (_f = (_e = colliderB.composite) === null || _e === void 0 ? void 0 : _e.id) !== null && _f !== void 0 ? _f : colliderB.id;\n this.id += '|' + _Pair__WEBPACK_IMPORTED_MODULE_0__.Pair.calculatePairHash(colliderAId, colliderBId);\n }\n if (this.colliderA.owner) {\n this.bodyA = this.colliderA.owner.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_1__.BodyComponent);\n }\n if (this.colliderB.owner) {\n this.bodyB = this.colliderB.owner.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_1__.BodyComponent);\n }\n }\n /**\n * Match contact awake state, except if body's are Fixed\n */\n matchAwake() {\n const bodyA = this.bodyA;\n const bodyB = this.bodyB;\n if (bodyA && bodyB) {\n if (bodyA.isSleeping !== bodyB.isSleeping) {\n if (bodyA.isSleeping && bodyA.collisionType !== _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.Fixed && bodyB.sleepMotion >= bodyA.wakeThreshold) {\n bodyA.isSleeping = false;\n }\n if (bodyB.isSleeping && bodyB.collisionType !== _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.Fixed && bodyA.sleepMotion >= bodyB.wakeThreshold) {\n bodyB.isSleeping = false;\n }\n }\n }\n }\n isCanceled() {\n return this._canceled;\n }\n cancel() {\n this._canceled = true;\n }\n /**\n * Biases the contact so that the given collider is colliderA\n */\n bias(collider) {\n if (collider !== this.colliderA && collider !== this.colliderB) {\n throw new Error('Collider must be either colliderA or colliderB from this contact');\n }\n if (collider === this.colliderA) {\n return this;\n }\n const colliderA = this.colliderA;\n const colliderB = this.colliderB;\n this.colliderB = colliderA;\n this.colliderA = colliderB;\n this.mtv = this.mtv.negate();\n this.normal = this.normal.negate();\n this.tangent = this.tangent.negate();\n return this;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Detection/DynamicTree.ts\":\n/*!********************************************!*\\\n !*** ./Collision/Detection/DynamicTree.ts ***!\n \\********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DynamicTree: () => (/* binding */ DynamicTree),\n/* harmony export */ TreeNode: () => (/* binding */ TreeNode)\n/* harmony export */ });\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../.. */ \"./Color.ts\");\n\n\n\n\n/**\n * Dynamic Tree Node used for tracking bounds within the tree\n */\nclass TreeNode {\n constructor(parent) {\n this.parent = parent;\n this.parent = parent || null;\n this.data = null;\n this.bounds = new _BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox();\n this.left = null;\n this.right = null;\n this.height = 0;\n }\n isLeaf() {\n return !this.left && !this.right;\n }\n}\n/**\n * The DynamicTrees provides a spatial partitioning data structure for quickly querying for overlapping bounding boxes for\n * all tracked bodies. The worst case performance of this is O(n*log(n)) where n is the number of bodies in the tree.\n *\n * Internally the bounding boxes are organized as a balanced binary tree of bounding boxes, where the leaf nodes are tracked bodies.\n * Every non-leaf node is a bounding box that contains child bounding boxes.\n */\nclass DynamicTree {\n constructor(_config, worldBounds = new _BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox(-Number.MAX_VALUE, -Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE)) {\n this._config = _config;\n this.worldBounds = worldBounds;\n this.root = null;\n this.nodes = {};\n }\n /**\n * Inserts a node into the dynamic tree\n */\n _insert(leaf) {\n // If there are no nodes in the tree, make this the root leaf\n if (this.root === null) {\n this.root = leaf;\n this.root.parent = null;\n return;\n }\n // Search the tree for a node that is not a leaf and find the best place to insert\n const leafAABB = leaf.bounds;\n let currentRoot = this.root;\n while (!currentRoot.isLeaf()) {\n const left = currentRoot.left;\n const right = currentRoot.right;\n const area = currentRoot.bounds.getPerimeter();\n const combinedAABB = currentRoot.bounds.combine(leafAABB);\n const combinedArea = combinedAABB.getPerimeter();\n // Calculate cost heuristic for creating a new parent and leaf\n const cost = 2 * combinedArea;\n // Minimum cost of pushing the leaf down the tree\n const inheritanceCost = 2 * (combinedArea - area);\n // Cost of descending\n let leftCost = 0;\n const leftCombined = leafAABB.combine(left.bounds);\n let newArea;\n let oldArea;\n if (left.isLeaf()) {\n leftCost = leftCombined.getPerimeter() + inheritanceCost;\n }\n else {\n oldArea = left.bounds.getPerimeter();\n newArea = leftCombined.getPerimeter();\n leftCost = newArea - oldArea + inheritanceCost;\n }\n let rightCost = 0;\n const rightCombined = leafAABB.combine(right.bounds);\n if (right.isLeaf()) {\n rightCost = rightCombined.getPerimeter() + inheritanceCost;\n }\n else {\n oldArea = right.bounds.getPerimeter();\n newArea = rightCombined.getPerimeter();\n rightCost = newArea - oldArea + inheritanceCost;\n }\n // cost is acceptable\n if (cost < leftCost && cost < rightCost) {\n break;\n }\n // Descend to the depths\n if (leftCost < rightCost) {\n currentRoot = left;\n }\n else {\n currentRoot = right;\n }\n }\n // Create the new parent node and insert into the tree\n const oldParent = currentRoot.parent;\n const newParent = new TreeNode(oldParent);\n newParent.bounds = leafAABB.combine(currentRoot.bounds);\n newParent.height = currentRoot.height + 1;\n if (oldParent !== null) {\n // The sibling node was not the root\n if (oldParent.left === currentRoot) {\n oldParent.left = newParent;\n }\n else {\n oldParent.right = newParent;\n }\n newParent.left = currentRoot;\n newParent.right = leaf;\n currentRoot.parent = newParent;\n leaf.parent = newParent;\n }\n else {\n // The sibling node was the root\n newParent.left = currentRoot;\n newParent.right = leaf;\n currentRoot.parent = newParent;\n leaf.parent = newParent;\n this.root = newParent;\n }\n // Walk up the tree fixing heights and AABBs\n let currentNode = leaf.parent;\n while (currentNode) {\n currentNode = this._balance(currentNode);\n if (!currentNode.left) {\n throw new Error('Parent of current leaf cannot have a null left child' + currentNode);\n }\n if (!currentNode.right) {\n throw new Error('Parent of current leaf cannot have a null right child' + currentNode);\n }\n currentNode.height = 1 + Math.max(currentNode.left.height, currentNode.right.height);\n currentNode.bounds = currentNode.left.bounds.combine(currentNode.right.bounds);\n currentNode = currentNode.parent;\n }\n }\n /**\n * Removes a node from the dynamic tree\n */\n _remove(leaf) {\n if (leaf === this.root) {\n this.root = null;\n return;\n }\n const parent = leaf.parent;\n const grandParent = parent.parent;\n let sibling;\n if (parent.left === leaf) {\n sibling = parent.right;\n }\n else {\n sibling = parent.left;\n }\n if (grandParent) {\n if (grandParent.left === parent) {\n grandParent.left = sibling;\n }\n else {\n grandParent.right = sibling;\n }\n sibling.parent = grandParent;\n let currentNode = grandParent;\n while (currentNode) {\n currentNode = this._balance(currentNode);\n currentNode.bounds = currentNode.left.bounds.combine(currentNode.right.bounds);\n currentNode.height = 1 + Math.max(currentNode.left.height, currentNode.right.height);\n currentNode = currentNode.parent;\n }\n }\n else {\n this.root = sibling;\n sibling.parent = null;\n }\n }\n /**\n * Tracks a body in the dynamic tree\n */\n trackCollider(collider) {\n const node = new TreeNode();\n node.data = collider;\n node.bounds = collider.bounds;\n node.bounds.left -= 2;\n node.bounds.top -= 2;\n node.bounds.right += 2;\n node.bounds.bottom += 2;\n this.nodes[collider.id.value] = node;\n this._insert(node);\n }\n /**\n * Updates the dynamic tree given the current bounds of each body being tracked\n */\n updateCollider(collider) {\n var _a;\n const node = this.nodes[collider.id.value];\n if (!node) {\n return false;\n }\n const b = collider.bounds;\n // if the body is outside the world no longer update it\n if (!this.worldBounds.contains(b)) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance().warn('Collider with id ' + collider.id.value + ' is outside the world bounds and will no longer be tracked for physics');\n this.untrackCollider(collider);\n return false;\n }\n if (node.bounds.contains(b)) {\n return false;\n }\n this._remove(node);\n b.left -= this._config.boundsPadding;\n b.top -= this._config.boundsPadding;\n b.right += this._config.boundsPadding;\n b.bottom += this._config.boundsPadding;\n // THIS IS CAUSING UNNECESSARY CHECKS\n if (collider.owner) {\n const body = (_a = collider.owner) === null || _a === void 0 ? void 0 : _a.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_2__.BodyComponent);\n if (body) {\n const multdx = ((body.vel.x * 32) / 1000) * this._config.velocityMultiplier;\n const multdy = ((body.vel.y * 32) / 1000) * this._config.velocityMultiplier;\n if (multdx < 0) {\n b.left += multdx;\n }\n else {\n b.right += multdx;\n }\n if (multdy < 0) {\n b.top += multdy;\n }\n else {\n b.bottom += multdy;\n }\n }\n }\n node.bounds = b;\n this._insert(node);\n return true;\n }\n /**\n * Untracks a body from the dynamic tree\n */\n untrackCollider(collider) {\n const node = this.nodes[collider.id.value];\n if (!node) {\n return;\n }\n this._remove(node);\n this.nodes[collider.id.value] = null;\n delete this.nodes[collider.id.value];\n }\n /**\n * Balances the tree about a node\n */\n _balance(node) {\n if (node === null) {\n throw new Error('Cannot balance at null node');\n }\n if (node.isLeaf() || node.height < 2) {\n return node;\n }\n const left = node.left;\n const right = node.right;\n const a = node;\n const b = left;\n const c = right;\n const d = left.left;\n const e = left.right;\n const f = right.left;\n const g = right.right;\n const balance = c.height - b.height;\n // Rotate c node up\n if (balance > 1) {\n // Swap the right node with it's parent\n c.left = a;\n c.parent = a.parent;\n a.parent = c;\n // The original node's old parent should point to the right node\n // this is mega confusing\n if (c.parent) {\n if (c.parent.left === a) {\n c.parent.left = c;\n }\n else {\n c.parent.right = c;\n }\n }\n else {\n this.root = c;\n }\n // Rotate\n if (f.height > g.height) {\n c.right = f;\n a.right = g;\n g.parent = a;\n a.bounds = b.bounds.combine(g.bounds);\n c.bounds = a.bounds.combine(f.bounds);\n a.height = 1 + Math.max(b.height, g.height);\n c.height = 1 + Math.max(a.height, f.height);\n }\n else {\n c.right = g;\n a.right = f;\n f.parent = a;\n a.bounds = b.bounds.combine(f.bounds);\n c.bounds = a.bounds.combine(g.bounds);\n a.height = 1 + Math.max(b.height, f.height);\n c.height = 1 + Math.max(a.height, g.height);\n }\n return c;\n }\n // Rotate left node up\n if (balance < -1) {\n // swap\n b.left = a;\n b.parent = a.parent;\n a.parent = b;\n // node's old parent should point to b\n if (b.parent) {\n if (b.parent.left === a) {\n b.parent.left = b;\n }\n else {\n if (b.parent.right !== a) {\n throw 'Error rotating Dynamic Tree';\n }\n b.parent.right = b;\n }\n }\n else {\n this.root = b;\n }\n // rotate\n if (d.height > e.height) {\n b.right = d;\n a.left = e;\n e.parent = a;\n a.bounds = c.bounds.combine(e.bounds);\n b.bounds = a.bounds.combine(d.bounds);\n a.height = 1 + Math.max(c.height, e.height);\n b.height = 1 + Math.max(a.height, d.height);\n }\n else {\n b.right = e;\n a.left = d;\n d.parent = a;\n a.bounds = c.bounds.combine(d.bounds);\n b.bounds = a.bounds.combine(e.bounds);\n a.height = 1 + Math.max(c.height, d.height);\n b.height = 1 + Math.max(a.height, e.height);\n }\n return b;\n }\n return node;\n }\n /**\n * Returns the internal height of the tree, shorter trees are better. Performance drops as the tree grows\n */\n getHeight() {\n if (this.root === null) {\n return 0;\n }\n return this.root.height;\n }\n /**\n * Queries the Dynamic Axis Aligned Tree for bodies that could be colliding with the provided body.\n *\n * In the query callback, it will be passed a potential collider. Returning true from this callback indicates\n * that you are complete with your query and you do not want to continue. Returning false will continue searching\n * the tree until all possible colliders have been returned.\n */\n query(collider, callback) {\n const bounds = collider.bounds;\n const helper = (currentNode) => {\n if (currentNode && currentNode.bounds.overlaps(bounds)) {\n if (currentNode.isLeaf() && currentNode.data !== collider) {\n if (callback.call(collider, currentNode.data)) {\n return true;\n }\n }\n else {\n return helper(currentNode.left) || helper(currentNode.right);\n }\n }\n return false;\n };\n helper(this.root);\n }\n /**\n * Queries the Dynamic Axis Aligned Tree for bodies that could be intersecting. By default the raycast query uses an infinitely\n * long ray to test the tree specified by `max`.\n *\n * In the query callback, it will be passed a potential body that intersects with the raycast. Returning true from this\n * callback indicates that your are complete with your query and do not want to continue. Return false will continue searching\n * the tree until all possible bodies that would intersect with the ray have been returned.\n */\n rayCastQuery(ray, max = Infinity, callback) {\n const helper = (currentNode) => {\n if (currentNode && currentNode.bounds.rayCast(ray, max)) {\n if (currentNode.isLeaf()) {\n if (callback.call(ray, currentNode.data)) {\n // ray hit a leaf! return the body\n return true;\n }\n }\n else {\n // ray hit but not at a leaf, recurse deeper\n return helper(currentNode.left) || helper(currentNode.right);\n }\n }\n return false; // ray missed\n };\n helper(this.root);\n }\n getNodes() {\n const helper = (currentNode) => {\n if (currentNode) {\n return [currentNode].concat(helper(currentNode.left), helper(currentNode.right));\n }\n else {\n return [];\n }\n };\n return helper(this.root);\n }\n debug(ex) {\n // draw all the nodes in the Dynamic Tree\n const helper = (currentNode) => {\n if (currentNode) {\n if (currentNode.isLeaf()) {\n currentNode.bounds.draw(ex, ___WEBPACK_IMPORTED_MODULE_3__.Color.Green);\n }\n else {\n currentNode.bounds.draw(ex, ___WEBPACK_IMPORTED_MODULE_3__.Color.White);\n }\n if (currentNode.left) {\n helper(currentNode.left);\n }\n if (currentNode.right) {\n helper(currentNode.right);\n }\n }\n };\n helper(this.root);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Detection/DynamicTreeCollisionProcessor.ts\":\n/*!**************************************************************!*\\\n !*** ./Collision/Detection/DynamicTreeCollisionProcessor.ts ***!\n \\**************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DynamicTreeCollisionProcessor: () => (/* binding */ DynamicTreeCollisionProcessor)\n/* harmony export */ });\n/* harmony import */ var _DynamicTree__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./DynamicTree */ \"./Collision/Detection/DynamicTree.ts\");\n/* harmony import */ var _Pair__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Pair */ \"./Collision/Detection/Pair.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math_ray__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../Math/ray */ \"./Math/ray.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Colliders/CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Group/CollisionGroup */ \"./Collision/Group/CollisionGroup.ts\");\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Id__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Id */ \"./Id.ts\");\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Responsible for performing the collision broadphase (locating potential collisions) and\n * the narrowphase (actual collision contacts)\n */\nclass DynamicTreeCollisionProcessor {\n constructor(_config) {\n this._config = _config;\n this._pairs = new Set();\n this._collisionPairCache = [];\n this._colliders = [];\n this._dynamicCollisionTree = new _DynamicTree__WEBPACK_IMPORTED_MODULE_0__.DynamicTree(_config.dynamicTree);\n }\n getColliders() {\n return this._colliders;\n }\n query(pointOrBounds) {\n const results = [];\n if (pointOrBounds instanceof _BoundingBox__WEBPACK_IMPORTED_MODULE_1__.BoundingBox) {\n this._dynamicCollisionTree.query({\n id: (0,_Id__WEBPACK_IMPORTED_MODULE_2__.createId)('collider', -1),\n owner: null,\n bounds: pointOrBounds\n }, (other) => {\n results.push(other);\n return false;\n });\n }\n else {\n this._dynamicCollisionTree.query({\n id: (0,_Id__WEBPACK_IMPORTED_MODULE_2__.createId)('collider', -1),\n owner: null,\n bounds: new _BoundingBox__WEBPACK_IMPORTED_MODULE_1__.BoundingBox(pointOrBounds.x, pointOrBounds.y, pointOrBounds.x, pointOrBounds.y)\n }, (other) => {\n results.push(other);\n return false;\n });\n }\n return results;\n }\n rayCast(ray, options) {\n var _a, _b, _c;\n const results = [];\n const maxDistance = (_a = options === null || options === void 0 ? void 0 : options.maxDistance) !== null && _a !== void 0 ? _a : Infinity;\n const collisionGroup = options === null || options === void 0 ? void 0 : options.collisionGroup;\n const collisionMask = !collisionGroup ? (_b = options === null || options === void 0 ? void 0 : options.collisionMask) !== null && _b !== void 0 ? _b : _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_3__.CollisionGroup.All.category : collisionGroup.category;\n const searchAllColliders = (_c = options === null || options === void 0 ? void 0 : options.searchAllColliders) !== null && _c !== void 0 ? _c : false;\n this._dynamicCollisionTree.rayCastQuery(ray, maxDistance, (collider) => {\n const owner = collider.owner;\n const maybeBody = owner.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_4__.BodyComponent);\n if ((options === null || options === void 0 ? void 0 : options.ignoreCollisionGroupAll) && maybeBody.group === _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_3__.CollisionGroup.All) {\n return false;\n }\n const canCollide = (collisionMask & maybeBody.group.category) !== 0;\n // Early exit if not the right group\n if ((maybeBody === null || maybeBody === void 0 ? void 0 : maybeBody.group) && !canCollide) {\n return false;\n }\n const hit = collider.rayCast(ray, maxDistance);\n if (hit) {\n if (options === null || options === void 0 ? void 0 : options.filter) {\n if (options.filter(hit)) {\n results.push(hit);\n if (!searchAllColliders) {\n // returning true exits the search\n return true;\n }\n }\n }\n else {\n results.push(hit);\n if (!searchAllColliders) {\n // returning true exits the search\n return true;\n }\n }\n }\n return false;\n });\n return results;\n }\n /**\n * Tracks a physics body for collisions\n */\n track(target) {\n if (!target) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_5__.Logger.getInstance().warn('Cannot track null collider');\n return;\n }\n if (target instanceof _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_6__.CompositeCollider) {\n const colliders = target.getColliders();\n for (const c of colliders) {\n c.owner = target.owner;\n this._colliders.push(c);\n this._dynamicCollisionTree.trackCollider(c);\n }\n }\n else {\n this._colliders.push(target);\n this._dynamicCollisionTree.trackCollider(target);\n }\n }\n /**\n * Untracks a physics body\n */\n untrack(target) {\n if (!target) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_5__.Logger.getInstance().warn('Cannot untrack a null collider');\n return;\n }\n if (target instanceof _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_6__.CompositeCollider) {\n const colliders = target.getColliders();\n for (const c of colliders) {\n const index = this._colliders.indexOf(c);\n if (index !== -1) {\n this._colliders.splice(index, 1);\n }\n this._dynamicCollisionTree.untrackCollider(c);\n }\n }\n else {\n const index = this._colliders.indexOf(target);\n if (index !== -1) {\n this._colliders.splice(index, 1);\n }\n this._dynamicCollisionTree.untrackCollider(target);\n }\n }\n _pairExists(colliderA, colliderB) {\n // if the collision pair has been calculated already short circuit\n const hash = _Pair__WEBPACK_IMPORTED_MODULE_7__.Pair.calculatePairHash(colliderA.id, colliderB.id);\n return this._pairs.has(hash);\n }\n /**\n * Detects potential collision pairs in a broadphase approach with the dynamic AABB tree strategy\n */\n broadphase(targets, elapsed, stats) {\n const seconds = elapsed / 1000;\n // Retrieve the list of potential colliders, exclude killed, prevented, and self\n const potentialColliders = targets.filter((other) => {\n var _a, _b;\n const body = (_a = other.owner) === null || _a === void 0 ? void 0 : _a.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_4__.BodyComponent);\n return ((_b = other.owner) === null || _b === void 0 ? void 0 : _b.isActive) && body.collisionType !== _CollisionType__WEBPACK_IMPORTED_MODULE_8__.CollisionType.PreventCollision;\n });\n // clear old list of collision pairs\n this._collisionPairCache = [];\n this._pairs.clear();\n // check for normal collision pairs\n let collider;\n for (let j = 0, l = potentialColliders.length; j < l; j++) {\n collider = potentialColliders[j];\n // Query the collision tree for potential colliders\n this._dynamicCollisionTree.query(collider, (other) => {\n if (!this._pairExists(collider, other) && _Pair__WEBPACK_IMPORTED_MODULE_7__.Pair.canCollide(collider, other)) {\n const pair = new _Pair__WEBPACK_IMPORTED_MODULE_7__.Pair(collider, other);\n this._pairs.add(pair.id);\n this._collisionPairCache.push(pair);\n }\n // Always return false, to query whole tree. Returning true in the query method stops searching\n return false;\n });\n }\n if (stats) {\n stats.physics.pairs = this._collisionPairCache.length;\n }\n // Check dynamic tree for fast moving objects\n // Fast moving objects are those moving at least there smallest bound per frame\n if (this._config.continuous.checkForFastBodies) {\n for (const collider of potentialColliders) {\n const body = collider.owner.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_4__.BodyComponent);\n // Skip non-active objects. Does not make sense on other collision types\n if (body.collisionType !== _CollisionType__WEBPACK_IMPORTED_MODULE_8__.CollisionType.Active) {\n continue;\n }\n // Maximum travel distance next frame\n const updateDistance = body.vel.magnitude * seconds + // velocity term\n body.acc.magnitude * 0.5 * seconds * seconds; // acc term\n // Find the minimum dimension\n const minDimension = Math.min(collider.bounds.height, collider.bounds.width);\n if (this._config.continuous.disableMinimumSpeedForFastBody || updateDistance > minDimension / 2) {\n if (stats) {\n stats.physics.fastBodies++;\n }\n // start with the oldPos because the integration for actors has already happened\n // objects resting on a surface may be slightly penetrating in the current position\n const updateVec = body.globalPos.sub(body.oldPos);\n const centerPoint = collider.center;\n const furthestPoint = collider.getFurthestPoint(body.vel);\n const origin = furthestPoint.sub(updateVec);\n const ray = new _Math_ray__WEBPACK_IMPORTED_MODULE_9__.Ray(origin, body.vel);\n // back the ray up by -2x surfaceEpsilon to account for fast moving objects starting on the surface\n ray.pos = ray.pos.add(ray.dir.scale(-2 * this._config.continuous.surfaceEpsilon));\n let minCollider;\n let minTranslate = new _Math_vector__WEBPACK_IMPORTED_MODULE_10__.Vector(Infinity, Infinity);\n this._dynamicCollisionTree.rayCastQuery(ray, updateDistance + this._config.continuous.surfaceEpsilon * 2, (other) => {\n if (!this._pairExists(collider, other) && _Pair__WEBPACK_IMPORTED_MODULE_7__.Pair.canCollide(collider, other)) {\n const hit = other.rayCast(ray, updateDistance + this._config.continuous.surfaceEpsilon * 10);\n if (hit) {\n const translate = hit.point.sub(origin);\n if (translate.magnitude < minTranslate.magnitude) {\n minTranslate = translate;\n minCollider = other;\n }\n }\n }\n return false;\n });\n if (minCollider && _Math_vector__WEBPACK_IMPORTED_MODULE_10__.Vector.isValid(minTranslate)) {\n const pair = new _Pair__WEBPACK_IMPORTED_MODULE_7__.Pair(collider, minCollider);\n if (!this._pairs.has(pair.id)) {\n this._pairs.add(pair.id);\n this._collisionPairCache.push(pair);\n }\n // move the fast moving object to the other body\n // need to push into the surface by ex.Physics.surfaceEpsilon\n const shift = centerPoint.sub(furthestPoint);\n body.globalPos = origin\n .add(shift)\n .add(minTranslate)\n .add(ray.dir.scale(10 * this._config.continuous.surfaceEpsilon)); // needed to push the shape slightly into contact\n collider.update(body.transform.get());\n if (stats) {\n stats.physics.fastBodyCollisions++;\n }\n }\n }\n }\n }\n // return cache\n return this._collisionPairCache;\n }\n /**\n * Applies narrow phase on collision pairs to find actual area intersections\n * Adds actual colliding pairs to stats' Frame data\n */\n narrowphase(pairs, stats) {\n let contacts = [];\n for (let i = 0; i < pairs.length; i++) {\n const newContacts = pairs[i].collide();\n contacts = contacts.concat(newContacts);\n if (stats && newContacts.length > 0) {\n for (const c of newContacts) {\n stats.physics.contacts.set(c.id, c);\n }\n }\n }\n if (stats) {\n stats.physics.collisions += contacts.length;\n }\n return contacts;\n }\n /**\n * Update the dynamic tree positions\n */\n update(targets) {\n let updated = 0;\n const len = targets.length;\n for (let i = 0; i < len; i++) {\n if (this._dynamicCollisionTree.updateCollider(targets[i])) {\n updated++;\n }\n }\n return updated;\n }\n debug(ex) {\n this._dynamicCollisionTree.debug(ex);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Detection/Pair.ts\":\n/*!*************************************!*\\\n !*** ./Collision/Detection/Pair.ts ***!\n \\*************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Pair: () => (/* binding */ Pair)\n/* harmony export */ });\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../BodyComponent */ \"./Collision/BodyComponent.ts\");\n\n\n/**\n * Models a potential collision between 2 colliders\n */\nclass Pair {\n constructor(colliderA, colliderB) {\n this.colliderA = colliderA;\n this.colliderB = colliderB;\n this.id = null;\n this.id = Pair.calculatePairHash(colliderA.id, colliderB.id);\n }\n /**\n * Returns whether a it is allowed for 2 colliders in a Pair to collide\n * @param colliderA\n * @param colliderB\n */\n static canCollide(colliderA, colliderB) {\n var _a, _b;\n // Prevent self collision\n if (colliderA.id === colliderB.id) {\n return false;\n }\n // Colliders with the same owner do not collide (composite colliders)\n if (colliderA.owner && colliderB.owner && colliderA.owner.id === colliderB.owner.id) {\n return false;\n }\n // if the pair has a member with zero dimension don't collide\n if (colliderA.localBounds.hasZeroDimensions() || colliderB.localBounds.hasZeroDimensions()) {\n return false;\n }\n const bodyA = (_a = colliderA === null || colliderA === void 0 ? void 0 : colliderA.owner) === null || _a === void 0 ? void 0 : _a.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_0__.BodyComponent);\n const bodyB = (_b = colliderB === null || colliderB === void 0 ? void 0 : colliderB.owner) === null || _b === void 0 ? void 0 : _b.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_0__.BodyComponent);\n // Body's needed for collision in the current state\n // TODO can we collide without a body?\n if (!bodyA || !bodyB) {\n return false;\n }\n // If both are in the same collision group short circuit\n if (!bodyA.group.canCollide(bodyB.group)) {\n return false;\n }\n // if both are fixed short circuit\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_1__.CollisionType.Fixed && bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_1__.CollisionType.Fixed) {\n return false;\n }\n // if the either is prevent collision short circuit\n if (bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_1__.CollisionType.PreventCollision || bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_1__.CollisionType.PreventCollision) {\n return false;\n }\n // if either is dead short circuit\n if (!bodyA.isActive || !bodyB.isActive) {\n return false;\n }\n return true;\n }\n /**\n * Returns whether or not it is possible for the pairs to collide\n */\n get canCollide() {\n const colliderA = this.colliderA;\n const colliderB = this.colliderB;\n return Pair.canCollide(colliderA, colliderB);\n }\n /**\n * Runs the collision intersection logic on the members of this pair\n */\n collide() {\n return this.colliderA.collide(this.colliderB);\n }\n /**\n * Check if the collider is part of the pair\n * @param collider\n */\n hasCollider(collider) {\n return collider === this.colliderA || collider === this.colliderB;\n }\n /**\n * Calculates the unique pair hash id for this collision pair (owning id)\n */\n static calculatePairHash(idA, idB) {\n if (idA.value < idB.value) {\n return `#${idA.value}+${idB.value}`;\n }\n else {\n return `#${idB.value}+${idA.value}`;\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Detection/QuadTree.ts\":\n/*!*****************************************!*\\\n !*** ./Collision/Detection/QuadTree.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ QuadTree: () => (/* binding */ QuadTree)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Color */ \"./Color.ts\");\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n\n\n/**\n * QuadTree spatial data structure. Useful for quickly retrieving all objects that might\n * be in a specific location.\n */\nclass QuadTree {\n constructor(bounds, options) {\n this.bounds = bounds;\n this.options = options;\n this._defaultOptions = {\n maxDepth: 10,\n capacity: 10,\n level: 0\n };\n this.items = [];\n this._isDivided = false;\n this.topLeft = null;\n this.topRight = null;\n this.bottomLeft = null;\n this.bottomRight = null;\n this.options = { ...this._defaultOptions, ...options };\n this.halfWidth = bounds.width / 2;\n this.halfHeight = bounds.height / 2;\n }\n /**\n * Splits the quad tree one level deeper\n */\n _split() {\n this._isDivided = true;\n const newLevelOptions = {\n maxDepth: this.options.maxDepth,\n capacity: this.options.capacity,\n level: this.options.level + 1\n };\n this.topLeft = new QuadTree(new _BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox({\n left: this.bounds.left,\n top: this.bounds.top,\n right: this.bounds.left + this.halfWidth,\n bottom: this.bounds.top + this.halfHeight\n }), newLevelOptions);\n this.topRight = new QuadTree(new _BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox({\n left: this.bounds.left + this.halfWidth,\n top: this.bounds.top,\n right: this.bounds.right,\n bottom: this.bounds.top + this.halfHeight\n }), newLevelOptions);\n this.bottomLeft = new QuadTree(new _BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox({\n left: this.bounds.left,\n top: this.bounds.top + this.halfHeight,\n right: this.bounds.left + this.halfWidth,\n bottom: this.bounds.bottom\n }), newLevelOptions);\n this.bottomRight = new QuadTree(new _BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox({\n left: this.bounds.left + this.halfWidth,\n top: this.bounds.top + this.halfHeight,\n right: this.bounds.right,\n bottom: this.bounds.bottom\n }), newLevelOptions);\n }\n _insertIntoSubNodes(item) {\n var _a, _b, _c, _d;\n if ((_a = this.topLeft) === null || _a === void 0 ? void 0 : _a.bounds.overlaps(item.bounds)) {\n this.topLeft.insert(item);\n }\n if ((_b = this.topRight) === null || _b === void 0 ? void 0 : _b.bounds.overlaps(item.bounds)) {\n this.topRight.insert(item);\n }\n if ((_c = this.bottomLeft) === null || _c === void 0 ? void 0 : _c.bounds.overlaps(item.bounds)) {\n this.bottomLeft.insert(item);\n }\n if ((_d = this.bottomRight) === null || _d === void 0 ? void 0 : _d.bounds.overlaps(item.bounds)) {\n this.bottomRight.insert(item);\n }\n }\n /**\n * Insert an item to be tracked in the QuadTree\n * @param item\n */\n insert(item) {\n // add to subnodes if it matches\n if (this._isDivided) {\n this._insertIntoSubNodes(item);\n return;\n }\n // leaf case\n this.items.push(item);\n // capacity\n if (this.items.length > this.options.capacity && this.options.level < this.options.maxDepth) {\n if (!this._isDivided) {\n this._split();\n }\n // divide this level's items into it's subnodes\n for (const item of this.items) {\n this._insertIntoSubNodes(item);\n }\n // clear this level\n this.items.length = 0;\n }\n }\n /**\n * Remove a tracked item in the QuadTree\n * @param item\n */\n remove(item) {\n var _a, _b, _c, _d;\n if (!this.bounds.overlaps(item.bounds)) {\n return;\n }\n if (!this._isDivided) {\n const index = this.items.indexOf(item);\n if (index > -1) {\n this.items.splice(index, 1);\n }\n return;\n }\n if ((_a = this.topLeft) === null || _a === void 0 ? void 0 : _a.bounds.overlaps(item.bounds)) {\n this.topLeft.remove(item);\n }\n if ((_b = this.topRight) === null || _b === void 0 ? void 0 : _b.bounds.overlaps(item.bounds)) {\n this.topRight.remove(item);\n }\n if ((_c = this.bottomLeft) === null || _c === void 0 ? void 0 : _c.bounds.overlaps(item.bounds)) {\n this.bottomLeft.remove(item);\n }\n if ((_d = this.bottomRight) === null || _d === void 0 ? void 0 : _d.bounds.overlaps(item.bounds)) {\n this.bottomRight.remove(item);\n }\n }\n /**\n * Query the structure for all objects that intersect the bounding box\n * @param boundingBox\n * @returns items\n */\n query(boundingBox) {\n let results = this.items;\n if (this._isDivided) {\n if (this.topLeft.bounds.overlaps(boundingBox)) {\n results = results.concat(this.topLeft.query(boundingBox));\n }\n if (this.topRight.bounds.overlaps(boundingBox)) {\n results = results.concat(this.topRight.query(boundingBox));\n }\n if (this.bottomLeft.bounds.overlaps(boundingBox)) {\n results = results.concat(this.bottomLeft.query(boundingBox));\n }\n if (this.bottomRight.bounds.overlaps(boundingBox)) {\n results = results.concat(this.bottomRight.query(boundingBox));\n }\n }\n results = results.filter((item, index) => {\n return results.indexOf(item) >= index;\n });\n return results;\n }\n clear() {\n this.items = [];\n this._isDivided = false;\n this.topLeft = null;\n this.topRight = null;\n this.bottomLeft = null;\n this.bottomRight = null;\n }\n getAllItems() {\n let results = this.items;\n if (this._isDivided) {\n results = results.concat(this.topLeft.getAllItems());\n results = results.concat(this.topRight.getAllItems());\n results = results.concat(this.bottomLeft.getAllItems());\n results = results.concat(this.bottomRight.getAllItems());\n }\n results = results.filter((item, index) => {\n return results.indexOf(item) >= index;\n });\n return results;\n }\n getTreeDepth() {\n if (!this._isDivided) {\n return 0;\n }\n return (1 +\n Math.max(this.topLeft.getTreeDepth(), this.topRight.getTreeDepth(), this.bottomLeft.getTreeDepth(), this.bottomRight.getTreeDepth()));\n }\n debug(ctx) {\n this.bounds.draw(ctx, _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Yellow);\n if (this._isDivided) {\n this.topLeft.bounds.draw(ctx, _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Yellow);\n this.topRight.bounds.draw(ctx, _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Yellow);\n this.bottomLeft.bounds.draw(ctx, _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Yellow);\n this.bottomRight.bounds.draw(ctx, _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Yellow);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Detection/SparseHashGrid.ts\":\n/*!***********************************************!*\\\n !*** ./Collision/Detection/SparseHashGrid.ts ***!\n \\***********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ HashGridCell: () => (/* binding */ HashGridCell),\n/* harmony export */ HashGridProxy: () => (/* binding */ HashGridProxy),\n/* harmony export */ SparseHashGrid: () => (/* binding */ SparseHashGrid)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Color */ \"./Color.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_RentalPool__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Util/RentalPool */ \"./Util/RentalPool.ts\");\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n\n\n\n\nclass HashGridProxy {\n constructor(object, gridSize) {\n this.object = object;\n this.id = -1;\n this.cells = [];\n this.hasZeroBounds = false;\n this.gridSize = gridSize;\n this.bounds = object.bounds;\n this.hasZeroBounds = this.bounds.hasZeroDimensions();\n this.leftX = Math.floor(this.bounds.left / this.gridSize);\n this.rightX = Math.floor(this.bounds.right / this.gridSize);\n this.bottomY = Math.floor(this.bounds.bottom / this.gridSize);\n this.topY = Math.floor(this.bounds.top / this.gridSize);\n }\n /**\n * Has the hashed bounds changed\n */\n hasChanged() {\n const bounds = this.object.bounds;\n const leftX = Math.floor(bounds.left / this.gridSize);\n const rightX = Math.floor(bounds.right / this.gridSize);\n const bottomY = Math.floor(bounds.bottom / this.gridSize);\n const topY = Math.floor(bounds.top / this.gridSize);\n if (this.leftX !== leftX || this.rightX !== rightX || this.bottomY !== bottomY || this.topY !== topY) {\n return true;\n }\n return false;\n }\n /**\n * Clears all collider references\n */\n clear() {\n for (const cell of this.cells) {\n const index = cell.proxies.indexOf(this);\n if (index > -1) {\n cell.proxies.splice(index, 1);\n }\n // TODO reclaim cell in pool if empty?\n }\n }\n /**\n * Update bounds of the proxy\n */\n updateBounds() {\n this.bounds = this.object.bounds;\n }\n /**\n * Updates the hashed bounds coordinates\n */\n update() {\n this.bounds = this.object.bounds;\n this.leftX = Math.floor(this.bounds.left / this.gridSize);\n this.rightX = Math.floor(this.bounds.right / this.gridSize);\n this.bottomY = Math.floor(this.bounds.bottom / this.gridSize);\n this.topY = Math.floor(this.bounds.top / this.gridSize);\n this.hasZeroBounds = this.object.bounds.hasZeroDimensions();\n }\n}\nclass HashGridCell {\n constructor() {\n this.proxies = [];\n }\n configure(x, y) {\n this.x = x;\n this.y = y;\n this.key = HashGridCell.calculateHashKey(x, y);\n }\n static calculateHashKey(x, y) {\n return `${x}+${y}`;\n }\n}\nclass SparseHashGrid {\n constructor(options) {\n this.bounds = new _BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox();\n this._hashGridCellPool = new _Util_RentalPool__WEBPACK_IMPORTED_MODULE_1__.RentalPool(() => new HashGridCell(), (instance) => {\n instance.configure(0, 0);\n instance.proxies.length = 0;\n return instance;\n }, 1000);\n this.gridSize = options.size;\n this.sparseHashGrid = new Map();\n this.objectToProxy = new Map();\n if (options.proxyFactory) {\n this._buildProxy = (object) => options.proxyFactory(object, this.gridSize);\n }\n else {\n this._buildProxy = (object) => new HashGridProxy(object, this.gridSize);\n }\n // TODO dynamic grid size potentially larger than the largest collider\n // TODO Re-hash the objects if the median proves to be different\n }\n query(boundsOrPoint) {\n const results = new Set();\n if (boundsOrPoint instanceof _BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox) {\n const bounds = boundsOrPoint;\n const leftX = Math.floor(bounds.left / this.gridSize);\n const rightX = Math.floor(bounds.right / this.gridSize);\n const bottomY = Math.floor(bounds.bottom / this.gridSize);\n const topY = Math.floor(bounds.top / this.gridSize);\n for (let x = leftX; x <= rightX; x++) {\n for (let y = topY; y <= bottomY; y++) {\n const key = HashGridCell.calculateHashKey(x, y);\n // Hash bounds into appropriate cell\n const cell = this.sparseHashGrid.get(key);\n if (cell) {\n for (let i = 0; i < cell.proxies.length; i++) {\n cell.proxies[i].updateBounds();\n if (cell.proxies[i].bounds.intersect(bounds)) {\n results.add(cell.proxies[i].object);\n }\n }\n }\n }\n }\n }\n else {\n const point = boundsOrPoint;\n const key = HashGridCell.calculateHashKey(Math.floor(point.x / this.gridSize), Math.floor(point.y / this.gridSize));\n // Hash points into appropriate cell\n const cell = this.sparseHashGrid.get(key);\n if (cell) {\n for (let i = 0; i < cell.proxies.length; i++) {\n cell.proxies[i].updateBounds();\n if (cell.proxies[i].bounds.contains(point)) {\n results.add(cell.proxies[i].object);\n }\n }\n }\n }\n return Array.from(results);\n }\n get(xCoord, yCoord) {\n const key = HashGridCell.calculateHashKey(xCoord, yCoord);\n const cell = this.sparseHashGrid.get(key);\n return cell;\n }\n _insert(x, y, proxy) {\n const key = HashGridCell.calculateHashKey(x, y);\n // Hash collider into appropriate cell\n let cell = this.sparseHashGrid.get(key);\n if (!cell) {\n cell = this._hashGridCellPool.rent();\n cell.configure(x, y);\n this.sparseHashGrid.set(cell.key, cell);\n }\n cell.proxies.push(proxy);\n proxy.cells.push(cell); // TODO dupes, doesn't seem to be a problem\n this.bounds.combine(proxy.bounds, this.bounds);\n }\n _remove(x, y, proxy) {\n const key = HashGridCell.calculateHashKey(x, y);\n // Hash collider into appropriate cell\n const cell = this.sparseHashGrid.get(key);\n if (cell) {\n const proxyIndex = cell.proxies.indexOf(proxy);\n if (proxyIndex > -1) {\n cell.proxies.splice(proxyIndex, 1);\n }\n const cellIndex = proxy.cells.indexOf(cell);\n if (cellIndex > -1) {\n proxy.cells.splice(cellIndex, 1);\n }\n if (cell.proxies.length === 0) {\n this._hashGridCellPool.return(cell);\n this.sparseHashGrid.delete(key);\n }\n }\n }\n track(target) {\n const proxy = this._buildProxy(target);\n this.objectToProxy.set(target, proxy);\n for (let x = proxy.leftX; x <= proxy.rightX; x++) {\n for (let y = proxy.topY; y <= proxy.bottomY; y++) {\n this._insert(x, y, proxy);\n }\n }\n }\n untrack(target) {\n const proxy = this.objectToProxy.get(target);\n if (proxy) {\n proxy.clear();\n this.objectToProxy.delete(target);\n }\n }\n update(targets) {\n let updated = 0;\n // FIXME resetting bounds is wrong, if nothing has updated then\n // the bounds stay 0\n // this.bounds.reset();\n for (const target of targets) {\n const proxy = this.objectToProxy.get(target);\n if (!proxy) {\n continue;\n }\n if (proxy.hasChanged()) {\n // TODO slightly wasteful only remove from changed\n for (let x = proxy.leftX; x <= proxy.rightX; x++) {\n for (let y = proxy.topY; y <= proxy.bottomY; y++) {\n this._remove(x, y, proxy);\n }\n }\n proxy.update();\n // TODO slightly wasteful only add new\n for (let x = proxy.leftX; x <= proxy.rightX; x++) {\n for (let y = proxy.topY; y <= proxy.bottomY; y++) {\n this._insert(x, y, proxy);\n }\n }\n updated++;\n }\n }\n return updated;\n }\n debug(ex, elapsed) {\n const transparent = _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Transparent;\n const color = _Color__WEBPACK_IMPORTED_MODULE_2__.Color.White;\n for (const cell of this.sparseHashGrid.values()) {\n ex.drawRectangle((0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(cell.x * this.gridSize, cell.y * this.gridSize), this.gridSize, this.gridSize, transparent, color, 2);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Detection/SparseHashGridCollisionProcessor.ts\":\n/*!*****************************************************************!*\\\n !*** ./Collision/Detection/SparseHashGridCollisionProcessor.ts ***!\n \\*****************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ HashColliderProxy: () => (/* binding */ HashColliderProxy),\n/* harmony export */ SparseHashGridCollisionProcessor: () => (/* binding */ SparseHashGridCollisionProcessor)\n/* harmony export */ });\n/* harmony import */ var _Id__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Id */ \"./Id.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_Pool__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Util/Pool */ \"./Util/Pool.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Colliders/CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Group/CollisionGroup */ \"./Collision/Group/CollisionGroup.ts\");\n/* harmony import */ var _Pair__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Pair */ \"./Collision/Detection/Pair.ts\");\n/* harmony import */ var _SparseHashGrid__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./SparseHashGrid */ \"./Collision/Detection/SparseHashGrid.ts\");\n\n\n\n\n\n\n\n\n\n/**\n * Proxy type to stash collision info\n */\nclass HashColliderProxy extends _SparseHashGrid__WEBPACK_IMPORTED_MODULE_0__.HashGridProxy {\n constructor(collider, gridSize) {\n var _a, _b;\n super(collider, gridSize);\n this.collider = collider;\n this.id = -1;\n this.hasZeroBounds = false;\n /**\n * References to the hash cell the collider is a current member of\n */\n this.cells = [];\n this.gridSize = gridSize;\n const bounds = collider.bounds;\n this.hasZeroBounds = bounds.hasZeroDimensions();\n this.leftX = Math.floor(bounds.left / this.gridSize);\n this.rightX = Math.floor(bounds.right / this.gridSize);\n this.bottomY = Math.floor(bounds.bottom / this.gridSize);\n this.topY = Math.floor(bounds.top / this.gridSize);\n this.owner = collider.owner;\n this.body = (_a = this.owner) === null || _a === void 0 ? void 0 : _a.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_1__.BodyComponent);\n this.collisionType = (_b = this.body.collisionType) !== null && _b !== void 0 ? _b : _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.PreventCollision;\n }\n /**\n * Updates the hashed bounds coordinates\n */\n update() {\n var _a, _b;\n super.update();\n this.body = (_a = this.owner) === null || _a === void 0 ? void 0 : _a.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_1__.BodyComponent);\n this.collisionType = (_b = this.body.collisionType) !== null && _b !== void 0 ? _b : _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.PreventCollision;\n this.hasZeroBounds = this.collider.localBounds.hasZeroDimensions();\n }\n}\n/**\n * This collision processor uses a sparsely populated grid of uniform cells to bucket potential\n * colliders together for the purpose of detecting collision pairs and collisions.\n */\nclass SparseHashGridCollisionProcessor {\n constructor(options) {\n this._pairs = new Set();\n this._nonPairs = new Set();\n this._pairPool = new _Util_Pool__WEBPACK_IMPORTED_MODULE_3__.Pool(() => new _Pair__WEBPACK_IMPORTED_MODULE_4__.Pair({ id: (0,_Id__WEBPACK_IMPORTED_MODULE_5__.createId)('collider', 0) }, { id: (0,_Id__WEBPACK_IMPORTED_MODULE_5__.createId)('collider', 0) }), (instance) => {\n instance.colliderA = null;\n instance.colliderB = null;\n return instance;\n }, 200);\n this.gridSize = options.size;\n this.hashGrid = new _SparseHashGrid__WEBPACK_IMPORTED_MODULE_0__.SparseHashGrid({\n size: this.gridSize,\n proxyFactory: (collider, size) => new HashColliderProxy(collider, size)\n });\n this._pairPool.disableWarnings = true;\n // TODO dynamic grid size potentially larger than the largest collider\n // TODO Re-hash the objects if the median proves to be different\n }\n getColliders() {\n return Array.from(this.hashGrid.objectToProxy.keys());\n }\n query(boundsOrPoint) {\n // FIXME workaround TS: https://github.com/microsoft/TypeScript/issues/14107\n return this.hashGrid.query(boundsOrPoint);\n }\n rayCast(ray, options) {\n var _a, _b, _c;\n // DDA raycast algo\n const results = [];\n const maxDistance = (_a = options === null || options === void 0 ? void 0 : options.maxDistance) !== null && _a !== void 0 ? _a : Infinity;\n const collisionGroup = options === null || options === void 0 ? void 0 : options.collisionGroup;\n const collisionMask = !collisionGroup ? (_b = options === null || options === void 0 ? void 0 : options.collisionMask) !== null && _b !== void 0 ? _b : _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_6__.CollisionGroup.All.category : collisionGroup.category;\n const searchAllColliders = (_c = options === null || options === void 0 ? void 0 : options.searchAllColliders) !== null && _c !== void 0 ? _c : false;\n const unitRay = ray.dir.normalize();\n const dydx = unitRay.y / unitRay.x;\n const dxdy = unitRay.x / unitRay.y;\n const unitStepX = Math.sqrt(1 + dydx * dydx) * this.gridSize;\n const unitStepY = Math.sqrt(1 + dxdy * dxdy) * this.gridSize;\n const startXCoord = ray.pos.x / this.gridSize;\n const startYCoord = ray.pos.y / this.gridSize;\n const stepDir = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_7__.vec)(1, 1);\n let currentXCoord = ~~startXCoord;\n let currentYCoord = ~~startYCoord;\n let currentRayLengthX = 0;\n let currentRayLengthY = 0;\n if (unitRay.x < 0) {\n stepDir.x = -1;\n currentRayLengthX = (startXCoord - currentXCoord) * unitStepX;\n }\n else {\n stepDir.x = 1;\n currentRayLengthX = (currentXCoord + 1 - startXCoord) * unitStepX;\n }\n if (unitRay.y < 0) {\n stepDir.y = -1;\n currentRayLengthY = (startYCoord - currentYCoord) * unitStepY;\n }\n else {\n stepDir.y = 1;\n currentRayLengthY = (currentYCoord + 1 - startYCoord) * unitStepY;\n }\n const collidersVisited = new Set();\n let done = false;\n let maxIterations = 9999;\n while (!done && maxIterations > 0) {\n maxIterations--; // safety exit\n // exit if exhausted max hash grid coordinate, bounds of the sparse grid\n if (!this.hashGrid.bounds.contains((0,_Math_vector__WEBPACK_IMPORTED_MODULE_7__.vec)(currentXCoord * this.gridSize, currentYCoord * this.gridSize))) {\n break;\n }\n // Test colliders at cell\n const key = _SparseHashGrid__WEBPACK_IMPORTED_MODULE_0__.HashGridCell.calculateHashKey(currentXCoord, currentYCoord);\n const cell = this.hashGrid.sparseHashGrid.get(key);\n if (cell) {\n const cellHits = [];\n for (let colliderIndex = 0; colliderIndex < cell.proxies.length; colliderIndex++) {\n const collider = cell.proxies[colliderIndex];\n if (!collidersVisited.has(collider.collider.id.value)) {\n collidersVisited.add(collider.collider.id.value);\n if ((options === null || options === void 0 ? void 0 : options.ignoreCollisionGroupAll) && collider.body.group === _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_6__.CollisionGroup.All) {\n continue;\n }\n const canCollide = (collisionMask & collider.body.group.category) !== 0;\n // Early exit if not the right group\n if (collider.body.group && !canCollide) {\n continue;\n }\n const hit = collider.collider.rayCast(ray, maxDistance);\n // Collect up all the colliders that hit inside a cell\n // they can be in any order so we need to sort them next\n if (hit) {\n cellHits.push(hit);\n }\n }\n }\n cellHits.sort((hit1, hit2) => hit1.distance - hit2.distance);\n for (let i = 0; i < cellHits.length; i++) {\n const hit = cellHits[i];\n if (options === null || options === void 0 ? void 0 : options.filter) {\n if (options.filter(hit)) {\n results.push(hit);\n if (!searchAllColliders) {\n done = true;\n break;\n }\n }\n }\n else {\n results.push(hit);\n if (!searchAllColliders) {\n done = true;\n break;\n }\n }\n }\n }\n if (currentRayLengthX < currentRayLengthY) {\n currentXCoord += stepDir.x;\n currentRayLengthX += unitStepX;\n }\n else {\n currentYCoord += stepDir.y;\n currentRayLengthY += unitStepY;\n }\n }\n // Sort by distance\n results.sort((hit1, hit2) => hit1.distance - hit2.distance);\n if (!searchAllColliders && results.length) {\n return [results[0]];\n }\n return results;\n }\n /**\n * Adds the collider to the internal data structure for collision tracking\n * @param target\n */\n track(target) {\n let colliders = [target];\n if (target instanceof _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_8__.CompositeCollider) {\n const compColliders = target.getColliders();\n for (const c of compColliders) {\n c.owner = target.owner;\n }\n colliders = compColliders;\n }\n for (const target of colliders) {\n this.hashGrid.track(target);\n }\n }\n /**\n * Removes a collider from the internal data structure for tracking collisions\n * @param target\n */\n untrack(target) {\n let colliders = [target];\n if (target instanceof _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_8__.CompositeCollider) {\n colliders = target.getColliders();\n }\n for (const target of colliders) {\n this.hashGrid.untrack(target);\n }\n }\n _canCollide(colliderA, colliderB) {\n // Prevent self collision\n if (colliderA.collider.id === colliderB.collider.id) {\n return false;\n }\n // Colliders with the same owner do not collide (composite colliders)\n if (colliderA.owner && colliderB.owner && colliderA.owner.id === colliderB.owner.id) {\n return false;\n }\n // if the pair has a member with zero dimension don't collide\n if (colliderA.hasZeroBounds || colliderB.hasZeroBounds) {\n return false;\n }\n // If both are in the same collision group short circuit\n if (!colliderA.body.group.canCollide(colliderB.body.group)) {\n return false;\n }\n // if both are fixed short circuit\n if (colliderA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.Fixed && colliderB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.Fixed) {\n return false;\n }\n // if the either is prevent collision short circuit\n if (colliderA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.PreventCollision || colliderB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.PreventCollision) {\n return false;\n }\n // if either is dead short circuit\n if (!colliderA.owner.isActive || !colliderB.owner.isActive) {\n return false;\n }\n return true;\n }\n /**\n * Runs the broadphase sweep over tracked colliders and returns possible collision pairs\n * @param targets\n * @param elapsed\n */\n broadphase(targets, elapsed) {\n const pairs = [];\n this._pairs.clear();\n this._nonPairs.clear();\n let proxyId = 0;\n for (const proxy of this.hashGrid.objectToProxy.values()) {\n proxy.id = proxyId++; // track proxies we've already processed\n if (!proxy.owner.isActive || proxy.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.PreventCollision) {\n continue;\n }\n // for every cell proxy collider is member of\n for (let cellIndex = 0; cellIndex < proxy.cells.length; cellIndex++) {\n const cell = proxy.cells[cellIndex];\n // TODO Can we skip any cells or make this iteration faster?\n // maybe a linked list here\n for (let otherIndex = 0; otherIndex < cell.proxies.length; otherIndex++) {\n const other = cell.proxies[otherIndex];\n if (other.id === proxy.id) {\n // skip duplicates\n continue;\n }\n const id = _Pair__WEBPACK_IMPORTED_MODULE_4__.Pair.calculatePairHash(proxy.collider.id, other.collider.id);\n if (this._nonPairs.has(id)) {\n continue; // Is there a way we can re-use the non-pair cache\n }\n if (!this._pairs.has(id) && this._canCollide(proxy, other) && proxy.object.bounds.overlaps(other.object.bounds)) {\n const pair = this._pairPool.get();\n pair.colliderA = proxy.collider;\n pair.colliderB = other.collider;\n pair.id = id;\n this._pairs.add(id);\n pairs.push(pair);\n }\n else {\n this._nonPairs.add(id);\n }\n }\n }\n }\n return pairs;\n }\n /**\n * Runs a fine grain pass on collision pairs and does geometry intersection tests producing any contacts\n * @param pairs\n * @param stats\n */\n narrowphase(pairs, stats) {\n const contacts = [];\n for (let i = 0; i < pairs.length; i++) {\n const newContacts = pairs[i].collide();\n for (let j = 0; j < newContacts.length; j++) {\n const c = newContacts[j];\n contacts.push(c);\n if (stats) {\n stats.physics.contacts.set(c.id, c);\n }\n }\n }\n this._pairPool.done();\n if (stats) {\n stats.physics.collisions += contacts.length;\n }\n return contacts; // TODO maybe we can re-use contacts as likely pairs next frame\n }\n /**\n * Perform data structure maintenance, returns number of colliders updated\n */\n update(targets, elapsed) {\n return this.hashGrid.update(targets);\n }\n /**\n * Draws the internal data structure\n * @param ex\n * @param elapsed\n */\n debug(ex, elapsed) {\n this.hashGrid.debug(ex, elapsed);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Detection/SpatialPartitionStrategy.ts\":\n/*!*********************************************************!*\\\n !*** ./Collision/Detection/SpatialPartitionStrategy.ts ***!\n \\*********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SpatialPartitionStrategy: () => (/* binding */ SpatialPartitionStrategy)\n/* harmony export */ });\n/**\n * Possible collision resolution strategies\n *\n * The default is {@apilink SolverStrategy.Arcade} which performs simple axis aligned arcade style physics. This is useful for things\n * like platformers or top down games.\n *\n * More advanced rigid body physics are enabled by setting {@apilink SolverStrategy.Realistic} which allows for complicated\n * simulated physical interactions.\n */\nvar SpatialPartitionStrategy;\n(function (SpatialPartitionStrategy) {\n SpatialPartitionStrategy[\"DynamicTree\"] = \"dynamic-tree\";\n SpatialPartitionStrategy[\"SparseHashGrid\"] = \"sparse-hash-grid\";\n})(SpatialPartitionStrategy || (SpatialPartitionStrategy = {}));\n\n\n/***/ }),\n\n/***/ \"./Collision/Group/CollisionGroup.ts\":\n/*!*******************************************!*\\\n !*** ./Collision/Group/CollisionGroup.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CollisionGroup: () => (/* binding */ CollisionGroup)\n/* harmony export */ });\n/* harmony import */ var _CollisionGroupManager__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./CollisionGroupManager */ \"./Collision/Group/CollisionGroupManager.ts\");\n\n/**\n * CollisionGroups indicate like members that do not collide with each other. Use {@apilink CollisionGroupManager} to create {@apilink CollisionGroup}s\n *\n * For example:\n *\n * Players have collision group \"player\"\n *\n * ![Player Collision Group](/assets/images/docs/CollisionGroupsPlayer.png)\n *\n * Enemies have collision group \"enemy\"\n *\n * ![Enemy Collision Group](/assets/images/docs/CollisionGroupsEnemy.png)\n *\n * Blocks have collision group \"ground\"\n *\n * ![Ground collision group](/assets/images/docs/CollisionGroupsGround.png)\n *\n * Players don't collide with each other, but enemies and blocks. Likewise, enemies don't collide with each other but collide\n * with players and blocks.\n *\n * This is done with bitmasking, see the following pseudo-code\n *\n * PlayerGroup = `0b001`\n * PlayerGroupMask = `0b110`\n *\n * EnemyGroup = `0b010`\n * EnemyGroupMask = `0b101`\n *\n * BlockGroup = `0b100`\n * BlockGroupMask = `0b011`\n *\n * Should Players collide? No because the bitwise mask evaluates to 0\n * `(player1.group & player2.mask) === 0`\n * `(0b001 & 0b110) === 0`\n *\n * Should Players and Enemies collide? Yes because the bitwise mask is non-zero\n * `(player1.group & enemy1.mask) === 1`\n * `(0b001 & 0b101) === 1`\n *\n * Should Players and Blocks collide? Yes because the bitwise mask is non-zero\n * `(player1.group & blocks1.mask) === 1`\n * `(0b001 & 0b011) === 1`\n */\nclass CollisionGroup {\n /**\n * STOP!!** It is preferred that {@apilink CollisionGroupManager.create} is used to create collision groups\n * unless you know how to construct the proper bitmasks. See https://github.com/excaliburjs/Excalibur/issues/1091 for more info.\n * @param name Name of the collision group\n * @param category 32 bit category for the group, should be a unique power of 2. For example `0b001` or `0b010`\n * @param mask 32 bit mask of category, or `~category` generally. For a category of `0b001`, the mask would be `0b110`\n */\n constructor(name, category, mask) {\n this._name = name;\n this._category = category;\n this._mask = mask;\n }\n /**\n * Get the name of the collision group\n */\n get name() {\n return this._name;\n }\n /**\n * Get the category of the collision group, a 32 bit number which should be a unique power of 2\n */\n get category() {\n return this._category;\n }\n /**\n * Get the mask for this collision group\n */\n get mask() {\n return this._mask;\n }\n /**\n * Evaluates whether 2 collision groups can collide\n *\n * This means the mask has the same bit set the other category and vice versa\n * @param other CollisionGroup\n */\n canCollide(other) {\n const overlap1 = this.category & other.mask;\n const overlap2 = this.mask & other.category;\n return overlap1 !== 0 && overlap2 !== 0;\n }\n /**\n * Inverts the collision group. For example, if before the group specified \"players\",\n * inverting would specify all groups except players\n * @returns CollisionGroup\n */\n invert() {\n const group = _CollisionGroupManager__WEBPACK_IMPORTED_MODULE_0__.CollisionGroupManager.create('~(' + this.name + ')', ~this.mask | 0);\n group._category = ~this.category;\n return group;\n }\n /**\n * Combine collision groups with each other. The new group includes all of the previous groups.\n * @param collisionGroups\n */\n static combine(collisionGroups) {\n const combinedName = collisionGroups.map((c) => c.name).join('+');\n const combinedCategory = collisionGroups.reduce((current, g) => g.category | current, 0b0);\n const combinedMask = ~combinedCategory;\n return _CollisionGroupManager__WEBPACK_IMPORTED_MODULE_0__.CollisionGroupManager.create(combinedName, combinedMask);\n }\n /**\n * Creates a collision group that collides with the listed groups\n * @param collisionGroups\n */\n static collidesWith(collisionGroups) {\n const combinedName = `collidesWith(${collisionGroups.map((c) => c.name).join('+')})`;\n const combinedMask = collisionGroups.reduce((current, g) => g.category | current, 0b0);\n return _CollisionGroupManager__WEBPACK_IMPORTED_MODULE_0__.CollisionGroupManager.create(combinedName, combinedMask);\n }\n toString() {\n return `\r\ncategory: ${this.category.toString(2).padStart(32, '0')}\r\nmask: ${(this.mask >>> 0).toString(2).padStart(32, '0')}\r\n `;\n }\n}\n/**\n * The `All` {@apilink CollisionGroup} is a special group that collides with all other groups including itself,\n * it is the default collision group on colliders.\n */\nCollisionGroup.All = new CollisionGroup('Collide with all groups', -1, -1);\n\n\n/***/ }),\n\n/***/ \"./Collision/Group/CollisionGroupManager.ts\":\n/*!**************************************************!*\\\n !*** ./Collision/Group/CollisionGroupManager.ts ***!\n \\**************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CollisionGroupManager: () => (/* binding */ CollisionGroupManager)\n/* harmony export */ });\n/* harmony import */ var _CollisionGroup__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./CollisionGroup */ \"./Collision/Group/CollisionGroup.ts\");\n\n/**\n * Static class for managing collision groups in excalibur, there is a maximum of 32 collision groups possible in excalibur\n */\nclass CollisionGroupManager {\n /**\n * Create a new named collision group up to a max of 32.\n * @param name Name for the collision group\n * @param mask Optionally provide your own 32-bit mask, if none is provide the manager will generate one\n */\n static create(name, mask) {\n if (this._CURRENT_GROUP > this._MAX_GROUPS) {\n throw new Error(`Cannot have more than ${this._MAX_GROUPS} collision groups`);\n }\n if (this._GROUPS.get(name)) {\n const existingGroup = this._GROUPS.get(name);\n if (existingGroup.mask === mask) {\n return existingGroup;\n }\n throw new Error(`Collision group ${name} already exists with a different mask!`);\n }\n const group = new _CollisionGroup__WEBPACK_IMPORTED_MODULE_0__.CollisionGroup(name, this._CURRENT_BIT, mask !== undefined ? mask : ~this._CURRENT_BIT);\n this._CURRENT_BIT = (this._CURRENT_BIT << 1) | 0;\n this._CURRENT_GROUP++;\n this._GROUPS.set(name, group);\n return group;\n }\n /**\n * Get all collision groups currently tracked by excalibur\n */\n static get groups() {\n return Array.from(this._GROUPS.values());\n }\n /**\n * Get a collision group by it's name\n * @param name\n */\n static groupByName(name) {\n return this._GROUPS.get(name);\n }\n /**\n * Resets the managers internal group management state\n */\n static reset() {\n this._GROUPS = new Map();\n this._CURRENT_BIT = this._STARTING_BIT;\n this._CURRENT_GROUP = 1;\n }\n}\n// using bitmasking the maximum number of groups is 32, because that is the highest 32bit integer that JS can present.\nCollisionGroupManager._STARTING_BIT = 0b1 | 0;\nCollisionGroupManager._MAX_GROUPS = 32;\nCollisionGroupManager._CURRENT_GROUP = 1;\nCollisionGroupManager._CURRENT_BIT = CollisionGroupManager._STARTING_BIT;\nCollisionGroupManager._GROUPS = new Map();\n\n\n/***/ }),\n\n/***/ \"./Collision/Index.ts\":\n/*!****************************!*\\\n !*** ./Collision/Index.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ArcadeSolver: () => (/* reexport safe */ _Solver_ArcadeSolver__WEBPACK_IMPORTED_MODULE_24__.ArcadeSolver),\n/* harmony export */ BodyComponent: () => (/* reexport safe */ _BodyComponent__WEBPACK_IMPORTED_MODULE_0__.BodyComponent),\n/* harmony export */ BoundingBox: () => (/* reexport safe */ _BoundingBox__WEBPACK_IMPORTED_MODULE_5__.BoundingBox),\n/* harmony export */ CircleCollider: () => (/* reexport safe */ _Colliders_CircleCollider__WEBPACK_IMPORTED_MODULE_8__.CircleCollider),\n/* harmony export */ ClosestLineJumpTable: () => (/* reexport safe */ _Colliders_ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_12__.ClosestLineJumpTable),\n/* harmony export */ Collider: () => (/* reexport safe */ _Colliders_Collider__WEBPACK_IMPORTED_MODULE_4__.Collider),\n/* harmony export */ ColliderComponent: () => (/* reexport safe */ _ColliderComponent__WEBPACK_IMPORTED_MODULE_1__.ColliderComponent),\n/* harmony export */ CollisionContact: () => (/* reexport safe */ _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_17__.CollisionContact),\n/* harmony export */ CollisionGroup: () => (/* reexport safe */ _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_14__.CollisionGroup),\n/* harmony export */ CollisionGroupManager: () => (/* reexport safe */ _Group_CollisionGroupManager__WEBPACK_IMPORTED_MODULE_15__.CollisionGroupManager),\n/* harmony export */ CollisionJumpTable: () => (/* reexport safe */ _Colliders_CollisionJumpTable__WEBPACK_IMPORTED_MODULE_11__.CollisionJumpTable),\n/* harmony export */ CollisionSystem: () => (/* reexport safe */ _CollisionSystem__WEBPACK_IMPORTED_MODULE_28__.CollisionSystem),\n/* harmony export */ CollisionType: () => (/* reexport safe */ _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType),\n/* harmony export */ CompositeCollider: () => (/* reexport safe */ _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_7__.CompositeCollider),\n/* harmony export */ ContactConstraintPoint: () => (/* reexport safe */ _Solver_ContactConstraintPoint__WEBPACK_IMPORTED_MODULE_26__.ContactConstraintPoint),\n/* harmony export */ ContactSolveBias: () => (/* reexport safe */ _Solver_ContactBias__WEBPACK_IMPORTED_MODULE_25__.ContactSolveBias),\n/* harmony export */ DegreeOfFreedom: () => (/* reexport safe */ _BodyComponent__WEBPACK_IMPORTED_MODULE_0__.DegreeOfFreedom),\n/* harmony export */ DynamicTree: () => (/* reexport safe */ _Detection_DynamicTree__WEBPACK_IMPORTED_MODULE_18__.DynamicTree),\n/* harmony export */ DynamicTreeCollisionProcessor: () => (/* reexport safe */ _Detection_DynamicTreeCollisionProcessor__WEBPACK_IMPORTED_MODULE_19__.DynamicTreeCollisionProcessor),\n/* harmony export */ EdgeCollider: () => (/* reexport safe */ _Colliders_EdgeCollider__WEBPACK_IMPORTED_MODULE_9__.EdgeCollider),\n/* harmony export */ HashColliderProxy: () => (/* reexport safe */ _Detection_SparseHashGridCollisionProcessor__WEBPACK_IMPORTED_MODULE_20__.HashColliderProxy),\n/* harmony export */ HashGridCell: () => (/* reexport safe */ _Detection_SparseHashGrid__WEBPACK_IMPORTED_MODULE_21__.HashGridCell),\n/* harmony export */ HashGridProxy: () => (/* reexport safe */ _Detection_SparseHashGrid__WEBPACK_IMPORTED_MODULE_21__.HashGridProxy),\n/* harmony export */ HorizontalFirst: () => (/* reexport safe */ _Solver_ContactBias__WEBPACK_IMPORTED_MODULE_25__.HorizontalFirst),\n/* harmony export */ MotionSystem: () => (/* reexport safe */ _MotionSystem__WEBPACK_IMPORTED_MODULE_29__.MotionSystem),\n/* harmony export */ None: () => (/* reexport safe */ _Solver_ContactBias__WEBPACK_IMPORTED_MODULE_25__.None),\n/* harmony export */ Pair: () => (/* reexport safe */ _Detection_Pair__WEBPACK_IMPORTED_MODULE_16__.Pair),\n/* harmony export */ PhysicsWorld: () => (/* reexport safe */ _PhysicsWorld__WEBPACK_IMPORTED_MODULE_30__.PhysicsWorld),\n/* harmony export */ PolygonCollider: () => (/* reexport safe */ _Colliders_PolygonCollider__WEBPACK_IMPORTED_MODULE_10__.PolygonCollider),\n/* harmony export */ QuadTree: () => (/* reexport safe */ _Detection_QuadTree__WEBPACK_IMPORTED_MODULE_23__.QuadTree),\n/* harmony export */ RealisticSolver: () => (/* reexport safe */ _Solver_RealisticSolver__WEBPACK_IMPORTED_MODULE_27__.RealisticSolver),\n/* harmony export */ SeparatingAxis: () => (/* reexport safe */ _Colliders_SeparatingAxis__WEBPACK_IMPORTED_MODULE_13__.SeparatingAxis),\n/* harmony export */ SeparationInfo: () => (/* reexport safe */ _Colliders_SeparatingAxis__WEBPACK_IMPORTED_MODULE_13__.SeparationInfo),\n/* harmony export */ Shape: () => (/* reexport safe */ _Colliders_Shape__WEBPACK_IMPORTED_MODULE_6__.Shape),\n/* harmony export */ Side: () => (/* reexport safe */ _Side__WEBPACK_IMPORTED_MODULE_32__.Side),\n/* harmony export */ SolverStrategy: () => (/* reexport safe */ _SolverStrategy__WEBPACK_IMPORTED_MODULE_3__.SolverStrategy),\n/* harmony export */ SparseHashGrid: () => (/* reexport safe */ _Detection_SparseHashGrid__WEBPACK_IMPORTED_MODULE_21__.SparseHashGrid),\n/* harmony export */ SparseHashGridCollisionProcessor: () => (/* reexport safe */ _Detection_SparseHashGridCollisionProcessor__WEBPACK_IMPORTED_MODULE_20__.SparseHashGridCollisionProcessor),\n/* harmony export */ SpatialPartitionStrategy: () => (/* reexport safe */ _Detection_SpatialPartitionStrategy__WEBPACK_IMPORTED_MODULE_22__.SpatialPartitionStrategy),\n/* harmony export */ TreeNode: () => (/* reexport safe */ _Detection_DynamicTree__WEBPACK_IMPORTED_MODULE_18__.TreeNode),\n/* harmony export */ VerticalFirst: () => (/* reexport safe */ _Solver_ContactBias__WEBPACK_IMPORTED_MODULE_25__.VerticalFirst),\n/* harmony export */ getDefaultPhysicsConfig: () => (/* reexport safe */ _PhysicsConfig__WEBPACK_IMPORTED_MODULE_31__.getDefaultPhysicsConfig)\n/* harmony export */ });\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _ColliderComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ColliderComponent */ \"./Collision/ColliderComponent.ts\");\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _SolverStrategy__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./SolverStrategy */ \"./Collision/SolverStrategy.ts\");\n/* harmony import */ var _Colliders_Collider__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Colliders/Collider */ \"./Collision/Colliders/Collider.ts\");\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Colliders_Shape__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Colliders/Shape */ \"./Collision/Colliders/Shape.ts\");\n/* harmony import */ var _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Colliders/CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var _Colliders_CircleCollider__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Colliders/CircleCollider */ \"./Collision/Colliders/CircleCollider.ts\");\n/* harmony import */ var _Colliders_EdgeCollider__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Colliders/EdgeCollider */ \"./Collision/Colliders/EdgeCollider.ts\");\n/* harmony import */ var _Colliders_PolygonCollider__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Colliders/PolygonCollider */ \"./Collision/Colliders/PolygonCollider.ts\");\n/* harmony import */ var _Colliders_CollisionJumpTable__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Colliders/CollisionJumpTable */ \"./Collision/Colliders/CollisionJumpTable.ts\");\n/* harmony import */ var _Colliders_ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Colliders/ClosestLineJumpTable */ \"./Collision/Colliders/ClosestLineJumpTable.ts\");\n/* harmony import */ var _Colliders_SeparatingAxis__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Colliders/SeparatingAxis */ \"./Collision/Colliders/SeparatingAxis.ts\");\n/* harmony import */ var _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Group/CollisionGroup */ \"./Collision/Group/CollisionGroup.ts\");\n/* harmony import */ var _Group_CollisionGroupManager__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Group/CollisionGroupManager */ \"./Collision/Group/CollisionGroupManager.ts\");\n/* harmony import */ var _Detection_Pair__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Detection/Pair */ \"./Collision/Detection/Pair.ts\");\n/* harmony import */ var _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./Detection/CollisionContact */ \"./Collision/Detection/CollisionContact.ts\");\n/* harmony import */ var _Detection_DynamicTree__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Detection/DynamicTree */ \"./Collision/Detection/DynamicTree.ts\");\n/* harmony import */ var _Detection_DynamicTreeCollisionProcessor__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./Detection/DynamicTreeCollisionProcessor */ \"./Collision/Detection/DynamicTreeCollisionProcessor.ts\");\n/* harmony import */ var _Detection_SparseHashGridCollisionProcessor__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./Detection/SparseHashGridCollisionProcessor */ \"./Collision/Detection/SparseHashGridCollisionProcessor.ts\");\n/* harmony import */ var _Detection_SparseHashGrid__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./Detection/SparseHashGrid */ \"./Collision/Detection/SparseHashGrid.ts\");\n/* harmony import */ var _Detection_SpatialPartitionStrategy__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./Detection/SpatialPartitionStrategy */ \"./Collision/Detection/SpatialPartitionStrategy.ts\");\n/* harmony import */ var _Detection_QuadTree__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./Detection/QuadTree */ \"./Collision/Detection/QuadTree.ts\");\n/* harmony import */ var _Solver_ArcadeSolver__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./Solver/ArcadeSolver */ \"./Collision/Solver/ArcadeSolver.ts\");\n/* harmony import */ var _Solver_ContactBias__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./Solver/ContactBias */ \"./Collision/Solver/ContactBias.ts\");\n/* harmony import */ var _Solver_ContactConstraintPoint__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./Solver/ContactConstraintPoint */ \"./Collision/Solver/ContactConstraintPoint.ts\");\n/* harmony import */ var _Solver_RealisticSolver__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./Solver/RealisticSolver */ \"./Collision/Solver/RealisticSolver.ts\");\n/* harmony import */ var _CollisionSystem__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./CollisionSystem */ \"./Collision/CollisionSystem.ts\");\n/* harmony import */ var _MotionSystem__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./MotionSystem */ \"./Collision/MotionSystem.ts\");\n/* harmony import */ var _PhysicsWorld__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./PhysicsWorld */ \"./Collision/PhysicsWorld.ts\");\n/* harmony import */ var _PhysicsConfig__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./PhysicsConfig */ \"./Collision/PhysicsConfig.ts\");\n/* harmony import */ var _Side__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./Side */ \"./Collision/Side.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Collision/Integrator.ts\":\n/*!*********************************!*\\\n !*** ./Collision/Integrator.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EulerIntegrator: () => (/* binding */ EulerIntegrator)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n\nclass EulerIntegrator {\n static integrate(transform, motion, totalAcc, elapsed) {\n const seconds = elapsed / 1000;\n // This code looks a little wild, but it's to avoid creating any new Vector instances\n // integration is done in a tight loop so this is key to avoid GC'ing\n motion.vel.addEqual(totalAcc.scale(seconds, EulerIntegrator._ACC));\n transform.pos\n .add(motion.vel.scale(seconds, EulerIntegrator._VEL), EulerIntegrator._POS)\n .addEqual(totalAcc.scale(0.5 * seconds * seconds, EulerIntegrator._VEL_ACC));\n motion.angularVelocity += motion.torque * (1.0 / motion.inertia) * seconds;\n const rotation = transform.rotation + motion.angularVelocity * seconds;\n transform.scale.add(motion.scaleFactor.scale(seconds, this._SCALE_FACTOR), EulerIntegrator._SCALE);\n const tx = transform.get();\n tx.setTransform(EulerIntegrator._POS, rotation, EulerIntegrator._SCALE);\n }\n}\n// Scratch vectors to avoid allocation\nEulerIntegrator._POS = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\nEulerIntegrator._SCALE = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(1, 1);\nEulerIntegrator._ACC = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\nEulerIntegrator._VEL = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\nEulerIntegrator._VEL_ACC = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\nEulerIntegrator._SCALE_FACTOR = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\n\n\n/***/ }),\n\n/***/ \"./Collision/MotionSystem.ts\":\n/*!***********************************!*\\\n !*** ./Collision/MotionSystem.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MotionSystem: () => (/* binding */ MotionSystem)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Priority.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Integrator__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Integrator */ \"./Collision/Integrator.ts\");\n\n\n\n\n\n\n\nclass MotionSystem extends _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.System {\n constructor(world, physics) {\n super();\n this.world = world;\n this.physics = physics;\n this.systemType = _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.SystemType.Update;\n this._physicsConfigDirty = false;\n physics.$configUpdate.subscribe(() => (this._physicsConfigDirty = true));\n this.query = this.world.query([_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent, _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent]);\n }\n update(elapsed) {\n let transform;\n let motion;\n const entities = this.query.entities;\n const substep = this.physics.config.substep;\n for (let i = 0; i < entities.length; i++) {\n transform = entities[i].get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n motion = entities[i].get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n const optionalBody = entities[i].get(_BodyComponent__WEBPACK_IMPORTED_MODULE_3__.BodyComponent);\n if (this._physicsConfigDirty && optionalBody) {\n optionalBody.updatePhysicsConfig(this.physics.config.bodies);\n }\n if (optionalBody === null || optionalBody === void 0 ? void 0 : optionalBody.isSleeping) {\n continue;\n }\n const totalAcc = motion.acc.clone();\n if ((optionalBody === null || optionalBody === void 0 ? void 0 : optionalBody.collisionType) === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Active && (optionalBody === null || optionalBody === void 0 ? void 0 : optionalBody.useGravity)) {\n totalAcc.addEqual(this.physics.config.gravity);\n }\n // capture old transform of this entity and all of its children so that\n // any transform properties that derived from their parents are properly captured\n if (!entities[i].parent) {\n this.captureOldTransformWithChildren(entities[i]);\n }\n // Update transform and motion based on Euler linear algebra\n _Integrator__WEBPACK_IMPORTED_MODULE_5__.EulerIntegrator.integrate(transform, motion, totalAcc, elapsed / substep);\n }\n this._physicsConfigDirty = false;\n }\n captureOldTransformWithChildren(entity) {\n var _a;\n (_a = entity.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_3__.BodyComponent)) === null || _a === void 0 ? void 0 : _a.captureOldTransform();\n for (let i = 0; i < entity.children.length; i++) {\n this.captureOldTransformWithChildren(entity.children[i]);\n }\n }\n}\nMotionSystem.priority = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_6__.SystemPriority.Higher;\n\n\n/***/ }),\n\n/***/ \"./Collision/PhysicsConfig.ts\":\n/*!************************************!*\\\n !*** ./Collision/PhysicsConfig.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ getDefaultPhysicsConfig: () => (/* binding */ getDefaultPhysicsConfig)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _SolverStrategy__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./SolverStrategy */ \"./Collision/SolverStrategy.ts\");\n/* harmony import */ var _Solver_ContactBias__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Solver/ContactBias */ \"./Collision/Solver/ContactBias.ts\");\n/* harmony import */ var _Detection_SpatialPartitionStrategy__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Detection/SpatialPartitionStrategy */ \"./Collision/Detection/SpatialPartitionStrategy.ts\");\n\n\n\n\nconst getDefaultPhysicsConfig = () => ({\n enabled: true,\n gravity: (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0).clone(),\n solver: _SolverStrategy__WEBPACK_IMPORTED_MODULE_1__.SolverStrategy.Arcade,\n substep: 1,\n colliders: {\n compositeStrategy: 'together'\n },\n continuous: {\n checkForFastBodies: true,\n disableMinimumSpeedForFastBody: false,\n surfaceEpsilon: 0.1\n },\n bodies: {\n canSleepByDefault: false,\n sleepEpsilon: 0.07,\n wakeThreshold: 0.07 * 3,\n sleepBias: 0.9,\n defaultMass: 10\n },\n spatialPartition: _Detection_SpatialPartitionStrategy__WEBPACK_IMPORTED_MODULE_2__.SpatialPartitionStrategy.SparseHashGrid,\n sparseHashGrid: {\n size: 100\n },\n dynamicTree: {\n boundsPadding: 5,\n velocityMultiplier: 2\n },\n arcade: {\n contactSolveBias: _Solver_ContactBias__WEBPACK_IMPORTED_MODULE_3__.ContactSolveBias.None\n },\n realistic: {\n positionIterations: 3,\n velocityIterations: 8,\n slop: 1,\n steeringFactor: 0.2,\n warmStart: true\n }\n});\n\n\n/***/ }),\n\n/***/ \"./Collision/PhysicsWorld.ts\":\n/*!***********************************!*\\\n !*** ./Collision/PhysicsWorld.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PhysicsWorld: () => (/* binding */ PhysicsWorld)\n/* harmony export */ });\n/* harmony import */ var _Util_Observable__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Util/Observable */ \"./Util/Observable.ts\");\n/* harmony import */ var _Index__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Index */ \"./Collision/Detection/SparseHashGridCollisionProcessor.ts\");\n/* harmony import */ var _Index__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Index */ \"./Collision/Detection/DynamicTreeCollisionProcessor.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Util_Watch__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Util/Watch */ \"./Util/Watch.ts\");\n/* harmony import */ var _Detection_SpatialPartitionStrategy__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Detection/SpatialPartitionStrategy */ \"./Collision/Detection/SpatialPartitionStrategy.ts\");\n\n\n\n\n\nclass PhysicsWorld {\n get config() {\n return (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_0__.watchDeep)(this._config, (change) => {\n this.$configUpdate.notifyAll(change);\n });\n }\n set config(newConfig) {\n this._config = newConfig;\n this.$configUpdate.notifyAll(newConfig);\n }\n /**\n * Spatial data structure for locating potential collision pairs and ray casts\n */\n get collisionProcessor() {\n if (this._configDirty) {\n this._configDirty = false;\n // preserve tracked colliders if config updates\n const colliders = this._collisionProcessor.getColliders();\n if (this._config.spatialPartition === _Detection_SpatialPartitionStrategy__WEBPACK_IMPORTED_MODULE_1__.SpatialPartitionStrategy.SparseHashGrid) {\n this._collisionProcessor = new _Index__WEBPACK_IMPORTED_MODULE_2__.SparseHashGridCollisionProcessor(this._config.sparseHashGrid);\n }\n else {\n this._collisionProcessor = new _Index__WEBPACK_IMPORTED_MODULE_3__.DynamicTreeCollisionProcessor(this._config);\n }\n for (const collider of colliders) {\n this._collisionProcessor.track(collider);\n }\n }\n return this._collisionProcessor;\n }\n constructor(config) {\n this.$configUpdate = new _Util_Observable__WEBPACK_IMPORTED_MODULE_4__.Observable();\n this._configDirty = false;\n this.config = config;\n this.$configUpdate.subscribe((config) => {\n this._configDirty = true;\n _BodyComponent__WEBPACK_IMPORTED_MODULE_5__.BodyComponent.updateDefaultPhysicsConfig(config.bodies);\n });\n if (this._config.spatialPartition === _Detection_SpatialPartitionStrategy__WEBPACK_IMPORTED_MODULE_1__.SpatialPartitionStrategy.SparseHashGrid) {\n this._collisionProcessor = new _Index__WEBPACK_IMPORTED_MODULE_2__.SparseHashGridCollisionProcessor(this._config.sparseHashGrid);\n }\n else {\n this._collisionProcessor = new _Index__WEBPACK_IMPORTED_MODULE_3__.DynamicTreeCollisionProcessor(this._config);\n }\n }\n /**\n * Raycast into the scene's physics world\n * @param ray\n * @param options\n */\n rayCast(ray, options) {\n return this.collisionProcessor.rayCast(ray, options);\n }\n query(pointOrBounds) {\n // FIXME workaround TS: https://github.com/microsoft/TypeScript/issues/14107\n return this._collisionProcessor.query(pointOrBounds);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Side.ts\":\n/*!***************************!*\\\n !*** ./Collision/Side.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Side: () => (/* binding */ Side)\n/* harmony export */ });\n/**\n * An enum that describes the sides of an axis aligned box for collision\n */\nvar Side;\n(function (Side) {\n Side[\"None\"] = \"None\";\n Side[\"Top\"] = \"Top\";\n Side[\"Bottom\"] = \"Bottom\";\n Side[\"Left\"] = \"Left\";\n Side[\"Right\"] = \"Right\";\n})(Side || (Side = {}));\n(function (Side) {\n /**\n * Returns the opposite side from the current\n */\n function getOpposite(side) {\n if (side === Side.Top) {\n return Side.Bottom;\n }\n if (side === Side.Bottom) {\n return Side.Top;\n }\n if (side === Side.Left) {\n return Side.Right;\n }\n if (side === Side.Right) {\n return Side.Left;\n }\n return Side.None;\n }\n Side.getOpposite = getOpposite;\n /**\n * Given a vector, return the Side most in that direction\n */\n function fromDirection(direction) {\n if (Math.abs(direction.x) >= Math.abs(direction.y)) {\n if (direction.x <= 0) {\n return Side.Left;\n }\n return Side.Right;\n }\n if (direction.y <= 0) {\n return Side.Top;\n }\n return Side.Bottom;\n }\n Side.fromDirection = fromDirection;\n})(Side || (Side = {}));\n\n\n/***/ }),\n\n/***/ \"./Collision/SolverStrategy.ts\":\n/*!*************************************!*\\\n !*** ./Collision/SolverStrategy.ts ***!\n \\*************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SolverStrategy: () => (/* binding */ SolverStrategy)\n/* harmony export */ });\n/**\n * Possible collision resolution strategies\n *\n * The default is {@apilink SolverStrategy.Arcade} which performs simple axis aligned arcade style physics. This is useful for things\n * like platformers or top down games.\n *\n * More advanced rigid body physics are enabled by setting {@apilink SolverStrategy.Realistic} which allows for complicated\n * simulated physical interactions.\n */\nvar SolverStrategy;\n(function (SolverStrategy) {\n SolverStrategy[\"Arcade\"] = \"arcade\";\n SolverStrategy[\"Realistic\"] = \"realistic\";\n})(SolverStrategy || (SolverStrategy = {}));\n\n\n/***/ }),\n\n/***/ \"./Collision/Solver/ArcadeSolver.ts\":\n/*!******************************************!*\\\n !*** ./Collision/Solver/ArcadeSolver.ts ***!\n \\******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ArcadeSolver: () => (/* binding */ ArcadeSolver)\n/* harmony export */ });\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Events */ \"./Events.ts\");\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Side__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Side */ \"./Collision/Side.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _ContactBias__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ContactBias */ \"./Collision/Solver/ContactBias.ts\");\n\n\n\n\n\n/**\n * ArcadeSolver is the default in Excalibur. It solves collisions so that there is no overlap between contacts,\n * and negates velocity along the collision normal.\n *\n * This is usually the type of collisions used for 2D games that don't need a more realistic collision simulation.\n *\n */\nclass ArcadeSolver {\n constructor(config) {\n this.config = config;\n this.directionMap = new Map();\n this.distanceMap = new Map();\n }\n solve(contacts) {\n // Events and init\n this.preSolve(contacts);\n // Remove any canceled contacts\n contacts = contacts.filter((c) => !c.isCanceled());\n // Locate collision bias order\n let bias;\n switch (this.config.contactSolveBias) {\n case _ContactBias__WEBPACK_IMPORTED_MODULE_0__.ContactSolveBias.HorizontalFirst: {\n bias = _ContactBias__WEBPACK_IMPORTED_MODULE_0__.HorizontalFirst;\n break;\n }\n case _ContactBias__WEBPACK_IMPORTED_MODULE_0__.ContactSolveBias.VerticalFirst: {\n bias = _ContactBias__WEBPACK_IMPORTED_MODULE_0__.VerticalFirst;\n break;\n }\n default: {\n bias = _ContactBias__WEBPACK_IMPORTED_MODULE_0__.None;\n }\n }\n // Sort by bias (None, VerticalFirst, HorizontalFirst) to avoid artifacts with seams\n // Sort contacts by distance to avoid artifacts with seams\n // It's important to solve in a specific order\n contacts.sort((a, b) => {\n const aDir = this.directionMap.get(a.id);\n const bDir = this.directionMap.get(b.id);\n const aDist = this.distanceMap.get(a.id);\n const bDist = this.distanceMap.get(b.id);\n return bias[aDir] - bias[bDir] || aDist - bDist;\n });\n for (const contact of contacts) {\n // Solve position first in arcade\n this.solvePosition(contact);\n // Solve velocity second in arcade\n this.solveVelocity(contact);\n }\n // Events and any contact house-keeping the solver needs\n this.postSolve(contacts);\n return contacts;\n }\n preSolve(contacts) {\n const epsilon = 0.0001;\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n if (Math.abs(contact.mtv.x) < epsilon && Math.abs(contact.mtv.y) < epsilon) {\n // Cancel near 0 mtv collisions\n contact.cancel();\n continue;\n }\n const side = _Side__WEBPACK_IMPORTED_MODULE_1__.Side.fromDirection(contact.mtv);\n const mtv = contact.mtv.negate();\n const distance = Math.abs(contact.info.separation);\n this.distanceMap.set(contact.id, distance);\n this.directionMap.set(contact.id, side === _Side__WEBPACK_IMPORTED_MODULE_1__.Side.Left || side === _Side__WEBPACK_IMPORTED_MODULE_1__.Side.Right ? 'horizontal' : 'vertical');\n // Publish collision events on both participants\n contact.colliderA.events.emit('precollision', new _Events__WEBPACK_IMPORTED_MODULE_2__.PreCollisionEvent(contact.colliderA, contact.colliderB, side, mtv, contact));\n contact.colliderB.events.emit('precollision', new _Events__WEBPACK_IMPORTED_MODULE_2__.PreCollisionEvent(contact.colliderB, contact.colliderA, _Side__WEBPACK_IMPORTED_MODULE_1__.Side.getOpposite(side), mtv.negate(), contact));\n }\n }\n postSolve(contacts) {\n var _a, _b;\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n if (contact.isCanceled()) {\n continue;\n }\n const colliderA = contact.colliderA;\n const colliderB = contact.colliderB;\n const bodyA = (_a = colliderA.owner) === null || _a === void 0 ? void 0 : _a.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_3__.BodyComponent);\n const bodyB = (_b = colliderB.owner) === null || _b === void 0 ? void 0 : _b.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_3__.BodyComponent);\n if (bodyA && bodyB) {\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Passive || bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Passive) {\n continue;\n }\n }\n const side = _Side__WEBPACK_IMPORTED_MODULE_1__.Side.fromDirection(contact.mtv);\n const mtv = contact.mtv.negate();\n // Publish collision events on both participants\n contact.colliderA.events.emit('postcollision', new _Events__WEBPACK_IMPORTED_MODULE_2__.PostCollisionEvent(contact.colliderA, contact.colliderB, side, mtv, contact));\n contact.colliderB.events.emit('postcollision', new _Events__WEBPACK_IMPORTED_MODULE_2__.PostCollisionEvent(contact.colliderB, contact.colliderA, _Side__WEBPACK_IMPORTED_MODULE_1__.Side.getOpposite(side), mtv.negate(), contact));\n }\n }\n solvePosition(contact) {\n var _a, _b;\n const epsilon = 0.0001;\n // if bounds no longer intersect skip to the next\n // this removes jitter from overlapping/stacked solid tiles or a wall of solid tiles\n if (!contact.colliderA.bounds.overlaps(contact.colliderB.bounds, epsilon)) {\n // Cancel the contact to prevent and solving\n contact.cancel();\n return;\n }\n if (Math.abs(contact.mtv.x) < epsilon && Math.abs(contact.mtv.y) < epsilon) {\n // Cancel near 0 mtv collisions\n contact.cancel();\n return;\n }\n let mtv = contact.mtv;\n const colliderA = contact.colliderA;\n const colliderB = contact.colliderB;\n const bodyA = (_a = colliderA.owner) === null || _a === void 0 ? void 0 : _a.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_3__.BodyComponent);\n const bodyB = (_b = colliderB.owner) === null || _b === void 0 ? void 0 : _b.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_3__.BodyComponent);\n if (bodyA && bodyB) {\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Passive || bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Passive) {\n return;\n }\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Active && bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Active) {\n // split overlaps if both are Active\n mtv = mtv.scale(0.5);\n }\n // Resolve overlaps\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Active) {\n bodyA.globalPos.x -= mtv.x;\n bodyA.globalPos.y -= mtv.y;\n colliderA.update(bodyA.transform.get());\n }\n if (bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Active) {\n bodyB.globalPos.x += mtv.x;\n bodyB.globalPos.y += mtv.y;\n colliderB.update(bodyB.transform.get());\n }\n }\n }\n solveVelocity(contact) {\n var _a, _b;\n if (contact.isCanceled()) {\n return;\n }\n const colliderA = contact.colliderA;\n const colliderB = contact.colliderB;\n const bodyA = (_a = colliderA.owner) === null || _a === void 0 ? void 0 : _a.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_3__.BodyComponent);\n const bodyB = (_b = colliderB.owner) === null || _b === void 0 ? void 0 : _b.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_3__.BodyComponent);\n if (bodyA && bodyB) {\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Passive || bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Passive) {\n return;\n }\n const normal = contact.normal;\n const opposite = normal.negate();\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Active) {\n // only adjust velocity if the contact normal is opposite to the current velocity\n // this avoids catching edges on a platform when sliding off\n if (bodyA.vel.normalize().dot(opposite) < 0) {\n // Cancel out velocity opposite direction of collision normal\n const velAdj = normal.scale(normal.dot(bodyA.vel.negate()));\n bodyA.vel = bodyA.vel.add(velAdj);\n }\n }\n if (bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Active) {\n // only adjust velocity if the contact normal is opposite to the current velocity\n // this avoids catching edges on a platform\n if (bodyB.vel.normalize().dot(normal) < 0) {\n const velAdj = opposite.scale(opposite.dot(bodyB.vel.negate()));\n bodyB.vel = bodyB.vel.add(velAdj);\n }\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Solver/ContactBias.ts\":\n/*!*****************************************!*\\\n !*** ./Collision/Solver/ContactBias.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ContactSolveBias: () => (/* binding */ ContactSolveBias),\n/* harmony export */ HorizontalFirst: () => (/* binding */ HorizontalFirst),\n/* harmony export */ None: () => (/* binding */ None),\n/* harmony export */ VerticalFirst: () => (/* binding */ VerticalFirst)\n/* harmony export */ });\n/**\n * Tells the Arcade collision solver to prefer certain contacts over others\n */\nvar ContactSolveBias;\n(function (ContactSolveBias) {\n ContactSolveBias[\"None\"] = \"none\";\n ContactSolveBias[\"VerticalFirst\"] = \"vertical-first\";\n ContactSolveBias[\"HorizontalFirst\"] = \"horizontal-first\";\n})(ContactSolveBias || (ContactSolveBias = {}));\n/**\n * Vertical First contact solve bias Used by the {@apilink ArcadeSolver} to sort contacts\n */\nconst VerticalFirst = {\n vertical: 1,\n horizontal: 2\n};\n/**\n * Horizontal First contact solve bias Used by the {@apilink ArcadeSolver} to sort contacts\n */\nconst HorizontalFirst = {\n horizontal: 1,\n vertical: 2\n};\n/**\n * None value, {@apilink ArcadeSolver} sorts contacts using distance by default\n */\nconst None = {\n horizontal: 0,\n vertical: 0\n};\n\n\n/***/ }),\n\n/***/ \"./Collision/Solver/ContactConstraintPoint.ts\":\n/*!****************************************************!*\\\n !*** ./Collision/Solver/ContactConstraintPoint.ts ***!\n \\****************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ContactConstraintPoint: () => (/* binding */ ContactConstraintPoint)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n\n/**\n * Holds information about contact points, meant to be reused over multiple frames of contact\n */\nclass ContactConstraintPoint {\n constructor(point, local, contact) {\n this.point = point;\n this.local = local;\n this.contact = contact;\n /**\n * Impulse accumulated over time in normal direction\n */\n this.normalImpulse = 0;\n /**\n * Impulse accumulated over time in the tangent direction\n */\n this.tangentImpulse = 0;\n /**\n * Effective mass seen in the normal direction\n */\n this.normalMass = 0;\n /**\n * Effective mass seen in the tangent direction\n */\n this.tangentMass = 0;\n /**\n * Direction from center of mass of bodyA to contact point\n */\n this.aToContact = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\n /**\n * Direction from center of mass of bodyB to contact point\n */\n this.bToContact = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\n /**\n * Original contact velocity combined with bounciness\n */\n this.originalVelocityAndRestitution = 0;\n this.update();\n }\n /**\n * Updates the contact information\n */\n update() {\n const bodyA = this.contact.bodyA;\n const bodyB = this.contact.bodyB;\n if (bodyA && bodyB) {\n const normal = this.contact.normal;\n const tangent = this.contact.tangent;\n this.aToContact = this.point.sub(bodyA.globalPos);\n this.bToContact = this.point.sub(bodyB.globalPos);\n const aToContactNormal = this.aToContact.cross(normal);\n const bToContactNormal = this.bToContact.cross(normal);\n this.normalMass =\n bodyA.inverseMass +\n bodyB.inverseMass +\n bodyA.inverseInertia * aToContactNormal * aToContactNormal +\n bodyB.inverseInertia * bToContactNormal * bToContactNormal;\n const aToContactTangent = this.aToContact.cross(tangent);\n const bToContactTangent = this.bToContact.cross(tangent);\n this.tangentMass =\n bodyA.inverseMass +\n bodyB.inverseMass +\n bodyA.inverseInertia * aToContactTangent * aToContactTangent +\n bodyB.inverseInertia * bToContactTangent * bToContactTangent;\n }\n return this;\n }\n /**\n * Returns the relative velocity between bodyA and bodyB\n */\n getRelativeVelocity() {\n const bodyA = this.contact.bodyA;\n const bodyB = this.contact.bodyB;\n if (bodyA && bodyB) {\n // Relative velocity in linear terms\n // Angular to linear velocity formula -> omega = velocity/radius so omega x radius = velocity\n const velA = bodyA.vel.add(_Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.cross(bodyA.angularVelocity, this.aToContact));\n const velB = bodyB.vel.add(_Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.cross(bodyB.angularVelocity, this.bToContact));\n return velB.sub(velA);\n }\n return _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Solver/RealisticSolver.ts\":\n/*!*********************************************!*\\\n !*** ./Collision/Solver/RealisticSolver.ts ***!\n \\*********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RealisticSolver: () => (/* binding */ RealisticSolver)\n/* harmony export */ });\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Events */ \"./Events.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _ContactConstraintPoint__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ContactConstraintPoint */ \"./Collision/Solver/ContactConstraintPoint.ts\");\n/* harmony import */ var _Side__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Side */ \"./Collision/Side.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Colliders_CollisionJumpTable__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Colliders/CollisionJumpTable */ \"./Collision/Colliders/CollisionJumpTable.ts\");\n\n\n\n\n\n\n\nclass RealisticSolver {\n constructor(config) {\n this.config = config;\n this.lastFrameContacts = new Map();\n // map contact id to contact points\n this.idToContactConstraint = new Map();\n }\n getContactConstraints(id) {\n var _a;\n return (_a = this.idToContactConstraint.get(id)) !== null && _a !== void 0 ? _a : [];\n }\n solve(contacts) {\n // Events and init\n this.preSolve(contacts);\n // Remove any canceled contacts\n contacts = contacts.filter((c) => !c.isCanceled());\n // Solve velocity first\n this.solveVelocity(contacts);\n // Solve position last because non-overlap is the most important\n this.solvePosition(contacts);\n // Events and any contact house-keeping the solver needs\n this.postSolve(contacts);\n return contacts;\n }\n preSolve(contacts) {\n var _a, _b, _c;\n const epsilon = 0.0001;\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n if (Math.abs(contact.mtv.x) < epsilon && Math.abs(contact.mtv.y) < epsilon) {\n // Cancel near 0 mtv collisions\n contact.cancel();\n continue;\n }\n // Publish collision events on both participants\n const side = _Side__WEBPACK_IMPORTED_MODULE_0__.Side.fromDirection(contact.mtv);\n contact.colliderA.events.emit('precollision', new _Events__WEBPACK_IMPORTED_MODULE_1__.PreCollisionEvent(contact.colliderA, contact.colliderB, side, contact.mtv, contact));\n contact.colliderA.events.emit('beforecollisionresolve', new _Events__WEBPACK_IMPORTED_MODULE_1__.CollisionPreSolveEvent(contact.colliderA, contact.colliderB, side, contact.mtv, contact));\n contact.colliderB.events.emit('precollision', new _Events__WEBPACK_IMPORTED_MODULE_1__.PreCollisionEvent(contact.colliderB, contact.colliderA, _Side__WEBPACK_IMPORTED_MODULE_0__.Side.getOpposite(side), contact.mtv.negate(), contact));\n contact.colliderB.events.emit('beforecollisionresolve', new _Events__WEBPACK_IMPORTED_MODULE_1__.CollisionPreSolveEvent(contact.colliderB, contact.colliderA, _Side__WEBPACK_IMPORTED_MODULE_0__.Side.getOpposite(side), contact.mtv.negate(), contact));\n // Match awake state for sleeping\n contact.matchAwake();\n }\n // Keep track of contacts that done\n const finishedContactIds = Array.from(this.idToContactConstraint.keys());\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n // Remove all current contacts that are not done\n const index = finishedContactIds.indexOf(contact.id);\n if (index > -1) {\n finishedContactIds.splice(index, 1);\n }\n const contactPoints = (_a = this.idToContactConstraint.get(contact.id)) !== null && _a !== void 0 ? _a : [];\n let pointIndex = 0;\n const bodyA = contact.bodyA;\n const bodyB = contact.bodyB;\n if (bodyA && bodyB) {\n for (let j = 0; j < contact.points.length; j++) {\n const point = contact.points[j];\n const normal = contact.normal;\n const tangent = contact.tangent;\n const aToContact = point.sub(bodyA.globalPos);\n const bToContact = point.sub(bodyB.globalPos);\n const aToContactNormal = aToContact.cross(normal);\n const bToContactNormal = bToContact.cross(normal);\n const normalMass = bodyA.inverseMass +\n bodyB.inverseMass +\n bodyA.inverseInertia * aToContactNormal * aToContactNormal +\n bodyB.inverseInertia * bToContactNormal * bToContactNormal;\n const aToContactTangent = aToContact.cross(tangent);\n const bToContactTangent = bToContact.cross(tangent);\n const tangentMass = bodyA.inverseMass +\n bodyB.inverseMass +\n bodyA.inverseInertia * aToContactTangent * aToContactTangent +\n bodyB.inverseInertia * bToContactTangent * bToContactTangent;\n // Preserve normal/tangent impulse by re-using the contact point if it's close\n if (contactPoints[pointIndex] && ((_c = (_b = contactPoints[pointIndex]) === null || _b === void 0 ? void 0 : _b.point) === null || _c === void 0 ? void 0 : _c.squareDistance(point)) < 4) {\n contactPoints[pointIndex].point = point;\n contactPoints[pointIndex].local = contact.localPoints[pointIndex];\n }\n else {\n // new contact if it's not close or doesn't exist\n contactPoints[pointIndex] = new _ContactConstraintPoint__WEBPACK_IMPORTED_MODULE_2__.ContactConstraintPoint(point, contact.localPoints[pointIndex], contact);\n }\n // Update contact point calculations\n contactPoints[pointIndex].aToContact = aToContact;\n contactPoints[pointIndex].bToContact = bToContact;\n contactPoints[pointIndex].normalMass = 1.0 / normalMass;\n contactPoints[pointIndex].tangentMass = 1.0 / tangentMass;\n // Calculate relative velocity before solving to accurately do restitution\n const restitution = bodyA.bounciness > bodyB.bounciness ? bodyA.bounciness : bodyB.bounciness;\n const relativeVelocity = contact.normal.dot(contactPoints[pointIndex].getRelativeVelocity());\n contactPoints[pointIndex].originalVelocityAndRestitution = 0;\n if (relativeVelocity < -0.1) {\n // TODO what's a good threshold here?\n contactPoints[pointIndex].originalVelocityAndRestitution = -restitution * relativeVelocity;\n }\n pointIndex++;\n }\n }\n this.idToContactConstraint.set(contact.id, contactPoints);\n }\n // Clean up any contacts that did not occur last frame\n for (const id of finishedContactIds) {\n this.idToContactConstraint.delete(id);\n }\n // Warm contacts with accumulated impulse\n // Useful for tall stacks\n if (this.config.warmStart) {\n this.warmStart(contacts);\n }\n else {\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n const contactPoints = this.getContactConstraints(contact.id);\n for (const point of contactPoints) {\n point.normalImpulse = 0;\n point.tangentImpulse = 0;\n }\n }\n }\n }\n postSolve(contacts) {\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n const bodyA = contact.bodyA;\n const bodyB = contact.bodyB;\n if (bodyA && bodyB) {\n // Skip post solve for active+passive collisions\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_3__.CollisionType.Passive || bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_3__.CollisionType.Passive) {\n continue;\n }\n // Update motion values for sleeping\n bodyA.updateMotion();\n bodyB.updateMotion();\n }\n // Publish collision events on both participants\n const side = _Side__WEBPACK_IMPORTED_MODULE_0__.Side.fromDirection(contact.mtv);\n contact.colliderA.events.emit('postcollision', new _Events__WEBPACK_IMPORTED_MODULE_1__.PostCollisionEvent(contact.colliderA, contact.colliderB, side, contact.mtv, contact));\n contact.colliderA.events.emit('aftercollisionresolve', new _Events__WEBPACK_IMPORTED_MODULE_1__.CollisionPostSolveEvent(contact.colliderA, contact.colliderB, side, contact.mtv, contact));\n contact.colliderB.events.emit('postcollision', new _Events__WEBPACK_IMPORTED_MODULE_1__.PostCollisionEvent(contact.colliderB, contact.colliderA, _Side__WEBPACK_IMPORTED_MODULE_0__.Side.getOpposite(side), contact.mtv.negate(), contact));\n contact.colliderB.events.emit('aftercollisionresolve', new _Events__WEBPACK_IMPORTED_MODULE_1__.CollisionPostSolveEvent(contact.colliderB, contact.colliderA, _Side__WEBPACK_IMPORTED_MODULE_0__.Side.getOpposite(side), contact.mtv.negate(), contact));\n }\n // Store contacts\n this.lastFrameContacts.clear();\n for (let i = 0; i < contacts.length; i++) {\n const c = contacts[i];\n this.lastFrameContacts.set(c.id, c);\n }\n }\n /**\n * Warm up body's based on previous frame contact points\n * @param contacts\n */\n warmStart(contacts) {\n var _a;\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n const bodyA = contact.bodyA;\n const bodyB = contact.bodyB;\n if (bodyA && bodyB) {\n const contactPoints = (_a = this.idToContactConstraint.get(contact.id)) !== null && _a !== void 0 ? _a : [];\n for (const point of contactPoints) {\n if (this.config.warmStart) {\n const normalImpulse = contact.normal.scale(point.normalImpulse);\n const tangentImpulse = contact.tangent.scale(point.tangentImpulse);\n const impulse = normalImpulse.add(tangentImpulse);\n bodyA.applyImpulse(point.point, impulse.negate());\n bodyB.applyImpulse(point.point, impulse);\n }\n else {\n point.normalImpulse = 0;\n point.tangentImpulse = 0;\n }\n }\n }\n }\n }\n /**\n * Iteratively solve the position overlap constraint\n * @param contacts\n */\n solvePosition(contacts) {\n var _a;\n for (let i = 0; i < this.config.positionIterations; i++) {\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n const bodyA = contact.bodyA;\n const bodyB = contact.bodyB;\n if (bodyA && bodyB) {\n // Skip solving active+passive\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_3__.CollisionType.Passive || bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_3__.CollisionType.Passive) {\n continue;\n }\n const constraints = (_a = this.idToContactConstraint.get(contact.id)) !== null && _a !== void 0 ? _a : [];\n for (const point of constraints) {\n const normal = contact.normal;\n const separation = _Colliders_CollisionJumpTable__WEBPACK_IMPORTED_MODULE_4__.CollisionJumpTable.FindContactSeparation(contact, point.local);\n const steeringConstant = this.config.steeringFactor; //0.2;\n const maxCorrection = -5;\n const slop = this.config.slop; //1;\n // Clamp to avoid over-correction\n // Remember that we are shooting for 0 overlap in the end\n const steeringForce = (0,_Math_util__WEBPACK_IMPORTED_MODULE_5__.clamp)(steeringConstant * (separation + slop), maxCorrection, 0);\n const impulse = normal.scale(-steeringForce * point.normalMass);\n // This is a pseudo impulse, meaning we aren't doing a real impulse calculation\n // We adjust position and rotation instead of doing the velocity\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_3__.CollisionType.Active) {\n // TODO make applyPseudoImpulse function?\n const impulseForce = impulse.negate().scale(bodyA.inverseMass);\n if (bodyA.limitDegreeOfFreedom.includes(_BodyComponent__WEBPACK_IMPORTED_MODULE_6__.DegreeOfFreedom.X)) {\n impulseForce.x = 0;\n }\n if (bodyA.limitDegreeOfFreedom.includes(_BodyComponent__WEBPACK_IMPORTED_MODULE_6__.DegreeOfFreedom.Y)) {\n impulseForce.y = 0;\n }\n bodyA.globalPos = bodyA.globalPos.add(impulseForce);\n if (!bodyA.limitDegreeOfFreedom.includes(_BodyComponent__WEBPACK_IMPORTED_MODULE_6__.DegreeOfFreedom.Rotation)) {\n bodyA.rotation -= point.aToContact.cross(impulse) * bodyA.inverseInertia;\n }\n }\n if (bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_3__.CollisionType.Active) {\n const impulseForce = impulse.scale(bodyB.inverseMass);\n if (bodyB.limitDegreeOfFreedom.includes(_BodyComponent__WEBPACK_IMPORTED_MODULE_6__.DegreeOfFreedom.X)) {\n impulseForce.x = 0;\n }\n if (bodyB.limitDegreeOfFreedom.includes(_BodyComponent__WEBPACK_IMPORTED_MODULE_6__.DegreeOfFreedom.Y)) {\n impulseForce.y = 0;\n }\n bodyB.globalPos = bodyB.globalPos.add(impulseForce);\n if (!bodyB.limitDegreeOfFreedom.includes(_BodyComponent__WEBPACK_IMPORTED_MODULE_6__.DegreeOfFreedom.Rotation)) {\n bodyB.rotation += point.bToContact.cross(impulse) * bodyB.inverseInertia;\n }\n }\n }\n }\n }\n }\n }\n solveVelocity(contacts) {\n var _a;\n for (let i = 0; i < this.config.velocityIterations; i++) {\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n const bodyA = contact.bodyA;\n const bodyB = contact.bodyB;\n if (bodyA && bodyB) {\n // Skip solving active+passive\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_3__.CollisionType.Passive || bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_3__.CollisionType.Passive) {\n continue;\n }\n const friction = Math.min(bodyA.friction, bodyB.friction);\n const constraints = (_a = this.idToContactConstraint.get(contact.id)) !== null && _a !== void 0 ? _a : [];\n // Friction constraint\n for (const point of constraints) {\n const relativeVelocity = point.getRelativeVelocity();\n // Negate velocity in tangent direction to simulate friction\n const tangentVelocity = -relativeVelocity.dot(contact.tangent);\n let impulseDelta = tangentVelocity * point.tangentMass;\n // Clamping based in Erin Catto's GDC 2006 talk\n // Correct clamping https://github.com/erincatto/box2d-lite/blob/master/docs/GDC2006_Catto_Erin_PhysicsTutorial.pdf\n // Accumulated fiction impulse is always between -uMaxFriction < dT < uMaxFriction\n // But deltas can vary\n const maxFriction = friction * point.normalImpulse;\n const newImpulse = (0,_Math_util__WEBPACK_IMPORTED_MODULE_5__.clamp)(point.tangentImpulse + impulseDelta, -maxFriction, maxFriction);\n impulseDelta = newImpulse - point.tangentImpulse;\n point.tangentImpulse = newImpulse;\n const impulse = contact.tangent.scale(impulseDelta);\n bodyA.applyImpulse(point.point, impulse.negate());\n bodyB.applyImpulse(point.point, impulse);\n }\n // Bounce constraint\n for (const point of constraints) {\n // Need to recalc relative velocity because the previous step could have changed vel\n const relativeVelocity = point.getRelativeVelocity();\n // Compute impulse in normal direction\n const normalVelocity = relativeVelocity.dot(contact.normal);\n // Per Erin it is a mistake to apply the restitution inside the iteration\n // From Erin Catto's Box2D we keep original contact velocity and adjust by small impulses\n let impulseDelta = -point.normalMass * (normalVelocity - point.originalVelocityAndRestitution);\n // Clamping based in Erin Catto's GDC 2014 talk\n // Accumulated impulse stored in the contact is always positive (dV > 0)\n // But deltas can be negative\n const newImpulse = Math.max(point.normalImpulse + impulseDelta, 0);\n impulseDelta = newImpulse - point.normalImpulse;\n point.normalImpulse = newImpulse;\n const impulse = contact.normal.scale(impulseDelta);\n bodyA.applyImpulse(point.point, impulse.negate());\n bodyB.applyImpulse(point.point, impulse);\n }\n }\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Color.ts\":\n/*!******************!*\\\n !*** ./Color.ts ***!\n \\******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Color: () => (/* binding */ Color)\n/* harmony export */ });\n/**\n * Provides standard colors (e.g. {@apilink Color.Black})\n * but you can also create custom colors using RGB, HSL, or Hex. Also provides\n * useful color operations like {@apilink Color.lighten}, {@apilink Color.darken}, and more.\n */\nclass Color {\n /**\n * Creates a new instance of Color from an r, g, b, a\n * @param r The red component of color (0-255)\n * @param g The green component of color (0-255)\n * @param b The blue component of color (0-255)\n * @param a The alpha component of color (0-1.0)\n */\n constructor(r, g, b, a) {\n this.r = r;\n this.g = g;\n this.b = b;\n this.a = a != null ? a : 1;\n }\n /**\n * Creates a new instance of Color from an r, g, b, a\n * @param r The red component of color (0-255)\n * @param g The green component of color (0-255)\n * @param b The blue component of color (0-255)\n * @param a The alpha component of color (0-1.0)\n */\n static fromRGB(r, g, b, a) {\n return new Color(r, g, b, a);\n }\n /**\n * Creates a new instance of Color from a rgb string\n * @param string CSS color string of the form rgba(255, 255, 255, 1) or rgb(255, 255, 255)\n */\n static fromRGBString(string) {\n const rgbaRegEx = /^rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*(\\d+(?:\\.\\d+)?))?\\)/i;\n let match = null;\n if ((match = string.match(rgbaRegEx))) {\n const r = parseInt(match[1], 10);\n const g = parseInt(match[2], 10);\n const b = parseInt(match[3], 10);\n let a = 1;\n if (match[4]) {\n a = parseFloat(match[4]);\n }\n return new Color(r, g, b, a);\n }\n else {\n throw new Error('Invalid rgb/a string: ' + string);\n }\n }\n /**\n * Creates a new instance of Color from a hex string\n * @param hex CSS color string of the form #ffffff, the alpha component is optional\n */\n static fromHex(hex) {\n const hexRegEx = /^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})?$/i;\n let match = null;\n if ((match = hex.match(hexRegEx))) {\n const r = parseInt(match[1], 16);\n const g = parseInt(match[2], 16);\n const b = parseInt(match[3], 16);\n let a = 1;\n if (match[4]) {\n a = parseInt(match[4], 16) / 255;\n }\n return new Color(r, g, b, a);\n }\n else {\n throw new Error('Invalid hex string: ' + hex);\n }\n }\n /**\n * Creates a new instance of Color from hsla values\n * @param h Hue is represented [0-1]\n * @param s Saturation is represented [0-1]\n * @param l Luminance is represented [0-1]\n * @param a Alpha is represented [0-1]\n */\n static fromHSL(h, s, l, a = 1.0) {\n const temp = new HSLColor(h, s, l, a);\n return temp.toRGBA();\n }\n /**\n * Lightens the current color by a specified amount\n * @param factor The amount to lighten by [0-1]\n */\n lighten(factor = 0.1) {\n const temp = HSLColor.fromRGBA(this.r, this.g, this.b, this.a);\n temp.l += (1 - temp.l) * factor;\n return temp.toRGBA();\n }\n /**\n * Darkens the current color by a specified amount\n * @param factor The amount to darken by [0-1]\n */\n darken(factor = 0.1) {\n const temp = HSLColor.fromRGBA(this.r, this.g, this.b, this.a);\n temp.l -= temp.l * factor;\n return temp.toRGBA();\n }\n /**\n * Saturates the current color by a specified amount\n * @param factor The amount to saturate by [0-1]\n */\n saturate(factor = 0.1) {\n const temp = HSLColor.fromRGBA(this.r, this.g, this.b, this.a);\n temp.s += temp.s * factor;\n return temp.toRGBA();\n }\n /**\n * Desaturates the current color by a specified amount\n * @param factor The amount to desaturate by [0-1]\n */\n desaturate(factor = 0.1) {\n const temp = HSLColor.fromRGBA(this.r, this.g, this.b, this.a);\n temp.s -= temp.s * factor;\n return temp.toRGBA();\n }\n /**\n * Multiplies a color by another, results in a darker color\n * @param color The other color\n */\n multiply(color) {\n const newR = (((color.r / 255) * this.r) / 255) * 255;\n const newG = (((color.g / 255) * this.g) / 255) * 255;\n const newB = (((color.b / 255) * this.b) / 255) * 255;\n const newA = color.a * this.a;\n return new Color(newR, newG, newB, newA);\n }\n /**\n * Screens a color by another, results in a lighter color\n * @param color The other color\n */\n screen(color) {\n const color1 = color.invert();\n const color2 = color.invert();\n return color1.multiply(color2).invert();\n }\n /**\n * Inverts the current color\n */\n invert() {\n return new Color(255 - this.r, 255 - this.g, 255 - this.b, 1.0 - this.a);\n }\n /**\n * Averages the current color with another\n * @param color The other color\n */\n average(color) {\n const newR = (color.r + this.r) / 2;\n const newG = (color.g + this.g) / 2;\n const newB = (color.b + this.b) / 2;\n const newA = (color.a + this.a) / 2;\n return new Color(newR, newG, newB, newA);\n }\n equal(color) {\n return this.toString() === color.toString();\n }\n /**\n * Returns a CSS string representation of a color.\n * @param format Color representation, accepts: rgb, hsl, or hex\n */\n toString(format = 'rgb') {\n switch (format) {\n case 'rgb':\n return this.toRGBA();\n case 'hsl':\n return this.toHSLA();\n case 'hex':\n return this.toHex();\n default:\n throw new Error('Invalid Color format');\n }\n }\n /**\n * Returns Hex Value of a color component\n * @param c color component\n * @see https://stackoverflow.com/questions/5623838/rgb-to-hex-and-hex-to-rgb\n */\n _componentToHex(c) {\n // Handle negative and fractional numbers\n const hex = Math.max(Math.round(c), 0).toString(16);\n return hex.length === 1 ? '0' + hex : hex;\n }\n /**\n * Return Hex representation of a color.\n */\n toHex() {\n let hexRepresentation = '#' + this._componentToHex(this.r) + this._componentToHex(this.g) + this._componentToHex(this.b);\n if (this.a !== 1) {\n hexRepresentation += this._componentToHex(this.a * 255);\n }\n return hexRepresentation;\n }\n /**\n * Return RGBA representation of a color.\n */\n toRGBA() {\n const result = String(this.r.toFixed(0)) + ', ' + String(this.g.toFixed(0)) + ', ' + String(this.b.toFixed(0));\n if (this.a !== undefined || this.a !== null) {\n return 'rgba(' + result + ', ' + String(this.a) + ')';\n }\n return 'rgb(' + result + ')';\n }\n /**\n * Return HSLA representation of a color.\n */\n toHSLA() {\n return HSLColor.fromRGBA(this.r, this.g, this.b, this.a).toString();\n }\n /**\n * Returns a CSS string representation of a color.\n */\n fillStyle() {\n return this.toString();\n }\n /**\n * Returns a clone of the current color.\n */\n clone(dest) {\n const result = dest || new Color(this.r, this.g, this.b, this.a);\n result.r = this.r;\n result.g = this.g;\n result.b = this.b;\n result.a = this.a;\n return result;\n }\n /**\n * Black (#000000)\n */\n static get Black() {\n return Color.fromHex('#000000');\n }\n /**\n * White (#FFFFFF)\n */\n static get White() {\n return Color.fromHex('#FFFFFF');\n }\n /**\n * Gray (#808080)\n */\n static get Gray() {\n return Color.fromHex('#808080');\n }\n /**\n * Light gray (#D3D3D3)\n */\n static get LightGray() {\n return Color.fromHex('#D3D3D3');\n }\n /**\n * Dark gray (#A9A9A9)\n */\n static get DarkGray() {\n return Color.fromHex('#A9A9A9');\n }\n /**\n * Yellow (#FFFF00)\n */\n static get Yellow() {\n return Color.fromHex('#FFFF00');\n }\n /**\n * Orange (#FFA500)\n */\n static get Orange() {\n return Color.fromHex('#FFA500');\n }\n /**\n * Red (#FF0000)\n */\n static get Red() {\n return Color.fromHex('#FF0000');\n }\n /**\n * Vermilion (#FF5B31)\n */\n static get Vermilion() {\n return Color.fromHex('#FF5B31');\n }\n /**\n * Rose (#FF007F)\n */\n static get Rose() {\n return Color.fromHex('#FF007F');\n }\n /**\n * Pink (#FFC0CB)\n */\n static get Pink() {\n return Color.fromHex('#FFC0CB');\n }\n /**\n * Magenta (#FF00FF)\n */\n static get Magenta() {\n return Color.fromHex('#FF00FF');\n }\n /**\n * Violet (#7F00FF)\n */\n static get Violet() {\n return Color.fromHex('#7F00FF');\n }\n /**\n * Purple (#800080)\n */\n static get Purple() {\n return Color.fromHex('#800080');\n }\n /**\n * Blue (#0000FF)\n */\n static get Blue() {\n return Color.fromHex('#0000FF');\n }\n /**\n * Azure (#007FFF)\n */\n static get Azure() {\n return Color.fromHex('#007FFF');\n }\n /**\n * Cyan (#00FFFF)\n */\n static get Cyan() {\n return Color.fromHex('#00FFFF');\n }\n /**\n * Viridian (#59978F)\n */\n static get Viridian() {\n return Color.fromHex('#59978F');\n }\n /**\n * Teal (#008080)\n */\n static get Teal() {\n return Color.fromHex('#008080');\n }\n /**\n * Green (#00FF00)\n */\n static get Green() {\n return Color.fromHex('#00FF00');\n }\n /**\n * Chartreuse (#7FFF00)\n */\n static get Chartreuse() {\n return Color.fromHex('#7FFF00');\n }\n /**\n * Transparent (#FFFFFF00)\n */\n static get Transparent() {\n return Color.fromHex('#FFFFFF00');\n }\n /**\n * ExcaliburBlue (#176BAA)\n */\n static get ExcaliburBlue() {\n return Color.fromHex('#176BAA');\n }\n /**\n * Brown (#964B00)\n */\n static get Brown() {\n return Color.fromHex('#964B00');\n }\n}\n/**\n * Internal HSL Color representation\n *\n * http://en.wikipedia.org/wiki/HSL_and_HSV\n * http://axonflux.com/handy-rgb-to-hsl-and-rgb-to-hsv-color-model-c\n */\nclass HSLColor {\n constructor(h, s, l, a) {\n this.h = h;\n this.s = s;\n this.l = l;\n this.a = a;\n }\n static hue2rgb(p, q, t) {\n if (t < 0) {\n t += 1;\n }\n if (t > 1) {\n t -= 1;\n }\n if (t < 1 / 6) {\n return p + (q - p) * 6 * t;\n }\n if (t < 1 / 2) {\n return q;\n }\n if (t < 2 / 3) {\n return p + (q - p) * (2 / 3 - t) * 6;\n }\n return p;\n }\n static fromRGBA(r, g, b, a) {\n r /= 255;\n g /= 255;\n b /= 255;\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h, s;\n const l = (max + min) / 2;\n if (max === min) {\n h = s = 0; // achromatic\n }\n else {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n h /= 6;\n }\n return new HSLColor(h, s, l, a);\n }\n toRGBA() {\n let r, g, b;\n if (this.s === 0) {\n r = g = b = this.l; // achromatic\n }\n else {\n const q = this.l < 0.5 ? this.l * (1 + this.s) : this.l + this.s - this.l * this.s;\n const p = 2 * this.l - q;\n r = HSLColor.hue2rgb(p, q, this.h + 1 / 3);\n g = HSLColor.hue2rgb(p, q, this.h);\n b = HSLColor.hue2rgb(p, q, this.h - 1 / 3);\n }\n return new Color(r * 255, g * 255, b * 255, this.a);\n }\n toString() {\n const h = this.h.toFixed(0), s = this.s.toFixed(0), l = this.l.toFixed(0), a = this.a.toFixed(0);\n return `hsla(${h}, ${s}, ${l}, ${a})`;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Context.ts\":\n/*!********************!*\\\n !*** ./Context.ts ***!\n \\********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ createContext: () => (/* binding */ createContext),\n/* harmony export */ useContext: () => (/* binding */ useContext)\n/* harmony export */ });\n/**\n * Creates a injectable context that can be retrieved later with `useContext(context)`\n *\n * Example\n * ```typescript\n *\n * const AppContext = createContext({some: 'value'});\n * context.scope(val, () => {\n * const value = useContext(AppContext);\n * })\n *\n * ```\n */\nfunction createContext() {\n const ctx = {\n scope: (value, cb) => {\n const old = ctx.value;\n ctx.value = value;\n try {\n return cb();\n }\n catch (e) {\n throw e;\n }\n finally {\n ctx.value = old;\n }\n },\n value: undefined\n };\n return ctx;\n}\n/**\n * Retrieves the value from the current context\n */\nfunction useContext(context) {\n return context.value;\n}\n\n\n/***/ }),\n\n/***/ \"./Debug/DebugConfig.ts\":\n/*!******************************!*\\\n !*** ./Debug/DebugConfig.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DebugConfig: () => (/* binding */ DebugConfig),\n/* harmony export */ FrameStats: () => (/* binding */ FrameStats),\n/* harmony export */ PhysicsStats: () => (/* binding */ PhysicsStats)\n/* harmony export */ });\n/* harmony import */ var _DebugFlags__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./DebugFlags */ \"./Debug/DebugFlags.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n\n\n/**\n * Debug statistics and flags for Excalibur. If polling these values, it would be\n * best to do so on the `postupdate` event for {@apilink Engine}, after all values have been\n * updated during a frame.\n */\nclass DebugConfig {\n constructor(engine) {\n /**\n * Performance statistics\n */\n this.stats = {\n /**\n * Current frame statistics. Engine reuses this instance, use {@apilink FrameStats.clone} to copy frame stats.\n * Best accessed on {@apilink postframe} event. See {@apilink FrameStats}\n */\n currFrame: new FrameStats(),\n /**\n * Previous frame statistics. Engine reuses this instance, use {@apilink FrameStats.clone} to copy frame stats.\n * Best accessed on {@apilink preframe} event. Best inspected on engine event `preframe`. See {@apilink FrameStats}\n */\n prevFrame: new FrameStats()\n };\n /**\n * Filter debug context to named entities or entity ids\n */\n this.filter = {\n /**\n * Toggle filter on or off (default off) must be on for DebugDraw to use filters\n */\n useFilter: false,\n /**\n * Query for entities by name, if the entity name contains `nameQuery` it will be included\n */\n nameQuery: '',\n /**\n * Query for Entity ids, if the id matches it will be included\n */\n ids: []\n };\n /**\n * Entity debug settings\n */\n this.entity = {\n showAll: false,\n showId: false,\n showName: false\n };\n /**\n * Transform component debug settings\n */\n this.transform = {\n showAll: false,\n debugZIndex: 10000000,\n showPosition: false,\n showPositionLabel: false,\n positionColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Yellow,\n showZIndex: false,\n showScale: false,\n scaleColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Green,\n showRotation: false,\n rotationColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Blue\n };\n /**\n * Graphics component debug settings\n */\n this.graphics = {\n showAll: false,\n showBounds: false,\n boundsColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Yellow\n };\n /**\n * Collider component debug settings\n */\n this.collider = {\n showAll: false,\n showBounds: false,\n boundsColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Blue,\n showOwner: false,\n showGeometry: true,\n geometryColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Green,\n geometryLineWidth: 1,\n geometryPointSize: 0.5\n };\n /**\n * Physics simulation debug settings\n */\n this.physics = {\n showAll: false,\n showBroadphaseSpacePartitionDebug: false,\n showCollisionNormals: false,\n collisionNormalColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Cyan,\n showCollisionContacts: true,\n contactSize: 2,\n collisionContactColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Red\n };\n /**\n * Motion component debug settings\n */\n this.motion = {\n showAll: false,\n showVelocity: false,\n velocityColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Yellow,\n showAcceleration: false,\n accelerationColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Red\n };\n /**\n * Body component debug settings\n */\n this.body = {\n showAll: false,\n showCollisionGroup: false,\n showCollisionType: false,\n showSleeping: false,\n showMotion: false,\n showMass: false\n };\n /**\n * Camera debug settings\n */\n this.camera = {\n showAll: false,\n showFocus: false,\n focusColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Red,\n showZoom: false\n };\n this.tilemap = {\n showAll: false,\n showGrid: false,\n gridColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Red,\n gridWidth: 0.5,\n showSolidBounds: false,\n solidBoundsColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.fromHex('#8080807F'), // grayish\n showColliderGeometry: true\n };\n this.isometric = {\n showAll: false,\n showPosition: false,\n positionColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Yellow,\n positionSize: 1,\n showGrid: false,\n gridColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Red,\n gridWidth: 1,\n showColliderGeometry: true\n };\n this._engine = engine;\n this.colorBlindMode = new _DebugFlags__WEBPACK_IMPORTED_MODULE_1__.ColorBlindFlags(this._engine);\n }\n /**\n * Switch the current excalibur clock with the {@apilink TestClock} and return\n * it in the same running state.\n *\n * This is useful when you need to debug frame by frame.\n */\n useTestClock() {\n const clock = this._engine.clock;\n const wasRunning = clock.isRunning();\n clock.stop();\n const testClock = clock.toTestClock();\n if (wasRunning) {\n testClock.start();\n }\n this._engine.clock = testClock;\n return testClock;\n }\n /**\n * Switch the current excalibur clock with the {@apilink StandardClock} and\n * return it in the same running state.\n *\n * This is useful when you need to switch back to normal mode after\n * debugging.\n */\n useStandardClock() {\n const currentClock = this._engine.clock;\n const wasRunning = currentClock.isRunning();\n currentClock.stop();\n const standardClock = currentClock.toStandardClock();\n if (wasRunning) {\n standardClock.start();\n }\n this._engine.clock = standardClock;\n return standardClock;\n }\n}\n/**\n * Implementation of a frame's stats. Meant to have values copied via {@apilink FrameStats.reset}, avoid\n * creating instances of this every frame.\n */\nclass FrameStats {\n constructor() {\n this._id = 0;\n this._elapsedMs = 0;\n this._fps = 0;\n this._actorStats = {\n alive: 0,\n killed: 0,\n ui: 0,\n get remaining() {\n return this.alive - this.killed;\n },\n get total() {\n return this.remaining + this.ui;\n }\n };\n this._durationStats = {\n update: 0,\n draw: 0,\n get total() {\n return this.update + this.draw;\n }\n };\n this._physicsStats = new PhysicsStats();\n this._graphicsStats = {\n drawCalls: 0,\n drawnImages: 0\n };\n }\n /**\n * Zero out values or clone other IFrameStat stats. Allows instance reuse.\n * @param [otherStats] Optional stats to clone\n */\n reset(otherStats) {\n if (otherStats) {\n this.id = otherStats.id;\n this.elapsedMs = otherStats.elapsedMs;\n this.fps = otherStats.fps;\n this.actors.alive = otherStats.actors.alive;\n this.actors.killed = otherStats.actors.killed;\n this.actors.ui = otherStats.actors.ui;\n this.duration.update = otherStats.duration.update;\n this.duration.draw = otherStats.duration.draw;\n this._physicsStats.reset(otherStats.physics);\n this.graphics.drawCalls = otherStats.graphics.drawCalls;\n this.graphics.drawnImages = otherStats.graphics.drawnImages;\n }\n else {\n this.id = this.elapsedMs = this.fps = 0;\n this.actors.alive = this.actors.killed = this.actors.ui = 0;\n this.duration.update = this.duration.draw = 0;\n this._physicsStats.reset();\n this.graphics.drawnImages = this.graphics.drawCalls = 0;\n }\n }\n /**\n * Provides a clone of this instance.\n */\n clone() {\n const fs = new FrameStats();\n fs.reset(this);\n return fs;\n }\n /**\n * Gets the frame's id\n */\n get id() {\n return this._id;\n }\n /**\n * Sets the frame's id\n */\n set id(value) {\n this._id = value;\n }\n /**\n * Gets the frame's delta (time since last frame)\n */\n get elapsedMs() {\n return this._elapsedMs;\n }\n /**\n * Sets the frame's delta (time since last frame). Internal use only.\n * @internal\n */\n set elapsedMs(value) {\n this._elapsedMs = value;\n }\n /**\n * Gets the frame's frames-per-second (FPS)\n */\n get fps() {\n return this._fps;\n }\n /**\n * Sets the frame's frames-per-second (FPS). Internal use only.\n * @internal\n */\n set fps(value) {\n this._fps = value;\n }\n /**\n * Gets the frame's actor statistics\n */\n get actors() {\n return this._actorStats;\n }\n /**\n * Gets the frame's duration statistics\n */\n get duration() {\n return this._durationStats;\n }\n /**\n * Gets the frame's physics statistics\n */\n get physics() {\n return this._physicsStats;\n }\n /**\n * Gets the frame's graphics statistics\n */\n get graphics() {\n return this._graphicsStats;\n }\n}\nclass PhysicsStats {\n constructor() {\n this._pairs = 0;\n this._collisions = 0;\n this._contacts = new Map();\n this._fastBodies = 0;\n this._fastBodyCollisions = 0;\n this._broadphase = 0;\n this._narrowphase = 0;\n }\n /**\n * Zero out values or clone other IPhysicsStats stats. Allows instance reuse.\n * @param [otherStats] Optional stats to clone\n */\n reset(otherStats) {\n if (otherStats) {\n this.pairs = otherStats.pairs;\n this.collisions = otherStats.collisions;\n this.contacts = otherStats.contacts;\n this.fastBodies = otherStats.fastBodies;\n this.fastBodyCollisions = otherStats.fastBodyCollisions;\n this.broadphase = otherStats.broadphase;\n this.narrowphase = otherStats.narrowphase;\n }\n else {\n this.pairs = this.collisions = this.fastBodies = 0;\n this.fastBodyCollisions = this.broadphase = this.narrowphase = 0;\n this.contacts.clear();\n }\n }\n /**\n * Provides a clone of this instance.\n */\n clone() {\n const ps = new PhysicsStats();\n ps.reset(this);\n return ps;\n }\n get pairs() {\n return this._pairs;\n }\n set pairs(value) {\n this._pairs = value;\n }\n get collisions() {\n return this._collisions;\n }\n set collisions(value) {\n this._collisions = value;\n }\n get contacts() {\n return this._contacts;\n }\n set contacts(contacts) {\n this._contacts = contacts;\n }\n get fastBodies() {\n return this._fastBodies;\n }\n set fastBodies(value) {\n this._fastBodies = value;\n }\n get fastBodyCollisions() {\n return this._fastBodyCollisions;\n }\n set fastBodyCollisions(value) {\n this._fastBodyCollisions = value;\n }\n get broadphase() {\n return this._broadphase;\n }\n set broadphase(value) {\n this._broadphase = value;\n }\n get narrowphase() {\n return this._narrowphase;\n }\n set narrowphase(value) {\n this._narrowphase = value;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Debug/DebugFlags.ts\":\n/*!*****************************!*\\\n !*** ./Debug/DebugFlags.ts ***!\n \\*****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ColorBlindFlags: () => (/* binding */ ColorBlindFlags)\n/* harmony export */ });\n/* harmony import */ var _Graphics_PostProcessor_ColorBlindnessMode__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Graphics/PostProcessor/ColorBlindnessMode */ \"./Graphics/PostProcessor/ColorBlindnessMode.ts\");\n/* harmony import */ var _Graphics_PostProcessor_ColorBlindnessPostProcessor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Graphics/PostProcessor/ColorBlindnessPostProcessor */ \"./Graphics/PostProcessor/ColorBlindnessPostProcessor.ts\");\n/* harmony import */ var _Graphics_Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Graphics/Context/ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n\n\n\nclass ColorBlindFlags {\n constructor(engine) {\n this._engine = engine;\n this._colorBlindPostProcessor = new _Graphics_PostProcessor_ColorBlindnessPostProcessor__WEBPACK_IMPORTED_MODULE_0__.ColorBlindnessPostProcessor(_Graphics_PostProcessor_ColorBlindnessMode__WEBPACK_IMPORTED_MODULE_1__.ColorBlindnessMode.Protanope);\n }\n /**\n * Correct colors for a specified color blindness\n * @param colorBlindness\n */\n correct(colorBlindness) {\n if (this._engine.graphicsContext instanceof _Graphics_Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_2__.ExcaliburGraphicsContextWebGL) {\n this.clear();\n this._colorBlindPostProcessor.colorBlindnessMode = colorBlindness;\n this._colorBlindPostProcessor.simulate = false;\n this._engine.graphicsContext.addPostProcessor(this._colorBlindPostProcessor);\n }\n }\n /**\n * Simulate colors for a specified color blindness\n * @param colorBlindness\n */\n simulate(colorBlindness) {\n if (this._engine.graphicsContext instanceof _Graphics_Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_2__.ExcaliburGraphicsContextWebGL) {\n this.clear();\n this._colorBlindPostProcessor.colorBlindnessMode = colorBlindness;\n this._colorBlindPostProcessor.simulate = true;\n this._engine.graphicsContext.addPostProcessor(this._colorBlindPostProcessor);\n }\n }\n /**\n * Remove color blindness post processor\n */\n clear() {\n this._engine.graphicsContext.removePostProcessor(this._colorBlindPostProcessor);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Debug/DebugSystem.ts\":\n/*!******************************!*\\\n !*** ./Debug/DebugSystem.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DebugSystem: () => (/* binding */ DebugSystem)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../Collision/ColliderComponent */ \"./Collision/ColliderComponent.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Priority.ts\");\n/* harmony import */ var _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../Collision/BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Collision_CollisionSystem__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Collision/CollisionSystem */ \"./Collision/CollisionSystem.ts\");\n/* harmony import */ var _Collision_Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../Collision/Colliders/CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Graphics/GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Particles_Particles__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Particles/Particles */ \"./Particles/Particles.ts\");\n/* harmony import */ var _Graphics_DebugGraphicsComponent__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Graphics/DebugGraphicsComponent */ \"./Graphics/DebugGraphicsComponent.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Math/coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _Graphics_Debug__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../Graphics/Debug */ \"./Graphics/Debug.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass DebugSystem extends _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.System {\n constructor(world) {\n super();\n this.world = world;\n this.systemType = _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.SystemType.Draw;\n this.query = this.world.query([_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_1__.TransformComponent]);\n }\n initialize(world, scene) {\n this._graphicsContext = scene.engine.graphicsContext;\n this._camera = scene.camera;\n this._engine = scene.engine;\n this._collisionSystem = world.systemManager.get(_Collision_CollisionSystem__WEBPACK_IMPORTED_MODULE_2__.CollisionSystem);\n }\n update() {\n var _a;\n if (!this._engine.isDebug) {\n return;\n }\n const filterSettings = this._engine.debug.filter;\n let id;\n let name;\n const entitySettings = this._engine.debug.entity;\n let tx;\n const txSettings = this._engine.debug.transform;\n let motion;\n const motionSettings = this._engine.debug.motion;\n let colliderComp;\n const colliderSettings = this._engine.debug.collider;\n const physicsSettings = this._engine.debug.physics;\n let graphics;\n const graphicsSettings = this._engine.debug.graphics;\n let debugDraw;\n let body;\n const bodySettings = this._engine.debug.body;\n const cameraSettings = this._engine.debug.camera;\n for (let i = 0; i < this.query.entities.length; i++) {\n const entity = this.query.entities[i];\n if (entity.hasTag('offscreen')) {\n // skip offscreen entities\n continue;\n }\n if (entity instanceof _Particles_Particles__WEBPACK_IMPORTED_MODULE_3__.Particle) {\n // Particles crush the renderer :(\n continue;\n }\n if (filterSettings.useFilter) {\n const allIds = filterSettings.ids.length === 0;\n const idMatch = allIds || filterSettings.ids.includes(entity.id);\n if (!idMatch) {\n continue;\n }\n const allNames = filterSettings.nameQuery === '';\n const nameMatch = allNames || entity.name.includes(filterSettings.nameQuery);\n if (!nameMatch) {\n continue;\n }\n }\n let cursor = _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero;\n const lineHeight = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(0, 16);\n id = entity.id;\n name = entity.name;\n tx = entity.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n // This optionally sets our camera based on the entity coord plan (world vs. screen)\n this._pushCameraTransform(tx);\n this._graphicsContext.save();\n if (tx.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_5__.CoordPlane.Screen) {\n this._graphicsContext.translate(this._engine.screen.contentArea.left, this._engine.screen.contentArea.top);\n }\n this._graphicsContext.z = txSettings.debugZIndex;\n this._applyTransform(entity);\n if (tx) {\n if (txSettings.showAll || txSettings.showPosition) {\n this._graphicsContext.debug.drawPoint(_Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero, { size: 4, color: txSettings.positionColor });\n }\n if (txSettings.showAll || txSettings.showPositionLabel) {\n this._graphicsContext.debug.drawText(`pos${tx.pos.toString(2)}`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (txSettings.showAll || txSettings.showZIndex) {\n this._graphicsContext.debug.drawText(`z(${tx.z.toFixed(1)})`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (entitySettings.showAll || entitySettings.showId) {\n this._graphicsContext.debug.drawText(`id(${id}) ${entity.parent ? 'child of id(' + ((_a = entity.parent) === null || _a === void 0 ? void 0 : _a.id) + ')' : ''}`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (entitySettings.showAll || entitySettings.showName) {\n this._graphicsContext.debug.drawText(`name(${name})`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (txSettings.showAll || txSettings.showRotation) {\n this._graphicsContext.drawLine(_Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero, _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.fromAngle(tx.rotation).scale(50).add(_Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero), txSettings.rotationColor, 2);\n this._graphicsContext.debug.drawText(`rot deg(${(0,_Math_util__WEBPACK_IMPORTED_MODULE_6__.toDegrees)(tx.rotation).toFixed(2)})`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (txSettings.showAll || txSettings.showScale) {\n this._graphicsContext.drawLine(_Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero, tx.scale.add(_Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero), txSettings.scaleColor, 2);\n }\n }\n graphics = entity.get(_Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_7__.GraphicsComponent);\n if (graphics) {\n if (graphicsSettings.showAll || graphicsSettings.showBounds) {\n const bounds = graphics.localBounds;\n bounds.draw(this._graphicsContext, graphicsSettings.boundsColor);\n }\n }\n debugDraw = entity.get(_Graphics_DebugGraphicsComponent__WEBPACK_IMPORTED_MODULE_8__.DebugGraphicsComponent);\n if (debugDraw) {\n if (!debugDraw.useTransform) {\n this._graphicsContext.restore();\n }\n debugDraw.draw(this._graphicsContext, this._engine.debug);\n if (!debugDraw.useTransform) {\n this._graphicsContext.save();\n this._applyTransform(entity);\n }\n }\n body = entity.get(_Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_9__.BodyComponent);\n if (body) {\n if (bodySettings.showAll || bodySettings.showCollisionGroup) {\n this._graphicsContext.debug.drawText(`collision group(${body.group.name})`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (bodySettings.showAll || bodySettings.showCollisionType) {\n this._graphicsContext.debug.drawText(`collision type(${body.collisionType})`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (bodySettings.showAll || bodySettings.showMass) {\n this._graphicsContext.debug.drawText(`mass(${body.mass})`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (bodySettings.showAll || bodySettings.showMotion) {\n this._graphicsContext.debug.drawText(`motion(${body.sleepMotion})`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (bodySettings.showAll || bodySettings.showSleeping) {\n this._graphicsContext.debug.drawText(`sleeping(${body.canSleep ? body.isSleeping : 'cant sleep'})`, cursor);\n cursor = cursor.add(lineHeight);\n }\n }\n this._graphicsContext.restore();\n // World space\n this._graphicsContext.save();\n if (tx.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_5__.CoordPlane.Screen) {\n this._graphicsContext.translate(this._engine.screen.contentArea.left, this._engine.screen.contentArea.top);\n }\n this._graphicsContext.z = txSettings.debugZIndex;\n motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_10__.MotionComponent);\n if (motion) {\n if (motionSettings.showAll || motionSettings.showVelocity) {\n this._graphicsContext.debug.drawText(`vel${motion.vel.toString(2)}`, cursor.add(tx.globalPos));\n this._graphicsContext.drawLine(tx.globalPos, tx.globalPos.add(motion.vel), motionSettings.velocityColor, 2);\n cursor = cursor.add(lineHeight);\n }\n if (motionSettings.showAll || motionSettings.showAcceleration) {\n this._graphicsContext.drawLine(tx.globalPos, tx.globalPos.add(motion.acc), motionSettings.accelerationColor, 2);\n }\n }\n // Colliders live in world space already so after the restore()\n colliderComp = entity.get(_Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_11__.ColliderComponent);\n if (colliderComp) {\n const collider = colliderComp.get();\n if ((colliderSettings.showAll || colliderSettings.showGeometry) && collider) {\n collider.debug(this._graphicsContext, colliderSettings.geometryColor, {\n lineWidth: colliderSettings.geometryLineWidth,\n pointSize: colliderSettings.geometryPointSize\n });\n }\n if (colliderSettings.showAll || colliderSettings.showBounds) {\n if (collider instanceof _Collision_Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_12__.CompositeCollider) {\n const colliders = collider.getColliders();\n for (const collider of colliders) {\n const bounds = collider.bounds;\n const pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(bounds.left, bounds.top);\n this._graphicsContext.debug.drawRect(pos.x, pos.y, bounds.width, bounds.height, { color: colliderSettings.boundsColor });\n if (colliderSettings.showAll || colliderSettings.showOwner) {\n this._graphicsContext.debug.drawText(`owner id(${collider.owner.id})`, pos);\n }\n }\n colliderComp.bounds.draw(this._graphicsContext, colliderSettings.boundsColor);\n }\n else if (collider) {\n const bounds = colliderComp.bounds;\n const pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(bounds.left, bounds.top);\n this._graphicsContext.debug.drawRect(pos.x, pos.y, bounds.width, bounds.height, { color: colliderSettings.boundsColor });\n if (colliderSettings.showAll || colliderSettings.showOwner) {\n this._graphicsContext.debug.drawText(`owner id(${colliderComp.owner.id})`, pos);\n }\n }\n }\n }\n this._graphicsContext.restore();\n this._popCameraTransform(tx);\n }\n this._graphicsContext.save();\n this._camera.draw(this._graphicsContext);\n if (physicsSettings.showAll || physicsSettings.showBroadphaseSpacePartitionDebug) {\n this._collisionSystem.debug(this._graphicsContext);\n }\n if (physicsSettings.showAll || physicsSettings.showCollisionContacts || physicsSettings.showCollisionNormals) {\n for (const [_, contact] of this._engine.debug.stats.currFrame.physics.contacts) {\n if (physicsSettings.showAll || physicsSettings.showCollisionContacts) {\n for (const point of contact.points) {\n this._graphicsContext.debug.drawPoint(point, {\n size: physicsSettings.contactSize,\n color: physicsSettings.collisionContactColor\n });\n }\n }\n if (physicsSettings.showAll || physicsSettings.showCollisionNormals) {\n for (const point of contact.points) {\n this._graphicsContext.debug.drawLine(point, contact.normal.scale(30).add(point), {\n color: physicsSettings.collisionNormalColor\n });\n }\n }\n }\n }\n this._graphicsContext.restore();\n if (cameraSettings) {\n this._graphicsContext.save();\n this._camera.draw(this._graphicsContext);\n if (cameraSettings.showAll || cameraSettings.showFocus) {\n this._graphicsContext.drawCircle(this._camera.pos, 4, cameraSettings.focusColor);\n }\n if (cameraSettings.showAll || cameraSettings.showZoom) {\n this._graphicsContext.debug.drawText(`zoom(${this._camera.zoom})`, this._camera.pos);\n }\n this._graphicsContext.restore();\n }\n this._graphicsContext.flush();\n }\n postupdate(engine, elapsed) {\n if (this._engine.isDebug) {\n this._graphicsContext.save();\n if (this._camera) {\n this._camera.draw(this._graphicsContext);\n }\n _Graphics_Debug__WEBPACK_IMPORTED_MODULE_13__.Debug.flush(this._graphicsContext);\n this._graphicsContext.restore();\n }\n }\n /**\n * This applies the current entity transform to the graphics context\n * @param entity\n */\n _applyTransform(entity) {\n const ancestors = entity.getAncestors();\n for (const ancestor of ancestors) {\n const transform = ancestor === null || ancestor === void 0 ? void 0 : ancestor.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n if (transform) {\n this._graphicsContext.translate(transform.pos.x, transform.pos.y);\n this._graphicsContext.scale(transform.scale.x, transform.scale.y);\n this._graphicsContext.rotate(transform.rotation);\n }\n }\n }\n /**\n * Applies the current camera transform if in world coordinates\n * @param transform\n */\n _pushCameraTransform(transform) {\n // Establish camera offset per entity\n if (transform.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_5__.CoordPlane.World) {\n this._graphicsContext.save();\n if (this._camera) {\n this._camera.draw(this._graphicsContext);\n }\n }\n }\n /**\n * Resets the current camera transform if in world coordinates\n * @param transform\n */\n _popCameraTransform(transform) {\n if (transform.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_5__.CoordPlane.World) {\n // Apply camera world offset\n this._graphicsContext.restore();\n }\n }\n}\nDebugSystem.priority = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_14__.SystemPriority.Lowest;\n\n\n/***/ }),\n\n/***/ \"./Debug/index.ts\":\n/*!************************!*\\\n !*** ./Debug/index.ts ***!\n \\************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ColorBlindFlags: () => (/* reexport safe */ _DebugFlags__WEBPACK_IMPORTED_MODULE_1__.ColorBlindFlags),\n/* harmony export */ DebugConfig: () => (/* reexport safe */ _DebugConfig__WEBPACK_IMPORTED_MODULE_0__.DebugConfig),\n/* harmony export */ DebugSystem: () => (/* reexport safe */ _DebugSystem__WEBPACK_IMPORTED_MODULE_2__.DebugSystem),\n/* harmony export */ FrameStats: () => (/* reexport safe */ _DebugConfig__WEBPACK_IMPORTED_MODULE_0__.FrameStats),\n/* harmony export */ PhysicsStats: () => (/* reexport safe */ _DebugConfig__WEBPACK_IMPORTED_MODULE_0__.PhysicsStats)\n/* harmony export */ });\n/* harmony import */ var _DebugConfig__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./DebugConfig */ \"./Debug/DebugConfig.ts\");\n/* harmony import */ var _DebugFlags__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./DebugFlags */ \"./Debug/DebugFlags.ts\");\n/* harmony import */ var _DebugSystem__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./DebugSystem */ \"./Debug/DebugSystem.ts\");\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Director/CrossFade.ts\":\n/*!*******************************!*\\\n !*** ./Director/CrossFade.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CrossFade: () => (/* binding */ CrossFade)\n/* harmony export */ });\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Graphics */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Transition__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Transition */ \"./Director/Transition.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n\n\n\n/**\n * CrossFades between the previous scene and the destination scene\n *\n * Note: CrossFade only works as an \"in\" transition\n */\nclass CrossFade extends _Transition__WEBPACK_IMPORTED_MODULE_0__.Transition {\n constructor(options) {\n super({ direction: 'in', ...options }); // default the correct direction\n this.name = `CrossFade#${this.id}`;\n }\n async onPreviousSceneDeactivate(scene) {\n this.image = await scene.engine.screenshot(true);\n // Firefox is particularly slow\n // needed in case the image isn't ready yet\n await this.image.decode();\n }\n onInitialize(engine) {\n this.engine = engine;\n this.transform.pos = engine.screen.unsafeArea.topLeft;\n this.screenCover = _Graphics__WEBPACK_IMPORTED_MODULE_1__.ImageSource.fromHtmlImageElement(this.image).toSprite();\n this.graphics.add(this.screenCover);\n // This is because we preserve hidpi res on the screen shot which COULD be bigger than the logical resolution\n this.transform.scale = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(1 / engine.screen.pixelRatio, 1 / engine.screen.pixelRatio);\n this.graphics.opacity = this.progress;\n }\n onStart(_progress) {\n this.graphics.opacity = this.progress;\n }\n onReset() {\n this.graphics.opacity = this.progress;\n }\n onEnd(progress) {\n this.graphics.opacity = progress;\n }\n onUpdate(progress) {\n this.graphics.opacity = progress;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Director/DefaultLoader.ts\":\n/*!***********************************!*\\\n !*** ./Director/DefaultLoader.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DefaultLoader: () => (/* binding */ DefaultLoader),\n/* harmony export */ LoaderEvents: () => (/* binding */ LoaderEvents),\n/* harmony export */ isLoaderConstructor: () => (/* binding */ isLoaderConstructor)\n/* harmony export */ });\n/* harmony import */ var _Util_WebAudio__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Util/WebAudio */ \"./Util/WebAudio.ts\");\n/* harmony import */ var _Graphics_Canvas__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Graphics/Canvas */ \"./Graphics/Canvas.ts\");\n/* harmony import */ var _Graphics_Filtering__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Graphics/Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Resources_Sound_Sound__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Resources/Sound/Sound */ \"./Resources/Sound/Sound.ts\");\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Util/Future */ \"./Util/Future.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Util/Util */ \"./Util/Util.ts\");\n\n\n\n\n\n\n\n\n\nconst LoaderEvents = {\n // Add event types here\n BeforeLoad: 'beforeload',\n AfterLoad: 'afterload',\n UserAction: 'useraction',\n LoadResourceStart: 'loadresourcestart',\n LoadResourceEnd: 'loadresourceend'\n};\n/**\n * Returns true if the constructor is for an Excalibur Loader\n */\nfunction isLoaderConstructor(x) {\n var _a, _b;\n return !!(x === null || x === void 0 ? void 0 : x.prototype) && !!((_b = (_a = x === null || x === void 0 ? void 0 : x.prototype) === null || _a === void 0 ? void 0 : _a.constructor) === null || _b === void 0 ? void 0 : _b.name);\n}\nclass DefaultLoader {\n get resources() {\n return this._resources;\n }\n /**\n * @param options Optionally provide the list of resources you want to load at constructor time\n */\n constructor(options) {\n var _a;\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n this.canvas = new _Graphics_Canvas__WEBPACK_IMPORTED_MODULE_1__.Canvas({\n filtering: _Graphics_Filtering__WEBPACK_IMPORTED_MODULE_2__.ImageFiltering.Blended,\n smoothing: true,\n cache: false,\n draw: this.onDraw.bind(this)\n });\n this._resources = [];\n this._numLoaded = 0;\n this._totalTimeMs = 0;\n this._loadingFuture = new _Util_Future__WEBPACK_IMPORTED_MODULE_3__.Future();\n if (options && ((_a = options.loadables) === null || _a === void 0 ? void 0 : _a.length)) {\n this.addResources(options.loadables);\n }\n }\n /**\n * Called by the engine before loading\n * @param engine\n */\n onInitialize(engine) {\n this.engine = engine;\n this.canvas.width = this.engine.screen.resolution.width;\n this.canvas.height = this.engine.screen.resolution.height;\n }\n /**\n * Return a promise that resolves when the user interacts with the loading screen in some way, usually a click.\n *\n * It's important to implement this in order to unlock the audio context in the browser. Browsers automatically prevent\n * audio from playing until the user performs an action.\n *\n */\n async onUserAction() {\n return await Promise.resolve();\n }\n /**\n * Overridable lifecycle method, called directly before loading starts\n */\n async onBeforeLoad() {\n // override me\n }\n /**\n * Overridable lifecycle method, called after loading has completed\n */\n async onAfterLoad() {\n // override me\n await (0,_Util_Util__WEBPACK_IMPORTED_MODULE_4__.delay)(500, this.engine.clock); // avoid a flicker\n }\n /**\n * Add a resource to the loader to load\n * @param loadable Resource to add\n */\n addResource(loadable) {\n this._resources.push(loadable);\n }\n /**\n * Add a list of resources to the loader to load\n * @param loadables The list of resources to load\n */\n addResources(loadables) {\n let i = 0;\n const len = loadables.length;\n for (i; i < len; i++) {\n this.addResource(loadables[i]);\n }\n }\n markResourceComplete() {\n this._numLoaded++;\n }\n /**\n * Returns the progress of the loader as a number between [0, 1] inclusive.\n */\n get progress() {\n const total = this._resources.length;\n return total > 0 ? (0,_Math_util__WEBPACK_IMPORTED_MODULE_5__.clamp)(this._numLoaded, 0, total) / total : 1;\n }\n /**\n * Returns true if the loader has completely loaded all resources\n */\n isLoaded() {\n return this._numLoaded === this._resources.length;\n }\n /**\n * Optionally override the onUpdate\n * @param engine\n * @param elapsed\n */\n onUpdate(engine, elapsed) {\n this._totalTimeMs += elapsed;\n // override me\n }\n /**\n * Optionally override the onDraw\n */\n onDraw(ctx) {\n const seconds = this._totalTimeMs / 1000;\n ctx.fillStyle = _Color__WEBPACK_IMPORTED_MODULE_6__.Color.Black.toRGBA();\n ctx.fillRect(0, 0, this.engine.screen.resolution.width, this.engine.screen.resolution.height);\n ctx.save();\n ctx.translate(this.engine.screen.resolution.width / 2, this.engine.screen.resolution.height / 2);\n const speed = seconds * 10;\n ctx.strokeStyle = 'white';\n ctx.lineWidth = 10;\n ctx.lineCap = 'round';\n ctx.arc(0, 0, 40, speed, speed + (Math.PI * 3) / 2);\n ctx.stroke();\n ctx.fillStyle = 'white';\n ctx.font = '16px sans-serif';\n const text = (this.progress * 100).toFixed(0) + '%';\n const textbox = ctx.measureText(text);\n const width = Math.abs(textbox.actualBoundingBoxLeft) + Math.abs(textbox.actualBoundingBoxRight);\n const height = Math.abs(textbox.actualBoundingBoxAscent) + Math.abs(textbox.actualBoundingBoxDescent);\n ctx.fillText(text, -width / 2, height / 2); // center\n ctx.restore();\n }\n areResourcesLoaded() {\n if (this._resources.length === 0) {\n // special case no resources mean loaded;\n return Promise.resolve();\n }\n return this._loadingFuture.promise;\n }\n /**\n * Not meant to be overridden\n *\n * Begin loading all of the supplied resources, returning a promise\n * that resolves when loading of all is complete AND the user has interacted with the loading screen\n */\n async load() {\n await this.onBeforeLoad();\n this.events.emit('beforeload');\n this.canvas.flagDirty();\n await Promise.all(this._resources.map(async (r) => {\n this.events.emit('loadresourcestart', r);\n await r.load().finally(() => {\n // capture progress\n this._numLoaded++;\n this.canvas.flagDirty();\n this.events.emit('loadresourceend', r);\n });\n }));\n // Wire all sound to the engine\n for (const resource of this._resources) {\n if (resource instanceof _Resources_Sound_Sound__WEBPACK_IMPORTED_MODULE_7__.Sound) {\n resource.wireEngine(this.engine);\n }\n }\n this._loadingFuture.resolve();\n this.canvas.flagDirty();\n // Unlock browser AudioContext in after user gesture\n // See: https://github.com/excaliburjs/Excalibur/issues/262\n // See: https://github.com/excaliburjs/Excalibur/issues/1031\n await this.onUserAction();\n this.events.emit('useraction');\n await _Util_WebAudio__WEBPACK_IMPORTED_MODULE_8__.WebAudio.unlock();\n await this.onAfterLoad();\n this.events.emit('afterload');\n return (this.data = this._resources);\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Director/Director.ts\":\n/*!******************************!*\\\n !*** ./Director/Director.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Director: () => (/* binding */ Director),\n/* harmony export */ DirectorEvents: () => (/* binding */ DirectorEvents)\n/* harmony export */ });\n/* harmony import */ var _DefaultLoader__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./DefaultLoader */ \"./Director/DefaultLoader.ts\");\n/* harmony import */ var _Scene__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Scene */ \"./Scene.ts\");\n/* harmony import */ var _Loader__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Loader */ \"./Director/Loader.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n\n\n\nconst DirectorEvents = {\n NavigationStart: 'navigationstart',\n Navigation: 'navigation',\n NavigationEnd: 'navigationend'\n};\n/**\n * The Director is responsible for managing scenes and changing scenes in Excalibur.\n *\n * It deals with transitions, scene loaders, switching scenes\n *\n * This is used internally by Excalibur, generally not mean to\n * be instantiated end users directly.\n */\nclass Director {\n /**\n * Gets whether the director currently transitioning between scenes\n *\n * Useful if you need to block behavior during transition\n */\n get isTransitioning() {\n return this._isTransitioning;\n }\n constructor(_engine, scenes) {\n this._engine = _engine;\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this._initialized = false;\n /**\n * All registered scenes in Excalibur\n */\n this.scenes = {};\n /**\n * Holds all instantiated scenes\n */\n this._sceneToInstance = new Map();\n this._sceneToLoader = new Map();\n this._sceneToTransition = new Map();\n /**\n * Used to keep track of scenes that have already been loaded so we don't load multiple times\n */\n this._loadedScenes = new Set();\n this._isTransitioning = false;\n this.rootScene = this.currentScene = new _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene();\n this.add('root', this.rootScene);\n this.currentScene = this.rootScene;\n this.currentSceneName = 'root';\n for (const sceneKey in scenes) {\n const sceneOrOptions = scenes[sceneKey];\n this.add(sceneKey, sceneOrOptions);\n if (sceneKey === 'root') {\n this.rootScene = this.getSceneInstance('root'); // always a root scene\n this.currentScene = this.rootScene;\n }\n }\n }\n /**\n * Initialize the director's internal state\n */\n async onInitialize() {\n if (!this._initialized) {\n this._initialized = true;\n if (this._deferredGoto) {\n const deferredScene = this._deferredGoto;\n this._deferredGoto = undefined;\n const deferredTransition = this._deferredTransition;\n this._deferredTransition = undefined;\n const deferredSceneInstance = this.getSceneInstance(deferredScene);\n if (deferredSceneInstance && deferredTransition) {\n deferredTransition._addToTargetScene(this._engine, deferredSceneInstance);\n }\n await this.swapScene(deferredScene);\n if (deferredSceneInstance && deferredTransition) {\n await this.playTransition(deferredTransition, deferredSceneInstance);\n }\n }\n else {\n await this.swapScene('root');\n }\n }\n }\n get isInitialized() {\n return this._initialized;\n }\n /**\n * Configures the start scene, and optionally the transition & loader for the director\n *\n * Typically this is called at the beginning of the game to the start scene and transition and never again.\n * @param startScene\n * @param options\n */\n configureStart(startScene, options) {\n const maybeLoaderOrCtor = options === null || options === void 0 ? void 0 : options.loader;\n if (maybeLoaderOrCtor instanceof _DefaultLoader__WEBPACK_IMPORTED_MODULE_3__.DefaultLoader) {\n this.mainLoader = maybeLoaderOrCtor;\n }\n else if ((0,_DefaultLoader__WEBPACK_IMPORTED_MODULE_3__.isLoaderConstructor)(maybeLoaderOrCtor)) {\n this.mainLoader = new maybeLoaderOrCtor();\n }\n else {\n this.mainLoader = new _Loader__WEBPACK_IMPORTED_MODULE_4__.Loader();\n }\n let maybeStartTransition;\n if (options === null || options === void 0 ? void 0 : options.inTransition) {\n const { inTransition } = options;\n maybeStartTransition = inTransition;\n }\n this.startScene = startScene;\n // Fire and forget promise for the initial scene\n if (maybeStartTransition) {\n const startSceneInstance = this.getSceneInstance(this.startScene);\n if (startSceneInstance) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n maybeStartTransition._addToTargetScene(this._engine, startSceneInstance);\n this.swapScene(this.startScene).then(() => {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n return this.playTransition(maybeStartTransition, startSceneInstance);\n });\n }\n }\n else {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.swapScene(this.startScene);\n }\n this.currentSceneName = this.startScene;\n }\n _getLoader(sceneName) {\n return this._sceneToLoader.get(sceneName);\n }\n _getInTransition(sceneName) {\n var _a;\n const sceneOrRoute = this.scenes[sceneName];\n if (sceneOrRoute instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene || (0,_Scene__WEBPACK_IMPORTED_MODULE_2__.isSceneConstructor)(sceneOrRoute)) {\n return undefined;\n }\n return (_a = sceneOrRoute === null || sceneOrRoute === void 0 ? void 0 : sceneOrRoute.transitions) === null || _a === void 0 ? void 0 : _a.in;\n }\n _getOutTransition(sceneName) {\n var _a;\n const sceneOrRoute = this.scenes[sceneName];\n if (sceneOrRoute instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene || (0,_Scene__WEBPACK_IMPORTED_MODULE_2__.isSceneConstructor)(sceneOrRoute)) {\n return undefined;\n }\n return (_a = sceneOrRoute === null || sceneOrRoute === void 0 ? void 0 : sceneOrRoute.transitions) === null || _a === void 0 ? void 0 : _a.out;\n }\n getDeferredScene() {\n const maybeDeferred = this.getSceneDefinition(this._deferredGoto);\n if (this._deferredGoto && maybeDeferred) {\n return maybeDeferred;\n }\n return null;\n }\n /**\n * Returns a scene by name if it exists, might be the constructor and not the instance of a scene\n * @param name\n */\n getSceneDefinition(name) {\n const maybeScene = this.scenes[name];\n if (maybeScene instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene || (0,_Scene__WEBPACK_IMPORTED_MODULE_2__.isSceneConstructor)(maybeScene)) {\n return maybeScene;\n }\n else if (maybeScene) {\n return maybeScene.scene;\n }\n return undefined;\n }\n /**\n * Returns the name of the registered scene, null if none can be found\n * @param scene\n */\n getSceneName(scene) {\n for (const [name, maybeScene] of Object.entries(this.scenes)) {\n if (maybeScene instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene) {\n if (scene === maybeScene) {\n return name;\n }\n }\n else if (!(0,_Scene__WEBPACK_IMPORTED_MODULE_2__.isSceneConstructor)(maybeScene)) {\n if (scene === maybeScene.scene) {\n return name;\n }\n }\n }\n for (const [name, maybeScene] of Object.entries(this.scenes)) {\n if ((0,_Scene__WEBPACK_IMPORTED_MODULE_2__.isSceneConstructor)(maybeScene)) {\n if (scene.constructor === maybeScene) {\n return name;\n }\n }\n else if (!(maybeScene instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene)) {\n if (scene.constructor === maybeScene.scene) {\n return name;\n }\n }\n }\n return null;\n }\n /**\n * Returns the same Director, but asserts a scene DOES exist to the type system\n * @param name\n */\n assertAdded(name) {\n return this;\n }\n /**\n * Returns the same Director, but asserts a scene DOES NOT exist to the type system\n * @param name\n */\n assertRemoved(name) {\n return this;\n }\n /**\n * Adds additional Scenes to the game!\n * @param name\n * @param sceneOrRoute\n */\n add(name, sceneOrRoute) {\n if (!(sceneOrRoute instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene) && !(0,_Scene__WEBPACK_IMPORTED_MODULE_2__.isSceneConstructor)(sceneOrRoute)) {\n const { loader, transitions } = sceneOrRoute;\n const { in: inTransition, out: outTransition } = transitions !== null && transitions !== void 0 ? transitions : {};\n this._sceneToTransition.set(name, { in: inTransition, out: outTransition });\n if ((0,_DefaultLoader__WEBPACK_IMPORTED_MODULE_3__.isLoaderConstructor)(loader)) {\n this._sceneToLoader.set(name, new loader());\n }\n else if (loader) {\n this._sceneToLoader.set(name, loader);\n }\n }\n if (this.scenes[name]) {\n this._logger.warn('Scene', name, 'already exists overwriting');\n }\n this.scenes[name] = sceneOrRoute;\n return this.assertAdded(name);\n }\n remove(nameOrScene) {\n if (nameOrScene instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene || (0,_Scene__WEBPACK_IMPORTED_MODULE_2__.isSceneConstructor)(nameOrScene)) {\n const sceneOrCtor = nameOrScene;\n // remove scene\n for (const key in this.scenes) {\n if (this.scenes.hasOwnProperty(key)) {\n const potentialSceneOrOptions = this.scenes[key];\n let scene;\n if (potentialSceneOrOptions instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene || (0,_Scene__WEBPACK_IMPORTED_MODULE_2__.isSceneConstructor)(potentialSceneOrOptions)) {\n scene = potentialSceneOrOptions;\n }\n else {\n scene = potentialSceneOrOptions.scene;\n }\n if (scene === sceneOrCtor) {\n if (key === this.currentSceneName) {\n throw new Error(`Cannot remove a currently active scene: ${key}`);\n }\n this._sceneToInstance.delete(key);\n this._sceneToTransition.delete(key);\n this._sceneToLoader.delete(key);\n delete this.scenes[key];\n }\n }\n }\n }\n if (typeof nameOrScene === 'string') {\n if (nameOrScene === this.currentSceneName) {\n throw new Error(`Cannot remove a currently active scene: ${nameOrScene}`);\n }\n // remove scene\n this._sceneToInstance.delete(nameOrScene);\n this._sceneToTransition.delete(nameOrScene);\n this._sceneToLoader.delete(nameOrScene);\n delete this.scenes[nameOrScene];\n }\n }\n /**\n * Go to a specific scene, and optionally override loaders and transitions\n * @param destinationScene\n * @param options\n */\n async goToScene(destinationScene, options) {\n var _a, _b, _c, _d, _e, _f;\n const maybeDest = this.getSceneInstance(destinationScene);\n if (!maybeDest) {\n this._logger.warn(`Scene ${destinationScene} does not exist! Check the name, are you sure you added it?`);\n return;\n }\n const sourceSceneInstance = this.currentScene;\n const sourceScene = this.currentSceneName;\n const engineInputEnabled = (_b = (_a = this._engine.input) === null || _a === void 0 ? void 0 : _a.enabled) !== null && _b !== void 0 ? _b : true;\n this._isTransitioning = true;\n const maybeSourceOut = (_c = this.getSceneInstance(sourceScene)) === null || _c === void 0 ? void 0 : _c.onTransition('out');\n const maybeDestinationIn = maybeDest === null || maybeDest === void 0 ? void 0 : maybeDest.onTransition('in');\n options = {\n // Engine configuration then dynamic scene transitions\n ...{ sourceOut: (_d = this._getOutTransition(this.currentSceneName)) !== null && _d !== void 0 ? _d : maybeSourceOut },\n ...{ destinationIn: (_e = this._getInTransition(destinationScene)) !== null && _e !== void 0 ? _e : maybeDestinationIn },\n // Goto options\n ...options\n };\n const { sourceOut, destinationIn, sceneActivationData } = options;\n const outTransition = sourceOut !== null && sourceOut !== void 0 ? sourceOut : this._getOutTransition(this.currentSceneName);\n const inTransition = destinationIn !== null && destinationIn !== void 0 ? destinationIn : this._getInTransition(destinationScene);\n const hideLoader = (outTransition === null || outTransition === void 0 ? void 0 : outTransition.hideLoader) || (inTransition === null || inTransition === void 0 ? void 0 : inTransition.hideLoader);\n if (hideLoader) {\n // Start hidden loader early and take advantage of the transition\n // Don't await and block on a hidden loader\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.maybeLoadScene(destinationScene, hideLoader);\n }\n this._emitEvent('navigationstart', sourceScene, destinationScene);\n // Run the out transition on the current scene if present\n if (outTransition) {\n await this.playTransition(outTransition, sourceSceneInstance);\n }\n // Run the loader if present\n await this.maybeLoadScene(destinationScene, hideLoader);\n // Give incoming transition a chance to grab info from previous\n if (inTransition) {\n await inTransition.onPreviousSceneDeactivate(this.currentScene);\n }\n // Setup the in transition on the destination scene if present\n // this is important to it can be initialized with the\n if (inTransition) {\n inTransition._addToTargetScene(this._engine, maybeDest);\n }\n // Swap to the new scene\n // Runs scene lifecycle init and activate\n await this.swapScene(destinationScene, sceneActivationData);\n this._emitEvent('navigation', sourceScene, destinationScene);\n // Run the in transition on the new scene if present\n if (inTransition) {\n await this.playTransition(inTransition, maybeDest);\n }\n this._emitEvent('navigationend', sourceScene, destinationScene);\n (_f = this._engine.input) === null || _f === void 0 ? void 0 : _f.toggleEnabled(engineInputEnabled);\n this._isTransitioning = false;\n }\n /**\n * Retrieves a scene instance by key if it's registered.\n *\n * This will call any constructors that were given as a definition\n * @param scene\n */\n getSceneInstance(scene) {\n const sceneDefinition = this.getSceneDefinition(scene);\n if (!sceneDefinition) {\n return undefined;\n }\n if (this._sceneToInstance.has(scene)) {\n return this._sceneToInstance.get(scene);\n }\n if (sceneDefinition instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene) {\n this._sceneToInstance.set(scene, sceneDefinition);\n return sceneDefinition;\n }\n const newScene = new sceneDefinition();\n this._sceneToInstance.set(scene, newScene);\n return newScene;\n }\n /**\n * Triggers scene loading if has not already been loaded\n * @param scene\n * @param hideLoader\n */\n async maybeLoadScene(scene, hideLoader = false) {\n var _a;\n const loader = (_a = this._getLoader(scene)) !== null && _a !== void 0 ? _a : new _DefaultLoader__WEBPACK_IMPORTED_MODULE_3__.DefaultLoader();\n const sceneToLoad = this.getSceneDefinition(scene);\n const sceneToLoadInstance = this.getSceneInstance(scene);\n if (sceneToLoad && sceneToLoadInstance && !this._loadedScenes.has(sceneToLoadInstance)) {\n sceneToLoadInstance.onPreLoad(loader);\n sceneToLoadInstance.events.emit('preload', { loader });\n if (hideLoader) {\n // Don't await a hidden loader\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this._engine.load(loader, hideLoader);\n }\n else {\n await this._engine.load(loader);\n }\n this._loadedScenes.add(sceneToLoadInstance);\n }\n }\n /**\n * Plays a transition in the current scene and does book keeping for input.\n * @param transition\n */\n async playTransition(transition, targetScene) {\n var _a, _b, _c, _d, _e, _f, _g;\n if (!this.isInitialized) {\n this._deferredTransition = transition;\n return;\n }\n if (transition) {\n this.currentTransition = transition;\n const sceneInputEnabled = (_b = (_a = targetScene.input) === null || _a === void 0 ? void 0 : _a.enabled) !== null && _b !== void 0 ? _b : true;\n (_c = targetScene.input) === null || _c === void 0 ? void 0 : _c.toggleEnabled(!transition.blockInput);\n (_d = this._engine.input) === null || _d === void 0 ? void 0 : _d.toggleEnabled(!transition.blockInput);\n this.currentTransition._addToTargetScene(this._engine, targetScene);\n await this.currentTransition._play();\n (_e = targetScene.input) === null || _e === void 0 ? void 0 : _e.toggleEnabled(sceneInputEnabled);\n }\n (_f = this.currentTransition) === null || _f === void 0 ? void 0 : _f.kill();\n (_g = this.currentTransition) === null || _g === void 0 ? void 0 : _g.reset();\n this.currentTransition = undefined;\n }\n /**\n * Swaps the current and destination scene after performing required lifecycle events\n * @param destinationScene\n * @param data\n */\n async swapScene(destinationScene, data) {\n const engine = this._engine;\n // if not yet initialized defer goToScene\n if (!this.isInitialized) {\n this._deferredGoto = destinationScene;\n return;\n }\n const maybeDest = this.getSceneInstance(destinationScene);\n if (maybeDest) {\n const previousScene = this.currentScene;\n const nextScene = maybeDest;\n this._logger.debug('Going to scene:', destinationScene);\n // only deactivate when initialized\n if (this.currentScene.isInitialized) {\n const context = { engine, previousScene, nextScene };\n await this.currentScene._deactivate(context);\n this.currentScene.events.emit('deactivate', new _Events__WEBPACK_IMPORTED_MODULE_5__.DeactivateEvent(context, this.currentScene));\n this.currentScene.input.clear();\n }\n // wait for the scene to be loaded if needed\n const destLoader = this._sceneToLoader.get(destinationScene);\n await (destLoader === null || destLoader === void 0 ? void 0 : destLoader.areResourcesLoaded());\n // set current scene to new one\n this.currentScene = nextScene;\n this.currentSceneName = destinationScene;\n engine.screen.setCurrentCamera(nextScene.camera);\n // initialize the current scene if has not been already\n await this.currentScene._initialize(engine);\n const context = { engine, previousScene, nextScene, data };\n await this.currentScene._activate(context);\n this.currentScene.events.emit('activate', new _Events__WEBPACK_IMPORTED_MODULE_5__.ActivateEvent(context, this.currentScene));\n }\n else {\n this._logger.error('Scene', destinationScene, 'does not exist!');\n }\n }\n _emitEvent(eventName, sourceScene, destinationScene) {\n const source = this.getSceneDefinition(sourceScene);\n const dest = this.getSceneDefinition(destinationScene);\n this.events.emit(eventName, {\n sourceScene: source,\n sourceName: sourceScene,\n destinationScene: dest,\n destinationName: destinationScene\n });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Director/FadeInOut.ts\":\n/*!*******************************!*\\\n !*** ./Director/FadeInOut.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FadeInOut: () => (/* binding */ FadeInOut)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Graphics */ \"./Graphics/Rectangle.ts\");\n/* harmony import */ var _Transition__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Transition */ \"./Director/Transition.ts\");\n\n\n\nclass FadeInOut extends _Transition__WEBPACK_IMPORTED_MODULE_0__.Transition {\n constructor(options) {\n var _a, _b;\n super({\n ...options,\n duration: (_a = options.duration) !== null && _a !== void 0 ? _a : 2000\n });\n this.name = `FadeInOut#${this.id}`;\n this.color = (_b = options.color) !== null && _b !== void 0 ? _b : _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Black;\n }\n onInitialize(engine) {\n this.transform.pos = engine.screen.unsafeArea.topLeft;\n this.screenCover = new _Graphics__WEBPACK_IMPORTED_MODULE_2__.Rectangle({\n width: engine.screen.resolution.width,\n height: engine.screen.resolution.height,\n color: this.color\n });\n this.graphics.add(this.screenCover);\n this.graphics.opacity = this.progress;\n }\n onReset() {\n this.graphics.opacity = this.progress;\n }\n onStart(progress) {\n this.graphics.opacity = progress;\n }\n onEnd(progress) {\n this.graphics.opacity = progress;\n }\n onUpdate(progress) {\n this.graphics.opacity = progress;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Director/Loader.ts\":\n/*!****************************!*\\\n !*** ./Director/Loader.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Loader: () => (/* binding */ Loader)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Util_DrawUtil__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Util/DrawUtil */ \"./Util/DrawUtil.ts\");\n/* harmony import */ var _Loader_logo_png__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Loader.logo.png */ \"./Director/Loader.logo.png\");\n/* harmony import */ var _Loader_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Loader.css */ \"./Director/Loader.css\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Util/Util */ \"./Util/Util.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _DefaultLoader__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./DefaultLoader */ \"./Director/DefaultLoader.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Util/Future */ \"./Util/Future.ts\");\n\n\n\n\n\n\n\n\n\n/**\n * Pre-loading assets\n *\n * The loader provides a mechanism to preload multiple resources at\n * one time. The loader must be passed to the engine in order to\n * trigger the loading progress bar.\n *\n * The {@apilink Loader} itself implements {@apilink Loadable} so you can load loaders.\n *\n * ## Example: Pre-loading resources for a game\n *\n * ```js\n * // create a loader\n * var loader = new ex.Loader();\n *\n * // create a resource dictionary (best practice is to keep a separate file)\n * var resources = {\n * TextureGround: new ex.Texture(\"/images/textures/ground.png\"),\n * SoundDeath: new ex.Sound(\"/sound/death.wav\", \"/sound/death.mp3\")\n * };\n *\n * // loop through dictionary and add to loader\n * for (var loadable in resources) {\n * if (resources.hasOwnProperty(loadable)) {\n * loader.addResource(resources[loadable]);\n * }\n * }\n *\n * // start game\n * game.start(loader).then(function () {\n * console.log(\"Game started!\");\n * });\n * ```\n *\n * ## Customize the Loader\n *\n * The loader can be customized to show different, text, logo, background color, and button.\n *\n * ```typescript\n * const loader = new ex.Loader([playerTexture]);\n *\n * // The loaders button text can simply modified using this\n * loader.playButtonText = 'Start the best game ever';\n *\n * // The logo can be changed by inserting a base64 image string here\n *\n * loader.logo = 'data:image/png;base64,iVBORw...';\n * loader.logoWidth = 15;\n * loader.logoHeight = 14;\n *\n * // The background color can be changed like so by supplying a valid CSS color string\n *\n * loader.backgroundColor = 'red'\n * loader.backgroundColor = '#176BAA'\n *\n * // To build a completely new button\n * loader.startButtonFactory = () => {\n * let myButton = document.createElement('button');\n * myButton.textContent = 'The best button';\n * return myButton;\n * };\n *\n * engine.start(loader).then(() => {});\n * ```\n */\nclass Loader extends _DefaultLoader__WEBPACK_IMPORTED_MODULE_0__.DefaultLoader {\n get _image() {\n if (!this._imageElement) {\n this._imageElement = new Image();\n this._imageElement.onload = () => this._imageLoaded.resolve();\n this._imageElement.src = this.logo;\n }\n return this._imageElement;\n }\n get playButtonRootElement() {\n return this._playButtonRootElement;\n }\n get playButtonElement() {\n return this._playButtonElement;\n }\n get _playButton() {\n const existingRoot = document.getElementById('excalibur-play-root');\n if (existingRoot) {\n this._playButtonRootElement = existingRoot;\n }\n if (!this._playButtonRootElement) {\n this._playButtonRootElement = document.createElement('div');\n this._playButtonRootElement.id = 'excalibur-play-root';\n this._playButtonRootElement.style.position = 'absolute';\n document.body.appendChild(this._playButtonRootElement);\n }\n if (!this._styleBlock) {\n this._styleBlock = document.createElement('style');\n this._styleBlock.textContent = this._playButtonStyles;\n document.head.appendChild(this._styleBlock);\n }\n if (!this._playButtonElement) {\n this._playButtonElement = this.startButtonFactory();\n this._playButtonRootElement.appendChild(this._playButtonElement);\n }\n return this._playButtonElement;\n }\n constructor(loadablesOrOptions) {\n const options = Array.isArray(loadablesOrOptions)\n ? {\n loadables: loadablesOrOptions\n }\n : loadablesOrOptions;\n super(options);\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this._originalOptions = { loadables: [] };\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_2__.EventEmitter();\n this._playButtonShown = false;\n // logo drawing stuff\n // base64 string encoding of the excalibur logo (logo-white.png)\n this.logo = _Loader_logo_png__WEBPACK_IMPORTED_MODULE_3__[\"default\"];\n this.logoWidth = 468;\n this.logoHeight = 118;\n /**\n * Gets or sets the color of the loading bar, default is {@apilink Color.White}\n */\n this.loadingBarColor = _Color__WEBPACK_IMPORTED_MODULE_4__.Color.White;\n /**\n * Gets or sets the background color of the loader as a hex string\n */\n this.backgroundColor = '#176BAA';\n this._imageLoaded = new _Util_Future__WEBPACK_IMPORTED_MODULE_5__.Future();\n this.suppressPlayButton = false;\n /** Loads the css from Loader.css */\n this._playButtonStyles = _Loader_css__WEBPACK_IMPORTED_MODULE_6__[\"default\"].toString();\n /**\n * Get/set play button text\n */\n this.playButtonText = 'Play game';\n /**\n * Return a html button element for excalibur to use as a play button\n */\n this.startButtonFactory = () => {\n let buttonElement = document.getElementById('excalibur-play');\n if (!buttonElement) {\n buttonElement = document.createElement('button');\n }\n buttonElement.id = 'excalibur-play';\n buttonElement.textContent = this.playButtonText;\n buttonElement.style.display = 'none';\n return buttonElement;\n };\n this._originalOptions = { ...Loader._DEFAULT_LOADER_OPTIONS, ...options };\n }\n onInitialize(engine) {\n this.engine = engine;\n this.screen = engine.screen;\n this.canvas.width = this.engine.canvas.width;\n this.canvas.height = this.engine.canvas.height;\n this.screen.events.on('resize', () => {\n this.canvas.width = this.engine.canvas.width;\n this.canvas.height = this.engine.canvas.height;\n });\n }\n /**\n * Shows the play button and returns a promise that resolves when clicked\n */\n async showPlayButton() {\n var _a, _b;\n if (this.suppressPlayButton) {\n this.hidePlayButton();\n // Delay is to give the logo a chance to show, otherwise don't delay\n await (0,_Util_Util__WEBPACK_IMPORTED_MODULE_7__.delay)(500, (_a = this.engine) === null || _a === void 0 ? void 0 : _a.clock);\n }\n else {\n const resizeHandler = () => {\n try {\n this._positionPlayButton();\n }\n catch (_a) {\n // swallow if can't position\n }\n };\n if ((_b = this.engine) === null || _b === void 0 ? void 0 : _b.browser) {\n this.engine.browser.window.on('resize', resizeHandler);\n }\n this._playButtonShown = true;\n this._playButton.style.display = 'block';\n document.body.addEventListener('keyup', (evt) => {\n if (evt.key === 'Enter') {\n this._playButton.click();\n }\n });\n this._positionPlayButton();\n const playButtonClicked = new Promise((resolve) => {\n const startButtonHandler = (e) => {\n var _a;\n // We want to stop propagation to keep bubbling to the engine pointer handlers\n e.stopPropagation();\n // Hide Button after click\n this.hidePlayButton();\n if ((_a = this.engine) === null || _a === void 0 ? void 0 : _a.browser) {\n this.engine.browser.window.off('resize', resizeHandler);\n }\n if (this._originalOptions.fullscreenAfterLoad) {\n try {\n this._logger.info('requesting fullscreen');\n if (this._originalOptions.fullscreenContainer instanceof HTMLElement) {\n this._originalOptions.fullscreenContainer.requestFullscreen();\n }\n else {\n this.engine.screen.goFullScreen(this._originalOptions.fullscreenContainer);\n }\n }\n catch (error) {\n this._logger.error('could not go fullscreen', error);\n }\n }\n resolve();\n };\n this._playButton.addEventListener('click', startButtonHandler);\n this._playButton.addEventListener('touchend', startButtonHandler);\n this._playButton.addEventListener('pointerup', startButtonHandler);\n });\n return await playButtonClicked;\n }\n }\n hidePlayButton() {\n this._playButtonShown = false;\n this._playButton.style.display = 'none';\n }\n /**\n * Clean up generated elements for the loader\n */\n dispose() {\n if (this._playButtonRootElement.parentElement) {\n this._playButtonRootElement.removeChild(this._playButtonElement);\n document.body.removeChild(this._playButtonRootElement);\n document.head.removeChild(this._styleBlock);\n this._playButtonRootElement = null;\n this._playButtonElement = null;\n this._styleBlock = null;\n }\n }\n async onUserAction() {\n var _a;\n // short delay in showing the button for aesthetics\n await (0,_Util_Util__WEBPACK_IMPORTED_MODULE_7__.delay)(200, (_a = this.engine) === null || _a === void 0 ? void 0 : _a.clock);\n this.canvas.flagDirty();\n // show play button\n await this.showPlayButton();\n }\n async onBeforeLoad() {\n this.screen.pushResolutionAndViewport();\n this.screen.resolution = { width: this.canvas.width, height: this.canvas.height };\n this.screen.applyResolutionAndViewport();\n const image = this._image;\n await this._imageLoaded.promise;\n await (image === null || image === void 0 ? void 0 : image.decode()); // decode logo if it exists\n }\n // eslint-disable-next-line require-await\n async onAfterLoad() {\n this.screen.popResolutionAndViewport();\n this.screen.applyResolutionAndViewport();\n this.dispose();\n }\n _positionPlayButton() {\n if (this.engine) {\n const { x: left, y: top, width: screenWidth, height: screenHeight } = this.engine.canvas.getBoundingClientRect();\n if (this._playButtonRootElement) {\n const buttonWidth = this._playButton.clientWidth;\n const buttonHeight = this._playButton.clientHeight;\n if (this.playButtonPosition) {\n this._playButtonRootElement.style.left = `${this.playButtonPosition.x}px`;\n this._playButtonRootElement.style.top = `${this.playButtonPosition.y}px`;\n }\n else {\n this._playButtonRootElement.style.left = `${left + screenWidth / 2 - buttonWidth / 2}px`;\n this._playButtonRootElement.style.top = `${top + screenHeight / 2 - buttonHeight / 2 + 100}px`;\n }\n }\n }\n }\n /**\n * Loader draw function. Draws the default Excalibur loading screen.\n * Override `logo`, `logoWidth`, `logoHeight` and `backgroundColor` properties\n * to customize the drawing, or just override entire method.\n */\n onDraw(ctx) {\n const canvasHeight = this.engine.canvasHeight / this.engine.pixelRatio;\n const canvasWidth = this.engine.canvasWidth / this.engine.pixelRatio;\n this._positionPlayButton();\n ctx.fillStyle = this.backgroundColor;\n ctx.fillRect(0, 0, canvasWidth, canvasHeight);\n let logoY = canvasHeight / 2;\n const width = Math.min(this.logoWidth, canvasWidth * 0.75);\n let logoX = canvasWidth / 2 - width / 2;\n if (this.logoPosition) {\n logoX = this.logoPosition.x;\n logoY = this.logoPosition.y;\n }\n const imageHeight = Math.floor(width * (this.logoHeight / this.logoWidth)); // OG height/width factor\n const oldAntialias = this.engine.screen.antialiasing;\n this.engine.screen.antialiasing = true;\n if (!this.logoPosition) {\n ctx.drawImage(this._image, 0, 0, this.logoWidth, this.logoHeight, logoX, logoY - imageHeight - 20, width, imageHeight);\n }\n else {\n ctx.drawImage(this._image, 0, 0, this.logoWidth, this.logoHeight, logoX, logoY, width, imageHeight);\n }\n // loading box\n if (!this.suppressPlayButton && this._playButtonShown) {\n this.engine.screen.antialiasing = oldAntialias;\n return;\n }\n let loadingX = logoX;\n let loadingY = logoY;\n if (this.loadingBarPosition) {\n loadingX = this.loadingBarPosition.x;\n loadingY = this.loadingBarPosition.y;\n }\n ctx.lineWidth = 2;\n _Util_DrawUtil__WEBPACK_IMPORTED_MODULE_8__.roundRect(ctx, loadingX, loadingY, width, 20, 10, this.loadingBarColor);\n const progress = width * this.progress;\n const margin = 5;\n const progressWidth = progress - margin * 2;\n const height = 20 - margin * 2;\n _Util_DrawUtil__WEBPACK_IMPORTED_MODULE_8__.roundRect(ctx, loadingX + margin, loadingY + margin, progressWidth > 10 ? progressWidth : 10, height, 5, null, this.loadingBarColor);\n this.engine.screen.antialiasing = oldAntialias;\n }\n}\nLoader._DEFAULT_LOADER_OPTIONS = {\n loadables: [],\n fullscreenAfterLoad: false,\n fullscreenContainer: undefined\n};\n\n\n/***/ }),\n\n/***/ \"./Director/Slide.ts\":\n/*!***************************!*\\\n !*** ./Director/Slide.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Slide: () => (/* binding */ Slide)\n/* harmony export */ });\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Graphics */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Transition__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Transition */ \"./Director/Transition.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/EasingFunctions */ \"./Util/EasingFunctions.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Math/coord-plane */ \"./Math/coord-plane.ts\");\n\n\n\n\n\n/**\n * Slide`s between the previous scene and the destination scene\n *\n * Note: Slide` only works as an \"in\" transition\n */\nclass Slide extends _Transition__WEBPACK_IMPORTED_MODULE_0__.Transition {\n constructor(options) {\n var _a;\n super({ direction: 'in', ...options }); // default the correct direction\n this._easing = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_1__.EasingFunctions.Linear;\n this.name = `Slide#${this.id}`;\n this.slideDirection = options.slideDirection;\n this.transform.coordPlane = _Math_coord_plane__WEBPACK_IMPORTED_MODULE_2__.CoordPlane.World;\n this.graphics.forceOnScreen = true;\n this._easing = (_a = options.easingFunction) !== null && _a !== void 0 ? _a : this._easing;\n this._vectorEasing = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_1__.EasingFunctions.CreateVectorEasingFunction(this._easing);\n }\n async onPreviousSceneDeactivate(scene) {\n this._image = await scene.engine.screenshot(true);\n // Firefox is particularly slow\n // needed in case the image isn't ready yet\n await this._image.decode();\n this._screenCover = _Graphics__WEBPACK_IMPORTED_MODULE_3__.ImageSource.fromHtmlImageElement(this._image).toSprite();\n }\n onInitialize(engine) {\n this._engine = engine;\n switch (this.slideDirection) {\n case 'up': {\n this._directionOffset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(0, -engine.screen.resolution.height);\n break;\n }\n case 'down': {\n this._directionOffset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(0, engine.screen.resolution.height);\n break;\n }\n case 'left': {\n this._directionOffset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(-engine.screen.resolution.width, 0);\n break;\n }\n case 'right': {\n this._directionOffset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(engine.screen.resolution.width, 0);\n break;\n }\n }\n this._camera = this._engine.currentScene.camera;\n this._destinationCameraPosition = this._camera.pos.clone();\n // For sliding shift the camera and the transition slide by offset\n this._camera.pos = this._camera.pos.add(this._directionOffset);\n this.transform.pos = this.transform.pos.add(this._directionOffset);\n this._startCameraPosition = this._camera.pos.clone();\n this.graphics.use(this._screenCover);\n // This is because we preserve hidpi res on the screen shot which COULD be bigger than the logical resolution\n this.transform.scale = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(1 / engine.screen.pixelRatio, 1 / engine.screen.pixelRatio);\n }\n onUpdate(progress) {\n // in-transitions count down from 1 -> 0, so our \"end\" is swapped\n this._camera.pos = this._vectorEasing(progress, this._destinationCameraPosition, this._startCameraPosition, 1);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Director/Transition.ts\":\n/*!********************************!*\\\n !*** ./Director/Transition.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Transition: () => (/* binding */ Transition)\n/* harmony export */ });\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Util/Future */ \"./Util/Future.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Graphics */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Math/coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Util/EasingFunctions */ \"./Util/EasingFunctions.ts\");\n/* harmony import */ var _Util_Coroutine__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../Util/Coroutine */ \"./Util/Coroutine.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n\n\n\n\n\n\n\n\n\n/**\n * Base Transition that can be extended to provide custom scene transitions in Excalibur.\n */\nclass Transition extends _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_0__.Entity {\n /**\n * Returns a number between [0, 1] indicating what state the transition is in.\n *\n * * For 'out' direction transitions start at 0 and end at 1\n * * For 'in' direction transitions start at 1 and end at 0\n */\n get progress() {\n return this._currentProgress;\n }\n get complete() {\n if (this.direction === 'out') {\n return this.progress >= 1;\n }\n else {\n return this.progress <= 0;\n }\n }\n constructor(options) {\n var _a, _b, _c, _d;\n super();\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this.transform = new _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_2__.TransformComponent();\n this.graphics = new _Graphics__WEBPACK_IMPORTED_MODULE_3__.GraphicsComponent();\n this._completeFuture = new _Util_Future__WEBPACK_IMPORTED_MODULE_4__.Future();\n // State needs to be reset between uses\n this.started = false;\n this._currentDistance = 0;\n this._currentProgress = 0;\n this.done = this._completeFuture.promise;\n this.name = `Transition#${this.id}`;\n this.duration = options.duration;\n this.easing = (_a = options.easing) !== null && _a !== void 0 ? _a : _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_5__.EasingFunctions.Linear;\n this.direction = (_b = options.direction) !== null && _b !== void 0 ? _b : 'out';\n this.hideLoader = (_c = options.hideLoader) !== null && _c !== void 0 ? _c : false;\n this.blockInput = (_d = options.blockInput) !== null && _d !== void 0 ? _d : false;\n this.transform.coordPlane = _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__.CoordPlane.Screen;\n this.transform.pos = _Math_vector__WEBPACK_IMPORTED_MODULE_7__.Vector.Zero;\n this.transform.z = Infinity; // Transitions sit on top of everything\n this.graphics.anchor = _Math_vector__WEBPACK_IMPORTED_MODULE_7__.Vector.Zero;\n this.addComponent(this.transform);\n this.addComponent(this.graphics);\n if (this.direction === 'out') {\n this._currentProgress = 0;\n }\n else {\n this._currentProgress = 1;\n }\n }\n /**\n * Overridable lifecycle method, called before each update.\n *\n * **WARNING BE SURE** to call `super.updateTransition()` if overriding in your own custom implementation\n * @param engine\n * @param elapsed\n */\n updateTransition(engine, elapsed) {\n if (this.complete) {\n return;\n }\n this._currentDistance += (0,_Math_util__WEBPACK_IMPORTED_MODULE_8__.clamp)(elapsed / this.duration, 0, 1);\n if (this._currentDistance >= 1) {\n this._currentDistance = 1;\n }\n if (this.direction === 'out') {\n this._currentProgress = (0,_Math_util__WEBPACK_IMPORTED_MODULE_8__.clamp)(this.easing(this._currentDistance, 0, 1, 1), 0, 1);\n }\n else {\n this._currentProgress = (0,_Math_util__WEBPACK_IMPORTED_MODULE_8__.clamp)(this.easing(this._currentDistance, 1, 0, 1), 0, 1);\n }\n }\n /**\n * Overridable lifecycle method, called right before the previous scene has deactivated.\n *\n * This gives incoming transition a chance to grab info from previous scene if desired\n * @param scene\n */\n async onPreviousSceneDeactivate(scene) {\n // override me\n }\n /**\n * Overridable lifecycle method, called once at the beginning of the transition\n *\n * `progress` is given between 0 and 1\n * @param progress\n */\n onStart(progress) {\n // override me\n }\n /**\n * Overridable lifecycle method, called every frame of the transition\n *\n * `progress` is given between 0 and 1\n * @param progress\n */\n onUpdate(progress) {\n // override me\n }\n /**\n * Overridable lifecycle method, called at the end of the transition,\n *\n * `progress` is given between 0 and 1\n * @param progress\n */\n onEnd(progress) {\n // override me\n }\n /**\n * Overridable lifecycle method, called when the transition is reset\n *\n * Use this to override and provide your own reset logic for internal state in custom transition implementations\n */\n onReset() {\n // override me\n }\n /**\n * reset() is called by the engine to reset transitions\n */\n reset() {\n this.started = false;\n this._completeFuture = new _Util_Future__WEBPACK_IMPORTED_MODULE_4__.Future();\n this.done = this._completeFuture.promise;\n this._currentDistance = 0;\n if (this.direction === 'out') {\n this._currentProgress = 0;\n }\n else {\n this._currentProgress = 1;\n }\n this.onReset();\n }\n /**\n * @internal\n */\n _addToTargetScene(engine, targetScene) {\n const currentScene = targetScene;\n if (this.started) {\n this._logger.warn(`Attempted to add a transition ${this.name} that is already playing.`);\n }\n if (currentScene.world.entityManager.getById(this.id)) {\n return this._co;\n }\n this._engine = engine;\n currentScene.add(this);\n const self = this;\n this._co = (0,_Util_Coroutine__WEBPACK_IMPORTED_MODULE_9__.coroutine)(engine, function* () {\n while (!self.complete) {\n const elapsed = yield; // per frame\n self.updateTransition(self._engine, elapsed);\n self._execute();\n }\n }, {\n autostart: false\n });\n return this._co;\n }\n /**\n * Called internally by excalibur to swap scenes with transition\n * @internal\n */\n async _play() {\n if (this.started) {\n this.reset();\n this._logger.warn(`Attempted to play a transition ${this.name} that is already playing, reset transition.`);\n }\n if (!this._engine || !this._co) {\n this.reset();\n this._logger.warn(`Attempted to play a transition ${this.name} that hasn't been added`);\n }\n if (this._co) {\n await this._co.start();\n }\n }\n /**\n * execute() is called by the engine every frame to update the Transition lifecycle onStart/onUpdate/onEnd\n * @internal\n */\n _execute() {\n if (!this.isInitialized) {\n return;\n }\n if (!this.started) {\n this.started = true;\n this.onStart(this.progress);\n }\n this.onUpdate(this.progress);\n if (this.complete && !this._completeFuture.isCompleted) {\n this.onEnd(this.progress);\n this._completeFuture.resolve();\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Director/index.ts\":\n/*!***************************!*\\\n !*** ./Director/index.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CrossFade: () => (/* reexport safe */ _CrossFade__WEBPACK_IMPORTED_MODULE_2__.CrossFade),\n/* harmony export */ DefaultLoader: () => (/* reexport safe */ _DefaultLoader__WEBPACK_IMPORTED_MODULE_6__.DefaultLoader),\n/* harmony export */ Director: () => (/* reexport safe */ _Director__WEBPACK_IMPORTED_MODULE_4__.Director),\n/* harmony export */ DirectorEvents: () => (/* reexport safe */ _Director__WEBPACK_IMPORTED_MODULE_4__.DirectorEvents),\n/* harmony export */ FadeInOut: () => (/* reexport safe */ _FadeInOut__WEBPACK_IMPORTED_MODULE_1__.FadeInOut),\n/* harmony export */ Loader: () => (/* reexport safe */ _Loader__WEBPACK_IMPORTED_MODULE_5__.Loader),\n/* harmony export */ LoaderEvents: () => (/* reexport safe */ _DefaultLoader__WEBPACK_IMPORTED_MODULE_6__.LoaderEvents),\n/* harmony export */ Slide: () => (/* reexport safe */ _Slide__WEBPACK_IMPORTED_MODULE_3__.Slide),\n/* harmony export */ Transition: () => (/* reexport safe */ _Transition__WEBPACK_IMPORTED_MODULE_0__.Transition),\n/* harmony export */ isLoaderConstructor: () => (/* reexport safe */ _DefaultLoader__WEBPACK_IMPORTED_MODULE_6__.isLoaderConstructor)\n/* harmony export */ });\n/* harmony import */ var _Transition__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Transition */ \"./Director/Transition.ts\");\n/* harmony import */ var _FadeInOut__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./FadeInOut */ \"./Director/FadeInOut.ts\");\n/* harmony import */ var _CrossFade__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./CrossFade */ \"./Director/CrossFade.ts\");\n/* harmony import */ var _Slide__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Slide */ \"./Director/Slide.ts\");\n/* harmony import */ var _Director__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Director */ \"./Director/Director.ts\");\n/* harmony import */ var _Loader__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Loader */ \"./Director/Loader.ts\");\n/* harmony import */ var _DefaultLoader__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./DefaultLoader */ \"./Director/DefaultLoader.ts\");\n\n\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Engine.ts\":\n/*!*******************!*\\\n !*** ./Engine.ts ***!\n \\*******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Engine: () => (/* binding */ Engine),\n/* harmony export */ EngineEvents: () => (/* binding */ EngineEvents),\n/* harmony export */ ScrollPreventionMode: () => (/* binding */ ScrollPreventionMode)\n/* harmony export */ });\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ */ \"./index.ts\");\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Util/Future */ \"./Util/Future.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Input_PointerScope__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./Input/PointerScope */ \"./Input/PointerScope.ts\");\n/* harmony import */ var _Flags__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Flags */ \"./Flags.ts\");\n/* harmony import */ var _Polyfill__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Polyfill */ \"./Polyfill.ts\");\n/* harmony import */ var _Screen__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Screen */ \"./Screen.ts\");\n/* harmony import */ var _Director_DefaultLoader__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./Director/DefaultLoader */ \"./Director/DefaultLoader.ts\");\n/* harmony import */ var _Director_Loader__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./Director/Loader */ \"./Director/Loader.ts\");\n/* harmony import */ var _Util_Detector__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Util/Detector */ \"./Util/Detector.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./Events */ \"./Events.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./Color */ \"./Color.ts\");\n/* harmony import */ var _Scene__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./Scene */ \"./Scene.ts\");\n/* harmony import */ var _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./EntityComponentSystem/Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _Debug_DebugConfig__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./Debug/DebugConfig */ \"./Debug/DebugConfig.ts\");\n/* harmony import */ var _Util_Browser__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Util/Browser */ \"./Util/Browser.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Graphics */ \"./Graphics/Context/ExcaliburGraphicsContext.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Graphics */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Graphics */ \"./Graphics/Context/ExcaliburGraphicsContext2DCanvas.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Graphics */ \"./Graphics/Context/texture-loader.ts\");\n/* harmony import */ var _Util_Clock__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./Util/Clock */ \"./Util/Clock.ts\");\n/* harmony import */ var _Graphics_Filtering__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Graphics/Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Graphics_GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./Graphics/GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n/* harmony import */ var _Util_Toaster__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Util/Toaster */ \"./Util/Toaster.ts\");\n/* harmony import */ var _Director_Director__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./Director/Director */ \"./Director/Director.ts\");\n/* harmony import */ var _Input_InputHost__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./Input/InputHost */ \"./Input/InputHost.ts\");\n/* harmony import */ var _Collision_PhysicsConfig__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Collision/PhysicsConfig */ \"./Collision/PhysicsConfig.ts\");\n/* harmony import */ var _Context__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Context */ \"./Context.ts\");\n/* harmony import */ var _GarbageCollector__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./GarbageCollector */ \"./GarbageCollector.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./Util/Util */ \"./Util/Util.ts\");\n\n\n\n\n\n\n(0,_Polyfill__WEBPACK_IMPORTED_MODULE_0__.polyfill)();\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst EngineEvents = {\n FallbackGraphicsContext: 'fallbackgraphicscontext',\n Initialize: 'initialize',\n Visible: 'visible',\n Hidden: 'hidden',\n Start: 'start',\n Stop: 'stop',\n PreUpdate: 'preupdate',\n PostUpdate: 'postupdate',\n PreFrame: 'preframe',\n PostFrame: 'postframe',\n PreDraw: 'predraw',\n PostDraw: 'postdraw'\n};\n/**\n * Enum representing the different mousewheel event bubble prevention\n */\nvar ScrollPreventionMode;\n(function (ScrollPreventionMode) {\n /**\n * Do not prevent any page scrolling\n */\n ScrollPreventionMode[ScrollPreventionMode[\"None\"] = 0] = \"None\";\n /**\n * Prevent page scroll if mouse is over the game canvas\n */\n ScrollPreventionMode[ScrollPreventionMode[\"Canvas\"] = 1] = \"Canvas\";\n /**\n * Prevent all page scrolling via mouse wheel\n */\n ScrollPreventionMode[ScrollPreventionMode[\"All\"] = 2] = \"All\";\n})(ScrollPreventionMode || (ScrollPreventionMode = {}));\n/**\n * The Excalibur Engine\n *\n * The {@apilink Engine} is the main driver for a game. It is responsible for\n * starting/stopping the game, maintaining state, transmitting events,\n * loading resources, and managing the scene.\n */\nclass Engine {\n static useEngine() {\n const value = (0,_Context__WEBPACK_IMPORTED_MODULE_1__.useContext)(Engine.Context);\n if (!value) {\n throw new Error('Cannot inject engine with `useEngine()`, `useEngine()` was called outside of Engine lifecycle scope.');\n }\n return value;\n }\n /**\n * The width of the game canvas in pixels (physical width component of the\n * resolution of the canvas element)\n */\n get canvasWidth() {\n return this.screen.canvasWidth;\n }\n /**\n * Returns half width of the game canvas in pixels (half physical width component)\n */\n get halfCanvasWidth() {\n return this.screen.halfCanvasWidth;\n }\n /**\n * The height of the game canvas in pixels, (physical height component of\n * the resolution of the canvas element)\n */\n get canvasHeight() {\n return this.screen.canvasHeight;\n }\n /**\n * Returns half height of the game canvas in pixels (half physical height component)\n */\n get halfCanvasHeight() {\n return this.screen.halfCanvasHeight;\n }\n /**\n * Returns the width of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get drawWidth() {\n return this.screen.drawWidth;\n }\n /**\n * Returns half the width of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get halfDrawWidth() {\n return this.screen.halfDrawWidth;\n }\n /**\n * Returns the height of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get drawHeight() {\n return this.screen.drawHeight;\n }\n /**\n * Returns half the height of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get halfDrawHeight() {\n return this.screen.halfDrawHeight;\n }\n /**\n * Returns whether excalibur detects the current screen to be HiDPI\n */\n get isHiDpi() {\n return this.screen.isHiDpi;\n }\n /**\n * Access {@apilink stats} that holds frame statistics.\n */\n get stats() {\n return this.debug.stats;\n }\n /**\n * The current {@apilink Scene} being drawn and updated on screen\n */\n get currentScene() {\n return this.director.currentScene;\n }\n /**\n * The current {@apilink Scene} being drawn and updated on screen\n */\n get currentSceneName() {\n return this.director.currentSceneName;\n }\n /**\n * The default {@apilink Scene} of the game, use {@apilink Engine.goToScene} to transition to different scenes.\n */\n get rootScene() {\n return this.director.rootScene;\n }\n /**\n * Contains all the scenes currently registered with Excalibur\n */\n get scenes() {\n return this.director.scenes;\n }\n /**\n * Indicates whether the engine is set to fullscreen or not\n */\n get isFullscreen() {\n return this.screen.isFullScreen;\n }\n /**\n * Indicates the current {@apilink DisplayMode} of the engine.\n */\n get displayMode() {\n return this.screen.displayMode;\n }\n /**\n * Returns the calculated pixel ration for use in rendering\n */\n get pixelRatio() {\n return this.screen.pixelRatio;\n }\n get isDebug() {\n return this._isDebug;\n }\n /**\n * Hints the graphics context to truncate fractional world space coordinates\n */\n get snapToPixel() {\n return this.graphicsContext.snapToPixel;\n }\n set snapToPixel(shouldSnapToPixel) {\n this.graphicsContext.snapToPixel = shouldSnapToPixel;\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n /**\n * Creates a new game using the given {@apilink EngineOptions}. By default, if no options are provided,\n * the game will be rendered full screen (taking up all available browser window space).\n * You can customize the game rendering through {@apilink EngineOptions}.\n *\n * Example:\n *\n * ```js\n * var game = new ex.Engine({\n * width: 0, // the width of the canvas\n * height: 0, // the height of the canvas\n * enableCanvasTransparency: true, // the transparencySection of the canvas\n * canvasElementId: '', // the DOM canvas element ID, if you are providing your own\n * displayMode: ex.DisplayMode.FullScreen, // the display mode\n * pointerScope: ex.PointerScope.Document, // the scope of capturing pointer (mouse/touch) events\n * backgroundColor: ex.Color.fromHex('#2185d0') // background color of the engine\n * });\n *\n * // call game.start, which is a Promise\n * game.start().then(function () {\n * // ready, set, go!\n * });\n * ```\n */\n constructor(options) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j;\n /**\n * Anything run under scope can use `useEngine()` to inject the current engine\n * @param cb\n */\n this.scope = (cb) => Engine.Context.scope(this, cb);\n /**\n * Current Excalibur version string\n *\n * Useful for plugins or other tools that need to know what features are available\n */\n this.version = ___WEBPACK_IMPORTED_MODULE_2__.EX_VERSION;\n /**\n * Listen to and emit events on the Engine\n */\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_3__.EventEmitter();\n /**\n * Optionally set the maximum fps if not set Excalibur will go as fast as the device allows.\n *\n * You may want to constrain max fps if your game cannot maintain fps consistently, it can look and feel better to have a 30fps game than\n * one that bounces between 30fps and 60fps\n */\n this.maxFps = Number.POSITIVE_INFINITY;\n this._inputEnabled = true;\n this._suppressPlayButton = false;\n /**\n * Indicates whether audio should be paused when the game is no longer visible.\n */\n this.pauseAudioWhenHidden = true;\n /**\n * Indicates whether the engine should draw with debug information\n */\n this._isDebug = false;\n /**\n * Sets the Transparency for the engine.\n */\n this.enableCanvasTransparency = true;\n /**\n * The action to take when a fatal exception is thrown\n */\n this.onFatalException = (e) => {\n _Util_Log__WEBPACK_IMPORTED_MODULE_4__.Logger.getInstance().fatal(e, e.stack);\n };\n this._toaster = new _Util_Toaster__WEBPACK_IMPORTED_MODULE_5__.Toaster();\n this._timescale = 1.0;\n this._isInitialized = false;\n this._originalOptions = {};\n this._handleWebGLContextLost = (e) => {\n var _a;\n e.preventDefault();\n this.clock.stop();\n this._logger.fatalOnce('WebGL Graphics Lost', e);\n const container = document.createElement('div');\n container.id = 'ex-webgl-graphics-context-lost';\n container.style.position = 'absolute';\n container.style.zIndex = '99';\n container.style.left = '50%';\n container.style.top = '50%';\n container.style.display = 'flex';\n container.style.flexDirection = 'column';\n container.style.transform = 'translate(-50%, -50%)';\n container.style.backgroundColor = 'white';\n container.style.padding = '10px';\n container.style.borderStyle = 'solid 1px';\n const div = document.createElement('div');\n div.innerHTML = `\r\n

There was an issue rendering, please refresh the page.

\r\n
\r\n

WebGL Graphics Context Lost

\r\n\r\n \r\n\r\n

There are a few reasons this might happen:

\r\n
    \r\n
  • Two or more pages are placing a high demand on the GPU
  • \r\n
  • Another page or operation has stalled the GPU and the browser has decided to reset the GPU
  • \r\n
  • The computer has multiple GPUs and the user has switched between them
  • \r\n
  • Graphics driver has crashed or restarted
  • \r\n
  • Graphics driver was updated
  • \r\n
\r\n
\r\n `;\n container.appendChild(div);\n if ((_a = this.canvas) === null || _a === void 0 ? void 0 : _a.parentElement) {\n this.canvas.parentElement.appendChild(container);\n const button = div.querySelector('#ex-webgl-graphics-reload');\n button === null || button === void 0 ? void 0 : button.addEventListener('click', () => location.reload());\n }\n };\n this._performanceThresholdTriggered = false;\n this._fpsSamples = [];\n this._disposed = false;\n this._isLoading = false;\n this._hideLoader = false;\n this._isReadyFuture = new _Util_Future__WEBPACK_IMPORTED_MODULE_6__.Future();\n /**\n * Returns the current frames elapsed milliseconds\n */\n this.currentFrameElapsedMs = 0;\n /**\n * Returns the current frame lag when in fixed update mode\n */\n this.currentFrameLagMs = 0;\n this._lagMs = 0;\n this._screenShotRequests = [];\n options = { ...Engine._DEFAULT_ENGINE_OPTIONS, ...options };\n this._originalOptions = options;\n _Flags__WEBPACK_IMPORTED_MODULE_7__.Flags.freeze();\n // Initialize browser events facade\n this.browser = new _Util_Browser__WEBPACK_IMPORTED_MODULE_8__.BrowserEvents(window, document);\n // Check compatibility\n const detector = new _Util_Detector__WEBPACK_IMPORTED_MODULE_9__.Detector();\n if (!options.suppressMinimumBrowserFeatureDetection && !(this._compatible = detector.test())) {\n const message = document.createElement('div');\n message.innerText = 'Sorry, your browser does not support all the features needed for Excalibur';\n document.body.appendChild(message);\n detector.failedTests.forEach(function (test) {\n const testMessage = document.createElement('div');\n testMessage.innerText = 'Browser feature missing ' + test;\n document.body.appendChild(testMessage);\n });\n if (options.canvasElementId) {\n const canvas = document.getElementById(options.canvasElementId);\n if (canvas) {\n canvas.parentElement.removeChild(canvas);\n }\n }\n return;\n }\n else {\n this._compatible = true;\n }\n // Use native console API for color fun\n // eslint-disable-next-line no-console\n if (console.log && !options.suppressConsoleBootMessage) {\n // eslint-disable-next-line no-console\n console.log(`%cPowered by Excalibur.js (v${___WEBPACK_IMPORTED_MODULE_2__.EX_VERSION})`, 'background: #176BAA; color: white; border-radius: 5px; padding: 15px; font-size: 1.5em; line-height: 80px;');\n // eslint-disable-next-line no-console\n console.log('\\n\\\r\n /| ________________\\n\\\r\nO|===|* >________________>\\n\\\r\n \\\\|');\n // eslint-disable-next-line no-console\n console.log('Visit', 'http://excaliburjs.com', 'for more information');\n }\n // Suppress play button\n if (options.suppressPlayButton) {\n this._suppressPlayButton = true;\n }\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_4__.Logger.getInstance();\n // If debug is enabled, let's log browser features to the console.\n if (this._logger.defaultLevel === _Util_Log__WEBPACK_IMPORTED_MODULE_4__.LogLevel.Debug) {\n detector.logBrowserFeatures();\n }\n this._logger.debug('Building engine...');\n if (options.garbageCollection === true) {\n this.garbageCollectorConfig = {\n ..._GarbageCollector__WEBPACK_IMPORTED_MODULE_10__.DefaultGarbageCollectionOptions\n };\n }\n else if (options.garbageCollection === false) {\n this._logger.warn('WebGL Garbage Collection Disabled!!! If you leak any images over time your game will crash when GPU memory is exhausted');\n this.garbageCollectorConfig = null;\n }\n else {\n this.garbageCollectorConfig = {\n ..._GarbageCollector__WEBPACK_IMPORTED_MODULE_10__.DefaultGarbageCollectionOptions,\n ...options.garbageCollection\n };\n }\n this._garbageCollector = new _GarbageCollector__WEBPACK_IMPORTED_MODULE_10__.GarbageCollector({ getTimestamp: Date.now });\n this.canvasElementId = options.canvasElementId;\n if (options.canvasElementId) {\n this._logger.debug('Using Canvas element specified: ' + options.canvasElementId);\n //test for existence of element\n if (document.getElementById(options.canvasElementId) === null) {\n throw new Error('Cannot find existing element in the DOM, please ensure element is created prior to engine creation.');\n }\n this.canvas = document.getElementById(options.canvasElementId);\n }\n else if (options.canvasElement) {\n this._logger.debug('Using Canvas element specified:', options.canvasElement);\n this.canvas = options.canvasElement;\n }\n else {\n this._logger.debug('Using generated canvas element');\n this.canvas = document.createElement('canvas');\n }\n if (this.canvas && !options.enableCanvasContextMenu) {\n this.canvas.addEventListener('contextmenu', (evt) => {\n evt.preventDefault();\n });\n }\n let displayMode = (_a = options.displayMode) !== null && _a !== void 0 ? _a : _Screen__WEBPACK_IMPORTED_MODULE_11__.DisplayMode.Fixed;\n if ((options.width && options.height) || options.viewport) {\n if (options.displayMode === undefined) {\n displayMode = _Screen__WEBPACK_IMPORTED_MODULE_11__.DisplayMode.Fixed;\n }\n this._logger.debug('Engine viewport is size ' + options.width + ' x ' + options.height);\n }\n else if (!options.displayMode) {\n this._logger.debug('Engine viewport is fit');\n displayMode = _Screen__WEBPACK_IMPORTED_MODULE_11__.DisplayMode.FitScreen;\n }\n this.grabWindowFocus = options.grabWindowFocus;\n this.pointerScope = options.pointerScope;\n this._originalDisplayMode = displayMode;\n let pixelArtSampler;\n let uvPadding;\n let nativeContextAntialiasing;\n let canvasImageRendering;\n let filtering;\n let multiSampleAntialiasing;\n if (typeof options.antialiasing === 'object') {\n ({ pixelArtSampler, nativeContextAntialiasing, multiSampleAntialiasing, filtering, canvasImageRendering } = {\n ...(options.pixelArt ? _Graphics__WEBPACK_IMPORTED_MODULE_12__.DefaultPixelArtOptions : _Graphics__WEBPACK_IMPORTED_MODULE_12__.DefaultAntialiasOptions),\n ...options.antialiasing\n });\n }\n else {\n pixelArtSampler = !!options.pixelArt;\n nativeContextAntialiasing = false;\n multiSampleAntialiasing = options.antialiasing;\n canvasImageRendering = options.antialiasing ? 'auto' : 'pixelated';\n filtering = options.antialiasing ? _Graphics_Filtering__WEBPACK_IMPORTED_MODULE_13__.ImageFiltering.Blended : _Graphics_Filtering__WEBPACK_IMPORTED_MODULE_13__.ImageFiltering.Pixel;\n }\n if (nativeContextAntialiasing && multiSampleAntialiasing) {\n this._logger.warnOnce(`Cannot use antialias setting nativeContextAntialiasing and multiSampleAntialiasing` +\n ` at the same time, they are incompatible settings. If you aren\\'t sure use multiSampleAntialiasing`);\n }\n if (options.pixelArt) {\n uvPadding = 0.25;\n }\n if (!options.antialiasing || filtering === _Graphics_Filtering__WEBPACK_IMPORTED_MODULE_13__.ImageFiltering.Pixel) {\n uvPadding = 0;\n }\n // Override with any user option, if non default to .25 for pixel art, 0.01 for everything else\n uvPadding = (_c = (_b = options.uvPadding) !== null && _b !== void 0 ? _b : uvPadding) !== null && _c !== void 0 ? _c : 0.01;\n // Canvas 2D fallback can be flagged on\n let useCanvasGraphicsContext = _Flags__WEBPACK_IMPORTED_MODULE_7__.Flags.isEnabled('use-canvas-context');\n if (!useCanvasGraphicsContext) {\n // Attempt webgl first\n try {\n this.graphicsContext = new _Graphics__WEBPACK_IMPORTED_MODULE_14__.ExcaliburGraphicsContextWebGL({\n canvasElement: this.canvas,\n enableTransparency: this.enableCanvasTransparency,\n pixelArtSampler: pixelArtSampler,\n antialiasing: nativeContextAntialiasing,\n multiSampleAntialiasing: multiSampleAntialiasing,\n uvPadding: uvPadding,\n powerPreference: options.powerPreference,\n backgroundColor: options.backgroundColor,\n snapToPixel: options.snapToPixel,\n useDrawSorting: options.useDrawSorting,\n garbageCollector: this.garbageCollectorConfig\n ? {\n garbageCollector: this._garbageCollector,\n collectionInterval: this.garbageCollectorConfig.textureCollectInterval\n }\n : null,\n handleContextLost: (_d = options.handleContextLost) !== null && _d !== void 0 ? _d : this._handleWebGLContextLost,\n handleContextRestored: options.handleContextRestored\n });\n }\n catch (e) {\n this._logger.warn(`Excalibur could not load webgl for some reason (${e.message}) and loaded a Canvas 2D fallback. ` +\n `Some features of Excalibur will not work in this mode. \\n\\n` +\n 'Read more about this issue at https://excaliburjs.com/docs/performance');\n // fallback to canvas in case of failure\n useCanvasGraphicsContext = true;\n }\n }\n if (useCanvasGraphicsContext) {\n this.graphicsContext = new _Graphics__WEBPACK_IMPORTED_MODULE_15__.ExcaliburGraphicsContext2DCanvas({\n canvasElement: this.canvas,\n enableTransparency: this.enableCanvasTransparency,\n antialiasing: nativeContextAntialiasing,\n backgroundColor: options.backgroundColor,\n snapToPixel: options.snapToPixel,\n useDrawSorting: options.useDrawSorting\n });\n }\n this.screen = new _Screen__WEBPACK_IMPORTED_MODULE_11__.Screen({\n canvas: this.canvas,\n context: this.graphicsContext,\n antialiasing: nativeContextAntialiasing,\n canvasImageRendering: canvasImageRendering,\n browser: this.browser,\n viewport: (_e = options.viewport) !== null && _e !== void 0 ? _e : (options.width && options.height ? { width: options.width, height: options.height } : _Screen__WEBPACK_IMPORTED_MODULE_11__.Resolution.SVGA),\n resolution: options.resolution,\n displayMode,\n pixelRatio: options.suppressHiDPIScaling ? 1 : (_f = options.pixelRatio) !== null && _f !== void 0 ? _f : null\n });\n // TODO REMOVE STATIC!!!\n // Set default filtering based on antialiasing\n _Graphics__WEBPACK_IMPORTED_MODULE_16__.TextureLoader.filtering = filtering;\n if (options.backgroundColor) {\n this.backgroundColor = options.backgroundColor.clone();\n }\n this.maxFps = (_g = options.maxFps) !== null && _g !== void 0 ? _g : this.maxFps;\n this.fixedUpdateTimestep = (_h = options.fixedUpdateTimestep) !== null && _h !== void 0 ? _h : this.fixedUpdateTimestep;\n this.fixedUpdateFps = (_j = options.fixedUpdateFps) !== null && _j !== void 0 ? _j : this.fixedUpdateFps;\n this.fixedUpdateTimestep = this.fixedUpdateTimestep || 1000 / this.fixedUpdateFps;\n this.clock = new _Util_Clock__WEBPACK_IMPORTED_MODULE_17__.StandardClock({\n maxFps: this.maxFps,\n tick: this._mainloop.bind(this),\n onFatalException: (e) => this.onFatalException(e)\n });\n this.enableCanvasTransparency = options.enableCanvasTransparency;\n if (typeof options.physics === 'boolean') {\n this.physics = {\n ...(0,_Collision_PhysicsConfig__WEBPACK_IMPORTED_MODULE_18__.getDefaultPhysicsConfig)(),\n enabled: options.physics\n };\n }\n else {\n this.physics = {\n ...(0,_Collision_PhysicsConfig__WEBPACK_IMPORTED_MODULE_18__.getDefaultPhysicsConfig)()\n };\n (0,_Util_Util__WEBPACK_IMPORTED_MODULE_19__.mergeDeep)(this.physics, options.physics);\n }\n this.debug = new _Debug_DebugConfig__WEBPACK_IMPORTED_MODULE_20__.DebugConfig(this);\n this.director = new _Director_Director__WEBPACK_IMPORTED_MODULE_21__.Director(this, options.scenes);\n this._initialize(options);\n window.___EXCALIBUR_DEVTOOL = this;\n Engine.InstanceCount++;\n }\n _monitorPerformanceThresholdAndTriggerFallback() {\n const { allow } = this._originalOptions.configurePerformanceCanvas2DFallback;\n let { threshold, showPlayerMessage } = this._originalOptions.configurePerformanceCanvas2DFallback;\n if (threshold === undefined) {\n threshold = Engine._DEFAULT_ENGINE_OPTIONS.configurePerformanceCanvas2DFallback.threshold;\n }\n if (showPlayerMessage === undefined) {\n showPlayerMessage = Engine._DEFAULT_ENGINE_OPTIONS.configurePerformanceCanvas2DFallback.showPlayerMessage;\n }\n if (!_Flags__WEBPACK_IMPORTED_MODULE_7__.Flags.isEnabled('use-canvas-context') && allow && this.ready && !this._performanceThresholdTriggered) {\n // Calculate Average fps for last X number of frames after start\n if (this._fpsSamples.length === threshold.numberOfFrames) {\n this._fpsSamples.splice(0, 1);\n }\n this._fpsSamples.push(this.clock.fpsSampler.fps);\n let total = 0;\n for (let i = 0; i < this._fpsSamples.length; i++) {\n total += this._fpsSamples[i];\n }\n const average = total / this._fpsSamples.length;\n if (this._fpsSamples.length === threshold.numberOfFrames) {\n if (average <= threshold.fps) {\n this._performanceThresholdTriggered = true;\n this._logger.warn(`Switching to browser 2D Canvas fallback due to performance. Some features of Excalibur will not work in this mode.\\n` +\n \"this might mean your browser doesn't have webgl enabled or hardware acceleration is unavailable.\\n\\n\" +\n 'If in Chrome:\\n' +\n ' * Visit Settings > Advanced > System, and ensure \"Use Hardware Acceleration\" is checked.\\n' +\n ' * Visit chrome://flags/#ignore-gpu-blocklist and ensure \"Override software rendering list\" is \"enabled\"\\n' +\n 'If in Firefox, visit about:config\\n' +\n ' * Ensure webgl.disabled = false\\n' +\n ' * Ensure webgl.force-enabled = true\\n' +\n ' * Ensure layers.acceleration.force-enabled = true\\n\\n' +\n 'Read more about this issue at https://excaliburjs.com/docs/performance');\n if (showPlayerMessage) {\n this._toaster.toast('Excalibur is encountering performance issues. ' +\n \"It's possible that your browser doesn't have hardware acceleration enabled. \" +\n 'Visit [LINK] for more information and potential solutions.', 'https://excaliburjs.com/docs/performance');\n }\n this.useCanvas2DFallback();\n this.emit('fallbackgraphicscontext', this.graphicsContext);\n }\n }\n }\n }\n /**\n * Switches the engine's graphics context to the 2D Canvas.\n * @warning Some features of Excalibur will not work in this mode.\n */\n useCanvas2DFallback() {\n var _a, _b, _c;\n // Swap out the canvas\n const newCanvas = this.canvas.cloneNode(false);\n this.canvas.parentNode.replaceChild(newCanvas, this.canvas);\n this.canvas = newCanvas;\n const options = { ...this._originalOptions, antialiasing: this.screen.antialiasing };\n const displayMode = this._originalDisplayMode;\n // New graphics context\n this.graphicsContext = new _Graphics__WEBPACK_IMPORTED_MODULE_15__.ExcaliburGraphicsContext2DCanvas({\n canvasElement: this.canvas,\n enableTransparency: this.enableCanvasTransparency,\n antialiasing: options.antialiasing,\n backgroundColor: options.backgroundColor,\n snapToPixel: options.snapToPixel,\n useDrawSorting: options.useDrawSorting\n });\n // Reset screen\n if (this.screen) {\n this.screen.dispose();\n }\n this.screen = new _Screen__WEBPACK_IMPORTED_MODULE_11__.Screen({\n canvas: this.canvas,\n context: this.graphicsContext,\n antialiasing: (_a = options.antialiasing) !== null && _a !== void 0 ? _a : true,\n browser: this.browser,\n viewport: (_b = options.viewport) !== null && _b !== void 0 ? _b : (options.width && options.height ? { width: options.width, height: options.height } : _Screen__WEBPACK_IMPORTED_MODULE_11__.Resolution.SVGA),\n resolution: options.resolution,\n displayMode,\n pixelRatio: options.suppressHiDPIScaling ? 1 : (_c = options.pixelRatio) !== null && _c !== void 0 ? _c : null\n });\n this.screen.setCurrentCamera(this.currentScene.camera);\n // Reset pointers\n this.input.pointers.detach();\n const pointerTarget = options && options.pointerScope === _Input_PointerScope__WEBPACK_IMPORTED_MODULE_22__.PointerScope.Document ? document : this.canvas;\n this.input.pointers = this.input.pointers.recreate(pointerTarget, this);\n this.input.pointers.init();\n }\n /**\n * Attempts to completely clean up excalibur resources, including removing the canvas from the dom.\n *\n * To start again you will need to new up an Engine.\n */\n dispose() {\n if (!this._disposed) {\n this._disposed = true;\n this.stop();\n this._garbageCollector.forceCollectAll();\n this.input.toggleEnabled(false);\n this.canvas.parentNode.removeChild(this.canvas);\n this.canvas = null;\n this.screen.dispose();\n this.graphicsContext.dispose();\n this.graphicsContext = null;\n Engine.InstanceCount--;\n }\n }\n isDisposed() {\n return this._disposed;\n }\n /**\n * Returns a BoundingBox of the top left corner of the screen\n * and the bottom right corner of the screen.\n */\n getWorldBounds() {\n return this.screen.getWorldBounds();\n }\n /**\n * Gets the current engine timescale factor (default is 1.0 which is 1:1 time)\n */\n get timescale() {\n return this._timescale;\n }\n /**\n * Sets the current engine timescale factor. Useful for creating slow-motion effects or fast-forward effects\n * when using time-based movement.\n */\n set timescale(value) {\n if (value < 0) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_4__.Logger.getInstance().warnOnce('engine.timescale to a value less than 0 are ignored');\n return;\n }\n this._timescale = value;\n }\n /**\n * Adds a {@apilink Timer} to the {@apilink currentScene}.\n * @param timer The timer to add to the {@apilink currentScene}.\n */\n addTimer(timer) {\n return this.currentScene.addTimer(timer);\n }\n /**\n * Removes a {@apilink Timer} from the {@apilink currentScene}.\n * @param timer The timer to remove to the {@apilink currentScene}.\n */\n removeTimer(timer) {\n return this.currentScene.removeTimer(timer);\n }\n /**\n * Adds a {@apilink Scene} to the engine, think of scenes in Excalibur as you\n * would levels or menus.\n * @param key The name of the scene, must be unique\n * @param scene The scene to add to the engine\n */\n addScene(key, scene) {\n this.director.add(key, scene);\n return this;\n }\n /**\n * @internal\n */\n removeScene(entity) {\n this.director.remove(entity);\n }\n add(entity) {\n if (arguments.length === 2) {\n this.director.add(arguments[0], arguments[1]);\n return;\n }\n const maybeDeferred = this.director.getDeferredScene();\n if (maybeDeferred instanceof _Scene__WEBPACK_IMPORTED_MODULE_23__.Scene) {\n maybeDeferred.add(entity);\n }\n else {\n this.currentScene.add(entity);\n }\n }\n remove(entity) {\n if (entity instanceof _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_24__.Entity) {\n this.currentScene.remove(entity);\n }\n if (entity instanceof _Scene__WEBPACK_IMPORTED_MODULE_23__.Scene || (0,_Scene__WEBPACK_IMPORTED_MODULE_23__.isSceneConstructor)(entity)) {\n this.removeScene(entity);\n }\n if (typeof entity === 'string') {\n this.removeScene(entity);\n }\n }\n /**\n * Changes the current scene with optionally supplied:\n * * Activation data\n * * Transitions\n * * Loaders\n *\n * Example:\n * ```typescript\n * game.goToScene('myScene', {\n * sceneActivationData: {any: 'thing at all'},\n * destinationIn: new FadeInOut({duration: 1000, direction: 'in'}),\n * sourceOut: new FadeInOut({duration: 1000, direction: 'out'}),\n * loader: MyLoader\n * });\n * ```\n *\n * Scenes are defined in the Engine constructor\n * ```typescript\n * const engine = new ex.Engine({\n scenes: {...}\n });\n * ```\n * Or by adding dynamically\n *\n * ```typescript\n * engine.addScene('myScene', new ex.Scene());\n * ```\n * @param destinationScene\n * @param options\n */\n async goToScene(destinationScene, options) {\n await this.scope(async () => {\n await this.director.goToScene(destinationScene, options);\n });\n }\n /**\n * Transforms the current x, y from screen coordinates to world coordinates\n * @param point Screen coordinate to convert\n */\n screenToWorldCoordinates(point) {\n return this.screen.screenToWorldCoordinates(point);\n }\n /**\n * Transforms a world coordinate, to a screen coordinate\n * @param point World coordinate to convert\n */\n worldToScreenCoordinates(point) {\n return this.screen.worldToScreenCoordinates(point);\n }\n /**\n * Initializes the internal canvas, rendering context, display mode, and native event listeners\n */\n _initialize(options) {\n var _a, _b;\n this.pageScrollPreventionMode = options.scrollPreventionMode;\n // initialize inputs\n const pointerTarget = options && options.pointerScope === _Input_PointerScope__WEBPACK_IMPORTED_MODULE_22__.PointerScope.Document ? document : this.canvas;\n const grabWindowFocus = (_b = (_a = this._originalOptions) === null || _a === void 0 ? void 0 : _a.grabWindowFocus) !== null && _b !== void 0 ? _b : true;\n this.input = new _Input_InputHost__WEBPACK_IMPORTED_MODULE_25__.InputHost({\n pointerTarget,\n grabWindowFocus,\n engine: this\n });\n this.inputMapper = this.input.inputMapper;\n // Issue #385 make use of the visibility api\n // https://developer.mozilla.org/en-US/docs/Web/Guide/User_experience/Using_the_Page_Visibility_API\n this.browser.document.on('visibilitychange', () => {\n if (document.visibilityState === 'hidden') {\n this.events.emit('hidden', new _Events__WEBPACK_IMPORTED_MODULE_26__.HiddenEvent(this));\n this._logger.debug('Window hidden');\n }\n else if (document.visibilityState === 'visible') {\n this.events.emit('visible', new _Events__WEBPACK_IMPORTED_MODULE_26__.VisibleEvent(this));\n this._logger.debug('Window visible');\n }\n });\n if (!this.canvasElementId && !options.canvasElement) {\n document.body.appendChild(this.canvas);\n }\n }\n toggleInputEnabled(enabled) {\n this._inputEnabled = enabled;\n this.input.toggleEnabled(this._inputEnabled);\n }\n onInitialize(engine) {\n // Override me\n }\n /**\n * Gets whether the actor is Initialized\n */\n get isInitialized() {\n return this._isInitialized;\n }\n async _overrideInitialize(engine) {\n if (!this.isInitialized) {\n await this.director.onInitialize();\n await this.onInitialize(engine);\n this.events.emit('initialize', new _Events__WEBPACK_IMPORTED_MODULE_26__.InitializeEvent(engine, this));\n this._isInitialized = true;\n }\n }\n /**\n * Updates the entire state of the game\n * @param elapsed Number of milliseconds elapsed since the last update.\n */\n _update(elapsed) {\n var _a;\n if (this._isLoading) {\n // suspend updates until loading is finished\n (_a = this._loader) === null || _a === void 0 ? void 0 : _a.onUpdate(this, elapsed);\n // Update input listeners\n this.input.update();\n return;\n }\n // Publish preupdate events\n this.clock.__runScheduledCbs('preupdate');\n this._preupdate(elapsed);\n // process engine level events\n this.currentScene.update(this, elapsed);\n // Update graphics postprocessors\n this.graphicsContext.updatePostProcessors(elapsed);\n // Publish update event\n this.clock.__runScheduledCbs('postupdate');\n this._postupdate(elapsed);\n // Update input listeners\n this.input.update();\n }\n /**\n * @internal\n */\n _preupdate(elapsed) {\n this.emit('preupdate', new _Events__WEBPACK_IMPORTED_MODULE_26__.PreUpdateEvent(this, elapsed, this));\n this.onPreUpdate(this, elapsed);\n }\n /**\n * Safe to override method\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n */\n onPreUpdate(engine, elapsed) {\n // Override me\n }\n /**\n * @internal\n */\n _postupdate(elapsed) {\n this.emit('postupdate', new _Events__WEBPACK_IMPORTED_MODULE_26__.PostUpdateEvent(this, elapsed, this));\n this.onPostUpdate(this, elapsed);\n }\n /**\n * Safe to override method\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n */\n onPostUpdate(engine, elapsed) {\n // Override me\n }\n /**\n * Draws the entire game\n * @param elapsed Number of milliseconds elapsed since the last draw.\n */\n _draw(elapsed) {\n var _a, _b;\n // Use scene background color if present, fallback to engine\n this.graphicsContext.backgroundColor = (_a = this.currentScene.backgroundColor) !== null && _a !== void 0 ? _a : this.backgroundColor;\n this.graphicsContext.beginDrawLifecycle();\n this.graphicsContext.clear();\n this.clock.__runScheduledCbs('predraw');\n this._predraw(this.graphicsContext, elapsed);\n // Drawing nothing else while loading\n if (this._isLoading) {\n if (!this._hideLoader) {\n (_b = this._loader) === null || _b === void 0 ? void 0 : _b.canvas.draw(this.graphicsContext, 0, 0);\n this.clock.__runScheduledCbs('postdraw');\n this.graphicsContext.flush();\n this.graphicsContext.endDrawLifecycle();\n }\n return;\n }\n this.currentScene.draw(this.graphicsContext, elapsed);\n this.clock.__runScheduledCbs('postdraw');\n this._postdraw(this.graphicsContext, elapsed);\n // Flush any pending drawings\n this.graphicsContext.flush();\n this.graphicsContext.endDrawLifecycle();\n this._checkForScreenShots();\n }\n /**\n * @internal\n */\n _predraw(ctx, elapsed) {\n this.emit('predraw', new _Events__WEBPACK_IMPORTED_MODULE_26__.PreDrawEvent(ctx, elapsed, this));\n this.onPreDraw(ctx, elapsed);\n }\n /**\n * Safe to override method to hook into pre draw\n * @param ctx {@link ExcaliburGraphicsContext} for drawing\n * @param elapsed Number of milliseconds elapsed since the last draw.\n */\n onPreDraw(ctx, elapsed) {\n // Override me\n }\n /**\n * @internal\n */\n _postdraw(ctx, elapsed) {\n this.emit('postdraw', new _Events__WEBPACK_IMPORTED_MODULE_26__.PostDrawEvent(ctx, elapsed, this));\n this.onPostDraw(ctx, elapsed);\n }\n /**\n * Safe to override method to hook into pre draw\n * @param ctx {@link ExcaliburGraphicsContext} for drawing\n * @param elapsed Number of milliseconds elapsed since the last draw.\n */\n onPostDraw(ctx, elapsed) {\n // Override me\n }\n /**\n * Enable or disable Excalibur debugging functionality.\n * @param toggle a value that debug drawing will be changed to\n */\n showDebug(toggle) {\n this._isDebug = toggle;\n }\n /**\n * Toggle Excalibur debugging functionality.\n */\n toggleDebug() {\n this._isDebug = !this._isDebug;\n return this._isDebug;\n }\n /**\n * Returns true when loading is totally complete and the player has clicked start\n */\n get loadingComplete() {\n return !this._isLoading;\n }\n get ready() {\n return this._isReadyFuture.isCompleted;\n }\n isReady() {\n return this._isReadyFuture.promise;\n }\n async start(sceneNameOrLoader, options) {\n await this.scope(async () => {\n if (!this._compatible) {\n throw new Error('Excalibur is incompatible with your browser');\n }\n this._isLoading = true;\n let loader;\n if (sceneNameOrLoader instanceof _Director_DefaultLoader__WEBPACK_IMPORTED_MODULE_27__.DefaultLoader) {\n loader = sceneNameOrLoader;\n }\n else if (typeof sceneNameOrLoader === 'string') {\n this.director.configureStart(sceneNameOrLoader, options);\n loader = this.director.mainLoader;\n }\n // Start the excalibur clock which drives the mainloop\n this._logger.debug('Starting game clock...');\n this.browser.resume();\n this.clock.start();\n if (this.garbageCollectorConfig) {\n this._garbageCollector.start();\n }\n this._logger.debug('Game clock started');\n await this.load(loader !== null && loader !== void 0 ? loader : new _Director_Loader__WEBPACK_IMPORTED_MODULE_28__.Loader());\n // Initialize before ready\n await this._overrideInitialize(this);\n this._isReadyFuture.resolve();\n this.emit('start', new _Events__WEBPACK_IMPORTED_MODULE_26__.GameStartEvent(this));\n return this._isReadyFuture.promise;\n });\n }\n _mainloop(elapsed) {\n this.scope(() => {\n this.emit('preframe', new _Events__WEBPACK_IMPORTED_MODULE_26__.PreFrameEvent(this, this.stats.prevFrame));\n const elapsedMs = elapsed * this.timescale;\n this.currentFrameElapsedMs = elapsedMs;\n // reset frame stats (reuse existing instances)\n const frameId = this.stats.prevFrame.id + 1;\n this.stats.currFrame.reset();\n this.stats.currFrame.id = frameId;\n this.stats.currFrame.elapsedMs = elapsedMs;\n this.stats.currFrame.fps = this.clock.fpsSampler.fps;\n _Graphics_GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_29__.GraphicsDiagnostics.clear();\n const beforeUpdate = this.clock.now();\n const fixedTimestepMs = this.fixedUpdateTimestep;\n if (this.fixedUpdateTimestep) {\n this._lagMs += elapsedMs;\n while (this._lagMs >= fixedTimestepMs) {\n this._update(fixedTimestepMs);\n this._lagMs -= fixedTimestepMs;\n }\n }\n else {\n this._update(elapsedMs);\n }\n const afterUpdate = this.clock.now();\n this.currentFrameLagMs = this._lagMs;\n this._draw(elapsedMs);\n const afterDraw = this.clock.now();\n this.stats.currFrame.duration.update = afterUpdate - beforeUpdate;\n this.stats.currFrame.duration.draw = afterDraw - afterUpdate;\n this.stats.currFrame.graphics.drawnImages = _Graphics_GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_29__.GraphicsDiagnostics.DrawnImagesCount;\n this.stats.currFrame.graphics.drawCalls = _Graphics_GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_29__.GraphicsDiagnostics.DrawCallCount;\n this.emit('postframe', new _Events__WEBPACK_IMPORTED_MODULE_26__.PostFrameEvent(this, this.stats.currFrame));\n this.stats.prevFrame.reset(this.stats.currFrame);\n this._monitorPerformanceThresholdAndTriggerFallback();\n });\n }\n /**\n * Stops Excalibur's main loop, useful for pausing the game.\n */\n stop() {\n if (this.clock.isRunning()) {\n this.emit('stop', new _Events__WEBPACK_IMPORTED_MODULE_26__.GameStopEvent(this));\n this.browser.pause();\n this.clock.stop();\n this._garbageCollector.stop();\n this._logger.debug('Game stopped');\n }\n }\n /**\n * Returns the Engine's running status, Useful for checking whether engine is running or paused.\n */\n isRunning() {\n return this.clock.isRunning();\n }\n /**\n * Takes a screen shot of the current viewport and returns it as an\n * HTML Image Element.\n * @param preserveHiDPIResolution in the case of HiDPI return the full scaled backing image, by default false\n */\n screenshot(preserveHiDPIResolution = false) {\n const screenShotPromise = new Promise((resolve) => {\n this._screenShotRequests.push({ preserveHiDPIResolution, resolve });\n });\n return screenShotPromise;\n }\n _checkForScreenShots() {\n // We must grab the draw buffer before we yield to the browser\n // the draw buffer is cleared after compositing\n // the reason for the asynchrony is setting `preserveDrawingBuffer: true`\n // forces the browser to copy buffers which can have a mass perf impact on mobile\n for (const request of this._screenShotRequests) {\n const finalWidth = request.preserveHiDPIResolution ? this.canvas.width : this.screen.resolution.width;\n const finalHeight = request.preserveHiDPIResolution ? this.canvas.height : this.screen.resolution.height;\n const screenshot = document.createElement('canvas');\n screenshot.width = finalWidth;\n screenshot.height = finalHeight;\n const ctx = screenshot.getContext('2d');\n ctx.imageSmoothingEnabled = this.screen.antialiasing;\n ctx.drawImage(this.canvas, 0, 0, finalWidth, finalHeight);\n const result = new Image();\n const raw = screenshot.toDataURL('image/png');\n result.onload = () => {\n request.resolve(result);\n };\n result.src = raw;\n }\n // Reset state\n this._screenShotRequests.length = 0;\n }\n /**\n * Another option available to you to load resources into the game.\n * Immediately after calling this the game will pause and the loading screen\n * will appear.\n * @param loader Some {@apilink Loadable} such as a {@apilink Loader} collection, {@apilink Sound}, or {@apilink Texture}.\n */\n async load(loader, hideLoader = false) {\n await this.scope(async () => {\n try {\n // early exit if loaded\n if (loader.isLoaded()) {\n return;\n }\n this._loader = loader;\n this._isLoading = true;\n this._hideLoader = hideLoader;\n if (loader instanceof _Director_Loader__WEBPACK_IMPORTED_MODULE_28__.Loader) {\n loader.suppressPlayButton = loader.suppressPlayButton || this._suppressPlayButton;\n }\n this._loader.onInitialize(this);\n await loader.load();\n }\n catch (e) {\n this._logger.error('Error loading resources, things may not behave properly', e);\n await Promise.resolve();\n }\n finally {\n this._isLoading = false;\n this._hideLoader = false;\n this._loader = null;\n }\n });\n }\n}\nEngine.Context = (0,_Context__WEBPACK_IMPORTED_MODULE_1__.createContext)();\nEngine.InstanceCount = 0;\n/**\n * Default {@apilink EngineOptions}\n */\nEngine._DEFAULT_ENGINE_OPTIONS = {\n width: 0,\n height: 0,\n enableCanvasTransparency: true,\n useDrawSorting: true,\n configurePerformanceCanvas2DFallback: {\n allow: false,\n showPlayerMessage: false,\n threshold: { fps: 20, numberOfFrames: 100 }\n },\n canvasElementId: '',\n canvasElement: undefined,\n enableCanvasContextMenu: false,\n snapToPixel: false,\n antialiasing: true,\n pixelArt: false,\n garbageCollection: true,\n powerPreference: 'high-performance',\n pointerScope: _Input_PointerScope__WEBPACK_IMPORTED_MODULE_22__.PointerScope.Canvas,\n suppressConsoleBootMessage: null,\n suppressMinimumBrowserFeatureDetection: null,\n suppressHiDPIScaling: null,\n suppressPlayButton: null,\n grabWindowFocus: true,\n scrollPreventionMode: ScrollPreventionMode.Canvas,\n backgroundColor: _Color__WEBPACK_IMPORTED_MODULE_30__.Color.fromHex('#2185d0') // Excalibur blue\n};\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/Component.ts\":\n/*!********************************************!*\\\n !*** ./EntityComponentSystem/Component.ts ***!\n \\********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Component: () => (/* binding */ Component),\n/* harmony export */ isComponentCtor: () => (/* binding */ isComponentCtor)\n/* harmony export */ });\n/**\n *\n */\nfunction isComponentCtor(value) {\n return !!value && !!value.prototype && !!value.prototype.constructor;\n}\n/**\n * Type guard to check if a component implements clone\n * @param x\n */\nfunction hasClone(x) {\n return !!(x === null || x === void 0 ? void 0 : x.clone);\n}\n/**\n * Components are containers for state in Excalibur, the are meant to convey capabilities that an Entity possesses\n *\n * Implementations of Component must have a zero-arg constructor to support dependencies\n *\n * ```typescript\n * class MyComponent extends ex.Component {\n * // zero arg support required if you want to use component dependencies\n * constructor(public optionalPos?: ex.Vector) {}\n * }\n * ```\n */\nclass Component {\n constructor() {\n // TODO maybe generate a unique id?\n /**\n * Current owning {@apilink Entity}, if any, of this component. Null if not added to any {@apilink Entity}\n */\n this.owner = undefined;\n }\n /**\n * Clones any properties on this component, if that property value has a `clone()` method it will be called\n */\n clone() {\n const newComponent = new this.constructor();\n for (const prop in this) {\n if (this.hasOwnProperty(prop)) {\n const val = this[prop];\n if (hasClone(val) && prop !== 'owner' && prop !== 'clone') {\n newComponent[prop] = val.clone();\n }\n else {\n newComponent[prop] = val;\n }\n }\n }\n return newComponent;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/Components/MotionComponent.ts\":\n/*!*************************************************************!*\\\n !*** ./EntityComponentSystem/Components/MotionComponent.ts ***!\n \\*************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MotionComponent: () => (/* binding */ MotionComponent)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Component */ \"./EntityComponentSystem/Component.ts\");\n\n\nclass MotionComponent extends _Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor() {\n super(...arguments);\n /**\n * The velocity of an entity in pixels per second\n */\n this.vel = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n /**\n * The acceleration of entity in pixels per second^2\n */\n this.acc = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n /**\n * The scale rate of change in scale units per second\n */\n this.scaleFactor = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n /**\n * The angular velocity which is how quickly the entity is rotating in radians per second\n */\n this.angularVelocity = 0;\n /**\n * The amount of torque applied to the entity, angular acceleration is torque * inertia\n */\n this.torque = 0;\n /**\n * Inertia can be thought of as the resistance to motion\n */\n this.inertia = 1;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/Components/TransformComponent.ts\":\n/*!****************************************************************!*\\\n !*** ./EntityComponentSystem/Components/TransformComponent.ts ***!\n \\****************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TransformComponent: () => (/* binding */ TransformComponent)\n/* harmony export */ });\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Math/coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _Math_transform__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math/transform */ \"./Math/transform.ts\");\n/* harmony import */ var _Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Component */ \"./EntityComponentSystem/Component.ts\");\n/* harmony import */ var _Util_Observable__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Util/Observable */ \"./Util/Observable.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n\n\n\n\n\nclass TransformComponent extends _Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor() {\n super(...arguments);\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this._parentComponent = null;\n this._transform = new _Math_transform__WEBPACK_IMPORTED_MODULE_2__.Transform();\n this._addChildTransform = (child) => {\n const childTxComponent = child.get(TransformComponent);\n if (childTxComponent) {\n childTxComponent._transform.parent = this._transform;\n childTxComponent._parentComponent = this;\n }\n };\n /**\n * Observable that emits when the z index changes on this component\n */\n this.zIndexChanged$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_3__.Observable();\n this._coordPlane = _Math_coord_plane__WEBPACK_IMPORTED_MODULE_4__.CoordPlane.World;\n }\n get() {\n return this._transform;\n }\n onAdd(owner) {\n for (const child of owner.children) {\n this._addChildTransform(child);\n }\n owner.childrenAdded$.subscribe((child) => this._addChildTransform(child));\n owner.childrenRemoved$.subscribe((child) => {\n const childTxComponent = child.get(TransformComponent);\n if (childTxComponent) {\n childTxComponent._transform.parent = null;\n childTxComponent._parentComponent = null;\n }\n });\n }\n onRemove(_previousOwner) {\n this._transform.parent = null;\n this._parentComponent = null;\n }\n /**\n * The z-index ordering of the entity, a higher values are drawn on top of lower values.\n * For example z=99 would be drawn on top of z=0.\n */\n get z() {\n return this._transform.z;\n }\n set z(val) {\n const oldz = this._transform.z;\n this._transform.z = val;\n if (oldz !== val) {\n this.zIndexChanged$.notifyAll(val);\n }\n }\n get globalZ() {\n return this._transform.globalZ;\n }\n set globalZ(z) {\n this._transform.globalZ = z;\n }\n /**\n * The {@apilink CoordPlane | `coordinate plane`} for this transform for the entity.\n */\n get coordPlane() {\n if (this._parentComponent) {\n return this._parentComponent.coordPlane;\n }\n return this._coordPlane;\n }\n set coordPlane(value) {\n var _a;\n if (!this._parentComponent) {\n this._coordPlane = value;\n }\n else {\n this._logger.warn(`Cannot set coordinate plane on child entity ${(_a = this.owner) === null || _a === void 0 ? void 0 : _a.name}, children inherit their coordinate plane from their parents.`);\n }\n }\n get pos() {\n return this._transform.pos;\n }\n set pos(v) {\n this._transform.pos = v;\n }\n get globalPos() {\n return this._transform.globalPos;\n }\n set globalPos(v) {\n this._transform.globalPos = v;\n }\n get rotation() {\n return this._transform.rotation;\n }\n set rotation(rotation) {\n this._transform.rotation = rotation;\n }\n get globalRotation() {\n return this._transform.globalRotation;\n }\n set globalRotation(rotation) {\n this._transform.globalRotation = rotation;\n }\n get scale() {\n return this._transform.scale;\n }\n set scale(v) {\n this._transform.scale = v;\n }\n get globalScale() {\n return this._transform.globalScale;\n }\n set globalScale(v) {\n this._transform.globalScale = v;\n }\n applyInverse(v) {\n return this._transform.applyInverse(v);\n }\n apply(v) {\n return this._transform.apply(v);\n }\n clone() {\n const component = new TransformComponent();\n component._transform = this._transform.clone();\n return component;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/Entity.ts\":\n/*!*****************************************!*\\\n !*** ./EntityComponentSystem/Entity.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AddedComponent: () => (/* binding */ AddedComponent),\n/* harmony export */ Entity: () => (/* binding */ Entity),\n/* harmony export */ EntityEvents: () => (/* binding */ EntityEvents),\n/* harmony export */ RemovedComponent: () => (/* binding */ RemovedComponent),\n/* harmony export */ isAddedComponent: () => (/* binding */ isAddedComponent),\n/* harmony export */ isRemovedComponent: () => (/* binding */ isRemovedComponent)\n/* harmony export */ });\n/* harmony import */ var _Component__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Component */ \"./EntityComponentSystem/Component.ts\");\n/* harmony import */ var _Util_Observable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Observable */ \"./Util/Observable.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Util/Util */ \"./Util/Util.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n\n\n\n\n\n\n\n/**\n * AddedComponent message\n */\nclass AddedComponent {\n constructor(data) {\n this.data = data;\n this.type = 'Component Added';\n }\n}\n/**\n * Type guard to know if message is f an Added Component\n */\nfunction isAddedComponent(x) {\n return !!x && x.type === 'Component Added';\n}\n/**\n * RemovedComponent message\n */\nclass RemovedComponent {\n constructor(data) {\n this.data = data;\n this.type = 'Component Removed';\n }\n}\n/**\n * Type guard to know if message is for a Removed Component\n */\nfunction isRemovedComponent(x) {\n return !!x && x.type === 'Component Removed';\n}\nconst EntityEvents = {\n Add: 'add',\n Remove: 'remove',\n Initialize: 'initialize',\n PreUpdate: 'preupdate',\n PostUpdate: 'postupdate',\n Kill: 'kill'\n};\n/**\n * An Entity is the base type of anything that can have behavior in Excalibur, they are part of the built in entity component system\n *\n * Entities can be strongly typed with the components they contain\n *\n * ```typescript\n * const entity = new Entity();\n * entity.components.a; // Type ComponentA\n * entity.components.b; // Type ComponentB\n * ```\n */\nclass Entity {\n constructor(componentsOrOptions, name) {\n /**\n * The unique identifier for the entity\n */\n this.id = Entity._ID++;\n this.name = `Entity#${this.id}`;\n /**\n * Listen to or emit events for an entity\n */\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n this._tags = new Set();\n this.componentAdded$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_1__.Observable();\n this.componentRemoved$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_1__.Observable();\n this.tagAdded$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_1__.Observable();\n this.tagRemoved$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_1__.Observable();\n /**\n * Current components on the entity\n *\n * **Do not modify**\n *\n * Use addComponent/removeComponent otherwise the ECS will not be notified of changes.\n */\n this.components = new Map();\n this.componentValues = [];\n this._componentsToRemove = [];\n /**\n * The current scene that the entity is in, if any\n */\n this.scene = null;\n /**\n * Whether this entity is active, if set to false it will be reclaimed\n */\n this.isActive = true;\n this._parent = null;\n this.childrenAdded$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_1__.Observable();\n this.childrenRemoved$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_1__.Observable();\n this._children = [];\n this._isInitialized = false;\n this._isAdded = false;\n let componentsToAdd;\n let nameToAdd;\n let silence = false;\n if (Array.isArray(componentsOrOptions)) {\n componentsToAdd = componentsOrOptions;\n nameToAdd = name;\n }\n else if (componentsOrOptions && typeof componentsOrOptions === 'object') {\n const { components, name, silenceWarnings } = componentsOrOptions;\n componentsToAdd = components !== null && components !== void 0 ? components : [];\n nameToAdd = name;\n silence = !!silenceWarnings;\n }\n if (nameToAdd) {\n this.name = nameToAdd;\n }\n if (componentsToAdd) {\n for (const component of componentsToAdd) {\n this.addComponent(component);\n }\n }\n if (true) {\n if (!silence) {\n setTimeout(() => {\n if (!this.scene && !this.isInitialized) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_2__.Logger.getInstance().warn(`Entity \"${this.name || this.id}\" was not added to a scene.`);\n }\n }, 5000);\n }\n }\n }\n /**\n * Whether this entity is active, if set to false it will be reclaimed\n * @deprecated use isActive\n */\n get active() {\n return this.isActive;\n }\n /**\n * Whether this entity is active, if set to false it will be reclaimed\n * @deprecated use isActive\n */\n set active(val) {\n this.isActive = val;\n }\n /**\n * Kill the entity, means it will no longer be updated. Kills are deferred to the end of the update.\n * If parented it will be removed from the parent when killed.\n */\n kill() {\n if (this.isActive) {\n this.isActive = false;\n this.unparent();\n }\n this.emit('kill', new _Events__WEBPACK_IMPORTED_MODULE_3__.KillEvent(this));\n }\n isKilled() {\n return !this.isActive;\n }\n /**\n * Specifically get the tags on the entity from {@apilink TagsComponent}\n */\n get tags() {\n return this._tags;\n }\n /**\n * Check if a tag exists on the entity\n * @param tag name to check for\n */\n hasTag(tag) {\n return this._tags.has(tag);\n }\n /**\n * Adds a tag to an entity\n * @param tag\n */\n addTag(tag) {\n this._tags.add(tag);\n this.tagAdded$.notifyAll(tag);\n return this;\n }\n /**\n * Removes a tag on the entity\n *\n * Removals are deferred until the end of update\n * @param tag\n */\n removeTag(tag) {\n this._tags.delete(tag);\n this.tagRemoved$.notifyAll(tag);\n return this;\n }\n /**\n * The types of the components on the Entity\n */\n get types() {\n return Array.from(this.components.keys());\n }\n /**\n * Returns all component instances on entity\n */\n getComponents() {\n return Array.from(this.components.values());\n }\n /**\n * Verifies that an entity has all the required types\n * @param requiredTypes\n */\n hasAll(requiredTypes) {\n for (let i = 0; i < requiredTypes.length; i++) {\n if (!this.components.has(requiredTypes[i])) {\n return false;\n }\n }\n return true;\n }\n /**\n * Verifies that an entity has all the required tags\n * @param requiredTags\n */\n hasAllTags(requiredTags) {\n for (let i = 0; i < requiredTags.length; i++) {\n if (!this.tags.has(requiredTags[i])) {\n return false;\n }\n }\n return true;\n }\n get(type) {\n return this.components.get(type);\n }\n get parent() {\n return this._parent;\n }\n /**\n * Get the direct children of this entity\n */\n get children() {\n return this._children;\n }\n /**\n * Unparents this entity, if there is a parent. Otherwise it does nothing.\n */\n unparent() {\n if (this._parent) {\n this._parent.removeChild(this);\n this._parent = null;\n }\n }\n /**\n * Adds an entity to be a child of this entity\n * @param entity\n */\n addChild(entity) {\n if (entity.parent === null) {\n if (this.getAncestors().includes(entity)) {\n throw new Error('Cycle detected, cannot add entity');\n }\n this._children.push(entity);\n entity._parent = this;\n this.childrenAdded$.notifyAll(entity);\n }\n else {\n throw new Error('Entity already has a parent, cannot add without unparenting');\n }\n return this;\n }\n /**\n * Remove an entity from children if it exists\n * @param entity\n */\n removeChild(entity) {\n if (entity.parent === this) {\n (0,_Util_Util__WEBPACK_IMPORTED_MODULE_4__.removeItemFromArray)(entity, this._children);\n entity._parent = null;\n this.childrenRemoved$.notifyAll(entity);\n }\n return this;\n }\n /**\n * Removes all children from this entity\n */\n removeAllChildren() {\n // Avoid modifying the array issue by walking backwards\n for (let i = this.children.length - 1; i >= 0; i--) {\n this.removeChild(this.children[i]);\n }\n return this;\n }\n /**\n * Returns a list of parent entities starting with the topmost parent. Includes the current entity.\n */\n getAncestors() {\n const result = [this];\n let current = this.parent;\n while (current) {\n result.push(current);\n current = current.parent;\n }\n return result.reverse();\n }\n /**\n * Returns a list of all the entities that descend from this entity. Includes the current entity.\n */\n getDescendants() {\n let result = [this];\n let queue = [this];\n while (queue.length > 0) {\n const curr = queue.pop();\n if (curr) {\n queue = queue.concat(curr.children);\n result = result.concat(curr.children);\n }\n }\n return result;\n }\n /**\n * Creates a deep copy of the entity and a copy of all its components\n */\n clone() {\n const newEntity = new Entity();\n for (const c of this.types) {\n const componentInstance = this.get(c);\n if (componentInstance) {\n newEntity.addComponent(componentInstance.clone());\n }\n }\n for (const child of this.children) {\n newEntity.addChild(child.clone());\n }\n return newEntity;\n }\n /**\n * Adds a copy of all the components from another template entity as a \"prefab\"\n * @param templateEntity Entity to use as a template\n * @param force Force component replacement if it already exists on the target entity\n */\n addTemplate(templateEntity, force = false) {\n for (const c of templateEntity.getComponents()) {\n this.addComponent(c.clone(), force);\n }\n for (const child of templateEntity.children) {\n this.addChild(child.clone().addTemplate(child));\n }\n return this;\n }\n _getClassHierarchyRoot(componentType) {\n var _a, _b;\n let current = componentType;\n let parent = (_a = Object.getPrototypeOf(current.prototype)) === null || _a === void 0 ? void 0 : _a.constructor;\n while (parent && parent !== Object && parent !== _Component__WEBPACK_IMPORTED_MODULE_5__.Component) {\n current = parent;\n parent = (_b = Object.getPrototypeOf(current.prototype)) === null || _b === void 0 ? void 0 : _b.constructor;\n }\n return current;\n }\n /**\n * Adds a component to the entity\n * @param component Component or Entity to add copy of components from\n * @param force Optionally overwrite any existing components of the same type\n */\n addComponent(component, force = false) {\n // if component already exists, skip if not forced\n if (this.has(component.constructor)) {\n if (force) {\n // Remove existing component type if exists when forced\n this.removeComponent(component.constructor, true);\n }\n else {\n // early exit component exits\n return this;\n }\n }\n // TODO circular dependencies will be a problem\n if (component.dependencies && component.dependencies.length) {\n for (const ctor of component.dependencies) {\n this.addComponent(new ctor());\n }\n }\n component.owner = this;\n const rootComponent = this._getClassHierarchyRoot(component.constructor);\n this.components.set(rootComponent, component);\n this.components.set(component.constructor, component);\n this.componentValues.push(component);\n if (component.onAdd) {\n component.onAdd(this);\n }\n this.componentAdded$.notifyAll(component);\n return this;\n }\n /**\n * Removes a component from the entity, by default removals are deferred to the end of entity update to avoid consistency issues\n *\n * Components can be force removed with the `force` flag, the removal is not deferred and happens immediately\n * @param typeOrInstance\n * @param force\n */\n removeComponent(typeOrInstance, force = false) {\n let type;\n if ((0,_Component__WEBPACK_IMPORTED_MODULE_5__.isComponentCtor)(typeOrInstance)) {\n type = typeOrInstance;\n }\n else {\n type = typeOrInstance.constructor;\n }\n if (force) {\n const componentToRemove = this.components.get(type);\n if (componentToRemove) {\n this.componentRemoved$.notifyAll(componentToRemove);\n componentToRemove.owner = undefined;\n if (componentToRemove.onRemove) {\n componentToRemove.onRemove(this);\n }\n const componentIndex = this.componentValues.indexOf(componentToRemove);\n if (componentIndex > -1) {\n this.componentValues.splice(componentIndex, 1);\n }\n }\n const rootComponent = this._getClassHierarchyRoot(type);\n this.components.delete(rootComponent);\n this.components.delete(type); // remove after the notify to preserve typing\n }\n else {\n this._componentsToRemove.push(type);\n }\n return this;\n }\n clearComponents() {\n const components = this.types;\n for (const c of components) {\n this.removeComponent(c);\n }\n }\n /**\n * @hidden\n * @internal\n */\n processComponentRemoval() {\n for (const type of this._componentsToRemove) {\n this.removeComponent(type, true);\n }\n this._componentsToRemove.length = 0;\n }\n /**\n * Check if a component type exists\n * @param type\n */\n has(type) {\n return this.components.has(type);\n }\n /**\n * Gets whether the actor is Initialized\n */\n get isInitialized() {\n return this._isInitialized;\n }\n get isAdded() {\n return this._isAdded;\n }\n /**\n * Initializes this entity, meant to be called by the Scene before first update not by users of Excalibur.\n *\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n * @internal\n */\n _initialize(engine) {\n if (!this.isInitialized) {\n this.onInitialize(engine);\n this.events.emit('initialize', new _Events__WEBPACK_IMPORTED_MODULE_3__.InitializeEvent(engine, this));\n this._isInitialized = true;\n }\n }\n /**\n * Adds this Actor, meant to be called by the Scene when Actor is added.\n *\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n * @internal\n */\n _add(engine) {\n if (!this.isAdded && this.isActive) {\n this.onAdd(engine);\n this.events.emit('add', new _Events__WEBPACK_IMPORTED_MODULE_3__.AddEvent(engine, this));\n this._isAdded = true;\n }\n }\n /**\n * Removes Actor, meant to be called by the Scene when Actor is added.\n *\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n * @internal\n */\n _remove(engine) {\n if (this.isAdded && !this.isActive) {\n this.onRemove(engine);\n this.events.emit('remove', new _Events__WEBPACK_IMPORTED_MODULE_3__.RemoveEvent(engine, this));\n this._isAdded = false;\n }\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _preupdate handler for {@apilink onPreUpdate} lifecycle event\n * @internal\n */\n _preupdate(engine, elapsed) {\n this.events.emit('preupdate', new _Events__WEBPACK_IMPORTED_MODULE_3__.PreUpdateEvent(engine, elapsed, this));\n this.onPreUpdate(engine, elapsed);\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _preupdate handler for {@apilink onPostUpdate} lifecycle event\n * @internal\n */\n _postupdate(engine, elapsed) {\n this.events.emit('postupdate', new _Events__WEBPACK_IMPORTED_MODULE_3__.PostUpdateEvent(engine, elapsed, this));\n this.onPostUpdate(engine, elapsed);\n }\n /**\n * `onInitialize` is called before the first update of the entity. This method is meant to be\n * overridden.\n *\n * Synonymous with the event handler `.on('initialize', (evt) => {...})`\n */\n onInitialize(engine) {\n // Override me\n }\n /**\n * `onAdd` is called when Actor is added to scene. This method is meant to be\n * overridden.\n *\n * Synonymous with the event handler `.on('add', (evt) => {...})`\n */\n onAdd(engine) {\n // Override me\n }\n /**\n * `onRemove` is called when Actor is added to scene. This method is meant to be\n * overridden.\n *\n * Synonymous with the event handler `.on('remove', (evt) => {...})`\n */\n onRemove(engine) {\n // Override me\n }\n /**\n * Safe to override onPreUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPreUpdate` is called directly before an entity is updated.\n */\n onPreUpdate(engine, elapsed) {\n // Override me\n }\n /**\n * Safe to override onPostUpdate lifecycle event handler. Synonymous with `.on('postupdate', (evt) =>{...})`\n *\n * `onPostUpdate` is called directly after an entity is updated.\n */\n onPostUpdate(engine, elapsed) {\n // Override me\n }\n /**\n *\n * Entity update lifecycle, called internally\n * @internal\n * @param engine\n * @param elapsed\n */\n update(engine, elapsed) {\n this._initialize(engine);\n this._add(engine);\n this._preupdate(engine, elapsed);\n for (const child of this.children) {\n child.update(engine, elapsed);\n }\n this._postupdate(engine, elapsed);\n this._remove(engine);\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n if (handler) {\n this.events.off(eventName, handler);\n }\n else {\n this.events.off(eventName);\n }\n }\n}\nEntity._ID = 0;\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/EntityManager.ts\":\n/*!************************************************!*\\\n !*** ./EntityComponentSystem/EntityManager.ts ***!\n \\************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EntityManager: () => (/* binding */ EntityManager)\n/* harmony export */ });\n/* harmony import */ var _Entity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Util */ \"./Util/Util.ts\");\n\n\n// Add/Remove entities and components\nclass EntityManager {\n constructor(_world) {\n this._world = _world;\n this.entities = [];\n this._entityIndex = {};\n this._childAddedHandlerMap = new Map();\n this._childRemovedHandlerMap = new Map();\n this._createChildAddedHandler = () => (e) => {\n this.addEntity(e);\n };\n this._createChildRemovedHandler = () => (e) => {\n this.removeEntity(e, false);\n };\n this._entitiesToRemove = [];\n }\n /**\n * Runs the entity lifecycle\n * @param scene\n * @param elapsed\n */\n updateEntities(scene, elapsed) {\n for (let entityIndex = 0; entityIndex < this.entities.length; entityIndex++) {\n const entity = this.entities[entityIndex];\n entity.update(scene.engine, elapsed);\n if (!entity.isActive) {\n this.removeEntity(entity);\n }\n }\n }\n findEntitiesForRemoval() {\n for (let entityIndex = 0; entityIndex < this.entities.length; entityIndex++) {\n const entity = this.entities[entityIndex];\n if (!entity.isActive) {\n this.removeEntity(entity);\n }\n }\n }\n /**\n * Adds an entity to be tracked by the EntityManager\n * @param entity\n */\n addEntity(entity) {\n entity.isActive = true;\n entity.scene = this._world.scene;\n if (entity && !this._entityIndex[entity.id]) {\n this._entityIndex[entity.id] = entity;\n this.entities.push(entity);\n this._world.queryManager.addEntity(entity);\n // if entity has children\n entity.children.forEach((c) => {\n c.scene = entity.scene;\n this.addEntity(c);\n });\n const childAdded = this._createChildAddedHandler();\n this._childAddedHandlerMap.set(entity, childAdded);\n const childRemoved = this._createChildRemovedHandler();\n this._childRemovedHandlerMap.set(entity, childRemoved);\n entity.childrenAdded$.subscribe(childAdded);\n entity.childrenRemoved$.subscribe(childRemoved);\n }\n }\n removeEntity(idOrEntity, deferred = true) {\n var _a, _b;\n let id = 0;\n if (idOrEntity instanceof _Entity__WEBPACK_IMPORTED_MODULE_0__.Entity) {\n id = idOrEntity.id;\n }\n else {\n id = idOrEntity;\n }\n const entity = this._entityIndex[id];\n if (entity && entity.isActive) {\n entity.isActive = false;\n }\n if (entity && deferred) {\n this._entitiesToRemove.push(entity);\n return;\n }\n delete this._entityIndex[id];\n if (entity) {\n entity.scene = null;\n (0,_Util_Util__WEBPACK_IMPORTED_MODULE_1__.removeItemFromArray)(entity, this.entities);\n this._world.queryManager.removeEntity(entity);\n // if entity has children\n entity.children.forEach((c) => {\n c.scene = null;\n this.removeEntity(c, deferred);\n });\n const childAddedHandler = this._childAddedHandlerMap.get(entity);\n if (childAddedHandler) {\n entity.childrenAdded$.unsubscribe(childAddedHandler);\n }\n const childRemovedHandler = this._childRemovedHandlerMap.get(entity);\n if (childRemovedHandler) {\n entity.childrenRemoved$.unsubscribe(childRemovedHandler);\n }\n // stats\n if ((_b = (_a = this._world) === null || _a === void 0 ? void 0 : _a.scene) === null || _b === void 0 ? void 0 : _b.engine) {\n this._world.scene.engine.stats.currFrame.actors.killed++;\n }\n }\n }\n processEntityRemovals() {\n for (let entityIndex = 0; entityIndex < this._entitiesToRemove.length; entityIndex++) {\n const entity = this._entitiesToRemove[entityIndex];\n if (entity.isActive) {\n continue;\n }\n this.removeEntity(entity, false);\n }\n this._entitiesToRemove.length = 0;\n }\n processComponentRemovals() {\n for (let entityIndex = 0; entityIndex < this.entities.length; entityIndex++) {\n const entity = this.entities[entityIndex];\n entity.processComponentRemoval();\n }\n }\n getById(id) {\n return this._entityIndex[id];\n }\n getByName(name) {\n return this.entities.filter((e) => e.name === name);\n }\n clear() {\n for (let i = this.entities.length - 1; i >= 0; i--) {\n this.removeEntity(this.entities[i]);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/Priority.ts\":\n/*!*******************************************!*\\\n !*** ./EntityComponentSystem/Priority.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SystemPriority: () => (/* binding */ SystemPriority)\n/* harmony export */ });\n/**\n * Higher priorities run earlier than others in the system update\n */\nconst SystemPriority = {\n Highest: -Infinity,\n Higher: -5,\n Average: 0,\n Lower: 5,\n Lowest: Infinity\n};\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/Query.ts\":\n/*!****************************************!*\\\n !*** ./EntityComponentSystem/Query.ts ***!\n \\****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Query: () => (/* binding */ Query)\n/* harmony export */ });\n/* harmony import */ var _Util_Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Util/Observable */ \"./Util/Observable.ts\");\n\n/**\n * Represents query for entities that match a list of types that is cached and observable\n *\n * Queries can be strongly typed by supplying a type union in the optional type parameter\n * ```typescript\n * const queryAB = new ex.Query(['A', 'B']);\n * ```\n */\nclass Query {\n constructor(requiredComponents) {\n this.requiredComponents = requiredComponents;\n this.components = new Set();\n this.entities = [];\n /**\n * This fires right after the component is added\n */\n this.entityAdded$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_0__.Observable();\n /**\n * This fires right before the component is actually removed from the entity, it will still be available for cleanup purposes\n */\n this.entityRemoved$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_0__.Observable();\n if (requiredComponents.length === 0) {\n throw new Error('Cannot create query without components');\n }\n for (const type of requiredComponents) {\n this.components.add(type);\n }\n this.id = Query.createId(requiredComponents);\n }\n static createId(requiredComponents) {\n // TODO what happens if a user defines the same type name as a built in type\n // ! TODO this could be dangerous depending on the bundler's settings for names\n // Maybe some kind of hash function is better here?\n return requiredComponents\n .slice()\n .map((c) => c.name)\n .sort()\n .join('-');\n }\n /**\n * Potentially adds an entity to a query index, returns true if added, false if not\n * @param entity\n */\n checkAndAdd(entity) {\n if (!this.entities.includes(entity) && entity.hasAll(Array.from(this.components))) {\n this.entities.push(entity);\n this.entityAdded$.notifyAll(entity);\n return true;\n }\n return false;\n }\n removeEntity(entity) {\n const index = this.entities.indexOf(entity);\n if (index > -1) {\n this.entities.splice(index, 1);\n this.entityRemoved$.notifyAll(entity);\n }\n }\n /**\n * Returns a list of entities that match the query\n * @param sort Optional sorting function to sort entities returned from the query\n */\n getEntities(sort) {\n if (sort) {\n this.entities.sort(sort);\n }\n return this.entities;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/QueryManager.ts\":\n/*!***********************************************!*\\\n !*** ./EntityComponentSystem/QueryManager.ts ***!\n \\***********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ QueryManager: () => (/* binding */ QueryManager)\n/* harmony export */ });\n/* harmony import */ var _Query__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Query */ \"./EntityComponentSystem/Query.ts\");\n/* harmony import */ var _TagQuery__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./TagQuery */ \"./EntityComponentSystem/TagQuery.ts\");\n\n\n/**\n * The query manager is responsible for updating all queries when entities/components change\n */\nclass QueryManager {\n constructor(_world) {\n this._world = _world;\n this._queries = new Map();\n this._addComponentHandlers = new Map();\n this._removeComponentHandlers = new Map();\n this._componentToQueriesIndex = new Map();\n this._tagQueries = new Map();\n this._addTagHandlers = new Map();\n this._removeTagHandlers = new Map();\n this._tagToQueriesIndex = new Map();\n this._createAddComponentHandler = (entity) => (c) => {\n this.addComponent(entity, c);\n };\n this._createRemoveComponentHandler = (entity) => (c) => {\n this.removeComponent(entity, c);\n };\n this._createAddTagHandler = (entity) => (tag) => {\n this.addTag(entity, tag);\n };\n this._createRemoveTagHandler = (entity) => (tag) => {\n this.removeTag(entity, tag);\n };\n }\n createQuery(requiredComponents) {\n const id = _Query__WEBPACK_IMPORTED_MODULE_0__.Query.createId(requiredComponents);\n if (this._queries.has(id)) {\n // short circuit if query is already created\n return this._queries.get(id);\n }\n const query = new _Query__WEBPACK_IMPORTED_MODULE_0__.Query(requiredComponents);\n this._queries.set(query.id, query);\n // index maintenance\n for (const component of requiredComponents) {\n const queries = this._componentToQueriesIndex.get(component);\n if (!queries) {\n this._componentToQueriesIndex.set(component, [query]);\n }\n else {\n queries.push(query);\n }\n }\n for (const entity of this._world.entities) {\n this.addEntity(entity);\n }\n return query;\n }\n createTagQuery(requiredTags) {\n const id = _TagQuery__WEBPACK_IMPORTED_MODULE_1__.TagQuery.createId(requiredTags);\n if (this._tagQueries.has(id)) {\n // short circuit if query is already created\n return this._tagQueries.get(id);\n }\n const query = new _TagQuery__WEBPACK_IMPORTED_MODULE_1__.TagQuery(requiredTags);\n this._tagQueries.set(query.id, query);\n // index maintenance\n for (const tag of requiredTags) {\n const queries = this._tagToQueriesIndex.get(tag);\n if (!queries) {\n this._tagToQueriesIndex.set(tag, [query]);\n }\n else {\n queries.push(query);\n }\n }\n for (const entity of this._world.entities) {\n this.addEntity(entity);\n }\n return query;\n }\n /**\n * Scans queries and locates any that need this entity added\n * @param entity\n */\n addEntity(entity) {\n const maybeAddComponent = this._addComponentHandlers.get(entity);\n const maybeRemoveComponent = this._removeComponentHandlers.get(entity);\n const addComponent = maybeAddComponent !== null && maybeAddComponent !== void 0 ? maybeAddComponent : this._createAddComponentHandler(entity);\n const removeComponent = maybeRemoveComponent !== null && maybeRemoveComponent !== void 0 ? maybeRemoveComponent : this._createRemoveComponentHandler(entity);\n this._addComponentHandlers.set(entity, addComponent);\n this._removeComponentHandlers.set(entity, removeComponent);\n const maybeAddTag = this._addTagHandlers.get(entity);\n const maybeRemoveTag = this._removeTagHandlers.get(entity);\n const addTag = maybeAddTag !== null && maybeAddTag !== void 0 ? maybeAddTag : this._createAddTagHandler(entity);\n const removeTag = maybeRemoveTag !== null && maybeRemoveTag !== void 0 ? maybeRemoveTag : this._createRemoveTagHandler(entity);\n this._addTagHandlers.set(entity, addTag);\n this._removeTagHandlers.set(entity, removeTag);\n for (const query of this._queries.values()) {\n query.checkAndAdd(entity);\n }\n for (const tagQuery of this._tagQueries.values()) {\n tagQuery.checkAndAdd(entity);\n }\n entity.componentAdded$.subscribe(addComponent);\n entity.componentRemoved$.subscribe(removeComponent);\n entity.tagAdded$.subscribe(addTag);\n entity.tagRemoved$.subscribe(removeTag);\n }\n /**\n * Scans queries and locates any that need this entity removed\n * @param entity\n */\n removeEntity(entity) {\n // Handle components\n const addComponent = this._addComponentHandlers.get(entity);\n const removeComponent = this._removeComponentHandlers.get(entity);\n for (const query of this._queries.values()) {\n query.removeEntity(entity);\n }\n if (addComponent) {\n entity.componentAdded$.unsubscribe(addComponent);\n }\n if (removeComponent) {\n entity.componentRemoved$.unsubscribe(removeComponent);\n }\n // Handle tags\n const addTag = this._addTagHandlers.get(entity);\n const removeTag = this._removeTagHandlers.get(entity);\n for (const tagQuery of this._tagQueries.values()) {\n tagQuery.removeEntity(entity);\n }\n if (addTag) {\n entity.tagAdded$.unsubscribe(addTag);\n }\n if (removeTag) {\n entity.tagRemoved$.unsubscribe(removeTag);\n }\n }\n /**\n * Updates any queries when a component is added to an entity\n * @param entity\n * @param component\n */\n addComponent(entity, component) {\n var _a;\n const queries = (_a = this._componentToQueriesIndex.get(component.constructor)) !== null && _a !== void 0 ? _a : [];\n for (const query of queries) {\n query.checkAndAdd(entity);\n }\n }\n /**\n * Updates any queries when a component is removed from an entity\n * @param entity\n * @param component\n */\n removeComponent(entity, component) {\n var _a;\n const queries = (_a = this._componentToQueriesIndex.get(component.constructor)) !== null && _a !== void 0 ? _a : [];\n for (const query of queries) {\n query.removeEntity(entity);\n }\n }\n /**\n * Updates any queries when a tag is added to an entity\n * @param entity\n * @param tag\n */\n addTag(entity, tag) {\n var _a;\n const queries = (_a = this._tagToQueriesIndex.get(tag)) !== null && _a !== void 0 ? _a : [];\n for (const query of queries) {\n query.checkAndAdd(entity);\n }\n }\n /**\n * Updates any queries when a component is removed from an entity\n * @param entity\n * @param tag\n */\n removeTag(entity, tag) {\n var _a;\n const queries = (_a = this._tagToQueriesIndex.get(tag)) !== null && _a !== void 0 ? _a : [];\n for (const query of queries) {\n query.removeEntity(entity);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/System.ts\":\n/*!*****************************************!*\\\n !*** ./EntityComponentSystem/System.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ System: () => (/* binding */ System),\n/* harmony export */ SystemType: () => (/* binding */ SystemType)\n/* harmony export */ });\n/* harmony import */ var _Priority__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Priority */ \"./EntityComponentSystem/Priority.ts\");\n\n/**\n * Enum that determines whether to run the system in the update or draw phase\n */\nvar SystemType;\n(function (SystemType) {\n SystemType[\"Update\"] = \"update\";\n SystemType[\"Draw\"] = \"draw\";\n})(SystemType || (SystemType = {}));\n/**\n * An Excalibur {@apilink System} that updates entities of certain types.\n * Systems are scene specific\n *\n *\n *\n * Excalibur Systems currently require at least 1 Component type to operated\n *\n * Multiple types are declared as a type union\n * For example:\n *\n * ```typescript\n * class MySystem extends System {\n * static priority = SystemPriority.Lowest;\n * public readonly systemType = SystemType.Update;\n * public query: Query;\n * constructor(public world: World) {\n * super();\n * this.query = this.world.query([TransformComponent]);\n * }\n * public update(elapsed: number) {\n * ...\n * }\n * }\n * ```\n */\nclass System {\n}\n/**\n * System can execute in priority order, by default all systems are priority 0. Lower values indicated higher priority.\n * For a system to execute before all other a lower priority value (-1 for example) must be set.\n * For a system to execute after all other a higher priority value (10 for example) must be set.\n */\nSystem.priority = _Priority__WEBPACK_IMPORTED_MODULE_0__.SystemPriority.Average;\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/SystemManager.ts\":\n/*!************************************************!*\\\n !*** ./EntityComponentSystem/SystemManager.ts ***!\n \\************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SystemManager: () => (/* binding */ SystemManager),\n/* harmony export */ isSystemConstructor: () => (/* binding */ isSystemConstructor)\n/* harmony export */ });\n/* harmony import */ var _System__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Util */ \"./Util/Util.ts\");\n\n\n/**\n *\n */\nfunction isSystemConstructor(x) {\n var _a, _b;\n return !!(x === null || x === void 0 ? void 0 : x.prototype) && !!((_b = (_a = x === null || x === void 0 ? void 0 : x.prototype) === null || _a === void 0 ? void 0 : _a.constructor) === null || _b === void 0 ? void 0 : _b.name);\n}\n/**\n * The SystemManager is responsible for keeping track of all systems in a scene.\n * Systems are scene specific\n */\nclass SystemManager {\n constructor(_world) {\n this._world = _world;\n /**\n * List of systems, to add a new system call {@apilink SystemManager.addSystem}\n */\n this.systems = [];\n this.initialized = false;\n }\n /**\n * Get a system registered in the manager by type\n * @param systemType\n */\n get(systemType) {\n return this.systems.find((s) => s instanceof systemType);\n }\n /**\n * Adds a system to the manager, it will now be updated every frame\n * @param systemOrCtor\n */\n addSystem(systemOrCtor) {\n let system;\n if (systemOrCtor instanceof _System__WEBPACK_IMPORTED_MODULE_0__.System) {\n system = systemOrCtor;\n }\n else {\n system = new systemOrCtor(this._world);\n }\n this.systems.push(system);\n this.systems.sort((a, b) => a.constructor.priority - b.constructor.priority);\n // If systems are added and the manager has already been init'd\n // then immediately init the system\n if (this.initialized && system.initialize) {\n system.initialize(this._world, this._world.scene);\n }\n }\n /**\n * Removes a system from the manager, it will no longer be updated\n * @param system\n */\n removeSystem(system) {\n (0,_Util_Util__WEBPACK_IMPORTED_MODULE_1__.removeItemFromArray)(system, this.systems);\n }\n /**\n * Initialize all systems in the manager\n *\n * Systems added after initialize() will be initialized on add\n */\n initialize() {\n if (!this.initialized) {\n this.initialized = true;\n for (const s of this.systems) {\n if (s.initialize) {\n s.initialize(this._world, this._world.scene);\n }\n }\n }\n }\n /**\n * Updates all systems\n * @param type whether this is an update or draw system\n * @param scene context reference\n * @param elapsed time in milliseconds\n */\n updateSystems(type, scene, elapsed) {\n const systems = this.systems.filter((s) => s.systemType === type);\n for (const s of systems) {\n if (s.preupdate) {\n s.preupdate(scene, elapsed);\n }\n }\n for (const s of systems) {\n s.update(elapsed);\n }\n for (const s of systems) {\n if (s.postupdate) {\n s.postupdate(scene, elapsed);\n }\n }\n }\n clear() {\n for (let i = this.systems.length - 1; i >= 0; i--) {\n this.removeSystem(this.systems[i]);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/TagQuery.ts\":\n/*!*******************************************!*\\\n !*** ./EntityComponentSystem/TagQuery.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TagQuery: () => (/* binding */ TagQuery)\n/* harmony export */ });\n/* harmony import */ var _Util_Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Util/Observable */ \"./Util/Observable.ts\");\n\nclass TagQuery {\n constructor(requiredTags) {\n this.requiredTags = requiredTags;\n this.tags = new Set();\n this.entities = [];\n /**\n * This fires right after the component is added\n */\n this.entityAdded$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_0__.Observable();\n /**\n * This fires right before the component is actually removed from the entity, it will still be available for cleanup purposes\n */\n this.entityRemoved$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_0__.Observable();\n if (requiredTags.length === 0) {\n throw new Error('Cannot create tag query without tags');\n }\n for (const tag of requiredTags) {\n this.tags.add(tag);\n }\n this.id = TagQuery.createId(requiredTags);\n }\n static createId(requiredComponents) {\n return requiredComponents.slice().sort().join('-');\n }\n checkAndAdd(entity) {\n if (!this.entities.includes(entity) && entity.hasAllTags(Array.from(this.tags))) {\n this.entities.push(entity);\n this.entityAdded$.notifyAll(entity);\n return true;\n }\n return false;\n }\n removeEntity(entity) {\n const index = this.entities.indexOf(entity);\n if (index > -1) {\n this.entities.splice(index, 1);\n this.entityRemoved$.notifyAll(entity);\n }\n }\n /**\n * Returns a list of entities that match the query\n * @param sort Optional sorting function to sort entities returned from the query\n */\n getEntities(sort) {\n if (sort) {\n this.entities.sort(sort);\n }\n return this.entities;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/World.ts\":\n/*!****************************************!*\\\n !*** ./EntityComponentSystem/World.ts ***!\n \\****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ World: () => (/* binding */ World)\n/* harmony export */ });\n/* harmony import */ var _Entity__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _EntityManager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./EntityManager */ \"./EntityComponentSystem/EntityManager.ts\");\n/* harmony import */ var _QueryManager__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./QueryManager */ \"./EntityComponentSystem/QueryManager.ts\");\n/* harmony import */ var _System__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _SystemManager__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./SystemManager */ \"./EntityComponentSystem/SystemManager.ts\");\n\n\n\n\n\n/**\n * The World is a self-contained entity component system for a particular context.\n */\nclass World {\n /**\n * The context type is passed to the system updates\n * @param scene\n */\n constructor(scene) {\n this.scene = scene;\n this.queryManager = new _QueryManager__WEBPACK_IMPORTED_MODULE_0__.QueryManager(this);\n this.entityManager = new _EntityManager__WEBPACK_IMPORTED_MODULE_1__.EntityManager(this);\n this.systemManager = new _SystemManager__WEBPACK_IMPORTED_MODULE_2__.SystemManager(this);\n }\n /**\n * Query the ECS world for entities that match your components\n * @param requiredTypes\n */\n query(requiredTypes) {\n return this.queryManager.createQuery(requiredTypes);\n }\n queryTags(requiredTags) {\n return this.queryManager.createTagQuery(requiredTags);\n }\n /**\n * Update systems by type and time elapsed in milliseconds\n */\n update(type, elapsed) {\n if (type === _System__WEBPACK_IMPORTED_MODULE_3__.SystemType.Update) {\n this.entityManager.updateEntities(this.scene, elapsed);\n }\n this.systemManager.updateSystems(type, this.scene, elapsed);\n this.entityManager.findEntitiesForRemoval();\n this.entityManager.processComponentRemovals();\n this.entityManager.processEntityRemovals();\n }\n add(entityOrSystem) {\n if (entityOrSystem instanceof _Entity__WEBPACK_IMPORTED_MODULE_4__.Entity) {\n this.entityManager.addEntity(entityOrSystem);\n }\n if (entityOrSystem instanceof _System__WEBPACK_IMPORTED_MODULE_3__.System || (0,_SystemManager__WEBPACK_IMPORTED_MODULE_2__.isSystemConstructor)(entityOrSystem)) {\n this.systemManager.addSystem(entityOrSystem);\n }\n }\n /**\n * Get a system out of the ECS world\n */\n get(system) {\n return this.systemManager.get(system);\n }\n remove(entityOrSystem, deferred = true) {\n if (entityOrSystem instanceof _Entity__WEBPACK_IMPORTED_MODULE_4__.Entity) {\n this.entityManager.removeEntity(entityOrSystem, deferred);\n }\n if (entityOrSystem instanceof _System__WEBPACK_IMPORTED_MODULE_3__.System) {\n this.systemManager.removeSystem(entityOrSystem);\n }\n }\n get entities() {\n return this.entityManager.entities;\n }\n clearEntities() {\n this.entityManager.clear();\n }\n clearSystems() {\n this.systemManager.clear();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/index.ts\":\n/*!****************************************!*\\\n !*** ./EntityComponentSystem/index.ts ***!\n \\****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AddedComponent: () => (/* reexport safe */ _Entity__WEBPACK_IMPORTED_MODULE_1__.AddedComponent),\n/* harmony export */ Component: () => (/* reexport safe */ _Component__WEBPACK_IMPORTED_MODULE_0__.Component),\n/* harmony export */ Entity: () => (/* reexport safe */ _Entity__WEBPACK_IMPORTED_MODULE_1__.Entity),\n/* harmony export */ EntityEvents: () => (/* reexport safe */ _Entity__WEBPACK_IMPORTED_MODULE_1__.EntityEvents),\n/* harmony export */ EntityManager: () => (/* reexport safe */ _EntityManager__WEBPACK_IMPORTED_MODULE_2__.EntityManager),\n/* harmony export */ MotionComponent: () => (/* reexport safe */ _Components_MotionComponent__WEBPACK_IMPORTED_MODULE_11__.MotionComponent),\n/* harmony export */ Query: () => (/* reexport safe */ _Query__WEBPACK_IMPORTED_MODULE_3__.Query),\n/* harmony export */ QueryManager: () => (/* reexport safe */ _QueryManager__WEBPACK_IMPORTED_MODULE_5__.QueryManager),\n/* harmony export */ RemovedComponent: () => (/* reexport safe */ _Entity__WEBPACK_IMPORTED_MODULE_1__.RemovedComponent),\n/* harmony export */ System: () => (/* reexport safe */ _System__WEBPACK_IMPORTED_MODULE_6__.System),\n/* harmony export */ SystemManager: () => (/* reexport safe */ _SystemManager__WEBPACK_IMPORTED_MODULE_7__.SystemManager),\n/* harmony export */ SystemPriority: () => (/* reexport safe */ _Priority__WEBPACK_IMPORTED_MODULE_9__.SystemPriority),\n/* harmony export */ SystemType: () => (/* reexport safe */ _System__WEBPACK_IMPORTED_MODULE_6__.SystemType),\n/* harmony export */ TagQuery: () => (/* reexport safe */ _TagQuery__WEBPACK_IMPORTED_MODULE_4__.TagQuery),\n/* harmony export */ TransformComponent: () => (/* reexport safe */ _Components_TransformComponent__WEBPACK_IMPORTED_MODULE_10__.TransformComponent),\n/* harmony export */ World: () => (/* reexport safe */ _World__WEBPACK_IMPORTED_MODULE_8__.World),\n/* harmony export */ isAddedComponent: () => (/* reexport safe */ _Entity__WEBPACK_IMPORTED_MODULE_1__.isAddedComponent),\n/* harmony export */ isComponentCtor: () => (/* reexport safe */ _Component__WEBPACK_IMPORTED_MODULE_0__.isComponentCtor),\n/* harmony export */ isRemovedComponent: () => (/* reexport safe */ _Entity__WEBPACK_IMPORTED_MODULE_1__.isRemovedComponent),\n/* harmony export */ isSystemConstructor: () => (/* reexport safe */ _SystemManager__WEBPACK_IMPORTED_MODULE_7__.isSystemConstructor)\n/* harmony export */ });\n/* harmony import */ var _Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Component */ \"./EntityComponentSystem/Component.ts\");\n/* harmony import */ var _Entity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _EntityManager__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./EntityManager */ \"./EntityComponentSystem/EntityManager.ts\");\n/* harmony import */ var _Query__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Query */ \"./EntityComponentSystem/Query.ts\");\n/* harmony import */ var _TagQuery__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./TagQuery */ \"./EntityComponentSystem/TagQuery.ts\");\n/* harmony import */ var _QueryManager__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./QueryManager */ \"./EntityComponentSystem/QueryManager.ts\");\n/* harmony import */ var _System__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _SystemManager__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./SystemManager */ \"./EntityComponentSystem/SystemManager.ts\");\n/* harmony import */ var _World__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./World */ \"./EntityComponentSystem/World.ts\");\n/* harmony import */ var _Priority__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Priority */ \"./EntityComponentSystem/Priority.ts\");\n/* harmony import */ var _Components_TransformComponent__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Components_MotionComponent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./EventEmitter.ts\":\n/*!*************************!*\\\n !*** ./EventEmitter.ts ***!\n \\*************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EventEmitter: () => (/* binding */ EventEmitter)\n/* harmony export */ });\n/**\n * Excalibur's typed event emitter, this allows events to be sent with any string to Type mapping\n */\nclass EventEmitter {\n constructor() {\n this._paused = false;\n this._empty = true;\n this._listeners = {};\n this._listenersOnce = {};\n this._pipes = [];\n }\n /**\n * Removes all listeners and pipes\n */\n clear() {\n this._listeners = {};\n this._listenersOnce = {};\n this._pipes.length = 0;\n this._empty = true;\n }\n on(eventName, handler) {\n var _a;\n this._empty = false;\n this._listeners[eventName] = (_a = this._listeners[eventName]) !== null && _a !== void 0 ? _a : [];\n this._listeners[eventName].push(handler);\n return {\n close: () => this.off(eventName, handler)\n };\n }\n once(eventName, handler) {\n var _a;\n this._empty = false;\n this._listenersOnce[eventName] = (_a = this._listenersOnce[eventName]) !== null && _a !== void 0 ? _a : [];\n this._listenersOnce[eventName].push(handler);\n return {\n close: () => this.off(eventName, handler)\n };\n }\n off(eventName, handler) {\n var _a, _b;\n if (handler) {\n const newListeners = (_a = this._listeners[eventName]) === null || _a === void 0 ? void 0 : _a.filter((h) => h !== handler);\n this._listeners[eventName] = newListeners;\n const newOnceListeners = (_b = this._listenersOnce[eventName]) === null || _b === void 0 ? void 0 : _b.filter((h) => h !== handler);\n this._listenersOnce[eventName] = newOnceListeners;\n }\n else {\n delete this._listeners[eventName];\n }\n }\n emit(eventName, event) {\n if (this._empty) {\n return;\n }\n if (this._paused) {\n return;\n }\n const listeners = this._listeners[eventName];\n if (listeners) {\n for (let i = 0; i < listeners.length; i++) {\n listeners[i](event);\n }\n }\n const onces = this._listenersOnce[eventName];\n this._listenersOnce[eventName] = [];\n if (onces) {\n for (let i = 0; i < onces.length; i++) {\n onces[i](event);\n }\n }\n for (let i = 0; i < this._pipes.length; i++) {\n this._pipes[i].emit(eventName, event);\n }\n }\n /**\n * Replay events from this emitter to another\n * @param emitter\n */\n pipe(emitter) {\n if (this === emitter) {\n throw Error('Cannot pipe to self');\n }\n this._empty = false;\n this._pipes.push(emitter);\n return {\n close: () => {\n const i = this._pipes.indexOf(emitter);\n if (i > -1) {\n this._pipes.splice(i, 1);\n }\n }\n };\n }\n /**\n * Remove any piped emitters\n * @param emitter\n */\n unpipe(emitter) {\n const i = this._pipes.indexOf(emitter);\n if (i > -1) {\n this._pipes.splice(i, 1);\n }\n }\n /**\n * Paused event emitters do not emit events\n */\n pause() {\n this._paused = true;\n }\n /**\n * Unpaused event emitter do emit events\n */\n unpause() {\n this._paused = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Events.ts\":\n/*!*******************!*\\\n !*** ./Events.ts ***!\n \\*******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ActionCompleteEvent: () => (/* binding */ ActionCompleteEvent),\n/* harmony export */ ActionStartEvent: () => (/* binding */ ActionStartEvent),\n/* harmony export */ ActivateEvent: () => (/* binding */ ActivateEvent),\n/* harmony export */ AddEvent: () => (/* binding */ AddEvent),\n/* harmony export */ CollisionEndEvent: () => (/* binding */ CollisionEndEvent),\n/* harmony export */ CollisionPostSolveEvent: () => (/* binding */ CollisionPostSolveEvent),\n/* harmony export */ CollisionPreSolveEvent: () => (/* binding */ CollisionPreSolveEvent),\n/* harmony export */ CollisionStartEvent: () => (/* binding */ CollisionStartEvent),\n/* harmony export */ ContactEndEvent: () => (/* binding */ ContactEndEvent),\n/* harmony export */ ContactStartEvent: () => (/* binding */ ContactStartEvent),\n/* harmony export */ DeactivateEvent: () => (/* binding */ DeactivateEvent),\n/* harmony export */ EnterTriggerEvent: () => (/* binding */ EnterTriggerEvent),\n/* harmony export */ EnterViewPortEvent: () => (/* binding */ EnterViewPortEvent),\n/* harmony export */ EventTypes: () => (/* binding */ EventTypes),\n/* harmony export */ ExitTriggerEvent: () => (/* binding */ ExitTriggerEvent),\n/* harmony export */ ExitViewPortEvent: () => (/* binding */ ExitViewPortEvent),\n/* harmony export */ GameEvent: () => (/* binding */ GameEvent),\n/* harmony export */ GameStartEvent: () => (/* binding */ GameStartEvent),\n/* harmony export */ GameStopEvent: () => (/* binding */ GameStopEvent),\n/* harmony export */ GamepadAxisEvent: () => (/* binding */ GamepadAxisEvent),\n/* harmony export */ GamepadButtonEvent: () => (/* binding */ GamepadButtonEvent),\n/* harmony export */ GamepadConnectEvent: () => (/* binding */ GamepadConnectEvent),\n/* harmony export */ GamepadDisconnectEvent: () => (/* binding */ GamepadDisconnectEvent),\n/* harmony export */ HiddenEvent: () => (/* binding */ HiddenEvent),\n/* harmony export */ InitializeEvent: () => (/* binding */ InitializeEvent),\n/* harmony export */ KillEvent: () => (/* binding */ KillEvent),\n/* harmony export */ PostCollisionEvent: () => (/* binding */ PostCollisionEvent),\n/* harmony export */ PostDebugDrawEvent: () => (/* binding */ PostDebugDrawEvent),\n/* harmony export */ PostDrawEvent: () => (/* binding */ PostDrawEvent),\n/* harmony export */ PostFrameEvent: () => (/* binding */ PostFrameEvent),\n/* harmony export */ PostKillEvent: () => (/* binding */ PostKillEvent),\n/* harmony export */ PostTransformDrawEvent: () => (/* binding */ PostTransformDrawEvent),\n/* harmony export */ PostUpdateEvent: () => (/* binding */ PostUpdateEvent),\n/* harmony export */ PreCollisionEvent: () => (/* binding */ PreCollisionEvent),\n/* harmony export */ PreDebugDrawEvent: () => (/* binding */ PreDebugDrawEvent),\n/* harmony export */ PreDrawEvent: () => (/* binding */ PreDrawEvent),\n/* harmony export */ PreFrameEvent: () => (/* binding */ PreFrameEvent),\n/* harmony export */ PreKillEvent: () => (/* binding */ PreKillEvent),\n/* harmony export */ PreTransformDrawEvent: () => (/* binding */ PreTransformDrawEvent),\n/* harmony export */ PreUpdateEvent: () => (/* binding */ PreUpdateEvent),\n/* harmony export */ RemoveEvent: () => (/* binding */ RemoveEvent),\n/* harmony export */ VisibleEvent: () => (/* binding */ VisibleEvent)\n/* harmony export */ });\nvar EventTypes;\n(function (EventTypes) {\n EventTypes[\"Kill\"] = \"kill\";\n EventTypes[\"PreKill\"] = \"prekill\";\n EventTypes[\"PostKill\"] = \"postkill\";\n EventTypes[\"PreDraw\"] = \"predraw\";\n EventTypes[\"PostDraw\"] = \"postdraw\";\n EventTypes[\"PreDebugDraw\"] = \"predebugdraw\";\n EventTypes[\"PostDebugDraw\"] = \"postdebugdraw\";\n EventTypes[\"PreUpdate\"] = \"preupdate\";\n EventTypes[\"PostUpdate\"] = \"postupdate\";\n EventTypes[\"PreFrame\"] = \"preframe\";\n EventTypes[\"PostFrame\"] = \"postframe\";\n EventTypes[\"PreCollision\"] = \"precollision\";\n EventTypes[\"CollisionStart\"] = \"collisionstart\";\n EventTypes[\"CollisionEnd\"] = \"collisionend\";\n EventTypes[\"PostCollision\"] = \"postcollision\";\n EventTypes[\"Initialize\"] = \"initialize\";\n EventTypes[\"Activate\"] = \"activate\";\n EventTypes[\"Deactivate\"] = \"deactivate\";\n EventTypes[\"ExitViewport\"] = \"exitviewport\";\n EventTypes[\"EnterViewport\"] = \"enterviewport\";\n EventTypes[\"ExitTrigger\"] = \"exit\";\n EventTypes[\"EnterTrigger\"] = \"enter\";\n EventTypes[\"Connect\"] = \"connect\";\n EventTypes[\"Disconnect\"] = \"disconnect\";\n EventTypes[\"Button\"] = \"button\";\n EventTypes[\"Axis\"] = \"axis\";\n EventTypes[\"Visible\"] = \"visible\";\n EventTypes[\"Hidden\"] = \"hidden\";\n EventTypes[\"Start\"] = \"start\";\n EventTypes[\"Stop\"] = \"stop\";\n EventTypes[\"PointerUp\"] = \"pointerup\";\n EventTypes[\"PointerDown\"] = \"pointerdown\";\n EventTypes[\"PointerMove\"] = \"pointermove\";\n EventTypes[\"PointerEnter\"] = \"pointerenter\";\n EventTypes[\"PointerLeave\"] = \"pointerleave\";\n EventTypes[\"PointerCancel\"] = \"pointercancel\";\n EventTypes[\"PointerWheel\"] = \"pointerwheel\";\n EventTypes[\"Up\"] = \"up\";\n EventTypes[\"Down\"] = \"down\";\n EventTypes[\"Move\"] = \"move\";\n EventTypes[\"Enter\"] = \"enter\";\n EventTypes[\"Leave\"] = \"leave\";\n EventTypes[\"Cancel\"] = \"cancel\";\n EventTypes[\"Wheel\"] = \"wheel\";\n EventTypes[\"Press\"] = \"press\";\n EventTypes[\"Release\"] = \"release\";\n EventTypes[\"Hold\"] = \"hold\";\n EventTypes[\"PointerDragStart\"] = \"pointerdragstart\";\n EventTypes[\"PointerDragEnd\"] = \"pointerdragend\";\n EventTypes[\"PointerDragEnter\"] = \"pointerdragenter\";\n EventTypes[\"PointerDragLeave\"] = \"pointerdragleave\";\n EventTypes[\"PointerDragMove\"] = \"pointerdragmove\";\n EventTypes[\"ActionStart\"] = \"actionstart\";\n EventTypes[\"ActionComplete\"] = \"actioncomplete\";\n EventTypes[\"Add\"] = \"add\";\n EventTypes[\"Remove\"] = \"remove\";\n})(EventTypes || (EventTypes = {}));\n/**\n * Base event type in Excalibur that all other event types derive from. Not all event types are thrown on all Excalibur game objects,\n * some events are unique to a type, others are not.\n *\n */\nclass GameEvent {\n constructor() {\n /**\n * Other target object for this event\n */\n this.other = null;\n this._bubbles = true;\n }\n /**\n * If set to false, prevents event from propagating to other actors. If true it will be propagated\n * to all actors that apply.\n */\n get bubbles() {\n return this._bubbles;\n }\n set bubbles(value) {\n this._bubbles = value;\n }\n /**\n * Prevents event from bubbling\n */\n stopPropagation() {\n this.bubbles = false;\n }\n}\n/**\n * The 'kill' event is emitted on actors when it is killed. The target is the actor that was killed.\n */\nclass KillEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'prekill' event is emitted directly before an actor is killed.\n */\nclass PreKillEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'postkill' event is emitted directly after the actor is killed.\n */\nclass PostKillEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'start' event is emitted on engine when has started and is ready for interaction.\n */\nclass GameStartEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'stop' event is emitted on engine when has been stopped and will no longer take input, update or draw.\n */\nclass GameStopEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'predraw' event is emitted on actors, scenes, and engine before drawing starts. Actors' predraw happens inside their graphics\n * transform so that all drawing takes place with the actor as the origin.\n *\n */\nclass PreDrawEvent extends GameEvent {\n constructor(ctx, elapsed, self) {\n super();\n this.ctx = ctx;\n this.elapsed = elapsed;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'postdraw' event is emitted on actors, scenes, and engine after drawing finishes. Actors' postdraw happens inside their graphics\n * transform so that all drawing takes place with the actor as the origin.\n *\n */\nclass PostDrawEvent extends GameEvent {\n constructor(ctx, elapsed, self) {\n super();\n this.ctx = ctx;\n this.elapsed = elapsed;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'pretransformdraw' event is emitted on actors/entities before any graphics transforms have taken place.\n * Useful if you need to completely customize the draw or modify the transform before drawing in the draw step (for example needing\n * latest camera positions)\n *\n */\nclass PreTransformDrawEvent extends GameEvent {\n constructor(ctx, elapsed, self) {\n super();\n this.ctx = ctx;\n this.elapsed = elapsed;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'posttransformdraw' event is emitted on actors/entities after all graphics have been draw and transforms reset.\n * Useful if you need to completely custom the draw after everything is done.\n *\n */\nclass PostTransformDrawEvent extends GameEvent {\n constructor(ctx, elapsed, self) {\n super();\n this.ctx = ctx;\n this.elapsed = elapsed;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'predebugdraw' event is emitted on actors, scenes, and engine before debug drawing starts.\n */\nclass PreDebugDrawEvent extends GameEvent {\n constructor(ctx, self) {\n super();\n this.ctx = ctx;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'postdebugdraw' event is emitted on actors, scenes, and engine after debug drawing starts.\n */\nclass PostDebugDrawEvent extends GameEvent {\n constructor(ctx, self) {\n super();\n this.ctx = ctx;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'preupdate' event is emitted on actors, scenes, camera, and engine before the update starts.\n */\nclass PreUpdateEvent extends GameEvent {\n constructor(engine, elapsed, self) {\n super();\n this.engine = engine;\n this.elapsed = elapsed;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'postupdate' event is emitted on actors, scenes, camera, and engine after the update ends.\n */\nclass PostUpdateEvent extends GameEvent {\n constructor(engine, elapsed, self) {\n super();\n this.engine = engine;\n this.elapsed = elapsed;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'preframe' event is emitted on the engine, before the frame begins.\n */\nclass PreFrameEvent extends GameEvent {\n constructor(engine, prevStats) {\n super();\n this.engine = engine;\n this.prevStats = prevStats;\n this.target = engine;\n }\n}\n/**\n * The 'postframe' event is emitted on the engine, after a frame ends.\n */\nclass PostFrameEvent extends GameEvent {\n constructor(engine, stats) {\n super();\n this.engine = engine;\n this.stats = stats;\n this.target = engine;\n }\n}\n/**\n * Event received when a gamepad is connected to Excalibur. {@apilink Gamepads} receives this event.\n */\nclass GamepadConnectEvent extends GameEvent {\n constructor(index, gamepad) {\n super();\n this.index = index;\n this.gamepad = gamepad;\n this.target = gamepad;\n }\n}\n/**\n * Event received when a gamepad is disconnected from Excalibur. {@apilink Gamepads} receives this event.\n */\nclass GamepadDisconnectEvent extends GameEvent {\n constructor(index, gamepad) {\n super();\n this.index = index;\n this.gamepad = gamepad;\n this.target = gamepad;\n }\n}\n/**\n * Gamepad button event. See {@apilink Gamepads} for information on responding to controller input. {@apilink Gamepad} instances receive this event;\n */\nclass GamepadButtonEvent extends GameEvent {\n /**\n * @param button The Gamepad button\n * @param value A numeric value between 0 and 1\n */\n constructor(button, value, self) {\n super();\n this.button = button;\n this.value = value;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Gamepad axis event. See {@apilink Gamepads} for information on responding to controller input. {@apilink Gamepad} instances receive this event;\n */\nclass GamepadAxisEvent extends GameEvent {\n /**\n * @param axis The Gamepad axis\n * @param value A numeric value between -1 and 1\n */\n constructor(axis, value, self) {\n super();\n this.axis = axis;\n this.value = value;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event received by the {@apilink Engine} when the browser window is visible on a screen.\n */\nclass VisibleEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event received by the {@apilink Engine} when the browser window is hidden from all screens.\n */\nclass HiddenEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event thrown on an {@apilink Actor | `actor`} when a collision will occur this frame if it resolves\n */\nclass PreCollisionEvent extends GameEvent {\n /**\n * @param self The actor the event was thrown on\n * @param other The actor that will collided with the current actor\n * @param side The side that will be collided with the current actor\n * @param intersection Intersection vector\n */\n constructor(self, other, side, intersection, contact) {\n super();\n this.self = self;\n this.other = other;\n this.side = side;\n this.intersection = intersection;\n this.contact = contact;\n this.target = self;\n }\n}\n/**\n * Event thrown on an {@apilink Actor | `actor`} when a collision has been resolved (body reacted) this frame\n */\nclass PostCollisionEvent extends GameEvent {\n /**\n * @param self The actor the event was thrown on\n * @param other The actor that did collide with the current actor\n * @param side The side that did collide with the current actor\n * @param intersection Intersection vector\n */\n constructor(self, other, side, intersection, contact) {\n super();\n this.self = self;\n this.other = other;\n this.side = side;\n this.intersection = intersection;\n this.contact = contact;\n this.target = self;\n }\n}\nclass ContactStartEvent {\n constructor(self, other, side, contact) {\n this.self = self;\n this.other = other;\n this.side = side;\n this.contact = contact;\n }\n}\nclass ContactEndEvent {\n constructor(self, other, side, lastContact) {\n this.self = self;\n this.other = other;\n this.side = side;\n this.lastContact = lastContact;\n }\n}\nclass CollisionPreSolveEvent {\n constructor(self, other, side, intersection, contact) {\n this.self = self;\n this.other = other;\n this.side = side;\n this.intersection = intersection;\n this.contact = contact;\n }\n}\nclass CollisionPostSolveEvent {\n constructor(self, other, side, intersection, contact) {\n this.self = self;\n this.other = other;\n this.side = side;\n this.intersection = intersection;\n this.contact = contact;\n }\n}\n/**\n * Event thrown the first time an {@apilink Actor | `actor`} collides with another, after an actor is in contact normal collision events are fired.\n */\nclass CollisionStartEvent extends GameEvent {\n /**\n *\n * @param self\n * @param other\n * @param side\n * @param contact\n */\n constructor(self, other, side, contact) {\n super();\n this.self = self;\n this.other = other;\n this.side = side;\n this.contact = contact;\n this.target = self;\n }\n}\n/**\n * Event thrown when the {@apilink Actor | `actor`} is no longer colliding with another\n */\nclass CollisionEndEvent extends GameEvent {\n /**\n *\n */\n constructor(self, other, side, lastContact) {\n super();\n this.self = self;\n this.other = other;\n this.side = side;\n this.lastContact = lastContact;\n this.target = self;\n }\n}\n/**\n * Event thrown on an {@apilink Actor}, {@apilink Scene}, and {@apilink Engine} only once before the first update call\n */\nclass InitializeEvent extends GameEvent {\n /**\n * @param engine The reference to the current engine\n */\n constructor(engine, self) {\n super();\n this.engine = engine;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event thrown on a {@apilink Scene} on activation\n */\nclass ActivateEvent extends GameEvent {\n /**\n * @param context The context for the scene activation\n */\n constructor(context, self) {\n super();\n this.context = context;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event thrown on a {@apilink Scene} on deactivation\n */\nclass DeactivateEvent extends GameEvent {\n /**\n * @param context The context for the scene deactivation\n */\n constructor(context, self) {\n super();\n this.context = context;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event thrown on an {@apilink Actor} when the graphics bounds completely leaves the screen.\n */\nclass ExitViewPortEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event thrown on an {@apilink Actor} when any part of the graphics bounds are on screen.\n */\nclass EnterViewPortEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\nclass EnterTriggerEvent extends GameEvent {\n constructor(self, entity) {\n super();\n this.self = self;\n this.entity = entity;\n this.target = self;\n }\n}\nclass ExitTriggerEvent extends GameEvent {\n constructor(self, entity) {\n super();\n this.self = self;\n this.entity = entity;\n this.target = self;\n }\n}\n/**\n * Event thrown on an {@apilink Actor} when an action starts.\n */\nclass ActionStartEvent extends GameEvent {\n constructor(action, self) {\n super();\n this.action = action;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event thrown on an {@apilink Actor} when an action completes.\n */\nclass ActionCompleteEvent extends GameEvent {\n constructor(action, self) {\n super();\n this.action = action;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event thrown on an [[Actor]] when an Actor added to scene.\n */\nclass AddEvent extends GameEvent {\n constructor(engine, self) {\n super();\n this.engine = engine;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event thrown on an [[Actor]] when an Actor removed from scene.\n */\nclass RemoveEvent extends GameEvent {\n constructor(engine, self) {\n super();\n this.engine = engine;\n this.self = self;\n this.target = self;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Events/MediaEvents.ts\":\n/*!*******************************!*\\\n !*** ./Events/MediaEvents.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MediaEvent: () => (/* binding */ MediaEvent),\n/* harmony export */ NativeSoundEvent: () => (/* binding */ NativeSoundEvent),\n/* harmony export */ NativeSoundProcessedEvent: () => (/* binding */ NativeSoundProcessedEvent)\n/* harmony export */ });\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n\nclass MediaEvent extends _Events__WEBPACK_IMPORTED_MODULE_0__.GameEvent {\n /**\n * Media event cannot bubble\n */\n set bubbles(_value) {\n // stubbed\n }\n /**\n * Media event cannot bubble\n */\n get bubbles() {\n return false;\n }\n /**\n * Media event cannot bubble, so they have no path\n */\n get _path() {\n return null;\n }\n /**\n * Media event cannot bubble, so they have no path\n */\n set _path(_val) {\n // stubbed\n }\n constructor(target, _name = 'MediaEvent') {\n super();\n this.target = target;\n this._name = _name;\n }\n /**\n * Prevents event from bubbling\n */\n stopPropagation() {\n /**\n * Stub\n */\n }\n /**\n * Action, that calls when event happens\n */\n action() {\n /**\n * Stub\n */\n }\n /**\n * Propagate event further through event path\n */\n propagate() {\n /**\n * Stub\n */\n }\n layPath(_actor) {\n /**\n * Stub\n */\n }\n}\nclass NativeSoundEvent extends MediaEvent {\n constructor(target, track) {\n super(target, 'NativeSoundEvent');\n this.track = track;\n }\n}\nclass NativeSoundProcessedEvent extends MediaEvent {\n constructor(target, _processedData) {\n super(target, 'NativeSoundProcessedEvent');\n this._processedData = _processedData;\n this.data = this._processedData;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Flags.ts\":\n/*!******************!*\\\n !*** ./Flags.ts ***!\n \\******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Flags: () => (/* binding */ Flags)\n/* harmony export */ });\n/**\n * Flags is a feature flag implementation for Excalibur. They can only be operated **before {@apilink Engine} construction**\n * after which they are frozen and are read-only.\n *\n * Flags are used to enable experimental or preview features in Excalibur.\n */\nclass Flags {\n /**\n * Force excalibur to load the Canvas 2D graphics context fallback\n * @warning not all features of excalibur are supported in the Canvas 2D fallback\n */\n static useCanvasGraphicsContext() {\n Flags.enable('use-canvas-context');\n }\n /**\n * Force excalibur to use the less optimized image renderer\n */\n static useLegacyImageRenderer() {\n Flags.enable('use-legacy-image-renderer');\n }\n /**\n * Freeze all flag modifications making them readonly\n */\n static freeze() {\n Flags._FROZEN = true;\n }\n /**\n * Resets internal flag state, not meant to be called by users. Only used for testing.\n *\n * Calling this in your game is UNSUPPORTED\n * @internal\n */\n static _reset() {\n Flags._FROZEN = false;\n Flags._FLAGS = {};\n }\n /**\n * Enable a specific feature flag by name. **Note: can only be set before {@apilink Engine} constructor time**\n * @param flagName\n */\n static enable(flagName) {\n if (this._FROZEN) {\n throw Error('Feature flags can only be enabled before Engine constructor time');\n }\n Flags._FLAGS[flagName] = true;\n }\n /**\n * Disable a specific feature flag by name. **Note: can only be set before {@apilink Engine} constructor time**\n * @param flagName\n */\n static disable(flagName) {\n if (this._FROZEN) {\n throw Error('Feature flags can only be disabled before Engine constructor time');\n }\n Flags._FLAGS[flagName] = false;\n }\n /**\n * Check if a flag is enabled. If the flag is disabled or does not exist `false` is returned\n * @param flagName\n */\n static isEnabled(flagName) {\n return !!Flags._FLAGS[flagName];\n }\n /**\n * Show a list of currently known flags\n */\n static show() {\n return Object.keys(Flags._FLAGS);\n }\n}\nFlags._FROZEN = false;\nFlags._FLAGS = {};\n\n\n/***/ }),\n\n/***/ \"./GarbageCollector.ts\":\n/*!*****************************!*\\\n !*** ./GarbageCollector.ts ***!\n \\*****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DefaultGarbageCollectionOptions: () => (/* binding */ DefaultGarbageCollectionOptions),\n/* harmony export */ GarbageCollector: () => (/* binding */ GarbageCollector)\n/* harmony export */ });\nconst DefaultGarbageCollectionOptions = {\n textureCollectInterval: 60000\n // TODO future work to integrate the font and text configuration, refactor existing collection mechanism\n // fontCollectInterval: 60_000,\n // textMeasurementCollectInterval: 60_000,\n};\nclass GarbageCollector {\n constructor(options) {\n this.options = options;\n this._running = false;\n this._collectionMap = new Map();\n this._collectors = new Map();\n /**\n * Runs the collection loop to cleanup any stale resources given the registered collect handlers\n */\n this.collectStaleResources = (deadline) => {\n if (!this._running) {\n return;\n }\n for (const [type, [collector, timeoutInterval]] of this._collectors.entries()) {\n const now = this.options.getTimestamp();\n for (const [resource, [resourceType, time]] of this._collectionMap.entries()) {\n if (type !== resourceType || time + timeoutInterval >= now) {\n continue;\n }\n const collected = collector(resource);\n if (collected) {\n this._collectionMap.delete(resource);\n }\n }\n }\n this._collectHandle = requestIdleCallback(this.collectStaleResources);\n };\n }\n /**\n *\n * @param type Resource type\n * @param timeoutInterval If resource type exceeds interval in milliseconds collect() is called\n * @param collect Collection implementation, returns true if collected\n */\n registerCollector(type, timeoutInterval, collect) {\n this._collectors.set(type, [collect, timeoutInterval]);\n }\n /**\n * Add a resource to be tracked for collection\n * @param type\n * @param resource\n */\n addCollectableResource(type, resource) {\n this._collectionMap.set(resource, [type, this.options.getTimestamp()]);\n }\n /**\n * Update the resource last used timestamp preventing collection\n * @param resource\n */\n touch(resource) {\n const collectionData = this._collectionMap.get(resource);\n if (collectionData) {\n this._collectionMap.set(resource, [collectionData[0], this.options.getTimestamp()]);\n }\n }\n /**\n * Force collect all resources, useful for shutting down a game\n * or if you know that you will not use anything you've allocated before now\n */\n forceCollectAll() {\n for (const [_, [collector]] of this._collectors.entries()) {\n for (const [resource] of this._collectionMap.entries()) {\n const collected = collector(resource);\n if (collected) {\n this._collectionMap.delete(resource);\n }\n }\n }\n }\n /**\n * Starts the garbage collection loop\n */\n start() {\n this._running = true;\n this.collectStaleResources();\n }\n /**\n * Stops the garbage collection loop\n */\n stop() {\n this._running = false;\n cancelIdleCallback(this._collectHandle);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Animation.ts\":\n/*!*******************************!*\\\n !*** ./Graphics/Animation.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Animation: () => (/* binding */ Animation),\n/* harmony export */ AnimationDirection: () => (/* binding */ AnimationDirection),\n/* harmony export */ AnimationEvents: () => (/* binding */ AnimationEvents),\n/* harmony export */ AnimationStrategy: () => (/* binding */ AnimationStrategy)\n/* harmony export */ });\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n\nvar AnimationDirection;\n(function (AnimationDirection) {\n /**\n * Animation is playing forwards\n */\n AnimationDirection[\"Forward\"] = \"forward\";\n /**\n * Animation is playing backwards\n */\n AnimationDirection[\"Backward\"] = \"backward\";\n})(AnimationDirection || (AnimationDirection = {}));\nvar AnimationStrategy;\n(function (AnimationStrategy) {\n /**\n * Animation ends without displaying anything\n */\n AnimationStrategy[\"End\"] = \"end\";\n /**\n * Animation loops to the first frame after the last frame\n */\n AnimationStrategy[\"Loop\"] = \"loop\";\n /**\n * Animation plays to the last frame, then backwards to the first frame, then repeats\n */\n AnimationStrategy[\"PingPong\"] = \"pingpong\";\n /**\n * Animation ends stopping on the last frame\n */\n AnimationStrategy[\"Freeze\"] = \"freeze\";\n})(AnimationStrategy || (AnimationStrategy = {}));\nconst AnimationEvents = {\n Frame: 'frame',\n Loop: 'loop',\n End: 'end'\n};\n/**\n * Create an Animation given a list of {@apilink Frame | `frames`} in {@apilink AnimationOptions}\n *\n * To create an Animation from a {@apilink SpriteSheet}, use {@apilink Animation.fromSpriteSheet}\n */\nclass Animation extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n constructor(options) {\n var _a, _b, _c;\n super(options);\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_1__.EventEmitter();\n this.frames = [];\n this.strategy = AnimationStrategy.Loop;\n this.frameDuration = 100;\n this._idempotencyToken = -1;\n this._firstTick = true;\n this._currentFrame = 0;\n this._timeLeftInFrame = 0;\n this._pingPongDirection = 1;\n this._done = false;\n this._playing = true;\n this._speed = 1;\n this._reversed = false;\n this.frames = options.frames;\n this.speed = (_a = options.speed) !== null && _a !== void 0 ? _a : this.speed;\n this.strategy = (_b = options.strategy) !== null && _b !== void 0 ? _b : this.strategy;\n this.frameDuration = options.totalDuration ? options.totalDuration / this.frames.length : (_c = options.frameDuration) !== null && _c !== void 0 ? _c : this.frameDuration;\n if (options.reverse) {\n this.reverse();\n }\n this.goToFrame(0);\n }\n clone() {\n return new Animation({\n frames: this.frames.map((f) => ({ ...f })),\n frameDuration: this.frameDuration,\n speed: this.speed,\n reverse: this._reversed,\n strategy: this.strategy,\n ...this.cloneGraphicOptions()\n });\n }\n get width() {\n const maybeFrame = this.currentFrame;\n if (maybeFrame && maybeFrame.graphic) {\n return Math.abs(maybeFrame.graphic.width * this.scale.x);\n }\n return 0;\n }\n get height() {\n const maybeFrame = this.currentFrame;\n if (maybeFrame && maybeFrame.graphic) {\n return Math.abs(maybeFrame.graphic.height * this.scale.y);\n }\n return 0;\n }\n /**\n * Create an Animation from a {@apilink SpriteSheet}, a list of indices into the sprite sheet, a duration per frame\n * and optional {@apilink AnimationStrategy}\n *\n * Example:\n * ```typescript\n * const spriteSheet = SpriteSheet.fromImageSource({...});\n *\n * const anim = Animation.fromSpriteSheet(spriteSheet, range(0, 5), 200, AnimationStrategy.Loop);\n * ```\n * @param spriteSheet ex.SpriteSheet\n * @param spriteSheetIndex 0 based index from left to right, top down (row major order) of the ex.SpriteSheet\n * @param durationPerFrame duration per frame in milliseconds\n * @param strategy Optional strategy, default AnimationStrategy.Loop\n */\n static fromSpriteSheet(spriteSheet, spriteSheetIndex, durationPerFrame, strategy = AnimationStrategy.Loop) {\n const maxIndex = spriteSheet.sprites.length - 1;\n const invalidIndices = spriteSheetIndex.filter((index) => index < 0 || index > maxIndex);\n if (invalidIndices.length) {\n Animation._LOGGER.warn(`Indices into SpriteSheet were provided that don\\'t exist: ${invalidIndices.join(',')} no frame will be shown`);\n }\n return new Animation({\n frames: spriteSheet.sprites\n .filter((_, index) => spriteSheetIndex.indexOf(index) > -1)\n .map((f) => ({\n graphic: f,\n duration: durationPerFrame\n })),\n strategy: strategy\n });\n }\n /**\n * Create an {@apilink Animation} from a {@apilink SpriteSheet} given a list of coordinates\n *\n * Example:\n * ```typescript\n * const spriteSheet = SpriteSheet.fromImageSource({...});\n *\n * const anim = Animation.fromSpriteSheetCoordinates({\n * spriteSheet,\n * frameCoordinates: [\n * {x: 0, y: 5, duration: 100, options { flipHorizontal: true }},\n * {x: 1, y: 5, duration: 200},\n * {x: 2, y: 5},\n * {x: 3, y: 5}\n * ],\n * strategy: AnimationStrategy.PingPong\n * });\n * ```\n * @param options\n * @returns Animation\n */\n static fromSpriteSheetCoordinates(options) {\n var _a;\n const { spriteSheet, frameCoordinates, durationPerFrame, durationPerFrameMs, speed, strategy, reverse } = options;\n const defaultDuration = (_a = durationPerFrame !== null && durationPerFrame !== void 0 ? durationPerFrame : durationPerFrameMs) !== null && _a !== void 0 ? _a : 100;\n const frames = [];\n for (const coord of frameCoordinates) {\n const { x, y, duration, options } = coord;\n const sprite = spriteSheet.getSprite(x, y, options);\n if (sprite) {\n frames.push({\n graphic: sprite,\n duration: duration !== null && duration !== void 0 ? duration : defaultDuration\n });\n }\n else {\n Animation._LOGGER.warn(`Skipping frame! SpriteSheet does not have coordinate (${x}, ${y}), please check your SpriteSheet to confirm that sprite exists`);\n }\n }\n return new Animation({\n frames,\n strategy,\n speed,\n reverse\n });\n }\n /**\n * Current animation speed\n *\n * 1 meaning normal 1x speed.\n * 2 meaning 2x speed and so on.\n */\n get speed() {\n return this._speed;\n }\n /**\n * Current animation speed\n *\n * 1 meaning normal 1x speed.\n * 2 meaning 2x speed and so on.\n */\n set speed(val) {\n this._speed = (0,_Math_util__WEBPACK_IMPORTED_MODULE_2__.clamp)(Math.abs(val), 0, Infinity);\n }\n /**\n * Returns the current Frame of the animation\n *\n * Use {@apilink Animation.currentFrameIndex} to get the frame number and\n * {@apilink Animation.goToFrame} to set the current frame index\n */\n get currentFrame() {\n if (this._currentFrame >= 0 && this._currentFrame < this.frames.length) {\n return this.frames[this._currentFrame];\n }\n return null;\n }\n /**\n * Returns the current frame index of the animation\n *\n * Use {@apilink Animation.currentFrame} to grab the current {@apilink Frame} object\n */\n get currentFrameIndex() {\n return this._currentFrame;\n }\n /**\n * Returns the amount of time in milliseconds left in the current frame\n */\n get currentFrameTimeLeft() {\n return this._timeLeftInFrame;\n }\n /**\n * Returns `true` if the animation is playing\n */\n get isPlaying() {\n return this._playing;\n }\n get isReversed() {\n return this._reversed;\n }\n /**\n * Reverses the play direction of the Animation, this preserves the current frame\n */\n reverse() {\n // Don't mutate with the original frame list, create a copy\n this.frames = this.frames.slice().reverse();\n this._reversed = !this._reversed;\n }\n /**\n * Returns the current play direction of the animation\n */\n get direction() {\n // Keep logically consistent with ping-pong direction\n // If ping-pong is forward = 1 and reversed is true then we are logically reversed\n const reversed = this._reversed && this._pingPongDirection === 1 ? true : false;\n return reversed ? AnimationDirection.Backward : AnimationDirection.Forward;\n }\n /**\n * Plays or resumes the animation from the current frame\n */\n play() {\n this._playing = true;\n }\n /**\n * Pauses the animation on the current frame\n */\n pause() {\n this._playing = false;\n this._firstTick = true; // firstTick must be set to emit the proper frame event\n }\n /**\n * Reset the animation back to the beginning, including if the animation were done\n */\n reset() {\n this._done = false;\n this._firstTick = true;\n this._currentFrame = 0;\n this._timeLeftInFrame = this.frameDuration;\n const maybeFrame = this.frames[this._currentFrame];\n if (maybeFrame) {\n this._timeLeftInFrame = (maybeFrame === null || maybeFrame === void 0 ? void 0 : maybeFrame.duration) || this.frameDuration;\n }\n }\n /**\n * Returns `true` if the animation can end\n */\n get canFinish() {\n switch (this.strategy) {\n case AnimationStrategy.End:\n case AnimationStrategy.Freeze: {\n return true;\n }\n default: {\n return false;\n }\n }\n }\n /**\n * Returns `true` if the animation is done, for looping type animations\n * `ex.AnimationStrategy.PingPong` and `ex.AnimationStrategy.Loop` this will always return `false`\n *\n * See the `ex.Animation.canFinish()` method to know if an animation type can end\n */\n get done() {\n return this._done;\n }\n /**\n * Jump the animation immediately to a specific frame if it exists\n *\n * Optionally specify an override for the duration of the frame, useful for\n * keeping multiple animations in sync with one another.\n * @param frameNumber\n * @param duration\n */\n goToFrame(frameNumber, duration) {\n this._currentFrame = frameNumber;\n this._timeLeftInFrame = duration !== null && duration !== void 0 ? duration : this.frameDuration;\n const maybeFrame = this.frames[this._currentFrame];\n if (maybeFrame && !this._done) {\n this._timeLeftInFrame = duration !== null && duration !== void 0 ? duration : ((maybeFrame === null || maybeFrame === void 0 ? void 0 : maybeFrame.duration) || this.frameDuration);\n this.events.emit('frame', { ...maybeFrame, frameIndex: this.currentFrameIndex });\n }\n }\n _nextFrame() {\n const currentFrame = this._currentFrame;\n if (this._done) {\n return currentFrame;\n }\n let next = -1;\n switch (this.strategy) {\n case AnimationStrategy.Loop: {\n next = (currentFrame + 1) % this.frames.length;\n if (next === 0) {\n this.events.emit('loop', this);\n }\n break;\n }\n case AnimationStrategy.End: {\n next = currentFrame + 1;\n if (next >= this.frames.length) {\n this._done = true;\n this._currentFrame = this.frames.length;\n this.events.emit('end', this);\n }\n break;\n }\n case AnimationStrategy.Freeze: {\n next = (0,_Math_util__WEBPACK_IMPORTED_MODULE_2__.clamp)(currentFrame + 1, 0, this.frames.length - 1);\n if (next >= this.frames.length - 1) {\n this._done = true;\n this.events.emit('end', this);\n }\n break;\n }\n case AnimationStrategy.PingPong: {\n if (currentFrame + this._pingPongDirection >= this.frames.length) {\n this._pingPongDirection = -1;\n this.events.emit('loop', this);\n }\n if (currentFrame + this._pingPongDirection < 0) {\n this._pingPongDirection = 1;\n this.events.emit('loop', this);\n }\n next = currentFrame + (this._pingPongDirection % this.frames.length);\n break;\n }\n }\n return next;\n }\n /**\n * Called internally by Excalibur to update the state of the animation potential update the current frame\n * @param elapsed Milliseconds elapsed\n * @param idempotencyToken Prevents double ticking in a frame by passing a unique token to the frame\n */\n tick(elapsed, idempotencyToken = 0) {\n if (this._idempotencyToken === idempotencyToken) {\n return;\n }\n this._idempotencyToken = idempotencyToken;\n if (!this._playing) {\n return;\n }\n // if it's the first frame emit frame event\n if (this._firstTick) {\n this._firstTick = false;\n this.events.emit('frame', { ...this.currentFrame, frameIndex: this.currentFrameIndex });\n }\n this._timeLeftInFrame -= elapsed * this._speed;\n if (this._timeLeftInFrame <= 0) {\n this.goToFrame(this._nextFrame());\n }\n }\n _drawImage(ctx, x, y) {\n if (this.currentFrame && this.currentFrame.graphic) {\n this.currentFrame.graphic.draw(ctx, x, y);\n }\n }\n}\nAnimation._LOGGER = _Util_Log__WEBPACK_IMPORTED_MODULE_3__.Logger.getInstance();\n\n\n/***/ }),\n\n/***/ \"./Graphics/Canvas.ts\":\n/*!****************************!*\\\n !*** ./Graphics/Canvas.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Canvas: () => (/* binding */ Canvas)\n/* harmony export */ });\n/* harmony import */ var _Raster__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Raster */ \"./Graphics/Raster.ts\");\n\n/**\n * A canvas {@apilink Graphic} to provide an adapter between the 2D Canvas API and the {@apilink ExcaliburGraphicsContext}.\n *\n * The {@apilink Canvas} works by re-rastering a draw handler to a HTMLCanvasElement for every draw which is then passed\n * to the {@apilink ExcaliburGraphicsContext} implementation as a rendered image.\n *\n * **Low performance API**\n */\nclass Canvas extends _Raster__WEBPACK_IMPORTED_MODULE_0__.Raster {\n /**\n * Return the 2D graphics context of this canvas\n */\n get ctx() {\n return this._ctx;\n }\n constructor(_options = {}) {\n super(_options);\n this._options = _options;\n }\n clone() {\n return new Canvas({\n ...this._options,\n ...this.cloneGraphicOptions(),\n ...this.cloneRasterOptions()\n });\n }\n execute(ctx) {\n var _a, _b;\n if ((_a = this._options) === null || _a === void 0 ? void 0 : _a.draw) {\n (_b = this._options) === null || _b === void 0 ? void 0 : _b.draw(ctx);\n }\n if (!this._options.cache) {\n this.flagDirty();\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Circle.ts\":\n/*!****************************!*\\\n !*** ./Graphics/Circle.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Circle: () => (/* binding */ Circle)\n/* harmony export */ });\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Raster__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Raster */ \"./Graphics/Raster.ts\");\n\n\n/**\n * A circle {@apilink Graphic} for drawing circles to the {@apilink ExcaliburGraphicsContext}\n *\n * Circles default to {@apilink ImageFiltering.Blended}\n */\nclass Circle extends _Raster__WEBPACK_IMPORTED_MODULE_0__.Raster {\n get radius() {\n return this._radius;\n }\n set radius(value) {\n this._radius = value;\n this.width = this._radius * 2;\n this.height = this._radius * 2;\n this.flagDirty();\n }\n constructor(options) {\n var _a, _b, _c;\n super(options);\n this._radius = 0;\n const lineWidth = (_a = options.lineWidth) !== null && _a !== void 0 ? _a : (options.strokeColor ? 1 : 0); // default lineWidth in canvas is 1px\n this.padding = (_b = options.padding) !== null && _b !== void 0 ? _b : 2 + lineWidth / 2; // default 2 padding for circles looks nice\n this.radius = options.radius;\n this.filtering = (_c = options.filtering) !== null && _c !== void 0 ? _c : _Filtering__WEBPACK_IMPORTED_MODULE_1__.ImageFiltering.Blended;\n this.rasterize();\n }\n clone() {\n return new Circle({\n radius: this.radius,\n ...this.cloneGraphicOptions(),\n ...this.cloneRasterOptions()\n });\n }\n execute(ctx) {\n if (this.radius > 0) {\n ctx.beginPath();\n ctx.arc(this.radius, this.radius, this.radius, 0, Math.PI * 2);\n if (this.color) {\n ctx.fill();\n }\n if (this.strokeColor) {\n ctx.stroke();\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/ExcaliburGraphicsContext.ts\":\n/*!******************************************************!*\\\n !*** ./Graphics/Context/ExcaliburGraphicsContext.ts ***!\n \\******************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DefaultAntialiasOptions: () => (/* binding */ DefaultAntialiasOptions),\n/* harmony export */ DefaultPixelArtOptions: () => (/* binding */ DefaultPixelArtOptions)\n/* harmony export */ });\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Filtering */ \"./Graphics/Filtering.ts\");\n\nconst DefaultAntialiasOptions = {\n pixelArtSampler: false,\n nativeContextAntialiasing: false,\n multiSampleAntialiasing: true,\n filtering: _Filtering__WEBPACK_IMPORTED_MODULE_0__.ImageFiltering.Blended,\n canvasImageRendering: 'auto'\n};\nconst DefaultPixelArtOptions = {\n pixelArtSampler: true,\n nativeContextAntialiasing: false,\n multiSampleAntialiasing: true,\n filtering: _Filtering__WEBPACK_IMPORTED_MODULE_0__.ImageFiltering.Blended,\n canvasImageRendering: 'auto'\n};\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/ExcaliburGraphicsContext2DCanvas.ts\":\n/*!**************************************************************!*\\\n !*** ./Graphics/Context/ExcaliburGraphicsContext2DCanvas.ts ***!\n \\**************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ExcaliburGraphicsContext2DCanvas: () => (/* binding */ ExcaliburGraphicsContext2DCanvas)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Color */ \"./Color.ts\");\n/* harmony import */ var _state_stack__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./state-stack */ \"./Graphics/Context/state-stack.ts\");\n/* harmony import */ var _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n/* harmony import */ var _debug_text__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./debug-text */ \"./Graphics/Context/debug-text.ts\");\n\n\n\n\nconst pixelSnapEpsilon = 0.0001;\nclass ExcaliburGraphicsContext2DCanvasDebug {\n constructor(_ex) {\n this._ex = _ex;\n this._debugText = new _debug_text__WEBPACK_IMPORTED_MODULE_0__.DebugText();\n }\n /**\n * Draw a debug rectangle to the context\n * @param x\n * @param y\n * @param width\n * @param height\n */\n drawRect(x, y, width, height) {\n this._ex.__ctx.save();\n this._ex.__ctx.strokeStyle = 'red';\n this._ex.__ctx.strokeRect(this._ex.snapToPixel ? ~~(x + pixelSnapEpsilon) : x, this._ex.snapToPixel ? ~~(y + pixelSnapEpsilon) : y, this._ex.snapToPixel ? ~~(width + pixelSnapEpsilon) : width, this._ex.snapToPixel ? ~~(height + pixelSnapEpsilon) : height);\n this._ex.__ctx.restore();\n }\n drawLine(start, end, lineOptions = { color: _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Black }) {\n var _a, _b;\n this._ex.__ctx.save();\n this._ex.__ctx.beginPath();\n this._ex.__ctx.strokeStyle = (_b = (_a = lineOptions.color) === null || _a === void 0 ? void 0 : _a.toString()) !== null && _b !== void 0 ? _b : '';\n this._ex.__ctx.moveTo(this._ex.snapToPixel ? ~~(start.x + pixelSnapEpsilon) : start.x, this._ex.snapToPixel ? ~~(start.y + pixelSnapEpsilon) : start.y);\n this._ex.__ctx.lineTo(this._ex.snapToPixel ? ~~(end.x + pixelSnapEpsilon) : end.x, this._ex.snapToPixel ? ~~(end.y + pixelSnapEpsilon) : end.y);\n this._ex.__ctx.lineWidth = 2;\n this._ex.__ctx.stroke();\n this._ex.__ctx.closePath();\n this._ex.__ctx.restore();\n }\n drawPoint(point, pointOptions = { color: _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Black, size: 5 }) {\n this._ex.__ctx.save();\n this._ex.__ctx.beginPath();\n this._ex.__ctx.fillStyle = pointOptions.color.toString();\n this._ex.__ctx.arc(this._ex.snapToPixel ? ~~(point.x + pixelSnapEpsilon) : point.x, this._ex.snapToPixel ? ~~(point.y + pixelSnapEpsilon) : point.y, pointOptions.size, 0, Math.PI * 2);\n this._ex.__ctx.fill();\n this._ex.__ctx.closePath();\n this._ex.__ctx.restore();\n }\n drawText(text, pos) {\n this._debugText.write(this._ex, text, pos);\n }\n}\nclass ExcaliburGraphicsContext2DCanvas {\n get width() {\n return this.__ctx.canvas.width;\n }\n get height() {\n return this.__ctx.canvas.height;\n }\n get opacity() {\n return this._state.current.opacity;\n }\n set opacity(value) {\n this._state.current.opacity = value;\n }\n get tint() {\n return this._state.current.tint;\n }\n set tint(color) {\n this._state.current.tint = color;\n }\n get smoothing() {\n return this.__ctx.imageSmoothingEnabled;\n }\n set smoothing(value) {\n this.__ctx.imageSmoothingEnabled = value;\n }\n constructor(options) {\n /**\n * Unused in Canvas implementation\n */\n this.useDrawSorting = false;\n /**\n * Unused in Canvas implementation\n */\n this.z = 0;\n this.backgroundColor = _Color__WEBPACK_IMPORTED_MODULE_1__.Color.ExcaliburBlue;\n this._state = new _state_stack__WEBPACK_IMPORTED_MODULE_2__.StateStack();\n this.snapToPixel = false;\n this.debug = new ExcaliburGraphicsContext2DCanvasDebug(this);\n const { canvasElement, context, enableTransparency, snapToPixel, antialiasing: smoothing, backgroundColor } = options;\n this.__ctx =\n context !== null && context !== void 0 ? context : canvasElement.getContext('2d', {\n alpha: enableTransparency !== null && enableTransparency !== void 0 ? enableTransparency : true\n });\n if (!this.__ctx) {\n throw new Error('Cannot build new ExcaliburGraphicsContext2D for some reason!');\n }\n this.backgroundColor = backgroundColor !== null && backgroundColor !== void 0 ? backgroundColor : this.backgroundColor;\n this.snapToPixel = snapToPixel !== null && snapToPixel !== void 0 ? snapToPixel : this.snapToPixel;\n this.smoothing = smoothing !== null && smoothing !== void 0 ? smoothing : this.smoothing;\n }\n resetTransform() {\n this.__ctx.resetTransform();\n }\n updateViewport(_resolution) {\n // pass\n }\n drawImage(image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight) {\n if (swidth === 0 || sheight === 0) {\n return; // zero dimension dest exit early\n }\n else if (dwidth === 0 || dheight === 0) {\n return; // zero dimension dest exit early\n }\n else if (image.width === 0 || image.height === 0) {\n return; // zero dimension source exit early\n }\n this.__ctx.globalAlpha = this.opacity;\n const args = [image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight]\n .filter((a) => a !== undefined)\n .map((a) => (typeof a === 'number' && this.snapToPixel ? ~~a : a));\n this.__ctx.drawImage.apply(this.__ctx, args);\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_3__.GraphicsDiagnostics.DrawCallCount++;\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_3__.GraphicsDiagnostics.DrawnImagesCount = 1;\n }\n drawLine(start, end, color, thickness = 1) {\n this.__ctx.save();\n this.__ctx.beginPath();\n this.__ctx.strokeStyle = color.toString();\n this.__ctx.moveTo(this.snapToPixel ? ~~(start.x + pixelSnapEpsilon) : start.x, this.snapToPixel ? ~~(start.y + pixelSnapEpsilon) : start.y);\n this.__ctx.lineTo(this.snapToPixel ? ~~(end.x + pixelSnapEpsilon) : end.x, this.snapToPixel ? ~~(end.y + pixelSnapEpsilon) : end.y);\n this.__ctx.lineWidth = thickness;\n this.__ctx.stroke();\n this.__ctx.closePath();\n this.__ctx.restore();\n }\n drawRectangle(pos, width, height, color) {\n this.__ctx.save();\n this.__ctx.fillStyle = color.toString();\n this.__ctx.fillRect(this.snapToPixel ? ~~(pos.x + pixelSnapEpsilon) : pos.x, this.snapToPixel ? ~~(pos.y + pixelSnapEpsilon) : pos.y, this.snapToPixel ? ~~(width + pixelSnapEpsilon) : width, this.snapToPixel ? ~~(height + pixelSnapEpsilon) : height);\n this.__ctx.restore();\n }\n drawCircle(pos, radius, color, stroke, thickness) {\n this.__ctx.save();\n this.__ctx.beginPath();\n if (stroke) {\n this.__ctx.strokeStyle = stroke.toString();\n }\n if (thickness) {\n this.__ctx.lineWidth = thickness;\n }\n this.__ctx.fillStyle = color.toString();\n this.__ctx.arc(this.snapToPixel ? ~~(pos.x + pixelSnapEpsilon) : pos.x, this.snapToPixel ? ~~(pos.y + pixelSnapEpsilon) : pos.y, radius, 0, Math.PI * 2);\n this.__ctx.fill();\n if (stroke) {\n this.__ctx.stroke();\n }\n this.__ctx.closePath();\n this.__ctx.restore();\n }\n /**\n * Save the current state of the canvas to the stack (transforms and opacity)\n */\n save() {\n this.__ctx.save();\n this._state.save();\n }\n /**\n * Restore the state of the canvas from the stack\n */\n restore() {\n this.__ctx.restore();\n this._state.restore();\n }\n /**\n * Translate the origin of the context by an x and y\n * @param x\n * @param y\n */\n translate(x, y) {\n this.__ctx.translate(this.snapToPixel ? ~~(x + pixelSnapEpsilon) : x, this.snapToPixel ? ~~(y + pixelSnapEpsilon) : y);\n }\n /**\n * Rotate the context about the current origin\n */\n rotate(angle) {\n this.__ctx.rotate(angle);\n }\n /**\n * Scale the context by an x and y factor\n * @param x\n * @param y\n */\n scale(x, y) {\n this.__ctx.scale(x, y);\n }\n getTransform() {\n throw new Error('Not implemented');\n }\n multiply(_m) {\n this.__ctx.setTransform(this.__ctx.getTransform().multiply(_m.toDOMMatrix()));\n }\n addPostProcessor(_postprocessor) {\n // pass\n }\n removePostProcessor(_postprocessor) {\n // pass\n }\n clearPostProcessors() {\n // pass\n }\n updatePostProcessors(elapsed) {\n // pass\n }\n beginDrawLifecycle() {\n // pass\n }\n endDrawLifecycle() {\n // pass\n }\n set material(material) {\n this._state.current.material = material;\n }\n get material() {\n return this._state.current.material;\n }\n createMaterial(options) {\n // pass\n return null;\n }\n clear() {\n // Clear frame\n this.__ctx.clearRect(0, 0, this.width, this.height);\n this.__ctx.fillStyle = this.backgroundColor.toString();\n this.__ctx.fillRect(0, 0, this.width, this.height);\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_3__.GraphicsDiagnostics.clear();\n }\n /**\n * Flushes the batched draw calls to the screen\n */\n flush() {\n // pass\n }\n dispose() {\n this.__ctx = undefined;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\":\n/*!***********************************************************!*\\\n !*** ./Graphics/Context/ExcaliburGraphicsContextWebGL.ts ***!\n \\***********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ExcaliburGraphicsContextWebGL: () => (/* binding */ ExcaliburGraphicsContextWebGL),\n/* harmony export */ pixelSnapEpsilon: () => (/* binding */ pixelSnapEpsilon)\n/* harmony export */ });\n/* harmony import */ var _Math_matrix__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../Math/matrix */ \"./Math/matrix.ts\");\n/* harmony import */ var _transform_stack__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./transform-stack */ \"./Graphics/Context/transform-stack.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Color */ \"./Color.ts\");\n/* harmony import */ var _state_stack__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./state-stack */ \"./Graphics/Context/state-stack.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _debug_text__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./debug-text */ \"./Graphics/Context/debug-text.ts\");\n/* harmony import */ var _render_target__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./render-target */ \"./Graphics/Context/render-target.ts\");\n/* harmony import */ var _texture_loader__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./texture-loader */ \"./Graphics/Context/texture-loader.ts\");\n/* harmony import */ var _line_renderer_line_renderer__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./line-renderer/line-renderer */ \"./Graphics/Context/line-renderer/line-renderer.ts\");\n/* harmony import */ var _point_renderer_point_renderer__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./point-renderer/point-renderer */ \"./Graphics/Context/point-renderer/point-renderer.ts\");\n/* harmony import */ var _screen_pass_painter_screen_pass_painter__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./screen-pass-painter/screen-pass-painter */ \"./Graphics/Context/screen-pass-painter/screen-pass-painter.ts\");\n/* harmony import */ var _image_renderer_image_renderer__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./image-renderer/image-renderer */ \"./Graphics/Context/image-renderer/image-renderer.ts\");\n/* harmony import */ var _rectangle_renderer_rectangle_renderer__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./rectangle-renderer/rectangle-renderer */ \"./Graphics/Context/rectangle-renderer/rectangle-renderer.ts\");\n/* harmony import */ var _circle_renderer_circle_renderer__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./circle-renderer/circle-renderer */ \"./Graphics/Context/circle-renderer/circle-renderer.ts\");\n/* harmony import */ var _Util_Pool__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Util/Pool */ \"./Util/Pool.ts\");\n/* harmony import */ var _draw_call__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./draw-call */ \"./Graphics/Context/draw-call.ts\");\n/* harmony import */ var _material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./material */ \"./Graphics/Context/material.ts\");\n/* harmony import */ var _material_renderer_material_renderer__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./material-renderer/material-renderer */ \"./Graphics/Context/material-renderer/material-renderer.ts\");\n/* harmony import */ var _shader__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _particle_renderer_particle_renderer__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./particle-renderer/particle-renderer */ \"./Graphics/Context/particle-renderer/particle-renderer.ts\");\n/* harmony import */ var _image_renderer_v2_image_renderer_v2__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./image-renderer-v2/image-renderer-v2 */ \"./Graphics/Context/image-renderer-v2/image-renderer-v2.ts\");\n/* harmony import */ var _Flags__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Flags */ \"./Flags.ts\");\n\n\n\n\n\n\n\n\n\n// renderers\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst pixelSnapEpsilon = 0.0001;\nclass ExcaliburGraphicsContextWebGLDebug {\n constructor(_webglCtx) {\n this._webglCtx = _webglCtx;\n this._debugText = new _debug_text__WEBPACK_IMPORTED_MODULE_0__.DebugText();\n }\n /**\n * Draw a debugging rectangle to the context\n * @param x\n * @param y\n * @param width\n * @param height\n */\n drawRect(x, y, width, height, rectOptions = { color: _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Black }) {\n this.drawLine((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(x, y), (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(x + width, y), { ...rectOptions });\n this.drawLine((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(x + width, y), (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(x + width, y + height), { ...rectOptions });\n this.drawLine((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(x + width, y + height), (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(x, y + height), { ...rectOptions });\n this.drawLine((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(x, y + height), (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(x, y), { ...rectOptions });\n }\n /**\n * Draw a debugging line to the context\n * @param start\n * @param end\n * @param lineOptions\n */\n drawLine(start, end, lineOptions) {\n var _a;\n this._webglCtx.draw('ex.line', start, end, (_a = lineOptions === null || lineOptions === void 0 ? void 0 : lineOptions.color) !== null && _a !== void 0 ? _a : _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Black);\n }\n /**\n * Draw a debugging point to the context\n * @param point\n * @param pointOptions\n */\n drawPoint(point, pointOptions = { color: _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Black, size: 5 }) {\n this._webglCtx.draw('ex.point', point, pointOptions.color, pointOptions.size);\n }\n drawText(text, pos) {\n this._debugText.write(this._webglCtx, text, pos);\n }\n}\nclass ExcaliburGraphicsContextWebGL {\n get z() {\n return this._state.current.z;\n }\n set z(value) {\n this._state.current.z = value;\n }\n get opacity() {\n return this._state.current.opacity;\n }\n set opacity(value) {\n this._state.current.opacity = value;\n }\n get tint() {\n return this._state.current.tint;\n }\n set tint(color) {\n this._state.current.tint = color;\n }\n get width() {\n return this.__gl.canvas.width;\n }\n get height() {\n return this.__gl.canvas.height;\n }\n get ortho() {\n return this._ortho;\n }\n /**\n * Checks the underlying webgl implementation if the requested internal resolution is supported\n * @param dim\n */\n checkIfResolutionSupported(dim) {\n // Slight hack based on this thread https://groups.google.com/g/webgl-dev-list/c/AHONvz3oQTo\n let supported = true;\n if (dim.width > 4096 || dim.height > 4096) {\n supported = false;\n }\n return supported;\n }\n constructor(options) {\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_3__.Logger.getInstance();\n this._renderers = new Map();\n this.imageRenderer = _Flags__WEBPACK_IMPORTED_MODULE_4__.Flags.isEnabled('use-legacy-image-renderer') ? 'ex.image' : 'ex.image-v2';\n this._isDrawLifecycle = false;\n this.useDrawSorting = true;\n this._drawCallPool = new _Util_Pool__WEBPACK_IMPORTED_MODULE_5__.Pool(() => new _draw_call__WEBPACK_IMPORTED_MODULE_6__.DrawCall(), undefined, 4000);\n this._drawCallIndex = 0;\n this._drawCalls = new Array(4000).fill(null);\n // Postprocessing is a tuple with 2 render targets, these are flip-flopped during the postprocessing process\n this._postProcessTargets = [];\n this._postprocessors = [];\n this._transform = new _transform_stack__WEBPACK_IMPORTED_MODULE_7__.TransformStack();\n this._state = new _state_stack__WEBPACK_IMPORTED_MODULE_8__.StateStack();\n /**\n * Snaps the drawing x/y coordinate to the nearest whole pixel\n */\n this.snapToPixel = false;\n /**\n * Native context smoothing\n */\n this.smoothing = false;\n /**\n * Whether the pixel art sampler is enabled for smooth sub pixel anti-aliasing\n */\n this.pixelArtSampler = false;\n /**\n * UV padding in pixels to use in internal image rendering to prevent texture bleed\n *\n */\n this.uvPadding = 0.01;\n this.backgroundColor = _Color__WEBPACK_IMPORTED_MODULE_1__.Color.ExcaliburBlue;\n this.multiSampleAntialiasing = true;\n this.transparency = true;\n this._isContextLost = false;\n this._disposed = false;\n this._imageToWidth = new Map();\n this._imageToHeight = new Map();\n this.debug = new ExcaliburGraphicsContextWebGLDebug(this);\n this._totalPostProcessorTime = 0;\n const { canvasElement, context, enableTransparency, antialiasing, uvPadding, multiSampleAntialiasing, pixelArtSampler, powerPreference, snapToPixel, backgroundColor, useDrawSorting, garbageCollector, handleContextLost, handleContextRestored } = options;\n this.__gl =\n context !== null && context !== void 0 ? context : canvasElement.getContext('webgl2', {\n antialias: antialiasing !== null && antialiasing !== void 0 ? antialiasing : this.smoothing,\n premultipliedAlpha: false,\n alpha: enableTransparency !== null && enableTransparency !== void 0 ? enableTransparency : this.transparency,\n depth: false,\n powerPreference: powerPreference !== null && powerPreference !== void 0 ? powerPreference : 'high-performance'\n });\n if (!this.__gl) {\n throw Error('Failed to retrieve webgl context from browser');\n }\n if (handleContextLost) {\n this.__gl.canvas.addEventListener('webglcontextlost', handleContextLost, false);\n }\n if (handleContextRestored) {\n this.__gl.canvas.addEventListener('webglcontextrestored', handleContextRestored, false);\n }\n this.__gl.canvas.addEventListener('webglcontextlost', () => {\n this._isContextLost = true;\n });\n this.__gl.canvas.addEventListener('webglcontextrestored', () => {\n this._isContextLost = false;\n });\n this.textureLoader = new _texture_loader__WEBPACK_IMPORTED_MODULE_9__.TextureLoader(this.__gl, garbageCollector);\n this.snapToPixel = snapToPixel !== null && snapToPixel !== void 0 ? snapToPixel : this.snapToPixel;\n this.smoothing = antialiasing !== null && antialiasing !== void 0 ? antialiasing : this.smoothing;\n this.transparency = enableTransparency !== null && enableTransparency !== void 0 ? enableTransparency : this.transparency;\n this.pixelArtSampler = pixelArtSampler !== null && pixelArtSampler !== void 0 ? pixelArtSampler : this.pixelArtSampler;\n this.uvPadding = uvPadding !== null && uvPadding !== void 0 ? uvPadding : this.uvPadding;\n this.multiSampleAntialiasing = typeof multiSampleAntialiasing === 'boolean' ? multiSampleAntialiasing : this.multiSampleAntialiasing;\n this.samples = typeof multiSampleAntialiasing === 'object' ? multiSampleAntialiasing.samples : undefined;\n this.backgroundColor = backgroundColor !== null && backgroundColor !== void 0 ? backgroundColor : this.backgroundColor;\n this.useDrawSorting = useDrawSorting !== null && useDrawSorting !== void 0 ? useDrawSorting : this.useDrawSorting;\n this._drawCallPool.disableWarnings = true;\n this._drawCallPool.preallocate();\n this._init();\n }\n dispose() {\n if (!this._disposed) {\n this._disposed = true;\n this.textureLoader.dispose();\n for (const renderer of this._renderers.values()) {\n renderer.dispose();\n }\n this._renderers.clear();\n this._drawCallPool.dispose();\n this._drawCalls.length = 0;\n this.__gl = null;\n }\n }\n _init() {\n const gl = this.__gl;\n // Setup viewport and view matrix\n this._ortho = _Math_matrix__WEBPACK_IMPORTED_MODULE_10__.Matrix.ortho(0, gl.canvas.width, gl.canvas.height, 0, 400, -400);\n gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);\n // Clear background\n gl.clearColor(this.backgroundColor.r / 255, this.backgroundColor.g / 255, this.backgroundColor.b / 255, this.backgroundColor.a);\n gl.clear(gl.COLOR_BUFFER_BIT);\n // Enable alpha blending\n // https://www.realtimerendering.com/blog/gpus-prefer-premultiplication/\n gl.enable(gl.BLEND);\n gl.blendEquation(gl.FUNC_ADD);\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n gl.blendEquationSeparate(gl.FUNC_ADD, gl.FUNC_ADD);\n gl.blendFuncSeparate(gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n gl.depthMask(false);\n // Setup builtin renderers\n this.register(new _image_renderer_image_renderer__WEBPACK_IMPORTED_MODULE_11__.ImageRenderer({\n uvPadding: this.uvPadding,\n pixelArtSampler: this.pixelArtSampler\n }));\n this.register(new _material_renderer_material_renderer__WEBPACK_IMPORTED_MODULE_12__.MaterialRenderer());\n this.register(new _rectangle_renderer_rectangle_renderer__WEBPACK_IMPORTED_MODULE_13__.RectangleRenderer());\n this.register(new _circle_renderer_circle_renderer__WEBPACK_IMPORTED_MODULE_14__.CircleRenderer());\n this.register(new _point_renderer_point_renderer__WEBPACK_IMPORTED_MODULE_15__.PointRenderer());\n this.register(new _line_renderer_line_renderer__WEBPACK_IMPORTED_MODULE_16__.LineRenderer());\n this.register(new _particle_renderer_particle_renderer__WEBPACK_IMPORTED_MODULE_17__.ParticleRenderer());\n this.register(new _image_renderer_v2_image_renderer_v2__WEBPACK_IMPORTED_MODULE_18__.ImageRendererV2({\n uvPadding: this.uvPadding,\n pixelArtSampler: this.pixelArtSampler\n }));\n this.materialScreenTexture = gl.createTexture();\n if (!this.materialScreenTexture) {\n throw new Error('Could not create screen texture!');\n }\n gl.bindTexture(gl.TEXTURE_2D, this.materialScreenTexture);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT);\n gl.bindTexture(gl.TEXTURE_2D, null);\n this._screenRenderer = new _screen_pass_painter_screen_pass_painter__WEBPACK_IMPORTED_MODULE_19__.ScreenPassPainter(gl);\n this._renderTarget = new _render_target__WEBPACK_IMPORTED_MODULE_20__.RenderTarget({\n gl,\n transparency: this.transparency,\n width: gl.canvas.width,\n height: gl.canvas.height\n });\n this._postProcessTargets = [\n new _render_target__WEBPACK_IMPORTED_MODULE_20__.RenderTarget({\n gl,\n transparency: this.transparency,\n width: gl.canvas.width,\n height: gl.canvas.height\n }),\n new _render_target__WEBPACK_IMPORTED_MODULE_20__.RenderTarget({\n gl,\n transparency: this.transparency,\n width: gl.canvas.width,\n height: gl.canvas.height\n })\n ];\n this._msaaTarget = new _render_target__WEBPACK_IMPORTED_MODULE_20__.RenderTarget({\n gl,\n transparency: this.transparency,\n width: gl.canvas.width,\n height: gl.canvas.height,\n antialias: this.multiSampleAntialiasing,\n samples: this.samples\n });\n }\n register(renderer) {\n this._renderers.set(renderer.type, renderer);\n renderer.initialize(this.__gl, this);\n }\n get(rendererName) {\n return this._renderers.get(rendererName);\n }\n _isCurrentRenderer(renderer) {\n if (!this._currentRenderer || this._currentRenderer === renderer) {\n return true;\n }\n return false;\n }\n beginDrawLifecycle() {\n this._isDrawLifecycle = true;\n }\n endDrawLifecycle() {\n this._isDrawLifecycle = false;\n }\n draw(rendererName, ...args) {\n if (true) {\n if (args.length > 9) {\n throw new Error('Only 10 or less renderer arguments are supported!;');\n }\n }\n if (!this._isDrawLifecycle) {\n this._logger.warnOnce(`Attempting to draw outside the the drawing lifecycle (preDraw/postDraw) is not supported and is a source of bugs/errors.\\n` +\n `If you want to do custom drawing, use Actor.graphics, or any onPreDraw or onPostDraw handler.`);\n }\n if (this._isContextLost) {\n this._logger.errorOnce(`Unable to draw ${rendererName}, the webgl context is lost`);\n return;\n }\n const renderer = this._renderers.get(rendererName);\n if (renderer) {\n if (this.useDrawSorting) {\n const drawCall = this._drawCallPool.get();\n drawCall.z = this._state.current.z;\n drawCall.priority = renderer.priority;\n drawCall.renderer = rendererName;\n this.getTransform().clone(drawCall.transform);\n drawCall.state.z = this._state.current.z;\n drawCall.state.opacity = this._state.current.opacity;\n drawCall.state.tint = this._state.current.tint;\n drawCall.state.material = this._state.current.material;\n drawCall.args[0] = args[0];\n drawCall.args[1] = args[1];\n drawCall.args[2] = args[2];\n drawCall.args[3] = args[3];\n drawCall.args[4] = args[4];\n drawCall.args[5] = args[5];\n drawCall.args[6] = args[6];\n drawCall.args[7] = args[7];\n drawCall.args[8] = args[8];\n drawCall.args[9] = args[9];\n this._drawCalls[this._drawCallIndex++] = drawCall;\n }\n else {\n // Set the current renderer if not defined\n if (!this._currentRenderer) {\n this._currentRenderer = renderer;\n }\n if (!this._isCurrentRenderer(renderer)) {\n // switching graphics means we must flush the previous\n this._currentRenderer.flush();\n }\n // If we are still using the same renderer we can add to the current batch\n renderer.draw(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9]);\n this._currentRenderer = renderer;\n }\n }\n else {\n throw Error(`No renderer with name ${rendererName} has been registered`);\n }\n }\n resetTransform() {\n this._transform.reset();\n }\n updateViewport(resolution) {\n const gl = this.__gl;\n this._ortho = this._ortho = _Math_matrix__WEBPACK_IMPORTED_MODULE_10__.Matrix.ortho(0, resolution.width, resolution.height, 0, 400, -400);\n this._renderTarget.setResolution(gl.canvas.width, gl.canvas.height);\n this._msaaTarget.setResolution(gl.canvas.width, gl.canvas.height);\n this._postProcessTargets[0].setResolution(gl.canvas.width, gl.canvas.height);\n this._postProcessTargets[1].setResolution(gl.canvas.width, gl.canvas.height);\n }\n _getImageWidth(image) {\n let maybeWidth = this._imageToWidth.get(image);\n if (maybeWidth === undefined) {\n maybeWidth = image.width;\n this._imageToWidth.set(image, maybeWidth);\n }\n return maybeWidth;\n }\n _getImageHeight(image) {\n let maybeHeight = this._imageToHeight.get(image);\n if (maybeHeight === undefined) {\n maybeHeight = image.height;\n this._imageToHeight.set(image, maybeHeight);\n }\n return maybeHeight;\n }\n drawImage(image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight) {\n if (swidth === 0 || sheight === 0) {\n return; // zero dimension dest exit early\n }\n else if (dwidth === 0 || dheight === 0) {\n return; // zero dimension dest exit early\n }\n else if (this._getImageWidth(image) === 0 || this._getImageHeight(image) === 0) {\n return; // zero dimension source exit early\n }\n if (!image) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_3__.Logger.getInstance().warn('Cannot draw a null or undefined image');\n // tslint:disable-next-line: no-console\n if (console.trace) {\n // tslint:disable-next-line: no-console\n console.trace();\n }\n return;\n }\n if (this._state.current.material) {\n this.draw('ex.material', image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight);\n }\n else {\n if (this.imageRenderer === 'ex.image') {\n this.draw(this.imageRenderer, image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight);\n }\n else {\n this.draw(this.imageRenderer, image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight);\n }\n }\n }\n drawLine(start, end, color, thickness = 1) {\n this.draw('ex.rectangle', start, end, color, thickness);\n }\n drawRectangle(pos, width, height, color, stroke, strokeThickness) {\n this.draw('ex.rectangle', pos, width, height, color, stroke, strokeThickness);\n }\n drawCircle(pos, radius, color, stroke, thickness) {\n this.draw('ex.circle', pos, radius, color, stroke, thickness);\n }\n save() {\n this._transform.save();\n this._state.save();\n }\n restore() {\n this._transform.restore();\n this._state.restore();\n }\n translate(x, y) {\n this._transform.translate(this.snapToPixel ? ~~(x + pixelSnapEpsilon) : x, this.snapToPixel ? ~~(y + pixelSnapEpsilon) : y);\n }\n rotate(angle) {\n this._transform.rotate(angle);\n }\n scale(x, y) {\n this._transform.scale(x, y);\n }\n transform(matrix) {\n this._transform.current = matrix;\n }\n getTransform() {\n return this._transform.current;\n }\n multiply(m) {\n this._transform.current.multiply(m, this._transform.current);\n }\n addPostProcessor(postprocessor) {\n this._postprocessors.push(postprocessor);\n postprocessor.initialize(this.__gl);\n }\n removePostProcessor(postprocessor) {\n const index = this._postprocessors.indexOf(postprocessor);\n if (index !== -1) {\n this._postprocessors.splice(index, 1);\n }\n }\n clearPostProcessors() {\n this._postprocessors.length = 0;\n }\n updatePostProcessors(elapsed) {\n for (const postprocessor of this._postprocessors) {\n const shader = postprocessor.getShader();\n shader.use();\n const uniforms = shader.getUniforms();\n this._totalPostProcessorTime += elapsed;\n if (uniforms.find((u) => u.name === 'u_time_ms')) {\n shader.setUniformFloat('u_time_ms', this._totalPostProcessorTime);\n }\n if (uniforms.find((u) => u.name === 'u_elapsed_ms')) {\n shader.setUniformFloat('u_elapsed_ms', elapsed);\n }\n if (uniforms.find((u) => u.name === 'u_resolution')) {\n shader.setUniformFloatVector('u_resolution', (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(this.width, this.height));\n }\n if (postprocessor.onUpdate) {\n postprocessor.onUpdate(elapsed);\n }\n }\n }\n set material(material) {\n this._state.current.material = material;\n }\n get material() {\n return this._state.current.material;\n }\n /**\n * Creates and initializes the material which compiles the internal shader\n * @param options\n * @returns Material\n */\n createMaterial(options) {\n const material = new _material__WEBPACK_IMPORTED_MODULE_21__.Material({ ...options, graphicsContext: this });\n return material;\n }\n createShader(options) {\n const gl = this.__gl;\n const { vertexSource, fragmentSource } = options;\n const shader = new _shader__WEBPACK_IMPORTED_MODULE_22__.Shader({\n gl,\n vertexSource,\n fragmentSource\n });\n shader.compile();\n return shader;\n }\n clear() {\n const gl = this.__gl;\n const currentTarget = this.multiSampleAntialiasing ? this._msaaTarget : this._renderTarget;\n currentTarget.use();\n gl.clearColor(this.backgroundColor.r / 255, this.backgroundColor.g / 255, this.backgroundColor.b / 255, this.backgroundColor.a);\n // Clear the context with the newly set color. This is\n // the function call that actually does the drawing.\n gl.clear(gl.COLOR_BUFFER_BIT);\n }\n /**\n * Flushes all batched rendering to the screen\n */\n flush() {\n var _a;\n if (this._isContextLost) {\n this._logger.errorOnce(`Unable to flush the webgl context is lost`);\n return;\n }\n // render target captures all draws and redirects to the render target\n let currentTarget = this.multiSampleAntialiasing ? this._msaaTarget : this._renderTarget;\n currentTarget.use();\n if (this.useDrawSorting) {\n // null out unused draw calls\n for (let i = this._drawCallIndex; i < this._drawCalls.length; i++) {\n this._drawCalls[i] = null;\n }\n // sort draw calls\n // Find the original order of the first instance of the draw call\n const originalSort = new Map();\n for (const [name] of this._renderers) {\n let firstIndex = 0;\n for (firstIndex = 0; firstIndex < this._drawCallIndex; firstIndex++) {\n if (this._drawCalls[firstIndex].renderer === name) {\n break;\n }\n }\n originalSort.set(name, firstIndex);\n }\n this._drawCalls.sort((a, b) => {\n if (a === null || b === null) {\n return 0;\n }\n const zIndex = a.z - b.z;\n const originalSortOrder = originalSort.get(a.renderer) - originalSort.get(b.renderer);\n const priority = a.priority - b.priority;\n if (zIndex === 0) {\n // sort by z first\n if (priority === 0) {\n // sort by priority\n return originalSortOrder; // use the original order to inform draw call packing to maximally preserve painter order\n }\n return priority;\n }\n return zIndex;\n });\n const oldTransform = this._transform.current;\n const oldState = this._state.current;\n if (this._drawCalls.length && this._drawCallIndex) {\n let currentRendererName = this._drawCalls[0].renderer;\n let currentRenderer = this._renderers.get(currentRendererName);\n for (let i = 0; i < this._drawCallIndex; i++) {\n // hydrate the state for renderers\n this._transform.current = this._drawCalls[i].transform;\n this._state.current = this._drawCalls[i].state;\n if (this._drawCalls[i].renderer !== currentRendererName) {\n // switching graphics renderer means we must flush the previous\n currentRenderer.flush();\n currentRendererName = this._drawCalls[i].renderer;\n currentRenderer = this._renderers.get(currentRendererName);\n }\n // ! hack to grab screen texture before materials run because they might want it\n if (currentRenderer instanceof _material_renderer_material_renderer__WEBPACK_IMPORTED_MODULE_12__.MaterialRenderer && ((_a = this.material) === null || _a === void 0 ? void 0 : _a.isUsingScreenTexture)) {\n currentTarget.copyToTexture(this.materialScreenTexture);\n currentTarget.use();\n }\n // If we are still using the same renderer we can add to the current batch\n currentRenderer.draw(...this._drawCalls[i].args);\n }\n if (currentRenderer.hasPendingDraws()) {\n currentRenderer.flush();\n }\n }\n // reset state\n this._transform.current = oldTransform;\n this._state.current = oldState;\n // reclaim draw calls\n this._drawCallPool.done();\n this._drawCallIndex = 0;\n this._imageToHeight.clear();\n this._imageToWidth.clear();\n }\n else {\n // This is the final flush at the moment to draw any leftover pending draw\n for (const renderer of this._renderers.values()) {\n if (renderer.hasPendingDraws()) {\n renderer.flush();\n }\n }\n }\n currentTarget.disable();\n // post process step\n if (this._postprocessors.length > 0) {\n const source = currentTarget.toRenderSource();\n source.use();\n }\n // flip flop render targets for post processing\n for (let i = 0; i < this._postprocessors.length; i++) {\n currentTarget = this._postProcessTargets[i % 2];\n this._postProcessTargets[i % 2].use();\n this._screenRenderer.renderWithPostProcessor(this._postprocessors[i]);\n this._postProcessTargets[i % 2].toRenderSource().use();\n }\n // Final blit to the screen\n currentTarget.blitToScreen();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/circle-renderer/circle-renderer.ts\":\n/*!*************************************************************!*\\\n !*** ./Graphics/Context/circle-renderer/circle-renderer.ts ***!\n \\*************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CircleRenderer: () => (/* binding */ CircleRenderer)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../Color */ \"./Color.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n/* harmony import */ var _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _quad_index_buffer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../quad-index-buffer */ \"./Graphics/Context/quad-index-buffer.ts\");\n/* harmony import */ var _shader__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _vertex_buffer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _vertex_layout__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../vertex-layout */ \"./Graphics/Context/vertex-layout.ts\");\n/* harmony import */ var _circle_renderer_frag_glsl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./circle-renderer.frag.glsl */ \"./Graphics/Context/circle-renderer/circle-renderer.frag.glsl\");\n/* harmony import */ var _circle_renderer_vert_glsl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./circle-renderer.vert.glsl */ \"./Graphics/Context/circle-renderer/circle-renderer.vert.glsl\");\n\n\n\n\n\n\n\n\n\n\nclass CircleRenderer {\n constructor() {\n this.type = 'ex.circle';\n this.priority = 0;\n this._maxCircles = 10922; // max(uint16) / 6 verts\n this._circleCount = 0;\n this._vertexIndex = 0;\n }\n initialize(gl, context) {\n this._gl = gl;\n this._context = context;\n this._shader = new _shader__WEBPACK_IMPORTED_MODULE_0__.Shader({\n gl,\n fragmentSource: _circle_renderer_frag_glsl__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n vertexSource: _circle_renderer_vert_glsl__WEBPACK_IMPORTED_MODULE_2__[\"default\"]\n });\n this._shader.compile();\n // setup uniforms\n this._shader.use();\n this._shader.setUniformMatrix('u_matrix', context.ortho);\n this._buffer = new _vertex_buffer__WEBPACK_IMPORTED_MODULE_3__.VertexBuffer({\n gl,\n size: 14 * 4 * this._maxCircles,\n type: 'dynamic'\n });\n this._layout = new _vertex_layout__WEBPACK_IMPORTED_MODULE_4__.VertexLayout({\n gl,\n shader: this._shader,\n vertexBuffer: this._buffer,\n attributes: [\n ['a_position', 2],\n ['a_uv', 2],\n ['a_opacity', 1],\n ['a_color', 4],\n ['a_strokeColor', 4],\n ['a_strokeThickness', 1]\n ]\n });\n this._quads = new _quad_index_buffer__WEBPACK_IMPORTED_MODULE_5__.QuadIndexBuffer(gl, this._maxCircles, true);\n }\n dispose() {\n this._buffer.dispose();\n this._quads.dispose();\n this._shader.dispose();\n this._context = null;\n this._gl = null;\n }\n _isFull() {\n if (this._circleCount >= this._maxCircles) {\n return true;\n }\n return false;\n }\n draw(pos, radius, color, stroke = _Color__WEBPACK_IMPORTED_MODULE_6__.Color.Transparent, strokeThickness = 0) {\n if (this._isFull()) {\n this.flush();\n }\n this._circleCount++;\n // transform based on current context\n const transform = this._context.getTransform();\n const opacity = this._context.opacity;\n const snapToPixel = this._context.snapToPixel;\n const topLeft = transform.multiply(pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_7__.vec)(-radius, -radius)));\n const topRight = transform.multiply(pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_7__.vec)(radius, -radius)));\n const bottomRight = transform.multiply(pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_7__.vec)(radius, radius)));\n const bottomLeft = transform.multiply(pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_7__.vec)(-radius, radius)));\n if (snapToPixel) {\n topLeft.x = ~~(topLeft.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n topLeft.y = ~~(topLeft.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n topRight.x = ~~(topRight.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n topRight.y = ~~(topRight.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n bottomLeft.x = ~~(bottomLeft.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n bottomLeft.y = ~~(bottomLeft.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n bottomRight.x = ~~(bottomRight.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n bottomRight.y = ~~(bottomRight.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n }\n // TODO UV could be static vertex buffer\n const uvx0 = 0;\n const uvy0 = 0;\n const uvx1 = 1;\n const uvy1 = 1;\n // update data\n const vertexBuffer = this._layout.vertexBuffer.bufferData;\n // (0, 0) - 0\n vertexBuffer[this._vertexIndex++] = topLeft.x;\n vertexBuffer[this._vertexIndex++] = topLeft.y;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness / radius;\n // (0, 1) - 1\n vertexBuffer[this._vertexIndex++] = bottomLeft.x;\n vertexBuffer[this._vertexIndex++] = bottomLeft.y;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness / radius;\n // (1, 0) - 2\n vertexBuffer[this._vertexIndex++] = topRight.x;\n vertexBuffer[this._vertexIndex++] = topRight.y;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness / radius;\n // (1, 1) - 3\n vertexBuffer[this._vertexIndex++] = bottomRight.x;\n vertexBuffer[this._vertexIndex++] = bottomRight.y;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness / radius;\n }\n hasPendingDraws() {\n return this._circleCount !== 0;\n }\n flush() {\n // nothing to draw early exit\n if (this._circleCount === 0) {\n return;\n }\n const gl = this._gl;\n // Bind the shader\n this._shader.use();\n // Bind the memory layout and upload data\n this._layout.use(true);\n // Update ortho matrix uniform\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n // Bind index buffer\n this._quads.bind();\n // Draw all the quads\n gl.drawElements(gl.TRIANGLES, this._circleCount * 6, this._quads.bufferGlType, 0);\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_9__.GraphicsDiagnostics.DrawnImagesCount += this._circleCount;\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_9__.GraphicsDiagnostics.DrawCallCount++;\n // Reset\n this._circleCount = 0;\n this._vertexIndex = 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/debug-text.ts\":\n/*!****************************************!*\\\n !*** ./Graphics/Context/debug-text.ts ***!\n \\****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DebugText: () => (/* binding */ DebugText)\n/* harmony export */ });\n/* harmony import */ var _ImageSource__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ImageSource */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _SpriteFont__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../SpriteFont */ \"./Graphics/SpriteFont.ts\");\n/* harmony import */ var _SpriteSheet__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../SpriteSheet */ \"./Graphics/SpriteSheet.ts\");\n/* harmony import */ var _debug_font_png__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./debug-font.png */ \"./Graphics/Context/debug-font.png\");\n\n\n\n\n/**\n * Internal debug text helper\n */\nclass DebugText {\n constructor() {\n /**\n * base64 font\n */\n this.fontSheet = _debug_font_png__WEBPACK_IMPORTED_MODULE_0__[\"default\"];\n this.size = 16;\n // We fire and forget, we don't care if it's loaded or not\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.load();\n }\n load() {\n this._imageSource = new _ImageSource__WEBPACK_IMPORTED_MODULE_1__.ImageSource(this.fontSheet);\n return this._imageSource.load().then(() => {\n this._spriteSheet = _SpriteSheet__WEBPACK_IMPORTED_MODULE_2__.SpriteSheet.fromImageSource({\n image: this._imageSource,\n grid: {\n rows: 4,\n columns: 16,\n spriteWidth: 16,\n spriteHeight: 16\n }\n });\n this._spriteFont = new _SpriteFont__WEBPACK_IMPORTED_MODULE_3__.SpriteFont({\n alphabet: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ,!\\'&.\"?-()+# ',\n caseInsensitive: true,\n spriteSheet: this._spriteSheet,\n spacing: -6\n });\n });\n }\n /**\n * Writes debug text using the built in sprint font\n * @param ctx\n * @param text\n * @param pos\n */\n write(ctx, text, pos) {\n if (this._imageSource.isLoaded()) {\n this._spriteFont.render(ctx, text, null, pos.x, pos.y);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/draw-call.ts\":\n/*!***************************************!*\\\n !*** ./Graphics/Context/draw-call.ts ***!\n \\***************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DrawCall: () => (/* binding */ DrawCall)\n/* harmony export */ });\n/* harmony import */ var _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/affine-matrix */ \"./Math/affine-matrix.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Color */ \"./Color.ts\");\n\n\nclass DrawCall {\n constructor() {\n this.z = 0;\n this.priority = 0;\n this.renderer = '';\n this.transform = _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_0__.AffineMatrix.identity();\n this.state = {\n z: 0,\n opacity: 1,\n tint: _Color__WEBPACK_IMPORTED_MODULE_1__.Color.White,\n material: null\n };\n this.args = new Array(10);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/image-renderer-v2/image-renderer-v2.ts\":\n/*!*****************************************************************!*\\\n !*** ./Graphics/Context/image-renderer-v2/image-renderer-v2.ts ***!\n \\*****************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ImageRendererV2: () => (/* binding */ ImageRendererV2)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Color */ \"./Color.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n/* harmony import */ var _ImageSource__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../ImageSource */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../Wrapping */ \"./Graphics/Wrapping.ts\");\n/* harmony import */ var _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _shader__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _vertex_buffer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _webgl_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../webgl-util */ \"./Graphics/Context/webgl-util.ts\");\n/* harmony import */ var _image_renderer_v2_frag_glsl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./image-renderer-v2.frag.glsl */ \"./Graphics/Context/image-renderer-v2/image-renderer-v2.frag.glsl\");\n/* harmony import */ var _image_renderer_v2_vert_glsl__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./image-renderer-v2.vert.glsl */ \"./Graphics/Context/image-renderer-v2/image-renderer-v2.vert.glsl\");\n// import { Color } from '../../../Color';\n// import { parseImageFiltering } from '../../Filtering';\n\n\n\n\n\n\n\n\n\n\n\nclass ImageRendererV2 {\n constructor(options) {\n this.type = 'ex.image-v2';\n this.priority = 0;\n // TODO this could be bigger probably\n this._maxImages = 20000; // max(uint16) / 6 verts\n this._maxTextures = 0;\n this._components = 2 + 2 + 2 + 2 + 1 + 2 + 2 + 1 + 2 + 2 + 4;\n // Per flush vars\n this._imageCount = 0;\n this._textures = [];\n this._textureIndex = 0;\n this._textureToIndex = new Map();\n this._images = new Set();\n this._vertexIndex = 0;\n this._imageToWidth = new Map();\n this._imageToHeight = new Map();\n this._view = [0, 0, 0, 0];\n this._dest = [0, 0];\n this._defaultTint = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.White;\n this.pixelArtSampler = options.pixelArtSampler;\n this.uvPadding = options.uvPadding;\n }\n initialize(gl, context) {\n this._gl = gl;\n this._context = context;\n // Transform shader source\n const maxTexture = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS);\n const maxComplexity = (0,_webgl_util__WEBPACK_IMPORTED_MODULE_1__.getMaxShaderComplexity)(gl, maxTexture);\n this._maxTextures = Math.min(maxTexture, maxComplexity);\n const transformedFrag = this._transformFragmentSource(_image_renderer_v2_frag_glsl__WEBPACK_IMPORTED_MODULE_2__[\"default\"], this._maxTextures);\n // Compile shader\n this._shader = new _shader__WEBPACK_IMPORTED_MODULE_3__.Shader({\n gl,\n fragmentSource: transformedFrag,\n vertexSource: _image_renderer_v2_vert_glsl__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n });\n this._shader.compile();\n // setup uniforms\n this._shader.use();\n this._shader.setUniformMatrix('u_matrix', context.ortho);\n // Initialize texture slots to [0, 1, 2, 3, 4, .... maxGPUTextures]\n this._shader.setUniformIntArray('u_textures', [...Array(this._maxTextures)].map((_, i) => i));\n this._vao = gl.createVertexArray();\n gl.bindVertexArray(this._vao);\n this._quadMesh = new Float32Array([\n // pos uv\n 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0,\n 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1\n ]);\n this._meshBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this._meshBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, this._quadMesh, gl.STATIC_DRAW);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 16, 0);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(1, 2, gl.FLOAT, false, 16, 8);\n gl.enableVertexAttribArray(1);\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n // Setup memory layout\n const components = this._components;\n this._transformData = new _vertex_buffer__WEBPACK_IMPORTED_MODULE_5__.VertexBuffer({\n gl,\n size: components * this._maxImages, // components * images\n type: 'dynamic'\n });\n this._transformData.bind();\n // attributes\n let offset = 0;\n let start = 2;\n const bytesPerFloat = 4;\n const totalSize = components * 4;\n // a_offset vec2 - 2\n gl.vertexAttribPointer(start++, 2, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(2);\n offset += 2 * bytesPerFloat;\n // a_mat_column1 vec2 - 2\n gl.vertexAttribPointer(start++, 2, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(3);\n offset += 2 * bytesPerFloat;\n // a_mat_column2 vec2 - 2\n gl.vertexAttribPointer(start++, 2, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(4);\n offset += 2 * bytesPerFloat;\n // a_mat_column3 vec2 - 2\n gl.vertexAttribPointer(start++, 2, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(5);\n offset += 2 * bytesPerFloat;\n // a_opacity float - 1\n gl.vertexAttribPointer(start++, 1, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(6);\n offset += 1 * bytesPerFloat;\n // a_res vec2 - 2\n gl.vertexAttribPointer(start++, 2, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(7);\n offset += 2 * bytesPerFloat;\n // a_size vec2 - 2\n gl.vertexAttribPointer(start++, 2, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(8);\n offset += 2 * bytesPerFloat;\n // a_texture_index - 1\n gl.vertexAttribPointer(start++, 1, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(9);\n offset += 1 * bytesPerFloat;\n // a_uv_min - 2\n gl.vertexAttribPointer(start++, 2, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(10);\n offset += 2 * bytesPerFloat;\n // a_uv_max - 2\n gl.vertexAttribPointer(start++, 2, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(11);\n offset += 2 * bytesPerFloat;\n // a_tint - 4\n gl.vertexAttribPointer(start++, 4, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(12);\n offset += 4 * bytesPerFloat;\n gl.vertexAttribDivisor(2, 1);\n gl.vertexAttribDivisor(3, 1);\n gl.vertexAttribDivisor(4, 1);\n gl.vertexAttribDivisor(5, 1);\n gl.vertexAttribDivisor(6, 1);\n gl.vertexAttribDivisor(7, 1);\n gl.vertexAttribDivisor(8, 1);\n gl.vertexAttribDivisor(9, 1);\n gl.vertexAttribDivisor(10, 1);\n gl.vertexAttribDivisor(11, 1);\n gl.vertexAttribDivisor(12, 1);\n gl.bindVertexArray(null);\n }\n _bindData(gl) {\n // Setup memory layout\n const components = this._components;\n this._transformData.bind();\n this._transformData.upload(components * this._imageCount);\n gl.bindVertexArray(this._vao);\n }\n dispose() {\n this._transformData.dispose();\n this._shader.dispose();\n this._textures.length = 0;\n this._context = null;\n this._gl = null;\n }\n _transformFragmentSource(source, maxTextures) {\n let newSource = source.replace('%%count%%', maxTextures.toString());\n let texturePickerBuilder = '';\n for (let i = 0; i < maxTextures; i++) {\n if (i === 0) {\n texturePickerBuilder += `if (v_texture_index <= ${i}.5) {\\n`;\n }\n else {\n texturePickerBuilder += ` else if (v_texture_index <= ${i}.5) {\\n`;\n }\n texturePickerBuilder += ` color = texture(u_textures[${i}], uv);\\n`;\n texturePickerBuilder += ` }\\n`;\n }\n newSource = newSource.replace('%%texture_picker%%', texturePickerBuilder);\n return newSource;\n }\n _addImageAsTexture(image) {\n if (this._images.has(image)) {\n return;\n }\n const maybeFiltering = image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_6__.ImageSourceAttributeConstants.Filtering);\n const filtering = maybeFiltering ? (0,_Filtering__WEBPACK_IMPORTED_MODULE_7__.parseImageFiltering)(maybeFiltering) : undefined;\n const wrapX = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_8__.parseImageWrapping)(image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_6__.ImageSourceAttributeConstants.WrappingX));\n const wrapY = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_8__.parseImageWrapping)(image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_6__.ImageSourceAttributeConstants.WrappingY));\n const force = image.getAttribute('forceUpload') === 'true' ? true : false;\n const texture = this._context.textureLoader.load(image, {\n filtering,\n wrapping: { x: wrapX, y: wrapY }\n }, force);\n // remove force attribute after upload\n image.removeAttribute('forceUpload');\n if (this._textures.indexOf(texture) === -1) {\n this._textures.push(texture);\n this._textureToIndex.set(texture, this._textureIndex++);\n this._images.add(image);\n }\n }\n _bindTextures(gl) {\n // Bind textures in the correct order\n const max = Math.min(this._textureIndex, this._maxTextures);\n for (let i = 0; i < max; i++) {\n gl.activeTexture(gl.TEXTURE0 + i);\n gl.bindTexture(gl.TEXTURE_2D, this._textures[i] || this._textures[0]);\n }\n }\n _getTextureIdForImage(image) {\n var _a;\n if (image) {\n const maybeTexture = this._context.textureLoader.get(image);\n return (_a = this._textureToIndex.get(maybeTexture)) !== null && _a !== void 0 ? _a : -1; //this._textures.indexOf(maybeTexture);\n }\n return -1;\n }\n _isFull() {\n if (this._imageCount >= this._maxImages) {\n return true;\n }\n if (this._textures.length >= this._maxTextures) {\n return true;\n }\n return false;\n }\n _getImageWidth(image) {\n let maybeWidth = this._imageToWidth.get(image);\n if (maybeWidth === undefined) {\n maybeWidth = image.width;\n this._imageToWidth.set(image, maybeWidth);\n }\n return maybeWidth;\n }\n _getImageHeight(image) {\n let maybeHeight = this._imageToHeight.get(image);\n if (maybeHeight === undefined) {\n maybeHeight = image.height;\n this._imageToHeight.set(image, maybeHeight);\n }\n return maybeHeight;\n }\n draw(image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight) {\n var _a, _b, _c, _d;\n // Force a render if the batch is full\n if (this._isFull()) {\n this.flush();\n }\n this._imageCount++;\n // This creates and uploads the texture if not already done\n this._addImageAsTexture(image);\n const maybeImageWidth = this._getImageWidth(image);\n const maybeImageHeight = this._getImageHeight(image);\n let width = maybeImageWidth || swidth || 0;\n let height = maybeImageHeight || sheight || 0;\n this._view[0] = 0;\n this._view[1] = 0;\n this._view[2] = (_a = swidth !== null && swidth !== void 0 ? swidth : maybeImageWidth) !== null && _a !== void 0 ? _a : 0;\n this._view[3] = (_b = sheight !== null && sheight !== void 0 ? sheight : maybeImageHeight) !== null && _b !== void 0 ? _b : 0;\n this._dest[0] = sx !== null && sx !== void 0 ? sx : 1;\n this._dest[1] = sy !== null && sy !== void 0 ? sy : 1;\n // If destination is specified, update view and dest\n if (dx !== undefined && dy !== undefined && dwidth !== undefined && dheight !== undefined) {\n this._view[0] = sx !== null && sx !== void 0 ? sx : 1;\n this._view[1] = sy !== null && sy !== void 0 ? sy : 1;\n this._view[2] = (_c = swidth !== null && swidth !== void 0 ? swidth : maybeImageWidth) !== null && _c !== void 0 ? _c : 0;\n this._view[3] = (_d = sheight !== null && sheight !== void 0 ? sheight : maybeImageHeight) !== null && _d !== void 0 ? _d : 0;\n this._dest[0] = dx;\n this._dest[1] = dy;\n width = dwidth;\n height = dheight;\n }\n sx = this._view[0];\n sy = this._view[1];\n const sw = this._view[2];\n const sh = this._view[3];\n // transform based on current context\n const transform = this._context.getTransform();\n const opacity = this._context.opacity;\n const snapToPixel = this._context.snapToPixel;\n if (snapToPixel) {\n this._dest[0] = ~~(this._dest[0] + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_9__.pixelSnapEpsilon);\n this._dest[1] = ~~(this._dest[1] + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_9__.pixelSnapEpsilon);\n }\n const tint = this._context.tint || this._defaultTint;\n const textureId = this._getTextureIdForImage(image);\n const imageWidth = maybeImageWidth || width;\n const imageHeight = maybeImageHeight || height;\n const uvx0 = (sx + this.uvPadding) / imageWidth;\n const uvy0 = (sy + this.uvPadding) / imageHeight;\n const uvx1 = (sx + sw - this.uvPadding) / imageWidth;\n const uvy1 = (sy + sh - this.uvPadding) / imageHeight;\n const txWidth = maybeImageWidth;\n const txHeight = maybeImageHeight;\n // update data\n const vertexBuffer = this._transformData.bufferData;\n vertexBuffer[this._vertexIndex++] = this._dest[0];\n vertexBuffer[this._vertexIndex++] = this._dest[1];\n vertexBuffer[this._vertexIndex++] = transform.data[0];\n vertexBuffer[this._vertexIndex++] = transform.data[1];\n vertexBuffer[this._vertexIndex++] = transform.data[2];\n vertexBuffer[this._vertexIndex++] = transform.data[3];\n vertexBuffer[this._vertexIndex++] = transform.data[4];\n vertexBuffer[this._vertexIndex++] = transform.data[5];\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = width;\n vertexBuffer[this._vertexIndex++] = height;\n vertexBuffer[this._vertexIndex++] = txWidth;\n vertexBuffer[this._vertexIndex++] = txHeight;\n vertexBuffer[this._vertexIndex++] = textureId;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = tint.r / 255;\n vertexBuffer[this._vertexIndex++] = tint.g / 255;\n vertexBuffer[this._vertexIndex++] = tint.b / 255;\n vertexBuffer[this._vertexIndex++] = tint.a;\n }\n hasPendingDraws() {\n return this._imageCount !== 0;\n }\n flush() {\n // nothing to draw early exit\n if (this._imageCount === 0) {\n return;\n }\n const gl = this._gl;\n // Bind the shader\n this._shader.use();\n // Bind the memory layout and upload data\n this._bindData(gl);\n // Update ortho matrix uniform\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n // Turn on pixel art aa sampler\n this._shader.setUniformBoolean('u_pixelart', this.pixelArtSampler);\n // Bind textures to\n this._bindTextures(gl);\n // Draw all the quads\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 6, this._imageCount);\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_10__.GraphicsDiagnostics.DrawnImagesCount += this._imageCount;\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_10__.GraphicsDiagnostics.DrawCallCount++;\n gl.bindVertexArray(null);\n // Reset\n this._imageCount = 0;\n this._vertexIndex = 0;\n this._textures.length = 0;\n this._textureIndex = 0;\n this._textureToIndex.clear();\n this._images.clear();\n this._imageToWidth.clear();\n this._imageToHeight.clear();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/image-renderer/image-renderer.ts\":\n/*!***********************************************************!*\\\n !*** ./Graphics/Context/image-renderer/image-renderer.ts ***!\n \\***********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ImageRenderer: () => (/* binding */ ImageRenderer)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Color */ \"./Color.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n/* harmony import */ var _ImageSource__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../ImageSource */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../Wrapping */ \"./Graphics/Wrapping.ts\");\n/* harmony import */ var _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _quad_index_buffer__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../quad-index-buffer */ \"./Graphics/Context/quad-index-buffer.ts\");\n/* harmony import */ var _shader__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _vertex_buffer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _vertex_layout__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../vertex-layout */ \"./Graphics/Context/vertex-layout.ts\");\n/* harmony import */ var _webgl_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../webgl-util */ \"./Graphics/Context/webgl-util.ts\");\n/* harmony import */ var _image_renderer_frag_glsl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./image-renderer.frag.glsl */ \"./Graphics/Context/image-renderer/image-renderer.frag.glsl\");\n/* harmony import */ var _image_renderer_vert_glsl__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./image-renderer.vert.glsl */ \"./Graphics/Context/image-renderer/image-renderer.vert.glsl\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass ImageRenderer {\n constructor(options) {\n this.type = 'ex.image';\n this.priority = 0;\n this._maxImages = 10922; // max(uint16) / 6 verts\n this._maxTextures = 0;\n // Per flush vars\n this._imageCount = 0;\n this._textures = [];\n this._textureIndex = 0;\n this._textureToIndex = new Map();\n this._images = new Set();\n this._vertexIndex = 0;\n this._imageToWidth = new Map();\n this._imageToHeight = new Map();\n this._view = [0, 0, 0, 0];\n this._dest = [0, 0];\n this._quad = [0, 0, 0, 0, 0, 0, 0, 0];\n this._defaultTint = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.White;\n this.pixelArtSampler = options.pixelArtSampler;\n this.uvPadding = options.uvPadding;\n }\n initialize(gl, context) {\n this._gl = gl;\n this._context = context;\n // Transform shader source\n // FIXME: PIXEL 6 complains `ERROR: Expression too complex.` if we use it's reported max texture units, 125 seems to work for now...\n const maxTexture = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS);\n const maxComplexity = (0,_webgl_util__WEBPACK_IMPORTED_MODULE_1__.getMaxShaderComplexity)(gl, maxTexture);\n this._maxTextures = Math.min(maxTexture, maxComplexity);\n const transformedFrag = this._transformFragmentSource(_image_renderer_frag_glsl__WEBPACK_IMPORTED_MODULE_2__[\"default\"], this._maxTextures);\n // Compile shader\n this._shader = new _shader__WEBPACK_IMPORTED_MODULE_3__.Shader({\n gl,\n fragmentSource: transformedFrag,\n vertexSource: _image_renderer_vert_glsl__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n });\n this._shader.compile();\n // setup uniforms\n this._shader.use();\n this._shader.setUniformMatrix('u_matrix', context.ortho);\n // Initialize texture slots to [0, 1, 2, 3, 4, .... maxGPUTextures]\n this._shader.setUniformIntArray('u_textures', [...Array(this._maxTextures)].map((_, i) => i));\n // Setup memory layout\n this._buffer = new _vertex_buffer__WEBPACK_IMPORTED_MODULE_5__.VertexBuffer({\n gl,\n size: 12 * 4 * this._maxImages, // 12 components * 4 verts\n type: 'dynamic'\n });\n this._layout = new _vertex_layout__WEBPACK_IMPORTED_MODULE_6__.VertexLayout({\n gl,\n shader: this._shader,\n vertexBuffer: this._buffer,\n attributes: [\n ['a_position', 2],\n ['a_opacity', 1],\n ['a_res', 2],\n ['a_texcoord', 2],\n ['a_textureIndex', 1],\n ['a_tint', 4]\n ]\n });\n // Setup index buffer\n this._quads = new _quad_index_buffer__WEBPACK_IMPORTED_MODULE_7__.QuadIndexBuffer(gl, this._maxImages, true);\n }\n dispose() {\n this._buffer.dispose();\n this._quads.dispose();\n this._shader.dispose();\n this._textures.length = 0;\n this._context = null;\n this._gl = null;\n }\n _transformFragmentSource(source, maxTextures) {\n let newSource = source.replace('%%count%%', maxTextures.toString());\n let texturePickerBuilder = '';\n for (let i = 0; i < maxTextures; i++) {\n if (i === 0) {\n texturePickerBuilder += `if (v_textureIndex <= ${i}.5) {\\n`;\n }\n else {\n texturePickerBuilder += ` else if (v_textureIndex <= ${i}.5) {\\n`;\n }\n texturePickerBuilder += ` vec2 uv = u_pixelart ? uv_iq(v_texcoord, v_res) : v_texcoord;\\n`;\n texturePickerBuilder += ` color = texture(u_textures[${i}], uv);\\n`;\n texturePickerBuilder += ` }\\n`;\n }\n newSource = newSource.replace('%%texture_picker%%', texturePickerBuilder);\n return newSource;\n }\n _addImageAsTexture(image) {\n if (this._images.has(image)) {\n return;\n }\n const maybeFiltering = image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_8__.ImageSourceAttributeConstants.Filtering);\n const filtering = maybeFiltering ? (0,_Filtering__WEBPACK_IMPORTED_MODULE_9__.parseImageFiltering)(maybeFiltering) : undefined;\n const wrapX = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_10__.parseImageWrapping)(image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_8__.ImageSourceAttributeConstants.WrappingX));\n const wrapY = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_10__.parseImageWrapping)(image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_8__.ImageSourceAttributeConstants.WrappingY));\n const force = image.getAttribute('forceUpload') === 'true' ? true : false;\n const texture = this._context.textureLoader.load(image, {\n filtering,\n wrapping: { x: wrapX, y: wrapY }\n }, force);\n // remove force attribute after upload\n image.removeAttribute('forceUpload');\n if (this._textures.indexOf(texture) === -1) {\n this._textures.push(texture);\n this._textureToIndex.set(texture, this._textureIndex++);\n this._images.add(image);\n }\n }\n _bindTextures(gl) {\n // Bind textures in the correct order\n for (let i = 0; i < this._maxTextures; i++) {\n gl.activeTexture(gl.TEXTURE0 + i);\n gl.bindTexture(gl.TEXTURE_2D, this._textures[i] || this._textures[0]);\n }\n }\n _getTextureIdForImage(image) {\n var _a;\n if (image) {\n const maybeTexture = this._context.textureLoader.get(image);\n return (_a = this._textureToIndex.get(maybeTexture)) !== null && _a !== void 0 ? _a : -1; //this._textures.indexOf(maybeTexture);\n }\n return -1;\n }\n _isFull() {\n if (this._imageCount >= this._maxImages) {\n return true;\n }\n if (this._textures.length >= this._maxTextures) {\n return true;\n }\n return false;\n }\n _getImageWidth(image) {\n let maybeWidth = this._imageToWidth.get(image);\n if (maybeWidth === undefined) {\n maybeWidth = image.width;\n this._imageToWidth.set(image, maybeWidth);\n }\n return maybeWidth;\n }\n _getImageHeight(image) {\n let maybeHeight = this._imageToHeight.get(image);\n if (maybeHeight === undefined) {\n maybeHeight = image.height;\n this._imageToHeight.set(image, maybeHeight);\n }\n return maybeHeight;\n }\n draw(image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight) {\n var _a, _b, _c, _d;\n // Force a render if the batch is full\n if (this._isFull()) {\n this.flush();\n }\n this._imageCount++;\n // This creates and uploads the texture if not already done\n this._addImageAsTexture(image);\n const maybeImageWidth = this._getImageWidth(image);\n const maybeImageHeight = this._getImageHeight(image);\n let width = maybeImageWidth || swidth || 0;\n let height = maybeImageHeight || sheight || 0;\n this._view[0] = 0;\n this._view[1] = 0;\n this._view[2] = (_a = swidth !== null && swidth !== void 0 ? swidth : maybeImageWidth) !== null && _a !== void 0 ? _a : 0;\n this._view[3] = (_b = sheight !== null && sheight !== void 0 ? sheight : maybeImageHeight) !== null && _b !== void 0 ? _b : 0;\n this._dest[0] = sx !== null && sx !== void 0 ? sx : 1;\n this._dest[1] = sy !== null && sy !== void 0 ? sy : 1;\n // If destination is specified, update view and dest\n if (dx !== undefined && dy !== undefined && dwidth !== undefined && dheight !== undefined) {\n this._view[0] = sx !== null && sx !== void 0 ? sx : 1;\n this._view[1] = sy !== null && sy !== void 0 ? sy : 1;\n this._view[2] = (_c = swidth !== null && swidth !== void 0 ? swidth : maybeImageWidth) !== null && _c !== void 0 ? _c : 0;\n this._view[3] = (_d = sheight !== null && sheight !== void 0 ? sheight : maybeImageHeight) !== null && _d !== void 0 ? _d : 0;\n this._dest[0] = dx;\n this._dest[1] = dy;\n width = dwidth;\n height = dheight;\n }\n sx = this._view[0];\n sy = this._view[1];\n const sw = this._view[2];\n const sh = this._view[3];\n // transform based on current context\n const transform = this._context.getTransform();\n const opacity = this._context.opacity;\n const snapToPixel = this._context.snapToPixel;\n // top left\n this._quad[0] = this._dest[0];\n this._quad[1] = this._dest[1];\n // top right\n this._quad[2] = this._dest[0] + width;\n this._quad[3] = this._dest[1];\n // bottom left\n this._quad[4] = this._dest[0];\n this._quad[5] = this._dest[1] + height;\n // bottom right\n this._quad[6] = this._dest[0] + width;\n this._quad[7] = this._dest[1] + height;\n transform.multiplyQuadInPlace(this._quad);\n if (snapToPixel) {\n this._quad[0] = ~~(this._quad[0] + (0,_Math_util__WEBPACK_IMPORTED_MODULE_11__.sign)(this._quad[0]) * _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__.pixelSnapEpsilon);\n this._quad[1] = ~~(this._quad[1] + (0,_Math_util__WEBPACK_IMPORTED_MODULE_11__.sign)(this._quad[1]) * _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__.pixelSnapEpsilon);\n this._quad[2] = ~~(this._quad[2] + (0,_Math_util__WEBPACK_IMPORTED_MODULE_11__.sign)(this._quad[2]) * _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__.pixelSnapEpsilon);\n this._quad[3] = ~~(this._quad[3] + (0,_Math_util__WEBPACK_IMPORTED_MODULE_11__.sign)(this._quad[3]) * _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__.pixelSnapEpsilon);\n this._quad[4] = ~~(this._quad[4] + (0,_Math_util__WEBPACK_IMPORTED_MODULE_11__.sign)(this._quad[4]) * _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__.pixelSnapEpsilon);\n this._quad[5] = ~~(this._quad[5] + (0,_Math_util__WEBPACK_IMPORTED_MODULE_11__.sign)(this._quad[5]) * _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__.pixelSnapEpsilon);\n this._quad[6] = ~~(this._quad[6] + (0,_Math_util__WEBPACK_IMPORTED_MODULE_11__.sign)(this._quad[6]) * _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__.pixelSnapEpsilon);\n this._quad[7] = ~~(this._quad[7] + (0,_Math_util__WEBPACK_IMPORTED_MODULE_11__.sign)(this._quad[7]) * _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__.pixelSnapEpsilon);\n }\n const tint = this._context.tint || this._defaultTint;\n const textureId = this._getTextureIdForImage(image);\n const imageWidth = maybeImageWidth || width;\n const imageHeight = maybeImageHeight || height;\n const uvx0 = (sx + this.uvPadding) / imageWidth;\n const uvy0 = (sy + this.uvPadding) / imageHeight;\n const uvx1 = (sx + sw - this.uvPadding) / imageWidth;\n const uvy1 = (sy + sh - this.uvPadding) / imageHeight;\n const txWidth = maybeImageWidth;\n const txHeight = maybeImageHeight;\n // update data\n const vertexBuffer = this._layout.vertexBuffer.bufferData;\n // (0, 0) - 0\n vertexBuffer[this._vertexIndex++] = this._quad[0];\n vertexBuffer[this._vertexIndex++] = this._quad[1];\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = txWidth;\n vertexBuffer[this._vertexIndex++] = txHeight;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = textureId;\n vertexBuffer[this._vertexIndex++] = tint.r / 255;\n vertexBuffer[this._vertexIndex++] = tint.g / 255;\n vertexBuffer[this._vertexIndex++] = tint.b / 255;\n vertexBuffer[this._vertexIndex++] = tint.a;\n // (0, 1) - 1\n vertexBuffer[this._vertexIndex++] = this._quad[4];\n vertexBuffer[this._vertexIndex++] = this._quad[5];\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = txWidth;\n vertexBuffer[this._vertexIndex++] = txHeight;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = textureId;\n vertexBuffer[this._vertexIndex++] = tint.r / 255;\n vertexBuffer[this._vertexIndex++] = tint.g / 255;\n vertexBuffer[this._vertexIndex++] = tint.b / 255;\n vertexBuffer[this._vertexIndex++] = tint.a;\n // (1, 0) - 2\n vertexBuffer[this._vertexIndex++] = this._quad[2];\n vertexBuffer[this._vertexIndex++] = this._quad[3];\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = txWidth;\n vertexBuffer[this._vertexIndex++] = txHeight;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = textureId;\n vertexBuffer[this._vertexIndex++] = tint.r / 255;\n vertexBuffer[this._vertexIndex++] = tint.g / 255;\n vertexBuffer[this._vertexIndex++] = tint.b / 255;\n vertexBuffer[this._vertexIndex++] = tint.a;\n // (1, 1) - 3\n vertexBuffer[this._vertexIndex++] = this._quad[6];\n vertexBuffer[this._vertexIndex++] = this._quad[7];\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = txWidth;\n vertexBuffer[this._vertexIndex++] = txHeight;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = textureId;\n vertexBuffer[this._vertexIndex++] = tint.r / 255;\n vertexBuffer[this._vertexIndex++] = tint.g / 255;\n vertexBuffer[this._vertexIndex++] = tint.b / 255;\n vertexBuffer[this._vertexIndex++] = tint.a;\n }\n hasPendingDraws() {\n return this._imageCount !== 0;\n }\n flush() {\n // nothing to draw early exit\n if (this._imageCount === 0) {\n return;\n }\n const gl = this._gl;\n // Bind the shader\n this._shader.use();\n // Bind the memory layout and upload data\n this._layout.use(true, 4 * 12 * this._imageCount); // 4 verts * 12 components\n // Update ortho matrix uniform\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n // Turn on pixel art aa sampler\n this._shader.setUniformBoolean('u_pixelart', this.pixelArtSampler);\n // Bind textures to\n this._bindTextures(gl);\n // Bind index buffer\n this._quads.bind();\n // Draw all the quads\n gl.drawElements(gl.TRIANGLES, this._imageCount * 6, this._quads.bufferGlType, 0);\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_13__.GraphicsDiagnostics.DrawnImagesCount += this._imageCount;\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_13__.GraphicsDiagnostics.DrawCallCount++;\n // Reset\n this._imageCount = 0;\n this._vertexIndex = 0;\n this._textures.length = 0;\n this._textureIndex = 0;\n this._textureToIndex.clear();\n this._images.clear();\n this._imageToWidth.clear();\n this._imageToHeight.clear();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/line-renderer/line-renderer.ts\":\n/*!*********************************************************!*\\\n !*** ./Graphics/Context/line-renderer/line-renderer.ts ***!\n \\*********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ LineRenderer: () => (/* binding */ LineRenderer)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _line_vertex_glsl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./line-vertex.glsl */ \"./Graphics/Context/line-renderer/line-vertex.glsl\");\n/* harmony import */ var _line_fragment_glsl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./line-fragment.glsl */ \"./Graphics/Context/line-renderer/line-fragment.glsl\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../.. */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../.. */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../.. */ \"./Graphics/Context/vertex-layout.ts\");\n/* harmony import */ var _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n\n\n\n\n\nclass LineRenderer {\n constructor() {\n this.type = 'ex.line';\n this.priority = 0;\n this._maxLines = 10922;\n this._vertexIndex = 0;\n this._lineCount = 0;\n this._startScratch = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n this._endScratch = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n }\n initialize(gl, context) {\n this._gl = gl;\n this._context = context;\n this._shader = new ___WEBPACK_IMPORTED_MODULE_1__.Shader({\n gl,\n vertexSource: _line_vertex_glsl__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n fragmentSource: _line_fragment_glsl__WEBPACK_IMPORTED_MODULE_3__[\"default\"]\n });\n this._shader.compile();\n this._shader.use();\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n this._vertexBuffer = new ___WEBPACK_IMPORTED_MODULE_4__.VertexBuffer({\n gl,\n size: 6 * 2 * this._maxLines,\n type: 'dynamic'\n });\n this._layout = new ___WEBPACK_IMPORTED_MODULE_5__.VertexLayout({\n gl,\n vertexBuffer: this._vertexBuffer,\n shader: this._shader,\n attributes: [\n ['a_position', 2],\n ['a_color', 4]\n ]\n });\n }\n dispose() {\n this._vertexBuffer.dispose();\n this._shader.dispose();\n this._context = null;\n this._gl = null;\n }\n draw(start, end, color) {\n // Force a render if the batch is full\n if (this._isFull()) {\n this.flush();\n }\n this._lineCount++;\n const transform = this._context.getTransform();\n const finalStart = transform.multiply(start, this._startScratch);\n const finalEnd = transform.multiply(end, this._endScratch);\n const vertexBuffer = this._vertexBuffer.bufferData;\n // Start\n vertexBuffer[this._vertexIndex++] = finalStart.x;\n vertexBuffer[this._vertexIndex++] = finalStart.y;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n // End\n vertexBuffer[this._vertexIndex++] = finalEnd.x;\n vertexBuffer[this._vertexIndex++] = finalEnd.y;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n }\n _isFull() {\n if (this._lineCount >= this._maxLines) {\n return true;\n }\n return false;\n }\n hasPendingDraws() {\n return this._lineCount !== 0;\n }\n flush() {\n // nothing to draw early exit\n if (this._lineCount === 0) {\n return;\n }\n const gl = this._gl;\n this._shader.use();\n this._layout.use(true);\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n gl.drawArrays(gl.LINES, 0, this._lineCount * 2); // 2 verts per line\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_6__.GraphicsDiagnostics.DrawnImagesCount += this._lineCount;\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_6__.GraphicsDiagnostics.DrawCallCount++;\n // reset\n this._vertexIndex = 0;\n this._lineCount = 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/material-renderer/material-renderer.ts\":\n/*!*****************************************************************!*\\\n !*** ./Graphics/Context/material-renderer/material-renderer.ts ***!\n \\*****************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MaterialRenderer: () => (/* binding */ MaterialRenderer)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n/* harmony import */ var _ImageSource__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../ImageSource */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../Wrapping */ \"./Graphics/Wrapping.ts\");\n/* harmony import */ var _quad_index_buffer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../quad-index-buffer */ \"./Graphics/Context/quad-index-buffer.ts\");\n/* harmony import */ var _vertex_buffer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _vertex_layout__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../vertex-layout */ \"./Graphics/Context/vertex-layout.ts\");\n\n\n\n\n\n\n\n\nclass MaterialRenderer {\n constructor() {\n this.type = 'ex.material';\n this.priority = 0;\n this._textures = [];\n }\n initialize(gl, context) {\n this._gl = gl;\n this._context = context;\n // Setup memory layout\n this._buffer = new _vertex_buffer__WEBPACK_IMPORTED_MODULE_0__.VertexBuffer({\n gl,\n size: 6 * 4, // 6 components * 4 verts\n type: 'dynamic'\n });\n // Setup a vertex layout/buffer to the material\n this._layout = new _vertex_layout__WEBPACK_IMPORTED_MODULE_1__.VertexLayout({\n gl,\n vertexBuffer: this._buffer,\n attributes: [\n ['a_position', 2],\n ['a_uv', 2],\n ['a_screenuv', 2]\n ],\n suppressWarnings: true\n });\n // Setup index buffer\n this._quads = new _quad_index_buffer__WEBPACK_IMPORTED_MODULE_2__.QuadIndexBuffer(gl, 1, true);\n }\n dispose() {\n this._buffer.dispose();\n this._quads.dispose();\n this._textures.length = 0;\n this._context = null;\n this._gl = null;\n }\n draw(image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight) {\n var _a, _b, _c, _d;\n const gl = this._gl;\n // Extract context info\n const material = this._context.material;\n if (!material) {\n return;\n }\n const transform = this._context.getTransform();\n const opacity = this._context.opacity;\n // material shader\n const shader = material.getShader();\n // construct geometry, or hold on to it in the material?\n // geometry primitive for drawing rectangles?\n // update data\n const vertexBuffer = this._layout.vertexBuffer.bufferData;\n let vertexIndex = 0;\n let width = (image === null || image === void 0 ? void 0 : image.width) || swidth || 0;\n let height = (image === null || image === void 0 ? void 0 : image.height) || sheight || 0;\n let view = [0, 0, (_a = swidth !== null && swidth !== void 0 ? swidth : image === null || image === void 0 ? void 0 : image.width) !== null && _a !== void 0 ? _a : 0, (_b = sheight !== null && sheight !== void 0 ? sheight : image === null || image === void 0 ? void 0 : image.height) !== null && _b !== void 0 ? _b : 0];\n let dest = [sx !== null && sx !== void 0 ? sx : 1, sy !== null && sy !== void 0 ? sy : 1];\n // If destination is specified, update view and dest\n if (dx !== undefined && dy !== undefined && dwidth !== undefined && dheight !== undefined) {\n view = [sx !== null && sx !== void 0 ? sx : 1, sy !== null && sy !== void 0 ? sy : 1, (_c = swidth !== null && swidth !== void 0 ? swidth : image === null || image === void 0 ? void 0 : image.width) !== null && _c !== void 0 ? _c : 0, (_d = sheight !== null && sheight !== void 0 ? sheight : image === null || image === void 0 ? void 0 : image.height) !== null && _d !== void 0 ? _d : 0];\n dest = [dx, dy];\n width = dwidth;\n height = dheight;\n }\n sx = view[0];\n sy = view[1];\n const sw = view[2];\n const sh = view[3];\n const topLeft = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(dest[0], dest[1]);\n const topRight = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(dest[0] + width, dest[1]);\n const bottomLeft = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(dest[0], dest[1] + height);\n const bottomRight = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(dest[0] + width, dest[1] + height);\n const imageWidth = image.width || width;\n const imageHeight = image.height || height;\n const uvx0 = sx / imageWidth;\n const uvy0 = sy / imageHeight;\n const uvx1 = (sx + sw - 0.01) / imageWidth;\n const uvy1 = (sy + sh - 0.01) / imageHeight;\n const topLeftScreen = transform.getPosition();\n const bottomRightScreen = topLeftScreen.add(bottomRight);\n const screenUVX0 = topLeftScreen.x / this._context.width;\n const screenUVY0 = topLeftScreen.y / this._context.height;\n const screenUVX1 = bottomRightScreen.x / this._context.width;\n const screenUVY1 = bottomRightScreen.y / this._context.height;\n // (0, 0) - 0\n vertexBuffer[vertexIndex++] = topLeft.x;\n vertexBuffer[vertexIndex++] = topLeft.y;\n vertexBuffer[vertexIndex++] = uvx0;\n vertexBuffer[vertexIndex++] = uvy0;\n vertexBuffer[vertexIndex++] = screenUVX0;\n vertexBuffer[vertexIndex++] = screenUVY0;\n // (0, 1) - 1\n vertexBuffer[vertexIndex++] = bottomLeft.x;\n vertexBuffer[vertexIndex++] = bottomLeft.y;\n vertexBuffer[vertexIndex++] = uvx0;\n vertexBuffer[vertexIndex++] = uvy1;\n vertexBuffer[vertexIndex++] = screenUVX0;\n vertexBuffer[vertexIndex++] = screenUVY1;\n // (1, 0) - 2\n vertexBuffer[vertexIndex++] = topRight.x;\n vertexBuffer[vertexIndex++] = topRight.y;\n vertexBuffer[vertexIndex++] = uvx1;\n vertexBuffer[vertexIndex++] = uvy0;\n vertexBuffer[vertexIndex++] = screenUVX1;\n vertexBuffer[vertexIndex++] = screenUVY0;\n // (1, 1) - 3\n vertexBuffer[vertexIndex++] = bottomRight.x;\n vertexBuffer[vertexIndex++] = bottomRight.y;\n vertexBuffer[vertexIndex++] = uvx1;\n vertexBuffer[vertexIndex++] = uvy1;\n vertexBuffer[vertexIndex++] = screenUVX1;\n vertexBuffer[vertexIndex++] = screenUVY1;\n // This creates and uploads the texture if not already done\n const texture = this._addImageAsTexture(image);\n // apply material\n material.use();\n this._layout.shader = shader;\n // apply layout and geometry\n this._layout.use(true);\n // apply time in ms since the page (performance.now())\n shader.trySetUniformFloat('u_time_ms', performance.now());\n // apply opacity\n shader.trySetUniformFloat('u_opacity', opacity);\n // apply resolution\n shader.trySetUniformFloatVector('u_resolution', (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this._context.width, this._context.height));\n // apply graphic resolution\n shader.trySetUniformFloatVector('u_graphic_resolution', (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(imageWidth, imageHeight));\n // apply size\n shader.trySetUniformFloatVector('u_size', (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(sw, sh));\n // apply orthographic projection\n shader.trySetUniformMatrix('u_matrix', this._context.ortho);\n // apply geometry transform\n shader.trySetUniformMatrix('u_transform', transform.to4x4());\n // bind graphic image texture 'uniform sampler2D u_graphic;'\n gl.activeTexture(gl.TEXTURE0 + 0);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n shader.trySetUniformInt('u_graphic', 0);\n // bind the screen texture\n gl.activeTexture(gl.TEXTURE0 + 1);\n gl.bindTexture(gl.TEXTURE_2D, this._context.materialScreenTexture);\n shader.trySetUniformInt('u_screen_texture', 1);\n // bind any additional textures in the material\n material.uploadAndBind(gl);\n // bind quad index buffer\n this._quads.bind();\n // Draw a single quad\n gl.drawElements(gl.TRIANGLES, 6, this._quads.bufferGlType, 0);\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_4__.GraphicsDiagnostics.DrawnImagesCount++;\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_4__.GraphicsDiagnostics.DrawCallCount++;\n }\n _addImageAsTexture(image) {\n const maybeFiltering = image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_5__.ImageSourceAttributeConstants.Filtering);\n const filtering = maybeFiltering ? (0,_Filtering__WEBPACK_IMPORTED_MODULE_6__.parseImageFiltering)(maybeFiltering) : undefined;\n const wrapX = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_7__.parseImageWrapping)(image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_5__.ImageSourceAttributeConstants.WrappingX));\n const wrapY = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_7__.parseImageWrapping)(image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_5__.ImageSourceAttributeConstants.WrappingY));\n const force = image.getAttribute('forceUpload') === 'true' ? true : false;\n const texture = this._context.textureLoader.load(image, {\n filtering,\n wrapping: { x: wrapX, y: wrapY }\n }, force);\n // remove force attribute after upload\n image.removeAttribute('forceUpload');\n if (this._textures.indexOf(texture) === -1) {\n this._textures.push(texture);\n }\n return texture;\n }\n hasPendingDraws() {\n return false;\n }\n flush() {\n // flush does not do anything, material renderer renders immediately per draw\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/material.ts\":\n/*!**************************************!*\\\n !*** ./Graphics/Context/material.ts ***!\n \\**************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Material: () => (/* binding */ Material)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Color */ \"./Color.ts\");\n/* harmony import */ var _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _ImageSource__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ImageSource */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Wrapping */ \"./Graphics/Wrapping.ts\");\n\n\n\n\n\n\nconst defaultVertexSource = `#version 300 es\r\nin vec2 a_position;\r\n\r\nin vec2 a_uv;\r\nout vec2 v_uv;\r\n\r\nin vec2 a_screenuv;\r\nout vec2 v_screenuv;\r\n\r\nuniform mat4 u_matrix;\r\nuniform mat4 u_transform;\r\n\r\nvoid main() {\r\n // Set the vertex position using the ortho & transform matrix\r\n gl_Position = u_matrix * u_transform * vec4(a_position, 0.0, 1.0);\r\n\r\n // Pass through the UV coord to the fragment shader\r\n v_uv = a_uv;\r\n v_screenuv = a_screenuv;\r\n}\r\n`;\nclass Material {\n constructor(options) {\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance();\n this._color = _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Transparent;\n this._initialized = false;\n this._images = new Map();\n this._textures = new Map();\n const { color, name, vertexSource, fragmentSource, graphicsContext, images } = options;\n this._name = name !== null && name !== void 0 ? name : 'anonymous material';\n this._vertexSource = vertexSource !== null && vertexSource !== void 0 ? vertexSource : defaultVertexSource;\n this._fragmentSource = fragmentSource;\n this._color = color !== null && color !== void 0 ? color : this._color;\n if (!graphicsContext) {\n throw Error(`Material ${name} must be provided an excalibur webgl graphics context`);\n }\n if (graphicsContext instanceof _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_2__.ExcaliburGraphicsContextWebGL) {\n this._graphicsContext = graphicsContext;\n this._initialize(graphicsContext);\n }\n else {\n this._logger.warn(`Material ${name} was created in 2D Canvas mode, currently only WebGL is supported`);\n }\n if (images) {\n for (const key in images) {\n this.addImageSource(key, images[key]);\n }\n }\n }\n _initialize(graphicsContextWebGL) {\n if (this._initialized) {\n return;\n }\n const gl = graphicsContextWebGL.__gl;\n // max texture slots - 2 for the graphic texture and screen texture\n this._maxTextureSlots = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS) - 2;\n this._shader = graphicsContextWebGL.createShader({\n vertexSource: this._vertexSource,\n fragmentSource: this._fragmentSource\n });\n this._shader.compile();\n this._initialized = true;\n }\n get color() {\n return this._color;\n }\n set color(c) {\n this._color = c;\n }\n get name() {\n var _a;\n return (_a = this._name) !== null && _a !== void 0 ? _a : 'anonymous material';\n }\n get isUsingScreenTexture() {\n return this._fragmentSource.includes('u_screen_texture');\n }\n update(callback) {\n if (this._shader) {\n this._shader.use();\n callback(this._shader);\n }\n }\n getShader() {\n return this._shader;\n }\n addImageSource(textureUniformName, image) {\n if (this._images.size < this._maxTextureSlots) {\n this._images.set(textureUniformName, image);\n }\n else {\n this._logger.warn(`Max number texture slots ${this._maxTextureSlots} have been reached for material \"${this.name}\", ` +\n `no more textures will be uploaded due to hardware constraints.`);\n }\n }\n removeImageSource(textureName) {\n const image = this._images.get(textureName);\n this._graphicsContext.textureLoader.delete(image.image);\n this._images.delete(textureName);\n }\n _loadImageSource(image) {\n const imageElement = image.image;\n const maybeFiltering = imageElement.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_3__.ImageSourceAttributeConstants.Filtering);\n const filtering = maybeFiltering ? (0,_Filtering__WEBPACK_IMPORTED_MODULE_4__.parseImageFiltering)(maybeFiltering) : undefined;\n const wrapX = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_5__.parseImageWrapping)(imageElement.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_3__.ImageSourceAttributeConstants.WrappingX));\n const wrapY = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_5__.parseImageWrapping)(imageElement.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_3__.ImageSourceAttributeConstants.WrappingY));\n const force = imageElement.getAttribute('forceUpload') === 'true' ? true : false;\n const texture = this._graphicsContext.textureLoader.load(imageElement, {\n filtering,\n wrapping: { x: wrapX, y: wrapY }\n }, force);\n // remove force attribute after upload\n imageElement.removeAttribute('forceUpload');\n if (!this._textures.has(image)) {\n this._textures.set(image, texture);\n }\n return texture;\n }\n uploadAndBind(gl, startingTextureSlot = 2) {\n let textureSlot = startingTextureSlot;\n for (const [textureName, image] of this._images.entries()) {\n if (!image.isLoaded()) {\n this._logger.warnOnce(`Image named ${textureName} in material ${this.name} not loaded, nothing will be uploaded to the shader.` +\n ` Did you forget to add this to a loader? https://excaliburjs.com/docs/loaders/`);\n continue;\n } // skip unloaded images, maybe warn\n const texture = this._loadImageSource(image);\n gl.activeTexture(gl.TEXTURE0 + textureSlot);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n this._shader.trySetUniformInt(textureName, textureSlot);\n textureSlot++;\n }\n }\n use() {\n if (this._initialized) {\n // bind the shader\n this._shader.use();\n // Apply standard uniforms\n this._shader.trySetUniformFloatColor('u_color', this._color);\n }\n else {\n throw Error(`Material ${this.name} not yet initialized, use the ExcaliburGraphicsContext.createMaterial() to work around this.`);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/particle-renderer/particle-renderer.ts\":\n/*!*****************************************************************!*\\\n !*** ./Graphics/Context/particle-renderer/particle-renderer.ts ***!\n \\*****************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ParticleRenderer: () => (/* binding */ ParticleRenderer)\n/* harmony export */ });\n/* harmony import */ var _shader__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _particle_vertex_glsl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./particle-vertex.glsl */ \"./Graphics/Context/particle-renderer/particle-vertex.glsl\");\n/* harmony import */ var _particle_fragment_glsl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./particle-fragment.glsl */ \"./Graphics/Context/particle-renderer/particle-fragment.glsl\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../../Color */ \"./Color.ts\");\n/* harmony import */ var _ImageSource__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../ImageSource */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Wrapping */ \"./Graphics/Wrapping.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Particles_Particles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../Particles/Particles */ \"./Particles/Particles.ts\");\n\n\n\n\n\n\n\n\n\nclass ParticleRenderer {\n constructor() {\n this.type = 'ex.particle';\n this.priority = 0;\n }\n initialize(gl, context) {\n this._gl = gl;\n this._context = context;\n this._shader = new _shader__WEBPACK_IMPORTED_MODULE_0__.Shader({\n gl,\n vertexSource: _particle_vertex_glsl__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n fragmentSource: _particle_fragment_glsl__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n onPreLink: (program) => {\n gl.transformFeedbackVaryings(program, ['finalPosition', 'finalVelocity', 'finalRotation', 'finalAngularVelocity', 'finalLifeMs'], gl.INTERLEAVED_ATTRIBS);\n }\n });\n this._shader.compile();\n this._shader.use();\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n }\n _getTexture(image) {\n const maybeFiltering = image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_3__.ImageSourceAttributeConstants.Filtering);\n const filtering = maybeFiltering ? (0,_Filtering__WEBPACK_IMPORTED_MODULE_4__.parseImageFiltering)(maybeFiltering) : undefined;\n const wrapX = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_5__.parseImageWrapping)(image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_3__.ImageSourceAttributeConstants.WrappingX));\n const wrapY = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_5__.parseImageWrapping)(image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_3__.ImageSourceAttributeConstants.WrappingY));\n const force = image.getAttribute('forceUpload') === 'true' ? true : false;\n const texture = this._context.textureLoader.load(image, {\n filtering,\n wrapping: { x: wrapX, y: wrapY }\n }, force);\n // remove force attribute after upload\n image.removeAttribute('forceUpload');\n return texture;\n }\n draw(renderer, elapsed) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j;\n const gl = this._gl;\n this._shader.use();\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n const transform = renderer.particle.transform === _Particles_Particles__WEBPACK_IMPORTED_MODULE_6__.ParticleTransform.Local\n ? this._context.getTransform()\n : this._context.getTransform().multiply(renderer.emitter.transform.get().inverse);\n this._shader.setUniformAffineMatrix('u_transform', transform);\n this._shader.setUniformBoolean('fade', renderer.particle.fade ? true : false);\n this._shader.setUniformBoolean('useTexture', renderer.particle.graphic ? true : false);\n this._shader.setUniformFloat('maxLifeMs', (_a = renderer.particle.life) !== null && _a !== void 0 ? _a : 2000);\n this._shader.setUniformFloat('deltaMs', elapsed);\n this._shader.setUniformFloatVector('gravity', (_b = renderer.particle.acc) !== null && _b !== void 0 ? _b : (0,_Math_vector__WEBPACK_IMPORTED_MODULE_7__.vec)(0, 0));\n this._shader.setUniformFloatColor('beginColor', (_c = renderer.particle.beginColor) !== null && _c !== void 0 ? _c : _Color__WEBPACK_IMPORTED_MODULE_8__.Color.Transparent);\n this._shader.setUniformFloatColor('endColor', (_d = renderer.particle.endColor) !== null && _d !== void 0 ? _d : _Color__WEBPACK_IMPORTED_MODULE_8__.Color.Transparent);\n let startSize = (_e = renderer.particle.startSize) !== null && _e !== void 0 ? _e : 0;\n let endSize = (_f = renderer.particle.endSize) !== null && _f !== void 0 ? _f : 0;\n const size = (_g = renderer.particle.size) !== null && _g !== void 0 ? _g : 0;\n if (size > 0) {\n startSize = size;\n endSize = size;\n }\n this._shader.setUniformFloat('startSize', startSize !== null && startSize !== void 0 ? startSize : 10);\n this._shader.setUniformFloat('endSize', endSize !== null && endSize !== void 0 ? endSize : 10);\n this._shader.setUniformFloat('startOpacity', (_h = renderer.particle.opacity) !== null && _h !== void 0 ? _h : 1);\n if (renderer.particle.focus) {\n this._shader.setUniformFloatVector('focus', renderer.particle.focus);\n this._shader.setUniformFloat('focusAccel', (_j = renderer.particle.focusAccel) !== null && _j !== void 0 ? _j : 0);\n }\n // Particle Graphic (only Sprites right now)\n if (renderer.particle.graphic) {\n const graphic = renderer.particle.graphic;\n const texture = this._getTexture(graphic.image.image);\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n this._shader.setUniformInt('graphic', 0);\n }\n // Collision Mask\n // gl.activeTexture(gl.TEXTURE0 + 1);\n // gl.bindTexture(gl.TEXTURE_2D, obstacleTex);\n // gl.uniform1i(u_obstacle, 1);\n renderer.draw(gl);\n }\n hasPendingDraws() {\n return false;\n }\n flush() {\n // pass\n }\n dispose() {\n // pass\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/point-renderer/point-renderer.ts\":\n/*!***********************************************************!*\\\n !*** ./Graphics/Context/point-renderer/point-renderer.ts ***!\n \\***********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointRenderer: () => (/* binding */ PointRenderer)\n/* harmony export */ });\n/* harmony import */ var _point_vertex_glsl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./point-vertex.glsl */ \"./Graphics/Context/point-renderer/point-vertex.glsl\");\n/* harmony import */ var _point_fragment_glsl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./point-fragment.glsl */ \"./Graphics/Context/point-renderer/point-fragment.glsl\");\n/* harmony import */ var _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _shader__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _vertex_buffer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _vertex_layout__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../vertex-layout */ \"./Graphics/Context/vertex-layout.ts\");\n/* harmony import */ var _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n\n\n\n\n\n\n\nclass PointRenderer {\n constructor() {\n this.type = 'ex.point';\n this.priority = 0;\n this._maxPoints = 10922;\n this._pointCount = 0;\n this._vertexIndex = 0;\n }\n initialize(gl, context) {\n this._gl = gl;\n this._context = context;\n this._shader = new _shader__WEBPACK_IMPORTED_MODULE_0__.Shader({\n gl,\n vertexSource: _point_vertex_glsl__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n fragmentSource: _point_fragment_glsl__WEBPACK_IMPORTED_MODULE_2__[\"default\"]\n });\n this._shader.compile();\n this._shader.use();\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n this._buffer = new _vertex_buffer__WEBPACK_IMPORTED_MODULE_3__.VertexBuffer({\n gl,\n size: 7 * this._maxPoints,\n type: 'dynamic'\n });\n this._layout = new _vertex_layout__WEBPACK_IMPORTED_MODULE_4__.VertexLayout({\n gl,\n shader: this._shader,\n vertexBuffer: this._buffer,\n attributes: [\n ['a_position', 2],\n ['a_color', 4],\n ['a_size', 1]\n ]\n });\n }\n dispose() {\n this._buffer.dispose();\n this._shader.dispose();\n this._context = null;\n this._gl = null;\n }\n draw(point, color, size) {\n // Force a render if the batch is full\n if (this._isFull()) {\n this.flush();\n }\n this._pointCount++;\n const transform = this._context.getTransform();\n const opacity = this._context.opacity;\n const snapToPixel = this._context.snapToPixel;\n const finalPoint = transform.multiply(point);\n if (snapToPixel) {\n finalPoint.x = ~~(finalPoint.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_5__.pixelSnapEpsilon);\n finalPoint.y = ~~(finalPoint.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_5__.pixelSnapEpsilon);\n }\n const vertexBuffer = this._buffer.bufferData;\n vertexBuffer[this._vertexIndex++] = finalPoint.x;\n vertexBuffer[this._vertexIndex++] = finalPoint.y;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a * opacity;\n vertexBuffer[this._vertexIndex++] = size * Math.max(transform.getScaleX(), transform.getScaleY());\n }\n _isFull() {\n if (this._pointCount >= this._maxPoints) {\n return true;\n }\n return false;\n }\n hasPendingDraws() {\n return this._pointCount !== 0;\n }\n flush() {\n // nothing to draw early exit\n if (this._pointCount === 0) {\n return;\n }\n const gl = this._gl;\n this._shader.use();\n this._layout.use(true);\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n gl.drawArrays(gl.POINTS, 0, this._pointCount);\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_6__.GraphicsDiagnostics.DrawnImagesCount += this._pointCount;\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_6__.GraphicsDiagnostics.DrawCallCount++;\n this._pointCount = 0;\n this._vertexIndex = 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/quad-index-buffer.ts\":\n/*!***********************************************!*\\\n !*** ./Graphics/Context/quad-index-buffer.ts ***!\n \\***********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ QuadIndexBuffer: () => (/* binding */ QuadIndexBuffer)\n/* harmony export */ });\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../.. */ \"./Util/Log.ts\");\n\n/**\n * Helper that defines and index buffer for quad geometry\n *\n * Index buffers allow you to save space in vertex buffers when you share vertices in geometry\n * it is almost always worth it in terms of performance to use an index buffer.\n */\nclass QuadIndexBuffer {\n /**\n * @param gl WebGL2RenderingContext this layout will be attached to, these cannot be reused across contexts.\n * @param numberOfQuads Specify the max number of quads you want to draw\n * @param useUint16 Optionally force a uint16 buffer\n */\n constructor(gl, numberOfQuads, useUint16) {\n this._logger = ___WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance();\n this._gl = gl;\n this.buffer = gl.createBuffer();\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.buffer);\n const totalVertices = numberOfQuads * 6;\n if (!useUint16) {\n this.bufferData = new Uint32Array(totalVertices);\n }\n else {\n // fall back to using gl.UNSIGNED_SHORT or tell the user they are out of luck\n const maxUint16 = 65535;\n const maxUint16Index = Math.floor((maxUint16 - 1) / 4); // max quads\n this.bufferGlType = gl.UNSIGNED_SHORT;\n this.bufferData = new Uint16Array(totalVertices);\n // TODO Should we error if this happens?? maybe not might crash mid game\n if (numberOfQuads > maxUint16Index) {\n this._logger.warn(`Total quads exceeds hardware index buffer limit (uint16), max(${maxUint16Index}) requested quads(${numberOfQuads})`);\n }\n }\n let currentQuad = 0;\n for (let i = 0; i < totalVertices; i += 6) {\n // first triangle\n this.bufferData[i + 0] = currentQuad + 0;\n this.bufferData[i + 1] = currentQuad + 1;\n this.bufferData[i + 2] = currentQuad + 2;\n // second triangle\n this.bufferData[i + 3] = currentQuad + 2;\n this.bufferData[i + 4] = currentQuad + 1;\n this.bufferData[i + 5] = currentQuad + 3;\n currentQuad += 4;\n }\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.bufferData, gl.STATIC_DRAW);\n }\n get size() {\n return this.bufferData.length;\n }\n /**\n * Upload data to the GPU\n */\n upload() {\n const gl = this._gl;\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.buffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.bufferData, gl.STATIC_DRAW);\n }\n /**\n * Bind this index buffer\n */\n bind() {\n const gl = this._gl;\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.buffer);\n }\n dispose() {\n const gl = this._gl;\n gl.deleteBuffer(this.buffer);\n this._gl = null;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/rectangle-renderer/rectangle-renderer.ts\":\n/*!*******************************************************************!*\\\n !*** ./Graphics/Context/rectangle-renderer/rectangle-renderer.ts ***!\n \\*******************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RectangleRenderer: () => (/* binding */ RectangleRenderer)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Color */ \"./Color.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n/* harmony import */ var _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _quad_index_buffer__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../quad-index-buffer */ \"./Graphics/Context/quad-index-buffer.ts\");\n/* harmony import */ var _shader__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _vertex_buffer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _vertex_layout__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../vertex-layout */ \"./Graphics/Context/vertex-layout.ts\");\n/* harmony import */ var _rectangle_renderer_frag_glsl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./rectangle-renderer.frag.glsl */ \"./Graphics/Context/rectangle-renderer/rectangle-renderer.frag.glsl\");\n/* harmony import */ var _rectangle_renderer_vert_glsl__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./rectangle-renderer.vert.glsl */ \"./Graphics/Context/rectangle-renderer/rectangle-renderer.vert.glsl\");\n\n\n\n\n\n\n\n\n\n\nclass RectangleRenderer {\n constructor() {\n this.type = 'ex.rectangle';\n this.priority = 0;\n this._maxRectangles = 10922; // max(uint16) / 6 verts\n this._rectangleCount = 0;\n this._vertexIndex = 0;\n this._transparent = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Transparent;\n this._scratch1 = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0);\n this._scratch2 = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0);\n this._scratch3 = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0);\n this._scratch4 = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0);\n }\n initialize(gl, context) {\n this._gl = gl;\n this._context = context;\n // https://stackoverflow.com/questions/59197671/glsl-rounded-rectangle-with-variable-border\n this._shader = new _shader__WEBPACK_IMPORTED_MODULE_2__.Shader({\n gl,\n fragmentSource: _rectangle_renderer_frag_glsl__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n vertexSource: _rectangle_renderer_vert_glsl__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n });\n this._shader.compile();\n // setup uniforms\n this._shader.use();\n this._shader.setUniformMatrix('u_matrix', context.ortho);\n this._buffer = new _vertex_buffer__WEBPACK_IMPORTED_MODULE_5__.VertexBuffer({\n gl,\n size: 16 * 4 * this._maxRectangles,\n type: 'dynamic'\n });\n this._layout = new _vertex_layout__WEBPACK_IMPORTED_MODULE_6__.VertexLayout({\n gl,\n shader: this._shader,\n vertexBuffer: this._buffer,\n attributes: [\n ['a_position', 2],\n ['a_uv', 2],\n ['a_size', 2],\n ['a_opacity', 1],\n ['a_color', 4],\n ['a_strokeColor', 4],\n ['a_strokeThickness', 1]\n ]\n });\n this._quads = new _quad_index_buffer__WEBPACK_IMPORTED_MODULE_7__.QuadIndexBuffer(gl, this._maxRectangles, true);\n }\n dispose() {\n this._buffer.dispose();\n this._quads.dispose();\n this._shader.dispose();\n this._context = null;\n this._gl = null;\n }\n _isFull() {\n if (this._rectangleCount >= this._maxRectangles) {\n return true;\n }\n return false;\n }\n draw(...args) {\n if (args[0] instanceof _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector && args[1] instanceof _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector) {\n this.drawLine.apply(this, args);\n }\n else {\n this.drawRectangle.apply(this, args);\n }\n }\n drawLine(start, end, color, thickness = 1) {\n if (this._isFull()) {\n this.flush();\n }\n this._rectangleCount++;\n // transform based on current context\n const transform = this._context.getTransform();\n const opacity = this._context.opacity;\n const snapToPixel = this._context.snapToPixel;\n const dir = end.sub(start);\n const length = dir.magnitude;\n const normal = dir.normalize().perpendicular();\n const halfThick = thickness / 2;\n /**\n * +---------------------^----------------------+\n * | | (normal) |\n * (startX, startY)------------------>(endX, endY)\n * | |\n * + -------------------------------------------+\n */\n const startTop = transform.multiply(normal.scale(halfThick, this._scratch1).add(start, this._scratch1), this._scratch1);\n const startBottom = transform.multiply(normal.scale(-halfThick, this._scratch2).add(start, this._scratch2), this._scratch2);\n const endTop = transform.multiply(normal.scale(halfThick, this._scratch3).add(end, this._scratch3), this._scratch3);\n const endBottom = transform.multiply(normal.scale(-halfThick, this._scratch4).add(end, this._scratch4), this._scratch4);\n if (snapToPixel) {\n startTop.x = ~~(startTop.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n startTop.y = ~~(startTop.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n endTop.x = ~~(endTop.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n endTop.y = ~~(endTop.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n startBottom.x = ~~(startBottom.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n startBottom.y = ~~(startBottom.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n endBottom.x = ~~(endBottom.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n endBottom.y = ~~(endBottom.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n }\n // TODO uv could be static vertex buffer\n const uvx0 = 0;\n const uvy0 = 0;\n const uvx1 = 1;\n const uvy1 = 1;\n const stroke = this._transparent;\n const strokeThickness = 0;\n const width = 1;\n // update data\n const vertexBuffer = this._layout.vertexBuffer.bufferData;\n // (0, 0) - 0\n vertexBuffer[this._vertexIndex++] = startTop.x;\n vertexBuffer[this._vertexIndex++] = startTop.y;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = length;\n vertexBuffer[this._vertexIndex++] = thickness;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness / width;\n // (0, 1) - 1\n vertexBuffer[this._vertexIndex++] = startBottom.x;\n vertexBuffer[this._vertexIndex++] = startBottom.y;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = length;\n vertexBuffer[this._vertexIndex++] = thickness;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness / width;\n // (1, 0) - 2\n vertexBuffer[this._vertexIndex++] = endTop.x;\n vertexBuffer[this._vertexIndex++] = endTop.y;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = length;\n vertexBuffer[this._vertexIndex++] = thickness;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness / width;\n // (1, 1) - 3\n vertexBuffer[this._vertexIndex++] = endBottom.x;\n vertexBuffer[this._vertexIndex++] = endBottom.y;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = length;\n vertexBuffer[this._vertexIndex++] = thickness;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness / width;\n }\n drawRectangle(pos, width, height, color, stroke = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Transparent, strokeThickness = 0) {\n if (this._isFull()) {\n this.flush();\n }\n this._rectangleCount++;\n // transform based on current context\n const transform = this._context.getTransform();\n const opacity = this._context.opacity;\n const snapToPixel = this._context.snapToPixel;\n const topLeft = transform.multiply(pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0)));\n const topRight = transform.multiply(pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(width, 0)));\n const bottomRight = transform.multiply(pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(width, height)));\n const bottomLeft = transform.multiply(pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, height)));\n if (snapToPixel) {\n topLeft.x = ~~(topLeft.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n topLeft.y = ~~(topLeft.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n topRight.x = ~~(topRight.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n topRight.y = ~~(topRight.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n bottomLeft.x = ~~(bottomLeft.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n bottomLeft.y = ~~(bottomLeft.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n bottomRight.x = ~~(bottomRight.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n bottomRight.y = ~~(bottomRight.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n }\n // TODO uv could be static vertex buffer\n const uvx0 = 0;\n const uvy0 = 0;\n const uvx1 = 1;\n const uvy1 = 1;\n // update data\n const vertexBuffer = this._layout.vertexBuffer.bufferData;\n // (0, 0) - 0\n vertexBuffer[this._vertexIndex++] = topLeft.x;\n vertexBuffer[this._vertexIndex++] = topLeft.y;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = width;\n vertexBuffer[this._vertexIndex++] = height;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness;\n // (0, 1) - 1\n vertexBuffer[this._vertexIndex++] = bottomLeft.x;\n vertexBuffer[this._vertexIndex++] = bottomLeft.y;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = width;\n vertexBuffer[this._vertexIndex++] = height;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness;\n // (1, 0) - 2\n vertexBuffer[this._vertexIndex++] = topRight.x;\n vertexBuffer[this._vertexIndex++] = topRight.y;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = width;\n vertexBuffer[this._vertexIndex++] = height;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness;\n // (1, 1) - 3\n vertexBuffer[this._vertexIndex++] = bottomRight.x;\n vertexBuffer[this._vertexIndex++] = bottomRight.y;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = width;\n vertexBuffer[this._vertexIndex++] = height;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness;\n }\n hasPendingDraws() {\n return this._rectangleCount !== 0;\n }\n flush() {\n // nothing to draw early exit\n if (this._rectangleCount === 0) {\n return;\n }\n const gl = this._gl;\n // Bind the shader\n this._shader.use();\n // Bind the memory layout and upload data\n this._layout.use(true);\n // Update ortho matrix uniform\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n // Bind index buffer\n this._quads.bind();\n // Draw all the quads\n gl.drawElements(gl.TRIANGLES, this._rectangleCount * 6, this._quads.bufferGlType, 0);\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_9__.GraphicsDiagnostics.DrawnImagesCount += this._rectangleCount;\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_9__.GraphicsDiagnostics.DrawCallCount++;\n // Reset\n this._rectangleCount = 0;\n this._vertexIndex = 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/render-source.ts\":\n/*!*******************************************!*\\\n !*** ./Graphics/Context/render-source.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RenderSource: () => (/* binding */ RenderSource)\n/* harmony export */ });\nclass RenderSource {\n constructor(_gl, _texture) {\n this._gl = _gl;\n this._texture = _texture;\n }\n use() {\n const gl = this._gl;\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, this._texture);\n }\n disable() {\n const gl = this._gl;\n gl.bindTexture(gl.TEXTURE_2D, null);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/render-target.ts\":\n/*!*******************************************!*\\\n !*** ./Graphics/Context/render-target.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RenderTarget: () => (/* binding */ RenderTarget)\n/* harmony export */ });\n/* harmony import */ var _render_source__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./render-source */ \"./Graphics/Context/render-source.ts\");\n\nclass RenderTarget {\n constructor(options) {\n var _a, _b;\n this.antialias = false;\n this.samples = 1;\n this._gl = options.gl;\n this.width = options.width;\n this.height = options.height;\n this.transparency = options.transparency;\n this.antialias = (_a = options.antialias) !== null && _a !== void 0 ? _a : this.antialias;\n this.samples = (_b = options.samples) !== null && _b !== void 0 ? _b : this._gl.getParameter(this._gl.MAX_SAMPLES);\n const gl = this._gl;\n // Determine current context format for blitting later needs to match\n if (gl.drawingBufferFormat) {\n this.bufferFormat = gl.drawingBufferFormat;\n }\n else {\n // Documented in webgl spec\n // https://registry.khronos.org/webgl/specs/latest/1.0/\n if (this.transparency) {\n this.bufferFormat = gl.RGBA8;\n }\n else {\n this.bufferFormat = gl.RGB8;\n }\n }\n this._setupRenderBuffer();\n this._setupFramebuffer();\n }\n setResolution(width, height) {\n const gl = this._gl;\n this.width = width;\n this.height = height;\n // update backing texture size\n gl.bindTexture(gl.TEXTURE_2D, this._frameTexture);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n // update render buffer size\n if (this._renderBuffer) {\n gl.bindRenderbuffer(gl.RENDERBUFFER, this._renderBuffer);\n gl.renderbufferStorageMultisample(gl.RENDERBUFFER, Math.min(this.samples, gl.getParameter(gl.MAX_SAMPLES)), this.bufferFormat, this.width, this.height);\n }\n }\n get renderBuffer() {\n return this._renderBuffer;\n }\n get renderFrameBuffer() {\n return this._renderFrameBuffer;\n }\n get frameBuffer() {\n return this._frameBuffer;\n }\n get frameTexture() {\n return this._frameTexture;\n }\n _setupRenderBuffer() {\n if (this.antialias) {\n const gl = this._gl;\n // Render buffers can be used as an input to a shader\n this._renderBuffer = gl.createRenderbuffer();\n this._renderFrameBuffer = gl.createFramebuffer();\n gl.bindRenderbuffer(gl.RENDERBUFFER, this._renderBuffer);\n gl.renderbufferStorageMultisample(gl.RENDERBUFFER, Math.min(this.samples, gl.getParameter(gl.MAX_SAMPLES)), this.bufferFormat, this.width, this.height);\n gl.bindFramebuffer(gl.FRAMEBUFFER, this._renderFrameBuffer);\n gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, this._renderBuffer);\n }\n }\n _setupFramebuffer() {\n // Allocates frame buffer\n const gl = this._gl;\n this._frameTexture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, this._frameTexture);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n // set the filtering so we don't need mips\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n // attach the texture as the first color attachment\n const attachmentPoint = gl.COLOR_ATTACHMENT0;\n // After this bind all draw calls will draw to this framebuffer texture\n this._frameBuffer = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, this._frameBuffer);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, attachmentPoint, gl.TEXTURE_2D, this._frameTexture, 0);\n // Reset after initialized\n this.disable();\n }\n toRenderSource() {\n if (this.renderBuffer) {\n this.blitRenderBufferToFrameBuffer();\n }\n const source = new _render_source__WEBPACK_IMPORTED_MODULE_0__.RenderSource(this._gl, this._frameTexture);\n return source;\n }\n blitToScreen() {\n const gl = this._gl;\n // set to size of canvas's drawingBuffer\n if (this._renderBuffer) {\n gl.bindFramebuffer(gl.READ_FRAMEBUFFER, this.renderFrameBuffer);\n gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, null);\n gl.clearBufferfv(gl.COLOR, 0, [0.0, 0.0, 1.0, 1.0]);\n gl.blitFramebuffer(0, 0, this.width, this.height, 0, 0, this.width, this.height, gl.COLOR_BUFFER_BIT, gl.LINEAR);\n }\n else {\n gl.bindFramebuffer(gl.READ_FRAMEBUFFER, this.frameBuffer);\n gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, null);\n gl.clearBufferfv(gl.COLOR, 0, [0.0, 0.0, 1.0, 1.0]);\n gl.blitFramebuffer(0, 0, this.width, this.height, 0, 0, this.width, this.height, gl.COLOR_BUFFER_BIT, gl.LINEAR);\n }\n }\n blitRenderBufferToFrameBuffer() {\n if (this._renderBuffer) {\n const gl = this._gl;\n gl.bindFramebuffer(gl.READ_FRAMEBUFFER, this.renderFrameBuffer);\n gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, this.frameBuffer);\n gl.clearBufferfv(gl.COLOR, 0, [0.0, 0.0, 1.0, 1.0]);\n gl.blitFramebuffer(0, 0, this.width, this.height, 0, 0, this.width, this.height, gl.COLOR_BUFFER_BIT, gl.LINEAR);\n }\n }\n copyToTexture(texture) {\n const gl = this._gl;\n if (this._renderBuffer) {\n this.blitRenderBufferToFrameBuffer();\n }\n gl.bindFramebuffer(gl.FRAMEBUFFER, this._frameBuffer);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.copyTexImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 0, 0, this.width, this.height, 0);\n }\n /**\n * When called, all drawing gets redirected to this render target\n */\n use() {\n const gl = this._gl;\n if (this.antialias) {\n gl.bindFramebuffer(gl.FRAMEBUFFER, this._renderFrameBuffer);\n }\n else {\n gl.bindFramebuffer(gl.FRAMEBUFFER, this._frameBuffer);\n }\n // very important to set the viewport to the size of the framebuffer texture\n gl.viewport(0, 0, this.width, this.height);\n }\n /**\n * When called, all drawing is sent back to the canvas\n */\n disable() {\n const gl = this._gl;\n // passing null switches rendering back to the canvas\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.bindTexture(gl.TEXTURE_2D, null);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/screen-pass-painter/screen-pass-painter.ts\":\n/*!*********************************************************************!*\\\n !*** ./Graphics/Context/screen-pass-painter/screen-pass-painter.ts ***!\n \\*********************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ScreenPassPainter: () => (/* binding */ ScreenPassPainter)\n/* harmony export */ });\n/* harmony import */ var _screen_vertex_glsl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./screen-vertex.glsl */ \"./Graphics/Context/screen-pass-painter/screen-vertex.glsl\");\n/* harmony import */ var _screen_fragment_glsl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./screen-fragment.glsl */ \"./Graphics/Context/screen-pass-painter/screen-fragment.glsl\");\n/* harmony import */ var _shader__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _vertex_buffer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _vertex_layout__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../vertex-layout */ \"./Graphics/Context/vertex-layout.ts\");\n\n\n\n\n\n/**\n * This is responsible for painting the entire screen during the render passes\n */\nclass ScreenPassPainter {\n constructor(gl) {\n this._gl = gl;\n this._shader = new _shader__WEBPACK_IMPORTED_MODULE_0__.Shader({\n gl,\n vertexSource: _screen_vertex_glsl__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n fragmentSource: _screen_fragment_glsl__WEBPACK_IMPORTED_MODULE_2__[\"default\"]\n });\n this._shader.compile();\n // Setup memory layout\n this._buffer = new _vertex_buffer__WEBPACK_IMPORTED_MODULE_3__.VertexBuffer({\n gl,\n type: 'static',\n // clip space quad + uv since we don't need a camera\n data: new Float32Array([\n -1, -1, 0, 0, -1, 1, 0, 1, 1, -1, 1, 0,\n 1, -1, 1, 0, -1, 1, 0, 1, 1, 1, 1, 1\n ])\n });\n this._layout = new _vertex_layout__WEBPACK_IMPORTED_MODULE_4__.VertexLayout({\n gl,\n shader: this._shader,\n vertexBuffer: this._buffer,\n attributes: [\n ['a_position', 2],\n ['a_texcoord', 2]\n ]\n });\n this._buffer.upload();\n }\n renderWithPostProcessor(postprocessor) {\n const gl = this._gl;\n postprocessor.getShader().use();\n postprocessor.getLayout().use();\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n }\n renderToScreen() {\n const gl = this._gl;\n this._shader.use();\n this._layout.use();\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/shader.ts\":\n/*!************************************!*\\\n !*** ./Graphics/Context/shader.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Shader: () => (/* binding */ Shader)\n/* harmony export */ });\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../.. */ \"./Util/Log.ts\");\n/* harmony import */ var _webgl_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./webgl-util */ \"./Graphics/Context/webgl-util.ts\");\n\n\nclass Shader {\n get compiled() {\n return this._compiled;\n }\n /**\n * Create a shader program in excalibur\n * @param options specify shader vertex and fragment source\n */\n constructor(options) {\n this._logger = ___WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance();\n this.uniforms = {};\n this.attributes = {};\n this._compiled = false;\n const { gl, vertexSource, fragmentSource, onPreLink, onPostCompile } = options;\n this._gl = gl;\n this.vertexSource = vertexSource;\n this.fragmentSource = fragmentSource;\n this._onPreLink = onPreLink;\n this._onPostCompile = onPostCompile;\n }\n dispose() {\n const gl = this._gl;\n gl.deleteProgram(this.program);\n this._gl = null;\n }\n /**\n * Binds the shader program\n */\n use() {\n const gl = this._gl;\n gl.useProgram(this.program);\n Shader._ACTIVE_SHADER_INSTANCE = this;\n }\n isCurrentlyBound() {\n return Shader._ACTIVE_SHADER_INSTANCE === this;\n }\n /**\n * Compile the current shader against a webgl context\n */\n compile() {\n const gl = this._gl;\n const vertexShader = this._compileShader(gl, this.vertexSource, gl.VERTEX_SHADER);\n const fragmentShader = this._compileShader(gl, this.fragmentSource, gl.FRAGMENT_SHADER);\n this.program = this._createProgram(gl, vertexShader, fragmentShader);\n const attributes = this.getAttributes();\n for (const attribute of attributes) {\n this.attributes[attribute.name] = attribute;\n }\n const uniforms = this.getUniforms();\n for (const uniform of uniforms) {\n this.uniforms[uniform.name] = uniform;\n }\n this._compiled = true;\n if (this._onPostCompile) {\n this._onPostCompile(this);\n }\n return this.program;\n }\n getUniforms() {\n const gl = this._gl;\n const uniformCount = gl.getProgramParameter(this.program, gl.ACTIVE_UNIFORMS);\n const uniforms = [];\n for (let i = 0; i < uniformCount; i++) {\n const uniform = gl.getActiveUniform(this.program, i);\n const uniformLocation = gl.getUniformLocation(this.program, uniform.name);\n uniforms.push({\n name: uniform.name,\n glType: uniform.type,\n location: uniformLocation\n });\n }\n return uniforms;\n }\n getAttributes() {\n const gl = this._gl;\n const attributeCount = gl.getProgramParameter(this.program, gl.ACTIVE_ATTRIBUTES);\n const attributes = [];\n for (let i = 0; i < attributeCount; i++) {\n const attribute = gl.getActiveAttrib(this.program, i);\n const attributeLocation = gl.getAttribLocation(this.program, attribute.name);\n attributes.push({\n name: attribute.name,\n glType: (0,_webgl_util__WEBPACK_IMPORTED_MODULE_1__.getAttributePointerType)(gl, attribute.type),\n size: (0,_webgl_util__WEBPACK_IMPORTED_MODULE_1__.getAttributeComponentSize)(gl, attribute.type),\n location: attributeLocation,\n normalized: false\n });\n }\n return attributes;\n }\n /**\n * Set a texture in a gpu texture slot\n * @param slotNumber\n * @param texture\n */\n setTexture(slotNumber, texture) {\n const gl = this._gl;\n gl.activeTexture(gl.TEXTURE0 + slotNumber);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n }\n /**\n * Set an integer uniform for the current shader\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n setUniformInt(name, value) {\n this.setUniform('uniform1i', name, ~~value);\n }\n /**\n * Set an integer uniform for the current shader, WILL NOT THROW on error.\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n trySetUniformInt(name, value) {\n return this.trySetUniform('uniform1i', name, ~~value);\n }\n /**\n * Set an integer array uniform for the current shader\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n setUniformIntArray(name, value) {\n this.setUniform('uniform1iv', name, value);\n }\n /**\n * Set an integer array uniform for the current shader, WILL NOT THROW on error.\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n trySetUniformIntArray(name, value) {\n return this.trySetUniform('uniform1iv', name, value);\n }\n /**\n * Set a boolean uniform for the current shader\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n setUniformBoolean(name, value) {\n this.setUniform('uniform1i', name, value ? 1 : 0);\n }\n /**\n * Set a boolean uniform for the current shader, WILL NOT THROW on error.\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n trySetUniformBoolean(name, value) {\n return this.trySetUniform('uniform1i', name, value ? 1 : 0);\n }\n /**\n * Set a float uniform for the current shader\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n setUniformFloat(name, value) {\n this.setUniform('uniform1f', name, value);\n }\n /**\n * Set a float uniform for the current shader, WILL NOT THROW on error.\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n trySetUniformFloat(name, value) {\n return this.trySetUniform('uniform1f', name, value);\n }\n /**\n * Set a float array uniform for the current shader\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n setUniformFloatArray(name, value) {\n this.setUniform('uniform1fv', name, value);\n }\n /**\n * Set a float array uniform for the current shader, WILL NOT THROW on error.\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n trySetUniformFloatArray(name, value) {\n return this.trySetUniform('uniform1fv', name, value);\n }\n /**\n * Set a {@apilink Vector} uniform for the current shader\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n setUniformFloatVector(name, value) {\n this.setUniform('uniform2f', name, value.x, value.y);\n }\n /**\n * Set a {@apilink Vector} uniform for the current shader, WILL NOT THROW on error.\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n trySetUniformFloatVector(name, value) {\n return this.trySetUniform('uniform2f', name, value.x, value.y);\n }\n /**\n * Set a {@apilink Color} uniform for the current shader\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n setUniformFloatColor(name, value) {\n this.setUniform('uniform4f', name, value.r / 255, value.g / 255, value.b / 255, value.a);\n }\n /**\n * Set a {@apilink Color} uniform for the current shader, WILL NOT THROW on error.\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n trySetUniformFloatColor(name, value) {\n return this.trySetUniform('uniform4f', name, value.r / 255, value.g / 255, value.b / 255, value.a);\n }\n /**\n * Set an {@apilink Matrix} uniform for the current shader\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n setUniformMatrix(name, value) {\n this.setUniform('uniformMatrix4fv', name, false, value.data);\n }\n setUniformAffineMatrix(name, value) {\n this.setUniform('uniformMatrix4fv', name, false, [\n value.data[0],\n value.data[1],\n 0,\n 0,\n value.data[2],\n value.data[3],\n 0,\n 0,\n 0,\n 0,\n 1,\n 0,\n value.data[4],\n value.data[5],\n 0,\n 1\n ]);\n }\n /**\n * Set an {@apilink Matrix} uniform for the current shader, WILL NOT THROW on error.\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n trySetUniformMatrix(name, value) {\n return this.trySetUniform('uniformMatrix4fv', name, false, value.data);\n }\n /**\n * Set any available uniform type in webgl\n *\n * For example setUniform('uniformMatrix2fv', 'u_my2x2_mat`, ...);\n */\n setUniform(uniformType, name, ...value) {\n if (!this._compiled) {\n throw Error(`Must compile shader before setting a uniform ${uniformType}:${name}`);\n }\n if (!this.isCurrentlyBound()) {\n throw Error('Currently accessed shader instance is not the current active shader in WebGL,' +\n ' must call `shader.use()` before setting uniforms');\n }\n const gl = this._gl;\n const location = gl.getUniformLocation(this.program, name);\n if (location) {\n const args = [location, ...value];\n this._gl[uniformType].apply(this._gl, args);\n }\n else {\n throw Error(`Uniform ${uniformType}:${name} doesn\\'t exist or is not used in the shader source code,` +\n ' unused uniforms are optimized away by most browsers');\n }\n }\n /**\n * Set any available uniform type in webgl. Will try to set the uniform, will return false if the uniform didn't exist,\n * true if it was set.\n *\n * WILL NOT THROW on error\n *\n * For example setUniform('uniformMatrix2fv', 'u_my2x2_mat`, ...);\n *\n */\n trySetUniform(uniformType, name, ...value) {\n if (!this._compiled) {\n this._logger.warn(`Must compile shader before setting a uniform ${uniformType}:${name}`);\n return false;\n }\n if (!this.isCurrentlyBound()) {\n this._logger.warn('Currently accessed shader instance is not the current active shader in WebGL,' +\n ' must call `shader.use()` before setting uniforms');\n return false;\n }\n const gl = this._gl;\n const location = gl.getUniformLocation(this.program, name);\n if (location) {\n const args = [location, ...value];\n this._gl[uniformType].apply(this._gl, args);\n }\n else {\n return false;\n }\n return true;\n }\n _createProgram(gl, vertexShader, fragmentShader) {\n const program = gl.createProgram();\n if (program === null) {\n throw Error('Could not create graphics shader program');\n }\n // attach the shaders.\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n if (this._onPreLink) {\n this._onPreLink(program);\n }\n // link the program.\n gl.linkProgram(program);\n const success = gl.getProgramParameter(program, gl.LINK_STATUS);\n if (!success) {\n throw Error(`Could not link the program: [${gl.getProgramInfoLog(program)}]`);\n }\n return program;\n }\n _compileShader(gl, source, type) {\n const typeName = gl.VERTEX_SHADER === type ? 'vertex' : 'fragment';\n const shader = gl.createShader(type);\n if (shader === null) {\n throw Error(`Could not build shader: [${source}]`);\n }\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n const success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n if (!success) {\n const errorInfo = gl.getShaderInfoLog(shader);\n throw Error(`Could not compile ${typeName} shader:\\n\\n${errorInfo}${this._processSourceForError(source, errorInfo)}`);\n }\n return shader;\n }\n _processSourceForError(source, errorInfo) {\n if (!source) {\n return errorInfo;\n }\n const lines = source.split('\\n');\n const errorLineStart = errorInfo.search(/\\d:\\d/);\n const errorLineEnd = errorInfo.indexOf(' ', errorLineStart);\n const [_, error2] = errorInfo\n .slice(errorLineStart, errorLineEnd)\n .split(':')\n .map((v) => Number(v));\n for (let i = 0; i < lines.length; i++) {\n lines[i] = `${i + 1}: ${lines[i]}${error2 === i + 1 ? ' <----- ERROR!' : ''}`;\n }\n return '\\n\\nSource:\\n' + lines.join('\\n');\n }\n}\nShader._ACTIVE_SHADER_INSTANCE = null;\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/state-stack.ts\":\n/*!*****************************************!*\\\n !*** ./Graphics/Context/state-stack.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ContextState: () => (/* binding */ ContextState),\n/* harmony export */ StateStack: () => (/* binding */ StateStack)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Color */ \"./Color.ts\");\n/* harmony import */ var _Util_RentalPool__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Util/RentalPool */ \"./Util/RentalPool.ts\");\n\n\nclass ContextState {\n constructor() {\n this.opacity = 1;\n this.z = 0;\n this.tint = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.White;\n this.material = null;\n }\n}\nclass StateStack {\n constructor() {\n this._pool = new _Util_RentalPool__WEBPACK_IMPORTED_MODULE_1__.RentalPool(() => new ContextState(), (s) => {\n s.opacity = 1;\n s.z = 0;\n s.tint = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.White;\n s.material = null;\n return s;\n }, 100);\n this.current = this._pool.rent(true);\n this._states = [];\n }\n _cloneState(dest) {\n var _a;\n dest.opacity = this.current.opacity;\n dest.z = this.current.z;\n dest.tint = (_a = this.current.tint) === null || _a === void 0 ? void 0 : _a.clone();\n dest.material = this.current.material; // TODO is this going to cause problems when cloning\n return dest;\n }\n save() {\n this._states.push(this.current);\n this.current = this._cloneState(this._pool.rent());\n }\n restore() {\n this._pool.return(this.current);\n this.current = this._states.pop();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/texture-loader.ts\":\n/*!********************************************!*\\\n !*** ./Graphics/Context/texture-loader.ts ***!\n \\********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TextureLoader: () => (/* binding */ TextureLoader)\n/* harmony export */ });\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Wrapping */ \"./Graphics/Wrapping.ts\");\n\n\n\n/**\n * Manages loading image sources into webgl textures, a unique id is associated with all sources\n */\nclass TextureLoader {\n constructor(gl, _garbageCollector) {\n var _a;\n this._garbageCollector = _garbageCollector;\n this._textureMap = new Map();\n /**\n * Looks for textures that haven't been drawn in a while\n */\n this._collect = (image) => {\n var _a;\n if (this._gl) {\n const name = (_a = image.dataset.originalSrc) !== null && _a !== void 0 ? _a : image.constructor.name;\n TextureLoader._LOGGER.debug(`WebGL Texture for ${name} collected`);\n this.delete(image);\n return true;\n }\n return false;\n };\n this._gl = gl;\n TextureLoader._MAX_TEXTURE_SIZE = gl.getParameter(gl.MAX_TEXTURE_SIZE);\n if (this._garbageCollector) {\n TextureLoader._LOGGER.debug('WebGL Texture collection interval:', this._garbageCollector.collectionInterval);\n (_a = this._garbageCollector.garbageCollector) === null || _a === void 0 ? void 0 : _a.registerCollector('texture', this._garbageCollector.collectionInterval, this._collect);\n }\n }\n dispose() {\n for (const [image] of this._textureMap) {\n this.delete(image);\n }\n this._textureMap.clear();\n this._gl = null;\n }\n /**\n * Get the WebGL Texture from a source image\n * @param image\n */\n get(image) {\n return this._textureMap.get(image);\n }\n /**\n * Returns whether a source image has been loaded as a texture\n * @param image\n */\n has(image) {\n return this._textureMap.has(image);\n }\n /**\n * Loads a graphic into webgl and returns it's texture info, a webgl context must be previously registered\n * @param image Source graphic\n * @param options {ImageSourceOptions} Optionally configure the ImageFiltering and ImageWrapping mode to apply to the loaded texture\n * @param forceUpdate Optionally force a texture to be reloaded, useful if the source graphic has changed\n */\n load(image, options, forceUpdate = false) {\n var _a, _b;\n // Ignore loading if webgl is not registered\n const gl = this._gl;\n if (!gl) {\n return null;\n }\n const { filtering, wrapping } = { ...options };\n let tex = null;\n // If reuse the texture if it's from the same source\n if (this.has(image)) {\n tex = this.get(image);\n }\n // Update existing webgl texture and return early\n if (tex) {\n if (forceUpdate) {\n gl.bindTexture(gl.TEXTURE_2D, tex);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);\n }\n (_a = this._garbageCollector) === null || _a === void 0 ? void 0 : _a.garbageCollector.touch(image);\n return tex;\n }\n // No texture exists create a new one\n tex = gl.createTexture();\n // TODO implement texture gc with weakmap and timer\n TextureLoader.checkImageSizeSupportedAndLog(image);\n gl.bindTexture(gl.TEXTURE_2D, tex);\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);\n let wrappingConfig;\n if (wrapping) {\n if (typeof wrapping === 'string') {\n wrappingConfig = {\n x: wrapping,\n y: wrapping\n };\n }\n else {\n wrappingConfig = {\n x: wrapping.x,\n y: wrapping.y\n };\n }\n }\n const { x: xWrap, y: yWrap } = wrappingConfig !== null && wrappingConfig !== void 0 ? wrappingConfig : TextureLoader.wrapping;\n switch (xWrap) {\n case _Wrapping__WEBPACK_IMPORTED_MODULE_0__.ImageWrapping.Clamp:\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n break;\n case _Wrapping__WEBPACK_IMPORTED_MODULE_0__.ImageWrapping.Repeat:\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT);\n break;\n case _Wrapping__WEBPACK_IMPORTED_MODULE_0__.ImageWrapping.Mirror:\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.MIRRORED_REPEAT);\n break;\n default:\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n }\n switch (yWrap) {\n case _Wrapping__WEBPACK_IMPORTED_MODULE_0__.ImageWrapping.Clamp:\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n break;\n case _Wrapping__WEBPACK_IMPORTED_MODULE_0__.ImageWrapping.Repeat:\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT);\n break;\n case _Wrapping__WEBPACK_IMPORTED_MODULE_0__.ImageWrapping.Mirror:\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.MIRRORED_REPEAT);\n break;\n default:\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n }\n // NEAREST for pixel art, LINEAR for hi-res\n const filterMode = filtering !== null && filtering !== void 0 ? filtering : TextureLoader.filtering;\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filterMode === _Filtering__WEBPACK_IMPORTED_MODULE_1__.ImageFiltering.Pixel ? gl.NEAREST : gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filterMode === _Filtering__WEBPACK_IMPORTED_MODULE_1__.ImageFiltering.Pixel ? gl.NEAREST : gl.LINEAR);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);\n this._textureMap.set(image, tex);\n (_b = this._garbageCollector) === null || _b === void 0 ? void 0 : _b.garbageCollector.addCollectableResource('texture', image);\n return tex;\n }\n delete(image) {\n // Ignore loading if webgl is not registered\n const gl = this._gl;\n if (!gl) {\n return;\n }\n if (this.has(image)) {\n const texture = this.get(image);\n if (texture) {\n this._textureMap.delete(image);\n gl.deleteTexture(texture);\n }\n }\n }\n /**\n * Takes an image and returns if it meets size criteria for hardware\n * @param image\n * @returns if the image will be supported at runtime\n */\n static checkImageSizeSupportedAndLog(image) {\n var _a;\n const originalSrc = (_a = image.dataset.originalSrc) !== null && _a !== void 0 ? _a : 'internal canvas bitmap';\n if (image.width > TextureLoader._MAX_TEXTURE_SIZE || image.height > TextureLoader._MAX_TEXTURE_SIZE) {\n TextureLoader._LOGGER.error(`The image [${originalSrc}] provided to Excalibur is too large for the device's maximum texture size of ` +\n `(${TextureLoader._MAX_TEXTURE_SIZE}x${TextureLoader._MAX_TEXTURE_SIZE}) please resize to an image ` +\n `for excalibur to render properly.\\n\\nImages will likely render as black rectangles.\\n\\n` +\n `Read more here: https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/WebGL_best_practices#understand_system_limits`);\n return false;\n }\n else if (image.width > 4096 || image.height > 4096) {\n // https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/WebGL_best_practices#understand_system_limits\n TextureLoader._LOGGER.warn(`The image [${originalSrc}] provided to excalibur is too large may not work on all mobile devices, ` +\n `it is recommended you resize images to a maximum (4096x4096).\\n\\n` +\n `Images will likely render as black rectangles on some mobile platforms.\\n\\n` +\n `Read more here: https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/WebGL_best_practices#understand_system_limits`);\n }\n return true;\n }\n}\nTextureLoader._LOGGER = _Util_Log__WEBPACK_IMPORTED_MODULE_2__.Logger.getInstance();\n/**\n * Sets the default filtering for the Excalibur texture loader, default {@apilink ImageFiltering.Blended}\n */\nTextureLoader.filtering = _Filtering__WEBPACK_IMPORTED_MODULE_1__.ImageFiltering.Blended;\nTextureLoader.wrapping = { x: _Wrapping__WEBPACK_IMPORTED_MODULE_0__.ImageWrapping.Clamp, y: _Wrapping__WEBPACK_IMPORTED_MODULE_0__.ImageWrapping.Clamp };\nTextureLoader._MAX_TEXTURE_SIZE = 4096;\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/transform-stack.ts\":\n/*!*********************************************!*\\\n !*** ./Graphics/Context/transform-stack.ts ***!\n \\*********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TransformStack: () => (/* binding */ TransformStack)\n/* harmony export */ });\n/* harmony import */ var _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/affine-matrix */ \"./Math/affine-matrix.ts\");\n/* harmony import */ var _Util_RentalPool__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Util/RentalPool */ \"./Util/RentalPool.ts\");\n\n\nclass TransformStack {\n constructor() {\n this._pool = new _Util_RentalPool__WEBPACK_IMPORTED_MODULE_0__.RentalPool(() => _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_1__.AffineMatrix.identity(), (mat) => mat.reset(), 100);\n this._transforms = [];\n this._currentTransform = this._pool.rent(true);\n }\n save() {\n this._transforms.push(this._currentTransform);\n this._currentTransform = this._currentTransform.clone(this._pool.rent());\n }\n restore() {\n this._pool.return(this._currentTransform);\n this._currentTransform = this._transforms.pop();\n }\n translate(x, y) {\n return this._currentTransform.translate(x, y);\n }\n rotate(angle) {\n return this._currentTransform.rotate(angle);\n }\n scale(x, y) {\n return this._currentTransform.scale(x, y);\n }\n reset() {\n this._currentTransform.reset();\n }\n set current(matrix) {\n this._currentTransform = matrix;\n }\n get current() {\n return this._currentTransform;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/vertex-buffer.ts\":\n/*!*******************************************!*\\\n !*** ./Graphics/Context/vertex-buffer.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ VertexBuffer: () => (/* binding */ VertexBuffer)\n/* harmony export */ });\n/**\n * Helper around vertex buffer to simplify creating and uploading geometry\n *\n * Under the hood uses Float32Array\n */\nclass VertexBuffer {\n constructor(options) {\n /**\n * If the vertices never change switching 'static' can be more efficient on the gpu\n *\n * Default is 'dynamic'\n */\n this.type = 'dynamic';\n const { gl, size, type, data } = options;\n this._gl = gl;\n this.buffer = this._gl.createBuffer();\n if (!data && !size) {\n throw Error('Must either provide data or a size to the VertexBuffer');\n }\n if (!data) {\n this.bufferData = new Float32Array(size);\n }\n else {\n this.bufferData = data;\n }\n this.type = type !== null && type !== void 0 ? type : this.type;\n // Allocate buffer\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer);\n gl.bufferData(gl.ARRAY_BUFFER, this.bufferData, this.type === 'static' ? gl.STATIC_DRAW : gl.DYNAMIC_DRAW);\n }\n /**\n * Bind this vertex buffer\n */\n bind() {\n const gl = this._gl;\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer);\n }\n unbind() {\n const gl = this._gl;\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n }\n /**\n * Upload vertex buffer geometry to the GPU\n */\n upload(count) {\n const gl = this._gl;\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer);\n if (count) {\n gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.bufferData, 0, count);\n }\n else {\n // TODO always use bufferSubData? need to perf test it\n gl.bufferData(gl.ARRAY_BUFFER, this.bufferData, this.type === 'static' ? gl.STATIC_DRAW : gl.DYNAMIC_DRAW);\n }\n }\n dispose() {\n const gl = this._gl;\n gl.deleteBuffer(this.buffer);\n this._gl = null;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/vertex-layout.ts\":\n/*!*******************************************!*\\\n !*** ./Graphics/Context/vertex-layout.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ VertexLayout: () => (/* binding */ VertexLayout)\n/* harmony export */ });\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../.. */ \"./Util/Log.ts\");\n/* harmony import */ var _webgl_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./webgl-util */ \"./Graphics/Context/webgl-util.ts\");\n\n\n/**\n * Helper around creating vertex attributes in a given {@apilink VertexBuffer}, this is useful for describing\n * the memory layout for your vertices inside a particular buffer\n *\n * Note: This helper assumes interleaved attributes in one {@apilink VertexBuffer}, not many.\n *\n * Working with `gl.vertexAttribPointer` can be tricky, and this attempts to double check you\n */\nclass VertexLayout {\n get vertexBuffer() {\n return this._vertexBuffer;\n }\n get attributes() {\n return this._attributes;\n }\n constructor(options) {\n this._logger = ___WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance();\n this._suppressWarnings = false;\n this._layout = [];\n this._attributes = [];\n this._vertexTotalSizeBytes = 0;\n this._initialized = false;\n const { gl, shader, vertexBuffer, attributes, suppressWarnings } = options;\n this._gl = gl;\n this._vertexBuffer = vertexBuffer;\n this._attributes = attributes;\n this._shader = shader;\n this._suppressWarnings = suppressWarnings;\n if (shader) {\n this.initialize();\n }\n }\n /**\n * Total number of bytes that the vertex will take up\n */\n get totalVertexSizeBytes() {\n return this._vertexTotalSizeBytes;\n }\n set shader(shader) {\n if (shader && this._shader !== shader) {\n this._shader = shader;\n this.initialize();\n }\n }\n get shader() {\n return this._shader;\n }\n /**\n * Layouts need shader locations and must be bound to a shader\n */\n initialize() {\n if (this._initialized) {\n return;\n }\n if (!this._shader) {\n return;\n }\n if (!this._shader.compiled) {\n throw Error('Shader not compiled, shader must be compiled before defining a vertex layout');\n }\n this._vertexTotalSizeBytes = 0;\n this._layout.length = 0;\n const shaderAttributes = this._shader.attributes;\n for (const attribute of this._attributes) {\n const attrib = shaderAttributes[attribute[0]];\n if (!attrib) {\n if (!(0,_webgl_util__WEBPACK_IMPORTED_MODULE_1__.isAttributeInSource)(this._shader.vertexSource, attribute[0])) {\n throw Error(`The attribute named: ${attribute[0]} size ${attribute[1]}` +\n ` not found in the shader source code:\\n ${this._shader.vertexSource}`);\n }\n if (!this._suppressWarnings) {\n this._logger.warn(`The attribute named: ${attribute[0]} size ${attribute[1]}` +\n ` not found in the compiled shader. This is possibly a bug:\\n` +\n ` 1. Not a bug, but should remove unused code - attribute \"${attribute[0]}\" is unused in` +\n ` vertex/fragment and has been automatically removed by glsl compiler.\\n` +\n ` 2. Definitely a bug, attribute \"${attribute[0]}\" in layout has been mistyped or is missing` +\n ` in shader, check vertex/fragment source.`);\n }\n const glType = (0,_webgl_util__WEBPACK_IMPORTED_MODULE_1__.getGLTypeFromSource)(this._gl, this._shader.vertexSource, attribute[0]);\n // Unused attribute placeholder\n this._layout.push({\n name: attribute[0],\n glType,\n size: attribute[1],\n location: -1,\n normalized: false\n });\n }\n if (attrib) {\n if (attrib.size !== attribute[1]) {\n throw Error(`VertexLayout size definition for attribute: [${attribute[0]}, ${attribute[1]}],` +\n ` doesn\\'t match shader source size ${attrib.size}:\\n ${this._shader.vertexSource}`);\n }\n this._layout.push(attrib);\n }\n }\n // calc size\n let componentsPerVertex = 0;\n for (const vertAttribute of this._layout) {\n const typeSize = (0,_webgl_util__WEBPACK_IMPORTED_MODULE_1__.getGlTypeSizeBytes)(this._gl, vertAttribute.glType);\n this._vertexTotalSizeBytes += typeSize * vertAttribute.size;\n componentsPerVertex += vertAttribute.size;\n }\n if (this._vertexBuffer.bufferData.length % componentsPerVertex !== 0) {\n this._logger.warn(`The vertex component size (${componentsPerVertex}) does NOT divide evenly into the specified vertex buffer` +\n ` (${this._vertexBuffer.bufferData.length})`);\n }\n // create VAO\n const gl = this._gl;\n this._vao = gl.createVertexArray();\n gl.bindVertexArray(this._vao);\n this._vertexBuffer.bind();\n let offset = 0;\n for (const vert of this._layout) {\n // skip unused attributes\n if (vert.location !== -1) {\n if (vert.glType === gl.INT) {\n gl.vertexAttribIPointer(vert.location, vert.size, vert.glType, this.totalVertexSizeBytes, offset);\n }\n else {\n gl.vertexAttribPointer(vert.location, vert.size, vert.glType, vert.normalized, this.totalVertexSizeBytes, offset);\n }\n gl.enableVertexAttribArray(vert.location);\n }\n offset += (0,_webgl_util__WEBPACK_IMPORTED_MODULE_1__.getGlTypeSizeBytes)(gl, vert.glType) * vert.size;\n }\n gl.bindVertexArray(null);\n this._vertexBuffer.unbind();\n this._initialized = true;\n }\n /**\n * Bind this layout with it's associated vertex buffer\n * @param uploadBuffer Optionally indicate you wish to upload the buffer to the GPU associated with this layout\n */\n use(uploadBuffer = false, count) {\n if (!this._shader) {\n throw Error('No shader is associated with this vertex layout, a shader must be set');\n }\n const gl = this._gl;\n if (!this._shader.isCurrentlyBound()) {\n throw Error('Shader associated with this vertex layout is not active! Call shader.use() before layout.use()');\n }\n this._vertexBuffer.bind();\n if (uploadBuffer) {\n this._vertexBuffer.upload(count);\n }\n gl.bindVertexArray(this._vao);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/webgl-util.ts\":\n/*!****************************************!*\\\n !*** ./Graphics/Context/webgl-util.ts ***!\n \\****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ getAttributeComponentSize: () => (/* binding */ getAttributeComponentSize),\n/* harmony export */ getAttributePointerType: () => (/* binding */ getAttributePointerType),\n/* harmony export */ getGLTypeFromSource: () => (/* binding */ getGLTypeFromSource),\n/* harmony export */ getGlTypeSizeBytes: () => (/* binding */ getGlTypeSizeBytes),\n/* harmony export */ getMaxShaderComplexity: () => (/* binding */ getMaxShaderComplexity),\n/* harmony export */ isAttributeInSource: () => (/* binding */ isAttributeInSource)\n/* harmony export */ });\n/**\n * Return the size of the GlType in bytes\n * @param gl\n * @param type\n */\nfunction getGlTypeSizeBytes(gl, type) {\n switch (type) {\n case gl.INT:\n case gl.UNSIGNED_INT:\n case gl.FLOAT:\n return 4;\n case gl.SHORT:\n return 2;\n case gl.UNSIGNED_SHORT:\n return 2;\n case gl.BYTE:\n return 1;\n case gl.UNSIGNED_BYTE:\n return 1;\n default:\n return 1;\n }\n}\n/**\n * Checks if an attribute is present in vertex source\n */\nfunction isAttributeInSource(source, variable) {\n const attributeRegexTemplate = `(?[a-z0-9]+)\\\\s+${variable};`;\n const regex = new RegExp(attributeRegexTemplate, 'g');\n const matches = regex.exec(source);\n return (matches === null || matches === void 0 ? void 0 : matches.length) > 0;\n}\n/**\n * Attempt to discern the glType of an attribute from vertex source\n * @param gl\n * @param source\n * @param variable\n */\nfunction getGLTypeFromSource(gl, source, variable) {\n var _a;\n const attributeRegexTemplate = `(?[a-z0-9]+)\\\\s+${variable};`;\n const regex = new RegExp(attributeRegexTemplate, 'g');\n const matches = regex.exec(source);\n const type = (_a = matches === null || matches === void 0 ? void 0 : matches.groups) === null || _a === void 0 ? void 0 : _a.type;\n switch (type) {\n case 'float':\n case 'vec2':\n case 'vec3':\n case 'vec4':\n return gl.FLOAT;\n case 'int':\n case 'ivec2':\n case 'ivec3':\n case 'ivec4':\n return gl.INT;\n case 'uint':\n case 'uvec2':\n case 'uvec3':\n case 'uvec4':\n return gl.UNSIGNED_INT;\n case 'bool':\n case 'bvec2':\n case 'bvec3':\n case 'bvec4':\n return gl.BOOL;\n case 'short':\n return gl.SHORT;\n case 'ushort':\n return gl.UNSIGNED_SHORT;\n case 'ubyte':\n return gl.UNSIGNED_BYTE;\n case 'byte':\n return gl.BYTE;\n default:\n return gl.FLOAT;\n }\n}\n/**\n * Based on the type return the number of attribute components\n *\n * https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/vertexAttribPointer\n * @param gl\n * @param type\n */\nfunction getAttributeComponentSize(gl, type) {\n switch (type) {\n case gl.LOW_FLOAT:\n case gl.HIGH_FLOAT:\n case gl.FLOAT:\n return 1;\n case gl.FLOAT_VEC2:\n return 2;\n case gl.FLOAT_VEC3:\n return 3;\n case gl.FLOAT_VEC4:\n return 4;\n case gl.BYTE:\n return 1;\n case gl.UNSIGNED_BYTE:\n return 1;\n case gl.UNSIGNED_SHORT:\n case gl.SHORT:\n return 1;\n default:\n return 1;\n }\n}\n/**\n * Based on the attribute return the corresponding supported attrib pointer type\n * https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/vertexAttribPointer\n * @param gl\n * @param type\n */\nfunction getAttributePointerType(gl, type) {\n switch (type) {\n case gl.LOW_FLOAT:\n case gl.HIGH_FLOAT:\n case gl.FLOAT:\n case gl.FLOAT_VEC2:\n case gl.FLOAT_VEC3:\n case gl.FLOAT_VEC4:\n return gl.FLOAT;\n case gl.BYTE:\n return gl.BYTE;\n case gl.UNSIGNED_BYTE:\n return gl.UNSIGNED_BYTE;\n case gl.SHORT:\n return gl.SHORT;\n case gl.UNSIGNED_SHORT:\n return gl.UNSIGNED_SHORT;\n default:\n return gl.FLOAT;\n }\n}\n/**\n *\n */\nfunction getMaxShaderComplexity(gl, numIfs) {\n const assembleTestShader = (numIfs) => {\n const testShader = `#version 300 es\r\n precision mediump float;\r\n out vec4 fragColor;\r\n void main() {\r\n float index = 1.01;\r\n %%complexity%%\r\n }`;\n let testComplexity = '';\n for (let i = 0; i < numIfs; i++) {\n if (i === 0) {\n testComplexity += `if (index <= ${i}.5) {\\n`;\n }\n else {\n testComplexity += ` else if (index <= ${i}.5) {\\n`;\n }\n testComplexity += ` fragColor = vec4(1.0);\\n`;\n testComplexity += ` }\\n`;\n }\n return testShader.replace('%%complexity%%', testComplexity);\n };\n let canCompile = false;\n do {\n const test = assembleTestShader(numIfs);\n const shader = gl.createShader(gl.FRAGMENT_SHADER);\n gl.shaderSource(shader, test);\n gl.compileShader(shader);\n canCompile = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n if (!canCompile) {\n numIfs = (numIfs / 2) | 0;\n }\n } while (!canCompile);\n return numIfs;\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Debug.ts\":\n/*!***************************!*\\\n !*** ./Graphics/Debug.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Debug: () => (/* binding */ Debug)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n\nclass Debug {\n static registerGraphicsContext(ctx) {\n Debug._ctx = ctx;\n }\n static draw(debugDrawCall) {\n this._drawCalls.push(debugDrawCall);\n }\n static drawPoint(point, options) {\n Debug.draw((ctx) => {\n ctx.debug.drawPoint(point, options);\n });\n }\n static drawLine(start, end, options) {\n Debug.draw((ctx) => {\n ctx.debug.drawLine(start, end, options);\n });\n }\n static drawLines(points, options) {\n if (points.length > 1) {\n Debug.draw((ctx) => {\n for (let i = 0; i < points.length - 1; i++) {\n ctx.debug.drawLine(points[i], points[i + 1], options);\n }\n });\n }\n }\n static drawText(text, pos) {\n Debug.draw((ctx) => {\n ctx.debug.drawText(text, pos);\n });\n }\n static drawPolygon(points, options) {\n if (points.length > 1) {\n Debug.draw((ctx) => {\n const firstPoint = points[0];\n const polygon = [...points, firstPoint];\n for (let i = 0; i < polygon.length - 1; i++) {\n ctx.debug.drawLine(polygon[i], polygon[i + 1], options);\n }\n });\n }\n }\n static drawCircle(center, radius, options) {\n const { color, strokeColor, width } = {\n color: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Black,\n strokeColor: undefined,\n width: undefined,\n ...options\n };\n Debug.draw((ctx) => {\n ctx.drawCircle(center, radius, color, strokeColor, width);\n });\n }\n static drawBounds(boundingBox, options) {\n Debug.draw((ctx) => {\n ctx.debug.drawRect(boundingBox.left, boundingBox.top, boundingBox.width, boundingBox.height, options);\n });\n }\n static drawRay(ray, options) {\n const { distance, color } = {\n color: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Blue,\n distance: 10,\n ...options\n };\n Debug.draw((ctx) => {\n const start = ray.pos;\n const end = ray.pos.add(ray.dir.scale(distance));\n ctx.debug.drawLine(start, end, { color });\n });\n }\n static flush(ctx) {\n ctx.save();\n ctx.z = Debug.z;\n for (const drawCall of Debug._drawCalls) {\n drawCall(ctx);\n }\n ctx.restore();\n Debug.clear();\n }\n static clear() {\n Debug._drawCalls.length = 0;\n }\n}\nDebug._drawCalls = [];\nDebug.z = Infinity;\n\n\n/***/ }),\n\n/***/ \"./Graphics/DebugGraphicsComponent.ts\":\n/*!********************************************!*\\\n !*** ./Graphics/DebugGraphicsComponent.ts ***!\n \\********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DebugGraphicsComponent: () => (/* binding */ DebugGraphicsComponent)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Component */ \"./EntityComponentSystem/Component.ts\");\n\n/**\n * Provide arbitrary drawing for the purposes of debugging your game\n *\n * Will only show when the Engine is set to debug mode {@apilink Engine.showDebug} or {@apilink Engine.toggleDebug}\n *\n */\nclass DebugGraphicsComponent extends _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor(draw, useTransform = true) {\n super();\n this.draw = draw;\n this.useTransform = useTransform;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Filtering.ts\":\n/*!*******************************!*\\\n !*** ./Graphics/Filtering.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ImageFiltering: () => (/* binding */ ImageFiltering),\n/* harmony export */ parseImageFiltering: () => (/* binding */ parseImageFiltering)\n/* harmony export */ });\n/**\n * Describes the different image filtering modes\n */\nvar ImageFiltering;\n(function (ImageFiltering) {\n /**\n * Pixel is useful when you do not want smoothing aka antialiasing applied to your graphics.\n *\n * Useful for Pixel art aesthetics.\n */\n ImageFiltering[\"Pixel\"] = \"Pixel\";\n /**\n * Blended is useful when you have high resolution artwork and would like it blended and smoothed\n */\n ImageFiltering[\"Blended\"] = \"Blended\";\n})(ImageFiltering || (ImageFiltering = {}));\n/**\n * Parse the image filtering attribute value, if it doesn't match returns null\n */\nfunction parseImageFiltering(val) {\n switch (val) {\n case ImageFiltering.Pixel:\n return ImageFiltering.Pixel;\n case ImageFiltering.Blended:\n return ImageFiltering.Blended;\n default:\n return undefined;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Font.ts\":\n/*!**************************!*\\\n !*** ./Graphics/Font.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Font: () => (/* binding */ Font)\n/* harmony export */ });\n/* harmony import */ var _Collision_Index__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Collision/Index */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _FontCommon__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./FontCommon */ \"./Graphics/FontCommon.ts\");\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _FontTextInstance__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./FontTextInstance */ \"./Graphics/FontTextInstance.ts\");\n/* harmony import */ var _FontCache__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./FontCache */ \"./Graphics/FontCache.ts\");\n\n\n\n\n\n\n\n/**\n * Represents a system or web font in Excalibur\n *\n * If no options specified, the system sans-serif 10 pixel is used\n *\n * If loading a custom web font be sure to have the font loaded before you use it https://erikonarheim.com/posts/dont-test-fonts/\n */\nclass Font extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n constructor(options = {}) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v;\n super(options); // <- Graphics properties\n /**\n * Set the font filtering mode, by default set to {@apilink ImageFiltering.Blended} regardless of the engine default smoothing\n *\n * If you have a pixel style font that may be a reason to switch this to {@apilink ImageFiltering.Pixel}\n */\n this.filtering = _Filtering__WEBPACK_IMPORTED_MODULE_1__.ImageFiltering.Blended;\n /**\n * Font quality determines the size of the underlying raster text, higher quality means less jagged edges.\n * If quality is set to 1, then just enough raster bitmap is generated to render the text.\n *\n * You can think of quality as how zoomed in to the text you can get before seeing jagged edges.\n *\n * (Default 2)\n */\n this.quality = 2;\n // Raster properties for fonts\n this.padding = 2;\n this.smoothing = false;\n this.lineWidth = 1;\n this.lineDash = [];\n this.color = _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Black;\n this.family = 'sans-serif';\n this.style = _FontCommon__WEBPACK_IMPORTED_MODULE_3__.FontStyle.Normal;\n this.bold = false;\n this.unit = _FontCommon__WEBPACK_IMPORTED_MODULE_3__.FontUnit.Px;\n this.textAlign = _FontCommon__WEBPACK_IMPORTED_MODULE_3__.TextAlign.Left;\n this.baseAlign = _FontCommon__WEBPACK_IMPORTED_MODULE_3__.BaseAlign.Top;\n this.direction = _FontCommon__WEBPACK_IMPORTED_MODULE_3__.Direction.LeftToRight;\n /**\n * Font line height in pixels, default line height if unset\n */\n this.lineHeight = undefined;\n this.size = 10;\n this._textBounds = new _Collision_Index__WEBPACK_IMPORTED_MODULE_4__.BoundingBox();\n this._textMeasurement = new _FontTextInstance__WEBPACK_IMPORTED_MODULE_5__.FontTextInstance(this, '', _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Black);\n // Raster properties\n this.smoothing = (_a = options === null || options === void 0 ? void 0 : options.smoothing) !== null && _a !== void 0 ? _a : this.smoothing;\n this.padding = (_b = options === null || options === void 0 ? void 0 : options.padding) !== null && _b !== void 0 ? _b : this.padding;\n this.color = (_c = options === null || options === void 0 ? void 0 : options.color) !== null && _c !== void 0 ? _c : this.color;\n this.strokeColor = (_d = options === null || options === void 0 ? void 0 : options.strokeColor) !== null && _d !== void 0 ? _d : this.strokeColor;\n this.lineDash = (_e = options === null || options === void 0 ? void 0 : options.lineDash) !== null && _e !== void 0 ? _e : this.lineDash;\n this.lineWidth = (_f = options === null || options === void 0 ? void 0 : options.lineWidth) !== null && _f !== void 0 ? _f : this.lineWidth;\n this.filtering = (_g = options === null || options === void 0 ? void 0 : options.filtering) !== null && _g !== void 0 ? _g : this.filtering;\n // Font specific properties\n this.family = (_h = options === null || options === void 0 ? void 0 : options.family) !== null && _h !== void 0 ? _h : this.family;\n this.style = (_j = options === null || options === void 0 ? void 0 : options.style) !== null && _j !== void 0 ? _j : this.style;\n this.bold = (_k = options === null || options === void 0 ? void 0 : options.bold) !== null && _k !== void 0 ? _k : this.bold;\n this.size = (_l = options === null || options === void 0 ? void 0 : options.size) !== null && _l !== void 0 ? _l : this.size;\n this.unit = (_m = options === null || options === void 0 ? void 0 : options.unit) !== null && _m !== void 0 ? _m : this.unit;\n this.textAlign = (_o = options === null || options === void 0 ? void 0 : options.textAlign) !== null && _o !== void 0 ? _o : this.textAlign;\n this.baseAlign = (_p = options === null || options === void 0 ? void 0 : options.baseAlign) !== null && _p !== void 0 ? _p : this.baseAlign;\n this.direction = (_q = options === null || options === void 0 ? void 0 : options.direction) !== null && _q !== void 0 ? _q : this.direction;\n this.lineHeight = (_r = options === null || options === void 0 ? void 0 : options.lineHeight) !== null && _r !== void 0 ? _r : this.lineHeight;\n this.quality = (_s = options === null || options === void 0 ? void 0 : options.quality) !== null && _s !== void 0 ? _s : this.quality;\n if (options === null || options === void 0 ? void 0 : options.shadow) {\n this.shadow = {};\n this.shadow.blur = (_t = options.shadow.blur) !== null && _t !== void 0 ? _t : this.shadow.blur;\n this.shadow.offset = (_u = options.shadow.offset) !== null && _u !== void 0 ? _u : this.shadow.offset;\n this.shadow.color = (_v = options.shadow.color) !== null && _v !== void 0 ? _v : this.shadow.color;\n }\n }\n clone() {\n return new Font({\n ...this.cloneGraphicOptions(),\n size: this.size,\n unit: this.unit,\n family: this.family,\n style: this.style,\n bold: this.bold,\n textAlign: this.textAlign,\n baseAlign: this.baseAlign,\n direction: this.direction,\n shadow: this.shadow\n ? {\n blur: this.shadow.blur,\n offset: this.shadow.offset,\n color: this.shadow.color\n }\n : undefined\n });\n }\n get fontString() {\n return `${this.style} ${this.bold ? 'bold' : ''} ${this.size}${this.unit} ${this.family}`;\n }\n get localBounds() {\n return this._textBounds;\n }\n _drawImage(_ex, _x, _y) {\n // TODO weird vestigial drawimage\n }\n _rotate(ex) {\n var _a;\n // TODO this needs to change depending on the bounding box...\n const origin = (_a = this.origin) !== null && _a !== void 0 ? _a : this._textBounds.center;\n ex.translate(origin.x, origin.y);\n ex.rotate(this.rotation);\n ex.translate(-origin.x, -origin.y);\n }\n _flip(ex) {\n if (this.flipHorizontal) {\n ex.translate(this._textBounds.width / this.scale.x, 0);\n ex.scale(-1, 1);\n }\n if (this.flipVertical) {\n ex.translate(0, -this._textBounds.height / 2 / this.scale.y);\n ex.scale(1, -1);\n }\n }\n measureTextWithoutCache(text, maxWidth) {\n return this._textMeasurement.measureText(text, maxWidth);\n }\n /**\n * Returns a BoundingBox that is the total size of the text including multiple lines\n *\n * Does not include any padding or adjustment\n * @param text\n * @returns BoundingBox\n */\n measureText(text, maxWidth) {\n return _FontCache__WEBPACK_IMPORTED_MODULE_6__.FontCache.measureText(text, this, maxWidth);\n }\n _postDraw(ex) {\n ex.restore();\n }\n render(ex, text, colorOverride, x, y, maxWidth) {\n const textInstance = _FontCache__WEBPACK_IMPORTED_MODULE_6__.FontCache.getTextInstance(text, this, colorOverride);\n // Apply affine transformations\n this._textBounds = textInstance.dimensions;\n this._preDraw(ex, x, y);\n textInstance.render(ex, x, y, maxWidth);\n this._postDraw(ex);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/FontCache.ts\":\n/*!*******************************!*\\\n !*** ./Graphics/FontCache.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FontCache: () => (/* binding */ FontCache)\n/* harmony export */ });\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _FontTextInstance__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./FontTextInstance */ \"./Graphics/FontTextInstance.ts\");\n\n\nclass FontCache {\n static measureText(text, font, maxWidth) {\n const hash = _FontTextInstance__WEBPACK_IMPORTED_MODULE_0__.FontTextInstance.getHashCode(font, text);\n if (FontCache._MEASURE_CACHE.has(hash)) {\n return FontCache._MEASURE_CACHE.get(hash);\n }\n FontCache._LOGGER.debug('Font text measurement cache miss');\n const measurement = font.measureTextWithoutCache(text, maxWidth);\n FontCache._MEASURE_CACHE.set(hash, measurement);\n return measurement;\n }\n static getTextInstance(text, font, color) {\n const hash = _FontTextInstance__WEBPACK_IMPORTED_MODULE_0__.FontTextInstance.getHashCode(font, text, color);\n let textInstance = FontCache._TEXT_CACHE.get(hash);\n if (!textInstance) {\n textInstance = new _FontTextInstance__WEBPACK_IMPORTED_MODULE_0__.FontTextInstance(font, text, color);\n FontCache._TEXT_CACHE.set(hash, textInstance);\n FontCache._LOGGER.debug('Font text instance cache miss');\n }\n // Cache the bitmap for certain amount of time\n FontCache._TEXT_USAGE.set(textInstance, performance.now());\n return textInstance;\n }\n static checkAndClearCache() {\n const deferred = [];\n const currentHashCodes = new Set();\n for (const [textInstance, time] of FontCache._TEXT_USAGE.entries()) {\n // if bitmap hasn't been used in 100 ms clear it\n if (time + FontCache.FONT_TIMEOUT < performance.now()) {\n FontCache._LOGGER.debug(`Text cache entry timed out ${textInstance.text}`);\n deferred.push(textInstance);\n textInstance.dispose();\n }\n else {\n const hash = textInstance.getHashCode(false);\n currentHashCodes.add(hash);\n }\n }\n // Deferred removal of text instances\n deferred.forEach((t) => {\n FontCache._TEXT_USAGE.delete(t);\n });\n // Regenerate text instance cache\n this._TEXT_CACHE.clear();\n for (const [textInstance] of this._TEXT_USAGE.entries()) {\n this._TEXT_CACHE.set(textInstance.getHashCode(), textInstance);\n }\n // Regenerated measurement cache\n const newTextMeasurementCache = new Map();\n for (const current of currentHashCodes) {\n if (FontCache._MEASURE_CACHE.has(current)) {\n newTextMeasurementCache.set(current, FontCache._MEASURE_CACHE.get(current));\n }\n }\n this._MEASURE_CACHE.clear();\n this._MEASURE_CACHE = newTextMeasurementCache;\n }\n static get cacheSize() {\n return FontCache._TEXT_USAGE.size;\n }\n /**\n * Force clear all cached text bitmaps\n */\n static clearCache() {\n for (const [textInstance] of FontCache._TEXT_USAGE.entries()) {\n textInstance.dispose();\n }\n FontCache._TEXT_USAGE.clear();\n FontCache._TEXT_CACHE.clear();\n FontCache._MEASURE_CACHE.clear();\n }\n}\nFontCache.FONT_TIMEOUT = 500;\nFontCache._LOGGER = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\nFontCache._TEXT_USAGE = new Map();\nFontCache._TEXT_CACHE = new Map();\nFontCache._MEASURE_CACHE = new Map();\n\n\n/***/ }),\n\n/***/ \"./Graphics/FontCommon.ts\":\n/*!********************************!*\\\n !*** ./Graphics/FontCommon.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BaseAlign: () => (/* binding */ BaseAlign),\n/* harmony export */ Direction: () => (/* binding */ Direction),\n/* harmony export */ FontStyle: () => (/* binding */ FontStyle),\n/* harmony export */ FontUnit: () => (/* binding */ FontUnit),\n/* harmony export */ TextAlign: () => (/* binding */ TextAlign)\n/* harmony export */ });\n/**\n * Enum representing the different font size units\n * https://developer.mozilla.org/en-US/docs/Web/CSS/font-size\n */\nvar FontUnit;\n(function (FontUnit) {\n /**\n * Em is a scalable unit, 1 em is equal to the current font size of the current element, parent elements can effect em values\n */\n FontUnit[\"Em\"] = \"em\";\n /**\n * Rem is similar to the Em, it is a scalable unit. 1 rem is equal to the font size of the root element\n */\n FontUnit[\"Rem\"] = \"rem\";\n /**\n * Pixel is a unit of length in screen pixels\n */\n FontUnit[\"Px\"] = \"px\";\n /**\n * Point is a physical unit length (1/72 of an inch)\n */\n FontUnit[\"Pt\"] = \"pt\";\n /**\n * Percent is a scalable unit similar to Em, the only difference is the Em units scale faster when Text-Size stuff\n */\n FontUnit[\"Percent\"] = \"%\";\n})(FontUnit || (FontUnit = {}));\n/**\n * Enum representing the different horizontal text alignments\n */\nvar TextAlign;\n(function (TextAlign) {\n /**\n * The text is left-aligned.\n */\n TextAlign[\"Left\"] = \"left\";\n /**\n * The text is right-aligned.\n */\n TextAlign[\"Right\"] = \"right\";\n /**\n * The text is centered.\n */\n TextAlign[\"Center\"] = \"center\";\n /**\n * The text is aligned at the normal start of the line (left-aligned for left-to-right locales,\n * right-aligned for right-to-left locales).\n */\n TextAlign[\"Start\"] = \"start\";\n /**\n * The text is aligned at the normal end of the line (right-aligned for left-to-right locales,\n * left-aligned for right-to-left locales).\n */\n TextAlign[\"End\"] = \"end\";\n})(TextAlign || (TextAlign = {}));\n/**\n * Enum representing the different baseline text alignments\n */\nvar BaseAlign;\n(function (BaseAlign) {\n /**\n * The text baseline is the top of the em square.\n */\n BaseAlign[\"Top\"] = \"top\";\n /**\n * The text baseline is the hanging baseline. Currently unsupported; this will act like\n * alphabetic.\n */\n BaseAlign[\"Hanging\"] = \"hanging\";\n /**\n * The text baseline is the middle of the em square.\n */\n BaseAlign[\"Middle\"] = \"middle\";\n /**\n * The text baseline is the normal alphabetic baseline.\n */\n BaseAlign[\"Alphabetic\"] = \"alphabetic\";\n /**\n * The text baseline is the ideographic baseline; this is the bottom of\n * the body of the characters, if the main body of characters protrudes\n * beneath the alphabetic baseline. Currently unsupported; this will\n * act like alphabetic.\n */\n BaseAlign[\"Ideographic\"] = \"ideographic\";\n /**\n * The text baseline is the bottom of the bounding box. This differs\n * from the ideographic baseline in that the ideographic baseline\n * doesn't consider descenders.\n */\n BaseAlign[\"Bottom\"] = \"bottom\";\n})(BaseAlign || (BaseAlign = {}));\n/**\n * Enum representing the different possible font styles\n */\nvar FontStyle;\n(function (FontStyle) {\n FontStyle[\"Normal\"] = \"normal\";\n FontStyle[\"Italic\"] = \"italic\";\n FontStyle[\"Oblique\"] = \"oblique\";\n})(FontStyle || (FontStyle = {}));\n/**\n * Enum representing the text direction, useful for other languages, or writing text in reverse\n */\nvar Direction;\n(function (Direction) {\n Direction[\"LeftToRight\"] = \"ltr\";\n Direction[\"RightToLeft\"] = \"rtl\";\n})(Direction || (Direction = {}));\n\n\n/***/ }),\n\n/***/ \"./Graphics/FontTextInstance.ts\":\n/*!**************************************!*\\\n !*** ./Graphics/FontTextInstance.ts ***!\n \\**************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FontTextInstance: () => (/* binding */ FontTextInstance)\n/* harmony export */ });\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Util_DrawUtil__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/DrawUtil */ \"./Util/DrawUtil.ts\");\n/* harmony import */ var _Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Context/ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n\n\n\n\nclass FontTextInstance {\n constructor(font, text, color, maxWidth) {\n this.font = font;\n this.text = text;\n this.color = color;\n this.maxWidth = maxWidth;\n this._textFragments = [];\n this.disposed = false;\n this._dirty = true;\n this.canvas = document.createElement('canvas');\n const ctx = this.canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Unable to create FontTextInstance, internal canvas failed to create');\n }\n this.ctx = ctx;\n this.dimensions = this.measureText(text);\n this._setDimension(this.dimensions, this.ctx);\n this._lastHashCode = this.getHashCode();\n }\n measureText(text, maxWidth) {\n if (this.disposed) {\n throw Error('Accessing disposed text instance! ' + this.text);\n }\n let lines = null;\n if (maxWidth != null) {\n lines = this._getLinesFromText(text, maxWidth);\n }\n else {\n lines = text.split('\\n');\n }\n const maxWidthLine = lines.reduce((a, b) => {\n return a.length > b.length ? a : b;\n });\n this._applyFont(this.ctx); // font must be applied to the context to measure it\n const metrics = this.ctx.measureText(maxWidthLine);\n let textHeight = Math.abs(metrics.actualBoundingBoxAscent) + Math.abs(metrics.actualBoundingBoxDescent);\n // TODO line height makes the text bounds wonky\n const lineAdjustedHeight = textHeight * lines.length;\n textHeight = lineAdjustedHeight;\n const bottomBounds = lineAdjustedHeight - Math.abs(metrics.actualBoundingBoxAscent);\n const x = 0;\n const y = 0;\n const measurement = new _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox({\n left: x - Math.abs(metrics.actualBoundingBoxLeft) - this.font.padding,\n top: y - Math.abs(metrics.actualBoundingBoxAscent) - this.font.padding,\n bottom: y + bottomBounds + this.font.padding,\n right: x + Math.abs(metrics.actualBoundingBoxRight) + this.font.padding\n });\n return measurement;\n }\n _setDimension(textBounds, bitmap) {\n let lineHeightRatio = 1;\n if (this.font.lineHeight) {\n lineHeightRatio = this.font.lineHeight / this.font.size;\n }\n // Changing the width and height clears the context properties\n // We double the bitmap width to account for all possible alignment\n // We scale by \"quality\" so we render text without jaggies\n bitmap.canvas.width = (textBounds.width + this.font.padding * 2) * 2 * this.font.quality;\n bitmap.canvas.height = (textBounds.height + this.font.padding * 2) * 2 * this.font.quality * lineHeightRatio;\n }\n static getHashCode(font, text, color) {\n var _a;\n const hash = text +\n '__hashcode__' +\n font.fontString +\n font.showDebug +\n font.textAlign +\n font.baseAlign +\n font.direction +\n font.lineHeight +\n JSON.stringify(font.shadow) +\n (font.padding.toString() +\n font.smoothing.toString() +\n font.lineWidth.toString() +\n font.lineDash.toString() +\n ((_a = font.strokeColor) === null || _a === void 0 ? void 0 : _a.toString()) +\n (color ? color.toString() : font.color.toString()));\n return hash;\n }\n getHashCode(includeColor = true) {\n return FontTextInstance.getHashCode(this.font, this.text, includeColor ? this.color : undefined);\n }\n _applyRasterProperties(ctx) {\n var _a, _b, _c;\n ctx.translate(this.font.padding, this.font.padding);\n ctx.imageSmoothingEnabled = this.font.smoothing;\n ctx.lineWidth = this.font.lineWidth;\n ctx.setLineDash((_a = this.font.lineDash) !== null && _a !== void 0 ? _a : ctx.getLineDash());\n ctx.strokeStyle = (_c = (_b = this.font.strokeColor) === null || _b === void 0 ? void 0 : _b.toString()) !== null && _c !== void 0 ? _c : '';\n ctx.fillStyle = this.color.toString();\n }\n _applyFont(ctx) {\n ctx.resetTransform();\n ctx.translate(this.font.padding + ctx.canvas.width / 2, this.font.padding + ctx.canvas.height / 2);\n ctx.scale(this.font.quality, this.font.quality);\n ctx.textAlign = this.font.textAlign;\n ctx.textBaseline = this.font.baseAlign;\n ctx.font = this.font.fontString;\n ctx.direction = this.font.direction;\n if (this.font.shadow) {\n if (this.font.shadow.color) {\n ctx.shadowColor = this.font.shadow.color.toString();\n }\n if (this.font.shadow.blur) {\n ctx.shadowBlur = this.font.shadow.blur;\n }\n if (this.font.shadow.offset) {\n ctx.shadowOffsetX = this.font.shadow.offset.x;\n ctx.shadowOffsetY = this.font.shadow.offset.y;\n }\n }\n }\n _drawText(ctx, lines, lineHeight) {\n this._applyRasterProperties(ctx);\n this._applyFont(ctx);\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (this.color) {\n ctx.fillText(line, 0, i * lineHeight);\n }\n if (this.font.strokeColor) {\n ctx.strokeText(line, 0, i * lineHeight);\n }\n }\n if (this.font.showDebug) {\n // Horizontal line\n /* istanbul ignore next */\n (0,_Util_DrawUtil__WEBPACK_IMPORTED_MODULE_1__.line)(ctx, _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Green, -ctx.canvas.width / 2, 0, ctx.canvas.width / 2, 0, 2);\n // Vertical line\n /* istanbul ignore next */\n (0,_Util_DrawUtil__WEBPACK_IMPORTED_MODULE_1__.line)(ctx, _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Red, 0, -ctx.canvas.height / 2, 0, ctx.canvas.height / 2, 2);\n }\n }\n _splitTextBitmap(bitmap) {\n const textImages = [];\n let currentX = 0;\n let currentY = 0;\n // 4k is the max for mobile devices\n const width = Math.min(4096, bitmap.canvas.width);\n const height = Math.min(4096, bitmap.canvas.height);\n // Splits the original bitmap into 4k max chunks\n while (currentX < bitmap.canvas.width) {\n while (currentY < bitmap.canvas.height) {\n // create new bitmap\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Unable to split internal FontTextInstance bitmap, failed to create internal canvas');\n }\n // draw current slice to new bitmap in < 4k chunks\n ctx.drawImage(bitmap.canvas, currentX, currentY, width, height, 0, 0, width, height);\n textImages.push({ x: currentX, y: currentY, canvas });\n currentY += height;\n }\n currentX += width;\n currentY = 0;\n }\n return textImages;\n }\n flagDirty() {\n this._dirty = true;\n }\n render(ex, x, y, maxWidth) {\n var _a;\n if (this.disposed) {\n throw Error('Accessing disposed text instance! ' + this.text);\n }\n this._ex = ex;\n const hashCode = this.getHashCode();\n if (this._lastHashCode !== hashCode) {\n this._dirty = true;\n }\n // Calculate image chunks\n if (this._dirty) {\n this.dimensions = this.measureText(this.text, maxWidth);\n this._setDimension(this.dimensions, this.ctx);\n const lines = this._getLinesFromText(this.text, maxWidth);\n const lineHeight = (_a = this.font.lineHeight) !== null && _a !== void 0 ? _a : this.dimensions.height / lines.length;\n // draws the text to the main bitmap\n this._drawText(this.ctx, lines, lineHeight);\n // clear any out old fragments\n if (ex instanceof _Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_3__.ExcaliburGraphicsContextWebGL) {\n for (const frag of this._textFragments) {\n ex.textureLoader.delete(frag.canvas);\n }\n }\n // splits to < 4k fragments for large text\n this._textFragments = this._splitTextBitmap(this.ctx);\n if (ex instanceof _Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_3__.ExcaliburGraphicsContextWebGL) {\n for (const frag of this._textFragments) {\n ex.textureLoader.load(frag.canvas, { filtering: this.font.filtering }, true);\n }\n }\n this._lastHashCode = hashCode;\n this._dirty = false;\n }\n // draws the bitmap fragments to excalibur graphics context\n for (const frag of this._textFragments) {\n ex.drawImage(frag.canvas, 0, 0, frag.canvas.width, frag.canvas.height, frag.x / this.font.quality + x - this.ctx.canvas.width / this.font.quality / 2, frag.y / this.font.quality + y - this.ctx.canvas.height / this.font.quality / 2, frag.canvas.width / this.font.quality, frag.canvas.height / this.font.quality);\n }\n }\n dispose() {\n this.disposed = true;\n this.dimensions = undefined;\n this.canvas = undefined;\n this.ctx = undefined;\n if (this._ex instanceof _Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_3__.ExcaliburGraphicsContextWebGL) {\n for (const frag of this._textFragments) {\n this._ex.textureLoader.delete(frag.canvas);\n }\n }\n this._textFragments.length = 0;\n }\n _getLinesFromText(text, maxWidth) {\n var _a;\n if (this._cachedText === text && this._cachedRenderWidth === maxWidth && ((_a = this._cachedLines) === null || _a === void 0 ? void 0 : _a.length)) {\n return this._cachedLines;\n }\n const lines = text.split('\\n');\n if (maxWidth == null) {\n return lines;\n }\n // If the current line goes past the maxWidth, append a new line without modifying the underlying text.\n for (let i = 0; i < lines.length; i++) {\n let line = lines[i];\n let newLine = '';\n if (this.measureText(line).width > maxWidth) {\n while (this.measureText(line).width > maxWidth) {\n newLine = line[line.length - 1] + newLine;\n line = line.slice(0, -1); // Remove last character from line\n }\n // Update the array with our new values\n lines[i] = line;\n lines[i + 1] = newLine;\n }\n }\n this._cachedText = text;\n this._cachedLines = lines;\n this._cachedRenderWidth = maxWidth;\n return lines;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Graphic.ts\":\n/*!*****************************!*\\\n !*** ./Graphics/Graphic.ts ***!\n \\*****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Graphic: () => (/* binding */ Graphic)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Util_Watch__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Util/Watch */ \"./Util/Watch.ts\");\n/* harmony import */ var _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/affine-matrix */ \"./Math/affine-matrix.ts\");\n\n\n\n\n/**\n * A Graphic is the base Excalibur primitive for something that can be drawn to the {@apilink ExcaliburGraphicsContext}.\n * {@apilink Sprite}, {@apilink Animation}, {@apilink GraphicsGroup}, {@apilink Canvas}, {@apilink Rectangle}, {@apilink Circle}, and {@apilink Polygon} all derive from the\n * {@apilink Graphic} abstract class.\n *\n * Implementors of a Graphic must override the abstract {@apilink Graphic._drawImage} method to render an image to the graphics context. Graphic\n * handles all the position, rotation, and scale transformations in {@apilink Graphic._preDraw} and {@apilink Graphic._postDraw}\n */\nclass Graphic {\n isStale() {\n return this._transformStale;\n }\n /**\n * Gets or sets the flipHorizontal, which will flip the graphic horizontally (across the y axis)\n */\n get flipHorizontal() {\n return this._flipHorizontal;\n }\n set flipHorizontal(value) {\n this._flipHorizontal = value;\n this._transformStale = true;\n }\n /**\n * Gets or sets the flipVertical, which will flip the graphic vertically (across the x axis)\n */\n get flipVertical() {\n return this._flipVertical;\n }\n set flipVertical(value) {\n this._flipVertical = value;\n this._transformStale = true;\n }\n /**\n * Gets or sets the rotation of the graphic\n */\n get rotation() {\n return this._rotation;\n }\n set rotation(value) {\n this._rotation = value;\n this._transformStale = true;\n }\n /**\n * Gets or sets the scale of the graphic, this affects the width and\n */\n get scale() {\n return this._scale;\n }\n set scale(value) {\n this._scale = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_0__.watch)(value, () => {\n this._transformStale = true;\n });\n this._transformStale = true;\n }\n /**\n * Gets or sets the origin of the graphic, if not set the center of the graphic is the origin\n */\n get origin() {\n return this._origin;\n }\n set origin(value) {\n if (value) {\n this._origin = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_0__.watch)(value, () => {\n this._transformStale = true;\n });\n }\n this._transformStale = true;\n }\n constructor(options) {\n var _a, _b, _c, _d, _e, _f, _g;\n this.id = Graphic._ID++;\n this.transform = _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_1__.AffineMatrix.identity();\n this._transformStale = true;\n /**\n * Gets or sets wether to show debug information about the graphic\n */\n this.showDebug = false;\n this._flipHorizontal = false;\n this._flipVertical = false;\n this._rotation = 0;\n /**\n * Gets or sets the opacity of the graphic, 0 is transparent, 1 is solid (opaque).\n */\n this.opacity = 1;\n this._scale = _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.One;\n this._width = 0;\n this._height = 0;\n if (options) {\n this.origin = (_a = options.origin) !== null && _a !== void 0 ? _a : this.origin;\n this.flipHorizontal = (_b = options.flipHorizontal) !== null && _b !== void 0 ? _b : this.flipHorizontal;\n this.flipVertical = (_c = options.flipVertical) !== null && _c !== void 0 ? _c : this.flipVertical;\n this.rotation = (_d = options.rotation) !== null && _d !== void 0 ? _d : this.rotation;\n this.opacity = (_e = options.opacity) !== null && _e !== void 0 ? _e : this.opacity;\n this.scale = (_f = options.scale) !== null && _f !== void 0 ? _f : this.scale;\n this.tint = (_g = options.tint) !== null && _g !== void 0 ? _g : this.tint;\n if (options.width) {\n this._width = options.width;\n }\n if (options.height) {\n this._height = options.height;\n }\n }\n }\n cloneGraphicOptions() {\n return {\n width: this.width / this.scale.x,\n height: this.height / this.scale.y,\n origin: this.origin ? this.origin.clone() : undefined,\n flipHorizontal: this.flipHorizontal,\n flipVertical: this.flipVertical,\n rotation: this.rotation,\n opacity: this.opacity,\n scale: this.scale ? this.scale.clone() : undefined,\n tint: this.tint ? this.tint.clone() : undefined\n };\n }\n /**\n * Gets or sets the width of the graphic (always positive)\n */\n get width() {\n return Math.abs(this._width * this.scale.x);\n }\n /**\n * Gets or sets the height of the graphic (always positive)\n */\n get height() {\n return Math.abs(this._height * this.scale.y);\n }\n set width(value) {\n this._width = value;\n this._transformStale = true;\n }\n set height(value) {\n this._height = value;\n this._transformStale = true;\n }\n /**\n * Gets a copy of the bounds in pixels occupied by the graphic on the the screen. This includes scale.\n */\n get localBounds() {\n return _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_3__.BoundingBox.fromDimension(this.width, this.height, _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero);\n }\n /**\n * Draw the whole graphic to the context including transform\n * @param ex The excalibur graphics context\n * @param x\n * @param y\n */\n draw(ex, x, y) {\n this._preDraw(ex, x, y);\n this._drawImage(ex, 0, 0);\n this._postDraw(ex);\n }\n /**\n * Apply affine transformations to the graphics context to manipulate the graphic before {@apilink Graphic._drawImage}\n * @param ex\n * @param x\n * @param y\n */\n _preDraw(ex, x, y) {\n ex.save();\n ex.translate(x, y);\n if (this._transformStale) {\n this.transform.reset();\n this.transform.scale(Math.abs(this.scale.x), Math.abs(this.scale.y));\n this._rotate(this.transform);\n this._flip(this.transform);\n this._transformStale = false;\n }\n ex.multiply(this.transform);\n // it is important to multiply alphas so graphics respect the current context\n ex.opacity = ex.opacity * this.opacity;\n if (this.tint) {\n ex.tint = this.tint;\n }\n }\n _rotate(ex) {\n var _a;\n const scaleDirX = this.scale.x > 0 ? 1 : -1;\n const scaleDirY = this.scale.y > 0 ? 1 : -1;\n const origin = (_a = this.origin) !== null && _a !== void 0 ? _a : (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(this.width / 2, this.height / 2);\n ex.translate(origin.x, origin.y);\n ex.rotate(this.rotation);\n // This is for handling direction changes 1 or -1, that way we don't have mismatched translates()\n ex.scale(scaleDirX, scaleDirY);\n ex.translate(-origin.x, -origin.y);\n }\n _flip(ex) {\n if (this.flipHorizontal) {\n ex.translate(this.width / this.scale.x, 0);\n ex.scale(-1, 1);\n }\n if (this.flipVertical) {\n ex.translate(0, this.height / this.scale.y);\n ex.scale(1, -1);\n }\n }\n /**\n * Apply any additional work after {@apilink Graphic._drawImage} and restore the context state.\n * @param ex\n */\n _postDraw(ex) {\n if (this.showDebug) {\n ex.debug.drawRect(0, 0, this.width, this.height);\n }\n ex.restore();\n }\n}\nGraphic._ID = 0;\n\n\n/***/ }),\n\n/***/ \"./Graphics/GraphicsComponent.ts\":\n/*!***************************************!*\\\n !*** ./Graphics/GraphicsComponent.ts ***!\n \\***************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ GraphicsComponent: () => (/* binding */ GraphicsComponent),\n/* harmony export */ hasGraphicsTick: () => (/* binding */ hasGraphicsTick)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Collision_Index__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Collision/Index */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Component */ \"./EntityComponentSystem/Component.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Math_watch_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/watch-vector */ \"./Math/watch-vector.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Graphics_GraphicsGroup__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Graphics/GraphicsGroup */ \"./Graphics/GraphicsGroup.ts\");\n/* harmony import */ var _Raster__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Raster */ \"./Graphics/Raster.ts\");\n/* harmony import */ var _Text__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Text */ \"./Graphics/Text.ts\");\n\n\n\n\n\n\n\n\n\n\n/**\n * Type guard for checking if a Graphic HasTick (used for graphics that change over time like animations)\n * @param graphic\n */\nfunction hasGraphicsTick(graphic) {\n return !!graphic.tick;\n}\n/**\n * Component to manage drawings, using with the position component\n */\nclass GraphicsComponent extends _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n /**\n * Sets or gets wether any drawing should be visible in this component\n * @deprecated use isVisible\n */\n get visible() {\n return this.isVisible;\n }\n /**\n * Sets or gets wether any drawing should be visible in this component\n * @deprecated use isVisible\n */\n set visible(val) {\n this.isVisible = val;\n }\n /**\n * Offset to apply to graphics by default\n */\n get offset() {\n return this._offset;\n }\n set offset(value) {\n this._offset = new _Math_watch_vector__WEBPACK_IMPORTED_MODULE_1__.WatchVector(value, () => this.recalculateBounds());\n this.recalculateBounds();\n }\n /**\n * Anchor to apply to graphics by default\n */\n get anchor() {\n return this._anchor;\n }\n set anchor(value) {\n this._anchor = new _Math_watch_vector__WEBPACK_IMPORTED_MODULE_1__.WatchVector(value, () => this.recalculateBounds());\n this.recalculateBounds();\n }\n /**\n * Sets the color of the actor's current graphic\n */\n get color() {\n return this._color;\n }\n set color(v) {\n if (v) {\n this._color = v.clone();\n const currentGraphic = this.graphics.current;\n if (currentGraphic instanceof _Raster__WEBPACK_IMPORTED_MODULE_2__.Raster || currentGraphic instanceof _Text__WEBPACK_IMPORTED_MODULE_3__.Text) {\n currentGraphic.color = this._color;\n }\n }\n }\n constructor(options) {\n super();\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_4__.Logger.getInstance();\n this._current = 'default';\n this._graphics = {};\n this._options = {};\n this.material = null;\n /**\n * Sets or gets wether any drawing should be visible in this component\n */\n this.isVisible = true;\n /**\n * Optionally force the graphic onscreen, default false. Not recommend to use for perf reasons, only if you known what you're doing.\n */\n this.forceOnScreen = false;\n /**\n * Sets or gets wither all drawings should have an opacity applied\n */\n this.opacity = 1;\n this._offset = new _Math_watch_vector__WEBPACK_IMPORTED_MODULE_1__.WatchVector(_Math_vector__WEBPACK_IMPORTED_MODULE_5__.Vector.Zero, () => this.recalculateBounds());\n this._anchor = new _Math_watch_vector__WEBPACK_IMPORTED_MODULE_1__.WatchVector(_Math_vector__WEBPACK_IMPORTED_MODULE_5__.Vector.Half, () => this.recalculateBounds());\n /**\n * Flip all graphics horizontally along the y-axis\n */\n this.flipHorizontal = false;\n /**\n * Flip all graphics vertically along the x-axis\n */\n this.flipVertical = false;\n /**\n * If set to true graphics added to the component will be copied. This can effect performance, but is useful if you don't want\n * changes to a graphic to effect all the places it is used.\n */\n this.copyGraphics = false;\n // Defaults\n options = {\n visible: this.isVisible,\n graphics: {},\n ...options\n };\n const { current, anchor, color, opacity, visible, graphics, offset, copyGraphics, onPreDraw, onPostDraw, onPreTransformDraw, onPostTransformDraw } = options;\n for (const [key, graphicOrOptions] of Object.entries(graphics)) {\n if (graphicOrOptions instanceof _Graphic__WEBPACK_IMPORTED_MODULE_6__.Graphic) {\n this._graphics[key] = graphicOrOptions;\n }\n else {\n this._graphics[key] = graphicOrOptions.graphic;\n this._options[key] = graphicOrOptions.options;\n }\n }\n this.offset = offset !== null && offset !== void 0 ? offset : this.offset;\n this.opacity = opacity !== null && opacity !== void 0 ? opacity : this.opacity;\n this.anchor = anchor !== null && anchor !== void 0 ? anchor : this.anchor;\n this.color = color !== null && color !== void 0 ? color : this.color;\n this.copyGraphics = copyGraphics !== null && copyGraphics !== void 0 ? copyGraphics : this.copyGraphics;\n this.onPreDraw = onPreDraw !== null && onPreDraw !== void 0 ? onPreDraw : this.onPreDraw;\n this.onPostDraw = onPostDraw !== null && onPostDraw !== void 0 ? onPostDraw : this.onPostDraw;\n this.onPreDraw = onPreTransformDraw !== null && onPreTransformDraw !== void 0 ? onPreTransformDraw : this.onPreTransformDraw;\n this.onPostTransformDraw = onPostTransformDraw !== null && onPostTransformDraw !== void 0 ? onPostTransformDraw : this.onPostTransformDraw;\n this.isVisible = !!visible;\n this._current = current !== null && current !== void 0 ? current : this._current;\n if (current && this._graphics[current]) {\n this.use(current);\n }\n }\n getGraphic(name) {\n return this._graphics[name];\n }\n getOptions(name) {\n return this._options[name];\n }\n /**\n * Get registered graphics names\n */\n getNames() {\n return Object.keys(this._graphics);\n }\n /**\n * Returns the currently displayed graphic\n */\n get current() {\n return this._graphics[this._current];\n }\n /**\n * Returns the currently displayed graphic offsets\n */\n get currentOptions() {\n return this._options[this._current];\n }\n /**\n * Returns all graphics associated with this component\n */\n get graphics() {\n return this._graphics;\n }\n /**\n * Returns all graphics options associated with this component\n */\n get options() {\n return this._options;\n }\n add(nameOrGraphic, graphicOrOptions, options) {\n let name = 'default';\n let graphicToSet = null;\n let optionsToSet = undefined;\n if (typeof nameOrGraphic === 'string' && graphicOrOptions instanceof _Graphic__WEBPACK_IMPORTED_MODULE_6__.Graphic) {\n name = nameOrGraphic;\n graphicToSet = graphicOrOptions;\n optionsToSet = options;\n }\n if (nameOrGraphic instanceof _Graphic__WEBPACK_IMPORTED_MODULE_6__.Graphic && !(graphicOrOptions instanceof _Graphic__WEBPACK_IMPORTED_MODULE_6__.Graphic)) {\n graphicToSet = nameOrGraphic;\n optionsToSet = graphicOrOptions;\n }\n if (!graphicToSet) {\n throw new Error('Need to provide a graphic or valid graphic string');\n }\n this._graphics[name] = this.copyGraphics ? graphicToSet.clone() : graphicToSet;\n this._options[name] = this.copyGraphics ? { ...optionsToSet } : optionsToSet;\n if (name === 'default') {\n this.use('default');\n }\n return graphicToSet;\n }\n /**\n * Removes a registered graphic, if the removed graphic is the current it will switch to the default\n * @param name\n */\n remove(name) {\n delete this._graphics[name];\n delete this._options[name];\n if (this._current === name) {\n this._current = 'default';\n this.recalculateBounds();\n }\n }\n /**\n * Use a graphic only, will set the default graphic. Returns the new {@apilink Graphic}\n *\n * Optionally override the stored options\n * @param nameOrGraphic\n * @param options\n */\n use(nameOrGraphic, options) {\n var _a;\n if (nameOrGraphic instanceof _Graphic__WEBPACK_IMPORTED_MODULE_6__.Graphic) {\n let graphic = nameOrGraphic;\n if (this.copyGraphics) {\n graphic = nameOrGraphic.clone();\n }\n this._current = 'default';\n this._graphics[this._current] = graphic;\n this._options[this._current] = options;\n }\n else {\n this._current = nameOrGraphic;\n this._options[this._current] = options;\n if (!(this._current in this._graphics)) {\n this._logger.warn(`Graphic ${this._current} is not registered with the graphics component owned by ${(_a = this.owner) === null || _a === void 0 ? void 0 : _a.name}. Nothing will be drawn.`);\n }\n }\n this.recalculateBounds();\n return this.current;\n }\n /**\n * Hide currently shown graphic\n */\n hide() {\n this._current = 'ex.none';\n }\n set localBounds(bounds) {\n this._localBounds = bounds;\n }\n recalculateBounds() {\n let bb = new _Collision_Index__WEBPACK_IMPORTED_MODULE_7__.BoundingBox();\n const graphic = this._graphics[this._current];\n const options = this._options[this._current];\n if (!graphic) {\n this._localBounds = bb;\n return;\n }\n let anchor = this.anchor;\n let offset = this.offset;\n if (options === null || options === void 0 ? void 0 : options.anchor) {\n anchor = options.anchor;\n }\n if (options === null || options === void 0 ? void 0 : options.offset) {\n offset = options.offset;\n }\n const bounds = graphic.localBounds;\n const offsetX = -bounds.width * anchor.x + offset.x;\n const offsetY = -bounds.height * anchor.y + offset.y;\n if (graphic instanceof _Graphics_GraphicsGroup__WEBPACK_IMPORTED_MODULE_8__.GraphicsGroup && !graphic.useAnchor) {\n bb = graphic === null || graphic === void 0 ? void 0 : graphic.localBounds.combine(bb);\n }\n else {\n bb = graphic === null || graphic === void 0 ? void 0 : graphic.localBounds.translate((0,_Math_vector__WEBPACK_IMPORTED_MODULE_5__.vec)(offsetX, offsetY)).combine(bb);\n }\n this._localBounds = bb;\n }\n /**\n * Get local bounds of graphics component\n */\n get localBounds() {\n if (!this._localBounds || this._localBounds.hasZeroDimensions()) {\n this.recalculateBounds();\n }\n return this._localBounds; // recalc guarantees type\n }\n /**\n * Get world bounds of graphics component\n */\n get bounds() {\n let bounds = this.localBounds;\n if (this.owner) {\n const tx = this.owner.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_9__.TransformComponent);\n if (tx) {\n bounds = bounds.transform(tx.get().matrix);\n }\n }\n return bounds;\n }\n /**\n * Update underlying graphics if necessary, called internally\n * @param elapsed\n * @internal\n */\n update(elapsed, idempotencyToken = 0) {\n const graphic = this.current;\n if (graphic && hasGraphicsTick(graphic)) {\n graphic.tick(elapsed, idempotencyToken);\n }\n }\n clone() {\n const graphics = new GraphicsComponent();\n graphics._graphics = { ...this._graphics };\n graphics._options = { ...this._options };\n graphics.offset = this.offset.clone();\n if (this.color) {\n graphics.color = this.color.clone();\n }\n graphics.opacity = this.opacity;\n graphics.anchor = this.anchor.clone();\n graphics.copyGraphics = this.copyGraphics;\n graphics.onPreDraw = this.onPreDraw;\n graphics.onPostDraw = this.onPostDraw;\n graphics.isVisible = this.isVisible;\n return graphics;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/GraphicsDiagnostics.ts\":\n/*!*****************************************!*\\\n !*** ./Graphics/GraphicsDiagnostics.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ GraphicsDiagnostics: () => (/* binding */ GraphicsDiagnostics)\n/* harmony export */ });\nclass GraphicsDiagnostics {\n static clear() {\n GraphicsDiagnostics.DrawCallCount = 0;\n GraphicsDiagnostics.DrawnImagesCount = 0;\n }\n}\nGraphicsDiagnostics.DrawCallCount = 0;\nGraphicsDiagnostics.DrawnImagesCount = 0;\n\n\n/***/ }),\n\n/***/ \"./Graphics/GraphicsGroup.ts\":\n/*!***********************************!*\\\n !*** ./Graphics/GraphicsGroup.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ GraphicsGroup: () => (/* binding */ GraphicsGroup)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Animation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Animation */ \"./Graphics/Animation.ts\");\n/* harmony import */ var _Collision_Index__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Collision/Index */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n\n\n\n\n\nclass GraphicsGroup extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n constructor(options) {\n var _a;\n super(options);\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this.useAnchor = true;\n this.members = [];\n this.members = options.members;\n this.useAnchor = (_a = options.useAnchor) !== null && _a !== void 0 ? _a : this.useAnchor;\n this._updateDimensions();\n }\n clone() {\n return new GraphicsGroup({\n members: [...this.members],\n ...this.cloneGraphicOptions()\n });\n }\n _updateDimensions() {\n const bb = this.localBounds;\n this.width = bb.width;\n this.height = bb.height;\n return bb;\n }\n get localBounds() {\n const bb = new _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox();\n for (const member of this.members) {\n if (member instanceof _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic) {\n member.localBounds.combine(bb, bb);\n }\n else {\n const { graphic, offset: pos, useBounds } = member;\n const shouldUseBounds = useBounds === undefined ? true : useBounds;\n if (graphic) {\n if (shouldUseBounds) {\n graphic.localBounds.translate(pos).combine(bb, bb);\n }\n }\n else {\n this._logger.warnOnce(`Graphics group member has an null or undefined graphic, member definition: ${JSON.stringify(member)}.`);\n }\n }\n }\n return bb;\n }\n _isAnimationOrGroup(graphic) {\n return graphic instanceof _Animation__WEBPACK_IMPORTED_MODULE_3__.Animation || graphic instanceof GraphicsGroup;\n }\n tick(elapsed, idempotencyToken) {\n for (const member of this.members) {\n let graphic;\n if (member instanceof _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic) {\n graphic = member;\n }\n else {\n graphic = member.graphic;\n }\n if (this._isAnimationOrGroup(graphic)) {\n graphic.tick(elapsed, idempotencyToken);\n }\n }\n }\n reset() {\n for (const member of this.members) {\n let graphic;\n if (member instanceof _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic) {\n graphic = member;\n }\n else {\n graphic = member.graphic;\n }\n if (this._isAnimationOrGroup(graphic)) {\n graphic.reset();\n }\n }\n }\n _preDraw(ex, x, y) {\n this._updateDimensions();\n super._preDraw(ex, this.useAnchor ? x : 0, this.useAnchor ? y : 0);\n }\n _drawImage(ex, x, y) {\n const pos = _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero;\n for (const member of this.members) {\n let graphic;\n if (member instanceof _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic) {\n graphic = member;\n }\n else {\n graphic = member.graphic;\n member.offset.clone(pos);\n }\n if (!graphic) {\n continue;\n }\n ex.save();\n ex.translate(x, y);\n graphic.draw(ex, pos.x, pos.y);\n if (this.showDebug) {\n /* istanbul ignore next */\n ex.debug.drawRect(0, 0, this.width, this.height);\n }\n ex.restore();\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/GraphicsSystem.ts\":\n/*!************************************!*\\\n !*** ./Graphics/GraphicsSystem.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ GraphicsSystem: () => (/* binding */ GraphicsSystem)\n/* harmony export */ });\n/* harmony import */ var _GraphicsComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Priority.ts\");\n/* harmony import */ var _GraphicsGroup__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./GraphicsGroup */ \"./Graphics/GraphicsGroup.ts\");\n/* harmony import */ var _ParallaxComponent__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./ParallaxComponent */ \"./Graphics/ParallaxComponent.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Math/coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../Collision/BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _FontCache__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./FontCache */ \"./Graphics/FontCache.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _Math_transform__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/transform */ \"./Math/transform.ts\");\n/* harmony import */ var _TransformInterpolation__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./TransformInterpolation */ \"./Graphics/TransformInterpolation.ts\");\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass GraphicsSystem extends _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_0__.System {\n get sortedTransforms() {\n return this._sortedTransforms;\n }\n constructor(world) {\n super();\n this.world = world;\n this.systemType = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_0__.SystemType.Draw;\n this._token = 0;\n this._sortedTransforms = [];\n this._zHasChanged = false;\n this._zIndexUpdate = () => {\n this._zHasChanged = true;\n };\n this._targetInterpolationTransform = new _Math_transform__WEBPACK_IMPORTED_MODULE_1__.Transform();\n this.query = this.world.query([_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent, _GraphicsComponent__WEBPACK_IMPORTED_MODULE_3__.GraphicsComponent]);\n this.query.entityAdded$.subscribe((e) => {\n const tx = e.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n this._sortedTransforms.push(tx);\n tx.zIndexChanged$.subscribe(this._zIndexUpdate);\n this._zHasChanged = true;\n });\n this.query.entityRemoved$.subscribe((e) => {\n const tx = e.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n tx.zIndexChanged$.unsubscribe(this._zIndexUpdate);\n const index = this._sortedTransforms.indexOf(tx);\n if (index > -1) {\n this._sortedTransforms.splice(index, 1);\n }\n });\n }\n initialize(world, scene) {\n this._camera = scene.camera;\n this._engine = scene.engine;\n }\n preupdate() {\n // Graphics context could be switched to fallback in a new frame\n this._graphicsContext = this._engine.graphicsContext;\n if (this._zHasChanged) {\n this._sortedTransforms.sort((a, b) => {\n return a.globalZ - b.globalZ;\n });\n this._zHasChanged = false;\n }\n }\n update(elapsed) {\n this._token++;\n let graphics;\n _FontCache__WEBPACK_IMPORTED_MODULE_4__.FontCache.checkAndClearCache();\n // This is a performance enhancement, most things are in world space\n // so if we can only do this once saves a ton of transform updates\n this._graphicsContext.save();\n if (this._camera) {\n this._camera.draw(this._graphicsContext);\n }\n for (let transformIndex = 0; transformIndex < this._sortedTransforms.length; transformIndex++) {\n const transform = this._sortedTransforms[transformIndex];\n const entity = transform.owner;\n // If the entity is offscreen skip\n if (entity.hasTag('ex.offscreen')) {\n continue;\n }\n graphics = entity.get(_GraphicsComponent__WEBPACK_IMPORTED_MODULE_3__.GraphicsComponent);\n // Exit if graphics set to not visible\n if (!graphics.isVisible) {\n continue;\n }\n // Optionally run the onPreTransformDraw graphics lifecycle draw\n if (graphics.onPreTransformDraw) {\n graphics.onPreTransformDraw(this._graphicsContext, elapsed);\n }\n entity.events.emit('pretransformdraw', new _Events__WEBPACK_IMPORTED_MODULE_5__.PreTransformDrawEvent(this._graphicsContext, elapsed, entity));\n // This optionally sets our camera based on the entity coord plan (world vs. screen)\n if (transform.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__.CoordPlane.Screen) {\n this._graphicsContext.restore();\n }\n this._graphicsContext.save();\n if (transform.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__.CoordPlane.Screen) {\n this._graphicsContext.translate(this._engine.screen.contentArea.left, this._engine.screen.contentArea.top);\n }\n // Tick any graphics state (but only once) for animations and graphics groups\n graphics.update(elapsed, this._token);\n // Apply parallax\n const parallax = entity.get(_ParallaxComponent__WEBPACK_IMPORTED_MODULE_7__.ParallaxComponent);\n if (parallax) {\n // We use the Tiled formula\n // https://doc.mapeditor.org/en/latest/manual/layers/#parallax-scrolling-factor\n // cameraPos * (1 - parallaxFactor)\n const oneMinusFactor = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.One.sub(parallax.parallaxFactor);\n const parallaxOffset = this._camera.drawPos.scale(oneMinusFactor);\n this._graphicsContext.translate(parallaxOffset.x, parallaxOffset.y);\n }\n // Position the entity + estimate lag\n this._applyTransform(entity);\n // If there is a material enable it on the context\n if (graphics.material) {\n this._graphicsContext.material = graphics.material;\n }\n // Optionally run the onPreDraw graphics lifecycle draw\n if (graphics.onPreDraw) {\n graphics.onPreDraw(this._graphicsContext, elapsed);\n }\n entity.events.emit('predraw', new _Events__WEBPACK_IMPORTED_MODULE_5__.PreDrawEvent(this._graphicsContext, elapsed, entity));\n // this._graphicsContext.opacity *= graphics.opacity;\n this._applyOpacity(entity);\n // Draw the graphics component\n this._drawGraphicsComponent(graphics, transform);\n // Optionally run the onPostDraw graphics lifecycle draw\n if (graphics.onPostDraw) {\n graphics.onPostDraw(this._graphicsContext, elapsed);\n }\n entity.events.emit('postdraw', new _Events__WEBPACK_IMPORTED_MODULE_5__.PostDrawEvent(this._graphicsContext, elapsed, entity));\n this._graphicsContext.restore();\n // Reset the transform back to the original world space\n if (transform.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__.CoordPlane.Screen) {\n this._graphicsContext.save();\n if (this._camera) {\n this._camera.draw(this._graphicsContext);\n }\n }\n // Optionally run the onPreTransformDraw graphics lifecycle draw\n if (graphics.onPostTransformDraw) {\n graphics.onPostTransformDraw(this._graphicsContext, elapsed);\n }\n entity.events.emit('posttransformdraw', new _Events__WEBPACK_IMPORTED_MODULE_5__.PostTransformDrawEvent(this._graphicsContext, elapsed, entity));\n }\n this._graphicsContext.restore();\n }\n _drawGraphicsComponent(graphicsComponent, transformComponent) {\n var _a, _b;\n if (graphicsComponent.isVisible) {\n const flipHorizontal = graphicsComponent.flipHorizontal;\n const flipVertical = graphicsComponent.flipVertical;\n const graphic = graphicsComponent.current;\n const options = (_a = graphicsComponent.currentOptions) !== null && _a !== void 0 ? _a : {};\n if (graphic) {\n let anchor = graphicsComponent.anchor;\n let offset = graphicsComponent.offset;\n let scaleX = 1;\n let scaleY = 1;\n // handle specific overrides\n if (options === null || options === void 0 ? void 0 : options.anchor) {\n anchor = options.anchor;\n }\n if (options === null || options === void 0 ? void 0 : options.offset) {\n offset = options.offset;\n }\n const globalScale = transformComponent.globalScale;\n scaleX *= graphic.scale.x * globalScale.x;\n scaleY *= graphic.scale.y * globalScale.y;\n // See https://github.com/excaliburjs/Excalibur/pull/619 for discussion on this formula\n const offsetX = -graphic.width * anchor.x + offset.x * scaleX;\n const offsetY = -graphic.height * anchor.y + offset.y * scaleY;\n const oldFlipHorizontal = graphic.flipHorizontal;\n const oldFlipVertical = graphic.flipVertical;\n if (flipHorizontal || flipVertical) {\n // flip any currently flipped graphics\n graphic.flipHorizontal = flipHorizontal ? !oldFlipHorizontal : oldFlipHorizontal;\n graphic.flipVertical = flipVertical ? !oldFlipVertical : oldFlipVertical;\n }\n graphic === null || graphic === void 0 ? void 0 : graphic.draw(this._graphicsContext, offsetX, offsetY);\n if (flipHorizontal || flipVertical) {\n graphic.flipHorizontal = oldFlipHorizontal;\n graphic.flipVertical = oldFlipVertical;\n }\n // TODO move debug code out?\n if (((_b = this._engine) === null || _b === void 0 ? void 0 : _b.isDebug) && this._engine.debug.graphics.showBounds) {\n const offset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_8__.vec)(offsetX, offsetY);\n if (graphic instanceof _GraphicsGroup__WEBPACK_IMPORTED_MODULE_9__.GraphicsGroup) {\n for (const member of graphic.members) {\n let g;\n let pos = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Zero;\n if (member instanceof _Graphic__WEBPACK_IMPORTED_MODULE_10__.Graphic) {\n g = member;\n }\n else {\n g = member.graphic;\n pos = member.offset;\n }\n if (graphic.useAnchor) {\n g === null || g === void 0 ? void 0 : g.localBounds.translate(offset.add(pos)).draw(this._graphicsContext, this._engine.debug.graphics.boundsColor);\n }\n else {\n g === null || g === void 0 ? void 0 : g.localBounds.translate(pos).draw(this._graphicsContext, this._engine.debug.graphics.boundsColor);\n }\n }\n }\n else {\n /* istanbul ignore next */\n graphic === null || graphic === void 0 ? void 0 : graphic.localBounds.translate(offset).draw(this._graphicsContext, this._engine.debug.graphics.boundsColor);\n }\n }\n }\n }\n }\n /**\n * This applies the current entity transform to the graphics context\n * @param entity\n */\n _applyTransform(entity) {\n const ancestors = entity.getAncestors();\n for (let i = 0; i < ancestors.length; i++) {\n const ancestor = ancestors[i];\n const transform = ancestor === null || ancestor === void 0 ? void 0 : ancestor.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n const optionalBody = ancestor === null || ancestor === void 0 ? void 0 : ancestor.get(_Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_11__.BodyComponent);\n if (transform) {\n let tx = transform.get();\n if (optionalBody) {\n if (this._engine.fixedUpdateTimestep && optionalBody.__oldTransformCaptured && optionalBody.enableFixedUpdateInterpolate) {\n // Interpolate graphics if needed\n const blend = this._engine.currentFrameLagMs / this._engine.fixedUpdateTimestep;\n tx = (0,_TransformInterpolation__WEBPACK_IMPORTED_MODULE_12__.blendTransform)(optionalBody.oldTransform, transform.get(), blend, this._targetInterpolationTransform);\n }\n }\n this._graphicsContext.z = transform.globalZ;\n this._graphicsContext.translate(tx.pos.x, tx.pos.y);\n this._graphicsContext.scale(tx.scale.x, tx.scale.y);\n this._graphicsContext.rotate(tx.rotation);\n }\n }\n }\n _applyOpacity(entity) {\n var _a;\n const ancestors = entity.getAncestors();\n for (let i = 0; i < ancestors.length; i++) {\n const ancestor = ancestors[i];\n const maybeGraphics = ancestor === null || ancestor === void 0 ? void 0 : ancestor.get(_GraphicsComponent__WEBPACK_IMPORTED_MODULE_3__.GraphicsComponent);\n this._graphicsContext.opacity *= (_a = maybeGraphics === null || maybeGraphics === void 0 ? void 0 : maybeGraphics.opacity) !== null && _a !== void 0 ? _a : 1;\n }\n }\n}\nGraphicsSystem.priority = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_13__.SystemPriority.Average;\n\n\n/***/ }),\n\n/***/ \"./Graphics/ImageSource.ts\":\n/*!*********************************!*\\\n !*** ./Graphics/ImageSource.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ImageSource: () => (/* binding */ ImageSource),\n/* harmony export */ ImageSourceAttributeConstants: () => (/* binding */ ImageSourceAttributeConstants)\n/* harmony export */ });\n/* harmony import */ var _Resources_Resource__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Resources/Resource */ \"./Resources/Resource.ts\");\n/* harmony import */ var _Sprite__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Sprite */ \"./Graphics/Sprite.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Future */ \"./Util/Future.ts\");\n/* harmony import */ var _Graphics_Context_texture_loader__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Graphics/Context/texture-loader */ \"./Graphics/Context/texture-loader.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Wrapping */ \"./Graphics/Wrapping.ts\");\n\n\n\n\n\n\n\nconst ImageSourceAttributeConstants = {\n Filtering: 'filtering',\n WrappingX: 'wrapping-x',\n WrappingY: 'wrapping-y'\n};\nclass ImageSource {\n /**\n * The original size of the source image in pixels\n */\n get width() {\n return this.image.naturalWidth;\n }\n /**\n * The original height of the source image in pixels\n */\n get height() {\n return this.image.naturalHeight;\n }\n /**\n * Returns true if the Texture is completely loaded and is ready\n * to be drawn.\n */\n isLoaded() {\n if (!this._src) {\n // this boosts speed of access\n this._src = this.data.src;\n }\n return !!this._src;\n }\n get image() {\n return this.data;\n }\n constructor(pathOrBase64, bustCacheOrOptions, filtering) {\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance();\n /**\n * Access to the underlying html image element\n */\n this.data = new Image();\n this._readyFuture = new _Util_Future__WEBPACK_IMPORTED_MODULE_1__.Future();\n /**\n * Promise the resolves when the image is loaded and ready for use, does not initiate loading\n */\n this.ready = this._readyFuture.promise;\n this.path = pathOrBase64;\n let bustCache = false;\n let wrapping;\n if (typeof bustCacheOrOptions === 'boolean') {\n bustCache = bustCacheOrOptions;\n }\n else {\n ({ filtering, wrapping, bustCache } = { ...bustCacheOrOptions });\n }\n this._resource = new _Resources_Resource__WEBPACK_IMPORTED_MODULE_2__.Resource(pathOrBase64, 'blob', bustCache);\n this.filtering = filtering !== null && filtering !== void 0 ? filtering : this.filtering;\n if (typeof wrapping === 'string') {\n this.wrapping = {\n x: wrapping,\n y: wrapping\n };\n }\n else {\n this.wrapping = wrapping !== null && wrapping !== void 0 ? wrapping : this.wrapping;\n }\n if (pathOrBase64.endsWith('.gif')) {\n this._logger.warn(`Use the ex.Gif type to load gifs, you may have mixed results with ${pathOrBase64} in ex.ImageSource. Fully supported: svg, jpg, bmp, and png`);\n }\n }\n /**\n * Create an ImageSource from and HTML tag element\n * @param image\n */\n static fromHtmlImageElement(image, options) {\n const imageSource = new ImageSource('');\n imageSource._src = 'image-element';\n imageSource.data = image;\n imageSource.data.setAttribute('data-original-src', 'image-element');\n if (options === null || options === void 0 ? void 0 : options.filtering) {\n imageSource.data.setAttribute(ImageSourceAttributeConstants.Filtering, options === null || options === void 0 ? void 0 : options.filtering);\n }\n else {\n imageSource.data.setAttribute(ImageSourceAttributeConstants.Filtering, _Filtering__WEBPACK_IMPORTED_MODULE_3__.ImageFiltering.Blended);\n }\n if (options === null || options === void 0 ? void 0 : options.wrapping) {\n let wrapping;\n if (typeof options.wrapping === 'string') {\n wrapping = {\n x: options.wrapping,\n y: options.wrapping\n };\n }\n else {\n wrapping = {\n x: options.wrapping.x,\n y: options.wrapping.y\n };\n }\n imageSource.data.setAttribute(ImageSourceAttributeConstants.WrappingX, wrapping.x);\n imageSource.data.setAttribute(ImageSourceAttributeConstants.WrappingY, wrapping.y);\n }\n else {\n imageSource.data.setAttribute(ImageSourceAttributeConstants.WrappingX, _Wrapping__WEBPACK_IMPORTED_MODULE_4__.ImageWrapping.Clamp);\n imageSource.data.setAttribute(ImageSourceAttributeConstants.WrappingY, _Wrapping__WEBPACK_IMPORTED_MODULE_4__.ImageWrapping.Clamp);\n }\n _Graphics_Context_texture_loader__WEBPACK_IMPORTED_MODULE_5__.TextureLoader.checkImageSizeSupportedAndLog(image);\n imageSource._readyFuture.resolve(image);\n return imageSource;\n }\n static fromHtmlCanvasElement(image, options) {\n const imageSource = new ImageSource('');\n imageSource._src = 'canvas-element-blob';\n imageSource.data.setAttribute('data-original-src', 'canvas-element-blob');\n if (options === null || options === void 0 ? void 0 : options.filtering) {\n imageSource.data.setAttribute(ImageSourceAttributeConstants.Filtering, options === null || options === void 0 ? void 0 : options.filtering);\n }\n else {\n imageSource.data.setAttribute(ImageSourceAttributeConstants.Filtering, _Filtering__WEBPACK_IMPORTED_MODULE_3__.ImageFiltering.Blended);\n }\n if (options === null || options === void 0 ? void 0 : options.wrapping) {\n let wrapping;\n if (typeof options.wrapping === 'string') {\n wrapping = {\n x: options.wrapping,\n y: options.wrapping\n };\n }\n else {\n wrapping = {\n x: options.wrapping.x,\n y: options.wrapping.y\n };\n }\n imageSource.data.setAttribute(ImageSourceAttributeConstants.WrappingX, wrapping.x);\n imageSource.data.setAttribute(ImageSourceAttributeConstants.WrappingY, wrapping.y);\n }\n else {\n imageSource.data.setAttribute(ImageSourceAttributeConstants.WrappingX, _Wrapping__WEBPACK_IMPORTED_MODULE_4__.ImageWrapping.Clamp);\n imageSource.data.setAttribute(ImageSourceAttributeConstants.WrappingY, _Wrapping__WEBPACK_IMPORTED_MODULE_4__.ImageWrapping.Clamp);\n }\n _Graphics_Context_texture_loader__WEBPACK_IMPORTED_MODULE_5__.TextureLoader.checkImageSizeSupportedAndLog(image);\n image.toBlob((blob) => {\n // TODO throw? if blob null?\n const url = URL.createObjectURL(blob);\n imageSource.image.onload = () => {\n // no longer need to read the blob so it's revoked\n URL.revokeObjectURL(url);\n imageSource.data = imageSource.image;\n imageSource._readyFuture.resolve(imageSource.image);\n };\n imageSource.image.src = url;\n });\n return imageSource;\n }\n static fromSvgString(svgSource, options) {\n const blob = new Blob([svgSource], { type: 'image/svg+xml' });\n const url = URL.createObjectURL(blob);\n return new ImageSource(url, options);\n }\n /**\n * Should excalibur add a cache busting querystring? By default false.\n * Must be set before loading\n */\n get bustCache() {\n return this._resource.bustCache;\n }\n set bustCache(val) {\n this._resource.bustCache = val;\n }\n /**\n * Begins loading the image and returns a promise that resolves when the image is loaded\n */\n async load() {\n var _a, _b, _c, _d;\n if (this.isLoaded()) {\n return this.data;\n }\n try {\n // Load base64 or blob if needed\n let url;\n if (!this.path.includes('data:image/')) {\n const blob = await this._resource.load();\n url = URL.createObjectURL(blob);\n }\n else {\n url = this.path;\n }\n // Decode the image\n const image = new Image();\n // Use Image.onload over Image.decode()\n // https://bugs.chromium.org/p/chromium/issues/detail?id=1055828#c7\n // Otherwise chrome will throw still Image.decode() failures for large textures\n const loadedFuture = new _Util_Future__WEBPACK_IMPORTED_MODULE_1__.Future();\n image.onload = () => loadedFuture.resolve();\n image.src = url;\n image.setAttribute('data-original-src', this.path);\n await loadedFuture.promise;\n // Set results\n // We defer loading the texture into webgl until the first draw that way we avoid a singleton\n // and for the multi-engine case the texture needs to be created in EACH webgl context to work\n // See image-renderer.ts draw()\n this.data = image;\n // emit warning if potentially too big\n _Graphics_Context_texture_loader__WEBPACK_IMPORTED_MODULE_5__.TextureLoader.checkImageSizeSupportedAndLog(this.data);\n }\n catch (error) {\n throw `Error loading ImageSource from path '${this.path}' with error [${error.message}]`;\n }\n // Do a bad thing to pass the filtering as an attribute\n this.data.setAttribute(ImageSourceAttributeConstants.Filtering, this.filtering); // TODO fix type\n this.data.setAttribute(ImageSourceAttributeConstants.WrappingX, (_b = (_a = this.wrapping) === null || _a === void 0 ? void 0 : _a.x) !== null && _b !== void 0 ? _b : _Wrapping__WEBPACK_IMPORTED_MODULE_4__.ImageWrapping.Clamp);\n this.data.setAttribute(ImageSourceAttributeConstants.WrappingY, (_d = (_c = this.wrapping) === null || _c === void 0 ? void 0 : _c.y) !== null && _d !== void 0 ? _d : _Wrapping__WEBPACK_IMPORTED_MODULE_4__.ImageWrapping.Clamp);\n // todo emit complete\n this._readyFuture.resolve(this.data);\n return this.data;\n }\n /**\n * Build a sprite from this ImageSource\n */\n toSprite(options) {\n return _Sprite__WEBPACK_IMPORTED_MODULE_6__.Sprite.from(this, options);\n }\n /**\n * Unload images from memory\n */\n unload() {\n this.data = new Image();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Line.ts\":\n/*!**************************!*\\\n !*** ./Graphics/Line.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Line: () => (/* binding */ Line)\n/* harmony export */ });\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n\n\n\nclass Line extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n constructor(options) {\n super();\n this.color = _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Black;\n this.thickness = 1;\n const { start, end, color, thickness } = options;\n this.start = start;\n this.end = end;\n this.color = color !== null && color !== void 0 ? color : this.color;\n this.thickness = thickness !== null && thickness !== void 0 ? thickness : this.thickness;\n this._localBounds = this._calculateBounds();\n const { width, height } = this._localBounds;\n this.width = width;\n this.height = height;\n }\n get localBounds() {\n return this._localBounds;\n }\n _calculateBounds() {\n const lineNormal = this.end.sub(this.start).normal();\n const halfThickness = this.thickness / 2;\n const points = [\n this.start.add(lineNormal.scale(halfThickness)),\n this.end.add(lineNormal.scale(halfThickness)),\n this.end.add(lineNormal.scale(-halfThickness)),\n this.start.add(lineNormal.scale(-halfThickness))\n ];\n return _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromPoints(points);\n }\n _drawImage(ctx, _x, _y) {\n ctx.drawLine(this.start, this.end, this.color, this.thickness);\n }\n clone() {\n return new Line({\n start: this.start,\n end: this.end,\n color: this.color,\n thickness: this.thickness\n });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/NineSlice.ts\":\n/*!*******************************!*\\\n !*** ./Graphics/NineSlice.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ NineSlice: () => (/* binding */ NineSlice),\n/* harmony export */ NineSliceStretch: () => (/* binding */ NineSliceStretch)\n/* harmony export */ });\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n\n\n\n/**\n * Nine slice stretch mode\n */\nvar NineSliceStretch;\n(function (NineSliceStretch) {\n /**\n * Stretch the image across a dimension\n */\n NineSliceStretch[\"Stretch\"] = \"stretch\";\n /**\n * Tile the image across a dimension\n */\n NineSliceStretch[\"Tile\"] = \"tile\";\n /**\n * Tile the image across a dimension but only by whole image amounts\n */\n NineSliceStretch[\"TileFit\"] = \"tile-fit\";\n})(NineSliceStretch || (NineSliceStretch = {}));\nclass NineSlice extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n constructor(config) {\n super(config);\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this._config = config;\n this._imgSource = config.source;\n this._canvasA = document.createElement('canvas');\n this._canvasB = document.createElement('canvas');\n this._canvasC = document.createElement('canvas');\n this._canvasD = document.createElement('canvas');\n this._canvasE = document.createElement('canvas');\n this._canvasF = document.createElement('canvas');\n this._canvasG = document.createElement('canvas');\n this._canvasH = document.createElement('canvas');\n this._canvasI = document.createElement('canvas');\n this._initialize();\n this._imgSource.ready.then(() => {\n this._initialize();\n });\n }\n /**\n * Sets the target width of the 9 slice (pixels), and recalculates the 9 slice if desired (auto)\n * @param newWidth\n * @param auto\n */\n setTargetWidth(newWidth, auto = false) {\n this._config.width = newWidth;\n if (auto) {\n this._initialize();\n }\n }\n /**\n * Sets the target height of the 9 slice (pixels), and recalculates the 9 slice if desired (auto)\n * @param newHeight\n * @param auto\n */\n setTargetHeight(newHeight, auto = false) {\n this._config.height = newHeight;\n if (auto) {\n this._initialize();\n }\n }\n /**\n * Sets the 9 slice margins (pixels), and recalculates the 9 slice if desired (auto)\n */\n setMargins(left, top, right, bottom, auto = false) {\n this._config.sourceConfig.leftMargin = left;\n this._config.sourceConfig.topMargin = top;\n this._config.sourceConfig.rightMargin = right;\n this._config.sourceConfig.bottomMargin = bottom;\n if (auto) {\n this._initialize();\n }\n }\n /**\n * Sets the stretching strategy for the 9 slice, and recalculates the 9 slice if desired (auto)\n *\n */\n setStretch(type, stretch, auto = false) {\n if (type === 'horizontal') {\n this._config.destinationConfig.horizontalStretch = stretch;\n }\n else if (type === 'vertical') {\n this._config.destinationConfig.verticalStretch = stretch;\n }\n else {\n this._config.destinationConfig.horizontalStretch = stretch;\n this._config.destinationConfig.verticalStretch = stretch;\n }\n if (auto) {\n this._initialize();\n }\n }\n /**\n * Returns the config of the 9 slice\n */\n getConfig() {\n return this._config;\n }\n /**\n * Draws 1 of the 9 tiles based on parameters passed in\n * context is the ExcaliburGraphicsContext from the _drawImage function\n * destinationSize is the size of the destination image as a vector (width,height)\n * targetCanvas is the canvas to draw to\n * horizontalStretch and verticalStretch are the horizontal and vertical stretching strategies\n * marginW and marginH are optional margins for the 9 slice for positioning\n * @param context\n * @param targetCanvas\n * @param destinationSize\n * @param horizontalStretch\n * @param verticalStretch\n * @param marginWidth\n * @param marginHeight\n */\n _drawTile(context, targetCanvas, destinationSize, horizontalStretch, verticalStretch, marginWidth, marginHeight) {\n const tempMarginW = marginWidth || 0;\n const tempMarginH = marginHeight || 0;\n let tempSizeX, tempPositionX, tempSizeY, tempPositionY;\n const numTilesX = this._getNumberOfTiles(targetCanvas.width, destinationSize.x, horizontalStretch);\n const numTilesY = this._getNumberOfTiles(targetCanvas.height, destinationSize.y, verticalStretch);\n for (let i = 0; i < numTilesX; i++) {\n for (let j = 0; j < numTilesY; j++) {\n let { tempSize, tempPosition } = this._calculateParams(i, numTilesX, targetCanvas.width, destinationSize.x, this._config.destinationConfig.horizontalStretch);\n tempSizeX = tempSize;\n tempPositionX = tempPosition;\n ({ tempSize, tempPosition } = this._calculateParams(j, numTilesY, targetCanvas.height, destinationSize.y, this._config.destinationConfig.verticalStretch));\n tempSizeY = tempSize;\n tempPositionY = tempPosition;\n context.drawImage(targetCanvas, 0, 0, targetCanvas.width, targetCanvas.height, tempMarginW + tempPositionX, tempMarginH + tempPositionY, tempSizeX, tempSizeY);\n }\n }\n }\n /**\n * Draws the 9 slices to the canvas\n */\n _drawImage(ex, x, y) {\n if (this._imgSource.isLoaded()) {\n // Top left, no stretching\n this._drawTile(ex, this._canvasA, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.sourceConfig.leftMargin, this._config.sourceConfig.topMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch);\n // Top, middle, horizontal stretching\n this._drawTile(ex, this._canvasB, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.width - this._config.sourceConfig.leftMargin - this._config.sourceConfig.rightMargin, this._config.sourceConfig.topMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch, this._config.sourceConfig.leftMargin, 0);\n // Top right, no stretching\n this._drawTile(ex, this._canvasC, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.sourceConfig.rightMargin, this._config.sourceConfig.topMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch, this._config.width - this._config.sourceConfig.rightMargin, 0);\n // middle, left, vertical stretching\n this._drawTile(ex, this._canvasD, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.sourceConfig.leftMargin, this._config.height - this._config.sourceConfig.bottomMargin - this._config.sourceConfig.topMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch, 0, this._config.sourceConfig.topMargin);\n // center, both stretching\n if (this._config.destinationConfig.drawCenter) {\n this._drawTile(ex, this._canvasE, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.width - this._config.sourceConfig.leftMargin - this._config.sourceConfig.rightMargin, this._config.height - this._config.sourceConfig.bottomMargin - this._config.sourceConfig.topMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch, this._config.sourceConfig.leftMargin, this._config.sourceConfig.topMargin);\n }\n // middle, right, vertical stretching\n this._drawTile(ex, this._canvasF, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.sourceConfig.rightMargin, this._config.height - this._config.sourceConfig.bottomMargin - this._config.sourceConfig.topMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch, this._config.width - this._config.sourceConfig.rightMargin, this._config.sourceConfig.topMargin);\n // bottom left, no stretching\n this._drawTile(ex, this._canvasG, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.sourceConfig.leftMargin, this._config.sourceConfig.bottomMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch, 0, this._config.height - this._config.sourceConfig.bottomMargin);\n // bottom middle, horizontal stretching\n this._drawTile(ex, this._canvasH, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.width - this._config.sourceConfig.leftMargin - this._config.sourceConfig.rightMargin, this._config.sourceConfig.bottomMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch, this._config.sourceConfig.leftMargin, this._config.height - this._config.sourceConfig.bottomMargin);\n // bottom right, no stretching\n this._drawTile(ex, this._canvasI, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.sourceConfig.rightMargin, this._config.sourceConfig.bottomMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch, this._config.width - this._config.sourceConfig.rightMargin, this._config.height - this._config.sourceConfig.bottomMargin);\n }\n else {\n this._logger.warnOnce(`NineSlice ImageSource ${this._imgSource.path}` +\n ` is not yet loaded and won't be drawn. Please call .load() or include in a Loader.\\n\\n` +\n `Read https://excaliburjs.com/docs/imagesource for more information.`);\n }\n }\n /**\n * Slices the source sprite into the 9 slice canvases internally\n */\n _initialize() {\n this._sourceSprite = this._imgSource.image;\n // top left slice\n this._canvasA.width = this._config.sourceConfig.leftMargin;\n this._canvasA.height = this._config.sourceConfig.topMargin;\n const aCtx = this._canvasA.getContext('2d');\n aCtx === null || aCtx === void 0 ? void 0 : aCtx.drawImage(this._sourceSprite, 0, 0, this._canvasA.width, this._canvasA.height, 0, 0, this._canvasA.width, this._canvasA.height);\n // top slice\n this._canvasB.width = this._config.sourceConfig.width - this._config.sourceConfig.leftMargin - this._config.sourceConfig.rightMargin;\n this._canvasB.height = this._config.sourceConfig.topMargin;\n const bCtx = this._canvasB.getContext('2d');\n bCtx === null || bCtx === void 0 ? void 0 : bCtx.drawImage(this._sourceSprite, this._config.sourceConfig.leftMargin, 0, this._canvasB.width, this._canvasB.height, 0, 0, this._canvasB.width, this._canvasB.height);\n // top right slice\n this._canvasC.width = this._config.sourceConfig.rightMargin;\n this._canvasC.height = this._config.sourceConfig.topMargin;\n const cCtx = this._canvasC.getContext('2d');\n cCtx === null || cCtx === void 0 ? void 0 : cCtx.drawImage(this._sourceSprite, this._sourceSprite.width - this._config.sourceConfig.rightMargin, 0, this._canvasC.width, this._canvasC.height, 0, 0, this._canvasC.width, this._canvasC.height);\n // middle left slice\n this._canvasD.width = this._config.sourceConfig.leftMargin;\n this._canvasD.height = this._config.sourceConfig.height - this._config.sourceConfig.topMargin - this._config.sourceConfig.bottomMargin;\n const dCtx = this._canvasD.getContext('2d');\n dCtx === null || dCtx === void 0 ? void 0 : dCtx.drawImage(this._sourceSprite, 0, this._config.sourceConfig.topMargin, this._canvasD.width, this._canvasD.height, 0, 0, this._canvasD.width, this._canvasD.height);\n // middle slice\n this._canvasE.width = this._config.sourceConfig.width - this._config.sourceConfig.leftMargin - this._config.sourceConfig.rightMargin;\n this._canvasE.height = this._config.sourceConfig.height - this._config.sourceConfig.topMargin - this._config.sourceConfig.bottomMargin;\n const eCtx = this._canvasE.getContext('2d');\n eCtx === null || eCtx === void 0 ? void 0 : eCtx.drawImage(this._sourceSprite, this._config.sourceConfig.leftMargin, this._config.sourceConfig.topMargin, this._canvasE.width, this._canvasE.height, 0, 0, this._canvasE.width, this._canvasE.height);\n // middle right slice\n this._canvasF.width = this._config.sourceConfig.rightMargin;\n this._canvasF.height = this._config.sourceConfig.height - this._config.sourceConfig.topMargin - this._config.sourceConfig.bottomMargin;\n const fCtx = this._canvasF.getContext('2d');\n fCtx === null || fCtx === void 0 ? void 0 : fCtx.drawImage(this._sourceSprite, this._config.sourceConfig.width - this._config.sourceConfig.rightMargin, this._config.sourceConfig.topMargin, this._canvasF.width, this._canvasF.height, 0, 0, this._canvasF.width, this._canvasF.height);\n // bottom left slice\n this._canvasG.width = this._config.sourceConfig.leftMargin;\n this._canvasG.height = this._config.sourceConfig.bottomMargin;\n const gCtx = this._canvasG.getContext('2d');\n gCtx === null || gCtx === void 0 ? void 0 : gCtx.drawImage(this._sourceSprite, 0, this._config.sourceConfig.height - this._config.sourceConfig.bottomMargin, this._canvasG.width, this._canvasG.height, 0, 0, this._canvasG.width, this._canvasG.height);\n // bottom slice\n this._canvasH.width = this._config.sourceConfig.width - this._config.sourceConfig.leftMargin - this._config.sourceConfig.rightMargin;\n this._canvasH.height = this._config.sourceConfig.bottomMargin;\n const hCtx = this._canvasH.getContext('2d');\n hCtx === null || hCtx === void 0 ? void 0 : hCtx.drawImage(this._sourceSprite, this._config.sourceConfig.leftMargin, this._config.sourceConfig.height - this._config.sourceConfig.bottomMargin, this._canvasH.width, this._canvasH.height, 0, 0, this._canvasH.width, this._canvasH.height);\n // bottom right slice\n this._canvasI.width = this._config.sourceConfig.rightMargin;\n this._canvasI.height = this._config.sourceConfig.bottomMargin;\n const iCtx = this._canvasI.getContext('2d');\n iCtx === null || iCtx === void 0 ? void 0 : iCtx.drawImage(this._sourceSprite, this._sourceSprite.width - this._config.sourceConfig.rightMargin, this._config.sourceConfig.height - this._config.sourceConfig.bottomMargin, this._canvasI.width, this._canvasI.height, 0, 0, this._canvasI.width, this._canvasI.height);\n }\n /**\n * Clones the 9 slice\n */\n clone() {\n return new NineSlice(this._config);\n }\n /**\n * Returns the number of tiles\n */\n _getNumberOfTiles(tileSize, destinationSize, strategy) {\n switch (strategy) {\n case NineSliceStretch.Stretch:\n return 1;\n case NineSliceStretch.Tile:\n return Math.ceil(destinationSize / tileSize);\n case NineSliceStretch.TileFit:\n return Math.ceil(destinationSize / tileSize);\n }\n }\n /**\n * Returns the position and size of the tile\n */\n _calculateParams(tileNum, numTiles, tileSize, destinationSize, strategy) {\n switch (strategy) {\n case NineSliceStretch.Stretch:\n return {\n tempPosition: 0,\n tempSize: destinationSize\n };\n case NineSliceStretch.Tile:\n // if last tile, adjust size\n if (tileNum === numTiles - 1) {\n //last tile\n return {\n tempPosition: tileNum * tileSize,\n tempSize: tileSize - (numTiles * tileSize - destinationSize)\n };\n }\n else {\n return {\n tempPosition: tileNum * tileSize,\n tempSize: tileSize\n };\n }\n case NineSliceStretch.TileFit:\n const reducedTileSize = destinationSize / numTiles;\n const position = tileNum * reducedTileSize;\n return {\n tempPosition: position,\n tempSize: reducedTileSize\n };\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/OffscreenSystem.ts\":\n/*!*************************************!*\\\n !*** ./Graphics/OffscreenSystem.ts ***!\n \\*************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ OffscreenSystem: () => (/* binding */ OffscreenSystem)\n/* harmony export */ });\n/* harmony import */ var _GraphicsComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _ParallaxComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./ParallaxComponent */ \"./Graphics/ParallaxComponent.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Math/coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Priority.ts\");\n\n\n\n\n\n\n\n\nclass OffscreenSystem extends _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.System {\n constructor(world) {\n super();\n this.world = world;\n this.systemType = _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.SystemType.Draw;\n this.query = this.world.query([_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent, _GraphicsComponent__WEBPACK_IMPORTED_MODULE_2__.GraphicsComponent]);\n }\n initialize(world, scene) {\n this._camera = scene.camera;\n this._screen = scene.engine.screen;\n }\n update() {\n this._worldBounds = this._screen.getWorldBounds();\n let transform;\n let graphics;\n let maybeParallax;\n for (let i = 0; i < this.query.entities.length; i++) {\n const entity = this.query.entities[i];\n graphics = entity.get(_GraphicsComponent__WEBPACK_IMPORTED_MODULE_2__.GraphicsComponent);\n transform = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n maybeParallax = entity.get(_ParallaxComponent__WEBPACK_IMPORTED_MODULE_3__.ParallaxComponent);\n let parallaxOffset;\n if (maybeParallax) {\n // We use the Tiled formula\n // https://doc.mapeditor.org/en/latest/manual/layers/#parallax-scrolling-factor\n // cameraPos * (1 - parallaxFactor)\n const oneMinusFactor = _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.One.sub(maybeParallax.parallaxFactor);\n parallaxOffset = this._camera.pos.scale(oneMinusFactor);\n }\n // Figure out if entities are offscreen\n const entityOffscreen = this._isOffscreen(transform, graphics, parallaxOffset);\n if (entityOffscreen && !entity.hasTag('ex.offscreen')) {\n entity.events.emit('exitviewport', new _Events__WEBPACK_IMPORTED_MODULE_5__.ExitViewPortEvent(entity));\n entity.addTag('ex.offscreen');\n }\n if (!entityOffscreen && entity.hasTag('ex.offscreen')) {\n entity.events.emit('enterviewport', new _Events__WEBPACK_IMPORTED_MODULE_5__.EnterViewPortEvent(entity));\n entity.removeTag('ex.offscreen');\n }\n }\n }\n _isOffscreen(transform, graphics, parallaxOffset) {\n if (graphics.forceOnScreen) {\n return false;\n }\n if (transform.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__.CoordPlane.World) {\n let bounds = graphics.localBounds;\n if (parallaxOffset) {\n bounds = bounds.translate(parallaxOffset);\n }\n const transformedBounds = bounds.transform(transform.get().matrix);\n const graphicsOffscreen = !this._worldBounds.overlaps(transformedBounds);\n return graphicsOffscreen;\n }\n else {\n // TODO screen coordinates\n return false;\n }\n }\n}\nOffscreenSystem.priority = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_7__.SystemPriority.Higher;\n\n\n/***/ }),\n\n/***/ \"./Graphics/ParallaxComponent.ts\":\n/*!***************************************!*\\\n !*** ./Graphics/ParallaxComponent.ts ***!\n \\***************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ParallaxComponent: () => (/* binding */ ParallaxComponent)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Component */ \"./EntityComponentSystem/Component.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n\n\nclass ParallaxComponent extends _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor(parallaxFactor) {\n super();\n this.parallaxFactor = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(1.0, 1.0);\n this.parallaxFactor = parallaxFactor !== null && parallaxFactor !== void 0 ? parallaxFactor : this.parallaxFactor;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Polygon.ts\":\n/*!*****************************!*\\\n !*** ./Graphics/Polygon.ts ***!\n \\*****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Polygon: () => (/* binding */ Polygon)\n/* harmony export */ });\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Raster__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Raster */ \"./Graphics/Raster.ts\");\n\n\n\n/**\n * A polygon {@apilink Graphic} for drawing arbitrary polygons to the {@apilink ExcaliburGraphicsContext}\n *\n * Polygons default to {@apilink ImageFiltering.Blended}\n */\nclass Polygon extends _Raster__WEBPACK_IMPORTED_MODULE_0__.Raster {\n get points() {\n return this._points;\n }\n set points(points) {\n this._points = points;\n const min = this.minPoint;\n this.width = this._points.reduce((max, p) => Math.max(p.x, max), 0) - min.x;\n this.height = this._points.reduce((max, p) => Math.max(p.y, max), 0) - min.y;\n this.flagDirty();\n }\n get minPoint() {\n const minX = this._points.reduce((min, p) => Math.min(p.x, min), Infinity);\n const minY = this._points.reduce((min, p) => Math.min(p.y, min), Infinity);\n return (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(minX, minY);\n }\n constructor(options) {\n super(options);\n this._points = [];\n this.points = options.points;\n this.filtering = _Filtering__WEBPACK_IMPORTED_MODULE_2__.ImageFiltering.Blended;\n this.rasterize();\n }\n clone() {\n return new Polygon({\n points: this.points.map((p) => p.clone()),\n ...this.cloneGraphicOptions(),\n ...this.cloneRasterOptions()\n });\n }\n execute(ctx) {\n if (this.points && this.points.length) {\n ctx.beginPath();\n // Iterate through the supplied points and construct a 'polygon'\n const min = this.minPoint.negate();\n const firstPoint = this.points[0].add(min);\n ctx.moveTo(firstPoint.x, firstPoint.y);\n this.points.forEach((point) => {\n ctx.lineTo(point.x + min.x, point.y + min.y);\n });\n ctx.lineTo(firstPoint.x, firstPoint.y);\n ctx.closePath();\n if (this.color) {\n ctx.fill();\n }\n if (this.strokeColor) {\n ctx.stroke();\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/PostProcessor/ColorBlindnessMode.ts\":\n/*!******************************************************!*\\\n !*** ./Graphics/PostProcessor/ColorBlindnessMode.ts ***!\n \\******************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ColorBlindnessMode: () => (/* binding */ ColorBlindnessMode)\n/* harmony export */ });\nvar ColorBlindnessMode;\n(function (ColorBlindnessMode) {\n ColorBlindnessMode[\"Protanope\"] = \"Protanope\";\n ColorBlindnessMode[\"Deuteranope\"] = \"Deuteranope\";\n ColorBlindnessMode[\"Tritanope\"] = \"Tritanope\";\n})(ColorBlindnessMode || (ColorBlindnessMode = {}));\n\n\n/***/ }),\n\n/***/ \"./Graphics/PostProcessor/ColorBlindnessPostProcessor.ts\":\n/*!***************************************************************!*\\\n !*** ./Graphics/PostProcessor/ColorBlindnessPostProcessor.ts ***!\n \\***************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ColorBlindnessPostProcessor: () => (/* binding */ ColorBlindnessPostProcessor)\n/* harmony export */ });\n/* harmony import */ var _color_blind_fragment_glsl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./color-blind-fragment.glsl */ \"./Graphics/PostProcessor/color-blind-fragment.glsl\");\n/* harmony import */ var _ColorBlindnessMode__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ColorBlindnessMode */ \"./Graphics/PostProcessor/ColorBlindnessMode.ts\");\n/* harmony import */ var _ScreenShader__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ScreenShader */ \"./Graphics/PostProcessor/ScreenShader.ts\");\n\n\n\nclass ColorBlindnessPostProcessor {\n constructor(_colorBlindnessMode, simulate = false) {\n this._colorBlindnessMode = _colorBlindnessMode;\n this._simulate = false;\n this._simulate = simulate;\n }\n initialize(gl) {\n this._shader = new _ScreenShader__WEBPACK_IMPORTED_MODULE_0__.ScreenShader(gl, _color_blind_fragment_glsl__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n this.simulate = this._simulate;\n this.colorBlindnessMode = this._colorBlindnessMode;\n }\n getShader() {\n return this._shader.getShader();\n }\n getLayout() {\n return this._shader.getLayout();\n }\n set colorBlindnessMode(colorBlindMode) {\n this._colorBlindnessMode = colorBlindMode;\n if (this._shader) {\n const shader = this._shader.getShader();\n shader.use();\n if (this._colorBlindnessMode === _ColorBlindnessMode__WEBPACK_IMPORTED_MODULE_2__.ColorBlindnessMode.Protanope) {\n shader.setUniformInt('u_type', 0);\n }\n else if (this._colorBlindnessMode === _ColorBlindnessMode__WEBPACK_IMPORTED_MODULE_2__.ColorBlindnessMode.Deuteranope) {\n shader.setUniformInt('u_type', 1);\n }\n else if (this._colorBlindnessMode === _ColorBlindnessMode__WEBPACK_IMPORTED_MODULE_2__.ColorBlindnessMode.Tritanope) {\n shader.setUniformInt('u_type', 2);\n }\n }\n }\n get colorBlindnessMode() {\n return this._colorBlindnessMode;\n }\n set simulate(value) {\n this._simulate = value;\n if (this._shader) {\n const shader = this._shader.getShader();\n shader.use();\n shader.setUniformBoolean('u_simulate', value);\n }\n }\n get simulate() {\n return this._simulate;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/PostProcessor/ScreenShader.ts\":\n/*!************************************************!*\\\n !*** ./Graphics/PostProcessor/ScreenShader.ts ***!\n \\************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ScreenShader: () => (/* binding */ ScreenShader)\n/* harmony export */ });\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Context_shader__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Context/shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _Context_vertex_buffer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Context/vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _Context_vertex_layout__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Context/vertex-layout */ \"./Graphics/Context/vertex-layout.ts\");\n\n\n\n\n/**\n * Helper that defines a whole screen renderer, just provide a fragment source!\n *\n * Currently supports 1 varying\n * - vec2 a_texcoord between 0-1 which corresponds to screen position\n */\nclass ScreenShader {\n constructor(gl, fragmentSource) {\n if (true) {\n if (fragmentSource.includes('v_texcoord')) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance().warn(`ScreenShader: \"v_texcoord\" is deprecated in postprocessing fragment shaders will be removed in v1.0,` +\n ` use \"v_uv\" instead. Source [${fragmentSource}]`);\n }\n }\n this._shader = new _Context_shader__WEBPACK_IMPORTED_MODULE_1__.Shader({\n gl,\n vertexSource: `#version 300 es\r\n in vec2 a_position;\r\n in vec2 a_uv;\r\n out vec2 v_texcoord;\r\n out vec2 v_uv;\r\n\r\n void main() {\r\n gl_Position = vec4(a_position, 0.0, 1.0);\r\n // Pass the texcoord to the fragment shader.\r\n v_texcoord = a_uv;\r\n v_uv = a_uv;\r\n }`,\n fragmentSource: fragmentSource\n });\n this._shader.compile();\n // Setup memory layout\n this._buffer = new _Context_vertex_buffer__WEBPACK_IMPORTED_MODULE_2__.VertexBuffer({\n gl,\n type: 'static',\n // clip space quad + uv since we don't need a camera\n data: new Float32Array([\n -1, -1, 0, 0, -1, 1, 0, 1, 1, -1, 1, 0,\n 1, -1, 1, 0, -1, 1, 0, 1, 1, 1, 1, 1\n ])\n });\n this._layout = new _Context_vertex_layout__WEBPACK_IMPORTED_MODULE_3__.VertexLayout({\n gl,\n shader: this._shader,\n vertexBuffer: this._buffer,\n attributes: [\n ['a_position', 2],\n ['a_uv', 2]\n ]\n });\n this._buffer.upload();\n }\n getShader() {\n return this._shader;\n }\n getLayout() {\n return this._layout;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Raster.ts\":\n/*!****************************!*\\\n !*** ./Graphics/Raster.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Raster: () => (/* binding */ Raster)\n/* harmony export */ });\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Util_Watch__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Util/Watch */ \"./Util/Watch.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Util */ \"./Util/Util.ts\");\n\n\n\n\n\n\n/**\n * A Raster is a Graphic that needs to be first painted to a HTMLCanvasElement before it can be drawn to the\n * {@apilink ExcaliburGraphicsContext}. This is useful for generating custom images using the 2D canvas api.\n *\n * Implementors must implement the {@apilink Raster.execute} method to rasterize their drawing.\n */\nclass Raster extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n constructor(options) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;\n super((0,_Util_Util__WEBPACK_IMPORTED_MODULE_1__.omit)({ ...options }, ['width', 'height'])); // rasters do some special sauce with width/height\n this.lineCap = 'butt';\n this.quality = 1;\n this._dirty = true;\n this._smoothing = false;\n this._color = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_2__.watch)(_Color__WEBPACK_IMPORTED_MODULE_3__.Color.Black, () => this.flagDirty());\n this._lineWidth = 1;\n this._lineDash = [];\n this._padding = 0;\n if (options) {\n this.quality = (_a = options.quality) !== null && _a !== void 0 ? _a : this.quality;\n this.color = (_b = options.color) !== null && _b !== void 0 ? _b : _Color__WEBPACK_IMPORTED_MODULE_3__.Color.Black;\n this.strokeColor = options === null || options === void 0 ? void 0 : options.strokeColor;\n this.smoothing = (_c = options.smoothing) !== null && _c !== void 0 ? _c : this.smoothing;\n this.lineWidth = (_d = options.lineWidth) !== null && _d !== void 0 ? _d : this.lineWidth;\n this.lineDash = (_e = options.lineDash) !== null && _e !== void 0 ? _e : this.lineDash;\n this.lineCap = (_f = options.lineCap) !== null && _f !== void 0 ? _f : this.lineCap;\n this.padding = (_g = options.padding) !== null && _g !== void 0 ? _g : this.padding;\n this.filtering = (_h = options.filtering) !== null && _h !== void 0 ? _h : this.filtering;\n }\n this._bitmap = document.createElement('canvas');\n // get the default canvas width/height as a fallback\n const bitmapWidth = (_j = options === null || options === void 0 ? void 0 : options.width) !== null && _j !== void 0 ? _j : this._bitmap.width;\n const bitmapHeight = (_k = options === null || options === void 0 ? void 0 : options.height) !== null && _k !== void 0 ? _k : this._bitmap.height;\n this.width = bitmapWidth;\n this.height = bitmapHeight;\n const maybeCtx = this._bitmap.getContext('2d');\n if (!maybeCtx) {\n /* istanbul ignore next */\n throw new Error('Browser does not support 2d canvas drawing, cannot create Raster graphic');\n }\n else {\n this._ctx = maybeCtx;\n }\n }\n cloneRasterOptions() {\n return {\n color: this.color ? this.color.clone() : undefined,\n strokeColor: this.strokeColor ? this.strokeColor.clone() : undefined,\n smoothing: this.smoothing,\n lineWidth: this.lineWidth,\n lineDash: this.lineDash,\n lineCap: this.lineCap,\n quality: this.quality,\n padding: this.padding\n };\n }\n /**\n * Gets whether the graphic is dirty, this means there are changes that haven't been re-rasterized\n */\n get dirty() {\n return this._dirty;\n }\n /**\n * Flags the graphic as dirty, meaning it must be re-rasterized before draw.\n * This should be called any time the graphics state changes such that it affects the outputted drawing\n */\n flagDirty() {\n this._dirty = true;\n }\n /**\n * Gets or sets the current width of the Raster graphic. Setting the width will cause the raster\n * to be flagged dirty causing a re-raster on the next draw.\n *\n * Any `padding`s or `quality` set will be factored into the width\n */\n get width() {\n return Math.abs(this._getTotalWidth() * this.scale.x);\n }\n set width(value) {\n value /= Math.abs(this.scale.x);\n this._bitmap.width = value;\n this._originalWidth = value;\n this.flagDirty();\n }\n /**\n * Gets or sets the current height of the Raster graphic. Setting the height will cause the raster\n * to be flagged dirty causing a re-raster on the next draw.\n *\n * Any `padding` or `quality` set will be factored into the height\n */\n get height() {\n return Math.abs(this._getTotalHeight() * this.scale.y);\n }\n set height(value) {\n value /= Math.abs(this.scale.y);\n this._bitmap.height = value;\n this._originalHeight = value;\n this.flagDirty();\n }\n _getTotalWidth() {\n var _a;\n return (((_a = this._originalWidth) !== null && _a !== void 0 ? _a : this._bitmap.width) + this.padding * 2) * 1;\n }\n _getTotalHeight() {\n var _a;\n return (((_a = this._originalHeight) !== null && _a !== void 0 ? _a : this._bitmap.height) + this.padding * 2) * 1;\n }\n /**\n * Returns the local bounds of the Raster including the padding\n */\n get localBounds() {\n return _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_4__.BoundingBox.fromDimension(this._getTotalWidth() * this.scale.x, this._getTotalHeight() * this.scale.y, _Math_vector__WEBPACK_IMPORTED_MODULE_5__.Vector.Zero);\n }\n /**\n * Gets or sets the smoothing (anti-aliasing of the graphic). Setting the height will cause the raster\n * to be flagged dirty causing a re-raster on the next draw.\n */\n get smoothing() {\n return this._smoothing;\n }\n set smoothing(value) {\n this._smoothing = value;\n this.flagDirty();\n }\n /**\n * Gets or sets the fillStyle of the Raster graphic. Setting the fillStyle will cause the raster to be\n * flagged dirty causing a re-raster on the next draw.\n */\n get color() {\n return this._color;\n }\n set color(value) {\n this.flagDirty();\n this._color = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_2__.watch)(value, () => this.flagDirty());\n }\n /**\n * Gets or sets the strokeStyle of the Raster graphic. Setting the strokeStyle will cause the raster to be\n * flagged dirty causing a re-raster on the next draw.\n */\n get strokeColor() {\n return this._strokeColor;\n }\n set strokeColor(value) {\n this.flagDirty();\n if (value) {\n this._strokeColor = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_2__.watch)(value, () => this.flagDirty());\n }\n }\n /**\n * Gets or sets the line width of the Raster graphic. Setting the lineWidth will cause the raster to be\n * flagged dirty causing a re-raster on the next draw.\n */\n get lineWidth() {\n return this._lineWidth;\n }\n set lineWidth(value) {\n this._lineWidth = value;\n this.flagDirty();\n }\n get lineDash() {\n return this._lineDash;\n }\n set lineDash(value) {\n this._lineDash = value;\n this.flagDirty();\n }\n get padding() {\n return this._padding;\n }\n set padding(value) {\n this._padding = value;\n this.flagDirty();\n }\n /**\n * Rasterize the graphic to a bitmap making it usable as in excalibur. Rasterize is called automatically if\n * the graphic is {@apilink Raster.dirty} on the next {@apilink Graphic.draw} call\n */\n rasterize() {\n this._dirty = false;\n this._ctx.clearRect(0, 0, this._getTotalWidth(), this._getTotalHeight());\n this._ctx.save();\n this._applyRasterProperties(this._ctx);\n this.execute(this._ctx);\n this._ctx.restore();\n }\n _applyRasterProperties(ctx) {\n var _a, _b, _c, _d;\n this._bitmap.width = this._getTotalWidth() * this.quality;\n this._bitmap.height = this._getTotalHeight() * this.quality;\n // Do a bad thing to pass the filtering as an attribute\n this._bitmap.setAttribute('filtering', this.filtering);\n this._bitmap.setAttribute('forceUpload', 'true');\n ctx.scale(this.quality, this.quality);\n ctx.translate(this.padding, this.padding);\n ctx.imageSmoothingEnabled = this.smoothing;\n ctx.lineWidth = this.lineWidth;\n ctx.setLineDash((_a = this.lineDash) !== null && _a !== void 0 ? _a : ctx.getLineDash());\n ctx.lineCap = this.lineCap;\n ctx.strokeStyle = (_c = (_b = this.strokeColor) === null || _b === void 0 ? void 0 : _b.toString()) !== null && _c !== void 0 ? _c : '';\n ctx.fillStyle = (_d = this.color) === null || _d === void 0 ? void 0 : _d.toString();\n }\n _drawImage(ex, x, y) {\n if (this._dirty) {\n this.rasterize();\n }\n ex.scale(1 / this.quality, 1 / this.quality);\n ex.drawImage(this._bitmap, x, y);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Rectangle.ts\":\n/*!*******************************!*\\\n !*** ./Graphics/Rectangle.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Rectangle: () => (/* binding */ Rectangle)\n/* harmony export */ });\n/* harmony import */ var _Raster__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Raster */ \"./Graphics/Raster.ts\");\n\n/**\n * A Rectangle {@apilink Graphic} for drawing rectangles to the {@apilink ExcaliburGraphicsContext}\n */\nclass Rectangle extends _Raster__WEBPACK_IMPORTED_MODULE_0__.Raster {\n constructor(options) {\n super(options);\n this.width = options.width;\n this.height = options.height;\n this.rasterize();\n }\n clone() {\n return new Rectangle({\n width: this.width,\n height: this.height,\n ...this.cloneGraphicOptions(),\n ...this.cloneRasterOptions()\n });\n }\n execute(ctx) {\n if (this.color) {\n ctx.fillRect(0, 0, this.width, this.height);\n }\n if (this.strokeColor) {\n ctx.strokeRect(0, 0, this.width, this.height);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Sprite.ts\":\n/*!****************************!*\\\n !*** ./Graphics/Sprite.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Sprite: () => (/* binding */ Sprite)\n/* harmony export */ });\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n\n\nclass Sprite extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n static from(image, options) {\n return new Sprite({\n image,\n ...options\n });\n }\n constructor(options) {\n var _a, _b;\n super(options);\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this._dirty = true;\n this.image = options.image;\n const { width, height } = options;\n this.sourceView = (_a = options.sourceView) !== null && _a !== void 0 ? _a : { x: 0, y: 0, width: width !== null && width !== void 0 ? width : 0, height: height !== null && height !== void 0 ? height : 0 };\n this.destSize = (_b = options.destSize) !== null && _b !== void 0 ? _b : { width: width !== null && width !== void 0 ? width : 0, height: height !== null && height !== void 0 ? height : 0 };\n this._updateSpriteDimensions();\n // Fire when loaded\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.image.ready.then(() => {\n this._updateSpriteDimensions();\n });\n }\n get width() {\n return Math.abs(this.destSize.width * this.scale.x);\n }\n get height() {\n return Math.abs(this.destSize.height * this.scale.y);\n }\n set width(newWidth) {\n newWidth /= Math.abs(this.scale.x);\n this.destSize.width = newWidth;\n super.width = Math.ceil(this.destSize.width);\n }\n set height(newHeight) {\n newHeight /= Math.abs(this.scale.y);\n this.destSize.height = newHeight;\n super.height = Math.ceil(this.destSize.height);\n }\n _updateSpriteDimensions() {\n var _a, _b, _c, _d, _e, _f;\n const { width: nativeWidth, height: nativeHeight } = this.image;\n // This code uses || to avoid 0's\n // If the source is not specified, use the native dimension\n this.sourceView.width = ((_a = this.sourceView) === null || _a === void 0 ? void 0 : _a.width) || nativeWidth;\n this.sourceView.height = ((_b = this.sourceView) === null || _b === void 0 ? void 0 : _b.height) || nativeHeight;\n // If the destination is not specified, use the source if specified, then native\n this.destSize.width = ((_c = this.destSize) === null || _c === void 0 ? void 0 : _c.width) || ((_d = this.sourceView) === null || _d === void 0 ? void 0 : _d.width) || nativeWidth;\n this.destSize.height = ((_e = this.destSize) === null || _e === void 0 ? void 0 : _e.height) || ((_f = this.sourceView) === null || _f === void 0 ? void 0 : _f.height) || nativeHeight;\n this.width = Math.ceil(this.destSize.width) * this.scale.x;\n this.height = Math.ceil(this.destSize.height) * this.scale.y;\n }\n _preDraw(ex, x, y) {\n if (this.image.isLoaded() && this._dirty) {\n this._dirty = false;\n this._updateSpriteDimensions();\n }\n super._preDraw(ex, x, y);\n }\n _drawImage(ex, x, y) {\n if (this.image.isLoaded()) {\n ex.drawImage(this.image.image, this.sourceView.x, this.sourceView.y, this.sourceView.width, this.sourceView.height, x, y, this.destSize.width, this.destSize.height);\n }\n else {\n this._logger.warnOnce(`ImageSource ${this.image.path}` +\n ` is not yet loaded and won't be drawn. Please call .load() or include in a Loader.\\n\\n` +\n `Read https://excaliburjs.com/docs/imagesource for more information.`);\n }\n }\n clone() {\n return new Sprite({\n image: this.image,\n sourceView: { ...this.sourceView },\n destSize: { ...this.destSize },\n ...this.cloneGraphicOptions()\n });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/SpriteFont.ts\":\n/*!********************************!*\\\n !*** ./Graphics/SpriteFont.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SpriteFont: () => (/* binding */ SpriteFont)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n\n\n\n\nclass SpriteFont extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n constructor(options) {\n super(options);\n this._text = '';\n this.alphabet = '';\n this.shadow = undefined;\n this.caseInsensitive = false;\n this.spacing = 0;\n this.lineHeight = undefined;\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n const { alphabet, spriteSheet, caseInsensitive, spacing, shadow, lineHeight } = options;\n this.alphabet = alphabet;\n this.spriteSheet = spriteSheet;\n this.caseInsensitive = caseInsensitive !== null && caseInsensitive !== void 0 ? caseInsensitive : this.caseInsensitive;\n this.spacing = spacing !== null && spacing !== void 0 ? spacing : this.spacing;\n this.shadow = shadow !== null && shadow !== void 0 ? shadow : this.shadow;\n this.lineHeight = lineHeight !== null && lineHeight !== void 0 ? lineHeight : this.lineHeight;\n }\n _getCharacterSprites(text) {\n const results = [];\n // handle case insensitive\n const textToRender = this.caseInsensitive ? text.toLocaleLowerCase() : text;\n const alphabet = this.caseInsensitive ? this.alphabet.toLocaleLowerCase() : this.alphabet;\n // for each letter in text\n for (let letterIndex = 0; letterIndex < textToRender.length; letterIndex++) {\n // find the sprite index in alphabet , if there is an error pick the first\n const letter = textToRender[letterIndex];\n let spriteIndex = alphabet.indexOf(letter);\n if (spriteIndex === -1) {\n spriteIndex = 0;\n this._logger.warnOnce(`SpriteFont - Cannot find letter '${letter}' in configured alphabet '${alphabet}'.`);\n this._logger.warnOnce('There maybe be more issues in the SpriteFont configuration. No additional warnings will be logged.');\n }\n const letterSprite = this.spriteSheet.sprites[spriteIndex];\n if (letterSprite) {\n results.push(letterSprite);\n }\n else {\n this._logger.warnOnce(`SpriteFont - Cannot find sprite for '${letter}' at index '${spriteIndex}' in configured SpriteSheet`);\n this._logger.warnOnce('There maybe be more issues in the SpriteFont configuration. No additional warnings will be logged.');\n }\n }\n return results;\n }\n measureText(text, maxWidth) {\n const lines = this._getLinesFromText(text, maxWidth);\n const maxWidthLine = lines.reduce((a, b) => {\n return a.length > b.length ? a : b;\n });\n const sprites = this._getCharacterSprites(maxWidthLine);\n let width = 0;\n let height = 0;\n for (const sprite of sprites) {\n width += sprite.width + this.spacing;\n height = Math.max(height, sprite.height);\n }\n return _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromDimension(width * this.scale.x, height * lines.length * this.scale.y, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero);\n }\n _drawImage(ex, x, y, maxWidth) {\n var _a;\n let xCursor = 0;\n let yCursor = 0;\n let height = 0;\n const lines = this._getLinesFromText(this._text, maxWidth);\n for (const line of lines) {\n for (const sprite of this._getCharacterSprites(line)) {\n // draw it in the right spot and increase the cursor by sprite width\n sprite.draw(ex, x + xCursor, y + yCursor);\n xCursor += sprite.width + this.spacing;\n height = Math.max(height, sprite.height);\n }\n xCursor = 0;\n yCursor += (_a = this.lineHeight) !== null && _a !== void 0 ? _a : height;\n }\n }\n render(ex, text, _color, x, y, maxWidth) {\n // SpriteFont doesn't support _color, yet...\n this._text = text;\n const bounds = this.measureText(text, maxWidth);\n this.width = bounds.width;\n this.height = bounds.height;\n if (this.shadow) {\n ex.save();\n ex.translate(this.shadow.offset.x, this.shadow.offset.y);\n this._preDraw(ex, x, y);\n this._drawImage(ex, 0, 0, maxWidth);\n this._postDraw(ex);\n ex.restore();\n }\n this._preDraw(ex, x, y);\n this._drawImage(ex, 0, 0, maxWidth);\n this._postDraw(ex);\n }\n clone() {\n return new SpriteFont({\n alphabet: this.alphabet,\n spriteSheet: this.spriteSheet,\n spacing: this.spacing\n });\n }\n _getLinesFromText(text, maxWidth) {\n var _a;\n if (this._cachedText === text && this._cachedRenderWidth === maxWidth && ((_a = this._cachedLines) === null || _a === void 0 ? void 0 : _a.length)) {\n return this._cachedLines;\n }\n const lines = text.split('\\n');\n if (maxWidth == null) {\n return lines;\n }\n // If the current line goes past the maxWidth, append a new line without modifying the underlying text.\n for (let i = 0; i < lines.length; i++) {\n let line = lines[i];\n let newLine = '';\n // Note: we subtract the spacing to counter the initial padding on the left side.\n if (this.measureText(line).width > maxWidth) {\n while (this.measureText(line).width > maxWidth) {\n newLine = line[line.length - 1] + newLine;\n line = line.slice(0, -1); // Remove last character from line\n }\n // Update the array with our new values\n lines[i] = line;\n lines[i + 1] = newLine;\n }\n }\n this._cachedText = text;\n this._cachedLines = lines;\n this._cachedRenderWidth = maxWidth;\n return lines;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/SpriteSheet.ts\":\n/*!*********************************!*\\\n !*** ./Graphics/SpriteSheet.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SpriteSheet: () => (/* binding */ SpriteSheet)\n/* harmony export */ });\n/* harmony import */ var _Sprite__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Sprite */ \"./Graphics/Sprite.ts\");\n/* harmony import */ var _TiledSprite__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./TiledSprite */ \"./Graphics/TiledSprite.ts\");\n\n\n/**\n * Represents a collection of sprites from a source image with some organization in a grid\n */\nclass SpriteSheet {\n /**\n * Build a new sprite sheet from a list of sprites\n *\n * Use {@apilink SpriteSheet.fromImageSource} to create a SpriteSheet from an {@apilink ImageSource} organized in a grid\n * @param options\n */\n constructor(options) {\n this.sprites = [];\n const { sprites, rows, columns } = options;\n this.sprites = sprites;\n this.rows = rows !== null && rows !== void 0 ? rows : 1;\n this.columns = columns !== null && columns !== void 0 ? columns : this.sprites.length;\n }\n /**\n * Find a sprite by their x/y integer coordinates in the SpriteSheet, for example `getSprite(0, 0)` is the {@apilink Sprite} in the top-left\n * and `getSprite(1, 0)` is the sprite one to the right.\n * @param x\n * @param y\n */\n getSprite(x, y, options) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j;\n if (x >= this.columns || x < 0) {\n throw Error(`No sprite exists in the SpriteSheet at (${x}, ${y}), x: ${x} should be between 0 and ${this.columns - 1} columns`);\n }\n if (y >= this.rows || y < 0) {\n throw Error(`No sprite exists in the SpriteSheet at (${x}, ${y}), y: ${y} should be between 0 and ${this.rows - 1} rows`);\n }\n const spriteIndex = x + y * this.columns;\n const sprite = this.sprites[spriteIndex];\n if (sprite) {\n if (options) {\n const spriteWithOptions = sprite.clone();\n spriteWithOptions.flipHorizontal = (_a = options.flipHorizontal) !== null && _a !== void 0 ? _a : spriteWithOptions.flipHorizontal;\n spriteWithOptions.flipVertical = (_b = options.flipVertical) !== null && _b !== void 0 ? _b : spriteWithOptions.flipVertical;\n spriteWithOptions.width = (_c = options.width) !== null && _c !== void 0 ? _c : spriteWithOptions.width;\n spriteWithOptions.height = (_d = options.height) !== null && _d !== void 0 ? _d : spriteWithOptions.height;\n spriteWithOptions.rotation = (_e = options.rotation) !== null && _e !== void 0 ? _e : spriteWithOptions.rotation;\n spriteWithOptions.scale = (_f = options.scale) !== null && _f !== void 0 ? _f : spriteWithOptions.scale;\n spriteWithOptions.opacity = (_g = options.opacity) !== null && _g !== void 0 ? _g : spriteWithOptions.opacity;\n spriteWithOptions.tint = (_h = options.tint) !== null && _h !== void 0 ? _h : spriteWithOptions.tint;\n spriteWithOptions.origin = (_j = options.origin) !== null && _j !== void 0 ? _j : spriteWithOptions.origin;\n return spriteWithOptions;\n }\n return sprite;\n }\n throw Error(`Invalid sprite coordinates (${x}, ${y})`);\n }\n /**\n * Find a sprite by their x/y integer coordinates in the SpriteSheet and configures tiling to repeat by default,\n * for example `getTiledSprite(0, 0)` is the {@apilink TiledSprite} in the top-left\n * and `getTiledSprite(1, 0)` is the sprite one to the right.\n *\n * Example:\n *\n * ```typescript\n * spriteSheet.getTiledSprite(1, 0, {\n * width: game.screen.width,\n * height: 200,\n * wrapping: {\n * x: ex.ImageWrapping.Repeat,\n * y: ex.ImageWrapping.Clamp\n * }\n * });\n * ```\n * @param x\n * @param y\n * @param options\n */\n getTiledSprite(x, y, options) {\n if (x >= this.columns || x < 0) {\n throw Error(`No sprite exists in the SpriteSheet at (${x}, ${y}), x: ${x} should be between 0 and ${this.columns - 1} columns`);\n }\n if (y >= this.rows || y < 0) {\n throw Error(`No sprite exists in the SpriteSheet at (${x}, ${y}), y: ${y} should be between 0 and ${this.rows - 1} rows`);\n }\n const spriteIndex = x + y * this.columns;\n const sprite = this.sprites[spriteIndex];\n if (sprite) {\n return _TiledSprite__WEBPACK_IMPORTED_MODULE_0__.TiledSprite.fromSprite(sprite, options);\n }\n throw Error(`Invalid sprite coordinates (${x}, ${y})`);\n }\n /**\n * Create a sprite sheet from a sparse set of {@apilink SourceView} rectangles\n * @param options\n */\n static fromImageSourceWithSourceViews(options) {\n const sprites = options.sourceViews.map((sourceView) => {\n return new _Sprite__WEBPACK_IMPORTED_MODULE_1__.Sprite({\n image: options.image,\n sourceView\n });\n });\n return new SpriteSheet({ sprites });\n }\n /**\n * Create a SpriteSheet from an {@apilink ImageSource} organized in a grid\n *\n * Example:\n * ```\n * const spriteSheet = SpriteSheet.fromImageSource({\n * image: imageSource,\n * grid: {\n * rows: 5,\n * columns: 2,\n * spriteWidth: 32, // pixels\n * spriteHeight: 32 // pixels\n * },\n * // Optionally specify spacing\n * spacing: {\n * // pixels from the top left to start the sprite parsing\n * originOffset: {\n * x: 5,\n * y: 5\n * },\n * // pixels between each sprite while parsing\n * margin: {\n * x: 1,\n * y: 1\n * }\n * }\n * })\n * ```\n * @param options\n */\n static fromImageSource(options) {\n var _a;\n const sprites = [];\n options.spacing = (_a = options.spacing) !== null && _a !== void 0 ? _a : {};\n const { image, grid: { rows, columns: cols, spriteWidth, spriteHeight }, spacing: { originOffset, margin } } = options;\n const offsetDefaults = { x: 0, y: 0, ...originOffset };\n const marginDefaults = { x: 0, y: 0, ...margin };\n for (let x = 0; x < cols; x++) {\n for (let y = 0; y < rows; y++) {\n sprites[x + y * cols] = new _Sprite__WEBPACK_IMPORTED_MODULE_1__.Sprite({\n image: image,\n sourceView: {\n x: x * spriteWidth + marginDefaults.x * x + offsetDefaults.x,\n y: y * spriteHeight + marginDefaults.y * y + offsetDefaults.y,\n width: spriteWidth,\n height: spriteHeight\n },\n destSize: { height: spriteHeight, width: spriteWidth }\n });\n }\n }\n return new SpriteSheet({\n sprites: sprites,\n rows: rows,\n columns: cols\n });\n }\n clone() {\n return new SpriteSheet({\n sprites: this.sprites.map((sprite) => sprite.clone()),\n rows: this.rows,\n columns: this.columns\n });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Text.ts\":\n/*!**************************!*\\\n !*** ./Graphics/Text.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Text: () => (/* binding */ Text)\n/* harmony export */ });\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Font__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Font */ \"./Graphics/Font.ts\");\n\n\n\n/**\n * Represent Text graphics in excalibur\n *\n * Useful for in game labels, ui, or overlays\n */\nclass Text extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n constructor(options) {\n var _a, _b;\n super(options);\n this._text = '';\n this._textWidth = 0;\n this._textHeight = 0;\n // This order is important font, color, then text\n this.font = (_a = options.font) !== null && _a !== void 0 ? _a : new _Font__WEBPACK_IMPORTED_MODULE_1__.Font();\n this.color = (_b = options.color) !== null && _b !== void 0 ? _b : this.color;\n this.text = options.text;\n this.maxWidth = options.maxWidth;\n }\n clone() {\n var _a, _b;\n return new Text({\n text: this.text.slice(),\n color: (_b = (_a = this.color) === null || _a === void 0 ? void 0 : _a.clone()) !== null && _b !== void 0 ? _b : _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Black,\n font: this.font.clone(),\n maxWidth: this.maxWidth\n });\n }\n get text() {\n return this._text;\n }\n set text(value) {\n this._text = value;\n this._calculateDimension();\n }\n get font() {\n return this._font;\n }\n set font(font) {\n this._font = font;\n }\n get width() {\n if (this._textWidth === 0) {\n this._calculateDimension();\n }\n return this._textWidth * this.scale.x;\n }\n get height() {\n if (this._textHeight === 0) {\n this._calculateDimension();\n }\n return this._textHeight * this.scale.y;\n }\n _calculateDimension() {\n const { width, height } = this.font.measureText(this._text, this.maxWidth);\n this._textWidth = width;\n this._textHeight = height;\n }\n get localBounds() {\n return this.font.measureText(this._text, this.maxWidth).scale(this.scale);\n }\n _rotate(_ex) {\n // None this is delegated to font\n // This override erases the default behavior\n }\n _flip(_ex) {\n // None this is delegated to font\n // This override erases the default behavior\n }\n _preDraw(ex, x, y) {\n if (this.isStale() || this.font.isStale()) {\n this.font.flipHorizontal = this.flipHorizontal;\n this.font.flipVertical = this.flipVertical;\n this.font.rotation = this.rotation;\n this.font.origin = this.origin;\n this.font.opacity = this.opacity;\n }\n this.font.tint = this.tint;\n super._preDraw(ex, x, y);\n }\n _drawImage(ex, x, y) {\n var _a;\n let color = _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Black;\n if (this.font instanceof _Font__WEBPACK_IMPORTED_MODULE_1__.Font) {\n color = (_a = this.color) !== null && _a !== void 0 ? _a : this.font.color;\n }\n const { width, height } = this.font.measureText(this._text, this.maxWidth);\n this._textWidth = width;\n this._textHeight = height;\n this.font.render(ex, this._text, color, x, y, this.maxWidth);\n if (this.font.showDebug) {\n ex.debug.drawRect(x - width, y - height, width * 2, height * 2);\n if (this.maxWidth != null) {\n ex.debug.drawRect(x, y, this.maxWidth, this.height, {\n color: _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Yellow\n });\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/TiledAnimation.ts\":\n/*!************************************!*\\\n !*** ./Graphics/TiledAnimation.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TiledAnimation: () => (/* binding */ TiledAnimation)\n/* harmony export */ });\n/* harmony import */ var _Sprite__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Sprite */ \"./Graphics/Sprite.ts\");\n/* harmony import */ var _Animation__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Animation */ \"./Graphics/Animation.ts\");\n/* harmony import */ var _TiledSprite__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./TiledSprite */ \"./Graphics/TiledSprite.ts\");\n/* harmony import */ var _Util_Watch__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Util/Watch */ \"./Util/Watch.ts\");\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Future */ \"./Util/Future.ts\");\n\n\n\n\n\nclass TiledAnimation extends _Animation__WEBPACK_IMPORTED_MODULE_0__.Animation {\n constructor(options) {\n super({\n ...options,\n frames: options.animation.frames.slice(),\n strategy: options.animation.strategy,\n frameDuration: options.animation.frameDuration,\n speed: options.animation.speed,\n reverse: options.animation.isReversed\n });\n this._ready = new _Util_Future__WEBPACK_IMPORTED_MODULE_1__.Future();\n this.ready = this._ready.promise;\n this._tiledWidth = 0;\n this._tiledHeight = 0;\n this._sourceView = {};\n this._sourceView = { ...options.sourceView };\n this._tiledWidth = options.width;\n this._tiledHeight = options.height;\n const promises = [];\n for (let i = 0; i < this.frames.length; i++) {\n const graphic = this.frames[i].graphic;\n if (graphic && graphic instanceof _Sprite__WEBPACK_IMPORTED_MODULE_2__.Sprite) {\n const tiledSprite = new _TiledSprite__WEBPACK_IMPORTED_MODULE_3__.TiledSprite({\n image: graphic.image,\n width: options.width,\n height: options.height,\n sourceView: { ...graphic.sourceView },\n wrapping: options.wrapping,\n filtering: options.filtering\n });\n this.frames[i].graphic = tiledSprite;\n // There is a new calc'd sourceView when ready\n tiledSprite.ready.then(() => {\n tiledSprite.sourceView = { ...tiledSprite.sourceView, ...this._sourceView };\n });\n promises.push(tiledSprite.ready);\n }\n }\n Promise.all(promises).then(() => this._ready.resolve());\n }\n static fromAnimation(animation, options) {\n return new TiledAnimation({\n width: animation.width,\n height: animation.height,\n ...options,\n animation\n });\n }\n _updateSourceView() {\n for (let i = 0; i < this.frames.length; i++) {\n const graphic = this.frames[i].graphic;\n if (graphic && graphic instanceof _Sprite__WEBPACK_IMPORTED_MODULE_2__.Sprite) {\n graphic.sourceView = { ...graphic.sourceView, ...this._sourceView };\n }\n }\n }\n get sourceView() {\n return (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_4__.watch)(this._sourceView, () => this._updateSourceView());\n }\n set sourceView(sourceView) {\n this._sourceView = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_4__.watch)(sourceView, () => this._updateSourceView());\n this._updateSourceView();\n }\n _updateWidthHeight() {\n for (let i = 0; i < this.frames.length; i++) {\n const graphic = this.frames[i].graphic;\n if (graphic && graphic instanceof _Sprite__WEBPACK_IMPORTED_MODULE_2__.Sprite) {\n graphic.sourceView.height = this._tiledHeight || graphic.height;\n graphic.destSize.height = this._tiledHeight || graphic.height;\n graphic.sourceView.width = this._tiledWidth || graphic.width;\n graphic.destSize.width = this._tiledWidth || graphic.width;\n }\n }\n }\n get width() {\n return this._tiledWidth;\n }\n get height() {\n return this._tiledHeight;\n }\n set width(width) {\n this._tiledWidth = width;\n this._updateWidthHeight();\n }\n set height(height) {\n this._tiledHeight = height;\n this._updateWidthHeight();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/TiledSprite.ts\":\n/*!*********************************!*\\\n !*** ./Graphics/TiledSprite.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TiledSprite: () => (/* binding */ TiledSprite)\n/* harmony export */ });\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Future */ \"./Util/Future.ts\");\n/* harmony import */ var _ImageSource__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ImageSource */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Sprite__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Sprite */ \"./Graphics/Sprite.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Wrapping */ \"./Graphics/Wrapping.ts\");\n\n\n\n\nclass TiledSprite extends _Sprite__WEBPACK_IMPORTED_MODULE_0__.Sprite {\n constructor(options) {\n super({\n image: options.image,\n sourceView: options.sourceView,\n destSize: { width: options.width, height: options.height },\n flipHorizontal: options.flipHorizontal,\n flipVertical: options.flipVertical,\n rotation: options.rotation,\n scale: options.scale,\n opacity: options.opacity,\n tint: options.tint,\n origin: options.origin\n });\n this._ready = new _Util_Future__WEBPACK_IMPORTED_MODULE_1__.Future();\n this.ready = this._ready.promise;\n this._options = options;\n if (this.image.isLoaded()) {\n this._applyTiling();\n }\n else {\n this.image.ready.then(() => this._applyTiling());\n }\n }\n static fromSprite(sprite, options) {\n return new TiledSprite({\n sourceView: { ...sprite.sourceView },\n width: sprite.width,\n height: sprite.height,\n ...options,\n image: sprite.image\n });\n }\n _applyTiling() {\n const { width, height, filtering, wrapping } = { ...this._options };\n const spriteCanvas = document.createElement('canvas');\n spriteCanvas.width = this.sourceView.width;\n spriteCanvas.height = this.sourceView.height;\n const spriteCtx = spriteCanvas.getContext('2d');\n // prettier-ignore\n spriteCtx.drawImage(this.image.image, this.sourceView.x, this.sourceView.y, this.sourceView.width, this.sourceView.height, 0, 0, this.sourceView.width, this.sourceView.height);\n // prettier-ignore\n const tiledImageSource = _ImageSource__WEBPACK_IMPORTED_MODULE_2__.ImageSource.fromHtmlCanvasElement(spriteCanvas, {\n wrapping: wrapping !== null && wrapping !== void 0 ? wrapping : _Wrapping__WEBPACK_IMPORTED_MODULE_3__.ImageWrapping.Repeat,\n filtering\n });\n if (width) {\n this.destSize.width = width;\n this.sourceView.width = width;\n }\n if (height) {\n this.destSize.height = height;\n this.sourceView.height = height;\n }\n this.sourceView.x = 0;\n this.sourceView.y = 0;\n this.image = tiledImageSource;\n // this._ready.resolve();\n this.image.ready.then(() => this._ready.resolve());\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/TransformInterpolation.ts\":\n/*!********************************************!*\\\n !*** ./Graphics/TransformInterpolation.ts ***!\n \\********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ blendGlobalTransform: () => (/* binding */ blendGlobalTransform),\n/* harmony export */ blendTransform: () => (/* binding */ blendTransform)\n/* harmony export */ });\n/* harmony import */ var _Math_transform__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Math/transform */ \"./Math/transform.ts\");\n\n/**\n * Blend 2 transforms for interpolation, will interpolate from the context of newTx's parent if it exists\n */\nfunction blendTransform(oldTx, newTx, blend, target) {\n if (oldTx.parent !== newTx.parent) {\n // Caller expects a local transform\n // Adjust old tx to be local to the new parent whatever that is\n const oldTxWithNewParent = oldTx.clone();\n const oldGlobalPos = oldTx.globalPos.clone();\n const oldGlobalScale = oldTx.globalScale.clone();\n const oldGlobalRotation = oldTx.globalRotation;\n oldTxWithNewParent.parent = newTx.parent;\n oldTxWithNewParent.globalPos = oldGlobalPos;\n oldTxWithNewParent.globalScale = oldGlobalScale;\n oldTxWithNewParent.globalRotation = oldGlobalRotation;\n oldTx = oldTxWithNewParent;\n }\n let interpolatedPos = newTx.pos;\n let interpolatedScale = newTx.scale;\n let interpolatedRotation = newTx.rotation;\n interpolatedPos = newTx.pos.scale(blend).add(oldTx.pos.scale(1.0 - blend));\n interpolatedScale = newTx.scale.scale(blend).add(oldTx.scale.scale(1.0 - blend));\n // Rotational lerp https://stackoverflow.com/a/30129248\n const cosine = (1.0 - blend) * Math.cos(oldTx.rotation) + blend * Math.cos(newTx.rotation);\n const sine = (1.0 - blend) * Math.sin(oldTx.rotation) + blend * Math.sin(newTx.rotation);\n interpolatedRotation = Math.atan2(sine, cosine);\n const tx = target !== null && target !== void 0 ? target : new _Math_transform__WEBPACK_IMPORTED_MODULE_0__.Transform();\n tx.setTransform(interpolatedPos, interpolatedRotation, interpolatedScale);\n return tx;\n}\n/**\n *\n */\nfunction blendGlobalTransform(oldTx, newTx, blend, target) {\n let interpolatedPos = newTx.globalPos;\n let interpolatedScale = newTx.globalScale;\n let interpolatedRotation = newTx.globalRotation;\n interpolatedPos = newTx.globalPos.scale(blend).add(oldTx.globalPos.scale(1.0 - blend));\n interpolatedScale = newTx.globalScale.scale(blend).add(oldTx.globalScale.scale(1.0 - blend));\n // Rotational lerp https://stackoverflow.com/a/30129248\n const cosine = (1.0 - blend) * Math.cos(oldTx.globalRotation) + blend * Math.cos(newTx.globalRotation);\n const sine = (1.0 - blend) * Math.sin(oldTx.globalRotation) + blend * Math.sin(newTx.globalRotation);\n interpolatedRotation = Math.atan2(sine, cosine);\n const tx = target !== null && target !== void 0 ? target : new _Math_transform__WEBPACK_IMPORTED_MODULE_0__.Transform();\n tx.setTransform(interpolatedPos, interpolatedRotation, interpolatedScale);\n return tx;\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Wrapping.ts\":\n/*!******************************!*\\\n !*** ./Graphics/Wrapping.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ImageWrapping: () => (/* binding */ ImageWrapping),\n/* harmony export */ parseImageWrapping: () => (/* binding */ parseImageWrapping)\n/* harmony export */ });\n/**\n * Describes the different image wrapping modes\n */\nvar ImageWrapping;\n(function (ImageWrapping) {\n ImageWrapping[\"Clamp\"] = \"Clamp\";\n ImageWrapping[\"Repeat\"] = \"Repeat\";\n ImageWrapping[\"Mirror\"] = \"Mirror\";\n})(ImageWrapping || (ImageWrapping = {}));\n/**\n *\n */\nfunction parseImageWrapping(val) {\n switch (val) {\n case ImageWrapping.Clamp:\n return ImageWrapping.Clamp;\n case ImageWrapping.Repeat:\n return ImageWrapping.Repeat;\n case ImageWrapping.Mirror:\n return ImageWrapping.Mirror;\n default:\n return ImageWrapping.Clamp;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/index.ts\":\n/*!***************************!*\\\n !*** ./Graphics/index.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Animation: () => (/* reexport safe */ _Animation__WEBPACK_IMPORTED_MODULE_5__.Animation),\n/* harmony export */ AnimationDirection: () => (/* reexport safe */ _Animation__WEBPACK_IMPORTED_MODULE_5__.AnimationDirection),\n/* harmony export */ AnimationEvents: () => (/* reexport safe */ _Animation__WEBPACK_IMPORTED_MODULE_5__.AnimationEvents),\n/* harmony export */ AnimationStrategy: () => (/* reexport safe */ _Animation__WEBPACK_IMPORTED_MODULE_5__.AnimationStrategy),\n/* harmony export */ BaseAlign: () => (/* reexport safe */ _FontCommon__WEBPACK_IMPORTED_MODULE_17__.BaseAlign),\n/* harmony export */ Canvas: () => (/* reexport safe */ _Canvas__WEBPACK_IMPORTED_MODULE_21__.Canvas),\n/* harmony export */ Circle: () => (/* reexport safe */ _Circle__WEBPACK_IMPORTED_MODULE_13__.Circle),\n/* harmony export */ ColorBlindnessMode: () => (/* reexport safe */ _PostProcessor_ColorBlindnessMode__WEBPACK_IMPORTED_MODULE_31__.ColorBlindnessMode),\n/* harmony export */ ColorBlindnessPostProcessor: () => (/* reexport safe */ _PostProcessor_ColorBlindnessPostProcessor__WEBPACK_IMPORTED_MODULE_32__.ColorBlindnessPostProcessor),\n/* harmony export */ Debug: () => (/* reexport safe */ _Debug__WEBPACK_IMPORTED_MODULE_41__.Debug),\n/* harmony export */ DebugGraphicsComponent: () => (/* reexport safe */ _DebugGraphicsComponent__WEBPACK_IMPORTED_MODULE_8__.DebugGraphicsComponent),\n/* harmony export */ DebugText: () => (/* reexport safe */ _Context_debug_text__WEBPACK_IMPORTED_MODULE_29__.DebugText),\n/* harmony export */ DefaultAntialiasOptions: () => (/* reexport safe */ _Context_ExcaliburGraphicsContext__WEBPACK_IMPORTED_MODULE_25__.DefaultAntialiasOptions),\n/* harmony export */ DefaultPixelArtOptions: () => (/* reexport safe */ _Context_ExcaliburGraphicsContext__WEBPACK_IMPORTED_MODULE_25__.DefaultPixelArtOptions),\n/* harmony export */ Direction: () => (/* reexport safe */ _FontCommon__WEBPACK_IMPORTED_MODULE_17__.Direction),\n/* harmony export */ ExcaliburGraphicsContext2DCanvas: () => (/* reexport safe */ _Context_ExcaliburGraphicsContext2DCanvas__WEBPACK_IMPORTED_MODULE_26__.ExcaliburGraphicsContext2DCanvas),\n/* harmony export */ ExcaliburGraphicsContextWebGL: () => (/* reexport safe */ _Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_27__.ExcaliburGraphicsContextWebGL),\n/* harmony export */ Font: () => (/* reexport safe */ _Font__WEBPACK_IMPORTED_MODULE_18__.Font),\n/* harmony export */ FontCache: () => (/* reexport safe */ _FontCache__WEBPACK_IMPORTED_MODULE_19__.FontCache),\n/* harmony export */ FontStyle: () => (/* reexport safe */ _FontCommon__WEBPACK_IMPORTED_MODULE_17__.FontStyle),\n/* harmony export */ FontUnit: () => (/* reexport safe */ _FontCommon__WEBPACK_IMPORTED_MODULE_17__.FontUnit),\n/* harmony export */ Graphic: () => (/* reexport safe */ _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic),\n/* harmony export */ GraphicsComponent: () => (/* reexport safe */ _GraphicsComponent__WEBPACK_IMPORTED_MODULE_7__.GraphicsComponent),\n/* harmony export */ GraphicsGroup: () => (/* reexport safe */ _GraphicsGroup__WEBPACK_IMPORTED_MODULE_3__.GraphicsGroup),\n/* harmony export */ GraphicsSystem: () => (/* reexport safe */ _GraphicsSystem__WEBPACK_IMPORTED_MODULE_9__.GraphicsSystem),\n/* harmony export */ ImageFiltering: () => (/* reexport safe */ _Filtering__WEBPACK_IMPORTED_MODULE_34__.ImageFiltering),\n/* harmony export */ ImageSource: () => (/* reexport safe */ _ImageSource__WEBPACK_IMPORTED_MODULE_4__.ImageSource),\n/* harmony export */ ImageSourceAttributeConstants: () => (/* reexport safe */ _ImageSource__WEBPACK_IMPORTED_MODULE_4__.ImageSourceAttributeConstants),\n/* harmony export */ ImageWrapping: () => (/* reexport safe */ _Wrapping__WEBPACK_IMPORTED_MODULE_35__.ImageWrapping),\n/* harmony export */ Line: () => (/* reexport safe */ _Line__WEBPACK_IMPORTED_MODULE_6__.Line),\n/* harmony export */ Material: () => (/* reexport safe */ _Context_material__WEBPACK_IMPORTED_MODULE_40__.Material),\n/* harmony export */ NineSlice: () => (/* reexport safe */ _NineSlice__WEBPACK_IMPORTED_MODULE_22__.NineSlice),\n/* harmony export */ NineSliceStretch: () => (/* reexport safe */ _NineSlice__WEBPACK_IMPORTED_MODULE_22__.NineSliceStretch),\n/* harmony export */ OffscreenSystem: () => (/* reexport safe */ _OffscreenSystem__WEBPACK_IMPORTED_MODULE_10__.OffscreenSystem),\n/* harmony export */ ParallaxComponent: () => (/* reexport safe */ _ParallaxComponent__WEBPACK_IMPORTED_MODULE_11__.ParallaxComponent),\n/* harmony export */ ParticleRenderer: () => (/* reexport safe */ _Context_particle_renderer_particle_renderer__WEBPACK_IMPORTED_MODULE_28__.ParticleRenderer),\n/* harmony export */ Polygon: () => (/* reexport safe */ _Polygon__WEBPACK_IMPORTED_MODULE_15__.Polygon),\n/* harmony export */ QuadIndexBuffer: () => (/* reexport safe */ _Context_quad_index_buffer__WEBPACK_IMPORTED_MODULE_39__.QuadIndexBuffer),\n/* harmony export */ Raster: () => (/* reexport safe */ _Raster__WEBPACK_IMPORTED_MODULE_12__.Raster),\n/* harmony export */ Rectangle: () => (/* reexport safe */ _Rectangle__WEBPACK_IMPORTED_MODULE_14__.Rectangle),\n/* harmony export */ ScreenShader: () => (/* reexport safe */ _PostProcessor_ScreenShader__WEBPACK_IMPORTED_MODULE_30__.ScreenShader),\n/* harmony export */ Shader: () => (/* reexport safe */ _Context_shader__WEBPACK_IMPORTED_MODULE_36__.Shader),\n/* harmony export */ Sprite: () => (/* reexport safe */ _Sprite__WEBPACK_IMPORTED_MODULE_1__.Sprite),\n/* harmony export */ SpriteFont: () => (/* reexport safe */ _SpriteFont__WEBPACK_IMPORTED_MODULE_20__.SpriteFont),\n/* harmony export */ SpriteSheet: () => (/* reexport safe */ _SpriteSheet__WEBPACK_IMPORTED_MODULE_2__.SpriteSheet),\n/* harmony export */ Text: () => (/* reexport safe */ _Text__WEBPACK_IMPORTED_MODULE_16__.Text),\n/* harmony export */ TextAlign: () => (/* reexport safe */ _FontCommon__WEBPACK_IMPORTED_MODULE_17__.TextAlign),\n/* harmony export */ TextureLoader: () => (/* reexport safe */ _Context_texture_loader__WEBPACK_IMPORTED_MODULE_33__.TextureLoader),\n/* harmony export */ TiledAnimation: () => (/* reexport safe */ _TiledAnimation__WEBPACK_IMPORTED_MODULE_24__.TiledAnimation),\n/* harmony export */ TiledSprite: () => (/* reexport safe */ _TiledSprite__WEBPACK_IMPORTED_MODULE_23__.TiledSprite),\n/* harmony export */ VertexBuffer: () => (/* reexport safe */ _Context_vertex_buffer__WEBPACK_IMPORTED_MODULE_37__.VertexBuffer),\n/* harmony export */ VertexLayout: () => (/* reexport safe */ _Context_vertex_layout__WEBPACK_IMPORTED_MODULE_38__.VertexLayout),\n/* harmony export */ hasGraphicsTick: () => (/* reexport safe */ _GraphicsComponent__WEBPACK_IMPORTED_MODULE_7__.hasGraphicsTick),\n/* harmony export */ parseImageFiltering: () => (/* reexport safe */ _Filtering__WEBPACK_IMPORTED_MODULE_34__.parseImageFiltering),\n/* harmony export */ parseImageWrapping: () => (/* reexport safe */ _Wrapping__WEBPACK_IMPORTED_MODULE_35__.parseImageWrapping),\n/* harmony export */ pixelSnapEpsilon: () => (/* reexport safe */ _Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_27__.pixelSnapEpsilon),\n/* harmony export */ webgl: () => (/* reexport module object */ _Context_webgl_util__WEBPACK_IMPORTED_MODULE_42__)\n/* harmony export */ });\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Sprite__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Sprite */ \"./Graphics/Sprite.ts\");\n/* harmony import */ var _SpriteSheet__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./SpriteSheet */ \"./Graphics/SpriteSheet.ts\");\n/* harmony import */ var _GraphicsGroup__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./GraphicsGroup */ \"./Graphics/GraphicsGroup.ts\");\n/* harmony import */ var _ImageSource__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./ImageSource */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Animation__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Animation */ \"./Graphics/Animation.ts\");\n/* harmony import */ var _Line__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Line */ \"./Graphics/Line.ts\");\n/* harmony import */ var _GraphicsComponent__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _DebugGraphicsComponent__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./DebugGraphicsComponent */ \"./Graphics/DebugGraphicsComponent.ts\");\n/* harmony import */ var _GraphicsSystem__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./GraphicsSystem */ \"./Graphics/GraphicsSystem.ts\");\n/* harmony import */ var _OffscreenSystem__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./OffscreenSystem */ \"./Graphics/OffscreenSystem.ts\");\n/* harmony import */ var _ParallaxComponent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./ParallaxComponent */ \"./Graphics/ParallaxComponent.ts\");\n/* harmony import */ var _Raster__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Raster */ \"./Graphics/Raster.ts\");\n/* harmony import */ var _Circle__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Circle */ \"./Graphics/Circle.ts\");\n/* harmony import */ var _Rectangle__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Rectangle */ \"./Graphics/Rectangle.ts\");\n/* harmony import */ var _Polygon__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Polygon */ \"./Graphics/Polygon.ts\");\n/* harmony import */ var _Text__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Text */ \"./Graphics/Text.ts\");\n/* harmony import */ var _FontCommon__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./FontCommon */ \"./Graphics/FontCommon.ts\");\n/* harmony import */ var _Font__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Font */ \"./Graphics/Font.ts\");\n/* harmony import */ var _FontCache__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./FontCache */ \"./Graphics/FontCache.ts\");\n/* harmony import */ var _SpriteFont__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./SpriteFont */ \"./Graphics/SpriteFont.ts\");\n/* harmony import */ var _Canvas__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./Canvas */ \"./Graphics/Canvas.ts\");\n/* harmony import */ var _NineSlice__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./NineSlice */ \"./Graphics/NineSlice.ts\");\n/* harmony import */ var _TiledSprite__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./TiledSprite */ \"./Graphics/TiledSprite.ts\");\n/* harmony import */ var _TiledAnimation__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./TiledAnimation */ \"./Graphics/TiledAnimation.ts\");\n/* harmony import */ var _Context_ExcaliburGraphicsContext__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./Context/ExcaliburGraphicsContext */ \"./Graphics/Context/ExcaliburGraphicsContext.ts\");\n/* harmony import */ var _Context_ExcaliburGraphicsContext2DCanvas__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./Context/ExcaliburGraphicsContext2DCanvas */ \"./Graphics/Context/ExcaliburGraphicsContext2DCanvas.ts\");\n/* harmony import */ var _Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./Context/ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _Context_particle_renderer_particle_renderer__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./Context/particle-renderer/particle-renderer */ \"./Graphics/Context/particle-renderer/particle-renderer.ts\");\n/* harmony import */ var _Context_debug_text__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./Context/debug-text */ \"./Graphics/Context/debug-text.ts\");\n/* harmony import */ var _PostProcessor_ScreenShader__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./PostProcessor/ScreenShader */ \"./Graphics/PostProcessor/ScreenShader.ts\");\n/* harmony import */ var _PostProcessor_ColorBlindnessMode__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./PostProcessor/ColorBlindnessMode */ \"./Graphics/PostProcessor/ColorBlindnessMode.ts\");\n/* harmony import */ var _PostProcessor_ColorBlindnessPostProcessor__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./PostProcessor/ColorBlindnessPostProcessor */ \"./Graphics/PostProcessor/ColorBlindnessPostProcessor.ts\");\n/* harmony import */ var _Context_texture_loader__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./Context/texture-loader */ \"./Graphics/Context/texture-loader.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./Wrapping */ \"./Graphics/Wrapping.ts\");\n/* harmony import */ var _Context_shader__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./Context/shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _Context_vertex_buffer__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./Context/vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _Context_vertex_layout__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./Context/vertex-layout */ \"./Graphics/Context/vertex-layout.ts\");\n/* harmony import */ var _Context_quad_index_buffer__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./Context/quad-index-buffer */ \"./Graphics/Context/quad-index-buffer.ts\");\n/* harmony import */ var _Context_material__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./Context/material */ \"./Graphics/Context/material.ts\");\n/* harmony import */ var _Debug__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ./Debug */ \"./Graphics/Debug.ts\");\n/* harmony import */ var _Context_webgl_util__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ./Context/webgl-util */ \"./Graphics/Context/webgl-util.ts\");\n// Graphics\n\n\n\n\n\n\n\n// Graphics ECS\n\n\n\n\n\n// Raster graphics\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// TODO DELETEME\n\n\n// Post Processor\n\n\n\n\n\n\n\n// Rendering\n\n\n\n\n\n\n// Debug\n\n// Util\n\n\n\n\n/***/ }),\n\n/***/ \"./Id.ts\":\n/*!***************!*\\\n !*** ./Id.ts ***!\n \\***************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ createId: () => (/* binding */ createId)\n/* harmony export */ });\n/**\n * Create a branded ID type from a number\n */\nfunction createId(type, value) {\n return { type, value };\n}\n\n\n/***/ }),\n\n/***/ \"./Input/Gamepad.ts\":\n/*!**************************!*\\\n !*** ./Input/Gamepad.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Axes: () => (/* binding */ Axes),\n/* harmony export */ Buttons: () => (/* binding */ Buttons),\n/* harmony export */ Gamepad: () => (/* binding */ Gamepad),\n/* harmony export */ GamepadEvents: () => (/* binding */ GamepadEvents),\n/* harmony export */ Gamepads: () => (/* binding */ Gamepads)\n/* harmony export */ });\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n\n\nconst GamepadEvents = {\n GamepadConnect: 'connect',\n GamepadDisconnect: 'disconnect',\n GamepadButton: 'button',\n GamepadAxis: 'axis'\n};\n/**\n * Excalibur leverages the HTML5 Gamepad API [where it is supported](http://caniuse.com/#feat=gamepad)\n * to provide controller support for your games.\n */\nclass Gamepads {\n constructor() {\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n /**\n * Whether or not to poll for Gamepad input (default: `false`)\n */\n this.enabled = false;\n /**\n * Whether or not Gamepad API is supported\n */\n this.supported = !!navigator.getGamepads;\n this._gamePadTimeStamps = [0, 0, 0, 0];\n this._oldPads = [];\n this._pads = [];\n this._initSuccess = false;\n this._navigator = navigator;\n this._minimumConfiguration = null;\n this._enabled = true;\n }\n init() {\n if (!this.supported) {\n return;\n }\n if (this._initSuccess) {\n return;\n }\n // In Chrome, this will return 4 undefined items until a button is pressed\n // In FF, this will not return any items until a button is pressed\n this._oldPads = this._clonePads(this._navigator.getGamepads());\n if (this._oldPads.length && this._oldPads[0]) {\n this._initSuccess = true;\n }\n }\n toggleEnabled(enabled) {\n this._enabled = enabled;\n }\n /**\n * Sets the minimum gamepad configuration, for example {axis: 4, buttons: 4} means\n * this game requires at minimum 4 axis inputs and 4 buttons, this is not restrictive\n * all other controllers with more axis or buttons are valid as well. If no minimum\n * configuration is set all pads are valid.\n */\n setMinimumGamepadConfiguration(config) {\n this._enableAndUpdate(); // if config is used, implicitly enable\n this._minimumConfiguration = config;\n }\n /**\n * When implicitly enabled, set the enabled flag and run an update so information is updated\n */\n _enableAndUpdate() {\n if (!this.enabled) {\n this.enabled = true;\n this.update();\n }\n }\n /**\n * Checks a navigator gamepad against the minimum configuration if present.\n */\n _isGamepadValid(pad) {\n if (!this._minimumConfiguration) {\n return true;\n }\n if (!pad) {\n return false;\n }\n const axesLength = pad.axes.filter((value) => {\n return typeof value !== undefined;\n }).length;\n const buttonLength = pad.buttons.filter((value) => {\n return typeof value !== undefined;\n }).length;\n return axesLength >= this._minimumConfiguration.axis && buttonLength >= this._minimumConfiguration.buttons && pad.connected;\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n this._enableAndUpdate(); // implicitly enable\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this._enableAndUpdate(); // implicitly enable\n this.events.off(eventName, handler);\n }\n /**\n * Updates Gamepad state and publishes Gamepad events\n */\n update() {\n if (!this.enabled || !this.supported) {\n return;\n }\n if (!this._enabled) {\n return;\n }\n this.init();\n const gamepads = this._navigator.getGamepads();\n for (let i = 0; i < gamepads.length; i++) {\n if (!gamepads[i]) {\n const gamepad = this.at(i);\n // If was connected, but now isn't emit the disconnect event\n if (gamepad.connected) {\n this.events.emit('disconnect', new _Events__WEBPACK_IMPORTED_MODULE_1__.GamepadDisconnectEvent(i, gamepad));\n }\n // Reset connection status\n gamepad.connected = false;\n continue;\n }\n else {\n if (!this.at(i).connected && this._isGamepadValid(gamepads[i])) {\n this.events.emit('connect', new _Events__WEBPACK_IMPORTED_MODULE_1__.GamepadConnectEvent(i, this.at(i)));\n }\n // Set connection status\n this.at(i).connected = true;\n }\n this.at(i).update();\n // Only supported in Chrome\n if (gamepads[i].timestamp && gamepads[i].timestamp === this._gamePadTimeStamps[i]) {\n continue;\n }\n this._gamePadTimeStamps[i] = gamepads[i].timestamp;\n // Add reference to navigator gamepad\n this.at(i).navigatorGamepad = gamepads[i];\n // Buttons\n let b, bi, a, ai, value;\n for (b in Buttons) {\n bi = Buttons[b];\n if (typeof bi === 'number') {\n if (gamepads[i].buttons[bi]) {\n value = gamepads[i].buttons[bi].value;\n if (value !== this._oldPads[i].getButton(bi)) {\n if (gamepads[i].buttons[bi].pressed) {\n this.at(i).updateButton(bi, value);\n this.at(i).events.emit('button', new _Events__WEBPACK_IMPORTED_MODULE_1__.GamepadButtonEvent(bi, value, this.at(i)));\n }\n else {\n this.at(i).updateButton(bi, 0);\n }\n }\n }\n }\n }\n // Axes\n for (a in Axes) {\n ai = Axes[a];\n if (typeof ai === 'number') {\n value = gamepads[i].axes[ai];\n if (value !== this._oldPads[i].getAxes(ai)) {\n this.at(i).updateAxes(ai, value);\n this.at(i).events.emit('axis', new _Events__WEBPACK_IMPORTED_MODULE_1__.GamepadAxisEvent(ai, value, this.at(i)));\n }\n }\n }\n this._oldPads[i] = this._clonePad(gamepads[i]);\n }\n }\n /**\n * Safely retrieves a Gamepad at a specific index and creates one if it doesn't yet exist\n */\n at(index) {\n this._enableAndUpdate(); // implicitly enable gamepads when at() is called\n if (index >= this._pads.length) {\n // Ensure there is a pad to retrieve\n for (let i = this._pads.length - 1, max = index; i < max; i++) {\n this._pads.push(new Gamepad());\n this._oldPads.push(new Gamepad());\n }\n }\n return this._pads[index];\n }\n /**\n * Returns a list of all valid gamepads that meet the minimum configuration requirement.\n */\n getValidGamepads() {\n this._enableAndUpdate();\n const result = [];\n for (let i = 0; i < this._pads.length; i++) {\n if (this._isGamepadValid(this.at(i).navigatorGamepad) && this.at(i).connected) {\n result.push(this.at(i));\n }\n }\n return result;\n }\n /**\n * Gets the number of connected gamepads\n */\n count() {\n return this._pads.filter((p) => p.connected).length;\n }\n _clonePads(pads) {\n const arr = [];\n for (let i = 0, len = pads.length; i < len; i++) {\n arr.push(this._clonePad(pads[i]));\n }\n return arr;\n }\n /**\n * Fastest way to clone a known object is to do it yourself\n */\n _clonePad(pad) {\n let i, len;\n const clonedPad = new Gamepad();\n if (!pad) {\n return clonedPad;\n }\n for (i = 0, len = pad.buttons.length; i < len; i++) {\n if (pad.buttons[i]) {\n clonedPad.updateButton(i, pad.buttons[i].value);\n }\n }\n for (i = 0, len = pad.axes.length; i < len; i++) {\n clonedPad.updateAxes(i, pad.axes[i]);\n }\n return clonedPad;\n }\n}\n/**\n * The minimum value an axis has to move before considering it a change\n */\nGamepads.MinAxisMoveThreshold = 0.05;\n/**\n * Gamepad holds state information for a connected controller. See {@apilink Gamepads}\n * for more information on handling controller input.\n */\nclass Gamepad {\n constructor() {\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n this.connected = false;\n this._axes = new Array(4);\n this._buttons = new Array(16);\n this._buttonsUp = new Array(16);\n this._buttonsDown = new Array(16);\n for (let i = 0; i < this._buttons.length; i++) {\n this._buttons[i] = 0;\n }\n for (let i = 0; i < this._axes.length; i++) {\n this._axes[i] = 0;\n }\n }\n update() {\n // Reset buttonsDown and buttonsUp after update is complete\n this._buttonsDown = new Array(16);\n this._buttonsUp = new Array(16);\n }\n /**\n * Whether or not the given button is pressed\n * @deprecated will be removed in v0.28.0. Use isButtonHeld instead\n * @param button The button to query\n * @param threshold The threshold over which the button is considered to be pressed\n */\n isButtonPressed(button, threshold = 1) {\n return this._buttons[button] >= threshold;\n }\n /**\n * Tests if a certain button is held down. This is persisted between frames.\n * @param button The button to query\n * @param threshold The threshold over which the button is considered to be pressed\n */\n isButtonHeld(button, threshold = 1) {\n return this._buttons[button] >= threshold;\n }\n /**\n * Tests if a certain button was just pressed this frame. This is cleared at the end of the update frame.\n * @param button Test whether a button was just pressed\n * @param threshold The threshold over which the button is considered to be pressed\n */\n wasButtonPressed(button, threshold = 1) {\n return this._buttonsDown[button] >= threshold;\n }\n /**\n * Tests if a certain button was just released this frame. This is cleared at the end of the update frame.\n * @param button Test whether a button was just released\n */\n wasButtonReleased(button) {\n return Boolean(this._buttonsUp[button]);\n }\n /**\n * Gets the given button value between 0 and 1\n */\n getButton(button) {\n return this._buttons[button];\n }\n /**\n * Gets the given axis value between -1 and 1. Values below\n * {@apilink MinAxisMoveThreshold} are considered 0.\n */\n getAxes(axes) {\n const value = this._axes[axes];\n if (Math.abs(value) < Gamepads.MinAxisMoveThreshold) {\n return 0;\n }\n else {\n return value;\n }\n }\n updateButton(buttonIndex, value) {\n // button was just released\n if (value === 0 && this._buttons[buttonIndex]) {\n this._buttonsUp[buttonIndex] = 1;\n // button was just pressed\n }\n else {\n this._buttonsDown[buttonIndex] = value;\n }\n this._buttons[buttonIndex] = value;\n }\n updateAxes(axesIndex, value) {\n this._axes[axesIndex] = value;\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n}\n/**\n * Gamepad Buttons enumeration\n */\nvar Buttons;\n(function (Buttons) {\n /**\n * Face 1 button (e.g. A)\n */\n Buttons[Buttons[\"Face1\"] = 0] = \"Face1\";\n /**\n * Face 2 button (e.g. B)\n */\n Buttons[Buttons[\"Face2\"] = 1] = \"Face2\";\n /**\n * Face 3 button (e.g. X)\n */\n Buttons[Buttons[\"Face3\"] = 2] = \"Face3\";\n /**\n * Face 4 button (e.g. Y)\n */\n Buttons[Buttons[\"Face4\"] = 3] = \"Face4\";\n /**\n * Left bumper button\n */\n Buttons[Buttons[\"LeftBumper\"] = 4] = \"LeftBumper\";\n /**\n * Right bumper button\n */\n Buttons[Buttons[\"RightBumper\"] = 5] = \"RightBumper\";\n /**\n * Left trigger button\n */\n Buttons[Buttons[\"LeftTrigger\"] = 6] = \"LeftTrigger\";\n /**\n * Right trigger button\n */\n Buttons[Buttons[\"RightTrigger\"] = 7] = \"RightTrigger\";\n /**\n * Select button\n */\n Buttons[Buttons[\"Select\"] = 8] = \"Select\";\n /**\n * Start button\n */\n Buttons[Buttons[\"Start\"] = 9] = \"Start\";\n /**\n * Left analog stick press (e.g. L3)\n */\n Buttons[Buttons[\"LeftStick\"] = 10] = \"LeftStick\";\n /**\n * Right analog stick press (e.g. R3)\n */\n Buttons[Buttons[\"RightStick\"] = 11] = \"RightStick\";\n /**\n * D-pad up\n */\n Buttons[Buttons[\"DpadUp\"] = 12] = \"DpadUp\";\n /**\n * D-pad down\n */\n Buttons[Buttons[\"DpadDown\"] = 13] = \"DpadDown\";\n /**\n * D-pad left\n */\n Buttons[Buttons[\"DpadLeft\"] = 14] = \"DpadLeft\";\n /**\n * D-pad right\n */\n Buttons[Buttons[\"DpadRight\"] = 15] = \"DpadRight\";\n})(Buttons || (Buttons = {}));\n/**\n * Gamepad Axes enumeration\n */\nvar Axes;\n(function (Axes) {\n /**\n * Left analogue stick X direction\n */\n Axes[Axes[\"LeftStickX\"] = 0] = \"LeftStickX\";\n /**\n * Left analogue stick Y direction\n */\n Axes[Axes[\"LeftStickY\"] = 1] = \"LeftStickY\";\n /**\n * Right analogue stick X direction\n */\n Axes[Axes[\"RightStickX\"] = 2] = \"RightStickX\";\n /**\n * Right analogue stick Y direction\n */\n Axes[Axes[\"RightStickY\"] = 3] = \"RightStickY\";\n})(Axes || (Axes = {}));\n\n\n/***/ }),\n\n/***/ \"./Input/InputHost.ts\":\n/*!****************************!*\\\n !*** ./Input/InputHost.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ InputHost: () => (/* binding */ InputHost)\n/* harmony export */ });\n/* harmony import */ var _Gamepad__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Gamepad */ \"./Input/Gamepad.ts\");\n/* harmony import */ var _InputMapper__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./InputMapper */ \"./Input/InputMapper.ts\");\n/* harmony import */ var _Keyboard__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Keyboard */ \"./Input/Keyboard.ts\");\n/* harmony import */ var _PointerEventReceiver__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./PointerEventReceiver */ \"./Input/PointerEventReceiver.ts\");\n\n\n\n\nclass InputHost {\n constructor(options) {\n this._enabled = true;\n const { pointerTarget, grabWindowFocus, engine } = options;\n this.keyboard = new _Keyboard__WEBPACK_IMPORTED_MODULE_0__.Keyboard();\n this.pointers = new _PointerEventReceiver__WEBPACK_IMPORTED_MODULE_1__.PointerEventReceiver(pointerTarget, engine);\n this.gamepads = new _Gamepad__WEBPACK_IMPORTED_MODULE_2__.Gamepads();\n this.keyboard.init({ grabWindowFocus });\n this.pointers.init({ grabWindowFocus });\n this.gamepads.init();\n this.inputMapper = new _InputMapper__WEBPACK_IMPORTED_MODULE_3__.InputMapper({\n keyboard: this.keyboard,\n pointers: this.pointers,\n gamepads: this.gamepads\n });\n }\n get enabled() {\n return this._enabled;\n }\n toggleEnabled(enabled) {\n this._enabled = enabled;\n this.keyboard.toggleEnabled(this._enabled);\n this.pointers.toggleEnabled(this._enabled);\n this.gamepads.toggleEnabled(this._enabled);\n }\n update() {\n if (this._enabled) {\n this.inputMapper.execute();\n this.keyboard.update();\n this.gamepads.update();\n }\n }\n clear() {\n this.keyboard.clear();\n this.pointers.clear();\n // this.gamepads.clear();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Input/InputMapper.ts\":\n/*!******************************!*\\\n !*** ./Input/InputMapper.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ InputMapper: () => (/* binding */ InputMapper)\n/* harmony export */ });\n/**\n * This allows you to map multiple inputs to specific commands! This is especially useful when\n * you need to allow multiple input sources to control a specific action.\n */\nclass InputMapper {\n constructor(inputs) {\n this.inputs = inputs;\n this._handlers = new Map();\n }\n /**\n * Executes the input map, called internally by Excalibur\n */\n execute() {\n for (const [input, command] of this._handlers.entries()) {\n const results = input(this.inputs);\n if (results) {\n command(results);\n }\n }\n }\n /**\n * This allows you to map multiple inputs to specific commands! This is useful\n *\n * The inputHandler should return a truthy value if you wish the commandHandler to fire.\n *\n * Example:\n * ```typescript\n * const moveRight = (amount: number) => { actor.vel.x = 100 * amount }\n * const moveLeft = (amount: number) => { actor.vel.x = -100 * amount }\n * const moveUp = (amount: number) => { actor.vel.y = -100 * amount }\n * const moveDown = (amount: number) => { actor.vel.y = 100 * amount }\n *\n * engine.inputMapper.on(({keyboard}) => keyboard.isHeld(ex.Keys.ArrowRight) ? 1 : 0, moveRight);\n * engine.inputMapper.on(({gamepads}) => gamepads.at(0).isButtonPressed(ex.Buttons.DpadRight) ? 1 : 0, moveRight);\n * engine.inputMapper.on(({gamepads}) => gamepads.at(0).getAxes(ex.Axes.LeftStickX) > 0 ?\n * gamepads.at(0).getAxes(ex.Axes.LeftStickX) : 0, moveRight);\n * ```\n * @param inputHandler\n * @param commandHandler\n */\n on(inputHandler, commandHandler) {\n this._handlers.set(inputHandler, commandHandler);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Input/Keyboard.ts\":\n/*!***************************!*\\\n !*** ./Input/Keyboard.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ KeyEvent: () => (/* binding */ KeyEvent),\n/* harmony export */ KeyEvents: () => (/* binding */ KeyEvents),\n/* harmony export */ Keyboard: () => (/* binding */ Keyboard),\n/* harmony export */ Keys: () => (/* binding */ Keys)\n/* harmony export */ });\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _Util_IFrame__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Util/IFrame */ \"./Util/IFrame.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n\n/**\n * Enum representing physical input key codes\n *\n * Spec: https://w3c.github.io/uievents-code/#key-alphanumeric-section\n */\nvar Keys;\n(function (Keys) {\n // Writing System Keys https://w3c.github.io/uievents-code/#key-alphanumeric-writing-system\n Keys[\"Backquote\"] = \"Backquote\";\n Keys[\"Backslash\"] = \"Backslash\";\n Keys[\"BracketLeft\"] = \"BracketLeft\";\n Keys[\"BracketRight\"] = \"BracketRight\";\n Keys[\"Comma\"] = \"Comma\";\n // NUMBERS\n Keys[\"Key0\"] = \"Digit0\";\n Keys[\"Key1\"] = \"Digit1\";\n Keys[\"Key2\"] = \"Digit2\";\n Keys[\"Key3\"] = \"Digit3\";\n Keys[\"Key4\"] = \"Digit4\";\n Keys[\"Key5\"] = \"Digit5\";\n Keys[\"Key6\"] = \"Digit6\";\n Keys[\"Key7\"] = \"Digit7\";\n Keys[\"Key8\"] = \"Digit8\";\n Keys[\"Key9\"] = \"Digit9\";\n Keys[\"Digit0\"] = \"Digit0\";\n Keys[\"Digit1\"] = \"Digit1\";\n Keys[\"Digit2\"] = \"Digit2\";\n Keys[\"Digit3\"] = \"Digit3\";\n Keys[\"Digit4\"] = \"Digit4\";\n Keys[\"Digit5\"] = \"Digit5\";\n Keys[\"Digit6\"] = \"Digit6\";\n Keys[\"Digit7\"] = \"Digit7\";\n Keys[\"Digit8\"] = \"Digit8\";\n Keys[\"Digit9\"] = \"Digit9\";\n Keys[\"Equal\"] = \"Equal\";\n Keys[\"IntlBackslash\"] = \"IntlBackslash\";\n Keys[\"IntlRo\"] = \"IntlRo\";\n Keys[\"IntlYen\"] = \"IntlYen\";\n // LETTERS\n Keys[\"A\"] = \"KeyA\";\n Keys[\"B\"] = \"KeyB\";\n Keys[\"C\"] = \"KeyC\";\n Keys[\"D\"] = \"KeyD\";\n Keys[\"E\"] = \"KeyE\";\n Keys[\"F\"] = \"KeyF\";\n Keys[\"G\"] = \"KeyG\";\n Keys[\"H\"] = \"KeyH\";\n Keys[\"I\"] = \"KeyI\";\n Keys[\"J\"] = \"KeyJ\";\n Keys[\"K\"] = \"KeyK\";\n Keys[\"L\"] = \"KeyL\";\n Keys[\"M\"] = \"KeyM\";\n Keys[\"N\"] = \"KeyN\";\n Keys[\"O\"] = \"KeyO\";\n Keys[\"P\"] = \"KeyP\";\n Keys[\"Q\"] = \"KeyQ\";\n Keys[\"R\"] = \"KeyR\";\n Keys[\"S\"] = \"KeyS\";\n Keys[\"T\"] = \"KeyT\";\n Keys[\"U\"] = \"KeyU\";\n Keys[\"V\"] = \"KeyV\";\n Keys[\"W\"] = \"KeyW\";\n Keys[\"X\"] = \"KeyX\";\n Keys[\"Y\"] = \"KeyY\";\n Keys[\"Z\"] = \"KeyZ\";\n Keys[\"KeyA\"] = \"KeyA\";\n Keys[\"KeyB\"] = \"KeyB\";\n Keys[\"KeyC\"] = \"KeyC\";\n Keys[\"KeyD\"] = \"KeyD\";\n Keys[\"KeyE\"] = \"KeyE\";\n Keys[\"KeyF\"] = \"KeyF\";\n Keys[\"KeyG\"] = \"KeyG\";\n Keys[\"KeyH\"] = \"KeyH\";\n Keys[\"KeyI\"] = \"KeyI\";\n Keys[\"KeyJ\"] = \"KeyJ\";\n Keys[\"KeyK\"] = \"KeyK\";\n Keys[\"KeyL\"] = \"KeyL\";\n Keys[\"KeyM\"] = \"KeyM\";\n Keys[\"KeyN\"] = \"KeyN\";\n Keys[\"KeyO\"] = \"KeyO\";\n Keys[\"KeyP\"] = \"KeyP\";\n Keys[\"KeyQ\"] = \"KeyQ\";\n Keys[\"KeyR\"] = \"KeyR\";\n Keys[\"KeyS\"] = \"KeyS\";\n Keys[\"KeyT\"] = \"KeyT\";\n Keys[\"KeyU\"] = \"KeyU\";\n Keys[\"KeyV\"] = \"KeyV\";\n Keys[\"KeyW\"] = \"KeyW\";\n Keys[\"KeyX\"] = \"KeyX\";\n Keys[\"KeyY\"] = \"KeyY\";\n Keys[\"KeyZ\"] = \"KeyZ\";\n // SYMBOLS\n Keys[\"Minus\"] = \"Minus\";\n Keys[\"Period\"] = \"Period\";\n Keys[\"Quote\"] = \"Quote\";\n Keys[\"Semicolon\"] = \"Semicolon\";\n Keys[\"Slash\"] = \"Slash\";\n // Functional keys https://w3c.github.io/uievents-code/#key-alphanumeric-functional\n Keys[\"AltLeft\"] = \"AltLeft\";\n Keys[\"AltRight\"] = \"AltRight\";\n Keys[\"Alt\"] = \"Alt\";\n Keys[\"AltGraph\"] = \"AltGraph\";\n Keys[\"Backspace\"] = \"Backspace\";\n Keys[\"CapsLock\"] = \"CapsLock\";\n Keys[\"ContextMenu\"] = \"ContextMenu\";\n Keys[\"ControlLeft\"] = \"ControlLeft\";\n Keys[\"ControlRight\"] = \"ControlRight\";\n Keys[\"Enter\"] = \"Enter\";\n Keys[\"MetaLeft\"] = \"MetaLeft\";\n Keys[\"MetaRight\"] = \"MetaRight\";\n Keys[\"ShiftLeft\"] = \"ShiftLeft\";\n Keys[\"ShiftRight\"] = \"ShiftRight\";\n Keys[\"Space\"] = \"Space\";\n Keys[\"Tab\"] = \"Tab\";\n Keys[\"Convert\"] = \"Convert\";\n Keys[\"KanaMode\"] = \"KanaMode\";\n Keys[\"NonConvert\"] = \"NonConvert\";\n // Control Pad https://w3c.github.io/uievents-code/#key-controlpad-section\n Keys[\"Delete\"] = \"Delete\";\n Keys[\"End\"] = \"End\";\n Keys[\"Help\"] = \"Help\";\n Keys[\"Home\"] = \"Home\";\n Keys[\"Insert\"] = \"Insert\";\n Keys[\"PageDown\"] = \"PageDown\";\n Keys[\"PageUp\"] = \"PageUp\";\n // Arrow Pad https://w3c.github.io/uievents-code/#key-arrowpad-section\n Keys[\"Up\"] = \"ArrowUp\";\n Keys[\"Down\"] = \"ArrowDown\";\n Keys[\"Left\"] = \"ArrowLeft\";\n Keys[\"Right\"] = \"ArrowRight\";\n Keys[\"ArrowUp\"] = \"ArrowUp\";\n Keys[\"ArrowDown\"] = \"ArrowDown\";\n Keys[\"ArrowLeft\"] = \"ArrowLeft\";\n Keys[\"ArrowRight\"] = \"ArrowRight\";\n // Numpad Section https://w3c.github.io/uievents-code/#key-numpad-section\n Keys[\"NumLock\"] = \"NumLock\";\n Keys[\"Numpad0\"] = \"Numpad0\";\n Keys[\"Numpad1\"] = \"Numpad1\";\n Keys[\"Numpad2\"] = \"Numpad2\";\n Keys[\"Numpad3\"] = \"Numpad3\";\n Keys[\"Numpad4\"] = \"Numpad4\";\n Keys[\"Numpad5\"] = \"Numpad5\";\n Keys[\"Numpad6\"] = \"Numpad6\";\n Keys[\"Numpad7\"] = \"Numpad7\";\n Keys[\"Numpad8\"] = \"Numpad8\";\n Keys[\"Numpad9\"] = \"Numpad9\";\n Keys[\"Num0\"] = \"Numpad0\";\n Keys[\"Num1\"] = \"Numpad1\";\n Keys[\"Num2\"] = \"Numpad2\";\n Keys[\"Num3\"] = \"Numpad3\";\n Keys[\"Num4\"] = \"Numpad4\";\n Keys[\"Num5\"] = \"Numpad5\";\n Keys[\"Num6\"] = \"Numpad6\";\n Keys[\"Num7\"] = \"Numpad7\";\n Keys[\"Num8\"] = \"Numpad8\";\n Keys[\"Num9\"] = \"Numpad9\";\n Keys[\"NumAdd\"] = \"NumpadAdd\";\n Keys[\"NumpadAdd\"] = \"NumpadAdd\";\n Keys[\"NumDecimal\"] = \"NumpadDecimal\";\n Keys[\"NumpadDecimal\"] = \"NumpadDecimal\";\n Keys[\"NumDivide\"] = \"NumpadDivide\";\n Keys[\"NumpadDivide\"] = \"NumpadDivide\";\n Keys[\"NumEnter\"] = \"NumpadEnter\";\n Keys[\"NumpadEnter\"] = \"NumpadEnter\";\n Keys[\"NumMultiply\"] = \"NumpadMultiply\";\n Keys[\"NumpadMultiply\"] = \"NumpadMultiply\";\n Keys[\"NumSubtract\"] = \"NumpadSubtract\";\n Keys[\"NumpadSubtract\"] = \"NumpadSubtract\";\n // NumComma = 'NumpadComma', // not x-browser\n // NumpadComma = 'NumpadComma', // not x-browser\n // Function section https://w3c.github.io/uievents-code/#key-function-section\n Keys[\"Esc\"] = \"Escape\";\n Keys[\"Escape\"] = \"Escape\";\n Keys[\"F1\"] = \"F1\";\n Keys[\"F2\"] = \"F2\";\n Keys[\"F3\"] = \"F3\";\n Keys[\"F4\"] = \"F4\";\n Keys[\"F5\"] = \"F5\";\n Keys[\"F6\"] = \"F6\";\n Keys[\"F7\"] = \"F7\";\n Keys[\"F8\"] = \"F8\";\n Keys[\"F9\"] = \"F9\";\n Keys[\"F10\"] = \"F10\";\n Keys[\"F11\"] = \"F11\";\n Keys[\"F12\"] = \"F12\";\n Keys[\"F13\"] = \"F13\";\n Keys[\"F14\"] = \"F14\";\n Keys[\"F15\"] = \"F15\";\n Keys[\"F16\"] = \"F16\";\n Keys[\"F17\"] = \"F17\";\n Keys[\"F18\"] = \"F18\";\n Keys[\"F19\"] = \"F19\";\n Keys[\"F20\"] = \"F20\";\n Keys[\"PrintScreen\"] = \"PrintScreen\";\n Keys[\"ScrollLock\"] = \"ScrollLock\";\n Keys[\"Pause\"] = \"Pause\";\n Keys[\"Unidentified\"] = \"Unidentified\";\n})(Keys || (Keys = {}));\n/**\n * Event thrown on a game object for a key event\n */\nclass KeyEvent extends _Events__WEBPACK_IMPORTED_MODULE_0__.GameEvent {\n /**\n * @param key The key responsible for throwing the event\n * @param value The key's typed value the browser detected\n * @param originalEvent The original keyboard event that Excalibur handled\n */\n constructor(key, value, originalEvent) {\n super();\n this.key = key;\n this.value = value;\n this.originalEvent = originalEvent;\n }\n}\nconst KeyEvents = {\n Press: 'press',\n Hold: 'hold',\n Release: 'release'\n};\n/**\n * Provides keyboard support for Excalibur.\n */\nclass Keyboard {\n constructor() {\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_1__.EventEmitter();\n this._enabled = true;\n /**\n * Keys that are currently held down\n */\n this._keys = [];\n /**\n * Keys up in the current frame\n */\n this._keysUp = [];\n /**\n * Keys down in the current frame\n */\n this._keysDown = [];\n this._releaseAllKeys = (ev) => {\n for (const code of this._keys) {\n const keyEvent = new KeyEvent(code, ev.key, ev);\n this.events.emit('up', keyEvent);\n this.events.emit('release', keyEvent);\n }\n this._keysUp = Array.from(new Set(this._keys.concat(this._keysUp)));\n this._keys.length = 0;\n };\n this._handleKeyDown = (ev) => {\n if (!this._enabled) {\n return;\n }\n // handle macos meta key issue\n // https://github.com/excaliburjs/Excalibur/issues/2608\n if (!ev.metaKey && (this._keys.includes(Keys.MetaLeft) || this._keys.includes(Keys.MetaRight))) {\n this._releaseAllKeys(ev);\n }\n const code = ev.code;\n if (this._keys.indexOf(code) === -1) {\n this._keys.push(code);\n this._keysDown.push(code);\n const keyEvent = new KeyEvent(code, ev.key, ev);\n this.events.emit('down', keyEvent);\n this.events.emit('press', keyEvent);\n }\n };\n this._handleKeyUp = (ev) => {\n if (!this._enabled) {\n return;\n }\n const code = ev.code;\n const key = this._keys.indexOf(code);\n this._keys.splice(key, 1);\n this._keysUp.push(code);\n const keyEvent = new KeyEvent(code, ev.key, ev);\n // alias the old api, we may want to deprecate this in the future\n this.events.emit('up', keyEvent);\n this.events.emit('release', keyEvent);\n // handle macos meta key issue\n // https://github.com/excaliburjs/Excalibur/issues/2608\n if (ev.key === 'Meta') {\n this._releaseAllKeys(ev);\n }\n };\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n /**\n * Initialize Keyboard event listeners\n */\n init(keyboardOptions) {\n let { global } = keyboardOptions;\n const { grabWindowFocus } = keyboardOptions;\n if (!global) {\n if ((0,_Util_IFrame__WEBPACK_IMPORTED_MODULE_2__.isCrossOriginIframe)()) {\n global = window;\n // Workaround for iframes like for itch.io or codesandbox\n // https://www.reddit.com/r/gamemaker/comments/kfs5cs/keyboard_inputs_no_longer_working_in_html5_game/\n // https://forum.gamemaker.io/index.php?threads/solved-keyboard-issue-on-itch-io.87336/\n if (grabWindowFocus) {\n window.focus();\n }\n _Util_Log__WEBPACK_IMPORTED_MODULE_3__.Logger.getInstance().warn('Excalibur might be in a cross-origin iframe, in order to receive keyboard events it must be in focus');\n }\n else {\n global = window.top;\n }\n }\n global.addEventListener('blur', () => {\n this._keys.length = 0; // empties array efficiently\n });\n // key up is on window because canvas cannot have focus\n global.addEventListener('keyup', this._handleKeyUp);\n // key down is on window because canvas cannot have focus\n global.addEventListener('keydown', this._handleKeyDown);\n }\n toggleEnabled(enabled) {\n this._enabled = enabled;\n }\n clear() {\n this._keysDown.length = 0;\n this._keysUp.length = 0;\n this._keys.length = 0;\n }\n update() {\n // Reset keysDown and keysUp after update is complete\n this._keysDown.length = 0;\n this._keysUp.length = 0;\n // Emit synthetic \"hold\" event\n for (let i = 0; i < this._keys.length; i++) {\n this.events.emit('hold', new KeyEvent(this._keys[i]));\n }\n }\n /**\n * Gets list of keys being pressed down\n */\n getKeys() {\n return this._keys;\n }\n /**\n * Tests if a certain key was just pressed this frame. This is cleared at the end of the update frame.\n * @param key Test whether a key was just pressed\n */\n wasPressed(key) {\n if (!this._enabled) {\n return false;\n }\n return this._keysDown.indexOf(key) > -1;\n }\n /**\n * Tests if a certain key is held down. This is persisted between frames.\n * @param key Test whether a key is held down\n */\n isHeld(key) {\n if (!this._enabled) {\n return false;\n }\n return this._keys.indexOf(key) > -1;\n }\n /**\n * Tests if a certain key was just released this frame. This is cleared at the end of the update frame.\n * @param key Test whether a key was just released\n */\n wasReleased(key) {\n if (!this._enabled) {\n return false;\n }\n return this._keysUp.indexOf(key) > -1;\n }\n /**\n * Trigger a manual key event\n * @param type\n * @param key\n * @param character\n */\n triggerEvent(type, key, character) {\n if (type === 'down') {\n this._handleKeyDown(new KeyboardEvent('keydown', {\n code: key,\n key: character !== null && character !== void 0 ? character : null\n }));\n }\n if (type === 'up') {\n this._handleKeyUp(new KeyboardEvent('keyup', {\n code: key,\n key: character !== null && character !== void 0 ? character : null\n }));\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Input/NativePointerButton.ts\":\n/*!**************************************!*\\\n !*** ./Input/NativePointerButton.ts ***!\n \\**************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ NativePointerButton: () => (/* binding */ NativePointerButton)\n/* harmony export */ });\n/**\n * Native browser button enumeration\n */\nvar NativePointerButton;\n(function (NativePointerButton) {\n NativePointerButton[NativePointerButton[\"NoButton\"] = -1] = \"NoButton\";\n NativePointerButton[NativePointerButton[\"Left\"] = 0] = \"Left\";\n NativePointerButton[NativePointerButton[\"Middle\"] = 1] = \"Middle\";\n NativePointerButton[NativePointerButton[\"Right\"] = 2] = \"Right\";\n NativePointerButton[NativePointerButton[\"Unknown\"] = 3] = \"Unknown\";\n})(NativePointerButton || (NativePointerButton = {}));\n\n\n/***/ }),\n\n/***/ \"./Input/PointerAbstraction.ts\":\n/*!*************************************!*\\\n !*** ./Input/PointerAbstraction.ts ***!\n \\*************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerAbstraction: () => (/* binding */ PointerAbstraction)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Math_global_coordinates__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Math/global-coordinates */ \"./Math/global-coordinates.ts\");\n\n\n\nclass PointerAbstraction {\n constructor() {\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n /**\n * The last position on the document this pointer was at. Can be `null` if pointer was never active.\n */\n this.lastPagePos = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n /**\n * The last position on the screen this pointer was at. Can be `null` if pointer was never active.\n */\n this.lastScreenPos = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n /**\n * The last position in the game world coordinates this pointer was at. Can be `null` if pointer was never active.\n */\n this.lastWorldPos = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n this._onPointerMove = (ev) => {\n this.lastPagePos = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(ev.pagePos.x, ev.pagePos.y);\n this.lastScreenPos = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(ev.screenPos.x, ev.screenPos.y);\n this.lastWorldPos = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(ev.worldPos.x, ev.worldPos.y);\n };\n this._onPointerDown = (ev) => {\n this.lastPagePos = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(ev.pagePos.x, ev.pagePos.y);\n this.lastScreenPos = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(ev.screenPos.x, ev.screenPos.y);\n this.lastWorldPos = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(ev.worldPos.x, ev.worldPos.y);\n };\n this.on('move', this._onPointerMove);\n this.on('down', this._onPointerDown);\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n /**\n * Called internally by excalibur to keep pointers up to date\n * @internal\n * @param engine\n */\n _updateWorldPosition(engine) {\n const coord = _Math_global_coordinates__WEBPACK_IMPORTED_MODULE_2__.GlobalCoordinates.fromPagePosition(this.lastPagePos, engine);\n this.lastScreenPos = coord.screenPos;\n this.lastWorldPos = coord.worldPos;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Input/PointerButton.ts\":\n/*!********************************!*\\\n !*** ./Input/PointerButton.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerButton: () => (/* binding */ PointerButton)\n/* harmony export */ });\n/**\n * The mouse button being pressed.\n */\nvar PointerButton;\n(function (PointerButton) {\n PointerButton[\"Left\"] = \"Left\";\n PointerButton[\"Middle\"] = \"Middle\";\n PointerButton[\"Right\"] = \"Right\";\n PointerButton[\"Unknown\"] = \"Unknown\";\n PointerButton[\"NoButton\"] = \"NoButton\";\n})(PointerButton || (PointerButton = {}));\n\n\n/***/ }),\n\n/***/ \"./Input/PointerComponent.ts\":\n/*!***********************************!*\\\n !*** ./Input/PointerComponent.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerComponent: () => (/* binding */ PointerComponent)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Component */ \"./EntityComponentSystem/Component.ts\");\n\n/**\n * Add this component to optionally configure how the pointer\n * system detects pointer events.\n *\n * By default the collider shape is used and graphics bounds is not.\n *\n * If both collider shape and graphics bounds are enabled it will fire events if either or\n * are intersecting the pointer.\n */\nclass PointerComponent extends _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor(options) {\n var _a, _b;\n super();\n /**\n * Use any existing Collider component geometry for pointer events. This is useful if you want\n * user pointer events only to trigger on the same collision geometry used in the collider component\n * for collision resolution. Default is `true`.\n */\n this.useColliderShape = true;\n /**\n * Use any existing Graphics component bounds for pointers. This is useful if you want the axis aligned\n * bounds around the graphic to trigger pointer events. Default is `true`.\n */\n this.useGraphicsBounds = true;\n this.useColliderShape = (_a = options === null || options === void 0 ? void 0 : options.useColliderShape) !== null && _a !== void 0 ? _a : this.useColliderShape;\n this.useGraphicsBounds = (_b = options === null || options === void 0 ? void 0 : options.useGraphicsBounds) !== null && _b !== void 0 ? _b : this.useGraphicsBounds;\n this.localBounds = options === null || options === void 0 ? void 0 : options.localBounds;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Input/PointerEvent.ts\":\n/*!*******************************!*\\\n !*** ./Input/PointerEvent.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerEvent: () => (/* binding */ PointerEvent)\n/* harmony export */ });\nclass PointerEvent {\n cancel() {\n this.active = false;\n }\n get pagePos() {\n return this.coordinates.pagePos;\n }\n get screenPos() {\n return this.coordinates.screenPos;\n }\n get worldPos() {\n return this.coordinates.worldPos;\n }\n constructor(type, pointerId, button, pointerType, coordinates, nativeEvent) {\n this.type = type;\n this.pointerId = pointerId;\n this.button = button;\n this.pointerType = pointerType;\n this.coordinates = coordinates;\n this.nativeEvent = nativeEvent;\n this.active = true;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Input/PointerEventReceiver.ts\":\n/*!***************************************!*\\\n !*** ./Input/PointerEventReceiver.ts ***!\n \\***************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerEventReceiver: () => (/* binding */ PointerEventReceiver),\n/* harmony export */ PointerEvents: () => (/* binding */ PointerEvents)\n/* harmony export */ });\n/* harmony import */ var _Engine__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Engine */ \"./Engine.ts\");\n/* harmony import */ var _Math_global_coordinates__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Math/global-coordinates */ \"./Math/global-coordinates.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _PointerEvent__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./PointerEvent */ \"./Input/PointerEvent.ts\");\n/* harmony import */ var _WheelEvent__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./WheelEvent */ \"./Input/WheelEvent.ts\");\n/* harmony import */ var _PointerAbstraction__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./PointerAbstraction */ \"./Input/PointerAbstraction.ts\");\n/* harmony import */ var _WheelDeltaMode__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./WheelDeltaMode */ \"./Input/WheelDeltaMode.ts\");\n/* harmony import */ var _PointerSystem__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./PointerSystem */ \"./Input/PointerSystem.ts\");\n/* harmony import */ var _NativePointerButton__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./NativePointerButton */ \"./Input/NativePointerButton.ts\");\n/* harmony import */ var _PointerButton__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./PointerButton */ \"./Input/PointerButton.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../Util/Util */ \"./Util/Util.ts\");\n/* harmony import */ var _PointerType__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./PointerType */ \"./Input/PointerType.ts\");\n/* harmony import */ var _Util_IFrame__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Util/IFrame */ \"./Util/IFrame.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst PointerEvents = {\n Move: 'move',\n Down: 'down',\n Up: 'up',\n Wheel: 'wheel'\n};\n/**\n * Is this event a native touch event?\n */\nfunction isTouchEvent(value) {\n // Guard for Safari <= 13.1\n return globalThis.TouchEvent && value instanceof globalThis.TouchEvent;\n}\n/**\n * Is this event a native pointer event\n */\nfunction isPointerEvent(value) {\n // Guard for Safari <= 13.1\n return globalThis.PointerEvent && value instanceof globalThis.PointerEvent;\n}\n/**\n * The PointerEventProcessor is responsible for collecting all the events from the canvas and transforming them into GlobalCoordinates\n */\nclass PointerEventReceiver {\n constructor(target, engine) {\n this.target = target;\n this.engine = engine;\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n this.primary = new _PointerAbstraction__WEBPACK_IMPORTED_MODULE_1__.PointerAbstraction();\n this._activeNativePointerIdsToNormalized = new Map();\n this.lastFramePointerCoords = new Map();\n this.currentFramePointerCoords = new Map();\n this.currentFramePointerDown = new Map();\n this.lastFramePointerDown = new Map();\n this.currentFrameDown = [];\n this.currentFrameUp = [];\n this.currentFrameMove = [];\n this.currentFrameCancel = [];\n this.currentFrameWheel = [];\n this._enabled = true;\n this._pointers = [this.primary];\n this._boundHandle = this._handle.bind(this);\n this._boundWheel = this._handleWheel.bind(this);\n }\n toggleEnabled(enabled) {\n this._enabled = enabled;\n }\n /**\n * Creates a new PointerEventReceiver with a new target and engine while preserving existing pointer event\n * handlers.\n * @param target\n * @param engine\n */\n recreate(target, engine) {\n const eventReceiver = new PointerEventReceiver(target, engine);\n eventReceiver.primary = this.primary;\n eventReceiver._pointers = this._pointers;\n return eventReceiver;\n }\n /**\n * Locates a specific pointer by id, creates it if it doesn't exist\n * @param index\n */\n at(index) {\n if (index >= this._pointers.length) {\n // Ensure there is a pointer to retrieve\n for (let i = this._pointers.length - 1, max = index; i < max; i++) {\n this._pointers.push(new _PointerAbstraction__WEBPACK_IMPORTED_MODULE_1__.PointerAbstraction());\n }\n }\n return this._pointers[index];\n }\n /**\n * The number of pointers currently being tracked by excalibur\n */\n count() {\n return this._pointers.length;\n }\n /**\n * Is the specified pointer id down this frame\n * @param pointerId\n */\n isDown(pointerId) {\n var _a;\n if (!this._enabled) {\n return false;\n }\n return (_a = this.currentFramePointerDown.get(pointerId)) !== null && _a !== void 0 ? _a : false;\n }\n /**\n * Was the specified pointer id down last frame\n * @param pointerId\n */\n wasDown(pointerId) {\n var _a;\n if (!this._enabled) {\n return false;\n }\n return (_a = this.lastFramePointerDown.get(pointerId)) !== null && _a !== void 0 ? _a : false;\n }\n /**\n * Whether the Pointer is currently dragging.\n */\n isDragging(pointerId) {\n if (!this._enabled) {\n return false;\n }\n return this.isDown(pointerId);\n }\n /**\n * Whether the Pointer just started dragging.\n */\n isDragStart(pointerId) {\n if (!this._enabled) {\n return false;\n }\n return this.isDown(pointerId) && !this.wasDown(pointerId);\n }\n /**\n * Whether the Pointer just ended dragging.\n */\n isDragEnd(pointerId) {\n if (!this._enabled) {\n return false;\n }\n return !this.isDown(pointerId) && this.wasDown(pointerId);\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n /**\n * Called internally by excalibur\n *\n * Updates the current frame pointer info and emits raw pointer events\n *\n * This does not emit events to entities, see PointerSystem\n * @internal\n */\n update() {\n this.lastFramePointerDown = new Map(this.currentFramePointerDown);\n this.lastFramePointerCoords = new Map(this.currentFramePointerCoords);\n for (const event of this.currentFrameDown) {\n if (!event.active) {\n continue;\n }\n this.emit('down', event);\n const pointer = this.at(event.pointerId);\n pointer.emit('down', event);\n this.primary.emit('pointerdown', event);\n }\n for (const event of this.currentFrameUp) {\n if (!event.active) {\n continue;\n }\n this.emit('up', event);\n const pointer = this.at(event.pointerId);\n pointer.emit('up', event);\n }\n for (const event of this.currentFrameMove) {\n if (!event.active) {\n continue;\n }\n this.emit('move', event);\n const pointer = this.at(event.pointerId);\n pointer.emit('move', event);\n }\n for (const event of this.currentFrameCancel) {\n if (!event.active) {\n continue;\n }\n this.emit('cancel', event);\n const pointer = this.at(event.pointerId);\n pointer.emit('cancel', event);\n }\n for (const event of this.currentFrameWheel) {\n if (!event.active) {\n continue;\n }\n this.emit('pointerwheel', event);\n this.emit('wheel', event);\n this.primary.emit('pointerwheel', event);\n this.primary.emit('wheel', event);\n }\n if (this.engine.currentScene.camera.hasChanged()) {\n for (const pointer of this._pointers) {\n pointer._updateWorldPosition(this.engine);\n }\n }\n }\n /**\n * Clears the current frame event and pointer data\n */\n clear() {\n for (const event of this.currentFrameUp) {\n this.currentFramePointerCoords.delete(event.pointerId);\n const ids = this._activeNativePointerIdsToNormalized.entries();\n for (const [native, normalized] of ids) {\n if (normalized === event.pointerId) {\n this._activeNativePointerIdsToNormalized.delete(native);\n }\n }\n }\n this.currentFrameDown.length = 0;\n this.currentFrameUp.length = 0;\n this.currentFrameMove.length = 0;\n this.currentFrameCancel.length = 0;\n this.currentFrameWheel.length = 0;\n }\n /**\n * Initializes the pointer event receiver so that it can start listening to native\n * browser events.\n */\n init(options) {\n var _a;\n if (this.engine.isDisposed()) {\n return;\n }\n // Disabling the touch action avoids browser/platform gestures from firing on the canvas\n // It is important on mobile to have touch action 'none'\n // https://stackoverflow.com/questions/48124372/pointermove-event-not-working-with-touch-why-not\n if (this.target === this.engine.canvas) {\n this.engine.canvas.style.touchAction = 'none';\n }\n else {\n document.body.style.touchAction = 'none';\n }\n // Preferred pointer events\n if (window.PointerEvent) {\n this.target.addEventListener('pointerdown', this._boundHandle);\n this.target.addEventListener('pointerup', this._boundHandle);\n this.target.addEventListener('pointermove', this._boundHandle);\n this.target.addEventListener('pointercancel', this._boundHandle);\n }\n else {\n // Touch Events\n this.target.addEventListener('touchstart', this._boundHandle);\n this.target.addEventListener('touchend', this._boundHandle);\n this.target.addEventListener('touchmove', this._boundHandle);\n this.target.addEventListener('touchcancel', this._boundHandle);\n // Mouse Events\n this.target.addEventListener('mousedown', this._boundHandle);\n this.target.addEventListener('mouseup', this._boundHandle);\n this.target.addEventListener('mousemove', this._boundHandle);\n }\n // MDN MouseWheelEvent\n const wheelOptions = {\n passive: !(this.engine.pageScrollPreventionMode === _Engine__WEBPACK_IMPORTED_MODULE_2__.ScrollPreventionMode.All ||\n this.engine.pageScrollPreventionMode === _Engine__WEBPACK_IMPORTED_MODULE_2__.ScrollPreventionMode.Canvas)\n };\n if ('onwheel' in document.createElement('div')) {\n // Modern Browsers\n this.target.addEventListener('wheel', this._boundWheel, wheelOptions);\n }\n else if (document.onmousewheel !== undefined) {\n // Webkit and IE\n this.target.addEventListener('mousewheel', this._boundWheel, wheelOptions);\n }\n else {\n // Remaining browser and older Firefox\n this.target.addEventListener('MozMousePixelScroll', this._boundWheel, wheelOptions);\n }\n const grabWindowFocus = (_a = options === null || options === void 0 ? void 0 : options.grabWindowFocus) !== null && _a !== void 0 ? _a : true;\n // Handle cross origin iframe\n if (grabWindowFocus && (0,_Util_IFrame__WEBPACK_IMPORTED_MODULE_3__.isCrossOriginIframe)()) {\n const grabFocus = () => {\n window.focus();\n };\n // Preferred pointer events\n if (window.PointerEvent) {\n this.target.addEventListener('pointerdown', grabFocus);\n }\n else {\n // Touch Events\n this.target.addEventListener('touchstart', grabFocus);\n // Mouse Events\n this.target.addEventListener('mousedown', grabFocus);\n }\n }\n }\n detach() {\n // Preferred pointer events\n if (window.PointerEvent) {\n this.target.removeEventListener('pointerdown', this._boundHandle);\n this.target.removeEventListener('pointerup', this._boundHandle);\n this.target.removeEventListener('pointermove', this._boundHandle);\n this.target.removeEventListener('pointercancel', this._boundHandle);\n }\n else {\n // Touch Events\n this.target.removeEventListener('touchstart', this._boundHandle);\n this.target.removeEventListener('touchend', this._boundHandle);\n this.target.removeEventListener('touchmove', this._boundHandle);\n this.target.removeEventListener('touchcancel', this._boundHandle);\n // Mouse Events\n this.target.removeEventListener('mousedown', this._boundHandle);\n this.target.removeEventListener('mouseup', this._boundHandle);\n this.target.removeEventListener('mousemove', this._boundHandle);\n }\n if ('onwheel' in document.createElement('div')) {\n // Modern Browsers\n this.target.removeEventListener('wheel', this._boundWheel);\n }\n else if (document.onmousewheel !== undefined) {\n // Webkit and IE\n this.target.addEventListener('mousewheel', this._boundWheel);\n }\n else {\n // Remaining browser and older Firefox\n this.target.addEventListener('MozMousePixelScroll', this._boundWheel);\n }\n }\n /**\n * Take native pointer id and map it to index in active pointers\n * @param nativePointerId\n */\n _normalizePointerId(nativePointerId) {\n // Add to the the native pointer set id\n this._activeNativePointerIdsToNormalized.set(nativePointerId, -1);\n // Native pointer ids in ascending order\n const currentPointerIds = Array.from(this._activeNativePointerIdsToNormalized.keys()).sort((a, b) => a - b);\n // The index into sorted ids will be the new id, will always have an id\n const id = currentPointerIds.findIndex((p) => p === nativePointerId);\n // Save the mapping so we can reverse it later\n this._activeNativePointerIdsToNormalized.set(nativePointerId, id);\n // ignore pointer because game isn't watching\n return id;\n }\n /**\n * Responsible for handling and parsing pointer events\n */\n _handle(ev) {\n if (!this._enabled) {\n return;\n }\n ev.preventDefault();\n const eventCoords = new Map();\n let button;\n let pointerType;\n if (isTouchEvent(ev)) {\n button = _PointerButton__WEBPACK_IMPORTED_MODULE_4__.PointerButton.Unknown;\n pointerType = _PointerType__WEBPACK_IMPORTED_MODULE_5__.PointerType.Touch;\n // https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent\n for (let i = 0; i < ev.changedTouches.length; i++) {\n const touch = ev.changedTouches[i];\n const coordinates = _Math_global_coordinates__WEBPACK_IMPORTED_MODULE_6__.GlobalCoordinates.fromPagePosition(touch.pageX, touch.pageY, this.engine);\n const nativePointerId = i + 1;\n const pointerId = this._normalizePointerId(nativePointerId);\n this.currentFramePointerCoords.set(pointerId, coordinates);\n eventCoords.set(pointerId, coordinates);\n }\n }\n else {\n button = this._nativeButtonToPointerButton(ev.button);\n pointerType = _PointerType__WEBPACK_IMPORTED_MODULE_5__.PointerType.Mouse;\n const coordinates = _Math_global_coordinates__WEBPACK_IMPORTED_MODULE_6__.GlobalCoordinates.fromPagePosition(ev.pageX, ev.pageY, this.engine);\n let nativePointerId = 1;\n if (isPointerEvent(ev)) {\n nativePointerId = ev.pointerId;\n pointerType = this._stringToPointerType(ev.pointerType);\n }\n const pointerId = this._normalizePointerId(nativePointerId);\n this.currentFramePointerCoords.set(pointerId, coordinates);\n eventCoords.set(pointerId, coordinates);\n }\n for (const [pointerId, coord] of eventCoords.entries()) {\n switch (ev.type) {\n case 'mousedown':\n case 'pointerdown':\n case 'touchstart':\n this.currentFrameDown.push(new _PointerEvent__WEBPACK_IMPORTED_MODULE_7__.PointerEvent('down', pointerId, button, pointerType, coord, ev));\n this.currentFramePointerDown.set(pointerId, true);\n break;\n case 'mouseup':\n case 'pointerup':\n case 'touchend':\n this.currentFrameUp.push(new _PointerEvent__WEBPACK_IMPORTED_MODULE_7__.PointerEvent('up', pointerId, button, pointerType, coord, ev));\n this.currentFramePointerDown.set(pointerId, false);\n break;\n case 'mousemove':\n case 'pointermove':\n case 'touchmove':\n this.currentFrameMove.push(new _PointerEvent__WEBPACK_IMPORTED_MODULE_7__.PointerEvent('move', pointerId, button, pointerType, coord, ev));\n break;\n case 'touchcancel':\n case 'pointercancel':\n this.currentFrameCancel.push(new _PointerEvent__WEBPACK_IMPORTED_MODULE_7__.PointerEvent('cancel', pointerId, button, pointerType, coord, ev));\n break;\n }\n }\n }\n _handleWheel(ev) {\n if (!this._enabled) {\n return;\n }\n // Should we prevent page scroll because of this event\n if (this.engine.pageScrollPreventionMode === _Engine__WEBPACK_IMPORTED_MODULE_2__.ScrollPreventionMode.All ||\n (this.engine.pageScrollPreventionMode === _Engine__WEBPACK_IMPORTED_MODULE_2__.ScrollPreventionMode.Canvas && ev.target === this.engine.canvas)) {\n ev.preventDefault();\n }\n const screen = this.engine.screen.pageToScreenCoordinates((0,_Math_vector__WEBPACK_IMPORTED_MODULE_8__.vec)(ev.pageX, ev.pageY));\n const world = this.engine.screen.screenToWorldCoordinates(screen);\n /**\n * A constant used to normalize wheel events across different browsers\n *\n * This normalization factor is pulled from\n * https://developer.mozilla.org/en-US/docs/Web/Events/wheel#Listening_to_this_event_across_browser\n */\n const ScrollWheelNormalizationFactor = -1 / 40;\n const deltaX = ev.deltaX || ev.wheelDeltaX * ScrollWheelNormalizationFactor || 0;\n const deltaY = ev.deltaY || ev.wheelDeltaY * ScrollWheelNormalizationFactor || ev.wheelDelta * ScrollWheelNormalizationFactor || ev.detail || 0;\n const deltaZ = ev.deltaZ || 0;\n let deltaMode = _WheelDeltaMode__WEBPACK_IMPORTED_MODULE_9__.WheelDeltaMode.Pixel;\n if (ev.deltaMode) {\n if (ev.deltaMode === 1) {\n deltaMode = _WheelDeltaMode__WEBPACK_IMPORTED_MODULE_9__.WheelDeltaMode.Line;\n }\n else if (ev.deltaMode === 2) {\n deltaMode = _WheelDeltaMode__WEBPACK_IMPORTED_MODULE_9__.WheelDeltaMode.Page;\n }\n }\n const we = new _WheelEvent__WEBPACK_IMPORTED_MODULE_10__.WheelEvent(world.x, world.y, ev.pageX, ev.pageY, screen.x, screen.y, 0, deltaX, deltaY, deltaZ, deltaMode, ev);\n this.currentFrameWheel.push(we);\n }\n /**\n * Triggers an excalibur pointer event in a world space pos\n *\n * Useful for testing pointers in excalibur\n * @param type\n * @param pos\n */\n triggerEvent(type, pos) {\n const page = this.engine.screen.worldToPageCoordinates(pos);\n // Send an event to the event receiver\n if (window.PointerEvent) {\n this._handle(new window.PointerEvent('pointer' + type, {\n pointerId: 0,\n clientX: page.x,\n clientY: page.y\n }));\n }\n else {\n // Safari hack\n this._handle(new window.MouseEvent('mouse' + type, {\n clientX: page.x,\n clientY: page.y\n }));\n }\n // Force update pointer system\n const pointerSystem = this.engine.currentScene.world.get(_PointerSystem__WEBPACK_IMPORTED_MODULE_11__.PointerSystem);\n pointerSystem.preupdate(this.engine.currentScene, 1);\n pointerSystem.update(1);\n }\n _nativeButtonToPointerButton(s) {\n switch (s) {\n case _NativePointerButton__WEBPACK_IMPORTED_MODULE_12__.NativePointerButton.NoButton:\n return _PointerButton__WEBPACK_IMPORTED_MODULE_4__.PointerButton.NoButton;\n case _NativePointerButton__WEBPACK_IMPORTED_MODULE_12__.NativePointerButton.Left:\n return _PointerButton__WEBPACK_IMPORTED_MODULE_4__.PointerButton.Left;\n case _NativePointerButton__WEBPACK_IMPORTED_MODULE_12__.NativePointerButton.Middle:\n return _PointerButton__WEBPACK_IMPORTED_MODULE_4__.PointerButton.Middle;\n case _NativePointerButton__WEBPACK_IMPORTED_MODULE_12__.NativePointerButton.Right:\n return _PointerButton__WEBPACK_IMPORTED_MODULE_4__.PointerButton.Right;\n case _NativePointerButton__WEBPACK_IMPORTED_MODULE_12__.NativePointerButton.Unknown:\n return _PointerButton__WEBPACK_IMPORTED_MODULE_4__.PointerButton.Unknown;\n default:\n return (0,_Util_Util__WEBPACK_IMPORTED_MODULE_13__.fail)(s);\n }\n }\n _stringToPointerType(s) {\n switch (s) {\n case 'touch':\n return _PointerType__WEBPACK_IMPORTED_MODULE_5__.PointerType.Touch;\n case 'mouse':\n return _PointerType__WEBPACK_IMPORTED_MODULE_5__.PointerType.Mouse;\n case 'pen':\n return _PointerType__WEBPACK_IMPORTED_MODULE_5__.PointerType.Pen;\n default:\n return _PointerType__WEBPACK_IMPORTED_MODULE_5__.PointerType.Unknown;\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Input/PointerEventsToObjectDispatcher.ts\":\n/*!**************************************************!*\\\n !*** ./Input/PointerEventsToObjectDispatcher.ts ***!\n \\**************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerEventsToObjectDispatcher: () => (/* binding */ PointerEventsToObjectDispatcher),\n/* harmony export */ PointerTargetObjectProxy: () => (/* binding */ PointerTargetObjectProxy)\n/* harmony export */ });\n/* harmony import */ var _Util_RentalPool__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Util/RentalPool */ \"./Util/RentalPool.ts\");\n\n/**\n *\n */\nfunction hasNestedEvents(object) {\n return object && object._dispatchPointerEvents && object._processPointerToObject;\n}\nclass PointerTargetObjectProxy {\n get events() {\n return this.object.events;\n }\n init(object, contains, active) {\n this.object = object;\n this.contains = contains;\n this.active = active;\n }\n}\nclass PointerEventsToObjectDispatcher {\n constructor() {\n this._proxyPool = new _Util_RentalPool__WEBPACK_IMPORTED_MODULE_0__.RentalPool(() => new PointerTargetObjectProxy(), (p) => p, 100);\n this._objectToProxy = new Map();\n this._proxies = [];\n this._lastFrameObjectToPointers = new Map();\n this._currentFrameObjectToPointers = new Map();\n }\n /**\n * Tracks an object to associate with pointers and their events\n * @param object\n * @param contains\n * @param active\n */\n addObject(object, contains, active) {\n const proxy = this._proxyPool.rent(false);\n proxy.init(object, contains, active);\n this._proxies.push(proxy);\n this._objectToProxy.set(object, proxy);\n }\n _getProxy(object) {\n const proxy = this._objectToProxy.get(object);\n if (proxy) {\n return proxy;\n }\n throw new Error('No PointerTargetProxy for object');\n }\n /**\n * Untracks an object associated with pointers and their events\n * @param object\n */\n removeObject(object) {\n const proxy = this._objectToProxy.get(object);\n if (proxy) {\n const index = this._proxies.indexOf(proxy);\n if (index > -1) {\n this._proxies.splice(index, 1);\n }\n this._proxyPool.return(proxy);\n }\n }\n _objectCurrentlyUnderPointer(object, pointerId) {\n return !!(this._currentFrameObjectToPointers.has(object) && this._currentFrameObjectToPointers.get(object).includes(pointerId));\n }\n _objectWasUnderPointer(object, pointerId) {\n return !!(this._lastFrameObjectToPointers.has(object) && this._lastFrameObjectToPointers.get(object).includes(pointerId));\n }\n _entered(object, pointerId) {\n return this._objectCurrentlyUnderPointer(object, pointerId) && !this._lastFrameObjectToPointers.has(object);\n }\n _left(object, pointerId) {\n return !this._currentFrameObjectToPointers.has(object) && this._objectWasUnderPointer(object, pointerId);\n }\n /**\n * Manually associate a pointer id with an object.\n *\n * This assumes you've checked that the pointer is indeed over the object.\n */\n addPointerToObject(object, pointerId) {\n const maybeProxy = this._objectToProxy.get(object);\n if (maybeProxy) {\n this._addPointerToProxy(maybeProxy, pointerId);\n }\n }\n _addPointerToProxy(object, pointerId) {\n if (!this._currentFrameObjectToPointers.has(object)) {\n this._currentFrameObjectToPointers.set(object, [pointerId]);\n return;\n }\n const pointers = this._currentFrameObjectToPointers.get(object);\n this._currentFrameObjectToPointers.set(object, pointers.concat(pointerId));\n }\n /**\n * Dispatches the appropriate pointer events in sortedObject order on tracked objects\n * @param receiver\n * @param sortedObjects\n */\n dispatchEvents(receiver, sortedObjects) {\n const lastFrameEntities = new Set(this._lastFrameObjectToPointers.keys());\n const currentFrameEntities = new Set(this._currentFrameObjectToPointers.keys());\n // Filter preserves z order\n let lastMovePerPointer;\n let lastUpPerPointer;\n let lastDownPerPointer;\n // Dispatch events in proxy z order\n for (let i = 0; i < sortedObjects.length; i++) {\n const object = sortedObjects[i];\n const proxy = this._getProxy(object);\n if (hasNestedEvents(object)) {\n object._dispatchPointerEvents(receiver);\n }\n if (lastFrameEntities.has(proxy) || currentFrameEntities.has(proxy)) {\n lastDownPerPointer = this._processDownAndEmit(receiver, proxy);\n lastUpPerPointer = this._processUpAndEmit(receiver, proxy);\n lastMovePerPointer = this._processMoveAndEmit(receiver, proxy);\n const lastUpDownMoveEvents = [...lastMovePerPointer.values(), ...lastDownPerPointer.values(), ...lastUpPerPointer.values()];\n this._processEnterLeaveAndEmit(receiver, proxy, lastUpDownMoveEvents);\n this._processCancelAndEmit(receiver, proxy);\n this._processWheelAndEmit(receiver, proxy);\n }\n }\n }\n /**\n * Given the tracked objects, update pointer containment given the provided contains()\n * @param receiver\n * @param objects\n */\n processPointerToObject(receiver, objects) {\n // Pre-process find entities under pointers\n for (let objectIndex = 0; objectIndex < objects.length; objectIndex++) {\n const object = objects[objectIndex];\n const proxy = this._getProxy(object);\n if (hasNestedEvents(object)) {\n object._processPointerToObject(receiver);\n }\n for (const [pointerId, pos] of receiver.currentFramePointerCoords.entries()) {\n if (proxy.contains(pos)) {\n this._addPointerToProxy(proxy, pointerId);\n }\n }\n }\n }\n /**\n * Clear current frames pointer-object associations and track last frame pointer-object associations\n */\n clear() {\n this._lastFrameObjectToPointers.clear();\n this._lastFrameObjectToPointers = new Map(this._currentFrameObjectToPointers);\n this._currentFrameObjectToPointers.clear();\n }\n _processDownAndEmit(receiver, object) {\n const lastDownPerPointer = new Map();\n // Loop through down and dispatch to entities\n for (const event of receiver.currentFrameDown) {\n if (event.active && this._objectCurrentlyUnderPointer(object, event.pointerId)) {\n object.events.emit('pointerdown', event);\n if (receiver.isDragStart(event.pointerId)) {\n object.events.emit('pointerdragstart', event);\n }\n }\n lastDownPerPointer.set(event.pointerId, event);\n }\n return lastDownPerPointer;\n }\n _processUpAndEmit(receiver, object) {\n const lastUpPerPointer = new Map();\n // Loop through up and dispatch to entities\n for (const event of receiver.currentFrameUp) {\n if (event.active && this._objectCurrentlyUnderPointer(object, event.pointerId)) {\n object.events.emit('pointerup', event);\n if (receiver.isDragEnd(event.pointerId)) {\n object.events.emit('pointerdragend', event);\n }\n }\n lastUpPerPointer.set(event.pointerId, event);\n }\n return lastUpPerPointer;\n }\n _processMoveAndEmit(receiver, object) {\n const lastMovePerPointer = new Map();\n // Loop through move and dispatch to entities\n for (const event of receiver.currentFrameMove) {\n if (event.active && object.active() && this._objectCurrentlyUnderPointer(object, event.pointerId)) {\n // move\n object.events.emit('pointermove', event);\n if (receiver.isDragging(event.pointerId)) {\n object.events.emit('pointerdragmove', event);\n }\n }\n lastMovePerPointer.set(event.pointerId, event);\n }\n return lastMovePerPointer;\n }\n _processEnterLeaveAndEmit(receiver, object, lastUpDownMoveEvents) {\n // up, down, and move are considered for enter and leave\n for (const event of lastUpDownMoveEvents) {\n // enter\n if (event.active && object.active() && this._entered(object, event.pointerId)) {\n object.events.emit('pointerenter', event);\n if (receiver.isDragging(event.pointerId)) {\n object.events.emit('pointerdragenter', event);\n }\n break;\n }\n if (event.active &&\n object.active() &&\n // leave can happen on move\n (this._left(object, event.pointerId) ||\n // or leave can happen on pointer up\n (this._objectCurrentlyUnderPointer(object, event.pointerId) && event.type === 'up'))) {\n object.events.emit('pointerleave', event);\n if (receiver.isDragging(event.pointerId)) {\n object.events.emit('pointerdragleave', event);\n }\n break;\n }\n }\n }\n _processCancelAndEmit(receiver, object) {\n // cancel\n for (const event of receiver.currentFrameCancel) {\n if (event.active && object.active() && this._objectCurrentlyUnderPointer(object, event.pointerId)) {\n object.events.emit('pointercancel', event);\n }\n }\n }\n _processWheelAndEmit(receiver, object) {\n // wheel\n for (const event of receiver.currentFrameWheel) {\n // Currently the wheel only fires under the primary pointer '0'\n if (event.active && object.active() && this._objectCurrentlyUnderPointer(object, 0)) {\n object.events.emit('pointerwheel', event);\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Input/PointerScope.ts\":\n/*!*******************************!*\\\n !*** ./Input/PointerScope.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerScope: () => (/* binding */ PointerScope)\n/* harmony export */ });\n/**\n * Determines the scope of handling mouse/touch events.\n */\nvar PointerScope;\n(function (PointerScope) {\n /**\n * Handle events on the `canvas` element only. Events originating outside the\n * `canvas` will not be handled.\n */\n PointerScope[\"Canvas\"] = \"Canvas\";\n /**\n * Handles events on the entire document. All events will be handled by Excalibur.\n */\n PointerScope[\"Document\"] = \"Document\";\n})(PointerScope || (PointerScope = {}));\n\n\n/***/ }),\n\n/***/ \"./Input/PointerSystem.ts\":\n/*!********************************!*\\\n !*** ./Input/PointerSystem.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerSystem: () => (/* binding */ PointerSystem)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Priority.ts\");\n/* harmony import */ var _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Graphics/GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _PointerComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./PointerComponent */ \"./Input/PointerComponent.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Math/coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _Collision_Detection_SparseHashGrid__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Collision/Detection/SparseHashGrid */ \"./Collision/Detection/SparseHashGrid.ts\");\n/* harmony import */ var _PointerEventsToObjectDispatcher__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./PointerEventsToObjectDispatcher */ \"./Input/PointerEventsToObjectDispatcher.ts\");\n\n\n\n\n\n\n/**\n * The PointerSystem is responsible for dispatching pointer events to entities\n * that need them.\n *\n * The PointerSystem can be optionally configured by the {@apilink PointerComponent}, by default Entities use\n * the {@apilink Collider}'s shape for pointer events.\n */\nclass PointerSystem extends _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_0__.System {\n constructor(world) {\n super();\n this.world = world;\n this.systemType = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_0__.SystemType.Update;\n this._graphicsHashGrid = new _Collision_Detection_SparseHashGrid__WEBPACK_IMPORTED_MODULE_1__.SparseHashGrid({ size: 100 });\n this._graphics = [];\n this._entityToPointer = new Map();\n this._pointerEventDispatcher = new _PointerEventsToObjectDispatcher__WEBPACK_IMPORTED_MODULE_2__.PointerEventsToObjectDispatcher();\n /**\n * Optionally override component configuration for all entities\n */\n this.overrideUseColliderShape = false;\n /**\n * Optionally override component configuration for all entities\n */\n this.overrideUseGraphicsBounds = false;\n this._sortedTransforms = [];\n this._sortedEntities = [];\n this._zHasChanged = false;\n this._zIndexUpdate = () => {\n this._zHasChanged = true;\n };\n this.query = this.world.query([_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_3__.TransformComponent, _PointerComponent__WEBPACK_IMPORTED_MODULE_4__.PointerComponent]);\n this.query.entityAdded$.subscribe((e) => {\n const tx = e.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_3__.TransformComponent);\n const pointer = e.get(_PointerComponent__WEBPACK_IMPORTED_MODULE_4__.PointerComponent);\n this._pointerEventDispatcher.addObject(e, (pos) => {\n // If pointer bounds defined\n if (pointer && pointer.localBounds) {\n const pointerBounds = pointer.localBounds.transform(tx.get().matrix);\n return pointerBounds.contains(tx.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_5__.CoordPlane.World ? pos.worldPos : pos.screenPos);\n }\n return false;\n }, () => e.isActive);\n this._entityToPointer.set(e, pointer);\n const maybeGfx = e.get(_Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_6__.GraphicsComponent);\n if (maybeGfx) {\n this._graphics.push(maybeGfx);\n this._graphicsHashGrid.track(maybeGfx);\n }\n this._sortedTransforms.push(tx);\n this._sortedEntities.push(tx.owner);\n tx.zIndexChanged$.subscribe(this._zIndexUpdate);\n this._zHasChanged = true;\n });\n this.query.entityRemoved$.subscribe((e) => {\n this._pointerEventDispatcher.removeObject(e);\n const tx = e.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_3__.TransformComponent);\n this._entityToPointer.delete(e);\n const maybeGfx = e.get(_Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_6__.GraphicsComponent);\n if (maybeGfx) {\n const index = this._graphics.indexOf(maybeGfx);\n if (index > -1) {\n this._graphics.splice(index, 1);\n }\n this._graphicsHashGrid.untrack(maybeGfx);\n }\n tx.zIndexChanged$.unsubscribe(this._zIndexUpdate);\n const index = this._sortedTransforms.indexOf(tx);\n if (index > -1) {\n this._sortedTransforms.splice(index, 1);\n this._sortedEntities.splice(index, 1);\n }\n });\n }\n initialize(world, scene) {\n this._engine = scene.engine;\n this._scene = scene;\n }\n preupdate() {\n if (this._scene.camera.hasChanged()) {\n // if the camera has changed we want to force a transform update so pointers can be correctly calc'd\n this._scene.camera.updateTransform(this._scene.camera.pos);\n }\n // event receiver might change per frame\n this._receivers = [this._engine.input.pointers, this._scene.input.pointers];\n this._engineReceiver = this._engine.input.pointers;\n if (this._zHasChanged) {\n this._sortedTransforms.sort((a, b) => {\n return b.z - a.z;\n });\n this._sortedEntities = this._sortedTransforms.map((t) => t.owner);\n this._zHasChanged = false;\n }\n }\n update() {\n // Update graphics\n this._graphicsHashGrid.update(this._graphics);\n // Locate all the pointer/entity mappings\n for (const [pointerId, pos] of this._engineReceiver.currentFramePointerCoords.entries()) {\n const colliders = this._scene.physics.query(pos.worldPos);\n for (let i = 0; i < colliders.length; i++) {\n const collider = colliders[i];\n const maybePointer = this._entityToPointer.get(collider.owner);\n if (maybePointer && (maybePointer.useColliderShape || this.overrideUseColliderShape)) {\n this._pointerEventDispatcher.addPointerToObject(collider.owner, pointerId);\n }\n }\n const graphics = this._graphicsHashGrid.query(pos.worldPos);\n for (let i = 0; i < graphics.length; i++) {\n const graphic = graphics[i];\n const maybePointer = this._entityToPointer.get(graphic.owner);\n if (maybePointer && (maybePointer.useGraphicsBounds || this.overrideUseGraphicsBounds)) {\n this._pointerEventDispatcher.addPointerToObject(graphic.owner, pointerId);\n }\n }\n }\n this._pointerEventDispatcher.processPointerToObject(this._engineReceiver, this._sortedEntities);\n // Dispatch pointer events on entities\n this._pointerEventDispatcher.dispatchEvents(this._engineReceiver, this._sortedEntities);\n // Dispatch pointer events on top level pointers\n this._receivers.forEach((r) => r.update());\n // Clear last frame's events\n this._pointerEventDispatcher.clear();\n this._receivers.forEach((r) => r.clear());\n }\n}\nPointerSystem.priority = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_7__.SystemPriority.Higher;\n\n\n/***/ }),\n\n/***/ \"./Input/PointerType.ts\":\n/*!******************************!*\\\n !*** ./Input/PointerType.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerType: () => (/* binding */ PointerType)\n/* harmony export */ });\n/**\n * The type of pointer for a {@apilink PointerEvent}.\n */\nvar PointerType;\n(function (PointerType) {\n PointerType[\"Touch\"] = \"Touch\";\n PointerType[\"Mouse\"] = \"Mouse\";\n PointerType[\"Pen\"] = \"Pen\";\n PointerType[\"Unknown\"] = \"Unknown\";\n})(PointerType || (PointerType = {}));\n\n\n/***/ }),\n\n/***/ \"./Input/WheelDeltaMode.ts\":\n/*!*********************************!*\\\n !*** ./Input/WheelDeltaMode.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ WheelDeltaMode: () => (/* binding */ WheelDeltaMode)\n/* harmony export */ });\nvar WheelDeltaMode;\n(function (WheelDeltaMode) {\n WheelDeltaMode[\"Pixel\"] = \"Pixel\";\n WheelDeltaMode[\"Line\"] = \"Line\";\n WheelDeltaMode[\"Page\"] = \"Page\";\n})(WheelDeltaMode || (WheelDeltaMode = {}));\n\n\n/***/ }),\n\n/***/ \"./Input/WheelEvent.ts\":\n/*!*****************************!*\\\n !*** ./Input/WheelEvent.ts ***!\n \\*****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ WheelEvent: () => (/* binding */ WheelEvent)\n/* harmony export */ });\nclass WheelEvent {\n cancel() {\n this.active = false;\n }\n constructor(x, y, pageX, pageY, screenX, screenY, index, deltaX, deltaY, deltaZ, deltaMode, ev) {\n this.x = x;\n this.y = y;\n this.pageX = pageX;\n this.pageY = pageY;\n this.screenX = screenX;\n this.screenY = screenY;\n this.index = index;\n this.deltaX = deltaX;\n this.deltaY = deltaY;\n this.deltaZ = deltaZ;\n this.deltaMode = deltaMode;\n this.ev = ev;\n this.active = true;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Interfaces/AudioImplementation.ts\":\n/*!*******************************************!*\\\n !*** ./Interfaces/AudioImplementation.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ExResponse: () => (/* binding */ ExResponse)\n/* harmony export */ });\nclass ExResponse {\n}\nExResponse.type = {\n any: '',\n blob: 'blob',\n json: 'json',\n text: 'text',\n document: 'document',\n arraybuffer: 'arraybuffer'\n};\n\n\n/***/ }),\n\n/***/ \"./Interfaces/Index.ts\":\n/*!*****************************!*\\\n !*** ./Interfaces/Index.ts ***!\n \\*****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ExResponse: () => (/* reexport safe */ _AudioImplementation__WEBPACK_IMPORTED_MODULE_0__.ExResponse),\n/* harmony export */ hasOnAdd: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.hasOnAdd),\n/* harmony export */ hasOnInitialize: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.hasOnInitialize),\n/* harmony export */ hasOnPostUpdate: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.hasOnPostUpdate),\n/* harmony export */ hasOnPreUpdate: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.hasOnPreUpdate),\n/* harmony export */ hasOnRemove: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.hasOnRemove),\n/* harmony export */ hasPostDraw: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.hasPostDraw),\n/* harmony export */ hasPreDraw: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.hasPreDraw),\n/* harmony export */ has_add: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.has_add),\n/* harmony export */ has_initialize: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.has_initialize),\n/* harmony export */ has_postupdate: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.has_postupdate),\n/* harmony export */ has_preupdate: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.has_preupdate),\n/* harmony export */ has_remove: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.has_remove)\n/* harmony export */ });\n/* harmony import */ var _AudioImplementation__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AudioImplementation */ \"./Interfaces/AudioImplementation.ts\");\n/* harmony import */ var _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./LifecycleEvents */ \"./Interfaces/LifecycleEvents.ts\");\n\n\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Interfaces/LifecycleEvents.ts\":\n/*!***************************************!*\\\n !*** ./Interfaces/LifecycleEvents.ts ***!\n \\***************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ hasOnAdd: () => (/* binding */ hasOnAdd),\n/* harmony export */ hasOnInitialize: () => (/* binding */ hasOnInitialize),\n/* harmony export */ hasOnPostUpdate: () => (/* binding */ hasOnPostUpdate),\n/* harmony export */ hasOnPreUpdate: () => (/* binding */ hasOnPreUpdate),\n/* harmony export */ hasOnRemove: () => (/* binding */ hasOnRemove),\n/* harmony export */ hasPostDraw: () => (/* binding */ hasPostDraw),\n/* harmony export */ hasPreDraw: () => (/* binding */ hasPreDraw),\n/* harmony export */ has_add: () => (/* binding */ has_add),\n/* harmony export */ has_initialize: () => (/* binding */ has_initialize),\n/* harmony export */ has_postupdate: () => (/* binding */ has_postupdate),\n/* harmony export */ has_preupdate: () => (/* binding */ has_preupdate),\n/* harmony export */ has_remove: () => (/* binding */ has_remove)\n/* harmony export */ });\n/**\n * Type guard checking for internal initialize method\n * @internal\n * @param a\n */\nfunction has_initialize(a) {\n return !!a._initialize;\n}\n/**\n *\n */\nfunction has_add(a) {\n return !!a.onAdd;\n}\n/**\n *\n */\nfunction has_remove(a) {\n return !!a.onRemove;\n}\n/**\n *\n */\nfunction hasOnInitialize(a) {\n return !!a.onInitialize;\n}\n/**\n *\n */\nfunction has_preupdate(a) {\n return !!a._preupdate;\n}\n/**\n *\n */\nfunction hasOnPreUpdate(a) {\n return !!a.onPreUpdate;\n}\n/**\n *\n */\nfunction has_postupdate(a) {\n return !!a.onPostUpdate;\n}\n/**\n *\n */\nfunction hasOnPostUpdate(a) {\n return !!a.onPostUpdate;\n}\n/**\n *\n */\nfunction hasOnAdd(a) {\n return !!a.onAdd;\n}\n/**\n *\n */\nfunction hasOnRemove(a) {\n return !!a.onRemove;\n}\n/**\n *\n */\nfunction hasPreDraw(a) {\n return !!a.onPreDraw;\n}\n/**\n *\n */\nfunction hasPostDraw(a) {\n return !!a.onPostDraw;\n}\n\n\n/***/ }),\n\n/***/ \"./Label.ts\":\n/*!******************!*\\\n !*** ./Label.ts ***!\n \\******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Label: () => (/* binding */ Label)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Graphics_Text__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Graphics/Text */ \"./Graphics/Text.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Graphics */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Graphics_Font__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Graphics/Font */ \"./Graphics/Font.ts\");\n/* harmony import */ var _Actor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Actor */ \"./Actor.ts\");\n\n\n\n\n\n/**\n * Labels are the way to draw small amounts of text to the screen. They are\n * actors and inherit all of the benefits and capabilities.\n */\nclass Label extends _Actor__WEBPACK_IMPORTED_MODULE_0__.Actor {\n set maxWidth(width) {\n this._text.maxWidth = width;\n }\n get maxWidth() {\n return this._text.maxWidth;\n }\n get font() {\n return this._font;\n }\n set font(newFont) {\n this._font = newFont;\n this._text.font = newFont;\n }\n /**\n * The text to draw.\n */\n get text() {\n return this._text.text;\n }\n set text(text) {\n this._text.text = text;\n }\n get color() {\n return this._text.color;\n }\n set color(color) {\n if (this._text) {\n this._text.color = color;\n }\n }\n get opacity() {\n return this.graphics.opacity;\n }\n set opacity(opacity) {\n this.graphics.opacity = opacity;\n }\n /**\n * The {@apilink SpriteFont} to use, if any. Overrides {@apilink Font | `font`} if present.\n */\n get spriteFont() {\n return this._spriteFont;\n }\n set spriteFont(sf) {\n if (sf) {\n this._spriteFont = sf;\n this._text.font = this._spriteFont;\n }\n }\n /**\n * Build a new label\n * @param options\n */\n constructor(options) {\n super(options);\n this._font = new _Graphics_Font__WEBPACK_IMPORTED_MODULE_1__.Font();\n this._text = new _Graphics_Text__WEBPACK_IMPORTED_MODULE_2__.Text({ text: '', font: this._font });\n const { text, pos, x, y, spriteFont, font, color, maxWidth } = { text: '', ...options };\n this.pos = pos !== null && pos !== void 0 ? pos : (x && y ? (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(x, y) : this.pos);\n this.text = text !== null && text !== void 0 ? text : this.text;\n this.font = font !== null && font !== void 0 ? font : this.font;\n this.maxWidth = maxWidth !== null && maxWidth !== void 0 ? maxWidth : this.maxWidth;\n this.spriteFont = spriteFont !== null && spriteFont !== void 0 ? spriteFont : this.spriteFont;\n this._text.color = color !== null && color !== void 0 ? color : this.color;\n const gfx = this.get(_Graphics__WEBPACK_IMPORTED_MODULE_4__.GraphicsComponent);\n gfx.anchor = _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero;\n gfx.use(this._text);\n }\n _initialize(engine) {\n super._initialize(engine);\n }\n /**\n * Returns the width of the text in the label (in pixels);\n */\n getTextWidth() {\n return this._text.width;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/Random.ts\":\n/*!************************!*\\\n !*** ./Math/Random.ts ***!\n \\************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Random: () => (/* binding */ Random)\n/* harmony export */ });\n/**\n * @module\n * Pseudo-Random Utility\n *\n * A pseudo-random utility to add seeded random support for help in\n * generating things like terrain or reproducible randomness. Uses the\n * [Mersenne Twister](https://en.wikipedia.org/wiki/Mersenne_Twister) algorithm.\n */\n/**\n * 32-bit mask\n */\nconst BITMASK32 = 0xffffffff;\n/**\n * Pseudo-random number generator following the Mersenne_Twister algorithm. Given a seed this generator will produce the same sequence\n * of numbers each time it is called.\n * See https://en.wikipedia.org/wiki/Mersenne_Twister for more details.\n * Uses the MT19937-32 (2002) implementation documented here http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/emt19937ar.html\n *\n * Api inspired by http://chancejs.com/# https://github.com/chancejs/chancejs\n */\nclass Random {\n /**\n * If no seed is specified, the Date.now() is used\n */\n constructor(seed) {\n this.seed = seed;\n // Separation point of one one word, the number of bits in the lower bitmask 0 <= r <= w-1\n this._lowerMask = 0x7fffffff; // 31 bits same as _r\n this._upperMask = 0x80000000; // 34 high bits\n // Word size, 64 bits\n this._w = 32;\n // Degree of recurrence\n this._n = 624;\n // Middle word, an offset used in the recurrence defining the series x, 1<=m>> 0;\n for (let i = 1; i < this._n; i++) {\n const s = this._mt[i - 1] ^ (this._mt[i - 1] >>> (this._w - 2));\n // numbers are bigger than the JS max safe int, add in 16-bit chunks to prevent IEEE rounding errors on high bits\n this._mt[i] = (((this._f * ((s & 0xffff0000) >>> 16)) << 16) + this._f * (s & 0xffff) + i) >>> 0;\n }\n this._index = this._n;\n }\n /**\n * Apply the twist\n */\n _twist() {\n const mag01 = [0x0, this._a];\n let y = 0, i = 0;\n for (; i < this._n - this._m; i++) {\n y = (this._mt[i] & this._upperMask) | (this._mt[i + 1] & this._lowerMask);\n this._mt[i] = this._mt[i + this._m] ^ (y >>> 1) ^ (mag01[y & 0x1] & BITMASK32);\n }\n for (; i < this._n - 1; i++) {\n y = (this._mt[i] & this._upperMask) | (this._mt[i + 1] & this._lowerMask);\n this._mt[i] = this._mt[i + (this._m - this._n)] ^ (y >>> 1) ^ (mag01[y & 0x1] & BITMASK32);\n }\n y = (this._mt[this._n - 1] & this._upperMask) | (this._mt[0] & this._lowerMask);\n this._mt[this._n - 1] = this._mt[this._m - 1] ^ (y >>> 1) ^ (mag01[y & 0x1] & BITMASK32);\n this._index = 0;\n }\n /**\n * Return next 32 bit integer number in sequence\n */\n nextInt() {\n if (this._index >= this._n) {\n this._twist();\n }\n let y = this._mt[this._index++];\n y ^= y >>> this._u;\n y ^= (y << this._s) & this._b;\n y ^= (y << this._t) & this._c;\n y ^= y >>> this._l;\n return y >>> 0;\n }\n /**\n * Return a random floating point number between [0, 1)\n */\n next() {\n return this.nextInt() * (1.0 / 4294967296.0); // divided by 2^32\n }\n /**\n * Return a random floating point in range [min, max) min is included, max is not included\n */\n floating(min, max) {\n return (max - min) * this.next() + min;\n }\n /**\n * Return a random integer in range [min, max] min is included, max is included.\n * Implemented with rejection sampling, see https://medium.com/@betable/tifu-by-using-math-random-f1c308c4fd9d#.i13tdiu5a\n */\n integer(min, max) {\n return Math.floor((max - min + 1) * this.next() + min);\n }\n /**\n * Returns true or false randomly with 50/50 odds by default.\n * By default the likelihood of returning a true is .5 (50%).\n * @param likelihood takes values between [0, 1]\n */\n bool(likelihood = 0.5) {\n return this.next() <= likelihood;\n }\n /**\n * Returns one element from an array at random\n */\n pickOne(array) {\n return array[this.integer(0, array.length - 1)];\n }\n /**\n * Returns a new array random picking elements from the original\n * @param array Original array to pick from\n * @param numPicks can be any positive number\n * @param allowDuplicates indicates whether the returned set is allowed duplicates (it does not mean there will always be duplicates\n * just that it is possible)\n */\n pickSet(array, numPicks, allowDuplicates = false) {\n if (allowDuplicates) {\n return this._pickSetWithDuplicates(array, numPicks);\n }\n else {\n return this._pickSetWithoutDuplicates(array, numPicks);\n }\n }\n /**\n * Returns a new array randomly picking elements in the original (not reused)\n * @param array Array to pick elements out of\n * @param numPicks must be less than or equal to the number of elements in the array.\n */\n _pickSetWithoutDuplicates(array, numPicks) {\n if (numPicks > array.length || numPicks < 0) {\n throw new Error('Invalid number of elements to pick, must pick a value 0 < n <= length');\n }\n if (numPicks === array.length) {\n return array;\n }\n const result = new Array(numPicks);\n let currentPick = 0;\n const tempArray = array.slice(0);\n while (currentPick < numPicks) {\n const index = this.integer(0, tempArray.length - 1);\n result[currentPick++] = tempArray[index];\n tempArray.splice(index, 1);\n }\n return result;\n }\n /**\n * Returns a new array random picking elements from the original allowing duplicates\n * @param array Array to pick elements out of\n * @param numPicks can be any positive number\n */\n _pickSetWithDuplicates(array, numPicks) {\n // Typescript numbers are all floating point, so do we add check for int? (or floor the input?)\n if (numPicks < 0) {\n throw new Error('Invalid number of elements to pick, must pick a value 0 <= n < MAX_INT');\n }\n const result = new Array(numPicks);\n for (let i = 0; i < numPicks; i++) {\n result[i] = this.pickOne(array);\n }\n return result;\n }\n /**\n * Returns a new array that has its elements shuffled. Using the Fisher/Yates method\n * https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle\n */\n shuffle(array) {\n const tempArray = array.slice(0);\n let swap;\n for (let i = 0; i < tempArray.length - 2; i++) {\n const randomIndex = this.integer(i, tempArray.length - 1);\n swap = tempArray[i];\n tempArray[i] = tempArray[randomIndex];\n tempArray[randomIndex] = swap;\n }\n return tempArray;\n }\n /**\n * Generate a list of random integer numbers\n * @param length the length of the final array\n * @param min the minimum integer number to generate inclusive\n * @param max the maximum integer number to generate inclusive\n */\n range(length, min, max) {\n const result = new Array(length);\n for (let i = 0; i < length; i++) {\n result[i] = this.integer(min, max);\n }\n return result;\n }\n /**\n * Returns the result of a d4 dice roll\n */\n d4() {\n return this.integer(1, 4);\n }\n /**\n * Returns the result of a d6 dice roll\n */\n d6() {\n return this.integer(1, 6);\n }\n /**\n * Returns the result of a d8 dice roll\n */\n d8() {\n return this.integer(1, 8);\n }\n /**\n * Returns the result of a d10 dice roll\n */\n d10() {\n return this.integer(1, 10);\n }\n /**\n * Returns the result of a d12 dice roll\n */\n d12() {\n return this.integer(1, 12);\n }\n /**\n * Returns the result of a d20 dice roll\n */\n d20() {\n return this.integer(1, 20);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/affine-matrix.ts\":\n/*!*******************************!*\\\n !*** ./Math/affine-matrix.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AffineMatrix: () => (/* binding */ AffineMatrix)\n/* harmony export */ });\n/* harmony import */ var _matrix__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./matrix */ \"./Math/matrix.ts\");\n/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./util */ \"./Math/util.ts\");\n/* harmony import */ var _vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vector */ \"./Math/vector.ts\");\n\n\n\nclass AffineMatrix {\n constructor() {\n /**\n * | | | |\n * | ------- | ------- | -------- |\n * | data[0] | data[2] | data[4] |\n * | data[1] | data[3] | data[5] |\n * | 0 | 0 | 1 |\n */\n this.data = new Float64Array(6);\n this._scale = new Float64Array([1, 1]);\n this._scaleSignX = 1;\n this._scaleSignY = 1;\n }\n /**\n * Converts the current matrix into a DOMMatrix\n *\n * This is useful when working with the browser Canvas context\n * @returns {DOMMatrix} DOMMatrix\n */\n toDOMMatrix() {\n return new DOMMatrix([...this.data]);\n }\n static identity() {\n const mat = new AffineMatrix();\n mat.data[0] = 1;\n mat.data[1] = 0;\n mat.data[2] = 0;\n mat.data[3] = 1;\n mat.data[4] = 0;\n mat.data[5] = 0;\n return mat;\n }\n /**\n * Creates a brand new translation matrix at the specified 3d point\n * @param x\n * @param y\n */\n static translation(x, y) {\n const mat = AffineMatrix.identity();\n mat.data[4] = x;\n mat.data[5] = y;\n return mat;\n }\n /**\n * Creates a brand new scaling matrix with the specified scaling factor\n * @param sx\n * @param sy\n */\n static scale(sx, sy) {\n const mat = AffineMatrix.identity();\n mat.data[0] = sx;\n mat.data[3] = sy;\n mat._scale[0] = sx;\n mat._scale[1] = sy;\n return mat;\n }\n /**\n * Creates a brand new rotation matrix with the specified angle in radians\n * @param angle\n */\n static rotation(angle) {\n const mat = AffineMatrix.identity();\n mat.data[0] = Math.cos(angle);\n mat.data[1] = Math.sin(angle);\n mat.data[2] = -Math.sin(angle);\n mat.data[3] = Math.cos(angle);\n return mat;\n }\n setPosition(x, y) {\n this.data[4] = x;\n this.data[5] = y;\n }\n getPosition() {\n return (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.data[4], this.data[5]);\n }\n /**\n * Applies rotation to the current matrix mutating it\n * @param angle in Radians\n */\n rotate(angle) {\n const a11 = this.data[0];\n const a21 = this.data[1];\n const a12 = this.data[2];\n const a22 = this.data[3];\n const sine = Math.sin(angle);\n const cosine = Math.cos(angle);\n this.data[0] = cosine * a11 + sine * a12;\n this.data[1] = cosine * a21 + sine * a22;\n this.data[2] = cosine * a12 - sine * a11;\n this.data[3] = cosine * a22 - sine * a21;\n return this;\n }\n /**\n * Applies translation to the current matrix mutating it\n * @param x\n * @param y\n */\n translate(x, y) {\n const a11 = this.data[0];\n const a21 = this.data[1];\n // const a31 = 0;\n const a12 = this.data[2];\n const a22 = this.data[3];\n // const a32 = 0;\n const a13 = this.data[4];\n const a23 = this.data[5];\n // const a33 = 1;\n // Doesn't change z\n this.data[4] = a11 * x + a12 * y + a13;\n this.data[5] = a21 * x + a22 * y + a23;\n return this;\n }\n /**\n * Applies scaling to the current matrix mutating it\n * @param x\n * @param y\n */\n scale(x, y) {\n const a11 = this.data[0];\n const a21 = this.data[1];\n const a12 = this.data[2];\n const a22 = this.data[3];\n this.data[0] = a11 * x;\n this.data[1] = a21 * x;\n this.data[2] = a12 * y;\n this.data[3] = a22 * y;\n this._scale[0] = x;\n this._scale[1] = y;\n this._scaleSignX = (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(x);\n this._scaleSignY = (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(y);\n return this;\n }\n determinant() {\n return this.data[0] * this.data[3] - this.data[1] * this.data[2];\n }\n /**\n * Return the affine inverse, optionally store it in a target matrix.\n *\n * It's recommended you call .reset() the target unless you know what you're doing\n * @param target\n */\n inverse(target) {\n // See http://negativeprobability.blogspot.com/2011/11/affine-transformations-and-their.html\n // See https://www.mathsisfun.com/algebra/matrix-inverse.html\n // Since we are actually only doing 2D transformations we can use this hack\n // We don't actually use the 3rd or 4th dimension\n const det = this.determinant();\n let inverseDet = det; // default to a zero matrix if we have a singular matrix\n if (det !== 0) {\n inverseDet = 1 / det;\n }\n const a = this.data[0];\n const b = this.data[2];\n const c = this.data[1];\n const d = this.data[3];\n const m = target || AffineMatrix.identity();\n // inverts rotation and scale\n m.data[0] = d * inverseDet;\n m.data[1] = -c * inverseDet;\n m.data[2] = -b * inverseDet;\n m.data[3] = a * inverseDet;\n const tx = this.data[4];\n const ty = this.data[5];\n // invert translation\n // transform translation into the matrix basis created by rot/scale\n m.data[4] = -(tx * m.data[0] + ty * m.data[2]);\n m.data[5] = -(tx * m.data[1] + ty * m.data[3]);\n return m;\n }\n multiply(vectorOrMatrix, dest) {\n if (vectorOrMatrix instanceof _vector__WEBPACK_IMPORTED_MODULE_0__.Vector) {\n const result = dest || new _vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\n const vector = vectorOrMatrix;\n // these shenanigans are to allow dest and vector to be the same instance\n const resultX = vector.x * this.data[0] + vector.y * this.data[2] + this.data[4];\n const resultY = vector.x * this.data[1] + vector.y * this.data[3] + this.data[5];\n result.x = resultX;\n result.y = resultY;\n return result;\n }\n else {\n const result = dest || new AffineMatrix();\n const other = vectorOrMatrix;\n const a11 = this.data[0];\n const a21 = this.data[1];\n // const a31 = 0;\n const a12 = this.data[2];\n const a22 = this.data[3];\n // const a32 = 0;\n const a13 = this.data[4];\n const a23 = this.data[5];\n // const a33 = 1;\n const b11 = other.data[0];\n const b21 = other.data[1];\n // const b31 = 0;\n const b12 = other.data[2];\n const b22 = other.data[3];\n // const b32 = 0;\n const b13 = other.data[4];\n const b23 = other.data[5];\n // const b33 = 1;\n result.data[0] = a11 * b11 + a12 * b21; // + a13 * b31; // zero\n result.data[1] = a21 * b11 + a22 * b21; // + a23 * b31; // zero\n result.data[2] = a11 * b12 + a12 * b22; // + a13 * b32; // zero\n result.data[3] = a21 * b12 + a22 * b22; // + a23 * b32; // zero\n result.data[4] = a11 * b13 + a12 * b23 + a13; // * b33; // one\n result.data[5] = a21 * b13 + a22 * b23 + a23; // * b33; // one\n const signX = this._scaleSignX;\n const signY = this._scaleSignY;\n result._scaleSignX = signX * (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(result._scaleSignX);\n result._scaleSignY = signY * (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(result._scaleSignY);\n return result;\n }\n }\n /**\n * Packed array of length 8, that contains 4 vertices, with 2 components each\n * So: [x0, y0, x1, y1, x2, y2, x3, y3]\n * @param quad\n */\n multiplyQuadInPlace(quad) {\n const resultTopLeftX = quad[0] * this.data[0] + quad[1] * this.data[2] + this.data[4];\n const resultTopLeftY = quad[0] * this.data[1] + quad[1] * this.data[3] + this.data[5];\n quad[0] = resultTopLeftX;\n quad[1] = resultTopLeftY;\n const resultTopRightX = quad[2] * this.data[0] + quad[3] * this.data[2] + this.data[4];\n const resultTopRightY = quad[2] * this.data[1] + quad[3] * this.data[3] + this.data[5];\n quad[2] = resultTopRightX;\n quad[3] = resultTopRightY;\n const resultBottomLeftX = quad[4] * this.data[0] + quad[5] * this.data[2] + this.data[4];\n const resultBottomLeftY = quad[4] * this.data[1] + quad[5] * this.data[3] + this.data[5];\n quad[4] = resultBottomLeftX;\n quad[5] = resultBottomLeftY;\n const resultBottomRightX = quad[6] * this.data[0] + quad[7] * this.data[2] + this.data[4];\n const resultBottomRightY = quad[6] * this.data[1] + quad[7] * this.data[3] + this.data[5];\n quad[6] = resultBottomRightX;\n quad[7] = resultBottomRightY;\n }\n to4x4() {\n const mat = new _matrix__WEBPACK_IMPORTED_MODULE_2__.Matrix();\n mat.data[0] = this.data[0];\n mat.data[1] = this.data[1];\n mat.data[2] = 0;\n mat.data[3] = 0;\n mat.data[4] = this.data[2];\n mat.data[5] = this.data[3];\n mat.data[6] = 0;\n mat.data[7] = 0;\n mat.data[8] = 0;\n mat.data[9] = 0;\n mat.data[10] = 1;\n mat.data[11] = 0;\n mat.data[12] = this.data[4];\n mat.data[13] = this.data[5];\n mat.data[14] = 0;\n mat.data[15] = 1;\n return mat;\n }\n setRotation(angle) {\n const currentScale = this.getScale();\n const sine = Math.sin(angle);\n const cosine = Math.cos(angle);\n this.data[0] = cosine * currentScale.x;\n this.data[1] = sine * currentScale.y;\n this.data[2] = -sine * currentScale.x;\n this.data[3] = cosine * currentScale.y;\n }\n getRotation() {\n const angle = Math.atan2(this.data[1] / this.getScaleY(), this.data[0] / this.getScaleX());\n return (0,_util__WEBPACK_IMPORTED_MODULE_1__.canonicalizeAngle)(angle);\n }\n getScaleX() {\n // absolute scale of the matrix (we lose sign so need to add it back)\n const xScaleSq = this.data[0] * this.data[0] + this.data[2] * this.data[2];\n if (xScaleSq === 1.0) {\n // usually there isn't scale so we can avoid a sqrt\n return this._scaleSignX;\n }\n return this._scaleSignX * Math.sqrt(xScaleSq);\n }\n getScaleY() {\n // absolute scale of the matrix (we lose sign so need to add it back)\n const yScaleSq = this.data[1] * this.data[1] + this.data[3] * this.data[3];\n if (yScaleSq === 1.0) {\n // usually there isn't scale so we can avoid a sqrt\n return this._scaleSignY;\n }\n return this._scaleSignY * Math.sqrt(yScaleSq);\n }\n /**\n * Get the scale of the matrix\n */\n getScale() {\n return (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.getScaleX(), this.getScaleY());\n }\n setScaleX(val) {\n if (val === this._scale[0]) {\n return;\n }\n this._scaleSignX = (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(val);\n // negative scale acts like a 180 rotation, so flip\n const xscale = (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.data[0] * this._scaleSignX, this.data[2] * this._scaleSignX).normalize();\n this.data[0] = xscale.x * val;\n this.data[2] = xscale.y * val;\n this._scale[0] = val;\n }\n setScaleY(val) {\n if (val === this._scale[1]) {\n return;\n }\n this._scaleSignY = (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(val);\n // negative scale acts like a 180 rotation, so flip\n const yscale = (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.data[1] * this._scaleSignY, this.data[3] * this._scaleSignY).normalize();\n this.data[1] = yscale.x * val;\n this.data[3] = yscale.y * val;\n this._scale[1] = val;\n }\n setScale(scale) {\n this.setScaleX(scale.x);\n this.setScaleY(scale.y);\n }\n isIdentity() {\n return this.data[0] === 1 && this.data[1] === 0 && this.data[2] === 0 && this.data[3] === 1 && this.data[4] === 0 && this.data[5] === 0;\n }\n /**\n * Resets the current matrix to the identity matrix, mutating it\n * @returns {AffineMatrix} Current matrix as identity\n */\n reset() {\n const mat = this;\n mat.data[0] = 1;\n mat.data[1] = 0;\n mat.data[2] = 0;\n mat.data[3] = 1;\n mat.data[4] = 0;\n mat.data[5] = 0;\n return mat;\n }\n /**\n * Creates a new Matrix with the same data as the current {@apilink AffineMatrix}\n */\n clone(dest) {\n const mat = dest || new AffineMatrix();\n mat.data[0] = this.data[0];\n mat.data[1] = this.data[1];\n mat.data[2] = this.data[2];\n mat.data[3] = this.data[3];\n mat.data[4] = this.data[4];\n mat.data[5] = this.data[5];\n mat._scaleSignX = this._scaleSignX;\n mat._scaleSignY = this._scaleSignY;\n return mat;\n }\n toString() {\n return `\r\n[${this.data[0]} ${this.data[2]} ${this.data[4]}]\r\n[${this.data[1]} ${this.data[3]} ${this.data[5]}]\r\n[0 0 1]\r\n`;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/bezier-curve.ts\":\n/*!******************************!*\\\n !*** ./Math/bezier-curve.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BezierCurve: () => (/* binding */ BezierCurve)\n/* harmony export */ });\n/* harmony import */ var _lerp__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./lerp */ \"./Math/lerp.ts\");\n\n/**\n * BezierCurve that supports cubic Bezier curves.\n */\nclass BezierCurve {\n constructor(options) {\n var _a;\n // Thanks Freya! https://www.youtube.com/watch?v=aVwxzDHniEw\n this._distLookup = [];\n this.quality = 4;\n if (options.controlPoints.length !== 4) {\n throw new Error('Only cubic bezier curves are supported');\n }\n this._controlPoints = [...options.controlPoints];\n this.quality = (_a = options.quality) !== null && _a !== void 0 ? _a : this.quality;\n this._calculateLookup();\n }\n get arcLength() {\n return this._arcLength;\n }\n get controlPoints() {\n return this._controlPoints;\n }\n set controlPoints(points) {\n this._controlPoints = [...points];\n this._calculateLookup();\n }\n setControlPoint(index, point) {\n this._controlPoints[index] = point;\n this._calculateLookup();\n }\n _calculateLookup() {\n let totalLength = 0;\n this._distLookup.length = 0;\n let prev = this.controlPoints[0];\n const n = this.controlPoints.length * this.quality;\n for (let i = 0; i < n; i++) {\n const t = i / (n - 1);\n const pt = this.getPoint(t);\n const diff = prev.distance(pt);\n totalLength += diff;\n this._distLookup.push(totalLength);\n prev = pt;\n }\n this._arcLength = totalLength;\n }\n _getTimeGivenDistance(distance) {\n const n = this._distLookup.length;\n const arcLength = this.arcLength;\n if (distance >= 0 && distance < arcLength) {\n for (let i = 0; i < n - 1; i++) {\n if (this._distLookup[i] <= distance && distance < this._distLookup[i + 1]) {\n return (0,_lerp__WEBPACK_IMPORTED_MODULE_0__.remap)(this._distLookup[i], this._distLookup[i + 1], i / (n - 1), (i + 1) / (n - 1), distance);\n }\n }\n }\n return distance / arcLength;\n }\n /**\n * Get the point on the Bezier curve at a certain time\n * @param time Between 0-1\n */\n getPoint(time) {\n const points = [...this.controlPoints];\n for (let r = 1; r < points.length; r++) {\n for (let i = 0; i < points.length - r; i++) {\n points[i] = (0,_lerp__WEBPACK_IMPORTED_MODULE_0__.lerpVector)(points[i], points[i + 1], time);\n }\n }\n return points[0];\n }\n /**\n * Get the tangent of the Bezier curve at a certain time\n * @param time Between 0-1\n */\n getTangent(time) {\n const timeSquared = time * time;\n const p0 = this.controlPoints[0];\n const p1 = this.controlPoints[1];\n const p2 = this.controlPoints[2];\n const p3 = this.controlPoints[3];\n // Derivative of Bernstein polynomial\n const pPrime = p0\n .scale(-3 * timeSquared + 6 * time - 3)\n .add(p1.scale(9 * timeSquared - 12 * time + 3).add(p2.scale(-9 * timeSquared + 6 * time).add(p3.scale(3 * timeSquared))));\n return pPrime.normalize();\n }\n /**\n * Get the tangent of the Bezier curve where the distance is uniformly distributed over time\n * @param time\n */\n getUniformTangent(time) {\n const desiredDistance = time * this.arcLength;\n const uniformTime = this._getTimeGivenDistance(desiredDistance);\n return this.getTangent(uniformTime);\n }\n /**\n * Get the normal of the Bezier curve at a certain time\n * @param time Between 0-1\n */\n getNormal(time) {\n return this.getTangent(time).normal();\n }\n /**\n * Get the normal of the Bezier curve where the distance is uniformly distributed over time\n * @param time\n */\n getUniformNormal(time) {\n return this.getUniformTangent(time).normal();\n }\n /**\n * Points are spaced uniformly across the length of the curve over time\n * @param time\n */\n getUniformPoint(time) {\n const desiredDistance = time * this.arcLength;\n const uniformTime = this._getTimeGivenDistance(desiredDistance);\n return this.getPoint(uniformTime);\n }\n clone() {\n return new BezierCurve({\n controlPoints: [...this.controlPoints],\n quality: this.quality\n });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/coord-plane.ts\":\n/*!*****************************!*\\\n !*** ./Math/coord-plane.ts ***!\n \\*****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CoordPlane: () => (/* binding */ CoordPlane)\n/* harmony export */ });\n/**\n * Enum representing the coordinate plane for the position 2D vector in the {@apilink TransformComponent}\n */\nvar CoordPlane;\n(function (CoordPlane) {\n /**\n * The world coordinate plane (default) represents world space, any entities drawn with world\n * space move when the camera moves.\n */\n CoordPlane[\"World\"] = \"world\";\n /**\n * The screen coordinate plane represents screen space, entities drawn in screen space are pinned\n * to screen coordinates ignoring the camera.\n */\n CoordPlane[\"Screen\"] = \"screen\";\n})(CoordPlane || (CoordPlane = {}));\n\n\n/***/ }),\n\n/***/ \"./Math/global-coordinates.ts\":\n/*!************************************!*\\\n !*** ./Math/global-coordinates.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ GlobalCoordinates: () => (/* binding */ GlobalCoordinates)\n/* harmony export */ });\n/* harmony import */ var _vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vector */ \"./Math/vector.ts\");\n\nclass GlobalCoordinates {\n static fromPagePosition(xOrPos, yOrEngine, engineOrUndefined) {\n let pageX;\n let pageY;\n let pagePos;\n let engine;\n if (arguments.length === 3) {\n pageX = xOrPos;\n pageY = yOrEngine;\n pagePos = new _vector__WEBPACK_IMPORTED_MODULE_0__.Vector(pageX, pageY);\n engine = engineOrUndefined;\n }\n else {\n pagePos = xOrPos;\n pageX = pagePos.x;\n pageY = pagePos.y;\n engine = yOrEngine;\n }\n const screenPos = engine.screen.pageToScreenCoordinates(pagePos);\n const worldPos = engine.screen.screenToWorldCoordinates(screenPos);\n return new GlobalCoordinates(worldPos, pagePos, screenPos);\n }\n constructor(worldPos, pagePos, screenPos) {\n this.worldPos = worldPos;\n this.pagePos = pagePos;\n this.screenPos = screenPos;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/index.ts\":\n/*!***********************!*\\\n !*** ./Math/index.ts ***!\n \\***********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AffineMatrix: () => (/* reexport safe */ _affine_matrix__WEBPACK_IMPORTED_MODULE_3__.AffineMatrix),\n/* harmony export */ BezierCurve: () => (/* reexport safe */ _bezier_curve__WEBPACK_IMPORTED_MODULE_12__.BezierCurve),\n/* harmony export */ CoordPlane: () => (/* reexport safe */ _coord_plane__WEBPACK_IMPORTED_MODULE_5__.CoordPlane),\n/* harmony export */ GlobalCoordinates: () => (/* reexport safe */ _global_coordinates__WEBPACK_IMPORTED_MODULE_7__.GlobalCoordinates),\n/* harmony export */ LineSegment: () => (/* reexport safe */ _line_segment__WEBPACK_IMPORTED_MODULE_8__.LineSegment),\n/* harmony export */ Matrix: () => (/* reexport safe */ _matrix__WEBPACK_IMPORTED_MODULE_2__.Matrix),\n/* harmony export */ MatrixLocations: () => (/* reexport safe */ _matrix__WEBPACK_IMPORTED_MODULE_2__.MatrixLocations),\n/* harmony export */ Projection: () => (/* reexport safe */ _projection__WEBPACK_IMPORTED_MODULE_9__.Projection),\n/* harmony export */ Random: () => (/* reexport safe */ _Random__WEBPACK_IMPORTED_MODULE_6__.Random),\n/* harmony export */ Ray: () => (/* reexport safe */ _ray__WEBPACK_IMPORTED_MODULE_10__.Ray),\n/* harmony export */ RotationType: () => (/* reexport safe */ _rotation_type__WEBPACK_IMPORTED_MODULE_14__.RotationType),\n/* harmony export */ Transform: () => (/* reexport safe */ _transform__WEBPACK_IMPORTED_MODULE_4__.Transform),\n/* harmony export */ TwoPI: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.TwoPI),\n/* harmony export */ Vector: () => (/* reexport safe */ _vector__WEBPACK_IMPORTED_MODULE_0__.Vector),\n/* harmony export */ VectorView: () => (/* reexport safe */ _vector_view__WEBPACK_IMPORTED_MODULE_1__.VectorView),\n/* harmony export */ approximatelyEqual: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.approximatelyEqual),\n/* harmony export */ canonicalizeAngle: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.canonicalizeAngle),\n/* harmony export */ clamp: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.clamp),\n/* harmony export */ frac: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.frac),\n/* harmony export */ inverseLerp: () => (/* reexport safe */ _lerp__WEBPACK_IMPORTED_MODULE_11__.inverseLerp),\n/* harmony export */ inverseLerpVector: () => (/* reexport safe */ _lerp__WEBPACK_IMPORTED_MODULE_11__.inverseLerpVector),\n/* harmony export */ lerp: () => (/* reexport safe */ _lerp__WEBPACK_IMPORTED_MODULE_11__.lerp),\n/* harmony export */ lerpAngle: () => (/* reexport safe */ _lerp__WEBPACK_IMPORTED_MODULE_11__.lerpAngle),\n/* harmony export */ lerpVector: () => (/* reexport safe */ _lerp__WEBPACK_IMPORTED_MODULE_11__.lerpVector),\n/* harmony export */ randomInRange: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.randomInRange),\n/* harmony export */ randomIntInRange: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.randomIntInRange),\n/* harmony export */ range: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.range),\n/* harmony export */ remap: () => (/* reexport safe */ _lerp__WEBPACK_IMPORTED_MODULE_11__.remap),\n/* harmony export */ remapVector: () => (/* reexport safe */ _lerp__WEBPACK_IMPORTED_MODULE_11__.remapVector),\n/* harmony export */ sign: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.sign),\n/* harmony export */ toDegrees: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.toDegrees),\n/* harmony export */ toRadians: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.toRadians),\n/* harmony export */ vec: () => (/* reexport safe */ _vector__WEBPACK_IMPORTED_MODULE_0__.vec)\n/* harmony export */ });\n/* harmony import */ var _vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vector */ \"./Math/vector.ts\");\n/* harmony import */ var _vector_view__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./vector-view */ \"./Math/vector-view.ts\");\n/* harmony import */ var _matrix__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./matrix */ \"./Math/matrix.ts\");\n/* harmony import */ var _affine_matrix__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./affine-matrix */ \"./Math/affine-matrix.ts\");\n/* harmony import */ var _transform__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./transform */ \"./Math/transform.ts\");\n/* harmony import */ var _coord_plane__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _Random__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Random */ \"./Math/Random.ts\");\n/* harmony import */ var _global_coordinates__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./global-coordinates */ \"./Math/global-coordinates.ts\");\n/* harmony import */ var _line_segment__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./line-segment */ \"./Math/line-segment.ts\");\n/* harmony import */ var _projection__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./projection */ \"./Math/projection.ts\");\n/* harmony import */ var _ray__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./ray */ \"./Math/ray.ts\");\n/* harmony import */ var _lerp__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./lerp */ \"./Math/lerp.ts\");\n/* harmony import */ var _bezier_curve__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./bezier-curve */ \"./Math/bezier-curve.ts\");\n/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./util */ \"./Math/util.ts\");\n/* harmony import */ var _rotation_type__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./rotation-type */ \"./Math/rotation-type.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Math/lerp.ts\":\n/*!**********************!*\\\n !*** ./Math/lerp.ts ***!\n \\**********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ inverseLerp: () => (/* binding */ inverseLerp),\n/* harmony export */ inverseLerpVector: () => (/* binding */ inverseLerpVector),\n/* harmony export */ lerp: () => (/* binding */ lerp),\n/* harmony export */ lerpAngle: () => (/* binding */ lerpAngle),\n/* harmony export */ lerpVector: () => (/* binding */ lerpVector),\n/* harmony export */ remap: () => (/* binding */ remap),\n/* harmony export */ remapVector: () => (/* binding */ remapVector)\n/* harmony export */ });\n/* harmony import */ var _rotation_type__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./rotation-type */ \"./Math/rotation-type.ts\");\n/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./util */ \"./Math/util.ts\");\n\n\n/**\n * Linear interpolation between `a` and `b`, at `time = 0` the value will be `a` at `time = 1` the value will be `b`\n * @param a\n * @param b\n * @param time\n */\nfunction lerp(a, b, time) {\n return (1 - time) * a + b * time;\n}\n/**\n * Linear interpolation between angles in radians\n * @param startAngle\n * @param endAngle\n * @param rotationType\n * @param time\n */\nfunction lerpAngle(startAngle, endAngle, rotationType, time) {\n const shortestPathIsPositive = (startAngle - endAngle + _util__WEBPACK_IMPORTED_MODULE_0__.TwoPI) % _util__WEBPACK_IMPORTED_MODULE_0__.TwoPI >= Math.PI;\n const distance1 = Math.abs(endAngle - startAngle);\n const distance2 = _util__WEBPACK_IMPORTED_MODULE_0__.TwoPI - distance1;\n let shortDistance = 0;\n let longDistance = 0;\n if (distance1 > distance2) {\n shortDistance = distance2;\n longDistance = distance1;\n }\n else {\n shortDistance = distance1;\n longDistance = distance2;\n }\n let distance = 0;\n let direction = 1;\n switch (rotationType) {\n case _rotation_type__WEBPACK_IMPORTED_MODULE_1__.RotationType.ShortestPath:\n distance = shortDistance;\n direction = shortestPathIsPositive ? 1 : -1;\n break;\n case _rotation_type__WEBPACK_IMPORTED_MODULE_1__.RotationType.LongestPath:\n distance = longDistance;\n direction = shortestPathIsPositive ? -1 : 1;\n break;\n case _rotation_type__WEBPACK_IMPORTED_MODULE_1__.RotationType.Clockwise:\n direction = 1;\n distance = shortestPathIsPositive ? shortDistance : longDistance;\n break;\n case _rotation_type__WEBPACK_IMPORTED_MODULE_1__.RotationType.CounterClockwise:\n direction = -1;\n distance = shortestPathIsPositive ? longDistance : shortDistance;\n break;\n }\n return startAngle + direction * (distance * time);\n}\n/**\n * Linear interpolation between `a` and `b`, at `time = 0` the value will be `a` at `time = 1` the value will be `b`\n * @param a\n * @param b\n * @param time\n */\nfunction lerpVector(a, b, time) {\n return a.scale(1 - time).add(b.scale(time));\n}\n/**\n * Inverse of a linear interpolation, given a `value` in between `a` and `b` return how close to `a` or `b` the `value` is.\n *\n * Example: `a=1`, `b=5`, `value=4` will return `.75`\n * @param a\n * @param b\n * @param value\n */\nfunction inverseLerp(a, b, value) {\n return (value - a) / (b - a);\n}\n/**\n * Inverse of a linear interpolation, given a `value` in between `a` and `b` return how close to `a` or `b` the `value` is.\n *\n * **Warning** assumes that the `value` vector is co-linear with vector `a` and `b`\n *\n * Example: `a=1`, `b=5`, `value=4` will return `.75`\n * @param a\n * @param b\n * @param value\n */\nfunction inverseLerpVector(a, b, value) {\n const numerator = value.sub(a);\n const denominator = b.sub(a);\n const x = numerator.x / denominator.x;\n const y = numerator.y / denominator.y;\n return Math.min(x, y);\n}\n/**\n * Remaps a value from a source domain to a destination\n * @param minSource\n * @param maxSource\n * @param minDestination\n * @param maxDestination\n * @param value\n */\nfunction remap(minSource, maxSource, minDestination, maxDestination, value) {\n const time = inverseLerp(minSource, maxSource, value);\n return lerp(minDestination, maxDestination, time);\n}\n/**\n * Remaps a value from a source domain to a destination\n *\n * **Warning** assumes that the `value` vector is co-linear with vector `minSource` and `maxSource`\n * @param minSource\n * @param maxSource\n * @param minDestination\n * @param maxDestination\n * @param value\n */\nfunction remapVector(minSource, maxSource, minDestination, maxDestination, value) {\n const time = inverseLerpVector(minSource, maxSource, value);\n return lerpVector(minDestination, maxDestination, time);\n}\n\n\n/***/ }),\n\n/***/ \"./Math/line-segment.ts\":\n/*!******************************!*\\\n !*** ./Math/line-segment.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ LineSegment: () => (/* binding */ LineSegment)\n/* harmony export */ });\n/* harmony import */ var _vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vector */ \"./Math/vector.ts\");\n\n/**\n * A 2D line segment\n */\nclass LineSegment {\n /**\n * @param begin The starting point of the line segment\n * @param end The ending point of the line segment\n */\n constructor(begin, end) {\n this.begin = begin;\n this.end = end;\n }\n clone(dest) {\n const result = dest || new LineSegment(this.begin.clone(), this.end.clone());\n result.begin = this.begin.clone(result.begin);\n result.end = this.end.clone(result.end);\n return result;\n }\n transform(matrix, dest) {\n const result = dest || new LineSegment(_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero, _vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero);\n result.begin = matrix.multiply(this.begin, result.begin);\n result.end = matrix.multiply(this.end, result.end);\n return result;\n }\n /**\n * Gets the raw slope (m) of the line. Will return (+/-)Infinity for vertical lines.\n */\n get slope() {\n return (this.end.y - this.begin.y) / (this.end.x - this.begin.x);\n }\n /**\n * Gets the Y-intercept (b) of the line. Will return (+/-)Infinity if there is no intercept.\n */\n get intercept() {\n return this.begin.y - this.slope * this.begin.x;\n }\n /**\n * Gets the normal of the line\n */\n normal() {\n if (this._normal) {\n return this._normal;\n }\n return (this._normal = this.end.sub(this.begin).normal());\n }\n dir() {\n if (this._dir) {\n return this._dir;\n }\n return (this._dir = this.end.sub(this.begin));\n }\n getPoints() {\n return [this.begin, this.end];\n }\n /**\n * Returns the slope of the line in the form of a vector of length 1\n */\n getSlope() {\n if (this._slope) {\n return this._slope;\n }\n const begin = this.begin;\n const end = this.end;\n const distance = begin.distance(end);\n return (this._slope = end.sub(begin).scale(1 / distance));\n }\n /**\n * Returns the edge of the line as vector, the length of the vector is the length of the edge\n */\n getEdge() {\n const begin = this.begin;\n const end = this.end;\n return end.sub(begin);\n }\n /**\n * Returns the length of the line segment in pixels\n */\n getLength() {\n const begin = this.begin;\n const end = this.end;\n const distance = begin.distance(end);\n return distance;\n }\n /**\n * Returns the midpoint of the edge\n */\n get midpoint() {\n return this.begin.add(this.end).scale(0.5);\n }\n /**\n * Flips the direction of the line segment\n */\n flip() {\n return new LineSegment(this.end, this.begin);\n }\n /**\n * Tests if a given point is below the line, points in the normal direction above the line are considered above.\n * @param point\n */\n below(point) {\n const above2 = (this.end.x - this.begin.x) * (point.y - this.begin.y) - (this.end.y - this.begin.y) * (point.x - this.begin.x);\n return above2 >= 0;\n }\n /**\n * Returns the clip point\n * @param sideVector Vector that traces the line\n * @param length Length to clip along side\n */\n clip(sideVector, length, normalize = true) {\n let dir = sideVector;\n if (normalize) {\n dir = dir.normalize();\n }\n const near = dir.dot(this.begin) - length;\n const far = dir.dot(this.end) - length;\n const results = [];\n if (near <= 0) {\n results.push(this.begin);\n }\n if (far <= 0) {\n results.push(this.end);\n }\n if (near * far < 0) {\n const clipTime = near / (near - far);\n results.push(this.begin.add(this.end.sub(this.begin).scale(clipTime)));\n }\n if (results.length !== 2) {\n return null;\n }\n return new LineSegment(results[0], results[1]);\n }\n /**\n * Find the perpendicular distance from the line to a point\n * https://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line\n * @param point\n */\n distanceToPoint(point, signed = false) {\n const x0 = point.x;\n const y0 = point.y;\n const l = this.getLength();\n const dy = this.end.y - this.begin.y;\n const dx = this.end.x - this.begin.x;\n const distance = (dy * x0 - dx * y0 + this.end.x * this.begin.y - this.end.y * this.begin.x) / l;\n return signed ? distance : Math.abs(distance);\n }\n /**\n * Find the perpendicular line from the line to a point\n * https://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line\n * (a - p) - ((a - p) * n)n\n * a is a point on the line\n * p is the arbitrary point above the line\n * n is a unit vector in direction of the line\n * @param point\n */\n findVectorToPoint(point) {\n const aMinusP = this.begin.sub(point);\n const n = this.getSlope();\n return aMinusP.sub(n.scale(aMinusP.dot(n)));\n }\n /**\n * Finds a point on the line given only an X or a Y value. Given an X value, the function returns\n * a new point with the calculated Y value and vice-versa.\n * @param x The known X value of the target point\n * @param y The known Y value of the target point\n * @returns A new point with the other calculated axis value\n */\n findPoint(x = null, y = null) {\n const m = this.slope;\n const b = this.intercept;\n if (x !== null) {\n return new _vector__WEBPACK_IMPORTED_MODULE_0__.Vector(x, m * x + b);\n }\n else if (y !== null) {\n return new _vector__WEBPACK_IMPORTED_MODULE_0__.Vector((y - b) / m, y);\n }\n else {\n throw new Error('You must provide an X or a Y value');\n }\n }\n /**\n * @see http://stackoverflow.com/a/11908158/109458\n */\n hasPoint() {\n let currPoint;\n let threshold = 0;\n if (typeof arguments[0] === 'number' && typeof arguments[1] === 'number') {\n currPoint = new _vector__WEBPACK_IMPORTED_MODULE_0__.Vector(arguments[0], arguments[1]);\n threshold = arguments[2] || 0;\n }\n else if (arguments[0] instanceof _vector__WEBPACK_IMPORTED_MODULE_0__.Vector) {\n currPoint = arguments[0];\n threshold = arguments[1] || 0;\n }\n else {\n throw 'Could not determine the arguments for Vector.hasPoint';\n }\n const dxc = currPoint.x - this.begin.x;\n const dyc = currPoint.y - this.begin.y;\n const dx1 = this.end.x - this.begin.x;\n const dy1 = this.end.y - this.begin.y;\n const cross = dxc * dy1 - dyc * dx1;\n // check whether point lines on the line\n if (Math.abs(cross) > threshold) {\n return false;\n }\n // check whether point lies in-between start and end\n if (Math.abs(dx1) >= Math.abs(dy1)) {\n return dx1 > 0 ? this.begin.x <= currPoint.x && currPoint.x <= this.end.x : this.end.x <= currPoint.x && currPoint.x <= this.begin.x;\n }\n else {\n return dy1 > 0 ? this.begin.y <= currPoint.y && currPoint.y <= this.end.y : this.end.y <= currPoint.y && currPoint.y <= this.begin.y;\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/matrix.ts\":\n/*!************************!*\\\n !*** ./Math/matrix.ts ***!\n \\************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Matrix: () => (/* binding */ Matrix),\n/* harmony export */ MatrixLocations: () => (/* binding */ MatrixLocations)\n/* harmony export */ });\n/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./util */ \"./Math/util.ts\");\n/* harmony import */ var _vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vector */ \"./Math/vector.ts\");\n\n\n\nvar MatrixLocations;\n(function (MatrixLocations) {\n MatrixLocations[MatrixLocations[\"X\"] = 12] = \"X\";\n MatrixLocations[MatrixLocations[\"Y\"] = 13] = \"Y\";\n})(MatrixLocations || (MatrixLocations = {}));\n/**\n * Excalibur Matrix helper for 4x4 matrices\n *\n * Useful for webgl 4x4 matrices\n */\nclass Matrix {\n constructor() {\n /**\n * 4x4 matrix in column major order\n *\n * | | | | |\n * | ------- | ------- | -------- | -------- |\n * | data[0] | data[4] | data[8] | data[12] |\n * | data[1] | data[5] | data[9] | data[13] |\n * | data[2] | data[6] | data[10] | data[14] |\n * | data[3] | data[7] | data[11] | data[15] |\n *\n */\n this.data = new Float32Array(16);\n this._scaleX = 1;\n this._scaleSignX = 1;\n this._scaleY = 1;\n this._scaleSignY = 1;\n }\n /**\n * Creates an orthographic (flat non-perspective) projection\n * https://en.wikipedia.org/wiki/Orthographic_projection\n * @param left\n * @param right\n * @param bottom\n * @param top\n * @param near\n * @param far\n */\n static ortho(left, right, bottom, top, near, far) {\n const mat = new Matrix();\n mat.data[0] = 2 / (right - left);\n mat.data[1] = 0;\n mat.data[2] = 0;\n mat.data[3] = 0;\n mat.data[4] = 0;\n mat.data[5] = 2 / (top - bottom);\n mat.data[6] = 0;\n mat.data[7] = 0;\n mat.data[8] = 0;\n mat.data[9] = 0;\n mat.data[10] = -2 / (far - near);\n mat.data[11] = 0;\n mat.data[12] = -(right + left) / (right - left);\n mat.data[13] = -(top + bottom) / (top - bottom);\n mat.data[14] = -(far + near) / (far - near);\n mat.data[15] = 1;\n return mat;\n }\n /**\n * Creates a new Matrix with the same data as the current 4x4\n */\n clone(dest) {\n const mat = dest || new Matrix();\n mat.data[0] = this.data[0];\n mat.data[1] = this.data[1];\n mat.data[2] = this.data[2];\n mat.data[3] = this.data[3];\n mat.data[4] = this.data[4];\n mat.data[5] = this.data[5];\n mat.data[6] = this.data[6];\n mat.data[7] = this.data[7];\n mat.data[8] = this.data[8];\n mat.data[9] = this.data[9];\n mat.data[10] = this.data[10];\n mat.data[11] = this.data[11];\n mat.data[12] = this.data[12];\n mat.data[13] = this.data[13];\n mat.data[14] = this.data[14];\n mat.data[15] = this.data[15];\n return mat;\n }\n /**\n * Converts the current matrix into a DOMMatrix\n *\n * This is useful when working with the browser Canvas context\n * @returns {DOMMatrix} DOMMatrix\n */\n toDOMMatrix() {\n return new DOMMatrix([...this.data]);\n }\n static fromFloat32Array(data) {\n const matrix = new Matrix();\n matrix.data = data;\n return matrix;\n }\n /**\n * Creates a new identity matrix (a matrix that when applied does nothing)\n */\n static identity() {\n const mat = new Matrix();\n mat.data[0] = 1;\n mat.data[1] = 0;\n mat.data[2] = 0;\n mat.data[3] = 0;\n mat.data[4] = 0;\n mat.data[5] = 1;\n mat.data[6] = 0;\n mat.data[7] = 0;\n mat.data[8] = 0;\n mat.data[9] = 0;\n mat.data[10] = 1;\n mat.data[11] = 0;\n mat.data[12] = 0;\n mat.data[13] = 0;\n mat.data[14] = 0;\n mat.data[15] = 1;\n return mat;\n }\n /**\n * Resets the current matrix to the identity matrix, mutating it\n * @returns {Matrix} Current matrix as identity\n */\n reset() {\n const mat = this;\n mat.data[0] = 1;\n mat.data[1] = 0;\n mat.data[2] = 0;\n mat.data[3] = 0;\n mat.data[4] = 0;\n mat.data[5] = 1;\n mat.data[6] = 0;\n mat.data[7] = 0;\n mat.data[8] = 0;\n mat.data[9] = 0;\n mat.data[10] = 1;\n mat.data[11] = 0;\n mat.data[12] = 0;\n mat.data[13] = 0;\n mat.data[14] = 0;\n mat.data[15] = 1;\n return mat;\n }\n /**\n * Creates a brand new translation matrix at the specified 3d point\n * @param x\n * @param y\n */\n static translation(x, y) {\n const mat = Matrix.identity();\n mat.data[12] = x;\n mat.data[13] = y;\n return mat;\n }\n /**\n * Creates a brand new scaling matrix with the specified scaling factor\n * @param sx\n * @param sy\n */\n static scale(sx, sy) {\n const mat = Matrix.identity();\n mat.data[0] = sx;\n mat.data[5] = sy;\n mat.data[10] = 1;\n mat.data[15] = 1;\n return mat;\n }\n /**\n * Creates a brand new rotation matrix with the specified angle in radians\n * @param angle\n */\n static rotation(angle) {\n const mat = Matrix.identity();\n mat.data[0] = Math.cos(angle);\n mat.data[4] = -Math.sin(angle);\n mat.data[1] = Math.sin(angle);\n mat.data[5] = Math.cos(angle);\n return mat;\n }\n multiply(vectorOrMatrix, dest) {\n if (vectorOrMatrix instanceof _vector__WEBPACK_IMPORTED_MODULE_0__.Vector) {\n const result = dest || new _vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\n const vector = vectorOrMatrix;\n // these shenanigans are to allow dest and vector to be the same instance\n const resultX = vector.x * this.data[0] + vector.y * this.data[4] + this.data[12];\n const resultY = vector.x * this.data[1] + vector.y * this.data[5] + this.data[13];\n result.x = resultX;\n result.y = resultY;\n return result;\n }\n else {\n const result = dest || new Matrix();\n const other = vectorOrMatrix;\n const a11 = this.data[0];\n const a21 = this.data[1];\n const a31 = this.data[2];\n const a41 = this.data[3];\n const a12 = this.data[4];\n const a22 = this.data[5];\n const a32 = this.data[6];\n const a42 = this.data[7];\n const a13 = this.data[8];\n const a23 = this.data[9];\n const a33 = this.data[10];\n const a43 = this.data[11];\n const a14 = this.data[12];\n const a24 = this.data[13];\n const a34 = this.data[14];\n const a44 = this.data[15];\n const b11 = other.data[0];\n const b21 = other.data[1];\n const b31 = other.data[2];\n const b41 = other.data[3];\n const b12 = other.data[4];\n const b22 = other.data[5];\n const b32 = other.data[6];\n const b42 = other.data[7];\n const b13 = other.data[8];\n const b23 = other.data[9];\n const b33 = other.data[10];\n const b43 = other.data[11];\n const b14 = other.data[12];\n const b24 = other.data[13];\n const b34 = other.data[14];\n const b44 = other.data[15];\n result.data[0] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n result.data[1] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n result.data[2] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n result.data[3] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n result.data[4] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n result.data[5] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n result.data[6] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n result.data[7] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n result.data[8] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n result.data[9] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n result.data[10] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n result.data[11] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n result.data[12] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n result.data[13] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n result.data[14] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n result.data[15] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n const s = this.getScale();\n result._scaleSignX = (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(s.x) * (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(result._scaleSignX);\n result._scaleSignY = (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(s.y) * (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(result._scaleSignY);\n return result;\n }\n }\n /**\n * Applies translation to the current matrix mutating it\n * @param x\n * @param y\n */\n translate(x, y) {\n const a11 = this.data[0];\n const a21 = this.data[1];\n const a31 = this.data[2];\n const a41 = this.data[3];\n const a12 = this.data[4];\n const a22 = this.data[5];\n const a32 = this.data[6];\n const a42 = this.data[7];\n const a13 = this.data[8];\n const a23 = this.data[9];\n const a33 = this.data[10];\n const a43 = this.data[11];\n const a14 = this.data[12];\n const a24 = this.data[13];\n const a34 = this.data[14];\n const a44 = this.data[15];\n // Doesn't change z\n const z = 0;\n const w = 1;\n this.data[12] = a11 * x + a12 * y + a13 * z + a14 * w;\n this.data[13] = a21 * x + a22 * y + a23 * z + a24 * w;\n this.data[14] = a31 * x + a32 * y + a33 * z + a34 * w;\n this.data[15] = a41 * x + a42 * y + a43 * z + a44 * w;\n return this;\n }\n setPosition(x, y) {\n this.data[12] = x;\n this.data[13] = y;\n }\n getPosition() {\n return (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.data[12], this.data[13]);\n }\n /**\n * Applies rotation to the current matrix mutating it\n * @param angle in Radians\n */\n rotate(angle) {\n const a11 = this.data[0];\n const a21 = this.data[1];\n const a31 = this.data[2];\n const a41 = this.data[3];\n const a12 = this.data[4];\n const a22 = this.data[5];\n const a32 = this.data[6];\n const a42 = this.data[7];\n const sine = Math.sin(angle);\n const cosine = Math.cos(angle);\n this.data[0] = cosine * a11 + sine * a12;\n this.data[1] = cosine * a21 + sine * a22;\n this.data[2] = cosine * a31 + sine * a32;\n this.data[3] = cosine * a41 + sine * a42;\n this.data[4] = cosine * a12 - sine * a11;\n this.data[5] = cosine * a22 - sine * a21;\n this.data[6] = cosine * a32 - sine * a31;\n this.data[7] = cosine * a42 - sine * a41;\n return this;\n }\n /**\n * Applies scaling to the current matrix mutating it\n * @param x\n * @param y\n */\n scale(x, y) {\n const a11 = this.data[0];\n const a21 = this.data[1];\n const a31 = this.data[2];\n const a41 = this.data[3];\n const a12 = this.data[4];\n const a22 = this.data[5];\n const a32 = this.data[6];\n const a42 = this.data[7];\n this.data[0] = a11 * x;\n this.data[1] = a21 * x;\n this.data[2] = a31 * x;\n this.data[3] = a41 * x;\n this.data[4] = a12 * y;\n this.data[5] = a22 * y;\n this.data[6] = a32 * y;\n this.data[7] = a42 * y;\n return this;\n }\n setRotation(angle) {\n const currentScale = this.getScale();\n const sine = Math.sin(angle);\n const cosine = Math.cos(angle);\n this.data[0] = cosine * currentScale.x;\n this.data[1] = sine * currentScale.y;\n this.data[4] = -sine * currentScale.x;\n this.data[5] = cosine * currentScale.y;\n }\n getRotation() {\n const angle = Math.atan2(this.data[1] / this.getScaleY(), this.data[0] / this.getScaleX());\n return (0,_util__WEBPACK_IMPORTED_MODULE_1__.canonicalizeAngle)(angle);\n }\n getScaleX() {\n // absolute scale of the matrix (we lose sign so need to add it back)\n const xscale = (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.data[0], this.data[4]).magnitude;\n return this._scaleSignX * xscale;\n }\n getScaleY() {\n // absolute scale of the matrix (we lose sign so need to add it back)\n const yscale = (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.data[1], this.data[5]).magnitude;\n return this._scaleSignY * yscale;\n }\n /**\n * Get the scale of the matrix\n */\n getScale() {\n return (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.getScaleX(), this.getScaleY());\n }\n setScaleX(val) {\n if (this._scaleX === val) {\n return;\n }\n this._scaleSignX = (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(val);\n // negative scale acts like a 180 rotation, so flip\n const xscale = (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.data[0] * this._scaleSignX, this.data[4] * this._scaleSignX).normalize();\n this.data[0] = xscale.x * val;\n this.data[4] = xscale.y * val;\n this._scaleX = val;\n }\n setScaleY(val) {\n if (this._scaleY === val) {\n return;\n }\n this._scaleSignY = (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(val);\n // negative scale acts like a 180 rotation, so flip\n const yscale = (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.data[1] * this._scaleSignY, this.data[5] * this._scaleSignY).normalize();\n this.data[1] = yscale.x * val;\n this.data[5] = yscale.y * val;\n this._scaleY = val;\n }\n setScale(scale) {\n this.setScaleX(scale.x);\n this.setScaleY(scale.y);\n }\n /**\n * Determinant of the upper left 2x2 matrix\n */\n getBasisDeterminant() {\n return this.data[0] * this.data[5] - this.data[1] * this.data[4];\n }\n /**\n * Return the affine inverse, optionally store it in a target matrix.\n *\n * It's recommended you call .reset() the target unless you know what you're doing\n * @param target\n */\n getAffineInverse(target) {\n // See http://negativeprobability.blogspot.com/2011/11/affine-transformations-and-their.html\n // See https://www.mathsisfun.com/algebra/matrix-inverse.html\n // Since we are actually only doing 2D transformations we can use this hack\n // We don't actually use the 3rd or 4th dimension\n const det = this.getBasisDeterminant();\n const inverseDet = 1 / det; // todo zero check\n const a = this.data[0];\n const b = this.data[4];\n const c = this.data[1];\n const d = this.data[5];\n const m = target || Matrix.identity();\n // inverts rotation and scale\n m.data[0] = d * inverseDet;\n m.data[1] = -c * inverseDet;\n m.data[4] = -b * inverseDet;\n m.data[5] = a * inverseDet;\n const tx = this.data[12];\n const ty = this.data[13];\n // invert translation\n // transform translation into the matrix basis created by rot/scale\n m.data[12] = -(tx * m.data[0] + ty * m.data[4]);\n m.data[13] = -(tx * m.data[1] + ty * m.data[5]);\n return m;\n }\n isIdentity() {\n return (this.data[0] === 1 &&\n this.data[1] === 0 &&\n this.data[2] === 0 &&\n this.data[3] === 0 &&\n this.data[4] === 0 &&\n this.data[5] === 1 &&\n this.data[6] === 0 &&\n this.data[7] === 0 &&\n this.data[8] === 0 &&\n this.data[9] === 0 &&\n this.data[10] === 1 &&\n this.data[11] === 0 &&\n this.data[12] === 0 &&\n this.data[13] === 0 &&\n this.data[14] === 0 &&\n this.data[15] === 1);\n }\n toString() {\n return `\r\n[${this.data[0]} ${this.data[4]} ${this.data[8]} ${this.data[12]}]\r\n[${this.data[1]} ${this.data[5]} ${this.data[9]} ${this.data[13]}]\r\n[${this.data[2]} ${this.data[6]} ${this.data[10]} ${this.data[14]}]\r\n[${this.data[3]} ${this.data[7]} ${this.data[11]} ${this.data[15]}]\r\n`;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/projection.ts\":\n/*!****************************!*\\\n !*** ./Math/projection.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Projection: () => (/* binding */ Projection)\n/* harmony export */ });\n/**\n * A 1 dimensional projection on an axis, used to test overlaps\n */\nclass Projection {\n constructor(min, max) {\n this.min = min;\n this.max = max;\n }\n overlaps(projection) {\n return this.max > projection.min && projection.max > this.min;\n }\n getOverlap(projection) {\n if (this.overlaps(projection)) {\n if (this.max > projection.max) {\n return projection.max - this.min;\n }\n else {\n return this.max - projection.min;\n }\n }\n return 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/ray.ts\":\n/*!*********************!*\\\n !*** ./Math/ray.ts ***!\n \\*********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Ray: () => (/* binding */ Ray)\n/* harmony export */ });\n/**\n * A 2D ray that can be cast into the scene to do collision detection\n */\nclass Ray {\n /**\n * @param pos The starting position for the ray\n * @param dir The vector indicating the direction of the ray\n */\n constructor(pos, dir) {\n this.pos = pos;\n this.dir = dir.normalize();\n }\n /**\n * Tests a whether this ray intersects with a line segment. Returns a number greater than or equal to 0 on success.\n * This number indicates the mathematical intersection time.\n * @param line The line to test\n */\n intersect(line) {\n const numerator = line.begin.sub(this.pos);\n // Test is line and ray are parallel and non intersecting\n if (this.dir.cross(line.getSlope()) === 0 && numerator.cross(this.dir) !== 0) {\n return -1;\n }\n // Lines are parallel\n const divisor = this.dir.cross(line.getSlope());\n if (divisor === 0) {\n return -1;\n }\n const t = numerator.cross(line.getSlope()) / divisor;\n if (t >= 0) {\n const u = numerator.cross(this.dir) / divisor / line.getLength();\n if (u >= 0 && u <= 1) {\n return t;\n }\n }\n return -1;\n }\n intersectPoint(line) {\n const time = this.intersect(line);\n if (time < 0) {\n return null;\n }\n return this.getPoint(time);\n }\n /**\n * Returns the point of intersection given the intersection time\n */\n getPoint(time) {\n return this.pos.add(this.dir.scale(time));\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/rotation-type.ts\":\n/*!*******************************!*\\\n !*** ./Math/rotation-type.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RotationType: () => (/* binding */ RotationType)\n/* harmony export */ });\n/**\n * An enum that describes the strategies that rotation actions can use\n */\nvar RotationType;\n(function (RotationType) {\n /**\n * Rotation via `ShortestPath` will use the smallest angle\n * between the starting and ending points. This strategy is the default behavior.\n */\n RotationType[\"ShortestPath\"] = \"shortest-path\";\n /**\n * Rotation via `LongestPath` will use the largest angle\n * between the starting and ending points.\n */\n RotationType[\"LongestPath\"] = \"longest-path\";\n /**\n * Rotation via `Clockwise` will travel in a clockwise direction,\n * regardless of the starting and ending points.\n */\n RotationType[\"Clockwise\"] = \"clockwise\";\n /**\n * Rotation via `CounterClockwise` will travel in a counterclockwise direction,\n * regardless of the starting and ending points.\n */\n RotationType[\"CounterClockwise\"] = \"counter-clockwise\";\n})(RotationType || (RotationType = {}));\n\n\n/***/ }),\n\n/***/ \"./Math/transform.ts\":\n/*!***************************!*\\\n !*** ./Math/transform.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Transform: () => (/* binding */ Transform)\n/* harmony export */ });\n/* harmony import */ var _affine_matrix__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./affine-matrix */ \"./Math/affine-matrix.ts\");\n/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./util */ \"./Math/util.ts\");\n/* harmony import */ var _vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./vector */ \"./Math/vector.ts\");\n/* harmony import */ var _vector_view__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./vector-view */ \"./Math/vector-view.ts\");\n/* harmony import */ var _watch_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./watch-vector */ \"./Math/watch-vector.ts\");\n\n\n\n\n\nclass Transform {\n constructor() {\n this._parent = null;\n this._children = [];\n this._pos = new _watch_vector__WEBPACK_IMPORTED_MODULE_0__.WatchVector((0,_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0), () => {\n this.flagDirty();\n });\n this._globalPos = new _vector_view__WEBPACK_IMPORTED_MODULE_2__.VectorView({\n getX: () => this.matrix.data[4],\n getY: () => this.matrix.data[5],\n setX: (x) => {\n if (this.parent) {\n const { x: newX } = this.parent.inverse.multiply((0,_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(x, this.pos.y));\n this.pos.x = newX;\n }\n else {\n this.pos.x = x;\n }\n if (x !== this.matrix.data[4]) {\n this.flagDirty();\n }\n },\n setY: (y) => {\n if (this.parent) {\n const { y: newY } = this.parent.inverse.multiply((0,_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(this.pos.x, y));\n this.pos.y = newY;\n }\n else {\n this.pos.y = y;\n }\n if (y !== this.matrix.data[5]) {\n this.flagDirty();\n }\n }\n });\n this._rotation = 0;\n this._scale = new _watch_vector__WEBPACK_IMPORTED_MODULE_0__.WatchVector((0,_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(1, 1), () => {\n this.flagDirty();\n });\n this._globalScale = new _vector_view__WEBPACK_IMPORTED_MODULE_2__.VectorView({\n getX: () => (this.parent ? this.matrix.getScaleX() : this.scale.x),\n getY: () => (this.parent ? this.matrix.getScaleY() : this.scale.y),\n setX: (x) => {\n if (this.parent) {\n const globalScaleX = this.parent.globalScale.x;\n this.scale.x = x / globalScaleX;\n }\n else {\n this.scale.x = x;\n }\n },\n setY: (y) => {\n if (this.parent) {\n const globalScaleY = this.parent.globalScale.y;\n this.scale.y = y / globalScaleY;\n }\n else {\n this.scale.y = y;\n }\n }\n });\n this._z = 0;\n this._isDirty = false;\n this._isInverseDirty = false;\n this._matrix = _affine_matrix__WEBPACK_IMPORTED_MODULE_3__.AffineMatrix.identity();\n this._inverse = _affine_matrix__WEBPACK_IMPORTED_MODULE_3__.AffineMatrix.identity();\n this._scratch = _affine_matrix__WEBPACK_IMPORTED_MODULE_3__.AffineMatrix.identity();\n }\n get parent() {\n return this._parent;\n }\n set parent(transform) {\n if (this._parent) {\n const index = this._parent._children.indexOf(this);\n if (index > -1) {\n this._parent._children.splice(index, 1);\n }\n }\n this._parent = transform;\n if (this._parent) {\n this._parent._children.push(this);\n }\n this.flagDirty();\n }\n get children() {\n return this._children;\n }\n set pos(v) {\n this._pos.x = v.x;\n this._pos.y = v.y;\n }\n get pos() {\n return this._pos;\n }\n set globalPos(v) {\n let localPos = v.clone();\n if (this.parent) {\n localPos = this.parent.inverse.multiply(v);\n }\n if (!localPos.equals(this._pos)) {\n this._pos = localPos;\n this.flagDirty();\n }\n }\n get globalPos() {\n return this._globalPos;\n }\n set rotation(rotation) {\n const canonRotation = (0,_util__WEBPACK_IMPORTED_MODULE_4__.canonicalizeAngle)(rotation);\n if (canonRotation !== this._rotation) {\n this.flagDirty();\n }\n this._rotation = canonRotation;\n }\n get rotation() {\n return this._rotation;\n }\n set globalRotation(rotation) {\n let inverseRotation = 0;\n if (this.parent) {\n inverseRotation = this.parent.globalRotation;\n }\n const canonRotation = (0,_util__WEBPACK_IMPORTED_MODULE_4__.canonicalizeAngle)(rotation + inverseRotation);\n if (canonRotation !== this._rotation) {\n this.flagDirty();\n }\n this._rotation = canonRotation;\n }\n get globalRotation() {\n if (this.parent) {\n return this.matrix.getRotation();\n }\n return this.rotation;\n }\n set scale(v) {\n this._scale.x = v.x;\n this._scale.y = v.y;\n }\n get scale() {\n return this._scale;\n }\n set globalScale(v) {\n let inverseScale = (0,_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(1, 1);\n if (this.parent) {\n inverseScale = this.parent.globalScale;\n }\n this.scale = v.scale((0,_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(1 / inverseScale.x, 1 / inverseScale.y));\n }\n get globalScale() {\n return this._globalScale;\n }\n set z(z) {\n this._z = z;\n this.flagDirty();\n }\n get z() {\n return this._z;\n }\n set globalZ(z) {\n if (this.parent) {\n this.z = z - this.parent.globalZ;\n }\n else {\n this.z = z;\n }\n }\n get globalZ() {\n if (this.parent) {\n return this.z + this.parent.globalZ;\n }\n return this.z;\n }\n /**\n * Calculates and returns the matrix representation of this transform\n *\n * Avoid mutating the matrix to update the transform, it is not the source of truth.\n * Update the transform pos, rotation, scale.\n */\n get matrix() {\n if (this._isDirty) {\n if (this.parent === null) {\n this._calculateMatrix().clone(this._matrix);\n }\n else {\n this.parent.matrix.multiply(this._calculateMatrix()).clone(this._matrix);\n }\n this._isDirty = false;\n }\n return this._matrix;\n }\n /**\n * Calculates and returns the inverse matrix representation of this transform\n */\n get inverse() {\n if (this._isInverseDirty) {\n this.matrix.inverse(this._inverse);\n this._isInverseDirty = false;\n }\n return this._inverse;\n }\n _calculateMatrix() {\n this._scratch.data[0] = Math.cos(this._rotation);\n this._scratch.data[1] = Math.sin(this._rotation);\n this._scratch.data[2] = -Math.sin(this._rotation);\n this._scratch.data[3] = Math.cos(this.rotation);\n this._scratch.data[4] = this._pos.x;\n this._scratch.data[5] = this._pos.y;\n this._scratch.scale(this._scale.x, this._scale.y);\n return this._scratch;\n }\n flagDirty() {\n this._isDirty = true;\n this._isInverseDirty = true;\n for (let i = 0; i < this._children.length; i++) {\n this._children[i].flagDirty();\n }\n }\n apply(point) {\n return this.matrix.multiply(point);\n }\n applyInverse(point) {\n return this.inverse.multiply(point);\n }\n setTransform(pos, rotation, scale) {\n this._pos.x = pos.x;\n this._pos.y = pos.y;\n this._rotation = (0,_util__WEBPACK_IMPORTED_MODULE_4__.canonicalizeAngle)(rotation);\n this._scale.x = scale.x;\n this._scale.y = scale.y;\n this.flagDirty();\n }\n /**\n * Returns true if the transform has a negative x scale or y scale, but not both\n */\n isMirrored() {\n const signBitX = (0,_util__WEBPACK_IMPORTED_MODULE_4__.sign)(this.scale.x) >>> 31;\n const signBitY = (0,_util__WEBPACK_IMPORTED_MODULE_4__.sign)(this.scale.y) >>> 31;\n const mirrored = signBitX ^ signBitY;\n return !!mirrored;\n }\n /**\n * Clones the current transform\n * **Warning does not clone the parent**\n * @param dest\n */\n clone(dest) {\n const target = dest !== null && dest !== void 0 ? dest : new Transform();\n this._pos.clone(target._pos);\n target._z = this._z;\n target._rotation = this._rotation;\n this._scale.clone(target._scale);\n target.flagDirty();\n return target;\n }\n /**\n * Clones but keeps the same parent reference\n */\n cloneWithParent(dest) {\n const target = dest !== null && dest !== void 0 ? dest : new Transform();\n this._pos.clone(target._pos);\n target._z = this._z;\n target._rotation = this._rotation;\n this._scale.clone(target._scale);\n target.parent = this.parent;\n target.flagDirty();\n return target;\n }\n toString() {\n return this.matrix.toString();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/util.ts\":\n/*!**********************!*\\\n !*** ./Math/util.ts ***!\n \\**********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TwoPI: () => (/* binding */ TwoPI),\n/* harmony export */ approximatelyEqual: () => (/* binding */ approximatelyEqual),\n/* harmony export */ canonicalizeAngle: () => (/* binding */ canonicalizeAngle),\n/* harmony export */ clamp: () => (/* binding */ clamp),\n/* harmony export */ frac: () => (/* binding */ frac),\n/* harmony export */ randomInRange: () => (/* binding */ randomInRange),\n/* harmony export */ randomIntInRange: () => (/* binding */ randomIntInRange),\n/* harmony export */ range: () => (/* binding */ range),\n/* harmony export */ sign: () => (/* binding */ sign),\n/* harmony export */ toDegrees: () => (/* binding */ toDegrees),\n/* harmony export */ toRadians: () => (/* binding */ toRadians)\n/* harmony export */ });\n/* harmony import */ var _Random__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Random */ \"./Math/Random.ts\");\n\n/**\n * Two PI constant\n */\nconst TwoPI = Math.PI * 2;\n/**\n * Returns the fractional part of a number\n * @param x\n */\nfunction frac(x) {\n if (x >= 0) {\n return x - Math.floor(x);\n }\n else {\n return x - Math.ceil(x);\n }\n}\n/**\n * Returns the sign of a number, if 0 returns 0\n */\nfunction sign(val) {\n if (val === 0) {\n return 0;\n }\n return val < 0 ? -1 : 1;\n}\n/**\n * Clamps a value between a min and max inclusive\n */\nfunction clamp(val, min, max) {\n return Math.min(Math.max(min, val), max);\n}\n/**\n * Approximately equals\n */\nfunction approximatelyEqual(val1, val2, tolerance) {\n // https://dev.to/alldanielscott/how-to-compare-numbers-correctly-in-javascript-1l4i\n return Math.abs(val1 - val2) < tolerance;\n}\n/**\n * Convert an angle to be the equivalent in the range [0, 2PI)\n */\nfunction canonicalizeAngle(angle) {\n let tmpAngle = angle;\n if (angle >= TwoPI) {\n while (tmpAngle >= TwoPI) {\n tmpAngle -= TwoPI;\n }\n }\n if (angle < 0) {\n while (tmpAngle < 0) {\n tmpAngle += TwoPI;\n }\n }\n return tmpAngle;\n}\n/**\n * Convert radians to degrees\n */\nfunction toDegrees(radians) {\n return (180 / Math.PI) * radians;\n}\n/**\n * Convert degrees to radians\n */\nfunction toRadians(degrees) {\n return (degrees / 180) * Math.PI;\n}\n/**\n * Generate a range of numbers\n * For example: range(0, 5) -> [0, 1, 2, 3, 4, 5]\n * @param from inclusive\n * @param to inclusive\n */\nconst range = (from, to) => Array.from(new Array(to - from + 1), (_x, i) => i + from);\n/**\n * Find a random floating point number in range\n */\nfunction randomInRange(min, max, random = new _Random__WEBPACK_IMPORTED_MODULE_0__.Random()) {\n return random ? random.floating(min, max) : min + Math.random() * (max - min);\n}\n/**\n * Find a random integer in a range\n */\nfunction randomIntInRange(min, max, random = new _Random__WEBPACK_IMPORTED_MODULE_0__.Random()) {\n return random ? random.integer(min, max) : Math.round(randomInRange(min, max));\n}\n\n\n/***/ }),\n\n/***/ \"./Math/vector-view.ts\":\n/*!*****************************!*\\\n !*** ./Math/vector-view.ts ***!\n \\*****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ VectorView: () => (/* binding */ VectorView)\n/* harmony export */ });\n/* harmony import */ var _vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vector */ \"./Math/vector.ts\");\n\nclass VectorView extends _vector__WEBPACK_IMPORTED_MODULE_0__.Vector {\n constructor(options) {\n super(0, 0);\n this._getX = options.getX;\n this._getY = options.getY;\n this._setX = options.setX;\n this._setY = options.setY;\n }\n get x() {\n return (this._x = this._getX());\n }\n set x(val) {\n this._setX(val);\n this._x = val;\n }\n get y() {\n return (this._y = this._getY());\n }\n set y(val) {\n this._setY(val);\n this._y = val;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/vector.ts\":\n/*!************************!*\\\n !*** ./Math/vector.ts ***!\n \\************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Vector: () => (/* binding */ Vector),\n/* harmony export */ vec: () => (/* binding */ vec)\n/* harmony export */ });\n/* harmony import */ var _rotation_type__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./rotation-type */ \"./Math/rotation-type.ts\");\n/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./util */ \"./Math/util.ts\");\n\n\n/**\n * A 2D vector on a plane.\n */\nclass Vector {\n /**\n * A (0, 0) vector\n */\n static get Zero() {\n return new Vector(0, 0);\n }\n /**\n * A (1, 1) vector\n */\n static get One() {\n return new Vector(1, 1);\n }\n /**\n * A (0.5, 0.5) vector\n */\n static get Half() {\n return new Vector(0.5, 0.5);\n }\n /**\n * A unit vector pointing up (0, -1)\n */\n static get Up() {\n return new Vector(0, -1);\n }\n /**\n * A unit vector pointing down (0, 1)\n */\n static get Down() {\n return new Vector(0, 1);\n }\n /**\n * A unit vector pointing left (-1, 0)\n */\n static get Left() {\n return new Vector(-1, 0);\n }\n /**\n * A unit vector pointing right (1, 0)\n */\n static get Right() {\n return new Vector(1, 0);\n }\n /**\n * Returns a vector of unit length in the direction of the specified angle in Radians.\n * @param angle The angle to generate the vector\n */\n static fromAngle(angle) {\n return new Vector(Math.cos(angle), Math.sin(angle));\n }\n /**\n * Checks if vector is not null, undefined, or if any of its components are NaN or Infinity.\n */\n static isValid(vec) {\n if (vec === null || vec === undefined) {\n return false;\n }\n if (isNaN(vec.x) || isNaN(vec.y)) {\n return false;\n }\n if (vec.x === Infinity || vec.y === Infinity || vec.x === -Infinity || vec.y === -Infinity) {\n return false;\n }\n return true;\n }\n /**\n * Calculates distance between two Vectors\n * @param vec1\n * @param vec2\n */\n static distance(vec1, vec2) {\n return Math.sqrt(Math.pow(vec1.x - vec2.x, 2) + Math.pow(vec1.y - vec2.y, 2));\n }\n static min(vec1, vec2) {\n return new Vector(Math.min(vec1.x, vec2.x), Math.min(vec1.y, vec2.y));\n }\n static max(vec1, vec2) {\n return new Vector(Math.max(vec1.x, vec2.x), Math.max(vec1.y, vec2.y));\n }\n /**\n * @param x X component of the Vector\n * @param y Y component of the Vector\n */\n constructor(x, y) {\n this._x = 0;\n this._y = 0;\n this._x = x;\n this._y = y;\n }\n /**\n * Get the x component of the vector\n */\n get x() {\n return this._x;\n }\n /**\n * Set the x component, THIS MUTATES the current vector. It is usually better to create a new vector.\n * @warning **Be very careful setting components on shared vectors, mutating shared vectors can cause hard to find bugs**\n */\n set x(val) {\n this._x = val;\n }\n /**\n * Get the y component of the vector\n */\n get y() {\n return this._y;\n }\n /**\n * Set the y component, THIS MUTATES the current vector. It is usually better to create a new vector.\n * @warning **Be very careful setting components on shared vectors, mutating shared vectors can cause hard to find bugs**\n */\n set y(val) {\n this._y = val;\n }\n /**\n * Sets the x and y components at once, THIS MUTATES the current vector. It is usually better to create a new vector.\n * @warning **Be very careful using this, mutating vectors can cause hard to find bugs**\n */\n setTo(x, y) {\n this.x = x;\n this.y = y;\n }\n /**\n * Compares this point against another and tests for equality\n * @param vector The other point to compare to\n * @param tolerance Amount of euclidean distance off we are willing to tolerate\n */\n equals(vector, tolerance = Vector.EQUALS_EPSILON) {\n return Math.abs(this.x - vector.x) <= tolerance && Math.abs(this.y - vector.y) <= tolerance;\n }\n /**\n * The distance to another vector. If no other Vector is specified, this will return the {@apilink magnitude}.\n * @param v The other vector. Leave blank to use origin vector.\n */\n distance(v) {\n if (!v) {\n return Math.sqrt(this.x * this.x + this.y * this.y);\n }\n const deltaX = this.x - v.x;\n const deltaY = this.y - v.y;\n return Math.sqrt(deltaX * deltaX + deltaY * deltaY);\n }\n squareDistance(v) {\n if (!v) {\n v = Vector.Zero;\n }\n const deltaX = this.x - v.x;\n const deltaY = this.y - v.y;\n return deltaX * deltaX + deltaY * deltaY;\n }\n /**\n * Clamps the current vector's magnitude mutating it\n * @param magnitude\n */\n clampMagnitude(magnitude) {\n const size = this.magnitude;\n const newSize = (0,_util__WEBPACK_IMPORTED_MODULE_0__.clamp)(size, 0, magnitude);\n this.magnitude = newSize;\n return this;\n }\n /**\n * The size (magnitude) of the Vector\n * @deprecated Will be removed in v1, use Vector.magnitude\n */\n get size() {\n return this.distance();\n }\n /**\n * Setting the size mutates the current vector\n * @warning Can be used to set the size of the vector, **be very careful using this, mutating vectors can cause hard to find bugs**\n * @deprecated Will be removed in v1, use Vector.magnitude\n */\n set size(newLength) {\n const v = this.normalize().scale(newLength);\n this.setTo(v.x, v.y);\n }\n /**\n * The magnitude (length) of the Vector\n */\n get magnitude() {\n return this.distance();\n }\n /**\n * Setting the size mutates the current vector\n * @warning Can be used to set the size of the vector, **be very careful using this, mutating vectors can cause hard to find bugs**\n */\n set magnitude(newMagnitude) {\n this.normalize().scale(newMagnitude, this);\n }\n /**\n * Normalizes a non-zero vector to have a magnitude of 1. Zero vectors return a new zero vector.\n */\n normalize() {\n const distance = this.distance();\n if (distance === 0) {\n return Vector.Zero;\n }\n return new Vector(this.x / distance, this.y / distance);\n }\n /**\n * Returns the average (midpoint) between the current point and the specified\n */\n average(vec) {\n return this.add(vec).scale(0.5);\n }\n scale(sizeOrScale, dest) {\n const result = dest || new Vector(0, 0);\n if (sizeOrScale instanceof Vector) {\n result.x = this.x * sizeOrScale.x;\n result.y = this.y * sizeOrScale.y;\n }\n else {\n result.x = this.x * sizeOrScale;\n result.y = this.y * sizeOrScale;\n }\n return result;\n }\n /**\n * Adds one vector to another\n * @param v The vector to add\n * @param dest Optionally copy the result into a provided vector\n */\n add(v, dest) {\n if (dest) {\n dest.x = this.x + v.x;\n dest.y = this.y + v.y;\n return dest;\n }\n return new Vector(this.x + v.x, this.y + v.y);\n }\n /**\n * Subtracts a vector from another, if you subtract vector `B.sub(A)` the resulting vector points from A -> B\n * @param v The vector to subtract\n */\n sub(v, dest) {\n const result = dest || new Vector(0, 0);\n const x = this.x - v.x;\n const y = this.y - v.y;\n result.x = x;\n result.y = y;\n return result;\n }\n /**\n * Adds one vector to this one modifying the original\n * @param v The vector to add\n * @warning Be very careful using this, mutating vectors can cause hard to find bugs\n */\n addEqual(v) {\n this.setTo(this.x + v.x, this.y + v.y);\n return this;\n }\n /**\n * Subtracts a vector from this one modifying the original\n * @param v The vector to subtract\n * @warning Be very careful using this, mutating vectors can cause hard to find bugs\n */\n subEqual(v) {\n this.setTo(this.x - v.x, this.y - v.y);\n return this;\n }\n /**\n * Scales this vector by a factor of size and modifies the original\n * @warning Be very careful using this, mutating vectors can cause hard to find bugs\n */\n scaleEqual(size) {\n this.setTo(this.x * size, this.y * size);\n return this;\n }\n /**\n * Performs a dot product with another vector\n * @param v The vector to dot\n */\n dot(v) {\n return this.x * v.x + this.y * v.y;\n }\n cross(v) {\n if (v instanceof Vector) {\n return this.x * v.y - this.y * v.x;\n }\n else if (typeof v === 'number') {\n return new Vector(v * this.y, -v * this.x);\n }\n }\n static cross(num, vec) {\n return new Vector(-num * vec.y, num * vec.x);\n }\n /**\n * Returns the perpendicular vector to this one\n */\n perpendicular() {\n return new Vector(this.y, -this.x);\n }\n /**\n * Returns the normal vector to this one, same as the perpendicular of length 1\n */\n normal() {\n return this.perpendicular().normalize();\n }\n /**\n * Negate the current vector\n */\n negate() {\n return this.scale(-1);\n }\n /**\n * Returns the angle of this vector, in range [0, 2*PI)\n */\n toAngle() {\n return (0,_util__WEBPACK_IMPORTED_MODULE_0__.canonicalizeAngle)(Math.atan2(this.y, this.x));\n }\n /**\n * Returns the difference in radians between the angle of this vector and given angle,\n * using the given rotation type.\n * @param angle in radians to which the vector has to be rotated, using {@apilink rotate}\n * @param rotationType what {@apilink RotationType} to use for the rotation\n * @returns the angle by which the vector needs to be rotated to match the given angle\n */\n angleBetween(angle, rotationType) {\n const startAngleRadians = this.toAngle();\n const endAngleRadians = (0,_util__WEBPACK_IMPORTED_MODULE_0__.canonicalizeAngle)(angle);\n let rotationClockwise = 0;\n let rotationAntiClockwise = 0;\n if (endAngleRadians > startAngleRadians) {\n rotationClockwise = endAngleRadians - startAngleRadians;\n }\n else {\n rotationClockwise = (_util__WEBPACK_IMPORTED_MODULE_0__.TwoPI - startAngleRadians + endAngleRadians) % _util__WEBPACK_IMPORTED_MODULE_0__.TwoPI;\n }\n rotationAntiClockwise = (rotationClockwise - _util__WEBPACK_IMPORTED_MODULE_0__.TwoPI) % _util__WEBPACK_IMPORTED_MODULE_0__.TwoPI;\n switch (rotationType) {\n case _rotation_type__WEBPACK_IMPORTED_MODULE_1__.RotationType.ShortestPath:\n if (Math.abs(rotationClockwise) < Math.abs(rotationAntiClockwise)) {\n return rotationClockwise;\n }\n else {\n return rotationAntiClockwise;\n }\n case _rotation_type__WEBPACK_IMPORTED_MODULE_1__.RotationType.LongestPath:\n if (Math.abs(rotationClockwise) > Math.abs(rotationAntiClockwise)) {\n return rotationClockwise;\n }\n else {\n return rotationAntiClockwise;\n }\n case _rotation_type__WEBPACK_IMPORTED_MODULE_1__.RotationType.Clockwise:\n return rotationClockwise;\n case _rotation_type__WEBPACK_IMPORTED_MODULE_1__.RotationType.CounterClockwise:\n return rotationAntiClockwise;\n }\n }\n /**\n * Rotates the current vector around a point by a certain angle in radians.\n * Positive angle means rotation clockwise.\n */\n rotate(angle, anchor, dest) {\n const result = dest || new Vector(0, 0);\n if (!anchor) {\n anchor = new Vector(0, 0);\n }\n const sinAngle = Math.sin(angle);\n const cosAngle = Math.cos(angle);\n const x = cosAngle * (this.x - anchor.x) - sinAngle * (this.y - anchor.y) + anchor.x;\n const y = sinAngle * (this.x - anchor.x) + cosAngle * (this.y - anchor.y) + anchor.y;\n result.x = x;\n result.y = y;\n return result;\n }\n /**\n * Creates new vector that has the same values as the previous.\n */\n clone(dest) {\n const v = dest !== null && dest !== void 0 ? dest : new Vector(0, 0);\n v.x = this.x;\n v.y = this.y;\n return v;\n }\n /**\n * Returns a string representation of the vector.\n */\n toString(fixed) {\n if (fixed) {\n return `(${this.x.toFixed(fixed)}, ${this.y.toFixed(fixed)})`;\n }\n return `(${this.x}, ${this.y})`;\n }\n}\n/**\n * Get or set the vector equals epsilon, by default 0.001 meaning vectors within that tolerance on x or y will be considered equal.\n */\nVector.EQUALS_EPSILON = 0.001;\n/**\n * Shorthand for creating new Vectors - returns a new Vector instance with the\n * provided X and Y components.\n * @param x X component of the Vector\n * @param y Y component of the Vector\n */\nfunction vec(x, y) {\n return new Vector(x, y);\n}\n\n\n/***/ }),\n\n/***/ \"./Math/watch-vector.ts\":\n/*!******************************!*\\\n !*** ./Math/watch-vector.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ WatchVector: () => (/* binding */ WatchVector)\n/* harmony export */ });\n/* harmony import */ var _vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vector */ \"./Math/vector.ts\");\n\n/**\n * Wraps a vector and watches for changes in the x/y, modifies the original vector.\n */\nclass WatchVector extends _vector__WEBPACK_IMPORTED_MODULE_0__.Vector {\n constructor(original, change) {\n super(original.x, original.y);\n this.original = original;\n this.change = change;\n }\n get x() {\n return (this._x = this.original.x);\n }\n set x(newX) {\n if (newX !== this._x) {\n this.change(newX, this._y);\n this._x = this.original.x = newX;\n }\n }\n get y() {\n return (this._y = this.original.y);\n }\n set y(newY) {\n if (newY !== this._y) {\n this.change(this._x, newY);\n this._y = this.original.y = newY;\n }\n }\n setTo(x, y) {\n this.x = x;\n this.y = y;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Particles/EmitterType.ts\":\n/*!**********************************!*\\\n !*** ./Particles/EmitterType.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EmitterType: () => (/* binding */ EmitterType)\n/* harmony export */ });\n/**\n * An enum that represents the types of emitter nozzles\n */\nvar EmitterType;\n(function (EmitterType) {\n /**\n * Constant for the circular emitter type\n */\n EmitterType[\"Circle\"] = \"circle\";\n /**\n * Constant for the rectangular emitter type\n */\n EmitterType[\"Rectangle\"] = \"rectangle\";\n})(EmitterType || (EmitterType = {}));\n\n\n/***/ }),\n\n/***/ \"./Particles/GpuParticleEmitter.ts\":\n/*!*****************************************!*\\\n !*** ./Particles/GpuParticleEmitter.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ GpuParticleEmitter: () => (/* binding */ GpuParticleEmitter)\n/* harmony export */ });\n/* harmony import */ var _Actor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Actor */ \"./Actor.ts\");\n/* harmony import */ var _EmitterType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./EmitterType */ \"./Particles/EmitterType.ts\");\n/* harmony import */ var _Particles__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Particles */ \"./Particles/Particles.ts\");\n/* harmony import */ var _GpuParticleRenderer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./GpuParticleRenderer */ \"./Particles/GpuParticleRenderer.ts\");\n/* harmony import */ var _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Graphics/GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Math_Random__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Math/Random */ \"./Math/Random.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Math */ \"./Math/util.ts\");\n\n\n\n\n\n\n\n\nclass GpuParticleEmitter extends _Actor__WEBPACK_IMPORTED_MODULE_0__.Actor {\n get pos() {\n return this.transform.pos;\n }\n set pos(pos) {\n this.transform.pos = pos;\n }\n get z() {\n return this.transform.z;\n }\n set z(z) {\n this.transform.z = z;\n }\n constructor(config) {\n super({ name: `GpuParticleEmitter`, width: config.width, height: config.height }); // somewhat goofy way of doing width/height\n this.particle = {\n /**\n * Gets or sets the life of each particle in milliseconds\n */\n life: 2000,\n transform: _Particles__WEBPACK_IMPORTED_MODULE_1__.ParticleTransform.Global,\n graphic: undefined,\n opacity: 1,\n angularVelocity: 0,\n focus: undefined,\n focusAccel: undefined,\n randomRotation: false\n };\n this.graphics = new _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_2__.GraphicsComponent();\n this.isEmitting = false;\n this.emitRate = 1;\n this.emitterType = _EmitterType__WEBPACK_IMPORTED_MODULE_3__.EmitterType.Rectangle;\n this.radius = 0;\n this.maxParticles = 2000;\n this._particlesToEmit = 0;\n this.addComponent(this.graphics, true);\n this.graphics.onPostDraw = this.draw.bind(this);\n const { particle, maxParticles, x, y, z, pos, isEmitting, emitRate, emitterType, radius, random } = { ...config };\n this.maxParticles = (0,_Math__WEBPACK_IMPORTED_MODULE_4__.clamp)(maxParticles !== null && maxParticles !== void 0 ? maxParticles : this.maxParticles, 0, _GpuParticleRenderer__WEBPACK_IMPORTED_MODULE_5__.GpuParticleRenderer.GPU_MAX_PARTICLES);\n this.pos = pos !== null && pos !== void 0 ? pos : (0,_Math_vector__WEBPACK_IMPORTED_MODULE_6__.vec)(x !== null && x !== void 0 ? x : 0, y !== null && y !== void 0 ? y : 0);\n this.z = z !== null && z !== void 0 ? z : 0;\n this.isEmitting = isEmitting !== null && isEmitting !== void 0 ? isEmitting : this.isEmitting;\n this.emitRate = emitRate !== null && emitRate !== void 0 ? emitRate : this.emitRate;\n this.emitterType = emitterType !== null && emitterType !== void 0 ? emitterType : this.emitterType;\n this.radius = radius !== null && radius !== void 0 ? radius : this.radius;\n this.particle = { ...this.particle, ...particle };\n this.random = random !== null && random !== void 0 ? random : new _Math_Random__WEBPACK_IMPORTED_MODULE_7__.Random();\n this.renderer = new _GpuParticleRenderer__WEBPACK_IMPORTED_MODULE_5__.GpuParticleRenderer(this, this.random, this.particle);\n }\n _initialize(engine) {\n super._initialize(engine);\n const context = engine.graphicsContext;\n this.renderer.initialize(context.__gl, context);\n }\n update(engine, elapsed) {\n super.update(engine, elapsed);\n if (this.isEmitting) {\n this._particlesToEmit += this.emitRate * (elapsed / 1000);\n if (this._particlesToEmit > 1.0) {\n this.emitParticles(Math.floor(this._particlesToEmit));\n this._particlesToEmit = this._particlesToEmit - Math.floor(this._particlesToEmit);\n }\n }\n this.renderer.update(elapsed);\n }\n emitParticles(particleCount) {\n if (particleCount <= 0) {\n return;\n }\n this.renderer.emitParticles(particleCount | 0); // coerce to integer\n }\n clearParticles() {\n this.renderer.clearParticles();\n }\n draw(ctx, elapsed) {\n ctx.draw('ex.particle', this.renderer, elapsed);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Particles/GpuParticleRenderer.ts\":\n/*!******************************************!*\\\n !*** ./Particles/GpuParticleRenderer.ts ***!\n \\******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ GpuParticleRenderer: () => (/* binding */ GpuParticleRenderer)\n/* harmony export */ });\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Particles__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Particles */ \"./Particles/Particles.ts\");\n/* harmony import */ var _EmitterType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./EmitterType */ \"./Particles/EmitterType.ts\");\n/* harmony import */ var _Util_Assert__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Util/Assert */ \"./Util/Assert.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n\n\n\n\n\n/**\n * Container for the GPU Particle State contains the internal state needed for the GPU\n * to render particles and maintain state.\n */\nclass GpuParticleRenderer {\n constructor(emitter, random, options) {\n var _a;\n this.emitRate = 1;\n this._initialized = false;\n this._vaos = [];\n this._buffers = [];\n this._drawIndex = 0;\n this._numInputFloats = 2 + 2 + 1 + 1 + 1;\n this._particleIndex = 0;\n this._uploadIndex = 0;\n this._wrappedLife = 0;\n this._wrappedParticles = 0;\n this._particleLife = 0;\n this._clearRequested = false;\n this._emitted = [];\n this.emitter = emitter;\n this.particle = options;\n this._particleData = new Float32Array(this.emitter.maxParticles * this._numInputFloats);\n this._random = random;\n this._particleLife = (_a = this.particle.life) !== null && _a !== void 0 ? _a : 2000;\n }\n get isInitialized() {\n return this._initialized;\n }\n get maxParticles() {\n return this.emitter.maxParticles;\n }\n initialize(gl, context) {\n if (this._initialized) {\n return;\n }\n const numParticles = this.emitter.maxParticles;\n const numInputFloats = this._numInputFloats;\n const particleData = this._particleData;\n const bytesPerFloat = 4;\n const particleDataBuffer1 = gl.createBuffer();\n const vao1 = gl.createVertexArray();\n gl.bindVertexArray(vao1);\n gl.bindBuffer(gl.ARRAY_BUFFER, particleDataBuffer1);\n gl.bufferData(gl.ARRAY_BUFFER, numParticles * numInputFloats * bytesPerFloat, gl.DYNAMIC_DRAW);\n gl.bufferSubData(gl.ARRAY_BUFFER, 0, particleData);\n let offset = 0;\n // position\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, numInputFloats * bytesPerFloat, 0);\n offset += bytesPerFloat * 2;\n // velocity\n gl.vertexAttribPointer(1, 2, gl.FLOAT, false, numInputFloats * bytesPerFloat, offset);\n offset += bytesPerFloat * 2;\n // rotation\n gl.vertexAttribPointer(2, 1, gl.FLOAT, false, numInputFloats * bytesPerFloat, offset);\n offset += bytesPerFloat * 1;\n // angularVelocity\n gl.vertexAttribPointer(3, 1, gl.FLOAT, false, numInputFloats * bytesPerFloat, offset);\n offset += bytesPerFloat * 1;\n // life\n gl.vertexAttribPointer(4, 1, gl.FLOAT, false, numInputFloats * bytesPerFloat, offset);\n offset += bytesPerFloat * 1;\n // enable attributes\n gl.enableVertexAttribArray(0);\n gl.enableVertexAttribArray(1);\n gl.enableVertexAttribArray(2);\n gl.enableVertexAttribArray(3);\n gl.enableVertexAttribArray(4);\n this._vaos.push(vao1);\n this._buffers.push(particleDataBuffer1);\n // Clean up\n gl.bindVertexArray(null);\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n const particleDataBuffer2 = gl.createBuffer();\n const vao2 = gl.createVertexArray();\n gl.bindVertexArray(vao2);\n gl.bindBuffer(gl.ARRAY_BUFFER, particleDataBuffer2);\n gl.bufferData(gl.ARRAY_BUFFER, numParticles * numInputFloats * bytesPerFloat, gl.DYNAMIC_DRAW);\n offset = 0;\n // position\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, numInputFloats * bytesPerFloat, 0);\n offset += bytesPerFloat * 2;\n // velocity\n gl.vertexAttribPointer(1, 2, gl.FLOAT, false, numInputFloats * bytesPerFloat, offset);\n offset += bytesPerFloat * 2;\n // rotation\n gl.vertexAttribPointer(2, 1, gl.FLOAT, false, numInputFloats * bytesPerFloat, offset);\n offset += bytesPerFloat * 1;\n // angularVelocity\n gl.vertexAttribPointer(3, 1, gl.FLOAT, false, numInputFloats * bytesPerFloat, offset);\n offset += bytesPerFloat * 1;\n // life\n gl.vertexAttribPointer(4, 1, gl.FLOAT, false, numInputFloats * bytesPerFloat, offset);\n offset += bytesPerFloat * 1;\n // enable attributes\n gl.enableVertexAttribArray(0);\n gl.enableVertexAttribArray(1);\n gl.enableVertexAttribArray(2);\n gl.enableVertexAttribArray(3);\n gl.enableVertexAttribArray(4);\n this._vaos.push(vao2);\n this._buffers.push(particleDataBuffer2);\n // Clean up\n gl.bindVertexArray(null);\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n this._currentVao = this._vaos[this._drawIndex % 2];\n this._currentBuffer = this._buffers[(this._drawIndex + 1) % 2];\n this._initialized = true;\n }\n clearParticles() {\n this._particleData.fill(0);\n this._clearRequested = true;\n }\n emitParticles(particleCount) {\n const startIndex = this._particleIndex;\n const maxSize = this.maxParticles * this._numInputFloats;\n const endIndex = particleCount * this._numInputFloats + startIndex;\n let countParticle = 0;\n for (let i = startIndex; i < endIndex; i += this._numInputFloats) {\n const angle = this._random.floating(this.particle.minAngle || 0, this.particle.maxAngle || _Math_util__WEBPACK_IMPORTED_MODULE_0__.TwoPI);\n const speedX = this._random.floating(this.particle.minSpeed || 0, this.particle.maxSpeed || 0);\n const speedY = this._random.floating(this.particle.minSpeed || 0, this.particle.maxSpeed || 0);\n const dx = speedX * Math.cos(angle);\n const dy = speedY * Math.sin(angle);\n let ranX = 0;\n let ranY = 0;\n if (this.emitter.emitterType === _EmitterType__WEBPACK_IMPORTED_MODULE_1__.EmitterType.Rectangle) {\n ranX = this._random.floating(-0.5, 0.5) * this.emitter.width;\n ranY = this._random.floating(-0.5, 0.5) * this.emitter.height;\n }\n else {\n const radius = this._random.floating(0, this.emitter.radius);\n ranX = radius * Math.cos(angle);\n ranY = radius * Math.sin(angle);\n }\n const tx = this.emitter.transform.apply((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(ranX, ranY));\n const data = [\n this.particle.transform === _Particles__WEBPACK_IMPORTED_MODULE_3__.ParticleTransform.Local ? ranX : tx.x,\n this.particle.transform === _Particles__WEBPACK_IMPORTED_MODULE_3__.ParticleTransform.Local ? ranY : tx.y, // pos in world space\n dx,\n dy, // velocity\n this.particle.randomRotation ? (0,_Math_util__WEBPACK_IMPORTED_MODULE_0__.randomInRange)(0, _Math_util__WEBPACK_IMPORTED_MODULE_0__.TwoPI, this._random) : this.particle.rotation || 0, // rotation\n this.particle.angularVelocity || 0, // angular velocity\n this._particleLife // life\n ];\n countParticle++;\n this._particleData.set(data, i % this._particleData.length);\n }\n if (endIndex >= maxSize) {\n this._wrappedParticles += (endIndex - maxSize) / this._numInputFloats;\n this._wrappedLife = this._particleLife;\n }\n else if (this._wrappedLife > 0) {\n this._wrappedParticles += particleCount;\n }\n this._particleIndex = endIndex % maxSize;\n this._emitted.push([this._particleLife, startIndex]);\n }\n _uploadEmitted(gl) {\n // upload index is the index of the previous upload\n // particle index is the current index of modification\n if (this._particleIndex !== this._uploadIndex) {\n // Bind one buffer to ARRAY_BUFFER and the other to TFB\n gl.bindBuffer(gl.ARRAY_BUFFER, this._buffers[(this._drawIndex + 1) % 2]);\n if (this._particleIndex >= this._uploadIndex) {\n gl.bufferSubData(gl.ARRAY_BUFFER, this._uploadIndex * 4, // dst byte offset 4 bytes per float\n this._particleData, this._uploadIndex, this._particleIndex - this._uploadIndex);\n }\n else {\n // upload before the wrap\n // prettier-ignore\n gl.bufferSubData(gl.ARRAY_BUFFER, this._uploadIndex * 4, this._particleData, this._uploadIndex, this._particleData.length - this._uploadIndex);\n // upload after the wrap if there are any\n if (this._wrappedParticles) {\n // prettier-ignore\n gl.bufferSubData(gl.ARRAY_BUFFER, 0, this._particleData, 0, this._wrappedParticles * this._numInputFloats);\n }\n this._wrappedLife = this._particleLife;\n }\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n }\n this._uploadIndex = this._particleIndex % (this.maxParticles * this._numInputFloats);\n }\n update(elapsed) {\n var _a;\n this._particleLife = (_a = this.particle.life) !== null && _a !== void 0 ? _a : this._particleLife;\n if (this._wrappedLife > 0) {\n this._wrappedLife -= elapsed;\n }\n else {\n this._wrappedLife = 0;\n this._wrappedParticles = 0;\n }\n if (!this._emitted.length) {\n return;\n }\n for (let i = this._emitted.length - 1; i >= 0; i--) {\n const particle = this._emitted[i];\n particle[0] -= elapsed;\n const life = particle[0];\n if (life <= 0) {\n this._emitted.splice(i, 1);\n }\n }\n this._emitted.sort((a, b) => a[0] - b[0]);\n }\n draw(gl) {\n if (this._initialized) {\n // Emit\n if (this._clearRequested) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this._buffers[(this._drawIndex + 1) % 2]);\n gl.bufferSubData(gl.ARRAY_BUFFER, 0, this._particleData);\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n this._clearRequested = false;\n }\n else {\n this._uploadEmitted(gl);\n }\n // Bind one buffer to ARRAY_BUFFER and the other to transform feedback buffer\n gl.bindVertexArray(this._currentVao);\n gl.bindBufferBase(gl.TRANSFORM_FEEDBACK_BUFFER, 0, this._currentBuffer);\n // Perform transform feedback (run the simulation) and the draw call all at once\n if (this._wrappedLife && this._emitted[0] && this._emitted[0][1] > 0) {\n const midpoint = this._emitted[0][1] / this._numInputFloats;\n // draw oldest first (maybe make configurable)\n (0,_Util_Assert__WEBPACK_IMPORTED_MODULE_4__.assert)(`midpoint greater than 0, actual: ${midpoint}`, () => midpoint > 0);\n (0,_Util_Assert__WEBPACK_IMPORTED_MODULE_4__.assert)(`midpoint is less than max, actual: ${midpoint}`, () => midpoint < this.maxParticles);\n gl.bindBufferRange(gl.TRANSFORM_FEEDBACK_BUFFER, 0, this._currentBuffer, this._emitted[0][1] * 4, (this.maxParticles - midpoint) * this._numInputFloats * 4);\n gl.beginTransformFeedback(gl.POINTS);\n gl.drawArrays(gl.POINTS, midpoint, this.maxParticles - midpoint);\n gl.endTransformFeedback();\n // then draw newer particles\n gl.bindBufferRange(gl.TRANSFORM_FEEDBACK_BUFFER, 0, this._currentBuffer, 0, this._emitted[0][1] * 4);\n gl.beginTransformFeedback(gl.POINTS);\n gl.drawArrays(gl.POINTS, 0, midpoint);\n gl.endTransformFeedback();\n }\n else {\n gl.bindBufferRange(gl.TRANSFORM_FEEDBACK_BUFFER, 0, this._currentBuffer, 0, this._particleData.length * 4);\n gl.beginTransformFeedback(gl.POINTS);\n gl.drawArrays(gl.POINTS, 0, this.maxParticles);\n gl.endTransformFeedback();\n }\n // Clean up after ourselves to avoid errors.\n gl.bindVertexArray(null);\n gl.bindBufferBase(gl.TRANSFORM_FEEDBACK_BUFFER, 0, null);\n // flip flop buffers, one will be draw the other simulation\n this._currentVao = this._vaos[this._drawIndex % 2];\n this._currentBuffer = this._buffers[(this._drawIndex + 1) % 2];\n this._drawIndex = (this._drawIndex + 1) % 2;\n }\n }\n}\nGpuParticleRenderer.GPU_MAX_PARTICLES = 100000;\n\n\n/***/ }),\n\n/***/ \"./Particles/ParticleEmitter.ts\":\n/*!**************************************!*\\\n !*** ./Particles/ParticleEmitter.ts ***!\n \\**************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ParticleEmitter: () => (/* binding */ ParticleEmitter)\n/* harmony export */ });\n/* harmony import */ var _Actor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Actor */ \"./Actor.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math_Random__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Math/Random */ \"./Math/Random.ts\");\n/* harmony import */ var _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Collision/CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _EmitterType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./EmitterType */ \"./Particles/EmitterType.ts\");\n/* harmony import */ var _Particles__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Particles */ \"./Particles/Particles.ts\");\n/* harmony import */ var _Util_RentalPool__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/RentalPool */ \"./Util/RentalPool.ts\");\n\n\n\n\n\n\n\n\n/**\n * Using a particle emitter is a great way to create interesting effects\n * in your game, like smoke, fire, water, explosions, etc. `ParticleEmitter`\n * extend {@apilink Actor} allowing you to use all of the features that come with.\n *\n * These particles are simulated on the CPU in JavaScript\n */\nclass ParticleEmitter extends _Actor__WEBPACK_IMPORTED_MODULE_0__.Actor {\n /**\n * @param config particle emitter options bag\n */\n constructor(config) {\n var _a, _b;\n super({ width: (_a = config.width) !== null && _a !== void 0 ? _a : 0, height: (_b = config.height) !== null && _b !== void 0 ? _b : 0 });\n this._particlesToEmit = 0;\n this._particlePool = new _Util_RentalPool__WEBPACK_IMPORTED_MODULE_1__.RentalPool(() => new _Particles__WEBPACK_IMPORTED_MODULE_2__.Particle({}), (p) => p, 500);\n this.numParticles = 0;\n /**\n * Gets or sets the isEmitting flag\n */\n this.isEmitting = true;\n /**\n * Gets or sets the backing deadParticle collection\n */\n this.deadParticles = [];\n /**\n * Gets or sets the emission rate for particles (particles/sec)\n */\n this.emitRate = 1; //particles/sec\n /**\n * Gets or sets the emitter type for the particle emitter\n */\n this.emitterType = _EmitterType__WEBPACK_IMPORTED_MODULE_3__.EmitterType.Rectangle;\n /**\n * Gets or sets the emitter radius, only takes effect when the {@apilink emitterType} is {@apilink EmitterType.Circle}\n */\n this.radius = 0;\n this.particle = {\n /**\n * Gets or sets the life of each particle in milliseconds\n */\n life: 2000,\n transform: _Particles__WEBPACK_IMPORTED_MODULE_2__.ParticleTransform.Global,\n graphic: undefined,\n opacity: 1,\n angularVelocity: 0,\n focus: undefined,\n focusAccel: undefined,\n randomRotation: false\n };\n this._activeParticles = [];\n const { particle, x, y, z, pos, isEmitting, emitRate, emitterType, radius, random } = { ...config };\n this.particle = { ...this.particle, ...particle };\n this.pos = pos !== null && pos !== void 0 ? pos : (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(x !== null && x !== void 0 ? x : 0, y !== null && y !== void 0 ? y : 0);\n this.z = z !== null && z !== void 0 ? z : 0;\n this.isEmitting = isEmitting !== null && isEmitting !== void 0 ? isEmitting : this.isEmitting;\n this.emitRate = emitRate !== null && emitRate !== void 0 ? emitRate : this.emitRate;\n this.emitterType = emitterType !== null && emitterType !== void 0 ? emitterType : this.emitterType;\n this.radius = radius !== null && radius !== void 0 ? radius : this.radius;\n this.body.collisionType = _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_5__.CollisionType.PreventCollision;\n this.random = random !== null && random !== void 0 ? random : new _Math_Random__WEBPACK_IMPORTED_MODULE_6__.Random();\n }\n removeParticle(particle) {\n this.deadParticles.push(particle);\n }\n /**\n * Causes the emitter to emit particles\n * @param particleCount Number of particles to emit right now\n */\n emitParticles(particleCount) {\n var _a;\n if (particleCount <= 0) {\n return;\n }\n particleCount = particleCount | 0; // coerce to int\n for (let i = 0; i < particleCount; i++) {\n const p = this._createParticle();\n if ((_a = this === null || this === void 0 ? void 0 : this.scene) === null || _a === void 0 ? void 0 : _a.world) {\n if (this.particle.transform === _Particles__WEBPACK_IMPORTED_MODULE_2__.ParticleTransform.Global) {\n this.scene.world.add(p);\n }\n else {\n this.addChild(p);\n }\n }\n this._activeParticles.push(p);\n }\n }\n clearParticles() {\n for (let i = 0; i < this._activeParticles.length; i++) {\n this.removeParticle(this._activeParticles[i]);\n }\n }\n // Creates a new particle given the constraints of the emitter\n _createParticle() {\n let ranX = 0;\n let ranY = 0;\n const angle = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.randomInRange)(this.particle.minAngle || 0, this.particle.maxAngle || Math.PI * 2, this.random);\n const vel = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.randomInRange)(this.particle.minSpeed || 0, this.particle.maxSpeed || 0, this.random);\n const size = this.particle.startSize || (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.randomInRange)(this.particle.minSize || 5, this.particle.maxSize || 5, this.random);\n const dx = vel * Math.cos(angle);\n const dy = vel * Math.sin(angle);\n if (this.emitterType === _EmitterType__WEBPACK_IMPORTED_MODULE_3__.EmitterType.Rectangle) {\n ranX = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.randomInRange)(0, this.width, this.random);\n ranY = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.randomInRange)(0, this.height, this.random);\n }\n else if (this.emitterType === _EmitterType__WEBPACK_IMPORTED_MODULE_3__.EmitterType.Circle) {\n const radius = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.randomInRange)(0, this.radius, this.random);\n ranX = radius * Math.cos(angle);\n ranY = radius * Math.sin(angle);\n }\n const p = this._particlePool.rent();\n p.configure({\n life: this.particle.life,\n opacity: this.particle.opacity,\n beginColor: this.particle.beginColor,\n endColor: this.particle.endColor,\n pos: (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(ranX, ranY),\n vel: (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(dx, dy),\n acc: this.particle.acc,\n angularVelocity: this.particle.angularVelocity,\n startSize: this.particle.startSize,\n endSize: this.particle.endSize,\n size: size,\n graphic: this.particle.graphic,\n fade: this.particle.fade\n });\n p.registerEmitter(this);\n if (this.particle.randomRotation) {\n p.transform.rotation = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.randomInRange)(0, Math.PI * 2, this.random);\n }\n if (this.particle.focus) {\n p.focus = this.particle.focus.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(this.pos.x, this.pos.y));\n p.focusAccel = this.particle.focusAccel;\n }\n return p;\n }\n update(engine, elapsed) {\n var _a;\n super.update(engine, elapsed);\n if (this.isEmitting) {\n this._particlesToEmit += this.emitRate * (elapsed / 1000);\n if (this._particlesToEmit > 1.0) {\n this.emitParticles(Math.floor(this._particlesToEmit));\n this._particlesToEmit = this._particlesToEmit - Math.floor(this._particlesToEmit);\n }\n }\n // deferred removal\n for (let i = 0; i < this.deadParticles.length; i++) {\n if ((_a = this === null || this === void 0 ? void 0 : this.scene) === null || _a === void 0 ? void 0 : _a.world) {\n this.scene.world.remove(this.deadParticles[i], false);\n this._particlePool.return(this.deadParticles[i]);\n }\n const index = this._activeParticles.indexOf(this.deadParticles[i]);\n if (index > -1) {\n this._activeParticles.splice(index, 1);\n }\n }\n this.deadParticles.length = 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Particles/Particles.ts\":\n/*!********************************!*\\\n !*** ./Particles/Particles.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Particle: () => (/* binding */ Particle),\n/* harmony export */ ParticleTransform: () => (/* binding */ ParticleTransform)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Graphics/GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _Collision_Integrator__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Collision/Integrator */ \"./Collision/Integrator.ts\");\n\n\n\n\n\n\n\n\n\n/**\n/**\n * CPU Particle is used in a {@apilink ParticleEmitter}\n */\nclass Particle extends _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__.Entity {\n constructor(options) {\n super({ silenceWarnings: true });\n this.beginColor = _Color__WEBPACK_IMPORTED_MODULE_1__.Color.White;\n this.endColor = _Color__WEBPACK_IMPORTED_MODULE_1__.Color.White;\n // Life is counted in ms\n this.life = 300;\n this.fade = false;\n // Color transitions\n this._rRate = 1;\n this._gRate = 1;\n this._bRate = 1;\n this._aRate = 0;\n this._currentColor = _Color__WEBPACK_IMPORTED_MODULE_1__.Color.White;\n this.size = 5;\n this.sizeRate = 0;\n this.visible = true;\n this.isOffscreen = false;\n this.particleTransform = ParticleTransform.Global;\n this.name = `Particle#${this.id}`;\n this.addComponent((this.transform = new _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent()));\n this.addComponent((this.motion = new _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_3__.MotionComponent()));\n this.addComponent((this.graphics = new _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_4__.GraphicsComponent()));\n this.configure(options);\n }\n registerEmitter(emitter) {\n this._emitter = emitter;\n if (this.particleTransform === ParticleTransform.Global) {\n const globalPos = this._emitter.transform.globalPos;\n this.transform.pos = this.transform.pos.add(globalPos);\n this.motion.vel = this.motion.vel.rotate(this._emitter.transform.globalRotation);\n }\n }\n configure(options) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;\n this.particleTransform = (_a = options.transform) !== null && _a !== void 0 ? _a : this.particleTransform;\n this.life = (_b = options.life) !== null && _b !== void 0 ? _b : this.life;\n this.fade = (_c = options.fade) !== null && _c !== void 0 ? _c : this.fade;\n this.size = (_d = options.size) !== null && _d !== void 0 ? _d : this.size;\n this.endColor = (_e = options.endColor) !== null && _e !== void 0 ? _e : this.endColor.clone();\n this.beginColor = (_f = options.beginColor) !== null && _f !== void 0 ? _f : this.beginColor.clone();\n this._currentColor = this.beginColor.clone();\n this.graphic = options.graphic;\n this.graphics.opacity = (_g = options.opacity) !== null && _g !== void 0 ? _g : this.graphics.opacity;\n this.transform.pos = (_h = options.pos) !== null && _h !== void 0 ? _h : this.transform.pos;\n this.transform.rotation = (_j = options.rotation) !== null && _j !== void 0 ? _j : 0;\n this.transform.scale = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_5__.vec)(1, 1);\n this.motion.vel = (_k = options.vel) !== null && _k !== void 0 ? _k : this.motion.vel;\n this.motion.angularVelocity = (_l = options.angularVelocity) !== null && _l !== void 0 ? _l : 0;\n this.motion.acc = (_m = options.acc) !== null && _m !== void 0 ? _m : this.motion.acc;\n this._rRate = (this.endColor.r - this.beginColor.r) / this.life;\n this._gRate = (this.endColor.g - this.beginColor.g) / this.life;\n this._bRate = (this.endColor.b - this.beginColor.b) / this.life;\n this._aRate = this.graphics.opacity / this.life;\n this.startSize = (_o = options.startSize) !== null && _o !== void 0 ? _o : 0;\n this.endSize = (_p = options.endSize) !== null && _p !== void 0 ? _p : 0;\n if (this.endSize > 0 && this.startSize > 0) {\n this.sizeRate = (this.endSize - this.startSize) / this.life;\n this.size = this.startSize;\n }\n if (this.graphic) {\n this.graphics.use(this.graphic);\n this.graphics.onPostDraw = undefined;\n }\n else {\n this.graphics.localBounds = _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox.fromDimension(this.size, this.size, _Math_vector__WEBPACK_IMPORTED_MODULE_5__.Vector.Half);\n this.graphics.onPostDraw = (ctx) => {\n ctx.save();\n ctx.debug.drawPoint((0,_Math_vector__WEBPACK_IMPORTED_MODULE_5__.vec)(0, 0), { color: this._currentColor, size: this.size });\n ctx.restore();\n };\n }\n }\n kill() {\n var _a;\n if ((_a = this._emitter) === null || _a === void 0 ? void 0 : _a.isActive) {\n this._emitter.removeParticle(this);\n }\n else {\n super.kill();\n }\n }\n update(engine, elapsed) {\n this.life = this.life - elapsed;\n if (this.life < 0) {\n this.kill();\n }\n if (this.fade) {\n this.graphics.opacity = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.clamp)(this._aRate * this.life, 0.0001, 1);\n }\n if (this.startSize && this.endSize && this.startSize > 0 && this.endSize > 0) {\n this.size = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.clamp)(this.sizeRate * elapsed + this.size, Math.min(this.startSize, this.endSize), Math.max(this.startSize, this.endSize));\n }\n this._currentColor.r = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.clamp)(this._currentColor.r + this._rRate * elapsed, 0, 255);\n this._currentColor.g = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.clamp)(this._currentColor.g + this._gRate * elapsed, 0, 255);\n this._currentColor.b = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.clamp)(this._currentColor.b + this._bRate * elapsed, 0, 255);\n this._currentColor.a = this.graphics.opacity;\n let accel = this.motion.acc;\n if (this.focus) {\n accel = this.focus\n .sub(this.transform.pos)\n .normalize()\n .scale(this.focusAccel || 0)\n .scale(elapsed / 1000);\n }\n // Update transform and motion based on Euler linear algebra\n _Collision_Integrator__WEBPACK_IMPORTED_MODULE_8__.EulerIntegrator.integrate(this.transform, this.motion, accel, elapsed);\n }\n}\nParticle.DefaultConfig = {\n beginColor: _Color__WEBPACK_IMPORTED_MODULE_1__.Color.White,\n endColor: _Color__WEBPACK_IMPORTED_MODULE_1__.Color.White,\n life: 300,\n fade: false,\n size: 5,\n graphic: undefined,\n startSize: undefined,\n endSize: undefined\n};\nvar ParticleTransform;\n(function (ParticleTransform) {\n /**\n * {@apilink ParticleTransform.Global} is the default and emits particles as if\n * they were world space objects, useful for most effects.\n */\n ParticleTransform[\"Global\"] = \"global\";\n /**\n * {@apilink ParticleTransform.Local} particles are children of the emitter and move relative to the emitter\n * as they would in a parent/child actor relationship.\n */\n ParticleTransform[\"Local\"] = \"local\";\n})(ParticleTransform || (ParticleTransform = {}));\n\n\n/***/ }),\n\n/***/ \"./Particles/index.ts\":\n/*!****************************!*\\\n !*** ./Particles/index.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EmitterType: () => (/* reexport safe */ _EmitterType__WEBPACK_IMPORTED_MODULE_0__.EmitterType),\n/* harmony export */ GpuParticleEmitter: () => (/* reexport safe */ _GpuParticleEmitter__WEBPACK_IMPORTED_MODULE_3__.GpuParticleEmitter),\n/* harmony export */ GpuParticleRenderer: () => (/* reexport safe */ _GpuParticleRenderer__WEBPACK_IMPORTED_MODULE_4__.GpuParticleRenderer),\n/* harmony export */ Particle: () => (/* reexport safe */ _Particles__WEBPACK_IMPORTED_MODULE_1__.Particle),\n/* harmony export */ ParticleEmitter: () => (/* reexport safe */ _ParticleEmitter__WEBPACK_IMPORTED_MODULE_2__.ParticleEmitter),\n/* harmony export */ ParticleTransform: () => (/* reexport safe */ _Particles__WEBPACK_IMPORTED_MODULE_1__.ParticleTransform)\n/* harmony export */ });\n/* harmony import */ var _EmitterType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./EmitterType */ \"./Particles/EmitterType.ts\");\n/* harmony import */ var _Particles__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Particles */ \"./Particles/Particles.ts\");\n/* harmony import */ var _ParticleEmitter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ParticleEmitter */ \"./Particles/ParticleEmitter.ts\");\n/* harmony import */ var _GpuParticleEmitter__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./GpuParticleEmitter */ \"./Particles/GpuParticleEmitter.ts\");\n/* harmony import */ var _GpuParticleRenderer__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./GpuParticleRenderer */ \"./Particles/GpuParticleRenderer.ts\");\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Polyfill.ts\":\n/*!*********************!*\\\n !*** ./Polyfill.ts ***!\n \\*********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ polyfill: () => (/* binding */ polyfill)\n/* harmony export */ });\n/**\n * Polyfill adding function\n */\nfunction polyfill() {\n /* istanbul ignore next */\n if (typeof window === 'undefined') {\n window = {\n audioContext: function () {\n return;\n }\n };\n }\n /* istanbul ignore next */\n if (typeof window !== 'undefined' && !window.requestAnimationFrame) {\n window.requestAnimationFrame =\n window.webkitRequestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n function (callback) {\n window.setInterval(callback, 1000 / 60);\n };\n }\n /* istanbul ignore next */\n if (typeof window !== 'undefined' && !window.cancelAnimationFrame) {\n window.cancelAnimationFrame =\n window.webkitCancelAnimationFrame ||\n window.mozCancelAnimationFrame ||\n function () {\n return;\n };\n }\n /* istanbul ignore next */\n if (typeof window !== 'undefined' && !window.AudioContext) {\n if (window.webkitAudioContext) {\n const ctx = window.webkitAudioContext;\n const replaceMe = ctx.prototype.decodeAudioData;\n window.webkitAudioContext.prototype.decodeAudioData = function (arrayBuffer) {\n return new Promise((resolve, reject) => {\n replaceMe.call(this, arrayBuffer, resolve, reject);\n });\n };\n }\n window.AudioContext =\n window.AudioContext ||\n window.webkitAudioContext ||\n window.mozAudioContext ||\n window.msAudioContext ||\n window.oAudioContext;\n }\n /* istanbul ignore next */\n if (typeof window !== 'undefined' && !window.devicePixelRatio) {\n window.devicePixelRatio = window.devicePixelRatio || 1;\n }\n /* istanbul ignore next */\n if (typeof window !== 'undefined' && !window.requestIdleCallback) {\n // Adapted from https://developer.chrome.com/blog/using-requestidlecallback#checking_for_requestidlecallback\n window.requestIdleCallback =\n window.requestIdleCallback ||\n function (cb) {\n const start = Date.now();\n return setTimeout(function () {\n cb({\n didTimeout: false,\n timeRemaining: function () {\n return Math.max(0, 50 - (Date.now() - start));\n }\n });\n }, 1);\n };\n window.cancelIdleCallback =\n window.cancelIdleCallback ||\n function (id) {\n clearTimeout(id);\n };\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Resources/Font.ts\":\n/*!***************************!*\\\n !*** ./Resources/Font.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FontSource: () => (/* binding */ FontSource)\n/* harmony export */ });\n/* harmony import */ var _Graphics_Font__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Graphics/Font */ \"./Graphics/Font.ts\");\n/* harmony import */ var _Resource__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Resource */ \"./Resources/Resource.ts\");\n\n\nclass FontSource {\n constructor(\n /**\n * Path to the font resource relative from the HTML document hosting the game, or absolute\n */\n path, \n /**\n * The font family name\n */\n family, { bustCache, ...options } = {}) {\n this.path = path;\n this.family = family;\n this._isLoaded = false;\n this._resource = new _Resource__WEBPACK_IMPORTED_MODULE_0__.Resource(path, 'blob', bustCache);\n this._options = options;\n }\n async load() {\n if (this.isLoaded()) {\n return this.data;\n }\n try {\n const blob = await this._resource.load();\n const url = URL.createObjectURL(blob);\n if (!this.data) {\n this.data = new FontFace(this.family, `url(${url})`);\n document.fonts.add(this.data);\n }\n await this.data.load();\n this._isLoaded = true;\n }\n catch (error) {\n throw `Error loading FontSource from path '${this.path}' with error [${error.message}]`;\n }\n return this.data;\n }\n isLoaded() {\n return this._isLoaded;\n }\n /**\n * Build a font from this FontSource.\n * @param options {FontOptions} Override the font options\n */\n toFont(options) {\n return new _Graphics_Font__WEBPACK_IMPORTED_MODULE_1__.Font({ family: this.family, ...this._options, ...options });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Resources/Gif.ts\":\n/*!**************************!*\\\n !*** ./Resources/Gif.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Gif: () => (/* binding */ Gif),\n/* harmony export */ GifParser: () => (/* binding */ GifParser),\n/* harmony export */ Stream: () => (/* binding */ Stream)\n/* harmony export */ });\n/* harmony import */ var _Resource__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Resource */ \"./Resources/Resource.ts\");\n/* harmony import */ var _Graphics_SpriteSheet__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Graphics/SpriteSheet */ \"./Graphics/SpriteSheet.ts\");\n/* harmony import */ var _Graphics_Animation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Graphics/Animation */ \"./Graphics/Animation.ts\");\n/* harmony import */ var _Graphics_ImageSource__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Graphics/ImageSource */ \"./Graphics/ImageSource.ts\");\n\n\n\n\n/**\n * The {@apilink Texture} object allows games built in Excalibur to load image resources.\n * {@apilink Texture} is an {@apilink Loadable} which means it can be passed to a {@apilink Loader}\n * to pre-load before starting a level or game.\n */\nclass Gif {\n /**\n * @param path Path to the image resource\n * @param bustCache Optionally load texture with cache busting\n */\n constructor(path, bustCache = false) {\n this.path = path;\n /**\n * The width of the texture in pixels\n */\n this.width = 0;\n /**\n * The height of the texture in pixels\n */\n this.height = 0;\n this._images = [];\n this.data = [];\n this._sprites = [];\n this._resource = new _Resource__WEBPACK_IMPORTED_MODULE_0__.Resource(path, 'arraybuffer', bustCache);\n }\n /**\n * Should excalibur add a cache busting querystring? By default false.\n * Must be set before loading\n */\n get bustCache() {\n return this._resource.bustCache;\n }\n set bustCache(val) {\n this._resource.bustCache = val;\n }\n /**\n * Begins loading the texture and returns a promise to be resolved on completion\n */\n async load() {\n const arraybuffer = await this._resource.load();\n this._stream = new Stream(arraybuffer);\n this._gif = new GifParser(this._stream);\n const images = this._gif.images.map((i) => new _Graphics_ImageSource__WEBPACK_IMPORTED_MODULE_1__.ImageSource(i.src, false));\n // Load all textures\n await Promise.all(images.map((t) => t.load()));\n this.data = this._images = images;\n this._sprites = this._images.map((image) => {\n return image.toSprite();\n });\n return this.data;\n }\n isLoaded() {\n return !!this.data;\n }\n /**\n * Return a frame of the gif as a sprite by id\n * @param id\n */\n toSprite(id = 0) {\n var _a;\n return (_a = this._sprites[id]) !== null && _a !== void 0 ? _a : null;\n }\n /**\n * Return the gif as a spritesheet\n */\n toSpriteSheet() {\n const sprites = this._sprites;\n if (sprites.length) {\n return new _Graphics_SpriteSheet__WEBPACK_IMPORTED_MODULE_2__.SpriteSheet({ sprites });\n }\n return null;\n }\n /**\n * Transform the GIF into an animation with duration per frame\n * @param durationPerFrame Optionally override duration per frame\n */\n toAnimation(durationPerFrame) {\n var _a;\n const images = (_a = this._gif) === null || _a === void 0 ? void 0 : _a.images;\n if (images === null || images === void 0 ? void 0 : images.length) {\n const frames = images.map((image, index) => {\n var _a;\n return {\n graphic: this._sprites[index],\n duration: ((_a = this._gif) === null || _a === void 0 ? void 0 : _a.frames[index].delayMs) || undefined\n };\n });\n this._animation = new _Graphics_Animation__WEBPACK_IMPORTED_MODULE_3__.Animation({\n frames,\n frameDuration: durationPerFrame\n });\n return this._animation;\n }\n return null;\n }\n get readCheckBytes() {\n var _a, _b;\n return (_b = (_a = this._gif) === null || _a === void 0 ? void 0 : _a.checkBytes) !== null && _b !== void 0 ? _b : [];\n }\n}\nconst bitsToNum = (ba) => {\n return ba.reduce(function (s, n) {\n return s * 2 + n;\n }, 0);\n};\nconst byteToBitArr = (bite) => {\n const a = [];\n for (let i = 7; i >= 0; i--) {\n a.push(!!(bite & (1 << i)));\n }\n return a;\n};\nclass Stream {\n constructor(dataArray) {\n this.len = 0;\n this.position = 0;\n this.readByte = () => {\n if (this.position >= this.data.byteLength) {\n throw new Error('Attempted to read past end of stream.');\n }\n return this.data[this.position++];\n };\n this.readBytes = (n) => {\n const bytes = [];\n for (let i = 0; i < n; i++) {\n bytes.push(this.readByte());\n }\n return bytes;\n };\n this.read = (n) => {\n let s = '';\n for (let i = 0; i < n; i++) {\n s += String.fromCharCode(this.readByte());\n }\n return s;\n };\n this.readUnsigned = () => {\n // Little-endian.\n const a = this.readBytes(2);\n return (a[1] << 8) + a[0];\n };\n this.data = new Uint8Array(dataArray);\n this.len = this.data.byteLength;\n if (this.len === 0) {\n throw new Error('No data loaded from file');\n }\n }\n}\nconst lzwDecode = function (minCodeSize, data) {\n // TODO: Now that the GIF parser is a bit different, maybe this should get an array of bytes instead of a String?\n let pos = 0; // Maybe this streaming thing should be merged with the Stream?\n const readCode = function (size) {\n let code = 0;\n for (let i = 0; i < size; i++) {\n if (data.charCodeAt(pos >> 3) & (1 << (pos & 7))) {\n code |= 1 << i;\n }\n pos++;\n }\n return code;\n };\n const output = [];\n const clearCode = 1 << minCodeSize;\n const eoiCode = clearCode + 1;\n let codeSize = minCodeSize + 1;\n let dict = [];\n const clear = function () {\n dict = [];\n codeSize = minCodeSize + 1;\n for (let i = 0; i < clearCode; i++) {\n dict[i] = [i];\n }\n dict[clearCode] = [];\n dict[eoiCode] = null;\n };\n let code = 0;\n let last = 0;\n while (true) {\n last = code;\n code = readCode(codeSize);\n if (code === clearCode) {\n clear();\n continue;\n }\n if (code === eoiCode) {\n break;\n }\n if (code < dict.length) {\n if (last !== clearCode) {\n dict.push(dict[last].concat(dict[code][0]));\n }\n }\n else {\n if (code !== dict.length) {\n throw new Error('Invalid LZW code.');\n }\n dict.push(dict[last].concat(dict[last][0]));\n }\n output.push.apply(output, dict[code]);\n if (dict.length === 1 << codeSize && codeSize < 12) {\n // If we're at the last code and codeSize is 12, the next code will be a clearCode, and it'll be 12 bits long.\n codeSize++;\n }\n }\n // I don't know if this is technically an error, but some GIFs do it.\n //if (Math.ceil(pos / 8) !== data.length) throw new Error('Extraneous LZW bytes.');\n return output;\n};\n/**\n * GifParser for binary format\n *\n * Roughly based on the documentation https://giflib.sourceforge.net/whatsinagif/index.html\n */\nclass GifParser {\n constructor(stream) {\n this._handler = {};\n this.frames = [];\n this.images = [];\n this.globalColorTableBytes = [];\n this.checkBytes = [];\n this.parseColorTableBytes = (entries) => {\n // Each entry is 3 bytes, for RGB.\n const colorTable = [];\n for (let i = 0; i < entries; i++) {\n const rgb = this._st.readBytes(3);\n colorTable.push(rgb);\n }\n return colorTable;\n };\n this.readSubBlocks = () => {\n let size, data;\n data = '';\n do {\n size = this._st.readByte();\n data += this._st.read(size);\n } while (size !== 0);\n return data;\n };\n this.parseHeader = () => {\n const hdr = {\n sig: '',\n ver: '',\n width: 0,\n height: 0,\n colorResolution: 0,\n globalColorTableSize: 0,\n gctFlag: false,\n sortedFlag: false,\n globalColorTable: [],\n backgroundColorIndex: 0,\n pixelAspectRatio: 0 // if not 0, aspectRatio = (pixelAspectRatio + 15) / 64\n };\n hdr.sig = this._st.read(3);\n hdr.ver = this._st.read(3);\n if (hdr.sig !== 'GIF') {\n throw new Error('Not a GIF file.'); // XXX: This should probably be handled more nicely.\n }\n hdr.width = this._st.readUnsigned();\n hdr.height = this._st.readUnsigned();\n this._currentFrameCanvas.width = hdr.width;\n this._currentFrameCanvas.height = hdr.height;\n const bits = byteToBitArr(this._st.readByte());\n hdr.gctFlag = bits.shift();\n hdr.colorResolution = bitsToNum(bits.splice(0, 3));\n hdr.sortedFlag = bits.shift();\n hdr.globalColorTableSize = bitsToNum(bits.splice(0, 3));\n hdr.backgroundColorIndex = this._st.readByte();\n hdr.pixelAspectRatio = this._st.readByte(); // if not 0, aspectRatio = (pixelAspectRatio + 15) / 64\n if (hdr.gctFlag) {\n // hdr.globalColorTable = this.parseColorTable(1 << (hdr.globalColorTableSize + 1));\n this.globalColorTableBytes = this.parseColorTableBytes(1 << (hdr.globalColorTableSize + 1));\n }\n if (this._handler.hdr && this._handler.hdr(hdr)) {\n this.checkBytes.push(this._handler.hdr);\n }\n };\n this.parseExt = (block) => {\n const parseGCExt = (block) => {\n this.checkBytes.push(this._st.readByte()); // Always 4\n const bits = byteToBitArr(this._st.readByte());\n block.reserved = bits.splice(0, 3); // Reserved; should be 000.\n block.disposalMethod = bitsToNum(bits.splice(0, 3));\n block.userInputFlag = bits.shift();\n block.transparentColorFlag = bits.shift();\n block.delayTime = this._st.readUnsigned();\n block.transparentColorIndex = this._st.readByte();\n block.terminator = this._st.readByte(); // always 0\n if (this._handler.gce && this._handler.gce(block)) {\n this.checkBytes.push(this._handler.gce);\n }\n return block;\n };\n const parseComExt = (block) => {\n block.comment = this.readSubBlocks();\n if (this._handler.com && this._handler.com(block)) {\n this.checkBytes.push(this._handler.com);\n }\n };\n const parsePTExt = (block) => {\n this.checkBytes.push(this._st.readByte()); // Always 12\n block.ptHeader = this._st.readBytes(12);\n block.ptData = this.readSubBlocks();\n if (this._handler.pte && this._handler.pte(block)) {\n this.checkBytes.push(this._handler.pte);\n }\n };\n const parseAppExt = (block) => {\n const parseNetscapeExt = (block) => {\n this.checkBytes.push(this._st.readByte()); // Always 3\n block.unknown = this._st.readByte(); // Q: Always 1? What is this?\n block.iterations = this._st.readUnsigned();\n block.terminator = this._st.readByte();\n if (this._handler.app && this._handler.app.NETSCAPE && this._handler.app.NETSCAPE(block)) {\n this.checkBytes.push(this._handler.app);\n }\n };\n const parseUnknownAppExt = (block) => {\n block.appData = this.readSubBlocks();\n // FIXME: This won't work if a handler wants to match on any identifier.\n if (this._handler.app && this._handler.app[block.identifier] && this._handler.app[block.identifier](block)) {\n this.checkBytes.push(this._handler.app[block.identifier]);\n }\n };\n this.checkBytes.push(this._st.readByte()); // Always 11\n block.identifier = this._st.read(8);\n block.authCode = this._st.read(3);\n switch (block.identifier) {\n case 'NETSCAPE':\n parseNetscapeExt(block);\n break;\n default:\n parseUnknownAppExt(block);\n break;\n }\n };\n const parseUnknownExt = (block) => {\n block.data = this.readSubBlocks();\n if (this._handler.unknown && this._handler.unknown(block)) {\n this.checkBytes.push(this._handler.unknown);\n }\n };\n block.label = this._st.readByte();\n switch (block.label) {\n case 0xf9:\n block.extType = 'gce';\n this._gce = parseGCExt(block);\n break;\n case 0xfe:\n block.extType = 'com';\n parseComExt(block);\n break;\n case 0x01:\n block.extType = 'pte';\n parsePTExt(block);\n break;\n case 0xff:\n block.extType = 'app';\n parseAppExt(block);\n break;\n default:\n block.extType = 'unknown';\n parseUnknownExt(block);\n break;\n }\n };\n this.parseImg = (img) => {\n var _a;\n const deinterlace = (pixels, width) => {\n // Of course this defeats the purpose of interlacing. And it's *probably*\n // the least efficient way it's ever been implemented. But nevertheless...\n const newPixels = new Array(pixels.length);\n const rows = pixels.length / width;\n const cpRow = (toRow, fromRow) => {\n const fromPixels = pixels.slice(fromRow * width, (fromRow + 1) * width);\n newPixels.splice.apply(newPixels, [toRow * width, width].concat(fromPixels));\n };\n const offsets = [0, 4, 2, 1];\n const steps = [8, 8, 4, 2];\n let fromRow = 0;\n for (let pass = 0; pass < 4; pass++) {\n for (let toRow = offsets[pass]; toRow < rows; toRow += steps[pass]) {\n cpRow(toRow, fromRow);\n fromRow++;\n }\n }\n return newPixels;\n };\n img.leftPos = this._st.readUnsigned();\n img.topPos = this._st.readUnsigned();\n img.width = this._st.readUnsigned();\n img.height = this._st.readUnsigned();\n const bits = byteToBitArr(this._st.readByte());\n img.lctFlag = bits.shift();\n img.interlaced = bits.shift();\n img.sorted = bits.shift();\n img.reserved = bits.splice(0, 2);\n img.lctSize = bitsToNum(bits.splice(0, 3));\n if (img.lctFlag) {\n img.lctBytes = this.parseColorTableBytes(1 << (img.lctSize + 1));\n }\n img.lzwMinCodeSize = this._st.readByte();\n const lzwData = this.readSubBlocks();\n img.pixels = lzwDecode(img.lzwMinCodeSize, lzwData);\n if (img.interlaced) {\n // Move\n img.pixels = deinterlace(img.pixels, img.width);\n }\n if ((_a = this._gce) === null || _a === void 0 ? void 0 : _a.delayTime) {\n img.delayMs = this._gce.delayTime * 10;\n }\n this.frames.push(img);\n this.arrayToImage(img, img.lctFlag ? img.lctBytes : this.globalColorTableBytes);\n if (this._handler.img && this._handler.img(img)) {\n this.checkBytes.push(this._handler);\n }\n };\n this.parseBlocks = () => {\n const block = {\n sentinel: this._st.readByte(),\n type: ''\n };\n const blockChar = String.fromCharCode(block.sentinel);\n switch (blockChar) {\n case '!':\n block.type = 'ext';\n this.parseExt(block);\n break;\n case ',':\n block.type = 'img';\n this.parseImg(block);\n break;\n case ';':\n block.type = 'eof';\n if (this._handler.eof && this._handler.eof(block)) {\n this.checkBytes.push(this._handler.eof);\n }\n break;\n default:\n throw new Error('Unknown block: 0x' + block.sentinel.toString(16));\n }\n if (block.type !== 'eof') {\n this.parseBlocks();\n }\n };\n this.arrayToImage = (frame, colorTable) => {\n var _a, _b, _c, _d;\n const canvas = document.createElement('canvas');\n canvas.width = frame.width;\n canvas.height = frame.height;\n const context = canvas.getContext('2d');\n const imageData = context.getImageData(0, 0, canvas.width, canvas.height);\n let transparentColorIndex = -1;\n if ((_a = this._gce) === null || _a === void 0 ? void 0 : _a.transparentColorFlag) {\n transparentColorIndex = this._gce.transparentColorIndex;\n }\n for (let pixel = 0; pixel < frame.pixels.length; pixel++) {\n const colorIndex = frame.pixels[pixel];\n const color = colorTable[colorIndex];\n if (colorIndex === transparentColorIndex) {\n imageData.data.set([0, 0, 0, 0], pixel * 4);\n }\n else {\n imageData.data.set([...color, 255], pixel * 4);\n }\n }\n context.putImageData(imageData, 0, 0);\n // A value of 1 which tells the decoder to leave the image in place and draw the next image on top of it.\n // A value of 2 would have meant that the canvas should be restored to the background color (as indicated by the logical screen descriptor).\n // A value of 3 is defined to mean that the decoder should restore the canvas to its previous state before the current image was drawn.\n // The behavior for values 4-7 are yet to be defined.\n if (((_b = this._gce) === null || _b === void 0 ? void 0 : _b.disposalMethod) === 1 && this.images.length) {\n this._currentFrameContext.drawImage(this.images[this.images.length - 1], 0, 0);\n }\n else if (((_c = this._gce) === null || _c === void 0 ? void 0 : _c.disposalMethod) === 2 && ((_d = this._hdr) === null || _d === void 0 ? void 0 : _d.gctFlag)) {\n const bg = colorTable[this._hdr.backgroundColorIndex];\n this._currentFrameContext.fillStyle = `rgb(${bg[0]}, ${bg[1]}, ${bg[2]})`;\n this._currentFrameContext.fillRect(0, 0, this._hdr.width, this._hdr.height);\n }\n else {\n this._currentFrameContext.clearRect(0, 0, this._currentFrameCanvas.width, this._currentFrameCanvas.height);\n }\n this._currentFrameContext.drawImage(canvas, frame.leftPos, frame.topPos, frame.width, frame.height);\n const img = new Image();\n img.src = this._currentFrameCanvas.toDataURL(); // default is png\n this.images.push(img);\n };\n this._st = stream;\n this._handler = {};\n this._currentFrameCanvas = document.createElement('canvas');\n this._currentFrameContext = this._currentFrameCanvas.getContext('2d');\n this.parseHeader();\n this.parseBlocks();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Resources/Index.ts\":\n/*!****************************!*\\\n !*** ./Resources/Index.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AudioContextFactory: () => (/* reexport safe */ _Sound_Index__WEBPACK_IMPORTED_MODULE_1__.AudioContextFactory),\n/* harmony export */ FontSource: () => (/* reexport safe */ _Font__WEBPACK_IMPORTED_MODULE_3__.FontSource),\n/* harmony export */ Gif: () => (/* reexport safe */ _Gif__WEBPACK_IMPORTED_MODULE_2__.Gif),\n/* harmony export */ GifParser: () => (/* reexport safe */ _Gif__WEBPACK_IMPORTED_MODULE_2__.GifParser),\n/* harmony export */ Resource: () => (/* reexport safe */ _Resource__WEBPACK_IMPORTED_MODULE_0__.Resource),\n/* harmony export */ ResourceEvents: () => (/* reexport safe */ _Resource__WEBPACK_IMPORTED_MODULE_0__.ResourceEvents),\n/* harmony export */ Sound: () => (/* reexport safe */ _Sound_Index__WEBPACK_IMPORTED_MODULE_1__.Sound),\n/* harmony export */ SoundEvents: () => (/* reexport safe */ _Sound_Index__WEBPACK_IMPORTED_MODULE_1__.SoundEvents),\n/* harmony export */ Stream: () => (/* reexport safe */ _Gif__WEBPACK_IMPORTED_MODULE_2__.Stream),\n/* harmony export */ WebAudioInstance: () => (/* reexport safe */ _Sound_Index__WEBPACK_IMPORTED_MODULE_1__.WebAudioInstance)\n/* harmony export */ });\n/* harmony import */ var _Resource__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Resource */ \"./Resources/Resource.ts\");\n/* harmony import */ var _Sound_Index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Sound/Index */ \"./Resources/Sound/Index.ts\");\n/* harmony import */ var _Gif__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Gif */ \"./Resources/Gif.ts\");\n/* harmony import */ var _Font__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Font */ \"./Resources/Font.ts\");\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Resources/Resource.ts\":\n/*!*******************************!*\\\n !*** ./Resources/Resource.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Resource: () => (/* binding */ Resource),\n/* harmony export */ ResourceEvents: () => (/* binding */ ResourceEvents)\n/* harmony export */ });\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n\n\nconst ResourceEvents = {\n Complete: 'complete',\n Load: 'load',\n LoadStart: 'loadstart',\n Progress: 'progress',\n Error: 'error'\n};\n/**\n * The {@apilink Resource} type allows games built in Excalibur to load generic resources.\n * For any type of remote resource it is recommended to use {@apilink Resource} for preloading.\n */\nclass Resource {\n /**\n * @param path Path to the remote resource\n * @param responseType The type to expect as a response: \"\" | \"arraybuffer\" | \"blob\" | \"document\" | \"json\" | \"text\";\n * @param bustCache Whether or not to cache-bust requests\n */\n constructor(path, responseType, bustCache = false) {\n this.path = path;\n this.responseType = responseType;\n this.bustCache = bustCache;\n this.data = null;\n this.logger = _Util_Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance();\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_1__.EventEmitter();\n }\n /**\n * Returns true if the Resource is completely loaded and is ready\n * to be drawn.\n */\n isLoaded() {\n return this.data !== null;\n }\n _cacheBust(uri) {\n const query = /\\?\\w*=\\w*/;\n if (query.test(uri)) {\n uri += '&__=' + Date.now();\n }\n else {\n uri += '?__=' + Date.now();\n }\n return uri;\n }\n /**\n * Begin loading the resource and returns a promise to be resolved on completion\n */\n load() {\n return new Promise((resolve, reject) => {\n // Exit early if we already have data\n if (this.data !== null) {\n this.logger.debug('Already have data for resource', this.path);\n this.events.emit('complete', this.data);\n resolve(this.data);\n return;\n }\n const request = new XMLHttpRequest();\n request.open('GET', this.bustCache ? this._cacheBust(this.path) : this.path, true);\n request.responseType = this.responseType;\n request.addEventListener('loadstart', (e) => this.events.emit('loadstart', e));\n request.addEventListener('progress', (e) => this.events.emit('progress', e));\n request.addEventListener('error', (e) => this.events.emit('error', e));\n request.addEventListener('load', (e) => this.events.emit('load', e));\n request.addEventListener('load', () => {\n // XHR on file:// success status is 0, such as with PhantomJS\n if (request.status !== 0 && request.status !== 200) {\n this.logger.error('Failed to load resource ', this.path, ' server responded with error code', request.status);\n this.events.emit('error', request.response);\n reject(new Error(request.statusText));\n return;\n }\n if (request.response instanceof Blob && request.response.type === 'text/html') {\n const errorText = `Expected blob (usually image) data from the server when loading ${this.path}, but got HTML content instead!\r\n\r\nCheck your server configuration, for example Vite serves static files from the /public folder`;\n this.events.emit('error', request.response);\n reject(new Error(errorText));\n return;\n }\n this.data = request.response;\n this.events.emit('complete', this.data);\n this.logger.debug('Completed loading resource', this.path);\n resolve(this.data);\n });\n request.send();\n });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Resources/Sound/AudioContext.ts\":\n/*!*****************************************!*\\\n !*** ./Resources/Sound/AudioContext.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AudioContextFactory: () => (/* binding */ AudioContextFactory)\n/* harmony export */ });\n/**\n * Internal class used to build instances of AudioContext\n */\n/* istanbul ignore next */\nclass AudioContextFactory {\n static create() {\n if (!this._INSTANCE) {\n if (window.AudioContext || window.webkitAudioContext) {\n this._INSTANCE = new AudioContext();\n }\n }\n return this._INSTANCE;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Resources/Sound/Index.ts\":\n/*!**********************************!*\\\n !*** ./Resources/Sound/Index.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AudioContextFactory: () => (/* reexport safe */ _AudioContext__WEBPACK_IMPORTED_MODULE_1__.AudioContextFactory),\n/* harmony export */ Sound: () => (/* reexport safe */ _Sound__WEBPACK_IMPORTED_MODULE_0__.Sound),\n/* harmony export */ SoundEvents: () => (/* reexport safe */ _Sound__WEBPACK_IMPORTED_MODULE_0__.SoundEvents),\n/* harmony export */ WebAudioInstance: () => (/* reexport safe */ _WebAudioInstance__WEBPACK_IMPORTED_MODULE_2__.WebAudioInstance)\n/* harmony export */ });\n/* harmony import */ var _Sound__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Sound */ \"./Resources/Sound/Sound.ts\");\n/* harmony import */ var _AudioContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./AudioContext */ \"./Resources/Sound/AudioContext.ts\");\n/* harmony import */ var _WebAudioInstance__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./WebAudioInstance */ \"./Resources/Sound/WebAudioInstance.ts\");\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Resources/Sound/Sound.ts\":\n/*!**********************************!*\\\n !*** ./Resources/Sound/Sound.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Sound: () => (/* binding */ Sound),\n/* harmony export */ SoundEvents: () => (/* binding */ SoundEvents)\n/* harmony export */ });\n/* harmony import */ var _Interfaces_AudioImplementation__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Interfaces/AudioImplementation */ \"./Interfaces/AudioImplementation.ts\");\n/* harmony import */ var _Resource__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Resource */ \"./Resources/Resource.ts\");\n/* harmony import */ var _WebAudioInstance__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./WebAudioInstance */ \"./Resources/Sound/WebAudioInstance.ts\");\n/* harmony import */ var _AudioContext__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./AudioContext */ \"./Resources/Sound/AudioContext.ts\");\n/* harmony import */ var _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Events/MediaEvents */ \"./Events/MediaEvents.ts\");\n/* harmony import */ var _Util_Sound__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../Util/Sound */ \"./Util/Sound.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n\n\n\n\n\nconst SoundEvents = {\n VolumeChange: 'volumechange',\n Processed: 'processed',\n Pause: 'pause',\n Stop: 'stop',\n PlaybackEnd: 'playbackend',\n Resume: 'resume',\n PlaybackStart: 'playbackstart'\n};\n/**\n * The {@apilink Sound} object allows games built in Excalibur to load audio\n * components, from soundtracks to sound effects. {@apilink Sound} is an {@apilink Loadable}\n * which means it can be passed to a {@apilink Loader} to pre-load before a game or level.\n */\nclass Sound {\n /**\n * Indicates whether the clip should loop when complete\n * @param value Set the looping flag\n */\n set loop(value) {\n this._loop = value;\n for (const track of this._tracks) {\n track.loop = this._loop;\n }\n this.logger.debug('Set loop for all instances of sound', this.path, 'to', this._loop);\n }\n get loop() {\n return this._loop;\n }\n set volume(value) {\n this._volume = value;\n for (const track of this._tracks) {\n track.volume = this._volume;\n }\n this.events.emit('volumechange', new _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_0__.NativeSoundEvent(this));\n this.logger.debug('Set loop for all instances of sound', this.path, 'to', this._volume);\n }\n get volume() {\n return this._volume;\n }\n /**\n * Get the duration that this audio should play. If unset the total natural playback duration will be used.\n */\n get duration() {\n return this._duration;\n }\n /**\n * Set the duration that this audio should play. If unset the total natural playback duration will be used.\n *\n * Note: if you seek to a specific point the duration will start from that point, for example\n *\n * If you have a 10 second clip, seek to 5 seconds, then set the duration to 2, it will play the clip from 5-7 seconds.\n */\n set duration(duration) {\n this._duration = duration;\n }\n /**\n * Return array of Current AudioInstances playing or being paused\n */\n get instances() {\n return this._tracks;\n }\n get path() {\n return this._resource.path;\n }\n set path(val) {\n this._resource.path = val;\n }\n /**\n * Should excalibur add a cache busting querystring? By default false.\n * Must be set before loading\n */\n get bustCache() {\n return this._resource.bustCache;\n }\n set bustCache(val) {\n this._resource.bustCache = val;\n }\n /**\n * @param paths A list of audio sources (clip.wav, clip.mp3, clip.ogg) for this audio clip. This is done for browser compatibility.\n */\n constructor(...paths) {\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_1__.EventEmitter();\n this.logger = _Util_Log__WEBPACK_IMPORTED_MODULE_2__.Logger.getInstance();\n this._loop = false;\n this._volume = 1;\n this._isStopped = false;\n // private _isPaused = false;\n this._tracks = [];\n this._wasPlayingOnHidden = false;\n this._playbackRate = 1.0;\n this._audioContext = _AudioContext__WEBPACK_IMPORTED_MODULE_3__.AudioContextFactory.create();\n this._resource = new _Resource__WEBPACK_IMPORTED_MODULE_4__.Resource('', _Interfaces_AudioImplementation__WEBPACK_IMPORTED_MODULE_5__.ExResponse.type.arraybuffer);\n /**\n * Chrome : MP3, WAV, Ogg\n * Firefox : WAV, Ogg,\n * IE : MP3, WAV coming soon\n * Safari MP3, WAV, Ogg\n */\n for (const path of paths) {\n if ((0,_Util_Sound__WEBPACK_IMPORTED_MODULE_6__.canPlayFile)(path)) {\n this.path = path;\n break;\n }\n }\n if (!this.path) {\n this.logger.warn('This browser does not support any of the audio files specified:', paths.join(', '));\n this.logger.warn('Attempting to use', paths[0]);\n this.path = paths[0]; // select the first specified\n }\n }\n isLoaded() {\n return !!this.data;\n }\n async load() {\n var _a, _b;\n if (this.data) {\n return this.data;\n }\n const arraybuffer = await this._resource.load();\n const audiobuffer = await this.decodeAudio(arraybuffer.slice(0));\n this._duration = (_b = (_a = this._duration) !== null && _a !== void 0 ? _a : audiobuffer === null || audiobuffer === void 0 ? void 0 : audiobuffer.duration) !== null && _b !== void 0 ? _b : undefined;\n this.events.emit('processed', new _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_0__.NativeSoundProcessedEvent(this, audiobuffer));\n return (this.data = audiobuffer);\n }\n async decodeAudio(data) {\n try {\n return await this._audioContext.decodeAudioData(data.slice(0));\n }\n catch (e) {\n this.logger.error('Unable to decode ' +\n ' this browser may not fully support this format, or the file may be corrupt, ' +\n 'if this is an mp3 try removing id3 tags and album art from the file.');\n return await Promise.reject();\n }\n }\n wireEngine(engine) {\n if (engine) {\n this._engine = engine;\n this._engine.on('hidden', () => {\n if (engine.pauseAudioWhenHidden && this.isPlaying()) {\n this._wasPlayingOnHidden = true;\n this.pause();\n }\n });\n this._engine.on('visible', () => {\n if (engine.pauseAudioWhenHidden && this._wasPlayingOnHidden) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.play();\n this._wasPlayingOnHidden = false;\n }\n });\n this._engine.on('start', () => {\n this._isStopped = false;\n });\n this._engine.on('stop', () => {\n this.stop();\n this._isStopped = true;\n });\n }\n }\n /**\n * Returns how many instances of the sound are currently playing\n */\n instanceCount() {\n return this._tracks.length;\n }\n /**\n * Whether or not the sound is playing right now\n */\n isPlaying() {\n return this._tracks.some((t) => t.isPlaying());\n }\n isPaused() {\n return this._tracks.some((t) => t.isPaused());\n }\n isStopped() {\n return this._tracks.some((t) => t.isStopped());\n }\n /**\n * Play the sound, returns a promise that resolves when the sound is done playing\n * An optional volume argument can be passed in to play the sound. Max volume is 1.0\n */\n play(volume) {\n if (!this.isLoaded()) {\n this.logger.warn('Cannot start playing. Resource', this.path, 'is not loaded yet');\n return Promise.resolve(true);\n }\n if (this._isStopped) {\n this.logger.warn('Cannot start playing. Engine is in a stopped state.');\n return Promise.resolve(false);\n }\n this.volume = volume || this.volume;\n if (this.isPaused()) {\n return this._resumePlayback();\n }\n else {\n return this._startPlayback();\n }\n }\n /**\n * Stop the sound, and do not rewind\n */\n pause() {\n if (!this.isPlaying()) {\n return;\n }\n for (const track of this._tracks) {\n track.pause();\n }\n this.events.emit('pause', new _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_0__.NativeSoundEvent(this));\n this.logger.debug('Paused all instances of sound', this.path);\n }\n /**\n * Stop the sound if it is currently playing and rewind the track. If the sound is not playing, rewinds the track.\n */\n stop() {\n for (const track of this._tracks) {\n track.stop();\n }\n this.events.emit('stop', new _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_0__.NativeSoundEvent(this));\n this._tracks.length = 0;\n this.logger.debug('Stopped all instances of sound', this.path);\n }\n get playbackRate() {\n return this._playbackRate;\n }\n set playbackRate(playbackRate) {\n this._playbackRate = playbackRate;\n this._tracks.forEach((t) => {\n t.playbackRate = this._playbackRate;\n });\n }\n seek(position, trackId = 0) {\n if (this._tracks.length === 0) {\n this._getTrackInstance(this.data);\n }\n this._tracks[trackId].seek(position);\n }\n getTotalPlaybackDuration() {\n if (!this.isLoaded()) {\n this.logger.warnOnce(`Sound from ${this.path} is not loaded, cannot return total playback duration.` +\n `Did you forget to add Sound to a loader? https://excaliburjs.com/docs/loaders/`);\n return 0;\n }\n return this.data.duration;\n }\n /**\n * Return the current playback time of the playing track in seconds from the start.\n *\n * Optionally specify the track to query if multiple are playing at once.\n * @param trackId\n */\n getPlaybackPosition(trackId = 0) {\n if (this._tracks.length) {\n return this._tracks[trackId].getPlaybackPosition();\n }\n return 0;\n }\n /**\n * Get Id of provided AudioInstance in current trackList\n * @param track {@apilink Audio} which Id is to be given\n */\n getTrackId(track) {\n return this._tracks.indexOf(track);\n }\n async _resumePlayback() {\n if (this.isPaused()) {\n const resumed = [];\n // ensure we resume *current* tracks (if paused)\n for (const track of this._tracks) {\n resumed.push(track.play().then(() => {\n this._tracks.splice(this.getTrackId(track), 1);\n return true;\n }));\n }\n this.events.emit('resume', new _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_0__.NativeSoundEvent(this));\n this.logger.debug('Resuming paused instances for sound', this.path, this._tracks);\n // resolve when resumed tracks are done\n await Promise.all(resumed);\n }\n return true;\n }\n /**\n * Starts playback, returns a promise that resolves when playback is complete\n */\n async _startPlayback() {\n const track = this._getTrackInstance(this.data);\n const complete = await track.play(() => {\n this.events.emit('playbackstart', new _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_0__.NativeSoundEvent(this, track));\n this.logger.debug('Playing new instance for sound', this.path);\n });\n this.events.emit('playbackend', new _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_0__.NativeSoundEvent(this, track));\n // cleanup any done tracks\n const trackId = this.getTrackId(track);\n if (trackId !== -1) {\n this._tracks.splice(trackId, 1);\n }\n return complete;\n }\n _getTrackInstance(data) {\n var _a;\n const newTrack = new _WebAudioInstance__WEBPACK_IMPORTED_MODULE_7__.WebAudioInstance(data);\n newTrack.loop = this.loop;\n newTrack.volume = this.volume;\n newTrack.duration = (_a = this.duration) !== null && _a !== void 0 ? _a : 0;\n newTrack.playbackRate = this._playbackRate;\n this._tracks.push(newTrack);\n return newTrack;\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Resources/Sound/WebAudioInstance.ts\":\n/*!*********************************************!*\\\n !*** ./Resources/Sound/WebAudioInstance.ts ***!\n \\*********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ WebAudioInstance: () => (/* binding */ WebAudioInstance)\n/* harmony export */ });\n/* harmony import */ var _Util_StateMachine__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Util/StateMachine */ \"./Util/StateMachine.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _AudioContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./AudioContext */ \"./Resources/Sound/AudioContext.ts\");\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Util/Future */ \"./Util/Future.ts\");\n\n\n\n\n/**\n * Internal class representing a Web Audio AudioBufferSourceNode instance\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API\n */\nclass WebAudioInstance {\n _createNewBufferSource() {\n this._instance = this._audioContext.createBufferSource();\n this._instance.buffer = this._src;\n this._instance.loop = this.loop;\n this._instance.playbackRate.value = this._playbackRate;\n this._instance.connect(this._volumeNode);\n this._volumeNode.connect(this._audioContext.destination);\n }\n _handleEnd() {\n if (!this.loop) {\n this._instance.onended = () => {\n this._playingFuture.resolve(true);\n };\n }\n }\n set loop(value) {\n this._loop = value;\n if (this._instance) {\n this._instance.loop = value;\n if (!this.loop) {\n this._instance.onended = () => {\n this._playingFuture.resolve(true);\n };\n }\n }\n }\n get loop() {\n return this._loop;\n }\n set volume(value) {\n value = (0,_Math_util__WEBPACK_IMPORTED_MODULE_0__.clamp)(value, 0, 1.0);\n this._volume = value;\n if (this._stateMachine.in('PLAYING') && this._volumeNode.gain.setTargetAtTime) {\n // https://developer.mozilla.org/en-US/docs/Web/API/AudioParam/setTargetAtTime\n // After each .1 seconds timestep, the target value will ~63.2% closer to the target value.\n // This exponential ramp provides a more pleasant transition in gain\n this._volumeNode.gain.setTargetAtTime(value, this._audioContext.currentTime, 0.1);\n }\n else {\n this._volumeNode.gain.value = value;\n }\n }\n get volume() {\n return this._volume;\n }\n /**\n * Returns the set duration to play, otherwise returns the total duration if unset\n */\n get duration() {\n var _a;\n return (_a = this._duration) !== null && _a !== void 0 ? _a : this.getTotalPlaybackDuration();\n }\n /**\n * Set the duration that this audio should play.\n *\n * Note: if you seek to a specific point the duration will start from that point, for example\n *\n * If you have a 10 second clip, seek to 5 seconds, then set the duration to 2, it will play the clip from 5-7 seconds.\n */\n set duration(duration) {\n this._duration = duration;\n }\n constructor(_src) {\n this._src = _src;\n this._audioContext = _AudioContext__WEBPACK_IMPORTED_MODULE_1__.AudioContextFactory.create();\n this._volumeNode = this._audioContext.createGain();\n this._playingFuture = new _Util_Future__WEBPACK_IMPORTED_MODULE_2__.Future();\n this._stateMachine = _Util_StateMachine__WEBPACK_IMPORTED_MODULE_3__.StateMachine.create({\n start: 'STOPPED',\n states: {\n PLAYING: {\n onEnter: ({ data }) => {\n // Buffer nodes are single use\n this._createNewBufferSource();\n this._handleEnd();\n if (this.loop) {\n // when looping don't set a duration\n this._instance.start(0, data.pausedAt * this._playbackRate);\n }\n else {\n this._instance.start(0, data.pausedAt * this._playbackRate, this.duration);\n }\n data.startedAt = this._audioContext.currentTime - data.pausedAt;\n data.pausedAt = 0;\n },\n onState: () => this._playStarted(),\n onExit: ({ to }) => {\n // If you've exited early only resolve if explicitly STOPPED\n if (to === 'STOPPED') {\n this._playingFuture.resolve(true);\n }\n // Whenever you're not playing... you stop!\n this._instance.onended = null; // disconnect the wired on-end handler\n this._instance.disconnect();\n this._instance.stop(0);\n this._instance = null;\n },\n transitions: ['STOPPED', 'PAUSED', 'SEEK']\n },\n SEEK: {\n onEnter: ({ eventData: position, data }) => {\n data.pausedAt = (position !== null && position !== void 0 ? position : 0) / this._playbackRate;\n data.startedAt = 0;\n },\n transitions: ['*']\n },\n STOPPED: {\n onEnter: ({ data }) => {\n data.pausedAt = 0;\n data.startedAt = 0;\n this._playingFuture.resolve(true);\n },\n transitions: ['PLAYING', 'PAUSED', 'SEEK']\n },\n PAUSED: {\n onEnter: ({ data }) => {\n // Playback rate will be a scale factor of how fast/slow the audio is being played\n // default is 1.0\n // we need to invert it to get the time scale\n data.pausedAt = this._audioContext.currentTime - data.startedAt;\n },\n transitions: ['PLAYING', 'STOPPED', 'SEEK']\n }\n }\n }, {\n startedAt: 0,\n pausedAt: 0\n });\n this._volume = 1;\n this._loop = false;\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n this._playStarted = () => { };\n this._playbackRate = 1.0;\n this._createNewBufferSource();\n }\n isPlaying() {\n return this._stateMachine.in('PLAYING');\n }\n isPaused() {\n return this._stateMachine.in('PAUSED') || this._stateMachine.in('SEEK');\n }\n isStopped() {\n return this._stateMachine.in('STOPPED');\n }\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n play(playStarted = () => { }) {\n this._playStarted = playStarted;\n this._stateMachine.go('PLAYING');\n return this._playingFuture.promise;\n }\n pause() {\n this._stateMachine.go('PAUSED');\n }\n stop() {\n this._stateMachine.go('STOPPED');\n }\n seek(position) {\n this._stateMachine.go('PAUSED');\n this._stateMachine.go('SEEK', position);\n }\n getTotalPlaybackDuration() {\n return this._src.duration;\n }\n getPlaybackPosition() {\n const { pausedAt, startedAt } = this._stateMachine.data;\n if (pausedAt) {\n return pausedAt * this._playbackRate;\n }\n if (startedAt) {\n return (this._audioContext.currentTime - startedAt) * this._playbackRate;\n }\n return 0;\n }\n set playbackRate(playbackRate) {\n this._instance.playbackRate.value = this._playbackRate = playbackRate;\n }\n get playbackRate() {\n return this._instance.playbackRate.value;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Scene.ts\":\n/*!******************!*\\\n !*** ./Scene.ts ***!\n \\******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PreLoadEvent: () => (/* binding */ PreLoadEvent),\n/* harmony export */ Scene: () => (/* binding */ Scene),\n/* harmony export */ SceneEvents: () => (/* binding */ SceneEvents),\n/* harmony export */ isSceneConstructor: () => (/* binding */ isSceneConstructor)\n/* harmony export */ });\n/* harmony import */ var _ScreenElement__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./ScreenElement */ \"./ScreenElement.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./Events */ \"./Events.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Timer__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./Timer */ \"./Timer.ts\");\n/* harmony import */ var _TileMap__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./TileMap */ \"./TileMap/TileMap.ts\");\n/* harmony import */ var _Camera__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Camera */ \"./Camera.ts\");\n/* harmony import */ var _Actor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Actor */ \"./Actor.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./Util/Util */ \"./Util/Util.ts\");\n/* harmony import */ var _Trigger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Trigger */ \"./Trigger.ts\");\n/* harmony import */ var _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./EntityComponentSystem/System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _EntityComponentSystem_World__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./EntityComponentSystem/World */ \"./EntityComponentSystem/World.ts\");\n/* harmony import */ var _Collision_MotionSystem__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Collision/MotionSystem */ \"./Collision/MotionSystem.ts\");\n/* harmony import */ var _Collision_CollisionSystem__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Collision/CollisionSystem */ \"./Collision/CollisionSystem.ts\");\n/* harmony import */ var _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./EntityComponentSystem/Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _Graphics_GraphicsSystem__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Graphics/GraphicsSystem */ \"./Graphics/GraphicsSystem.ts\");\n/* harmony import */ var _Debug_DebugSystem__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Debug/DebugSystem */ \"./Debug/DebugSystem.ts\");\n/* harmony import */ var _Input_PointerSystem__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Input/PointerSystem */ \"./Input/PointerSystem.ts\");\n/* harmony import */ var _Actions_ActionsSystem__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Actions/ActionsSystem */ \"./Actions/ActionsSystem.ts\");\n/* harmony import */ var _TileMap_IsometricEntitySystem__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./TileMap/IsometricEntitySystem */ \"./TileMap/IsometricEntitySystem.ts\");\n/* harmony import */ var _Graphics_OffscreenSystem__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Graphics/OffscreenSystem */ \"./Graphics/OffscreenSystem.ts\");\n/* harmony import */ var _Collision_PhysicsWorld__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Collision/PhysicsWorld */ \"./Collision/PhysicsWorld.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Input_InputHost__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./Input/InputHost */ \"./Input/InputHost.ts\");\n/* harmony import */ var _Input_PointerScope__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Input/PointerScope */ \"./Input/PointerScope.ts\");\n/* harmony import */ var _Collision_PhysicsConfig__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Collision/PhysicsConfig */ \"./Collision/PhysicsConfig.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass PreLoadEvent {\n}\nconst SceneEvents = {\n Initialize: 'initialize',\n Activate: 'activate',\n Deactivate: 'deactivate',\n PreUpdate: 'preupdate',\n PostUpdate: 'postupdate',\n PreDraw: 'predraw',\n PostDraw: 'postdraw',\n PreDebugDraw: 'predebugdraw',\n PostDebugDraw: 'postdebugdraw',\n PreLoad: 'preload'\n};\n/**\n *\n */\nfunction isSceneConstructor(x) {\n var _a, _b;\n return !!(x === null || x === void 0 ? void 0 : x.prototype) && !!((_b = (_a = x === null || x === void 0 ? void 0 : x.prototype) === null || _a === void 0 ? void 0 : _a.constructor) === null || _b === void 0 ? void 0 : _b.name);\n}\n/**\n * {@apilink Actor | `Actors`} are composed together into groupings called Scenes in\n * Excalibur. The metaphor models the same idea behind real world\n * actors in a scene. Only actors in scenes will be updated and drawn.\n *\n * Typical usages of a scene include: levels, menus, loading screens, etc.\n */\nclass Scene {\n /**\n * The actors in the current scene\n */\n get actors() {\n return this.world.entityManager.entities.filter((e) => {\n return e instanceof _Actor__WEBPACK_IMPORTED_MODULE_0__.Actor;\n });\n }\n /**\n * The entities in the current scene\n */\n get entities() {\n return this.world.entityManager.entities;\n }\n /**\n * The triggers in the current scene\n */\n get triggers() {\n return this.world.entityManager.entities.filter((e) => {\n return e instanceof _Trigger__WEBPACK_IMPORTED_MODULE_1__.Trigger;\n });\n }\n /**\n * The {@apilink TileMap}s in the scene, if any\n */\n get tileMaps() {\n return this.world.entityManager.entities.filter((e) => {\n return e instanceof _TileMap__WEBPACK_IMPORTED_MODULE_2__.TileMap;\n });\n }\n get timers() {\n return this._timers;\n }\n constructor() {\n // Initialize systems\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_3__.Logger.getInstance();\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_4__.EventEmitter();\n /**\n * Gets or sets the current camera for the scene\n */\n this.camera = new _Camera__WEBPACK_IMPORTED_MODULE_5__.Camera();\n /**\n * The ECS world for the scene\n */\n this.world = new _EntityComponentSystem_World__WEBPACK_IMPORTED_MODULE_6__.World(this);\n /**\n * The Excalibur physics world for the scene. Used to interact\n * with colliders included in the scene.\n *\n * Can be used to perform scene ray casts, track colliders, broadphase, and narrowphase.\n */\n this.physics = new _Collision_PhysicsWorld__WEBPACK_IMPORTED_MODULE_7__.PhysicsWorld((0,_Collision_PhysicsConfig__WEBPACK_IMPORTED_MODULE_8__.getDefaultPhysicsConfig)());\n this._isInitialized = false;\n this._timers = [];\n this._cancelQueue = [];\n // Update\n this.world.add(_Actions_ActionsSystem__WEBPACK_IMPORTED_MODULE_9__.ActionsSystem);\n this.world.add(new _Collision_MotionSystem__WEBPACK_IMPORTED_MODULE_10__.MotionSystem(this.world, this.physics));\n this.world.add(new _Collision_CollisionSystem__WEBPACK_IMPORTED_MODULE_11__.CollisionSystem(this.world, this.physics));\n this.world.add(_Input_PointerSystem__WEBPACK_IMPORTED_MODULE_12__.PointerSystem);\n this.world.add(_TileMap_IsometricEntitySystem__WEBPACK_IMPORTED_MODULE_13__.IsometricEntitySystem);\n // Draw\n this.world.add(_Graphics_OffscreenSystem__WEBPACK_IMPORTED_MODULE_14__.OffscreenSystem);\n this.world.add(_Graphics_GraphicsSystem__WEBPACK_IMPORTED_MODULE_15__.GraphicsSystem);\n this.world.add(_Debug_DebugSystem__WEBPACK_IMPORTED_MODULE_16__.DebugSystem);\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n /**\n * Event hook to provide Scenes a way of loading scene specific resources.\n *\n * This is called before the Scene.onInitialize during scene transition. It will only ever fire once for a scene.\n * @param loader\n */\n onPreLoad(loader) {\n // will be overridden\n }\n /**\n * Event hook fired directly before transition, either \"in\" or \"out\" of the scene\n *\n * This overrides the Engine scene definition. However transitions specified in goToScene take highest precedence\n *\n * ```typescript\n * // Overrides all\n * Engine.goToScene('scene', { destinationIn: ..., sourceOut: ... });\n * ```\n *\n * This can be used to configure custom transitions for a scene dynamically\n */\n onTransition(direction) {\n // will be overridden\n return undefined;\n }\n /**\n * This is called before the first update of the {@apilink Scene}. Initializes scene members like the camera. This method is meant to be\n * overridden. This is where initialization of child actors should take place.\n */\n onInitialize(engine) {\n // will be overridden\n }\n /**\n * This is called when the scene is made active and started. It is meant to be overridden,\n * this is where you should setup any DOM UI or event handlers needed for the scene.\n */\n onActivate(context) {\n // will be overridden\n }\n /**\n * This is called when the scene is made transitioned away from and stopped. It is meant to be overridden,\n * this is where you should cleanup any DOM UI or event handlers needed for the scene.\n */\n onDeactivate(context) {\n // will be overridden\n }\n /**\n * Safe to override onPreUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPreUpdate` is called directly before a scene is updated.\n * @param engine reference to the engine\n * @param elapsed Number of milliseconds elapsed since the last draw.\n */\n onPreUpdate(engine, elapsed) {\n // will be overridden\n }\n /**\n * Safe to override onPostUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPostUpdate` is called directly after a scene is updated.\n * @param engine reference to the engine\n * @param elapsed Number of milliseconds elapsed since the last draw.\n */\n onPostUpdate(engine, elapsed) {\n // will be overridden\n }\n /**\n * Safe to override onPreDraw lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPreDraw` is called directly before a scene is drawn.\n *\n */\n onPreDraw(ctx, elapsed) {\n // will be overridden\n }\n /**\n * Safe to override onPostDraw lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPostDraw` is called directly after a scene is drawn.\n *\n */\n onPostDraw(ctx, elapsed) {\n // will be overridden\n }\n /**\n * Initializes actors in the scene\n */\n _initializeChildren() {\n for (const child of this.entities) {\n child._initialize(this.engine);\n }\n }\n /**\n * Gets whether or not the {@apilink Scene} has been initialized\n */\n get isInitialized() {\n return this._isInitialized;\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Initializes the scene before the first update, meant to be called by engine not by users of\n * Excalibur\n * @internal\n */\n async _initialize(engine) {\n var _a;\n if (!this.isInitialized) {\n try {\n this.engine = engine;\n // PhysicsWorld config is watched so things will automagically update\n this.physics.config = this.engine.physics;\n this.input = new _Input_InputHost__WEBPACK_IMPORTED_MODULE_17__.InputHost({\n pointerTarget: engine.pointerScope === _Input_PointerScope__WEBPACK_IMPORTED_MODULE_18__.PointerScope.Canvas ? engine.canvas : document,\n grabWindowFocus: engine.grabWindowFocus,\n engine\n });\n // Initialize camera first\n this.camera._initialize(engine);\n this.world.systemManager.initialize();\n // This order is important! we want to be sure any custom init that add actors\n // fire before the actor init\n await this.onInitialize(engine);\n this._initializeChildren();\n this._logger.debug('Scene.onInitialize', this, engine);\n this.events.emit('initialize', new _Events__WEBPACK_IMPORTED_MODULE_19__.InitializeEvent(engine, this));\n }\n catch (e) {\n this._logger.error(`Error during scene initialization for scene ${(_a = engine.director) === null || _a === void 0 ? void 0 : _a.getSceneName(this)}!`);\n throw e;\n }\n this._isInitialized = true;\n }\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Activates the scene with the base behavior, then calls the overridable `onActivate` implementation.\n * @internal\n */\n async _activate(context) {\n var _a, _b;\n try {\n this._logger.debug('Scene.onActivate', this);\n this.input.toggleEnabled(true);\n await this.onActivate(context);\n }\n catch (e) {\n this._logger.error(`Error during scene activation for scene ${(_b = (_a = this.engine) === null || _a === void 0 ? void 0 : _a.director) === null || _b === void 0 ? void 0 : _b.getSceneName(this)}!`);\n throw e;\n }\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Deactivates the scene with the base behavior, then calls the overridable `onDeactivate` implementation.\n * @internal\n */\n async _deactivate(context) {\n this._logger.debug('Scene.onDeactivate', this);\n this.input.toggleEnabled(false);\n await this.onDeactivate(context);\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _preupdate handler for {@apilink onPreUpdate} lifecycle event\n * @internal\n */\n _preupdate(engine, elapsed) {\n this.emit('preupdate', new _Events__WEBPACK_IMPORTED_MODULE_19__.PreUpdateEvent(engine, elapsed, this));\n this.onPreUpdate(engine, elapsed);\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _preupdate handler for {@apilink onPostUpdate} lifecycle event\n * @internal\n */\n _postupdate(engine, elapsed) {\n this.emit('postupdate', new _Events__WEBPACK_IMPORTED_MODULE_19__.PostUpdateEvent(engine, elapsed, this));\n this.onPostUpdate(engine, elapsed);\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _predraw handler for {@apilink onPreDraw} lifecycle event\n * @internal\n */\n _predraw(ctx, elapsed) {\n this.emit('predraw', new _Events__WEBPACK_IMPORTED_MODULE_19__.PreDrawEvent(ctx, elapsed, this));\n this.onPreDraw(ctx, elapsed);\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _postdraw handler for {@apilink onPostDraw} lifecycle event\n * @internal\n */\n _postdraw(ctx, elapsed) {\n this.emit('postdraw', new _Events__WEBPACK_IMPORTED_MODULE_19__.PostDrawEvent(ctx, elapsed, this));\n this.onPostDraw(ctx, elapsed);\n }\n /**\n * Updates all the actors and timers in the scene. Called by the {@apilink Engine}.\n * @param engine Reference to the current Engine\n * @param elapsed The number of milliseconds since the last update\n */\n update(engine, elapsed) {\n var _a;\n if (!this.isInitialized) {\n this._logger.warnOnce(`Scene update called before initialize for scene ${(_a = engine.director) === null || _a === void 0 ? void 0 : _a.getSceneName(this)}!`);\n return;\n }\n this._preupdate(engine, elapsed);\n // TODO differed entity removal for timers\n let i, len;\n // Remove timers in the cancel queue before updating them\n for (i = 0, len = this._cancelQueue.length; i < len; i++) {\n this.removeTimer(this._cancelQueue[i]);\n }\n this._cancelQueue.length = 0;\n // Cycle through timers updating timers\n for (const timer of this._timers) {\n timer.update(elapsed);\n }\n this.world.update(_EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_20__.SystemType.Update, elapsed);\n // Camera last keeps renders smooth that are based on entity/actor\n if (this.camera) {\n this.camera.update(engine, elapsed);\n }\n this._collectActorStats(engine);\n this._postupdate(engine, elapsed);\n this.input.update();\n }\n /**\n * Draws all the actors in the Scene. Called by the {@apilink Engine}.\n * @param ctx The current rendering context\n * @param elapsed The number of milliseconds since the last draw\n */\n draw(ctx, elapsed) {\n var _a;\n if (!this.isInitialized) {\n this._logger.warnOnce(`Scene draw called before initialize!`);\n return;\n }\n this._predraw(ctx, elapsed);\n this.world.update(_EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_20__.SystemType.Draw, elapsed);\n if ((_a = this.engine) === null || _a === void 0 ? void 0 : _a.isDebug) {\n this.debugDraw(ctx);\n }\n this._postdraw(ctx, elapsed);\n }\n /**\n * Draws all the actors' debug information in the Scene. Called by the {@apilink Engine}.\n * @param ctx The current rendering context\n */\n /* istanbul ignore next */\n debugDraw(ctx) {\n this.emit('predebugdraw', new _Events__WEBPACK_IMPORTED_MODULE_19__.PreDebugDrawEvent(ctx, this));\n // pass\n this.emit('postdebugdraw', new _Events__WEBPACK_IMPORTED_MODULE_19__.PostDebugDrawEvent(ctx, this));\n }\n /**\n * Checks whether an actor is contained in this scene or not\n */\n contains(actor) {\n return this.actors.indexOf(actor) > -1;\n }\n add(entity) {\n this.emit('entityadded', { target: entity });\n this.world.add(entity);\n entity.scene = this;\n if (entity instanceof _Timer__WEBPACK_IMPORTED_MODULE_21__.Timer) {\n if (!_Util_Util__WEBPACK_IMPORTED_MODULE_22__.contains(this._timers, entity)) {\n this.addTimer(entity);\n }\n return;\n }\n }\n /**\n * Removes an {@apilink Entity} (Actor, TileMap, Trigger, etc) or {@apilink Timer} from it's current scene\n * and adds it to this scene.\n *\n * Useful if you want to have an object be present in only 1 scene at a time.\n * @param entity\n */\n transfer(entity) {\n let scene;\n if (entity instanceof _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_23__.Entity && entity.scene && entity.scene !== this) {\n scene = entity.scene;\n entity.scene.world.remove(entity, false);\n }\n if (entity instanceof _Timer__WEBPACK_IMPORTED_MODULE_21__.Timer && entity.scene) {\n scene = entity.scene;\n entity.scene.removeTimer(entity);\n }\n scene === null || scene === void 0 ? void 0 : scene.emit('entityremoved', { target: entity });\n this.add(entity);\n }\n remove(entity) {\n if (entity instanceof _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_23__.Entity) {\n this.emit('entityremoved', { target: entity });\n if (entity.isActive) {\n entity.kill();\n }\n this.world.remove(entity);\n }\n if (entity instanceof _Timer__WEBPACK_IMPORTED_MODULE_21__.Timer) {\n this.removeTimer(entity);\n }\n }\n /**\n * Removes all entities and timers from the scene, optionally indicate whether deferred should or shouldn't be used.\n *\n * By default entities use deferred removal\n * @param deferred\n */\n clear(deferred = true) {\n for (let i = this.entities.length - 1; i >= 0; i--) {\n this.world.remove(this.entities[i], deferred);\n }\n for (let i = this.timers.length - 1; i >= 0; i--) {\n this.removeTimer(this.timers[i]);\n }\n }\n /**\n * Adds a {@apilink Timer} to the scene\n * @param timer The timer to add\n */\n addTimer(timer) {\n this._timers.push(timer);\n timer.scene = this;\n return timer;\n }\n /**\n * Removes a {@apilink Timer} from the scene.\n * @warning Can be dangerous, use {@apilink cancelTimer} instead\n * @param timer The timer to remove\n */\n removeTimer(timer) {\n const i = this._timers.indexOf(timer);\n if (i !== -1) {\n this._timers.splice(i, 1);\n }\n return timer;\n }\n /**\n * Cancels a {@apilink Timer}, removing it from the scene nicely\n * @param timer The timer to cancel\n */\n cancelTimer(timer) {\n this._cancelQueue.push(timer);\n return timer;\n }\n /**\n * Tests whether a {@apilink Timer} is active in the scene\n */\n isTimerActive(timer) {\n return this._timers.indexOf(timer) > -1 && !timer.complete;\n }\n isCurrentScene() {\n if (this.engine) {\n return this.engine.currentScene === this;\n }\n return false;\n }\n _collectActorStats(engine) {\n const actors = this.actors;\n for (let i = 0; i < actors.length; i++) {\n const actor = actors[i];\n if (actor instanceof _ScreenElement__WEBPACK_IMPORTED_MODULE_24__.ScreenElement) {\n engine.stats.currFrame.actors.ui++;\n }\n engine.stats.currFrame.actors.alive++;\n for (let j = 0; j < actor.children.length; j++) {\n const child = actor.children[j];\n if ((0,_ScreenElement__WEBPACK_IMPORTED_MODULE_24__.isScreenElement)(child)) {\n // TODO not true\n engine.stats.currFrame.actors.ui++;\n }\n else {\n engine.stats.currFrame.actors.alive++;\n }\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Screen.ts\":\n/*!*******************!*\\\n !*** ./Screen.ts ***!\n \\*******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DisplayMode: () => (/* binding */ DisplayMode),\n/* harmony export */ Resolution: () => (/* binding */ Resolution),\n/* harmony export */ Screen: () => (/* binding */ Screen),\n/* harmony export */ ScreenEvents: () => (/* binding */ ScreenEvents)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Collision_Index__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Collision/Index */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Util/Util */ \"./Util/Util.ts\");\n/* harmony import */ var _Graphics_Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Graphics/Context/ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _Graphics_Context_ExcaliburGraphicsContext2DCanvas__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Graphics/Context/ExcaliburGraphicsContext2DCanvas */ \"./Graphics/Context/ExcaliburGraphicsContext2DCanvas.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n\n\n\n\n/**\n * Enum representing the different display modes available to Excalibur.\n */\nvar DisplayMode;\n(function (DisplayMode) {\n /**\n * Default, use a specified resolution for the game. Like 800x600 pixels for example.\n */\n DisplayMode[\"Fixed\"] = \"Fixed\";\n /**\n * Fit the aspect ratio given by the game resolution within the container at all times will fill any gaps with canvas.\n * The displayed area outside the aspect ratio is not guaranteed to be on the screen, only the {@apilink Screen.contentArea}\n * is guaranteed to be on screen.\n */\n DisplayMode[\"FitContainerAndFill\"] = \"FitContainerAndFill\";\n /**\n * Fit the aspect ratio given by the game resolution the screen at all times will fill the screen.\n * This displayed area outside the aspect ratio is not guaranteed to be on the screen, only the {@apilink Screen.contentArea}\n * is guaranteed to be on screen.\n */\n DisplayMode[\"FitScreenAndFill\"] = \"FitScreenAndFill\";\n /**\n * Fit the viewport to the parent element maintaining aspect ratio given by the game resolution, but zooms in to avoid the black bars\n * (letterbox) that would otherwise be present in {@apilink FitContainer}.\n *\n * **warning** This will clip some drawable area from the user because of the zoom,\n * use {@apilink Screen.contentArea} to know the safe to draw area.\n */\n DisplayMode[\"FitContainerAndZoom\"] = \"FitContainerAndZoom\";\n /**\n * Fit the viewport to the device screen maintaining aspect ratio given by the game resolution, but zooms in to avoid the black bars\n * (letterbox) that would otherwise be present in {@apilink FitScreen}.\n *\n * **warning** This will clip some drawable area from the user because of the zoom,\n * use {@apilink Screen.contentArea} to know the safe to draw area.\n */\n DisplayMode[\"FitScreenAndZoom\"] = \"FitScreenAndZoom\";\n /**\n * Fit to screen using as much space as possible while maintaining aspect ratio and resolution.\n * This is not the same as {@apilink Screen.goFullScreen} but behaves in a similar way maintaining aspect ratio.\n *\n * You may want to center your game here is an example\n * ```html\n * \n * \n *
\n * \n *
\n * \n * ```\n *\n * ```css\n * // css\n * main {\n * display: flex;\n * align-items: center;\n * justify-content: center;\n * height: 100%;\n * width: 100%;\n * }\n * ```\n */\n DisplayMode[\"FitScreen\"] = \"FitScreen\";\n /**\n * Fill the entire screen's css width/height for the game resolution dynamically. This means the resolution of the game will\n * change dynamically as the window is resized. This is not the same as {@apilink Screen.goFullScreen}\n */\n DisplayMode[\"FillScreen\"] = \"FillScreen\";\n /**\n * Fit to parent element width/height using as much space as possible while maintaining aspect ratio and resolution.\n */\n DisplayMode[\"FitContainer\"] = \"FitContainer\";\n /**\n * Use the parent DOM container's css width/height for the game resolution dynamically\n */\n DisplayMode[\"FillContainer\"] = \"FillContainer\";\n})(DisplayMode || (DisplayMode = {}));\n/**\n * Convenience class for quick resolutions\n * Mostly sourced from https://emulation.gametechwiki.com/index.php/Resolution\n */\nclass Resolution {\n /* istanbul ignore next */\n static get SVGA() {\n return { width: 800, height: 600 };\n }\n /* istanbul ignore next */\n static get Standard() {\n return { width: 1920, height: 1080 };\n }\n /* istanbul ignore next */\n static get Atari2600() {\n return { width: 160, height: 192 };\n }\n /* istanbul ignore next */\n static get GameBoy() {\n return { width: 160, height: 144 };\n }\n /* istanbul ignore next */\n static get GameBoyAdvance() {\n return { width: 240, height: 160 };\n }\n /* istanbul ignore next */\n static get NintendoDS() {\n return { width: 256, height: 192 };\n }\n /* istanbul ignore next */\n static get NES() {\n return { width: 256, height: 224 };\n }\n /* istanbul ignore next */\n static get SNES() {\n return { width: 256, height: 244 };\n }\n}\nconst ScreenEvents = {\n ScreenResize: 'resize',\n PixelRatioChange: 'pixelratio',\n FullScreenChange: 'fullscreen'\n};\n/**\n * The Screen handles all aspects of interacting with the screen for Excalibur.\n */\nclass Screen {\n constructor(options) {\n var _a, _b, _c, _d;\n /**\n * Listen to screen events {@apilink ScreenEvents}\n */\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n this._antialiasing = true;\n this._canvasImageRendering = 'auto';\n this._resolutionStack = [];\n this._viewportStack = [];\n this._pixelRatioOverride = null;\n this._isFullscreen = false;\n this._isDisposed = false;\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this._fullscreenChangeHandler = () => {\n if (this._isDisposed) {\n return;\n }\n this._isFullscreen = !this._isFullscreen;\n this._logger.debug('Fullscreen Change', this._isFullscreen);\n this.events.emit('fullscreen', {\n fullscreen: this.isFullScreen\n });\n };\n this._pixelRatioChangeHandler = () => {\n if (this._isDisposed) {\n return;\n }\n this._logger.debug('Pixel Ratio Change', window.devicePixelRatio);\n this._listenForPixelRatio();\n this._devicePixelRatio = this._calculateDevicePixelRatio();\n this.applyResolutionAndViewport();\n this.events.emit('pixelratio', {\n pixelRatio: this.pixelRatio\n });\n };\n this._resizeHandler = () => {\n if (this._isDisposed) {\n return;\n }\n const parent = this.parent;\n this._logger.debug('View port resized');\n this._setResolutionAndViewportByDisplayMode(parent);\n this.applyResolutionAndViewport();\n // Emit resize event\n this.events.emit('resize', {\n resolution: this.resolution,\n viewport: this.viewport\n });\n };\n // Asking the window.devicePixelRatio is expensive we do it once\n this._devicePixelRatio = this._calculateDevicePixelRatio();\n this._contentArea = new _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox();\n this._unsafeArea = new _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox();\n this.viewport = options.viewport;\n this.resolution = (_a = options.resolution) !== null && _a !== void 0 ? _a : { ...this.viewport };\n this._contentResolution = this.resolution;\n this._displayMode = (_b = options.displayMode) !== null && _b !== void 0 ? _b : DisplayMode.Fixed;\n this._canvas = options.canvas;\n this.graphicsContext = options.context;\n this._antialiasing = (_c = options.antialiasing) !== null && _c !== void 0 ? _c : this._antialiasing;\n this._canvasImageRendering = (_d = options.canvasImageRendering) !== null && _d !== void 0 ? _d : this._canvasImageRendering;\n this._browser = options.browser;\n this._pixelRatioOverride = options.pixelRatio;\n this._applyDisplayMode();\n this._listenForPixelRatio();\n this._canvas.addEventListener('fullscreenchange', this._fullscreenChangeHandler);\n this.applyResolutionAndViewport();\n }\n _listenForPixelRatio() {\n if (this._mediaQueryList && !this._mediaQueryList.addEventListener) {\n // Safari <=13.1 workaround, remove any existing handlers\n this._mediaQueryList.removeListener(this._pixelRatioChangeHandler);\n }\n this._mediaQueryList = this._browser.window.nativeComponent.matchMedia(`(resolution: ${window.devicePixelRatio}dppx)`);\n // Safari <=13.1 workaround\n if (this._mediaQueryList.addEventListener) {\n this._mediaQueryList.addEventListener('change', this._pixelRatioChangeHandler, { once: true });\n }\n else {\n this._mediaQueryList.addListener(this._pixelRatioChangeHandler);\n }\n }\n dispose() {\n if (!this._isDisposed) {\n // Clean up handlers\n this._isDisposed = true;\n this.events.clear();\n this._browser.window.off('resize', this._resizeHandler);\n this._browser.window.clear();\n if (this._resizeObserver) {\n this._resizeObserver.disconnect();\n }\n this.parent.removeEventListener('resize', this._resizeHandler);\n // Safari <=13.1 workaround\n if (this._mediaQueryList.removeEventListener) {\n this._mediaQueryList.removeEventListener('change', this._pixelRatioChangeHandler);\n }\n else {\n this._mediaQueryList.removeListener(this._pixelRatioChangeHandler);\n }\n this._canvas.removeEventListener('fullscreenchange', this._fullscreenChangeHandler);\n this._canvas = null;\n }\n }\n _calculateDevicePixelRatio() {\n if (window.devicePixelRatio < 1) {\n return 1;\n }\n const devicePixelRatio = window.devicePixelRatio || 1;\n return devicePixelRatio;\n }\n /**\n * Returns the computed pixel ratio, first using any override, then the device pixel ratio\n */\n get pixelRatio() {\n if (this._pixelRatioOverride) {\n return this._pixelRatioOverride;\n }\n return this._devicePixelRatio;\n }\n /**\n * This calculates the ratio between excalibur pixels and the HTML pixels.\n *\n * This is useful for scaling HTML UI so that it matches your game.\n */\n get worldToPagePixelRatio() {\n if (this._canvas) {\n const pageOrigin = this.worldToPageCoordinates(_Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero);\n const pageDistance = this.worldToPageCoordinates((0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(1, 0)).sub(pageOrigin);\n const pixelConversion = pageDistance.x;\n return pixelConversion;\n }\n else {\n return 1;\n }\n }\n /**\n * Get or set the pixel ratio override\n *\n * You will need to call applyResolutionAndViewport() affect change on the screen\n */\n get pixelRatioOverride() {\n return this._pixelRatioOverride;\n }\n set pixelRatioOverride(value) {\n this._pixelRatioOverride = value;\n }\n get isHiDpi() {\n return this.pixelRatio !== 1;\n }\n get displayMode() {\n return this._displayMode;\n }\n get canvas() {\n return this._canvas;\n }\n get parent() {\n switch (this.displayMode) {\n case DisplayMode.FillContainer:\n case DisplayMode.FitContainer:\n case DisplayMode.FitContainerAndFill:\n case DisplayMode.FitContainerAndZoom:\n return this.canvas.parentElement || document.body;\n default:\n return window;\n }\n }\n get resolution() {\n return this._resolution;\n }\n set resolution(resolution) {\n this._resolution = resolution;\n }\n /**\n * Returns screen dimensions in pixels or percentage\n */\n get viewport() {\n if (this._viewport) {\n return this._viewport;\n }\n return this._resolution;\n }\n set viewport(viewport) {\n this._viewport = viewport;\n }\n get aspectRatio() {\n return this._resolution.width / this._resolution.height;\n }\n get scaledWidth() {\n return this._resolution.width * this.pixelRatio;\n }\n get scaledHeight() {\n return this._resolution.height * this.pixelRatio;\n }\n setCurrentCamera(camera) {\n this._camera = camera;\n }\n pushResolutionAndViewport() {\n this._resolutionStack.push(this.resolution);\n this._viewportStack.push(this.viewport);\n this.resolution = { ...this.resolution };\n this.viewport = { ...this.viewport };\n }\n peekViewport() {\n return this._viewportStack[this._viewportStack.length - 1];\n }\n peekResolution() {\n return this._resolutionStack[this._resolutionStack.length - 1];\n }\n popResolutionAndViewport() {\n if (this._resolutionStack.length && this._viewportStack.length) {\n this.resolution = this._resolutionStack.pop();\n this.viewport = this._viewportStack.pop();\n }\n }\n applyResolutionAndViewport() {\n if (this.graphicsContext instanceof _Graphics_Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_4__.ExcaliburGraphicsContextWebGL) {\n const scaledResolutionSupported = this.graphicsContext.checkIfResolutionSupported({\n width: this.scaledWidth,\n height: this.scaledHeight\n });\n if (!scaledResolutionSupported) {\n this._logger.warnOnce(`The currently configured resolution (${this.resolution.width}x${this.resolution.height}) and pixel ratio (${this.pixelRatio})` +\n ' are too large for the platform WebGL implementation, this may work but cause WebGL rendering to behave oddly.' +\n ' Try reducing the resolution or disabling Hi DPI scaling to avoid this' +\n ' (read more here https://excaliburjs.com/docs/screens#understanding-viewport--resolution).');\n // Attempt to recover if the user hasn't configured a specific ratio for up scaling\n if (!this.pixelRatioOverride) {\n let currentPixelRatio = Math.max(1, this.pixelRatio - 0.5);\n let newResolutionSupported = false;\n while (currentPixelRatio > 1 && !newResolutionSupported) {\n currentPixelRatio = Math.max(1, currentPixelRatio - 0.5);\n const width = this._resolution.width * currentPixelRatio;\n const height = this._resolution.height * currentPixelRatio;\n newResolutionSupported = this.graphicsContext.checkIfResolutionSupported({ width, height });\n }\n this.pixelRatioOverride = currentPixelRatio;\n this._logger.warnOnce('Scaled resolution too big attempted recovery!' +\n ` Pixel ratio was automatically reduced to (${this.pixelRatio}) to avoid 4k texture limit.` +\n ' Setting `ex.Engine({pixelRatio: ...}) will override any automatic recalculation, do so at your own risk.` ' +\n ' (read more here https://excaliburjs.com/docs/screens#understanding-viewport--resolution).');\n }\n }\n }\n this._canvas.width = this.scaledWidth;\n this._canvas.height = this.scaledHeight;\n if (this._canvasImageRendering === 'auto') {\n this._canvas.style.imageRendering = 'auto';\n }\n else {\n this._canvas.style.imageRendering = 'pixelated';\n // Fall back to 'crisp-edges' if 'pixelated' is not supported\n // Currently for firefox https://developer.mozilla.org/en-US/docs/Web/CSS/image-rendering\n if (this._canvas.style.imageRendering === '') {\n this._canvas.style.imageRendering = 'crisp-edges';\n }\n }\n const widthUnit = this.viewport.widthUnit === 'percent' ? '%' : 'px';\n const heightUnit = this.viewport.heightUnit === 'percent' ? '%' : 'px';\n this._canvas.style.width = this.viewport.width + widthUnit;\n this._canvas.style.height = this.viewport.height + heightUnit;\n // After messing with the canvas width/height the graphics context is invalidated and needs to have some properties reset\n this.graphicsContext.updateViewport(this.resolution);\n this.graphicsContext.resetTransform();\n this.graphicsContext.smoothing = this._antialiasing;\n if (this.graphicsContext instanceof _Graphics_Context_ExcaliburGraphicsContext2DCanvas__WEBPACK_IMPORTED_MODULE_5__.ExcaliburGraphicsContext2DCanvas) {\n this.graphicsContext.scale(this.pixelRatio, this.pixelRatio);\n }\n // Add the excalibur world pixel to page pixel\n document.documentElement.style.setProperty('--ex-pixel-ratio', this.worldToPagePixelRatio.toString());\n }\n /**\n * Get or set screen antialiasing,\n *\n * If true smoothing is applied\n */\n get antialiasing() {\n return this._antialiasing;\n }\n /**\n * Get or set screen antialiasing\n */\n set antialiasing(isSmooth) {\n this._antialiasing = isSmooth;\n this.graphicsContext.smoothing = this._antialiasing;\n }\n /**\n * Returns true if excalibur is fullscreen using the browser fullscreen api\n * @deprecated use isFullscreen()\n */\n get isFullScreen() {\n return this._isFullscreen;\n }\n /**\n * Returns true if excalibur is fullscreen using the browser fullscreen api\n */\n get isFullscreen() {\n return this._isFullscreen;\n }\n /**\n * Requests to go fullscreen using the browser fullscreen api, requires user interaction to be successful.\n * For example, wire this to a user click handler.\n *\n * Optionally specify a target element id to go fullscreen, by default the game canvas is used\n * @param elementId\n * @deprecated use enterFullscreen(...)\n */\n goFullScreen(elementId) {\n return this.enterFullscreen(elementId);\n }\n /**\n * Requests to enter fullscreen using the browser fullscreen api, requires user interaction to be successful.\n * For example, wire this to a user click handler.\n *\n * Optionally specify a target element id to go fullscreen, by default the game canvas is used\n * @param elementId\n */\n enterFullscreen(elementId) {\n if (elementId) {\n const maybeElement = document.getElementById(elementId);\n if (maybeElement) {\n if (!maybeElement.getAttribute('ex-fullscreen-listener')) {\n maybeElement.setAttribute('ex-fullscreen-listener', 'true');\n maybeElement.addEventListener('fullscreenchange', this._fullscreenChangeHandler);\n }\n const fullscreenPromise = maybeElement.requestFullscreen();\n return fullscreenPromise;\n }\n }\n return this._canvas.requestFullscreen();\n }\n /**\n * Requests to exit fullscreen using the browser fullscreen api\n * @deprecated use exitFullscreen()\n */\n exitFullScreen() {\n return this.exitFullscreen();\n }\n exitFullscreen() {\n return document.exitFullscreen();\n }\n _viewportToPixels(viewport) {\n return {\n width: viewport.widthUnit === 'percent' ? this.canvas.offsetWidth : viewport.width,\n height: viewport.heightUnit === 'percent' ? this.canvas.offsetHeight : viewport.height\n };\n }\n /**\n * Takes a coordinate in normal html page space, for example from a pointer move event, and translates it to\n * Excalibur screen space.\n *\n * Excalibur screen space starts at the top left (0, 0) corner of the viewport, and extends to the\n * bottom right corner (resolutionX, resolutionY). When using *AndFill suffixed display modes screen space\n * (0, 0) is the top left of the safe content area bounding box not the viewport.\n * @param point\n */\n pageToScreenCoordinates(point) {\n let newX = point.x;\n let newY = point.y;\n if (!this._isFullscreen) {\n newX -= (0,_Util_Util__WEBPACK_IMPORTED_MODULE_6__.getPosition)(this._canvas).x;\n newY -= (0,_Util_Util__WEBPACK_IMPORTED_MODULE_6__.getPosition)(this._canvas).y;\n }\n const viewport = this._viewportToPixels(this.viewport);\n // if fullscreen api on it centers with black bars\n // we need to adjust the screen to world coordinates in this case\n if (this._isFullscreen) {\n if (window.innerWidth / this.aspectRatio < window.innerHeight) {\n const screenHeight = window.innerWidth / this.aspectRatio;\n const screenMarginY = (window.innerHeight - screenHeight) / 2;\n newY = ((newY - screenMarginY) / screenHeight) * viewport.height;\n newX = (newX / window.innerWidth) * viewport.width;\n }\n else {\n const screenWidth = window.innerHeight * this.aspectRatio;\n const screenMarginX = (window.innerWidth - screenWidth) / 2;\n newX = ((newX - screenMarginX) / screenWidth) * viewport.width;\n newY = (newY / window.innerHeight) * viewport.height;\n }\n }\n newX = (newX / viewport.width) * this.resolution.width;\n newY = (newY / viewport.height) * this.resolution.height;\n // offset by content area\n newX = newX - this.contentArea.left;\n newY = newY - this.contentArea.top;\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(newX, newY);\n }\n /**\n * Takes a coordinate in Excalibur screen space, and translates it to normal html page space. For example,\n * this is where html elements might live if you want to position them relative to Excalibur.\n *\n * Excalibur screen space starts at the top left (0, 0) corner of the viewport, and extends to the\n * bottom right corner (resolutionX, resolutionY)\n * @param point\n */\n screenToPageCoordinates(point) {\n let newX = point.x;\n let newY = point.y;\n // no need to offset by content area, drawing is already offset by this\n const viewport = this._viewportToPixels(this.viewport);\n newX = (newX / this.resolution.width) * viewport.width;\n newY = (newY / this.resolution.height) * viewport.height;\n if (this._isFullscreen) {\n if (window.innerWidth / this.aspectRatio < window.innerHeight) {\n const screenHeight = window.innerWidth / this.aspectRatio;\n const screenMarginY = (window.innerHeight - screenHeight) / 2;\n newY = (newY / viewport.height) * screenHeight + screenMarginY;\n newX = (newX / viewport.width) * window.innerWidth;\n }\n else {\n const screenWidth = window.innerHeight * this.aspectRatio;\n const screenMarginX = (window.innerWidth - screenWidth) / 2;\n newX = (newX / viewport.width) * screenWidth + screenMarginX;\n newY = (newY / viewport.height) * window.innerHeight;\n }\n }\n if (!this._isFullscreen) {\n newX += (0,_Util_Util__WEBPACK_IMPORTED_MODULE_6__.getPosition)(this._canvas).x;\n newY += (0,_Util_Util__WEBPACK_IMPORTED_MODULE_6__.getPosition)(this._canvas).y;\n }\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(newX, newY);\n }\n /**\n * Takes a coordinate in Excalibur screen space, and translates it to Excalibur world space.\n *\n * World space is where {@apilink Entity | `entities`} in Excalibur live by default {@apilink CoordPlane.World}\n * and extends infinitely out relative from the {@apilink Camera}.\n * @param point Screen coordinate to convert\n */\n screenToWorldCoordinates(point) {\n // offset by content area\n point = point.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this.contentArea.left, this.contentArea.top));\n // the only difference between screen & world is the camera transform\n if (this._camera) {\n return this._camera.inverse.multiply(point);\n }\n return point.sub((0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this.resolution.width / 2, this.resolution.height / 2));\n }\n /**\n * Takes a coordinate in Excalibur world space, and translates it to Excalibur screen space.\n *\n * Screen space is where {@apilink ScreenElement | `screen elements`} and {@apilink Entity | `entities`} with {@apilink CoordPlane.Screen} live.\n * @param point World coordinate to convert\n */\n worldToScreenCoordinates(point) {\n if (this._camera) {\n return this._camera.transform.multiply(point);\n }\n return point.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this.resolution.width / 2, this.resolution.height / 2));\n }\n pageToWorldCoordinates(point) {\n const screen = this.pageToScreenCoordinates(point);\n return this.screenToWorldCoordinates(screen);\n }\n worldToPageCoordinates(point) {\n const screen = this.worldToScreenCoordinates(point);\n return this.screenToPageCoordinates(screen);\n }\n /**\n * Returns a BoundingBox of the top left corner of the screen\n * and the bottom right corner of the screen.\n *\n * World bounds are in world coordinates, useful for culling objects offscreen that are in world space\n */\n getWorldBounds() {\n const bounds = _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromDimension(this.resolution.width, this.resolution.height, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Half)\n .scale((0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(1 / this._camera.zoom, 1 / this._camera.zoom))\n .rotate(this._camera.rotation)\n .translate(this._camera.drawPos);\n return bounds;\n }\n /**\n * Returns a BoundingBox of the top left corner of the screen and the bottom right corner of the screen.\n *\n * Screen bounds are in screen coordinates, useful for culling objects offscreen that are in screen space\n */\n getScreenBounds() {\n const bounds = _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromDimension(this.resolution.width, this.resolution.height, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero);\n return bounds;\n }\n /**\n * The width of the game canvas in pixels (physical width component of the\n * resolution of the canvas element)\n */\n get canvasWidth() {\n return this.canvas.width;\n }\n /**\n * Returns half width of the game canvas in pixels (half physical width component)\n */\n get halfCanvasWidth() {\n return this.canvas.width / 2;\n }\n /**\n * The height of the game canvas in pixels, (physical height component of\n * the resolution of the canvas element)\n */\n get canvasHeight() {\n return this.canvas.height;\n }\n /**\n * Returns half height of the game canvas in pixels (half physical height component)\n */\n get halfCanvasHeight() {\n return this.canvas.height / 2;\n }\n /**\n * Returns the width of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get drawWidth() {\n if (this._camera) {\n return this.resolution.width / this._camera.zoom;\n }\n return this.resolution.width;\n }\n /**\n * Returns the width of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get width() {\n if (this._camera) {\n return this.resolution.width / this._camera.zoom;\n }\n return this.resolution.width;\n }\n /**\n * Returns half the width of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get halfDrawWidth() {\n return this.drawWidth / 2;\n }\n /**\n * Returns the height of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get drawHeight() {\n if (this._camera) {\n return this.resolution.height / this._camera.zoom;\n }\n return this.resolution.height;\n }\n get height() {\n if (this._camera) {\n return this.resolution.height / this._camera.zoom;\n }\n return this.resolution.height;\n }\n /**\n * Returns half the height of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get halfDrawHeight() {\n return this.drawHeight / 2;\n }\n /**\n * Returns screen center coordinates including zoom and device pixel ratio.\n */\n get center() {\n return (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this.halfDrawWidth, this.halfDrawHeight);\n }\n /**\n * Returns the content area in screen space where it is safe to place content\n */\n get contentArea() {\n return this._contentArea;\n }\n /**\n * Returns the unsafe area in screen space, this is the full screen and some space may not be onscreen.\n */\n get unsafeArea() {\n return this._unsafeArea;\n }\n _computeFit() {\n document.body.style.margin = '0px';\n document.body.style.overflow = 'hidden';\n const aspect = this.aspectRatio;\n let adjustedWidth = 0;\n let adjustedHeight = 0;\n if (window.innerWidth / aspect < window.innerHeight) {\n adjustedWidth = window.innerWidth;\n adjustedHeight = window.innerWidth / aspect;\n }\n else {\n adjustedWidth = window.innerHeight * aspect;\n adjustedHeight = window.innerHeight;\n }\n this.viewport = {\n width: adjustedWidth,\n height: adjustedHeight\n };\n this._contentArea = _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromDimension(this.resolution.width, this.resolution.height, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero);\n this._unsafeArea = _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromDimension(this.resolution.width, this.resolution.height, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero);\n this.events.emit('resize', {\n resolution: this.resolution,\n viewport: this.viewport\n });\n }\n _computeFitScreenAndFill() {\n document.body.style.margin = '0px';\n document.body.style.overflow = 'hidden';\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n this._computeFitAndFill(vw, vh);\n this.events.emit('resize', {\n resolution: this.resolution,\n viewport: this.viewport\n });\n }\n _computeFitContainerAndFill() {\n this.canvas.style.width = '100%';\n this.canvas.style.height = '100%';\n this._computeFitAndFill(this.canvas.offsetWidth, this.canvas.offsetHeight, {\n width: 100,\n widthUnit: 'percent',\n height: 100,\n heightUnit: 'percent'\n });\n this.events.emit('resize', {\n resolution: this.resolution,\n viewport: this.viewport\n });\n }\n _computeFitAndFill(vw, vh, viewport) {\n this.viewport = viewport !== null && viewport !== void 0 ? viewport : {\n width: vw,\n height: vh\n };\n // if the current screen aspectRatio is less than the original aspectRatio\n if (vw / vh <= this._contentResolution.width / this._contentResolution.height) {\n // compute new resolution to match the original aspect ratio\n this.resolution = {\n width: (vw * this._contentResolution.width) / vw,\n height: (((vw * this._contentResolution.width) / vw) * vh) / vw\n };\n const clip = (this.resolution.height - this._contentResolution.height) / 2;\n this._contentArea = new _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox({\n top: clip,\n left: 0,\n right: this._contentResolution.width,\n bottom: this.resolution.height - clip\n });\n this._unsafeArea = new _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox({\n top: -clip,\n left: 0,\n right: this._contentResolution.width,\n bottom: this.resolution.height + clip\n });\n }\n else {\n this.resolution = {\n width: (((vh * this._contentResolution.height) / vh) * vw) / vh,\n height: (vh * this._contentResolution.height) / vh\n };\n const clip = (this.resolution.width - this._contentResolution.width) / 2;\n this._contentArea = new _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox({\n top: 0,\n left: clip,\n right: this.resolution.width - clip,\n bottom: this._contentResolution.height\n });\n this._unsafeArea = new _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox({\n top: 0,\n left: -clip,\n right: this.resolution.width + clip,\n bottom: this._contentResolution.height\n });\n }\n }\n _computeFitScreenAndZoom() {\n document.body.style.margin = '0px';\n document.body.style.overflow = 'hidden';\n this.canvas.style.position = 'absolute';\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n this._computeFitAndZoom(vw, vh);\n this.events.emit('resize', {\n resolution: this.resolution,\n viewport: this.viewport\n });\n }\n _computeFitContainerAndZoom() {\n this.canvas.style.width = '100%';\n this.canvas.style.height = '100%';\n this.canvas.style.position = 'relative';\n const parent = this.canvas.parentElement;\n parent.style.overflow = 'hidden';\n const { offsetWidth: vw, offsetHeight: vh } = this.canvas;\n this._computeFitAndZoom(vw, vh);\n this.events.emit('resize', {\n resolution: this.resolution,\n viewport: this.viewport\n });\n }\n _computeFitAndZoom(vw, vh) {\n const aspect = this.aspectRatio;\n let adjustedWidth = 0;\n let adjustedHeight = 0;\n if (vw / aspect < vh) {\n adjustedWidth = vw;\n adjustedHeight = vw / aspect;\n }\n else {\n adjustedWidth = vh * aspect;\n adjustedHeight = vh;\n }\n const scaleX = vw / adjustedWidth;\n const scaleY = vh / adjustedHeight;\n const maxScaleFactor = Math.max(scaleX, scaleY);\n const zoomedWidth = adjustedWidth * maxScaleFactor;\n const zoomedHeight = adjustedHeight * maxScaleFactor;\n // Center zoomed dimension if bigger than the screen\n if (zoomedWidth > vw) {\n this.canvas.style.left = -(zoomedWidth - vw) / 2 + 'px';\n }\n else {\n this.canvas.style.left = '';\n }\n if (zoomedHeight > vh) {\n this.canvas.style.top = -(zoomedHeight - vh) / 2 + 'px';\n }\n else {\n this.canvas.style.top = '';\n }\n this.viewport = {\n width: zoomedWidth,\n height: zoomedHeight\n };\n const bounds = _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromDimension(this.viewport.width, this.viewport.height, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero);\n // return safe area\n if (this.viewport.width > vw) {\n const clip = ((this.viewport.width - vw) / this.viewport.width) * this.resolution.width;\n bounds.top = 0;\n bounds.left = clip / 2;\n bounds.right = this.resolution.width - clip / 2;\n bounds.bottom = this.resolution.height;\n }\n if (this.viewport.height > vh) {\n const clip = ((this.viewport.height - vh) / this.viewport.height) * this.resolution.height;\n bounds.top = clip / 2;\n bounds.left = 0;\n bounds.bottom = this.resolution.height - clip / 2;\n bounds.right = this.resolution.width;\n }\n this._contentArea = bounds;\n }\n _computeFitContainer() {\n const aspect = this.aspectRatio;\n let adjustedWidth = 0;\n let adjustedHeight = 0;\n let widthUnit = 'pixel';\n let heightUnit = 'pixel';\n const parent = this.canvas.parentElement;\n if (parent.clientWidth / aspect < parent.clientHeight) {\n this.canvas.style.width = '100%';\n adjustedWidth = 100;\n widthUnit = 'percent';\n adjustedHeight = this.canvas.offsetWidth / aspect;\n }\n else {\n this.canvas.style.height = '100%';\n adjustedHeight = 100;\n heightUnit = 'percent';\n adjustedWidth = this.canvas.offsetHeight * aspect;\n }\n this.viewport = {\n width: adjustedWidth,\n widthUnit,\n height: adjustedHeight,\n heightUnit\n };\n this._contentArea = _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromDimension(this.resolution.width, this.resolution.height, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero);\n this.events.emit('resize', {\n resolution: this.resolution,\n viewport: this.viewport\n });\n }\n _applyDisplayMode() {\n this._setResolutionAndViewportByDisplayMode(this.parent);\n // watch resizing\n if (this.parent instanceof Window) {\n this._browser.window.on('resize', this._resizeHandler);\n }\n else {\n this._resizeObserver = new ResizeObserver(() => {\n this._resizeHandler();\n });\n this._resizeObserver.observe(this.parent);\n }\n this.parent.addEventListener('resize', this._resizeHandler);\n }\n /**\n * Sets the resolution and viewport based on the selected display mode.\n */\n _setResolutionAndViewportByDisplayMode(parent) {\n if (this.displayMode === DisplayMode.FillContainer) {\n this.canvas.style.width = '100%';\n this.canvas.style.height = '100%';\n this.viewport = {\n width: 100,\n widthUnit: 'percent',\n height: 100,\n heightUnit: 'percent'\n };\n this.resolution = {\n width: this.canvas.offsetWidth,\n height: this.canvas.offsetHeight\n };\n }\n if (this.displayMode === DisplayMode.FillScreen) {\n document.body.style.margin = '0px';\n document.body.style.overflow = 'hidden';\n this.resolution = {\n width: parent.innerWidth,\n height: parent.innerHeight\n };\n this.viewport = this.resolution;\n }\n this._contentArea = _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromDimension(this.resolution.width, this.resolution.height, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero);\n if (this.displayMode === DisplayMode.FitScreen) {\n this._computeFit();\n }\n if (this.displayMode === DisplayMode.FitContainer) {\n this._computeFitContainer();\n }\n if (this.displayMode === DisplayMode.FitScreenAndFill) {\n this._computeFitScreenAndFill();\n }\n if (this.displayMode === DisplayMode.FitContainerAndFill) {\n this._computeFitContainerAndFill();\n }\n if (this.displayMode === DisplayMode.FitScreenAndZoom) {\n this._computeFitScreenAndZoom();\n }\n if (this.displayMode === DisplayMode.FitContainerAndZoom) {\n this._computeFitContainerAndZoom();\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./ScreenElement.ts\":\n/*!**************************!*\\\n !*** ./ScreenElement.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ScreenElement: () => (/* binding */ ScreenElement),\n/* harmony export */ isScreenElement: () => (/* binding */ isScreenElement)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Actor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Actor */ \"./Actor.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Collision/CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Math/coord-plane */ \"./Math/coord-plane.ts\");\n\n\n\n\n\n/**\n * Type guard to detect a screen element\n */\nfunction isScreenElement(actor) {\n return actor instanceof ScreenElement;\n}\n/**\n * Helper {@apilink Actor} primitive for drawing UI's, optimized for UI drawing. Does\n * not participate in collisions. Drawn on top of all other actors.\n */\nclass ScreenElement extends _Actor__WEBPACK_IMPORTED_MODULE_0__.Actor {\n constructor(config) {\n var _a, _b;\n super({ ...config });\n this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).coordPlane = _Math_coord_plane__WEBPACK_IMPORTED_MODULE_2__.CoordPlane.Screen;\n this.anchor = (_a = config === null || config === void 0 ? void 0 : config.anchor) !== null && _a !== void 0 ? _a : (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(0, 0);\n this.body.collisionType = (_b = config === null || config === void 0 ? void 0 : config.collisionType) !== null && _b !== void 0 ? _b : _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.PreventCollision;\n this.pointer.useGraphicsBounds = true;\n this.pointer.useColliderShape = false;\n if (!(config === null || config === void 0 ? void 0 : config.collider) && (config === null || config === void 0 ? void 0 : config.width) > 0 && (config === null || config === void 0 ? void 0 : config.height) > 0) {\n this.collider.useBoxCollider(this.width, this.height, this.anchor);\n }\n }\n _initialize(engine) {\n this._engine = engine;\n super._initialize(engine);\n }\n contains(x, y, useWorld = true) {\n if (useWorld) {\n return super.contains(x, y);\n }\n const coords = this._engine.worldToScreenCoordinates(new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(x, y));\n return super.contains(coords.x, coords.y);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./TileMap/IsometricEntityComponent.ts\":\n/*!*********************************************!*\\\n !*** ./TileMap/IsometricEntityComponent.ts ***!\n \\*********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ IsometricEntityComponent: () => (/* binding */ IsometricEntityComponent)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Component */ \"./EntityComponentSystem/Component.ts\");\n\nclass IsometricEntityComponent extends _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n /**\n * Specify the isometric map to use to position this entity's z-index\n * @param mapOrOptions\n */\n constructor(mapOrOptions) {\n super();\n /**\n * Vertical \"height\" in the isometric world\n */\n this.elevation = 0;\n this.columns = mapOrOptions.columns;\n this.rows = mapOrOptions.rows;\n this.tileWidth = mapOrOptions.tileWidth;\n this.tileHeight = mapOrOptions.tileHeight;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./TileMap/IsometricEntitySystem.ts\":\n/*!******************************************!*\\\n !*** ./TileMap/IsometricEntitySystem.ts ***!\n \\******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ IsometricEntitySystem: () => (/* binding */ IsometricEntitySystem)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _IsometricEntityComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./IsometricEntityComponent */ \"./TileMap/IsometricEntityComponent.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Priority.ts\");\n\n\n\n\nclass IsometricEntitySystem extends _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.System {\n constructor(world) {\n super();\n this.world = world;\n this.systemType = _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.SystemType.Update;\n this.query = this.world.query([_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent, _IsometricEntityComponent__WEBPACK_IMPORTED_MODULE_2__.IsometricEntityComponent]);\n }\n update() {\n let transform;\n let iso;\n for (let i = 0; i < this.query.entities.length; i++) {\n const entity = this.query.entities[i];\n transform = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n iso = entity.get(_IsometricEntityComponent__WEBPACK_IMPORTED_MODULE_2__.IsometricEntityComponent);\n const maxZindexPerElevation = Math.max(iso.columns * iso.tileWidth, iso.rows * iso.tileHeight);\n const newZ = maxZindexPerElevation * iso.elevation + transform.pos.y;\n transform.z = newZ;\n }\n }\n}\nIsometricEntitySystem.priority = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_3__.SystemPriority.Lower;\n\n\n/***/ }),\n\n/***/ \"./TileMap/IsometricMap.ts\":\n/*!*********************************!*\\\n !*** ./TileMap/IsometricMap.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ IsometricMap: () => (/* binding */ IsometricMap),\n/* harmony export */ IsometricTile: () => (/* binding */ IsometricTile)\n/* harmony export */ });\n/* harmony import */ var _Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Collision/BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../Collision/ColliderComponent */ \"./Collision/ColliderComponent.ts\");\n/* harmony import */ var _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Collision/CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Collision_Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../Collision/Colliders/CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Graphics */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../Graphics */ \"./Graphics/DebugGraphicsComponent.ts\");\n/* harmony import */ var _IsometricEntityComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./IsometricEntityComponent */ \"./TileMap/IsometricEntityComponent.ts\");\n/* harmony import */ var _Input_PointerComponent__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../Input/PointerComponent */ \"./Input/PointerComponent.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Input_PointerEventsToObjectDispatcher__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../Input/PointerEventsToObjectDispatcher */ \"./Input/PointerEventsToObjectDispatcher.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass IsometricTile extends _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__.Entity {\n getGraphics() {\n return this._graphics;\n }\n /**\n * Tile graphics\n */\n addGraphic(graphic, options) {\n this._graphics.push(graphic);\n this._gfx.isVisible = this.map.isVisible;\n this._gfx.opacity = this.map.opacity;\n if (options === null || options === void 0 ? void 0 : options.offset) {\n this._gfx.offset = options.offset;\n }\n // TODO detect when this changes on the map and apply to all tiles\n this._gfx.localBounds = this._recalculateBounds();\n }\n _recalculateBounds() {\n let bounds = this._tileBounds.clone();\n for (const graphic of this._graphics) {\n const offset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(this.map.graphicsOffset.x - this.map.tileWidth / 2, this.map.graphicsOffset.y - (this.map.renderFromTopOfGraphic ? 0 : graphic.height - this.map.tileHeight));\n bounds = bounds.combine(graphic.localBounds.translate(offset));\n }\n return bounds;\n }\n removeGraphic(graphic) {\n const index = this._graphics.indexOf(graphic);\n if (index > -1) {\n this._graphics.splice(index, 1);\n }\n this._gfx.localBounds = this._recalculateBounds();\n }\n clearGraphics() {\n this._graphics.length = 0;\n this._gfx.isVisible = false;\n this._gfx.localBounds = this._recalculateBounds();\n }\n getColliders() {\n return this._colliders;\n }\n /**\n * Adds a collider to the IsometricTile\n *\n * **Note!** the {@apilink Tile.solid} must be set to true for it to act as a \"fixed\" collider\n * @param collider\n */\n addCollider(collider) {\n this._colliders.push(collider);\n this.map.flagCollidersDirty();\n }\n /**\n * Removes a collider from the IsometricTile\n * @param collider\n */\n removeCollider(collider) {\n const index = this._colliders.indexOf(collider);\n if (index > -1) {\n this._colliders.splice(index, 1);\n }\n this.map.flagCollidersDirty();\n }\n /**\n * Clears all colliders from the IsometricTile\n */\n clearColliders() {\n this._colliders.length = 0;\n this.map.flagCollidersDirty();\n }\n /**\n * Returns the top left corner of the {@apilink IsometricTile} in world space\n */\n get pos() {\n return this.map.tileToWorld((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(this.x, this.y));\n }\n /**\n * Returns the center of the {@apilink IsometricTile}\n */\n get center() {\n return this.pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, this.map.tileHeight / 2));\n }\n /**\n * Construct a new IsometricTile\n * @param x tile coordinate in x (not world position)\n * @param y tile coordinate in y (not world position)\n * @param graphicsOffset offset that tile should be shifted by (default (0, 0))\n * @param map reference to owning IsometricMap\n */\n constructor(x, y, graphicsOffset, map) {\n super([\n new _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent(),\n new _Graphics__WEBPACK_IMPORTED_MODULE_3__.GraphicsComponent({\n offset: graphicsOffset !== null && graphicsOffset !== void 0 ? graphicsOffset : _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero,\n onPostDraw: (gfx, elapsed) => this.draw(gfx, elapsed)\n }),\n new _IsometricEntityComponent__WEBPACK_IMPORTED_MODULE_4__.IsometricEntityComponent(map)\n ]);\n /**\n * Indicates whether this tile is solid\n */\n this.solid = false;\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_5__.EventEmitter();\n this._tileBounds = new _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox();\n this._graphics = [];\n /**\n * Tile colliders\n */\n this._colliders = [];\n /**\n * Arbitrary data storage per tile, useful for any game specific data\n */\n this.data = new Map();\n this.x = x;\n this.y = y;\n this.map = map;\n this._transform = this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n this._isometricEntityComponent = this.get(_IsometricEntityComponent__WEBPACK_IMPORTED_MODULE_4__.IsometricEntityComponent);\n const halfTileWidth = this.map.tileWidth / 2;\n const halfTileHeight = this.map.tileHeight / 2;\n // See https://clintbellanger.net/articles/isometric_math/ for formula\n // The x position shifts left with every y step\n const xPos = (this.x - this.y) * halfTileWidth;\n // The y position needs to go down with every x step\n const yPos = (this.x + this.y) * halfTileHeight;\n this._transform.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(xPos, yPos);\n this._isometricEntityComponent.elevation = map.elevation;\n this._gfx = this.get(_Graphics__WEBPACK_IMPORTED_MODULE_3__.GraphicsComponent);\n this._gfx.isVisible = false; // start not visible\n const totalWidth = this.map.tileWidth;\n const totalHeight = this.map.tileHeight;\n // initial guess at gfx bounds based on the tile\n const offset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, this.map.renderFromTopOfGraphic ? totalHeight : 0);\n this._gfx.localBounds = this._tileBounds = new _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox({\n left: -totalWidth / 2,\n top: -totalHeight,\n right: totalWidth / 2,\n bottom: totalHeight\n }).translate(offset);\n }\n draw(gfx, _elapsed) {\n const halfTileWidth = this.map.tileWidth / 2;\n gfx.save();\n // shift left origin to corner of map, not the left corner of the first sprite\n gfx.translate(-halfTileWidth, 0);\n for (const graphic of this._graphics) {\n graphic.draw(gfx, this.map.graphicsOffset.x, this.map.graphicsOffset.y - (this.map.renderFromTopOfGraphic ? 0 : graphic.height - this.map.tileHeight));\n }\n gfx.restore();\n }\n}\n/**\n * The IsometricMap is a special tile map that provides isometric rendering support to Excalibur\n *\n * The tileWidth and tileHeight should be the height and width in pixels of the parallelogram of the base of the tile art asset.\n * The tileWidth and tileHeight is not necessarily the same as your graphic pixel width and height.\n *\n * Please refer to the docs https://excaliburjs.com for more details calculating what your tile width and height should be given\n * your art assets.\n */\nclass IsometricMap extends _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__.Entity {\n /**\n * Whether tiles should be visible\n * @deprecated use isVisible\n */\n get visible() {\n return this.isVisible;\n }\n /**\n * Whether tiles should be visible\n * @deprecated use isVisible\n */\n set visible(val) {\n this.isVisible = val;\n }\n constructor(options) {\n super([\n new _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent(),\n new _Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_7__.BodyComponent({\n type: _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_8__.CollisionType.Fixed\n }),\n new _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_9__.ColliderComponent(),\n new _Input_PointerComponent__WEBPACK_IMPORTED_MODULE_10__.PointerComponent(),\n new _Graphics__WEBPACK_IMPORTED_MODULE_11__.DebugGraphicsComponent((ctx, debugFlags) => this.debug(ctx, debugFlags), false)\n ], options.name);\n this.elevation = 0;\n /**\n * Whether tiles should be visible\n */\n this.isVisible = true;\n /**\n * Opacity of tiles\n */\n this.opacity = 1.0;\n /**\n * Render the tile graphic from the top instead of the bottom\n *\n * default is `false` meaning rendering from the bottom\n */\n this.renderFromTopOfGraphic = false;\n this.graphicsOffset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0);\n this._collidersDirty = false;\n this._originalOffsets = new WeakMap();\n const { pos, tileWidth, tileHeight, columns: width, rows: height, renderFromTopOfGraphic, graphicsOffset, elevation } = options;\n this.transform = this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n if (pos) {\n this.transform.pos = pos;\n }\n this.collider = this.get(_Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_9__.ColliderComponent);\n if (this.collider) {\n this.collider.set((this._composite = new _Collision_Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_12__.CompositeCollider([])));\n }\n this.pointer = this.get(_Input_PointerComponent__WEBPACK_IMPORTED_MODULE_10__.PointerComponent);\n this.renderFromTopOfGraphic = renderFromTopOfGraphic !== null && renderFromTopOfGraphic !== void 0 ? renderFromTopOfGraphic : this.renderFromTopOfGraphic;\n this.graphicsOffset = graphicsOffset !== null && graphicsOffset !== void 0 ? graphicsOffset : this.graphicsOffset;\n this.elevation = elevation !== null && elevation !== void 0 ? elevation : this.elevation;\n this.tileWidth = tileWidth;\n this.tileHeight = tileHeight;\n this.columns = width;\n this.rows = height;\n this._pointerEventDispatcher = new _Input_PointerEventsToObjectDispatcher__WEBPACK_IMPORTED_MODULE_13__.PointerEventsToObjectDispatcher();\n this.tiles = new Array(width * height);\n // build up tile representation\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const tile = new IsometricTile(x, y, this.graphicsOffset, this);\n this.tiles[x + y * width] = tile;\n this.addChild(tile);\n this._pointerEventDispatcher.addObject(tile, (p) => this.getTileByPoint(p.worldPos) === tile, () => true);\n }\n }\n this.pointer.localBounds = _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox.fromDimension(tileWidth * width * this.transform.scale.x, tileHeight * height * this.transform.scale.y, (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0.5, 0));\n }\n /**\n * @internal\n */\n _processPointerToObject(receiver) {\n this._pointerEventDispatcher.processPointerToObject(receiver, this.tiles);\n }\n /**\n * @internal\n */\n _dispatchPointerEvents(receiver) {\n this._pointerEventDispatcher.dispatchEvents(receiver, this.tiles);\n }\n update() {\n if (this._collidersDirty) {\n this.updateColliders();\n this._collidersDirty = false;\n }\n this._pointerEventDispatcher.clear();\n }\n flagCollidersDirty() {\n this._collidersDirty = true;\n }\n _getOrSetColliderOriginalOffset(collider) {\n var _a;\n if (!this._originalOffsets.has(collider)) {\n const originalOffset = collider.offset;\n this._originalOffsets.set(collider, originalOffset);\n return originalOffset;\n }\n else {\n return (_a = this._originalOffsets.get(collider)) !== null && _a !== void 0 ? _a : _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n }\n }\n updateColliders() {\n this._composite.clearColliders();\n const pos = this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent).pos;\n for (const tile of this.tiles) {\n if (tile.solid) {\n for (const collider of tile.getColliders()) {\n const originalOffset = this._getOrSetColliderOriginalOffset(collider);\n collider.offset = this.tileToWorld((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(tile.x, tile.y))\n .sub(pos)\n .add(originalOffset)\n .sub((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(this.tileWidth / 2, this.tileHeight)); // We need to unshift height based on drawing\n collider.owner = this;\n this._composite.addCollider(collider);\n }\n }\n }\n this.collider.update();\n }\n /**\n * Convert world space coordinates to the tile x, y coordinate\n * @param worldCoordinate\n */\n worldToTile(worldCoordinate) {\n // TODO I don't think this handles parent transform see TileMap\n worldCoordinate = worldCoordinate.sub(this.transform.globalPos);\n const halfTileWidth = this.tileWidth / 2;\n const halfTileHeight = this.tileHeight / 2;\n // See https://clintbellanger.net/articles/isometric_math/ for formula\n return (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(~~((worldCoordinate.x / halfTileWidth + worldCoordinate.y / halfTileHeight) / 2), ~~((worldCoordinate.y / halfTileHeight - worldCoordinate.x / halfTileWidth) / 2));\n }\n /**\n * Given a tile coordinate, return the top left corner in world space\n * @param tileCoordinate\n */\n tileToWorld(tileCoordinate) {\n const halfTileWidth = this.tileWidth / 2;\n const halfTileHeight = this.tileHeight / 2;\n // The x position shifts left with every y step\n const xPos = (tileCoordinate.x - tileCoordinate.y) * halfTileWidth;\n // The y position needs to go down with every x step\n const yPos = (tileCoordinate.x + tileCoordinate.y) * halfTileHeight;\n return (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(xPos, yPos).add(this.transform.pos);\n }\n /**\n * Returns the {@apilink IsometricTile} by its x and y coordinates\n */\n getTile(x, y) {\n if (x < 0 || y < 0 || x >= this.columns || y >= this.rows) {\n return null;\n }\n return this.tiles[x + y * this.columns];\n }\n /**\n * Returns the {@apilink IsometricTile} by testing a point in world coordinates,\n * returns `null` if no Tile was found.\n */\n getTileByPoint(point) {\n const tileCoord = this.worldToTile(point);\n const tile = this.getTile(tileCoord.x, tileCoord.y);\n return tile;\n }\n _getMaxZIndex() {\n let maxZ = Number.NEGATIVE_INFINITY;\n for (const tile of this.tiles) {\n const currentZ = tile.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent).z;\n if (currentZ > maxZ) {\n maxZ = currentZ;\n }\n }\n return maxZ;\n }\n /**\n * Debug draw for IsometricMap, called internally by excalibur when debug mode is toggled on\n * @param gfx\n */\n debug(gfx, debugFlags) {\n const { showAll, showPosition, positionColor, positionSize, showGrid, gridColor, gridWidth, showColliderGeometry } = debugFlags.isometric;\n const { geometryColor, geometryLineWidth, geometryPointSize } = debugFlags.collider;\n gfx.save();\n gfx.z = this._getMaxZIndex() + 0.5;\n if (showAll || showGrid) {\n for (let y = 0; y < this.rows + 1; y++) {\n const left = this.tileToWorld((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, y));\n const right = this.tileToWorld((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(this.columns, y));\n gfx.drawLine(left, right, gridColor, gridWidth);\n }\n for (let x = 0; x < this.columns + 1; x++) {\n const top = this.tileToWorld((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(x, 0));\n const bottom = this.tileToWorld((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(x, this.rows));\n gfx.drawLine(top, bottom, gridColor, gridWidth);\n }\n }\n if (showAll || showPosition) {\n for (const tile of this.tiles) {\n gfx.drawCircle(this.tileToWorld((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(tile.x, tile.y)), positionSize, positionColor);\n }\n }\n if (showAll || showColliderGeometry) {\n for (const tile of this.tiles) {\n if (tile.solid) {\n // only draw solid tiles\n for (const collider of tile.getColliders()) {\n collider.debug(gfx, geometryColor, { lineWidth: geometryLineWidth, pointSize: geometryPointSize });\n }\n }\n }\n }\n gfx.restore();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./TileMap/TileMap.ts\":\n/*!****************************!*\\\n !*** ./TileMap/TileMap.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Tile: () => (/* binding */ Tile),\n/* harmony export */ TileMap: () => (/* binding */ TileMap),\n/* harmony export */ TileMapEvents: () => (/* binding */ TileMapEvents)\n/* harmony export */ });\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Collision/BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Collision/CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Collision_Colliders_Shape__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../Collision/Colliders/Shape */ \"./Collision/Colliders/Shape.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Graphics */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../Graphics */ \"./Graphics/ParallaxComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../Collision/ColliderComponent */ \"./Collision/ColliderComponent.ts\");\n/* harmony import */ var _Graphics_DebugGraphicsComponent__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../Graphics/DebugGraphicsComponent */ \"./Graphics/DebugGraphicsComponent.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../Math/coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Input_PointerComponent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../Input/PointerComponent */ \"./Input/PointerComponent.ts\");\n/* harmony import */ var _Input_PointerEventsToObjectDispatcher__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../Input/PointerEventsToObjectDispatcher */ \"./Input/PointerEventsToObjectDispatcher.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst TileMapEvents = {\n PreUpdate: 'preupdate',\n PostUpdate: 'postupdate',\n PreDraw: 'predraw',\n PostDraw: 'postdraw',\n PointerUp: 'pointerup',\n PointerDown: 'pointerdown',\n PointerMove: 'pointermove',\n PointerCancel: 'pointercancel'\n};\n/**\n * The TileMap provides a mechanism for doing flat 2D tiles rendered in a grid.\n *\n * TileMaps are useful for top down or side scrolling grid oriented games.\n */\nclass TileMap extends _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__.Entity {\n flagCollidersDirty() {\n this._collidersDirty = true;\n }\n flagTilesDirty() {\n for (let i = 0; i < this.tiles.length; i++) {\n if (this.tiles[i]) {\n this.tiles[i].flagDirty();\n }\n }\n }\n get x() {\n var _a;\n return (_a = this.transform.pos.x) !== null && _a !== void 0 ? _a : 0;\n }\n set x(val) {\n var _a;\n if ((_a = this.transform) === null || _a === void 0 ? void 0 : _a.pos) {\n this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(val, this.y);\n }\n }\n get y() {\n var _a, _b;\n return (_b = (_a = this.transform) === null || _a === void 0 ? void 0 : _a.pos.y) !== null && _b !== void 0 ? _b : 0;\n }\n set y(val) {\n var _a;\n if ((_a = this.transform) === null || _a === void 0 ? void 0 : _a.pos) {\n this.transform.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(this.x, val);\n }\n }\n get z() {\n var _a;\n return (_a = this.transform.z) !== null && _a !== void 0 ? _a : 0;\n }\n set z(val) {\n if (this.transform) {\n this.transform.z = val;\n }\n }\n get rotation() {\n var _a, _b;\n return (_b = (_a = this.transform) === null || _a === void 0 ? void 0 : _a.rotation) !== null && _b !== void 0 ? _b : 0;\n }\n set rotation(val) {\n if (this.transform) {\n this.transform.rotation = val;\n }\n }\n get scale() {\n var _a, _b;\n return (_b = (_a = this.transform) === null || _a === void 0 ? void 0 : _a.scale) !== null && _b !== void 0 ? _b : _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.One;\n }\n set scale(val) {\n var _a;\n if ((_a = this.transform) === null || _a === void 0 ? void 0 : _a.scale) {\n this.transform.scale = val;\n }\n }\n get pos() {\n return this.transform.pos;\n }\n set pos(val) {\n this.transform.pos = val;\n }\n get vel() {\n return this._motion.vel;\n }\n set vel(val) {\n this._motion.vel = val;\n }\n /**\n * Width of the whole tile map in pixels\n */\n get width() {\n return this.tileWidth * this.columns * this.scale.x;\n }\n /**\n * Height of the whole tilemap in pixels\n */\n get height() {\n return this.tileHeight * this.rows * this.scale.y;\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n /**\n * @param options\n */\n constructor(options) {\n var _a, _b, _c;\n super([], options.name);\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_3__.EventEmitter();\n this._token = 0;\n this.logger = _Util_Log__WEBPACK_IMPORTED_MODULE_4__.Logger.getInstance();\n this.tiles = [];\n this._rows = [];\n this._cols = [];\n this.renderFromTopOfGraphic = false;\n this.meshingLookBehind = 10;\n this._collidersDirty = true;\n this._oldRotation = 0;\n this._originalOffsets = new WeakMap();\n this.meshingLookBehind = (_a = options.meshingLookBehind) !== null && _a !== void 0 ? _a : this.meshingLookBehind;\n this.addComponent(new _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent());\n this.addComponent(new _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_5__.MotionComponent());\n this.addComponent(new _Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_6__.BodyComponent({\n type: _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_7__.CollisionType.Fixed\n }));\n this.addComponent(new _Graphics__WEBPACK_IMPORTED_MODULE_8__.GraphicsComponent({\n onPostDraw: (ctx, elapsed) => this.draw(ctx, elapsed)\n }));\n this.addComponent(new _Graphics_DebugGraphicsComponent__WEBPACK_IMPORTED_MODULE_9__.DebugGraphicsComponent((ctx, debugFlags) => this.debug(ctx, debugFlags), false));\n this.addComponent(new _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_10__.ColliderComponent());\n this.addComponent(new _Input_PointerComponent__WEBPACK_IMPORTED_MODULE_11__.PointerComponent());\n this.pointer = this.get(_Input_PointerComponent__WEBPACK_IMPORTED_MODULE_11__.PointerComponent);\n this._graphics = this.get(_Graphics__WEBPACK_IMPORTED_MODULE_8__.GraphicsComponent);\n this.transform = this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._motion = this.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_5__.MotionComponent);\n this.collider = this.get(_Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_10__.ColliderComponent);\n this._composite = this.collider.useCompositeCollider([]);\n this.transform.pos = (_b = options.pos) !== null && _b !== void 0 ? _b : _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero;\n this._oldPos = this.transform.pos.clone();\n this._oldScale = this.transform.scale.clone();\n this.renderFromTopOfGraphic = (_c = options.renderFromTopOfGraphic) !== null && _c !== void 0 ? _c : this.renderFromTopOfGraphic;\n this.tileWidth = options.tileWidth;\n this.tileHeight = options.tileHeight;\n this.rows = options.rows;\n this.columns = options.columns;\n this._pointerEventDispatcher = new _Input_PointerEventsToObjectDispatcher__WEBPACK_IMPORTED_MODULE_12__.PointerEventsToObjectDispatcher();\n this.tiles = new Array(this.rows * this.columns);\n this._rows = new Array(this.rows);\n this._cols = new Array(this.columns);\n let currentCol = [];\n for (let i = 0; i < this.columns; i++) {\n for (let j = 0; j < this.rows; j++) {\n const tile = new Tile({\n x: i,\n y: j,\n map: this\n });\n tile.map = this;\n this.tiles[i + j * this.columns] = tile;\n this._pointerEventDispatcher.addObject(tile, (vec) => {\n // TODO handle geometry/graphics\n return tile.bounds.contains(vec.worldPos);\n }, () => true);\n currentCol.push(tile);\n if (!this._rows[j]) {\n this._rows[j] = [];\n }\n this._rows[j].push(tile);\n }\n this._cols[i] = currentCol;\n currentCol = [];\n }\n this._graphics.localBounds = new _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_13__.BoundingBox({\n left: 0,\n top: 0,\n right: this.columns * this.tileWidth * this.scale.x,\n bottom: this.rows * this.tileHeight * this.scale.y\n });\n }\n _initialize(engine) {\n super._initialize(engine);\n this._engine = engine;\n }\n _getOrSetColliderOriginalOffset(collider) {\n var _a;\n if (!this._originalOffsets.has(collider)) {\n const originalOffset = collider.offset;\n this._originalOffsets.set(collider, originalOffset);\n return originalOffset;\n }\n else {\n return (_a = this._originalOffsets.get(collider)) !== null && _a !== void 0 ? _a : _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero;\n }\n }\n /**\n * Tiles colliders based on the solid tiles in the tilemap.\n */\n _updateColliders() {\n this.collider.$colliderRemoved.notifyAll(this._composite);\n this._composite.clearColliders();\n const colliders = [];\n this._composite = this.collider.useCompositeCollider([]);\n let current = null;\n /**\n * Returns wether or not the 2 boxes share an edge and are the same height\n * @param prev\n * @param next\n * @returns true if they share and edge, false if not\n */\n const shareEdges = (prev, next) => {\n if (prev && next) {\n // same top/bottom\n return (prev.top === next.top &&\n prev.bottom === next.bottom &&\n // Shared right/left edge\n prev.right === next.left);\n }\n return false;\n };\n /**\n * Potentially merges the current collider into a list of previous ones, mutating the list\n * If checkAndCombine returns true, the collider was successfully merged and should be thrown away\n * @param current current collider to test\n * @param colliders List of colliders to consider merging with\n * @param maxLookBack The amount of colliders to look back for combination\n * @returns false when no combination found, true when successfully combined\n */\n const checkAndCombine = (current, colliders, maxLookBack = this.meshingLookBehind) => {\n if (!current) {\n return false;\n }\n // walk backwards through the list of colliders and combine with the first that shares an edge\n for (let i = colliders.length - 1; i >= 0; i--) {\n if (maxLookBack-- < 0) {\n // blunt the O(n^2) algorithm a bit\n return false;\n }\n const prev = colliders[i];\n if (shareEdges(prev, current)) {\n colliders[i] = prev.combine(current);\n return true;\n }\n }\n return false;\n };\n // ? configurable bias perhaps, horizontal strips vs. vertical ones\n // Bad tile collider packing algorithm\n for (let i = 0; i < this.columns; i++) {\n // Scan column for colliders\n for (let j = 0; j < this.rows; j++) {\n const tile = this.tiles[i + j * this.columns];\n // Current tile in column is solid build up current collider\n if (tile.solid) {\n // Use custom collider otherwise bounding box\n if (tile.getColliders().length > 0) {\n // tile with custom collider interrupting the current run\n for (const collider of tile.getColliders()) {\n const originalOffset = this._getOrSetColliderOriginalOffset(collider);\n collider.offset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(tile.x * this.tileWidth * this.scale.x, tile.y * this.tileHeight * this.scale.y).add(originalOffset);\n collider.owner = this;\n this._composite.addCollider(collider);\n }\n //we push any current collider before nulling the current run\n if (current && !checkAndCombine(current, colliders)) {\n colliders.push(current);\n }\n current = null;\n // Use the bounding box\n }\n else {\n if (!current) {\n // no current run, start one\n current = tile.defaultGeometry;\n }\n else {\n // combine with current run\n current = current.combine(tile.defaultGeometry);\n }\n }\n }\n else {\n // Not solid skip and cut off the current collider\n // End of run check and combine\n if (current && !checkAndCombine(current, colliders)) {\n colliders.push(current);\n }\n current = null;\n }\n }\n // After a column is complete check to see if it can be merged into the last one\n // Eno of run check and combine\n if (current && !checkAndCombine(current, colliders)) {\n // else new collider if no combination\n colliders.push(current);\n }\n current = null;\n }\n for (const c of colliders) {\n const collider = _Collision_Colliders_Shape__WEBPACK_IMPORTED_MODULE_14__.Shape.Box(c.width, c.height, _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero, (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(c.left - this.pos.x, c.top - this.pos.y));\n collider.owner = this;\n this._composite.addCollider(collider);\n }\n this.collider.update();\n // Notify that colliders have been updated\n this.collider.$colliderAdded.notifyAll(this._composite);\n }\n /**\n * Returns the {@apilink Tile} by index (row major order)\n *\n * Returns null if out of bounds\n */\n getTileByIndex(index) {\n var _a;\n return (_a = this.tiles[index]) !== null && _a !== void 0 ? _a : null;\n }\n /**\n * Returns the {@apilink Tile} by its x and y integer coordinates\n *\n * Returns null if out of bounds\n *\n * For example, if I want the tile in fifth column (x), and second row (y):\n * `getTile(4, 1)` 0 based, so 0 is the first in row/column\n */\n getTile(x, y) {\n if (x < 0 || y < 0 || x >= this.columns || y >= this.rows) {\n return null;\n }\n return this.tiles[x + y * this.columns];\n }\n /**\n * Returns the {@apilink Tile} by testing a point in world coordinates,\n * returns `null` if no Tile was found.\n */\n getTileByPoint(point) {\n const { x, y } = this._getTileCoordinates(point);\n const tile = this.getTile(x, y);\n if (x >= 0 && y >= 0 && x < this.columns && y < this.rows && tile) {\n return tile;\n }\n return null;\n }\n _getTileCoordinates(point) {\n // Convert to Tile Space point\n point = this.transform.applyInverse(point);\n const x = Math.floor(point.x / this.tileWidth);\n const y = Math.floor(point.y / this.tileHeight);\n return { x, y };\n }\n getRows() {\n return this._rows;\n }\n getColumns() {\n return this._cols;\n }\n /**\n * Returns the on screen tiles for a tilemap, this will overshoot by a small amount because of the internal quad tree data structure.\n *\n * Useful if you need to perform specific logic on onscreen tiles\n */\n getOnScreenTiles() {\n let worldBounds = this._engine.screen.getWorldBounds();\n const maybeParallax = this.get(_Graphics__WEBPACK_IMPORTED_MODULE_15__.ParallaxComponent);\n if (maybeParallax && this.isInitialized) {\n let pos = this.pos;\n const oneMinusFactor = _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.One.sub(maybeParallax.parallaxFactor);\n const parallaxOffset = this._engine.currentScene.camera.pos.scale(oneMinusFactor);\n pos = pos.sub(parallaxOffset);\n // adjust world bounds by parallax factor\n worldBounds = worldBounds.translate(pos);\n }\n const bounds = this.transform.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_16__.CoordPlane.Screen ? this._engine.screen.getScreenBounds() : worldBounds;\n const topLeft = this._getTileCoordinates(bounds.topLeft);\n const topRight = this._getTileCoordinates(bounds.topRight);\n const bottomRight = this._getTileCoordinates(bounds.bottomRight);\n const bottomLeft = this._getTileCoordinates(bounds.bottomLeft);\n const tileStartX = Math.min((0,_Math_util__WEBPACK_IMPORTED_MODULE_17__.clamp)(topLeft.x, 0, this.columns - 1), (0,_Math_util__WEBPACK_IMPORTED_MODULE_17__.clamp)(topRight.x, 0, this.columns - 1));\n const tileStartY = Math.min((0,_Math_util__WEBPACK_IMPORTED_MODULE_17__.clamp)(topLeft.y, 0, this.rows - 1), (0,_Math_util__WEBPACK_IMPORTED_MODULE_17__.clamp)(topRight.y, 0, this.rows - 1));\n const tileEndX = Math.max((0,_Math_util__WEBPACK_IMPORTED_MODULE_17__.clamp)(bottomRight.x, 0, this.columns - 1), (0,_Math_util__WEBPACK_IMPORTED_MODULE_17__.clamp)(bottomLeft.x, 0, this.columns - 1));\n const tileEndY = Math.max((0,_Math_util__WEBPACK_IMPORTED_MODULE_17__.clamp)(bottomRight.y, 0, this.rows - 1), (0,_Math_util__WEBPACK_IMPORTED_MODULE_17__.clamp)(bottomLeft.y, 0, this.rows - 1));\n const tiles = [];\n for (let x = tileStartX; x <= tileEndX; x++) {\n for (let y = tileStartY; y <= tileEndY; y++) {\n tiles.push(this.getTile(x, y));\n }\n }\n return tiles;\n }\n /**\n * @internal\n */\n _processPointerToObject(receiver) {\n this._pointerEventDispatcher.processPointerToObject(receiver, this.tiles);\n }\n /**\n * @internal\n */\n _dispatchPointerEvents(receiver) {\n this._pointerEventDispatcher.dispatchEvents(receiver, this.tiles);\n }\n update(engine, elapsed) {\n this._initialize(engine);\n this.onPreUpdate(engine, elapsed);\n this.emit('preupdate', new _Events__WEBPACK_IMPORTED_MODULE_18__.PreUpdateEvent(engine, elapsed, this));\n // Update colliders\n if (!this._oldPos.equals(this.pos) || this._oldRotation !== this.rotation || !this._oldScale.equals(this.scale)) {\n this.flagCollidersDirty();\n this.flagTilesDirty();\n }\n if (this._collidersDirty) {\n this._collidersDirty = false;\n this._updateColliders();\n }\n // Clear last frame's events\n this._pointerEventDispatcher.clear();\n this._token++;\n this.pos.clone(this._oldPos);\n this._oldRotation = this.rotation;\n this.scale.clone(this._oldScale);\n this.transform.pos = this.pos;\n this.onPostUpdate(engine, elapsed);\n this.emit('postupdate', new _Events__WEBPACK_IMPORTED_MODULE_18__.PostUpdateEvent(engine, elapsed, this));\n }\n /**\n * Draws the tile map to the screen. Called by the {@apilink Scene}.\n * @param ctx ExcaliburGraphicsContext\n * @param elapsed The number of milliseconds since the last draw\n */\n draw(ctx, elapsed) {\n if (!this.isInitialized) {\n return;\n }\n this.emit('predraw', new _Events__WEBPACK_IMPORTED_MODULE_18__.PreDrawEvent(ctx, elapsed, this)); // TODO fix event\n let graphics, graphicsIndex, graphicsLen;\n const tiles = this.getOnScreenTiles();\n for (let i = 0; i < tiles.length; i++) {\n const tile = tiles[i];\n // get non-negative tile sprites\n const offsets = tile.getGraphicsOffsets();\n graphics = tile.getGraphics();\n for (graphicsIndex = 0, graphicsLen = graphics.length; graphicsIndex < graphicsLen; graphicsIndex++) {\n // draw sprite, warning if sprite doesn't exist\n const graphic = graphics[graphicsIndex];\n const offset = offsets[graphicsIndex];\n if (graphic) {\n if ((0,_Graphics__WEBPACK_IMPORTED_MODULE_8__.hasGraphicsTick)(graphic)) {\n graphic === null || graphic === void 0 ? void 0 : graphic.tick(elapsed, this._token);\n }\n const offsetY = this.renderFromTopOfGraphic ? 0 : graphic.height - this.tileHeight;\n graphic.draw(ctx, tile.x * this.tileWidth + offset.x, tile.y * this.tileHeight - offsetY + offset.y);\n }\n }\n }\n this.emit('postdraw', new _Events__WEBPACK_IMPORTED_MODULE_18__.PostDrawEvent(ctx, elapsed, this));\n }\n debug(gfx, debugFlags) {\n const { showAll, showGrid, gridColor, gridWidth, showSolidBounds: showColliderBounds, solidBoundsColor: colliderBoundsColor, showColliderGeometry } = debugFlags.tilemap;\n const { geometryColor, geometryLineWidth, geometryPointSize } = debugFlags.collider;\n const width = this.tileWidth * this.columns * this.scale.x;\n const height = this.tileHeight * this.rows * this.scale.y;\n const pos = this.pos;\n if (showGrid || showAll) {\n for (let r = 0; r < this.rows + 1; r++) {\n const yOffset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(0, r * this.tileHeight * this.scale.y);\n gfx.drawLine(pos.add(yOffset), pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(width, yOffset.y)), gridColor, gridWidth);\n }\n for (let c = 0; c < this.columns + 1; c++) {\n const xOffset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(c * this.tileWidth * this.scale.x, 0);\n gfx.drawLine(pos.add(xOffset), pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(xOffset.x, height)), gridColor, gridWidth);\n }\n }\n if (showAll || showColliderBounds || showColliderGeometry) {\n const colliders = this._composite.getColliders();\n gfx.save();\n gfx.translate(this.pos.x, this.pos.y);\n gfx.scale(this.scale.x, this.scale.y);\n for (const collider of colliders) {\n const bounds = collider.localBounds;\n const pos = collider.worldPos.sub(this.pos);\n if (showColliderBounds) {\n gfx.drawRectangle(pos, bounds.width, bounds.height, colliderBoundsColor);\n }\n }\n gfx.restore();\n if (showColliderGeometry) {\n for (const collider of colliders) {\n collider.debug(gfx, geometryColor, { lineWidth: geometryLineWidth, pointSize: geometryPointSize });\n }\n }\n }\n if (showAll || showColliderBounds) {\n gfx.save();\n gfx.z = 999;\n if (showColliderBounds) {\n for (let i = 0; i < this.tiles.length; i++) {\n this.tiles[i].bounds.draw(gfx);\n }\n }\n gfx.restore();\n }\n }\n}\n/**\n * TileMap Tile\n *\n * A light-weight object that occupies a space in a collision map. Generally\n * created by a {@apilink TileMap}.\n *\n * Tiles can draw multiple sprites. Note that the order of drawing is the order\n * of the sprites in the array so the last one will be drawn on top. You can\n * use transparency to create layers this way.\n */\nclass Tile {\n /**\n * Return the world position of the top left corner of the tile\n */\n get pos() {\n if (this._posDirty) {\n this._recalculate();\n this._posDirty = false;\n }\n return this._pos;\n }\n /**\n * Width of the tile in pixels\n */\n get width() {\n return this._width;\n }\n /**\n * Height of the tile in pixels\n */\n get height() {\n return this._height;\n }\n /**\n * Wether this tile should be treated as solid by the tilemap\n */\n get solid() {\n return this._solid;\n }\n /**\n * Wether this tile should be treated as solid by the tilemap\n */\n set solid(val) {\n var _a;\n (_a = this.map) === null || _a === void 0 ? void 0 : _a.flagCollidersDirty();\n this._solid = val;\n }\n /**\n * Current list of graphics for this tile\n */\n getGraphics() {\n return this._graphics;\n }\n /**\n * Current list of offsets for this tile's graphics\n */\n getGraphicsOffsets() {\n return this._offsets;\n }\n /**\n * Add another {@apilink Graphic} to this TileMap tile\n * @param graphic\n */\n addGraphic(graphic, options) {\n this._graphics.push(graphic);\n if (options === null || options === void 0 ? void 0 : options.offset) {\n this._offsets.push(options.offset);\n }\n else {\n this._offsets.push(_Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero);\n }\n }\n /**\n * Remove an instance of a {@apilink Graphic} from this tile\n */\n removeGraphic(graphic) {\n const index = this._graphics.indexOf(graphic);\n if (index > -1) {\n this._graphics.splice(index, 1);\n this._offsets.splice(index, 1);\n }\n }\n /**\n * Clear all graphics from this tile\n */\n clearGraphics() {\n this._graphics.length = 0;\n this._offsets.length = 0;\n }\n /**\n * Returns the list of colliders\n */\n getColliders() {\n return this._colliders;\n }\n /**\n * Adds a custom collider to the {@apilink Tile} to use instead of it's bounds\n *\n * If no collider is set but {@apilink Tile.solid} is set, the tile bounds are used as a collider.\n *\n * **Note!** the {@apilink Tile.solid} must be set to true for it to act as a \"fixed\" collider\n * @param collider\n */\n addCollider(collider) {\n this._colliders.push(collider);\n this.map.flagCollidersDirty();\n }\n /**\n * Removes a collider from the {@apilink Tile}\n * @param collider\n */\n removeCollider(collider) {\n const index = this._colliders.indexOf(collider);\n if (index > -1) {\n this._colliders.splice(index, 1);\n }\n this.map.flagCollidersDirty();\n }\n /**\n * Clears all colliders from the {@apilink Tile}\n */\n clearColliders() {\n this._colliders.length = 0;\n this.map.flagCollidersDirty();\n }\n constructor(options) {\n var _a, _b;\n this._posDirty = false;\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_3__.EventEmitter();\n this._solid = false;\n this._graphics = [];\n this._offsets = [];\n /**\n * Current list of colliders for this tile\n */\n this._colliders = [];\n /**\n * Arbitrary data storage per tile, useful for any game specific data\n */\n this.data = new Map();\n this.x = options.x;\n this.y = options.y;\n this.map = options.map;\n this._width = options.map.tileWidth * this.map.scale.x;\n this._height = options.map.tileHeight * this.map.scale.y;\n this.solid = (_a = options.solid) !== null && _a !== void 0 ? _a : this.solid;\n this._graphics = (_b = options.graphics) !== null && _b !== void 0 ? _b : [];\n this._recalculate();\n }\n flagDirty() {\n return (this._posDirty = true);\n }\n _recalculate() {\n const geometryPos = this.map.pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(this.x * this.map.tileWidth, this.y * this.map.tileHeight));\n this._geometry = new _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_13__.BoundingBox(geometryPos.x, geometryPos.y, geometryPos.x + this.map.tileWidth, geometryPos.y + this.map.tileHeight);\n this._width = this.map.tileWidth * this.map.scale.x;\n this._height = this.map.tileHeight * this.map.scale.y;\n this._pos = this.map.pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(this.x * this._width, this.y * this._height));\n this._bounds = new _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_13__.BoundingBox(this._pos.x, this._pos.y, this._pos.x + this._width, this._pos.y + this._height);\n if (this.map.rotation) {\n this._bounds = this._bounds.rotate(this.map.rotation, this.map.pos);\n }\n this._posDirty = false;\n }\n /**\n * Tile bounds in world space\n */\n get bounds() {\n if (this._posDirty) {\n this._recalculate();\n }\n return this._bounds;\n }\n get defaultGeometry() {\n return this._geometry;\n }\n /**\n * Tile position in world space\n */\n get center() {\n if (this._posDirty) {\n this._recalculate();\n }\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._pos.x + this._width / 2, this._pos.y + this._height / 2);\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n if (handler) {\n this.events.off(eventName, handler);\n }\n else {\n this.events.off(eventName);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./TileMap/index.ts\":\n/*!**************************!*\\\n !*** ./TileMap/index.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ IsometricEntityComponent: () => (/* reexport safe */ _IsometricEntityComponent__WEBPACK_IMPORTED_MODULE_2__.IsometricEntityComponent),\n/* harmony export */ IsometricEntitySystem: () => (/* reexport safe */ _IsometricEntitySystem__WEBPACK_IMPORTED_MODULE_3__.IsometricEntitySystem),\n/* harmony export */ IsometricMap: () => (/* reexport safe */ _IsometricMap__WEBPACK_IMPORTED_MODULE_1__.IsometricMap),\n/* harmony export */ IsometricTile: () => (/* reexport safe */ _IsometricMap__WEBPACK_IMPORTED_MODULE_1__.IsometricTile),\n/* harmony export */ Tile: () => (/* reexport safe */ _TileMap__WEBPACK_IMPORTED_MODULE_0__.Tile),\n/* harmony export */ TileMap: () => (/* reexport safe */ _TileMap__WEBPACK_IMPORTED_MODULE_0__.TileMap),\n/* harmony export */ TileMapEvents: () => (/* reexport safe */ _TileMap__WEBPACK_IMPORTED_MODULE_0__.TileMapEvents)\n/* harmony export */ });\n/* harmony import */ var _TileMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./TileMap */ \"./TileMap/TileMap.ts\");\n/* harmony import */ var _IsometricMap__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./IsometricMap */ \"./TileMap/IsometricMap.ts\");\n/* harmony import */ var _IsometricEntityComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./IsometricEntityComponent */ \"./TileMap/IsometricEntityComponent.ts\");\n/* harmony import */ var _IsometricEntitySystem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./IsometricEntitySystem */ \"./TileMap/IsometricEntitySystem.ts\");\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Timer.ts\":\n/*!******************!*\\\n !*** ./Timer.ts ***!\n \\******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Timer: () => (/* binding */ Timer)\n/* harmony export */ });\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Math_Random__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Math/Random */ \"./Math/Random.ts\");\n\n\n/**\n * The Excalibur timer hooks into the internal timer and fires callbacks,\n * after a certain interval, optionally repeating.\n */\nclass Timer {\n get complete() {\n return this._complete;\n }\n constructor(options) {\n var _a;\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance();\n this.id = 0;\n this._elapsedTime = 0;\n this._totalTimeAlive = 0;\n this._running = false;\n this._numberOfTicks = 0;\n this.interval = 10;\n this.repeats = false;\n this.maxNumberOfRepeats = -1;\n this.randomRange = [0, 0];\n this._baseInterval = 10;\n this._generateRandomInterval = () => {\n return this._baseInterval + this.random.integer(this.randomRange[0], this.randomRange[1]);\n };\n this._complete = false;\n this.scene = null;\n const fcn = (_a = options.action) !== null && _a !== void 0 ? _a : options.fcn;\n const interval = options.interval;\n const repeats = options.repeats;\n const numberOfRepeats = options.numberOfRepeats;\n const randomRange = options.randomRange;\n const random = options.random;\n if (!!numberOfRepeats && numberOfRepeats >= 0) {\n this.maxNumberOfRepeats = numberOfRepeats;\n if (!repeats) {\n throw new Error('repeats must be set to true if numberOfRepeats is set');\n }\n }\n this.id = Timer._MAX_ID++;\n this._callbacks = [];\n this._baseInterval = this.interval = interval;\n if (!!randomRange) {\n if (randomRange[0] > randomRange[1]) {\n throw new Error('min value must be lower than max value for range');\n }\n //We use the instance of ex.Random to generate the range\n this.random = random !== null && random !== void 0 ? random : new _Math_Random__WEBPACK_IMPORTED_MODULE_1__.Random();\n this.randomRange = randomRange;\n this.interval = this._generateRandomInterval();\n this.on(() => {\n this.interval = this._generateRandomInterval();\n });\n }\n this.repeats = repeats || this.repeats;\n if (fcn) {\n this.on(fcn);\n }\n }\n /**\n * Adds a new callback to be fired after the interval is complete\n * @param action The callback to be added to the callback list, to be fired after the interval is complete.\n */\n on(action) {\n this._callbacks.push(action);\n }\n /**\n * Removes a callback from the callback list to be fired after the interval is complete.\n * @param action The callback to be removed from the callback list, to be fired after the interval is complete.\n */\n off(action) {\n const index = this._callbacks.indexOf(action);\n this._callbacks.splice(index, 1);\n }\n /**\n * Updates the timer after a certain number of milliseconds have elapsed. This is used internally by the engine.\n * @param elapsed Number of elapsed milliseconds since the last update.\n */\n update(elapsed) {\n if (this._running) {\n this._totalTimeAlive += elapsed;\n this._elapsedTime += elapsed;\n if (this.maxNumberOfRepeats > -1 && this._numberOfTicks >= this.maxNumberOfRepeats) {\n this._complete = true;\n this._running = false;\n this._elapsedTime = 0;\n }\n if (!this.complete && this._elapsedTime >= this.interval) {\n this._callbacks.forEach((c) => {\n c.call(this);\n });\n this._numberOfTicks++;\n if (this.repeats) {\n this._elapsedTime = 0;\n }\n else {\n this._complete = true;\n this._running = false;\n this._elapsedTime = 0;\n }\n }\n }\n }\n /**\n * Resets the timer so that it can be reused, and optionally reconfigure the timers interval.\n *\n * Warning** you may need to call `timer.start()` again if the timer had completed\n * @param newInterval If specified, sets a new non-negative interval in milliseconds to refire the callback\n * @param newNumberOfRepeats If specified, sets a new non-negative upper limit to the number of time this timer executes\n */\n reset(newInterval, newNumberOfRepeats) {\n if (!!newInterval && newInterval >= 0) {\n this._baseInterval = this.interval = newInterval;\n }\n if (!!this.maxNumberOfRepeats && this.maxNumberOfRepeats >= 0) {\n this.maxNumberOfRepeats = newNumberOfRepeats;\n if (!this.repeats) {\n throw new Error('repeats must be set to true if numberOfRepeats is set');\n }\n }\n this._complete = false;\n this._elapsedTime = 0;\n this._numberOfTicks = 0;\n }\n get timesRepeated() {\n return this._numberOfTicks;\n }\n getTimeRunning() {\n return this._totalTimeAlive;\n }\n /**\n * @returns milliseconds until the next action callback, if complete will return 0\n */\n get timeToNextAction() {\n if (this.complete) {\n return 0;\n }\n return this.interval - this._elapsedTime;\n }\n /**\n * @returns milliseconds elapsed toward the next action\n */\n get timeElapsedTowardNextAction() {\n return this._elapsedTime;\n }\n get isRunning() {\n return this._running;\n }\n /**\n * Pauses the timer, time will no longer increment towards the next call\n */\n pause() {\n this._running = false;\n return this;\n }\n /**\n * Resumes the timer, time will now increment towards the next call.\n */\n resume() {\n this._running = true;\n return this;\n }\n /**\n * Starts the timer, if the timer was complete it will restart the timer and reset the elapsed time counter\n */\n start() {\n if (!this.scene) {\n this._logger.warn('Cannot start a timer not part of a scene, timer wont start until added');\n }\n this._running = true;\n if (this.complete) {\n this._complete = false;\n this._elapsedTime = 0;\n this._numberOfTicks = 0;\n }\n return this;\n }\n /**\n * Stops the timer and resets the elapsed time counter towards the next action invocation\n */\n stop() {\n this._running = false;\n this._elapsedTime = 0;\n this._numberOfTicks = 0;\n return this;\n }\n /**\n * Cancels the timer, preventing any further executions.\n */\n cancel() {\n this.pause();\n if (this.scene) {\n this.scene.cancelTimer(this);\n }\n }\n}\nTimer._MAX_ID = 0;\n\n\n/***/ }),\n\n/***/ \"./Trigger.ts\":\n/*!********************!*\\\n !*** ./Trigger.ts ***!\n \\********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Trigger: () => (/* binding */ Trigger),\n/* harmony export */ TriggerEvents: () => (/* binding */ TriggerEvents)\n/* harmony export */ });\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Events */ \"./Events.ts\");\n/* harmony import */ var _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Collision/CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Actor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Actor */ \"./Actor.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n\nconst TriggerEvents = {\n ExitTrigger: 'exit',\n EnterTrigger: 'enter'\n};\n/**\n * Triggers are a method of firing arbitrary code on collision. These are useful\n * as 'buttons', 'switches', or to trigger effects in a game. By default triggers\n * are invisible, and can only be seen when {@apilink Trigger.visible} is set to `true`.\n */\nclass Trigger extends _Actor__WEBPACK_IMPORTED_MODULE_0__.Actor {\n /**\n * @param options Trigger options\n */\n constructor(options) {\n var _a, _b, _c, _d;\n super({ ...options });\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_1__.EventEmitter();\n this.filter = (_a = options.filter) !== null && _a !== void 0 ? _a : (() => true);\n this.repeat = (_b = options.repeat) !== null && _b !== void 0 ? _b : -1;\n this.action = (_c = options.action) !== null && _c !== void 0 ? _c : (() => undefined);\n this.target = options.target;\n this.graphics.isVisible = (_d = options.visible) !== null && _d !== void 0 ? _d : false;\n this.body.collisionType = _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.Passive;\n this.events.on('collisionstart', ({ other: collider }) => {\n if (!this._matchesTarget(collider.owner)) {\n return;\n }\n this.events.emit('enter', new _Events__WEBPACK_IMPORTED_MODULE_3__.EnterTriggerEvent(this, collider.owner));\n this._dispatchAction(collider.owner);\n // remove trigger if its done, -1 repeat forever\n if (this.repeat === 0) {\n this.kill();\n }\n });\n this.events.on('collisionend', ({ other: collider }) => {\n if (this._matchesTarget(collider.owner)) {\n this.events.emit('exit', new _Events__WEBPACK_IMPORTED_MODULE_3__.ExitTriggerEvent(this, collider.owner));\n }\n });\n }\n _matchesTarget(entity) {\n return this.filter(entity) && (this.target === undefined || this.target === entity);\n }\n _dispatchAction(target) {\n if (this.repeat !== 0) {\n this.action.call(this, target);\n this.repeat--;\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Assert.ts\":\n/*!************************!*\\\n !*** ./Util/Assert.ts ***!\n \\************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ assert: () => (/* binding */ assert)\n/* harmony export */ });\n/**\n * Asserts will throw in `process.env.NODE_ENV === 'development'` builds if the expression evaluates false\n */\nfunction assert(message, expression) {\n if (true) {\n if (!expression()) {\n throw new Error(message);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Browser.ts\":\n/*!*************************!*\\\n !*** ./Util/Browser.ts ***!\n \\*************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BrowserComponent: () => (/* binding */ BrowserComponent),\n/* harmony export */ BrowserEvents: () => (/* binding */ BrowserEvents)\n/* harmony export */ });\nclass BrowserComponent {\n on(eventName, handler) {\n if (this._nativeHandlers[eventName]) {\n this.off(eventName, this._nativeHandlers[eventName]);\n }\n this._nativeHandlers[eventName] = this._decorate(handler);\n this.nativeComponent.addEventListener(eventName, this._nativeHandlers[eventName]);\n }\n off(eventName, handler) {\n if (!handler) {\n handler = this._nativeHandlers[eventName];\n }\n this.nativeComponent.removeEventListener(eventName, handler);\n this._nativeHandlers[eventName] = null;\n }\n _decorate(handler) {\n return (evt) => {\n if (!this._paused) {\n handler(evt);\n }\n };\n }\n pause() {\n this._paused = true;\n }\n resume() {\n this._paused = false;\n }\n clear() {\n for (const event in this._nativeHandlers) {\n this.off(event);\n }\n }\n constructor(nativeComponent) {\n this.nativeComponent = nativeComponent;\n this._paused = false;\n this._nativeHandlers = {};\n }\n}\nclass BrowserEvents {\n constructor(_windowGlobal, _documentGlobal) {\n this._windowGlobal = _windowGlobal;\n this._documentGlobal = _documentGlobal;\n this._windowComponent = new BrowserComponent(this._windowGlobal);\n this._documentComponent = new BrowserComponent(this._documentGlobal);\n }\n get window() {\n return this._windowComponent;\n }\n get document() {\n return this._documentComponent;\n }\n pause() {\n this.window.pause();\n this.document.pause();\n }\n resume() {\n this.window.resume();\n this.document.resume();\n }\n clear() {\n this.window.clear();\n this.document.clear();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Clock.ts\":\n/*!***********************!*\\\n !*** ./Util/Clock.ts ***!\n \\***********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Clock: () => (/* binding */ Clock),\n/* harmony export */ StandardClock: () => (/* binding */ StandardClock),\n/* harmony export */ TestClock: () => (/* binding */ TestClock)\n/* harmony export */ });\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Fps__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Fps */ \"./Util/Fps.ts\");\n\n\n/**\n * Abstract Clock is the base type of all Clocks\n *\n * It has a few opinions\n * 1. It manages the calculation of what \"elapsed\" time means and thus maximum fps\n * 2. The default timing api is implemented in now()\n *\n * To implement your own clock, extend Clock and override start/stop to start and stop the clock, then call update() with whatever\n * method is unique to your clock implementation.\n */\nclass Clock {\n constructor(options) {\n var _a, _b, _c;\n this._onFatalException = () => {\n /* default nothing */\n };\n this._maxFps = Infinity;\n this._lastTime = 0;\n this._elapsed = 1;\n this._scheduledCbs = [];\n this._totalElapsed = 0;\n this._options = options;\n this.tick = options.tick;\n this._lastTime = (_a = this.now()) !== null && _a !== void 0 ? _a : 0;\n this._maxFps = (_b = options.maxFps) !== null && _b !== void 0 ? _b : this._maxFps;\n this._onFatalException = (_c = options.onFatalException) !== null && _c !== void 0 ? _c : this._onFatalException;\n this.fpsSampler = new _Fps__WEBPACK_IMPORTED_MODULE_0__.FpsSampler({\n initialFps: 60,\n nowFn: () => this.now()\n });\n }\n /**\n * Get the elapsed time for the last completed frame\n */\n elapsed() {\n return this._elapsed;\n }\n /**\n * Get the current time in milliseconds\n */\n now() {\n return performance.now();\n }\n toTestClock() {\n const testClock = new TestClock({\n ...this._options,\n defaultUpdateMs: 16.6\n });\n return testClock;\n }\n toStandardClock() {\n const clock = new StandardClock({\n ...this._options\n });\n return clock;\n }\n setFatalExceptionHandler(handler) {\n this._onFatalException = handler;\n }\n /**\n * Schedule a callback to fire given a timeout in milliseconds using the excalibur {@apilink Clock}\n *\n * This is useful to use over the built in browser `setTimeout` because callbacks will be tied to the\n * excalibur update clock, instead of browser time, this means that callbacks wont fire if the game is\n * stopped or paused.\n * @param cb callback to fire\n * @param timeoutMs Optionally specify a timeout in milliseconds from now, default is 0ms which means the next possible tick\n * @param timing Optionally specify a timeout in milliseconds from now, default is 0ms which means the next possible tick\n */\n schedule(cb, timeoutMs = 0, timing = 'preframe') {\n // Scheduled based on internal elapsed time\n const scheduledTime = this._totalElapsed + timeoutMs;\n this._scheduledCbs.push([cb, scheduledTime, timing]);\n }\n /**\n * Called internally to trigger scheduled callbacks in the clock\n * @param timing\n * @internal\n */\n __runScheduledCbs(timing = 'preframe') {\n // walk backwards to delete items as we loop\n for (let i = this._scheduledCbs.length - 1; i > -1; i--) {\n if (timing === this._scheduledCbs[i][2] && this._scheduledCbs[i][1] <= this._totalElapsed) {\n this._scheduledCbs[i][0](this._elapsed);\n this._scheduledCbs.splice(i, 1);\n }\n }\n }\n update(overrideUpdateMs) {\n try {\n this.fpsSampler.start();\n // Get the time to calculate time-elapsed\n const now = this.now();\n let elapsed = now - this._lastTime || 1; // first frame\n // Constrain fps\n const fpsInterval = 1000 / this._maxFps;\n // only run frame if enough time has elapsed\n if (elapsed >= fpsInterval) {\n let leftover = 0;\n if (fpsInterval !== 0) {\n leftover = elapsed % fpsInterval;\n elapsed = elapsed - leftover; // shift elapsed to be \"in phase\" with the current loop fps\n }\n // Resolves issue #138 if the game has been paused, or blurred for\n // more than a 200 milliseconds, reset elapsed time to 1. This improves reliability\n // and provides more expected behavior when the engine comes back\n // into focus\n if (elapsed > 200) {\n elapsed = 1;\n }\n // tick the mainloop and run scheduled callbacks\n this._elapsed = overrideUpdateMs || elapsed;\n this._totalElapsed += this._elapsed;\n this.__runScheduledCbs('preframe');\n this.tick(overrideUpdateMs || elapsed);\n this.__runScheduledCbs('postframe');\n if (fpsInterval !== 0) {\n this._lastTime = now - leftover;\n }\n else {\n this._lastTime = now;\n }\n this.fpsSampler.end();\n }\n }\n catch (e) {\n this._onFatalException(e);\n this.stop();\n }\n }\n}\n/**\n * The {@apilink StandardClock} implements the requestAnimationFrame browser api to run the tick()\n */\nclass StandardClock extends Clock {\n constructor(options) {\n super(options);\n this._running = false;\n }\n isRunning() {\n return this._running;\n }\n start() {\n if (this._running) {\n return;\n }\n this._running = true;\n const mainloop = () => {\n // stop the loop\n if (!this._running) {\n return;\n }\n try {\n // request next loop\n this._requestId = window.requestAnimationFrame(mainloop);\n this.update();\n }\n catch (e) {\n window.cancelAnimationFrame(this._requestId);\n throw e;\n }\n };\n // begin the first frame\n mainloop();\n }\n stop() {\n window.cancelAnimationFrame(this._requestId);\n this._running = false;\n }\n}\n/**\n * The TestClock is meant for debugging interactions in excalibur that require precise timing to replicate or test\n */\nclass TestClock extends Clock {\n constructor(options) {\n super({\n ...options\n });\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this._running = false;\n this._currentTime = 0;\n this._updateMs = options.defaultUpdateMs;\n }\n /**\n * Get the current time in milliseconds\n */\n now() {\n var _a;\n return (_a = this._currentTime) !== null && _a !== void 0 ? _a : 0;\n }\n isRunning() {\n return this._running;\n }\n start() {\n this._running = true;\n }\n stop() {\n this._running = false;\n }\n /**\n * Manually step the clock forward 1 tick, optionally specify an elapsed time in milliseconds\n * @param overrideUpdateMs\n */\n step(overrideUpdateMs) {\n const time = overrideUpdateMs !== null && overrideUpdateMs !== void 0 ? overrideUpdateMs : this._updateMs;\n if (this._running) {\n // to be comparable to RAF this needs to be a full blown Task\n // For example, images cannot decode synchronously in a single step\n this.update(time);\n this._currentTime += time;\n }\n else {\n this._logger.warn('The clock is not running, no step will be performed');\n }\n }\n /**\n * Run a number of steps that tick the clock, optionally specify an elapsed time in milliseconds\n * @param numberOfSteps\n * @param overrideUpdateMs\n */\n run(numberOfSteps, overrideUpdateMs) {\n for (let i = 0; i < numberOfSteps; i++) {\n this.step(overrideUpdateMs !== null && overrideUpdateMs !== void 0 ? overrideUpdateMs : this._updateMs);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Coroutine.ts\":\n/*!***************************!*\\\n !*** ./Util/Coroutine.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ coroutine: () => (/* binding */ coroutine)\n/* harmony export */ });\n/* harmony import */ var _Context__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Context */ \"./Context.ts\");\n/* harmony import */ var _Engine__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Engine */ \"./Engine.ts\");\n/* harmony import */ var _Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Log */ \"./Util/Log.ts\");\n\n\n\nconst InsideCoroutineContext = (0,_Context__WEBPACK_IMPORTED_MODULE_0__.createContext)();\nconst generatorFunctionDeclaration = /^\\s*(?:function)?\\*/;\n/**\n *\n */\nfunction isCoroutineGenerator(x) {\n if (typeof x !== 'function') {\n return false;\n }\n if (generatorFunctionDeclaration.test(Function.prototype.toString.call(x))) {\n return true;\n }\n if (!Object.getPrototypeOf) {\n return false;\n }\n return Object.getPrototypeOf(x) === Object.getPrototypeOf(new Function('return function * () {}')());\n}\n/**\n *\n */\nfunction coroutine(...args) {\n var _a;\n const logger = _Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n let coroutineGenerator;\n let thisArg;\n let options;\n let passedEngine;\n // coroutine(coroutineGenerator: CoroutineGenerator, options?: CoroutineOptions): CoroutineInstance;\n if (isCoroutineGenerator(args[0])) {\n thisArg = globalThis;\n coroutineGenerator = args[0];\n options = args[1];\n }\n // coroutine(thisArg: any, coroutineGenerator: CoroutineGenerator, options?: CoroutineOptions): CoroutineInstance;\n if (isCoroutineGenerator(args[1])) {\n thisArg = args[0];\n coroutineGenerator = args[1];\n options = args[2];\n }\n // coroutine(thisArg: any, engine: Engine, coroutineGenerator: CoroutineGenerator, options?: CoroutineOptions): CoroutineInstance;\n if (args[1] instanceof _Engine__WEBPACK_IMPORTED_MODULE_2__.Engine) {\n thisArg = args[0];\n passedEngine = args[1];\n coroutineGenerator = args[2];\n options = args[3];\n }\n // coroutine(engine: Engine, coroutineGenerator: CoroutineGenerator, options?: CoroutineOptions): CoroutineInstance;\n if (args[0] instanceof _Engine__WEBPACK_IMPORTED_MODULE_2__.Engine) {\n thisArg = globalThis;\n passedEngine = args[0];\n coroutineGenerator = args[1];\n options = args[2];\n }\n const inside = (0,_Context__WEBPACK_IMPORTED_MODULE_0__.useContext)(InsideCoroutineContext);\n const schedule = options === null || options === void 0 ? void 0 : options.timing;\n const autostart = inside ? false : (_a = options === null || options === void 0 ? void 0 : options.autostart) !== null && _a !== void 0 ? _a : true;\n let engine;\n try {\n engine = passedEngine !== null && passedEngine !== void 0 ? passedEngine : _Engine__WEBPACK_IMPORTED_MODULE_2__.Engine.useEngine();\n }\n catch (_) {\n throw Error('Cannot run coroutine without engine parameter outside of an excalibur lifecycle method.\\n' +\n 'Pass an engine parameter to ex.coroutine(engine, function * {...})');\n }\n let started = false;\n let completed = false;\n let cancelled = false;\n const generatorFcn = coroutineGenerator.bind(thisArg);\n const generator = generatorFcn();\n let loop;\n const complete = new Promise((resolve, reject) => {\n loop = (elapsed) => {\n try {\n if (cancelled) {\n completed = true;\n resolve();\n return;\n }\n const { done, value } = InsideCoroutineContext.scope(true, () => generator.next(elapsed));\n if (done || cancelled) {\n completed = true;\n resolve();\n return;\n }\n if (value instanceof Promise) {\n value.then(() => {\n // schedule next loop\n engine.clock.schedule(loop, 0, schedule);\n });\n }\n else if (value === undefined || value === void 0) {\n // schedule next frame\n engine.clock.schedule(loop, 0, schedule);\n }\n else {\n // schedule value milliseconds from now\n engine.clock.schedule(loop, value || 0, schedule);\n }\n }\n catch (e) {\n reject(e);\n return;\n }\n };\n if (autostart) {\n started = true;\n loop(engine.clock.elapsed()); // run first frame immediately\n }\n });\n const co = {\n isRunning: () => {\n return started && !cancelled && !completed;\n },\n isComplete: () => {\n return completed;\n },\n cancel: () => {\n cancelled = true;\n },\n start: () => {\n if (!started) {\n started = true;\n loop(engine.clock.elapsed());\n }\n else {\n logger.warn('.start() was called on a coroutine that was already started, this is probably a bug:\\n', Function.prototype.toString.call(generatorFcn));\n }\n return co;\n },\n generator,\n done: complete,\n then: complete.then.bind(complete),\n [Symbol.iterator]: () => {\n // TODO warn if a coroutine is already running\n // TODO warn if a coroutine is cancelled\n return generator;\n }\n };\n return co;\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Decorators.ts\":\n/*!****************************!*\\\n !*** ./Util/Decorators.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ maxMessages: () => (/* binding */ maxMessages),\n/* harmony export */ obsolete: () => (/* binding */ obsolete),\n/* harmony export */ resetObsoleteCounter: () => (/* binding */ resetObsoleteCounter)\n/* harmony export */ });\n/* harmony import */ var _Flags__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Flags */ \"./Flags.ts\");\n/* harmony import */ var _Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Log */ \"./Util/Log.ts\");\n\n\nconst maxMessages = 5;\nconst obsoleteMessage = {};\nconst resetObsoleteCounter = () => {\n for (const message in obsoleteMessage) {\n obsoleteMessage[message] = 0;\n }\n};\nconst logMessage = (message, options) => {\n const suppressObsoleteMessages = _Flags__WEBPACK_IMPORTED_MODULE_0__.Flags.isEnabled('suppress-obsolete-message');\n if (obsoleteMessage[message] < maxMessages && !suppressObsoleteMessages) {\n _Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance().warn(message);\n // tslint:disable-next-line: no-console\n if (console.trace && options.showStackTrace) {\n // tslint:disable-next-line: no-console\n console.trace();\n }\n }\n obsoleteMessage[message]++;\n};\n/**\n * Obsolete decorator for marking Excalibur methods obsolete, you can optionally specify a custom message and/or alternate replacement\n * method do the deprecated one. Inspired by https://github.com/jayphelps/core-decorators.js\n */\nfunction obsolete(options) {\n options = {\n message: 'This feature will be removed in future versions of Excalibur.',\n alternateMethod: null,\n showStackTrace: false,\n ...options\n };\n return function (target, property, descriptor) {\n if (descriptor &&\n !(typeof descriptor.value === 'function' || typeof descriptor.get === 'function' || typeof descriptor.set === 'function')) {\n throw new SyntaxError('Only classes/functions/getters/setters can be marked as obsolete');\n }\n const methodSignature = `${target.name || ''}${target.name && property ? '.' : ''}${property ? property : ''}`;\n const message = `${methodSignature} is marked obsolete: ${options.message}` +\n (options.alternateMethod ? ` Use ${options.alternateMethod} instead` : '');\n if (!obsoleteMessage[message]) {\n obsoleteMessage[message] = 0;\n }\n // If descriptor is null it is a class\n const method = descriptor ? { ...descriptor } : target;\n if (!descriptor) {\n // with es2015 classes we need to change our decoration tactic\n class DecoratedClass extends method {\n constructor(...args) {\n logMessage(message, options);\n super(...args);\n }\n }\n return DecoratedClass;\n }\n if (descriptor && descriptor.value) {\n method.value = function () {\n logMessage(message, options);\n return descriptor.value.apply(this, arguments);\n };\n return method;\n }\n if (descriptor && descriptor.get) {\n method.get = function () {\n logMessage(message, options);\n return descriptor.get.apply(this, arguments);\n };\n }\n if (descriptor && descriptor.set) {\n method.set = function () {\n logMessage(message, options);\n return descriptor.set.apply(this, arguments);\n };\n }\n return method;\n };\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Detector.ts\":\n/*!**************************!*\\\n !*** ./Util/Detector.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Detector: () => (/* binding */ Detector)\n/* harmony export */ });\n/* harmony import */ var _Log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Log */ \"./Util/Log.ts\");\n\n/**\n * This is the list of features that will be used to log the supported\n * features to the console when Detector.logBrowserFeatures() is called.\n */\nconst REPORTED_FEATURES = {\n webgl: 'WebGL',\n webaudio: 'WebAudio',\n gamepadapi: 'Gamepad API'\n};\n/**\n * Excalibur internal feature detection helper class\n */\nclass Detector {\n constructor() {\n this._features = null;\n this.failedTests = [];\n // critical browser features required for ex to run\n this._criticalTests = {\n // Test canvas/2d context support\n canvasSupport: function () {\n const elem = document.createElement('canvas');\n return !!(elem.getContext && elem.getContext('2d'));\n },\n // Test array buffer support ex uses for downloading binary data\n arrayBufferSupport: function () {\n const xhr = new XMLHttpRequest();\n xhr.open('GET', '/');\n try {\n xhr.responseType = 'arraybuffer';\n }\n catch (e) {\n return false;\n }\n return xhr.responseType === 'arraybuffer';\n },\n // Test data urls ex uses for sprites\n dataUrlSupport: function () {\n const canvas = document.createElement('canvas');\n return canvas.toDataURL('image/png').indexOf('data:image/png') === 0;\n },\n // Test object url support for loading\n objectUrlSupport: function () {\n return 'URL' in window && 'revokeObjectURL' in URL && 'createObjectURL' in URL;\n },\n // RGBA support for colors\n rgbaSupport: function () {\n const style = document.createElement('a').style;\n style.cssText = 'background-color:rgba(150,255,150,.5)';\n return ('' + style.backgroundColor).indexOf('rgba') > -1;\n }\n };\n // warnings excalibur performance will be degraded\n this._warningTest = {\n webAudioSupport: function () {\n return !!(window.AudioContext ||\n window.webkitAudioContext ||\n window.mozAudioContext ||\n window.msAudioContext ||\n window.oAudioContext);\n },\n webglSupport: function () {\n const elem = document.createElement('canvas');\n return !!(elem.getContext && elem.getContext('webgl'));\n }\n };\n this._features = this._loadBrowserFeatures();\n }\n /**\n * Returns a map of currently supported browser features. This method\n * treats the features as a singleton and will only calculate feature\n * support if it has not previously been done.\n */\n getBrowserFeatures() {\n if (this._features === null) {\n this._features = this._loadBrowserFeatures();\n }\n return this._features;\n }\n /**\n * Report on non-critical browser support for debugging purposes.\n * Use native browser console colors for visibility.\n */\n logBrowserFeatures() {\n let msg = '%cSUPPORTED BROWSER FEATURES\\n==========================%c\\n';\n const args = ['font-weight: bold; color: navy', 'font-weight: normal; color: inherit'];\n const supported = this.getBrowserFeatures();\n for (const feature of Object.keys(REPORTED_FEATURES)) {\n if (supported[feature]) {\n msg += '(%c\\u2713%c)'; // (✓)\n args.push('font-weight: bold; color: green');\n args.push('font-weight: normal; color: inherit');\n }\n else {\n msg += '(%c\\u2717%c)'; // (✗)\n args.push('font-weight: bold; color: red');\n args.push('font-weight: normal; color: inherit');\n }\n msg += ' ' + REPORTED_FEATURES[feature] + '\\n';\n }\n args.unshift(msg);\n // eslint-disable-next-line no-console\n console.log.apply(console, args);\n }\n /**\n * Executes several IIFE's to get a constant reference to supported\n * features within the current execution context.\n */\n _loadBrowserFeatures() {\n return {\n // IIFE to check canvas support\n canvas: (() => {\n return this._criticalTests.canvasSupport();\n })(),\n // IIFE to check arraybuffer support\n arraybuffer: (() => {\n return this._criticalTests.arrayBufferSupport();\n })(),\n // IIFE to check dataurl support\n dataurl: (() => {\n return this._criticalTests.dataUrlSupport();\n })(),\n // IIFE to check objecturl support\n objecturl: (() => {\n return this._criticalTests.objectUrlSupport();\n })(),\n // IIFE to check rgba support\n rgba: (() => {\n return this._criticalTests.rgbaSupport();\n })(),\n // IIFE to check webaudio support\n webaudio: (() => {\n return this._warningTest.webAudioSupport();\n })(),\n // IIFE to check webgl support\n webgl: (() => {\n return this._warningTest.webglSupport();\n })(),\n // IIFE to check gamepadapi support\n gamepadapi: (() => {\n return !!navigator.getGamepads;\n })()\n };\n }\n test() {\n // Critical test will for ex not to run\n let failedCritical = false;\n for (const test in this._criticalTests) {\n if (!this._criticalTests[test].call(this)) {\n this.failedTests.push(test);\n _Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance().error('Critical browser feature missing, Excalibur requires:', test);\n failedCritical = true;\n }\n }\n if (failedCritical) {\n return false;\n }\n // Warning tests do not for ex to return false to compatibility\n for (const warning in this._warningTest) {\n if (!this._warningTest[warning]()) {\n _Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance().warn('Warning browser feature missing, Excalibur will have reduced performance:', warning);\n }\n }\n return true;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/DrawUtil.ts\":\n/*!**************************!*\\\n !*** ./Util/DrawUtil.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ circle: () => (/* binding */ circle),\n/* harmony export */ line: () => (/* binding */ line),\n/* harmony export */ point: () => (/* binding */ point),\n/* harmony export */ roundRect: () => (/* binding */ roundRect),\n/* harmony export */ vector: () => (/* binding */ vector)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n\n/* istanbul ignore next */\n/**\n * Draw a line on canvas context\n * @param ctx The canvas context\n * @param color The color of the line\n * @param x1 The start x coordinate\n * @param y1 The start y coordinate\n * @param x2 The ending x coordinate\n * @param y2 The ending y coordinate\n * @param thickness The line thickness\n * @param cap The {@apilink LineCapStyle} (butt, round, or square)\n */\nfunction line(ctx, color = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Red, x1, y1, x2, y2, thickness = 1, cap = 'butt') {\n ctx.save();\n ctx.beginPath();\n ctx.lineWidth = thickness;\n ctx.lineCap = cap;\n ctx.strokeStyle = color.toString();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.closePath();\n ctx.stroke();\n ctx.restore();\n}\n/* istanbul ignore next */\n/**\n * Draw the vector as a point onto the canvas.\n */\nfunction point(ctx, color = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Red, point) {\n ctx.beginPath();\n ctx.strokeStyle = color.toString();\n ctx.arc(point.x, point.y, 5, 0, Math.PI * 2);\n ctx.closePath();\n ctx.stroke();\n}\n/**\n * Draw the vector as a line onto the canvas starting a origin point.\n */\n/* istanbul ignore next */\n/**\n *\n */\nfunction vector(ctx, color, origin, vector, scale = 1.0) {\n const c = color ? color.toString() : 'blue';\n const v = vector.scale(scale);\n ctx.beginPath();\n ctx.strokeStyle = c;\n ctx.moveTo(origin.x, origin.y);\n ctx.lineTo(origin.x + v.x, origin.y + v.y);\n ctx.closePath();\n ctx.stroke();\n}\n/**\n * Draw a round rectangle on a canvas context\n * @param ctx The canvas context\n * @param x The top-left x coordinate\n * @param y The top-left y coordinate\n * @param width The width of the rectangle\n * @param height The height of the rectangle\n * @param radius The border radius of the rectangle\n * @param stroke The {@apilink Color} to stroke rectangle with\n * @param fill The {@apilink Color} to fill rectangle with\n */\nfunction roundRect(ctx, x, y, width, height, radius = 5, stroke = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.White, fill = null) {\n let br;\n if (typeof radius === 'number') {\n br = { tl: radius, tr: radius, br: radius, bl: radius };\n }\n else {\n const defaultRadius = { tl: 0, tr: 0, br: 0, bl: 0 };\n for (const prop in defaultRadius) {\n if (defaultRadius.hasOwnProperty(prop)) {\n const side = prop;\n br[side] = radius[side] || defaultRadius[side];\n }\n }\n }\n ctx.beginPath();\n ctx.moveTo(x + br.tl, y);\n ctx.lineTo(x + width - br.tr, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + br.tr);\n ctx.lineTo(x + width, y + height - br.br);\n ctx.quadraticCurveTo(x + width, y + height, x + width - br.br, y + height);\n ctx.lineTo(x + br.bl, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - br.bl);\n ctx.lineTo(x, y + br.tl);\n ctx.quadraticCurveTo(x, y, x + br.tl, y);\n ctx.closePath();\n if (fill) {\n ctx.fillStyle = fill.toString();\n ctx.fill();\n }\n if (stroke) {\n ctx.strokeStyle = stroke.toString();\n ctx.stroke();\n }\n}\n/**\n *\n */\nfunction circle(ctx, x, y, radius, stroke = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.White, fill = null) {\n ctx.beginPath();\n ctx.arc(x, y, radius, 0, Math.PI * 2);\n ctx.closePath();\n if (fill) {\n ctx.fillStyle = fill.toString();\n ctx.fill();\n }\n if (stroke) {\n ctx.strokeStyle = stroke.toString();\n ctx.stroke();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/EasingFunctions.ts\":\n/*!*********************************!*\\\n !*** ./Util/EasingFunctions.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EasingFunctions: () => (/* binding */ EasingFunctions)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n\n/**\n * Standard easing functions for motion in Excalibur, defined on a domain of [0, duration] and a range from [+startValue,+endValue]\n * Given a time, the function will return a value from positive startValue to positive endValue.\n *\n * ```js\n * function Linear (t) {\n * return t * t;\n * }\n *\n * // accelerating from zero velocity\n * function EaseInQuad (t) {\n * return t * t;\n * }\n *\n * // decelerating to zero velocity\n * function EaseOutQuad (t) {\n * return t * (2 - t);\n * }\n *\n * // acceleration until halfway, then deceleration\n * function EaseInOutQuad (t) {\n * return t < .5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n * }\n *\n * // accelerating from zero velocity\n * function EaseInCubic (t) {\n * return t * t * t;\n * }\n *\n * // decelerating to zero velocity\n * function EaseOutCubic (t) {\n * return (--t) * t * t + 1;\n * }\n *\n * // acceleration until halfway, then deceleration\n * function EaseInOutCubic (t) {\n * return t < .5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1;\n * }\n * ```\n */\nclass EasingFunctions {\n static CreateReversibleEasingFunction(easing) {\n return (time, start, end, duration) => {\n if (end < start) {\n return start - (easing(time, end, start, duration) - end);\n }\n else {\n return easing(time, start, end, duration);\n }\n };\n }\n static CreateVectorEasingFunction(easing) {\n return (time, start, end, duration) => {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(easing(time, start.x, end.x, duration), easing(time, start.y, end.y, duration));\n };\n }\n}\nEasingFunctions.Linear = EasingFunctions.CreateReversibleEasingFunction((currentTime, startValue, endValue, duration) => {\n endValue = endValue - startValue;\n return (endValue * currentTime) / duration + startValue;\n});\nEasingFunctions.EaseInQuad = EasingFunctions.CreateReversibleEasingFunction((currentTime, startValue, endValue, duration) => {\n endValue = endValue - startValue;\n currentTime /= duration;\n return endValue * currentTime * currentTime + startValue;\n});\nEasingFunctions.EaseOutQuad = EasingFunctions.CreateReversibleEasingFunction((currentTime, startValue, endValue, duration) => {\n endValue = endValue - startValue;\n currentTime /= duration;\n return -endValue * currentTime * (currentTime - 2) + startValue;\n});\nEasingFunctions.EaseInOutQuad = EasingFunctions.CreateReversibleEasingFunction((currentTime, startValue, endValue, duration) => {\n endValue = endValue - startValue;\n currentTime /= duration / 2;\n if (currentTime < 1) {\n return (endValue / 2) * currentTime * currentTime + startValue;\n }\n currentTime--;\n return (-endValue / 2) * (currentTime * (currentTime - 2) - 1) + startValue;\n});\nEasingFunctions.EaseInCubic = EasingFunctions.CreateReversibleEasingFunction((currentTime, startValue, endValue, duration) => {\n endValue = endValue - startValue;\n currentTime /= duration;\n return endValue * currentTime * currentTime * currentTime + startValue;\n});\nEasingFunctions.EaseOutCubic = EasingFunctions.CreateReversibleEasingFunction((currentTime, startValue, endValue, duration) => {\n endValue = endValue - startValue;\n currentTime /= duration;\n currentTime--;\n return endValue * (currentTime * currentTime * currentTime + 1) + startValue;\n});\nEasingFunctions.EaseInOutCubic = EasingFunctions.CreateReversibleEasingFunction((currentTime, startValue, endValue, duration) => {\n endValue = endValue - startValue;\n currentTime /= duration / 2;\n if (currentTime < 1) {\n return (endValue / 2) * currentTime * currentTime * currentTime + startValue;\n }\n currentTime -= 2;\n return (endValue / 2) * (currentTime * currentTime * currentTime + 2) + startValue;\n});\n\n\n/***/ }),\n\n/***/ \"./Util/Fps.ts\":\n/*!*********************!*\\\n !*** ./Util/Fps.ts ***!\n \\*********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FpsSampler: () => (/* binding */ FpsSampler)\n/* harmony export */ });\nclass FpsSampler {\n constructor(options) {\n var _a;\n this._samplePeriod = 100;\n this._currentFrameTime = 0;\n this._frames = 0;\n this._previousSampleTime = 0;\n this._beginFrameTime = 0;\n this._fps = options.initialFps;\n this._samplePeriod = (_a = options.samplePeriod) !== null && _a !== void 0 ? _a : this._samplePeriod;\n this._currentFrameTime = 1000 / options.initialFps;\n this._nowFn = options.nowFn;\n this._previousSampleTime = this._nowFn();\n }\n /**\n * Start of code block to sample FPS for\n */\n start() {\n this._beginFrameTime = this._nowFn();\n }\n /**\n * End of code block to sample FPS for\n */\n end() {\n this._frames++;\n const time = this._nowFn();\n this._currentFrameTime = time - this._beginFrameTime;\n if (time >= this._previousSampleTime + this._samplePeriod) {\n this._fps = (this._frames * 1000) / (time - this._previousSampleTime);\n this._previousSampleTime = time;\n this._frames = 0;\n }\n }\n /**\n * Return the currently sampled fps over the last sample period, by default every 100ms\n */\n get fps() {\n return this._fps;\n }\n /**\n * Return the instantaneous fps, this can be less useful because it will fluctuate given the current frames time\n */\n get instant() {\n return 1000 / this._currentFrameTime;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Future.ts\":\n/*!************************!*\\\n !*** ./Util/Future.ts ***!\n \\************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Future: () => (/* binding */ Future)\n/* harmony export */ });\n/**\n * Future is a wrapper around a native browser Promise to allow resolving/rejecting at any time\n */\nclass Future {\n constructor() {\n this._isCompleted = false;\n this.promise = new Promise((resolve, reject) => {\n this._resolver = resolve;\n this._rejecter = reject;\n });\n }\n get isCompleted() {\n return this._isCompleted;\n }\n resolve(value) {\n if (this._isCompleted) {\n return;\n }\n this._isCompleted = true;\n this._resolver(value);\n }\n reject(error) {\n if (this._isCompleted) {\n return;\n }\n this._isCompleted = true;\n this._rejecter(error);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/IFrame.ts\":\n/*!************************!*\\\n !*** ./Util/IFrame.ts ***!\n \\************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ isCrossOriginIframe: () => (/* binding */ isCrossOriginIframe)\n/* harmony export */ });\n/**\n * Checks if excalibur is in a x-origin iframe\n */\nfunction isCrossOriginIframe() {\n try {\n // Try and listen to events on top window frame if within an iframe.\n //\n // See https://github.com/excaliburjs/Excalibur/issues/1294\n //\n // Attempt to add an event listener, which triggers a DOMException on\n // cross-origin iframes\n const noop = () => {\n return;\n };\n window.top.addEventListener('blur', noop);\n window.top.removeEventListener('blur', noop);\n }\n catch (_a) {\n return true;\n }\n return false;\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Index.ts\":\n/*!***********************!*\\\n !*** ./Util/Index.ts ***!\n \\***********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ConsoleAppender: () => (/* reexport safe */ _Log__WEBPACK_IMPORTED_MODULE_1__.ConsoleAppender),\n/* harmony export */ DrawUtil: () => (/* reexport module object */ _DrawUtil__WEBPACK_IMPORTED_MODULE_4__),\n/* harmony export */ EasingFunctions: () => (/* reexport safe */ _EasingFunctions__WEBPACK_IMPORTED_MODULE_3__.EasingFunctions),\n/* harmony export */ LogLevel: () => (/* reexport safe */ _Log__WEBPACK_IMPORTED_MODULE_1__.LogLevel),\n/* harmony export */ Logger: () => (/* reexport safe */ _Log__WEBPACK_IMPORTED_MODULE_1__.Logger),\n/* harmony export */ Observable: () => (/* reexport safe */ _Observable__WEBPACK_IMPORTED_MODULE_2__.Observable),\n/* harmony export */ ScreenAppender: () => (/* reexport safe */ _Log__WEBPACK_IMPORTED_MODULE_1__.ScreenAppender),\n/* harmony export */ addItemToArray: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.addItemToArray),\n/* harmony export */ contains: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.contains),\n/* harmony export */ delay: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.delay),\n/* harmony export */ fail: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.fail),\n/* harmony export */ getPosition: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.getPosition),\n/* harmony export */ isObject: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.isObject),\n/* harmony export */ mergeDeep: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.mergeDeep),\n/* harmony export */ omit: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.omit),\n/* harmony export */ removeItemFromArray: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.removeItemFromArray)\n/* harmony export */ });\n/* harmony import */ var _Util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Util */ \"./Util/Util.ts\");\n/* harmony import */ var _Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Observable */ \"./Util/Observable.ts\");\n/* harmony import */ var _EasingFunctions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./EasingFunctions */ \"./Util/EasingFunctions.ts\");\n/* harmony import */ var _DrawUtil__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./DrawUtil */ \"./Util/DrawUtil.ts\");\n\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Util/Log.ts\":\n/*!*********************!*\\\n !*** ./Util/Log.ts ***!\n \\*********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ConsoleAppender: () => (/* binding */ ConsoleAppender),\n/* harmony export */ LogLevel: () => (/* binding */ LogLevel),\n/* harmony export */ Logger: () => (/* binding */ Logger),\n/* harmony export */ ScreenAppender: () => (/* binding */ ScreenAppender)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* eslint-disable no-console */\n\n\n/**\n * Logging level that Excalibur will tag\n */\nvar LogLevel;\n(function (LogLevel) {\n LogLevel[LogLevel[\"Debug\"] = 0] = \"Debug\";\n LogLevel[LogLevel[\"Info\"] = 1] = \"Info\";\n LogLevel[LogLevel[\"Warn\"] = 2] = \"Warn\";\n LogLevel[LogLevel[\"Error\"] = 3] = \"Error\";\n LogLevel[LogLevel[\"Fatal\"] = 4] = \"Fatal\";\n})(LogLevel || (LogLevel = {}));\n/**\n * Static singleton that represents the logging facility for Excalibur.\n * Excalibur comes built-in with a {@apilink ConsoleAppender} and {@apilink ScreenAppender}.\n * Derive from {@apilink Appender} to create your own logging appenders.\n */\nclass Logger {\n constructor() {\n this._appenders = [];\n /**\n * Gets or sets the default logging level. Excalibur will only log\n * messages if equal to or above this level. Default: {@apilink LogLevel.Info}\n */\n this.defaultLevel = LogLevel.Info;\n this._logOnceSet = new Set();\n if (Logger._INSTANCE) {\n throw new Error('Logger is a singleton');\n }\n Logger._INSTANCE = this;\n // Default console appender\n Logger._INSTANCE.addAppender(new ConsoleAppender());\n return Logger._INSTANCE;\n }\n /**\n * Gets the current static instance of Logger\n */\n static getInstance() {\n if (Logger._INSTANCE == null) {\n Logger._INSTANCE = new Logger();\n }\n return Logger._INSTANCE;\n }\n /**\n * Adds a new {@apilink Appender} to the list of appenders to write to\n */\n addAppender(appender) {\n this._appenders.push(appender);\n }\n /**\n * Clears all appenders from the logger\n */\n clearAppenders() {\n this._appenders.length = 0;\n }\n /**\n * Logs a message at a given LogLevel\n * @param level The LogLevel`to log the message at\n * @param args An array of arguments to write to an appender\n */\n _log(level, args) {\n if (level == null) {\n level = this.defaultLevel;\n }\n const len = this._appenders.length;\n for (let i = 0; i < len; i++) {\n if (level >= this.defaultLevel) {\n this._appenders[i].log(level, args);\n }\n }\n }\n _logOnce(level, args) {\n const serialized = level + args.join('+');\n if (this._logOnceSet.has(serialized)) {\n return;\n }\n else {\n this._logOnceSet.add(serialized);\n this._log(level, args);\n }\n }\n /**\n * Writes a log message at the {@apilink LogLevel.Debug} level\n * @param args Accepts any number of arguments\n */\n debug(...args) {\n this._log(LogLevel.Debug, args);\n }\n /**\n * Writes a log message once at the {@apilink LogLevel.Fatal} level, if it sees the same args again it wont log\n * @param args Accepts any number of arguments\n */\n debugOnce(...args) {\n this._logOnce(LogLevel.Debug, args);\n }\n /**\n * Writes a log message at the {@apilink LogLevel.Info} level\n * @param args Accepts any number of arguments\n */\n info(...args) {\n this._log(LogLevel.Info, args);\n }\n /**\n * Writes a log message once at the {@apilink LogLevel.Info} level, if it sees the same args again it wont log\n * @param args Accepts any number of arguments\n */\n infoOnce(...args) {\n this._logOnce(LogLevel.Info, args);\n }\n /**\n * Writes a log message at the {@apilink LogLevel.Warn} level\n * @param args Accepts any number of arguments\n */\n warn(...args) {\n this._log(LogLevel.Warn, args);\n }\n /**\n * Writes a log message once at the {@apilink LogLevel.Warn} level, if it sees the same args again it won't log\n * @param args Accepts any number of arguments\n */\n warnOnce(...args) {\n this._logOnce(LogLevel.Warn, args);\n }\n /**\n * Writes a log message at the {@apilink LogLevel.Error} level\n * @param args Accepts any number of arguments\n */\n error(...args) {\n this._log(LogLevel.Error, args);\n }\n /**\n * Writes a log message once at the {@apilink LogLevel.Error} level, if it sees the same args again it won't log\n * @param args Accepts any number of arguments\n */\n errorOnce(...args) {\n this._logOnce(LogLevel.Error, args);\n }\n /**\n * Writes a log message at the {@apilink LogLevel.Fatal} level\n * @param args Accepts any number of arguments\n */\n fatal(...args) {\n this._log(LogLevel.Fatal, args);\n }\n /**\n * Writes a log message once at the {@apilink LogLevel.Fatal} level, if it sees the same args again it won't log\n * @param args Accepts any number of arguments\n */\n fatalOnce(...args) {\n this._logOnce(LogLevel.Fatal, args);\n }\n}\nLogger._INSTANCE = null;\n/**\n * Console appender for browsers (i.e. `console.log`)\n */\nclass ConsoleAppender {\n /**\n * Logs a message at the given {@apilink LogLevel}\n * @param level Level to log at\n * @param args Arguments to log\n */\n log(level, args) {\n // Check for console support\n if (!console && !console.log && console.warn && console.error) {\n // todo maybe do something better than nothing\n return;\n }\n // Create a new console args array\n const consoleArgs = [];\n consoleArgs.unshift.apply(consoleArgs, args);\n consoleArgs.unshift('[' + LogLevel[level] + '] : ');\n if (level < LogLevel.Warn) {\n // Call .log for Debug/Info\n if (console.log.apply) {\n // this is required on some older browsers that don't support apply on console.log :(\n console.log.apply(console, consoleArgs);\n }\n else {\n console.log(consoleArgs.join(' '));\n }\n }\n else if (level < LogLevel.Error) {\n // Call .warn for Warn\n if (console.warn.apply) {\n console.warn.apply(console, consoleArgs);\n }\n else {\n console.warn(consoleArgs.join(' '));\n }\n }\n else {\n // Call .error for Error/Fatal\n if (console.error.apply) {\n console.error.apply(console, consoleArgs);\n }\n else {\n console.error(consoleArgs.join(' '));\n }\n }\n }\n}\n/**\n * On-screen (canvas) appender\n */\nclass ScreenAppender {\n constructor(options) {\n var _a, _b;\n this._messages = [];\n this._pos = 10;\n this._color = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Black;\n this._options = options;\n this.canvas = document.createElement('canvas');\n this._ctx = this.canvas.getContext('2d');\n this.canvas.style.position = 'absolute';\n this.canvas.style.zIndex = (_b = (_a = options.zIndex) === null || _a === void 0 ? void 0 : _a.toString()) !== null && _b !== void 0 ? _b : '99';\n document.body.appendChild(this.canvas);\n this._positionScreenAppenderCanvas();\n options.engine.screen.events.on('resize', () => {\n this._positionScreenAppenderCanvas();\n });\n }\n _positionScreenAppenderCanvas() {\n var _a, _b, _c, _d;\n const options = this._options;\n this.canvas.width = (_a = options.width) !== null && _a !== void 0 ? _a : options.engine.screen.resolution.width;\n this.canvas.height = (_b = options.height) !== null && _b !== void 0 ? _b : options.engine.screen.resolution.height;\n this.canvas.style.position = 'absolute';\n const pagePos = options.engine.screen.screenToPageCoordinates((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0));\n this.canvas.style.left = pagePos.x + 'px';\n this.canvas.style.top = pagePos.y + 'px';\n this._pos = (_c = options.xPos) !== null && _c !== void 0 ? _c : this._pos;\n this._color = (_d = options.color) !== null && _d !== void 0 ? _d : this._color;\n }\n /**\n * Logs a message at the given {@apilink LogLevel}\n * @param level Level to log at\n * @param args Arguments to log\n */\n log(level, args) {\n const message = args.join(',');\n this._ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n this._messages.unshift('[' + LogLevel[level] + '] : ' + message);\n let pos = 10;\n this._messages = this._messages.slice(0, 1000);\n for (let i = 0; i < this._messages.length; i++) {\n this._ctx.fillStyle = this._color.toRGBA();\n this._ctx.fillText(this._messages[i], this._pos, pos);\n pos += 10;\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Observable.ts\":\n/*!****************************!*\\\n !*** ./Util/Observable.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Observable: () => (/* binding */ Observable)\n/* harmony export */ });\n/**\n * Simple Observable implementation\n * @template T is the typescript Type that defines the data being observed\n */\nclass Observable {\n constructor() {\n this.observers = [];\n this.subscriptions = [];\n }\n /**\n * Register an observer to listen to this observable\n * @param observer\n */\n register(observer) {\n this.observers.push(observer);\n }\n /**\n * Register a callback to listen to this observable\n * @param func\n */\n subscribe(func) {\n this.subscriptions.push(func);\n }\n /**\n * Remove an observer from the observable\n * @param observer\n */\n unregister(observer) {\n const i = this.observers.indexOf(observer);\n if (i !== -1) {\n this.observers.splice(i, 1);\n }\n }\n /**\n * Remove a callback that is listening to this observable\n * @param func\n */\n unsubscribe(func) {\n const i = this.subscriptions.indexOf(func);\n if (i !== -1) {\n this.subscriptions.splice(i, 1);\n }\n }\n /**\n * Broadcasts a message to all observers and callbacks\n * @param message\n */\n notifyAll(message) {\n const observersLength = this.observers.length;\n for (let i = 0; i < observersLength; i++) {\n this.observers[i].notify(message);\n }\n const subscriptionsLength = this.subscriptions.length;\n for (let i = 0; i < subscriptionsLength; i++) {\n this.subscriptions[i](message);\n }\n }\n /**\n * Removes all observers and callbacks\n */\n clear() {\n this.observers.length = 0;\n this.subscriptions.length = 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Pool.ts\":\n/*!**********************!*\\\n !*** ./Util/Pool.ts ***!\n \\**********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Pool: () => (/* binding */ Pool)\n/* harmony export */ });\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n\nclass Pool {\n constructor(builder, recycler, maxObjects = 100) {\n this.builder = builder;\n this.recycler = recycler;\n this.maxObjects = maxObjects;\n this.totalAllocations = 0;\n this.index = 0;\n this.objects = [];\n this.disableWarnings = false;\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance();\n }\n dispose() {\n this.objects.length = 0;\n }\n preallocate() {\n for (let i = 0; i < this.maxObjects; i++) {\n this.objects[i] = this.builder();\n }\n }\n /**\n * Use many instances out of the in the context and return all to the pool.\n *\n * By returning values out of the context they will be un-hooked from the pool and are free to be passed to consumers\n * @param context\n */\n using(context) {\n const result = context(this);\n if (result) {\n return this.done(...result);\n }\n return this.done();\n }\n /**\n * Use a single instance out of th pool and immediately return it to the pool\n * @param context\n */\n borrow(context) {\n const object = this.get();\n context(object);\n this.index--;\n }\n /**\n * Retrieve a value from the pool, will allocate a new instance if necessary or recycle from the pool\n */\n get() {\n if (this.index === this.maxObjects) {\n if (!this.disableWarnings) {\n this._logger.warn('Max pooled objects reached, possible memory leak? Doubling');\n }\n this.maxObjects = this.maxObjects * 2;\n }\n if (this.objects[this.index]) {\n // Pool has an available object already constructed\n if (this.recycler) {\n return this.recycler(this.objects[this.index++]);\n }\n return this.objects[this.index++];\n }\n else {\n // New allocation\n this.totalAllocations++;\n const object = (this.objects[this.index++] = this.builder());\n return object;\n }\n }\n done(...objects) {\n // All objects in pool now considered \"free\"\n this.index = 0;\n for (const object of objects) {\n const poolIndex = this.objects.indexOf(object);\n // Build a new object to take the pool place\n this.objects[poolIndex] = this.builder();\n this.totalAllocations++;\n }\n return objects;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/RentalPool.ts\":\n/*!****************************!*\\\n !*** ./Util/RentalPool.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RentalPool: () => (/* binding */ RentalPool)\n/* harmony export */ });\nclass RentalPool {\n constructor(builder, cleaner, preAllocate = 1) {\n this.builder = builder;\n this.cleaner = cleaner;\n this._pool = [];\n this._size = 0;\n this.grow(preAllocate);\n }\n /**\n * Grow the pool size by an amount\n * @param amount\n */\n grow(amount) {\n if (amount > 0) {\n this._size += amount;\n for (let i = 0; i < amount; i++) {\n this._pool.push(this.builder());\n }\n }\n }\n /**\n * Rent an object from the pool, optionally clean it. If not cleaned previous state may be set.\n *\n * The pool will automatically double if depleted\n * @param clean\n */\n rent(clean = false) {\n if (this._pool.length === 0) {\n this.grow(this._size);\n }\n return clean ? this.cleaner(this._pool.pop()) : this._pool.pop();\n }\n /**\n * Return an object to the pool\n * @param object\n */\n return(object) {\n this._pool.push(object);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Semaphore.ts\":\n/*!***************************!*\\\n !*** ./Util/Semaphore.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Semaphore: () => (/* binding */ Semaphore)\n/* harmony export */ });\n/* harmony import */ var _Future__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Future */ \"./Util/Future.ts\");\n\nclass AsyncWaitQueue {\n constructor() {\n // Code from StephenCleary https://gist.github.com/StephenCleary/ba50b2da419c03b9cba1d20cb4654d5e\n this._queue = [];\n }\n get length() {\n return this._queue.length;\n }\n enqueue() {\n const future = new _Future__WEBPACK_IMPORTED_MODULE_0__.Future();\n this._queue.push(future);\n return future.promise;\n }\n dequeue(value) {\n const future = this._queue.shift();\n future.resolve(value);\n }\n}\n/**\n * Semaphore allows you to limit the amount of async calls happening between `enter()` and `exit()`\n *\n * This can be useful when limiting the number of http calls, browser api calls, etc either for performance or to work\n * around browser limitations like max Image.decode() calls in chromium being 256.\n */\nclass Semaphore {\n constructor(_count) {\n this._count = _count;\n this._waitQueue = new AsyncWaitQueue();\n }\n get count() {\n return this._count;\n }\n get waiting() {\n return this._waitQueue.length;\n }\n // eslint-disable-next-line require-await\n async enter() {\n if (this._count !== 0) {\n this._count--;\n return Promise.resolve();\n }\n return this._waitQueue.enqueue();\n }\n exit(count = 1) {\n if (count === 0) {\n return;\n }\n while (count !== 0 && this._waitQueue.length !== 0) {\n this._waitQueue.dequeue(null);\n count--;\n }\n this._count += count;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Sound.ts\":\n/*!***********************!*\\\n !*** ./Util/Sound.ts ***!\n \\***********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ canPlayFile: () => (/* binding */ canPlayFile)\n/* harmony export */ });\n/* harmony import */ var _Log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Log */ \"./Util/Log.ts\");\n\n/**\n * Whether or not the browser can play this file as HTML5 Audio\n */\nfunction canPlayFile(file) {\n try {\n const a = new Audio();\n const filetype = /.*\\.([A-Za-z0-9]+)(?:(?:\\?|\\#).*)*$/;\n const type = file.match(filetype)[1];\n if (a.canPlayType('audio/' + type)) {\n return true;\n }\n else {\n return false;\n }\n }\n catch (e) {\n _Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance().warn('Cannot determine audio support, assuming no support for the Audio Tag', e);\n return false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/StateMachine.ts\":\n/*!******************************!*\\\n !*** ./Util/StateMachine.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ StateMachine: () => (/* binding */ StateMachine)\n/* harmony export */ });\nclass StateMachine {\n constructor() {\n this.states = new Map();\n }\n get currentState() {\n return this._currentState;\n }\n set currentState(state) {\n this._currentState = state;\n }\n static create(machineDescription, data) {\n const machine = new StateMachine();\n machine.data = data;\n for (const stateName in machineDescription.states) {\n machine.states.set(stateName, {\n name: stateName,\n ...machineDescription.states[stateName]\n });\n }\n // validate transitions are states\n for (const state of machine.states.values()) {\n for (const transitionState of state.transitions) {\n if (transitionState === '*') {\n continue;\n }\n if (!machine.states.has(transitionState)) {\n throw Error(`Invalid state machine, state [${state.name}] has a transition to another state that doesn't exist [${transitionState}]`);\n }\n }\n }\n machine.currentState = machine.startState = machine.states.get(machineDescription.start);\n return machine;\n }\n in(state) {\n return this.currentState.name === state;\n }\n go(stateName, eventData) {\n var _a, _b;\n if (this.currentState.transitions.includes(stateName) || this.currentState.transitions.includes('*')) {\n const potentialNewState = this.states.get(stateName);\n if (this.currentState.onExit) {\n const canExit = (_a = this.currentState) === null || _a === void 0 ? void 0 : _a.onExit({ to: potentialNewState.name, data: this.data });\n if (canExit === false) {\n return false;\n }\n }\n if (potentialNewState === null || potentialNewState === void 0 ? void 0 : potentialNewState.onEnter) {\n const canEnter = potentialNewState === null || potentialNewState === void 0 ? void 0 : potentialNewState.onEnter({ from: this.currentState.name, eventData, data: this.data });\n if (canEnter === false) {\n return false;\n }\n }\n this.currentState = potentialNewState;\n if ((_b = this.currentState) === null || _b === void 0 ? void 0 : _b.onState) {\n this.currentState.onState();\n }\n return true;\n }\n return false;\n }\n update(elapsed) {\n if (this.currentState.onUpdate) {\n this.currentState.onUpdate(this.data, elapsed);\n }\n }\n save(saveKey) {\n localStorage.setItem(saveKey, JSON.stringify({\n currentState: this.currentState.name,\n data: this.data\n }));\n }\n restore(saveKey) {\n const state = JSON.parse(localStorage.getItem(saveKey));\n this.currentState = this.states.get(state.currentState);\n this.data = state.data;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Toaster.ts\":\n/*!*************************!*\\\n !*** ./Util/Toaster.ts ***!\n \\*************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Toaster: () => (/* binding */ Toaster)\n/* harmony export */ });\n/* harmony import */ var _Toaster_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Toaster.css */ \"./Util/Toaster.css\");\n\n/**\n * The Toaster is only meant to be called from inside Excalibur to display messages to players\n */\nclass Toaster {\n constructor() {\n this._toasterCss = _Toaster_css__WEBPACK_IMPORTED_MODULE_0__[\"default\"].toString();\n this._isInitialized = false;\n }\n _initialize() {\n if (!this._isInitialized) {\n this._container = document.createElement('div');\n this._container.id = 'ex-toast-container';\n document.body.appendChild(this._container);\n this._isInitialized = true;\n this._styleBlock = document.createElement('style');\n this._styleBlock.textContent = this._toasterCss;\n document.head.appendChild(this._styleBlock);\n }\n }\n dispose() {\n this._container.parentElement.removeChild(this._container);\n this._styleBlock.parentElement.removeChild(this._styleBlock);\n this._isInitialized = false;\n }\n _createFragment(message) {\n const toastMessage = document.createElement('span');\n toastMessage.innerText = message;\n return toastMessage;\n }\n /**\n * Display a toast message to a player\n * @param message Text of the message, messages may have a single \"[LINK]\" to influence placement\n * @param linkTarget Optionally specify a link location\n * @param linkName Optionally specify a name for that link location\n */\n toast(message, linkTarget, linkName) {\n this._initialize();\n const toast = document.createElement('div');\n toast.className = 'ex-toast-message';\n const messageFragments = message.split('[LINK]').map((message) => this._createFragment(message));\n if (linkTarget) {\n const link = document.createElement('a');\n link.href = linkTarget;\n if (linkName) {\n link.innerText = linkName;\n }\n else {\n link.innerText = linkTarget;\n }\n messageFragments.splice(1, 0, link);\n }\n // Assembly message\n const finalMessage = document.createElement('div');\n messageFragments.forEach((message) => {\n finalMessage.appendChild(message);\n });\n toast.appendChild(finalMessage);\n // Dismiss button\n const dismissBtn = document.createElement('button');\n dismissBtn.innerText = 'x';\n dismissBtn.addEventListener('click', () => {\n this._container.removeChild(toast);\n });\n toast.appendChild(dismissBtn);\n // Escape to dismiss\n const keydownHandler = (evt) => {\n if (evt.key === 'Escape') {\n try {\n this._container.removeChild(toast);\n }\n catch (_a) {\n // pass\n }\n }\n document.removeEventListener('keydown', keydownHandler);\n };\n document.addEventListener('keydown', keydownHandler);\n // Insert into container\n const first = this._container.firstChild;\n this._container.insertBefore(toast, first);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Util.ts\":\n/*!**********************!*\\\n !*** ./Util/Util.ts ***!\n \\**********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ addItemToArray: () => (/* binding */ addItemToArray),\n/* harmony export */ contains: () => (/* binding */ contains),\n/* harmony export */ delay: () => (/* binding */ delay),\n/* harmony export */ fail: () => (/* binding */ fail),\n/* harmony export */ getPosition: () => (/* binding */ getPosition),\n/* harmony export */ isObject: () => (/* binding */ isObject),\n/* harmony export */ mergeDeep: () => (/* binding */ mergeDeep),\n/* harmony export */ omit: () => (/* binding */ omit),\n/* harmony export */ removeItemFromArray: () => (/* binding */ removeItemFromArray)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Future__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Future */ \"./Util/Future.ts\");\n\n\n/**\n * Find the screen position of an HTML element\n */\nfunction getPosition(el) {\n // do we need the scroll too? technically the offset method before did that\n if (el && el.getBoundingClientRect) {\n const rect = el.getBoundingClientRect();\n return (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(rect.x + window.scrollX, rect.y + window.scrollY);\n }\n return _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero;\n}\n/**\n * Add an item to an array list if it doesn't already exist. Returns true if added, false if not and already exists in the array.\n * @deprecated Will be removed in v0.26.0\n */\nfunction addItemToArray(item, array) {\n if (array.indexOf(item) === -1) {\n array.push(item);\n return true;\n }\n return false;\n}\n/**\n * Remove an item from an list\n * @deprecated Will be removed in v0.26.0\n */\nfunction removeItemFromArray(item, array) {\n let index = -1;\n if ((index = array.indexOf(item)) > -1) {\n array.splice(index, 1);\n return true;\n }\n return false;\n}\n/**\n * See if an array contains something\n */\nfunction contains(array, obj) {\n for (let i = 0; i < array.length; i++) {\n if (array[i] === obj) {\n return true;\n }\n }\n return false;\n}\n/**\n * Used for exhaustive checks at compile time\n */\nfunction fail(message) {\n throw new Error(message);\n}\n/**\n * Create a promise that resolves after a certain number of milliseconds\n *\n * It is strongly recommended you pass the excalibur clock so delays are bound to the\n * excalibur clock which would be unaffected by stop/pause.\n * @param milliseconds\n * @param clock\n */\nfunction delay(milliseconds, clock) {\n var _a;\n const future = new _Future__WEBPACK_IMPORTED_MODULE_1__.Future();\n const schedule = (_a = clock === null || clock === void 0 ? void 0 : clock.schedule.bind(clock)) !== null && _a !== void 0 ? _a : setTimeout;\n schedule(() => {\n future.resolve();\n }, milliseconds);\n return future.promise;\n}\n/**\n * Remove keys from object literals\n * @param object\n * @param keys\n */\nfunction omit(object, keys) {\n const newObj = {};\n for (const key in object) {\n if (!keys.includes(key)) {\n newObj[key] = object[key];\n }\n }\n return newObj;\n}\n/**\n * Simple object check.\n * @param item\n */\nfunction isObject(item) {\n return item && typeof item === 'object' && !Array.isArray(item);\n}\n/**\n * Deep merge two objects.\n * @param target\n * @param sources\n */\nfunction mergeDeep(target, ...sources) {\n if (!sources.length) {\n return target;\n }\n const source = sources.shift();\n if (isObject(target) && isObject(source)) {\n for (const key in source) {\n if (isObject(source[key])) {\n if (!target[key]) {\n Object.assign(target, { [key]: {} });\n }\n mergeDeep(target[key], source[key]);\n }\n else {\n Object.assign(target, { [key]: source[key] });\n }\n }\n }\n return mergeDeep(target, ...sources);\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Watch.ts\":\n/*!***********************!*\\\n !*** ./Util/Watch.ts ***!\n \\***********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ watch: () => (/* binding */ watch),\n/* harmony export */ watchAny: () => (/* binding */ watchAny),\n/* harmony export */ watchDeep: () => (/* binding */ watchDeep)\n/* harmony export */ });\n/**\n * Watch an object with a proxy, only fires if property value is different\n */\nfunction watch(type, change) {\n if (!type) {\n return type;\n }\n if (type.__isProxy === undefined) {\n // expando hack to mark a proxy\n return new Proxy(type, {\n set: (obj, prop, value) => {\n // The default behavior to store the value\n if (obj[prop] !== value) {\n obj[prop] = value;\n // Avoid watching private junk\n if (typeof prop === 'string') {\n if (prop[0] !== '_') {\n change(obj);\n }\n }\n }\n // Indicate success\n return true;\n },\n get: (obj, prop) => {\n if (prop !== '__isProxy') {\n return obj[prop];\n }\n return true;\n }\n });\n }\n return type;\n}\nconst createHandler = (path = [], change, typeType) => ({\n get: (target, key) => {\n if (key === '__isProxy') {\n return true;\n }\n if (typeof target[key] === 'object' && target[key] != null) {\n return new Proxy(target[key], createHandler([...path, key], change, typeType));\n }\n return target[key];\n },\n set: (target, key, value) => {\n if (typeof key === 'string') {\n if (key[0] !== '_') {\n change(typeType);\n }\n }\n target[key] = value;\n return true;\n }\n});\n/**\n *\n */\nfunction watchDeep(type, change) {\n if (!type) {\n return type;\n }\n if (type.__isProxy === undefined) {\n // expando hack to mark a proxy\n return new Proxy(type, createHandler([], change, type));\n }\n return type;\n}\n/**\n * Watch an object with a proxy, fires change on any property value change\n */\nfunction watchAny(type, change) {\n if (!type) {\n return type;\n }\n if (type.__isProxy === undefined) {\n // expando hack to mark a proxy\n return new Proxy(type, {\n set: (obj, prop, value) => {\n // The default behavior to store the value\n obj[prop] = value;\n // Avoid watching private junk\n if (typeof prop === 'string') {\n if (prop[0] !== '_') {\n change(obj);\n }\n }\n // Indicate success\n return true;\n },\n get: (obj, prop) => {\n if (prop !== '__isProxy') {\n return obj[prop];\n }\n return true;\n }\n });\n }\n return type;\n}\n\n\n/***/ }),\n\n/***/ \"./Util/WebAudio.ts\":\n/*!**************************!*\\\n !*** ./Util/WebAudio.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ WebAudio: () => (/* binding */ WebAudio)\n/* harmony export */ });\n/* harmony import */ var _Resources_Sound_AudioContext__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Resources/Sound/AudioContext */ \"./Resources/Sound/AudioContext.ts\");\n/* harmony import */ var _Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Log */ \"./Util/Log.ts\");\n\n\n/**\n * Patch for detecting legacy web audio in browsers\n * @internal\n * @param source\n */\nfunction isLegacyWebAudioSource(source) {\n return !!source.playbackState;\n}\nclass WebAudio {\n /**\n * Play an empty sound to unlock Safari WebAudio context. Call this function\n * right after a user interaction event.\n * @source https://paulbakaus.com/tutorials/html5/web-audio-on-ios/\n */\n static unlock() {\n const promise = new Promise((resolve, reject) => {\n if (WebAudio._UNLOCKED || !_Resources_Sound_AudioContext__WEBPACK_IMPORTED_MODULE_0__.AudioContextFactory.create()) {\n return resolve(true);\n }\n const unlockTimeoutTimer = setTimeout(() => {\n _Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance().warn('Excalibur was unable to unlock the audio context, audio probably will not play in this browser.');\n resolve(false);\n }, 200);\n const audioContext = _Resources_Sound_AudioContext__WEBPACK_IMPORTED_MODULE_0__.AudioContextFactory.create();\n audioContext.resume().then(() => {\n // create empty buffer and play it\n const buffer = audioContext.createBuffer(1, 1, 22050);\n const source = audioContext.createBufferSource();\n let ended = false;\n source.buffer = buffer;\n source.connect(audioContext.destination);\n source.onended = () => (ended = true);\n source.start(0);\n // by checking the play state after some time, we know if we're really unlocked\n setTimeout(() => {\n if (isLegacyWebAudioSource(source)) {\n if (source.playbackState === source.PLAYING_STATE || source.playbackState === source.FINISHED_STATE) {\n WebAudio._UNLOCKED = true;\n }\n }\n else {\n if (audioContext.currentTime > 0 || ended) {\n WebAudio._UNLOCKED = true;\n }\n }\n }, 0);\n clearTimeout(unlockTimeoutTimer);\n resolve(true);\n }, () => {\n reject();\n });\n });\n return promise;\n }\n static isUnlocked() {\n return this._UNLOCKED;\n }\n}\nWebAudio._UNLOCKED = false;\n\n\n/***/ }),\n\n/***/ \"./index.ts\":\n/*!******************!*\\\n !*** ./index.ts ***!\n \\******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ActionCompleteEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.ActionCompleteEvent),\n/* harmony export */ ActionContext: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ActionContext),\n/* harmony export */ ActionQueue: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ActionQueue),\n/* harmony export */ ActionSequence: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ActionSequence),\n/* harmony export */ ActionStartEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.ActionStartEvent),\n/* harmony export */ ActionsComponent: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ActionsComponent),\n/* harmony export */ ActionsSystem: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ActionsSystem),\n/* harmony export */ ActivateEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.ActivateEvent),\n/* harmony export */ Actor: () => (/* reexport safe */ _Actor__WEBPACK_IMPORTED_MODULE_6__.Actor),\n/* harmony export */ ActorEvents: () => (/* reexport safe */ _Actor__WEBPACK_IMPORTED_MODULE_6__.ActorEvents),\n/* harmony export */ AddEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.AddEvent),\n/* harmony export */ AddedComponent: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.AddedComponent),\n/* harmony export */ AffineMatrix: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.AffineMatrix),\n/* harmony export */ Animation: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Animation),\n/* harmony export */ AnimationDirection: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.AnimationDirection),\n/* harmony export */ AnimationEvents: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.AnimationEvents),\n/* harmony export */ AnimationStrategy: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.AnimationStrategy),\n/* harmony export */ ArcadeSolver: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.ArcadeSolver),\n/* harmony export */ AudioContextFactory: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.AudioContextFactory),\n/* harmony export */ Axes: () => (/* reexport safe */ _Input_Gamepad__WEBPACK_IMPORTED_MODULE_40__.Axes),\n/* harmony export */ Axis: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.Axis),\n/* harmony export */ BaseAlign: () => (/* reexport safe */ _Graphics_FontCommon__WEBPACK_IMPORTED_MODULE_14__.BaseAlign),\n/* harmony export */ BezierCurve: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.BezierCurve),\n/* harmony export */ Blink: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.Blink),\n/* harmony export */ BodyComponent: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.BodyComponent),\n/* harmony export */ BoundingBox: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.BoundingBox),\n/* harmony export */ BrowserComponent: () => (/* reexport safe */ _Util_Browser__WEBPACK_IMPORTED_MODULE_45__.BrowserComponent),\n/* harmony export */ BrowserEvents: () => (/* reexport safe */ _Util_Browser__WEBPACK_IMPORTED_MODULE_45__.BrowserEvents),\n/* harmony export */ Buttons: () => (/* reexport safe */ _Input_Gamepad__WEBPACK_IMPORTED_MODULE_40__.Buttons),\n/* harmony export */ Camera: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.Camera),\n/* harmony export */ CameraEvents: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.CameraEvents),\n/* harmony export */ Canvas: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Canvas),\n/* harmony export */ Circle: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Circle),\n/* harmony export */ CircleCollider: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.CircleCollider),\n/* harmony export */ Clock: () => (/* reexport safe */ _Util_Clock__WEBPACK_IMPORTED_MODULE_53__.Clock),\n/* harmony export */ ClosestLineJumpTable: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.ClosestLineJumpTable),\n/* harmony export */ Collider: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.Collider),\n/* harmony export */ ColliderComponent: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.ColliderComponent),\n/* harmony export */ CollisionContact: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.CollisionContact),\n/* harmony export */ CollisionEndEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.CollisionEndEvent),\n/* harmony export */ CollisionGroup: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.CollisionGroup),\n/* harmony export */ CollisionGroupManager: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.CollisionGroupManager),\n/* harmony export */ CollisionJumpTable: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.CollisionJumpTable),\n/* harmony export */ CollisionPostSolveEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.CollisionPostSolveEvent),\n/* harmony export */ CollisionPreSolveEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.CollisionPreSolveEvent),\n/* harmony export */ CollisionStartEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.CollisionStartEvent),\n/* harmony export */ CollisionSystem: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.CollisionSystem),\n/* harmony export */ CollisionType: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.CollisionType),\n/* harmony export */ Color: () => (/* reexport safe */ _Color__WEBPACK_IMPORTED_MODULE_27__.Color),\n/* harmony export */ ColorBlindFlags: () => (/* reexport safe */ _Debug_index__WEBPACK_IMPORTED_MODULE_9__.ColorBlindFlags),\n/* harmony export */ ColorBlindnessMode: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ColorBlindnessMode),\n/* harmony export */ ColorBlindnessPostProcessor: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ColorBlindnessPostProcessor),\n/* harmony export */ Component: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.Component),\n/* harmony export */ CompositeCollider: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.CompositeCollider),\n/* harmony export */ ConsoleAppender: () => (/* reexport safe */ _Util_Log__WEBPACK_IMPORTED_MODULE_50__.ConsoleAppender),\n/* harmony export */ ContactConstraintPoint: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.ContactConstraintPoint),\n/* harmony export */ ContactEndEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.ContactEndEvent),\n/* harmony export */ ContactSolveBias: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.ContactSolveBias),\n/* harmony export */ ContactStartEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.ContactStartEvent),\n/* harmony export */ CoordPlane: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.CoordPlane),\n/* harmony export */ CrossFade: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.CrossFade),\n/* harmony export */ CurveBy: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.CurveBy),\n/* harmony export */ CurveTo: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.CurveTo),\n/* harmony export */ DeactivateEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.DeactivateEvent),\n/* harmony export */ Debug: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Debug),\n/* harmony export */ DebugConfig: () => (/* reexport safe */ _Debug_index__WEBPACK_IMPORTED_MODULE_9__.DebugConfig),\n/* harmony export */ DebugGraphicsComponent: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.DebugGraphicsComponent),\n/* harmony export */ DebugSystem: () => (/* reexport safe */ _Debug_index__WEBPACK_IMPORTED_MODULE_9__.DebugSystem),\n/* harmony export */ DebugText: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.DebugText),\n/* harmony export */ DefaultAntialiasOptions: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.DefaultAntialiasOptions),\n/* harmony export */ DefaultGarbageCollectionOptions: () => (/* reexport safe */ _GarbageCollector__WEBPACK_IMPORTED_MODULE_4__.DefaultGarbageCollectionOptions),\n/* harmony export */ DefaultLoader: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.DefaultLoader),\n/* harmony export */ DefaultPixelArtOptions: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.DefaultPixelArtOptions),\n/* harmony export */ DegreeOfFreedom: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.DegreeOfFreedom),\n/* harmony export */ Delay: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.Delay),\n/* harmony export */ Detector: () => (/* reexport safe */ _Util_Detector__WEBPACK_IMPORTED_MODULE_47__.Detector),\n/* harmony export */ Die: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.Die),\n/* harmony export */ Direction: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Direction),\n/* harmony export */ Director: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.Director),\n/* harmony export */ DirectorEvents: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.DirectorEvents),\n/* harmony export */ DisplayMode: () => (/* reexport safe */ _Screen__WEBPACK_IMPORTED_MODULE_5__.DisplayMode),\n/* harmony export */ DynamicTree: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.DynamicTree),\n/* harmony export */ DynamicTreeCollisionProcessor: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.DynamicTreeCollisionProcessor),\n/* harmony export */ EX_VERSION: () => (/* binding */ EX_VERSION),\n/* harmony export */ EaseBy: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.EaseBy),\n/* harmony export */ EaseTo: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.EaseTo),\n/* harmony export */ EasingFunctions: () => (/* reexport safe */ _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_48__.EasingFunctions),\n/* harmony export */ EdgeCollider: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.EdgeCollider),\n/* harmony export */ ElasticToActorStrategy: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.ElasticToActorStrategy),\n/* harmony export */ EmitterType: () => (/* reexport safe */ _Particles_index__WEBPACK_IMPORTED_MODULE_15__.EmitterType),\n/* harmony export */ Engine: () => (/* reexport safe */ _Engine__WEBPACK_IMPORTED_MODULE_3__.Engine),\n/* harmony export */ EngineEvents: () => (/* reexport safe */ _Engine__WEBPACK_IMPORTED_MODULE_3__.EngineEvents),\n/* harmony export */ EnterTriggerEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.EnterTriggerEvent),\n/* harmony export */ EnterViewPortEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.EnterViewPortEvent),\n/* harmony export */ Entity: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.Entity),\n/* harmony export */ EntityEvents: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.EntityEvents),\n/* harmony export */ EntityManager: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.EntityManager),\n/* harmony export */ EventEmitter: () => (/* reexport safe */ _EventEmitter__WEBPACK_IMPORTED_MODULE_10__.EventEmitter),\n/* harmony export */ EventTypes: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.EventTypes),\n/* harmony export */ Events: () => (/* reexport module object */ _Events__WEBPACK_IMPORTED_MODULE_12__),\n/* harmony export */ ExResponse: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.ExResponse),\n/* harmony export */ ExcaliburGraphicsContext2DCanvas: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ExcaliburGraphicsContext2DCanvas),\n/* harmony export */ ExcaliburGraphicsContextWebGL: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ExcaliburGraphicsContextWebGL),\n/* harmony export */ ExitTriggerEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.ExitTriggerEvent),\n/* harmony export */ ExitViewPortEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.ExitViewPortEvent),\n/* harmony export */ Fade: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.Fade),\n/* harmony export */ FadeInOut: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.FadeInOut),\n/* harmony export */ Flags: () => (/* reexport safe */ _Flags__WEBPACK_IMPORTED_MODULE_1__.Flags),\n/* harmony export */ Flash: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.Flash),\n/* harmony export */ Follow: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.Follow),\n/* harmony export */ Font: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Font),\n/* harmony export */ FontCache: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.FontCache),\n/* harmony export */ FontSource: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.FontSource),\n/* harmony export */ FontStyle: () => (/* reexport safe */ _Graphics_FontCommon__WEBPACK_IMPORTED_MODULE_14__.FontStyle),\n/* harmony export */ FontUnit: () => (/* reexport safe */ _Graphics_FontCommon__WEBPACK_IMPORTED_MODULE_14__.FontUnit),\n/* harmony export */ FpsSampler: () => (/* reexport safe */ _Util_Fps__WEBPACK_IMPORTED_MODULE_52__.FpsSampler),\n/* harmony export */ FrameStats: () => (/* reexport safe */ _Debug_index__WEBPACK_IMPORTED_MODULE_9__.FrameStats),\n/* harmony export */ Future: () => (/* reexport safe */ _Util_Future__WEBPACK_IMPORTED_MODULE_57__.Future),\n/* harmony export */ GameEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.GameEvent),\n/* harmony export */ GameStartEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.GameStartEvent),\n/* harmony export */ GameStopEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.GameStopEvent),\n/* harmony export */ Gamepad: () => (/* reexport safe */ _Input_Gamepad__WEBPACK_IMPORTED_MODULE_40__.Gamepad),\n/* harmony export */ GamepadAxisEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.GamepadAxisEvent),\n/* harmony export */ GamepadButtonEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.GamepadButtonEvent),\n/* harmony export */ GamepadConnectEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.GamepadConnectEvent),\n/* harmony export */ GamepadDisconnectEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.GamepadDisconnectEvent),\n/* harmony export */ Gamepads: () => (/* reexport safe */ _Input_Gamepad__WEBPACK_IMPORTED_MODULE_40__.Gamepads),\n/* harmony export */ GarbageCollector: () => (/* reexport safe */ _GarbageCollector__WEBPACK_IMPORTED_MODULE_4__.GarbageCollector),\n/* harmony export */ Gif: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.Gif),\n/* harmony export */ GifParser: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.GifParser),\n/* harmony export */ GlobalCoordinates: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.GlobalCoordinates),\n/* harmony export */ GpuParticleEmitter: () => (/* reexport safe */ _Particles_index__WEBPACK_IMPORTED_MODULE_15__.GpuParticleEmitter),\n/* harmony export */ GpuParticleRenderer: () => (/* reexport safe */ _Particles_index__WEBPACK_IMPORTED_MODULE_15__.GpuParticleRenderer),\n/* harmony export */ Graphic: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Graphic),\n/* harmony export */ GraphicsComponent: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.GraphicsComponent),\n/* harmony export */ GraphicsGroup: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.GraphicsGroup),\n/* harmony export */ GraphicsSystem: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.GraphicsSystem),\n/* harmony export */ HashColliderProxy: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.HashColliderProxy),\n/* harmony export */ HashGridCell: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.HashGridCell),\n/* harmony export */ HashGridProxy: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.HashGridProxy),\n/* harmony export */ HiddenEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.HiddenEvent),\n/* harmony export */ HorizontalFirst: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.HorizontalFirst),\n/* harmony export */ ImageFiltering: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ImageFiltering),\n/* harmony export */ ImageSource: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ImageSource),\n/* harmony export */ ImageSourceAttributeConstants: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ImageSourceAttributeConstants),\n/* harmony export */ ImageWrapping: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ImageWrapping),\n/* harmony export */ InitializeEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.InitializeEvent),\n/* harmony export */ InputHost: () => (/* reexport safe */ _Input_InputHost__WEBPACK_IMPORTED_MODULE_42__.InputHost),\n/* harmony export */ InputMapper: () => (/* reexport safe */ _Input_InputMapper__WEBPACK_IMPORTED_MODULE_43__.InputMapper),\n/* harmony export */ IsometricEntityComponent: () => (/* reexport safe */ _TileMap_index__WEBPACK_IMPORTED_MODULE_17__.IsometricEntityComponent),\n/* harmony export */ IsometricEntitySystem: () => (/* reexport safe */ _TileMap_index__WEBPACK_IMPORTED_MODULE_17__.IsometricEntitySystem),\n/* harmony export */ IsometricMap: () => (/* reexport safe */ _TileMap_index__WEBPACK_IMPORTED_MODULE_17__.IsometricMap),\n/* harmony export */ IsometricTile: () => (/* reexport safe */ _TileMap_index__WEBPACK_IMPORTED_MODULE_17__.IsometricTile),\n/* harmony export */ KeyEvent: () => (/* reexport safe */ _Input_Keyboard__WEBPACK_IMPORTED_MODULE_41__.KeyEvent),\n/* harmony export */ Keyboard: () => (/* reexport safe */ _Input_Keyboard__WEBPACK_IMPORTED_MODULE_41__.Keyboard),\n/* harmony export */ Keys: () => (/* reexport safe */ _Input_Keyboard__WEBPACK_IMPORTED_MODULE_41__.Keys),\n/* harmony export */ KillEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.KillEvent),\n/* harmony export */ Label: () => (/* reexport safe */ _Label__WEBPACK_IMPORTED_MODULE_13__.Label),\n/* harmony export */ LimitCameraBoundsStrategy: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.LimitCameraBoundsStrategy),\n/* harmony export */ Line: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Line),\n/* harmony export */ LineSegment: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.LineSegment),\n/* harmony export */ Loader: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.Loader),\n/* harmony export */ LoaderEvents: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.LoaderEvents),\n/* harmony export */ LockCameraToActorAxisStrategy: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.LockCameraToActorAxisStrategy),\n/* harmony export */ LockCameraToActorStrategy: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.LockCameraToActorStrategy),\n/* harmony export */ LogLevel: () => (/* reexport safe */ _Util_Log__WEBPACK_IMPORTED_MODULE_50__.LogLevel),\n/* harmony export */ Logger: () => (/* reexport safe */ _Util_Log__WEBPACK_IMPORTED_MODULE_50__.Logger),\n/* harmony export */ Material: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Material),\n/* harmony export */ Matrix: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.Matrix),\n/* harmony export */ MatrixLocations: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.MatrixLocations),\n/* harmony export */ MediaEvent: () => (/* reexport safe */ _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_11__.MediaEvent),\n/* harmony export */ Meet: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.Meet),\n/* harmony export */ MotionComponent: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.MotionComponent),\n/* harmony export */ MotionSystem: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.MotionSystem),\n/* harmony export */ MoveBy: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.MoveBy),\n/* harmony export */ MoveByWithOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.MoveByWithOptions),\n/* harmony export */ MoveTo: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.MoveTo),\n/* harmony export */ MoveToWithOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.MoveToWithOptions),\n/* harmony export */ NativePointerButton: () => (/* reexport safe */ _Input_NativePointerButton__WEBPACK_IMPORTED_MODULE_33__.NativePointerButton),\n/* harmony export */ NativeSoundEvent: () => (/* reexport safe */ _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_11__.NativeSoundEvent),\n/* harmony export */ NativeSoundProcessedEvent: () => (/* reexport safe */ _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_11__.NativeSoundProcessedEvent),\n/* harmony export */ NineSlice: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.NineSlice),\n/* harmony export */ NineSliceStretch: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.NineSliceStretch),\n/* harmony export */ None: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.None),\n/* harmony export */ Observable: () => (/* reexport safe */ _Util_Observable__WEBPACK_IMPORTED_MODULE_49__.Observable),\n/* harmony export */ OffscreenSystem: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.OffscreenSystem),\n/* harmony export */ Pair: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.Pair),\n/* harmony export */ ParallaxComponent: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ParallaxComponent),\n/* harmony export */ ParallelActions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ParallelActions),\n/* harmony export */ Particle: () => (/* reexport safe */ _Particles_index__WEBPACK_IMPORTED_MODULE_15__.Particle),\n/* harmony export */ ParticleEmitter: () => (/* reexport safe */ _Particles_index__WEBPACK_IMPORTED_MODULE_15__.ParticleEmitter),\n/* harmony export */ ParticleRenderer: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ParticleRenderer),\n/* harmony export */ ParticleTransform: () => (/* reexport safe */ _Particles_index__WEBPACK_IMPORTED_MODULE_15__.ParticleTransform),\n/* harmony export */ PhysicsStats: () => (/* reexport safe */ _Debug_index__WEBPACK_IMPORTED_MODULE_9__.PhysicsStats),\n/* harmony export */ PhysicsWorld: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.PhysicsWorld),\n/* harmony export */ PointerAbstraction: () => (/* reexport safe */ _Input_PointerAbstraction__WEBPACK_IMPORTED_MODULE_35__.PointerAbstraction),\n/* harmony export */ PointerButton: () => (/* reexport safe */ _Input_PointerButton__WEBPACK_IMPORTED_MODULE_32__.PointerButton),\n/* harmony export */ PointerComponent: () => (/* reexport safe */ _Input_PointerComponent__WEBPACK_IMPORTED_MODULE_36__.PointerComponent),\n/* harmony export */ PointerEvent: () => (/* reexport safe */ _Input_PointerEvent__WEBPACK_IMPORTED_MODULE_30__.PointerEvent),\n/* harmony export */ PointerEventReceiver: () => (/* reexport safe */ _Input_PointerEventReceiver__WEBPACK_IMPORTED_MODULE_34__.PointerEventReceiver),\n/* harmony export */ PointerScope: () => (/* reexport safe */ _Input_PointerScope__WEBPACK_IMPORTED_MODULE_39__.PointerScope),\n/* harmony export */ PointerSystem: () => (/* reexport safe */ _Input_PointerSystem__WEBPACK_IMPORTED_MODULE_37__.PointerSystem),\n/* harmony export */ PointerType: () => (/* reexport safe */ _Input_PointerType__WEBPACK_IMPORTED_MODULE_38__.PointerType),\n/* harmony export */ Polygon: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Polygon),\n/* harmony export */ PolygonCollider: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.PolygonCollider),\n/* harmony export */ Pool: () => (/* reexport safe */ _Util_Pool__WEBPACK_IMPORTED_MODULE_51__.Pool),\n/* harmony export */ PostCollisionEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PostCollisionEvent),\n/* harmony export */ PostDebugDrawEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PostDebugDrawEvent),\n/* harmony export */ PostDrawEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PostDrawEvent),\n/* harmony export */ PostFrameEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PostFrameEvent),\n/* harmony export */ PostKillEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PostKillEvent),\n/* harmony export */ PostTransformDrawEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PostTransformDrawEvent),\n/* harmony export */ PostUpdateEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PostUpdateEvent),\n/* harmony export */ PreCollisionEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PreCollisionEvent),\n/* harmony export */ PreDebugDrawEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PreDebugDrawEvent),\n/* harmony export */ PreDrawEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PreDrawEvent),\n/* harmony export */ PreFrameEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PreFrameEvent),\n/* harmony export */ PreKillEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PreKillEvent),\n/* harmony export */ PreLoadEvent: () => (/* reexport safe */ _Scene__WEBPACK_IMPORTED_MODULE_16__.PreLoadEvent),\n/* harmony export */ PreTransformDrawEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PreTransformDrawEvent),\n/* harmony export */ PreUpdateEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PreUpdateEvent),\n/* harmony export */ Projection: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.Projection),\n/* harmony export */ QuadIndexBuffer: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.QuadIndexBuffer),\n/* harmony export */ QuadTree: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.QuadTree),\n/* harmony export */ Query: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.Query),\n/* harmony export */ QueryManager: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.QueryManager),\n/* harmony export */ RadiusAroundActorStrategy: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.RadiusAroundActorStrategy),\n/* harmony export */ Random: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.Random),\n/* harmony export */ Raster: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Raster),\n/* harmony export */ Ray: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.Ray),\n/* harmony export */ RealisticSolver: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.RealisticSolver),\n/* harmony export */ Rectangle: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Rectangle),\n/* harmony export */ RemoveEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.RemoveEvent),\n/* harmony export */ RemovedComponent: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.RemovedComponent),\n/* harmony export */ Repeat: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.Repeat),\n/* harmony export */ RepeatForever: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.RepeatForever),\n/* harmony export */ Resolution: () => (/* reexport safe */ _Screen__WEBPACK_IMPORTED_MODULE_5__.Resolution),\n/* harmony export */ Resource: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.Resource),\n/* harmony export */ ResourceEvents: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.ResourceEvents),\n/* harmony export */ RotateBy: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.RotateBy),\n/* harmony export */ RotateByWithOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.RotateByWithOptions),\n/* harmony export */ RotateTo: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.RotateTo),\n/* harmony export */ RotateToWithOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.RotateToWithOptions),\n/* harmony export */ RotationType: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.RotationType),\n/* harmony export */ ScaleBy: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ScaleBy),\n/* harmony export */ ScaleByWithOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ScaleByWithOptions),\n/* harmony export */ ScaleTo: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ScaleTo),\n/* harmony export */ ScaleToWithOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ScaleToWithOptions),\n/* harmony export */ Scene: () => (/* reexport safe */ _Scene__WEBPACK_IMPORTED_MODULE_16__.Scene),\n/* harmony export */ SceneEvents: () => (/* reexport safe */ _Scene__WEBPACK_IMPORTED_MODULE_16__.SceneEvents),\n/* harmony export */ Screen: () => (/* reexport safe */ _Screen__WEBPACK_IMPORTED_MODULE_5__.Screen),\n/* harmony export */ ScreenAppender: () => (/* reexport safe */ _Util_Log__WEBPACK_IMPORTED_MODULE_50__.ScreenAppender),\n/* harmony export */ ScreenElement: () => (/* reexport safe */ _ScreenElement__WEBPACK_IMPORTED_MODULE_20__.ScreenElement),\n/* harmony export */ ScreenEvents: () => (/* reexport safe */ _Screen__WEBPACK_IMPORTED_MODULE_5__.ScreenEvents),\n/* harmony export */ ScreenShader: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ScreenShader),\n/* harmony export */ ScrollPreventionMode: () => (/* reexport safe */ _Engine__WEBPACK_IMPORTED_MODULE_3__.ScrollPreventionMode),\n/* harmony export */ Semaphore: () => (/* reexport safe */ _Util_Semaphore__WEBPACK_IMPORTED_MODULE_58__.Semaphore),\n/* harmony export */ SeparatingAxis: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.SeparatingAxis),\n/* harmony export */ SeparationInfo: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.SeparationInfo),\n/* harmony export */ Shader: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Shader),\n/* harmony export */ Shape: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.Shape),\n/* harmony export */ Side: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.Side),\n/* harmony export */ Slide: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.Slide),\n/* harmony export */ SolverStrategy: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.SolverStrategy),\n/* harmony export */ Sound: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.Sound),\n/* harmony export */ SoundEvents: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.SoundEvents),\n/* harmony export */ SparseHashGrid: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.SparseHashGrid),\n/* harmony export */ SparseHashGridCollisionProcessor: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.SparseHashGridCollisionProcessor),\n/* harmony export */ SpatialPartitionStrategy: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.SpatialPartitionStrategy),\n/* harmony export */ Sprite: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Sprite),\n/* harmony export */ SpriteFont: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.SpriteFont),\n/* harmony export */ SpriteSheet: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.SpriteSheet),\n/* harmony export */ StandardClock: () => (/* reexport safe */ _Util_Clock__WEBPACK_IMPORTED_MODULE_53__.StandardClock),\n/* harmony export */ StateMachine: () => (/* reexport safe */ _Util_StateMachine__WEBPACK_IMPORTED_MODULE_56__.StateMachine),\n/* harmony export */ StrategyContainer: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.StrategyContainer),\n/* harmony export */ Stream: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.Stream),\n/* harmony export */ System: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.System),\n/* harmony export */ SystemManager: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.SystemManager),\n/* harmony export */ SystemPriority: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.SystemPriority),\n/* harmony export */ SystemType: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.SystemType),\n/* harmony export */ TagQuery: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.TagQuery),\n/* harmony export */ TestClock: () => (/* reexport safe */ _Util_Clock__WEBPACK_IMPORTED_MODULE_53__.TestClock),\n/* harmony export */ Text: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Text),\n/* harmony export */ TextAlign: () => (/* reexport safe */ _Graphics_FontCommon__WEBPACK_IMPORTED_MODULE_14__.TextAlign),\n/* harmony export */ TextureLoader: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.TextureLoader),\n/* harmony export */ Tile: () => (/* reexport safe */ _TileMap_index__WEBPACK_IMPORTED_MODULE_17__.Tile),\n/* harmony export */ TileMap: () => (/* reexport safe */ _TileMap_index__WEBPACK_IMPORTED_MODULE_17__.TileMap),\n/* harmony export */ TileMapEvents: () => (/* reexport safe */ _TileMap_index__WEBPACK_IMPORTED_MODULE_17__.TileMapEvents),\n/* harmony export */ TiledAnimation: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.TiledAnimation),\n/* harmony export */ TiledSprite: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.TiledSprite),\n/* harmony export */ Timer: () => (/* reexport safe */ _Timer__WEBPACK_IMPORTED_MODULE_18__.Timer),\n/* harmony export */ Toaster: () => (/* reexport safe */ _Util_Toaster__WEBPACK_IMPORTED_MODULE_55__.Toaster),\n/* harmony export */ Transform: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.Transform),\n/* harmony export */ TransformComponent: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.TransformComponent),\n/* harmony export */ Transition: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.Transition),\n/* harmony export */ TreeNode: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.TreeNode),\n/* harmony export */ Trigger: () => (/* reexport safe */ _Trigger__WEBPACK_IMPORTED_MODULE_19__.Trigger),\n/* harmony export */ TriggerEvents: () => (/* reexport safe */ _Trigger__WEBPACK_IMPORTED_MODULE_19__.TriggerEvents),\n/* harmony export */ TwoPI: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.TwoPI),\n/* harmony export */ Util: () => (/* reexport module object */ _Util_Index__WEBPACK_IMPORTED_MODULE_44__),\n/* harmony export */ Vector: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.Vector),\n/* harmony export */ VectorView: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.VectorView),\n/* harmony export */ VertexBuffer: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.VertexBuffer),\n/* harmony export */ VertexLayout: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.VertexLayout),\n/* harmony export */ VerticalFirst: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.VerticalFirst),\n/* harmony export */ VisibleEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.VisibleEvent),\n/* harmony export */ WebAudio: () => (/* reexport safe */ _Util_WebAudio__WEBPACK_IMPORTED_MODULE_54__.WebAudio),\n/* harmony export */ WebAudioInstance: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.WebAudioInstance),\n/* harmony export */ WheelDeltaMode: () => (/* reexport safe */ _Input_WheelDeltaMode__WEBPACK_IMPORTED_MODULE_31__.WheelDeltaMode),\n/* harmony export */ WheelEvent: () => (/* reexport safe */ _Input_WheelEvent__WEBPACK_IMPORTED_MODULE_29__.WheelEvent),\n/* harmony export */ World: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.World),\n/* harmony export */ approximatelyEqual: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.approximatelyEqual),\n/* harmony export */ assert: () => (/* reexport safe */ _Util_Assert__WEBPACK_IMPORTED_MODULE_60__.assert),\n/* harmony export */ canonicalizeAngle: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.canonicalizeAngle),\n/* harmony export */ clamp: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.clamp),\n/* harmony export */ coroutine: () => (/* reexport safe */ _Util_Coroutine__WEBPACK_IMPORTED_MODULE_59__.coroutine),\n/* harmony export */ createId: () => (/* reexport safe */ _Id__WEBPACK_IMPORTED_MODULE_2__.createId),\n/* harmony export */ frac: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.frac),\n/* harmony export */ getDefaultPhysicsConfig: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.getDefaultPhysicsConfig),\n/* harmony export */ hasGraphicsTick: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.hasGraphicsTick),\n/* harmony export */ hasOnAdd: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.hasOnAdd),\n/* harmony export */ hasOnInitialize: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.hasOnInitialize),\n/* harmony export */ hasOnPostUpdate: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.hasOnPostUpdate),\n/* harmony export */ hasOnPreUpdate: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.hasOnPreUpdate),\n/* harmony export */ hasOnRemove: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.hasOnRemove),\n/* harmony export */ hasPostDraw: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.hasPostDraw),\n/* harmony export */ hasPreDraw: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.hasPreDraw),\n/* harmony export */ has_add: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.has_add),\n/* harmony export */ has_initialize: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.has_initialize),\n/* harmony export */ has_postupdate: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.has_postupdate),\n/* harmony export */ has_preupdate: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.has_preupdate),\n/* harmony export */ has_remove: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.has_remove),\n/* harmony export */ inverseLerp: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.inverseLerp),\n/* harmony export */ inverseLerpVector: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.inverseLerpVector),\n/* harmony export */ isActor: () => (/* reexport safe */ _Actor__WEBPACK_IMPORTED_MODULE_6__.isActor),\n/* harmony export */ isAddedComponent: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.isAddedComponent),\n/* harmony export */ isComponentCtor: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.isComponentCtor),\n/* harmony export */ isLoaderConstructor: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.isLoaderConstructor),\n/* harmony export */ isMoveByOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.isMoveByOptions),\n/* harmony export */ isMoveToOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.isMoveToOptions),\n/* harmony export */ isRemovedComponent: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.isRemovedComponent),\n/* harmony export */ isRotateByOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.isRotateByOptions),\n/* harmony export */ isRotateToOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.isRotateToOptions),\n/* harmony export */ isScaleByOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.isScaleByOptions),\n/* harmony export */ isScaleToOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.isScaleToOptions),\n/* harmony export */ isSceneConstructor: () => (/* reexport safe */ _Scene__WEBPACK_IMPORTED_MODULE_16__.isSceneConstructor),\n/* harmony export */ isScreenElement: () => (/* reexport safe */ _ScreenElement__WEBPACK_IMPORTED_MODULE_20__.isScreenElement),\n/* harmony export */ isSystemConstructor: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.isSystemConstructor),\n/* harmony export */ lerp: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.lerp),\n/* harmony export */ lerpAngle: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.lerpAngle),\n/* harmony export */ lerpVector: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.lerpVector),\n/* harmony export */ maxMessages: () => (/* reexport safe */ _Util_Decorators__WEBPACK_IMPORTED_MODULE_46__.maxMessages),\n/* harmony export */ nextActionId: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.nextActionId),\n/* harmony export */ obsolete: () => (/* reexport safe */ _Util_Decorators__WEBPACK_IMPORTED_MODULE_46__.obsolete),\n/* harmony export */ parseImageFiltering: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.parseImageFiltering),\n/* harmony export */ parseImageWrapping: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.parseImageWrapping),\n/* harmony export */ pixelSnapEpsilon: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.pixelSnapEpsilon),\n/* harmony export */ randomInRange: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.randomInRange),\n/* harmony export */ randomIntInRange: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.randomIntInRange),\n/* harmony export */ range: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.range),\n/* harmony export */ remap: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.remap),\n/* harmony export */ remapVector: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.remapVector),\n/* harmony export */ resetObsoleteCounter: () => (/* reexport safe */ _Util_Decorators__WEBPACK_IMPORTED_MODULE_46__.resetObsoleteCounter),\n/* harmony export */ sign: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.sign),\n/* harmony export */ toDegrees: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.toDegrees),\n/* harmony export */ toRadians: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.toRadians),\n/* harmony export */ vec: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.vec),\n/* harmony export */ webgl: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.webgl)\n/* harmony export */ });\n/* harmony import */ var _Polyfill__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Polyfill */ \"./Polyfill.ts\");\n/* harmony import */ var _Flags__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Flags */ \"./Flags.ts\");\n/* harmony import */ var _Id__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Id */ \"./Id.ts\");\n/* harmony import */ var _Engine__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Engine */ \"./Engine.ts\");\n/* harmony import */ var _GarbageCollector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./GarbageCollector */ \"./GarbageCollector.ts\");\n/* harmony import */ var _Screen__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Screen */ \"./Screen.ts\");\n/* harmony import */ var _Actor__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Actor */ \"./Actor.ts\");\n/* harmony import */ var _Math_index__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Math/index */ \"./Math/index.ts\");\n/* harmony import */ var _Camera__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Camera */ \"./Camera.ts\");\n/* harmony import */ var _Debug_index__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Debug/index */ \"./Debug/index.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Events/MediaEvents */ \"./Events/MediaEvents.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Events */ \"./Events.ts\");\n/* harmony import */ var _Label__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Label */ \"./Label.ts\");\n/* harmony import */ var _Graphics_FontCommon__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Graphics/FontCommon */ \"./Graphics/FontCommon.ts\");\n/* harmony import */ var _Particles_index__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Particles/index */ \"./Particles/index.ts\");\n/* harmony import */ var _Scene__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Scene */ \"./Scene.ts\");\n/* harmony import */ var _TileMap_index__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./TileMap/index */ \"./TileMap/index.ts\");\n/* harmony import */ var _Timer__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Timer */ \"./Timer.ts\");\n/* harmony import */ var _Trigger__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./Trigger */ \"./Trigger.ts\");\n/* harmony import */ var _ScreenElement__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./ScreenElement */ \"./ScreenElement.ts\");\n/* harmony import */ var _Actions_index__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./Actions/index */ \"./Actions/index.ts\");\n/* harmony import */ var _Collision_Index__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./Collision/Index */ \"./Collision/Index.ts\");\n/* harmony import */ var _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./Interfaces/Index */ \"./Interfaces/Index.ts\");\n/* harmony import */ var _Resources_Index__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./Resources/Index */ \"./Resources/Index.ts\");\n/* harmony import */ var _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./EntityComponentSystem/index */ \"./EntityComponentSystem/index.ts\");\n/* harmony import */ var _Director_index__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./Director/index */ \"./Director/index.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./Color */ \"./Color.ts\");\n/* harmony import */ var _Graphics_index__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./Graphics/index */ \"./Graphics/index.ts\");\n/* harmony import */ var _Input_WheelEvent__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./Input/WheelEvent */ \"./Input/WheelEvent.ts\");\n/* harmony import */ var _Input_PointerEvent__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./Input/PointerEvent */ \"./Input/PointerEvent.ts\");\n/* harmony import */ var _Input_WheelDeltaMode__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./Input/WheelDeltaMode */ \"./Input/WheelDeltaMode.ts\");\n/* harmony import */ var _Input_PointerButton__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./Input/PointerButton */ \"./Input/PointerButton.ts\");\n/* harmony import */ var _Input_NativePointerButton__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./Input/NativePointerButton */ \"./Input/NativePointerButton.ts\");\n/* harmony import */ var _Input_PointerEventReceiver__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./Input/PointerEventReceiver */ \"./Input/PointerEventReceiver.ts\");\n/* harmony import */ var _Input_PointerAbstraction__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./Input/PointerAbstraction */ \"./Input/PointerAbstraction.ts\");\n/* harmony import */ var _Input_PointerComponent__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./Input/PointerComponent */ \"./Input/PointerComponent.ts\");\n/* harmony import */ var _Input_PointerSystem__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./Input/PointerSystem */ \"./Input/PointerSystem.ts\");\n/* harmony import */ var _Input_PointerType__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./Input/PointerType */ \"./Input/PointerType.ts\");\n/* harmony import */ var _Input_PointerScope__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./Input/PointerScope */ \"./Input/PointerScope.ts\");\n/* harmony import */ var _Input_Gamepad__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./Input/Gamepad */ \"./Input/Gamepad.ts\");\n/* harmony import */ var _Input_Keyboard__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ./Input/Keyboard */ \"./Input/Keyboard.ts\");\n/* harmony import */ var _Input_InputHost__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ./Input/InputHost */ \"./Input/InputHost.ts\");\n/* harmony import */ var _Input_InputMapper__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ./Input/InputMapper */ \"./Input/InputMapper.ts\");\n/* harmony import */ var _Util_Index__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! ./Util/Index */ \"./Util/Index.ts\");\n/* harmony import */ var _Util_Browser__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! ./Util/Browser */ \"./Util/Browser.ts\");\n/* harmony import */ var _Util_Decorators__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! ./Util/Decorators */ \"./Util/Decorators.ts\");\n/* harmony import */ var _Util_Detector__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! ./Util/Detector */ \"./Util/Detector.ts\");\n/* harmony import */ var _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! ./Util/EasingFunctions */ \"./Util/EasingFunctions.ts\");\n/* harmony import */ var _Util_Observable__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(/*! ./Util/Observable */ \"./Util/Observable.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(/*! ./Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Util_Pool__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(/*! ./Util/Pool */ \"./Util/Pool.ts\");\n/* harmony import */ var _Util_Fps__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(/*! ./Util/Fps */ \"./Util/Fps.ts\");\n/* harmony import */ var _Util_Clock__WEBPACK_IMPORTED_MODULE_53__ = __webpack_require__(/*! ./Util/Clock */ \"./Util/Clock.ts\");\n/* harmony import */ var _Util_WebAudio__WEBPACK_IMPORTED_MODULE_54__ = __webpack_require__(/*! ./Util/WebAudio */ \"./Util/WebAudio.ts\");\n/* harmony import */ var _Util_Toaster__WEBPACK_IMPORTED_MODULE_55__ = __webpack_require__(/*! ./Util/Toaster */ \"./Util/Toaster.ts\");\n/* harmony import */ var _Util_StateMachine__WEBPACK_IMPORTED_MODULE_56__ = __webpack_require__(/*! ./Util/StateMachine */ \"./Util/StateMachine.ts\");\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_57__ = __webpack_require__(/*! ./Util/Future */ \"./Util/Future.ts\");\n/* harmony import */ var _Util_Semaphore__WEBPACK_IMPORTED_MODULE_58__ = __webpack_require__(/*! ./Util/Semaphore */ \"./Util/Semaphore.ts\");\n/* harmony import */ var _Util_Coroutine__WEBPACK_IMPORTED_MODULE_59__ = __webpack_require__(/*! ./Util/Coroutine */ \"./Util/Coroutine.ts\");\n/* harmony import */ var _Util_Assert__WEBPACK_IMPORTED_MODULE_60__ = __webpack_require__(/*! ./Util/Assert */ \"./Util/Assert.ts\");\n/**\n * The current Excalibur version string\n * @description `process.env.__EX_VERSION` gets replaced by Webpack on build\n */\nconst EX_VERSION = \"0.30.1\";\n\n(0,_Polyfill__WEBPACK_IMPORTED_MODULE_0__.polyfill)();\n// This file is used as the bundle entry point and exports everything\n// that will be exposed as the `ex` global variable.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// ex.Events namespace\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// ex.Util namespaces\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// ex.Deprecated\n// import * as deprecated from './Deprecated';\n// export { deprecated as Deprecated };\n// export * from './Deprecated';\n\n\n/***/ }),\n\n/***/ \"./Director/Loader.logo.png\":\n/*!**********************************!*\\\n !*** ./Director/Loader.logo.png ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAdQAAAB2CAYAAABxhGI9AAAACXBIWXMAAAsSAAALEgHS3X78AAAKnUlEQVR42u3dP2wjSx0H8N8hJIonIRmJjsq0SBR+BQ1dcqKhe0lD77SvSwpKkJKGPulpktfRIMUdEqKIqV57rpAokM4dbSiyq7ONPTP7x39ifz7SFbnEnp3xer47O7uzH15fXwMA6OYHmgAABCoACFQAEKgAgEAFAIEKAAIVAAQqACBQAUCgAoBABQCBCgAIVAAQqAAgUAFAoAIAAhUABCoACFQAEKgAgECFLbmOiNeFf2PbAyz68Pr6qhUgbRwR92v+/zwiJrYHMEKFMmcN///UtgcQqFBk1PD/97U9Qx8VCFSgu4EmAIEKAAIVAAQqACBQ4Z25jojP8eX+0WtNAgIVaOY+Im5j+eKh24h41jQgUIEyZ7F5NaPU7wCBCiwYd/w9cOB+qAlgJ3KLLow0EV198803RWvJfvfddx+0lhEqHKu5JgAjVCBvlhmFzjQRXUekHz9+TP79y8uLRjNChXfvoePvAYEKxNtj1e42/O5JoIJABcrdRMRVLM+X3kTEpaaB988cKuzWg9EobTWdMx0Oly8uN4dqhAoARqgnaN3arHfqu7OyH8ItKLVB/P+CEfMTHyGPY3npx1m8zWGDEeoBfUk/xdti57dr/r1Wv2+6EPow3tZ5rRdS72s1neuF97xvWd+XTH0/V+UMttDWqbI/r2nrxfp+jv2uSjSO7S+OXy/A/3lN+9xX5T5HxEUPZZ0tfB71+w57eJ/HFu+z+jkv1u92YX9fbI/HhX3JA9rp5MPr66tWaG9UfUGbrHIzi7cLUyYFf/tpTady03EEeL8mUJ6i7MKYNvWNqr4Pe2jradXO60LrvPAz2PQ5RPX684ah8dxD+2zantnCgVipSVV+m/tgB9W2DDq2Sx/vM95wcHhZhWVJm8yrv58cSgfTdc70+++/X/r522+/tUKSEepBqo+om4ZLPerMjUwuNnQCtx1GWJtee1FwdD5uWd86xLs8UaVt2aNEO1/saZ/Z5rYMW4zq6v34rGV9Bg3q2eZ9SkeNm9qwyUh30OPIHYFKx5FG03C7znSOqYBq+qW/zpQ3anH037TNHluG6f0WPsPhHvab4QFty7ogOeuxDYcNy2/zu2214WNYWxmBurNO8bGn97pNBOO8xy/9uCorZZ4I2r4C7aJgO7ZV9iE49Dm6NvOWx+pWE9CUq3zbdTp9doz38TbXtzqH9RT5CyWe422OaZoZGeZCabrhPQY9HjwsjpTvCg4YtlE2+Ta/j2bzn8fqrDqgm+6yUHOmAvWUjAtGhbNYvsBknDnqH1Qhc7VmxHgeb/NbudA5j/UXlYwif2p6luhAc9teu1npiHKnDs8if6tCm7JLX3NKpgttXe9ruc9mHMd7a83iwdxF5vt8tutARaCeklRnNK9C8WnNF7geJQ4T4XG3JhSnVdilQrG+yOnrlVHfsEGYzhNBn7Lu6tS7+HJafJQ4EMiNlNqWXZ9WPvVgnVYHG5M1ByDXkT6leX2EgTqJtyt45yv7S2qO3sEZjZhDLXeR+YKdJ0Zdk8QocvH9N732KrNtq+FZ/zzIHABcJrYpd+Xv14lOd5ap76SgrduW/VTQ1qcQpqnbgu4ifZvUMNpd9XuoZmvCtPaQ2Y/BCHVLgbrJTeRPDdVf6pfMKDU2fOkHmVFFfXr3MsouLsnNvV5kRoe5+s431PeuoKPqWnaurY/ZPBEeqwceN4l96iwO6H7Mjq4y7VGPVNe10VaZMzVCPVWpI/Z6FZbcv5fMqGCU+dLfFGzj58jP8+bCdJCo7yzKTwdOF0bu9Ug7V4c+yz7FJfYeGoysUss0HssIdVZwYLDujMqlESoCdTtGsZtbHnJBeNdDSJSs0jTKdMJN1HNX54Wv7bvsU9NkVJVa13dX+/wuArV0X/l5RHyo/lnfF4G6p6DrS0kHdtXhy35TGErDPYZUn2WfWqDOo/lVqdMD2O/hKJhD7S/odukymq9s02QN4EEPR/zbaOumZc+r15zK1Zqznl9jsfiemTM1QmV3HUuTkedlg9HIQzRbUD93dfC+2tpj2fIHEH2+RqCCQH13gZq7hWXTNpVu19OB1fc9nQ0AKOKUb5lU0P1kDyOneoWk0lOZ9cIP0x7qu8+2BhCoR2wYu1+e7DmaXzBSsu5vaX1ne2zrpmUPTmxf7PM1Dm4y/vC7ny7Nif7+z/9ZmtM0Z3panPLtPmra9f16bcK0Dpbnwk43Vd/RHtu6zfNQTy1QBy3aqG2g9nVmxml+BOoJyT3NpWmn9xhfFnu4bvDa+44BXhqqfdf3uUF9+yz77AT31Yue2mjecYQ62NLfgkA9ghHqLNEhNem4H1c6vdyDxhf/bpz5m4coW/c39wi6VH2bPtHlcaV9cvXts+zxCe6rTeqc2ndL7uGd93QwM9bFcAzMoZZ7SgTBbWx+asui61h/iq1+RmjqdbnQXQ3T1DNQ63V/U9ucqm/pMzPb1rePsk/1iTOjgvatR4W3Lc8ULB78pELyrnAfeTcj1NU509/86mfJ33/8+Mf00a05UyPUEw7UVCeWG/WNEiExyHRMt5ltW30izUPk18ytt7lNfc8i//DvtvXto+ySA5BjljsLUF8lPkqMPEtW1JomDsiGBZ9Byb4NAvUITSN9GuwsIj6t6UTOqk7jJREkmzqli8xIs96udSO20sX0H1vW92IL9e1a9rgqVyf91gbPsTy9UD9n9lOkT8k+RfkFR5PMNqxOcdSf32PBvg3vilO+zdxE+okx9Wm0ph36XYsRZCpMF993GOk5qvqB3Dct6jvssb67KvuUNJ3frw92bhr8/STSF0JdRPMLpUCgnsgo9S76PZ246ZFk1wWvK5m3vVoYvW1Sz7nN91jfXbQ1ZQc7TW6HeaoOalypG/8/p/rP1aNAc6ZHzSnfdqPUPhdy2PQw6Nz9gSVhuhiqueUHR3uu7y7K3rdDX4u46ZrPbUa0IFBZ0seKQ3XQTRt2vm3W/a2DbNKys++rvm3ep6+y1x2UdP3bWU9lzra47U1GmlctX/sQ23t+aOlByLTh/4NAPaCRxtcdO5HLSJ/6vNtCwGx67VPmPbvWd1q9frKHtp4kAqRJ2HR9j762JfX3bZ//elPtj13PPDx1+D5tqk/Xi6NO8SHz7MmH19dXrdBNfVFP6T2PT1UHNit87/t4m5+aRH+nQBdvqyhZDKJLfZs8h7XPsqdV2ZOV+tanKB8aln0dyxdAXbV4j4gvt4oMOrbP6vbU73NW7TMlbdTnPrWpfqXfh9HKZ9vke7KuTeZRNtXRSe6+1FV//ce/ln5eXfsXgcqXzr6+9261M3moOoa7E6nvTZTfy7iNsmfb7kjfgXGsvxe0vihsEts9HTquPpt1q1vtahu2TqAiUAEEKj0zhwoARqgAu/OnX/442WH+9xc/Wvr58re/Tr7f41/+ZsRqhAoACFQAEKgAcHjMoQJskJsz/eqrr5Z+vvr7v5fmQFevAl5lztQIFQAQqAAgUAHgIJlDBdhgdQ41N2eKESoAIFABQKACwFEwhwoARqgAIFABQKACAAIVAAQqAAhUABCoAIBABQCBCgACFQAEKgAgUAFAoAKAQAUAgQoACFQAEKgAIFABQKACAAIVAAQqAAhUABCoAIBABQCBCgACFQAQqAAgUAFAoAKAQAUAlvwPcFDns1DsH4sAAAAASUVORK5CYII=\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/debug-font.png\":\n/*!*****************************************!*\\\n !*** ./Graphics/Context/debug-font.png ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAABACAYAAAD1Xam+AAAAAXNSR0IArs4c6QAABlFJREFUeJztndmy4yoMRcWt/v9fdr8EWoDAaDD4JntVpeqcxBrMIGQDNhEAAAAAAAAAAAAAAOCrSbMfr+u6yoEpTY+906GV57YtPkjyXj9WZZ+wHWHfo2N3/bU6Tte9Rv6ptruqRyMvKvvIX/zY3I/vjLeqsg6l/CWdp0KHKO/1Y1H2EdsR9j06Ntdfp+N03SvkH2u7i3pu5XkQ+DNTkgNJSok+/183xpcdWZHjgUzpQ2pGD67vaf//KRAGAq3tdhCy2tcMQKPyXyz7iPqrdBjbX5h9g7xbtvWf4ZJvM4D/BKG24Sd+IkQ0TC9aW5NM5FbO2HgrPVzW2vmN50DZNv/QWtl5bfPy85SBtdy9dFmjsf2F2SehTBVE+u+tkE5+lAGcJlFwGuodwRRU2Qe3rx0FhPNflc3HWC7BEh8EDGVR5IMCiLnDONtPp87qhxVH/S/LvzUAuDs/kyGimA5oSONKR1w8vsLpv+v+S9vhmS71JRiX1xB5CWZNw7m6rMrllMag/RJyWb67BEgpDVMWSydc+K47pr35w05kWd7ReEq6116KaG4CsbJ7OmV9PdZLEKkONiC1/7ZONVgDsajLIJPYp2OUAXRpnPcGmnIE6eSK4nv5YQqqSYO52JqnYfYj/PdQXQIY7XszuMofMgZRT/1LdeC5h2I5/0EdWDMY2Yb05WDE1RodVdpSA5r85slArAVnSf+89iP896St0f5bZKVA7Gk/3ja8q+152/+wrLqBWZTem3IBADbRBoDuHgAA4HdAAADgh0EAAOCHQQAA4IdBAADgh0EAAOCHuVsKbJ3P9M7jjuxHzGfv8j9iDt47Dx7hP8cjq5F/o/0T62Aer//ZOgDrajBp6aNlOWTEajKLjgj/Pcs/vfZD/a++3Pc8hNfZ966EVeh5vP75luDRJUAl0KzJfnopaqbaTuzZiulc2BS5lltFXntu3dcQsXadl59Wn1H+dfYNtrt2d6D/LDF9HkCQw6eXFbr8P9X5W/un5Ol8gz1t39p5pWOPn0vLynbgdnfe8maEQw+UIPJdfxdOd/4oTtVD0IYg8wDywGas0I04T5O3P8/qf2UWwPpkn1PbOT1bN2tFe59EM7TvKf+TRFw+erZ2ey4hpS3hp9qBkqq/tjsSU1OYqucBWB1yynt5QxC42Mdk30pAEIio//zRG3feBzLUX+TTjCKwlH83aI/KbpQBVEHgUGF0j/SitcLofHem8q6AyH0wBhFv4WszuOjy0yK2vc/oRWQoP2X9ve78jfaLnpncbBqQSC6s0HnIRT0a2yNZjfxT8+ir8t+yDsDTWaS6X70GP33+d77stp+I5HtBdwEAAPBl8ECApcAA/DBvfSowAGAB7/05ZAAA/DAIAADMMU3fOuS2ggAAwBjrorKoxWiPBxHMAgAg490Ts0VeePdA+ZfJDKcCh7sBqY88mmjklZeOt9iXPrvx2I2QPRnN2/qzyJ84h4gNcbtfasq5mM1rZr+bBWh2A+bIIX13Z9wqL+nQvFno7v3oq4tJItCed7isUT6C/I7BUn9KP95wDicYBYpcjncrO2c/dmW4tBtw4RiRld1IDxDyYsoXMHxF1w3dyz0Nne8033AOFsT6VgRCafl89fenTZUfbm8CGhrgdDcS7anAsvnkkP0IeCfQ+JzYunky6jhNYj5bl7++4fJvN9WDSKS/292A0wyANyKDI91bfkm3kcH7ckaP/SKW/VHKRZAcI14pP3beu0fPyn/DuZQbWMogNnsc16sziE96f7H/iai7uTf0/3N8lwFz/e13T00Djt4OrInCnkeChXT+qOcKOLA21tJpsv/G8/COnGnw97J9QwbTvd6djYSv7fxEVTuV/LzNhj7nOawv6bfbAGCYEpQ6HxFtuxs6sq9tzOYHobQ6Nje+6vo5BwFrPZ4OgMayS4PPt1NlzdLfbRCYBoBc+NaO4JWPwLEf33oN3unY3InKPQBW6Z7nEZzEmrl4iZjC804lqgePPEOguQcwWghUphxm343wyt/pWpWR0OrR+jvyxavHajfb9pTjbt9bH07Z5/expM4TLWfwb7QQqMoC+UDWXZo/4RgA38LOgUvLJAAQ1Td9y9//0ylxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+g79apuVUsS5ZmwAAAABJRU5ErkJggg==\");\n\n/***/ })\n\n/******/ });\n/************************************************************************/\n/******/ // The module cache\n/******/ var __webpack_module_cache__ = {};\n/******/ \n/******/ // The require function\n/******/ function __webpack_require__(moduleId) {\n/******/ \t// Check if module is in cache\n/******/ \tvar cachedModule = __webpack_module_cache__[moduleId];\n/******/ \tif (cachedModule !== undefined) {\n/******/ \t\treturn cachedModule.exports;\n/******/ \t}\n/******/ \t// Create a new module (and put it into the cache)\n/******/ \tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\tid: moduleId,\n/******/ \t\t// no module.loaded needed\n/******/ \t\texports: {}\n/******/ \t};\n/******/ \n/******/ \t// Execute the module function\n/******/ \t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/ \n/******/ \t// Return the exports of the module\n/******/ \treturn module.exports;\n/******/ }\n/******/ \n/************************************************************************/\n/******/ /* webpack/runtime/compat get default export */\n/******/ (() => {\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = (module) => {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t() => (module['default']) :\n/******/ \t\t\t() => (module);\n/******/ \t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\treturn getter;\n/******/ \t};\n/******/ })();\n/******/ \n/******/ /* webpack/runtime/define property getters */\n/******/ (() => {\n/******/ \t// define getter functions for harmony exports\n/******/ \t__webpack_require__.d = (exports, definition) => {\n/******/ \t\tfor(var key in definition) {\n/******/ \t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t}\n/******/ \t\t}\n/******/ \t};\n/******/ })();\n/******/ \n/******/ /* webpack/runtime/hasOwnProperty shorthand */\n/******/ (() => {\n/******/ \t__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))\n/******/ })();\n/******/ \n/******/ /* webpack/runtime/make namespace object */\n/******/ (() => {\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = (exports) => {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/ })();\n/******/ \n/************************************************************************/\n/******/ \n/******/ // startup\n/******/ // Load entry module and return exports\n/******/ // This entry module is referenced by other modules so it can't be inlined\n/******/ var __webpack_exports__ = __webpack_require__(\"./index.ts\");\n/******/ var __webpack_exports__ActionCompleteEvent = __webpack_exports__.ActionCompleteEvent;\n/******/ var __webpack_exports__ActionContext = __webpack_exports__.ActionContext;\n/******/ var __webpack_exports__ActionQueue = __webpack_exports__.ActionQueue;\n/******/ var __webpack_exports__ActionSequence = __webpack_exports__.ActionSequence;\n/******/ var __webpack_exports__ActionStartEvent = __webpack_exports__.ActionStartEvent;\n/******/ var __webpack_exports__ActionsComponent = __webpack_exports__.ActionsComponent;\n/******/ var __webpack_exports__ActionsSystem = __webpack_exports__.ActionsSystem;\n/******/ var __webpack_exports__ActivateEvent = __webpack_exports__.ActivateEvent;\n/******/ var __webpack_exports__Actor = __webpack_exports__.Actor;\n/******/ var __webpack_exports__ActorEvents = __webpack_exports__.ActorEvents;\n/******/ var __webpack_exports__AddEvent = __webpack_exports__.AddEvent;\n/******/ var __webpack_exports__AddedComponent = __webpack_exports__.AddedComponent;\n/******/ var __webpack_exports__AffineMatrix = __webpack_exports__.AffineMatrix;\n/******/ var __webpack_exports__Animation = __webpack_exports__.Animation;\n/******/ var __webpack_exports__AnimationDirection = __webpack_exports__.AnimationDirection;\n/******/ var __webpack_exports__AnimationEvents = __webpack_exports__.AnimationEvents;\n/******/ var __webpack_exports__AnimationStrategy = __webpack_exports__.AnimationStrategy;\n/******/ var __webpack_exports__ArcadeSolver = __webpack_exports__.ArcadeSolver;\n/******/ var __webpack_exports__AudioContextFactory = __webpack_exports__.AudioContextFactory;\n/******/ var __webpack_exports__Axes = __webpack_exports__.Axes;\n/******/ var __webpack_exports__Axis = __webpack_exports__.Axis;\n/******/ var __webpack_exports__BaseAlign = __webpack_exports__.BaseAlign;\n/******/ var __webpack_exports__BezierCurve = __webpack_exports__.BezierCurve;\n/******/ var __webpack_exports__Blink = __webpack_exports__.Blink;\n/******/ var __webpack_exports__BodyComponent = __webpack_exports__.BodyComponent;\n/******/ var __webpack_exports__BoundingBox = __webpack_exports__.BoundingBox;\n/******/ var __webpack_exports__BrowserComponent = __webpack_exports__.BrowserComponent;\n/******/ var __webpack_exports__BrowserEvents = __webpack_exports__.BrowserEvents;\n/******/ var __webpack_exports__Buttons = __webpack_exports__.Buttons;\n/******/ var __webpack_exports__Camera = __webpack_exports__.Camera;\n/******/ var __webpack_exports__CameraEvents = __webpack_exports__.CameraEvents;\n/******/ var __webpack_exports__Canvas = __webpack_exports__.Canvas;\n/******/ var __webpack_exports__Circle = __webpack_exports__.Circle;\n/******/ var __webpack_exports__CircleCollider = __webpack_exports__.CircleCollider;\n/******/ var __webpack_exports__Clock = __webpack_exports__.Clock;\n/******/ var __webpack_exports__ClosestLineJumpTable = __webpack_exports__.ClosestLineJumpTable;\n/******/ var __webpack_exports__Collider = __webpack_exports__.Collider;\n/******/ var __webpack_exports__ColliderComponent = __webpack_exports__.ColliderComponent;\n/******/ var __webpack_exports__CollisionContact = __webpack_exports__.CollisionContact;\n/******/ var __webpack_exports__CollisionEndEvent = __webpack_exports__.CollisionEndEvent;\n/******/ var __webpack_exports__CollisionGroup = __webpack_exports__.CollisionGroup;\n/******/ var __webpack_exports__CollisionGroupManager = __webpack_exports__.CollisionGroupManager;\n/******/ var __webpack_exports__CollisionJumpTable = __webpack_exports__.CollisionJumpTable;\n/******/ var __webpack_exports__CollisionPostSolveEvent = __webpack_exports__.CollisionPostSolveEvent;\n/******/ var __webpack_exports__CollisionPreSolveEvent = __webpack_exports__.CollisionPreSolveEvent;\n/******/ var __webpack_exports__CollisionStartEvent = __webpack_exports__.CollisionStartEvent;\n/******/ var __webpack_exports__CollisionSystem = __webpack_exports__.CollisionSystem;\n/******/ var __webpack_exports__CollisionType = __webpack_exports__.CollisionType;\n/******/ var __webpack_exports__Color = __webpack_exports__.Color;\n/******/ var __webpack_exports__ColorBlindFlags = __webpack_exports__.ColorBlindFlags;\n/******/ var __webpack_exports__ColorBlindnessMode = __webpack_exports__.ColorBlindnessMode;\n/******/ var __webpack_exports__ColorBlindnessPostProcessor = __webpack_exports__.ColorBlindnessPostProcessor;\n/******/ var __webpack_exports__Component = __webpack_exports__.Component;\n/******/ var __webpack_exports__CompositeCollider = __webpack_exports__.CompositeCollider;\n/******/ var __webpack_exports__ConsoleAppender = __webpack_exports__.ConsoleAppender;\n/******/ var __webpack_exports__ContactConstraintPoint = __webpack_exports__.ContactConstraintPoint;\n/******/ var __webpack_exports__ContactEndEvent = __webpack_exports__.ContactEndEvent;\n/******/ var __webpack_exports__ContactSolveBias = __webpack_exports__.ContactSolveBias;\n/******/ var __webpack_exports__ContactStartEvent = __webpack_exports__.ContactStartEvent;\n/******/ var __webpack_exports__CoordPlane = __webpack_exports__.CoordPlane;\n/******/ var __webpack_exports__CrossFade = __webpack_exports__.CrossFade;\n/******/ var __webpack_exports__CurveBy = __webpack_exports__.CurveBy;\n/******/ var __webpack_exports__CurveTo = __webpack_exports__.CurveTo;\n/******/ var __webpack_exports__DeactivateEvent = __webpack_exports__.DeactivateEvent;\n/******/ var __webpack_exports__Debug = __webpack_exports__.Debug;\n/******/ var __webpack_exports__DebugConfig = __webpack_exports__.DebugConfig;\n/******/ var __webpack_exports__DebugGraphicsComponent = __webpack_exports__.DebugGraphicsComponent;\n/******/ var __webpack_exports__DebugSystem = __webpack_exports__.DebugSystem;\n/******/ var __webpack_exports__DebugText = __webpack_exports__.DebugText;\n/******/ var __webpack_exports__DefaultAntialiasOptions = __webpack_exports__.DefaultAntialiasOptions;\n/******/ var __webpack_exports__DefaultGarbageCollectionOptions = __webpack_exports__.DefaultGarbageCollectionOptions;\n/******/ var __webpack_exports__DefaultLoader = __webpack_exports__.DefaultLoader;\n/******/ var __webpack_exports__DefaultPixelArtOptions = __webpack_exports__.DefaultPixelArtOptions;\n/******/ var __webpack_exports__DegreeOfFreedom = __webpack_exports__.DegreeOfFreedom;\n/******/ var __webpack_exports__Delay = __webpack_exports__.Delay;\n/******/ var __webpack_exports__Detector = __webpack_exports__.Detector;\n/******/ var __webpack_exports__Die = __webpack_exports__.Die;\n/******/ var __webpack_exports__Direction = __webpack_exports__.Direction;\n/******/ var __webpack_exports__Director = __webpack_exports__.Director;\n/******/ var __webpack_exports__DirectorEvents = __webpack_exports__.DirectorEvents;\n/******/ var __webpack_exports__DisplayMode = __webpack_exports__.DisplayMode;\n/******/ var __webpack_exports__DynamicTree = __webpack_exports__.DynamicTree;\n/******/ var __webpack_exports__DynamicTreeCollisionProcessor = __webpack_exports__.DynamicTreeCollisionProcessor;\n/******/ var __webpack_exports__EX_VERSION = __webpack_exports__.EX_VERSION;\n/******/ var __webpack_exports__EaseBy = __webpack_exports__.EaseBy;\n/******/ var __webpack_exports__EaseTo = __webpack_exports__.EaseTo;\n/******/ var __webpack_exports__EasingFunctions = __webpack_exports__.EasingFunctions;\n/******/ var __webpack_exports__EdgeCollider = __webpack_exports__.EdgeCollider;\n/******/ var __webpack_exports__ElasticToActorStrategy = __webpack_exports__.ElasticToActorStrategy;\n/******/ var __webpack_exports__EmitterType = __webpack_exports__.EmitterType;\n/******/ var __webpack_exports__Engine = __webpack_exports__.Engine;\n/******/ var __webpack_exports__EngineEvents = __webpack_exports__.EngineEvents;\n/******/ var __webpack_exports__EnterTriggerEvent = __webpack_exports__.EnterTriggerEvent;\n/******/ var __webpack_exports__EnterViewPortEvent = __webpack_exports__.EnterViewPortEvent;\n/******/ var __webpack_exports__Entity = __webpack_exports__.Entity;\n/******/ var __webpack_exports__EntityEvents = __webpack_exports__.EntityEvents;\n/******/ var __webpack_exports__EntityManager = __webpack_exports__.EntityManager;\n/******/ var __webpack_exports__EventEmitter = __webpack_exports__.EventEmitter;\n/******/ var __webpack_exports__EventTypes = __webpack_exports__.EventTypes;\n/******/ var __webpack_exports__Events = __webpack_exports__.Events;\n/******/ var __webpack_exports__ExResponse = __webpack_exports__.ExResponse;\n/******/ var __webpack_exports__ExcaliburGraphicsContext2DCanvas = __webpack_exports__.ExcaliburGraphicsContext2DCanvas;\n/******/ var __webpack_exports__ExcaliburGraphicsContextWebGL = __webpack_exports__.ExcaliburGraphicsContextWebGL;\n/******/ var __webpack_exports__ExitTriggerEvent = __webpack_exports__.ExitTriggerEvent;\n/******/ var __webpack_exports__ExitViewPortEvent = __webpack_exports__.ExitViewPortEvent;\n/******/ var __webpack_exports__Fade = __webpack_exports__.Fade;\n/******/ var __webpack_exports__FadeInOut = __webpack_exports__.FadeInOut;\n/******/ var __webpack_exports__Flags = __webpack_exports__.Flags;\n/******/ var __webpack_exports__Flash = __webpack_exports__.Flash;\n/******/ var __webpack_exports__Follow = __webpack_exports__.Follow;\n/******/ var __webpack_exports__Font = __webpack_exports__.Font;\n/******/ var __webpack_exports__FontCache = __webpack_exports__.FontCache;\n/******/ var __webpack_exports__FontSource = __webpack_exports__.FontSource;\n/******/ var __webpack_exports__FontStyle = __webpack_exports__.FontStyle;\n/******/ var __webpack_exports__FontUnit = __webpack_exports__.FontUnit;\n/******/ var __webpack_exports__FpsSampler = __webpack_exports__.FpsSampler;\n/******/ var __webpack_exports__FrameStats = __webpack_exports__.FrameStats;\n/******/ var __webpack_exports__Future = __webpack_exports__.Future;\n/******/ var __webpack_exports__GameEvent = __webpack_exports__.GameEvent;\n/******/ var __webpack_exports__GameStartEvent = __webpack_exports__.GameStartEvent;\n/******/ var __webpack_exports__GameStopEvent = __webpack_exports__.GameStopEvent;\n/******/ var __webpack_exports__Gamepad = __webpack_exports__.Gamepad;\n/******/ var __webpack_exports__GamepadAxisEvent = __webpack_exports__.GamepadAxisEvent;\n/******/ var __webpack_exports__GamepadButtonEvent = __webpack_exports__.GamepadButtonEvent;\n/******/ var __webpack_exports__GamepadConnectEvent = __webpack_exports__.GamepadConnectEvent;\n/******/ var __webpack_exports__GamepadDisconnectEvent = __webpack_exports__.GamepadDisconnectEvent;\n/******/ var __webpack_exports__Gamepads = __webpack_exports__.Gamepads;\n/******/ var __webpack_exports__GarbageCollector = __webpack_exports__.GarbageCollector;\n/******/ var __webpack_exports__Gif = __webpack_exports__.Gif;\n/******/ var __webpack_exports__GifParser = __webpack_exports__.GifParser;\n/******/ var __webpack_exports__GlobalCoordinates = __webpack_exports__.GlobalCoordinates;\n/******/ var __webpack_exports__GpuParticleEmitter = __webpack_exports__.GpuParticleEmitter;\n/******/ var __webpack_exports__GpuParticleRenderer = __webpack_exports__.GpuParticleRenderer;\n/******/ var __webpack_exports__Graphic = __webpack_exports__.Graphic;\n/******/ var __webpack_exports__GraphicsComponent = __webpack_exports__.GraphicsComponent;\n/******/ var __webpack_exports__GraphicsGroup = __webpack_exports__.GraphicsGroup;\n/******/ var __webpack_exports__GraphicsSystem = __webpack_exports__.GraphicsSystem;\n/******/ var __webpack_exports__HashColliderProxy = __webpack_exports__.HashColliderProxy;\n/******/ var __webpack_exports__HashGridCell = __webpack_exports__.HashGridCell;\n/******/ var __webpack_exports__HashGridProxy = __webpack_exports__.HashGridProxy;\n/******/ var __webpack_exports__HiddenEvent = __webpack_exports__.HiddenEvent;\n/******/ var __webpack_exports__HorizontalFirst = __webpack_exports__.HorizontalFirst;\n/******/ var __webpack_exports__ImageFiltering = __webpack_exports__.ImageFiltering;\n/******/ var __webpack_exports__ImageSource = __webpack_exports__.ImageSource;\n/******/ var __webpack_exports__ImageSourceAttributeConstants = __webpack_exports__.ImageSourceAttributeConstants;\n/******/ var __webpack_exports__ImageWrapping = __webpack_exports__.ImageWrapping;\n/******/ var __webpack_exports__InitializeEvent = __webpack_exports__.InitializeEvent;\n/******/ var __webpack_exports__InputHost = __webpack_exports__.InputHost;\n/******/ var __webpack_exports__InputMapper = __webpack_exports__.InputMapper;\n/******/ var __webpack_exports__IsometricEntityComponent = __webpack_exports__.IsometricEntityComponent;\n/******/ var __webpack_exports__IsometricEntitySystem = __webpack_exports__.IsometricEntitySystem;\n/******/ var __webpack_exports__IsometricMap = __webpack_exports__.IsometricMap;\n/******/ var __webpack_exports__IsometricTile = __webpack_exports__.IsometricTile;\n/******/ var __webpack_exports__KeyEvent = __webpack_exports__.KeyEvent;\n/******/ var __webpack_exports__Keyboard = __webpack_exports__.Keyboard;\n/******/ var __webpack_exports__Keys = __webpack_exports__.Keys;\n/******/ var __webpack_exports__KillEvent = __webpack_exports__.KillEvent;\n/******/ var __webpack_exports__Label = __webpack_exports__.Label;\n/******/ var __webpack_exports__LimitCameraBoundsStrategy = __webpack_exports__.LimitCameraBoundsStrategy;\n/******/ var __webpack_exports__Line = __webpack_exports__.Line;\n/******/ var __webpack_exports__LineSegment = __webpack_exports__.LineSegment;\n/******/ var __webpack_exports__Loader = __webpack_exports__.Loader;\n/******/ var __webpack_exports__LoaderEvents = __webpack_exports__.LoaderEvents;\n/******/ var __webpack_exports__LockCameraToActorAxisStrategy = __webpack_exports__.LockCameraToActorAxisStrategy;\n/******/ var __webpack_exports__LockCameraToActorStrategy = __webpack_exports__.LockCameraToActorStrategy;\n/******/ var __webpack_exports__LogLevel = __webpack_exports__.LogLevel;\n/******/ var __webpack_exports__Logger = __webpack_exports__.Logger;\n/******/ var __webpack_exports__Material = __webpack_exports__.Material;\n/******/ var __webpack_exports__Matrix = __webpack_exports__.Matrix;\n/******/ var __webpack_exports__MatrixLocations = __webpack_exports__.MatrixLocations;\n/******/ var __webpack_exports__MediaEvent = __webpack_exports__.MediaEvent;\n/******/ var __webpack_exports__Meet = __webpack_exports__.Meet;\n/******/ var __webpack_exports__MotionComponent = __webpack_exports__.MotionComponent;\n/******/ var __webpack_exports__MotionSystem = __webpack_exports__.MotionSystem;\n/******/ var __webpack_exports__MoveBy = __webpack_exports__.MoveBy;\n/******/ var __webpack_exports__MoveByWithOptions = __webpack_exports__.MoveByWithOptions;\n/******/ var __webpack_exports__MoveTo = __webpack_exports__.MoveTo;\n/******/ var __webpack_exports__MoveToWithOptions = __webpack_exports__.MoveToWithOptions;\n/******/ var __webpack_exports__NativePointerButton = __webpack_exports__.NativePointerButton;\n/******/ var __webpack_exports__NativeSoundEvent = __webpack_exports__.NativeSoundEvent;\n/******/ var __webpack_exports__NativeSoundProcessedEvent = __webpack_exports__.NativeSoundProcessedEvent;\n/******/ var __webpack_exports__NineSlice = __webpack_exports__.NineSlice;\n/******/ var __webpack_exports__NineSliceStretch = __webpack_exports__.NineSliceStretch;\n/******/ var __webpack_exports__None = __webpack_exports__.None;\n/******/ var __webpack_exports__Observable = __webpack_exports__.Observable;\n/******/ var __webpack_exports__OffscreenSystem = __webpack_exports__.OffscreenSystem;\n/******/ var __webpack_exports__Pair = __webpack_exports__.Pair;\n/******/ var __webpack_exports__ParallaxComponent = __webpack_exports__.ParallaxComponent;\n/******/ var __webpack_exports__ParallelActions = __webpack_exports__.ParallelActions;\n/******/ var __webpack_exports__Particle = __webpack_exports__.Particle;\n/******/ var __webpack_exports__ParticleEmitter = __webpack_exports__.ParticleEmitter;\n/******/ var __webpack_exports__ParticleRenderer = __webpack_exports__.ParticleRenderer;\n/******/ var __webpack_exports__ParticleTransform = __webpack_exports__.ParticleTransform;\n/******/ var __webpack_exports__PhysicsStats = __webpack_exports__.PhysicsStats;\n/******/ var __webpack_exports__PhysicsWorld = __webpack_exports__.PhysicsWorld;\n/******/ var __webpack_exports__PointerAbstraction = __webpack_exports__.PointerAbstraction;\n/******/ var __webpack_exports__PointerButton = __webpack_exports__.PointerButton;\n/******/ var __webpack_exports__PointerComponent = __webpack_exports__.PointerComponent;\n/******/ var __webpack_exports__PointerEvent = __webpack_exports__.PointerEvent;\n/******/ var __webpack_exports__PointerEventReceiver = __webpack_exports__.PointerEventReceiver;\n/******/ var __webpack_exports__PointerScope = __webpack_exports__.PointerScope;\n/******/ var __webpack_exports__PointerSystem = __webpack_exports__.PointerSystem;\n/******/ var __webpack_exports__PointerType = __webpack_exports__.PointerType;\n/******/ var __webpack_exports__Polygon = __webpack_exports__.Polygon;\n/******/ var __webpack_exports__PolygonCollider = __webpack_exports__.PolygonCollider;\n/******/ var __webpack_exports__Pool = __webpack_exports__.Pool;\n/******/ var __webpack_exports__PostCollisionEvent = __webpack_exports__.PostCollisionEvent;\n/******/ var __webpack_exports__PostDebugDrawEvent = __webpack_exports__.PostDebugDrawEvent;\n/******/ var __webpack_exports__PostDrawEvent = __webpack_exports__.PostDrawEvent;\n/******/ var __webpack_exports__PostFrameEvent = __webpack_exports__.PostFrameEvent;\n/******/ var __webpack_exports__PostKillEvent = __webpack_exports__.PostKillEvent;\n/******/ var __webpack_exports__PostTransformDrawEvent = __webpack_exports__.PostTransformDrawEvent;\n/******/ var __webpack_exports__PostUpdateEvent = __webpack_exports__.PostUpdateEvent;\n/******/ var __webpack_exports__PreCollisionEvent = __webpack_exports__.PreCollisionEvent;\n/******/ var __webpack_exports__PreDebugDrawEvent = __webpack_exports__.PreDebugDrawEvent;\n/******/ var __webpack_exports__PreDrawEvent = __webpack_exports__.PreDrawEvent;\n/******/ var __webpack_exports__PreFrameEvent = __webpack_exports__.PreFrameEvent;\n/******/ var __webpack_exports__PreKillEvent = __webpack_exports__.PreKillEvent;\n/******/ var __webpack_exports__PreLoadEvent = __webpack_exports__.PreLoadEvent;\n/******/ var __webpack_exports__PreTransformDrawEvent = __webpack_exports__.PreTransformDrawEvent;\n/******/ var __webpack_exports__PreUpdateEvent = __webpack_exports__.PreUpdateEvent;\n/******/ var __webpack_exports__Projection = __webpack_exports__.Projection;\n/******/ var __webpack_exports__QuadIndexBuffer = __webpack_exports__.QuadIndexBuffer;\n/******/ var __webpack_exports__QuadTree = __webpack_exports__.QuadTree;\n/******/ var __webpack_exports__Query = __webpack_exports__.Query;\n/******/ var __webpack_exports__QueryManager = __webpack_exports__.QueryManager;\n/******/ var __webpack_exports__RadiusAroundActorStrategy = __webpack_exports__.RadiusAroundActorStrategy;\n/******/ var __webpack_exports__Random = __webpack_exports__.Random;\n/******/ var __webpack_exports__Raster = __webpack_exports__.Raster;\n/******/ var __webpack_exports__Ray = __webpack_exports__.Ray;\n/******/ var __webpack_exports__RealisticSolver = __webpack_exports__.RealisticSolver;\n/******/ var __webpack_exports__Rectangle = __webpack_exports__.Rectangle;\n/******/ var __webpack_exports__RemoveEvent = __webpack_exports__.RemoveEvent;\n/******/ var __webpack_exports__RemovedComponent = __webpack_exports__.RemovedComponent;\n/******/ var __webpack_exports__Repeat = __webpack_exports__.Repeat;\n/******/ var __webpack_exports__RepeatForever = __webpack_exports__.RepeatForever;\n/******/ var __webpack_exports__Resolution = __webpack_exports__.Resolution;\n/******/ var __webpack_exports__Resource = __webpack_exports__.Resource;\n/******/ var __webpack_exports__ResourceEvents = __webpack_exports__.ResourceEvents;\n/******/ var __webpack_exports__RotateBy = __webpack_exports__.RotateBy;\n/******/ var __webpack_exports__RotateByWithOptions = __webpack_exports__.RotateByWithOptions;\n/******/ var __webpack_exports__RotateTo = __webpack_exports__.RotateTo;\n/******/ var __webpack_exports__RotateToWithOptions = __webpack_exports__.RotateToWithOptions;\n/******/ var __webpack_exports__RotationType = __webpack_exports__.RotationType;\n/******/ var __webpack_exports__ScaleBy = __webpack_exports__.ScaleBy;\n/******/ var __webpack_exports__ScaleByWithOptions = __webpack_exports__.ScaleByWithOptions;\n/******/ var __webpack_exports__ScaleTo = __webpack_exports__.ScaleTo;\n/******/ var __webpack_exports__ScaleToWithOptions = __webpack_exports__.ScaleToWithOptions;\n/******/ var __webpack_exports__Scene = __webpack_exports__.Scene;\n/******/ var __webpack_exports__SceneEvents = __webpack_exports__.SceneEvents;\n/******/ var __webpack_exports__Screen = __webpack_exports__.Screen;\n/******/ var __webpack_exports__ScreenAppender = __webpack_exports__.ScreenAppender;\n/******/ var __webpack_exports__ScreenElement = __webpack_exports__.ScreenElement;\n/******/ var __webpack_exports__ScreenEvents = __webpack_exports__.ScreenEvents;\n/******/ var __webpack_exports__ScreenShader = __webpack_exports__.ScreenShader;\n/******/ var __webpack_exports__ScrollPreventionMode = __webpack_exports__.ScrollPreventionMode;\n/******/ var __webpack_exports__Semaphore = __webpack_exports__.Semaphore;\n/******/ var __webpack_exports__SeparatingAxis = __webpack_exports__.SeparatingAxis;\n/******/ var __webpack_exports__SeparationInfo = __webpack_exports__.SeparationInfo;\n/******/ var __webpack_exports__Shader = __webpack_exports__.Shader;\n/******/ var __webpack_exports__Shape = __webpack_exports__.Shape;\n/******/ var __webpack_exports__Side = __webpack_exports__.Side;\n/******/ var __webpack_exports__Slide = __webpack_exports__.Slide;\n/******/ var __webpack_exports__SolverStrategy = __webpack_exports__.SolverStrategy;\n/******/ var __webpack_exports__Sound = __webpack_exports__.Sound;\n/******/ var __webpack_exports__SoundEvents = __webpack_exports__.SoundEvents;\n/******/ var __webpack_exports__SparseHashGrid = __webpack_exports__.SparseHashGrid;\n/******/ var __webpack_exports__SparseHashGridCollisionProcessor = __webpack_exports__.SparseHashGridCollisionProcessor;\n/******/ var __webpack_exports__SpatialPartitionStrategy = __webpack_exports__.SpatialPartitionStrategy;\n/******/ var __webpack_exports__Sprite = __webpack_exports__.Sprite;\n/******/ var __webpack_exports__SpriteFont = __webpack_exports__.SpriteFont;\n/******/ var __webpack_exports__SpriteSheet = __webpack_exports__.SpriteSheet;\n/******/ var __webpack_exports__StandardClock = __webpack_exports__.StandardClock;\n/******/ var __webpack_exports__StateMachine = __webpack_exports__.StateMachine;\n/******/ var __webpack_exports__StrategyContainer = __webpack_exports__.StrategyContainer;\n/******/ var __webpack_exports__Stream = __webpack_exports__.Stream;\n/******/ var __webpack_exports__System = __webpack_exports__.System;\n/******/ var __webpack_exports__SystemManager = __webpack_exports__.SystemManager;\n/******/ var __webpack_exports__SystemPriority = __webpack_exports__.SystemPriority;\n/******/ var __webpack_exports__SystemType = __webpack_exports__.SystemType;\n/******/ var __webpack_exports__TagQuery = __webpack_exports__.TagQuery;\n/******/ var __webpack_exports__TestClock = __webpack_exports__.TestClock;\n/******/ var __webpack_exports__Text = __webpack_exports__.Text;\n/******/ var __webpack_exports__TextAlign = __webpack_exports__.TextAlign;\n/******/ var __webpack_exports__TextureLoader = __webpack_exports__.TextureLoader;\n/******/ var __webpack_exports__Tile = __webpack_exports__.Tile;\n/******/ var __webpack_exports__TileMap = __webpack_exports__.TileMap;\n/******/ var __webpack_exports__TileMapEvents = __webpack_exports__.TileMapEvents;\n/******/ var __webpack_exports__TiledAnimation = __webpack_exports__.TiledAnimation;\n/******/ var __webpack_exports__TiledSprite = __webpack_exports__.TiledSprite;\n/******/ var __webpack_exports__Timer = __webpack_exports__.Timer;\n/******/ var __webpack_exports__Toaster = __webpack_exports__.Toaster;\n/******/ var __webpack_exports__Transform = __webpack_exports__.Transform;\n/******/ var __webpack_exports__TransformComponent = __webpack_exports__.TransformComponent;\n/******/ var __webpack_exports__Transition = __webpack_exports__.Transition;\n/******/ var __webpack_exports__TreeNode = __webpack_exports__.TreeNode;\n/******/ var __webpack_exports__Trigger = __webpack_exports__.Trigger;\n/******/ var __webpack_exports__TriggerEvents = __webpack_exports__.TriggerEvents;\n/******/ var __webpack_exports__TwoPI = __webpack_exports__.TwoPI;\n/******/ var __webpack_exports__Util = __webpack_exports__.Util;\n/******/ var __webpack_exports__Vector = __webpack_exports__.Vector;\n/******/ var __webpack_exports__VectorView = __webpack_exports__.VectorView;\n/******/ var __webpack_exports__VertexBuffer = __webpack_exports__.VertexBuffer;\n/******/ var __webpack_exports__VertexLayout = __webpack_exports__.VertexLayout;\n/******/ var __webpack_exports__VerticalFirst = __webpack_exports__.VerticalFirst;\n/******/ var __webpack_exports__VisibleEvent = __webpack_exports__.VisibleEvent;\n/******/ var __webpack_exports__WebAudio = __webpack_exports__.WebAudio;\n/******/ var __webpack_exports__WebAudioInstance = __webpack_exports__.WebAudioInstance;\n/******/ var __webpack_exports__WheelDeltaMode = __webpack_exports__.WheelDeltaMode;\n/******/ var __webpack_exports__WheelEvent = __webpack_exports__.WheelEvent;\n/******/ var __webpack_exports__World = __webpack_exports__.World;\n/******/ var __webpack_exports__approximatelyEqual = __webpack_exports__.approximatelyEqual;\n/******/ var __webpack_exports__assert = __webpack_exports__.assert;\n/******/ var __webpack_exports__canonicalizeAngle = __webpack_exports__.canonicalizeAngle;\n/******/ var __webpack_exports__clamp = __webpack_exports__.clamp;\n/******/ var __webpack_exports__coroutine = __webpack_exports__.coroutine;\n/******/ var __webpack_exports__createId = __webpack_exports__.createId;\n/******/ var __webpack_exports__frac = __webpack_exports__.frac;\n/******/ var __webpack_exports__getDefaultPhysicsConfig = __webpack_exports__.getDefaultPhysicsConfig;\n/******/ var __webpack_exports__hasGraphicsTick = __webpack_exports__.hasGraphicsTick;\n/******/ var __webpack_exports__hasOnAdd = __webpack_exports__.hasOnAdd;\n/******/ var __webpack_exports__hasOnInitialize = __webpack_exports__.hasOnInitialize;\n/******/ var __webpack_exports__hasOnPostUpdate = __webpack_exports__.hasOnPostUpdate;\n/******/ var __webpack_exports__hasOnPreUpdate = __webpack_exports__.hasOnPreUpdate;\n/******/ var __webpack_exports__hasOnRemove = __webpack_exports__.hasOnRemove;\n/******/ var __webpack_exports__hasPostDraw = __webpack_exports__.hasPostDraw;\n/******/ var __webpack_exports__hasPreDraw = __webpack_exports__.hasPreDraw;\n/******/ var __webpack_exports__has_add = __webpack_exports__.has_add;\n/******/ var __webpack_exports__has_initialize = __webpack_exports__.has_initialize;\n/******/ var __webpack_exports__has_postupdate = __webpack_exports__.has_postupdate;\n/******/ var __webpack_exports__has_preupdate = __webpack_exports__.has_preupdate;\n/******/ var __webpack_exports__has_remove = __webpack_exports__.has_remove;\n/******/ var __webpack_exports__inverseLerp = __webpack_exports__.inverseLerp;\n/******/ var __webpack_exports__inverseLerpVector = __webpack_exports__.inverseLerpVector;\n/******/ var __webpack_exports__isActor = __webpack_exports__.isActor;\n/******/ var __webpack_exports__isAddedComponent = __webpack_exports__.isAddedComponent;\n/******/ var __webpack_exports__isComponentCtor = __webpack_exports__.isComponentCtor;\n/******/ var __webpack_exports__isLoaderConstructor = __webpack_exports__.isLoaderConstructor;\n/******/ var __webpack_exports__isMoveByOptions = __webpack_exports__.isMoveByOptions;\n/******/ var __webpack_exports__isMoveToOptions = __webpack_exports__.isMoveToOptions;\n/******/ var __webpack_exports__isRemovedComponent = __webpack_exports__.isRemovedComponent;\n/******/ var __webpack_exports__isRotateByOptions = __webpack_exports__.isRotateByOptions;\n/******/ var __webpack_exports__isRotateToOptions = __webpack_exports__.isRotateToOptions;\n/******/ var __webpack_exports__isScaleByOptions = __webpack_exports__.isScaleByOptions;\n/******/ var __webpack_exports__isScaleToOptions = __webpack_exports__.isScaleToOptions;\n/******/ var __webpack_exports__isSceneConstructor = __webpack_exports__.isSceneConstructor;\n/******/ var __webpack_exports__isScreenElement = __webpack_exports__.isScreenElement;\n/******/ var __webpack_exports__isSystemConstructor = __webpack_exports__.isSystemConstructor;\n/******/ var __webpack_exports__lerp = __webpack_exports__.lerp;\n/******/ var __webpack_exports__lerpAngle = __webpack_exports__.lerpAngle;\n/******/ var __webpack_exports__lerpVector = __webpack_exports__.lerpVector;\n/******/ var __webpack_exports__maxMessages = __webpack_exports__.maxMessages;\n/******/ var __webpack_exports__nextActionId = __webpack_exports__.nextActionId;\n/******/ var __webpack_exports__obsolete = __webpack_exports__.obsolete;\n/******/ var __webpack_exports__parseImageFiltering = __webpack_exports__.parseImageFiltering;\n/******/ var __webpack_exports__parseImageWrapping = __webpack_exports__.parseImageWrapping;\n/******/ var __webpack_exports__pixelSnapEpsilon = __webpack_exports__.pixelSnapEpsilon;\n/******/ var __webpack_exports__randomInRange = __webpack_exports__.randomInRange;\n/******/ var __webpack_exports__randomIntInRange = __webpack_exports__.randomIntInRange;\n/******/ var __webpack_exports__range = __webpack_exports__.range;\n/******/ var __webpack_exports__remap = __webpack_exports__.remap;\n/******/ var __webpack_exports__remapVector = __webpack_exports__.remapVector;\n/******/ var __webpack_exports__resetObsoleteCounter = __webpack_exports__.resetObsoleteCounter;\n/******/ var __webpack_exports__sign = __webpack_exports__.sign;\n/******/ var __webpack_exports__toDegrees = __webpack_exports__.toDegrees;\n/******/ var __webpack_exports__toRadians = __webpack_exports__.toRadians;\n/******/ var __webpack_exports__vec = __webpack_exports__.vec;\n/******/ var __webpack_exports__webgl = __webpack_exports__.webgl;\n/******/ export { __webpack_exports__ActionCompleteEvent as ActionCompleteEvent, __webpack_exports__ActionContext as ActionContext, __webpack_exports__ActionQueue as ActionQueue, __webpack_exports__ActionSequence as ActionSequence, __webpack_exports__ActionStartEvent as ActionStartEvent, __webpack_exports__ActionsComponent as ActionsComponent, __webpack_exports__ActionsSystem as ActionsSystem, __webpack_exports__ActivateEvent as ActivateEvent, __webpack_exports__Actor as Actor, __webpack_exports__ActorEvents as ActorEvents, __webpack_exports__AddEvent as AddEvent, __webpack_exports__AddedComponent as AddedComponent, __webpack_exports__AffineMatrix as AffineMatrix, __webpack_exports__Animation as Animation, __webpack_exports__AnimationDirection as AnimationDirection, __webpack_exports__AnimationEvents as AnimationEvents, __webpack_exports__AnimationStrategy as AnimationStrategy, __webpack_exports__ArcadeSolver as ArcadeSolver, __webpack_exports__AudioContextFactory as AudioContextFactory, __webpack_exports__Axes as Axes, __webpack_exports__Axis as Axis, __webpack_exports__BaseAlign as BaseAlign, __webpack_exports__BezierCurve as BezierCurve, __webpack_exports__Blink as Blink, __webpack_exports__BodyComponent as BodyComponent, __webpack_exports__BoundingBox as BoundingBox, __webpack_exports__BrowserComponent as BrowserComponent, __webpack_exports__BrowserEvents as BrowserEvents, __webpack_exports__Buttons as Buttons, __webpack_exports__Camera as Camera, __webpack_exports__CameraEvents as CameraEvents, __webpack_exports__Canvas as Canvas, __webpack_exports__Circle as Circle, __webpack_exports__CircleCollider as CircleCollider, __webpack_exports__Clock as Clock, __webpack_exports__ClosestLineJumpTable as ClosestLineJumpTable, __webpack_exports__Collider as Collider, __webpack_exports__ColliderComponent as ColliderComponent, __webpack_exports__CollisionContact as CollisionContact, __webpack_exports__CollisionEndEvent as CollisionEndEvent, __webpack_exports__CollisionGroup as CollisionGroup, __webpack_exports__CollisionGroupManager as CollisionGroupManager, __webpack_exports__CollisionJumpTable as CollisionJumpTable, __webpack_exports__CollisionPostSolveEvent as CollisionPostSolveEvent, __webpack_exports__CollisionPreSolveEvent as CollisionPreSolveEvent, __webpack_exports__CollisionStartEvent as CollisionStartEvent, __webpack_exports__CollisionSystem as CollisionSystem, __webpack_exports__CollisionType as CollisionType, __webpack_exports__Color as Color, __webpack_exports__ColorBlindFlags as ColorBlindFlags, __webpack_exports__ColorBlindnessMode as ColorBlindnessMode, __webpack_exports__ColorBlindnessPostProcessor as ColorBlindnessPostProcessor, __webpack_exports__Component as Component, __webpack_exports__CompositeCollider as CompositeCollider, __webpack_exports__ConsoleAppender as ConsoleAppender, __webpack_exports__ContactConstraintPoint as ContactConstraintPoint, __webpack_exports__ContactEndEvent as ContactEndEvent, __webpack_exports__ContactSolveBias as ContactSolveBias, __webpack_exports__ContactStartEvent as ContactStartEvent, __webpack_exports__CoordPlane as CoordPlane, __webpack_exports__CrossFade as CrossFade, __webpack_exports__CurveBy as CurveBy, __webpack_exports__CurveTo as CurveTo, __webpack_exports__DeactivateEvent as DeactivateEvent, __webpack_exports__Debug as Debug, __webpack_exports__DebugConfig as DebugConfig, __webpack_exports__DebugGraphicsComponent as DebugGraphicsComponent, __webpack_exports__DebugSystem as DebugSystem, __webpack_exports__DebugText as DebugText, __webpack_exports__DefaultAntialiasOptions as DefaultAntialiasOptions, __webpack_exports__DefaultGarbageCollectionOptions as DefaultGarbageCollectionOptions, __webpack_exports__DefaultLoader as DefaultLoader, __webpack_exports__DefaultPixelArtOptions as DefaultPixelArtOptions, __webpack_exports__DegreeOfFreedom as DegreeOfFreedom, __webpack_exports__Delay as Delay, __webpack_exports__Detector as Detector, __webpack_exports__Die as Die, __webpack_exports__Direction as Direction, __webpack_exports__Director as Director, __webpack_exports__DirectorEvents as DirectorEvents, __webpack_exports__DisplayMode as DisplayMode, __webpack_exports__DynamicTree as DynamicTree, __webpack_exports__DynamicTreeCollisionProcessor as DynamicTreeCollisionProcessor, __webpack_exports__EX_VERSION as EX_VERSION, __webpack_exports__EaseBy as EaseBy, __webpack_exports__EaseTo as EaseTo, __webpack_exports__EasingFunctions as EasingFunctions, __webpack_exports__EdgeCollider as EdgeCollider, __webpack_exports__ElasticToActorStrategy as ElasticToActorStrategy, __webpack_exports__EmitterType as EmitterType, __webpack_exports__Engine as Engine, __webpack_exports__EngineEvents as EngineEvents, __webpack_exports__EnterTriggerEvent as EnterTriggerEvent, __webpack_exports__EnterViewPortEvent as EnterViewPortEvent, __webpack_exports__Entity as Entity, __webpack_exports__EntityEvents as EntityEvents, __webpack_exports__EntityManager as EntityManager, __webpack_exports__EventEmitter as EventEmitter, __webpack_exports__EventTypes as EventTypes, __webpack_exports__Events as Events, __webpack_exports__ExResponse as ExResponse, __webpack_exports__ExcaliburGraphicsContext2DCanvas as ExcaliburGraphicsContext2DCanvas, __webpack_exports__ExcaliburGraphicsContextWebGL as ExcaliburGraphicsContextWebGL, __webpack_exports__ExitTriggerEvent as ExitTriggerEvent, __webpack_exports__ExitViewPortEvent as ExitViewPortEvent, __webpack_exports__Fade as Fade, __webpack_exports__FadeInOut as FadeInOut, __webpack_exports__Flags as Flags, __webpack_exports__Flash as Flash, __webpack_exports__Follow as Follow, __webpack_exports__Font as Font, __webpack_exports__FontCache as FontCache, __webpack_exports__FontSource as FontSource, __webpack_exports__FontStyle as FontStyle, __webpack_exports__FontUnit as FontUnit, __webpack_exports__FpsSampler as FpsSampler, __webpack_exports__FrameStats as FrameStats, __webpack_exports__Future as Future, __webpack_exports__GameEvent as GameEvent, __webpack_exports__GameStartEvent as GameStartEvent, __webpack_exports__GameStopEvent as GameStopEvent, __webpack_exports__Gamepad as Gamepad, __webpack_exports__GamepadAxisEvent as GamepadAxisEvent, __webpack_exports__GamepadButtonEvent as GamepadButtonEvent, __webpack_exports__GamepadConnectEvent as GamepadConnectEvent, __webpack_exports__GamepadDisconnectEvent as GamepadDisconnectEvent, __webpack_exports__Gamepads as Gamepads, __webpack_exports__GarbageCollector as GarbageCollector, __webpack_exports__Gif as Gif, __webpack_exports__GifParser as GifParser, __webpack_exports__GlobalCoordinates as GlobalCoordinates, __webpack_exports__GpuParticleEmitter as GpuParticleEmitter, __webpack_exports__GpuParticleRenderer as GpuParticleRenderer, __webpack_exports__Graphic as Graphic, __webpack_exports__GraphicsComponent as GraphicsComponent, __webpack_exports__GraphicsGroup as GraphicsGroup, __webpack_exports__GraphicsSystem as GraphicsSystem, __webpack_exports__HashColliderProxy as HashColliderProxy, __webpack_exports__HashGridCell as HashGridCell, __webpack_exports__HashGridProxy as HashGridProxy, __webpack_exports__HiddenEvent as HiddenEvent, __webpack_exports__HorizontalFirst as HorizontalFirst, __webpack_exports__ImageFiltering as ImageFiltering, __webpack_exports__ImageSource as ImageSource, __webpack_exports__ImageSourceAttributeConstants as ImageSourceAttributeConstants, __webpack_exports__ImageWrapping as ImageWrapping, __webpack_exports__InitializeEvent as InitializeEvent, __webpack_exports__InputHost as InputHost, __webpack_exports__InputMapper as InputMapper, __webpack_exports__IsometricEntityComponent as IsometricEntityComponent, __webpack_exports__IsometricEntitySystem as IsometricEntitySystem, __webpack_exports__IsometricMap as IsometricMap, __webpack_exports__IsometricTile as IsometricTile, __webpack_exports__KeyEvent as KeyEvent, __webpack_exports__Keyboard as Keyboard, __webpack_exports__Keys as Keys, __webpack_exports__KillEvent as KillEvent, __webpack_exports__Label as Label, __webpack_exports__LimitCameraBoundsStrategy as LimitCameraBoundsStrategy, __webpack_exports__Line as Line, __webpack_exports__LineSegment as LineSegment, __webpack_exports__Loader as Loader, __webpack_exports__LoaderEvents as LoaderEvents, __webpack_exports__LockCameraToActorAxisStrategy as LockCameraToActorAxisStrategy, __webpack_exports__LockCameraToActorStrategy as LockCameraToActorStrategy, __webpack_exports__LogLevel as LogLevel, __webpack_exports__Logger as Logger, __webpack_exports__Material as Material, __webpack_exports__Matrix as Matrix, __webpack_exports__MatrixLocations as MatrixLocations, __webpack_exports__MediaEvent as MediaEvent, __webpack_exports__Meet as Meet, __webpack_exports__MotionComponent as MotionComponent, __webpack_exports__MotionSystem as MotionSystem, __webpack_exports__MoveBy as MoveBy, __webpack_exports__MoveByWithOptions as MoveByWithOptions, __webpack_exports__MoveTo as MoveTo, __webpack_exports__MoveToWithOptions as MoveToWithOptions, __webpack_exports__NativePointerButton as NativePointerButton, __webpack_exports__NativeSoundEvent as NativeSoundEvent, __webpack_exports__NativeSoundProcessedEvent as NativeSoundProcessedEvent, __webpack_exports__NineSlice as NineSlice, __webpack_exports__NineSliceStretch as NineSliceStretch, __webpack_exports__None as None, __webpack_exports__Observable as Observable, __webpack_exports__OffscreenSystem as OffscreenSystem, __webpack_exports__Pair as Pair, __webpack_exports__ParallaxComponent as ParallaxComponent, __webpack_exports__ParallelActions as ParallelActions, __webpack_exports__Particle as Particle, __webpack_exports__ParticleEmitter as ParticleEmitter, __webpack_exports__ParticleRenderer as ParticleRenderer, __webpack_exports__ParticleTransform as ParticleTransform, __webpack_exports__PhysicsStats as PhysicsStats, __webpack_exports__PhysicsWorld as PhysicsWorld, __webpack_exports__PointerAbstraction as PointerAbstraction, __webpack_exports__PointerButton as PointerButton, __webpack_exports__PointerComponent as PointerComponent, __webpack_exports__PointerEvent as PointerEvent, __webpack_exports__PointerEventReceiver as PointerEventReceiver, __webpack_exports__PointerScope as PointerScope, __webpack_exports__PointerSystem as PointerSystem, __webpack_exports__PointerType as PointerType, __webpack_exports__Polygon as Polygon, __webpack_exports__PolygonCollider as PolygonCollider, __webpack_exports__Pool as Pool, __webpack_exports__PostCollisionEvent as PostCollisionEvent, __webpack_exports__PostDebugDrawEvent as PostDebugDrawEvent, __webpack_exports__PostDrawEvent as PostDrawEvent, __webpack_exports__PostFrameEvent as PostFrameEvent, __webpack_exports__PostKillEvent as PostKillEvent, __webpack_exports__PostTransformDrawEvent as PostTransformDrawEvent, __webpack_exports__PostUpdateEvent as PostUpdateEvent, __webpack_exports__PreCollisionEvent as PreCollisionEvent, __webpack_exports__PreDebugDrawEvent as PreDebugDrawEvent, __webpack_exports__PreDrawEvent as PreDrawEvent, __webpack_exports__PreFrameEvent as PreFrameEvent, __webpack_exports__PreKillEvent as PreKillEvent, __webpack_exports__PreLoadEvent as PreLoadEvent, __webpack_exports__PreTransformDrawEvent as PreTransformDrawEvent, __webpack_exports__PreUpdateEvent as PreUpdateEvent, __webpack_exports__Projection as Projection, __webpack_exports__QuadIndexBuffer as QuadIndexBuffer, __webpack_exports__QuadTree as QuadTree, __webpack_exports__Query as Query, __webpack_exports__QueryManager as QueryManager, __webpack_exports__RadiusAroundActorStrategy as RadiusAroundActorStrategy, __webpack_exports__Random as Random, __webpack_exports__Raster as Raster, __webpack_exports__Ray as Ray, __webpack_exports__RealisticSolver as RealisticSolver, __webpack_exports__Rectangle as Rectangle, __webpack_exports__RemoveEvent as RemoveEvent, __webpack_exports__RemovedComponent as RemovedComponent, __webpack_exports__Repeat as Repeat, __webpack_exports__RepeatForever as RepeatForever, __webpack_exports__Resolution as Resolution, __webpack_exports__Resource as Resource, __webpack_exports__ResourceEvents as ResourceEvents, __webpack_exports__RotateBy as RotateBy, __webpack_exports__RotateByWithOptions as RotateByWithOptions, __webpack_exports__RotateTo as RotateTo, __webpack_exports__RotateToWithOptions as RotateToWithOptions, __webpack_exports__RotationType as RotationType, __webpack_exports__ScaleBy as ScaleBy, __webpack_exports__ScaleByWithOptions as ScaleByWithOptions, __webpack_exports__ScaleTo as ScaleTo, __webpack_exports__ScaleToWithOptions as ScaleToWithOptions, __webpack_exports__Scene as Scene, __webpack_exports__SceneEvents as SceneEvents, __webpack_exports__Screen as Screen, __webpack_exports__ScreenAppender as ScreenAppender, __webpack_exports__ScreenElement as ScreenElement, __webpack_exports__ScreenEvents as ScreenEvents, __webpack_exports__ScreenShader as ScreenShader, __webpack_exports__ScrollPreventionMode as ScrollPreventionMode, __webpack_exports__Semaphore as Semaphore, __webpack_exports__SeparatingAxis as SeparatingAxis, __webpack_exports__SeparationInfo as SeparationInfo, __webpack_exports__Shader as Shader, __webpack_exports__Shape as Shape, __webpack_exports__Side as Side, __webpack_exports__Slide as Slide, __webpack_exports__SolverStrategy as SolverStrategy, __webpack_exports__Sound as Sound, __webpack_exports__SoundEvents as SoundEvents, __webpack_exports__SparseHashGrid as SparseHashGrid, __webpack_exports__SparseHashGridCollisionProcessor as SparseHashGridCollisionProcessor, __webpack_exports__SpatialPartitionStrategy as SpatialPartitionStrategy, __webpack_exports__Sprite as Sprite, __webpack_exports__SpriteFont as SpriteFont, __webpack_exports__SpriteSheet as SpriteSheet, __webpack_exports__StandardClock as StandardClock, __webpack_exports__StateMachine as StateMachine, __webpack_exports__StrategyContainer as StrategyContainer, __webpack_exports__Stream as Stream, __webpack_exports__System as System, __webpack_exports__SystemManager as SystemManager, __webpack_exports__SystemPriority as SystemPriority, __webpack_exports__SystemType as SystemType, __webpack_exports__TagQuery as TagQuery, __webpack_exports__TestClock as TestClock, __webpack_exports__Text as Text, __webpack_exports__TextAlign as TextAlign, __webpack_exports__TextureLoader as TextureLoader, __webpack_exports__Tile as Tile, __webpack_exports__TileMap as TileMap, __webpack_exports__TileMapEvents as TileMapEvents, __webpack_exports__TiledAnimation as TiledAnimation, __webpack_exports__TiledSprite as TiledSprite, __webpack_exports__Timer as Timer, __webpack_exports__Toaster as Toaster, __webpack_exports__Transform as Transform, __webpack_exports__TransformComponent as TransformComponent, __webpack_exports__Transition as Transition, __webpack_exports__TreeNode as TreeNode, __webpack_exports__Trigger as Trigger, __webpack_exports__TriggerEvents as TriggerEvents, __webpack_exports__TwoPI as TwoPI, __webpack_exports__Util as Util, __webpack_exports__Vector as Vector, __webpack_exports__VectorView as VectorView, __webpack_exports__VertexBuffer as VertexBuffer, __webpack_exports__VertexLayout as VertexLayout, __webpack_exports__VerticalFirst as VerticalFirst, __webpack_exports__VisibleEvent as VisibleEvent, __webpack_exports__WebAudio as WebAudio, __webpack_exports__WebAudioInstance as WebAudioInstance, __webpack_exports__WheelDeltaMode as WheelDeltaMode, __webpack_exports__WheelEvent as WheelEvent, __webpack_exports__World as World, __webpack_exports__approximatelyEqual as approximatelyEqual, __webpack_exports__assert as assert, __webpack_exports__canonicalizeAngle as canonicalizeAngle, __webpack_exports__clamp as clamp, __webpack_exports__coroutine as coroutine, __webpack_exports__createId as createId, __webpack_exports__frac as frac, __webpack_exports__getDefaultPhysicsConfig as getDefaultPhysicsConfig, __webpack_exports__hasGraphicsTick as hasGraphicsTick, __webpack_exports__hasOnAdd as hasOnAdd, __webpack_exports__hasOnInitialize as hasOnInitialize, __webpack_exports__hasOnPostUpdate as hasOnPostUpdate, __webpack_exports__hasOnPreUpdate as hasOnPreUpdate, __webpack_exports__hasOnRemove as hasOnRemove, __webpack_exports__hasPostDraw as hasPostDraw, __webpack_exports__hasPreDraw as hasPreDraw, __webpack_exports__has_add as has_add, __webpack_exports__has_initialize as has_initialize, __webpack_exports__has_postupdate as has_postupdate, __webpack_exports__has_preupdate as has_preupdate, __webpack_exports__has_remove as has_remove, __webpack_exports__inverseLerp as inverseLerp, __webpack_exports__inverseLerpVector as inverseLerpVector, __webpack_exports__isActor as isActor, __webpack_exports__isAddedComponent as isAddedComponent, __webpack_exports__isComponentCtor as isComponentCtor, __webpack_exports__isLoaderConstructor as isLoaderConstructor, __webpack_exports__isMoveByOptions as isMoveByOptions, __webpack_exports__isMoveToOptions as isMoveToOptions, __webpack_exports__isRemovedComponent as isRemovedComponent, __webpack_exports__isRotateByOptions as isRotateByOptions, __webpack_exports__isRotateToOptions as isRotateToOptions, __webpack_exports__isScaleByOptions as isScaleByOptions, __webpack_exports__isScaleToOptions as isScaleToOptions, __webpack_exports__isSceneConstructor as isSceneConstructor, __webpack_exports__isScreenElement as isScreenElement, __webpack_exports__isSystemConstructor as isSystemConstructor, __webpack_exports__lerp as lerp, __webpack_exports__lerpAngle as lerpAngle, __webpack_exports__lerpVector as lerpVector, __webpack_exports__maxMessages as maxMessages, __webpack_exports__nextActionId as nextActionId, __webpack_exports__obsolete as obsolete, __webpack_exports__parseImageFiltering as parseImageFiltering, __webpack_exports__parseImageWrapping as parseImageWrapping, __webpack_exports__pixelSnapEpsilon as pixelSnapEpsilon, __webpack_exports__randomInRange as randomInRange, __webpack_exports__randomIntInRange as randomIntInRange, __webpack_exports__range as range, __webpack_exports__remap as remap, __webpack_exports__remapVector as remapVector, __webpack_exports__resetObsoleteCounter as resetObsoleteCounter, __webpack_exports__sign as sign, __webpack_exports__toDegrees as toDegrees, __webpack_exports__toRadians as toRadians, __webpack_exports__vec as vec, __webpack_exports__webgl as webgl };\n/******/ \n\n//# sourceMappingURL=excalibur.development.js.map","var util;\n(function (util) {\n util.assertEqual = (val) => val;\n function assertIs(_arg) { }\n util.assertIs = assertIs;\n function assertNever(_x) {\n throw new Error();\n }\n util.assertNever = assertNever;\n util.arrayToEnum = (items) => {\n const obj = {};\n for (const item of items) {\n obj[item] = item;\n }\n return obj;\n };\n util.getValidEnumValues = (obj) => {\n const validKeys = util.objectKeys(obj).filter((k) => typeof obj[obj[k]] !== \"number\");\n const filtered = {};\n for (const k of validKeys) {\n filtered[k] = obj[k];\n }\n return util.objectValues(filtered);\n };\n util.objectValues = (obj) => {\n return util.objectKeys(obj).map(function (e) {\n return obj[e];\n });\n };\n util.objectKeys = typeof Object.keys === \"function\" // eslint-disable-line ban/ban\n ? (obj) => Object.keys(obj) // eslint-disable-line ban/ban\n : (object) => {\n const keys = [];\n for (const key in object) {\n if (Object.prototype.hasOwnProperty.call(object, key)) {\n keys.push(key);\n }\n }\n return keys;\n };\n util.find = (arr, checker) => {\n for (const item of arr) {\n if (checker(item))\n return item;\n }\n return undefined;\n };\n util.isInteger = typeof Number.isInteger === \"function\"\n ? (val) => Number.isInteger(val) // eslint-disable-line ban/ban\n : (val) => typeof val === \"number\" && isFinite(val) && Math.floor(val) === val;\n function joinValues(array, separator = \" | \") {\n return array\n .map((val) => (typeof val === \"string\" ? `'${val}'` : val))\n .join(separator);\n }\n util.joinValues = joinValues;\n util.jsonStringifyReplacer = (_, value) => {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n };\n})(util || (util = {}));\nvar objectUtil;\n(function (objectUtil) {\n objectUtil.mergeShapes = (first, second) => {\n return {\n ...first,\n ...second, // second overwrites first\n };\n };\n})(objectUtil || (objectUtil = {}));\nconst ZodParsedType = util.arrayToEnum([\n \"string\",\n \"nan\",\n \"number\",\n \"integer\",\n \"float\",\n \"boolean\",\n \"date\",\n \"bigint\",\n \"symbol\",\n \"function\",\n \"undefined\",\n \"null\",\n \"array\",\n \"object\",\n \"unknown\",\n \"promise\",\n \"void\",\n \"never\",\n \"map\",\n \"set\",\n]);\nconst getParsedType = (data) => {\n const t = typeof data;\n switch (t) {\n case \"undefined\":\n return ZodParsedType.undefined;\n case \"string\":\n return ZodParsedType.string;\n case \"number\":\n return isNaN(data) ? ZodParsedType.nan : ZodParsedType.number;\n case \"boolean\":\n return ZodParsedType.boolean;\n case \"function\":\n return ZodParsedType.function;\n case \"bigint\":\n return ZodParsedType.bigint;\n case \"symbol\":\n return ZodParsedType.symbol;\n case \"object\":\n if (Array.isArray(data)) {\n return ZodParsedType.array;\n }\n if (data === null) {\n return ZodParsedType.null;\n }\n if (data.then &&\n typeof data.then === \"function\" &&\n data.catch &&\n typeof data.catch === \"function\") {\n return ZodParsedType.promise;\n }\n if (typeof Map !== \"undefined\" && data instanceof Map) {\n return ZodParsedType.map;\n }\n if (typeof Set !== \"undefined\" && data instanceof Set) {\n return ZodParsedType.set;\n }\n if (typeof Date !== \"undefined\" && data instanceof Date) {\n return ZodParsedType.date;\n }\n return ZodParsedType.object;\n default:\n return ZodParsedType.unknown;\n }\n};\n\nconst ZodIssueCode = util.arrayToEnum([\n \"invalid_type\",\n \"invalid_literal\",\n \"custom\",\n \"invalid_union\",\n \"invalid_union_discriminator\",\n \"invalid_enum_value\",\n \"unrecognized_keys\",\n \"invalid_arguments\",\n \"invalid_return_type\",\n \"invalid_date\",\n \"invalid_string\",\n \"too_small\",\n \"too_big\",\n \"invalid_intersection_types\",\n \"not_multiple_of\",\n \"not_finite\",\n]);\nconst quotelessJson = (obj) => {\n const json = JSON.stringify(obj, null, 2);\n return json.replace(/\"([^\"]+)\":/g, \"$1:\");\n};\nclass ZodError extends Error {\n get errors() {\n return this.issues;\n }\n constructor(issues) {\n super();\n this.issues = [];\n this.addIssue = (sub) => {\n this.issues = [...this.issues, sub];\n };\n this.addIssues = (subs = []) => {\n this.issues = [...this.issues, ...subs];\n };\n const actualProto = new.target.prototype;\n if (Object.setPrototypeOf) {\n // eslint-disable-next-line ban/ban\n Object.setPrototypeOf(this, actualProto);\n }\n else {\n this.__proto__ = actualProto;\n }\n this.name = \"ZodError\";\n this.issues = issues;\n }\n format(_mapper) {\n const mapper = _mapper ||\n function (issue) {\n return issue.message;\n };\n const fieldErrors = { _errors: [] };\n const processError = (error) => {\n for (const issue of error.issues) {\n if (issue.code === \"invalid_union\") {\n issue.unionErrors.map(processError);\n }\n else if (issue.code === \"invalid_return_type\") {\n processError(issue.returnTypeError);\n }\n else if (issue.code === \"invalid_arguments\") {\n processError(issue.argumentsError);\n }\n else if (issue.path.length === 0) {\n fieldErrors._errors.push(mapper(issue));\n }\n else {\n let curr = fieldErrors;\n let i = 0;\n while (i < issue.path.length) {\n const el = issue.path[i];\n const terminal = i === issue.path.length - 1;\n if (!terminal) {\n curr[el] = curr[el] || { _errors: [] };\n // if (typeof el === \"string\") {\n // curr[el] = curr[el] || { _errors: [] };\n // } else if (typeof el === \"number\") {\n // const errorArray: any = [];\n // errorArray._errors = [];\n // curr[el] = curr[el] || errorArray;\n // }\n }\n else {\n curr[el] = curr[el] || { _errors: [] };\n curr[el]._errors.push(mapper(issue));\n }\n curr = curr[el];\n i++;\n }\n }\n }\n };\n processError(this);\n return fieldErrors;\n }\n static assert(value) {\n if (!(value instanceof ZodError)) {\n throw new Error(`Not a ZodError: ${value}`);\n }\n }\n toString() {\n return this.message;\n }\n get message() {\n return JSON.stringify(this.issues, util.jsonStringifyReplacer, 2);\n }\n get isEmpty() {\n return this.issues.length === 0;\n }\n flatten(mapper = (issue) => issue.message) {\n const fieldErrors = {};\n const formErrors = [];\n for (const sub of this.issues) {\n if (sub.path.length > 0) {\n fieldErrors[sub.path[0]] = fieldErrors[sub.path[0]] || [];\n fieldErrors[sub.path[0]].push(mapper(sub));\n }\n else {\n formErrors.push(mapper(sub));\n }\n }\n return { formErrors, fieldErrors };\n }\n get formErrors() {\n return this.flatten();\n }\n}\nZodError.create = (issues) => {\n const error = new ZodError(issues);\n return error;\n};\n\nconst errorMap = (issue, _ctx) => {\n let message;\n switch (issue.code) {\n case ZodIssueCode.invalid_type:\n if (issue.received === ZodParsedType.undefined) {\n message = \"Required\";\n }\n else {\n message = `Expected ${issue.expected}, received ${issue.received}`;\n }\n break;\n case ZodIssueCode.invalid_literal:\n message = `Invalid literal value, expected ${JSON.stringify(issue.expected, util.jsonStringifyReplacer)}`;\n break;\n case ZodIssueCode.unrecognized_keys:\n message = `Unrecognized key(s) in object: ${util.joinValues(issue.keys, \", \")}`;\n break;\n case ZodIssueCode.invalid_union:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_union_discriminator:\n message = `Invalid discriminator value. Expected ${util.joinValues(issue.options)}`;\n break;\n case ZodIssueCode.invalid_enum_value:\n message = `Invalid enum value. Expected ${util.joinValues(issue.options)}, received '${issue.received}'`;\n break;\n case ZodIssueCode.invalid_arguments:\n message = `Invalid function arguments`;\n break;\n case ZodIssueCode.invalid_return_type:\n message = `Invalid function return type`;\n break;\n case ZodIssueCode.invalid_date:\n message = `Invalid date`;\n break;\n case ZodIssueCode.invalid_string:\n if (typeof issue.validation === \"object\") {\n if (\"includes\" in issue.validation) {\n message = `Invalid input: must include \"${issue.validation.includes}\"`;\n if (typeof issue.validation.position === \"number\") {\n message = `${message} at one or more positions greater than or equal to ${issue.validation.position}`;\n }\n }\n else if (\"startsWith\" in issue.validation) {\n message = `Invalid input: must start with \"${issue.validation.startsWith}\"`;\n }\n else if (\"endsWith\" in issue.validation) {\n message = `Invalid input: must end with \"${issue.validation.endsWith}\"`;\n }\n else {\n util.assertNever(issue.validation);\n }\n }\n else if (issue.validation !== \"regex\") {\n message = `Invalid ${issue.validation}`;\n }\n else {\n message = \"Invalid\";\n }\n break;\n case ZodIssueCode.too_small:\n if (issue.type === \"array\")\n message = `Array must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `more than`} ${issue.minimum} element(s)`;\n else if (issue.type === \"string\")\n message = `String must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `over`} ${issue.minimum} character(s)`;\n else if (issue.type === \"number\")\n message = `Number must be ${issue.exact\n ? `exactly equal to `\n : issue.inclusive\n ? `greater than or equal to `\n : `greater than `}${issue.minimum}`;\n else if (issue.type === \"date\")\n message = `Date must be ${issue.exact\n ? `exactly equal to `\n : issue.inclusive\n ? `greater than or equal to `\n : `greater than `}${new Date(Number(issue.minimum))}`;\n else\n message = \"Invalid input\";\n break;\n case ZodIssueCode.too_big:\n if (issue.type === \"array\")\n message = `Array must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `less than`} ${issue.maximum} element(s)`;\n else if (issue.type === \"string\")\n message = `String must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `under`} ${issue.maximum} character(s)`;\n else if (issue.type === \"number\")\n message = `Number must be ${issue.exact\n ? `exactly`\n : issue.inclusive\n ? `less than or equal to`\n : `less than`} ${issue.maximum}`;\n else if (issue.type === \"bigint\")\n message = `BigInt must be ${issue.exact\n ? `exactly`\n : issue.inclusive\n ? `less than or equal to`\n : `less than`} ${issue.maximum}`;\n else if (issue.type === \"date\")\n message = `Date must be ${issue.exact\n ? `exactly`\n : issue.inclusive\n ? `smaller than or equal to`\n : `smaller than`} ${new Date(Number(issue.maximum))}`;\n else\n message = \"Invalid input\";\n break;\n case ZodIssueCode.custom:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_intersection_types:\n message = `Intersection results could not be merged`;\n break;\n case ZodIssueCode.not_multiple_of:\n message = `Number must be a multiple of ${issue.multipleOf}`;\n break;\n case ZodIssueCode.not_finite:\n message = \"Number must be finite\";\n break;\n default:\n message = _ctx.defaultError;\n util.assertNever(issue);\n }\n return { message };\n};\n\nlet overrideErrorMap = errorMap;\nfunction setErrorMap(map) {\n overrideErrorMap = map;\n}\nfunction getErrorMap() {\n return overrideErrorMap;\n}\n\nconst makeIssue = (params) => {\n const { data, path, errorMaps, issueData } = params;\n const fullPath = [...path, ...(issueData.path || [])];\n const fullIssue = {\n ...issueData,\n path: fullPath,\n };\n if (issueData.message !== undefined) {\n return {\n ...issueData,\n path: fullPath,\n message: issueData.message,\n };\n }\n let errorMessage = \"\";\n const maps = errorMaps\n .filter((m) => !!m)\n .slice()\n .reverse();\n for (const map of maps) {\n errorMessage = map(fullIssue, { data, defaultError: errorMessage }).message;\n }\n return {\n ...issueData,\n path: fullPath,\n message: errorMessage,\n };\n};\nconst EMPTY_PATH = [];\nfunction addIssueToContext(ctx, issueData) {\n const overrideMap = getErrorMap();\n const issue = makeIssue({\n issueData: issueData,\n data: ctx.data,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap, // contextual error map is first priority\n ctx.schemaErrorMap, // then schema-bound map if available\n overrideMap, // then global override map\n overrideMap === errorMap ? undefined : errorMap, // then global default map\n ].filter((x) => !!x),\n });\n ctx.common.issues.push(issue);\n}\nclass ParseStatus {\n constructor() {\n this.value = \"valid\";\n }\n dirty() {\n if (this.value === \"valid\")\n this.value = \"dirty\";\n }\n abort() {\n if (this.value !== \"aborted\")\n this.value = \"aborted\";\n }\n static mergeArray(status, results) {\n const arrayValue = [];\n for (const s of results) {\n if (s.status === \"aborted\")\n return INVALID;\n if (s.status === \"dirty\")\n status.dirty();\n arrayValue.push(s.value);\n }\n return { status: status.value, value: arrayValue };\n }\n static async mergeObjectAsync(status, pairs) {\n const syncPairs = [];\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n syncPairs.push({\n key,\n value,\n });\n }\n return ParseStatus.mergeObjectSync(status, syncPairs);\n }\n static mergeObjectSync(status, pairs) {\n const finalObject = {};\n for (const pair of pairs) {\n const { key, value } = pair;\n if (key.status === \"aborted\")\n return INVALID;\n if (value.status === \"aborted\")\n return INVALID;\n if (key.status === \"dirty\")\n status.dirty();\n if (value.status === \"dirty\")\n status.dirty();\n if (key.value !== \"__proto__\" &&\n (typeof value.value !== \"undefined\" || pair.alwaysSet)) {\n finalObject[key.value] = value.value;\n }\n }\n return { status: status.value, value: finalObject };\n }\n}\nconst INVALID = Object.freeze({\n status: \"aborted\",\n});\nconst DIRTY = (value) => ({ status: \"dirty\", value });\nconst OK = (value) => ({ status: \"valid\", value });\nconst isAborted = (x) => x.status === \"aborted\";\nconst isDirty = (x) => x.status === \"dirty\";\nconst isValid = (x) => x.status === \"valid\";\nconst isAsync = (x) => typeof Promise !== \"undefined\" && x instanceof Promise;\n\n/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n\r\nfunction __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nfunction __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\ntypeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\n\nvar errorUtil;\n(function (errorUtil) {\n errorUtil.errToObj = (message) => typeof message === \"string\" ? { message } : message || {};\n errorUtil.toString = (message) => typeof message === \"string\" ? message : message === null || message === void 0 ? void 0 : message.message;\n})(errorUtil || (errorUtil = {}));\n\nvar _ZodEnum_cache, _ZodNativeEnum_cache;\nclass ParseInputLazyPath {\n constructor(parent, value, path, key) {\n this._cachedPath = [];\n this.parent = parent;\n this.data = value;\n this._path = path;\n this._key = key;\n }\n get path() {\n if (!this._cachedPath.length) {\n if (this._key instanceof Array) {\n this._cachedPath.push(...this._path, ...this._key);\n }\n else {\n this._cachedPath.push(...this._path, this._key);\n }\n }\n return this._cachedPath;\n }\n}\nconst handleResult = (ctx, result) => {\n if (isValid(result)) {\n return { success: true, data: result.value };\n }\n else {\n if (!ctx.common.issues.length) {\n throw new Error(\"Validation failed but no issues detected.\");\n }\n return {\n success: false,\n get error() {\n if (this._error)\n return this._error;\n const error = new ZodError(ctx.common.issues);\n this._error = error;\n return this._error;\n },\n };\n }\n};\nfunction processCreateParams(params) {\n if (!params)\n return {};\n const { errorMap, invalid_type_error, required_error, description } = params;\n if (errorMap && (invalid_type_error || required_error)) {\n throw new Error(`Can't use \"invalid_type_error\" or \"required_error\" in conjunction with custom error map.`);\n }\n if (errorMap)\n return { errorMap: errorMap, description };\n const customMap = (iss, ctx) => {\n var _a, _b;\n const { message } = params;\n if (iss.code === \"invalid_enum_value\") {\n return { message: message !== null && message !== void 0 ? message : ctx.defaultError };\n }\n if (typeof ctx.data === \"undefined\") {\n return { message: (_a = message !== null && message !== void 0 ? message : required_error) !== null && _a !== void 0 ? _a : ctx.defaultError };\n }\n if (iss.code !== \"invalid_type\")\n return { message: ctx.defaultError };\n return { message: (_b = message !== null && message !== void 0 ? message : invalid_type_error) !== null && _b !== void 0 ? _b : ctx.defaultError };\n };\n return { errorMap: customMap, description };\n}\nclass ZodType {\n get description() {\n return this._def.description;\n }\n _getType(input) {\n return getParsedType(input.data);\n }\n _getOrReturnCtx(input, ctx) {\n return (ctx || {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent,\n });\n }\n _processInputParams(input) {\n return {\n status: new ParseStatus(),\n ctx: {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent,\n },\n };\n }\n _parseSync(input) {\n const result = this._parse(input);\n if (isAsync(result)) {\n throw new Error(\"Synchronous parse encountered promise.\");\n }\n return result;\n }\n _parseAsync(input) {\n const result = this._parse(input);\n return Promise.resolve(result);\n }\n parse(data, params) {\n const result = this.safeParse(data, params);\n if (result.success)\n return result.data;\n throw result.error;\n }\n safeParse(data, params) {\n var _a;\n const ctx = {\n common: {\n issues: [],\n async: (_a = params === null || params === void 0 ? void 0 : params.async) !== null && _a !== void 0 ? _a : false,\n contextualErrorMap: params === null || params === void 0 ? void 0 : params.errorMap,\n },\n path: (params === null || params === void 0 ? void 0 : params.path) || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n const result = this._parseSync({ data, path: ctx.path, parent: ctx });\n return handleResult(ctx, result);\n }\n \"~validate\"(data) {\n var _a, _b;\n const ctx = {\n common: {\n issues: [],\n async: !!this[\"~standard\"].async,\n },\n path: [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n if (!this[\"~standard\"].async) {\n try {\n const result = this._parseSync({ data, path: [], parent: ctx });\n return isValid(result)\n ? {\n value: result.value,\n }\n : {\n issues: ctx.common.issues,\n };\n }\n catch (err) {\n if ((_b = (_a = err === null || err === void 0 ? void 0 : err.message) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === null || _b === void 0 ? void 0 : _b.includes(\"encountered\")) {\n this[\"~standard\"].async = true;\n }\n ctx.common = {\n issues: [],\n async: true,\n };\n }\n }\n return this._parseAsync({ data, path: [], parent: ctx }).then((result) => isValid(result)\n ? {\n value: result.value,\n }\n : {\n issues: ctx.common.issues,\n });\n }\n async parseAsync(data, params) {\n const result = await this.safeParseAsync(data, params);\n if (result.success)\n return result.data;\n throw result.error;\n }\n async safeParseAsync(data, params) {\n const ctx = {\n common: {\n issues: [],\n contextualErrorMap: params === null || params === void 0 ? void 0 : params.errorMap,\n async: true,\n },\n path: (params === null || params === void 0 ? void 0 : params.path) || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n const maybeAsyncResult = this._parse({ data, path: ctx.path, parent: ctx });\n const result = await (isAsync(maybeAsyncResult)\n ? maybeAsyncResult\n : Promise.resolve(maybeAsyncResult));\n return handleResult(ctx, result);\n }\n refine(check, message) {\n const getIssueProperties = (val) => {\n if (typeof message === \"string\" || typeof message === \"undefined\") {\n return { message };\n }\n else if (typeof message === \"function\") {\n return message(val);\n }\n else {\n return message;\n }\n };\n return this._refinement((val, ctx) => {\n const result = check(val);\n const setError = () => ctx.addIssue({\n code: ZodIssueCode.custom,\n ...getIssueProperties(val),\n });\n if (typeof Promise !== \"undefined\" && result instanceof Promise) {\n return result.then((data) => {\n if (!data) {\n setError();\n return false;\n }\n else {\n return true;\n }\n });\n }\n if (!result) {\n setError();\n return false;\n }\n else {\n return true;\n }\n });\n }\n refinement(check, refinementData) {\n return this._refinement((val, ctx) => {\n if (!check(val)) {\n ctx.addIssue(typeof refinementData === \"function\"\n ? refinementData(val, ctx)\n : refinementData);\n return false;\n }\n else {\n return true;\n }\n });\n }\n _refinement(refinement) {\n return new ZodEffects({\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: { type: \"refinement\", refinement },\n });\n }\n superRefine(refinement) {\n return this._refinement(refinement);\n }\n constructor(def) {\n /** Alias of safeParseAsync */\n this.spa = this.safeParseAsync;\n this._def = def;\n this.parse = this.parse.bind(this);\n this.safeParse = this.safeParse.bind(this);\n this.parseAsync = this.parseAsync.bind(this);\n this.safeParseAsync = this.safeParseAsync.bind(this);\n this.spa = this.spa.bind(this);\n this.refine = this.refine.bind(this);\n this.refinement = this.refinement.bind(this);\n this.superRefine = this.superRefine.bind(this);\n this.optional = this.optional.bind(this);\n this.nullable = this.nullable.bind(this);\n this.nullish = this.nullish.bind(this);\n this.array = this.array.bind(this);\n this.promise = this.promise.bind(this);\n this.or = this.or.bind(this);\n this.and = this.and.bind(this);\n this.transform = this.transform.bind(this);\n this.brand = this.brand.bind(this);\n this.default = this.default.bind(this);\n this.catch = this.catch.bind(this);\n this.describe = this.describe.bind(this);\n this.pipe = this.pipe.bind(this);\n this.readonly = this.readonly.bind(this);\n this.isNullable = this.isNullable.bind(this);\n this.isOptional = this.isOptional.bind(this);\n this[\"~standard\"] = {\n version: 1,\n vendor: \"zod\",\n validate: (data) => this[\"~validate\"](data),\n };\n }\n optional() {\n return ZodOptional.create(this, this._def);\n }\n nullable() {\n return ZodNullable.create(this, this._def);\n }\n nullish() {\n return this.nullable().optional();\n }\n array() {\n return ZodArray.create(this);\n }\n promise() {\n return ZodPromise.create(this, this._def);\n }\n or(option) {\n return ZodUnion.create([this, option], this._def);\n }\n and(incoming) {\n return ZodIntersection.create(this, incoming, this._def);\n }\n transform(transform) {\n return new ZodEffects({\n ...processCreateParams(this._def),\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: { type: \"transform\", transform },\n });\n }\n default(def) {\n const defaultValueFunc = typeof def === \"function\" ? def : () => def;\n return new ZodDefault({\n ...processCreateParams(this._def),\n innerType: this,\n defaultValue: defaultValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodDefault,\n });\n }\n brand() {\n return new ZodBranded({\n typeName: ZodFirstPartyTypeKind.ZodBranded,\n type: this,\n ...processCreateParams(this._def),\n });\n }\n catch(def) {\n const catchValueFunc = typeof def === \"function\" ? def : () => def;\n return new ZodCatch({\n ...processCreateParams(this._def),\n innerType: this,\n catchValue: catchValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodCatch,\n });\n }\n describe(description) {\n const This = this.constructor;\n return new This({\n ...this._def,\n description,\n });\n }\n pipe(target) {\n return ZodPipeline.create(this, target);\n }\n readonly() {\n return ZodReadonly.create(this);\n }\n isOptional() {\n return this.safeParse(undefined).success;\n }\n isNullable() {\n return this.safeParse(null).success;\n }\n}\nconst cuidRegex = /^c[^\\s-]{8,}$/i;\nconst cuid2Regex = /^[0-9a-z]+$/;\nconst ulidRegex = /^[0-9A-HJKMNP-TV-Z]{26}$/i;\n// const uuidRegex =\n// /^([a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[a-f0-9]{4}-[a-f0-9]{12}|00000000-0000-0000-0000-000000000000)$/i;\nconst uuidRegex = /^[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$/i;\nconst nanoidRegex = /^[a-z0-9_-]{21}$/i;\nconst jwtRegex = /^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]*$/;\nconst durationRegex = /^[-+]?P(?!$)(?:(?:[-+]?\\d+Y)|(?:[-+]?\\d+[.,]\\d+Y$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:(?:[-+]?\\d+W)|(?:[-+]?\\d+[.,]\\d+W$))?(?:(?:[-+]?\\d+D)|(?:[-+]?\\d+[.,]\\d+D$))?(?:T(?=[\\d+-])(?:(?:[-+]?\\d+H)|(?:[-+]?\\d+[.,]\\d+H$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:[-+]?\\d+(?:[.,]\\d+)?S)?)??$/;\n// from https://stackoverflow.com/a/46181/1550155\n// old version: too slow, didn't support unicode\n// const emailRegex = /^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/i;\n//old email regex\n// const emailRegex = /^(([^<>()[\\].,;:\\s@\"]+(\\.[^<>()[\\].,;:\\s@\"]+)*)|(\".+\"))@((?!-)([^<>()[\\].,;:\\s@\"]+\\.)+[^<>()[\\].,;:\\s@\"]{1,})[^-<>()[\\].,;:\\s@\"]$/i;\n// eslint-disable-next-line\n// const emailRegex =\n// /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\])|(\\[IPv6:(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))\\])|([A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])*(\\.[A-Za-z]{2,})+))$/;\n// const emailRegex =\n// /^[a-zA-Z0-9\\.\\!\\#\\$\\%\\&\\'\\*\\+\\/\\=\\?\\^\\_\\`\\{\\|\\}\\~\\-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n// const emailRegex =\n// /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])$/i;\nconst emailRegex = /^(?!\\.)(?!.*\\.\\.)([A-Z0-9_'+\\-\\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\\-]*\\.)+[A-Z]{2,}$/i;\n// const emailRegex =\n// /^[a-z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-z0-9-]+(?:\\.[a-z0-9\\-]+)*$/i;\n// from https://thekevinscott.com/emojis-in-javascript/#writing-a-regular-expression\nconst _emojiRegex = `^(\\\\p{Extended_Pictographic}|\\\\p{Emoji_Component})+$`;\nlet emojiRegex;\n// faster, simpler, safer\nconst ipv4Regex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/;\nconst ipv4CidrRegex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/(3[0-2]|[12]?[0-9])$/;\n// const ipv6Regex =\n// /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/;\nconst ipv6Regex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/;\nconst ipv6CidrRegex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/;\n// https://stackoverflow.com/questions/7860392/determine-if-string-is-in-base64-using-javascript\nconst base64Regex = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/;\n// https://base64.guru/standards/base64url\nconst base64urlRegex = /^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/;\n// simple\n// const dateRegexSource = `\\\\d{4}-\\\\d{2}-\\\\d{2}`;\n// no leap year validation\n// const dateRegexSource = `\\\\d{4}-((0[13578]|10|12)-31|(0[13-9]|1[0-2])-30|(0[1-9]|1[0-2])-(0[1-9]|1\\\\d|2\\\\d))`;\n// with leap year validation\nconst dateRegexSource = `((\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\\\d|30)|(02)-(0[1-9]|1\\\\d|2[0-8])))`;\nconst dateRegex = new RegExp(`^${dateRegexSource}$`);\nfunction timeRegexSource(args) {\n // let regex = `\\\\d{2}:\\\\d{2}:\\\\d{2}`;\n let regex = `([01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d`;\n if (args.precision) {\n regex = `${regex}\\\\.\\\\d{${args.precision}}`;\n }\n else if (args.precision == null) {\n regex = `${regex}(\\\\.\\\\d+)?`;\n }\n return regex;\n}\nfunction timeRegex(args) {\n return new RegExp(`^${timeRegexSource(args)}$`);\n}\n// Adapted from https://stackoverflow.com/a/3143231\nfunction datetimeRegex(args) {\n let regex = `${dateRegexSource}T${timeRegexSource(args)}`;\n const opts = [];\n opts.push(args.local ? `Z?` : `Z`);\n if (args.offset)\n opts.push(`([+-]\\\\d{2}:?\\\\d{2})`);\n regex = `${regex}(${opts.join(\"|\")})`;\n return new RegExp(`^${regex}$`);\n}\nfunction isValidIP(ip, version) {\n if ((version === \"v4\" || !version) && ipv4Regex.test(ip)) {\n return true;\n }\n if ((version === \"v6\" || !version) && ipv6Regex.test(ip)) {\n return true;\n }\n return false;\n}\nfunction isValidJWT(jwt, alg) {\n if (!jwtRegex.test(jwt))\n return false;\n try {\n const [header] = jwt.split(\".\");\n // Convert base64url to base64\n const base64 = header\n .replace(/-/g, \"+\")\n .replace(/_/g, \"/\")\n .padEnd(header.length + ((4 - (header.length % 4)) % 4), \"=\");\n const decoded = JSON.parse(atob(base64));\n if (typeof decoded !== \"object\" || decoded === null)\n return false;\n if (!decoded.typ || !decoded.alg)\n return false;\n if (alg && decoded.alg !== alg)\n return false;\n return true;\n }\n catch (_a) {\n return false;\n }\n}\nfunction isValidCidr(ip, version) {\n if ((version === \"v4\" || !version) && ipv4CidrRegex.test(ip)) {\n return true;\n }\n if ((version === \"v6\" || !version) && ipv6CidrRegex.test(ip)) {\n return true;\n }\n return false;\n}\nclass ZodString extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = String(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.string) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.string,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n if (input.data.length < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n if (input.data.length > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"length\") {\n const tooBig = input.data.length > check.value;\n const tooSmall = input.data.length < check.value;\n if (tooBig || tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n if (tooBig) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n exact: true,\n message: check.message,\n });\n }\n else if (tooSmall) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n exact: true,\n message: check.message,\n });\n }\n status.dirty();\n }\n }\n else if (check.kind === \"email\") {\n if (!emailRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"email\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"emoji\") {\n if (!emojiRegex) {\n emojiRegex = new RegExp(_emojiRegex, \"u\");\n }\n if (!emojiRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"emoji\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"uuid\") {\n if (!uuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"uuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"nanoid\") {\n if (!nanoidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"nanoid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cuid\") {\n if (!cuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cuid2\") {\n if (!cuid2Regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid2\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"ulid\") {\n if (!ulidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"ulid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"url\") {\n try {\n new URL(input.data);\n }\n catch (_a) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"url\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"regex\") {\n check.regex.lastIndex = 0;\n const testResult = check.regex.test(input.data);\n if (!testResult) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"regex\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"trim\") {\n input.data = input.data.trim();\n }\n else if (check.kind === \"includes\") {\n if (!input.data.includes(check.value, check.position)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { includes: check.value, position: check.position },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"toLowerCase\") {\n input.data = input.data.toLowerCase();\n }\n else if (check.kind === \"toUpperCase\") {\n input.data = input.data.toUpperCase();\n }\n else if (check.kind === \"startsWith\") {\n if (!input.data.startsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { startsWith: check.value },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"endsWith\") {\n if (!input.data.endsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { endsWith: check.value },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"datetime\") {\n const regex = datetimeRegex(check);\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"datetime\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"date\") {\n const regex = dateRegex;\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"date\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"time\") {\n const regex = timeRegex(check);\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"time\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"duration\") {\n if (!durationRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"duration\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"ip\") {\n if (!isValidIP(input.data, check.version)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"ip\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"jwt\") {\n if (!isValidJWT(input.data, check.alg)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"jwt\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cidr\") {\n if (!isValidCidr(input.data, check.version)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cidr\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"base64\") {\n if (!base64Regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"base64\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"base64url\") {\n if (!base64urlRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"base64url\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n _regex(regex, validation, message) {\n return this.refinement((data) => regex.test(data), {\n validation,\n code: ZodIssueCode.invalid_string,\n ...errorUtil.errToObj(message),\n });\n }\n _addCheck(check) {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n email(message) {\n return this._addCheck({ kind: \"email\", ...errorUtil.errToObj(message) });\n }\n url(message) {\n return this._addCheck({ kind: \"url\", ...errorUtil.errToObj(message) });\n }\n emoji(message) {\n return this._addCheck({ kind: \"emoji\", ...errorUtil.errToObj(message) });\n }\n uuid(message) {\n return this._addCheck({ kind: \"uuid\", ...errorUtil.errToObj(message) });\n }\n nanoid(message) {\n return this._addCheck({ kind: \"nanoid\", ...errorUtil.errToObj(message) });\n }\n cuid(message) {\n return this._addCheck({ kind: \"cuid\", ...errorUtil.errToObj(message) });\n }\n cuid2(message) {\n return this._addCheck({ kind: \"cuid2\", ...errorUtil.errToObj(message) });\n }\n ulid(message) {\n return this._addCheck({ kind: \"ulid\", ...errorUtil.errToObj(message) });\n }\n base64(message) {\n return this._addCheck({ kind: \"base64\", ...errorUtil.errToObj(message) });\n }\n base64url(message) {\n // base64url encoding is a modification of base64 that can safely be used in URLs and filenames\n return this._addCheck({\n kind: \"base64url\",\n ...errorUtil.errToObj(message),\n });\n }\n jwt(options) {\n return this._addCheck({ kind: \"jwt\", ...errorUtil.errToObj(options) });\n }\n ip(options) {\n return this._addCheck({ kind: \"ip\", ...errorUtil.errToObj(options) });\n }\n cidr(options) {\n return this._addCheck({ kind: \"cidr\", ...errorUtil.errToObj(options) });\n }\n datetime(options) {\n var _a, _b;\n if (typeof options === \"string\") {\n return this._addCheck({\n kind: \"datetime\",\n precision: null,\n offset: false,\n local: false,\n message: options,\n });\n }\n return this._addCheck({\n kind: \"datetime\",\n precision: typeof (options === null || options === void 0 ? void 0 : options.precision) === \"undefined\" ? null : options === null || options === void 0 ? void 0 : options.precision,\n offset: (_a = options === null || options === void 0 ? void 0 : options.offset) !== null && _a !== void 0 ? _a : false,\n local: (_b = options === null || options === void 0 ? void 0 : options.local) !== null && _b !== void 0 ? _b : false,\n ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message),\n });\n }\n date(message) {\n return this._addCheck({ kind: \"date\", message });\n }\n time(options) {\n if (typeof options === \"string\") {\n return this._addCheck({\n kind: \"time\",\n precision: null,\n message: options,\n });\n }\n return this._addCheck({\n kind: \"time\",\n precision: typeof (options === null || options === void 0 ? void 0 : options.precision) === \"undefined\" ? null : options === null || options === void 0 ? void 0 : options.precision,\n ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message),\n });\n }\n duration(message) {\n return this._addCheck({ kind: \"duration\", ...errorUtil.errToObj(message) });\n }\n regex(regex, message) {\n return this._addCheck({\n kind: \"regex\",\n regex: regex,\n ...errorUtil.errToObj(message),\n });\n }\n includes(value, options) {\n return this._addCheck({\n kind: \"includes\",\n value: value,\n position: options === null || options === void 0 ? void 0 : options.position,\n ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message),\n });\n }\n startsWith(value, message) {\n return this._addCheck({\n kind: \"startsWith\",\n value: value,\n ...errorUtil.errToObj(message),\n });\n }\n endsWith(value, message) {\n return this._addCheck({\n kind: \"endsWith\",\n value: value,\n ...errorUtil.errToObj(message),\n });\n }\n min(minLength, message) {\n return this._addCheck({\n kind: \"min\",\n value: minLength,\n ...errorUtil.errToObj(message),\n });\n }\n max(maxLength, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxLength,\n ...errorUtil.errToObj(message),\n });\n }\n length(len, message) {\n return this._addCheck({\n kind: \"length\",\n value: len,\n ...errorUtil.errToObj(message),\n });\n }\n /**\n * Equivalent to `.min(1)`\n */\n nonempty(message) {\n return this.min(1, errorUtil.errToObj(message));\n }\n trim() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"trim\" }],\n });\n }\n toLowerCase() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"toLowerCase\" }],\n });\n }\n toUpperCase() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"toUpperCase\" }],\n });\n }\n get isDatetime() {\n return !!this._def.checks.find((ch) => ch.kind === \"datetime\");\n }\n get isDate() {\n return !!this._def.checks.find((ch) => ch.kind === \"date\");\n }\n get isTime() {\n return !!this._def.checks.find((ch) => ch.kind === \"time\");\n }\n get isDuration() {\n return !!this._def.checks.find((ch) => ch.kind === \"duration\");\n }\n get isEmail() {\n return !!this._def.checks.find((ch) => ch.kind === \"email\");\n }\n get isURL() {\n return !!this._def.checks.find((ch) => ch.kind === \"url\");\n }\n get isEmoji() {\n return !!this._def.checks.find((ch) => ch.kind === \"emoji\");\n }\n get isUUID() {\n return !!this._def.checks.find((ch) => ch.kind === \"uuid\");\n }\n get isNANOID() {\n return !!this._def.checks.find((ch) => ch.kind === \"nanoid\");\n }\n get isCUID() {\n return !!this._def.checks.find((ch) => ch.kind === \"cuid\");\n }\n get isCUID2() {\n return !!this._def.checks.find((ch) => ch.kind === \"cuid2\");\n }\n get isULID() {\n return !!this._def.checks.find((ch) => ch.kind === \"ulid\");\n }\n get isIP() {\n return !!this._def.checks.find((ch) => ch.kind === \"ip\");\n }\n get isCIDR() {\n return !!this._def.checks.find((ch) => ch.kind === \"cidr\");\n }\n get isBase64() {\n return !!this._def.checks.find((ch) => ch.kind === \"base64\");\n }\n get isBase64url() {\n // base64url encoding is a modification of base64 that can safely be used in URLs and filenames\n return !!this._def.checks.find((ch) => ch.kind === \"base64url\");\n }\n get minLength() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxLength() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n}\nZodString.create = (params) => {\n var _a;\n return new ZodString({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodString,\n coerce: (_a = params === null || params === void 0 ? void 0 : params.coerce) !== null && _a !== void 0 ? _a : false,\n ...processCreateParams(params),\n });\n};\n// https://stackoverflow.com/questions/3966484/why-does-modulus-operator-return-fractional-number-in-javascript/31711034#31711034\nfunction floatSafeRemainder(val, step) {\n const valDecCount = (val.toString().split(\".\")[1] || \"\").length;\n const stepDecCount = (step.toString().split(\".\")[1] || \"\").length;\n const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount;\n const valInt = parseInt(val.toFixed(decCount).replace(\".\", \"\"));\n const stepInt = parseInt(step.toFixed(decCount).replace(\".\", \"\"));\n return (valInt % stepInt) / Math.pow(10, decCount);\n}\nclass ZodNumber extends ZodType {\n constructor() {\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n this.step = this.multipleOf;\n }\n _parse(input) {\n if (this._def.coerce) {\n input.data = Number(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.number) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.number,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks) {\n if (check.kind === \"int\") {\n if (!util.isInteger(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: \"integer\",\n received: \"float\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"min\") {\n const tooSmall = check.inclusive\n ? input.data < check.value\n : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n const tooBig = check.inclusive\n ? input.data > check.value\n : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"multipleOf\") {\n if (floatSafeRemainder(input.data, check.value) !== 0) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"finite\") {\n if (!Number.isFinite(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_finite,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodNumber({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message),\n },\n ],\n });\n }\n _addCheck(check) {\n return new ZodNumber({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n int(message) {\n return this._addCheck({\n kind: \"int\",\n message: errorUtil.toString(message),\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value: value,\n message: errorUtil.toString(message),\n });\n }\n finite(message) {\n return this._addCheck({\n kind: \"finite\",\n message: errorUtil.toString(message),\n });\n }\n safe(message) {\n return this._addCheck({\n kind: \"min\",\n inclusive: true,\n value: Number.MIN_SAFE_INTEGER,\n message: errorUtil.toString(message),\n })._addCheck({\n kind: \"max\",\n inclusive: true,\n value: Number.MAX_SAFE_INTEGER,\n message: errorUtil.toString(message),\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n get isInt() {\n return !!this._def.checks.find((ch) => ch.kind === \"int\" ||\n (ch.kind === \"multipleOf\" && util.isInteger(ch.value)));\n }\n get isFinite() {\n let max = null, min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"finite\" ||\n ch.kind === \"int\" ||\n ch.kind === \"multipleOf\") {\n return true;\n }\n else if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n else if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return Number.isFinite(min) && Number.isFinite(max);\n }\n}\nZodNumber.create = (params) => {\n return new ZodNumber({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodNumber,\n coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false,\n ...processCreateParams(params),\n });\n};\nclass ZodBigInt extends ZodType {\n constructor() {\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n }\n _parse(input) {\n if (this._def.coerce) {\n try {\n input.data = BigInt(input.data);\n }\n catch (_a) {\n return this._getInvalidInput(input);\n }\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.bigint) {\n return this._getInvalidInput(input);\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n const tooSmall = check.inclusive\n ? input.data < check.value\n : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n type: \"bigint\",\n minimum: check.value,\n inclusive: check.inclusive,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n const tooBig = check.inclusive\n ? input.data > check.value\n : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n type: \"bigint\",\n maximum: check.value,\n inclusive: check.inclusive,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"multipleOf\") {\n if (input.data % check.value !== BigInt(0)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n _getInvalidInput(input) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.bigint,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodBigInt({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message),\n },\n ],\n });\n }\n _addCheck(check) {\n return new ZodBigInt({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value,\n message: errorUtil.toString(message),\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n}\nZodBigInt.create = (params) => {\n var _a;\n return new ZodBigInt({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodBigInt,\n coerce: (_a = params === null || params === void 0 ? void 0 : params.coerce) !== null && _a !== void 0 ? _a : false,\n ...processCreateParams(params),\n });\n};\nclass ZodBoolean extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = Boolean(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.boolean) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.boolean,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodBoolean.create = (params) => {\n return new ZodBoolean({\n typeName: ZodFirstPartyTypeKind.ZodBoolean,\n coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false,\n ...processCreateParams(params),\n });\n};\nclass ZodDate extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = new Date(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.date) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.date,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (isNaN(input.data.getTime())) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_date,\n });\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n if (input.data.getTime() < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n message: check.message,\n inclusive: true,\n exact: false,\n minimum: check.value,\n type: \"date\",\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n if (input.data.getTime() > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n message: check.message,\n inclusive: true,\n exact: false,\n maximum: check.value,\n type: \"date\",\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return {\n status: status.value,\n value: new Date(input.data.getTime()),\n };\n }\n _addCheck(check) {\n return new ZodDate({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n min(minDate, message) {\n return this._addCheck({\n kind: \"min\",\n value: minDate.getTime(),\n message: errorUtil.toString(message),\n });\n }\n max(maxDate, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxDate.getTime(),\n message: errorUtil.toString(message),\n });\n }\n get minDate() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min != null ? new Date(min) : null;\n }\n get maxDate() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max != null ? new Date(max) : null;\n }\n}\nZodDate.create = (params) => {\n return new ZodDate({\n checks: [],\n coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false,\n typeName: ZodFirstPartyTypeKind.ZodDate,\n ...processCreateParams(params),\n });\n};\nclass ZodSymbol extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.symbol) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.symbol,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodSymbol.create = (params) => {\n return new ZodSymbol({\n typeName: ZodFirstPartyTypeKind.ZodSymbol,\n ...processCreateParams(params),\n });\n};\nclass ZodUndefined extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.undefined,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodUndefined.create = (params) => {\n return new ZodUndefined({\n typeName: ZodFirstPartyTypeKind.ZodUndefined,\n ...processCreateParams(params),\n });\n};\nclass ZodNull extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.null) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.null,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodNull.create = (params) => {\n return new ZodNull({\n typeName: ZodFirstPartyTypeKind.ZodNull,\n ...processCreateParams(params),\n });\n};\nclass ZodAny extends ZodType {\n constructor() {\n super(...arguments);\n // to prevent instances of other classes from extending ZodAny. this causes issues with catchall in ZodObject.\n this._any = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodAny.create = (params) => {\n return new ZodAny({\n typeName: ZodFirstPartyTypeKind.ZodAny,\n ...processCreateParams(params),\n });\n};\nclass ZodUnknown extends ZodType {\n constructor() {\n super(...arguments);\n // required\n this._unknown = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodUnknown.create = (params) => {\n return new ZodUnknown({\n typeName: ZodFirstPartyTypeKind.ZodUnknown,\n ...processCreateParams(params),\n });\n};\nclass ZodNever extends ZodType {\n _parse(input) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.never,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n}\nZodNever.create = (params) => {\n return new ZodNever({\n typeName: ZodFirstPartyTypeKind.ZodNever,\n ...processCreateParams(params),\n });\n};\nclass ZodVoid extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.void,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodVoid.create = (params) => {\n return new ZodVoid({\n typeName: ZodFirstPartyTypeKind.ZodVoid,\n ...processCreateParams(params),\n });\n};\nclass ZodArray extends ZodType {\n _parse(input) {\n const { ctx, status } = this._processInputParams(input);\n const def = this._def;\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (def.exactLength !== null) {\n const tooBig = ctx.data.length > def.exactLength.value;\n const tooSmall = ctx.data.length < def.exactLength.value;\n if (tooBig || tooSmall) {\n addIssueToContext(ctx, {\n code: tooBig ? ZodIssueCode.too_big : ZodIssueCode.too_small,\n minimum: (tooSmall ? def.exactLength.value : undefined),\n maximum: (tooBig ? def.exactLength.value : undefined),\n type: \"array\",\n inclusive: true,\n exact: true,\n message: def.exactLength.message,\n });\n status.dirty();\n }\n }\n if (def.minLength !== null) {\n if (ctx.data.length < def.minLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minLength.value,\n type: \"array\",\n inclusive: true,\n exact: false,\n message: def.minLength.message,\n });\n status.dirty();\n }\n }\n if (def.maxLength !== null) {\n if (ctx.data.length > def.maxLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxLength.value,\n type: \"array\",\n inclusive: true,\n exact: false,\n message: def.maxLength.message,\n });\n status.dirty();\n }\n }\n if (ctx.common.async) {\n return Promise.all([...ctx.data].map((item, i) => {\n return def.type._parseAsync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n })).then((result) => {\n return ParseStatus.mergeArray(status, result);\n });\n }\n const result = [...ctx.data].map((item, i) => {\n return def.type._parseSync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n });\n return ParseStatus.mergeArray(status, result);\n }\n get element() {\n return this._def.type;\n }\n min(minLength, message) {\n return new ZodArray({\n ...this._def,\n minLength: { value: minLength, message: errorUtil.toString(message) },\n });\n }\n max(maxLength, message) {\n return new ZodArray({\n ...this._def,\n maxLength: { value: maxLength, message: errorUtil.toString(message) },\n });\n }\n length(len, message) {\n return new ZodArray({\n ...this._def,\n exactLength: { value: len, message: errorUtil.toString(message) },\n });\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodArray.create = (schema, params) => {\n return new ZodArray({\n type: schema,\n minLength: null,\n maxLength: null,\n exactLength: null,\n typeName: ZodFirstPartyTypeKind.ZodArray,\n ...processCreateParams(params),\n });\n};\nfunction deepPartialify(schema) {\n if (schema instanceof ZodObject) {\n const newShape = {};\n for (const key in schema.shape) {\n const fieldSchema = schema.shape[key];\n newShape[key] = ZodOptional.create(deepPartialify(fieldSchema));\n }\n return new ZodObject({\n ...schema._def,\n shape: () => newShape,\n });\n }\n else if (schema instanceof ZodArray) {\n return new ZodArray({\n ...schema._def,\n type: deepPartialify(schema.element),\n });\n }\n else if (schema instanceof ZodOptional) {\n return ZodOptional.create(deepPartialify(schema.unwrap()));\n }\n else if (schema instanceof ZodNullable) {\n return ZodNullable.create(deepPartialify(schema.unwrap()));\n }\n else if (schema instanceof ZodTuple) {\n return ZodTuple.create(schema.items.map((item) => deepPartialify(item)));\n }\n else {\n return schema;\n }\n}\nclass ZodObject extends ZodType {\n constructor() {\n super(...arguments);\n this._cached = null;\n /**\n * @deprecated In most cases, this is no longer needed - unknown properties are now silently stripped.\n * If you want to pass through unknown properties, use `.passthrough()` instead.\n */\n this.nonstrict = this.passthrough;\n // extend<\n // Augmentation extends ZodRawShape,\n // NewOutput extends util.flatten<{\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // }>,\n // NewInput extends util.flatten<{\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }>\n // >(\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape,\n // UnknownKeys,\n // Catchall,\n // NewOutput,\n // NewInput\n // > {\n // return new ZodObject({\n // ...this._def,\n // shape: () => ({\n // ...this._def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // }\n /**\n * @deprecated Use `.extend` instead\n * */\n this.augment = this.extend;\n }\n _getCached() {\n if (this._cached !== null)\n return this._cached;\n const shape = this._def.shape();\n const keys = util.objectKeys(shape);\n return (this._cached = { shape, keys });\n }\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.object) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const { status, ctx } = this._processInputParams(input);\n const { shape, keys: shapeKeys } = this._getCached();\n const extraKeys = [];\n if (!(this._def.catchall instanceof ZodNever &&\n this._def.unknownKeys === \"strip\")) {\n for (const key in ctx.data) {\n if (!shapeKeys.includes(key)) {\n extraKeys.push(key);\n }\n }\n }\n const pairs = [];\n for (const key of shapeKeys) {\n const keyValidator = shape[key];\n const value = ctx.data[key];\n pairs.push({\n key: { status: \"valid\", value: key },\n value: keyValidator._parse(new ParseInputLazyPath(ctx, value, ctx.path, key)),\n alwaysSet: key in ctx.data,\n });\n }\n if (this._def.catchall instanceof ZodNever) {\n const unknownKeys = this._def.unknownKeys;\n if (unknownKeys === \"passthrough\") {\n for (const key of extraKeys) {\n pairs.push({\n key: { status: \"valid\", value: key },\n value: { status: \"valid\", value: ctx.data[key] },\n });\n }\n }\n else if (unknownKeys === \"strict\") {\n if (extraKeys.length > 0) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.unrecognized_keys,\n keys: extraKeys,\n });\n status.dirty();\n }\n }\n else if (unknownKeys === \"strip\") ;\n else {\n throw new Error(`Internal ZodObject error: invalid unknownKeys value.`);\n }\n }\n else {\n // run catchall validation\n const catchall = this._def.catchall;\n for (const key of extraKeys) {\n const value = ctx.data[key];\n pairs.push({\n key: { status: \"valid\", value: key },\n value: catchall._parse(new ParseInputLazyPath(ctx, value, ctx.path, key) //, ctx.child(key), value, getParsedType(value)\n ),\n alwaysSet: key in ctx.data,\n });\n }\n }\n if (ctx.common.async) {\n return Promise.resolve()\n .then(async () => {\n const syncPairs = [];\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n syncPairs.push({\n key,\n value,\n alwaysSet: pair.alwaysSet,\n });\n }\n return syncPairs;\n })\n .then((syncPairs) => {\n return ParseStatus.mergeObjectSync(status, syncPairs);\n });\n }\n else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get shape() {\n return this._def.shape();\n }\n strict(message) {\n errorUtil.errToObj;\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strict\",\n ...(message !== undefined\n ? {\n errorMap: (issue, ctx) => {\n var _a, _b, _c, _d;\n const defaultError = (_c = (_b = (_a = this._def).errorMap) === null || _b === void 0 ? void 0 : _b.call(_a, issue, ctx).message) !== null && _c !== void 0 ? _c : ctx.defaultError;\n if (issue.code === \"unrecognized_keys\")\n return {\n message: (_d = errorUtil.errToObj(message).message) !== null && _d !== void 0 ? _d : defaultError,\n };\n return {\n message: defaultError,\n };\n },\n }\n : {}),\n });\n }\n strip() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strip\",\n });\n }\n passthrough() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"passthrough\",\n });\n }\n // const AugmentFactory =\n // (def: Def) =>\n // (\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape, Augmentation>,\n // Def[\"unknownKeys\"],\n // Def[\"catchall\"]\n // > => {\n // return new ZodObject({\n // ...def,\n // shape: () => ({\n // ...def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // };\n extend(augmentation) {\n return new ZodObject({\n ...this._def,\n shape: () => ({\n ...this._def.shape(),\n ...augmentation,\n }),\n });\n }\n /**\n * Prior to zod@1.0.12 there was a bug in the\n * inferred type of merged objects. Please\n * upgrade if you are experiencing issues.\n */\n merge(merging) {\n const merged = new ZodObject({\n unknownKeys: merging._def.unknownKeys,\n catchall: merging._def.catchall,\n shape: () => ({\n ...this._def.shape(),\n ...merging._def.shape(),\n }),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n });\n return merged;\n }\n // merge<\n // Incoming extends AnyZodObject,\n // Augmentation extends Incoming[\"shape\"],\n // NewOutput extends {\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // },\n // NewInput extends {\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }\n // >(\n // merging: Incoming\n // ): ZodObject<\n // extendShape>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"],\n // NewOutput,\n // NewInput\n // > {\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n setKey(key, schema) {\n return this.augment({ [key]: schema });\n }\n // merge(\n // merging: Incoming\n // ): //ZodObject = (merging) => {\n // ZodObject<\n // extendShape>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"]\n // > {\n // // const mergedShape = objectUtil.mergeShapes(\n // // this._def.shape(),\n // // merging._def.shape()\n // // );\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n catchall(index) {\n return new ZodObject({\n ...this._def,\n catchall: index,\n });\n }\n pick(mask) {\n const shape = {};\n util.objectKeys(mask).forEach((key) => {\n if (mask[key] && this.shape[key]) {\n shape[key] = this.shape[key];\n }\n });\n return new ZodObject({\n ...this._def,\n shape: () => shape,\n });\n }\n omit(mask) {\n const shape = {};\n util.objectKeys(this.shape).forEach((key) => {\n if (!mask[key]) {\n shape[key] = this.shape[key];\n }\n });\n return new ZodObject({\n ...this._def,\n shape: () => shape,\n });\n }\n /**\n * @deprecated\n */\n deepPartial() {\n return deepPartialify(this);\n }\n partial(mask) {\n const newShape = {};\n util.objectKeys(this.shape).forEach((key) => {\n const fieldSchema = this.shape[key];\n if (mask && !mask[key]) {\n newShape[key] = fieldSchema;\n }\n else {\n newShape[key] = fieldSchema.optional();\n }\n });\n return new ZodObject({\n ...this._def,\n shape: () => newShape,\n });\n }\n required(mask) {\n const newShape = {};\n util.objectKeys(this.shape).forEach((key) => {\n if (mask && !mask[key]) {\n newShape[key] = this.shape[key];\n }\n else {\n const fieldSchema = this.shape[key];\n let newField = fieldSchema;\n while (newField instanceof ZodOptional) {\n newField = newField._def.innerType;\n }\n newShape[key] = newField;\n }\n });\n return new ZodObject({\n ...this._def,\n shape: () => newShape,\n });\n }\n keyof() {\n return createZodEnum(util.objectKeys(this.shape));\n }\n}\nZodObject.create = (shape, params) => {\n return new ZodObject({\n shape: () => shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nZodObject.strictCreate = (shape, params) => {\n return new ZodObject({\n shape: () => shape,\n unknownKeys: \"strict\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nZodObject.lazycreate = (shape, params) => {\n return new ZodObject({\n shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nclass ZodUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const options = this._def.options;\n function handleResults(results) {\n // return first issue-free validation if it exists\n for (const result of results) {\n if (result.result.status === \"valid\") {\n return result.result;\n }\n }\n for (const result of results) {\n if (result.result.status === \"dirty\") {\n // add issues from dirty option\n ctx.common.issues.push(...result.ctx.common.issues);\n return result.result;\n }\n }\n // return invalid\n const unionErrors = results.map((result) => new ZodError(result.ctx.common.issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors,\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return Promise.all(options.map(async (option) => {\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n parent: null,\n };\n return {\n result: await option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx,\n }),\n ctx: childCtx,\n };\n })).then(handleResults);\n }\n else {\n let dirty = undefined;\n const issues = [];\n for (const option of options) {\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n parent: null,\n };\n const result = option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx,\n });\n if (result.status === \"valid\") {\n return result;\n }\n else if (result.status === \"dirty\" && !dirty) {\n dirty = { result, ctx: childCtx };\n }\n if (childCtx.common.issues.length) {\n issues.push(childCtx.common.issues);\n }\n }\n if (dirty) {\n ctx.common.issues.push(...dirty.ctx.common.issues);\n return dirty.result;\n }\n const unionErrors = issues.map((issues) => new ZodError(issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors,\n });\n return INVALID;\n }\n }\n get options() {\n return this._def.options;\n }\n}\nZodUnion.create = (types, params) => {\n return new ZodUnion({\n options: types,\n typeName: ZodFirstPartyTypeKind.ZodUnion,\n ...processCreateParams(params),\n });\n};\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\n////////// //////////\n////////// ZodDiscriminatedUnion //////////\n////////// //////////\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\nconst getDiscriminator = (type) => {\n if (type instanceof ZodLazy) {\n return getDiscriminator(type.schema);\n }\n else if (type instanceof ZodEffects) {\n return getDiscriminator(type.innerType());\n }\n else if (type instanceof ZodLiteral) {\n return [type.value];\n }\n else if (type instanceof ZodEnum) {\n return type.options;\n }\n else if (type instanceof ZodNativeEnum) {\n // eslint-disable-next-line ban/ban\n return util.objectValues(type.enum);\n }\n else if (type instanceof ZodDefault) {\n return getDiscriminator(type._def.innerType);\n }\n else if (type instanceof ZodUndefined) {\n return [undefined];\n }\n else if (type instanceof ZodNull) {\n return [null];\n }\n else if (type instanceof ZodOptional) {\n return [undefined, ...getDiscriminator(type.unwrap())];\n }\n else if (type instanceof ZodNullable) {\n return [null, ...getDiscriminator(type.unwrap())];\n }\n else if (type instanceof ZodBranded) {\n return getDiscriminator(type.unwrap());\n }\n else if (type instanceof ZodReadonly) {\n return getDiscriminator(type.unwrap());\n }\n else if (type instanceof ZodCatch) {\n return getDiscriminator(type._def.innerType);\n }\n else {\n return [];\n }\n};\nclass ZodDiscriminatedUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const discriminator = this.discriminator;\n const discriminatorValue = ctx.data[discriminator];\n const option = this.optionsMap.get(discriminatorValue);\n if (!option) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union_discriminator,\n options: Array.from(this.optionsMap.keys()),\n path: [discriminator],\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n }\n else {\n return option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n get discriminator() {\n return this._def.discriminator;\n }\n get options() {\n return this._def.options;\n }\n get optionsMap() {\n return this._def.optionsMap;\n }\n /**\n * The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor.\n * However, it only allows a union of objects, all of which need to share a discriminator property. This property must\n * have a different value for each object in the union.\n * @param discriminator the name of the discriminator property\n * @param types an array of object schemas\n * @param params\n */\n static create(discriminator, options, params) {\n // Get all the valid discriminator values\n const optionsMap = new Map();\n // try {\n for (const type of options) {\n const discriminatorValues = getDiscriminator(type.shape[discriminator]);\n if (!discriminatorValues.length) {\n throw new Error(`A discriminator value for key \\`${discriminator}\\` could not be extracted from all schema options`);\n }\n for (const value of discriminatorValues) {\n if (optionsMap.has(value)) {\n throw new Error(`Discriminator property ${String(discriminator)} has duplicate value ${String(value)}`);\n }\n optionsMap.set(value, type);\n }\n }\n return new ZodDiscriminatedUnion({\n typeName: ZodFirstPartyTypeKind.ZodDiscriminatedUnion,\n discriminator,\n options,\n optionsMap,\n ...processCreateParams(params),\n });\n }\n}\nfunction mergeValues(a, b) {\n const aType = getParsedType(a);\n const bType = getParsedType(b);\n if (a === b) {\n return { valid: true, data: a };\n }\n else if (aType === ZodParsedType.object && bType === ZodParsedType.object) {\n const bKeys = util.objectKeys(b);\n const sharedKeys = util\n .objectKeys(a)\n .filter((key) => bKeys.indexOf(key) !== -1);\n const newObj = { ...a, ...b };\n for (const key of sharedKeys) {\n const sharedValue = mergeValues(a[key], b[key]);\n if (!sharedValue.valid) {\n return { valid: false };\n }\n newObj[key] = sharedValue.data;\n }\n return { valid: true, data: newObj };\n }\n else if (aType === ZodParsedType.array && bType === ZodParsedType.array) {\n if (a.length !== b.length) {\n return { valid: false };\n }\n const newArray = [];\n for (let index = 0; index < a.length; index++) {\n const itemA = a[index];\n const itemB = b[index];\n const sharedValue = mergeValues(itemA, itemB);\n if (!sharedValue.valid) {\n return { valid: false };\n }\n newArray.push(sharedValue.data);\n }\n return { valid: true, data: newArray };\n }\n else if (aType === ZodParsedType.date &&\n bType === ZodParsedType.date &&\n +a === +b) {\n return { valid: true, data: a };\n }\n else {\n return { valid: false };\n }\n}\nclass ZodIntersection extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const handleParsed = (parsedLeft, parsedRight) => {\n if (isAborted(parsedLeft) || isAborted(parsedRight)) {\n return INVALID;\n }\n const merged = mergeValues(parsedLeft.value, parsedRight.value);\n if (!merged.valid) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_intersection_types,\n });\n return INVALID;\n }\n if (isDirty(parsedLeft) || isDirty(parsedRight)) {\n status.dirty();\n }\n return { status: status.value, value: merged.data };\n };\n if (ctx.common.async) {\n return Promise.all([\n this._def.left._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }),\n this._def.right._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }),\n ]).then(([left, right]) => handleParsed(left, right));\n }\n else {\n return handleParsed(this._def.left._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }), this._def.right._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }));\n }\n }\n}\nZodIntersection.create = (left, right, params) => {\n return new ZodIntersection({\n left: left,\n right: right,\n typeName: ZodFirstPartyTypeKind.ZodIntersection,\n ...processCreateParams(params),\n });\n};\nclass ZodTuple extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (ctx.data.length < this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: \"array\",\n });\n return INVALID;\n }\n const rest = this._def.rest;\n if (!rest && ctx.data.length > this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: \"array\",\n });\n status.dirty();\n }\n const items = [...ctx.data]\n .map((item, itemIndex) => {\n const schema = this._def.items[itemIndex] || this._def.rest;\n if (!schema)\n return null;\n return schema._parse(new ParseInputLazyPath(ctx, item, ctx.path, itemIndex));\n })\n .filter((x) => !!x); // filter nulls\n if (ctx.common.async) {\n return Promise.all(items).then((results) => {\n return ParseStatus.mergeArray(status, results);\n });\n }\n else {\n return ParseStatus.mergeArray(status, items);\n }\n }\n get items() {\n return this._def.items;\n }\n rest(rest) {\n return new ZodTuple({\n ...this._def,\n rest,\n });\n }\n}\nZodTuple.create = (schemas, params) => {\n if (!Array.isArray(schemas)) {\n throw new Error(\"You must pass an array of schemas to z.tuple([ ... ])\");\n }\n return new ZodTuple({\n items: schemas,\n typeName: ZodFirstPartyTypeKind.ZodTuple,\n rest: null,\n ...processCreateParams(params),\n });\n};\nclass ZodRecord extends ZodType {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const pairs = [];\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n for (const key in ctx.data) {\n pairs.push({\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, key)),\n value: valueType._parse(new ParseInputLazyPath(ctx, ctx.data[key], ctx.path, key)),\n alwaysSet: key in ctx.data,\n });\n }\n if (ctx.common.async) {\n return ParseStatus.mergeObjectAsync(status, pairs);\n }\n else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get element() {\n return this._def.valueType;\n }\n static create(first, second, third) {\n if (second instanceof ZodType) {\n return new ZodRecord({\n keyType: first,\n valueType: second,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(third),\n });\n }\n return new ZodRecord({\n keyType: ZodString.create(),\n valueType: first,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(second),\n });\n }\n}\nclass ZodMap extends ZodType {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.map) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.map,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n const pairs = [...ctx.data.entries()].map(([key, value], index) => {\n return {\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, [index, \"key\"])),\n value: valueType._parse(new ParseInputLazyPath(ctx, value, ctx.path, [index, \"value\"])),\n };\n });\n if (ctx.common.async) {\n const finalMap = new Map();\n return Promise.resolve().then(async () => {\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return { status: status.value, value: finalMap };\n });\n }\n else {\n const finalMap = new Map();\n for (const pair of pairs) {\n const key = pair.key;\n const value = pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return { status: status.value, value: finalMap };\n }\n }\n}\nZodMap.create = (keyType, valueType, params) => {\n return new ZodMap({\n valueType,\n keyType,\n typeName: ZodFirstPartyTypeKind.ZodMap,\n ...processCreateParams(params),\n });\n};\nclass ZodSet extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.set) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.set,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const def = this._def;\n if (def.minSize !== null) {\n if (ctx.data.size < def.minSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minSize.value,\n type: \"set\",\n inclusive: true,\n exact: false,\n message: def.minSize.message,\n });\n status.dirty();\n }\n }\n if (def.maxSize !== null) {\n if (ctx.data.size > def.maxSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxSize.value,\n type: \"set\",\n inclusive: true,\n exact: false,\n message: def.maxSize.message,\n });\n status.dirty();\n }\n }\n const valueType = this._def.valueType;\n function finalizeSet(elements) {\n const parsedSet = new Set();\n for (const element of elements) {\n if (element.status === \"aborted\")\n return INVALID;\n if (element.status === \"dirty\")\n status.dirty();\n parsedSet.add(element.value);\n }\n return { status: status.value, value: parsedSet };\n }\n const elements = [...ctx.data.values()].map((item, i) => valueType._parse(new ParseInputLazyPath(ctx, item, ctx.path, i)));\n if (ctx.common.async) {\n return Promise.all(elements).then((elements) => finalizeSet(elements));\n }\n else {\n return finalizeSet(elements);\n }\n }\n min(minSize, message) {\n return new ZodSet({\n ...this._def,\n minSize: { value: minSize, message: errorUtil.toString(message) },\n });\n }\n max(maxSize, message) {\n return new ZodSet({\n ...this._def,\n maxSize: { value: maxSize, message: errorUtil.toString(message) },\n });\n }\n size(size, message) {\n return this.min(size, message).max(size, message);\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodSet.create = (valueType, params) => {\n return new ZodSet({\n valueType,\n minSize: null,\n maxSize: null,\n typeName: ZodFirstPartyTypeKind.ZodSet,\n ...processCreateParams(params),\n });\n};\nclass ZodFunction extends ZodType {\n constructor() {\n super(...arguments);\n this.validate = this.implement;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.function) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.function,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n function makeArgsIssue(args, error) {\n return makeIssue({\n data: args,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap,\n ctx.schemaErrorMap,\n getErrorMap(),\n errorMap,\n ].filter((x) => !!x),\n issueData: {\n code: ZodIssueCode.invalid_arguments,\n argumentsError: error,\n },\n });\n }\n function makeReturnsIssue(returns, error) {\n return makeIssue({\n data: returns,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap,\n ctx.schemaErrorMap,\n getErrorMap(),\n errorMap,\n ].filter((x) => !!x),\n issueData: {\n code: ZodIssueCode.invalid_return_type,\n returnTypeError: error,\n },\n });\n }\n const params = { errorMap: ctx.common.contextualErrorMap };\n const fn = ctx.data;\n if (this._def.returns instanceof ZodPromise) {\n // Would love a way to avoid disabling this rule, but we need\n // an alias (using an arrow function was what caused 2651).\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const me = this;\n return OK(async function (...args) {\n const error = new ZodError([]);\n const parsedArgs = await me._def.args\n .parseAsync(args, params)\n .catch((e) => {\n error.addIssue(makeArgsIssue(args, e));\n throw error;\n });\n const result = await Reflect.apply(fn, this, parsedArgs);\n const parsedReturns = await me._def.returns._def.type\n .parseAsync(result, params)\n .catch((e) => {\n error.addIssue(makeReturnsIssue(result, e));\n throw error;\n });\n return parsedReturns;\n });\n }\n else {\n // Would love a way to avoid disabling this rule, but we need\n // an alias (using an arrow function was what caused 2651).\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const me = this;\n return OK(function (...args) {\n const parsedArgs = me._def.args.safeParse(args, params);\n if (!parsedArgs.success) {\n throw new ZodError([makeArgsIssue(args, parsedArgs.error)]);\n }\n const result = Reflect.apply(fn, this, parsedArgs.data);\n const parsedReturns = me._def.returns.safeParse(result, params);\n if (!parsedReturns.success) {\n throw new ZodError([makeReturnsIssue(result, parsedReturns.error)]);\n }\n return parsedReturns.data;\n });\n }\n }\n parameters() {\n return this._def.args;\n }\n returnType() {\n return this._def.returns;\n }\n args(...items) {\n return new ZodFunction({\n ...this._def,\n args: ZodTuple.create(items).rest(ZodUnknown.create()),\n });\n }\n returns(returnType) {\n return new ZodFunction({\n ...this._def,\n returns: returnType,\n });\n }\n implement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n strictImplement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n static create(args, returns, params) {\n return new ZodFunction({\n args: (args\n ? args\n : ZodTuple.create([]).rest(ZodUnknown.create())),\n returns: returns || ZodUnknown.create(),\n typeName: ZodFirstPartyTypeKind.ZodFunction,\n ...processCreateParams(params),\n });\n }\n}\nclass ZodLazy extends ZodType {\n get schema() {\n return this._def.getter();\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const lazySchema = this._def.getter();\n return lazySchema._parse({ data: ctx.data, path: ctx.path, parent: ctx });\n }\n}\nZodLazy.create = (getter, params) => {\n return new ZodLazy({\n getter: getter,\n typeName: ZodFirstPartyTypeKind.ZodLazy,\n ...processCreateParams(params),\n });\n};\nclass ZodLiteral extends ZodType {\n _parse(input) {\n if (input.data !== this._def.value) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_literal,\n expected: this._def.value,\n });\n return INVALID;\n }\n return { status: \"valid\", value: input.data };\n }\n get value() {\n return this._def.value;\n }\n}\nZodLiteral.create = (value, params) => {\n return new ZodLiteral({\n value: value,\n typeName: ZodFirstPartyTypeKind.ZodLiteral,\n ...processCreateParams(params),\n });\n};\nfunction createZodEnum(values, params) {\n return new ZodEnum({\n values,\n typeName: ZodFirstPartyTypeKind.ZodEnum,\n ...processCreateParams(params),\n });\n}\nclass ZodEnum extends ZodType {\n constructor() {\n super(...arguments);\n _ZodEnum_cache.set(this, void 0);\n }\n _parse(input) {\n if (typeof input.data !== \"string\") {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type,\n });\n return INVALID;\n }\n if (!__classPrivateFieldGet(this, _ZodEnum_cache, \"f\")) {\n __classPrivateFieldSet(this, _ZodEnum_cache, new Set(this._def.values), \"f\");\n }\n if (!__classPrivateFieldGet(this, _ZodEnum_cache, \"f\").has(input.data)) {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get options() {\n return this._def.values;\n }\n get enum() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Values() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Enum() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n extract(values, newDef = this._def) {\n return ZodEnum.create(values, {\n ...this._def,\n ...newDef,\n });\n }\n exclude(values, newDef = this._def) {\n return ZodEnum.create(this.options.filter((opt) => !values.includes(opt)), {\n ...this._def,\n ...newDef,\n });\n }\n}\n_ZodEnum_cache = new WeakMap();\nZodEnum.create = createZodEnum;\nclass ZodNativeEnum extends ZodType {\n constructor() {\n super(...arguments);\n _ZodNativeEnum_cache.set(this, void 0);\n }\n _parse(input) {\n const nativeEnumValues = util.getValidEnumValues(this._def.values);\n const ctx = this._getOrReturnCtx(input);\n if (ctx.parsedType !== ZodParsedType.string &&\n ctx.parsedType !== ZodParsedType.number) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type,\n });\n return INVALID;\n }\n if (!__classPrivateFieldGet(this, _ZodNativeEnum_cache, \"f\")) {\n __classPrivateFieldSet(this, _ZodNativeEnum_cache, new Set(util.getValidEnumValues(this._def.values)), \"f\");\n }\n if (!__classPrivateFieldGet(this, _ZodNativeEnum_cache, \"f\").has(input.data)) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get enum() {\n return this._def.values;\n }\n}\n_ZodNativeEnum_cache = new WeakMap();\nZodNativeEnum.create = (values, params) => {\n return new ZodNativeEnum({\n values: values,\n typeName: ZodFirstPartyTypeKind.ZodNativeEnum,\n ...processCreateParams(params),\n });\n};\nclass ZodPromise extends ZodType {\n unwrap() {\n return this._def.type;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.promise &&\n ctx.common.async === false) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.promise,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const promisified = ctx.parsedType === ZodParsedType.promise\n ? ctx.data\n : Promise.resolve(ctx.data);\n return OK(promisified.then((data) => {\n return this._def.type.parseAsync(data, {\n path: ctx.path,\n errorMap: ctx.common.contextualErrorMap,\n });\n }));\n }\n}\nZodPromise.create = (schema, params) => {\n return new ZodPromise({\n type: schema,\n typeName: ZodFirstPartyTypeKind.ZodPromise,\n ...processCreateParams(params),\n });\n};\nclass ZodEffects extends ZodType {\n innerType() {\n return this._def.schema;\n }\n sourceType() {\n return this._def.schema._def.typeName === ZodFirstPartyTypeKind.ZodEffects\n ? this._def.schema.sourceType()\n : this._def.schema;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const effect = this._def.effect || null;\n const checkCtx = {\n addIssue: (arg) => {\n addIssueToContext(ctx, arg);\n if (arg.fatal) {\n status.abort();\n }\n else {\n status.dirty();\n }\n },\n get path() {\n return ctx.path;\n },\n };\n checkCtx.addIssue = checkCtx.addIssue.bind(checkCtx);\n if (effect.type === \"preprocess\") {\n const processed = effect.transform(ctx.data, checkCtx);\n if (ctx.common.async) {\n return Promise.resolve(processed).then(async (processed) => {\n if (status.value === \"aborted\")\n return INVALID;\n const result = await this._def.schema._parseAsync({\n data: processed,\n path: ctx.path,\n parent: ctx,\n });\n if (result.status === \"aborted\")\n return INVALID;\n if (result.status === \"dirty\")\n return DIRTY(result.value);\n if (status.value === \"dirty\")\n return DIRTY(result.value);\n return result;\n });\n }\n else {\n if (status.value === \"aborted\")\n return INVALID;\n const result = this._def.schema._parseSync({\n data: processed,\n path: ctx.path,\n parent: ctx,\n });\n if (result.status === \"aborted\")\n return INVALID;\n if (result.status === \"dirty\")\n return DIRTY(result.value);\n if (status.value === \"dirty\")\n return DIRTY(result.value);\n return result;\n }\n }\n if (effect.type === \"refinement\") {\n const executeRefinement = (acc) => {\n const result = effect.refinement(acc, checkCtx);\n if (ctx.common.async) {\n return Promise.resolve(result);\n }\n if (result instanceof Promise) {\n throw new Error(\"Async refinement encountered during synchronous parse operation. Use .parseAsync instead.\");\n }\n return acc;\n };\n if (ctx.common.async === false) {\n const inner = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inner.status === \"aborted\")\n return INVALID;\n if (inner.status === \"dirty\")\n status.dirty();\n // return value is ignored\n executeRefinement(inner.value);\n return { status: status.value, value: inner.value };\n }\n else {\n return this._def.schema\n ._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx })\n .then((inner) => {\n if (inner.status === \"aborted\")\n return INVALID;\n if (inner.status === \"dirty\")\n status.dirty();\n return executeRefinement(inner.value).then(() => {\n return { status: status.value, value: inner.value };\n });\n });\n }\n }\n if (effect.type === \"transform\") {\n if (ctx.common.async === false) {\n const base = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (!isValid(base))\n return base;\n const result = effect.transform(base.value, checkCtx);\n if (result instanceof Promise) {\n throw new Error(`Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.`);\n }\n return { status: status.value, value: result };\n }\n else {\n return this._def.schema\n ._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx })\n .then((base) => {\n if (!isValid(base))\n return base;\n return Promise.resolve(effect.transform(base.value, checkCtx)).then((result) => ({ status: status.value, value: result }));\n });\n }\n }\n util.assertNever(effect);\n }\n}\nZodEffects.create = (schema, effect, params) => {\n return new ZodEffects({\n schema,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect,\n ...processCreateParams(params),\n });\n};\nZodEffects.createWithPreprocess = (preprocess, schema, params) => {\n return new ZodEffects({\n schema,\n effect: { type: \"preprocess\", transform: preprocess },\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n ...processCreateParams(params),\n });\n};\nclass ZodOptional extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.undefined) {\n return OK(undefined);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodOptional.create = (type, params) => {\n return new ZodOptional({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodOptional,\n ...processCreateParams(params),\n });\n};\nclass ZodNullable extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.null) {\n return OK(null);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodNullable.create = (type, params) => {\n return new ZodNullable({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodNullable,\n ...processCreateParams(params),\n });\n};\nclass ZodDefault extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n let data = ctx.data;\n if (ctx.parsedType === ZodParsedType.undefined) {\n data = this._def.defaultValue();\n }\n return this._def.innerType._parse({\n data,\n path: ctx.path,\n parent: ctx,\n });\n }\n removeDefault() {\n return this._def.innerType;\n }\n}\nZodDefault.create = (type, params) => {\n return new ZodDefault({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodDefault,\n defaultValue: typeof params.default === \"function\"\n ? params.default\n : () => params.default,\n ...processCreateParams(params),\n });\n};\nclass ZodCatch extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n // newCtx is used to not collect issues from inner types in ctx\n const newCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n };\n const result = this._def.innerType._parse({\n data: newCtx.data,\n path: newCtx.path,\n parent: {\n ...newCtx,\n },\n });\n if (isAsync(result)) {\n return result.then((result) => {\n return {\n status: \"valid\",\n value: result.status === \"valid\"\n ? result.value\n : this._def.catchValue({\n get error() {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data,\n }),\n };\n });\n }\n else {\n return {\n status: \"valid\",\n value: result.status === \"valid\"\n ? result.value\n : this._def.catchValue({\n get error() {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data,\n }),\n };\n }\n }\n removeCatch() {\n return this._def.innerType;\n }\n}\nZodCatch.create = (type, params) => {\n return new ZodCatch({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodCatch,\n catchValue: typeof params.catch === \"function\" ? params.catch : () => params.catch,\n ...processCreateParams(params),\n });\n};\nclass ZodNaN extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.nan) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.nan,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return { status: \"valid\", value: input.data };\n }\n}\nZodNaN.create = (params) => {\n return new ZodNaN({\n typeName: ZodFirstPartyTypeKind.ZodNaN,\n ...processCreateParams(params),\n });\n};\nconst BRAND = Symbol(\"zod_brand\");\nclass ZodBranded extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const data = ctx.data;\n return this._def.type._parse({\n data,\n path: ctx.path,\n parent: ctx,\n });\n }\n unwrap() {\n return this._def.type;\n }\n}\nclass ZodPipeline extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.common.async) {\n const handleAsync = async () => {\n const inResult = await this._def.in._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inResult.status === \"aborted\")\n return INVALID;\n if (inResult.status === \"dirty\") {\n status.dirty();\n return DIRTY(inResult.value);\n }\n else {\n return this._def.out._parseAsync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx,\n });\n }\n };\n return handleAsync();\n }\n else {\n const inResult = this._def.in._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inResult.status === \"aborted\")\n return INVALID;\n if (inResult.status === \"dirty\") {\n status.dirty();\n return {\n status: \"dirty\",\n value: inResult.value,\n };\n }\n else {\n return this._def.out._parseSync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n }\n static create(a, b) {\n return new ZodPipeline({\n in: a,\n out: b,\n typeName: ZodFirstPartyTypeKind.ZodPipeline,\n });\n }\n}\nclass ZodReadonly extends ZodType {\n _parse(input) {\n const result = this._def.innerType._parse(input);\n const freeze = (data) => {\n if (isValid(data)) {\n data.value = Object.freeze(data.value);\n }\n return data;\n };\n return isAsync(result)\n ? result.then((data) => freeze(data))\n : freeze(result);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodReadonly.create = (type, params) => {\n return new ZodReadonly({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodReadonly,\n ...processCreateParams(params),\n });\n};\nfunction custom(check, params = {}, \n/**\n * @deprecated\n *\n * Pass `fatal` into the params object instead:\n *\n * ```ts\n * z.string().custom((val) => val.length > 5, { fatal: false })\n * ```\n *\n */\nfatal) {\n if (check)\n return ZodAny.create().superRefine((data, ctx) => {\n var _a, _b;\n if (!check(data)) {\n const p = typeof params === \"function\"\n ? params(data)\n : typeof params === \"string\"\n ? { message: params }\n : params;\n const _fatal = (_b = (_a = p.fatal) !== null && _a !== void 0 ? _a : fatal) !== null && _b !== void 0 ? _b : true;\n const p2 = typeof p === \"string\" ? { message: p } : p;\n ctx.addIssue({ code: \"custom\", ...p2, fatal: _fatal });\n }\n });\n return ZodAny.create();\n}\nconst late = {\n object: ZodObject.lazycreate,\n};\nvar ZodFirstPartyTypeKind;\n(function (ZodFirstPartyTypeKind) {\n ZodFirstPartyTypeKind[\"ZodString\"] = \"ZodString\";\n ZodFirstPartyTypeKind[\"ZodNumber\"] = \"ZodNumber\";\n ZodFirstPartyTypeKind[\"ZodNaN\"] = \"ZodNaN\";\n ZodFirstPartyTypeKind[\"ZodBigInt\"] = \"ZodBigInt\";\n ZodFirstPartyTypeKind[\"ZodBoolean\"] = \"ZodBoolean\";\n ZodFirstPartyTypeKind[\"ZodDate\"] = \"ZodDate\";\n ZodFirstPartyTypeKind[\"ZodSymbol\"] = \"ZodSymbol\";\n ZodFirstPartyTypeKind[\"ZodUndefined\"] = \"ZodUndefined\";\n ZodFirstPartyTypeKind[\"ZodNull\"] = \"ZodNull\";\n ZodFirstPartyTypeKind[\"ZodAny\"] = \"ZodAny\";\n ZodFirstPartyTypeKind[\"ZodUnknown\"] = \"ZodUnknown\";\n ZodFirstPartyTypeKind[\"ZodNever\"] = \"ZodNever\";\n ZodFirstPartyTypeKind[\"ZodVoid\"] = \"ZodVoid\";\n ZodFirstPartyTypeKind[\"ZodArray\"] = \"ZodArray\";\n ZodFirstPartyTypeKind[\"ZodObject\"] = \"ZodObject\";\n ZodFirstPartyTypeKind[\"ZodUnion\"] = \"ZodUnion\";\n ZodFirstPartyTypeKind[\"ZodDiscriminatedUnion\"] = \"ZodDiscriminatedUnion\";\n ZodFirstPartyTypeKind[\"ZodIntersection\"] = \"ZodIntersection\";\n ZodFirstPartyTypeKind[\"ZodTuple\"] = \"ZodTuple\";\n ZodFirstPartyTypeKind[\"ZodRecord\"] = \"ZodRecord\";\n ZodFirstPartyTypeKind[\"ZodMap\"] = \"ZodMap\";\n ZodFirstPartyTypeKind[\"ZodSet\"] = \"ZodSet\";\n ZodFirstPartyTypeKind[\"ZodFunction\"] = \"ZodFunction\";\n ZodFirstPartyTypeKind[\"ZodLazy\"] = \"ZodLazy\";\n ZodFirstPartyTypeKind[\"ZodLiteral\"] = \"ZodLiteral\";\n ZodFirstPartyTypeKind[\"ZodEnum\"] = \"ZodEnum\";\n ZodFirstPartyTypeKind[\"ZodEffects\"] = \"ZodEffects\";\n ZodFirstPartyTypeKind[\"ZodNativeEnum\"] = \"ZodNativeEnum\";\n ZodFirstPartyTypeKind[\"ZodOptional\"] = \"ZodOptional\";\n ZodFirstPartyTypeKind[\"ZodNullable\"] = \"ZodNullable\";\n ZodFirstPartyTypeKind[\"ZodDefault\"] = \"ZodDefault\";\n ZodFirstPartyTypeKind[\"ZodCatch\"] = \"ZodCatch\";\n ZodFirstPartyTypeKind[\"ZodPromise\"] = \"ZodPromise\";\n ZodFirstPartyTypeKind[\"ZodBranded\"] = \"ZodBranded\";\n ZodFirstPartyTypeKind[\"ZodPipeline\"] = \"ZodPipeline\";\n ZodFirstPartyTypeKind[\"ZodReadonly\"] = \"ZodReadonly\";\n})(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {}));\nconst instanceOfType = (\n// const instanceOfType = any>(\ncls, params = {\n message: `Input not instance of ${cls.name}`,\n}) => custom((data) => data instanceof cls, params);\nconst stringType = ZodString.create;\nconst numberType = ZodNumber.create;\nconst nanType = ZodNaN.create;\nconst bigIntType = ZodBigInt.create;\nconst booleanType = ZodBoolean.create;\nconst dateType = ZodDate.create;\nconst symbolType = ZodSymbol.create;\nconst undefinedType = ZodUndefined.create;\nconst nullType = ZodNull.create;\nconst anyType = ZodAny.create;\nconst unknownType = ZodUnknown.create;\nconst neverType = ZodNever.create;\nconst voidType = ZodVoid.create;\nconst arrayType = ZodArray.create;\nconst objectType = ZodObject.create;\nconst strictObjectType = ZodObject.strictCreate;\nconst unionType = ZodUnion.create;\nconst discriminatedUnionType = ZodDiscriminatedUnion.create;\nconst intersectionType = ZodIntersection.create;\nconst tupleType = ZodTuple.create;\nconst recordType = ZodRecord.create;\nconst mapType = ZodMap.create;\nconst setType = ZodSet.create;\nconst functionType = ZodFunction.create;\nconst lazyType = ZodLazy.create;\nconst literalType = ZodLiteral.create;\nconst enumType = ZodEnum.create;\nconst nativeEnumType = ZodNativeEnum.create;\nconst promiseType = ZodPromise.create;\nconst effectsType = ZodEffects.create;\nconst optionalType = ZodOptional.create;\nconst nullableType = ZodNullable.create;\nconst preprocessType = ZodEffects.createWithPreprocess;\nconst pipelineType = ZodPipeline.create;\nconst ostring = () => stringType().optional();\nconst onumber = () => numberType().optional();\nconst oboolean = () => booleanType().optional();\nconst coerce = {\n string: ((arg) => ZodString.create({ ...arg, coerce: true })),\n number: ((arg) => ZodNumber.create({ ...arg, coerce: true })),\n boolean: ((arg) => ZodBoolean.create({\n ...arg,\n coerce: true,\n })),\n bigint: ((arg) => ZodBigInt.create({ ...arg, coerce: true })),\n date: ((arg) => ZodDate.create({ ...arg, coerce: true })),\n};\nconst NEVER = INVALID;\n\nvar z = /*#__PURE__*/Object.freeze({\n __proto__: null,\n defaultErrorMap: errorMap,\n setErrorMap: setErrorMap,\n getErrorMap: getErrorMap,\n makeIssue: makeIssue,\n EMPTY_PATH: EMPTY_PATH,\n addIssueToContext: addIssueToContext,\n ParseStatus: ParseStatus,\n INVALID: INVALID,\n DIRTY: DIRTY,\n OK: OK,\n isAborted: isAborted,\n isDirty: isDirty,\n isValid: isValid,\n isAsync: isAsync,\n get util () { return util; },\n get objectUtil () { return objectUtil; },\n ZodParsedType: ZodParsedType,\n getParsedType: getParsedType,\n ZodType: ZodType,\n datetimeRegex: datetimeRegex,\n ZodString: ZodString,\n ZodNumber: ZodNumber,\n ZodBigInt: ZodBigInt,\n ZodBoolean: ZodBoolean,\n ZodDate: ZodDate,\n ZodSymbol: ZodSymbol,\n ZodUndefined: ZodUndefined,\n ZodNull: ZodNull,\n ZodAny: ZodAny,\n ZodUnknown: ZodUnknown,\n ZodNever: ZodNever,\n ZodVoid: ZodVoid,\n ZodArray: ZodArray,\n ZodObject: ZodObject,\n ZodUnion: ZodUnion,\n ZodDiscriminatedUnion: ZodDiscriminatedUnion,\n ZodIntersection: ZodIntersection,\n ZodTuple: ZodTuple,\n ZodRecord: ZodRecord,\n ZodMap: ZodMap,\n ZodSet: ZodSet,\n ZodFunction: ZodFunction,\n ZodLazy: ZodLazy,\n ZodLiteral: ZodLiteral,\n ZodEnum: ZodEnum,\n ZodNativeEnum: ZodNativeEnum,\n ZodPromise: ZodPromise,\n ZodEffects: ZodEffects,\n ZodTransformer: ZodEffects,\n ZodOptional: ZodOptional,\n ZodNullable: ZodNullable,\n ZodDefault: ZodDefault,\n ZodCatch: ZodCatch,\n ZodNaN: ZodNaN,\n BRAND: BRAND,\n ZodBranded: ZodBranded,\n ZodPipeline: ZodPipeline,\n ZodReadonly: ZodReadonly,\n custom: custom,\n Schema: ZodType,\n ZodSchema: ZodType,\n late: late,\n get ZodFirstPartyTypeKind () { return ZodFirstPartyTypeKind; },\n coerce: coerce,\n any: anyType,\n array: arrayType,\n bigint: bigIntType,\n boolean: booleanType,\n date: dateType,\n discriminatedUnion: discriminatedUnionType,\n effect: effectsType,\n 'enum': enumType,\n 'function': functionType,\n 'instanceof': instanceOfType,\n intersection: intersectionType,\n lazy: lazyType,\n literal: literalType,\n map: mapType,\n nan: nanType,\n nativeEnum: nativeEnumType,\n never: neverType,\n 'null': nullType,\n nullable: nullableType,\n number: numberType,\n object: objectType,\n oboolean: oboolean,\n onumber: onumber,\n optional: optionalType,\n ostring: ostring,\n pipeline: pipelineType,\n preprocess: preprocessType,\n promise: promiseType,\n record: recordType,\n set: setType,\n strictObject: strictObjectType,\n string: stringType,\n symbol: symbolType,\n transformer: effectsType,\n tuple: tupleType,\n 'undefined': undefinedType,\n union: unionType,\n unknown: unknownType,\n 'void': voidType,\n NEVER: NEVER,\n ZodIssueCode: ZodIssueCode,\n quotelessJson: quotelessJson,\n ZodError: ZodError\n});\n\nexport { BRAND, DIRTY, EMPTY_PATH, INVALID, NEVER, OK, ParseStatus, ZodType as Schema, ZodAny, ZodArray, ZodBigInt, ZodBoolean, ZodBranded, ZodCatch, ZodDate, ZodDefault, ZodDiscriminatedUnion, ZodEffects, ZodEnum, ZodError, ZodFirstPartyTypeKind, ZodFunction, ZodIntersection, ZodIssueCode, ZodLazy, ZodLiteral, ZodMap, ZodNaN, ZodNativeEnum, ZodNever, ZodNull, ZodNullable, ZodNumber, ZodObject, ZodOptional, ZodParsedType, ZodPipeline, ZodPromise, ZodReadonly, ZodRecord, ZodType as ZodSchema, ZodSet, ZodString, ZodSymbol, ZodEffects as ZodTransformer, ZodTuple, ZodType, ZodUndefined, ZodUnion, ZodUnknown, ZodVoid, addIssueToContext, anyType as any, arrayType as array, bigIntType as bigint, booleanType as boolean, coerce, custom, dateType as date, datetimeRegex, z as default, errorMap as defaultErrorMap, discriminatedUnionType as discriminatedUnion, effectsType as effect, enumType as enum, functionType as function, getErrorMap, getParsedType, instanceOfType as instanceof, intersectionType as intersection, isAborted, isAsync, isDirty, isValid, late, lazyType as lazy, literalType as literal, makeIssue, mapType as map, nanType as nan, nativeEnumType as nativeEnum, neverType as never, nullType as null, nullableType as nullable, numberType as number, objectType as object, objectUtil, oboolean, onumber, optionalType as optional, ostring, pipelineType as pipeline, preprocessType as preprocess, promiseType as promise, quotelessJson, recordType as record, setType as set, setErrorMap, strictObjectType as strictObject, stringType as string, symbolType as symbol, effectsType as transformer, tupleType as tuple, undefinedType as undefined, unionType as union, unknownType as unknown, util, voidType as void, z };\n","import { ImageFiltering, ImageSource, Loader } from \"excalibur\";\nimport { LdtkResource } from '@excalibur-ldtk';\n\nexport const Resources = {\n HeroSpriteSheetPng: new ImageSource('./Solaria Demo Pack Update 03/Solaria Demo Pack Update 03/16x16/Sprites/Hero 01.png'),\n LdtkResource: new LdtkResource('./spacing-padding/spacing-padding.ldtk', {\n useTilemapCameraStrategy: true,\n useMapBackgroundColor: true,\n }),\n LdtkAutoTile: new LdtkResource('./autotile/autotile.ldtk', {\n useMapBackgroundColor: true,\n }),\n LdtkPureAutoTile: new LdtkResource('./dsml1/dsml1.ldtk', {\n useMapBackgroundColor: true,\n })\n} as const;\n\n\nexport const loader = new Loader();\nfor (let resource of Object.values(Resources)) {\n loader.addResource(resource);\n}","import { Actor, Entity, Vector, vec } from \"excalibur\";\nimport { LdtkResource } from \"./ldtk-resource\";\nimport { LdtkEntityInstance, LdtkLayerInstance } from \"./types\";\nimport { Level } from \"./level\";\n\nexport class EntityLayer {\n public worldPos: Vector;\n public offset: Vector;\n public entities: Entity[] = [];\n public ldtkToEntity = new Map();\n public entityToLdtk = new Map();\n\n constructor(\n level: Level,\n public readonly ldtkLayer: LdtkLayerInstance,\n private resource: LdtkResource,\n public readonly order: number) {\n this.worldPos = vec(level.ldtkLevel.worldX, level.ldtkLevel.worldY);\n this.offset = vec(ldtkLayer.__pxTotalOffsetX, ldtkLayer.__pxTotalOffsetY);\n console.log(\"yo\");\n }\n\n runFactories() {\n const ldtkLayer = this.ldtkLayer;\n const resource = this.resource;\n const order = this.order;\n if (ldtkLayer.entityInstances) {\n for (let entity of ldtkLayer.entityInstances) {\n const entityMetadata = resource.projectMetadata.defs.entities.find(e => {\n return e.identifier === entity.__identifier\n });\n if (resource.factories.has(entity.__identifier)) {\n const factory = resource.factories.get(entity.__identifier);\n if (factory) {\n const newEntity = factory({\n type: entity.__identifier,\n worldPos: vec(entity.px[0], entity.px[1]).add(this.worldPos.add(this.offset)),\n entity,\n definition: entityMetadata,\n layer: this,\n });\n if (newEntity) {\n this.entities.push(newEntity);\n this.ldtkToEntity.set(entity, newEntity);\n this.entityToLdtk.set(newEntity, entity);\n }\n }\n } else {\n if (entity.__tile) {\n const actor = new Actor({\n name: entity.__identifier,\n pos: vec(entity.px[0], entity.px[1]).add(this.worldPos.add(this.offset)),\n width: entity.width,\n height: entity.height,\n anchor: vec(entityMetadata?.pivotX ?? 0, entityMetadata?.pivotY ?? 0),\n z: order\n });\n const ts = resource.tilesets.get(entity.__tile.tilesetUid);\n if (ts) {\n const tsxCoord = Math.floor(entity.__tile.x / entity.__tile.w);\n const tsyCoord = Math.floor(entity.__tile.y / entity.__tile.h);\n const sprite = ts.spritesheet.getSprite(tsxCoord, tsyCoord);\n if (sprite) {\n actor.graphics.use(sprite);\n }\n }\n\n this.entities.push(actor);\n this.ldtkToEntity.set(entity, actor);\n this.entityToLdtk.set(actor, entity);\n }\n }\n }\n }\n\n // for (let entity of this.ldtkLayer.entityInstances) {\n // const factory = this.resource.factories.get(entity.__identifier);\n // if (!factory) { continue }\n //\n // const entityMetadata = this.resource.projectMetadata.defs.entities.find(e => {\n // return e.identifier === entity.__identifier\n // });\n //\n // const newEntity = factory({\n // type: entity.__identifier,\n // worldPos: vec(entity.px[0], entity.px[1]).add(this.worldPos.add(this.offset)),\n // entity,\n // definition: entityMetadata,\n // layer: this,\n // });\n //\n // if (newEntity) {\n // // remove pre-existing entity (e.g. the default actor created for the entity placement)\n // const preExisting = this.ldtkToEntity.get(entity);\n // if (preExisting) {\n // const index = this.entities.indexOf(preExisting);\n // if (index > -1) {\n // this.entities.splice(index, 1);\n // this.ldtkToEntity.delete(entity);\n // this.entityToLdtk.delete(preExisting);\n // }\n // }\n //\n // this.entities.push(newEntity);\n // this.ldtkToEntity.set(entity, newEntity);\n // this.entityToLdtk.set(newEntity, entity);\n // }\n // }\n }\n\n\n getEntitiesByIdentifier(identifier: string): Entity[] {\n const ldtkEntities = this.getLdtkEntitiesByIdentifier(identifier);\n let results: Entity[] = [];\n for (const ldtk of ldtkEntities) {\n const maybeEntity = this.ldtkToEntity.get(ldtk);\n if (maybeEntity) {\n results.push(maybeEntity);\n }\n }\n return results;\n }\n\n getEntitiesByField(fieldIdentifier: string, value?: any): Entity[] {\n const ldtkEntities = this.getLdtkEntitiesByField(fieldIdentifier, value);\n let results: Entity[] = [];\n for (const ldtk of ldtkEntities) {\n const maybeEntity = this.ldtkToEntity.get(ldtk);\n if (maybeEntity) {\n results.push(maybeEntity);\n }\n }\n return results;\n }\n\n /**\n * Search layer for entities that match an identifier (case insensitive)\n * @param identifier \n * @returns \n */\n getLdtkEntitiesByIdentifier(identifier: string): LdtkEntityInstance[] {\n return this.ldtkLayer.entityInstances.filter(e => e.__identifier.toLocaleLowerCase() === identifier.toLowerCase());\n }\n\n /**\n * Search layer for entities that match a field and optionally a value (both case insensitive)\n * @param fieldIdentifier \n * @param value\n */\n getLdtkEntitiesByField(fieldIdentifier: string, value?: any): LdtkEntityInstance[] {\n return this.ldtkLayer.entityInstances.filter(e => {\n if (value !== undefined) {\n let normalizedValue = value;\n if (typeof value === 'string') {\n normalizedValue = value.toLocaleLowerCase();\n }\n\n const field = e.fieldInstances.find(f => f.__identifier.toLocaleLowerCase() === fieldIdentifier.toLocaleLowerCase());\n if (field) {\n return field.__value === normalizedValue;\n }\n return false;\n } else {\n return !!e.fieldInstances.find(f => f.__identifier.toLocaleLowerCase() === fieldIdentifier.toLocaleLowerCase());\n }\n });\n }\n}\n","\n\nexport type FileLoader = (path: string, contentType: 'json' | 'xml') => Promise;\n\nexport const FetchLoader: FileLoader = async (path: string, contentType: 'json' | 'xml') => {\n const response = await fetch(path);\n switch(contentType.toLowerCase()) {\n case 'xml': return await response.text();\n case 'json': return await response.json();\n default: return await response.text();\n }\n}","\nexport * from './ldtk-resource';\nexport * from './entity-layer';\nexport * from './file-loader';\nexport * from './intgrid-layer';\nexport * from './level-resource';\nexport * from './level';\nexport * from './loader-cache';\nexport * from './path-util';\nexport * from './tile-layer';\nexport * from './tileset';\nexport * from './types';","import { GraphicsComponent, TileMap, Vector, vec } from \"excalibur\";\nimport { LdtkLayerInstance } from \"./types\";\nimport { LdtkResource } from \"./ldtk-resource\";\nimport { Level } from \"./level\";\nimport { Tileset } from \"./tileset\";\n\nexport class IntGridLayer {\n\n public ldtkLayer: LdtkLayerInstance;\n public worldPos: Vector;\n public offset: Vector;\n public tilemap!: TileMap;\n public tileset?: Tileset;\n\n constructor(level: Level, ldtkLayer: LdtkLayerInstance, resource: LdtkResource, public readonly order: number) {\n this.worldPos = vec(level.ldtkLevel.worldX, level.ldtkLevel.worldY);\n this.offset = vec(ldtkLayer.__pxTotalOffsetX, ldtkLayer.__pxTotalOffsetY);\n this.ldtkLayer = ldtkLayer;\n if (ldtkLayer.intGridCsv.length || ldtkLayer.autoLayerTiles.length) {\n\n const rows = ldtkLayer.__cHei;\n const columns = ldtkLayer.__cWid;\n this.tilemap = new TileMap({\n name: ldtkLayer.__identifier,\n pos: this.worldPos.add(this.offset),\n tileWidth: ldtkLayer.__gridSize,\n tileHeight: ldtkLayer.__gridSize,\n rows,\n columns,\n });\n this.tilemap.z = order;\n const graphics = this.tilemap.get(GraphicsComponent);\n graphics.isVisible = ldtkLayer.visible;\n\n // find the intgrid metadata\n const layerMetadata = resource.projectMetadata.defs.layers.find(l => {\n return ldtkLayer.__identifier === l.identifier;\n });\n\n if (layerMetadata) {\n const solidValue = layerMetadata.intGridValues.find(val => {\n return val?.identifier?.toLocaleLowerCase() === 'solid';\n });\n\n for (let i = 0; i < ldtkLayer.intGridCsv.length; i++) {\n const xCoord = i % columns;\n const yCoord = Math.floor(i / columns);\n const tile = this.tilemap.getTile(xCoord, yCoord);\n if (solidValue && ldtkLayer.intGridCsv[i] === solidValue.value) {\n tile!.solid = true;\n }\n\n // TODO might be a mistake to treat 1 as solid if there isn't a labelled solid\n if (!solidValue && ldtkLayer.intGridCsv[i] === 1) {\n tile!.solid = true;\n }\n }\n\n if (ldtkLayer.__tilesetDefUid) {\n this.tileset = resource.tilesets.get(ldtkLayer.__tilesetDefUid);\n for (let i = 0; i < ldtkLayer.autoLayerTiles.length; i++) {\n const tile = ldtkLayer.autoLayerTiles[i];\n const xCoord = Math.floor(tile.px[0] / ldtkLayer.__gridSize);\n const yCoord = Math.floor(tile.px[1] / ldtkLayer.__gridSize);\n const exTile = this.tilemap.getTile(xCoord, yCoord);\n if (exTile && this.tileset) {\n const tsxCoord = Math.floor((tile.src[0] - (this.tileset.ldtkTileset.padding ?? 0)) / (this.tileset.ldtkTileset.tileGridSize + (this.tileset.ldtkTileset.spacing ?? 0)));\n const tsyCoord = Math.floor((tile.src[1] - (this.tileset.ldtkTileset.padding ?? 0)) / (this.tileset.ldtkTileset.tileGridSize + (this.tileset.ldtkTileset.spacing ?? 0)));\n // Bit 0 toggles x flip\n // Bit 1 toggles 1 flip\n // Examples: f=0 (no flip), f=1 (X flip only), f=2 (Y flip only), f=3 (both flips)\n const flipHorizontal = !!(tile.f & 0b01);\n const flipVertical = !!(tile.f & 0b10);\n let sprite = this.tileset.spritesheet.getSprite(tsxCoord, tsyCoord);\n if (flipHorizontal || flipVertical) {\n sprite = sprite.clone();\n sprite.flipHorizontal = flipHorizontal;\n sprite.flipVertical = flipVertical;\n }\n if (sprite) {\n exTile!.addGraphic(sprite);\n } else {\n console.error('Could not find sprite in LDtk spritesheet at', tsxCoord, tsyCoord);\n }\n }\n }\n }\n }\n }\n }\n}\n","import { TileLayer } from './tile-layer';\nimport { PathMap, pathRelativeToBase } from './path-util';\nimport { FetchLoader, FileLoader } from './file-loader';\nimport { LdtkEntityDefinition, LdtkEntityInstance, LdtkProjectMetadata } from './types';\nimport { compare } from 'compare-versions';\nimport { LoaderCache } from './loader-cache';\nimport { BoundingBox, Entity, ImageSource, Loadable, Scene, TransformComponent, Vector, vec } from 'excalibur';\nimport { LevelResource } from './level-resource';\nimport { Tileset } from './tileset';\nimport { Level } from './level';\nimport { EntityLayer } from './entity-layer';\nimport { IntGridLayer } from './intgrid-layer';\n\nexport interface AddToSceneOptions {\n /**\n * Optionally set the position to place the levels\n * \n * Default is vec(0, 0)\n */\n pos?: Vector;\n /**\n * Optionally add only specific levels to the scene\n * \n * Default includes all levels\n */\n levelFilter?: string[];\n\n /**\n * Optionally use the level world offsets, this is useful if your levels are arranged the way you want them\n * to appear in your game.\n * \n * Default is true\n */\n useLevelOffsets?: boolean;\n}\n\nexport interface FactoryProps {\n /**\n * Excalibur world position\n */\n worldPos: Vector;\n /**\n * LDtk name in UI\n */\n name?: string;\n /**\n * LDtk type in UI\n */\n type: string;\n /**\n * LDtk entity\n */\n entity: LdtkEntityInstance;\n /**\n * LDtk entity metadata\n */\n definition: LdtkEntityDefinition | undefined;\n /**\n * Layer\n */\n layer: EntityLayer;\n}\n\nexport interface LdtkResourceOptions {\n /**\n * Add a starting z index for the layers to use. By default the layers count up from 0.\n *\n * If you'd like to manually override a z-index on a layer use the 'zindex' custom property on a layer.\n */\n startZIndex?: number;\n\n /**\n * Default true. If false, only tilemap will be parsed and displayed, it's up to you to wire up any excalibur behavior.\n * Automatically wires excalibur to the following\n * * Wire up current scene camera\n *\n * Read more at excaliburjs.com!\n */\n useExcaliburWiring?: boolean;\n\n /**\n * Sets excalibur's background color to match the LDtk map\n */\n useMapBackgroundColor?: boolean;\n\n /**\n * The pathMap helps work around odd things bundlers do with static files by providing a way to redirect the original\n * source paths in the LDtk files to new locations.\n *\n * When the LDtk resource comes across something that matches `path`, it will use the output string instead.\n * \n * Example:\n * ```typescript\n * const newResource = new LdtkResource('./example-city.ldtk', {\n * pathMap: [\n * // If the \"path\" is included in the source path, the output will be used\n * { path: 'cone.png', output: '/static/assets/cone.png' },\n * // Regex matching with special [match] in output string that is replaced with the first match from the regex\n * { path: /(.*\\..*$)/, output: '/static/assets/[match]'}\n * ]\n * }\n * ```\n */\n pathMap?: PathMap;\n\n /**\n * Optionally provide a custom file loader implementation instead of using the built in ajax (fetch) loader\n * that takes a path and returns file data\n * \n */\n fileLoader?: FileLoader;\n\n /**\n * By default `true`, means LDtk files must pass the plugins Typed parse pass.\n *\n * If you have something that the LDtk plugin does not expect, you can set this to false and it will do it's best\n * to parse the LDtk source map file.\n */\n strict?: boolean;\n\n /**\n * Plugin will operate in headless mode and skip all graphics related\n * excalibur items including creating ImageSource's for LDtk items.\n *\n * Default false.\n */\n headless?: boolean;\n\n /**\n * Keeps the camera viewport within the bounds of the TileMap, uses the first tile layer's bounds.\n *\n * Defaults true, if false the camera will use the layer bounds to keep the camera from showing the background.\n */\n useTilemapCameraStrategy?: boolean;\n\n /**\n * Configure custom Actor/Entity factory functions to construct Actors/Entities\n * given a LDtk type name\n */\n entityIdentifierFactories?: Record Entity | undefined>;\n}\n\nexport class LdtkResource implements Loadable {\n public static supportedLdtkVersion = \"1.5.3\";\n public projectMetadata!: LdtkProjectMetadata;\n data!: LdtkProjectMetadata;\n\n\n public tilesets = new Map();\n public levels = new Map();\n public levelsByName = new Map();\n public factories = new Map Entity | undefined>();\n public fileLoader: FileLoader = FetchLoader;\n public pathMap: PathMap | undefined;\n\n private _imageLoader = new LoaderCache(ImageSource);\n private _levelLoader = new LoaderCache(LevelResource);\n\n\n public readonly startZIndex: number = 0;\n public readonly textQuality: number = 4;\n public readonly useExcaliburWiring: boolean = true;\n public readonly useMapBackgroundColor: boolean = false;\n public readonly useTilemapCameraStrategy: boolean = false;\n public readonly headless: boolean = false;\n public readonly strict: boolean = true;\n\n constructor(public readonly path: string, options?: LdtkResourceOptions) {\n const {\n useExcaliburWiring,\n useTilemapCameraStrategy,\n entityIdentifierFactories,\n pathMap,\n useMapBackgroundColor,\n fileLoader,\n strict,\n headless,\n startZIndex\n } = { ...options };\n this.strict = strict ?? this.strict;\n this.headless = headless ?? this.headless;\n this.useExcaliburWiring = useExcaliburWiring ?? this.useExcaliburWiring;\n this.useTilemapCameraStrategy = useTilemapCameraStrategy ?? this.useTilemapCameraStrategy;\n this.useMapBackgroundColor = useMapBackgroundColor ?? this.useMapBackgroundColor;\n this.startZIndex = startZIndex ?? this.startZIndex;\n this.fileLoader = fileLoader ?? this.fileLoader;\n this.pathMap = pathMap;\n for (const key in entityIdentifierFactories) {\n this.registerEntityIdentifierFactory(key, entityIdentifierFactories[key]);\n }\n\n }\n async load(): Promise {\n const data = await this.fileLoader(this.path, 'json');\n if (this.strict) {\n try {\n this.projectMetadata = LdtkProjectMetadata.parse(data);\n } catch (e) {\n console.error(`Could not parse LDtk map from location ${this.path}.\\nExcalibur only supports the latest version of LDtk formats as of the plugin's release.`);\n console.error(`Is your map file corrupted or being interpreted as the wrong type?`)\n throw e;\n }\n } else {\n this.projectMetadata = data as LdtkProjectMetadata;\n }\n\n if (compare(LdtkResource.supportedLdtkVersion, this.projectMetadata.jsonVersion ?? '0.0.0', \">\")) {\n console.warn(`The excalibur ldtk plugin officially supports ${LdtkResource.supportedLdtkVersion}+, the current map has LDtk version ${this.projectMetadata.jsonVersion}`)\n }\n\n // iterate through the defs\n // load the tilesets\n const imagesToLoad: Promise[] = [];\n for (let tileset of this.projectMetadata.defs.tilesets) {\n if (tileset.relPath) {\n const imagePath = pathRelativeToBase(this.path, tileset.relPath, this.pathMap);\n const image = this._imageLoader.getOrAdd(imagePath);\n const friendlyTileset = new Tileset({\n image,\n ldtkTileset: tileset\n });\n this.tilesets.set(tileset.uid, friendlyTileset);\n } else {\n if (tileset.identifier !== 'Internal_Icons') {\n console.warn(`No tileset image provided for ${tileset.identifier}`);\n }\n }\n }\n\n // iterate through the levels\n // load the level metadata\n for (let level of this.projectMetadata.levels) {\n if (level.externalRelPath) {\n // external levels\n const levelPath = pathRelativeToBase(this.path, level.externalRelPath, this.pathMap);\n this._levelLoader.getOrAdd(levelPath, this, {\n headless: this.headless,\n strict: this.strict,\n fileLoader: this.fileLoader,\n imageLoader: this._imageLoader,\n pathMap: this.pathMap\n });\n } else {\n // embedded levels\n const friendlyLevel = new Level(level, this);\n this.levels.set(level.uid, friendlyLevel);\n this.levelsByName.set(level.identifier.toLowerCase(), friendlyLevel);\n }\n }\n\n await Promise.all([this._imageLoader.load(), this._levelLoader.load()]);\n this._levelLoader.values().forEach(level => {\n this.levels.set(level.data.ldtkLevel.uid, level.data);\n this.levelsByName.set(level.data.ldtkLevel.identifier.toLowerCase(), level.data);\n });\n\n return this.data = this.projectMetadata;\n };\n\n isLoaded(): boolean {\n return !!this.data;\n }\n\n registerEntityIdentifierFactory(ldtkEntityIdentifier: string, factory: (props: FactoryProps) => Entity | undefined): void {\n this.factories.set(ldtkEntityIdentifier, factory);\n }\n\n registerEntityIdentifierFactories(factories: Record Entity | undefined>): void {\n for (const key in factories) {\n this.registerEntityIdentifierFactory(key, factories[key]);\n }\n }\n\n /**\n * Get a level by identifier\n * @param identifier \n * @returns \n */\n getLevel(identifier: string): Level | undefined {\n return this.levelsByName.get(identifier.toLowerCase());\n }\n\n /**\n * Get the entity layers, optionally provide a level identifier to filter to\n * @param levelIdentifier \n */\n getEntityLayers(levelIdentifier?: string): EntityLayer[] {\n let results: EntityLayer[] = [];\n if (levelIdentifier) {\n const level = this.getLevel(levelIdentifier);\n if (level) {\n for (let layer of level.layers) {\n if (layer instanceof EntityLayer) {\n results.push(layer);\n }\n }\n }\n } else {\n for (const level of this.levels.values()) {\n for (let layer of level.layers) {\n if (layer instanceof EntityLayer) {\n results.push(layer);\n }\n }\n }\n }\n\n return results\n }\n\n getTileLayers(identifier?: string): TileLayer[] {\n let results: TileLayer[] = [];\n if (identifier) {\n const level = this.getLevel(identifier);\n if (level) {\n for (let layer of level.layers) {\n if (layer instanceof TileLayer) {\n results.push(layer);\n }\n }\n }\n } else {\n for (const level of this.levels.values()) {\n for (let layer of level.layers) {\n if (layer instanceof TileLayer) {\n results.push(layer);\n }\n }\n }\n }\n return results;\n }\n\n getIntGridLayers(identifier?: string): IntGridLayer[] {\n let results: IntGridLayer[] = [];\n if (identifier) {\n const level = this.getLevel(identifier);\n if (level) {\n for (let layer of level.layers) {\n if (layer instanceof IntGridLayer) {\n results.push(layer);\n }\n }\n }\n } else {\n for (const level of this.levels.values()) {\n for (let layer of level.layers) {\n if (layer instanceof IntGridLayer) {\n results.push(layer);\n }\n }\n }\n }\n return results;\n }\n\n /**\n * Search layer for entities that match an identifier (case insensitive)\n * @param identifier \n * @returns \n */\n getLdtkEntitiesByIdentifier(identifier: string, levels?: string[]): LdtkEntityInstance[] {\n let results: LdtkEntityInstance[] = [];\n const levelsToSearch = levels ?? Array.from(this.levels.values()).map(l => l.ldtkLevel.identifier);\n for (const level of levelsToSearch) {\n const layers = this.getEntityLayers(level);\n for (let layer of layers) {\n results = results.concat(layer.getLdtkEntitiesByIdentifier(identifier));\n }\n }\n return results;\n }\n\n /**\n * Search levels for ldtk entities that match a field and optionally a value (both case insensitive)\n * @param fieldIdentifier \n * @param value\n */\n getLdtkEntitiesByField(fieldIdentifier: string, value?: any, levels?: string[]): LdtkEntityInstance[] {\n let results: LdtkEntityInstance[] = [];\n const levelsToSearch = levels ?? Array.from(this.levels.values()).map(l => l.ldtkLevel.identifier);\n for (const level of levelsToSearch) {\n const layers = this.getEntityLayers(level);\n for (let layer of layers) {\n results = results.concat(layer.getLdtkEntitiesByField(fieldIdentifier, value));\n }\n }\n return results;\n }\n\n /**\n * Search levels for excalibur entities that match an identifier (case insensitive)\n * @param identifier\n * @param levels\n */\n getEntitiesByIdentifier(identifier: string, levels?: string[]): Entity[] {\n let results: Entity[] = [];\n const levelsToSearch = levels ?? Array.from(this.levels.values()).map(l => l.ldtkLevel.identifier);\n for (const level of levelsToSearch) {\n const layers = this.getEntityLayers(level);\n for (let layer of layers) {\n results = results.concat(layer.getEntitiesByIdentifier(identifier));\n }\n }\n return results;\n }\n\n /**\n * Search levels for excalibur entities that match a field and optionally a value (both case insensitive)\n * @param fieldIdentifier\n * @param value\n * @param levels\n */\n getEntitiesByField(fieldIdentifier: string, value?: any, levels?: string[]): Entity[] {\n let results: Entity[] = [];\n const levelsToSearch = levels ?? Array.from(this.levels.values()).map(l => l.ldtkLevel.identifier);\n for (const level of levelsToSearch) {\n const layers = this.getEntityLayers(level);\n for (let layer of layers) {\n results = results.concat(layer.getEntitiesByField(fieldIdentifier, value));\n }\n }\n return results;\n }\n\n /**\n * Get the level bounds given a list of level identifiers (case insensitive)\n * @param levels\n */\n getLevelBounds(levels?: string[]): BoundingBox {\n levels = levels ?? Array.from(this.levelsByName.keys());\n let bounds: BoundingBox | null = null;\n for (const level of this.levels.values()) {\n if (!levels.includes(level.ldtkLevel.identifier)) {\n continue;\n }\n const firstTileLayer = this.getTileLayers(level.ldtkLevel.identifier)[0];\n if (firstTileLayer) {\n const tileBounds = BoundingBox.fromDimension(\n firstTileLayer.tilemap.tileWidth * firstTileLayer.tilemap.columns,\n firstTileLayer.tilemap.tileHeight * firstTileLayer.tilemap.rows,\n Vector.Zero,\n firstTileLayer.tilemap.pos);\n if (!bounds) {\n bounds = tileBounds;\n } else {\n bounds = bounds.combine(tileBounds);\n }\n }\n }\n return bounds ?? new BoundingBox();\n }\n\n addToScene(scene: Scene, options?: AddToSceneOptions) {\n const { pos, useLevelOffsets } = {pos: vec(0, 0), useLevelOffsets: true, ...options};\n\n for (let [id, level] of this.levels.entries()) {\n if (options?.levelFilter?.length) {\n if (!options.levelFilter.includes(level.ldtkLevel.identifier)) {\n continue;\n }\n }\n for (let layer of level.layers) {\n if (layer instanceof TileLayer || layer instanceof IntGridLayer) {\n layer.tilemap.pos = layer.tilemap.pos.add(pos);\n if (!useLevelOffsets) {\n layer.tilemap.pos = layer.tilemap.pos.sub(layer.worldPos);\n }\n scene.add(layer.tilemap)\n } else {\n layer.runFactories()\n for (let entity of layer.entities) {\n const tx = entity.get(TransformComponent);\n if (tx) {\n tx.pos = tx.pos.add(pos);\n if (!useLevelOffsets) {\n tx.pos = tx.pos.sub(layer.worldPos);\n }\n }\n scene.add(entity);\n }\n }\n }\n }\n\n if(this.useExcaliburWiring) {\n const camera = this.getLdtkEntitiesByField('camera', true)[0];\n if (camera) {\n scene.camera.pos = vec(camera.px[0], camera.px[0]);\n const zoom = camera.fieldInstances.find(f => f.__identifier.toLocaleLowerCase() === 'zoom');\n if (zoom) {\n scene.camera.zoom = +zoom.__value;\n }\n }\n }\n\n if (this.useTilemapCameraStrategy) {\n let bounds = this.getLevelBounds(options?.levelFilter);\n scene.camera.strategy.limitCameraBounds(bounds);\n }\n\n if (this.useMapBackgroundColor) {\n for (let [id, level] of this.levels.entries()) {\n if (options?.levelFilter?.length) {\n if (!options.levelFilter.includes(level.ldtkLevel.identifier)) {\n continue;\n }\n }\n scene.backgroundColor = level.backgroundColor;\n break;\n }\n }\n\n\n }\n}\n","import { ImageSource, Loadable } from \"excalibur\";\nimport { PathMap } from \"./path-util\";\nimport { LoaderCache } from \"./loader-cache\";\nimport { FetchLoader, FileLoader } from \"./file-loader\";\nimport { Level } from \"./level\";\nimport { LdtkLevel } from \"./types\";\nimport { LdtkResource } from \"./ldtk-resource\";\n\nexport interface LevelResourceOptions {\n headless?: boolean;\n strict?: boolean;\n fileLoader?: FileLoader;\n imageLoader?: LoaderCache;\n pathMap?: PathMap;\n}\n\n/**\n * Loads LDtk levels that are stored in separate files\n */\nexport class LevelResource implements Loadable {\n private fileLoader: FileLoader = FetchLoader;\n private imageLoader: LoaderCache;\n private pathMap?: PathMap;\n public readonly strict: boolean = true;\n public readonly headless: boolean = false;\n constructor(public readonly path: string, public readonly resource: LdtkResource, options?: LevelResourceOptions) {\n const { headless, strict, fileLoader, imageLoader, pathMap } = { ...options };\n this.fileLoader = fileLoader ?? this.fileLoader;\n this.strict = strict ?? this.strict;\n this.headless = headless ?? this.headless;\n this.imageLoader = imageLoader ?? new LoaderCache(ImageSource);\n this.pathMap = pathMap ?? this.pathMap;\n }\n data!: Level;\n async load(): Promise {\n const data = await this.fileLoader(this.path, 'json');\n let level: LdtkLevel;\n if (this.strict) {\n try {\n level = LdtkLevel.parse(data)\n } catch (e) {\n console.error(`Could not parse LDtk level data at ${this.path} are you sure a level is there and not corrupt?`);\n throw e;\n }\n } else {\n level = data as LdtkLevel;\n }\n return this.data = new Level(level, this.resource);\n }\n isLoaded(): boolean {\n return !!this.data;\n }\n\n}","import { Color } from \"excalibur\";\nimport { EntityLayer } from \"./entity-layer\";\nimport { IntGridLayer } from \"./intgrid-layer\";\nimport { LdtkResource } from \"./ldtk-resource\";\nimport { TileLayer } from \"./tile-layer\";\nimport { LdtkLevel } from \"./types\";\n\nexport class Level {\n\n public backgroundColor?: Color;\n public layers: (TileLayer | IntGridLayer | EntityLayer)[] = []; \n\n constructor(public ldtkLevel: LdtkLevel, public resource: LdtkResource) {\n if (ldtkLevel.__bgColor) {\n this.backgroundColor = Color.fromHex(ldtkLevel.__bgColor);\n }\n if (ldtkLevel.layerInstances) {\n let order = resource.startZIndex;\n let layers = ldtkLevel.layerInstances.slice().reverse();\n for (let layer of layers) {\n if (layer.entityInstances?.length !== 0) {\n this.layers.push(new EntityLayer(this, layer, resource, order));\n }\n\n if (layer.gridTiles?.length !== 0) {\n this.layers.push(new TileLayer(this, layer, resource, order));\n }\n\n // Includes standard IntGrid, IntGrid w/ AutoTile & AutoTile layers\n if (layer.intGridCsv?.length !== 0 || layer.autoLayerTiles?.length !== 0) {\n this.layers.push(new IntGridLayer(this, layer, resource, order));\n }\n order++;\n }\n }\n }\n}","export interface CanLoad {\n load(): Promise;\n }\n \n /**\n * Read through cache for loadables\n */\n export class LoaderCache {\n private _loaded = false;\n cache = new Map();\n \n constructor(public readonly type: new (...args: any[]) => T){}\n \n getOrAdd(...args: any[]): T {\n let resource = this.cache.get(args.join('+'));\n if (resource) {\n return resource;\n }\n \n resource = new this.type(...args);\n this.cache.set(args.join('+'), resource);\n return resource;\n }\n \n values(): T[] {\n if (this._loaded) {\n return Array.from(this.cache.values());\n }\n throw new Error(`Read through cache not yet loaded! No values to return!`);\n }\n \n async load() {\n const resources = Array.from(this.cache.entries());\n const results = await Promise.allSettled(resources.map(i => i[1].load()));\n \n // Check for errors loading resources\n let errored = 0;\n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n if (result.status === 'rejected') {\n console.error(`Error loading resource at ${resources[i][0]}, is your pathMap correct? or your LDtk map corrupted?`, result.reason);\n errored++;\n }\n }\n if (errored) {\n throw new Error(`Error loading ${errored} resources`);\n }\n this._loaded = true;\n }\n }","\n\nexport type PathMap = { path: string | RegExp, output: string }[];\n\nexport function filenameFromPath(inputPath: string): string {\n const filenameExpression = /[^/\\\\&\\?]+\\.\\w{2,4}(?=([\\#\\?&].*$|$))/ig\n\n const matches = inputPath.match(filenameExpression);\n\n if (matches) {\n const match = matches[0];\n return match;\n }\n\n throw new Error(`Could not locate filename from path: ${inputPath}`);\n}\n\nexport function mapPath(inputPath: string, pathMap: PathMap): string {\n\n for (const { path, output } of pathMap) {\n if (typeof path === 'string') {\n if (inputPath.includes(path)) {\n return output;\n }\n } else {\n const match = inputPath.match(path);\n if (match) {\n return output.replace('[match]', match[0]);;\n }\n }\n }\n return inputPath;\n}\n\nexport function pathInMap(inputPath: string, pathMap?: PathMap): boolean {\n if (!pathMap) return false;\n for (const { path, output } of pathMap) {\n if (typeof path === 'string') {\n if (inputPath.includes(path)) {\n return true;\n }\n } else {\n const match = inputPath.match(path);\n if (match) {\n return true;\n }\n }\n }\n return false;\n}\n\n\nexport function pathRelativeToBase(basePath: string, relativeToBase: string, pathMap?: PathMap) {\n if (pathInMap(relativeToBase, pathMap) && pathMap) {\n return mapPath(relativeToBase, pathMap);\n }\n\n // Use absolute path if specified\n if (relativeToBase.indexOf('/') === 0) {\n return relativeToBase;\n }\n\n const originSplit = basePath.split('/');\n const relativeSplit = relativeToBase.split('/');\n // if origin path is a file, remove it so it's a directory\n if (originSplit[originSplit.length - 1].includes('.')) {\n originSplit.pop();\n }\n return originSplit.concat(relativeSplit).join('/');\n}","import { GraphicsComponent, TileMap, Vector, vec } from \"excalibur\";\nimport { LdtkResource } from \"./ldtk-resource\";\nimport { LdtkLayerInstance } from \"./types\";\nimport { Level } from \"./level\";\nimport { Tileset } from \"./tileset\";\n\n\nexport class TileLayer {\n public ldtkLayer: LdtkLayerInstance;\n public worldPos: Vector;\n public offset: Vector;\n public tilemap: TileMap;\n public tileset?: Tileset;\n\n constructor(level: Level, ldtkLayer: LdtkLayerInstance, resource: LdtkResource, public readonly order: number) {\n this.worldPos = vec(level.ldtkLevel.worldX, level.ldtkLevel.worldY);\n this.offset = vec(ldtkLayer.__pxTotalOffsetX, ldtkLayer.__pxTotalOffsetY);\n this.ldtkLayer = ldtkLayer;\n this.tilemap = new TileMap({\n name: ldtkLayer.__identifier,\n pos: this.worldPos.add(this.offset),\n tileWidth: ldtkLayer.__gridSize,\n tileHeight: ldtkLayer.__gridSize,\n rows: ldtkLayer.__cHei,\n columns: ldtkLayer.__cWid,\n });\n this.tilemap.z = order;\n const graphics = this.tilemap.get(GraphicsComponent);\n graphics.isVisible = ldtkLayer.visible;\n\n\n if (ldtkLayer.__tilesetDefUid) {\n this.tileset = resource.tilesets.get(ldtkLayer.__tilesetDefUid);\n for (let tile of ldtkLayer.gridTiles) {\n const xCoord = Math.floor(tile.px[0] / ldtkLayer.__gridSize);\n const yCoord = Math.floor(tile.px[1] / ldtkLayer.__gridSize);\n const exTile = this.tilemap.getTile(xCoord, yCoord);\n if (this.tileset) {\n const tsxCoord = Math.floor((tile.src[0] - (this.tileset.ldtkTileset.padding ?? 0)) / (this.tileset.ldtkTileset.tileGridSize + (this.tileset.ldtkTileset.spacing ?? 0)));\n const tsyCoord = Math.floor((tile.src[1] - (this.tileset.ldtkTileset.padding ?? 0)) / (this.tileset.ldtkTileset.tileGridSize + (this.tileset.ldtkTileset.spacing ?? 0)));\n // Bit 0 toggles x flip\n // Bit 1 toggles 1 flip\n // Examples: f=0 (no flip), f=1 (X flip only), f=2 (Y flip only), f=3 (both flips)\n const flipHorizontal = !!(tile.f & 0b01);\n const flipVertical = !!(tile.f & 0b10);\n let sprite = this.tileset.spritesheet.getSprite(tsxCoord, tsyCoord);\n if (flipHorizontal || flipVertical) {\n sprite = sprite.clone();\n sprite.flipHorizontal = flipHorizontal;\n sprite.flipVertical = flipVertical;\n }\n if (sprite) {\n exTile!.addGraphic(sprite);\n } else {\n console.error('Could not find sprite in LDtk spritesheet at', tsxCoord, tsyCoord);\n } \n }\n } \n } else {\n console.error('Could not tileset in LDtk', ldtkLayer.__tilesetDefUid, ldtkLayer.__tilesetRelPath);\n }\n\n }\n}","import { ImageSource, Sprite, SpriteSheet } from \"excalibur\";\nimport { LdtkTilesetDefinition } from \"./types\";\n\nexport interface TilesetOptions {\n image: ImageSource,\n ldtkTileset: LdtkTilesetDefinition\n}\n\nexport class Tileset {\n public readonly image: ImageSource;\n public readonly ldtkTileset: LdtkTilesetDefinition;\n public readonly spritesheet: SpriteSheet;\n constructor(options: TilesetOptions) {\n const {image, ldtkTileset} = options;\n this.image = image;\n this.ldtkTileset = ldtkTileset;\n this.spritesheet = SpriteSheet.fromImageSource({\n image,\n grid: {\n rows: ldtkTileset.pxHei / ldtkTileset.tileGridSize,\n columns: ldtkTileset.pxWid / ldtkTileset.tileGridSize,\n spriteHeight: ldtkTileset.tileGridSize,\n spriteWidth: ldtkTileset.tileGridSize\n },\n spacing: {\n margin: { \n x: ldtkTileset.spacing ?? 0,\n y: ldtkTileset.spacing ?? 0,\n },\n originOffset: {\n x: ldtkTileset.padding ?? 0,\n y: ldtkTileset.padding ?? 0\n }\n }\n });\n }\n}","import { z } from 'zod';\n\n\n\nconst LdtkTilesetRectangle = z.object({\n h: z.number(),\n tilesetUid: z.number(),\n w: z.number(),\n x: z.number(),\n y: z.number()\n});\nconst LdtkPixel = z.tuple([z.number(), z.number()]);\nconst LdtkFieldInstance = z.object({\n __identifier: z.string(),\n __tile: LdtkTilesetRectangle.nullable(),\n __type: z.string(),//z.union([z.literal('Int'), z.literal('Float'), z.literal('String'), z.literal('Bool'), z.literal('Enum')]), // TODO this might not work with ENUM\n __value: z.any(),\n defUid: z.number()\n})\nconst LdtkTileInstance = z.object({\n a: z.number(),\n f: z.number(), // 2-bit int 0bXY flip\n px: LdtkPixel,\n src: LdtkPixel,\n t: z.number()\n});\n\nexport const LdtkEntityInstance = z.object({\n __grid: LdtkPixel,\n __identifier: z.string(),\n __pivot: LdtkPixel,\n __smartColor: z.string(),\n __tags: z.array(z.string()),\n __tile: LdtkTilesetRectangle.nullable(),\n __worldX: z.number().nullable(),\n __worldY: z.number().nullable(),\n defUid: z.number(),\n fieldInstances: z.array(LdtkFieldInstance),\n height: z.number(),\n iid: z.string(),\n px: LdtkPixel,\n width: z.number()\n});\nexport type LdtkEntityInstance = z.infer;\n\nexport const LdtkLayerInstance = z.object({\n __cHei: z.number(),\n __cWid: z.number(),\n __gridSize: z.number(),\n __identifier: z.string(),\n __opacity: z.number(),\n __pxTotalOffsetX: z.number(),\n __pxTotalOffsetY: z.number(),\n __tilesetDefUid: z.number().nullable(),\n __tilesetRelPath:z.string().nullable(),\n __type: z.union([z.literal('IntGrid'), z.literal('Entities'), z.literal('Tiles'), z.literal('AutoLayer')]),\n autoLayerTiles: z.array(LdtkTileInstance), // only in auto layers\n entityInstances: z.array(LdtkEntityInstance),// only in entity layers\n gridTiles: z.array(LdtkTileInstance),\n iid: z.string(),\n intGridCsv: z.array(z.number()), // __cWid x __cHei, 0 means empty, values start at 1\n layerDefUid: z.number(),\n levelId: z.number(),\n overrideTilesetUid: z.number().nullable(),\n pxOffsetX: z.number(),\n pxOffsetY: z.number(),\n visible: z.boolean()\n});\nexport type LdtkLayerInstance = z.infer;\n\nexport const LdtkLevel = z.object({\n __bgColor: z.string().nullable(),\n bgColor: z.string().nullable(),\n __bgPos: z.object({\n cropRect: z.array(z.tuple([z.number(), z.number(), z.number(), z.number()])), // cropX, cropY, cropWidth, cropHeight\n scale: z.tuple([z.number(), z.number()]),\n topLeftPx: LdtkPixel\n }).nullable(),\n __neighbours: z.array(z.object({\n dir: z.union([z.literal('n'), z.literal('s'), z.literal('w'), z.literal('e'), z.literal('ne'), z.literal('nw'), z.literal('se'), z.literal('sw'), z.literal('o'), z.literal('<'), z.literal('>')]),\n levelIid: z.string()\n })),\n bgRelPath: z.string().nullable(),\n externalRelPath: z.string().nullable(),\n fieldInstances: z.array(LdtkFieldInstance),\n identifier: z.string(),\n iid: z.string(),\n layerInstances: z.array(LdtkLayerInstance).nullable(), // null if the save levels separately is enabled\n pxHei: z.number(),\n pxWid: z.number(),\n uid: z.number(),\n worldDepth: z.number(),\n worldX: z.number(),\n worldY: z.number()\n});\nexport type LdtkLevel = z.infer;\n\nconst LdtkWorld = z.object({\n identifier: z.string(),\n iid: z.string(),\n levels: z.array(LdtkLevel),\n worldGridHeight:z.number(),\n worldGridWidth: z.number(),\n // TODO is this a typo Vania?\n worldLayout: z.union([z.literal('Free'), z.literal('GridVania'), z.literal('LinearHorizontal'), z.literal('LinearVertical')]),\n});\nexport type LdtkWorld = z.infer;\n\nconst LdtkEnumValueDefinition = z.object({\n color: z.number(),\n id: z.string(),\n tileRect: LdtkTilesetRectangle.nullable()\n});\n\nconst LdtkEnumDefinition = z.object({\n externalRelPath: z.string().nullable(),\n iconTilesetUid: z.number().nullable(),\n identifier: z.string(),\n tags: z.array(z.string()),\n uid: z.number(),\n values: z.array(LdtkEnumValueDefinition)\n})\n\nexport type LdtkEnumDefinition = z.infer;\n\nconst LdtkTilesetDefinition = z.object({\n __cHei: z.number(),\n __cWid: z.number(),\n customData: z.array(z.object({\n data: z.string(),\n tileId: z.number()\n })),\n embedAtlas: z.string().nullable(),\n enumTags: z.optional(z.array(z.object({\n enumValueId: z.string(),\n tileIds: z.array(z.number())\n }))),\n identifier: z.string(),\n padding: z.number(),\n pxHei: z.number(),\n pxWid: z.number(),\n relPath: z.string().nullable(),\n spacing: z.number(),\n tags: z.array(z.string()),\n tagsSourceEnumUid: z.number().nullable(),\n tileGridSize: z.number(),\n uid: z.number()\n})\nexport type LdtkTilesetDefinition = z.infer;\n\nexport const LdtkLayerDefinition = z.object({\n __type: z.union([z.literal(\"IntGrid\"), z.literal(\"Entities\"), z.literal(\"Tiles\"), z.literal(\"AutoLayer\")]),\n autoSourceLayerDefUid: z.number().nullable(),\n displayOpacity: z.number(),\n gridSize: z.number(),\n identifier: z.string(),\n intGridValues: z.array(z.object({\n color: z.string(),\n groupUid: z.number(),\n identifier: z.string().nullable(),\n tile: LdtkTilesetRectangle.nullable(),\n value: z.number()\n })),\n intGridValuesGroups: z.array(z.object({\n color: z.string().nullable(),\n identifier: z.string().nullable(),\n uid: z.number()\n })),\n parallaxFactorX: z.number(),\n parallaxFactorY: z.number(),\n parallaxScaling: z.boolean(),\n pxOffsetX: z.number(),\n pxOffsetY: z.number(),\n tilesetDefUid: z.number().nullable(),\n uid: z.number(),\n});\nexport type LdtkLayerDefinition = z.infer;\n\nexport const LdtkEntityDefinition = z.object({\n color: z.string(),\n height: z.number(),\n identifier: z.string(),\n nineSliceBorders: z.array(z.number()),\n pivotX: z.number(),\n pivotY: z.number(),\n tileRect: LdtkTilesetRectangle.nullable(),\n tileRenderMode: z.union([\n z.literal(\"Cover\"),\n z.literal(\"FitInside\"),\n z.literal(\"Repeat\"),\n z.literal(\"Stretch\"),\n z.literal(\"FullSizeCropped\"),\n z.literal(\"FullSizeUncropped\"),\n z.literal(\"NineSlice\")\n ]),\n tilesetId: z.number().nullable(),\n uiTileRect: LdtkTilesetRectangle.nullable(),\n uid: z.number(),\n width: z.number()\n});\nexport type LdtkEntityDefinition = z.infer;\n\nconst LdtkDefinitions = z.object({\n tilesets: z.array(LdtkTilesetDefinition),\n enums: z.array(LdtkEnumDefinition),\n layers: z.array(LdtkLayerDefinition),\n entities: z.array(LdtkEntityDefinition)\n})\nexport type LdtkDefinitions = z.infer;\n\nexport const LdtkProjectMetadata = z.object({\n iid: z.string(),\n bgColor: z.string().nullable(),\n defs: LdtkDefinitions,\n externalLevels: z.boolean(),\n jsonVersion: z.string(),\n levels: z.array(LdtkLevel),\n toc: z.array(z.object({\n identifier: z.string(),\n instancesData: z.array(z.object({\n fields: z.any(),\n heiPx: z.number(),\n iids: z.string(),\n widPix: z.number(),\n worldX: z.number(),\n worldY: z.number()\n }))\n })),\n // Moving to worlds array\n worldGridHeight: z.number().nullable(),\n worldGridWidth: z.number().nullable(),\n // TODO is this a LDtk docs typo Vania?\n worldLayout: z.union([z.literal('Free'), z.literal('GridVania'), z.literal('LinearHorizontal'), z.literal('LinearVertical')]).nullable(),\n worlds: z.array(LdtkWorld)\n});\nexport type LdtkProjectMetadata = z.infer;\n\n\n\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","\nimport * as ex from \"excalibur\";\nimport { Player } from './player';\nimport { Resources, loader } from \"./resources\";\nex.Flags.useLegacyImageRenderer();\nconst game = new ex.Engine({\n resolution: {\n width: 256,\n height: 256,\n },\n suppressPlayButton: false,\n pixelArt: true,\n pixelRatio: 4,\n displayMode: ex.DisplayMode.FitScreen,\n});\n\ngame.start(loader).then(() => {\n console.log('Game start!');\n\n Resources.LdtkPureAutoTile.addToScene(game.currentScene, {\n pos: ex.vec(0, 0)\n });\n});"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/sample/sample/sample.js b/sample/sample/sample.js index c95b5c4..9c26ffa 100644 --- a/sample/sample/sample.js +++ b/sample/sample/sample.js @@ -570,130 +570,130 @@ __nested_webpack_require_434__.r(__nested_webpack_exports__); var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); // Module -___CSS_LOADER_EXPORT___.push([module.id, `/* Buttons styles start */ - -button#excalibur-play { - display: inline-block; - position: relative; - z-index: 999; - border-radius: 6px; - border: none; - /*border: 3px solid; - border-color: white; - box-shadow: 0 0 10px #ccc;*/ - padding: 1rem 1.5rem 1rem 4rem; - margin: 0; - text-decoration: none; - background: #00b233; - color: #ffffff; - font-family: sans-serif; - font-size: 2rem; - white-space: nowrap; - line-height: 1; - cursor: pointer; - text-align: center; - transition: - background 250ms ease-in-out, - transform 150ms ease; - -webkit-appearance: none; - -moz-appearance: none; - - -webkit-animation: excalibur-button-fadein 200ms; /* Safari, Chrome and Opera > 12.1 */ - -moz-animation: excalibur-button-fadein 200ms; /* Firefox < 16 */ - -ms-animation: excalibur-button-fadein 200ms; /* Internet Explorer */ - -o-animation: excalibur-button-fadein 200ms; /* Opera < 12.1 */ - animation: excalibur-button-fadein 200ms; -} - -/* -button#excalibur-play { - display: none; -}*/ - -button#excalibur-play:after { - position: absolute; - content: ''; - border: 8px solid; - border-color: transparent transparent transparent white; - left: 35px; - top: 24px; - width: 0; - height: 0; -} - -button#excalibur-play:before { - position: absolute; - content: ''; - border: 3px solid; - left: 19px; - top: 14px; - border-radius: 20px; - width: 30px; - height: 30px; -} - -button#excalibur-play:hover, -button#excalibur-play:focus { - background: #00982c; -} - -button#excalibur-play:focus { - outline: 1px solid #fff; - outline-offset: -4px; -} - -button#excalibur-play:active { - transform: scale(0.99); -} - -@keyframes excalibur-button-fadein { - from { - opacity: 0; - } - to { - opacity: 1; - } -} - -/* Firefox < 16 */ -@-moz-keyframes excalibur-button-fadein { - from { - opacity: 0; - } - to { - opacity: 1; - } -} - -/* Safari, Chrome and Opera > 12.1 */ -@-webkit-keyframes excalibur-button-fadein { - from { - opacity: 0; - } - to { - opacity: 1; - } -} - -/* Internet Explorer */ -@-ms-keyframes excalibur-button-fadein { - from { - opacity: 0; - } - to { - opacity: 1; - } -} - -/* Opera < 12.1 */ -@-o-keyframes excalibur-button-fadein { - from { - opacity: 0; - } - to { - opacity: 1; - } -} +___CSS_LOADER_EXPORT___.push([module.id, `/* Buttons styles start */ + +button#excalibur-play { + display: inline-block; + position: relative; + z-index: 999; + border-radius: 6px; + border: none; + /*border: 3px solid; + border-color: white; + box-shadow: 0 0 10px #ccc;*/ + padding: 1rem 1.5rem 1rem 4rem; + margin: 0; + text-decoration: none; + background: #00b233; + color: #ffffff; + font-family: sans-serif; + font-size: 2rem; + white-space: nowrap; + line-height: 1; + cursor: pointer; + text-align: center; + transition: + background 250ms ease-in-out, + transform 150ms ease; + -webkit-appearance: none; + -moz-appearance: none; + + -webkit-animation: excalibur-button-fadein 200ms; /* Safari, Chrome and Opera > 12.1 */ + -moz-animation: excalibur-button-fadein 200ms; /* Firefox < 16 */ + -ms-animation: excalibur-button-fadein 200ms; /* Internet Explorer */ + -o-animation: excalibur-button-fadein 200ms; /* Opera < 12.1 */ + animation: excalibur-button-fadein 200ms; +} + +/* +button#excalibur-play { + display: none; +}*/ + +button#excalibur-play:after { + position: absolute; + content: ''; + border: 8px solid; + border-color: transparent transparent transparent white; + left: 35px; + top: 24px; + width: 0; + height: 0; +} + +button#excalibur-play:before { + position: absolute; + content: ''; + border: 3px solid; + left: 19px; + top: 14px; + border-radius: 20px; + width: 30px; + height: 30px; +} + +button#excalibur-play:hover, +button#excalibur-play:focus { + background: #00982c; +} + +button#excalibur-play:focus { + outline: 1px solid #fff; + outline-offset: -4px; +} + +button#excalibur-play:active { + transform: scale(0.99); +} + +@keyframes excalibur-button-fadein { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +/* Firefox < 16 */ +@-moz-keyframes excalibur-button-fadein { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +/* Safari, Chrome and Opera > 12.1 */ +@-webkit-keyframes excalibur-button-fadein { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +/* Internet Explorer */ +@-ms-keyframes excalibur-button-fadein { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +/* Opera < 12.1 */ +@-o-keyframes excalibur-button-fadein { + from { + opacity: 0; + } + to { + opacity: 1; + } +} `, "",{"version":3,"sources":["webpack://./Director/Loader.css"],"names":[],"mappings":"AAAA,yBAAyB;;AAEzB;EACE,qBAAqB;EACrB,kBAAkB;EAClB,YAAY;EACZ,kBAAkB;EAClB,YAAY;EACZ;;+BAE6B;EAC7B,8BAA8B;EAC9B,SAAS;EACT,qBAAqB;EACrB,mBAAmB;EACnB,cAAc;EACd,uBAAuB;EACvB,eAAe;EACf,mBAAmB;EACnB,cAAc;EACd,eAAe;EACf,kBAAkB;EAClB;;wBAEsB;EACtB,wBAAwB;EACxB,qBAAqB;;EAErB,gDAAgD,EAAE,oCAAoC;EACtF,6CAA6C,EAAE,iBAAiB;EAChE,4CAA4C,EAAE,sBAAsB;EACpE,2CAA2C,EAAE,iBAAiB;EAC9D,wCAAwC;AAC1C;;AAEA;;;EAGE;;AAEF;EACE,kBAAkB;EAClB,WAAW;EACX,iBAAiB;EACjB,uDAAuD;EACvD,UAAU;EACV,SAAS;EACT,QAAQ;EACR,SAAS;AACX;;AAEA;EACE,kBAAkB;EAClB,WAAW;EACX,iBAAiB;EACjB,UAAU;EACV,SAAS;EACT,mBAAmB;EACnB,WAAW;EACX,YAAY;AACd;;AAEA;;EAEE,mBAAmB;AACrB;;AAEA;EACE,uBAAuB;EACvB,oBAAoB;AACtB;;AAEA;EACE,sBAAsB;AACxB;;AAEA;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF;;AAEA,iBAAiB;AACjB;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF;;AAEA,oCAAoC;AACpC;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF;;AAEA,sBAAsB;AACtB;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF;;AAEA,iBAAiB;AACjB;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF","sourcesContent":["/* Buttons styles start */\r\n\r\nbutton#excalibur-play {\r\n display: inline-block;\r\n position: relative;\r\n z-index: 999;\r\n border-radius: 6px;\r\n border: none;\r\n /*border: 3px solid;\r\n border-color: white;\r\n box-shadow: 0 0 10px #ccc;*/\r\n padding: 1rem 1.5rem 1rem 4rem;\r\n margin: 0;\r\n text-decoration: none;\r\n background: #00b233;\r\n color: #ffffff;\r\n font-family: sans-serif;\r\n font-size: 2rem;\r\n white-space: nowrap;\r\n line-height: 1;\r\n cursor: pointer;\r\n text-align: center;\r\n transition:\r\n background 250ms ease-in-out,\r\n transform 150ms ease;\r\n -webkit-appearance: none;\r\n -moz-appearance: none;\r\n\r\n -webkit-animation: excalibur-button-fadein 200ms; /* Safari, Chrome and Opera > 12.1 */\r\n -moz-animation: excalibur-button-fadein 200ms; /* Firefox < 16 */\r\n -ms-animation: excalibur-button-fadein 200ms; /* Internet Explorer */\r\n -o-animation: excalibur-button-fadein 200ms; /* Opera < 12.1 */\r\n animation: excalibur-button-fadein 200ms;\r\n}\r\n\r\n/*\r\nbutton#excalibur-play {\r\n display: none;\r\n}*/\r\n\r\nbutton#excalibur-play:after {\r\n position: absolute;\r\n content: '';\r\n border: 8px solid;\r\n border-color: transparent transparent transparent white;\r\n left: 35px;\r\n top: 24px;\r\n width: 0;\r\n height: 0;\r\n}\r\n\r\nbutton#excalibur-play:before {\r\n position: absolute;\r\n content: '';\r\n border: 3px solid;\r\n left: 19px;\r\n top: 14px;\r\n border-radius: 20px;\r\n width: 30px;\r\n height: 30px;\r\n}\r\n\r\nbutton#excalibur-play:hover,\r\nbutton#excalibur-play:focus {\r\n background: #00982c;\r\n}\r\n\r\nbutton#excalibur-play:focus {\r\n outline: 1px solid #fff;\r\n outline-offset: -4px;\r\n}\r\n\r\nbutton#excalibur-play:active {\r\n transform: scale(0.99);\r\n}\r\n\r\n@keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n/* Firefox < 16 */\r\n@-moz-keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n/* Safari, Chrome and Opera > 12.1 */\r\n@-webkit-keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n/* Internet Explorer */\r\n@-ms-keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n/* Opera < 12.1 */\r\n@-o-keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n"],"sourceRoot":""}]); // Exports /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___); @@ -720,32 +720,32 @@ __nested_webpack_require_8167__.r(__nested_webpack_exports__); var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); // Module -___CSS_LOADER_EXPORT___.push([module.id, `#ex-toast-container { - position: absolute; - height: 0; - min-width: 50%; - left: 50%; - top: 0; -} - -.ex-toast-message { - left: -50%; - position: relative; - display: flex; - justify-content: space-between; - - padding: 10px; - margin-top: 5px; - font-size: 18px; - font-family: sans-serif; - border-radius: 6px; - border: 3px solid #b7b779; - background-color: rgb(253, 253, 192); -} - -.ex-toast-message button { - align-self: flex-start; -} +___CSS_LOADER_EXPORT___.push([module.id, `#ex-toast-container { + position: absolute; + height: 0; + min-width: 50%; + left: 50%; + top: 0; +} + +.ex-toast-message { + left: -50%; + position: relative; + display: flex; + justify-content: space-between; + + padding: 10px; + margin-top: 5px; + font-size: 18px; + font-family: sans-serif; + border-radius: 6px; + border: 3px solid #b7b779; + background-color: rgb(253, 253, 192); +} + +.ex-toast-message button { + align-self: flex-start; +} `, "",{"version":3,"sources":["webpack://./Util/Toaster.css"],"names":[],"mappings":"AAAA;EACE,kBAAkB;EAClB,SAAS;EACT,cAAc;EACd,SAAS;EACT,MAAM;AACR;;AAEA;EACE,UAAU;EACV,kBAAkB;EAClB,aAAa;EACb,8BAA8B;;EAE9B,aAAa;EACb,eAAe;EACf,eAAe;EACf,uBAAuB;EACvB,kBAAkB;EAClB,yBAAyB;EACzB,oCAAoC;AACtC;;AAEA;EACE,sBAAsB;AACxB","sourcesContent":["#ex-toast-container {\r\n position: absolute;\r\n height: 0;\r\n min-width: 50%;\r\n left: 50%;\r\n top: 0;\r\n}\r\n\r\n.ex-toast-message {\r\n left: -50%;\r\n position: relative;\r\n display: flex;\r\n justify-content: space-between;\r\n\r\n padding: 10px;\r\n margin-top: 5px;\r\n font-size: 18px;\r\n font-family: sans-serif;\r\n border-radius: 6px;\r\n border: 3px solid #b7b779;\r\n background-color: rgb(253, 253, 192);\r\n}\r\n\r\n.ex-toast-message button {\r\n align-self: flex-start;\r\n}\r\n"],"sourceRoot":""}]); // Exports /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___); @@ -2316,20 +2316,20 @@ class Flash { this._material = (_a = entity.scene) === null || _a === void 0 ? void 0 : _a.engine.graphicsContext.createMaterial({ name: 'flash-material', color, - fragmentSource: `#version 300 es - - precision mediump float; - uniform float u_blend; - uniform sampler2D u_graphic; - uniform vec4 u_color; - - in vec2 v_uv; - out vec4 color; - - void main() { - vec4 textureColor = texture(u_graphic, v_uv); - color = mix(textureColor, u_color, u_blend * textureColor.a); - color.rgb = color.rgb * color.a; + fragmentSource: `#version 300 es + + precision mediump float; + uniform float u_blend; + uniform sampler2D u_graphic; + uniform vec4 u_color; + + in vec2 v_uv; + out vec4 color; + + void main() { + vec4 textureColor = texture(u_graphic, v_uv); + color = mix(textureColor, u_color, u_blend * textureColor.a); + color.rgb = color.rgb * color.a; }` }); this._total = duration; @@ -11099,9 +11099,9 @@ class CollisionGroup { return _CollisionGroupManager__WEBPACK_IMPORTED_MODULE_0__.CollisionGroupManager.create(combinedName, combinedMask); } toString() { - return ` -category: ${this.category.toString(2).padStart(32, '0')} -mask: ${(this.mask >>> 0).toString(2).padStart(32, '0')} + return ` +category: ${this.category.toString(2).padStart(32, '0')} +mask: ${(this.mask >>> 0).toString(2).padStart(32, '0')} `; } } @@ -15527,22 +15527,22 @@ class Engine { container.style.padding = '10px'; container.style.borderStyle = 'solid 1px'; const div = document.createElement('div'); - div.innerHTML = ` -

There was an issue rendering, please refresh the page.

-
-

WebGL Graphics Context Lost

- - - -

There are a few reasons this might happen:

-
    -
  • Two or more pages are placing a high demand on the GPU
  • -
  • Another page or operation has stalled the GPU and the browser has decided to reset the GPU
  • -
  • The computer has multiple GPUs and the user has switched between them
  • -
  • Graphics driver has crashed or restarted
  • -
  • Graphics driver was updated
  • -
-
+ div.innerHTML = ` +

There was an issue rendering, please refresh the page.

+
+

WebGL Graphics Context Lost

+ + + +

There are a few reasons this might happen:

+
    +
  • Two or more pages are placing a high demand on the GPU
  • +
  • Another page or operation has stalled the GPU and the browser has decided to reset the GPU
  • +
  • The computer has multiple GPUs and the user has switched between them
  • +
  • Graphics driver has crashed or restarted
  • +
  • Graphics driver was updated
  • +
+
`; container.appendChild(div); if ((_a = this.canvas) === null || _a === void 0 ? void 0 : _a.parentElement) { @@ -15600,9 +15600,9 @@ class Engine { // eslint-disable-next-line no-console console.log(`%cPowered by Excalibur.js (v${___WEBPACK_IMPORTED_MODULE_2__.EX_VERSION})`, 'background: #176BAA; color: white; border-radius: 5px; padding: 15px; font-size: 1.5em; line-height: 80px;'); // eslint-disable-next-line no-console - console.log('\n\ - /| ________________\n\ -O|===|* >________________>\n\ + console.log('\n\ + /| ________________\n\ +O|===|* >________________>\n\ \\|'); // eslint-disable-next-line no-console console.log('Visit', 'http://excaliburjs.com', 'for more information'); @@ -22009,26 +22009,26 @@ __nested_webpack_require_937606__.r(__nested_webpack_exports__); -const defaultVertexSource = `#version 300 es -in vec2 a_position; - -in vec2 a_uv; -out vec2 v_uv; - -in vec2 a_screenuv; -out vec2 v_screenuv; - -uniform mat4 u_matrix; -uniform mat4 u_transform; - -void main() { - // Set the vertex position using the ortho & transform matrix - gl_Position = u_matrix * u_transform * vec4(a_position, 0.0, 1.0); - - // Pass through the UV coord to the fragment shader - v_uv = a_uv; - v_screenuv = a_screenuv; -} +const defaultVertexSource = `#version 300 es +in vec2 a_position; + +in vec2 a_uv; +out vec2 v_uv; + +in vec2 a_screenuv; +out vec2 v_screenuv; + +uniform mat4 u_matrix; +uniform mat4 u_transform; + +void main() { + // Set the vertex position using the ortho & transform matrix + gl_Position = u_matrix * u_transform * vec4(a_position, 0.0, 1.0); + + // Pass through the UV coord to the fragment shader + v_uv = a_uv; + v_screenuv = a_screenuv; +} `; class Material { constructor(options) { @@ -24193,12 +24193,12 @@ function getAttributePointerType(gl, type) { */ function getMaxShaderComplexity(gl, numIfs) { const assembleTestShader = (numIfs) => { - const testShader = `#version 300 es - precision mediump float; - out vec4 fragColor; - void main() { - float index = 1.01; - %%complexity%% + const testShader = `#version 300 es + precision mediump float; + out vec4 fragColor; + void main() { + float index = 1.01; + %%complexity%% }`; let testComplexity = ''; for (let i = 0; i < numIfs; i++) { @@ -26982,17 +26982,17 @@ class ScreenShader { } this._shader = new _Context_shader__WEBPACK_IMPORTED_MODULE_1__.Shader({ gl, - vertexSource: `#version 300 es - in vec2 a_position; - in vec2 a_uv; - out vec2 v_texcoord; - out vec2 v_uv; - - void main() { - gl_Position = vec4(a_position, 0.0, 1.0); - // Pass the texcoord to the fragment shader. - v_texcoord = a_uv; - v_uv = a_uv; + vertexSource: `#version 300 es + in vec2 a_position; + in vec2 a_uv; + out vec2 v_texcoord; + out vec2 v_uv; + + void main() { + gl_Position = vec4(a_position, 0.0, 1.0); + // Pass the texcoord to the fragment shader. + v_texcoord = a_uv; + v_uv = a_uv; }`, fragmentSource: fragmentSource }); @@ -31464,10 +31464,10 @@ class AffineMatrix { return mat; } toString() { - return ` -[${this.data[0]} ${this.data[2]} ${this.data[4]}] -[${this.data[1]} ${this.data[3]} ${this.data[5]}] -[0 0 1] + return ` +[${this.data[0]} ${this.data[2]} ${this.data[4]}] +[${this.data[1]} ${this.data[3]} ${this.data[5]}] +[0 0 1] `; } } @@ -32596,11 +32596,11 @@ class Matrix { this.data[15] === 1); } toString() { - return ` -[${this.data[0]} ${this.data[4]} ${this.data[8]} ${this.data[12]}] -[${this.data[1]} ${this.data[5]} ${this.data[9]} ${this.data[13]}] -[${this.data[2]} ${this.data[6]} ${this.data[10]} ${this.data[14]}] -[${this.data[3]} ${this.data[7]} ${this.data[11]} ${this.data[15]}] + return ` +[${this.data[0]} ${this.data[4]} ${this.data[8]} ${this.data[12]}] +[${this.data[1]} ${this.data[5]} ${this.data[9]} ${this.data[13]}] +[${this.data[2]} ${this.data[6]} ${this.data[10]} ${this.data[14]}] +[${this.data[3]} ${this.data[7]} ${this.data[11]} ${this.data[15]}] `; } } @@ -35256,8 +35256,8 @@ class Resource { return; } if (request.response instanceof Blob && request.response.type === 'text/html') { - const errorText = `Expected blob (usually image) data from the server when loading ${this.path}, but got HTML content instead! - + const errorText = `Expected blob (usually image) data from the server when loading ${this.path}, but got HTML content instead! + Check your server configuration, for example Vite serves static files from the /public folder`; this.events.emit('error', request.response); reject(new Error(errorText)); @@ -42409,2519 +42409,1040 @@ __nested_webpack_require_1787534__.r(__nested_webpack_exports__); /***/ }), -/***/ "./sample/config.ts": -/*!**************************!*\ - !*** ./sample/config.ts ***! - \**************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ Config: () => (/* binding */ Config) -/* harmony export */ }); -const Config = { - PlayerSpeed: 16 * 2, // pixels/sec - PlayerFrameSpeed: 200, // ms -}; - - -/***/ }), - -/***/ "./sample/player.ts": -/*!**************************!*\ - !*** ./sample/player.ts ***! - \**************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { +/***/ "./node_modules/zod/lib/index.mjs": +/*!****************************************!*\ + !*** ./node_modules/zod/lib/index.mjs ***! + \****************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ Player: () => (/* binding */ Player) +/* harmony export */ BRAND: () => (/* binding */ BRAND), +/* harmony export */ DIRTY: () => (/* binding */ DIRTY), +/* harmony export */ EMPTY_PATH: () => (/* binding */ EMPTY_PATH), +/* harmony export */ INVALID: () => (/* binding */ INVALID), +/* harmony export */ NEVER: () => (/* binding */ NEVER), +/* harmony export */ OK: () => (/* binding */ OK), +/* harmony export */ ParseStatus: () => (/* binding */ ParseStatus), +/* harmony export */ Schema: () => (/* binding */ ZodType), +/* harmony export */ ZodAny: () => (/* binding */ ZodAny), +/* harmony export */ ZodArray: () => (/* binding */ ZodArray), +/* harmony export */ ZodBigInt: () => (/* binding */ ZodBigInt), +/* harmony export */ ZodBoolean: () => (/* binding */ ZodBoolean), +/* harmony export */ ZodBranded: () => (/* binding */ ZodBranded), +/* harmony export */ ZodCatch: () => (/* binding */ ZodCatch), +/* harmony export */ ZodDate: () => (/* binding */ ZodDate), +/* harmony export */ ZodDefault: () => (/* binding */ ZodDefault), +/* harmony export */ ZodDiscriminatedUnion: () => (/* binding */ ZodDiscriminatedUnion), +/* harmony export */ ZodEffects: () => (/* binding */ ZodEffects), +/* harmony export */ ZodEnum: () => (/* binding */ ZodEnum), +/* harmony export */ ZodError: () => (/* binding */ ZodError), +/* harmony export */ ZodFirstPartyTypeKind: () => (/* binding */ ZodFirstPartyTypeKind), +/* harmony export */ ZodFunction: () => (/* binding */ ZodFunction), +/* harmony export */ ZodIntersection: () => (/* binding */ ZodIntersection), +/* harmony export */ ZodIssueCode: () => (/* binding */ ZodIssueCode), +/* harmony export */ ZodLazy: () => (/* binding */ ZodLazy), +/* harmony export */ ZodLiteral: () => (/* binding */ ZodLiteral), +/* harmony export */ ZodMap: () => (/* binding */ ZodMap), +/* harmony export */ ZodNaN: () => (/* binding */ ZodNaN), +/* harmony export */ ZodNativeEnum: () => (/* binding */ ZodNativeEnum), +/* harmony export */ ZodNever: () => (/* binding */ ZodNever), +/* harmony export */ ZodNull: () => (/* binding */ ZodNull), +/* harmony export */ ZodNullable: () => (/* binding */ ZodNullable), +/* harmony export */ ZodNumber: () => (/* binding */ ZodNumber), +/* harmony export */ ZodObject: () => (/* binding */ ZodObject), +/* harmony export */ ZodOptional: () => (/* binding */ ZodOptional), +/* harmony export */ ZodParsedType: () => (/* binding */ ZodParsedType), +/* harmony export */ ZodPipeline: () => (/* binding */ ZodPipeline), +/* harmony export */ ZodPromise: () => (/* binding */ ZodPromise), +/* harmony export */ ZodReadonly: () => (/* binding */ ZodReadonly), +/* harmony export */ ZodRecord: () => (/* binding */ ZodRecord), +/* harmony export */ ZodSchema: () => (/* binding */ ZodType), +/* harmony export */ ZodSet: () => (/* binding */ ZodSet), +/* harmony export */ ZodString: () => (/* binding */ ZodString), +/* harmony export */ ZodSymbol: () => (/* binding */ ZodSymbol), +/* harmony export */ ZodTransformer: () => (/* binding */ ZodEffects), +/* harmony export */ ZodTuple: () => (/* binding */ ZodTuple), +/* harmony export */ ZodType: () => (/* binding */ ZodType), +/* harmony export */ ZodUndefined: () => (/* binding */ ZodUndefined), +/* harmony export */ ZodUnion: () => (/* binding */ ZodUnion), +/* harmony export */ ZodUnknown: () => (/* binding */ ZodUnknown), +/* harmony export */ ZodVoid: () => (/* binding */ ZodVoid), +/* harmony export */ addIssueToContext: () => (/* binding */ addIssueToContext), +/* harmony export */ any: () => (/* binding */ anyType), +/* harmony export */ array: () => (/* binding */ arrayType), +/* harmony export */ bigint: () => (/* binding */ bigIntType), +/* harmony export */ boolean: () => (/* binding */ booleanType), +/* harmony export */ coerce: () => (/* binding */ coerce), +/* harmony export */ custom: () => (/* binding */ custom), +/* harmony export */ date: () => (/* binding */ dateType), +/* harmony export */ datetimeRegex: () => (/* binding */ datetimeRegex), +/* harmony export */ "default": () => (/* binding */ z), +/* harmony export */ defaultErrorMap: () => (/* binding */ errorMap), +/* harmony export */ discriminatedUnion: () => (/* binding */ discriminatedUnionType), +/* harmony export */ effect: () => (/* binding */ effectsType), +/* harmony export */ "enum": () => (/* binding */ enumType), +/* harmony export */ "function": () => (/* binding */ functionType), +/* harmony export */ getErrorMap: () => (/* binding */ getErrorMap), +/* harmony export */ getParsedType: () => (/* binding */ getParsedType), +/* harmony export */ "instanceof": () => (/* binding */ instanceOfType), +/* harmony export */ intersection: () => (/* binding */ intersectionType), +/* harmony export */ isAborted: () => (/* binding */ isAborted), +/* harmony export */ isAsync: () => (/* binding */ isAsync), +/* harmony export */ isDirty: () => (/* binding */ isDirty), +/* harmony export */ isValid: () => (/* binding */ isValid), +/* harmony export */ late: () => (/* binding */ late), +/* harmony export */ lazy: () => (/* binding */ lazyType), +/* harmony export */ literal: () => (/* binding */ literalType), +/* harmony export */ makeIssue: () => (/* binding */ makeIssue), +/* harmony export */ map: () => (/* binding */ mapType), +/* harmony export */ nan: () => (/* binding */ nanType), +/* harmony export */ nativeEnum: () => (/* binding */ nativeEnumType), +/* harmony export */ never: () => (/* binding */ neverType), +/* harmony export */ "null": () => (/* binding */ nullType), +/* harmony export */ nullable: () => (/* binding */ nullableType), +/* harmony export */ number: () => (/* binding */ numberType), +/* harmony export */ object: () => (/* binding */ objectType), +/* harmony export */ objectUtil: () => (/* binding */ objectUtil), +/* harmony export */ oboolean: () => (/* binding */ oboolean), +/* harmony export */ onumber: () => (/* binding */ onumber), +/* harmony export */ optional: () => (/* binding */ optionalType), +/* harmony export */ ostring: () => (/* binding */ ostring), +/* harmony export */ pipeline: () => (/* binding */ pipelineType), +/* harmony export */ preprocess: () => (/* binding */ preprocessType), +/* harmony export */ promise: () => (/* binding */ promiseType), +/* harmony export */ quotelessJson: () => (/* binding */ quotelessJson), +/* harmony export */ record: () => (/* binding */ recordType), +/* harmony export */ set: () => (/* binding */ setType), +/* harmony export */ setErrorMap: () => (/* binding */ setErrorMap), +/* harmony export */ strictObject: () => (/* binding */ strictObjectType), +/* harmony export */ string: () => (/* binding */ stringType), +/* harmony export */ symbol: () => (/* binding */ symbolType), +/* harmony export */ transformer: () => (/* binding */ effectsType), +/* harmony export */ tuple: () => (/* binding */ tupleType), +/* harmony export */ undefined: () => (/* binding */ undefinedType), +/* harmony export */ union: () => (/* binding */ unionType), +/* harmony export */ unknown: () => (/* binding */ unknownType), +/* harmony export */ util: () => (/* binding */ util), +/* harmony export */ "void": () => (/* binding */ voidType), +/* harmony export */ z: () => (/* binding */ z) /* harmony export */ }); -/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); -/* harmony import */ var _resources__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./resources */ "./sample/resources.ts"); -/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./config */ "./sample/config.ts"); - - - -class Player extends excalibur__WEBPACK_IMPORTED_MODULE_2__.Actor { - constructor(args) { - super({ - ...args, - collisionType: excalibur__WEBPACK_IMPORTED_MODULE_2__.CollisionType.Active - }); - } - onInitialize(engine) { - const playerSpriteSheet = excalibur__WEBPACK_IMPORTED_MODULE_2__.SpriteSheet.fromImageSource({ - image: _resources__WEBPACK_IMPORTED_MODULE_0__.Resources.HeroSpriteSheetPng, - grid: { - spriteWidth: 16, - spriteHeight: 16, - rows: 8, - columns: 8 - } - }); - const leftIdle = new excalibur__WEBPACK_IMPORTED_MODULE_2__.Animation({ - frames: [ - { graphic: playerSpriteSheet.getSprite(0, 1), duration: _config__WEBPACK_IMPORTED_MODULE_1__.Config.PlayerFrameSpeed }, - { graphic: playerSpriteSheet.getSprite(1, 1), duration: _config__WEBPACK_IMPORTED_MODULE_1__.Config.PlayerFrameSpeed }, - { graphic: playerSpriteSheet.getSprite(2, 1), duration: _config__WEBPACK_IMPORTED_MODULE_1__.Config.PlayerFrameSpeed }, - { graphic: playerSpriteSheet.getSprite(3, 1), duration: _config__WEBPACK_IMPORTED_MODULE_1__.Config.PlayerFrameSpeed }, - ] - }); - this.graphics.add('left-idle', leftIdle); - const rightIdle = new excalibur__WEBPACK_IMPORTED_MODULE_2__.Animation({ - frames: [ - { graphic: playerSpriteSheet.getSprite(0, 2), duration: _config__WEBPACK_IMPORTED_MODULE_1__.Config.PlayerFrameSpeed }, - { graphic: playerSpriteSheet.getSprite(1, 2), duration: _config__WEBPACK_IMPORTED_MODULE_1__.Config.PlayerFrameSpeed }, - { graphic: playerSpriteSheet.getSprite(2, 2), duration: _config__WEBPACK_IMPORTED_MODULE_1__.Config.PlayerFrameSpeed }, - { graphic: playerSpriteSheet.getSprite(3, 2), duration: _config__WEBPACK_IMPORTED_MODULE_1__.Config.PlayerFrameSpeed }, - ] - }); - this.graphics.add('right-idle', rightIdle); - const upIdle = new excalibur__WEBPACK_IMPORTED_MODULE_2__.Animation({ - frames: [ - { graphic: playerSpriteSheet.getSprite(0, 3), duration: _config__WEBPACK_IMPORTED_MODULE_1__.Config.PlayerFrameSpeed }, - { graphic: playerSpriteSheet.getSprite(1, 3), duration: _config__WEBPACK_IMPORTED_MODULE_1__.Config.PlayerFrameSpeed }, - { graphic: playerSpriteSheet.getSprite(2, 3), duration: _config__WEBPACK_IMPORTED_MODULE_1__.Config.PlayerFrameSpeed }, - { graphic: playerSpriteSheet.getSprite(3, 3), duration: _config__WEBPACK_IMPORTED_MODULE_1__.Config.PlayerFrameSpeed }, - ] - }); - this.graphics.add('up-idle', upIdle); - const downIdle = new excalibur__WEBPACK_IMPORTED_MODULE_2__.Animation({ - frames: [ - { graphic: playerSpriteSheet.getSprite(0, 0), duration: _config__WEBPACK_IMPORTED_MODULE_1__.Config.PlayerFrameSpeed }, - { graphic: playerSpriteSheet.getSprite(1, 0), duration: _config__WEBPACK_IMPORTED_MODULE_1__.Config.PlayerFrameSpeed }, - { graphic: playerSpriteSheet.getSprite(2, 0), duration: _config__WEBPACK_IMPORTED_MODULE_1__.Config.PlayerFrameSpeed }, - { graphic: playerSpriteSheet.getSprite(3, 0), duration: _config__WEBPACK_IMPORTED_MODULE_1__.Config.PlayerFrameSpeed }, - ] - }); - this.graphics.add('down-idle', downIdle); - const leftWalk = new excalibur__WEBPACK_IMPORTED_MODULE_2__.Animation({ - frames: [ - { graphic: playerSpriteSheet.getSprite(0, 5), duration: _config__WEBPACK_IMPORTED_MODULE_1__.Config.PlayerFrameSpeed }, - { graphic: playerSpriteSheet.getSprite(1, 5), duration: _config__WEBPACK_IMPORTED_MODULE_1__.Config.PlayerFrameSpeed }, - { graphic: playerSpriteSheet.getSprite(2, 5), duration: _config__WEBPACK_IMPORTED_MODULE_1__.Config.PlayerFrameSpeed }, - { graphic: playerSpriteSheet.getSprite(3, 5), duration: _config__WEBPACK_IMPORTED_MODULE_1__.Config.PlayerFrameSpeed }, - ] - }); - this.graphics.add('left-walk', leftWalk); - const rightWalk = new excalibur__WEBPACK_IMPORTED_MODULE_2__.Animation({ - frames: [ - { graphic: playerSpriteSheet.getSprite(0, 6), duration: _config__WEBPACK_IMPORTED_MODULE_1__.Config.PlayerFrameSpeed }, - { graphic: playerSpriteSheet.getSprite(1, 6), duration: _config__WEBPACK_IMPORTED_MODULE_1__.Config.PlayerFrameSpeed }, - { graphic: playerSpriteSheet.getSprite(2, 6), duration: _config__WEBPACK_IMPORTED_MODULE_1__.Config.PlayerFrameSpeed }, - { graphic: playerSpriteSheet.getSprite(3, 6), duration: _config__WEBPACK_IMPORTED_MODULE_1__.Config.PlayerFrameSpeed }, - ] - }); - this.graphics.add('right-walk', rightWalk); - const upWalk = new excalibur__WEBPACK_IMPORTED_MODULE_2__.Animation({ - frames: [ - { graphic: playerSpriteSheet.getSprite(0, 7), duration: _config__WEBPACK_IMPORTED_MODULE_1__.Config.PlayerFrameSpeed }, - { graphic: playerSpriteSheet.getSprite(1, 7), duration: _config__WEBPACK_IMPORTED_MODULE_1__.Config.PlayerFrameSpeed }, - { graphic: playerSpriteSheet.getSprite(2, 7), duration: _config__WEBPACK_IMPORTED_MODULE_1__.Config.PlayerFrameSpeed }, - { graphic: playerSpriteSheet.getSprite(3, 7), duration: _config__WEBPACK_IMPORTED_MODULE_1__.Config.PlayerFrameSpeed }, - ] - }); - this.graphics.add('up-walk', upWalk); - const downWalk = new excalibur__WEBPACK_IMPORTED_MODULE_2__.Animation({ - frames: [ - { graphic: playerSpriteSheet.getSprite(0, 4), duration: _config__WEBPACK_IMPORTED_MODULE_1__.Config.PlayerFrameSpeed }, - { graphic: playerSpriteSheet.getSprite(1, 4), duration: _config__WEBPACK_IMPORTED_MODULE_1__.Config.PlayerFrameSpeed }, - { graphic: playerSpriteSheet.getSprite(2, 4), duration: _config__WEBPACK_IMPORTED_MODULE_1__.Config.PlayerFrameSpeed }, - { graphic: playerSpriteSheet.getSprite(3, 4), duration: _config__WEBPACK_IMPORTED_MODULE_1__.Config.PlayerFrameSpeed }, - ] - }); - this.graphics.add('down-walk', downWalk); +var util; +(function (util) { + util.assertEqual = (val) => val; + function assertIs(_arg) { } + util.assertIs = assertIs; + function assertNever(_x) { + throw new Error(); } - onPreUpdate(engine, elapsedMs) { - this.vel = excalibur__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero; - this.graphics.use('down-idle'); - if (engine.input.keyboard.isHeld(excalibur__WEBPACK_IMPORTED_MODULE_2__.Keys.ArrowRight)) { - this.vel = excalibur__WEBPACK_IMPORTED_MODULE_2__.vec(_config__WEBPACK_IMPORTED_MODULE_1__.Config.PlayerSpeed, 0); - this.graphics.use('right-walk'); - } - if (engine.input.keyboard.isHeld(excalibur__WEBPACK_IMPORTED_MODULE_2__.Keys.ArrowLeft)) { - this.vel = excalibur__WEBPACK_IMPORTED_MODULE_2__.vec(-_config__WEBPACK_IMPORTED_MODULE_1__.Config.PlayerSpeed, 0); - this.graphics.use('left-walk'); - } - if (engine.input.keyboard.isHeld(excalibur__WEBPACK_IMPORTED_MODULE_2__.Keys.ArrowUp)) { - this.vel = excalibur__WEBPACK_IMPORTED_MODULE_2__.vec(0, -_config__WEBPACK_IMPORTED_MODULE_1__.Config.PlayerSpeed); - this.graphics.use('up-walk'); + util.assertNever = assertNever; + util.arrayToEnum = (items) => { + const obj = {}; + for (const item of items) { + obj[item] = item; } - if (engine.input.keyboard.isHeld(excalibur__WEBPACK_IMPORTED_MODULE_2__.Keys.ArrowDown)) { - this.vel = excalibur__WEBPACK_IMPORTED_MODULE_2__.vec(0, _config__WEBPACK_IMPORTED_MODULE_1__.Config.PlayerSpeed); - this.graphics.use('down-walk'); + return obj; + }; + util.getValidEnumValues = (obj) => { + const validKeys = util.objectKeys(obj).filter((k) => typeof obj[obj[k]] !== "number"); + const filtered = {}; + for (const k of validKeys) { + filtered[k] = obj[k]; } - } -} - - -/***/ }), - -/***/ "./sample/resources.ts": -/*!*****************************!*\ - !*** ./sample/resources.ts ***! - \*****************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ Resources: () => (/* binding */ Resources), -/* harmony export */ loader: () => (/* binding */ loader) -/* harmony export */ }); -/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); -/* harmony import */ var _excalibur_ldtk__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @excalibur-ldtk */ "./src/index.ts"); - - -const Resources = { - HeroSpriteSheetPng: new excalibur__WEBPACK_IMPORTED_MODULE_1__.ImageSource('./Solaria Demo Pack Update 03/Solaria Demo Pack Update 03/16x16/Sprites/Hero 01.png'), - LdtkResource: new _excalibur_ldtk__WEBPACK_IMPORTED_MODULE_0__.LdtkResource('./spacing-padding/spacing-padding.ldtk', { - useTilemapCameraStrategy: true, - useMapBackgroundColor: true, - }), - LdtkAutoTile: new _excalibur_ldtk__WEBPACK_IMPORTED_MODULE_0__.LdtkResource('./autotile/autotile.ldtk', { - useMapBackgroundColor: true, - }), - LdtkPureAutoTile: new _excalibur_ldtk__WEBPACK_IMPORTED_MODULE_0__.LdtkResource('./dsml1/dsml1.ldtk', { - useMapBackgroundColor: true, - }) -}; -const loader = new excalibur__WEBPACK_IMPORTED_MODULE_1__.Loader(); -for (let resource of Object.values(Resources)) { - loader.addResource(resource); -} - - -/***/ }), - -/***/ "./src/entity-layer.ts": -/*!*****************************!*\ - !*** ./src/entity-layer.ts ***! - \*****************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ EntityLayer: () => (/* binding */ EntityLayer) -/* harmony export */ }); -/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); - -class EntityLayer { - constructor(level, ldtkLayer, resource, order) { - var _a, _b; - this.ldtkLayer = ldtkLayer; - this.resource = resource; - this.order = order; - this.entities = []; - this.ldtkToEntity = new Map(); - this.entityToLdtk = new Map(); - this.worldPos = (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(level.ldtkLevel.worldX, level.ldtkLevel.worldY); - this.offset = (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(ldtkLayer.__pxTotalOffsetX, ldtkLayer.__pxTotalOffsetY); - if (ldtkLayer.entityInstances) { - for (let entity of ldtkLayer.entityInstances) { - const entityMetadata = resource.projectMetadata.defs.entities.find(e => { - return e.identifier === entity.__identifier; - }); - if (resource.factories.has(entity.__identifier)) { - const factory = resource.factories.get(entity.__identifier); - if (factory) { - const newEntity = factory({ - type: entity.__identifier, - worldPos: (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(entity.px[0], entity.px[1]).add(this.worldPos.add(this.offset)), - entity, - definition: entityMetadata, - layer: this, - }); - if (newEntity) { - this.entities.push(newEntity); - this.ldtkToEntity.set(entity, newEntity); - this.entityToLdtk.set(newEntity, entity); - } - } - } - else { - const actor = new excalibur__WEBPACK_IMPORTED_MODULE_0__.Actor({ - name: entity.__identifier, - pos: (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(entity.px[0], entity.px[1]).add(this.worldPos.add(this.offset)), - width: entity.width, - height: entity.height, - anchor: (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)((_a = entityMetadata === null || entityMetadata === void 0 ? void 0 : entityMetadata.pivotX) !== null && _a !== void 0 ? _a : 0, (_b = entityMetadata === null || entityMetadata === void 0 ? void 0 : entityMetadata.pivotY) !== null && _b !== void 0 ? _b : 0), - z: order - }); - if (entity.__tile) { - const ts = resource.tilesets.get(entity.__tile.tilesetUid); - if (ts) { - const tsxCoord = Math.floor(entity.__tile.x / entity.__tile.w); - const tsyCoord = Math.floor(entity.__tile.y / entity.__tile.h); - const sprite = ts.spritesheet.getSprite(tsxCoord, tsyCoord); - if (sprite) { - actor.graphics.use(sprite); - } - } - } - this.entities.push(actor); - this.ldtkToEntity.set(entity, actor); - this.entityToLdtk.set(actor, entity); + return util.objectValues(filtered); + }; + util.objectValues = (obj) => { + return util.objectKeys(obj).map(function (e) { + return obj[e]; + }); + }; + util.objectKeys = typeof Object.keys === "function" // eslint-disable-line ban/ban + ? (obj) => Object.keys(obj) // eslint-disable-line ban/ban + : (object) => { + const keys = []; + for (const key in object) { + if (Object.prototype.hasOwnProperty.call(object, key)) { + keys.push(key); } } + return keys; + }; + util.find = (arr, checker) => { + for (const item of arr) { + if (checker(item)) + return item; } + return undefined; + }; + util.isInteger = typeof Number.isInteger === "function" + ? (val) => Number.isInteger(val) // eslint-disable-line ban/ban + : (val) => typeof val === "number" && isFinite(val) && Math.floor(val) === val; + function joinValues(array, separator = " | ") { + return array + .map((val) => (typeof val === "string" ? `'${val}'` : val)) + .join(separator); } - runFactories() { - for (let entity of this.ldtkLayer.entityInstances) { - const factory = this.resource.factories.get(entity.__identifier); - if (!factory) { - continue; + util.joinValues = joinValues; + util.jsonStringifyReplacer = (_, value) => { + if (typeof value === "bigint") { + return value.toString(); + } + return value; + }; +})(util || (util = {})); +var objectUtil; +(function (objectUtil) { + objectUtil.mergeShapes = (first, second) => { + return { + ...first, + ...second, // second overwrites first + }; + }; +})(objectUtil || (objectUtil = {})); +const ZodParsedType = util.arrayToEnum([ + "string", + "nan", + "number", + "integer", + "float", + "boolean", + "date", + "bigint", + "symbol", + "function", + "undefined", + "null", + "array", + "object", + "unknown", + "promise", + "void", + "never", + "map", + "set", +]); +const getParsedType = (data) => { + const t = typeof data; + switch (t) { + case "undefined": + return ZodParsedType.undefined; + case "string": + return ZodParsedType.string; + case "number": + return isNaN(data) ? ZodParsedType.nan : ZodParsedType.number; + case "boolean": + return ZodParsedType.boolean; + case "function": + return ZodParsedType.function; + case "bigint": + return ZodParsedType.bigint; + case "symbol": + return ZodParsedType.symbol; + case "object": + if (Array.isArray(data)) { + return ZodParsedType.array; } - const entityMetadata = this.resource.projectMetadata.defs.entities.find(e => { - return e.identifier === entity.__identifier; - }); - const newEntity = factory({ - type: entity.__identifier, - worldPos: (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(entity.px[0], entity.px[1]).add(this.worldPos.add(this.offset)), - entity, - definition: entityMetadata, - layer: this, - }); - if (newEntity) { - // remove pre-existing entity (e.g. the default actor created for the entity placement) - const preExisting = this.ldtkToEntity.get(entity); - if (preExisting) { - const index = this.entities.indexOf(preExisting); - if (index > -1) { - this.entities.splice(index, 1); - this.ldtkToEntity.delete(entity); - this.entityToLdtk.delete(preExisting); - } - } - this.entities.push(newEntity); - this.ldtkToEntity.set(entity, newEntity); - this.entityToLdtk.set(newEntity, entity); + if (data === null) { + return ZodParsedType.null; } - } - } - getEntitiesByIdentifier(identifier) { - const ldtkEntities = this.getLdtkEntitiesByIdentifier(identifier); - let results = []; - for (const ldtk of ldtkEntities) { - const maybeEntity = this.ldtkToEntity.get(ldtk); - if (maybeEntity) { - results.push(maybeEntity); + if (data.then && + typeof data.then === "function" && + data.catch && + typeof data.catch === "function") { + return ZodParsedType.promise; } - } - return results; - } - getEntitiesByField(fieldIdentifier, value) { - const ldtkEntities = this.getLdtkEntitiesByField(fieldIdentifier, value); - let results = []; - for (const ldtk of ldtkEntities) { - const maybeEntity = this.ldtkToEntity.get(ldtk); - if (maybeEntity) { - results.push(maybeEntity); + if (typeof Map !== "undefined" && data instanceof Map) { + return ZodParsedType.map; } - } - return results; - } - /** - * Search layer for entities that match an identifier (case insensitive) - * @param identifier - * @returns - */ - getLdtkEntitiesByIdentifier(identifier) { - return this.ldtkLayer.entityInstances.filter(e => e.__identifier.toLocaleLowerCase() === identifier.toLowerCase()); - } - /** - * Search layer for entities that match a field and optionally a value (both case insensitive) - * @param fieldIdentifier - * @param value - */ - getLdtkEntitiesByField(fieldIdentifier, value) { - return this.ldtkLayer.entityInstances.filter(e => { - if (value !== undefined) { - let normalizedValue = value; - if (typeof value === 'string') { - normalizedValue = value.toLocaleLowerCase(); - } - const field = e.fieldInstances.find(f => f.__identifier.toLocaleLowerCase() === fieldIdentifier.toLocaleLowerCase()); - if (field) { - return field.__value === normalizedValue; - } - return false; + if (typeof Set !== "undefined" && data instanceof Set) { + return ZodParsedType.set; } - else { - return !!e.fieldInstances.find(f => f.__identifier.toLocaleLowerCase() === fieldIdentifier.toLocaleLowerCase()); + if (typeof Date !== "undefined" && data instanceof Date) { + return ZodParsedType.date; } - }); - } -} - - -/***/ }), - -/***/ "./src/file-loader.ts": -/*!****************************!*\ - !*** ./src/file-loader.ts ***! - \****************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ FetchLoader: () => (/* binding */ FetchLoader) -/* harmony export */ }); -const FetchLoader = async (path, contentType) => { - const response = await fetch(path); - switch (contentType.toLowerCase()) { - case 'xml': return await response.text(); - case 'json': return await response.json(); - default: return await response.text(); + return ZodParsedType.object; + default: + return ZodParsedType.unknown; } }; - -/***/ }), - -/***/ "./src/index.ts": -/*!**********************!*\ - !*** ./src/index.ts ***! - \**********************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ EntityLayer: () => (/* reexport safe */ _entity_layer__WEBPACK_IMPORTED_MODULE_1__.EntityLayer), -/* harmony export */ FetchLoader: () => (/* reexport safe */ _file_loader__WEBPACK_IMPORTED_MODULE_2__.FetchLoader), -/* harmony export */ IntGridLayer: () => (/* reexport safe */ _intgrid_layer__WEBPACK_IMPORTED_MODULE_3__.IntGridLayer), -/* harmony export */ LdtkEntityDefinition: () => (/* reexport safe */ _types__WEBPACK_IMPORTED_MODULE_10__.LdtkEntityDefinition), -/* harmony export */ LdtkEntityInstance: () => (/* reexport safe */ _types__WEBPACK_IMPORTED_MODULE_10__.LdtkEntityInstance), -/* harmony export */ LdtkLayerDefinition: () => (/* reexport safe */ _types__WEBPACK_IMPORTED_MODULE_10__.LdtkLayerDefinition), -/* harmony export */ LdtkLayerInstance: () => (/* reexport safe */ _types__WEBPACK_IMPORTED_MODULE_10__.LdtkLayerInstance), -/* harmony export */ LdtkLevel: () => (/* reexport safe */ _types__WEBPACK_IMPORTED_MODULE_10__.LdtkLevel), -/* harmony export */ LdtkProjectMetadata: () => (/* reexport safe */ _types__WEBPACK_IMPORTED_MODULE_10__.LdtkProjectMetadata), -/* harmony export */ LdtkResource: () => (/* reexport safe */ _ldtk_resource__WEBPACK_IMPORTED_MODULE_0__.LdtkResource), -/* harmony export */ Level: () => (/* reexport safe */ _level__WEBPACK_IMPORTED_MODULE_5__.Level), -/* harmony export */ LevelResource: () => (/* reexport safe */ _level_resource__WEBPACK_IMPORTED_MODULE_4__.LevelResource), -/* harmony export */ LoaderCache: () => (/* reexport safe */ _loader_cache__WEBPACK_IMPORTED_MODULE_6__.LoaderCache), -/* harmony export */ TileLayer: () => (/* reexport safe */ _tile_layer__WEBPACK_IMPORTED_MODULE_8__.TileLayer), -/* harmony export */ Tileset: () => (/* reexport safe */ _tileset__WEBPACK_IMPORTED_MODULE_9__.Tileset), -/* harmony export */ filenameFromPath: () => (/* reexport safe */ _path_util__WEBPACK_IMPORTED_MODULE_7__.filenameFromPath), -/* harmony export */ mapPath: () => (/* reexport safe */ _path_util__WEBPACK_IMPORTED_MODULE_7__.mapPath), -/* harmony export */ pathInMap: () => (/* reexport safe */ _path_util__WEBPACK_IMPORTED_MODULE_7__.pathInMap), -/* harmony export */ pathRelativeToBase: () => (/* reexport safe */ _path_util__WEBPACK_IMPORTED_MODULE_7__.pathRelativeToBase) -/* harmony export */ }); -/* harmony import */ var _ldtk_resource__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ldtk-resource */ "./src/ldtk-resource.ts"); -/* harmony import */ var _entity_layer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./entity-layer */ "./src/entity-layer.ts"); -/* harmony import */ var _file_loader__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./file-loader */ "./src/file-loader.ts"); -/* harmony import */ var _intgrid_layer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./intgrid-layer */ "./src/intgrid-layer.ts"); -/* harmony import */ var _level_resource__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./level-resource */ "./src/level-resource.ts"); -/* harmony import */ var _level__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./level */ "./src/level.ts"); -/* harmony import */ var _loader_cache__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./loader-cache */ "./src/loader-cache.ts"); -/* harmony import */ var _path_util__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./path-util */ "./src/path-util.ts"); -/* harmony import */ var _tile_layer__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./tile-layer */ "./src/tile-layer.ts"); -/* harmony import */ var _tileset__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./tileset */ "./src/tileset.ts"); -/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./types */ "./src/types.ts"); - - - - - - - - - - - - - -/***/ }), - -/***/ "./src/intgrid-layer.ts": -/*!******************************!*\ - !*** ./src/intgrid-layer.ts ***! - \******************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ IntGridLayer: () => (/* binding */ IntGridLayer) -/* harmony export */ }); -/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); - -class IntGridLayer { - constructor(level, ldtkLayer, resource, order) { - var _a, _b, _c, _d; - this.order = order; - this.worldPos = (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(level.ldtkLevel.worldX, level.ldtkLevel.worldY); - this.offset = (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(ldtkLayer.__pxTotalOffsetX, ldtkLayer.__pxTotalOffsetY); - this.ldtkLayer = ldtkLayer; - if (ldtkLayer.intGridCsv.length || ldtkLayer.autoLayerTiles.length) { - const rows = ldtkLayer.__cHei; - const columns = ldtkLayer.__cWid; - this.tilemap = new excalibur__WEBPACK_IMPORTED_MODULE_0__.TileMap({ - name: ldtkLayer.__identifier, - pos: this.worldPos.add(this.offset), - tileWidth: ldtkLayer.__gridSize, - tileHeight: ldtkLayer.__gridSize, - rows, - columns, - }); - this.tilemap.z = order; - const graphics = this.tilemap.get(excalibur__WEBPACK_IMPORTED_MODULE_0__.GraphicsComponent); - graphics.isVisible = ldtkLayer.visible; - // find the intgrid metadata - const layerMetadata = resource.projectMetadata.defs.layers.find(l => { - return ldtkLayer.__identifier === l.identifier; - }); - if (layerMetadata) { - const solidValue = layerMetadata.intGridValues.find(val => { - var _a; - return ((_a = val === null || val === void 0 ? void 0 : val.identifier) === null || _a === void 0 ? void 0 : _a.toLocaleLowerCase()) === 'solid'; - }); - for (let i = 0; i < ldtkLayer.intGridCsv.length; i++) { - const xCoord = i % columns; - const yCoord = Math.floor(i / columns); - const tile = this.tilemap.getTile(xCoord, yCoord); - if (solidValue && ldtkLayer.intGridCsv[i] === solidValue.value) { - tile.solid = true; - } - // TODO might be a mistake to treat 1 as solid if there isn't a labelled solid - if (!solidValue && ldtkLayer.intGridCsv[i] === 1) { - tile.solid = true; - } +const ZodIssueCode = util.arrayToEnum([ + "invalid_type", + "invalid_literal", + "custom", + "invalid_union", + "invalid_union_discriminator", + "invalid_enum_value", + "unrecognized_keys", + "invalid_arguments", + "invalid_return_type", + "invalid_date", + "invalid_string", + "too_small", + "too_big", + "invalid_intersection_types", + "not_multiple_of", + "not_finite", +]); +const quotelessJson = (obj) => { + const json = JSON.stringify(obj, null, 2); + return json.replace(/"([^"]+)":/g, "$1:"); +}; +class ZodError extends Error { + get errors() { + return this.issues; + } + constructor(issues) { + super(); + this.issues = []; + this.addIssue = (sub) => { + this.issues = [...this.issues, sub]; + }; + this.addIssues = (subs = []) => { + this.issues = [...this.issues, ...subs]; + }; + const actualProto = new.target.prototype; + if (Object.setPrototypeOf) { + // eslint-disable-next-line ban/ban + Object.setPrototypeOf(this, actualProto); + } + else { + this.__proto__ = actualProto; + } + this.name = "ZodError"; + this.issues = issues; + } + format(_mapper) { + const mapper = _mapper || + function (issue) { + return issue.message; + }; + const fieldErrors = { _errors: [] }; + const processError = (error) => { + for (const issue of error.issues) { + if (issue.code === "invalid_union") { + issue.unionErrors.map(processError); } - if (ldtkLayer.__tilesetDefUid) { - this.tileset = resource.tilesets.get(ldtkLayer.__tilesetDefUid); - for (let i = 0; i < ldtkLayer.autoLayerTiles.length; i++) { - const tile = ldtkLayer.autoLayerTiles[i]; - const xCoord = Math.floor(tile.px[0] / ldtkLayer.__gridSize); - const yCoord = Math.floor(tile.px[1] / ldtkLayer.__gridSize); - const exTile = this.tilemap.getTile(xCoord, yCoord); - if (exTile && this.tileset) { - const tsxCoord = Math.floor((tile.src[0] - ((_a = this.tileset.ldtkTileset.padding) !== null && _a !== void 0 ? _a : 0)) / (this.tileset.ldtkTileset.tileGridSize + ((_b = this.tileset.ldtkTileset.spacing) !== null && _b !== void 0 ? _b : 0))); - const tsyCoord = Math.floor((tile.src[1] - ((_c = this.tileset.ldtkTileset.padding) !== null && _c !== void 0 ? _c : 0)) / (this.tileset.ldtkTileset.tileGridSize + ((_d = this.tileset.ldtkTileset.spacing) !== null && _d !== void 0 ? _d : 0))); - // Bit 0 toggles x flip - // Bit 1 toggles 1 flip - // Examples: f=0 (no flip), f=1 (X flip only), f=2 (Y flip only), f=3 (both flips) - const flipHorizontal = !!(tile.f & 0b01); - const flipVertical = !!(tile.f & 0b10); - let sprite = this.tileset.spritesheet.getSprite(tsxCoord, tsyCoord); - if (flipHorizontal || flipVertical) { - sprite = sprite.clone(); - sprite.flipHorizontal = flipHorizontal; - sprite.flipVertical = flipVertical; - } - if (sprite) { - exTile.addGraphic(sprite); - } - else { - console.error('Could not find sprite in LDtk spritesheet at', tsxCoord, tsyCoord); - } + else if (issue.code === "invalid_return_type") { + processError(issue.returnTypeError); + } + else if (issue.code === "invalid_arguments") { + processError(issue.argumentsError); + } + else if (issue.path.length === 0) { + fieldErrors._errors.push(mapper(issue)); + } + else { + let curr = fieldErrors; + let i = 0; + while (i < issue.path.length) { + const el = issue.path[i]; + const terminal = i === issue.path.length - 1; + if (!terminal) { + curr[el] = curr[el] || { _errors: [] }; + // if (typeof el === "string") { + // curr[el] = curr[el] || { _errors: [] }; + // } else if (typeof el === "number") { + // const errorArray: any = []; + // errorArray._errors = []; + // curr[el] = curr[el] || errorArray; + // } + } + else { + curr[el] = curr[el] || { _errors: [] }; + curr[el]._errors.push(mapper(issue)); } + curr = curr[el]; + i++; } } } - } + }; + processError(this); + return fieldErrors; } -} - - -/***/ }), - -/***/ "./src/ldtk-resource.ts": -/*!******************************!*\ - !*** ./src/ldtk-resource.ts ***! - \******************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ LdtkResource: () => (/* binding */ LdtkResource) -/* harmony export */ }); -/* harmony import */ var _tile_layer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./tile-layer */ "./src/tile-layer.ts"); -/* harmony import */ var _path_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./path-util */ "./src/path-util.ts"); -/* harmony import */ var _file_loader__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./file-loader */ "./src/file-loader.ts"); -/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./types */ "./src/types.ts"); -/* harmony import */ var compare_versions__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! compare-versions */ "./node_modules/compare-versions/lib/esm/compare.js"); -/* harmony import */ var _loader_cache__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./loader-cache */ "./src/loader-cache.ts"); -/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); -/* harmony import */ var _level_resource__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./level-resource */ "./src/level-resource.ts"); -/* harmony import */ var _tileset__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./tileset */ "./src/tileset.ts"); -/* harmony import */ var _level__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./level */ "./src/level.ts"); -/* harmony import */ var _entity_layer__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./entity-layer */ "./src/entity-layer.ts"); -/* harmony import */ var _intgrid_layer__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./intgrid-layer */ "./src/intgrid-layer.ts"); - - - - - - - - - - - - -class LdtkResource { - constructor(path, options) { - this.path = path; - this.tilesets = new Map(); - this.levels = new Map(); - this.levelsByName = new Map(); - this.factories = new Map(); - this.fileLoader = _file_loader__WEBPACK_IMPORTED_MODULE_2__.FetchLoader; - this._imageLoader = new _loader_cache__WEBPACK_IMPORTED_MODULE_4__.LoaderCache(excalibur__WEBPACK_IMPORTED_MODULE_10__.ImageSource); - this._levelLoader = new _loader_cache__WEBPACK_IMPORTED_MODULE_4__.LoaderCache(_level_resource__WEBPACK_IMPORTED_MODULE_5__.LevelResource); - this.startZIndex = 0; - this.textQuality = 4; - this.useExcaliburWiring = true; - this.useMapBackgroundColor = false; - this.useTilemapCameraStrategy = false; - this.headless = false; - this.strict = true; - const { useExcaliburWiring, useTilemapCameraStrategy, entityIdentifierFactories, pathMap, useMapBackgroundColor, fileLoader, strict, headless, startZIndex } = { ...options }; - this.strict = strict !== null && strict !== void 0 ? strict : this.strict; - this.headless = headless !== null && headless !== void 0 ? headless : this.headless; - this.useExcaliburWiring = useExcaliburWiring !== null && useExcaliburWiring !== void 0 ? useExcaliburWiring : this.useExcaliburWiring; - this.useTilemapCameraStrategy = useTilemapCameraStrategy !== null && useTilemapCameraStrategy !== void 0 ? useTilemapCameraStrategy : this.useTilemapCameraStrategy; - this.useMapBackgroundColor = useMapBackgroundColor !== null && useMapBackgroundColor !== void 0 ? useMapBackgroundColor : this.useMapBackgroundColor; - this.startZIndex = startZIndex !== null && startZIndex !== void 0 ? startZIndex : this.startZIndex; - this.fileLoader = fileLoader !== null && fileLoader !== void 0 ? fileLoader : this.fileLoader; - this.pathMap = pathMap; - for (const key in entityIdentifierFactories) { - this.registerEntityIdentifierFactory(key, entityIdentifierFactories[key]); + static assert(value) { + if (!(value instanceof ZodError)) { + throw new Error(`Not a ZodError: ${value}`); } } - async load() { - var _a; - const data = await this.fileLoader(this.path, 'json'); - if (this.strict) { - try { - this.projectMetadata = _types__WEBPACK_IMPORTED_MODULE_3__.LdtkProjectMetadata.parse(data); - } - catch (e) { - console.error(`Could not parse LDtk map from location ${this.path}.\nExcalibur only supports the latest version of LDtk formats as of the plugin's release.`); - console.error(`Is your map file corrupted or being interpreted as the wrong type?`); - throw e; - } - } - else { - this.projectMetadata = data; - } - if ((0,compare_versions__WEBPACK_IMPORTED_MODULE_11__.compare)(LdtkResource.supportedLdtkVersion, (_a = this.projectMetadata.jsonVersion) !== null && _a !== void 0 ? _a : '0.0.0', ">")) { - console.warn(`The excalibur ldtk plugin officially supports ${LdtkResource.supportedLdtkVersion}+, the current map has LDtk version ${this.projectMetadata.jsonVersion}`); - } - // iterate through the defs - // load the tilesets - const imagesToLoad = []; - for (let tileset of this.projectMetadata.defs.tilesets) { - if (tileset.relPath) { - const imagePath = (0,_path_util__WEBPACK_IMPORTED_MODULE_1__.pathRelativeToBase)(this.path, tileset.relPath, this.pathMap); - const image = this._imageLoader.getOrAdd(imagePath); - const friendlyTileset = new _tileset__WEBPACK_IMPORTED_MODULE_6__.Tileset({ - image, - ldtkTileset: tileset - }); - this.tilesets.set(tileset.uid, friendlyTileset); + toString() { + return this.message; + } + get message() { + return JSON.stringify(this.issues, util.jsonStringifyReplacer, 2); + } + get isEmpty() { + return this.issues.length === 0; + } + flatten(mapper = (issue) => issue.message) { + const fieldErrors = {}; + const formErrors = []; + for (const sub of this.issues) { + if (sub.path.length > 0) { + fieldErrors[sub.path[0]] = fieldErrors[sub.path[0]] || []; + fieldErrors[sub.path[0]].push(mapper(sub)); } else { - if (tileset.identifier !== 'Internal_Icons') { - console.warn(`No tileset image provided for ${tileset.identifier}`); - } + formErrors.push(mapper(sub)); } } - // iterate through the levels - // load the level metadata - for (let level of this.projectMetadata.levels) { - if (level.externalRelPath) { - // external levels - const levelPath = (0,_path_util__WEBPACK_IMPORTED_MODULE_1__.pathRelativeToBase)(this.path, level.externalRelPath, this.pathMap); - this._levelLoader.getOrAdd(levelPath, this, { - headless: this.headless, - strict: this.strict, - fileLoader: this.fileLoader, - imageLoader: this._imageLoader, - pathMap: this.pathMap - }); + return { formErrors, fieldErrors }; + } + get formErrors() { + return this.flatten(); + } +} +ZodError.create = (issues) => { + const error = new ZodError(issues); + return error; +}; + +const errorMap = (issue, _ctx) => { + let message; + switch (issue.code) { + case ZodIssueCode.invalid_type: + if (issue.received === ZodParsedType.undefined) { + message = "Required"; } else { - // embedded levels - const friendlyLevel = new _level__WEBPACK_IMPORTED_MODULE_7__.Level(level, this); - this.levels.set(level.uid, friendlyLevel); - this.levelsByName.set(level.identifier.toLowerCase(), friendlyLevel); + message = `Expected ${issue.expected}, received ${issue.received}`; } - } - await Promise.all([this._imageLoader.load(), this._levelLoader.load()]); - this._levelLoader.values().forEach(level => { - this.levels.set(level.data.ldtkLevel.uid, level.data); - this.levelsByName.set(level.data.ldtkLevel.identifier.toLowerCase(), level.data); - }); - return this.data = this.projectMetadata; - } - ; - isLoaded() { - return !!this.data; - } - registerEntityIdentifierFactory(ldtkEntityIdentifier, factory) { - this.factories.set(ldtkEntityIdentifier, factory); - } - registerEntityIdentifierFactories(factories) { - for (const key in factories) { - this.registerEntityIdentifierFactory(key, factories[key]); - } - } - /** - * Get a level by identifier - * @param identifier - * @returns - */ - getLevel(identifier) { - return this.levelsByName.get(identifier.toLowerCase()); - } - /** - * Get the entity layers, optionally provide a level identifier to filter to - * @param levelIdentifier - */ - getEntityLayers(levelIdentifier) { - let results = []; - if (levelIdentifier) { - const level = this.getLevel(levelIdentifier); - if (level) { - for (let layer of level.layers) { - if (layer instanceof _entity_layer__WEBPACK_IMPORTED_MODULE_8__.EntityLayer) { - results.push(layer); + break; + case ZodIssueCode.invalid_literal: + message = `Invalid literal value, expected ${JSON.stringify(issue.expected, util.jsonStringifyReplacer)}`; + break; + case ZodIssueCode.unrecognized_keys: + message = `Unrecognized key(s) in object: ${util.joinValues(issue.keys, ", ")}`; + break; + case ZodIssueCode.invalid_union: + message = `Invalid input`; + break; + case ZodIssueCode.invalid_union_discriminator: + message = `Invalid discriminator value. Expected ${util.joinValues(issue.options)}`; + break; + case ZodIssueCode.invalid_enum_value: + message = `Invalid enum value. Expected ${util.joinValues(issue.options)}, received '${issue.received}'`; + break; + case ZodIssueCode.invalid_arguments: + message = `Invalid function arguments`; + break; + case ZodIssueCode.invalid_return_type: + message = `Invalid function return type`; + break; + case ZodIssueCode.invalid_date: + message = `Invalid date`; + break; + case ZodIssueCode.invalid_string: + if (typeof issue.validation === "object") { + if ("includes" in issue.validation) { + message = `Invalid input: must include "${issue.validation.includes}"`; + if (typeof issue.validation.position === "number") { + message = `${message} at one or more positions greater than or equal to ${issue.validation.position}`; } } - } - } - else { - for (const level of this.levels.values()) { - for (let layer of level.layers) { - if (layer instanceof _entity_layer__WEBPACK_IMPORTED_MODULE_8__.EntityLayer) { - results.push(layer); - } + else if ("startsWith" in issue.validation) { + message = `Invalid input: must start with "${issue.validation.startsWith}"`; } - } - } - return results; - } - getTileLayers(identifier) { - let results = []; - if (identifier) { - const level = this.getLevel(identifier); - if (level) { - for (let layer of level.layers) { - if (layer instanceof _tile_layer__WEBPACK_IMPORTED_MODULE_0__.TileLayer) { - results.push(layer); - } + else if ("endsWith" in issue.validation) { + message = `Invalid input: must end with "${issue.validation.endsWith}"`; } - } - } - else { - for (const level of this.levels.values()) { - for (let layer of level.layers) { - if (layer instanceof _tile_layer__WEBPACK_IMPORTED_MODULE_0__.TileLayer) { - results.push(layer); - } + else { + util.assertNever(issue.validation); } } - } - return results; - } - getIntGridLayers(identifier) { - let results = []; - if (identifier) { - const level = this.getLevel(identifier); - if (level) { - for (let layer of level.layers) { - if (layer instanceof _intgrid_layer__WEBPACK_IMPORTED_MODULE_9__.IntGridLayer) { - results.push(layer); - } - } + else if (issue.validation !== "regex") { + message = `Invalid ${issue.validation}`; } - } - else { - for (const level of this.levels.values()) { - for (let layer of level.layers) { - if (layer instanceof _intgrid_layer__WEBPACK_IMPORTED_MODULE_9__.IntGridLayer) { - results.push(layer); - } - } + else { + message = "Invalid"; } - } - return results; + break; + case ZodIssueCode.too_small: + if (issue.type === "array") + message = `Array must contain ${issue.exact ? "exactly" : issue.inclusive ? `at least` : `more than`} ${issue.minimum} element(s)`; + else if (issue.type === "string") + message = `String must contain ${issue.exact ? "exactly" : issue.inclusive ? `at least` : `over`} ${issue.minimum} character(s)`; + else if (issue.type === "number") + message = `Number must be ${issue.exact + ? `exactly equal to ` + : issue.inclusive + ? `greater than or equal to ` + : `greater than `}${issue.minimum}`; + else if (issue.type === "date") + message = `Date must be ${issue.exact + ? `exactly equal to ` + : issue.inclusive + ? `greater than or equal to ` + : `greater than `}${new Date(Number(issue.minimum))}`; + else + message = "Invalid input"; + break; + case ZodIssueCode.too_big: + if (issue.type === "array") + message = `Array must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `less than`} ${issue.maximum} element(s)`; + else if (issue.type === "string") + message = `String must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `under`} ${issue.maximum} character(s)`; + else if (issue.type === "number") + message = `Number must be ${issue.exact + ? `exactly` + : issue.inclusive + ? `less than or equal to` + : `less than`} ${issue.maximum}`; + else if (issue.type === "bigint") + message = `BigInt must be ${issue.exact + ? `exactly` + : issue.inclusive + ? `less than or equal to` + : `less than`} ${issue.maximum}`; + else if (issue.type === "date") + message = `Date must be ${issue.exact + ? `exactly` + : issue.inclusive + ? `smaller than or equal to` + : `smaller than`} ${new Date(Number(issue.maximum))}`; + else + message = "Invalid input"; + break; + case ZodIssueCode.custom: + message = `Invalid input`; + break; + case ZodIssueCode.invalid_intersection_types: + message = `Intersection results could not be merged`; + break; + case ZodIssueCode.not_multiple_of: + message = `Number must be a multiple of ${issue.multipleOf}`; + break; + case ZodIssueCode.not_finite: + message = "Number must be finite"; + break; + default: + message = _ctx.defaultError; + util.assertNever(issue); } - /** - * Search layer for entities that match an identifier (case insensitive) - * @param identifier - * @returns - */ - getLdtkEntitiesByIdentifier(identifier, levels) { - let results = []; - const levelsToSearch = levels !== null && levels !== void 0 ? levels : Array.from(this.levels.values()).map(l => l.ldtkLevel.identifier); - for (const level of levelsToSearch) { - const layers = this.getEntityLayers(level); - for (let layer of layers) { - results = results.concat(layer.getLdtkEntitiesByIdentifier(identifier)); - } - } - return results; + return { message }; +}; + +let overrideErrorMap = errorMap; +function setErrorMap(map) { + overrideErrorMap = map; +} +function getErrorMap() { + return overrideErrorMap; +} + +const makeIssue = (params) => { + const { data, path, errorMaps, issueData } = params; + const fullPath = [...path, ...(issueData.path || [])]; + const fullIssue = { + ...issueData, + path: fullPath, + }; + if (issueData.message !== undefined) { + return { + ...issueData, + path: fullPath, + message: issueData.message, + }; } - /** - * Search levels for ldtk entities that match a field and optionally a value (both case insensitive) - * @param fieldIdentifier - * @param value - */ - getLdtkEntitiesByField(fieldIdentifier, value, levels) { - let results = []; - const levelsToSearch = levels !== null && levels !== void 0 ? levels : Array.from(this.levels.values()).map(l => l.ldtkLevel.identifier); - for (const level of levelsToSearch) { - const layers = this.getEntityLayers(level); - for (let layer of layers) { - results = results.concat(layer.getLdtkEntitiesByField(fieldIdentifier, value)); - } - } - return results; + let errorMessage = ""; + const maps = errorMaps + .filter((m) => !!m) + .slice() + .reverse(); + for (const map of maps) { + errorMessage = map(fullIssue, { data, defaultError: errorMessage }).message; } - /** - * Search levels for excalibur entities that match an identifier (case insensitive) - * @param identifier - * @param levels - */ - getEntitiesByIdentifier(identifier, levels) { - let results = []; - const levelsToSearch = levels !== null && levels !== void 0 ? levels : Array.from(this.levels.values()).map(l => l.ldtkLevel.identifier); - for (const level of levelsToSearch) { - const layers = this.getEntityLayers(level); - for (let layer of layers) { - results = results.concat(layer.getEntitiesByIdentifier(identifier)); - } - } - return results; + return { + ...issueData, + path: fullPath, + message: errorMessage, + }; +}; +const EMPTY_PATH = []; +function addIssueToContext(ctx, issueData) { + const overrideMap = getErrorMap(); + const issue = makeIssue({ + issueData: issueData, + data: ctx.data, + path: ctx.path, + errorMaps: [ + ctx.common.contextualErrorMap, // contextual error map is first priority + ctx.schemaErrorMap, // then schema-bound map if available + overrideMap, // then global override map + overrideMap === errorMap ? undefined : errorMap, // then global default map + ].filter((x) => !!x), + }); + ctx.common.issues.push(issue); +} +class ParseStatus { + constructor() { + this.value = "valid"; } - /** - * Search levels for excalibur entities that match a field and optionally a value (both case insensitive) - * @param fieldIdentifier - * @param value - * @param levels - */ - getEntitiesByField(fieldIdentifier, value, levels) { - let results = []; - const levelsToSearch = levels !== null && levels !== void 0 ? levels : Array.from(this.levels.values()).map(l => l.ldtkLevel.identifier); - for (const level of levelsToSearch) { - const layers = this.getEntityLayers(level); - for (let layer of layers) { - results = results.concat(layer.getEntitiesByField(fieldIdentifier, value)); - } - } - return results; + dirty() { + if (this.value === "valid") + this.value = "dirty"; } - /** - * Get the level bounds given a list of level identifiers (case insensitive) - * @param levels - */ - getLevelBounds(levels) { - levels = levels !== null && levels !== void 0 ? levels : Array.from(this.levelsByName.keys()); - let bounds = null; - for (const level of this.levels.values()) { - if (!levels.includes(level.ldtkLevel.identifier)) { - continue; - } - const firstTileLayer = this.getTileLayers(level.ldtkLevel.identifier)[0]; - if (firstTileLayer) { - const tileBounds = excalibur__WEBPACK_IMPORTED_MODULE_10__.BoundingBox.fromDimension(firstTileLayer.tilemap.tileWidth * firstTileLayer.tilemap.columns, firstTileLayer.tilemap.tileHeight * firstTileLayer.tilemap.rows, excalibur__WEBPACK_IMPORTED_MODULE_10__.Vector.Zero, firstTileLayer.tilemap.pos); - if (!bounds) { - bounds = tileBounds; - } - else { - bounds = bounds.combine(tileBounds); - } - } - } - return bounds !== null && bounds !== void 0 ? bounds : new excalibur__WEBPACK_IMPORTED_MODULE_10__.BoundingBox(); + abort() { + if (this.value !== "aborted") + this.value = "aborted"; } - addToScene(scene, options) { - var _a, _b; - const { pos, useLevelOffsets } = { pos: (0,excalibur__WEBPACK_IMPORTED_MODULE_10__.vec)(0, 0), useLevelOffsets: true, ...options }; - for (let [id, level] of this.levels.entries()) { - if ((_a = options === null || options === void 0 ? void 0 : options.levelFilter) === null || _a === void 0 ? void 0 : _a.length) { - if (!options.levelFilter.includes(level.ldtkLevel.identifier)) { - continue; - } - } - for (let layer of level.layers) { - if (layer instanceof _tile_layer__WEBPACK_IMPORTED_MODULE_0__.TileLayer || layer instanceof _intgrid_layer__WEBPACK_IMPORTED_MODULE_9__.IntGridLayer) { - layer.tilemap.pos = layer.tilemap.pos.add(pos); - if (!useLevelOffsets) { - layer.tilemap.pos = layer.tilemap.pos.sub(layer.worldPos); - } - scene.add(layer.tilemap); - } - else { - layer.runFactories(); - for (let entity of layer.entities) { - const tx = entity.get(excalibur__WEBPACK_IMPORTED_MODULE_10__.TransformComponent); - if (tx) { - tx.pos = tx.pos.add(pos); - if (!useLevelOffsets) { - tx.pos = tx.pos.sub(layer.worldPos); - } - } - scene.add(entity); - } - } - } - } - if (this.useExcaliburWiring) { - const camera = this.getLdtkEntitiesByField('camera', true)[0]; - if (camera) { - scene.camera.pos = (0,excalibur__WEBPACK_IMPORTED_MODULE_10__.vec)(camera.px[0], camera.px[0]); - const zoom = camera.fieldInstances.find(f => f.__identifier.toLocaleLowerCase() === 'zoom'); - if (zoom) { - scene.camera.zoom = +zoom.__value; - } - } + static mergeArray(status, results) { + const arrayValue = []; + for (const s of results) { + if (s.status === "aborted") + return INVALID; + if (s.status === "dirty") + status.dirty(); + arrayValue.push(s.value); } - if (this.useTilemapCameraStrategy) { - let bounds = this.getLevelBounds(options === null || options === void 0 ? void 0 : options.levelFilter); - scene.camera.strategy.limitCameraBounds(bounds); + return { status: status.value, value: arrayValue }; + } + static async mergeObjectAsync(status, pairs) { + const syncPairs = []; + for (const pair of pairs) { + const key = await pair.key; + const value = await pair.value; + syncPairs.push({ + key, + value, + }); } - if (this.useMapBackgroundColor) { - for (let [id, level] of this.levels.entries()) { - if ((_b = options === null || options === void 0 ? void 0 : options.levelFilter) === null || _b === void 0 ? void 0 : _b.length) { - if (!options.levelFilter.includes(level.ldtkLevel.identifier)) { - continue; - } - } - scene.backgroundColor = level.backgroundColor; - break; + return ParseStatus.mergeObjectSync(status, syncPairs); + } + static mergeObjectSync(status, pairs) { + const finalObject = {}; + for (const pair of pairs) { + const { key, value } = pair; + if (key.status === "aborted") + return INVALID; + if (value.status === "aborted") + return INVALID; + if (key.status === "dirty") + status.dirty(); + if (value.status === "dirty") + status.dirty(); + if (key.value !== "__proto__" && + (typeof value.value !== "undefined" || pair.alwaysSet)) { + finalObject[key.value] = value.value; } } + return { status: status.value, value: finalObject }; } } -LdtkResource.supportedLdtkVersion = "1.5.3"; - - -/***/ }), - -/***/ "./src/level-resource.ts": -/*!*******************************!*\ - !*** ./src/level-resource.ts ***! - \*******************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ LevelResource: () => (/* binding */ LevelResource) -/* harmony export */ }); -/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); -/* harmony import */ var _loader_cache__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./loader-cache */ "./src/loader-cache.ts"); -/* harmony import */ var _file_loader__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./file-loader */ "./src/file-loader.ts"); -/* harmony import */ var _level__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./level */ "./src/level.ts"); -/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./types */ "./src/types.ts"); - - +const INVALID = Object.freeze({ + status: "aborted", +}); +const DIRTY = (value) => ({ status: "dirty", value }); +const OK = (value) => ({ status: "valid", value }); +const isAborted = (x) => x.status === "aborted"; +const isDirty = (x) => x.status === "dirty"; +const isValid = (x) => x.status === "valid"; +const isAsync = (x) => typeof Promise !== "undefined" && x instanceof Promise; +/****************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ + +function __classPrivateFieldGet(receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); +} + +function __classPrivateFieldSet(receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; +} + +typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) { + var e = new Error(message); + return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e; +}; +var errorUtil; +(function (errorUtil) { + errorUtil.errToObj = (message) => typeof message === "string" ? { message } : message || {}; + errorUtil.toString = (message) => typeof message === "string" ? message : message === null || message === void 0 ? void 0 : message.message; +})(errorUtil || (errorUtil = {})); -/** - * Loads LDtk levels that are stored in separate files - */ -class LevelResource { - constructor(path, resource, options) { - this.path = path; - this.resource = resource; - this.fileLoader = _file_loader__WEBPACK_IMPORTED_MODULE_1__.FetchLoader; - this.strict = true; - this.headless = false; - const { headless, strict, fileLoader, imageLoader, pathMap } = { ...options }; - this.fileLoader = fileLoader !== null && fileLoader !== void 0 ? fileLoader : this.fileLoader; - this.strict = strict !== null && strict !== void 0 ? strict : this.strict; - this.headless = headless !== null && headless !== void 0 ? headless : this.headless; - this.imageLoader = imageLoader !== null && imageLoader !== void 0 ? imageLoader : new _loader_cache__WEBPACK_IMPORTED_MODULE_0__.LoaderCache(excalibur__WEBPACK_IMPORTED_MODULE_4__.ImageSource); - this.pathMap = pathMap !== null && pathMap !== void 0 ? pathMap : this.pathMap; +var _ZodEnum_cache, _ZodNativeEnum_cache; +class ParseInputLazyPath { + constructor(parent, value, path, key) { + this._cachedPath = []; + this.parent = parent; + this.data = value; + this._path = path; + this._key = key; } - async load() { - const data = await this.fileLoader(this.path, 'json'); - let level; - if (this.strict) { - try { - level = _types__WEBPACK_IMPORTED_MODULE_3__.LdtkLevel.parse(data); - } - catch (e) { - console.error(`Could not parse LDtk level data at ${this.path} are you sure a level is there and not corrupt?`); - throw e; + get path() { + if (!this._cachedPath.length) { + if (this._key instanceof Array) { + this._cachedPath.push(...this._path, ...this._key); } - } - else { - level = data; - } - return this.data = new _level__WEBPACK_IMPORTED_MODULE_2__.Level(level, this.resource); - } - isLoaded() { - return !!this.data; - } -} - - -/***/ }), - -/***/ "./src/level.ts": -/*!**********************!*\ - !*** ./src/level.ts ***! - \**********************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ Level: () => (/* binding */ Level) -/* harmony export */ }); -/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); -/* harmony import */ var _entity_layer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./entity-layer */ "./src/entity-layer.ts"); -/* harmony import */ var _intgrid_layer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./intgrid-layer */ "./src/intgrid-layer.ts"); -/* harmony import */ var _tile_layer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tile-layer */ "./src/tile-layer.ts"); - - - - -class Level { - constructor(ldtkLevel, resource) { - var _a, _b, _c, _d; - this.ldtkLevel = ldtkLevel; - this.resource = resource; - this.layers = []; - if (ldtkLevel.__bgColor) { - this.backgroundColor = excalibur__WEBPACK_IMPORTED_MODULE_3__.Color.fromHex(ldtkLevel.__bgColor); - } - if (ldtkLevel.layerInstances) { - let order = resource.startZIndex; - let layers = ldtkLevel.layerInstances.slice().reverse(); - for (let layer of layers) { - if (((_a = layer.entityInstances) === null || _a === void 0 ? void 0 : _a.length) !== 0) { - this.layers.push(new _entity_layer__WEBPACK_IMPORTED_MODULE_0__.EntityLayer(this, layer, resource, order)); - } - if (((_b = layer.gridTiles) === null || _b === void 0 ? void 0 : _b.length) !== 0) { - this.layers.push(new _tile_layer__WEBPACK_IMPORTED_MODULE_2__.TileLayer(this, layer, resource, order)); - } - // Includes standard IntGrid, IntGrid w/ AutoTile & AutoTile layers - if (((_c = layer.intGridCsv) === null || _c === void 0 ? void 0 : _c.length) !== 0 || ((_d = layer.autoLayerTiles) === null || _d === void 0 ? void 0 : _d.length) !== 0) { - this.layers.push(new _intgrid_layer__WEBPACK_IMPORTED_MODULE_1__.IntGridLayer(this, layer, resource, order)); - } - order++; + else { + this._cachedPath.push(...this._path, this._key); } } + return this._cachedPath; } } - - -/***/ }), - -/***/ "./src/loader-cache.ts": -/*!*****************************!*\ - !*** ./src/loader-cache.ts ***! - \*****************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ LoaderCache: () => (/* binding */ LoaderCache) -/* harmony export */ }); -/** - * Read through cache for loadables - */ -class LoaderCache { - constructor(type) { - this.type = type; - this._loaded = false; - this.cache = new Map(); +const handleResult = (ctx, result) => { + if (isValid(result)) { + return { success: true, data: result.value }; } - getOrAdd(...args) { - let resource = this.cache.get(args.join('+')); - if (resource) { - return resource; + else { + if (!ctx.common.issues.length) { + throw new Error("Validation failed but no issues detected."); } - resource = new this.type(...args); - this.cache.set(args.join('+'), resource); - return resource; + return { + success: false, + get error() { + if (this._error) + return this._error; + const error = new ZodError(ctx.common.issues); + this._error = error; + return this._error; + }, + }; } - values() { - if (this._loaded) { - return Array.from(this.cache.values()); - } - throw new Error(`Read through cache not yet loaded! No values to return!`); +}; +function processCreateParams(params) { + if (!params) + return {}; + const { errorMap, invalid_type_error, required_error, description } = params; + if (errorMap && (invalid_type_error || required_error)) { + throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`); } - async load() { - const resources = Array.from(this.cache.entries()); - const results = await Promise.allSettled(resources.map(i => i[1].load())); - // Check for errors loading resources - let errored = 0; - for (let i = 0; i < results.length; i++) { - const result = results[i]; - if (result.status === 'rejected') { - console.error(`Error loading resource at ${resources[i][0]}, is your pathMap correct? or your LDtk map corrupted?`, result.reason); - errored++; - } + if (errorMap) + return { errorMap: errorMap, description }; + const customMap = (iss, ctx) => { + var _a, _b; + const { message } = params; + if (iss.code === "invalid_enum_value") { + return { message: message !== null && message !== void 0 ? message : ctx.defaultError }; } - if (errored) { - throw new Error(`Error loading ${errored} resources`); + if (typeof ctx.data === "undefined") { + return { message: (_a = message !== null && message !== void 0 ? message : required_error) !== null && _a !== void 0 ? _a : ctx.defaultError }; } - this._loaded = true; - } + if (iss.code !== "invalid_type") + return { message: ctx.defaultError }; + return { message: (_b = message !== null && message !== void 0 ? message : invalid_type_error) !== null && _b !== void 0 ? _b : ctx.defaultError }; + }; + return { errorMap: customMap, description }; } - - -/***/ }), - -/***/ "./src/path-util.ts": -/*!**************************!*\ - !*** ./src/path-util.ts ***! - \**************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ filenameFromPath: () => (/* binding */ filenameFromPath), -/* harmony export */ mapPath: () => (/* binding */ mapPath), -/* harmony export */ pathInMap: () => (/* binding */ pathInMap), -/* harmony export */ pathRelativeToBase: () => (/* binding */ pathRelativeToBase) -/* harmony export */ }); -function filenameFromPath(inputPath) { - const filenameExpression = /[^/\\&\?]+\.\w{2,4}(?=([\#\?&].*$|$))/ig; - const matches = inputPath.match(filenameExpression); - if (matches) { - const match = matches[0]; - return match; +class ZodType { + get description() { + return this._def.description; } - throw new Error(`Could not locate filename from path: ${inputPath}`); -} -function mapPath(inputPath, pathMap) { - for (const { path, output } of pathMap) { - if (typeof path === 'string') { - if (inputPath.includes(path)) { - return output; - } - } - else { - const match = inputPath.match(path); - if (match) { - return output.replace('[match]', match[0]); - ; - } + _getType(input) { + return getParsedType(input.data); + } + _getOrReturnCtx(input, ctx) { + return (ctx || { + common: input.parent.common, + data: input.data, + parsedType: getParsedType(input.data), + schemaErrorMap: this._def.errorMap, + path: input.path, + parent: input.parent, + }); + } + _processInputParams(input) { + return { + status: new ParseStatus(), + ctx: { + common: input.parent.common, + data: input.data, + parsedType: getParsedType(input.data), + schemaErrorMap: this._def.errorMap, + path: input.path, + parent: input.parent, + }, + }; + } + _parseSync(input) { + const result = this._parse(input); + if (isAsync(result)) { + throw new Error("Synchronous parse encountered promise."); } + return result; } - return inputPath; -} -function pathInMap(inputPath, pathMap) { - if (!pathMap) - return false; - for (const { path, output } of pathMap) { - if (typeof path === 'string') { - if (inputPath.includes(path)) { - return true; + _parseAsync(input) { + const result = this._parse(input); + return Promise.resolve(result); + } + parse(data, params) { + const result = this.safeParse(data, params); + if (result.success) + return result.data; + throw result.error; + } + safeParse(data, params) { + var _a; + const ctx = { + common: { + issues: [], + async: (_a = params === null || params === void 0 ? void 0 : params.async) !== null && _a !== void 0 ? _a : false, + contextualErrorMap: params === null || params === void 0 ? void 0 : params.errorMap, + }, + path: (params === null || params === void 0 ? void 0 : params.path) || [], + schemaErrorMap: this._def.errorMap, + parent: null, + data, + parsedType: getParsedType(data), + }; + const result = this._parseSync({ data, path: ctx.path, parent: ctx }); + return handleResult(ctx, result); + } + "~validate"(data) { + var _a, _b; + const ctx = { + common: { + issues: [], + async: !!this["~standard"].async, + }, + path: [], + schemaErrorMap: this._def.errorMap, + parent: null, + data, + parsedType: getParsedType(data), + }; + if (!this["~standard"].async) { + try { + const result = this._parseSync({ data, path: [], parent: ctx }); + return isValid(result) + ? { + value: result.value, + } + : { + issues: ctx.common.issues, + }; } - } - else { - const match = inputPath.match(path); - if (match) { - return true; + catch (err) { + if ((_b = (_a = err === null || err === void 0 ? void 0 : err.message) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === null || _b === void 0 ? void 0 : _b.includes("encountered")) { + this["~standard"].async = true; + } + ctx.common = { + issues: [], + async: true, + }; } } + return this._parseAsync({ data, path: [], parent: ctx }).then((result) => isValid(result) + ? { + value: result.value, + } + : { + issues: ctx.common.issues, + }); } - return false; -} -function pathRelativeToBase(basePath, relativeToBase, pathMap) { - if (pathInMap(relativeToBase, pathMap) && pathMap) { - return mapPath(relativeToBase, pathMap); - } - // Use absolute path if specified - if (relativeToBase.indexOf('/') === 0) { - return relativeToBase; + async parseAsync(data, params) { + const result = await this.safeParseAsync(data, params); + if (result.success) + return result.data; + throw result.error; } - const originSplit = basePath.split('/'); - const relativeSplit = relativeToBase.split('/'); - // if origin path is a file, remove it so it's a directory - if (originSplit[originSplit.length - 1].includes('.')) { - originSplit.pop(); + async safeParseAsync(data, params) { + const ctx = { + common: { + issues: [], + contextualErrorMap: params === null || params === void 0 ? void 0 : params.errorMap, + async: true, + }, + path: (params === null || params === void 0 ? void 0 : params.path) || [], + schemaErrorMap: this._def.errorMap, + parent: null, + data, + parsedType: getParsedType(data), + }; + const maybeAsyncResult = this._parse({ data, path: ctx.path, parent: ctx }); + const result = await (isAsync(maybeAsyncResult) + ? maybeAsyncResult + : Promise.resolve(maybeAsyncResult)); + return handleResult(ctx, result); } - return originSplit.concat(relativeSplit).join('/'); -} - - -/***/ }), - -/***/ "./src/tile-layer.ts": -/*!***************************!*\ - !*** ./src/tile-layer.ts ***! - \***************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ TileLayer: () => (/* binding */ TileLayer) -/* harmony export */ }); -/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); - -class TileLayer { - constructor(level, ldtkLayer, resource, order) { - var _a, _b, _c, _d; - this.order = order; - this.worldPos = (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(level.ldtkLevel.worldX, level.ldtkLevel.worldY); - this.offset = (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(ldtkLayer.__pxTotalOffsetX, ldtkLayer.__pxTotalOffsetY); - this.ldtkLayer = ldtkLayer; - this.tilemap = new excalibur__WEBPACK_IMPORTED_MODULE_0__.TileMap({ - name: ldtkLayer.__identifier, - pos: this.worldPos.add(this.offset), - tileWidth: ldtkLayer.__gridSize, - tileHeight: ldtkLayer.__gridSize, - rows: ldtkLayer.__cHei, - columns: ldtkLayer.__cWid, - }); - this.tilemap.z = order; - const graphics = this.tilemap.get(excalibur__WEBPACK_IMPORTED_MODULE_0__.GraphicsComponent); - graphics.isVisible = ldtkLayer.visible; - if (ldtkLayer.__tilesetDefUid) { - this.tileset = resource.tilesets.get(ldtkLayer.__tilesetDefUid); - for (let tile of ldtkLayer.gridTiles) { - const xCoord = Math.floor(tile.px[0] / ldtkLayer.__gridSize); - const yCoord = Math.floor(tile.px[1] / ldtkLayer.__gridSize); - const exTile = this.tilemap.getTile(xCoord, yCoord); - if (this.tileset) { - const tsxCoord = Math.floor((tile.src[0] - ((_a = this.tileset.ldtkTileset.padding) !== null && _a !== void 0 ? _a : 0)) / (this.tileset.ldtkTileset.tileGridSize + ((_b = this.tileset.ldtkTileset.spacing) !== null && _b !== void 0 ? _b : 0))); - const tsyCoord = Math.floor((tile.src[1] - ((_c = this.tileset.ldtkTileset.padding) !== null && _c !== void 0 ? _c : 0)) / (this.tileset.ldtkTileset.tileGridSize + ((_d = this.tileset.ldtkTileset.spacing) !== null && _d !== void 0 ? _d : 0))); - // Bit 0 toggles x flip - // Bit 1 toggles 1 flip - // Examples: f=0 (no flip), f=1 (X flip only), f=2 (Y flip only), f=3 (both flips) - const flipHorizontal = !!(tile.f & 0b01); - const flipVertical = !!(tile.f & 0b10); - let sprite = this.tileset.spritesheet.getSprite(tsxCoord, tsyCoord); - if (flipHorizontal || flipVertical) { - sprite = sprite.clone(); - sprite.flipHorizontal = flipHorizontal; - sprite.flipVertical = flipVertical; - } - if (sprite) { - exTile.addGraphic(sprite); + refine(check, message) { + const getIssueProperties = (val) => { + if (typeof message === "string" || typeof message === "undefined") { + return { message }; + } + else if (typeof message === "function") { + return message(val); + } + else { + return message; + } + }; + return this._refinement((val, ctx) => { + const result = check(val); + const setError = () => ctx.addIssue({ + code: ZodIssueCode.custom, + ...getIssueProperties(val), + }); + if (typeof Promise !== "undefined" && result instanceof Promise) { + return result.then((data) => { + if (!data) { + setError(); + return false; } else { - console.error('Could not find sprite in LDtk spritesheet at', tsxCoord, tsyCoord); + return true; } - } + }); } - } - else { - console.error('Could not tileset in LDtk', ldtkLayer.__tilesetDefUid, ldtkLayer.__tilesetRelPath); - } + if (!result) { + setError(); + return false; + } + else { + return true; + } + }); } -} - - -/***/ }), - -/***/ "./src/tileset.ts": -/*!************************!*\ - !*** ./src/tileset.ts ***! - \************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ Tileset: () => (/* binding */ Tileset) -/* harmony export */ }); -/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); - -class Tileset { - constructor(options) { - var _a, _b, _c, _d; - const { image, ldtkTileset } = options; - this.image = image; - this.ldtkTileset = ldtkTileset; - this.spritesheet = excalibur__WEBPACK_IMPORTED_MODULE_0__.SpriteSheet.fromImageSource({ - image, - grid: { - rows: ldtkTileset.pxHei / ldtkTileset.tileGridSize, - columns: ldtkTileset.pxWid / ldtkTileset.tileGridSize, - spriteHeight: ldtkTileset.tileGridSize, - spriteWidth: ldtkTileset.tileGridSize - }, - spacing: { - margin: { - x: (_a = ldtkTileset.spacing) !== null && _a !== void 0 ? _a : 0, - y: (_b = ldtkTileset.spacing) !== null && _b !== void 0 ? _b : 0, - }, - originOffset: { - x: (_c = ldtkTileset.padding) !== null && _c !== void 0 ? _c : 0, - y: (_d = ldtkTileset.padding) !== null && _d !== void 0 ? _d : 0 - } + refinement(check, refinementData) { + return this._refinement((val, ctx) => { + if (!check(val)) { + ctx.addIssue(typeof refinementData === "function" + ? refinementData(val, ctx) + : refinementData); + return false; } + else { + return true; + } + }); + } + _refinement(refinement) { + return new ZodEffects({ + schema: this, + typeName: ZodFirstPartyTypeKind.ZodEffects, + effect: { type: "refinement", refinement }, + }); + } + superRefine(refinement) { + return this._refinement(refinement); + } + constructor(def) { + /** Alias of safeParseAsync */ + this.spa = this.safeParseAsync; + this._def = def; + this.parse = this.parse.bind(this); + this.safeParse = this.safeParse.bind(this); + this.parseAsync = this.parseAsync.bind(this); + this.safeParseAsync = this.safeParseAsync.bind(this); + this.spa = this.spa.bind(this); + this.refine = this.refine.bind(this); + this.refinement = this.refinement.bind(this); + this.superRefine = this.superRefine.bind(this); + this.optional = this.optional.bind(this); + this.nullable = this.nullable.bind(this); + this.nullish = this.nullish.bind(this); + this.array = this.array.bind(this); + this.promise = this.promise.bind(this); + this.or = this.or.bind(this); + this.and = this.and.bind(this); + this.transform = this.transform.bind(this); + this.brand = this.brand.bind(this); + this.default = this.default.bind(this); + this.catch = this.catch.bind(this); + this.describe = this.describe.bind(this); + this.pipe = this.pipe.bind(this); + this.readonly = this.readonly.bind(this); + this.isNullable = this.isNullable.bind(this); + this.isOptional = this.isOptional.bind(this); + this["~standard"] = { + version: 1, + vendor: "zod", + validate: (data) => this["~validate"](data), + }; + } + optional() { + return ZodOptional.create(this, this._def); + } + nullable() { + return ZodNullable.create(this, this._def); + } + nullish() { + return this.nullable().optional(); + } + array() { + return ZodArray.create(this); + } + promise() { + return ZodPromise.create(this, this._def); + } + or(option) { + return ZodUnion.create([this, option], this._def); + } + and(incoming) { + return ZodIntersection.create(this, incoming, this._def); + } + transform(transform) { + return new ZodEffects({ + ...processCreateParams(this._def), + schema: this, + typeName: ZodFirstPartyTypeKind.ZodEffects, + effect: { type: "transform", transform }, + }); + } + default(def) { + const defaultValueFunc = typeof def === "function" ? def : () => def; + return new ZodDefault({ + ...processCreateParams(this._def), + innerType: this, + defaultValue: defaultValueFunc, + typeName: ZodFirstPartyTypeKind.ZodDefault, + }); + } + brand() { + return new ZodBranded({ + typeName: ZodFirstPartyTypeKind.ZodBranded, + type: this, + ...processCreateParams(this._def), }); } -} - - -/***/ }), - -/***/ "./src/types.ts": -/*!**********************!*\ - !*** ./src/types.ts ***! - \**********************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ LdtkEntityDefinition: () => (/* binding */ LdtkEntityDefinition), -/* harmony export */ LdtkEntityInstance: () => (/* binding */ LdtkEntityInstance), -/* harmony export */ LdtkLayerDefinition: () => (/* binding */ LdtkLayerDefinition), -/* harmony export */ LdtkLayerInstance: () => (/* binding */ LdtkLayerInstance), -/* harmony export */ LdtkLevel: () => (/* binding */ LdtkLevel), -/* harmony export */ LdtkProjectMetadata: () => (/* binding */ LdtkProjectMetadata) -/* harmony export */ }); -/* harmony import */ var zod__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! zod */ "./node_modules/zod/lib/index.mjs"); - -const LdtkTilesetRectangle = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - h: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - tilesetUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - w: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - x: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - y: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() -}); -const LdtkPixel = zod__WEBPACK_IMPORTED_MODULE_0__.z.tuple([zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), zod__WEBPACK_IMPORTED_MODULE_0__.z.number()]); -const LdtkFieldInstance = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - __identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - __tile: LdtkTilesetRectangle.nullable(), - __type: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), //z.union([z.literal('Int'), z.literal('Float'), z.literal('String'), z.literal('Bool'), z.literal('Enum')]), // TODO this might not work with ENUM - __value: zod__WEBPACK_IMPORTED_MODULE_0__.z.any(), - defUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() -}); -const LdtkTileInstance = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - a: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - f: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), // 2-bit int 0bXY flip - px: LdtkPixel, - src: LdtkPixel, - t: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() -}); -const LdtkEntityInstance = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - __grid: LdtkPixel, - __identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - __pivot: LdtkPixel, - __smartColor: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - __tags: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.string()), - __tile: LdtkTilesetRectangle.nullable(), - __worldX: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), - __worldY: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), - defUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - fieldInstances: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkFieldInstance), - height: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - iid: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - px: LdtkPixel, - width: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() -}); -const LdtkLayerInstance = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - __cHei: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - __cWid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - __gridSize: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - __identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - __opacity: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - __pxTotalOffsetX: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - __pxTotalOffsetY: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - __tilesetDefUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), - __tilesetRelPath: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), - __type: zod__WEBPACK_IMPORTED_MODULE_0__.z.union([zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('IntGrid'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('Entities'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('Tiles'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('AutoLayer')]), - autoLayerTiles: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkTileInstance), // only in auto layers - entityInstances: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkEntityInstance), // only in entity layers - gridTiles: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkTileInstance), - iid: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - intGridCsv: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.number()), // __cWid x __cHei, 0 means empty, values start at 1 - layerDefUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - levelId: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - overrideTilesetUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), - pxOffsetX: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - pxOffsetY: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - visible: zod__WEBPACK_IMPORTED_MODULE_0__.z.boolean() -}); -const LdtkLevel = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - __bgColor: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), - bgColor: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), - __bgPos: zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - cropRect: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.tuple([zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), zod__WEBPACK_IMPORTED_MODULE_0__.z.number()])), // cropX, cropY, cropWidth, cropHeight - scale: zod__WEBPACK_IMPORTED_MODULE_0__.z.tuple([zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), zod__WEBPACK_IMPORTED_MODULE_0__.z.number()]), - topLeftPx: LdtkPixel - }).nullable(), - __neighbours: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - dir: zod__WEBPACK_IMPORTED_MODULE_0__.z.union([zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('n'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('s'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('w'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('e'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('ne'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('nw'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('se'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('sw'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('o'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('<'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('>')]), - levelIid: zod__WEBPACK_IMPORTED_MODULE_0__.z.string() - })), - bgRelPath: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), - externalRelPath: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), - fieldInstances: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkFieldInstance), - identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - iid: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - layerInstances: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkLayerInstance).nullable(), // null if the save levels separately is enabled - pxHei: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - pxWid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - uid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - worldDepth: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - worldX: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - worldY: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() -}); -const LdtkWorld = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - iid: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - levels: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkLevel), - worldGridHeight: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - worldGridWidth: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - // TODO is this a typo Vania? - worldLayout: zod__WEBPACK_IMPORTED_MODULE_0__.z.union([zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('Free'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('GridVania'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('LinearHorizontal'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('LinearVertical')]), -}); -const LdtkEnumValueDefinition = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - color: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - id: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - tileRect: LdtkTilesetRectangle.nullable() -}); -const LdtkEnumDefinition = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - externalRelPath: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), - iconTilesetUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), - identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - tags: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.string()), - uid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - values: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkEnumValueDefinition) -}); -const LdtkTilesetDefinition = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - __cHei: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - __cWid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - customData: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - data: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - tileId: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() - })), - embedAtlas: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), - enumTags: zod__WEBPACK_IMPORTED_MODULE_0__.z.optional(zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - enumValueId: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - tileIds: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.number()) - }))), - identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - padding: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - pxHei: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - pxWid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - relPath: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), - spacing: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - tags: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.string()), - tagsSourceEnumUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), - tileGridSize: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - uid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() -}); -const LdtkLayerDefinition = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - __type: zod__WEBPACK_IMPORTED_MODULE_0__.z.union([zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("IntGrid"), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("Entities"), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("Tiles"), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("AutoLayer")]), - autoSourceLayerDefUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), - displayOpacity: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - gridSize: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - intGridValues: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - color: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - groupUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), - tile: LdtkTilesetRectangle.nullable(), - value: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() - })), - intGridValuesGroups: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - color: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), - identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), - uid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() - })), - parallaxFactorX: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - parallaxFactorY: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - parallaxScaling: zod__WEBPACK_IMPORTED_MODULE_0__.z.boolean(), - pxOffsetX: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - pxOffsetY: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - tilesetDefUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), - uid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), -}); -const LdtkEntityDefinition = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - color: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - height: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - nineSliceBorders: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.number()), - pivotX: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - pivotY: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - tileRect: LdtkTilesetRectangle.nullable(), - tileRenderMode: zod__WEBPACK_IMPORTED_MODULE_0__.z.union([ - zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("Cover"), - zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("FitInside"), - zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("Repeat"), - zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("Stretch"), - zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("FullSizeCropped"), - zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("FullSizeUncropped"), - zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("NineSlice") - ]), - tilesetId: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), - uiTileRect: LdtkTilesetRectangle.nullable(), - uid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - width: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() -}); -const LdtkDefinitions = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - tilesets: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkTilesetDefinition), - enums: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkEnumDefinition), - layers: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkLayerDefinition), - entities: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkEntityDefinition) -}); -const LdtkProjectMetadata = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - iid: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - bgColor: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), - defs: LdtkDefinitions, - externalLevels: zod__WEBPACK_IMPORTED_MODULE_0__.z.boolean(), - jsonVersion: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - levels: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkLevel), - toc: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - instancesData: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ - fields: zod__WEBPACK_IMPORTED_MODULE_0__.z.any(), - heiPx: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - iids: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), - widPix: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - worldX: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), - worldY: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() - })) - })), - // Moving to worlds array - worldGridHeight: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), - worldGridWidth: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), - // TODO is this a LDtk docs typo Vania? - worldLayout: zod__WEBPACK_IMPORTED_MODULE_0__.z.union([zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('Free'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('GridVania'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('LinearHorizontal'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('LinearVertical')]).nullable(), - worlds: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkWorld) -}); - - -/***/ }), - -/***/ "./node_modules/zod/lib/index.mjs": -/*!****************************************!*\ - !*** ./node_modules/zod/lib/index.mjs ***! - \****************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ BRAND: () => (/* binding */ BRAND), -/* harmony export */ DIRTY: () => (/* binding */ DIRTY), -/* harmony export */ EMPTY_PATH: () => (/* binding */ EMPTY_PATH), -/* harmony export */ INVALID: () => (/* binding */ INVALID), -/* harmony export */ NEVER: () => (/* binding */ NEVER), -/* harmony export */ OK: () => (/* binding */ OK), -/* harmony export */ ParseStatus: () => (/* binding */ ParseStatus), -/* harmony export */ Schema: () => (/* binding */ ZodType), -/* harmony export */ ZodAny: () => (/* binding */ ZodAny), -/* harmony export */ ZodArray: () => (/* binding */ ZodArray), -/* harmony export */ ZodBigInt: () => (/* binding */ ZodBigInt), -/* harmony export */ ZodBoolean: () => (/* binding */ ZodBoolean), -/* harmony export */ ZodBranded: () => (/* binding */ ZodBranded), -/* harmony export */ ZodCatch: () => (/* binding */ ZodCatch), -/* harmony export */ ZodDate: () => (/* binding */ ZodDate), -/* harmony export */ ZodDefault: () => (/* binding */ ZodDefault), -/* harmony export */ ZodDiscriminatedUnion: () => (/* binding */ ZodDiscriminatedUnion), -/* harmony export */ ZodEffects: () => (/* binding */ ZodEffects), -/* harmony export */ ZodEnum: () => (/* binding */ ZodEnum), -/* harmony export */ ZodError: () => (/* binding */ ZodError), -/* harmony export */ ZodFirstPartyTypeKind: () => (/* binding */ ZodFirstPartyTypeKind), -/* harmony export */ ZodFunction: () => (/* binding */ ZodFunction), -/* harmony export */ ZodIntersection: () => (/* binding */ ZodIntersection), -/* harmony export */ ZodIssueCode: () => (/* binding */ ZodIssueCode), -/* harmony export */ ZodLazy: () => (/* binding */ ZodLazy), -/* harmony export */ ZodLiteral: () => (/* binding */ ZodLiteral), -/* harmony export */ ZodMap: () => (/* binding */ ZodMap), -/* harmony export */ ZodNaN: () => (/* binding */ ZodNaN), -/* harmony export */ ZodNativeEnum: () => (/* binding */ ZodNativeEnum), -/* harmony export */ ZodNever: () => (/* binding */ ZodNever), -/* harmony export */ ZodNull: () => (/* binding */ ZodNull), -/* harmony export */ ZodNullable: () => (/* binding */ ZodNullable), -/* harmony export */ ZodNumber: () => (/* binding */ ZodNumber), -/* harmony export */ ZodObject: () => (/* binding */ ZodObject), -/* harmony export */ ZodOptional: () => (/* binding */ ZodOptional), -/* harmony export */ ZodParsedType: () => (/* binding */ ZodParsedType), -/* harmony export */ ZodPipeline: () => (/* binding */ ZodPipeline), -/* harmony export */ ZodPromise: () => (/* binding */ ZodPromise), -/* harmony export */ ZodReadonly: () => (/* binding */ ZodReadonly), -/* harmony export */ ZodRecord: () => (/* binding */ ZodRecord), -/* harmony export */ ZodSchema: () => (/* binding */ ZodType), -/* harmony export */ ZodSet: () => (/* binding */ ZodSet), -/* harmony export */ ZodString: () => (/* binding */ ZodString), -/* harmony export */ ZodSymbol: () => (/* binding */ ZodSymbol), -/* harmony export */ ZodTransformer: () => (/* binding */ ZodEffects), -/* harmony export */ ZodTuple: () => (/* binding */ ZodTuple), -/* harmony export */ ZodType: () => (/* binding */ ZodType), -/* harmony export */ ZodUndefined: () => (/* binding */ ZodUndefined), -/* harmony export */ ZodUnion: () => (/* binding */ ZodUnion), -/* harmony export */ ZodUnknown: () => (/* binding */ ZodUnknown), -/* harmony export */ ZodVoid: () => (/* binding */ ZodVoid), -/* harmony export */ addIssueToContext: () => (/* binding */ addIssueToContext), -/* harmony export */ any: () => (/* binding */ anyType), -/* harmony export */ array: () => (/* binding */ arrayType), -/* harmony export */ bigint: () => (/* binding */ bigIntType), -/* harmony export */ boolean: () => (/* binding */ booleanType), -/* harmony export */ coerce: () => (/* binding */ coerce), -/* harmony export */ custom: () => (/* binding */ custom), -/* harmony export */ date: () => (/* binding */ dateType), -/* harmony export */ datetimeRegex: () => (/* binding */ datetimeRegex), -/* harmony export */ "default": () => (/* binding */ z), -/* harmony export */ defaultErrorMap: () => (/* binding */ errorMap), -/* harmony export */ discriminatedUnion: () => (/* binding */ discriminatedUnionType), -/* harmony export */ effect: () => (/* binding */ effectsType), -/* harmony export */ "enum": () => (/* binding */ enumType), -/* harmony export */ "function": () => (/* binding */ functionType), -/* harmony export */ getErrorMap: () => (/* binding */ getErrorMap), -/* harmony export */ getParsedType: () => (/* binding */ getParsedType), -/* harmony export */ "instanceof": () => (/* binding */ instanceOfType), -/* harmony export */ intersection: () => (/* binding */ intersectionType), -/* harmony export */ isAborted: () => (/* binding */ isAborted), -/* harmony export */ isAsync: () => (/* binding */ isAsync), -/* harmony export */ isDirty: () => (/* binding */ isDirty), -/* harmony export */ isValid: () => (/* binding */ isValid), -/* harmony export */ late: () => (/* binding */ late), -/* harmony export */ lazy: () => (/* binding */ lazyType), -/* harmony export */ literal: () => (/* binding */ literalType), -/* harmony export */ makeIssue: () => (/* binding */ makeIssue), -/* harmony export */ map: () => (/* binding */ mapType), -/* harmony export */ nan: () => (/* binding */ nanType), -/* harmony export */ nativeEnum: () => (/* binding */ nativeEnumType), -/* harmony export */ never: () => (/* binding */ neverType), -/* harmony export */ "null": () => (/* binding */ nullType), -/* harmony export */ nullable: () => (/* binding */ nullableType), -/* harmony export */ number: () => (/* binding */ numberType), -/* harmony export */ object: () => (/* binding */ objectType), -/* harmony export */ objectUtil: () => (/* binding */ objectUtil), -/* harmony export */ oboolean: () => (/* binding */ oboolean), -/* harmony export */ onumber: () => (/* binding */ onumber), -/* harmony export */ optional: () => (/* binding */ optionalType), -/* harmony export */ ostring: () => (/* binding */ ostring), -/* harmony export */ pipeline: () => (/* binding */ pipelineType), -/* harmony export */ preprocess: () => (/* binding */ preprocessType), -/* harmony export */ promise: () => (/* binding */ promiseType), -/* harmony export */ quotelessJson: () => (/* binding */ quotelessJson), -/* harmony export */ record: () => (/* binding */ recordType), -/* harmony export */ set: () => (/* binding */ setType), -/* harmony export */ setErrorMap: () => (/* binding */ setErrorMap), -/* harmony export */ strictObject: () => (/* binding */ strictObjectType), -/* harmony export */ string: () => (/* binding */ stringType), -/* harmony export */ symbol: () => (/* binding */ symbolType), -/* harmony export */ transformer: () => (/* binding */ effectsType), -/* harmony export */ tuple: () => (/* binding */ tupleType), -/* harmony export */ undefined: () => (/* binding */ undefinedType), -/* harmony export */ union: () => (/* binding */ unionType), -/* harmony export */ unknown: () => (/* binding */ unknownType), -/* harmony export */ util: () => (/* binding */ util), -/* harmony export */ "void": () => (/* binding */ voidType), -/* harmony export */ z: () => (/* binding */ z) -/* harmony export */ }); -var util; -(function (util) { - util.assertEqual = (val) => val; - function assertIs(_arg) { } - util.assertIs = assertIs; - function assertNever(_x) { - throw new Error(); - } - util.assertNever = assertNever; - util.arrayToEnum = (items) => { - const obj = {}; - for (const item of items) { - obj[item] = item; - } - return obj; - }; - util.getValidEnumValues = (obj) => { - const validKeys = util.objectKeys(obj).filter((k) => typeof obj[obj[k]] !== "number"); - const filtered = {}; - for (const k of validKeys) { - filtered[k] = obj[k]; - } - return util.objectValues(filtered); - }; - util.objectValues = (obj) => { - return util.objectKeys(obj).map(function (e) { - return obj[e]; - }); - }; - util.objectKeys = typeof Object.keys === "function" // eslint-disable-line ban/ban - ? (obj) => Object.keys(obj) // eslint-disable-line ban/ban - : (object) => { - const keys = []; - for (const key in object) { - if (Object.prototype.hasOwnProperty.call(object, key)) { - keys.push(key); - } - } - return keys; - }; - util.find = (arr, checker) => { - for (const item of arr) { - if (checker(item)) - return item; - } - return undefined; - }; - util.isInteger = typeof Number.isInteger === "function" - ? (val) => Number.isInteger(val) // eslint-disable-line ban/ban - : (val) => typeof val === "number" && isFinite(val) && Math.floor(val) === val; - function joinValues(array, separator = " | ") { - return array - .map((val) => (typeof val === "string" ? `'${val}'` : val)) - .join(separator); - } - util.joinValues = joinValues; - util.jsonStringifyReplacer = (_, value) => { - if (typeof value === "bigint") { - return value.toString(); - } - return value; - }; -})(util || (util = {})); -var objectUtil; -(function (objectUtil) { - objectUtil.mergeShapes = (first, second) => { - return { - ...first, - ...second, // second overwrites first - }; - }; -})(objectUtil || (objectUtil = {})); -const ZodParsedType = util.arrayToEnum([ - "string", - "nan", - "number", - "integer", - "float", - "boolean", - "date", - "bigint", - "symbol", - "function", - "undefined", - "null", - "array", - "object", - "unknown", - "promise", - "void", - "never", - "map", - "set", -]); -const getParsedType = (data) => { - const t = typeof data; - switch (t) { - case "undefined": - return ZodParsedType.undefined; - case "string": - return ZodParsedType.string; - case "number": - return isNaN(data) ? ZodParsedType.nan : ZodParsedType.number; - case "boolean": - return ZodParsedType.boolean; - case "function": - return ZodParsedType.function; - case "bigint": - return ZodParsedType.bigint; - case "symbol": - return ZodParsedType.symbol; - case "object": - if (Array.isArray(data)) { - return ZodParsedType.array; - } - if (data === null) { - return ZodParsedType.null; - } - if (data.then && - typeof data.then === "function" && - data.catch && - typeof data.catch === "function") { - return ZodParsedType.promise; - } - if (typeof Map !== "undefined" && data instanceof Map) { - return ZodParsedType.map; - } - if (typeof Set !== "undefined" && data instanceof Set) { - return ZodParsedType.set; - } - if (typeof Date !== "undefined" && data instanceof Date) { - return ZodParsedType.date; - } - return ZodParsedType.object; - default: - return ZodParsedType.unknown; - } -}; - -const ZodIssueCode = util.arrayToEnum([ - "invalid_type", - "invalid_literal", - "custom", - "invalid_union", - "invalid_union_discriminator", - "invalid_enum_value", - "unrecognized_keys", - "invalid_arguments", - "invalid_return_type", - "invalid_date", - "invalid_string", - "too_small", - "too_big", - "invalid_intersection_types", - "not_multiple_of", - "not_finite", -]); -const quotelessJson = (obj) => { - const json = JSON.stringify(obj, null, 2); - return json.replace(/"([^"]+)":/g, "$1:"); -}; -class ZodError extends Error { - get errors() { - return this.issues; - } - constructor(issues) { - super(); - this.issues = []; - this.addIssue = (sub) => { - this.issues = [...this.issues, sub]; - }; - this.addIssues = (subs = []) => { - this.issues = [...this.issues, ...subs]; - }; - const actualProto = new.target.prototype; - if (Object.setPrototypeOf) { - // eslint-disable-next-line ban/ban - Object.setPrototypeOf(this, actualProto); - } - else { - this.__proto__ = actualProto; - } - this.name = "ZodError"; - this.issues = issues; - } - format(_mapper) { - const mapper = _mapper || - function (issue) { - return issue.message; - }; - const fieldErrors = { _errors: [] }; - const processError = (error) => { - for (const issue of error.issues) { - if (issue.code === "invalid_union") { - issue.unionErrors.map(processError); - } - else if (issue.code === "invalid_return_type") { - processError(issue.returnTypeError); - } - else if (issue.code === "invalid_arguments") { - processError(issue.argumentsError); - } - else if (issue.path.length === 0) { - fieldErrors._errors.push(mapper(issue)); - } - else { - let curr = fieldErrors; - let i = 0; - while (i < issue.path.length) { - const el = issue.path[i]; - const terminal = i === issue.path.length - 1; - if (!terminal) { - curr[el] = curr[el] || { _errors: [] }; - // if (typeof el === "string") { - // curr[el] = curr[el] || { _errors: [] }; - // } else if (typeof el === "number") { - // const errorArray: any = []; - // errorArray._errors = []; - // curr[el] = curr[el] || errorArray; - // } - } - else { - curr[el] = curr[el] || { _errors: [] }; - curr[el]._errors.push(mapper(issue)); - } - curr = curr[el]; - i++; - } - } - } - }; - processError(this); - return fieldErrors; - } - static assert(value) { - if (!(value instanceof ZodError)) { - throw new Error(`Not a ZodError: ${value}`); - } - } - toString() { - return this.message; - } - get message() { - return JSON.stringify(this.issues, util.jsonStringifyReplacer, 2); - } - get isEmpty() { - return this.issues.length === 0; - } - flatten(mapper = (issue) => issue.message) { - const fieldErrors = {}; - const formErrors = []; - for (const sub of this.issues) { - if (sub.path.length > 0) { - fieldErrors[sub.path[0]] = fieldErrors[sub.path[0]] || []; - fieldErrors[sub.path[0]].push(mapper(sub)); - } - else { - formErrors.push(mapper(sub)); - } - } - return { formErrors, fieldErrors }; - } - get formErrors() { - return this.flatten(); - } -} -ZodError.create = (issues) => { - const error = new ZodError(issues); - return error; -}; - -const errorMap = (issue, _ctx) => { - let message; - switch (issue.code) { - case ZodIssueCode.invalid_type: - if (issue.received === ZodParsedType.undefined) { - message = "Required"; - } - else { - message = `Expected ${issue.expected}, received ${issue.received}`; - } - break; - case ZodIssueCode.invalid_literal: - message = `Invalid literal value, expected ${JSON.stringify(issue.expected, util.jsonStringifyReplacer)}`; - break; - case ZodIssueCode.unrecognized_keys: - message = `Unrecognized key(s) in object: ${util.joinValues(issue.keys, ", ")}`; - break; - case ZodIssueCode.invalid_union: - message = `Invalid input`; - break; - case ZodIssueCode.invalid_union_discriminator: - message = `Invalid discriminator value. Expected ${util.joinValues(issue.options)}`; - break; - case ZodIssueCode.invalid_enum_value: - message = `Invalid enum value. Expected ${util.joinValues(issue.options)}, received '${issue.received}'`; - break; - case ZodIssueCode.invalid_arguments: - message = `Invalid function arguments`; - break; - case ZodIssueCode.invalid_return_type: - message = `Invalid function return type`; - break; - case ZodIssueCode.invalid_date: - message = `Invalid date`; - break; - case ZodIssueCode.invalid_string: - if (typeof issue.validation === "object") { - if ("includes" in issue.validation) { - message = `Invalid input: must include "${issue.validation.includes}"`; - if (typeof issue.validation.position === "number") { - message = `${message} at one or more positions greater than or equal to ${issue.validation.position}`; - } - } - else if ("startsWith" in issue.validation) { - message = `Invalid input: must start with "${issue.validation.startsWith}"`; - } - else if ("endsWith" in issue.validation) { - message = `Invalid input: must end with "${issue.validation.endsWith}"`; - } - else { - util.assertNever(issue.validation); - } - } - else if (issue.validation !== "regex") { - message = `Invalid ${issue.validation}`; - } - else { - message = "Invalid"; - } - break; - case ZodIssueCode.too_small: - if (issue.type === "array") - message = `Array must contain ${issue.exact ? "exactly" : issue.inclusive ? `at least` : `more than`} ${issue.minimum} element(s)`; - else if (issue.type === "string") - message = `String must contain ${issue.exact ? "exactly" : issue.inclusive ? `at least` : `over`} ${issue.minimum} character(s)`; - else if (issue.type === "number") - message = `Number must be ${issue.exact - ? `exactly equal to ` - : issue.inclusive - ? `greater than or equal to ` - : `greater than `}${issue.minimum}`; - else if (issue.type === "date") - message = `Date must be ${issue.exact - ? `exactly equal to ` - : issue.inclusive - ? `greater than or equal to ` - : `greater than `}${new Date(Number(issue.minimum))}`; - else - message = "Invalid input"; - break; - case ZodIssueCode.too_big: - if (issue.type === "array") - message = `Array must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `less than`} ${issue.maximum} element(s)`; - else if (issue.type === "string") - message = `String must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `under`} ${issue.maximum} character(s)`; - else if (issue.type === "number") - message = `Number must be ${issue.exact - ? `exactly` - : issue.inclusive - ? `less than or equal to` - : `less than`} ${issue.maximum}`; - else if (issue.type === "bigint") - message = `BigInt must be ${issue.exact - ? `exactly` - : issue.inclusive - ? `less than or equal to` - : `less than`} ${issue.maximum}`; - else if (issue.type === "date") - message = `Date must be ${issue.exact - ? `exactly` - : issue.inclusive - ? `smaller than or equal to` - : `smaller than`} ${new Date(Number(issue.maximum))}`; - else - message = "Invalid input"; - break; - case ZodIssueCode.custom: - message = `Invalid input`; - break; - case ZodIssueCode.invalid_intersection_types: - message = `Intersection results could not be merged`; - break; - case ZodIssueCode.not_multiple_of: - message = `Number must be a multiple of ${issue.multipleOf}`; - break; - case ZodIssueCode.not_finite: - message = "Number must be finite"; - break; - default: - message = _ctx.defaultError; - util.assertNever(issue); - } - return { message }; -}; - -let overrideErrorMap = errorMap; -function setErrorMap(map) { - overrideErrorMap = map; -} -function getErrorMap() { - return overrideErrorMap; -} - -const makeIssue = (params) => { - const { data, path, errorMaps, issueData } = params; - const fullPath = [...path, ...(issueData.path || [])]; - const fullIssue = { - ...issueData, - path: fullPath, - }; - if (issueData.message !== undefined) { - return { - ...issueData, - path: fullPath, - message: issueData.message, - }; - } - let errorMessage = ""; - const maps = errorMaps - .filter((m) => !!m) - .slice() - .reverse(); - for (const map of maps) { - errorMessage = map(fullIssue, { data, defaultError: errorMessage }).message; - } - return { - ...issueData, - path: fullPath, - message: errorMessage, - }; -}; -const EMPTY_PATH = []; -function addIssueToContext(ctx, issueData) { - const overrideMap = getErrorMap(); - const issue = makeIssue({ - issueData: issueData, - data: ctx.data, - path: ctx.path, - errorMaps: [ - ctx.common.contextualErrorMap, // contextual error map is first priority - ctx.schemaErrorMap, // then schema-bound map if available - overrideMap, // then global override map - overrideMap === errorMap ? undefined : errorMap, // then global default map - ].filter((x) => !!x), - }); - ctx.common.issues.push(issue); -} -class ParseStatus { - constructor() { - this.value = "valid"; - } - dirty() { - if (this.value === "valid") - this.value = "dirty"; - } - abort() { - if (this.value !== "aborted") - this.value = "aborted"; - } - static mergeArray(status, results) { - const arrayValue = []; - for (const s of results) { - if (s.status === "aborted") - return INVALID; - if (s.status === "dirty") - status.dirty(); - arrayValue.push(s.value); - } - return { status: status.value, value: arrayValue }; - } - static async mergeObjectAsync(status, pairs) { - const syncPairs = []; - for (const pair of pairs) { - const key = await pair.key; - const value = await pair.value; - syncPairs.push({ - key, - value, - }); - } - return ParseStatus.mergeObjectSync(status, syncPairs); - } - static mergeObjectSync(status, pairs) { - const finalObject = {}; - for (const pair of pairs) { - const { key, value } = pair; - if (key.status === "aborted") - return INVALID; - if (value.status === "aborted") - return INVALID; - if (key.status === "dirty") - status.dirty(); - if (value.status === "dirty") - status.dirty(); - if (key.value !== "__proto__" && - (typeof value.value !== "undefined" || pair.alwaysSet)) { - finalObject[key.value] = value.value; - } - } - return { status: status.value, value: finalObject }; - } -} -const INVALID = Object.freeze({ - status: "aborted", -}); -const DIRTY = (value) => ({ status: "dirty", value }); -const OK = (value) => ({ status: "valid", value }); -const isAborted = (x) => x.status === "aborted"; -const isDirty = (x) => x.status === "dirty"; -const isValid = (x) => x.status === "valid"; -const isAsync = (x) => typeof Promise !== "undefined" && x instanceof Promise; - -/****************************************************************************** -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. -***************************************************************************** */ - -function __classPrivateFieldGet(receiver, state, kind, f) { - if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); - return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); -} - -function __classPrivateFieldSet(receiver, state, value, kind, f) { - if (kind === "m") throw new TypeError("Private method is not writable"); - if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); - return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; -} - -typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) { - var e = new Error(message); - return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e; -}; - -var errorUtil; -(function (errorUtil) { - errorUtil.errToObj = (message) => typeof message === "string" ? { message } : message || {}; - errorUtil.toString = (message) => typeof message === "string" ? message : message === null || message === void 0 ? void 0 : message.message; -})(errorUtil || (errorUtil = {})); - -var _ZodEnum_cache, _ZodNativeEnum_cache; -class ParseInputLazyPath { - constructor(parent, value, path, key) { - this._cachedPath = []; - this.parent = parent; - this.data = value; - this._path = path; - this._key = key; - } - get path() { - if (!this._cachedPath.length) { - if (this._key instanceof Array) { - this._cachedPath.push(...this._path, ...this._key); - } - else { - this._cachedPath.push(...this._path, this._key); - } - } - return this._cachedPath; - } -} -const handleResult = (ctx, result) => { - if (isValid(result)) { - return { success: true, data: result.value }; - } - else { - if (!ctx.common.issues.length) { - throw new Error("Validation failed but no issues detected."); - } - return { - success: false, - get error() { - if (this._error) - return this._error; - const error = new ZodError(ctx.common.issues); - this._error = error; - return this._error; - }, - }; - } -}; -function processCreateParams(params) { - if (!params) - return {}; - const { errorMap, invalid_type_error, required_error, description } = params; - if (errorMap && (invalid_type_error || required_error)) { - throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`); - } - if (errorMap) - return { errorMap: errorMap, description }; - const customMap = (iss, ctx) => { - var _a, _b; - const { message } = params; - if (iss.code === "invalid_enum_value") { - return { message: message !== null && message !== void 0 ? message : ctx.defaultError }; - } - if (typeof ctx.data === "undefined") { - return { message: (_a = message !== null && message !== void 0 ? message : required_error) !== null && _a !== void 0 ? _a : ctx.defaultError }; - } - if (iss.code !== "invalid_type") - return { message: ctx.defaultError }; - return { message: (_b = message !== null && message !== void 0 ? message : invalid_type_error) !== null && _b !== void 0 ? _b : ctx.defaultError }; - }; - return { errorMap: customMap, description }; -} -class ZodType { - get description() { - return this._def.description; - } - _getType(input) { - return getParsedType(input.data); - } - _getOrReturnCtx(input, ctx) { - return (ctx || { - common: input.parent.common, - data: input.data, - parsedType: getParsedType(input.data), - schemaErrorMap: this._def.errorMap, - path: input.path, - parent: input.parent, - }); - } - _processInputParams(input) { - return { - status: new ParseStatus(), - ctx: { - common: input.parent.common, - data: input.data, - parsedType: getParsedType(input.data), - schemaErrorMap: this._def.errorMap, - path: input.path, - parent: input.parent, - }, - }; - } - _parseSync(input) { - const result = this._parse(input); - if (isAsync(result)) { - throw new Error("Synchronous parse encountered promise."); - } - return result; - } - _parseAsync(input) { - const result = this._parse(input); - return Promise.resolve(result); - } - parse(data, params) { - const result = this.safeParse(data, params); - if (result.success) - return result.data; - throw result.error; - } - safeParse(data, params) { - var _a; - const ctx = { - common: { - issues: [], - async: (_a = params === null || params === void 0 ? void 0 : params.async) !== null && _a !== void 0 ? _a : false, - contextualErrorMap: params === null || params === void 0 ? void 0 : params.errorMap, - }, - path: (params === null || params === void 0 ? void 0 : params.path) || [], - schemaErrorMap: this._def.errorMap, - parent: null, - data, - parsedType: getParsedType(data), - }; - const result = this._parseSync({ data, path: ctx.path, parent: ctx }); - return handleResult(ctx, result); - } - "~validate"(data) { - var _a, _b; - const ctx = { - common: { - issues: [], - async: !!this["~standard"].async, - }, - path: [], - schemaErrorMap: this._def.errorMap, - parent: null, - data, - parsedType: getParsedType(data), - }; - if (!this["~standard"].async) { - try { - const result = this._parseSync({ data, path: [], parent: ctx }); - return isValid(result) - ? { - value: result.value, - } - : { - issues: ctx.common.issues, - }; - } - catch (err) { - if ((_b = (_a = err === null || err === void 0 ? void 0 : err.message) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === null || _b === void 0 ? void 0 : _b.includes("encountered")) { - this["~standard"].async = true; - } - ctx.common = { - issues: [], - async: true, - }; - } - } - return this._parseAsync({ data, path: [], parent: ctx }).then((result) => isValid(result) - ? { - value: result.value, - } - : { - issues: ctx.common.issues, - }); - } - async parseAsync(data, params) { - const result = await this.safeParseAsync(data, params); - if (result.success) - return result.data; - throw result.error; - } - async safeParseAsync(data, params) { - const ctx = { - common: { - issues: [], - contextualErrorMap: params === null || params === void 0 ? void 0 : params.errorMap, - async: true, - }, - path: (params === null || params === void 0 ? void 0 : params.path) || [], - schemaErrorMap: this._def.errorMap, - parent: null, - data, - parsedType: getParsedType(data), - }; - const maybeAsyncResult = this._parse({ data, path: ctx.path, parent: ctx }); - const result = await (isAsync(maybeAsyncResult) - ? maybeAsyncResult - : Promise.resolve(maybeAsyncResult)); - return handleResult(ctx, result); - } - refine(check, message) { - const getIssueProperties = (val) => { - if (typeof message === "string" || typeof message === "undefined") { - return { message }; - } - else if (typeof message === "function") { - return message(val); - } - else { - return message; - } - }; - return this._refinement((val, ctx) => { - const result = check(val); - const setError = () => ctx.addIssue({ - code: ZodIssueCode.custom, - ...getIssueProperties(val), - }); - if (typeof Promise !== "undefined" && result instanceof Promise) { - return result.then((data) => { - if (!data) { - setError(); - return false; - } - else { - return true; - } - }); - } - if (!result) { - setError(); - return false; - } - else { - return true; - } - }); - } - refinement(check, refinementData) { - return this._refinement((val, ctx) => { - if (!check(val)) { - ctx.addIssue(typeof refinementData === "function" - ? refinementData(val, ctx) - : refinementData); - return false; - } - else { - return true; - } - }); - } - _refinement(refinement) { - return new ZodEffects({ - schema: this, - typeName: ZodFirstPartyTypeKind.ZodEffects, - effect: { type: "refinement", refinement }, - }); - } - superRefine(refinement) { - return this._refinement(refinement); - } - constructor(def) { - /** Alias of safeParseAsync */ - this.spa = this.safeParseAsync; - this._def = def; - this.parse = this.parse.bind(this); - this.safeParse = this.safeParse.bind(this); - this.parseAsync = this.parseAsync.bind(this); - this.safeParseAsync = this.safeParseAsync.bind(this); - this.spa = this.spa.bind(this); - this.refine = this.refine.bind(this); - this.refinement = this.refinement.bind(this); - this.superRefine = this.superRefine.bind(this); - this.optional = this.optional.bind(this); - this.nullable = this.nullable.bind(this); - this.nullish = this.nullish.bind(this); - this.array = this.array.bind(this); - this.promise = this.promise.bind(this); - this.or = this.or.bind(this); - this.and = this.and.bind(this); - this.transform = this.transform.bind(this); - this.brand = this.brand.bind(this); - this.default = this.default.bind(this); - this.catch = this.catch.bind(this); - this.describe = this.describe.bind(this); - this.pipe = this.pipe.bind(this); - this.readonly = this.readonly.bind(this); - this.isNullable = this.isNullable.bind(this); - this.isOptional = this.isOptional.bind(this); - this["~standard"] = { - version: 1, - vendor: "zod", - validate: (data) => this["~validate"](data), - }; - } - optional() { - return ZodOptional.create(this, this._def); - } - nullable() { - return ZodNullable.create(this, this._def); - } - nullish() { - return this.nullable().optional(); - } - array() { - return ZodArray.create(this); - } - promise() { - return ZodPromise.create(this, this._def); - } - or(option) { - return ZodUnion.create([this, option], this._def); - } - and(incoming) { - return ZodIntersection.create(this, incoming, this._def); - } - transform(transform) { - return new ZodEffects({ - ...processCreateParams(this._def), - schema: this, - typeName: ZodFirstPartyTypeKind.ZodEffects, - effect: { type: "transform", transform }, - }); - } - default(def) { - const defaultValueFunc = typeof def === "function" ? def : () => def; - return new ZodDefault({ - ...processCreateParams(this._def), - innerType: this, - defaultValue: defaultValueFunc, - typeName: ZodFirstPartyTypeKind.ZodDefault, - }); - } - brand() { - return new ZodBranded({ - typeName: ZodFirstPartyTypeKind.ZodBranded, - type: this, - ...processCreateParams(this._def), - }); - } - catch(def) { - const catchValueFunc = typeof def === "function" ? def : () => def; - return new ZodCatch({ - ...processCreateParams(this._def), - innerType: this, - catchValue: catchValueFunc, - typeName: ZodFirstPartyTypeKind.ZodCatch, - }); - } - describe(description) { - const This = this.constructor; - return new This({ - ...this._def, - description, - }); - } - pipe(target) { - return ZodPipeline.create(this, target); - } - readonly() { - return ZodReadonly.create(this); - } - isOptional() { - return this.safeParse(undefined).success; - } - isNullable() { - return this.safeParse(null).success; - } + catch(def) { + const catchValueFunc = typeof def === "function" ? def : () => def; + return new ZodCatch({ + ...processCreateParams(this._def), + innerType: this, + catchValue: catchValueFunc, + typeName: ZodFirstPartyTypeKind.ZodCatch, + }); + } + describe(description) { + const This = this.constructor; + return new This({ + ...this._def, + description, + }); + } + pipe(target) { + return ZodPipeline.create(this, target); + } + readonly() { + return ZodReadonly.create(this); + } + isOptional() { + return this.safeParse(undefined).success; + } + isNullable() { + return this.safeParse(null).success; + } } const cuidRegex = /^c[^\s-]{8,}$/i; const cuid2Regex = /^[0-9a-z]+$/; @@ -45055,305 +43576,1072 @@ class ZodString extends ZodType { if (input.data.length < check.value) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { - code: ZodIssueCode.too_small, - minimum: check.value, - type: "string", - inclusive: true, - exact: false, + code: ZodIssueCode.too_small, + minimum: check.value, + type: "string", + inclusive: true, + exact: false, + message: check.message, + }); + status.dirty(); + } + } + else if (check.kind === "max") { + if (input.data.length > check.value) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + maximum: check.value, + type: "string", + inclusive: true, + exact: false, + message: check.message, + }); + status.dirty(); + } + } + else if (check.kind === "length") { + const tooBig = input.data.length > check.value; + const tooSmall = input.data.length < check.value; + if (tooBig || tooSmall) { + ctx = this._getOrReturnCtx(input, ctx); + if (tooBig) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + maximum: check.value, + type: "string", + inclusive: true, + exact: true, + message: check.message, + }); + } + else if (tooSmall) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + minimum: check.value, + type: "string", + inclusive: true, + exact: true, + message: check.message, + }); + } + status.dirty(); + } + } + else if (check.kind === "email") { + if (!emailRegex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "email", + code: ZodIssueCode.invalid_string, + message: check.message, + }); + status.dirty(); + } + } + else if (check.kind === "emoji") { + if (!emojiRegex) { + emojiRegex = new RegExp(_emojiRegex, "u"); + } + if (!emojiRegex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "emoji", + code: ZodIssueCode.invalid_string, + message: check.message, + }); + status.dirty(); + } + } + else if (check.kind === "uuid") { + if (!uuidRegex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "uuid", + code: ZodIssueCode.invalid_string, + message: check.message, + }); + status.dirty(); + } + } + else if (check.kind === "nanoid") { + if (!nanoidRegex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "nanoid", + code: ZodIssueCode.invalid_string, + message: check.message, + }); + status.dirty(); + } + } + else if (check.kind === "cuid") { + if (!cuidRegex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "cuid", + code: ZodIssueCode.invalid_string, + message: check.message, + }); + status.dirty(); + } + } + else if (check.kind === "cuid2") { + if (!cuid2Regex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "cuid2", + code: ZodIssueCode.invalid_string, + message: check.message, + }); + status.dirty(); + } + } + else if (check.kind === "ulid") { + if (!ulidRegex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "ulid", + code: ZodIssueCode.invalid_string, + message: check.message, + }); + status.dirty(); + } + } + else if (check.kind === "url") { + try { + new URL(input.data); + } + catch (_a) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "url", + code: ZodIssueCode.invalid_string, + message: check.message, + }); + status.dirty(); + } + } + else if (check.kind === "regex") { + check.regex.lastIndex = 0; + const testResult = check.regex.test(input.data); + if (!testResult) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "regex", + code: ZodIssueCode.invalid_string, + message: check.message, + }); + status.dirty(); + } + } + else if (check.kind === "trim") { + input.data = input.data.trim(); + } + else if (check.kind === "includes") { + if (!input.data.includes(check.value, check.position)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_string, + validation: { includes: check.value, position: check.position }, + message: check.message, + }); + status.dirty(); + } + } + else if (check.kind === "toLowerCase") { + input.data = input.data.toLowerCase(); + } + else if (check.kind === "toUpperCase") { + input.data = input.data.toUpperCase(); + } + else if (check.kind === "startsWith") { + if (!input.data.startsWith(check.value)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_string, + validation: { startsWith: check.value }, + message: check.message, + }); + status.dirty(); + } + } + else if (check.kind === "endsWith") { + if (!input.data.endsWith(check.value)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_string, + validation: { endsWith: check.value }, + message: check.message, + }); + status.dirty(); + } + } + else if (check.kind === "datetime") { + const regex = datetimeRegex(check); + if (!regex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_string, + validation: "datetime", + message: check.message, + }); + status.dirty(); + } + } + else if (check.kind === "date") { + const regex = dateRegex; + if (!regex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_string, + validation: "date", message: check.message, }); status.dirty(); } } - else if (check.kind === "max") { - if (input.data.length > check.value) { + else if (check.kind === "time") { + const regex = timeRegex(check); + if (!regex.test(input.data)) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { - code: ZodIssueCode.too_big, - maximum: check.value, - type: "string", - inclusive: true, - exact: false, + code: ZodIssueCode.invalid_string, + validation: "time", message: check.message, }); status.dirty(); } } - else if (check.kind === "length") { - const tooBig = input.data.length > check.value; - const tooSmall = input.data.length < check.value; - if (tooBig || tooSmall) { + else if (check.kind === "duration") { + if (!durationRegex.test(input.data)) { ctx = this._getOrReturnCtx(input, ctx); - if (tooBig) { - addIssueToContext(ctx, { - code: ZodIssueCode.too_big, - maximum: check.value, - type: "string", - inclusive: true, - exact: true, - message: check.message, - }); - } - else if (tooSmall) { - addIssueToContext(ctx, { - code: ZodIssueCode.too_small, - minimum: check.value, - type: "string", - inclusive: true, - exact: true, - message: check.message, - }); - } + addIssueToContext(ctx, { + validation: "duration", + code: ZodIssueCode.invalid_string, + message: check.message, + }); status.dirty(); } } - else if (check.kind === "email") { - if (!emailRegex.test(input.data)) { + else if (check.kind === "ip") { + if (!isValidIP(input.data, check.version)) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { - validation: "email", + validation: "ip", code: ZodIssueCode.invalid_string, message: check.message, }); status.dirty(); } } - else if (check.kind === "emoji") { - if (!emojiRegex) { - emojiRegex = new RegExp(_emojiRegex, "u"); - } - if (!emojiRegex.test(input.data)) { + else if (check.kind === "jwt") { + if (!isValidJWT(input.data, check.alg)) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { - validation: "emoji", + validation: "jwt", code: ZodIssueCode.invalid_string, message: check.message, }); status.dirty(); } } - else if (check.kind === "uuid") { - if (!uuidRegex.test(input.data)) { + else if (check.kind === "cidr") { + if (!isValidCidr(input.data, check.version)) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { - validation: "uuid", + validation: "cidr", code: ZodIssueCode.invalid_string, message: check.message, }); status.dirty(); } } - else if (check.kind === "nanoid") { - if (!nanoidRegex.test(input.data)) { + else if (check.kind === "base64") { + if (!base64Regex.test(input.data)) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { - validation: "nanoid", + validation: "base64", code: ZodIssueCode.invalid_string, message: check.message, }); status.dirty(); } } - else if (check.kind === "cuid") { - if (!cuidRegex.test(input.data)) { + else if (check.kind === "base64url") { + if (!base64urlRegex.test(input.data)) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { - validation: "cuid", + validation: "base64url", code: ZodIssueCode.invalid_string, message: check.message, }); status.dirty(); } } - else if (check.kind === "cuid2") { - if (!cuid2Regex.test(input.data)) { + else { + util.assertNever(check); + } + } + return { status: status.value, value: input.data }; + } + _regex(regex, validation, message) { + return this.refinement((data) => regex.test(data), { + validation, + code: ZodIssueCode.invalid_string, + ...errorUtil.errToObj(message), + }); + } + _addCheck(check) { + return new ZodString({ + ...this._def, + checks: [...this._def.checks, check], + }); + } + email(message) { + return this._addCheck({ kind: "email", ...errorUtil.errToObj(message) }); + } + url(message) { + return this._addCheck({ kind: "url", ...errorUtil.errToObj(message) }); + } + emoji(message) { + return this._addCheck({ kind: "emoji", ...errorUtil.errToObj(message) }); + } + uuid(message) { + return this._addCheck({ kind: "uuid", ...errorUtil.errToObj(message) }); + } + nanoid(message) { + return this._addCheck({ kind: "nanoid", ...errorUtil.errToObj(message) }); + } + cuid(message) { + return this._addCheck({ kind: "cuid", ...errorUtil.errToObj(message) }); + } + cuid2(message) { + return this._addCheck({ kind: "cuid2", ...errorUtil.errToObj(message) }); + } + ulid(message) { + return this._addCheck({ kind: "ulid", ...errorUtil.errToObj(message) }); + } + base64(message) { + return this._addCheck({ kind: "base64", ...errorUtil.errToObj(message) }); + } + base64url(message) { + // base64url encoding is a modification of base64 that can safely be used in URLs and filenames + return this._addCheck({ + kind: "base64url", + ...errorUtil.errToObj(message), + }); + } + jwt(options) { + return this._addCheck({ kind: "jwt", ...errorUtil.errToObj(options) }); + } + ip(options) { + return this._addCheck({ kind: "ip", ...errorUtil.errToObj(options) }); + } + cidr(options) { + return this._addCheck({ kind: "cidr", ...errorUtil.errToObj(options) }); + } + datetime(options) { + var _a, _b; + if (typeof options === "string") { + return this._addCheck({ + kind: "datetime", + precision: null, + offset: false, + local: false, + message: options, + }); + } + return this._addCheck({ + kind: "datetime", + precision: typeof (options === null || options === void 0 ? void 0 : options.precision) === "undefined" ? null : options === null || options === void 0 ? void 0 : options.precision, + offset: (_a = options === null || options === void 0 ? void 0 : options.offset) !== null && _a !== void 0 ? _a : false, + local: (_b = options === null || options === void 0 ? void 0 : options.local) !== null && _b !== void 0 ? _b : false, + ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message), + }); + } + date(message) { + return this._addCheck({ kind: "date", message }); + } + time(options) { + if (typeof options === "string") { + return this._addCheck({ + kind: "time", + precision: null, + message: options, + }); + } + return this._addCheck({ + kind: "time", + precision: typeof (options === null || options === void 0 ? void 0 : options.precision) === "undefined" ? null : options === null || options === void 0 ? void 0 : options.precision, + ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message), + }); + } + duration(message) { + return this._addCheck({ kind: "duration", ...errorUtil.errToObj(message) }); + } + regex(regex, message) { + return this._addCheck({ + kind: "regex", + regex: regex, + ...errorUtil.errToObj(message), + }); + } + includes(value, options) { + return this._addCheck({ + kind: "includes", + value: value, + position: options === null || options === void 0 ? void 0 : options.position, + ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message), + }); + } + startsWith(value, message) { + return this._addCheck({ + kind: "startsWith", + value: value, + ...errorUtil.errToObj(message), + }); + } + endsWith(value, message) { + return this._addCheck({ + kind: "endsWith", + value: value, + ...errorUtil.errToObj(message), + }); + } + min(minLength, message) { + return this._addCheck({ + kind: "min", + value: minLength, + ...errorUtil.errToObj(message), + }); + } + max(maxLength, message) { + return this._addCheck({ + kind: "max", + value: maxLength, + ...errorUtil.errToObj(message), + }); + } + length(len, message) { + return this._addCheck({ + kind: "length", + value: len, + ...errorUtil.errToObj(message), + }); + } + /** + * Equivalent to `.min(1)` + */ + nonempty(message) { + return this.min(1, errorUtil.errToObj(message)); + } + trim() { + return new ZodString({ + ...this._def, + checks: [...this._def.checks, { kind: "trim" }], + }); + } + toLowerCase() { + return new ZodString({ + ...this._def, + checks: [...this._def.checks, { kind: "toLowerCase" }], + }); + } + toUpperCase() { + return new ZodString({ + ...this._def, + checks: [...this._def.checks, { kind: "toUpperCase" }], + }); + } + get isDatetime() { + return !!this._def.checks.find((ch) => ch.kind === "datetime"); + } + get isDate() { + return !!this._def.checks.find((ch) => ch.kind === "date"); + } + get isTime() { + return !!this._def.checks.find((ch) => ch.kind === "time"); + } + get isDuration() { + return !!this._def.checks.find((ch) => ch.kind === "duration"); + } + get isEmail() { + return !!this._def.checks.find((ch) => ch.kind === "email"); + } + get isURL() { + return !!this._def.checks.find((ch) => ch.kind === "url"); + } + get isEmoji() { + return !!this._def.checks.find((ch) => ch.kind === "emoji"); + } + get isUUID() { + return !!this._def.checks.find((ch) => ch.kind === "uuid"); + } + get isNANOID() { + return !!this._def.checks.find((ch) => ch.kind === "nanoid"); + } + get isCUID() { + return !!this._def.checks.find((ch) => ch.kind === "cuid"); + } + get isCUID2() { + return !!this._def.checks.find((ch) => ch.kind === "cuid2"); + } + get isULID() { + return !!this._def.checks.find((ch) => ch.kind === "ulid"); + } + get isIP() { + return !!this._def.checks.find((ch) => ch.kind === "ip"); + } + get isCIDR() { + return !!this._def.checks.find((ch) => ch.kind === "cidr"); + } + get isBase64() { + return !!this._def.checks.find((ch) => ch.kind === "base64"); + } + get isBase64url() { + // base64url encoding is a modification of base64 that can safely be used in URLs and filenames + return !!this._def.checks.find((ch) => ch.kind === "base64url"); + } + get minLength() { + let min = null; + for (const ch of this._def.checks) { + if (ch.kind === "min") { + if (min === null || ch.value > min) + min = ch.value; + } + } + return min; + } + get maxLength() { + let max = null; + for (const ch of this._def.checks) { + if (ch.kind === "max") { + if (max === null || ch.value < max) + max = ch.value; + } + } + return max; + } +} +ZodString.create = (params) => { + var _a; + return new ZodString({ + checks: [], + typeName: ZodFirstPartyTypeKind.ZodString, + coerce: (_a = params === null || params === void 0 ? void 0 : params.coerce) !== null && _a !== void 0 ? _a : false, + ...processCreateParams(params), + }); +}; +// https://stackoverflow.com/questions/3966484/why-does-modulus-operator-return-fractional-number-in-javascript/31711034#31711034 +function floatSafeRemainder(val, step) { + const valDecCount = (val.toString().split(".")[1] || "").length; + const stepDecCount = (step.toString().split(".")[1] || "").length; + const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount; + const valInt = parseInt(val.toFixed(decCount).replace(".", "")); + const stepInt = parseInt(step.toFixed(decCount).replace(".", "")); + return (valInt % stepInt) / Math.pow(10, decCount); +} +class ZodNumber extends ZodType { + constructor() { + super(...arguments); + this.min = this.gte; + this.max = this.lte; + this.step = this.multipleOf; + } + _parse(input) { + if (this._def.coerce) { + input.data = Number(input.data); + } + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.number) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.number, + received: ctx.parsedType, + }); + return INVALID; + } + let ctx = undefined; + const status = new ParseStatus(); + for (const check of this._def.checks) { + if (check.kind === "int") { + if (!util.isInteger(input.data)) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { - validation: "cuid2", - code: ZodIssueCode.invalid_string, + code: ZodIssueCode.invalid_type, + expected: "integer", + received: "float", message: check.message, }); status.dirty(); } } - else if (check.kind === "ulid") { - if (!ulidRegex.test(input.data)) { + else if (check.kind === "min") { + const tooSmall = check.inclusive + ? input.data < check.value + : input.data <= check.value; + if (tooSmall) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { - validation: "ulid", - code: ZodIssueCode.invalid_string, + code: ZodIssueCode.too_small, + minimum: check.value, + type: "number", + inclusive: check.inclusive, + exact: false, message: check.message, }); status.dirty(); } } - else if (check.kind === "url") { - try { - new URL(input.data); + else if (check.kind === "max") { + const tooBig = check.inclusive + ? input.data > check.value + : input.data >= check.value; + if (tooBig) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + maximum: check.value, + type: "number", + inclusive: check.inclusive, + exact: false, + message: check.message, + }); + status.dirty(); } - catch (_a) { + } + else if (check.kind === "multipleOf") { + if (floatSafeRemainder(input.data, check.value) !== 0) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { - validation: "url", - code: ZodIssueCode.invalid_string, + code: ZodIssueCode.not_multiple_of, + multipleOf: check.value, message: check.message, }); status.dirty(); } } - else if (check.kind === "regex") { - check.regex.lastIndex = 0; - const testResult = check.regex.test(input.data); - if (!testResult) { + else if (check.kind === "finite") { + if (!Number.isFinite(input.data)) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { - validation: "regex", - code: ZodIssueCode.invalid_string, + code: ZodIssueCode.not_finite, message: check.message, }); status.dirty(); } } - else if (check.kind === "trim") { - input.data = input.data.trim(); + else { + util.assertNever(check); + } + } + return { status: status.value, value: input.data }; + } + gte(value, message) { + return this.setLimit("min", value, true, errorUtil.toString(message)); + } + gt(value, message) { + return this.setLimit("min", value, false, errorUtil.toString(message)); + } + lte(value, message) { + return this.setLimit("max", value, true, errorUtil.toString(message)); + } + lt(value, message) { + return this.setLimit("max", value, false, errorUtil.toString(message)); + } + setLimit(kind, value, inclusive, message) { + return new ZodNumber({ + ...this._def, + checks: [ + ...this._def.checks, + { + kind, + value, + inclusive, + message: errorUtil.toString(message), + }, + ], + }); + } + _addCheck(check) { + return new ZodNumber({ + ...this._def, + checks: [...this._def.checks, check], + }); + } + int(message) { + return this._addCheck({ + kind: "int", + message: errorUtil.toString(message), + }); + } + positive(message) { + return this._addCheck({ + kind: "min", + value: 0, + inclusive: false, + message: errorUtil.toString(message), + }); + } + negative(message) { + return this._addCheck({ + kind: "max", + value: 0, + inclusive: false, + message: errorUtil.toString(message), + }); + } + nonpositive(message) { + return this._addCheck({ + kind: "max", + value: 0, + inclusive: true, + message: errorUtil.toString(message), + }); + } + nonnegative(message) { + return this._addCheck({ + kind: "min", + value: 0, + inclusive: true, + message: errorUtil.toString(message), + }); + } + multipleOf(value, message) { + return this._addCheck({ + kind: "multipleOf", + value: value, + message: errorUtil.toString(message), + }); + } + finite(message) { + return this._addCheck({ + kind: "finite", + message: errorUtil.toString(message), + }); + } + safe(message) { + return this._addCheck({ + kind: "min", + inclusive: true, + value: Number.MIN_SAFE_INTEGER, + message: errorUtil.toString(message), + })._addCheck({ + kind: "max", + inclusive: true, + value: Number.MAX_SAFE_INTEGER, + message: errorUtil.toString(message), + }); + } + get minValue() { + let min = null; + for (const ch of this._def.checks) { + if (ch.kind === "min") { + if (min === null || ch.value > min) + min = ch.value; } - else if (check.kind === "includes") { - if (!input.data.includes(check.value, check.position)) { - ctx = this._getOrReturnCtx(input, ctx); - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_string, - validation: { includes: check.value, position: check.position }, - message: check.message, - }); - status.dirty(); - } + } + return min; + } + get maxValue() { + let max = null; + for (const ch of this._def.checks) { + if (ch.kind === "max") { + if (max === null || ch.value < max) + max = ch.value; } - else if (check.kind === "toLowerCase") { - input.data = input.data.toLowerCase(); + } + return max; + } + get isInt() { + return !!this._def.checks.find((ch) => ch.kind === "int" || + (ch.kind === "multipleOf" && util.isInteger(ch.value))); + } + get isFinite() { + let max = null, min = null; + for (const ch of this._def.checks) { + if (ch.kind === "finite" || + ch.kind === "int" || + ch.kind === "multipleOf") { + return true; } - else if (check.kind === "toUpperCase") { - input.data = input.data.toUpperCase(); + else if (ch.kind === "min") { + if (min === null || ch.value > min) + min = ch.value; } - else if (check.kind === "startsWith") { - if (!input.data.startsWith(check.value)) { - ctx = this._getOrReturnCtx(input, ctx); - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_string, - validation: { startsWith: check.value }, - message: check.message, - }); - status.dirty(); - } + else if (ch.kind === "max") { + if (max === null || ch.value < max) + max = ch.value; } - else if (check.kind === "endsWith") { - if (!input.data.endsWith(check.value)) { - ctx = this._getOrReturnCtx(input, ctx); - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_string, - validation: { endsWith: check.value }, - message: check.message, - }); - status.dirty(); - } + } + return Number.isFinite(min) && Number.isFinite(max); + } +} +ZodNumber.create = (params) => { + return new ZodNumber({ + checks: [], + typeName: ZodFirstPartyTypeKind.ZodNumber, + coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false, + ...processCreateParams(params), + }); +}; +class ZodBigInt extends ZodType { + constructor() { + super(...arguments); + this.min = this.gte; + this.max = this.lte; + } + _parse(input) { + if (this._def.coerce) { + try { + input.data = BigInt(input.data); } - else if (check.kind === "datetime") { - const regex = datetimeRegex(check); - if (!regex.test(input.data)) { - ctx = this._getOrReturnCtx(input, ctx); - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_string, - validation: "datetime", - message: check.message, - }); - status.dirty(); - } + catch (_a) { + return this._getInvalidInput(input); } - else if (check.kind === "date") { - const regex = dateRegex; - if (!regex.test(input.data)) { + } + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.bigint) { + return this._getInvalidInput(input); + } + let ctx = undefined; + const status = new ParseStatus(); + for (const check of this._def.checks) { + if (check.kind === "min") { + const tooSmall = check.inclusive + ? input.data < check.value + : input.data <= check.value; + if (tooSmall) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { - code: ZodIssueCode.invalid_string, - validation: "date", + code: ZodIssueCode.too_small, + type: "bigint", + minimum: check.value, + inclusive: check.inclusive, message: check.message, }); status.dirty(); } } - else if (check.kind === "time") { - const regex = timeRegex(check); - if (!regex.test(input.data)) { + else if (check.kind === "max") { + const tooBig = check.inclusive + ? input.data > check.value + : input.data >= check.value; + if (tooBig) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { - code: ZodIssueCode.invalid_string, - validation: "time", + code: ZodIssueCode.too_big, + type: "bigint", + maximum: check.value, + inclusive: check.inclusive, message: check.message, }); status.dirty(); } } - else if (check.kind === "duration") { - if (!durationRegex.test(input.data)) { + else if (check.kind === "multipleOf") { + if (input.data % check.value !== BigInt(0)) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { - validation: "duration", - code: ZodIssueCode.invalid_string, + code: ZodIssueCode.not_multiple_of, + multipleOf: check.value, message: check.message, }); status.dirty(); } } - else if (check.kind === "ip") { - if (!isValidIP(input.data, check.version)) { - ctx = this._getOrReturnCtx(input, ctx); - addIssueToContext(ctx, { - validation: "ip", - code: ZodIssueCode.invalid_string, - message: check.message, - }); - status.dirty(); - } + else { + util.assertNever(check); } - else if (check.kind === "jwt") { - if (!isValidJWT(input.data, check.alg)) { - ctx = this._getOrReturnCtx(input, ctx); - addIssueToContext(ctx, { - validation: "jwt", - code: ZodIssueCode.invalid_string, - message: check.message, - }); - status.dirty(); - } + } + return { status: status.value, value: input.data }; + } + _getInvalidInput(input) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.bigint, + received: ctx.parsedType, + }); + return INVALID; + } + gte(value, message) { + return this.setLimit("min", value, true, errorUtil.toString(message)); + } + gt(value, message) { + return this.setLimit("min", value, false, errorUtil.toString(message)); + } + lte(value, message) { + return this.setLimit("max", value, true, errorUtil.toString(message)); + } + lt(value, message) { + return this.setLimit("max", value, false, errorUtil.toString(message)); + } + setLimit(kind, value, inclusive, message) { + return new ZodBigInt({ + ...this._def, + checks: [ + ...this._def.checks, + { + kind, + value, + inclusive, + message: errorUtil.toString(message), + }, + ], + }); + } + _addCheck(check) { + return new ZodBigInt({ + ...this._def, + checks: [...this._def.checks, check], + }); + } + positive(message) { + return this._addCheck({ + kind: "min", + value: BigInt(0), + inclusive: false, + message: errorUtil.toString(message), + }); + } + negative(message) { + return this._addCheck({ + kind: "max", + value: BigInt(0), + inclusive: false, + message: errorUtil.toString(message), + }); + } + nonpositive(message) { + return this._addCheck({ + kind: "max", + value: BigInt(0), + inclusive: true, + message: errorUtil.toString(message), + }); + } + nonnegative(message) { + return this._addCheck({ + kind: "min", + value: BigInt(0), + inclusive: true, + message: errorUtil.toString(message), + }); + } + multipleOf(value, message) { + return this._addCheck({ + kind: "multipleOf", + value, + message: errorUtil.toString(message), + }); + } + get minValue() { + let min = null; + for (const ch of this._def.checks) { + if (ch.kind === "min") { + if (min === null || ch.value > min) + min = ch.value; } - else if (check.kind === "cidr") { - if (!isValidCidr(input.data, check.version)) { - ctx = this._getOrReturnCtx(input, ctx); - addIssueToContext(ctx, { - validation: "cidr", - code: ZodIssueCode.invalid_string, - message: check.message, - }); - status.dirty(); - } + } + return min; + } + get maxValue() { + let max = null; + for (const ch of this._def.checks) { + if (ch.kind === "max") { + if (max === null || ch.value < max) + max = ch.value; } - else if (check.kind === "base64") { - if (!base64Regex.test(input.data)) { + } + return max; + } +} +ZodBigInt.create = (params) => { + var _a; + return new ZodBigInt({ + checks: [], + typeName: ZodFirstPartyTypeKind.ZodBigInt, + coerce: (_a = params === null || params === void 0 ? void 0 : params.coerce) !== null && _a !== void 0 ? _a : false, + ...processCreateParams(params), + }); +}; +class ZodBoolean extends ZodType { + _parse(input) { + if (this._def.coerce) { + input.data = Boolean(input.data); + } + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.boolean) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.boolean, + received: ctx.parsedType, + }); + return INVALID; + } + return OK(input.data); + } +} +ZodBoolean.create = (params) => { + return new ZodBoolean({ + typeName: ZodFirstPartyTypeKind.ZodBoolean, + coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false, + ...processCreateParams(params), + }); +}; +class ZodDate extends ZodType { + _parse(input) { + if (this._def.coerce) { + input.data = new Date(input.data); + } + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.date) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.date, + received: ctx.parsedType, + }); + return INVALID; + } + if (isNaN(input.data.getTime())) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_date, + }); + return INVALID; + } + const status = new ParseStatus(); + let ctx = undefined; + for (const check of this._def.checks) { + if (check.kind === "min") { + if (input.data.getTime() < check.value) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { - validation: "base64", - code: ZodIssueCode.invalid_string, + code: ZodIssueCode.too_small, message: check.message, + inclusive: true, + exact: false, + minimum: check.value, + type: "date", }); status.dirty(); } } - else if (check.kind === "base64url") { - if (!base64urlRegex.test(input.data)) { + else if (check.kind === "max") { + if (input.data.getTime() > check.value) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { - validation: "base64url", - code: ZodIssueCode.invalid_string, + code: ZodIssueCode.too_big, message: check.message, + inclusive: true, + exact: false, + maximum: check.value, + type: "date", }); status.dirty(); } @@ -45362,3032 +44650,3751 @@ class ZodString extends ZodType { util.assertNever(check); } } - return { status: status.value, value: input.data }; - } - _regex(regex, validation, message) { - return this.refinement((data) => regex.test(data), { - validation, - code: ZodIssueCode.invalid_string, - ...errorUtil.errToObj(message), - }); + return { + status: status.value, + value: new Date(input.data.getTime()), + }; } _addCheck(check) { - return new ZodString({ + return new ZodDate({ ...this._def, checks: [...this._def.checks, check], }); } - email(message) { - return this._addCheck({ kind: "email", ...errorUtil.errToObj(message) }); - } - url(message) { - return this._addCheck({ kind: "url", ...errorUtil.errToObj(message) }); + min(minDate, message) { + return this._addCheck({ + kind: "min", + value: minDate.getTime(), + message: errorUtil.toString(message), + }); } - emoji(message) { - return this._addCheck({ kind: "emoji", ...errorUtil.errToObj(message) }); + max(maxDate, message) { + return this._addCheck({ + kind: "max", + value: maxDate.getTime(), + message: errorUtil.toString(message), + }); } - uuid(message) { - return this._addCheck({ kind: "uuid", ...errorUtil.errToObj(message) }); + get minDate() { + let min = null; + for (const ch of this._def.checks) { + if (ch.kind === "min") { + if (min === null || ch.value > min) + min = ch.value; + } + } + return min != null ? new Date(min) : null; } - nanoid(message) { - return this._addCheck({ kind: "nanoid", ...errorUtil.errToObj(message) }); + get maxDate() { + let max = null; + for (const ch of this._def.checks) { + if (ch.kind === "max") { + if (max === null || ch.value < max) + max = ch.value; + } + } + return max != null ? new Date(max) : null; } - cuid(message) { - return this._addCheck({ kind: "cuid", ...errorUtil.errToObj(message) }); +} +ZodDate.create = (params) => { + return new ZodDate({ + checks: [], + coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false, + typeName: ZodFirstPartyTypeKind.ZodDate, + ...processCreateParams(params), + }); +}; +class ZodSymbol extends ZodType { + _parse(input) { + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.symbol) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.symbol, + received: ctx.parsedType, + }); + return INVALID; + } + return OK(input.data); } - cuid2(message) { - return this._addCheck({ kind: "cuid2", ...errorUtil.errToObj(message) }); +} +ZodSymbol.create = (params) => { + return new ZodSymbol({ + typeName: ZodFirstPartyTypeKind.ZodSymbol, + ...processCreateParams(params), + }); +}; +class ZodUndefined extends ZodType { + _parse(input) { + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.undefined) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.undefined, + received: ctx.parsedType, + }); + return INVALID; + } + return OK(input.data); } - ulid(message) { - return this._addCheck({ kind: "ulid", ...errorUtil.errToObj(message) }); +} +ZodUndefined.create = (params) => { + return new ZodUndefined({ + typeName: ZodFirstPartyTypeKind.ZodUndefined, + ...processCreateParams(params), + }); +}; +class ZodNull extends ZodType { + _parse(input) { + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.null) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.null, + received: ctx.parsedType, + }); + return INVALID; + } + return OK(input.data); } - base64(message) { - return this._addCheck({ kind: "base64", ...errorUtil.errToObj(message) }); +} +ZodNull.create = (params) => { + return new ZodNull({ + typeName: ZodFirstPartyTypeKind.ZodNull, + ...processCreateParams(params), + }); +}; +class ZodAny extends ZodType { + constructor() { + super(...arguments); + // to prevent instances of other classes from extending ZodAny. this causes issues with catchall in ZodObject. + this._any = true; } - base64url(message) { - // base64url encoding is a modification of base64 that can safely be used in URLs and filenames - return this._addCheck({ - kind: "base64url", - ...errorUtil.errToObj(message), - }); + _parse(input) { + return OK(input.data); } - jwt(options) { - return this._addCheck({ kind: "jwt", ...errorUtil.errToObj(options) }); +} +ZodAny.create = (params) => { + return new ZodAny({ + typeName: ZodFirstPartyTypeKind.ZodAny, + ...processCreateParams(params), + }); +}; +class ZodUnknown extends ZodType { + constructor() { + super(...arguments); + // required + this._unknown = true; } - ip(options) { - return this._addCheck({ kind: "ip", ...errorUtil.errToObj(options) }); + _parse(input) { + return OK(input.data); } - cidr(options) { - return this._addCheck({ kind: "cidr", ...errorUtil.errToObj(options) }); +} +ZodUnknown.create = (params) => { + return new ZodUnknown({ + typeName: ZodFirstPartyTypeKind.ZodUnknown, + ...processCreateParams(params), + }); +}; +class ZodNever extends ZodType { + _parse(input) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.never, + received: ctx.parsedType, + }); + return INVALID; } - datetime(options) { - var _a, _b; - if (typeof options === "string") { - return this._addCheck({ - kind: "datetime", - precision: null, - offset: false, - local: false, - message: options, +} +ZodNever.create = (params) => { + return new ZodNever({ + typeName: ZodFirstPartyTypeKind.ZodNever, + ...processCreateParams(params), + }); +}; +class ZodVoid extends ZodType { + _parse(input) { + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.undefined) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.void, + received: ctx.parsedType, }); + return INVALID; } - return this._addCheck({ - kind: "datetime", - precision: typeof (options === null || options === void 0 ? void 0 : options.precision) === "undefined" ? null : options === null || options === void 0 ? void 0 : options.precision, - offset: (_a = options === null || options === void 0 ? void 0 : options.offset) !== null && _a !== void 0 ? _a : false, - local: (_b = options === null || options === void 0 ? void 0 : options.local) !== null && _b !== void 0 ? _b : false, - ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message), - }); - } - date(message) { - return this._addCheck({ kind: "date", message }); + return OK(input.data); } - time(options) { - if (typeof options === "string") { - return this._addCheck({ - kind: "time", - precision: null, - message: options, +} +ZodVoid.create = (params) => { + return new ZodVoid({ + typeName: ZodFirstPartyTypeKind.ZodVoid, + ...processCreateParams(params), + }); +}; +class ZodArray extends ZodType { + _parse(input) { + const { ctx, status } = this._processInputParams(input); + const def = this._def; + if (ctx.parsedType !== ZodParsedType.array) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.array, + received: ctx.parsedType, }); + return INVALID; } - return this._addCheck({ - kind: "time", - precision: typeof (options === null || options === void 0 ? void 0 : options.precision) === "undefined" ? null : options === null || options === void 0 ? void 0 : options.precision, - ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message), - }); - } - duration(message) { - return this._addCheck({ kind: "duration", ...errorUtil.errToObj(message) }); - } - regex(regex, message) { - return this._addCheck({ - kind: "regex", - regex: regex, - ...errorUtil.errToObj(message), - }); - } - includes(value, options) { - return this._addCheck({ - kind: "includes", - value: value, - position: options === null || options === void 0 ? void 0 : options.position, - ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message), - }); - } - startsWith(value, message) { - return this._addCheck({ - kind: "startsWith", - value: value, - ...errorUtil.errToObj(message), + if (def.exactLength !== null) { + const tooBig = ctx.data.length > def.exactLength.value; + const tooSmall = ctx.data.length < def.exactLength.value; + if (tooBig || tooSmall) { + addIssueToContext(ctx, { + code: tooBig ? ZodIssueCode.too_big : ZodIssueCode.too_small, + minimum: (tooSmall ? def.exactLength.value : undefined), + maximum: (tooBig ? def.exactLength.value : undefined), + type: "array", + inclusive: true, + exact: true, + message: def.exactLength.message, + }); + status.dirty(); + } + } + if (def.minLength !== null) { + if (ctx.data.length < def.minLength.value) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + minimum: def.minLength.value, + type: "array", + inclusive: true, + exact: false, + message: def.minLength.message, + }); + status.dirty(); + } + } + if (def.maxLength !== null) { + if (ctx.data.length > def.maxLength.value) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + maximum: def.maxLength.value, + type: "array", + inclusive: true, + exact: false, + message: def.maxLength.message, + }); + status.dirty(); + } + } + if (ctx.common.async) { + return Promise.all([...ctx.data].map((item, i) => { + return def.type._parseAsync(new ParseInputLazyPath(ctx, item, ctx.path, i)); + })).then((result) => { + return ParseStatus.mergeArray(status, result); + }); + } + const result = [...ctx.data].map((item, i) => { + return def.type._parseSync(new ParseInputLazyPath(ctx, item, ctx.path, i)); }); + return ParseStatus.mergeArray(status, result); } - endsWith(value, message) { - return this._addCheck({ - kind: "endsWith", - value: value, - ...errorUtil.errToObj(message), - }); + get element() { + return this._def.type; } min(minLength, message) { - return this._addCheck({ - kind: "min", - value: minLength, - ...errorUtil.errToObj(message), + return new ZodArray({ + ...this._def, + minLength: { value: minLength, message: errorUtil.toString(message) }, }); } max(maxLength, message) { - return this._addCheck({ - kind: "max", - value: maxLength, - ...errorUtil.errToObj(message), + return new ZodArray({ + ...this._def, + maxLength: { value: maxLength, message: errorUtil.toString(message) }, }); } length(len, message) { - return this._addCheck({ - kind: "length", - value: len, - ...errorUtil.errToObj(message), + return new ZodArray({ + ...this._def, + exactLength: { value: len, message: errorUtil.toString(message) }, }); } - /** - * Equivalent to `.min(1)` - */ nonempty(message) { - return this.min(1, errorUtil.errToObj(message)); - } - trim() { - return new ZodString({ - ...this._def, - checks: [...this._def.checks, { kind: "trim" }], - }); + return this.min(1, message); } - toLowerCase() { - return new ZodString({ - ...this._def, - checks: [...this._def.checks, { kind: "toLowerCase" }], +} +ZodArray.create = (schema, params) => { + return new ZodArray({ + type: schema, + minLength: null, + maxLength: null, + exactLength: null, + typeName: ZodFirstPartyTypeKind.ZodArray, + ...processCreateParams(params), + }); +}; +function deepPartialify(schema) { + if (schema instanceof ZodObject) { + const newShape = {}; + for (const key in schema.shape) { + const fieldSchema = schema.shape[key]; + newShape[key] = ZodOptional.create(deepPartialify(fieldSchema)); + } + return new ZodObject({ + ...schema._def, + shape: () => newShape, }); } - toUpperCase() { - return new ZodString({ - ...this._def, - checks: [...this._def.checks, { kind: "toUpperCase" }], + else if (schema instanceof ZodArray) { + return new ZodArray({ + ...schema._def, + type: deepPartialify(schema.element), }); } - get isDatetime() { - return !!this._def.checks.find((ch) => ch.kind === "datetime"); - } - get isDate() { - return !!this._def.checks.find((ch) => ch.kind === "date"); - } - get isTime() { - return !!this._def.checks.find((ch) => ch.kind === "time"); - } - get isDuration() { - return !!this._def.checks.find((ch) => ch.kind === "duration"); - } - get isEmail() { - return !!this._def.checks.find((ch) => ch.kind === "email"); - } - get isURL() { - return !!this._def.checks.find((ch) => ch.kind === "url"); - } - get isEmoji() { - return !!this._def.checks.find((ch) => ch.kind === "emoji"); - } - get isUUID() { - return !!this._def.checks.find((ch) => ch.kind === "uuid"); - } - get isNANOID() { - return !!this._def.checks.find((ch) => ch.kind === "nanoid"); - } - get isCUID() { - return !!this._def.checks.find((ch) => ch.kind === "cuid"); - } - get isCUID2() { - return !!this._def.checks.find((ch) => ch.kind === "cuid2"); - } - get isULID() { - return !!this._def.checks.find((ch) => ch.kind === "ulid"); - } - get isIP() { - return !!this._def.checks.find((ch) => ch.kind === "ip"); - } - get isCIDR() { - return !!this._def.checks.find((ch) => ch.kind === "cidr"); - } - get isBase64() { - return !!this._def.checks.find((ch) => ch.kind === "base64"); + else if (schema instanceof ZodOptional) { + return ZodOptional.create(deepPartialify(schema.unwrap())); } - get isBase64url() { - // base64url encoding is a modification of base64 that can safely be used in URLs and filenames - return !!this._def.checks.find((ch) => ch.kind === "base64url"); + else if (schema instanceof ZodNullable) { + return ZodNullable.create(deepPartialify(schema.unwrap())); } - get minLength() { - let min = null; - for (const ch of this._def.checks) { - if (ch.kind === "min") { - if (min === null || ch.value > min) - min = ch.value; - } - } - return min; + else if (schema instanceof ZodTuple) { + return ZodTuple.create(schema.items.map((item) => deepPartialify(item))); } - get maxLength() { - let max = null; - for (const ch of this._def.checks) { - if (ch.kind === "max") { - if (max === null || ch.value < max) - max = ch.value; - } - } - return max; + else { + return schema; } } -ZodString.create = (params) => { - var _a; - return new ZodString({ - checks: [], - typeName: ZodFirstPartyTypeKind.ZodString, - coerce: (_a = params === null || params === void 0 ? void 0 : params.coerce) !== null && _a !== void 0 ? _a : false, - ...processCreateParams(params), - }); -}; -// https://stackoverflow.com/questions/3966484/why-does-modulus-operator-return-fractional-number-in-javascript/31711034#31711034 -function floatSafeRemainder(val, step) { - const valDecCount = (val.toString().split(".")[1] || "").length; - const stepDecCount = (step.toString().split(".")[1] || "").length; - const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount; - const valInt = parseInt(val.toFixed(decCount).replace(".", "")); - const stepInt = parseInt(step.toFixed(decCount).replace(".", "")); - return (valInt % stepInt) / Math.pow(10, decCount); -} -class ZodNumber extends ZodType { +class ZodObject extends ZodType { constructor() { super(...arguments); - this.min = this.gte; - this.max = this.lte; - this.step = this.multipleOf; + this._cached = null; + /** + * @deprecated In most cases, this is no longer needed - unknown properties are now silently stripped. + * If you want to pass through unknown properties, use `.passthrough()` instead. + */ + this.nonstrict = this.passthrough; + // extend< + // Augmentation extends ZodRawShape, + // NewOutput extends util.flatten<{ + // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation + // ? Augmentation[k]["_output"] + // : k extends keyof Output + // ? Output[k] + // : never; + // }>, + // NewInput extends util.flatten<{ + // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation + // ? Augmentation[k]["_input"] + // : k extends keyof Input + // ? Input[k] + // : never; + // }> + // >( + // augmentation: Augmentation + // ): ZodObject< + // extendShape, + // UnknownKeys, + // Catchall, + // NewOutput, + // NewInput + // > { + // return new ZodObject({ + // ...this._def, + // shape: () => ({ + // ...this._def.shape(), + // ...augmentation, + // }), + // }) as any; + // } + /** + * @deprecated Use `.extend` instead + * */ + this.augment = this.extend; + } + _getCached() { + if (this._cached !== null) + return this._cached; + const shape = this._def.shape(); + const keys = util.objectKeys(shape); + return (this._cached = { shape, keys }); } _parse(input) { - if (this._def.coerce) { - input.data = Number(input.data); - } const parsedType = this._getType(input); - if (parsedType !== ZodParsedType.number) { + if (parsedType !== ZodParsedType.object) { const ctx = this._getOrReturnCtx(input); addIssueToContext(ctx, { code: ZodIssueCode.invalid_type, - expected: ZodParsedType.number, + expected: ZodParsedType.object, received: ctx.parsedType, }); return INVALID; } - let ctx = undefined; - const status = new ParseStatus(); - for (const check of this._def.checks) { - if (check.kind === "int") { - if (!util.isInteger(input.data)) { - ctx = this._getOrReturnCtx(input, ctx); - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_type, - expected: "integer", - received: "float", - message: check.message, - }); - status.dirty(); - } - } - else if (check.kind === "min") { - const tooSmall = check.inclusive - ? input.data < check.value - : input.data <= check.value; - if (tooSmall) { - ctx = this._getOrReturnCtx(input, ctx); - addIssueToContext(ctx, { - code: ZodIssueCode.too_small, - minimum: check.value, - type: "number", - inclusive: check.inclusive, - exact: false, - message: check.message, - }); - status.dirty(); - } - } - else if (check.kind === "max") { - const tooBig = check.inclusive - ? input.data > check.value - : input.data >= check.value; - if (tooBig) { - ctx = this._getOrReturnCtx(input, ctx); - addIssueToContext(ctx, { - code: ZodIssueCode.too_big, - maximum: check.value, - type: "number", - inclusive: check.inclusive, - exact: false, - message: check.message, - }); - status.dirty(); + const { status, ctx } = this._processInputParams(input); + const { shape, keys: shapeKeys } = this._getCached(); + const extraKeys = []; + if (!(this._def.catchall instanceof ZodNever && + this._def.unknownKeys === "strip")) { + for (const key in ctx.data) { + if (!shapeKeys.includes(key)) { + extraKeys.push(key); } } - else if (check.kind === "multipleOf") { - if (floatSafeRemainder(input.data, check.value) !== 0) { - ctx = this._getOrReturnCtx(input, ctx); - addIssueToContext(ctx, { - code: ZodIssueCode.not_multiple_of, - multipleOf: check.value, - message: check.message, + } + const pairs = []; + for (const key of shapeKeys) { + const keyValidator = shape[key]; + const value = ctx.data[key]; + pairs.push({ + key: { status: "valid", value: key }, + value: keyValidator._parse(new ParseInputLazyPath(ctx, value, ctx.path, key)), + alwaysSet: key in ctx.data, + }); + } + if (this._def.catchall instanceof ZodNever) { + const unknownKeys = this._def.unknownKeys; + if (unknownKeys === "passthrough") { + for (const key of extraKeys) { + pairs.push({ + key: { status: "valid", value: key }, + value: { status: "valid", value: ctx.data[key] }, }); - status.dirty(); } } - else if (check.kind === "finite") { - if (!Number.isFinite(input.data)) { - ctx = this._getOrReturnCtx(input, ctx); + else if (unknownKeys === "strict") { + if (extraKeys.length > 0) { addIssueToContext(ctx, { - code: ZodIssueCode.not_finite, - message: check.message, + code: ZodIssueCode.unrecognized_keys, + keys: extraKeys, }); status.dirty(); } } + else if (unknownKeys === "strip") ; else { - util.assertNever(check); + throw new Error(`Internal ZodObject error: invalid unknownKeys value.`); } } - return { status: status.value, value: input.data }; - } - gte(value, message) { - return this.setLimit("min", value, true, errorUtil.toString(message)); - } - gt(value, message) { - return this.setLimit("min", value, false, errorUtil.toString(message)); - } - lte(value, message) { - return this.setLimit("max", value, true, errorUtil.toString(message)); + else { + // run catchall validation + const catchall = this._def.catchall; + for (const key of extraKeys) { + const value = ctx.data[key]; + pairs.push({ + key: { status: "valid", value: key }, + value: catchall._parse(new ParseInputLazyPath(ctx, value, ctx.path, key) //, ctx.child(key), value, getParsedType(value) + ), + alwaysSet: key in ctx.data, + }); + } + } + if (ctx.common.async) { + return Promise.resolve() + .then(async () => { + const syncPairs = []; + for (const pair of pairs) { + const key = await pair.key; + const value = await pair.value; + syncPairs.push({ + key, + value, + alwaysSet: pair.alwaysSet, + }); + } + return syncPairs; + }) + .then((syncPairs) => { + return ParseStatus.mergeObjectSync(status, syncPairs); + }); + } + else { + return ParseStatus.mergeObjectSync(status, pairs); + } } - lt(value, message) { - return this.setLimit("max", value, false, errorUtil.toString(message)); + get shape() { + return this._def.shape(); } - setLimit(kind, value, inclusive, message) { - return new ZodNumber({ + strict(message) { + errorUtil.errToObj; + return new ZodObject({ ...this._def, - checks: [ - ...this._def.checks, - { - kind, - value, - inclusive, - message: errorUtil.toString(message), - }, - ], + unknownKeys: "strict", + ...(message !== undefined + ? { + errorMap: (issue, ctx) => { + var _a, _b, _c, _d; + const defaultError = (_c = (_b = (_a = this._def).errorMap) === null || _b === void 0 ? void 0 : _b.call(_a, issue, ctx).message) !== null && _c !== void 0 ? _c : ctx.defaultError; + if (issue.code === "unrecognized_keys") + return { + message: (_d = errorUtil.errToObj(message).message) !== null && _d !== void 0 ? _d : defaultError, + }; + return { + message: defaultError, + }; + }, + } + : {}), }); } - _addCheck(check) { - return new ZodNumber({ + strip() { + return new ZodObject({ ...this._def, - checks: [...this._def.checks, check], + unknownKeys: "strip", }); } - int(message) { - return this._addCheck({ - kind: "int", - message: errorUtil.toString(message), + passthrough() { + return new ZodObject({ + ...this._def, + unknownKeys: "passthrough", }); } - positive(message) { - return this._addCheck({ - kind: "min", - value: 0, - inclusive: false, - message: errorUtil.toString(message), + // const AugmentFactory = + // (def: Def) => + // ( + // augmentation: Augmentation + // ): ZodObject< + // extendShape, Augmentation>, + // Def["unknownKeys"], + // Def["catchall"] + // > => { + // return new ZodObject({ + // ...def, + // shape: () => ({ + // ...def.shape(), + // ...augmentation, + // }), + // }) as any; + // }; + extend(augmentation) { + return new ZodObject({ + ...this._def, + shape: () => ({ + ...this._def.shape(), + ...augmentation, + }), }); } - negative(message) { - return this._addCheck({ - kind: "max", - value: 0, - inclusive: false, - message: errorUtil.toString(message), + /** + * Prior to zod@1.0.12 there was a bug in the + * inferred type of merged objects. Please + * upgrade if you are experiencing issues. + */ + merge(merging) { + const merged = new ZodObject({ + unknownKeys: merging._def.unknownKeys, + catchall: merging._def.catchall, + shape: () => ({ + ...this._def.shape(), + ...merging._def.shape(), + }), + typeName: ZodFirstPartyTypeKind.ZodObject, }); + return merged; } - nonpositive(message) { - return this._addCheck({ - kind: "max", - value: 0, - inclusive: true, - message: errorUtil.toString(message), - }); + // merge< + // Incoming extends AnyZodObject, + // Augmentation extends Incoming["shape"], + // NewOutput extends { + // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation + // ? Augmentation[k]["_output"] + // : k extends keyof Output + // ? Output[k] + // : never; + // }, + // NewInput extends { + // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation + // ? Augmentation[k]["_input"] + // : k extends keyof Input + // ? Input[k] + // : never; + // } + // >( + // merging: Incoming + // ): ZodObject< + // extendShape>, + // Incoming["_def"]["unknownKeys"], + // Incoming["_def"]["catchall"], + // NewOutput, + // NewInput + // > { + // const merged: any = new ZodObject({ + // unknownKeys: merging._def.unknownKeys, + // catchall: merging._def.catchall, + // shape: () => + // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()), + // typeName: ZodFirstPartyTypeKind.ZodObject, + // }) as any; + // return merged; + // } + setKey(key, schema) { + return this.augment({ [key]: schema }); } - nonnegative(message) { - return this._addCheck({ - kind: "min", - value: 0, - inclusive: true, - message: errorUtil.toString(message), + // merge( + // merging: Incoming + // ): //ZodObject = (merging) => { + // ZodObject< + // extendShape>, + // Incoming["_def"]["unknownKeys"], + // Incoming["_def"]["catchall"] + // > { + // // const mergedShape = objectUtil.mergeShapes( + // // this._def.shape(), + // // merging._def.shape() + // // ); + // const merged: any = new ZodObject({ + // unknownKeys: merging._def.unknownKeys, + // catchall: merging._def.catchall, + // shape: () => + // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()), + // typeName: ZodFirstPartyTypeKind.ZodObject, + // }) as any; + // return merged; + // } + catchall(index) { + return new ZodObject({ + ...this._def, + catchall: index, }); } - multipleOf(value, message) { - return this._addCheck({ - kind: "multipleOf", - value: value, - message: errorUtil.toString(message), + pick(mask) { + const shape = {}; + util.objectKeys(mask).forEach((key) => { + if (mask[key] && this.shape[key]) { + shape[key] = this.shape[key]; + } }); - } - finite(message) { - return this._addCheck({ - kind: "finite", - message: errorUtil.toString(message), + return new ZodObject({ + ...this._def, + shape: () => shape, }); } - safe(message) { - return this._addCheck({ - kind: "min", - inclusive: true, - value: Number.MIN_SAFE_INTEGER, - message: errorUtil.toString(message), - })._addCheck({ - kind: "max", - inclusive: true, - value: Number.MAX_SAFE_INTEGER, - message: errorUtil.toString(message), + omit(mask) { + const shape = {}; + util.objectKeys(this.shape).forEach((key) => { + if (!mask[key]) { + shape[key] = this.shape[key]; + } + }); + return new ZodObject({ + ...this._def, + shape: () => shape, }); } - get minValue() { - let min = null; - for (const ch of this._def.checks) { - if (ch.kind === "min") { - if (min === null || ch.value > min) - min = ch.value; - } - } - return min; + /** + * @deprecated + */ + deepPartial() { + return deepPartialify(this); } - get maxValue() { - let max = null; - for (const ch of this._def.checks) { - if (ch.kind === "max") { - if (max === null || ch.value < max) - max = ch.value; + partial(mask) { + const newShape = {}; + util.objectKeys(this.shape).forEach((key) => { + const fieldSchema = this.shape[key]; + if (mask && !mask[key]) { + newShape[key] = fieldSchema; } - } - return max; - } - get isInt() { - return !!this._def.checks.find((ch) => ch.kind === "int" || - (ch.kind === "multipleOf" && util.isInteger(ch.value))); - } - get isFinite() { - let max = null, min = null; - for (const ch of this._def.checks) { - if (ch.kind === "finite" || - ch.kind === "int" || - ch.kind === "multipleOf") { - return true; + else { + newShape[key] = fieldSchema.optional(); } - else if (ch.kind === "min") { - if (min === null || ch.value > min) - min = ch.value; + }); + return new ZodObject({ + ...this._def, + shape: () => newShape, + }); + } + required(mask) { + const newShape = {}; + util.objectKeys(this.shape).forEach((key) => { + if (mask && !mask[key]) { + newShape[key] = this.shape[key]; } - else if (ch.kind === "max") { - if (max === null || ch.value < max) - max = ch.value; + else { + const fieldSchema = this.shape[key]; + let newField = fieldSchema; + while (newField instanceof ZodOptional) { + newField = newField._def.innerType; + } + newShape[key] = newField; } - } - return Number.isFinite(min) && Number.isFinite(max); + }); + return new ZodObject({ + ...this._def, + shape: () => newShape, + }); + } + keyof() { + return createZodEnum(util.objectKeys(this.shape)); } } -ZodNumber.create = (params) => { - return new ZodNumber({ - checks: [], - typeName: ZodFirstPartyTypeKind.ZodNumber, - coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false, +ZodObject.create = (shape, params) => { + return new ZodObject({ + shape: () => shape, + unknownKeys: "strip", + catchall: ZodNever.create(), + typeName: ZodFirstPartyTypeKind.ZodObject, ...processCreateParams(params), }); }; -class ZodBigInt extends ZodType { - constructor() { - super(...arguments); - this.min = this.gte; - this.max = this.lte; - } +ZodObject.strictCreate = (shape, params) => { + return new ZodObject({ + shape: () => shape, + unknownKeys: "strict", + catchall: ZodNever.create(), + typeName: ZodFirstPartyTypeKind.ZodObject, + ...processCreateParams(params), + }); +}; +ZodObject.lazycreate = (shape, params) => { + return new ZodObject({ + shape, + unknownKeys: "strip", + catchall: ZodNever.create(), + typeName: ZodFirstPartyTypeKind.ZodObject, + ...processCreateParams(params), + }); +}; +class ZodUnion extends ZodType { _parse(input) { - if (this._def.coerce) { - try { - input.data = BigInt(input.data); + const { ctx } = this._processInputParams(input); + const options = this._def.options; + function handleResults(results) { + // return first issue-free validation if it exists + for (const result of results) { + if (result.result.status === "valid") { + return result.result; + } } - catch (_a) { - return this._getInvalidInput(input); + for (const result of results) { + if (result.result.status === "dirty") { + // add issues from dirty option + ctx.common.issues.push(...result.ctx.common.issues); + return result.result; + } } + // return invalid + const unionErrors = results.map((result) => new ZodError(result.ctx.common.issues)); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_union, + unionErrors, + }); + return INVALID; } - const parsedType = this._getType(input); - if (parsedType !== ZodParsedType.bigint) { - return this._getInvalidInput(input); + if (ctx.common.async) { + return Promise.all(options.map(async (option) => { + const childCtx = { + ...ctx, + common: { + ...ctx.common, + issues: [], + }, + parent: null, + }; + return { + result: await option._parseAsync({ + data: ctx.data, + path: ctx.path, + parent: childCtx, + }), + ctx: childCtx, + }; + })).then(handleResults); } - let ctx = undefined; - const status = new ParseStatus(); - for (const check of this._def.checks) { - if (check.kind === "min") { - const tooSmall = check.inclusive - ? input.data < check.value - : input.data <= check.value; - if (tooSmall) { - ctx = this._getOrReturnCtx(input, ctx); - addIssueToContext(ctx, { - code: ZodIssueCode.too_small, - type: "bigint", - minimum: check.value, - inclusive: check.inclusive, - message: check.message, - }); - status.dirty(); + else { + let dirty = undefined; + const issues = []; + for (const option of options) { + const childCtx = { + ...ctx, + common: { + ...ctx.common, + issues: [], + }, + parent: null, + }; + const result = option._parseSync({ + data: ctx.data, + path: ctx.path, + parent: childCtx, + }); + if (result.status === "valid") { + return result; } - } - else if (check.kind === "max") { - const tooBig = check.inclusive - ? input.data > check.value - : input.data >= check.value; - if (tooBig) { - ctx = this._getOrReturnCtx(input, ctx); - addIssueToContext(ctx, { - code: ZodIssueCode.too_big, - type: "bigint", - maximum: check.value, - inclusive: check.inclusive, - message: check.message, - }); - status.dirty(); + else if (result.status === "dirty" && !dirty) { + dirty = { result, ctx: childCtx }; } - } - else if (check.kind === "multipleOf") { - if (input.data % check.value !== BigInt(0)) { - ctx = this._getOrReturnCtx(input, ctx); - addIssueToContext(ctx, { - code: ZodIssueCode.not_multiple_of, - multipleOf: check.value, - message: check.message, - }); - status.dirty(); + if (childCtx.common.issues.length) { + issues.push(childCtx.common.issues); } } - else { - util.assertNever(check); + if (dirty) { + ctx.common.issues.push(...dirty.ctx.common.issues); + return dirty.result; } - } - return { status: status.value, value: input.data }; - } - _getInvalidInput(input) { - const ctx = this._getOrReturnCtx(input); - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_type, - expected: ZodParsedType.bigint, - received: ctx.parsedType, - }); - return INVALID; + const unionErrors = issues.map((issues) => new ZodError(issues)); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_union, + unionErrors, + }); + return INVALID; + } } - gte(value, message) { - return this.setLimit("min", value, true, errorUtil.toString(message)); + get options() { + return this._def.options; } - gt(value, message) { - return this.setLimit("min", value, false, errorUtil.toString(message)); +} +ZodUnion.create = (types, params) => { + return new ZodUnion({ + options: types, + typeName: ZodFirstPartyTypeKind.ZodUnion, + ...processCreateParams(params), + }); +}; +///////////////////////////////////////////////////// +///////////////////////////////////////////////////// +////////// ////////// +////////// ZodDiscriminatedUnion ////////// +////////// ////////// +///////////////////////////////////////////////////// +///////////////////////////////////////////////////// +const getDiscriminator = (type) => { + if (type instanceof ZodLazy) { + return getDiscriminator(type.schema); } - lte(value, message) { - return this.setLimit("max", value, true, errorUtil.toString(message)); + else if (type instanceof ZodEffects) { + return getDiscriminator(type.innerType()); } - lt(value, message) { - return this.setLimit("max", value, false, errorUtil.toString(message)); + else if (type instanceof ZodLiteral) { + return [type.value]; } - setLimit(kind, value, inclusive, message) { - return new ZodBigInt({ - ...this._def, - checks: [ - ...this._def.checks, - { - kind, - value, - inclusive, - message: errorUtil.toString(message), - }, - ], - }); + else if (type instanceof ZodEnum) { + return type.options; } - _addCheck(check) { - return new ZodBigInt({ - ...this._def, - checks: [...this._def.checks, check], - }); + else if (type instanceof ZodNativeEnum) { + // eslint-disable-next-line ban/ban + return util.objectValues(type.enum); } - positive(message) { - return this._addCheck({ - kind: "min", - value: BigInt(0), - inclusive: false, - message: errorUtil.toString(message), - }); + else if (type instanceof ZodDefault) { + return getDiscriminator(type._def.innerType); } - negative(message) { - return this._addCheck({ - kind: "max", - value: BigInt(0), - inclusive: false, - message: errorUtil.toString(message), - }); + else if (type instanceof ZodUndefined) { + return [undefined]; } - nonpositive(message) { - return this._addCheck({ - kind: "max", - value: BigInt(0), - inclusive: true, - message: errorUtil.toString(message), - }); + else if (type instanceof ZodNull) { + return [null]; } - nonnegative(message) { - return this._addCheck({ - kind: "min", - value: BigInt(0), - inclusive: true, - message: errorUtil.toString(message), - }); + else if (type instanceof ZodOptional) { + return [undefined, ...getDiscriminator(type.unwrap())]; } - multipleOf(value, message) { - return this._addCheck({ - kind: "multipleOf", - value, - message: errorUtil.toString(message), - }); + else if (type instanceof ZodNullable) { + return [null, ...getDiscriminator(type.unwrap())]; } - get minValue() { - let min = null; - for (const ch of this._def.checks) { - if (ch.kind === "min") { - if (min === null || ch.value > min) - min = ch.value; - } - } - return min; + else if (type instanceof ZodBranded) { + return getDiscriminator(type.unwrap()); } - get maxValue() { - let max = null; - for (const ch of this._def.checks) { - if (ch.kind === "max") { - if (max === null || ch.value < max) - max = ch.value; - } - } - return max; + else if (type instanceof ZodReadonly) { + return getDiscriminator(type.unwrap()); + } + else if (type instanceof ZodCatch) { + return getDiscriminator(type._def.innerType); + } + else { + return []; } -} -ZodBigInt.create = (params) => { - var _a; - return new ZodBigInt({ - checks: [], - typeName: ZodFirstPartyTypeKind.ZodBigInt, - coerce: (_a = params === null || params === void 0 ? void 0 : params.coerce) !== null && _a !== void 0 ? _a : false, - ...processCreateParams(params), - }); }; -class ZodBoolean extends ZodType { +class ZodDiscriminatedUnion extends ZodType { _parse(input) { - if (this._def.coerce) { - input.data = Boolean(input.data); - } - const parsedType = this._getType(input); - if (parsedType !== ZodParsedType.boolean) { - const ctx = this._getOrReturnCtx(input); + const { ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.object) { addIssueToContext(ctx, { code: ZodIssueCode.invalid_type, - expected: ZodParsedType.boolean, + expected: ZodParsedType.object, received: ctx.parsedType, }); return INVALID; } - return OK(input.data); - } -} -ZodBoolean.create = (params) => { - return new ZodBoolean({ - typeName: ZodFirstPartyTypeKind.ZodBoolean, - coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false, - ...processCreateParams(params), - }); -}; -class ZodDate extends ZodType { - _parse(input) { - if (this._def.coerce) { - input.data = new Date(input.data); - } - const parsedType = this._getType(input); - if (parsedType !== ZodParsedType.date) { - const ctx = this._getOrReturnCtx(input); + const discriminator = this.discriminator; + const discriminatorValue = ctx.data[discriminator]; + const option = this.optionsMap.get(discriminatorValue); + if (!option) { addIssueToContext(ctx, { - code: ZodIssueCode.invalid_type, - expected: ZodParsedType.date, - received: ctx.parsedType, + code: ZodIssueCode.invalid_union_discriminator, + options: Array.from(this.optionsMap.keys()), + path: [discriminator], }); return INVALID; } - if (isNaN(input.data.getTime())) { - const ctx = this._getOrReturnCtx(input); - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_date, + if (ctx.common.async) { + return option._parseAsync({ + data: ctx.data, + path: ctx.path, + parent: ctx, }); - return INVALID; } - const status = new ParseStatus(); - let ctx = undefined; - for (const check of this._def.checks) { - if (check.kind === "min") { - if (input.data.getTime() < check.value) { - ctx = this._getOrReturnCtx(input, ctx); - addIssueToContext(ctx, { - code: ZodIssueCode.too_small, - message: check.message, - inclusive: true, - exact: false, - minimum: check.value, - type: "date", - }); - status.dirty(); - } + else { + return option._parseSync({ + data: ctx.data, + path: ctx.path, + parent: ctx, + }); + } + } + get discriminator() { + return this._def.discriminator; + } + get options() { + return this._def.options; + } + get optionsMap() { + return this._def.optionsMap; + } + /** + * The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor. + * However, it only allows a union of objects, all of which need to share a discriminator property. This property must + * have a different value for each object in the union. + * @param discriminator the name of the discriminator property + * @param types an array of object schemas + * @param params + */ + static create(discriminator, options, params) { + // Get all the valid discriminator values + const optionsMap = new Map(); + // try { + for (const type of options) { + const discriminatorValues = getDiscriminator(type.shape[discriminator]); + if (!discriminatorValues.length) { + throw new Error(`A discriminator value for key \`${discriminator}\` could not be extracted from all schema options`); } - else if (check.kind === "max") { - if (input.data.getTime() > check.value) { - ctx = this._getOrReturnCtx(input, ctx); - addIssueToContext(ctx, { - code: ZodIssueCode.too_big, - message: check.message, - inclusive: true, - exact: false, - maximum: check.value, - type: "date", - }); - status.dirty(); + for (const value of discriminatorValues) { + if (optionsMap.has(value)) { + throw new Error(`Discriminator property ${String(discriminator)} has duplicate value ${String(value)}`); } - } - else { - util.assertNever(check); + optionsMap.set(value, type); } } - return { - status: status.value, - value: new Date(input.data.getTime()), - }; - } - _addCheck(check) { - return new ZodDate({ - ...this._def, - checks: [...this._def.checks, check], - }); - } - min(minDate, message) { - return this._addCheck({ - kind: "min", - value: minDate.getTime(), - message: errorUtil.toString(message), + return new ZodDiscriminatedUnion({ + typeName: ZodFirstPartyTypeKind.ZodDiscriminatedUnion, + discriminator, + options, + optionsMap, + ...processCreateParams(params), }); } - max(maxDate, message) { - return this._addCheck({ - kind: "max", - value: maxDate.getTime(), - message: errorUtil.toString(message), - }); +} +function mergeValues(a, b) { + const aType = getParsedType(a); + const bType = getParsedType(b); + if (a === b) { + return { valid: true, data: a }; } - get minDate() { - let min = null; - for (const ch of this._def.checks) { - if (ch.kind === "min") { - if (min === null || ch.value > min) - min = ch.value; + else if (aType === ZodParsedType.object && bType === ZodParsedType.object) { + const bKeys = util.objectKeys(b); + const sharedKeys = util + .objectKeys(a) + .filter((key) => bKeys.indexOf(key) !== -1); + const newObj = { ...a, ...b }; + for (const key of sharedKeys) { + const sharedValue = mergeValues(a[key], b[key]); + if (!sharedValue.valid) { + return { valid: false }; } + newObj[key] = sharedValue.data; } - return min != null ? new Date(min) : null; + return { valid: true, data: newObj }; } - get maxDate() { - let max = null; - for (const ch of this._def.checks) { - if (ch.kind === "max") { - if (max === null || ch.value < max) - max = ch.value; + else if (aType === ZodParsedType.array && bType === ZodParsedType.array) { + if (a.length !== b.length) { + return { valid: false }; + } + const newArray = []; + for (let index = 0; index < a.length; index++) { + const itemA = a[index]; + const itemB = b[index]; + const sharedValue = mergeValues(itemA, itemB); + if (!sharedValue.valid) { + return { valid: false }; } + newArray.push(sharedValue.data); } - return max != null ? new Date(max) : null; + return { valid: true, data: newArray }; + } + else if (aType === ZodParsedType.date && + bType === ZodParsedType.date && + +a === +b) { + return { valid: true, data: a }; + } + else { + return { valid: false }; } } -ZodDate.create = (params) => { - return new ZodDate({ - checks: [], - coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false, - typeName: ZodFirstPartyTypeKind.ZodDate, - ...processCreateParams(params), - }); -}; -class ZodSymbol extends ZodType { +class ZodIntersection extends ZodType { _parse(input) { - const parsedType = this._getType(input); - if (parsedType !== ZodParsedType.symbol) { - const ctx = this._getOrReturnCtx(input); - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_type, - expected: ZodParsedType.symbol, - received: ctx.parsedType, - }); - return INVALID; + const { status, ctx } = this._processInputParams(input); + const handleParsed = (parsedLeft, parsedRight) => { + if (isAborted(parsedLeft) || isAborted(parsedRight)) { + return INVALID; + } + const merged = mergeValues(parsedLeft.value, parsedRight.value); + if (!merged.valid) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_intersection_types, + }); + return INVALID; + } + if (isDirty(parsedLeft) || isDirty(parsedRight)) { + status.dirty(); + } + return { status: status.value, value: merged.data }; + }; + if (ctx.common.async) { + return Promise.all([ + this._def.left._parseAsync({ + data: ctx.data, + path: ctx.path, + parent: ctx, + }), + this._def.right._parseAsync({ + data: ctx.data, + path: ctx.path, + parent: ctx, + }), + ]).then(([left, right]) => handleParsed(left, right)); + } + else { + return handleParsed(this._def.left._parseSync({ + data: ctx.data, + path: ctx.path, + parent: ctx, + }), this._def.right._parseSync({ + data: ctx.data, + path: ctx.path, + parent: ctx, + })); } - return OK(input.data); } } -ZodSymbol.create = (params) => { - return new ZodSymbol({ - typeName: ZodFirstPartyTypeKind.ZodSymbol, +ZodIntersection.create = (left, right, params) => { + return new ZodIntersection({ + left: left, + right: right, + typeName: ZodFirstPartyTypeKind.ZodIntersection, ...processCreateParams(params), }); }; -class ZodUndefined extends ZodType { +class ZodTuple extends ZodType { _parse(input) { - const parsedType = this._getType(input); - if (parsedType !== ZodParsedType.undefined) { - const ctx = this._getOrReturnCtx(input); + const { status, ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.array) { addIssueToContext(ctx, { code: ZodIssueCode.invalid_type, - expected: ZodParsedType.undefined, + expected: ZodParsedType.array, received: ctx.parsedType, }); return INVALID; } - return OK(input.data); - } -} -ZodUndefined.create = (params) => { - return new ZodUndefined({ - typeName: ZodFirstPartyTypeKind.ZodUndefined, - ...processCreateParams(params), - }); -}; -class ZodNull extends ZodType { - _parse(input) { - const parsedType = this._getType(input); - if (parsedType !== ZodParsedType.null) { - const ctx = this._getOrReturnCtx(input); + if (ctx.data.length < this._def.items.length) { addIssueToContext(ctx, { - code: ZodIssueCode.invalid_type, - expected: ZodParsedType.null, - received: ctx.parsedType, + code: ZodIssueCode.too_small, + minimum: this._def.items.length, + inclusive: true, + exact: false, + type: "array", }); return INVALID; } - return OK(input.data); + const rest = this._def.rest; + if (!rest && ctx.data.length > this._def.items.length) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + maximum: this._def.items.length, + inclusive: true, + exact: false, + type: "array", + }); + status.dirty(); + } + const items = [...ctx.data] + .map((item, itemIndex) => { + const schema = this._def.items[itemIndex] || this._def.rest; + if (!schema) + return null; + return schema._parse(new ParseInputLazyPath(ctx, item, ctx.path, itemIndex)); + }) + .filter((x) => !!x); // filter nulls + if (ctx.common.async) { + return Promise.all(items).then((results) => { + return ParseStatus.mergeArray(status, results); + }); + } + else { + return ParseStatus.mergeArray(status, items); + } } -} -ZodNull.create = (params) => { - return new ZodNull({ - typeName: ZodFirstPartyTypeKind.ZodNull, - ...processCreateParams(params), - }); -}; -class ZodAny extends ZodType { - constructor() { - super(...arguments); - // to prevent instances of other classes from extending ZodAny. this causes issues with catchall in ZodObject. - this._any = true; + get items() { + return this._def.items; } - _parse(input) { - return OK(input.data); + rest(rest) { + return new ZodTuple({ + ...this._def, + rest, + }); } } -ZodAny.create = (params) => { - return new ZodAny({ - typeName: ZodFirstPartyTypeKind.ZodAny, - ...processCreateParams(params), - }); -}; -class ZodUnknown extends ZodType { - constructor() { - super(...arguments); - // required - this._unknown = true; - } - _parse(input) { - return OK(input.data); +ZodTuple.create = (schemas, params) => { + if (!Array.isArray(schemas)) { + throw new Error("You must pass an array of schemas to z.tuple([ ... ])"); } -} -ZodUnknown.create = (params) => { - return new ZodUnknown({ - typeName: ZodFirstPartyTypeKind.ZodUnknown, + return new ZodTuple({ + items: schemas, + typeName: ZodFirstPartyTypeKind.ZodTuple, + rest: null, ...processCreateParams(params), }); }; -class ZodNever extends ZodType { +class ZodRecord extends ZodType { + get keySchema() { + return this._def.keyType; + } + get valueSchema() { + return this._def.valueType; + } _parse(input) { - const ctx = this._getOrReturnCtx(input); - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_type, - expected: ZodParsedType.never, - received: ctx.parsedType, + const { status, ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.object) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.object, + received: ctx.parsedType, + }); + return INVALID; + } + const pairs = []; + const keyType = this._def.keyType; + const valueType = this._def.valueType; + for (const key in ctx.data) { + pairs.push({ + key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, key)), + value: valueType._parse(new ParseInputLazyPath(ctx, ctx.data[key], ctx.path, key)), + alwaysSet: key in ctx.data, + }); + } + if (ctx.common.async) { + return ParseStatus.mergeObjectAsync(status, pairs); + } + else { + return ParseStatus.mergeObjectSync(status, pairs); + } + } + get element() { + return this._def.valueType; + } + static create(first, second, third) { + if (second instanceof ZodType) { + return new ZodRecord({ + keyType: first, + valueType: second, + typeName: ZodFirstPartyTypeKind.ZodRecord, + ...processCreateParams(third), + }); + } + return new ZodRecord({ + keyType: ZodString.create(), + valueType: first, + typeName: ZodFirstPartyTypeKind.ZodRecord, + ...processCreateParams(second), }); - return INVALID; } } -ZodNever.create = (params) => { - return new ZodNever({ - typeName: ZodFirstPartyTypeKind.ZodNever, - ...processCreateParams(params), - }); -}; -class ZodVoid extends ZodType { +class ZodMap extends ZodType { + get keySchema() { + return this._def.keyType; + } + get valueSchema() { + return this._def.valueType; + } _parse(input) { - const parsedType = this._getType(input); - if (parsedType !== ZodParsedType.undefined) { - const ctx = this._getOrReturnCtx(input); + const { status, ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.map) { addIssueToContext(ctx, { code: ZodIssueCode.invalid_type, - expected: ZodParsedType.void, + expected: ZodParsedType.map, received: ctx.parsedType, }); return INVALID; } - return OK(input.data); + const keyType = this._def.keyType; + const valueType = this._def.valueType; + const pairs = [...ctx.data.entries()].map(([key, value], index) => { + return { + key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, [index, "key"])), + value: valueType._parse(new ParseInputLazyPath(ctx, value, ctx.path, [index, "value"])), + }; + }); + if (ctx.common.async) { + const finalMap = new Map(); + return Promise.resolve().then(async () => { + for (const pair of pairs) { + const key = await pair.key; + const value = await pair.value; + if (key.status === "aborted" || value.status === "aborted") { + return INVALID; + } + if (key.status === "dirty" || value.status === "dirty") { + status.dirty(); + } + finalMap.set(key.value, value.value); + } + return { status: status.value, value: finalMap }; + }); + } + else { + const finalMap = new Map(); + for (const pair of pairs) { + const key = pair.key; + const value = pair.value; + if (key.status === "aborted" || value.status === "aborted") { + return INVALID; + } + if (key.status === "dirty" || value.status === "dirty") { + status.dirty(); + } + finalMap.set(key.value, value.value); + } + return { status: status.value, value: finalMap }; + } } } -ZodVoid.create = (params) => { - return new ZodVoid({ - typeName: ZodFirstPartyTypeKind.ZodVoid, +ZodMap.create = (keyType, valueType, params) => { + return new ZodMap({ + valueType, + keyType, + typeName: ZodFirstPartyTypeKind.ZodMap, ...processCreateParams(params), }); }; -class ZodArray extends ZodType { +class ZodSet extends ZodType { _parse(input) { - const { ctx, status } = this._processInputParams(input); - const def = this._def; - if (ctx.parsedType !== ZodParsedType.array) { + const { status, ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.set) { addIssueToContext(ctx, { code: ZodIssueCode.invalid_type, - expected: ZodParsedType.array, + expected: ZodParsedType.set, received: ctx.parsedType, }); return INVALID; } - if (def.exactLength !== null) { - const tooBig = ctx.data.length > def.exactLength.value; - const tooSmall = ctx.data.length < def.exactLength.value; - if (tooBig || tooSmall) { - addIssueToContext(ctx, { - code: tooBig ? ZodIssueCode.too_big : ZodIssueCode.too_small, - minimum: (tooSmall ? def.exactLength.value : undefined), - maximum: (tooBig ? def.exactLength.value : undefined), - type: "array", - inclusive: true, - exact: true, - message: def.exactLength.message, - }); - status.dirty(); - } - } - if (def.minLength !== null) { - if (ctx.data.length < def.minLength.value) { + const def = this._def; + if (def.minSize !== null) { + if (ctx.data.size < def.minSize.value) { addIssueToContext(ctx, { code: ZodIssueCode.too_small, - minimum: def.minLength.value, - type: "array", + minimum: def.minSize.value, + type: "set", inclusive: true, exact: false, - message: def.minLength.message, + message: def.minSize.message, }); status.dirty(); } } - if (def.maxLength !== null) { - if (ctx.data.length > def.maxLength.value) { + if (def.maxSize !== null) { + if (ctx.data.size > def.maxSize.value) { addIssueToContext(ctx, { code: ZodIssueCode.too_big, - maximum: def.maxLength.value, - type: "array", + maximum: def.maxSize.value, + type: "set", inclusive: true, exact: false, - message: def.maxLength.message, + message: def.maxSize.message, }); status.dirty(); } } + const valueType = this._def.valueType; + function finalizeSet(elements) { + const parsedSet = new Set(); + for (const element of elements) { + if (element.status === "aborted") + return INVALID; + if (element.status === "dirty") + status.dirty(); + parsedSet.add(element.value); + } + return { status: status.value, value: parsedSet }; + } + const elements = [...ctx.data.values()].map((item, i) => valueType._parse(new ParseInputLazyPath(ctx, item, ctx.path, i))); if (ctx.common.async) { - return Promise.all([...ctx.data].map((item, i) => { - return def.type._parseAsync(new ParseInputLazyPath(ctx, item, ctx.path, i)); - })).then((result) => { - return ParseStatus.mergeArray(status, result); - }); + return Promise.all(elements).then((elements) => finalizeSet(elements)); + } + else { + return finalizeSet(elements); } - const result = [...ctx.data].map((item, i) => { - return def.type._parseSync(new ParseInputLazyPath(ctx, item, ctx.path, i)); - }); - return ParseStatus.mergeArray(status, result); - } - get element() { - return this._def.type; } - min(minLength, message) { - return new ZodArray({ + min(minSize, message) { + return new ZodSet({ ...this._def, - minLength: { value: minLength, message: errorUtil.toString(message) }, + minSize: { value: minSize, message: errorUtil.toString(message) }, }); } - max(maxLength, message) { - return new ZodArray({ + max(maxSize, message) { + return new ZodSet({ ...this._def, - maxLength: { value: maxLength, message: errorUtil.toString(message) }, + maxSize: { value: maxSize, message: errorUtil.toString(message) }, }); } - length(len, message) { - return new ZodArray({ - ...this._def, - exactLength: { value: len, message: errorUtil.toString(message) }, - }); + size(size, message) { + return this.min(size, message).max(size, message); } nonempty(message) { return this.min(1, message); } } -ZodArray.create = (schema, params) => { - return new ZodArray({ - type: schema, - minLength: null, - maxLength: null, - exactLength: null, - typeName: ZodFirstPartyTypeKind.ZodArray, +ZodSet.create = (valueType, params) => { + return new ZodSet({ + valueType, + minSize: null, + maxSize: null, + typeName: ZodFirstPartyTypeKind.ZodSet, ...processCreateParams(params), }); }; -function deepPartialify(schema) { - if (schema instanceof ZodObject) { - const newShape = {}; - for (const key in schema.shape) { - const fieldSchema = schema.shape[key]; - newShape[key] = ZodOptional.create(deepPartialify(fieldSchema)); - } - return new ZodObject({ - ...schema._def, - shape: () => newShape, - }); - } - else if (schema instanceof ZodArray) { - return new ZodArray({ - ...schema._def, - type: deepPartialify(schema.element), - }); - } - else if (schema instanceof ZodOptional) { - return ZodOptional.create(deepPartialify(schema.unwrap())); - } - else if (schema instanceof ZodNullable) { - return ZodNullable.create(deepPartialify(schema.unwrap())); - } - else if (schema instanceof ZodTuple) { - return ZodTuple.create(schema.items.map((item) => deepPartialify(item))); - } - else { - return schema; - } -} -class ZodObject extends ZodType { +class ZodFunction extends ZodType { constructor() { super(...arguments); - this._cached = null; - /** - * @deprecated In most cases, this is no longer needed - unknown properties are now silently stripped. - * If you want to pass through unknown properties, use `.passthrough()` instead. - */ - this.nonstrict = this.passthrough; - // extend< - // Augmentation extends ZodRawShape, - // NewOutput extends util.flatten<{ - // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation - // ? Augmentation[k]["_output"] - // : k extends keyof Output - // ? Output[k] - // : never; - // }>, - // NewInput extends util.flatten<{ - // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation - // ? Augmentation[k]["_input"] - // : k extends keyof Input - // ? Input[k] - // : never; - // }> - // >( - // augmentation: Augmentation - // ): ZodObject< - // extendShape, - // UnknownKeys, - // Catchall, - // NewOutput, - // NewInput - // > { - // return new ZodObject({ - // ...this._def, - // shape: () => ({ - // ...this._def.shape(), - // ...augmentation, - // }), - // }) as any; - // } - /** - * @deprecated Use `.extend` instead - * */ - this.augment = this.extend; - } - _getCached() { - if (this._cached !== null) - return this._cached; - const shape = this._def.shape(); - const keys = util.objectKeys(shape); - return (this._cached = { shape, keys }); + this.validate = this.implement; } _parse(input) { - const parsedType = this._getType(input); - if (parsedType !== ZodParsedType.object) { - const ctx = this._getOrReturnCtx(input); + const { ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.function) { addIssueToContext(ctx, { code: ZodIssueCode.invalid_type, - expected: ZodParsedType.object, + expected: ZodParsedType.function, received: ctx.parsedType, }); return INVALID; } - const { status, ctx } = this._processInputParams(input); - const { shape, keys: shapeKeys } = this._getCached(); - const extraKeys = []; - if (!(this._def.catchall instanceof ZodNever && - this._def.unknownKeys === "strip")) { - for (const key in ctx.data) { - if (!shapeKeys.includes(key)) { - extraKeys.push(key); - } - } - } - const pairs = []; - for (const key of shapeKeys) { - const keyValidator = shape[key]; - const value = ctx.data[key]; - pairs.push({ - key: { status: "valid", value: key }, - value: keyValidator._parse(new ParseInputLazyPath(ctx, value, ctx.path, key)), - alwaysSet: key in ctx.data, + function makeArgsIssue(args, error) { + return makeIssue({ + data: args, + path: ctx.path, + errorMaps: [ + ctx.common.contextualErrorMap, + ctx.schemaErrorMap, + getErrorMap(), + errorMap, + ].filter((x) => !!x), + issueData: { + code: ZodIssueCode.invalid_arguments, + argumentsError: error, + }, }); } - if (this._def.catchall instanceof ZodNever) { - const unknownKeys = this._def.unknownKeys; - if (unknownKeys === "passthrough") { - for (const key of extraKeys) { - pairs.push({ - key: { status: "valid", value: key }, - value: { status: "valid", value: ctx.data[key] }, - }); - } - } - else if (unknownKeys === "strict") { - if (extraKeys.length > 0) { - addIssueToContext(ctx, { - code: ZodIssueCode.unrecognized_keys, - keys: extraKeys, - }); - status.dirty(); - } - } - else if (unknownKeys === "strip") ; - else { - throw new Error(`Internal ZodObject error: invalid unknownKeys value.`); - } - } - else { - // run catchall validation - const catchall = this._def.catchall; - for (const key of extraKeys) { - const value = ctx.data[key]; - pairs.push({ - key: { status: "valid", value: key }, - value: catchall._parse(new ParseInputLazyPath(ctx, value, ctx.path, key) //, ctx.child(key), value, getParsedType(value) - ), - alwaysSet: key in ctx.data, - }); - } - } - if (ctx.common.async) { - return Promise.resolve() - .then(async () => { - const syncPairs = []; - for (const pair of pairs) { - const key = await pair.key; - const value = await pair.value; - syncPairs.push({ - key, - value, - alwaysSet: pair.alwaysSet, - }); - } - return syncPairs; - }) - .then((syncPairs) => { - return ParseStatus.mergeObjectSync(status, syncPairs); + function makeReturnsIssue(returns, error) { + return makeIssue({ + data: returns, + path: ctx.path, + errorMaps: [ + ctx.common.contextualErrorMap, + ctx.schemaErrorMap, + getErrorMap(), + errorMap, + ].filter((x) => !!x), + issueData: { + code: ZodIssueCode.invalid_return_type, + returnTypeError: error, + }, + }); + } + const params = { errorMap: ctx.common.contextualErrorMap }; + const fn = ctx.data; + if (this._def.returns instanceof ZodPromise) { + // Would love a way to avoid disabling this rule, but we need + // an alias (using an arrow function was what caused 2651). + // eslint-disable-next-line @typescript-eslint/no-this-alias + const me = this; + return OK(async function (...args) { + const error = new ZodError([]); + const parsedArgs = await me._def.args + .parseAsync(args, params) + .catch((e) => { + error.addIssue(makeArgsIssue(args, e)); + throw error; + }); + const result = await Reflect.apply(fn, this, parsedArgs); + const parsedReturns = await me._def.returns._def.type + .parseAsync(result, params) + .catch((e) => { + error.addIssue(makeReturnsIssue(result, e)); + throw error; + }); + return parsedReturns; + }); + } + else { + // Would love a way to avoid disabling this rule, but we need + // an alias (using an arrow function was what caused 2651). + // eslint-disable-next-line @typescript-eslint/no-this-alias + const me = this; + return OK(function (...args) { + const parsedArgs = me._def.args.safeParse(args, params); + if (!parsedArgs.success) { + throw new ZodError([makeArgsIssue(args, parsedArgs.error)]); + } + const result = Reflect.apply(fn, this, parsedArgs.data); + const parsedReturns = me._def.returns.safeParse(result, params); + if (!parsedReturns.success) { + throw new ZodError([makeReturnsIssue(result, parsedReturns.error)]); + } + return parsedReturns.data; }); } - else { - return ParseStatus.mergeObjectSync(status, pairs); - } - } - get shape() { - return this._def.shape(); - } - strict(message) { - errorUtil.errToObj; - return new ZodObject({ - ...this._def, - unknownKeys: "strict", - ...(message !== undefined - ? { - errorMap: (issue, ctx) => { - var _a, _b, _c, _d; - const defaultError = (_c = (_b = (_a = this._def).errorMap) === null || _b === void 0 ? void 0 : _b.call(_a, issue, ctx).message) !== null && _c !== void 0 ? _c : ctx.defaultError; - if (issue.code === "unrecognized_keys") - return { - message: (_d = errorUtil.errToObj(message).message) !== null && _d !== void 0 ? _d : defaultError, - }; - return { - message: defaultError, - }; - }, - } - : {}), - }); - } - strip() { - return new ZodObject({ - ...this._def, - unknownKeys: "strip", - }); - } - passthrough() { - return new ZodObject({ - ...this._def, - unknownKeys: "passthrough", - }); - } - // const AugmentFactory = - // (def: Def) => - // ( - // augmentation: Augmentation - // ): ZodObject< - // extendShape, Augmentation>, - // Def["unknownKeys"], - // Def["catchall"] - // > => { - // return new ZodObject({ - // ...def, - // shape: () => ({ - // ...def.shape(), - // ...augmentation, - // }), - // }) as any; - // }; - extend(augmentation) { - return new ZodObject({ - ...this._def, - shape: () => ({ - ...this._def.shape(), - ...augmentation, - }), - }); } - /** - * Prior to zod@1.0.12 there was a bug in the - * inferred type of merged objects. Please - * upgrade if you are experiencing issues. - */ - merge(merging) { - const merged = new ZodObject({ - unknownKeys: merging._def.unknownKeys, - catchall: merging._def.catchall, - shape: () => ({ - ...this._def.shape(), - ...merging._def.shape(), - }), - typeName: ZodFirstPartyTypeKind.ZodObject, - }); - return merged; + parameters() { + return this._def.args; } - // merge< - // Incoming extends AnyZodObject, - // Augmentation extends Incoming["shape"], - // NewOutput extends { - // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation - // ? Augmentation[k]["_output"] - // : k extends keyof Output - // ? Output[k] - // : never; - // }, - // NewInput extends { - // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation - // ? Augmentation[k]["_input"] - // : k extends keyof Input - // ? Input[k] - // : never; - // } - // >( - // merging: Incoming - // ): ZodObject< - // extendShape>, - // Incoming["_def"]["unknownKeys"], - // Incoming["_def"]["catchall"], - // NewOutput, - // NewInput - // > { - // const merged: any = new ZodObject({ - // unknownKeys: merging._def.unknownKeys, - // catchall: merging._def.catchall, - // shape: () => - // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()), - // typeName: ZodFirstPartyTypeKind.ZodObject, - // }) as any; - // return merged; - // } - setKey(key, schema) { - return this.augment({ [key]: schema }); + returnType() { + return this._def.returns; } - // merge( - // merging: Incoming - // ): //ZodObject = (merging) => { - // ZodObject< - // extendShape>, - // Incoming["_def"]["unknownKeys"], - // Incoming["_def"]["catchall"] - // > { - // // const mergedShape = objectUtil.mergeShapes( - // // this._def.shape(), - // // merging._def.shape() - // // ); - // const merged: any = new ZodObject({ - // unknownKeys: merging._def.unknownKeys, - // catchall: merging._def.catchall, - // shape: () => - // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()), - // typeName: ZodFirstPartyTypeKind.ZodObject, - // }) as any; - // return merged; - // } - catchall(index) { - return new ZodObject({ + args(...items) { + return new ZodFunction({ ...this._def, - catchall: index, + args: ZodTuple.create(items).rest(ZodUnknown.create()), }); } - pick(mask) { - const shape = {}; - util.objectKeys(mask).forEach((key) => { - if (mask[key] && this.shape[key]) { - shape[key] = this.shape[key]; - } - }); - return new ZodObject({ + returns(returnType) { + return new ZodFunction({ ...this._def, - shape: () => shape, + returns: returnType, }); } - omit(mask) { - const shape = {}; - util.objectKeys(this.shape).forEach((key) => { - if (!mask[key]) { - shape[key] = this.shape[key]; - } - }); - return new ZodObject({ - ...this._def, - shape: () => shape, - }); + implement(func) { + const validatedFunc = this.parse(func); + return validatedFunc; } - /** - * @deprecated - */ - deepPartial() { - return deepPartialify(this); + strictImplement(func) { + const validatedFunc = this.parse(func); + return validatedFunc; } - partial(mask) { - const newShape = {}; - util.objectKeys(this.shape).forEach((key) => { - const fieldSchema = this.shape[key]; - if (mask && !mask[key]) { - newShape[key] = fieldSchema; - } - else { - newShape[key] = fieldSchema.optional(); - } - }); - return new ZodObject({ - ...this._def, - shape: () => newShape, + static create(args, returns, params) { + return new ZodFunction({ + args: (args + ? args + : ZodTuple.create([]).rest(ZodUnknown.create())), + returns: returns || ZodUnknown.create(), + typeName: ZodFirstPartyTypeKind.ZodFunction, + ...processCreateParams(params), }); } - required(mask) { - const newShape = {}; - util.objectKeys(this.shape).forEach((key) => { - if (mask && !mask[key]) { - newShape[key] = this.shape[key]; - } - else { - const fieldSchema = this.shape[key]; - let newField = fieldSchema; - while (newField instanceof ZodOptional) { - newField = newField._def.innerType; - } - newShape[key] = newField; - } - }); - return new ZodObject({ - ...this._def, - shape: () => newShape, - }); +} +class ZodLazy extends ZodType { + get schema() { + return this._def.getter(); } - keyof() { - return createZodEnum(util.objectKeys(this.shape)); + _parse(input) { + const { ctx } = this._processInputParams(input); + const lazySchema = this._def.getter(); + return lazySchema._parse({ data: ctx.data, path: ctx.path, parent: ctx }); } } -ZodObject.create = (shape, params) => { - return new ZodObject({ - shape: () => shape, - unknownKeys: "strip", - catchall: ZodNever.create(), - typeName: ZodFirstPartyTypeKind.ZodObject, +ZodLazy.create = (getter, params) => { + return new ZodLazy({ + getter: getter, + typeName: ZodFirstPartyTypeKind.ZodLazy, ...processCreateParams(params), }); }; -ZodObject.strictCreate = (shape, params) => { - return new ZodObject({ - shape: () => shape, - unknownKeys: "strict", - catchall: ZodNever.create(), - typeName: ZodFirstPartyTypeKind.ZodObject, +class ZodLiteral extends ZodType { + _parse(input) { + if (input.data !== this._def.value) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + received: ctx.data, + code: ZodIssueCode.invalid_literal, + expected: this._def.value, + }); + return INVALID; + } + return { status: "valid", value: input.data }; + } + get value() { + return this._def.value; + } +} +ZodLiteral.create = (value, params) => { + return new ZodLiteral({ + value: value, + typeName: ZodFirstPartyTypeKind.ZodLiteral, ...processCreateParams(params), }); }; -ZodObject.lazycreate = (shape, params) => { - return new ZodObject({ - shape, - unknownKeys: "strip", - catchall: ZodNever.create(), - typeName: ZodFirstPartyTypeKind.ZodObject, +function createZodEnum(values, params) { + return new ZodEnum({ + values, + typeName: ZodFirstPartyTypeKind.ZodEnum, + ...processCreateParams(params), + }); +} +class ZodEnum extends ZodType { + constructor() { + super(...arguments); + _ZodEnum_cache.set(this, void 0); + } + _parse(input) { + if (typeof input.data !== "string") { + const ctx = this._getOrReturnCtx(input); + const expectedValues = this._def.values; + addIssueToContext(ctx, { + expected: util.joinValues(expectedValues), + received: ctx.parsedType, + code: ZodIssueCode.invalid_type, + }); + return INVALID; + } + if (!__classPrivateFieldGet(this, _ZodEnum_cache, "f")) { + __classPrivateFieldSet(this, _ZodEnum_cache, new Set(this._def.values), "f"); + } + if (!__classPrivateFieldGet(this, _ZodEnum_cache, "f").has(input.data)) { + const ctx = this._getOrReturnCtx(input); + const expectedValues = this._def.values; + addIssueToContext(ctx, { + received: ctx.data, + code: ZodIssueCode.invalid_enum_value, + options: expectedValues, + }); + return INVALID; + } + return OK(input.data); + } + get options() { + return this._def.values; + } + get enum() { + const enumValues = {}; + for (const val of this._def.values) { + enumValues[val] = val; + } + return enumValues; + } + get Values() { + const enumValues = {}; + for (const val of this._def.values) { + enumValues[val] = val; + } + return enumValues; + } + get Enum() { + const enumValues = {}; + for (const val of this._def.values) { + enumValues[val] = val; + } + return enumValues; + } + extract(values, newDef = this._def) { + return ZodEnum.create(values, { + ...this._def, + ...newDef, + }); + } + exclude(values, newDef = this._def) { + return ZodEnum.create(this.options.filter((opt) => !values.includes(opt)), { + ...this._def, + ...newDef, + }); + } +} +_ZodEnum_cache = new WeakMap(); +ZodEnum.create = createZodEnum; +class ZodNativeEnum extends ZodType { + constructor() { + super(...arguments); + _ZodNativeEnum_cache.set(this, void 0); + } + _parse(input) { + const nativeEnumValues = util.getValidEnumValues(this._def.values); + const ctx = this._getOrReturnCtx(input); + if (ctx.parsedType !== ZodParsedType.string && + ctx.parsedType !== ZodParsedType.number) { + const expectedValues = util.objectValues(nativeEnumValues); + addIssueToContext(ctx, { + expected: util.joinValues(expectedValues), + received: ctx.parsedType, + code: ZodIssueCode.invalid_type, + }); + return INVALID; + } + if (!__classPrivateFieldGet(this, _ZodNativeEnum_cache, "f")) { + __classPrivateFieldSet(this, _ZodNativeEnum_cache, new Set(util.getValidEnumValues(this._def.values)), "f"); + } + if (!__classPrivateFieldGet(this, _ZodNativeEnum_cache, "f").has(input.data)) { + const expectedValues = util.objectValues(nativeEnumValues); + addIssueToContext(ctx, { + received: ctx.data, + code: ZodIssueCode.invalid_enum_value, + options: expectedValues, + }); + return INVALID; + } + return OK(input.data); + } + get enum() { + return this._def.values; + } +} +_ZodNativeEnum_cache = new WeakMap(); +ZodNativeEnum.create = (values, params) => { + return new ZodNativeEnum({ + values: values, + typeName: ZodFirstPartyTypeKind.ZodNativeEnum, ...processCreateParams(params), }); }; -class ZodUnion extends ZodType { +class ZodPromise extends ZodType { + unwrap() { + return this._def.type; + } _parse(input) { const { ctx } = this._processInputParams(input); - const options = this._def.options; - function handleResults(results) { - // return first issue-free validation if it exists - for (const result of results) { - if (result.result.status === "valid") { - return result.result; - } - } - for (const result of results) { - if (result.result.status === "dirty") { - // add issues from dirty option - ctx.common.issues.push(...result.ctx.common.issues); - return result.result; - } - } - // return invalid - const unionErrors = results.map((result) => new ZodError(result.ctx.common.issues)); + if (ctx.parsedType !== ZodParsedType.promise && + ctx.common.async === false) { addIssueToContext(ctx, { - code: ZodIssueCode.invalid_union, - unionErrors, + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.promise, + received: ctx.parsedType, }); return INVALID; } - if (ctx.common.async) { - return Promise.all(options.map(async (option) => { - const childCtx = { - ...ctx, - common: { - ...ctx.common, - issues: [], - }, - parent: null, - }; - return { - result: await option._parseAsync({ - data: ctx.data, + const promisified = ctx.parsedType === ZodParsedType.promise + ? ctx.data + : Promise.resolve(ctx.data); + return OK(promisified.then((data) => { + return this._def.type.parseAsync(data, { + path: ctx.path, + errorMap: ctx.common.contextualErrorMap, + }); + })); + } +} +ZodPromise.create = (schema, params) => { + return new ZodPromise({ + type: schema, + typeName: ZodFirstPartyTypeKind.ZodPromise, + ...processCreateParams(params), + }); +}; +class ZodEffects extends ZodType { + innerType() { + return this._def.schema; + } + sourceType() { + return this._def.schema._def.typeName === ZodFirstPartyTypeKind.ZodEffects + ? this._def.schema.sourceType() + : this._def.schema; + } + _parse(input) { + const { status, ctx } = this._processInputParams(input); + const effect = this._def.effect || null; + const checkCtx = { + addIssue: (arg) => { + addIssueToContext(ctx, arg); + if (arg.fatal) { + status.abort(); + } + else { + status.dirty(); + } + }, + get path() { + return ctx.path; + }, + }; + checkCtx.addIssue = checkCtx.addIssue.bind(checkCtx); + if (effect.type === "preprocess") { + const processed = effect.transform(ctx.data, checkCtx); + if (ctx.common.async) { + return Promise.resolve(processed).then(async (processed) => { + if (status.value === "aborted") + return INVALID; + const result = await this._def.schema._parseAsync({ + data: processed, path: ctx.path, - parent: childCtx, - }), - ctx: childCtx, - }; - })).then(handleResults); + parent: ctx, + }); + if (result.status === "aborted") + return INVALID; + if (result.status === "dirty") + return DIRTY(result.value); + if (status.value === "dirty") + return DIRTY(result.value); + return result; + }); + } + else { + if (status.value === "aborted") + return INVALID; + const result = this._def.schema._parseSync({ + data: processed, + path: ctx.path, + parent: ctx, + }); + if (result.status === "aborted") + return INVALID; + if (result.status === "dirty") + return DIRTY(result.value); + if (status.value === "dirty") + return DIRTY(result.value); + return result; + } + } + if (effect.type === "refinement") { + const executeRefinement = (acc) => { + const result = effect.refinement(acc, checkCtx); + if (ctx.common.async) { + return Promise.resolve(result); + } + if (result instanceof Promise) { + throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead."); + } + return acc; + }; + if (ctx.common.async === false) { + const inner = this._def.schema._parseSync({ + data: ctx.data, + path: ctx.path, + parent: ctx, + }); + if (inner.status === "aborted") + return INVALID; + if (inner.status === "dirty") + status.dirty(); + // return value is ignored + executeRefinement(inner.value); + return { status: status.value, value: inner.value }; + } + else { + return this._def.schema + ._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }) + .then((inner) => { + if (inner.status === "aborted") + return INVALID; + if (inner.status === "dirty") + status.dirty(); + return executeRefinement(inner.value).then(() => { + return { status: status.value, value: inner.value }; + }); + }); + } } - else { - let dirty = undefined; - const issues = []; - for (const option of options) { - const childCtx = { - ...ctx, - common: { - ...ctx.common, - issues: [], - }, - parent: null, - }; - const result = option._parseSync({ + if (effect.type === "transform") { + if (ctx.common.async === false) { + const base = this._def.schema._parseSync({ data: ctx.data, path: ctx.path, - parent: childCtx, + parent: ctx, }); - if (result.status === "valid") { - return result; - } - else if (result.status === "dirty" && !dirty) { - dirty = { result, ctx: childCtx }; - } - if (childCtx.common.issues.length) { - issues.push(childCtx.common.issues); + if (!isValid(base)) + return base; + const result = effect.transform(base.value, checkCtx); + if (result instanceof Promise) { + throw new Error(`Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.`); } + return { status: status.value, value: result }; } - if (dirty) { - ctx.common.issues.push(...dirty.ctx.common.issues); - return dirty.result; + else { + return this._def.schema + ._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }) + .then((base) => { + if (!isValid(base)) + return base; + return Promise.resolve(effect.transform(base.value, checkCtx)).then((result) => ({ status: status.value, value: result })); + }); } - const unionErrors = issues.map((issues) => new ZodError(issues)); - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_union, - unionErrors, - }); - return INVALID; } - } - get options() { - return this._def.options; + util.assertNever(effect); } } -ZodUnion.create = (types, params) => { - return new ZodUnion({ - options: types, - typeName: ZodFirstPartyTypeKind.ZodUnion, +ZodEffects.create = (schema, effect, params) => { + return new ZodEffects({ + schema, + typeName: ZodFirstPartyTypeKind.ZodEffects, + effect, ...processCreateParams(params), }); }; -///////////////////////////////////////////////////// -///////////////////////////////////////////////////// -////////// ////////// -////////// ZodDiscriminatedUnion ////////// -////////// ////////// -///////////////////////////////////////////////////// -///////////////////////////////////////////////////// -const getDiscriminator = (type) => { - if (type instanceof ZodLazy) { - return getDiscriminator(type.schema); - } - else if (type instanceof ZodEffects) { - return getDiscriminator(type.innerType()); - } - else if (type instanceof ZodLiteral) { - return [type.value]; - } - else if (type instanceof ZodEnum) { - return type.options; - } - else if (type instanceof ZodNativeEnum) { - // eslint-disable-next-line ban/ban - return util.objectValues(type.enum); - } - else if (type instanceof ZodDefault) { - return getDiscriminator(type._def.innerType); - } - else if (type instanceof ZodUndefined) { - return [undefined]; - } - else if (type instanceof ZodNull) { - return [null]; - } - else if (type instanceof ZodOptional) { - return [undefined, ...getDiscriminator(type.unwrap())]; +ZodEffects.createWithPreprocess = (preprocess, schema, params) => { + return new ZodEffects({ + schema, + effect: { type: "preprocess", transform: preprocess }, + typeName: ZodFirstPartyTypeKind.ZodEffects, + ...processCreateParams(params), + }); +}; +class ZodOptional extends ZodType { + _parse(input) { + const parsedType = this._getType(input); + if (parsedType === ZodParsedType.undefined) { + return OK(undefined); + } + return this._def.innerType._parse(input); } - else if (type instanceof ZodNullable) { - return [null, ...getDiscriminator(type.unwrap())]; + unwrap() { + return this._def.innerType; } - else if (type instanceof ZodBranded) { - return getDiscriminator(type.unwrap()); +} +ZodOptional.create = (type, params) => { + return new ZodOptional({ + innerType: type, + typeName: ZodFirstPartyTypeKind.ZodOptional, + ...processCreateParams(params), + }); +}; +class ZodNullable extends ZodType { + _parse(input) { + const parsedType = this._getType(input); + if (parsedType === ZodParsedType.null) { + return OK(null); + } + return this._def.innerType._parse(input); } - else if (type instanceof ZodReadonly) { - return getDiscriminator(type.unwrap()); + unwrap() { + return this._def.innerType; } - else if (type instanceof ZodCatch) { - return getDiscriminator(type._def.innerType); +} +ZodNullable.create = (type, params) => { + return new ZodNullable({ + innerType: type, + typeName: ZodFirstPartyTypeKind.ZodNullable, + ...processCreateParams(params), + }); +}; +class ZodDefault extends ZodType { + _parse(input) { + const { ctx } = this._processInputParams(input); + let data = ctx.data; + if (ctx.parsedType === ZodParsedType.undefined) { + data = this._def.defaultValue(); + } + return this._def.innerType._parse({ + data, + path: ctx.path, + parent: ctx, + }); } - else { - return []; + removeDefault() { + return this._def.innerType; } +} +ZodDefault.create = (type, params) => { + return new ZodDefault({ + innerType: type, + typeName: ZodFirstPartyTypeKind.ZodDefault, + defaultValue: typeof params.default === "function" + ? params.default + : () => params.default, + ...processCreateParams(params), + }); }; -class ZodDiscriminatedUnion extends ZodType { +class ZodCatch extends ZodType { _parse(input) { const { ctx } = this._processInputParams(input); - if (ctx.parsedType !== ZodParsedType.object) { - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_type, - expected: ZodParsedType.object, - received: ctx.parsedType, - }); - return INVALID; - } - const discriminator = this.discriminator; - const discriminatorValue = ctx.data[discriminator]; - const option = this.optionsMap.get(discriminatorValue); - if (!option) { - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_union_discriminator, - options: Array.from(this.optionsMap.keys()), - path: [discriminator], - }); - return INVALID; - } - if (ctx.common.async) { - return option._parseAsync({ - data: ctx.data, - path: ctx.path, - parent: ctx, + // newCtx is used to not collect issues from inner types in ctx + const newCtx = { + ...ctx, + common: { + ...ctx.common, + issues: [], + }, + }; + const result = this._def.innerType._parse({ + data: newCtx.data, + path: newCtx.path, + parent: { + ...newCtx, + }, + }); + if (isAsync(result)) { + return result.then((result) => { + return { + status: "valid", + value: result.status === "valid" + ? result.value + : this._def.catchValue({ + get error() { + return new ZodError(newCtx.common.issues); + }, + input: newCtx.data, + }), + }; }); } else { - return option._parseSync({ - data: ctx.data, - path: ctx.path, - parent: ctx, - }); + return { + status: "valid", + value: result.status === "valid" + ? result.value + : this._def.catchValue({ + get error() { + return new ZodError(newCtx.common.issues); + }, + input: newCtx.data, + }), + }; } } - get discriminator() { - return this._def.discriminator; - } - get options() { - return this._def.options; - } - get optionsMap() { - return this._def.optionsMap; - } - /** - * The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor. - * However, it only allows a union of objects, all of which need to share a discriminator property. This property must - * have a different value for each object in the union. - * @param discriminator the name of the discriminator property - * @param types an array of object schemas - * @param params - */ - static create(discriminator, options, params) { - // Get all the valid discriminator values - const optionsMap = new Map(); - // try { - for (const type of options) { - const discriminatorValues = getDiscriminator(type.shape[discriminator]); - if (!discriminatorValues.length) { - throw new Error(`A discriminator value for key \`${discriminator}\` could not be extracted from all schema options`); - } - for (const value of discriminatorValues) { - if (optionsMap.has(value)) { - throw new Error(`Discriminator property ${String(discriminator)} has duplicate value ${String(value)}`); - } - optionsMap.set(value, type); - } - } - return new ZodDiscriminatedUnion({ - typeName: ZodFirstPartyTypeKind.ZodDiscriminatedUnion, - discriminator, - options, - optionsMap, - ...processCreateParams(params), - }); + removeCatch() { + return this._def.innerType; } } -function mergeValues(a, b) { - const aType = getParsedType(a); - const bType = getParsedType(b); - if (a === b) { - return { valid: true, data: a }; - } - else if (aType === ZodParsedType.object && bType === ZodParsedType.object) { - const bKeys = util.objectKeys(b); - const sharedKeys = util - .objectKeys(a) - .filter((key) => bKeys.indexOf(key) !== -1); - const newObj = { ...a, ...b }; - for (const key of sharedKeys) { - const sharedValue = mergeValues(a[key], b[key]); - if (!sharedValue.valid) { - return { valid: false }; - } - newObj[key] = sharedValue.data; - } - return { valid: true, data: newObj }; - } - else if (aType === ZodParsedType.array && bType === ZodParsedType.array) { - if (a.length !== b.length) { - return { valid: false }; - } - const newArray = []; - for (let index = 0; index < a.length; index++) { - const itemA = a[index]; - const itemB = b[index]; - const sharedValue = mergeValues(itemA, itemB); - if (!sharedValue.valid) { - return { valid: false }; - } - newArray.push(sharedValue.data); +ZodCatch.create = (type, params) => { + return new ZodCatch({ + innerType: type, + typeName: ZodFirstPartyTypeKind.ZodCatch, + catchValue: typeof params.catch === "function" ? params.catch : () => params.catch, + ...processCreateParams(params), + }); +}; +class ZodNaN extends ZodType { + _parse(input) { + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.nan) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.nan, + received: ctx.parsedType, + }); + return INVALID; } - return { valid: true, data: newArray }; + return { status: "valid", value: input.data }; } - else if (aType === ZodParsedType.date && - bType === ZodParsedType.date && - +a === +b) { - return { valid: true, data: a }; +} +ZodNaN.create = (params) => { + return new ZodNaN({ + typeName: ZodFirstPartyTypeKind.ZodNaN, + ...processCreateParams(params), + }); +}; +const BRAND = Symbol("zod_brand"); +class ZodBranded extends ZodType { + _parse(input) { + const { ctx } = this._processInputParams(input); + const data = ctx.data; + return this._def.type._parse({ + data, + path: ctx.path, + parent: ctx, + }); } - else { - return { valid: false }; + unwrap() { + return this._def.type; } } -class ZodIntersection extends ZodType { +class ZodPipeline extends ZodType { _parse(input) { const { status, ctx } = this._processInputParams(input); - const handleParsed = (parsedLeft, parsedRight) => { - if (isAborted(parsedLeft) || isAborted(parsedRight)) { - return INVALID; - } - const merged = mergeValues(parsedLeft.value, parsedRight.value); - if (!merged.valid) { - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_intersection_types, - }); - return INVALID; - } - if (isDirty(parsedLeft) || isDirty(parsedRight)) { - status.dirty(); - } - return { status: status.value, value: merged.data }; - }; if (ctx.common.async) { - return Promise.all([ - this._def.left._parseAsync({ - data: ctx.data, - path: ctx.path, - parent: ctx, - }), - this._def.right._parseAsync({ + const handleAsync = async () => { + const inResult = await this._def.in._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx, - }), - ]).then(([left, right]) => handleParsed(left, right)); + }); + if (inResult.status === "aborted") + return INVALID; + if (inResult.status === "dirty") { + status.dirty(); + return DIRTY(inResult.value); + } + else { + return this._def.out._parseAsync({ + data: inResult.value, + path: ctx.path, + parent: ctx, + }); + } + }; + return handleAsync(); } else { - return handleParsed(this._def.left._parseSync({ - data: ctx.data, - path: ctx.path, - parent: ctx, - }), this._def.right._parseSync({ + const inResult = this._def.in._parseSync({ data: ctx.data, path: ctx.path, parent: ctx, - })); + }); + if (inResult.status === "aborted") + return INVALID; + if (inResult.status === "dirty") { + status.dirty(); + return { + status: "dirty", + value: inResult.value, + }; + } + else { + return this._def.out._parseSync({ + data: inResult.value, + path: ctx.path, + parent: ctx, + }); + } } } + static create(a, b) { + return new ZodPipeline({ + in: a, + out: b, + typeName: ZodFirstPartyTypeKind.ZodPipeline, + }); + } } -ZodIntersection.create = (left, right, params) => { - return new ZodIntersection({ - left: left, - right: right, - typeName: ZodFirstPartyTypeKind.ZodIntersection, - ...processCreateParams(params), - }); -}; -class ZodTuple extends ZodType { +class ZodReadonly extends ZodType { _parse(input) { - const { status, ctx } = this._processInputParams(input); - if (ctx.parsedType !== ZodParsedType.array) { - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_type, - expected: ZodParsedType.array, - received: ctx.parsedType, - }); - return INVALID; - } - if (ctx.data.length < this._def.items.length) { - addIssueToContext(ctx, { - code: ZodIssueCode.too_small, - minimum: this._def.items.length, - inclusive: true, - exact: false, - type: "array", - }); - return INVALID; - } - const rest = this._def.rest; - if (!rest && ctx.data.length > this._def.items.length) { - addIssueToContext(ctx, { - code: ZodIssueCode.too_big, - maximum: this._def.items.length, - inclusive: true, - exact: false, - type: "array", - }); - status.dirty(); - } - const items = [...ctx.data] - .map((item, itemIndex) => { - const schema = this._def.items[itemIndex] || this._def.rest; - if (!schema) - return null; - return schema._parse(new ParseInputLazyPath(ctx, item, ctx.path, itemIndex)); - }) - .filter((x) => !!x); // filter nulls - if (ctx.common.async) { - return Promise.all(items).then((results) => { - return ParseStatus.mergeArray(status, results); - }); - } - else { - return ParseStatus.mergeArray(status, items); - } - } - get items() { - return this._def.items; + const result = this._def.innerType._parse(input); + const freeze = (data) => { + if (isValid(data)) { + data.value = Object.freeze(data.value); + } + return data; + }; + return isAsync(result) + ? result.then((data) => freeze(data)) + : freeze(result); } - rest(rest) { - return new ZodTuple({ - ...this._def, - rest, - }); + unwrap() { + return this._def.innerType; } } -ZodTuple.create = (schemas, params) => { - if (!Array.isArray(schemas)) { - throw new Error("You must pass an array of schemas to z.tuple([ ... ])"); - } - return new ZodTuple({ - items: schemas, - typeName: ZodFirstPartyTypeKind.ZodTuple, - rest: null, +ZodReadonly.create = (type, params) => { + return new ZodReadonly({ + innerType: type, + typeName: ZodFirstPartyTypeKind.ZodReadonly, ...processCreateParams(params), }); }; -class ZodRecord extends ZodType { - get keySchema() { - return this._def.keyType; +function custom(check, params = {}, +/** + * @deprecated + * + * Pass `fatal` into the params object instead: + * + * ```ts + * z.string().custom((val) => val.length > 5, { fatal: false }) + * ``` + * + */ +fatal) { + if (check) + return ZodAny.create().superRefine((data, ctx) => { + var _a, _b; + if (!check(data)) { + const p = typeof params === "function" + ? params(data) + : typeof params === "string" + ? { message: params } + : params; + const _fatal = (_b = (_a = p.fatal) !== null && _a !== void 0 ? _a : fatal) !== null && _b !== void 0 ? _b : true; + const p2 = typeof p === "string" ? { message: p } : p; + ctx.addIssue({ code: "custom", ...p2, fatal: _fatal }); + } + }); + return ZodAny.create(); +} +const late = { + object: ZodObject.lazycreate, +}; +var ZodFirstPartyTypeKind; +(function (ZodFirstPartyTypeKind) { + ZodFirstPartyTypeKind["ZodString"] = "ZodString"; + ZodFirstPartyTypeKind["ZodNumber"] = "ZodNumber"; + ZodFirstPartyTypeKind["ZodNaN"] = "ZodNaN"; + ZodFirstPartyTypeKind["ZodBigInt"] = "ZodBigInt"; + ZodFirstPartyTypeKind["ZodBoolean"] = "ZodBoolean"; + ZodFirstPartyTypeKind["ZodDate"] = "ZodDate"; + ZodFirstPartyTypeKind["ZodSymbol"] = "ZodSymbol"; + ZodFirstPartyTypeKind["ZodUndefined"] = "ZodUndefined"; + ZodFirstPartyTypeKind["ZodNull"] = "ZodNull"; + ZodFirstPartyTypeKind["ZodAny"] = "ZodAny"; + ZodFirstPartyTypeKind["ZodUnknown"] = "ZodUnknown"; + ZodFirstPartyTypeKind["ZodNever"] = "ZodNever"; + ZodFirstPartyTypeKind["ZodVoid"] = "ZodVoid"; + ZodFirstPartyTypeKind["ZodArray"] = "ZodArray"; + ZodFirstPartyTypeKind["ZodObject"] = "ZodObject"; + ZodFirstPartyTypeKind["ZodUnion"] = "ZodUnion"; + ZodFirstPartyTypeKind["ZodDiscriminatedUnion"] = "ZodDiscriminatedUnion"; + ZodFirstPartyTypeKind["ZodIntersection"] = "ZodIntersection"; + ZodFirstPartyTypeKind["ZodTuple"] = "ZodTuple"; + ZodFirstPartyTypeKind["ZodRecord"] = "ZodRecord"; + ZodFirstPartyTypeKind["ZodMap"] = "ZodMap"; + ZodFirstPartyTypeKind["ZodSet"] = "ZodSet"; + ZodFirstPartyTypeKind["ZodFunction"] = "ZodFunction"; + ZodFirstPartyTypeKind["ZodLazy"] = "ZodLazy"; + ZodFirstPartyTypeKind["ZodLiteral"] = "ZodLiteral"; + ZodFirstPartyTypeKind["ZodEnum"] = "ZodEnum"; + ZodFirstPartyTypeKind["ZodEffects"] = "ZodEffects"; + ZodFirstPartyTypeKind["ZodNativeEnum"] = "ZodNativeEnum"; + ZodFirstPartyTypeKind["ZodOptional"] = "ZodOptional"; + ZodFirstPartyTypeKind["ZodNullable"] = "ZodNullable"; + ZodFirstPartyTypeKind["ZodDefault"] = "ZodDefault"; + ZodFirstPartyTypeKind["ZodCatch"] = "ZodCatch"; + ZodFirstPartyTypeKind["ZodPromise"] = "ZodPromise"; + ZodFirstPartyTypeKind["ZodBranded"] = "ZodBranded"; + ZodFirstPartyTypeKind["ZodPipeline"] = "ZodPipeline"; + ZodFirstPartyTypeKind["ZodReadonly"] = "ZodReadonly"; +})(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {})); +const instanceOfType = ( +// const instanceOfType = any>( +cls, params = { + message: `Input not instance of ${cls.name}`, +}) => custom((data) => data instanceof cls, params); +const stringType = ZodString.create; +const numberType = ZodNumber.create; +const nanType = ZodNaN.create; +const bigIntType = ZodBigInt.create; +const booleanType = ZodBoolean.create; +const dateType = ZodDate.create; +const symbolType = ZodSymbol.create; +const undefinedType = ZodUndefined.create; +const nullType = ZodNull.create; +const anyType = ZodAny.create; +const unknownType = ZodUnknown.create; +const neverType = ZodNever.create; +const voidType = ZodVoid.create; +const arrayType = ZodArray.create; +const objectType = ZodObject.create; +const strictObjectType = ZodObject.strictCreate; +const unionType = ZodUnion.create; +const discriminatedUnionType = ZodDiscriminatedUnion.create; +const intersectionType = ZodIntersection.create; +const tupleType = ZodTuple.create; +const recordType = ZodRecord.create; +const mapType = ZodMap.create; +const setType = ZodSet.create; +const functionType = ZodFunction.create; +const lazyType = ZodLazy.create; +const literalType = ZodLiteral.create; +const enumType = ZodEnum.create; +const nativeEnumType = ZodNativeEnum.create; +const promiseType = ZodPromise.create; +const effectsType = ZodEffects.create; +const optionalType = ZodOptional.create; +const nullableType = ZodNullable.create; +const preprocessType = ZodEffects.createWithPreprocess; +const pipelineType = ZodPipeline.create; +const ostring = () => stringType().optional(); +const onumber = () => numberType().optional(); +const oboolean = () => booleanType().optional(); +const coerce = { + string: ((arg) => ZodString.create({ ...arg, coerce: true })), + number: ((arg) => ZodNumber.create({ ...arg, coerce: true })), + boolean: ((arg) => ZodBoolean.create({ + ...arg, + coerce: true, + })), + bigint: ((arg) => ZodBigInt.create({ ...arg, coerce: true })), + date: ((arg) => ZodDate.create({ ...arg, coerce: true })), +}; +const NEVER = INVALID; + +var z = /*#__PURE__*/Object.freeze({ + __proto__: null, + defaultErrorMap: errorMap, + setErrorMap: setErrorMap, + getErrorMap: getErrorMap, + makeIssue: makeIssue, + EMPTY_PATH: EMPTY_PATH, + addIssueToContext: addIssueToContext, + ParseStatus: ParseStatus, + INVALID: INVALID, + DIRTY: DIRTY, + OK: OK, + isAborted: isAborted, + isDirty: isDirty, + isValid: isValid, + isAsync: isAsync, + get util () { return util; }, + get objectUtil () { return objectUtil; }, + ZodParsedType: ZodParsedType, + getParsedType: getParsedType, + ZodType: ZodType, + datetimeRegex: datetimeRegex, + ZodString: ZodString, + ZodNumber: ZodNumber, + ZodBigInt: ZodBigInt, + ZodBoolean: ZodBoolean, + ZodDate: ZodDate, + ZodSymbol: ZodSymbol, + ZodUndefined: ZodUndefined, + ZodNull: ZodNull, + ZodAny: ZodAny, + ZodUnknown: ZodUnknown, + ZodNever: ZodNever, + ZodVoid: ZodVoid, + ZodArray: ZodArray, + ZodObject: ZodObject, + ZodUnion: ZodUnion, + ZodDiscriminatedUnion: ZodDiscriminatedUnion, + ZodIntersection: ZodIntersection, + ZodTuple: ZodTuple, + ZodRecord: ZodRecord, + ZodMap: ZodMap, + ZodSet: ZodSet, + ZodFunction: ZodFunction, + ZodLazy: ZodLazy, + ZodLiteral: ZodLiteral, + ZodEnum: ZodEnum, + ZodNativeEnum: ZodNativeEnum, + ZodPromise: ZodPromise, + ZodEffects: ZodEffects, + ZodTransformer: ZodEffects, + ZodOptional: ZodOptional, + ZodNullable: ZodNullable, + ZodDefault: ZodDefault, + ZodCatch: ZodCatch, + ZodNaN: ZodNaN, + BRAND: BRAND, + ZodBranded: ZodBranded, + ZodPipeline: ZodPipeline, + ZodReadonly: ZodReadonly, + custom: custom, + Schema: ZodType, + ZodSchema: ZodType, + late: late, + get ZodFirstPartyTypeKind () { return ZodFirstPartyTypeKind; }, + coerce: coerce, + any: anyType, + array: arrayType, + bigint: bigIntType, + boolean: booleanType, + date: dateType, + discriminatedUnion: discriminatedUnionType, + effect: effectsType, + 'enum': enumType, + 'function': functionType, + 'instanceof': instanceOfType, + intersection: intersectionType, + lazy: lazyType, + literal: literalType, + map: mapType, + nan: nanType, + nativeEnum: nativeEnumType, + never: neverType, + 'null': nullType, + nullable: nullableType, + number: numberType, + object: objectType, + oboolean: oboolean, + onumber: onumber, + optional: optionalType, + ostring: ostring, + pipeline: pipelineType, + preprocess: preprocessType, + promise: promiseType, + record: recordType, + set: setType, + strictObject: strictObjectType, + string: stringType, + symbol: symbolType, + transformer: effectsType, + tuple: tupleType, + 'undefined': undefinedType, + union: unionType, + unknown: unknownType, + 'void': voidType, + NEVER: NEVER, + ZodIssueCode: ZodIssueCode, + quotelessJson: quotelessJson, + ZodError: ZodError +}); + + + + +/***/ }), + +/***/ "./sample/config.ts": +/*!**************************!*\ + !*** ./sample/config.ts ***! + \**************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ Config: () => (/* binding */ Config) +/* harmony export */ }); +const Config = { + PlayerSpeed: 16 * 2, // pixels/sec + PlayerFrameSpeed: 200, // ms +}; + + +/***/ }), + +/***/ "./sample/player.ts": +/*!**************************!*\ + !*** ./sample/player.ts ***! + \**************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ Player: () => (/* binding */ Player) +/* harmony export */ }); +/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); +/* harmony import */ var _resources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./resources */ "./sample/resources.ts"); +/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./config */ "./sample/config.ts"); + + + +class Player extends excalibur__WEBPACK_IMPORTED_MODULE_0__.Actor { + constructor(args) { + super({ + ...args, + collisionType: excalibur__WEBPACK_IMPORTED_MODULE_0__.CollisionType.Active + }); } - get valueSchema() { - return this._def.valueType; + onInitialize(engine) { + const playerSpriteSheet = excalibur__WEBPACK_IMPORTED_MODULE_0__.SpriteSheet.fromImageSource({ + image: _resources__WEBPACK_IMPORTED_MODULE_1__.Resources.HeroSpriteSheetPng, + grid: { + spriteWidth: 16, + spriteHeight: 16, + rows: 8, + columns: 8 + } + }); + const leftIdle = new excalibur__WEBPACK_IMPORTED_MODULE_0__.Animation({ + frames: [ + { graphic: playerSpriteSheet.getSprite(0, 1), duration: _config__WEBPACK_IMPORTED_MODULE_2__.Config.PlayerFrameSpeed }, + { graphic: playerSpriteSheet.getSprite(1, 1), duration: _config__WEBPACK_IMPORTED_MODULE_2__.Config.PlayerFrameSpeed }, + { graphic: playerSpriteSheet.getSprite(2, 1), duration: _config__WEBPACK_IMPORTED_MODULE_2__.Config.PlayerFrameSpeed }, + { graphic: playerSpriteSheet.getSprite(3, 1), duration: _config__WEBPACK_IMPORTED_MODULE_2__.Config.PlayerFrameSpeed }, + ] + }); + this.graphics.add('left-idle', leftIdle); + const rightIdle = new excalibur__WEBPACK_IMPORTED_MODULE_0__.Animation({ + frames: [ + { graphic: playerSpriteSheet.getSprite(0, 2), duration: _config__WEBPACK_IMPORTED_MODULE_2__.Config.PlayerFrameSpeed }, + { graphic: playerSpriteSheet.getSprite(1, 2), duration: _config__WEBPACK_IMPORTED_MODULE_2__.Config.PlayerFrameSpeed }, + { graphic: playerSpriteSheet.getSprite(2, 2), duration: _config__WEBPACK_IMPORTED_MODULE_2__.Config.PlayerFrameSpeed }, + { graphic: playerSpriteSheet.getSprite(3, 2), duration: _config__WEBPACK_IMPORTED_MODULE_2__.Config.PlayerFrameSpeed }, + ] + }); + this.graphics.add('right-idle', rightIdle); + const upIdle = new excalibur__WEBPACK_IMPORTED_MODULE_0__.Animation({ + frames: [ + { graphic: playerSpriteSheet.getSprite(0, 3), duration: _config__WEBPACK_IMPORTED_MODULE_2__.Config.PlayerFrameSpeed }, + { graphic: playerSpriteSheet.getSprite(1, 3), duration: _config__WEBPACK_IMPORTED_MODULE_2__.Config.PlayerFrameSpeed }, + { graphic: playerSpriteSheet.getSprite(2, 3), duration: _config__WEBPACK_IMPORTED_MODULE_2__.Config.PlayerFrameSpeed }, + { graphic: playerSpriteSheet.getSprite(3, 3), duration: _config__WEBPACK_IMPORTED_MODULE_2__.Config.PlayerFrameSpeed }, + ] + }); + this.graphics.add('up-idle', upIdle); + const downIdle = new excalibur__WEBPACK_IMPORTED_MODULE_0__.Animation({ + frames: [ + { graphic: playerSpriteSheet.getSprite(0, 0), duration: _config__WEBPACK_IMPORTED_MODULE_2__.Config.PlayerFrameSpeed }, + { graphic: playerSpriteSheet.getSprite(1, 0), duration: _config__WEBPACK_IMPORTED_MODULE_2__.Config.PlayerFrameSpeed }, + { graphic: playerSpriteSheet.getSprite(2, 0), duration: _config__WEBPACK_IMPORTED_MODULE_2__.Config.PlayerFrameSpeed }, + { graphic: playerSpriteSheet.getSprite(3, 0), duration: _config__WEBPACK_IMPORTED_MODULE_2__.Config.PlayerFrameSpeed }, + ] + }); + this.graphics.add('down-idle', downIdle); + const leftWalk = new excalibur__WEBPACK_IMPORTED_MODULE_0__.Animation({ + frames: [ + { graphic: playerSpriteSheet.getSprite(0, 5), duration: _config__WEBPACK_IMPORTED_MODULE_2__.Config.PlayerFrameSpeed }, + { graphic: playerSpriteSheet.getSprite(1, 5), duration: _config__WEBPACK_IMPORTED_MODULE_2__.Config.PlayerFrameSpeed }, + { graphic: playerSpriteSheet.getSprite(2, 5), duration: _config__WEBPACK_IMPORTED_MODULE_2__.Config.PlayerFrameSpeed }, + { graphic: playerSpriteSheet.getSprite(3, 5), duration: _config__WEBPACK_IMPORTED_MODULE_2__.Config.PlayerFrameSpeed }, + ] + }); + this.graphics.add('left-walk', leftWalk); + const rightWalk = new excalibur__WEBPACK_IMPORTED_MODULE_0__.Animation({ + frames: [ + { graphic: playerSpriteSheet.getSprite(0, 6), duration: _config__WEBPACK_IMPORTED_MODULE_2__.Config.PlayerFrameSpeed }, + { graphic: playerSpriteSheet.getSprite(1, 6), duration: _config__WEBPACK_IMPORTED_MODULE_2__.Config.PlayerFrameSpeed }, + { graphic: playerSpriteSheet.getSprite(2, 6), duration: _config__WEBPACK_IMPORTED_MODULE_2__.Config.PlayerFrameSpeed }, + { graphic: playerSpriteSheet.getSprite(3, 6), duration: _config__WEBPACK_IMPORTED_MODULE_2__.Config.PlayerFrameSpeed }, + ] + }); + this.graphics.add('right-walk', rightWalk); + const upWalk = new excalibur__WEBPACK_IMPORTED_MODULE_0__.Animation({ + frames: [ + { graphic: playerSpriteSheet.getSprite(0, 7), duration: _config__WEBPACK_IMPORTED_MODULE_2__.Config.PlayerFrameSpeed }, + { graphic: playerSpriteSheet.getSprite(1, 7), duration: _config__WEBPACK_IMPORTED_MODULE_2__.Config.PlayerFrameSpeed }, + { graphic: playerSpriteSheet.getSprite(2, 7), duration: _config__WEBPACK_IMPORTED_MODULE_2__.Config.PlayerFrameSpeed }, + { graphic: playerSpriteSheet.getSprite(3, 7), duration: _config__WEBPACK_IMPORTED_MODULE_2__.Config.PlayerFrameSpeed }, + ] + }); + this.graphics.add('up-walk', upWalk); + const downWalk = new excalibur__WEBPACK_IMPORTED_MODULE_0__.Animation({ + frames: [ + { graphic: playerSpriteSheet.getSprite(0, 4), duration: _config__WEBPACK_IMPORTED_MODULE_2__.Config.PlayerFrameSpeed }, + { graphic: playerSpriteSheet.getSprite(1, 4), duration: _config__WEBPACK_IMPORTED_MODULE_2__.Config.PlayerFrameSpeed }, + { graphic: playerSpriteSheet.getSprite(2, 4), duration: _config__WEBPACK_IMPORTED_MODULE_2__.Config.PlayerFrameSpeed }, + { graphic: playerSpriteSheet.getSprite(3, 4), duration: _config__WEBPACK_IMPORTED_MODULE_2__.Config.PlayerFrameSpeed }, + ] + }); + this.graphics.add('down-walk', downWalk); } - _parse(input) { - const { status, ctx } = this._processInputParams(input); - if (ctx.parsedType !== ZodParsedType.object) { - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_type, - expected: ZodParsedType.object, - received: ctx.parsedType, - }); - return INVALID; - } - const pairs = []; - const keyType = this._def.keyType; - const valueType = this._def.valueType; - for (const key in ctx.data) { - pairs.push({ - key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, key)), - value: valueType._parse(new ParseInputLazyPath(ctx, ctx.data[key], ctx.path, key)), - alwaysSet: key in ctx.data, - }); + onPreUpdate(engine, elapsedMs) { + this.vel = excalibur__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero; + this.graphics.use('down-idle'); + if (engine.input.keyboard.isHeld(excalibur__WEBPACK_IMPORTED_MODULE_0__.Keys.ArrowRight)) { + this.vel = excalibur__WEBPACK_IMPORTED_MODULE_0__.vec(_config__WEBPACK_IMPORTED_MODULE_2__.Config.PlayerSpeed, 0); + this.graphics.use('right-walk'); } - if (ctx.common.async) { - return ParseStatus.mergeObjectAsync(status, pairs); + if (engine.input.keyboard.isHeld(excalibur__WEBPACK_IMPORTED_MODULE_0__.Keys.ArrowLeft)) { + this.vel = excalibur__WEBPACK_IMPORTED_MODULE_0__.vec(-_config__WEBPACK_IMPORTED_MODULE_2__.Config.PlayerSpeed, 0); + this.graphics.use('left-walk'); } - else { - return ParseStatus.mergeObjectSync(status, pairs); + if (engine.input.keyboard.isHeld(excalibur__WEBPACK_IMPORTED_MODULE_0__.Keys.ArrowUp)) { + this.vel = excalibur__WEBPACK_IMPORTED_MODULE_0__.vec(0, -_config__WEBPACK_IMPORTED_MODULE_2__.Config.PlayerSpeed); + this.graphics.use('up-walk'); } - } - get element() { - return this._def.valueType; - } - static create(first, second, third) { - if (second instanceof ZodType) { - return new ZodRecord({ - keyType: first, - valueType: second, - typeName: ZodFirstPartyTypeKind.ZodRecord, - ...processCreateParams(third), - }); + if (engine.input.keyboard.isHeld(excalibur__WEBPACK_IMPORTED_MODULE_0__.Keys.ArrowDown)) { + this.vel = excalibur__WEBPACK_IMPORTED_MODULE_0__.vec(0, _config__WEBPACK_IMPORTED_MODULE_2__.Config.PlayerSpeed); + this.graphics.use('down-walk'); } - return new ZodRecord({ - keyType: ZodString.create(), - valueType: first, - typeName: ZodFirstPartyTypeKind.ZodRecord, - ...processCreateParams(second), - }); } } -class ZodMap extends ZodType { - get keySchema() { - return this._def.keyType; - } - get valueSchema() { - return this._def.valueType; + + +/***/ }), + +/***/ "./sample/resources.ts": +/*!*****************************!*\ + !*** ./sample/resources.ts ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ Resources: () => (/* binding */ Resources), +/* harmony export */ loader: () => (/* binding */ loader) +/* harmony export */ }); +/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); +/* harmony import */ var _excalibur_ldtk__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @excalibur-ldtk */ "./src/index.ts"); + + +const Resources = { + HeroSpriteSheetPng: new excalibur__WEBPACK_IMPORTED_MODULE_0__.ImageSource('./Solaria Demo Pack Update 03/Solaria Demo Pack Update 03/16x16/Sprites/Hero 01.png'), + LdtkResource: new _excalibur_ldtk__WEBPACK_IMPORTED_MODULE_1__.LdtkResource('./spacing-padding/spacing-padding.ldtk', { + useTilemapCameraStrategy: true, + useMapBackgroundColor: true, + }), + LdtkAutoTile: new _excalibur_ldtk__WEBPACK_IMPORTED_MODULE_1__.LdtkResource('./autotile/autotile.ldtk', { + useMapBackgroundColor: true, + }), + LdtkPureAutoTile: new _excalibur_ldtk__WEBPACK_IMPORTED_MODULE_1__.LdtkResource('./dsml1/dsml1.ldtk', { + useMapBackgroundColor: true, + }) +}; +const loader = new excalibur__WEBPACK_IMPORTED_MODULE_0__.Loader(); +for (let resource of Object.values(Resources)) { + loader.addResource(resource); +} + + +/***/ }), + +/***/ "./src/entity-layer.ts": +/*!*****************************!*\ + !*** ./src/entity-layer.ts ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ EntityLayer: () => (/* binding */ EntityLayer) +/* harmony export */ }); +/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); + +class EntityLayer { + constructor(level, ldtkLayer, resource, order) { + this.ldtkLayer = ldtkLayer; + this.resource = resource; + this.order = order; + this.entities = []; + this.ldtkToEntity = new Map(); + this.entityToLdtk = new Map(); + this.worldPos = (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(level.ldtkLevel.worldX, level.ldtkLevel.worldY); + this.offset = (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(ldtkLayer.__pxTotalOffsetX, ldtkLayer.__pxTotalOffsetY); + console.log("yo"); } - _parse(input) { - const { status, ctx } = this._processInputParams(input); - if (ctx.parsedType !== ZodParsedType.map) { - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_type, - expected: ZodParsedType.map, - received: ctx.parsedType, - }); - return INVALID; - } - const keyType = this._def.keyType; - const valueType = this._def.valueType; - const pairs = [...ctx.data.entries()].map(([key, value], index) => { - return { - key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, [index, "key"])), - value: valueType._parse(new ParseInputLazyPath(ctx, value, ctx.path, [index, "value"])), - }; - }); - if (ctx.common.async) { - const finalMap = new Map(); - return Promise.resolve().then(async () => { - for (const pair of pairs) { - const key = await pair.key; - const value = await pair.value; - if (key.status === "aborted" || value.status === "aborted") { - return INVALID; - } - if (key.status === "dirty" || value.status === "dirty") { - status.dirty(); - } - finalMap.set(key.value, value.value); - } - return { status: status.value, value: finalMap }; - }); - } - else { - const finalMap = new Map(); - for (const pair of pairs) { - const key = pair.key; - const value = pair.value; - if (key.status === "aborted" || value.status === "aborted") { - return INVALID; + runFactories() { + var _a, _b; + const ldtkLayer = this.ldtkLayer; + const resource = this.resource; + const order = this.order; + if (ldtkLayer.entityInstances) { + for (let entity of ldtkLayer.entityInstances) { + const entityMetadata = resource.projectMetadata.defs.entities.find(e => { + return e.identifier === entity.__identifier; + }); + if (resource.factories.has(entity.__identifier)) { + const factory = resource.factories.get(entity.__identifier); + if (factory) { + const newEntity = factory({ + type: entity.__identifier, + worldPos: (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(entity.px[0], entity.px[1]).add(this.worldPos.add(this.offset)), + entity, + definition: entityMetadata, + layer: this, + }); + if (newEntity) { + this.entities.push(newEntity); + this.ldtkToEntity.set(entity, newEntity); + this.entityToLdtk.set(newEntity, entity); + } + } } - if (key.status === "dirty" || value.status === "dirty") { - status.dirty(); + else { + if (entity.__tile) { + const actor = new excalibur__WEBPACK_IMPORTED_MODULE_0__.Actor({ + name: entity.__identifier, + pos: (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(entity.px[0], entity.px[1]).add(this.worldPos.add(this.offset)), + width: entity.width, + height: entity.height, + anchor: (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)((_a = entityMetadata === null || entityMetadata === void 0 ? void 0 : entityMetadata.pivotX) !== null && _a !== void 0 ? _a : 0, (_b = entityMetadata === null || entityMetadata === void 0 ? void 0 : entityMetadata.pivotY) !== null && _b !== void 0 ? _b : 0), + z: order + }); + const ts = resource.tilesets.get(entity.__tile.tilesetUid); + if (ts) { + const tsxCoord = Math.floor(entity.__tile.x / entity.__tile.w); + const tsyCoord = Math.floor(entity.__tile.y / entity.__tile.h); + const sprite = ts.spritesheet.getSprite(tsxCoord, tsyCoord); + if (sprite) { + actor.graphics.use(sprite); + } + } + this.entities.push(actor); + this.ldtkToEntity.set(entity, actor); + this.entityToLdtk.set(actor, entity); + } } - finalMap.set(key.value, value.value); } - return { status: status.value, value: finalMap }; } + // for (let entity of this.ldtkLayer.entityInstances) { + // const factory = this.resource.factories.get(entity.__identifier); + // if (!factory) { continue } + // + // const entityMetadata = this.resource.projectMetadata.defs.entities.find(e => { + // return e.identifier === entity.__identifier + // }); + // + // const newEntity = factory({ + // type: entity.__identifier, + // worldPos: vec(entity.px[0], entity.px[1]).add(this.worldPos.add(this.offset)), + // entity, + // definition: entityMetadata, + // layer: this, + // }); + // + // if (newEntity) { + // // remove pre-existing entity (e.g. the default actor created for the entity placement) + // const preExisting = this.ldtkToEntity.get(entity); + // if (preExisting) { + // const index = this.entities.indexOf(preExisting); + // if (index > -1) { + // this.entities.splice(index, 1); + // this.ldtkToEntity.delete(entity); + // this.entityToLdtk.delete(preExisting); + // } + // } + // + // this.entities.push(newEntity); + // this.ldtkToEntity.set(entity, newEntity); + // this.entityToLdtk.set(newEntity, entity); + // } + // } } -} -ZodMap.create = (keyType, valueType, params) => { - return new ZodMap({ - valueType, - keyType, - typeName: ZodFirstPartyTypeKind.ZodMap, - ...processCreateParams(params), - }); -}; -class ZodSet extends ZodType { - _parse(input) { - const { status, ctx } = this._processInputParams(input); - if (ctx.parsedType !== ZodParsedType.set) { - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_type, - expected: ZodParsedType.set, - received: ctx.parsedType, - }); - return INVALID; - } - const def = this._def; - if (def.minSize !== null) { - if (ctx.data.size < def.minSize.value) { - addIssueToContext(ctx, { - code: ZodIssueCode.too_small, - minimum: def.minSize.value, - type: "set", - inclusive: true, - exact: false, - message: def.minSize.message, - }); - status.dirty(); - } - } - if (def.maxSize !== null) { - if (ctx.data.size > def.maxSize.value) { - addIssueToContext(ctx, { - code: ZodIssueCode.too_big, - maximum: def.maxSize.value, - type: "set", - inclusive: true, - exact: false, - message: def.maxSize.message, - }); - status.dirty(); + getEntitiesByIdentifier(identifier) { + const ldtkEntities = this.getLdtkEntitiesByIdentifier(identifier); + let results = []; + for (const ldtk of ldtkEntities) { + const maybeEntity = this.ldtkToEntity.get(ldtk); + if (maybeEntity) { + results.push(maybeEntity); } } - const valueType = this._def.valueType; - function finalizeSet(elements) { - const parsedSet = new Set(); - for (const element of elements) { - if (element.status === "aborted") - return INVALID; - if (element.status === "dirty") - status.dirty(); - parsedSet.add(element.value); + return results; + } + getEntitiesByField(fieldIdentifier, value) { + const ldtkEntities = this.getLdtkEntitiesByField(fieldIdentifier, value); + let results = []; + for (const ldtk of ldtkEntities) { + const maybeEntity = this.ldtkToEntity.get(ldtk); + if (maybeEntity) { + results.push(maybeEntity); } - return { status: status.value, value: parsedSet }; - } - const elements = [...ctx.data.values()].map((item, i) => valueType._parse(new ParseInputLazyPath(ctx, item, ctx.path, i))); - if (ctx.common.async) { - return Promise.all(elements).then((elements) => finalizeSet(elements)); - } - else { - return finalizeSet(elements); } + return results; } - min(minSize, message) { - return new ZodSet({ - ...this._def, - minSize: { value: minSize, message: errorUtil.toString(message) }, - }); + /** + * Search layer for entities that match an identifier (case insensitive) + * @param identifier + * @returns + */ + getLdtkEntitiesByIdentifier(identifier) { + return this.ldtkLayer.entityInstances.filter(e => e.__identifier.toLocaleLowerCase() === identifier.toLowerCase()); } - max(maxSize, message) { - return new ZodSet({ - ...this._def, - maxSize: { value: maxSize, message: errorUtil.toString(message) }, + /** + * Search layer for entities that match a field and optionally a value (both case insensitive) + * @param fieldIdentifier + * @param value + */ + getLdtkEntitiesByField(fieldIdentifier, value) { + return this.ldtkLayer.entityInstances.filter(e => { + if (value !== undefined) { + let normalizedValue = value; + if (typeof value === 'string') { + normalizedValue = value.toLocaleLowerCase(); + } + const field = e.fieldInstances.find(f => f.__identifier.toLocaleLowerCase() === fieldIdentifier.toLocaleLowerCase()); + if (field) { + return field.__value === normalizedValue; + } + return false; + } + else { + return !!e.fieldInstances.find(f => f.__identifier.toLocaleLowerCase() === fieldIdentifier.toLocaleLowerCase()); + } }); } - size(size, message) { - return this.min(size, message).max(size, message); - } - nonempty(message) { - return this.min(1, message); - } } -ZodSet.create = (valueType, params) => { - return new ZodSet({ - valueType, - minSize: null, - maxSize: null, - typeName: ZodFirstPartyTypeKind.ZodSet, - ...processCreateParams(params), - }); -}; -class ZodFunction extends ZodType { - constructor() { - super(...arguments); - this.validate = this.implement; + + +/***/ }), + +/***/ "./src/file-loader.ts": +/*!****************************!*\ + !*** ./src/file-loader.ts ***! + \****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ FetchLoader: () => (/* binding */ FetchLoader) +/* harmony export */ }); +const FetchLoader = async (path, contentType) => { + const response = await fetch(path); + switch (contentType.toLowerCase()) { + case 'xml': return await response.text(); + case 'json': return await response.json(); + default: return await response.text(); } - _parse(input) { - const { ctx } = this._processInputParams(input); - if (ctx.parsedType !== ZodParsedType.function) { - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_type, - expected: ZodParsedType.function, - received: ctx.parsedType, - }); - return INVALID; - } - function makeArgsIssue(args, error) { - return makeIssue({ - data: args, - path: ctx.path, - errorMaps: [ - ctx.common.contextualErrorMap, - ctx.schemaErrorMap, - getErrorMap(), - errorMap, - ].filter((x) => !!x), - issueData: { - code: ZodIssueCode.invalid_arguments, - argumentsError: error, - }, +}; + + +/***/ }), + +/***/ "./src/index.ts": +/*!**********************!*\ + !*** ./src/index.ts ***! + \**********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ EntityLayer: () => (/* reexport safe */ _entity_layer__WEBPACK_IMPORTED_MODULE_1__.EntityLayer), +/* harmony export */ FetchLoader: () => (/* reexport safe */ _file_loader__WEBPACK_IMPORTED_MODULE_2__.FetchLoader), +/* harmony export */ IntGridLayer: () => (/* reexport safe */ _intgrid_layer__WEBPACK_IMPORTED_MODULE_3__.IntGridLayer), +/* harmony export */ LdtkEntityDefinition: () => (/* reexport safe */ _types__WEBPACK_IMPORTED_MODULE_10__.LdtkEntityDefinition), +/* harmony export */ LdtkEntityInstance: () => (/* reexport safe */ _types__WEBPACK_IMPORTED_MODULE_10__.LdtkEntityInstance), +/* harmony export */ LdtkLayerDefinition: () => (/* reexport safe */ _types__WEBPACK_IMPORTED_MODULE_10__.LdtkLayerDefinition), +/* harmony export */ LdtkLayerInstance: () => (/* reexport safe */ _types__WEBPACK_IMPORTED_MODULE_10__.LdtkLayerInstance), +/* harmony export */ LdtkLevel: () => (/* reexport safe */ _types__WEBPACK_IMPORTED_MODULE_10__.LdtkLevel), +/* harmony export */ LdtkProjectMetadata: () => (/* reexport safe */ _types__WEBPACK_IMPORTED_MODULE_10__.LdtkProjectMetadata), +/* harmony export */ LdtkResource: () => (/* reexport safe */ _ldtk_resource__WEBPACK_IMPORTED_MODULE_0__.LdtkResource), +/* harmony export */ Level: () => (/* reexport safe */ _level__WEBPACK_IMPORTED_MODULE_5__.Level), +/* harmony export */ LevelResource: () => (/* reexport safe */ _level_resource__WEBPACK_IMPORTED_MODULE_4__.LevelResource), +/* harmony export */ LoaderCache: () => (/* reexport safe */ _loader_cache__WEBPACK_IMPORTED_MODULE_6__.LoaderCache), +/* harmony export */ TileLayer: () => (/* reexport safe */ _tile_layer__WEBPACK_IMPORTED_MODULE_8__.TileLayer), +/* harmony export */ Tileset: () => (/* reexport safe */ _tileset__WEBPACK_IMPORTED_MODULE_9__.Tileset), +/* harmony export */ filenameFromPath: () => (/* reexport safe */ _path_util__WEBPACK_IMPORTED_MODULE_7__.filenameFromPath), +/* harmony export */ mapPath: () => (/* reexport safe */ _path_util__WEBPACK_IMPORTED_MODULE_7__.mapPath), +/* harmony export */ pathInMap: () => (/* reexport safe */ _path_util__WEBPACK_IMPORTED_MODULE_7__.pathInMap), +/* harmony export */ pathRelativeToBase: () => (/* reexport safe */ _path_util__WEBPACK_IMPORTED_MODULE_7__.pathRelativeToBase) +/* harmony export */ }); +/* harmony import */ var _ldtk_resource__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ldtk-resource */ "./src/ldtk-resource.ts"); +/* harmony import */ var _entity_layer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./entity-layer */ "./src/entity-layer.ts"); +/* harmony import */ var _file_loader__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./file-loader */ "./src/file-loader.ts"); +/* harmony import */ var _intgrid_layer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./intgrid-layer */ "./src/intgrid-layer.ts"); +/* harmony import */ var _level_resource__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./level-resource */ "./src/level-resource.ts"); +/* harmony import */ var _level__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./level */ "./src/level.ts"); +/* harmony import */ var _loader_cache__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./loader-cache */ "./src/loader-cache.ts"); +/* harmony import */ var _path_util__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./path-util */ "./src/path-util.ts"); +/* harmony import */ var _tile_layer__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./tile-layer */ "./src/tile-layer.ts"); +/* harmony import */ var _tileset__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./tileset */ "./src/tileset.ts"); +/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./types */ "./src/types.ts"); + + + + + + + + + + + + + +/***/ }), + +/***/ "./src/intgrid-layer.ts": +/*!******************************!*\ + !*** ./src/intgrid-layer.ts ***! + \******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ IntGridLayer: () => (/* binding */ IntGridLayer) +/* harmony export */ }); +/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); + +class IntGridLayer { + constructor(level, ldtkLayer, resource, order) { + var _a, _b, _c, _d; + this.order = order; + this.worldPos = (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(level.ldtkLevel.worldX, level.ldtkLevel.worldY); + this.offset = (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(ldtkLayer.__pxTotalOffsetX, ldtkLayer.__pxTotalOffsetY); + this.ldtkLayer = ldtkLayer; + if (ldtkLayer.intGridCsv.length || ldtkLayer.autoLayerTiles.length) { + const rows = ldtkLayer.__cHei; + const columns = ldtkLayer.__cWid; + this.tilemap = new excalibur__WEBPACK_IMPORTED_MODULE_0__.TileMap({ + name: ldtkLayer.__identifier, + pos: this.worldPos.add(this.offset), + tileWidth: ldtkLayer.__gridSize, + tileHeight: ldtkLayer.__gridSize, + rows, + columns, }); - } - function makeReturnsIssue(returns, error) { - return makeIssue({ - data: returns, - path: ctx.path, - errorMaps: [ - ctx.common.contextualErrorMap, - ctx.schemaErrorMap, - getErrorMap(), - errorMap, - ].filter((x) => !!x), - issueData: { - code: ZodIssueCode.invalid_return_type, - returnTypeError: error, - }, + this.tilemap.z = order; + const graphics = this.tilemap.get(excalibur__WEBPACK_IMPORTED_MODULE_0__.GraphicsComponent); + graphics.isVisible = ldtkLayer.visible; + // find the intgrid metadata + const layerMetadata = resource.projectMetadata.defs.layers.find(l => { + return ldtkLayer.__identifier === l.identifier; }); - } - const params = { errorMap: ctx.common.contextualErrorMap }; - const fn = ctx.data; - if (this._def.returns instanceof ZodPromise) { - // Would love a way to avoid disabling this rule, but we need - // an alias (using an arrow function was what caused 2651). - // eslint-disable-next-line @typescript-eslint/no-this-alias - const me = this; - return OK(async function (...args) { - const error = new ZodError([]); - const parsedArgs = await me._def.args - .parseAsync(args, params) - .catch((e) => { - error.addIssue(makeArgsIssue(args, e)); - throw error; - }); - const result = await Reflect.apply(fn, this, parsedArgs); - const parsedReturns = await me._def.returns._def.type - .parseAsync(result, params) - .catch((e) => { - error.addIssue(makeReturnsIssue(result, e)); - throw error; + if (layerMetadata) { + const solidValue = layerMetadata.intGridValues.find(val => { + var _a; + return ((_a = val === null || val === void 0 ? void 0 : val.identifier) === null || _a === void 0 ? void 0 : _a.toLocaleLowerCase()) === 'solid'; }); - return parsedReturns; - }); - } - else { - // Would love a way to avoid disabling this rule, but we need - // an alias (using an arrow function was what caused 2651). - // eslint-disable-next-line @typescript-eslint/no-this-alias - const me = this; - return OK(function (...args) { - const parsedArgs = me._def.args.safeParse(args, params); - if (!parsedArgs.success) { - throw new ZodError([makeArgsIssue(args, parsedArgs.error)]); + for (let i = 0; i < ldtkLayer.intGridCsv.length; i++) { + const xCoord = i % columns; + const yCoord = Math.floor(i / columns); + const tile = this.tilemap.getTile(xCoord, yCoord); + if (solidValue && ldtkLayer.intGridCsv[i] === solidValue.value) { + tile.solid = true; + } + // TODO might be a mistake to treat 1 as solid if there isn't a labelled solid + if (!solidValue && ldtkLayer.intGridCsv[i] === 1) { + tile.solid = true; + } } - const result = Reflect.apply(fn, this, parsedArgs.data); - const parsedReturns = me._def.returns.safeParse(result, params); - if (!parsedReturns.success) { - throw new ZodError([makeReturnsIssue(result, parsedReturns.error)]); + if (ldtkLayer.__tilesetDefUid) { + this.tileset = resource.tilesets.get(ldtkLayer.__tilesetDefUid); + for (let i = 0; i < ldtkLayer.autoLayerTiles.length; i++) { + const tile = ldtkLayer.autoLayerTiles[i]; + const xCoord = Math.floor(tile.px[0] / ldtkLayer.__gridSize); + const yCoord = Math.floor(tile.px[1] / ldtkLayer.__gridSize); + const exTile = this.tilemap.getTile(xCoord, yCoord); + if (exTile && this.tileset) { + const tsxCoord = Math.floor((tile.src[0] - ((_a = this.tileset.ldtkTileset.padding) !== null && _a !== void 0 ? _a : 0)) / (this.tileset.ldtkTileset.tileGridSize + ((_b = this.tileset.ldtkTileset.spacing) !== null && _b !== void 0 ? _b : 0))); + const tsyCoord = Math.floor((tile.src[1] - ((_c = this.tileset.ldtkTileset.padding) !== null && _c !== void 0 ? _c : 0)) / (this.tileset.ldtkTileset.tileGridSize + ((_d = this.tileset.ldtkTileset.spacing) !== null && _d !== void 0 ? _d : 0))); + // Bit 0 toggles x flip + // Bit 1 toggles 1 flip + // Examples: f=0 (no flip), f=1 (X flip only), f=2 (Y flip only), f=3 (both flips) + const flipHorizontal = !!(tile.f & 0b01); + const flipVertical = !!(tile.f & 0b10); + let sprite = this.tileset.spritesheet.getSprite(tsxCoord, tsyCoord); + if (flipHorizontal || flipVertical) { + sprite = sprite.clone(); + sprite.flipHorizontal = flipHorizontal; + sprite.flipVertical = flipVertical; + } + if (sprite) { + exTile.addGraphic(sprite); + } + else { + console.error('Could not find sprite in LDtk spritesheet at', tsxCoord, tsyCoord); + } + } + } } - return parsedReturns.data; - }); + } } } - parameters() { - return this._def.args; - } - returnType() { - return this._def.returns; - } - args(...items) { - return new ZodFunction({ - ...this._def, - args: ZodTuple.create(items).rest(ZodUnknown.create()), - }); - } - returns(returnType) { - return new ZodFunction({ - ...this._def, - returns: returnType, - }); - } - implement(func) { - const validatedFunc = this.parse(func); - return validatedFunc; - } - strictImplement(func) { - const validatedFunc = this.parse(func); - return validatedFunc; - } - static create(args, returns, params) { - return new ZodFunction({ - args: (args - ? args - : ZodTuple.create([]).rest(ZodUnknown.create())), - returns: returns || ZodUnknown.create(), - typeName: ZodFirstPartyTypeKind.ZodFunction, - ...processCreateParams(params), - }); - } -} -class ZodLazy extends ZodType { - get schema() { - return this._def.getter(); - } - _parse(input) { - const { ctx } = this._processInputParams(input); - const lazySchema = this._def.getter(); - return lazySchema._parse({ data: ctx.data, path: ctx.path, parent: ctx }); - } } -ZodLazy.create = (getter, params) => { - return new ZodLazy({ - getter: getter, - typeName: ZodFirstPartyTypeKind.ZodLazy, - ...processCreateParams(params), - }); -}; -class ZodLiteral extends ZodType { - _parse(input) { - if (input.data !== this._def.value) { - const ctx = this._getOrReturnCtx(input); - addIssueToContext(ctx, { - received: ctx.data, - code: ZodIssueCode.invalid_literal, - expected: this._def.value, - }); - return INVALID; + + +/***/ }), + +/***/ "./src/ldtk-resource.ts": +/*!******************************!*\ + !*** ./src/ldtk-resource.ts ***! + \******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ LdtkResource: () => (/* binding */ LdtkResource) +/* harmony export */ }); +/* harmony import */ var _tile_layer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./tile-layer */ "./src/tile-layer.ts"); +/* harmony import */ var _path_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./path-util */ "./src/path-util.ts"); +/* harmony import */ var _file_loader__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./file-loader */ "./src/file-loader.ts"); +/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./types */ "./src/types.ts"); +/* harmony import */ var compare_versions__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! compare-versions */ "./node_modules/compare-versions/lib/esm/compare.js"); +/* harmony import */ var _loader_cache__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./loader-cache */ "./src/loader-cache.ts"); +/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); +/* harmony import */ var _level_resource__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./level-resource */ "./src/level-resource.ts"); +/* harmony import */ var _tileset__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./tileset */ "./src/tileset.ts"); +/* harmony import */ var _level__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./level */ "./src/level.ts"); +/* harmony import */ var _entity_layer__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./entity-layer */ "./src/entity-layer.ts"); +/* harmony import */ var _intgrid_layer__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./intgrid-layer */ "./src/intgrid-layer.ts"); + + + + + + + + + + + + +class LdtkResource { + constructor(path, options) { + this.path = path; + this.tilesets = new Map(); + this.levels = new Map(); + this.levelsByName = new Map(); + this.factories = new Map(); + this.fileLoader = _file_loader__WEBPACK_IMPORTED_MODULE_2__.FetchLoader; + this._imageLoader = new _loader_cache__WEBPACK_IMPORTED_MODULE_5__.LoaderCache(excalibur__WEBPACK_IMPORTED_MODULE_6__.ImageSource); + this._levelLoader = new _loader_cache__WEBPACK_IMPORTED_MODULE_5__.LoaderCache(_level_resource__WEBPACK_IMPORTED_MODULE_7__.LevelResource); + this.startZIndex = 0; + this.textQuality = 4; + this.useExcaliburWiring = true; + this.useMapBackgroundColor = false; + this.useTilemapCameraStrategy = false; + this.headless = false; + this.strict = true; + const { useExcaliburWiring, useTilemapCameraStrategy, entityIdentifierFactories, pathMap, useMapBackgroundColor, fileLoader, strict, headless, startZIndex } = { ...options }; + this.strict = strict !== null && strict !== void 0 ? strict : this.strict; + this.headless = headless !== null && headless !== void 0 ? headless : this.headless; + this.useExcaliburWiring = useExcaliburWiring !== null && useExcaliburWiring !== void 0 ? useExcaliburWiring : this.useExcaliburWiring; + this.useTilemapCameraStrategy = useTilemapCameraStrategy !== null && useTilemapCameraStrategy !== void 0 ? useTilemapCameraStrategy : this.useTilemapCameraStrategy; + this.useMapBackgroundColor = useMapBackgroundColor !== null && useMapBackgroundColor !== void 0 ? useMapBackgroundColor : this.useMapBackgroundColor; + this.startZIndex = startZIndex !== null && startZIndex !== void 0 ? startZIndex : this.startZIndex; + this.fileLoader = fileLoader !== null && fileLoader !== void 0 ? fileLoader : this.fileLoader; + this.pathMap = pathMap; + for (const key in entityIdentifierFactories) { + this.registerEntityIdentifierFactory(key, entityIdentifierFactories[key]); } - return { status: "valid", value: input.data }; - } - get value() { - return this._def.value; - } -} -ZodLiteral.create = (value, params) => { - return new ZodLiteral({ - value: value, - typeName: ZodFirstPartyTypeKind.ZodLiteral, - ...processCreateParams(params), - }); -}; -function createZodEnum(values, params) { - return new ZodEnum({ - values, - typeName: ZodFirstPartyTypeKind.ZodEnum, - ...processCreateParams(params), - }); -} -class ZodEnum extends ZodType { - constructor() { - super(...arguments); - _ZodEnum_cache.set(this, void 0); } - _parse(input) { - if (typeof input.data !== "string") { - const ctx = this._getOrReturnCtx(input); - const expectedValues = this._def.values; - addIssueToContext(ctx, { - expected: util.joinValues(expectedValues), - received: ctx.parsedType, - code: ZodIssueCode.invalid_type, - }); - return INVALID; + async load() { + var _a; + const data = await this.fileLoader(this.path, 'json'); + if (this.strict) { + try { + this.projectMetadata = _types__WEBPACK_IMPORTED_MODULE_3__.LdtkProjectMetadata.parse(data); + } + catch (e) { + console.error(`Could not parse LDtk map from location ${this.path}.\nExcalibur only supports the latest version of LDtk formats as of the plugin's release.`); + console.error(`Is your map file corrupted or being interpreted as the wrong type?`); + throw e; + } } - if (!__classPrivateFieldGet(this, _ZodEnum_cache, "f")) { - __classPrivateFieldSet(this, _ZodEnum_cache, new Set(this._def.values), "f"); + else { + this.projectMetadata = data; } - if (!__classPrivateFieldGet(this, _ZodEnum_cache, "f").has(input.data)) { - const ctx = this._getOrReturnCtx(input); - const expectedValues = this._def.values; - addIssueToContext(ctx, { - received: ctx.data, - code: ZodIssueCode.invalid_enum_value, - options: expectedValues, - }); - return INVALID; + if ((0,compare_versions__WEBPACK_IMPORTED_MODULE_4__.compare)(LdtkResource.supportedLdtkVersion, (_a = this.projectMetadata.jsonVersion) !== null && _a !== void 0 ? _a : '0.0.0', ">")) { + console.warn(`The excalibur ldtk plugin officially supports ${LdtkResource.supportedLdtkVersion}+, the current map has LDtk version ${this.projectMetadata.jsonVersion}`); } - return OK(input.data); - } - get options() { - return this._def.values; - } - get enum() { - const enumValues = {}; - for (const val of this._def.values) { - enumValues[val] = val; + // iterate through the defs + // load the tilesets + const imagesToLoad = []; + for (let tileset of this.projectMetadata.defs.tilesets) { + if (tileset.relPath) { + const imagePath = (0,_path_util__WEBPACK_IMPORTED_MODULE_1__.pathRelativeToBase)(this.path, tileset.relPath, this.pathMap); + const image = this._imageLoader.getOrAdd(imagePath); + const friendlyTileset = new _tileset__WEBPACK_IMPORTED_MODULE_8__.Tileset({ + image, + ldtkTileset: tileset + }); + this.tilesets.set(tileset.uid, friendlyTileset); + } + else { + if (tileset.identifier !== 'Internal_Icons') { + console.warn(`No tileset image provided for ${tileset.identifier}`); + } + } } - return enumValues; - } - get Values() { - const enumValues = {}; - for (const val of this._def.values) { - enumValues[val] = val; + // iterate through the levels + // load the level metadata + for (let level of this.projectMetadata.levels) { + if (level.externalRelPath) { + // external levels + const levelPath = (0,_path_util__WEBPACK_IMPORTED_MODULE_1__.pathRelativeToBase)(this.path, level.externalRelPath, this.pathMap); + this._levelLoader.getOrAdd(levelPath, this, { + headless: this.headless, + strict: this.strict, + fileLoader: this.fileLoader, + imageLoader: this._imageLoader, + pathMap: this.pathMap + }); + } + else { + // embedded levels + const friendlyLevel = new _level__WEBPACK_IMPORTED_MODULE_9__.Level(level, this); + this.levels.set(level.uid, friendlyLevel); + this.levelsByName.set(level.identifier.toLowerCase(), friendlyLevel); + } } - return enumValues; + await Promise.all([this._imageLoader.load(), this._levelLoader.load()]); + this._levelLoader.values().forEach(level => { + this.levels.set(level.data.ldtkLevel.uid, level.data); + this.levelsByName.set(level.data.ldtkLevel.identifier.toLowerCase(), level.data); + }); + return this.data = this.projectMetadata; } - get Enum() { - const enumValues = {}; - for (const val of this._def.values) { - enumValues[val] = val; - } - return enumValues; + ; + isLoaded() { + return !!this.data; } - extract(values, newDef = this._def) { - return ZodEnum.create(values, { - ...this._def, - ...newDef, - }); + registerEntityIdentifierFactory(ldtkEntityIdentifier, factory) { + this.factories.set(ldtkEntityIdentifier, factory); } - exclude(values, newDef = this._def) { - return ZodEnum.create(this.options.filter((opt) => !values.includes(opt)), { - ...this._def, - ...newDef, - }); + registerEntityIdentifierFactories(factories) { + for (const key in factories) { + this.registerEntityIdentifierFactory(key, factories[key]); + } } -} -_ZodEnum_cache = new WeakMap(); -ZodEnum.create = createZodEnum; -class ZodNativeEnum extends ZodType { - constructor() { - super(...arguments); - _ZodNativeEnum_cache.set(this, void 0); + /** + * Get a level by identifier + * @param identifier + * @returns + */ + getLevel(identifier) { + return this.levelsByName.get(identifier.toLowerCase()); } - _parse(input) { - const nativeEnumValues = util.getValidEnumValues(this._def.values); - const ctx = this._getOrReturnCtx(input); - if (ctx.parsedType !== ZodParsedType.string && - ctx.parsedType !== ZodParsedType.number) { - const expectedValues = util.objectValues(nativeEnumValues); - addIssueToContext(ctx, { - expected: util.joinValues(expectedValues), - received: ctx.parsedType, - code: ZodIssueCode.invalid_type, - }); - return INVALID; + /** + * Get the entity layers, optionally provide a level identifier to filter to + * @param levelIdentifier + */ + getEntityLayers(levelIdentifier) { + let results = []; + if (levelIdentifier) { + const level = this.getLevel(levelIdentifier); + if (level) { + for (let layer of level.layers) { + if (layer instanceof _entity_layer__WEBPACK_IMPORTED_MODULE_10__.EntityLayer) { + results.push(layer); + } + } + } } - if (!__classPrivateFieldGet(this, _ZodNativeEnum_cache, "f")) { - __classPrivateFieldSet(this, _ZodNativeEnum_cache, new Set(util.getValidEnumValues(this._def.values)), "f"); + else { + for (const level of this.levels.values()) { + for (let layer of level.layers) { + if (layer instanceof _entity_layer__WEBPACK_IMPORTED_MODULE_10__.EntityLayer) { + results.push(layer); + } + } + } } - if (!__classPrivateFieldGet(this, _ZodNativeEnum_cache, "f").has(input.data)) { - const expectedValues = util.objectValues(nativeEnumValues); - addIssueToContext(ctx, { - received: ctx.data, - code: ZodIssueCode.invalid_enum_value, - options: expectedValues, - }); - return INVALID; + return results; + } + getTileLayers(identifier) { + let results = []; + if (identifier) { + const level = this.getLevel(identifier); + if (level) { + for (let layer of level.layers) { + if (layer instanceof _tile_layer__WEBPACK_IMPORTED_MODULE_0__.TileLayer) { + results.push(layer); + } + } + } } - return OK(input.data); + else { + for (const level of this.levels.values()) { + for (let layer of level.layers) { + if (layer instanceof _tile_layer__WEBPACK_IMPORTED_MODULE_0__.TileLayer) { + results.push(layer); + } + } + } + } + return results; } - get enum() { - return this._def.values; + getIntGridLayers(identifier) { + let results = []; + if (identifier) { + const level = this.getLevel(identifier); + if (level) { + for (let layer of level.layers) { + if (layer instanceof _intgrid_layer__WEBPACK_IMPORTED_MODULE_11__.IntGridLayer) { + results.push(layer); + } + } + } + } + else { + for (const level of this.levels.values()) { + for (let layer of level.layers) { + if (layer instanceof _intgrid_layer__WEBPACK_IMPORTED_MODULE_11__.IntGridLayer) { + results.push(layer); + } + } + } + } + return results; } -} -_ZodNativeEnum_cache = new WeakMap(); -ZodNativeEnum.create = (values, params) => { - return new ZodNativeEnum({ - values: values, - typeName: ZodFirstPartyTypeKind.ZodNativeEnum, - ...processCreateParams(params), - }); -}; -class ZodPromise extends ZodType { - unwrap() { - return this._def.type; + /** + * Search layer for entities that match an identifier (case insensitive) + * @param identifier + * @returns + */ + getLdtkEntitiesByIdentifier(identifier, levels) { + let results = []; + const levelsToSearch = levels !== null && levels !== void 0 ? levels : Array.from(this.levels.values()).map(l => l.ldtkLevel.identifier); + for (const level of levelsToSearch) { + const layers = this.getEntityLayers(level); + for (let layer of layers) { + results = results.concat(layer.getLdtkEntitiesByIdentifier(identifier)); + } + } + return results; } - _parse(input) { - const { ctx } = this._processInputParams(input); - if (ctx.parsedType !== ZodParsedType.promise && - ctx.common.async === false) { - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_type, - expected: ZodParsedType.promise, - received: ctx.parsedType, - }); - return INVALID; + /** + * Search levels for ldtk entities that match a field and optionally a value (both case insensitive) + * @param fieldIdentifier + * @param value + */ + getLdtkEntitiesByField(fieldIdentifier, value, levels) { + let results = []; + const levelsToSearch = levels !== null && levels !== void 0 ? levels : Array.from(this.levels.values()).map(l => l.ldtkLevel.identifier); + for (const level of levelsToSearch) { + const layers = this.getEntityLayers(level); + for (let layer of layers) { + results = results.concat(layer.getLdtkEntitiesByField(fieldIdentifier, value)); + } } - const promisified = ctx.parsedType === ZodParsedType.promise - ? ctx.data - : Promise.resolve(ctx.data); - return OK(promisified.then((data) => { - return this._def.type.parseAsync(data, { - path: ctx.path, - errorMap: ctx.common.contextualErrorMap, - }); - })); + return results; } -} -ZodPromise.create = (schema, params) => { - return new ZodPromise({ - type: schema, - typeName: ZodFirstPartyTypeKind.ZodPromise, - ...processCreateParams(params), - }); -}; -class ZodEffects extends ZodType { - innerType() { - return this._def.schema; + /** + * Search levels for excalibur entities that match an identifier (case insensitive) + * @param identifier + * @param levels + */ + getEntitiesByIdentifier(identifier, levels) { + let results = []; + const levelsToSearch = levels !== null && levels !== void 0 ? levels : Array.from(this.levels.values()).map(l => l.ldtkLevel.identifier); + for (const level of levelsToSearch) { + const layers = this.getEntityLayers(level); + for (let layer of layers) { + results = results.concat(layer.getEntitiesByIdentifier(identifier)); + } + } + return results; } - sourceType() { - return this._def.schema._def.typeName === ZodFirstPartyTypeKind.ZodEffects - ? this._def.schema.sourceType() - : this._def.schema; + /** + * Search levels for excalibur entities that match a field and optionally a value (both case insensitive) + * @param fieldIdentifier + * @param value + * @param levels + */ + getEntitiesByField(fieldIdentifier, value, levels) { + let results = []; + const levelsToSearch = levels !== null && levels !== void 0 ? levels : Array.from(this.levels.values()).map(l => l.ldtkLevel.identifier); + for (const level of levelsToSearch) { + const layers = this.getEntityLayers(level); + for (let layer of layers) { + results = results.concat(layer.getEntitiesByField(fieldIdentifier, value)); + } + } + return results; } - _parse(input) { - const { status, ctx } = this._processInputParams(input); - const effect = this._def.effect || null; - const checkCtx = { - addIssue: (arg) => { - addIssueToContext(ctx, arg); - if (arg.fatal) { - status.abort(); + /** + * Get the level bounds given a list of level identifiers (case insensitive) + * @param levels + */ + getLevelBounds(levels) { + levels = levels !== null && levels !== void 0 ? levels : Array.from(this.levelsByName.keys()); + let bounds = null; + for (const level of this.levels.values()) { + if (!levels.includes(level.ldtkLevel.identifier)) { + continue; + } + const firstTileLayer = this.getTileLayers(level.ldtkLevel.identifier)[0]; + if (firstTileLayer) { + const tileBounds = excalibur__WEBPACK_IMPORTED_MODULE_6__.BoundingBox.fromDimension(firstTileLayer.tilemap.tileWidth * firstTileLayer.tilemap.columns, firstTileLayer.tilemap.tileHeight * firstTileLayer.tilemap.rows, excalibur__WEBPACK_IMPORTED_MODULE_6__.Vector.Zero, firstTileLayer.tilemap.pos); + if (!bounds) { + bounds = tileBounds; } else { - status.dirty(); + bounds = bounds.combine(tileBounds); } - }, - get path() { - return ctx.path; - }, - }; - checkCtx.addIssue = checkCtx.addIssue.bind(checkCtx); - if (effect.type === "preprocess") { - const processed = effect.transform(ctx.data, checkCtx); - if (ctx.common.async) { - return Promise.resolve(processed).then(async (processed) => { - if (status.value === "aborted") - return INVALID; - const result = await this._def.schema._parseAsync({ - data: processed, - path: ctx.path, - parent: ctx, - }); - if (result.status === "aborted") - return INVALID; - if (result.status === "dirty") - return DIRTY(result.value); - if (status.value === "dirty") - return DIRTY(result.value); - return result; - }); - } - else { - if (status.value === "aborted") - return INVALID; - const result = this._def.schema._parseSync({ - data: processed, - path: ctx.path, - parent: ctx, - }); - if (result.status === "aborted") - return INVALID; - if (result.status === "dirty") - return DIRTY(result.value); - if (status.value === "dirty") - return DIRTY(result.value); - return result; } } - if (effect.type === "refinement") { - const executeRefinement = (acc) => { - const result = effect.refinement(acc, checkCtx); - if (ctx.common.async) { - return Promise.resolve(result); + return bounds !== null && bounds !== void 0 ? bounds : new excalibur__WEBPACK_IMPORTED_MODULE_6__.BoundingBox(); + } + addToScene(scene, options) { + var _a, _b; + const { pos, useLevelOffsets } = { pos: (0,excalibur__WEBPACK_IMPORTED_MODULE_6__.vec)(0, 0), useLevelOffsets: true, ...options }; + for (let [id, level] of this.levels.entries()) { + if ((_a = options === null || options === void 0 ? void 0 : options.levelFilter) === null || _a === void 0 ? void 0 : _a.length) { + if (!options.levelFilter.includes(level.ldtkLevel.identifier)) { + continue; } - if (result instanceof Promise) { - throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead."); + } + for (let layer of level.layers) { + if (layer instanceof _tile_layer__WEBPACK_IMPORTED_MODULE_0__.TileLayer || layer instanceof _intgrid_layer__WEBPACK_IMPORTED_MODULE_11__.IntGridLayer) { + layer.tilemap.pos = layer.tilemap.pos.add(pos); + if (!useLevelOffsets) { + layer.tilemap.pos = layer.tilemap.pos.sub(layer.worldPos); + } + scene.add(layer.tilemap); + } + else { + layer.runFactories(); + for (let entity of layer.entities) { + const tx = entity.get(excalibur__WEBPACK_IMPORTED_MODULE_6__.TransformComponent); + if (tx) { + tx.pos = tx.pos.add(pos); + if (!useLevelOffsets) { + tx.pos = tx.pos.sub(layer.worldPos); + } + } + scene.add(entity); + } } - return acc; - }; - if (ctx.common.async === false) { - const inner = this._def.schema._parseSync({ - data: ctx.data, - path: ctx.path, - parent: ctx, - }); - if (inner.status === "aborted") - return INVALID; - if (inner.status === "dirty") - status.dirty(); - // return value is ignored - executeRefinement(inner.value); - return { status: status.value, value: inner.value }; } - else { - return this._def.schema - ._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }) - .then((inner) => { - if (inner.status === "aborted") - return INVALID; - if (inner.status === "dirty") - status.dirty(); - return executeRefinement(inner.value).then(() => { - return { status: status.value, value: inner.value }; - }); - }); + } + if (this.useExcaliburWiring) { + const camera = this.getLdtkEntitiesByField('camera', true)[0]; + if (camera) { + scene.camera.pos = (0,excalibur__WEBPACK_IMPORTED_MODULE_6__.vec)(camera.px[0], camera.px[0]); + const zoom = camera.fieldInstances.find(f => f.__identifier.toLocaleLowerCase() === 'zoom'); + if (zoom) { + scene.camera.zoom = +zoom.__value; + } } } - if (effect.type === "transform") { - if (ctx.common.async === false) { - const base = this._def.schema._parseSync({ - data: ctx.data, - path: ctx.path, - parent: ctx, - }); - if (!isValid(base)) - return base; - const result = effect.transform(base.value, checkCtx); - if (result instanceof Promise) { - throw new Error(`Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.`); + if (this.useTilemapCameraStrategy) { + let bounds = this.getLevelBounds(options === null || options === void 0 ? void 0 : options.levelFilter); + scene.camera.strategy.limitCameraBounds(bounds); + } + if (this.useMapBackgroundColor) { + for (let [id, level] of this.levels.entries()) { + if ((_b = options === null || options === void 0 ? void 0 : options.levelFilter) === null || _b === void 0 ? void 0 : _b.length) { + if (!options.levelFilter.includes(level.ldtkLevel.identifier)) { + continue; + } } - return { status: status.value, value: result }; - } - else { - return this._def.schema - ._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }) - .then((base) => { - if (!isValid(base)) - return base; - return Promise.resolve(effect.transform(base.value, checkCtx)).then((result) => ({ status: status.value, value: result })); - }); + scene.backgroundColor = level.backgroundColor; + break; } } - util.assertNever(effect); } } -ZodEffects.create = (schema, effect, params) => { - return new ZodEffects({ - schema, - typeName: ZodFirstPartyTypeKind.ZodEffects, - effect, - ...processCreateParams(params), - }); -}; -ZodEffects.createWithPreprocess = (preprocess, schema, params) => { - return new ZodEffects({ - schema, - effect: { type: "preprocess", transform: preprocess }, - typeName: ZodFirstPartyTypeKind.ZodEffects, - ...processCreateParams(params), - }); -}; -class ZodOptional extends ZodType { - _parse(input) { - const parsedType = this._getType(input); - if (parsedType === ZodParsedType.undefined) { - return OK(undefined); +LdtkResource.supportedLdtkVersion = "1.5.3"; + + +/***/ }), + +/***/ "./src/level-resource.ts": +/*!*******************************!*\ + !*** ./src/level-resource.ts ***! + \*******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ LevelResource: () => (/* binding */ LevelResource) +/* harmony export */ }); +/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); +/* harmony import */ var _loader_cache__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./loader-cache */ "./src/loader-cache.ts"); +/* harmony import */ var _file_loader__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./file-loader */ "./src/file-loader.ts"); +/* harmony import */ var _level__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./level */ "./src/level.ts"); +/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./types */ "./src/types.ts"); + + + + + +/** + * Loads LDtk levels that are stored in separate files + */ +class LevelResource { + constructor(path, resource, options) { + this.path = path; + this.resource = resource; + this.fileLoader = _file_loader__WEBPACK_IMPORTED_MODULE_2__.FetchLoader; + this.strict = true; + this.headless = false; + const { headless, strict, fileLoader, imageLoader, pathMap } = { ...options }; + this.fileLoader = fileLoader !== null && fileLoader !== void 0 ? fileLoader : this.fileLoader; + this.strict = strict !== null && strict !== void 0 ? strict : this.strict; + this.headless = headless !== null && headless !== void 0 ? headless : this.headless; + this.imageLoader = imageLoader !== null && imageLoader !== void 0 ? imageLoader : new _loader_cache__WEBPACK_IMPORTED_MODULE_1__.LoaderCache(excalibur__WEBPACK_IMPORTED_MODULE_0__.ImageSource); + this.pathMap = pathMap !== null && pathMap !== void 0 ? pathMap : this.pathMap; + } + async load() { + const data = await this.fileLoader(this.path, 'json'); + let level; + if (this.strict) { + try { + level = _types__WEBPACK_IMPORTED_MODULE_4__.LdtkLevel.parse(data); + } + catch (e) { + console.error(`Could not parse LDtk level data at ${this.path} are you sure a level is there and not corrupt?`); + throw e; + } } - return this._def.innerType._parse(input); + else { + level = data; + } + return this.data = new _level__WEBPACK_IMPORTED_MODULE_3__.Level(level, this.resource); } - unwrap() { - return this._def.innerType; + isLoaded() { + return !!this.data; } } -ZodOptional.create = (type, params) => { - return new ZodOptional({ - innerType: type, - typeName: ZodFirstPartyTypeKind.ZodOptional, - ...processCreateParams(params), - }); -}; -class ZodNullable extends ZodType { - _parse(input) { - const parsedType = this._getType(input); - if (parsedType === ZodParsedType.null) { - return OK(null); + + +/***/ }), + +/***/ "./src/level.ts": +/*!**********************!*\ + !*** ./src/level.ts ***! + \**********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ Level: () => (/* binding */ Level) +/* harmony export */ }); +/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); +/* harmony import */ var _entity_layer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./entity-layer */ "./src/entity-layer.ts"); +/* harmony import */ var _intgrid_layer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./intgrid-layer */ "./src/intgrid-layer.ts"); +/* harmony import */ var _tile_layer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tile-layer */ "./src/tile-layer.ts"); + + + + +class Level { + constructor(ldtkLevel, resource) { + var _a, _b, _c, _d; + this.ldtkLevel = ldtkLevel; + this.resource = resource; + this.layers = []; + if (ldtkLevel.__bgColor) { + this.backgroundColor = excalibur__WEBPACK_IMPORTED_MODULE_0__.Color.fromHex(ldtkLevel.__bgColor); + } + if (ldtkLevel.layerInstances) { + let order = resource.startZIndex; + let layers = ldtkLevel.layerInstances.slice().reverse(); + for (let layer of layers) { + if (((_a = layer.entityInstances) === null || _a === void 0 ? void 0 : _a.length) !== 0) { + this.layers.push(new _entity_layer__WEBPACK_IMPORTED_MODULE_1__.EntityLayer(this, layer, resource, order)); + } + if (((_b = layer.gridTiles) === null || _b === void 0 ? void 0 : _b.length) !== 0) { + this.layers.push(new _tile_layer__WEBPACK_IMPORTED_MODULE_3__.TileLayer(this, layer, resource, order)); + } + // Includes standard IntGrid, IntGrid w/ AutoTile & AutoTile layers + if (((_c = layer.intGridCsv) === null || _c === void 0 ? void 0 : _c.length) !== 0 || ((_d = layer.autoLayerTiles) === null || _d === void 0 ? void 0 : _d.length) !== 0) { + this.layers.push(new _intgrid_layer__WEBPACK_IMPORTED_MODULE_2__.IntGridLayer(this, layer, resource, order)); + } + order++; + } } - return this._def.innerType._parse(input); - } - unwrap() { - return this._def.innerType; } } -ZodNullable.create = (type, params) => { - return new ZodNullable({ - innerType: type, - typeName: ZodFirstPartyTypeKind.ZodNullable, - ...processCreateParams(params), - }); -}; -class ZodDefault extends ZodType { - _parse(input) { - const { ctx } = this._processInputParams(input); - let data = ctx.data; - if (ctx.parsedType === ZodParsedType.undefined) { - data = this._def.defaultValue(); + + +/***/ }), + +/***/ "./src/loader-cache.ts": +/*!*****************************!*\ + !*** ./src/loader-cache.ts ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ LoaderCache: () => (/* binding */ LoaderCache) +/* harmony export */ }); +/** + * Read through cache for loadables + */ +class LoaderCache { + constructor(type) { + this.type = type; + this._loaded = false; + this.cache = new Map(); + } + getOrAdd(...args) { + let resource = this.cache.get(args.join('+')); + if (resource) { + return resource; } - return this._def.innerType._parse({ - data, - path: ctx.path, - parent: ctx, - }); + resource = new this.type(...args); + this.cache.set(args.join('+'), resource); + return resource; } - removeDefault() { - return this._def.innerType; + values() { + if (this._loaded) { + return Array.from(this.cache.values()); + } + throw new Error(`Read through cache not yet loaded! No values to return!`); } -} -ZodDefault.create = (type, params) => { - return new ZodDefault({ - innerType: type, - typeName: ZodFirstPartyTypeKind.ZodDefault, - defaultValue: typeof params.default === "function" - ? params.default - : () => params.default, - ...processCreateParams(params), - }); -}; -class ZodCatch extends ZodType { - _parse(input) { - const { ctx } = this._processInputParams(input); - // newCtx is used to not collect issues from inner types in ctx - const newCtx = { - ...ctx, - common: { - ...ctx.common, - issues: [], - }, - }; - const result = this._def.innerType._parse({ - data: newCtx.data, - path: newCtx.path, - parent: { - ...newCtx, - }, - }); - if (isAsync(result)) { - return result.then((result) => { - return { - status: "valid", - value: result.status === "valid" - ? result.value - : this._def.catchValue({ - get error() { - return new ZodError(newCtx.common.issues); - }, - input: newCtx.data, - }), - }; - }); + async load() { + const resources = Array.from(this.cache.entries()); + const results = await Promise.allSettled(resources.map(i => i[1].load())); + // Check for errors loading resources + let errored = 0; + for (let i = 0; i < results.length; i++) { + const result = results[i]; + if (result.status === 'rejected') { + console.error(`Error loading resource at ${resources[i][0]}, is your pathMap correct? or your LDtk map corrupted?`, result.reason); + errored++; + } } - else { - return { - status: "valid", - value: result.status === "valid" - ? result.value - : this._def.catchValue({ - get error() { - return new ZodError(newCtx.common.issues); - }, - input: newCtx.data, - }), - }; + if (errored) { + throw new Error(`Error loading ${errored} resources`); } - } - removeCatch() { - return this._def.innerType; + this._loaded = true; } } -ZodCatch.create = (type, params) => { - return new ZodCatch({ - innerType: type, - typeName: ZodFirstPartyTypeKind.ZodCatch, - catchValue: typeof params.catch === "function" ? params.catch : () => params.catch, - ...processCreateParams(params), - }); -}; -class ZodNaN extends ZodType { - _parse(input) { - const parsedType = this._getType(input); - if (parsedType !== ZodParsedType.nan) { - const ctx = this._getOrReturnCtx(input); - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_type, - expected: ZodParsedType.nan, - received: ctx.parsedType, - }); - return INVALID; - } - return { status: "valid", value: input.data }; + + +/***/ }), + +/***/ "./src/path-util.ts": +/*!**************************!*\ + !*** ./src/path-util.ts ***! + \**************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ filenameFromPath: () => (/* binding */ filenameFromPath), +/* harmony export */ mapPath: () => (/* binding */ mapPath), +/* harmony export */ pathInMap: () => (/* binding */ pathInMap), +/* harmony export */ pathRelativeToBase: () => (/* binding */ pathRelativeToBase) +/* harmony export */ }); +function filenameFromPath(inputPath) { + const filenameExpression = /[^/\\&\?]+\.\w{2,4}(?=([\#\?&].*$|$))/ig; + const matches = inputPath.match(filenameExpression); + if (matches) { + const match = matches[0]; + return match; } + throw new Error(`Could not locate filename from path: ${inputPath}`); } -ZodNaN.create = (params) => { - return new ZodNaN({ - typeName: ZodFirstPartyTypeKind.ZodNaN, - ...processCreateParams(params), - }); -}; -const BRAND = Symbol("zod_brand"); -class ZodBranded extends ZodType { - _parse(input) { - const { ctx } = this._processInputParams(input); - const data = ctx.data; - return this._def.type._parse({ - data, - path: ctx.path, - parent: ctx, - }); - } - unwrap() { - return this._def.type; +function mapPath(inputPath, pathMap) { + for (const { path, output } of pathMap) { + if (typeof path === 'string') { + if (inputPath.includes(path)) { + return output; + } + } + else { + const match = inputPath.match(path); + if (match) { + return output.replace('[match]', match[0]); + // removed by dead control flow +{} + } + } } + return inputPath; } -class ZodPipeline extends ZodType { - _parse(input) { - const { status, ctx } = this._processInputParams(input); - if (ctx.common.async) { - const handleAsync = async () => { - const inResult = await this._def.in._parseAsync({ - data: ctx.data, - path: ctx.path, - parent: ctx, - }); - if (inResult.status === "aborted") - return INVALID; - if (inResult.status === "dirty") { - status.dirty(); - return DIRTY(inResult.value); - } - else { - return this._def.out._parseAsync({ - data: inResult.value, - path: ctx.path, - parent: ctx, - }); - } - }; - return handleAsync(); +function pathInMap(inputPath, pathMap) { + if (!pathMap) + return false; + for (const { path, output } of pathMap) { + if (typeof path === 'string') { + if (inputPath.includes(path)) { + return true; + } } else { - const inResult = this._def.in._parseSync({ - data: ctx.data, - path: ctx.path, - parent: ctx, - }); - if (inResult.status === "aborted") - return INVALID; - if (inResult.status === "dirty") { - status.dirty(); - return { - status: "dirty", - value: inResult.value, - }; - } - else { - return this._def.out._parseSync({ - data: inResult.value, - path: ctx.path, - parent: ctx, - }); + const match = inputPath.match(path); + if (match) { + return true; } } } - static create(a, b) { - return new ZodPipeline({ - in: a, - out: b, - typeName: ZodFirstPartyTypeKind.ZodPipeline, - }); - } + return false; } -class ZodReadonly extends ZodType { - _parse(input) { - const result = this._def.innerType._parse(input); - const freeze = (data) => { - if (isValid(data)) { - data.value = Object.freeze(data.value); - } - return data; - }; - return isAsync(result) - ? result.then((data) => freeze(data)) - : freeze(result); +function pathRelativeToBase(basePath, relativeToBase, pathMap) { + if (pathInMap(relativeToBase, pathMap) && pathMap) { + return mapPath(relativeToBase, pathMap); } - unwrap() { - return this._def.innerType; + // Use absolute path if specified + if (relativeToBase.indexOf('/') === 0) { + return relativeToBase; + } + const originSplit = basePath.split('/'); + const relativeSplit = relativeToBase.split('/'); + // if origin path is a file, remove it so it's a directory + if (originSplit[originSplit.length - 1].includes('.')) { + originSplit.pop(); + } + return originSplit.concat(relativeSplit).join('/'); +} + + +/***/ }), + +/***/ "./src/tile-layer.ts": +/*!***************************!*\ + !*** ./src/tile-layer.ts ***! + \***************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ TileLayer: () => (/* binding */ TileLayer) +/* harmony export */ }); +/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); + +class TileLayer { + constructor(level, ldtkLayer, resource, order) { + var _a, _b, _c, _d; + this.order = order; + this.worldPos = (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(level.ldtkLevel.worldX, level.ldtkLevel.worldY); + this.offset = (0,excalibur__WEBPACK_IMPORTED_MODULE_0__.vec)(ldtkLayer.__pxTotalOffsetX, ldtkLayer.__pxTotalOffsetY); + this.ldtkLayer = ldtkLayer; + this.tilemap = new excalibur__WEBPACK_IMPORTED_MODULE_0__.TileMap({ + name: ldtkLayer.__identifier, + pos: this.worldPos.add(this.offset), + tileWidth: ldtkLayer.__gridSize, + tileHeight: ldtkLayer.__gridSize, + rows: ldtkLayer.__cHei, + columns: ldtkLayer.__cWid, + }); + this.tilemap.z = order; + const graphics = this.tilemap.get(excalibur__WEBPACK_IMPORTED_MODULE_0__.GraphicsComponent); + graphics.isVisible = ldtkLayer.visible; + if (ldtkLayer.__tilesetDefUid) { + this.tileset = resource.tilesets.get(ldtkLayer.__tilesetDefUid); + for (let tile of ldtkLayer.gridTiles) { + const xCoord = Math.floor(tile.px[0] / ldtkLayer.__gridSize); + const yCoord = Math.floor(tile.px[1] / ldtkLayer.__gridSize); + const exTile = this.tilemap.getTile(xCoord, yCoord); + if (this.tileset) { + const tsxCoord = Math.floor((tile.src[0] - ((_a = this.tileset.ldtkTileset.padding) !== null && _a !== void 0 ? _a : 0)) / (this.tileset.ldtkTileset.tileGridSize + ((_b = this.tileset.ldtkTileset.spacing) !== null && _b !== void 0 ? _b : 0))); + const tsyCoord = Math.floor((tile.src[1] - ((_c = this.tileset.ldtkTileset.padding) !== null && _c !== void 0 ? _c : 0)) / (this.tileset.ldtkTileset.tileGridSize + ((_d = this.tileset.ldtkTileset.spacing) !== null && _d !== void 0 ? _d : 0))); + // Bit 0 toggles x flip + // Bit 1 toggles 1 flip + // Examples: f=0 (no flip), f=1 (X flip only), f=2 (Y flip only), f=3 (both flips) + const flipHorizontal = !!(tile.f & 0b01); + const flipVertical = !!(tile.f & 0b10); + let sprite = this.tileset.spritesheet.getSprite(tsxCoord, tsyCoord); + if (flipHorizontal || flipVertical) { + sprite = sprite.clone(); + sprite.flipHorizontal = flipHorizontal; + sprite.flipVertical = flipVertical; + } + if (sprite) { + exTile.addGraphic(sprite); + } + else { + console.error('Could not find sprite in LDtk spritesheet at', tsxCoord, tsyCoord); + } + } + } + } + else { + console.error('Could not tileset in LDtk', ldtkLayer.__tilesetDefUid, ldtkLayer.__tilesetRelPath); + } } } -ZodReadonly.create = (type, params) => { - return new ZodReadonly({ - innerType: type, - typeName: ZodFirstPartyTypeKind.ZodReadonly, - ...processCreateParams(params), - }); -}; -function custom(check, params = {}, -/** - * @deprecated - * - * Pass `fatal` into the params object instead: - * - * ```ts - * z.string().custom((val) => val.length > 5, { fatal: false }) - * ``` - * - */ -fatal) { - if (check) - return ZodAny.create().superRefine((data, ctx) => { - var _a, _b; - if (!check(data)) { - const p = typeof params === "function" - ? params(data) - : typeof params === "string" - ? { message: params } - : params; - const _fatal = (_b = (_a = p.fatal) !== null && _a !== void 0 ? _a : fatal) !== null && _b !== void 0 ? _b : true; - const p2 = typeof p === "string" ? { message: p } : p; - ctx.addIssue({ code: "custom", ...p2, fatal: _fatal }); + + +/***/ }), + +/***/ "./src/tileset.ts": +/*!************************!*\ + !*** ./src/tileset.ts ***! + \************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ Tileset: () => (/* binding */ Tileset) +/* harmony export */ }); +/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); + +class Tileset { + constructor(options) { + var _a, _b, _c, _d; + const { image, ldtkTileset } = options; + this.image = image; + this.ldtkTileset = ldtkTileset; + this.spritesheet = excalibur__WEBPACK_IMPORTED_MODULE_0__.SpriteSheet.fromImageSource({ + image, + grid: { + rows: ldtkTileset.pxHei / ldtkTileset.tileGridSize, + columns: ldtkTileset.pxWid / ldtkTileset.tileGridSize, + spriteHeight: ldtkTileset.tileGridSize, + spriteWidth: ldtkTileset.tileGridSize + }, + spacing: { + margin: { + x: (_a = ldtkTileset.spacing) !== null && _a !== void 0 ? _a : 0, + y: (_b = ldtkTileset.spacing) !== null && _b !== void 0 ? _b : 0, + }, + originOffset: { + x: (_c = ldtkTileset.padding) !== null && _c !== void 0 ? _c : 0, + y: (_d = ldtkTileset.padding) !== null && _d !== void 0 ? _d : 0 + } } }); - return ZodAny.create(); + } } -const late = { - object: ZodObject.lazycreate, -}; -var ZodFirstPartyTypeKind; -(function (ZodFirstPartyTypeKind) { - ZodFirstPartyTypeKind["ZodString"] = "ZodString"; - ZodFirstPartyTypeKind["ZodNumber"] = "ZodNumber"; - ZodFirstPartyTypeKind["ZodNaN"] = "ZodNaN"; - ZodFirstPartyTypeKind["ZodBigInt"] = "ZodBigInt"; - ZodFirstPartyTypeKind["ZodBoolean"] = "ZodBoolean"; - ZodFirstPartyTypeKind["ZodDate"] = "ZodDate"; - ZodFirstPartyTypeKind["ZodSymbol"] = "ZodSymbol"; - ZodFirstPartyTypeKind["ZodUndefined"] = "ZodUndefined"; - ZodFirstPartyTypeKind["ZodNull"] = "ZodNull"; - ZodFirstPartyTypeKind["ZodAny"] = "ZodAny"; - ZodFirstPartyTypeKind["ZodUnknown"] = "ZodUnknown"; - ZodFirstPartyTypeKind["ZodNever"] = "ZodNever"; - ZodFirstPartyTypeKind["ZodVoid"] = "ZodVoid"; - ZodFirstPartyTypeKind["ZodArray"] = "ZodArray"; - ZodFirstPartyTypeKind["ZodObject"] = "ZodObject"; - ZodFirstPartyTypeKind["ZodUnion"] = "ZodUnion"; - ZodFirstPartyTypeKind["ZodDiscriminatedUnion"] = "ZodDiscriminatedUnion"; - ZodFirstPartyTypeKind["ZodIntersection"] = "ZodIntersection"; - ZodFirstPartyTypeKind["ZodTuple"] = "ZodTuple"; - ZodFirstPartyTypeKind["ZodRecord"] = "ZodRecord"; - ZodFirstPartyTypeKind["ZodMap"] = "ZodMap"; - ZodFirstPartyTypeKind["ZodSet"] = "ZodSet"; - ZodFirstPartyTypeKind["ZodFunction"] = "ZodFunction"; - ZodFirstPartyTypeKind["ZodLazy"] = "ZodLazy"; - ZodFirstPartyTypeKind["ZodLiteral"] = "ZodLiteral"; - ZodFirstPartyTypeKind["ZodEnum"] = "ZodEnum"; - ZodFirstPartyTypeKind["ZodEffects"] = "ZodEffects"; - ZodFirstPartyTypeKind["ZodNativeEnum"] = "ZodNativeEnum"; - ZodFirstPartyTypeKind["ZodOptional"] = "ZodOptional"; - ZodFirstPartyTypeKind["ZodNullable"] = "ZodNullable"; - ZodFirstPartyTypeKind["ZodDefault"] = "ZodDefault"; - ZodFirstPartyTypeKind["ZodCatch"] = "ZodCatch"; - ZodFirstPartyTypeKind["ZodPromise"] = "ZodPromise"; - ZodFirstPartyTypeKind["ZodBranded"] = "ZodBranded"; - ZodFirstPartyTypeKind["ZodPipeline"] = "ZodPipeline"; - ZodFirstPartyTypeKind["ZodReadonly"] = "ZodReadonly"; -})(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {})); -const instanceOfType = ( -// const instanceOfType = any>( -cls, params = { - message: `Input not instance of ${cls.name}`, -}) => custom((data) => data instanceof cls, params); -const stringType = ZodString.create; -const numberType = ZodNumber.create; -const nanType = ZodNaN.create; -const bigIntType = ZodBigInt.create; -const booleanType = ZodBoolean.create; -const dateType = ZodDate.create; -const symbolType = ZodSymbol.create; -const undefinedType = ZodUndefined.create; -const nullType = ZodNull.create; -const anyType = ZodAny.create; -const unknownType = ZodUnknown.create; -const neverType = ZodNever.create; -const voidType = ZodVoid.create; -const arrayType = ZodArray.create; -const objectType = ZodObject.create; -const strictObjectType = ZodObject.strictCreate; -const unionType = ZodUnion.create; -const discriminatedUnionType = ZodDiscriminatedUnion.create; -const intersectionType = ZodIntersection.create; -const tupleType = ZodTuple.create; -const recordType = ZodRecord.create; -const mapType = ZodMap.create; -const setType = ZodSet.create; -const functionType = ZodFunction.create; -const lazyType = ZodLazy.create; -const literalType = ZodLiteral.create; -const enumType = ZodEnum.create; -const nativeEnumType = ZodNativeEnum.create; -const promiseType = ZodPromise.create; -const effectsType = ZodEffects.create; -const optionalType = ZodOptional.create; -const nullableType = ZodNullable.create; -const preprocessType = ZodEffects.createWithPreprocess; -const pipelineType = ZodPipeline.create; -const ostring = () => stringType().optional(); -const onumber = () => numberType().optional(); -const oboolean = () => booleanType().optional(); -const coerce = { - string: ((arg) => ZodString.create({ ...arg, coerce: true })), - number: ((arg) => ZodNumber.create({ ...arg, coerce: true })), - boolean: ((arg) => ZodBoolean.create({ - ...arg, - coerce: true, - })), - bigint: ((arg) => ZodBigInt.create({ ...arg, coerce: true })), - date: ((arg) => ZodDate.create({ ...arg, coerce: true })), -}; -const NEVER = INVALID; -var z = /*#__PURE__*/Object.freeze({ - __proto__: null, - defaultErrorMap: errorMap, - setErrorMap: setErrorMap, - getErrorMap: getErrorMap, - makeIssue: makeIssue, - EMPTY_PATH: EMPTY_PATH, - addIssueToContext: addIssueToContext, - ParseStatus: ParseStatus, - INVALID: INVALID, - DIRTY: DIRTY, - OK: OK, - isAborted: isAborted, - isDirty: isDirty, - isValid: isValid, - isAsync: isAsync, - get util () { return util; }, - get objectUtil () { return objectUtil; }, - ZodParsedType: ZodParsedType, - getParsedType: getParsedType, - ZodType: ZodType, - datetimeRegex: datetimeRegex, - ZodString: ZodString, - ZodNumber: ZodNumber, - ZodBigInt: ZodBigInt, - ZodBoolean: ZodBoolean, - ZodDate: ZodDate, - ZodSymbol: ZodSymbol, - ZodUndefined: ZodUndefined, - ZodNull: ZodNull, - ZodAny: ZodAny, - ZodUnknown: ZodUnknown, - ZodNever: ZodNever, - ZodVoid: ZodVoid, - ZodArray: ZodArray, - ZodObject: ZodObject, - ZodUnion: ZodUnion, - ZodDiscriminatedUnion: ZodDiscriminatedUnion, - ZodIntersection: ZodIntersection, - ZodTuple: ZodTuple, - ZodRecord: ZodRecord, - ZodMap: ZodMap, - ZodSet: ZodSet, - ZodFunction: ZodFunction, - ZodLazy: ZodLazy, - ZodLiteral: ZodLiteral, - ZodEnum: ZodEnum, - ZodNativeEnum: ZodNativeEnum, - ZodPromise: ZodPromise, - ZodEffects: ZodEffects, - ZodTransformer: ZodEffects, - ZodOptional: ZodOptional, - ZodNullable: ZodNullable, - ZodDefault: ZodDefault, - ZodCatch: ZodCatch, - ZodNaN: ZodNaN, - BRAND: BRAND, - ZodBranded: ZodBranded, - ZodPipeline: ZodPipeline, - ZodReadonly: ZodReadonly, - custom: custom, - Schema: ZodType, - ZodSchema: ZodType, - late: late, - get ZodFirstPartyTypeKind () { return ZodFirstPartyTypeKind; }, - coerce: coerce, - any: anyType, - array: arrayType, - bigint: bigIntType, - boolean: booleanType, - date: dateType, - discriminatedUnion: discriminatedUnionType, - effect: effectsType, - 'enum': enumType, - 'function': functionType, - 'instanceof': instanceOfType, - intersection: intersectionType, - lazy: lazyType, - literal: literalType, - map: mapType, - nan: nanType, - nativeEnum: nativeEnumType, - never: neverType, - 'null': nullType, - nullable: nullableType, - number: numberType, - object: objectType, - oboolean: oboolean, - onumber: onumber, - optional: optionalType, - ostring: ostring, - pipeline: pipelineType, - preprocess: preprocessType, - promise: promiseType, - record: recordType, - set: setType, - strictObject: strictObjectType, - string: stringType, - symbol: symbolType, - transformer: effectsType, - tuple: tupleType, - 'undefined': undefinedType, - union: unionType, - unknown: unknownType, - 'void': voidType, - NEVER: NEVER, - ZodIssueCode: ZodIssueCode, - quotelessJson: quotelessJson, - ZodError: ZodError -}); +/***/ }), + +/***/ "./src/types.ts": +/*!**********************!*\ + !*** ./src/types.ts ***! + \**********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ LdtkEntityDefinition: () => (/* binding */ LdtkEntityDefinition), +/* harmony export */ LdtkEntityInstance: () => (/* binding */ LdtkEntityInstance), +/* harmony export */ LdtkLayerDefinition: () => (/* binding */ LdtkLayerDefinition), +/* harmony export */ LdtkLayerInstance: () => (/* binding */ LdtkLayerInstance), +/* harmony export */ LdtkLevel: () => (/* binding */ LdtkLevel), +/* harmony export */ LdtkProjectMetadata: () => (/* binding */ LdtkProjectMetadata) +/* harmony export */ }); +/* harmony import */ var zod__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! zod */ "./node_modules/zod/lib/index.mjs"); +const LdtkTilesetRectangle = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + h: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + tilesetUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + w: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + x: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + y: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() +}); +const LdtkPixel = zod__WEBPACK_IMPORTED_MODULE_0__.z.tuple([zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), zod__WEBPACK_IMPORTED_MODULE_0__.z.number()]); +const LdtkFieldInstance = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + __identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + __tile: LdtkTilesetRectangle.nullable(), + __type: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), //z.union([z.literal('Int'), z.literal('Float'), z.literal('String'), z.literal('Bool'), z.literal('Enum')]), // TODO this might not work with ENUM + __value: zod__WEBPACK_IMPORTED_MODULE_0__.z.any(), + defUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() +}); +const LdtkTileInstance = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + a: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + f: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), // 2-bit int 0bXY flip + px: LdtkPixel, + src: LdtkPixel, + t: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() +}); +const LdtkEntityInstance = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + __grid: LdtkPixel, + __identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + __pivot: LdtkPixel, + __smartColor: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + __tags: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.string()), + __tile: LdtkTilesetRectangle.nullable(), + __worldX: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), + __worldY: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), + defUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + fieldInstances: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkFieldInstance), + height: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + iid: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + px: LdtkPixel, + width: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() +}); +const LdtkLayerInstance = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + __cHei: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + __cWid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + __gridSize: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + __identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + __opacity: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + __pxTotalOffsetX: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + __pxTotalOffsetY: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + __tilesetDefUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), + __tilesetRelPath: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), + __type: zod__WEBPACK_IMPORTED_MODULE_0__.z.union([zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('IntGrid'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('Entities'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('Tiles'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('AutoLayer')]), + autoLayerTiles: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkTileInstance), // only in auto layers + entityInstances: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkEntityInstance), // only in entity layers + gridTiles: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkTileInstance), + iid: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + intGridCsv: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.number()), // __cWid x __cHei, 0 means empty, values start at 1 + layerDefUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + levelId: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + overrideTilesetUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), + pxOffsetX: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + pxOffsetY: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + visible: zod__WEBPACK_IMPORTED_MODULE_0__.z.boolean() +}); +const LdtkLevel = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + __bgColor: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), + bgColor: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), + __bgPos: zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + cropRect: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.tuple([zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), zod__WEBPACK_IMPORTED_MODULE_0__.z.number()])), // cropX, cropY, cropWidth, cropHeight + scale: zod__WEBPACK_IMPORTED_MODULE_0__.z.tuple([zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), zod__WEBPACK_IMPORTED_MODULE_0__.z.number()]), + topLeftPx: LdtkPixel + }).nullable(), + __neighbours: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + dir: zod__WEBPACK_IMPORTED_MODULE_0__.z.union([zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('n'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('s'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('w'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('e'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('ne'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('nw'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('se'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('sw'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('o'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('<'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('>')]), + levelIid: zod__WEBPACK_IMPORTED_MODULE_0__.z.string() + })), + bgRelPath: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), + externalRelPath: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), + fieldInstances: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkFieldInstance), + identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + iid: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + layerInstances: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkLayerInstance).nullable(), // null if the save levels separately is enabled + pxHei: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + pxWid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + uid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + worldDepth: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + worldX: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + worldY: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() +}); +const LdtkWorld = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + iid: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + levels: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkLevel), + worldGridHeight: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + worldGridWidth: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + // TODO is this a typo Vania? + worldLayout: zod__WEBPACK_IMPORTED_MODULE_0__.z.union([zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('Free'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('GridVania'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('LinearHorizontal'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('LinearVertical')]), +}); +const LdtkEnumValueDefinition = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + color: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + id: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + tileRect: LdtkTilesetRectangle.nullable() +}); +const LdtkEnumDefinition = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + externalRelPath: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), + iconTilesetUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), + identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + tags: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.string()), + uid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + values: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkEnumValueDefinition) +}); +const LdtkTilesetDefinition = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + __cHei: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + __cWid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + customData: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + data: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + tileId: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() + })), + embedAtlas: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), + enumTags: zod__WEBPACK_IMPORTED_MODULE_0__.z.optional(zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + enumValueId: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + tileIds: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.number()) + }))), + identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + padding: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + pxHei: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + pxWid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + relPath: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), + spacing: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + tags: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.string()), + tagsSourceEnumUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), + tileGridSize: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + uid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() +}); +const LdtkLayerDefinition = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + __type: zod__WEBPACK_IMPORTED_MODULE_0__.z.union([zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("IntGrid"), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("Entities"), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("Tiles"), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("AutoLayer")]), + autoSourceLayerDefUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), + displayOpacity: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + gridSize: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + intGridValues: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + color: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + groupUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), + tile: LdtkTilesetRectangle.nullable(), + value: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() + })), + intGridValuesGroups: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + color: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), + identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), + uid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() + })), + parallaxFactorX: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + parallaxFactorY: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + parallaxScaling: zod__WEBPACK_IMPORTED_MODULE_0__.z.boolean(), + pxOffsetX: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + pxOffsetY: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + tilesetDefUid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), + uid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), +}); +const LdtkEntityDefinition = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + color: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + height: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + nineSliceBorders: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.number()), + pivotX: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + pivotY: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + tileRect: LdtkTilesetRectangle.nullable(), + tileRenderMode: zod__WEBPACK_IMPORTED_MODULE_0__.z.union([ + zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("Cover"), + zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("FitInside"), + zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("Repeat"), + zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("Stretch"), + zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("FullSizeCropped"), + zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("FullSizeUncropped"), + zod__WEBPACK_IMPORTED_MODULE_0__.z.literal("NineSlice") + ]), + tilesetId: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), + uiTileRect: LdtkTilesetRectangle.nullable(), + uid: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + width: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() +}); +const LdtkDefinitions = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + tilesets: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkTilesetDefinition), + enums: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkEnumDefinition), + layers: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkLayerDefinition), + entities: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkEntityDefinition) +}); +const LdtkProjectMetadata = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + iid: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + bgColor: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().nullable(), + defs: LdtkDefinitions, + externalLevels: zod__WEBPACK_IMPORTED_MODULE_0__.z.boolean(), + jsonVersion: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + levels: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkLevel), + toc: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + identifier: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + instancesData: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(zod__WEBPACK_IMPORTED_MODULE_0__.z.object({ + fields: zod__WEBPACK_IMPORTED_MODULE_0__.z.any(), + heiPx: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + iids: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(), + widPix: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + worldX: zod__WEBPACK_IMPORTED_MODULE_0__.z.number(), + worldY: zod__WEBPACK_IMPORTED_MODULE_0__.z.number() + })) + })), + // Moving to worlds array + worldGridHeight: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), + worldGridWidth: zod__WEBPACK_IMPORTED_MODULE_0__.z.number().nullable(), + // TODO is this a LDtk docs typo Vania? + worldLayout: zod__WEBPACK_IMPORTED_MODULE_0__.z.union([zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('Free'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('GridVania'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('LinearHorizontal'), zod__WEBPACK_IMPORTED_MODULE_0__.z.literal('LinearVertical')]).nullable(), + worlds: zod__WEBPACK_IMPORTED_MODULE_0__.z.array(LdtkWorld) +}); /***/ }) @@ -48455,14 +48462,14 @@ var __webpack_exports__ = {}; !*** ./sample/main.ts ***! \************************/ __webpack_require__.r(__webpack_exports__); -/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); -/* harmony import */ var _player__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./player */ "./sample/player.ts"); -/* harmony import */ var _resources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./resources */ "./sample/resources.ts"); +/* harmony import */ var excalibur__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! excalibur */ "./node_modules/excalibur/build/esm/excalibur.development.js"); +/* harmony import */ var _player__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./player */ "./sample/player.ts"); +/* harmony import */ var _resources__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./resources */ "./sample/resources.ts"); -excalibur__WEBPACK_IMPORTED_MODULE_2__.Flags.useLegacyImageRenderer(); -const game = new excalibur__WEBPACK_IMPORTED_MODULE_2__.Engine({ +excalibur__WEBPACK_IMPORTED_MODULE_0__.Flags.useLegacyImageRenderer(); +const game = new excalibur__WEBPACK_IMPORTED_MODULE_0__.Engine({ resolution: { width: 256, height: 256, @@ -48470,14 +48477,14 @@ const game = new excalibur__WEBPACK_IMPORTED_MODULE_2__.Engine({ suppressPlayButton: false, pixelArt: true, pixelRatio: 4, - displayMode: excalibur__WEBPACK_IMPORTED_MODULE_2__.DisplayMode.FitScreen, + displayMode: excalibur__WEBPACK_IMPORTED_MODULE_0__.DisplayMode.FitScreen, }); -game.start(_resources__WEBPACK_IMPORTED_MODULE_1__.loader).then(() => { +game.start(_resources__WEBPACK_IMPORTED_MODULE_2__.loader).then(() => { console.log('Game start!'); - _resources__WEBPACK_IMPORTED_MODULE_1__.Resources.LdtkResource.registerEntityIdentifierFactory('PlayerStart', (props) => { - const player = new _player__WEBPACK_IMPORTED_MODULE_0__.Player({ + _resources__WEBPACK_IMPORTED_MODULE_2__.Resources.LdtkResource.registerEntityIdentifierFactory('PlayerStart', (props) => { + const player = new _player__WEBPACK_IMPORTED_MODULE_1__.Player({ name: 'player', - anchor: excalibur__WEBPACK_IMPORTED_MODULE_2__.vec(props.entity.__pivot[0], props.entity.__pivot[1]), + anchor: excalibur__WEBPACK_IMPORTED_MODULE_0__.vec(props.entity.__pivot[0], props.entity.__pivot[1]), width: props.entity.width, height: props.entity.height, pos: props.worldPos, @@ -48487,15 +48494,15 @@ game.start(_resources__WEBPACK_IMPORTED_MODULE_1__.loader).then(() => { }); // Provide a type to the plugin to use for a specific entity identifier // Player.ts - _resources__WEBPACK_IMPORTED_MODULE_1__.Resources.LdtkResource.addToScene(game.currentScene, { - pos: excalibur__WEBPACK_IMPORTED_MODULE_2__.vec(0, 0), + _resources__WEBPACK_IMPORTED_MODULE_2__.Resources.LdtkResource.addToScene(game.currentScene, { + pos: excalibur__WEBPACK_IMPORTED_MODULE_0__.vec(0, 0), levelFilter: ['Level_0', 'Level_1'] }); const player = game.currentScene.world.entityManager.getByName('player')[0]; - if (player instanceof _player__WEBPACK_IMPORTED_MODULE_0__.Player) { + if (player instanceof _player__WEBPACK_IMPORTED_MODULE_1__.Player) { game.currentScene.camera.clearAllStrategies(); game.currentScene.camera.strategy.lockToActor(player); - const bounds = _resources__WEBPACK_IMPORTED_MODULE_1__.Resources.LdtkResource.getLevelBounds(['Level_0', 'Level_1']); + const bounds = _resources__WEBPACK_IMPORTED_MODULE_2__.Resources.LdtkResource.getLevelBounds(['Level_0', 'Level_1']); game.currentScene.camera.strategy.limitCameraBounds(bounds); } }); diff --git a/sample/sample/sample.js.map b/sample/sample/sample.js.map index d6691ab..ab68193 100644 --- a/sample/sample/sample.js.map +++ b/sample/sample/sample.js.map @@ -1 +1 @@ -{"version":3,"file":"sample/sample.js","mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD,O;;;;;;;;;;;;;;;ACVuD;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC,qCAAqC;AACrC,qCAAqC;AACrC,sCAAsC;AACtC,sCAAsC;AACtC;AACA;AACO;AACP;AACA;AACA;AACA;AACA,gBAAgB,oEAAe;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,UAAU;AACxF;AACA;AACA,6DAA6D,2BAA2B;AACxF;AACA;AACA;;;;;;;;;;;;;;;AC3C+D;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA,eAAe,2DAAgB;AAC/B,eAAe,2DAAgB;AAC/B;AACA;AACA;AACA;AACA,cAAc,0DAAe;AAC7B;AACA;AACA;AACA;AACA,eAAe,0DAAe;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;AC5BO;AACA;AACP;AACA;AACA;AACA;AACA;AACA,+DAA+D,QAAQ;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP,oBAAoB,kCAAkC;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB,0BAAmB,EAAE,8BAAmB;;AAExD,8BAAmB,GAAG,0BAAmB;AACzC,qBAAqB,8BAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,4GAA4G,8BAAmB;AAC/H,iIAAiI,8BAAmB;AACpJ,qGAAqG,8BAAmB;AACxH,0HAA0H,8BAAmB;AAC7I;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD,iDAAiD;AACjD,gDAAgD;AAChD,+CAA+C;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,8FAA8F,MAAM,YAAY,aAAa,WAAW,YAAY,WAAW,MAAM,OAAO,aAAa,WAAW,YAAY,aAAa,WAAW,YAAY,WAAW,YAAY,WAAW,UAAU,YAAY,OAAO,OAAO,aAAa,cAAc,yBAAyB,yBAAyB,yBAAyB,yBAAyB,aAAa,OAAO,OAAO,MAAM,KAAK,YAAY,WAAW,YAAY,aAAa,WAAW,UAAU,UAAU,UAAU,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,UAAU,YAAY,WAAW,UAAU,MAAM,MAAM,YAAY,OAAO,KAAK,YAAY,aAAa,OAAO,KAAK,YAAY,OAAO,KAAK,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,MAAM,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,MAAM,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,MAAM,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,MAAM,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,kFAAkF,4BAA4B,yBAAyB,mBAAmB,yBAAyB,mBAAmB,0BAA0B,4BAA4B,kCAAkC,uCAAuC,gBAAgB,4BAA4B,0BAA0B,qBAAqB,8BAA8B,sBAAsB,0BAA0B,qBAAqB,sBAAsB,yBAAyB,mFAAmF,+BAA+B,4BAA4B,4DAA4D,0FAA0F,sEAAsE,0EAA0E,iEAAiE,KAAK,qCAAqC,oBAAoB,KAAK,uCAAuC,yBAAyB,kBAAkB,wBAAwB,8DAA8D,iBAAiB,gBAAgB,eAAe,gBAAgB,KAAK,sCAAsC,yBAAyB,kBAAkB,wBAAwB,iBAAiB,gBAAgB,0BAA0B,kBAAkB,mBAAmB,KAAK,qEAAqE,0BAA0B,KAAK,qCAAqC,8BAA8B,2BAA2B,KAAK,sCAAsC,6BAA6B,KAAK,4CAA4C,YAAY,mBAAmB,OAAO,UAAU,mBAAmB,OAAO,KAAK,uEAAuE,YAAY,mBAAmB,OAAO,UAAU,mBAAmB,OAAO,KAAK,6FAA6F,YAAY,mBAAmB,OAAO,UAAU,mBAAmB,OAAO,KAAK,2EAA2E,YAAY,mBAAmB,OAAO,UAAU,mBAAmB,OAAO,KAAK,qEAAqE,YAAY,mBAAmB,OAAO,UAAU,mBAAmB,OAAO,KAAK,uBAAuB;AAClmH;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,gBAAgB,0BAAmB,EAAE,+BAAmB;;AAExD,+BAAmB,GAAG,0BAAmB;AACzC,qBAAqB,+BAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,4GAA4G,+BAAmB;AAC/H,iIAAiI,+BAAmB;AACpJ,qGAAqG,+BAAmB;AACxH,0HAA0H,+BAAmB;AAC7I;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,mFAAmF,YAAY,WAAW,UAAU,UAAU,UAAU,MAAM,KAAK,UAAU,YAAY,WAAW,aAAa,WAAW,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,OAAO,KAAK,YAAY,+CAA+C,yBAAyB,gBAAgB,qBAAqB,gBAAgB,aAAa,KAAK,2BAA2B,iBAAiB,yBAAyB,oBAAoB,qCAAqC,wBAAwB,sBAAsB,sBAAsB,8BAA8B,yBAAyB,gCAAgC,2CAA2C,KAAK,kCAAkC,6BAA6B,KAAK,uBAAuB;AACr2B;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA,gDAAgD;AAChD;AACA;AACA,qFAAqF;AACrF;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,qBAAqB;AACrB;AACA;AACA,qBAAqB;AACrB;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,iBAAiB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,qBAAqB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,sFAAsF,qBAAqB;AAC3G;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,iDAAiD,qBAAqB;AACtE;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,sDAAsD,qBAAqB;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAO;;AAEP;AACA;AACA;AACA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,cAAc;AACrE;AACA;AACA;AACA;AACA;;AAEA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,2GAA2G,oCAAoC,mEAAmE,8DAA8D,uEAAuE,yCAAyC,2BAA2B,qBAAqB,wEAAwE,+BAA+B,uCAAuC,mHAAmH,oCAAoC,wEAAwE,iDAAiD,kHAAkH,4JAA4J,yCAAyC,uCAAuC,2CAA2C,2BAA2B,wEAAwE,kDAAkD,8CAA8C,6BAA6B,KAAK;;AAE57C,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,wGAAwG,yCAAyC,kBAAkB,0CAA0C,wBAAwB,wBAAwB,qBAAqB,8BAA8B,2BAA2B,mCAAmC,gCAAgC,8BAA8B,yBAAyB,6HAA6H,uDAAuD,sFAAsF,gFAAgF,mGAAmG,+GAA+G,KAAK;;AAEt/B,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6GAA6G,0CAA0C,mFAAmF,gCAAgC,iCAAiC,2BAA2B,uBAAuB,+CAA+C,yBAAyB,qBAAqB,2BAA2B,mJAAmJ,qCAAqC,oCAAoC,8BAA8B,iDAAiD,oCAAoC,KAAK,oDAAoD,8CAA8C,KAAK,yDAAyD,0CAA0C,KAAK,iGAAiG,mDAAmD,6CAA6C,KAAK,oBAAoB,+PAA+P,sJAAsJ,wDAAwD,wDAAwD,wEAAwE,oCAAoC,iCAAiC,KAAK;;AAEz2D,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,oHAAoH,0CAA0C,wBAAwB,4CAA4C,6CAA6C,6CAA6C,6CAA6C,8CAA8C,wBAAwB,+FAA+F,mBAAmB,sEAAsE,yDAAyD,mCAAmC,6CAA6C,sBAAsB,6CAA6C,sBAAsB,2CAA2C,oBAAoB,8BAA8B,oBAAoB,uOAAuO,+DAA+D,2EAA2E,gCAAgC,8BAA8B,0BAA0B,0BAA0B,oBAAoB,wCAAwC,sBAAsB,KAAK;;AAEp/C,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6GAA6G,0CAA0C,yDAAyD,mFAAmF,gCAAgC,yCAAyC,uBAAuB,sBAAsB,2BAA2B,mJAAmJ,qCAAqC,sCAAsC,8BAA8B,iDAAiD,sCAAsC,KAAK,oBAAoB,iQAAiQ,uJAAuJ,gCAAgC,6BAA6B,KAAK;;AAE1vC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,wGAAwG,yCAAyC,wBAAwB,+CAA+C,wBAAwB,wCAAwC,mBAAmB,0DAA0D,kCAAkC,uBAAuB,oBAAoB,8BAA8B,oBAAoB,mHAAmH,wFAAwF,qFAAqF,wBAAwB,uGAAuG,kDAAkD,KAAK;;AAE17B,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6GAA6G,yCAAyC,2BAA2B,qBAAqB,0BAA0B,KAAK;;AAErO,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,wGAAwG,oBAAoB,8BAA8B,8BAA8B,qBAAqB,6HAA6H,4DAA4D,KAAK;;AAE3Y,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6GAA6G,kCAAkC,4BAA4B,4BAA4B,gCAAgC,0BAA0B,sBAAsB,+BAA+B,+BAA+B,yBAAyB,uBAAuB,oBAAoB,kDAAkD,2BAA2B,8DAA8D,uBAAuB,0CAA0C,wCAAwC,yMAAyM,+CAA+C,mDAAmD,QAAQ,MAAM,6DAA6D,+CAA+C,sCAAsC,yCAAyC,6DAA6D,sEAAsE,8BAA8B,qEAAqE,kDAAkD,qCAAqC,OAAO,KAAK;;AAE18C,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6GAA6G,8BAA8B,4BAA4B,yBAAyB,uBAAuB,6BAA6B,0BAA0B,6BAA6B,4BAA4B,0BAA0B,kCAAkC,2CAA2C,uCAAuC,wCAAwC,+CAA+C,sCAAsC,uGAAuG,2BAA2B,4BAA4B,mCAAmC,0BAA0B,gBAAgB,8DAA8D,6NAA6N,wDAAwD,4FAA4F,2DAA2D,6CAA6C,2DAA2D,oGAAoG,wDAAwD,iDAAiD,4GAA4G,yEAAyE,+FAA+F,UAAU,sDAAsD,oFAAoF,wGAAwG,iEAAiE,qGAAqG,KAAK;;AAEvxE,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iHAAiH,yBAAyB,2BAA2B,qBAAqB,8CAA8C,2CAA2C,wBAAwB,4BAA4B,4DAA4D,sEAAsE,gCAAgC,sCAAsC,wBAAwB,KAAK;;AAE5iB,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,wGAAwG,oBAAoB,oBAAoB,0BAA0B,0BAA0B,qBAAqB,0DAA0D,kCAAkC,wBAAwB,KAAK;;AAElV,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iHAAiH,oCAAoC,wBAAwB,+EAA+E,8DAA8D,wEAAwE,qDAAqD,2BAA2B,qBAAqB,wIAAwI,qCAAqC,kDAAkD,uCAAuC,kDAAkD,uCAAuC,kHAAkH,8BAA8B,UAAU,MAAM,oCAAoC,SAAS,iCAAiC,qCAAqC,yEAAyE,0EAA0E,gDAAgD,4CAA4C,0JAA0J,4EAA4E,8DAA8D,YAAY,gKAAgK,4EAA4E,8DAA8D,YAAY,2BAA2B,yMAAyM,4EAA4E,2NAA2N,+FAA+F,0FAA0F,YAAY,gDAAgD,4CAA4C,yCAAyC,yEAAyE,mCAAmC,4CAA4C,YAAY,0EAA0E,qEAAqE,qCAAqC,KAAK;;AAEhmG,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,wGAAwG,yCAAyC,kBAAkB,uBAAuB,oBAAoB,0CAA0C,wBAAwB,wBAAwB,qBAAqB,8BAA8B,2BAA2B,mCAAmC,gCAAgC,8BAA8B,yBAAyB,6HAA6H,uDAAuD,kDAAkD,sFAAsF,gFAAgF,mGAAmG,+GAA+G,KAAK;;AAEnlC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6GAA6G,mEAAmE,uDAAuD,2BAA2B,qBAAqB,kDAAkD,KAAK;;AAE9U,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,wGAAwG,2BAA2B,wBAAwB,qBAAqB,+CAA+C,oFAAoF,KAAK;;AAExT,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6GAA6G,gDAAgD,6EAA6E,kDAAkD,kDAAkD,2BAA2B,qBAAqB,6CAA6C,yGAAyG,oEAAoE,uEAAuE,+CAA+C,cAAc,cAAc,2CAA2C,qEAAqE,wCAAwC,yCAAyC,QAAQ,uBAAuB,8DAA8D,iDAAiD,wCAAwC,QAAQ,uBAAuB,4DAA4D,wCAAwC,mDAAmD,OAAO,2DAA2D,kGAAkG,8EAA8E,iFAAiF,oBAAoB,4BAA4B,uBAAuB,8CAA8C,sDAAsD,sDAAsD,kCAAkC,yBAAyB,0DAA0D,+BAA+B,QAAQ,MAAM,oCAAoC,OAAO,KAAK;;AAE7gE,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,8EAA8E,gCAAmB;AACjG,qEAAqE,gCAAmB;AACxF,wEAAwE,gCAAmB;AAC3F,+EAA+E,gCAAmB;AAClG,uEAAuE,gCAAmB;AAC1F,uEAAuE,gCAAmB;AAC1F,yEAAyE,gCAAmB;AAC5F,0EAA0E,gCAAmB;AAC7F,yEAAyE,gCAAmB;AAC5F,yEAAyE,gCAAmB;AAC5F,4EAA4E,gCAAmB;AAC/F,uEAAuE,gCAAmB;AAC1F,uEAAuE,gCAAmB;AAC1F,uEAAuE,gCAAmB;AAC1F,sEAAsE,gCAAmB;AACzF,uEAAuE,gCAAmB;AAC1F,qEAAqE,gCAAmB;AACxF,wEAAwE,gCAAmB;AAC3F,sEAAsE,gCAAmB;AACzF,8DAA8D,gCAAmB;AACjF,uEAAuE,gCAAmB;AAC1F,wEAAwE,gCAAmB;AAC3F,wEAAwE,gCAAmB;;;;;;;;;;;;;;;;;;;;;;;;AAwB3F;AACA;AACA,IAAI,2BAA2B;AAC/B;AACA,QAAQ,iBAAiB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,gCAAmB;;AAEnF;AACA;AACA;AACA,kCAAkC,uCAAuC;AACzE,oDAAoD,eAAe;AACnE;AACA,qBAAqB,wBAAwB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,gCAAmB;AACnF,uEAAuE,gCAAmB;;;AAG1F;AACA;AACA,IAAI,0BAA0B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,oFAAoF,gCAAmB;AACvG,gEAAgE,gCAAmB;;;AAGnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,gCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+EAA+E,gCAAmB;AAClG,8DAA8D,gCAAmB;AACjF,8DAA8D,gCAAmB;AACjF,8DAA8D,gCAAmB;AACjF,8DAA8D,gCAAmB;AACjF,gEAAgE,gCAAmB;;;;AAInF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+EAA+E,gCAAmB;AAClG,8DAA8D,gCAAmB;AACjF,8DAA8D,gCAAmB;AACjF,8DAA8D,gCAAmB;AACjF,8DAA8D,gCAAmB;AACjF,gEAAgE,gCAAmB;;;;AAInF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,gCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,gCAAmB;AACnF,0EAA0E,gCAAmB;;;AAG7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,0GAA0G,gCAAmB;AAC7H,6GAA6G,gCAAmB;AAChI,qEAAqE,gCAAmB;AACxF,gEAAgE,gCAAmB;;;;;AAKnF;AACA,2BAA2B,yDAAyD;AACpF;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6GAA6G,gCAAmB;AAChI,0GAA0G,gCAAmB;AAC7H,qEAAqE,gCAAmB;AACxF,gEAAgE,gCAAmB;;;;;AAKnF;AACA,2BAA2B,sDAAsD;AACjF;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,oFAAoF,gCAAmB;AACvG,kEAAkE,gCAAmB;AACrF,gEAAgE,gCAAmB;;;;AAInF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,oFAAoF,gCAAmB;AACvG,gEAAgE,gCAAmB;;;AAGnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,0GAA0G,gCAAmB;AAC7H,6GAA6G,gCAAmB;AAChI,qEAAqE,gCAAmB;AACxF,gEAAgE,gCAAmB;;;;;AAKnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,0GAA0G,iCAAmB;AAC7H,6GAA6G,iCAAmB;AAChI,qEAAqE,iCAAmB;AACxF,gEAAgE,iCAAmB;;;;;AAKnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,0GAA0G,iCAAmB;AAC7H,6GAA6G,iCAAmB;AAChI,8DAA8D,iCAAmB;AACjF,8DAA8D,iCAAmB;AACjF,qEAAqE,iCAAmB;AACxF,8EAA8E,iCAAmB;AACjG,kEAAkE,iCAAmB;AACrF,gEAAgE,iCAAmB;;;;;;;;AAQnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,0GAA0G,iCAAmB;AAC7H,6GAA6G,iCAAmB;AAChI,8DAA8D,iCAAmB;AACjF,8DAA8D,iCAAmB;AACjF,qEAAqE,iCAAmB;AACxF,8EAA8E,iCAAmB;AACjG,gEAAgE,iCAAmB;;;;;;;AAOnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;;AAEnF;AACA,iCAAiC,gBAAgB,MAAM,wBAAwB;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;;;AAG1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;;;AAG1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,6GAA6G,iCAAmB;AAChI,0GAA0G,iCAAmB;AAC7H,mEAAmE,iCAAmB;AACtF,8DAA8D,iCAAmB;AACjF,8DAA8D,iCAAmB;;;;;;AAMjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,8DAA8D,iCAAmB;AACjF,6GAA6G,iCAAmB;AAChI,0GAA0G,iCAAmB;AAC7H,mEAAmE,iCAAmB;AACtF,8DAA8D,iCAAmB;;;;;;;AAOjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,0GAA0G,iCAAmB;AAC7H,6GAA6G,iCAAmB;AAChI,gEAAgE,iCAAmB;AACnF,8DAA8D,iCAAmB;AACjF,8DAA8D,iCAAmB;;;;;;AAMjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,0GAA0G,iCAAmB;AAC7H,6GAA6G,iCAAmB;AAChI,gEAAgE,iCAAmB;AACnF,8DAA8D,iCAAmB;AACjF,8DAA8D,iCAAmB;;;;;;AAMjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,uEAAuE,iCAAmB;AAC1F,yFAAyF,iCAAmB;AAC5G,0GAA0G,iCAAmB;AAC7H,6GAA6G,iCAAmB;;;;;AAKhI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+EAA+E,iCAAmB;AAClG,sFAAsF,iCAAmB;AACzG,0EAA0E,iCAAmB;;;;AAI7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,uEAAuE,iCAAmB;AAC1F,qEAAqE,iCAAmB;AACxF,gEAAgE,iCAAmB;AACnF,+EAA+E,iCAAmB;AAClG,gFAAgF,iCAAmB;AACnG,uEAAuE,iCAAmB;AAC1F,8EAA8E,iCAAmB;AACjG,sEAAsE,iCAAmB;AACzF,oEAAoE,iCAAmB;AACvF,uEAAuE,iCAAmB;AAC1F,wEAAwE,iCAAmB;AAC3F,sEAAsE,iCAAmB;AACzF,wEAAwE,iCAAmB;AAC3F,sEAAsE,iCAAmB;AACzF,wEAAwE,iCAAmB;AAC3F,wEAAwE,iCAAmB;AAC3F,0EAA0E,iCAAmB;AAC7F,0EAA0E,iCAAmB;AAC7F,yEAAyE,iCAAmB;AAC5F,yEAAyE,iCAAmB;AAC5F,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;AAC1F,yEAAyE,iCAAmB;AAC5F,yEAAyE,iCAAmB;AAC5F,2EAA2E,iCAAmB;AAC9F,wEAAwE,iCAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8B3F,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,iEAAiE,iCAAmB;AACpF,kEAAkE,iCAAmB;AACrF,qEAAqE,iCAAmB;AACxF,kFAAkF,iCAAmB;AACrG,kFAAkF,iCAAmB;AACrG,sFAAsF,iCAAmB;AACzG,6GAA6G,iCAAmB;AAChI,0GAA0G,iCAAmB;AAC7H,oFAAoF,iCAAmB;AACvG,6EAA6E,iCAAmB;AAChG,sFAAsF,iCAAmB;AACzG,oFAAoF,iCAAmB;AACvG,oEAAoE,iCAAmB;AACvF,0EAA0E,iCAAmB;AAC7F,gFAAgF,iCAAmB;AACnG,mFAAmF,iCAAmB;AACtG,0EAA0E,iCAAmB;AAC7F,sEAAsE,iCAAmB;;;;;;;;;;;;;;;;;;;AAmBzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,gBAAgB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qGAAqG,qBAAqB;AAC1H;AACA;AACA;AACA;AACA;AACA,qGAAqG,qBAAqB;AAC1H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uMAAuM;AACvN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE,IAAI;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,oBAAoB;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oGAAoG,IAAI;AACxG;AACA,8FAA8F,eAAe;AAC7G;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,qBAAqB;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uGAAuG,IAAI;AAC3G;AACA,6FAA6F,eAAe;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,UAAU;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,yBAAyB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wGAAwG,IAAI;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0GAA0G,IAAI;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,sBAAsB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,uBAAuB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,8EAA8E,iCAAmB;AACjG,qEAAqE,iCAAmB;AACxF,mEAAmE,iCAAmB;AACtF,gEAAgE,iCAAmB;AACnF,+EAA+E,iCAAmB;AAClG,kEAAkE,iCAAmB;AACrF,4EAA4E,iCAAmB;AAC/F,sEAAsE,iCAAmB;AACzF,kEAAkE,iCAAmB;AACrF,oEAAoE,iCAAmB;AACvF,2EAA2E,iCAAmB;;;;;;;;;;;;AAY9F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,oCAAoC;AACjE;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,wCAAwC;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,iCAAiC;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,oCAAoC;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,oCAAoC;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oBAAoB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,iBAAiB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,iBAAiB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE,gBAAgB;AACrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE,gBAAgB;AACrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,yCAAyC;AAChG,mBAAmB,kBAAkB;AACrC,qBAAqB,kBAAkB,cAAc,iBAAiB;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,sBAAsB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wGAAwG,IAAI;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,uBAAuB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yGAAyG,IAAI;AAC7G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yGAAyG,IAAI;AAC7G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,uEAAuE,iCAAmB;AAC1F,6GAA6G,iCAAmB;AAChI,0GAA0G,iCAAmB;AAC7H,yFAAyF,iCAAmB;AAC5G,8EAA8E,iCAAmB;AACjG,4DAA4D,iCAAmB;AAC/E,oEAAoE,iCAAmB;AACvF,4EAA4E,iCAAmB;AAC/F,wEAAwE,iCAAmB;AAC3F,sEAAsE,iCAAmB;AACzF,uEAAuE,iCAAmB;;;;;;;;;;;;;AAa1F;AACA;AACA;AACA;AACA;AACA,CAAC,0CAA0C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4EAA4E;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,gCAAgC;AAChD;AACA;AACA;AACA;AACA,sCAAsC,0BAA0B;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8GAA8G,qBAAqB;AACnI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,8BAA8B;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,oCAAoC;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,2BAA2B,MAAM,8BAA8B;AACnH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,uBAAuB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,+DAA+D,iCAAmB;AAClF,8DAA8D,iCAAmB;;;;AAIjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,sBAAsB;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,gBAAgB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E,OAAO;AACjF;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,+EAA+E,iCAAmB;AAClG,yFAAyF,iCAAmB;AAC5G,gEAAgE,iCAAmB;AACnF,yEAAyE,iCAAmB;AAC5F,qEAAqE,iCAAmB;AACxF,qFAAqF,iCAAmB;AACxG,yEAAyE,iCAAmB;AAC5F,sEAAsE,iCAAmB;AACzF,+DAA+D,iCAAmB;;;;;;;;;;;AAWlF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,sCAAsC;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,+CAA+C;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,2CAA2C;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,4BAA4B;AAChD;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,4EAA4E,iCAAmB;AAC/F,yEAAyE,iCAAmB;AAC5F,sEAAsE,iCAAmB;AACzF,0EAA0E,iCAAmB;AAC7F,qEAAqE,iCAAmB;AACxF,gEAAgE,iCAAmB;AACnF,kEAAkE,iCAAmB;AACrF,8EAA8E,iCAAmB;AACjG,4EAA4E,iCAAmB;AAC/F,+DAA+D,iCAAmB;AAClF,mEAAmE,iCAAmB;;;;;;;;;;;;;AAatF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qFAAqF,aAAa;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oFAAoF,gBAAgB;AACpG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,YAAY,IAAI,KAAK,cAAc;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,2EAA2E,iCAAmB;AAC9F,qEAAqE,iCAAmB;AACxF,kEAAkE,iCAAmB;AACrF,mEAAmE,iCAAmB;;;;;AAKtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C,4BAA4B,mBAAmB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,4DAA4D,iCAAmB;AAC/E,sEAAsE,iCAAmB;;;;AAIzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,wEAAwE,iCAAmB;AAC3F,oFAAoF,iCAAmB;AACvG,yEAAyE,iCAAmB;AAC5F,sEAAsE,iCAAmB;AACzF,wEAAwE,iCAAmB;AAC3F,2EAA2E,iCAAmB;AAC9F,qEAAqE,iCAAmB;AACxF,+EAA+E,iCAAmB;AAClG,wEAAwE,iCAAmB;AAC3F,4EAA4E,iCAAmB;;;;;;;;;;;AAW/F,2EAA2E;AAC3E,6EAA6E;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,uBAAuB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,0DAA0D,iCAAmB;AAC7E,wEAAwE,iCAAmB;AAC3F,yEAAyE,iCAAmB;AAC5F,qEAAqE,iCAAmB;AACxF,qEAAqE,iCAAmB;AACxF,+EAA+E,iCAAmB;AAClG,iGAAiG,iCAAmB;AACpH,kEAAkE,iCAAmB;AACrF,uEAAuE,iCAAmB;;;;;;;;;;AAU1F;AACA;AACA;AACA;AACA;AACA,sDAAsD,4BAA4B;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,4EAA4E,iCAAmB;AAC/F,wEAAwE,iCAAmB;AAC3F,yEAAyE,iCAAmB;AAC5F,0EAA0E,iCAAmB;AAC7F,2EAA2E,iCAAmB;AAC9F,qEAAqE,iCAAmB;AACxF,kEAAkE,iCAAmB;AACrF,8EAA8E,iCAAmB;AACjG,4EAA4E,iCAAmB;AAC/F,+DAA+D,iCAAmB;;;;;;;;;;;;AAYlF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qFAAqF,aAAa;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kFAAkF,aAAa;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,sEAAsE,iCAAmB;AACzF,uEAAuE,iCAAmB;AAC1F,6EAA6E,iCAAmB;AAChG,wEAAwE,iCAAmB;AAC3F,0EAA0E,iCAAmB;AAC7F,2EAA2E,iCAAmB;AAC9F,qEAAqE,iCAAmB;AACxF,kEAAkE,iCAAmB;AACrF,+EAA+E,iCAAmB;AAClG,kEAAkE,iCAAmB;AACrF,0DAA0D,iCAAmB;AAC7E,0DAA0D,iCAAmB;AAC7E,2DAA2D,iCAAmB;AAC9E,2DAA2D,iCAAmB;AAC9E,2EAA2E,iCAAmB;AAC9F,+DAA+D,iCAAmB;AAClF,wEAAwE,iCAAmB;;;;;;;;;;;;;;;AAe3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,yBAAyB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,8BAA8B,eAAe,4BAA4B;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,4BAA4B;AACrF;AACA;AACA;AACA,wBAAwB,4BAA4B;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,4BAA4B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,iBAAiB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,iBAAiB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,iBAAiB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,iBAAiB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,SAAS;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,SAAS;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,qBAAqB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,qBAAqB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,0BAA0B;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qFAAqF,gBAAgB;AACrG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qFAAqF,gBAAgB;AACrG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oEAAoE,OAAO;AAC3E;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,2EAA2E,iCAAmB;AAC9F,qEAAqE,iCAAmB;AACxF,4EAA4E,iCAAmB;AAC/F,mEAAmE,iCAAmB;;;;;AAKtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,+BAA+B;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,+BAA+B;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yEAAyE,iCAAmB;AAC5F,wEAAwE,iCAAmB;AAC3F,sEAAsE,iCAAmB;AACzF,qEAAqE,iCAAmB;AACxF,qEAAqE,iCAAmB;AACxF,2EAA2E,iCAAmB;AAC9F,0DAA0D,iCAAmB;;;;;;;;AAQ7E;AACA;AACA;AACA;AACA;AACA,yDAAyD,0BAA0B;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,sBAAsB,gDAAgD;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,sBAAsB,oCAAoC;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,sBAAsB,gCAAgC;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,qCAAqC,4BAA4B;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gFAAgF,iCAAmB;AACnG,0GAA0G,iCAAmB;AAC7H,6GAA6G,iCAAmB;AAChI,sFAAsF,iCAAmB;AACzG,iEAAiE,iCAAmB;AACpF,yEAAyE,iCAAmB;AAC5F,6EAA6E,iCAAmB;AAChG,gFAAgF,iCAAmB;AACnG,2EAA2E,iCAAmB;AAC9F,qFAAqF,iCAAmB;AACxG,yEAAyE,iCAAmB;AAC5F,kFAAkF,iCAAmB;AACrG,sEAAsE,iCAAmB;AACzF,wEAAwE,iCAAmB;;;;;;;;;;;;;;;AAe3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,0CAA0C;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA,2BAA2B,gBAAgB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,sCAAsC;;;AAGvC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,uEAAuE,iCAAmB;AAC1F,8DAA8D,iCAAmB;AACjF,uEAAuE,iCAAmB;;;;AAI1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,kEAAkE,iCAAmB;AACrF,uEAAuE,iCAAmB;AAC1F,0DAA0D,iCAAmB;;;;;AAK7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,8DAA8D,iCAAmB;AACjF,sEAAsE,iCAAmB;AACzF,kEAAkE,iCAAmB;AACrF,kEAAkE,iCAAmB;AACrF,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;AAC1F,qFAAqF,iCAAmB;AACxG,8EAA8E,iCAAmB;AACjG,qEAAqE,iCAAmB;AACxF,4DAA4D,iCAAmB;;;;;;;;;;;;AAY/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,uDAAuD,OAAO;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8FAA8F;AAC9F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;;;AAG1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,UAAU,GAAG,UAAU;AAC9C;AACA;AACA,uBAAuB,UAAU,GAAG,UAAU;AAC9C;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,qEAAqE,iCAAmB;;;AAGxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,qEAAqE,iCAAmB;AACxF,yEAAyE,iCAAmB;AAC5F,qEAAqE,iCAAmB;;;;;AAKxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,EAAE,GAAG,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,aAAa;AAC7C,mCAAmC,cAAc;AACjD;AACA;AACA;AACA;AACA,wCAAwC,yBAAyB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,yBAAyB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,mBAAmB;AACrD,qCAAqC,oBAAoB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,mBAAmB;AAC7D,6CAA6C,oBAAoB;AACjE;AACA;AACA;AACA;AACA;AACA,0CAA0C,mBAAmB;AAC7D,6CAA6C,oBAAoB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,4DAA4D,iCAAmB;AAC/E,qEAAqE,iCAAmB;AACxF,mEAAmE,iCAAmB;AACtF,uEAAuE,iCAAmB;AAC1F,qFAAqF,iCAAmB;AACxG,uEAAuE,iCAAmB;AAC1F,8EAA8E,iCAAmB;AACjG,8DAA8D,iCAAmB;AACjF,wEAAwE,iCAAmB;;;;;;;;;;AAU3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8HAA8H,kEAAkE,IAAI,kEAAkE;AACtQ;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,qCAAqC;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,qBAAqB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA,oCAAoC,gCAAgC;AACpE;AACA;AACA;AACA,yCAAyC,kCAAkC;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA,4BAA4B,wBAAwB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA,mBAAmB,gCAAgC;AACnD;AACA;AACA,4DAA4D,mCAAmC;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4DAA4D;;;AAG7D,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+EAA+E,iCAAmB;;AAElG;AACA,mFAAmF,gCAAgC,WAAW,wBAAwB;AACtJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,uCAAuC;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,6CAA6C;AAC1F;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ,YAAY;AACZ;AACA;AACA;AACA;AACA,cAAc,yBAAyB;AACvC;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,wEAAwE,iCAAmB;;AAE3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,kBAAkB;AACvE;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,MAAM;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,uEAAuE,iCAAmB;AAC1F,2EAA2E,iCAAmB;AAC9F,uEAAuE,iCAAmB;AAC1F,wEAAwE,iCAAmB;AAC3F,4EAA4E,iCAAmB;AAC/F,qEAAqE,iCAAmB;AACxF,yEAAyE,iCAAmB;AAC5F,qFAAqF,iCAAmB;AACxG,kFAAkF,iCAAmB;AACrG,gFAAgF,iCAAmB;AACnG,oFAAoF,iCAAmB;AACvG,uFAAuF,iCAAmB;AAC1G,yFAAyF,iCAAmB;AAC5G,mFAAmF,iCAAmB;AACtG,+EAA+E,iCAAmB;AAClG,sFAAsF,iCAAmB;AACzG,yEAAyE,iCAAmB;AAC5F,qFAAqF,iCAAmB;AACxG,gFAAgF,iCAAmB;AACnG,kGAAkG,iCAAmB;AACrH,qGAAqG,iCAAmB;AACxH,mFAAmF,iCAAmB;AACtG,6FAA6F,iCAAmB;AAChH,6EAA6E,iCAAmB;AAChG,8EAA8E,iCAAmB;AACjG,6EAA6E,iCAAmB;AAChG,wFAAwF,iCAAmB;AAC3G,iFAAiF,iCAAmB;AACpG,0EAA0E,iCAAmB;AAC7F,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;AAC1F,wEAAwE,iCAAmB;AAC3F,+DAA+D,iCAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyClF,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;;AAExF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+EAA+E,iCAAmB;AAClG,0GAA0G,iCAAmB;AAC7H,6GAA6G,iCAAmB;AAChI,sFAAsF,iCAAmB;AACzG,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;AAC1F,oEAAoE,iCAAmB;;;;;;;;AAQvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,4BAA4B;AACpD;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,wEAAwE,iCAAmB;AAC3F,4EAA4E,iCAAmB;AAC/F,4FAA4F,iCAAmB;;;;;AAK/G;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;AAGD,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yEAAyE,iCAAmB;AAC5F,+DAA+D,iCAAmB;AAClF,+DAA+D,iCAAmB;AAClF,uEAAuE,iCAAmB;AAC1F,oEAAoE,iCAAmB;AACvF,4FAA4F,iCAAmB;;;;;;AAM/G;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oBAAoB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oBAAoB;;;AAGrB,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA,mBAAmB,gCAAgC;AACnD;AACA;AACA,4DAA4D,mCAAmC;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,wCAAwC;;;AAGzC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,8DAA8D,iCAAmB;AACjF,uEAAuE,iCAAmB;AAC1F,qEAAqE,iCAAmB;;;;;;AAMxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4CAA4C;AAC7C;AACA,kDAAkD,uBAAuB;AACzE;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,uBAAuB;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uBAAuB;AACvC;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;;AAExF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,mEAAmE,iCAAmB;AACtF,uEAAuE,iCAAmB;AAC1F,gFAAgF,iCAAmB;AACnG,8DAA8D,iCAAmB;AACjF,uEAAuE,iCAAmB;AAC1F,sFAAsF,iCAAmB;;;;;;;;AAQzG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,2BAA2B;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,qBAAqB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oCAAoC;AAC5D,4BAA4B,qBAAqB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6EAA6E;AAC7E;AACA,uDAAuD;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oCAAoC;AAC5D,4BAA4B,qBAAqB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA,mCAAmC,qBAAqB;AACxD;AACA,iCAAiC,uBAAuB,GAAG,sBAAsB;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;AAC3C;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,cAAc;AACnD;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,oEAAoE,iCAAmB;AACvF,+DAA+D,iCAAmB;;;AAGlF;AACA;AACA,gDAAgD,gBAAgB;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2EAA2E,2BAA2B;AACtG,iCAAiC,oBAAoB,YAAY;AACjE;AACA;AACA;AACA,4EAA4E,2BAA2B;AACvG,iCAAiC,mBAAmB,uDAAuD;AAC3G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,oBAAoB;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,wBAAwB;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uEAAuE,0BAA0B;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,mGAAmG,iCAAmB;AACtH,4GAA4G,iCAAmB;AAC/H,wGAAwG,iCAAmB;;;;AAI3H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,2GAA2G,iCAAmB;AAC9H,sFAAsF,iCAAmB;AACzG,+EAA+E,iCAAmB;AAClG,gFAAgF,iCAAmB;AACnG,sFAAsF,iCAAmB;AACzG,qEAAqE,iCAAmB;AACxF,mEAAmE,iCAAmB;AACtF,iFAAiF,iCAAmB;AACpG,mFAAmF,iCAAmB;AACtG,gGAAgG,iCAAmB;AACnH,oFAAoF,iCAAmB;AACvG,6EAA6E,iCAAmB;AAChG,yFAAyF,iCAAmB;AAC5G,0EAA0E,iCAAmB;AAC7F,yEAAyE,iCAAmB;;;;;;;;;;;;;;;AAe5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gCAAgC;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mHAAmH,0CAA0C;AAC7J;AACA;AACA,+DAA+D,mBAAmB;AAClF;AACA;AACA;AACA,8DAA8D,gBAAgB;AAC9E;AACA;AACA;AACA,+DAA+D,GAAG,IAAI,8GAA8G;AACpL;AACA;AACA;AACA,iEAAiE,KAAK;AACtE;AACA;AACA;AACA;AACA,oEAAoE,8EAA8E;AAClJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4EAA4E,gBAAgB;AAC5F;AACA;AACA;AACA,2EAA2E,mBAAmB;AAC9F;AACA;AACA;AACA,iEAAiE,UAAU;AAC3E;AACA;AACA;AACA,mEAAmE,iBAAiB;AACpF;AACA;AACA;AACA,qEAAqE,+CAA+C;AACpH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D,uBAAuB;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8GAA8G,qCAAqC;AACnJ;AACA,iFAAiF,kBAAkB;AACnG;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0GAA0G,qCAAqC;AAC/I;AACA,6EAA6E,sBAAsB;AACnG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,kBAAkB;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,oEAAoE,iCAAmB;AACvF,qEAAqE,iCAAmB;;;;;;AAMxF,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,kEAAkE,iCAAmB;AACrF,oEAAoE,iCAAmB;AACvF,qEAAqE,iCAAmB;;;;AAIxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,6BAA6B,GAAG;AAChD,iCAAiC,QAAQ;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,uEAAuE,iCAAmB;AAC1F,yEAAyE,iCAAmB;AAC5F,4EAA4E,iCAAmB;AAC/F,mEAAmE,iCAAmB;AACtF,+EAA+E,iCAAmB;AAClG,qEAAqE,iCAAmB;AACxF,sEAAsE,iCAAmB;AACzF,+DAA+D,iCAAmB;AAClF,mEAAmE,iCAAmB;;;;;;;;;;AAUtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yFAAyF;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,uEAAuE,iCAAmB;AAC1F,+DAA+D,iCAAmB;AAClF,gEAAgE,iCAAmB;AACnF,kEAAkE,iCAAmB;AACrF,gEAAgE,iCAAmB;AACnF,sEAAsE,iCAAmB;;;;;;;AAOzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,eAAe;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,sBAAsB;AAC1C,oBAAoB,uCAAuC;AAC3D,gDAAgD,sCAAsC;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uFAAuF,IAAI;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2EAA2E,YAAY;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,kBAAkB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,iHAAiH;AAClI,iBAAiB,mHAAmH;AACpI;AACA;AACA;AACA,gBAAgB,gDAAgD;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,QAAQ;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,kEAAkE,iCAAmB;AACrF,oEAAoE,iCAAmB;;;;AAIvF;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,iCAAiC,QAAQ;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,uEAAuE,iCAAmB;AAC1F,yEAAyE,iCAAmB;AAC5F,oEAAoE,iCAAmB;AACvF,mEAAmE,iCAAmB;AACtF,sEAAsE,iCAAmB;AACzF,uEAAuE,iCAAmB;AAC1F,kEAAkE,iCAAmB;AACrF,qEAAqE,iCAAmB;;;;;;;;;;AAUxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,iBAAiB,mBAAmB,mBAAmB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA,8EAA8E;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,4DAA4D;AAChF;AACA;AACA;AACA;AACA,gEAAgE,0BAA0B;AAC1F,+DAA+D,0BAA0B;AACzF;AACA;AACA,gEAAgE,yCAAyC;AACzG,+DAA+D,gDAAgD;AAC/G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oFAAoF;AACpF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,kEAAkE,iCAAmB;AACrF,oEAAoE,iCAAmB;AACvF,qEAAqE,iCAAmB;AACxF,8EAA8E,iCAAmB;AACjG,0EAA0E,iCAAmB;;;;;;AAM7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,6BAA6B,GAAG;AAChD;AACA,6BAA6B,QAAQ;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,+EAA+E,iCAAmB;AAClG,+EAA+E,iCAAmB;AAClG,kEAAkE,iCAAmB;AACrF,0EAA0E,iCAAmB;AAC7F,qEAAqE,iCAAmB;AACxF,mEAAmE,iCAAmB;AACtF,8EAA8E,iCAAmB;AACjG,wEAAwE,iCAAmB;AAC3F,kEAAkE,iCAAmB;;;;;;;;;;AAUrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,QAAQ;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D,WAAW;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE,WAAW;AAC3E;AACA;AACA;AACA,gEAAgE,WAAW;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,oEAAoE,iCAAmB;AACvF,mEAAmE,iCAAmB;AACtF,mEAAmE,iCAAmB;AACtF,+DAA+D,iCAAmB;AAClF,kEAAkE,iCAAmB;AACrF,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;;;;;;;;;;AAU1F,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,0DAA0D,iCAAmB;AAC7E,qEAAqE,iCAAmB;AACxF,sEAAsE,iCAAmB;AACzF,6EAA6E,iCAAmB;AAChG,+DAA+D,iCAAmB;AAClF,kEAAkE,iCAAmB;AACrF,iEAAiE,iCAAmB;AACpF,iFAAiF,iCAAmB;AACpG,0EAA0E,iCAAmB;AAC7F,uEAAuE,iCAAmB;AAC1F,iEAAiE,iCAAmB;AACpF,kEAAkE,iCAAmB;AACrF,gEAAgE,iCAAmB;AACnF,gEAAgE,iCAAmB;AACnF,uFAAuF,iCAAmB;AAC1G,4EAA4E,iCAAmB;AAC/F,sEAAsE,iCAAmB;AACzF,mEAAmE,iCAAmB;AACtF,mEAAmE,iCAAmB;AACtF,mEAAmE,iCAAmB;AACtF,mEAAmE,iCAAmB;AACtF,qEAAqE,iCAAmB;AACxF,6EAA6E,iCAAmB;AAChG,uFAAuF,iCAAmB;AAC1G,sEAAsE,iCAAmB;AACzF,4EAA4E,iCAAmB;AAC/F,0EAA0E,iCAAmB;AAC7F,kFAAkF,iCAAmB;AACrG,iEAAiE,iCAAmB;AACpF,2EAA2E,iCAAmB;AAC9F,oEAAoE,iCAAmB;;;;;;;AAOvF;;;;;;;;;;;;;;;;;;;;;;;AAuBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oDAAoD;AACrD;AACA;AACA;AACA,QAAQ,iBAAiB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA;AACA;AACA,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA;AACA;AACA,oBAAoB,gBAAgB,kBAAkB,2BAA2B;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,sBAAsB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,uBAAuB;AAClE;AACA,qDAAqD,uBAAuB;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,0CAA0C,0BAA0B,cAAc,oBAAoB,eAAe,kBAAkB,kBAAkB;AAChN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wGAAwG,wBAAwB;AAChI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,uGAAuG;AACtH;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,qFAAqF,UAAU;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oHAAoH,+CAA+C;AACnK;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,QAAQ;AACxB,cAAc,+BAA+B;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,6BAA6B;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oHAAoH,+CAA+C;AACnK;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,gBAAgB,QAAQ,sBAAsB;AAC7D,8CAA8C,sBAAsB;AACpE;AACA;AACA;AACA;AACA;AACA,kBAAkB,gBAAgB,UAAU,sBAAsB;AAClE,iDAAiD,sBAAsB;AACvE;AACA;AACA;AACA;AACA;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,oBAAoB;AACnD,uCAAuC,gCAAgC;AACvE,mCAAmC,iCAAiC;AACpE;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,gCAAgC;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,gCAAgC;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,kCAAkC;AAC9E,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,mBAAmB,WAAW,iBAAiB,aAAa,eAAe,MAAM,iBAAiB;AAC9H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,gBAAgB,uDAAuD;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,mEAAmE,iCAAmB;;;AAGtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,0EAA0E,iCAAmB;AAC7F,wEAAwE,iCAAmB;AAC3F,mEAAmE,iCAAmB;AACtF,yEAAyE,iCAAmB;AAC5F,kEAAkE,iCAAmB;;;;;;AAMrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,0CAA0C;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6EAA6E,+DAA+D;AAC5I;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mEAAmE,iCAAmB;AACtF,yEAAyE,iCAAmB;AAC5F,gEAAgE,iCAAmB;AACnF,sEAAsE,iCAAmB;AACzF,mEAAmE,iCAAmB;AACtF,kEAAkE,iCAAmB;;;;;;;;AAQrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,QAAQ;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,oCAAoC;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,IAAI;AAChB;AACA;AACA;AACA,oGAAoG,qBAAqB;AACzH;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,yBAAyB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,QAAQ;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,sBAAsB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,uBAAuB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE,IAAI;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D,IAAI;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE,IAAI;AACtE;AACA;AACA;AACA;AACA;AACA,wGAAwG,IAAI;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0GAA0G,IAAI;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,mEAAmE,iCAAmB;;;AAGtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,oCAAoC;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,oCAAoC;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,6CAA6C;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,oCAAoC;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,QAAQ;AACvD;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yEAAyE,iCAAmB;;AAE5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,kEAAkE,iCAAmB;;;AAGrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,kEAAkE,iCAAmB;;AAErF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gCAAgC;AACjC;AACA,iBAAiB,iBAAiB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,mEAAmE,iCAAmB;;;AAGtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,QAAQ;AACtD;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yEAAyE,iCAAmB;;AAE5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,sEAAsE,iCAAmB;AACzF,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;;;;;;AAM1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mEAAmE,iCAAmB;AACtF,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,+DAA+D,iCAAmB;AAClF,kEAAkE,iCAAmB;AACrF,sEAAsE,iCAAmB;AACzF,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,+DAA+D,iCAAmB;AAClF,kEAAkE,iCAAmB;AACrF,wFAAwF,iCAAmB;AAC3G,qFAAqF,iCAAmB;;;;;;;;;;;;;;;;AAgBxG,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,kBAAkB;AAC9C;AACA;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gCAAgC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,mBAAmB;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE,mBAAmB;AACrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,mBAAmB,oDAAoD,kBAAkB;AACvH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,mBAAmB,oDAAoD,kBAAkB;AACrH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,iBAAiB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,iBAAiB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,0BAA0B;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,0BAA0B;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,0BAA0B;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,0BAA0B;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,eAAe,GAAG,eAAe,OAAO,iBAAiB;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,gBAAgB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,gBAAgB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,gBAAgB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,gBAAgB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,gBAAgB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,gBAAgB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA,6FAA6F,iBAAiB;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+EAA+E,iBAAiB;AAChG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gFAAgF,iBAAiB;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA,sBAAsB;AACtB,iEAAiE,iCAAmB;AACpF,kEAAkE,iCAAmB;AACrF,mEAAmE,iCAAmB;AACtF,sEAAsE,iCAAmB;;;;;AAKzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gDAAgD;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,8CAA8C;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,2BAA2B,IAAI;AACvE;AACA,kCAAkC,qBAAqB,OAAO;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,MAAM;AACpD;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,qBAAqB;AACxD,qBAAqB;AACrB;AACA;AACA;AACA,wDAAwD,IAAI;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gGAAgG,0BAA0B;AAC1H;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,SAAS;AACT;AACA;AACA,kBAAkB,oBAAoB,QAAQ,sBAAsB;AACpE;AACA;AACA;AACA,wDAAwD,IAAI;AAC5D;AACA;AACA;AACA;AACA,WAAW,qCAAqC,uBAAuB;AACvE,WAAW,0BAA0B;AACrC,WAAW,WAAW;AACtB,WAAW;AACX;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,gGAAgG;AAChH;AACA;AACA;AACA,oBAAoB,0BAA0B;AAC9C;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,gGAAgG,EAAE,IAAI,EAAE;AACxG;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,sCAAsC;AAClD,QAAQ,8BAA8B;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,iCAAiC,qBAAqB,gBAAgB;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,mDAAmD;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,0DAA0D;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;;AAEnF;AACA,aAAa,kBAAkB,yDAAyD,kCAAkC;AAC1H;AACA,QAAQ,iBAAiB;AACzB,WAAW,mCAAmC;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,mEAAmE,iCAAmB;AACtF,gEAAgE,iCAAmB;;;AAGnF;AACA,aAAa,kBAAkB,4BAA4B;AAC3D;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mHAAmH;AACnH,kGAAkG;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,mEAAmE,iCAAmB;;AAEtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,qEAAqE,iCAAmB;AACxF,6EAA6E,iCAAmB;AAChG,oEAAoE,iCAAmB;;;;;AAKvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,wDAAwD;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,iEAAiE;AACvG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,oGAAoG;AACpH;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,oBAAoB;AACpB;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,sEAAsE,iCAAmB;AACzF,yEAAyE,iCAAmB;AAC5F,qEAAqE,iCAAmB;AACxF,+DAA+D,iCAAmB;AAClF,qEAAqE,iCAAmB;AACxF,kEAAkE,iCAAmB;AACrF,oEAAoE,iCAAmB;AACvF,wEAAwE,iCAAmB;AAC3F,wEAAwE,iCAAmB;AAC3F,sFAAsF,iCAAmB;AACzG,wFAAwF,iCAAmB;AAC3G,kGAAkG,iCAAmB;AACrH,wFAAwF,iCAAmB;AAC3G,gGAAgG,iCAAmB;AACnH,0FAA0F,iCAAmB;AAC7G,mEAAmE,iCAAmB;AACtF,mEAAmE,iCAAmB;AACtF,mEAAmE,iCAAmB;AACtF,8FAA8F,iCAAmB;AACjH,iEAAiE,iCAAmB;AACpF,8FAA8F,iCAAmB;AACjH,8FAA8F,iCAAmB;AACjH,+DAA+D,iCAAmB;;;;;;;;;;AAUlF;;;;;;;;;;;;;;;AAeA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,wDAAwD;AAC1G,kJAAkJ,gBAAgB;AAClK,mKAAmK,gBAAgB;AACnL,oKAAoK,gBAAgB;AACpL,mJAAmJ,gBAAgB;AACnK;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,iEAAiE;AACvG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,2OAA2O;AAC3P;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,IAAI;AAChB;AACA,mFAAmF;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,aAAa;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,cAAc;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,oBAAoB;AACpB;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gFAAgF,mCAAmC;AACnH;AACA;AACA;AACA;AACA,gBAAgB,+BAA+B;AAC/C;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,4BAA4B;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,kCAAkC;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,gCAAgC,yBAAyB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iCAAiC;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,qEAAqE,iCAAmB;AACxF,6EAA6E,iCAAmB;AAChG,uFAAuF,iCAAmB;AAC1G,2EAA2E,iCAAmB;AAC9F,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;AAC1F,mFAAmF,iCAAmB;AACtG,mFAAmF,iCAAmB;;;;;;;;;;;AAWtG;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,oEAAoE,iCAAmB;AACvF,qEAAqE,iCAAmB;AACxF,wEAAwE,iCAAmB;;;;;AAK3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,4EAA4E,iCAAmB;AAC/F,+DAA+D,iCAAmB;;;AAGlF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,mEAAmE,iCAAmB;AACtF,8EAA8E,iCAAmB;AACjG,qEAAqE,iCAAmB;AACxF,kEAAkE,iCAAmB;AACrF,uFAAuF,iCAAmB;AAC1G,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,oEAAoE,iCAAmB;AACvF,qFAAqF,iCAAmB;AACxG,qFAAqF,iCAAmB;AACxG,YAAY,QAAQ;AACpB,YAAY,sBAAsB;;;;;;;;;;;;AAYlC;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA,kEAAkE,EAAE,KAAK;AACzE;AACA;AACA,0EAA0E,EAAE,KAAK;AACjF;AACA,wEAAwE,EAAE,OAAO;AACjF,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sGAAsG;AACtG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,oEAAoE,iCAAmB;AACvF,mEAAmE,iCAAmB;AACtF,8EAA8E,iCAAmB;AACjG,qEAAqE,iCAAmB;AACxF,mEAAmE,iCAAmB;AACtF,wFAAwF,iCAAmB;AAC3G,2EAA2E,iCAAmB;AAC9F,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;AAC1F,oEAAoE,iCAAmB;AACvF,kFAAkF,iCAAmB;AACrG,kFAAkF,iCAAmB;;;;;;;;;;;;;;;AAerG;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA,iEAAiE,EAAE,KAAK;AACxE;AACA;AACA,yEAAyE,EAAE,KAAK;AAChF;AACA,wGAAwG;AACxG,wEAAwE,EAAE,OAAO;AACjF,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sGAAsG;AACtG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,0EAA0E,iCAAmB;AAC7F,4EAA4E,iCAAmB;AAC/F,0DAA0D,iCAAmB;AAC7E,0DAA0D,iCAAmB;AAC7E,0DAA0D,iCAAmB;AAC7E,6EAA6E,iCAAmB;;;;;;AAMhG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,mEAAmE,iCAAmB;AACtF,6EAA6E,iCAAmB;AAChG,qEAAqE,iCAAmB;AACxF,kEAAkE,iCAAmB;AACrF,2EAA2E,iCAAmB;AAC9F,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;;;;;;;;;AAS1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,uFAAuF,iCAAmB;AAC1G,kEAAkE,iCAAmB;AACrF,qEAAqE,iCAAmB;AACxF,mEAAmE,iCAAmB;AACtF,kEAAkE,iCAAmB;;;;;;;AAOrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,qEAAqE;AACrF;AACA;AACA;AACA;AACA;AACA,oCAAoC,MAAM;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,MAAM;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,uBAAuB,kCAAkC,UAAU;AAC7H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,aAAa,cAAc,WAAW;AAC3F;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,WAAW;AAC/C;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,8EAA8E,iCAAmB;AACjG,gFAAgF,iCAAmB;AACnG,qEAAqE,iCAAmB;AACxF,+DAA+D,iCAAmB;AAClF,qEAAqE,iCAAmB;AACxF,kEAAkE,iCAAmB;AACrF,mEAAmE,iCAAmB;AACtF,6EAA6E,iCAAmB;;;;;;;;;;AAUhG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,2EAA2E,iCAAmB;AAC9F,6EAA6E,iCAAmB;AAChG,uFAAuF,iCAAmB;AAC1G,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;AAC1F,6EAA6E,iCAAmB;;;;;;;;AAQhG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,0DAA0D,iCAAmB;;AAE7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oEAAoE;AACpE;AACA;AACA;AACA;AACA,mGAAmG,eAAe,oBAAoB,cAAc;AACpJ;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,qEAAqE,iCAAmB;AACxF,6EAA6E,iCAAmB;AAChG,uFAAuF,iCAAmB;AAC1G,2EAA2E,iCAAmB;AAC9F,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;AAC1F,sFAAsF,iCAAmB;AACzG,sFAAsF,iCAAmB;;;;;;;;;;;AAWzG;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,uEAAuE,iCAAmB;;AAE1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,4EAA4E,iCAAmB;AAC/F,8EAA8E,iCAAmB;AACjG,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;;;;;;AAM1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,0DAA0D,iCAAmB;AAC7E,oEAAoE,iCAAmB;;;AAGvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,6DAA6D;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,iBAAiB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,iBAAiB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,gBAAgB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,gBAAgB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,iBAAiB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,iBAAiB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wEAAwE,YAAY,GAAG,KAAK;AAC5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,YAAY,GAAG,MAAM;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,YAAY,GAAG,KAAK;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,8BAA8B;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,OAAO;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,UAAU,aAAa,UAAU,EAAE,+CAA+C;AAC/H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C,0BAA0B,MAAM,IAAI,SAAS,EAAE,yCAAyC;AACxF;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,+DAA+D,kCAAmB;AAClF,yEAAyE,kCAAmB;;;AAG5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,mEAAmE,kCAAmB;AACtF,kEAAkE,kCAAmB;;;;AAIrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE,MAAM;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,oBAAoB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,sBAAsB,IAAI;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,qBAAqB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,YAAY;AAClE,oBAAoB,gCAAgC,GAAG,gCAAgC;AACvF;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,YAAY;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yEAAyE;AACzE;AACA;AACA,2BAA2B;AAC3B;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,4EAA4E,kCAAmB;AAC/F,yEAAyE,kCAAmB;;;AAG5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uBAAuB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,0DAA0D,kCAAmB;AAC7E,oEAAoE,kCAAmB;;;AAGvF;AACA,wDAAwD,sBAAsB;AAC9E;AACA;AACA,4DAA4D,sBAAsB;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,yDAAyD;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,cAAc,OAAO,aAAa;AAC1F,mEAAmE,0BAA0B;AAC7F;AACA;AACA,8DAA8D,cAAc,OAAO,aAAa;AAChG;AACA,qFAAqF,aAAa;AAClG;AACA,4DAA4D,aAAa;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,gFAAgF,aAAa,IAAI,aAAa;AAC9G,8DAA8D,YAAY,MAAM,0BAA0B;AAC1G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,oBAAoB;AAChF,qBAAqB,qCAAqC;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,UAAU;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,UAAU;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,wBAAwB,YAAY;AACpC;AACA,kDAAkD,EAAE,KAAK;AACzD;AACA;AACA,0DAA0D,EAAE,KAAK;AACjE;AACA,2DAA2D;AAC3D,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,kCAAmB;;AAElF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,gCAAgC,uBAAuB;AACvD;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,wBAAwB;AACxD;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,gBAAgB,4BAA4B;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gBAAgB,kBAAkB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,OAAO;AACpD,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yFAAyF,kCAAmB;;AAE5G;AACA;AACA;AACA,wDAAwD,2BAA2B,IAAI;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,wCAAwC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yEAAyE,kCAAmB;AAC5F,+DAA+D,kCAAmB;AAClF,oEAAoE,kCAAmB;AACvF,iEAAiE,kCAAmB;AACpF,mEAAmE,kCAAmB;AACtF,0EAA0E,kCAAmB;AAC7F,mEAAmE,kCAAmB;;;;;;;;AAQtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA,wBAAwB;AACxB;AACA,2DAA2D,iCAAiC;AAC5F;AACA,kFAAkF;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,kBAAkB,YAAY,EAAE,yBAAyB,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY;AAChG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,0EAA0E,kCAAmB;;;AAG7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE,kBAAkB;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4BAA4B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,8BAA8B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD;AACA,gEAAgE;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,8BAA8B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,8BAA8B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,8BAA8B;;;AAG/B,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+EAA+E,kCAAmB;AAClG,+DAA+D,kCAAmB;AAClF,uEAAuE,kCAAmB;AAC1F,+FAA+F,kCAAmB;;;;;AAKlH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,kCAAkC;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,gCAAgC;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,+EAA+E,kCAAmB;AAClG,oEAAoE,kCAAmB;AACvF,4EAA4E,kCAAmB;;;;;AAK/F;AACA,qFAAqF,kCAAkC;AACvH,IAAI,gBAAgB,GAAG,mBAAmB,GAAG,uBAAuB,GAAG,gBAAgB,GAAG,mBAAmB,GAAG,gBAAgB,OAAO,kBAAkB;AACzJ,IAAI,kBAAkB;AACtB;AACA,yDAAyD,6BAA6B;AACtF,qEAAqE,2BAA2B,KAAK;AACrG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8FAA8F;AAC9F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,6BAA6B;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,iEAAiE,kCAAmB;AACpF,yEAAyE,kCAAmB;AAC5F,yFAAyF,kCAAmB;AAC5G,kEAAkE,kCAAmB;AACrF,2EAA2E,kCAAmB;AAC9F,+EAA+E,kCAAmB;AAClG,gFAAgF,kCAAmB;AACnG,gEAAgE,kCAAmB;AACnF,8DAA8D,kCAAmB;;;;;;;;;;;AAWjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA,gBAAgB,2IAA2I;AAC3J;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,kBAAkB;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,eAAe,yDAAyD,+DAA+D;AACpL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,iEAAiE,kCAAmB;AACpF,mEAAmE,kCAAmB;AACtF,yEAAyE,kCAAmB;AAC5F,kEAAkE,kCAAmB;;;;;;AAMrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kCAAkC;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wHAAwH,uBAAuB;AAC/I;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,2EAA2E,kCAAmB;AAC9F,qEAAqE,kCAAmB;AACxF,6GAA6G,kCAAmB;AAChI,+EAA+E,kCAAmB;AAClG,gFAAgF,kCAAmB;AACnG,uEAAuE,kCAAmB;AAC1F,2EAA2E,kCAAmB;AAC9F,0EAA0E,kCAAmB;AAC7F,kFAAkF,kCAAmB;AACrG,mEAAmE,kCAAmB;AACtF,gEAAgE,kCAAmB;AACnF,wEAAwE,kCAAmB;AAC3F,iFAAiF,kCAAmB;AACpG,kEAAkE,kCAAmB;;;;;;;;;;;;;;AAcrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,gDAAgD;AACrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,4EAA4E,kCAAmB;AAC/F,gEAAgE,kCAAmB;AACnF,kEAAkE,kCAAmB;AACrF,mEAAmE,kCAAmB;AACtF,qEAAqE,kCAAmB;AACxF,yFAAyF,kCAAmB;AAC5G,kEAAkE,kCAAmB;;;;;;;;AAQrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,iCAAiC,IAAI,uBAAuB;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,cAAc;AACjH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,6CAA6C,uBAAuB;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,UAAU,gBAAgB,cAAc;AAClG;AACA;AACA,yFAAyF;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+EAA+E,kCAAmB;AAClG,+DAA+D,kCAAmB;AAClF,iEAAiE,kCAAmB;;;;AAIpF;AACA;AACA;AACA;AACA;AACA,gBAAgB,+BAA+B;AAC/C;AACA;AACA;AACA;AACA;AACA,gBAAgB,gBAAgB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,iEAAiE,kCAAmB;AACpF,kEAAkE,kCAAmB;AACrF,qEAAqE,kCAAmB;;;;AAIxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4CAA4C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,eAAe;AACvC,4BAA4B,eAAe;AAC3C,sBAAsB,yBAAyB;AAC/C;AACA;AACA,mBAAmB,yBAAyB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,qBAAqB;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,2EAA2E,kCAAmB;AAC9F,gEAAgE,kCAAmB;AACnF,6GAA6G,kCAAmB;AAChI,sFAAsF,kCAAmB;AACzG,2EAA2E,kCAAmB;AAC9F,qEAAqE,kCAAmB;AACxF,0EAA0E,kCAAmB;AAC7F,+EAA+E,kCAAmB;;;;;;;;;AASlG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gCAAgC;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yFAAyF,kCAAmB;AAC5G,qEAAqE,kCAAmB;;;AAGxF;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,mEAAmE,kCAAmB;AACtF,qEAAqE,kCAAmB;AACxF,gEAAgE,kCAAmB;;;;AAInF;AACA,cAAc,kBAAkB,uCAAuC;AACvE;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA,CAAC,gDAAgD;;;AAGjD,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,mFAAmF,kCAAmB;AACtG,4EAA4E,kCAAmB;AAC/F,sEAAsE,kCAAmB;;;;AAIzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,wEAAwE,kCAAmB;AAC3F,+EAA+E,kCAAmB;AAClG,+EAA+E,kCAAmB;;;;;AAKlG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,IAAI;AAChB;AACA;AACA,oDAAoD,eAAe;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iEAAiE,kCAAmB;AACpF,+DAA+D,kCAAmB;AAClF,qEAAqE,kCAAmB;AACxF,+EAA+E,kCAAmB;AAClG,oEAAoE,kCAAmB;AACvF,mEAAmE,kCAAmB;;;;;;;AAOtF;AACA;AACA,IAAI,kCAAkC;AACtC;AACA,oCAAoC,yBAAyB;AAC7D;AACA;AACA;AACA;AACA,iEAAiE,YAAY,yBAAyB;AACtG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,uBAAuB,aAAa,uBAAuB;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;;AAEnF;AACA,gBAAgB,kBAAkB,+BAA+B;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iEAAiE,kCAAmB;AACpF,kEAAkE,kCAAmB;;;AAGrF;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,gBAAgB;AAChC,uFAAuF;AACvF,mFAAmF;AACnF;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,2CAA2C;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,gBAAgB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,oBAAoB;AAC9C,wBAAwB,kBAAkB;AAC1C;AACA,SAAS;AACT;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,kEAAkE,kCAAmB;AACrF,iEAAiE,kCAAmB;AACpF,+EAA+E,kCAAmB;;;;;AAKlG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,sEAAsE;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,mCAAmC;AACrE;AACA;AACA;AACA;AACA;AACA,0EAA0E,OAAO,4BAA4B,SAAS;AACtH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,OAAO,cAAc,YAAY;AAC/G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;AACnF,qEAAqE,kCAAmB;;;AAGxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,sCAAsC,iCAAiC,sBAAsB;AACzG;AACA;AACA;AACA;AACA,gBAAgB,yBAAyB;AACzC;AACA;AACA;AACA;AACA;AACA,gHAAgH,iBAAiB;AACjI;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE,EAAE,IAAI,EAAE,QAAQ,GAAG,0BAA0B,kBAAkB;AAClI;AACA;AACA,mEAAmE,EAAE,IAAI,EAAE,QAAQ,GAAG,0BAA0B,eAAe;AAC/H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,EAAE,IAAI,EAAE;AAC3D;AACA;AACA;AACA,kDAAkD,sBAAsB;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE,EAAE,IAAI,EAAE,QAAQ,GAAG,0BAA0B,kBAAkB;AAClI;AACA;AACA,mEAAmE,EAAE,IAAI,EAAE,QAAQ,GAAG,0BAA0B,eAAe;AAC/H;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,EAAE,IAAI,EAAE;AAC3D;AACA;AACA,mDAAmD,qBAAqB;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,iCAAiC,SAAS;AAC1C;AACA;AACA,qCAAqC,sBAAsB;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,eAAe,gDAAgD,aAAa,yBAAyB;AACrH,iCAAiC;AACjC,iCAAiC;AACjC,wBAAwB,UAAU;AAClC,4BAA4B,UAAU;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,gCAAgC;AAChC,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iEAAiE,kCAAmB;AACpF,+DAA+D,kCAAmB;AAClF,8DAA8D,kCAAmB;;;;AAIjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,gBAAgB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,gBAAgB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;AACnF,mEAAmE,kCAAmB;AACtF,qEAAqE,kCAAmB;AACxF,oEAAoE,kCAAmB;AACvF,qEAAqE,kCAAmB;;;;;;AAMxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,uBAAuB;AACzD;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,+CAA+C;AAC/C,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,qEAAqE,kCAAmB;AACxF,gEAAgE,kCAAmB;AACnF,kEAAkE,kCAAmB;;;;;AAKrF;AACA;AACA;AACA;AACA;AACA,wBAAwB,8CAA8C;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,sBAAsB;AAChD;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gBAAgB,qCAAqC,IAAI;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,wEAAwE,kCAAmB;;AAE3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,sCAAsC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,iEAAiE,kCAAmB;AACpF,gEAAgE,kCAAmB;AACnF,qEAAqE,kCAAmB;AACxF,uEAAuE,kCAAmB;AAC1F,qEAAqE,kCAAmB;AACxF,mEAAmE,kCAAmB;AACtF,8DAA8D,kCAAmB;AACjF,2EAA2E,kCAAmB;AAC9F,gFAAgF,kCAAmB;AACnG,wEAAwE,kCAAmB;AAC3F,0EAA0E,kCAAmB;AAC7F,4EAA4E,kCAAmB;AAC/F,iEAAiE,kCAAmB;AACpF,iEAAiE,kCAAmB;AACpF,oEAAoE,kCAAmB;AACvF,kEAAkE,kCAAmB;AACrF,+DAA+D,kCAAmB;AAClF,qEAAqE,kCAAmB;AACxF,+DAA+D,kCAAmB;AAClF,oEAAoE,kCAAmB;AACvF,qEAAqE,kCAAmB;AACxF,iEAAiE,kCAAmB;AACpF,oEAAoE,kCAAmB;AACvF,sEAAsE,kCAAmB;AACzF,yEAAyE,kCAAmB;AAC5F,2FAA2F,kCAAmB;AAC9G,mGAAmG,kCAAmB;AACtH,gGAAgG,kCAAmB;AACnH,sGAAsG,kCAAmB;AACzH,6EAA6E,kCAAmB;AAChG,qFAAqF,kCAAmB;AACxG,2FAA2F,kCAAmB;AAC9G,oGAAoG,kCAAmB;AACvH,iFAAiF,kCAAmB;AACpG,oEAAoE,kCAAmB;AACvF,mEAAmE,kCAAmB;AACtF,yEAAyE,kCAAmB;AAC5F,gFAAgF,kCAAmB;AACnG,gFAAgF,kCAAmB;AACnG,oFAAoF,kCAAmB;AACvG,2EAA2E,kCAAmB;AAC9F,gEAAgE,kCAAmB;AACnF,6EAA6E,kCAAmB;AAChG;;;;;;;;AAQA;;;;;;AAMA;;;;;;;;;;;;;;;;;AAiBA;;;AAGA;;;;;;;;AAQA;;;;;;;AAOA;;AAEA;;;;;AAKA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA,aAAa;AACb;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;AACnF,sEAAsE,kCAAmB;;;AAGzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,qBAAqB;AACjF;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA,6DAA6D,SAAS;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,SAAS;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,SAAS;AACvD;AACA;AACA;AACA;AACA,2CAA2C,SAAS;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oEAAoE;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,+BAA+B;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,0BAA0B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oBAAoB;;;AAGrB,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iEAAiE,kCAAmB;AACpF,qEAAqE,kCAAmB;AACxF,kEAAkE,kCAAmB;AACrF,8EAA8E,kCAAmB;;;;;AAKjG;AACA;AACA;AACA,gBAAgB,yCAAyC;AACzD;AACA;AACA;AACA,6BAA6B,iBAAiB;AAC9C,6BAA6B,iBAAiB;AAC9C;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C,8CAA8C;AAC9C,4CAA4C;AAC5C,8CAA8C;AAC9C;AACA,+BAA+B,SAAS;AACxC,+BAA+B,SAAS;AACxC,+BAA+B,SAAS;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,gEAAgE,kCAAmB;AACnF,qEAAqE,kCAAmB;AACxF,sEAAsE,kCAAmB;;;;;AAKzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oBAAoB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB,gBAAgB,kBAAkB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kDAAkD;;;AAGnD,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,sEAAsE,kCAAmB;AACzF,iFAAiF,kCAAmB;;;;AAIpG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,sCAAsC;;;AAGvC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yFAAyF,kCAAmB;;AAE5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;AACnF,iFAAiF,kCAAmB;AACpG,qEAAqE,kCAAmB;AACxF,sEAAsE,kCAAmB;AACzF,qEAAqE,kCAAmB;AACxF,4EAA4E,kCAAmB;AAC/F,wEAAwE,kCAAmB;AAC3F,wEAAwE,kCAAmB;AAC3F,8EAA8E,kCAAmB;AACjG,uEAAuE,kCAAmB;AAC1F,oEAAoE,kCAAmB;AACvF,qEAAqE,kCAAmB;AACxF,qEAAqE,kCAAmB;AACxF,sEAAsE,kCAAmB;;;;;;;;;;;;;;;AAezF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE,SAAS;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,8BAA8B;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,yEAAyE,kCAAmB;;AAE5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,8BAA8B;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oCAAoC;;;AAGrC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+EAA+E,kCAAmB;AAClG,+EAA+E,kCAAmB;AAClG,+EAA+E,kCAAmB;AAClG,oFAAoF,kCAAmB;AACvG,0EAA0E,kCAAmB;AAC7F,0EAA0E,kCAAmB;AAC7F,4FAA4F,kCAAmB;AAC/G,yFAAyF,kCAAmB;;;;;;;AAO5G;AACA;AACA;AACA;AACA,0DAA0D,0BAA0B;AACpF,QAAQ,kBAAkB;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA,uHAAuH,WAAW;AAClI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,qBAAqB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA,8BAA8B,sBAAsB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kCAAkC;;;AAGnC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA,CAAC,wCAAwC;;;AAGzC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,6EAA6E,kCAAmB;AAChG,yEAAyE,kCAAmB;;;;;;;;;;AAU5F,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,uEAAuE,kCAAmB;AAC1F,kEAAkE,kCAAmB;AACrF,uEAAuE,kCAAmB;AAC1F,+DAA+D,kCAAmB;;;;;;AAMlF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,qBAAqB,2BAA2B,wBAAwB;AACpF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4EAA4E,4BAA4B;AACxG,gBAAgB,qDAAqD,IAAI;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,aAAa;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,uBAAuB;AACtC;AACA;AACA;AACA,eAAe,iBAAiB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,cAAc;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,YAAY;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;AACnF,8DAA8D,kCAAmB;AACjF,gEAAgE,kCAAmB;;;;AAInF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,WAAW;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,gBAAgB;AACpE,oDAAoD,gBAAgB;AACpE,oDAAoD,gBAAgB;AACpE,oDAAoD,gBAAgB;AACpE,0DAA0D,UAAU;AACpE,0DAA0D,UAAU;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,cAAc;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG,cAAc,EAAE,cAAc,EAAE,aAAa;AAChD,GAAG,cAAc,EAAE,cAAc,EAAE,aAAa;AAChD;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,8DAA8D,kCAAmB;;AAEjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,OAAO;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,WAAW;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C,4BAA4B,uBAAuB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA,6EAA6E;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gCAAgC;;;AAGjC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;AACnF,qEAAqE,kCAAmB;AACxF,gEAAgE,kCAAmB;AACnF,uEAAuE,kCAAmB;AAC1F,mEAAmE,kCAAmB;AACtF,qEAAqE,kCAAmB;AACxF,gEAAgE,kCAAmB;AACnF,4EAA4E,kCAAmB;AAC/F,sEAAsE,kCAAmB;AACzF,oEAAoE,kCAAmB;AACvF,8DAA8D,kCAAmB;AACjF,+DAA+D,kCAAmB;AAClF,uEAAuE,kCAAmB;AAC1F,+DAA+D,kCAAmB;AAClF,wEAAwE,kCAAmB;;;;;;;;;;;;;;;;;;AAkB3F,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,uEAAuE,kCAAmB;AAC1F,8DAA8D,kCAAmB;;;AAGjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,8DAA8D,kCAAmB;AACjF,gEAAgE,kCAAmB;;;;AAInF;AACA;AACA;AACA;AACA,CAAC,0CAA0C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,WAAW;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc;AACjE,GAAG,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc;AACjE,GAAG,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,cAAc;AAClE,GAAG,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,cAAc;AAClE;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oCAAoC;;;AAGrC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,uEAAuE,kCAAmB;AAC1F,8DAA8D,kCAAmB;AACjF,gEAAgE,kCAAmB;AACnF,qEAAqE,kCAAmB;AACxF,sEAAsE,kCAAmB;;;;;;AAMzF;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,4BAA4B,UAAU;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,4BAA4B,UAAU;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,uEAAuE,kCAAmB;AAC1F,8DAA8D,kCAAmB;;;AAGjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8FAA8F,mBAAmB;AACjH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6EAA6E;AAC7E,iCAAiC,uBAAuB;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,sBAAsB,IAAI,sBAAsB;AACvE;AACA,mBAAmB,OAAO,IAAI,OAAO;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kCAAkC;;;AAGnC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,kCAAmB;AAClF,qEAAqE,kCAAmB;AACxF,mEAAmE,kCAAmB;AACtF,6EAA6E,kCAAmB;AAChG,oFAAoF,kCAAmB;AACvG,qEAAqE,kCAAmB;AACxF,qEAAqE,kCAAmB;AACxF,8DAA8D,kCAAmB;;;;;;;;;AASjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,wEAAwE,GAAG;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,0FAA0F,IAAI;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,mEAAmE,kCAAmB;AACtF,mEAAmE,kCAAmB;AACtF,qEAAqE,kCAAmB;AACxF,qEAAqE,kCAAmB;AACxF,qEAAqE,kCAAmB;;;;;;AAMxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,cAAc;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,QAAQ;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yGAAyG,SAAS;AAClH,2GAA2G,SAAS;AACpH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,kCAAmB;AAClF,qEAAqE,kCAAmB;AACxF,qEAAqE,kCAAmB;AACxF,iFAAiF,kCAAmB;AACpG,mEAAmE,kCAAmB;AACtF,qEAAqE,kCAAmB;AACxF,mEAAmE,kCAAmB;AACtF,yEAAyE,kCAAmB;;;;;;;;;AAS5F;AACA;AACA;AACA,WAAW,gBAAgB;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,gIAAgI;AAChJ;AACA,uJAAuJ;AACvJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA,wEAAwE,sBAAsB,IAAI;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,4EAA4E,IAAI;AAChG,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kCAAkC;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,+BAA+B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,+DAA+D,kCAAmB;AAClF,qEAAqE,kCAAmB;AACxF,6GAA6G,kCAAmB;AAChI,oFAAoF,kCAAmB;AACvG,sFAAsF,kCAAmB;AACzG,+EAA+E,kCAAmB;AAClG,mEAAmE,kCAAmB;AACtF,+EAA+E,kCAAmB;AAClG,8EAA8E,kCAAmB;;;;;;;;;;AAUjG;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA,gBAAgB,uBAAuB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,QAAQ;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+FAA+F,4CAA4C;AAC3I;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,mCAAmC;AAC3C;AACA;AACA;AACA;AACA,QAAQ,kCAAkC;AAC1C;AACA;AACA;AACA,CAAC,8CAA8C;;;AAG/C,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,mEAAmE,kCAAmB;AACtF,yEAAyE,kCAAmB;AAC5F,4EAA4E,kCAAmB;AAC/F,6EAA6E,kCAAmB;;;;;;;;AAQhG,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,uEAAuE,kCAAmB;AAC1F,kEAAkE,kCAAmB;;;AAGrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,wBAAwB,IAAI;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,IAAI;AACjE;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,UAAU,gBAAgB,cAAc;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,aAAa;AACpC;AACA;AACA,sEAAsE,mDAAmD;AACzH;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,8EAA8E,kCAAmB;AACjG,4EAA4E,kCAAmB;AAC/F,8EAA8E,kCAAmB;;;;;AAKjG;AACA,QAAQ,kBAAkB;AAC1B,IAAI,kBAAkB,OAAO,mBAAmB,mCAAmC;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF,SAAS;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,oBAAoB,QAAQ;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,OAAO;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,OAAO;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,wBAAwB,UAAU;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,eAAe;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,aAAa;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;AACA,oDAAoD,aAAa;AACjE;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D;AAC/D,yDAAyD;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,UAAU;AAC7C,oDAAoD,cAAc;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,6BAA6B;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,MAAM,IAAI,MAAM,IAAI,MAAM;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,qEAAqE,kCAAmB;AACxF,6DAA6D,kCAAmB;AAChF,8DAA8D,kCAAmB;;;;;;;AAOjF,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,sEAAsE,kCAAmB;;;AAGzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,mBAAmB;AAC3B,6DAA6D,mBAAmB;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yGAAyG,UAAU;AACnH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,SAAS;AACT;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA,sBAAsB;AACtB,+DAA+D,kCAAmB;AAClF,sEAAsE,kCAAmB;AACzF,0EAA0E,kCAAmB;;;;;;AAM7F,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,wFAAwF,kCAAmB;AAC3G,kEAAkE,kCAAmB;AACrF,0EAA0E,kCAAmB;AAC7F,sEAAsE,kCAAmB;AACzF,4EAA4E,kCAAmB;AAC/F,oEAAoE,kCAAmB;AACvF,kEAAkE,kCAAmB;AACrF,sEAAsE,kCAAmB;;;;;;;;;AASzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,gBAAgB;AACxB,mDAAmD,gBAAgB,OAAO;AAC1E,sCAAsC,iBAAiB;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,WAAW;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,gBAAgB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,2EAA2E,kCAAmB;AAC9F,mEAAmE,kCAAmB;AACtF,sEAAsE,kCAAmB;AACzF,qEAAqE,kCAAmB;;;;;AAKxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,MAAM;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,+BAA+B,IAAI;AACnC;AACA;AACA;AACA;AACA;AACA,uDAAuD;AACvD;AACA;AACA;AACA,qBAAqB;AACrB;AACA,iBAAiB;AACjB;AACA,gCAAgC,2BAA2B;AAC3D;AACA;AACA,qBAAqB;AACrB;AACA,iBAAiB;AACjB;AACA,gCAAgC,MAAM;AACtC;AACA;AACA;AACA,qBAAqB;AACrB;AACA,iBAAiB;AACjB;AACA,gCAAgC,MAAM;AACtC;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,sBAAsB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA,sBAAsB;AACtB,wEAAwE,kCAAmB;AAC3F,iEAAiE,kCAAmB;AACpF,kEAAkE,kCAAmB;AACrF,gEAAgE,kCAAmB;AACnF,iEAAiE,kCAAmB;AACpF,gEAAgE,kCAAmB;AACnF,+DAA+D,kCAAmB;AAClF,oEAAoE,kCAAmB;AACvF,iEAAiE,kCAAmB;AACpF,uFAAuF,kCAAmB;AAC1G,qFAAqF,kCAAmB;AACxG,iFAAiF,kCAAmB;AACpG,oFAAoF,kCAAmB;AACvG,uFAAuF,kCAAmB;AAC1G,kFAAkF,kCAAmB;AACrG,4EAA4E,kCAAmB;AAC/F,8EAA8E,kCAAmB;AACjG,+EAA+E,kCAAmB;AAClG,wFAAwF,kCAAmB;AAC3G,mFAAmF,kCAAmB;AACtG,gFAAgF,kCAAmB;AACnG,sEAAsE,kCAAmB;AACzF,0EAA0E,kCAAmB;AAC7F,6EAA6E,kCAAmB;AAChG,iFAAiF,kCAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BpG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,2BAA2B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,YAAY,iBAAiB;AAC7B;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,oCAAoC;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,eAAe;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wGAAwG,IAAI;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yGAAyG,IAAI;AAC7G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sGAAsG,IAAI;AAC1G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uGAAuG,IAAI;AAC3G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,gBAAgB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kFAAkF,kFAAkF;AACpK;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E,sIAAsI;AAChN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,sBAAsB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,uBAAuB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,oBAAoB;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,qBAAqB;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE,gBAAgB;AACtF;AACA;AACA;AACA;AACA;AACA;AACA,qFAAqF,kFAAkF;AACvK;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,SAAS;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,gBAAgB;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4EAA4E,gBAAgB;AAC5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,gBAAgB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,iBAAiB,mCAAmC,gBAAgB;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oFAAoF,gBAAgB;AACpG;AACA;AACA;AACA;AACA,yCAAyC,gBAAgB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,QAAQ;AACvD;AACA;AACA,6CAA6C,QAAQ;AACrD;AACA;AACA;AACA;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,gBAAgB;AAClC,uCAAuC,sBAAsB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,eAAe;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA,4BAA4B,2BAA2B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,kEAAkE,kCAAmB;AACrF,yEAAyE,kCAAmB;AAC5F,mEAAmE,kCAAmB;AACtF,wGAAwG,kCAAmB;AAC3H,2GAA2G,kCAAmB;AAC9H,sEAAsE,kCAAmB;;;;;;;;AAQzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oGAAoG;AACpG;AACA;AACA;AACA;AACA;AACA,qGAAqG;AACrG;AACA;AACA;AACA;AACA;AACA,uDAAuD,sBAAsB;AAC7E;AACA;AACA,YAAY,6BAA6B;AACzC;AACA;AACA;AACA;AACA,uDAAuD,mBAAmB;AAC1E;AACA;AACA,YAAY,6BAA6B;AACzC;AACA;AACA;AACA;AACA,gCAAgC,8BAA8B;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6EAA6E;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kCAAkC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,uFAAuF;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+FAA+F,wBAAwB;AACvH;AACA;AACA,6FAA6F,YAAY;AACzG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,8EAA8E,sBAAsB,GAAG,uBAAuB,qBAAqB,gBAAgB;AACnK;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,eAAe;AAClH;AACA;AACA;AACA,sEAAsE,gBAAgB;AACtF,8CAA8C,gBAAgB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,8BAA8B,8BAA8B;AACzF,qDAAqD,gBAAgB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,4CAA4C,KAAK,8BAA8B,MAAM,4BAA4B;AAC/I;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,oCAAoC;AACpD;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,+DAA+D,kCAAmB;AAClF,6GAA6G,kCAAmB;AAChI,iFAAiF,kCAAmB;AACpG,0EAA0E,kCAAmB;;;;;;AAM7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,gBAAgB;AAC3B;AACA;AACA;AACA;AACA;AACA,gBAAgB,WAAW;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yFAAyF,kCAAmB;;AAE5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,sFAAsF,kCAAmB;AACzG,6GAA6G,kCAAmB;AAChI,kFAAkF,kCAAmB;AACrG,+EAA+E,kCAAmB;;;;;AAKlG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gCAAgC;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,iFAAiF,kCAAmB;AACpG,+EAA+E,kCAAmB;AAClG,qFAAqF,kCAAmB;AACxG,iFAAiF,kCAAmB;AACpG,gGAAgG,kCAAmB;AACnH,qEAAqE,kCAAmB;AACxF,6GAA6G,kCAAmB;AAChI,sFAAsF,kCAAmB;AACzG,kEAAkE,kCAAmB;AACrF,mEAAmE,kCAAmB;AACtF,kFAAkF,kCAAmB;AACrG,iFAAiF,kCAAmB;AACpG,sEAAsE,kCAAmB;AACzF,gGAAgG,kCAAmB;;;;;;;;;;;;;;AAcnH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,qBAAqB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,wBAAwB;AACnE;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,8GAA8G;AAC9H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,YAAY;AACpC,4BAA4B,WAAW;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sHAAsH;AACtH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,wBAAwB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,wBAAwB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,2GAA2G;AAC3H,gBAAgB,sDAAsD;AACtE;AACA;AACA;AACA,4BAA4B,mBAAmB;AAC/C;AACA;AACA;AACA;AACA,4BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,4DAA4D;AACzH;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,gFAAgF,kCAAmB;AACnG,qEAAqE,kCAAmB;AACxF,kEAAkE,kCAAmB;AACrF,sFAAsF,kCAAmB;AACzG,6GAA6G,kCAAmB;AAChI,iFAAiF,kCAAmB;AACpG,iFAAiF,kCAAmB;AACpG,oFAAoF,kCAAmB;AACvG,kEAAkE,kCAAmB;AACrF,mEAAmE,kCAAmB;AACtF,0GAA0G,kCAAmB;AAC7H,sFAAsF,kCAAmB;AACzG,yFAAyF,kCAAmB;AAC5G,iEAAiE,kCAAmB;AACpF,sEAAsE,kCAAmB;AACzF,2EAA2E,kCAAmB;AAC9F,oEAAoE,kCAAmB;AACvF,iFAAiF,kCAAmB;AACpG,gGAAgG,kCAAmB;;;;;;;;;;;;;;;;;;;AAmBnH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C,4BAA4B,eAAe;AAC3C;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,QAAQ;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA,4BAA4B,eAAe;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,eAAe;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,eAAe;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,eAAe;AACnC;AACA;AACA;AACA,gBAAgB,OAAO;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,eAAe;AAChD,qCAAqC,eAAe;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,eAAe;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0GAA0G;AAC1G;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA,mEAAmE,6BAA6B;AAChG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,4IAA4I;AAC5J,gBAAgB,sDAAsD;AACtE;AACA;AACA;AACA;AACA,4BAA4B,mBAAmB;AAC/C;AACA;AACA;AACA,4BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,4DAA4D;AACrH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,uBAAuB;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,iBAAiB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,kBAAkB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,eAAe;AACrD;AACA,kCAAkC,qBAAqB;AACvD;AACA,sBAAsB,qBAAqB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,iEAAiE,kCAAmB;AACpF,sEAAsE,kCAAmB;AACzF,kFAAkF,kCAAmB;AACrG,+EAA+E,kCAAmB;;;;;;;AAOlG,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,qEAAqE,kCAAmB;;;AAGxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;AACnF,iFAAiF,kCAAmB;AACpG,+DAA+D,kCAAmB;AAClF,sEAAsE,kCAAmB;;;;;AAKzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,0BAA0B;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,YAAY;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,iBAAiB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,0CAA0C,iBAAiB;AAC3D;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA,QAAQ,IAAI;AACZ;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,6DAA6D,kCAAmB;;;AAGhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,QAAQ;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,wBAAwB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iEAAiE,kCAAmB;AACpF,gEAAgE,kCAAmB;AACnF,6DAA6D,kCAAmB;;;;AAIhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG;AACnG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E,IAAI;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,cAAc;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA,KAAK;AACL;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,+DAA+D,kCAAmB;AAClF,6DAA6D,kCAAmB;;;AAGhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,kBAAkB,EAAE,mCAAmC,EAAE,yBAAyB;AACrH,2BAA2B,iBAAiB,sBAAsB,gBAAgB;AAClF,+CAA+C,yBAAyB;AACxE;AACA;AACA;AACA;AACA,sCAAsC,gBAAgB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6DAA6D,kCAAmB;;AAEhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,oCAAoC;AAC9E;AACA;AACA;AACA,uCAAuC;AACvC,8CAA8C;AAC9C,gDAAgD;AAChD;AACA;AACA,uCAAuC;AACvC,8CAA8C;AAC9C,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,+DAA+D,kCAAmB;;AAElF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,uBAAuB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,gBAAgB;AACtC,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;;AAExF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;AAGD,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,8DAA8D,kCAAmB;AACjF,6DAA6D,kCAAmB;AAChF,oEAAoE,kCAAmB;AACvF,yEAAyE,kCAAmB;AAC5F,kEAAkE,kCAAmB;;;;;;;;;AASrF,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,+DAA+D,kCAAmB;AAClF;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4BAA4B;AAC7B;AACA;AACA,oCAAoC,0BAA0B,KAAK,wBAAwB;AAC3F,gBAAgB,mBAAmB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,mBAAmB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,yBAAyB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,yBAAyB;AAClE;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,wBAAwB;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,wBAAwB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,wBAAwB;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,wBAAwB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,yBAAyB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,yBAAyB;AAClE;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,yBAAyB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,yBAAyB;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA,wBAAwB,yBAAyB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;;AAErF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,YAAY;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6DAA6D,kCAAmB;;AAEhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE,WAAW,0DAA0D,gBAAgB;AACtJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0GAA0G,6CAA6C;AACvJ;AACA;AACA;AACA;AACA;AACA,mIAAmI,0DAA0D;AAC7L;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;;AAExF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,gEAAgE,kCAAmB;;;AAGnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,WAAW;AACvD;AACA;AACA;AACA;AACA,wCAAwC,oBAAoB;AAC5D;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,sFAAsF,kCAAmB;AACzG,6DAA6D,kCAAmB;;;AAGhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,aAAa;AACb;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,+DAA+D,kCAAmB;AAClF,4DAA4D,kCAAmB;AAC/E,gEAAgE,kCAAmB;AACnF,0EAA0E,kCAAmB;AAC7F,gEAAgE,kCAAmB;AACnF,+DAA+D,kCAAmB;AAClF,oEAAoE,kCAAmB;AACvF,gEAAgE,kCAAmB;AACnF,qEAAqE,kCAAmB;AACxF,uEAAuE,kCAAmB;AAC1F,6EAA6E,kCAAmB;AAChG,iEAAiE,kCAAmB;AACpF,gEAAgE,kCAAmB;AACnF,8EAA8E,kCAAmB;AACjG,0EAA0E,kCAAmB;AAC7F,gEAAgE,kCAAmB;AACnF,wEAAwE,kCAAmB;AAC3F,gEAAgE,kCAAmB;AACnF,kEAAkE,kCAAmB;AACrF,wEAAwE,kCAAmB;AAC3F,wEAAwE,kCAAmB;AAC3F,0EAA0E,kCAAmB;AAC7F,2EAA2E,kCAAmB;AAC9F,0EAA0E,kCAAmB;AAC7F,sFAAsF,kCAAmB;AACzG,yEAAyE,kCAAmB;AAC5F,gEAAgE,kCAAmB;AACnF,yEAAyE,kCAAmB;AAC5F,2EAA2E,kCAAmB;AAC9F,6EAA6E,kCAAmB;AAChG,+EAA+E,kCAAmB;AAClG,8EAA8E,kCAAmB;AACjG,oFAAoF,kCAAmB;AACvG,qFAAqF,kCAAmB;AACxG,mFAAmF,kCAAmB;AACtG,iFAAiF,kCAAmB;AACpG,8EAA8E,kCAAmB;AACjG,4EAA4E,kCAAmB;AAC/F,6EAA6E,kCAAmB;AAChG,wEAAwE,kCAAmB;AAC3F,yEAAyE,kCAAmB;AAC5F,0EAA0E,kCAAmB;AAC7F,4EAA4E,kCAAmB;AAC/F,qEAAqE,kCAAmB;AACxF,uEAAuE,kCAAmB;AAC1F,0EAA0E,kCAAmB;AAC7F,wEAAwE,kCAAmB;AAC3F,+EAA+E,kCAAmB;AAClG,0EAA0E,kCAAmB;AAC7F,mEAAmE,kCAAmB;AACtF,oEAAoE,kCAAmB;AACvF,mEAAmE,kCAAmB;AACtF,qEAAqE,kCAAmB;AACxF,wEAAwE,kCAAmB;AAC3F,uEAAuE,kCAAmB;AAC1F,4EAA4E,kCAAmB;AAC/F,sEAAsE,kCAAmB;AACzF,yEAAyE,kCAAmB;AAC5F,yEAAyE,kCAAmB;AAC5F,sEAAsE,kCAAmB;AACzF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA;;;;;;;;;;;;;;;;;;AAkBA;;;;;;;;;;;;;;;;;;;AAmBA;AACA;AACA,YAAY;AACZ;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iFAAiF;;AAEjF,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iFAAiF;;AAEjF,OAAO;;AAEP,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,kBAAkB,kCAAmB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE,kCAAmB;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,kCAAmB;AAC7B;AACA;AACA;AACA,WAAW,kCAAmB,aAAa,WAAW;AACtD;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU,kCAAmB;AAC7B;AACA,eAAe,kCAAmB,wBAAwB,kCAAmB;AAC7E,mDAAmD,wCAAwC;AAC3F;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU,kCAAmB;AAC7B,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU,kCAAmB;AAC7B;AACA,iEAAiE,iBAAiB;AAClF;AACA,0DAA0D,aAAa;AACvE;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,0BAAmB,GAAG,kCAAmB;AACtD,sDAAsD,0BAAmB;AACzE,gDAAgD,0BAAmB;AACnE,8CAA8C,0BAAmB;AACjE,iDAAiD,0BAAmB;AACpE,mDAAmD,0BAAmB;AACtE,mDAAmD,0BAAmB;AACtE,gDAAgD,0BAAmB;AACnE,gDAAgD,0BAAmB;AACnE,wCAAwC,0BAAmB;AAC3D,8CAA8C,0BAAmB;AACjE,2CAA2C,0BAAmB;AAC9D,iDAAiD,0BAAmB;AACpE,+CAA+C,0BAAmB;AAClE,4CAA4C,0BAAmB;AAC/D,qDAAqD,0BAAmB;AACxE,kDAAkD,0BAAmB;AACrE,oDAAoD,0BAAmB;AACvE,+CAA+C,0BAAmB;AAClE,sDAAsD,0BAAmB;AACzE,uCAAuC,0BAAmB;AAC1D,uCAAuC,0BAAmB;AAC1D,4CAA4C,0BAAmB;AAC/D,8CAA8C,0BAAmB;AACjE,wCAAwC,0BAAmB;AAC3D,gDAAgD,0BAAmB;AACnE,8CAA8C,0BAAmB;AACjE,mDAAmD,0BAAmB;AACtE,gDAAgD,0BAAmB;AACnE,0CAA0C,0BAAmB;AAC7D,yCAAyC,0BAAmB;AAC5D,+CAA+C,0BAAmB;AAClE,yCAAyC,0BAAmB;AAC5D,yCAAyC,0BAAmB;AAC5D,iDAAiD,0BAAmB;AACpE,wCAAwC,0BAAmB;AAC3D,uDAAuD,0BAAmB;AAC1E,2CAA2C,0BAAmB;AAC9D,oDAAoD,0BAAmB;AACvE,mDAAmD,0BAAmB;AACtE,oDAAoD,0BAAmB;AACvE,iDAAiD,0BAAmB;AACpE,wDAAwD,0BAAmB;AAC3E,qDAAqD,0BAAmB;AACxE,0DAA0D,0BAAmB;AAC7E,yDAAyD,0BAAmB;AAC5E,sDAAsD,0BAAmB;AACzE,kDAAkD,0BAAmB;AACrE,gDAAgD,0BAAmB;AACnE,wCAAwC,0BAAmB;AAC3D,kDAAkD,0BAAmB;AACrE,qDAAqD,0BAAmB;AACxE,8DAA8D,0BAAmB;AACjF,4CAA4C,0BAAmB;AAC/D,oDAAoD,0BAAmB;AACvE,kDAAkD,0BAAmB;AACrE,yDAAyD,0BAAmB;AAC5E,kDAAkD,0BAAmB;AACrE,mDAAmD,0BAAmB;AACtE,oDAAoD,0BAAmB;AACvE,6CAA6C,0BAAmB;AAChE,4CAA4C,0BAAmB;AAC/D,0CAA0C,0BAAmB;AAC7D,0CAA0C,0BAAmB;AAC7D,kDAAkD,0BAAmB;AACrE,wCAAwC,0BAAmB;AAC3D,8CAA8C,0BAAmB;AACjE,yDAAyD,0BAAmB;AAC5E,8CAA8C,0BAAmB;AACjE,4CAA4C,0BAAmB;AAC/D,0DAA0D,0BAAmB;AAC7E,kEAAkE,0BAAmB;AACrF,gDAAgD,0BAAmB;AACnE,yDAAyD,0BAAmB;AAC5E,kDAAkD,0BAAmB;AACrE,wCAAwC,0BAAmB;AAC3D,2CAA2C,0BAAmB;AAC9D,sCAAsC,0BAAmB;AACzD,4CAA4C,0BAAmB;AAC/D,2CAA2C,0BAAmB;AAC9D,iDAAiD,0BAAmB;AACpE,8CAA8C,0BAAmB;AACjE,8CAA8C,0BAAmB;AACjE,gEAAgE,0BAAmB;AACnF,6CAA6C,0BAAmB;AAChE,yCAAyC,0BAAmB;AAC5D,yCAAyC,0BAAmB;AAC5D,kDAAkD,0BAAmB;AACrE,+CAA+C,0BAAmB;AAClE,yDAAyD,0BAAmB;AAC5E,8CAA8C,0BAAmB;AACjE,yCAAyC,0BAAmB;AAC5D,+CAA+C,0BAAmB;AAClE,oDAAoD,0BAAmB;AACvE,qDAAqD,0BAAmB;AACxE,yCAAyC,0BAAmB;AAC5D,+CAA+C,0BAAmB;AAClE,gDAAgD,0BAAmB;AACnE,+CAA+C,0BAAmB;AAClE,6CAA6C,0BAAmB;AAChE,yCAAyC,0BAAmB;AAC5D,6CAA6C,0BAAmB;AAChE,mEAAmE,0BAAmB;AACtF,gEAAgE,0BAAmB;AACnF,mDAAmD,0BAAmB;AACtE,oDAAoD,0BAAmB;AACvE,uCAAuC,0BAAmB;AAC1D,4CAA4C,0BAAmB;AAC/D,wCAAwC,0BAAmB;AAC3D,wCAAwC,0BAAmB;AAC3D,yCAAyC,0BAAmB;AAC5D,uCAAuC,0BAAmB;AAC1D,4CAA4C,0BAAmB;AAC/D,6CAA6C,0BAAmB;AAChE,4CAA4C,0BAAmB;AAC/D,2CAA2C,0BAAmB;AAC9D,6CAA6C,0BAAmB;AAChE,6CAA6C,0BAAmB;AAChE,yCAAyC,0BAAmB;AAC5D,4CAA4C,0BAAmB;AAC/D,iDAAiD,0BAAmB;AACpE,gDAAgD,0BAAmB;AACnE,0CAA0C,0BAAmB;AAC7D,mDAAmD,0BAAmB;AACtE,qDAAqD,0BAAmB;AACxE,sDAAsD,0BAAmB;AACzE,yDAAyD,0BAAmB;AAC5E,2CAA2C,0BAAmB;AAC9D,mDAAmD,0BAAmB;AACtE,sCAAsC,0BAAmB;AACzD,4CAA4C,0BAAmB;AAC/D,oDAAoD,0BAAmB;AACvE,qDAAqD,0BAAmB;AACxE,sDAAsD,0BAAmB;AACzE,0CAA0C,0BAAmB;AAC7D,oDAAoD,0BAAmB;AACvE,gDAAgD,0BAAmB;AACnE,iDAAiD,0BAAmB;AACpE,oDAAoD,0BAAmB;AACvE,+CAA+C,0BAAmB;AAClE,gDAAgD,0BAAmB;AACnE,8CAA8C,0BAAmB;AACjE,kDAAkD,0BAAmB;AACrE,iDAAiD,0BAAmB;AACpE,8CAA8C,0BAAmB;AACjE,gEAAgE,0BAAmB;AACnF,gDAAgD,0BAAmB;AACnE,kDAAkD,0BAAmB;AACrE,4CAA4C,0BAAmB;AAC/D,8CAA8C,0BAAmB;AACjE,2DAA2D,0BAAmB;AAC9E,wDAAwD,0BAAmB;AAC3E,+CAA+C,0BAAmB;AAClE,gDAAgD,0BAAmB;AACnE,2CAA2C,0BAAmB;AAC9D,2CAA2C,0BAAmB;AAC9D,uCAAuC,0BAAmB;AAC1D,4CAA4C,0BAAmB;AAC/D,wCAAwC,0BAAmB;AAC3D,4DAA4D,0BAAmB;AAC/E,uCAAuC,0BAAmB;AAC1D,8CAA8C,0BAAmB;AACjE,yCAAyC,0BAAmB;AAC5D,+CAA+C,0BAAmB;AAClE,gEAAgE,0BAAmB;AACnF,4DAA4D,0BAAmB;AAC/E,2CAA2C,0BAAmB;AAC9D,yCAAyC,0BAAmB;AAC5D,2CAA2C,0BAAmB;AAC9D,yCAAyC,0BAAmB;AAC5D,kDAAkD,0BAAmB;AACrE,6CAA6C,0BAAmB;AAChE,uCAAuC,0BAAmB;AAC1D,kDAAkD,0BAAmB;AACrE,+CAA+C,0BAAmB;AAClE,yCAAyC,0BAAmB;AAC5D,oDAAoD,0BAAmB;AACvE,yCAAyC,0BAAmB;AAC5D,oDAAoD,0BAAmB;AACvE,sDAAsD,0BAAmB;AACzE,mDAAmD,0BAAmB;AACtE,4DAA4D,0BAAmB;AAC/E,4CAA4C,0BAAmB;AAC/D,mDAAmD,0BAAmB;AACtE,uCAAuC,0BAAmB;AAC1D,6CAA6C,0BAAmB;AAChE,kDAAkD,0BAAmB;AACrE,uCAAuC,0BAAmB;AAC1D,oDAAoD,0BAAmB;AACvE,kDAAkD,0BAAmB;AACrE,2CAA2C,0BAAmB;AAC9D,kDAAkD,0BAAmB;AACrE,mDAAmD,0BAAmB;AACtE,oDAAoD,0BAAmB;AACvE,+CAA+C,0BAAmB;AAClE,+CAA+C,0BAAmB;AAClE,qDAAqD,0BAAmB;AACxE,gDAAgD,0BAAmB;AACnE,mDAAmD,0BAAmB;AACtE,+CAA+C,0BAAmB;AAClE,uDAAuD,0BAAmB;AAC1E,+CAA+C,0BAAmB;AAClE,gDAAgD,0BAAmB;AACnE,8CAA8C,0BAAmB;AACjE,0CAA0C,0BAAmB;AAC7D,kDAAkD,0BAAmB;AACrE,uCAAuC,0BAAmB;AAC1D,qDAAqD,0BAAmB;AACxE,qDAAqD,0BAAmB;AACxE,gDAAgD,0BAAmB;AACnE,iDAAiD,0BAAmB;AACpE,gDAAgD,0BAAmB;AACnE,yDAAyD,0BAAmB;AAC5E,kDAAkD,0BAAmB;AACrE,oDAAoD,0BAAmB;AACvE,oDAAoD,0BAAmB;AACvE,+CAA+C,0BAAmB;AAClE,gDAAgD,0BAAmB;AACnE,+CAA+C,0BAAmB;AAClE,+CAA+C,0BAAmB;AAClE,wDAAwD,0BAAmB;AAC3E,iDAAiD,0BAAmB;AACpE,6CAA6C,0BAAmB;AAChE,kDAAkD,0BAAmB;AACrE,2CAA2C,0BAAmB;AAC9D,wCAAwC,0BAAmB;AAC3D,+CAA+C,0BAAmB;AAClE,4DAA4D,0BAAmB;AAC/E,yCAAyC,0BAAmB;AAC5D,yCAAyC,0BAAmB;AAC5D,sCAAsC,0BAAmB;AACzD,kDAAkD,0BAAmB;AACrE,4CAA4C,0BAAmB;AAC/D,8CAA8C,0BAAmB;AACjE,mDAAmD,0BAAmB;AACtE,yCAAyC,0BAAmB;AAC5D,gDAAgD,0BAAmB;AACnE,6CAA6C,0BAAmB;AAChE,2CAA2C,0BAAmB;AAC9D,iDAAiD,0BAAmB;AACpE,2CAA2C,0BAAmB;AAC9D,sDAAsD,0BAAmB;AACzE,2CAA2C,0BAAmB;AAC9D,sDAAsD,0BAAmB;AACzE,+CAA+C,0BAAmB;AAClE,0CAA0C,0BAAmB;AAC7D,qDAAqD,0BAAmB;AACxE,0CAA0C,0BAAmB;AAC7D,qDAAqD,0BAAmB;AACxE,wCAAwC,0BAAmB;AAC3D,8CAA8C,0BAAmB;AACjE,yCAAyC,0BAAmB;AAC5D,iDAAiD,0BAAmB;AACpE,gDAAgD,0BAAmB;AACnE,+CAA+C,0BAAmB;AAClE,+CAA+C,0BAAmB;AAClE,uDAAuD,0BAAmB;AAC1E,4CAA4C,0BAAmB;AAC/D,iDAAiD,0BAAmB;AACpE,iDAAiD,0BAAmB;AACpE,yCAAyC,0BAAmB;AAC5D,wCAAwC,0BAAmB;AAC3D,uCAAuC,0BAAmB;AAC1D,wCAAwC,0BAAmB;AAC3D,iDAAiD,0BAAmB;AACpE,wCAAwC,0BAAmB;AAC3D,8CAA8C,0BAAmB;AACjE,iDAAiD,0BAAmB;AACpE,mEAAmE,0BAAmB;AACtF,2DAA2D,0BAAmB;AAC9E,yCAAyC,0BAAmB;AAC5D,6CAA6C,0BAAmB;AAChE,8CAA8C,0BAAmB;AACjE,gDAAgD,0BAAmB;AACnE,+CAA+C,0BAAmB;AAClE,oDAAoD,0BAAmB;AACvE,yCAAyC,0BAAmB;AAC5D,yCAAyC,0BAAmB;AAC5D,gDAAgD,0BAAmB;AACnE,iDAAiD,0BAAmB;AACpE,6CAA6C,0BAAmB;AAChE,2CAA2C,0BAAmB;AAC9D,4CAA4C,0BAAmB;AAC/D,uCAAuC,0BAAmB;AAC1D,4CAA4C,0BAAmB;AAC/D,gDAAgD,0BAAmB;AACnE,uCAAuC,0BAAmB;AAC1D,0CAA0C,0BAAmB;AAC7D,gDAAgD,0BAAmB;AACnE,iDAAiD,0BAAmB;AACpE,8CAA8C,0BAAmB;AACjE,wCAAwC,0BAAmB;AAC3D,0CAA0C,0BAAmB;AAC7D,4CAA4C,0BAAmB;AAC/D,qDAAqD,0BAAmB;AACxE,6CAA6C,0BAAmB;AAChE,2CAA2C,0BAAmB;AAC9D,0CAA0C,0BAAmB;AAC7D,gDAAgD,0BAAmB;AACnE,wCAAwC,0BAAmB;AAC3D,uCAAuC,0BAAmB;AAC1D,yCAAyC,0BAAmB;AAC5D,6CAA6C,0BAAmB;AAChE,+CAA+C,0BAAmB;AAClE,+CAA+C,0BAAmB;AAClE,gDAAgD,0BAAmB;AACnE,+CAA+C,0BAAmB;AAClE,2CAA2C,0BAAmB;AAC9D,mDAAmD,0BAAmB;AACtE,iDAAiD,0BAAmB;AACpE,6CAA6C,0BAAmB;AAChE,wCAAwC,0BAAmB;AAC3D,qDAAqD,0BAAmB;AACxE,yCAAyC,0BAAmB;AAC5D,oDAAoD,0BAAmB;AACvE,wCAAwC,0BAAmB;AAC3D,4CAA4C,0BAAmB;AAC/D,2CAA2C,0BAAmB;AAC9D,uCAAuC,0BAAmB;AAC1D,0DAA0D,0BAAmB;AAC7E,kDAAkD,0BAAmB;AACrE,2CAA2C,0BAAmB;AAC9D,kDAAkD,0BAAmB;AACrE,kDAAkD,0BAAmB;AACrE,iDAAiD,0BAAmB;AACpE,8CAA8C,0BAAmB;AACjE,8CAA8C,0BAAmB;AACjE,6CAA6C,0BAAmB;AAChE,0CAA0C,0BAAmB;AAC7D,iDAAiD,0BAAmB;AACpE,iDAAiD,0BAAmB;AACpE,gDAAgD,0BAAmB;AACnE,6CAA6C,0BAAmB;AAChE,8CAA8C,0BAAmB;AACjE,oDAAoD,0BAAmB;AACvE,0CAA0C,0BAAmB;AAC7D,mDAAmD,0BAAmB;AACtE,kDAAkD,0BAAmB;AACrE,sDAAsD,0BAAmB;AACzE,kDAAkD,0BAAmB;AACrE,kDAAkD,0BAAmB;AACrE,qDAAqD,0BAAmB;AACxE,oDAAoD,0BAAmB;AACvE,oDAAoD,0BAAmB;AACvE,mDAAmD,0BAAmB;AACtE,mDAAmD,0BAAmB;AACtE,qDAAqD,0BAAmB;AACxE,kDAAkD,0BAAmB;AACrE,sDAAsD,0BAAmB;AACzE,uCAAuC,0BAAmB;AAC1D,4CAA4C,0BAAmB;AAC/D,6CAA6C,0BAAmB;AAChE,8CAA8C,0BAAmB;AACjE,+CAA+C,0BAAmB;AAClE,2CAA2C,0BAAmB;AAC9D,sDAAsD,0BAAmB;AACzE,qDAAqD,0BAAmB;AACxE,mDAAmD,0BAAmB;AACtE,gDAAgD,0BAAmB;AACnE,mDAAmD,0BAAmB;AACtE,wCAAwC,0BAAmB;AAC3D,wCAAwC,0BAAmB;AAC3D,8CAA8C,0BAAmB;AACjE,uDAAuD,0BAAmB;AAC1E,uCAAuC,0BAAmB;AAC1D,4CAA4C,0BAAmB;AAC/D,4CAA4C,0BAAmB;AAC/D,sCAAsC,0BAAmB;AACzD,wCAAwC,0BAAmB;AAC3D,SAAi5jB;AACj5jB;;AAEA;;;;;;;;;;;;;;ACv4xCO,MAAM,MAAM,GAAG;IAClB,WAAW,EAAE,EAAE,GAAC,CAAC,EAAE,aAAa;IAChC,gBAAgB,EAAE,GAAG,EAAE,KAAK;CAC/B;;;;;;;;;;;;;;;;;;ACH+B;AACQ;AACN;AAE3B,MAAM,MAAO,SAAQ,4CAAQ;IAChC,YAAY,IAAkB;QAC1B,KAAK,CAAC;YACF,GAAG,IAAI;YACP,aAAa,EAAE,oDAAgB,CAAC,MAAM;SACzC,CAAC;IACN,CAAC;IAED,YAAY,CAAC,MAAiB;QAC1B,MAAM,iBAAiB,GAAG,kDAAc,CAAC,eAAe,CAAC;YACrD,KAAK,EAAE,iDAAS,CAAC,kBAAoC;YACrD,IAAI,EAAE;gBACF,WAAW,EAAE,EAAE;gBACf,YAAY,EAAE,EAAE;gBAChB,IAAI,EAAE,CAAC;gBACP,OAAO,EAAE,CAAC;aACb;SACJ,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,IAAI,gDAAY,CAAC;YAC9B,MAAM,EAAE;gBACJ,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;gBAC5F,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;gBAC5F,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;gBAC5F,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;aAC/F;SACJ,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAEzC,MAAM,SAAS,GAAG,IAAI,gDAAY,CAAC;YAC/B,MAAM,EAAE;gBACJ,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;gBAC5F,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;gBAC5F,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;gBAC5F,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;aAC/F;SACJ,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QAG3C,MAAM,MAAM,GAAG,IAAI,gDAAY,CAAC;YAC5B,MAAM,EAAE;gBACJ,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;gBAC5F,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;gBAC5F,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;gBAC5F,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;aAC/F;SACJ,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAErC,MAAM,QAAQ,GAAG,IAAI,gDAAY,CAAC;YAC9B,MAAM,EAAE;gBACJ,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;gBAC5F,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;gBAC5F,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;gBAC5F,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;aAC/F;SACJ,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAEzC,MAAM,QAAQ,GAAG,IAAI,gDAAY,CAAC;YAC9B,MAAM,EAAE;gBACJ,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;gBAC5F,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;gBAC5F,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;gBAC5F,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;aAC/F;SACJ,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAEzC,MAAM,SAAS,GAAG,IAAI,gDAAY,CAAC;YAC/B,MAAM,EAAE;gBACJ,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;gBAC5F,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;gBAC5F,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;gBAC5F,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;aAC/F;SACJ,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QAE3C,MAAM,MAAM,GAAG,IAAI,gDAAY,CAAC;YAC5B,MAAM,EAAE;gBACJ,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;gBAC5F,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;gBAC5F,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;gBAC5F,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;aAC/F;SACJ,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAErC,MAAM,QAAQ,GAAG,IAAI,gDAAY,CAAC;YAC9B,MAAM,EAAE;gBACJ,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;gBAC5F,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;gBAC5F,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;gBAC5F,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;aAC/F;SACJ,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAC7C,CAAC;IAED,WAAW,CAAC,MAAiB,EAAE,SAAiB;QAC5C,IAAI,CAAC,GAAG,GAAG,6CAAS,CAAC,IAAI,CAAC;QAE1B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC/B,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,2CAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YACnD,IAAI,CAAC,GAAG,GAAG,0CAAM,CAAC,2CAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;YACzC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACpC,CAAC;QACD,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,2CAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YAClD,IAAI,CAAC,GAAG,GAAG,0CAAM,CAAC,CAAC,2CAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;YAC1C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACnC,CAAC;QACD,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,2CAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAChD,IAAI,CAAC,GAAG,GAAG,0CAAM,CAAC,CAAC,EAAE,CAAC,2CAAM,CAAC,WAAW,CAAC,CAAC;YAC1C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACjC,CAAC;QACD,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,2CAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YAClD,IAAI,CAAC,GAAG,GAAG,0CAAM,CAAC,CAAC,EAAE,2CAAM,CAAC,WAAW,CAAC,CAAC;YACzC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACnC,CAAC;IAEL,CAAC;CACJ;;;;;;;;;;;;;;;;;;AC/H+D;AACjB;AAExC,MAAM,SAAS,GAAG;IACrB,kBAAkB,EAAE,IAAI,kDAAW,CAAC,qFAAqF,CAAC;IAC1H,YAAY,EAAE,IAAI,yDAAY,CAAC,wCAAwC,EAAE;QACrE,wBAAwB,EAAE,IAAI;QAC9B,qBAAqB,EAAE,IAAI;KAC9B,CAAC;IACF,YAAY,EAAE,IAAI,yDAAY,CAAC,0BAA0B,EAAE;QACvD,qBAAqB,EAAE,IAAI;KAC9B,CAAC;IACF,gBAAgB,EAAE,IAAI,yDAAY,CAAC,oBAAoB,EAAE;QACrD,qBAAqB,EAAE,IAAI;KAC9B,CAAC;CACI,CAAC;AAGJ,MAAM,MAAM,GAAG,IAAI,6CAAM,EAAE,CAAC;AACnC,KAAK,IAAI,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;IAC5C,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;AACjC,CAAC;;;;;;;;;;;;;;;;ACrBsD;AAKhD,MAAM,WAAW;IAMpB,YAAY,KAAY,EAAkB,SAA4B,EAAU,QAAsB,EAAkB,KAAa;;QAA3F,cAAS,GAAT,SAAS,CAAmB;QAAU,aAAQ,GAAR,QAAQ,CAAc;QAAkB,UAAK,GAAL,KAAK,CAAQ;QAH9H,aAAQ,GAAa,EAAE,CAAC;QACxB,iBAAY,GAAG,IAAI,GAAG,EAA8B,CAAC;QACrD,iBAAY,GAAG,IAAI,GAAG,EAA8B,CAAC;QAExD,IAAI,CAAC,QAAQ,GAAG,8CAAG,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACpE,IAAI,CAAC,MAAM,GAAG,8CAAG,CAAC,SAAS,CAAC,gBAAgB,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC1E,IAAI,SAAS,CAAC,eAAe,EAAE,CAAC;YAC5B,KAAK,IAAI,MAAM,IAAI,SAAS,CAAC,eAAe,EAAE,CAAC;gBAC3C,MAAM,cAAc,GAAG,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;oBACnE,OAAO,CAAC,CAAC,UAAU,KAAK,MAAM,CAAC,YAAY;gBAC/C,CAAC,CAAC,CAAC;gBAEH,IAAI,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;oBAC9C,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;oBAC5D,IAAI,OAAO,EAAE,CAAC;wBACV,MAAM,SAAS,GAAG,OAAO,CAAC;4BACtB,IAAI,EAAE,MAAM,CAAC,YAAY;4BACzB,QAAQ,EAAE,8CAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;4BAC7E,MAAM;4BACN,UAAU,EAAE,cAAc;4BAC1B,KAAK,EAAE,IAAI;yBACd,CAAC,CAAC;wBACH,IAAI,SAAS,EAAE,CAAC;4BACZ,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;4BAC9B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;4BACzC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;wBAC7C,CAAC;oBACL,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACJ,MAAM,KAAK,GAAG,IAAI,4CAAK,CAAC;wBACpB,IAAI,EAAE,MAAM,CAAC,YAAY;wBACzB,GAAG,EAAE,8CAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;wBACxE,KAAK,EAAE,MAAM,CAAC,KAAK;wBACnB,MAAM,EAAE,MAAM,CAAC,MAAM;wBACrB,MAAM,EAAE,8CAAG,CAAC,oBAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,MAAM,mCAAI,CAAC,EAAE,oBAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,MAAM,mCAAI,CAAC,CAAC;wBACrE,CAAC,EAAE,KAAK;qBACX,CAAC,CAAC;oBACH,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;wBAChB,MAAM,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;wBAC3D,IAAI,EAAE,EAAE,CAAC;4BACL,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;4BAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;4BAC/D,MAAM,MAAM,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;4BAC5D,IAAI,MAAM,EAAE,CAAC;gCACT,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;4BAC/B,CAAC;wBACL,CAAC;oBACL,CAAC;oBACD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAC1B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;oBACrC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBACzC,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAED,YAAY;QACR,KAAK,IAAI,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,CAAC;YAChD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YAEjE,IAAI,CAAC,OAAO,EAAE,CAAC;gBAAC,SAAQ;YAAC,CAAC;YAE1B,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;gBACxE,OAAO,CAAC,CAAC,UAAU,KAAK,MAAM,CAAC,YAAY;YAC/C,CAAC,CAAC,CAAC;YAEH,MAAM,SAAS,GAAG,OAAO,CAAC;gBACtB,IAAI,EAAE,MAAM,CAAC,YAAY;gBACzB,QAAQ,EAAE,8CAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC7E,MAAM;gBACN,UAAU,EAAE,cAAc;gBAC1B,KAAK,EAAE,IAAI;aACd,CAAC,CAAC;YAEH,IAAI,SAAS,EAAE,CAAC;gBACZ,uFAAuF;gBACvF,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAClD,IAAI,WAAW,EAAE,CAAC;oBACd,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;oBACjD,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;wBACb,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;wBAC/B,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;wBACjC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;oBAC1C,CAAC;gBACL,CAAC;gBAED,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC9B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;gBACzC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAC7C,CAAC;QACL,CAAC;IACL,CAAC;IAGD,uBAAuB,CAAC,UAAkB;QACtC,MAAM,YAAY,GAAG,IAAI,CAAC,2BAA2B,CAAC,UAAU,CAAC,CAAC;QAClE,IAAI,OAAO,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAC9B,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAChD,IAAI,WAAW,EAAE,CAAC;gBACd,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC9B,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,kBAAkB,CAAC,eAAuB,EAAE,KAAW;QACnD,MAAM,YAAY,GAAG,IAAI,CAAC,sBAAsB,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;QACzE,IAAI,OAAO,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAC9B,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAChD,IAAI,WAAW,EAAE,CAAC;gBACd,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC9B,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;;OAIG;IACH,2BAA2B,CAAC,UAAkB;QAC1C,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,iBAAiB,EAAE,KAAK,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;IACvH,CAAC;IAED;;;;OAIG;IACH,sBAAsB,CAAC,eAAuB,EAAE,KAAW;QACvD,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;YAC7C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACtB,IAAI,eAAe,GAAG,KAAK,CAAC;gBAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;oBAC5B,eAAe,GAAG,KAAK,CAAC,iBAAiB,EAAE,CAAC;gBAChD,CAAC;gBAED,MAAM,KAAK,GAAG,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,iBAAiB,EAAE,KAAK,eAAe,CAAC,iBAAiB,EAAE,CAAC,CAAC;gBACrH,IAAI,KAAK,EAAE,CAAC;oBACR,OAAO,KAAK,CAAC,OAAO,KAAK,eAAe,CAAC;gBAC7C,CAAC;gBACD,OAAO,KAAK,CAAC;YACjB,CAAC;iBAAM,CAAC;gBACJ,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,iBAAiB,EAAE,KAAK,eAAe,CAAC,iBAAiB,EAAE,CAAC,CAAC;YACpH,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;CACJ;;;;;;;;;;;;;;;AC1JM,MAAM,WAAW,GAAe,KAAK,EAAE,IAAY,EAAE,WAA2B,EAAE,EAAE;IACxF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,QAAO,WAAW,CAAC,WAAW,EAAE,EAAE,CAAC;QAChC,KAAK,KAAK,CAAC,CAAC,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACzC,KAAK,MAAM,CAAC,CAAC,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC1C,OAAO,CAAC,CAAC,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACzC,CAAC;AACJ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACV+B;AACD;AACD;AACE;AACC;AACT;AACO;AACH;AACC;AACH;AACF;;;;;;;;;;;;;;;;ACX4C;AAM7D,MAAM,YAAY;IAQrB,YAAY,KAAY,EAAE,SAA4B,EAAE,QAAsB,EAAkB,KAAa;;QAAb,UAAK,GAAL,KAAK,CAAQ;QACzG,IAAI,CAAC,QAAQ,GAAG,8CAAG,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACpE,IAAI,CAAC,MAAM,GAAG,8CAAG,CAAC,SAAS,CAAC,gBAAgB,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC1E,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,IAAI,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;YAEjE,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC;YAC9B,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC;YACjC,IAAI,CAAC,OAAO,GAAG,IAAI,8CAAO,CAAC;gBACvB,IAAI,EAAE,SAAS,CAAC,YAAY;gBAC5B,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;gBACnC,SAAS,EAAE,SAAS,CAAC,UAAU;gBAC/B,UAAU,EAAE,SAAS,CAAC,UAAU;gBAChC,IAAI;gBACJ,OAAO;aACV,CAAC,CAAC;YACH,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC;YACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,wDAAiB,CAAC,CAAC;YACrD,QAAQ,CAAC,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC;YAEvC,4BAA4B;YAC5B,MAAM,aAAa,GAAG,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;gBAChE,OAAO,SAAS,CAAC,YAAY,KAAK,CAAC,CAAC,UAAU,CAAC;YACnD,CAAC,CAAC,CAAC;YAEH,IAAI,aAAa,EAAE,CAAC;gBAChB,MAAM,UAAU,GAAG,aAAa,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;;oBACtD,OAAO,UAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,UAAU,0CAAE,iBAAiB,EAAE,MAAK,OAAO,CAAC;gBAC5D,CAAC,CAAC,CAAC;gBAEH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACnD,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC;oBAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC;oBACvC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;oBAClD,IAAI,UAAU,IAAI,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,KAAK,EAAE,CAAC;wBAC7D,IAAK,CAAC,KAAK,GAAG,IAAI,CAAC;oBACvB,CAAC;oBAED,8EAA8E;oBAC9E,IAAI,CAAC,UAAU,IAAI,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;wBAC/C,IAAK,CAAC,KAAK,GAAG,IAAI,CAAC;oBACvB,CAAC;gBACL,CAAC;gBAED,IAAI,SAAS,CAAC,eAAe,EAAE,CAAC;oBAC5B,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;oBAChE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;wBACvD,MAAM,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;wBACzC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;wBAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;wBAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;wBACpD,IAAI,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;4BACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,UAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,mCAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,GAAG,CAAC,UAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,mCAAI,CAAC,CAAC,CAAC,CAAC,CAAC;4BACzK,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,UAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,mCAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,GAAG,CAAC,UAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,mCAAI,CAAC,CAAC,CAAC,CAAC,CAAC;4BACzK,uBAAuB;4BACvB,uBAAuB;4BACvB,kFAAkF;4BAClF,MAAM,cAAc,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;4BACzC,MAAM,YAAY,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;4BACvC,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;4BACpE,IAAI,cAAc,IAAI,YAAY,EAAE,CAAC;gCACjC,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;gCACxB,MAAM,CAAC,cAAc,GAAG,cAAc,CAAC;gCACvC,MAAM,CAAC,YAAY,GAAG,YAAY,CAAC;4BACvC,CAAC;4BACD,IAAI,MAAM,EAAE,CAAC;gCACT,MAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;4BAC/B,CAAC;iCAAM,CAAC;gCACJ,OAAO,CAAC,KAAK,CAAC,8CAA8C,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;4BACtF,CAAC;wBACL,CAAC;oBACL,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;CACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;AC1FwC;AACiB;AACF;AACgC;AAC7C;AACE;AACkE;AAC9D;AACb;AACJ;AACa;AACE;AAmIxC,MAAM,YAAY;IAyBrB,YAA4B,IAAY,EAAE,OAA6B;QAA3C,SAAI,GAAJ,IAAI,CAAQ;QAnBjC,aAAQ,GAAG,IAAI,GAAG,EAAmB,CAAC;QACtC,WAAM,GAAG,IAAI,GAAG,EAAiB,CAAC;QAClC,iBAAY,GAAG,IAAI,GAAG,EAAiB,CAAC;QACxC,cAAS,GAAG,IAAI,GAAG,EAAuD,CAAC;QAC3E,eAAU,GAAe,qDAAW,CAAC;QAGpC,iBAAY,GAAG,IAAI,sDAAW,CAAC,mDAAW,CAAC,CAAC;QAC5C,iBAAY,GAAG,IAAI,sDAAW,CAAC,0DAAa,CAAC,CAAC;QAGtC,gBAAW,GAAW,CAAC,CAAC;QACxB,gBAAW,GAAW,CAAC,CAAC;QACxB,uBAAkB,GAAY,IAAI,CAAC;QACnC,0BAAqB,GAAY,KAAK,CAAC;QACvC,6BAAwB,GAAY,KAAK,CAAC;QAC1C,aAAQ,GAAY,KAAK,CAAC;QAC1B,WAAM,GAAY,IAAI,CAAC;QAGnC,MAAM,EACF,kBAAkB,EAClB,wBAAwB,EACxB,yBAAyB,EACzB,OAAO,EACP,qBAAqB,EACrB,UAAU,EACV,MAAM,EACN,QAAQ,EACR,WAAW,EACd,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,IAAI,CAAC,MAAM,CAAC;QACpC,IAAI,CAAC,QAAQ,GAAG,QAAQ,aAAR,QAAQ,cAAR,QAAQ,GAAI,IAAI,CAAC,QAAQ,CAAC;QAC1C,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,aAAlB,kBAAkB,cAAlB,kBAAkB,GAAI,IAAI,CAAC,kBAAkB,CAAC;QACxE,IAAI,CAAC,wBAAwB,GAAG,wBAAwB,aAAxB,wBAAwB,cAAxB,wBAAwB,GAAI,IAAI,CAAC,wBAAwB,CAAC;QAC1F,IAAI,CAAC,qBAAqB,GAAG,qBAAqB,aAArB,qBAAqB,cAArB,qBAAqB,GAAI,IAAI,CAAC,qBAAqB,CAAC;QACjF,IAAI,CAAC,WAAW,GAAG,WAAW,aAAX,WAAW,cAAX,WAAW,GAAI,IAAI,CAAC,WAAW,CAAC;QACnD,IAAI,CAAC,UAAU,GAAG,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,IAAI,CAAC,UAAU,CAAC;QAChD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,KAAK,MAAM,GAAG,IAAI,yBAAyB,EAAE,CAAC;YAC1C,IAAI,CAAC,+BAA+B,CAAC,GAAG,EAAE,yBAAyB,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9E,CAAC;IAEL,CAAC;IACD,KAAK,CAAC,IAAI;;QACN,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACtD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,IAAI,CAAC;gBACD,IAAI,CAAC,eAAe,GAAG,uDAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3D,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,OAAO,CAAC,KAAK,CAAC,0CAA0C,IAAI,CAAC,IAAI,2FAA2F,CAAC,CAAC;gBAC9J,OAAO,CAAC,KAAK,CAAC,oEAAoE,CAAC;gBACnF,MAAM,CAAC,CAAC;YACZ,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,eAAe,GAAG,IAA2B,CAAC;QACvD,CAAC;QAED,IAAI,0DAAO,CAAC,YAAY,CAAC,oBAAoB,EAAE,UAAI,CAAC,eAAe,CAAC,WAAW,mCAAI,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC;YAC/F,OAAO,CAAC,IAAI,CAAC,iDAAiD,YAAY,CAAC,oBAAoB,uCAAuC,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC;QAC7K,CAAC;QAED,2BAA2B;QAC3B,oBAAoB;QACpB,MAAM,YAAY,GAAgC,EAAE,CAAC;QACrD,KAAK,IAAI,OAAO,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACrD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBAClB,MAAM,SAAS,GAAG,8DAAkB,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC/E,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;gBACpD,MAAM,eAAe,GAAG,IAAI,6CAAO,CAAC;oBAChC,KAAK;oBACL,WAAW,EAAE,OAAO;iBACvB,CAAC,CAAC;gBACH,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;YACpD,CAAC;iBAAM,CAAC;gBACJ,IAAI,OAAO,CAAC,UAAU,KAAK,gBAAgB,EAAE,CAAC;oBAC1C,OAAO,CAAC,IAAI,CAAC,iCAAiC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;gBACxE,CAAC;YACL,CAAC;QACL,CAAC;QAED,6BAA6B;QAC7B,0BAA0B;QAC1B,KAAK,IAAI,KAAK,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC;YAC5C,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;gBACxB,kBAAkB;gBAClB,MAAM,SAAS,GAAG,8DAAkB,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,eAAe,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;gBACrF,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,EAAE;oBACxC,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,UAAU,EAAE,IAAI,CAAC,UAAU;oBAC3B,WAAW,EAAE,IAAI,CAAC,YAAY;oBAC9B,OAAO,EAAE,IAAI,CAAC,OAAO;iBACxB,CAAC,CAAC;YACP,CAAC;iBAAM,CAAC;gBACJ,kBAAkB;gBAClB,MAAM,aAAa,GAAG,IAAI,yCAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;gBAC7C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;gBAC1C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,aAAa,CAAC,CAAC;YACzE,CAAC;QACL,CAAC;QAED,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACxE,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACvC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACtD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACrF,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC;IAC5C,CAAC;IAAA,CAAC;IAEF,QAAQ;QACJ,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,+BAA+B,CAAC,oBAA4B,EAAE,OAAoD;QAC9G,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;IAED,iCAAiC,CAAC,SAAsE;QACpG,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;YAC1B,IAAI,CAAC,+BAA+B,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9D,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,QAAQ,CAAC,UAAkB;QACvB,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED;;;OAGG;IACH,eAAe,CAAC,eAAwB;QACpC,IAAI,OAAO,GAAkB,EAAE,CAAC;QAChC,IAAI,eAAe,EAAE,CAAC;YAClB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;YAC7C,IAAI,KAAK,EAAE,CAAC;gBACR,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBAC7B,IAAI,KAAK,YAAY,sDAAW,EAAE,CAAC;wBAC/B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACxB,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;gBACvC,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBAC7B,IAAI,KAAK,YAAY,sDAAW,EAAE,CAAC;wBAC/B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACxB,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;QAED,OAAO,OAAO;IAClB,CAAC;IAED,aAAa,CAAC,UAAmB;QAC7B,IAAI,OAAO,GAAgB,EAAE,CAAC;QAC9B,IAAI,UAAU,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YACxC,IAAI,KAAK,EAAE,CAAC;gBACR,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBAC7B,IAAI,KAAK,YAAY,kDAAS,EAAE,CAAC;wBAC7B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACxB,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;gBACvC,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBAC7B,IAAI,KAAK,YAAY,kDAAS,EAAE,CAAC;wBAC7B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACxB,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,gBAAgB,CAAC,UAAmB;QAChC,IAAI,OAAO,GAAmB,EAAE,CAAC;QACjC,IAAI,UAAU,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YACxC,IAAI,KAAK,EAAE,CAAC;gBACR,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBAC7B,IAAI,KAAK,YAAY,wDAAY,EAAE,CAAC;wBAChC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACxB,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;gBACvC,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBAC7B,IAAI,KAAK,YAAY,wDAAY,EAAE,CAAC;wBAChC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACxB,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;;OAIG;IACH,2BAA2B,CAAC,UAAkB,EAAE,MAAiB;QAC7D,IAAI,OAAO,GAAyB,EAAE,CAAC;QACvC,MAAM,cAAc,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACnG,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAC3C,KAAK,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;gBACvB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,CAAC,UAAU,CAAC,CAAC,CAAC;YAC5E,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;;OAIG;IACH,sBAAsB,CAAC,eAAuB,EAAE,KAAW,EAAE,MAAiB;QAC1E,IAAI,OAAO,GAAyB,EAAE,CAAC;QACvC,MAAM,cAAc,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACnG,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAC3C,KAAK,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;gBACvB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC,CAAC;YACnF,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;;OAIG;IACH,uBAAuB,CAAC,UAAkB,EAAE,MAAiB;QACzD,IAAI,OAAO,GAAkB,EAAE,CAAC;QAChC,MAAM,cAAc,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACnG,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAC3C,KAAK,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;gBACvB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,UAAU,CAAC,CAAC,CAAC;YACxE,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;;;OAKG;IACH,kBAAkB,CAAC,eAAuB,EAAE,KAAW,EAAE,MAAiB;QACtE,IAAI,OAAO,GAAkB,EAAE,CAAC;QAChC,MAAM,cAAc,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACnG,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAC3C,KAAK,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;gBACvB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC,CAAC;YAC/E,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;OAGG;IACH,cAAc,CAAC,MAAiB;QAC5B,MAAM,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;QACxD,IAAI,MAAM,GAAuB,IAAI,CAAC;QACtC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACvC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC/C,SAAS;YACb,CAAC;YACD,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;YACzE,IAAI,cAAc,EAAE,CAAC;gBACjB,MAAM,UAAU,GAAG,mDAAW,CAAC,aAAa,CACxC,cAAc,CAAC,OAAO,CAAC,SAAS,GAAG,cAAc,CAAC,OAAO,CAAC,OAAO,EACjE,cAAc,CAAC,OAAO,CAAC,UAAU,GAAG,cAAc,CAAC,OAAO,CAAC,IAAI,EAC/D,8CAAM,CAAC,IAAI,EACX,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBAChC,IAAI,CAAC,MAAM,EAAE,CAAC;oBACV,MAAM,GAAG,UAAU,CAAC;gBACxB,CAAC;qBAAM,CAAC;oBACJ,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBACxC,CAAC;YACL,CAAC;QACL,CAAC;QACD,OAAO,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,IAAI,mDAAW,EAAE,CAAC;IACvC,CAAC;IAED,UAAU,CAAC,KAAY,EAAE,OAA2B;;QAChD,MAAM,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,EAAC,GAAG,EAAE,+CAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,GAAG,OAAO,EAAC,CAAC;QAGrF,KAAK,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;YAC5C,IAAI,aAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,WAAW,0CAAE,MAAM,EAAE,CAAC;gBAC/B,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC5D,SAAS;gBACb,CAAC;YACL,CAAC;YACD,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBAC7B,IAAI,KAAK,YAAY,kDAAS,IAAI,KAAK,YAAY,wDAAY,EAAE,CAAC;oBAC9D,KAAK,CAAC,OAAO,CAAC,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBAC/C,IAAI,CAAC,eAAe,EAAE,CAAC;wBACnB,KAAK,CAAC,OAAO,CAAC,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;oBAC9D,CAAC;oBACD,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC;gBAC5B,CAAC;qBAAM,CAAC;oBACJ,KAAK,CAAC,YAAY,EAAE;oBACpB,KAAK,IAAI,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;wBAChC,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,0DAAkB,CAAC,CAAC;wBAC1C,IAAI,EAAE,EAAE,CAAC;4BACL,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;4BACzB,IAAI,CAAC,eAAe,EAAE,CAAC;gCACnB,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;4BACxC,CAAC;wBACL,CAAC;wBACD,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;oBACtB,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;QAED,IAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9D,IAAI,MAAM,EAAE,CAAC;gBACT,KAAK,CAAC,MAAM,CAAC,GAAG,GAAG,+CAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBACnD,MAAM,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,iBAAiB,EAAE,KAAK,MAAM,CAAC,CAAC;gBAC5F,IAAI,IAAI,EAAE,CAAC;oBACP,KAAK,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;gBACtC,CAAC;YACL,CAAC;QACL,CAAC;QAED,IAAI,IAAI,CAAC,wBAAwB,EAAE,CAAC;YAChC,IAAI,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,WAAW,CAAC,CAAC;YACvD,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC7B,KAAK,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC5C,IAAI,aAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,WAAW,0CAAE,MAAM,EAAE,CAAC;oBAC/B,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;wBAC5D,SAAS;oBACb,CAAC;gBACL,CAAC;gBACD,KAAK,CAAC,eAAe,GAAG,KAAK,CAAC,eAAe,CAAC;gBAC9C,MAAM;YACV,CAAC;QACL,CAAC;IAGL,CAAC;;AApXa,iCAAoB,GAAG,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;AC/IC;AAEL;AACW;AACxB;AACI;AAWpC;;GAEG;AACI,MAAM,aAAa;IAMtB,YAA4B,IAAY,EAAkB,QAAsB,EAAE,OAA8B;QAApF,SAAI,GAAJ,IAAI,CAAQ;QAAkB,aAAQ,GAAR,QAAQ,CAAc;QALxE,eAAU,GAAe,qDAAW,CAAC;QAG7B,WAAM,GAAY,IAAI,CAAC;QACvB,aAAQ,GAAY,KAAK,CAAC;QAEtC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;QAC9E,IAAI,CAAC,UAAU,GAAG,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,IAAI,CAAC,UAAU,CAAC;QAChD,IAAI,CAAC,MAAM,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,IAAI,CAAC,MAAM,CAAC;QACpC,IAAI,CAAC,QAAQ,GAAG,QAAQ,aAAR,QAAQ,cAAR,QAAQ,GAAI,IAAI,CAAC,QAAQ,CAAC;QAC1C,IAAI,CAAC,WAAW,GAAG,WAAW,aAAX,WAAW,cAAX,WAAW,GAAI,IAAI,sDAAW,CAAC,kDAAW,CAAC,CAAC;QAC/D,IAAI,CAAC,OAAO,GAAG,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,IAAI,CAAC,OAAO,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,IAAI;QACN,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACtD,IAAI,KAAgB,CAAC;QACrB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,IAAI,CAAC;gBACD,KAAK,GAAG,6CAAS,CAAC,KAAK,CAAC,IAAI,CAAC;YACjC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,OAAO,CAAC,KAAK,CAAC,sCAAsC,IAAI,CAAC,IAAI,iDAAiD,CAAC,CAAC;gBAChH,MAAM,CAAC,CAAC;YACZ,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,KAAK,GAAG,IAAiB,CAAC;QAC9B,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,GAAG,IAAI,yCAAK,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvD,CAAC;IACD,QAAQ;QACJ,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IACvB,CAAC;CAEJ;;;;;;;;;;;;;;;;;;;ACrDiC;AACW;AACE;AAEN;AAGlC,MAAM,KAAK;IAKd,YAAmB,SAAoB,EAAS,QAAsB;;QAAnD,cAAS,GAAT,SAAS,CAAW;QAAS,aAAQ,GAAR,QAAQ,CAAc;QAF/D,WAAM,GAA+C,EAAE,CAAC;QAG3D,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;YACtB,IAAI,CAAC,eAAe,GAAG,4CAAK,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,SAAS,CAAC,cAAc,EAAE,CAAC;YAC3B,IAAI,KAAK,GAAG,QAAQ,CAAC,WAAW,CAAC;YACjC,IAAI,MAAM,GAAG,SAAS,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC;YACxD,KAAK,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;gBACvB,IAAI,YAAK,CAAC,eAAe,0CAAE,MAAM,MAAK,CAAC,EAAE,CAAC;oBACtC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,sDAAW,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;gBACpE,CAAC;gBAED,IAAI,YAAK,CAAC,SAAS,0CAAE,MAAM,MAAK,CAAC,EAAE,CAAC;oBAChC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,kDAAS,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;gBAClE,CAAC;gBAED,mEAAmE;gBACnE,IAAI,YAAK,CAAC,UAAU,0CAAE,MAAM,MAAK,CAAC,IAAI,YAAK,CAAC,cAAc,0CAAE,MAAM,MAAK,CAAC,EAAE,CAAC;oBACvE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,wDAAY,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;gBACrE,CAAC;gBACD,KAAK,EAAE,CAAC;YACZ,CAAC;QACL,CAAC;IACL,CAAC;CACJ;;;;;;;;;;;;;;;AChCA;;GAEG;AACI,MAAM,WAAW;IAIrB,YAA4B,IAA+B;QAA/B,SAAI,GAAJ,IAAI,CAA2B;QAHnD,YAAO,GAAG,KAAK,CAAC;QACxB,UAAK,GAAG,IAAI,GAAG,EAAa,CAAC;IAEgC,CAAC;IAE9D,QAAQ,CAAC,GAAG,IAAW;QACpB,IAAI,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9C,IAAI,QAAQ,EAAE,CAAC;YACZ,OAAO,QAAQ,CAAC;QACnB,CAAC;QAED,QAAQ,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;QACzC,OAAO,QAAQ,CAAC;IACnB,CAAC;IAED,MAAM;QACH,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAChB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1C,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC9E,CAAC;IAED,KAAK,CAAC,IAAI;QACP,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAE1E,qCAAqC;QACrC,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBAChC,OAAO,CAAC,KAAK,CAAC,6BAA6B,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,wDAAwD,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;gBACnI,OAAO,EAAE,CAAC;YACb,CAAC;QACJ,CAAC;QACD,IAAI,OAAO,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,iBAAiB,OAAO,YAAY,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACvB,CAAC;CACH;;;;;;;;;;;;;;;;;;AC7CK,SAAS,gBAAgB,CAAC,SAAiB;IAC/C,MAAM,kBAAkB,GAAG,yCAAyC;IAEpE,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAEpD,IAAI,OAAO,EAAE,CAAC;QACX,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACzB,OAAO,KAAK,CAAC;IAChB,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,wCAAwC,SAAS,EAAE,CAAC,CAAC;AACxE,CAAC;AAEM,SAAS,OAAO,CAAC,SAAiB,EAAE,OAAgB;IAExD,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;QACtC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5B,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5B,OAAO,MAAM,CAAC;YACjB,CAAC;QACJ,CAAC;aAAM,CAAC;YACL,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,KAAK,EAAE,CAAC;gBACT,OAAO,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAAA,CAAC;YAC/C,CAAC;QACJ,CAAC;IACJ,CAAC;IACD,OAAO,SAAS,CAAC;AACpB,CAAC;AAEM,SAAS,SAAS,CAAC,SAAiB,EAAE,OAAiB;IAC3D,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC3B,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;QACtC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5B,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5B,OAAO,IAAI,CAAC;YACf,CAAC;QACJ,CAAC;aAAM,CAAC;YACL,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,KAAK,EAAE,CAAC;gBACT,OAAO,IAAI,CAAC;YACf,CAAC;QACJ,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AAChB,CAAC;AAGM,SAAS,kBAAkB,CAAC,QAAgB,EAAE,cAAsB,EAAE,OAAiB;IAC3F,IAAI,SAAS,CAAC,cAAc,EAAE,OAAO,CAAC,IAAI,OAAO,EAAE,CAAC;QACjD,OAAO,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,iCAAiC;IACjC,IAAI,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,OAAO,cAAc,CAAC;IACzB,CAAC;IAED,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,aAAa,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAChD,0DAA0D;IAC1D,IAAI,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACrD,WAAW,CAAC,GAAG,EAAE,CAAC;IACrB,CAAC;IACD,OAAO,WAAW,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACtD,CAAC;;;;;;;;;;;;;;;;ACrEmE;AAO7D,MAAM,SAAS;IAOlB,YAAY,KAAY,EAAE,SAA4B,EAAE,QAAsB,EAAkB,KAAa;;QAAb,UAAK,GAAL,KAAK,CAAQ;QACzG,IAAI,CAAC,QAAQ,GAAG,8CAAG,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACpE,IAAI,CAAC,MAAM,GAAG,8CAAG,CAAC,SAAS,CAAC,gBAAgB,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC1E,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,8CAAO,CAAC;YACvB,IAAI,EAAE,SAAS,CAAC,YAAY;YAC5B,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;YACnC,SAAS,EAAE,SAAS,CAAC,UAAU;YAC/B,UAAU,EAAE,SAAS,CAAC,UAAU;YAChC,IAAI,EAAE,SAAS,CAAC,MAAM;YACtB,OAAO,EAAE,SAAS,CAAC,MAAM;SAC5B,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,wDAAiB,CAAC,CAAC;QACrD,QAAQ,CAAC,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC;QAGvC,IAAI,SAAS,CAAC,eAAe,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;YAChE,KAAK,IAAI,IAAI,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;gBACnC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;gBAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;gBAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBACpD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;oBACf,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,UAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,mCAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,GAAG,CAAC,UAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,mCAAI,CAAC,CAAC,CAAC,CAAC,CAAC;oBACzK,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,UAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,mCAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,GAAG,CAAC,UAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,mCAAI,CAAC,CAAC,CAAC,CAAC,CAAC;oBACzK,uBAAuB;oBACvB,uBAAuB;oBACvB,kFAAkF;oBAClF,MAAM,cAAc,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;oBACzC,MAAM,YAAY,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;oBACvC,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;oBACpE,IAAI,cAAc,IAAI,YAAY,EAAE,CAAC;wBACjC,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;wBACxB,MAAM,CAAC,cAAc,GAAG,cAAc,CAAC;wBACvC,MAAM,CAAC,YAAY,GAAG,YAAY,CAAC;oBACvC,CAAC;oBACD,IAAI,MAAM,EAAE,CAAC;wBACT,MAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;oBAC/B,CAAC;yBAAM,CAAC;wBACJ,OAAO,CAAC,KAAK,CAAC,8CAA8C,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;oBACtF,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,SAAS,CAAC,eAAe,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACtG,CAAC;IAEL,CAAC;CACJ;;;;;;;;;;;;;;;;AC/D4D;AAQtD,MAAM,OAAO;IAIhB,YAAY,OAAuB;;QAC/B,MAAM,EAAC,KAAK,EAAE,WAAW,EAAC,GAAG,OAAO,CAAC;QACrC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,WAAW,GAAG,kDAAW,CAAC,eAAe,CAAC;YAC3C,KAAK;YACL,IAAI,EAAE;gBACF,IAAI,EAAE,WAAW,CAAC,KAAK,GAAG,WAAW,CAAC,YAAY;gBAClD,OAAO,EAAE,WAAW,CAAC,KAAK,GAAG,WAAW,CAAC,YAAY;gBACrD,YAAY,EAAE,WAAW,CAAC,YAAY;gBACtC,WAAW,EAAE,WAAW,CAAC,YAAY;aACxC;YACD,OAAO,EAAE;gBACL,MAAM,EAAE;oBACJ,CAAC,EAAE,iBAAW,CAAC,OAAO,mCAAI,CAAC;oBAC3B,CAAC,EAAE,iBAAW,CAAC,OAAO,mCAAI,CAAC;iBAC9B;gBACD,YAAY,EAAE;oBACV,CAAC,EAAE,iBAAW,CAAC,OAAO,mCAAI,CAAC;oBAC3B,CAAC,EAAE,iBAAW,CAAC,OAAO,mCAAI,CAAC;iBAC9B;aACJ;SACJ,CAAC,CAAC;IACP,CAAC;CACJ;;;;;;;;;;;;;;;;;;;;;ACpCuB;AAIxB,MAAM,oBAAoB,GAAG,kCAAC,CAAC,MAAM,CAAC;IAClC,CAAC,EAAE,kCAAC,CAAC,MAAM,EAAE;IACb,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,CAAC,EAAE,kCAAC,CAAC,MAAM,EAAE;IACb,CAAC,EAAE,kCAAC,CAAC,MAAM,EAAE;IACb,CAAC,EAAE,kCAAC,CAAC,MAAM,EAAE;CAChB,CAAC,CAAC;AACH,MAAM,SAAS,GAAG,kCAAC,CAAC,KAAK,CAAC,CAAC,kCAAC,CAAC,MAAM,EAAE,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AACpD,MAAM,iBAAiB,GAAG,kCAAC,CAAC,MAAM,CAAC;IAC/B,YAAY,EAAE,kCAAC,CAAC,MAAM,EAAE;IACxB,MAAM,EAAE,oBAAoB,CAAC,QAAQ,EAAE;IACvC,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE,EAAC,mJAAmJ;IACtK,OAAO,EAAE,kCAAC,CAAC,GAAG,EAAE;IAChB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;CACrB,CAAC;AACF,MAAM,gBAAgB,GAAG,kCAAC,CAAC,MAAM,CAAC;IAC9B,CAAC,EAAE,kCAAC,CAAC,MAAM,EAAE;IACb,CAAC,EAAE,kCAAC,CAAC,MAAM,EAAE,EAAE,sBAAsB;IACrC,EAAE,EAAE,SAAS;IACb,GAAG,EAAE,SAAS;IACd,CAAC,EAAE,kCAAC,CAAC,MAAM,EAAE;CAChB,CAAC,CAAC;AAEI,MAAM,kBAAkB,GAAG,kCAAC,CAAC,MAAM,CAAC;IACvC,MAAM,EAAE,SAAS;IACjB,YAAY,EAAE,kCAAC,CAAC,MAAM,EAAE;IACxB,OAAO,EAAE,SAAS;IAClB,YAAY,EAAE,kCAAC,CAAC,MAAM,EAAE;IACxB,MAAM,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,EAAE,CAAC;IAC3B,MAAM,EAAE,oBAAoB,CAAC,QAAQ,EAAE;IACvC,QAAQ,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,QAAQ,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,cAAc,EAAE,kCAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC;IAC1C,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;IACf,EAAE,EAAE,SAAS;IACb,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;CACpB,CAAC,CAAC;AAGI,MAAM,iBAAiB,GAAG,kCAAC,CAAC,MAAM,CAAC;IACtC,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,YAAY,EAAE,kCAAC,CAAC,MAAM,EAAE;IACxB,SAAS,EAAE,kCAAC,CAAC,MAAM,EAAE;IACrB,gBAAgB,EAAE,kCAAC,CAAC,MAAM,EAAE;IAC5B,gBAAgB,EAAE,kCAAC,CAAC,MAAM,EAAE;IAC5B,eAAe,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACtC,gBAAgB,EAAC,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACtC,MAAM,EAAE,kCAAC,CAAC,KAAK,CAAC,CAAC,kCAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;IAC1G,cAAc,EAAE,kCAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,sBAAsB;IACjE,eAAe,EAAE,kCAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAC,wBAAwB;IACrE,SAAS,EAAE,kCAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC;IACpC,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;IACf,UAAU,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,EAAE,CAAC,EAAE,oDAAoD;IACrF,WAAW,EAAE,kCAAC,CAAC,MAAM,EAAE;IACvB,OAAO,EAAE,kCAAC,CAAC,MAAM,EAAE;IACnB,kBAAkB,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACzC,SAAS,EAAE,kCAAC,CAAC,MAAM,EAAE;IACrB,SAAS,EAAE,kCAAC,CAAC,MAAM,EAAE;IACrB,OAAO,EAAE,kCAAC,CAAC,OAAO,EAAE;CACvB,CAAC,CAAC;AAGI,MAAM,SAAS,GAAG,kCAAC,CAAC,MAAM,CAAC;IAC9B,SAAS,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,OAAO,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,OAAO,EAAE,kCAAC,CAAC,MAAM,CAAC;QACd,QAAQ,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,KAAK,CAAC,CAAC,kCAAC,CAAC,MAAM,EAAE,EAAE,kCAAC,CAAC,MAAM,EAAE,EAAE,kCAAC,CAAC,MAAM,EAAE,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,sCAAsC;QACpH,KAAK,EAAE,kCAAC,CAAC,KAAK,CAAC,CAAC,kCAAC,CAAC,MAAM,EAAE,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACxC,SAAS,EAAE,SAAS;KACvB,CAAC,CAAC,QAAQ,EAAE;IACb,YAAY,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,CAAC;QAC3B,GAAG,EAAE,kCAAC,CAAC,KAAK,CAAC,CAAC,kCAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QAClM,QAAQ,EAAE,kCAAC,CAAC,MAAM,EAAE;KACvB,CAAC,CAAC;IACH,SAAS,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,eAAe,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACtC,cAAc,EAAE,kCAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC;IAC1C,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;IACf,cAAc,EAAE,kCAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,QAAQ,EAAE,EAAE,gDAAgD;IACvG,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;IACjB,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;IACjB,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;IACf,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;CACrB,CAAC,CAAC;AAGH,MAAM,SAAS,GAAG,kCAAC,CAAC,MAAM,CAAC;IACvB,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;IACf,MAAM,EAAE,kCAAC,CAAC,KAAK,CAAC,SAAS,CAAC;IAC1B,eAAe,EAAC,kCAAC,CAAC,MAAM,EAAE;IAC1B,cAAc,EAAE,kCAAC,CAAC,MAAM,EAAE;IAC1B,6BAA6B;IAC7B,WAAW,EAAE,kCAAC,CAAC,KAAK,CAAC,CAAC,kCAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC;CAChI,CAAC,CAAC;AAGH,MAAM,uBAAuB,GAAG,kCAAC,CAAC,MAAM,CAAC;IACrC,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;IACjB,EAAE,EAAE,kCAAC,CAAC,MAAM,EAAE;IACd,QAAQ,EAAE,oBAAoB,CAAC,QAAQ,EAAE;CAC5C,CAAC,CAAC;AAEH,MAAM,kBAAkB,GAAG,kCAAC,CAAC,MAAM,CAAC;IAChC,eAAe,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACtC,cAAc,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACrC,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,IAAI,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,EAAE,CAAC;IACzB,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;IACf,MAAM,EAAE,kCAAC,CAAC,KAAK,CAAC,uBAAuB,CAAC;CAC3C,CAAC;AAIF,MAAM,qBAAqB,GAAG,kCAAC,CAAC,MAAM,CAAC;IACnC,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,UAAU,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,CAAC;QACzB,IAAI,EAAE,kCAAC,CAAC,MAAM,EAAE;QAChB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;KACrB,CAAC,CAAC;IACH,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,QAAQ,EAAE,kCAAC,CAAC,QAAQ,CAAC,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,CAAC;QAClC,WAAW,EAAE,kCAAC,CAAC,MAAM,EAAE;QACvB,OAAO,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,EAAE,CAAC;KAC/B,CAAC,CAAC,CAAC;IACJ,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,OAAO,EAAE,kCAAC,CAAC,MAAM,EAAE;IACnB,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;IACjB,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;IACjB,OAAO,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,OAAO,EAAE,kCAAC,CAAC,MAAM,EAAE;IACnB,IAAI,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,EAAE,CAAC;IACzB,iBAAiB,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACxC,YAAY,EAAE,kCAAC,CAAC,MAAM,EAAE;IACxB,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;CAClB,CAAC;AAGK,MAAM,mBAAmB,GAAG,kCAAC,CAAC,MAAM,CAAC;IACxC,MAAM,EAAE,kCAAC,CAAC,KAAK,CAAC,CAAC,kCAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;IAC1G,qBAAqB,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5C,cAAc,EAAE,kCAAC,CAAC,MAAM,EAAE;IAC1B,QAAQ,EAAE,kCAAC,CAAC,MAAM,EAAE;IACpB,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,aAAa,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,CAAC;QAC5B,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;QACjB,QAAQ,EAAE,kCAAC,CAAC,MAAM,EAAE;QACpB,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QACjC,IAAI,EAAE,oBAAoB,CAAC,QAAQ,EAAE;QACrC,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;KACpB,CAAC,CAAC;IACH,mBAAmB,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,CAAC;QAClC,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC5B,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QACjC,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;KAClB,CAAC,CAAC;IACH,eAAe,EAAE,kCAAC,CAAC,MAAM,EAAE;IAC3B,eAAe,EAAE,kCAAC,CAAC,MAAM,EAAE;IAC3B,eAAe,EAAE,kCAAC,CAAC,OAAO,EAAE;IAC5B,SAAS,EAAE,kCAAC,CAAC,MAAM,EAAE;IACrB,SAAS,EAAE,kCAAC,CAAC,MAAM,EAAE;IACrB,aAAa,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpC,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;CAClB,CAAC,CAAC;AAGI,MAAM,oBAAoB,GAAG,kCAAC,CAAC,MAAM,CAAC;IACzC,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;IACjB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,gBAAgB,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,EAAE,CAAC;IACrC,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,QAAQ,EAAE,oBAAoB,CAAC,QAAQ,EAAE;IACzC,cAAc,EAAE,kCAAC,CAAC,KAAK,CAAC;QACpB,kCAAC,CAAC,OAAO,CAAC,OAAO,CAAC;QAClB,kCAAC,CAAC,OAAO,CAAC,WAAW,CAAC;QACtB,kCAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;QACnB,kCAAC,CAAC,OAAO,CAAC,SAAS,CAAC;QACpB,kCAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC;QAC5B,kCAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC;QAC9B,kCAAC,CAAC,OAAO,CAAC,WAAW,CAAC;KACzB,CAAC;IACF,SAAS,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,UAAU,EAAE,oBAAoB,CAAC,QAAQ,EAAE;IAC3C,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;IACf,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;CACpB,CAAC,CAAC;AAGH,MAAM,eAAe,GAAG,kCAAC,CAAC,MAAM,CAAC;IAC7B,QAAQ,EAAE,kCAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC;IACxC,KAAK,EAAE,kCAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC;IAClC,MAAM,EAAE,kCAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC;IACpC,QAAQ,EAAE,kCAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC;CAC1C,CAAC;AAGK,MAAM,mBAAmB,GAAG,kCAAC,CAAC,MAAM,CAAC;IACxC,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;IACf,OAAO,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,IAAI,EAAE,eAAe;IACrB,cAAc,EAAE,kCAAC,CAAC,OAAO,EAAE;IAC3B,WAAW,EAAE,kCAAC,CAAC,MAAM,EAAE;IACvB,MAAM,EAAE,kCAAC,CAAC,KAAK,CAAC,SAAS,CAAC;IAC1B,GAAG,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,CAAC;QAClB,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;QACtB,aAAa,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,CAAC;YAC5B,MAAM,EAAE,kCAAC,CAAC,GAAG,EAAE;YACf,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;YACjB,IAAI,EAAE,kCAAC,CAAC,MAAM,EAAE;YAChB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;YAClB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;YAClB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;SACrB,CAAC,CAAC;KACN,CAAC,CAAC;IACH,yBAAyB;IACzB,eAAe,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACtC,cAAc,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACrC,uCAAuC;IACvC,WAAW,EAAE,kCAAC,CAAC,KAAK,CAAC,CAAC,kCAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACxI,MAAM,EAAE,kCAAC,CAAC,KAAK,CAAC,SAAS,CAAC;CAC7B,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC1OH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,IAAI;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oBAAoB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gCAAgC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA,0DAA0D;AAC1D,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,MAAM;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,eAAe,aAAa,eAAe;AACjF;AACA;AACA;AACA,yDAAyD,2DAA2D;AACpH;AACA;AACA,wDAAwD,kCAAkC;AAC1F;AACA;AACA;AACA;AACA;AACA,+DAA+D,+BAA+B;AAC9F;AACA;AACA,sDAAsD,+BAA+B,cAAc,eAAe;AAClH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8DAA8D,0BAA0B;AACxF;AACA,qCAAqC,SAAS,oDAAoD,0BAA0B;AAC5H;AACA;AACA;AACA,iEAAiE,4BAA4B;AAC7F;AACA;AACA,+DAA+D,0BAA0B;AACzF;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,iBAAiB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,sEAAsE,EAAE,eAAe;AACvI;AACA,iDAAiD,iEAAiE,EAAE,eAAe;AACnI;AACA,4CAA4C;AAC5C;AACA;AACA;AACA,0CAA0C,EAAE,cAAc;AAC1D;AACA,0CAA0C;AAC1C;AACA;AACA;AACA,0CAA0C,EAAE,gCAAgC;AAC5E;AACA;AACA;AACA;AACA;AACA,gDAAgD,qEAAqE,EAAE,eAAe;AACtI;AACA,iDAAiD,iEAAiE,EAAE,eAAe;AACnI;AACA,4CAA4C;AAC5C;AACA;AACA;AACA,uCAAuC,EAAE,cAAc;AACvD;AACA,4CAA4C;AAC5C;AACA;AACA;AACA,uCAAuC,EAAE,cAAc;AACvD;AACA,0CAA0C;AAC1C;AACA;AACA;AACA,0CAA0C,EAAE,gCAAgC;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,iBAAiB;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY,mCAAmC;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,kCAAkC;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,aAAa;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,CAAC;AACD,4BAA4B,wBAAwB;AACpD,yBAAyB,wBAAwB;AACjD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,sEAAsE,UAAU;AAChF;AACA,CAAC,8BAA8B;;AAE/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,4DAA4D;AACxE;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,gBAAgB,UAAU;AAC1B;AACA,qBAAqB;AACrB;AACA;AACA,qBAAqB;AACrB;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,mCAAmC;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,6BAA6B;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,6BAA6B;AAC/D;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,mCAAmC;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,sBAAsB,gCAAgC;AACtD,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,8BAA8B;AACpD,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,GAAG;AAC/B;AACA,uCAAuC,GAAG;AAC1C;AACA,iBAAiB,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU,GAAG;AACzE,gCAAgC,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,GAAG;AACvG,iCAAiC,GAAG;AACpC;AACA;AACA;AACA;AACA,4DAA4D,GAAG,mFAAmF,GAAG;AACrJ;AACA,sCAAsC,sBAAsB,sCAAsC,uBAAuB,OAAO,GAAG,cAAc;AACjJ;AACA;AACA,uBAAuB,yBAAyB,4DAA4D,EAAE,SAAS,IAAI,MAAM,EAAE,iCAAiC,EAAE,SAAS,IAAI,yBAAyB,IAAI,GAAG,EAAE,aAAa,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,mCAAmC,EAAE,SAAS,IAAI,MAAM,EAAE,iCAAiC,EAAE,SAAS,IAAI,0DAA0D,GAAG;AACrnB;AACA,iDAAiD,IAAI,kCAAkC,KAAK,6CAA6C,KAAK;AAC9I;AACA,gCAAgC,EAAE,+BAA+B,EAAE,2NAA2N,EAAE;AAChS,iGAAiG,GAAG;AACpG;AACA,8BAA8B,EAAE;AAChC;AACA,2BAA2B,sBAAsB,KAAK,gBAAgB;AACtE;AACA;AACA,+EAA+E,EAAE;AACjF,mFAAmF,EAAE;AACrF;AACA,gBAAgB,IAAI,GAAG,EAAE,aAAa,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,mCAAmC,EAAE,SAAS,IAAI,MAAM,EAAE,iCAAiC,EAAE,SAAS,IAAI;AAC5X,kCAAkC,IAAI,GAAG,IAAI,YAAY,IAAI,cAAc,IAAI,GAAG,IAAI,eAAe,IAAI,GAAG,IAAI,aAAa,IAAI,cAAc,IAAI,GAAG,IAAI,cAAc,IAAI,EAAE,IAAI,cAAc,IAAI,GAAG,IAAI,cAAc,IAAI,EAAE,IAAI,cAAc,IAAI,GAAG,IAAI,cAAc,IAAI,EAAE,IAAI,cAAc,IAAI,GAAG,IAAI,cAAc,IAAI,EAAE,IAAI,aAAa,IAAI,gBAAgB,IAAI,EAAE,IAAI,kBAAkB,IAAI,EAAE,IAAI,uBAAuB,IAAI,EAAE,IAAI,aAAa,GAAG,YAAY,IAAI,EAAE,IAAI,GAAG,IAAI,oBAAoB,IAAI,OAAO,IAAI,UAAU,IAAI,mBAAmB,IAAI,OAAO,IAAI,oBAAoB,IAAI,GAAG,IAAI,qBAAqB,IAAI,OAAO,IAAI,UAAU,IAAI,mBAAmB,IAAI,OAAO,IAAI;AAChqB,sCAAsC,IAAI,GAAG,IAAI,YAAY,IAAI,cAAc,IAAI,GAAG,IAAI,eAAe,IAAI,GAAG,IAAI,aAAa,IAAI,cAAc,IAAI,GAAG,IAAI,cAAc,IAAI,EAAE,IAAI,cAAc,IAAI,GAAG,IAAI,cAAc,IAAI,EAAE,IAAI,cAAc,IAAI,GAAG,IAAI,cAAc,IAAI,EAAE,IAAI,cAAc,IAAI,GAAG,IAAI,cAAc,IAAI,EAAE,IAAI,aAAa,IAAI,gBAAgB,IAAI,EAAE,IAAI,kBAAkB,IAAI,EAAE,IAAI,uBAAuB,IAAI,EAAE,IAAI,aAAa,GAAG,YAAY,IAAI,EAAE,IAAI,GAAG,IAAI,oBAAoB,IAAI,OAAO,IAAI,UAAU,IAAI,mBAAmB,IAAI,OAAO,IAAI,oBAAoB,IAAI,GAAG,IAAI,qBAAqB,IAAI,OAAO,IAAI,UAAU,IAAI,mBAAmB,IAAI,OAAO,IAAI;AACpqB;AACA,qCAAqC,EAAE,kBAAkB,EAAE,mBAAmB,EAAE;AAChF;AACA,wCAAwC,EAAE,kBAAkB,EAAE,sBAAsB,EAAE;AACtF;AACA,gCAAgC,EAAE,KAAK,EAAE,KAAK,EAAE;AAChD;AACA,gCAAgC,EAAE;AAClC;AACA,mHAAmH,EAAE;AACrH,iCAAiC,gBAAgB;AACjD;AACA,wBAAwB,EAAE,KAAK,EAAE,KAAK,EAAE;AACxC;AACA;AACA,mBAAmB,MAAM,OAAO,EAAE,gBAAgB;AAClD;AACA;AACA,mBAAmB,MAAM;AACzB;AACA;AACA;AACA;AACA,0BAA0B,sBAAsB;AAChD;AACA;AACA;AACA,mBAAmB,gBAAgB,GAAG,sBAAsB;AAC5D;AACA;AACA;AACA,4BAA4B,EAAE,MAAM,EAAE;AACtC,eAAe,MAAM,GAAG,eAAe;AACvC,0BAA0B,MAAM;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,iDAAiD;AACvF;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,yBAAyB;AAC/D;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,uBAAuB;AAC7D;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gCAAgC,+CAA+C;AAC/E;AACA;AACA,gCAAgC,6CAA6C;AAC7E;AACA;AACA,gCAAgC,+CAA+C;AAC/E;AACA;AACA,gCAAgC,8CAA8C;AAC9E;AACA;AACA,gCAAgC,gDAAgD;AAChF;AACA;AACA,gCAAgC,8CAA8C;AAC9E;AACA;AACA,gCAAgC,+CAA+C;AAC/E;AACA;AACA,gCAAgC,8CAA8C;AAC9E;AACA;AACA,gCAAgC,gDAAgD;AAChF;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gCAAgC,6CAA6C;AAC7E;AACA;AACA,gCAAgC,4CAA4C;AAC5E;AACA;AACA,gCAAgC,8CAA8C;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gCAAgC,uBAAuB;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gCAAgC,kDAAkD;AAClF;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,cAAc;AAC1D,SAAS;AACT;AACA;AACA;AACA;AACA,4CAA4C,qBAAqB;AACjE,SAAS;AACT;AACA;AACA;AACA;AACA,4CAA4C,qBAAqB;AACjE,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,wDAAwD;AACjF,SAAS;AACT;AACA;AACA;AACA;AACA,yBAAyB,wDAAwD;AACjF,SAAS;AACT;AACA;AACA;AACA;AACA,2BAA2B,kDAAkD;AAC7E,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,aAAa;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,gBAAgB,cAAc;AAC9B,gBAAgB,yBAAyB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,6BAA6B;AACpD;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,6BAA6B;AAC5D,iCAAiC,uCAAuC;AACxE,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,6BAA6B;AACxD;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,oBAAoB;AACpB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,8BAA8B,eAAe;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE,cAAc;AACjF;AACA;AACA;AACA,8DAA8D,uBAAuB,sBAAsB,cAAc;AACzH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,4BAA4B,kBAAkB;AAC9C;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,iCAAiC;AACjC;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,sDAAsD;AAC7E,SAAS;AACT;AACA;AACA;AACA;AACA,uBAAuB,sDAAsD;AAC7E,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA,mCAAmC,6CAA6C;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,mCAAmC,6CAA6C;AAChF;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,mCAAmC,6CAA6C;AAChF;AACA;AACA;AACA,uGAAuG,qCAAqC;AAC5I,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,kBAAkB,2CAA2C;AAC7D;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA,yBAAyB;AACzB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,cAAc;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA,qDAAqD,aAAa;AAClE,+BAA+B,sCAAsC;AACrE;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,sDAAsD;AACvD;AACA;AACA;AACA,sCAAsC,SAAS;AAC/C,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,sBAAsB;AAC/D,yCAAyC,sBAAsB;AAC/D;AACA;AACA;AACA,KAAK;AACL,yCAAyC,sBAAsB;AAC/D,qCAAqC,sBAAsB;AAC3D;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,cAAc;AAChC,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,+BAA+B;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAE2rD;;;;;;;UC7xI5rD;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;;;;WCtBA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA;;;;;WCPA;;;;;WCAA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D;;;;;;;;;;;;;;ACLgC;AACE;AACc;AAChD,4CAAQ,CAAC,sBAAsB,EAAE,CAAC;AAClC,MAAM,IAAI,GAAG,IAAI,6CAAS,CAAC;IACvB,UAAU,EAAE;QACR,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,GAAG;KACd;IACD,kBAAkB,EAAE,KAAK;IACzB,QAAQ,EAAE,IAAI;IACd,UAAU,EAAE,CAAC;IACb,WAAW,EAAE,kDAAc,CAAC,SAAS;CACxC,CAAC,CAAC;AAEH,IAAI,CAAC,KAAK,CAAC,8CAAM,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;IACzB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAE3B,iDAAS,CAAC,YAAY,CAAC,+BAA+B,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE;QAC5E,MAAM,MAAM,GAAG,IAAI,2CAAM,CAAC;YACtB,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,0CAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC/D,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK;YACzB,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM;YAC3B,GAAG,EAAE,KAAK,CAAC,QAAQ;YACnB,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK;SACvB,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAClB,CAAC,CAAC,CAAC;IACH,uEAAuE;IACvE,YAAY;IACZ,iDAAS,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE;QACjD,GAAG,EAAE,0CAAM,CAAC,CAAC,EAAE,CAAC,CAAC;QACjB,WAAW,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;KACtC,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,aAAa,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5E,IAAI,MAAM,YAAY,2CAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;QAC9C,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,iDAAS,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;QAC7E,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAChE,CAAC;AACL,CAAC,CAAC,CAAC","sources":["webpack://@excaliburjs/plugin-ldtk/webpack/universalModuleDefinition","webpack://@excaliburjs/plugin-ldtk/./node_modules/compare-versions/lib/esm/compare.js","webpack://@excaliburjs/plugin-ldtk/./node_modules/compare-versions/lib/esm/compareVersions.js","webpack://@excaliburjs/plugin-ldtk/./node_modules/compare-versions/lib/esm/utils.js","webpack://@excaliburjs/plugin-ldtk/./node_modules/excalibur/build/esm/excalibur.development.js","webpack://@excaliburjs/plugin-ldtk/./sample/config.ts","webpack://@excaliburjs/plugin-ldtk/./sample/player.ts","webpack://@excaliburjs/plugin-ldtk/./sample/resources.ts","webpack://@excaliburjs/plugin-ldtk/./src/entity-layer.ts","webpack://@excaliburjs/plugin-ldtk/./src/file-loader.ts","webpack://@excaliburjs/plugin-ldtk/./src/index.ts","webpack://@excaliburjs/plugin-ldtk/./src/intgrid-layer.ts","webpack://@excaliburjs/plugin-ldtk/./src/ldtk-resource.ts","webpack://@excaliburjs/plugin-ldtk/./src/level-resource.ts","webpack://@excaliburjs/plugin-ldtk/./src/level.ts","webpack://@excaliburjs/plugin-ldtk/./src/loader-cache.ts","webpack://@excaliburjs/plugin-ldtk/./src/path-util.ts","webpack://@excaliburjs/plugin-ldtk/./src/tile-layer.ts","webpack://@excaliburjs/plugin-ldtk/./src/tileset.ts","webpack://@excaliburjs/plugin-ldtk/./src/types.ts","webpack://@excaliburjs/plugin-ldtk/./node_modules/zod/lib/index.mjs","webpack://@excaliburjs/plugin-ldtk/webpack/bootstrap","webpack://@excaliburjs/plugin-ldtk/webpack/runtime/define property getters","webpack://@excaliburjs/plugin-ldtk/webpack/runtime/hasOwnProperty shorthand","webpack://@excaliburjs/plugin-ldtk/webpack/runtime/make namespace object","webpack://@excaliburjs/plugin-ldtk/./sample/main.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, () => {\nreturn ","import { compareVersions } from './compareVersions.js';\n/**\n * Compare [semver](https://semver.org/) version strings using the specified operator.\n *\n * @param v1 First version to compare\n * @param v2 Second version to compare\n * @param operator Allowed arithmetic operator to use\n * @returns `true` if the comparison between the firstVersion and the secondVersion satisfies the operator, `false` otherwise.\n *\n * @example\n * ```\n * compare('10.1.8', '10.0.4', '>'); // return true\n * compare('10.0.1', '10.0.1', '='); // return true\n * compare('10.1.1', '10.2.2', '<'); // return true\n * compare('10.1.1', '10.2.2', '<='); // return true\n * compare('10.1.1', '10.2.2', '>='); // return false\n * ```\n */\nexport const compare = (v1, v2, operator) => {\n // validate input operator\n assertValidOperator(operator);\n // since result of compareVersions can only be -1 or 0 or 1\n // a simple map can be used to replace switch\n const res = compareVersions(v1, v2);\n return operatorResMap[operator].includes(res);\n};\nconst operatorResMap = {\n '>': [1],\n '>=': [0, 1],\n '=': [0],\n '<=': [-1, 0],\n '<': [-1],\n '!=': [-1, 1],\n};\nconst allowedOperators = Object.keys(operatorResMap);\nconst assertValidOperator = (op) => {\n if (typeof op !== 'string') {\n throw new TypeError(`Invalid operator type, expected string but got ${typeof op}`);\n }\n if (allowedOperators.indexOf(op) === -1) {\n throw new Error(`Invalid operator, expected one of ${allowedOperators.join('|')}`);\n }\n};\n//# sourceMappingURL=compare.js.map","import { compareSegments, validateAndParse } from './utils.js';\n/**\n * Compare [semver](https://semver.org/) version strings to find greater, equal or lesser.\n * This library supports the full semver specification, including comparing versions with different number of digits like `1.0.0`, `1.0`, `1`, and pre-release versions like `1.0.0-alpha`.\n * @param v1 - First version to compare\n * @param v2 - Second version to compare\n * @returns Numeric value compatible with the [Array.sort(fn) interface](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#Parameters).\n */\nexport const compareVersions = (v1, v2) => {\n // validate input and split into segments\n const n1 = validateAndParse(v1);\n const n2 = validateAndParse(v2);\n // pop off the patch\n const p1 = n1.pop();\n const p2 = n2.pop();\n // validate numbers\n const r = compareSegments(n1, n2);\n if (r !== 0)\n return r;\n // validate pre-release\n if (p1 && p2) {\n return compareSegments(p1.split('.'), p2.split('.'));\n }\n else if (p1 || p2) {\n return p1 ? -1 : 1;\n }\n return 0;\n};\n//# sourceMappingURL=compareVersions.js.map","export const semver = /^[v^~<>=]*?(\\d+)(?:\\.([x*]|\\d+)(?:\\.([x*]|\\d+)(?:\\.([x*]|\\d+))?(?:-([\\da-z\\-]+(?:\\.[\\da-z\\-]+)*))?(?:\\+[\\da-z\\-]+(?:\\.[\\da-z\\-]+)*)?)?)?$/i;\nexport const validateAndParse = (version) => {\n if (typeof version !== 'string') {\n throw new TypeError('Invalid argument expected string');\n }\n const match = version.match(semver);\n if (!match) {\n throw new Error(`Invalid argument not valid semver ('${version}' received)`);\n }\n match.shift();\n return match;\n};\nconst isWildcard = (s) => s === '*' || s === 'x' || s === 'X';\nconst tryParse = (v) => {\n const n = parseInt(v, 10);\n return isNaN(n) ? v : n;\n};\nconst forceType = (a, b) => typeof a !== typeof b ? [String(a), String(b)] : [a, b];\nconst compareStrings = (a, b) => {\n if (isWildcard(a) || isWildcard(b))\n return 0;\n const [ap, bp] = forceType(tryParse(a), tryParse(b));\n if (ap > bp)\n return 1;\n if (ap < bp)\n return -1;\n return 0;\n};\nexport const compareSegments = (a, b) => {\n for (let i = 0; i < Math.max(a.length, b.length); i++) {\n const r = compareStrings(a[i] || '0', b[i] || '0');\n if (r !== 0)\n return r;\n }\n return 0;\n};\n//# sourceMappingURL=utils.js.map","/*!\n * excalibur - 0.30.1 - 2024-12-12\n * https://github.com/excaliburjs/Excalibur\n * Copyright (c) 2024 Excalibur.js \n * Licensed BSD-2-Clause\n * @preserve\n */\n/******/ var __webpack_modules__ = ({\n\n/***/ \"./Director/Loader.css\":\n/*!*****************************!*\\\n !*** ./Director/Loader.css ***!\n \\*****************************/\n/***/ ((module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/sourceMaps.js */ \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ \"../../node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `/* Buttons styles start */\r\n\r\nbutton#excalibur-play {\r\n display: inline-block;\r\n position: relative;\r\n z-index: 999;\r\n border-radius: 6px;\r\n border: none;\r\n /*border: 3px solid;\r\n border-color: white;\r\n box-shadow: 0 0 10px #ccc;*/\r\n padding: 1rem 1.5rem 1rem 4rem;\r\n margin: 0;\r\n text-decoration: none;\r\n background: #00b233;\r\n color: #ffffff;\r\n font-family: sans-serif;\r\n font-size: 2rem;\r\n white-space: nowrap;\r\n line-height: 1;\r\n cursor: pointer;\r\n text-align: center;\r\n transition:\r\n background 250ms ease-in-out,\r\n transform 150ms ease;\r\n -webkit-appearance: none;\r\n -moz-appearance: none;\r\n\r\n -webkit-animation: excalibur-button-fadein 200ms; /* Safari, Chrome and Opera > 12.1 */\r\n -moz-animation: excalibur-button-fadein 200ms; /* Firefox < 16 */\r\n -ms-animation: excalibur-button-fadein 200ms; /* Internet Explorer */\r\n -o-animation: excalibur-button-fadein 200ms; /* Opera < 12.1 */\r\n animation: excalibur-button-fadein 200ms;\r\n}\r\n\r\n/*\r\nbutton#excalibur-play {\r\n display: none;\r\n}*/\r\n\r\nbutton#excalibur-play:after {\r\n position: absolute;\r\n content: '';\r\n border: 8px solid;\r\n border-color: transparent transparent transparent white;\r\n left: 35px;\r\n top: 24px;\r\n width: 0;\r\n height: 0;\r\n}\r\n\r\nbutton#excalibur-play:before {\r\n position: absolute;\r\n content: '';\r\n border: 3px solid;\r\n left: 19px;\r\n top: 14px;\r\n border-radius: 20px;\r\n width: 30px;\r\n height: 30px;\r\n}\r\n\r\nbutton#excalibur-play:hover,\r\nbutton#excalibur-play:focus {\r\n background: #00982c;\r\n}\r\n\r\nbutton#excalibur-play:focus {\r\n outline: 1px solid #fff;\r\n outline-offset: -4px;\r\n}\r\n\r\nbutton#excalibur-play:active {\r\n transform: scale(0.99);\r\n}\r\n\r\n@keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n/* Firefox < 16 */\r\n@-moz-keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n/* Safari, Chrome and Opera > 12.1 */\r\n@-webkit-keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n/* Internet Explorer */\r\n@-ms-keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n/* Opera < 12.1 */\r\n@-o-keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./Director/Loader.css\"],\"names\":[],\"mappings\":\"AAAA,yBAAyB;;AAEzB;EACE,qBAAqB;EACrB,kBAAkB;EAClB,YAAY;EACZ,kBAAkB;EAClB,YAAY;EACZ;;+BAE6B;EAC7B,8BAA8B;EAC9B,SAAS;EACT,qBAAqB;EACrB,mBAAmB;EACnB,cAAc;EACd,uBAAuB;EACvB,eAAe;EACf,mBAAmB;EACnB,cAAc;EACd,eAAe;EACf,kBAAkB;EAClB;;wBAEsB;EACtB,wBAAwB;EACxB,qBAAqB;;EAErB,gDAAgD,EAAE,oCAAoC;EACtF,6CAA6C,EAAE,iBAAiB;EAChE,4CAA4C,EAAE,sBAAsB;EACpE,2CAA2C,EAAE,iBAAiB;EAC9D,wCAAwC;AAC1C;;AAEA;;;EAGE;;AAEF;EACE,kBAAkB;EAClB,WAAW;EACX,iBAAiB;EACjB,uDAAuD;EACvD,UAAU;EACV,SAAS;EACT,QAAQ;EACR,SAAS;AACX;;AAEA;EACE,kBAAkB;EAClB,WAAW;EACX,iBAAiB;EACjB,UAAU;EACV,SAAS;EACT,mBAAmB;EACnB,WAAW;EACX,YAAY;AACd;;AAEA;;EAEE,mBAAmB;AACrB;;AAEA;EACE,uBAAuB;EACvB,oBAAoB;AACtB;;AAEA;EACE,sBAAsB;AACxB;;AAEA;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF;;AAEA,iBAAiB;AACjB;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF;;AAEA,oCAAoC;AACpC;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF;;AAEA,sBAAsB;AACtB;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF;;AAEA,iBAAiB;AACjB;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF\",\"sourcesContent\":[\"/* Buttons styles start */\\r\\n\\r\\nbutton#excalibur-play {\\r\\n display: inline-block;\\r\\n position: relative;\\r\\n z-index: 999;\\r\\n border-radius: 6px;\\r\\n border: none;\\r\\n /*border: 3px solid;\\r\\n border-color: white;\\r\\n box-shadow: 0 0 10px #ccc;*/\\r\\n padding: 1rem 1.5rem 1rem 4rem;\\r\\n margin: 0;\\r\\n text-decoration: none;\\r\\n background: #00b233;\\r\\n color: #ffffff;\\r\\n font-family: sans-serif;\\r\\n font-size: 2rem;\\r\\n white-space: nowrap;\\r\\n line-height: 1;\\r\\n cursor: pointer;\\r\\n text-align: center;\\r\\n transition:\\r\\n background 250ms ease-in-out,\\r\\n transform 150ms ease;\\r\\n -webkit-appearance: none;\\r\\n -moz-appearance: none;\\r\\n\\r\\n -webkit-animation: excalibur-button-fadein 200ms; /* Safari, Chrome and Opera > 12.1 */\\r\\n -moz-animation: excalibur-button-fadein 200ms; /* Firefox < 16 */\\r\\n -ms-animation: excalibur-button-fadein 200ms; /* Internet Explorer */\\r\\n -o-animation: excalibur-button-fadein 200ms; /* Opera < 12.1 */\\r\\n animation: excalibur-button-fadein 200ms;\\r\\n}\\r\\n\\r\\n/*\\r\\nbutton#excalibur-play {\\r\\n display: none;\\r\\n}*/\\r\\n\\r\\nbutton#excalibur-play:after {\\r\\n position: absolute;\\r\\n content: '';\\r\\n border: 8px solid;\\r\\n border-color: transparent transparent transparent white;\\r\\n left: 35px;\\r\\n top: 24px;\\r\\n width: 0;\\r\\n height: 0;\\r\\n}\\r\\n\\r\\nbutton#excalibur-play:before {\\r\\n position: absolute;\\r\\n content: '';\\r\\n border: 3px solid;\\r\\n left: 19px;\\r\\n top: 14px;\\r\\n border-radius: 20px;\\r\\n width: 30px;\\r\\n height: 30px;\\r\\n}\\r\\n\\r\\nbutton#excalibur-play:hover,\\r\\nbutton#excalibur-play:focus {\\r\\n background: #00982c;\\r\\n}\\r\\n\\r\\nbutton#excalibur-play:focus {\\r\\n outline: 1px solid #fff;\\r\\n outline-offset: -4px;\\r\\n}\\r\\n\\r\\nbutton#excalibur-play:active {\\r\\n transform: scale(0.99);\\r\\n}\\r\\n\\r\\n@keyframes excalibur-button-fadein {\\r\\n from {\\r\\n opacity: 0;\\r\\n }\\r\\n to {\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n/* Firefox < 16 */\\r\\n@-moz-keyframes excalibur-button-fadein {\\r\\n from {\\r\\n opacity: 0;\\r\\n }\\r\\n to {\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n/* Safari, Chrome and Opera > 12.1 */\\r\\n@-webkit-keyframes excalibur-button-fadein {\\r\\n from {\\r\\n opacity: 0;\\r\\n }\\r\\n to {\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n/* Internet Explorer */\\r\\n@-ms-keyframes excalibur-button-fadein {\\r\\n from {\\r\\n opacity: 0;\\r\\n }\\r\\n to {\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n/* Opera < 12.1 */\\r\\n@-o-keyframes excalibur-button-fadein {\\r\\n from {\\r\\n opacity: 0;\\r\\n }\\r\\n to {\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n\n\n/***/ }),\n\n/***/ \"./Util/Toaster.css\":\n/*!**************************!*\\\n !*** ./Util/Toaster.css ***!\n \\**************************/\n/***/ ((module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/sourceMaps.js */ \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ \"../../node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `#ex-toast-container {\r\n position: absolute;\r\n height: 0;\r\n min-width: 50%;\r\n left: 50%;\r\n top: 0;\r\n}\r\n\r\n.ex-toast-message {\r\n left: -50%;\r\n position: relative;\r\n display: flex;\r\n justify-content: space-between;\r\n\r\n padding: 10px;\r\n margin-top: 5px;\r\n font-size: 18px;\r\n font-family: sans-serif;\r\n border-radius: 6px;\r\n border: 3px solid #b7b779;\r\n background-color: rgb(253, 253, 192);\r\n}\r\n\r\n.ex-toast-message button {\r\n align-self: flex-start;\r\n}\r\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./Util/Toaster.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,kBAAkB;EAClB,SAAS;EACT,cAAc;EACd,SAAS;EACT,MAAM;AACR;;AAEA;EACE,UAAU;EACV,kBAAkB;EAClB,aAAa;EACb,8BAA8B;;EAE9B,aAAa;EACb,eAAe;EACf,eAAe;EACf,uBAAuB;EACvB,kBAAkB;EAClB,yBAAyB;EACzB,oCAAoC;AACtC;;AAEA;EACE,sBAAsB;AACxB\",\"sourcesContent\":[\"#ex-toast-container {\\r\\n position: absolute;\\r\\n height: 0;\\r\\n min-width: 50%;\\r\\n left: 50%;\\r\\n top: 0;\\r\\n}\\r\\n\\r\\n.ex-toast-message {\\r\\n left: -50%;\\r\\n position: relative;\\r\\n display: flex;\\r\\n justify-content: space-between;\\r\\n\\r\\n padding: 10px;\\r\\n margin-top: 5px;\\r\\n font-size: 18px;\\r\\n font-family: sans-serif;\\r\\n border-radius: 6px;\\r\\n border: 3px solid #b7b779;\\r\\n background-color: rgb(253, 253, 192);\\r\\n}\\r\\n\\r\\n.ex-toast-message button {\\r\\n align-self: flex-start;\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n\n\n/***/ }),\n\n/***/ \"../../node_modules/css-loader/dist/runtime/api.js\":\n/*!*********************************************************!*\\\n !*** ../../node_modules/css-loader/dist/runtime/api.js ***!\n \\*********************************************************/\n/***/ ((module) => {\n\n\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\nmodule.exports = function (cssWithMappingToString) {\n var list = [];\n\n // return the list of modules as css string\n list.toString = function toString() {\n return this.map(function (item) {\n var content = \"\";\n var needLayer = typeof item[5] !== \"undefined\";\n if (item[4]) {\n content += \"@supports (\".concat(item[4], \") {\");\n }\n if (item[2]) {\n content += \"@media \".concat(item[2], \" {\");\n }\n if (needLayer) {\n content += \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\");\n }\n content += cssWithMappingToString(item);\n if (needLayer) {\n content += \"}\";\n }\n if (item[2]) {\n content += \"}\";\n }\n if (item[4]) {\n content += \"}\";\n }\n return content;\n }).join(\"\");\n };\n\n // import a list of modules into the list\n list.i = function i(modules, media, dedupe, supports, layer) {\n if (typeof modules === \"string\") {\n modules = [[null, modules, undefined]];\n }\n var alreadyImportedModules = {};\n if (dedupe) {\n for (var k = 0; k < this.length; k++) {\n var id = this[k][0];\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n for (var _k = 0; _k < modules.length; _k++) {\n var item = [].concat(modules[_k]);\n if (dedupe && alreadyImportedModules[item[0]]) {\n continue;\n }\n if (typeof layer !== \"undefined\") {\n if (typeof item[5] === \"undefined\") {\n item[5] = layer;\n } else {\n item[1] = \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\").concat(item[1], \"}\");\n item[5] = layer;\n }\n }\n if (media) {\n if (!item[2]) {\n item[2] = media;\n } else {\n item[1] = \"@media \".concat(item[2], \" {\").concat(item[1], \"}\");\n item[2] = media;\n }\n }\n if (supports) {\n if (!item[4]) {\n item[4] = \"\".concat(supports);\n } else {\n item[1] = \"@supports (\".concat(item[4], \") {\").concat(item[1], \"}\");\n item[4] = supports;\n }\n }\n list.push(item);\n }\n };\n return list;\n};\n\n/***/ }),\n\n/***/ \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\":\n/*!****************************************************************!*\\\n !*** ../../node_modules/css-loader/dist/runtime/sourceMaps.js ***!\n \\****************************************************************/\n/***/ ((module) => {\n\n\n\nmodule.exports = function (item) {\n var content = item[1];\n var cssMapping = item[3];\n if (!cssMapping) {\n return content;\n }\n if (typeof btoa === \"function\") {\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n var sourceMapping = \"/*# \".concat(data, \" */\");\n return [content].concat([sourceMapping]).join(\"\\n\");\n }\n return [content].join(\"\\n\");\n};\n\n/***/ }),\n\n/***/ \"./Graphics/Context/circle-renderer/circle-renderer.frag.glsl\":\n/*!********************************************************************!*\\\n !*** ./Graphics/Context/circle-renderer/circle-renderer.frag.glsl ***!\n \\********************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nprecision highp float;\\r\\n\\r\\n// UV coord\\r\\nin vec2 v_uv;\\r\\n\\r\\n// Color coord to blend with image\\r\\nin lowp vec4 v_color;\\r\\n\\r\\n// Stroke color if used\\r\\nin lowp vec4 v_strokeColor;\\r\\n\\r\\n// Stroke thickness if used\\r\\nin lowp float v_strokeThickness;\\r\\n\\r\\n// Opacity\\r\\nin float v_opacity;\\r\\n\\r\\nout vec4 fragColor;\\r\\n\\r\\nvoid main() {\\r\\n // make (0, 0) the center the uv \\r\\n vec2 uv = v_uv * 2.0 - 1.0;\\r\\n\\r\\n vec4 color = v_color;\\r\\n vec4 strokeColor = v_strokeColor;\\r\\n\\r\\n // circle border is at radius 1.0 \\r\\n // dist is > 0 when inside the circle \\r\\n float d = length(uv);\\r\\n float dist = 1.0 - length(uv);\\r\\n\\r\\n // Fade based on fwidth\\r\\n float fade = fwidth(dot(uv, uv));\\r\\n\\r\\n // if dist is greater than 0 step to 1;\\r\\n // when we cross this 0 threshold add a smooth fade\\r\\n float fill = smoothstep(-fade/2.0, fade/2.0, dist);\\r\\n\\r\\n // if dist is greater than the stroke thickness step to 1\\r\\n float stroke = 1.0 - smoothstep(v_strokeThickness, v_strokeThickness + fade, dist);\\r\\n\\r\\n strokeColor.a *= fill * stroke;\\r\\n strokeColor.rgb *= strokeColor.a;\\r\\n\\r\\n color.a *= fill * (1.0 - stroke);\\r\\n color.rgb *= color.a;\\r\\n\\r\\n vec4 finalColor = mix(vec4(0.0), (color + strokeColor), fill);\\r\\n finalColor.rgb = finalColor.rgb * v_opacity;\\r\\n finalColor.a = finalColor.a * v_opacity;\\r\\n fragColor = finalColor;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/circle-renderer/circle-renderer.vert.glsl\":\n/*!********************************************************************!*\\\n !*** ./Graphics/Context/circle-renderer/circle-renderer.vert.glsl ***!\n \\********************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nin vec2 a_position;\\r\\n\\r\\n// UV coordinate\\r\\nin vec2 a_uv;\\r\\nout vec2 v_uv;\\r\\n\\r\\n// Opacity \\r\\nin float a_opacity;\\r\\nout float v_opacity;\\r\\n\\r\\nin vec4 a_color;\\r\\nout vec4 v_color;\\r\\n\\r\\nin vec4 a_strokeColor;\\r\\nout vec4 v_strokeColor;\\r\\n\\r\\nin float a_strokeThickness;\\r\\nout float v_strokeThickness;\\r\\n\\r\\nuniform mat4 u_matrix;\\r\\n\\r\\n\\r\\nvoid main() {\\r\\n // Set the vertex position using the ortho transform matrix\\r\\n gl_Position = u_matrix * vec4(a_position, 0.0, 1.0);\\r\\n\\r\\n // Pass through UV coords\\r\\n v_uv = a_uv;\\r\\n // Pass through the Opacity to the fragment shader\\r\\n v_opacity = a_opacity;\\r\\n // Pass through the color to the fragment shader\\r\\n v_color = a_color;\\r\\n // Pass through the stroke color to the fragment shader\\r\\n v_strokeColor = a_strokeColor;\\r\\n // Pass through the stroke thickenss to the fragment shader\\r\\n v_strokeThickness = a_strokeThickness;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/image-renderer-v2/image-renderer-v2.frag.glsl\":\n/*!************************************************************************!*\\\n !*** ./Graphics/Context/image-renderer-v2/image-renderer-v2.frag.glsl ***!\n \\************************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nprecision mediump float;\\r\\n\\r\\n// UV coord\\r\\nin vec2 v_texcoord;\\r\\n\\r\\n// Textures in the current draw\\r\\nuniform sampler2D u_textures[%%count%%];\\r\\n\\r\\nuniform bool u_pixelart;\\r\\n\\r\\nin float v_texture_index;\\r\\n\\r\\nin float v_opacity;\\r\\n\\r\\nin vec4 v_tint;\\r\\n\\r\\n// texture resolution\\r\\nin vec2 v_res;\\r\\n\\r\\nin vec2 v_uv_min;\\r\\nin vec2 v_uv_max;\\r\\n\\r\\nout vec4 fragColor;\\r\\n\\r\\n// Inigo Quilez pixel art filter https://jorenjoestar.github.io/post/pixel_art_filtering/\\r\\nvec2 uv_iq(in vec2 uv, in vec2 texture_size) {\\r\\n vec2 pixel = uv * texture_size;\\r\\n\\r\\n vec2 seam=floor(pixel+.5);\\r\\n vec2 dudv=fwidth(pixel);\\r\\n pixel=seam+clamp((pixel-seam)/dudv,-.5,.5);\\r\\n\\r\\n return pixel/texture_size;\\r\\n}\\r\\n\\r\\nfloat lerp(float from, float to, float rel){\\r\\n return ((1. - rel) * from) + (rel * to);\\r\\n}\\r\\n\\r\\nfloat invLerp(float from, float to, float value){\\r\\n return (value - from) / (to - from);\\r\\n}\\r\\n\\r\\nfloat remap(float origFrom, float origTo, float targetFrom, float targetTo, float value){\\r\\n float rel = invLerp(origFrom, origTo, value);\\r\\n return lerp(targetFrom, targetTo, rel);\\r\\n}\\r\\n\\r\\nvoid main(){\\r\\n // In order to support the most efficient sprite batching, we have multiple\\r\\n // textures loaded into the gpu (usually 8) this picker logic skips over textures\\r\\n // that do not apply to a particular sprite.\\r\\n\\r\\n vec4 color=vec4(1.,0,0,1.);\\r\\n\\r\\n // GLSL is templated out to pick the right texture and set the vec4 color\\r\\n vec2 uv = u_pixelart ? uv_iq(v_texcoord, v_res) : v_texcoord;\\r\\n uv.x = remap(0.,1., v_uv_min.x, v_uv_max.x, uv.x);\\r\\n uv.y = remap(0.,1., v_uv_min.y, v_uv_max.y, uv.y);\\r\\n\\r\\n %%texture_picker%%\\r\\n\\r\\n color.rgb = color.rgb * v_opacity;\\r\\n color.a = color.a * v_opacity;\\r\\n fragColor = color * v_tint;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/image-renderer-v2/image-renderer-v2.vert.glsl\":\n/*!************************************************************************!*\\\n !*** ./Graphics/Context/image-renderer-v2/image-renderer-v2.vert.glsl ***!\n \\************************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nlayout(location=0) in vec2 pos;\\r\\nlayout(location=1) in vec2 a_texcoord;\\r\\nout vec2 v_texcoord;\\r\\n\\r\\nlayout(location=2) in vec2 a_offset;\\r\\nlayout(location=3) in vec2 a_mat_column1;\\r\\nlayout(location=4) in vec2 a_mat_column2;\\r\\nlayout(location=5) in vec2 a_mat_column3;\\r\\n\\r\\nlayout(location=6) in float a_opacity;\\r\\nout float v_opacity;\\r\\n\\r\\n// Texture resolution (could be bigger than a_siz)\\r\\nlayout(location=7) in vec2 a_res;\\r\\nout vec2 v_res;\\r\\n\\r\\n// Final size of graphic\\r\\nlayout(location=8) in vec2 a_size;\\r\\n\\r\\nlayout(location=9) in lowp float a_texture_index;\\r\\nout lowp float v_texture_index;\\r\\n\\r\\nlayout(location=10) in vec2 a_uv_min;\\r\\nout vec2 v_uv_min;\\r\\n\\r\\nlayout(location=11) in vec2 a_uv_max;\\r\\nout vec2 v_uv_max;\\r\\n\\r\\nlayout(location=12) in vec4 a_tint;\\r\\nout vec4 v_tint;\\r\\n\\r\\nuniform mat4 u_matrix;\\r\\n\\r\\nvoid main(){\\r\\n mat4 world_mat = mat4(\\r\\n a_mat_column1.x, a_mat_column1.y, 0., 0.,\\r\\n a_mat_column2.x, a_mat_column2.y, 0., 0.,\\r\\n 0. , 0. , 1., 0.,\\r\\n a_mat_column3.x, a_mat_column3.y, 0., 1.\\r\\n );\\r\\n\\r\\n vec2 newPos = vec2(pos.x * a_res.x, pos.y * a_res.y);\\r\\n gl_Position = u_matrix * world_mat * vec4(newPos + a_offset, 0., 1.);\\r\\n\\r\\n v_opacity = a_opacity;\\r\\n v_texcoord = a_texcoord;\\r\\n v_uv_min = a_uv_min;\\r\\n v_uv_max = a_uv_max;\\r\\n v_res = a_res;\\r\\n v_texture_index = a_texture_index;\\r\\n v_tint = a_tint;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/image-renderer/image-renderer.frag.glsl\":\n/*!******************************************************************!*\\\n !*** ./Graphics/Context/image-renderer/image-renderer.frag.glsl ***!\n \\******************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nprecision mediump float;\\r\\n\\r\\n// UV coord\\r\\nin vec2 v_texcoord;\\r\\n\\r\\n// Texture index\\r\\nin lowp float v_textureIndex;\\r\\n\\r\\n// Textures in the current draw\\r\\nuniform sampler2D u_textures[%%count%%];\\r\\n\\r\\nuniform bool u_pixelart;\\r\\n\\r\\n// Opacity\\r\\nin float v_opacity;\\r\\n\\r\\nin vec4 v_tint;\\r\\n\\r\\nin vec2 v_res;\\r\\n\\r\\nout vec4 fragColor;\\r\\n\\r\\n// Inigo Quilez pixel art filter https://jorenjoestar.github.io/post/pixel_art_filtering/\\r\\nvec2 uv_iq(in vec2 uv, in vec2 texture_size) {\\r\\n vec2 pixel = uv * texture_size;\\r\\n \\r\\n vec2 seam=floor(pixel+.5);\\r\\n vec2 dudv=fwidth(pixel);\\r\\n pixel=seam+clamp((pixel-seam)/dudv,-.5,.5);\\r\\n \\r\\n return pixel/texture_size;\\r\\n}\\r\\n\\r\\nvoid main(){\\r\\n // In order to support the most efficient sprite batching, we have multiple\\r\\n // textures loaded into the gpu (usually 8) this picker logic skips over textures\\r\\n // that do not apply to a particular sprite.\\r\\n \\r\\n vec4 color=vec4(1.,0,0,1.);\\r\\n \\r\\n // GLSL is templated out to pick the right texture and set the vec4 color\\r\\n %%texture_picker%%\\r\\n \\r\\n color.rgb=color.rgb*v_opacity;\\r\\n color.a=color.a*v_opacity;\\r\\n fragColor=color*v_tint;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/image-renderer/image-renderer.vert.glsl\":\n/*!******************************************************************!*\\\n !*** ./Graphics/Context/image-renderer/image-renderer.vert.glsl ***!\n \\******************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nin vec2 a_position;\\r\\n\\r\\n// Opacity\\r\\nin float a_opacity;\\r\\nout float v_opacity;\\r\\n\\r\\n// UV coordinate\\r\\nin vec2 a_texcoord;\\r\\nout vec2 v_texcoord;\\r\\n\\r\\n// Texture res\\r\\nin vec2 a_res;\\r\\nout vec2 v_res;\\r\\n\\r\\n// Texture number\\r\\nin lowp float a_textureIndex;\\r\\nout lowp float v_textureIndex;\\r\\n\\r\\nin vec4 a_tint;\\r\\nout vec4 v_tint;\\r\\n\\r\\nuniform mat4 u_matrix;\\r\\n\\r\\nvoid main(){\\r\\n // Set the vertex position using the ortho transform matrix\\r\\n gl_Position=u_matrix*vec4(a_position,0.,1.);\\r\\n \\r\\n // Pass through the Opacity to the fragment shader\\r\\n v_opacity=a_opacity;\\r\\n // Pass through the UV coord to the fragment shader\\r\\n v_texcoord=a_texcoord;\\r\\n\\r\\n v_res = a_res;\\r\\n\\r\\n // Pass through the texture number to the fragment shader\\r\\n v_textureIndex=a_textureIndex;\\r\\n // Pass through the tint\\r\\n v_tint=a_tint;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/line-renderer/line-fragment.glsl\":\n/*!***********************************************************!*\\\n !*** ./Graphics/Context/line-renderer/line-fragment.glsl ***!\n \\***********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nprecision mediump float;\\r\\n\\r\\n// Color\\r\\nin lowp vec4 v_color;\\r\\n\\r\\nout vec4 fragColor;\\r\\n\\r\\nvoid main() {\\r\\n fragColor = v_color;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/line-renderer/line-vertex.glsl\":\n/*!*********************************************************!*\\\n !*** ./Graphics/Context/line-renderer/line-vertex.glsl ***!\n \\*********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nin vec2 a_position;\\r\\nin vec4 a_color;\\r\\n\\r\\nout lowp vec4 v_color;\\r\\n\\r\\nuniform mat4 u_matrix;\\r\\n\\r\\nvoid main() {\\r\\n // Set the vertex position using the ortho transform matrix\\r\\n gl_Position = u_matrix * vec4(a_position, 0.0, 1.0);\\r\\n\\r\\n // Passthrough the color\\r\\n v_color = a_color;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/particle-renderer/particle-fragment.glsl\":\n/*!*******************************************************************!*\\\n !*** ./Graphics/Context/particle-renderer/particle-fragment.glsl ***!\n \\*******************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nprecision mediump float;\\r\\n\\r\\nuniform sampler2D graphic;\\r\\nuniform bool useTexture;\\r\\nuniform float maxLifeMs;\\r\\n\\r\\nuniform vec4 beginColor;\\r\\nuniform vec4 endColor;\\r\\nuniform bool fade;\\r\\nuniform float startOpacity;\\r\\n\\r\\nin float finalRotation;\\r\\nin float finalLifeMs;\\r\\nout vec4 fragColor;\\r\\n\\r\\nvoid main(){\\r\\n\\r\\n float lifePct = finalLifeMs / maxLifeMs;\\r\\n\\r\\n if (useTexture) {\\r\\n /** Draw texture */\\r\\n if (lifePct <= 0.) discard;\\r\\n float mid = .5;\\r\\n float cosine = cos(finalRotation);\\r\\n float sine = sin(finalRotation);\\r\\n vec2 rotated = vec2(cosine * (gl_PointCoord.x - mid) + sine * (gl_PointCoord.y - mid) + mid,\\r\\n cosine * (gl_PointCoord.y - mid) - sine * (gl_PointCoord.x - mid) + mid);\\r\\n vec4 color = texture(graphic, rotated);\\r\\n fragColor = color * (fade ? lifePct : 1.0);\\r\\n } else {\\r\\n /** Draw circle */\\r\\n if (lifePct <= 0.) discard;\\r\\n vec2 uv = gl_PointCoord.xy * 2.0 - 1.0;\\r\\n float dist = 1.0 - length(uv);\\r\\n float edge = fwidth(dot(uv, uv));\\r\\n float circle = smoothstep(-edge/2.0, edge/2.0, dist);\\r\\n vec3 color = mix(beginColor.rgb, endColor.rgb, 1.0 - lifePct);\\r\\n fragColor.rgb = color;\\r\\n fragColor.a = startOpacity * circle * (fade ? lifePct : 1.0);// * mix(beginColor.a, endColor.a, 1.0 - lifePct);\\r\\n fragColor.rgb *= fragColor.a;\\r\\n }\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/particle-renderer/particle-vertex.glsl\":\n/*!*****************************************************************!*\\\n !*** ./Graphics/Context/particle-renderer/particle-vertex.glsl ***!\n \\*****************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nprecision mediump float;\\r\\n\\r\\nuniform float deltaMs;\\r\\nuniform float maxLifeMs;\\r\\nuniform vec2 gravity;\\r\\nuniform vec2 focus;\\r\\nuniform float focusAccel;\\r\\nuniform mat4 u_matrix;\\r\\nuniform mat4 u_transform;\\r\\nuniform float startSize;\\r\\nuniform float endSize;\\r\\n// uniform sampler2D obstacle;\\r\\n\\r\\nlayout(location=0)in vec2 position;\\r\\nlayout(location=1)in vec2 velocity;\\r\\nlayout(location=2)in float rotation;\\r\\nlayout(location=3)in float angularVelocity;\\r\\nlayout(location=4)in float lifeMs;\\r\\n\\r\\n// TODO z index to handle buffer wrapping?\\r\\n\\r\\n// DO NOT RE-ORDER\\r\\nout vec2 finalPosition;\\r\\nout vec2 finalVelocity;\\r\\nout float finalRotation;\\r\\nout float finalAngularVelocity;\\r\\nout float finalLifeMs;\\r\\nvoid main(){\\r\\n // Evolve particle\\r\\n float seconds = deltaMs / 1000.;\\r\\n // euler integration\\r\\n // Weird artifact of re-using the same buffer layout for update/draw\\r\\n // we need differently named variables\\r\\n vec2 finalGravity = gravity + normalize(focus - position) * focusAccel;\\r\\n finalVelocity = velocity + finalGravity * seconds;\\r\\n finalPosition = position + velocity * seconds + finalGravity * .5 * seconds * seconds;\\r\\n finalRotation = rotation + angularVelocity * seconds;\\r\\n finalAngularVelocity = angularVelocity;\\r\\n finalLifeMs = clamp(lifeMs - deltaMs, 0., maxLifeMs);\\r\\n\\r\\n // Collision mask sampling\\r\\n // vec2 samplePoint = finalPosition / vec2(width, height);\\r\\n // vec4 collides = texture(obstacle, samplePoint);\\r\\n // if (distance(collides,vec4(0.)) > .01) {\\r\\n // // non opaque means we collide! recalc final pos/vel\\r\\n // vec2 newVelocity = velocity * -.1;// lose energy\\r\\n // finalVelocity = newVelocity + gravity * seconds;\\r\\n // finalPosition = position + newVelocity * seconds + gravity * .5 * seconds * seconds;\\r\\n // }\\r\\n\\r\\n float lifePercent = finalLifeMs / maxLifeMs;\\r\\n vec2 transformedPos = (u_matrix * u_transform * vec4(finalPosition,0.,1.)).xy;\\r\\n float scale = sqrt(u_transform[0][0] * u_transform[0][0] + u_transform[1][1] * u_transform[1][1]);\\r\\n gl_Position = vec4(transformedPos, 1.0 - lifePercent, 1.); // use life percent to sort z\\r\\n gl_PointSize = mix(startSize, endSize, 1.0 - lifePercent) * scale;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/point-renderer/point-fragment.glsl\":\n/*!*************************************************************!*\\\n !*** ./Graphics/Context/point-renderer/point-fragment.glsl ***!\n \\*************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\n\\r\\nprecision mediump float;\\r\\nin lowp vec4 v_color;\\r\\n\\r\\nout vec4 fragColor;\\r\\n\\r\\nvoid main() {\\r\\n float r = 0.0, delta = 0.0, alpha = 1.0;\\r\\n vec2 cxy = 2.0 * gl_PointCoord - 1.0;\\r\\n r = dot(cxy, cxy);\\r\\n\\r\\n delta = fwidth(r);\\r\\n alpha = 1.0 - smoothstep(1.0 - delta, 1.0 + delta, r);\\r\\n // \\\"premultiply\\\" the color by alpha\\r\\n vec4 color = v_color;\\r\\n color.a = color.a * alpha;\\r\\n color.rgb = color.rgb * color.a;\\r\\n fragColor = color;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/point-renderer/point-vertex.glsl\":\n/*!***********************************************************!*\\\n !*** ./Graphics/Context/point-renderer/point-vertex.glsl ***!\n \\***********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nin vec2 a_position;\\r\\nin vec4 a_color;\\r\\nin float a_size;\\r\\nout lowp vec4 v_color;\\r\\nuniform mat4 u_matrix;\\r\\n\\r\\nvoid main() {\\r\\n gl_Position = u_matrix * vec4(a_position, 0.0, 1.0);\\r\\n gl_PointSize = a_size * 2.0;\\r\\n v_color = a_color;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/rectangle-renderer/rectangle-renderer.frag.glsl\":\n/*!**************************************************************************!*\\\n !*** ./Graphics/Context/rectangle-renderer/rectangle-renderer.frag.glsl ***!\n \\**************************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\n\\r\\nprecision mediump float;\\r\\n\\r\\n// UV coord\\r\\nin vec2 v_uv;\\r\\n\\r\\nin vec2 v_size; // in pixels\\r\\n\\r\\n// Color coord to blend with image\\r\\nin lowp vec4 v_color;\\r\\n\\r\\n// Stroke color if used\\r\\nin lowp vec4 v_strokeColor;\\r\\n\\r\\n// Stroke thickness if used\\r\\nin lowp float v_strokeThickness; // in pixels\\r\\n\\r\\n// Opacity\\r\\nin float v_opacity;\\r\\n\\r\\nout vec4 fragColor;\\r\\n\\r\\nvoid main() {\\r\\n // modified from https://stackoverflow.com/questions/59197671/glsl-rounded-rectangle-with-variable-border\\r\\n vec2 uv = v_uv;\\r\\n vec2 fragCoord = uv * v_size;\\r\\n float maxX = v_size.x - v_strokeThickness;\\r\\n float minX = v_strokeThickness;\\r\\n float maxY = v_size.y - v_strokeThickness;\\r\\n float minY = v_strokeThickness;\\r\\n\\r\\n if (fragCoord.x < maxX && fragCoord.x > minX &&\\r\\n fragCoord.y < maxY && fragCoord.y > minY) {\\r\\n fragColor = v_color;\\r\\n } else {\\r\\n fragColor = v_strokeColor;\\r\\n }\\r\\n fragColor.a *= v_opacity;\\r\\n fragColor.rgb *= fragColor.a;\\r\\n\\r\\n // vec2 v2CenteredPos = abs(fragCoord - v_size.xy / 2.0);\\r\\n // vec2 v2HalfShapeSizePx = v_size.xy/2.0 - v_strokeThickness/2.0;\\r\\n\\r\\n // float fHalfBorderDist = 0.0;\\r\\n // float fHalfBorderThickness = 0.0;\\r\\n\\r\\n // if (fragCoord.x > max(v_radius, v_strokeThickness) && \\r\\n // fragCoord.x < v_size.x - max(v_radius, v_strokeThickness))\\r\\n // {\\r\\n // fHalfBorderDist = v2CenteredPos.y - v2HalfShapeSizePx.y;\\r\\n // fHalfBorderThickness = v_strokeThickness / 2.0;\\r\\n // }\\r\\n // else if (fragCoord.y > max(v_radius, v_strokeThickness) && \\r\\n // fragCoord.y < v_size.y - max(v_radius, v_strokeThickness))\\r\\n // {\\r\\n // fHalfBorderDist = v2CenteredPos.x - v2HalfShapeSizePx.x;\\r\\n // fHalfBorderThickness = v_strokeThickness / 2.0;\\r\\n // }\\r\\n // else\\r\\n // {\\r\\n // vec2 edgeVec = max(vec2(0.0), v_radius - vec2(\\r\\n // uv.x > 0.5 ? v_size.x - fragCoord.x : fragCoord.x,\\r\\n // uv.y > 0.5 ? v_size.y - fragCoord.y : fragCoord.y));\\r\\n \\r\\n // float ellipse_ab = v_radius-v_strokeThickness;\\r\\n // vec2 ellipse_isect = (v_strokeThickness > v_radius || v_strokeThickness > v_radius) ? vec2(0.0) :\\r\\n // edgeVec.xy * ellipse_ab*ellipse_ab / length(ellipse_ab*edgeVec.yx); \\r\\n \\r\\n // fHalfBorderThickness = (v_radius - length(ellipse_isect)) / 2.0;\\r\\n // fHalfBorderDist = length(edgeVec) - (v_radius - fHalfBorderThickness);\\r\\n // }\\r\\n\\r\\n // vec4 v4FromColor = v_strokeColor;\\r\\n // v4FromColor.rgb *= v4FromColor.a;\\r\\n // vec4 v4ToColor = vec4(0.0); // background color is transparent\\r\\n // if (fHalfBorderDist < 0.0) {\\r\\n // v4ToColor = v_color;\\r\\n // v4ToColor.rgb *= v4ToColor.a;\\r\\n // }\\r\\n\\r\\n // float mixPct = abs(fHalfBorderDist) - fHalfBorderThickness;\\r\\n\\r\\n // vec4 finalColor = mix(v4FromColor, v4ToColor, mixPct);\\r\\n // gl_FragColor = finalColor;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/rectangle-renderer/rectangle-renderer.vert.glsl\":\n/*!**************************************************************************!*\\\n !*** ./Graphics/Context/rectangle-renderer/rectangle-renderer.vert.glsl ***!\n \\**************************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nin vec2 a_position;\\r\\n\\r\\n// UV coordinate\\r\\nin vec2 a_uv;\\r\\nout vec2 v_uv;\\r\\n\\r\\nin vec2 a_size;\\r\\nout vec2 v_size;\\r\\n\\r\\n// Opacity \\r\\nin float a_opacity;\\r\\nout float v_opacity;\\r\\n\\r\\nin vec4 a_color;\\r\\nout vec4 v_color;\\r\\n\\r\\nin vec4 a_strokeColor;\\r\\nout vec4 v_strokeColor;\\r\\n\\r\\nin float a_strokeThickness;\\r\\nout float v_strokeThickness;\\r\\n\\r\\nuniform mat4 u_matrix;\\r\\n\\r\\n\\r\\nvoid main() {\\r\\n // Set the vertex position using the ortho transform matrix\\r\\n gl_Position = u_matrix * vec4(a_position, 0.0, 1.0);\\r\\n\\r\\n // Pass through UV coords\\r\\n v_uv = a_uv;\\r\\n // Pass through size\\r\\n v_size = a_size;\\r\\n // Pass through the Opacity to the fragment shader\\r\\n v_opacity = a_opacity;\\r\\n // Pass through the color to the fragment shader\\r\\n v_color = a_color;\\r\\n // Pass through the stroke color to the fragment shader\\r\\n v_strokeColor = a_strokeColor;\\r\\n // Pass through the stroke thickenss to the fragment shader\\r\\n v_strokeThickness = a_strokeThickness;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/screen-pass-painter/screen-fragment.glsl\":\n/*!*******************************************************************!*\\\n !*** ./Graphics/Context/screen-pass-painter/screen-fragment.glsl ***!\n \\*******************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nprecision mediump float;\\r\\n\\r\\n// Passed in from the vertex shader.\\r\\nin vec2 v_texcoord;\\r\\n\\r\\n// The texture.\\r\\nuniform sampler2D u_texture;\\r\\n\\r\\nout vec4 fragColor;\\r\\n\\r\\nvoid main() {\\r\\n fragColor = texture(u_texture, v_texcoord);\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/screen-pass-painter/screen-vertex.glsl\":\n/*!*****************************************************************!*\\\n !*** ./Graphics/Context/screen-pass-painter/screen-vertex.glsl ***!\n \\*****************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nin vec2 a_position;\\r\\n\\r\\nin vec2 a_texcoord;\\r\\nout vec2 v_texcoord;\\r\\n\\r\\nvoid main() {\\r\\n gl_Position = vec4(a_position, 0.0, 1.0);\\r\\n\\r\\n // Pass the texcoord to the fragment shader.\\r\\n v_texcoord = a_texcoord;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/PostProcessor/color-blind-fragment.glsl\":\n/*!**********************************************************!*\\\n !*** ./Graphics/PostProcessor/color-blind-fragment.glsl ***!\n \\**********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nprecision mediump float;\\r\\n// our texture\\r\\nuniform sampler2D u_image;\\r\\n// the texCoords passed in from the vertex shader.\\r\\nin vec2 v_texcoord;\\r\\n\\r\\n// color blind type\\r\\nuniform int u_type;\\r\\n\\r\\n// simulation?\\r\\nuniform bool u_simulate;\\r\\n\\r\\nout vec4 fragColor;\\r\\n\\r\\nvoid main() {\\r\\n vec4 o = texture(u_image, v_texcoord);\\r\\n // RGB to LMS matrix conversion\\r\\n float L = (17.8824 * o.r) + (43.5161 * o.g) + (4.11935 * o.b);\\r\\n float M = (3.45565 * o.r) + (27.1554 * o.g) + (3.86714 * o.b);\\r\\n float S = (0.0299566 * o.r) + (0.184309 * o.g) + (1.46709 * o.b);\\r\\n // Simulate color blindness\\r\\n float l;\\r\\n float m;\\r\\n float s;\\r\\n //MODE CODE//\\r\\n if (u_type == 0) {\\r\\n // Protanope\\r\\n l = 0.0 * L + 2.02344 * M + -2.52581 * S;\\r\\n m = 0.0 * L + 1.0 * M + 0.0 * S;\\r\\n s = 0.0 * L + 0.0 * M + 1.0 * S;;\\r\\n } else if (u_type == 1) {\\r\\n // Deuteranope\\r\\n l = 1.0 * L + 0.0 * M + 0.0 * S;\\r\\n m = 0.494207 * L + 0.0 * M + 1.24827 * S;\\r\\n s = 0.0 * L + 0.0 * M + 1.0 * S;\\r\\n } else if (u_type == 2) {\\r\\n // Tritanope\\r\\n l = 1.0 * L + 0.0 * M + 0.0 * S;\\r\\n m = 0.0 * L + 1.0 * M + 0.0 * S;\\r\\n s = -0.395913 * L + 0.801109 * M + 0.0 * S;\\r\\n }\\r\\n\\r\\n // LMS to RGB matrix conversion\\r\\n vec4 error; // simulate the colors\\r\\n error.r = (0.0809444479 * l) + (-0.130504409 * m) + (0.116721066 * s);\\r\\n error.g = (-0.0102485335 * l) + (0.0540193266 * m) + (-0.113614708 * s);\\r\\n error.b = (-0.000365296938 * l) + (-0.00412161469 * m) + (0.693511405 * s);\\r\\n error.a = 1.0;\\r\\n vec4 diff = o - error;\\r\\n vec4 correction; // correct the colors\\r\\n correction.r = 0.0;\\r\\n correction.g = (diff.r * 0.7) + (diff.g * 1.0);\\r\\n correction.b = (diff.r * 0.7) + (diff.b * 1.0);\\r\\n correction = o + correction;\\r\\n correction.a = o.a;\\r\\n //SIMULATE//\\r\\n\\r\\n // sim \\r\\n if (u_simulate) {\\r\\n fragColor = error.rgba;\\r\\n } else {\\r\\n fragColor = correction.rgba;\\r\\n }\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Actions/Action.ts\":\n/*!***************************!*\\\n !*** ./Actions/Action.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ nextActionId: () => (/* binding */ nextActionId)\n/* harmony export */ });\nlet _ACTION_ID = 0;\n/**\n *\n */\nfunction nextActionId() {\n return _ACTION_ID++;\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/ActionContext.ts\":\n/*!**********************************!*\\\n !*** ./Actions/ActionContext.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ActionContext: () => (/* binding */ ActionContext)\n/* harmony export */ });\n/* harmony import */ var _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Util/EasingFunctions */ \"./Util/EasingFunctions.ts\");\n/* harmony import */ var _ActionQueue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ActionQueue */ \"./Actions/ActionQueue.ts\");\n/* harmony import */ var _Action_Repeat__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./Action/Repeat */ \"./Actions/Action/Repeat.ts\");\n/* harmony import */ var _Action_RepeatForever__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./Action/RepeatForever */ \"./Actions/Action/RepeatForever.ts\");\n/* harmony import */ var _Action_MoveBy__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Action/MoveBy */ \"./Actions/Action/MoveBy.ts\");\n/* harmony import */ var _Action_MoveTo__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Action/MoveTo */ \"./Actions/Action/MoveTo.ts\");\n/* harmony import */ var _Action_RotateTo__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Action/RotateTo */ \"./Actions/Action/RotateTo.ts\");\n/* harmony import */ var _Action_RotateBy__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Action/RotateBy */ \"./Actions/Action/RotateBy.ts\");\n/* harmony import */ var _Action_ScaleTo__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Action/ScaleTo */ \"./Actions/Action/ScaleTo.ts\");\n/* harmony import */ var _Action_ScaleBy__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Action/ScaleBy */ \"./Actions/Action/ScaleBy.ts\");\n/* harmony import */ var _Action_CallMethod__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Action/CallMethod */ \"./Actions/Action/CallMethod.ts\");\n/* harmony import */ var _Action_EaseTo__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Action/EaseTo */ \"./Actions/Action/EaseTo.ts\");\n/* harmony import */ var _Action_EaseBy__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Action/EaseBy */ \"./Actions/Action/EaseBy.ts\");\n/* harmony import */ var _Action_Blink__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Action/Blink */ \"./Actions/Action/Blink.ts\");\n/* harmony import */ var _Action_Fade__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Action/Fade */ \"./Actions/Action/Fade.ts\");\n/* harmony import */ var _Action_Delay__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Action/Delay */ \"./Actions/Action/Delay.ts\");\n/* harmony import */ var _Action_Die__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./Action/Die */ \"./Actions/Action/Die.ts\");\n/* harmony import */ var _Action_Follow__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./Action/Follow */ \"./Actions/Action/Follow.ts\");\n/* harmony import */ var _Action_Meet__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./Action/Meet */ \"./Actions/Action/Meet.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Math */ \"./Math/vector.ts\");\n/* harmony import */ var _Action_Flash__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Action/Flash */ \"./Actions/Action/Flash.ts\");\n/* harmony import */ var _Action_CurveTo__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Action/CurveTo */ \"./Actions/Action/CurveTo.ts\");\n/* harmony import */ var _Action_CurveBy__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Action/CurveBy */ \"./Actions/Action/CurveBy.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * The fluent Action API allows you to perform \"actions\" on\n * {@apilink Actor | `actors`} such as following, moving, rotating, and\n * more. You can implement your own actions by implementing\n * the {@apilink Action} interface.\n */\nclass ActionContext {\n constructor(entity) {\n this._entity = entity;\n this._queue = new _ActionQueue__WEBPACK_IMPORTED_MODULE_0__.ActionQueue(entity);\n }\n getQueue() {\n return this._queue;\n }\n update(elapsed) {\n this._queue.update(elapsed);\n }\n /**\n * Clears all queued actions from the Actor\n */\n clearActions() {\n this._queue.clearActions();\n }\n runAction(action) {\n action.reset();\n this._queue.add(action);\n return this;\n }\n /**\n * Animates an actor with a specified bezier curve by an offset to the current position, the start point is assumed\n * to be the actors current position\n * @param options\n */\n curveBy(options) {\n this._queue.add(new _Action_CurveBy__WEBPACK_IMPORTED_MODULE_1__.CurveBy(this._entity, options));\n return this;\n }\n /**\n * Animates an actor with a specified bezier curve to an absolute world space coordinate, the start point is assumed\n * to be the actors current position\n * @param options\n */\n curveTo(options) {\n this._queue.add(new _Action_CurveTo__WEBPACK_IMPORTED_MODULE_2__.CurveTo(this._entity, options));\n return this;\n }\n easeTo(...args) {\n var _a, _b;\n let x = 0;\n let y = 0;\n let duration = 0;\n let easingFcn = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_3__.EasingFunctions.Linear;\n if (args[0] instanceof _Math__WEBPACK_IMPORTED_MODULE_4__.Vector) {\n x = args[0].x;\n y = args[0].y;\n duration = args[1];\n easingFcn = (_a = args[2]) !== null && _a !== void 0 ? _a : easingFcn;\n }\n else {\n x = args[0];\n y = args[1];\n duration = args[2];\n easingFcn = (_b = args[3]) !== null && _b !== void 0 ? _b : easingFcn;\n }\n this._queue.add(new _Action_EaseTo__WEBPACK_IMPORTED_MODULE_5__.EaseTo(this._entity, x, y, duration, easingFcn));\n return this;\n }\n easeBy(...args) {\n var _a, _b;\n let offsetX = 0;\n let offsetY = 0;\n let duration = 0;\n let easingFcn = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_3__.EasingFunctions.Linear;\n if (args[0] instanceof _Math__WEBPACK_IMPORTED_MODULE_4__.Vector) {\n offsetX = args[0].x;\n offsetY = args[0].y;\n duration = args[1];\n easingFcn = (_a = args[2]) !== null && _a !== void 0 ? _a : easingFcn;\n }\n else {\n offsetX = args[0];\n offsetY = args[1];\n duration = args[2];\n easingFcn = (_b = args[3]) !== null && _b !== void 0 ? _b : easingFcn;\n }\n this._queue.add(new _Action_EaseBy__WEBPACK_IMPORTED_MODULE_6__.EaseBy(this._entity, offsetX, offsetY, duration, easingFcn));\n return this;\n }\n moveTo(xOrPosOrOptions, yOrSpeed, speedOrUndefined) {\n let x = 0;\n let y = 0;\n let speed = 0;\n if (xOrPosOrOptions instanceof _Math__WEBPACK_IMPORTED_MODULE_4__.Vector) {\n x = xOrPosOrOptions.x;\n y = xOrPosOrOptions.y;\n speed = +(yOrSpeed !== null && yOrSpeed !== void 0 ? yOrSpeed : 0);\n this._queue.add(new _Action_MoveTo__WEBPACK_IMPORTED_MODULE_7__.MoveTo(this._entity, x, y, speed));\n }\n else if (typeof xOrPosOrOptions === 'number' && typeof yOrSpeed === 'number' && typeof speedOrUndefined === 'number') {\n x = xOrPosOrOptions;\n y = yOrSpeed;\n speed = speedOrUndefined;\n this._queue.add(new _Action_MoveTo__WEBPACK_IMPORTED_MODULE_7__.MoveTo(this._entity, x, y, speed));\n }\n else if ((0,_Action_MoveTo__WEBPACK_IMPORTED_MODULE_7__.isMoveToOptions)(xOrPosOrOptions)) {\n this._queue.add(new _Action_MoveTo__WEBPACK_IMPORTED_MODULE_7__.MoveToWithOptions(this._entity, xOrPosOrOptions));\n }\n return this;\n }\n moveBy(xOffsetOrVectorOrOptions, yOffsetOrSpeed, speedOrUndefined) {\n let xOffset = 0;\n let yOffset = 0;\n let speed = 0;\n if (xOffsetOrVectorOrOptions instanceof _Math__WEBPACK_IMPORTED_MODULE_4__.Vector && typeof yOffsetOrSpeed === 'number') {\n xOffset = xOffsetOrVectorOrOptions.x;\n yOffset = xOffsetOrVectorOrOptions.y;\n speed = yOffsetOrSpeed;\n this._queue.add(new _Action_MoveBy__WEBPACK_IMPORTED_MODULE_8__.MoveBy(this._entity, xOffset, yOffset, speed));\n }\n else if (typeof xOffsetOrVectorOrOptions === 'number' && typeof yOffsetOrSpeed === 'number' && typeof speedOrUndefined === 'number') {\n xOffset = xOffsetOrVectorOrOptions;\n yOffset = yOffsetOrSpeed;\n speed = speedOrUndefined;\n this._queue.add(new _Action_MoveBy__WEBPACK_IMPORTED_MODULE_8__.MoveBy(this._entity, xOffset, yOffset, speed));\n }\n else if ((0,_Action_MoveBy__WEBPACK_IMPORTED_MODULE_8__.isMoveByOptions)(xOffsetOrVectorOrOptions)) {\n this._queue.add(new _Action_MoveBy__WEBPACK_IMPORTED_MODULE_8__.MoveByWithOptions(this._entity, xOffsetOrVectorOrOptions));\n }\n return this;\n }\n rotateTo(angleRadiansOrOptions, speed, rotationType) {\n if (typeof angleRadiansOrOptions === 'number' && typeof speed === 'number') {\n this._queue.add(new _Action_RotateTo__WEBPACK_IMPORTED_MODULE_9__.RotateTo(this._entity, angleRadiansOrOptions, speed, rotationType));\n }\n else if (typeof angleRadiansOrOptions === 'object') {\n this._queue.add(new _Action_RotateTo__WEBPACK_IMPORTED_MODULE_9__.RotateToWithOptions(this._entity, angleRadiansOrOptions));\n }\n return this;\n }\n rotateBy(angleRadiansOffsetOrOptions, speed, rotationType) {\n if (typeof angleRadiansOffsetOrOptions === 'object') {\n this._queue.add(new _Action_RotateBy__WEBPACK_IMPORTED_MODULE_10__.RotateByWithOptions(this._entity, angleRadiansOffsetOrOptions));\n }\n else {\n this._queue.add(new _Action_RotateBy__WEBPACK_IMPORTED_MODULE_10__.RotateBy(this._entity, angleRadiansOffsetOrOptions, speed, rotationType));\n }\n return this;\n }\n scaleTo(sizeXOrVectorOrOptions, sizeYOrSpeed, speedXOrUndefined, speedYOrUndefined) {\n let sizeX = 1;\n let sizeY = 1;\n let speedX = 0;\n let speedY = 0;\n if ((0,_Action_ScaleTo__WEBPACK_IMPORTED_MODULE_11__.isScaleToOptions)(sizeXOrVectorOrOptions)) {\n this._queue.add(new _Action_ScaleTo__WEBPACK_IMPORTED_MODULE_11__.ScaleToWithOptions(this._entity, sizeXOrVectorOrOptions));\n return this;\n }\n if (sizeXOrVectorOrOptions instanceof _Math__WEBPACK_IMPORTED_MODULE_4__.Vector && sizeYOrSpeed instanceof _Math__WEBPACK_IMPORTED_MODULE_4__.Vector) {\n sizeX = sizeXOrVectorOrOptions.x;\n sizeY = sizeXOrVectorOrOptions.y;\n speedX = sizeYOrSpeed.x;\n speedY = sizeYOrSpeed.y;\n }\n if (typeof sizeXOrVectorOrOptions === 'number' && typeof sizeYOrSpeed === 'number') {\n sizeX = sizeXOrVectorOrOptions;\n sizeY = sizeYOrSpeed;\n speedX = speedXOrUndefined;\n speedY = speedYOrUndefined;\n }\n this._queue.add(new _Action_ScaleTo__WEBPACK_IMPORTED_MODULE_11__.ScaleTo(this._entity, sizeX, sizeY, speedX, speedY));\n return this;\n }\n scaleBy(sizeOffsetXOrVectorOrOptions, sizeOffsetYOrSpeed, speed) {\n if ((0,_Action_ScaleBy__WEBPACK_IMPORTED_MODULE_12__.isScaleByOptions)(sizeOffsetXOrVectorOrOptions)) {\n this._queue.add(new _Action_ScaleBy__WEBPACK_IMPORTED_MODULE_12__.ScaleByWithOptions(this._entity, sizeOffsetXOrVectorOrOptions));\n return this;\n }\n let sizeOffsetX = 1;\n let sizeOffsetY = 1;\n if (sizeOffsetXOrVectorOrOptions instanceof _Math__WEBPACK_IMPORTED_MODULE_4__.Vector) {\n sizeOffsetX = sizeOffsetXOrVectorOrOptions.x;\n sizeOffsetY = sizeOffsetXOrVectorOrOptions.y;\n speed = sizeOffsetYOrSpeed;\n }\n if (typeof sizeOffsetXOrVectorOrOptions === 'number' && typeof sizeOffsetYOrSpeed === 'number') {\n sizeOffsetX = sizeOffsetXOrVectorOrOptions;\n sizeOffsetY = sizeOffsetYOrSpeed;\n }\n this._queue.add(new _Action_ScaleBy__WEBPACK_IMPORTED_MODULE_12__.ScaleBy(this._entity, sizeOffsetX, sizeOffsetY, speed));\n return this;\n }\n /**\n * This method will cause an actor to blink (become visible and not\n * visible). Optionally, you may specify the number of blinks. Specify the amount of time\n * the actor should be visible per blink, and the amount of time not visible.\n * This method is part of the actor 'Action' fluent API allowing action chaining.\n * @param timeVisible The amount of time to stay visible per blink in milliseconds\n * @param timeNotVisible The amount of time to stay not visible per blink in milliseconds\n * @param numBlinks The number of times to blink\n */\n blink(timeVisible, timeNotVisible, numBlinks = 1) {\n this._queue.add(new _Action_Blink__WEBPACK_IMPORTED_MODULE_13__.Blink(this._entity, timeVisible, timeNotVisible, numBlinks));\n return this;\n }\n /**\n * This method will cause an actor's opacity to change from its current value\n * to the provided value by a specified time (in milliseconds). This method is\n * part of the actor 'Action' fluent API allowing action chaining.\n * @param opacity The ending opacity\n * @param duration The time it should take to fade the actor (in milliseconds)\n */\n fade(opacity, duration) {\n this._queue.add(new _Action_Fade__WEBPACK_IMPORTED_MODULE_14__.Fade(this._entity, opacity, duration));\n return this;\n }\n /**\n * This will cause an actor to flash a specific color for a period of time\n * @param color\n * @param duration The duration in milliseconds\n */\n flash(color, duration = 1000) {\n this._queue.add(new _Action_Flash__WEBPACK_IMPORTED_MODULE_15__.Flash(this._entity, color, duration));\n return this;\n }\n /**\n * This method will delay the next action from executing for a certain\n * amount of time (in milliseconds). This method is part of the actor\n * 'Action' fluent API allowing action chaining.\n * @param duration The amount of time to delay the next action in the queue from executing in milliseconds\n */\n delay(duration) {\n this._queue.add(new _Action_Delay__WEBPACK_IMPORTED_MODULE_16__.Delay(duration));\n return this;\n }\n /**\n * This method will add an action to the queue that will remove the actor from the\n * scene once it has completed its previous Any actions on the\n * action queue after this action will not be executed.\n */\n die() {\n this._queue.add(new _Action_Die__WEBPACK_IMPORTED_MODULE_17__.Die(this._entity));\n return this;\n }\n /**\n * This method allows you to call an arbitrary method as the next action in the\n * action queue. This is useful if you want to execute code in after a specific\n * action, i.e An actor arrives at a destination after traversing a path\n */\n callMethod(method) {\n this._queue.add(new _Action_CallMethod__WEBPACK_IMPORTED_MODULE_18__.CallMethod(method));\n return this;\n }\n /**\n * This method will cause the actor to repeat all of the actions built in\n * the `repeatBuilder` callback. If the number of repeats\n * is not specified it will repeat forever. This method is part of\n * the actor 'Action' fluent API allowing action chaining\n *\n * ```typescript\n * // Move up in a zig-zag by repeated moveBy's\n * actor.actions.repeat(repeatCtx => {\n * repeatCtx.moveBy(10, 0, 10);\n * repeatCtx.moveBy(0, 10, 10);\n * }, 5);\n * ```\n * @param repeatBuilder The builder to specify the repeatable list of actions\n * @param times The number of times to repeat all the previous actions in the action queue. If nothing is specified the actions\n * will repeat forever\n */\n repeat(repeatBuilder, times) {\n if (!times) {\n this.repeatForever(repeatBuilder);\n return this;\n }\n this._queue.add(new _Action_Repeat__WEBPACK_IMPORTED_MODULE_19__.Repeat(this._entity, repeatBuilder, times));\n return this;\n }\n /**\n * This method will cause the actor to repeat all of the actions built in\n * the `repeatBuilder` callback. If the number of repeats\n * is not specified it will repeat forever. This method is part of\n * the actor 'Action' fluent API allowing action chaining\n *\n * ```typescript\n * // Move up in a zig-zag by repeated moveBy's\n * actor.actions.repeat(repeatCtx => {\n * repeatCtx.moveBy(10, 0, 10);\n * repeatCtx.moveBy(0, 10, 10);\n * }, 5);\n * ```\n * @param repeatBuilder The builder to specify the repeatable list of actions\n */\n repeatForever(repeatBuilder) {\n this._queue.add(new _Action_RepeatForever__WEBPACK_IMPORTED_MODULE_20__.RepeatForever(this._entity, repeatBuilder));\n return this;\n }\n /**\n * This method will cause the entity to follow another at a specified distance\n * @param entity The entity to follow\n * @param followDistance The distance to maintain when following, if not specified the actor will follow at the current distance.\n */\n follow(entity, followDistance) {\n if (followDistance === undefined) {\n this._queue.add(new _Action_Follow__WEBPACK_IMPORTED_MODULE_21__.Follow(this._entity, entity));\n }\n else {\n this._queue.add(new _Action_Follow__WEBPACK_IMPORTED_MODULE_21__.Follow(this._entity, entity, followDistance));\n }\n return this;\n }\n /**\n * This method will cause the entity to move towards another until they\n * collide \"meet\" at a specified speed.\n * @param entity The entity to meet\n * @param speed The speed in pixels per second to move, if not specified it will match the speed of the other actor\n */\n meet(entity, speed) {\n if (speed === undefined) {\n this._queue.add(new _Action_Meet__WEBPACK_IMPORTED_MODULE_22__.Meet(this._entity, entity));\n }\n else {\n this._queue.add(new _Action_Meet__WEBPACK_IMPORTED_MODULE_22__.Meet(this._entity, entity, speed));\n }\n return this;\n }\n /**\n * Returns a promise that resolves when the current action queue up to now\n * is finished.\n */\n toPromise() {\n const temp = new Promise((resolve) => {\n this._queue.add(new _Action_CallMethod__WEBPACK_IMPORTED_MODULE_18__.CallMethod(() => {\n resolve();\n }));\n });\n return temp;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/ActionQueue.ts\":\n/*!********************************!*\\\n !*** ./Actions/ActionQueue.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ActionQueue: () => (/* binding */ ActionQueue)\n/* harmony export */ });\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n\n/**\n * Action Queues represent an ordered sequence of actions\n *\n * Action queues are part of the {@apilink ActionContext | `Action API`} and\n * store the list of actions to be executed for an {@apilink Actor}.\n *\n * Actors implement {@apilink Actor.actions} which can be manipulated by\n * advanced users to adjust the actions currently being executed in the\n * queue.\n */\nclass ActionQueue {\n constructor(entity) {\n this._actions = [];\n this._currentAction = null;\n this._completedActions = [];\n this._entity = entity;\n }\n /**\n * Add an action to the sequence\n * @param action\n */\n add(action) {\n this._actions.push(action);\n }\n /**\n * Remove an action by reference from the sequence\n * @param action\n */\n remove(action) {\n const index = this._actions.indexOf(action);\n this._actions.splice(index, 1);\n }\n /**\n * Removes all actions from this sequence\n */\n clearActions() {\n this._actions.length = 0;\n this._completedActions.length = 0;\n if (this._currentAction) {\n this._currentAction.stop();\n }\n }\n /**\n *\n * @returns The total list of actions in this sequence complete or not\n */\n getActions() {\n return this._actions.concat(this._completedActions);\n }\n getIncompleteActions() {\n return this._actions;\n }\n getCurrentAction() {\n return this._currentAction;\n }\n /**\n *\n * @returns `true` if there are more actions to process in the sequence\n */\n hasNext() {\n return this._actions.length > 0;\n }\n /**\n * @returns `true` if the current sequence of actions is done\n */\n isComplete() {\n return this._actions.length === 0;\n }\n /**\n * Resets the sequence of actions, this is used to restart a sequence from the beginning\n */\n reset() {\n this._actions = this.getActions();\n const len = this._actions.length;\n for (let i = 0; i < len; i++) {\n this._actions[i].reset();\n }\n this._completedActions = [];\n }\n /**\n * Update the queue which updates actions and handles completing actions\n * @param elapsed\n */\n update(elapsed) {\n if (this._actions.length > 0) {\n if (this._currentAction !== this._actions[0]) {\n this._currentAction = this._actions[0];\n this._entity.emit('actionstart', new _Events__WEBPACK_IMPORTED_MODULE_0__.ActionStartEvent(this._currentAction, this._entity));\n }\n this._currentAction.update(elapsed);\n if (this._currentAction.isComplete(this._entity)) {\n this._entity.emit('actioncomplete', new _Events__WEBPACK_IMPORTED_MODULE_0__.ActionCompleteEvent(this._currentAction, this._entity));\n const complete = this._actions.shift();\n if (complete) {\n this._completedActions.push(complete);\n }\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/ActionSequence.ts\":\n/*!******************************************!*\\\n !*** ./Actions/Action/ActionSequence.ts ***!\n \\******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ActionSequence: () => (/* binding */ ActionSequence)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _ActionContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ActionContext */ \"./Actions/ActionContext.ts\");\n\n\n/**\n * Action that can represent a sequence of actions, this can be useful in conjunction with\n * {@apilink ParallelActions} to run multiple sequences in parallel.\n */\nclass ActionSequence {\n constructor(entity, actionBuilder) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._stopped = false;\n this._sequenceBuilder = actionBuilder;\n this._sequenceContext = new _ActionContext__WEBPACK_IMPORTED_MODULE_1__.ActionContext(entity);\n this._actionQueue = this._sequenceContext.getQueue();\n this._sequenceBuilder(this._sequenceContext);\n }\n update(elapsed) {\n this._actionQueue.update(elapsed);\n }\n isComplete() {\n return this._stopped || this._actionQueue.isComplete();\n }\n stop() {\n this._stopped = true;\n }\n reset() {\n this._stopped = false;\n this._actionQueue.reset();\n }\n clone(entity) {\n return new ActionSequence(entity, this._sequenceBuilder);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/Blink.ts\":\n/*!*********************************!*\\\n !*** ./Actions/Action/Blink.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Blink: () => (/* binding */ Blink)\n/* harmony export */ });\n/* harmony import */ var _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Graphics/GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\nclass Blink {\n constructor(entity, timeVisible, timeNotVisible, numBlinks = 1) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._timeVisible = 0;\n this._timeNotVisible = 0;\n this._elapsedTime = 0;\n this._totalTime = 0;\n this._stopped = false;\n this._started = false;\n this._graphics = entity.get(_Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_1__.GraphicsComponent);\n this._timeVisible = timeVisible;\n this._timeNotVisible = timeNotVisible;\n this._duration = (timeVisible + timeNotVisible) * numBlinks;\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._elapsedTime = 0;\n this._totalTime = 0;\n }\n if (!this._graphics) {\n return;\n }\n this._elapsedTime += elapsed;\n this._totalTime += elapsed;\n if (this._graphics.isVisible && this._elapsedTime >= this._timeVisible) {\n this._graphics.isVisible = false;\n this._elapsedTime = 0;\n }\n if (!this._graphics.isVisible && this._elapsedTime >= this._timeNotVisible) {\n this._graphics.isVisible = true;\n this._elapsedTime = 0;\n }\n if (this.isComplete()) {\n this._graphics.isVisible = true;\n }\n }\n isComplete() {\n return this._stopped || this._totalTime >= this._duration;\n }\n stop() {\n if (this._graphics) {\n this._graphics.isVisible = true;\n }\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n this._elapsedTime = 0;\n this._totalTime = 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/CallMethod.ts\":\n/*!**************************************!*\\\n !*** ./Actions/Action/CallMethod.ts ***!\n \\**************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CallMethod: () => (/* binding */ CallMethod)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\nclass CallMethod {\n constructor(method) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._hasBeenCalled = false;\n this._method = method;\n }\n update(elapsed) {\n this._method();\n this._hasBeenCalled = true;\n }\n isComplete() {\n return this._hasBeenCalled;\n }\n reset() {\n this._hasBeenCalled = false;\n }\n stop() {\n this._hasBeenCalled = true;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/CurveBy.ts\":\n/*!***********************************!*\\\n !*** ./Actions/Action/CurveBy.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CurveBy: () => (/* binding */ CurveBy)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../EntityComponentSystem */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math */ \"./Math/bezier-curve.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math */ \"./Math/vector.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Math */ \"./Math/util.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math */ \"./Math/lerp.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\nclass CurveBy {\n constructor(entity, options) {\n var _a;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._mode = 'dynamic';\n this._entity = entity;\n this._tx = this._entity.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n if (!this._tx) {\n throw new Error(`Entity ${entity.name} has no TransformComponent, can only curveTo on Entities with TransformComponents.`);\n }\n this._curve = this._curve = new _Math__WEBPACK_IMPORTED_MODULE_2__.BezierCurve({\n controlPoints: [(0,_Math__WEBPACK_IMPORTED_MODULE_3__.vec)(0, 0), ...options.controlPoints],\n quality: options.quality\n });\n this._durationMs = options.duration;\n this._mode = (_a = options.mode) !== null && _a !== void 0 ? _a : this._mode;\n this._currentMs = this._durationMs;\n }\n update(elapsed) {\n if (!this._started) {\n this._curve.setControlPoint(0, this._tx.globalPos);\n this._curve.setControlPoint(1, this._curve.controlPoints[1].add(this._tx.globalPos));\n this._curve.setControlPoint(2, this._curve.controlPoints[2].add(this._tx.globalPos));\n this._curve.setControlPoint(3, this._curve.controlPoints[3].add(this._tx.globalPos));\n this._started = true;\n }\n this._currentMs -= elapsed;\n const t = (0,_Math__WEBPACK_IMPORTED_MODULE_4__.clamp)((0,_Math__WEBPACK_IMPORTED_MODULE_5__.remap)(0, this._durationMs, 0, 1, this._durationMs - this._currentMs), 0, 1);\n if (this._mode === 'dynamic') {\n this._tx.pos = this._curve.getPoint(t);\n }\n else {\n this._tx.pos = this._curve.getUniformPoint(t);\n }\n if (this.isComplete(this._entity)) {\n if (this._mode === 'dynamic') {\n this._tx.pos = this._curve.getPoint(1);\n }\n else {\n this._tx.pos = this._curve.getUniformPoint(1);\n }\n }\n }\n isComplete(entity) {\n return this._stopped || this._currentMs < 0;\n }\n reset() {\n this._currentMs = this._durationMs;\n this._started = false;\n this._stopped = false;\n }\n stop() {\n this._stopped = true;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/CurveTo.ts\":\n/*!***********************************!*\\\n !*** ./Actions/Action/CurveTo.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CurveTo: () => (/* binding */ CurveTo)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../EntityComponentSystem */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math */ \"./Math/bezier-curve.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math */ \"./Math/vector.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Math */ \"./Math/util.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math */ \"./Math/lerp.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\nclass CurveTo {\n constructor(entity, options) {\n var _a;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._mode = 'dynamic';\n this._entity = entity;\n this._tx = this._entity.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n if (!this._tx) {\n throw new Error(`Entity ${entity.name} has no TransformComponent, can only curveTo on Entities with TransformComponents.`);\n }\n this._curve = new _Math__WEBPACK_IMPORTED_MODULE_2__.BezierCurve({\n controlPoints: [(0,_Math__WEBPACK_IMPORTED_MODULE_3__.vec)(0, 0), ...options.controlPoints],\n quality: options.quality\n });\n this._durationMs = options.duration;\n this._mode = (_a = options.mode) !== null && _a !== void 0 ? _a : this._mode;\n this._currentMs = this._durationMs;\n }\n update(elapsed) {\n if (!this._started) {\n this._curve.setControlPoint(0, this._tx.globalPos.clone());\n this._started = true;\n }\n this._currentMs -= elapsed;\n const t = (0,_Math__WEBPACK_IMPORTED_MODULE_4__.clamp)((0,_Math__WEBPACK_IMPORTED_MODULE_5__.remap)(0, this._durationMs, 0, 1, this._durationMs - this._currentMs), 0, 1);\n if (this._mode === 'dynamic') {\n this._tx.pos = this._curve.getPoint(t);\n }\n else {\n this._tx.pos = this._curve.getUniformPoint(t);\n }\n if (this.isComplete(this._entity)) {\n if (this._mode === 'dynamic') {\n this._tx.pos = this._curve.getPoint(1);\n }\n else {\n this._tx.pos = this._curve.getUniformPoint(1);\n }\n }\n }\n isComplete(entity) {\n return this._stopped || this._currentMs < 0;\n }\n reset() {\n this._currentMs = this._durationMs;\n this._started = false;\n this._stopped = false;\n }\n stop() {\n this._stopped = true;\n this._currentMs = 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/Delay.ts\":\n/*!*********************************!*\\\n !*** ./Actions/Action/Delay.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Delay: () => (/* binding */ Delay)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\nclass Delay {\n constructor(duration) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._elapsedTime = 0;\n this._started = false;\n this._stopped = false;\n this._delay = duration;\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n }\n this._elapsedTime += elapsed;\n }\n isComplete() {\n return this._stopped || this._elapsedTime >= this._delay;\n }\n stop() {\n this._stopped = true;\n }\n reset() {\n this._elapsedTime = 0;\n this._started = false;\n this._stopped = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/Die.ts\":\n/*!*******************************!*\\\n !*** ./Actions/Action/Die.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Die: () => (/* binding */ Die)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _ActionsComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ActionsComponent */ \"./Actions/ActionsComponent.ts\");\n\n\nclass Die {\n constructor(entity) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._stopped = false;\n this._entity = entity;\n }\n update(elapsed) {\n this._entity.get(_ActionsComponent__WEBPACK_IMPORTED_MODULE_1__.ActionsComponent).clearActions();\n this._entity.kill();\n this._stopped = true;\n }\n isComplete() {\n return this._stopped;\n }\n stop() {\n return;\n }\n reset() {\n return;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/EaseBy.ts\":\n/*!**********************************!*\\\n !*** ./Actions/Action/EaseBy.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EaseBy: () => (/* binding */ EaseBy)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\n\n/**\n * @deprecated use moveBy({offset: Vector, duration: number, easing: EasingFunction})\n */\nclass EaseBy {\n constructor(entity, offsetX, offsetY, duration, easingFcn) {\n this.easingFcn = easingFcn;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._currentLerpTime = 0;\n this._lerpDuration = 1 * 1000; // 1 second\n this._lerpStart = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(0, 0);\n this._lerpEnd = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(0, 0);\n this._initialized = false;\n this._stopped = false;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__.MotionComponent);\n this._lerpDuration = duration;\n this._offset = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(offsetX, offsetY);\n }\n _initialize() {\n this._lerpStart = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this._tx.pos.x, this._tx.pos.y);\n this._currentLerpTime = 0;\n this._lerpEnd = this._lerpStart.add(this._offset);\n }\n update(elapsed) {\n if (!this._initialized) {\n this._initialize();\n this._initialized = true;\n }\n // Need to update lerp time first, otherwise the first update will always be zero\n this._currentLerpTime += elapsed;\n let newX = this._tx.pos.x;\n let newY = this._tx.pos.y;\n if (this._currentLerpTime < this._lerpDuration) {\n if (this._lerpEnd.x < this._lerpStart.x) {\n newX =\n this._lerpStart.x -\n (this.easingFcn(this._currentLerpTime, this._lerpEnd.x, this._lerpStart.x, this._lerpDuration) - this._lerpEnd.x);\n }\n else {\n newX = this.easingFcn(this._currentLerpTime, this._lerpStart.x, this._lerpEnd.x, this._lerpDuration);\n }\n if (this._lerpEnd.y < this._lerpStart.y) {\n newY =\n this._lerpStart.y -\n (this.easingFcn(this._currentLerpTime, this._lerpEnd.y, this._lerpStart.y, this._lerpDuration) - this._lerpEnd.y);\n }\n else {\n newY = this.easingFcn(this._currentLerpTime, this._lerpStart.y, this._lerpEnd.y, this._lerpDuration);\n }\n // Given the lerp position figure out the velocity in pixels per second\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)((newX - this._tx.pos.x) / (elapsed / 1000), (newY - this._tx.pos.y) / (elapsed / 1000));\n }\n else {\n this._tx.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(this._lerpEnd.x, this._lerpEnd.y);\n this._motion.vel = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n }\n }\n isComplete() {\n return this._stopped || this._currentLerpTime >= this._lerpDuration;\n }\n reset() {\n this._initialized = false;\n this._stopped = false;\n this._currentLerpTime = 0;\n }\n stop() {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0);\n this._stopped = true;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/EaseTo.ts\":\n/*!**********************************!*\\\n !*** ./Actions/Action/EaseTo.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EaseTo: () => (/* binding */ EaseTo)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\n\n/**\n * @deprecated use moveTo({pos: Vector, duration: number, easing: EasingFunction})\n */\nclass EaseTo {\n constructor(entity, x, y, duration, easingFcn) {\n this.easingFcn = easingFcn;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._currentLerpTime = 0;\n this._lerpDuration = 1 * 1000; // 1 second\n this._lerpStart = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(0, 0);\n this._lerpEnd = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(0, 0);\n this._initialized = false;\n this._stopped = false;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__.MotionComponent);\n this._lerpDuration = duration;\n this._lerpEnd = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(x, y);\n }\n _initialize() {\n this._lerpStart = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this._tx.pos.x, this._tx.pos.y);\n this._currentLerpTime = 0;\n }\n update(elapsed) {\n if (!this._initialized) {\n this._initialize();\n this._initialized = true;\n }\n // Need to update lerp time first, otherwise the first update will always be zero\n this._currentLerpTime += elapsed;\n let newX = this._tx.pos.x;\n let newY = this._tx.pos.y;\n if (this._currentLerpTime < this._lerpDuration) {\n if (this._lerpEnd.x < this._lerpStart.x) {\n newX =\n this._lerpStart.x -\n (this.easingFcn(this._currentLerpTime, this._lerpEnd.x, this._lerpStart.x, this._lerpDuration) - this._lerpEnd.x);\n }\n else {\n newX = this.easingFcn(this._currentLerpTime, this._lerpStart.x, this._lerpEnd.x, this._lerpDuration);\n }\n if (this._lerpEnd.y < this._lerpStart.y) {\n newY =\n this._lerpStart.y -\n (this.easingFcn(this._currentLerpTime, this._lerpEnd.y, this._lerpStart.y, this._lerpDuration) - this._lerpEnd.y);\n }\n else {\n newY = this.easingFcn(this._currentLerpTime, this._lerpStart.y, this._lerpEnd.y, this._lerpDuration);\n }\n // Given the lerp position figure out the velocity in pixels per second\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)((newX - this._tx.pos.x) / (elapsed / 1000), (newY - this._tx.pos.y) / (elapsed / 1000));\n }\n else {\n this._tx.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(this._lerpEnd.x, this._lerpEnd.y);\n this._motion.vel = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n }\n }\n isComplete() {\n return this._stopped || this._currentLerpTime >= this._lerpDuration;\n }\n reset() {\n this._initialized = false;\n this._stopped = false;\n this._currentLerpTime = 0;\n }\n stop() {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0);\n this._stopped = true;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/Fade.ts\":\n/*!********************************!*\\\n !*** ./Actions/Action/Fade.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Fade: () => (/* binding */ Fade)\n/* harmony export */ });\n/* harmony import */ var _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Graphics/GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\nclass Fade {\n constructor(entity, endOpacity, duration) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._multiplier = 1;\n this._started = false;\n this._stopped = false;\n this._graphics = entity.get(_Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_1__.GraphicsComponent);\n this._endOpacity = endOpacity;\n this._remainingTime = this._originalTime = duration;\n }\n update(elapsed) {\n if (!this._graphics) {\n return;\n }\n if (!this._started) {\n this._started = true;\n this._remainingTime = this._originalTime;\n // determine direction when we start\n if (this._endOpacity < this._graphics.opacity) {\n this._multiplier = -1;\n }\n else {\n this._multiplier = 1;\n }\n }\n if (this._remainingTime > 0) {\n this._graphics.opacity += (this._multiplier * (Math.abs(this._graphics.opacity - this._endOpacity) * elapsed)) / this._remainingTime;\n }\n this._remainingTime -= elapsed;\n if (this.isComplete()) {\n this._graphics.opacity = this._endOpacity;\n }\n _Util_Log__WEBPACK_IMPORTED_MODULE_2__.Logger.getInstance().debug('[Action fade] Actor opacity:', this._graphics.opacity);\n }\n isComplete() {\n return this._stopped || this._remainingTime <= 0;\n }\n stop() {\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n this._remainingTime = this._originalTime;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/Flash.ts\":\n/*!*********************************!*\\\n !*** ./Actions/Action/Flash.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Flash: () => (/* binding */ Flash)\n/* harmony export */ });\n/* harmony import */ var _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Graphics/GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\nclass Flash {\n constructor(entity, color, duration = 1000) {\n var _a;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._stopped = false;\n this._started = false;\n this._total = 0;\n this._currentDuration = 0;\n this._graphics = entity.get(_Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_1__.GraphicsComponent);\n this._duration = duration;\n this._entity = entity;\n this._material = (_a = entity.scene) === null || _a === void 0 ? void 0 : _a.engine.graphicsContext.createMaterial({\n name: 'flash-material',\n color,\n fragmentSource: `#version 300 es\r\n \r\n precision mediump float;\r\n uniform float u_blend;\r\n uniform sampler2D u_graphic;\r\n uniform vec4 u_color;\r\n \r\n in vec2 v_uv; \r\n out vec4 color;\r\n \r\n void main() { \r\n vec4 textureColor = texture(u_graphic, v_uv); \r\n color = mix(textureColor, u_color, u_blend * textureColor.a);\r\n color.rgb = color.rgb * color.a;\r\n }`\n });\n this._total = duration;\n }\n update(elapsed) {\n var _a;\n if (!this._started) {\n this._started = true;\n this._total = this._duration;\n this._currentDuration = this._duration;\n this._entity.graphics.material = this._material;\n }\n if (!this._graphics) {\n return;\n }\n this._currentDuration -= elapsed;\n if (this._graphics) {\n (_a = this._material) === null || _a === void 0 ? void 0 : _a.update((shader) => {\n shader.trySetUniformFloat('u_blend', this._currentDuration / this._total);\n });\n }\n if (this.isComplete()) {\n this._entity.graphics.material = null;\n }\n }\n isComplete() {\n return this._stopped || this._currentDuration <= 0;\n }\n stop() {\n if (this._graphics) {\n this._graphics.isVisible = true;\n }\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/Follow.ts\":\n/*!**********************************!*\\\n !*** ./Actions/Action/Follow.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Follow: () => (/* binding */ Follow)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\n\nclass Follow {\n constructor(entity, entityToFollow, followDistance) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n this._followTx = entityToFollow.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._followMotion = entityToFollow.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n this._current = new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(this._tx.pos.x, this._tx.pos.y);\n this._end = new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(this._followTx.pos.x, this._followTx.pos.y);\n this._maximumDistance = followDistance !== undefined ? followDistance : this._current.distance(this._end);\n this._speed = 0;\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._distanceBetween = this._current.distance(this._end);\n this._dir = this._end.sub(this._current).normalize();\n }\n const actorToFollowSpeed = Math.sqrt(Math.pow(this._followMotion.vel.x, 2) + Math.pow(this._followMotion.vel.y, 2));\n if (actorToFollowSpeed !== 0) {\n this._speed = actorToFollowSpeed;\n }\n this._current = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this._tx.pos.x, this._tx.pos.y);\n this._end = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this._followTx.pos.x, this._followTx.pos.y);\n this._distanceBetween = this._current.distance(this._end);\n this._dir = this._end.sub(this._current).normalize();\n if (this._distanceBetween >= this._maximumDistance) {\n const m = this._dir.scale(this._speed);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(m.x, m.y);\n }\n else {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(0, 0);\n }\n if (this.isComplete()) {\n this._tx.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this._end.x, this._end.y);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(0, 0);\n }\n }\n stop() {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(0, 0);\n this._stopped = true;\n }\n isComplete() {\n // the actor following should never stop unless specified to do so\n return this._stopped;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/Meet.ts\":\n/*!********************************!*\\\n !*** ./Actions/Action/Meet.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Meet: () => (/* binding */ Meet)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\n\nclass Meet {\n constructor(actor, actorToMeet, speed) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._speedWasSpecified = false;\n this._tx = actor.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._motion = actor.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n this._meetTx = actorToMeet.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._meetMotion = actorToMeet.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n this._current = new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(this._tx.pos.x, this._tx.pos.y);\n this._end = new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(this._meetTx.pos.x, this._meetTx.pos.y);\n this._speed = speed || 0;\n if (speed !== undefined) {\n this._speedWasSpecified = true;\n }\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._distanceBetween = this._current.distance(this._end);\n this._dir = this._end.sub(this._current).normalize();\n }\n const actorToMeetSpeed = Math.sqrt(Math.pow(this._meetMotion.vel.x, 2) + Math.pow(this._meetMotion.vel.y, 2));\n if (actorToMeetSpeed !== 0 && !this._speedWasSpecified) {\n this._speed = actorToMeetSpeed;\n }\n this._current = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this._tx.pos.x, this._tx.pos.y);\n this._end = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this._meetTx.pos.x, this._meetTx.pos.y);\n this._distanceBetween = this._current.distance(this._end);\n this._dir = this._end.sub(this._current).normalize();\n const m = this._dir.scale(this._speed);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(m.x, m.y);\n if (this.isComplete()) {\n this._tx.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this._end.x, this._end.y);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(0, 0);\n }\n }\n isComplete() {\n return this._stopped || this._distanceBetween <= 1;\n }\n stop() {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(0, 0);\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n this._distanceBetween = Infinity;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/MoveBy.ts\":\n/*!**********************************!*\\\n !*** ./Actions/Action/MoveBy.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MoveBy: () => (/* binding */ MoveBy),\n/* harmony export */ MoveByWithOptions: () => (/* binding */ MoveByWithOptions),\n/* harmony export */ isMoveByOptions: () => (/* binding */ isMoveByOptions)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math */ \"./Math/util.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../Math */ \"./Math/lerp.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Util/EasingFunctions */ \"./Util/EasingFunctions.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\n\n\n\n\n/**\n *\n */\nfunction isMoveByOptions(x) {\n return x.offset instanceof _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector && typeof x.duration === 'number';\n}\nclass MoveByWithOptions {\n constructor(entity, options) {\n var _a;\n this.entity = entity;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_1__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._easing = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_2__.EasingFunctions.Linear;\n this._offset = options.offset;\n this._easing = (_a = options.easing) !== null && _a !== void 0 ? _a : this._easing;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_4__.MotionComponent);\n if (!this._tx) {\n throw new Error(`Entity ${entity.name} has no TransformComponent, can only MoveBy on Entities with TransformComponents.`);\n }\n this._durationMs = options.duration;\n this._currentMs = this._durationMs;\n }\n update(elapsed) {\n if (!this._started) {\n this._start = this._tx.pos.clone();\n this._end = this._start.add(this._offset);\n this._started = true;\n }\n this._currentMs -= elapsed;\n const t = (0,_Math__WEBPACK_IMPORTED_MODULE_5__.clamp)((0,_Math__WEBPACK_IMPORTED_MODULE_6__.remap)(0, this._durationMs, 0, 1, this._durationMs - this._currentMs), 0, 1);\n const currentPos = this._tx.pos;\n const newPosX = this._easing(t, this._start.x, this._end.x, 1);\n const newPosY = this._easing(t, this._start.y, this._end.y, 1);\n const velX = (newPosX - currentPos.x) / (elapsed / 1000);\n const velY = (newPosY - currentPos.y) / (elapsed / 1000);\n this._motion.vel.x = velX;\n this._motion.vel.y = velY;\n if (this.isComplete(this.entity)) {\n this._tx.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this._end.x, this._end.y);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n }\n }\n isComplete(entity) {\n return this._stopped || this._currentMs < 0;\n }\n stop() {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n this._stopped = true;\n this._currentMs = 0;\n }\n reset() {\n this._currentMs = this._durationMs;\n this._started = false;\n this._stopped = false;\n }\n}\nclass MoveBy {\n constructor(entity, offsetX, offsetY, speed) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_1__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._entity = entity;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_4__.MotionComponent);\n this._speed = speed;\n this._offset = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(offsetX, offsetY);\n if (speed <= 0) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_7__.Logger.getInstance().error('Attempted to moveBy with speed less than or equal to zero : ' + speed);\n throw new Error('Speed must be greater than 0 pixels per second');\n }\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._start = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(this._tx.pos.x, this._tx.pos.y);\n this._end = this._start.add(this._offset);\n this._distance = this._offset.magnitude;\n this._dir = this._end.sub(this._start).normalize();\n }\n if (this.isComplete(this._entity)) {\n this._tx.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this._end.x, this._end.y);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n }\n else {\n this._motion.vel = this._dir.scale(this._speed);\n }\n }\n isComplete(entity) {\n const tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__.TransformComponent);\n return this._stopped || tx.pos.distance(this._start) >= this._distance;\n }\n stop() {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/MoveTo.ts\":\n/*!**********************************!*\\\n !*** ./Actions/Action/MoveTo.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MoveTo: () => (/* binding */ MoveTo),\n/* harmony export */ MoveToWithOptions: () => (/* binding */ MoveToWithOptions),\n/* harmony export */ isMoveToOptions: () => (/* binding */ isMoveToOptions)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math */ \"./Math/util.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../Math */ \"./Math/lerp.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Util/EasingFunctions */ \"./Util/EasingFunctions.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\n\n\n\n/**\n *\n */\nfunction isMoveToOptions(x) {\n return x.pos instanceof _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector && typeof x.duration === 'number';\n}\nclass MoveToWithOptions {\n constructor(entity, options) {\n var _a;\n this.entity = entity;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_1__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._easing = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_2__.EasingFunctions.Linear;\n this._end = options.pos;\n this._easing = (_a = options.easing) !== null && _a !== void 0 ? _a : this._easing;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_4__.MotionComponent);\n if (!this._tx) {\n throw new Error(`Entity ${entity.name} has no TransformComponent, can only moveTo on Entities with TransformComponents.`);\n }\n this._durationMs = options.duration;\n this._currentMs = this._durationMs;\n }\n update(elapsed) {\n if (!this._started) {\n this._start = this._tx.pos.clone();\n this._started = true;\n }\n this._currentMs -= elapsed;\n const t = (0,_Math__WEBPACK_IMPORTED_MODULE_5__.clamp)((0,_Math__WEBPACK_IMPORTED_MODULE_6__.remap)(0, this._durationMs, 0, 1, this._durationMs - this._currentMs), 0, 1);\n const currentPos = this._tx.pos;\n const newPosX = this._easing(t, this._start.x, this._end.x, 1);\n const newPosY = this._easing(t, this._start.y, this._end.y, 1);\n const velX = (newPosX - currentPos.x) / (elapsed / 1000);\n const velY = (newPosY - currentPos.y) / (elapsed / 1000);\n this._motion.vel.x = velX;\n this._motion.vel.y = velY;\n if (this.isComplete(this.entity)) {\n this._tx.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this._end.x, this._end.y);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n }\n }\n isComplete(entity) {\n return this._stopped || this._currentMs < 0;\n }\n stop() {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n this._stopped = true;\n this._currentMs = 0;\n }\n reset() {\n this._currentMs = this._durationMs;\n this._started = false;\n this._stopped = false;\n }\n}\nclass MoveTo {\n constructor(entity, destX, destY, speed) {\n this.entity = entity;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_1__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_4__.MotionComponent);\n this._end = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(destX, destY);\n this._speed = speed;\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._start = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(this._tx.pos.x, this._tx.pos.y);\n this._distance = this._start.distance(this._end);\n this._dir = this._end.sub(this._start).normalize();\n }\n const m = this._dir.scale(this._speed);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(m.x, m.y);\n if (this.isComplete(this.entity)) {\n this._tx.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this._end.x, this._end.y);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n }\n }\n isComplete(entity) {\n const tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__.TransformComponent);\n return this._stopped || new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(tx.pos.x, tx.pos.y).distance(this._start) >= this._distance;\n }\n stop() {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/ParallelActions.ts\":\n/*!*******************************************!*\\\n !*** ./Actions/Action/ParallelActions.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ParallelActions: () => (/* binding */ ParallelActions)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n/**\n * Action that can run multiple {@apilink Action}s or {@apilink ActionSequence}s at the same time\n */\nclass ParallelActions {\n constructor(parallelActions) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._actions = parallelActions;\n }\n update(elapsed) {\n for (let i = 0; i < this._actions.length; i++) {\n this._actions[i].update(elapsed);\n }\n }\n isComplete(entity) {\n return this._actions.every((a) => a.isComplete(entity));\n }\n reset() {\n this._actions.forEach((a) => a.reset());\n }\n stop() {\n this._actions.forEach((a) => a.stop());\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/Repeat.ts\":\n/*!**********************************!*\\\n !*** ./Actions/Action/Repeat.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Repeat: () => (/* binding */ Repeat)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _ActionContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ActionContext */ \"./Actions/ActionContext.ts\");\n\n\nclass Repeat {\n constructor(entity, repeatBuilder, repeat) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._stopped = false;\n this._repeatBuilder = repeatBuilder;\n this._repeatContext = new _ActionContext__WEBPACK_IMPORTED_MODULE_1__.ActionContext(entity);\n this._actionQueue = this._repeatContext.getQueue();\n this._repeat = repeat;\n this._originalRepeat = repeat;\n this._repeatBuilder(this._repeatContext);\n this._repeat--; // current execution is the first repeat\n }\n update(elapsed) {\n if (this._actionQueue.isComplete()) {\n this._actionQueue.clearActions();\n this._repeatBuilder(this._repeatContext);\n this._repeat--;\n }\n this._actionQueue.update(elapsed);\n }\n isComplete() {\n return this._stopped || (this._repeat <= 0 && this._actionQueue.isComplete());\n }\n stop() {\n this._stopped = true;\n }\n reset() {\n this._repeat = this._originalRepeat;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/RepeatForever.ts\":\n/*!*****************************************!*\\\n !*** ./Actions/Action/RepeatForever.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RepeatForever: () => (/* binding */ RepeatForever)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _ActionContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ActionContext */ \"./Actions/ActionContext.ts\");\n\n\n/**\n * RepeatForever Action implementation, it is recommended you use the fluent action\n * context API.\n *\n *\n */\nclass RepeatForever {\n constructor(entity, repeatBuilder) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._stopped = false;\n this._repeatBuilder = repeatBuilder;\n this._repeatContext = new _ActionContext__WEBPACK_IMPORTED_MODULE_1__.ActionContext(entity);\n this._actionQueue = this._repeatContext.getQueue();\n this._repeatBuilder(this._repeatContext);\n }\n update(elapsed) {\n if (this._stopped) {\n return;\n }\n if (this._actionQueue.isComplete()) {\n this._actionQueue.clearActions();\n this._repeatBuilder(this._repeatContext);\n }\n this._actionQueue.update(elapsed);\n }\n isComplete() {\n return this._stopped;\n }\n stop() {\n this._stopped = true;\n this._actionQueue.clearActions();\n }\n reset() {\n return;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/RotateBy.ts\":\n/*!************************************!*\\\n !*** ./Actions/Action/RotateBy.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RotateBy: () => (/* binding */ RotateBy),\n/* harmony export */ RotateByWithOptions: () => (/* binding */ RotateByWithOptions),\n/* harmony export */ isRotateByOptions: () => (/* binding */ isRotateByOptions)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math */ \"./Math/rotation-type.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math */ \"./Math/lerp.ts\");\n\n\n\n\n\n/**\n *\n */\nfunction isRotateByOptions(x) {\n return typeof x.angleRadiansOffset === 'number' && typeof x.duration === 'number';\n}\nclass RotateByWithOptions {\n constructor(entity, options) {\n var _a;\n this.entity = entity;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._offset = 0;\n this._startAngle = 0;\n this._endAngle = 0;\n this._offset = options.angleRadiansOffset;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n if (!this._tx) {\n throw new Error(`Entity ${entity.name} has no TransformComponent, can only RotateBy on Entities with TransformComponents.`);\n }\n this._durationMs = options.duration;\n this._rotationType = (_a = options.rotationType) !== null && _a !== void 0 ? _a : _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.ShortestPath;\n this._currentMs = this._durationMs;\n }\n update(elapsed) {\n if (!this._started) {\n this._startAngle = this._tx.rotation;\n this._endAngle = (0,_Math_util__WEBPACK_IMPORTED_MODULE_4__.canonicalizeAngle)(this._startAngle + this._offset);\n this._started = true;\n }\n this._currentMs -= elapsed;\n const t = (0,_Math_util__WEBPACK_IMPORTED_MODULE_4__.clamp)((0,_Math__WEBPACK_IMPORTED_MODULE_5__.remap)(0, this._durationMs, 0, 1, this._durationMs - this._currentMs), 0, 1);\n const newAngle = (0,_Math__WEBPACK_IMPORTED_MODULE_5__.lerpAngle)(this._startAngle, this._endAngle, this._rotationType, t);\n const currentAngle = this._tx.rotation;\n const rx = (newAngle - currentAngle) / (elapsed / 1000);\n this._motion.angularVelocity = rx;\n if (this.isComplete()) {\n this._tx.rotation = this._endAngle;\n this._motion.angularVelocity = 0;\n }\n }\n isComplete() {\n return this._stopped || this._currentMs < 0;\n }\n stop() {\n this._motion.angularVelocity = 0;\n this._stopped = true;\n this._currentMs = 0;\n }\n reset() {\n this._currentMs = this._durationMs;\n this._started = false;\n this._stopped = false;\n }\n}\nclass RotateBy {\n constructor(entity, angleRadiansOffset, speed, rotationType) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n this._speed = speed;\n this._offset = angleRadiansOffset;\n this._rotationType = rotationType || _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.ShortestPath;\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._start = this._tx.rotation;\n this._currentNonCannonAngle = this._tx.rotation;\n this._end = this._start + this._offset;\n const distance1 = Math.abs(this._end - this._start);\n const distance2 = _Math_util__WEBPACK_IMPORTED_MODULE_4__.TwoPI - distance1;\n if (distance1 > distance2) {\n this._shortDistance = distance2;\n this._longDistance = distance1;\n }\n else {\n this._shortDistance = distance1;\n this._longDistance = distance2;\n }\n this._shortestPathIsPositive = (this._start - this._end + _Math_util__WEBPACK_IMPORTED_MODULE_4__.TwoPI) % _Math_util__WEBPACK_IMPORTED_MODULE_4__.TwoPI >= Math.PI;\n switch (this._rotationType) {\n case _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.ShortestPath:\n this._distance = this._shortDistance;\n if (this._shortestPathIsPositive) {\n this._direction = 1;\n }\n else {\n this._direction = -1;\n }\n break;\n case _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.LongestPath:\n this._distance = this._longDistance;\n if (this._shortestPathIsPositive) {\n this._direction = -1;\n }\n else {\n this._direction = 1;\n }\n break;\n case _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.Clockwise:\n this._direction = 1;\n if (this._shortDistance >= 0) {\n this._distance = this._shortDistance;\n }\n else {\n this._distance = this._longDistance;\n }\n break;\n case _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.CounterClockwise:\n this._direction = -1;\n if (this._shortDistance <= 0) {\n this._distance = this._shortDistance;\n }\n else {\n this._distance = this._longDistance;\n }\n break;\n }\n }\n this._motion.angularVelocity = this._direction * this._speed;\n this._currentNonCannonAngle += this._direction * this._speed * (elapsed / 1000);\n if (this.isComplete()) {\n this._tx.rotation = this._end;\n this._motion.angularVelocity = 0;\n this._stopped = true;\n }\n }\n isComplete() {\n const distanceTraveled = Math.abs(this._currentNonCannonAngle - this._start);\n return this._stopped || distanceTraveled >= Math.abs(this._distance);\n }\n stop() {\n this._motion.angularVelocity = 0;\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n this._start = undefined;\n this._currentNonCannonAngle = undefined;\n this._distance = undefined;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/RotateTo.ts\":\n/*!************************************!*\\\n !*** ./Actions/Action/RotateTo.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RotateTo: () => (/* binding */ RotateTo),\n/* harmony export */ RotateToWithOptions: () => (/* binding */ RotateToWithOptions),\n/* harmony export */ isRotateToOptions: () => (/* binding */ isRotateToOptions)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math */ \"./Math/rotation-type.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math */ \"./Math/lerp.ts\");\n\n\n\n\n\n\n/**\n *\n */\nfunction isRotateToOptions(x) {\n return typeof x.angle === 'number' && typeof x.duration === 'number';\n}\nclass RotateToWithOptions {\n constructor(entity, options) {\n var _a;\n this.entity = entity;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._endAngle = 0;\n this._startAngle = 0;\n this._endAngle = options.angle;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n if (!this._tx) {\n throw new Error(`Entity ${entity.name} has no TransformComponent, can only RotateTo on Entities with TransformComponents.`);\n }\n this._durationMs = options.duration;\n this._rotationType = (_a = options.rotationType) !== null && _a !== void 0 ? _a : _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.ShortestPath;\n this._currentMs = this._durationMs;\n }\n update(elapsed) {\n if (!this._started) {\n this._startAngle = this._tx.rotation;\n this._started = true;\n }\n this._currentMs -= elapsed;\n const t = (0,_Math_util__WEBPACK_IMPORTED_MODULE_4__.clamp)((0,_Math__WEBPACK_IMPORTED_MODULE_5__.remap)(0, this._durationMs, 0, 1, this._durationMs - this._currentMs), 0, 1);\n const newAngle = (0,_Math__WEBPACK_IMPORTED_MODULE_5__.lerpAngle)(this._startAngle, this._endAngle, this._rotationType, t);\n const currentAngle = this._tx.rotation;\n const rx = (newAngle - currentAngle) / (elapsed / 1000);\n this._motion.angularVelocity = rx;\n if (this.isComplete(this.entity)) {\n this._tx.rotation = this._endAngle;\n this._motion.angularVelocity = 0;\n }\n }\n isComplete(entity) {\n return this._stopped || this._currentMs < 0;\n }\n stop() {\n this._motion.angularVelocity = 0;\n this._stopped = true;\n this._currentMs = 0;\n }\n reset() {\n this._currentMs = this._durationMs;\n this._started = false;\n this._stopped = false;\n }\n}\nclass RotateTo {\n constructor(entity, angle, speed, rotationType) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n this._end = angle;\n this._speed = speed;\n this._rotationType = rotationType || _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.ShortestPath;\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._start = this._tx.rotation;\n this._currentNonCannonAngle = this._tx.rotation;\n const distance1 = Math.abs(this._end - this._start);\n const distance2 = _Math_util__WEBPACK_IMPORTED_MODULE_4__.TwoPI - distance1;\n if (distance1 > distance2) {\n this._shortDistance = distance2;\n this._longDistance = distance1;\n }\n else {\n this._shortDistance = distance1;\n this._longDistance = distance2;\n }\n this._shortestPathIsPositive = (this._start - this._end + _Math_util__WEBPACK_IMPORTED_MODULE_4__.TwoPI) % _Math_util__WEBPACK_IMPORTED_MODULE_4__.TwoPI >= Math.PI;\n switch (this._rotationType) {\n case _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.ShortestPath:\n this._distance = this._shortDistance;\n if (this._shortestPathIsPositive) {\n this._direction = 1;\n }\n else {\n this._direction = -1;\n }\n break;\n case _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.LongestPath:\n this._distance = this._longDistance;\n if (this._shortestPathIsPositive) {\n this._direction = -1;\n }\n else {\n this._direction = 1;\n }\n break;\n case _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.Clockwise:\n this._direction = 1;\n if (this._shortestPathIsPositive) {\n this._distance = this._shortDistance;\n }\n else {\n this._distance = this._longDistance;\n }\n break;\n case _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.CounterClockwise:\n this._direction = -1;\n if (!this._shortestPathIsPositive) {\n this._distance = this._shortDistance;\n }\n else {\n this._distance = this._longDistance;\n }\n break;\n }\n }\n this._motion.angularVelocity = this._direction * this._speed;\n this._currentNonCannonAngle += this._direction * this._speed * (elapsed / 1000);\n if (this.isComplete()) {\n this._tx.rotation = this._end;\n this._motion.angularVelocity = 0;\n this._stopped = true;\n }\n }\n isComplete() {\n const distanceTraveled = Math.abs(this._currentNonCannonAngle - this._start);\n return this._stopped || distanceTraveled >= Math.abs(this._distance);\n }\n stop() {\n this._motion.angularVelocity = 0;\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/ScaleBy.ts\":\n/*!***********************************!*\\\n !*** ./Actions/Action/ScaleBy.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ScaleBy: () => (/* binding */ ScaleBy),\n/* harmony export */ ScaleByWithOptions: () => (/* binding */ ScaleByWithOptions),\n/* harmony export */ isScaleByOptions: () => (/* binding */ isScaleByOptions)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Math */ \"./Math/util.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math */ \"./Math/lerp.ts\");\n\n\n\n\n\n/**\n *\n */\nfunction isScaleByOptions(x) {\n return typeof x.scaleOffset === 'object' && typeof x.duration === 'number';\n}\nclass ScaleByWithOptions {\n constructor(entity, options) {\n this.entity = entity;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._endScale = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(1, 1);\n this._scaleOffset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0);\n this._startScale = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(1, 1);\n this._scaleOffset = options.scaleOffset;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__.MotionComponent);\n if (!this._tx) {\n throw new Error(`Entity ${entity.name} has no TransformComponent, can only ScaleBy on Entities with TransformComponents.`);\n }\n this._durationMs = options.duration;\n this._currentMs = this._durationMs;\n }\n update(elapsed) {\n if (!this._started) {\n this._startScale = this._tx.scale;\n this._endScale = this._startScale.add(this._scaleOffset);\n this._started = true;\n }\n this._currentMs -= elapsed;\n const t = (0,_Math__WEBPACK_IMPORTED_MODULE_4__.clamp)((0,_Math__WEBPACK_IMPORTED_MODULE_5__.remap)(0, this._durationMs, 0, 1, this._durationMs - this._currentMs), 0, 1);\n const newScale = (0,_Math__WEBPACK_IMPORTED_MODULE_5__.lerpVector)(this._startScale, this._endScale, t);\n const currentScale = this._tx.scale;\n const sx = newScale.sub(currentScale).scale(1 / (elapsed / 1000));\n this._motion.scaleFactor = sx;\n if (this.isComplete()) {\n this._tx.scale = this._endScale;\n this._motion.angularVelocity = 0;\n }\n }\n isComplete() {\n return this._stopped || this._currentMs < 0;\n }\n stop() {\n this._motion.scaleFactor = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n this._stopped = true;\n this._currentMs = 0;\n }\n reset() {\n this._currentMs = this._durationMs;\n this._started = false;\n this._stopped = false;\n }\n}\nclass ScaleBy {\n constructor(entity, scaleOffsetX, scaleOffsetY, speed) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__.MotionComponent);\n this._offset = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(scaleOffsetX, scaleOffsetY);\n this._speedX = this._speedY = speed;\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._startScale = this._tx.scale.clone();\n this._endScale = this._startScale.add(this._offset);\n this._distanceX = Math.abs(this._endScale.x - this._startScale.x);\n this._distanceY = Math.abs(this._endScale.y - this._startScale.y);\n this._directionX = this._endScale.x < this._startScale.x ? -1 : 1;\n this._directionY = this._endScale.y < this._startScale.y ? -1 : 1;\n }\n this._motion.scaleFactor.x = this._speedX * this._directionX;\n this._motion.scaleFactor.y = this._speedY * this._directionY;\n if (this.isComplete()) {\n this._tx.scale = this._endScale;\n this._motion.scaleFactor.x = 0;\n this._motion.scaleFactor.y = 0;\n }\n }\n isComplete() {\n return (this._stopped ||\n (Math.abs(this._tx.scale.x - this._startScale.x) >= this._distanceX - 0.01 &&\n Math.abs(this._tx.scale.y - this._startScale.y) >= this._distanceY - 0.01));\n }\n stop() {\n this._motion.scaleFactor.x = 0;\n this._motion.scaleFactor.y = 0;\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/ScaleTo.ts\":\n/*!***********************************!*\\\n !*** ./Actions/Action/ScaleTo.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ScaleTo: () => (/* binding */ ScaleTo),\n/* harmony export */ ScaleToWithOptions: () => (/* binding */ ScaleToWithOptions),\n/* harmony export */ isScaleToOptions: () => (/* binding */ isScaleToOptions)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Math */ \"./Math/util.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math */ \"./Math/lerp.ts\");\n\n\n\n\n\n/**\n *\n */\nfunction isScaleToOptions(x) {\n return typeof x.scale === 'object' && typeof x.duration === 'number';\n}\nclass ScaleToWithOptions {\n constructor(entity, options) {\n this.entity = entity;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._endScale = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(1, 1);\n this._startScale = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(1, 1);\n this._endScale = options.scale;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__.MotionComponent);\n if (!this._tx) {\n throw new Error(`Entity ${entity.name} has no TransformComponent, can only ScaleTo on Entities with TransformComponents.`);\n }\n this._durationMs = options.duration;\n this._currentMs = this._durationMs;\n }\n update(elapsed) {\n if (!this._started) {\n this._startScale = this._tx.scale;\n this._started = true;\n }\n this._currentMs -= elapsed;\n const t = (0,_Math__WEBPACK_IMPORTED_MODULE_4__.clamp)((0,_Math__WEBPACK_IMPORTED_MODULE_5__.remap)(0, this._durationMs, 0, 1, this._durationMs - this._currentMs), 0, 1);\n const newScale = (0,_Math__WEBPACK_IMPORTED_MODULE_5__.lerpVector)(this._startScale, this._endScale, t);\n const currentScale = this._tx.scale;\n const sx = newScale.sub(currentScale).scale(1 / (elapsed / 1000));\n this._motion.scaleFactor = sx;\n if (this.isComplete()) {\n this._tx.scale = this._endScale;\n this._motion.angularVelocity = 0;\n }\n }\n isComplete() {\n return this._stopped || this._currentMs < 0;\n }\n stop() {\n this._motion.scaleFactor = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n this._stopped = true;\n this._currentMs = 0;\n }\n reset() {\n this._currentMs = this._durationMs;\n this._started = false;\n this._stopped = false;\n }\n}\nclass ScaleTo {\n constructor(entity, scaleX, scaleY, speedX, speedY) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__.MotionComponent);\n this._endX = scaleX;\n this._endY = scaleY;\n this._speedX = speedX;\n this._speedY = speedY;\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._startX = this._tx.scale.x;\n this._startY = this._tx.scale.y;\n this._distanceX = Math.abs(this._endX - this._startX);\n this._distanceY = Math.abs(this._endY - this._startY);\n }\n if (!(Math.abs(this._tx.scale.x - this._startX) >= this._distanceX)) {\n const directionX = this._endY < this._startY ? -1 : 1;\n this._motion.scaleFactor.x = this._speedX * directionX;\n }\n else {\n this._motion.scaleFactor.x = 0;\n }\n if (!(Math.abs(this._tx.scale.y - this._startY) >= this._distanceY)) {\n const directionY = this._endY < this._startY ? -1 : 1;\n this._motion.scaleFactor.y = this._speedY * directionY;\n }\n else {\n this._motion.scaleFactor.y = 0;\n }\n if (this.isComplete()) {\n this._tx.scale = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(this._endX, this._endY);\n this._motion.scaleFactor.x = 0;\n this._motion.scaleFactor.y = 0;\n }\n }\n isComplete() {\n return (this._stopped ||\n (Math.abs(this._tx.scale.x - this._startX) >= this._distanceX - 0.01 &&\n Math.abs(this._tx.scale.y - this._startY) >= this._distanceY - 0.01));\n }\n stop() {\n this._motion.scaleFactor.x = 0;\n this._motion.scaleFactor.y = 0;\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/ActionsComponent.ts\":\n/*!*************************************!*\\\n !*** ./Actions/ActionsComponent.ts ***!\n \\*************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ActionsComponent: () => (/* binding */ ActionsComponent)\n/* harmony export */ });\n/* harmony import */ var _ActionContext__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./ActionContext */ \"./Actions/ActionContext.ts\");\n/* harmony import */ var _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Component */ \"./EntityComponentSystem/Component.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n\n\n\n\nclass ActionsComponent extends _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor() {\n super(...arguments);\n this.dependencies = [_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent, _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent];\n this._ctx = null;\n }\n onAdd(entity) {\n this._ctx = new _ActionContext__WEBPACK_IMPORTED_MODULE_3__.ActionContext(entity);\n }\n onRemove() {\n this._ctx = null;\n }\n _getCtx() {\n if (!this._ctx) {\n throw new Error('Actions component not attached to an entity, no context available');\n }\n return this._ctx;\n }\n /**\n * Returns the internal action queue\n * @returns action queue\n */\n getQueue() {\n if (!this._ctx) {\n throw new Error('Actions component not attached to an entity, no queue available');\n }\n return this._ctx.getQueue();\n }\n /**\n * Runs a specific action in the action queue\n * @param action\n */\n runAction(action) {\n if (!this._ctx) {\n throw new Error('Actions component not attached to an entity, cannot run action');\n }\n return this._ctx.runAction(action);\n }\n /**\n * Updates the internal action context, performing action and moving through the internal queue\n * @param elapsed\n */\n update(elapsed) {\n var _a;\n return (_a = this._ctx) === null || _a === void 0 ? void 0 : _a.update(elapsed);\n }\n /**\n * Clears all queued actions from the Actor\n */\n clearActions() {\n var _a;\n (_a = this._ctx) === null || _a === void 0 ? void 0 : _a.clearActions();\n }\n /**\n * Animates an actor with a specified bezier curve by an offset to the current position, the start point is assumed\n * to be the actors current position\n * @param options\n */\n curveBy(options) {\n return this._getCtx().curveBy.apply(this._ctx, [options]);\n }\n /**\n * Animates an actor with a specified bezier curve to an absolute world space coordinate, the start point is assumed\n * to be the actors current position\n * @param options\n */\n curveTo(options) {\n return this._getCtx().curveTo.apply(this._ctx, [options]);\n }\n easeTo(...args) {\n return this._getCtx().easeTo.apply(this._ctx, args);\n }\n easeBy(...args) {\n return this._getCtx().easeBy.apply(this._ctx, args);\n }\n moveTo(xOrPosOrOptions, yOrSpeed, speedOrUndefined) {\n return this._getCtx().moveTo.apply(this._ctx, [xOrPosOrOptions, yOrSpeed, speedOrUndefined]);\n }\n moveBy(xOffsetOrVectorOptions, yOffsetOrSpeed, speedOrUndefined) {\n return this._getCtx().moveBy.apply(this._ctx, [xOffsetOrVectorOptions, yOffsetOrSpeed, speedOrUndefined]);\n }\n rotateTo(angle, speed, rotationType) {\n return this._getCtx().rotateTo.apply(this._ctx, [angle, speed, rotationType]);\n }\n rotateBy(angleRadiansOffsetOrOptions, speed, rotationType) {\n return this._getCtx().rotateBy.apply(this._ctx, [angleRadiansOffsetOrOptions, speed, rotationType]);\n }\n scaleTo(sizeXOrVectorOrOptions, sizeYOrSpeed, speedXOrUndefined, speedYOrUndefined) {\n return this._getCtx().scaleTo.apply(this._ctx, [sizeXOrVectorOrOptions, sizeYOrSpeed, speedXOrUndefined, speedYOrUndefined]);\n }\n scaleBy(sizeOffsetXOrVectorOrOptions, sizeOffsetYOrSpeed, speed) {\n return this._getCtx().scaleBy.apply(this._ctx, [sizeOffsetXOrVectorOrOptions, sizeOffsetYOrSpeed, speed]);\n }\n /**\n * This method will cause an actor to blink (become visible and not\n * visible). Optionally, you may specify the number of blinks. Specify the amount of time\n * the actor should be visible per blink, and the amount of time not visible.\n * This method is part of the actor 'Action' fluent API allowing action chaining.\n * @param timeVisible The amount of time to stay visible per blink in milliseconds\n * @param timeNotVisible The amount of time to stay not visible per blink in milliseconds\n * @param numBlinks The number of times to blink\n */\n blink(timeVisible, timeNotVisible, numBlinks) {\n return this._getCtx().blink(timeVisible, timeNotVisible, numBlinks);\n }\n /**\n * This method will cause an actor's opacity to change from its current value\n * to the provided value by a specified time (in milliseconds). This method is\n * part of the actor 'Action' fluent API allowing action chaining.\n * @param opacity The ending opacity\n * @param duration The time it should take to fade the actor (in milliseconds)\n */\n fade(opacity, duration) {\n return this._getCtx().fade(opacity, duration);\n }\n /**\n * This will cause an actor to flash a specific color for a period of time\n * @param color\n * @param duration The duration in milliseconds\n */\n flash(color, duration = 1000) {\n return this._getCtx().flash(color, duration);\n }\n /**\n * This method will delay the next action from executing for a certain\n * amount of time (in milliseconds). This method is part of the actor\n * 'Action' fluent API allowing action chaining.\n * @param duration The amount of time to delay the next action in the queue from executing in milliseconds\n */\n delay(duration) {\n return this._getCtx().delay(duration);\n }\n /**\n * This method will add an action to the queue that will remove the actor from the\n * scene once it has completed its previous Any actions on the\n * action queue after this action will not be executed.\n */\n die() {\n return this._getCtx().die();\n }\n /**\n * This method allows you to call an arbitrary method as the next action in the\n * action queue. This is useful if you want to execute code in after a specific\n * action, i.e An actor arrives at a destination after traversing a path\n */\n callMethod(method) {\n return this._getCtx().callMethod(method);\n }\n /**\n * This method will cause the actor to repeat all of the actions built in\n * the `repeatBuilder` callback. If the number of repeats\n * is not specified it will repeat forever. This method is part of\n * the actor 'Action' fluent API allowing action chaining\n *\n * ```typescript\n * // Move up in a zig-zag by repeated moveBy's\n * actor.actions.repeat(repeatCtx => {\n * repeatCtx.moveBy(10, 0, 10);\n * repeatCtx.moveBy(0, 10, 10);\n * }, 5);\n * ```\n * @param repeatBuilder The builder to specify the repeatable list of actions\n * @param times The number of times to repeat all the previous actions in the action queue. If nothing is specified the actions\n * will repeat forever\n */\n repeat(repeatBuilder, times) {\n return this._getCtx().repeat(repeatBuilder, times);\n }\n /**\n * This method will cause the actor to repeat all of the actions built in\n * the `repeatBuilder` callback. If the number of repeats\n * is not specified it will repeat forever. This method is part of\n * the actor 'Action' fluent API allowing action chaining\n *\n * ```typescript\n * // Move up in a zig-zag by repeated moveBy's\n * actor.actions.repeat(repeatCtx => {\n * repeatCtx.moveBy(10, 0, 10);\n * repeatCtx.moveBy(0, 10, 10);\n * }, 5);\n * ```\n * @param repeatBuilder The builder to specify the repeatable list of actions\n */\n repeatForever(repeatBuilder) {\n return this._getCtx().repeatForever(repeatBuilder);\n }\n /**\n * This method will cause the entity to follow another at a specified distance\n * @param entity The entity to follow\n * @param followDistance The distance to maintain when following, if not specified the actor will follow at the current distance.\n */\n follow(entity, followDistance) {\n return this._getCtx().follow(entity, followDistance);\n }\n /**\n * This method will cause the entity to move towards another until they\n * collide \"meet\" at a specified speed.\n * @param entity The entity to meet\n * @param speed The speed in pixels per second to move, if not specified it will match the speed of the other actor\n */\n meet(entity, speed) {\n return this._getCtx().meet(entity, speed);\n }\n /**\n * Returns a promise that resolves when the current action queue up to now\n * is finished.\n */\n toPromise() {\n return this._getCtx().toPromise();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/ActionsSystem.ts\":\n/*!**********************************!*\\\n !*** ./Actions/ActionsSystem.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ActionsSystem: () => (/* binding */ ActionsSystem)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Priority.ts\");\n/* harmony import */ var _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _ActionsComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ActionsComponent */ \"./Actions/ActionsComponent.ts\");\n\n\n\nclass ActionsSystem extends _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.System {\n constructor(world) {\n super();\n this.world = world;\n this.systemType = _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.SystemType.Update;\n this._actions = [];\n this.query = this.world.query([_ActionsComponent__WEBPACK_IMPORTED_MODULE_1__.ActionsComponent]);\n this.query.entityAdded$.subscribe((e) => this._actions.push(e.get(_ActionsComponent__WEBPACK_IMPORTED_MODULE_1__.ActionsComponent)));\n this.query.entityRemoved$.subscribe((e) => {\n const action = e.get(_ActionsComponent__WEBPACK_IMPORTED_MODULE_1__.ActionsComponent);\n const index = this._actions.indexOf(action);\n if (index > -1) {\n this._actions.splice(index, 1);\n }\n });\n }\n update(elapsed) {\n for (let i = 0; i < this._actions.length; i++) {\n const action = this._actions[i];\n action.update(elapsed);\n }\n }\n}\nActionsSystem.priority = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_2__.SystemPriority.Higher;\n\n\n/***/ }),\n\n/***/ \"./Actions/index.ts\":\n/*!**************************!*\\\n !*** ./Actions/index.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ActionContext: () => (/* reexport safe */ _ActionContext__WEBPACK_IMPORTED_MODULE_0__.ActionContext),\n/* harmony export */ ActionQueue: () => (/* reexport safe */ _ActionQueue__WEBPACK_IMPORTED_MODULE_1__.ActionQueue),\n/* harmony export */ ActionSequence: () => (/* reexport safe */ _Action_ActionSequence__WEBPACK_IMPORTED_MODULE_3__.ActionSequence),\n/* harmony export */ ActionsComponent: () => (/* reexport safe */ _ActionsComponent__WEBPACK_IMPORTED_MODULE_24__.ActionsComponent),\n/* harmony export */ ActionsSystem: () => (/* reexport safe */ _ActionsSystem__WEBPACK_IMPORTED_MODULE_25__.ActionsSystem),\n/* harmony export */ Blink: () => (/* reexport safe */ _Action_Blink__WEBPACK_IMPORTED_MODULE_7__.Blink),\n/* harmony export */ CurveBy: () => (/* reexport safe */ _Action_CurveBy__WEBPACK_IMPORTED_MODULE_23__.CurveBy),\n/* harmony export */ CurveTo: () => (/* reexport safe */ _Action_CurveTo__WEBPACK_IMPORTED_MODULE_22__.CurveTo),\n/* harmony export */ Delay: () => (/* reexport safe */ _Action_Delay__WEBPACK_IMPORTED_MODULE_20__.Delay),\n/* harmony export */ Die: () => (/* reexport safe */ _Action_Die__WEBPACK_IMPORTED_MODULE_8__.Die),\n/* harmony export */ EaseBy: () => (/* reexport safe */ _Action_EaseBy__WEBPACK_IMPORTED_MODULE_10__.EaseBy),\n/* harmony export */ EaseTo: () => (/* reexport safe */ _Action_EaseTo__WEBPACK_IMPORTED_MODULE_9__.EaseTo),\n/* harmony export */ Fade: () => (/* reexport safe */ _Action_Fade__WEBPACK_IMPORTED_MODULE_11__.Fade),\n/* harmony export */ Flash: () => (/* reexport safe */ _Action_Flash__WEBPACK_IMPORTED_MODULE_21__.Flash),\n/* harmony export */ Follow: () => (/* reexport safe */ _Action_Follow__WEBPACK_IMPORTED_MODULE_12__.Follow),\n/* harmony export */ Meet: () => (/* reexport safe */ _Action_Meet__WEBPACK_IMPORTED_MODULE_13__.Meet),\n/* harmony export */ MoveBy: () => (/* reexport safe */ _Action_MoveBy__WEBPACK_IMPORTED_MODULE_14__.MoveBy),\n/* harmony export */ MoveByWithOptions: () => (/* reexport safe */ _Action_MoveBy__WEBPACK_IMPORTED_MODULE_14__.MoveByWithOptions),\n/* harmony export */ MoveTo: () => (/* reexport safe */ _Action_MoveTo__WEBPACK_IMPORTED_MODULE_15__.MoveTo),\n/* harmony export */ MoveToWithOptions: () => (/* reexport safe */ _Action_MoveTo__WEBPACK_IMPORTED_MODULE_15__.MoveToWithOptions),\n/* harmony export */ ParallelActions: () => (/* reexport safe */ _Action_ParallelActions__WEBPACK_IMPORTED_MODULE_4__.ParallelActions),\n/* harmony export */ Repeat: () => (/* reexport safe */ _Action_Repeat__WEBPACK_IMPORTED_MODULE_5__.Repeat),\n/* harmony export */ RepeatForever: () => (/* reexport safe */ _Action_RepeatForever__WEBPACK_IMPORTED_MODULE_6__.RepeatForever),\n/* harmony export */ RotateBy: () => (/* reexport safe */ _Action_RotateBy__WEBPACK_IMPORTED_MODULE_16__.RotateBy),\n/* harmony export */ RotateByWithOptions: () => (/* reexport safe */ _Action_RotateBy__WEBPACK_IMPORTED_MODULE_16__.RotateByWithOptions),\n/* harmony export */ RotateTo: () => (/* reexport safe */ _Action_RotateTo__WEBPACK_IMPORTED_MODULE_17__.RotateTo),\n/* harmony export */ RotateToWithOptions: () => (/* reexport safe */ _Action_RotateTo__WEBPACK_IMPORTED_MODULE_17__.RotateToWithOptions),\n/* harmony export */ ScaleBy: () => (/* reexport safe */ _Action_ScaleBy__WEBPACK_IMPORTED_MODULE_18__.ScaleBy),\n/* harmony export */ ScaleByWithOptions: () => (/* reexport safe */ _Action_ScaleBy__WEBPACK_IMPORTED_MODULE_18__.ScaleByWithOptions),\n/* harmony export */ ScaleTo: () => (/* reexport safe */ _Action_ScaleTo__WEBPACK_IMPORTED_MODULE_19__.ScaleTo),\n/* harmony export */ ScaleToWithOptions: () => (/* reexport safe */ _Action_ScaleTo__WEBPACK_IMPORTED_MODULE_19__.ScaleToWithOptions),\n/* harmony export */ isMoveByOptions: () => (/* reexport safe */ _Action_MoveBy__WEBPACK_IMPORTED_MODULE_14__.isMoveByOptions),\n/* harmony export */ isMoveToOptions: () => (/* reexport safe */ _Action_MoveTo__WEBPACK_IMPORTED_MODULE_15__.isMoveToOptions),\n/* harmony export */ isRotateByOptions: () => (/* reexport safe */ _Action_RotateBy__WEBPACK_IMPORTED_MODULE_16__.isRotateByOptions),\n/* harmony export */ isRotateToOptions: () => (/* reexport safe */ _Action_RotateTo__WEBPACK_IMPORTED_MODULE_17__.isRotateToOptions),\n/* harmony export */ isScaleByOptions: () => (/* reexport safe */ _Action_ScaleBy__WEBPACK_IMPORTED_MODULE_18__.isScaleByOptions),\n/* harmony export */ isScaleToOptions: () => (/* reexport safe */ _Action_ScaleTo__WEBPACK_IMPORTED_MODULE_19__.isScaleToOptions),\n/* harmony export */ nextActionId: () => (/* reexport safe */ _Action__WEBPACK_IMPORTED_MODULE_2__.nextActionId)\n/* harmony export */ });\n/* harmony import */ var _ActionContext__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ActionContext */ \"./Actions/ActionContext.ts\");\n/* harmony import */ var _ActionQueue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ActionQueue */ \"./Actions/ActionQueue.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _Action_ActionSequence__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Action/ActionSequence */ \"./Actions/Action/ActionSequence.ts\");\n/* harmony import */ var _Action_ParallelActions__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Action/ParallelActions */ \"./Actions/Action/ParallelActions.ts\");\n/* harmony import */ var _Action_Repeat__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Action/Repeat */ \"./Actions/Action/Repeat.ts\");\n/* harmony import */ var _Action_RepeatForever__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Action/RepeatForever */ \"./Actions/Action/RepeatForever.ts\");\n/* harmony import */ var _Action_Blink__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Action/Blink */ \"./Actions/Action/Blink.ts\");\n/* harmony import */ var _Action_Die__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Action/Die */ \"./Actions/Action/Die.ts\");\n/* harmony import */ var _Action_EaseTo__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Action/EaseTo */ \"./Actions/Action/EaseTo.ts\");\n/* harmony import */ var _Action_EaseBy__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Action/EaseBy */ \"./Actions/Action/EaseBy.ts\");\n/* harmony import */ var _Action_Fade__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Action/Fade */ \"./Actions/Action/Fade.ts\");\n/* harmony import */ var _Action_Follow__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Action/Follow */ \"./Actions/Action/Follow.ts\");\n/* harmony import */ var _Action_Meet__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Action/Meet */ \"./Actions/Action/Meet.ts\");\n/* harmony import */ var _Action_MoveBy__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Action/MoveBy */ \"./Actions/Action/MoveBy.ts\");\n/* harmony import */ var _Action_MoveTo__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Action/MoveTo */ \"./Actions/Action/MoveTo.ts\");\n/* harmony import */ var _Action_RotateBy__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Action/RotateBy */ \"./Actions/Action/RotateBy.ts\");\n/* harmony import */ var _Action_RotateTo__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./Action/RotateTo */ \"./Actions/Action/RotateTo.ts\");\n/* harmony import */ var _Action_ScaleBy__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Action/ScaleBy */ \"./Actions/Action/ScaleBy.ts\");\n/* harmony import */ var _Action_ScaleTo__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./Action/ScaleTo */ \"./Actions/Action/ScaleTo.ts\");\n/* harmony import */ var _Action_Delay__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./Action/Delay */ \"./Actions/Action/Delay.ts\");\n/* harmony import */ var _Action_Flash__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./Action/Flash */ \"./Actions/Action/Flash.ts\");\n/* harmony import */ var _Action_CurveTo__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./Action/CurveTo */ \"./Actions/Action/CurveTo.ts\");\n/* harmony import */ var _Action_CurveBy__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./Action/CurveBy */ \"./Actions/Action/CurveBy.ts\");\n/* harmony import */ var _ActionsComponent__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./ActionsComponent */ \"./Actions/ActionsComponent.ts\");\n/* harmony import */ var _ActionsSystem__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./ActionsSystem */ \"./Actions/ActionsSystem.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Actor.ts\":\n/*!******************!*\\\n !*** ./Actor.ts ***!\n \\******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Actor: () => (/* binding */ Actor),\n/* harmony export */ ActorEvents: () => (/* binding */ ActorEvents),\n/* harmony export */ isActor: () => (/* binding */ isActor)\n/* harmony export */ });\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./Events */ \"./Events.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Collision/BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Collision/CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./EntityComponentSystem/Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Graphics/GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Graphics_Rectangle__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Graphics/Rectangle */ \"./Graphics/Rectangle.ts\");\n/* harmony import */ var _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Collision/ColliderComponent */ \"./Collision/ColliderComponent.ts\");\n/* harmony import */ var _Collision_Colliders_Shape__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Collision/Colliders/Shape */ \"./Collision/Colliders/Shape.ts\");\n/* harmony import */ var _Util_Watch__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Util/Watch */ \"./Util/Watch.ts\");\n/* harmony import */ var _Graphics_Circle__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Graphics/Circle */ \"./Graphics/Circle.ts\");\n/* harmony import */ var _Input_PointerComponent__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Input/PointerComponent */ \"./Input/PointerComponent.ts\");\n/* harmony import */ var _Actions_ActionsComponent__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Actions/ActionsComponent */ \"./Actions/ActionsComponent.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Math/coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Type guard for checking if something is an Actor\n * @param x\n */\nfunction isActor(x) {\n return x instanceof Actor;\n}\nconst ActorEvents = {\n CollisionStart: 'collisionstart',\n CollisionEnd: 'collisionend',\n PreCollision: 'precollision',\n PostCollision: 'postcollision',\n Kill: 'kill',\n PreKill: 'prekill',\n PostKill: 'postkill',\n PreDraw: 'predraw',\n PostDraw: 'postdraw',\n PreTransformDraw: 'pretransformdraw',\n PostTransformDraw: 'posttransformdraw',\n PreDebugDraw: 'predebugdraw',\n PostDebugDraw: 'postdebugdraw',\n PointerUp: 'pointerup',\n PointerDown: 'pointerdown',\n PointerEnter: 'pointerenter',\n PointerLeave: 'pointerleave',\n PointerMove: 'pointermove',\n PointerCancel: 'pointercancel',\n Wheel: 'pointerwheel',\n PointerDrag: 'pointerdragstart',\n PointerDragEnd: 'pointerdragend',\n PointerDragEnter: 'pointerdragenter',\n PointerDragLeave: 'pointerdragleave',\n PointerDragMove: 'pointerdragmove',\n EnterViewPort: 'enterviewport',\n ExitViewPort: 'exitviewport',\n ActionStart: 'actionstart',\n ActionComplete: 'actioncomplete'\n};\n/**\n * The most important primitive in Excalibur is an `Actor`. Anything that\n * can move on the screen, collide with another `Actor`, respond to events,\n * or interact with the current scene, must be an actor. An `Actor` **must**\n * be part of a {@apilink Scene} for it to be drawn to the screen.\n */\nclass Actor extends _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__.Entity {\n /**\n * Gets the position vector of the actor in pixels\n */\n get pos() {\n return this.transform.pos;\n }\n /**\n * Sets the position vector of the actor in pixels\n */\n set pos(thePos) {\n this.transform.pos = thePos.clone();\n }\n /**\n * Gets the position vector of the actor from the last frame\n */\n get oldPos() {\n return this.body.oldPos;\n }\n /**\n * Gets the global position vector of the actor from the last frame\n */\n get oldGlobalPos() {\n return this.body.oldGlobalPos;\n }\n /**\n * Sets the position vector of the actor in the last frame\n */\n set oldPos(thePos) {\n this.body.oldPos.setTo(thePos.x, thePos.y);\n }\n /**\n * Gets the velocity vector of the actor in pixels/sec\n */\n get vel() {\n return this.motion.vel;\n }\n /**\n * Sets the velocity vector of the actor in pixels/sec\n */\n set vel(theVel) {\n this.motion.vel = theVel.clone();\n }\n /**\n * Gets the velocity vector of the actor from the last frame\n */\n get oldVel() {\n return this.body.oldVel;\n }\n /**\n * Sets the velocity vector of the actor from the last frame\n */\n set oldVel(theVel) {\n this.body.oldVel.setTo(theVel.x, theVel.y);\n }\n /**\n * Gets the acceleration vector of the actor in pixels/second/second. An acceleration pointing down such as (0, 100) may be\n * useful to simulate a gravitational effect.\n */\n get acc() {\n return this.motion.acc;\n }\n /**\n * Sets the acceleration vector of teh actor in pixels/second/second\n */\n set acc(theAcc) {\n this.motion.acc = theAcc.clone();\n }\n /**\n * Sets the acceleration of the actor from the last frame. This does not include the global acc {@apilink Physics.acc}.\n */\n set oldAcc(theAcc) {\n this.body.oldAcc.setTo(theAcc.x, theAcc.y);\n }\n /**\n * Gets the acceleration of the actor from the last frame. This does not include the global acc {@apilink Physics.acc}.\n */\n get oldAcc() {\n return this.body.oldAcc;\n }\n /**\n * Gets the rotation of the actor in radians. 1 radian = 180/PI Degrees.\n */\n get rotation() {\n return this.transform.rotation;\n }\n /**\n * Sets the rotation of the actor in radians. 1 radian = 180/PI Degrees.\n */\n set rotation(theAngle) {\n this.transform.rotation = theAngle;\n }\n /**\n * Gets the rotational velocity of the actor in radians/second\n */\n get angularVelocity() {\n return this.motion.angularVelocity;\n }\n /**\n * Sets the rotational velocity of the actor in radians/sec\n */\n set angularVelocity(angularVelocity) {\n this.motion.angularVelocity = angularVelocity;\n }\n get scale() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).scale;\n }\n set scale(scale) {\n this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).scale = scale;\n }\n /**\n * The anchor to apply all actor related transformations like rotation,\n * translation, and scaling. By default the anchor is in the center of\n * the actor. By default it is set to the center of the actor (.5, .5)\n *\n * An anchor of (.5, .5) will ensure that drawings are centered.\n *\n * Use `anchor.setTo` to set the anchor to a different point using\n * values between 0 and 1. For example, anchoring to the top-left would be\n * `Actor.anchor.setTo(0, 0)` and top-right would be `Actor.anchor.setTo(0, 1)`.\n */\n get anchor() {\n return this._anchor;\n }\n set anchor(vec) {\n this._anchor = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_2__.watch)(vec, (v) => this._handleAnchorChange(v));\n this._handleAnchorChange(vec);\n }\n _handleAnchorChange(v) {\n if (this.graphics) {\n this.graphics.anchor = v;\n }\n }\n /**\n * The offset in pixels to apply to all actor graphics\n *\n * Default offset of (0, 0)\n */\n get offset() {\n return this._offset;\n }\n set offset(vec) {\n this._offset = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_2__.watch)(vec, (v) => this._handleOffsetChange(v));\n this._handleOffsetChange(vec);\n }\n _handleOffsetChange(v) {\n if (this.graphics) {\n this.graphics.offset = v;\n }\n }\n /**\n * Indicates whether the actor is physically in the viewport\n */\n get isOffScreen() {\n return this.hasTag('ex.offscreen');\n }\n get draggable() {\n return this._draggable;\n }\n set draggable(isDraggable) {\n if (isDraggable) {\n if (isDraggable && !this._draggable) {\n this.events.on('pointerdragstart', this._pointerDragStartHandler);\n this.events.on('pointerdragend', this._pointerDragEndHandler);\n this.events.on('pointerdragmove', this._pointerDragMoveHandler);\n this.events.on('pointerdragleave', this._pointerDragLeaveHandler);\n }\n else if (!isDraggable && this._draggable) {\n this.events.off('pointerdragstart', this._pointerDragStartHandler);\n this.events.off('pointerdragend', this._pointerDragEndHandler);\n this.events.off('pointerdragmove', this._pointerDragMoveHandler);\n this.events.off('pointerdragleave', this._pointerDragLeaveHandler);\n }\n this._draggable = isDraggable;\n }\n }\n /**\n * Sets the color of the actor's current graphic\n */\n get color() {\n return this.graphics.color;\n }\n set color(v) {\n this.graphics.color = v;\n }\n // #endregion\n /**\n *\n * @param config\n */\n constructor(config) {\n super();\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_3__.EventEmitter();\n this._anchor = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_2__.watch)(_Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Half, (v) => this._handleAnchorChange(v));\n this._offset = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_2__.watch)(_Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero, (v) => this._handleOffsetChange(v));\n /**\n * Convenience reference to the global logger\n */\n this.logger = _Util_Log__WEBPACK_IMPORTED_MODULE_5__.Logger.getInstance();\n /**\n * Draggable helper\n */\n this._draggable = false;\n this._dragging = false;\n this._pointerDragStartHandler = () => {\n this._dragging = true;\n };\n this._pointerDragEndHandler = () => {\n this._dragging = false;\n };\n this._pointerDragMoveHandler = (pe) => {\n if (this._dragging) {\n this.pos = pe.worldPos;\n }\n };\n this._pointerDragLeaveHandler = (pe) => {\n if (this._dragging) {\n this.pos = pe.worldPos;\n }\n };\n const { name, x, y, pos, coordPlane, scale, width, height, radius, collider, vel, acc, rotation, angularVelocity, z, color, visible, opacity, anchor, offset, collisionType, collisionGroup, silenceWarnings } = {\n ...config\n };\n this.name = name !== null && name !== void 0 ? name : this.name;\n this.anchor = anchor !== null && anchor !== void 0 ? anchor : Actor.defaults.anchor.clone();\n this.offset = offset !== null && offset !== void 0 ? offset : _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero;\n this.transform = new _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent();\n this.addComponent(this.transform);\n this.pos = pos !== null && pos !== void 0 ? pos : (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(x !== null && x !== void 0 ? x : 0, y !== null && y !== void 0 ? y : 0);\n this.rotation = rotation !== null && rotation !== void 0 ? rotation : 0;\n this.scale = scale !== null && scale !== void 0 ? scale : (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(1, 1);\n this.z = z !== null && z !== void 0 ? z : 0;\n this.transform.coordPlane = coordPlane !== null && coordPlane !== void 0 ? coordPlane : _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__.CoordPlane.World;\n this._silenceWarnings = silenceWarnings !== null && silenceWarnings !== void 0 ? silenceWarnings : false;\n this.pointer = new _Input_PointerComponent__WEBPACK_IMPORTED_MODULE_7__.PointerComponent();\n this.addComponent(this.pointer);\n this.graphics = new _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_8__.GraphicsComponent({\n anchor: this.anchor,\n offset: this.offset,\n opacity: opacity\n });\n this.addComponent(this.graphics);\n this.motion = new _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_9__.MotionComponent();\n this.addComponent(this.motion);\n this.vel = vel !== null && vel !== void 0 ? vel : _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero;\n this.acc = acc !== null && acc !== void 0 ? acc : _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero;\n this.angularVelocity = angularVelocity !== null && angularVelocity !== void 0 ? angularVelocity : 0;\n this.actions = new _Actions_ActionsComponent__WEBPACK_IMPORTED_MODULE_10__.ActionsComponent();\n this.addComponent(this.actions);\n this.body = new _Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_11__.BodyComponent();\n this.addComponent(this.body);\n this.body.collisionType = collisionType !== null && collisionType !== void 0 ? collisionType : _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_12__.CollisionType.Passive;\n if (collisionGroup) {\n this.body.group = collisionGroup;\n }\n if (color) {\n this.color = color;\n }\n if (collider) {\n this.collider = new _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_13__.ColliderComponent(collider);\n this.addComponent(this.collider);\n }\n else if (radius) {\n this.collider = new _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_13__.ColliderComponent(_Collision_Colliders_Shape__WEBPACK_IMPORTED_MODULE_14__.Shape.Circle(radius));\n this.addComponent(this.collider);\n if (color) {\n this.graphics.add(new _Graphics_Circle__WEBPACK_IMPORTED_MODULE_15__.Circle({\n color: color,\n radius\n }));\n }\n }\n else {\n if (width > 0 && height > 0) {\n this.collider = new _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_13__.ColliderComponent(_Collision_Colliders_Shape__WEBPACK_IMPORTED_MODULE_14__.Shape.Box(width, height, this.anchor));\n this.addComponent(this.collider);\n if (color && width && height) {\n this.graphics.add(new _Graphics_Rectangle__WEBPACK_IMPORTED_MODULE_16__.Rectangle({\n color: color,\n width,\n height\n }));\n }\n }\n else {\n this.collider = new _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_13__.ColliderComponent();\n this.addComponent(this.collider); // no collider\n }\n }\n this.graphics.isVisible = visible !== null && visible !== void 0 ? visible : true;\n }\n clone() {\n const clone = new Actor({\n silenceWarnings: this._silenceWarnings,\n color: this.color.clone(),\n anchor: this.anchor.clone(),\n offset: this.offset.clone()\n });\n clone.clearComponents();\n clone.processComponentRemoval();\n // Clone builtins, order is important, same as ctor\n clone.addComponent((clone.transform = this.transform.clone()), true);\n clone.addComponent((clone.pointer = this.pointer.clone()), true);\n clone.addComponent((clone.graphics = this.graphics.clone()), true);\n clone.addComponent((clone.motion = this.motion.clone()), true);\n clone.addComponent((clone.actions = this.actions.clone()), true);\n clone.addComponent((clone.body = this.body.clone()), true);\n clone.addComponent((clone.collider = this.collider.clone()), true);\n const builtInComponents = [\n this.transform,\n this.pointer,\n this.graphics,\n this.motion,\n this.actions,\n this.body,\n this.collider\n ];\n // Clone non-builtin the current actors components\n const components = this.getComponents();\n for (const c of components) {\n if (!builtInComponents.includes(c)) {\n clone.addComponent(c.clone(), true);\n }\n }\n return clone;\n }\n /**\n * `onInitialize` is called before the first update of the actor. This method is meant to be\n * overridden. This is where initialization of child actors should take place.\n *\n * Synonymous with the event handler `.on('initialize', (evt) => {...})`\n */\n onInitialize(engine) {\n // Override me\n }\n /**\n * Initializes this actor and all it's child actors, meant to be called by the Scene before first update not by users of Excalibur.\n *\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n * @internal\n */\n _initialize(engine) {\n super._initialize(engine);\n for (const child of this.children) {\n child._initialize(engine);\n }\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n // #endregion\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _prekill handler for {@apilink onPreKill} lifecycle event\n * @internal\n */\n _prekill(scene) {\n this.events.emit('prekill', new _Events__WEBPACK_IMPORTED_MODULE_17__.PreKillEvent(this));\n this.onPreKill(scene);\n }\n /**\n * Safe to override onPreKill lifecycle event handler. Synonymous with `.on('prekill', (evt) =>{...})`\n *\n * `onPreKill` is called directly before an actor is killed and removed from its current {@apilink Scene}.\n */\n onPreKill(scene) {\n // Override me\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _prekill handler for {@apilink onPostKill} lifecycle event\n * @internal\n */\n _postkill(scene) {\n this.events.emit('postkill', new _Events__WEBPACK_IMPORTED_MODULE_17__.PostKillEvent(this));\n this.onPostKill(scene);\n }\n /**\n * Safe to override onPostKill lifecycle event handler. Synonymous with `.on('postkill', (evt) => {...})`\n *\n * `onPostKill` is called directly after an actor is killed and remove from its current {@apilink Scene}.\n */\n onPostKill(scene) {\n // Override me\n }\n /**\n * If the current actor is a member of the scene, this will remove\n * it from the scene graph. It will no longer be drawn or updated.\n */\n kill() {\n if (this.scene) {\n this._prekill(this.scene);\n this.events.emit('kill', new _Events__WEBPACK_IMPORTED_MODULE_17__.KillEvent(this));\n super.kill();\n this._postkill(this.scene);\n }\n else {\n this.logger.warn(`Cannot kill actor named \"${this.name}\", it was never added to the Scene`);\n }\n }\n /**\n * If the current actor is killed, it will now not be killed.\n */\n unkill() {\n this.isActive = true;\n }\n /**\n * Indicates wether the actor has been killed.\n */\n isKilled() {\n return !this.isActive;\n }\n /**\n * Gets the z-index of an actor. The z-index determines the relative order an actor is drawn in.\n * Actors with a higher z-index are drawn on top of actors with a lower z-index\n */\n get z() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).z;\n }\n /**\n * Sets the z-index of an actor and updates it in the drawing list for the scene.\n * The z-index determines the relative order an actor is drawn in.\n * Actors with a higher z-index are drawn on top of actors with a lower z-index\n * @param newZ new z-index to assign\n */\n set z(newZ) {\n this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).z = newZ;\n }\n /**\n * Get the center point of an actor (global position)\n */\n get center() {\n const globalPos = this.getGlobalPos();\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector(globalPos.x + this.width / 2 - this.anchor.x * this.width, globalPos.y + this.height / 2 - this.anchor.y * this.height);\n }\n /**\n * Get the local center point of an actor\n */\n get localCenter() {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector(this.pos.x + this.width / 2 - this.anchor.x * this.width, this.pos.y + this.height / 2 - this.anchor.y * this.height);\n }\n get width() {\n return this.collider.localBounds.width * this.getGlobalScale().x;\n }\n get height() {\n return this.collider.localBounds.height * this.getGlobalScale().y;\n }\n /**\n * Gets this actor's rotation taking into account any parent relationships\n * @returns Rotation angle in radians\n * @deprecated Use {@apilink globalRotation} instead\n */\n getGlobalRotation() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).globalRotation;\n }\n /**\n * The actor's rotation (in radians) taking into account any parent relationships\n */\n get globalRotation() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).globalRotation;\n }\n /**\n * Gets an actor's world position taking into account parent relationships, scaling, rotation, and translation\n * @returns Position in world coordinates\n * @deprecated Use {@apilink globalPos} instead\n */\n getGlobalPos() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).globalPos;\n }\n /**\n * The actor's world position taking into account parent relationships, scaling, rotation, and translation\n */\n get globalPos() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).globalPos;\n }\n /**\n * Gets the global scale of the Actor\n * @deprecated Use {@apilink globalScale} instead\n */\n getGlobalScale() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).globalScale;\n }\n /**\n * The global scale of the Actor\n */\n get globalScale() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).globalScale;\n }\n /**\n * The global z-index of the actor\n */\n get globalZ() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).globalZ;\n }\n // #region Collision\n /**\n * Tests whether the x/y specified are contained in the actor\n * @param x X coordinate to test (in world coordinates)\n * @param y Y coordinate to test (in world coordinates)\n * @param recurse checks whether the x/y are contained in any child actors (if they exist).\n */\n contains(x, y, recurse = false) {\n const point = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(x, y);\n const collider = this.get(_Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_13__.ColliderComponent);\n collider.update();\n const geom = collider.get();\n if (!geom) {\n return false;\n }\n const containment = geom.contains(point);\n if (recurse) {\n return (containment ||\n this.children.some((child) => {\n return child.contains(x, y, true);\n }));\n }\n return containment;\n }\n /**\n * Returns true if the two actor.collider's surfaces are less than or equal to the distance specified from each other\n * @param actor Actor to test\n * @param distance Distance in pixels to test\n */\n within(actor, distance) {\n const collider = this.get(_Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_13__.ColliderComponent);\n const otherCollider = actor.get(_Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_13__.ColliderComponent);\n const me = collider.get();\n const other = otherCollider.get();\n if (me && other) {\n return me.getClosestLineBetween(other).getLength() <= distance;\n }\n return false;\n }\n // #endregion\n // #region Update\n /**\n * Called by the Engine, updates the state of the actor\n * @internal\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n */\n update(engine, elapsed) {\n this._initialize(engine);\n this._add(engine);\n this._preupdate(engine, elapsed);\n this._postupdate(engine, elapsed);\n this._remove(engine);\n }\n /**\n * Safe to override onPreUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPreUpdate` is called directly before an actor is updated.\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n */\n onPreUpdate(engine, elapsed) {\n // Override me\n }\n /**\n * Safe to override onPostUpdate lifecycle event handler. Synonymous with `.on('postupdate', (evt) =>{...})`\n *\n * `onPostUpdate` is called directly after an actor is updated.\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n */\n onPostUpdate(engine, elapsed) {\n // Override me\n }\n /**\n * Fires before every collision resolution for a confirmed contact\n * @param self\n * @param other\n * @param side\n * @param contact\n */\n onPreCollisionResolve(self, other, side, contact) {\n // Override me\n }\n /**\n * Fires after every resolution for a confirmed contact.\n * @param self\n * @param other\n * @param side\n * @param contact\n */\n onPostCollisionResolve(self, other, side, contact) {\n // Override me\n }\n /**\n * Fires once when 2 entities with a ColliderComponent first start colliding or touching, if the Colliders stay in contact this\n * does not continue firing until they separate and re-collide.\n * @param self\n * @param other\n * @param side\n * @param contact\n */\n onCollisionStart(self, other, side, contact) {\n // Override me\n }\n /**\n * Fires once when 2 entities with a ColliderComponent separate after having been in contact.\n * @param self\n * @param other\n * @param side\n * @param lastContact\n */\n onCollisionEnd(self, other, side, lastContact) {\n // Override me\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _preupdate handler for {@apilink onPreUpdate} lifecycle event\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n * @internal\n */\n _preupdate(engine, elapsed) {\n this.events.emit('preupdate', new _Events__WEBPACK_IMPORTED_MODULE_17__.PreUpdateEvent(engine, elapsed, this));\n this.onPreUpdate(engine, elapsed);\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _preupdate handler for {@apilink onPostUpdate} lifecycle event\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n * @internal\n */\n _postupdate(engine, elapsed) {\n this.events.emit('postupdate', new _Events__WEBPACK_IMPORTED_MODULE_17__.PostUpdateEvent(engine, elapsed, this));\n this.onPostUpdate(engine, elapsed);\n }\n}\n// #region Properties\n/**\n * Set defaults for all Actors\n */\nActor.defaults = {\n anchor: _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Half\n};\n\n\n/***/ }),\n\n/***/ \"./Camera.ts\":\n/*!*******************!*\\\n !*** ./Camera.ts ***!\n \\*******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Axis: () => (/* binding */ Axis),\n/* harmony export */ Camera: () => (/* binding */ Camera),\n/* harmony export */ CameraEvents: () => (/* binding */ CameraEvents),\n/* harmony export */ ElasticToActorStrategy: () => (/* binding */ ElasticToActorStrategy),\n/* harmony export */ LimitCameraBoundsStrategy: () => (/* binding */ LimitCameraBoundsStrategy),\n/* harmony export */ LockCameraToActorAxisStrategy: () => (/* binding */ LockCameraToActorAxisStrategy),\n/* harmony export */ LockCameraToActorStrategy: () => (/* binding */ LockCameraToActorStrategy),\n/* harmony export */ RadiusAroundActorStrategy: () => (/* binding */ RadiusAroundActorStrategy),\n/* harmony export */ StrategyContainer: () => (/* binding */ StrategyContainer)\n/* harmony export */ });\n/* harmony import */ var _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Util/EasingFunctions */ \"./Util/EasingFunctions.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Util/Util */ \"./Util/Util.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Events */ \"./Events.ts\");\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Math/affine-matrix */ \"./Math/affine-matrix.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Graphics */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Math_watch_vector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Math/watch-vector */ \"./Math/watch-vector.ts\");\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Container to house convenience strategy methods\n * @internal\n */\nclass StrategyContainer {\n constructor(camera) {\n this.camera = camera;\n }\n /**\n * Creates and adds the {@apilink LockCameraToActorStrategy} on the current camera.\n * @param actor The actor to lock the camera to\n */\n lockToActor(actor) {\n this.camera.addStrategy(new LockCameraToActorStrategy(actor));\n }\n /**\n * Creates and adds the {@apilink LockCameraToActorAxisStrategy} on the current camera\n * @param actor The actor to lock the camera to\n * @param axis The axis to follow the actor on\n */\n lockToActorAxis(actor, axis) {\n this.camera.addStrategy(new LockCameraToActorAxisStrategy(actor, axis));\n }\n /**\n * Creates and adds the {@apilink ElasticToActorStrategy} on the current camera\n * If cameraElasticity < cameraFriction < 1.0, the behavior will be a dampened spring that will slowly end at the target without bouncing\n * If cameraFriction < cameraElasticity < 1.0, the behavior will be an oscillating spring that will over\n * correct and bounce around the target\n * @param actor Target actor to elastically follow\n * @param cameraElasticity [0 - 1.0] The higher the elasticity the more force that will drive the camera towards the target\n * @param cameraFriction [0 - 1.0] The higher the friction the more that the camera will resist motion towards the target\n */\n elasticToActor(actor, cameraElasticity, cameraFriction) {\n this.camera.addStrategy(new ElasticToActorStrategy(actor, cameraElasticity, cameraFriction));\n }\n /**\n * Creates and adds the {@apilink RadiusAroundActorStrategy} on the current camera\n * @param actor Target actor to follow when it is \"radius\" pixels away\n * @param radius Number of pixels away before the camera will follow\n */\n radiusAroundActor(actor, radius) {\n this.camera.addStrategy(new RadiusAroundActorStrategy(actor, radius));\n }\n /**\n * Creates and adds the {@apilink LimitCameraBoundsStrategy} on the current camera\n * @param box The bounding box to limit the camera to.\n */\n limitCameraBounds(box) {\n this.camera.addStrategy(new LimitCameraBoundsStrategy(box));\n }\n}\n/**\n * Camera axis enum\n */\nvar Axis;\n(function (Axis) {\n Axis[Axis[\"X\"] = 0] = \"X\";\n Axis[Axis[\"Y\"] = 1] = \"Y\";\n})(Axis || (Axis = {}));\n/**\n * Lock a camera to the exact x/y position of an actor.\n */\nclass LockCameraToActorStrategy {\n constructor(target) {\n this.target = target;\n this.action = (target, camera, engine, elapsed) => {\n const center = target.center;\n return center;\n };\n }\n}\n/**\n * Lock a camera to a specific axis around an actor.\n */\nclass LockCameraToActorAxisStrategy {\n constructor(target, axis) {\n this.target = target;\n this.axis = axis;\n this.action = (target, cam, _eng, elapsed) => {\n const center = target.center;\n const currentFocus = cam.getFocus();\n if (this.axis === Axis.X) {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(center.x, currentFocus.y);\n }\n else {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(currentFocus.x, center.y);\n }\n };\n }\n}\n/**\n * Using [Hook's law](https://en.wikipedia.org/wiki/Hooke's_law), elastically move the camera towards the target actor.\n */\nclass ElasticToActorStrategy {\n /**\n * If cameraElasticity < cameraFriction < 1.0, the behavior will be a dampened spring that will slowly end at the target without bouncing\n * If cameraFriction < cameraElasticity < 1.0, the behavior will be an oscillating spring that will over\n * correct and bounce around the target\n * @param target Target actor to elastically follow\n * @param cameraElasticity [0 - 1.0] The higher the elasticity the more force that will drive the camera towards the target\n * @param cameraFriction [0 - 1.0] The higher the friction the more that the camera will resist motion towards the target\n */\n constructor(target, cameraElasticity, cameraFriction) {\n this.target = target;\n this.cameraElasticity = cameraElasticity;\n this.cameraFriction = cameraFriction;\n this.action = (target, cam, _eng, elapsed) => {\n const position = target.center;\n let focus = cam.getFocus();\n let cameraVel = cam.vel.clone();\n // Calculate the stretch vector, using the spring equation\n // F = kX\n // https://en.wikipedia.org/wiki/Hooke's_law\n // Apply to the current camera velocity\n const stretch = position.sub(focus).scale(this.cameraElasticity); // stretch is X\n cameraVel = cameraVel.add(stretch);\n // Calculate the friction (-1 to apply a force in the opposition of motion)\n // Apply to the current camera velocity\n const friction = cameraVel.scale(-1).scale(this.cameraFriction);\n cameraVel = cameraVel.add(friction);\n // Update position by velocity deltas\n focus = focus.add(cameraVel);\n return focus;\n };\n }\n}\nclass RadiusAroundActorStrategy {\n /**\n *\n * @param target Target actor to follow when it is \"radius\" pixels away\n * @param radius Number of pixels away before the camera will follow\n */\n constructor(target, radius) {\n this.target = target;\n this.radius = radius;\n this.action = (target, cam, _eng, elapsed) => {\n const position = target.center;\n const focus = cam.getFocus();\n const direction = position.sub(focus);\n const distance = direction.magnitude;\n if (distance >= this.radius) {\n const offset = distance - this.radius;\n return focus.add(direction.normalize().scale(offset));\n }\n return focus;\n };\n }\n}\n/**\n * Prevent a camera from going beyond the given camera dimensions.\n */\nclass LimitCameraBoundsStrategy {\n constructor(target) {\n this.target = target;\n /**\n * Useful for limiting the camera to a {@apilink TileMap}'s dimensions, or a specific area inside the map.\n *\n * Note that this strategy does not perform any movement by itself.\n * It only sets the camera position to within the given bounds when the camera has gone beyond them.\n * Thus, it is a good idea to combine it with other camera strategies and set this strategy as the last one.\n *\n * Make sure that the camera bounds are at least as large as the viewport size.\n * @param target The bounding box to limit the camera to\n */\n this.boundSizeChecked = false; // Check and warn only once\n this.action = (target, cam, _eng, elapsed) => {\n const focus = cam.getFocus();\n if (!this.boundSizeChecked) {\n if (target.bottom - target.top < _eng.drawHeight || target.right - target.left < _eng.drawWidth) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance().warn('Camera bounds should not be smaller than the engine viewport');\n }\n this.boundSizeChecked = true;\n }\n let focusX = focus.x;\n let focusY = focus.y;\n if (focus.x < target.left + _eng.halfDrawWidth) {\n focusX = target.left + _eng.halfDrawWidth;\n }\n else if (focus.x > target.right - _eng.halfDrawWidth) {\n focusX = target.right - _eng.halfDrawWidth;\n }\n if (focus.y < target.top + _eng.halfDrawHeight) {\n focusY = target.top + _eng.halfDrawHeight;\n }\n else if (focus.y > target.bottom - _eng.halfDrawHeight) {\n focusY = target.bottom - _eng.halfDrawHeight;\n }\n return (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(focusX, focusY);\n };\n }\n}\nconst CameraEvents = {\n Initialize: 'initialize',\n PreUpdate: 'preupdate',\n PostUpdate: 'postupdate'\n};\n/**\n * Cameras\n *\n * {@apilink Camera} is the base class for all Excalibur cameras. Cameras are used\n * to move around your game and set focus. They are used to determine\n * what is \"off screen\" and can be used to scale the game.\n *\n */\nclass Camera {\n constructor() {\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_2__.EventEmitter();\n this.transform = _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_3__.AffineMatrix.identity();\n this.inverse = _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_3__.AffineMatrix.identity();\n this._cameraStrategies = [];\n this.strategy = new StrategyContainer(this);\n /**\n * Get or set current zoom of the camera, defaults to 1\n */\n this._z = 1;\n /**\n * Get or set rate of change in zoom, defaults to 0\n */\n this.dz = 0;\n /**\n * Get or set zoom acceleration\n */\n this.az = 0;\n /**\n * Current rotation of the camera\n */\n this.rotation = 0;\n this._angularVelocity = 0;\n this._posChanged = false;\n this._pos = new _Math_watch_vector__WEBPACK_IMPORTED_MODULE_4__.WatchVector(_Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero, () => {\n this._posChanged = true;\n });\n /**\n * Interpolated camera position if more draws are running than updates\n *\n * Enabled when `Engine.fixedUpdateFps` is enabled, in all other cases this will be the same as pos\n */\n this.drawPos = this.pos.clone();\n this._oldPos = this.pos.clone();\n /**\n * Get or set the camera's velocity\n */\n this.vel = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero;\n /**\n * Get or set the camera's acceleration\n */\n this.acc = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero;\n this._cameraMoving = false;\n this._currentLerpTime = 0;\n this._lerpDuration = 1000; // 1 second\n this._lerpStart = null;\n this._lerpEnd = null;\n //camera effects\n this._isShaking = false;\n this._shakeMagnitudeX = 0;\n this._shakeMagnitudeY = 0;\n this._shakeDuration = 0;\n this._elapsedShakeTime = 0;\n this._xShake = 0;\n this._yShake = 0;\n this._isZooming = false;\n this._zoomStart = 1;\n this._zoomEnd = 1;\n this._currentZoomTime = 0;\n this._zoomDuration = 0;\n this._zoomEasing = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_5__.EasingFunctions.EaseInOutCubic;\n this._easing = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_5__.EasingFunctions.EaseInOutCubic;\n this._halfWidth = 0;\n this._halfHeight = 0;\n this._viewport = null;\n this._isInitialized = false;\n this._snapPos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n }\n get zoom() {\n return this._z;\n }\n set zoom(val) {\n this._z = val;\n if (this._engine) {\n this._halfWidth = this._engine.halfDrawWidth;\n this._halfHeight = this._engine.halfDrawHeight;\n }\n }\n /**\n * Get or set the camera's angular velocity\n */\n get angularVelocity() {\n return this._angularVelocity;\n }\n set angularVelocity(value) {\n this._angularVelocity = value;\n }\n /**\n * Get or set the camera's position\n */\n get pos() {\n return this._pos;\n }\n set pos(vec) {\n this._posChanged = true;\n this._pos = new _Math_watch_vector__WEBPACK_IMPORTED_MODULE_4__.WatchVector(vec, () => {\n this._posChanged = true;\n });\n }\n /**\n * Has the position changed since the last update\n */\n hasChanged() {\n return this._posChanged;\n }\n /**\n * Get the camera's x position\n */\n get x() {\n return this.pos.x;\n }\n /**\n * Set the camera's x position (cannot be set when following an {@apilink Actor} or when moving)\n */\n set x(value) {\n if (!this._follow && !this._cameraMoving) {\n this.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(value, this.pos.y);\n }\n }\n /**\n * Get the camera's y position\n */\n get y() {\n return this.pos.y;\n }\n /**\n * Set the camera's y position (cannot be set when following an {@apilink Actor} or when moving)\n */\n set y(value) {\n if (!this._follow && !this._cameraMoving) {\n this.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.pos.x, value);\n }\n }\n /**\n * Get or set the camera's x velocity\n */\n get dx() {\n return this.vel.x;\n }\n set dx(value) {\n this.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(value, this.vel.y);\n }\n /**\n * Get or set the camera's y velocity\n */\n get dy() {\n return this.vel.y;\n }\n set dy(value) {\n this.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.vel.x, value);\n }\n /**\n * Get or set the camera's x acceleration\n */\n get ax() {\n return this.acc.x;\n }\n set ax(value) {\n this.acc = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(value, this.acc.y);\n }\n /**\n * Get or set the camera's y acceleration\n */\n get ay() {\n return this.acc.y;\n }\n set ay(value) {\n this.acc = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.acc.x, value);\n }\n /**\n * Returns the focal point of the camera, a new point giving the x and y position of the camera\n */\n getFocus() {\n return this.pos;\n }\n /**\n * This moves the camera focal point to the specified position using specified easing function. Cannot move when following an Actor.\n * @param pos The target position to move to\n * @param duration The duration in milliseconds the move should last\n * @param [easingFn] An optional easing function ({@apilink EasingFunctions.EaseInOutCubic} by default)\n * @returns A {@apilink Promise} that resolves when movement is finished, including if it's interrupted.\n * The {@apilink Promise} value is the {@apilink Vector} of the target position. It will be rejected if a move cannot be made.\n */\n move(pos, duration, easingFn = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_5__.EasingFunctions.EaseInOutCubic) {\n if (typeof easingFn !== 'function') {\n throw 'Please specify an EasingFunction';\n }\n // cannot move when following an actor\n if (this._follow) {\n return Promise.reject(pos);\n }\n // resolve existing promise, if any\n if (this._lerpPromise && this._lerpResolve) {\n this._lerpResolve(pos);\n }\n this._lerpPromise = new Promise((resolve) => {\n this._lerpResolve = resolve;\n });\n this._lerpStart = this.getFocus().clone();\n this._lerpDuration = duration;\n this._lerpEnd = pos;\n this._currentLerpTime = 0;\n this._cameraMoving = true;\n this._easing = easingFn;\n return this._lerpPromise;\n }\n /**\n * Sets the camera to shake at the specified magnitudes for the specified duration\n * @param magnitudeX The x magnitude of the shake\n * @param magnitudeY The y magnitude of the shake\n * @param duration The duration of the shake in milliseconds\n */\n shake(magnitudeX, magnitudeY, duration) {\n this._isShaking = true;\n this._shakeMagnitudeX = magnitudeX;\n this._shakeMagnitudeY = magnitudeY;\n this._shakeDuration = duration;\n }\n /**\n * Zooms the camera in or out by the specified scale over the specified duration.\n * If no duration is specified, it take effect immediately.\n * @param scale The scale of the zoom\n * @param duration The duration of the zoom in milliseconds\n */\n zoomOverTime(scale, duration = 0, easingFn = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_5__.EasingFunctions.EaseInOutCubic) {\n this._zoomPromise = new Promise((resolve) => {\n this._zoomResolve = resolve;\n });\n if (duration) {\n this._isZooming = true;\n this._zoomEasing = easingFn;\n this._currentZoomTime = 0;\n this._zoomDuration = duration;\n this._zoomStart = this.zoom;\n this._zoomEnd = scale;\n }\n else {\n this._isZooming = false;\n this.zoom = scale;\n return Promise.resolve(true);\n }\n return this._zoomPromise;\n }\n /**\n * Gets the bounding box of the viewport of this camera in world coordinates\n */\n get viewport() {\n if (this._viewport) {\n return this._viewport;\n }\n return new _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox(0, 0, 0, 0);\n }\n /**\n * Adds a new camera strategy to this camera\n * @param cameraStrategy Instance of an {@apilink CameraStrategy}\n */\n addStrategy(cameraStrategy) {\n this._cameraStrategies.push(cameraStrategy);\n }\n /**\n * Removes a camera strategy by reference\n * @param cameraStrategy Instance of an {@apilink CameraStrategy}\n */\n removeStrategy(cameraStrategy) {\n (0,_Util_Util__WEBPACK_IMPORTED_MODULE_7__.removeItemFromArray)(cameraStrategy, this._cameraStrategies);\n }\n /**\n * Clears all camera strategies from the camera\n */\n clearAllStrategies() {\n this._cameraStrategies.length = 0;\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _preupdate handler for {@apilink onPreUpdate} lifecycle event\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n * @internal\n */\n _preupdate(engine, elapsed) {\n this.events.emit('preupdate', new _Events__WEBPACK_IMPORTED_MODULE_8__.PreUpdateEvent(engine, elapsed, this));\n this.onPreUpdate(engine, elapsed);\n }\n /**\n * Safe to override onPreUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPreUpdate` is called directly before a scene is updated.\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n */\n onPreUpdate(engine, elapsed) {\n // Overridable\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _preupdate handler for {@apilink onPostUpdate} lifecycle event\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n * @internal\n */\n _postupdate(engine, elapsed) {\n this.events.emit('postupdate', new _Events__WEBPACK_IMPORTED_MODULE_8__.PostUpdateEvent(engine, elapsed, this));\n this.onPostUpdate(engine, elapsed);\n }\n /**\n * Safe to override onPostUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPostUpdate` is called directly after a scene is updated.\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n */\n onPostUpdate(engine, elapsed) {\n // Overridable\n }\n get isInitialized() {\n return this._isInitialized;\n }\n _initialize(engine) {\n if (!this.isInitialized) {\n this._engine = engine;\n this._screen = engine.screen;\n const currentRes = this._screen.contentArea;\n let center = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(currentRes.width / 2, currentRes.height / 2);\n if (!this._engine.loadingComplete) {\n // If there was a loading screen, we peek the configured resolution\n const res = this._screen.peekResolution();\n if (res) {\n center = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(res.width / 2, res.height / 2);\n }\n }\n this._halfWidth = center.x;\n this._halfHeight = center.y;\n // If the user has not set the camera pos, apply default center screen position\n if (!this._posChanged) {\n this.pos = center;\n }\n this.pos.clone(this.drawPos);\n // First frame bootstrap\n // Ensure camera tx is correct\n // Run update twice to ensure properties are init'd\n this.updateTransform(this.pos);\n // Run strategies for first frame\n this.runStrategies(engine, engine.clock.elapsed());\n // Setup the first frame viewport\n this.updateViewport();\n // It's important to update the camera after strategies\n // This prevents jitter\n this.updateTransform(this.pos);\n this.pos.clone(this._oldPos);\n this.onInitialize(engine);\n this.events.emit('initialize', new _Events__WEBPACK_IMPORTED_MODULE_8__.InitializeEvent(engine, this));\n this._isInitialized = true;\n }\n }\n /**\n * Safe to override onPostUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPostUpdate` is called directly after a scene is updated.\n */\n onInitialize(engine) {\n // Overridable\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n runStrategies(engine, elapsed) {\n for (const s of this._cameraStrategies) {\n this.pos = s.action.call(s, s.target, this, engine, elapsed);\n }\n }\n updateViewport() {\n // recalculate viewport\n this._viewport = new _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox(this.x - this._halfWidth, this.y - this._halfHeight, this.x + this._halfWidth, this.y + this._halfHeight);\n }\n update(engine, elapsed) {\n this._initialize(engine);\n this._preupdate(engine, elapsed);\n this.pos.clone(this._oldPos);\n // Update placements based on linear algebra\n this.pos = this.pos.add(this.vel.scale(elapsed / 1000));\n this.zoom += (this.dz * elapsed) / 1000;\n this.vel = this.vel.add(this.acc.scale(elapsed / 1000));\n this.dz += (this.az * elapsed) / 1000;\n this.rotation += (this.angularVelocity * elapsed) / 1000;\n if (this._isZooming) {\n if (this._currentZoomTime < this._zoomDuration) {\n const zoomEasing = this._zoomEasing;\n const newZoom = zoomEasing(this._currentZoomTime, this._zoomStart, this._zoomEnd, this._zoomDuration);\n this.zoom = newZoom;\n this._currentZoomTime += elapsed;\n }\n else {\n this._isZooming = false;\n this.zoom = this._zoomEnd;\n this._currentZoomTime = 0;\n this._zoomResolve(true);\n }\n }\n if (this._cameraMoving) {\n if (this._currentLerpTime < this._lerpDuration) {\n const moveEasing = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_5__.EasingFunctions.CreateVectorEasingFunction(this._easing);\n const lerpPoint = moveEasing(this._currentLerpTime, this._lerpStart, this._lerpEnd, this._lerpDuration);\n this.pos = lerpPoint;\n this._currentLerpTime += elapsed;\n }\n else {\n this.pos = this._lerpEnd;\n const end = this._lerpEnd.clone();\n this._lerpStart = null;\n this._lerpEnd = null;\n this._currentLerpTime = 0;\n this._cameraMoving = false;\n // Order matters here, resolve should be last so any chain promises have a clean slate\n this._lerpResolve(end);\n }\n }\n if (this._isDoneShaking()) {\n this._isShaking = false;\n this._elapsedShakeTime = 0;\n this._shakeMagnitudeX = 0;\n this._shakeMagnitudeY = 0;\n this._shakeDuration = 0;\n this._xShake = 0;\n this._yShake = 0;\n }\n else {\n this._elapsedShakeTime += elapsed;\n this._xShake = ((Math.random() * this._shakeMagnitudeX) | 0) + 1;\n this._yShake = ((Math.random() * this._shakeMagnitudeY) | 0) + 1;\n }\n this.runStrategies(engine, elapsed);\n this.updateViewport();\n // It's important to update the camera after strategies\n // This prevents jitter\n this.updateTransform(this.pos);\n this._postupdate(engine, elapsed);\n this._posChanged = false;\n }\n /**\n * Applies the relevant transformations to the game canvas to \"move\" or apply effects to the Camera\n * @param ctx Canvas context to apply transformations\n */\n draw(ctx) {\n // default to the current position\n this.pos.clone(this.drawPos);\n // interpolation if fixed update is on\n // must happen on the draw, because more draws are potentially happening than updates\n if (this._engine.fixedUpdateTimestep) {\n const blend = this._engine.currentFrameLagMs / this._engine.fixedUpdateTimestep;\n const interpolatedPos = this.pos.scale(blend).add(this._oldPos.scale(1.0 - blend));\n interpolatedPos.clone(this.drawPos);\n this.updateTransform(interpolatedPos);\n }\n // Snap camera to pixel\n if (ctx.snapToPixel) {\n const snapPos = this.drawPos.clone(this._snapPos);\n snapPos.x = ~~(snapPos.x + _Graphics__WEBPACK_IMPORTED_MODULE_9__.pixelSnapEpsilon * (0,_Math_util__WEBPACK_IMPORTED_MODULE_10__.sign)(snapPos.x));\n snapPos.y = ~~(snapPos.y + _Graphics__WEBPACK_IMPORTED_MODULE_9__.pixelSnapEpsilon * (0,_Math_util__WEBPACK_IMPORTED_MODULE_10__.sign)(snapPos.y));\n snapPos.clone(this.drawPos);\n this.updateTransform(snapPos);\n }\n ctx.multiply(this.transform);\n }\n updateTransform(pos) {\n // center the camera\n const newCanvasWidth = this._screen.resolution.width / this.zoom;\n const newCanvasHeight = this._screen.resolution.height / this.zoom;\n const cameraPos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(-pos.x + newCanvasWidth / 2 + this._xShake, -pos.y + newCanvasHeight / 2 + this._yShake);\n // Calculate camera transform\n this.transform.reset();\n this.transform.scale(this.zoom, this.zoom);\n // rotate about the focus\n this.transform.translate(newCanvasWidth / 2, newCanvasHeight / 2);\n this.transform.rotate(this.rotation);\n this.transform.translate(-newCanvasWidth / 2, -newCanvasHeight / 2);\n this.transform.translate(cameraPos.x, cameraPos.y);\n this.transform.inverse(this.inverse);\n }\n _isDoneShaking() {\n return !this._isShaking || this._elapsedShakeTime >= this._shakeDuration;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/BodyComponent.ts\":\n/*!************************************!*\\\n !*** ./Collision/BodyComponent.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BodyComponent: () => (/* binding */ BodyComponent),\n/* harmony export */ DegreeOfFreedom: () => (/* binding */ DegreeOfFreedom)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Component */ \"./EntityComponentSystem/Component.ts\");\n/* harmony import */ var _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Group/CollisionGroup */ \"./Collision/Group/CollisionGroup.ts\");\n/* harmony import */ var _Id__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Id */ \"./Id.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _ColliderComponent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./ColliderComponent */ \"./Collision/ColliderComponent.ts\");\n/* harmony import */ var _Math_transform__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Math/transform */ \"./Math/transform.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _PhysicsConfig__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./PhysicsConfig */ \"./Collision/PhysicsConfig.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\nvar DegreeOfFreedom;\n(function (DegreeOfFreedom) {\n DegreeOfFreedom[\"Rotation\"] = \"rotation\";\n DegreeOfFreedom[\"X\"] = \"x\";\n DegreeOfFreedom[\"Y\"] = \"y\";\n})(DegreeOfFreedom || (DegreeOfFreedom = {}));\n/**\n * Body describes all the physical properties pos, vel, acc, rotation, angular velocity for the purpose of\n * of physics simulation.\n */\nclass BodyComponent extends _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor(options) {\n var _a, _b, _c;\n super();\n this.dependencies = [_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent, _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent];\n this.id = (0,_Id__WEBPACK_IMPORTED_MODULE_3__.createId)('body', BodyComponent._ID++);\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_4__.EventEmitter();\n this.oldTransform = new _Math_transform__WEBPACK_IMPORTED_MODULE_5__.Transform();\n /**\n * Indicates whether the old transform has been captured at least once for interpolation\n * @internal\n */\n this.__oldTransformCaptured = false;\n /**\n * Enable or disabled the fixed update interpolation, by default interpolation is on.\n */\n this.enableFixedUpdateInterpolate = true;\n /**\n * Collision type for the rigidbody physics simulation, by default {@apilink CollisionType.PreventCollision}\n */\n this.collisionType = _CollisionType__WEBPACK_IMPORTED_MODULE_6__.CollisionType.PreventCollision;\n /**\n * The collision group for the body's colliders, by default body colliders collide with everything\n */\n this.group = _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_7__.CollisionGroup.All;\n this._sleeping = false;\n /**\n * The also known as coefficient of restitution of this actor, represents the amount of energy preserved after collision or the\n * bounciness. If 1, it is 100% bouncy, 0 it completely absorbs.\n */\n this.bounciness = 0.2;\n /**\n * The coefficient of friction on this actor.\n *\n * The {@apilink SolverStrategy.Arcade} does not support this property.\n *\n */\n this.friction = 0.99;\n /**\n * Should use global gravity {@apilink Physics.gravity} in it's physics simulation, default is true\n */\n this.useGravity = true;\n /**\n * Degrees of freedom to limit\n *\n * Note: this only limits responses in the realistic solver, if velocity/angularVelocity is set the actor will still respond\n */\n this.limitDegreeOfFreedom = [];\n this._oldGlobalPos = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Zero;\n /**\n * The velocity of the actor last frame (vx, vy) in pixels/second\n */\n this.oldVel = new _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector(0, 0);\n /**\n * Gets/sets the acceleration of the actor from the last frame. This does not include the global acc {@apilink Physics.acc}.\n */\n this.oldAcc = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Zero;\n this._impulseScratch = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_8__.vec)(0, 0);\n this._distanceFromCenterScratch = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_8__.vec)(0, 0);\n if (options) {\n this.collisionType = (_a = options.type) !== null && _a !== void 0 ? _a : this.collisionType;\n this.group = (_b = options.group) !== null && _b !== void 0 ? _b : this.group;\n this.useGravity = (_c = options.useGravity) !== null && _c !== void 0 ? _c : this.useGravity;\n this._bodyConfig = {\n ...(0,_PhysicsConfig__WEBPACK_IMPORTED_MODULE_9__.getDefaultPhysicsConfig)().bodies,\n ...options.config\n };\n }\n else {\n this._bodyConfig = {\n ...(0,_PhysicsConfig__WEBPACK_IMPORTED_MODULE_9__.getDefaultPhysicsConfig)().bodies\n };\n }\n this.updatePhysicsConfig(this._bodyConfig);\n this._mass = BodyComponent._DEFAULT_CONFIG.defaultMass;\n }\n get matrix() {\n return this.transform.get().matrix;\n }\n /**\n * Called by excalibur to update physics config defaults if they change\n * @param config\n */\n updatePhysicsConfig(config) {\n this._bodyConfig = {\n ...(0,_PhysicsConfig__WEBPACK_IMPORTED_MODULE_9__.getDefaultPhysicsConfig)().bodies,\n ...config\n };\n this.canSleep = this._bodyConfig.canSleepByDefault;\n this.sleepMotion = this._bodyConfig.sleepEpsilon * 5;\n this.wakeThreshold = this._bodyConfig.wakeThreshold;\n }\n /**\n * Called by excalibur to update defaults\n * @param config\n */\n static updateDefaultPhysicsConfig(config) {\n BodyComponent._DEFAULT_CONFIG = config;\n }\n get mass() {\n return this._mass;\n }\n set mass(newMass) {\n this._mass = newMass;\n this._cachedInertia = undefined;\n this._cachedInverseInertia = undefined;\n }\n /**\n * The inverse mass (1/mass) of the body. If {@apilink CollisionType.Fixed} this is 0, meaning \"infinite\" mass\n */\n get inverseMass() {\n return this.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_6__.CollisionType.Fixed ? 0 : 1 / this.mass;\n }\n /**\n * Whether this body is sleeping or not\n * @deprecated use isSleeping\n */\n get sleeping() {\n return this.isSleeping;\n }\n /**\n * Whether this body is sleeping or not\n */\n get isSleeping() {\n return this._sleeping;\n }\n /**\n * Set the sleep state of the body\n * @param sleeping\n * @deprecated use isSleeping\n */\n setSleeping(sleeping) {\n this.isSleeping = sleeping;\n }\n set isSleeping(sleeping) {\n this._sleeping = sleeping;\n if (!sleeping) {\n // Give it a kick to keep it from falling asleep immediately\n this.sleepMotion = this._bodyConfig.sleepEpsilon * 5;\n }\n else {\n this.vel = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Zero;\n this.acc = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Zero;\n this.angularVelocity = 0;\n this.sleepMotion = 0;\n }\n }\n /**\n * Update body's {@apilink BodyComponent.sleepMotion} for the purpose of sleeping\n */\n updateMotion() {\n if (this._sleeping) {\n this.isSleeping = true;\n }\n const currentMotion = this.vel.magnitude * this.vel.magnitude + Math.abs(this.angularVelocity * this.angularVelocity);\n const bias = this._bodyConfig.sleepBias;\n this.sleepMotion = bias * this.sleepMotion + (1 - bias) * currentMotion;\n this.sleepMotion = (0,_Math_util__WEBPACK_IMPORTED_MODULE_10__.clamp)(this.sleepMotion, 0, 10 * this._bodyConfig.sleepEpsilon);\n if (this.canSleep && this.sleepMotion < this._bodyConfig.sleepEpsilon) {\n this.isSleeping = true;\n }\n }\n /**\n * Get the moment of inertia from the {@apilink ColliderComponent}\n */\n get inertia() {\n if (this._cachedInertia) {\n return this._cachedInertia;\n }\n // Inertia is a property of the geometry, so this is a little goofy but seems to be okay?\n const collider = this.owner.get(_ColliderComponent__WEBPACK_IMPORTED_MODULE_11__.ColliderComponent);\n if (collider) {\n collider.$colliderAdded.subscribe(() => {\n this._cachedInertia = null;\n });\n collider.$colliderRemoved.subscribe(() => {\n this._cachedInertia = null;\n });\n const maybeCollider = collider.get();\n if (maybeCollider) {\n return (this._cachedInertia = maybeCollider.getInertia(this.mass));\n }\n }\n return 0;\n }\n /**\n * Get the inverse moment of inertial from the {@apilink ColliderComponent}. If {@apilink CollisionType.Fixed} this is 0, meaning \"infinite\" mass\n */\n get inverseInertia() {\n if (this._cachedInverseInertia) {\n return this._cachedInverseInertia;\n }\n return (this._cachedInverseInertia = this.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_6__.CollisionType.Fixed ? 0 : 1 / this.inertia);\n }\n /**\n * Returns if the owner is active\n * @deprecated use isActive\n */\n get active() {\n var _a;\n return !!((_a = this.owner) === null || _a === void 0 ? void 0 : _a.isActive);\n }\n /**\n * Returns if the owner is active\n */\n get isActive() {\n var _a;\n return !!((_a = this.owner) === null || _a === void 0 ? void 0 : _a.isActive);\n }\n /**\n * @deprecated Use globalPos\n */\n get center() {\n return this.globalPos;\n }\n onAdd(owner) {\n var _a, _b;\n this.transform = (_a = this.owner) === null || _a === void 0 ? void 0 : _a.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this.motion = (_b = this.owner) === null || _b === void 0 ? void 0 : _b.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n }\n get pos() {\n return this.transform.pos;\n }\n set pos(val) {\n this.transform.pos = val;\n }\n /**\n * The (x, y) position of the actor this will be in the middle of the actor if the\n * {@apilink Actor.anchor} is set to (0.5, 0.5) which is default.\n * If you want the (x, y) position to be the top left of the actor specify an anchor of (0, 0).\n */\n get globalPos() {\n return this.transform.globalPos;\n }\n set globalPos(val) {\n this.transform.globalPos = val;\n }\n /**\n * The position of the actor last frame (x, y) in pixels\n */\n get oldPos() {\n return this.oldTransform.pos;\n }\n /**\n * The global position of the actor last frame (x, y) in pixels\n */\n get oldGlobalPos() {\n return this._oldGlobalPos;\n }\n /**\n * The current velocity vector (vx, vy) of the actor in pixels/second\n */\n get vel() {\n return this.motion.vel;\n }\n set vel(val) {\n this.motion.vel = val;\n }\n /**\n * The current acceleration vector (ax, ay) of the actor in pixels/second/second. An acceleration pointing down such as (0, 100) may\n * be useful to simulate a gravitational effect.\n */\n get acc() {\n return this.motion.acc;\n }\n set acc(val) {\n this.motion.acc = val;\n }\n /**\n * The current torque applied to the actor\n */\n get torque() {\n return this.motion.torque;\n }\n set torque(val) {\n this.motion.torque = val;\n }\n /**\n * Gets/sets the rotation of the body from the last frame.\n */\n get oldRotation() {\n return this.oldTransform.rotation;\n }\n /**\n * The rotation of the body in radians\n */\n get rotation() {\n return this.transform.globalRotation;\n }\n set rotation(val) {\n this.transform.globalRotation = val;\n }\n /**\n * The scale vector of the actor\n */\n get scale() {\n return this.transform.globalScale;\n }\n set scale(val) {\n this.transform.globalScale = val;\n }\n /**\n * The scale of the actor last frame\n */\n get oldScale() {\n return this.oldTransform.scale;\n }\n /**\n * The scale rate of change of the actor in scale/second\n */\n get scaleFactor() {\n return this.motion.scaleFactor;\n }\n set scaleFactor(scaleFactor) {\n this.motion.scaleFactor = scaleFactor;\n }\n /**\n * Get the angular velocity in radians/second\n */\n get angularVelocity() {\n return this.motion.angularVelocity;\n }\n /**\n * Set the angular velocity in radians/second\n */\n set angularVelocity(value) {\n this.motion.angularVelocity = value;\n }\n /**\n * Apply a specific impulse to the body\n * @param point\n * @param impulse\n */\n applyImpulse(point, impulse) {\n if (this.collisionType !== _CollisionType__WEBPACK_IMPORTED_MODULE_6__.CollisionType.Active) {\n return; // only active objects participate in the simulation\n }\n const finalImpulse = impulse.scale(this.inverseMass, this._impulseScratch);\n if (this.limitDegreeOfFreedom.indexOf(DegreeOfFreedom.X) > -1) {\n finalImpulse.x = 0;\n }\n if (this.limitDegreeOfFreedom.indexOf(DegreeOfFreedom.Y) > -1) {\n finalImpulse.y = 0;\n }\n this.vel.addEqual(finalImpulse);\n if (!this.limitDegreeOfFreedom.includes(DegreeOfFreedom.Rotation)) {\n const distanceFromCenter = point.sub(this.globalPos, this._distanceFromCenterScratch);\n this.angularVelocity += this.inverseInertia * distanceFromCenter.cross(impulse);\n }\n }\n /**\n * Apply only linear impulse to the body\n * @param impulse\n */\n applyLinearImpulse(impulse) {\n if (this.collisionType !== _CollisionType__WEBPACK_IMPORTED_MODULE_6__.CollisionType.Active) {\n return; // only active objects participate in the simulation\n }\n const finalImpulse = impulse.scale(this.inverseMass);\n if (this.limitDegreeOfFreedom.includes(DegreeOfFreedom.X)) {\n finalImpulse.x = 0;\n }\n if (this.limitDegreeOfFreedom.includes(DegreeOfFreedom.Y)) {\n finalImpulse.y = 0;\n }\n this.vel = this.vel.add(finalImpulse);\n }\n /**\n * Apply only angular impulse to the body\n * @param point\n * @param impulse\n */\n applyAngularImpulse(point, impulse) {\n if (this.collisionType !== _CollisionType__WEBPACK_IMPORTED_MODULE_6__.CollisionType.Active) {\n return; // only active objects participate in the simulation\n }\n if (!this.limitDegreeOfFreedom.includes(DegreeOfFreedom.Rotation)) {\n const distanceFromCenter = point.sub(this.globalPos);\n this.angularVelocity += this.inverseInertia * distanceFromCenter.cross(impulse);\n }\n }\n /**\n * Sets the old versions of pos, vel, acc, and scale.\n */\n captureOldTransform() {\n // Capture old values before integration step updates them\n this.__oldTransformCaptured = true;\n const tx = this.transform.get();\n tx.clone(this.oldTransform);\n this.oldTransform.parent = tx.parent; // also grab parent\n this.oldVel.setTo(this.vel.x, this.vel.y);\n this.oldAcc.setTo(this.acc.x, this.acc.y);\n this.oldGlobalPos.setTo(this.globalPos.x, this.globalPos.y);\n }\n clone() {\n const component = super.clone();\n return component;\n }\n}\nBodyComponent._ID = 0;\nBodyComponent._DEFAULT_CONFIG = {\n ...(0,_PhysicsConfig__WEBPACK_IMPORTED_MODULE_9__.getDefaultPhysicsConfig)().bodies\n};\n\n\n/***/ }),\n\n/***/ \"./Collision/BoundingBox.ts\":\n/*!**********************************!*\\\n !*** ./Collision/BoundingBox.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BoundingBox: () => (/* binding */ BoundingBox)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Side__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Side */ \"./Collision/Side.ts\");\n\n\n\n/**\n * Axis Aligned collision primitive for Excalibur.\n */\nclass BoundingBox {\n /**\n * Constructor allows passing of either an object with all coordinate components,\n * or the coordinate components passed separately.\n * @param leftOrOptions Either x coordinate of the left edge or an options object\n * containing the four coordinate components.\n * @param top y coordinate of the top edge\n * @param right x coordinate of the right edge\n * @param bottom y coordinate of the bottom edge\n */\n constructor(leftOrOptions = 0, top = 0, right = 0, bottom = 0) {\n // Cache bounding box point returns\n this._points = [];\n if (typeof leftOrOptions === 'object') {\n this.left = leftOrOptions.left;\n this.top = leftOrOptions.top;\n this.right = leftOrOptions.right;\n this.bottom = leftOrOptions.bottom;\n }\n else if (typeof leftOrOptions === 'number') {\n this.left = leftOrOptions;\n this.top = top;\n this.right = right;\n this.bottom = bottom;\n }\n }\n /**\n * Returns a new instance of {@apilink BoundingBox} that is a copy of the current instance\n */\n clone(dest) {\n const result = dest || new BoundingBox(0, 0, 0, 0);\n result.left = this.left;\n result.right = this.right;\n result.top = this.top;\n result.bottom = this.bottom;\n return result;\n }\n /**\n * Resets the bounds to a zero width/height box\n */\n reset() {\n this.left = 0;\n this.top = 0;\n this.bottom = 0;\n this.right = 0;\n }\n /**\n * Given bounding box A & B, returns the side relative to A when intersection is performed.\n * @param intersection Intersection vector between 2 bounding boxes\n */\n static getSideFromIntersection(intersection) {\n if (!intersection) {\n return _Side__WEBPACK_IMPORTED_MODULE_0__.Side.None;\n }\n if (intersection) {\n if (Math.abs(intersection.x) > Math.abs(intersection.y)) {\n if (intersection.x < 0) {\n return _Side__WEBPACK_IMPORTED_MODULE_0__.Side.Right;\n }\n return _Side__WEBPACK_IMPORTED_MODULE_0__.Side.Left;\n }\n else {\n if (intersection.y < 0) {\n return _Side__WEBPACK_IMPORTED_MODULE_0__.Side.Bottom;\n }\n return _Side__WEBPACK_IMPORTED_MODULE_0__.Side.Top;\n }\n }\n return _Side__WEBPACK_IMPORTED_MODULE_0__.Side.None;\n }\n static fromPoints(points) {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (let i = 0; i < points.length; i++) {\n if (points[i].x < minX) {\n minX = points[i].x;\n }\n if (points[i].x > maxX) {\n maxX = points[i].x;\n }\n if (points[i].y < minY) {\n minY = points[i].y;\n }\n if (points[i].y > maxY) {\n maxY = points[i].y;\n }\n }\n return new BoundingBox(minX, minY, maxX, maxY);\n }\n /**\n * Creates a bounding box from a width and height\n * @param width\n * @param height\n * @param anchor Default Vector.Half\n * @param pos Default Vector.Zero\n */\n static fromDimension(width, height, anchor = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Half, pos = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero) {\n return new BoundingBox(-width * anchor.x + pos.x, -height * anchor.y + pos.y, width - width * anchor.x + pos.x, height - height * anchor.y + pos.y);\n }\n /**\n * Returns the calculated width of the bounding box\n */\n get width() {\n return this.right - this.left;\n }\n /**\n * Returns the calculated height of the bounding box\n */\n get height() {\n return this.bottom - this.top;\n }\n /**\n * Return whether the bounding box has zero dimensions in height,width or both\n */\n hasZeroDimensions() {\n return this.width === 0 || this.height === 0;\n }\n /**\n * Returns the center of the bounding box\n */\n get center() {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector((this.left + this.right) / 2, (this.top + this.bottom) / 2);\n }\n get topLeft() {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.left, this.top);\n }\n get bottomRight() {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.right, this.bottom);\n }\n get topRight() {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.right, this.top);\n }\n get bottomLeft() {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.left, this.bottom);\n }\n translate(pos) {\n return new BoundingBox(this.left + pos.x, this.top + pos.y, this.right + pos.x, this.bottom + pos.y);\n }\n /**\n * Rotates a bounding box by and angle and around a point, if no point is specified (0, 0) is used by default. The resulting bounding\n * box is also axis-align. This is useful when a new axis-aligned bounding box is needed for rotated geometry.\n */\n rotate(angle, point = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero) {\n const points = this.getPoints().map((p) => p.rotate(angle, point));\n return BoundingBox.fromPoints(points);\n }\n /**\n * Scale a bounding box by a scale factor, optionally provide a point\n * @param scale\n * @param point\n */\n scale(scale, point = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero) {\n const shifted = this.translate(point);\n return new BoundingBox(shifted.left * scale.x, shifted.top * scale.y, shifted.right * scale.x, shifted.bottom * scale.y);\n }\n /**\n * Transform the axis aligned bounding box by a {@apilink Matrix}, producing a new axis aligned bounding box\n * @param matrix\n */\n transform(matrix) {\n // inlined these calculations to not use vectors would speed it up slightly\n // const matFirstColumn = vec(matrix.data[0], matrix.data[1]);\n // const xa = matFirstColumn.scale(this.left);\n const xa1 = matrix.data[0] * this.left;\n const xa2 = matrix.data[1] * this.left;\n // const xb = matFirstColumn.scale(this.right);\n const xb1 = matrix.data[0] * this.right;\n const xb2 = matrix.data[1] * this.right;\n // const matSecondColumn = vec(matrix.data[2], matrix.data[3]);\n // const ya = matSecondColumn.scale(this.top);\n const ya1 = matrix.data[2] * this.top;\n const ya2 = matrix.data[3] * this.top;\n // const yb = matSecondColumn.scale(this.bottom);\n const yb1 = matrix.data[2] * this.bottom;\n const yb2 = matrix.data[3] * this.bottom;\n const matrixPos = matrix.getPosition();\n // const topLeft = Vector.min(xa, xb).add(Vector.min(ya, yb)).add(matrixPos);\n // const bottomRight = Vector.max(xa, xb).add(Vector.max(ya, yb)).add(matrixPos);\n const left = Math.min(xa1, xb1) + Math.min(ya1, yb1) + matrixPos.x;\n const top = Math.min(xa2, xb2) + Math.min(ya2, yb2) + matrixPos.y;\n const right = Math.max(xa1, xb1) + Math.max(ya1, yb1) + matrixPos.x;\n const bottom = Math.max(xa2, xb2) + Math.max(ya2, yb2) + matrixPos.y;\n return new BoundingBox({\n left, //: topLeft.x,\n top, //: topLeft.y,\n right, //: bottomRight.x,\n bottom //: bottomRight.y\n });\n }\n /**\n * Returns the perimeter of the bounding box\n */\n getPerimeter() {\n const wx = this.width;\n const wy = this.height;\n return 2 * (wx + wy);\n }\n /**\n * Returns the world space points that make up the corners of the bounding box as a polygon\n */\n getPoints() {\n if (this._left !== this.left || this._right !== this.right || this._top !== this.top || this._bottom !== this.bottom) {\n this._points.length = 0;\n this._points.push(new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.left, this.top));\n this._points.push(new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.right, this.top));\n this._points.push(new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.right, this.bottom));\n this._points.push(new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.left, this.bottom));\n this._left = this.left;\n this._right = this.right;\n this._top = this.top;\n this._bottom = this.bottom;\n }\n return this._points;\n }\n /**\n * Determines whether a ray intersects with a bounding box\n */\n rayCast(ray, farClipDistance = Infinity) {\n // algorithm from https://tavianator.com/fast-branchless-raybounding-box-intersections/\n let tMin = -Infinity;\n let tMax = +Infinity;\n const xInv = ray.dir.x === 0 ? Number.MAX_VALUE : 1 / ray.dir.x;\n const yInv = ray.dir.y === 0 ? Number.MAX_VALUE : 1 / ray.dir.y;\n const tx1 = (this.left - ray.pos.x) * xInv;\n const tx2 = (this.right - ray.pos.x) * xInv;\n tMin = Math.min(tx1, tx2);\n tMax = Math.max(tx1, tx2);\n const ty1 = (this.top - ray.pos.y) * yInv;\n const ty2 = (this.bottom - ray.pos.y) * yInv;\n tMin = Math.max(tMin, Math.min(ty1, ty2));\n tMax = Math.min(tMax, Math.max(ty1, ty2));\n return tMax >= Math.max(0, tMin) && tMin < farClipDistance;\n }\n rayCastTime(ray, farClipDistance = Infinity) {\n // algorithm from https://tavianator.com/fast-branchless-raybounding-box-intersections/\n let tMin = -Infinity;\n let tMax = +Infinity;\n const xInv = ray.dir.x === 0 ? Number.MAX_VALUE : 1 / ray.dir.x;\n const yInv = ray.dir.y === 0 ? Number.MAX_VALUE : 1 / ray.dir.y;\n const tx1 = (this.left - ray.pos.x) * xInv;\n const tx2 = (this.right - ray.pos.x) * xInv;\n tMin = Math.min(tx1, tx2);\n tMax = Math.max(tx1, tx2);\n const ty1 = (this.top - ray.pos.y) * yInv;\n const ty2 = (this.bottom - ray.pos.y) * yInv;\n tMin = Math.max(tMin, Math.min(ty1, ty2));\n tMax = Math.min(tMax, Math.max(ty1, ty2));\n if (tMax >= Math.max(0, tMin) && tMin < farClipDistance) {\n return tMin;\n }\n return -1;\n }\n contains(val) {\n if (val instanceof _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector) {\n return this.left <= val.x && this.top <= val.y && val.y <= this.bottom && val.x <= this.right;\n }\n else if (val instanceof BoundingBox) {\n return this.left <= val.left && this.top <= val.top && val.bottom <= this.bottom && val.right <= this.right;\n }\n return false;\n }\n /**\n * Combines this bounding box and another together returning a new bounding box\n * @param other The bounding box to combine\n */\n combine(other, dest) {\n const compositeBB = dest || new BoundingBox(0, 0, 0, 0);\n const left = Math.min(this.left, other.left);\n const top = Math.min(this.top, other.top);\n const right = Math.max(this.right, other.right);\n const bottom = Math.max(this.bottom, other.bottom);\n compositeBB.left = left;\n compositeBB.top = top;\n compositeBB.right = right;\n compositeBB.bottom = bottom;\n return compositeBB;\n }\n get dimensions() {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.width, this.height);\n }\n /**\n * Returns true if the bounding boxes overlap.\n * @param other\n * @param epsilon Optionally specify a small epsilon (default 0) as amount of overlap to ignore as overlap.\n * This epsilon is useful in stable collision simulations.\n */\n overlaps(other, epsilon) {\n const e = epsilon || 0;\n if (other.hasZeroDimensions()) {\n return this.contains(other);\n }\n if (this.hasZeroDimensions()) {\n return other.contains(this);\n }\n const totalBoundingBox = this.combine(other);\n return totalBoundingBox.width + e < other.width + this.width && totalBoundingBox.height + e < other.height + this.height;\n }\n /**\n * Test wether this bounding box intersects with another returning\n * the intersection vector that can be used to resolve the collision. If there\n * is no intersection null is returned.\n * @param other Other {@apilink BoundingBox} to test intersection with\n * @returns A Vector in the direction of the current BoundingBox, this <- other\n */\n intersect(other) {\n const totalBoundingBox = this.combine(other);\n // If the total bounding box is less than or equal the sum of the 2 bounds then there is collision\n if (totalBoundingBox.width < other.width + this.width &&\n totalBoundingBox.height < other.height + this.height &&\n !totalBoundingBox.dimensions.equals(other.dimensions) &&\n !totalBoundingBox.dimensions.equals(this.dimensions)) {\n // collision\n let overlapX = 0;\n // right edge is between the other's left and right edge\n /**\n * +-this-+\n * | |\n * | +-other-+\n * +----|-+ |\n * | |\n * +-------+\n * <---\n * ^ overlap\n */\n if (this.right >= other.left && this.right <= other.right) {\n overlapX = other.left - this.right;\n // right edge is past the other's right edge\n /**\n * +-other-+\n * | |\n * | +-this-+\n * +----|--+ |\n * | |\n * +------+\n * --->\n * ^ overlap\n */\n }\n else {\n overlapX = other.right - this.left;\n }\n let overlapY = 0;\n // top edge is between the other's top and bottom edge\n /**\n * +-other-+\n * | |\n * | +-this-+ | <- overlap\n * +----|--+ | |\n * | | \\ /\n * +------+ '\n */\n if (this.top <= other.bottom && this.top >= other.top) {\n overlapY = other.bottom - this.top;\n // top edge is above the other top edge\n /**\n * +-this-+ .\n * | | / \\\n * | +-other-+ | <- overlap\n * +----|-+ | |\n * | |\n * +-------+\n */\n }\n else {\n overlapY = other.top - this.bottom;\n }\n if (Math.abs(overlapX) < Math.abs(overlapY)) {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(overlapX, 0);\n }\n else {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(0, overlapY);\n }\n // Case of total containment of one bounding box by another\n }\n else if (totalBoundingBox.dimensions.equals(other.dimensions) || totalBoundingBox.dimensions.equals(this.dimensions)) {\n let overlapX = 0;\n // this is wider than the other\n if (this.width - other.width >= 0) {\n // This right edge is closest to the others right edge\n if (this.right - other.right <= other.left - this.left) {\n overlapX = other.left - this.right;\n // This left edge is closest to the others left edge\n }\n else {\n overlapX = other.right - this.left;\n }\n // other is wider than this\n }\n else {\n // This right edge is closest to the others right edge\n if (other.right - this.right <= this.left - other.left) {\n overlapX = this.left - other.right;\n // This left edge is closest to the others left edge\n }\n else {\n overlapX = this.right - other.left;\n }\n }\n let overlapY = 0;\n // this is taller than other\n if (this.height - other.height >= 0) {\n // The bottom edge is closest to the others bottom edge\n if (this.bottom - other.bottom <= other.top - this.top) {\n overlapY = other.top - this.bottom;\n }\n else {\n overlapY = other.bottom - this.top;\n }\n // other is taller than this\n }\n else {\n // The bottom edge is closest to the others bottom edge\n if (other.bottom - this.bottom <= this.top - other.top) {\n overlapY = this.top - other.bottom;\n }\n else {\n overlapY = this.bottom - other.top;\n }\n }\n if (Math.abs(overlapX) < Math.abs(overlapY)) {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(overlapX, 0);\n }\n else {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(0, overlapY);\n }\n }\n else {\n return null;\n }\n }\n /**\n * Test whether the bounding box has intersected with another bounding box, returns the side of the current bb that intersected.\n * @param bb The other actor to test\n */\n intersectWithSide(bb) {\n const intersect = this.intersect(bb);\n return BoundingBox.getSideFromIntersection(intersect);\n }\n /**\n * Draw a debug bounding box\n * @param ex\n * @param color\n */\n draw(ex, color = _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Yellow) {\n ex.debug.drawRect(this.left, this.top, this.width, this.height, { color });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/ColliderComponent.ts\":\n/*!****************************************!*\\\n !*** ./Collision/ColliderComponent.ts ***!\n \\****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ColliderComponent: () => (/* binding */ ColliderComponent)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Component */ \"./EntityComponentSystem/Component.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _Util_Observable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Util/Observable */ \"./Util/Observable.ts\");\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Colliders/CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var _Colliders_Shape__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Colliders/Shape */ \"./Collision/Colliders/Shape.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Actor__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Actor */ \"./Actor.ts\");\n\n\n\n\n\n\n\n\n\n\nclass ColliderComponent extends _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor(collider) {\n super();\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_1__.EventEmitter();\n /**\n * Observable that notifies when a collider is added to the body\n */\n this.$colliderAdded = new _Util_Observable__WEBPACK_IMPORTED_MODULE_2__.Observable();\n /**\n * Observable that notifies when a collider is removed from the body\n */\n this.$colliderRemoved = new _Util_Observable__WEBPACK_IMPORTED_MODULE_2__.Observable();\n this._collidersToRemove = [];\n this.set(collider);\n }\n /**\n * Get the current collider geometry\n */\n get() {\n return this._collider;\n }\n /**\n * Set the collider geometry\n * @param collider\n * @returns the collider you set\n */\n set(collider) {\n this.clear();\n if (collider) {\n this._collider = collider;\n this._collider.owner = this.owner;\n collider.events.pipe(this.events);\n this.$colliderAdded.notifyAll(collider);\n this.update();\n }\n return collider;\n }\n /**\n * Remove collider geometry from collider component\n */\n clear() {\n if (this._collider) {\n this._collidersToRemove.push(this._collider);\n this._collider = null;\n }\n }\n processColliderRemoval() {\n for (const collider of this._collidersToRemove) {\n collider.events.unpipe(this.events);\n this.$colliderRemoved.notifyAll(collider);\n collider.owner = null;\n }\n }\n clone() {\n const clone = new ColliderComponent(this._collider.clone());\n return clone;\n }\n /**\n * Return world space bounds\n */\n get bounds() {\n var _a, _b;\n return (_b = (_a = this._collider) === null || _a === void 0 ? void 0 : _a.bounds) !== null && _b !== void 0 ? _b : new _BoundingBox__WEBPACK_IMPORTED_MODULE_3__.BoundingBox();\n }\n /**\n * Return local space bounds\n */\n get localBounds() {\n var _a, _b;\n return (_b = (_a = this._collider) === null || _a === void 0 ? void 0 : _a.localBounds) !== null && _b !== void 0 ? _b : new _BoundingBox__WEBPACK_IMPORTED_MODULE_3__.BoundingBox();\n }\n /**\n * Update the collider's transformed geometry\n */\n update() {\n var _a;\n const tx = (_a = this.owner) === null || _a === void 0 ? void 0 : _a.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__.TransformComponent);\n if (this._collider) {\n this._collider.owner = this.owner;\n if (tx) {\n this._collider.update(tx.get());\n }\n }\n }\n /**\n * Collide component with another\n * @param other\n */\n collide(other) {\n let colliderA = this._collider;\n let colliderB = other._collider;\n if (!colliderA || !colliderB) {\n return [];\n }\n // If we have a composite left hand side :(\n // Might bite us, but to avoid updating all the handlers make composite always left side\n let flipped = false;\n if (colliderB instanceof _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_5__.CompositeCollider) {\n colliderA = colliderB;\n colliderB = this._collider;\n flipped = true;\n }\n if (this._collider) {\n const contacts = colliderA.collide(colliderB);\n if (contacts) {\n if (flipped) {\n contacts.forEach((contact) => {\n contact.mtv = contact.mtv.negate();\n contact.normal = contact.normal.negate();\n contact.tangent = contact.normal.perpendicular();\n contact.colliderA = this._collider;\n contact.colliderB = other._collider;\n });\n }\n return contacts;\n }\n return [];\n }\n return [];\n }\n onAdd(entity) {\n if (this._collider) {\n this.update();\n }\n // Wire up the collider events to the owning entity\n this.events.on('precollision', (evt) => {\n const precollision = evt;\n entity.events.emit('precollision', new _Events__WEBPACK_IMPORTED_MODULE_6__.PreCollisionEvent(precollision.self, precollision.other, precollision.side, precollision.intersection, precollision.contact));\n if (entity instanceof _Actor__WEBPACK_IMPORTED_MODULE_7__.Actor) {\n entity.onPreCollisionResolve(precollision.self, precollision.other, precollision.side, precollision.contact);\n }\n });\n this.events.on('postcollision', (evt) => {\n const postcollision = evt;\n entity.events.emit('postcollision', new _Events__WEBPACK_IMPORTED_MODULE_6__.PostCollisionEvent(postcollision.self, postcollision.other, postcollision.side, postcollision.intersection, postcollision.contact));\n if (entity instanceof _Actor__WEBPACK_IMPORTED_MODULE_7__.Actor) {\n entity.onPostCollisionResolve(postcollision.self, postcollision.other, postcollision.side, postcollision.contact);\n }\n });\n this.events.on('collisionstart', (evt) => {\n const start = evt;\n entity.events.emit('collisionstart', new _Events__WEBPACK_IMPORTED_MODULE_6__.CollisionStartEvent(start.self, start.other, start.side, start.contact));\n if (entity instanceof _Actor__WEBPACK_IMPORTED_MODULE_7__.Actor) {\n entity.onCollisionStart(start.self, start.other, start.side, start.contact);\n }\n });\n this.events.on('collisionend', (evt) => {\n const end = evt;\n entity.events.emit('collisionend', new _Events__WEBPACK_IMPORTED_MODULE_6__.CollisionEndEvent(end.self, end.other, end.side, end.lastContact));\n if (entity instanceof _Actor__WEBPACK_IMPORTED_MODULE_7__.Actor) {\n entity.onCollisionEnd(end.self, end.other, end.side, end.lastContact);\n }\n });\n }\n onRemove() {\n this.events.clear();\n this.$colliderRemoved.notifyAll(this._collider);\n }\n /**\n * Sets up a box geometry based on the current bounds of the associated actor of this physics body.\n *\n * If no width/height are specified the body will attempt to use the associated actor's width/height.\n *\n * By default, the box is center is at (0, 0) which means it is centered around the actors anchor.\n */\n useBoxCollider(width, height, anchor = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Half, center = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Zero) {\n const collider = _Colliders_Shape__WEBPACK_IMPORTED_MODULE_9__.Shape.Box(width, height, anchor, center);\n return this.set(collider);\n }\n /**\n * Sets up a {@apilink PolygonCollider | `polygon`} collision geometry based on a list of of points relative\n * to the anchor of the associated actor\n * of this physics body.\n *\n * Only [convex polygon](https://en.wikipedia.org/wiki/Convex_polygon) definitions are supported.\n *\n * By default, the box is center is at (0, 0) which means it is centered around the actors anchor.\n */\n usePolygonCollider(points, center = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Zero) {\n const poly = _Colliders_Shape__WEBPACK_IMPORTED_MODULE_9__.Shape.Polygon(points, center);\n return this.set(poly);\n }\n /**\n * Sets up a {@apilink Circle | `circle collision geometry`} as the only collider with a specified radius in pixels.\n *\n * By default, the box is center is at (0, 0) which means it is centered around the actors anchor.\n */\n useCircleCollider(radius, center = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Zero) {\n const collider = _Colliders_Shape__WEBPACK_IMPORTED_MODULE_9__.Shape.Circle(radius, center);\n return this.set(collider);\n }\n /**\n * Sets up an {@apilink Edge | `edge collision geometry`} with a start point and an end point relative to the anchor of the associated actor\n * of this physics body.\n *\n * By default, the box is center is at (0, 0) which means it is centered around the actors anchor.\n */\n useEdgeCollider(begin, end) {\n const collider = _Colliders_Shape__WEBPACK_IMPORTED_MODULE_9__.Shape.Edge(begin, end);\n return this.set(collider);\n }\n /**\n * Setups up a {@apilink CompositeCollider} which can define any arbitrary set of excalibur colliders\n * @param colliders\n */\n useCompositeCollider(colliders) {\n return this.set(new _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_5__.CompositeCollider(colliders));\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/CircleCollider.ts\":\n/*!***********************************************!*\\\n !*** ./Collision/Colliders/CircleCollider.ts ***!\n \\***********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CircleCollider: () => (/* binding */ CircleCollider)\n/* harmony export */ });\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./CollisionJumpTable */ \"./Collision/Colliders/CollisionJumpTable.ts\");\n/* harmony import */ var _PolygonCollider__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./PolygonCollider */ \"./Collision/Colliders/PolygonCollider.ts\");\n/* harmony import */ var _EdgeCollider__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./EdgeCollider */ \"./Collision/Colliders/EdgeCollider.ts\");\n/* harmony import */ var _Math_projection__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../Math/projection */ \"./Math/projection.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../Color */ \"./Color.ts\");\n/* harmony import */ var _Collider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Collider */ \"./Collision/Colliders/Collider.ts\");\n/* harmony import */ var _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./ClosestLineJumpTable */ \"./Collision/Colliders/ClosestLineJumpTable.ts\");\n/* harmony import */ var _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math/affine-matrix */ \"./Math/affine-matrix.ts\");\n/* harmony import */ var _Index__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Index */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math/util */ \"./Math/util.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * This is a circle collider for the excalibur rigid body physics simulation\n */\nclass CircleCollider extends _Collider__WEBPACK_IMPORTED_MODULE_0__.Collider {\n get worldPos() {\n return this._globalMatrix.getPosition();\n }\n /**\n * Get the radius of the circle\n */\n get radius() {\n var _a;\n if (this._radius) {\n return this._radius;\n }\n const tx = this._transform;\n const scale = (_a = tx === null || tx === void 0 ? void 0 : tx.globalScale) !== null && _a !== void 0 ? _a : _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.One;\n // This is a trade off, the alternative is retooling circles to support ellipse collisions\n return (this._radius = this._naturalRadius * Math.min(scale.x, scale.y));\n }\n /**\n * Set the radius of the circle\n */\n set radius(val) {\n var _a;\n const tx = this._transform;\n const scale = (_a = tx === null || tx === void 0 ? void 0 : tx.globalScale) !== null && _a !== void 0 ? _a : _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.One;\n // This is a trade off, the alternative is retooling circles to support ellipse collisions\n this._naturalRadius = val / Math.min(scale.x, scale.y);\n this._localBoundsDirty = true;\n this._radius = val;\n }\n constructor(options) {\n super();\n /**\n * Position of the circle relative to the collider, by default (0, 0).\n */\n this.offset = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n this._globalMatrix = _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_2__.AffineMatrix.identity();\n this._localBoundsDirty = true;\n this.offset = options.offset || _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n this.radius = options.radius || 0;\n this._globalMatrix.translate(this.offset.x, this.offset.y);\n }\n /**\n * Returns a clone of this shape, not associated with any collider\n */\n clone() {\n return new CircleCollider({\n offset: this.offset.clone(),\n radius: this.radius\n });\n }\n /**\n * Get the center of the collider in world coordinates\n */\n get center() {\n return this._globalMatrix.getPosition();\n }\n /**\n * Tests if a point is contained in this collider\n */\n contains(point) {\n var _a, _b;\n const pos = (_b = (_a = this._transform) === null || _a === void 0 ? void 0 : _a.pos) !== null && _b !== void 0 ? _b : this.offset;\n const distance = pos.distance(point);\n if (distance <= this.radius) {\n return true;\n }\n return false;\n }\n /**\n * Casts a ray at the Circle collider and returns the nearest point of collision\n * @param ray\n */\n rayCast(ray, max = Infinity) {\n var _a, _b;\n // https://en.wikipedia.org/wiki/Intersection_(geometry)#A_line_and_a_circle\n const c = this.center;\n const dir = ray.dir;\n const orig = ray.pos;\n const u = c.sub(orig);\n const u1 = dir.scale(u.dot(dir));\n const u2 = u.sub(u1);\n const d = u2.magnitude;\n if (d > this.radius) {\n return null;\n }\n else {\n // tangent case\n let toi = 0;\n if ((0,_Math_util__WEBPACK_IMPORTED_MODULE_3__.approximatelyEqual)(d, this.radius, 0.0001)) {\n toi = -dir.dot(orig.sub(c));\n if (toi > 0 && toi < max) {\n const point = ray.getPoint(toi);\n return {\n point,\n normal: point.sub(c).normalize(),\n collider: this,\n body: (_a = this.owner) === null || _a === void 0 ? void 0 : _a.get(_Index__WEBPACK_IMPORTED_MODULE_4__.BodyComponent),\n distance: toi\n };\n }\n return null;\n }\n else {\n // two point\n const discriminant = Math.sqrt(Math.pow(dir.dot(orig.sub(c)), 2) - Math.pow(orig.sub(c).distance(), 2) + Math.pow(this.radius, 2));\n const toi1 = -dir.dot(orig.sub(c)) + discriminant;\n const toi2 = -dir.dot(orig.sub(c)) - discriminant;\n const positiveToi = [];\n if (toi1 >= 0) {\n positiveToi.push(toi1);\n }\n if (toi2 >= 0) {\n positiveToi.push(toi2);\n }\n const minToi = Math.min(...positiveToi);\n if (minToi <= max) {\n const point = ray.getPoint(minToi);\n return {\n point,\n normal: point.sub(c).normalize(),\n collider: this,\n body: (_b = this.owner) === null || _b === void 0 ? void 0 : _b.get(_Index__WEBPACK_IMPORTED_MODULE_4__.BodyComponent),\n distance: minToi\n };\n }\n return null;\n }\n }\n }\n getClosestLineBetween(shape) {\n if (shape instanceof CircleCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_5__.ClosestLineJumpTable.CircleCircleClosestLine(this, shape);\n }\n else if (shape instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_6__.PolygonCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_5__.ClosestLineJumpTable.PolygonCircleClosestLine(shape, this).flip();\n }\n else if (shape instanceof _EdgeCollider__WEBPACK_IMPORTED_MODULE_7__.EdgeCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_5__.ClosestLineJumpTable.CircleEdgeClosestLine(this, shape).flip();\n }\n else {\n throw new Error(`Polygon could not collide with unknown CollisionShape ${typeof shape}`);\n }\n }\n /**\n * @inheritdoc\n */\n collide(collider) {\n if (collider instanceof CircleCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_8__.CollisionJumpTable.CollideCircleCircle(this, collider);\n }\n else if (collider instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_6__.PolygonCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_8__.CollisionJumpTable.CollideCirclePolygon(this, collider);\n }\n else if (collider instanceof _EdgeCollider__WEBPACK_IMPORTED_MODULE_7__.EdgeCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_8__.CollisionJumpTable.CollideCircleEdge(this, collider);\n }\n else {\n throw new Error(`Circle could not collide with unknown CollisionShape ${typeof collider}`);\n }\n }\n /**\n * Find the point on the collider furthest in the direction specified\n */\n getFurthestPoint(direction) {\n return this.center.add(direction.normalize().scale(this.radius));\n }\n /**\n * Find the local point on the shape in the direction specified\n * @param direction\n */\n getFurthestLocalPoint(direction) {\n const dir = direction.normalize();\n return dir.scale(this.radius);\n }\n /**\n * Get the axis aligned bounding box for the circle collider in world coordinates\n */\n get bounds() {\n return this.localBounds.transform(this._globalMatrix);\n }\n /**\n * Get the axis aligned bounding box for the circle collider in local coordinates\n */\n get localBounds() {\n if (this._localBoundsDirty) {\n this._localBounds = new _BoundingBox__WEBPACK_IMPORTED_MODULE_9__.BoundingBox(-this._naturalRadius, -this._naturalRadius, +this._naturalRadius, +this._naturalRadius);\n this._localBoundsDirty = false;\n }\n return this._localBounds;\n }\n /**\n * Get axis not implemented on circles, since there are infinite axis in a circle\n */\n get axes() {\n return [];\n }\n /**\n * Returns the moment of inertia of a circle given it's mass\n * https://en.wikipedia.org/wiki/List_of_moments_of_inertia\n */\n getInertia(mass) {\n return (mass * this.radius * this.radius) / 2;\n }\n /* istanbul ignore next */\n update(transform) {\n var _a;\n this._transform = transform;\n const globalMat = (_a = transform.matrix) !== null && _a !== void 0 ? _a : this._globalMatrix;\n globalMat.clone(this._globalMatrix);\n this._globalMatrix.translate(this.offset.x, this.offset.y);\n this._radius = undefined;\n }\n /**\n * Project the circle along a specified axis\n */\n project(axis) {\n const scalars = [];\n const point = this.center;\n const dotProduct = point.dot(axis);\n scalars.push(dotProduct);\n scalars.push(dotProduct + this.radius);\n scalars.push(dotProduct - this.radius);\n return new _Math_projection__WEBPACK_IMPORTED_MODULE_10__.Projection(Math.min.apply(Math, scalars), Math.max.apply(Math, scalars));\n }\n debug(ex, color, options) {\n var _a, _b, _c, _d;\n const { lineWidth } = { ...{ lineWidth: 1 }, ...options };\n const tx = this._transform;\n const scale = (_a = tx === null || tx === void 0 ? void 0 : tx.globalScale) !== null && _a !== void 0 ? _a : _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.One;\n const rotation = (_b = tx === null || tx === void 0 ? void 0 : tx.globalRotation) !== null && _b !== void 0 ? _b : 0;\n const pos = (_c = tx === null || tx === void 0 ? void 0 : tx.globalPos) !== null && _c !== void 0 ? _c : _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n ex.save();\n ex.translate(pos.x, pos.y);\n ex.rotate(rotation);\n ex.scale(scale.x, scale.y);\n ex.drawCircle((_d = this.offset) !== null && _d !== void 0 ? _d : _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero, this._naturalRadius, _Color__WEBPACK_IMPORTED_MODULE_11__.Color.Transparent, color, lineWidth);\n ex.restore();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/ClosestLineJumpTable.ts\":\n/*!*****************************************************!*\\\n !*** ./Collision/Colliders/ClosestLineJumpTable.ts ***!\n \\*****************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ClosestLineJumpTable: () => (/* binding */ ClosestLineJumpTable)\n/* harmony export */ });\n/* harmony import */ var _Math_line_segment__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/line-segment */ \"./Math/line-segment.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math_ray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math/ray */ \"./Math/ray.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/util */ \"./Math/util.ts\");\n\n\n\n\n/**\n * Finds the closest line segment between two given line segments.\n */\nfunction ClosestLine(line1, line2) {\n // https://math.stackexchange.com/questions/1993953/closest-points-between-2-lines-in-2d\n const EPSILON = 1e-9;\n const line1Dir = line1.dir();\n const line2Dir = line2.dir();\n const d1Squared = line1Dir.dot(line1Dir);\n const d2Squared = line2Dir.dot(line2Dir);\n if (d1Squared < EPSILON && d2Squared < EPSILON) {\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_0__.LineSegment(line1.begin, line2.begin);\n }\n if (d1Squared < EPSILON) {\n const t = (0,_Math_util__WEBPACK_IMPORTED_MODULE_1__.clamp)(line2Dir.dot(line1.begin.sub(line2.begin)) / d2Squared, 0, 1);\n const closestPoint = line2.begin.add(line2Dir.scale(t));\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_0__.LineSegment(line1.begin, closestPoint);\n }\n if (d2Squared < EPSILON) {\n const t = (0,_Math_util__WEBPACK_IMPORTED_MODULE_1__.clamp)(line1Dir.dot(line2.begin.sub(line1.begin)) / d1Squared, 0, 1);\n const closestPoint = line1.begin.add(line1Dir.scale(t));\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_0__.LineSegment(closestPoint, line2.begin);\n }\n const r = line1.begin.sub(line2.begin);\n const a = d1Squared;\n const e = d2Squared;\n const f = line2Dir.dot(r);\n const denom = a * e - Math.pow(line1Dir.dot(line2Dir), 2);\n let s = 0;\n let t = 0;\n if (Math.abs(denom) > EPSILON) {\n s = (0,_Math_util__WEBPACK_IMPORTED_MODULE_1__.clamp)((line1Dir.dot(line2Dir) * f - e * line1Dir.dot(r)) / denom, 0, 1);\n }\n else {\n // lines are parallel\n s = (0,_Math_util__WEBPACK_IMPORTED_MODULE_1__.clamp)(line1Dir.dot(r) / a, 0, 1);\n }\n if (Math.abs(e) > EPSILON) {\n t = (0,_Math_util__WEBPACK_IMPORTED_MODULE_1__.clamp)((line1Dir.dot(line2Dir) * s + f) / e, 0, 1);\n }\n else {\n // line2 is a degenerate point\n t = 0;\n }\n const closestPointOnLine1 = line1.begin.add(line1Dir.scale(s));\n const closestPointOnLine2 = line2.begin.add(line2Dir.scale(t));\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_0__.LineSegment(closestPointOnLine1, closestPointOnLine2);\n}\nconst ClosestLineJumpTable = {\n PolygonPolygonClosestLine(polygonA, polygonB) {\n const aSides = polygonA.getSides();\n const bSides = polygonB.getSides();\n let minDistance = Number.MAX_VALUE;\n let closestLine = null;\n for (let i = 0; i < aSides.length; i++) {\n for (let j = 0; j < bSides.length; j++) {\n const line = ClosestLine(aSides[i], bSides[j]);\n const distance = line.getLength();\n if (distance < minDistance) {\n minDistance = distance;\n closestLine = line;\n }\n }\n }\n return closestLine;\n },\n PolygonEdgeClosestLine(polygon, edge) {\n // Find the 2 closest faces on each polygon\n const otherWorldPos = edge.worldPos;\n const otherDirection = otherWorldPos.sub(polygon.worldPos);\n const rayTowardsOther = new _Math_ray__WEBPACK_IMPORTED_MODULE_2__.Ray(polygon.worldPos, otherDirection);\n const thisPoint = polygon.rayCast(rayTowardsOther).point.add(rayTowardsOther.dir.scale(0.1));\n const thisFace = polygon.getClosestFace(thisPoint);\n // L1 = P(s) = p0 + s * u, where s is time and p0 is the start of the line\n // L2 = Q(t) = q0 + t * v, where t is time and q0 is the start of the line\n const edgeLine = edge.asLine();\n return ClosestLine(thisFace.face, edgeLine);\n },\n PolygonCircleClosestLine(polygon, circle) {\n // https://math.stackexchange.com/questions/1919177/how-to-find-point-on-line-closest-to-sphere\n // Find the 2 closest faces on each polygon\n const otherWorldPos = circle.worldPos;\n const otherDirection = otherWorldPos.sub(polygon.worldPos);\n const rayTowardsOther = new _Math_ray__WEBPACK_IMPORTED_MODULE_2__.Ray(polygon.worldPos, otherDirection.normalize());\n const thisPoint = polygon.rayCast(rayTowardsOther).point.add(rayTowardsOther.dir.scale(0.1));\n const thisFace = polygon.getClosestFace(thisPoint);\n // L1 = P(s) = p0 + s * u, where s is time and p0 is the start of the line\n const p0 = thisFace.face.begin;\n const u = thisFace.face.getEdge();\n // Time of minimum distance\n let t = (u.x * (otherWorldPos.x - p0.x) + u.y * (otherWorldPos.y - p0.y)) / (u.x * u.x + u.y * u.y);\n // If time of minimum is past the edge clamp\n if (t > 1) {\n t = 1;\n }\n else if (t < 0) {\n t = 0;\n }\n // Minimum distance\n const d = Math.sqrt(Math.pow(p0.x + u.x * t - otherWorldPos.x, 2) + Math.pow(p0.y + u.y * t - otherWorldPos.y, 2)) - circle.radius;\n const circlex = ((p0.x + u.x * t - otherWorldPos.x) * circle.radius) / (circle.radius + d);\n const circley = ((p0.y + u.y * t - otherWorldPos.y) * circle.radius) / (circle.radius + d);\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_0__.LineSegment(u.scale(t).add(p0), new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(otherWorldPos.x + circlex, otherWorldPos.y + circley));\n },\n CircleCircleClosestLine(circleA, circleB) {\n // Find the 2 closest faces on each polygon\n const otherWorldPos = circleB.worldPos;\n const otherDirection = otherWorldPos.sub(circleA.worldPos);\n const thisWorldPos = circleA.worldPos;\n const thisDirection = thisWorldPos.sub(circleB.worldPos);\n const rayTowardsOther = new _Math_ray__WEBPACK_IMPORTED_MODULE_2__.Ray(circleA.worldPos, otherDirection);\n const rayTowardsThis = new _Math_ray__WEBPACK_IMPORTED_MODULE_2__.Ray(circleB.worldPos, thisDirection);\n const thisPoint = circleA.rayCast(rayTowardsOther);\n const otherPoint = circleB.rayCast(rayTowardsThis);\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_0__.LineSegment(thisPoint.point, otherPoint.point);\n },\n CircleEdgeClosestLine(circle, edge) {\n // https://math.stackexchange.com/questions/1919177/how-to-find-point-on-line-closest-to-sphere\n const circleWorldPos = circle.worldPos;\n // L1 = P(s) = p0 + s * u, where s is time and p0 is the start of the line\n const edgeLine = edge.asLine();\n const edgeStart = edgeLine.begin;\n const edgeVector = edgeLine.getEdge();\n const p0 = edgeStart;\n const u = edgeVector;\n // Time of minimum distance\n let t = (u.x * (circleWorldPos.x - p0.x) + u.y * (circleWorldPos.y - p0.y)) / (u.x * u.x + u.y * u.y);\n // If time of minimum is past the edge clamp to edge\n if (t > 1) {\n t = 1;\n }\n else if (t < 0) {\n t = 0;\n }\n // Minimum distance\n const d = Math.sqrt(Math.pow(p0.x + u.x * t - circleWorldPos.x, 2) + Math.pow(p0.y + u.y * t - circleWorldPos.y, 2)) - circle.radius;\n const circlex = ((p0.x + u.x * t - circleWorldPos.x) * circle.radius) / (circle.radius + d);\n const circley = ((p0.y + u.y * t - circleWorldPos.y) * circle.radius) / (circle.radius + d);\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_0__.LineSegment(u.scale(t).add(p0), new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(circleWorldPos.x + circlex, circleWorldPos.y + circley));\n },\n EdgeEdgeClosestLine(edgeA, edgeB) {\n // L1 = P(s) = p0 + s * u, where s is time and p0 is the start of the line\n const edgeLineA = edgeA.asLine();\n // L2 = Q(t) = q0 + t * v, where t is time and q0 is the start of the line\n const edgeLineB = edgeB.asLine();\n return ClosestLine(edgeLineA, edgeLineB);\n }\n};\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/Collider.ts\":\n/*!*****************************************!*\\\n !*** ./Collision/Colliders/Collider.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Collider: () => (/* binding */ Collider)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Id__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Id */ \"./Id.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n/**\n * A collision collider specifies the geometry that can detect when other collision colliders intersect\n * for the purposes of colliding 2 objects in excalibur.\n */\nclass Collider {\n constructor() {\n this.id = (0,_Id__WEBPACK_IMPORTED_MODULE_0__.createId)('collider', Collider._ID++);\n /**\n * Composite collider if any this collider is attached to\n *\n * **WARNING** do not tamper with this property\n */\n this.composite = null;\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_1__.EventEmitter();\n /**\n * Pixel offset of the collision collider relative to the collider, by default (0, 0) meaning the collider is positioned\n * on top of the collider.\n */\n this.offset = _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero;\n }\n /**\n * Returns a boolean indicating whether this body collided with\n * or was in stationary contact with\n * the body of the other {@apilink Collider}\n */\n touching(other) {\n const contact = this.collide(other);\n if (contact) {\n return true;\n }\n return false;\n }\n}\nCollider._ID = 0;\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/CollisionJumpTable.ts\":\n/*!***************************************************!*\\\n !*** ./Collision/Colliders/CollisionJumpTable.ts ***!\n \\***************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CollisionJumpTable: () => (/* binding */ CollisionJumpTable)\n/* harmony export */ });\n/* harmony import */ var _CircleCollider__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./CircleCollider */ \"./Collision/Colliders/CircleCollider.ts\");\n/* harmony import */ var _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Detection/CollisionContact */ \"./Collision/Detection/CollisionContact.ts\");\n/* harmony import */ var _PolygonCollider__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./PolygonCollider */ \"./Collision/Colliders/PolygonCollider.ts\");\n/* harmony import */ var _EdgeCollider__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./EdgeCollider */ \"./Collision/Colliders/EdgeCollider.ts\");\n/* harmony import */ var _SeparatingAxis__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./SeparatingAxis */ \"./Collision/Colliders/SeparatingAxis.ts\");\n/* harmony import */ var _Math_line_segment__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../Math/line-segment */ \"./Math/line-segment.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../EntityComponentSystem */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Detection_Pair__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Detection/Pair */ \"./Collision/Detection/Pair.ts\");\n/* harmony import */ var _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/affine-matrix */ \"./Math/affine-matrix.ts\");\n\n\n\n\n\n\n\n\n\n\nconst ScratchZero = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero; // TODO constant vector\nconst ScratchNormal = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero; // TODO constant vector\nconst ScratchMatrix = _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_1__.AffineMatrix.identity();\nconst CollisionJumpTable = {\n CollideCircleCircle(circleA, circleB) {\n const circleAPos = circleA.worldPos;\n const circleBPos = circleB.worldPos;\n const combinedRadius = circleA.radius + circleB.radius;\n const distance = circleAPos.distance(circleBPos);\n if (distance > combinedRadius) {\n return [];\n }\n // negative means overlap\n const separation = combinedRadius - distance;\n // Normal points from A -> B\n const normal = circleBPos.sub(circleAPos).normalize();\n const tangent = normal.perpendicular();\n const mvt = normal.scale(separation);\n const point = circleA.getFurthestPoint(normal);\n const local = circleA.getFurthestLocalPoint(normal);\n const info = {\n collider: circleA,\n separation,\n axis: normal,\n point: point\n };\n return [new _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_2__.CollisionContact(circleA, circleB, mvt, normal, tangent, [point], [local], info)];\n },\n CollideCirclePolygon(circle, polygon) {\n var _a, _b;\n let minAxis = _SeparatingAxis__WEBPACK_IMPORTED_MODULE_3__.SeparatingAxis.findCirclePolygonSeparation(circle, polygon);\n if (!minAxis) {\n return [];\n }\n // make sure that the minAxis is pointing away from circle\n const sameDir = minAxis.dot(polygon.center.sub(circle.center));\n minAxis = sameDir < 0 ? minAxis.negate() : minAxis;\n const point = circle.getFurthestPoint(minAxis);\n const xf = (_b = (_a = circle.owner) === null || _a === void 0 ? void 0 : _a.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__.TransformComponent)) !== null && _b !== void 0 ? _b : new _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__.TransformComponent();\n const local = xf.applyInverse(point);\n const normal = minAxis.normalize();\n const info = {\n collider: circle,\n separation: -minAxis.magnitude,\n axis: normal,\n point: point,\n localPoint: local,\n side: polygon.findSide(normal.negate()),\n localSide: polygon.findLocalSide(normal.negate())\n };\n return [new _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_2__.CollisionContact(circle, polygon, minAxis, normal, normal.perpendicular(), [point], [local], info)];\n },\n CollideCircleEdge(circle, edge) {\n // TODO not sure this actually abides by local/world collisions\n // Are edge.begin and edge.end local space or world space? I think they should be local\n // center of the circle in world pos\n const cc = circle.center;\n // vector in the direction of the edge\n const edgeWorld = edge.asLine();\n const e = edgeWorld.end.sub(edgeWorld.begin);\n // amount of overlap with the circle's center along the edge direction\n const u = e.dot(edgeWorld.end.sub(cc));\n const v = e.dot(cc.sub(edgeWorld.begin));\n const side = edge.asLine();\n const localSide = edge.asLocalLine();\n // Potential region A collision (circle is on the left side of the edge, before the beginning)\n if (v <= 0) {\n const da = edgeWorld.begin.sub(cc);\n const dda = da.dot(da); // quick and dirty way of calc'n distance in r^2 terms saves some sqrts\n // save some sqrts\n if (dda > circle.radius * circle.radius) {\n return []; // no collision\n }\n const normal = da.normalize();\n const separation = circle.radius - Math.sqrt(dda);\n const info = {\n collider: circle,\n separation: separation,\n axis: normal,\n point: side.begin,\n side: side,\n localSide: localSide\n };\n return [\n new _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_2__.CollisionContact(circle, edge, normal.scale(separation), normal, normal.perpendicular(), [side.begin], [localSide.begin], info)\n ];\n }\n // Potential region B collision (circle is on the right side of the edge, after the end)\n if (u <= 0) {\n const db = edgeWorld.end.sub(cc);\n const ddb = db.dot(db);\n if (ddb > circle.radius * circle.radius) {\n return [];\n }\n const normal = db.normalize();\n const separation = circle.radius - Math.sqrt(ddb);\n const info = {\n collider: circle,\n separation: separation,\n axis: normal,\n point: side.end,\n side: side,\n localSide: localSide\n };\n return [\n new _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_2__.CollisionContact(circle, edge, normal.scale(separation), normal, normal.perpendicular(), [side.end], [localSide.end], info)\n ];\n }\n // Otherwise potential region AB collision (circle is in the middle of the edge between the beginning and end)\n const den = e.dot(e);\n const pointOnEdge = edgeWorld.begin\n .scale(u)\n .add(edgeWorld.end.scale(v))\n .scale(1 / den);\n const d = cc.sub(pointOnEdge);\n const dd = d.dot(d);\n if (dd > circle.radius * circle.radius) {\n return []; // no collision\n }\n let normal = e.perpendicular();\n // flip correct direction\n if (normal.dot(cc.sub(edgeWorld.begin)) < 0) {\n normal.x = -normal.x;\n normal.y = -normal.y;\n }\n normal = normal.normalize();\n const separation = circle.radius - Math.sqrt(dd);\n const mvt = normal.scale(separation);\n const info = {\n collider: circle,\n separation: separation,\n axis: normal,\n point: pointOnEdge,\n side: side,\n localSide: localSide\n };\n return [\n new _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_2__.CollisionContact(circle, edge, mvt, normal.negate(), normal.negate().perpendicular(), [pointOnEdge], [pointOnEdge.sub(edge.worldPos)], info)\n ];\n },\n CollideEdgeEdge() {\n // Edge-edge collision doesn't make sense\n return [];\n },\n CollidePolygonEdge(polygon, edge) {\n var _a;\n const pc = polygon.center;\n const ec = edge.center;\n const dir = ec.sub(pc).normalize();\n // build a temporary polygon from the edge to use SAT\n const linePoly = new _PolygonCollider__WEBPACK_IMPORTED_MODULE_5__.PolygonCollider({\n points: [edge.begin, edge.end, edge.end.add(dir.scale(100)), edge.begin.add(dir.scale(100))],\n offset: edge.offset\n });\n linePoly.owner = edge.owner;\n const tx = (_a = edge.owner) === null || _a === void 0 ? void 0 : _a.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__.TransformComponent);\n if (tx) {\n linePoly.update(edge.owner.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__.TransformComponent).get());\n }\n // Gross hack but poly-poly works well\n const contact = this.CollidePolygonPolygon(polygon, linePoly);\n if (contact.length) {\n // Fudge the contact back to edge\n contact[0].colliderB = edge;\n contact[0].id = _Detection_Pair__WEBPACK_IMPORTED_MODULE_6__.Pair.calculatePairHash(polygon.id, edge.id);\n }\n return contact;\n },\n CollidePolygonPolygon(polyA, polyB) {\n // Multi contact from SAT\n // https://gamedev.stackexchange.com/questions/111390/multiple-contacts-for-sat-collision-detection\n // do a SAT test to find a min axis if it exists\n const separationA = _SeparatingAxis__WEBPACK_IMPORTED_MODULE_3__.SeparatingAxis.findPolygonPolygonSeparation(polyA, polyB);\n // If there is no overlap from boxA's perspective we can end early\n if (separationA.separation > 0) {\n return [];\n }\n const separationB = _SeparatingAxis__WEBPACK_IMPORTED_MODULE_3__.SeparatingAxis.findPolygonPolygonSeparation(polyB, polyA);\n // If there is no overlap from boxB's perspective exit now\n if (separationB.separation > 0) {\n return [];\n }\n // Separations are both negative, we want to pick the least negative (minimal movement)\n const separation = separationA.separation > separationB.separation ? separationA : separationB;\n // The incident side is the most opposite from the axes of collision on the other collider\n const other = separation.collider === polyA ? polyB : polyA;\n const main = separation.collider === polyA ? polyA : polyB;\n const toIncidentFrame = other.transform.inverse.multiply(main.transform.matrix, ScratchMatrix);\n const toIncidentFrameRotation = toIncidentFrame.getRotation();\n const referenceEdgeNormal = main.normals[separation.sideId].rotate(toIncidentFrameRotation, ScratchZero, ScratchNormal);\n let minEdge = Number.MAX_VALUE;\n let incidentEdgeIndex = 0;\n for (let i = 0; i < other.normals.length; i++) {\n const value = referenceEdgeNormal.dot(other.normals[i]);\n if (value < minEdge) {\n minEdge = value;\n incidentEdgeIndex = i;\n }\n }\n // Clip incident side by the perpendicular lines at each end of the reference side\n // https://en.wikipedia.org/wiki/Sutherland%E2%80%93Hodgman_algorithm\n const referenceSide = separation.localSide.transform(toIncidentFrame);\n const referenceDirection = separation.localAxis.perpendicular().negate().rotate(toIncidentFrameRotation);\n const incidentSide = new _Math_line_segment__WEBPACK_IMPORTED_MODULE_7__.LineSegment(other.points[incidentEdgeIndex], other.points[(incidentEdgeIndex + 1) % other.points.length]);\n const clipRight = incidentSide.clip(referenceDirection.negate(), -referenceDirection.dot(referenceSide.begin), false);\n let clipLeft = null;\n if (clipRight) {\n clipLeft = clipRight.clip(referenceDirection, referenceDirection.dot(referenceSide.end), false);\n }\n if (clipLeft) {\n const localPoints = [];\n const points = [];\n const clipPoints = clipLeft.getPoints();\n for (let i = 0; i < clipPoints.length; i++) {\n const p = clipPoints[i];\n if (referenceSide.below(p)) {\n localPoints.push(p);\n points.push(other.transform.apply(p));\n }\n }\n let normal = separation.axis;\n let tangent = normal.perpendicular();\n // Point Contact A -> B\n if (polyB.center.sub(polyA.center).dot(normal) < 0) {\n normal = normal.negate();\n tangent = normal.perpendicular();\n }\n return [new _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_2__.CollisionContact(polyA, polyB, normal.scale(-separation.separation), normal, tangent, points, localPoints, separation)];\n }\n return [];\n },\n FindContactSeparation(contact, localPoint) {\n var _a, _b, _c, _d;\n const shapeA = contact.colliderA;\n const txA = (_b = (_a = contact.bodyA) === null || _a === void 0 ? void 0 : _a.transform) !== null && _b !== void 0 ? _b : new _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__.TransformComponent();\n const shapeB = contact.colliderB;\n const txB = (_d = (_c = contact.bodyB) === null || _c === void 0 ? void 0 : _c.transform) !== null && _d !== void 0 ? _d : new _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__.TransformComponent();\n // both are circles\n if (shapeA instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_8__.CircleCollider && shapeB instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_8__.CircleCollider) {\n const combinedRadius = shapeA.radius + shapeB.radius;\n const distance = txA.pos.distance(txB.pos);\n const separation = combinedRadius - distance;\n return -separation;\n }\n // both are polygons\n if (shapeA instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_5__.PolygonCollider && shapeB instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_5__.PolygonCollider) {\n if (contact.info.localSide) {\n let side;\n let worldPoint;\n if (contact.info.collider === shapeA) {\n side = new _Math_line_segment__WEBPACK_IMPORTED_MODULE_7__.LineSegment(txA.apply(contact.info.localSide.begin), txA.apply(contact.info.localSide.end));\n worldPoint = txB.apply(localPoint);\n }\n else {\n side = new _Math_line_segment__WEBPACK_IMPORTED_MODULE_7__.LineSegment(txB.apply(contact.info.localSide.begin), txB.apply(contact.info.localSide.end));\n worldPoint = txA.apply(localPoint);\n }\n return side.distanceToPoint(worldPoint, true);\n }\n }\n // polygon v circle\n if ((shapeA instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_5__.PolygonCollider && shapeB instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_8__.CircleCollider) ||\n (shapeB instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_5__.PolygonCollider && shapeA instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_8__.CircleCollider)) {\n const worldPoint = txA.apply(localPoint);\n if (contact.info.side) {\n return contact.info.side.distanceToPoint(worldPoint, true);\n }\n }\n // polygon v edge\n if ((shapeA instanceof _EdgeCollider__WEBPACK_IMPORTED_MODULE_9__.EdgeCollider && shapeB instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_5__.PolygonCollider) ||\n (shapeB instanceof _EdgeCollider__WEBPACK_IMPORTED_MODULE_9__.EdgeCollider && shapeA instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_5__.PolygonCollider)) {\n let worldPoint;\n if (contact.info.collider === shapeA) {\n worldPoint = txB.apply(localPoint);\n }\n else {\n worldPoint = txA.apply(localPoint);\n }\n if (contact.info.side) {\n return contact.info.side.distanceToPoint(worldPoint, true);\n }\n }\n // circle v edge\n if ((shapeA instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_8__.CircleCollider && shapeB instanceof _EdgeCollider__WEBPACK_IMPORTED_MODULE_9__.EdgeCollider) ||\n (shapeB instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_8__.CircleCollider && shapeA instanceof _EdgeCollider__WEBPACK_IMPORTED_MODULE_9__.EdgeCollider)) {\n // Local point is always on the edge which is always shapeB\n const worldPoint = txB.apply(localPoint);\n let circlePoint;\n if (shapeA instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_8__.CircleCollider) {\n circlePoint = shapeA.getFurthestPoint(contact.normal);\n }\n const dist = worldPoint.distance(circlePoint);\n if (contact.info.side) {\n return dist > 0 ? -dist : 0;\n }\n }\n return 0;\n }\n};\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/CompositeCollider.ts\":\n/*!**************************************************!*\\\n !*** ./Collision/Colliders/CompositeCollider.ts ***!\n \\**************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CompositeCollider: () => (/* binding */ CompositeCollider)\n/* harmony export */ });\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../.. */ \"./Util/Util.ts\");\n/* harmony import */ var _Detection_Pair__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Detection/Pair */ \"./Collision/Detection/Pair.ts\");\n/* harmony import */ var _Math_projection__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../Math/projection */ \"./Math/projection.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Detection_DynamicTree__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Detection/DynamicTree */ \"./Collision/Detection/DynamicTree.ts\");\n/* harmony import */ var _Detection_DynamicTreeCollisionProcessor__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Detection/DynamicTreeCollisionProcessor */ \"./Collision/Detection/DynamicTreeCollisionProcessor.ts\");\n/* harmony import */ var _Collider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Collider */ \"./Collision/Colliders/Collider.ts\");\n/* harmony import */ var _PhysicsConfig__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../PhysicsConfig */ \"./Collision/PhysicsConfig.ts\");\n\n\n\n\n\n\n\n\n\nclass CompositeCollider extends _Collider__WEBPACK_IMPORTED_MODULE_0__.Collider {\n /**\n * Treat composite collider's member colliders as either separate colliders for the purposes of onCollisionStart/onCollision\n * or as a single collider together.\n *\n * This property can be overridden on individual {@apilink CompositeColliders}.\n *\n * For composites without gaps or small groups of colliders, you probably want 'together'\n *\n * For composites with deliberate gaps, like a platforming level layout, you probably want 'separate'\n *\n * Default is 'together' if unset\n */\n set compositeStrategy(value) {\n this._compositeStrategy = value;\n }\n get compositeStrategy() {\n return this._compositeStrategy;\n }\n constructor(colliders) {\n super();\n this._collisionProcessor = new _Detection_DynamicTreeCollisionProcessor__WEBPACK_IMPORTED_MODULE_1__.DynamicTreeCollisionProcessor({\n ...(0,_PhysicsConfig__WEBPACK_IMPORTED_MODULE_2__.getDefaultPhysicsConfig)()\n });\n this._dynamicAABBTree = new _Detection_DynamicTree__WEBPACK_IMPORTED_MODULE_3__.DynamicTree({\n boundsPadding: 5,\n velocityMultiplier: 2\n });\n this._colliders = [];\n for (const c of colliders) {\n this.addCollider(c);\n }\n }\n clearColliders() {\n this._colliders = [];\n }\n addCollider(collider) {\n let colliders;\n if (collider instanceof CompositeCollider) {\n colliders = collider.getColliders();\n colliders.forEach((c) => c.offset.addEqual(collider.offset));\n }\n else {\n colliders = [collider];\n }\n // Flatten composites\n for (const c of colliders) {\n c.events.pipe(this.events);\n c.composite = this;\n this._colliders.push(c);\n this._collisionProcessor.track(c);\n this._dynamicAABBTree.trackCollider(c);\n }\n }\n removeCollider(collider) {\n collider.events.pipe(this.events);\n collider.composite = null;\n ___WEBPACK_IMPORTED_MODULE_4__.removeItemFromArray(collider, this._colliders);\n this._collisionProcessor.untrack(collider);\n this._dynamicAABBTree.untrackCollider(collider);\n }\n getColliders() {\n return this._colliders;\n }\n get worldPos() {\n var _a, _b;\n return ((_b = (_a = this._transform) === null || _a === void 0 ? void 0 : _a.pos) !== null && _b !== void 0 ? _b : _Math_vector__WEBPACK_IMPORTED_MODULE_5__.Vector.Zero).add(this.offset);\n }\n get center() {\n var _a, _b;\n return ((_b = (_a = this._transform) === null || _a === void 0 ? void 0 : _a.pos) !== null && _b !== void 0 ? _b : _Math_vector__WEBPACK_IMPORTED_MODULE_5__.Vector.Zero).add(this.offset);\n }\n get bounds() {\n var _a, _b;\n // TODO cache this\n const colliders = this.getColliders();\n const results = colliders.reduce((acc, collider) => acc.combine(collider.bounds), (_b = (_a = colliders[0]) === null || _a === void 0 ? void 0 : _a.bounds) !== null && _b !== void 0 ? _b : new _BoundingBox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox().translate(this.worldPos));\n return results.translate(this.offset);\n }\n get localBounds() {\n var _a, _b;\n // TODO cache this\n const colliders = this.getColliders();\n const results = colliders.reduce((acc, collider) => acc.combine(collider.localBounds), (_b = (_a = colliders[0]) === null || _a === void 0 ? void 0 : _a.localBounds) !== null && _b !== void 0 ? _b : new _BoundingBox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox());\n return results;\n }\n get axes() {\n // TODO cache this\n const colliders = this.getColliders();\n let axes = [];\n for (const collider of colliders) {\n axes = axes.concat(collider.axes);\n }\n return axes;\n }\n getFurthestPoint(direction) {\n const colliders = this.getColliders();\n const furthestPoints = [];\n for (const collider of colliders) {\n furthestPoints.push(collider.getFurthestPoint(direction));\n }\n // Pick best point from all colliders\n let bestPoint = furthestPoints[0];\n let maxDistance = -Number.MAX_VALUE;\n for (const point of furthestPoints) {\n const distance = point.dot(direction);\n if (distance > maxDistance) {\n bestPoint = point;\n maxDistance = distance;\n }\n }\n return bestPoint;\n }\n getInertia(mass) {\n const colliders = this.getColliders();\n let totalInertia = 0;\n for (const collider of colliders) {\n totalInertia += collider.getInertia(mass);\n }\n return totalInertia;\n }\n collide(other) {\n let otherColliders = [other];\n if (other instanceof CompositeCollider) {\n otherColliders = other.getColliders();\n }\n const pairs = [];\n for (const c of otherColliders) {\n this._dynamicAABBTree.query(c, (potentialCollider) => {\n pairs.push(new _Detection_Pair__WEBPACK_IMPORTED_MODULE_7__.Pair(c, potentialCollider));\n return false;\n });\n }\n let contacts = [];\n for (const p of pairs) {\n contacts = contacts.concat(p.collide());\n }\n return contacts;\n }\n getClosestLineBetween(other) {\n const colliders = this.getColliders();\n const lines = [];\n if (other instanceof CompositeCollider) {\n const otherColliders = other.getColliders();\n for (const colliderA of colliders) {\n for (const colliderB of otherColliders) {\n const maybeLine = colliderA.getClosestLineBetween(colliderB);\n if (maybeLine) {\n lines.push(maybeLine);\n }\n }\n }\n }\n else {\n for (const collider of colliders) {\n const maybeLine = other.getClosestLineBetween(collider);\n if (maybeLine) {\n lines.push(maybeLine);\n }\n }\n }\n if (lines.length) {\n let minLength = lines[0].getLength();\n let minLine = lines[0];\n for (const line of lines) {\n const length = line.getLength();\n if (length < minLength) {\n minLength = length;\n minLine = line;\n }\n }\n return minLine;\n }\n return null;\n }\n contains(point) {\n const colliders = this.getColliders();\n for (const collider of colliders) {\n if (collider.contains(point)) {\n return true;\n }\n }\n return false;\n }\n rayCast(ray, max) {\n const colliders = this.getColliders();\n const hits = [];\n for (const collider of colliders) {\n const hit = collider.rayCast(ray, max);\n if (hit) {\n hits.push(hit);\n }\n }\n if (hits.length) {\n let minHit = hits[0];\n let minDistance = minHit.point.dot(ray.dir);\n for (const hit of hits) {\n const distance = ray.dir.dot(hit.point);\n if (distance < minDistance) {\n minHit = hit;\n minDistance = distance;\n }\n }\n return minHit;\n }\n return null;\n }\n project(axis) {\n const colliders = this.getColliders();\n const projections = [];\n for (const collider of colliders) {\n const proj = collider.project(axis);\n if (proj) {\n projections.push(proj);\n }\n }\n // Merge all proj's on the same axis\n if (projections.length) {\n const newProjection = new _Math_projection__WEBPACK_IMPORTED_MODULE_8__.Projection(projections[0].min, projections[0].max);\n for (const proj of projections) {\n newProjection.min = Math.min(proj.min, newProjection.min);\n newProjection.max = Math.max(proj.max, newProjection.max);\n }\n return newProjection;\n }\n return null;\n }\n update(transform) {\n if (transform) {\n const colliders = this.getColliders();\n for (const collider of colliders) {\n collider.owner = this.owner;\n collider.update(transform);\n }\n }\n }\n debug(ex, color, options) {\n const colliders = this.getColliders();\n ex.save();\n ex.translate(this.offset.x, this.offset.y);\n for (const collider of colliders) {\n collider.debug(ex, color, options);\n }\n ex.restore();\n }\n clone() {\n const result = new CompositeCollider(this._colliders.map((c) => c.clone()));\n result.offset = this.offset.clone();\n return result;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/EdgeCollider.ts\":\n/*!*********************************************!*\\\n !*** ./Collision/Colliders/EdgeCollider.ts ***!\n \\*********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EdgeCollider: () => (/* binding */ EdgeCollider)\n/* harmony export */ });\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./CollisionJumpTable */ \"./Collision/Colliders/CollisionJumpTable.ts\");\n/* harmony import */ var _CircleCollider__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./CircleCollider */ \"./Collision/Colliders/CircleCollider.ts\");\n/* harmony import */ var _PolygonCollider__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./PolygonCollider */ \"./Collision/Colliders/PolygonCollider.ts\");\n/* harmony import */ var _Math_projection__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../Math/projection */ \"./Math/projection.ts\");\n/* harmony import */ var _Math_line_segment__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../Math/line-segment */ \"./Math/line-segment.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Collider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Collider */ \"./Collision/Colliders/Collider.ts\");\n/* harmony import */ var _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./ClosestLineJumpTable */ \"./Collision/Colliders/ClosestLineJumpTable.ts\");\n/* harmony import */ var _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/affine-matrix */ \"./Math/affine-matrix.ts\");\n/* harmony import */ var _Index__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Index */ \"./Collision/BodyComponent.ts\");\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Edge is a single line collider to create collisions with a single line.\n */\nclass EdgeCollider extends _Collider__WEBPACK_IMPORTED_MODULE_0__.Collider {\n constructor(options) {\n var _a;\n super();\n this._globalMatrix = _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_1__.AffineMatrix.identity();\n this.begin = options.begin || _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero;\n this.end = options.end || _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero;\n this.offset = (_a = options.offset) !== null && _a !== void 0 ? _a : _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero;\n }\n /**\n * Returns a clone of this Edge, not associated with any collider\n */\n clone() {\n return new EdgeCollider({\n begin: this.begin.clone(),\n end: this.end.clone()\n });\n }\n get worldPos() {\n var _a;\n const tx = this._transform;\n return (_a = tx === null || tx === void 0 ? void 0 : tx.globalPos.add(this.offset)) !== null && _a !== void 0 ? _a : this.offset;\n }\n /**\n * Get the center of the collision area in world coordinates\n */\n get center() {\n const begin = this._getTransformedBegin();\n const end = this._getTransformedEnd();\n const pos = begin.average(end);\n return pos;\n }\n _getTransformedBegin() {\n return this._globalMatrix.multiply(this.begin);\n }\n _getTransformedEnd() {\n return this._globalMatrix.multiply(this.end);\n }\n /**\n * Returns the slope of the line in the form of a vector\n */\n getSlope() {\n const begin = this._getTransformedBegin();\n const end = this._getTransformedEnd();\n const distance = begin.distance(end);\n return end.sub(begin).scale(1 / distance);\n }\n /**\n * Returns the length of the line segment in pixels\n */\n getLength() {\n const begin = this._getTransformedBegin();\n const end = this._getTransformedEnd();\n const distance = begin.distance(end);\n return distance;\n }\n /**\n * Tests if a point is contained in this collision area\n */\n contains() {\n return false;\n }\n /**\n * @inheritdoc\n */\n rayCast(ray, max = Infinity) {\n var _a;\n const numerator = this._getTransformedBegin().sub(ray.pos);\n // Test is line and ray are parallel and non intersecting\n if (ray.dir.cross(this.getSlope()) === 0 && numerator.cross(ray.dir) !== 0) {\n return null;\n }\n // Lines are parallel\n const divisor = ray.dir.cross(this.getSlope());\n if (divisor === 0) {\n return null;\n }\n const t = numerator.cross(this.getSlope()) / divisor;\n if (t >= 0 && t <= max) {\n const u = numerator.cross(ray.dir) / divisor / this.getLength();\n if (u >= 0 && u <= 1) {\n return {\n distance: t,\n normal: this.asLine().normal(),\n collider: this,\n body: (_a = this.owner) === null || _a === void 0 ? void 0 : _a.get(_Index__WEBPACK_IMPORTED_MODULE_3__.BodyComponent),\n point: ray.getPoint(t)\n };\n }\n }\n return null;\n }\n /**\n * Returns the closes line between this and another collider, from this -> collider\n * @param shape\n */\n getClosestLineBetween(shape) {\n if (shape instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_4__.CircleCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_5__.ClosestLineJumpTable.CircleEdgeClosestLine(shape, this);\n }\n else if (shape instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_6__.PolygonCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_5__.ClosestLineJumpTable.PolygonEdgeClosestLine(shape, this).flip();\n }\n else if (shape instanceof EdgeCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_5__.ClosestLineJumpTable.EdgeEdgeClosestLine(this, shape);\n }\n else {\n throw new Error(`Polygon could not collide with unknown CollisionShape ${typeof shape}`);\n }\n }\n /**\n * @inheritdoc\n */\n collide(shape) {\n if (shape instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_4__.CircleCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_7__.CollisionJumpTable.CollideCircleEdge(shape, this);\n }\n else if (shape instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_6__.PolygonCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_7__.CollisionJumpTable.CollidePolygonEdge(shape, this);\n }\n else if (shape instanceof EdgeCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_7__.CollisionJumpTable.CollideEdgeEdge();\n }\n else {\n throw new Error(`Edge could not collide with unknown CollisionShape ${typeof shape}`);\n }\n }\n /**\n * Find the point on the collider furthest in the direction specified\n */\n getFurthestPoint(direction) {\n const transformedBegin = this._getTransformedBegin();\n const transformedEnd = this._getTransformedEnd();\n if (direction.dot(transformedBegin) > 0) {\n return transformedBegin;\n }\n else {\n return transformedEnd;\n }\n }\n _boundsFromBeginEnd(begin, end, padding = 10) {\n // A perfectly vertical or horizontal edge would have a bounds 0 width or height\n // this causes problems for the collision system so we give them some padding\n return new _BoundingBox__WEBPACK_IMPORTED_MODULE_8__.BoundingBox(Math.min(begin.x, end.x) - padding, Math.min(begin.y, end.y) - padding, Math.max(begin.x, end.x) + padding, Math.max(begin.y, end.y) + padding);\n }\n /**\n * Get the axis aligned bounding box for the edge collider in world space\n */\n get bounds() {\n const transformedBegin = this._getTransformedBegin();\n const transformedEnd = this._getTransformedEnd();\n return this._boundsFromBeginEnd(transformedBegin, transformedEnd);\n }\n /**\n * Get the axis aligned bounding box for the edge collider in local space\n */\n get localBounds() {\n return this._boundsFromBeginEnd(this.begin, this.end);\n }\n /**\n * Returns this edge represented as a line in world coordinates\n */\n asLine() {\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_9__.LineSegment(this._getTransformedBegin(), this._getTransformedEnd());\n }\n /**\n * Return this edge as a line in local line coordinates (relative to the position)\n */\n asLocalLine() {\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_9__.LineSegment(this.begin, this.end);\n }\n /**\n * Get the axis associated with the edge\n */\n get axes() {\n const e = this._getTransformedEnd().sub(this._getTransformedBegin());\n const edgeNormal = e.normal();\n const axes = [];\n axes.push(edgeNormal);\n axes.push(edgeNormal.negate());\n axes.push(edgeNormal.normal());\n axes.push(edgeNormal.normal().negate());\n return axes;\n }\n /**\n * Get the moment of inertia for an edge\n * https://en.wikipedia.org/wiki/List_of_moments_of_inertia\n */\n getInertia(mass) {\n const length = this.end.sub(this.begin).distance() / 2;\n return mass * length * length;\n }\n /**\n * @inheritdoc\n */\n update(transform) {\n var _a;\n this._transform = transform;\n const globalMat = (_a = transform.matrix) !== null && _a !== void 0 ? _a : this._globalMatrix;\n globalMat.clone(this._globalMatrix);\n this._globalMatrix.translate(this.offset.x, this.offset.y);\n }\n /**\n * Project the edge along a specified axis\n */\n project(axis) {\n const scalars = [];\n const points = [this._getTransformedBegin(), this._getTransformedEnd()];\n const len = points.length;\n for (let i = 0; i < len; i++) {\n scalars.push(points[i].dot(axis));\n }\n return new _Math_projection__WEBPACK_IMPORTED_MODULE_10__.Projection(Math.min.apply(Math, scalars), Math.max.apply(Math, scalars));\n }\n debug(ex, color) {\n const begin = this._getTransformedBegin();\n const end = this._getTransformedEnd();\n ex.drawLine(begin, end, color, 2);\n ex.drawCircle(begin, 2, color);\n ex.drawCircle(end, 2, color);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/PolygonCollider.ts\":\n/*!************************************************!*\\\n !*** ./Collision/Colliders/PolygonCollider.ts ***!\n \\************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PolygonCollider: () => (/* binding */ PolygonCollider)\n/* harmony export */ });\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _EdgeCollider__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./EdgeCollider */ \"./Collision/Colliders/EdgeCollider.ts\");\n/* harmony import */ var _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./CollisionJumpTable */ \"./Collision/Colliders/CollisionJumpTable.ts\");\n/* harmony import */ var _CircleCollider__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./CircleCollider */ \"./Collision/Colliders/CircleCollider.ts\");\n/* harmony import */ var _Math_projection__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../Math/projection */ \"./Math/projection.ts\");\n/* harmony import */ var _Math_line_segment__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../Math/line-segment */ \"./Math/line-segment.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math_ray__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../Math/ray */ \"./Math/ray.ts\");\n/* harmony import */ var _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./ClosestLineJumpTable */ \"./Collision/Colliders/ClosestLineJumpTable.ts\");\n/* harmony import */ var _Collider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Collider */ \"./Collision/Colliders/Collider.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../.. */ \"./Util/Log.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../.. */ \"./Math/util.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../.. */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../.. */ \"./Graphics/Debug.ts\");\n/* harmony import */ var _CompositeCollider__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var _Shape__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Shape */ \"./Collision/Colliders/Shape.ts\");\n/* harmony import */ var _Math_transform__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math/transform */ \"./Math/transform.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Polygon collider for detecting collisions\n */\nclass PolygonCollider extends _Collider__WEBPACK_IMPORTED_MODULE_0__.Collider {\n flagDirty() {\n this._localBoundsDirty = true;\n this._localSidesDirty = true;\n this._transformedPointsDirty = true;\n this._sidesDirty = true;\n }\n get normals() {\n return this._normals;\n }\n /**\n * Points in the polygon in order around the perimeter in local coordinates. These are relative from the body transform position.\n * Excalibur stores these in counter-clockwise order\n */\n set points(points) {\n if (points.length < 3) {\n throw new Error('PolygonCollider cannot be created with less that 3 points');\n }\n this._points = points;\n this._checkAndUpdateWinding(this._points);\n this._calculateNormals();\n this.flagDirty();\n }\n _calculateNormals() {\n const normals = [];\n for (let i = 0; i < this._points.length; i++) {\n normals.push(this._points[(i + 1) % this._points.length].sub(this._points[i]).normal());\n }\n this._normals = normals;\n }\n /**\n * Points in the polygon in order around the perimeter in local coordinates. These are relative from the body transform position.\n * Excalibur stores these in counter-clockwise order\n */\n get points() {\n return this._points;\n }\n get transform() {\n return this._transform;\n }\n constructor(options) {\n var _a;\n super();\n this._logger = ___WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this._transform = new _Math_transform__WEBPACK_IMPORTED_MODULE_2__.Transform();\n this._transformedPoints = [];\n this._sides = [];\n this._localSides = [];\n this._transformedPointsDirty = true;\n this._sidesDirty = true;\n this._localSidesDirty = true;\n this._localBoundsDirty = true;\n this.offset = (_a = options.offset) !== null && _a !== void 0 ? _a : _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero;\n this._transform.pos.x += this.offset.x;\n this._transform.pos.y += this.offset.y;\n this.points = options.points;\n if (!this.isConvex()) {\n if (!options.suppressConvexWarning) {\n this._logger.warn('Excalibur only supports convex polygon colliders and will not behave properly.' +\n 'Call PolygonCollider.triangulate() to build a new collider composed of smaller convex triangles');\n }\n }\n // calculate initial transformation\n this._calculateTransformation();\n }\n _checkAndUpdateWinding(points) {\n const counterClockwise = this._isCounterClockwiseWinding(points);\n if (!counterClockwise) {\n points.reverse();\n }\n }\n _isCounterClockwiseWinding(points) {\n // https://stackoverflow.com/a/1165943\n let sum = 0;\n for (let i = 0; i < points.length; i++) {\n sum += (points[(i + 1) % points.length].x - points[i].x) * (points[(i + 1) % points.length].y + points[i].y);\n }\n return sum < 0;\n }\n /**\n * Returns if the polygon collider is convex, Excalibur does not handle non-convex collision shapes.\n * Call {@apilink Polygon.triangulate} to generate a {@apilink CompositeCollider} from this non-convex shape\n */\n isConvex() {\n // From SO: https://stackoverflow.com/a/45372025\n if (this.points.length < 3) {\n return false;\n }\n let oldPoint = this.points[this.points.length - 2];\n let newPoint = this.points[this.points.length - 1];\n let direction = Math.atan2(newPoint.y - oldPoint.y, newPoint.x - oldPoint.x);\n let oldDirection = 0;\n let orientation = 0;\n let angleSum = 0;\n for (const [i, point] of this.points.entries()) {\n oldPoint = newPoint;\n oldDirection = direction;\n newPoint = point;\n direction = Math.atan2(newPoint.y - oldPoint.y, newPoint.x - oldPoint.x);\n if (oldPoint.equals(newPoint)) {\n return false; // repeat point\n }\n let angle = direction - oldDirection;\n if (angle <= -Math.PI) {\n angle += Math.PI * 2;\n }\n else if (angle > Math.PI) {\n angle -= Math.PI * 2;\n }\n if (i === 0) {\n if (angle === 0.0) {\n return false;\n }\n orientation = angle > 0 ? 1 : -1;\n }\n else {\n if (orientation * angle <= 0) {\n return false;\n }\n }\n angleSum += angle;\n }\n return Math.abs(Math.round(angleSum / (Math.PI * 2))) === 1;\n }\n /**\n * Tessellates the polygon into a triangle fan as a {@apilink CompositeCollider} of triangle polygons\n */\n tessellate() {\n const polygons = [];\n for (let i = 1; i < this.points.length - 2; i++) {\n polygons.push([this.points[0], this.points[i + 1], this.points[i + 2]]);\n }\n polygons.push([this.points[0], this.points[1], this.points[2]]);\n return new _CompositeCollider__WEBPACK_IMPORTED_MODULE_4__.CompositeCollider(polygons.map((points) => _Shape__WEBPACK_IMPORTED_MODULE_5__.Shape.Polygon(points)));\n }\n /**\n * Triangulate the polygon collider using the \"Ear Clipping\" algorithm.\n * Returns a new {@apilink CompositeCollider} made up of smaller triangles.\n */\n triangulate() {\n // https://www.youtube.com/watch?v=hTJFcHutls8\n if (this.points.length < 3) {\n throw Error('Invalid polygon');\n }\n const triangles = [];\n // algorithm likes clockwise\n const vertices = [...this.points].reverse();\n let vertexCount = vertices.length;\n /**\n * Returns the previous index based on the current vertex\n */\n function getPrevIndex(index) {\n return index === 0 ? vertexCount - 1 : index - 1;\n }\n /**\n * Retrieves the next index based on the current vertex\n */\n function getNextIndex(index) {\n return index === vertexCount - 1 ? 0 : index + 1;\n }\n /**\n * Whether or not the angle at this vertex index is convex\n */\n function isConvex(index) {\n const prev = getPrevIndex(index);\n const next = getNextIndex(index);\n const va = vertices[prev];\n const vb = vertices[index];\n const vc = vertices[next];\n // Check convexity\n const leftArm = va.sub(vb);\n const rightArm = vc.sub(vb);\n // Positive cross product is convex\n if (leftArm.cross(rightArm) < 0) {\n return false;\n }\n return true;\n }\n const convexVertices = vertices.map((_, i) => isConvex(i));\n /**\n * Quick test for point in triangle\n */\n function isPointInTriangle(point, a, b, c) {\n const ab = b.sub(a);\n const bc = c.sub(b);\n const ca = a.sub(c);\n const ap = point.sub(a);\n const bp = point.sub(b);\n const cp = point.sub(c);\n const cross1 = ab.cross(ap);\n const cross2 = bc.cross(bp);\n const cross3 = ca.cross(cp);\n if (cross1 > 0 || cross2 > 0 || cross3 > 0) {\n return false;\n }\n return true;\n }\n /**\n * Calculate the area of the triangle\n */\n // function triangleArea(a: Vector, b: Vector, c: Vector) {\n // return Math.abs(a.x * (b.y - c.y) + b.x * (c.y - a.y) + c.x * (a.y - c.y))/2;\n // }\n /**\n * Find the next suitable ear tip\n */\n function findEarTip() {\n for (let i = 0; i < vertexCount; i++) {\n if (convexVertices[i]) {\n const prev = getPrevIndex(i);\n const next = getNextIndex(i);\n const va = vertices[prev];\n const vb = vertices[i];\n const vc = vertices[next];\n let isEar = true;\n // Check that if any vertices are in the triangle a, b, c\n for (let j = 0; j < vertexCount; j++) {\n // We can skip these verts because they are the triangle we are testing\n if (j === i || j === prev || j === next) {\n continue;\n }\n const point = vertices[j];\n if (isPointInTriangle(point, va, vb, vc)) {\n isEar = false;\n break;\n }\n }\n // Add ear to polygon list and remove from list\n if (isEar) {\n return i;\n }\n }\n }\n // Fall back to any convex vertex\n for (let i = 0; i < vertexCount; i++) {\n if (convexVertices[i]) {\n return i;\n }\n }\n // bail and return the first one?\n return 0;\n }\n /**\n * Cut the ear and produce a triangle, update internal state\n */\n function cutEarTip(index) {\n const prev = getPrevIndex(index);\n const next = getNextIndex(index);\n const va = vertices[prev];\n const vb = vertices[index];\n const vc = vertices[next];\n // Clockwise winding\n // if (triangleArea(va, vb, vc) > 0) {\n triangles.push([va, vb, vc]);\n // }\n vertices.splice(index, 1);\n convexVertices.splice(index, 1);\n vertexCount--;\n }\n // Loop over all the vertices finding ears\n while (vertexCount > 3) {\n const earIndex = findEarTip();\n cutEarTip(earIndex);\n // reclassify vertices\n for (let i = 0; i < vertexCount; i++) {\n convexVertices[i] = isConvex(i);\n }\n }\n // Last triangle after the loop\n triangles.push([vertices[0], vertices[1], vertices[2]]);\n // FIXME: there is a colinear triangle that sneaks in here sometimes\n return new _CompositeCollider__WEBPACK_IMPORTED_MODULE_4__.CompositeCollider(triangles.map((points) => _Shape__WEBPACK_IMPORTED_MODULE_5__.Shape.Polygon(points, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero, true)));\n }\n /**\n * Returns a clone of this ConvexPolygon, not associated with any collider\n */\n clone() {\n return new PolygonCollider({\n offset: this.offset.clone(),\n points: this.points.map((p) => p.clone())\n });\n }\n /**\n * Returns the world position of the collider, which is the current body transform plus any defined offset\n */\n get worldPos() {\n return this._transform.pos;\n }\n /**\n * Get the center of the collider in world coordinates\n */\n get center() {\n return this.bounds.center;\n }\n /**\n * Calculates the underlying transformation from the body relative space to world space\n */\n _calculateTransformation() {\n const points = this.points;\n const len = points.length;\n this._transformedPoints.length = 0; // clear out old transform\n for (let i = 0; i < len; i++) {\n this._transformedPoints[i] = this._transform.apply(points[i].clone());\n }\n }\n /**\n * Gets the points that make up the polygon in world space, from actor relative space (if specified)\n */\n getTransformedPoints() {\n if (this._transformedPointsDirty) {\n this._calculateTransformation();\n this._transformedPointsDirty = false;\n }\n return this._transformedPoints;\n }\n /**\n * Gets the sides of the polygon in world space\n */\n getSides() {\n if (this._sidesDirty) {\n const lines = [];\n const points = this.getTransformedPoints();\n const len = points.length;\n for (let i = 0; i < len; i++) {\n // This winding is important\n lines.push(new _Math_line_segment__WEBPACK_IMPORTED_MODULE_6__.LineSegment(points[i], points[(i + 1) % len]));\n }\n this._sides = lines;\n this._sidesDirty = false;\n }\n return this._sides;\n }\n /**\n * Returns the local coordinate space sides\n */\n getLocalSides() {\n if (this._localSidesDirty) {\n const lines = [];\n const points = this.points;\n const len = points.length;\n for (let i = 0; i < len; i++) {\n // This winding is important\n lines.push(new _Math_line_segment__WEBPACK_IMPORTED_MODULE_6__.LineSegment(points[i], points[(i + 1) % len]));\n }\n this._localSides = lines;\n this._localSidesDirty = false;\n }\n return this._localSides;\n }\n /**\n * Given a direction vector find the world space side that is most in that direction\n * @param direction\n */\n findSide(direction) {\n const sides = this.getSides();\n let bestSide = sides[0];\n let maxDistance = -Number.MAX_VALUE;\n for (let side = 0; side < sides.length; side++) {\n const currentSide = sides[side];\n const sideNormal = currentSide.normal();\n const mostDirection = sideNormal.dot(direction);\n if (mostDirection > maxDistance) {\n bestSide = currentSide;\n maxDistance = mostDirection;\n }\n }\n return bestSide;\n }\n /**\n * Given a direction vector find the local space side that is most in that direction\n * @param direction\n */\n findLocalSide(direction) {\n const sides = this.getLocalSides();\n let bestSide = sides[0];\n let maxDistance = -Number.MAX_VALUE;\n for (let side = 0; side < sides.length; side++) {\n const currentSide = sides[side];\n const sideNormal = currentSide.normal();\n const mostDirection = sideNormal.dot(direction);\n if (mostDirection > maxDistance) {\n bestSide = currentSide;\n maxDistance = mostDirection;\n }\n }\n return bestSide;\n }\n /**\n * Get the axis associated with the convex polygon\n */\n get axes() {\n const axes = [];\n const sides = this.getSides();\n for (let i = 0; i < sides.length; i++) {\n axes.push(sides[i].normal());\n }\n return axes;\n }\n /**\n * Updates the transform for the collision geometry\n *\n * Collision geometry (points/bounds) will not change until this is called.\n * @param transform\n */\n update(transform) {\n if (transform) {\n // This change means an update must be performed in order for geometry to update\n transform.cloneWithParent(this._transform);\n this._transformedPointsDirty = true;\n this._sidesDirty = true;\n if (this.offset.x !== 0 || this.offset.y !== 0) {\n this._transform.pos.x += this.offset.x;\n this._transform.pos.y += this.offset.y;\n }\n if (this._transform.isMirrored()) {\n // negative transforms really mess with things in collision local space\n // flatten out the negatives by applying to geometry\n this.points = this.points.map((p) => (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(p.x * (0,___WEBPACK_IMPORTED_MODULE_7__.sign)(this._transform.scale.x), p.y * (0,___WEBPACK_IMPORTED_MODULE_7__.sign)(this._transform.scale.y)));\n this._transform.scale.x = Math.abs(this._transform.scale.x);\n this._transform.scale.y = Math.abs(this._transform.scale.y);\n }\n }\n }\n /**\n * Tests if a point is contained in this collider in world space\n */\n contains(point) {\n // Always cast to the right, as long as we cast in a consistent fixed direction we\n // will be fine\n const localPoint = this._transform.applyInverse(point);\n const testRay = new _Math_ray__WEBPACK_IMPORTED_MODULE_8__.Ray(localPoint, new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(1, 0));\n let intersectCount = 0;\n const sides = this.getLocalSides();\n for (let sideIndex = 0; sideIndex < sides.length; sideIndex++) {\n const side = sides[sideIndex];\n if (testRay.intersect(side) >= 0) {\n intersectCount++;\n }\n }\n if (intersectCount % 2 === 0) {\n return false;\n }\n return true;\n }\n getClosestLineBetween(collider) {\n if (collider instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_9__.CircleCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_10__.ClosestLineJumpTable.PolygonCircleClosestLine(this, collider);\n }\n else if (collider instanceof PolygonCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_10__.ClosestLineJumpTable.PolygonPolygonClosestLine(this, collider);\n }\n else if (collider instanceof _EdgeCollider__WEBPACK_IMPORTED_MODULE_11__.EdgeCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_10__.ClosestLineJumpTable.PolygonEdgeClosestLine(this, collider);\n }\n else {\n throw new Error(`Polygon could not collide with unknown CollisionShape ${typeof collider}`);\n }\n }\n /**\n * Returns a collision contact if the 2 colliders collide, otherwise collide will\n * return null.\n * @param collider\n */\n collide(collider) {\n if (collider instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_9__.CircleCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_12__.CollisionJumpTable.CollideCirclePolygon(collider, this);\n }\n else if (collider instanceof PolygonCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_12__.CollisionJumpTable.CollidePolygonPolygon(this, collider);\n }\n else if (collider instanceof _EdgeCollider__WEBPACK_IMPORTED_MODULE_11__.EdgeCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_12__.CollisionJumpTable.CollidePolygonEdge(this, collider);\n }\n else {\n throw new Error(`Polygon could not collide with unknown CollisionShape ${typeof collider}`);\n }\n }\n /**\n * Find the point on the collider furthest in the direction specified\n */\n getFurthestPoint(direction) {\n const pts = this.getTransformedPoints();\n let furthestPoint = null;\n let maxDistance = -Number.MAX_VALUE;\n for (let i = 0; i < pts.length; i++) {\n const distance = direction.dot(pts[i]);\n if (distance > maxDistance) {\n maxDistance = distance;\n furthestPoint = pts[i];\n }\n }\n return furthestPoint;\n }\n /**\n * Find the local point on the collider furthest in the direction specified\n * @param direction\n */\n getFurthestLocalPoint(direction) {\n const pts = this.points;\n let furthestPoint = pts[0];\n let maxDistance = -Number.MAX_VALUE;\n for (let i = 0; i < pts.length; i++) {\n const distance = direction.dot(pts[i]);\n if (distance > maxDistance) {\n maxDistance = distance;\n furthestPoint = pts[i];\n }\n }\n return furthestPoint;\n }\n /**\n * Finds the closes face to the point using perpendicular distance\n * @param point point to test against polygon\n */\n getClosestFace(point) {\n const sides = this.getSides();\n let min = Number.POSITIVE_INFINITY;\n let faceIndex = -1;\n let distance = -1;\n for (let i = 0; i < sides.length; i++) {\n const dist = sides[i].distanceToPoint(point);\n if (dist < min) {\n min = dist;\n faceIndex = i;\n distance = dist;\n }\n }\n if (faceIndex !== -1) {\n return {\n distance: sides[faceIndex].normal().scale(distance),\n face: sides[faceIndex]\n };\n }\n return null;\n }\n /**\n * Get the axis aligned bounding box for the polygon collider in world coordinates\n */\n get bounds() {\n return this.localBounds.transform(this._transform.matrix);\n }\n /**\n * Get the axis aligned bounding box for the polygon collider in local coordinates\n */\n get localBounds() {\n if (this._localBoundsDirty) {\n this._localBounds = _BoundingBox__WEBPACK_IMPORTED_MODULE_13__.BoundingBox.fromPoints(this.points);\n this._localBoundsDirty = false;\n }\n return this._localBounds;\n }\n /**\n * Get the moment of inertia for an arbitrary polygon\n * https://en.wikipedia.org/wiki/List_of_moments_of_inertia\n */\n getInertia(mass) {\n if (this._cachedMass === mass && this._cachedInertia) {\n return this._cachedInertia;\n }\n let numerator = 0;\n let denominator = 0;\n const points = this.points;\n for (let i = 0; i < points.length; i++) {\n const iplusone = (i + 1) % points.length;\n const crossTerm = points[iplusone].cross(points[i]);\n numerator += crossTerm * (points[i].dot(points[i]) + points[i].dot(points[iplusone]) + points[iplusone].dot(points[iplusone]));\n denominator += crossTerm;\n }\n this._cachedMass = mass;\n return (this._cachedInertia = (mass / 6) * (numerator / denominator));\n }\n /**\n * Casts a ray into the polygon and returns a vector representing the point of contact (in world space) or null if no collision.\n */\n rayCast(ray, max = Infinity) {\n var _a;\n // find the minimum contact time greater than 0\n // contact times less than 0 are behind the ray and we don't want those\n const sides = this.getSides();\n const len = sides.length;\n let minContactTime = Number.MAX_VALUE;\n let contactSide;\n let contactIndex = -1;\n for (let i = 0; i < len; i++) {\n const contactTime = ray.intersect(sides[i]);\n if (contactTime >= 0 && contactTime < minContactTime && contactTime <= max) {\n minContactTime = contactTime;\n contactSide = sides[i];\n contactIndex = i;\n }\n }\n // contact was found\n if (contactIndex >= 0) {\n return {\n collider: this,\n distance: minContactTime,\n body: (_a = this.owner) === null || _a === void 0 ? void 0 : _a.get(___WEBPACK_IMPORTED_MODULE_14__.BodyComponent),\n point: ray.getPoint(minContactTime),\n normal: contactSide.normal()\n };\n }\n // no contact found\n return null;\n }\n /**\n * Project the edges of the polygon along a specified axis\n */\n project(axis) {\n const points = this.getTransformedPoints();\n const len = points.length;\n let min = Number.MAX_VALUE;\n let max = -Number.MAX_VALUE;\n for (let i = 0; i < len; i++) {\n const scalar = points[i].dot(axis);\n min = Math.min(min, scalar);\n max = Math.max(max, scalar);\n }\n return new _Math_projection__WEBPACK_IMPORTED_MODULE_15__.Projection(min, max);\n }\n debug(ex, color, options) {\n const points = this.getTransformedPoints();\n ___WEBPACK_IMPORTED_MODULE_16__.Debug.drawPolygon(points, { color });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/SeparatingAxis.ts\":\n/*!***********************************************!*\\\n !*** ./Collision/Colliders/SeparatingAxis.ts ***!\n \\***********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SeparatingAxis: () => (/* binding */ SeparatingAxis),\n/* harmony export */ SeparationInfo: () => (/* binding */ SeparationInfo)\n/* harmony export */ });\n/* harmony import */ var _Math_line_segment__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/line-segment */ \"./Math/line-segment.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math/affine-matrix */ \"./Math/affine-matrix.ts\");\n/* harmony import */ var _Util_Pool__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Util/Pool */ \"./Util/Pool.ts\");\n\n\n\n\n/**\n * Specific information about a contact and it's separation\n */\nclass SeparationInfo {\n constructor() {\n /**\n * Axis of separation from the collider's perspective\n */\n this.axis = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n /**\n * Local axis of separation from the collider's perspective\n */\n this.localAxis = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n /**\n * Side of separation (reference) from the collider's perspective\n */\n this.side = new _Math_line_segment__WEBPACK_IMPORTED_MODULE_1__.LineSegment((0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0), (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0));\n /**\n * Local side of separation (reference) from the collider's perspective\n */\n this.localSide = new _Math_line_segment__WEBPACK_IMPORTED_MODULE_1__.LineSegment((0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0), (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0));\n /**\n * Point on collider B (incident point)\n */\n this.point = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n /**\n * Local point on collider B (incident point)\n */\n this.localPoint = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n }\n}\nclass SeparatingAxis {\n static findPolygonPolygonSeparation(polyA, polyB) {\n // if polyB has 0 scale we need to hop back to degenerate separation\n if (polyB.transform.matrix.determinant() === 0) {\n return SeparatingAxis.findPolygonPolygonSeparationDegenerate(polyA, polyB);\n }\n // Multi contact from SAT\n // https://gamedev.stackexchange.com/questions/111390/multiple-contacts-for-sat-collision-detection\n // do a SAT test to find a min axis if it exists\n let bestSeparation = -Number.MAX_VALUE;\n let bestSideIndex = -1;\n let localPoint;\n // Work inside polyB reference frame\n // inv polyB converts to local space from polyA world space\n const toPolyBSpace = polyB.transform.inverse.multiply(polyA.transform.matrix, SeparatingAxis._SCRATCH_MATRIX);\n const toPolyBSpaceRotation = toPolyBSpace.getRotation();\n const normalsA = polyA.normals;\n const pointsA = polyA.points;\n const pointsB = polyB.points;\n for (let pointsAIndex = 0; pointsAIndex < pointsA.length; pointsAIndex++) {\n const normal = normalsA[pointsAIndex].rotate(toPolyBSpaceRotation, SeparatingAxis._ZERO, SeparatingAxis._SCRATCH_NORMAL);\n const point = toPolyBSpace.multiply(pointsA[pointsAIndex], SeparatingAxis._SCRATCH_POINT);\n // For every point in polyB\n // We want to see how much overlap there is on the axis provided by the normal\n // We want to find the minimum overlap among all points\n let smallestPointDistance = Number.MAX_VALUE;\n let smallestLocalPoint;\n for (let pointsBIndex = 0; pointsBIndex < pointsB.length; pointsBIndex++) {\n const distance = normal.dot(pointsB[pointsBIndex].sub(point, SeparatingAxis._SCRATCH_SUB_POINT));\n if (distance < smallestPointDistance) {\n smallestPointDistance = distance;\n smallestLocalPoint = pointsB[pointsBIndex];\n }\n }\n // We take the maximum overlap as the separation between the\n // A negative separation means there were no gaps between the two shapes\n if (smallestPointDistance > bestSeparation) {\n bestSeparation = smallestPointDistance;\n bestSideIndex = pointsAIndex;\n localPoint = smallestLocalPoint;\n }\n }\n // TODO can we avoid applying world space transforms?\n const bestSide2 = (bestSideIndex + 1) % pointsA.length;\n const separationInfo = SeparatingAxis.SeparationPool.get();\n separationInfo.collider = polyA;\n separationInfo.separation = bestSeparation;\n if (bestSeparation > 0) {\n // early out because if separation is > 0 then no local point\n return separationInfo;\n }\n normalsA[bestSideIndex].clone(separationInfo.localAxis);\n normalsA[bestSideIndex].rotate(polyA.transform.rotation, SeparatingAxis._ZERO, separationInfo.axis);\n polyA.transform.matrix.multiply(pointsA[bestSideIndex], separationInfo.side.begin);\n polyA.transform.matrix.multiply(pointsA[bestSide2], separationInfo.side.end);\n polyB.transform.matrix.multiply(localPoint, separationInfo.point);\n separationInfo.sideId = bestSideIndex;\n localPoint.clone(separationInfo.localPoint);\n pointsA[bestSideIndex].clone(separationInfo.localSide.begin);\n pointsA[bestSide2].clone(separationInfo.localSide.end);\n return separationInfo;\n }\n static findCirclePolygonSeparation(circle, polygon) {\n const axes = polygon.axes;\n const pc = polygon.center;\n // Special SAT with circles\n const polyDir = pc.sub(circle.worldPos);\n const closestPointOnPoly = polygon.getFurthestPoint(polyDir.negate());\n axes.push(closestPointOnPoly.sub(circle.worldPos).normalize());\n let minOverlap = Number.MAX_VALUE;\n let minAxis = null;\n let minIndex = -1;\n for (let i = 0; i < axes.length; i++) {\n const proj1 = polygon.project(axes[i]);\n const proj2 = circle.project(axes[i]);\n const overlap = proj1.getOverlap(proj2);\n if (overlap <= 0) {\n return null;\n }\n else {\n if (overlap < minOverlap) {\n minOverlap = overlap;\n minAxis = axes[i];\n minIndex = i;\n }\n }\n }\n if (minIndex < 0) {\n return null;\n }\n return minAxis.normalize().scale(minOverlap);\n }\n static findPolygonPolygonSeparationDegenerate(polyA, polyB) {\n let bestSeparation = -Number.MAX_VALUE;\n let bestSide = null;\n let bestAxis = null;\n let bestSideIndex = -1;\n let bestOtherPoint = null;\n const sides = polyA.getSides();\n const localSides = polyA.getLocalSides();\n for (let i = 0; i < sides.length; i++) {\n const side = sides[i];\n const axis = side.normal();\n const vertB = polyB.getFurthestPoint(axis.negate());\n // Separation on side i's axis\n // We are looking for the largest separation between poly A's sides\n const vertSeparation = side.distanceToPoint(vertB, true);\n if (vertSeparation > bestSeparation) {\n bestSeparation = vertSeparation;\n bestSide = side;\n bestAxis = axis;\n bestSideIndex = i;\n bestOtherPoint = vertB;\n }\n }\n return {\n collider: polyA,\n separation: bestAxis ? bestSeparation : 99,\n axis: bestAxis,\n side: bestSide,\n localSide: localSides[bestSideIndex],\n sideId: bestSideIndex,\n point: bestOtherPoint,\n localPoint: bestAxis ? polyB.getFurthestLocalPoint(bestAxis.negate()) : null\n };\n }\n}\nSeparatingAxis.SeparationPool = new _Util_Pool__WEBPACK_IMPORTED_MODULE_2__.Pool(() => new SeparationInfo(), (i) => i, // no recycle\n500);\nSeparatingAxis._ZERO = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\nSeparatingAxis._SCRATCH_POINT = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\nSeparatingAxis._SCRATCH_SUB_POINT = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\nSeparatingAxis._SCRATCH_NORMAL = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\nSeparatingAxis._SCRATCH_MATRIX = _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_3__.AffineMatrix.identity();\nSeparatingAxis.SeparationPool.disableWarnings = true;\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/Shape.ts\":\n/*!**************************************!*\\\n !*** ./Collision/Colliders/Shape.ts ***!\n \\**************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Shape: () => (/* binding */ Shape)\n/* harmony export */ });\n/* harmony import */ var _PolygonCollider__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./PolygonCollider */ \"./Collision/Colliders/PolygonCollider.ts\");\n/* harmony import */ var _CircleCollider__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./CircleCollider */ \"./Collision/Colliders/CircleCollider.ts\");\n/* harmony import */ var _EdgeCollider__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./EdgeCollider */ \"./Collision/Colliders/EdgeCollider.ts\");\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _CompositeCollider__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../.. */ \"./Util/Log.ts\");\n\n\n\n\n\n\n\n/**\n * Excalibur helper for defining colliders quickly\n */\nclass Shape {\n /**\n * Creates a box collider, under the hood defines a {@apilink PolygonCollider} collider\n * @param width Width of the box\n * @param height Height of the box\n * @param anchor Anchor of the box (default (.5, .5)) which positions the box relative to the center of the collider's position\n * @param offset Optional offset relative to the collider in local coordinates\n */\n static Box(width, height, anchor = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Half, offset = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero) {\n return new _PolygonCollider__WEBPACK_IMPORTED_MODULE_1__.PolygonCollider({\n points: new _BoundingBox__WEBPACK_IMPORTED_MODULE_2__.BoundingBox(-width * anchor.x, -height * anchor.y, width - width * anchor.x, height - height * anchor.y).getPoints(),\n offset: offset\n });\n }\n /**\n * Creates a new {@apilink PolygonCollider | `arbitrary polygon`} collider\n *\n * PolygonColliders are useful for creating convex polygon shapes\n * @param points Points specified in counter clockwise\n * @param offset Optional offset relative to the collider in local coordinates\n */\n static Polygon(points, offset = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero, suppressConvexWarning = false) {\n return new _PolygonCollider__WEBPACK_IMPORTED_MODULE_1__.PolygonCollider({\n points: points,\n offset: offset,\n suppressConvexWarning\n });\n }\n /**\n * Creates a new {@apilink CircleCollider | `circle`} collider\n *\n * Circle colliders are useful for balls, or to make collisions more forgiving on sharp edges\n * @param radius Radius of the circle collider\n * @param offset Optional offset relative to the collider in local coordinates\n */\n static Circle(radius, offset = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero) {\n return new _CircleCollider__WEBPACK_IMPORTED_MODULE_3__.CircleCollider({\n radius: radius,\n offset: offset\n });\n }\n /**\n * Creates a new {@apilink EdgeCollider | `edge`} collider\n *\n * Edge colliders are useful for floors, walls, and other barriers\n * @param begin Beginning of the edge in local coordinates to the collider\n * @param end Ending of the edge in local coordinates to the collider\n */\n static Edge(begin, end) {\n return new _EdgeCollider__WEBPACK_IMPORTED_MODULE_4__.EdgeCollider({\n begin: begin,\n end: end\n });\n }\n /**\n * Creates a new capsule shaped {@apilink CompositeCollider} using 2 circles and a box\n *\n * Capsule colliders are useful for platformers with incline or jagged floors to have a smooth\n * player experience.\n * @param width\n * @param height\n * @param offset Optional offset\n */\n static Capsule(width, height, offset = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero) {\n const logger = ___WEBPACK_IMPORTED_MODULE_5__.Logger.getInstance();\n if (width === height) {\n logger.warn('A capsule collider with equal width and height is a circle, consider using a ex.Shape.Circle or ex.CircleCollider');\n }\n const vertical = height >= width;\n if (vertical) {\n // height > width, if equal maybe use a circle\n const capsule = new _CompositeCollider__WEBPACK_IMPORTED_MODULE_6__.CompositeCollider([\n Shape.Circle(width / 2, (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, -height / 2 + width / 2).add(offset)),\n Shape.Box(width, height - width, _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Half, offset),\n Shape.Circle(width / 2, (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, height / 2 - width / 2).add(offset))\n ]);\n return capsule;\n }\n else {\n // width > height, if equal maybe use a circle\n const capsule = new _CompositeCollider__WEBPACK_IMPORTED_MODULE_6__.CompositeCollider([\n Shape.Circle(height / 2, (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(-width / 2 + height / 2, 0).add(offset)),\n Shape.Box(width - height, height, _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Half, offset),\n Shape.Circle(height / 2, (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(width / 2 - height / 2, 0).add(offset))\n ]);\n return capsule;\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/CollisionSystem.ts\":\n/*!**************************************!*\\\n !*** ./Collision/CollisionSystem.ts ***!\n \\**************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CollisionSystem: () => (/* binding */ CollisionSystem)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Priority.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _SolverStrategy__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./SolverStrategy */ \"./Collision/SolverStrategy.ts\");\n/* harmony import */ var _Solver_ArcadeSolver__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Solver/ArcadeSolver */ \"./Collision/Solver/ArcadeSolver.ts\");\n/* harmony import */ var _Solver_RealisticSolver__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Solver/RealisticSolver */ \"./Collision/Solver/RealisticSolver.ts\");\n/* harmony import */ var _ColliderComponent__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./ColliderComponent */ \"./Collision/ColliderComponent.ts\");\n/* harmony import */ var _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Colliders/CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var _Collision_Side__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../Collision/Side */ \"./Collision/Side.ts\");\n/* harmony import */ var _Colliders_SeparatingAxis__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Colliders/SeparatingAxis */ \"./Collision/Colliders/SeparatingAxis.ts\");\n/* harmony import */ var _MotionSystem__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./MotionSystem */ \"./Collision/MotionSystem.ts\");\n/* harmony import */ var _Detection_Pair__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Detection/Pair */ \"./Collision/Detection/Pair.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass CollisionSystem extends _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.System {\n get _processor() {\n return this._physics.collisionProcessor;\n }\n constructor(world, _physics) {\n super();\n this._physics = _physics;\n this.systemType = _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.SystemType.Update;\n this._configDirty = false;\n this._lastFrameContacts = new Map();\n this._currentFrameContacts = new Map();\n this._arcadeSolver = new _Solver_ArcadeSolver__WEBPACK_IMPORTED_MODULE_1__.ArcadeSolver(_physics.config.arcade);\n this._realisticSolver = new _Solver_RealisticSolver__WEBPACK_IMPORTED_MODULE_2__.RealisticSolver(_physics.config.realistic);\n this._physics.$configUpdate.subscribe(() => (this._configDirty = true));\n this._trackCollider = (c) => this._processor.track(c);\n this._untrackCollider = (c) => this._processor.untrack(c);\n this.query = world.query([_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__.TransformComponent, _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_4__.MotionComponent, _ColliderComponent__WEBPACK_IMPORTED_MODULE_5__.ColliderComponent]);\n this.query.entityAdded$.subscribe((e) => {\n const colliderComponent = e.get(_ColliderComponent__WEBPACK_IMPORTED_MODULE_5__.ColliderComponent);\n colliderComponent.$colliderAdded.subscribe(this._trackCollider);\n colliderComponent.$colliderRemoved.subscribe(this._untrackCollider);\n const collider = colliderComponent.get();\n if (collider) {\n this._processor.track(collider);\n }\n });\n this.query.entityRemoved$.subscribe((e) => {\n const colliderComponent = e.get(_ColliderComponent__WEBPACK_IMPORTED_MODULE_5__.ColliderComponent);\n const collider = colliderComponent.get();\n if (colliderComponent && collider) {\n this._processor.untrack(collider);\n }\n });\n this._motionSystem = world.get(_MotionSystem__WEBPACK_IMPORTED_MODULE_6__.MotionSystem);\n }\n initialize(world, scene) {\n this._engine = scene.engine;\n }\n update(elapsed) {\n var _a, _b, _c, _d;\n if (!this._physics.config.enabled) {\n return;\n }\n // TODO do we need to do this every frame?\n // Collect up all the colliders and update them\n let colliders = [];\n for (let entityIndex = 0; entityIndex < this.query.entities.length; entityIndex++) {\n const entity = this.query.entities[entityIndex];\n const colliderComp = entity.get(_ColliderComponent__WEBPACK_IMPORTED_MODULE_5__.ColliderComponent);\n const collider = colliderComp === null || colliderComp === void 0 ? void 0 : colliderComp.get();\n if (colliderComp && ((_a = colliderComp.owner) === null || _a === void 0 ? void 0 : _a.isActive) && collider) {\n colliderComp.update();\n // Flatten composite colliders\n if (collider instanceof _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_7__.CompositeCollider) {\n const compositeColliders = collider.getColliders();\n if (!collider.compositeStrategy) {\n collider.compositeStrategy = this._physics.config.colliders.compositeStrategy;\n }\n colliders = colliders.concat(compositeColliders);\n }\n else {\n colliders.push(collider);\n }\n }\n }\n // Update the spatial partitioning data structures\n // TODO if collider invalid it will break the processor\n // TODO rename \"update\" to something more specific\n this._processor.update(colliders, elapsed);\n // Run broadphase on all colliders and locates potential collisions\n let pairs = this._processor.broadphase(colliders, elapsed);\n this._currentFrameContacts.clear();\n // Given possible pairs find actual contacts\n let contacts = []; // = this._processor.narrowphase(pairs, this._engine?.debug?.stats?.currFrame);\n const solver = this.getSolver();\n // Solve, this resolves the position/velocity so entities aren't overlapping\n const substep = this._physics.config.substep;\n for (let step = 0; step < substep; step++) {\n if (step > 0) {\n // first step is run by the MotionSystem when configured, so skip\n this._motionSystem.update(elapsed);\n }\n // Re-use pairs from previous collision\n if (contacts.length) {\n pairs = contacts.map((c) => new _Detection_Pair__WEBPACK_IMPORTED_MODULE_8__.Pair(c.colliderA, c.colliderB));\n }\n if (pairs.length) {\n contacts = this._processor.narrowphase(pairs, (_d = (_c = (_b = this._engine) === null || _b === void 0 ? void 0 : _b.debug) === null || _c === void 0 ? void 0 : _c.stats) === null || _d === void 0 ? void 0 : _d.currFrame);\n contacts = solver.solve(contacts);\n // Record contacts for start/end\n for (const contact of contacts) {\n if (contact.isCanceled()) {\n continue;\n }\n // Process composite ids, things with the same composite id are treated as the same collider for start/end\n const index = contact.id.indexOf('|');\n if (index > 0) {\n const compositeId = contact.id.substring(index + 1);\n this._currentFrameContacts.set(compositeId, contact);\n }\n else {\n this._currentFrameContacts.set(contact.id, contact);\n }\n }\n }\n }\n // Emit contact start/end events\n this.runContactStartEnd();\n // reset the last frame cache\n this._lastFrameContacts.clear();\n // Keep track of collisions contacts that have started or ended\n this._lastFrameContacts = new Map(this._currentFrameContacts);\n // Process deferred collider removals\n for (const entity of this.query.entities) {\n const collider = entity.get(_ColliderComponent__WEBPACK_IMPORTED_MODULE_5__.ColliderComponent);\n if (collider) {\n collider.processColliderRemoval();\n }\n }\n }\n postupdate() {\n _Colliders_SeparatingAxis__WEBPACK_IMPORTED_MODULE_9__.SeparatingAxis.SeparationPool.done();\n }\n getSolver() {\n if (this._configDirty) {\n this._configDirty = false;\n this._arcadeSolver = new _Solver_ArcadeSolver__WEBPACK_IMPORTED_MODULE_1__.ArcadeSolver(this._physics.config.arcade);\n this._realisticSolver = new _Solver_RealisticSolver__WEBPACK_IMPORTED_MODULE_2__.RealisticSolver(this._physics.config.realistic);\n }\n return this._physics.config.solver === _SolverStrategy__WEBPACK_IMPORTED_MODULE_10__.SolverStrategy.Realistic ? this._realisticSolver : this._arcadeSolver;\n }\n debug(ex) {\n this._processor.debug(ex, 0);\n }\n runContactStartEnd() {\n // If composite colliders are 'together' collisions may have a duplicate id because we want to treat those as a singular start/end\n for (const [id, c] of this._currentFrameContacts) {\n // find all new contacts\n if (!this._lastFrameContacts.has(id)) {\n const colliderA = c.colliderA;\n const colliderB = c.colliderB;\n const side = _Collision_Side__WEBPACK_IMPORTED_MODULE_11__.Side.fromDirection(c.mtv);\n const opposite = _Collision_Side__WEBPACK_IMPORTED_MODULE_11__.Side.getOpposite(side);\n colliderA.events.emit('collisionstart', new _Events__WEBPACK_IMPORTED_MODULE_12__.CollisionStartEvent(colliderA, colliderB, side, c));\n colliderA.events.emit('contactstart', new _Events__WEBPACK_IMPORTED_MODULE_12__.ContactStartEvent(colliderA, colliderB, side, c));\n colliderB.events.emit('collisionstart', new _Events__WEBPACK_IMPORTED_MODULE_12__.CollisionStartEvent(colliderB, colliderA, opposite, c));\n colliderB.events.emit('contactstart', new _Events__WEBPACK_IMPORTED_MODULE_12__.ContactStartEvent(colliderB, colliderA, opposite, c));\n }\n }\n // find all contacts that have ceased\n for (const [id, c] of this._lastFrameContacts) {\n if (!this._currentFrameContacts.has(id)) {\n const colliderA = c.colliderA;\n const colliderB = c.colliderB;\n const side = _Collision_Side__WEBPACK_IMPORTED_MODULE_11__.Side.fromDirection(c.mtv);\n const opposite = _Collision_Side__WEBPACK_IMPORTED_MODULE_11__.Side.getOpposite(side);\n colliderA.events.emit('collisionend', new _Events__WEBPACK_IMPORTED_MODULE_12__.CollisionEndEvent(colliderA, colliderB, side, c));\n colliderA.events.emit('contactend', new _Events__WEBPACK_IMPORTED_MODULE_12__.ContactEndEvent(colliderA, colliderB, side, c));\n colliderB.events.emit('collisionend', new _Events__WEBPACK_IMPORTED_MODULE_12__.CollisionEndEvent(colliderB, colliderA, opposite, c));\n colliderB.events.emit('contactend', new _Events__WEBPACK_IMPORTED_MODULE_12__.ContactEndEvent(colliderB, colliderA, opposite, c));\n }\n }\n }\n}\nCollisionSystem.priority = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_13__.SystemPriority.Higher;\n\n\n/***/ }),\n\n/***/ \"./Collision/CollisionType.ts\":\n/*!************************************!*\\\n !*** ./Collision/CollisionType.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CollisionType: () => (/* binding */ CollisionType)\n/* harmony export */ });\n/**\n * An enum that describes the types of collisions bodies can participate in\n */\nvar CollisionType;\n(function (CollisionType) {\n /**\n * Bodies with the `PreventCollision` setting do not participate in any\n * collisions and do not raise collision events.\n */\n CollisionType[\"PreventCollision\"] = \"PreventCollision\";\n /**\n * Bodies with the `Passive` setting only raise collision events, but are not\n * influenced or moved by other bodies and do not influence or move other bodies.\n * This is useful for use in trigger type behavior.\n */\n CollisionType[\"Passive\"] = \"Passive\";\n /**\n * Bodies with the `Active` setting raise collision events and participate\n * in collisions with other bodies and will be push or moved by bodies sharing\n * the `Active` or `Fixed` setting.\n */\n CollisionType[\"Active\"] = \"Active\";\n /**\n * Bodies with the `Fixed` setting raise collision events and participate in\n * collisions with other bodies. Actors with the `Fixed` setting will not be\n * pushed or moved by other bodies sharing the `Fixed`. Think of Fixed\n * bodies as \"immovable/unstoppable\" objects. If two `Fixed` bodies meet they will\n * not be pushed or moved by each other, they will not interact except to throw\n * collision events.\n */\n CollisionType[\"Fixed\"] = \"Fixed\";\n})(CollisionType || (CollisionType = {}));\n\n\n/***/ }),\n\n/***/ \"./Collision/Detection/CollisionContact.ts\":\n/*!*************************************************!*\\\n !*** ./Collision/Detection/CollisionContact.ts ***!\n \\*************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CollisionContact: () => (/* binding */ CollisionContact)\n/* harmony export */ });\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Pair__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Pair */ \"./Collision/Detection/Pair.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../BodyComponent */ \"./Collision/BodyComponent.ts\");\n\n\n\n/**\n * Collision contacts are used internally by Excalibur to resolve collision between colliders. This\n * Pair prevents collisions from being evaluated more than one time\n */\nclass CollisionContact {\n constructor(colliderA, colliderB, mtv, normal, tangent, points, localPoints, info) {\n var _a, _b, _c, _d, _e, _f;\n this._canceled = false;\n this.bodyA = null;\n this.bodyB = null;\n this.colliderA = colliderA;\n this.colliderB = colliderB;\n this.mtv = mtv;\n this.normal = normal;\n this.tangent = tangent;\n this.points = points;\n this.localPoints = localPoints;\n this.info = info;\n this.id = _Pair__WEBPACK_IMPORTED_MODULE_0__.Pair.calculatePairHash(colliderA.id, colliderB.id);\n if (colliderA.composite || colliderB.composite) {\n // Add on the parent composite pair for start/end contact if 'together\n const colliderAId = ((_a = colliderA.composite) === null || _a === void 0 ? void 0 : _a.compositeStrategy) === 'separate' ? colliderA.id : (_c = (_b = colliderA.composite) === null || _b === void 0 ? void 0 : _b.id) !== null && _c !== void 0 ? _c : colliderA.id;\n const colliderBId = ((_d = colliderB.composite) === null || _d === void 0 ? void 0 : _d.compositeStrategy) === 'separate' ? colliderB.id : (_f = (_e = colliderB.composite) === null || _e === void 0 ? void 0 : _e.id) !== null && _f !== void 0 ? _f : colliderB.id;\n this.id += '|' + _Pair__WEBPACK_IMPORTED_MODULE_0__.Pair.calculatePairHash(colliderAId, colliderBId);\n }\n if (this.colliderA.owner) {\n this.bodyA = this.colliderA.owner.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_1__.BodyComponent);\n }\n if (this.colliderB.owner) {\n this.bodyB = this.colliderB.owner.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_1__.BodyComponent);\n }\n }\n /**\n * Match contact awake state, except if body's are Fixed\n */\n matchAwake() {\n const bodyA = this.bodyA;\n const bodyB = this.bodyB;\n if (bodyA && bodyB) {\n if (bodyA.isSleeping !== bodyB.isSleeping) {\n if (bodyA.isSleeping && bodyA.collisionType !== _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.Fixed && bodyB.sleepMotion >= bodyA.wakeThreshold) {\n bodyA.isSleeping = false;\n }\n if (bodyB.isSleeping && bodyB.collisionType !== _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.Fixed && bodyA.sleepMotion >= bodyB.wakeThreshold) {\n bodyB.isSleeping = false;\n }\n }\n }\n }\n isCanceled() {\n return this._canceled;\n }\n cancel() {\n this._canceled = true;\n }\n /**\n * Biases the contact so that the given collider is colliderA\n */\n bias(collider) {\n if (collider !== this.colliderA && collider !== this.colliderB) {\n throw new Error('Collider must be either colliderA or colliderB from this contact');\n }\n if (collider === this.colliderA) {\n return this;\n }\n const colliderA = this.colliderA;\n const colliderB = this.colliderB;\n this.colliderB = colliderA;\n this.colliderA = colliderB;\n this.mtv = this.mtv.negate();\n this.normal = this.normal.negate();\n this.tangent = this.tangent.negate();\n return this;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Detection/DynamicTree.ts\":\n/*!********************************************!*\\\n !*** ./Collision/Detection/DynamicTree.ts ***!\n \\********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DynamicTree: () => (/* binding */ DynamicTree),\n/* harmony export */ TreeNode: () => (/* binding */ TreeNode)\n/* harmony export */ });\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../.. */ \"./Color.ts\");\n\n\n\n\n/**\n * Dynamic Tree Node used for tracking bounds within the tree\n */\nclass TreeNode {\n constructor(parent) {\n this.parent = parent;\n this.parent = parent || null;\n this.data = null;\n this.bounds = new _BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox();\n this.left = null;\n this.right = null;\n this.height = 0;\n }\n isLeaf() {\n return !this.left && !this.right;\n }\n}\n/**\n * The DynamicTrees provides a spatial partitioning data structure for quickly querying for overlapping bounding boxes for\n * all tracked bodies. The worst case performance of this is O(n*log(n)) where n is the number of bodies in the tree.\n *\n * Internally the bounding boxes are organized as a balanced binary tree of bounding boxes, where the leaf nodes are tracked bodies.\n * Every non-leaf node is a bounding box that contains child bounding boxes.\n */\nclass DynamicTree {\n constructor(_config, worldBounds = new _BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox(-Number.MAX_VALUE, -Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE)) {\n this._config = _config;\n this.worldBounds = worldBounds;\n this.root = null;\n this.nodes = {};\n }\n /**\n * Inserts a node into the dynamic tree\n */\n _insert(leaf) {\n // If there are no nodes in the tree, make this the root leaf\n if (this.root === null) {\n this.root = leaf;\n this.root.parent = null;\n return;\n }\n // Search the tree for a node that is not a leaf and find the best place to insert\n const leafAABB = leaf.bounds;\n let currentRoot = this.root;\n while (!currentRoot.isLeaf()) {\n const left = currentRoot.left;\n const right = currentRoot.right;\n const area = currentRoot.bounds.getPerimeter();\n const combinedAABB = currentRoot.bounds.combine(leafAABB);\n const combinedArea = combinedAABB.getPerimeter();\n // Calculate cost heuristic for creating a new parent and leaf\n const cost = 2 * combinedArea;\n // Minimum cost of pushing the leaf down the tree\n const inheritanceCost = 2 * (combinedArea - area);\n // Cost of descending\n let leftCost = 0;\n const leftCombined = leafAABB.combine(left.bounds);\n let newArea;\n let oldArea;\n if (left.isLeaf()) {\n leftCost = leftCombined.getPerimeter() + inheritanceCost;\n }\n else {\n oldArea = left.bounds.getPerimeter();\n newArea = leftCombined.getPerimeter();\n leftCost = newArea - oldArea + inheritanceCost;\n }\n let rightCost = 0;\n const rightCombined = leafAABB.combine(right.bounds);\n if (right.isLeaf()) {\n rightCost = rightCombined.getPerimeter() + inheritanceCost;\n }\n else {\n oldArea = right.bounds.getPerimeter();\n newArea = rightCombined.getPerimeter();\n rightCost = newArea - oldArea + inheritanceCost;\n }\n // cost is acceptable\n if (cost < leftCost && cost < rightCost) {\n break;\n }\n // Descend to the depths\n if (leftCost < rightCost) {\n currentRoot = left;\n }\n else {\n currentRoot = right;\n }\n }\n // Create the new parent node and insert into the tree\n const oldParent = currentRoot.parent;\n const newParent = new TreeNode(oldParent);\n newParent.bounds = leafAABB.combine(currentRoot.bounds);\n newParent.height = currentRoot.height + 1;\n if (oldParent !== null) {\n // The sibling node was not the root\n if (oldParent.left === currentRoot) {\n oldParent.left = newParent;\n }\n else {\n oldParent.right = newParent;\n }\n newParent.left = currentRoot;\n newParent.right = leaf;\n currentRoot.parent = newParent;\n leaf.parent = newParent;\n }\n else {\n // The sibling node was the root\n newParent.left = currentRoot;\n newParent.right = leaf;\n currentRoot.parent = newParent;\n leaf.parent = newParent;\n this.root = newParent;\n }\n // Walk up the tree fixing heights and AABBs\n let currentNode = leaf.parent;\n while (currentNode) {\n currentNode = this._balance(currentNode);\n if (!currentNode.left) {\n throw new Error('Parent of current leaf cannot have a null left child' + currentNode);\n }\n if (!currentNode.right) {\n throw new Error('Parent of current leaf cannot have a null right child' + currentNode);\n }\n currentNode.height = 1 + Math.max(currentNode.left.height, currentNode.right.height);\n currentNode.bounds = currentNode.left.bounds.combine(currentNode.right.bounds);\n currentNode = currentNode.parent;\n }\n }\n /**\n * Removes a node from the dynamic tree\n */\n _remove(leaf) {\n if (leaf === this.root) {\n this.root = null;\n return;\n }\n const parent = leaf.parent;\n const grandParent = parent.parent;\n let sibling;\n if (parent.left === leaf) {\n sibling = parent.right;\n }\n else {\n sibling = parent.left;\n }\n if (grandParent) {\n if (grandParent.left === parent) {\n grandParent.left = sibling;\n }\n else {\n grandParent.right = sibling;\n }\n sibling.parent = grandParent;\n let currentNode = grandParent;\n while (currentNode) {\n currentNode = this._balance(currentNode);\n currentNode.bounds = currentNode.left.bounds.combine(currentNode.right.bounds);\n currentNode.height = 1 + Math.max(currentNode.left.height, currentNode.right.height);\n currentNode = currentNode.parent;\n }\n }\n else {\n this.root = sibling;\n sibling.parent = null;\n }\n }\n /**\n * Tracks a body in the dynamic tree\n */\n trackCollider(collider) {\n const node = new TreeNode();\n node.data = collider;\n node.bounds = collider.bounds;\n node.bounds.left -= 2;\n node.bounds.top -= 2;\n node.bounds.right += 2;\n node.bounds.bottom += 2;\n this.nodes[collider.id.value] = node;\n this._insert(node);\n }\n /**\n * Updates the dynamic tree given the current bounds of each body being tracked\n */\n updateCollider(collider) {\n var _a;\n const node = this.nodes[collider.id.value];\n if (!node) {\n return false;\n }\n const b = collider.bounds;\n // if the body is outside the world no longer update it\n if (!this.worldBounds.contains(b)) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance().warn('Collider with id ' + collider.id.value + ' is outside the world bounds and will no longer be tracked for physics');\n this.untrackCollider(collider);\n return false;\n }\n if (node.bounds.contains(b)) {\n return false;\n }\n this._remove(node);\n b.left -= this._config.boundsPadding;\n b.top -= this._config.boundsPadding;\n b.right += this._config.boundsPadding;\n b.bottom += this._config.boundsPadding;\n // THIS IS CAUSING UNNECESSARY CHECKS\n if (collider.owner) {\n const body = (_a = collider.owner) === null || _a === void 0 ? void 0 : _a.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_2__.BodyComponent);\n if (body) {\n const multdx = ((body.vel.x * 32) / 1000) * this._config.velocityMultiplier;\n const multdy = ((body.vel.y * 32) / 1000) * this._config.velocityMultiplier;\n if (multdx < 0) {\n b.left += multdx;\n }\n else {\n b.right += multdx;\n }\n if (multdy < 0) {\n b.top += multdy;\n }\n else {\n b.bottom += multdy;\n }\n }\n }\n node.bounds = b;\n this._insert(node);\n return true;\n }\n /**\n * Untracks a body from the dynamic tree\n */\n untrackCollider(collider) {\n const node = this.nodes[collider.id.value];\n if (!node) {\n return;\n }\n this._remove(node);\n this.nodes[collider.id.value] = null;\n delete this.nodes[collider.id.value];\n }\n /**\n * Balances the tree about a node\n */\n _balance(node) {\n if (node === null) {\n throw new Error('Cannot balance at null node');\n }\n if (node.isLeaf() || node.height < 2) {\n return node;\n }\n const left = node.left;\n const right = node.right;\n const a = node;\n const b = left;\n const c = right;\n const d = left.left;\n const e = left.right;\n const f = right.left;\n const g = right.right;\n const balance = c.height - b.height;\n // Rotate c node up\n if (balance > 1) {\n // Swap the right node with it's parent\n c.left = a;\n c.parent = a.parent;\n a.parent = c;\n // The original node's old parent should point to the right node\n // this is mega confusing\n if (c.parent) {\n if (c.parent.left === a) {\n c.parent.left = c;\n }\n else {\n c.parent.right = c;\n }\n }\n else {\n this.root = c;\n }\n // Rotate\n if (f.height > g.height) {\n c.right = f;\n a.right = g;\n g.parent = a;\n a.bounds = b.bounds.combine(g.bounds);\n c.bounds = a.bounds.combine(f.bounds);\n a.height = 1 + Math.max(b.height, g.height);\n c.height = 1 + Math.max(a.height, f.height);\n }\n else {\n c.right = g;\n a.right = f;\n f.parent = a;\n a.bounds = b.bounds.combine(f.bounds);\n c.bounds = a.bounds.combine(g.bounds);\n a.height = 1 + Math.max(b.height, f.height);\n c.height = 1 + Math.max(a.height, g.height);\n }\n return c;\n }\n // Rotate left node up\n if (balance < -1) {\n // swap\n b.left = a;\n b.parent = a.parent;\n a.parent = b;\n // node's old parent should point to b\n if (b.parent) {\n if (b.parent.left === a) {\n b.parent.left = b;\n }\n else {\n if (b.parent.right !== a) {\n throw 'Error rotating Dynamic Tree';\n }\n b.parent.right = b;\n }\n }\n else {\n this.root = b;\n }\n // rotate\n if (d.height > e.height) {\n b.right = d;\n a.left = e;\n e.parent = a;\n a.bounds = c.bounds.combine(e.bounds);\n b.bounds = a.bounds.combine(d.bounds);\n a.height = 1 + Math.max(c.height, e.height);\n b.height = 1 + Math.max(a.height, d.height);\n }\n else {\n b.right = e;\n a.left = d;\n d.parent = a;\n a.bounds = c.bounds.combine(d.bounds);\n b.bounds = a.bounds.combine(e.bounds);\n a.height = 1 + Math.max(c.height, d.height);\n b.height = 1 + Math.max(a.height, e.height);\n }\n return b;\n }\n return node;\n }\n /**\n * Returns the internal height of the tree, shorter trees are better. Performance drops as the tree grows\n */\n getHeight() {\n if (this.root === null) {\n return 0;\n }\n return this.root.height;\n }\n /**\n * Queries the Dynamic Axis Aligned Tree for bodies that could be colliding with the provided body.\n *\n * In the query callback, it will be passed a potential collider. Returning true from this callback indicates\n * that you are complete with your query and you do not want to continue. Returning false will continue searching\n * the tree until all possible colliders have been returned.\n */\n query(collider, callback) {\n const bounds = collider.bounds;\n const helper = (currentNode) => {\n if (currentNode && currentNode.bounds.overlaps(bounds)) {\n if (currentNode.isLeaf() && currentNode.data !== collider) {\n if (callback.call(collider, currentNode.data)) {\n return true;\n }\n }\n else {\n return helper(currentNode.left) || helper(currentNode.right);\n }\n }\n return false;\n };\n helper(this.root);\n }\n /**\n * Queries the Dynamic Axis Aligned Tree for bodies that could be intersecting. By default the raycast query uses an infinitely\n * long ray to test the tree specified by `max`.\n *\n * In the query callback, it will be passed a potential body that intersects with the raycast. Returning true from this\n * callback indicates that your are complete with your query and do not want to continue. Return false will continue searching\n * the tree until all possible bodies that would intersect with the ray have been returned.\n */\n rayCastQuery(ray, max = Infinity, callback) {\n const helper = (currentNode) => {\n if (currentNode && currentNode.bounds.rayCast(ray, max)) {\n if (currentNode.isLeaf()) {\n if (callback.call(ray, currentNode.data)) {\n // ray hit a leaf! return the body\n return true;\n }\n }\n else {\n // ray hit but not at a leaf, recurse deeper\n return helper(currentNode.left) || helper(currentNode.right);\n }\n }\n return false; // ray missed\n };\n helper(this.root);\n }\n getNodes() {\n const helper = (currentNode) => {\n if (currentNode) {\n return [currentNode].concat(helper(currentNode.left), helper(currentNode.right));\n }\n else {\n return [];\n }\n };\n return helper(this.root);\n }\n debug(ex) {\n // draw all the nodes in the Dynamic Tree\n const helper = (currentNode) => {\n if (currentNode) {\n if (currentNode.isLeaf()) {\n currentNode.bounds.draw(ex, ___WEBPACK_IMPORTED_MODULE_3__.Color.Green);\n }\n else {\n currentNode.bounds.draw(ex, ___WEBPACK_IMPORTED_MODULE_3__.Color.White);\n }\n if (currentNode.left) {\n helper(currentNode.left);\n }\n if (currentNode.right) {\n helper(currentNode.right);\n }\n }\n };\n helper(this.root);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Detection/DynamicTreeCollisionProcessor.ts\":\n/*!**************************************************************!*\\\n !*** ./Collision/Detection/DynamicTreeCollisionProcessor.ts ***!\n \\**************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DynamicTreeCollisionProcessor: () => (/* binding */ DynamicTreeCollisionProcessor)\n/* harmony export */ });\n/* harmony import */ var _DynamicTree__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./DynamicTree */ \"./Collision/Detection/DynamicTree.ts\");\n/* harmony import */ var _Pair__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Pair */ \"./Collision/Detection/Pair.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math_ray__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../Math/ray */ \"./Math/ray.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Colliders/CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Group/CollisionGroup */ \"./Collision/Group/CollisionGroup.ts\");\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Id__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Id */ \"./Id.ts\");\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Responsible for performing the collision broadphase (locating potential collisions) and\n * the narrowphase (actual collision contacts)\n */\nclass DynamicTreeCollisionProcessor {\n constructor(_config) {\n this._config = _config;\n this._pairs = new Set();\n this._collisionPairCache = [];\n this._colliders = [];\n this._dynamicCollisionTree = new _DynamicTree__WEBPACK_IMPORTED_MODULE_0__.DynamicTree(_config.dynamicTree);\n }\n getColliders() {\n return this._colliders;\n }\n query(pointOrBounds) {\n const results = [];\n if (pointOrBounds instanceof _BoundingBox__WEBPACK_IMPORTED_MODULE_1__.BoundingBox) {\n this._dynamicCollisionTree.query({\n id: (0,_Id__WEBPACK_IMPORTED_MODULE_2__.createId)('collider', -1),\n owner: null,\n bounds: pointOrBounds\n }, (other) => {\n results.push(other);\n return false;\n });\n }\n else {\n this._dynamicCollisionTree.query({\n id: (0,_Id__WEBPACK_IMPORTED_MODULE_2__.createId)('collider', -1),\n owner: null,\n bounds: new _BoundingBox__WEBPACK_IMPORTED_MODULE_1__.BoundingBox(pointOrBounds.x, pointOrBounds.y, pointOrBounds.x, pointOrBounds.y)\n }, (other) => {\n results.push(other);\n return false;\n });\n }\n return results;\n }\n rayCast(ray, options) {\n var _a, _b, _c;\n const results = [];\n const maxDistance = (_a = options === null || options === void 0 ? void 0 : options.maxDistance) !== null && _a !== void 0 ? _a : Infinity;\n const collisionGroup = options === null || options === void 0 ? void 0 : options.collisionGroup;\n const collisionMask = !collisionGroup ? (_b = options === null || options === void 0 ? void 0 : options.collisionMask) !== null && _b !== void 0 ? _b : _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_3__.CollisionGroup.All.category : collisionGroup.category;\n const searchAllColliders = (_c = options === null || options === void 0 ? void 0 : options.searchAllColliders) !== null && _c !== void 0 ? _c : false;\n this._dynamicCollisionTree.rayCastQuery(ray, maxDistance, (collider) => {\n const owner = collider.owner;\n const maybeBody = owner.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_4__.BodyComponent);\n if ((options === null || options === void 0 ? void 0 : options.ignoreCollisionGroupAll) && maybeBody.group === _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_3__.CollisionGroup.All) {\n return false;\n }\n const canCollide = (collisionMask & maybeBody.group.category) !== 0;\n // Early exit if not the right group\n if ((maybeBody === null || maybeBody === void 0 ? void 0 : maybeBody.group) && !canCollide) {\n return false;\n }\n const hit = collider.rayCast(ray, maxDistance);\n if (hit) {\n if (options === null || options === void 0 ? void 0 : options.filter) {\n if (options.filter(hit)) {\n results.push(hit);\n if (!searchAllColliders) {\n // returning true exits the search\n return true;\n }\n }\n }\n else {\n results.push(hit);\n if (!searchAllColliders) {\n // returning true exits the search\n return true;\n }\n }\n }\n return false;\n });\n return results;\n }\n /**\n * Tracks a physics body for collisions\n */\n track(target) {\n if (!target) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_5__.Logger.getInstance().warn('Cannot track null collider');\n return;\n }\n if (target instanceof _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_6__.CompositeCollider) {\n const colliders = target.getColliders();\n for (const c of colliders) {\n c.owner = target.owner;\n this._colliders.push(c);\n this._dynamicCollisionTree.trackCollider(c);\n }\n }\n else {\n this._colliders.push(target);\n this._dynamicCollisionTree.trackCollider(target);\n }\n }\n /**\n * Untracks a physics body\n */\n untrack(target) {\n if (!target) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_5__.Logger.getInstance().warn('Cannot untrack a null collider');\n return;\n }\n if (target instanceof _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_6__.CompositeCollider) {\n const colliders = target.getColliders();\n for (const c of colliders) {\n const index = this._colliders.indexOf(c);\n if (index !== -1) {\n this._colliders.splice(index, 1);\n }\n this._dynamicCollisionTree.untrackCollider(c);\n }\n }\n else {\n const index = this._colliders.indexOf(target);\n if (index !== -1) {\n this._colliders.splice(index, 1);\n }\n this._dynamicCollisionTree.untrackCollider(target);\n }\n }\n _pairExists(colliderA, colliderB) {\n // if the collision pair has been calculated already short circuit\n const hash = _Pair__WEBPACK_IMPORTED_MODULE_7__.Pair.calculatePairHash(colliderA.id, colliderB.id);\n return this._pairs.has(hash);\n }\n /**\n * Detects potential collision pairs in a broadphase approach with the dynamic AABB tree strategy\n */\n broadphase(targets, elapsed, stats) {\n const seconds = elapsed / 1000;\n // Retrieve the list of potential colliders, exclude killed, prevented, and self\n const potentialColliders = targets.filter((other) => {\n var _a, _b;\n const body = (_a = other.owner) === null || _a === void 0 ? void 0 : _a.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_4__.BodyComponent);\n return ((_b = other.owner) === null || _b === void 0 ? void 0 : _b.isActive) && body.collisionType !== _CollisionType__WEBPACK_IMPORTED_MODULE_8__.CollisionType.PreventCollision;\n });\n // clear old list of collision pairs\n this._collisionPairCache = [];\n this._pairs.clear();\n // check for normal collision pairs\n let collider;\n for (let j = 0, l = potentialColliders.length; j < l; j++) {\n collider = potentialColliders[j];\n // Query the collision tree for potential colliders\n this._dynamicCollisionTree.query(collider, (other) => {\n if (!this._pairExists(collider, other) && _Pair__WEBPACK_IMPORTED_MODULE_7__.Pair.canCollide(collider, other)) {\n const pair = new _Pair__WEBPACK_IMPORTED_MODULE_7__.Pair(collider, other);\n this._pairs.add(pair.id);\n this._collisionPairCache.push(pair);\n }\n // Always return false, to query whole tree. Returning true in the query method stops searching\n return false;\n });\n }\n if (stats) {\n stats.physics.pairs = this._collisionPairCache.length;\n }\n // Check dynamic tree for fast moving objects\n // Fast moving objects are those moving at least there smallest bound per frame\n if (this._config.continuous.checkForFastBodies) {\n for (const collider of potentialColliders) {\n const body = collider.owner.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_4__.BodyComponent);\n // Skip non-active objects. Does not make sense on other collision types\n if (body.collisionType !== _CollisionType__WEBPACK_IMPORTED_MODULE_8__.CollisionType.Active) {\n continue;\n }\n // Maximum travel distance next frame\n const updateDistance = body.vel.magnitude * seconds + // velocity term\n body.acc.magnitude * 0.5 * seconds * seconds; // acc term\n // Find the minimum dimension\n const minDimension = Math.min(collider.bounds.height, collider.bounds.width);\n if (this._config.continuous.disableMinimumSpeedForFastBody || updateDistance > minDimension / 2) {\n if (stats) {\n stats.physics.fastBodies++;\n }\n // start with the oldPos because the integration for actors has already happened\n // objects resting on a surface may be slightly penetrating in the current position\n const updateVec = body.globalPos.sub(body.oldPos);\n const centerPoint = collider.center;\n const furthestPoint = collider.getFurthestPoint(body.vel);\n const origin = furthestPoint.sub(updateVec);\n const ray = new _Math_ray__WEBPACK_IMPORTED_MODULE_9__.Ray(origin, body.vel);\n // back the ray up by -2x surfaceEpsilon to account for fast moving objects starting on the surface\n ray.pos = ray.pos.add(ray.dir.scale(-2 * this._config.continuous.surfaceEpsilon));\n let minCollider;\n let minTranslate = new _Math_vector__WEBPACK_IMPORTED_MODULE_10__.Vector(Infinity, Infinity);\n this._dynamicCollisionTree.rayCastQuery(ray, updateDistance + this._config.continuous.surfaceEpsilon * 2, (other) => {\n if (!this._pairExists(collider, other) && _Pair__WEBPACK_IMPORTED_MODULE_7__.Pair.canCollide(collider, other)) {\n const hit = other.rayCast(ray, updateDistance + this._config.continuous.surfaceEpsilon * 10);\n if (hit) {\n const translate = hit.point.sub(origin);\n if (translate.magnitude < minTranslate.magnitude) {\n minTranslate = translate;\n minCollider = other;\n }\n }\n }\n return false;\n });\n if (minCollider && _Math_vector__WEBPACK_IMPORTED_MODULE_10__.Vector.isValid(minTranslate)) {\n const pair = new _Pair__WEBPACK_IMPORTED_MODULE_7__.Pair(collider, minCollider);\n if (!this._pairs.has(pair.id)) {\n this._pairs.add(pair.id);\n this._collisionPairCache.push(pair);\n }\n // move the fast moving object to the other body\n // need to push into the surface by ex.Physics.surfaceEpsilon\n const shift = centerPoint.sub(furthestPoint);\n body.globalPos = origin\n .add(shift)\n .add(minTranslate)\n .add(ray.dir.scale(10 * this._config.continuous.surfaceEpsilon)); // needed to push the shape slightly into contact\n collider.update(body.transform.get());\n if (stats) {\n stats.physics.fastBodyCollisions++;\n }\n }\n }\n }\n }\n // return cache\n return this._collisionPairCache;\n }\n /**\n * Applies narrow phase on collision pairs to find actual area intersections\n * Adds actual colliding pairs to stats' Frame data\n */\n narrowphase(pairs, stats) {\n let contacts = [];\n for (let i = 0; i < pairs.length; i++) {\n const newContacts = pairs[i].collide();\n contacts = contacts.concat(newContacts);\n if (stats && newContacts.length > 0) {\n for (const c of newContacts) {\n stats.physics.contacts.set(c.id, c);\n }\n }\n }\n if (stats) {\n stats.physics.collisions += contacts.length;\n }\n return contacts;\n }\n /**\n * Update the dynamic tree positions\n */\n update(targets) {\n let updated = 0;\n const len = targets.length;\n for (let i = 0; i < len; i++) {\n if (this._dynamicCollisionTree.updateCollider(targets[i])) {\n updated++;\n }\n }\n return updated;\n }\n debug(ex) {\n this._dynamicCollisionTree.debug(ex);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Detection/Pair.ts\":\n/*!*************************************!*\\\n !*** ./Collision/Detection/Pair.ts ***!\n \\*************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Pair: () => (/* binding */ Pair)\n/* harmony export */ });\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../BodyComponent */ \"./Collision/BodyComponent.ts\");\n\n\n/**\n * Models a potential collision between 2 colliders\n */\nclass Pair {\n constructor(colliderA, colliderB) {\n this.colliderA = colliderA;\n this.colliderB = colliderB;\n this.id = null;\n this.id = Pair.calculatePairHash(colliderA.id, colliderB.id);\n }\n /**\n * Returns whether a it is allowed for 2 colliders in a Pair to collide\n * @param colliderA\n * @param colliderB\n */\n static canCollide(colliderA, colliderB) {\n var _a, _b;\n // Prevent self collision\n if (colliderA.id === colliderB.id) {\n return false;\n }\n // Colliders with the same owner do not collide (composite colliders)\n if (colliderA.owner && colliderB.owner && colliderA.owner.id === colliderB.owner.id) {\n return false;\n }\n // if the pair has a member with zero dimension don't collide\n if (colliderA.localBounds.hasZeroDimensions() || colliderB.localBounds.hasZeroDimensions()) {\n return false;\n }\n const bodyA = (_a = colliderA === null || colliderA === void 0 ? void 0 : colliderA.owner) === null || _a === void 0 ? void 0 : _a.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_0__.BodyComponent);\n const bodyB = (_b = colliderB === null || colliderB === void 0 ? void 0 : colliderB.owner) === null || _b === void 0 ? void 0 : _b.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_0__.BodyComponent);\n // Body's needed for collision in the current state\n // TODO can we collide without a body?\n if (!bodyA || !bodyB) {\n return false;\n }\n // If both are in the same collision group short circuit\n if (!bodyA.group.canCollide(bodyB.group)) {\n return false;\n }\n // if both are fixed short circuit\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_1__.CollisionType.Fixed && bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_1__.CollisionType.Fixed) {\n return false;\n }\n // if the either is prevent collision short circuit\n if (bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_1__.CollisionType.PreventCollision || bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_1__.CollisionType.PreventCollision) {\n return false;\n }\n // if either is dead short circuit\n if (!bodyA.isActive || !bodyB.isActive) {\n return false;\n }\n return true;\n }\n /**\n * Returns whether or not it is possible for the pairs to collide\n */\n get canCollide() {\n const colliderA = this.colliderA;\n const colliderB = this.colliderB;\n return Pair.canCollide(colliderA, colliderB);\n }\n /**\n * Runs the collision intersection logic on the members of this pair\n */\n collide() {\n return this.colliderA.collide(this.colliderB);\n }\n /**\n * Check if the collider is part of the pair\n * @param collider\n */\n hasCollider(collider) {\n return collider === this.colliderA || collider === this.colliderB;\n }\n /**\n * Calculates the unique pair hash id for this collision pair (owning id)\n */\n static calculatePairHash(idA, idB) {\n if (idA.value < idB.value) {\n return `#${idA.value}+${idB.value}`;\n }\n else {\n return `#${idB.value}+${idA.value}`;\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Detection/QuadTree.ts\":\n/*!*****************************************!*\\\n !*** ./Collision/Detection/QuadTree.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ QuadTree: () => (/* binding */ QuadTree)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Color */ \"./Color.ts\");\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n\n\n/**\n * QuadTree spatial data structure. Useful for quickly retrieving all objects that might\n * be in a specific location.\n */\nclass QuadTree {\n constructor(bounds, options) {\n this.bounds = bounds;\n this.options = options;\n this._defaultOptions = {\n maxDepth: 10,\n capacity: 10,\n level: 0\n };\n this.items = [];\n this._isDivided = false;\n this.topLeft = null;\n this.topRight = null;\n this.bottomLeft = null;\n this.bottomRight = null;\n this.options = { ...this._defaultOptions, ...options };\n this.halfWidth = bounds.width / 2;\n this.halfHeight = bounds.height / 2;\n }\n /**\n * Splits the quad tree one level deeper\n */\n _split() {\n this._isDivided = true;\n const newLevelOptions = {\n maxDepth: this.options.maxDepth,\n capacity: this.options.capacity,\n level: this.options.level + 1\n };\n this.topLeft = new QuadTree(new _BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox({\n left: this.bounds.left,\n top: this.bounds.top,\n right: this.bounds.left + this.halfWidth,\n bottom: this.bounds.top + this.halfHeight\n }), newLevelOptions);\n this.topRight = new QuadTree(new _BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox({\n left: this.bounds.left + this.halfWidth,\n top: this.bounds.top,\n right: this.bounds.right,\n bottom: this.bounds.top + this.halfHeight\n }), newLevelOptions);\n this.bottomLeft = new QuadTree(new _BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox({\n left: this.bounds.left,\n top: this.bounds.top + this.halfHeight,\n right: this.bounds.left + this.halfWidth,\n bottom: this.bounds.bottom\n }), newLevelOptions);\n this.bottomRight = new QuadTree(new _BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox({\n left: this.bounds.left + this.halfWidth,\n top: this.bounds.top + this.halfHeight,\n right: this.bounds.right,\n bottom: this.bounds.bottom\n }), newLevelOptions);\n }\n _insertIntoSubNodes(item) {\n var _a, _b, _c, _d;\n if ((_a = this.topLeft) === null || _a === void 0 ? void 0 : _a.bounds.overlaps(item.bounds)) {\n this.topLeft.insert(item);\n }\n if ((_b = this.topRight) === null || _b === void 0 ? void 0 : _b.bounds.overlaps(item.bounds)) {\n this.topRight.insert(item);\n }\n if ((_c = this.bottomLeft) === null || _c === void 0 ? void 0 : _c.bounds.overlaps(item.bounds)) {\n this.bottomLeft.insert(item);\n }\n if ((_d = this.bottomRight) === null || _d === void 0 ? void 0 : _d.bounds.overlaps(item.bounds)) {\n this.bottomRight.insert(item);\n }\n }\n /**\n * Insert an item to be tracked in the QuadTree\n * @param item\n */\n insert(item) {\n // add to subnodes if it matches\n if (this._isDivided) {\n this._insertIntoSubNodes(item);\n return;\n }\n // leaf case\n this.items.push(item);\n // capacity\n if (this.items.length > this.options.capacity && this.options.level < this.options.maxDepth) {\n if (!this._isDivided) {\n this._split();\n }\n // divide this level's items into it's subnodes\n for (const item of this.items) {\n this._insertIntoSubNodes(item);\n }\n // clear this level\n this.items.length = 0;\n }\n }\n /**\n * Remove a tracked item in the QuadTree\n * @param item\n */\n remove(item) {\n var _a, _b, _c, _d;\n if (!this.bounds.overlaps(item.bounds)) {\n return;\n }\n if (!this._isDivided) {\n const index = this.items.indexOf(item);\n if (index > -1) {\n this.items.splice(index, 1);\n }\n return;\n }\n if ((_a = this.topLeft) === null || _a === void 0 ? void 0 : _a.bounds.overlaps(item.bounds)) {\n this.topLeft.remove(item);\n }\n if ((_b = this.topRight) === null || _b === void 0 ? void 0 : _b.bounds.overlaps(item.bounds)) {\n this.topRight.remove(item);\n }\n if ((_c = this.bottomLeft) === null || _c === void 0 ? void 0 : _c.bounds.overlaps(item.bounds)) {\n this.bottomLeft.remove(item);\n }\n if ((_d = this.bottomRight) === null || _d === void 0 ? void 0 : _d.bounds.overlaps(item.bounds)) {\n this.bottomRight.remove(item);\n }\n }\n /**\n * Query the structure for all objects that intersect the bounding box\n * @param boundingBox\n * @returns items\n */\n query(boundingBox) {\n let results = this.items;\n if (this._isDivided) {\n if (this.topLeft.bounds.overlaps(boundingBox)) {\n results = results.concat(this.topLeft.query(boundingBox));\n }\n if (this.topRight.bounds.overlaps(boundingBox)) {\n results = results.concat(this.topRight.query(boundingBox));\n }\n if (this.bottomLeft.bounds.overlaps(boundingBox)) {\n results = results.concat(this.bottomLeft.query(boundingBox));\n }\n if (this.bottomRight.bounds.overlaps(boundingBox)) {\n results = results.concat(this.bottomRight.query(boundingBox));\n }\n }\n results = results.filter((item, index) => {\n return results.indexOf(item) >= index;\n });\n return results;\n }\n clear() {\n this.items = [];\n this._isDivided = false;\n this.topLeft = null;\n this.topRight = null;\n this.bottomLeft = null;\n this.bottomRight = null;\n }\n getAllItems() {\n let results = this.items;\n if (this._isDivided) {\n results = results.concat(this.topLeft.getAllItems());\n results = results.concat(this.topRight.getAllItems());\n results = results.concat(this.bottomLeft.getAllItems());\n results = results.concat(this.bottomRight.getAllItems());\n }\n results = results.filter((item, index) => {\n return results.indexOf(item) >= index;\n });\n return results;\n }\n getTreeDepth() {\n if (!this._isDivided) {\n return 0;\n }\n return (1 +\n Math.max(this.topLeft.getTreeDepth(), this.topRight.getTreeDepth(), this.bottomLeft.getTreeDepth(), this.bottomRight.getTreeDepth()));\n }\n debug(ctx) {\n this.bounds.draw(ctx, _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Yellow);\n if (this._isDivided) {\n this.topLeft.bounds.draw(ctx, _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Yellow);\n this.topRight.bounds.draw(ctx, _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Yellow);\n this.bottomLeft.bounds.draw(ctx, _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Yellow);\n this.bottomRight.bounds.draw(ctx, _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Yellow);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Detection/SparseHashGrid.ts\":\n/*!***********************************************!*\\\n !*** ./Collision/Detection/SparseHashGrid.ts ***!\n \\***********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ HashGridCell: () => (/* binding */ HashGridCell),\n/* harmony export */ HashGridProxy: () => (/* binding */ HashGridProxy),\n/* harmony export */ SparseHashGrid: () => (/* binding */ SparseHashGrid)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Color */ \"./Color.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_RentalPool__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Util/RentalPool */ \"./Util/RentalPool.ts\");\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n\n\n\n\nclass HashGridProxy {\n constructor(object, gridSize) {\n this.object = object;\n this.id = -1;\n this.cells = [];\n this.hasZeroBounds = false;\n this.gridSize = gridSize;\n this.bounds = object.bounds;\n this.hasZeroBounds = this.bounds.hasZeroDimensions();\n this.leftX = Math.floor(this.bounds.left / this.gridSize);\n this.rightX = Math.floor(this.bounds.right / this.gridSize);\n this.bottomY = Math.floor(this.bounds.bottom / this.gridSize);\n this.topY = Math.floor(this.bounds.top / this.gridSize);\n }\n /**\n * Has the hashed bounds changed\n */\n hasChanged() {\n const bounds = this.object.bounds;\n const leftX = Math.floor(bounds.left / this.gridSize);\n const rightX = Math.floor(bounds.right / this.gridSize);\n const bottomY = Math.floor(bounds.bottom / this.gridSize);\n const topY = Math.floor(bounds.top / this.gridSize);\n if (this.leftX !== leftX || this.rightX !== rightX || this.bottomY !== bottomY || this.topY !== topY) {\n return true;\n }\n return false;\n }\n /**\n * Clears all collider references\n */\n clear() {\n for (const cell of this.cells) {\n const index = cell.proxies.indexOf(this);\n if (index > -1) {\n cell.proxies.splice(index, 1);\n }\n // TODO reclaim cell in pool if empty?\n }\n }\n /**\n * Update bounds of the proxy\n */\n updateBounds() {\n this.bounds = this.object.bounds;\n }\n /**\n * Updates the hashed bounds coordinates\n */\n update() {\n this.bounds = this.object.bounds;\n this.leftX = Math.floor(this.bounds.left / this.gridSize);\n this.rightX = Math.floor(this.bounds.right / this.gridSize);\n this.bottomY = Math.floor(this.bounds.bottom / this.gridSize);\n this.topY = Math.floor(this.bounds.top / this.gridSize);\n this.hasZeroBounds = this.object.bounds.hasZeroDimensions();\n }\n}\nclass HashGridCell {\n constructor() {\n this.proxies = [];\n }\n configure(x, y) {\n this.x = x;\n this.y = y;\n this.key = HashGridCell.calculateHashKey(x, y);\n }\n static calculateHashKey(x, y) {\n return `${x}+${y}`;\n }\n}\nclass SparseHashGrid {\n constructor(options) {\n this.bounds = new _BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox();\n this._hashGridCellPool = new _Util_RentalPool__WEBPACK_IMPORTED_MODULE_1__.RentalPool(() => new HashGridCell(), (instance) => {\n instance.configure(0, 0);\n instance.proxies.length = 0;\n return instance;\n }, 1000);\n this.gridSize = options.size;\n this.sparseHashGrid = new Map();\n this.objectToProxy = new Map();\n if (options.proxyFactory) {\n this._buildProxy = (object) => options.proxyFactory(object, this.gridSize);\n }\n else {\n this._buildProxy = (object) => new HashGridProxy(object, this.gridSize);\n }\n // TODO dynamic grid size potentially larger than the largest collider\n // TODO Re-hash the objects if the median proves to be different\n }\n query(boundsOrPoint) {\n const results = new Set();\n if (boundsOrPoint instanceof _BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox) {\n const bounds = boundsOrPoint;\n const leftX = Math.floor(bounds.left / this.gridSize);\n const rightX = Math.floor(bounds.right / this.gridSize);\n const bottomY = Math.floor(bounds.bottom / this.gridSize);\n const topY = Math.floor(bounds.top / this.gridSize);\n for (let x = leftX; x <= rightX; x++) {\n for (let y = topY; y <= bottomY; y++) {\n const key = HashGridCell.calculateHashKey(x, y);\n // Hash bounds into appropriate cell\n const cell = this.sparseHashGrid.get(key);\n if (cell) {\n for (let i = 0; i < cell.proxies.length; i++) {\n cell.proxies[i].updateBounds();\n if (cell.proxies[i].bounds.intersect(bounds)) {\n results.add(cell.proxies[i].object);\n }\n }\n }\n }\n }\n }\n else {\n const point = boundsOrPoint;\n const key = HashGridCell.calculateHashKey(Math.floor(point.x / this.gridSize), Math.floor(point.y / this.gridSize));\n // Hash points into appropriate cell\n const cell = this.sparseHashGrid.get(key);\n if (cell) {\n for (let i = 0; i < cell.proxies.length; i++) {\n cell.proxies[i].updateBounds();\n if (cell.proxies[i].bounds.contains(point)) {\n results.add(cell.proxies[i].object);\n }\n }\n }\n }\n return Array.from(results);\n }\n get(xCoord, yCoord) {\n const key = HashGridCell.calculateHashKey(xCoord, yCoord);\n const cell = this.sparseHashGrid.get(key);\n return cell;\n }\n _insert(x, y, proxy) {\n const key = HashGridCell.calculateHashKey(x, y);\n // Hash collider into appropriate cell\n let cell = this.sparseHashGrid.get(key);\n if (!cell) {\n cell = this._hashGridCellPool.rent();\n cell.configure(x, y);\n this.sparseHashGrid.set(cell.key, cell);\n }\n cell.proxies.push(proxy);\n proxy.cells.push(cell); // TODO dupes, doesn't seem to be a problem\n this.bounds.combine(proxy.bounds, this.bounds);\n }\n _remove(x, y, proxy) {\n const key = HashGridCell.calculateHashKey(x, y);\n // Hash collider into appropriate cell\n const cell = this.sparseHashGrid.get(key);\n if (cell) {\n const proxyIndex = cell.proxies.indexOf(proxy);\n if (proxyIndex > -1) {\n cell.proxies.splice(proxyIndex, 1);\n }\n const cellIndex = proxy.cells.indexOf(cell);\n if (cellIndex > -1) {\n proxy.cells.splice(cellIndex, 1);\n }\n if (cell.proxies.length === 0) {\n this._hashGridCellPool.return(cell);\n this.sparseHashGrid.delete(key);\n }\n }\n }\n track(target) {\n const proxy = this._buildProxy(target);\n this.objectToProxy.set(target, proxy);\n for (let x = proxy.leftX; x <= proxy.rightX; x++) {\n for (let y = proxy.topY; y <= proxy.bottomY; y++) {\n this._insert(x, y, proxy);\n }\n }\n }\n untrack(target) {\n const proxy = this.objectToProxy.get(target);\n if (proxy) {\n proxy.clear();\n this.objectToProxy.delete(target);\n }\n }\n update(targets) {\n let updated = 0;\n // FIXME resetting bounds is wrong, if nothing has updated then\n // the bounds stay 0\n // this.bounds.reset();\n for (const target of targets) {\n const proxy = this.objectToProxy.get(target);\n if (!proxy) {\n continue;\n }\n if (proxy.hasChanged()) {\n // TODO slightly wasteful only remove from changed\n for (let x = proxy.leftX; x <= proxy.rightX; x++) {\n for (let y = proxy.topY; y <= proxy.bottomY; y++) {\n this._remove(x, y, proxy);\n }\n }\n proxy.update();\n // TODO slightly wasteful only add new\n for (let x = proxy.leftX; x <= proxy.rightX; x++) {\n for (let y = proxy.topY; y <= proxy.bottomY; y++) {\n this._insert(x, y, proxy);\n }\n }\n updated++;\n }\n }\n return updated;\n }\n debug(ex, elapsed) {\n const transparent = _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Transparent;\n const color = _Color__WEBPACK_IMPORTED_MODULE_2__.Color.White;\n for (const cell of this.sparseHashGrid.values()) {\n ex.drawRectangle((0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(cell.x * this.gridSize, cell.y * this.gridSize), this.gridSize, this.gridSize, transparent, color, 2);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Detection/SparseHashGridCollisionProcessor.ts\":\n/*!*****************************************************************!*\\\n !*** ./Collision/Detection/SparseHashGridCollisionProcessor.ts ***!\n \\*****************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ HashColliderProxy: () => (/* binding */ HashColliderProxy),\n/* harmony export */ SparseHashGridCollisionProcessor: () => (/* binding */ SparseHashGridCollisionProcessor)\n/* harmony export */ });\n/* harmony import */ var _Id__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Id */ \"./Id.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_Pool__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Util/Pool */ \"./Util/Pool.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Colliders/CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Group/CollisionGroup */ \"./Collision/Group/CollisionGroup.ts\");\n/* harmony import */ var _Pair__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Pair */ \"./Collision/Detection/Pair.ts\");\n/* harmony import */ var _SparseHashGrid__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./SparseHashGrid */ \"./Collision/Detection/SparseHashGrid.ts\");\n\n\n\n\n\n\n\n\n\n/**\n * Proxy type to stash collision info\n */\nclass HashColliderProxy extends _SparseHashGrid__WEBPACK_IMPORTED_MODULE_0__.HashGridProxy {\n constructor(collider, gridSize) {\n var _a, _b;\n super(collider, gridSize);\n this.collider = collider;\n this.id = -1;\n this.hasZeroBounds = false;\n /**\n * References to the hash cell the collider is a current member of\n */\n this.cells = [];\n this.gridSize = gridSize;\n const bounds = collider.bounds;\n this.hasZeroBounds = bounds.hasZeroDimensions();\n this.leftX = Math.floor(bounds.left / this.gridSize);\n this.rightX = Math.floor(bounds.right / this.gridSize);\n this.bottomY = Math.floor(bounds.bottom / this.gridSize);\n this.topY = Math.floor(bounds.top / this.gridSize);\n this.owner = collider.owner;\n this.body = (_a = this.owner) === null || _a === void 0 ? void 0 : _a.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_1__.BodyComponent);\n this.collisionType = (_b = this.body.collisionType) !== null && _b !== void 0 ? _b : _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.PreventCollision;\n }\n /**\n * Updates the hashed bounds coordinates\n */\n update() {\n var _a, _b;\n super.update();\n this.body = (_a = this.owner) === null || _a === void 0 ? void 0 : _a.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_1__.BodyComponent);\n this.collisionType = (_b = this.body.collisionType) !== null && _b !== void 0 ? _b : _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.PreventCollision;\n this.hasZeroBounds = this.collider.localBounds.hasZeroDimensions();\n }\n}\n/**\n * This collision processor uses a sparsely populated grid of uniform cells to bucket potential\n * colliders together for the purpose of detecting collision pairs and collisions.\n */\nclass SparseHashGridCollisionProcessor {\n constructor(options) {\n this._pairs = new Set();\n this._nonPairs = new Set();\n this._pairPool = new _Util_Pool__WEBPACK_IMPORTED_MODULE_3__.Pool(() => new _Pair__WEBPACK_IMPORTED_MODULE_4__.Pair({ id: (0,_Id__WEBPACK_IMPORTED_MODULE_5__.createId)('collider', 0) }, { id: (0,_Id__WEBPACK_IMPORTED_MODULE_5__.createId)('collider', 0) }), (instance) => {\n instance.colliderA = null;\n instance.colliderB = null;\n return instance;\n }, 200);\n this.gridSize = options.size;\n this.hashGrid = new _SparseHashGrid__WEBPACK_IMPORTED_MODULE_0__.SparseHashGrid({\n size: this.gridSize,\n proxyFactory: (collider, size) => new HashColliderProxy(collider, size)\n });\n this._pairPool.disableWarnings = true;\n // TODO dynamic grid size potentially larger than the largest collider\n // TODO Re-hash the objects if the median proves to be different\n }\n getColliders() {\n return Array.from(this.hashGrid.objectToProxy.keys());\n }\n query(boundsOrPoint) {\n // FIXME workaround TS: https://github.com/microsoft/TypeScript/issues/14107\n return this.hashGrid.query(boundsOrPoint);\n }\n rayCast(ray, options) {\n var _a, _b, _c;\n // DDA raycast algo\n const results = [];\n const maxDistance = (_a = options === null || options === void 0 ? void 0 : options.maxDistance) !== null && _a !== void 0 ? _a : Infinity;\n const collisionGroup = options === null || options === void 0 ? void 0 : options.collisionGroup;\n const collisionMask = !collisionGroup ? (_b = options === null || options === void 0 ? void 0 : options.collisionMask) !== null && _b !== void 0 ? _b : _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_6__.CollisionGroup.All.category : collisionGroup.category;\n const searchAllColliders = (_c = options === null || options === void 0 ? void 0 : options.searchAllColliders) !== null && _c !== void 0 ? _c : false;\n const unitRay = ray.dir.normalize();\n const dydx = unitRay.y / unitRay.x;\n const dxdy = unitRay.x / unitRay.y;\n const unitStepX = Math.sqrt(1 + dydx * dydx) * this.gridSize;\n const unitStepY = Math.sqrt(1 + dxdy * dxdy) * this.gridSize;\n const startXCoord = ray.pos.x / this.gridSize;\n const startYCoord = ray.pos.y / this.gridSize;\n const stepDir = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_7__.vec)(1, 1);\n let currentXCoord = ~~startXCoord;\n let currentYCoord = ~~startYCoord;\n let currentRayLengthX = 0;\n let currentRayLengthY = 0;\n if (unitRay.x < 0) {\n stepDir.x = -1;\n currentRayLengthX = (startXCoord - currentXCoord) * unitStepX;\n }\n else {\n stepDir.x = 1;\n currentRayLengthX = (currentXCoord + 1 - startXCoord) * unitStepX;\n }\n if (unitRay.y < 0) {\n stepDir.y = -1;\n currentRayLengthY = (startYCoord - currentYCoord) * unitStepY;\n }\n else {\n stepDir.y = 1;\n currentRayLengthY = (currentYCoord + 1 - startYCoord) * unitStepY;\n }\n const collidersVisited = new Set();\n let done = false;\n let maxIterations = 9999;\n while (!done && maxIterations > 0) {\n maxIterations--; // safety exit\n // exit if exhausted max hash grid coordinate, bounds of the sparse grid\n if (!this.hashGrid.bounds.contains((0,_Math_vector__WEBPACK_IMPORTED_MODULE_7__.vec)(currentXCoord * this.gridSize, currentYCoord * this.gridSize))) {\n break;\n }\n // Test colliders at cell\n const key = _SparseHashGrid__WEBPACK_IMPORTED_MODULE_0__.HashGridCell.calculateHashKey(currentXCoord, currentYCoord);\n const cell = this.hashGrid.sparseHashGrid.get(key);\n if (cell) {\n const cellHits = [];\n for (let colliderIndex = 0; colliderIndex < cell.proxies.length; colliderIndex++) {\n const collider = cell.proxies[colliderIndex];\n if (!collidersVisited.has(collider.collider.id.value)) {\n collidersVisited.add(collider.collider.id.value);\n if ((options === null || options === void 0 ? void 0 : options.ignoreCollisionGroupAll) && collider.body.group === _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_6__.CollisionGroup.All) {\n continue;\n }\n const canCollide = (collisionMask & collider.body.group.category) !== 0;\n // Early exit if not the right group\n if (collider.body.group && !canCollide) {\n continue;\n }\n const hit = collider.collider.rayCast(ray, maxDistance);\n // Collect up all the colliders that hit inside a cell\n // they can be in any order so we need to sort them next\n if (hit) {\n cellHits.push(hit);\n }\n }\n }\n cellHits.sort((hit1, hit2) => hit1.distance - hit2.distance);\n for (let i = 0; i < cellHits.length; i++) {\n const hit = cellHits[i];\n if (options === null || options === void 0 ? void 0 : options.filter) {\n if (options.filter(hit)) {\n results.push(hit);\n if (!searchAllColliders) {\n done = true;\n break;\n }\n }\n }\n else {\n results.push(hit);\n if (!searchAllColliders) {\n done = true;\n break;\n }\n }\n }\n }\n if (currentRayLengthX < currentRayLengthY) {\n currentXCoord += stepDir.x;\n currentRayLengthX += unitStepX;\n }\n else {\n currentYCoord += stepDir.y;\n currentRayLengthY += unitStepY;\n }\n }\n // Sort by distance\n results.sort((hit1, hit2) => hit1.distance - hit2.distance);\n if (!searchAllColliders && results.length) {\n return [results[0]];\n }\n return results;\n }\n /**\n * Adds the collider to the internal data structure for collision tracking\n * @param target\n */\n track(target) {\n let colliders = [target];\n if (target instanceof _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_8__.CompositeCollider) {\n const compColliders = target.getColliders();\n for (const c of compColliders) {\n c.owner = target.owner;\n }\n colliders = compColliders;\n }\n for (const target of colliders) {\n this.hashGrid.track(target);\n }\n }\n /**\n * Removes a collider from the internal data structure for tracking collisions\n * @param target\n */\n untrack(target) {\n let colliders = [target];\n if (target instanceof _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_8__.CompositeCollider) {\n colliders = target.getColliders();\n }\n for (const target of colliders) {\n this.hashGrid.untrack(target);\n }\n }\n _canCollide(colliderA, colliderB) {\n // Prevent self collision\n if (colliderA.collider.id === colliderB.collider.id) {\n return false;\n }\n // Colliders with the same owner do not collide (composite colliders)\n if (colliderA.owner && colliderB.owner && colliderA.owner.id === colliderB.owner.id) {\n return false;\n }\n // if the pair has a member with zero dimension don't collide\n if (colliderA.hasZeroBounds || colliderB.hasZeroBounds) {\n return false;\n }\n // If both are in the same collision group short circuit\n if (!colliderA.body.group.canCollide(colliderB.body.group)) {\n return false;\n }\n // if both are fixed short circuit\n if (colliderA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.Fixed && colliderB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.Fixed) {\n return false;\n }\n // if the either is prevent collision short circuit\n if (colliderA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.PreventCollision || colliderB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.PreventCollision) {\n return false;\n }\n // if either is dead short circuit\n if (!colliderA.owner.isActive || !colliderB.owner.isActive) {\n return false;\n }\n return true;\n }\n /**\n * Runs the broadphase sweep over tracked colliders and returns possible collision pairs\n * @param targets\n * @param elapsed\n */\n broadphase(targets, elapsed) {\n const pairs = [];\n this._pairs.clear();\n this._nonPairs.clear();\n let proxyId = 0;\n for (const proxy of this.hashGrid.objectToProxy.values()) {\n proxy.id = proxyId++; // track proxies we've already processed\n if (!proxy.owner.isActive || proxy.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.PreventCollision) {\n continue;\n }\n // for every cell proxy collider is member of\n for (let cellIndex = 0; cellIndex < proxy.cells.length; cellIndex++) {\n const cell = proxy.cells[cellIndex];\n // TODO Can we skip any cells or make this iteration faster?\n // maybe a linked list here\n for (let otherIndex = 0; otherIndex < cell.proxies.length; otherIndex++) {\n const other = cell.proxies[otherIndex];\n if (other.id === proxy.id) {\n // skip duplicates\n continue;\n }\n const id = _Pair__WEBPACK_IMPORTED_MODULE_4__.Pair.calculatePairHash(proxy.collider.id, other.collider.id);\n if (this._nonPairs.has(id)) {\n continue; // Is there a way we can re-use the non-pair cache\n }\n if (!this._pairs.has(id) && this._canCollide(proxy, other) && proxy.object.bounds.overlaps(other.object.bounds)) {\n const pair = this._pairPool.get();\n pair.colliderA = proxy.collider;\n pair.colliderB = other.collider;\n pair.id = id;\n this._pairs.add(id);\n pairs.push(pair);\n }\n else {\n this._nonPairs.add(id);\n }\n }\n }\n }\n return pairs;\n }\n /**\n * Runs a fine grain pass on collision pairs and does geometry intersection tests producing any contacts\n * @param pairs\n * @param stats\n */\n narrowphase(pairs, stats) {\n const contacts = [];\n for (let i = 0; i < pairs.length; i++) {\n const newContacts = pairs[i].collide();\n for (let j = 0; j < newContacts.length; j++) {\n const c = newContacts[j];\n contacts.push(c);\n if (stats) {\n stats.physics.contacts.set(c.id, c);\n }\n }\n }\n this._pairPool.done();\n if (stats) {\n stats.physics.collisions += contacts.length;\n }\n return contacts; // TODO maybe we can re-use contacts as likely pairs next frame\n }\n /**\n * Perform data structure maintenance, returns number of colliders updated\n */\n update(targets, elapsed) {\n return this.hashGrid.update(targets);\n }\n /**\n * Draws the internal data structure\n * @param ex\n * @param elapsed\n */\n debug(ex, elapsed) {\n this.hashGrid.debug(ex, elapsed);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Detection/SpatialPartitionStrategy.ts\":\n/*!*********************************************************!*\\\n !*** ./Collision/Detection/SpatialPartitionStrategy.ts ***!\n \\*********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SpatialPartitionStrategy: () => (/* binding */ SpatialPartitionStrategy)\n/* harmony export */ });\n/**\n * Possible collision resolution strategies\n *\n * The default is {@apilink SolverStrategy.Arcade} which performs simple axis aligned arcade style physics. This is useful for things\n * like platformers or top down games.\n *\n * More advanced rigid body physics are enabled by setting {@apilink SolverStrategy.Realistic} which allows for complicated\n * simulated physical interactions.\n */\nvar SpatialPartitionStrategy;\n(function (SpatialPartitionStrategy) {\n SpatialPartitionStrategy[\"DynamicTree\"] = \"dynamic-tree\";\n SpatialPartitionStrategy[\"SparseHashGrid\"] = \"sparse-hash-grid\";\n})(SpatialPartitionStrategy || (SpatialPartitionStrategy = {}));\n\n\n/***/ }),\n\n/***/ \"./Collision/Group/CollisionGroup.ts\":\n/*!*******************************************!*\\\n !*** ./Collision/Group/CollisionGroup.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CollisionGroup: () => (/* binding */ CollisionGroup)\n/* harmony export */ });\n/* harmony import */ var _CollisionGroupManager__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./CollisionGroupManager */ \"./Collision/Group/CollisionGroupManager.ts\");\n\n/**\n * CollisionGroups indicate like members that do not collide with each other. Use {@apilink CollisionGroupManager} to create {@apilink CollisionGroup}s\n *\n * For example:\n *\n * Players have collision group \"player\"\n *\n * ![Player Collision Group](/assets/images/docs/CollisionGroupsPlayer.png)\n *\n * Enemies have collision group \"enemy\"\n *\n * ![Enemy Collision Group](/assets/images/docs/CollisionGroupsEnemy.png)\n *\n * Blocks have collision group \"ground\"\n *\n * ![Ground collision group](/assets/images/docs/CollisionGroupsGround.png)\n *\n * Players don't collide with each other, but enemies and blocks. Likewise, enemies don't collide with each other but collide\n * with players and blocks.\n *\n * This is done with bitmasking, see the following pseudo-code\n *\n * PlayerGroup = `0b001`\n * PlayerGroupMask = `0b110`\n *\n * EnemyGroup = `0b010`\n * EnemyGroupMask = `0b101`\n *\n * BlockGroup = `0b100`\n * BlockGroupMask = `0b011`\n *\n * Should Players collide? No because the bitwise mask evaluates to 0\n * `(player1.group & player2.mask) === 0`\n * `(0b001 & 0b110) === 0`\n *\n * Should Players and Enemies collide? Yes because the bitwise mask is non-zero\n * `(player1.group & enemy1.mask) === 1`\n * `(0b001 & 0b101) === 1`\n *\n * Should Players and Blocks collide? Yes because the bitwise mask is non-zero\n * `(player1.group & blocks1.mask) === 1`\n * `(0b001 & 0b011) === 1`\n */\nclass CollisionGroup {\n /**\n * STOP!!** It is preferred that {@apilink CollisionGroupManager.create} is used to create collision groups\n * unless you know how to construct the proper bitmasks. See https://github.com/excaliburjs/Excalibur/issues/1091 for more info.\n * @param name Name of the collision group\n * @param category 32 bit category for the group, should be a unique power of 2. For example `0b001` or `0b010`\n * @param mask 32 bit mask of category, or `~category` generally. For a category of `0b001`, the mask would be `0b110`\n */\n constructor(name, category, mask) {\n this._name = name;\n this._category = category;\n this._mask = mask;\n }\n /**\n * Get the name of the collision group\n */\n get name() {\n return this._name;\n }\n /**\n * Get the category of the collision group, a 32 bit number which should be a unique power of 2\n */\n get category() {\n return this._category;\n }\n /**\n * Get the mask for this collision group\n */\n get mask() {\n return this._mask;\n }\n /**\n * Evaluates whether 2 collision groups can collide\n *\n * This means the mask has the same bit set the other category and vice versa\n * @param other CollisionGroup\n */\n canCollide(other) {\n const overlap1 = this.category & other.mask;\n const overlap2 = this.mask & other.category;\n return overlap1 !== 0 && overlap2 !== 0;\n }\n /**\n * Inverts the collision group. For example, if before the group specified \"players\",\n * inverting would specify all groups except players\n * @returns CollisionGroup\n */\n invert() {\n const group = _CollisionGroupManager__WEBPACK_IMPORTED_MODULE_0__.CollisionGroupManager.create('~(' + this.name + ')', ~this.mask | 0);\n group._category = ~this.category;\n return group;\n }\n /**\n * Combine collision groups with each other. The new group includes all of the previous groups.\n * @param collisionGroups\n */\n static combine(collisionGroups) {\n const combinedName = collisionGroups.map((c) => c.name).join('+');\n const combinedCategory = collisionGroups.reduce((current, g) => g.category | current, 0b0);\n const combinedMask = ~combinedCategory;\n return _CollisionGroupManager__WEBPACK_IMPORTED_MODULE_0__.CollisionGroupManager.create(combinedName, combinedMask);\n }\n /**\n * Creates a collision group that collides with the listed groups\n * @param collisionGroups\n */\n static collidesWith(collisionGroups) {\n const combinedName = `collidesWith(${collisionGroups.map((c) => c.name).join('+')})`;\n const combinedMask = collisionGroups.reduce((current, g) => g.category | current, 0b0);\n return _CollisionGroupManager__WEBPACK_IMPORTED_MODULE_0__.CollisionGroupManager.create(combinedName, combinedMask);\n }\n toString() {\n return `\r\ncategory: ${this.category.toString(2).padStart(32, '0')}\r\nmask: ${(this.mask >>> 0).toString(2).padStart(32, '0')}\r\n `;\n }\n}\n/**\n * The `All` {@apilink CollisionGroup} is a special group that collides with all other groups including itself,\n * it is the default collision group on colliders.\n */\nCollisionGroup.All = new CollisionGroup('Collide with all groups', -1, -1);\n\n\n/***/ }),\n\n/***/ \"./Collision/Group/CollisionGroupManager.ts\":\n/*!**************************************************!*\\\n !*** ./Collision/Group/CollisionGroupManager.ts ***!\n \\**************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CollisionGroupManager: () => (/* binding */ CollisionGroupManager)\n/* harmony export */ });\n/* harmony import */ var _CollisionGroup__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./CollisionGroup */ \"./Collision/Group/CollisionGroup.ts\");\n\n/**\n * Static class for managing collision groups in excalibur, there is a maximum of 32 collision groups possible in excalibur\n */\nclass CollisionGroupManager {\n /**\n * Create a new named collision group up to a max of 32.\n * @param name Name for the collision group\n * @param mask Optionally provide your own 32-bit mask, if none is provide the manager will generate one\n */\n static create(name, mask) {\n if (this._CURRENT_GROUP > this._MAX_GROUPS) {\n throw new Error(`Cannot have more than ${this._MAX_GROUPS} collision groups`);\n }\n if (this._GROUPS.get(name)) {\n const existingGroup = this._GROUPS.get(name);\n if (existingGroup.mask === mask) {\n return existingGroup;\n }\n throw new Error(`Collision group ${name} already exists with a different mask!`);\n }\n const group = new _CollisionGroup__WEBPACK_IMPORTED_MODULE_0__.CollisionGroup(name, this._CURRENT_BIT, mask !== undefined ? mask : ~this._CURRENT_BIT);\n this._CURRENT_BIT = (this._CURRENT_BIT << 1) | 0;\n this._CURRENT_GROUP++;\n this._GROUPS.set(name, group);\n return group;\n }\n /**\n * Get all collision groups currently tracked by excalibur\n */\n static get groups() {\n return Array.from(this._GROUPS.values());\n }\n /**\n * Get a collision group by it's name\n * @param name\n */\n static groupByName(name) {\n return this._GROUPS.get(name);\n }\n /**\n * Resets the managers internal group management state\n */\n static reset() {\n this._GROUPS = new Map();\n this._CURRENT_BIT = this._STARTING_BIT;\n this._CURRENT_GROUP = 1;\n }\n}\n// using bitmasking the maximum number of groups is 32, because that is the highest 32bit integer that JS can present.\nCollisionGroupManager._STARTING_BIT = 0b1 | 0;\nCollisionGroupManager._MAX_GROUPS = 32;\nCollisionGroupManager._CURRENT_GROUP = 1;\nCollisionGroupManager._CURRENT_BIT = CollisionGroupManager._STARTING_BIT;\nCollisionGroupManager._GROUPS = new Map();\n\n\n/***/ }),\n\n/***/ \"./Collision/Index.ts\":\n/*!****************************!*\\\n !*** ./Collision/Index.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ArcadeSolver: () => (/* reexport safe */ _Solver_ArcadeSolver__WEBPACK_IMPORTED_MODULE_24__.ArcadeSolver),\n/* harmony export */ BodyComponent: () => (/* reexport safe */ _BodyComponent__WEBPACK_IMPORTED_MODULE_0__.BodyComponent),\n/* harmony export */ BoundingBox: () => (/* reexport safe */ _BoundingBox__WEBPACK_IMPORTED_MODULE_5__.BoundingBox),\n/* harmony export */ CircleCollider: () => (/* reexport safe */ _Colliders_CircleCollider__WEBPACK_IMPORTED_MODULE_8__.CircleCollider),\n/* harmony export */ ClosestLineJumpTable: () => (/* reexport safe */ _Colliders_ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_12__.ClosestLineJumpTable),\n/* harmony export */ Collider: () => (/* reexport safe */ _Colliders_Collider__WEBPACK_IMPORTED_MODULE_4__.Collider),\n/* harmony export */ ColliderComponent: () => (/* reexport safe */ _ColliderComponent__WEBPACK_IMPORTED_MODULE_1__.ColliderComponent),\n/* harmony export */ CollisionContact: () => (/* reexport safe */ _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_17__.CollisionContact),\n/* harmony export */ CollisionGroup: () => (/* reexport safe */ _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_14__.CollisionGroup),\n/* harmony export */ CollisionGroupManager: () => (/* reexport safe */ _Group_CollisionGroupManager__WEBPACK_IMPORTED_MODULE_15__.CollisionGroupManager),\n/* harmony export */ CollisionJumpTable: () => (/* reexport safe */ _Colliders_CollisionJumpTable__WEBPACK_IMPORTED_MODULE_11__.CollisionJumpTable),\n/* harmony export */ CollisionSystem: () => (/* reexport safe */ _CollisionSystem__WEBPACK_IMPORTED_MODULE_28__.CollisionSystem),\n/* harmony export */ CollisionType: () => (/* reexport safe */ _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType),\n/* harmony export */ CompositeCollider: () => (/* reexport safe */ _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_7__.CompositeCollider),\n/* harmony export */ ContactConstraintPoint: () => (/* reexport safe */ _Solver_ContactConstraintPoint__WEBPACK_IMPORTED_MODULE_26__.ContactConstraintPoint),\n/* harmony export */ ContactSolveBias: () => (/* reexport safe */ _Solver_ContactBias__WEBPACK_IMPORTED_MODULE_25__.ContactSolveBias),\n/* harmony export */ DegreeOfFreedom: () => (/* reexport safe */ _BodyComponent__WEBPACK_IMPORTED_MODULE_0__.DegreeOfFreedom),\n/* harmony export */ DynamicTree: () => (/* reexport safe */ _Detection_DynamicTree__WEBPACK_IMPORTED_MODULE_18__.DynamicTree),\n/* harmony export */ DynamicTreeCollisionProcessor: () => (/* reexport safe */ _Detection_DynamicTreeCollisionProcessor__WEBPACK_IMPORTED_MODULE_19__.DynamicTreeCollisionProcessor),\n/* harmony export */ EdgeCollider: () => (/* reexport safe */ _Colliders_EdgeCollider__WEBPACK_IMPORTED_MODULE_9__.EdgeCollider),\n/* harmony export */ HashColliderProxy: () => (/* reexport safe */ _Detection_SparseHashGridCollisionProcessor__WEBPACK_IMPORTED_MODULE_20__.HashColliderProxy),\n/* harmony export */ HashGridCell: () => (/* reexport safe */ _Detection_SparseHashGrid__WEBPACK_IMPORTED_MODULE_21__.HashGridCell),\n/* harmony export */ HashGridProxy: () => (/* reexport safe */ _Detection_SparseHashGrid__WEBPACK_IMPORTED_MODULE_21__.HashGridProxy),\n/* harmony export */ HorizontalFirst: () => (/* reexport safe */ _Solver_ContactBias__WEBPACK_IMPORTED_MODULE_25__.HorizontalFirst),\n/* harmony export */ MotionSystem: () => (/* reexport safe */ _MotionSystem__WEBPACK_IMPORTED_MODULE_29__.MotionSystem),\n/* harmony export */ None: () => (/* reexport safe */ _Solver_ContactBias__WEBPACK_IMPORTED_MODULE_25__.None),\n/* harmony export */ Pair: () => (/* reexport safe */ _Detection_Pair__WEBPACK_IMPORTED_MODULE_16__.Pair),\n/* harmony export */ PhysicsWorld: () => (/* reexport safe */ _PhysicsWorld__WEBPACK_IMPORTED_MODULE_30__.PhysicsWorld),\n/* harmony export */ PolygonCollider: () => (/* reexport safe */ _Colliders_PolygonCollider__WEBPACK_IMPORTED_MODULE_10__.PolygonCollider),\n/* harmony export */ QuadTree: () => (/* reexport safe */ _Detection_QuadTree__WEBPACK_IMPORTED_MODULE_23__.QuadTree),\n/* harmony export */ RealisticSolver: () => (/* reexport safe */ _Solver_RealisticSolver__WEBPACK_IMPORTED_MODULE_27__.RealisticSolver),\n/* harmony export */ SeparatingAxis: () => (/* reexport safe */ _Colliders_SeparatingAxis__WEBPACK_IMPORTED_MODULE_13__.SeparatingAxis),\n/* harmony export */ SeparationInfo: () => (/* reexport safe */ _Colliders_SeparatingAxis__WEBPACK_IMPORTED_MODULE_13__.SeparationInfo),\n/* harmony export */ Shape: () => (/* reexport safe */ _Colliders_Shape__WEBPACK_IMPORTED_MODULE_6__.Shape),\n/* harmony export */ Side: () => (/* reexport safe */ _Side__WEBPACK_IMPORTED_MODULE_32__.Side),\n/* harmony export */ SolverStrategy: () => (/* reexport safe */ _SolverStrategy__WEBPACK_IMPORTED_MODULE_3__.SolverStrategy),\n/* harmony export */ SparseHashGrid: () => (/* reexport safe */ _Detection_SparseHashGrid__WEBPACK_IMPORTED_MODULE_21__.SparseHashGrid),\n/* harmony export */ SparseHashGridCollisionProcessor: () => (/* reexport safe */ _Detection_SparseHashGridCollisionProcessor__WEBPACK_IMPORTED_MODULE_20__.SparseHashGridCollisionProcessor),\n/* harmony export */ SpatialPartitionStrategy: () => (/* reexport safe */ _Detection_SpatialPartitionStrategy__WEBPACK_IMPORTED_MODULE_22__.SpatialPartitionStrategy),\n/* harmony export */ TreeNode: () => (/* reexport safe */ _Detection_DynamicTree__WEBPACK_IMPORTED_MODULE_18__.TreeNode),\n/* harmony export */ VerticalFirst: () => (/* reexport safe */ _Solver_ContactBias__WEBPACK_IMPORTED_MODULE_25__.VerticalFirst),\n/* harmony export */ getDefaultPhysicsConfig: () => (/* reexport safe */ _PhysicsConfig__WEBPACK_IMPORTED_MODULE_31__.getDefaultPhysicsConfig)\n/* harmony export */ });\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _ColliderComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ColliderComponent */ \"./Collision/ColliderComponent.ts\");\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _SolverStrategy__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./SolverStrategy */ \"./Collision/SolverStrategy.ts\");\n/* harmony import */ var _Colliders_Collider__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Colliders/Collider */ \"./Collision/Colliders/Collider.ts\");\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Colliders_Shape__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Colliders/Shape */ \"./Collision/Colliders/Shape.ts\");\n/* harmony import */ var _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Colliders/CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var _Colliders_CircleCollider__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Colliders/CircleCollider */ \"./Collision/Colliders/CircleCollider.ts\");\n/* harmony import */ var _Colliders_EdgeCollider__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Colliders/EdgeCollider */ \"./Collision/Colliders/EdgeCollider.ts\");\n/* harmony import */ var _Colliders_PolygonCollider__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Colliders/PolygonCollider */ \"./Collision/Colliders/PolygonCollider.ts\");\n/* harmony import */ var _Colliders_CollisionJumpTable__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Colliders/CollisionJumpTable */ \"./Collision/Colliders/CollisionJumpTable.ts\");\n/* harmony import */ var _Colliders_ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Colliders/ClosestLineJumpTable */ \"./Collision/Colliders/ClosestLineJumpTable.ts\");\n/* harmony import */ var _Colliders_SeparatingAxis__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Colliders/SeparatingAxis */ \"./Collision/Colliders/SeparatingAxis.ts\");\n/* harmony import */ var _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Group/CollisionGroup */ \"./Collision/Group/CollisionGroup.ts\");\n/* harmony import */ var _Group_CollisionGroupManager__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Group/CollisionGroupManager */ \"./Collision/Group/CollisionGroupManager.ts\");\n/* harmony import */ var _Detection_Pair__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Detection/Pair */ \"./Collision/Detection/Pair.ts\");\n/* harmony import */ var _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./Detection/CollisionContact */ \"./Collision/Detection/CollisionContact.ts\");\n/* harmony import */ var _Detection_DynamicTree__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Detection/DynamicTree */ \"./Collision/Detection/DynamicTree.ts\");\n/* harmony import */ var _Detection_DynamicTreeCollisionProcessor__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./Detection/DynamicTreeCollisionProcessor */ \"./Collision/Detection/DynamicTreeCollisionProcessor.ts\");\n/* harmony import */ var _Detection_SparseHashGridCollisionProcessor__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./Detection/SparseHashGridCollisionProcessor */ \"./Collision/Detection/SparseHashGridCollisionProcessor.ts\");\n/* harmony import */ var _Detection_SparseHashGrid__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./Detection/SparseHashGrid */ \"./Collision/Detection/SparseHashGrid.ts\");\n/* harmony import */ var _Detection_SpatialPartitionStrategy__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./Detection/SpatialPartitionStrategy */ \"./Collision/Detection/SpatialPartitionStrategy.ts\");\n/* harmony import */ var _Detection_QuadTree__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./Detection/QuadTree */ \"./Collision/Detection/QuadTree.ts\");\n/* harmony import */ var _Solver_ArcadeSolver__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./Solver/ArcadeSolver */ \"./Collision/Solver/ArcadeSolver.ts\");\n/* harmony import */ var _Solver_ContactBias__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./Solver/ContactBias */ \"./Collision/Solver/ContactBias.ts\");\n/* harmony import */ var _Solver_ContactConstraintPoint__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./Solver/ContactConstraintPoint */ \"./Collision/Solver/ContactConstraintPoint.ts\");\n/* harmony import */ var _Solver_RealisticSolver__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./Solver/RealisticSolver */ \"./Collision/Solver/RealisticSolver.ts\");\n/* harmony import */ var _CollisionSystem__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./CollisionSystem */ \"./Collision/CollisionSystem.ts\");\n/* harmony import */ var _MotionSystem__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./MotionSystem */ \"./Collision/MotionSystem.ts\");\n/* harmony import */ var _PhysicsWorld__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./PhysicsWorld */ \"./Collision/PhysicsWorld.ts\");\n/* harmony import */ var _PhysicsConfig__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./PhysicsConfig */ \"./Collision/PhysicsConfig.ts\");\n/* harmony import */ var _Side__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./Side */ \"./Collision/Side.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Collision/Integrator.ts\":\n/*!*********************************!*\\\n !*** ./Collision/Integrator.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EulerIntegrator: () => (/* binding */ EulerIntegrator)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n\nclass EulerIntegrator {\n static integrate(transform, motion, totalAcc, elapsed) {\n const seconds = elapsed / 1000;\n // This code looks a little wild, but it's to avoid creating any new Vector instances\n // integration is done in a tight loop so this is key to avoid GC'ing\n motion.vel.addEqual(totalAcc.scale(seconds, EulerIntegrator._ACC));\n transform.pos\n .add(motion.vel.scale(seconds, EulerIntegrator._VEL), EulerIntegrator._POS)\n .addEqual(totalAcc.scale(0.5 * seconds * seconds, EulerIntegrator._VEL_ACC));\n motion.angularVelocity += motion.torque * (1.0 / motion.inertia) * seconds;\n const rotation = transform.rotation + motion.angularVelocity * seconds;\n transform.scale.add(motion.scaleFactor.scale(seconds, this._SCALE_FACTOR), EulerIntegrator._SCALE);\n const tx = transform.get();\n tx.setTransform(EulerIntegrator._POS, rotation, EulerIntegrator._SCALE);\n }\n}\n// Scratch vectors to avoid allocation\nEulerIntegrator._POS = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\nEulerIntegrator._SCALE = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(1, 1);\nEulerIntegrator._ACC = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\nEulerIntegrator._VEL = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\nEulerIntegrator._VEL_ACC = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\nEulerIntegrator._SCALE_FACTOR = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\n\n\n/***/ }),\n\n/***/ \"./Collision/MotionSystem.ts\":\n/*!***********************************!*\\\n !*** ./Collision/MotionSystem.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MotionSystem: () => (/* binding */ MotionSystem)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Priority.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Integrator__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Integrator */ \"./Collision/Integrator.ts\");\n\n\n\n\n\n\n\nclass MotionSystem extends _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.System {\n constructor(world, physics) {\n super();\n this.world = world;\n this.physics = physics;\n this.systemType = _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.SystemType.Update;\n this._physicsConfigDirty = false;\n physics.$configUpdate.subscribe(() => (this._physicsConfigDirty = true));\n this.query = this.world.query([_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent, _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent]);\n }\n update(elapsed) {\n let transform;\n let motion;\n const entities = this.query.entities;\n const substep = this.physics.config.substep;\n for (let i = 0; i < entities.length; i++) {\n transform = entities[i].get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n motion = entities[i].get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n const optionalBody = entities[i].get(_BodyComponent__WEBPACK_IMPORTED_MODULE_3__.BodyComponent);\n if (this._physicsConfigDirty && optionalBody) {\n optionalBody.updatePhysicsConfig(this.physics.config.bodies);\n }\n if (optionalBody === null || optionalBody === void 0 ? void 0 : optionalBody.isSleeping) {\n continue;\n }\n const totalAcc = motion.acc.clone();\n if ((optionalBody === null || optionalBody === void 0 ? void 0 : optionalBody.collisionType) === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Active && (optionalBody === null || optionalBody === void 0 ? void 0 : optionalBody.useGravity)) {\n totalAcc.addEqual(this.physics.config.gravity);\n }\n // capture old transform of this entity and all of its children so that\n // any transform properties that derived from their parents are properly captured\n if (!entities[i].parent) {\n this.captureOldTransformWithChildren(entities[i]);\n }\n // Update transform and motion based on Euler linear algebra\n _Integrator__WEBPACK_IMPORTED_MODULE_5__.EulerIntegrator.integrate(transform, motion, totalAcc, elapsed / substep);\n }\n this._physicsConfigDirty = false;\n }\n captureOldTransformWithChildren(entity) {\n var _a;\n (_a = entity.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_3__.BodyComponent)) === null || _a === void 0 ? void 0 : _a.captureOldTransform();\n for (let i = 0; i < entity.children.length; i++) {\n this.captureOldTransformWithChildren(entity.children[i]);\n }\n }\n}\nMotionSystem.priority = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_6__.SystemPriority.Higher;\n\n\n/***/ }),\n\n/***/ \"./Collision/PhysicsConfig.ts\":\n/*!************************************!*\\\n !*** ./Collision/PhysicsConfig.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ getDefaultPhysicsConfig: () => (/* binding */ getDefaultPhysicsConfig)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _SolverStrategy__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./SolverStrategy */ \"./Collision/SolverStrategy.ts\");\n/* harmony import */ var _Solver_ContactBias__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Solver/ContactBias */ \"./Collision/Solver/ContactBias.ts\");\n/* harmony import */ var _Detection_SpatialPartitionStrategy__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Detection/SpatialPartitionStrategy */ \"./Collision/Detection/SpatialPartitionStrategy.ts\");\n\n\n\n\nconst getDefaultPhysicsConfig = () => ({\n enabled: true,\n gravity: (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0).clone(),\n solver: _SolverStrategy__WEBPACK_IMPORTED_MODULE_1__.SolverStrategy.Arcade,\n substep: 1,\n colliders: {\n compositeStrategy: 'together'\n },\n continuous: {\n checkForFastBodies: true,\n disableMinimumSpeedForFastBody: false,\n surfaceEpsilon: 0.1\n },\n bodies: {\n canSleepByDefault: false,\n sleepEpsilon: 0.07,\n wakeThreshold: 0.07 * 3,\n sleepBias: 0.9,\n defaultMass: 10\n },\n spatialPartition: _Detection_SpatialPartitionStrategy__WEBPACK_IMPORTED_MODULE_2__.SpatialPartitionStrategy.SparseHashGrid,\n sparseHashGrid: {\n size: 100\n },\n dynamicTree: {\n boundsPadding: 5,\n velocityMultiplier: 2\n },\n arcade: {\n contactSolveBias: _Solver_ContactBias__WEBPACK_IMPORTED_MODULE_3__.ContactSolveBias.None\n },\n realistic: {\n positionIterations: 3,\n velocityIterations: 8,\n slop: 1,\n steeringFactor: 0.2,\n warmStart: true\n }\n});\n\n\n/***/ }),\n\n/***/ \"./Collision/PhysicsWorld.ts\":\n/*!***********************************!*\\\n !*** ./Collision/PhysicsWorld.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PhysicsWorld: () => (/* binding */ PhysicsWorld)\n/* harmony export */ });\n/* harmony import */ var _Util_Observable__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Util/Observable */ \"./Util/Observable.ts\");\n/* harmony import */ var _Index__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Index */ \"./Collision/Detection/SparseHashGridCollisionProcessor.ts\");\n/* harmony import */ var _Index__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Index */ \"./Collision/Detection/DynamicTreeCollisionProcessor.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Util_Watch__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Util/Watch */ \"./Util/Watch.ts\");\n/* harmony import */ var _Detection_SpatialPartitionStrategy__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Detection/SpatialPartitionStrategy */ \"./Collision/Detection/SpatialPartitionStrategy.ts\");\n\n\n\n\n\nclass PhysicsWorld {\n get config() {\n return (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_0__.watchDeep)(this._config, (change) => {\n this.$configUpdate.notifyAll(change);\n });\n }\n set config(newConfig) {\n this._config = newConfig;\n this.$configUpdate.notifyAll(newConfig);\n }\n /**\n * Spatial data structure for locating potential collision pairs and ray casts\n */\n get collisionProcessor() {\n if (this._configDirty) {\n this._configDirty = false;\n // preserve tracked colliders if config updates\n const colliders = this._collisionProcessor.getColliders();\n if (this._config.spatialPartition === _Detection_SpatialPartitionStrategy__WEBPACK_IMPORTED_MODULE_1__.SpatialPartitionStrategy.SparseHashGrid) {\n this._collisionProcessor = new _Index__WEBPACK_IMPORTED_MODULE_2__.SparseHashGridCollisionProcessor(this._config.sparseHashGrid);\n }\n else {\n this._collisionProcessor = new _Index__WEBPACK_IMPORTED_MODULE_3__.DynamicTreeCollisionProcessor(this._config);\n }\n for (const collider of colliders) {\n this._collisionProcessor.track(collider);\n }\n }\n return this._collisionProcessor;\n }\n constructor(config) {\n this.$configUpdate = new _Util_Observable__WEBPACK_IMPORTED_MODULE_4__.Observable();\n this._configDirty = false;\n this.config = config;\n this.$configUpdate.subscribe((config) => {\n this._configDirty = true;\n _BodyComponent__WEBPACK_IMPORTED_MODULE_5__.BodyComponent.updateDefaultPhysicsConfig(config.bodies);\n });\n if (this._config.spatialPartition === _Detection_SpatialPartitionStrategy__WEBPACK_IMPORTED_MODULE_1__.SpatialPartitionStrategy.SparseHashGrid) {\n this._collisionProcessor = new _Index__WEBPACK_IMPORTED_MODULE_2__.SparseHashGridCollisionProcessor(this._config.sparseHashGrid);\n }\n else {\n this._collisionProcessor = new _Index__WEBPACK_IMPORTED_MODULE_3__.DynamicTreeCollisionProcessor(this._config);\n }\n }\n /**\n * Raycast into the scene's physics world\n * @param ray\n * @param options\n */\n rayCast(ray, options) {\n return this.collisionProcessor.rayCast(ray, options);\n }\n query(pointOrBounds) {\n // FIXME workaround TS: https://github.com/microsoft/TypeScript/issues/14107\n return this._collisionProcessor.query(pointOrBounds);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Side.ts\":\n/*!***************************!*\\\n !*** ./Collision/Side.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Side: () => (/* binding */ Side)\n/* harmony export */ });\n/**\n * An enum that describes the sides of an axis aligned box for collision\n */\nvar Side;\n(function (Side) {\n Side[\"None\"] = \"None\";\n Side[\"Top\"] = \"Top\";\n Side[\"Bottom\"] = \"Bottom\";\n Side[\"Left\"] = \"Left\";\n Side[\"Right\"] = \"Right\";\n})(Side || (Side = {}));\n(function (Side) {\n /**\n * Returns the opposite side from the current\n */\n function getOpposite(side) {\n if (side === Side.Top) {\n return Side.Bottom;\n }\n if (side === Side.Bottom) {\n return Side.Top;\n }\n if (side === Side.Left) {\n return Side.Right;\n }\n if (side === Side.Right) {\n return Side.Left;\n }\n return Side.None;\n }\n Side.getOpposite = getOpposite;\n /**\n * Given a vector, return the Side most in that direction\n */\n function fromDirection(direction) {\n if (Math.abs(direction.x) >= Math.abs(direction.y)) {\n if (direction.x <= 0) {\n return Side.Left;\n }\n return Side.Right;\n }\n if (direction.y <= 0) {\n return Side.Top;\n }\n return Side.Bottom;\n }\n Side.fromDirection = fromDirection;\n})(Side || (Side = {}));\n\n\n/***/ }),\n\n/***/ \"./Collision/SolverStrategy.ts\":\n/*!*************************************!*\\\n !*** ./Collision/SolverStrategy.ts ***!\n \\*************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SolverStrategy: () => (/* binding */ SolverStrategy)\n/* harmony export */ });\n/**\n * Possible collision resolution strategies\n *\n * The default is {@apilink SolverStrategy.Arcade} which performs simple axis aligned arcade style physics. This is useful for things\n * like platformers or top down games.\n *\n * More advanced rigid body physics are enabled by setting {@apilink SolverStrategy.Realistic} which allows for complicated\n * simulated physical interactions.\n */\nvar SolverStrategy;\n(function (SolverStrategy) {\n SolverStrategy[\"Arcade\"] = \"arcade\";\n SolverStrategy[\"Realistic\"] = \"realistic\";\n})(SolverStrategy || (SolverStrategy = {}));\n\n\n/***/ }),\n\n/***/ \"./Collision/Solver/ArcadeSolver.ts\":\n/*!******************************************!*\\\n !*** ./Collision/Solver/ArcadeSolver.ts ***!\n \\******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ArcadeSolver: () => (/* binding */ ArcadeSolver)\n/* harmony export */ });\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Events */ \"./Events.ts\");\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Side__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Side */ \"./Collision/Side.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _ContactBias__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ContactBias */ \"./Collision/Solver/ContactBias.ts\");\n\n\n\n\n\n/**\n * ArcadeSolver is the default in Excalibur. It solves collisions so that there is no overlap between contacts,\n * and negates velocity along the collision normal.\n *\n * This is usually the type of collisions used for 2D games that don't need a more realistic collision simulation.\n *\n */\nclass ArcadeSolver {\n constructor(config) {\n this.config = config;\n this.directionMap = new Map();\n this.distanceMap = new Map();\n }\n solve(contacts) {\n // Events and init\n this.preSolve(contacts);\n // Remove any canceled contacts\n contacts = contacts.filter((c) => !c.isCanceled());\n // Locate collision bias order\n let bias;\n switch (this.config.contactSolveBias) {\n case _ContactBias__WEBPACK_IMPORTED_MODULE_0__.ContactSolveBias.HorizontalFirst: {\n bias = _ContactBias__WEBPACK_IMPORTED_MODULE_0__.HorizontalFirst;\n break;\n }\n case _ContactBias__WEBPACK_IMPORTED_MODULE_0__.ContactSolveBias.VerticalFirst: {\n bias = _ContactBias__WEBPACK_IMPORTED_MODULE_0__.VerticalFirst;\n break;\n }\n default: {\n bias = _ContactBias__WEBPACK_IMPORTED_MODULE_0__.None;\n }\n }\n // Sort by bias (None, VerticalFirst, HorizontalFirst) to avoid artifacts with seams\n // Sort contacts by distance to avoid artifacts with seams\n // It's important to solve in a specific order\n contacts.sort((a, b) => {\n const aDir = this.directionMap.get(a.id);\n const bDir = this.directionMap.get(b.id);\n const aDist = this.distanceMap.get(a.id);\n const bDist = this.distanceMap.get(b.id);\n return bias[aDir] - bias[bDir] || aDist - bDist;\n });\n for (const contact of contacts) {\n // Solve position first in arcade\n this.solvePosition(contact);\n // Solve velocity second in arcade\n this.solveVelocity(contact);\n }\n // Events and any contact house-keeping the solver needs\n this.postSolve(contacts);\n return contacts;\n }\n preSolve(contacts) {\n const epsilon = 0.0001;\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n if (Math.abs(contact.mtv.x) < epsilon && Math.abs(contact.mtv.y) < epsilon) {\n // Cancel near 0 mtv collisions\n contact.cancel();\n continue;\n }\n const side = _Side__WEBPACK_IMPORTED_MODULE_1__.Side.fromDirection(contact.mtv);\n const mtv = contact.mtv.negate();\n const distance = Math.abs(contact.info.separation);\n this.distanceMap.set(contact.id, distance);\n this.directionMap.set(contact.id, side === _Side__WEBPACK_IMPORTED_MODULE_1__.Side.Left || side === _Side__WEBPACK_IMPORTED_MODULE_1__.Side.Right ? 'horizontal' : 'vertical');\n // Publish collision events on both participants\n contact.colliderA.events.emit('precollision', new _Events__WEBPACK_IMPORTED_MODULE_2__.PreCollisionEvent(contact.colliderA, contact.colliderB, side, mtv, contact));\n contact.colliderB.events.emit('precollision', new _Events__WEBPACK_IMPORTED_MODULE_2__.PreCollisionEvent(contact.colliderB, contact.colliderA, _Side__WEBPACK_IMPORTED_MODULE_1__.Side.getOpposite(side), mtv.negate(), contact));\n }\n }\n postSolve(contacts) {\n var _a, _b;\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n if (contact.isCanceled()) {\n continue;\n }\n const colliderA = contact.colliderA;\n const colliderB = contact.colliderB;\n const bodyA = (_a = colliderA.owner) === null || _a === void 0 ? void 0 : _a.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_3__.BodyComponent);\n const bodyB = (_b = colliderB.owner) === null || _b === void 0 ? void 0 : _b.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_3__.BodyComponent);\n if (bodyA && bodyB) {\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Passive || bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Passive) {\n continue;\n }\n }\n const side = _Side__WEBPACK_IMPORTED_MODULE_1__.Side.fromDirection(contact.mtv);\n const mtv = contact.mtv.negate();\n // Publish collision events on both participants\n contact.colliderA.events.emit('postcollision', new _Events__WEBPACK_IMPORTED_MODULE_2__.PostCollisionEvent(contact.colliderA, contact.colliderB, side, mtv, contact));\n contact.colliderB.events.emit('postcollision', new _Events__WEBPACK_IMPORTED_MODULE_2__.PostCollisionEvent(contact.colliderB, contact.colliderA, _Side__WEBPACK_IMPORTED_MODULE_1__.Side.getOpposite(side), mtv.negate(), contact));\n }\n }\n solvePosition(contact) {\n var _a, _b;\n const epsilon = 0.0001;\n // if bounds no longer intersect skip to the next\n // this removes jitter from overlapping/stacked solid tiles or a wall of solid tiles\n if (!contact.colliderA.bounds.overlaps(contact.colliderB.bounds, epsilon)) {\n // Cancel the contact to prevent and solving\n contact.cancel();\n return;\n }\n if (Math.abs(contact.mtv.x) < epsilon && Math.abs(contact.mtv.y) < epsilon) {\n // Cancel near 0 mtv collisions\n contact.cancel();\n return;\n }\n let mtv = contact.mtv;\n const colliderA = contact.colliderA;\n const colliderB = contact.colliderB;\n const bodyA = (_a = colliderA.owner) === null || _a === void 0 ? void 0 : _a.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_3__.BodyComponent);\n const bodyB = (_b = colliderB.owner) === null || _b === void 0 ? void 0 : _b.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_3__.BodyComponent);\n if (bodyA && bodyB) {\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Passive || bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Passive) {\n return;\n }\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Active && bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Active) {\n // split overlaps if both are Active\n mtv = mtv.scale(0.5);\n }\n // Resolve overlaps\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Active) {\n bodyA.globalPos.x -= mtv.x;\n bodyA.globalPos.y -= mtv.y;\n colliderA.update(bodyA.transform.get());\n }\n if (bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Active) {\n bodyB.globalPos.x += mtv.x;\n bodyB.globalPos.y += mtv.y;\n colliderB.update(bodyB.transform.get());\n }\n }\n }\n solveVelocity(contact) {\n var _a, _b;\n if (contact.isCanceled()) {\n return;\n }\n const colliderA = contact.colliderA;\n const colliderB = contact.colliderB;\n const bodyA = (_a = colliderA.owner) === null || _a === void 0 ? void 0 : _a.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_3__.BodyComponent);\n const bodyB = (_b = colliderB.owner) === null || _b === void 0 ? void 0 : _b.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_3__.BodyComponent);\n if (bodyA && bodyB) {\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Passive || bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Passive) {\n return;\n }\n const normal = contact.normal;\n const opposite = normal.negate();\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Active) {\n // only adjust velocity if the contact normal is opposite to the current velocity\n // this avoids catching edges on a platform when sliding off\n if (bodyA.vel.normalize().dot(opposite) < 0) {\n // Cancel out velocity opposite direction of collision normal\n const velAdj = normal.scale(normal.dot(bodyA.vel.negate()));\n bodyA.vel = bodyA.vel.add(velAdj);\n }\n }\n if (bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Active) {\n // only adjust velocity if the contact normal is opposite to the current velocity\n // this avoids catching edges on a platform\n if (bodyB.vel.normalize().dot(normal) < 0) {\n const velAdj = opposite.scale(opposite.dot(bodyB.vel.negate()));\n bodyB.vel = bodyB.vel.add(velAdj);\n }\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Solver/ContactBias.ts\":\n/*!*****************************************!*\\\n !*** ./Collision/Solver/ContactBias.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ContactSolveBias: () => (/* binding */ ContactSolveBias),\n/* harmony export */ HorizontalFirst: () => (/* binding */ HorizontalFirst),\n/* harmony export */ None: () => (/* binding */ None),\n/* harmony export */ VerticalFirst: () => (/* binding */ VerticalFirst)\n/* harmony export */ });\n/**\n * Tells the Arcade collision solver to prefer certain contacts over others\n */\nvar ContactSolveBias;\n(function (ContactSolveBias) {\n ContactSolveBias[\"None\"] = \"none\";\n ContactSolveBias[\"VerticalFirst\"] = \"vertical-first\";\n ContactSolveBias[\"HorizontalFirst\"] = \"horizontal-first\";\n})(ContactSolveBias || (ContactSolveBias = {}));\n/**\n * Vertical First contact solve bias Used by the {@apilink ArcadeSolver} to sort contacts\n */\nconst VerticalFirst = {\n vertical: 1,\n horizontal: 2\n};\n/**\n * Horizontal First contact solve bias Used by the {@apilink ArcadeSolver} to sort contacts\n */\nconst HorizontalFirst = {\n horizontal: 1,\n vertical: 2\n};\n/**\n * None value, {@apilink ArcadeSolver} sorts contacts using distance by default\n */\nconst None = {\n horizontal: 0,\n vertical: 0\n};\n\n\n/***/ }),\n\n/***/ \"./Collision/Solver/ContactConstraintPoint.ts\":\n/*!****************************************************!*\\\n !*** ./Collision/Solver/ContactConstraintPoint.ts ***!\n \\****************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ContactConstraintPoint: () => (/* binding */ ContactConstraintPoint)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n\n/**\n * Holds information about contact points, meant to be reused over multiple frames of contact\n */\nclass ContactConstraintPoint {\n constructor(point, local, contact) {\n this.point = point;\n this.local = local;\n this.contact = contact;\n /**\n * Impulse accumulated over time in normal direction\n */\n this.normalImpulse = 0;\n /**\n * Impulse accumulated over time in the tangent direction\n */\n this.tangentImpulse = 0;\n /**\n * Effective mass seen in the normal direction\n */\n this.normalMass = 0;\n /**\n * Effective mass seen in the tangent direction\n */\n this.tangentMass = 0;\n /**\n * Direction from center of mass of bodyA to contact point\n */\n this.aToContact = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\n /**\n * Direction from center of mass of bodyB to contact point\n */\n this.bToContact = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\n /**\n * Original contact velocity combined with bounciness\n */\n this.originalVelocityAndRestitution = 0;\n this.update();\n }\n /**\n * Updates the contact information\n */\n update() {\n const bodyA = this.contact.bodyA;\n const bodyB = this.contact.bodyB;\n if (bodyA && bodyB) {\n const normal = this.contact.normal;\n const tangent = this.contact.tangent;\n this.aToContact = this.point.sub(bodyA.globalPos);\n this.bToContact = this.point.sub(bodyB.globalPos);\n const aToContactNormal = this.aToContact.cross(normal);\n const bToContactNormal = this.bToContact.cross(normal);\n this.normalMass =\n bodyA.inverseMass +\n bodyB.inverseMass +\n bodyA.inverseInertia * aToContactNormal * aToContactNormal +\n bodyB.inverseInertia * bToContactNormal * bToContactNormal;\n const aToContactTangent = this.aToContact.cross(tangent);\n const bToContactTangent = this.bToContact.cross(tangent);\n this.tangentMass =\n bodyA.inverseMass +\n bodyB.inverseMass +\n bodyA.inverseInertia * aToContactTangent * aToContactTangent +\n bodyB.inverseInertia * bToContactTangent * bToContactTangent;\n }\n return this;\n }\n /**\n * Returns the relative velocity between bodyA and bodyB\n */\n getRelativeVelocity() {\n const bodyA = this.contact.bodyA;\n const bodyB = this.contact.bodyB;\n if (bodyA && bodyB) {\n // Relative velocity in linear terms\n // Angular to linear velocity formula -> omega = velocity/radius so omega x radius = velocity\n const velA = bodyA.vel.add(_Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.cross(bodyA.angularVelocity, this.aToContact));\n const velB = bodyB.vel.add(_Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.cross(bodyB.angularVelocity, this.bToContact));\n return velB.sub(velA);\n }\n return _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Solver/RealisticSolver.ts\":\n/*!*********************************************!*\\\n !*** ./Collision/Solver/RealisticSolver.ts ***!\n \\*********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RealisticSolver: () => (/* binding */ RealisticSolver)\n/* harmony export */ });\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Events */ \"./Events.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _ContactConstraintPoint__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ContactConstraintPoint */ \"./Collision/Solver/ContactConstraintPoint.ts\");\n/* harmony import */ var _Side__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Side */ \"./Collision/Side.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Colliders_CollisionJumpTable__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Colliders/CollisionJumpTable */ \"./Collision/Colliders/CollisionJumpTable.ts\");\n\n\n\n\n\n\n\nclass RealisticSolver {\n constructor(config) {\n this.config = config;\n this.lastFrameContacts = new Map();\n // map contact id to contact points\n this.idToContactConstraint = new Map();\n }\n getContactConstraints(id) {\n var _a;\n return (_a = this.idToContactConstraint.get(id)) !== null && _a !== void 0 ? _a : [];\n }\n solve(contacts) {\n // Events and init\n this.preSolve(contacts);\n // Remove any canceled contacts\n contacts = contacts.filter((c) => !c.isCanceled());\n // Solve velocity first\n this.solveVelocity(contacts);\n // Solve position last because non-overlap is the most important\n this.solvePosition(contacts);\n // Events and any contact house-keeping the solver needs\n this.postSolve(contacts);\n return contacts;\n }\n preSolve(contacts) {\n var _a, _b, _c;\n const epsilon = 0.0001;\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n if (Math.abs(contact.mtv.x) < epsilon && Math.abs(contact.mtv.y) < epsilon) {\n // Cancel near 0 mtv collisions\n contact.cancel();\n continue;\n }\n // Publish collision events on both participants\n const side = _Side__WEBPACK_IMPORTED_MODULE_0__.Side.fromDirection(contact.mtv);\n contact.colliderA.events.emit('precollision', new _Events__WEBPACK_IMPORTED_MODULE_1__.PreCollisionEvent(contact.colliderA, contact.colliderB, side, contact.mtv, contact));\n contact.colliderA.events.emit('beforecollisionresolve', new _Events__WEBPACK_IMPORTED_MODULE_1__.CollisionPreSolveEvent(contact.colliderA, contact.colliderB, side, contact.mtv, contact));\n contact.colliderB.events.emit('precollision', new _Events__WEBPACK_IMPORTED_MODULE_1__.PreCollisionEvent(contact.colliderB, contact.colliderA, _Side__WEBPACK_IMPORTED_MODULE_0__.Side.getOpposite(side), contact.mtv.negate(), contact));\n contact.colliderB.events.emit('beforecollisionresolve', new _Events__WEBPACK_IMPORTED_MODULE_1__.CollisionPreSolveEvent(contact.colliderB, contact.colliderA, _Side__WEBPACK_IMPORTED_MODULE_0__.Side.getOpposite(side), contact.mtv.negate(), contact));\n // Match awake state for sleeping\n contact.matchAwake();\n }\n // Keep track of contacts that done\n const finishedContactIds = Array.from(this.idToContactConstraint.keys());\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n // Remove all current contacts that are not done\n const index = finishedContactIds.indexOf(contact.id);\n if (index > -1) {\n finishedContactIds.splice(index, 1);\n }\n const contactPoints = (_a = this.idToContactConstraint.get(contact.id)) !== null && _a !== void 0 ? _a : [];\n let pointIndex = 0;\n const bodyA = contact.bodyA;\n const bodyB = contact.bodyB;\n if (bodyA && bodyB) {\n for (let j = 0; j < contact.points.length; j++) {\n const point = contact.points[j];\n const normal = contact.normal;\n const tangent = contact.tangent;\n const aToContact = point.sub(bodyA.globalPos);\n const bToContact = point.sub(bodyB.globalPos);\n const aToContactNormal = aToContact.cross(normal);\n const bToContactNormal = bToContact.cross(normal);\n const normalMass = bodyA.inverseMass +\n bodyB.inverseMass +\n bodyA.inverseInertia * aToContactNormal * aToContactNormal +\n bodyB.inverseInertia * bToContactNormal * bToContactNormal;\n const aToContactTangent = aToContact.cross(tangent);\n const bToContactTangent = bToContact.cross(tangent);\n const tangentMass = bodyA.inverseMass +\n bodyB.inverseMass +\n bodyA.inverseInertia * aToContactTangent * aToContactTangent +\n bodyB.inverseInertia * bToContactTangent * bToContactTangent;\n // Preserve normal/tangent impulse by re-using the contact point if it's close\n if (contactPoints[pointIndex] && ((_c = (_b = contactPoints[pointIndex]) === null || _b === void 0 ? void 0 : _b.point) === null || _c === void 0 ? void 0 : _c.squareDistance(point)) < 4) {\n contactPoints[pointIndex].point = point;\n contactPoints[pointIndex].local = contact.localPoints[pointIndex];\n }\n else {\n // new contact if it's not close or doesn't exist\n contactPoints[pointIndex] = new _ContactConstraintPoint__WEBPACK_IMPORTED_MODULE_2__.ContactConstraintPoint(point, contact.localPoints[pointIndex], contact);\n }\n // Update contact point calculations\n contactPoints[pointIndex].aToContact = aToContact;\n contactPoints[pointIndex].bToContact = bToContact;\n contactPoints[pointIndex].normalMass = 1.0 / normalMass;\n contactPoints[pointIndex].tangentMass = 1.0 / tangentMass;\n // Calculate relative velocity before solving to accurately do restitution\n const restitution = bodyA.bounciness > bodyB.bounciness ? bodyA.bounciness : bodyB.bounciness;\n const relativeVelocity = contact.normal.dot(contactPoints[pointIndex].getRelativeVelocity());\n contactPoints[pointIndex].originalVelocityAndRestitution = 0;\n if (relativeVelocity < -0.1) {\n // TODO what's a good threshold here?\n contactPoints[pointIndex].originalVelocityAndRestitution = -restitution * relativeVelocity;\n }\n pointIndex++;\n }\n }\n this.idToContactConstraint.set(contact.id, contactPoints);\n }\n // Clean up any contacts that did not occur last frame\n for (const id of finishedContactIds) {\n this.idToContactConstraint.delete(id);\n }\n // Warm contacts with accumulated impulse\n // Useful for tall stacks\n if (this.config.warmStart) {\n this.warmStart(contacts);\n }\n else {\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n const contactPoints = this.getContactConstraints(contact.id);\n for (const point of contactPoints) {\n point.normalImpulse = 0;\n point.tangentImpulse = 0;\n }\n }\n }\n }\n postSolve(contacts) {\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n const bodyA = contact.bodyA;\n const bodyB = contact.bodyB;\n if (bodyA && bodyB) {\n // Skip post solve for active+passive collisions\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_3__.CollisionType.Passive || bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_3__.CollisionType.Passive) {\n continue;\n }\n // Update motion values for sleeping\n bodyA.updateMotion();\n bodyB.updateMotion();\n }\n // Publish collision events on both participants\n const side = _Side__WEBPACK_IMPORTED_MODULE_0__.Side.fromDirection(contact.mtv);\n contact.colliderA.events.emit('postcollision', new _Events__WEBPACK_IMPORTED_MODULE_1__.PostCollisionEvent(contact.colliderA, contact.colliderB, side, contact.mtv, contact));\n contact.colliderA.events.emit('aftercollisionresolve', new _Events__WEBPACK_IMPORTED_MODULE_1__.CollisionPostSolveEvent(contact.colliderA, contact.colliderB, side, contact.mtv, contact));\n contact.colliderB.events.emit('postcollision', new _Events__WEBPACK_IMPORTED_MODULE_1__.PostCollisionEvent(contact.colliderB, contact.colliderA, _Side__WEBPACK_IMPORTED_MODULE_0__.Side.getOpposite(side), contact.mtv.negate(), contact));\n contact.colliderB.events.emit('aftercollisionresolve', new _Events__WEBPACK_IMPORTED_MODULE_1__.CollisionPostSolveEvent(contact.colliderB, contact.colliderA, _Side__WEBPACK_IMPORTED_MODULE_0__.Side.getOpposite(side), contact.mtv.negate(), contact));\n }\n // Store contacts\n this.lastFrameContacts.clear();\n for (let i = 0; i < contacts.length; i++) {\n const c = contacts[i];\n this.lastFrameContacts.set(c.id, c);\n }\n }\n /**\n * Warm up body's based on previous frame contact points\n * @param contacts\n */\n warmStart(contacts) {\n var _a;\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n const bodyA = contact.bodyA;\n const bodyB = contact.bodyB;\n if (bodyA && bodyB) {\n const contactPoints = (_a = this.idToContactConstraint.get(contact.id)) !== null && _a !== void 0 ? _a : [];\n for (const point of contactPoints) {\n if (this.config.warmStart) {\n const normalImpulse = contact.normal.scale(point.normalImpulse);\n const tangentImpulse = contact.tangent.scale(point.tangentImpulse);\n const impulse = normalImpulse.add(tangentImpulse);\n bodyA.applyImpulse(point.point, impulse.negate());\n bodyB.applyImpulse(point.point, impulse);\n }\n else {\n point.normalImpulse = 0;\n point.tangentImpulse = 0;\n }\n }\n }\n }\n }\n /**\n * Iteratively solve the position overlap constraint\n * @param contacts\n */\n solvePosition(contacts) {\n var _a;\n for (let i = 0; i < this.config.positionIterations; i++) {\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n const bodyA = contact.bodyA;\n const bodyB = contact.bodyB;\n if (bodyA && bodyB) {\n // Skip solving active+passive\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_3__.CollisionType.Passive || bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_3__.CollisionType.Passive) {\n continue;\n }\n const constraints = (_a = this.idToContactConstraint.get(contact.id)) !== null && _a !== void 0 ? _a : [];\n for (const point of constraints) {\n const normal = contact.normal;\n const separation = _Colliders_CollisionJumpTable__WEBPACK_IMPORTED_MODULE_4__.CollisionJumpTable.FindContactSeparation(contact, point.local);\n const steeringConstant = this.config.steeringFactor; //0.2;\n const maxCorrection = -5;\n const slop = this.config.slop; //1;\n // Clamp to avoid over-correction\n // Remember that we are shooting for 0 overlap in the end\n const steeringForce = (0,_Math_util__WEBPACK_IMPORTED_MODULE_5__.clamp)(steeringConstant * (separation + slop), maxCorrection, 0);\n const impulse = normal.scale(-steeringForce * point.normalMass);\n // This is a pseudo impulse, meaning we aren't doing a real impulse calculation\n // We adjust position and rotation instead of doing the velocity\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_3__.CollisionType.Active) {\n // TODO make applyPseudoImpulse function?\n const impulseForce = impulse.negate().scale(bodyA.inverseMass);\n if (bodyA.limitDegreeOfFreedom.includes(_BodyComponent__WEBPACK_IMPORTED_MODULE_6__.DegreeOfFreedom.X)) {\n impulseForce.x = 0;\n }\n if (bodyA.limitDegreeOfFreedom.includes(_BodyComponent__WEBPACK_IMPORTED_MODULE_6__.DegreeOfFreedom.Y)) {\n impulseForce.y = 0;\n }\n bodyA.globalPos = bodyA.globalPos.add(impulseForce);\n if (!bodyA.limitDegreeOfFreedom.includes(_BodyComponent__WEBPACK_IMPORTED_MODULE_6__.DegreeOfFreedom.Rotation)) {\n bodyA.rotation -= point.aToContact.cross(impulse) * bodyA.inverseInertia;\n }\n }\n if (bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_3__.CollisionType.Active) {\n const impulseForce = impulse.scale(bodyB.inverseMass);\n if (bodyB.limitDegreeOfFreedom.includes(_BodyComponent__WEBPACK_IMPORTED_MODULE_6__.DegreeOfFreedom.X)) {\n impulseForce.x = 0;\n }\n if (bodyB.limitDegreeOfFreedom.includes(_BodyComponent__WEBPACK_IMPORTED_MODULE_6__.DegreeOfFreedom.Y)) {\n impulseForce.y = 0;\n }\n bodyB.globalPos = bodyB.globalPos.add(impulseForce);\n if (!bodyB.limitDegreeOfFreedom.includes(_BodyComponent__WEBPACK_IMPORTED_MODULE_6__.DegreeOfFreedom.Rotation)) {\n bodyB.rotation += point.bToContact.cross(impulse) * bodyB.inverseInertia;\n }\n }\n }\n }\n }\n }\n }\n solveVelocity(contacts) {\n var _a;\n for (let i = 0; i < this.config.velocityIterations; i++) {\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n const bodyA = contact.bodyA;\n const bodyB = contact.bodyB;\n if (bodyA && bodyB) {\n // Skip solving active+passive\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_3__.CollisionType.Passive || bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_3__.CollisionType.Passive) {\n continue;\n }\n const friction = Math.min(bodyA.friction, bodyB.friction);\n const constraints = (_a = this.idToContactConstraint.get(contact.id)) !== null && _a !== void 0 ? _a : [];\n // Friction constraint\n for (const point of constraints) {\n const relativeVelocity = point.getRelativeVelocity();\n // Negate velocity in tangent direction to simulate friction\n const tangentVelocity = -relativeVelocity.dot(contact.tangent);\n let impulseDelta = tangentVelocity * point.tangentMass;\n // Clamping based in Erin Catto's GDC 2006 talk\n // Correct clamping https://github.com/erincatto/box2d-lite/blob/master/docs/GDC2006_Catto_Erin_PhysicsTutorial.pdf\n // Accumulated fiction impulse is always between -uMaxFriction < dT < uMaxFriction\n // But deltas can vary\n const maxFriction = friction * point.normalImpulse;\n const newImpulse = (0,_Math_util__WEBPACK_IMPORTED_MODULE_5__.clamp)(point.tangentImpulse + impulseDelta, -maxFriction, maxFriction);\n impulseDelta = newImpulse - point.tangentImpulse;\n point.tangentImpulse = newImpulse;\n const impulse = contact.tangent.scale(impulseDelta);\n bodyA.applyImpulse(point.point, impulse.negate());\n bodyB.applyImpulse(point.point, impulse);\n }\n // Bounce constraint\n for (const point of constraints) {\n // Need to recalc relative velocity because the previous step could have changed vel\n const relativeVelocity = point.getRelativeVelocity();\n // Compute impulse in normal direction\n const normalVelocity = relativeVelocity.dot(contact.normal);\n // Per Erin it is a mistake to apply the restitution inside the iteration\n // From Erin Catto's Box2D we keep original contact velocity and adjust by small impulses\n let impulseDelta = -point.normalMass * (normalVelocity - point.originalVelocityAndRestitution);\n // Clamping based in Erin Catto's GDC 2014 talk\n // Accumulated impulse stored in the contact is always positive (dV > 0)\n // But deltas can be negative\n const newImpulse = Math.max(point.normalImpulse + impulseDelta, 0);\n impulseDelta = newImpulse - point.normalImpulse;\n point.normalImpulse = newImpulse;\n const impulse = contact.normal.scale(impulseDelta);\n bodyA.applyImpulse(point.point, impulse.negate());\n bodyB.applyImpulse(point.point, impulse);\n }\n }\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Color.ts\":\n/*!******************!*\\\n !*** ./Color.ts ***!\n \\******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Color: () => (/* binding */ Color)\n/* harmony export */ });\n/**\n * Provides standard colors (e.g. {@apilink Color.Black})\n * but you can also create custom colors using RGB, HSL, or Hex. Also provides\n * useful color operations like {@apilink Color.lighten}, {@apilink Color.darken}, and more.\n */\nclass Color {\n /**\n * Creates a new instance of Color from an r, g, b, a\n * @param r The red component of color (0-255)\n * @param g The green component of color (0-255)\n * @param b The blue component of color (0-255)\n * @param a The alpha component of color (0-1.0)\n */\n constructor(r, g, b, a) {\n this.r = r;\n this.g = g;\n this.b = b;\n this.a = a != null ? a : 1;\n }\n /**\n * Creates a new instance of Color from an r, g, b, a\n * @param r The red component of color (0-255)\n * @param g The green component of color (0-255)\n * @param b The blue component of color (0-255)\n * @param a The alpha component of color (0-1.0)\n */\n static fromRGB(r, g, b, a) {\n return new Color(r, g, b, a);\n }\n /**\n * Creates a new instance of Color from a rgb string\n * @param string CSS color string of the form rgba(255, 255, 255, 1) or rgb(255, 255, 255)\n */\n static fromRGBString(string) {\n const rgbaRegEx = /^rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*(\\d+(?:\\.\\d+)?))?\\)/i;\n let match = null;\n if ((match = string.match(rgbaRegEx))) {\n const r = parseInt(match[1], 10);\n const g = parseInt(match[2], 10);\n const b = parseInt(match[3], 10);\n let a = 1;\n if (match[4]) {\n a = parseFloat(match[4]);\n }\n return new Color(r, g, b, a);\n }\n else {\n throw new Error('Invalid rgb/a string: ' + string);\n }\n }\n /**\n * Creates a new instance of Color from a hex string\n * @param hex CSS color string of the form #ffffff, the alpha component is optional\n */\n static fromHex(hex) {\n const hexRegEx = /^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})?$/i;\n let match = null;\n if ((match = hex.match(hexRegEx))) {\n const r = parseInt(match[1], 16);\n const g = parseInt(match[2], 16);\n const b = parseInt(match[3], 16);\n let a = 1;\n if (match[4]) {\n a = parseInt(match[4], 16) / 255;\n }\n return new Color(r, g, b, a);\n }\n else {\n throw new Error('Invalid hex string: ' + hex);\n }\n }\n /**\n * Creates a new instance of Color from hsla values\n * @param h Hue is represented [0-1]\n * @param s Saturation is represented [0-1]\n * @param l Luminance is represented [0-1]\n * @param a Alpha is represented [0-1]\n */\n static fromHSL(h, s, l, a = 1.0) {\n const temp = new HSLColor(h, s, l, a);\n return temp.toRGBA();\n }\n /**\n * Lightens the current color by a specified amount\n * @param factor The amount to lighten by [0-1]\n */\n lighten(factor = 0.1) {\n const temp = HSLColor.fromRGBA(this.r, this.g, this.b, this.a);\n temp.l += (1 - temp.l) * factor;\n return temp.toRGBA();\n }\n /**\n * Darkens the current color by a specified amount\n * @param factor The amount to darken by [0-1]\n */\n darken(factor = 0.1) {\n const temp = HSLColor.fromRGBA(this.r, this.g, this.b, this.a);\n temp.l -= temp.l * factor;\n return temp.toRGBA();\n }\n /**\n * Saturates the current color by a specified amount\n * @param factor The amount to saturate by [0-1]\n */\n saturate(factor = 0.1) {\n const temp = HSLColor.fromRGBA(this.r, this.g, this.b, this.a);\n temp.s += temp.s * factor;\n return temp.toRGBA();\n }\n /**\n * Desaturates the current color by a specified amount\n * @param factor The amount to desaturate by [0-1]\n */\n desaturate(factor = 0.1) {\n const temp = HSLColor.fromRGBA(this.r, this.g, this.b, this.a);\n temp.s -= temp.s * factor;\n return temp.toRGBA();\n }\n /**\n * Multiplies a color by another, results in a darker color\n * @param color The other color\n */\n multiply(color) {\n const newR = (((color.r / 255) * this.r) / 255) * 255;\n const newG = (((color.g / 255) * this.g) / 255) * 255;\n const newB = (((color.b / 255) * this.b) / 255) * 255;\n const newA = color.a * this.a;\n return new Color(newR, newG, newB, newA);\n }\n /**\n * Screens a color by another, results in a lighter color\n * @param color The other color\n */\n screen(color) {\n const color1 = color.invert();\n const color2 = color.invert();\n return color1.multiply(color2).invert();\n }\n /**\n * Inverts the current color\n */\n invert() {\n return new Color(255 - this.r, 255 - this.g, 255 - this.b, 1.0 - this.a);\n }\n /**\n * Averages the current color with another\n * @param color The other color\n */\n average(color) {\n const newR = (color.r + this.r) / 2;\n const newG = (color.g + this.g) / 2;\n const newB = (color.b + this.b) / 2;\n const newA = (color.a + this.a) / 2;\n return new Color(newR, newG, newB, newA);\n }\n equal(color) {\n return this.toString() === color.toString();\n }\n /**\n * Returns a CSS string representation of a color.\n * @param format Color representation, accepts: rgb, hsl, or hex\n */\n toString(format = 'rgb') {\n switch (format) {\n case 'rgb':\n return this.toRGBA();\n case 'hsl':\n return this.toHSLA();\n case 'hex':\n return this.toHex();\n default:\n throw new Error('Invalid Color format');\n }\n }\n /**\n * Returns Hex Value of a color component\n * @param c color component\n * @see https://stackoverflow.com/questions/5623838/rgb-to-hex-and-hex-to-rgb\n */\n _componentToHex(c) {\n // Handle negative and fractional numbers\n const hex = Math.max(Math.round(c), 0).toString(16);\n return hex.length === 1 ? '0' + hex : hex;\n }\n /**\n * Return Hex representation of a color.\n */\n toHex() {\n let hexRepresentation = '#' + this._componentToHex(this.r) + this._componentToHex(this.g) + this._componentToHex(this.b);\n if (this.a !== 1) {\n hexRepresentation += this._componentToHex(this.a * 255);\n }\n return hexRepresentation;\n }\n /**\n * Return RGBA representation of a color.\n */\n toRGBA() {\n const result = String(this.r.toFixed(0)) + ', ' + String(this.g.toFixed(0)) + ', ' + String(this.b.toFixed(0));\n if (this.a !== undefined || this.a !== null) {\n return 'rgba(' + result + ', ' + String(this.a) + ')';\n }\n return 'rgb(' + result + ')';\n }\n /**\n * Return HSLA representation of a color.\n */\n toHSLA() {\n return HSLColor.fromRGBA(this.r, this.g, this.b, this.a).toString();\n }\n /**\n * Returns a CSS string representation of a color.\n */\n fillStyle() {\n return this.toString();\n }\n /**\n * Returns a clone of the current color.\n */\n clone(dest) {\n const result = dest || new Color(this.r, this.g, this.b, this.a);\n result.r = this.r;\n result.g = this.g;\n result.b = this.b;\n result.a = this.a;\n return result;\n }\n /**\n * Black (#000000)\n */\n static get Black() {\n return Color.fromHex('#000000');\n }\n /**\n * White (#FFFFFF)\n */\n static get White() {\n return Color.fromHex('#FFFFFF');\n }\n /**\n * Gray (#808080)\n */\n static get Gray() {\n return Color.fromHex('#808080');\n }\n /**\n * Light gray (#D3D3D3)\n */\n static get LightGray() {\n return Color.fromHex('#D3D3D3');\n }\n /**\n * Dark gray (#A9A9A9)\n */\n static get DarkGray() {\n return Color.fromHex('#A9A9A9');\n }\n /**\n * Yellow (#FFFF00)\n */\n static get Yellow() {\n return Color.fromHex('#FFFF00');\n }\n /**\n * Orange (#FFA500)\n */\n static get Orange() {\n return Color.fromHex('#FFA500');\n }\n /**\n * Red (#FF0000)\n */\n static get Red() {\n return Color.fromHex('#FF0000');\n }\n /**\n * Vermilion (#FF5B31)\n */\n static get Vermilion() {\n return Color.fromHex('#FF5B31');\n }\n /**\n * Rose (#FF007F)\n */\n static get Rose() {\n return Color.fromHex('#FF007F');\n }\n /**\n * Pink (#FFC0CB)\n */\n static get Pink() {\n return Color.fromHex('#FFC0CB');\n }\n /**\n * Magenta (#FF00FF)\n */\n static get Magenta() {\n return Color.fromHex('#FF00FF');\n }\n /**\n * Violet (#7F00FF)\n */\n static get Violet() {\n return Color.fromHex('#7F00FF');\n }\n /**\n * Purple (#800080)\n */\n static get Purple() {\n return Color.fromHex('#800080');\n }\n /**\n * Blue (#0000FF)\n */\n static get Blue() {\n return Color.fromHex('#0000FF');\n }\n /**\n * Azure (#007FFF)\n */\n static get Azure() {\n return Color.fromHex('#007FFF');\n }\n /**\n * Cyan (#00FFFF)\n */\n static get Cyan() {\n return Color.fromHex('#00FFFF');\n }\n /**\n * Viridian (#59978F)\n */\n static get Viridian() {\n return Color.fromHex('#59978F');\n }\n /**\n * Teal (#008080)\n */\n static get Teal() {\n return Color.fromHex('#008080');\n }\n /**\n * Green (#00FF00)\n */\n static get Green() {\n return Color.fromHex('#00FF00');\n }\n /**\n * Chartreuse (#7FFF00)\n */\n static get Chartreuse() {\n return Color.fromHex('#7FFF00');\n }\n /**\n * Transparent (#FFFFFF00)\n */\n static get Transparent() {\n return Color.fromHex('#FFFFFF00');\n }\n /**\n * ExcaliburBlue (#176BAA)\n */\n static get ExcaliburBlue() {\n return Color.fromHex('#176BAA');\n }\n /**\n * Brown (#964B00)\n */\n static get Brown() {\n return Color.fromHex('#964B00');\n }\n}\n/**\n * Internal HSL Color representation\n *\n * http://en.wikipedia.org/wiki/HSL_and_HSV\n * http://axonflux.com/handy-rgb-to-hsl-and-rgb-to-hsv-color-model-c\n */\nclass HSLColor {\n constructor(h, s, l, a) {\n this.h = h;\n this.s = s;\n this.l = l;\n this.a = a;\n }\n static hue2rgb(p, q, t) {\n if (t < 0) {\n t += 1;\n }\n if (t > 1) {\n t -= 1;\n }\n if (t < 1 / 6) {\n return p + (q - p) * 6 * t;\n }\n if (t < 1 / 2) {\n return q;\n }\n if (t < 2 / 3) {\n return p + (q - p) * (2 / 3 - t) * 6;\n }\n return p;\n }\n static fromRGBA(r, g, b, a) {\n r /= 255;\n g /= 255;\n b /= 255;\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h, s;\n const l = (max + min) / 2;\n if (max === min) {\n h = s = 0; // achromatic\n }\n else {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n h /= 6;\n }\n return new HSLColor(h, s, l, a);\n }\n toRGBA() {\n let r, g, b;\n if (this.s === 0) {\n r = g = b = this.l; // achromatic\n }\n else {\n const q = this.l < 0.5 ? this.l * (1 + this.s) : this.l + this.s - this.l * this.s;\n const p = 2 * this.l - q;\n r = HSLColor.hue2rgb(p, q, this.h + 1 / 3);\n g = HSLColor.hue2rgb(p, q, this.h);\n b = HSLColor.hue2rgb(p, q, this.h - 1 / 3);\n }\n return new Color(r * 255, g * 255, b * 255, this.a);\n }\n toString() {\n const h = this.h.toFixed(0), s = this.s.toFixed(0), l = this.l.toFixed(0), a = this.a.toFixed(0);\n return `hsla(${h}, ${s}, ${l}, ${a})`;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Context.ts\":\n/*!********************!*\\\n !*** ./Context.ts ***!\n \\********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ createContext: () => (/* binding */ createContext),\n/* harmony export */ useContext: () => (/* binding */ useContext)\n/* harmony export */ });\n/**\n * Creates a injectable context that can be retrieved later with `useContext(context)`\n *\n * Example\n * ```typescript\n *\n * const AppContext = createContext({some: 'value'});\n * context.scope(val, () => {\n * const value = useContext(AppContext);\n * })\n *\n * ```\n */\nfunction createContext() {\n const ctx = {\n scope: (value, cb) => {\n const old = ctx.value;\n ctx.value = value;\n try {\n return cb();\n }\n catch (e) {\n throw e;\n }\n finally {\n ctx.value = old;\n }\n },\n value: undefined\n };\n return ctx;\n}\n/**\n * Retrieves the value from the current context\n */\nfunction useContext(context) {\n return context.value;\n}\n\n\n/***/ }),\n\n/***/ \"./Debug/DebugConfig.ts\":\n/*!******************************!*\\\n !*** ./Debug/DebugConfig.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DebugConfig: () => (/* binding */ DebugConfig),\n/* harmony export */ FrameStats: () => (/* binding */ FrameStats),\n/* harmony export */ PhysicsStats: () => (/* binding */ PhysicsStats)\n/* harmony export */ });\n/* harmony import */ var _DebugFlags__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./DebugFlags */ \"./Debug/DebugFlags.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n\n\n/**\n * Debug statistics and flags for Excalibur. If polling these values, it would be\n * best to do so on the `postupdate` event for {@apilink Engine}, after all values have been\n * updated during a frame.\n */\nclass DebugConfig {\n constructor(engine) {\n /**\n * Performance statistics\n */\n this.stats = {\n /**\n * Current frame statistics. Engine reuses this instance, use {@apilink FrameStats.clone} to copy frame stats.\n * Best accessed on {@apilink postframe} event. See {@apilink FrameStats}\n */\n currFrame: new FrameStats(),\n /**\n * Previous frame statistics. Engine reuses this instance, use {@apilink FrameStats.clone} to copy frame stats.\n * Best accessed on {@apilink preframe} event. Best inspected on engine event `preframe`. See {@apilink FrameStats}\n */\n prevFrame: new FrameStats()\n };\n /**\n * Filter debug context to named entities or entity ids\n */\n this.filter = {\n /**\n * Toggle filter on or off (default off) must be on for DebugDraw to use filters\n */\n useFilter: false,\n /**\n * Query for entities by name, if the entity name contains `nameQuery` it will be included\n */\n nameQuery: '',\n /**\n * Query for Entity ids, if the id matches it will be included\n */\n ids: []\n };\n /**\n * Entity debug settings\n */\n this.entity = {\n showAll: false,\n showId: false,\n showName: false\n };\n /**\n * Transform component debug settings\n */\n this.transform = {\n showAll: false,\n debugZIndex: 10000000,\n showPosition: false,\n showPositionLabel: false,\n positionColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Yellow,\n showZIndex: false,\n showScale: false,\n scaleColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Green,\n showRotation: false,\n rotationColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Blue\n };\n /**\n * Graphics component debug settings\n */\n this.graphics = {\n showAll: false,\n showBounds: false,\n boundsColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Yellow\n };\n /**\n * Collider component debug settings\n */\n this.collider = {\n showAll: false,\n showBounds: false,\n boundsColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Blue,\n showOwner: false,\n showGeometry: true,\n geometryColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Green,\n geometryLineWidth: 1,\n geometryPointSize: 0.5\n };\n /**\n * Physics simulation debug settings\n */\n this.physics = {\n showAll: false,\n showBroadphaseSpacePartitionDebug: false,\n showCollisionNormals: false,\n collisionNormalColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Cyan,\n showCollisionContacts: true,\n contactSize: 2,\n collisionContactColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Red\n };\n /**\n * Motion component debug settings\n */\n this.motion = {\n showAll: false,\n showVelocity: false,\n velocityColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Yellow,\n showAcceleration: false,\n accelerationColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Red\n };\n /**\n * Body component debug settings\n */\n this.body = {\n showAll: false,\n showCollisionGroup: false,\n showCollisionType: false,\n showSleeping: false,\n showMotion: false,\n showMass: false\n };\n /**\n * Camera debug settings\n */\n this.camera = {\n showAll: false,\n showFocus: false,\n focusColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Red,\n showZoom: false\n };\n this.tilemap = {\n showAll: false,\n showGrid: false,\n gridColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Red,\n gridWidth: 0.5,\n showSolidBounds: false,\n solidBoundsColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.fromHex('#8080807F'), // grayish\n showColliderGeometry: true\n };\n this.isometric = {\n showAll: false,\n showPosition: false,\n positionColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Yellow,\n positionSize: 1,\n showGrid: false,\n gridColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Red,\n gridWidth: 1,\n showColliderGeometry: true\n };\n this._engine = engine;\n this.colorBlindMode = new _DebugFlags__WEBPACK_IMPORTED_MODULE_1__.ColorBlindFlags(this._engine);\n }\n /**\n * Switch the current excalibur clock with the {@apilink TestClock} and return\n * it in the same running state.\n *\n * This is useful when you need to debug frame by frame.\n */\n useTestClock() {\n const clock = this._engine.clock;\n const wasRunning = clock.isRunning();\n clock.stop();\n const testClock = clock.toTestClock();\n if (wasRunning) {\n testClock.start();\n }\n this._engine.clock = testClock;\n return testClock;\n }\n /**\n * Switch the current excalibur clock with the {@apilink StandardClock} and\n * return it in the same running state.\n *\n * This is useful when you need to switch back to normal mode after\n * debugging.\n */\n useStandardClock() {\n const currentClock = this._engine.clock;\n const wasRunning = currentClock.isRunning();\n currentClock.stop();\n const standardClock = currentClock.toStandardClock();\n if (wasRunning) {\n standardClock.start();\n }\n this._engine.clock = standardClock;\n return standardClock;\n }\n}\n/**\n * Implementation of a frame's stats. Meant to have values copied via {@apilink FrameStats.reset}, avoid\n * creating instances of this every frame.\n */\nclass FrameStats {\n constructor() {\n this._id = 0;\n this._elapsedMs = 0;\n this._fps = 0;\n this._actorStats = {\n alive: 0,\n killed: 0,\n ui: 0,\n get remaining() {\n return this.alive - this.killed;\n },\n get total() {\n return this.remaining + this.ui;\n }\n };\n this._durationStats = {\n update: 0,\n draw: 0,\n get total() {\n return this.update + this.draw;\n }\n };\n this._physicsStats = new PhysicsStats();\n this._graphicsStats = {\n drawCalls: 0,\n drawnImages: 0\n };\n }\n /**\n * Zero out values or clone other IFrameStat stats. Allows instance reuse.\n * @param [otherStats] Optional stats to clone\n */\n reset(otherStats) {\n if (otherStats) {\n this.id = otherStats.id;\n this.elapsedMs = otherStats.elapsedMs;\n this.fps = otherStats.fps;\n this.actors.alive = otherStats.actors.alive;\n this.actors.killed = otherStats.actors.killed;\n this.actors.ui = otherStats.actors.ui;\n this.duration.update = otherStats.duration.update;\n this.duration.draw = otherStats.duration.draw;\n this._physicsStats.reset(otherStats.physics);\n this.graphics.drawCalls = otherStats.graphics.drawCalls;\n this.graphics.drawnImages = otherStats.graphics.drawnImages;\n }\n else {\n this.id = this.elapsedMs = this.fps = 0;\n this.actors.alive = this.actors.killed = this.actors.ui = 0;\n this.duration.update = this.duration.draw = 0;\n this._physicsStats.reset();\n this.graphics.drawnImages = this.graphics.drawCalls = 0;\n }\n }\n /**\n * Provides a clone of this instance.\n */\n clone() {\n const fs = new FrameStats();\n fs.reset(this);\n return fs;\n }\n /**\n * Gets the frame's id\n */\n get id() {\n return this._id;\n }\n /**\n * Sets the frame's id\n */\n set id(value) {\n this._id = value;\n }\n /**\n * Gets the frame's delta (time since last frame)\n */\n get elapsedMs() {\n return this._elapsedMs;\n }\n /**\n * Sets the frame's delta (time since last frame). Internal use only.\n * @internal\n */\n set elapsedMs(value) {\n this._elapsedMs = value;\n }\n /**\n * Gets the frame's frames-per-second (FPS)\n */\n get fps() {\n return this._fps;\n }\n /**\n * Sets the frame's frames-per-second (FPS). Internal use only.\n * @internal\n */\n set fps(value) {\n this._fps = value;\n }\n /**\n * Gets the frame's actor statistics\n */\n get actors() {\n return this._actorStats;\n }\n /**\n * Gets the frame's duration statistics\n */\n get duration() {\n return this._durationStats;\n }\n /**\n * Gets the frame's physics statistics\n */\n get physics() {\n return this._physicsStats;\n }\n /**\n * Gets the frame's graphics statistics\n */\n get graphics() {\n return this._graphicsStats;\n }\n}\nclass PhysicsStats {\n constructor() {\n this._pairs = 0;\n this._collisions = 0;\n this._contacts = new Map();\n this._fastBodies = 0;\n this._fastBodyCollisions = 0;\n this._broadphase = 0;\n this._narrowphase = 0;\n }\n /**\n * Zero out values or clone other IPhysicsStats stats. Allows instance reuse.\n * @param [otherStats] Optional stats to clone\n */\n reset(otherStats) {\n if (otherStats) {\n this.pairs = otherStats.pairs;\n this.collisions = otherStats.collisions;\n this.contacts = otherStats.contacts;\n this.fastBodies = otherStats.fastBodies;\n this.fastBodyCollisions = otherStats.fastBodyCollisions;\n this.broadphase = otherStats.broadphase;\n this.narrowphase = otherStats.narrowphase;\n }\n else {\n this.pairs = this.collisions = this.fastBodies = 0;\n this.fastBodyCollisions = this.broadphase = this.narrowphase = 0;\n this.contacts.clear();\n }\n }\n /**\n * Provides a clone of this instance.\n */\n clone() {\n const ps = new PhysicsStats();\n ps.reset(this);\n return ps;\n }\n get pairs() {\n return this._pairs;\n }\n set pairs(value) {\n this._pairs = value;\n }\n get collisions() {\n return this._collisions;\n }\n set collisions(value) {\n this._collisions = value;\n }\n get contacts() {\n return this._contacts;\n }\n set contacts(contacts) {\n this._contacts = contacts;\n }\n get fastBodies() {\n return this._fastBodies;\n }\n set fastBodies(value) {\n this._fastBodies = value;\n }\n get fastBodyCollisions() {\n return this._fastBodyCollisions;\n }\n set fastBodyCollisions(value) {\n this._fastBodyCollisions = value;\n }\n get broadphase() {\n return this._broadphase;\n }\n set broadphase(value) {\n this._broadphase = value;\n }\n get narrowphase() {\n return this._narrowphase;\n }\n set narrowphase(value) {\n this._narrowphase = value;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Debug/DebugFlags.ts\":\n/*!*****************************!*\\\n !*** ./Debug/DebugFlags.ts ***!\n \\*****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ColorBlindFlags: () => (/* binding */ ColorBlindFlags)\n/* harmony export */ });\n/* harmony import */ var _Graphics_PostProcessor_ColorBlindnessMode__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Graphics/PostProcessor/ColorBlindnessMode */ \"./Graphics/PostProcessor/ColorBlindnessMode.ts\");\n/* harmony import */ var _Graphics_PostProcessor_ColorBlindnessPostProcessor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Graphics/PostProcessor/ColorBlindnessPostProcessor */ \"./Graphics/PostProcessor/ColorBlindnessPostProcessor.ts\");\n/* harmony import */ var _Graphics_Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Graphics/Context/ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n\n\n\nclass ColorBlindFlags {\n constructor(engine) {\n this._engine = engine;\n this._colorBlindPostProcessor = new _Graphics_PostProcessor_ColorBlindnessPostProcessor__WEBPACK_IMPORTED_MODULE_0__.ColorBlindnessPostProcessor(_Graphics_PostProcessor_ColorBlindnessMode__WEBPACK_IMPORTED_MODULE_1__.ColorBlindnessMode.Protanope);\n }\n /**\n * Correct colors for a specified color blindness\n * @param colorBlindness\n */\n correct(colorBlindness) {\n if (this._engine.graphicsContext instanceof _Graphics_Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_2__.ExcaliburGraphicsContextWebGL) {\n this.clear();\n this._colorBlindPostProcessor.colorBlindnessMode = colorBlindness;\n this._colorBlindPostProcessor.simulate = false;\n this._engine.graphicsContext.addPostProcessor(this._colorBlindPostProcessor);\n }\n }\n /**\n * Simulate colors for a specified color blindness\n * @param colorBlindness\n */\n simulate(colorBlindness) {\n if (this._engine.graphicsContext instanceof _Graphics_Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_2__.ExcaliburGraphicsContextWebGL) {\n this.clear();\n this._colorBlindPostProcessor.colorBlindnessMode = colorBlindness;\n this._colorBlindPostProcessor.simulate = true;\n this._engine.graphicsContext.addPostProcessor(this._colorBlindPostProcessor);\n }\n }\n /**\n * Remove color blindness post processor\n */\n clear() {\n this._engine.graphicsContext.removePostProcessor(this._colorBlindPostProcessor);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Debug/DebugSystem.ts\":\n/*!******************************!*\\\n !*** ./Debug/DebugSystem.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DebugSystem: () => (/* binding */ DebugSystem)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../Collision/ColliderComponent */ \"./Collision/ColliderComponent.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Priority.ts\");\n/* harmony import */ var _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../Collision/BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Collision_CollisionSystem__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Collision/CollisionSystem */ \"./Collision/CollisionSystem.ts\");\n/* harmony import */ var _Collision_Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../Collision/Colliders/CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Graphics/GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Particles_Particles__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Particles/Particles */ \"./Particles/Particles.ts\");\n/* harmony import */ var _Graphics_DebugGraphicsComponent__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Graphics/DebugGraphicsComponent */ \"./Graphics/DebugGraphicsComponent.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Math/coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _Graphics_Debug__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../Graphics/Debug */ \"./Graphics/Debug.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass DebugSystem extends _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.System {\n constructor(world) {\n super();\n this.world = world;\n this.systemType = _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.SystemType.Draw;\n this.query = this.world.query([_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_1__.TransformComponent]);\n }\n initialize(world, scene) {\n this._graphicsContext = scene.engine.graphicsContext;\n this._camera = scene.camera;\n this._engine = scene.engine;\n this._collisionSystem = world.systemManager.get(_Collision_CollisionSystem__WEBPACK_IMPORTED_MODULE_2__.CollisionSystem);\n }\n update() {\n var _a;\n if (!this._engine.isDebug) {\n return;\n }\n const filterSettings = this._engine.debug.filter;\n let id;\n let name;\n const entitySettings = this._engine.debug.entity;\n let tx;\n const txSettings = this._engine.debug.transform;\n let motion;\n const motionSettings = this._engine.debug.motion;\n let colliderComp;\n const colliderSettings = this._engine.debug.collider;\n const physicsSettings = this._engine.debug.physics;\n let graphics;\n const graphicsSettings = this._engine.debug.graphics;\n let debugDraw;\n let body;\n const bodySettings = this._engine.debug.body;\n const cameraSettings = this._engine.debug.camera;\n for (let i = 0; i < this.query.entities.length; i++) {\n const entity = this.query.entities[i];\n if (entity.hasTag('offscreen')) {\n // skip offscreen entities\n continue;\n }\n if (entity instanceof _Particles_Particles__WEBPACK_IMPORTED_MODULE_3__.Particle) {\n // Particles crush the renderer :(\n continue;\n }\n if (filterSettings.useFilter) {\n const allIds = filterSettings.ids.length === 0;\n const idMatch = allIds || filterSettings.ids.includes(entity.id);\n if (!idMatch) {\n continue;\n }\n const allNames = filterSettings.nameQuery === '';\n const nameMatch = allNames || entity.name.includes(filterSettings.nameQuery);\n if (!nameMatch) {\n continue;\n }\n }\n let cursor = _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero;\n const lineHeight = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(0, 16);\n id = entity.id;\n name = entity.name;\n tx = entity.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n // This optionally sets our camera based on the entity coord plan (world vs. screen)\n this._pushCameraTransform(tx);\n this._graphicsContext.save();\n if (tx.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_5__.CoordPlane.Screen) {\n this._graphicsContext.translate(this._engine.screen.contentArea.left, this._engine.screen.contentArea.top);\n }\n this._graphicsContext.z = txSettings.debugZIndex;\n this._applyTransform(entity);\n if (tx) {\n if (txSettings.showAll || txSettings.showPosition) {\n this._graphicsContext.debug.drawPoint(_Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero, { size: 4, color: txSettings.positionColor });\n }\n if (txSettings.showAll || txSettings.showPositionLabel) {\n this._graphicsContext.debug.drawText(`pos${tx.pos.toString(2)}`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (txSettings.showAll || txSettings.showZIndex) {\n this._graphicsContext.debug.drawText(`z(${tx.z.toFixed(1)})`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (entitySettings.showAll || entitySettings.showId) {\n this._graphicsContext.debug.drawText(`id(${id}) ${entity.parent ? 'child of id(' + ((_a = entity.parent) === null || _a === void 0 ? void 0 : _a.id) + ')' : ''}`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (entitySettings.showAll || entitySettings.showName) {\n this._graphicsContext.debug.drawText(`name(${name})`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (txSettings.showAll || txSettings.showRotation) {\n this._graphicsContext.drawLine(_Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero, _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.fromAngle(tx.rotation).scale(50).add(_Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero), txSettings.rotationColor, 2);\n this._graphicsContext.debug.drawText(`rot deg(${(0,_Math_util__WEBPACK_IMPORTED_MODULE_6__.toDegrees)(tx.rotation).toFixed(2)})`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (txSettings.showAll || txSettings.showScale) {\n this._graphicsContext.drawLine(_Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero, tx.scale.add(_Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero), txSettings.scaleColor, 2);\n }\n }\n graphics = entity.get(_Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_7__.GraphicsComponent);\n if (graphics) {\n if (graphicsSettings.showAll || graphicsSettings.showBounds) {\n const bounds = graphics.localBounds;\n bounds.draw(this._graphicsContext, graphicsSettings.boundsColor);\n }\n }\n debugDraw = entity.get(_Graphics_DebugGraphicsComponent__WEBPACK_IMPORTED_MODULE_8__.DebugGraphicsComponent);\n if (debugDraw) {\n if (!debugDraw.useTransform) {\n this._graphicsContext.restore();\n }\n debugDraw.draw(this._graphicsContext, this._engine.debug);\n if (!debugDraw.useTransform) {\n this._graphicsContext.save();\n this._applyTransform(entity);\n }\n }\n body = entity.get(_Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_9__.BodyComponent);\n if (body) {\n if (bodySettings.showAll || bodySettings.showCollisionGroup) {\n this._graphicsContext.debug.drawText(`collision group(${body.group.name})`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (bodySettings.showAll || bodySettings.showCollisionType) {\n this._graphicsContext.debug.drawText(`collision type(${body.collisionType})`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (bodySettings.showAll || bodySettings.showMass) {\n this._graphicsContext.debug.drawText(`mass(${body.mass})`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (bodySettings.showAll || bodySettings.showMotion) {\n this._graphicsContext.debug.drawText(`motion(${body.sleepMotion})`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (bodySettings.showAll || bodySettings.showSleeping) {\n this._graphicsContext.debug.drawText(`sleeping(${body.canSleep ? body.isSleeping : 'cant sleep'})`, cursor);\n cursor = cursor.add(lineHeight);\n }\n }\n this._graphicsContext.restore();\n // World space\n this._graphicsContext.save();\n if (tx.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_5__.CoordPlane.Screen) {\n this._graphicsContext.translate(this._engine.screen.contentArea.left, this._engine.screen.contentArea.top);\n }\n this._graphicsContext.z = txSettings.debugZIndex;\n motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_10__.MotionComponent);\n if (motion) {\n if (motionSettings.showAll || motionSettings.showVelocity) {\n this._graphicsContext.debug.drawText(`vel${motion.vel.toString(2)}`, cursor.add(tx.globalPos));\n this._graphicsContext.drawLine(tx.globalPos, tx.globalPos.add(motion.vel), motionSettings.velocityColor, 2);\n cursor = cursor.add(lineHeight);\n }\n if (motionSettings.showAll || motionSettings.showAcceleration) {\n this._graphicsContext.drawLine(tx.globalPos, tx.globalPos.add(motion.acc), motionSettings.accelerationColor, 2);\n }\n }\n // Colliders live in world space already so after the restore()\n colliderComp = entity.get(_Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_11__.ColliderComponent);\n if (colliderComp) {\n const collider = colliderComp.get();\n if ((colliderSettings.showAll || colliderSettings.showGeometry) && collider) {\n collider.debug(this._graphicsContext, colliderSettings.geometryColor, {\n lineWidth: colliderSettings.geometryLineWidth,\n pointSize: colliderSettings.geometryPointSize\n });\n }\n if (colliderSettings.showAll || colliderSettings.showBounds) {\n if (collider instanceof _Collision_Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_12__.CompositeCollider) {\n const colliders = collider.getColliders();\n for (const collider of colliders) {\n const bounds = collider.bounds;\n const pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(bounds.left, bounds.top);\n this._graphicsContext.debug.drawRect(pos.x, pos.y, bounds.width, bounds.height, { color: colliderSettings.boundsColor });\n if (colliderSettings.showAll || colliderSettings.showOwner) {\n this._graphicsContext.debug.drawText(`owner id(${collider.owner.id})`, pos);\n }\n }\n colliderComp.bounds.draw(this._graphicsContext, colliderSettings.boundsColor);\n }\n else if (collider) {\n const bounds = colliderComp.bounds;\n const pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(bounds.left, bounds.top);\n this._graphicsContext.debug.drawRect(pos.x, pos.y, bounds.width, bounds.height, { color: colliderSettings.boundsColor });\n if (colliderSettings.showAll || colliderSettings.showOwner) {\n this._graphicsContext.debug.drawText(`owner id(${colliderComp.owner.id})`, pos);\n }\n }\n }\n }\n this._graphicsContext.restore();\n this._popCameraTransform(tx);\n }\n this._graphicsContext.save();\n this._camera.draw(this._graphicsContext);\n if (physicsSettings.showAll || physicsSettings.showBroadphaseSpacePartitionDebug) {\n this._collisionSystem.debug(this._graphicsContext);\n }\n if (physicsSettings.showAll || physicsSettings.showCollisionContacts || physicsSettings.showCollisionNormals) {\n for (const [_, contact] of this._engine.debug.stats.currFrame.physics.contacts) {\n if (physicsSettings.showAll || physicsSettings.showCollisionContacts) {\n for (const point of contact.points) {\n this._graphicsContext.debug.drawPoint(point, {\n size: physicsSettings.contactSize,\n color: physicsSettings.collisionContactColor\n });\n }\n }\n if (physicsSettings.showAll || physicsSettings.showCollisionNormals) {\n for (const point of contact.points) {\n this._graphicsContext.debug.drawLine(point, contact.normal.scale(30).add(point), {\n color: physicsSettings.collisionNormalColor\n });\n }\n }\n }\n }\n this._graphicsContext.restore();\n if (cameraSettings) {\n this._graphicsContext.save();\n this._camera.draw(this._graphicsContext);\n if (cameraSettings.showAll || cameraSettings.showFocus) {\n this._graphicsContext.drawCircle(this._camera.pos, 4, cameraSettings.focusColor);\n }\n if (cameraSettings.showAll || cameraSettings.showZoom) {\n this._graphicsContext.debug.drawText(`zoom(${this._camera.zoom})`, this._camera.pos);\n }\n this._graphicsContext.restore();\n }\n this._graphicsContext.flush();\n }\n postupdate(engine, elapsed) {\n if (this._engine.isDebug) {\n this._graphicsContext.save();\n if (this._camera) {\n this._camera.draw(this._graphicsContext);\n }\n _Graphics_Debug__WEBPACK_IMPORTED_MODULE_13__.Debug.flush(this._graphicsContext);\n this._graphicsContext.restore();\n }\n }\n /**\n * This applies the current entity transform to the graphics context\n * @param entity\n */\n _applyTransform(entity) {\n const ancestors = entity.getAncestors();\n for (const ancestor of ancestors) {\n const transform = ancestor === null || ancestor === void 0 ? void 0 : ancestor.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n if (transform) {\n this._graphicsContext.translate(transform.pos.x, transform.pos.y);\n this._graphicsContext.scale(transform.scale.x, transform.scale.y);\n this._graphicsContext.rotate(transform.rotation);\n }\n }\n }\n /**\n * Applies the current camera transform if in world coordinates\n * @param transform\n */\n _pushCameraTransform(transform) {\n // Establish camera offset per entity\n if (transform.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_5__.CoordPlane.World) {\n this._graphicsContext.save();\n if (this._camera) {\n this._camera.draw(this._graphicsContext);\n }\n }\n }\n /**\n * Resets the current camera transform if in world coordinates\n * @param transform\n */\n _popCameraTransform(transform) {\n if (transform.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_5__.CoordPlane.World) {\n // Apply camera world offset\n this._graphicsContext.restore();\n }\n }\n}\nDebugSystem.priority = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_14__.SystemPriority.Lowest;\n\n\n/***/ }),\n\n/***/ \"./Debug/index.ts\":\n/*!************************!*\\\n !*** ./Debug/index.ts ***!\n \\************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ColorBlindFlags: () => (/* reexport safe */ _DebugFlags__WEBPACK_IMPORTED_MODULE_1__.ColorBlindFlags),\n/* harmony export */ DebugConfig: () => (/* reexport safe */ _DebugConfig__WEBPACK_IMPORTED_MODULE_0__.DebugConfig),\n/* harmony export */ DebugSystem: () => (/* reexport safe */ _DebugSystem__WEBPACK_IMPORTED_MODULE_2__.DebugSystem),\n/* harmony export */ FrameStats: () => (/* reexport safe */ _DebugConfig__WEBPACK_IMPORTED_MODULE_0__.FrameStats),\n/* harmony export */ PhysicsStats: () => (/* reexport safe */ _DebugConfig__WEBPACK_IMPORTED_MODULE_0__.PhysicsStats)\n/* harmony export */ });\n/* harmony import */ var _DebugConfig__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./DebugConfig */ \"./Debug/DebugConfig.ts\");\n/* harmony import */ var _DebugFlags__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./DebugFlags */ \"./Debug/DebugFlags.ts\");\n/* harmony import */ var _DebugSystem__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./DebugSystem */ \"./Debug/DebugSystem.ts\");\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Director/CrossFade.ts\":\n/*!*******************************!*\\\n !*** ./Director/CrossFade.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CrossFade: () => (/* binding */ CrossFade)\n/* harmony export */ });\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Graphics */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Transition__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Transition */ \"./Director/Transition.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n\n\n\n/**\n * CrossFades between the previous scene and the destination scene\n *\n * Note: CrossFade only works as an \"in\" transition\n */\nclass CrossFade extends _Transition__WEBPACK_IMPORTED_MODULE_0__.Transition {\n constructor(options) {\n super({ direction: 'in', ...options }); // default the correct direction\n this.name = `CrossFade#${this.id}`;\n }\n async onPreviousSceneDeactivate(scene) {\n this.image = await scene.engine.screenshot(true);\n // Firefox is particularly slow\n // needed in case the image isn't ready yet\n await this.image.decode();\n }\n onInitialize(engine) {\n this.engine = engine;\n this.transform.pos = engine.screen.unsafeArea.topLeft;\n this.screenCover = _Graphics__WEBPACK_IMPORTED_MODULE_1__.ImageSource.fromHtmlImageElement(this.image).toSprite();\n this.graphics.add(this.screenCover);\n // This is because we preserve hidpi res on the screen shot which COULD be bigger than the logical resolution\n this.transform.scale = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(1 / engine.screen.pixelRatio, 1 / engine.screen.pixelRatio);\n this.graphics.opacity = this.progress;\n }\n onStart(_progress) {\n this.graphics.opacity = this.progress;\n }\n onReset() {\n this.graphics.opacity = this.progress;\n }\n onEnd(progress) {\n this.graphics.opacity = progress;\n }\n onUpdate(progress) {\n this.graphics.opacity = progress;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Director/DefaultLoader.ts\":\n/*!***********************************!*\\\n !*** ./Director/DefaultLoader.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DefaultLoader: () => (/* binding */ DefaultLoader),\n/* harmony export */ LoaderEvents: () => (/* binding */ LoaderEvents),\n/* harmony export */ isLoaderConstructor: () => (/* binding */ isLoaderConstructor)\n/* harmony export */ });\n/* harmony import */ var _Util_WebAudio__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Util/WebAudio */ \"./Util/WebAudio.ts\");\n/* harmony import */ var _Graphics_Canvas__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Graphics/Canvas */ \"./Graphics/Canvas.ts\");\n/* harmony import */ var _Graphics_Filtering__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Graphics/Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Resources_Sound_Sound__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Resources/Sound/Sound */ \"./Resources/Sound/Sound.ts\");\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Util/Future */ \"./Util/Future.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Util/Util */ \"./Util/Util.ts\");\n\n\n\n\n\n\n\n\n\nconst LoaderEvents = {\n // Add event types here\n BeforeLoad: 'beforeload',\n AfterLoad: 'afterload',\n UserAction: 'useraction',\n LoadResourceStart: 'loadresourcestart',\n LoadResourceEnd: 'loadresourceend'\n};\n/**\n * Returns true if the constructor is for an Excalibur Loader\n */\nfunction isLoaderConstructor(x) {\n var _a, _b;\n return !!(x === null || x === void 0 ? void 0 : x.prototype) && !!((_b = (_a = x === null || x === void 0 ? void 0 : x.prototype) === null || _a === void 0 ? void 0 : _a.constructor) === null || _b === void 0 ? void 0 : _b.name);\n}\nclass DefaultLoader {\n get resources() {\n return this._resources;\n }\n /**\n * @param options Optionally provide the list of resources you want to load at constructor time\n */\n constructor(options) {\n var _a;\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n this.canvas = new _Graphics_Canvas__WEBPACK_IMPORTED_MODULE_1__.Canvas({\n filtering: _Graphics_Filtering__WEBPACK_IMPORTED_MODULE_2__.ImageFiltering.Blended,\n smoothing: true,\n cache: false,\n draw: this.onDraw.bind(this)\n });\n this._resources = [];\n this._numLoaded = 0;\n this._totalTimeMs = 0;\n this._loadingFuture = new _Util_Future__WEBPACK_IMPORTED_MODULE_3__.Future();\n if (options && ((_a = options.loadables) === null || _a === void 0 ? void 0 : _a.length)) {\n this.addResources(options.loadables);\n }\n }\n /**\n * Called by the engine before loading\n * @param engine\n */\n onInitialize(engine) {\n this.engine = engine;\n this.canvas.width = this.engine.screen.resolution.width;\n this.canvas.height = this.engine.screen.resolution.height;\n }\n /**\n * Return a promise that resolves when the user interacts with the loading screen in some way, usually a click.\n *\n * It's important to implement this in order to unlock the audio context in the browser. Browsers automatically prevent\n * audio from playing until the user performs an action.\n *\n */\n async onUserAction() {\n return await Promise.resolve();\n }\n /**\n * Overridable lifecycle method, called directly before loading starts\n */\n async onBeforeLoad() {\n // override me\n }\n /**\n * Overridable lifecycle method, called after loading has completed\n */\n async onAfterLoad() {\n // override me\n await (0,_Util_Util__WEBPACK_IMPORTED_MODULE_4__.delay)(500, this.engine.clock); // avoid a flicker\n }\n /**\n * Add a resource to the loader to load\n * @param loadable Resource to add\n */\n addResource(loadable) {\n this._resources.push(loadable);\n }\n /**\n * Add a list of resources to the loader to load\n * @param loadables The list of resources to load\n */\n addResources(loadables) {\n let i = 0;\n const len = loadables.length;\n for (i; i < len; i++) {\n this.addResource(loadables[i]);\n }\n }\n markResourceComplete() {\n this._numLoaded++;\n }\n /**\n * Returns the progress of the loader as a number between [0, 1] inclusive.\n */\n get progress() {\n const total = this._resources.length;\n return total > 0 ? (0,_Math_util__WEBPACK_IMPORTED_MODULE_5__.clamp)(this._numLoaded, 0, total) / total : 1;\n }\n /**\n * Returns true if the loader has completely loaded all resources\n */\n isLoaded() {\n return this._numLoaded === this._resources.length;\n }\n /**\n * Optionally override the onUpdate\n * @param engine\n * @param elapsed\n */\n onUpdate(engine, elapsed) {\n this._totalTimeMs += elapsed;\n // override me\n }\n /**\n * Optionally override the onDraw\n */\n onDraw(ctx) {\n const seconds = this._totalTimeMs / 1000;\n ctx.fillStyle = _Color__WEBPACK_IMPORTED_MODULE_6__.Color.Black.toRGBA();\n ctx.fillRect(0, 0, this.engine.screen.resolution.width, this.engine.screen.resolution.height);\n ctx.save();\n ctx.translate(this.engine.screen.resolution.width / 2, this.engine.screen.resolution.height / 2);\n const speed = seconds * 10;\n ctx.strokeStyle = 'white';\n ctx.lineWidth = 10;\n ctx.lineCap = 'round';\n ctx.arc(0, 0, 40, speed, speed + (Math.PI * 3) / 2);\n ctx.stroke();\n ctx.fillStyle = 'white';\n ctx.font = '16px sans-serif';\n const text = (this.progress * 100).toFixed(0) + '%';\n const textbox = ctx.measureText(text);\n const width = Math.abs(textbox.actualBoundingBoxLeft) + Math.abs(textbox.actualBoundingBoxRight);\n const height = Math.abs(textbox.actualBoundingBoxAscent) + Math.abs(textbox.actualBoundingBoxDescent);\n ctx.fillText(text, -width / 2, height / 2); // center\n ctx.restore();\n }\n areResourcesLoaded() {\n if (this._resources.length === 0) {\n // special case no resources mean loaded;\n return Promise.resolve();\n }\n return this._loadingFuture.promise;\n }\n /**\n * Not meant to be overridden\n *\n * Begin loading all of the supplied resources, returning a promise\n * that resolves when loading of all is complete AND the user has interacted with the loading screen\n */\n async load() {\n await this.onBeforeLoad();\n this.events.emit('beforeload');\n this.canvas.flagDirty();\n await Promise.all(this._resources.map(async (r) => {\n this.events.emit('loadresourcestart', r);\n await r.load().finally(() => {\n // capture progress\n this._numLoaded++;\n this.canvas.flagDirty();\n this.events.emit('loadresourceend', r);\n });\n }));\n // Wire all sound to the engine\n for (const resource of this._resources) {\n if (resource instanceof _Resources_Sound_Sound__WEBPACK_IMPORTED_MODULE_7__.Sound) {\n resource.wireEngine(this.engine);\n }\n }\n this._loadingFuture.resolve();\n this.canvas.flagDirty();\n // Unlock browser AudioContext in after user gesture\n // See: https://github.com/excaliburjs/Excalibur/issues/262\n // See: https://github.com/excaliburjs/Excalibur/issues/1031\n await this.onUserAction();\n this.events.emit('useraction');\n await _Util_WebAudio__WEBPACK_IMPORTED_MODULE_8__.WebAudio.unlock();\n await this.onAfterLoad();\n this.events.emit('afterload');\n return (this.data = this._resources);\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Director/Director.ts\":\n/*!******************************!*\\\n !*** ./Director/Director.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Director: () => (/* binding */ Director),\n/* harmony export */ DirectorEvents: () => (/* binding */ DirectorEvents)\n/* harmony export */ });\n/* harmony import */ var _DefaultLoader__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./DefaultLoader */ \"./Director/DefaultLoader.ts\");\n/* harmony import */ var _Scene__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Scene */ \"./Scene.ts\");\n/* harmony import */ var _Loader__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Loader */ \"./Director/Loader.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n\n\n\nconst DirectorEvents = {\n NavigationStart: 'navigationstart',\n Navigation: 'navigation',\n NavigationEnd: 'navigationend'\n};\n/**\n * The Director is responsible for managing scenes and changing scenes in Excalibur.\n *\n * It deals with transitions, scene loaders, switching scenes\n *\n * This is used internally by Excalibur, generally not mean to\n * be instantiated end users directly.\n */\nclass Director {\n /**\n * Gets whether the director currently transitioning between scenes\n *\n * Useful if you need to block behavior during transition\n */\n get isTransitioning() {\n return this._isTransitioning;\n }\n constructor(_engine, scenes) {\n this._engine = _engine;\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this._initialized = false;\n /**\n * All registered scenes in Excalibur\n */\n this.scenes = {};\n /**\n * Holds all instantiated scenes\n */\n this._sceneToInstance = new Map();\n this._sceneToLoader = new Map();\n this._sceneToTransition = new Map();\n /**\n * Used to keep track of scenes that have already been loaded so we don't load multiple times\n */\n this._loadedScenes = new Set();\n this._isTransitioning = false;\n this.rootScene = this.currentScene = new _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene();\n this.add('root', this.rootScene);\n this.currentScene = this.rootScene;\n this.currentSceneName = 'root';\n for (const sceneKey in scenes) {\n const sceneOrOptions = scenes[sceneKey];\n this.add(sceneKey, sceneOrOptions);\n if (sceneKey === 'root') {\n this.rootScene = this.getSceneInstance('root'); // always a root scene\n this.currentScene = this.rootScene;\n }\n }\n }\n /**\n * Initialize the director's internal state\n */\n async onInitialize() {\n if (!this._initialized) {\n this._initialized = true;\n if (this._deferredGoto) {\n const deferredScene = this._deferredGoto;\n this._deferredGoto = undefined;\n const deferredTransition = this._deferredTransition;\n this._deferredTransition = undefined;\n const deferredSceneInstance = this.getSceneInstance(deferredScene);\n if (deferredSceneInstance && deferredTransition) {\n deferredTransition._addToTargetScene(this._engine, deferredSceneInstance);\n }\n await this.swapScene(deferredScene);\n if (deferredSceneInstance && deferredTransition) {\n await this.playTransition(deferredTransition, deferredSceneInstance);\n }\n }\n else {\n await this.swapScene('root');\n }\n }\n }\n get isInitialized() {\n return this._initialized;\n }\n /**\n * Configures the start scene, and optionally the transition & loader for the director\n *\n * Typically this is called at the beginning of the game to the start scene and transition and never again.\n * @param startScene\n * @param options\n */\n configureStart(startScene, options) {\n const maybeLoaderOrCtor = options === null || options === void 0 ? void 0 : options.loader;\n if (maybeLoaderOrCtor instanceof _DefaultLoader__WEBPACK_IMPORTED_MODULE_3__.DefaultLoader) {\n this.mainLoader = maybeLoaderOrCtor;\n }\n else if ((0,_DefaultLoader__WEBPACK_IMPORTED_MODULE_3__.isLoaderConstructor)(maybeLoaderOrCtor)) {\n this.mainLoader = new maybeLoaderOrCtor();\n }\n else {\n this.mainLoader = new _Loader__WEBPACK_IMPORTED_MODULE_4__.Loader();\n }\n let maybeStartTransition;\n if (options === null || options === void 0 ? void 0 : options.inTransition) {\n const { inTransition } = options;\n maybeStartTransition = inTransition;\n }\n this.startScene = startScene;\n // Fire and forget promise for the initial scene\n if (maybeStartTransition) {\n const startSceneInstance = this.getSceneInstance(this.startScene);\n if (startSceneInstance) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n maybeStartTransition._addToTargetScene(this._engine, startSceneInstance);\n this.swapScene(this.startScene).then(() => {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n return this.playTransition(maybeStartTransition, startSceneInstance);\n });\n }\n }\n else {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.swapScene(this.startScene);\n }\n this.currentSceneName = this.startScene;\n }\n _getLoader(sceneName) {\n return this._sceneToLoader.get(sceneName);\n }\n _getInTransition(sceneName) {\n var _a;\n const sceneOrRoute = this.scenes[sceneName];\n if (sceneOrRoute instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene || (0,_Scene__WEBPACK_IMPORTED_MODULE_2__.isSceneConstructor)(sceneOrRoute)) {\n return undefined;\n }\n return (_a = sceneOrRoute === null || sceneOrRoute === void 0 ? void 0 : sceneOrRoute.transitions) === null || _a === void 0 ? void 0 : _a.in;\n }\n _getOutTransition(sceneName) {\n var _a;\n const sceneOrRoute = this.scenes[sceneName];\n if (sceneOrRoute instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene || (0,_Scene__WEBPACK_IMPORTED_MODULE_2__.isSceneConstructor)(sceneOrRoute)) {\n return undefined;\n }\n return (_a = sceneOrRoute === null || sceneOrRoute === void 0 ? void 0 : sceneOrRoute.transitions) === null || _a === void 0 ? void 0 : _a.out;\n }\n getDeferredScene() {\n const maybeDeferred = this.getSceneDefinition(this._deferredGoto);\n if (this._deferredGoto && maybeDeferred) {\n return maybeDeferred;\n }\n return null;\n }\n /**\n * Returns a scene by name if it exists, might be the constructor and not the instance of a scene\n * @param name\n */\n getSceneDefinition(name) {\n const maybeScene = this.scenes[name];\n if (maybeScene instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene || (0,_Scene__WEBPACK_IMPORTED_MODULE_2__.isSceneConstructor)(maybeScene)) {\n return maybeScene;\n }\n else if (maybeScene) {\n return maybeScene.scene;\n }\n return undefined;\n }\n /**\n * Returns the name of the registered scene, null if none can be found\n * @param scene\n */\n getSceneName(scene) {\n for (const [name, maybeScene] of Object.entries(this.scenes)) {\n if (maybeScene instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene) {\n if (scene === maybeScene) {\n return name;\n }\n }\n else if (!(0,_Scene__WEBPACK_IMPORTED_MODULE_2__.isSceneConstructor)(maybeScene)) {\n if (scene === maybeScene.scene) {\n return name;\n }\n }\n }\n for (const [name, maybeScene] of Object.entries(this.scenes)) {\n if ((0,_Scene__WEBPACK_IMPORTED_MODULE_2__.isSceneConstructor)(maybeScene)) {\n if (scene.constructor === maybeScene) {\n return name;\n }\n }\n else if (!(maybeScene instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene)) {\n if (scene.constructor === maybeScene.scene) {\n return name;\n }\n }\n }\n return null;\n }\n /**\n * Returns the same Director, but asserts a scene DOES exist to the type system\n * @param name\n */\n assertAdded(name) {\n return this;\n }\n /**\n * Returns the same Director, but asserts a scene DOES NOT exist to the type system\n * @param name\n */\n assertRemoved(name) {\n return this;\n }\n /**\n * Adds additional Scenes to the game!\n * @param name\n * @param sceneOrRoute\n */\n add(name, sceneOrRoute) {\n if (!(sceneOrRoute instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene) && !(0,_Scene__WEBPACK_IMPORTED_MODULE_2__.isSceneConstructor)(sceneOrRoute)) {\n const { loader, transitions } = sceneOrRoute;\n const { in: inTransition, out: outTransition } = transitions !== null && transitions !== void 0 ? transitions : {};\n this._sceneToTransition.set(name, { in: inTransition, out: outTransition });\n if ((0,_DefaultLoader__WEBPACK_IMPORTED_MODULE_3__.isLoaderConstructor)(loader)) {\n this._sceneToLoader.set(name, new loader());\n }\n else if (loader) {\n this._sceneToLoader.set(name, loader);\n }\n }\n if (this.scenes[name]) {\n this._logger.warn('Scene', name, 'already exists overwriting');\n }\n this.scenes[name] = sceneOrRoute;\n return this.assertAdded(name);\n }\n remove(nameOrScene) {\n if (nameOrScene instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene || (0,_Scene__WEBPACK_IMPORTED_MODULE_2__.isSceneConstructor)(nameOrScene)) {\n const sceneOrCtor = nameOrScene;\n // remove scene\n for (const key in this.scenes) {\n if (this.scenes.hasOwnProperty(key)) {\n const potentialSceneOrOptions = this.scenes[key];\n let scene;\n if (potentialSceneOrOptions instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene || (0,_Scene__WEBPACK_IMPORTED_MODULE_2__.isSceneConstructor)(potentialSceneOrOptions)) {\n scene = potentialSceneOrOptions;\n }\n else {\n scene = potentialSceneOrOptions.scene;\n }\n if (scene === sceneOrCtor) {\n if (key === this.currentSceneName) {\n throw new Error(`Cannot remove a currently active scene: ${key}`);\n }\n this._sceneToInstance.delete(key);\n this._sceneToTransition.delete(key);\n this._sceneToLoader.delete(key);\n delete this.scenes[key];\n }\n }\n }\n }\n if (typeof nameOrScene === 'string') {\n if (nameOrScene === this.currentSceneName) {\n throw new Error(`Cannot remove a currently active scene: ${nameOrScene}`);\n }\n // remove scene\n this._sceneToInstance.delete(nameOrScene);\n this._sceneToTransition.delete(nameOrScene);\n this._sceneToLoader.delete(nameOrScene);\n delete this.scenes[nameOrScene];\n }\n }\n /**\n * Go to a specific scene, and optionally override loaders and transitions\n * @param destinationScene\n * @param options\n */\n async goToScene(destinationScene, options) {\n var _a, _b, _c, _d, _e, _f;\n const maybeDest = this.getSceneInstance(destinationScene);\n if (!maybeDest) {\n this._logger.warn(`Scene ${destinationScene} does not exist! Check the name, are you sure you added it?`);\n return;\n }\n const sourceSceneInstance = this.currentScene;\n const sourceScene = this.currentSceneName;\n const engineInputEnabled = (_b = (_a = this._engine.input) === null || _a === void 0 ? void 0 : _a.enabled) !== null && _b !== void 0 ? _b : true;\n this._isTransitioning = true;\n const maybeSourceOut = (_c = this.getSceneInstance(sourceScene)) === null || _c === void 0 ? void 0 : _c.onTransition('out');\n const maybeDestinationIn = maybeDest === null || maybeDest === void 0 ? void 0 : maybeDest.onTransition('in');\n options = {\n // Engine configuration then dynamic scene transitions\n ...{ sourceOut: (_d = this._getOutTransition(this.currentSceneName)) !== null && _d !== void 0 ? _d : maybeSourceOut },\n ...{ destinationIn: (_e = this._getInTransition(destinationScene)) !== null && _e !== void 0 ? _e : maybeDestinationIn },\n // Goto options\n ...options\n };\n const { sourceOut, destinationIn, sceneActivationData } = options;\n const outTransition = sourceOut !== null && sourceOut !== void 0 ? sourceOut : this._getOutTransition(this.currentSceneName);\n const inTransition = destinationIn !== null && destinationIn !== void 0 ? destinationIn : this._getInTransition(destinationScene);\n const hideLoader = (outTransition === null || outTransition === void 0 ? void 0 : outTransition.hideLoader) || (inTransition === null || inTransition === void 0 ? void 0 : inTransition.hideLoader);\n if (hideLoader) {\n // Start hidden loader early and take advantage of the transition\n // Don't await and block on a hidden loader\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.maybeLoadScene(destinationScene, hideLoader);\n }\n this._emitEvent('navigationstart', sourceScene, destinationScene);\n // Run the out transition on the current scene if present\n if (outTransition) {\n await this.playTransition(outTransition, sourceSceneInstance);\n }\n // Run the loader if present\n await this.maybeLoadScene(destinationScene, hideLoader);\n // Give incoming transition a chance to grab info from previous\n if (inTransition) {\n await inTransition.onPreviousSceneDeactivate(this.currentScene);\n }\n // Setup the in transition on the destination scene if present\n // this is important to it can be initialized with the\n if (inTransition) {\n inTransition._addToTargetScene(this._engine, maybeDest);\n }\n // Swap to the new scene\n // Runs scene lifecycle init and activate\n await this.swapScene(destinationScene, sceneActivationData);\n this._emitEvent('navigation', sourceScene, destinationScene);\n // Run the in transition on the new scene if present\n if (inTransition) {\n await this.playTransition(inTransition, maybeDest);\n }\n this._emitEvent('navigationend', sourceScene, destinationScene);\n (_f = this._engine.input) === null || _f === void 0 ? void 0 : _f.toggleEnabled(engineInputEnabled);\n this._isTransitioning = false;\n }\n /**\n * Retrieves a scene instance by key if it's registered.\n *\n * This will call any constructors that were given as a definition\n * @param scene\n */\n getSceneInstance(scene) {\n const sceneDefinition = this.getSceneDefinition(scene);\n if (!sceneDefinition) {\n return undefined;\n }\n if (this._sceneToInstance.has(scene)) {\n return this._sceneToInstance.get(scene);\n }\n if (sceneDefinition instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene) {\n this._sceneToInstance.set(scene, sceneDefinition);\n return sceneDefinition;\n }\n const newScene = new sceneDefinition();\n this._sceneToInstance.set(scene, newScene);\n return newScene;\n }\n /**\n * Triggers scene loading if has not already been loaded\n * @param scene\n * @param hideLoader\n */\n async maybeLoadScene(scene, hideLoader = false) {\n var _a;\n const loader = (_a = this._getLoader(scene)) !== null && _a !== void 0 ? _a : new _DefaultLoader__WEBPACK_IMPORTED_MODULE_3__.DefaultLoader();\n const sceneToLoad = this.getSceneDefinition(scene);\n const sceneToLoadInstance = this.getSceneInstance(scene);\n if (sceneToLoad && sceneToLoadInstance && !this._loadedScenes.has(sceneToLoadInstance)) {\n sceneToLoadInstance.onPreLoad(loader);\n sceneToLoadInstance.events.emit('preload', { loader });\n if (hideLoader) {\n // Don't await a hidden loader\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this._engine.load(loader, hideLoader);\n }\n else {\n await this._engine.load(loader);\n }\n this._loadedScenes.add(sceneToLoadInstance);\n }\n }\n /**\n * Plays a transition in the current scene and does book keeping for input.\n * @param transition\n */\n async playTransition(transition, targetScene) {\n var _a, _b, _c, _d, _e, _f, _g;\n if (!this.isInitialized) {\n this._deferredTransition = transition;\n return;\n }\n if (transition) {\n this.currentTransition = transition;\n const sceneInputEnabled = (_b = (_a = targetScene.input) === null || _a === void 0 ? void 0 : _a.enabled) !== null && _b !== void 0 ? _b : true;\n (_c = targetScene.input) === null || _c === void 0 ? void 0 : _c.toggleEnabled(!transition.blockInput);\n (_d = this._engine.input) === null || _d === void 0 ? void 0 : _d.toggleEnabled(!transition.blockInput);\n this.currentTransition._addToTargetScene(this._engine, targetScene);\n await this.currentTransition._play();\n (_e = targetScene.input) === null || _e === void 0 ? void 0 : _e.toggleEnabled(sceneInputEnabled);\n }\n (_f = this.currentTransition) === null || _f === void 0 ? void 0 : _f.kill();\n (_g = this.currentTransition) === null || _g === void 0 ? void 0 : _g.reset();\n this.currentTransition = undefined;\n }\n /**\n * Swaps the current and destination scene after performing required lifecycle events\n * @param destinationScene\n * @param data\n */\n async swapScene(destinationScene, data) {\n const engine = this._engine;\n // if not yet initialized defer goToScene\n if (!this.isInitialized) {\n this._deferredGoto = destinationScene;\n return;\n }\n const maybeDest = this.getSceneInstance(destinationScene);\n if (maybeDest) {\n const previousScene = this.currentScene;\n const nextScene = maybeDest;\n this._logger.debug('Going to scene:', destinationScene);\n // only deactivate when initialized\n if (this.currentScene.isInitialized) {\n const context = { engine, previousScene, nextScene };\n await this.currentScene._deactivate(context);\n this.currentScene.events.emit('deactivate', new _Events__WEBPACK_IMPORTED_MODULE_5__.DeactivateEvent(context, this.currentScene));\n this.currentScene.input.clear();\n }\n // wait for the scene to be loaded if needed\n const destLoader = this._sceneToLoader.get(destinationScene);\n await (destLoader === null || destLoader === void 0 ? void 0 : destLoader.areResourcesLoaded());\n // set current scene to new one\n this.currentScene = nextScene;\n this.currentSceneName = destinationScene;\n engine.screen.setCurrentCamera(nextScene.camera);\n // initialize the current scene if has not been already\n await this.currentScene._initialize(engine);\n const context = { engine, previousScene, nextScene, data };\n await this.currentScene._activate(context);\n this.currentScene.events.emit('activate', new _Events__WEBPACK_IMPORTED_MODULE_5__.ActivateEvent(context, this.currentScene));\n }\n else {\n this._logger.error('Scene', destinationScene, 'does not exist!');\n }\n }\n _emitEvent(eventName, sourceScene, destinationScene) {\n const source = this.getSceneDefinition(sourceScene);\n const dest = this.getSceneDefinition(destinationScene);\n this.events.emit(eventName, {\n sourceScene: source,\n sourceName: sourceScene,\n destinationScene: dest,\n destinationName: destinationScene\n });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Director/FadeInOut.ts\":\n/*!*******************************!*\\\n !*** ./Director/FadeInOut.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FadeInOut: () => (/* binding */ FadeInOut)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Graphics */ \"./Graphics/Rectangle.ts\");\n/* harmony import */ var _Transition__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Transition */ \"./Director/Transition.ts\");\n\n\n\nclass FadeInOut extends _Transition__WEBPACK_IMPORTED_MODULE_0__.Transition {\n constructor(options) {\n var _a, _b;\n super({\n ...options,\n duration: (_a = options.duration) !== null && _a !== void 0 ? _a : 2000\n });\n this.name = `FadeInOut#${this.id}`;\n this.color = (_b = options.color) !== null && _b !== void 0 ? _b : _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Black;\n }\n onInitialize(engine) {\n this.transform.pos = engine.screen.unsafeArea.topLeft;\n this.screenCover = new _Graphics__WEBPACK_IMPORTED_MODULE_2__.Rectangle({\n width: engine.screen.resolution.width,\n height: engine.screen.resolution.height,\n color: this.color\n });\n this.graphics.add(this.screenCover);\n this.graphics.opacity = this.progress;\n }\n onReset() {\n this.graphics.opacity = this.progress;\n }\n onStart(progress) {\n this.graphics.opacity = progress;\n }\n onEnd(progress) {\n this.graphics.opacity = progress;\n }\n onUpdate(progress) {\n this.graphics.opacity = progress;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Director/Loader.ts\":\n/*!****************************!*\\\n !*** ./Director/Loader.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Loader: () => (/* binding */ Loader)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Util_DrawUtil__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Util/DrawUtil */ \"./Util/DrawUtil.ts\");\n/* harmony import */ var _Loader_logo_png__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Loader.logo.png */ \"./Director/Loader.logo.png\");\n/* harmony import */ var _Loader_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Loader.css */ \"./Director/Loader.css\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Util/Util */ \"./Util/Util.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _DefaultLoader__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./DefaultLoader */ \"./Director/DefaultLoader.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Util/Future */ \"./Util/Future.ts\");\n\n\n\n\n\n\n\n\n\n/**\n * Pre-loading assets\n *\n * The loader provides a mechanism to preload multiple resources at\n * one time. The loader must be passed to the engine in order to\n * trigger the loading progress bar.\n *\n * The {@apilink Loader} itself implements {@apilink Loadable} so you can load loaders.\n *\n * ## Example: Pre-loading resources for a game\n *\n * ```js\n * // create a loader\n * var loader = new ex.Loader();\n *\n * // create a resource dictionary (best practice is to keep a separate file)\n * var resources = {\n * TextureGround: new ex.Texture(\"/images/textures/ground.png\"),\n * SoundDeath: new ex.Sound(\"/sound/death.wav\", \"/sound/death.mp3\")\n * };\n *\n * // loop through dictionary and add to loader\n * for (var loadable in resources) {\n * if (resources.hasOwnProperty(loadable)) {\n * loader.addResource(resources[loadable]);\n * }\n * }\n *\n * // start game\n * game.start(loader).then(function () {\n * console.log(\"Game started!\");\n * });\n * ```\n *\n * ## Customize the Loader\n *\n * The loader can be customized to show different, text, logo, background color, and button.\n *\n * ```typescript\n * const loader = new ex.Loader([playerTexture]);\n *\n * // The loaders button text can simply modified using this\n * loader.playButtonText = 'Start the best game ever';\n *\n * // The logo can be changed by inserting a base64 image string here\n *\n * loader.logo = 'data:image/png;base64,iVBORw...';\n * loader.logoWidth = 15;\n * loader.logoHeight = 14;\n *\n * // The background color can be changed like so by supplying a valid CSS color string\n *\n * loader.backgroundColor = 'red'\n * loader.backgroundColor = '#176BAA'\n *\n * // To build a completely new button\n * loader.startButtonFactory = () => {\n * let myButton = document.createElement('button');\n * myButton.textContent = 'The best button';\n * return myButton;\n * };\n *\n * engine.start(loader).then(() => {});\n * ```\n */\nclass Loader extends _DefaultLoader__WEBPACK_IMPORTED_MODULE_0__.DefaultLoader {\n get _image() {\n if (!this._imageElement) {\n this._imageElement = new Image();\n this._imageElement.onload = () => this._imageLoaded.resolve();\n this._imageElement.src = this.logo;\n }\n return this._imageElement;\n }\n get playButtonRootElement() {\n return this._playButtonRootElement;\n }\n get playButtonElement() {\n return this._playButtonElement;\n }\n get _playButton() {\n const existingRoot = document.getElementById('excalibur-play-root');\n if (existingRoot) {\n this._playButtonRootElement = existingRoot;\n }\n if (!this._playButtonRootElement) {\n this._playButtonRootElement = document.createElement('div');\n this._playButtonRootElement.id = 'excalibur-play-root';\n this._playButtonRootElement.style.position = 'absolute';\n document.body.appendChild(this._playButtonRootElement);\n }\n if (!this._styleBlock) {\n this._styleBlock = document.createElement('style');\n this._styleBlock.textContent = this._playButtonStyles;\n document.head.appendChild(this._styleBlock);\n }\n if (!this._playButtonElement) {\n this._playButtonElement = this.startButtonFactory();\n this._playButtonRootElement.appendChild(this._playButtonElement);\n }\n return this._playButtonElement;\n }\n constructor(loadablesOrOptions) {\n const options = Array.isArray(loadablesOrOptions)\n ? {\n loadables: loadablesOrOptions\n }\n : loadablesOrOptions;\n super(options);\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this._originalOptions = { loadables: [] };\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_2__.EventEmitter();\n this._playButtonShown = false;\n // logo drawing stuff\n // base64 string encoding of the excalibur logo (logo-white.png)\n this.logo = _Loader_logo_png__WEBPACK_IMPORTED_MODULE_3__[\"default\"];\n this.logoWidth = 468;\n this.logoHeight = 118;\n /**\n * Gets or sets the color of the loading bar, default is {@apilink Color.White}\n */\n this.loadingBarColor = _Color__WEBPACK_IMPORTED_MODULE_4__.Color.White;\n /**\n * Gets or sets the background color of the loader as a hex string\n */\n this.backgroundColor = '#176BAA';\n this._imageLoaded = new _Util_Future__WEBPACK_IMPORTED_MODULE_5__.Future();\n this.suppressPlayButton = false;\n /** Loads the css from Loader.css */\n this._playButtonStyles = _Loader_css__WEBPACK_IMPORTED_MODULE_6__[\"default\"].toString();\n /**\n * Get/set play button text\n */\n this.playButtonText = 'Play game';\n /**\n * Return a html button element for excalibur to use as a play button\n */\n this.startButtonFactory = () => {\n let buttonElement = document.getElementById('excalibur-play');\n if (!buttonElement) {\n buttonElement = document.createElement('button');\n }\n buttonElement.id = 'excalibur-play';\n buttonElement.textContent = this.playButtonText;\n buttonElement.style.display = 'none';\n return buttonElement;\n };\n this._originalOptions = { ...Loader._DEFAULT_LOADER_OPTIONS, ...options };\n }\n onInitialize(engine) {\n this.engine = engine;\n this.screen = engine.screen;\n this.canvas.width = this.engine.canvas.width;\n this.canvas.height = this.engine.canvas.height;\n this.screen.events.on('resize', () => {\n this.canvas.width = this.engine.canvas.width;\n this.canvas.height = this.engine.canvas.height;\n });\n }\n /**\n * Shows the play button and returns a promise that resolves when clicked\n */\n async showPlayButton() {\n var _a, _b;\n if (this.suppressPlayButton) {\n this.hidePlayButton();\n // Delay is to give the logo a chance to show, otherwise don't delay\n await (0,_Util_Util__WEBPACK_IMPORTED_MODULE_7__.delay)(500, (_a = this.engine) === null || _a === void 0 ? void 0 : _a.clock);\n }\n else {\n const resizeHandler = () => {\n try {\n this._positionPlayButton();\n }\n catch (_a) {\n // swallow if can't position\n }\n };\n if ((_b = this.engine) === null || _b === void 0 ? void 0 : _b.browser) {\n this.engine.browser.window.on('resize', resizeHandler);\n }\n this._playButtonShown = true;\n this._playButton.style.display = 'block';\n document.body.addEventListener('keyup', (evt) => {\n if (evt.key === 'Enter') {\n this._playButton.click();\n }\n });\n this._positionPlayButton();\n const playButtonClicked = new Promise((resolve) => {\n const startButtonHandler = (e) => {\n var _a;\n // We want to stop propagation to keep bubbling to the engine pointer handlers\n e.stopPropagation();\n // Hide Button after click\n this.hidePlayButton();\n if ((_a = this.engine) === null || _a === void 0 ? void 0 : _a.browser) {\n this.engine.browser.window.off('resize', resizeHandler);\n }\n if (this._originalOptions.fullscreenAfterLoad) {\n try {\n this._logger.info('requesting fullscreen');\n if (this._originalOptions.fullscreenContainer instanceof HTMLElement) {\n this._originalOptions.fullscreenContainer.requestFullscreen();\n }\n else {\n this.engine.screen.goFullScreen(this._originalOptions.fullscreenContainer);\n }\n }\n catch (error) {\n this._logger.error('could not go fullscreen', error);\n }\n }\n resolve();\n };\n this._playButton.addEventListener('click', startButtonHandler);\n this._playButton.addEventListener('touchend', startButtonHandler);\n this._playButton.addEventListener('pointerup', startButtonHandler);\n });\n return await playButtonClicked;\n }\n }\n hidePlayButton() {\n this._playButtonShown = false;\n this._playButton.style.display = 'none';\n }\n /**\n * Clean up generated elements for the loader\n */\n dispose() {\n if (this._playButtonRootElement.parentElement) {\n this._playButtonRootElement.removeChild(this._playButtonElement);\n document.body.removeChild(this._playButtonRootElement);\n document.head.removeChild(this._styleBlock);\n this._playButtonRootElement = null;\n this._playButtonElement = null;\n this._styleBlock = null;\n }\n }\n async onUserAction() {\n var _a;\n // short delay in showing the button for aesthetics\n await (0,_Util_Util__WEBPACK_IMPORTED_MODULE_7__.delay)(200, (_a = this.engine) === null || _a === void 0 ? void 0 : _a.clock);\n this.canvas.flagDirty();\n // show play button\n await this.showPlayButton();\n }\n async onBeforeLoad() {\n this.screen.pushResolutionAndViewport();\n this.screen.resolution = { width: this.canvas.width, height: this.canvas.height };\n this.screen.applyResolutionAndViewport();\n const image = this._image;\n await this._imageLoaded.promise;\n await (image === null || image === void 0 ? void 0 : image.decode()); // decode logo if it exists\n }\n // eslint-disable-next-line require-await\n async onAfterLoad() {\n this.screen.popResolutionAndViewport();\n this.screen.applyResolutionAndViewport();\n this.dispose();\n }\n _positionPlayButton() {\n if (this.engine) {\n const { x: left, y: top, width: screenWidth, height: screenHeight } = this.engine.canvas.getBoundingClientRect();\n if (this._playButtonRootElement) {\n const buttonWidth = this._playButton.clientWidth;\n const buttonHeight = this._playButton.clientHeight;\n if (this.playButtonPosition) {\n this._playButtonRootElement.style.left = `${this.playButtonPosition.x}px`;\n this._playButtonRootElement.style.top = `${this.playButtonPosition.y}px`;\n }\n else {\n this._playButtonRootElement.style.left = `${left + screenWidth / 2 - buttonWidth / 2}px`;\n this._playButtonRootElement.style.top = `${top + screenHeight / 2 - buttonHeight / 2 + 100}px`;\n }\n }\n }\n }\n /**\n * Loader draw function. Draws the default Excalibur loading screen.\n * Override `logo`, `logoWidth`, `logoHeight` and `backgroundColor` properties\n * to customize the drawing, or just override entire method.\n */\n onDraw(ctx) {\n const canvasHeight = this.engine.canvasHeight / this.engine.pixelRatio;\n const canvasWidth = this.engine.canvasWidth / this.engine.pixelRatio;\n this._positionPlayButton();\n ctx.fillStyle = this.backgroundColor;\n ctx.fillRect(0, 0, canvasWidth, canvasHeight);\n let logoY = canvasHeight / 2;\n const width = Math.min(this.logoWidth, canvasWidth * 0.75);\n let logoX = canvasWidth / 2 - width / 2;\n if (this.logoPosition) {\n logoX = this.logoPosition.x;\n logoY = this.logoPosition.y;\n }\n const imageHeight = Math.floor(width * (this.logoHeight / this.logoWidth)); // OG height/width factor\n const oldAntialias = this.engine.screen.antialiasing;\n this.engine.screen.antialiasing = true;\n if (!this.logoPosition) {\n ctx.drawImage(this._image, 0, 0, this.logoWidth, this.logoHeight, logoX, logoY - imageHeight - 20, width, imageHeight);\n }\n else {\n ctx.drawImage(this._image, 0, 0, this.logoWidth, this.logoHeight, logoX, logoY, width, imageHeight);\n }\n // loading box\n if (!this.suppressPlayButton && this._playButtonShown) {\n this.engine.screen.antialiasing = oldAntialias;\n return;\n }\n let loadingX = logoX;\n let loadingY = logoY;\n if (this.loadingBarPosition) {\n loadingX = this.loadingBarPosition.x;\n loadingY = this.loadingBarPosition.y;\n }\n ctx.lineWidth = 2;\n _Util_DrawUtil__WEBPACK_IMPORTED_MODULE_8__.roundRect(ctx, loadingX, loadingY, width, 20, 10, this.loadingBarColor);\n const progress = width * this.progress;\n const margin = 5;\n const progressWidth = progress - margin * 2;\n const height = 20 - margin * 2;\n _Util_DrawUtil__WEBPACK_IMPORTED_MODULE_8__.roundRect(ctx, loadingX + margin, loadingY + margin, progressWidth > 10 ? progressWidth : 10, height, 5, null, this.loadingBarColor);\n this.engine.screen.antialiasing = oldAntialias;\n }\n}\nLoader._DEFAULT_LOADER_OPTIONS = {\n loadables: [],\n fullscreenAfterLoad: false,\n fullscreenContainer: undefined\n};\n\n\n/***/ }),\n\n/***/ \"./Director/Slide.ts\":\n/*!***************************!*\\\n !*** ./Director/Slide.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Slide: () => (/* binding */ Slide)\n/* harmony export */ });\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Graphics */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Transition__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Transition */ \"./Director/Transition.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/EasingFunctions */ \"./Util/EasingFunctions.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Math/coord-plane */ \"./Math/coord-plane.ts\");\n\n\n\n\n\n/**\n * Slide`s between the previous scene and the destination scene\n *\n * Note: Slide` only works as an \"in\" transition\n */\nclass Slide extends _Transition__WEBPACK_IMPORTED_MODULE_0__.Transition {\n constructor(options) {\n var _a;\n super({ direction: 'in', ...options }); // default the correct direction\n this._easing = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_1__.EasingFunctions.Linear;\n this.name = `Slide#${this.id}`;\n this.slideDirection = options.slideDirection;\n this.transform.coordPlane = _Math_coord_plane__WEBPACK_IMPORTED_MODULE_2__.CoordPlane.World;\n this.graphics.forceOnScreen = true;\n this._easing = (_a = options.easingFunction) !== null && _a !== void 0 ? _a : this._easing;\n this._vectorEasing = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_1__.EasingFunctions.CreateVectorEasingFunction(this._easing);\n }\n async onPreviousSceneDeactivate(scene) {\n this._image = await scene.engine.screenshot(true);\n // Firefox is particularly slow\n // needed in case the image isn't ready yet\n await this._image.decode();\n this._screenCover = _Graphics__WEBPACK_IMPORTED_MODULE_3__.ImageSource.fromHtmlImageElement(this._image).toSprite();\n }\n onInitialize(engine) {\n this._engine = engine;\n switch (this.slideDirection) {\n case 'up': {\n this._directionOffset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(0, -engine.screen.resolution.height);\n break;\n }\n case 'down': {\n this._directionOffset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(0, engine.screen.resolution.height);\n break;\n }\n case 'left': {\n this._directionOffset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(-engine.screen.resolution.width, 0);\n break;\n }\n case 'right': {\n this._directionOffset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(engine.screen.resolution.width, 0);\n break;\n }\n }\n this._camera = this._engine.currentScene.camera;\n this._destinationCameraPosition = this._camera.pos.clone();\n // For sliding shift the camera and the transition slide by offset\n this._camera.pos = this._camera.pos.add(this._directionOffset);\n this.transform.pos = this.transform.pos.add(this._directionOffset);\n this._startCameraPosition = this._camera.pos.clone();\n this.graphics.use(this._screenCover);\n // This is because we preserve hidpi res on the screen shot which COULD be bigger than the logical resolution\n this.transform.scale = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(1 / engine.screen.pixelRatio, 1 / engine.screen.pixelRatio);\n }\n onUpdate(progress) {\n // in-transitions count down from 1 -> 0, so our \"end\" is swapped\n this._camera.pos = this._vectorEasing(progress, this._destinationCameraPosition, this._startCameraPosition, 1);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Director/Transition.ts\":\n/*!********************************!*\\\n !*** ./Director/Transition.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Transition: () => (/* binding */ Transition)\n/* harmony export */ });\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Util/Future */ \"./Util/Future.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Graphics */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Math/coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Util/EasingFunctions */ \"./Util/EasingFunctions.ts\");\n/* harmony import */ var _Util_Coroutine__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../Util/Coroutine */ \"./Util/Coroutine.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n\n\n\n\n\n\n\n\n\n/**\n * Base Transition that can be extended to provide custom scene transitions in Excalibur.\n */\nclass Transition extends _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_0__.Entity {\n /**\n * Returns a number between [0, 1] indicating what state the transition is in.\n *\n * * For 'out' direction transitions start at 0 and end at 1\n * * For 'in' direction transitions start at 1 and end at 0\n */\n get progress() {\n return this._currentProgress;\n }\n get complete() {\n if (this.direction === 'out') {\n return this.progress >= 1;\n }\n else {\n return this.progress <= 0;\n }\n }\n constructor(options) {\n var _a, _b, _c, _d;\n super();\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this.transform = new _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_2__.TransformComponent();\n this.graphics = new _Graphics__WEBPACK_IMPORTED_MODULE_3__.GraphicsComponent();\n this._completeFuture = new _Util_Future__WEBPACK_IMPORTED_MODULE_4__.Future();\n // State needs to be reset between uses\n this.started = false;\n this._currentDistance = 0;\n this._currentProgress = 0;\n this.done = this._completeFuture.promise;\n this.name = `Transition#${this.id}`;\n this.duration = options.duration;\n this.easing = (_a = options.easing) !== null && _a !== void 0 ? _a : _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_5__.EasingFunctions.Linear;\n this.direction = (_b = options.direction) !== null && _b !== void 0 ? _b : 'out';\n this.hideLoader = (_c = options.hideLoader) !== null && _c !== void 0 ? _c : false;\n this.blockInput = (_d = options.blockInput) !== null && _d !== void 0 ? _d : false;\n this.transform.coordPlane = _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__.CoordPlane.Screen;\n this.transform.pos = _Math_vector__WEBPACK_IMPORTED_MODULE_7__.Vector.Zero;\n this.transform.z = Infinity; // Transitions sit on top of everything\n this.graphics.anchor = _Math_vector__WEBPACK_IMPORTED_MODULE_7__.Vector.Zero;\n this.addComponent(this.transform);\n this.addComponent(this.graphics);\n if (this.direction === 'out') {\n this._currentProgress = 0;\n }\n else {\n this._currentProgress = 1;\n }\n }\n /**\n * Overridable lifecycle method, called before each update.\n *\n * **WARNING BE SURE** to call `super.updateTransition()` if overriding in your own custom implementation\n * @param engine\n * @param elapsed\n */\n updateTransition(engine, elapsed) {\n if (this.complete) {\n return;\n }\n this._currentDistance += (0,_Math_util__WEBPACK_IMPORTED_MODULE_8__.clamp)(elapsed / this.duration, 0, 1);\n if (this._currentDistance >= 1) {\n this._currentDistance = 1;\n }\n if (this.direction === 'out') {\n this._currentProgress = (0,_Math_util__WEBPACK_IMPORTED_MODULE_8__.clamp)(this.easing(this._currentDistance, 0, 1, 1), 0, 1);\n }\n else {\n this._currentProgress = (0,_Math_util__WEBPACK_IMPORTED_MODULE_8__.clamp)(this.easing(this._currentDistance, 1, 0, 1), 0, 1);\n }\n }\n /**\n * Overridable lifecycle method, called right before the previous scene has deactivated.\n *\n * This gives incoming transition a chance to grab info from previous scene if desired\n * @param scene\n */\n async onPreviousSceneDeactivate(scene) {\n // override me\n }\n /**\n * Overridable lifecycle method, called once at the beginning of the transition\n *\n * `progress` is given between 0 and 1\n * @param progress\n */\n onStart(progress) {\n // override me\n }\n /**\n * Overridable lifecycle method, called every frame of the transition\n *\n * `progress` is given between 0 and 1\n * @param progress\n */\n onUpdate(progress) {\n // override me\n }\n /**\n * Overridable lifecycle method, called at the end of the transition,\n *\n * `progress` is given between 0 and 1\n * @param progress\n */\n onEnd(progress) {\n // override me\n }\n /**\n * Overridable lifecycle method, called when the transition is reset\n *\n * Use this to override and provide your own reset logic for internal state in custom transition implementations\n */\n onReset() {\n // override me\n }\n /**\n * reset() is called by the engine to reset transitions\n */\n reset() {\n this.started = false;\n this._completeFuture = new _Util_Future__WEBPACK_IMPORTED_MODULE_4__.Future();\n this.done = this._completeFuture.promise;\n this._currentDistance = 0;\n if (this.direction === 'out') {\n this._currentProgress = 0;\n }\n else {\n this._currentProgress = 1;\n }\n this.onReset();\n }\n /**\n * @internal\n */\n _addToTargetScene(engine, targetScene) {\n const currentScene = targetScene;\n if (this.started) {\n this._logger.warn(`Attempted to add a transition ${this.name} that is already playing.`);\n }\n if (currentScene.world.entityManager.getById(this.id)) {\n return this._co;\n }\n this._engine = engine;\n currentScene.add(this);\n const self = this;\n this._co = (0,_Util_Coroutine__WEBPACK_IMPORTED_MODULE_9__.coroutine)(engine, function* () {\n while (!self.complete) {\n const elapsed = yield; // per frame\n self.updateTransition(self._engine, elapsed);\n self._execute();\n }\n }, {\n autostart: false\n });\n return this._co;\n }\n /**\n * Called internally by excalibur to swap scenes with transition\n * @internal\n */\n async _play() {\n if (this.started) {\n this.reset();\n this._logger.warn(`Attempted to play a transition ${this.name} that is already playing, reset transition.`);\n }\n if (!this._engine || !this._co) {\n this.reset();\n this._logger.warn(`Attempted to play a transition ${this.name} that hasn't been added`);\n }\n if (this._co) {\n await this._co.start();\n }\n }\n /**\n * execute() is called by the engine every frame to update the Transition lifecycle onStart/onUpdate/onEnd\n * @internal\n */\n _execute() {\n if (!this.isInitialized) {\n return;\n }\n if (!this.started) {\n this.started = true;\n this.onStart(this.progress);\n }\n this.onUpdate(this.progress);\n if (this.complete && !this._completeFuture.isCompleted) {\n this.onEnd(this.progress);\n this._completeFuture.resolve();\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Director/index.ts\":\n/*!***************************!*\\\n !*** ./Director/index.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CrossFade: () => (/* reexport safe */ _CrossFade__WEBPACK_IMPORTED_MODULE_2__.CrossFade),\n/* harmony export */ DefaultLoader: () => (/* reexport safe */ _DefaultLoader__WEBPACK_IMPORTED_MODULE_6__.DefaultLoader),\n/* harmony export */ Director: () => (/* reexport safe */ _Director__WEBPACK_IMPORTED_MODULE_4__.Director),\n/* harmony export */ DirectorEvents: () => (/* reexport safe */ _Director__WEBPACK_IMPORTED_MODULE_4__.DirectorEvents),\n/* harmony export */ FadeInOut: () => (/* reexport safe */ _FadeInOut__WEBPACK_IMPORTED_MODULE_1__.FadeInOut),\n/* harmony export */ Loader: () => (/* reexport safe */ _Loader__WEBPACK_IMPORTED_MODULE_5__.Loader),\n/* harmony export */ LoaderEvents: () => (/* reexport safe */ _DefaultLoader__WEBPACK_IMPORTED_MODULE_6__.LoaderEvents),\n/* harmony export */ Slide: () => (/* reexport safe */ _Slide__WEBPACK_IMPORTED_MODULE_3__.Slide),\n/* harmony export */ Transition: () => (/* reexport safe */ _Transition__WEBPACK_IMPORTED_MODULE_0__.Transition),\n/* harmony export */ isLoaderConstructor: () => (/* reexport safe */ _DefaultLoader__WEBPACK_IMPORTED_MODULE_6__.isLoaderConstructor)\n/* harmony export */ });\n/* harmony import */ var _Transition__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Transition */ \"./Director/Transition.ts\");\n/* harmony import */ var _FadeInOut__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./FadeInOut */ \"./Director/FadeInOut.ts\");\n/* harmony import */ var _CrossFade__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./CrossFade */ \"./Director/CrossFade.ts\");\n/* harmony import */ var _Slide__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Slide */ \"./Director/Slide.ts\");\n/* harmony import */ var _Director__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Director */ \"./Director/Director.ts\");\n/* harmony import */ var _Loader__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Loader */ \"./Director/Loader.ts\");\n/* harmony import */ var _DefaultLoader__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./DefaultLoader */ \"./Director/DefaultLoader.ts\");\n\n\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Engine.ts\":\n/*!*******************!*\\\n !*** ./Engine.ts ***!\n \\*******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Engine: () => (/* binding */ Engine),\n/* harmony export */ EngineEvents: () => (/* binding */ EngineEvents),\n/* harmony export */ ScrollPreventionMode: () => (/* binding */ ScrollPreventionMode)\n/* harmony export */ });\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ */ \"./index.ts\");\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Util/Future */ \"./Util/Future.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Input_PointerScope__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./Input/PointerScope */ \"./Input/PointerScope.ts\");\n/* harmony import */ var _Flags__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Flags */ \"./Flags.ts\");\n/* harmony import */ var _Polyfill__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Polyfill */ \"./Polyfill.ts\");\n/* harmony import */ var _Screen__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Screen */ \"./Screen.ts\");\n/* harmony import */ var _Director_DefaultLoader__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./Director/DefaultLoader */ \"./Director/DefaultLoader.ts\");\n/* harmony import */ var _Director_Loader__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./Director/Loader */ \"./Director/Loader.ts\");\n/* harmony import */ var _Util_Detector__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Util/Detector */ \"./Util/Detector.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./Events */ \"./Events.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./Color */ \"./Color.ts\");\n/* harmony import */ var _Scene__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./Scene */ \"./Scene.ts\");\n/* harmony import */ var _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./EntityComponentSystem/Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _Debug_DebugConfig__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./Debug/DebugConfig */ \"./Debug/DebugConfig.ts\");\n/* harmony import */ var _Util_Browser__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Util/Browser */ \"./Util/Browser.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Graphics */ \"./Graphics/Context/ExcaliburGraphicsContext.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Graphics */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Graphics */ \"./Graphics/Context/ExcaliburGraphicsContext2DCanvas.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Graphics */ \"./Graphics/Context/texture-loader.ts\");\n/* harmony import */ var _Util_Clock__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./Util/Clock */ \"./Util/Clock.ts\");\n/* harmony import */ var _Graphics_Filtering__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Graphics/Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Graphics_GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./Graphics/GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n/* harmony import */ var _Util_Toaster__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Util/Toaster */ \"./Util/Toaster.ts\");\n/* harmony import */ var _Director_Director__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./Director/Director */ \"./Director/Director.ts\");\n/* harmony import */ var _Input_InputHost__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./Input/InputHost */ \"./Input/InputHost.ts\");\n/* harmony import */ var _Collision_PhysicsConfig__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Collision/PhysicsConfig */ \"./Collision/PhysicsConfig.ts\");\n/* harmony import */ var _Context__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Context */ \"./Context.ts\");\n/* harmony import */ var _GarbageCollector__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./GarbageCollector */ \"./GarbageCollector.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./Util/Util */ \"./Util/Util.ts\");\n\n\n\n\n\n\n(0,_Polyfill__WEBPACK_IMPORTED_MODULE_0__.polyfill)();\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst EngineEvents = {\n FallbackGraphicsContext: 'fallbackgraphicscontext',\n Initialize: 'initialize',\n Visible: 'visible',\n Hidden: 'hidden',\n Start: 'start',\n Stop: 'stop',\n PreUpdate: 'preupdate',\n PostUpdate: 'postupdate',\n PreFrame: 'preframe',\n PostFrame: 'postframe',\n PreDraw: 'predraw',\n PostDraw: 'postdraw'\n};\n/**\n * Enum representing the different mousewheel event bubble prevention\n */\nvar ScrollPreventionMode;\n(function (ScrollPreventionMode) {\n /**\n * Do not prevent any page scrolling\n */\n ScrollPreventionMode[ScrollPreventionMode[\"None\"] = 0] = \"None\";\n /**\n * Prevent page scroll if mouse is over the game canvas\n */\n ScrollPreventionMode[ScrollPreventionMode[\"Canvas\"] = 1] = \"Canvas\";\n /**\n * Prevent all page scrolling via mouse wheel\n */\n ScrollPreventionMode[ScrollPreventionMode[\"All\"] = 2] = \"All\";\n})(ScrollPreventionMode || (ScrollPreventionMode = {}));\n/**\n * The Excalibur Engine\n *\n * The {@apilink Engine} is the main driver for a game. It is responsible for\n * starting/stopping the game, maintaining state, transmitting events,\n * loading resources, and managing the scene.\n */\nclass Engine {\n static useEngine() {\n const value = (0,_Context__WEBPACK_IMPORTED_MODULE_1__.useContext)(Engine.Context);\n if (!value) {\n throw new Error('Cannot inject engine with `useEngine()`, `useEngine()` was called outside of Engine lifecycle scope.');\n }\n return value;\n }\n /**\n * The width of the game canvas in pixels (physical width component of the\n * resolution of the canvas element)\n */\n get canvasWidth() {\n return this.screen.canvasWidth;\n }\n /**\n * Returns half width of the game canvas in pixels (half physical width component)\n */\n get halfCanvasWidth() {\n return this.screen.halfCanvasWidth;\n }\n /**\n * The height of the game canvas in pixels, (physical height component of\n * the resolution of the canvas element)\n */\n get canvasHeight() {\n return this.screen.canvasHeight;\n }\n /**\n * Returns half height of the game canvas in pixels (half physical height component)\n */\n get halfCanvasHeight() {\n return this.screen.halfCanvasHeight;\n }\n /**\n * Returns the width of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get drawWidth() {\n return this.screen.drawWidth;\n }\n /**\n * Returns half the width of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get halfDrawWidth() {\n return this.screen.halfDrawWidth;\n }\n /**\n * Returns the height of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get drawHeight() {\n return this.screen.drawHeight;\n }\n /**\n * Returns half the height of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get halfDrawHeight() {\n return this.screen.halfDrawHeight;\n }\n /**\n * Returns whether excalibur detects the current screen to be HiDPI\n */\n get isHiDpi() {\n return this.screen.isHiDpi;\n }\n /**\n * Access {@apilink stats} that holds frame statistics.\n */\n get stats() {\n return this.debug.stats;\n }\n /**\n * The current {@apilink Scene} being drawn and updated on screen\n */\n get currentScene() {\n return this.director.currentScene;\n }\n /**\n * The current {@apilink Scene} being drawn and updated on screen\n */\n get currentSceneName() {\n return this.director.currentSceneName;\n }\n /**\n * The default {@apilink Scene} of the game, use {@apilink Engine.goToScene} to transition to different scenes.\n */\n get rootScene() {\n return this.director.rootScene;\n }\n /**\n * Contains all the scenes currently registered with Excalibur\n */\n get scenes() {\n return this.director.scenes;\n }\n /**\n * Indicates whether the engine is set to fullscreen or not\n */\n get isFullscreen() {\n return this.screen.isFullScreen;\n }\n /**\n * Indicates the current {@apilink DisplayMode} of the engine.\n */\n get displayMode() {\n return this.screen.displayMode;\n }\n /**\n * Returns the calculated pixel ration for use in rendering\n */\n get pixelRatio() {\n return this.screen.pixelRatio;\n }\n get isDebug() {\n return this._isDebug;\n }\n /**\n * Hints the graphics context to truncate fractional world space coordinates\n */\n get snapToPixel() {\n return this.graphicsContext.snapToPixel;\n }\n set snapToPixel(shouldSnapToPixel) {\n this.graphicsContext.snapToPixel = shouldSnapToPixel;\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n /**\n * Creates a new game using the given {@apilink EngineOptions}. By default, if no options are provided,\n * the game will be rendered full screen (taking up all available browser window space).\n * You can customize the game rendering through {@apilink EngineOptions}.\n *\n * Example:\n *\n * ```js\n * var game = new ex.Engine({\n * width: 0, // the width of the canvas\n * height: 0, // the height of the canvas\n * enableCanvasTransparency: true, // the transparencySection of the canvas\n * canvasElementId: '', // the DOM canvas element ID, if you are providing your own\n * displayMode: ex.DisplayMode.FullScreen, // the display mode\n * pointerScope: ex.PointerScope.Document, // the scope of capturing pointer (mouse/touch) events\n * backgroundColor: ex.Color.fromHex('#2185d0') // background color of the engine\n * });\n *\n * // call game.start, which is a Promise\n * game.start().then(function () {\n * // ready, set, go!\n * });\n * ```\n */\n constructor(options) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j;\n /**\n * Anything run under scope can use `useEngine()` to inject the current engine\n * @param cb\n */\n this.scope = (cb) => Engine.Context.scope(this, cb);\n /**\n * Current Excalibur version string\n *\n * Useful for plugins or other tools that need to know what features are available\n */\n this.version = ___WEBPACK_IMPORTED_MODULE_2__.EX_VERSION;\n /**\n * Listen to and emit events on the Engine\n */\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_3__.EventEmitter();\n /**\n * Optionally set the maximum fps if not set Excalibur will go as fast as the device allows.\n *\n * You may want to constrain max fps if your game cannot maintain fps consistently, it can look and feel better to have a 30fps game than\n * one that bounces between 30fps and 60fps\n */\n this.maxFps = Number.POSITIVE_INFINITY;\n this._inputEnabled = true;\n this._suppressPlayButton = false;\n /**\n * Indicates whether audio should be paused when the game is no longer visible.\n */\n this.pauseAudioWhenHidden = true;\n /**\n * Indicates whether the engine should draw with debug information\n */\n this._isDebug = false;\n /**\n * Sets the Transparency for the engine.\n */\n this.enableCanvasTransparency = true;\n /**\n * The action to take when a fatal exception is thrown\n */\n this.onFatalException = (e) => {\n _Util_Log__WEBPACK_IMPORTED_MODULE_4__.Logger.getInstance().fatal(e, e.stack);\n };\n this._toaster = new _Util_Toaster__WEBPACK_IMPORTED_MODULE_5__.Toaster();\n this._timescale = 1.0;\n this._isInitialized = false;\n this._originalOptions = {};\n this._handleWebGLContextLost = (e) => {\n var _a;\n e.preventDefault();\n this.clock.stop();\n this._logger.fatalOnce('WebGL Graphics Lost', e);\n const container = document.createElement('div');\n container.id = 'ex-webgl-graphics-context-lost';\n container.style.position = 'absolute';\n container.style.zIndex = '99';\n container.style.left = '50%';\n container.style.top = '50%';\n container.style.display = 'flex';\n container.style.flexDirection = 'column';\n container.style.transform = 'translate(-50%, -50%)';\n container.style.backgroundColor = 'white';\n container.style.padding = '10px';\n container.style.borderStyle = 'solid 1px';\n const div = document.createElement('div');\n div.innerHTML = `\r\n

There was an issue rendering, please refresh the page.

\r\n
\r\n

WebGL Graphics Context Lost

\r\n\r\n \r\n\r\n

There are a few reasons this might happen:

\r\n
    \r\n
  • Two or more pages are placing a high demand on the GPU
  • \r\n
  • Another page or operation has stalled the GPU and the browser has decided to reset the GPU
  • \r\n
  • The computer has multiple GPUs and the user has switched between them
  • \r\n
  • Graphics driver has crashed or restarted
  • \r\n
  • Graphics driver was updated
  • \r\n
\r\n
\r\n `;\n container.appendChild(div);\n if ((_a = this.canvas) === null || _a === void 0 ? void 0 : _a.parentElement) {\n this.canvas.parentElement.appendChild(container);\n const button = div.querySelector('#ex-webgl-graphics-reload');\n button === null || button === void 0 ? void 0 : button.addEventListener('click', () => location.reload());\n }\n };\n this._performanceThresholdTriggered = false;\n this._fpsSamples = [];\n this._disposed = false;\n this._isLoading = false;\n this._hideLoader = false;\n this._isReadyFuture = new _Util_Future__WEBPACK_IMPORTED_MODULE_6__.Future();\n /**\n * Returns the current frames elapsed milliseconds\n */\n this.currentFrameElapsedMs = 0;\n /**\n * Returns the current frame lag when in fixed update mode\n */\n this.currentFrameLagMs = 0;\n this._lagMs = 0;\n this._screenShotRequests = [];\n options = { ...Engine._DEFAULT_ENGINE_OPTIONS, ...options };\n this._originalOptions = options;\n _Flags__WEBPACK_IMPORTED_MODULE_7__.Flags.freeze();\n // Initialize browser events facade\n this.browser = new _Util_Browser__WEBPACK_IMPORTED_MODULE_8__.BrowserEvents(window, document);\n // Check compatibility\n const detector = new _Util_Detector__WEBPACK_IMPORTED_MODULE_9__.Detector();\n if (!options.suppressMinimumBrowserFeatureDetection && !(this._compatible = detector.test())) {\n const message = document.createElement('div');\n message.innerText = 'Sorry, your browser does not support all the features needed for Excalibur';\n document.body.appendChild(message);\n detector.failedTests.forEach(function (test) {\n const testMessage = document.createElement('div');\n testMessage.innerText = 'Browser feature missing ' + test;\n document.body.appendChild(testMessage);\n });\n if (options.canvasElementId) {\n const canvas = document.getElementById(options.canvasElementId);\n if (canvas) {\n canvas.parentElement.removeChild(canvas);\n }\n }\n return;\n }\n else {\n this._compatible = true;\n }\n // Use native console API for color fun\n // eslint-disable-next-line no-console\n if (console.log && !options.suppressConsoleBootMessage) {\n // eslint-disable-next-line no-console\n console.log(`%cPowered by Excalibur.js (v${___WEBPACK_IMPORTED_MODULE_2__.EX_VERSION})`, 'background: #176BAA; color: white; border-radius: 5px; padding: 15px; font-size: 1.5em; line-height: 80px;');\n // eslint-disable-next-line no-console\n console.log('\\n\\\r\n /| ________________\\n\\\r\nO|===|* >________________>\\n\\\r\n \\\\|');\n // eslint-disable-next-line no-console\n console.log('Visit', 'http://excaliburjs.com', 'for more information');\n }\n // Suppress play button\n if (options.suppressPlayButton) {\n this._suppressPlayButton = true;\n }\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_4__.Logger.getInstance();\n // If debug is enabled, let's log browser features to the console.\n if (this._logger.defaultLevel === _Util_Log__WEBPACK_IMPORTED_MODULE_4__.LogLevel.Debug) {\n detector.logBrowserFeatures();\n }\n this._logger.debug('Building engine...');\n if (options.garbageCollection === true) {\n this.garbageCollectorConfig = {\n ..._GarbageCollector__WEBPACK_IMPORTED_MODULE_10__.DefaultGarbageCollectionOptions\n };\n }\n else if (options.garbageCollection === false) {\n this._logger.warn('WebGL Garbage Collection Disabled!!! If you leak any images over time your game will crash when GPU memory is exhausted');\n this.garbageCollectorConfig = null;\n }\n else {\n this.garbageCollectorConfig = {\n ..._GarbageCollector__WEBPACK_IMPORTED_MODULE_10__.DefaultGarbageCollectionOptions,\n ...options.garbageCollection\n };\n }\n this._garbageCollector = new _GarbageCollector__WEBPACK_IMPORTED_MODULE_10__.GarbageCollector({ getTimestamp: Date.now });\n this.canvasElementId = options.canvasElementId;\n if (options.canvasElementId) {\n this._logger.debug('Using Canvas element specified: ' + options.canvasElementId);\n //test for existence of element\n if (document.getElementById(options.canvasElementId) === null) {\n throw new Error('Cannot find existing element in the DOM, please ensure element is created prior to engine creation.');\n }\n this.canvas = document.getElementById(options.canvasElementId);\n }\n else if (options.canvasElement) {\n this._logger.debug('Using Canvas element specified:', options.canvasElement);\n this.canvas = options.canvasElement;\n }\n else {\n this._logger.debug('Using generated canvas element');\n this.canvas = document.createElement('canvas');\n }\n if (this.canvas && !options.enableCanvasContextMenu) {\n this.canvas.addEventListener('contextmenu', (evt) => {\n evt.preventDefault();\n });\n }\n let displayMode = (_a = options.displayMode) !== null && _a !== void 0 ? _a : _Screen__WEBPACK_IMPORTED_MODULE_11__.DisplayMode.Fixed;\n if ((options.width && options.height) || options.viewport) {\n if (options.displayMode === undefined) {\n displayMode = _Screen__WEBPACK_IMPORTED_MODULE_11__.DisplayMode.Fixed;\n }\n this._logger.debug('Engine viewport is size ' + options.width + ' x ' + options.height);\n }\n else if (!options.displayMode) {\n this._logger.debug('Engine viewport is fit');\n displayMode = _Screen__WEBPACK_IMPORTED_MODULE_11__.DisplayMode.FitScreen;\n }\n this.grabWindowFocus = options.grabWindowFocus;\n this.pointerScope = options.pointerScope;\n this._originalDisplayMode = displayMode;\n let pixelArtSampler;\n let uvPadding;\n let nativeContextAntialiasing;\n let canvasImageRendering;\n let filtering;\n let multiSampleAntialiasing;\n if (typeof options.antialiasing === 'object') {\n ({ pixelArtSampler, nativeContextAntialiasing, multiSampleAntialiasing, filtering, canvasImageRendering } = {\n ...(options.pixelArt ? _Graphics__WEBPACK_IMPORTED_MODULE_12__.DefaultPixelArtOptions : _Graphics__WEBPACK_IMPORTED_MODULE_12__.DefaultAntialiasOptions),\n ...options.antialiasing\n });\n }\n else {\n pixelArtSampler = !!options.pixelArt;\n nativeContextAntialiasing = false;\n multiSampleAntialiasing = options.antialiasing;\n canvasImageRendering = options.antialiasing ? 'auto' : 'pixelated';\n filtering = options.antialiasing ? _Graphics_Filtering__WEBPACK_IMPORTED_MODULE_13__.ImageFiltering.Blended : _Graphics_Filtering__WEBPACK_IMPORTED_MODULE_13__.ImageFiltering.Pixel;\n }\n if (nativeContextAntialiasing && multiSampleAntialiasing) {\n this._logger.warnOnce(`Cannot use antialias setting nativeContextAntialiasing and multiSampleAntialiasing` +\n ` at the same time, they are incompatible settings. If you aren\\'t sure use multiSampleAntialiasing`);\n }\n if (options.pixelArt) {\n uvPadding = 0.25;\n }\n if (!options.antialiasing || filtering === _Graphics_Filtering__WEBPACK_IMPORTED_MODULE_13__.ImageFiltering.Pixel) {\n uvPadding = 0;\n }\n // Override with any user option, if non default to .25 for pixel art, 0.01 for everything else\n uvPadding = (_c = (_b = options.uvPadding) !== null && _b !== void 0 ? _b : uvPadding) !== null && _c !== void 0 ? _c : 0.01;\n // Canvas 2D fallback can be flagged on\n let useCanvasGraphicsContext = _Flags__WEBPACK_IMPORTED_MODULE_7__.Flags.isEnabled('use-canvas-context');\n if (!useCanvasGraphicsContext) {\n // Attempt webgl first\n try {\n this.graphicsContext = new _Graphics__WEBPACK_IMPORTED_MODULE_14__.ExcaliburGraphicsContextWebGL({\n canvasElement: this.canvas,\n enableTransparency: this.enableCanvasTransparency,\n pixelArtSampler: pixelArtSampler,\n antialiasing: nativeContextAntialiasing,\n multiSampleAntialiasing: multiSampleAntialiasing,\n uvPadding: uvPadding,\n powerPreference: options.powerPreference,\n backgroundColor: options.backgroundColor,\n snapToPixel: options.snapToPixel,\n useDrawSorting: options.useDrawSorting,\n garbageCollector: this.garbageCollectorConfig\n ? {\n garbageCollector: this._garbageCollector,\n collectionInterval: this.garbageCollectorConfig.textureCollectInterval\n }\n : null,\n handleContextLost: (_d = options.handleContextLost) !== null && _d !== void 0 ? _d : this._handleWebGLContextLost,\n handleContextRestored: options.handleContextRestored\n });\n }\n catch (e) {\n this._logger.warn(`Excalibur could not load webgl for some reason (${e.message}) and loaded a Canvas 2D fallback. ` +\n `Some features of Excalibur will not work in this mode. \\n\\n` +\n 'Read more about this issue at https://excaliburjs.com/docs/performance');\n // fallback to canvas in case of failure\n useCanvasGraphicsContext = true;\n }\n }\n if (useCanvasGraphicsContext) {\n this.graphicsContext = new _Graphics__WEBPACK_IMPORTED_MODULE_15__.ExcaliburGraphicsContext2DCanvas({\n canvasElement: this.canvas,\n enableTransparency: this.enableCanvasTransparency,\n antialiasing: nativeContextAntialiasing,\n backgroundColor: options.backgroundColor,\n snapToPixel: options.snapToPixel,\n useDrawSorting: options.useDrawSorting\n });\n }\n this.screen = new _Screen__WEBPACK_IMPORTED_MODULE_11__.Screen({\n canvas: this.canvas,\n context: this.graphicsContext,\n antialiasing: nativeContextAntialiasing,\n canvasImageRendering: canvasImageRendering,\n browser: this.browser,\n viewport: (_e = options.viewport) !== null && _e !== void 0 ? _e : (options.width && options.height ? { width: options.width, height: options.height } : _Screen__WEBPACK_IMPORTED_MODULE_11__.Resolution.SVGA),\n resolution: options.resolution,\n displayMode,\n pixelRatio: options.suppressHiDPIScaling ? 1 : (_f = options.pixelRatio) !== null && _f !== void 0 ? _f : null\n });\n // TODO REMOVE STATIC!!!\n // Set default filtering based on antialiasing\n _Graphics__WEBPACK_IMPORTED_MODULE_16__.TextureLoader.filtering = filtering;\n if (options.backgroundColor) {\n this.backgroundColor = options.backgroundColor.clone();\n }\n this.maxFps = (_g = options.maxFps) !== null && _g !== void 0 ? _g : this.maxFps;\n this.fixedUpdateTimestep = (_h = options.fixedUpdateTimestep) !== null && _h !== void 0 ? _h : this.fixedUpdateTimestep;\n this.fixedUpdateFps = (_j = options.fixedUpdateFps) !== null && _j !== void 0 ? _j : this.fixedUpdateFps;\n this.fixedUpdateTimestep = this.fixedUpdateTimestep || 1000 / this.fixedUpdateFps;\n this.clock = new _Util_Clock__WEBPACK_IMPORTED_MODULE_17__.StandardClock({\n maxFps: this.maxFps,\n tick: this._mainloop.bind(this),\n onFatalException: (e) => this.onFatalException(e)\n });\n this.enableCanvasTransparency = options.enableCanvasTransparency;\n if (typeof options.physics === 'boolean') {\n this.physics = {\n ...(0,_Collision_PhysicsConfig__WEBPACK_IMPORTED_MODULE_18__.getDefaultPhysicsConfig)(),\n enabled: options.physics\n };\n }\n else {\n this.physics = {\n ...(0,_Collision_PhysicsConfig__WEBPACK_IMPORTED_MODULE_18__.getDefaultPhysicsConfig)()\n };\n (0,_Util_Util__WEBPACK_IMPORTED_MODULE_19__.mergeDeep)(this.physics, options.physics);\n }\n this.debug = new _Debug_DebugConfig__WEBPACK_IMPORTED_MODULE_20__.DebugConfig(this);\n this.director = new _Director_Director__WEBPACK_IMPORTED_MODULE_21__.Director(this, options.scenes);\n this._initialize(options);\n window.___EXCALIBUR_DEVTOOL = this;\n Engine.InstanceCount++;\n }\n _monitorPerformanceThresholdAndTriggerFallback() {\n const { allow } = this._originalOptions.configurePerformanceCanvas2DFallback;\n let { threshold, showPlayerMessage } = this._originalOptions.configurePerformanceCanvas2DFallback;\n if (threshold === undefined) {\n threshold = Engine._DEFAULT_ENGINE_OPTIONS.configurePerformanceCanvas2DFallback.threshold;\n }\n if (showPlayerMessage === undefined) {\n showPlayerMessage = Engine._DEFAULT_ENGINE_OPTIONS.configurePerformanceCanvas2DFallback.showPlayerMessage;\n }\n if (!_Flags__WEBPACK_IMPORTED_MODULE_7__.Flags.isEnabled('use-canvas-context') && allow && this.ready && !this._performanceThresholdTriggered) {\n // Calculate Average fps for last X number of frames after start\n if (this._fpsSamples.length === threshold.numberOfFrames) {\n this._fpsSamples.splice(0, 1);\n }\n this._fpsSamples.push(this.clock.fpsSampler.fps);\n let total = 0;\n for (let i = 0; i < this._fpsSamples.length; i++) {\n total += this._fpsSamples[i];\n }\n const average = total / this._fpsSamples.length;\n if (this._fpsSamples.length === threshold.numberOfFrames) {\n if (average <= threshold.fps) {\n this._performanceThresholdTriggered = true;\n this._logger.warn(`Switching to browser 2D Canvas fallback due to performance. Some features of Excalibur will not work in this mode.\\n` +\n \"this might mean your browser doesn't have webgl enabled or hardware acceleration is unavailable.\\n\\n\" +\n 'If in Chrome:\\n' +\n ' * Visit Settings > Advanced > System, and ensure \"Use Hardware Acceleration\" is checked.\\n' +\n ' * Visit chrome://flags/#ignore-gpu-blocklist and ensure \"Override software rendering list\" is \"enabled\"\\n' +\n 'If in Firefox, visit about:config\\n' +\n ' * Ensure webgl.disabled = false\\n' +\n ' * Ensure webgl.force-enabled = true\\n' +\n ' * Ensure layers.acceleration.force-enabled = true\\n\\n' +\n 'Read more about this issue at https://excaliburjs.com/docs/performance');\n if (showPlayerMessage) {\n this._toaster.toast('Excalibur is encountering performance issues. ' +\n \"It's possible that your browser doesn't have hardware acceleration enabled. \" +\n 'Visit [LINK] for more information and potential solutions.', 'https://excaliburjs.com/docs/performance');\n }\n this.useCanvas2DFallback();\n this.emit('fallbackgraphicscontext', this.graphicsContext);\n }\n }\n }\n }\n /**\n * Switches the engine's graphics context to the 2D Canvas.\n * @warning Some features of Excalibur will not work in this mode.\n */\n useCanvas2DFallback() {\n var _a, _b, _c;\n // Swap out the canvas\n const newCanvas = this.canvas.cloneNode(false);\n this.canvas.parentNode.replaceChild(newCanvas, this.canvas);\n this.canvas = newCanvas;\n const options = { ...this._originalOptions, antialiasing: this.screen.antialiasing };\n const displayMode = this._originalDisplayMode;\n // New graphics context\n this.graphicsContext = new _Graphics__WEBPACK_IMPORTED_MODULE_15__.ExcaliburGraphicsContext2DCanvas({\n canvasElement: this.canvas,\n enableTransparency: this.enableCanvasTransparency,\n antialiasing: options.antialiasing,\n backgroundColor: options.backgroundColor,\n snapToPixel: options.snapToPixel,\n useDrawSorting: options.useDrawSorting\n });\n // Reset screen\n if (this.screen) {\n this.screen.dispose();\n }\n this.screen = new _Screen__WEBPACK_IMPORTED_MODULE_11__.Screen({\n canvas: this.canvas,\n context: this.graphicsContext,\n antialiasing: (_a = options.antialiasing) !== null && _a !== void 0 ? _a : true,\n browser: this.browser,\n viewport: (_b = options.viewport) !== null && _b !== void 0 ? _b : (options.width && options.height ? { width: options.width, height: options.height } : _Screen__WEBPACK_IMPORTED_MODULE_11__.Resolution.SVGA),\n resolution: options.resolution,\n displayMode,\n pixelRatio: options.suppressHiDPIScaling ? 1 : (_c = options.pixelRatio) !== null && _c !== void 0 ? _c : null\n });\n this.screen.setCurrentCamera(this.currentScene.camera);\n // Reset pointers\n this.input.pointers.detach();\n const pointerTarget = options && options.pointerScope === _Input_PointerScope__WEBPACK_IMPORTED_MODULE_22__.PointerScope.Document ? document : this.canvas;\n this.input.pointers = this.input.pointers.recreate(pointerTarget, this);\n this.input.pointers.init();\n }\n /**\n * Attempts to completely clean up excalibur resources, including removing the canvas from the dom.\n *\n * To start again you will need to new up an Engine.\n */\n dispose() {\n if (!this._disposed) {\n this._disposed = true;\n this.stop();\n this._garbageCollector.forceCollectAll();\n this.input.toggleEnabled(false);\n this.canvas.parentNode.removeChild(this.canvas);\n this.canvas = null;\n this.screen.dispose();\n this.graphicsContext.dispose();\n this.graphicsContext = null;\n Engine.InstanceCount--;\n }\n }\n isDisposed() {\n return this._disposed;\n }\n /**\n * Returns a BoundingBox of the top left corner of the screen\n * and the bottom right corner of the screen.\n */\n getWorldBounds() {\n return this.screen.getWorldBounds();\n }\n /**\n * Gets the current engine timescale factor (default is 1.0 which is 1:1 time)\n */\n get timescale() {\n return this._timescale;\n }\n /**\n * Sets the current engine timescale factor. Useful for creating slow-motion effects or fast-forward effects\n * when using time-based movement.\n */\n set timescale(value) {\n if (value < 0) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_4__.Logger.getInstance().warnOnce('engine.timescale to a value less than 0 are ignored');\n return;\n }\n this._timescale = value;\n }\n /**\n * Adds a {@apilink Timer} to the {@apilink currentScene}.\n * @param timer The timer to add to the {@apilink currentScene}.\n */\n addTimer(timer) {\n return this.currentScene.addTimer(timer);\n }\n /**\n * Removes a {@apilink Timer} from the {@apilink currentScene}.\n * @param timer The timer to remove to the {@apilink currentScene}.\n */\n removeTimer(timer) {\n return this.currentScene.removeTimer(timer);\n }\n /**\n * Adds a {@apilink Scene} to the engine, think of scenes in Excalibur as you\n * would levels or menus.\n * @param key The name of the scene, must be unique\n * @param scene The scene to add to the engine\n */\n addScene(key, scene) {\n this.director.add(key, scene);\n return this;\n }\n /**\n * @internal\n */\n removeScene(entity) {\n this.director.remove(entity);\n }\n add(entity) {\n if (arguments.length === 2) {\n this.director.add(arguments[0], arguments[1]);\n return;\n }\n const maybeDeferred = this.director.getDeferredScene();\n if (maybeDeferred instanceof _Scene__WEBPACK_IMPORTED_MODULE_23__.Scene) {\n maybeDeferred.add(entity);\n }\n else {\n this.currentScene.add(entity);\n }\n }\n remove(entity) {\n if (entity instanceof _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_24__.Entity) {\n this.currentScene.remove(entity);\n }\n if (entity instanceof _Scene__WEBPACK_IMPORTED_MODULE_23__.Scene || (0,_Scene__WEBPACK_IMPORTED_MODULE_23__.isSceneConstructor)(entity)) {\n this.removeScene(entity);\n }\n if (typeof entity === 'string') {\n this.removeScene(entity);\n }\n }\n /**\n * Changes the current scene with optionally supplied:\n * * Activation data\n * * Transitions\n * * Loaders\n *\n * Example:\n * ```typescript\n * game.goToScene('myScene', {\n * sceneActivationData: {any: 'thing at all'},\n * destinationIn: new FadeInOut({duration: 1000, direction: 'in'}),\n * sourceOut: new FadeInOut({duration: 1000, direction: 'out'}),\n * loader: MyLoader\n * });\n * ```\n *\n * Scenes are defined in the Engine constructor\n * ```typescript\n * const engine = new ex.Engine({\n scenes: {...}\n });\n * ```\n * Or by adding dynamically\n *\n * ```typescript\n * engine.addScene('myScene', new ex.Scene());\n * ```\n * @param destinationScene\n * @param options\n */\n async goToScene(destinationScene, options) {\n await this.scope(async () => {\n await this.director.goToScene(destinationScene, options);\n });\n }\n /**\n * Transforms the current x, y from screen coordinates to world coordinates\n * @param point Screen coordinate to convert\n */\n screenToWorldCoordinates(point) {\n return this.screen.screenToWorldCoordinates(point);\n }\n /**\n * Transforms a world coordinate, to a screen coordinate\n * @param point World coordinate to convert\n */\n worldToScreenCoordinates(point) {\n return this.screen.worldToScreenCoordinates(point);\n }\n /**\n * Initializes the internal canvas, rendering context, display mode, and native event listeners\n */\n _initialize(options) {\n var _a, _b;\n this.pageScrollPreventionMode = options.scrollPreventionMode;\n // initialize inputs\n const pointerTarget = options && options.pointerScope === _Input_PointerScope__WEBPACK_IMPORTED_MODULE_22__.PointerScope.Document ? document : this.canvas;\n const grabWindowFocus = (_b = (_a = this._originalOptions) === null || _a === void 0 ? void 0 : _a.grabWindowFocus) !== null && _b !== void 0 ? _b : true;\n this.input = new _Input_InputHost__WEBPACK_IMPORTED_MODULE_25__.InputHost({\n pointerTarget,\n grabWindowFocus,\n engine: this\n });\n this.inputMapper = this.input.inputMapper;\n // Issue #385 make use of the visibility api\n // https://developer.mozilla.org/en-US/docs/Web/Guide/User_experience/Using_the_Page_Visibility_API\n this.browser.document.on('visibilitychange', () => {\n if (document.visibilityState === 'hidden') {\n this.events.emit('hidden', new _Events__WEBPACK_IMPORTED_MODULE_26__.HiddenEvent(this));\n this._logger.debug('Window hidden');\n }\n else if (document.visibilityState === 'visible') {\n this.events.emit('visible', new _Events__WEBPACK_IMPORTED_MODULE_26__.VisibleEvent(this));\n this._logger.debug('Window visible');\n }\n });\n if (!this.canvasElementId && !options.canvasElement) {\n document.body.appendChild(this.canvas);\n }\n }\n toggleInputEnabled(enabled) {\n this._inputEnabled = enabled;\n this.input.toggleEnabled(this._inputEnabled);\n }\n onInitialize(engine) {\n // Override me\n }\n /**\n * Gets whether the actor is Initialized\n */\n get isInitialized() {\n return this._isInitialized;\n }\n async _overrideInitialize(engine) {\n if (!this.isInitialized) {\n await this.director.onInitialize();\n await this.onInitialize(engine);\n this.events.emit('initialize', new _Events__WEBPACK_IMPORTED_MODULE_26__.InitializeEvent(engine, this));\n this._isInitialized = true;\n }\n }\n /**\n * Updates the entire state of the game\n * @param elapsed Number of milliseconds elapsed since the last update.\n */\n _update(elapsed) {\n var _a;\n if (this._isLoading) {\n // suspend updates until loading is finished\n (_a = this._loader) === null || _a === void 0 ? void 0 : _a.onUpdate(this, elapsed);\n // Update input listeners\n this.input.update();\n return;\n }\n // Publish preupdate events\n this.clock.__runScheduledCbs('preupdate');\n this._preupdate(elapsed);\n // process engine level events\n this.currentScene.update(this, elapsed);\n // Update graphics postprocessors\n this.graphicsContext.updatePostProcessors(elapsed);\n // Publish update event\n this.clock.__runScheduledCbs('postupdate');\n this._postupdate(elapsed);\n // Update input listeners\n this.input.update();\n }\n /**\n * @internal\n */\n _preupdate(elapsed) {\n this.emit('preupdate', new _Events__WEBPACK_IMPORTED_MODULE_26__.PreUpdateEvent(this, elapsed, this));\n this.onPreUpdate(this, elapsed);\n }\n /**\n * Safe to override method\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n */\n onPreUpdate(engine, elapsed) {\n // Override me\n }\n /**\n * @internal\n */\n _postupdate(elapsed) {\n this.emit('postupdate', new _Events__WEBPACK_IMPORTED_MODULE_26__.PostUpdateEvent(this, elapsed, this));\n this.onPostUpdate(this, elapsed);\n }\n /**\n * Safe to override method\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n */\n onPostUpdate(engine, elapsed) {\n // Override me\n }\n /**\n * Draws the entire game\n * @param elapsed Number of milliseconds elapsed since the last draw.\n */\n _draw(elapsed) {\n var _a, _b;\n // Use scene background color if present, fallback to engine\n this.graphicsContext.backgroundColor = (_a = this.currentScene.backgroundColor) !== null && _a !== void 0 ? _a : this.backgroundColor;\n this.graphicsContext.beginDrawLifecycle();\n this.graphicsContext.clear();\n this.clock.__runScheduledCbs('predraw');\n this._predraw(this.graphicsContext, elapsed);\n // Drawing nothing else while loading\n if (this._isLoading) {\n if (!this._hideLoader) {\n (_b = this._loader) === null || _b === void 0 ? void 0 : _b.canvas.draw(this.graphicsContext, 0, 0);\n this.clock.__runScheduledCbs('postdraw');\n this.graphicsContext.flush();\n this.graphicsContext.endDrawLifecycle();\n }\n return;\n }\n this.currentScene.draw(this.graphicsContext, elapsed);\n this.clock.__runScheduledCbs('postdraw');\n this._postdraw(this.graphicsContext, elapsed);\n // Flush any pending drawings\n this.graphicsContext.flush();\n this.graphicsContext.endDrawLifecycle();\n this._checkForScreenShots();\n }\n /**\n * @internal\n */\n _predraw(ctx, elapsed) {\n this.emit('predraw', new _Events__WEBPACK_IMPORTED_MODULE_26__.PreDrawEvent(ctx, elapsed, this));\n this.onPreDraw(ctx, elapsed);\n }\n /**\n * Safe to override method to hook into pre draw\n * @param ctx {@link ExcaliburGraphicsContext} for drawing\n * @param elapsed Number of milliseconds elapsed since the last draw.\n */\n onPreDraw(ctx, elapsed) {\n // Override me\n }\n /**\n * @internal\n */\n _postdraw(ctx, elapsed) {\n this.emit('postdraw', new _Events__WEBPACK_IMPORTED_MODULE_26__.PostDrawEvent(ctx, elapsed, this));\n this.onPostDraw(ctx, elapsed);\n }\n /**\n * Safe to override method to hook into pre draw\n * @param ctx {@link ExcaliburGraphicsContext} for drawing\n * @param elapsed Number of milliseconds elapsed since the last draw.\n */\n onPostDraw(ctx, elapsed) {\n // Override me\n }\n /**\n * Enable or disable Excalibur debugging functionality.\n * @param toggle a value that debug drawing will be changed to\n */\n showDebug(toggle) {\n this._isDebug = toggle;\n }\n /**\n * Toggle Excalibur debugging functionality.\n */\n toggleDebug() {\n this._isDebug = !this._isDebug;\n return this._isDebug;\n }\n /**\n * Returns true when loading is totally complete and the player has clicked start\n */\n get loadingComplete() {\n return !this._isLoading;\n }\n get ready() {\n return this._isReadyFuture.isCompleted;\n }\n isReady() {\n return this._isReadyFuture.promise;\n }\n async start(sceneNameOrLoader, options) {\n await this.scope(async () => {\n if (!this._compatible) {\n throw new Error('Excalibur is incompatible with your browser');\n }\n this._isLoading = true;\n let loader;\n if (sceneNameOrLoader instanceof _Director_DefaultLoader__WEBPACK_IMPORTED_MODULE_27__.DefaultLoader) {\n loader = sceneNameOrLoader;\n }\n else if (typeof sceneNameOrLoader === 'string') {\n this.director.configureStart(sceneNameOrLoader, options);\n loader = this.director.mainLoader;\n }\n // Start the excalibur clock which drives the mainloop\n this._logger.debug('Starting game clock...');\n this.browser.resume();\n this.clock.start();\n if (this.garbageCollectorConfig) {\n this._garbageCollector.start();\n }\n this._logger.debug('Game clock started');\n await this.load(loader !== null && loader !== void 0 ? loader : new _Director_Loader__WEBPACK_IMPORTED_MODULE_28__.Loader());\n // Initialize before ready\n await this._overrideInitialize(this);\n this._isReadyFuture.resolve();\n this.emit('start', new _Events__WEBPACK_IMPORTED_MODULE_26__.GameStartEvent(this));\n return this._isReadyFuture.promise;\n });\n }\n _mainloop(elapsed) {\n this.scope(() => {\n this.emit('preframe', new _Events__WEBPACK_IMPORTED_MODULE_26__.PreFrameEvent(this, this.stats.prevFrame));\n const elapsedMs = elapsed * this.timescale;\n this.currentFrameElapsedMs = elapsedMs;\n // reset frame stats (reuse existing instances)\n const frameId = this.stats.prevFrame.id + 1;\n this.stats.currFrame.reset();\n this.stats.currFrame.id = frameId;\n this.stats.currFrame.elapsedMs = elapsedMs;\n this.stats.currFrame.fps = this.clock.fpsSampler.fps;\n _Graphics_GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_29__.GraphicsDiagnostics.clear();\n const beforeUpdate = this.clock.now();\n const fixedTimestepMs = this.fixedUpdateTimestep;\n if (this.fixedUpdateTimestep) {\n this._lagMs += elapsedMs;\n while (this._lagMs >= fixedTimestepMs) {\n this._update(fixedTimestepMs);\n this._lagMs -= fixedTimestepMs;\n }\n }\n else {\n this._update(elapsedMs);\n }\n const afterUpdate = this.clock.now();\n this.currentFrameLagMs = this._lagMs;\n this._draw(elapsedMs);\n const afterDraw = this.clock.now();\n this.stats.currFrame.duration.update = afterUpdate - beforeUpdate;\n this.stats.currFrame.duration.draw = afterDraw - afterUpdate;\n this.stats.currFrame.graphics.drawnImages = _Graphics_GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_29__.GraphicsDiagnostics.DrawnImagesCount;\n this.stats.currFrame.graphics.drawCalls = _Graphics_GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_29__.GraphicsDiagnostics.DrawCallCount;\n this.emit('postframe', new _Events__WEBPACK_IMPORTED_MODULE_26__.PostFrameEvent(this, this.stats.currFrame));\n this.stats.prevFrame.reset(this.stats.currFrame);\n this._monitorPerformanceThresholdAndTriggerFallback();\n });\n }\n /**\n * Stops Excalibur's main loop, useful for pausing the game.\n */\n stop() {\n if (this.clock.isRunning()) {\n this.emit('stop', new _Events__WEBPACK_IMPORTED_MODULE_26__.GameStopEvent(this));\n this.browser.pause();\n this.clock.stop();\n this._garbageCollector.stop();\n this._logger.debug('Game stopped');\n }\n }\n /**\n * Returns the Engine's running status, Useful for checking whether engine is running or paused.\n */\n isRunning() {\n return this.clock.isRunning();\n }\n /**\n * Takes a screen shot of the current viewport and returns it as an\n * HTML Image Element.\n * @param preserveHiDPIResolution in the case of HiDPI return the full scaled backing image, by default false\n */\n screenshot(preserveHiDPIResolution = false) {\n const screenShotPromise = new Promise((resolve) => {\n this._screenShotRequests.push({ preserveHiDPIResolution, resolve });\n });\n return screenShotPromise;\n }\n _checkForScreenShots() {\n // We must grab the draw buffer before we yield to the browser\n // the draw buffer is cleared after compositing\n // the reason for the asynchrony is setting `preserveDrawingBuffer: true`\n // forces the browser to copy buffers which can have a mass perf impact on mobile\n for (const request of this._screenShotRequests) {\n const finalWidth = request.preserveHiDPIResolution ? this.canvas.width : this.screen.resolution.width;\n const finalHeight = request.preserveHiDPIResolution ? this.canvas.height : this.screen.resolution.height;\n const screenshot = document.createElement('canvas');\n screenshot.width = finalWidth;\n screenshot.height = finalHeight;\n const ctx = screenshot.getContext('2d');\n ctx.imageSmoothingEnabled = this.screen.antialiasing;\n ctx.drawImage(this.canvas, 0, 0, finalWidth, finalHeight);\n const result = new Image();\n const raw = screenshot.toDataURL('image/png');\n result.onload = () => {\n request.resolve(result);\n };\n result.src = raw;\n }\n // Reset state\n this._screenShotRequests.length = 0;\n }\n /**\n * Another option available to you to load resources into the game.\n * Immediately after calling this the game will pause and the loading screen\n * will appear.\n * @param loader Some {@apilink Loadable} such as a {@apilink Loader} collection, {@apilink Sound}, or {@apilink Texture}.\n */\n async load(loader, hideLoader = false) {\n await this.scope(async () => {\n try {\n // early exit if loaded\n if (loader.isLoaded()) {\n return;\n }\n this._loader = loader;\n this._isLoading = true;\n this._hideLoader = hideLoader;\n if (loader instanceof _Director_Loader__WEBPACK_IMPORTED_MODULE_28__.Loader) {\n loader.suppressPlayButton = loader.suppressPlayButton || this._suppressPlayButton;\n }\n this._loader.onInitialize(this);\n await loader.load();\n }\n catch (e) {\n this._logger.error('Error loading resources, things may not behave properly', e);\n await Promise.resolve();\n }\n finally {\n this._isLoading = false;\n this._hideLoader = false;\n this._loader = null;\n }\n });\n }\n}\nEngine.Context = (0,_Context__WEBPACK_IMPORTED_MODULE_1__.createContext)();\nEngine.InstanceCount = 0;\n/**\n * Default {@apilink EngineOptions}\n */\nEngine._DEFAULT_ENGINE_OPTIONS = {\n width: 0,\n height: 0,\n enableCanvasTransparency: true,\n useDrawSorting: true,\n configurePerformanceCanvas2DFallback: {\n allow: false,\n showPlayerMessage: false,\n threshold: { fps: 20, numberOfFrames: 100 }\n },\n canvasElementId: '',\n canvasElement: undefined,\n enableCanvasContextMenu: false,\n snapToPixel: false,\n antialiasing: true,\n pixelArt: false,\n garbageCollection: true,\n powerPreference: 'high-performance',\n pointerScope: _Input_PointerScope__WEBPACK_IMPORTED_MODULE_22__.PointerScope.Canvas,\n suppressConsoleBootMessage: null,\n suppressMinimumBrowserFeatureDetection: null,\n suppressHiDPIScaling: null,\n suppressPlayButton: null,\n grabWindowFocus: true,\n scrollPreventionMode: ScrollPreventionMode.Canvas,\n backgroundColor: _Color__WEBPACK_IMPORTED_MODULE_30__.Color.fromHex('#2185d0') // Excalibur blue\n};\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/Component.ts\":\n/*!********************************************!*\\\n !*** ./EntityComponentSystem/Component.ts ***!\n \\********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Component: () => (/* binding */ Component),\n/* harmony export */ isComponentCtor: () => (/* binding */ isComponentCtor)\n/* harmony export */ });\n/**\n *\n */\nfunction isComponentCtor(value) {\n return !!value && !!value.prototype && !!value.prototype.constructor;\n}\n/**\n * Type guard to check if a component implements clone\n * @param x\n */\nfunction hasClone(x) {\n return !!(x === null || x === void 0 ? void 0 : x.clone);\n}\n/**\n * Components are containers for state in Excalibur, the are meant to convey capabilities that an Entity possesses\n *\n * Implementations of Component must have a zero-arg constructor to support dependencies\n *\n * ```typescript\n * class MyComponent extends ex.Component {\n * // zero arg support required if you want to use component dependencies\n * constructor(public optionalPos?: ex.Vector) {}\n * }\n * ```\n */\nclass Component {\n constructor() {\n // TODO maybe generate a unique id?\n /**\n * Current owning {@apilink Entity}, if any, of this component. Null if not added to any {@apilink Entity}\n */\n this.owner = undefined;\n }\n /**\n * Clones any properties on this component, if that property value has a `clone()` method it will be called\n */\n clone() {\n const newComponent = new this.constructor();\n for (const prop in this) {\n if (this.hasOwnProperty(prop)) {\n const val = this[prop];\n if (hasClone(val) && prop !== 'owner' && prop !== 'clone') {\n newComponent[prop] = val.clone();\n }\n else {\n newComponent[prop] = val;\n }\n }\n }\n return newComponent;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/Components/MotionComponent.ts\":\n/*!*************************************************************!*\\\n !*** ./EntityComponentSystem/Components/MotionComponent.ts ***!\n \\*************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MotionComponent: () => (/* binding */ MotionComponent)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Component */ \"./EntityComponentSystem/Component.ts\");\n\n\nclass MotionComponent extends _Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor() {\n super(...arguments);\n /**\n * The velocity of an entity in pixels per second\n */\n this.vel = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n /**\n * The acceleration of entity in pixels per second^2\n */\n this.acc = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n /**\n * The scale rate of change in scale units per second\n */\n this.scaleFactor = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n /**\n * The angular velocity which is how quickly the entity is rotating in radians per second\n */\n this.angularVelocity = 0;\n /**\n * The amount of torque applied to the entity, angular acceleration is torque * inertia\n */\n this.torque = 0;\n /**\n * Inertia can be thought of as the resistance to motion\n */\n this.inertia = 1;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/Components/TransformComponent.ts\":\n/*!****************************************************************!*\\\n !*** ./EntityComponentSystem/Components/TransformComponent.ts ***!\n \\****************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TransformComponent: () => (/* binding */ TransformComponent)\n/* harmony export */ });\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Math/coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _Math_transform__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math/transform */ \"./Math/transform.ts\");\n/* harmony import */ var _Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Component */ \"./EntityComponentSystem/Component.ts\");\n/* harmony import */ var _Util_Observable__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Util/Observable */ \"./Util/Observable.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n\n\n\n\n\nclass TransformComponent extends _Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor() {\n super(...arguments);\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this._parentComponent = null;\n this._transform = new _Math_transform__WEBPACK_IMPORTED_MODULE_2__.Transform();\n this._addChildTransform = (child) => {\n const childTxComponent = child.get(TransformComponent);\n if (childTxComponent) {\n childTxComponent._transform.parent = this._transform;\n childTxComponent._parentComponent = this;\n }\n };\n /**\n * Observable that emits when the z index changes on this component\n */\n this.zIndexChanged$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_3__.Observable();\n this._coordPlane = _Math_coord_plane__WEBPACK_IMPORTED_MODULE_4__.CoordPlane.World;\n }\n get() {\n return this._transform;\n }\n onAdd(owner) {\n for (const child of owner.children) {\n this._addChildTransform(child);\n }\n owner.childrenAdded$.subscribe((child) => this._addChildTransform(child));\n owner.childrenRemoved$.subscribe((child) => {\n const childTxComponent = child.get(TransformComponent);\n if (childTxComponent) {\n childTxComponent._transform.parent = null;\n childTxComponent._parentComponent = null;\n }\n });\n }\n onRemove(_previousOwner) {\n this._transform.parent = null;\n this._parentComponent = null;\n }\n /**\n * The z-index ordering of the entity, a higher values are drawn on top of lower values.\n * For example z=99 would be drawn on top of z=0.\n */\n get z() {\n return this._transform.z;\n }\n set z(val) {\n const oldz = this._transform.z;\n this._transform.z = val;\n if (oldz !== val) {\n this.zIndexChanged$.notifyAll(val);\n }\n }\n get globalZ() {\n return this._transform.globalZ;\n }\n set globalZ(z) {\n this._transform.globalZ = z;\n }\n /**\n * The {@apilink CoordPlane | `coordinate plane`} for this transform for the entity.\n */\n get coordPlane() {\n if (this._parentComponent) {\n return this._parentComponent.coordPlane;\n }\n return this._coordPlane;\n }\n set coordPlane(value) {\n var _a;\n if (!this._parentComponent) {\n this._coordPlane = value;\n }\n else {\n this._logger.warn(`Cannot set coordinate plane on child entity ${(_a = this.owner) === null || _a === void 0 ? void 0 : _a.name}, children inherit their coordinate plane from their parents.`);\n }\n }\n get pos() {\n return this._transform.pos;\n }\n set pos(v) {\n this._transform.pos = v;\n }\n get globalPos() {\n return this._transform.globalPos;\n }\n set globalPos(v) {\n this._transform.globalPos = v;\n }\n get rotation() {\n return this._transform.rotation;\n }\n set rotation(rotation) {\n this._transform.rotation = rotation;\n }\n get globalRotation() {\n return this._transform.globalRotation;\n }\n set globalRotation(rotation) {\n this._transform.globalRotation = rotation;\n }\n get scale() {\n return this._transform.scale;\n }\n set scale(v) {\n this._transform.scale = v;\n }\n get globalScale() {\n return this._transform.globalScale;\n }\n set globalScale(v) {\n this._transform.globalScale = v;\n }\n applyInverse(v) {\n return this._transform.applyInverse(v);\n }\n apply(v) {\n return this._transform.apply(v);\n }\n clone() {\n const component = new TransformComponent();\n component._transform = this._transform.clone();\n return component;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/Entity.ts\":\n/*!*****************************************!*\\\n !*** ./EntityComponentSystem/Entity.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AddedComponent: () => (/* binding */ AddedComponent),\n/* harmony export */ Entity: () => (/* binding */ Entity),\n/* harmony export */ EntityEvents: () => (/* binding */ EntityEvents),\n/* harmony export */ RemovedComponent: () => (/* binding */ RemovedComponent),\n/* harmony export */ isAddedComponent: () => (/* binding */ isAddedComponent),\n/* harmony export */ isRemovedComponent: () => (/* binding */ isRemovedComponent)\n/* harmony export */ });\n/* harmony import */ var _Component__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Component */ \"./EntityComponentSystem/Component.ts\");\n/* harmony import */ var _Util_Observable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Observable */ \"./Util/Observable.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Util/Util */ \"./Util/Util.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n\n\n\n\n\n\n\n/**\n * AddedComponent message\n */\nclass AddedComponent {\n constructor(data) {\n this.data = data;\n this.type = 'Component Added';\n }\n}\n/**\n * Type guard to know if message is f an Added Component\n */\nfunction isAddedComponent(x) {\n return !!x && x.type === 'Component Added';\n}\n/**\n * RemovedComponent message\n */\nclass RemovedComponent {\n constructor(data) {\n this.data = data;\n this.type = 'Component Removed';\n }\n}\n/**\n * Type guard to know if message is for a Removed Component\n */\nfunction isRemovedComponent(x) {\n return !!x && x.type === 'Component Removed';\n}\nconst EntityEvents = {\n Add: 'add',\n Remove: 'remove',\n Initialize: 'initialize',\n PreUpdate: 'preupdate',\n PostUpdate: 'postupdate',\n Kill: 'kill'\n};\n/**\n * An Entity is the base type of anything that can have behavior in Excalibur, they are part of the built in entity component system\n *\n * Entities can be strongly typed with the components they contain\n *\n * ```typescript\n * const entity = new Entity();\n * entity.components.a; // Type ComponentA\n * entity.components.b; // Type ComponentB\n * ```\n */\nclass Entity {\n constructor(componentsOrOptions, name) {\n /**\n * The unique identifier for the entity\n */\n this.id = Entity._ID++;\n this.name = `Entity#${this.id}`;\n /**\n * Listen to or emit events for an entity\n */\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n this._tags = new Set();\n this.componentAdded$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_1__.Observable();\n this.componentRemoved$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_1__.Observable();\n this.tagAdded$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_1__.Observable();\n this.tagRemoved$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_1__.Observable();\n /**\n * Current components on the entity\n *\n * **Do not modify**\n *\n * Use addComponent/removeComponent otherwise the ECS will not be notified of changes.\n */\n this.components = new Map();\n this.componentValues = [];\n this._componentsToRemove = [];\n /**\n * The current scene that the entity is in, if any\n */\n this.scene = null;\n /**\n * Whether this entity is active, if set to false it will be reclaimed\n */\n this.isActive = true;\n this._parent = null;\n this.childrenAdded$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_1__.Observable();\n this.childrenRemoved$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_1__.Observable();\n this._children = [];\n this._isInitialized = false;\n this._isAdded = false;\n let componentsToAdd;\n let nameToAdd;\n let silence = false;\n if (Array.isArray(componentsOrOptions)) {\n componentsToAdd = componentsOrOptions;\n nameToAdd = name;\n }\n else if (componentsOrOptions && typeof componentsOrOptions === 'object') {\n const { components, name, silenceWarnings } = componentsOrOptions;\n componentsToAdd = components !== null && components !== void 0 ? components : [];\n nameToAdd = name;\n silence = !!silenceWarnings;\n }\n if (nameToAdd) {\n this.name = nameToAdd;\n }\n if (componentsToAdd) {\n for (const component of componentsToAdd) {\n this.addComponent(component);\n }\n }\n if (true) {\n if (!silence) {\n setTimeout(() => {\n if (!this.scene && !this.isInitialized) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_2__.Logger.getInstance().warn(`Entity \"${this.name || this.id}\" was not added to a scene.`);\n }\n }, 5000);\n }\n }\n }\n /**\n * Whether this entity is active, if set to false it will be reclaimed\n * @deprecated use isActive\n */\n get active() {\n return this.isActive;\n }\n /**\n * Whether this entity is active, if set to false it will be reclaimed\n * @deprecated use isActive\n */\n set active(val) {\n this.isActive = val;\n }\n /**\n * Kill the entity, means it will no longer be updated. Kills are deferred to the end of the update.\n * If parented it will be removed from the parent when killed.\n */\n kill() {\n if (this.isActive) {\n this.isActive = false;\n this.unparent();\n }\n this.emit('kill', new _Events__WEBPACK_IMPORTED_MODULE_3__.KillEvent(this));\n }\n isKilled() {\n return !this.isActive;\n }\n /**\n * Specifically get the tags on the entity from {@apilink TagsComponent}\n */\n get tags() {\n return this._tags;\n }\n /**\n * Check if a tag exists on the entity\n * @param tag name to check for\n */\n hasTag(tag) {\n return this._tags.has(tag);\n }\n /**\n * Adds a tag to an entity\n * @param tag\n */\n addTag(tag) {\n this._tags.add(tag);\n this.tagAdded$.notifyAll(tag);\n return this;\n }\n /**\n * Removes a tag on the entity\n *\n * Removals are deferred until the end of update\n * @param tag\n */\n removeTag(tag) {\n this._tags.delete(tag);\n this.tagRemoved$.notifyAll(tag);\n return this;\n }\n /**\n * The types of the components on the Entity\n */\n get types() {\n return Array.from(this.components.keys());\n }\n /**\n * Returns all component instances on entity\n */\n getComponents() {\n return Array.from(this.components.values());\n }\n /**\n * Verifies that an entity has all the required types\n * @param requiredTypes\n */\n hasAll(requiredTypes) {\n for (let i = 0; i < requiredTypes.length; i++) {\n if (!this.components.has(requiredTypes[i])) {\n return false;\n }\n }\n return true;\n }\n /**\n * Verifies that an entity has all the required tags\n * @param requiredTags\n */\n hasAllTags(requiredTags) {\n for (let i = 0; i < requiredTags.length; i++) {\n if (!this.tags.has(requiredTags[i])) {\n return false;\n }\n }\n return true;\n }\n get(type) {\n return this.components.get(type);\n }\n get parent() {\n return this._parent;\n }\n /**\n * Get the direct children of this entity\n */\n get children() {\n return this._children;\n }\n /**\n * Unparents this entity, if there is a parent. Otherwise it does nothing.\n */\n unparent() {\n if (this._parent) {\n this._parent.removeChild(this);\n this._parent = null;\n }\n }\n /**\n * Adds an entity to be a child of this entity\n * @param entity\n */\n addChild(entity) {\n if (entity.parent === null) {\n if (this.getAncestors().includes(entity)) {\n throw new Error('Cycle detected, cannot add entity');\n }\n this._children.push(entity);\n entity._parent = this;\n this.childrenAdded$.notifyAll(entity);\n }\n else {\n throw new Error('Entity already has a parent, cannot add without unparenting');\n }\n return this;\n }\n /**\n * Remove an entity from children if it exists\n * @param entity\n */\n removeChild(entity) {\n if (entity.parent === this) {\n (0,_Util_Util__WEBPACK_IMPORTED_MODULE_4__.removeItemFromArray)(entity, this._children);\n entity._parent = null;\n this.childrenRemoved$.notifyAll(entity);\n }\n return this;\n }\n /**\n * Removes all children from this entity\n */\n removeAllChildren() {\n // Avoid modifying the array issue by walking backwards\n for (let i = this.children.length - 1; i >= 0; i--) {\n this.removeChild(this.children[i]);\n }\n return this;\n }\n /**\n * Returns a list of parent entities starting with the topmost parent. Includes the current entity.\n */\n getAncestors() {\n const result = [this];\n let current = this.parent;\n while (current) {\n result.push(current);\n current = current.parent;\n }\n return result.reverse();\n }\n /**\n * Returns a list of all the entities that descend from this entity. Includes the current entity.\n */\n getDescendants() {\n let result = [this];\n let queue = [this];\n while (queue.length > 0) {\n const curr = queue.pop();\n if (curr) {\n queue = queue.concat(curr.children);\n result = result.concat(curr.children);\n }\n }\n return result;\n }\n /**\n * Creates a deep copy of the entity and a copy of all its components\n */\n clone() {\n const newEntity = new Entity();\n for (const c of this.types) {\n const componentInstance = this.get(c);\n if (componentInstance) {\n newEntity.addComponent(componentInstance.clone());\n }\n }\n for (const child of this.children) {\n newEntity.addChild(child.clone());\n }\n return newEntity;\n }\n /**\n * Adds a copy of all the components from another template entity as a \"prefab\"\n * @param templateEntity Entity to use as a template\n * @param force Force component replacement if it already exists on the target entity\n */\n addTemplate(templateEntity, force = false) {\n for (const c of templateEntity.getComponents()) {\n this.addComponent(c.clone(), force);\n }\n for (const child of templateEntity.children) {\n this.addChild(child.clone().addTemplate(child));\n }\n return this;\n }\n _getClassHierarchyRoot(componentType) {\n var _a, _b;\n let current = componentType;\n let parent = (_a = Object.getPrototypeOf(current.prototype)) === null || _a === void 0 ? void 0 : _a.constructor;\n while (parent && parent !== Object && parent !== _Component__WEBPACK_IMPORTED_MODULE_5__.Component) {\n current = parent;\n parent = (_b = Object.getPrototypeOf(current.prototype)) === null || _b === void 0 ? void 0 : _b.constructor;\n }\n return current;\n }\n /**\n * Adds a component to the entity\n * @param component Component or Entity to add copy of components from\n * @param force Optionally overwrite any existing components of the same type\n */\n addComponent(component, force = false) {\n // if component already exists, skip if not forced\n if (this.has(component.constructor)) {\n if (force) {\n // Remove existing component type if exists when forced\n this.removeComponent(component.constructor, true);\n }\n else {\n // early exit component exits\n return this;\n }\n }\n // TODO circular dependencies will be a problem\n if (component.dependencies && component.dependencies.length) {\n for (const ctor of component.dependencies) {\n this.addComponent(new ctor());\n }\n }\n component.owner = this;\n const rootComponent = this._getClassHierarchyRoot(component.constructor);\n this.components.set(rootComponent, component);\n this.components.set(component.constructor, component);\n this.componentValues.push(component);\n if (component.onAdd) {\n component.onAdd(this);\n }\n this.componentAdded$.notifyAll(component);\n return this;\n }\n /**\n * Removes a component from the entity, by default removals are deferred to the end of entity update to avoid consistency issues\n *\n * Components can be force removed with the `force` flag, the removal is not deferred and happens immediately\n * @param typeOrInstance\n * @param force\n */\n removeComponent(typeOrInstance, force = false) {\n let type;\n if ((0,_Component__WEBPACK_IMPORTED_MODULE_5__.isComponentCtor)(typeOrInstance)) {\n type = typeOrInstance;\n }\n else {\n type = typeOrInstance.constructor;\n }\n if (force) {\n const componentToRemove = this.components.get(type);\n if (componentToRemove) {\n this.componentRemoved$.notifyAll(componentToRemove);\n componentToRemove.owner = undefined;\n if (componentToRemove.onRemove) {\n componentToRemove.onRemove(this);\n }\n const componentIndex = this.componentValues.indexOf(componentToRemove);\n if (componentIndex > -1) {\n this.componentValues.splice(componentIndex, 1);\n }\n }\n const rootComponent = this._getClassHierarchyRoot(type);\n this.components.delete(rootComponent);\n this.components.delete(type); // remove after the notify to preserve typing\n }\n else {\n this._componentsToRemove.push(type);\n }\n return this;\n }\n clearComponents() {\n const components = this.types;\n for (const c of components) {\n this.removeComponent(c);\n }\n }\n /**\n * @hidden\n * @internal\n */\n processComponentRemoval() {\n for (const type of this._componentsToRemove) {\n this.removeComponent(type, true);\n }\n this._componentsToRemove.length = 0;\n }\n /**\n * Check if a component type exists\n * @param type\n */\n has(type) {\n return this.components.has(type);\n }\n /**\n * Gets whether the actor is Initialized\n */\n get isInitialized() {\n return this._isInitialized;\n }\n get isAdded() {\n return this._isAdded;\n }\n /**\n * Initializes this entity, meant to be called by the Scene before first update not by users of Excalibur.\n *\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n * @internal\n */\n _initialize(engine) {\n if (!this.isInitialized) {\n this.onInitialize(engine);\n this.events.emit('initialize', new _Events__WEBPACK_IMPORTED_MODULE_3__.InitializeEvent(engine, this));\n this._isInitialized = true;\n }\n }\n /**\n * Adds this Actor, meant to be called by the Scene when Actor is added.\n *\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n * @internal\n */\n _add(engine) {\n if (!this.isAdded && this.isActive) {\n this.onAdd(engine);\n this.events.emit('add', new _Events__WEBPACK_IMPORTED_MODULE_3__.AddEvent(engine, this));\n this._isAdded = true;\n }\n }\n /**\n * Removes Actor, meant to be called by the Scene when Actor is added.\n *\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n * @internal\n */\n _remove(engine) {\n if (this.isAdded && !this.isActive) {\n this.onRemove(engine);\n this.events.emit('remove', new _Events__WEBPACK_IMPORTED_MODULE_3__.RemoveEvent(engine, this));\n this._isAdded = false;\n }\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _preupdate handler for {@apilink onPreUpdate} lifecycle event\n * @internal\n */\n _preupdate(engine, elapsed) {\n this.events.emit('preupdate', new _Events__WEBPACK_IMPORTED_MODULE_3__.PreUpdateEvent(engine, elapsed, this));\n this.onPreUpdate(engine, elapsed);\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _preupdate handler for {@apilink onPostUpdate} lifecycle event\n * @internal\n */\n _postupdate(engine, elapsed) {\n this.events.emit('postupdate', new _Events__WEBPACK_IMPORTED_MODULE_3__.PostUpdateEvent(engine, elapsed, this));\n this.onPostUpdate(engine, elapsed);\n }\n /**\n * `onInitialize` is called before the first update of the entity. This method is meant to be\n * overridden.\n *\n * Synonymous with the event handler `.on('initialize', (evt) => {...})`\n */\n onInitialize(engine) {\n // Override me\n }\n /**\n * `onAdd` is called when Actor is added to scene. This method is meant to be\n * overridden.\n *\n * Synonymous with the event handler `.on('add', (evt) => {...})`\n */\n onAdd(engine) {\n // Override me\n }\n /**\n * `onRemove` is called when Actor is added to scene. This method is meant to be\n * overridden.\n *\n * Synonymous with the event handler `.on('remove', (evt) => {...})`\n */\n onRemove(engine) {\n // Override me\n }\n /**\n * Safe to override onPreUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPreUpdate` is called directly before an entity is updated.\n */\n onPreUpdate(engine, elapsed) {\n // Override me\n }\n /**\n * Safe to override onPostUpdate lifecycle event handler. Synonymous with `.on('postupdate', (evt) =>{...})`\n *\n * `onPostUpdate` is called directly after an entity is updated.\n */\n onPostUpdate(engine, elapsed) {\n // Override me\n }\n /**\n *\n * Entity update lifecycle, called internally\n * @internal\n * @param engine\n * @param elapsed\n */\n update(engine, elapsed) {\n this._initialize(engine);\n this._add(engine);\n this._preupdate(engine, elapsed);\n for (const child of this.children) {\n child.update(engine, elapsed);\n }\n this._postupdate(engine, elapsed);\n this._remove(engine);\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n if (handler) {\n this.events.off(eventName, handler);\n }\n else {\n this.events.off(eventName);\n }\n }\n}\nEntity._ID = 0;\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/EntityManager.ts\":\n/*!************************************************!*\\\n !*** ./EntityComponentSystem/EntityManager.ts ***!\n \\************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EntityManager: () => (/* binding */ EntityManager)\n/* harmony export */ });\n/* harmony import */ var _Entity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Util */ \"./Util/Util.ts\");\n\n\n// Add/Remove entities and components\nclass EntityManager {\n constructor(_world) {\n this._world = _world;\n this.entities = [];\n this._entityIndex = {};\n this._childAddedHandlerMap = new Map();\n this._childRemovedHandlerMap = new Map();\n this._createChildAddedHandler = () => (e) => {\n this.addEntity(e);\n };\n this._createChildRemovedHandler = () => (e) => {\n this.removeEntity(e, false);\n };\n this._entitiesToRemove = [];\n }\n /**\n * Runs the entity lifecycle\n * @param scene\n * @param elapsed\n */\n updateEntities(scene, elapsed) {\n for (let entityIndex = 0; entityIndex < this.entities.length; entityIndex++) {\n const entity = this.entities[entityIndex];\n entity.update(scene.engine, elapsed);\n if (!entity.isActive) {\n this.removeEntity(entity);\n }\n }\n }\n findEntitiesForRemoval() {\n for (let entityIndex = 0; entityIndex < this.entities.length; entityIndex++) {\n const entity = this.entities[entityIndex];\n if (!entity.isActive) {\n this.removeEntity(entity);\n }\n }\n }\n /**\n * Adds an entity to be tracked by the EntityManager\n * @param entity\n */\n addEntity(entity) {\n entity.isActive = true;\n entity.scene = this._world.scene;\n if (entity && !this._entityIndex[entity.id]) {\n this._entityIndex[entity.id] = entity;\n this.entities.push(entity);\n this._world.queryManager.addEntity(entity);\n // if entity has children\n entity.children.forEach((c) => {\n c.scene = entity.scene;\n this.addEntity(c);\n });\n const childAdded = this._createChildAddedHandler();\n this._childAddedHandlerMap.set(entity, childAdded);\n const childRemoved = this._createChildRemovedHandler();\n this._childRemovedHandlerMap.set(entity, childRemoved);\n entity.childrenAdded$.subscribe(childAdded);\n entity.childrenRemoved$.subscribe(childRemoved);\n }\n }\n removeEntity(idOrEntity, deferred = true) {\n var _a, _b;\n let id = 0;\n if (idOrEntity instanceof _Entity__WEBPACK_IMPORTED_MODULE_0__.Entity) {\n id = idOrEntity.id;\n }\n else {\n id = idOrEntity;\n }\n const entity = this._entityIndex[id];\n if (entity && entity.isActive) {\n entity.isActive = false;\n }\n if (entity && deferred) {\n this._entitiesToRemove.push(entity);\n return;\n }\n delete this._entityIndex[id];\n if (entity) {\n entity.scene = null;\n (0,_Util_Util__WEBPACK_IMPORTED_MODULE_1__.removeItemFromArray)(entity, this.entities);\n this._world.queryManager.removeEntity(entity);\n // if entity has children\n entity.children.forEach((c) => {\n c.scene = null;\n this.removeEntity(c, deferred);\n });\n const childAddedHandler = this._childAddedHandlerMap.get(entity);\n if (childAddedHandler) {\n entity.childrenAdded$.unsubscribe(childAddedHandler);\n }\n const childRemovedHandler = this._childRemovedHandlerMap.get(entity);\n if (childRemovedHandler) {\n entity.childrenRemoved$.unsubscribe(childRemovedHandler);\n }\n // stats\n if ((_b = (_a = this._world) === null || _a === void 0 ? void 0 : _a.scene) === null || _b === void 0 ? void 0 : _b.engine) {\n this._world.scene.engine.stats.currFrame.actors.killed++;\n }\n }\n }\n processEntityRemovals() {\n for (let entityIndex = 0; entityIndex < this._entitiesToRemove.length; entityIndex++) {\n const entity = this._entitiesToRemove[entityIndex];\n if (entity.isActive) {\n continue;\n }\n this.removeEntity(entity, false);\n }\n this._entitiesToRemove.length = 0;\n }\n processComponentRemovals() {\n for (let entityIndex = 0; entityIndex < this.entities.length; entityIndex++) {\n const entity = this.entities[entityIndex];\n entity.processComponentRemoval();\n }\n }\n getById(id) {\n return this._entityIndex[id];\n }\n getByName(name) {\n return this.entities.filter((e) => e.name === name);\n }\n clear() {\n for (let i = this.entities.length - 1; i >= 0; i--) {\n this.removeEntity(this.entities[i]);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/Priority.ts\":\n/*!*******************************************!*\\\n !*** ./EntityComponentSystem/Priority.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SystemPriority: () => (/* binding */ SystemPriority)\n/* harmony export */ });\n/**\n * Higher priorities run earlier than others in the system update\n */\nconst SystemPriority = {\n Highest: -Infinity,\n Higher: -5,\n Average: 0,\n Lower: 5,\n Lowest: Infinity\n};\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/Query.ts\":\n/*!****************************************!*\\\n !*** ./EntityComponentSystem/Query.ts ***!\n \\****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Query: () => (/* binding */ Query)\n/* harmony export */ });\n/* harmony import */ var _Util_Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Util/Observable */ \"./Util/Observable.ts\");\n\n/**\n * Represents query for entities that match a list of types that is cached and observable\n *\n * Queries can be strongly typed by supplying a type union in the optional type parameter\n * ```typescript\n * const queryAB = new ex.Query(['A', 'B']);\n * ```\n */\nclass Query {\n constructor(requiredComponents) {\n this.requiredComponents = requiredComponents;\n this.components = new Set();\n this.entities = [];\n /**\n * This fires right after the component is added\n */\n this.entityAdded$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_0__.Observable();\n /**\n * This fires right before the component is actually removed from the entity, it will still be available for cleanup purposes\n */\n this.entityRemoved$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_0__.Observable();\n if (requiredComponents.length === 0) {\n throw new Error('Cannot create query without components');\n }\n for (const type of requiredComponents) {\n this.components.add(type);\n }\n this.id = Query.createId(requiredComponents);\n }\n static createId(requiredComponents) {\n // TODO what happens if a user defines the same type name as a built in type\n // ! TODO this could be dangerous depending on the bundler's settings for names\n // Maybe some kind of hash function is better here?\n return requiredComponents\n .slice()\n .map((c) => c.name)\n .sort()\n .join('-');\n }\n /**\n * Potentially adds an entity to a query index, returns true if added, false if not\n * @param entity\n */\n checkAndAdd(entity) {\n if (!this.entities.includes(entity) && entity.hasAll(Array.from(this.components))) {\n this.entities.push(entity);\n this.entityAdded$.notifyAll(entity);\n return true;\n }\n return false;\n }\n removeEntity(entity) {\n const index = this.entities.indexOf(entity);\n if (index > -1) {\n this.entities.splice(index, 1);\n this.entityRemoved$.notifyAll(entity);\n }\n }\n /**\n * Returns a list of entities that match the query\n * @param sort Optional sorting function to sort entities returned from the query\n */\n getEntities(sort) {\n if (sort) {\n this.entities.sort(sort);\n }\n return this.entities;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/QueryManager.ts\":\n/*!***********************************************!*\\\n !*** ./EntityComponentSystem/QueryManager.ts ***!\n \\***********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ QueryManager: () => (/* binding */ QueryManager)\n/* harmony export */ });\n/* harmony import */ var _Query__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Query */ \"./EntityComponentSystem/Query.ts\");\n/* harmony import */ var _TagQuery__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./TagQuery */ \"./EntityComponentSystem/TagQuery.ts\");\n\n\n/**\n * The query manager is responsible for updating all queries when entities/components change\n */\nclass QueryManager {\n constructor(_world) {\n this._world = _world;\n this._queries = new Map();\n this._addComponentHandlers = new Map();\n this._removeComponentHandlers = new Map();\n this._componentToQueriesIndex = new Map();\n this._tagQueries = new Map();\n this._addTagHandlers = new Map();\n this._removeTagHandlers = new Map();\n this._tagToQueriesIndex = new Map();\n this._createAddComponentHandler = (entity) => (c) => {\n this.addComponent(entity, c);\n };\n this._createRemoveComponentHandler = (entity) => (c) => {\n this.removeComponent(entity, c);\n };\n this._createAddTagHandler = (entity) => (tag) => {\n this.addTag(entity, tag);\n };\n this._createRemoveTagHandler = (entity) => (tag) => {\n this.removeTag(entity, tag);\n };\n }\n createQuery(requiredComponents) {\n const id = _Query__WEBPACK_IMPORTED_MODULE_0__.Query.createId(requiredComponents);\n if (this._queries.has(id)) {\n // short circuit if query is already created\n return this._queries.get(id);\n }\n const query = new _Query__WEBPACK_IMPORTED_MODULE_0__.Query(requiredComponents);\n this._queries.set(query.id, query);\n // index maintenance\n for (const component of requiredComponents) {\n const queries = this._componentToQueriesIndex.get(component);\n if (!queries) {\n this._componentToQueriesIndex.set(component, [query]);\n }\n else {\n queries.push(query);\n }\n }\n for (const entity of this._world.entities) {\n this.addEntity(entity);\n }\n return query;\n }\n createTagQuery(requiredTags) {\n const id = _TagQuery__WEBPACK_IMPORTED_MODULE_1__.TagQuery.createId(requiredTags);\n if (this._tagQueries.has(id)) {\n // short circuit if query is already created\n return this._tagQueries.get(id);\n }\n const query = new _TagQuery__WEBPACK_IMPORTED_MODULE_1__.TagQuery(requiredTags);\n this._tagQueries.set(query.id, query);\n // index maintenance\n for (const tag of requiredTags) {\n const queries = this._tagToQueriesIndex.get(tag);\n if (!queries) {\n this._tagToQueriesIndex.set(tag, [query]);\n }\n else {\n queries.push(query);\n }\n }\n for (const entity of this._world.entities) {\n this.addEntity(entity);\n }\n return query;\n }\n /**\n * Scans queries and locates any that need this entity added\n * @param entity\n */\n addEntity(entity) {\n const maybeAddComponent = this._addComponentHandlers.get(entity);\n const maybeRemoveComponent = this._removeComponentHandlers.get(entity);\n const addComponent = maybeAddComponent !== null && maybeAddComponent !== void 0 ? maybeAddComponent : this._createAddComponentHandler(entity);\n const removeComponent = maybeRemoveComponent !== null && maybeRemoveComponent !== void 0 ? maybeRemoveComponent : this._createRemoveComponentHandler(entity);\n this._addComponentHandlers.set(entity, addComponent);\n this._removeComponentHandlers.set(entity, removeComponent);\n const maybeAddTag = this._addTagHandlers.get(entity);\n const maybeRemoveTag = this._removeTagHandlers.get(entity);\n const addTag = maybeAddTag !== null && maybeAddTag !== void 0 ? maybeAddTag : this._createAddTagHandler(entity);\n const removeTag = maybeRemoveTag !== null && maybeRemoveTag !== void 0 ? maybeRemoveTag : this._createRemoveTagHandler(entity);\n this._addTagHandlers.set(entity, addTag);\n this._removeTagHandlers.set(entity, removeTag);\n for (const query of this._queries.values()) {\n query.checkAndAdd(entity);\n }\n for (const tagQuery of this._tagQueries.values()) {\n tagQuery.checkAndAdd(entity);\n }\n entity.componentAdded$.subscribe(addComponent);\n entity.componentRemoved$.subscribe(removeComponent);\n entity.tagAdded$.subscribe(addTag);\n entity.tagRemoved$.subscribe(removeTag);\n }\n /**\n * Scans queries and locates any that need this entity removed\n * @param entity\n */\n removeEntity(entity) {\n // Handle components\n const addComponent = this._addComponentHandlers.get(entity);\n const removeComponent = this._removeComponentHandlers.get(entity);\n for (const query of this._queries.values()) {\n query.removeEntity(entity);\n }\n if (addComponent) {\n entity.componentAdded$.unsubscribe(addComponent);\n }\n if (removeComponent) {\n entity.componentRemoved$.unsubscribe(removeComponent);\n }\n // Handle tags\n const addTag = this._addTagHandlers.get(entity);\n const removeTag = this._removeTagHandlers.get(entity);\n for (const tagQuery of this._tagQueries.values()) {\n tagQuery.removeEntity(entity);\n }\n if (addTag) {\n entity.tagAdded$.unsubscribe(addTag);\n }\n if (removeTag) {\n entity.tagRemoved$.unsubscribe(removeTag);\n }\n }\n /**\n * Updates any queries when a component is added to an entity\n * @param entity\n * @param component\n */\n addComponent(entity, component) {\n var _a;\n const queries = (_a = this._componentToQueriesIndex.get(component.constructor)) !== null && _a !== void 0 ? _a : [];\n for (const query of queries) {\n query.checkAndAdd(entity);\n }\n }\n /**\n * Updates any queries when a component is removed from an entity\n * @param entity\n * @param component\n */\n removeComponent(entity, component) {\n var _a;\n const queries = (_a = this._componentToQueriesIndex.get(component.constructor)) !== null && _a !== void 0 ? _a : [];\n for (const query of queries) {\n query.removeEntity(entity);\n }\n }\n /**\n * Updates any queries when a tag is added to an entity\n * @param entity\n * @param tag\n */\n addTag(entity, tag) {\n var _a;\n const queries = (_a = this._tagToQueriesIndex.get(tag)) !== null && _a !== void 0 ? _a : [];\n for (const query of queries) {\n query.checkAndAdd(entity);\n }\n }\n /**\n * Updates any queries when a component is removed from an entity\n * @param entity\n * @param tag\n */\n removeTag(entity, tag) {\n var _a;\n const queries = (_a = this._tagToQueriesIndex.get(tag)) !== null && _a !== void 0 ? _a : [];\n for (const query of queries) {\n query.removeEntity(entity);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/System.ts\":\n/*!*****************************************!*\\\n !*** ./EntityComponentSystem/System.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ System: () => (/* binding */ System),\n/* harmony export */ SystemType: () => (/* binding */ SystemType)\n/* harmony export */ });\n/* harmony import */ var _Priority__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Priority */ \"./EntityComponentSystem/Priority.ts\");\n\n/**\n * Enum that determines whether to run the system in the update or draw phase\n */\nvar SystemType;\n(function (SystemType) {\n SystemType[\"Update\"] = \"update\";\n SystemType[\"Draw\"] = \"draw\";\n})(SystemType || (SystemType = {}));\n/**\n * An Excalibur {@apilink System} that updates entities of certain types.\n * Systems are scene specific\n *\n *\n *\n * Excalibur Systems currently require at least 1 Component type to operated\n *\n * Multiple types are declared as a type union\n * For example:\n *\n * ```typescript\n * class MySystem extends System {\n * static priority = SystemPriority.Lowest;\n * public readonly systemType = SystemType.Update;\n * public query: Query;\n * constructor(public world: World) {\n * super();\n * this.query = this.world.query([TransformComponent]);\n * }\n * public update(elapsed: number) {\n * ...\n * }\n * }\n * ```\n */\nclass System {\n}\n/**\n * System can execute in priority order, by default all systems are priority 0. Lower values indicated higher priority.\n * For a system to execute before all other a lower priority value (-1 for example) must be set.\n * For a system to execute after all other a higher priority value (10 for example) must be set.\n */\nSystem.priority = _Priority__WEBPACK_IMPORTED_MODULE_0__.SystemPriority.Average;\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/SystemManager.ts\":\n/*!************************************************!*\\\n !*** ./EntityComponentSystem/SystemManager.ts ***!\n \\************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SystemManager: () => (/* binding */ SystemManager),\n/* harmony export */ isSystemConstructor: () => (/* binding */ isSystemConstructor)\n/* harmony export */ });\n/* harmony import */ var _System__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Util */ \"./Util/Util.ts\");\n\n\n/**\n *\n */\nfunction isSystemConstructor(x) {\n var _a, _b;\n return !!(x === null || x === void 0 ? void 0 : x.prototype) && !!((_b = (_a = x === null || x === void 0 ? void 0 : x.prototype) === null || _a === void 0 ? void 0 : _a.constructor) === null || _b === void 0 ? void 0 : _b.name);\n}\n/**\n * The SystemManager is responsible for keeping track of all systems in a scene.\n * Systems are scene specific\n */\nclass SystemManager {\n constructor(_world) {\n this._world = _world;\n /**\n * List of systems, to add a new system call {@apilink SystemManager.addSystem}\n */\n this.systems = [];\n this.initialized = false;\n }\n /**\n * Get a system registered in the manager by type\n * @param systemType\n */\n get(systemType) {\n return this.systems.find((s) => s instanceof systemType);\n }\n /**\n * Adds a system to the manager, it will now be updated every frame\n * @param systemOrCtor\n */\n addSystem(systemOrCtor) {\n let system;\n if (systemOrCtor instanceof _System__WEBPACK_IMPORTED_MODULE_0__.System) {\n system = systemOrCtor;\n }\n else {\n system = new systemOrCtor(this._world);\n }\n this.systems.push(system);\n this.systems.sort((a, b) => a.constructor.priority - b.constructor.priority);\n // If systems are added and the manager has already been init'd\n // then immediately init the system\n if (this.initialized && system.initialize) {\n system.initialize(this._world, this._world.scene);\n }\n }\n /**\n * Removes a system from the manager, it will no longer be updated\n * @param system\n */\n removeSystem(system) {\n (0,_Util_Util__WEBPACK_IMPORTED_MODULE_1__.removeItemFromArray)(system, this.systems);\n }\n /**\n * Initialize all systems in the manager\n *\n * Systems added after initialize() will be initialized on add\n */\n initialize() {\n if (!this.initialized) {\n this.initialized = true;\n for (const s of this.systems) {\n if (s.initialize) {\n s.initialize(this._world, this._world.scene);\n }\n }\n }\n }\n /**\n * Updates all systems\n * @param type whether this is an update or draw system\n * @param scene context reference\n * @param elapsed time in milliseconds\n */\n updateSystems(type, scene, elapsed) {\n const systems = this.systems.filter((s) => s.systemType === type);\n for (const s of systems) {\n if (s.preupdate) {\n s.preupdate(scene, elapsed);\n }\n }\n for (const s of systems) {\n s.update(elapsed);\n }\n for (const s of systems) {\n if (s.postupdate) {\n s.postupdate(scene, elapsed);\n }\n }\n }\n clear() {\n for (let i = this.systems.length - 1; i >= 0; i--) {\n this.removeSystem(this.systems[i]);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/TagQuery.ts\":\n/*!*******************************************!*\\\n !*** ./EntityComponentSystem/TagQuery.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TagQuery: () => (/* binding */ TagQuery)\n/* harmony export */ });\n/* harmony import */ var _Util_Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Util/Observable */ \"./Util/Observable.ts\");\n\nclass TagQuery {\n constructor(requiredTags) {\n this.requiredTags = requiredTags;\n this.tags = new Set();\n this.entities = [];\n /**\n * This fires right after the component is added\n */\n this.entityAdded$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_0__.Observable();\n /**\n * This fires right before the component is actually removed from the entity, it will still be available for cleanup purposes\n */\n this.entityRemoved$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_0__.Observable();\n if (requiredTags.length === 0) {\n throw new Error('Cannot create tag query without tags');\n }\n for (const tag of requiredTags) {\n this.tags.add(tag);\n }\n this.id = TagQuery.createId(requiredTags);\n }\n static createId(requiredComponents) {\n return requiredComponents.slice().sort().join('-');\n }\n checkAndAdd(entity) {\n if (!this.entities.includes(entity) && entity.hasAllTags(Array.from(this.tags))) {\n this.entities.push(entity);\n this.entityAdded$.notifyAll(entity);\n return true;\n }\n return false;\n }\n removeEntity(entity) {\n const index = this.entities.indexOf(entity);\n if (index > -1) {\n this.entities.splice(index, 1);\n this.entityRemoved$.notifyAll(entity);\n }\n }\n /**\n * Returns a list of entities that match the query\n * @param sort Optional sorting function to sort entities returned from the query\n */\n getEntities(sort) {\n if (sort) {\n this.entities.sort(sort);\n }\n return this.entities;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/World.ts\":\n/*!****************************************!*\\\n !*** ./EntityComponentSystem/World.ts ***!\n \\****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ World: () => (/* binding */ World)\n/* harmony export */ });\n/* harmony import */ var _Entity__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _EntityManager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./EntityManager */ \"./EntityComponentSystem/EntityManager.ts\");\n/* harmony import */ var _QueryManager__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./QueryManager */ \"./EntityComponentSystem/QueryManager.ts\");\n/* harmony import */ var _System__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _SystemManager__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./SystemManager */ \"./EntityComponentSystem/SystemManager.ts\");\n\n\n\n\n\n/**\n * The World is a self-contained entity component system for a particular context.\n */\nclass World {\n /**\n * The context type is passed to the system updates\n * @param scene\n */\n constructor(scene) {\n this.scene = scene;\n this.queryManager = new _QueryManager__WEBPACK_IMPORTED_MODULE_0__.QueryManager(this);\n this.entityManager = new _EntityManager__WEBPACK_IMPORTED_MODULE_1__.EntityManager(this);\n this.systemManager = new _SystemManager__WEBPACK_IMPORTED_MODULE_2__.SystemManager(this);\n }\n /**\n * Query the ECS world for entities that match your components\n * @param requiredTypes\n */\n query(requiredTypes) {\n return this.queryManager.createQuery(requiredTypes);\n }\n queryTags(requiredTags) {\n return this.queryManager.createTagQuery(requiredTags);\n }\n /**\n * Update systems by type and time elapsed in milliseconds\n */\n update(type, elapsed) {\n if (type === _System__WEBPACK_IMPORTED_MODULE_3__.SystemType.Update) {\n this.entityManager.updateEntities(this.scene, elapsed);\n }\n this.systemManager.updateSystems(type, this.scene, elapsed);\n this.entityManager.findEntitiesForRemoval();\n this.entityManager.processComponentRemovals();\n this.entityManager.processEntityRemovals();\n }\n add(entityOrSystem) {\n if (entityOrSystem instanceof _Entity__WEBPACK_IMPORTED_MODULE_4__.Entity) {\n this.entityManager.addEntity(entityOrSystem);\n }\n if (entityOrSystem instanceof _System__WEBPACK_IMPORTED_MODULE_3__.System || (0,_SystemManager__WEBPACK_IMPORTED_MODULE_2__.isSystemConstructor)(entityOrSystem)) {\n this.systemManager.addSystem(entityOrSystem);\n }\n }\n /**\n * Get a system out of the ECS world\n */\n get(system) {\n return this.systemManager.get(system);\n }\n remove(entityOrSystem, deferred = true) {\n if (entityOrSystem instanceof _Entity__WEBPACK_IMPORTED_MODULE_4__.Entity) {\n this.entityManager.removeEntity(entityOrSystem, deferred);\n }\n if (entityOrSystem instanceof _System__WEBPACK_IMPORTED_MODULE_3__.System) {\n this.systemManager.removeSystem(entityOrSystem);\n }\n }\n get entities() {\n return this.entityManager.entities;\n }\n clearEntities() {\n this.entityManager.clear();\n }\n clearSystems() {\n this.systemManager.clear();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/index.ts\":\n/*!****************************************!*\\\n !*** ./EntityComponentSystem/index.ts ***!\n \\****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AddedComponent: () => (/* reexport safe */ _Entity__WEBPACK_IMPORTED_MODULE_1__.AddedComponent),\n/* harmony export */ Component: () => (/* reexport safe */ _Component__WEBPACK_IMPORTED_MODULE_0__.Component),\n/* harmony export */ Entity: () => (/* reexport safe */ _Entity__WEBPACK_IMPORTED_MODULE_1__.Entity),\n/* harmony export */ EntityEvents: () => (/* reexport safe */ _Entity__WEBPACK_IMPORTED_MODULE_1__.EntityEvents),\n/* harmony export */ EntityManager: () => (/* reexport safe */ _EntityManager__WEBPACK_IMPORTED_MODULE_2__.EntityManager),\n/* harmony export */ MotionComponent: () => (/* reexport safe */ _Components_MotionComponent__WEBPACK_IMPORTED_MODULE_11__.MotionComponent),\n/* harmony export */ Query: () => (/* reexport safe */ _Query__WEBPACK_IMPORTED_MODULE_3__.Query),\n/* harmony export */ QueryManager: () => (/* reexport safe */ _QueryManager__WEBPACK_IMPORTED_MODULE_5__.QueryManager),\n/* harmony export */ RemovedComponent: () => (/* reexport safe */ _Entity__WEBPACK_IMPORTED_MODULE_1__.RemovedComponent),\n/* harmony export */ System: () => (/* reexport safe */ _System__WEBPACK_IMPORTED_MODULE_6__.System),\n/* harmony export */ SystemManager: () => (/* reexport safe */ _SystemManager__WEBPACK_IMPORTED_MODULE_7__.SystemManager),\n/* harmony export */ SystemPriority: () => (/* reexport safe */ _Priority__WEBPACK_IMPORTED_MODULE_9__.SystemPriority),\n/* harmony export */ SystemType: () => (/* reexport safe */ _System__WEBPACK_IMPORTED_MODULE_6__.SystemType),\n/* harmony export */ TagQuery: () => (/* reexport safe */ _TagQuery__WEBPACK_IMPORTED_MODULE_4__.TagQuery),\n/* harmony export */ TransformComponent: () => (/* reexport safe */ _Components_TransformComponent__WEBPACK_IMPORTED_MODULE_10__.TransformComponent),\n/* harmony export */ World: () => (/* reexport safe */ _World__WEBPACK_IMPORTED_MODULE_8__.World),\n/* harmony export */ isAddedComponent: () => (/* reexport safe */ _Entity__WEBPACK_IMPORTED_MODULE_1__.isAddedComponent),\n/* harmony export */ isComponentCtor: () => (/* reexport safe */ _Component__WEBPACK_IMPORTED_MODULE_0__.isComponentCtor),\n/* harmony export */ isRemovedComponent: () => (/* reexport safe */ _Entity__WEBPACK_IMPORTED_MODULE_1__.isRemovedComponent),\n/* harmony export */ isSystemConstructor: () => (/* reexport safe */ _SystemManager__WEBPACK_IMPORTED_MODULE_7__.isSystemConstructor)\n/* harmony export */ });\n/* harmony import */ var _Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Component */ \"./EntityComponentSystem/Component.ts\");\n/* harmony import */ var _Entity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _EntityManager__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./EntityManager */ \"./EntityComponentSystem/EntityManager.ts\");\n/* harmony import */ var _Query__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Query */ \"./EntityComponentSystem/Query.ts\");\n/* harmony import */ var _TagQuery__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./TagQuery */ \"./EntityComponentSystem/TagQuery.ts\");\n/* harmony import */ var _QueryManager__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./QueryManager */ \"./EntityComponentSystem/QueryManager.ts\");\n/* harmony import */ var _System__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _SystemManager__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./SystemManager */ \"./EntityComponentSystem/SystemManager.ts\");\n/* harmony import */ var _World__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./World */ \"./EntityComponentSystem/World.ts\");\n/* harmony import */ var _Priority__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Priority */ \"./EntityComponentSystem/Priority.ts\");\n/* harmony import */ var _Components_TransformComponent__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Components_MotionComponent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./EventEmitter.ts\":\n/*!*************************!*\\\n !*** ./EventEmitter.ts ***!\n \\*************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EventEmitter: () => (/* binding */ EventEmitter)\n/* harmony export */ });\n/**\n * Excalibur's typed event emitter, this allows events to be sent with any string to Type mapping\n */\nclass EventEmitter {\n constructor() {\n this._paused = false;\n this._empty = true;\n this._listeners = {};\n this._listenersOnce = {};\n this._pipes = [];\n }\n /**\n * Removes all listeners and pipes\n */\n clear() {\n this._listeners = {};\n this._listenersOnce = {};\n this._pipes.length = 0;\n this._empty = true;\n }\n on(eventName, handler) {\n var _a;\n this._empty = false;\n this._listeners[eventName] = (_a = this._listeners[eventName]) !== null && _a !== void 0 ? _a : [];\n this._listeners[eventName].push(handler);\n return {\n close: () => this.off(eventName, handler)\n };\n }\n once(eventName, handler) {\n var _a;\n this._empty = false;\n this._listenersOnce[eventName] = (_a = this._listenersOnce[eventName]) !== null && _a !== void 0 ? _a : [];\n this._listenersOnce[eventName].push(handler);\n return {\n close: () => this.off(eventName, handler)\n };\n }\n off(eventName, handler) {\n var _a, _b;\n if (handler) {\n const newListeners = (_a = this._listeners[eventName]) === null || _a === void 0 ? void 0 : _a.filter((h) => h !== handler);\n this._listeners[eventName] = newListeners;\n const newOnceListeners = (_b = this._listenersOnce[eventName]) === null || _b === void 0 ? void 0 : _b.filter((h) => h !== handler);\n this._listenersOnce[eventName] = newOnceListeners;\n }\n else {\n delete this._listeners[eventName];\n }\n }\n emit(eventName, event) {\n if (this._empty) {\n return;\n }\n if (this._paused) {\n return;\n }\n const listeners = this._listeners[eventName];\n if (listeners) {\n for (let i = 0; i < listeners.length; i++) {\n listeners[i](event);\n }\n }\n const onces = this._listenersOnce[eventName];\n this._listenersOnce[eventName] = [];\n if (onces) {\n for (let i = 0; i < onces.length; i++) {\n onces[i](event);\n }\n }\n for (let i = 0; i < this._pipes.length; i++) {\n this._pipes[i].emit(eventName, event);\n }\n }\n /**\n * Replay events from this emitter to another\n * @param emitter\n */\n pipe(emitter) {\n if (this === emitter) {\n throw Error('Cannot pipe to self');\n }\n this._empty = false;\n this._pipes.push(emitter);\n return {\n close: () => {\n const i = this._pipes.indexOf(emitter);\n if (i > -1) {\n this._pipes.splice(i, 1);\n }\n }\n };\n }\n /**\n * Remove any piped emitters\n * @param emitter\n */\n unpipe(emitter) {\n const i = this._pipes.indexOf(emitter);\n if (i > -1) {\n this._pipes.splice(i, 1);\n }\n }\n /**\n * Paused event emitters do not emit events\n */\n pause() {\n this._paused = true;\n }\n /**\n * Unpaused event emitter do emit events\n */\n unpause() {\n this._paused = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Events.ts\":\n/*!*******************!*\\\n !*** ./Events.ts ***!\n \\*******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ActionCompleteEvent: () => (/* binding */ ActionCompleteEvent),\n/* harmony export */ ActionStartEvent: () => (/* binding */ ActionStartEvent),\n/* harmony export */ ActivateEvent: () => (/* binding */ ActivateEvent),\n/* harmony export */ AddEvent: () => (/* binding */ AddEvent),\n/* harmony export */ CollisionEndEvent: () => (/* binding */ CollisionEndEvent),\n/* harmony export */ CollisionPostSolveEvent: () => (/* binding */ CollisionPostSolveEvent),\n/* harmony export */ CollisionPreSolveEvent: () => (/* binding */ CollisionPreSolveEvent),\n/* harmony export */ CollisionStartEvent: () => (/* binding */ CollisionStartEvent),\n/* harmony export */ ContactEndEvent: () => (/* binding */ ContactEndEvent),\n/* harmony export */ ContactStartEvent: () => (/* binding */ ContactStartEvent),\n/* harmony export */ DeactivateEvent: () => (/* binding */ DeactivateEvent),\n/* harmony export */ EnterTriggerEvent: () => (/* binding */ EnterTriggerEvent),\n/* harmony export */ EnterViewPortEvent: () => (/* binding */ EnterViewPortEvent),\n/* harmony export */ EventTypes: () => (/* binding */ EventTypes),\n/* harmony export */ ExitTriggerEvent: () => (/* binding */ ExitTriggerEvent),\n/* harmony export */ ExitViewPortEvent: () => (/* binding */ ExitViewPortEvent),\n/* harmony export */ GameEvent: () => (/* binding */ GameEvent),\n/* harmony export */ GameStartEvent: () => (/* binding */ GameStartEvent),\n/* harmony export */ GameStopEvent: () => (/* binding */ GameStopEvent),\n/* harmony export */ GamepadAxisEvent: () => (/* binding */ GamepadAxisEvent),\n/* harmony export */ GamepadButtonEvent: () => (/* binding */ GamepadButtonEvent),\n/* harmony export */ GamepadConnectEvent: () => (/* binding */ GamepadConnectEvent),\n/* harmony export */ GamepadDisconnectEvent: () => (/* binding */ GamepadDisconnectEvent),\n/* harmony export */ HiddenEvent: () => (/* binding */ HiddenEvent),\n/* harmony export */ InitializeEvent: () => (/* binding */ InitializeEvent),\n/* harmony export */ KillEvent: () => (/* binding */ KillEvent),\n/* harmony export */ PostCollisionEvent: () => (/* binding */ PostCollisionEvent),\n/* harmony export */ PostDebugDrawEvent: () => (/* binding */ PostDebugDrawEvent),\n/* harmony export */ PostDrawEvent: () => (/* binding */ PostDrawEvent),\n/* harmony export */ PostFrameEvent: () => (/* binding */ PostFrameEvent),\n/* harmony export */ PostKillEvent: () => (/* binding */ PostKillEvent),\n/* harmony export */ PostTransformDrawEvent: () => (/* binding */ PostTransformDrawEvent),\n/* harmony export */ PostUpdateEvent: () => (/* binding */ PostUpdateEvent),\n/* harmony export */ PreCollisionEvent: () => (/* binding */ PreCollisionEvent),\n/* harmony export */ PreDebugDrawEvent: () => (/* binding */ PreDebugDrawEvent),\n/* harmony export */ PreDrawEvent: () => (/* binding */ PreDrawEvent),\n/* harmony export */ PreFrameEvent: () => (/* binding */ PreFrameEvent),\n/* harmony export */ PreKillEvent: () => (/* binding */ PreKillEvent),\n/* harmony export */ PreTransformDrawEvent: () => (/* binding */ PreTransformDrawEvent),\n/* harmony export */ PreUpdateEvent: () => (/* binding */ PreUpdateEvent),\n/* harmony export */ RemoveEvent: () => (/* binding */ RemoveEvent),\n/* harmony export */ VisibleEvent: () => (/* binding */ VisibleEvent)\n/* harmony export */ });\nvar EventTypes;\n(function (EventTypes) {\n EventTypes[\"Kill\"] = \"kill\";\n EventTypes[\"PreKill\"] = \"prekill\";\n EventTypes[\"PostKill\"] = \"postkill\";\n EventTypes[\"PreDraw\"] = \"predraw\";\n EventTypes[\"PostDraw\"] = \"postdraw\";\n EventTypes[\"PreDebugDraw\"] = \"predebugdraw\";\n EventTypes[\"PostDebugDraw\"] = \"postdebugdraw\";\n EventTypes[\"PreUpdate\"] = \"preupdate\";\n EventTypes[\"PostUpdate\"] = \"postupdate\";\n EventTypes[\"PreFrame\"] = \"preframe\";\n EventTypes[\"PostFrame\"] = \"postframe\";\n EventTypes[\"PreCollision\"] = \"precollision\";\n EventTypes[\"CollisionStart\"] = \"collisionstart\";\n EventTypes[\"CollisionEnd\"] = \"collisionend\";\n EventTypes[\"PostCollision\"] = \"postcollision\";\n EventTypes[\"Initialize\"] = \"initialize\";\n EventTypes[\"Activate\"] = \"activate\";\n EventTypes[\"Deactivate\"] = \"deactivate\";\n EventTypes[\"ExitViewport\"] = \"exitviewport\";\n EventTypes[\"EnterViewport\"] = \"enterviewport\";\n EventTypes[\"ExitTrigger\"] = \"exit\";\n EventTypes[\"EnterTrigger\"] = \"enter\";\n EventTypes[\"Connect\"] = \"connect\";\n EventTypes[\"Disconnect\"] = \"disconnect\";\n EventTypes[\"Button\"] = \"button\";\n EventTypes[\"Axis\"] = \"axis\";\n EventTypes[\"Visible\"] = \"visible\";\n EventTypes[\"Hidden\"] = \"hidden\";\n EventTypes[\"Start\"] = \"start\";\n EventTypes[\"Stop\"] = \"stop\";\n EventTypes[\"PointerUp\"] = \"pointerup\";\n EventTypes[\"PointerDown\"] = \"pointerdown\";\n EventTypes[\"PointerMove\"] = \"pointermove\";\n EventTypes[\"PointerEnter\"] = \"pointerenter\";\n EventTypes[\"PointerLeave\"] = \"pointerleave\";\n EventTypes[\"PointerCancel\"] = \"pointercancel\";\n EventTypes[\"PointerWheel\"] = \"pointerwheel\";\n EventTypes[\"Up\"] = \"up\";\n EventTypes[\"Down\"] = \"down\";\n EventTypes[\"Move\"] = \"move\";\n EventTypes[\"Enter\"] = \"enter\";\n EventTypes[\"Leave\"] = \"leave\";\n EventTypes[\"Cancel\"] = \"cancel\";\n EventTypes[\"Wheel\"] = \"wheel\";\n EventTypes[\"Press\"] = \"press\";\n EventTypes[\"Release\"] = \"release\";\n EventTypes[\"Hold\"] = \"hold\";\n EventTypes[\"PointerDragStart\"] = \"pointerdragstart\";\n EventTypes[\"PointerDragEnd\"] = \"pointerdragend\";\n EventTypes[\"PointerDragEnter\"] = \"pointerdragenter\";\n EventTypes[\"PointerDragLeave\"] = \"pointerdragleave\";\n EventTypes[\"PointerDragMove\"] = \"pointerdragmove\";\n EventTypes[\"ActionStart\"] = \"actionstart\";\n EventTypes[\"ActionComplete\"] = \"actioncomplete\";\n EventTypes[\"Add\"] = \"add\";\n EventTypes[\"Remove\"] = \"remove\";\n})(EventTypes || (EventTypes = {}));\n/**\n * Base event type in Excalibur that all other event types derive from. Not all event types are thrown on all Excalibur game objects,\n * some events are unique to a type, others are not.\n *\n */\nclass GameEvent {\n constructor() {\n /**\n * Other target object for this event\n */\n this.other = null;\n this._bubbles = true;\n }\n /**\n * If set to false, prevents event from propagating to other actors. If true it will be propagated\n * to all actors that apply.\n */\n get bubbles() {\n return this._bubbles;\n }\n set bubbles(value) {\n this._bubbles = value;\n }\n /**\n * Prevents event from bubbling\n */\n stopPropagation() {\n this.bubbles = false;\n }\n}\n/**\n * The 'kill' event is emitted on actors when it is killed. The target is the actor that was killed.\n */\nclass KillEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'prekill' event is emitted directly before an actor is killed.\n */\nclass PreKillEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'postkill' event is emitted directly after the actor is killed.\n */\nclass PostKillEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'start' event is emitted on engine when has started and is ready for interaction.\n */\nclass GameStartEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'stop' event is emitted on engine when has been stopped and will no longer take input, update or draw.\n */\nclass GameStopEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'predraw' event is emitted on actors, scenes, and engine before drawing starts. Actors' predraw happens inside their graphics\n * transform so that all drawing takes place with the actor as the origin.\n *\n */\nclass PreDrawEvent extends GameEvent {\n constructor(ctx, elapsed, self) {\n super();\n this.ctx = ctx;\n this.elapsed = elapsed;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'postdraw' event is emitted on actors, scenes, and engine after drawing finishes. Actors' postdraw happens inside their graphics\n * transform so that all drawing takes place with the actor as the origin.\n *\n */\nclass PostDrawEvent extends GameEvent {\n constructor(ctx, elapsed, self) {\n super();\n this.ctx = ctx;\n this.elapsed = elapsed;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'pretransformdraw' event is emitted on actors/entities before any graphics transforms have taken place.\n * Useful if you need to completely customize the draw or modify the transform before drawing in the draw step (for example needing\n * latest camera positions)\n *\n */\nclass PreTransformDrawEvent extends GameEvent {\n constructor(ctx, elapsed, self) {\n super();\n this.ctx = ctx;\n this.elapsed = elapsed;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'posttransformdraw' event is emitted on actors/entities after all graphics have been draw and transforms reset.\n * Useful if you need to completely custom the draw after everything is done.\n *\n */\nclass PostTransformDrawEvent extends GameEvent {\n constructor(ctx, elapsed, self) {\n super();\n this.ctx = ctx;\n this.elapsed = elapsed;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'predebugdraw' event is emitted on actors, scenes, and engine before debug drawing starts.\n */\nclass PreDebugDrawEvent extends GameEvent {\n constructor(ctx, self) {\n super();\n this.ctx = ctx;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'postdebugdraw' event is emitted on actors, scenes, and engine after debug drawing starts.\n */\nclass PostDebugDrawEvent extends GameEvent {\n constructor(ctx, self) {\n super();\n this.ctx = ctx;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'preupdate' event is emitted on actors, scenes, camera, and engine before the update starts.\n */\nclass PreUpdateEvent extends GameEvent {\n constructor(engine, elapsed, self) {\n super();\n this.engine = engine;\n this.elapsed = elapsed;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'postupdate' event is emitted on actors, scenes, camera, and engine after the update ends.\n */\nclass PostUpdateEvent extends GameEvent {\n constructor(engine, elapsed, self) {\n super();\n this.engine = engine;\n this.elapsed = elapsed;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'preframe' event is emitted on the engine, before the frame begins.\n */\nclass PreFrameEvent extends GameEvent {\n constructor(engine, prevStats) {\n super();\n this.engine = engine;\n this.prevStats = prevStats;\n this.target = engine;\n }\n}\n/**\n * The 'postframe' event is emitted on the engine, after a frame ends.\n */\nclass PostFrameEvent extends GameEvent {\n constructor(engine, stats) {\n super();\n this.engine = engine;\n this.stats = stats;\n this.target = engine;\n }\n}\n/**\n * Event received when a gamepad is connected to Excalibur. {@apilink Gamepads} receives this event.\n */\nclass GamepadConnectEvent extends GameEvent {\n constructor(index, gamepad) {\n super();\n this.index = index;\n this.gamepad = gamepad;\n this.target = gamepad;\n }\n}\n/**\n * Event received when a gamepad is disconnected from Excalibur. {@apilink Gamepads} receives this event.\n */\nclass GamepadDisconnectEvent extends GameEvent {\n constructor(index, gamepad) {\n super();\n this.index = index;\n this.gamepad = gamepad;\n this.target = gamepad;\n }\n}\n/**\n * Gamepad button event. See {@apilink Gamepads} for information on responding to controller input. {@apilink Gamepad} instances receive this event;\n */\nclass GamepadButtonEvent extends GameEvent {\n /**\n * @param button The Gamepad button\n * @param value A numeric value between 0 and 1\n */\n constructor(button, value, self) {\n super();\n this.button = button;\n this.value = value;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Gamepad axis event. See {@apilink Gamepads} for information on responding to controller input. {@apilink Gamepad} instances receive this event;\n */\nclass GamepadAxisEvent extends GameEvent {\n /**\n * @param axis The Gamepad axis\n * @param value A numeric value between -1 and 1\n */\n constructor(axis, value, self) {\n super();\n this.axis = axis;\n this.value = value;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event received by the {@apilink Engine} when the browser window is visible on a screen.\n */\nclass VisibleEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event received by the {@apilink Engine} when the browser window is hidden from all screens.\n */\nclass HiddenEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event thrown on an {@apilink Actor | `actor`} when a collision will occur this frame if it resolves\n */\nclass PreCollisionEvent extends GameEvent {\n /**\n * @param self The actor the event was thrown on\n * @param other The actor that will collided with the current actor\n * @param side The side that will be collided with the current actor\n * @param intersection Intersection vector\n */\n constructor(self, other, side, intersection, contact) {\n super();\n this.self = self;\n this.other = other;\n this.side = side;\n this.intersection = intersection;\n this.contact = contact;\n this.target = self;\n }\n}\n/**\n * Event thrown on an {@apilink Actor | `actor`} when a collision has been resolved (body reacted) this frame\n */\nclass PostCollisionEvent extends GameEvent {\n /**\n * @param self The actor the event was thrown on\n * @param other The actor that did collide with the current actor\n * @param side The side that did collide with the current actor\n * @param intersection Intersection vector\n */\n constructor(self, other, side, intersection, contact) {\n super();\n this.self = self;\n this.other = other;\n this.side = side;\n this.intersection = intersection;\n this.contact = contact;\n this.target = self;\n }\n}\nclass ContactStartEvent {\n constructor(self, other, side, contact) {\n this.self = self;\n this.other = other;\n this.side = side;\n this.contact = contact;\n }\n}\nclass ContactEndEvent {\n constructor(self, other, side, lastContact) {\n this.self = self;\n this.other = other;\n this.side = side;\n this.lastContact = lastContact;\n }\n}\nclass CollisionPreSolveEvent {\n constructor(self, other, side, intersection, contact) {\n this.self = self;\n this.other = other;\n this.side = side;\n this.intersection = intersection;\n this.contact = contact;\n }\n}\nclass CollisionPostSolveEvent {\n constructor(self, other, side, intersection, contact) {\n this.self = self;\n this.other = other;\n this.side = side;\n this.intersection = intersection;\n this.contact = contact;\n }\n}\n/**\n * Event thrown the first time an {@apilink Actor | `actor`} collides with another, after an actor is in contact normal collision events are fired.\n */\nclass CollisionStartEvent extends GameEvent {\n /**\n *\n * @param self\n * @param other\n * @param side\n * @param contact\n */\n constructor(self, other, side, contact) {\n super();\n this.self = self;\n this.other = other;\n this.side = side;\n this.contact = contact;\n this.target = self;\n }\n}\n/**\n * Event thrown when the {@apilink Actor | `actor`} is no longer colliding with another\n */\nclass CollisionEndEvent extends GameEvent {\n /**\n *\n */\n constructor(self, other, side, lastContact) {\n super();\n this.self = self;\n this.other = other;\n this.side = side;\n this.lastContact = lastContact;\n this.target = self;\n }\n}\n/**\n * Event thrown on an {@apilink Actor}, {@apilink Scene}, and {@apilink Engine} only once before the first update call\n */\nclass InitializeEvent extends GameEvent {\n /**\n * @param engine The reference to the current engine\n */\n constructor(engine, self) {\n super();\n this.engine = engine;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event thrown on a {@apilink Scene} on activation\n */\nclass ActivateEvent extends GameEvent {\n /**\n * @param context The context for the scene activation\n */\n constructor(context, self) {\n super();\n this.context = context;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event thrown on a {@apilink Scene} on deactivation\n */\nclass DeactivateEvent extends GameEvent {\n /**\n * @param context The context for the scene deactivation\n */\n constructor(context, self) {\n super();\n this.context = context;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event thrown on an {@apilink Actor} when the graphics bounds completely leaves the screen.\n */\nclass ExitViewPortEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event thrown on an {@apilink Actor} when any part of the graphics bounds are on screen.\n */\nclass EnterViewPortEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\nclass EnterTriggerEvent extends GameEvent {\n constructor(self, entity) {\n super();\n this.self = self;\n this.entity = entity;\n this.target = self;\n }\n}\nclass ExitTriggerEvent extends GameEvent {\n constructor(self, entity) {\n super();\n this.self = self;\n this.entity = entity;\n this.target = self;\n }\n}\n/**\n * Event thrown on an {@apilink Actor} when an action starts.\n */\nclass ActionStartEvent extends GameEvent {\n constructor(action, self) {\n super();\n this.action = action;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event thrown on an {@apilink Actor} when an action completes.\n */\nclass ActionCompleteEvent extends GameEvent {\n constructor(action, self) {\n super();\n this.action = action;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event thrown on an [[Actor]] when an Actor added to scene.\n */\nclass AddEvent extends GameEvent {\n constructor(engine, self) {\n super();\n this.engine = engine;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event thrown on an [[Actor]] when an Actor removed from scene.\n */\nclass RemoveEvent extends GameEvent {\n constructor(engine, self) {\n super();\n this.engine = engine;\n this.self = self;\n this.target = self;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Events/MediaEvents.ts\":\n/*!*******************************!*\\\n !*** ./Events/MediaEvents.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MediaEvent: () => (/* binding */ MediaEvent),\n/* harmony export */ NativeSoundEvent: () => (/* binding */ NativeSoundEvent),\n/* harmony export */ NativeSoundProcessedEvent: () => (/* binding */ NativeSoundProcessedEvent)\n/* harmony export */ });\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n\nclass MediaEvent extends _Events__WEBPACK_IMPORTED_MODULE_0__.GameEvent {\n /**\n * Media event cannot bubble\n */\n set bubbles(_value) {\n // stubbed\n }\n /**\n * Media event cannot bubble\n */\n get bubbles() {\n return false;\n }\n /**\n * Media event cannot bubble, so they have no path\n */\n get _path() {\n return null;\n }\n /**\n * Media event cannot bubble, so they have no path\n */\n set _path(_val) {\n // stubbed\n }\n constructor(target, _name = 'MediaEvent') {\n super();\n this.target = target;\n this._name = _name;\n }\n /**\n * Prevents event from bubbling\n */\n stopPropagation() {\n /**\n * Stub\n */\n }\n /**\n * Action, that calls when event happens\n */\n action() {\n /**\n * Stub\n */\n }\n /**\n * Propagate event further through event path\n */\n propagate() {\n /**\n * Stub\n */\n }\n layPath(_actor) {\n /**\n * Stub\n */\n }\n}\nclass NativeSoundEvent extends MediaEvent {\n constructor(target, track) {\n super(target, 'NativeSoundEvent');\n this.track = track;\n }\n}\nclass NativeSoundProcessedEvent extends MediaEvent {\n constructor(target, _processedData) {\n super(target, 'NativeSoundProcessedEvent');\n this._processedData = _processedData;\n this.data = this._processedData;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Flags.ts\":\n/*!******************!*\\\n !*** ./Flags.ts ***!\n \\******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Flags: () => (/* binding */ Flags)\n/* harmony export */ });\n/**\n * Flags is a feature flag implementation for Excalibur. They can only be operated **before {@apilink Engine} construction**\n * after which they are frozen and are read-only.\n *\n * Flags are used to enable experimental or preview features in Excalibur.\n */\nclass Flags {\n /**\n * Force excalibur to load the Canvas 2D graphics context fallback\n * @warning not all features of excalibur are supported in the Canvas 2D fallback\n */\n static useCanvasGraphicsContext() {\n Flags.enable('use-canvas-context');\n }\n /**\n * Force excalibur to use the less optimized image renderer\n */\n static useLegacyImageRenderer() {\n Flags.enable('use-legacy-image-renderer');\n }\n /**\n * Freeze all flag modifications making them readonly\n */\n static freeze() {\n Flags._FROZEN = true;\n }\n /**\n * Resets internal flag state, not meant to be called by users. Only used for testing.\n *\n * Calling this in your game is UNSUPPORTED\n * @internal\n */\n static _reset() {\n Flags._FROZEN = false;\n Flags._FLAGS = {};\n }\n /**\n * Enable a specific feature flag by name. **Note: can only be set before {@apilink Engine} constructor time**\n * @param flagName\n */\n static enable(flagName) {\n if (this._FROZEN) {\n throw Error('Feature flags can only be enabled before Engine constructor time');\n }\n Flags._FLAGS[flagName] = true;\n }\n /**\n * Disable a specific feature flag by name. **Note: can only be set before {@apilink Engine} constructor time**\n * @param flagName\n */\n static disable(flagName) {\n if (this._FROZEN) {\n throw Error('Feature flags can only be disabled before Engine constructor time');\n }\n Flags._FLAGS[flagName] = false;\n }\n /**\n * Check if a flag is enabled. If the flag is disabled or does not exist `false` is returned\n * @param flagName\n */\n static isEnabled(flagName) {\n return !!Flags._FLAGS[flagName];\n }\n /**\n * Show a list of currently known flags\n */\n static show() {\n return Object.keys(Flags._FLAGS);\n }\n}\nFlags._FROZEN = false;\nFlags._FLAGS = {};\n\n\n/***/ }),\n\n/***/ \"./GarbageCollector.ts\":\n/*!*****************************!*\\\n !*** ./GarbageCollector.ts ***!\n \\*****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DefaultGarbageCollectionOptions: () => (/* binding */ DefaultGarbageCollectionOptions),\n/* harmony export */ GarbageCollector: () => (/* binding */ GarbageCollector)\n/* harmony export */ });\nconst DefaultGarbageCollectionOptions = {\n textureCollectInterval: 60000\n // TODO future work to integrate the font and text configuration, refactor existing collection mechanism\n // fontCollectInterval: 60_000,\n // textMeasurementCollectInterval: 60_000,\n};\nclass GarbageCollector {\n constructor(options) {\n this.options = options;\n this._running = false;\n this._collectionMap = new Map();\n this._collectors = new Map();\n /**\n * Runs the collection loop to cleanup any stale resources given the registered collect handlers\n */\n this.collectStaleResources = (deadline) => {\n if (!this._running) {\n return;\n }\n for (const [type, [collector, timeoutInterval]] of this._collectors.entries()) {\n const now = this.options.getTimestamp();\n for (const [resource, [resourceType, time]] of this._collectionMap.entries()) {\n if (type !== resourceType || time + timeoutInterval >= now) {\n continue;\n }\n const collected = collector(resource);\n if (collected) {\n this._collectionMap.delete(resource);\n }\n }\n }\n this._collectHandle = requestIdleCallback(this.collectStaleResources);\n };\n }\n /**\n *\n * @param type Resource type\n * @param timeoutInterval If resource type exceeds interval in milliseconds collect() is called\n * @param collect Collection implementation, returns true if collected\n */\n registerCollector(type, timeoutInterval, collect) {\n this._collectors.set(type, [collect, timeoutInterval]);\n }\n /**\n * Add a resource to be tracked for collection\n * @param type\n * @param resource\n */\n addCollectableResource(type, resource) {\n this._collectionMap.set(resource, [type, this.options.getTimestamp()]);\n }\n /**\n * Update the resource last used timestamp preventing collection\n * @param resource\n */\n touch(resource) {\n const collectionData = this._collectionMap.get(resource);\n if (collectionData) {\n this._collectionMap.set(resource, [collectionData[0], this.options.getTimestamp()]);\n }\n }\n /**\n * Force collect all resources, useful for shutting down a game\n * or if you know that you will not use anything you've allocated before now\n */\n forceCollectAll() {\n for (const [_, [collector]] of this._collectors.entries()) {\n for (const [resource] of this._collectionMap.entries()) {\n const collected = collector(resource);\n if (collected) {\n this._collectionMap.delete(resource);\n }\n }\n }\n }\n /**\n * Starts the garbage collection loop\n */\n start() {\n this._running = true;\n this.collectStaleResources();\n }\n /**\n * Stops the garbage collection loop\n */\n stop() {\n this._running = false;\n cancelIdleCallback(this._collectHandle);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Animation.ts\":\n/*!*******************************!*\\\n !*** ./Graphics/Animation.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Animation: () => (/* binding */ Animation),\n/* harmony export */ AnimationDirection: () => (/* binding */ AnimationDirection),\n/* harmony export */ AnimationEvents: () => (/* binding */ AnimationEvents),\n/* harmony export */ AnimationStrategy: () => (/* binding */ AnimationStrategy)\n/* harmony export */ });\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n\nvar AnimationDirection;\n(function (AnimationDirection) {\n /**\n * Animation is playing forwards\n */\n AnimationDirection[\"Forward\"] = \"forward\";\n /**\n * Animation is playing backwards\n */\n AnimationDirection[\"Backward\"] = \"backward\";\n})(AnimationDirection || (AnimationDirection = {}));\nvar AnimationStrategy;\n(function (AnimationStrategy) {\n /**\n * Animation ends without displaying anything\n */\n AnimationStrategy[\"End\"] = \"end\";\n /**\n * Animation loops to the first frame after the last frame\n */\n AnimationStrategy[\"Loop\"] = \"loop\";\n /**\n * Animation plays to the last frame, then backwards to the first frame, then repeats\n */\n AnimationStrategy[\"PingPong\"] = \"pingpong\";\n /**\n * Animation ends stopping on the last frame\n */\n AnimationStrategy[\"Freeze\"] = \"freeze\";\n})(AnimationStrategy || (AnimationStrategy = {}));\nconst AnimationEvents = {\n Frame: 'frame',\n Loop: 'loop',\n End: 'end'\n};\n/**\n * Create an Animation given a list of {@apilink Frame | `frames`} in {@apilink AnimationOptions}\n *\n * To create an Animation from a {@apilink SpriteSheet}, use {@apilink Animation.fromSpriteSheet}\n */\nclass Animation extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n constructor(options) {\n var _a, _b, _c;\n super(options);\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_1__.EventEmitter();\n this.frames = [];\n this.strategy = AnimationStrategy.Loop;\n this.frameDuration = 100;\n this._idempotencyToken = -1;\n this._firstTick = true;\n this._currentFrame = 0;\n this._timeLeftInFrame = 0;\n this._pingPongDirection = 1;\n this._done = false;\n this._playing = true;\n this._speed = 1;\n this._reversed = false;\n this.frames = options.frames;\n this.speed = (_a = options.speed) !== null && _a !== void 0 ? _a : this.speed;\n this.strategy = (_b = options.strategy) !== null && _b !== void 0 ? _b : this.strategy;\n this.frameDuration = options.totalDuration ? options.totalDuration / this.frames.length : (_c = options.frameDuration) !== null && _c !== void 0 ? _c : this.frameDuration;\n if (options.reverse) {\n this.reverse();\n }\n this.goToFrame(0);\n }\n clone() {\n return new Animation({\n frames: this.frames.map((f) => ({ ...f })),\n frameDuration: this.frameDuration,\n speed: this.speed,\n reverse: this._reversed,\n strategy: this.strategy,\n ...this.cloneGraphicOptions()\n });\n }\n get width() {\n const maybeFrame = this.currentFrame;\n if (maybeFrame && maybeFrame.graphic) {\n return Math.abs(maybeFrame.graphic.width * this.scale.x);\n }\n return 0;\n }\n get height() {\n const maybeFrame = this.currentFrame;\n if (maybeFrame && maybeFrame.graphic) {\n return Math.abs(maybeFrame.graphic.height * this.scale.y);\n }\n return 0;\n }\n /**\n * Create an Animation from a {@apilink SpriteSheet}, a list of indices into the sprite sheet, a duration per frame\n * and optional {@apilink AnimationStrategy}\n *\n * Example:\n * ```typescript\n * const spriteSheet = SpriteSheet.fromImageSource({...});\n *\n * const anim = Animation.fromSpriteSheet(spriteSheet, range(0, 5), 200, AnimationStrategy.Loop);\n * ```\n * @param spriteSheet ex.SpriteSheet\n * @param spriteSheetIndex 0 based index from left to right, top down (row major order) of the ex.SpriteSheet\n * @param durationPerFrame duration per frame in milliseconds\n * @param strategy Optional strategy, default AnimationStrategy.Loop\n */\n static fromSpriteSheet(spriteSheet, spriteSheetIndex, durationPerFrame, strategy = AnimationStrategy.Loop) {\n const maxIndex = spriteSheet.sprites.length - 1;\n const invalidIndices = spriteSheetIndex.filter((index) => index < 0 || index > maxIndex);\n if (invalidIndices.length) {\n Animation._LOGGER.warn(`Indices into SpriteSheet were provided that don\\'t exist: ${invalidIndices.join(',')} no frame will be shown`);\n }\n return new Animation({\n frames: spriteSheet.sprites\n .filter((_, index) => spriteSheetIndex.indexOf(index) > -1)\n .map((f) => ({\n graphic: f,\n duration: durationPerFrame\n })),\n strategy: strategy\n });\n }\n /**\n * Create an {@apilink Animation} from a {@apilink SpriteSheet} given a list of coordinates\n *\n * Example:\n * ```typescript\n * const spriteSheet = SpriteSheet.fromImageSource({...});\n *\n * const anim = Animation.fromSpriteSheetCoordinates({\n * spriteSheet,\n * frameCoordinates: [\n * {x: 0, y: 5, duration: 100, options { flipHorizontal: true }},\n * {x: 1, y: 5, duration: 200},\n * {x: 2, y: 5},\n * {x: 3, y: 5}\n * ],\n * strategy: AnimationStrategy.PingPong\n * });\n * ```\n * @param options\n * @returns Animation\n */\n static fromSpriteSheetCoordinates(options) {\n var _a;\n const { spriteSheet, frameCoordinates, durationPerFrame, durationPerFrameMs, speed, strategy, reverse } = options;\n const defaultDuration = (_a = durationPerFrame !== null && durationPerFrame !== void 0 ? durationPerFrame : durationPerFrameMs) !== null && _a !== void 0 ? _a : 100;\n const frames = [];\n for (const coord of frameCoordinates) {\n const { x, y, duration, options } = coord;\n const sprite = spriteSheet.getSprite(x, y, options);\n if (sprite) {\n frames.push({\n graphic: sprite,\n duration: duration !== null && duration !== void 0 ? duration : defaultDuration\n });\n }\n else {\n Animation._LOGGER.warn(`Skipping frame! SpriteSheet does not have coordinate (${x}, ${y}), please check your SpriteSheet to confirm that sprite exists`);\n }\n }\n return new Animation({\n frames,\n strategy,\n speed,\n reverse\n });\n }\n /**\n * Current animation speed\n *\n * 1 meaning normal 1x speed.\n * 2 meaning 2x speed and so on.\n */\n get speed() {\n return this._speed;\n }\n /**\n * Current animation speed\n *\n * 1 meaning normal 1x speed.\n * 2 meaning 2x speed and so on.\n */\n set speed(val) {\n this._speed = (0,_Math_util__WEBPACK_IMPORTED_MODULE_2__.clamp)(Math.abs(val), 0, Infinity);\n }\n /**\n * Returns the current Frame of the animation\n *\n * Use {@apilink Animation.currentFrameIndex} to get the frame number and\n * {@apilink Animation.goToFrame} to set the current frame index\n */\n get currentFrame() {\n if (this._currentFrame >= 0 && this._currentFrame < this.frames.length) {\n return this.frames[this._currentFrame];\n }\n return null;\n }\n /**\n * Returns the current frame index of the animation\n *\n * Use {@apilink Animation.currentFrame} to grab the current {@apilink Frame} object\n */\n get currentFrameIndex() {\n return this._currentFrame;\n }\n /**\n * Returns the amount of time in milliseconds left in the current frame\n */\n get currentFrameTimeLeft() {\n return this._timeLeftInFrame;\n }\n /**\n * Returns `true` if the animation is playing\n */\n get isPlaying() {\n return this._playing;\n }\n get isReversed() {\n return this._reversed;\n }\n /**\n * Reverses the play direction of the Animation, this preserves the current frame\n */\n reverse() {\n // Don't mutate with the original frame list, create a copy\n this.frames = this.frames.slice().reverse();\n this._reversed = !this._reversed;\n }\n /**\n * Returns the current play direction of the animation\n */\n get direction() {\n // Keep logically consistent with ping-pong direction\n // If ping-pong is forward = 1 and reversed is true then we are logically reversed\n const reversed = this._reversed && this._pingPongDirection === 1 ? true : false;\n return reversed ? AnimationDirection.Backward : AnimationDirection.Forward;\n }\n /**\n * Plays or resumes the animation from the current frame\n */\n play() {\n this._playing = true;\n }\n /**\n * Pauses the animation on the current frame\n */\n pause() {\n this._playing = false;\n this._firstTick = true; // firstTick must be set to emit the proper frame event\n }\n /**\n * Reset the animation back to the beginning, including if the animation were done\n */\n reset() {\n this._done = false;\n this._firstTick = true;\n this._currentFrame = 0;\n this._timeLeftInFrame = this.frameDuration;\n const maybeFrame = this.frames[this._currentFrame];\n if (maybeFrame) {\n this._timeLeftInFrame = (maybeFrame === null || maybeFrame === void 0 ? void 0 : maybeFrame.duration) || this.frameDuration;\n }\n }\n /**\n * Returns `true` if the animation can end\n */\n get canFinish() {\n switch (this.strategy) {\n case AnimationStrategy.End:\n case AnimationStrategy.Freeze: {\n return true;\n }\n default: {\n return false;\n }\n }\n }\n /**\n * Returns `true` if the animation is done, for looping type animations\n * `ex.AnimationStrategy.PingPong` and `ex.AnimationStrategy.Loop` this will always return `false`\n *\n * See the `ex.Animation.canFinish()` method to know if an animation type can end\n */\n get done() {\n return this._done;\n }\n /**\n * Jump the animation immediately to a specific frame if it exists\n *\n * Optionally specify an override for the duration of the frame, useful for\n * keeping multiple animations in sync with one another.\n * @param frameNumber\n * @param duration\n */\n goToFrame(frameNumber, duration) {\n this._currentFrame = frameNumber;\n this._timeLeftInFrame = duration !== null && duration !== void 0 ? duration : this.frameDuration;\n const maybeFrame = this.frames[this._currentFrame];\n if (maybeFrame && !this._done) {\n this._timeLeftInFrame = duration !== null && duration !== void 0 ? duration : ((maybeFrame === null || maybeFrame === void 0 ? void 0 : maybeFrame.duration) || this.frameDuration);\n this.events.emit('frame', { ...maybeFrame, frameIndex: this.currentFrameIndex });\n }\n }\n _nextFrame() {\n const currentFrame = this._currentFrame;\n if (this._done) {\n return currentFrame;\n }\n let next = -1;\n switch (this.strategy) {\n case AnimationStrategy.Loop: {\n next = (currentFrame + 1) % this.frames.length;\n if (next === 0) {\n this.events.emit('loop', this);\n }\n break;\n }\n case AnimationStrategy.End: {\n next = currentFrame + 1;\n if (next >= this.frames.length) {\n this._done = true;\n this._currentFrame = this.frames.length;\n this.events.emit('end', this);\n }\n break;\n }\n case AnimationStrategy.Freeze: {\n next = (0,_Math_util__WEBPACK_IMPORTED_MODULE_2__.clamp)(currentFrame + 1, 0, this.frames.length - 1);\n if (next >= this.frames.length - 1) {\n this._done = true;\n this.events.emit('end', this);\n }\n break;\n }\n case AnimationStrategy.PingPong: {\n if (currentFrame + this._pingPongDirection >= this.frames.length) {\n this._pingPongDirection = -1;\n this.events.emit('loop', this);\n }\n if (currentFrame + this._pingPongDirection < 0) {\n this._pingPongDirection = 1;\n this.events.emit('loop', this);\n }\n next = currentFrame + (this._pingPongDirection % this.frames.length);\n break;\n }\n }\n return next;\n }\n /**\n * Called internally by Excalibur to update the state of the animation potential update the current frame\n * @param elapsed Milliseconds elapsed\n * @param idempotencyToken Prevents double ticking in a frame by passing a unique token to the frame\n */\n tick(elapsed, idempotencyToken = 0) {\n if (this._idempotencyToken === idempotencyToken) {\n return;\n }\n this._idempotencyToken = idempotencyToken;\n if (!this._playing) {\n return;\n }\n // if it's the first frame emit frame event\n if (this._firstTick) {\n this._firstTick = false;\n this.events.emit('frame', { ...this.currentFrame, frameIndex: this.currentFrameIndex });\n }\n this._timeLeftInFrame -= elapsed * this._speed;\n if (this._timeLeftInFrame <= 0) {\n this.goToFrame(this._nextFrame());\n }\n }\n _drawImage(ctx, x, y) {\n if (this.currentFrame && this.currentFrame.graphic) {\n this.currentFrame.graphic.draw(ctx, x, y);\n }\n }\n}\nAnimation._LOGGER = _Util_Log__WEBPACK_IMPORTED_MODULE_3__.Logger.getInstance();\n\n\n/***/ }),\n\n/***/ \"./Graphics/Canvas.ts\":\n/*!****************************!*\\\n !*** ./Graphics/Canvas.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Canvas: () => (/* binding */ Canvas)\n/* harmony export */ });\n/* harmony import */ var _Raster__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Raster */ \"./Graphics/Raster.ts\");\n\n/**\n * A canvas {@apilink Graphic} to provide an adapter between the 2D Canvas API and the {@apilink ExcaliburGraphicsContext}.\n *\n * The {@apilink Canvas} works by re-rastering a draw handler to a HTMLCanvasElement for every draw which is then passed\n * to the {@apilink ExcaliburGraphicsContext} implementation as a rendered image.\n *\n * **Low performance API**\n */\nclass Canvas extends _Raster__WEBPACK_IMPORTED_MODULE_0__.Raster {\n /**\n * Return the 2D graphics context of this canvas\n */\n get ctx() {\n return this._ctx;\n }\n constructor(_options = {}) {\n super(_options);\n this._options = _options;\n }\n clone() {\n return new Canvas({\n ...this._options,\n ...this.cloneGraphicOptions(),\n ...this.cloneRasterOptions()\n });\n }\n execute(ctx) {\n var _a, _b;\n if ((_a = this._options) === null || _a === void 0 ? void 0 : _a.draw) {\n (_b = this._options) === null || _b === void 0 ? void 0 : _b.draw(ctx);\n }\n if (!this._options.cache) {\n this.flagDirty();\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Circle.ts\":\n/*!****************************!*\\\n !*** ./Graphics/Circle.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Circle: () => (/* binding */ Circle)\n/* harmony export */ });\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Raster__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Raster */ \"./Graphics/Raster.ts\");\n\n\n/**\n * A circle {@apilink Graphic} for drawing circles to the {@apilink ExcaliburGraphicsContext}\n *\n * Circles default to {@apilink ImageFiltering.Blended}\n */\nclass Circle extends _Raster__WEBPACK_IMPORTED_MODULE_0__.Raster {\n get radius() {\n return this._radius;\n }\n set radius(value) {\n this._radius = value;\n this.width = this._radius * 2;\n this.height = this._radius * 2;\n this.flagDirty();\n }\n constructor(options) {\n var _a, _b, _c;\n super(options);\n this._radius = 0;\n const lineWidth = (_a = options.lineWidth) !== null && _a !== void 0 ? _a : (options.strokeColor ? 1 : 0); // default lineWidth in canvas is 1px\n this.padding = (_b = options.padding) !== null && _b !== void 0 ? _b : 2 + lineWidth / 2; // default 2 padding for circles looks nice\n this.radius = options.radius;\n this.filtering = (_c = options.filtering) !== null && _c !== void 0 ? _c : _Filtering__WEBPACK_IMPORTED_MODULE_1__.ImageFiltering.Blended;\n this.rasterize();\n }\n clone() {\n return new Circle({\n radius: this.radius,\n ...this.cloneGraphicOptions(),\n ...this.cloneRasterOptions()\n });\n }\n execute(ctx) {\n if (this.radius > 0) {\n ctx.beginPath();\n ctx.arc(this.radius, this.radius, this.radius, 0, Math.PI * 2);\n if (this.color) {\n ctx.fill();\n }\n if (this.strokeColor) {\n ctx.stroke();\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/ExcaliburGraphicsContext.ts\":\n/*!******************************************************!*\\\n !*** ./Graphics/Context/ExcaliburGraphicsContext.ts ***!\n \\******************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DefaultAntialiasOptions: () => (/* binding */ DefaultAntialiasOptions),\n/* harmony export */ DefaultPixelArtOptions: () => (/* binding */ DefaultPixelArtOptions)\n/* harmony export */ });\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Filtering */ \"./Graphics/Filtering.ts\");\n\nconst DefaultAntialiasOptions = {\n pixelArtSampler: false,\n nativeContextAntialiasing: false,\n multiSampleAntialiasing: true,\n filtering: _Filtering__WEBPACK_IMPORTED_MODULE_0__.ImageFiltering.Blended,\n canvasImageRendering: 'auto'\n};\nconst DefaultPixelArtOptions = {\n pixelArtSampler: true,\n nativeContextAntialiasing: false,\n multiSampleAntialiasing: true,\n filtering: _Filtering__WEBPACK_IMPORTED_MODULE_0__.ImageFiltering.Blended,\n canvasImageRendering: 'auto'\n};\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/ExcaliburGraphicsContext2DCanvas.ts\":\n/*!**************************************************************!*\\\n !*** ./Graphics/Context/ExcaliburGraphicsContext2DCanvas.ts ***!\n \\**************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ExcaliburGraphicsContext2DCanvas: () => (/* binding */ ExcaliburGraphicsContext2DCanvas)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Color */ \"./Color.ts\");\n/* harmony import */ var _state_stack__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./state-stack */ \"./Graphics/Context/state-stack.ts\");\n/* harmony import */ var _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n/* harmony import */ var _debug_text__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./debug-text */ \"./Graphics/Context/debug-text.ts\");\n\n\n\n\nconst pixelSnapEpsilon = 0.0001;\nclass ExcaliburGraphicsContext2DCanvasDebug {\n constructor(_ex) {\n this._ex = _ex;\n this._debugText = new _debug_text__WEBPACK_IMPORTED_MODULE_0__.DebugText();\n }\n /**\n * Draw a debug rectangle to the context\n * @param x\n * @param y\n * @param width\n * @param height\n */\n drawRect(x, y, width, height) {\n this._ex.__ctx.save();\n this._ex.__ctx.strokeStyle = 'red';\n this._ex.__ctx.strokeRect(this._ex.snapToPixel ? ~~(x + pixelSnapEpsilon) : x, this._ex.snapToPixel ? ~~(y + pixelSnapEpsilon) : y, this._ex.snapToPixel ? ~~(width + pixelSnapEpsilon) : width, this._ex.snapToPixel ? ~~(height + pixelSnapEpsilon) : height);\n this._ex.__ctx.restore();\n }\n drawLine(start, end, lineOptions = { color: _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Black }) {\n var _a, _b;\n this._ex.__ctx.save();\n this._ex.__ctx.beginPath();\n this._ex.__ctx.strokeStyle = (_b = (_a = lineOptions.color) === null || _a === void 0 ? void 0 : _a.toString()) !== null && _b !== void 0 ? _b : '';\n this._ex.__ctx.moveTo(this._ex.snapToPixel ? ~~(start.x + pixelSnapEpsilon) : start.x, this._ex.snapToPixel ? ~~(start.y + pixelSnapEpsilon) : start.y);\n this._ex.__ctx.lineTo(this._ex.snapToPixel ? ~~(end.x + pixelSnapEpsilon) : end.x, this._ex.snapToPixel ? ~~(end.y + pixelSnapEpsilon) : end.y);\n this._ex.__ctx.lineWidth = 2;\n this._ex.__ctx.stroke();\n this._ex.__ctx.closePath();\n this._ex.__ctx.restore();\n }\n drawPoint(point, pointOptions = { color: _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Black, size: 5 }) {\n this._ex.__ctx.save();\n this._ex.__ctx.beginPath();\n this._ex.__ctx.fillStyle = pointOptions.color.toString();\n this._ex.__ctx.arc(this._ex.snapToPixel ? ~~(point.x + pixelSnapEpsilon) : point.x, this._ex.snapToPixel ? ~~(point.y + pixelSnapEpsilon) : point.y, pointOptions.size, 0, Math.PI * 2);\n this._ex.__ctx.fill();\n this._ex.__ctx.closePath();\n this._ex.__ctx.restore();\n }\n drawText(text, pos) {\n this._debugText.write(this._ex, text, pos);\n }\n}\nclass ExcaliburGraphicsContext2DCanvas {\n get width() {\n return this.__ctx.canvas.width;\n }\n get height() {\n return this.__ctx.canvas.height;\n }\n get opacity() {\n return this._state.current.opacity;\n }\n set opacity(value) {\n this._state.current.opacity = value;\n }\n get tint() {\n return this._state.current.tint;\n }\n set tint(color) {\n this._state.current.tint = color;\n }\n get smoothing() {\n return this.__ctx.imageSmoothingEnabled;\n }\n set smoothing(value) {\n this.__ctx.imageSmoothingEnabled = value;\n }\n constructor(options) {\n /**\n * Unused in Canvas implementation\n */\n this.useDrawSorting = false;\n /**\n * Unused in Canvas implementation\n */\n this.z = 0;\n this.backgroundColor = _Color__WEBPACK_IMPORTED_MODULE_1__.Color.ExcaliburBlue;\n this._state = new _state_stack__WEBPACK_IMPORTED_MODULE_2__.StateStack();\n this.snapToPixel = false;\n this.debug = new ExcaliburGraphicsContext2DCanvasDebug(this);\n const { canvasElement, context, enableTransparency, snapToPixel, antialiasing: smoothing, backgroundColor } = options;\n this.__ctx =\n context !== null && context !== void 0 ? context : canvasElement.getContext('2d', {\n alpha: enableTransparency !== null && enableTransparency !== void 0 ? enableTransparency : true\n });\n if (!this.__ctx) {\n throw new Error('Cannot build new ExcaliburGraphicsContext2D for some reason!');\n }\n this.backgroundColor = backgroundColor !== null && backgroundColor !== void 0 ? backgroundColor : this.backgroundColor;\n this.snapToPixel = snapToPixel !== null && snapToPixel !== void 0 ? snapToPixel : this.snapToPixel;\n this.smoothing = smoothing !== null && smoothing !== void 0 ? smoothing : this.smoothing;\n }\n resetTransform() {\n this.__ctx.resetTransform();\n }\n updateViewport(_resolution) {\n // pass\n }\n drawImage(image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight) {\n if (swidth === 0 || sheight === 0) {\n return; // zero dimension dest exit early\n }\n else if (dwidth === 0 || dheight === 0) {\n return; // zero dimension dest exit early\n }\n else if (image.width === 0 || image.height === 0) {\n return; // zero dimension source exit early\n }\n this.__ctx.globalAlpha = this.opacity;\n const args = [image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight]\n .filter((a) => a !== undefined)\n .map((a) => (typeof a === 'number' && this.snapToPixel ? ~~a : a));\n this.__ctx.drawImage.apply(this.__ctx, args);\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_3__.GraphicsDiagnostics.DrawCallCount++;\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_3__.GraphicsDiagnostics.DrawnImagesCount = 1;\n }\n drawLine(start, end, color, thickness = 1) {\n this.__ctx.save();\n this.__ctx.beginPath();\n this.__ctx.strokeStyle = color.toString();\n this.__ctx.moveTo(this.snapToPixel ? ~~(start.x + pixelSnapEpsilon) : start.x, this.snapToPixel ? ~~(start.y + pixelSnapEpsilon) : start.y);\n this.__ctx.lineTo(this.snapToPixel ? ~~(end.x + pixelSnapEpsilon) : end.x, this.snapToPixel ? ~~(end.y + pixelSnapEpsilon) : end.y);\n this.__ctx.lineWidth = thickness;\n this.__ctx.stroke();\n this.__ctx.closePath();\n this.__ctx.restore();\n }\n drawRectangle(pos, width, height, color) {\n this.__ctx.save();\n this.__ctx.fillStyle = color.toString();\n this.__ctx.fillRect(this.snapToPixel ? ~~(pos.x + pixelSnapEpsilon) : pos.x, this.snapToPixel ? ~~(pos.y + pixelSnapEpsilon) : pos.y, this.snapToPixel ? ~~(width + pixelSnapEpsilon) : width, this.snapToPixel ? ~~(height + pixelSnapEpsilon) : height);\n this.__ctx.restore();\n }\n drawCircle(pos, radius, color, stroke, thickness) {\n this.__ctx.save();\n this.__ctx.beginPath();\n if (stroke) {\n this.__ctx.strokeStyle = stroke.toString();\n }\n if (thickness) {\n this.__ctx.lineWidth = thickness;\n }\n this.__ctx.fillStyle = color.toString();\n this.__ctx.arc(this.snapToPixel ? ~~(pos.x + pixelSnapEpsilon) : pos.x, this.snapToPixel ? ~~(pos.y + pixelSnapEpsilon) : pos.y, radius, 0, Math.PI * 2);\n this.__ctx.fill();\n if (stroke) {\n this.__ctx.stroke();\n }\n this.__ctx.closePath();\n this.__ctx.restore();\n }\n /**\n * Save the current state of the canvas to the stack (transforms and opacity)\n */\n save() {\n this.__ctx.save();\n this._state.save();\n }\n /**\n * Restore the state of the canvas from the stack\n */\n restore() {\n this.__ctx.restore();\n this._state.restore();\n }\n /**\n * Translate the origin of the context by an x and y\n * @param x\n * @param y\n */\n translate(x, y) {\n this.__ctx.translate(this.snapToPixel ? ~~(x + pixelSnapEpsilon) : x, this.snapToPixel ? ~~(y + pixelSnapEpsilon) : y);\n }\n /**\n * Rotate the context about the current origin\n */\n rotate(angle) {\n this.__ctx.rotate(angle);\n }\n /**\n * Scale the context by an x and y factor\n * @param x\n * @param y\n */\n scale(x, y) {\n this.__ctx.scale(x, y);\n }\n getTransform() {\n throw new Error('Not implemented');\n }\n multiply(_m) {\n this.__ctx.setTransform(this.__ctx.getTransform().multiply(_m.toDOMMatrix()));\n }\n addPostProcessor(_postprocessor) {\n // pass\n }\n removePostProcessor(_postprocessor) {\n // pass\n }\n clearPostProcessors() {\n // pass\n }\n updatePostProcessors(elapsed) {\n // pass\n }\n beginDrawLifecycle() {\n // pass\n }\n endDrawLifecycle() {\n // pass\n }\n set material(material) {\n this._state.current.material = material;\n }\n get material() {\n return this._state.current.material;\n }\n createMaterial(options) {\n // pass\n return null;\n }\n clear() {\n // Clear frame\n this.__ctx.clearRect(0, 0, this.width, this.height);\n this.__ctx.fillStyle = this.backgroundColor.toString();\n this.__ctx.fillRect(0, 0, this.width, this.height);\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_3__.GraphicsDiagnostics.clear();\n }\n /**\n * Flushes the batched draw calls to the screen\n */\n flush() {\n // pass\n }\n dispose() {\n this.__ctx = undefined;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\":\n/*!***********************************************************!*\\\n !*** ./Graphics/Context/ExcaliburGraphicsContextWebGL.ts ***!\n \\***********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ExcaliburGraphicsContextWebGL: () => (/* binding */ ExcaliburGraphicsContextWebGL),\n/* harmony export */ pixelSnapEpsilon: () => (/* binding */ pixelSnapEpsilon)\n/* harmony export */ });\n/* harmony import */ var _Math_matrix__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../Math/matrix */ \"./Math/matrix.ts\");\n/* harmony import */ var _transform_stack__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./transform-stack */ \"./Graphics/Context/transform-stack.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Color */ \"./Color.ts\");\n/* harmony import */ var _state_stack__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./state-stack */ \"./Graphics/Context/state-stack.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _debug_text__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./debug-text */ \"./Graphics/Context/debug-text.ts\");\n/* harmony import */ var _render_target__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./render-target */ \"./Graphics/Context/render-target.ts\");\n/* harmony import */ var _texture_loader__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./texture-loader */ \"./Graphics/Context/texture-loader.ts\");\n/* harmony import */ var _line_renderer_line_renderer__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./line-renderer/line-renderer */ \"./Graphics/Context/line-renderer/line-renderer.ts\");\n/* harmony import */ var _point_renderer_point_renderer__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./point-renderer/point-renderer */ \"./Graphics/Context/point-renderer/point-renderer.ts\");\n/* harmony import */ var _screen_pass_painter_screen_pass_painter__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./screen-pass-painter/screen-pass-painter */ \"./Graphics/Context/screen-pass-painter/screen-pass-painter.ts\");\n/* harmony import */ var _image_renderer_image_renderer__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./image-renderer/image-renderer */ \"./Graphics/Context/image-renderer/image-renderer.ts\");\n/* harmony import */ var _rectangle_renderer_rectangle_renderer__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./rectangle-renderer/rectangle-renderer */ \"./Graphics/Context/rectangle-renderer/rectangle-renderer.ts\");\n/* harmony import */ var _circle_renderer_circle_renderer__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./circle-renderer/circle-renderer */ \"./Graphics/Context/circle-renderer/circle-renderer.ts\");\n/* harmony import */ var _Util_Pool__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Util/Pool */ \"./Util/Pool.ts\");\n/* harmony import */ var _draw_call__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./draw-call */ \"./Graphics/Context/draw-call.ts\");\n/* harmony import */ var _material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./material */ \"./Graphics/Context/material.ts\");\n/* harmony import */ var _material_renderer_material_renderer__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./material-renderer/material-renderer */ \"./Graphics/Context/material-renderer/material-renderer.ts\");\n/* harmony import */ var _shader__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _particle_renderer_particle_renderer__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./particle-renderer/particle-renderer */ \"./Graphics/Context/particle-renderer/particle-renderer.ts\");\n/* harmony import */ var _image_renderer_v2_image_renderer_v2__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./image-renderer-v2/image-renderer-v2 */ \"./Graphics/Context/image-renderer-v2/image-renderer-v2.ts\");\n/* harmony import */ var _Flags__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Flags */ \"./Flags.ts\");\n\n\n\n\n\n\n\n\n\n// renderers\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst pixelSnapEpsilon = 0.0001;\nclass ExcaliburGraphicsContextWebGLDebug {\n constructor(_webglCtx) {\n this._webglCtx = _webglCtx;\n this._debugText = new _debug_text__WEBPACK_IMPORTED_MODULE_0__.DebugText();\n }\n /**\n * Draw a debugging rectangle to the context\n * @param x\n * @param y\n * @param width\n * @param height\n */\n drawRect(x, y, width, height, rectOptions = { color: _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Black }) {\n this.drawLine((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(x, y), (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(x + width, y), { ...rectOptions });\n this.drawLine((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(x + width, y), (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(x + width, y + height), { ...rectOptions });\n this.drawLine((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(x + width, y + height), (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(x, y + height), { ...rectOptions });\n this.drawLine((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(x, y + height), (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(x, y), { ...rectOptions });\n }\n /**\n * Draw a debugging line to the context\n * @param start\n * @param end\n * @param lineOptions\n */\n drawLine(start, end, lineOptions) {\n var _a;\n this._webglCtx.draw('ex.line', start, end, (_a = lineOptions === null || lineOptions === void 0 ? void 0 : lineOptions.color) !== null && _a !== void 0 ? _a : _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Black);\n }\n /**\n * Draw a debugging point to the context\n * @param point\n * @param pointOptions\n */\n drawPoint(point, pointOptions = { color: _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Black, size: 5 }) {\n this._webglCtx.draw('ex.point', point, pointOptions.color, pointOptions.size);\n }\n drawText(text, pos) {\n this._debugText.write(this._webglCtx, text, pos);\n }\n}\nclass ExcaliburGraphicsContextWebGL {\n get z() {\n return this._state.current.z;\n }\n set z(value) {\n this._state.current.z = value;\n }\n get opacity() {\n return this._state.current.opacity;\n }\n set opacity(value) {\n this._state.current.opacity = value;\n }\n get tint() {\n return this._state.current.tint;\n }\n set tint(color) {\n this._state.current.tint = color;\n }\n get width() {\n return this.__gl.canvas.width;\n }\n get height() {\n return this.__gl.canvas.height;\n }\n get ortho() {\n return this._ortho;\n }\n /**\n * Checks the underlying webgl implementation if the requested internal resolution is supported\n * @param dim\n */\n checkIfResolutionSupported(dim) {\n // Slight hack based on this thread https://groups.google.com/g/webgl-dev-list/c/AHONvz3oQTo\n let supported = true;\n if (dim.width > 4096 || dim.height > 4096) {\n supported = false;\n }\n return supported;\n }\n constructor(options) {\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_3__.Logger.getInstance();\n this._renderers = new Map();\n this.imageRenderer = _Flags__WEBPACK_IMPORTED_MODULE_4__.Flags.isEnabled('use-legacy-image-renderer') ? 'ex.image' : 'ex.image-v2';\n this._isDrawLifecycle = false;\n this.useDrawSorting = true;\n this._drawCallPool = new _Util_Pool__WEBPACK_IMPORTED_MODULE_5__.Pool(() => new _draw_call__WEBPACK_IMPORTED_MODULE_6__.DrawCall(), undefined, 4000);\n this._drawCallIndex = 0;\n this._drawCalls = new Array(4000).fill(null);\n // Postprocessing is a tuple with 2 render targets, these are flip-flopped during the postprocessing process\n this._postProcessTargets = [];\n this._postprocessors = [];\n this._transform = new _transform_stack__WEBPACK_IMPORTED_MODULE_7__.TransformStack();\n this._state = new _state_stack__WEBPACK_IMPORTED_MODULE_8__.StateStack();\n /**\n * Snaps the drawing x/y coordinate to the nearest whole pixel\n */\n this.snapToPixel = false;\n /**\n * Native context smoothing\n */\n this.smoothing = false;\n /**\n * Whether the pixel art sampler is enabled for smooth sub pixel anti-aliasing\n */\n this.pixelArtSampler = false;\n /**\n * UV padding in pixels to use in internal image rendering to prevent texture bleed\n *\n */\n this.uvPadding = 0.01;\n this.backgroundColor = _Color__WEBPACK_IMPORTED_MODULE_1__.Color.ExcaliburBlue;\n this.multiSampleAntialiasing = true;\n this.transparency = true;\n this._isContextLost = false;\n this._disposed = false;\n this._imageToWidth = new Map();\n this._imageToHeight = new Map();\n this.debug = new ExcaliburGraphicsContextWebGLDebug(this);\n this._totalPostProcessorTime = 0;\n const { canvasElement, context, enableTransparency, antialiasing, uvPadding, multiSampleAntialiasing, pixelArtSampler, powerPreference, snapToPixel, backgroundColor, useDrawSorting, garbageCollector, handleContextLost, handleContextRestored } = options;\n this.__gl =\n context !== null && context !== void 0 ? context : canvasElement.getContext('webgl2', {\n antialias: antialiasing !== null && antialiasing !== void 0 ? antialiasing : this.smoothing,\n premultipliedAlpha: false,\n alpha: enableTransparency !== null && enableTransparency !== void 0 ? enableTransparency : this.transparency,\n depth: false,\n powerPreference: powerPreference !== null && powerPreference !== void 0 ? powerPreference : 'high-performance'\n });\n if (!this.__gl) {\n throw Error('Failed to retrieve webgl context from browser');\n }\n if (handleContextLost) {\n this.__gl.canvas.addEventListener('webglcontextlost', handleContextLost, false);\n }\n if (handleContextRestored) {\n this.__gl.canvas.addEventListener('webglcontextrestored', handleContextRestored, false);\n }\n this.__gl.canvas.addEventListener('webglcontextlost', () => {\n this._isContextLost = true;\n });\n this.__gl.canvas.addEventListener('webglcontextrestored', () => {\n this._isContextLost = false;\n });\n this.textureLoader = new _texture_loader__WEBPACK_IMPORTED_MODULE_9__.TextureLoader(this.__gl, garbageCollector);\n this.snapToPixel = snapToPixel !== null && snapToPixel !== void 0 ? snapToPixel : this.snapToPixel;\n this.smoothing = antialiasing !== null && antialiasing !== void 0 ? antialiasing : this.smoothing;\n this.transparency = enableTransparency !== null && enableTransparency !== void 0 ? enableTransparency : this.transparency;\n this.pixelArtSampler = pixelArtSampler !== null && pixelArtSampler !== void 0 ? pixelArtSampler : this.pixelArtSampler;\n this.uvPadding = uvPadding !== null && uvPadding !== void 0 ? uvPadding : this.uvPadding;\n this.multiSampleAntialiasing = typeof multiSampleAntialiasing === 'boolean' ? multiSampleAntialiasing : this.multiSampleAntialiasing;\n this.samples = typeof multiSampleAntialiasing === 'object' ? multiSampleAntialiasing.samples : undefined;\n this.backgroundColor = backgroundColor !== null && backgroundColor !== void 0 ? backgroundColor : this.backgroundColor;\n this.useDrawSorting = useDrawSorting !== null && useDrawSorting !== void 0 ? useDrawSorting : this.useDrawSorting;\n this._drawCallPool.disableWarnings = true;\n this._drawCallPool.preallocate();\n this._init();\n }\n dispose() {\n if (!this._disposed) {\n this._disposed = true;\n this.textureLoader.dispose();\n for (const renderer of this._renderers.values()) {\n renderer.dispose();\n }\n this._renderers.clear();\n this._drawCallPool.dispose();\n this._drawCalls.length = 0;\n this.__gl = null;\n }\n }\n _init() {\n const gl = this.__gl;\n // Setup viewport and view matrix\n this._ortho = _Math_matrix__WEBPACK_IMPORTED_MODULE_10__.Matrix.ortho(0, gl.canvas.width, gl.canvas.height, 0, 400, -400);\n gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);\n // Clear background\n gl.clearColor(this.backgroundColor.r / 255, this.backgroundColor.g / 255, this.backgroundColor.b / 255, this.backgroundColor.a);\n gl.clear(gl.COLOR_BUFFER_BIT);\n // Enable alpha blending\n // https://www.realtimerendering.com/blog/gpus-prefer-premultiplication/\n gl.enable(gl.BLEND);\n gl.blendEquation(gl.FUNC_ADD);\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n gl.blendEquationSeparate(gl.FUNC_ADD, gl.FUNC_ADD);\n gl.blendFuncSeparate(gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n gl.depthMask(false);\n // Setup builtin renderers\n this.register(new _image_renderer_image_renderer__WEBPACK_IMPORTED_MODULE_11__.ImageRenderer({\n uvPadding: this.uvPadding,\n pixelArtSampler: this.pixelArtSampler\n }));\n this.register(new _material_renderer_material_renderer__WEBPACK_IMPORTED_MODULE_12__.MaterialRenderer());\n this.register(new _rectangle_renderer_rectangle_renderer__WEBPACK_IMPORTED_MODULE_13__.RectangleRenderer());\n this.register(new _circle_renderer_circle_renderer__WEBPACK_IMPORTED_MODULE_14__.CircleRenderer());\n this.register(new _point_renderer_point_renderer__WEBPACK_IMPORTED_MODULE_15__.PointRenderer());\n this.register(new _line_renderer_line_renderer__WEBPACK_IMPORTED_MODULE_16__.LineRenderer());\n this.register(new _particle_renderer_particle_renderer__WEBPACK_IMPORTED_MODULE_17__.ParticleRenderer());\n this.register(new _image_renderer_v2_image_renderer_v2__WEBPACK_IMPORTED_MODULE_18__.ImageRendererV2({\n uvPadding: this.uvPadding,\n pixelArtSampler: this.pixelArtSampler\n }));\n this.materialScreenTexture = gl.createTexture();\n if (!this.materialScreenTexture) {\n throw new Error('Could not create screen texture!');\n }\n gl.bindTexture(gl.TEXTURE_2D, this.materialScreenTexture);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT);\n gl.bindTexture(gl.TEXTURE_2D, null);\n this._screenRenderer = new _screen_pass_painter_screen_pass_painter__WEBPACK_IMPORTED_MODULE_19__.ScreenPassPainter(gl);\n this._renderTarget = new _render_target__WEBPACK_IMPORTED_MODULE_20__.RenderTarget({\n gl,\n transparency: this.transparency,\n width: gl.canvas.width,\n height: gl.canvas.height\n });\n this._postProcessTargets = [\n new _render_target__WEBPACK_IMPORTED_MODULE_20__.RenderTarget({\n gl,\n transparency: this.transparency,\n width: gl.canvas.width,\n height: gl.canvas.height\n }),\n new _render_target__WEBPACK_IMPORTED_MODULE_20__.RenderTarget({\n gl,\n transparency: this.transparency,\n width: gl.canvas.width,\n height: gl.canvas.height\n })\n ];\n this._msaaTarget = new _render_target__WEBPACK_IMPORTED_MODULE_20__.RenderTarget({\n gl,\n transparency: this.transparency,\n width: gl.canvas.width,\n height: gl.canvas.height,\n antialias: this.multiSampleAntialiasing,\n samples: this.samples\n });\n }\n register(renderer) {\n this._renderers.set(renderer.type, renderer);\n renderer.initialize(this.__gl, this);\n }\n get(rendererName) {\n return this._renderers.get(rendererName);\n }\n _isCurrentRenderer(renderer) {\n if (!this._currentRenderer || this._currentRenderer === renderer) {\n return true;\n }\n return false;\n }\n beginDrawLifecycle() {\n this._isDrawLifecycle = true;\n }\n endDrawLifecycle() {\n this._isDrawLifecycle = false;\n }\n draw(rendererName, ...args) {\n if (true) {\n if (args.length > 9) {\n throw new Error('Only 10 or less renderer arguments are supported!;');\n }\n }\n if (!this._isDrawLifecycle) {\n this._logger.warnOnce(`Attempting to draw outside the the drawing lifecycle (preDraw/postDraw) is not supported and is a source of bugs/errors.\\n` +\n `If you want to do custom drawing, use Actor.graphics, or any onPreDraw or onPostDraw handler.`);\n }\n if (this._isContextLost) {\n this._logger.errorOnce(`Unable to draw ${rendererName}, the webgl context is lost`);\n return;\n }\n const renderer = this._renderers.get(rendererName);\n if (renderer) {\n if (this.useDrawSorting) {\n const drawCall = this._drawCallPool.get();\n drawCall.z = this._state.current.z;\n drawCall.priority = renderer.priority;\n drawCall.renderer = rendererName;\n this.getTransform().clone(drawCall.transform);\n drawCall.state.z = this._state.current.z;\n drawCall.state.opacity = this._state.current.opacity;\n drawCall.state.tint = this._state.current.tint;\n drawCall.state.material = this._state.current.material;\n drawCall.args[0] = args[0];\n drawCall.args[1] = args[1];\n drawCall.args[2] = args[2];\n drawCall.args[3] = args[3];\n drawCall.args[4] = args[4];\n drawCall.args[5] = args[5];\n drawCall.args[6] = args[6];\n drawCall.args[7] = args[7];\n drawCall.args[8] = args[8];\n drawCall.args[9] = args[9];\n this._drawCalls[this._drawCallIndex++] = drawCall;\n }\n else {\n // Set the current renderer if not defined\n if (!this._currentRenderer) {\n this._currentRenderer = renderer;\n }\n if (!this._isCurrentRenderer(renderer)) {\n // switching graphics means we must flush the previous\n this._currentRenderer.flush();\n }\n // If we are still using the same renderer we can add to the current batch\n renderer.draw(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9]);\n this._currentRenderer = renderer;\n }\n }\n else {\n throw Error(`No renderer with name ${rendererName} has been registered`);\n }\n }\n resetTransform() {\n this._transform.reset();\n }\n updateViewport(resolution) {\n const gl = this.__gl;\n this._ortho = this._ortho = _Math_matrix__WEBPACK_IMPORTED_MODULE_10__.Matrix.ortho(0, resolution.width, resolution.height, 0, 400, -400);\n this._renderTarget.setResolution(gl.canvas.width, gl.canvas.height);\n this._msaaTarget.setResolution(gl.canvas.width, gl.canvas.height);\n this._postProcessTargets[0].setResolution(gl.canvas.width, gl.canvas.height);\n this._postProcessTargets[1].setResolution(gl.canvas.width, gl.canvas.height);\n }\n _getImageWidth(image) {\n let maybeWidth = this._imageToWidth.get(image);\n if (maybeWidth === undefined) {\n maybeWidth = image.width;\n this._imageToWidth.set(image, maybeWidth);\n }\n return maybeWidth;\n }\n _getImageHeight(image) {\n let maybeHeight = this._imageToHeight.get(image);\n if (maybeHeight === undefined) {\n maybeHeight = image.height;\n this._imageToHeight.set(image, maybeHeight);\n }\n return maybeHeight;\n }\n drawImage(image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight) {\n if (swidth === 0 || sheight === 0) {\n return; // zero dimension dest exit early\n }\n else if (dwidth === 0 || dheight === 0) {\n return; // zero dimension dest exit early\n }\n else if (this._getImageWidth(image) === 0 || this._getImageHeight(image) === 0) {\n return; // zero dimension source exit early\n }\n if (!image) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_3__.Logger.getInstance().warn('Cannot draw a null or undefined image');\n // tslint:disable-next-line: no-console\n if (console.trace) {\n // tslint:disable-next-line: no-console\n console.trace();\n }\n return;\n }\n if (this._state.current.material) {\n this.draw('ex.material', image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight);\n }\n else {\n if (this.imageRenderer === 'ex.image') {\n this.draw(this.imageRenderer, image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight);\n }\n else {\n this.draw(this.imageRenderer, image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight);\n }\n }\n }\n drawLine(start, end, color, thickness = 1) {\n this.draw('ex.rectangle', start, end, color, thickness);\n }\n drawRectangle(pos, width, height, color, stroke, strokeThickness) {\n this.draw('ex.rectangle', pos, width, height, color, stroke, strokeThickness);\n }\n drawCircle(pos, radius, color, stroke, thickness) {\n this.draw('ex.circle', pos, radius, color, stroke, thickness);\n }\n save() {\n this._transform.save();\n this._state.save();\n }\n restore() {\n this._transform.restore();\n this._state.restore();\n }\n translate(x, y) {\n this._transform.translate(this.snapToPixel ? ~~(x + pixelSnapEpsilon) : x, this.snapToPixel ? ~~(y + pixelSnapEpsilon) : y);\n }\n rotate(angle) {\n this._transform.rotate(angle);\n }\n scale(x, y) {\n this._transform.scale(x, y);\n }\n transform(matrix) {\n this._transform.current = matrix;\n }\n getTransform() {\n return this._transform.current;\n }\n multiply(m) {\n this._transform.current.multiply(m, this._transform.current);\n }\n addPostProcessor(postprocessor) {\n this._postprocessors.push(postprocessor);\n postprocessor.initialize(this.__gl);\n }\n removePostProcessor(postprocessor) {\n const index = this._postprocessors.indexOf(postprocessor);\n if (index !== -1) {\n this._postprocessors.splice(index, 1);\n }\n }\n clearPostProcessors() {\n this._postprocessors.length = 0;\n }\n updatePostProcessors(elapsed) {\n for (const postprocessor of this._postprocessors) {\n const shader = postprocessor.getShader();\n shader.use();\n const uniforms = shader.getUniforms();\n this._totalPostProcessorTime += elapsed;\n if (uniforms.find((u) => u.name === 'u_time_ms')) {\n shader.setUniformFloat('u_time_ms', this._totalPostProcessorTime);\n }\n if (uniforms.find((u) => u.name === 'u_elapsed_ms')) {\n shader.setUniformFloat('u_elapsed_ms', elapsed);\n }\n if (uniforms.find((u) => u.name === 'u_resolution')) {\n shader.setUniformFloatVector('u_resolution', (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(this.width, this.height));\n }\n if (postprocessor.onUpdate) {\n postprocessor.onUpdate(elapsed);\n }\n }\n }\n set material(material) {\n this._state.current.material = material;\n }\n get material() {\n return this._state.current.material;\n }\n /**\n * Creates and initializes the material which compiles the internal shader\n * @param options\n * @returns Material\n */\n createMaterial(options) {\n const material = new _material__WEBPACK_IMPORTED_MODULE_21__.Material({ ...options, graphicsContext: this });\n return material;\n }\n createShader(options) {\n const gl = this.__gl;\n const { vertexSource, fragmentSource } = options;\n const shader = new _shader__WEBPACK_IMPORTED_MODULE_22__.Shader({\n gl,\n vertexSource,\n fragmentSource\n });\n shader.compile();\n return shader;\n }\n clear() {\n const gl = this.__gl;\n const currentTarget = this.multiSampleAntialiasing ? this._msaaTarget : this._renderTarget;\n currentTarget.use();\n gl.clearColor(this.backgroundColor.r / 255, this.backgroundColor.g / 255, this.backgroundColor.b / 255, this.backgroundColor.a);\n // Clear the context with the newly set color. This is\n // the function call that actually does the drawing.\n gl.clear(gl.COLOR_BUFFER_BIT);\n }\n /**\n * Flushes all batched rendering to the screen\n */\n flush() {\n var _a;\n if (this._isContextLost) {\n this._logger.errorOnce(`Unable to flush the webgl context is lost`);\n return;\n }\n // render target captures all draws and redirects to the render target\n let currentTarget = this.multiSampleAntialiasing ? this._msaaTarget : this._renderTarget;\n currentTarget.use();\n if (this.useDrawSorting) {\n // null out unused draw calls\n for (let i = this._drawCallIndex; i < this._drawCalls.length; i++) {\n this._drawCalls[i] = null;\n }\n // sort draw calls\n // Find the original order of the first instance of the draw call\n const originalSort = new Map();\n for (const [name] of this._renderers) {\n let firstIndex = 0;\n for (firstIndex = 0; firstIndex < this._drawCallIndex; firstIndex++) {\n if (this._drawCalls[firstIndex].renderer === name) {\n break;\n }\n }\n originalSort.set(name, firstIndex);\n }\n this._drawCalls.sort((a, b) => {\n if (a === null || b === null) {\n return 0;\n }\n const zIndex = a.z - b.z;\n const originalSortOrder = originalSort.get(a.renderer) - originalSort.get(b.renderer);\n const priority = a.priority - b.priority;\n if (zIndex === 0) {\n // sort by z first\n if (priority === 0) {\n // sort by priority\n return originalSortOrder; // use the original order to inform draw call packing to maximally preserve painter order\n }\n return priority;\n }\n return zIndex;\n });\n const oldTransform = this._transform.current;\n const oldState = this._state.current;\n if (this._drawCalls.length && this._drawCallIndex) {\n let currentRendererName = this._drawCalls[0].renderer;\n let currentRenderer = this._renderers.get(currentRendererName);\n for (let i = 0; i < this._drawCallIndex; i++) {\n // hydrate the state for renderers\n this._transform.current = this._drawCalls[i].transform;\n this._state.current = this._drawCalls[i].state;\n if (this._drawCalls[i].renderer !== currentRendererName) {\n // switching graphics renderer means we must flush the previous\n currentRenderer.flush();\n currentRendererName = this._drawCalls[i].renderer;\n currentRenderer = this._renderers.get(currentRendererName);\n }\n // ! hack to grab screen texture before materials run because they might want it\n if (currentRenderer instanceof _material_renderer_material_renderer__WEBPACK_IMPORTED_MODULE_12__.MaterialRenderer && ((_a = this.material) === null || _a === void 0 ? void 0 : _a.isUsingScreenTexture)) {\n currentTarget.copyToTexture(this.materialScreenTexture);\n currentTarget.use();\n }\n // If we are still using the same renderer we can add to the current batch\n currentRenderer.draw(...this._drawCalls[i].args);\n }\n if (currentRenderer.hasPendingDraws()) {\n currentRenderer.flush();\n }\n }\n // reset state\n this._transform.current = oldTransform;\n this._state.current = oldState;\n // reclaim draw calls\n this._drawCallPool.done();\n this._drawCallIndex = 0;\n this._imageToHeight.clear();\n this._imageToWidth.clear();\n }\n else {\n // This is the final flush at the moment to draw any leftover pending draw\n for (const renderer of this._renderers.values()) {\n if (renderer.hasPendingDraws()) {\n renderer.flush();\n }\n }\n }\n currentTarget.disable();\n // post process step\n if (this._postprocessors.length > 0) {\n const source = currentTarget.toRenderSource();\n source.use();\n }\n // flip flop render targets for post processing\n for (let i = 0; i < this._postprocessors.length; i++) {\n currentTarget = this._postProcessTargets[i % 2];\n this._postProcessTargets[i % 2].use();\n this._screenRenderer.renderWithPostProcessor(this._postprocessors[i]);\n this._postProcessTargets[i % 2].toRenderSource().use();\n }\n // Final blit to the screen\n currentTarget.blitToScreen();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/circle-renderer/circle-renderer.ts\":\n/*!*************************************************************!*\\\n !*** ./Graphics/Context/circle-renderer/circle-renderer.ts ***!\n \\*************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CircleRenderer: () => (/* binding */ CircleRenderer)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../Color */ \"./Color.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n/* harmony import */ var _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _quad_index_buffer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../quad-index-buffer */ \"./Graphics/Context/quad-index-buffer.ts\");\n/* harmony import */ var _shader__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _vertex_buffer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _vertex_layout__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../vertex-layout */ \"./Graphics/Context/vertex-layout.ts\");\n/* harmony import */ var _circle_renderer_frag_glsl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./circle-renderer.frag.glsl */ \"./Graphics/Context/circle-renderer/circle-renderer.frag.glsl\");\n/* harmony import */ var _circle_renderer_vert_glsl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./circle-renderer.vert.glsl */ \"./Graphics/Context/circle-renderer/circle-renderer.vert.glsl\");\n\n\n\n\n\n\n\n\n\n\nclass CircleRenderer {\n constructor() {\n this.type = 'ex.circle';\n this.priority = 0;\n this._maxCircles = 10922; // max(uint16) / 6 verts\n this._circleCount = 0;\n this._vertexIndex = 0;\n }\n initialize(gl, context) {\n this._gl = gl;\n this._context = context;\n this._shader = new _shader__WEBPACK_IMPORTED_MODULE_0__.Shader({\n gl,\n fragmentSource: _circle_renderer_frag_glsl__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n vertexSource: _circle_renderer_vert_glsl__WEBPACK_IMPORTED_MODULE_2__[\"default\"]\n });\n this._shader.compile();\n // setup uniforms\n this._shader.use();\n this._shader.setUniformMatrix('u_matrix', context.ortho);\n this._buffer = new _vertex_buffer__WEBPACK_IMPORTED_MODULE_3__.VertexBuffer({\n gl,\n size: 14 * 4 * this._maxCircles,\n type: 'dynamic'\n });\n this._layout = new _vertex_layout__WEBPACK_IMPORTED_MODULE_4__.VertexLayout({\n gl,\n shader: this._shader,\n vertexBuffer: this._buffer,\n attributes: [\n ['a_position', 2],\n ['a_uv', 2],\n ['a_opacity', 1],\n ['a_color', 4],\n ['a_strokeColor', 4],\n ['a_strokeThickness', 1]\n ]\n });\n this._quads = new _quad_index_buffer__WEBPACK_IMPORTED_MODULE_5__.QuadIndexBuffer(gl, this._maxCircles, true);\n }\n dispose() {\n this._buffer.dispose();\n this._quads.dispose();\n this._shader.dispose();\n this._context = null;\n this._gl = null;\n }\n _isFull() {\n if (this._circleCount >= this._maxCircles) {\n return true;\n }\n return false;\n }\n draw(pos, radius, color, stroke = _Color__WEBPACK_IMPORTED_MODULE_6__.Color.Transparent, strokeThickness = 0) {\n if (this._isFull()) {\n this.flush();\n }\n this._circleCount++;\n // transform based on current context\n const transform = this._context.getTransform();\n const opacity = this._context.opacity;\n const snapToPixel = this._context.snapToPixel;\n const topLeft = transform.multiply(pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_7__.vec)(-radius, -radius)));\n const topRight = transform.multiply(pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_7__.vec)(radius, -radius)));\n const bottomRight = transform.multiply(pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_7__.vec)(radius, radius)));\n const bottomLeft = transform.multiply(pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_7__.vec)(-radius, radius)));\n if (snapToPixel) {\n topLeft.x = ~~(topLeft.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n topLeft.y = ~~(topLeft.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n topRight.x = ~~(topRight.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n topRight.y = ~~(topRight.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n bottomLeft.x = ~~(bottomLeft.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n bottomLeft.y = ~~(bottomLeft.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n bottomRight.x = ~~(bottomRight.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n bottomRight.y = ~~(bottomRight.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n }\n // TODO UV could be static vertex buffer\n const uvx0 = 0;\n const uvy0 = 0;\n const uvx1 = 1;\n const uvy1 = 1;\n // update data\n const vertexBuffer = this._layout.vertexBuffer.bufferData;\n // (0, 0) - 0\n vertexBuffer[this._vertexIndex++] = topLeft.x;\n vertexBuffer[this._vertexIndex++] = topLeft.y;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness / radius;\n // (0, 1) - 1\n vertexBuffer[this._vertexIndex++] = bottomLeft.x;\n vertexBuffer[this._vertexIndex++] = bottomLeft.y;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness / radius;\n // (1, 0) - 2\n vertexBuffer[this._vertexIndex++] = topRight.x;\n vertexBuffer[this._vertexIndex++] = topRight.y;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness / radius;\n // (1, 1) - 3\n vertexBuffer[this._vertexIndex++] = bottomRight.x;\n vertexBuffer[this._vertexIndex++] = bottomRight.y;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness / radius;\n }\n hasPendingDraws() {\n return this._circleCount !== 0;\n }\n flush() {\n // nothing to draw early exit\n if (this._circleCount === 0) {\n return;\n }\n const gl = this._gl;\n // Bind the shader\n this._shader.use();\n // Bind the memory layout and upload data\n this._layout.use(true);\n // Update ortho matrix uniform\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n // Bind index buffer\n this._quads.bind();\n // Draw all the quads\n gl.drawElements(gl.TRIANGLES, this._circleCount * 6, this._quads.bufferGlType, 0);\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_9__.GraphicsDiagnostics.DrawnImagesCount += this._circleCount;\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_9__.GraphicsDiagnostics.DrawCallCount++;\n // Reset\n this._circleCount = 0;\n this._vertexIndex = 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/debug-text.ts\":\n/*!****************************************!*\\\n !*** ./Graphics/Context/debug-text.ts ***!\n \\****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DebugText: () => (/* binding */ DebugText)\n/* harmony export */ });\n/* harmony import */ var _ImageSource__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ImageSource */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _SpriteFont__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../SpriteFont */ \"./Graphics/SpriteFont.ts\");\n/* harmony import */ var _SpriteSheet__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../SpriteSheet */ \"./Graphics/SpriteSheet.ts\");\n/* harmony import */ var _debug_font_png__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./debug-font.png */ \"./Graphics/Context/debug-font.png\");\n\n\n\n\n/**\n * Internal debug text helper\n */\nclass DebugText {\n constructor() {\n /**\n * base64 font\n */\n this.fontSheet = _debug_font_png__WEBPACK_IMPORTED_MODULE_0__[\"default\"];\n this.size = 16;\n // We fire and forget, we don't care if it's loaded or not\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.load();\n }\n load() {\n this._imageSource = new _ImageSource__WEBPACK_IMPORTED_MODULE_1__.ImageSource(this.fontSheet);\n return this._imageSource.load().then(() => {\n this._spriteSheet = _SpriteSheet__WEBPACK_IMPORTED_MODULE_2__.SpriteSheet.fromImageSource({\n image: this._imageSource,\n grid: {\n rows: 4,\n columns: 16,\n spriteWidth: 16,\n spriteHeight: 16\n }\n });\n this._spriteFont = new _SpriteFont__WEBPACK_IMPORTED_MODULE_3__.SpriteFont({\n alphabet: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ,!\\'&.\"?-()+# ',\n caseInsensitive: true,\n spriteSheet: this._spriteSheet,\n spacing: -6\n });\n });\n }\n /**\n * Writes debug text using the built in sprint font\n * @param ctx\n * @param text\n * @param pos\n */\n write(ctx, text, pos) {\n if (this._imageSource.isLoaded()) {\n this._spriteFont.render(ctx, text, null, pos.x, pos.y);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/draw-call.ts\":\n/*!***************************************!*\\\n !*** ./Graphics/Context/draw-call.ts ***!\n \\***************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DrawCall: () => (/* binding */ DrawCall)\n/* harmony export */ });\n/* harmony import */ var _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/affine-matrix */ \"./Math/affine-matrix.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Color */ \"./Color.ts\");\n\n\nclass DrawCall {\n constructor() {\n this.z = 0;\n this.priority = 0;\n this.renderer = '';\n this.transform = _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_0__.AffineMatrix.identity();\n this.state = {\n z: 0,\n opacity: 1,\n tint: _Color__WEBPACK_IMPORTED_MODULE_1__.Color.White,\n material: null\n };\n this.args = new Array(10);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/image-renderer-v2/image-renderer-v2.ts\":\n/*!*****************************************************************!*\\\n !*** ./Graphics/Context/image-renderer-v2/image-renderer-v2.ts ***!\n \\*****************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ImageRendererV2: () => (/* binding */ ImageRendererV2)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Color */ \"./Color.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n/* harmony import */ var _ImageSource__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../ImageSource */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../Wrapping */ \"./Graphics/Wrapping.ts\");\n/* harmony import */ var _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _shader__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _vertex_buffer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _webgl_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../webgl-util */ \"./Graphics/Context/webgl-util.ts\");\n/* harmony import */ var _image_renderer_v2_frag_glsl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./image-renderer-v2.frag.glsl */ \"./Graphics/Context/image-renderer-v2/image-renderer-v2.frag.glsl\");\n/* harmony import */ var _image_renderer_v2_vert_glsl__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./image-renderer-v2.vert.glsl */ \"./Graphics/Context/image-renderer-v2/image-renderer-v2.vert.glsl\");\n// import { Color } from '../../../Color';\n// import { parseImageFiltering } from '../../Filtering';\n\n\n\n\n\n\n\n\n\n\n\nclass ImageRendererV2 {\n constructor(options) {\n this.type = 'ex.image-v2';\n this.priority = 0;\n // TODO this could be bigger probably\n this._maxImages = 20000; // max(uint16) / 6 verts\n this._maxTextures = 0;\n this._components = 2 + 2 + 2 + 2 + 1 + 2 + 2 + 1 + 2 + 2 + 4;\n // Per flush vars\n this._imageCount = 0;\n this._textures = [];\n this._textureIndex = 0;\n this._textureToIndex = new Map();\n this._images = new Set();\n this._vertexIndex = 0;\n this._imageToWidth = new Map();\n this._imageToHeight = new Map();\n this._view = [0, 0, 0, 0];\n this._dest = [0, 0];\n this._defaultTint = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.White;\n this.pixelArtSampler = options.pixelArtSampler;\n this.uvPadding = options.uvPadding;\n }\n initialize(gl, context) {\n this._gl = gl;\n this._context = context;\n // Transform shader source\n const maxTexture = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS);\n const maxComplexity = (0,_webgl_util__WEBPACK_IMPORTED_MODULE_1__.getMaxShaderComplexity)(gl, maxTexture);\n this._maxTextures = Math.min(maxTexture, maxComplexity);\n const transformedFrag = this._transformFragmentSource(_image_renderer_v2_frag_glsl__WEBPACK_IMPORTED_MODULE_2__[\"default\"], this._maxTextures);\n // Compile shader\n this._shader = new _shader__WEBPACK_IMPORTED_MODULE_3__.Shader({\n gl,\n fragmentSource: transformedFrag,\n vertexSource: _image_renderer_v2_vert_glsl__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n });\n this._shader.compile();\n // setup uniforms\n this._shader.use();\n this._shader.setUniformMatrix('u_matrix', context.ortho);\n // Initialize texture slots to [0, 1, 2, 3, 4, .... maxGPUTextures]\n this._shader.setUniformIntArray('u_textures', [...Array(this._maxTextures)].map((_, i) => i));\n this._vao = gl.createVertexArray();\n gl.bindVertexArray(this._vao);\n this._quadMesh = new Float32Array([\n // pos uv\n 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0,\n 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1\n ]);\n this._meshBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this._meshBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, this._quadMesh, gl.STATIC_DRAW);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 16, 0);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(1, 2, gl.FLOAT, false, 16, 8);\n gl.enableVertexAttribArray(1);\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n // Setup memory layout\n const components = this._components;\n this._transformData = new _vertex_buffer__WEBPACK_IMPORTED_MODULE_5__.VertexBuffer({\n gl,\n size: components * this._maxImages, // components * images\n type: 'dynamic'\n });\n this._transformData.bind();\n // attributes\n let offset = 0;\n let start = 2;\n const bytesPerFloat = 4;\n const totalSize = components * 4;\n // a_offset vec2 - 2\n gl.vertexAttribPointer(start++, 2, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(2);\n offset += 2 * bytesPerFloat;\n // a_mat_column1 vec2 - 2\n gl.vertexAttribPointer(start++, 2, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(3);\n offset += 2 * bytesPerFloat;\n // a_mat_column2 vec2 - 2\n gl.vertexAttribPointer(start++, 2, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(4);\n offset += 2 * bytesPerFloat;\n // a_mat_column3 vec2 - 2\n gl.vertexAttribPointer(start++, 2, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(5);\n offset += 2 * bytesPerFloat;\n // a_opacity float - 1\n gl.vertexAttribPointer(start++, 1, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(6);\n offset += 1 * bytesPerFloat;\n // a_res vec2 - 2\n gl.vertexAttribPointer(start++, 2, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(7);\n offset += 2 * bytesPerFloat;\n // a_size vec2 - 2\n gl.vertexAttribPointer(start++, 2, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(8);\n offset += 2 * bytesPerFloat;\n // a_texture_index - 1\n gl.vertexAttribPointer(start++, 1, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(9);\n offset += 1 * bytesPerFloat;\n // a_uv_min - 2\n gl.vertexAttribPointer(start++, 2, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(10);\n offset += 2 * bytesPerFloat;\n // a_uv_max - 2\n gl.vertexAttribPointer(start++, 2, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(11);\n offset += 2 * bytesPerFloat;\n // a_tint - 4\n gl.vertexAttribPointer(start++, 4, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(12);\n offset += 4 * bytesPerFloat;\n gl.vertexAttribDivisor(2, 1);\n gl.vertexAttribDivisor(3, 1);\n gl.vertexAttribDivisor(4, 1);\n gl.vertexAttribDivisor(5, 1);\n gl.vertexAttribDivisor(6, 1);\n gl.vertexAttribDivisor(7, 1);\n gl.vertexAttribDivisor(8, 1);\n gl.vertexAttribDivisor(9, 1);\n gl.vertexAttribDivisor(10, 1);\n gl.vertexAttribDivisor(11, 1);\n gl.vertexAttribDivisor(12, 1);\n gl.bindVertexArray(null);\n }\n _bindData(gl) {\n // Setup memory layout\n const components = this._components;\n this._transformData.bind();\n this._transformData.upload(components * this._imageCount);\n gl.bindVertexArray(this._vao);\n }\n dispose() {\n this._transformData.dispose();\n this._shader.dispose();\n this._textures.length = 0;\n this._context = null;\n this._gl = null;\n }\n _transformFragmentSource(source, maxTextures) {\n let newSource = source.replace('%%count%%', maxTextures.toString());\n let texturePickerBuilder = '';\n for (let i = 0; i < maxTextures; i++) {\n if (i === 0) {\n texturePickerBuilder += `if (v_texture_index <= ${i}.5) {\\n`;\n }\n else {\n texturePickerBuilder += ` else if (v_texture_index <= ${i}.5) {\\n`;\n }\n texturePickerBuilder += ` color = texture(u_textures[${i}], uv);\\n`;\n texturePickerBuilder += ` }\\n`;\n }\n newSource = newSource.replace('%%texture_picker%%', texturePickerBuilder);\n return newSource;\n }\n _addImageAsTexture(image) {\n if (this._images.has(image)) {\n return;\n }\n const maybeFiltering = image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_6__.ImageSourceAttributeConstants.Filtering);\n const filtering = maybeFiltering ? (0,_Filtering__WEBPACK_IMPORTED_MODULE_7__.parseImageFiltering)(maybeFiltering) : undefined;\n const wrapX = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_8__.parseImageWrapping)(image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_6__.ImageSourceAttributeConstants.WrappingX));\n const wrapY = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_8__.parseImageWrapping)(image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_6__.ImageSourceAttributeConstants.WrappingY));\n const force = image.getAttribute('forceUpload') === 'true' ? true : false;\n const texture = this._context.textureLoader.load(image, {\n filtering,\n wrapping: { x: wrapX, y: wrapY }\n }, force);\n // remove force attribute after upload\n image.removeAttribute('forceUpload');\n if (this._textures.indexOf(texture) === -1) {\n this._textures.push(texture);\n this._textureToIndex.set(texture, this._textureIndex++);\n this._images.add(image);\n }\n }\n _bindTextures(gl) {\n // Bind textures in the correct order\n const max = Math.min(this._textureIndex, this._maxTextures);\n for (let i = 0; i < max; i++) {\n gl.activeTexture(gl.TEXTURE0 + i);\n gl.bindTexture(gl.TEXTURE_2D, this._textures[i] || this._textures[0]);\n }\n }\n _getTextureIdForImage(image) {\n var _a;\n if (image) {\n const maybeTexture = this._context.textureLoader.get(image);\n return (_a = this._textureToIndex.get(maybeTexture)) !== null && _a !== void 0 ? _a : -1; //this._textures.indexOf(maybeTexture);\n }\n return -1;\n }\n _isFull() {\n if (this._imageCount >= this._maxImages) {\n return true;\n }\n if (this._textures.length >= this._maxTextures) {\n return true;\n }\n return false;\n }\n _getImageWidth(image) {\n let maybeWidth = this._imageToWidth.get(image);\n if (maybeWidth === undefined) {\n maybeWidth = image.width;\n this._imageToWidth.set(image, maybeWidth);\n }\n return maybeWidth;\n }\n _getImageHeight(image) {\n let maybeHeight = this._imageToHeight.get(image);\n if (maybeHeight === undefined) {\n maybeHeight = image.height;\n this._imageToHeight.set(image, maybeHeight);\n }\n return maybeHeight;\n }\n draw(image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight) {\n var _a, _b, _c, _d;\n // Force a render if the batch is full\n if (this._isFull()) {\n this.flush();\n }\n this._imageCount++;\n // This creates and uploads the texture if not already done\n this._addImageAsTexture(image);\n const maybeImageWidth = this._getImageWidth(image);\n const maybeImageHeight = this._getImageHeight(image);\n let width = maybeImageWidth || swidth || 0;\n let height = maybeImageHeight || sheight || 0;\n this._view[0] = 0;\n this._view[1] = 0;\n this._view[2] = (_a = swidth !== null && swidth !== void 0 ? swidth : maybeImageWidth) !== null && _a !== void 0 ? _a : 0;\n this._view[3] = (_b = sheight !== null && sheight !== void 0 ? sheight : maybeImageHeight) !== null && _b !== void 0 ? _b : 0;\n this._dest[0] = sx !== null && sx !== void 0 ? sx : 1;\n this._dest[1] = sy !== null && sy !== void 0 ? sy : 1;\n // If destination is specified, update view and dest\n if (dx !== undefined && dy !== undefined && dwidth !== undefined && dheight !== undefined) {\n this._view[0] = sx !== null && sx !== void 0 ? sx : 1;\n this._view[1] = sy !== null && sy !== void 0 ? sy : 1;\n this._view[2] = (_c = swidth !== null && swidth !== void 0 ? swidth : maybeImageWidth) !== null && _c !== void 0 ? _c : 0;\n this._view[3] = (_d = sheight !== null && sheight !== void 0 ? sheight : maybeImageHeight) !== null && _d !== void 0 ? _d : 0;\n this._dest[0] = dx;\n this._dest[1] = dy;\n width = dwidth;\n height = dheight;\n }\n sx = this._view[0];\n sy = this._view[1];\n const sw = this._view[2];\n const sh = this._view[3];\n // transform based on current context\n const transform = this._context.getTransform();\n const opacity = this._context.opacity;\n const snapToPixel = this._context.snapToPixel;\n if (snapToPixel) {\n this._dest[0] = ~~(this._dest[0] + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_9__.pixelSnapEpsilon);\n this._dest[1] = ~~(this._dest[1] + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_9__.pixelSnapEpsilon);\n }\n const tint = this._context.tint || this._defaultTint;\n const textureId = this._getTextureIdForImage(image);\n const imageWidth = maybeImageWidth || width;\n const imageHeight = maybeImageHeight || height;\n const uvx0 = (sx + this.uvPadding) / imageWidth;\n const uvy0 = (sy + this.uvPadding) / imageHeight;\n const uvx1 = (sx + sw - this.uvPadding) / imageWidth;\n const uvy1 = (sy + sh - this.uvPadding) / imageHeight;\n const txWidth = maybeImageWidth;\n const txHeight = maybeImageHeight;\n // update data\n const vertexBuffer = this._transformData.bufferData;\n vertexBuffer[this._vertexIndex++] = this._dest[0];\n vertexBuffer[this._vertexIndex++] = this._dest[1];\n vertexBuffer[this._vertexIndex++] = transform.data[0];\n vertexBuffer[this._vertexIndex++] = transform.data[1];\n vertexBuffer[this._vertexIndex++] = transform.data[2];\n vertexBuffer[this._vertexIndex++] = transform.data[3];\n vertexBuffer[this._vertexIndex++] = transform.data[4];\n vertexBuffer[this._vertexIndex++] = transform.data[5];\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = width;\n vertexBuffer[this._vertexIndex++] = height;\n vertexBuffer[this._vertexIndex++] = txWidth;\n vertexBuffer[this._vertexIndex++] = txHeight;\n vertexBuffer[this._vertexIndex++] = textureId;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = tint.r / 255;\n vertexBuffer[this._vertexIndex++] = tint.g / 255;\n vertexBuffer[this._vertexIndex++] = tint.b / 255;\n vertexBuffer[this._vertexIndex++] = tint.a;\n }\n hasPendingDraws() {\n return this._imageCount !== 0;\n }\n flush() {\n // nothing to draw early exit\n if (this._imageCount === 0) {\n return;\n }\n const gl = this._gl;\n // Bind the shader\n this._shader.use();\n // Bind the memory layout and upload data\n this._bindData(gl);\n // Update ortho matrix uniform\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n // Turn on pixel art aa sampler\n this._shader.setUniformBoolean('u_pixelart', this.pixelArtSampler);\n // Bind textures to\n this._bindTextures(gl);\n // Draw all the quads\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 6, this._imageCount);\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_10__.GraphicsDiagnostics.DrawnImagesCount += this._imageCount;\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_10__.GraphicsDiagnostics.DrawCallCount++;\n gl.bindVertexArray(null);\n // Reset\n this._imageCount = 0;\n this._vertexIndex = 0;\n this._textures.length = 0;\n this._textureIndex = 0;\n this._textureToIndex.clear();\n this._images.clear();\n this._imageToWidth.clear();\n this._imageToHeight.clear();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/image-renderer/image-renderer.ts\":\n/*!***********************************************************!*\\\n !*** ./Graphics/Context/image-renderer/image-renderer.ts ***!\n \\***********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ImageRenderer: () => (/* binding */ ImageRenderer)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Color */ \"./Color.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n/* harmony import */ var _ImageSource__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../ImageSource */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../Wrapping */ \"./Graphics/Wrapping.ts\");\n/* harmony import */ var _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _quad_index_buffer__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../quad-index-buffer */ \"./Graphics/Context/quad-index-buffer.ts\");\n/* harmony import */ var _shader__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _vertex_buffer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _vertex_layout__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../vertex-layout */ \"./Graphics/Context/vertex-layout.ts\");\n/* harmony import */ var _webgl_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../webgl-util */ \"./Graphics/Context/webgl-util.ts\");\n/* harmony import */ var _image_renderer_frag_glsl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./image-renderer.frag.glsl */ \"./Graphics/Context/image-renderer/image-renderer.frag.glsl\");\n/* harmony import */ var _image_renderer_vert_glsl__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./image-renderer.vert.glsl */ \"./Graphics/Context/image-renderer/image-renderer.vert.glsl\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass ImageRenderer {\n constructor(options) {\n this.type = 'ex.image';\n this.priority = 0;\n this._maxImages = 10922; // max(uint16) / 6 verts\n this._maxTextures = 0;\n // Per flush vars\n this._imageCount = 0;\n this._textures = [];\n this._textureIndex = 0;\n this._textureToIndex = new Map();\n this._images = new Set();\n this._vertexIndex = 0;\n this._imageToWidth = new Map();\n this._imageToHeight = new Map();\n this._view = [0, 0, 0, 0];\n this._dest = [0, 0];\n this._quad = [0, 0, 0, 0, 0, 0, 0, 0];\n this._defaultTint = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.White;\n this.pixelArtSampler = options.pixelArtSampler;\n this.uvPadding = options.uvPadding;\n }\n initialize(gl, context) {\n this._gl = gl;\n this._context = context;\n // Transform shader source\n // FIXME: PIXEL 6 complains `ERROR: Expression too complex.` if we use it's reported max texture units, 125 seems to work for now...\n const maxTexture = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS);\n const maxComplexity = (0,_webgl_util__WEBPACK_IMPORTED_MODULE_1__.getMaxShaderComplexity)(gl, maxTexture);\n this._maxTextures = Math.min(maxTexture, maxComplexity);\n const transformedFrag = this._transformFragmentSource(_image_renderer_frag_glsl__WEBPACK_IMPORTED_MODULE_2__[\"default\"], this._maxTextures);\n // Compile shader\n this._shader = new _shader__WEBPACK_IMPORTED_MODULE_3__.Shader({\n gl,\n fragmentSource: transformedFrag,\n vertexSource: _image_renderer_vert_glsl__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n });\n this._shader.compile();\n // setup uniforms\n this._shader.use();\n this._shader.setUniformMatrix('u_matrix', context.ortho);\n // Initialize texture slots to [0, 1, 2, 3, 4, .... maxGPUTextures]\n this._shader.setUniformIntArray('u_textures', [...Array(this._maxTextures)].map((_, i) => i));\n // Setup memory layout\n this._buffer = new _vertex_buffer__WEBPACK_IMPORTED_MODULE_5__.VertexBuffer({\n gl,\n size: 12 * 4 * this._maxImages, // 12 components * 4 verts\n type: 'dynamic'\n });\n this._layout = new _vertex_layout__WEBPACK_IMPORTED_MODULE_6__.VertexLayout({\n gl,\n shader: this._shader,\n vertexBuffer: this._buffer,\n attributes: [\n ['a_position', 2],\n ['a_opacity', 1],\n ['a_res', 2],\n ['a_texcoord', 2],\n ['a_textureIndex', 1],\n ['a_tint', 4]\n ]\n });\n // Setup index buffer\n this._quads = new _quad_index_buffer__WEBPACK_IMPORTED_MODULE_7__.QuadIndexBuffer(gl, this._maxImages, true);\n }\n dispose() {\n this._buffer.dispose();\n this._quads.dispose();\n this._shader.dispose();\n this._textures.length = 0;\n this._context = null;\n this._gl = null;\n }\n _transformFragmentSource(source, maxTextures) {\n let newSource = source.replace('%%count%%', maxTextures.toString());\n let texturePickerBuilder = '';\n for (let i = 0; i < maxTextures; i++) {\n if (i === 0) {\n texturePickerBuilder += `if (v_textureIndex <= ${i}.5) {\\n`;\n }\n else {\n texturePickerBuilder += ` else if (v_textureIndex <= ${i}.5) {\\n`;\n }\n texturePickerBuilder += ` vec2 uv = u_pixelart ? uv_iq(v_texcoord, v_res) : v_texcoord;\\n`;\n texturePickerBuilder += ` color = texture(u_textures[${i}], uv);\\n`;\n texturePickerBuilder += ` }\\n`;\n }\n newSource = newSource.replace('%%texture_picker%%', texturePickerBuilder);\n return newSource;\n }\n _addImageAsTexture(image) {\n if (this._images.has(image)) {\n return;\n }\n const maybeFiltering = image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_8__.ImageSourceAttributeConstants.Filtering);\n const filtering = maybeFiltering ? (0,_Filtering__WEBPACK_IMPORTED_MODULE_9__.parseImageFiltering)(maybeFiltering) : undefined;\n const wrapX = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_10__.parseImageWrapping)(image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_8__.ImageSourceAttributeConstants.WrappingX));\n const wrapY = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_10__.parseImageWrapping)(image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_8__.ImageSourceAttributeConstants.WrappingY));\n const force = image.getAttribute('forceUpload') === 'true' ? true : false;\n const texture = this._context.textureLoader.load(image, {\n filtering,\n wrapping: { x: wrapX, y: wrapY }\n }, force);\n // remove force attribute after upload\n image.removeAttribute('forceUpload');\n if (this._textures.indexOf(texture) === -1) {\n this._textures.push(texture);\n this._textureToIndex.set(texture, this._textureIndex++);\n this._images.add(image);\n }\n }\n _bindTextures(gl) {\n // Bind textures in the correct order\n for (let i = 0; i < this._maxTextures; i++) {\n gl.activeTexture(gl.TEXTURE0 + i);\n gl.bindTexture(gl.TEXTURE_2D, this._textures[i] || this._textures[0]);\n }\n }\n _getTextureIdForImage(image) {\n var _a;\n if (image) {\n const maybeTexture = this._context.textureLoader.get(image);\n return (_a = this._textureToIndex.get(maybeTexture)) !== null && _a !== void 0 ? _a : -1; //this._textures.indexOf(maybeTexture);\n }\n return -1;\n }\n _isFull() {\n if (this._imageCount >= this._maxImages) {\n return true;\n }\n if (this._textures.length >= this._maxTextures) {\n return true;\n }\n return false;\n }\n _getImageWidth(image) {\n let maybeWidth = this._imageToWidth.get(image);\n if (maybeWidth === undefined) {\n maybeWidth = image.width;\n this._imageToWidth.set(image, maybeWidth);\n }\n return maybeWidth;\n }\n _getImageHeight(image) {\n let maybeHeight = this._imageToHeight.get(image);\n if (maybeHeight === undefined) {\n maybeHeight = image.height;\n this._imageToHeight.set(image, maybeHeight);\n }\n return maybeHeight;\n }\n draw(image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight) {\n var _a, _b, _c, _d;\n // Force a render if the batch is full\n if (this._isFull()) {\n this.flush();\n }\n this._imageCount++;\n // This creates and uploads the texture if not already done\n this._addImageAsTexture(image);\n const maybeImageWidth = this._getImageWidth(image);\n const maybeImageHeight = this._getImageHeight(image);\n let width = maybeImageWidth || swidth || 0;\n let height = maybeImageHeight || sheight || 0;\n this._view[0] = 0;\n this._view[1] = 0;\n this._view[2] = (_a = swidth !== null && swidth !== void 0 ? swidth : maybeImageWidth) !== null && _a !== void 0 ? _a : 0;\n this._view[3] = (_b = sheight !== null && sheight !== void 0 ? sheight : maybeImageHeight) !== null && _b !== void 0 ? _b : 0;\n this._dest[0] = sx !== null && sx !== void 0 ? sx : 1;\n this._dest[1] = sy !== null && sy !== void 0 ? sy : 1;\n // If destination is specified, update view and dest\n if (dx !== undefined && dy !== undefined && dwidth !== undefined && dheight !== undefined) {\n this._view[0] = sx !== null && sx !== void 0 ? sx : 1;\n this._view[1] = sy !== null && sy !== void 0 ? sy : 1;\n this._view[2] = (_c = swidth !== null && swidth !== void 0 ? swidth : maybeImageWidth) !== null && _c !== void 0 ? _c : 0;\n this._view[3] = (_d = sheight !== null && sheight !== void 0 ? sheight : maybeImageHeight) !== null && _d !== void 0 ? _d : 0;\n this._dest[0] = dx;\n this._dest[1] = dy;\n width = dwidth;\n height = dheight;\n }\n sx = this._view[0];\n sy = this._view[1];\n const sw = this._view[2];\n const sh = this._view[3];\n // transform based on current context\n const transform = this._context.getTransform();\n const opacity = this._context.opacity;\n const snapToPixel = this._context.snapToPixel;\n // top left\n this._quad[0] = this._dest[0];\n this._quad[1] = this._dest[1];\n // top right\n this._quad[2] = this._dest[0] + width;\n this._quad[3] = this._dest[1];\n // bottom left\n this._quad[4] = this._dest[0];\n this._quad[5] = this._dest[1] + height;\n // bottom right\n this._quad[6] = this._dest[0] + width;\n this._quad[7] = this._dest[1] + height;\n transform.multiplyQuadInPlace(this._quad);\n if (snapToPixel) {\n this._quad[0] = ~~(this._quad[0] + (0,_Math_util__WEBPACK_IMPORTED_MODULE_11__.sign)(this._quad[0]) * _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__.pixelSnapEpsilon);\n this._quad[1] = ~~(this._quad[1] + (0,_Math_util__WEBPACK_IMPORTED_MODULE_11__.sign)(this._quad[1]) * _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__.pixelSnapEpsilon);\n this._quad[2] = ~~(this._quad[2] + (0,_Math_util__WEBPACK_IMPORTED_MODULE_11__.sign)(this._quad[2]) * _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__.pixelSnapEpsilon);\n this._quad[3] = ~~(this._quad[3] + (0,_Math_util__WEBPACK_IMPORTED_MODULE_11__.sign)(this._quad[3]) * _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__.pixelSnapEpsilon);\n this._quad[4] = ~~(this._quad[4] + (0,_Math_util__WEBPACK_IMPORTED_MODULE_11__.sign)(this._quad[4]) * _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__.pixelSnapEpsilon);\n this._quad[5] = ~~(this._quad[5] + (0,_Math_util__WEBPACK_IMPORTED_MODULE_11__.sign)(this._quad[5]) * _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__.pixelSnapEpsilon);\n this._quad[6] = ~~(this._quad[6] + (0,_Math_util__WEBPACK_IMPORTED_MODULE_11__.sign)(this._quad[6]) * _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__.pixelSnapEpsilon);\n this._quad[7] = ~~(this._quad[7] + (0,_Math_util__WEBPACK_IMPORTED_MODULE_11__.sign)(this._quad[7]) * _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__.pixelSnapEpsilon);\n }\n const tint = this._context.tint || this._defaultTint;\n const textureId = this._getTextureIdForImage(image);\n const imageWidth = maybeImageWidth || width;\n const imageHeight = maybeImageHeight || height;\n const uvx0 = (sx + this.uvPadding) / imageWidth;\n const uvy0 = (sy + this.uvPadding) / imageHeight;\n const uvx1 = (sx + sw - this.uvPadding) / imageWidth;\n const uvy1 = (sy + sh - this.uvPadding) / imageHeight;\n const txWidth = maybeImageWidth;\n const txHeight = maybeImageHeight;\n // update data\n const vertexBuffer = this._layout.vertexBuffer.bufferData;\n // (0, 0) - 0\n vertexBuffer[this._vertexIndex++] = this._quad[0];\n vertexBuffer[this._vertexIndex++] = this._quad[1];\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = txWidth;\n vertexBuffer[this._vertexIndex++] = txHeight;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = textureId;\n vertexBuffer[this._vertexIndex++] = tint.r / 255;\n vertexBuffer[this._vertexIndex++] = tint.g / 255;\n vertexBuffer[this._vertexIndex++] = tint.b / 255;\n vertexBuffer[this._vertexIndex++] = tint.a;\n // (0, 1) - 1\n vertexBuffer[this._vertexIndex++] = this._quad[4];\n vertexBuffer[this._vertexIndex++] = this._quad[5];\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = txWidth;\n vertexBuffer[this._vertexIndex++] = txHeight;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = textureId;\n vertexBuffer[this._vertexIndex++] = tint.r / 255;\n vertexBuffer[this._vertexIndex++] = tint.g / 255;\n vertexBuffer[this._vertexIndex++] = tint.b / 255;\n vertexBuffer[this._vertexIndex++] = tint.a;\n // (1, 0) - 2\n vertexBuffer[this._vertexIndex++] = this._quad[2];\n vertexBuffer[this._vertexIndex++] = this._quad[3];\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = txWidth;\n vertexBuffer[this._vertexIndex++] = txHeight;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = textureId;\n vertexBuffer[this._vertexIndex++] = tint.r / 255;\n vertexBuffer[this._vertexIndex++] = tint.g / 255;\n vertexBuffer[this._vertexIndex++] = tint.b / 255;\n vertexBuffer[this._vertexIndex++] = tint.a;\n // (1, 1) - 3\n vertexBuffer[this._vertexIndex++] = this._quad[6];\n vertexBuffer[this._vertexIndex++] = this._quad[7];\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = txWidth;\n vertexBuffer[this._vertexIndex++] = txHeight;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = textureId;\n vertexBuffer[this._vertexIndex++] = tint.r / 255;\n vertexBuffer[this._vertexIndex++] = tint.g / 255;\n vertexBuffer[this._vertexIndex++] = tint.b / 255;\n vertexBuffer[this._vertexIndex++] = tint.a;\n }\n hasPendingDraws() {\n return this._imageCount !== 0;\n }\n flush() {\n // nothing to draw early exit\n if (this._imageCount === 0) {\n return;\n }\n const gl = this._gl;\n // Bind the shader\n this._shader.use();\n // Bind the memory layout and upload data\n this._layout.use(true, 4 * 12 * this._imageCount); // 4 verts * 12 components\n // Update ortho matrix uniform\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n // Turn on pixel art aa sampler\n this._shader.setUniformBoolean('u_pixelart', this.pixelArtSampler);\n // Bind textures to\n this._bindTextures(gl);\n // Bind index buffer\n this._quads.bind();\n // Draw all the quads\n gl.drawElements(gl.TRIANGLES, this._imageCount * 6, this._quads.bufferGlType, 0);\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_13__.GraphicsDiagnostics.DrawnImagesCount += this._imageCount;\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_13__.GraphicsDiagnostics.DrawCallCount++;\n // Reset\n this._imageCount = 0;\n this._vertexIndex = 0;\n this._textures.length = 0;\n this._textureIndex = 0;\n this._textureToIndex.clear();\n this._images.clear();\n this._imageToWidth.clear();\n this._imageToHeight.clear();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/line-renderer/line-renderer.ts\":\n/*!*********************************************************!*\\\n !*** ./Graphics/Context/line-renderer/line-renderer.ts ***!\n \\*********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ LineRenderer: () => (/* binding */ LineRenderer)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _line_vertex_glsl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./line-vertex.glsl */ \"./Graphics/Context/line-renderer/line-vertex.glsl\");\n/* harmony import */ var _line_fragment_glsl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./line-fragment.glsl */ \"./Graphics/Context/line-renderer/line-fragment.glsl\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../.. */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../.. */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../.. */ \"./Graphics/Context/vertex-layout.ts\");\n/* harmony import */ var _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n\n\n\n\n\nclass LineRenderer {\n constructor() {\n this.type = 'ex.line';\n this.priority = 0;\n this._maxLines = 10922;\n this._vertexIndex = 0;\n this._lineCount = 0;\n this._startScratch = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n this._endScratch = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n }\n initialize(gl, context) {\n this._gl = gl;\n this._context = context;\n this._shader = new ___WEBPACK_IMPORTED_MODULE_1__.Shader({\n gl,\n vertexSource: _line_vertex_glsl__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n fragmentSource: _line_fragment_glsl__WEBPACK_IMPORTED_MODULE_3__[\"default\"]\n });\n this._shader.compile();\n this._shader.use();\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n this._vertexBuffer = new ___WEBPACK_IMPORTED_MODULE_4__.VertexBuffer({\n gl,\n size: 6 * 2 * this._maxLines,\n type: 'dynamic'\n });\n this._layout = new ___WEBPACK_IMPORTED_MODULE_5__.VertexLayout({\n gl,\n vertexBuffer: this._vertexBuffer,\n shader: this._shader,\n attributes: [\n ['a_position', 2],\n ['a_color', 4]\n ]\n });\n }\n dispose() {\n this._vertexBuffer.dispose();\n this._shader.dispose();\n this._context = null;\n this._gl = null;\n }\n draw(start, end, color) {\n // Force a render if the batch is full\n if (this._isFull()) {\n this.flush();\n }\n this._lineCount++;\n const transform = this._context.getTransform();\n const finalStart = transform.multiply(start, this._startScratch);\n const finalEnd = transform.multiply(end, this._endScratch);\n const vertexBuffer = this._vertexBuffer.bufferData;\n // Start\n vertexBuffer[this._vertexIndex++] = finalStart.x;\n vertexBuffer[this._vertexIndex++] = finalStart.y;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n // End\n vertexBuffer[this._vertexIndex++] = finalEnd.x;\n vertexBuffer[this._vertexIndex++] = finalEnd.y;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n }\n _isFull() {\n if (this._lineCount >= this._maxLines) {\n return true;\n }\n return false;\n }\n hasPendingDraws() {\n return this._lineCount !== 0;\n }\n flush() {\n // nothing to draw early exit\n if (this._lineCount === 0) {\n return;\n }\n const gl = this._gl;\n this._shader.use();\n this._layout.use(true);\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n gl.drawArrays(gl.LINES, 0, this._lineCount * 2); // 2 verts per line\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_6__.GraphicsDiagnostics.DrawnImagesCount += this._lineCount;\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_6__.GraphicsDiagnostics.DrawCallCount++;\n // reset\n this._vertexIndex = 0;\n this._lineCount = 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/material-renderer/material-renderer.ts\":\n/*!*****************************************************************!*\\\n !*** ./Graphics/Context/material-renderer/material-renderer.ts ***!\n \\*****************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MaterialRenderer: () => (/* binding */ MaterialRenderer)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n/* harmony import */ var _ImageSource__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../ImageSource */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../Wrapping */ \"./Graphics/Wrapping.ts\");\n/* harmony import */ var _quad_index_buffer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../quad-index-buffer */ \"./Graphics/Context/quad-index-buffer.ts\");\n/* harmony import */ var _vertex_buffer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _vertex_layout__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../vertex-layout */ \"./Graphics/Context/vertex-layout.ts\");\n\n\n\n\n\n\n\n\nclass MaterialRenderer {\n constructor() {\n this.type = 'ex.material';\n this.priority = 0;\n this._textures = [];\n }\n initialize(gl, context) {\n this._gl = gl;\n this._context = context;\n // Setup memory layout\n this._buffer = new _vertex_buffer__WEBPACK_IMPORTED_MODULE_0__.VertexBuffer({\n gl,\n size: 6 * 4, // 6 components * 4 verts\n type: 'dynamic'\n });\n // Setup a vertex layout/buffer to the material\n this._layout = new _vertex_layout__WEBPACK_IMPORTED_MODULE_1__.VertexLayout({\n gl,\n vertexBuffer: this._buffer,\n attributes: [\n ['a_position', 2],\n ['a_uv', 2],\n ['a_screenuv', 2]\n ],\n suppressWarnings: true\n });\n // Setup index buffer\n this._quads = new _quad_index_buffer__WEBPACK_IMPORTED_MODULE_2__.QuadIndexBuffer(gl, 1, true);\n }\n dispose() {\n this._buffer.dispose();\n this._quads.dispose();\n this._textures.length = 0;\n this._context = null;\n this._gl = null;\n }\n draw(image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight) {\n var _a, _b, _c, _d;\n const gl = this._gl;\n // Extract context info\n const material = this._context.material;\n if (!material) {\n return;\n }\n const transform = this._context.getTransform();\n const opacity = this._context.opacity;\n // material shader\n const shader = material.getShader();\n // construct geometry, or hold on to it in the material?\n // geometry primitive for drawing rectangles?\n // update data\n const vertexBuffer = this._layout.vertexBuffer.bufferData;\n let vertexIndex = 0;\n let width = (image === null || image === void 0 ? void 0 : image.width) || swidth || 0;\n let height = (image === null || image === void 0 ? void 0 : image.height) || sheight || 0;\n let view = [0, 0, (_a = swidth !== null && swidth !== void 0 ? swidth : image === null || image === void 0 ? void 0 : image.width) !== null && _a !== void 0 ? _a : 0, (_b = sheight !== null && sheight !== void 0 ? sheight : image === null || image === void 0 ? void 0 : image.height) !== null && _b !== void 0 ? _b : 0];\n let dest = [sx !== null && sx !== void 0 ? sx : 1, sy !== null && sy !== void 0 ? sy : 1];\n // If destination is specified, update view and dest\n if (dx !== undefined && dy !== undefined && dwidth !== undefined && dheight !== undefined) {\n view = [sx !== null && sx !== void 0 ? sx : 1, sy !== null && sy !== void 0 ? sy : 1, (_c = swidth !== null && swidth !== void 0 ? swidth : image === null || image === void 0 ? void 0 : image.width) !== null && _c !== void 0 ? _c : 0, (_d = sheight !== null && sheight !== void 0 ? sheight : image === null || image === void 0 ? void 0 : image.height) !== null && _d !== void 0 ? _d : 0];\n dest = [dx, dy];\n width = dwidth;\n height = dheight;\n }\n sx = view[0];\n sy = view[1];\n const sw = view[2];\n const sh = view[3];\n const topLeft = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(dest[0], dest[1]);\n const topRight = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(dest[0] + width, dest[1]);\n const bottomLeft = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(dest[0], dest[1] + height);\n const bottomRight = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(dest[0] + width, dest[1] + height);\n const imageWidth = image.width || width;\n const imageHeight = image.height || height;\n const uvx0 = sx / imageWidth;\n const uvy0 = sy / imageHeight;\n const uvx1 = (sx + sw - 0.01) / imageWidth;\n const uvy1 = (sy + sh - 0.01) / imageHeight;\n const topLeftScreen = transform.getPosition();\n const bottomRightScreen = topLeftScreen.add(bottomRight);\n const screenUVX0 = topLeftScreen.x / this._context.width;\n const screenUVY0 = topLeftScreen.y / this._context.height;\n const screenUVX1 = bottomRightScreen.x / this._context.width;\n const screenUVY1 = bottomRightScreen.y / this._context.height;\n // (0, 0) - 0\n vertexBuffer[vertexIndex++] = topLeft.x;\n vertexBuffer[vertexIndex++] = topLeft.y;\n vertexBuffer[vertexIndex++] = uvx0;\n vertexBuffer[vertexIndex++] = uvy0;\n vertexBuffer[vertexIndex++] = screenUVX0;\n vertexBuffer[vertexIndex++] = screenUVY0;\n // (0, 1) - 1\n vertexBuffer[vertexIndex++] = bottomLeft.x;\n vertexBuffer[vertexIndex++] = bottomLeft.y;\n vertexBuffer[vertexIndex++] = uvx0;\n vertexBuffer[vertexIndex++] = uvy1;\n vertexBuffer[vertexIndex++] = screenUVX0;\n vertexBuffer[vertexIndex++] = screenUVY1;\n // (1, 0) - 2\n vertexBuffer[vertexIndex++] = topRight.x;\n vertexBuffer[vertexIndex++] = topRight.y;\n vertexBuffer[vertexIndex++] = uvx1;\n vertexBuffer[vertexIndex++] = uvy0;\n vertexBuffer[vertexIndex++] = screenUVX1;\n vertexBuffer[vertexIndex++] = screenUVY0;\n // (1, 1) - 3\n vertexBuffer[vertexIndex++] = bottomRight.x;\n vertexBuffer[vertexIndex++] = bottomRight.y;\n vertexBuffer[vertexIndex++] = uvx1;\n vertexBuffer[vertexIndex++] = uvy1;\n vertexBuffer[vertexIndex++] = screenUVX1;\n vertexBuffer[vertexIndex++] = screenUVY1;\n // This creates and uploads the texture if not already done\n const texture = this._addImageAsTexture(image);\n // apply material\n material.use();\n this._layout.shader = shader;\n // apply layout and geometry\n this._layout.use(true);\n // apply time in ms since the page (performance.now())\n shader.trySetUniformFloat('u_time_ms', performance.now());\n // apply opacity\n shader.trySetUniformFloat('u_opacity', opacity);\n // apply resolution\n shader.trySetUniformFloatVector('u_resolution', (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this._context.width, this._context.height));\n // apply graphic resolution\n shader.trySetUniformFloatVector('u_graphic_resolution', (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(imageWidth, imageHeight));\n // apply size\n shader.trySetUniformFloatVector('u_size', (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(sw, sh));\n // apply orthographic projection\n shader.trySetUniformMatrix('u_matrix', this._context.ortho);\n // apply geometry transform\n shader.trySetUniformMatrix('u_transform', transform.to4x4());\n // bind graphic image texture 'uniform sampler2D u_graphic;'\n gl.activeTexture(gl.TEXTURE0 + 0);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n shader.trySetUniformInt('u_graphic', 0);\n // bind the screen texture\n gl.activeTexture(gl.TEXTURE0 + 1);\n gl.bindTexture(gl.TEXTURE_2D, this._context.materialScreenTexture);\n shader.trySetUniformInt('u_screen_texture', 1);\n // bind any additional textures in the material\n material.uploadAndBind(gl);\n // bind quad index buffer\n this._quads.bind();\n // Draw a single quad\n gl.drawElements(gl.TRIANGLES, 6, this._quads.bufferGlType, 0);\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_4__.GraphicsDiagnostics.DrawnImagesCount++;\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_4__.GraphicsDiagnostics.DrawCallCount++;\n }\n _addImageAsTexture(image) {\n const maybeFiltering = image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_5__.ImageSourceAttributeConstants.Filtering);\n const filtering = maybeFiltering ? (0,_Filtering__WEBPACK_IMPORTED_MODULE_6__.parseImageFiltering)(maybeFiltering) : undefined;\n const wrapX = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_7__.parseImageWrapping)(image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_5__.ImageSourceAttributeConstants.WrappingX));\n const wrapY = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_7__.parseImageWrapping)(image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_5__.ImageSourceAttributeConstants.WrappingY));\n const force = image.getAttribute('forceUpload') === 'true' ? true : false;\n const texture = this._context.textureLoader.load(image, {\n filtering,\n wrapping: { x: wrapX, y: wrapY }\n }, force);\n // remove force attribute after upload\n image.removeAttribute('forceUpload');\n if (this._textures.indexOf(texture) === -1) {\n this._textures.push(texture);\n }\n return texture;\n }\n hasPendingDraws() {\n return false;\n }\n flush() {\n // flush does not do anything, material renderer renders immediately per draw\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/material.ts\":\n/*!**************************************!*\\\n !*** ./Graphics/Context/material.ts ***!\n \\**************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Material: () => (/* binding */ Material)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Color */ \"./Color.ts\");\n/* harmony import */ var _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _ImageSource__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ImageSource */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Wrapping */ \"./Graphics/Wrapping.ts\");\n\n\n\n\n\n\nconst defaultVertexSource = `#version 300 es\r\nin vec2 a_position;\r\n\r\nin vec2 a_uv;\r\nout vec2 v_uv;\r\n\r\nin vec2 a_screenuv;\r\nout vec2 v_screenuv;\r\n\r\nuniform mat4 u_matrix;\r\nuniform mat4 u_transform;\r\n\r\nvoid main() {\r\n // Set the vertex position using the ortho & transform matrix\r\n gl_Position = u_matrix * u_transform * vec4(a_position, 0.0, 1.0);\r\n\r\n // Pass through the UV coord to the fragment shader\r\n v_uv = a_uv;\r\n v_screenuv = a_screenuv;\r\n}\r\n`;\nclass Material {\n constructor(options) {\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance();\n this._color = _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Transparent;\n this._initialized = false;\n this._images = new Map();\n this._textures = new Map();\n const { color, name, vertexSource, fragmentSource, graphicsContext, images } = options;\n this._name = name !== null && name !== void 0 ? name : 'anonymous material';\n this._vertexSource = vertexSource !== null && vertexSource !== void 0 ? vertexSource : defaultVertexSource;\n this._fragmentSource = fragmentSource;\n this._color = color !== null && color !== void 0 ? color : this._color;\n if (!graphicsContext) {\n throw Error(`Material ${name} must be provided an excalibur webgl graphics context`);\n }\n if (graphicsContext instanceof _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_2__.ExcaliburGraphicsContextWebGL) {\n this._graphicsContext = graphicsContext;\n this._initialize(graphicsContext);\n }\n else {\n this._logger.warn(`Material ${name} was created in 2D Canvas mode, currently only WebGL is supported`);\n }\n if (images) {\n for (const key in images) {\n this.addImageSource(key, images[key]);\n }\n }\n }\n _initialize(graphicsContextWebGL) {\n if (this._initialized) {\n return;\n }\n const gl = graphicsContextWebGL.__gl;\n // max texture slots - 2 for the graphic texture and screen texture\n this._maxTextureSlots = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS) - 2;\n this._shader = graphicsContextWebGL.createShader({\n vertexSource: this._vertexSource,\n fragmentSource: this._fragmentSource\n });\n this._shader.compile();\n this._initialized = true;\n }\n get color() {\n return this._color;\n }\n set color(c) {\n this._color = c;\n }\n get name() {\n var _a;\n return (_a = this._name) !== null && _a !== void 0 ? _a : 'anonymous material';\n }\n get isUsingScreenTexture() {\n return this._fragmentSource.includes('u_screen_texture');\n }\n update(callback) {\n if (this._shader) {\n this._shader.use();\n callback(this._shader);\n }\n }\n getShader() {\n return this._shader;\n }\n addImageSource(textureUniformName, image) {\n if (this._images.size < this._maxTextureSlots) {\n this._images.set(textureUniformName, image);\n }\n else {\n this._logger.warn(`Max number texture slots ${this._maxTextureSlots} have been reached for material \"${this.name}\", ` +\n `no more textures will be uploaded due to hardware constraints.`);\n }\n }\n removeImageSource(textureName) {\n const image = this._images.get(textureName);\n this._graphicsContext.textureLoader.delete(image.image);\n this._images.delete(textureName);\n }\n _loadImageSource(image) {\n const imageElement = image.image;\n const maybeFiltering = imageElement.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_3__.ImageSourceAttributeConstants.Filtering);\n const filtering = maybeFiltering ? (0,_Filtering__WEBPACK_IMPORTED_MODULE_4__.parseImageFiltering)(maybeFiltering) : undefined;\n const wrapX = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_5__.parseImageWrapping)(imageElement.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_3__.ImageSourceAttributeConstants.WrappingX));\n const wrapY = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_5__.parseImageWrapping)(imageElement.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_3__.ImageSourceAttributeConstants.WrappingY));\n const force = imageElement.getAttribute('forceUpload') === 'true' ? true : false;\n const texture = this._graphicsContext.textureLoader.load(imageElement, {\n filtering,\n wrapping: { x: wrapX, y: wrapY }\n }, force);\n // remove force attribute after upload\n imageElement.removeAttribute('forceUpload');\n if (!this._textures.has(image)) {\n this._textures.set(image, texture);\n }\n return texture;\n }\n uploadAndBind(gl, startingTextureSlot = 2) {\n let textureSlot = startingTextureSlot;\n for (const [textureName, image] of this._images.entries()) {\n if (!image.isLoaded()) {\n this._logger.warnOnce(`Image named ${textureName} in material ${this.name} not loaded, nothing will be uploaded to the shader.` +\n ` Did you forget to add this to a loader? https://excaliburjs.com/docs/loaders/`);\n continue;\n } // skip unloaded images, maybe warn\n const texture = this._loadImageSource(image);\n gl.activeTexture(gl.TEXTURE0 + textureSlot);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n this._shader.trySetUniformInt(textureName, textureSlot);\n textureSlot++;\n }\n }\n use() {\n if (this._initialized) {\n // bind the shader\n this._shader.use();\n // Apply standard uniforms\n this._shader.trySetUniformFloatColor('u_color', this._color);\n }\n else {\n throw Error(`Material ${this.name} not yet initialized, use the ExcaliburGraphicsContext.createMaterial() to work around this.`);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/particle-renderer/particle-renderer.ts\":\n/*!*****************************************************************!*\\\n !*** ./Graphics/Context/particle-renderer/particle-renderer.ts ***!\n \\*****************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ParticleRenderer: () => (/* binding */ ParticleRenderer)\n/* harmony export */ });\n/* harmony import */ var _shader__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _particle_vertex_glsl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./particle-vertex.glsl */ \"./Graphics/Context/particle-renderer/particle-vertex.glsl\");\n/* harmony import */ var _particle_fragment_glsl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./particle-fragment.glsl */ \"./Graphics/Context/particle-renderer/particle-fragment.glsl\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../../Color */ \"./Color.ts\");\n/* harmony import */ var _ImageSource__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../ImageSource */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Wrapping */ \"./Graphics/Wrapping.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Particles_Particles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../Particles/Particles */ \"./Particles/Particles.ts\");\n\n\n\n\n\n\n\n\n\nclass ParticleRenderer {\n constructor() {\n this.type = 'ex.particle';\n this.priority = 0;\n }\n initialize(gl, context) {\n this._gl = gl;\n this._context = context;\n this._shader = new _shader__WEBPACK_IMPORTED_MODULE_0__.Shader({\n gl,\n vertexSource: _particle_vertex_glsl__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n fragmentSource: _particle_fragment_glsl__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n onPreLink: (program) => {\n gl.transformFeedbackVaryings(program, ['finalPosition', 'finalVelocity', 'finalRotation', 'finalAngularVelocity', 'finalLifeMs'], gl.INTERLEAVED_ATTRIBS);\n }\n });\n this._shader.compile();\n this._shader.use();\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n }\n _getTexture(image) {\n const maybeFiltering = image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_3__.ImageSourceAttributeConstants.Filtering);\n const filtering = maybeFiltering ? (0,_Filtering__WEBPACK_IMPORTED_MODULE_4__.parseImageFiltering)(maybeFiltering) : undefined;\n const wrapX = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_5__.parseImageWrapping)(image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_3__.ImageSourceAttributeConstants.WrappingX));\n const wrapY = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_5__.parseImageWrapping)(image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_3__.ImageSourceAttributeConstants.WrappingY));\n const force = image.getAttribute('forceUpload') === 'true' ? true : false;\n const texture = this._context.textureLoader.load(image, {\n filtering,\n wrapping: { x: wrapX, y: wrapY }\n }, force);\n // remove force attribute after upload\n image.removeAttribute('forceUpload');\n return texture;\n }\n draw(renderer, elapsed) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j;\n const gl = this._gl;\n this._shader.use();\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n const transform = renderer.particle.transform === _Particles_Particles__WEBPACK_IMPORTED_MODULE_6__.ParticleTransform.Local\n ? this._context.getTransform()\n : this._context.getTransform().multiply(renderer.emitter.transform.get().inverse);\n this._shader.setUniformAffineMatrix('u_transform', transform);\n this._shader.setUniformBoolean('fade', renderer.particle.fade ? true : false);\n this._shader.setUniformBoolean('useTexture', renderer.particle.graphic ? true : false);\n this._shader.setUniformFloat('maxLifeMs', (_a = renderer.particle.life) !== null && _a !== void 0 ? _a : 2000);\n this._shader.setUniformFloat('deltaMs', elapsed);\n this._shader.setUniformFloatVector('gravity', (_b = renderer.particle.acc) !== null && _b !== void 0 ? _b : (0,_Math_vector__WEBPACK_IMPORTED_MODULE_7__.vec)(0, 0));\n this._shader.setUniformFloatColor('beginColor', (_c = renderer.particle.beginColor) !== null && _c !== void 0 ? _c : _Color__WEBPACK_IMPORTED_MODULE_8__.Color.Transparent);\n this._shader.setUniformFloatColor('endColor', (_d = renderer.particle.endColor) !== null && _d !== void 0 ? _d : _Color__WEBPACK_IMPORTED_MODULE_8__.Color.Transparent);\n let startSize = (_e = renderer.particle.startSize) !== null && _e !== void 0 ? _e : 0;\n let endSize = (_f = renderer.particle.endSize) !== null && _f !== void 0 ? _f : 0;\n const size = (_g = renderer.particle.size) !== null && _g !== void 0 ? _g : 0;\n if (size > 0) {\n startSize = size;\n endSize = size;\n }\n this._shader.setUniformFloat('startSize', startSize !== null && startSize !== void 0 ? startSize : 10);\n this._shader.setUniformFloat('endSize', endSize !== null && endSize !== void 0 ? endSize : 10);\n this._shader.setUniformFloat('startOpacity', (_h = renderer.particle.opacity) !== null && _h !== void 0 ? _h : 1);\n if (renderer.particle.focus) {\n this._shader.setUniformFloatVector('focus', renderer.particle.focus);\n this._shader.setUniformFloat('focusAccel', (_j = renderer.particle.focusAccel) !== null && _j !== void 0 ? _j : 0);\n }\n // Particle Graphic (only Sprites right now)\n if (renderer.particle.graphic) {\n const graphic = renderer.particle.graphic;\n const texture = this._getTexture(graphic.image.image);\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n this._shader.setUniformInt('graphic', 0);\n }\n // Collision Mask\n // gl.activeTexture(gl.TEXTURE0 + 1);\n // gl.bindTexture(gl.TEXTURE_2D, obstacleTex);\n // gl.uniform1i(u_obstacle, 1);\n renderer.draw(gl);\n }\n hasPendingDraws() {\n return false;\n }\n flush() {\n // pass\n }\n dispose() {\n // pass\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/point-renderer/point-renderer.ts\":\n/*!***********************************************************!*\\\n !*** ./Graphics/Context/point-renderer/point-renderer.ts ***!\n \\***********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointRenderer: () => (/* binding */ PointRenderer)\n/* harmony export */ });\n/* harmony import */ var _point_vertex_glsl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./point-vertex.glsl */ \"./Graphics/Context/point-renderer/point-vertex.glsl\");\n/* harmony import */ var _point_fragment_glsl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./point-fragment.glsl */ \"./Graphics/Context/point-renderer/point-fragment.glsl\");\n/* harmony import */ var _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _shader__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _vertex_buffer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _vertex_layout__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../vertex-layout */ \"./Graphics/Context/vertex-layout.ts\");\n/* harmony import */ var _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n\n\n\n\n\n\n\nclass PointRenderer {\n constructor() {\n this.type = 'ex.point';\n this.priority = 0;\n this._maxPoints = 10922;\n this._pointCount = 0;\n this._vertexIndex = 0;\n }\n initialize(gl, context) {\n this._gl = gl;\n this._context = context;\n this._shader = new _shader__WEBPACK_IMPORTED_MODULE_0__.Shader({\n gl,\n vertexSource: _point_vertex_glsl__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n fragmentSource: _point_fragment_glsl__WEBPACK_IMPORTED_MODULE_2__[\"default\"]\n });\n this._shader.compile();\n this._shader.use();\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n this._buffer = new _vertex_buffer__WEBPACK_IMPORTED_MODULE_3__.VertexBuffer({\n gl,\n size: 7 * this._maxPoints,\n type: 'dynamic'\n });\n this._layout = new _vertex_layout__WEBPACK_IMPORTED_MODULE_4__.VertexLayout({\n gl,\n shader: this._shader,\n vertexBuffer: this._buffer,\n attributes: [\n ['a_position', 2],\n ['a_color', 4],\n ['a_size', 1]\n ]\n });\n }\n dispose() {\n this._buffer.dispose();\n this._shader.dispose();\n this._context = null;\n this._gl = null;\n }\n draw(point, color, size) {\n // Force a render if the batch is full\n if (this._isFull()) {\n this.flush();\n }\n this._pointCount++;\n const transform = this._context.getTransform();\n const opacity = this._context.opacity;\n const snapToPixel = this._context.snapToPixel;\n const finalPoint = transform.multiply(point);\n if (snapToPixel) {\n finalPoint.x = ~~(finalPoint.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_5__.pixelSnapEpsilon);\n finalPoint.y = ~~(finalPoint.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_5__.pixelSnapEpsilon);\n }\n const vertexBuffer = this._buffer.bufferData;\n vertexBuffer[this._vertexIndex++] = finalPoint.x;\n vertexBuffer[this._vertexIndex++] = finalPoint.y;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a * opacity;\n vertexBuffer[this._vertexIndex++] = size * Math.max(transform.getScaleX(), transform.getScaleY());\n }\n _isFull() {\n if (this._pointCount >= this._maxPoints) {\n return true;\n }\n return false;\n }\n hasPendingDraws() {\n return this._pointCount !== 0;\n }\n flush() {\n // nothing to draw early exit\n if (this._pointCount === 0) {\n return;\n }\n const gl = this._gl;\n this._shader.use();\n this._layout.use(true);\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n gl.drawArrays(gl.POINTS, 0, this._pointCount);\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_6__.GraphicsDiagnostics.DrawnImagesCount += this._pointCount;\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_6__.GraphicsDiagnostics.DrawCallCount++;\n this._pointCount = 0;\n this._vertexIndex = 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/quad-index-buffer.ts\":\n/*!***********************************************!*\\\n !*** ./Graphics/Context/quad-index-buffer.ts ***!\n \\***********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ QuadIndexBuffer: () => (/* binding */ QuadIndexBuffer)\n/* harmony export */ });\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../.. */ \"./Util/Log.ts\");\n\n/**\n * Helper that defines and index buffer for quad geometry\n *\n * Index buffers allow you to save space in vertex buffers when you share vertices in geometry\n * it is almost always worth it in terms of performance to use an index buffer.\n */\nclass QuadIndexBuffer {\n /**\n * @param gl WebGL2RenderingContext this layout will be attached to, these cannot be reused across contexts.\n * @param numberOfQuads Specify the max number of quads you want to draw\n * @param useUint16 Optionally force a uint16 buffer\n */\n constructor(gl, numberOfQuads, useUint16) {\n this._logger = ___WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance();\n this._gl = gl;\n this.buffer = gl.createBuffer();\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.buffer);\n const totalVertices = numberOfQuads * 6;\n if (!useUint16) {\n this.bufferData = new Uint32Array(totalVertices);\n }\n else {\n // fall back to using gl.UNSIGNED_SHORT or tell the user they are out of luck\n const maxUint16 = 65535;\n const maxUint16Index = Math.floor((maxUint16 - 1) / 4); // max quads\n this.bufferGlType = gl.UNSIGNED_SHORT;\n this.bufferData = new Uint16Array(totalVertices);\n // TODO Should we error if this happens?? maybe not might crash mid game\n if (numberOfQuads > maxUint16Index) {\n this._logger.warn(`Total quads exceeds hardware index buffer limit (uint16), max(${maxUint16Index}) requested quads(${numberOfQuads})`);\n }\n }\n let currentQuad = 0;\n for (let i = 0; i < totalVertices; i += 6) {\n // first triangle\n this.bufferData[i + 0] = currentQuad + 0;\n this.bufferData[i + 1] = currentQuad + 1;\n this.bufferData[i + 2] = currentQuad + 2;\n // second triangle\n this.bufferData[i + 3] = currentQuad + 2;\n this.bufferData[i + 4] = currentQuad + 1;\n this.bufferData[i + 5] = currentQuad + 3;\n currentQuad += 4;\n }\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.bufferData, gl.STATIC_DRAW);\n }\n get size() {\n return this.bufferData.length;\n }\n /**\n * Upload data to the GPU\n */\n upload() {\n const gl = this._gl;\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.buffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.bufferData, gl.STATIC_DRAW);\n }\n /**\n * Bind this index buffer\n */\n bind() {\n const gl = this._gl;\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.buffer);\n }\n dispose() {\n const gl = this._gl;\n gl.deleteBuffer(this.buffer);\n this._gl = null;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/rectangle-renderer/rectangle-renderer.ts\":\n/*!*******************************************************************!*\\\n !*** ./Graphics/Context/rectangle-renderer/rectangle-renderer.ts ***!\n \\*******************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RectangleRenderer: () => (/* binding */ RectangleRenderer)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Color */ \"./Color.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n/* harmony import */ var _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _quad_index_buffer__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../quad-index-buffer */ \"./Graphics/Context/quad-index-buffer.ts\");\n/* harmony import */ var _shader__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _vertex_buffer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _vertex_layout__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../vertex-layout */ \"./Graphics/Context/vertex-layout.ts\");\n/* harmony import */ var _rectangle_renderer_frag_glsl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./rectangle-renderer.frag.glsl */ \"./Graphics/Context/rectangle-renderer/rectangle-renderer.frag.glsl\");\n/* harmony import */ var _rectangle_renderer_vert_glsl__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./rectangle-renderer.vert.glsl */ \"./Graphics/Context/rectangle-renderer/rectangle-renderer.vert.glsl\");\n\n\n\n\n\n\n\n\n\n\nclass RectangleRenderer {\n constructor() {\n this.type = 'ex.rectangle';\n this.priority = 0;\n this._maxRectangles = 10922; // max(uint16) / 6 verts\n this._rectangleCount = 0;\n this._vertexIndex = 0;\n this._transparent = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Transparent;\n this._scratch1 = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0);\n this._scratch2 = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0);\n this._scratch3 = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0);\n this._scratch4 = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0);\n }\n initialize(gl, context) {\n this._gl = gl;\n this._context = context;\n // https://stackoverflow.com/questions/59197671/glsl-rounded-rectangle-with-variable-border\n this._shader = new _shader__WEBPACK_IMPORTED_MODULE_2__.Shader({\n gl,\n fragmentSource: _rectangle_renderer_frag_glsl__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n vertexSource: _rectangle_renderer_vert_glsl__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n });\n this._shader.compile();\n // setup uniforms\n this._shader.use();\n this._shader.setUniformMatrix('u_matrix', context.ortho);\n this._buffer = new _vertex_buffer__WEBPACK_IMPORTED_MODULE_5__.VertexBuffer({\n gl,\n size: 16 * 4 * this._maxRectangles,\n type: 'dynamic'\n });\n this._layout = new _vertex_layout__WEBPACK_IMPORTED_MODULE_6__.VertexLayout({\n gl,\n shader: this._shader,\n vertexBuffer: this._buffer,\n attributes: [\n ['a_position', 2],\n ['a_uv', 2],\n ['a_size', 2],\n ['a_opacity', 1],\n ['a_color', 4],\n ['a_strokeColor', 4],\n ['a_strokeThickness', 1]\n ]\n });\n this._quads = new _quad_index_buffer__WEBPACK_IMPORTED_MODULE_7__.QuadIndexBuffer(gl, this._maxRectangles, true);\n }\n dispose() {\n this._buffer.dispose();\n this._quads.dispose();\n this._shader.dispose();\n this._context = null;\n this._gl = null;\n }\n _isFull() {\n if (this._rectangleCount >= this._maxRectangles) {\n return true;\n }\n return false;\n }\n draw(...args) {\n if (args[0] instanceof _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector && args[1] instanceof _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector) {\n this.drawLine.apply(this, args);\n }\n else {\n this.drawRectangle.apply(this, args);\n }\n }\n drawLine(start, end, color, thickness = 1) {\n if (this._isFull()) {\n this.flush();\n }\n this._rectangleCount++;\n // transform based on current context\n const transform = this._context.getTransform();\n const opacity = this._context.opacity;\n const snapToPixel = this._context.snapToPixel;\n const dir = end.sub(start);\n const length = dir.magnitude;\n const normal = dir.normalize().perpendicular();\n const halfThick = thickness / 2;\n /**\n * +---------------------^----------------------+\n * | | (normal) |\n * (startX, startY)------------------>(endX, endY)\n * | |\n * + -------------------------------------------+\n */\n const startTop = transform.multiply(normal.scale(halfThick, this._scratch1).add(start, this._scratch1), this._scratch1);\n const startBottom = transform.multiply(normal.scale(-halfThick, this._scratch2).add(start, this._scratch2), this._scratch2);\n const endTop = transform.multiply(normal.scale(halfThick, this._scratch3).add(end, this._scratch3), this._scratch3);\n const endBottom = transform.multiply(normal.scale(-halfThick, this._scratch4).add(end, this._scratch4), this._scratch4);\n if (snapToPixel) {\n startTop.x = ~~(startTop.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n startTop.y = ~~(startTop.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n endTop.x = ~~(endTop.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n endTop.y = ~~(endTop.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n startBottom.x = ~~(startBottom.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n startBottom.y = ~~(startBottom.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n endBottom.x = ~~(endBottom.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n endBottom.y = ~~(endBottom.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n }\n // TODO uv could be static vertex buffer\n const uvx0 = 0;\n const uvy0 = 0;\n const uvx1 = 1;\n const uvy1 = 1;\n const stroke = this._transparent;\n const strokeThickness = 0;\n const width = 1;\n // update data\n const vertexBuffer = this._layout.vertexBuffer.bufferData;\n // (0, 0) - 0\n vertexBuffer[this._vertexIndex++] = startTop.x;\n vertexBuffer[this._vertexIndex++] = startTop.y;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = length;\n vertexBuffer[this._vertexIndex++] = thickness;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness / width;\n // (0, 1) - 1\n vertexBuffer[this._vertexIndex++] = startBottom.x;\n vertexBuffer[this._vertexIndex++] = startBottom.y;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = length;\n vertexBuffer[this._vertexIndex++] = thickness;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness / width;\n // (1, 0) - 2\n vertexBuffer[this._vertexIndex++] = endTop.x;\n vertexBuffer[this._vertexIndex++] = endTop.y;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = length;\n vertexBuffer[this._vertexIndex++] = thickness;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness / width;\n // (1, 1) - 3\n vertexBuffer[this._vertexIndex++] = endBottom.x;\n vertexBuffer[this._vertexIndex++] = endBottom.y;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = length;\n vertexBuffer[this._vertexIndex++] = thickness;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness / width;\n }\n drawRectangle(pos, width, height, color, stroke = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Transparent, strokeThickness = 0) {\n if (this._isFull()) {\n this.flush();\n }\n this._rectangleCount++;\n // transform based on current context\n const transform = this._context.getTransform();\n const opacity = this._context.opacity;\n const snapToPixel = this._context.snapToPixel;\n const topLeft = transform.multiply(pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0)));\n const topRight = transform.multiply(pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(width, 0)));\n const bottomRight = transform.multiply(pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(width, height)));\n const bottomLeft = transform.multiply(pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, height)));\n if (snapToPixel) {\n topLeft.x = ~~(topLeft.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n topLeft.y = ~~(topLeft.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n topRight.x = ~~(topRight.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n topRight.y = ~~(topRight.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n bottomLeft.x = ~~(bottomLeft.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n bottomLeft.y = ~~(bottomLeft.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n bottomRight.x = ~~(bottomRight.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n bottomRight.y = ~~(bottomRight.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n }\n // TODO uv could be static vertex buffer\n const uvx0 = 0;\n const uvy0 = 0;\n const uvx1 = 1;\n const uvy1 = 1;\n // update data\n const vertexBuffer = this._layout.vertexBuffer.bufferData;\n // (0, 0) - 0\n vertexBuffer[this._vertexIndex++] = topLeft.x;\n vertexBuffer[this._vertexIndex++] = topLeft.y;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = width;\n vertexBuffer[this._vertexIndex++] = height;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness;\n // (0, 1) - 1\n vertexBuffer[this._vertexIndex++] = bottomLeft.x;\n vertexBuffer[this._vertexIndex++] = bottomLeft.y;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = width;\n vertexBuffer[this._vertexIndex++] = height;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness;\n // (1, 0) - 2\n vertexBuffer[this._vertexIndex++] = topRight.x;\n vertexBuffer[this._vertexIndex++] = topRight.y;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = width;\n vertexBuffer[this._vertexIndex++] = height;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness;\n // (1, 1) - 3\n vertexBuffer[this._vertexIndex++] = bottomRight.x;\n vertexBuffer[this._vertexIndex++] = bottomRight.y;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = width;\n vertexBuffer[this._vertexIndex++] = height;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness;\n }\n hasPendingDraws() {\n return this._rectangleCount !== 0;\n }\n flush() {\n // nothing to draw early exit\n if (this._rectangleCount === 0) {\n return;\n }\n const gl = this._gl;\n // Bind the shader\n this._shader.use();\n // Bind the memory layout and upload data\n this._layout.use(true);\n // Update ortho matrix uniform\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n // Bind index buffer\n this._quads.bind();\n // Draw all the quads\n gl.drawElements(gl.TRIANGLES, this._rectangleCount * 6, this._quads.bufferGlType, 0);\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_9__.GraphicsDiagnostics.DrawnImagesCount += this._rectangleCount;\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_9__.GraphicsDiagnostics.DrawCallCount++;\n // Reset\n this._rectangleCount = 0;\n this._vertexIndex = 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/render-source.ts\":\n/*!*******************************************!*\\\n !*** ./Graphics/Context/render-source.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RenderSource: () => (/* binding */ RenderSource)\n/* harmony export */ });\nclass RenderSource {\n constructor(_gl, _texture) {\n this._gl = _gl;\n this._texture = _texture;\n }\n use() {\n const gl = this._gl;\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, this._texture);\n }\n disable() {\n const gl = this._gl;\n gl.bindTexture(gl.TEXTURE_2D, null);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/render-target.ts\":\n/*!*******************************************!*\\\n !*** ./Graphics/Context/render-target.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RenderTarget: () => (/* binding */ RenderTarget)\n/* harmony export */ });\n/* harmony import */ var _render_source__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./render-source */ \"./Graphics/Context/render-source.ts\");\n\nclass RenderTarget {\n constructor(options) {\n var _a, _b;\n this.antialias = false;\n this.samples = 1;\n this._gl = options.gl;\n this.width = options.width;\n this.height = options.height;\n this.transparency = options.transparency;\n this.antialias = (_a = options.antialias) !== null && _a !== void 0 ? _a : this.antialias;\n this.samples = (_b = options.samples) !== null && _b !== void 0 ? _b : this._gl.getParameter(this._gl.MAX_SAMPLES);\n const gl = this._gl;\n // Determine current context format for blitting later needs to match\n if (gl.drawingBufferFormat) {\n this.bufferFormat = gl.drawingBufferFormat;\n }\n else {\n // Documented in webgl spec\n // https://registry.khronos.org/webgl/specs/latest/1.0/\n if (this.transparency) {\n this.bufferFormat = gl.RGBA8;\n }\n else {\n this.bufferFormat = gl.RGB8;\n }\n }\n this._setupRenderBuffer();\n this._setupFramebuffer();\n }\n setResolution(width, height) {\n const gl = this._gl;\n this.width = width;\n this.height = height;\n // update backing texture size\n gl.bindTexture(gl.TEXTURE_2D, this._frameTexture);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n // update render buffer size\n if (this._renderBuffer) {\n gl.bindRenderbuffer(gl.RENDERBUFFER, this._renderBuffer);\n gl.renderbufferStorageMultisample(gl.RENDERBUFFER, Math.min(this.samples, gl.getParameter(gl.MAX_SAMPLES)), this.bufferFormat, this.width, this.height);\n }\n }\n get renderBuffer() {\n return this._renderBuffer;\n }\n get renderFrameBuffer() {\n return this._renderFrameBuffer;\n }\n get frameBuffer() {\n return this._frameBuffer;\n }\n get frameTexture() {\n return this._frameTexture;\n }\n _setupRenderBuffer() {\n if (this.antialias) {\n const gl = this._gl;\n // Render buffers can be used as an input to a shader\n this._renderBuffer = gl.createRenderbuffer();\n this._renderFrameBuffer = gl.createFramebuffer();\n gl.bindRenderbuffer(gl.RENDERBUFFER, this._renderBuffer);\n gl.renderbufferStorageMultisample(gl.RENDERBUFFER, Math.min(this.samples, gl.getParameter(gl.MAX_SAMPLES)), this.bufferFormat, this.width, this.height);\n gl.bindFramebuffer(gl.FRAMEBUFFER, this._renderFrameBuffer);\n gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, this._renderBuffer);\n }\n }\n _setupFramebuffer() {\n // Allocates frame buffer\n const gl = this._gl;\n this._frameTexture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, this._frameTexture);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n // set the filtering so we don't need mips\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n // attach the texture as the first color attachment\n const attachmentPoint = gl.COLOR_ATTACHMENT0;\n // After this bind all draw calls will draw to this framebuffer texture\n this._frameBuffer = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, this._frameBuffer);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, attachmentPoint, gl.TEXTURE_2D, this._frameTexture, 0);\n // Reset after initialized\n this.disable();\n }\n toRenderSource() {\n if (this.renderBuffer) {\n this.blitRenderBufferToFrameBuffer();\n }\n const source = new _render_source__WEBPACK_IMPORTED_MODULE_0__.RenderSource(this._gl, this._frameTexture);\n return source;\n }\n blitToScreen() {\n const gl = this._gl;\n // set to size of canvas's drawingBuffer\n if (this._renderBuffer) {\n gl.bindFramebuffer(gl.READ_FRAMEBUFFER, this.renderFrameBuffer);\n gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, null);\n gl.clearBufferfv(gl.COLOR, 0, [0.0, 0.0, 1.0, 1.0]);\n gl.blitFramebuffer(0, 0, this.width, this.height, 0, 0, this.width, this.height, gl.COLOR_BUFFER_BIT, gl.LINEAR);\n }\n else {\n gl.bindFramebuffer(gl.READ_FRAMEBUFFER, this.frameBuffer);\n gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, null);\n gl.clearBufferfv(gl.COLOR, 0, [0.0, 0.0, 1.0, 1.0]);\n gl.blitFramebuffer(0, 0, this.width, this.height, 0, 0, this.width, this.height, gl.COLOR_BUFFER_BIT, gl.LINEAR);\n }\n }\n blitRenderBufferToFrameBuffer() {\n if (this._renderBuffer) {\n const gl = this._gl;\n gl.bindFramebuffer(gl.READ_FRAMEBUFFER, this.renderFrameBuffer);\n gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, this.frameBuffer);\n gl.clearBufferfv(gl.COLOR, 0, [0.0, 0.0, 1.0, 1.0]);\n gl.blitFramebuffer(0, 0, this.width, this.height, 0, 0, this.width, this.height, gl.COLOR_BUFFER_BIT, gl.LINEAR);\n }\n }\n copyToTexture(texture) {\n const gl = this._gl;\n if (this._renderBuffer) {\n this.blitRenderBufferToFrameBuffer();\n }\n gl.bindFramebuffer(gl.FRAMEBUFFER, this._frameBuffer);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.copyTexImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 0, 0, this.width, this.height, 0);\n }\n /**\n * When called, all drawing gets redirected to this render target\n */\n use() {\n const gl = this._gl;\n if (this.antialias) {\n gl.bindFramebuffer(gl.FRAMEBUFFER, this._renderFrameBuffer);\n }\n else {\n gl.bindFramebuffer(gl.FRAMEBUFFER, this._frameBuffer);\n }\n // very important to set the viewport to the size of the framebuffer texture\n gl.viewport(0, 0, this.width, this.height);\n }\n /**\n * When called, all drawing is sent back to the canvas\n */\n disable() {\n const gl = this._gl;\n // passing null switches rendering back to the canvas\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.bindTexture(gl.TEXTURE_2D, null);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/screen-pass-painter/screen-pass-painter.ts\":\n/*!*********************************************************************!*\\\n !*** ./Graphics/Context/screen-pass-painter/screen-pass-painter.ts ***!\n \\*********************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ScreenPassPainter: () => (/* binding */ ScreenPassPainter)\n/* harmony export */ });\n/* harmony import */ var _screen_vertex_glsl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./screen-vertex.glsl */ \"./Graphics/Context/screen-pass-painter/screen-vertex.glsl\");\n/* harmony import */ var _screen_fragment_glsl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./screen-fragment.glsl */ \"./Graphics/Context/screen-pass-painter/screen-fragment.glsl\");\n/* harmony import */ var _shader__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _vertex_buffer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _vertex_layout__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../vertex-layout */ \"./Graphics/Context/vertex-layout.ts\");\n\n\n\n\n\n/**\n * This is responsible for painting the entire screen during the render passes\n */\nclass ScreenPassPainter {\n constructor(gl) {\n this._gl = gl;\n this._shader = new _shader__WEBPACK_IMPORTED_MODULE_0__.Shader({\n gl,\n vertexSource: _screen_vertex_glsl__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n fragmentSource: _screen_fragment_glsl__WEBPACK_IMPORTED_MODULE_2__[\"default\"]\n });\n this._shader.compile();\n // Setup memory layout\n this._buffer = new _vertex_buffer__WEBPACK_IMPORTED_MODULE_3__.VertexBuffer({\n gl,\n type: 'static',\n // clip space quad + uv since we don't need a camera\n data: new Float32Array([\n -1, -1, 0, 0, -1, 1, 0, 1, 1, -1, 1, 0,\n 1, -1, 1, 0, -1, 1, 0, 1, 1, 1, 1, 1\n ])\n });\n this._layout = new _vertex_layout__WEBPACK_IMPORTED_MODULE_4__.VertexLayout({\n gl,\n shader: this._shader,\n vertexBuffer: this._buffer,\n attributes: [\n ['a_position', 2],\n ['a_texcoord', 2]\n ]\n });\n this._buffer.upload();\n }\n renderWithPostProcessor(postprocessor) {\n const gl = this._gl;\n postprocessor.getShader().use();\n postprocessor.getLayout().use();\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n }\n renderToScreen() {\n const gl = this._gl;\n this._shader.use();\n this._layout.use();\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/shader.ts\":\n/*!************************************!*\\\n !*** ./Graphics/Context/shader.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Shader: () => (/* binding */ Shader)\n/* harmony export */ });\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../.. */ \"./Util/Log.ts\");\n/* harmony import */ var _webgl_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./webgl-util */ \"./Graphics/Context/webgl-util.ts\");\n\n\nclass Shader {\n get compiled() {\n return this._compiled;\n }\n /**\n * Create a shader program in excalibur\n * @param options specify shader vertex and fragment source\n */\n constructor(options) {\n this._logger = ___WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance();\n this.uniforms = {};\n this.attributes = {};\n this._compiled = false;\n const { gl, vertexSource, fragmentSource, onPreLink, onPostCompile } = options;\n this._gl = gl;\n this.vertexSource = vertexSource;\n this.fragmentSource = fragmentSource;\n this._onPreLink = onPreLink;\n this._onPostCompile = onPostCompile;\n }\n dispose() {\n const gl = this._gl;\n gl.deleteProgram(this.program);\n this._gl = null;\n }\n /**\n * Binds the shader program\n */\n use() {\n const gl = this._gl;\n gl.useProgram(this.program);\n Shader._ACTIVE_SHADER_INSTANCE = this;\n }\n isCurrentlyBound() {\n return Shader._ACTIVE_SHADER_INSTANCE === this;\n }\n /**\n * Compile the current shader against a webgl context\n */\n compile() {\n const gl = this._gl;\n const vertexShader = this._compileShader(gl, this.vertexSource, gl.VERTEX_SHADER);\n const fragmentShader = this._compileShader(gl, this.fragmentSource, gl.FRAGMENT_SHADER);\n this.program = this._createProgram(gl, vertexShader, fragmentShader);\n const attributes = this.getAttributes();\n for (const attribute of attributes) {\n this.attributes[attribute.name] = attribute;\n }\n const uniforms = this.getUniforms();\n for (const uniform of uniforms) {\n this.uniforms[uniform.name] = uniform;\n }\n this._compiled = true;\n if (this._onPostCompile) {\n this._onPostCompile(this);\n }\n return this.program;\n }\n getUniforms() {\n const gl = this._gl;\n const uniformCount = gl.getProgramParameter(this.program, gl.ACTIVE_UNIFORMS);\n const uniforms = [];\n for (let i = 0; i < uniformCount; i++) {\n const uniform = gl.getActiveUniform(this.program, i);\n const uniformLocation = gl.getUniformLocation(this.program, uniform.name);\n uniforms.push({\n name: uniform.name,\n glType: uniform.type,\n location: uniformLocation\n });\n }\n return uniforms;\n }\n getAttributes() {\n const gl = this._gl;\n const attributeCount = gl.getProgramParameter(this.program, gl.ACTIVE_ATTRIBUTES);\n const attributes = [];\n for (let i = 0; i < attributeCount; i++) {\n const attribute = gl.getActiveAttrib(this.program, i);\n const attributeLocation = gl.getAttribLocation(this.program, attribute.name);\n attributes.push({\n name: attribute.name,\n glType: (0,_webgl_util__WEBPACK_IMPORTED_MODULE_1__.getAttributePointerType)(gl, attribute.type),\n size: (0,_webgl_util__WEBPACK_IMPORTED_MODULE_1__.getAttributeComponentSize)(gl, attribute.type),\n location: attributeLocation,\n normalized: false\n });\n }\n return attributes;\n }\n /**\n * Set a texture in a gpu texture slot\n * @param slotNumber\n * @param texture\n */\n setTexture(slotNumber, texture) {\n const gl = this._gl;\n gl.activeTexture(gl.TEXTURE0 + slotNumber);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n }\n /**\n * Set an integer uniform for the current shader\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n setUniformInt(name, value) {\n this.setUniform('uniform1i', name, ~~value);\n }\n /**\n * Set an integer uniform for the current shader, WILL NOT THROW on error.\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n trySetUniformInt(name, value) {\n return this.trySetUniform('uniform1i', name, ~~value);\n }\n /**\n * Set an integer array uniform for the current shader\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n setUniformIntArray(name, value) {\n this.setUniform('uniform1iv', name, value);\n }\n /**\n * Set an integer array uniform for the current shader, WILL NOT THROW on error.\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n trySetUniformIntArray(name, value) {\n return this.trySetUniform('uniform1iv', name, value);\n }\n /**\n * Set a boolean uniform for the current shader\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n setUniformBoolean(name, value) {\n this.setUniform('uniform1i', name, value ? 1 : 0);\n }\n /**\n * Set a boolean uniform for the current shader, WILL NOT THROW on error.\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n trySetUniformBoolean(name, value) {\n return this.trySetUniform('uniform1i', name, value ? 1 : 0);\n }\n /**\n * Set a float uniform for the current shader\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n setUniformFloat(name, value) {\n this.setUniform('uniform1f', name, value);\n }\n /**\n * Set a float uniform for the current shader, WILL NOT THROW on error.\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n trySetUniformFloat(name, value) {\n return this.trySetUniform('uniform1f', name, value);\n }\n /**\n * Set a float array uniform for the current shader\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n setUniformFloatArray(name, value) {\n this.setUniform('uniform1fv', name, value);\n }\n /**\n * Set a float array uniform for the current shader, WILL NOT THROW on error.\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n trySetUniformFloatArray(name, value) {\n return this.trySetUniform('uniform1fv', name, value);\n }\n /**\n * Set a {@apilink Vector} uniform for the current shader\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n setUniformFloatVector(name, value) {\n this.setUniform('uniform2f', name, value.x, value.y);\n }\n /**\n * Set a {@apilink Vector} uniform for the current shader, WILL NOT THROW on error.\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n trySetUniformFloatVector(name, value) {\n return this.trySetUniform('uniform2f', name, value.x, value.y);\n }\n /**\n * Set a {@apilink Color} uniform for the current shader\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n setUniformFloatColor(name, value) {\n this.setUniform('uniform4f', name, value.r / 255, value.g / 255, value.b / 255, value.a);\n }\n /**\n * Set a {@apilink Color} uniform for the current shader, WILL NOT THROW on error.\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n trySetUniformFloatColor(name, value) {\n return this.trySetUniform('uniform4f', name, value.r / 255, value.g / 255, value.b / 255, value.a);\n }\n /**\n * Set an {@apilink Matrix} uniform for the current shader\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n setUniformMatrix(name, value) {\n this.setUniform('uniformMatrix4fv', name, false, value.data);\n }\n setUniformAffineMatrix(name, value) {\n this.setUniform('uniformMatrix4fv', name, false, [\n value.data[0],\n value.data[1],\n 0,\n 0,\n value.data[2],\n value.data[3],\n 0,\n 0,\n 0,\n 0,\n 1,\n 0,\n value.data[4],\n value.data[5],\n 0,\n 1\n ]);\n }\n /**\n * Set an {@apilink Matrix} uniform for the current shader, WILL NOT THROW on error.\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n trySetUniformMatrix(name, value) {\n return this.trySetUniform('uniformMatrix4fv', name, false, value.data);\n }\n /**\n * Set any available uniform type in webgl\n *\n * For example setUniform('uniformMatrix2fv', 'u_my2x2_mat`, ...);\n */\n setUniform(uniformType, name, ...value) {\n if (!this._compiled) {\n throw Error(`Must compile shader before setting a uniform ${uniformType}:${name}`);\n }\n if (!this.isCurrentlyBound()) {\n throw Error('Currently accessed shader instance is not the current active shader in WebGL,' +\n ' must call `shader.use()` before setting uniforms');\n }\n const gl = this._gl;\n const location = gl.getUniformLocation(this.program, name);\n if (location) {\n const args = [location, ...value];\n this._gl[uniformType].apply(this._gl, args);\n }\n else {\n throw Error(`Uniform ${uniformType}:${name} doesn\\'t exist or is not used in the shader source code,` +\n ' unused uniforms are optimized away by most browsers');\n }\n }\n /**\n * Set any available uniform type in webgl. Will try to set the uniform, will return false if the uniform didn't exist,\n * true if it was set.\n *\n * WILL NOT THROW on error\n *\n * For example setUniform('uniformMatrix2fv', 'u_my2x2_mat`, ...);\n *\n */\n trySetUniform(uniformType, name, ...value) {\n if (!this._compiled) {\n this._logger.warn(`Must compile shader before setting a uniform ${uniformType}:${name}`);\n return false;\n }\n if (!this.isCurrentlyBound()) {\n this._logger.warn('Currently accessed shader instance is not the current active shader in WebGL,' +\n ' must call `shader.use()` before setting uniforms');\n return false;\n }\n const gl = this._gl;\n const location = gl.getUniformLocation(this.program, name);\n if (location) {\n const args = [location, ...value];\n this._gl[uniformType].apply(this._gl, args);\n }\n else {\n return false;\n }\n return true;\n }\n _createProgram(gl, vertexShader, fragmentShader) {\n const program = gl.createProgram();\n if (program === null) {\n throw Error('Could not create graphics shader program');\n }\n // attach the shaders.\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n if (this._onPreLink) {\n this._onPreLink(program);\n }\n // link the program.\n gl.linkProgram(program);\n const success = gl.getProgramParameter(program, gl.LINK_STATUS);\n if (!success) {\n throw Error(`Could not link the program: [${gl.getProgramInfoLog(program)}]`);\n }\n return program;\n }\n _compileShader(gl, source, type) {\n const typeName = gl.VERTEX_SHADER === type ? 'vertex' : 'fragment';\n const shader = gl.createShader(type);\n if (shader === null) {\n throw Error(`Could not build shader: [${source}]`);\n }\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n const success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n if (!success) {\n const errorInfo = gl.getShaderInfoLog(shader);\n throw Error(`Could not compile ${typeName} shader:\\n\\n${errorInfo}${this._processSourceForError(source, errorInfo)}`);\n }\n return shader;\n }\n _processSourceForError(source, errorInfo) {\n if (!source) {\n return errorInfo;\n }\n const lines = source.split('\\n');\n const errorLineStart = errorInfo.search(/\\d:\\d/);\n const errorLineEnd = errorInfo.indexOf(' ', errorLineStart);\n const [_, error2] = errorInfo\n .slice(errorLineStart, errorLineEnd)\n .split(':')\n .map((v) => Number(v));\n for (let i = 0; i < lines.length; i++) {\n lines[i] = `${i + 1}: ${lines[i]}${error2 === i + 1 ? ' <----- ERROR!' : ''}`;\n }\n return '\\n\\nSource:\\n' + lines.join('\\n');\n }\n}\nShader._ACTIVE_SHADER_INSTANCE = null;\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/state-stack.ts\":\n/*!*****************************************!*\\\n !*** ./Graphics/Context/state-stack.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ContextState: () => (/* binding */ ContextState),\n/* harmony export */ StateStack: () => (/* binding */ StateStack)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Color */ \"./Color.ts\");\n/* harmony import */ var _Util_RentalPool__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Util/RentalPool */ \"./Util/RentalPool.ts\");\n\n\nclass ContextState {\n constructor() {\n this.opacity = 1;\n this.z = 0;\n this.tint = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.White;\n this.material = null;\n }\n}\nclass StateStack {\n constructor() {\n this._pool = new _Util_RentalPool__WEBPACK_IMPORTED_MODULE_1__.RentalPool(() => new ContextState(), (s) => {\n s.opacity = 1;\n s.z = 0;\n s.tint = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.White;\n s.material = null;\n return s;\n }, 100);\n this.current = this._pool.rent(true);\n this._states = [];\n }\n _cloneState(dest) {\n var _a;\n dest.opacity = this.current.opacity;\n dest.z = this.current.z;\n dest.tint = (_a = this.current.tint) === null || _a === void 0 ? void 0 : _a.clone();\n dest.material = this.current.material; // TODO is this going to cause problems when cloning\n return dest;\n }\n save() {\n this._states.push(this.current);\n this.current = this._cloneState(this._pool.rent());\n }\n restore() {\n this._pool.return(this.current);\n this.current = this._states.pop();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/texture-loader.ts\":\n/*!********************************************!*\\\n !*** ./Graphics/Context/texture-loader.ts ***!\n \\********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TextureLoader: () => (/* binding */ TextureLoader)\n/* harmony export */ });\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Wrapping */ \"./Graphics/Wrapping.ts\");\n\n\n\n/**\n * Manages loading image sources into webgl textures, a unique id is associated with all sources\n */\nclass TextureLoader {\n constructor(gl, _garbageCollector) {\n var _a;\n this._garbageCollector = _garbageCollector;\n this._textureMap = new Map();\n /**\n * Looks for textures that haven't been drawn in a while\n */\n this._collect = (image) => {\n var _a;\n if (this._gl) {\n const name = (_a = image.dataset.originalSrc) !== null && _a !== void 0 ? _a : image.constructor.name;\n TextureLoader._LOGGER.debug(`WebGL Texture for ${name} collected`);\n this.delete(image);\n return true;\n }\n return false;\n };\n this._gl = gl;\n TextureLoader._MAX_TEXTURE_SIZE = gl.getParameter(gl.MAX_TEXTURE_SIZE);\n if (this._garbageCollector) {\n TextureLoader._LOGGER.debug('WebGL Texture collection interval:', this._garbageCollector.collectionInterval);\n (_a = this._garbageCollector.garbageCollector) === null || _a === void 0 ? void 0 : _a.registerCollector('texture', this._garbageCollector.collectionInterval, this._collect);\n }\n }\n dispose() {\n for (const [image] of this._textureMap) {\n this.delete(image);\n }\n this._textureMap.clear();\n this._gl = null;\n }\n /**\n * Get the WebGL Texture from a source image\n * @param image\n */\n get(image) {\n return this._textureMap.get(image);\n }\n /**\n * Returns whether a source image has been loaded as a texture\n * @param image\n */\n has(image) {\n return this._textureMap.has(image);\n }\n /**\n * Loads a graphic into webgl and returns it's texture info, a webgl context must be previously registered\n * @param image Source graphic\n * @param options {ImageSourceOptions} Optionally configure the ImageFiltering and ImageWrapping mode to apply to the loaded texture\n * @param forceUpdate Optionally force a texture to be reloaded, useful if the source graphic has changed\n */\n load(image, options, forceUpdate = false) {\n var _a, _b;\n // Ignore loading if webgl is not registered\n const gl = this._gl;\n if (!gl) {\n return null;\n }\n const { filtering, wrapping } = { ...options };\n let tex = null;\n // If reuse the texture if it's from the same source\n if (this.has(image)) {\n tex = this.get(image);\n }\n // Update existing webgl texture and return early\n if (tex) {\n if (forceUpdate) {\n gl.bindTexture(gl.TEXTURE_2D, tex);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);\n }\n (_a = this._garbageCollector) === null || _a === void 0 ? void 0 : _a.garbageCollector.touch(image);\n return tex;\n }\n // No texture exists create a new one\n tex = gl.createTexture();\n // TODO implement texture gc with weakmap and timer\n TextureLoader.checkImageSizeSupportedAndLog(image);\n gl.bindTexture(gl.TEXTURE_2D, tex);\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);\n let wrappingConfig;\n if (wrapping) {\n if (typeof wrapping === 'string') {\n wrappingConfig = {\n x: wrapping,\n y: wrapping\n };\n }\n else {\n wrappingConfig = {\n x: wrapping.x,\n y: wrapping.y\n };\n }\n }\n const { x: xWrap, y: yWrap } = wrappingConfig !== null && wrappingConfig !== void 0 ? wrappingConfig : TextureLoader.wrapping;\n switch (xWrap) {\n case _Wrapping__WEBPACK_IMPORTED_MODULE_0__.ImageWrapping.Clamp:\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n break;\n case _Wrapping__WEBPACK_IMPORTED_MODULE_0__.ImageWrapping.Repeat:\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT);\n break;\n case _Wrapping__WEBPACK_IMPORTED_MODULE_0__.ImageWrapping.Mirror:\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.MIRRORED_REPEAT);\n break;\n default:\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n }\n switch (yWrap) {\n case _Wrapping__WEBPACK_IMPORTED_MODULE_0__.ImageWrapping.Clamp:\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n break;\n case _Wrapping__WEBPACK_IMPORTED_MODULE_0__.ImageWrapping.Repeat:\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT);\n break;\n case _Wrapping__WEBPACK_IMPORTED_MODULE_0__.ImageWrapping.Mirror:\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.MIRRORED_REPEAT);\n break;\n default:\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n }\n // NEAREST for pixel art, LINEAR for hi-res\n const filterMode = filtering !== null && filtering !== void 0 ? filtering : TextureLoader.filtering;\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filterMode === _Filtering__WEBPACK_IMPORTED_MODULE_1__.ImageFiltering.Pixel ? gl.NEAREST : gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filterMode === _Filtering__WEBPACK_IMPORTED_MODULE_1__.ImageFiltering.Pixel ? gl.NEAREST : gl.LINEAR);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);\n this._textureMap.set(image, tex);\n (_b = this._garbageCollector) === null || _b === void 0 ? void 0 : _b.garbageCollector.addCollectableResource('texture', image);\n return tex;\n }\n delete(image) {\n // Ignore loading if webgl is not registered\n const gl = this._gl;\n if (!gl) {\n return;\n }\n if (this.has(image)) {\n const texture = this.get(image);\n if (texture) {\n this._textureMap.delete(image);\n gl.deleteTexture(texture);\n }\n }\n }\n /**\n * Takes an image and returns if it meets size criteria for hardware\n * @param image\n * @returns if the image will be supported at runtime\n */\n static checkImageSizeSupportedAndLog(image) {\n var _a;\n const originalSrc = (_a = image.dataset.originalSrc) !== null && _a !== void 0 ? _a : 'internal canvas bitmap';\n if (image.width > TextureLoader._MAX_TEXTURE_SIZE || image.height > TextureLoader._MAX_TEXTURE_SIZE) {\n TextureLoader._LOGGER.error(`The image [${originalSrc}] provided to Excalibur is too large for the device's maximum texture size of ` +\n `(${TextureLoader._MAX_TEXTURE_SIZE}x${TextureLoader._MAX_TEXTURE_SIZE}) please resize to an image ` +\n `for excalibur to render properly.\\n\\nImages will likely render as black rectangles.\\n\\n` +\n `Read more here: https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/WebGL_best_practices#understand_system_limits`);\n return false;\n }\n else if (image.width > 4096 || image.height > 4096) {\n // https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/WebGL_best_practices#understand_system_limits\n TextureLoader._LOGGER.warn(`The image [${originalSrc}] provided to excalibur is too large may not work on all mobile devices, ` +\n `it is recommended you resize images to a maximum (4096x4096).\\n\\n` +\n `Images will likely render as black rectangles on some mobile platforms.\\n\\n` +\n `Read more here: https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/WebGL_best_practices#understand_system_limits`);\n }\n return true;\n }\n}\nTextureLoader._LOGGER = _Util_Log__WEBPACK_IMPORTED_MODULE_2__.Logger.getInstance();\n/**\n * Sets the default filtering for the Excalibur texture loader, default {@apilink ImageFiltering.Blended}\n */\nTextureLoader.filtering = _Filtering__WEBPACK_IMPORTED_MODULE_1__.ImageFiltering.Blended;\nTextureLoader.wrapping = { x: _Wrapping__WEBPACK_IMPORTED_MODULE_0__.ImageWrapping.Clamp, y: _Wrapping__WEBPACK_IMPORTED_MODULE_0__.ImageWrapping.Clamp };\nTextureLoader._MAX_TEXTURE_SIZE = 4096;\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/transform-stack.ts\":\n/*!*********************************************!*\\\n !*** ./Graphics/Context/transform-stack.ts ***!\n \\*********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TransformStack: () => (/* binding */ TransformStack)\n/* harmony export */ });\n/* harmony import */ var _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/affine-matrix */ \"./Math/affine-matrix.ts\");\n/* harmony import */ var _Util_RentalPool__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Util/RentalPool */ \"./Util/RentalPool.ts\");\n\n\nclass TransformStack {\n constructor() {\n this._pool = new _Util_RentalPool__WEBPACK_IMPORTED_MODULE_0__.RentalPool(() => _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_1__.AffineMatrix.identity(), (mat) => mat.reset(), 100);\n this._transforms = [];\n this._currentTransform = this._pool.rent(true);\n }\n save() {\n this._transforms.push(this._currentTransform);\n this._currentTransform = this._currentTransform.clone(this._pool.rent());\n }\n restore() {\n this._pool.return(this._currentTransform);\n this._currentTransform = this._transforms.pop();\n }\n translate(x, y) {\n return this._currentTransform.translate(x, y);\n }\n rotate(angle) {\n return this._currentTransform.rotate(angle);\n }\n scale(x, y) {\n return this._currentTransform.scale(x, y);\n }\n reset() {\n this._currentTransform.reset();\n }\n set current(matrix) {\n this._currentTransform = matrix;\n }\n get current() {\n return this._currentTransform;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/vertex-buffer.ts\":\n/*!*******************************************!*\\\n !*** ./Graphics/Context/vertex-buffer.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ VertexBuffer: () => (/* binding */ VertexBuffer)\n/* harmony export */ });\n/**\n * Helper around vertex buffer to simplify creating and uploading geometry\n *\n * Under the hood uses Float32Array\n */\nclass VertexBuffer {\n constructor(options) {\n /**\n * If the vertices never change switching 'static' can be more efficient on the gpu\n *\n * Default is 'dynamic'\n */\n this.type = 'dynamic';\n const { gl, size, type, data } = options;\n this._gl = gl;\n this.buffer = this._gl.createBuffer();\n if (!data && !size) {\n throw Error('Must either provide data or a size to the VertexBuffer');\n }\n if (!data) {\n this.bufferData = new Float32Array(size);\n }\n else {\n this.bufferData = data;\n }\n this.type = type !== null && type !== void 0 ? type : this.type;\n // Allocate buffer\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer);\n gl.bufferData(gl.ARRAY_BUFFER, this.bufferData, this.type === 'static' ? gl.STATIC_DRAW : gl.DYNAMIC_DRAW);\n }\n /**\n * Bind this vertex buffer\n */\n bind() {\n const gl = this._gl;\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer);\n }\n unbind() {\n const gl = this._gl;\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n }\n /**\n * Upload vertex buffer geometry to the GPU\n */\n upload(count) {\n const gl = this._gl;\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer);\n if (count) {\n gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.bufferData, 0, count);\n }\n else {\n // TODO always use bufferSubData? need to perf test it\n gl.bufferData(gl.ARRAY_BUFFER, this.bufferData, this.type === 'static' ? gl.STATIC_DRAW : gl.DYNAMIC_DRAW);\n }\n }\n dispose() {\n const gl = this._gl;\n gl.deleteBuffer(this.buffer);\n this._gl = null;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/vertex-layout.ts\":\n/*!*******************************************!*\\\n !*** ./Graphics/Context/vertex-layout.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ VertexLayout: () => (/* binding */ VertexLayout)\n/* harmony export */ });\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../.. */ \"./Util/Log.ts\");\n/* harmony import */ var _webgl_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./webgl-util */ \"./Graphics/Context/webgl-util.ts\");\n\n\n/**\n * Helper around creating vertex attributes in a given {@apilink VertexBuffer}, this is useful for describing\n * the memory layout for your vertices inside a particular buffer\n *\n * Note: This helper assumes interleaved attributes in one {@apilink VertexBuffer}, not many.\n *\n * Working with `gl.vertexAttribPointer` can be tricky, and this attempts to double check you\n */\nclass VertexLayout {\n get vertexBuffer() {\n return this._vertexBuffer;\n }\n get attributes() {\n return this._attributes;\n }\n constructor(options) {\n this._logger = ___WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance();\n this._suppressWarnings = false;\n this._layout = [];\n this._attributes = [];\n this._vertexTotalSizeBytes = 0;\n this._initialized = false;\n const { gl, shader, vertexBuffer, attributes, suppressWarnings } = options;\n this._gl = gl;\n this._vertexBuffer = vertexBuffer;\n this._attributes = attributes;\n this._shader = shader;\n this._suppressWarnings = suppressWarnings;\n if (shader) {\n this.initialize();\n }\n }\n /**\n * Total number of bytes that the vertex will take up\n */\n get totalVertexSizeBytes() {\n return this._vertexTotalSizeBytes;\n }\n set shader(shader) {\n if (shader && this._shader !== shader) {\n this._shader = shader;\n this.initialize();\n }\n }\n get shader() {\n return this._shader;\n }\n /**\n * Layouts need shader locations and must be bound to a shader\n */\n initialize() {\n if (this._initialized) {\n return;\n }\n if (!this._shader) {\n return;\n }\n if (!this._shader.compiled) {\n throw Error('Shader not compiled, shader must be compiled before defining a vertex layout');\n }\n this._vertexTotalSizeBytes = 0;\n this._layout.length = 0;\n const shaderAttributes = this._shader.attributes;\n for (const attribute of this._attributes) {\n const attrib = shaderAttributes[attribute[0]];\n if (!attrib) {\n if (!(0,_webgl_util__WEBPACK_IMPORTED_MODULE_1__.isAttributeInSource)(this._shader.vertexSource, attribute[0])) {\n throw Error(`The attribute named: ${attribute[0]} size ${attribute[1]}` +\n ` not found in the shader source code:\\n ${this._shader.vertexSource}`);\n }\n if (!this._suppressWarnings) {\n this._logger.warn(`The attribute named: ${attribute[0]} size ${attribute[1]}` +\n ` not found in the compiled shader. This is possibly a bug:\\n` +\n ` 1. Not a bug, but should remove unused code - attribute \"${attribute[0]}\" is unused in` +\n ` vertex/fragment and has been automatically removed by glsl compiler.\\n` +\n ` 2. Definitely a bug, attribute \"${attribute[0]}\" in layout has been mistyped or is missing` +\n ` in shader, check vertex/fragment source.`);\n }\n const glType = (0,_webgl_util__WEBPACK_IMPORTED_MODULE_1__.getGLTypeFromSource)(this._gl, this._shader.vertexSource, attribute[0]);\n // Unused attribute placeholder\n this._layout.push({\n name: attribute[0],\n glType,\n size: attribute[1],\n location: -1,\n normalized: false\n });\n }\n if (attrib) {\n if (attrib.size !== attribute[1]) {\n throw Error(`VertexLayout size definition for attribute: [${attribute[0]}, ${attribute[1]}],` +\n ` doesn\\'t match shader source size ${attrib.size}:\\n ${this._shader.vertexSource}`);\n }\n this._layout.push(attrib);\n }\n }\n // calc size\n let componentsPerVertex = 0;\n for (const vertAttribute of this._layout) {\n const typeSize = (0,_webgl_util__WEBPACK_IMPORTED_MODULE_1__.getGlTypeSizeBytes)(this._gl, vertAttribute.glType);\n this._vertexTotalSizeBytes += typeSize * vertAttribute.size;\n componentsPerVertex += vertAttribute.size;\n }\n if (this._vertexBuffer.bufferData.length % componentsPerVertex !== 0) {\n this._logger.warn(`The vertex component size (${componentsPerVertex}) does NOT divide evenly into the specified vertex buffer` +\n ` (${this._vertexBuffer.bufferData.length})`);\n }\n // create VAO\n const gl = this._gl;\n this._vao = gl.createVertexArray();\n gl.bindVertexArray(this._vao);\n this._vertexBuffer.bind();\n let offset = 0;\n for (const vert of this._layout) {\n // skip unused attributes\n if (vert.location !== -1) {\n if (vert.glType === gl.INT) {\n gl.vertexAttribIPointer(vert.location, vert.size, vert.glType, this.totalVertexSizeBytes, offset);\n }\n else {\n gl.vertexAttribPointer(vert.location, vert.size, vert.glType, vert.normalized, this.totalVertexSizeBytes, offset);\n }\n gl.enableVertexAttribArray(vert.location);\n }\n offset += (0,_webgl_util__WEBPACK_IMPORTED_MODULE_1__.getGlTypeSizeBytes)(gl, vert.glType) * vert.size;\n }\n gl.bindVertexArray(null);\n this._vertexBuffer.unbind();\n this._initialized = true;\n }\n /**\n * Bind this layout with it's associated vertex buffer\n * @param uploadBuffer Optionally indicate you wish to upload the buffer to the GPU associated with this layout\n */\n use(uploadBuffer = false, count) {\n if (!this._shader) {\n throw Error('No shader is associated with this vertex layout, a shader must be set');\n }\n const gl = this._gl;\n if (!this._shader.isCurrentlyBound()) {\n throw Error('Shader associated with this vertex layout is not active! Call shader.use() before layout.use()');\n }\n this._vertexBuffer.bind();\n if (uploadBuffer) {\n this._vertexBuffer.upload(count);\n }\n gl.bindVertexArray(this._vao);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/webgl-util.ts\":\n/*!****************************************!*\\\n !*** ./Graphics/Context/webgl-util.ts ***!\n \\****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ getAttributeComponentSize: () => (/* binding */ getAttributeComponentSize),\n/* harmony export */ getAttributePointerType: () => (/* binding */ getAttributePointerType),\n/* harmony export */ getGLTypeFromSource: () => (/* binding */ getGLTypeFromSource),\n/* harmony export */ getGlTypeSizeBytes: () => (/* binding */ getGlTypeSizeBytes),\n/* harmony export */ getMaxShaderComplexity: () => (/* binding */ getMaxShaderComplexity),\n/* harmony export */ isAttributeInSource: () => (/* binding */ isAttributeInSource)\n/* harmony export */ });\n/**\n * Return the size of the GlType in bytes\n * @param gl\n * @param type\n */\nfunction getGlTypeSizeBytes(gl, type) {\n switch (type) {\n case gl.INT:\n case gl.UNSIGNED_INT:\n case gl.FLOAT:\n return 4;\n case gl.SHORT:\n return 2;\n case gl.UNSIGNED_SHORT:\n return 2;\n case gl.BYTE:\n return 1;\n case gl.UNSIGNED_BYTE:\n return 1;\n default:\n return 1;\n }\n}\n/**\n * Checks if an attribute is present in vertex source\n */\nfunction isAttributeInSource(source, variable) {\n const attributeRegexTemplate = `(?[a-z0-9]+)\\\\s+${variable};`;\n const regex = new RegExp(attributeRegexTemplate, 'g');\n const matches = regex.exec(source);\n return (matches === null || matches === void 0 ? void 0 : matches.length) > 0;\n}\n/**\n * Attempt to discern the glType of an attribute from vertex source\n * @param gl\n * @param source\n * @param variable\n */\nfunction getGLTypeFromSource(gl, source, variable) {\n var _a;\n const attributeRegexTemplate = `(?[a-z0-9]+)\\\\s+${variable};`;\n const regex = new RegExp(attributeRegexTemplate, 'g');\n const matches = regex.exec(source);\n const type = (_a = matches === null || matches === void 0 ? void 0 : matches.groups) === null || _a === void 0 ? void 0 : _a.type;\n switch (type) {\n case 'float':\n case 'vec2':\n case 'vec3':\n case 'vec4':\n return gl.FLOAT;\n case 'int':\n case 'ivec2':\n case 'ivec3':\n case 'ivec4':\n return gl.INT;\n case 'uint':\n case 'uvec2':\n case 'uvec3':\n case 'uvec4':\n return gl.UNSIGNED_INT;\n case 'bool':\n case 'bvec2':\n case 'bvec3':\n case 'bvec4':\n return gl.BOOL;\n case 'short':\n return gl.SHORT;\n case 'ushort':\n return gl.UNSIGNED_SHORT;\n case 'ubyte':\n return gl.UNSIGNED_BYTE;\n case 'byte':\n return gl.BYTE;\n default:\n return gl.FLOAT;\n }\n}\n/**\n * Based on the type return the number of attribute components\n *\n * https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/vertexAttribPointer\n * @param gl\n * @param type\n */\nfunction getAttributeComponentSize(gl, type) {\n switch (type) {\n case gl.LOW_FLOAT:\n case gl.HIGH_FLOAT:\n case gl.FLOAT:\n return 1;\n case gl.FLOAT_VEC2:\n return 2;\n case gl.FLOAT_VEC3:\n return 3;\n case gl.FLOAT_VEC4:\n return 4;\n case gl.BYTE:\n return 1;\n case gl.UNSIGNED_BYTE:\n return 1;\n case gl.UNSIGNED_SHORT:\n case gl.SHORT:\n return 1;\n default:\n return 1;\n }\n}\n/**\n * Based on the attribute return the corresponding supported attrib pointer type\n * https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/vertexAttribPointer\n * @param gl\n * @param type\n */\nfunction getAttributePointerType(gl, type) {\n switch (type) {\n case gl.LOW_FLOAT:\n case gl.HIGH_FLOAT:\n case gl.FLOAT:\n case gl.FLOAT_VEC2:\n case gl.FLOAT_VEC3:\n case gl.FLOAT_VEC4:\n return gl.FLOAT;\n case gl.BYTE:\n return gl.BYTE;\n case gl.UNSIGNED_BYTE:\n return gl.UNSIGNED_BYTE;\n case gl.SHORT:\n return gl.SHORT;\n case gl.UNSIGNED_SHORT:\n return gl.UNSIGNED_SHORT;\n default:\n return gl.FLOAT;\n }\n}\n/**\n *\n */\nfunction getMaxShaderComplexity(gl, numIfs) {\n const assembleTestShader = (numIfs) => {\n const testShader = `#version 300 es\r\n precision mediump float;\r\n out vec4 fragColor;\r\n void main() {\r\n float index = 1.01;\r\n %%complexity%%\r\n }`;\n let testComplexity = '';\n for (let i = 0; i < numIfs; i++) {\n if (i === 0) {\n testComplexity += `if (index <= ${i}.5) {\\n`;\n }\n else {\n testComplexity += ` else if (index <= ${i}.5) {\\n`;\n }\n testComplexity += ` fragColor = vec4(1.0);\\n`;\n testComplexity += ` }\\n`;\n }\n return testShader.replace('%%complexity%%', testComplexity);\n };\n let canCompile = false;\n do {\n const test = assembleTestShader(numIfs);\n const shader = gl.createShader(gl.FRAGMENT_SHADER);\n gl.shaderSource(shader, test);\n gl.compileShader(shader);\n canCompile = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n if (!canCompile) {\n numIfs = (numIfs / 2) | 0;\n }\n } while (!canCompile);\n return numIfs;\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Debug.ts\":\n/*!***************************!*\\\n !*** ./Graphics/Debug.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Debug: () => (/* binding */ Debug)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n\nclass Debug {\n static registerGraphicsContext(ctx) {\n Debug._ctx = ctx;\n }\n static draw(debugDrawCall) {\n this._drawCalls.push(debugDrawCall);\n }\n static drawPoint(point, options) {\n Debug.draw((ctx) => {\n ctx.debug.drawPoint(point, options);\n });\n }\n static drawLine(start, end, options) {\n Debug.draw((ctx) => {\n ctx.debug.drawLine(start, end, options);\n });\n }\n static drawLines(points, options) {\n if (points.length > 1) {\n Debug.draw((ctx) => {\n for (let i = 0; i < points.length - 1; i++) {\n ctx.debug.drawLine(points[i], points[i + 1], options);\n }\n });\n }\n }\n static drawText(text, pos) {\n Debug.draw((ctx) => {\n ctx.debug.drawText(text, pos);\n });\n }\n static drawPolygon(points, options) {\n if (points.length > 1) {\n Debug.draw((ctx) => {\n const firstPoint = points[0];\n const polygon = [...points, firstPoint];\n for (let i = 0; i < polygon.length - 1; i++) {\n ctx.debug.drawLine(polygon[i], polygon[i + 1], options);\n }\n });\n }\n }\n static drawCircle(center, radius, options) {\n const { color, strokeColor, width } = {\n color: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Black,\n strokeColor: undefined,\n width: undefined,\n ...options\n };\n Debug.draw((ctx) => {\n ctx.drawCircle(center, radius, color, strokeColor, width);\n });\n }\n static drawBounds(boundingBox, options) {\n Debug.draw((ctx) => {\n ctx.debug.drawRect(boundingBox.left, boundingBox.top, boundingBox.width, boundingBox.height, options);\n });\n }\n static drawRay(ray, options) {\n const { distance, color } = {\n color: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Blue,\n distance: 10,\n ...options\n };\n Debug.draw((ctx) => {\n const start = ray.pos;\n const end = ray.pos.add(ray.dir.scale(distance));\n ctx.debug.drawLine(start, end, { color });\n });\n }\n static flush(ctx) {\n ctx.save();\n ctx.z = Debug.z;\n for (const drawCall of Debug._drawCalls) {\n drawCall(ctx);\n }\n ctx.restore();\n Debug.clear();\n }\n static clear() {\n Debug._drawCalls.length = 0;\n }\n}\nDebug._drawCalls = [];\nDebug.z = Infinity;\n\n\n/***/ }),\n\n/***/ \"./Graphics/DebugGraphicsComponent.ts\":\n/*!********************************************!*\\\n !*** ./Graphics/DebugGraphicsComponent.ts ***!\n \\********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DebugGraphicsComponent: () => (/* binding */ DebugGraphicsComponent)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Component */ \"./EntityComponentSystem/Component.ts\");\n\n/**\n * Provide arbitrary drawing for the purposes of debugging your game\n *\n * Will only show when the Engine is set to debug mode {@apilink Engine.showDebug} or {@apilink Engine.toggleDebug}\n *\n */\nclass DebugGraphicsComponent extends _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor(draw, useTransform = true) {\n super();\n this.draw = draw;\n this.useTransform = useTransform;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Filtering.ts\":\n/*!*******************************!*\\\n !*** ./Graphics/Filtering.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ImageFiltering: () => (/* binding */ ImageFiltering),\n/* harmony export */ parseImageFiltering: () => (/* binding */ parseImageFiltering)\n/* harmony export */ });\n/**\n * Describes the different image filtering modes\n */\nvar ImageFiltering;\n(function (ImageFiltering) {\n /**\n * Pixel is useful when you do not want smoothing aka antialiasing applied to your graphics.\n *\n * Useful for Pixel art aesthetics.\n */\n ImageFiltering[\"Pixel\"] = \"Pixel\";\n /**\n * Blended is useful when you have high resolution artwork and would like it blended and smoothed\n */\n ImageFiltering[\"Blended\"] = \"Blended\";\n})(ImageFiltering || (ImageFiltering = {}));\n/**\n * Parse the image filtering attribute value, if it doesn't match returns null\n */\nfunction parseImageFiltering(val) {\n switch (val) {\n case ImageFiltering.Pixel:\n return ImageFiltering.Pixel;\n case ImageFiltering.Blended:\n return ImageFiltering.Blended;\n default:\n return undefined;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Font.ts\":\n/*!**************************!*\\\n !*** ./Graphics/Font.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Font: () => (/* binding */ Font)\n/* harmony export */ });\n/* harmony import */ var _Collision_Index__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Collision/Index */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _FontCommon__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./FontCommon */ \"./Graphics/FontCommon.ts\");\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _FontTextInstance__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./FontTextInstance */ \"./Graphics/FontTextInstance.ts\");\n/* harmony import */ var _FontCache__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./FontCache */ \"./Graphics/FontCache.ts\");\n\n\n\n\n\n\n\n/**\n * Represents a system or web font in Excalibur\n *\n * If no options specified, the system sans-serif 10 pixel is used\n *\n * If loading a custom web font be sure to have the font loaded before you use it https://erikonarheim.com/posts/dont-test-fonts/\n */\nclass Font extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n constructor(options = {}) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v;\n super(options); // <- Graphics properties\n /**\n * Set the font filtering mode, by default set to {@apilink ImageFiltering.Blended} regardless of the engine default smoothing\n *\n * If you have a pixel style font that may be a reason to switch this to {@apilink ImageFiltering.Pixel}\n */\n this.filtering = _Filtering__WEBPACK_IMPORTED_MODULE_1__.ImageFiltering.Blended;\n /**\n * Font quality determines the size of the underlying raster text, higher quality means less jagged edges.\n * If quality is set to 1, then just enough raster bitmap is generated to render the text.\n *\n * You can think of quality as how zoomed in to the text you can get before seeing jagged edges.\n *\n * (Default 2)\n */\n this.quality = 2;\n // Raster properties for fonts\n this.padding = 2;\n this.smoothing = false;\n this.lineWidth = 1;\n this.lineDash = [];\n this.color = _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Black;\n this.family = 'sans-serif';\n this.style = _FontCommon__WEBPACK_IMPORTED_MODULE_3__.FontStyle.Normal;\n this.bold = false;\n this.unit = _FontCommon__WEBPACK_IMPORTED_MODULE_3__.FontUnit.Px;\n this.textAlign = _FontCommon__WEBPACK_IMPORTED_MODULE_3__.TextAlign.Left;\n this.baseAlign = _FontCommon__WEBPACK_IMPORTED_MODULE_3__.BaseAlign.Top;\n this.direction = _FontCommon__WEBPACK_IMPORTED_MODULE_3__.Direction.LeftToRight;\n /**\n * Font line height in pixels, default line height if unset\n */\n this.lineHeight = undefined;\n this.size = 10;\n this._textBounds = new _Collision_Index__WEBPACK_IMPORTED_MODULE_4__.BoundingBox();\n this._textMeasurement = new _FontTextInstance__WEBPACK_IMPORTED_MODULE_5__.FontTextInstance(this, '', _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Black);\n // Raster properties\n this.smoothing = (_a = options === null || options === void 0 ? void 0 : options.smoothing) !== null && _a !== void 0 ? _a : this.smoothing;\n this.padding = (_b = options === null || options === void 0 ? void 0 : options.padding) !== null && _b !== void 0 ? _b : this.padding;\n this.color = (_c = options === null || options === void 0 ? void 0 : options.color) !== null && _c !== void 0 ? _c : this.color;\n this.strokeColor = (_d = options === null || options === void 0 ? void 0 : options.strokeColor) !== null && _d !== void 0 ? _d : this.strokeColor;\n this.lineDash = (_e = options === null || options === void 0 ? void 0 : options.lineDash) !== null && _e !== void 0 ? _e : this.lineDash;\n this.lineWidth = (_f = options === null || options === void 0 ? void 0 : options.lineWidth) !== null && _f !== void 0 ? _f : this.lineWidth;\n this.filtering = (_g = options === null || options === void 0 ? void 0 : options.filtering) !== null && _g !== void 0 ? _g : this.filtering;\n // Font specific properties\n this.family = (_h = options === null || options === void 0 ? void 0 : options.family) !== null && _h !== void 0 ? _h : this.family;\n this.style = (_j = options === null || options === void 0 ? void 0 : options.style) !== null && _j !== void 0 ? _j : this.style;\n this.bold = (_k = options === null || options === void 0 ? void 0 : options.bold) !== null && _k !== void 0 ? _k : this.bold;\n this.size = (_l = options === null || options === void 0 ? void 0 : options.size) !== null && _l !== void 0 ? _l : this.size;\n this.unit = (_m = options === null || options === void 0 ? void 0 : options.unit) !== null && _m !== void 0 ? _m : this.unit;\n this.textAlign = (_o = options === null || options === void 0 ? void 0 : options.textAlign) !== null && _o !== void 0 ? _o : this.textAlign;\n this.baseAlign = (_p = options === null || options === void 0 ? void 0 : options.baseAlign) !== null && _p !== void 0 ? _p : this.baseAlign;\n this.direction = (_q = options === null || options === void 0 ? void 0 : options.direction) !== null && _q !== void 0 ? _q : this.direction;\n this.lineHeight = (_r = options === null || options === void 0 ? void 0 : options.lineHeight) !== null && _r !== void 0 ? _r : this.lineHeight;\n this.quality = (_s = options === null || options === void 0 ? void 0 : options.quality) !== null && _s !== void 0 ? _s : this.quality;\n if (options === null || options === void 0 ? void 0 : options.shadow) {\n this.shadow = {};\n this.shadow.blur = (_t = options.shadow.blur) !== null && _t !== void 0 ? _t : this.shadow.blur;\n this.shadow.offset = (_u = options.shadow.offset) !== null && _u !== void 0 ? _u : this.shadow.offset;\n this.shadow.color = (_v = options.shadow.color) !== null && _v !== void 0 ? _v : this.shadow.color;\n }\n }\n clone() {\n return new Font({\n ...this.cloneGraphicOptions(),\n size: this.size,\n unit: this.unit,\n family: this.family,\n style: this.style,\n bold: this.bold,\n textAlign: this.textAlign,\n baseAlign: this.baseAlign,\n direction: this.direction,\n shadow: this.shadow\n ? {\n blur: this.shadow.blur,\n offset: this.shadow.offset,\n color: this.shadow.color\n }\n : undefined\n });\n }\n get fontString() {\n return `${this.style} ${this.bold ? 'bold' : ''} ${this.size}${this.unit} ${this.family}`;\n }\n get localBounds() {\n return this._textBounds;\n }\n _drawImage(_ex, _x, _y) {\n // TODO weird vestigial drawimage\n }\n _rotate(ex) {\n var _a;\n // TODO this needs to change depending on the bounding box...\n const origin = (_a = this.origin) !== null && _a !== void 0 ? _a : this._textBounds.center;\n ex.translate(origin.x, origin.y);\n ex.rotate(this.rotation);\n ex.translate(-origin.x, -origin.y);\n }\n _flip(ex) {\n if (this.flipHorizontal) {\n ex.translate(this._textBounds.width / this.scale.x, 0);\n ex.scale(-1, 1);\n }\n if (this.flipVertical) {\n ex.translate(0, -this._textBounds.height / 2 / this.scale.y);\n ex.scale(1, -1);\n }\n }\n measureTextWithoutCache(text, maxWidth) {\n return this._textMeasurement.measureText(text, maxWidth);\n }\n /**\n * Returns a BoundingBox that is the total size of the text including multiple lines\n *\n * Does not include any padding or adjustment\n * @param text\n * @returns BoundingBox\n */\n measureText(text, maxWidth) {\n return _FontCache__WEBPACK_IMPORTED_MODULE_6__.FontCache.measureText(text, this, maxWidth);\n }\n _postDraw(ex) {\n ex.restore();\n }\n render(ex, text, colorOverride, x, y, maxWidth) {\n const textInstance = _FontCache__WEBPACK_IMPORTED_MODULE_6__.FontCache.getTextInstance(text, this, colorOverride);\n // Apply affine transformations\n this._textBounds = textInstance.dimensions;\n this._preDraw(ex, x, y);\n textInstance.render(ex, x, y, maxWidth);\n this._postDraw(ex);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/FontCache.ts\":\n/*!*******************************!*\\\n !*** ./Graphics/FontCache.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FontCache: () => (/* binding */ FontCache)\n/* harmony export */ });\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _FontTextInstance__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./FontTextInstance */ \"./Graphics/FontTextInstance.ts\");\n\n\nclass FontCache {\n static measureText(text, font, maxWidth) {\n const hash = _FontTextInstance__WEBPACK_IMPORTED_MODULE_0__.FontTextInstance.getHashCode(font, text);\n if (FontCache._MEASURE_CACHE.has(hash)) {\n return FontCache._MEASURE_CACHE.get(hash);\n }\n FontCache._LOGGER.debug('Font text measurement cache miss');\n const measurement = font.measureTextWithoutCache(text, maxWidth);\n FontCache._MEASURE_CACHE.set(hash, measurement);\n return measurement;\n }\n static getTextInstance(text, font, color) {\n const hash = _FontTextInstance__WEBPACK_IMPORTED_MODULE_0__.FontTextInstance.getHashCode(font, text, color);\n let textInstance = FontCache._TEXT_CACHE.get(hash);\n if (!textInstance) {\n textInstance = new _FontTextInstance__WEBPACK_IMPORTED_MODULE_0__.FontTextInstance(font, text, color);\n FontCache._TEXT_CACHE.set(hash, textInstance);\n FontCache._LOGGER.debug('Font text instance cache miss');\n }\n // Cache the bitmap for certain amount of time\n FontCache._TEXT_USAGE.set(textInstance, performance.now());\n return textInstance;\n }\n static checkAndClearCache() {\n const deferred = [];\n const currentHashCodes = new Set();\n for (const [textInstance, time] of FontCache._TEXT_USAGE.entries()) {\n // if bitmap hasn't been used in 100 ms clear it\n if (time + FontCache.FONT_TIMEOUT < performance.now()) {\n FontCache._LOGGER.debug(`Text cache entry timed out ${textInstance.text}`);\n deferred.push(textInstance);\n textInstance.dispose();\n }\n else {\n const hash = textInstance.getHashCode(false);\n currentHashCodes.add(hash);\n }\n }\n // Deferred removal of text instances\n deferred.forEach((t) => {\n FontCache._TEXT_USAGE.delete(t);\n });\n // Regenerate text instance cache\n this._TEXT_CACHE.clear();\n for (const [textInstance] of this._TEXT_USAGE.entries()) {\n this._TEXT_CACHE.set(textInstance.getHashCode(), textInstance);\n }\n // Regenerated measurement cache\n const newTextMeasurementCache = new Map();\n for (const current of currentHashCodes) {\n if (FontCache._MEASURE_CACHE.has(current)) {\n newTextMeasurementCache.set(current, FontCache._MEASURE_CACHE.get(current));\n }\n }\n this._MEASURE_CACHE.clear();\n this._MEASURE_CACHE = newTextMeasurementCache;\n }\n static get cacheSize() {\n return FontCache._TEXT_USAGE.size;\n }\n /**\n * Force clear all cached text bitmaps\n */\n static clearCache() {\n for (const [textInstance] of FontCache._TEXT_USAGE.entries()) {\n textInstance.dispose();\n }\n FontCache._TEXT_USAGE.clear();\n FontCache._TEXT_CACHE.clear();\n FontCache._MEASURE_CACHE.clear();\n }\n}\nFontCache.FONT_TIMEOUT = 500;\nFontCache._LOGGER = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\nFontCache._TEXT_USAGE = new Map();\nFontCache._TEXT_CACHE = new Map();\nFontCache._MEASURE_CACHE = new Map();\n\n\n/***/ }),\n\n/***/ \"./Graphics/FontCommon.ts\":\n/*!********************************!*\\\n !*** ./Graphics/FontCommon.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BaseAlign: () => (/* binding */ BaseAlign),\n/* harmony export */ Direction: () => (/* binding */ Direction),\n/* harmony export */ FontStyle: () => (/* binding */ FontStyle),\n/* harmony export */ FontUnit: () => (/* binding */ FontUnit),\n/* harmony export */ TextAlign: () => (/* binding */ TextAlign)\n/* harmony export */ });\n/**\n * Enum representing the different font size units\n * https://developer.mozilla.org/en-US/docs/Web/CSS/font-size\n */\nvar FontUnit;\n(function (FontUnit) {\n /**\n * Em is a scalable unit, 1 em is equal to the current font size of the current element, parent elements can effect em values\n */\n FontUnit[\"Em\"] = \"em\";\n /**\n * Rem is similar to the Em, it is a scalable unit. 1 rem is equal to the font size of the root element\n */\n FontUnit[\"Rem\"] = \"rem\";\n /**\n * Pixel is a unit of length in screen pixels\n */\n FontUnit[\"Px\"] = \"px\";\n /**\n * Point is a physical unit length (1/72 of an inch)\n */\n FontUnit[\"Pt\"] = \"pt\";\n /**\n * Percent is a scalable unit similar to Em, the only difference is the Em units scale faster when Text-Size stuff\n */\n FontUnit[\"Percent\"] = \"%\";\n})(FontUnit || (FontUnit = {}));\n/**\n * Enum representing the different horizontal text alignments\n */\nvar TextAlign;\n(function (TextAlign) {\n /**\n * The text is left-aligned.\n */\n TextAlign[\"Left\"] = \"left\";\n /**\n * The text is right-aligned.\n */\n TextAlign[\"Right\"] = \"right\";\n /**\n * The text is centered.\n */\n TextAlign[\"Center\"] = \"center\";\n /**\n * The text is aligned at the normal start of the line (left-aligned for left-to-right locales,\n * right-aligned for right-to-left locales).\n */\n TextAlign[\"Start\"] = \"start\";\n /**\n * The text is aligned at the normal end of the line (right-aligned for left-to-right locales,\n * left-aligned for right-to-left locales).\n */\n TextAlign[\"End\"] = \"end\";\n})(TextAlign || (TextAlign = {}));\n/**\n * Enum representing the different baseline text alignments\n */\nvar BaseAlign;\n(function (BaseAlign) {\n /**\n * The text baseline is the top of the em square.\n */\n BaseAlign[\"Top\"] = \"top\";\n /**\n * The text baseline is the hanging baseline. Currently unsupported; this will act like\n * alphabetic.\n */\n BaseAlign[\"Hanging\"] = \"hanging\";\n /**\n * The text baseline is the middle of the em square.\n */\n BaseAlign[\"Middle\"] = \"middle\";\n /**\n * The text baseline is the normal alphabetic baseline.\n */\n BaseAlign[\"Alphabetic\"] = \"alphabetic\";\n /**\n * The text baseline is the ideographic baseline; this is the bottom of\n * the body of the characters, if the main body of characters protrudes\n * beneath the alphabetic baseline. Currently unsupported; this will\n * act like alphabetic.\n */\n BaseAlign[\"Ideographic\"] = \"ideographic\";\n /**\n * The text baseline is the bottom of the bounding box. This differs\n * from the ideographic baseline in that the ideographic baseline\n * doesn't consider descenders.\n */\n BaseAlign[\"Bottom\"] = \"bottom\";\n})(BaseAlign || (BaseAlign = {}));\n/**\n * Enum representing the different possible font styles\n */\nvar FontStyle;\n(function (FontStyle) {\n FontStyle[\"Normal\"] = \"normal\";\n FontStyle[\"Italic\"] = \"italic\";\n FontStyle[\"Oblique\"] = \"oblique\";\n})(FontStyle || (FontStyle = {}));\n/**\n * Enum representing the text direction, useful for other languages, or writing text in reverse\n */\nvar Direction;\n(function (Direction) {\n Direction[\"LeftToRight\"] = \"ltr\";\n Direction[\"RightToLeft\"] = \"rtl\";\n})(Direction || (Direction = {}));\n\n\n/***/ }),\n\n/***/ \"./Graphics/FontTextInstance.ts\":\n/*!**************************************!*\\\n !*** ./Graphics/FontTextInstance.ts ***!\n \\**************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FontTextInstance: () => (/* binding */ FontTextInstance)\n/* harmony export */ });\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Util_DrawUtil__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/DrawUtil */ \"./Util/DrawUtil.ts\");\n/* harmony import */ var _Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Context/ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n\n\n\n\nclass FontTextInstance {\n constructor(font, text, color, maxWidth) {\n this.font = font;\n this.text = text;\n this.color = color;\n this.maxWidth = maxWidth;\n this._textFragments = [];\n this.disposed = false;\n this._dirty = true;\n this.canvas = document.createElement('canvas');\n const ctx = this.canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Unable to create FontTextInstance, internal canvas failed to create');\n }\n this.ctx = ctx;\n this.dimensions = this.measureText(text);\n this._setDimension(this.dimensions, this.ctx);\n this._lastHashCode = this.getHashCode();\n }\n measureText(text, maxWidth) {\n if (this.disposed) {\n throw Error('Accessing disposed text instance! ' + this.text);\n }\n let lines = null;\n if (maxWidth != null) {\n lines = this._getLinesFromText(text, maxWidth);\n }\n else {\n lines = text.split('\\n');\n }\n const maxWidthLine = lines.reduce((a, b) => {\n return a.length > b.length ? a : b;\n });\n this._applyFont(this.ctx); // font must be applied to the context to measure it\n const metrics = this.ctx.measureText(maxWidthLine);\n let textHeight = Math.abs(metrics.actualBoundingBoxAscent) + Math.abs(metrics.actualBoundingBoxDescent);\n // TODO line height makes the text bounds wonky\n const lineAdjustedHeight = textHeight * lines.length;\n textHeight = lineAdjustedHeight;\n const bottomBounds = lineAdjustedHeight - Math.abs(metrics.actualBoundingBoxAscent);\n const x = 0;\n const y = 0;\n const measurement = new _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox({\n left: x - Math.abs(metrics.actualBoundingBoxLeft) - this.font.padding,\n top: y - Math.abs(metrics.actualBoundingBoxAscent) - this.font.padding,\n bottom: y + bottomBounds + this.font.padding,\n right: x + Math.abs(metrics.actualBoundingBoxRight) + this.font.padding\n });\n return measurement;\n }\n _setDimension(textBounds, bitmap) {\n let lineHeightRatio = 1;\n if (this.font.lineHeight) {\n lineHeightRatio = this.font.lineHeight / this.font.size;\n }\n // Changing the width and height clears the context properties\n // We double the bitmap width to account for all possible alignment\n // We scale by \"quality\" so we render text without jaggies\n bitmap.canvas.width = (textBounds.width + this.font.padding * 2) * 2 * this.font.quality;\n bitmap.canvas.height = (textBounds.height + this.font.padding * 2) * 2 * this.font.quality * lineHeightRatio;\n }\n static getHashCode(font, text, color) {\n var _a;\n const hash = text +\n '__hashcode__' +\n font.fontString +\n font.showDebug +\n font.textAlign +\n font.baseAlign +\n font.direction +\n font.lineHeight +\n JSON.stringify(font.shadow) +\n (font.padding.toString() +\n font.smoothing.toString() +\n font.lineWidth.toString() +\n font.lineDash.toString() +\n ((_a = font.strokeColor) === null || _a === void 0 ? void 0 : _a.toString()) +\n (color ? color.toString() : font.color.toString()));\n return hash;\n }\n getHashCode(includeColor = true) {\n return FontTextInstance.getHashCode(this.font, this.text, includeColor ? this.color : undefined);\n }\n _applyRasterProperties(ctx) {\n var _a, _b, _c;\n ctx.translate(this.font.padding, this.font.padding);\n ctx.imageSmoothingEnabled = this.font.smoothing;\n ctx.lineWidth = this.font.lineWidth;\n ctx.setLineDash((_a = this.font.lineDash) !== null && _a !== void 0 ? _a : ctx.getLineDash());\n ctx.strokeStyle = (_c = (_b = this.font.strokeColor) === null || _b === void 0 ? void 0 : _b.toString()) !== null && _c !== void 0 ? _c : '';\n ctx.fillStyle = this.color.toString();\n }\n _applyFont(ctx) {\n ctx.resetTransform();\n ctx.translate(this.font.padding + ctx.canvas.width / 2, this.font.padding + ctx.canvas.height / 2);\n ctx.scale(this.font.quality, this.font.quality);\n ctx.textAlign = this.font.textAlign;\n ctx.textBaseline = this.font.baseAlign;\n ctx.font = this.font.fontString;\n ctx.direction = this.font.direction;\n if (this.font.shadow) {\n if (this.font.shadow.color) {\n ctx.shadowColor = this.font.shadow.color.toString();\n }\n if (this.font.shadow.blur) {\n ctx.shadowBlur = this.font.shadow.blur;\n }\n if (this.font.shadow.offset) {\n ctx.shadowOffsetX = this.font.shadow.offset.x;\n ctx.shadowOffsetY = this.font.shadow.offset.y;\n }\n }\n }\n _drawText(ctx, lines, lineHeight) {\n this._applyRasterProperties(ctx);\n this._applyFont(ctx);\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (this.color) {\n ctx.fillText(line, 0, i * lineHeight);\n }\n if (this.font.strokeColor) {\n ctx.strokeText(line, 0, i * lineHeight);\n }\n }\n if (this.font.showDebug) {\n // Horizontal line\n /* istanbul ignore next */\n (0,_Util_DrawUtil__WEBPACK_IMPORTED_MODULE_1__.line)(ctx, _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Green, -ctx.canvas.width / 2, 0, ctx.canvas.width / 2, 0, 2);\n // Vertical line\n /* istanbul ignore next */\n (0,_Util_DrawUtil__WEBPACK_IMPORTED_MODULE_1__.line)(ctx, _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Red, 0, -ctx.canvas.height / 2, 0, ctx.canvas.height / 2, 2);\n }\n }\n _splitTextBitmap(bitmap) {\n const textImages = [];\n let currentX = 0;\n let currentY = 0;\n // 4k is the max for mobile devices\n const width = Math.min(4096, bitmap.canvas.width);\n const height = Math.min(4096, bitmap.canvas.height);\n // Splits the original bitmap into 4k max chunks\n while (currentX < bitmap.canvas.width) {\n while (currentY < bitmap.canvas.height) {\n // create new bitmap\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Unable to split internal FontTextInstance bitmap, failed to create internal canvas');\n }\n // draw current slice to new bitmap in < 4k chunks\n ctx.drawImage(bitmap.canvas, currentX, currentY, width, height, 0, 0, width, height);\n textImages.push({ x: currentX, y: currentY, canvas });\n currentY += height;\n }\n currentX += width;\n currentY = 0;\n }\n return textImages;\n }\n flagDirty() {\n this._dirty = true;\n }\n render(ex, x, y, maxWidth) {\n var _a;\n if (this.disposed) {\n throw Error('Accessing disposed text instance! ' + this.text);\n }\n this._ex = ex;\n const hashCode = this.getHashCode();\n if (this._lastHashCode !== hashCode) {\n this._dirty = true;\n }\n // Calculate image chunks\n if (this._dirty) {\n this.dimensions = this.measureText(this.text, maxWidth);\n this._setDimension(this.dimensions, this.ctx);\n const lines = this._getLinesFromText(this.text, maxWidth);\n const lineHeight = (_a = this.font.lineHeight) !== null && _a !== void 0 ? _a : this.dimensions.height / lines.length;\n // draws the text to the main bitmap\n this._drawText(this.ctx, lines, lineHeight);\n // clear any out old fragments\n if (ex instanceof _Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_3__.ExcaliburGraphicsContextWebGL) {\n for (const frag of this._textFragments) {\n ex.textureLoader.delete(frag.canvas);\n }\n }\n // splits to < 4k fragments for large text\n this._textFragments = this._splitTextBitmap(this.ctx);\n if (ex instanceof _Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_3__.ExcaliburGraphicsContextWebGL) {\n for (const frag of this._textFragments) {\n ex.textureLoader.load(frag.canvas, { filtering: this.font.filtering }, true);\n }\n }\n this._lastHashCode = hashCode;\n this._dirty = false;\n }\n // draws the bitmap fragments to excalibur graphics context\n for (const frag of this._textFragments) {\n ex.drawImage(frag.canvas, 0, 0, frag.canvas.width, frag.canvas.height, frag.x / this.font.quality + x - this.ctx.canvas.width / this.font.quality / 2, frag.y / this.font.quality + y - this.ctx.canvas.height / this.font.quality / 2, frag.canvas.width / this.font.quality, frag.canvas.height / this.font.quality);\n }\n }\n dispose() {\n this.disposed = true;\n this.dimensions = undefined;\n this.canvas = undefined;\n this.ctx = undefined;\n if (this._ex instanceof _Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_3__.ExcaliburGraphicsContextWebGL) {\n for (const frag of this._textFragments) {\n this._ex.textureLoader.delete(frag.canvas);\n }\n }\n this._textFragments.length = 0;\n }\n _getLinesFromText(text, maxWidth) {\n var _a;\n if (this._cachedText === text && this._cachedRenderWidth === maxWidth && ((_a = this._cachedLines) === null || _a === void 0 ? void 0 : _a.length)) {\n return this._cachedLines;\n }\n const lines = text.split('\\n');\n if (maxWidth == null) {\n return lines;\n }\n // If the current line goes past the maxWidth, append a new line without modifying the underlying text.\n for (let i = 0; i < lines.length; i++) {\n let line = lines[i];\n let newLine = '';\n if (this.measureText(line).width > maxWidth) {\n while (this.measureText(line).width > maxWidth) {\n newLine = line[line.length - 1] + newLine;\n line = line.slice(0, -1); // Remove last character from line\n }\n // Update the array with our new values\n lines[i] = line;\n lines[i + 1] = newLine;\n }\n }\n this._cachedText = text;\n this._cachedLines = lines;\n this._cachedRenderWidth = maxWidth;\n return lines;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Graphic.ts\":\n/*!*****************************!*\\\n !*** ./Graphics/Graphic.ts ***!\n \\*****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Graphic: () => (/* binding */ Graphic)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Util_Watch__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Util/Watch */ \"./Util/Watch.ts\");\n/* harmony import */ var _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/affine-matrix */ \"./Math/affine-matrix.ts\");\n\n\n\n\n/**\n * A Graphic is the base Excalibur primitive for something that can be drawn to the {@apilink ExcaliburGraphicsContext}.\n * {@apilink Sprite}, {@apilink Animation}, {@apilink GraphicsGroup}, {@apilink Canvas}, {@apilink Rectangle}, {@apilink Circle}, and {@apilink Polygon} all derive from the\n * {@apilink Graphic} abstract class.\n *\n * Implementors of a Graphic must override the abstract {@apilink Graphic._drawImage} method to render an image to the graphics context. Graphic\n * handles all the position, rotation, and scale transformations in {@apilink Graphic._preDraw} and {@apilink Graphic._postDraw}\n */\nclass Graphic {\n isStale() {\n return this._transformStale;\n }\n /**\n * Gets or sets the flipHorizontal, which will flip the graphic horizontally (across the y axis)\n */\n get flipHorizontal() {\n return this._flipHorizontal;\n }\n set flipHorizontal(value) {\n this._flipHorizontal = value;\n this._transformStale = true;\n }\n /**\n * Gets or sets the flipVertical, which will flip the graphic vertically (across the x axis)\n */\n get flipVertical() {\n return this._flipVertical;\n }\n set flipVertical(value) {\n this._flipVertical = value;\n this._transformStale = true;\n }\n /**\n * Gets or sets the rotation of the graphic\n */\n get rotation() {\n return this._rotation;\n }\n set rotation(value) {\n this._rotation = value;\n this._transformStale = true;\n }\n /**\n * Gets or sets the scale of the graphic, this affects the width and\n */\n get scale() {\n return this._scale;\n }\n set scale(value) {\n this._scale = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_0__.watch)(value, () => {\n this._transformStale = true;\n });\n this._transformStale = true;\n }\n /**\n * Gets or sets the origin of the graphic, if not set the center of the graphic is the origin\n */\n get origin() {\n return this._origin;\n }\n set origin(value) {\n if (value) {\n this._origin = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_0__.watch)(value, () => {\n this._transformStale = true;\n });\n }\n this._transformStale = true;\n }\n constructor(options) {\n var _a, _b, _c, _d, _e, _f, _g;\n this.id = Graphic._ID++;\n this.transform = _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_1__.AffineMatrix.identity();\n this._transformStale = true;\n /**\n * Gets or sets wether to show debug information about the graphic\n */\n this.showDebug = false;\n this._flipHorizontal = false;\n this._flipVertical = false;\n this._rotation = 0;\n /**\n * Gets or sets the opacity of the graphic, 0 is transparent, 1 is solid (opaque).\n */\n this.opacity = 1;\n this._scale = _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.One;\n this._width = 0;\n this._height = 0;\n if (options) {\n this.origin = (_a = options.origin) !== null && _a !== void 0 ? _a : this.origin;\n this.flipHorizontal = (_b = options.flipHorizontal) !== null && _b !== void 0 ? _b : this.flipHorizontal;\n this.flipVertical = (_c = options.flipVertical) !== null && _c !== void 0 ? _c : this.flipVertical;\n this.rotation = (_d = options.rotation) !== null && _d !== void 0 ? _d : this.rotation;\n this.opacity = (_e = options.opacity) !== null && _e !== void 0 ? _e : this.opacity;\n this.scale = (_f = options.scale) !== null && _f !== void 0 ? _f : this.scale;\n this.tint = (_g = options.tint) !== null && _g !== void 0 ? _g : this.tint;\n if (options.width) {\n this._width = options.width;\n }\n if (options.height) {\n this._height = options.height;\n }\n }\n }\n cloneGraphicOptions() {\n return {\n width: this.width / this.scale.x,\n height: this.height / this.scale.y,\n origin: this.origin ? this.origin.clone() : undefined,\n flipHorizontal: this.flipHorizontal,\n flipVertical: this.flipVertical,\n rotation: this.rotation,\n opacity: this.opacity,\n scale: this.scale ? this.scale.clone() : undefined,\n tint: this.tint ? this.tint.clone() : undefined\n };\n }\n /**\n * Gets or sets the width of the graphic (always positive)\n */\n get width() {\n return Math.abs(this._width * this.scale.x);\n }\n /**\n * Gets or sets the height of the graphic (always positive)\n */\n get height() {\n return Math.abs(this._height * this.scale.y);\n }\n set width(value) {\n this._width = value;\n this._transformStale = true;\n }\n set height(value) {\n this._height = value;\n this._transformStale = true;\n }\n /**\n * Gets a copy of the bounds in pixels occupied by the graphic on the the screen. This includes scale.\n */\n get localBounds() {\n return _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_3__.BoundingBox.fromDimension(this.width, this.height, _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero);\n }\n /**\n * Draw the whole graphic to the context including transform\n * @param ex The excalibur graphics context\n * @param x\n * @param y\n */\n draw(ex, x, y) {\n this._preDraw(ex, x, y);\n this._drawImage(ex, 0, 0);\n this._postDraw(ex);\n }\n /**\n * Apply affine transformations to the graphics context to manipulate the graphic before {@apilink Graphic._drawImage}\n * @param ex\n * @param x\n * @param y\n */\n _preDraw(ex, x, y) {\n ex.save();\n ex.translate(x, y);\n if (this._transformStale) {\n this.transform.reset();\n this.transform.scale(Math.abs(this.scale.x), Math.abs(this.scale.y));\n this._rotate(this.transform);\n this._flip(this.transform);\n this._transformStale = false;\n }\n ex.multiply(this.transform);\n // it is important to multiply alphas so graphics respect the current context\n ex.opacity = ex.opacity * this.opacity;\n if (this.tint) {\n ex.tint = this.tint;\n }\n }\n _rotate(ex) {\n var _a;\n const scaleDirX = this.scale.x > 0 ? 1 : -1;\n const scaleDirY = this.scale.y > 0 ? 1 : -1;\n const origin = (_a = this.origin) !== null && _a !== void 0 ? _a : (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(this.width / 2, this.height / 2);\n ex.translate(origin.x, origin.y);\n ex.rotate(this.rotation);\n // This is for handling direction changes 1 or -1, that way we don't have mismatched translates()\n ex.scale(scaleDirX, scaleDirY);\n ex.translate(-origin.x, -origin.y);\n }\n _flip(ex) {\n if (this.flipHorizontal) {\n ex.translate(this.width / this.scale.x, 0);\n ex.scale(-1, 1);\n }\n if (this.flipVertical) {\n ex.translate(0, this.height / this.scale.y);\n ex.scale(1, -1);\n }\n }\n /**\n * Apply any additional work after {@apilink Graphic._drawImage} and restore the context state.\n * @param ex\n */\n _postDraw(ex) {\n if (this.showDebug) {\n ex.debug.drawRect(0, 0, this.width, this.height);\n }\n ex.restore();\n }\n}\nGraphic._ID = 0;\n\n\n/***/ }),\n\n/***/ \"./Graphics/GraphicsComponent.ts\":\n/*!***************************************!*\\\n !*** ./Graphics/GraphicsComponent.ts ***!\n \\***************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ GraphicsComponent: () => (/* binding */ GraphicsComponent),\n/* harmony export */ hasGraphicsTick: () => (/* binding */ hasGraphicsTick)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Collision_Index__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Collision/Index */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Component */ \"./EntityComponentSystem/Component.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Math_watch_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/watch-vector */ \"./Math/watch-vector.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Graphics_GraphicsGroup__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Graphics/GraphicsGroup */ \"./Graphics/GraphicsGroup.ts\");\n/* harmony import */ var _Raster__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Raster */ \"./Graphics/Raster.ts\");\n/* harmony import */ var _Text__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Text */ \"./Graphics/Text.ts\");\n\n\n\n\n\n\n\n\n\n\n/**\n * Type guard for checking if a Graphic HasTick (used for graphics that change over time like animations)\n * @param graphic\n */\nfunction hasGraphicsTick(graphic) {\n return !!graphic.tick;\n}\n/**\n * Component to manage drawings, using with the position component\n */\nclass GraphicsComponent extends _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n /**\n * Sets or gets wether any drawing should be visible in this component\n * @deprecated use isVisible\n */\n get visible() {\n return this.isVisible;\n }\n /**\n * Sets or gets wether any drawing should be visible in this component\n * @deprecated use isVisible\n */\n set visible(val) {\n this.isVisible = val;\n }\n /**\n * Offset to apply to graphics by default\n */\n get offset() {\n return this._offset;\n }\n set offset(value) {\n this._offset = new _Math_watch_vector__WEBPACK_IMPORTED_MODULE_1__.WatchVector(value, () => this.recalculateBounds());\n this.recalculateBounds();\n }\n /**\n * Anchor to apply to graphics by default\n */\n get anchor() {\n return this._anchor;\n }\n set anchor(value) {\n this._anchor = new _Math_watch_vector__WEBPACK_IMPORTED_MODULE_1__.WatchVector(value, () => this.recalculateBounds());\n this.recalculateBounds();\n }\n /**\n * Sets the color of the actor's current graphic\n */\n get color() {\n return this._color;\n }\n set color(v) {\n if (v) {\n this._color = v.clone();\n const currentGraphic = this.graphics.current;\n if (currentGraphic instanceof _Raster__WEBPACK_IMPORTED_MODULE_2__.Raster || currentGraphic instanceof _Text__WEBPACK_IMPORTED_MODULE_3__.Text) {\n currentGraphic.color = this._color;\n }\n }\n }\n constructor(options) {\n super();\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_4__.Logger.getInstance();\n this._current = 'default';\n this._graphics = {};\n this._options = {};\n this.material = null;\n /**\n * Sets or gets wether any drawing should be visible in this component\n */\n this.isVisible = true;\n /**\n * Optionally force the graphic onscreen, default false. Not recommend to use for perf reasons, only if you known what you're doing.\n */\n this.forceOnScreen = false;\n /**\n * Sets or gets wither all drawings should have an opacity applied\n */\n this.opacity = 1;\n this._offset = new _Math_watch_vector__WEBPACK_IMPORTED_MODULE_1__.WatchVector(_Math_vector__WEBPACK_IMPORTED_MODULE_5__.Vector.Zero, () => this.recalculateBounds());\n this._anchor = new _Math_watch_vector__WEBPACK_IMPORTED_MODULE_1__.WatchVector(_Math_vector__WEBPACK_IMPORTED_MODULE_5__.Vector.Half, () => this.recalculateBounds());\n /**\n * Flip all graphics horizontally along the y-axis\n */\n this.flipHorizontal = false;\n /**\n * Flip all graphics vertically along the x-axis\n */\n this.flipVertical = false;\n /**\n * If set to true graphics added to the component will be copied. This can effect performance, but is useful if you don't want\n * changes to a graphic to effect all the places it is used.\n */\n this.copyGraphics = false;\n // Defaults\n options = {\n visible: this.isVisible,\n graphics: {},\n ...options\n };\n const { current, anchor, color, opacity, visible, graphics, offset, copyGraphics, onPreDraw, onPostDraw, onPreTransformDraw, onPostTransformDraw } = options;\n for (const [key, graphicOrOptions] of Object.entries(graphics)) {\n if (graphicOrOptions instanceof _Graphic__WEBPACK_IMPORTED_MODULE_6__.Graphic) {\n this._graphics[key] = graphicOrOptions;\n }\n else {\n this._graphics[key] = graphicOrOptions.graphic;\n this._options[key] = graphicOrOptions.options;\n }\n }\n this.offset = offset !== null && offset !== void 0 ? offset : this.offset;\n this.opacity = opacity !== null && opacity !== void 0 ? opacity : this.opacity;\n this.anchor = anchor !== null && anchor !== void 0 ? anchor : this.anchor;\n this.color = color !== null && color !== void 0 ? color : this.color;\n this.copyGraphics = copyGraphics !== null && copyGraphics !== void 0 ? copyGraphics : this.copyGraphics;\n this.onPreDraw = onPreDraw !== null && onPreDraw !== void 0 ? onPreDraw : this.onPreDraw;\n this.onPostDraw = onPostDraw !== null && onPostDraw !== void 0 ? onPostDraw : this.onPostDraw;\n this.onPreDraw = onPreTransformDraw !== null && onPreTransformDraw !== void 0 ? onPreTransformDraw : this.onPreTransformDraw;\n this.onPostTransformDraw = onPostTransformDraw !== null && onPostTransformDraw !== void 0 ? onPostTransformDraw : this.onPostTransformDraw;\n this.isVisible = !!visible;\n this._current = current !== null && current !== void 0 ? current : this._current;\n if (current && this._graphics[current]) {\n this.use(current);\n }\n }\n getGraphic(name) {\n return this._graphics[name];\n }\n getOptions(name) {\n return this._options[name];\n }\n /**\n * Get registered graphics names\n */\n getNames() {\n return Object.keys(this._graphics);\n }\n /**\n * Returns the currently displayed graphic\n */\n get current() {\n return this._graphics[this._current];\n }\n /**\n * Returns the currently displayed graphic offsets\n */\n get currentOptions() {\n return this._options[this._current];\n }\n /**\n * Returns all graphics associated with this component\n */\n get graphics() {\n return this._graphics;\n }\n /**\n * Returns all graphics options associated with this component\n */\n get options() {\n return this._options;\n }\n add(nameOrGraphic, graphicOrOptions, options) {\n let name = 'default';\n let graphicToSet = null;\n let optionsToSet = undefined;\n if (typeof nameOrGraphic === 'string' && graphicOrOptions instanceof _Graphic__WEBPACK_IMPORTED_MODULE_6__.Graphic) {\n name = nameOrGraphic;\n graphicToSet = graphicOrOptions;\n optionsToSet = options;\n }\n if (nameOrGraphic instanceof _Graphic__WEBPACK_IMPORTED_MODULE_6__.Graphic && !(graphicOrOptions instanceof _Graphic__WEBPACK_IMPORTED_MODULE_6__.Graphic)) {\n graphicToSet = nameOrGraphic;\n optionsToSet = graphicOrOptions;\n }\n if (!graphicToSet) {\n throw new Error('Need to provide a graphic or valid graphic string');\n }\n this._graphics[name] = this.copyGraphics ? graphicToSet.clone() : graphicToSet;\n this._options[name] = this.copyGraphics ? { ...optionsToSet } : optionsToSet;\n if (name === 'default') {\n this.use('default');\n }\n return graphicToSet;\n }\n /**\n * Removes a registered graphic, if the removed graphic is the current it will switch to the default\n * @param name\n */\n remove(name) {\n delete this._graphics[name];\n delete this._options[name];\n if (this._current === name) {\n this._current = 'default';\n this.recalculateBounds();\n }\n }\n /**\n * Use a graphic only, will set the default graphic. Returns the new {@apilink Graphic}\n *\n * Optionally override the stored options\n * @param nameOrGraphic\n * @param options\n */\n use(nameOrGraphic, options) {\n var _a;\n if (nameOrGraphic instanceof _Graphic__WEBPACK_IMPORTED_MODULE_6__.Graphic) {\n let graphic = nameOrGraphic;\n if (this.copyGraphics) {\n graphic = nameOrGraphic.clone();\n }\n this._current = 'default';\n this._graphics[this._current] = graphic;\n this._options[this._current] = options;\n }\n else {\n this._current = nameOrGraphic;\n this._options[this._current] = options;\n if (!(this._current in this._graphics)) {\n this._logger.warn(`Graphic ${this._current} is not registered with the graphics component owned by ${(_a = this.owner) === null || _a === void 0 ? void 0 : _a.name}. Nothing will be drawn.`);\n }\n }\n this.recalculateBounds();\n return this.current;\n }\n /**\n * Hide currently shown graphic\n */\n hide() {\n this._current = 'ex.none';\n }\n set localBounds(bounds) {\n this._localBounds = bounds;\n }\n recalculateBounds() {\n let bb = new _Collision_Index__WEBPACK_IMPORTED_MODULE_7__.BoundingBox();\n const graphic = this._graphics[this._current];\n const options = this._options[this._current];\n if (!graphic) {\n this._localBounds = bb;\n return;\n }\n let anchor = this.anchor;\n let offset = this.offset;\n if (options === null || options === void 0 ? void 0 : options.anchor) {\n anchor = options.anchor;\n }\n if (options === null || options === void 0 ? void 0 : options.offset) {\n offset = options.offset;\n }\n const bounds = graphic.localBounds;\n const offsetX = -bounds.width * anchor.x + offset.x;\n const offsetY = -bounds.height * anchor.y + offset.y;\n if (graphic instanceof _Graphics_GraphicsGroup__WEBPACK_IMPORTED_MODULE_8__.GraphicsGroup && !graphic.useAnchor) {\n bb = graphic === null || graphic === void 0 ? void 0 : graphic.localBounds.combine(bb);\n }\n else {\n bb = graphic === null || graphic === void 0 ? void 0 : graphic.localBounds.translate((0,_Math_vector__WEBPACK_IMPORTED_MODULE_5__.vec)(offsetX, offsetY)).combine(bb);\n }\n this._localBounds = bb;\n }\n /**\n * Get local bounds of graphics component\n */\n get localBounds() {\n if (!this._localBounds || this._localBounds.hasZeroDimensions()) {\n this.recalculateBounds();\n }\n return this._localBounds; // recalc guarantees type\n }\n /**\n * Get world bounds of graphics component\n */\n get bounds() {\n let bounds = this.localBounds;\n if (this.owner) {\n const tx = this.owner.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_9__.TransformComponent);\n if (tx) {\n bounds = bounds.transform(tx.get().matrix);\n }\n }\n return bounds;\n }\n /**\n * Update underlying graphics if necessary, called internally\n * @param elapsed\n * @internal\n */\n update(elapsed, idempotencyToken = 0) {\n const graphic = this.current;\n if (graphic && hasGraphicsTick(graphic)) {\n graphic.tick(elapsed, idempotencyToken);\n }\n }\n clone() {\n const graphics = new GraphicsComponent();\n graphics._graphics = { ...this._graphics };\n graphics._options = { ...this._options };\n graphics.offset = this.offset.clone();\n if (this.color) {\n graphics.color = this.color.clone();\n }\n graphics.opacity = this.opacity;\n graphics.anchor = this.anchor.clone();\n graphics.copyGraphics = this.copyGraphics;\n graphics.onPreDraw = this.onPreDraw;\n graphics.onPostDraw = this.onPostDraw;\n graphics.isVisible = this.isVisible;\n return graphics;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/GraphicsDiagnostics.ts\":\n/*!*****************************************!*\\\n !*** ./Graphics/GraphicsDiagnostics.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ GraphicsDiagnostics: () => (/* binding */ GraphicsDiagnostics)\n/* harmony export */ });\nclass GraphicsDiagnostics {\n static clear() {\n GraphicsDiagnostics.DrawCallCount = 0;\n GraphicsDiagnostics.DrawnImagesCount = 0;\n }\n}\nGraphicsDiagnostics.DrawCallCount = 0;\nGraphicsDiagnostics.DrawnImagesCount = 0;\n\n\n/***/ }),\n\n/***/ \"./Graphics/GraphicsGroup.ts\":\n/*!***********************************!*\\\n !*** ./Graphics/GraphicsGroup.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ GraphicsGroup: () => (/* binding */ GraphicsGroup)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Animation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Animation */ \"./Graphics/Animation.ts\");\n/* harmony import */ var _Collision_Index__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Collision/Index */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n\n\n\n\n\nclass GraphicsGroup extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n constructor(options) {\n var _a;\n super(options);\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this.useAnchor = true;\n this.members = [];\n this.members = options.members;\n this.useAnchor = (_a = options.useAnchor) !== null && _a !== void 0 ? _a : this.useAnchor;\n this._updateDimensions();\n }\n clone() {\n return new GraphicsGroup({\n members: [...this.members],\n ...this.cloneGraphicOptions()\n });\n }\n _updateDimensions() {\n const bb = this.localBounds;\n this.width = bb.width;\n this.height = bb.height;\n return bb;\n }\n get localBounds() {\n const bb = new _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox();\n for (const member of this.members) {\n if (member instanceof _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic) {\n member.localBounds.combine(bb, bb);\n }\n else {\n const { graphic, offset: pos, useBounds } = member;\n const shouldUseBounds = useBounds === undefined ? true : useBounds;\n if (graphic) {\n if (shouldUseBounds) {\n graphic.localBounds.translate(pos).combine(bb, bb);\n }\n }\n else {\n this._logger.warnOnce(`Graphics group member has an null or undefined graphic, member definition: ${JSON.stringify(member)}.`);\n }\n }\n }\n return bb;\n }\n _isAnimationOrGroup(graphic) {\n return graphic instanceof _Animation__WEBPACK_IMPORTED_MODULE_3__.Animation || graphic instanceof GraphicsGroup;\n }\n tick(elapsed, idempotencyToken) {\n for (const member of this.members) {\n let graphic;\n if (member instanceof _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic) {\n graphic = member;\n }\n else {\n graphic = member.graphic;\n }\n if (this._isAnimationOrGroup(graphic)) {\n graphic.tick(elapsed, idempotencyToken);\n }\n }\n }\n reset() {\n for (const member of this.members) {\n let graphic;\n if (member instanceof _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic) {\n graphic = member;\n }\n else {\n graphic = member.graphic;\n }\n if (this._isAnimationOrGroup(graphic)) {\n graphic.reset();\n }\n }\n }\n _preDraw(ex, x, y) {\n this._updateDimensions();\n super._preDraw(ex, this.useAnchor ? x : 0, this.useAnchor ? y : 0);\n }\n _drawImage(ex, x, y) {\n const pos = _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero;\n for (const member of this.members) {\n let graphic;\n if (member instanceof _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic) {\n graphic = member;\n }\n else {\n graphic = member.graphic;\n member.offset.clone(pos);\n }\n if (!graphic) {\n continue;\n }\n ex.save();\n ex.translate(x, y);\n graphic.draw(ex, pos.x, pos.y);\n if (this.showDebug) {\n /* istanbul ignore next */\n ex.debug.drawRect(0, 0, this.width, this.height);\n }\n ex.restore();\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/GraphicsSystem.ts\":\n/*!************************************!*\\\n !*** ./Graphics/GraphicsSystem.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ GraphicsSystem: () => (/* binding */ GraphicsSystem)\n/* harmony export */ });\n/* harmony import */ var _GraphicsComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Priority.ts\");\n/* harmony import */ var _GraphicsGroup__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./GraphicsGroup */ \"./Graphics/GraphicsGroup.ts\");\n/* harmony import */ var _ParallaxComponent__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./ParallaxComponent */ \"./Graphics/ParallaxComponent.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Math/coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../Collision/BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _FontCache__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./FontCache */ \"./Graphics/FontCache.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _Math_transform__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/transform */ \"./Math/transform.ts\");\n/* harmony import */ var _TransformInterpolation__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./TransformInterpolation */ \"./Graphics/TransformInterpolation.ts\");\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass GraphicsSystem extends _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_0__.System {\n get sortedTransforms() {\n return this._sortedTransforms;\n }\n constructor(world) {\n super();\n this.world = world;\n this.systemType = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_0__.SystemType.Draw;\n this._token = 0;\n this._sortedTransforms = [];\n this._zHasChanged = false;\n this._zIndexUpdate = () => {\n this._zHasChanged = true;\n };\n this._targetInterpolationTransform = new _Math_transform__WEBPACK_IMPORTED_MODULE_1__.Transform();\n this.query = this.world.query([_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent, _GraphicsComponent__WEBPACK_IMPORTED_MODULE_3__.GraphicsComponent]);\n this.query.entityAdded$.subscribe((e) => {\n const tx = e.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n this._sortedTransforms.push(tx);\n tx.zIndexChanged$.subscribe(this._zIndexUpdate);\n this._zHasChanged = true;\n });\n this.query.entityRemoved$.subscribe((e) => {\n const tx = e.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n tx.zIndexChanged$.unsubscribe(this._zIndexUpdate);\n const index = this._sortedTransforms.indexOf(tx);\n if (index > -1) {\n this._sortedTransforms.splice(index, 1);\n }\n });\n }\n initialize(world, scene) {\n this._camera = scene.camera;\n this._engine = scene.engine;\n }\n preupdate() {\n // Graphics context could be switched to fallback in a new frame\n this._graphicsContext = this._engine.graphicsContext;\n if (this._zHasChanged) {\n this._sortedTransforms.sort((a, b) => {\n return a.globalZ - b.globalZ;\n });\n this._zHasChanged = false;\n }\n }\n update(elapsed) {\n this._token++;\n let graphics;\n _FontCache__WEBPACK_IMPORTED_MODULE_4__.FontCache.checkAndClearCache();\n // This is a performance enhancement, most things are in world space\n // so if we can only do this once saves a ton of transform updates\n this._graphicsContext.save();\n if (this._camera) {\n this._camera.draw(this._graphicsContext);\n }\n for (let transformIndex = 0; transformIndex < this._sortedTransforms.length; transformIndex++) {\n const transform = this._sortedTransforms[transformIndex];\n const entity = transform.owner;\n // If the entity is offscreen skip\n if (entity.hasTag('ex.offscreen')) {\n continue;\n }\n graphics = entity.get(_GraphicsComponent__WEBPACK_IMPORTED_MODULE_3__.GraphicsComponent);\n // Exit if graphics set to not visible\n if (!graphics.isVisible) {\n continue;\n }\n // Optionally run the onPreTransformDraw graphics lifecycle draw\n if (graphics.onPreTransformDraw) {\n graphics.onPreTransformDraw(this._graphicsContext, elapsed);\n }\n entity.events.emit('pretransformdraw', new _Events__WEBPACK_IMPORTED_MODULE_5__.PreTransformDrawEvent(this._graphicsContext, elapsed, entity));\n // This optionally sets our camera based on the entity coord plan (world vs. screen)\n if (transform.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__.CoordPlane.Screen) {\n this._graphicsContext.restore();\n }\n this._graphicsContext.save();\n if (transform.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__.CoordPlane.Screen) {\n this._graphicsContext.translate(this._engine.screen.contentArea.left, this._engine.screen.contentArea.top);\n }\n // Tick any graphics state (but only once) for animations and graphics groups\n graphics.update(elapsed, this._token);\n // Apply parallax\n const parallax = entity.get(_ParallaxComponent__WEBPACK_IMPORTED_MODULE_7__.ParallaxComponent);\n if (parallax) {\n // We use the Tiled formula\n // https://doc.mapeditor.org/en/latest/manual/layers/#parallax-scrolling-factor\n // cameraPos * (1 - parallaxFactor)\n const oneMinusFactor = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.One.sub(parallax.parallaxFactor);\n const parallaxOffset = this._camera.drawPos.scale(oneMinusFactor);\n this._graphicsContext.translate(parallaxOffset.x, parallaxOffset.y);\n }\n // Position the entity + estimate lag\n this._applyTransform(entity);\n // If there is a material enable it on the context\n if (graphics.material) {\n this._graphicsContext.material = graphics.material;\n }\n // Optionally run the onPreDraw graphics lifecycle draw\n if (graphics.onPreDraw) {\n graphics.onPreDraw(this._graphicsContext, elapsed);\n }\n entity.events.emit('predraw', new _Events__WEBPACK_IMPORTED_MODULE_5__.PreDrawEvent(this._graphicsContext, elapsed, entity));\n // this._graphicsContext.opacity *= graphics.opacity;\n this._applyOpacity(entity);\n // Draw the graphics component\n this._drawGraphicsComponent(graphics, transform);\n // Optionally run the onPostDraw graphics lifecycle draw\n if (graphics.onPostDraw) {\n graphics.onPostDraw(this._graphicsContext, elapsed);\n }\n entity.events.emit('postdraw', new _Events__WEBPACK_IMPORTED_MODULE_5__.PostDrawEvent(this._graphicsContext, elapsed, entity));\n this._graphicsContext.restore();\n // Reset the transform back to the original world space\n if (transform.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__.CoordPlane.Screen) {\n this._graphicsContext.save();\n if (this._camera) {\n this._camera.draw(this._graphicsContext);\n }\n }\n // Optionally run the onPreTransformDraw graphics lifecycle draw\n if (graphics.onPostTransformDraw) {\n graphics.onPostTransformDraw(this._graphicsContext, elapsed);\n }\n entity.events.emit('posttransformdraw', new _Events__WEBPACK_IMPORTED_MODULE_5__.PostTransformDrawEvent(this._graphicsContext, elapsed, entity));\n }\n this._graphicsContext.restore();\n }\n _drawGraphicsComponent(graphicsComponent, transformComponent) {\n var _a, _b;\n if (graphicsComponent.isVisible) {\n const flipHorizontal = graphicsComponent.flipHorizontal;\n const flipVertical = graphicsComponent.flipVertical;\n const graphic = graphicsComponent.current;\n const options = (_a = graphicsComponent.currentOptions) !== null && _a !== void 0 ? _a : {};\n if (graphic) {\n let anchor = graphicsComponent.anchor;\n let offset = graphicsComponent.offset;\n let scaleX = 1;\n let scaleY = 1;\n // handle specific overrides\n if (options === null || options === void 0 ? void 0 : options.anchor) {\n anchor = options.anchor;\n }\n if (options === null || options === void 0 ? void 0 : options.offset) {\n offset = options.offset;\n }\n const globalScale = transformComponent.globalScale;\n scaleX *= graphic.scale.x * globalScale.x;\n scaleY *= graphic.scale.y * globalScale.y;\n // See https://github.com/excaliburjs/Excalibur/pull/619 for discussion on this formula\n const offsetX = -graphic.width * anchor.x + offset.x * scaleX;\n const offsetY = -graphic.height * anchor.y + offset.y * scaleY;\n const oldFlipHorizontal = graphic.flipHorizontal;\n const oldFlipVertical = graphic.flipVertical;\n if (flipHorizontal || flipVertical) {\n // flip any currently flipped graphics\n graphic.flipHorizontal = flipHorizontal ? !oldFlipHorizontal : oldFlipHorizontal;\n graphic.flipVertical = flipVertical ? !oldFlipVertical : oldFlipVertical;\n }\n graphic === null || graphic === void 0 ? void 0 : graphic.draw(this._graphicsContext, offsetX, offsetY);\n if (flipHorizontal || flipVertical) {\n graphic.flipHorizontal = oldFlipHorizontal;\n graphic.flipVertical = oldFlipVertical;\n }\n // TODO move debug code out?\n if (((_b = this._engine) === null || _b === void 0 ? void 0 : _b.isDebug) && this._engine.debug.graphics.showBounds) {\n const offset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_8__.vec)(offsetX, offsetY);\n if (graphic instanceof _GraphicsGroup__WEBPACK_IMPORTED_MODULE_9__.GraphicsGroup) {\n for (const member of graphic.members) {\n let g;\n let pos = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Zero;\n if (member instanceof _Graphic__WEBPACK_IMPORTED_MODULE_10__.Graphic) {\n g = member;\n }\n else {\n g = member.graphic;\n pos = member.offset;\n }\n if (graphic.useAnchor) {\n g === null || g === void 0 ? void 0 : g.localBounds.translate(offset.add(pos)).draw(this._graphicsContext, this._engine.debug.graphics.boundsColor);\n }\n else {\n g === null || g === void 0 ? void 0 : g.localBounds.translate(pos).draw(this._graphicsContext, this._engine.debug.graphics.boundsColor);\n }\n }\n }\n else {\n /* istanbul ignore next */\n graphic === null || graphic === void 0 ? void 0 : graphic.localBounds.translate(offset).draw(this._graphicsContext, this._engine.debug.graphics.boundsColor);\n }\n }\n }\n }\n }\n /**\n * This applies the current entity transform to the graphics context\n * @param entity\n */\n _applyTransform(entity) {\n const ancestors = entity.getAncestors();\n for (let i = 0; i < ancestors.length; i++) {\n const ancestor = ancestors[i];\n const transform = ancestor === null || ancestor === void 0 ? void 0 : ancestor.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n const optionalBody = ancestor === null || ancestor === void 0 ? void 0 : ancestor.get(_Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_11__.BodyComponent);\n if (transform) {\n let tx = transform.get();\n if (optionalBody) {\n if (this._engine.fixedUpdateTimestep && optionalBody.__oldTransformCaptured && optionalBody.enableFixedUpdateInterpolate) {\n // Interpolate graphics if needed\n const blend = this._engine.currentFrameLagMs / this._engine.fixedUpdateTimestep;\n tx = (0,_TransformInterpolation__WEBPACK_IMPORTED_MODULE_12__.blendTransform)(optionalBody.oldTransform, transform.get(), blend, this._targetInterpolationTransform);\n }\n }\n this._graphicsContext.z = transform.globalZ;\n this._graphicsContext.translate(tx.pos.x, tx.pos.y);\n this._graphicsContext.scale(tx.scale.x, tx.scale.y);\n this._graphicsContext.rotate(tx.rotation);\n }\n }\n }\n _applyOpacity(entity) {\n var _a;\n const ancestors = entity.getAncestors();\n for (let i = 0; i < ancestors.length; i++) {\n const ancestor = ancestors[i];\n const maybeGraphics = ancestor === null || ancestor === void 0 ? void 0 : ancestor.get(_GraphicsComponent__WEBPACK_IMPORTED_MODULE_3__.GraphicsComponent);\n this._graphicsContext.opacity *= (_a = maybeGraphics === null || maybeGraphics === void 0 ? void 0 : maybeGraphics.opacity) !== null && _a !== void 0 ? _a : 1;\n }\n }\n}\nGraphicsSystem.priority = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_13__.SystemPriority.Average;\n\n\n/***/ }),\n\n/***/ \"./Graphics/ImageSource.ts\":\n/*!*********************************!*\\\n !*** ./Graphics/ImageSource.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ImageSource: () => (/* binding */ ImageSource),\n/* harmony export */ ImageSourceAttributeConstants: () => (/* binding */ ImageSourceAttributeConstants)\n/* harmony export */ });\n/* harmony import */ var _Resources_Resource__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Resources/Resource */ \"./Resources/Resource.ts\");\n/* harmony import */ var _Sprite__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Sprite */ \"./Graphics/Sprite.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Future */ \"./Util/Future.ts\");\n/* harmony import */ var _Graphics_Context_texture_loader__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Graphics/Context/texture-loader */ \"./Graphics/Context/texture-loader.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Wrapping */ \"./Graphics/Wrapping.ts\");\n\n\n\n\n\n\n\nconst ImageSourceAttributeConstants = {\n Filtering: 'filtering',\n WrappingX: 'wrapping-x',\n WrappingY: 'wrapping-y'\n};\nclass ImageSource {\n /**\n * The original size of the source image in pixels\n */\n get width() {\n return this.image.naturalWidth;\n }\n /**\n * The original height of the source image in pixels\n */\n get height() {\n return this.image.naturalHeight;\n }\n /**\n * Returns true if the Texture is completely loaded and is ready\n * to be drawn.\n */\n isLoaded() {\n if (!this._src) {\n // this boosts speed of access\n this._src = this.data.src;\n }\n return !!this._src;\n }\n get image() {\n return this.data;\n }\n constructor(pathOrBase64, bustCacheOrOptions, filtering) {\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance();\n /**\n * Access to the underlying html image element\n */\n this.data = new Image();\n this._readyFuture = new _Util_Future__WEBPACK_IMPORTED_MODULE_1__.Future();\n /**\n * Promise the resolves when the image is loaded and ready for use, does not initiate loading\n */\n this.ready = this._readyFuture.promise;\n this.path = pathOrBase64;\n let bustCache = false;\n let wrapping;\n if (typeof bustCacheOrOptions === 'boolean') {\n bustCache = bustCacheOrOptions;\n }\n else {\n ({ filtering, wrapping, bustCache } = { ...bustCacheOrOptions });\n }\n this._resource = new _Resources_Resource__WEBPACK_IMPORTED_MODULE_2__.Resource(pathOrBase64, 'blob', bustCache);\n this.filtering = filtering !== null && filtering !== void 0 ? filtering : this.filtering;\n if (typeof wrapping === 'string') {\n this.wrapping = {\n x: wrapping,\n y: wrapping\n };\n }\n else {\n this.wrapping = wrapping !== null && wrapping !== void 0 ? wrapping : this.wrapping;\n }\n if (pathOrBase64.endsWith('.gif')) {\n this._logger.warn(`Use the ex.Gif type to load gifs, you may have mixed results with ${pathOrBase64} in ex.ImageSource. Fully supported: svg, jpg, bmp, and png`);\n }\n }\n /**\n * Create an ImageSource from and HTML tag element\n * @param image\n */\n static fromHtmlImageElement(image, options) {\n const imageSource = new ImageSource('');\n imageSource._src = 'image-element';\n imageSource.data = image;\n imageSource.data.setAttribute('data-original-src', 'image-element');\n if (options === null || options === void 0 ? void 0 : options.filtering) {\n imageSource.data.setAttribute(ImageSourceAttributeConstants.Filtering, options === null || options === void 0 ? void 0 : options.filtering);\n }\n else {\n imageSource.data.setAttribute(ImageSourceAttributeConstants.Filtering, _Filtering__WEBPACK_IMPORTED_MODULE_3__.ImageFiltering.Blended);\n }\n if (options === null || options === void 0 ? void 0 : options.wrapping) {\n let wrapping;\n if (typeof options.wrapping === 'string') {\n wrapping = {\n x: options.wrapping,\n y: options.wrapping\n };\n }\n else {\n wrapping = {\n x: options.wrapping.x,\n y: options.wrapping.y\n };\n }\n imageSource.data.setAttribute(ImageSourceAttributeConstants.WrappingX, wrapping.x);\n imageSource.data.setAttribute(ImageSourceAttributeConstants.WrappingY, wrapping.y);\n }\n else {\n imageSource.data.setAttribute(ImageSourceAttributeConstants.WrappingX, _Wrapping__WEBPACK_IMPORTED_MODULE_4__.ImageWrapping.Clamp);\n imageSource.data.setAttribute(ImageSourceAttributeConstants.WrappingY, _Wrapping__WEBPACK_IMPORTED_MODULE_4__.ImageWrapping.Clamp);\n }\n _Graphics_Context_texture_loader__WEBPACK_IMPORTED_MODULE_5__.TextureLoader.checkImageSizeSupportedAndLog(image);\n imageSource._readyFuture.resolve(image);\n return imageSource;\n }\n static fromHtmlCanvasElement(image, options) {\n const imageSource = new ImageSource('');\n imageSource._src = 'canvas-element-blob';\n imageSource.data.setAttribute('data-original-src', 'canvas-element-blob');\n if (options === null || options === void 0 ? void 0 : options.filtering) {\n imageSource.data.setAttribute(ImageSourceAttributeConstants.Filtering, options === null || options === void 0 ? void 0 : options.filtering);\n }\n else {\n imageSource.data.setAttribute(ImageSourceAttributeConstants.Filtering, _Filtering__WEBPACK_IMPORTED_MODULE_3__.ImageFiltering.Blended);\n }\n if (options === null || options === void 0 ? void 0 : options.wrapping) {\n let wrapping;\n if (typeof options.wrapping === 'string') {\n wrapping = {\n x: options.wrapping,\n y: options.wrapping\n };\n }\n else {\n wrapping = {\n x: options.wrapping.x,\n y: options.wrapping.y\n };\n }\n imageSource.data.setAttribute(ImageSourceAttributeConstants.WrappingX, wrapping.x);\n imageSource.data.setAttribute(ImageSourceAttributeConstants.WrappingY, wrapping.y);\n }\n else {\n imageSource.data.setAttribute(ImageSourceAttributeConstants.WrappingX, _Wrapping__WEBPACK_IMPORTED_MODULE_4__.ImageWrapping.Clamp);\n imageSource.data.setAttribute(ImageSourceAttributeConstants.WrappingY, _Wrapping__WEBPACK_IMPORTED_MODULE_4__.ImageWrapping.Clamp);\n }\n _Graphics_Context_texture_loader__WEBPACK_IMPORTED_MODULE_5__.TextureLoader.checkImageSizeSupportedAndLog(image);\n image.toBlob((blob) => {\n // TODO throw? if blob null?\n const url = URL.createObjectURL(blob);\n imageSource.image.onload = () => {\n // no longer need to read the blob so it's revoked\n URL.revokeObjectURL(url);\n imageSource.data = imageSource.image;\n imageSource._readyFuture.resolve(imageSource.image);\n };\n imageSource.image.src = url;\n });\n return imageSource;\n }\n static fromSvgString(svgSource, options) {\n const blob = new Blob([svgSource], { type: 'image/svg+xml' });\n const url = URL.createObjectURL(blob);\n return new ImageSource(url, options);\n }\n /**\n * Should excalibur add a cache busting querystring? By default false.\n * Must be set before loading\n */\n get bustCache() {\n return this._resource.bustCache;\n }\n set bustCache(val) {\n this._resource.bustCache = val;\n }\n /**\n * Begins loading the image and returns a promise that resolves when the image is loaded\n */\n async load() {\n var _a, _b, _c, _d;\n if (this.isLoaded()) {\n return this.data;\n }\n try {\n // Load base64 or blob if needed\n let url;\n if (!this.path.includes('data:image/')) {\n const blob = await this._resource.load();\n url = URL.createObjectURL(blob);\n }\n else {\n url = this.path;\n }\n // Decode the image\n const image = new Image();\n // Use Image.onload over Image.decode()\n // https://bugs.chromium.org/p/chromium/issues/detail?id=1055828#c7\n // Otherwise chrome will throw still Image.decode() failures for large textures\n const loadedFuture = new _Util_Future__WEBPACK_IMPORTED_MODULE_1__.Future();\n image.onload = () => loadedFuture.resolve();\n image.src = url;\n image.setAttribute('data-original-src', this.path);\n await loadedFuture.promise;\n // Set results\n // We defer loading the texture into webgl until the first draw that way we avoid a singleton\n // and for the multi-engine case the texture needs to be created in EACH webgl context to work\n // See image-renderer.ts draw()\n this.data = image;\n // emit warning if potentially too big\n _Graphics_Context_texture_loader__WEBPACK_IMPORTED_MODULE_5__.TextureLoader.checkImageSizeSupportedAndLog(this.data);\n }\n catch (error) {\n throw `Error loading ImageSource from path '${this.path}' with error [${error.message}]`;\n }\n // Do a bad thing to pass the filtering as an attribute\n this.data.setAttribute(ImageSourceAttributeConstants.Filtering, this.filtering); // TODO fix type\n this.data.setAttribute(ImageSourceAttributeConstants.WrappingX, (_b = (_a = this.wrapping) === null || _a === void 0 ? void 0 : _a.x) !== null && _b !== void 0 ? _b : _Wrapping__WEBPACK_IMPORTED_MODULE_4__.ImageWrapping.Clamp);\n this.data.setAttribute(ImageSourceAttributeConstants.WrappingY, (_d = (_c = this.wrapping) === null || _c === void 0 ? void 0 : _c.y) !== null && _d !== void 0 ? _d : _Wrapping__WEBPACK_IMPORTED_MODULE_4__.ImageWrapping.Clamp);\n // todo emit complete\n this._readyFuture.resolve(this.data);\n return this.data;\n }\n /**\n * Build a sprite from this ImageSource\n */\n toSprite(options) {\n return _Sprite__WEBPACK_IMPORTED_MODULE_6__.Sprite.from(this, options);\n }\n /**\n * Unload images from memory\n */\n unload() {\n this.data = new Image();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Line.ts\":\n/*!**************************!*\\\n !*** ./Graphics/Line.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Line: () => (/* binding */ Line)\n/* harmony export */ });\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n\n\n\nclass Line extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n constructor(options) {\n super();\n this.color = _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Black;\n this.thickness = 1;\n const { start, end, color, thickness } = options;\n this.start = start;\n this.end = end;\n this.color = color !== null && color !== void 0 ? color : this.color;\n this.thickness = thickness !== null && thickness !== void 0 ? thickness : this.thickness;\n this._localBounds = this._calculateBounds();\n const { width, height } = this._localBounds;\n this.width = width;\n this.height = height;\n }\n get localBounds() {\n return this._localBounds;\n }\n _calculateBounds() {\n const lineNormal = this.end.sub(this.start).normal();\n const halfThickness = this.thickness / 2;\n const points = [\n this.start.add(lineNormal.scale(halfThickness)),\n this.end.add(lineNormal.scale(halfThickness)),\n this.end.add(lineNormal.scale(-halfThickness)),\n this.start.add(lineNormal.scale(-halfThickness))\n ];\n return _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromPoints(points);\n }\n _drawImage(ctx, _x, _y) {\n ctx.drawLine(this.start, this.end, this.color, this.thickness);\n }\n clone() {\n return new Line({\n start: this.start,\n end: this.end,\n color: this.color,\n thickness: this.thickness\n });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/NineSlice.ts\":\n/*!*******************************!*\\\n !*** ./Graphics/NineSlice.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ NineSlice: () => (/* binding */ NineSlice),\n/* harmony export */ NineSliceStretch: () => (/* binding */ NineSliceStretch)\n/* harmony export */ });\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n\n\n\n/**\n * Nine slice stretch mode\n */\nvar NineSliceStretch;\n(function (NineSliceStretch) {\n /**\n * Stretch the image across a dimension\n */\n NineSliceStretch[\"Stretch\"] = \"stretch\";\n /**\n * Tile the image across a dimension\n */\n NineSliceStretch[\"Tile\"] = \"tile\";\n /**\n * Tile the image across a dimension but only by whole image amounts\n */\n NineSliceStretch[\"TileFit\"] = \"tile-fit\";\n})(NineSliceStretch || (NineSliceStretch = {}));\nclass NineSlice extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n constructor(config) {\n super(config);\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this._config = config;\n this._imgSource = config.source;\n this._canvasA = document.createElement('canvas');\n this._canvasB = document.createElement('canvas');\n this._canvasC = document.createElement('canvas');\n this._canvasD = document.createElement('canvas');\n this._canvasE = document.createElement('canvas');\n this._canvasF = document.createElement('canvas');\n this._canvasG = document.createElement('canvas');\n this._canvasH = document.createElement('canvas');\n this._canvasI = document.createElement('canvas');\n this._initialize();\n this._imgSource.ready.then(() => {\n this._initialize();\n });\n }\n /**\n * Sets the target width of the 9 slice (pixels), and recalculates the 9 slice if desired (auto)\n * @param newWidth\n * @param auto\n */\n setTargetWidth(newWidth, auto = false) {\n this._config.width = newWidth;\n if (auto) {\n this._initialize();\n }\n }\n /**\n * Sets the target height of the 9 slice (pixels), and recalculates the 9 slice if desired (auto)\n * @param newHeight\n * @param auto\n */\n setTargetHeight(newHeight, auto = false) {\n this._config.height = newHeight;\n if (auto) {\n this._initialize();\n }\n }\n /**\n * Sets the 9 slice margins (pixels), and recalculates the 9 slice if desired (auto)\n */\n setMargins(left, top, right, bottom, auto = false) {\n this._config.sourceConfig.leftMargin = left;\n this._config.sourceConfig.topMargin = top;\n this._config.sourceConfig.rightMargin = right;\n this._config.sourceConfig.bottomMargin = bottom;\n if (auto) {\n this._initialize();\n }\n }\n /**\n * Sets the stretching strategy for the 9 slice, and recalculates the 9 slice if desired (auto)\n *\n */\n setStretch(type, stretch, auto = false) {\n if (type === 'horizontal') {\n this._config.destinationConfig.horizontalStretch = stretch;\n }\n else if (type === 'vertical') {\n this._config.destinationConfig.verticalStretch = stretch;\n }\n else {\n this._config.destinationConfig.horizontalStretch = stretch;\n this._config.destinationConfig.verticalStretch = stretch;\n }\n if (auto) {\n this._initialize();\n }\n }\n /**\n * Returns the config of the 9 slice\n */\n getConfig() {\n return this._config;\n }\n /**\n * Draws 1 of the 9 tiles based on parameters passed in\n * context is the ExcaliburGraphicsContext from the _drawImage function\n * destinationSize is the size of the destination image as a vector (width,height)\n * targetCanvas is the canvas to draw to\n * horizontalStretch and verticalStretch are the horizontal and vertical stretching strategies\n * marginW and marginH are optional margins for the 9 slice for positioning\n * @param context\n * @param targetCanvas\n * @param destinationSize\n * @param horizontalStretch\n * @param verticalStretch\n * @param marginWidth\n * @param marginHeight\n */\n _drawTile(context, targetCanvas, destinationSize, horizontalStretch, verticalStretch, marginWidth, marginHeight) {\n const tempMarginW = marginWidth || 0;\n const tempMarginH = marginHeight || 0;\n let tempSizeX, tempPositionX, tempSizeY, tempPositionY;\n const numTilesX = this._getNumberOfTiles(targetCanvas.width, destinationSize.x, horizontalStretch);\n const numTilesY = this._getNumberOfTiles(targetCanvas.height, destinationSize.y, verticalStretch);\n for (let i = 0; i < numTilesX; i++) {\n for (let j = 0; j < numTilesY; j++) {\n let { tempSize, tempPosition } = this._calculateParams(i, numTilesX, targetCanvas.width, destinationSize.x, this._config.destinationConfig.horizontalStretch);\n tempSizeX = tempSize;\n tempPositionX = tempPosition;\n ({ tempSize, tempPosition } = this._calculateParams(j, numTilesY, targetCanvas.height, destinationSize.y, this._config.destinationConfig.verticalStretch));\n tempSizeY = tempSize;\n tempPositionY = tempPosition;\n context.drawImage(targetCanvas, 0, 0, targetCanvas.width, targetCanvas.height, tempMarginW + tempPositionX, tempMarginH + tempPositionY, tempSizeX, tempSizeY);\n }\n }\n }\n /**\n * Draws the 9 slices to the canvas\n */\n _drawImage(ex, x, y) {\n if (this._imgSource.isLoaded()) {\n // Top left, no stretching\n this._drawTile(ex, this._canvasA, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.sourceConfig.leftMargin, this._config.sourceConfig.topMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch);\n // Top, middle, horizontal stretching\n this._drawTile(ex, this._canvasB, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.width - this._config.sourceConfig.leftMargin - this._config.sourceConfig.rightMargin, this._config.sourceConfig.topMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch, this._config.sourceConfig.leftMargin, 0);\n // Top right, no stretching\n this._drawTile(ex, this._canvasC, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.sourceConfig.rightMargin, this._config.sourceConfig.topMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch, this._config.width - this._config.sourceConfig.rightMargin, 0);\n // middle, left, vertical stretching\n this._drawTile(ex, this._canvasD, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.sourceConfig.leftMargin, this._config.height - this._config.sourceConfig.bottomMargin - this._config.sourceConfig.topMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch, 0, this._config.sourceConfig.topMargin);\n // center, both stretching\n if (this._config.destinationConfig.drawCenter) {\n this._drawTile(ex, this._canvasE, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.width - this._config.sourceConfig.leftMargin - this._config.sourceConfig.rightMargin, this._config.height - this._config.sourceConfig.bottomMargin - this._config.sourceConfig.topMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch, this._config.sourceConfig.leftMargin, this._config.sourceConfig.topMargin);\n }\n // middle, right, vertical stretching\n this._drawTile(ex, this._canvasF, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.sourceConfig.rightMargin, this._config.height - this._config.sourceConfig.bottomMargin - this._config.sourceConfig.topMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch, this._config.width - this._config.sourceConfig.rightMargin, this._config.sourceConfig.topMargin);\n // bottom left, no stretching\n this._drawTile(ex, this._canvasG, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.sourceConfig.leftMargin, this._config.sourceConfig.bottomMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch, 0, this._config.height - this._config.sourceConfig.bottomMargin);\n // bottom middle, horizontal stretching\n this._drawTile(ex, this._canvasH, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.width - this._config.sourceConfig.leftMargin - this._config.sourceConfig.rightMargin, this._config.sourceConfig.bottomMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch, this._config.sourceConfig.leftMargin, this._config.height - this._config.sourceConfig.bottomMargin);\n // bottom right, no stretching\n this._drawTile(ex, this._canvasI, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.sourceConfig.rightMargin, this._config.sourceConfig.bottomMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch, this._config.width - this._config.sourceConfig.rightMargin, this._config.height - this._config.sourceConfig.bottomMargin);\n }\n else {\n this._logger.warnOnce(`NineSlice ImageSource ${this._imgSource.path}` +\n ` is not yet loaded and won't be drawn. Please call .load() or include in a Loader.\\n\\n` +\n `Read https://excaliburjs.com/docs/imagesource for more information.`);\n }\n }\n /**\n * Slices the source sprite into the 9 slice canvases internally\n */\n _initialize() {\n this._sourceSprite = this._imgSource.image;\n // top left slice\n this._canvasA.width = this._config.sourceConfig.leftMargin;\n this._canvasA.height = this._config.sourceConfig.topMargin;\n const aCtx = this._canvasA.getContext('2d');\n aCtx === null || aCtx === void 0 ? void 0 : aCtx.drawImage(this._sourceSprite, 0, 0, this._canvasA.width, this._canvasA.height, 0, 0, this._canvasA.width, this._canvasA.height);\n // top slice\n this._canvasB.width = this._config.sourceConfig.width - this._config.sourceConfig.leftMargin - this._config.sourceConfig.rightMargin;\n this._canvasB.height = this._config.sourceConfig.topMargin;\n const bCtx = this._canvasB.getContext('2d');\n bCtx === null || bCtx === void 0 ? void 0 : bCtx.drawImage(this._sourceSprite, this._config.sourceConfig.leftMargin, 0, this._canvasB.width, this._canvasB.height, 0, 0, this._canvasB.width, this._canvasB.height);\n // top right slice\n this._canvasC.width = this._config.sourceConfig.rightMargin;\n this._canvasC.height = this._config.sourceConfig.topMargin;\n const cCtx = this._canvasC.getContext('2d');\n cCtx === null || cCtx === void 0 ? void 0 : cCtx.drawImage(this._sourceSprite, this._sourceSprite.width - this._config.sourceConfig.rightMargin, 0, this._canvasC.width, this._canvasC.height, 0, 0, this._canvasC.width, this._canvasC.height);\n // middle left slice\n this._canvasD.width = this._config.sourceConfig.leftMargin;\n this._canvasD.height = this._config.sourceConfig.height - this._config.sourceConfig.topMargin - this._config.sourceConfig.bottomMargin;\n const dCtx = this._canvasD.getContext('2d');\n dCtx === null || dCtx === void 0 ? void 0 : dCtx.drawImage(this._sourceSprite, 0, this._config.sourceConfig.topMargin, this._canvasD.width, this._canvasD.height, 0, 0, this._canvasD.width, this._canvasD.height);\n // middle slice\n this._canvasE.width = this._config.sourceConfig.width - this._config.sourceConfig.leftMargin - this._config.sourceConfig.rightMargin;\n this._canvasE.height = this._config.sourceConfig.height - this._config.sourceConfig.topMargin - this._config.sourceConfig.bottomMargin;\n const eCtx = this._canvasE.getContext('2d');\n eCtx === null || eCtx === void 0 ? void 0 : eCtx.drawImage(this._sourceSprite, this._config.sourceConfig.leftMargin, this._config.sourceConfig.topMargin, this._canvasE.width, this._canvasE.height, 0, 0, this._canvasE.width, this._canvasE.height);\n // middle right slice\n this._canvasF.width = this._config.sourceConfig.rightMargin;\n this._canvasF.height = this._config.sourceConfig.height - this._config.sourceConfig.topMargin - this._config.sourceConfig.bottomMargin;\n const fCtx = this._canvasF.getContext('2d');\n fCtx === null || fCtx === void 0 ? void 0 : fCtx.drawImage(this._sourceSprite, this._config.sourceConfig.width - this._config.sourceConfig.rightMargin, this._config.sourceConfig.topMargin, this._canvasF.width, this._canvasF.height, 0, 0, this._canvasF.width, this._canvasF.height);\n // bottom left slice\n this._canvasG.width = this._config.sourceConfig.leftMargin;\n this._canvasG.height = this._config.sourceConfig.bottomMargin;\n const gCtx = this._canvasG.getContext('2d');\n gCtx === null || gCtx === void 0 ? void 0 : gCtx.drawImage(this._sourceSprite, 0, this._config.sourceConfig.height - this._config.sourceConfig.bottomMargin, this._canvasG.width, this._canvasG.height, 0, 0, this._canvasG.width, this._canvasG.height);\n // bottom slice\n this._canvasH.width = this._config.sourceConfig.width - this._config.sourceConfig.leftMargin - this._config.sourceConfig.rightMargin;\n this._canvasH.height = this._config.sourceConfig.bottomMargin;\n const hCtx = this._canvasH.getContext('2d');\n hCtx === null || hCtx === void 0 ? void 0 : hCtx.drawImage(this._sourceSprite, this._config.sourceConfig.leftMargin, this._config.sourceConfig.height - this._config.sourceConfig.bottomMargin, this._canvasH.width, this._canvasH.height, 0, 0, this._canvasH.width, this._canvasH.height);\n // bottom right slice\n this._canvasI.width = this._config.sourceConfig.rightMargin;\n this._canvasI.height = this._config.sourceConfig.bottomMargin;\n const iCtx = this._canvasI.getContext('2d');\n iCtx === null || iCtx === void 0 ? void 0 : iCtx.drawImage(this._sourceSprite, this._sourceSprite.width - this._config.sourceConfig.rightMargin, this._config.sourceConfig.height - this._config.sourceConfig.bottomMargin, this._canvasI.width, this._canvasI.height, 0, 0, this._canvasI.width, this._canvasI.height);\n }\n /**\n * Clones the 9 slice\n */\n clone() {\n return new NineSlice(this._config);\n }\n /**\n * Returns the number of tiles\n */\n _getNumberOfTiles(tileSize, destinationSize, strategy) {\n switch (strategy) {\n case NineSliceStretch.Stretch:\n return 1;\n case NineSliceStretch.Tile:\n return Math.ceil(destinationSize / tileSize);\n case NineSliceStretch.TileFit:\n return Math.ceil(destinationSize / tileSize);\n }\n }\n /**\n * Returns the position and size of the tile\n */\n _calculateParams(tileNum, numTiles, tileSize, destinationSize, strategy) {\n switch (strategy) {\n case NineSliceStretch.Stretch:\n return {\n tempPosition: 0,\n tempSize: destinationSize\n };\n case NineSliceStretch.Tile:\n // if last tile, adjust size\n if (tileNum === numTiles - 1) {\n //last tile\n return {\n tempPosition: tileNum * tileSize,\n tempSize: tileSize - (numTiles * tileSize - destinationSize)\n };\n }\n else {\n return {\n tempPosition: tileNum * tileSize,\n tempSize: tileSize\n };\n }\n case NineSliceStretch.TileFit:\n const reducedTileSize = destinationSize / numTiles;\n const position = tileNum * reducedTileSize;\n return {\n tempPosition: position,\n tempSize: reducedTileSize\n };\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/OffscreenSystem.ts\":\n/*!*************************************!*\\\n !*** ./Graphics/OffscreenSystem.ts ***!\n \\*************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ OffscreenSystem: () => (/* binding */ OffscreenSystem)\n/* harmony export */ });\n/* harmony import */ var _GraphicsComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _ParallaxComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./ParallaxComponent */ \"./Graphics/ParallaxComponent.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Math/coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Priority.ts\");\n\n\n\n\n\n\n\n\nclass OffscreenSystem extends _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.System {\n constructor(world) {\n super();\n this.world = world;\n this.systemType = _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.SystemType.Draw;\n this.query = this.world.query([_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent, _GraphicsComponent__WEBPACK_IMPORTED_MODULE_2__.GraphicsComponent]);\n }\n initialize(world, scene) {\n this._camera = scene.camera;\n this._screen = scene.engine.screen;\n }\n update() {\n this._worldBounds = this._screen.getWorldBounds();\n let transform;\n let graphics;\n let maybeParallax;\n for (let i = 0; i < this.query.entities.length; i++) {\n const entity = this.query.entities[i];\n graphics = entity.get(_GraphicsComponent__WEBPACK_IMPORTED_MODULE_2__.GraphicsComponent);\n transform = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n maybeParallax = entity.get(_ParallaxComponent__WEBPACK_IMPORTED_MODULE_3__.ParallaxComponent);\n let parallaxOffset;\n if (maybeParallax) {\n // We use the Tiled formula\n // https://doc.mapeditor.org/en/latest/manual/layers/#parallax-scrolling-factor\n // cameraPos * (1 - parallaxFactor)\n const oneMinusFactor = _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.One.sub(maybeParallax.parallaxFactor);\n parallaxOffset = this._camera.pos.scale(oneMinusFactor);\n }\n // Figure out if entities are offscreen\n const entityOffscreen = this._isOffscreen(transform, graphics, parallaxOffset);\n if (entityOffscreen && !entity.hasTag('ex.offscreen')) {\n entity.events.emit('exitviewport', new _Events__WEBPACK_IMPORTED_MODULE_5__.ExitViewPortEvent(entity));\n entity.addTag('ex.offscreen');\n }\n if (!entityOffscreen && entity.hasTag('ex.offscreen')) {\n entity.events.emit('enterviewport', new _Events__WEBPACK_IMPORTED_MODULE_5__.EnterViewPortEvent(entity));\n entity.removeTag('ex.offscreen');\n }\n }\n }\n _isOffscreen(transform, graphics, parallaxOffset) {\n if (graphics.forceOnScreen) {\n return false;\n }\n if (transform.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__.CoordPlane.World) {\n let bounds = graphics.localBounds;\n if (parallaxOffset) {\n bounds = bounds.translate(parallaxOffset);\n }\n const transformedBounds = bounds.transform(transform.get().matrix);\n const graphicsOffscreen = !this._worldBounds.overlaps(transformedBounds);\n return graphicsOffscreen;\n }\n else {\n // TODO screen coordinates\n return false;\n }\n }\n}\nOffscreenSystem.priority = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_7__.SystemPriority.Higher;\n\n\n/***/ }),\n\n/***/ \"./Graphics/ParallaxComponent.ts\":\n/*!***************************************!*\\\n !*** ./Graphics/ParallaxComponent.ts ***!\n \\***************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ParallaxComponent: () => (/* binding */ ParallaxComponent)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Component */ \"./EntityComponentSystem/Component.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n\n\nclass ParallaxComponent extends _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor(parallaxFactor) {\n super();\n this.parallaxFactor = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(1.0, 1.0);\n this.parallaxFactor = parallaxFactor !== null && parallaxFactor !== void 0 ? parallaxFactor : this.parallaxFactor;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Polygon.ts\":\n/*!*****************************!*\\\n !*** ./Graphics/Polygon.ts ***!\n \\*****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Polygon: () => (/* binding */ Polygon)\n/* harmony export */ });\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Raster__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Raster */ \"./Graphics/Raster.ts\");\n\n\n\n/**\n * A polygon {@apilink Graphic} for drawing arbitrary polygons to the {@apilink ExcaliburGraphicsContext}\n *\n * Polygons default to {@apilink ImageFiltering.Blended}\n */\nclass Polygon extends _Raster__WEBPACK_IMPORTED_MODULE_0__.Raster {\n get points() {\n return this._points;\n }\n set points(points) {\n this._points = points;\n const min = this.minPoint;\n this.width = this._points.reduce((max, p) => Math.max(p.x, max), 0) - min.x;\n this.height = this._points.reduce((max, p) => Math.max(p.y, max), 0) - min.y;\n this.flagDirty();\n }\n get minPoint() {\n const minX = this._points.reduce((min, p) => Math.min(p.x, min), Infinity);\n const minY = this._points.reduce((min, p) => Math.min(p.y, min), Infinity);\n return (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(minX, minY);\n }\n constructor(options) {\n super(options);\n this._points = [];\n this.points = options.points;\n this.filtering = _Filtering__WEBPACK_IMPORTED_MODULE_2__.ImageFiltering.Blended;\n this.rasterize();\n }\n clone() {\n return new Polygon({\n points: this.points.map((p) => p.clone()),\n ...this.cloneGraphicOptions(),\n ...this.cloneRasterOptions()\n });\n }\n execute(ctx) {\n if (this.points && this.points.length) {\n ctx.beginPath();\n // Iterate through the supplied points and construct a 'polygon'\n const min = this.minPoint.negate();\n const firstPoint = this.points[0].add(min);\n ctx.moveTo(firstPoint.x, firstPoint.y);\n this.points.forEach((point) => {\n ctx.lineTo(point.x + min.x, point.y + min.y);\n });\n ctx.lineTo(firstPoint.x, firstPoint.y);\n ctx.closePath();\n if (this.color) {\n ctx.fill();\n }\n if (this.strokeColor) {\n ctx.stroke();\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/PostProcessor/ColorBlindnessMode.ts\":\n/*!******************************************************!*\\\n !*** ./Graphics/PostProcessor/ColorBlindnessMode.ts ***!\n \\******************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ColorBlindnessMode: () => (/* binding */ ColorBlindnessMode)\n/* harmony export */ });\nvar ColorBlindnessMode;\n(function (ColorBlindnessMode) {\n ColorBlindnessMode[\"Protanope\"] = \"Protanope\";\n ColorBlindnessMode[\"Deuteranope\"] = \"Deuteranope\";\n ColorBlindnessMode[\"Tritanope\"] = \"Tritanope\";\n})(ColorBlindnessMode || (ColorBlindnessMode = {}));\n\n\n/***/ }),\n\n/***/ \"./Graphics/PostProcessor/ColorBlindnessPostProcessor.ts\":\n/*!***************************************************************!*\\\n !*** ./Graphics/PostProcessor/ColorBlindnessPostProcessor.ts ***!\n \\***************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ColorBlindnessPostProcessor: () => (/* binding */ ColorBlindnessPostProcessor)\n/* harmony export */ });\n/* harmony import */ var _color_blind_fragment_glsl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./color-blind-fragment.glsl */ \"./Graphics/PostProcessor/color-blind-fragment.glsl\");\n/* harmony import */ var _ColorBlindnessMode__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ColorBlindnessMode */ \"./Graphics/PostProcessor/ColorBlindnessMode.ts\");\n/* harmony import */ var _ScreenShader__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ScreenShader */ \"./Graphics/PostProcessor/ScreenShader.ts\");\n\n\n\nclass ColorBlindnessPostProcessor {\n constructor(_colorBlindnessMode, simulate = false) {\n this._colorBlindnessMode = _colorBlindnessMode;\n this._simulate = false;\n this._simulate = simulate;\n }\n initialize(gl) {\n this._shader = new _ScreenShader__WEBPACK_IMPORTED_MODULE_0__.ScreenShader(gl, _color_blind_fragment_glsl__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n this.simulate = this._simulate;\n this.colorBlindnessMode = this._colorBlindnessMode;\n }\n getShader() {\n return this._shader.getShader();\n }\n getLayout() {\n return this._shader.getLayout();\n }\n set colorBlindnessMode(colorBlindMode) {\n this._colorBlindnessMode = colorBlindMode;\n if (this._shader) {\n const shader = this._shader.getShader();\n shader.use();\n if (this._colorBlindnessMode === _ColorBlindnessMode__WEBPACK_IMPORTED_MODULE_2__.ColorBlindnessMode.Protanope) {\n shader.setUniformInt('u_type', 0);\n }\n else if (this._colorBlindnessMode === _ColorBlindnessMode__WEBPACK_IMPORTED_MODULE_2__.ColorBlindnessMode.Deuteranope) {\n shader.setUniformInt('u_type', 1);\n }\n else if (this._colorBlindnessMode === _ColorBlindnessMode__WEBPACK_IMPORTED_MODULE_2__.ColorBlindnessMode.Tritanope) {\n shader.setUniformInt('u_type', 2);\n }\n }\n }\n get colorBlindnessMode() {\n return this._colorBlindnessMode;\n }\n set simulate(value) {\n this._simulate = value;\n if (this._shader) {\n const shader = this._shader.getShader();\n shader.use();\n shader.setUniformBoolean('u_simulate', value);\n }\n }\n get simulate() {\n return this._simulate;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/PostProcessor/ScreenShader.ts\":\n/*!************************************************!*\\\n !*** ./Graphics/PostProcessor/ScreenShader.ts ***!\n \\************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ScreenShader: () => (/* binding */ ScreenShader)\n/* harmony export */ });\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Context_shader__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Context/shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _Context_vertex_buffer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Context/vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _Context_vertex_layout__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Context/vertex-layout */ \"./Graphics/Context/vertex-layout.ts\");\n\n\n\n\n/**\n * Helper that defines a whole screen renderer, just provide a fragment source!\n *\n * Currently supports 1 varying\n * - vec2 a_texcoord between 0-1 which corresponds to screen position\n */\nclass ScreenShader {\n constructor(gl, fragmentSource) {\n if (true) {\n if (fragmentSource.includes('v_texcoord')) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance().warn(`ScreenShader: \"v_texcoord\" is deprecated in postprocessing fragment shaders will be removed in v1.0,` +\n ` use \"v_uv\" instead. Source [${fragmentSource}]`);\n }\n }\n this._shader = new _Context_shader__WEBPACK_IMPORTED_MODULE_1__.Shader({\n gl,\n vertexSource: `#version 300 es\r\n in vec2 a_position;\r\n in vec2 a_uv;\r\n out vec2 v_texcoord;\r\n out vec2 v_uv;\r\n\r\n void main() {\r\n gl_Position = vec4(a_position, 0.0, 1.0);\r\n // Pass the texcoord to the fragment shader.\r\n v_texcoord = a_uv;\r\n v_uv = a_uv;\r\n }`,\n fragmentSource: fragmentSource\n });\n this._shader.compile();\n // Setup memory layout\n this._buffer = new _Context_vertex_buffer__WEBPACK_IMPORTED_MODULE_2__.VertexBuffer({\n gl,\n type: 'static',\n // clip space quad + uv since we don't need a camera\n data: new Float32Array([\n -1, -1, 0, 0, -1, 1, 0, 1, 1, -1, 1, 0,\n 1, -1, 1, 0, -1, 1, 0, 1, 1, 1, 1, 1\n ])\n });\n this._layout = new _Context_vertex_layout__WEBPACK_IMPORTED_MODULE_3__.VertexLayout({\n gl,\n shader: this._shader,\n vertexBuffer: this._buffer,\n attributes: [\n ['a_position', 2],\n ['a_uv', 2]\n ]\n });\n this._buffer.upload();\n }\n getShader() {\n return this._shader;\n }\n getLayout() {\n return this._layout;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Raster.ts\":\n/*!****************************!*\\\n !*** ./Graphics/Raster.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Raster: () => (/* binding */ Raster)\n/* harmony export */ });\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Util_Watch__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Util/Watch */ \"./Util/Watch.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Util */ \"./Util/Util.ts\");\n\n\n\n\n\n\n/**\n * A Raster is a Graphic that needs to be first painted to a HTMLCanvasElement before it can be drawn to the\n * {@apilink ExcaliburGraphicsContext}. This is useful for generating custom images using the 2D canvas api.\n *\n * Implementors must implement the {@apilink Raster.execute} method to rasterize their drawing.\n */\nclass Raster extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n constructor(options) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;\n super((0,_Util_Util__WEBPACK_IMPORTED_MODULE_1__.omit)({ ...options }, ['width', 'height'])); // rasters do some special sauce with width/height\n this.lineCap = 'butt';\n this.quality = 1;\n this._dirty = true;\n this._smoothing = false;\n this._color = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_2__.watch)(_Color__WEBPACK_IMPORTED_MODULE_3__.Color.Black, () => this.flagDirty());\n this._lineWidth = 1;\n this._lineDash = [];\n this._padding = 0;\n if (options) {\n this.quality = (_a = options.quality) !== null && _a !== void 0 ? _a : this.quality;\n this.color = (_b = options.color) !== null && _b !== void 0 ? _b : _Color__WEBPACK_IMPORTED_MODULE_3__.Color.Black;\n this.strokeColor = options === null || options === void 0 ? void 0 : options.strokeColor;\n this.smoothing = (_c = options.smoothing) !== null && _c !== void 0 ? _c : this.smoothing;\n this.lineWidth = (_d = options.lineWidth) !== null && _d !== void 0 ? _d : this.lineWidth;\n this.lineDash = (_e = options.lineDash) !== null && _e !== void 0 ? _e : this.lineDash;\n this.lineCap = (_f = options.lineCap) !== null && _f !== void 0 ? _f : this.lineCap;\n this.padding = (_g = options.padding) !== null && _g !== void 0 ? _g : this.padding;\n this.filtering = (_h = options.filtering) !== null && _h !== void 0 ? _h : this.filtering;\n }\n this._bitmap = document.createElement('canvas');\n // get the default canvas width/height as a fallback\n const bitmapWidth = (_j = options === null || options === void 0 ? void 0 : options.width) !== null && _j !== void 0 ? _j : this._bitmap.width;\n const bitmapHeight = (_k = options === null || options === void 0 ? void 0 : options.height) !== null && _k !== void 0 ? _k : this._bitmap.height;\n this.width = bitmapWidth;\n this.height = bitmapHeight;\n const maybeCtx = this._bitmap.getContext('2d');\n if (!maybeCtx) {\n /* istanbul ignore next */\n throw new Error('Browser does not support 2d canvas drawing, cannot create Raster graphic');\n }\n else {\n this._ctx = maybeCtx;\n }\n }\n cloneRasterOptions() {\n return {\n color: this.color ? this.color.clone() : undefined,\n strokeColor: this.strokeColor ? this.strokeColor.clone() : undefined,\n smoothing: this.smoothing,\n lineWidth: this.lineWidth,\n lineDash: this.lineDash,\n lineCap: this.lineCap,\n quality: this.quality,\n padding: this.padding\n };\n }\n /**\n * Gets whether the graphic is dirty, this means there are changes that haven't been re-rasterized\n */\n get dirty() {\n return this._dirty;\n }\n /**\n * Flags the graphic as dirty, meaning it must be re-rasterized before draw.\n * This should be called any time the graphics state changes such that it affects the outputted drawing\n */\n flagDirty() {\n this._dirty = true;\n }\n /**\n * Gets or sets the current width of the Raster graphic. Setting the width will cause the raster\n * to be flagged dirty causing a re-raster on the next draw.\n *\n * Any `padding`s or `quality` set will be factored into the width\n */\n get width() {\n return Math.abs(this._getTotalWidth() * this.scale.x);\n }\n set width(value) {\n value /= Math.abs(this.scale.x);\n this._bitmap.width = value;\n this._originalWidth = value;\n this.flagDirty();\n }\n /**\n * Gets or sets the current height of the Raster graphic. Setting the height will cause the raster\n * to be flagged dirty causing a re-raster on the next draw.\n *\n * Any `padding` or `quality` set will be factored into the height\n */\n get height() {\n return Math.abs(this._getTotalHeight() * this.scale.y);\n }\n set height(value) {\n value /= Math.abs(this.scale.y);\n this._bitmap.height = value;\n this._originalHeight = value;\n this.flagDirty();\n }\n _getTotalWidth() {\n var _a;\n return (((_a = this._originalWidth) !== null && _a !== void 0 ? _a : this._bitmap.width) + this.padding * 2) * 1;\n }\n _getTotalHeight() {\n var _a;\n return (((_a = this._originalHeight) !== null && _a !== void 0 ? _a : this._bitmap.height) + this.padding * 2) * 1;\n }\n /**\n * Returns the local bounds of the Raster including the padding\n */\n get localBounds() {\n return _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_4__.BoundingBox.fromDimension(this._getTotalWidth() * this.scale.x, this._getTotalHeight() * this.scale.y, _Math_vector__WEBPACK_IMPORTED_MODULE_5__.Vector.Zero);\n }\n /**\n * Gets or sets the smoothing (anti-aliasing of the graphic). Setting the height will cause the raster\n * to be flagged dirty causing a re-raster on the next draw.\n */\n get smoothing() {\n return this._smoothing;\n }\n set smoothing(value) {\n this._smoothing = value;\n this.flagDirty();\n }\n /**\n * Gets or sets the fillStyle of the Raster graphic. Setting the fillStyle will cause the raster to be\n * flagged dirty causing a re-raster on the next draw.\n */\n get color() {\n return this._color;\n }\n set color(value) {\n this.flagDirty();\n this._color = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_2__.watch)(value, () => this.flagDirty());\n }\n /**\n * Gets or sets the strokeStyle of the Raster graphic. Setting the strokeStyle will cause the raster to be\n * flagged dirty causing a re-raster on the next draw.\n */\n get strokeColor() {\n return this._strokeColor;\n }\n set strokeColor(value) {\n this.flagDirty();\n if (value) {\n this._strokeColor = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_2__.watch)(value, () => this.flagDirty());\n }\n }\n /**\n * Gets or sets the line width of the Raster graphic. Setting the lineWidth will cause the raster to be\n * flagged dirty causing a re-raster on the next draw.\n */\n get lineWidth() {\n return this._lineWidth;\n }\n set lineWidth(value) {\n this._lineWidth = value;\n this.flagDirty();\n }\n get lineDash() {\n return this._lineDash;\n }\n set lineDash(value) {\n this._lineDash = value;\n this.flagDirty();\n }\n get padding() {\n return this._padding;\n }\n set padding(value) {\n this._padding = value;\n this.flagDirty();\n }\n /**\n * Rasterize the graphic to a bitmap making it usable as in excalibur. Rasterize is called automatically if\n * the graphic is {@apilink Raster.dirty} on the next {@apilink Graphic.draw} call\n */\n rasterize() {\n this._dirty = false;\n this._ctx.clearRect(0, 0, this._getTotalWidth(), this._getTotalHeight());\n this._ctx.save();\n this._applyRasterProperties(this._ctx);\n this.execute(this._ctx);\n this._ctx.restore();\n }\n _applyRasterProperties(ctx) {\n var _a, _b, _c, _d;\n this._bitmap.width = this._getTotalWidth() * this.quality;\n this._bitmap.height = this._getTotalHeight() * this.quality;\n // Do a bad thing to pass the filtering as an attribute\n this._bitmap.setAttribute('filtering', this.filtering);\n this._bitmap.setAttribute('forceUpload', 'true');\n ctx.scale(this.quality, this.quality);\n ctx.translate(this.padding, this.padding);\n ctx.imageSmoothingEnabled = this.smoothing;\n ctx.lineWidth = this.lineWidth;\n ctx.setLineDash((_a = this.lineDash) !== null && _a !== void 0 ? _a : ctx.getLineDash());\n ctx.lineCap = this.lineCap;\n ctx.strokeStyle = (_c = (_b = this.strokeColor) === null || _b === void 0 ? void 0 : _b.toString()) !== null && _c !== void 0 ? _c : '';\n ctx.fillStyle = (_d = this.color) === null || _d === void 0 ? void 0 : _d.toString();\n }\n _drawImage(ex, x, y) {\n if (this._dirty) {\n this.rasterize();\n }\n ex.scale(1 / this.quality, 1 / this.quality);\n ex.drawImage(this._bitmap, x, y);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Rectangle.ts\":\n/*!*******************************!*\\\n !*** ./Graphics/Rectangle.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Rectangle: () => (/* binding */ Rectangle)\n/* harmony export */ });\n/* harmony import */ var _Raster__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Raster */ \"./Graphics/Raster.ts\");\n\n/**\n * A Rectangle {@apilink Graphic} for drawing rectangles to the {@apilink ExcaliburGraphicsContext}\n */\nclass Rectangle extends _Raster__WEBPACK_IMPORTED_MODULE_0__.Raster {\n constructor(options) {\n super(options);\n this.width = options.width;\n this.height = options.height;\n this.rasterize();\n }\n clone() {\n return new Rectangle({\n width: this.width,\n height: this.height,\n ...this.cloneGraphicOptions(),\n ...this.cloneRasterOptions()\n });\n }\n execute(ctx) {\n if (this.color) {\n ctx.fillRect(0, 0, this.width, this.height);\n }\n if (this.strokeColor) {\n ctx.strokeRect(0, 0, this.width, this.height);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Sprite.ts\":\n/*!****************************!*\\\n !*** ./Graphics/Sprite.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Sprite: () => (/* binding */ Sprite)\n/* harmony export */ });\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n\n\nclass Sprite extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n static from(image, options) {\n return new Sprite({\n image,\n ...options\n });\n }\n constructor(options) {\n var _a, _b;\n super(options);\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this._dirty = true;\n this.image = options.image;\n const { width, height } = options;\n this.sourceView = (_a = options.sourceView) !== null && _a !== void 0 ? _a : { x: 0, y: 0, width: width !== null && width !== void 0 ? width : 0, height: height !== null && height !== void 0 ? height : 0 };\n this.destSize = (_b = options.destSize) !== null && _b !== void 0 ? _b : { width: width !== null && width !== void 0 ? width : 0, height: height !== null && height !== void 0 ? height : 0 };\n this._updateSpriteDimensions();\n // Fire when loaded\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.image.ready.then(() => {\n this._updateSpriteDimensions();\n });\n }\n get width() {\n return Math.abs(this.destSize.width * this.scale.x);\n }\n get height() {\n return Math.abs(this.destSize.height * this.scale.y);\n }\n set width(newWidth) {\n newWidth /= Math.abs(this.scale.x);\n this.destSize.width = newWidth;\n super.width = Math.ceil(this.destSize.width);\n }\n set height(newHeight) {\n newHeight /= Math.abs(this.scale.y);\n this.destSize.height = newHeight;\n super.height = Math.ceil(this.destSize.height);\n }\n _updateSpriteDimensions() {\n var _a, _b, _c, _d, _e, _f;\n const { width: nativeWidth, height: nativeHeight } = this.image;\n // This code uses || to avoid 0's\n // If the source is not specified, use the native dimension\n this.sourceView.width = ((_a = this.sourceView) === null || _a === void 0 ? void 0 : _a.width) || nativeWidth;\n this.sourceView.height = ((_b = this.sourceView) === null || _b === void 0 ? void 0 : _b.height) || nativeHeight;\n // If the destination is not specified, use the source if specified, then native\n this.destSize.width = ((_c = this.destSize) === null || _c === void 0 ? void 0 : _c.width) || ((_d = this.sourceView) === null || _d === void 0 ? void 0 : _d.width) || nativeWidth;\n this.destSize.height = ((_e = this.destSize) === null || _e === void 0 ? void 0 : _e.height) || ((_f = this.sourceView) === null || _f === void 0 ? void 0 : _f.height) || nativeHeight;\n this.width = Math.ceil(this.destSize.width) * this.scale.x;\n this.height = Math.ceil(this.destSize.height) * this.scale.y;\n }\n _preDraw(ex, x, y) {\n if (this.image.isLoaded() && this._dirty) {\n this._dirty = false;\n this._updateSpriteDimensions();\n }\n super._preDraw(ex, x, y);\n }\n _drawImage(ex, x, y) {\n if (this.image.isLoaded()) {\n ex.drawImage(this.image.image, this.sourceView.x, this.sourceView.y, this.sourceView.width, this.sourceView.height, x, y, this.destSize.width, this.destSize.height);\n }\n else {\n this._logger.warnOnce(`ImageSource ${this.image.path}` +\n ` is not yet loaded and won't be drawn. Please call .load() or include in a Loader.\\n\\n` +\n `Read https://excaliburjs.com/docs/imagesource for more information.`);\n }\n }\n clone() {\n return new Sprite({\n image: this.image,\n sourceView: { ...this.sourceView },\n destSize: { ...this.destSize },\n ...this.cloneGraphicOptions()\n });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/SpriteFont.ts\":\n/*!********************************!*\\\n !*** ./Graphics/SpriteFont.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SpriteFont: () => (/* binding */ SpriteFont)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n\n\n\n\nclass SpriteFont extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n constructor(options) {\n super(options);\n this._text = '';\n this.alphabet = '';\n this.shadow = undefined;\n this.caseInsensitive = false;\n this.spacing = 0;\n this.lineHeight = undefined;\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n const { alphabet, spriteSheet, caseInsensitive, spacing, shadow, lineHeight } = options;\n this.alphabet = alphabet;\n this.spriteSheet = spriteSheet;\n this.caseInsensitive = caseInsensitive !== null && caseInsensitive !== void 0 ? caseInsensitive : this.caseInsensitive;\n this.spacing = spacing !== null && spacing !== void 0 ? spacing : this.spacing;\n this.shadow = shadow !== null && shadow !== void 0 ? shadow : this.shadow;\n this.lineHeight = lineHeight !== null && lineHeight !== void 0 ? lineHeight : this.lineHeight;\n }\n _getCharacterSprites(text) {\n const results = [];\n // handle case insensitive\n const textToRender = this.caseInsensitive ? text.toLocaleLowerCase() : text;\n const alphabet = this.caseInsensitive ? this.alphabet.toLocaleLowerCase() : this.alphabet;\n // for each letter in text\n for (let letterIndex = 0; letterIndex < textToRender.length; letterIndex++) {\n // find the sprite index in alphabet , if there is an error pick the first\n const letter = textToRender[letterIndex];\n let spriteIndex = alphabet.indexOf(letter);\n if (spriteIndex === -1) {\n spriteIndex = 0;\n this._logger.warnOnce(`SpriteFont - Cannot find letter '${letter}' in configured alphabet '${alphabet}'.`);\n this._logger.warnOnce('There maybe be more issues in the SpriteFont configuration. No additional warnings will be logged.');\n }\n const letterSprite = this.spriteSheet.sprites[spriteIndex];\n if (letterSprite) {\n results.push(letterSprite);\n }\n else {\n this._logger.warnOnce(`SpriteFont - Cannot find sprite for '${letter}' at index '${spriteIndex}' in configured SpriteSheet`);\n this._logger.warnOnce('There maybe be more issues in the SpriteFont configuration. No additional warnings will be logged.');\n }\n }\n return results;\n }\n measureText(text, maxWidth) {\n const lines = this._getLinesFromText(text, maxWidth);\n const maxWidthLine = lines.reduce((a, b) => {\n return a.length > b.length ? a : b;\n });\n const sprites = this._getCharacterSprites(maxWidthLine);\n let width = 0;\n let height = 0;\n for (const sprite of sprites) {\n width += sprite.width + this.spacing;\n height = Math.max(height, sprite.height);\n }\n return _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromDimension(width * this.scale.x, height * lines.length * this.scale.y, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero);\n }\n _drawImage(ex, x, y, maxWidth) {\n var _a;\n let xCursor = 0;\n let yCursor = 0;\n let height = 0;\n const lines = this._getLinesFromText(this._text, maxWidth);\n for (const line of lines) {\n for (const sprite of this._getCharacterSprites(line)) {\n // draw it in the right spot and increase the cursor by sprite width\n sprite.draw(ex, x + xCursor, y + yCursor);\n xCursor += sprite.width + this.spacing;\n height = Math.max(height, sprite.height);\n }\n xCursor = 0;\n yCursor += (_a = this.lineHeight) !== null && _a !== void 0 ? _a : height;\n }\n }\n render(ex, text, _color, x, y, maxWidth) {\n // SpriteFont doesn't support _color, yet...\n this._text = text;\n const bounds = this.measureText(text, maxWidth);\n this.width = bounds.width;\n this.height = bounds.height;\n if (this.shadow) {\n ex.save();\n ex.translate(this.shadow.offset.x, this.shadow.offset.y);\n this._preDraw(ex, x, y);\n this._drawImage(ex, 0, 0, maxWidth);\n this._postDraw(ex);\n ex.restore();\n }\n this._preDraw(ex, x, y);\n this._drawImage(ex, 0, 0, maxWidth);\n this._postDraw(ex);\n }\n clone() {\n return new SpriteFont({\n alphabet: this.alphabet,\n spriteSheet: this.spriteSheet,\n spacing: this.spacing\n });\n }\n _getLinesFromText(text, maxWidth) {\n var _a;\n if (this._cachedText === text && this._cachedRenderWidth === maxWidth && ((_a = this._cachedLines) === null || _a === void 0 ? void 0 : _a.length)) {\n return this._cachedLines;\n }\n const lines = text.split('\\n');\n if (maxWidth == null) {\n return lines;\n }\n // If the current line goes past the maxWidth, append a new line without modifying the underlying text.\n for (let i = 0; i < lines.length; i++) {\n let line = lines[i];\n let newLine = '';\n // Note: we subtract the spacing to counter the initial padding on the left side.\n if (this.measureText(line).width > maxWidth) {\n while (this.measureText(line).width > maxWidth) {\n newLine = line[line.length - 1] + newLine;\n line = line.slice(0, -1); // Remove last character from line\n }\n // Update the array with our new values\n lines[i] = line;\n lines[i + 1] = newLine;\n }\n }\n this._cachedText = text;\n this._cachedLines = lines;\n this._cachedRenderWidth = maxWidth;\n return lines;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/SpriteSheet.ts\":\n/*!*********************************!*\\\n !*** ./Graphics/SpriteSheet.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SpriteSheet: () => (/* binding */ SpriteSheet)\n/* harmony export */ });\n/* harmony import */ var _Sprite__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Sprite */ \"./Graphics/Sprite.ts\");\n/* harmony import */ var _TiledSprite__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./TiledSprite */ \"./Graphics/TiledSprite.ts\");\n\n\n/**\n * Represents a collection of sprites from a source image with some organization in a grid\n */\nclass SpriteSheet {\n /**\n * Build a new sprite sheet from a list of sprites\n *\n * Use {@apilink SpriteSheet.fromImageSource} to create a SpriteSheet from an {@apilink ImageSource} organized in a grid\n * @param options\n */\n constructor(options) {\n this.sprites = [];\n const { sprites, rows, columns } = options;\n this.sprites = sprites;\n this.rows = rows !== null && rows !== void 0 ? rows : 1;\n this.columns = columns !== null && columns !== void 0 ? columns : this.sprites.length;\n }\n /**\n * Find a sprite by their x/y integer coordinates in the SpriteSheet, for example `getSprite(0, 0)` is the {@apilink Sprite} in the top-left\n * and `getSprite(1, 0)` is the sprite one to the right.\n * @param x\n * @param y\n */\n getSprite(x, y, options) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j;\n if (x >= this.columns || x < 0) {\n throw Error(`No sprite exists in the SpriteSheet at (${x}, ${y}), x: ${x} should be between 0 and ${this.columns - 1} columns`);\n }\n if (y >= this.rows || y < 0) {\n throw Error(`No sprite exists in the SpriteSheet at (${x}, ${y}), y: ${y} should be between 0 and ${this.rows - 1} rows`);\n }\n const spriteIndex = x + y * this.columns;\n const sprite = this.sprites[spriteIndex];\n if (sprite) {\n if (options) {\n const spriteWithOptions = sprite.clone();\n spriteWithOptions.flipHorizontal = (_a = options.flipHorizontal) !== null && _a !== void 0 ? _a : spriteWithOptions.flipHorizontal;\n spriteWithOptions.flipVertical = (_b = options.flipVertical) !== null && _b !== void 0 ? _b : spriteWithOptions.flipVertical;\n spriteWithOptions.width = (_c = options.width) !== null && _c !== void 0 ? _c : spriteWithOptions.width;\n spriteWithOptions.height = (_d = options.height) !== null && _d !== void 0 ? _d : spriteWithOptions.height;\n spriteWithOptions.rotation = (_e = options.rotation) !== null && _e !== void 0 ? _e : spriteWithOptions.rotation;\n spriteWithOptions.scale = (_f = options.scale) !== null && _f !== void 0 ? _f : spriteWithOptions.scale;\n spriteWithOptions.opacity = (_g = options.opacity) !== null && _g !== void 0 ? _g : spriteWithOptions.opacity;\n spriteWithOptions.tint = (_h = options.tint) !== null && _h !== void 0 ? _h : spriteWithOptions.tint;\n spriteWithOptions.origin = (_j = options.origin) !== null && _j !== void 0 ? _j : spriteWithOptions.origin;\n return spriteWithOptions;\n }\n return sprite;\n }\n throw Error(`Invalid sprite coordinates (${x}, ${y})`);\n }\n /**\n * Find a sprite by their x/y integer coordinates in the SpriteSheet and configures tiling to repeat by default,\n * for example `getTiledSprite(0, 0)` is the {@apilink TiledSprite} in the top-left\n * and `getTiledSprite(1, 0)` is the sprite one to the right.\n *\n * Example:\n *\n * ```typescript\n * spriteSheet.getTiledSprite(1, 0, {\n * width: game.screen.width,\n * height: 200,\n * wrapping: {\n * x: ex.ImageWrapping.Repeat,\n * y: ex.ImageWrapping.Clamp\n * }\n * });\n * ```\n * @param x\n * @param y\n * @param options\n */\n getTiledSprite(x, y, options) {\n if (x >= this.columns || x < 0) {\n throw Error(`No sprite exists in the SpriteSheet at (${x}, ${y}), x: ${x} should be between 0 and ${this.columns - 1} columns`);\n }\n if (y >= this.rows || y < 0) {\n throw Error(`No sprite exists in the SpriteSheet at (${x}, ${y}), y: ${y} should be between 0 and ${this.rows - 1} rows`);\n }\n const spriteIndex = x + y * this.columns;\n const sprite = this.sprites[spriteIndex];\n if (sprite) {\n return _TiledSprite__WEBPACK_IMPORTED_MODULE_0__.TiledSprite.fromSprite(sprite, options);\n }\n throw Error(`Invalid sprite coordinates (${x}, ${y})`);\n }\n /**\n * Create a sprite sheet from a sparse set of {@apilink SourceView} rectangles\n * @param options\n */\n static fromImageSourceWithSourceViews(options) {\n const sprites = options.sourceViews.map((sourceView) => {\n return new _Sprite__WEBPACK_IMPORTED_MODULE_1__.Sprite({\n image: options.image,\n sourceView\n });\n });\n return new SpriteSheet({ sprites });\n }\n /**\n * Create a SpriteSheet from an {@apilink ImageSource} organized in a grid\n *\n * Example:\n * ```\n * const spriteSheet = SpriteSheet.fromImageSource({\n * image: imageSource,\n * grid: {\n * rows: 5,\n * columns: 2,\n * spriteWidth: 32, // pixels\n * spriteHeight: 32 // pixels\n * },\n * // Optionally specify spacing\n * spacing: {\n * // pixels from the top left to start the sprite parsing\n * originOffset: {\n * x: 5,\n * y: 5\n * },\n * // pixels between each sprite while parsing\n * margin: {\n * x: 1,\n * y: 1\n * }\n * }\n * })\n * ```\n * @param options\n */\n static fromImageSource(options) {\n var _a;\n const sprites = [];\n options.spacing = (_a = options.spacing) !== null && _a !== void 0 ? _a : {};\n const { image, grid: { rows, columns: cols, spriteWidth, spriteHeight }, spacing: { originOffset, margin } } = options;\n const offsetDefaults = { x: 0, y: 0, ...originOffset };\n const marginDefaults = { x: 0, y: 0, ...margin };\n for (let x = 0; x < cols; x++) {\n for (let y = 0; y < rows; y++) {\n sprites[x + y * cols] = new _Sprite__WEBPACK_IMPORTED_MODULE_1__.Sprite({\n image: image,\n sourceView: {\n x: x * spriteWidth + marginDefaults.x * x + offsetDefaults.x,\n y: y * spriteHeight + marginDefaults.y * y + offsetDefaults.y,\n width: spriteWidth,\n height: spriteHeight\n },\n destSize: { height: spriteHeight, width: spriteWidth }\n });\n }\n }\n return new SpriteSheet({\n sprites: sprites,\n rows: rows,\n columns: cols\n });\n }\n clone() {\n return new SpriteSheet({\n sprites: this.sprites.map((sprite) => sprite.clone()),\n rows: this.rows,\n columns: this.columns\n });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Text.ts\":\n/*!**************************!*\\\n !*** ./Graphics/Text.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Text: () => (/* binding */ Text)\n/* harmony export */ });\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Font__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Font */ \"./Graphics/Font.ts\");\n\n\n\n/**\n * Represent Text graphics in excalibur\n *\n * Useful for in game labels, ui, or overlays\n */\nclass Text extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n constructor(options) {\n var _a, _b;\n super(options);\n this._text = '';\n this._textWidth = 0;\n this._textHeight = 0;\n // This order is important font, color, then text\n this.font = (_a = options.font) !== null && _a !== void 0 ? _a : new _Font__WEBPACK_IMPORTED_MODULE_1__.Font();\n this.color = (_b = options.color) !== null && _b !== void 0 ? _b : this.color;\n this.text = options.text;\n this.maxWidth = options.maxWidth;\n }\n clone() {\n var _a, _b;\n return new Text({\n text: this.text.slice(),\n color: (_b = (_a = this.color) === null || _a === void 0 ? void 0 : _a.clone()) !== null && _b !== void 0 ? _b : _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Black,\n font: this.font.clone(),\n maxWidth: this.maxWidth\n });\n }\n get text() {\n return this._text;\n }\n set text(value) {\n this._text = value;\n this._calculateDimension();\n }\n get font() {\n return this._font;\n }\n set font(font) {\n this._font = font;\n }\n get width() {\n if (this._textWidth === 0) {\n this._calculateDimension();\n }\n return this._textWidth * this.scale.x;\n }\n get height() {\n if (this._textHeight === 0) {\n this._calculateDimension();\n }\n return this._textHeight * this.scale.y;\n }\n _calculateDimension() {\n const { width, height } = this.font.measureText(this._text, this.maxWidth);\n this._textWidth = width;\n this._textHeight = height;\n }\n get localBounds() {\n return this.font.measureText(this._text, this.maxWidth).scale(this.scale);\n }\n _rotate(_ex) {\n // None this is delegated to font\n // This override erases the default behavior\n }\n _flip(_ex) {\n // None this is delegated to font\n // This override erases the default behavior\n }\n _preDraw(ex, x, y) {\n if (this.isStale() || this.font.isStale()) {\n this.font.flipHorizontal = this.flipHorizontal;\n this.font.flipVertical = this.flipVertical;\n this.font.rotation = this.rotation;\n this.font.origin = this.origin;\n this.font.opacity = this.opacity;\n }\n this.font.tint = this.tint;\n super._preDraw(ex, x, y);\n }\n _drawImage(ex, x, y) {\n var _a;\n let color = _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Black;\n if (this.font instanceof _Font__WEBPACK_IMPORTED_MODULE_1__.Font) {\n color = (_a = this.color) !== null && _a !== void 0 ? _a : this.font.color;\n }\n const { width, height } = this.font.measureText(this._text, this.maxWidth);\n this._textWidth = width;\n this._textHeight = height;\n this.font.render(ex, this._text, color, x, y, this.maxWidth);\n if (this.font.showDebug) {\n ex.debug.drawRect(x - width, y - height, width * 2, height * 2);\n if (this.maxWidth != null) {\n ex.debug.drawRect(x, y, this.maxWidth, this.height, {\n color: _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Yellow\n });\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/TiledAnimation.ts\":\n/*!************************************!*\\\n !*** ./Graphics/TiledAnimation.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TiledAnimation: () => (/* binding */ TiledAnimation)\n/* harmony export */ });\n/* harmony import */ var _Sprite__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Sprite */ \"./Graphics/Sprite.ts\");\n/* harmony import */ var _Animation__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Animation */ \"./Graphics/Animation.ts\");\n/* harmony import */ var _TiledSprite__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./TiledSprite */ \"./Graphics/TiledSprite.ts\");\n/* harmony import */ var _Util_Watch__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Util/Watch */ \"./Util/Watch.ts\");\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Future */ \"./Util/Future.ts\");\n\n\n\n\n\nclass TiledAnimation extends _Animation__WEBPACK_IMPORTED_MODULE_0__.Animation {\n constructor(options) {\n super({\n ...options,\n frames: options.animation.frames.slice(),\n strategy: options.animation.strategy,\n frameDuration: options.animation.frameDuration,\n speed: options.animation.speed,\n reverse: options.animation.isReversed\n });\n this._ready = new _Util_Future__WEBPACK_IMPORTED_MODULE_1__.Future();\n this.ready = this._ready.promise;\n this._tiledWidth = 0;\n this._tiledHeight = 0;\n this._sourceView = {};\n this._sourceView = { ...options.sourceView };\n this._tiledWidth = options.width;\n this._tiledHeight = options.height;\n const promises = [];\n for (let i = 0; i < this.frames.length; i++) {\n const graphic = this.frames[i].graphic;\n if (graphic && graphic instanceof _Sprite__WEBPACK_IMPORTED_MODULE_2__.Sprite) {\n const tiledSprite = new _TiledSprite__WEBPACK_IMPORTED_MODULE_3__.TiledSprite({\n image: graphic.image,\n width: options.width,\n height: options.height,\n sourceView: { ...graphic.sourceView },\n wrapping: options.wrapping,\n filtering: options.filtering\n });\n this.frames[i].graphic = tiledSprite;\n // There is a new calc'd sourceView when ready\n tiledSprite.ready.then(() => {\n tiledSprite.sourceView = { ...tiledSprite.sourceView, ...this._sourceView };\n });\n promises.push(tiledSprite.ready);\n }\n }\n Promise.all(promises).then(() => this._ready.resolve());\n }\n static fromAnimation(animation, options) {\n return new TiledAnimation({\n width: animation.width,\n height: animation.height,\n ...options,\n animation\n });\n }\n _updateSourceView() {\n for (let i = 0; i < this.frames.length; i++) {\n const graphic = this.frames[i].graphic;\n if (graphic && graphic instanceof _Sprite__WEBPACK_IMPORTED_MODULE_2__.Sprite) {\n graphic.sourceView = { ...graphic.sourceView, ...this._sourceView };\n }\n }\n }\n get sourceView() {\n return (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_4__.watch)(this._sourceView, () => this._updateSourceView());\n }\n set sourceView(sourceView) {\n this._sourceView = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_4__.watch)(sourceView, () => this._updateSourceView());\n this._updateSourceView();\n }\n _updateWidthHeight() {\n for (let i = 0; i < this.frames.length; i++) {\n const graphic = this.frames[i].graphic;\n if (graphic && graphic instanceof _Sprite__WEBPACK_IMPORTED_MODULE_2__.Sprite) {\n graphic.sourceView.height = this._tiledHeight || graphic.height;\n graphic.destSize.height = this._tiledHeight || graphic.height;\n graphic.sourceView.width = this._tiledWidth || graphic.width;\n graphic.destSize.width = this._tiledWidth || graphic.width;\n }\n }\n }\n get width() {\n return this._tiledWidth;\n }\n get height() {\n return this._tiledHeight;\n }\n set width(width) {\n this._tiledWidth = width;\n this._updateWidthHeight();\n }\n set height(height) {\n this._tiledHeight = height;\n this._updateWidthHeight();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/TiledSprite.ts\":\n/*!*********************************!*\\\n !*** ./Graphics/TiledSprite.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TiledSprite: () => (/* binding */ TiledSprite)\n/* harmony export */ });\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Future */ \"./Util/Future.ts\");\n/* harmony import */ var _ImageSource__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ImageSource */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Sprite__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Sprite */ \"./Graphics/Sprite.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Wrapping */ \"./Graphics/Wrapping.ts\");\n\n\n\n\nclass TiledSprite extends _Sprite__WEBPACK_IMPORTED_MODULE_0__.Sprite {\n constructor(options) {\n super({\n image: options.image,\n sourceView: options.sourceView,\n destSize: { width: options.width, height: options.height },\n flipHorizontal: options.flipHorizontal,\n flipVertical: options.flipVertical,\n rotation: options.rotation,\n scale: options.scale,\n opacity: options.opacity,\n tint: options.tint,\n origin: options.origin\n });\n this._ready = new _Util_Future__WEBPACK_IMPORTED_MODULE_1__.Future();\n this.ready = this._ready.promise;\n this._options = options;\n if (this.image.isLoaded()) {\n this._applyTiling();\n }\n else {\n this.image.ready.then(() => this._applyTiling());\n }\n }\n static fromSprite(sprite, options) {\n return new TiledSprite({\n sourceView: { ...sprite.sourceView },\n width: sprite.width,\n height: sprite.height,\n ...options,\n image: sprite.image\n });\n }\n _applyTiling() {\n const { width, height, filtering, wrapping } = { ...this._options };\n const spriteCanvas = document.createElement('canvas');\n spriteCanvas.width = this.sourceView.width;\n spriteCanvas.height = this.sourceView.height;\n const spriteCtx = spriteCanvas.getContext('2d');\n // prettier-ignore\n spriteCtx.drawImage(this.image.image, this.sourceView.x, this.sourceView.y, this.sourceView.width, this.sourceView.height, 0, 0, this.sourceView.width, this.sourceView.height);\n // prettier-ignore\n const tiledImageSource = _ImageSource__WEBPACK_IMPORTED_MODULE_2__.ImageSource.fromHtmlCanvasElement(spriteCanvas, {\n wrapping: wrapping !== null && wrapping !== void 0 ? wrapping : _Wrapping__WEBPACK_IMPORTED_MODULE_3__.ImageWrapping.Repeat,\n filtering\n });\n if (width) {\n this.destSize.width = width;\n this.sourceView.width = width;\n }\n if (height) {\n this.destSize.height = height;\n this.sourceView.height = height;\n }\n this.sourceView.x = 0;\n this.sourceView.y = 0;\n this.image = tiledImageSource;\n // this._ready.resolve();\n this.image.ready.then(() => this._ready.resolve());\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/TransformInterpolation.ts\":\n/*!********************************************!*\\\n !*** ./Graphics/TransformInterpolation.ts ***!\n \\********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ blendGlobalTransform: () => (/* binding */ blendGlobalTransform),\n/* harmony export */ blendTransform: () => (/* binding */ blendTransform)\n/* harmony export */ });\n/* harmony import */ var _Math_transform__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Math/transform */ \"./Math/transform.ts\");\n\n/**\n * Blend 2 transforms for interpolation, will interpolate from the context of newTx's parent if it exists\n */\nfunction blendTransform(oldTx, newTx, blend, target) {\n if (oldTx.parent !== newTx.parent) {\n // Caller expects a local transform\n // Adjust old tx to be local to the new parent whatever that is\n const oldTxWithNewParent = oldTx.clone();\n const oldGlobalPos = oldTx.globalPos.clone();\n const oldGlobalScale = oldTx.globalScale.clone();\n const oldGlobalRotation = oldTx.globalRotation;\n oldTxWithNewParent.parent = newTx.parent;\n oldTxWithNewParent.globalPos = oldGlobalPos;\n oldTxWithNewParent.globalScale = oldGlobalScale;\n oldTxWithNewParent.globalRotation = oldGlobalRotation;\n oldTx = oldTxWithNewParent;\n }\n let interpolatedPos = newTx.pos;\n let interpolatedScale = newTx.scale;\n let interpolatedRotation = newTx.rotation;\n interpolatedPos = newTx.pos.scale(blend).add(oldTx.pos.scale(1.0 - blend));\n interpolatedScale = newTx.scale.scale(blend).add(oldTx.scale.scale(1.0 - blend));\n // Rotational lerp https://stackoverflow.com/a/30129248\n const cosine = (1.0 - blend) * Math.cos(oldTx.rotation) + blend * Math.cos(newTx.rotation);\n const sine = (1.0 - blend) * Math.sin(oldTx.rotation) + blend * Math.sin(newTx.rotation);\n interpolatedRotation = Math.atan2(sine, cosine);\n const tx = target !== null && target !== void 0 ? target : new _Math_transform__WEBPACK_IMPORTED_MODULE_0__.Transform();\n tx.setTransform(interpolatedPos, interpolatedRotation, interpolatedScale);\n return tx;\n}\n/**\n *\n */\nfunction blendGlobalTransform(oldTx, newTx, blend, target) {\n let interpolatedPos = newTx.globalPos;\n let interpolatedScale = newTx.globalScale;\n let interpolatedRotation = newTx.globalRotation;\n interpolatedPos = newTx.globalPos.scale(blend).add(oldTx.globalPos.scale(1.0 - blend));\n interpolatedScale = newTx.globalScale.scale(blend).add(oldTx.globalScale.scale(1.0 - blend));\n // Rotational lerp https://stackoverflow.com/a/30129248\n const cosine = (1.0 - blend) * Math.cos(oldTx.globalRotation) + blend * Math.cos(newTx.globalRotation);\n const sine = (1.0 - blend) * Math.sin(oldTx.globalRotation) + blend * Math.sin(newTx.globalRotation);\n interpolatedRotation = Math.atan2(sine, cosine);\n const tx = target !== null && target !== void 0 ? target : new _Math_transform__WEBPACK_IMPORTED_MODULE_0__.Transform();\n tx.setTransform(interpolatedPos, interpolatedRotation, interpolatedScale);\n return tx;\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Wrapping.ts\":\n/*!******************************!*\\\n !*** ./Graphics/Wrapping.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ImageWrapping: () => (/* binding */ ImageWrapping),\n/* harmony export */ parseImageWrapping: () => (/* binding */ parseImageWrapping)\n/* harmony export */ });\n/**\n * Describes the different image wrapping modes\n */\nvar ImageWrapping;\n(function (ImageWrapping) {\n ImageWrapping[\"Clamp\"] = \"Clamp\";\n ImageWrapping[\"Repeat\"] = \"Repeat\";\n ImageWrapping[\"Mirror\"] = \"Mirror\";\n})(ImageWrapping || (ImageWrapping = {}));\n/**\n *\n */\nfunction parseImageWrapping(val) {\n switch (val) {\n case ImageWrapping.Clamp:\n return ImageWrapping.Clamp;\n case ImageWrapping.Repeat:\n return ImageWrapping.Repeat;\n case ImageWrapping.Mirror:\n return ImageWrapping.Mirror;\n default:\n return ImageWrapping.Clamp;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/index.ts\":\n/*!***************************!*\\\n !*** ./Graphics/index.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Animation: () => (/* reexport safe */ _Animation__WEBPACK_IMPORTED_MODULE_5__.Animation),\n/* harmony export */ AnimationDirection: () => (/* reexport safe */ _Animation__WEBPACK_IMPORTED_MODULE_5__.AnimationDirection),\n/* harmony export */ AnimationEvents: () => (/* reexport safe */ _Animation__WEBPACK_IMPORTED_MODULE_5__.AnimationEvents),\n/* harmony export */ AnimationStrategy: () => (/* reexport safe */ _Animation__WEBPACK_IMPORTED_MODULE_5__.AnimationStrategy),\n/* harmony export */ BaseAlign: () => (/* reexport safe */ _FontCommon__WEBPACK_IMPORTED_MODULE_17__.BaseAlign),\n/* harmony export */ Canvas: () => (/* reexport safe */ _Canvas__WEBPACK_IMPORTED_MODULE_21__.Canvas),\n/* harmony export */ Circle: () => (/* reexport safe */ _Circle__WEBPACK_IMPORTED_MODULE_13__.Circle),\n/* harmony export */ ColorBlindnessMode: () => (/* reexport safe */ _PostProcessor_ColorBlindnessMode__WEBPACK_IMPORTED_MODULE_31__.ColorBlindnessMode),\n/* harmony export */ ColorBlindnessPostProcessor: () => (/* reexport safe */ _PostProcessor_ColorBlindnessPostProcessor__WEBPACK_IMPORTED_MODULE_32__.ColorBlindnessPostProcessor),\n/* harmony export */ Debug: () => (/* reexport safe */ _Debug__WEBPACK_IMPORTED_MODULE_41__.Debug),\n/* harmony export */ DebugGraphicsComponent: () => (/* reexport safe */ _DebugGraphicsComponent__WEBPACK_IMPORTED_MODULE_8__.DebugGraphicsComponent),\n/* harmony export */ DebugText: () => (/* reexport safe */ _Context_debug_text__WEBPACK_IMPORTED_MODULE_29__.DebugText),\n/* harmony export */ DefaultAntialiasOptions: () => (/* reexport safe */ _Context_ExcaliburGraphicsContext__WEBPACK_IMPORTED_MODULE_25__.DefaultAntialiasOptions),\n/* harmony export */ DefaultPixelArtOptions: () => (/* reexport safe */ _Context_ExcaliburGraphicsContext__WEBPACK_IMPORTED_MODULE_25__.DefaultPixelArtOptions),\n/* harmony export */ Direction: () => (/* reexport safe */ _FontCommon__WEBPACK_IMPORTED_MODULE_17__.Direction),\n/* harmony export */ ExcaliburGraphicsContext2DCanvas: () => (/* reexport safe */ _Context_ExcaliburGraphicsContext2DCanvas__WEBPACK_IMPORTED_MODULE_26__.ExcaliburGraphicsContext2DCanvas),\n/* harmony export */ ExcaliburGraphicsContextWebGL: () => (/* reexport safe */ _Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_27__.ExcaliburGraphicsContextWebGL),\n/* harmony export */ Font: () => (/* reexport safe */ _Font__WEBPACK_IMPORTED_MODULE_18__.Font),\n/* harmony export */ FontCache: () => (/* reexport safe */ _FontCache__WEBPACK_IMPORTED_MODULE_19__.FontCache),\n/* harmony export */ FontStyle: () => (/* reexport safe */ _FontCommon__WEBPACK_IMPORTED_MODULE_17__.FontStyle),\n/* harmony export */ FontUnit: () => (/* reexport safe */ _FontCommon__WEBPACK_IMPORTED_MODULE_17__.FontUnit),\n/* harmony export */ Graphic: () => (/* reexport safe */ _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic),\n/* harmony export */ GraphicsComponent: () => (/* reexport safe */ _GraphicsComponent__WEBPACK_IMPORTED_MODULE_7__.GraphicsComponent),\n/* harmony export */ GraphicsGroup: () => (/* reexport safe */ _GraphicsGroup__WEBPACK_IMPORTED_MODULE_3__.GraphicsGroup),\n/* harmony export */ GraphicsSystem: () => (/* reexport safe */ _GraphicsSystem__WEBPACK_IMPORTED_MODULE_9__.GraphicsSystem),\n/* harmony export */ ImageFiltering: () => (/* reexport safe */ _Filtering__WEBPACK_IMPORTED_MODULE_34__.ImageFiltering),\n/* harmony export */ ImageSource: () => (/* reexport safe */ _ImageSource__WEBPACK_IMPORTED_MODULE_4__.ImageSource),\n/* harmony export */ ImageSourceAttributeConstants: () => (/* reexport safe */ _ImageSource__WEBPACK_IMPORTED_MODULE_4__.ImageSourceAttributeConstants),\n/* harmony export */ ImageWrapping: () => (/* reexport safe */ _Wrapping__WEBPACK_IMPORTED_MODULE_35__.ImageWrapping),\n/* harmony export */ Line: () => (/* reexport safe */ _Line__WEBPACK_IMPORTED_MODULE_6__.Line),\n/* harmony export */ Material: () => (/* reexport safe */ _Context_material__WEBPACK_IMPORTED_MODULE_40__.Material),\n/* harmony export */ NineSlice: () => (/* reexport safe */ _NineSlice__WEBPACK_IMPORTED_MODULE_22__.NineSlice),\n/* harmony export */ NineSliceStretch: () => (/* reexport safe */ _NineSlice__WEBPACK_IMPORTED_MODULE_22__.NineSliceStretch),\n/* harmony export */ OffscreenSystem: () => (/* reexport safe */ _OffscreenSystem__WEBPACK_IMPORTED_MODULE_10__.OffscreenSystem),\n/* harmony export */ ParallaxComponent: () => (/* reexport safe */ _ParallaxComponent__WEBPACK_IMPORTED_MODULE_11__.ParallaxComponent),\n/* harmony export */ ParticleRenderer: () => (/* reexport safe */ _Context_particle_renderer_particle_renderer__WEBPACK_IMPORTED_MODULE_28__.ParticleRenderer),\n/* harmony export */ Polygon: () => (/* reexport safe */ _Polygon__WEBPACK_IMPORTED_MODULE_15__.Polygon),\n/* harmony export */ QuadIndexBuffer: () => (/* reexport safe */ _Context_quad_index_buffer__WEBPACK_IMPORTED_MODULE_39__.QuadIndexBuffer),\n/* harmony export */ Raster: () => (/* reexport safe */ _Raster__WEBPACK_IMPORTED_MODULE_12__.Raster),\n/* harmony export */ Rectangle: () => (/* reexport safe */ _Rectangle__WEBPACK_IMPORTED_MODULE_14__.Rectangle),\n/* harmony export */ ScreenShader: () => (/* reexport safe */ _PostProcessor_ScreenShader__WEBPACK_IMPORTED_MODULE_30__.ScreenShader),\n/* harmony export */ Shader: () => (/* reexport safe */ _Context_shader__WEBPACK_IMPORTED_MODULE_36__.Shader),\n/* harmony export */ Sprite: () => (/* reexport safe */ _Sprite__WEBPACK_IMPORTED_MODULE_1__.Sprite),\n/* harmony export */ SpriteFont: () => (/* reexport safe */ _SpriteFont__WEBPACK_IMPORTED_MODULE_20__.SpriteFont),\n/* harmony export */ SpriteSheet: () => (/* reexport safe */ _SpriteSheet__WEBPACK_IMPORTED_MODULE_2__.SpriteSheet),\n/* harmony export */ Text: () => (/* reexport safe */ _Text__WEBPACK_IMPORTED_MODULE_16__.Text),\n/* harmony export */ TextAlign: () => (/* reexport safe */ _FontCommon__WEBPACK_IMPORTED_MODULE_17__.TextAlign),\n/* harmony export */ TextureLoader: () => (/* reexport safe */ _Context_texture_loader__WEBPACK_IMPORTED_MODULE_33__.TextureLoader),\n/* harmony export */ TiledAnimation: () => (/* reexport safe */ _TiledAnimation__WEBPACK_IMPORTED_MODULE_24__.TiledAnimation),\n/* harmony export */ TiledSprite: () => (/* reexport safe */ _TiledSprite__WEBPACK_IMPORTED_MODULE_23__.TiledSprite),\n/* harmony export */ VertexBuffer: () => (/* reexport safe */ _Context_vertex_buffer__WEBPACK_IMPORTED_MODULE_37__.VertexBuffer),\n/* harmony export */ VertexLayout: () => (/* reexport safe */ _Context_vertex_layout__WEBPACK_IMPORTED_MODULE_38__.VertexLayout),\n/* harmony export */ hasGraphicsTick: () => (/* reexport safe */ _GraphicsComponent__WEBPACK_IMPORTED_MODULE_7__.hasGraphicsTick),\n/* harmony export */ parseImageFiltering: () => (/* reexport safe */ _Filtering__WEBPACK_IMPORTED_MODULE_34__.parseImageFiltering),\n/* harmony export */ parseImageWrapping: () => (/* reexport safe */ _Wrapping__WEBPACK_IMPORTED_MODULE_35__.parseImageWrapping),\n/* harmony export */ pixelSnapEpsilon: () => (/* reexport safe */ _Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_27__.pixelSnapEpsilon),\n/* harmony export */ webgl: () => (/* reexport module object */ _Context_webgl_util__WEBPACK_IMPORTED_MODULE_42__)\n/* harmony export */ });\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Sprite__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Sprite */ \"./Graphics/Sprite.ts\");\n/* harmony import */ var _SpriteSheet__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./SpriteSheet */ \"./Graphics/SpriteSheet.ts\");\n/* harmony import */ var _GraphicsGroup__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./GraphicsGroup */ \"./Graphics/GraphicsGroup.ts\");\n/* harmony import */ var _ImageSource__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./ImageSource */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Animation__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Animation */ \"./Graphics/Animation.ts\");\n/* harmony import */ var _Line__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Line */ \"./Graphics/Line.ts\");\n/* harmony import */ var _GraphicsComponent__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _DebugGraphicsComponent__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./DebugGraphicsComponent */ \"./Graphics/DebugGraphicsComponent.ts\");\n/* harmony import */ var _GraphicsSystem__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./GraphicsSystem */ \"./Graphics/GraphicsSystem.ts\");\n/* harmony import */ var _OffscreenSystem__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./OffscreenSystem */ \"./Graphics/OffscreenSystem.ts\");\n/* harmony import */ var _ParallaxComponent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./ParallaxComponent */ \"./Graphics/ParallaxComponent.ts\");\n/* harmony import */ var _Raster__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Raster */ \"./Graphics/Raster.ts\");\n/* harmony import */ var _Circle__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Circle */ \"./Graphics/Circle.ts\");\n/* harmony import */ var _Rectangle__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Rectangle */ \"./Graphics/Rectangle.ts\");\n/* harmony import */ var _Polygon__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Polygon */ \"./Graphics/Polygon.ts\");\n/* harmony import */ var _Text__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Text */ \"./Graphics/Text.ts\");\n/* harmony import */ var _FontCommon__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./FontCommon */ \"./Graphics/FontCommon.ts\");\n/* harmony import */ var _Font__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Font */ \"./Graphics/Font.ts\");\n/* harmony import */ var _FontCache__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./FontCache */ \"./Graphics/FontCache.ts\");\n/* harmony import */ var _SpriteFont__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./SpriteFont */ \"./Graphics/SpriteFont.ts\");\n/* harmony import */ var _Canvas__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./Canvas */ \"./Graphics/Canvas.ts\");\n/* harmony import */ var _NineSlice__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./NineSlice */ \"./Graphics/NineSlice.ts\");\n/* harmony import */ var _TiledSprite__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./TiledSprite */ \"./Graphics/TiledSprite.ts\");\n/* harmony import */ var _TiledAnimation__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./TiledAnimation */ \"./Graphics/TiledAnimation.ts\");\n/* harmony import */ var _Context_ExcaliburGraphicsContext__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./Context/ExcaliburGraphicsContext */ \"./Graphics/Context/ExcaliburGraphicsContext.ts\");\n/* harmony import */ var _Context_ExcaliburGraphicsContext2DCanvas__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./Context/ExcaliburGraphicsContext2DCanvas */ \"./Graphics/Context/ExcaliburGraphicsContext2DCanvas.ts\");\n/* harmony import */ var _Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./Context/ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _Context_particle_renderer_particle_renderer__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./Context/particle-renderer/particle-renderer */ \"./Graphics/Context/particle-renderer/particle-renderer.ts\");\n/* harmony import */ var _Context_debug_text__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./Context/debug-text */ \"./Graphics/Context/debug-text.ts\");\n/* harmony import */ var _PostProcessor_ScreenShader__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./PostProcessor/ScreenShader */ \"./Graphics/PostProcessor/ScreenShader.ts\");\n/* harmony import */ var _PostProcessor_ColorBlindnessMode__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./PostProcessor/ColorBlindnessMode */ \"./Graphics/PostProcessor/ColorBlindnessMode.ts\");\n/* harmony import */ var _PostProcessor_ColorBlindnessPostProcessor__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./PostProcessor/ColorBlindnessPostProcessor */ \"./Graphics/PostProcessor/ColorBlindnessPostProcessor.ts\");\n/* harmony import */ var _Context_texture_loader__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./Context/texture-loader */ \"./Graphics/Context/texture-loader.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./Wrapping */ \"./Graphics/Wrapping.ts\");\n/* harmony import */ var _Context_shader__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./Context/shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _Context_vertex_buffer__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./Context/vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _Context_vertex_layout__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./Context/vertex-layout */ \"./Graphics/Context/vertex-layout.ts\");\n/* harmony import */ var _Context_quad_index_buffer__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./Context/quad-index-buffer */ \"./Graphics/Context/quad-index-buffer.ts\");\n/* harmony import */ var _Context_material__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./Context/material */ \"./Graphics/Context/material.ts\");\n/* harmony import */ var _Debug__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ./Debug */ \"./Graphics/Debug.ts\");\n/* harmony import */ var _Context_webgl_util__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ./Context/webgl-util */ \"./Graphics/Context/webgl-util.ts\");\n// Graphics\n\n\n\n\n\n\n\n// Graphics ECS\n\n\n\n\n\n// Raster graphics\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// TODO DELETEME\n\n\n// Post Processor\n\n\n\n\n\n\n\n// Rendering\n\n\n\n\n\n\n// Debug\n\n// Util\n\n\n\n\n/***/ }),\n\n/***/ \"./Id.ts\":\n/*!***************!*\\\n !*** ./Id.ts ***!\n \\***************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ createId: () => (/* binding */ createId)\n/* harmony export */ });\n/**\n * Create a branded ID type from a number\n */\nfunction createId(type, value) {\n return { type, value };\n}\n\n\n/***/ }),\n\n/***/ \"./Input/Gamepad.ts\":\n/*!**************************!*\\\n !*** ./Input/Gamepad.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Axes: () => (/* binding */ Axes),\n/* harmony export */ Buttons: () => (/* binding */ Buttons),\n/* harmony export */ Gamepad: () => (/* binding */ Gamepad),\n/* harmony export */ GamepadEvents: () => (/* binding */ GamepadEvents),\n/* harmony export */ Gamepads: () => (/* binding */ Gamepads)\n/* harmony export */ });\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n\n\nconst GamepadEvents = {\n GamepadConnect: 'connect',\n GamepadDisconnect: 'disconnect',\n GamepadButton: 'button',\n GamepadAxis: 'axis'\n};\n/**\n * Excalibur leverages the HTML5 Gamepad API [where it is supported](http://caniuse.com/#feat=gamepad)\n * to provide controller support for your games.\n */\nclass Gamepads {\n constructor() {\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n /**\n * Whether or not to poll for Gamepad input (default: `false`)\n */\n this.enabled = false;\n /**\n * Whether or not Gamepad API is supported\n */\n this.supported = !!navigator.getGamepads;\n this._gamePadTimeStamps = [0, 0, 0, 0];\n this._oldPads = [];\n this._pads = [];\n this._initSuccess = false;\n this._navigator = navigator;\n this._minimumConfiguration = null;\n this._enabled = true;\n }\n init() {\n if (!this.supported) {\n return;\n }\n if (this._initSuccess) {\n return;\n }\n // In Chrome, this will return 4 undefined items until a button is pressed\n // In FF, this will not return any items until a button is pressed\n this._oldPads = this._clonePads(this._navigator.getGamepads());\n if (this._oldPads.length && this._oldPads[0]) {\n this._initSuccess = true;\n }\n }\n toggleEnabled(enabled) {\n this._enabled = enabled;\n }\n /**\n * Sets the minimum gamepad configuration, for example {axis: 4, buttons: 4} means\n * this game requires at minimum 4 axis inputs and 4 buttons, this is not restrictive\n * all other controllers with more axis or buttons are valid as well. If no minimum\n * configuration is set all pads are valid.\n */\n setMinimumGamepadConfiguration(config) {\n this._enableAndUpdate(); // if config is used, implicitly enable\n this._minimumConfiguration = config;\n }\n /**\n * When implicitly enabled, set the enabled flag and run an update so information is updated\n */\n _enableAndUpdate() {\n if (!this.enabled) {\n this.enabled = true;\n this.update();\n }\n }\n /**\n * Checks a navigator gamepad against the minimum configuration if present.\n */\n _isGamepadValid(pad) {\n if (!this._minimumConfiguration) {\n return true;\n }\n if (!pad) {\n return false;\n }\n const axesLength = pad.axes.filter((value) => {\n return typeof value !== undefined;\n }).length;\n const buttonLength = pad.buttons.filter((value) => {\n return typeof value !== undefined;\n }).length;\n return axesLength >= this._minimumConfiguration.axis && buttonLength >= this._minimumConfiguration.buttons && pad.connected;\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n this._enableAndUpdate(); // implicitly enable\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this._enableAndUpdate(); // implicitly enable\n this.events.off(eventName, handler);\n }\n /**\n * Updates Gamepad state and publishes Gamepad events\n */\n update() {\n if (!this.enabled || !this.supported) {\n return;\n }\n if (!this._enabled) {\n return;\n }\n this.init();\n const gamepads = this._navigator.getGamepads();\n for (let i = 0; i < gamepads.length; i++) {\n if (!gamepads[i]) {\n const gamepad = this.at(i);\n // If was connected, but now isn't emit the disconnect event\n if (gamepad.connected) {\n this.events.emit('disconnect', new _Events__WEBPACK_IMPORTED_MODULE_1__.GamepadDisconnectEvent(i, gamepad));\n }\n // Reset connection status\n gamepad.connected = false;\n continue;\n }\n else {\n if (!this.at(i).connected && this._isGamepadValid(gamepads[i])) {\n this.events.emit('connect', new _Events__WEBPACK_IMPORTED_MODULE_1__.GamepadConnectEvent(i, this.at(i)));\n }\n // Set connection status\n this.at(i).connected = true;\n }\n this.at(i).update();\n // Only supported in Chrome\n if (gamepads[i].timestamp && gamepads[i].timestamp === this._gamePadTimeStamps[i]) {\n continue;\n }\n this._gamePadTimeStamps[i] = gamepads[i].timestamp;\n // Add reference to navigator gamepad\n this.at(i).navigatorGamepad = gamepads[i];\n // Buttons\n let b, bi, a, ai, value;\n for (b in Buttons) {\n bi = Buttons[b];\n if (typeof bi === 'number') {\n if (gamepads[i].buttons[bi]) {\n value = gamepads[i].buttons[bi].value;\n if (value !== this._oldPads[i].getButton(bi)) {\n if (gamepads[i].buttons[bi].pressed) {\n this.at(i).updateButton(bi, value);\n this.at(i).events.emit('button', new _Events__WEBPACK_IMPORTED_MODULE_1__.GamepadButtonEvent(bi, value, this.at(i)));\n }\n else {\n this.at(i).updateButton(bi, 0);\n }\n }\n }\n }\n }\n // Axes\n for (a in Axes) {\n ai = Axes[a];\n if (typeof ai === 'number') {\n value = gamepads[i].axes[ai];\n if (value !== this._oldPads[i].getAxes(ai)) {\n this.at(i).updateAxes(ai, value);\n this.at(i).events.emit('axis', new _Events__WEBPACK_IMPORTED_MODULE_1__.GamepadAxisEvent(ai, value, this.at(i)));\n }\n }\n }\n this._oldPads[i] = this._clonePad(gamepads[i]);\n }\n }\n /**\n * Safely retrieves a Gamepad at a specific index and creates one if it doesn't yet exist\n */\n at(index) {\n this._enableAndUpdate(); // implicitly enable gamepads when at() is called\n if (index >= this._pads.length) {\n // Ensure there is a pad to retrieve\n for (let i = this._pads.length - 1, max = index; i < max; i++) {\n this._pads.push(new Gamepad());\n this._oldPads.push(new Gamepad());\n }\n }\n return this._pads[index];\n }\n /**\n * Returns a list of all valid gamepads that meet the minimum configuration requirement.\n */\n getValidGamepads() {\n this._enableAndUpdate();\n const result = [];\n for (let i = 0; i < this._pads.length; i++) {\n if (this._isGamepadValid(this.at(i).navigatorGamepad) && this.at(i).connected) {\n result.push(this.at(i));\n }\n }\n return result;\n }\n /**\n * Gets the number of connected gamepads\n */\n count() {\n return this._pads.filter((p) => p.connected).length;\n }\n _clonePads(pads) {\n const arr = [];\n for (let i = 0, len = pads.length; i < len; i++) {\n arr.push(this._clonePad(pads[i]));\n }\n return arr;\n }\n /**\n * Fastest way to clone a known object is to do it yourself\n */\n _clonePad(pad) {\n let i, len;\n const clonedPad = new Gamepad();\n if (!pad) {\n return clonedPad;\n }\n for (i = 0, len = pad.buttons.length; i < len; i++) {\n if (pad.buttons[i]) {\n clonedPad.updateButton(i, pad.buttons[i].value);\n }\n }\n for (i = 0, len = pad.axes.length; i < len; i++) {\n clonedPad.updateAxes(i, pad.axes[i]);\n }\n return clonedPad;\n }\n}\n/**\n * The minimum value an axis has to move before considering it a change\n */\nGamepads.MinAxisMoveThreshold = 0.05;\n/**\n * Gamepad holds state information for a connected controller. See {@apilink Gamepads}\n * for more information on handling controller input.\n */\nclass Gamepad {\n constructor() {\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n this.connected = false;\n this._axes = new Array(4);\n this._buttons = new Array(16);\n this._buttonsUp = new Array(16);\n this._buttonsDown = new Array(16);\n for (let i = 0; i < this._buttons.length; i++) {\n this._buttons[i] = 0;\n }\n for (let i = 0; i < this._axes.length; i++) {\n this._axes[i] = 0;\n }\n }\n update() {\n // Reset buttonsDown and buttonsUp after update is complete\n this._buttonsDown = new Array(16);\n this._buttonsUp = new Array(16);\n }\n /**\n * Whether or not the given button is pressed\n * @deprecated will be removed in v0.28.0. Use isButtonHeld instead\n * @param button The button to query\n * @param threshold The threshold over which the button is considered to be pressed\n */\n isButtonPressed(button, threshold = 1) {\n return this._buttons[button] >= threshold;\n }\n /**\n * Tests if a certain button is held down. This is persisted between frames.\n * @param button The button to query\n * @param threshold The threshold over which the button is considered to be pressed\n */\n isButtonHeld(button, threshold = 1) {\n return this._buttons[button] >= threshold;\n }\n /**\n * Tests if a certain button was just pressed this frame. This is cleared at the end of the update frame.\n * @param button Test whether a button was just pressed\n * @param threshold The threshold over which the button is considered to be pressed\n */\n wasButtonPressed(button, threshold = 1) {\n return this._buttonsDown[button] >= threshold;\n }\n /**\n * Tests if a certain button was just released this frame. This is cleared at the end of the update frame.\n * @param button Test whether a button was just released\n */\n wasButtonReleased(button) {\n return Boolean(this._buttonsUp[button]);\n }\n /**\n * Gets the given button value between 0 and 1\n */\n getButton(button) {\n return this._buttons[button];\n }\n /**\n * Gets the given axis value between -1 and 1. Values below\n * {@apilink MinAxisMoveThreshold} are considered 0.\n */\n getAxes(axes) {\n const value = this._axes[axes];\n if (Math.abs(value) < Gamepads.MinAxisMoveThreshold) {\n return 0;\n }\n else {\n return value;\n }\n }\n updateButton(buttonIndex, value) {\n // button was just released\n if (value === 0 && this._buttons[buttonIndex]) {\n this._buttonsUp[buttonIndex] = 1;\n // button was just pressed\n }\n else {\n this._buttonsDown[buttonIndex] = value;\n }\n this._buttons[buttonIndex] = value;\n }\n updateAxes(axesIndex, value) {\n this._axes[axesIndex] = value;\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n}\n/**\n * Gamepad Buttons enumeration\n */\nvar Buttons;\n(function (Buttons) {\n /**\n * Face 1 button (e.g. A)\n */\n Buttons[Buttons[\"Face1\"] = 0] = \"Face1\";\n /**\n * Face 2 button (e.g. B)\n */\n Buttons[Buttons[\"Face2\"] = 1] = \"Face2\";\n /**\n * Face 3 button (e.g. X)\n */\n Buttons[Buttons[\"Face3\"] = 2] = \"Face3\";\n /**\n * Face 4 button (e.g. Y)\n */\n Buttons[Buttons[\"Face4\"] = 3] = \"Face4\";\n /**\n * Left bumper button\n */\n Buttons[Buttons[\"LeftBumper\"] = 4] = \"LeftBumper\";\n /**\n * Right bumper button\n */\n Buttons[Buttons[\"RightBumper\"] = 5] = \"RightBumper\";\n /**\n * Left trigger button\n */\n Buttons[Buttons[\"LeftTrigger\"] = 6] = \"LeftTrigger\";\n /**\n * Right trigger button\n */\n Buttons[Buttons[\"RightTrigger\"] = 7] = \"RightTrigger\";\n /**\n * Select button\n */\n Buttons[Buttons[\"Select\"] = 8] = \"Select\";\n /**\n * Start button\n */\n Buttons[Buttons[\"Start\"] = 9] = \"Start\";\n /**\n * Left analog stick press (e.g. L3)\n */\n Buttons[Buttons[\"LeftStick\"] = 10] = \"LeftStick\";\n /**\n * Right analog stick press (e.g. R3)\n */\n Buttons[Buttons[\"RightStick\"] = 11] = \"RightStick\";\n /**\n * D-pad up\n */\n Buttons[Buttons[\"DpadUp\"] = 12] = \"DpadUp\";\n /**\n * D-pad down\n */\n Buttons[Buttons[\"DpadDown\"] = 13] = \"DpadDown\";\n /**\n * D-pad left\n */\n Buttons[Buttons[\"DpadLeft\"] = 14] = \"DpadLeft\";\n /**\n * D-pad right\n */\n Buttons[Buttons[\"DpadRight\"] = 15] = \"DpadRight\";\n})(Buttons || (Buttons = {}));\n/**\n * Gamepad Axes enumeration\n */\nvar Axes;\n(function (Axes) {\n /**\n * Left analogue stick X direction\n */\n Axes[Axes[\"LeftStickX\"] = 0] = \"LeftStickX\";\n /**\n * Left analogue stick Y direction\n */\n Axes[Axes[\"LeftStickY\"] = 1] = \"LeftStickY\";\n /**\n * Right analogue stick X direction\n */\n Axes[Axes[\"RightStickX\"] = 2] = \"RightStickX\";\n /**\n * Right analogue stick Y direction\n */\n Axes[Axes[\"RightStickY\"] = 3] = \"RightStickY\";\n})(Axes || (Axes = {}));\n\n\n/***/ }),\n\n/***/ \"./Input/InputHost.ts\":\n/*!****************************!*\\\n !*** ./Input/InputHost.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ InputHost: () => (/* binding */ InputHost)\n/* harmony export */ });\n/* harmony import */ var _Gamepad__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Gamepad */ \"./Input/Gamepad.ts\");\n/* harmony import */ var _InputMapper__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./InputMapper */ \"./Input/InputMapper.ts\");\n/* harmony import */ var _Keyboard__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Keyboard */ \"./Input/Keyboard.ts\");\n/* harmony import */ var _PointerEventReceiver__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./PointerEventReceiver */ \"./Input/PointerEventReceiver.ts\");\n\n\n\n\nclass InputHost {\n constructor(options) {\n this._enabled = true;\n const { pointerTarget, grabWindowFocus, engine } = options;\n this.keyboard = new _Keyboard__WEBPACK_IMPORTED_MODULE_0__.Keyboard();\n this.pointers = new _PointerEventReceiver__WEBPACK_IMPORTED_MODULE_1__.PointerEventReceiver(pointerTarget, engine);\n this.gamepads = new _Gamepad__WEBPACK_IMPORTED_MODULE_2__.Gamepads();\n this.keyboard.init({ grabWindowFocus });\n this.pointers.init({ grabWindowFocus });\n this.gamepads.init();\n this.inputMapper = new _InputMapper__WEBPACK_IMPORTED_MODULE_3__.InputMapper({\n keyboard: this.keyboard,\n pointers: this.pointers,\n gamepads: this.gamepads\n });\n }\n get enabled() {\n return this._enabled;\n }\n toggleEnabled(enabled) {\n this._enabled = enabled;\n this.keyboard.toggleEnabled(this._enabled);\n this.pointers.toggleEnabled(this._enabled);\n this.gamepads.toggleEnabled(this._enabled);\n }\n update() {\n if (this._enabled) {\n this.inputMapper.execute();\n this.keyboard.update();\n this.gamepads.update();\n }\n }\n clear() {\n this.keyboard.clear();\n this.pointers.clear();\n // this.gamepads.clear();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Input/InputMapper.ts\":\n/*!******************************!*\\\n !*** ./Input/InputMapper.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ InputMapper: () => (/* binding */ InputMapper)\n/* harmony export */ });\n/**\n * This allows you to map multiple inputs to specific commands! This is especially useful when\n * you need to allow multiple input sources to control a specific action.\n */\nclass InputMapper {\n constructor(inputs) {\n this.inputs = inputs;\n this._handlers = new Map();\n }\n /**\n * Executes the input map, called internally by Excalibur\n */\n execute() {\n for (const [input, command] of this._handlers.entries()) {\n const results = input(this.inputs);\n if (results) {\n command(results);\n }\n }\n }\n /**\n * This allows you to map multiple inputs to specific commands! This is useful\n *\n * The inputHandler should return a truthy value if you wish the commandHandler to fire.\n *\n * Example:\n * ```typescript\n * const moveRight = (amount: number) => { actor.vel.x = 100 * amount }\n * const moveLeft = (amount: number) => { actor.vel.x = -100 * amount }\n * const moveUp = (amount: number) => { actor.vel.y = -100 * amount }\n * const moveDown = (amount: number) => { actor.vel.y = 100 * amount }\n *\n * engine.inputMapper.on(({keyboard}) => keyboard.isHeld(ex.Keys.ArrowRight) ? 1 : 0, moveRight);\n * engine.inputMapper.on(({gamepads}) => gamepads.at(0).isButtonPressed(ex.Buttons.DpadRight) ? 1 : 0, moveRight);\n * engine.inputMapper.on(({gamepads}) => gamepads.at(0).getAxes(ex.Axes.LeftStickX) > 0 ?\n * gamepads.at(0).getAxes(ex.Axes.LeftStickX) : 0, moveRight);\n * ```\n * @param inputHandler\n * @param commandHandler\n */\n on(inputHandler, commandHandler) {\n this._handlers.set(inputHandler, commandHandler);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Input/Keyboard.ts\":\n/*!***************************!*\\\n !*** ./Input/Keyboard.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ KeyEvent: () => (/* binding */ KeyEvent),\n/* harmony export */ KeyEvents: () => (/* binding */ KeyEvents),\n/* harmony export */ Keyboard: () => (/* binding */ Keyboard),\n/* harmony export */ Keys: () => (/* binding */ Keys)\n/* harmony export */ });\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _Util_IFrame__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Util/IFrame */ \"./Util/IFrame.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n\n/**\n * Enum representing physical input key codes\n *\n * Spec: https://w3c.github.io/uievents-code/#key-alphanumeric-section\n */\nvar Keys;\n(function (Keys) {\n // Writing System Keys https://w3c.github.io/uievents-code/#key-alphanumeric-writing-system\n Keys[\"Backquote\"] = \"Backquote\";\n Keys[\"Backslash\"] = \"Backslash\";\n Keys[\"BracketLeft\"] = \"BracketLeft\";\n Keys[\"BracketRight\"] = \"BracketRight\";\n Keys[\"Comma\"] = \"Comma\";\n // NUMBERS\n Keys[\"Key0\"] = \"Digit0\";\n Keys[\"Key1\"] = \"Digit1\";\n Keys[\"Key2\"] = \"Digit2\";\n Keys[\"Key3\"] = \"Digit3\";\n Keys[\"Key4\"] = \"Digit4\";\n Keys[\"Key5\"] = \"Digit5\";\n Keys[\"Key6\"] = \"Digit6\";\n Keys[\"Key7\"] = \"Digit7\";\n Keys[\"Key8\"] = \"Digit8\";\n Keys[\"Key9\"] = \"Digit9\";\n Keys[\"Digit0\"] = \"Digit0\";\n Keys[\"Digit1\"] = \"Digit1\";\n Keys[\"Digit2\"] = \"Digit2\";\n Keys[\"Digit3\"] = \"Digit3\";\n Keys[\"Digit4\"] = \"Digit4\";\n Keys[\"Digit5\"] = \"Digit5\";\n Keys[\"Digit6\"] = \"Digit6\";\n Keys[\"Digit7\"] = \"Digit7\";\n Keys[\"Digit8\"] = \"Digit8\";\n Keys[\"Digit9\"] = \"Digit9\";\n Keys[\"Equal\"] = \"Equal\";\n Keys[\"IntlBackslash\"] = \"IntlBackslash\";\n Keys[\"IntlRo\"] = \"IntlRo\";\n Keys[\"IntlYen\"] = \"IntlYen\";\n // LETTERS\n Keys[\"A\"] = \"KeyA\";\n Keys[\"B\"] = \"KeyB\";\n Keys[\"C\"] = \"KeyC\";\n Keys[\"D\"] = \"KeyD\";\n Keys[\"E\"] = \"KeyE\";\n Keys[\"F\"] = \"KeyF\";\n Keys[\"G\"] = \"KeyG\";\n Keys[\"H\"] = \"KeyH\";\n Keys[\"I\"] = \"KeyI\";\n Keys[\"J\"] = \"KeyJ\";\n Keys[\"K\"] = \"KeyK\";\n Keys[\"L\"] = \"KeyL\";\n Keys[\"M\"] = \"KeyM\";\n Keys[\"N\"] = \"KeyN\";\n Keys[\"O\"] = \"KeyO\";\n Keys[\"P\"] = \"KeyP\";\n Keys[\"Q\"] = \"KeyQ\";\n Keys[\"R\"] = \"KeyR\";\n Keys[\"S\"] = \"KeyS\";\n Keys[\"T\"] = \"KeyT\";\n Keys[\"U\"] = \"KeyU\";\n Keys[\"V\"] = \"KeyV\";\n Keys[\"W\"] = \"KeyW\";\n Keys[\"X\"] = \"KeyX\";\n Keys[\"Y\"] = \"KeyY\";\n Keys[\"Z\"] = \"KeyZ\";\n Keys[\"KeyA\"] = \"KeyA\";\n Keys[\"KeyB\"] = \"KeyB\";\n Keys[\"KeyC\"] = \"KeyC\";\n Keys[\"KeyD\"] = \"KeyD\";\n Keys[\"KeyE\"] = \"KeyE\";\n Keys[\"KeyF\"] = \"KeyF\";\n Keys[\"KeyG\"] = \"KeyG\";\n Keys[\"KeyH\"] = \"KeyH\";\n Keys[\"KeyI\"] = \"KeyI\";\n Keys[\"KeyJ\"] = \"KeyJ\";\n Keys[\"KeyK\"] = \"KeyK\";\n Keys[\"KeyL\"] = \"KeyL\";\n Keys[\"KeyM\"] = \"KeyM\";\n Keys[\"KeyN\"] = \"KeyN\";\n Keys[\"KeyO\"] = \"KeyO\";\n Keys[\"KeyP\"] = \"KeyP\";\n Keys[\"KeyQ\"] = \"KeyQ\";\n Keys[\"KeyR\"] = \"KeyR\";\n Keys[\"KeyS\"] = \"KeyS\";\n Keys[\"KeyT\"] = \"KeyT\";\n Keys[\"KeyU\"] = \"KeyU\";\n Keys[\"KeyV\"] = \"KeyV\";\n Keys[\"KeyW\"] = \"KeyW\";\n Keys[\"KeyX\"] = \"KeyX\";\n Keys[\"KeyY\"] = \"KeyY\";\n Keys[\"KeyZ\"] = \"KeyZ\";\n // SYMBOLS\n Keys[\"Minus\"] = \"Minus\";\n Keys[\"Period\"] = \"Period\";\n Keys[\"Quote\"] = \"Quote\";\n Keys[\"Semicolon\"] = \"Semicolon\";\n Keys[\"Slash\"] = \"Slash\";\n // Functional keys https://w3c.github.io/uievents-code/#key-alphanumeric-functional\n Keys[\"AltLeft\"] = \"AltLeft\";\n Keys[\"AltRight\"] = \"AltRight\";\n Keys[\"Alt\"] = \"Alt\";\n Keys[\"AltGraph\"] = \"AltGraph\";\n Keys[\"Backspace\"] = \"Backspace\";\n Keys[\"CapsLock\"] = \"CapsLock\";\n Keys[\"ContextMenu\"] = \"ContextMenu\";\n Keys[\"ControlLeft\"] = \"ControlLeft\";\n Keys[\"ControlRight\"] = \"ControlRight\";\n Keys[\"Enter\"] = \"Enter\";\n Keys[\"MetaLeft\"] = \"MetaLeft\";\n Keys[\"MetaRight\"] = \"MetaRight\";\n Keys[\"ShiftLeft\"] = \"ShiftLeft\";\n Keys[\"ShiftRight\"] = \"ShiftRight\";\n Keys[\"Space\"] = \"Space\";\n Keys[\"Tab\"] = \"Tab\";\n Keys[\"Convert\"] = \"Convert\";\n Keys[\"KanaMode\"] = \"KanaMode\";\n Keys[\"NonConvert\"] = \"NonConvert\";\n // Control Pad https://w3c.github.io/uievents-code/#key-controlpad-section\n Keys[\"Delete\"] = \"Delete\";\n Keys[\"End\"] = \"End\";\n Keys[\"Help\"] = \"Help\";\n Keys[\"Home\"] = \"Home\";\n Keys[\"Insert\"] = \"Insert\";\n Keys[\"PageDown\"] = \"PageDown\";\n Keys[\"PageUp\"] = \"PageUp\";\n // Arrow Pad https://w3c.github.io/uievents-code/#key-arrowpad-section\n Keys[\"Up\"] = \"ArrowUp\";\n Keys[\"Down\"] = \"ArrowDown\";\n Keys[\"Left\"] = \"ArrowLeft\";\n Keys[\"Right\"] = \"ArrowRight\";\n Keys[\"ArrowUp\"] = \"ArrowUp\";\n Keys[\"ArrowDown\"] = \"ArrowDown\";\n Keys[\"ArrowLeft\"] = \"ArrowLeft\";\n Keys[\"ArrowRight\"] = \"ArrowRight\";\n // Numpad Section https://w3c.github.io/uievents-code/#key-numpad-section\n Keys[\"NumLock\"] = \"NumLock\";\n Keys[\"Numpad0\"] = \"Numpad0\";\n Keys[\"Numpad1\"] = \"Numpad1\";\n Keys[\"Numpad2\"] = \"Numpad2\";\n Keys[\"Numpad3\"] = \"Numpad3\";\n Keys[\"Numpad4\"] = \"Numpad4\";\n Keys[\"Numpad5\"] = \"Numpad5\";\n Keys[\"Numpad6\"] = \"Numpad6\";\n Keys[\"Numpad7\"] = \"Numpad7\";\n Keys[\"Numpad8\"] = \"Numpad8\";\n Keys[\"Numpad9\"] = \"Numpad9\";\n Keys[\"Num0\"] = \"Numpad0\";\n Keys[\"Num1\"] = \"Numpad1\";\n Keys[\"Num2\"] = \"Numpad2\";\n Keys[\"Num3\"] = \"Numpad3\";\n Keys[\"Num4\"] = \"Numpad4\";\n Keys[\"Num5\"] = \"Numpad5\";\n Keys[\"Num6\"] = \"Numpad6\";\n Keys[\"Num7\"] = \"Numpad7\";\n Keys[\"Num8\"] = \"Numpad8\";\n Keys[\"Num9\"] = \"Numpad9\";\n Keys[\"NumAdd\"] = \"NumpadAdd\";\n Keys[\"NumpadAdd\"] = \"NumpadAdd\";\n Keys[\"NumDecimal\"] = \"NumpadDecimal\";\n Keys[\"NumpadDecimal\"] = \"NumpadDecimal\";\n Keys[\"NumDivide\"] = \"NumpadDivide\";\n Keys[\"NumpadDivide\"] = \"NumpadDivide\";\n Keys[\"NumEnter\"] = \"NumpadEnter\";\n Keys[\"NumpadEnter\"] = \"NumpadEnter\";\n Keys[\"NumMultiply\"] = \"NumpadMultiply\";\n Keys[\"NumpadMultiply\"] = \"NumpadMultiply\";\n Keys[\"NumSubtract\"] = \"NumpadSubtract\";\n Keys[\"NumpadSubtract\"] = \"NumpadSubtract\";\n // NumComma = 'NumpadComma', // not x-browser\n // NumpadComma = 'NumpadComma', // not x-browser\n // Function section https://w3c.github.io/uievents-code/#key-function-section\n Keys[\"Esc\"] = \"Escape\";\n Keys[\"Escape\"] = \"Escape\";\n Keys[\"F1\"] = \"F1\";\n Keys[\"F2\"] = \"F2\";\n Keys[\"F3\"] = \"F3\";\n Keys[\"F4\"] = \"F4\";\n Keys[\"F5\"] = \"F5\";\n Keys[\"F6\"] = \"F6\";\n Keys[\"F7\"] = \"F7\";\n Keys[\"F8\"] = \"F8\";\n Keys[\"F9\"] = \"F9\";\n Keys[\"F10\"] = \"F10\";\n Keys[\"F11\"] = \"F11\";\n Keys[\"F12\"] = \"F12\";\n Keys[\"F13\"] = \"F13\";\n Keys[\"F14\"] = \"F14\";\n Keys[\"F15\"] = \"F15\";\n Keys[\"F16\"] = \"F16\";\n Keys[\"F17\"] = \"F17\";\n Keys[\"F18\"] = \"F18\";\n Keys[\"F19\"] = \"F19\";\n Keys[\"F20\"] = \"F20\";\n Keys[\"PrintScreen\"] = \"PrintScreen\";\n Keys[\"ScrollLock\"] = \"ScrollLock\";\n Keys[\"Pause\"] = \"Pause\";\n Keys[\"Unidentified\"] = \"Unidentified\";\n})(Keys || (Keys = {}));\n/**\n * Event thrown on a game object for a key event\n */\nclass KeyEvent extends _Events__WEBPACK_IMPORTED_MODULE_0__.GameEvent {\n /**\n * @param key The key responsible for throwing the event\n * @param value The key's typed value the browser detected\n * @param originalEvent The original keyboard event that Excalibur handled\n */\n constructor(key, value, originalEvent) {\n super();\n this.key = key;\n this.value = value;\n this.originalEvent = originalEvent;\n }\n}\nconst KeyEvents = {\n Press: 'press',\n Hold: 'hold',\n Release: 'release'\n};\n/**\n * Provides keyboard support for Excalibur.\n */\nclass Keyboard {\n constructor() {\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_1__.EventEmitter();\n this._enabled = true;\n /**\n * Keys that are currently held down\n */\n this._keys = [];\n /**\n * Keys up in the current frame\n */\n this._keysUp = [];\n /**\n * Keys down in the current frame\n */\n this._keysDown = [];\n this._releaseAllKeys = (ev) => {\n for (const code of this._keys) {\n const keyEvent = new KeyEvent(code, ev.key, ev);\n this.events.emit('up', keyEvent);\n this.events.emit('release', keyEvent);\n }\n this._keysUp = Array.from(new Set(this._keys.concat(this._keysUp)));\n this._keys.length = 0;\n };\n this._handleKeyDown = (ev) => {\n if (!this._enabled) {\n return;\n }\n // handle macos meta key issue\n // https://github.com/excaliburjs/Excalibur/issues/2608\n if (!ev.metaKey && (this._keys.includes(Keys.MetaLeft) || this._keys.includes(Keys.MetaRight))) {\n this._releaseAllKeys(ev);\n }\n const code = ev.code;\n if (this._keys.indexOf(code) === -1) {\n this._keys.push(code);\n this._keysDown.push(code);\n const keyEvent = new KeyEvent(code, ev.key, ev);\n this.events.emit('down', keyEvent);\n this.events.emit('press', keyEvent);\n }\n };\n this._handleKeyUp = (ev) => {\n if (!this._enabled) {\n return;\n }\n const code = ev.code;\n const key = this._keys.indexOf(code);\n this._keys.splice(key, 1);\n this._keysUp.push(code);\n const keyEvent = new KeyEvent(code, ev.key, ev);\n // alias the old api, we may want to deprecate this in the future\n this.events.emit('up', keyEvent);\n this.events.emit('release', keyEvent);\n // handle macos meta key issue\n // https://github.com/excaliburjs/Excalibur/issues/2608\n if (ev.key === 'Meta') {\n this._releaseAllKeys(ev);\n }\n };\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n /**\n * Initialize Keyboard event listeners\n */\n init(keyboardOptions) {\n let { global } = keyboardOptions;\n const { grabWindowFocus } = keyboardOptions;\n if (!global) {\n if ((0,_Util_IFrame__WEBPACK_IMPORTED_MODULE_2__.isCrossOriginIframe)()) {\n global = window;\n // Workaround for iframes like for itch.io or codesandbox\n // https://www.reddit.com/r/gamemaker/comments/kfs5cs/keyboard_inputs_no_longer_working_in_html5_game/\n // https://forum.gamemaker.io/index.php?threads/solved-keyboard-issue-on-itch-io.87336/\n if (grabWindowFocus) {\n window.focus();\n }\n _Util_Log__WEBPACK_IMPORTED_MODULE_3__.Logger.getInstance().warn('Excalibur might be in a cross-origin iframe, in order to receive keyboard events it must be in focus');\n }\n else {\n global = window.top;\n }\n }\n global.addEventListener('blur', () => {\n this._keys.length = 0; // empties array efficiently\n });\n // key up is on window because canvas cannot have focus\n global.addEventListener('keyup', this._handleKeyUp);\n // key down is on window because canvas cannot have focus\n global.addEventListener('keydown', this._handleKeyDown);\n }\n toggleEnabled(enabled) {\n this._enabled = enabled;\n }\n clear() {\n this._keysDown.length = 0;\n this._keysUp.length = 0;\n this._keys.length = 0;\n }\n update() {\n // Reset keysDown and keysUp after update is complete\n this._keysDown.length = 0;\n this._keysUp.length = 0;\n // Emit synthetic \"hold\" event\n for (let i = 0; i < this._keys.length; i++) {\n this.events.emit('hold', new KeyEvent(this._keys[i]));\n }\n }\n /**\n * Gets list of keys being pressed down\n */\n getKeys() {\n return this._keys;\n }\n /**\n * Tests if a certain key was just pressed this frame. This is cleared at the end of the update frame.\n * @param key Test whether a key was just pressed\n */\n wasPressed(key) {\n if (!this._enabled) {\n return false;\n }\n return this._keysDown.indexOf(key) > -1;\n }\n /**\n * Tests if a certain key is held down. This is persisted between frames.\n * @param key Test whether a key is held down\n */\n isHeld(key) {\n if (!this._enabled) {\n return false;\n }\n return this._keys.indexOf(key) > -1;\n }\n /**\n * Tests if a certain key was just released this frame. This is cleared at the end of the update frame.\n * @param key Test whether a key was just released\n */\n wasReleased(key) {\n if (!this._enabled) {\n return false;\n }\n return this._keysUp.indexOf(key) > -1;\n }\n /**\n * Trigger a manual key event\n * @param type\n * @param key\n * @param character\n */\n triggerEvent(type, key, character) {\n if (type === 'down') {\n this._handleKeyDown(new KeyboardEvent('keydown', {\n code: key,\n key: character !== null && character !== void 0 ? character : null\n }));\n }\n if (type === 'up') {\n this._handleKeyUp(new KeyboardEvent('keyup', {\n code: key,\n key: character !== null && character !== void 0 ? character : null\n }));\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Input/NativePointerButton.ts\":\n/*!**************************************!*\\\n !*** ./Input/NativePointerButton.ts ***!\n \\**************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ NativePointerButton: () => (/* binding */ NativePointerButton)\n/* harmony export */ });\n/**\n * Native browser button enumeration\n */\nvar NativePointerButton;\n(function (NativePointerButton) {\n NativePointerButton[NativePointerButton[\"NoButton\"] = -1] = \"NoButton\";\n NativePointerButton[NativePointerButton[\"Left\"] = 0] = \"Left\";\n NativePointerButton[NativePointerButton[\"Middle\"] = 1] = \"Middle\";\n NativePointerButton[NativePointerButton[\"Right\"] = 2] = \"Right\";\n NativePointerButton[NativePointerButton[\"Unknown\"] = 3] = \"Unknown\";\n})(NativePointerButton || (NativePointerButton = {}));\n\n\n/***/ }),\n\n/***/ \"./Input/PointerAbstraction.ts\":\n/*!*************************************!*\\\n !*** ./Input/PointerAbstraction.ts ***!\n \\*************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerAbstraction: () => (/* binding */ PointerAbstraction)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Math_global_coordinates__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Math/global-coordinates */ \"./Math/global-coordinates.ts\");\n\n\n\nclass PointerAbstraction {\n constructor() {\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n /**\n * The last position on the document this pointer was at. Can be `null` if pointer was never active.\n */\n this.lastPagePos = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n /**\n * The last position on the screen this pointer was at. Can be `null` if pointer was never active.\n */\n this.lastScreenPos = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n /**\n * The last position in the game world coordinates this pointer was at. Can be `null` if pointer was never active.\n */\n this.lastWorldPos = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n this._onPointerMove = (ev) => {\n this.lastPagePos = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(ev.pagePos.x, ev.pagePos.y);\n this.lastScreenPos = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(ev.screenPos.x, ev.screenPos.y);\n this.lastWorldPos = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(ev.worldPos.x, ev.worldPos.y);\n };\n this._onPointerDown = (ev) => {\n this.lastPagePos = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(ev.pagePos.x, ev.pagePos.y);\n this.lastScreenPos = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(ev.screenPos.x, ev.screenPos.y);\n this.lastWorldPos = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(ev.worldPos.x, ev.worldPos.y);\n };\n this.on('move', this._onPointerMove);\n this.on('down', this._onPointerDown);\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n /**\n * Called internally by excalibur to keep pointers up to date\n * @internal\n * @param engine\n */\n _updateWorldPosition(engine) {\n const coord = _Math_global_coordinates__WEBPACK_IMPORTED_MODULE_2__.GlobalCoordinates.fromPagePosition(this.lastPagePos, engine);\n this.lastScreenPos = coord.screenPos;\n this.lastWorldPos = coord.worldPos;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Input/PointerButton.ts\":\n/*!********************************!*\\\n !*** ./Input/PointerButton.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerButton: () => (/* binding */ PointerButton)\n/* harmony export */ });\n/**\n * The mouse button being pressed.\n */\nvar PointerButton;\n(function (PointerButton) {\n PointerButton[\"Left\"] = \"Left\";\n PointerButton[\"Middle\"] = \"Middle\";\n PointerButton[\"Right\"] = \"Right\";\n PointerButton[\"Unknown\"] = \"Unknown\";\n PointerButton[\"NoButton\"] = \"NoButton\";\n})(PointerButton || (PointerButton = {}));\n\n\n/***/ }),\n\n/***/ \"./Input/PointerComponent.ts\":\n/*!***********************************!*\\\n !*** ./Input/PointerComponent.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerComponent: () => (/* binding */ PointerComponent)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Component */ \"./EntityComponentSystem/Component.ts\");\n\n/**\n * Add this component to optionally configure how the pointer\n * system detects pointer events.\n *\n * By default the collider shape is used and graphics bounds is not.\n *\n * If both collider shape and graphics bounds are enabled it will fire events if either or\n * are intersecting the pointer.\n */\nclass PointerComponent extends _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor(options) {\n var _a, _b;\n super();\n /**\n * Use any existing Collider component geometry for pointer events. This is useful if you want\n * user pointer events only to trigger on the same collision geometry used in the collider component\n * for collision resolution. Default is `true`.\n */\n this.useColliderShape = true;\n /**\n * Use any existing Graphics component bounds for pointers. This is useful if you want the axis aligned\n * bounds around the graphic to trigger pointer events. Default is `true`.\n */\n this.useGraphicsBounds = true;\n this.useColliderShape = (_a = options === null || options === void 0 ? void 0 : options.useColliderShape) !== null && _a !== void 0 ? _a : this.useColliderShape;\n this.useGraphicsBounds = (_b = options === null || options === void 0 ? void 0 : options.useGraphicsBounds) !== null && _b !== void 0 ? _b : this.useGraphicsBounds;\n this.localBounds = options === null || options === void 0 ? void 0 : options.localBounds;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Input/PointerEvent.ts\":\n/*!*******************************!*\\\n !*** ./Input/PointerEvent.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerEvent: () => (/* binding */ PointerEvent)\n/* harmony export */ });\nclass PointerEvent {\n cancel() {\n this.active = false;\n }\n get pagePos() {\n return this.coordinates.pagePos;\n }\n get screenPos() {\n return this.coordinates.screenPos;\n }\n get worldPos() {\n return this.coordinates.worldPos;\n }\n constructor(type, pointerId, button, pointerType, coordinates, nativeEvent) {\n this.type = type;\n this.pointerId = pointerId;\n this.button = button;\n this.pointerType = pointerType;\n this.coordinates = coordinates;\n this.nativeEvent = nativeEvent;\n this.active = true;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Input/PointerEventReceiver.ts\":\n/*!***************************************!*\\\n !*** ./Input/PointerEventReceiver.ts ***!\n \\***************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerEventReceiver: () => (/* binding */ PointerEventReceiver),\n/* harmony export */ PointerEvents: () => (/* binding */ PointerEvents)\n/* harmony export */ });\n/* harmony import */ var _Engine__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Engine */ \"./Engine.ts\");\n/* harmony import */ var _Math_global_coordinates__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Math/global-coordinates */ \"./Math/global-coordinates.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _PointerEvent__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./PointerEvent */ \"./Input/PointerEvent.ts\");\n/* harmony import */ var _WheelEvent__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./WheelEvent */ \"./Input/WheelEvent.ts\");\n/* harmony import */ var _PointerAbstraction__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./PointerAbstraction */ \"./Input/PointerAbstraction.ts\");\n/* harmony import */ var _WheelDeltaMode__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./WheelDeltaMode */ \"./Input/WheelDeltaMode.ts\");\n/* harmony import */ var _PointerSystem__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./PointerSystem */ \"./Input/PointerSystem.ts\");\n/* harmony import */ var _NativePointerButton__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./NativePointerButton */ \"./Input/NativePointerButton.ts\");\n/* harmony import */ var _PointerButton__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./PointerButton */ \"./Input/PointerButton.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../Util/Util */ \"./Util/Util.ts\");\n/* harmony import */ var _PointerType__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./PointerType */ \"./Input/PointerType.ts\");\n/* harmony import */ var _Util_IFrame__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Util/IFrame */ \"./Util/IFrame.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst PointerEvents = {\n Move: 'move',\n Down: 'down',\n Up: 'up',\n Wheel: 'wheel'\n};\n/**\n * Is this event a native touch event?\n */\nfunction isTouchEvent(value) {\n // Guard for Safari <= 13.1\n return globalThis.TouchEvent && value instanceof globalThis.TouchEvent;\n}\n/**\n * Is this event a native pointer event\n */\nfunction isPointerEvent(value) {\n // Guard for Safari <= 13.1\n return globalThis.PointerEvent && value instanceof globalThis.PointerEvent;\n}\n/**\n * The PointerEventProcessor is responsible for collecting all the events from the canvas and transforming them into GlobalCoordinates\n */\nclass PointerEventReceiver {\n constructor(target, engine) {\n this.target = target;\n this.engine = engine;\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n this.primary = new _PointerAbstraction__WEBPACK_IMPORTED_MODULE_1__.PointerAbstraction();\n this._activeNativePointerIdsToNormalized = new Map();\n this.lastFramePointerCoords = new Map();\n this.currentFramePointerCoords = new Map();\n this.currentFramePointerDown = new Map();\n this.lastFramePointerDown = new Map();\n this.currentFrameDown = [];\n this.currentFrameUp = [];\n this.currentFrameMove = [];\n this.currentFrameCancel = [];\n this.currentFrameWheel = [];\n this._enabled = true;\n this._pointers = [this.primary];\n this._boundHandle = this._handle.bind(this);\n this._boundWheel = this._handleWheel.bind(this);\n }\n toggleEnabled(enabled) {\n this._enabled = enabled;\n }\n /**\n * Creates a new PointerEventReceiver with a new target and engine while preserving existing pointer event\n * handlers.\n * @param target\n * @param engine\n */\n recreate(target, engine) {\n const eventReceiver = new PointerEventReceiver(target, engine);\n eventReceiver.primary = this.primary;\n eventReceiver._pointers = this._pointers;\n return eventReceiver;\n }\n /**\n * Locates a specific pointer by id, creates it if it doesn't exist\n * @param index\n */\n at(index) {\n if (index >= this._pointers.length) {\n // Ensure there is a pointer to retrieve\n for (let i = this._pointers.length - 1, max = index; i < max; i++) {\n this._pointers.push(new _PointerAbstraction__WEBPACK_IMPORTED_MODULE_1__.PointerAbstraction());\n }\n }\n return this._pointers[index];\n }\n /**\n * The number of pointers currently being tracked by excalibur\n */\n count() {\n return this._pointers.length;\n }\n /**\n * Is the specified pointer id down this frame\n * @param pointerId\n */\n isDown(pointerId) {\n var _a;\n if (!this._enabled) {\n return false;\n }\n return (_a = this.currentFramePointerDown.get(pointerId)) !== null && _a !== void 0 ? _a : false;\n }\n /**\n * Was the specified pointer id down last frame\n * @param pointerId\n */\n wasDown(pointerId) {\n var _a;\n if (!this._enabled) {\n return false;\n }\n return (_a = this.lastFramePointerDown.get(pointerId)) !== null && _a !== void 0 ? _a : false;\n }\n /**\n * Whether the Pointer is currently dragging.\n */\n isDragging(pointerId) {\n if (!this._enabled) {\n return false;\n }\n return this.isDown(pointerId);\n }\n /**\n * Whether the Pointer just started dragging.\n */\n isDragStart(pointerId) {\n if (!this._enabled) {\n return false;\n }\n return this.isDown(pointerId) && !this.wasDown(pointerId);\n }\n /**\n * Whether the Pointer just ended dragging.\n */\n isDragEnd(pointerId) {\n if (!this._enabled) {\n return false;\n }\n return !this.isDown(pointerId) && this.wasDown(pointerId);\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n /**\n * Called internally by excalibur\n *\n * Updates the current frame pointer info and emits raw pointer events\n *\n * This does not emit events to entities, see PointerSystem\n * @internal\n */\n update() {\n this.lastFramePointerDown = new Map(this.currentFramePointerDown);\n this.lastFramePointerCoords = new Map(this.currentFramePointerCoords);\n for (const event of this.currentFrameDown) {\n if (!event.active) {\n continue;\n }\n this.emit('down', event);\n const pointer = this.at(event.pointerId);\n pointer.emit('down', event);\n this.primary.emit('pointerdown', event);\n }\n for (const event of this.currentFrameUp) {\n if (!event.active) {\n continue;\n }\n this.emit('up', event);\n const pointer = this.at(event.pointerId);\n pointer.emit('up', event);\n }\n for (const event of this.currentFrameMove) {\n if (!event.active) {\n continue;\n }\n this.emit('move', event);\n const pointer = this.at(event.pointerId);\n pointer.emit('move', event);\n }\n for (const event of this.currentFrameCancel) {\n if (!event.active) {\n continue;\n }\n this.emit('cancel', event);\n const pointer = this.at(event.pointerId);\n pointer.emit('cancel', event);\n }\n for (const event of this.currentFrameWheel) {\n if (!event.active) {\n continue;\n }\n this.emit('pointerwheel', event);\n this.emit('wheel', event);\n this.primary.emit('pointerwheel', event);\n this.primary.emit('wheel', event);\n }\n if (this.engine.currentScene.camera.hasChanged()) {\n for (const pointer of this._pointers) {\n pointer._updateWorldPosition(this.engine);\n }\n }\n }\n /**\n * Clears the current frame event and pointer data\n */\n clear() {\n for (const event of this.currentFrameUp) {\n this.currentFramePointerCoords.delete(event.pointerId);\n const ids = this._activeNativePointerIdsToNormalized.entries();\n for (const [native, normalized] of ids) {\n if (normalized === event.pointerId) {\n this._activeNativePointerIdsToNormalized.delete(native);\n }\n }\n }\n this.currentFrameDown.length = 0;\n this.currentFrameUp.length = 0;\n this.currentFrameMove.length = 0;\n this.currentFrameCancel.length = 0;\n this.currentFrameWheel.length = 0;\n }\n /**\n * Initializes the pointer event receiver so that it can start listening to native\n * browser events.\n */\n init(options) {\n var _a;\n if (this.engine.isDisposed()) {\n return;\n }\n // Disabling the touch action avoids browser/platform gestures from firing on the canvas\n // It is important on mobile to have touch action 'none'\n // https://stackoverflow.com/questions/48124372/pointermove-event-not-working-with-touch-why-not\n if (this.target === this.engine.canvas) {\n this.engine.canvas.style.touchAction = 'none';\n }\n else {\n document.body.style.touchAction = 'none';\n }\n // Preferred pointer events\n if (window.PointerEvent) {\n this.target.addEventListener('pointerdown', this._boundHandle);\n this.target.addEventListener('pointerup', this._boundHandle);\n this.target.addEventListener('pointermove', this._boundHandle);\n this.target.addEventListener('pointercancel', this._boundHandle);\n }\n else {\n // Touch Events\n this.target.addEventListener('touchstart', this._boundHandle);\n this.target.addEventListener('touchend', this._boundHandle);\n this.target.addEventListener('touchmove', this._boundHandle);\n this.target.addEventListener('touchcancel', this._boundHandle);\n // Mouse Events\n this.target.addEventListener('mousedown', this._boundHandle);\n this.target.addEventListener('mouseup', this._boundHandle);\n this.target.addEventListener('mousemove', this._boundHandle);\n }\n // MDN MouseWheelEvent\n const wheelOptions = {\n passive: !(this.engine.pageScrollPreventionMode === _Engine__WEBPACK_IMPORTED_MODULE_2__.ScrollPreventionMode.All ||\n this.engine.pageScrollPreventionMode === _Engine__WEBPACK_IMPORTED_MODULE_2__.ScrollPreventionMode.Canvas)\n };\n if ('onwheel' in document.createElement('div')) {\n // Modern Browsers\n this.target.addEventListener('wheel', this._boundWheel, wheelOptions);\n }\n else if (document.onmousewheel !== undefined) {\n // Webkit and IE\n this.target.addEventListener('mousewheel', this._boundWheel, wheelOptions);\n }\n else {\n // Remaining browser and older Firefox\n this.target.addEventListener('MozMousePixelScroll', this._boundWheel, wheelOptions);\n }\n const grabWindowFocus = (_a = options === null || options === void 0 ? void 0 : options.grabWindowFocus) !== null && _a !== void 0 ? _a : true;\n // Handle cross origin iframe\n if (grabWindowFocus && (0,_Util_IFrame__WEBPACK_IMPORTED_MODULE_3__.isCrossOriginIframe)()) {\n const grabFocus = () => {\n window.focus();\n };\n // Preferred pointer events\n if (window.PointerEvent) {\n this.target.addEventListener('pointerdown', grabFocus);\n }\n else {\n // Touch Events\n this.target.addEventListener('touchstart', grabFocus);\n // Mouse Events\n this.target.addEventListener('mousedown', grabFocus);\n }\n }\n }\n detach() {\n // Preferred pointer events\n if (window.PointerEvent) {\n this.target.removeEventListener('pointerdown', this._boundHandle);\n this.target.removeEventListener('pointerup', this._boundHandle);\n this.target.removeEventListener('pointermove', this._boundHandle);\n this.target.removeEventListener('pointercancel', this._boundHandle);\n }\n else {\n // Touch Events\n this.target.removeEventListener('touchstart', this._boundHandle);\n this.target.removeEventListener('touchend', this._boundHandle);\n this.target.removeEventListener('touchmove', this._boundHandle);\n this.target.removeEventListener('touchcancel', this._boundHandle);\n // Mouse Events\n this.target.removeEventListener('mousedown', this._boundHandle);\n this.target.removeEventListener('mouseup', this._boundHandle);\n this.target.removeEventListener('mousemove', this._boundHandle);\n }\n if ('onwheel' in document.createElement('div')) {\n // Modern Browsers\n this.target.removeEventListener('wheel', this._boundWheel);\n }\n else if (document.onmousewheel !== undefined) {\n // Webkit and IE\n this.target.addEventListener('mousewheel', this._boundWheel);\n }\n else {\n // Remaining browser and older Firefox\n this.target.addEventListener('MozMousePixelScroll', this._boundWheel);\n }\n }\n /**\n * Take native pointer id and map it to index in active pointers\n * @param nativePointerId\n */\n _normalizePointerId(nativePointerId) {\n // Add to the the native pointer set id\n this._activeNativePointerIdsToNormalized.set(nativePointerId, -1);\n // Native pointer ids in ascending order\n const currentPointerIds = Array.from(this._activeNativePointerIdsToNormalized.keys()).sort((a, b) => a - b);\n // The index into sorted ids will be the new id, will always have an id\n const id = currentPointerIds.findIndex((p) => p === nativePointerId);\n // Save the mapping so we can reverse it later\n this._activeNativePointerIdsToNormalized.set(nativePointerId, id);\n // ignore pointer because game isn't watching\n return id;\n }\n /**\n * Responsible for handling and parsing pointer events\n */\n _handle(ev) {\n if (!this._enabled) {\n return;\n }\n ev.preventDefault();\n const eventCoords = new Map();\n let button;\n let pointerType;\n if (isTouchEvent(ev)) {\n button = _PointerButton__WEBPACK_IMPORTED_MODULE_4__.PointerButton.Unknown;\n pointerType = _PointerType__WEBPACK_IMPORTED_MODULE_5__.PointerType.Touch;\n // https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent\n for (let i = 0; i < ev.changedTouches.length; i++) {\n const touch = ev.changedTouches[i];\n const coordinates = _Math_global_coordinates__WEBPACK_IMPORTED_MODULE_6__.GlobalCoordinates.fromPagePosition(touch.pageX, touch.pageY, this.engine);\n const nativePointerId = i + 1;\n const pointerId = this._normalizePointerId(nativePointerId);\n this.currentFramePointerCoords.set(pointerId, coordinates);\n eventCoords.set(pointerId, coordinates);\n }\n }\n else {\n button = this._nativeButtonToPointerButton(ev.button);\n pointerType = _PointerType__WEBPACK_IMPORTED_MODULE_5__.PointerType.Mouse;\n const coordinates = _Math_global_coordinates__WEBPACK_IMPORTED_MODULE_6__.GlobalCoordinates.fromPagePosition(ev.pageX, ev.pageY, this.engine);\n let nativePointerId = 1;\n if (isPointerEvent(ev)) {\n nativePointerId = ev.pointerId;\n pointerType = this._stringToPointerType(ev.pointerType);\n }\n const pointerId = this._normalizePointerId(nativePointerId);\n this.currentFramePointerCoords.set(pointerId, coordinates);\n eventCoords.set(pointerId, coordinates);\n }\n for (const [pointerId, coord] of eventCoords.entries()) {\n switch (ev.type) {\n case 'mousedown':\n case 'pointerdown':\n case 'touchstart':\n this.currentFrameDown.push(new _PointerEvent__WEBPACK_IMPORTED_MODULE_7__.PointerEvent('down', pointerId, button, pointerType, coord, ev));\n this.currentFramePointerDown.set(pointerId, true);\n break;\n case 'mouseup':\n case 'pointerup':\n case 'touchend':\n this.currentFrameUp.push(new _PointerEvent__WEBPACK_IMPORTED_MODULE_7__.PointerEvent('up', pointerId, button, pointerType, coord, ev));\n this.currentFramePointerDown.set(pointerId, false);\n break;\n case 'mousemove':\n case 'pointermove':\n case 'touchmove':\n this.currentFrameMove.push(new _PointerEvent__WEBPACK_IMPORTED_MODULE_7__.PointerEvent('move', pointerId, button, pointerType, coord, ev));\n break;\n case 'touchcancel':\n case 'pointercancel':\n this.currentFrameCancel.push(new _PointerEvent__WEBPACK_IMPORTED_MODULE_7__.PointerEvent('cancel', pointerId, button, pointerType, coord, ev));\n break;\n }\n }\n }\n _handleWheel(ev) {\n if (!this._enabled) {\n return;\n }\n // Should we prevent page scroll because of this event\n if (this.engine.pageScrollPreventionMode === _Engine__WEBPACK_IMPORTED_MODULE_2__.ScrollPreventionMode.All ||\n (this.engine.pageScrollPreventionMode === _Engine__WEBPACK_IMPORTED_MODULE_2__.ScrollPreventionMode.Canvas && ev.target === this.engine.canvas)) {\n ev.preventDefault();\n }\n const screen = this.engine.screen.pageToScreenCoordinates((0,_Math_vector__WEBPACK_IMPORTED_MODULE_8__.vec)(ev.pageX, ev.pageY));\n const world = this.engine.screen.screenToWorldCoordinates(screen);\n /**\n * A constant used to normalize wheel events across different browsers\n *\n * This normalization factor is pulled from\n * https://developer.mozilla.org/en-US/docs/Web/Events/wheel#Listening_to_this_event_across_browser\n */\n const ScrollWheelNormalizationFactor = -1 / 40;\n const deltaX = ev.deltaX || ev.wheelDeltaX * ScrollWheelNormalizationFactor || 0;\n const deltaY = ev.deltaY || ev.wheelDeltaY * ScrollWheelNormalizationFactor || ev.wheelDelta * ScrollWheelNormalizationFactor || ev.detail || 0;\n const deltaZ = ev.deltaZ || 0;\n let deltaMode = _WheelDeltaMode__WEBPACK_IMPORTED_MODULE_9__.WheelDeltaMode.Pixel;\n if (ev.deltaMode) {\n if (ev.deltaMode === 1) {\n deltaMode = _WheelDeltaMode__WEBPACK_IMPORTED_MODULE_9__.WheelDeltaMode.Line;\n }\n else if (ev.deltaMode === 2) {\n deltaMode = _WheelDeltaMode__WEBPACK_IMPORTED_MODULE_9__.WheelDeltaMode.Page;\n }\n }\n const we = new _WheelEvent__WEBPACK_IMPORTED_MODULE_10__.WheelEvent(world.x, world.y, ev.pageX, ev.pageY, screen.x, screen.y, 0, deltaX, deltaY, deltaZ, deltaMode, ev);\n this.currentFrameWheel.push(we);\n }\n /**\n * Triggers an excalibur pointer event in a world space pos\n *\n * Useful for testing pointers in excalibur\n * @param type\n * @param pos\n */\n triggerEvent(type, pos) {\n const page = this.engine.screen.worldToPageCoordinates(pos);\n // Send an event to the event receiver\n if (window.PointerEvent) {\n this._handle(new window.PointerEvent('pointer' + type, {\n pointerId: 0,\n clientX: page.x,\n clientY: page.y\n }));\n }\n else {\n // Safari hack\n this._handle(new window.MouseEvent('mouse' + type, {\n clientX: page.x,\n clientY: page.y\n }));\n }\n // Force update pointer system\n const pointerSystem = this.engine.currentScene.world.get(_PointerSystem__WEBPACK_IMPORTED_MODULE_11__.PointerSystem);\n pointerSystem.preupdate(this.engine.currentScene, 1);\n pointerSystem.update(1);\n }\n _nativeButtonToPointerButton(s) {\n switch (s) {\n case _NativePointerButton__WEBPACK_IMPORTED_MODULE_12__.NativePointerButton.NoButton:\n return _PointerButton__WEBPACK_IMPORTED_MODULE_4__.PointerButton.NoButton;\n case _NativePointerButton__WEBPACK_IMPORTED_MODULE_12__.NativePointerButton.Left:\n return _PointerButton__WEBPACK_IMPORTED_MODULE_4__.PointerButton.Left;\n case _NativePointerButton__WEBPACK_IMPORTED_MODULE_12__.NativePointerButton.Middle:\n return _PointerButton__WEBPACK_IMPORTED_MODULE_4__.PointerButton.Middle;\n case _NativePointerButton__WEBPACK_IMPORTED_MODULE_12__.NativePointerButton.Right:\n return _PointerButton__WEBPACK_IMPORTED_MODULE_4__.PointerButton.Right;\n case _NativePointerButton__WEBPACK_IMPORTED_MODULE_12__.NativePointerButton.Unknown:\n return _PointerButton__WEBPACK_IMPORTED_MODULE_4__.PointerButton.Unknown;\n default:\n return (0,_Util_Util__WEBPACK_IMPORTED_MODULE_13__.fail)(s);\n }\n }\n _stringToPointerType(s) {\n switch (s) {\n case 'touch':\n return _PointerType__WEBPACK_IMPORTED_MODULE_5__.PointerType.Touch;\n case 'mouse':\n return _PointerType__WEBPACK_IMPORTED_MODULE_5__.PointerType.Mouse;\n case 'pen':\n return _PointerType__WEBPACK_IMPORTED_MODULE_5__.PointerType.Pen;\n default:\n return _PointerType__WEBPACK_IMPORTED_MODULE_5__.PointerType.Unknown;\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Input/PointerEventsToObjectDispatcher.ts\":\n/*!**************************************************!*\\\n !*** ./Input/PointerEventsToObjectDispatcher.ts ***!\n \\**************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerEventsToObjectDispatcher: () => (/* binding */ PointerEventsToObjectDispatcher),\n/* harmony export */ PointerTargetObjectProxy: () => (/* binding */ PointerTargetObjectProxy)\n/* harmony export */ });\n/* harmony import */ var _Util_RentalPool__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Util/RentalPool */ \"./Util/RentalPool.ts\");\n\n/**\n *\n */\nfunction hasNestedEvents(object) {\n return object && object._dispatchPointerEvents && object._processPointerToObject;\n}\nclass PointerTargetObjectProxy {\n get events() {\n return this.object.events;\n }\n init(object, contains, active) {\n this.object = object;\n this.contains = contains;\n this.active = active;\n }\n}\nclass PointerEventsToObjectDispatcher {\n constructor() {\n this._proxyPool = new _Util_RentalPool__WEBPACK_IMPORTED_MODULE_0__.RentalPool(() => new PointerTargetObjectProxy(), (p) => p, 100);\n this._objectToProxy = new Map();\n this._proxies = [];\n this._lastFrameObjectToPointers = new Map();\n this._currentFrameObjectToPointers = new Map();\n }\n /**\n * Tracks an object to associate with pointers and their events\n * @param object\n * @param contains\n * @param active\n */\n addObject(object, contains, active) {\n const proxy = this._proxyPool.rent(false);\n proxy.init(object, contains, active);\n this._proxies.push(proxy);\n this._objectToProxy.set(object, proxy);\n }\n _getProxy(object) {\n const proxy = this._objectToProxy.get(object);\n if (proxy) {\n return proxy;\n }\n throw new Error('No PointerTargetProxy for object');\n }\n /**\n * Untracks an object associated with pointers and their events\n * @param object\n */\n removeObject(object) {\n const proxy = this._objectToProxy.get(object);\n if (proxy) {\n const index = this._proxies.indexOf(proxy);\n if (index > -1) {\n this._proxies.splice(index, 1);\n }\n this._proxyPool.return(proxy);\n }\n }\n _objectCurrentlyUnderPointer(object, pointerId) {\n return !!(this._currentFrameObjectToPointers.has(object) && this._currentFrameObjectToPointers.get(object).includes(pointerId));\n }\n _objectWasUnderPointer(object, pointerId) {\n return !!(this._lastFrameObjectToPointers.has(object) && this._lastFrameObjectToPointers.get(object).includes(pointerId));\n }\n _entered(object, pointerId) {\n return this._objectCurrentlyUnderPointer(object, pointerId) && !this._lastFrameObjectToPointers.has(object);\n }\n _left(object, pointerId) {\n return !this._currentFrameObjectToPointers.has(object) && this._objectWasUnderPointer(object, pointerId);\n }\n /**\n * Manually associate a pointer id with an object.\n *\n * This assumes you've checked that the pointer is indeed over the object.\n */\n addPointerToObject(object, pointerId) {\n const maybeProxy = this._objectToProxy.get(object);\n if (maybeProxy) {\n this._addPointerToProxy(maybeProxy, pointerId);\n }\n }\n _addPointerToProxy(object, pointerId) {\n if (!this._currentFrameObjectToPointers.has(object)) {\n this._currentFrameObjectToPointers.set(object, [pointerId]);\n return;\n }\n const pointers = this._currentFrameObjectToPointers.get(object);\n this._currentFrameObjectToPointers.set(object, pointers.concat(pointerId));\n }\n /**\n * Dispatches the appropriate pointer events in sortedObject order on tracked objects\n * @param receiver\n * @param sortedObjects\n */\n dispatchEvents(receiver, sortedObjects) {\n const lastFrameEntities = new Set(this._lastFrameObjectToPointers.keys());\n const currentFrameEntities = new Set(this._currentFrameObjectToPointers.keys());\n // Filter preserves z order\n let lastMovePerPointer;\n let lastUpPerPointer;\n let lastDownPerPointer;\n // Dispatch events in proxy z order\n for (let i = 0; i < sortedObjects.length; i++) {\n const object = sortedObjects[i];\n const proxy = this._getProxy(object);\n if (hasNestedEvents(object)) {\n object._dispatchPointerEvents(receiver);\n }\n if (lastFrameEntities.has(proxy) || currentFrameEntities.has(proxy)) {\n lastDownPerPointer = this._processDownAndEmit(receiver, proxy);\n lastUpPerPointer = this._processUpAndEmit(receiver, proxy);\n lastMovePerPointer = this._processMoveAndEmit(receiver, proxy);\n const lastUpDownMoveEvents = [...lastMovePerPointer.values(), ...lastDownPerPointer.values(), ...lastUpPerPointer.values()];\n this._processEnterLeaveAndEmit(receiver, proxy, lastUpDownMoveEvents);\n this._processCancelAndEmit(receiver, proxy);\n this._processWheelAndEmit(receiver, proxy);\n }\n }\n }\n /**\n * Given the tracked objects, update pointer containment given the provided contains()\n * @param receiver\n * @param objects\n */\n processPointerToObject(receiver, objects) {\n // Pre-process find entities under pointers\n for (let objectIndex = 0; objectIndex < objects.length; objectIndex++) {\n const object = objects[objectIndex];\n const proxy = this._getProxy(object);\n if (hasNestedEvents(object)) {\n object._processPointerToObject(receiver);\n }\n for (const [pointerId, pos] of receiver.currentFramePointerCoords.entries()) {\n if (proxy.contains(pos)) {\n this._addPointerToProxy(proxy, pointerId);\n }\n }\n }\n }\n /**\n * Clear current frames pointer-object associations and track last frame pointer-object associations\n */\n clear() {\n this._lastFrameObjectToPointers.clear();\n this._lastFrameObjectToPointers = new Map(this._currentFrameObjectToPointers);\n this._currentFrameObjectToPointers.clear();\n }\n _processDownAndEmit(receiver, object) {\n const lastDownPerPointer = new Map();\n // Loop through down and dispatch to entities\n for (const event of receiver.currentFrameDown) {\n if (event.active && this._objectCurrentlyUnderPointer(object, event.pointerId)) {\n object.events.emit('pointerdown', event);\n if (receiver.isDragStart(event.pointerId)) {\n object.events.emit('pointerdragstart', event);\n }\n }\n lastDownPerPointer.set(event.pointerId, event);\n }\n return lastDownPerPointer;\n }\n _processUpAndEmit(receiver, object) {\n const lastUpPerPointer = new Map();\n // Loop through up and dispatch to entities\n for (const event of receiver.currentFrameUp) {\n if (event.active && this._objectCurrentlyUnderPointer(object, event.pointerId)) {\n object.events.emit('pointerup', event);\n if (receiver.isDragEnd(event.pointerId)) {\n object.events.emit('pointerdragend', event);\n }\n }\n lastUpPerPointer.set(event.pointerId, event);\n }\n return lastUpPerPointer;\n }\n _processMoveAndEmit(receiver, object) {\n const lastMovePerPointer = new Map();\n // Loop through move and dispatch to entities\n for (const event of receiver.currentFrameMove) {\n if (event.active && object.active() && this._objectCurrentlyUnderPointer(object, event.pointerId)) {\n // move\n object.events.emit('pointermove', event);\n if (receiver.isDragging(event.pointerId)) {\n object.events.emit('pointerdragmove', event);\n }\n }\n lastMovePerPointer.set(event.pointerId, event);\n }\n return lastMovePerPointer;\n }\n _processEnterLeaveAndEmit(receiver, object, lastUpDownMoveEvents) {\n // up, down, and move are considered for enter and leave\n for (const event of lastUpDownMoveEvents) {\n // enter\n if (event.active && object.active() && this._entered(object, event.pointerId)) {\n object.events.emit('pointerenter', event);\n if (receiver.isDragging(event.pointerId)) {\n object.events.emit('pointerdragenter', event);\n }\n break;\n }\n if (event.active &&\n object.active() &&\n // leave can happen on move\n (this._left(object, event.pointerId) ||\n // or leave can happen on pointer up\n (this._objectCurrentlyUnderPointer(object, event.pointerId) && event.type === 'up'))) {\n object.events.emit('pointerleave', event);\n if (receiver.isDragging(event.pointerId)) {\n object.events.emit('pointerdragleave', event);\n }\n break;\n }\n }\n }\n _processCancelAndEmit(receiver, object) {\n // cancel\n for (const event of receiver.currentFrameCancel) {\n if (event.active && object.active() && this._objectCurrentlyUnderPointer(object, event.pointerId)) {\n object.events.emit('pointercancel', event);\n }\n }\n }\n _processWheelAndEmit(receiver, object) {\n // wheel\n for (const event of receiver.currentFrameWheel) {\n // Currently the wheel only fires under the primary pointer '0'\n if (event.active && object.active() && this._objectCurrentlyUnderPointer(object, 0)) {\n object.events.emit('pointerwheel', event);\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Input/PointerScope.ts\":\n/*!*******************************!*\\\n !*** ./Input/PointerScope.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerScope: () => (/* binding */ PointerScope)\n/* harmony export */ });\n/**\n * Determines the scope of handling mouse/touch events.\n */\nvar PointerScope;\n(function (PointerScope) {\n /**\n * Handle events on the `canvas` element only. Events originating outside the\n * `canvas` will not be handled.\n */\n PointerScope[\"Canvas\"] = \"Canvas\";\n /**\n * Handles events on the entire document. All events will be handled by Excalibur.\n */\n PointerScope[\"Document\"] = \"Document\";\n})(PointerScope || (PointerScope = {}));\n\n\n/***/ }),\n\n/***/ \"./Input/PointerSystem.ts\":\n/*!********************************!*\\\n !*** ./Input/PointerSystem.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerSystem: () => (/* binding */ PointerSystem)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Priority.ts\");\n/* harmony import */ var _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Graphics/GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _PointerComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./PointerComponent */ \"./Input/PointerComponent.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Math/coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _Collision_Detection_SparseHashGrid__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Collision/Detection/SparseHashGrid */ \"./Collision/Detection/SparseHashGrid.ts\");\n/* harmony import */ var _PointerEventsToObjectDispatcher__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./PointerEventsToObjectDispatcher */ \"./Input/PointerEventsToObjectDispatcher.ts\");\n\n\n\n\n\n\n/**\n * The PointerSystem is responsible for dispatching pointer events to entities\n * that need them.\n *\n * The PointerSystem can be optionally configured by the {@apilink PointerComponent}, by default Entities use\n * the {@apilink Collider}'s shape for pointer events.\n */\nclass PointerSystem extends _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_0__.System {\n constructor(world) {\n super();\n this.world = world;\n this.systemType = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_0__.SystemType.Update;\n this._graphicsHashGrid = new _Collision_Detection_SparseHashGrid__WEBPACK_IMPORTED_MODULE_1__.SparseHashGrid({ size: 100 });\n this._graphics = [];\n this._entityToPointer = new Map();\n this._pointerEventDispatcher = new _PointerEventsToObjectDispatcher__WEBPACK_IMPORTED_MODULE_2__.PointerEventsToObjectDispatcher();\n /**\n * Optionally override component configuration for all entities\n */\n this.overrideUseColliderShape = false;\n /**\n * Optionally override component configuration for all entities\n */\n this.overrideUseGraphicsBounds = false;\n this._sortedTransforms = [];\n this._sortedEntities = [];\n this._zHasChanged = false;\n this._zIndexUpdate = () => {\n this._zHasChanged = true;\n };\n this.query = this.world.query([_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_3__.TransformComponent, _PointerComponent__WEBPACK_IMPORTED_MODULE_4__.PointerComponent]);\n this.query.entityAdded$.subscribe((e) => {\n const tx = e.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_3__.TransformComponent);\n const pointer = e.get(_PointerComponent__WEBPACK_IMPORTED_MODULE_4__.PointerComponent);\n this._pointerEventDispatcher.addObject(e, (pos) => {\n // If pointer bounds defined\n if (pointer && pointer.localBounds) {\n const pointerBounds = pointer.localBounds.transform(tx.get().matrix);\n return pointerBounds.contains(tx.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_5__.CoordPlane.World ? pos.worldPos : pos.screenPos);\n }\n return false;\n }, () => e.isActive);\n this._entityToPointer.set(e, pointer);\n const maybeGfx = e.get(_Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_6__.GraphicsComponent);\n if (maybeGfx) {\n this._graphics.push(maybeGfx);\n this._graphicsHashGrid.track(maybeGfx);\n }\n this._sortedTransforms.push(tx);\n this._sortedEntities.push(tx.owner);\n tx.zIndexChanged$.subscribe(this._zIndexUpdate);\n this._zHasChanged = true;\n });\n this.query.entityRemoved$.subscribe((e) => {\n this._pointerEventDispatcher.removeObject(e);\n const tx = e.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_3__.TransformComponent);\n this._entityToPointer.delete(e);\n const maybeGfx = e.get(_Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_6__.GraphicsComponent);\n if (maybeGfx) {\n const index = this._graphics.indexOf(maybeGfx);\n if (index > -1) {\n this._graphics.splice(index, 1);\n }\n this._graphicsHashGrid.untrack(maybeGfx);\n }\n tx.zIndexChanged$.unsubscribe(this._zIndexUpdate);\n const index = this._sortedTransforms.indexOf(tx);\n if (index > -1) {\n this._sortedTransforms.splice(index, 1);\n this._sortedEntities.splice(index, 1);\n }\n });\n }\n initialize(world, scene) {\n this._engine = scene.engine;\n this._scene = scene;\n }\n preupdate() {\n if (this._scene.camera.hasChanged()) {\n // if the camera has changed we want to force a transform update so pointers can be correctly calc'd\n this._scene.camera.updateTransform(this._scene.camera.pos);\n }\n // event receiver might change per frame\n this._receivers = [this._engine.input.pointers, this._scene.input.pointers];\n this._engineReceiver = this._engine.input.pointers;\n if (this._zHasChanged) {\n this._sortedTransforms.sort((a, b) => {\n return b.z - a.z;\n });\n this._sortedEntities = this._sortedTransforms.map((t) => t.owner);\n this._zHasChanged = false;\n }\n }\n update() {\n // Update graphics\n this._graphicsHashGrid.update(this._graphics);\n // Locate all the pointer/entity mappings\n for (const [pointerId, pos] of this._engineReceiver.currentFramePointerCoords.entries()) {\n const colliders = this._scene.physics.query(pos.worldPos);\n for (let i = 0; i < colliders.length; i++) {\n const collider = colliders[i];\n const maybePointer = this._entityToPointer.get(collider.owner);\n if (maybePointer && (maybePointer.useColliderShape || this.overrideUseColliderShape)) {\n this._pointerEventDispatcher.addPointerToObject(collider.owner, pointerId);\n }\n }\n const graphics = this._graphicsHashGrid.query(pos.worldPos);\n for (let i = 0; i < graphics.length; i++) {\n const graphic = graphics[i];\n const maybePointer = this._entityToPointer.get(graphic.owner);\n if (maybePointer && (maybePointer.useGraphicsBounds || this.overrideUseGraphicsBounds)) {\n this._pointerEventDispatcher.addPointerToObject(graphic.owner, pointerId);\n }\n }\n }\n this._pointerEventDispatcher.processPointerToObject(this._engineReceiver, this._sortedEntities);\n // Dispatch pointer events on entities\n this._pointerEventDispatcher.dispatchEvents(this._engineReceiver, this._sortedEntities);\n // Dispatch pointer events on top level pointers\n this._receivers.forEach((r) => r.update());\n // Clear last frame's events\n this._pointerEventDispatcher.clear();\n this._receivers.forEach((r) => r.clear());\n }\n}\nPointerSystem.priority = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_7__.SystemPriority.Higher;\n\n\n/***/ }),\n\n/***/ \"./Input/PointerType.ts\":\n/*!******************************!*\\\n !*** ./Input/PointerType.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerType: () => (/* binding */ PointerType)\n/* harmony export */ });\n/**\n * The type of pointer for a {@apilink PointerEvent}.\n */\nvar PointerType;\n(function (PointerType) {\n PointerType[\"Touch\"] = \"Touch\";\n PointerType[\"Mouse\"] = \"Mouse\";\n PointerType[\"Pen\"] = \"Pen\";\n PointerType[\"Unknown\"] = \"Unknown\";\n})(PointerType || (PointerType = {}));\n\n\n/***/ }),\n\n/***/ \"./Input/WheelDeltaMode.ts\":\n/*!*********************************!*\\\n !*** ./Input/WheelDeltaMode.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ WheelDeltaMode: () => (/* binding */ WheelDeltaMode)\n/* harmony export */ });\nvar WheelDeltaMode;\n(function (WheelDeltaMode) {\n WheelDeltaMode[\"Pixel\"] = \"Pixel\";\n WheelDeltaMode[\"Line\"] = \"Line\";\n WheelDeltaMode[\"Page\"] = \"Page\";\n})(WheelDeltaMode || (WheelDeltaMode = {}));\n\n\n/***/ }),\n\n/***/ \"./Input/WheelEvent.ts\":\n/*!*****************************!*\\\n !*** ./Input/WheelEvent.ts ***!\n \\*****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ WheelEvent: () => (/* binding */ WheelEvent)\n/* harmony export */ });\nclass WheelEvent {\n cancel() {\n this.active = false;\n }\n constructor(x, y, pageX, pageY, screenX, screenY, index, deltaX, deltaY, deltaZ, deltaMode, ev) {\n this.x = x;\n this.y = y;\n this.pageX = pageX;\n this.pageY = pageY;\n this.screenX = screenX;\n this.screenY = screenY;\n this.index = index;\n this.deltaX = deltaX;\n this.deltaY = deltaY;\n this.deltaZ = deltaZ;\n this.deltaMode = deltaMode;\n this.ev = ev;\n this.active = true;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Interfaces/AudioImplementation.ts\":\n/*!*******************************************!*\\\n !*** ./Interfaces/AudioImplementation.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ExResponse: () => (/* binding */ ExResponse)\n/* harmony export */ });\nclass ExResponse {\n}\nExResponse.type = {\n any: '',\n blob: 'blob',\n json: 'json',\n text: 'text',\n document: 'document',\n arraybuffer: 'arraybuffer'\n};\n\n\n/***/ }),\n\n/***/ \"./Interfaces/Index.ts\":\n/*!*****************************!*\\\n !*** ./Interfaces/Index.ts ***!\n \\*****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ExResponse: () => (/* reexport safe */ _AudioImplementation__WEBPACK_IMPORTED_MODULE_0__.ExResponse),\n/* harmony export */ hasOnAdd: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.hasOnAdd),\n/* harmony export */ hasOnInitialize: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.hasOnInitialize),\n/* harmony export */ hasOnPostUpdate: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.hasOnPostUpdate),\n/* harmony export */ hasOnPreUpdate: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.hasOnPreUpdate),\n/* harmony export */ hasOnRemove: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.hasOnRemove),\n/* harmony export */ hasPostDraw: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.hasPostDraw),\n/* harmony export */ hasPreDraw: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.hasPreDraw),\n/* harmony export */ has_add: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.has_add),\n/* harmony export */ has_initialize: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.has_initialize),\n/* harmony export */ has_postupdate: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.has_postupdate),\n/* harmony export */ has_preupdate: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.has_preupdate),\n/* harmony export */ has_remove: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.has_remove)\n/* harmony export */ });\n/* harmony import */ var _AudioImplementation__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AudioImplementation */ \"./Interfaces/AudioImplementation.ts\");\n/* harmony import */ var _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./LifecycleEvents */ \"./Interfaces/LifecycleEvents.ts\");\n\n\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Interfaces/LifecycleEvents.ts\":\n/*!***************************************!*\\\n !*** ./Interfaces/LifecycleEvents.ts ***!\n \\***************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ hasOnAdd: () => (/* binding */ hasOnAdd),\n/* harmony export */ hasOnInitialize: () => (/* binding */ hasOnInitialize),\n/* harmony export */ hasOnPostUpdate: () => (/* binding */ hasOnPostUpdate),\n/* harmony export */ hasOnPreUpdate: () => (/* binding */ hasOnPreUpdate),\n/* harmony export */ hasOnRemove: () => (/* binding */ hasOnRemove),\n/* harmony export */ hasPostDraw: () => (/* binding */ hasPostDraw),\n/* harmony export */ hasPreDraw: () => (/* binding */ hasPreDraw),\n/* harmony export */ has_add: () => (/* binding */ has_add),\n/* harmony export */ has_initialize: () => (/* binding */ has_initialize),\n/* harmony export */ has_postupdate: () => (/* binding */ has_postupdate),\n/* harmony export */ has_preupdate: () => (/* binding */ has_preupdate),\n/* harmony export */ has_remove: () => (/* binding */ has_remove)\n/* harmony export */ });\n/**\n * Type guard checking for internal initialize method\n * @internal\n * @param a\n */\nfunction has_initialize(a) {\n return !!a._initialize;\n}\n/**\n *\n */\nfunction has_add(a) {\n return !!a.onAdd;\n}\n/**\n *\n */\nfunction has_remove(a) {\n return !!a.onRemove;\n}\n/**\n *\n */\nfunction hasOnInitialize(a) {\n return !!a.onInitialize;\n}\n/**\n *\n */\nfunction has_preupdate(a) {\n return !!a._preupdate;\n}\n/**\n *\n */\nfunction hasOnPreUpdate(a) {\n return !!a.onPreUpdate;\n}\n/**\n *\n */\nfunction has_postupdate(a) {\n return !!a.onPostUpdate;\n}\n/**\n *\n */\nfunction hasOnPostUpdate(a) {\n return !!a.onPostUpdate;\n}\n/**\n *\n */\nfunction hasOnAdd(a) {\n return !!a.onAdd;\n}\n/**\n *\n */\nfunction hasOnRemove(a) {\n return !!a.onRemove;\n}\n/**\n *\n */\nfunction hasPreDraw(a) {\n return !!a.onPreDraw;\n}\n/**\n *\n */\nfunction hasPostDraw(a) {\n return !!a.onPostDraw;\n}\n\n\n/***/ }),\n\n/***/ \"./Label.ts\":\n/*!******************!*\\\n !*** ./Label.ts ***!\n \\******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Label: () => (/* binding */ Label)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Graphics_Text__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Graphics/Text */ \"./Graphics/Text.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Graphics */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Graphics_Font__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Graphics/Font */ \"./Graphics/Font.ts\");\n/* harmony import */ var _Actor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Actor */ \"./Actor.ts\");\n\n\n\n\n\n/**\n * Labels are the way to draw small amounts of text to the screen. They are\n * actors and inherit all of the benefits and capabilities.\n */\nclass Label extends _Actor__WEBPACK_IMPORTED_MODULE_0__.Actor {\n set maxWidth(width) {\n this._text.maxWidth = width;\n }\n get maxWidth() {\n return this._text.maxWidth;\n }\n get font() {\n return this._font;\n }\n set font(newFont) {\n this._font = newFont;\n this._text.font = newFont;\n }\n /**\n * The text to draw.\n */\n get text() {\n return this._text.text;\n }\n set text(text) {\n this._text.text = text;\n }\n get color() {\n return this._text.color;\n }\n set color(color) {\n if (this._text) {\n this._text.color = color;\n }\n }\n get opacity() {\n return this.graphics.opacity;\n }\n set opacity(opacity) {\n this.graphics.opacity = opacity;\n }\n /**\n * The {@apilink SpriteFont} to use, if any. Overrides {@apilink Font | `font`} if present.\n */\n get spriteFont() {\n return this._spriteFont;\n }\n set spriteFont(sf) {\n if (sf) {\n this._spriteFont = sf;\n this._text.font = this._spriteFont;\n }\n }\n /**\n * Build a new label\n * @param options\n */\n constructor(options) {\n super(options);\n this._font = new _Graphics_Font__WEBPACK_IMPORTED_MODULE_1__.Font();\n this._text = new _Graphics_Text__WEBPACK_IMPORTED_MODULE_2__.Text({ text: '', font: this._font });\n const { text, pos, x, y, spriteFont, font, color, maxWidth } = { text: '', ...options };\n this.pos = pos !== null && pos !== void 0 ? pos : (x && y ? (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(x, y) : this.pos);\n this.text = text !== null && text !== void 0 ? text : this.text;\n this.font = font !== null && font !== void 0 ? font : this.font;\n this.maxWidth = maxWidth !== null && maxWidth !== void 0 ? maxWidth : this.maxWidth;\n this.spriteFont = spriteFont !== null && spriteFont !== void 0 ? spriteFont : this.spriteFont;\n this._text.color = color !== null && color !== void 0 ? color : this.color;\n const gfx = this.get(_Graphics__WEBPACK_IMPORTED_MODULE_4__.GraphicsComponent);\n gfx.anchor = _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero;\n gfx.use(this._text);\n }\n _initialize(engine) {\n super._initialize(engine);\n }\n /**\n * Returns the width of the text in the label (in pixels);\n */\n getTextWidth() {\n return this._text.width;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/Random.ts\":\n/*!************************!*\\\n !*** ./Math/Random.ts ***!\n \\************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Random: () => (/* binding */ Random)\n/* harmony export */ });\n/**\n * @module\n * Pseudo-Random Utility\n *\n * A pseudo-random utility to add seeded random support for help in\n * generating things like terrain or reproducible randomness. Uses the\n * [Mersenne Twister](https://en.wikipedia.org/wiki/Mersenne_Twister) algorithm.\n */\n/**\n * 32-bit mask\n */\nconst BITMASK32 = 0xffffffff;\n/**\n * Pseudo-random number generator following the Mersenne_Twister algorithm. Given a seed this generator will produce the same sequence\n * of numbers each time it is called.\n * See https://en.wikipedia.org/wiki/Mersenne_Twister for more details.\n * Uses the MT19937-32 (2002) implementation documented here http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/emt19937ar.html\n *\n * Api inspired by http://chancejs.com/# https://github.com/chancejs/chancejs\n */\nclass Random {\n /**\n * If no seed is specified, the Date.now() is used\n */\n constructor(seed) {\n this.seed = seed;\n // Separation point of one one word, the number of bits in the lower bitmask 0 <= r <= w-1\n this._lowerMask = 0x7fffffff; // 31 bits same as _r\n this._upperMask = 0x80000000; // 34 high bits\n // Word size, 64 bits\n this._w = 32;\n // Degree of recurrence\n this._n = 624;\n // Middle word, an offset used in the recurrence defining the series x, 1<=m>> 0;\n for (let i = 1; i < this._n; i++) {\n const s = this._mt[i - 1] ^ (this._mt[i - 1] >>> (this._w - 2));\n // numbers are bigger than the JS max safe int, add in 16-bit chunks to prevent IEEE rounding errors on high bits\n this._mt[i] = (((this._f * ((s & 0xffff0000) >>> 16)) << 16) + this._f * (s & 0xffff) + i) >>> 0;\n }\n this._index = this._n;\n }\n /**\n * Apply the twist\n */\n _twist() {\n const mag01 = [0x0, this._a];\n let y = 0, i = 0;\n for (; i < this._n - this._m; i++) {\n y = (this._mt[i] & this._upperMask) | (this._mt[i + 1] & this._lowerMask);\n this._mt[i] = this._mt[i + this._m] ^ (y >>> 1) ^ (mag01[y & 0x1] & BITMASK32);\n }\n for (; i < this._n - 1; i++) {\n y = (this._mt[i] & this._upperMask) | (this._mt[i + 1] & this._lowerMask);\n this._mt[i] = this._mt[i + (this._m - this._n)] ^ (y >>> 1) ^ (mag01[y & 0x1] & BITMASK32);\n }\n y = (this._mt[this._n - 1] & this._upperMask) | (this._mt[0] & this._lowerMask);\n this._mt[this._n - 1] = this._mt[this._m - 1] ^ (y >>> 1) ^ (mag01[y & 0x1] & BITMASK32);\n this._index = 0;\n }\n /**\n * Return next 32 bit integer number in sequence\n */\n nextInt() {\n if (this._index >= this._n) {\n this._twist();\n }\n let y = this._mt[this._index++];\n y ^= y >>> this._u;\n y ^= (y << this._s) & this._b;\n y ^= (y << this._t) & this._c;\n y ^= y >>> this._l;\n return y >>> 0;\n }\n /**\n * Return a random floating point number between [0, 1)\n */\n next() {\n return this.nextInt() * (1.0 / 4294967296.0); // divided by 2^32\n }\n /**\n * Return a random floating point in range [min, max) min is included, max is not included\n */\n floating(min, max) {\n return (max - min) * this.next() + min;\n }\n /**\n * Return a random integer in range [min, max] min is included, max is included.\n * Implemented with rejection sampling, see https://medium.com/@betable/tifu-by-using-math-random-f1c308c4fd9d#.i13tdiu5a\n */\n integer(min, max) {\n return Math.floor((max - min + 1) * this.next() + min);\n }\n /**\n * Returns true or false randomly with 50/50 odds by default.\n * By default the likelihood of returning a true is .5 (50%).\n * @param likelihood takes values between [0, 1]\n */\n bool(likelihood = 0.5) {\n return this.next() <= likelihood;\n }\n /**\n * Returns one element from an array at random\n */\n pickOne(array) {\n return array[this.integer(0, array.length - 1)];\n }\n /**\n * Returns a new array random picking elements from the original\n * @param array Original array to pick from\n * @param numPicks can be any positive number\n * @param allowDuplicates indicates whether the returned set is allowed duplicates (it does not mean there will always be duplicates\n * just that it is possible)\n */\n pickSet(array, numPicks, allowDuplicates = false) {\n if (allowDuplicates) {\n return this._pickSetWithDuplicates(array, numPicks);\n }\n else {\n return this._pickSetWithoutDuplicates(array, numPicks);\n }\n }\n /**\n * Returns a new array randomly picking elements in the original (not reused)\n * @param array Array to pick elements out of\n * @param numPicks must be less than or equal to the number of elements in the array.\n */\n _pickSetWithoutDuplicates(array, numPicks) {\n if (numPicks > array.length || numPicks < 0) {\n throw new Error('Invalid number of elements to pick, must pick a value 0 < n <= length');\n }\n if (numPicks === array.length) {\n return array;\n }\n const result = new Array(numPicks);\n let currentPick = 0;\n const tempArray = array.slice(0);\n while (currentPick < numPicks) {\n const index = this.integer(0, tempArray.length - 1);\n result[currentPick++] = tempArray[index];\n tempArray.splice(index, 1);\n }\n return result;\n }\n /**\n * Returns a new array random picking elements from the original allowing duplicates\n * @param array Array to pick elements out of\n * @param numPicks can be any positive number\n */\n _pickSetWithDuplicates(array, numPicks) {\n // Typescript numbers are all floating point, so do we add check for int? (or floor the input?)\n if (numPicks < 0) {\n throw new Error('Invalid number of elements to pick, must pick a value 0 <= n < MAX_INT');\n }\n const result = new Array(numPicks);\n for (let i = 0; i < numPicks; i++) {\n result[i] = this.pickOne(array);\n }\n return result;\n }\n /**\n * Returns a new array that has its elements shuffled. Using the Fisher/Yates method\n * https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle\n */\n shuffle(array) {\n const tempArray = array.slice(0);\n let swap;\n for (let i = 0; i < tempArray.length - 2; i++) {\n const randomIndex = this.integer(i, tempArray.length - 1);\n swap = tempArray[i];\n tempArray[i] = tempArray[randomIndex];\n tempArray[randomIndex] = swap;\n }\n return tempArray;\n }\n /**\n * Generate a list of random integer numbers\n * @param length the length of the final array\n * @param min the minimum integer number to generate inclusive\n * @param max the maximum integer number to generate inclusive\n */\n range(length, min, max) {\n const result = new Array(length);\n for (let i = 0; i < length; i++) {\n result[i] = this.integer(min, max);\n }\n return result;\n }\n /**\n * Returns the result of a d4 dice roll\n */\n d4() {\n return this.integer(1, 4);\n }\n /**\n * Returns the result of a d6 dice roll\n */\n d6() {\n return this.integer(1, 6);\n }\n /**\n * Returns the result of a d8 dice roll\n */\n d8() {\n return this.integer(1, 8);\n }\n /**\n * Returns the result of a d10 dice roll\n */\n d10() {\n return this.integer(1, 10);\n }\n /**\n * Returns the result of a d12 dice roll\n */\n d12() {\n return this.integer(1, 12);\n }\n /**\n * Returns the result of a d20 dice roll\n */\n d20() {\n return this.integer(1, 20);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/affine-matrix.ts\":\n/*!*******************************!*\\\n !*** ./Math/affine-matrix.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AffineMatrix: () => (/* binding */ AffineMatrix)\n/* harmony export */ });\n/* harmony import */ var _matrix__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./matrix */ \"./Math/matrix.ts\");\n/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./util */ \"./Math/util.ts\");\n/* harmony import */ var _vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vector */ \"./Math/vector.ts\");\n\n\n\nclass AffineMatrix {\n constructor() {\n /**\n * | | | |\n * | ------- | ------- | -------- |\n * | data[0] | data[2] | data[4] |\n * | data[1] | data[3] | data[5] |\n * | 0 | 0 | 1 |\n */\n this.data = new Float64Array(6);\n this._scale = new Float64Array([1, 1]);\n this._scaleSignX = 1;\n this._scaleSignY = 1;\n }\n /**\n * Converts the current matrix into a DOMMatrix\n *\n * This is useful when working with the browser Canvas context\n * @returns {DOMMatrix} DOMMatrix\n */\n toDOMMatrix() {\n return new DOMMatrix([...this.data]);\n }\n static identity() {\n const mat = new AffineMatrix();\n mat.data[0] = 1;\n mat.data[1] = 0;\n mat.data[2] = 0;\n mat.data[3] = 1;\n mat.data[4] = 0;\n mat.data[5] = 0;\n return mat;\n }\n /**\n * Creates a brand new translation matrix at the specified 3d point\n * @param x\n * @param y\n */\n static translation(x, y) {\n const mat = AffineMatrix.identity();\n mat.data[4] = x;\n mat.data[5] = y;\n return mat;\n }\n /**\n * Creates a brand new scaling matrix with the specified scaling factor\n * @param sx\n * @param sy\n */\n static scale(sx, sy) {\n const mat = AffineMatrix.identity();\n mat.data[0] = sx;\n mat.data[3] = sy;\n mat._scale[0] = sx;\n mat._scale[1] = sy;\n return mat;\n }\n /**\n * Creates a brand new rotation matrix with the specified angle in radians\n * @param angle\n */\n static rotation(angle) {\n const mat = AffineMatrix.identity();\n mat.data[0] = Math.cos(angle);\n mat.data[1] = Math.sin(angle);\n mat.data[2] = -Math.sin(angle);\n mat.data[3] = Math.cos(angle);\n return mat;\n }\n setPosition(x, y) {\n this.data[4] = x;\n this.data[5] = y;\n }\n getPosition() {\n return (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.data[4], this.data[5]);\n }\n /**\n * Applies rotation to the current matrix mutating it\n * @param angle in Radians\n */\n rotate(angle) {\n const a11 = this.data[0];\n const a21 = this.data[1];\n const a12 = this.data[2];\n const a22 = this.data[3];\n const sine = Math.sin(angle);\n const cosine = Math.cos(angle);\n this.data[0] = cosine * a11 + sine * a12;\n this.data[1] = cosine * a21 + sine * a22;\n this.data[2] = cosine * a12 - sine * a11;\n this.data[3] = cosine * a22 - sine * a21;\n return this;\n }\n /**\n * Applies translation to the current matrix mutating it\n * @param x\n * @param y\n */\n translate(x, y) {\n const a11 = this.data[0];\n const a21 = this.data[1];\n // const a31 = 0;\n const a12 = this.data[2];\n const a22 = this.data[3];\n // const a32 = 0;\n const a13 = this.data[4];\n const a23 = this.data[5];\n // const a33 = 1;\n // Doesn't change z\n this.data[4] = a11 * x + a12 * y + a13;\n this.data[5] = a21 * x + a22 * y + a23;\n return this;\n }\n /**\n * Applies scaling to the current matrix mutating it\n * @param x\n * @param y\n */\n scale(x, y) {\n const a11 = this.data[0];\n const a21 = this.data[1];\n const a12 = this.data[2];\n const a22 = this.data[3];\n this.data[0] = a11 * x;\n this.data[1] = a21 * x;\n this.data[2] = a12 * y;\n this.data[3] = a22 * y;\n this._scale[0] = x;\n this._scale[1] = y;\n this._scaleSignX = (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(x);\n this._scaleSignY = (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(y);\n return this;\n }\n determinant() {\n return this.data[0] * this.data[3] - this.data[1] * this.data[2];\n }\n /**\n * Return the affine inverse, optionally store it in a target matrix.\n *\n * It's recommended you call .reset() the target unless you know what you're doing\n * @param target\n */\n inverse(target) {\n // See http://negativeprobability.blogspot.com/2011/11/affine-transformations-and-their.html\n // See https://www.mathsisfun.com/algebra/matrix-inverse.html\n // Since we are actually only doing 2D transformations we can use this hack\n // We don't actually use the 3rd or 4th dimension\n const det = this.determinant();\n let inverseDet = det; // default to a zero matrix if we have a singular matrix\n if (det !== 0) {\n inverseDet = 1 / det;\n }\n const a = this.data[0];\n const b = this.data[2];\n const c = this.data[1];\n const d = this.data[3];\n const m = target || AffineMatrix.identity();\n // inverts rotation and scale\n m.data[0] = d * inverseDet;\n m.data[1] = -c * inverseDet;\n m.data[2] = -b * inverseDet;\n m.data[3] = a * inverseDet;\n const tx = this.data[4];\n const ty = this.data[5];\n // invert translation\n // transform translation into the matrix basis created by rot/scale\n m.data[4] = -(tx * m.data[0] + ty * m.data[2]);\n m.data[5] = -(tx * m.data[1] + ty * m.data[3]);\n return m;\n }\n multiply(vectorOrMatrix, dest) {\n if (vectorOrMatrix instanceof _vector__WEBPACK_IMPORTED_MODULE_0__.Vector) {\n const result = dest || new _vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\n const vector = vectorOrMatrix;\n // these shenanigans are to allow dest and vector to be the same instance\n const resultX = vector.x * this.data[0] + vector.y * this.data[2] + this.data[4];\n const resultY = vector.x * this.data[1] + vector.y * this.data[3] + this.data[5];\n result.x = resultX;\n result.y = resultY;\n return result;\n }\n else {\n const result = dest || new AffineMatrix();\n const other = vectorOrMatrix;\n const a11 = this.data[0];\n const a21 = this.data[1];\n // const a31 = 0;\n const a12 = this.data[2];\n const a22 = this.data[3];\n // const a32 = 0;\n const a13 = this.data[4];\n const a23 = this.data[5];\n // const a33 = 1;\n const b11 = other.data[0];\n const b21 = other.data[1];\n // const b31 = 0;\n const b12 = other.data[2];\n const b22 = other.data[3];\n // const b32 = 0;\n const b13 = other.data[4];\n const b23 = other.data[5];\n // const b33 = 1;\n result.data[0] = a11 * b11 + a12 * b21; // + a13 * b31; // zero\n result.data[1] = a21 * b11 + a22 * b21; // + a23 * b31; // zero\n result.data[2] = a11 * b12 + a12 * b22; // + a13 * b32; // zero\n result.data[3] = a21 * b12 + a22 * b22; // + a23 * b32; // zero\n result.data[4] = a11 * b13 + a12 * b23 + a13; // * b33; // one\n result.data[5] = a21 * b13 + a22 * b23 + a23; // * b33; // one\n const signX = this._scaleSignX;\n const signY = this._scaleSignY;\n result._scaleSignX = signX * (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(result._scaleSignX);\n result._scaleSignY = signY * (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(result._scaleSignY);\n return result;\n }\n }\n /**\n * Packed array of length 8, that contains 4 vertices, with 2 components each\n * So: [x0, y0, x1, y1, x2, y2, x3, y3]\n * @param quad\n */\n multiplyQuadInPlace(quad) {\n const resultTopLeftX = quad[0] * this.data[0] + quad[1] * this.data[2] + this.data[4];\n const resultTopLeftY = quad[0] * this.data[1] + quad[1] * this.data[3] + this.data[5];\n quad[0] = resultTopLeftX;\n quad[1] = resultTopLeftY;\n const resultTopRightX = quad[2] * this.data[0] + quad[3] * this.data[2] + this.data[4];\n const resultTopRightY = quad[2] * this.data[1] + quad[3] * this.data[3] + this.data[5];\n quad[2] = resultTopRightX;\n quad[3] = resultTopRightY;\n const resultBottomLeftX = quad[4] * this.data[0] + quad[5] * this.data[2] + this.data[4];\n const resultBottomLeftY = quad[4] * this.data[1] + quad[5] * this.data[3] + this.data[5];\n quad[4] = resultBottomLeftX;\n quad[5] = resultBottomLeftY;\n const resultBottomRightX = quad[6] * this.data[0] + quad[7] * this.data[2] + this.data[4];\n const resultBottomRightY = quad[6] * this.data[1] + quad[7] * this.data[3] + this.data[5];\n quad[6] = resultBottomRightX;\n quad[7] = resultBottomRightY;\n }\n to4x4() {\n const mat = new _matrix__WEBPACK_IMPORTED_MODULE_2__.Matrix();\n mat.data[0] = this.data[0];\n mat.data[1] = this.data[1];\n mat.data[2] = 0;\n mat.data[3] = 0;\n mat.data[4] = this.data[2];\n mat.data[5] = this.data[3];\n mat.data[6] = 0;\n mat.data[7] = 0;\n mat.data[8] = 0;\n mat.data[9] = 0;\n mat.data[10] = 1;\n mat.data[11] = 0;\n mat.data[12] = this.data[4];\n mat.data[13] = this.data[5];\n mat.data[14] = 0;\n mat.data[15] = 1;\n return mat;\n }\n setRotation(angle) {\n const currentScale = this.getScale();\n const sine = Math.sin(angle);\n const cosine = Math.cos(angle);\n this.data[0] = cosine * currentScale.x;\n this.data[1] = sine * currentScale.y;\n this.data[2] = -sine * currentScale.x;\n this.data[3] = cosine * currentScale.y;\n }\n getRotation() {\n const angle = Math.atan2(this.data[1] / this.getScaleY(), this.data[0] / this.getScaleX());\n return (0,_util__WEBPACK_IMPORTED_MODULE_1__.canonicalizeAngle)(angle);\n }\n getScaleX() {\n // absolute scale of the matrix (we lose sign so need to add it back)\n const xScaleSq = this.data[0] * this.data[0] + this.data[2] * this.data[2];\n if (xScaleSq === 1.0) {\n // usually there isn't scale so we can avoid a sqrt\n return this._scaleSignX;\n }\n return this._scaleSignX * Math.sqrt(xScaleSq);\n }\n getScaleY() {\n // absolute scale of the matrix (we lose sign so need to add it back)\n const yScaleSq = this.data[1] * this.data[1] + this.data[3] * this.data[3];\n if (yScaleSq === 1.0) {\n // usually there isn't scale so we can avoid a sqrt\n return this._scaleSignY;\n }\n return this._scaleSignY * Math.sqrt(yScaleSq);\n }\n /**\n * Get the scale of the matrix\n */\n getScale() {\n return (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.getScaleX(), this.getScaleY());\n }\n setScaleX(val) {\n if (val === this._scale[0]) {\n return;\n }\n this._scaleSignX = (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(val);\n // negative scale acts like a 180 rotation, so flip\n const xscale = (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.data[0] * this._scaleSignX, this.data[2] * this._scaleSignX).normalize();\n this.data[0] = xscale.x * val;\n this.data[2] = xscale.y * val;\n this._scale[0] = val;\n }\n setScaleY(val) {\n if (val === this._scale[1]) {\n return;\n }\n this._scaleSignY = (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(val);\n // negative scale acts like a 180 rotation, so flip\n const yscale = (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.data[1] * this._scaleSignY, this.data[3] * this._scaleSignY).normalize();\n this.data[1] = yscale.x * val;\n this.data[3] = yscale.y * val;\n this._scale[1] = val;\n }\n setScale(scale) {\n this.setScaleX(scale.x);\n this.setScaleY(scale.y);\n }\n isIdentity() {\n return this.data[0] === 1 && this.data[1] === 0 && this.data[2] === 0 && this.data[3] === 1 && this.data[4] === 0 && this.data[5] === 0;\n }\n /**\n * Resets the current matrix to the identity matrix, mutating it\n * @returns {AffineMatrix} Current matrix as identity\n */\n reset() {\n const mat = this;\n mat.data[0] = 1;\n mat.data[1] = 0;\n mat.data[2] = 0;\n mat.data[3] = 1;\n mat.data[4] = 0;\n mat.data[5] = 0;\n return mat;\n }\n /**\n * Creates a new Matrix with the same data as the current {@apilink AffineMatrix}\n */\n clone(dest) {\n const mat = dest || new AffineMatrix();\n mat.data[0] = this.data[0];\n mat.data[1] = this.data[1];\n mat.data[2] = this.data[2];\n mat.data[3] = this.data[3];\n mat.data[4] = this.data[4];\n mat.data[5] = this.data[5];\n mat._scaleSignX = this._scaleSignX;\n mat._scaleSignY = this._scaleSignY;\n return mat;\n }\n toString() {\n return `\r\n[${this.data[0]} ${this.data[2]} ${this.data[4]}]\r\n[${this.data[1]} ${this.data[3]} ${this.data[5]}]\r\n[0 0 1]\r\n`;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/bezier-curve.ts\":\n/*!******************************!*\\\n !*** ./Math/bezier-curve.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BezierCurve: () => (/* binding */ BezierCurve)\n/* harmony export */ });\n/* harmony import */ var _lerp__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./lerp */ \"./Math/lerp.ts\");\n\n/**\n * BezierCurve that supports cubic Bezier curves.\n */\nclass BezierCurve {\n constructor(options) {\n var _a;\n // Thanks Freya! https://www.youtube.com/watch?v=aVwxzDHniEw\n this._distLookup = [];\n this.quality = 4;\n if (options.controlPoints.length !== 4) {\n throw new Error('Only cubic bezier curves are supported');\n }\n this._controlPoints = [...options.controlPoints];\n this.quality = (_a = options.quality) !== null && _a !== void 0 ? _a : this.quality;\n this._calculateLookup();\n }\n get arcLength() {\n return this._arcLength;\n }\n get controlPoints() {\n return this._controlPoints;\n }\n set controlPoints(points) {\n this._controlPoints = [...points];\n this._calculateLookup();\n }\n setControlPoint(index, point) {\n this._controlPoints[index] = point;\n this._calculateLookup();\n }\n _calculateLookup() {\n let totalLength = 0;\n this._distLookup.length = 0;\n let prev = this.controlPoints[0];\n const n = this.controlPoints.length * this.quality;\n for (let i = 0; i < n; i++) {\n const t = i / (n - 1);\n const pt = this.getPoint(t);\n const diff = prev.distance(pt);\n totalLength += diff;\n this._distLookup.push(totalLength);\n prev = pt;\n }\n this._arcLength = totalLength;\n }\n _getTimeGivenDistance(distance) {\n const n = this._distLookup.length;\n const arcLength = this.arcLength;\n if (distance >= 0 && distance < arcLength) {\n for (let i = 0; i < n - 1; i++) {\n if (this._distLookup[i] <= distance && distance < this._distLookup[i + 1]) {\n return (0,_lerp__WEBPACK_IMPORTED_MODULE_0__.remap)(this._distLookup[i], this._distLookup[i + 1], i / (n - 1), (i + 1) / (n - 1), distance);\n }\n }\n }\n return distance / arcLength;\n }\n /**\n * Get the point on the Bezier curve at a certain time\n * @param time Between 0-1\n */\n getPoint(time) {\n const points = [...this.controlPoints];\n for (let r = 1; r < points.length; r++) {\n for (let i = 0; i < points.length - r; i++) {\n points[i] = (0,_lerp__WEBPACK_IMPORTED_MODULE_0__.lerpVector)(points[i], points[i + 1], time);\n }\n }\n return points[0];\n }\n /**\n * Get the tangent of the Bezier curve at a certain time\n * @param time Between 0-1\n */\n getTangent(time) {\n const timeSquared = time * time;\n const p0 = this.controlPoints[0];\n const p1 = this.controlPoints[1];\n const p2 = this.controlPoints[2];\n const p3 = this.controlPoints[3];\n // Derivative of Bernstein polynomial\n const pPrime = p0\n .scale(-3 * timeSquared + 6 * time - 3)\n .add(p1.scale(9 * timeSquared - 12 * time + 3).add(p2.scale(-9 * timeSquared + 6 * time).add(p3.scale(3 * timeSquared))));\n return pPrime.normalize();\n }\n /**\n * Get the tangent of the Bezier curve where the distance is uniformly distributed over time\n * @param time\n */\n getUniformTangent(time) {\n const desiredDistance = time * this.arcLength;\n const uniformTime = this._getTimeGivenDistance(desiredDistance);\n return this.getTangent(uniformTime);\n }\n /**\n * Get the normal of the Bezier curve at a certain time\n * @param time Between 0-1\n */\n getNormal(time) {\n return this.getTangent(time).normal();\n }\n /**\n * Get the normal of the Bezier curve where the distance is uniformly distributed over time\n * @param time\n */\n getUniformNormal(time) {\n return this.getUniformTangent(time).normal();\n }\n /**\n * Points are spaced uniformly across the length of the curve over time\n * @param time\n */\n getUniformPoint(time) {\n const desiredDistance = time * this.arcLength;\n const uniformTime = this._getTimeGivenDistance(desiredDistance);\n return this.getPoint(uniformTime);\n }\n clone() {\n return new BezierCurve({\n controlPoints: [...this.controlPoints],\n quality: this.quality\n });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/coord-plane.ts\":\n/*!*****************************!*\\\n !*** ./Math/coord-plane.ts ***!\n \\*****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CoordPlane: () => (/* binding */ CoordPlane)\n/* harmony export */ });\n/**\n * Enum representing the coordinate plane for the position 2D vector in the {@apilink TransformComponent}\n */\nvar CoordPlane;\n(function (CoordPlane) {\n /**\n * The world coordinate plane (default) represents world space, any entities drawn with world\n * space move when the camera moves.\n */\n CoordPlane[\"World\"] = \"world\";\n /**\n * The screen coordinate plane represents screen space, entities drawn in screen space are pinned\n * to screen coordinates ignoring the camera.\n */\n CoordPlane[\"Screen\"] = \"screen\";\n})(CoordPlane || (CoordPlane = {}));\n\n\n/***/ }),\n\n/***/ \"./Math/global-coordinates.ts\":\n/*!************************************!*\\\n !*** ./Math/global-coordinates.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ GlobalCoordinates: () => (/* binding */ GlobalCoordinates)\n/* harmony export */ });\n/* harmony import */ var _vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vector */ \"./Math/vector.ts\");\n\nclass GlobalCoordinates {\n static fromPagePosition(xOrPos, yOrEngine, engineOrUndefined) {\n let pageX;\n let pageY;\n let pagePos;\n let engine;\n if (arguments.length === 3) {\n pageX = xOrPos;\n pageY = yOrEngine;\n pagePos = new _vector__WEBPACK_IMPORTED_MODULE_0__.Vector(pageX, pageY);\n engine = engineOrUndefined;\n }\n else {\n pagePos = xOrPos;\n pageX = pagePos.x;\n pageY = pagePos.y;\n engine = yOrEngine;\n }\n const screenPos = engine.screen.pageToScreenCoordinates(pagePos);\n const worldPos = engine.screen.screenToWorldCoordinates(screenPos);\n return new GlobalCoordinates(worldPos, pagePos, screenPos);\n }\n constructor(worldPos, pagePos, screenPos) {\n this.worldPos = worldPos;\n this.pagePos = pagePos;\n this.screenPos = screenPos;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/index.ts\":\n/*!***********************!*\\\n !*** ./Math/index.ts ***!\n \\***********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AffineMatrix: () => (/* reexport safe */ _affine_matrix__WEBPACK_IMPORTED_MODULE_3__.AffineMatrix),\n/* harmony export */ BezierCurve: () => (/* reexport safe */ _bezier_curve__WEBPACK_IMPORTED_MODULE_12__.BezierCurve),\n/* harmony export */ CoordPlane: () => (/* reexport safe */ _coord_plane__WEBPACK_IMPORTED_MODULE_5__.CoordPlane),\n/* harmony export */ GlobalCoordinates: () => (/* reexport safe */ _global_coordinates__WEBPACK_IMPORTED_MODULE_7__.GlobalCoordinates),\n/* harmony export */ LineSegment: () => (/* reexport safe */ _line_segment__WEBPACK_IMPORTED_MODULE_8__.LineSegment),\n/* harmony export */ Matrix: () => (/* reexport safe */ _matrix__WEBPACK_IMPORTED_MODULE_2__.Matrix),\n/* harmony export */ MatrixLocations: () => (/* reexport safe */ _matrix__WEBPACK_IMPORTED_MODULE_2__.MatrixLocations),\n/* harmony export */ Projection: () => (/* reexport safe */ _projection__WEBPACK_IMPORTED_MODULE_9__.Projection),\n/* harmony export */ Random: () => (/* reexport safe */ _Random__WEBPACK_IMPORTED_MODULE_6__.Random),\n/* harmony export */ Ray: () => (/* reexport safe */ _ray__WEBPACK_IMPORTED_MODULE_10__.Ray),\n/* harmony export */ RotationType: () => (/* reexport safe */ _rotation_type__WEBPACK_IMPORTED_MODULE_14__.RotationType),\n/* harmony export */ Transform: () => (/* reexport safe */ _transform__WEBPACK_IMPORTED_MODULE_4__.Transform),\n/* harmony export */ TwoPI: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.TwoPI),\n/* harmony export */ Vector: () => (/* reexport safe */ _vector__WEBPACK_IMPORTED_MODULE_0__.Vector),\n/* harmony export */ VectorView: () => (/* reexport safe */ _vector_view__WEBPACK_IMPORTED_MODULE_1__.VectorView),\n/* harmony export */ approximatelyEqual: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.approximatelyEqual),\n/* harmony export */ canonicalizeAngle: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.canonicalizeAngle),\n/* harmony export */ clamp: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.clamp),\n/* harmony export */ frac: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.frac),\n/* harmony export */ inverseLerp: () => (/* reexport safe */ _lerp__WEBPACK_IMPORTED_MODULE_11__.inverseLerp),\n/* harmony export */ inverseLerpVector: () => (/* reexport safe */ _lerp__WEBPACK_IMPORTED_MODULE_11__.inverseLerpVector),\n/* harmony export */ lerp: () => (/* reexport safe */ _lerp__WEBPACK_IMPORTED_MODULE_11__.lerp),\n/* harmony export */ lerpAngle: () => (/* reexport safe */ _lerp__WEBPACK_IMPORTED_MODULE_11__.lerpAngle),\n/* harmony export */ lerpVector: () => (/* reexport safe */ _lerp__WEBPACK_IMPORTED_MODULE_11__.lerpVector),\n/* harmony export */ randomInRange: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.randomInRange),\n/* harmony export */ randomIntInRange: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.randomIntInRange),\n/* harmony export */ range: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.range),\n/* harmony export */ remap: () => (/* reexport safe */ _lerp__WEBPACK_IMPORTED_MODULE_11__.remap),\n/* harmony export */ remapVector: () => (/* reexport safe */ _lerp__WEBPACK_IMPORTED_MODULE_11__.remapVector),\n/* harmony export */ sign: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.sign),\n/* harmony export */ toDegrees: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.toDegrees),\n/* harmony export */ toRadians: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.toRadians),\n/* harmony export */ vec: () => (/* reexport safe */ _vector__WEBPACK_IMPORTED_MODULE_0__.vec)\n/* harmony export */ });\n/* harmony import */ var _vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vector */ \"./Math/vector.ts\");\n/* harmony import */ var _vector_view__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./vector-view */ \"./Math/vector-view.ts\");\n/* harmony import */ var _matrix__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./matrix */ \"./Math/matrix.ts\");\n/* harmony import */ var _affine_matrix__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./affine-matrix */ \"./Math/affine-matrix.ts\");\n/* harmony import */ var _transform__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./transform */ \"./Math/transform.ts\");\n/* harmony import */ var _coord_plane__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _Random__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Random */ \"./Math/Random.ts\");\n/* harmony import */ var _global_coordinates__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./global-coordinates */ \"./Math/global-coordinates.ts\");\n/* harmony import */ var _line_segment__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./line-segment */ \"./Math/line-segment.ts\");\n/* harmony import */ var _projection__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./projection */ \"./Math/projection.ts\");\n/* harmony import */ var _ray__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./ray */ \"./Math/ray.ts\");\n/* harmony import */ var _lerp__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./lerp */ \"./Math/lerp.ts\");\n/* harmony import */ var _bezier_curve__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./bezier-curve */ \"./Math/bezier-curve.ts\");\n/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./util */ \"./Math/util.ts\");\n/* harmony import */ var _rotation_type__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./rotation-type */ \"./Math/rotation-type.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Math/lerp.ts\":\n/*!**********************!*\\\n !*** ./Math/lerp.ts ***!\n \\**********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ inverseLerp: () => (/* binding */ inverseLerp),\n/* harmony export */ inverseLerpVector: () => (/* binding */ inverseLerpVector),\n/* harmony export */ lerp: () => (/* binding */ lerp),\n/* harmony export */ lerpAngle: () => (/* binding */ lerpAngle),\n/* harmony export */ lerpVector: () => (/* binding */ lerpVector),\n/* harmony export */ remap: () => (/* binding */ remap),\n/* harmony export */ remapVector: () => (/* binding */ remapVector)\n/* harmony export */ });\n/* harmony import */ var _rotation_type__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./rotation-type */ \"./Math/rotation-type.ts\");\n/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./util */ \"./Math/util.ts\");\n\n\n/**\n * Linear interpolation between `a` and `b`, at `time = 0` the value will be `a` at `time = 1` the value will be `b`\n * @param a\n * @param b\n * @param time\n */\nfunction lerp(a, b, time) {\n return (1 - time) * a + b * time;\n}\n/**\n * Linear interpolation between angles in radians\n * @param startAngle\n * @param endAngle\n * @param rotationType\n * @param time\n */\nfunction lerpAngle(startAngle, endAngle, rotationType, time) {\n const shortestPathIsPositive = (startAngle - endAngle + _util__WEBPACK_IMPORTED_MODULE_0__.TwoPI) % _util__WEBPACK_IMPORTED_MODULE_0__.TwoPI >= Math.PI;\n const distance1 = Math.abs(endAngle - startAngle);\n const distance2 = _util__WEBPACK_IMPORTED_MODULE_0__.TwoPI - distance1;\n let shortDistance = 0;\n let longDistance = 0;\n if (distance1 > distance2) {\n shortDistance = distance2;\n longDistance = distance1;\n }\n else {\n shortDistance = distance1;\n longDistance = distance2;\n }\n let distance = 0;\n let direction = 1;\n switch (rotationType) {\n case _rotation_type__WEBPACK_IMPORTED_MODULE_1__.RotationType.ShortestPath:\n distance = shortDistance;\n direction = shortestPathIsPositive ? 1 : -1;\n break;\n case _rotation_type__WEBPACK_IMPORTED_MODULE_1__.RotationType.LongestPath:\n distance = longDistance;\n direction = shortestPathIsPositive ? -1 : 1;\n break;\n case _rotation_type__WEBPACK_IMPORTED_MODULE_1__.RotationType.Clockwise:\n direction = 1;\n distance = shortestPathIsPositive ? shortDistance : longDistance;\n break;\n case _rotation_type__WEBPACK_IMPORTED_MODULE_1__.RotationType.CounterClockwise:\n direction = -1;\n distance = shortestPathIsPositive ? longDistance : shortDistance;\n break;\n }\n return startAngle + direction * (distance * time);\n}\n/**\n * Linear interpolation between `a` and `b`, at `time = 0` the value will be `a` at `time = 1` the value will be `b`\n * @param a\n * @param b\n * @param time\n */\nfunction lerpVector(a, b, time) {\n return a.scale(1 - time).add(b.scale(time));\n}\n/**\n * Inverse of a linear interpolation, given a `value` in between `a` and `b` return how close to `a` or `b` the `value` is.\n *\n * Example: `a=1`, `b=5`, `value=4` will return `.75`\n * @param a\n * @param b\n * @param value\n */\nfunction inverseLerp(a, b, value) {\n return (value - a) / (b - a);\n}\n/**\n * Inverse of a linear interpolation, given a `value` in between `a` and `b` return how close to `a` or `b` the `value` is.\n *\n * **Warning** assumes that the `value` vector is co-linear with vector `a` and `b`\n *\n * Example: `a=1`, `b=5`, `value=4` will return `.75`\n * @param a\n * @param b\n * @param value\n */\nfunction inverseLerpVector(a, b, value) {\n const numerator = value.sub(a);\n const denominator = b.sub(a);\n const x = numerator.x / denominator.x;\n const y = numerator.y / denominator.y;\n return Math.min(x, y);\n}\n/**\n * Remaps a value from a source domain to a destination\n * @param minSource\n * @param maxSource\n * @param minDestination\n * @param maxDestination\n * @param value\n */\nfunction remap(minSource, maxSource, minDestination, maxDestination, value) {\n const time = inverseLerp(minSource, maxSource, value);\n return lerp(minDestination, maxDestination, time);\n}\n/**\n * Remaps a value from a source domain to a destination\n *\n * **Warning** assumes that the `value` vector is co-linear with vector `minSource` and `maxSource`\n * @param minSource\n * @param maxSource\n * @param minDestination\n * @param maxDestination\n * @param value\n */\nfunction remapVector(minSource, maxSource, minDestination, maxDestination, value) {\n const time = inverseLerpVector(minSource, maxSource, value);\n return lerpVector(minDestination, maxDestination, time);\n}\n\n\n/***/ }),\n\n/***/ \"./Math/line-segment.ts\":\n/*!******************************!*\\\n !*** ./Math/line-segment.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ LineSegment: () => (/* binding */ LineSegment)\n/* harmony export */ });\n/* harmony import */ var _vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vector */ \"./Math/vector.ts\");\n\n/**\n * A 2D line segment\n */\nclass LineSegment {\n /**\n * @param begin The starting point of the line segment\n * @param end The ending point of the line segment\n */\n constructor(begin, end) {\n this.begin = begin;\n this.end = end;\n }\n clone(dest) {\n const result = dest || new LineSegment(this.begin.clone(), this.end.clone());\n result.begin = this.begin.clone(result.begin);\n result.end = this.end.clone(result.end);\n return result;\n }\n transform(matrix, dest) {\n const result = dest || new LineSegment(_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero, _vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero);\n result.begin = matrix.multiply(this.begin, result.begin);\n result.end = matrix.multiply(this.end, result.end);\n return result;\n }\n /**\n * Gets the raw slope (m) of the line. Will return (+/-)Infinity for vertical lines.\n */\n get slope() {\n return (this.end.y - this.begin.y) / (this.end.x - this.begin.x);\n }\n /**\n * Gets the Y-intercept (b) of the line. Will return (+/-)Infinity if there is no intercept.\n */\n get intercept() {\n return this.begin.y - this.slope * this.begin.x;\n }\n /**\n * Gets the normal of the line\n */\n normal() {\n if (this._normal) {\n return this._normal;\n }\n return (this._normal = this.end.sub(this.begin).normal());\n }\n dir() {\n if (this._dir) {\n return this._dir;\n }\n return (this._dir = this.end.sub(this.begin));\n }\n getPoints() {\n return [this.begin, this.end];\n }\n /**\n * Returns the slope of the line in the form of a vector of length 1\n */\n getSlope() {\n if (this._slope) {\n return this._slope;\n }\n const begin = this.begin;\n const end = this.end;\n const distance = begin.distance(end);\n return (this._slope = end.sub(begin).scale(1 / distance));\n }\n /**\n * Returns the edge of the line as vector, the length of the vector is the length of the edge\n */\n getEdge() {\n const begin = this.begin;\n const end = this.end;\n return end.sub(begin);\n }\n /**\n * Returns the length of the line segment in pixels\n */\n getLength() {\n const begin = this.begin;\n const end = this.end;\n const distance = begin.distance(end);\n return distance;\n }\n /**\n * Returns the midpoint of the edge\n */\n get midpoint() {\n return this.begin.add(this.end).scale(0.5);\n }\n /**\n * Flips the direction of the line segment\n */\n flip() {\n return new LineSegment(this.end, this.begin);\n }\n /**\n * Tests if a given point is below the line, points in the normal direction above the line are considered above.\n * @param point\n */\n below(point) {\n const above2 = (this.end.x - this.begin.x) * (point.y - this.begin.y) - (this.end.y - this.begin.y) * (point.x - this.begin.x);\n return above2 >= 0;\n }\n /**\n * Returns the clip point\n * @param sideVector Vector that traces the line\n * @param length Length to clip along side\n */\n clip(sideVector, length, normalize = true) {\n let dir = sideVector;\n if (normalize) {\n dir = dir.normalize();\n }\n const near = dir.dot(this.begin) - length;\n const far = dir.dot(this.end) - length;\n const results = [];\n if (near <= 0) {\n results.push(this.begin);\n }\n if (far <= 0) {\n results.push(this.end);\n }\n if (near * far < 0) {\n const clipTime = near / (near - far);\n results.push(this.begin.add(this.end.sub(this.begin).scale(clipTime)));\n }\n if (results.length !== 2) {\n return null;\n }\n return new LineSegment(results[0], results[1]);\n }\n /**\n * Find the perpendicular distance from the line to a point\n * https://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line\n * @param point\n */\n distanceToPoint(point, signed = false) {\n const x0 = point.x;\n const y0 = point.y;\n const l = this.getLength();\n const dy = this.end.y - this.begin.y;\n const dx = this.end.x - this.begin.x;\n const distance = (dy * x0 - dx * y0 + this.end.x * this.begin.y - this.end.y * this.begin.x) / l;\n return signed ? distance : Math.abs(distance);\n }\n /**\n * Find the perpendicular line from the line to a point\n * https://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line\n * (a - p) - ((a - p) * n)n\n * a is a point on the line\n * p is the arbitrary point above the line\n * n is a unit vector in direction of the line\n * @param point\n */\n findVectorToPoint(point) {\n const aMinusP = this.begin.sub(point);\n const n = this.getSlope();\n return aMinusP.sub(n.scale(aMinusP.dot(n)));\n }\n /**\n * Finds a point on the line given only an X or a Y value. Given an X value, the function returns\n * a new point with the calculated Y value and vice-versa.\n * @param x The known X value of the target point\n * @param y The known Y value of the target point\n * @returns A new point with the other calculated axis value\n */\n findPoint(x = null, y = null) {\n const m = this.slope;\n const b = this.intercept;\n if (x !== null) {\n return new _vector__WEBPACK_IMPORTED_MODULE_0__.Vector(x, m * x + b);\n }\n else if (y !== null) {\n return new _vector__WEBPACK_IMPORTED_MODULE_0__.Vector((y - b) / m, y);\n }\n else {\n throw new Error('You must provide an X or a Y value');\n }\n }\n /**\n * @see http://stackoverflow.com/a/11908158/109458\n */\n hasPoint() {\n let currPoint;\n let threshold = 0;\n if (typeof arguments[0] === 'number' && typeof arguments[1] === 'number') {\n currPoint = new _vector__WEBPACK_IMPORTED_MODULE_0__.Vector(arguments[0], arguments[1]);\n threshold = arguments[2] || 0;\n }\n else if (arguments[0] instanceof _vector__WEBPACK_IMPORTED_MODULE_0__.Vector) {\n currPoint = arguments[0];\n threshold = arguments[1] || 0;\n }\n else {\n throw 'Could not determine the arguments for Vector.hasPoint';\n }\n const dxc = currPoint.x - this.begin.x;\n const dyc = currPoint.y - this.begin.y;\n const dx1 = this.end.x - this.begin.x;\n const dy1 = this.end.y - this.begin.y;\n const cross = dxc * dy1 - dyc * dx1;\n // check whether point lines on the line\n if (Math.abs(cross) > threshold) {\n return false;\n }\n // check whether point lies in-between start and end\n if (Math.abs(dx1) >= Math.abs(dy1)) {\n return dx1 > 0 ? this.begin.x <= currPoint.x && currPoint.x <= this.end.x : this.end.x <= currPoint.x && currPoint.x <= this.begin.x;\n }\n else {\n return dy1 > 0 ? this.begin.y <= currPoint.y && currPoint.y <= this.end.y : this.end.y <= currPoint.y && currPoint.y <= this.begin.y;\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/matrix.ts\":\n/*!************************!*\\\n !*** ./Math/matrix.ts ***!\n \\************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Matrix: () => (/* binding */ Matrix),\n/* harmony export */ MatrixLocations: () => (/* binding */ MatrixLocations)\n/* harmony export */ });\n/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./util */ \"./Math/util.ts\");\n/* harmony import */ var _vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vector */ \"./Math/vector.ts\");\n\n\n\nvar MatrixLocations;\n(function (MatrixLocations) {\n MatrixLocations[MatrixLocations[\"X\"] = 12] = \"X\";\n MatrixLocations[MatrixLocations[\"Y\"] = 13] = \"Y\";\n})(MatrixLocations || (MatrixLocations = {}));\n/**\n * Excalibur Matrix helper for 4x4 matrices\n *\n * Useful for webgl 4x4 matrices\n */\nclass Matrix {\n constructor() {\n /**\n * 4x4 matrix in column major order\n *\n * | | | | |\n * | ------- | ------- | -------- | -------- |\n * | data[0] | data[4] | data[8] | data[12] |\n * | data[1] | data[5] | data[9] | data[13] |\n * | data[2] | data[6] | data[10] | data[14] |\n * | data[3] | data[7] | data[11] | data[15] |\n *\n */\n this.data = new Float32Array(16);\n this._scaleX = 1;\n this._scaleSignX = 1;\n this._scaleY = 1;\n this._scaleSignY = 1;\n }\n /**\n * Creates an orthographic (flat non-perspective) projection\n * https://en.wikipedia.org/wiki/Orthographic_projection\n * @param left\n * @param right\n * @param bottom\n * @param top\n * @param near\n * @param far\n */\n static ortho(left, right, bottom, top, near, far) {\n const mat = new Matrix();\n mat.data[0] = 2 / (right - left);\n mat.data[1] = 0;\n mat.data[2] = 0;\n mat.data[3] = 0;\n mat.data[4] = 0;\n mat.data[5] = 2 / (top - bottom);\n mat.data[6] = 0;\n mat.data[7] = 0;\n mat.data[8] = 0;\n mat.data[9] = 0;\n mat.data[10] = -2 / (far - near);\n mat.data[11] = 0;\n mat.data[12] = -(right + left) / (right - left);\n mat.data[13] = -(top + bottom) / (top - bottom);\n mat.data[14] = -(far + near) / (far - near);\n mat.data[15] = 1;\n return mat;\n }\n /**\n * Creates a new Matrix with the same data as the current 4x4\n */\n clone(dest) {\n const mat = dest || new Matrix();\n mat.data[0] = this.data[0];\n mat.data[1] = this.data[1];\n mat.data[2] = this.data[2];\n mat.data[3] = this.data[3];\n mat.data[4] = this.data[4];\n mat.data[5] = this.data[5];\n mat.data[6] = this.data[6];\n mat.data[7] = this.data[7];\n mat.data[8] = this.data[8];\n mat.data[9] = this.data[9];\n mat.data[10] = this.data[10];\n mat.data[11] = this.data[11];\n mat.data[12] = this.data[12];\n mat.data[13] = this.data[13];\n mat.data[14] = this.data[14];\n mat.data[15] = this.data[15];\n return mat;\n }\n /**\n * Converts the current matrix into a DOMMatrix\n *\n * This is useful when working with the browser Canvas context\n * @returns {DOMMatrix} DOMMatrix\n */\n toDOMMatrix() {\n return new DOMMatrix([...this.data]);\n }\n static fromFloat32Array(data) {\n const matrix = new Matrix();\n matrix.data = data;\n return matrix;\n }\n /**\n * Creates a new identity matrix (a matrix that when applied does nothing)\n */\n static identity() {\n const mat = new Matrix();\n mat.data[0] = 1;\n mat.data[1] = 0;\n mat.data[2] = 0;\n mat.data[3] = 0;\n mat.data[4] = 0;\n mat.data[5] = 1;\n mat.data[6] = 0;\n mat.data[7] = 0;\n mat.data[8] = 0;\n mat.data[9] = 0;\n mat.data[10] = 1;\n mat.data[11] = 0;\n mat.data[12] = 0;\n mat.data[13] = 0;\n mat.data[14] = 0;\n mat.data[15] = 1;\n return mat;\n }\n /**\n * Resets the current matrix to the identity matrix, mutating it\n * @returns {Matrix} Current matrix as identity\n */\n reset() {\n const mat = this;\n mat.data[0] = 1;\n mat.data[1] = 0;\n mat.data[2] = 0;\n mat.data[3] = 0;\n mat.data[4] = 0;\n mat.data[5] = 1;\n mat.data[6] = 0;\n mat.data[7] = 0;\n mat.data[8] = 0;\n mat.data[9] = 0;\n mat.data[10] = 1;\n mat.data[11] = 0;\n mat.data[12] = 0;\n mat.data[13] = 0;\n mat.data[14] = 0;\n mat.data[15] = 1;\n return mat;\n }\n /**\n * Creates a brand new translation matrix at the specified 3d point\n * @param x\n * @param y\n */\n static translation(x, y) {\n const mat = Matrix.identity();\n mat.data[12] = x;\n mat.data[13] = y;\n return mat;\n }\n /**\n * Creates a brand new scaling matrix with the specified scaling factor\n * @param sx\n * @param sy\n */\n static scale(sx, sy) {\n const mat = Matrix.identity();\n mat.data[0] = sx;\n mat.data[5] = sy;\n mat.data[10] = 1;\n mat.data[15] = 1;\n return mat;\n }\n /**\n * Creates a brand new rotation matrix with the specified angle in radians\n * @param angle\n */\n static rotation(angle) {\n const mat = Matrix.identity();\n mat.data[0] = Math.cos(angle);\n mat.data[4] = -Math.sin(angle);\n mat.data[1] = Math.sin(angle);\n mat.data[5] = Math.cos(angle);\n return mat;\n }\n multiply(vectorOrMatrix, dest) {\n if (vectorOrMatrix instanceof _vector__WEBPACK_IMPORTED_MODULE_0__.Vector) {\n const result = dest || new _vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\n const vector = vectorOrMatrix;\n // these shenanigans are to allow dest and vector to be the same instance\n const resultX = vector.x * this.data[0] + vector.y * this.data[4] + this.data[12];\n const resultY = vector.x * this.data[1] + vector.y * this.data[5] + this.data[13];\n result.x = resultX;\n result.y = resultY;\n return result;\n }\n else {\n const result = dest || new Matrix();\n const other = vectorOrMatrix;\n const a11 = this.data[0];\n const a21 = this.data[1];\n const a31 = this.data[2];\n const a41 = this.data[3];\n const a12 = this.data[4];\n const a22 = this.data[5];\n const a32 = this.data[6];\n const a42 = this.data[7];\n const a13 = this.data[8];\n const a23 = this.data[9];\n const a33 = this.data[10];\n const a43 = this.data[11];\n const a14 = this.data[12];\n const a24 = this.data[13];\n const a34 = this.data[14];\n const a44 = this.data[15];\n const b11 = other.data[0];\n const b21 = other.data[1];\n const b31 = other.data[2];\n const b41 = other.data[3];\n const b12 = other.data[4];\n const b22 = other.data[5];\n const b32 = other.data[6];\n const b42 = other.data[7];\n const b13 = other.data[8];\n const b23 = other.data[9];\n const b33 = other.data[10];\n const b43 = other.data[11];\n const b14 = other.data[12];\n const b24 = other.data[13];\n const b34 = other.data[14];\n const b44 = other.data[15];\n result.data[0] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n result.data[1] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n result.data[2] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n result.data[3] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n result.data[4] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n result.data[5] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n result.data[6] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n result.data[7] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n result.data[8] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n result.data[9] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n result.data[10] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n result.data[11] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n result.data[12] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n result.data[13] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n result.data[14] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n result.data[15] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n const s = this.getScale();\n result._scaleSignX = (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(s.x) * (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(result._scaleSignX);\n result._scaleSignY = (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(s.y) * (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(result._scaleSignY);\n return result;\n }\n }\n /**\n * Applies translation to the current matrix mutating it\n * @param x\n * @param y\n */\n translate(x, y) {\n const a11 = this.data[0];\n const a21 = this.data[1];\n const a31 = this.data[2];\n const a41 = this.data[3];\n const a12 = this.data[4];\n const a22 = this.data[5];\n const a32 = this.data[6];\n const a42 = this.data[7];\n const a13 = this.data[8];\n const a23 = this.data[9];\n const a33 = this.data[10];\n const a43 = this.data[11];\n const a14 = this.data[12];\n const a24 = this.data[13];\n const a34 = this.data[14];\n const a44 = this.data[15];\n // Doesn't change z\n const z = 0;\n const w = 1;\n this.data[12] = a11 * x + a12 * y + a13 * z + a14 * w;\n this.data[13] = a21 * x + a22 * y + a23 * z + a24 * w;\n this.data[14] = a31 * x + a32 * y + a33 * z + a34 * w;\n this.data[15] = a41 * x + a42 * y + a43 * z + a44 * w;\n return this;\n }\n setPosition(x, y) {\n this.data[12] = x;\n this.data[13] = y;\n }\n getPosition() {\n return (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.data[12], this.data[13]);\n }\n /**\n * Applies rotation to the current matrix mutating it\n * @param angle in Radians\n */\n rotate(angle) {\n const a11 = this.data[0];\n const a21 = this.data[1];\n const a31 = this.data[2];\n const a41 = this.data[3];\n const a12 = this.data[4];\n const a22 = this.data[5];\n const a32 = this.data[6];\n const a42 = this.data[7];\n const sine = Math.sin(angle);\n const cosine = Math.cos(angle);\n this.data[0] = cosine * a11 + sine * a12;\n this.data[1] = cosine * a21 + sine * a22;\n this.data[2] = cosine * a31 + sine * a32;\n this.data[3] = cosine * a41 + sine * a42;\n this.data[4] = cosine * a12 - sine * a11;\n this.data[5] = cosine * a22 - sine * a21;\n this.data[6] = cosine * a32 - sine * a31;\n this.data[7] = cosine * a42 - sine * a41;\n return this;\n }\n /**\n * Applies scaling to the current matrix mutating it\n * @param x\n * @param y\n */\n scale(x, y) {\n const a11 = this.data[0];\n const a21 = this.data[1];\n const a31 = this.data[2];\n const a41 = this.data[3];\n const a12 = this.data[4];\n const a22 = this.data[5];\n const a32 = this.data[6];\n const a42 = this.data[7];\n this.data[0] = a11 * x;\n this.data[1] = a21 * x;\n this.data[2] = a31 * x;\n this.data[3] = a41 * x;\n this.data[4] = a12 * y;\n this.data[5] = a22 * y;\n this.data[6] = a32 * y;\n this.data[7] = a42 * y;\n return this;\n }\n setRotation(angle) {\n const currentScale = this.getScale();\n const sine = Math.sin(angle);\n const cosine = Math.cos(angle);\n this.data[0] = cosine * currentScale.x;\n this.data[1] = sine * currentScale.y;\n this.data[4] = -sine * currentScale.x;\n this.data[5] = cosine * currentScale.y;\n }\n getRotation() {\n const angle = Math.atan2(this.data[1] / this.getScaleY(), this.data[0] / this.getScaleX());\n return (0,_util__WEBPACK_IMPORTED_MODULE_1__.canonicalizeAngle)(angle);\n }\n getScaleX() {\n // absolute scale of the matrix (we lose sign so need to add it back)\n const xscale = (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.data[0], this.data[4]).magnitude;\n return this._scaleSignX * xscale;\n }\n getScaleY() {\n // absolute scale of the matrix (we lose sign so need to add it back)\n const yscale = (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.data[1], this.data[5]).magnitude;\n return this._scaleSignY * yscale;\n }\n /**\n * Get the scale of the matrix\n */\n getScale() {\n return (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.getScaleX(), this.getScaleY());\n }\n setScaleX(val) {\n if (this._scaleX === val) {\n return;\n }\n this._scaleSignX = (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(val);\n // negative scale acts like a 180 rotation, so flip\n const xscale = (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.data[0] * this._scaleSignX, this.data[4] * this._scaleSignX).normalize();\n this.data[0] = xscale.x * val;\n this.data[4] = xscale.y * val;\n this._scaleX = val;\n }\n setScaleY(val) {\n if (this._scaleY === val) {\n return;\n }\n this._scaleSignY = (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(val);\n // negative scale acts like a 180 rotation, so flip\n const yscale = (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.data[1] * this._scaleSignY, this.data[5] * this._scaleSignY).normalize();\n this.data[1] = yscale.x * val;\n this.data[5] = yscale.y * val;\n this._scaleY = val;\n }\n setScale(scale) {\n this.setScaleX(scale.x);\n this.setScaleY(scale.y);\n }\n /**\n * Determinant of the upper left 2x2 matrix\n */\n getBasisDeterminant() {\n return this.data[0] * this.data[5] - this.data[1] * this.data[4];\n }\n /**\n * Return the affine inverse, optionally store it in a target matrix.\n *\n * It's recommended you call .reset() the target unless you know what you're doing\n * @param target\n */\n getAffineInverse(target) {\n // See http://negativeprobability.blogspot.com/2011/11/affine-transformations-and-their.html\n // See https://www.mathsisfun.com/algebra/matrix-inverse.html\n // Since we are actually only doing 2D transformations we can use this hack\n // We don't actually use the 3rd or 4th dimension\n const det = this.getBasisDeterminant();\n const inverseDet = 1 / det; // todo zero check\n const a = this.data[0];\n const b = this.data[4];\n const c = this.data[1];\n const d = this.data[5];\n const m = target || Matrix.identity();\n // inverts rotation and scale\n m.data[0] = d * inverseDet;\n m.data[1] = -c * inverseDet;\n m.data[4] = -b * inverseDet;\n m.data[5] = a * inverseDet;\n const tx = this.data[12];\n const ty = this.data[13];\n // invert translation\n // transform translation into the matrix basis created by rot/scale\n m.data[12] = -(tx * m.data[0] + ty * m.data[4]);\n m.data[13] = -(tx * m.data[1] + ty * m.data[5]);\n return m;\n }\n isIdentity() {\n return (this.data[0] === 1 &&\n this.data[1] === 0 &&\n this.data[2] === 0 &&\n this.data[3] === 0 &&\n this.data[4] === 0 &&\n this.data[5] === 1 &&\n this.data[6] === 0 &&\n this.data[7] === 0 &&\n this.data[8] === 0 &&\n this.data[9] === 0 &&\n this.data[10] === 1 &&\n this.data[11] === 0 &&\n this.data[12] === 0 &&\n this.data[13] === 0 &&\n this.data[14] === 0 &&\n this.data[15] === 1);\n }\n toString() {\n return `\r\n[${this.data[0]} ${this.data[4]} ${this.data[8]} ${this.data[12]}]\r\n[${this.data[1]} ${this.data[5]} ${this.data[9]} ${this.data[13]}]\r\n[${this.data[2]} ${this.data[6]} ${this.data[10]} ${this.data[14]}]\r\n[${this.data[3]} ${this.data[7]} ${this.data[11]} ${this.data[15]}]\r\n`;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/projection.ts\":\n/*!****************************!*\\\n !*** ./Math/projection.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Projection: () => (/* binding */ Projection)\n/* harmony export */ });\n/**\n * A 1 dimensional projection on an axis, used to test overlaps\n */\nclass Projection {\n constructor(min, max) {\n this.min = min;\n this.max = max;\n }\n overlaps(projection) {\n return this.max > projection.min && projection.max > this.min;\n }\n getOverlap(projection) {\n if (this.overlaps(projection)) {\n if (this.max > projection.max) {\n return projection.max - this.min;\n }\n else {\n return this.max - projection.min;\n }\n }\n return 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/ray.ts\":\n/*!*********************!*\\\n !*** ./Math/ray.ts ***!\n \\*********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Ray: () => (/* binding */ Ray)\n/* harmony export */ });\n/**\n * A 2D ray that can be cast into the scene to do collision detection\n */\nclass Ray {\n /**\n * @param pos The starting position for the ray\n * @param dir The vector indicating the direction of the ray\n */\n constructor(pos, dir) {\n this.pos = pos;\n this.dir = dir.normalize();\n }\n /**\n * Tests a whether this ray intersects with a line segment. Returns a number greater than or equal to 0 on success.\n * This number indicates the mathematical intersection time.\n * @param line The line to test\n */\n intersect(line) {\n const numerator = line.begin.sub(this.pos);\n // Test is line and ray are parallel and non intersecting\n if (this.dir.cross(line.getSlope()) === 0 && numerator.cross(this.dir) !== 0) {\n return -1;\n }\n // Lines are parallel\n const divisor = this.dir.cross(line.getSlope());\n if (divisor === 0) {\n return -1;\n }\n const t = numerator.cross(line.getSlope()) / divisor;\n if (t >= 0) {\n const u = numerator.cross(this.dir) / divisor / line.getLength();\n if (u >= 0 && u <= 1) {\n return t;\n }\n }\n return -1;\n }\n intersectPoint(line) {\n const time = this.intersect(line);\n if (time < 0) {\n return null;\n }\n return this.getPoint(time);\n }\n /**\n * Returns the point of intersection given the intersection time\n */\n getPoint(time) {\n return this.pos.add(this.dir.scale(time));\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/rotation-type.ts\":\n/*!*******************************!*\\\n !*** ./Math/rotation-type.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RotationType: () => (/* binding */ RotationType)\n/* harmony export */ });\n/**\n * An enum that describes the strategies that rotation actions can use\n */\nvar RotationType;\n(function (RotationType) {\n /**\n * Rotation via `ShortestPath` will use the smallest angle\n * between the starting and ending points. This strategy is the default behavior.\n */\n RotationType[\"ShortestPath\"] = \"shortest-path\";\n /**\n * Rotation via `LongestPath` will use the largest angle\n * between the starting and ending points.\n */\n RotationType[\"LongestPath\"] = \"longest-path\";\n /**\n * Rotation via `Clockwise` will travel in a clockwise direction,\n * regardless of the starting and ending points.\n */\n RotationType[\"Clockwise\"] = \"clockwise\";\n /**\n * Rotation via `CounterClockwise` will travel in a counterclockwise direction,\n * regardless of the starting and ending points.\n */\n RotationType[\"CounterClockwise\"] = \"counter-clockwise\";\n})(RotationType || (RotationType = {}));\n\n\n/***/ }),\n\n/***/ \"./Math/transform.ts\":\n/*!***************************!*\\\n !*** ./Math/transform.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Transform: () => (/* binding */ Transform)\n/* harmony export */ });\n/* harmony import */ var _affine_matrix__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./affine-matrix */ \"./Math/affine-matrix.ts\");\n/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./util */ \"./Math/util.ts\");\n/* harmony import */ var _vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./vector */ \"./Math/vector.ts\");\n/* harmony import */ var _vector_view__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./vector-view */ \"./Math/vector-view.ts\");\n/* harmony import */ var _watch_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./watch-vector */ \"./Math/watch-vector.ts\");\n\n\n\n\n\nclass Transform {\n constructor() {\n this._parent = null;\n this._children = [];\n this._pos = new _watch_vector__WEBPACK_IMPORTED_MODULE_0__.WatchVector((0,_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0), () => {\n this.flagDirty();\n });\n this._globalPos = new _vector_view__WEBPACK_IMPORTED_MODULE_2__.VectorView({\n getX: () => this.matrix.data[4],\n getY: () => this.matrix.data[5],\n setX: (x) => {\n if (this.parent) {\n const { x: newX } = this.parent.inverse.multiply((0,_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(x, this.pos.y));\n this.pos.x = newX;\n }\n else {\n this.pos.x = x;\n }\n if (x !== this.matrix.data[4]) {\n this.flagDirty();\n }\n },\n setY: (y) => {\n if (this.parent) {\n const { y: newY } = this.parent.inverse.multiply((0,_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(this.pos.x, y));\n this.pos.y = newY;\n }\n else {\n this.pos.y = y;\n }\n if (y !== this.matrix.data[5]) {\n this.flagDirty();\n }\n }\n });\n this._rotation = 0;\n this._scale = new _watch_vector__WEBPACK_IMPORTED_MODULE_0__.WatchVector((0,_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(1, 1), () => {\n this.flagDirty();\n });\n this._globalScale = new _vector_view__WEBPACK_IMPORTED_MODULE_2__.VectorView({\n getX: () => (this.parent ? this.matrix.getScaleX() : this.scale.x),\n getY: () => (this.parent ? this.matrix.getScaleY() : this.scale.y),\n setX: (x) => {\n if (this.parent) {\n const globalScaleX = this.parent.globalScale.x;\n this.scale.x = x / globalScaleX;\n }\n else {\n this.scale.x = x;\n }\n },\n setY: (y) => {\n if (this.parent) {\n const globalScaleY = this.parent.globalScale.y;\n this.scale.y = y / globalScaleY;\n }\n else {\n this.scale.y = y;\n }\n }\n });\n this._z = 0;\n this._isDirty = false;\n this._isInverseDirty = false;\n this._matrix = _affine_matrix__WEBPACK_IMPORTED_MODULE_3__.AffineMatrix.identity();\n this._inverse = _affine_matrix__WEBPACK_IMPORTED_MODULE_3__.AffineMatrix.identity();\n this._scratch = _affine_matrix__WEBPACK_IMPORTED_MODULE_3__.AffineMatrix.identity();\n }\n get parent() {\n return this._parent;\n }\n set parent(transform) {\n if (this._parent) {\n const index = this._parent._children.indexOf(this);\n if (index > -1) {\n this._parent._children.splice(index, 1);\n }\n }\n this._parent = transform;\n if (this._parent) {\n this._parent._children.push(this);\n }\n this.flagDirty();\n }\n get children() {\n return this._children;\n }\n set pos(v) {\n this._pos.x = v.x;\n this._pos.y = v.y;\n }\n get pos() {\n return this._pos;\n }\n set globalPos(v) {\n let localPos = v.clone();\n if (this.parent) {\n localPos = this.parent.inverse.multiply(v);\n }\n if (!localPos.equals(this._pos)) {\n this._pos = localPos;\n this.flagDirty();\n }\n }\n get globalPos() {\n return this._globalPos;\n }\n set rotation(rotation) {\n const canonRotation = (0,_util__WEBPACK_IMPORTED_MODULE_4__.canonicalizeAngle)(rotation);\n if (canonRotation !== this._rotation) {\n this.flagDirty();\n }\n this._rotation = canonRotation;\n }\n get rotation() {\n return this._rotation;\n }\n set globalRotation(rotation) {\n let inverseRotation = 0;\n if (this.parent) {\n inverseRotation = this.parent.globalRotation;\n }\n const canonRotation = (0,_util__WEBPACK_IMPORTED_MODULE_4__.canonicalizeAngle)(rotation + inverseRotation);\n if (canonRotation !== this._rotation) {\n this.flagDirty();\n }\n this._rotation = canonRotation;\n }\n get globalRotation() {\n if (this.parent) {\n return this.matrix.getRotation();\n }\n return this.rotation;\n }\n set scale(v) {\n this._scale.x = v.x;\n this._scale.y = v.y;\n }\n get scale() {\n return this._scale;\n }\n set globalScale(v) {\n let inverseScale = (0,_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(1, 1);\n if (this.parent) {\n inverseScale = this.parent.globalScale;\n }\n this.scale = v.scale((0,_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(1 / inverseScale.x, 1 / inverseScale.y));\n }\n get globalScale() {\n return this._globalScale;\n }\n set z(z) {\n this._z = z;\n this.flagDirty();\n }\n get z() {\n return this._z;\n }\n set globalZ(z) {\n if (this.parent) {\n this.z = z - this.parent.globalZ;\n }\n else {\n this.z = z;\n }\n }\n get globalZ() {\n if (this.parent) {\n return this.z + this.parent.globalZ;\n }\n return this.z;\n }\n /**\n * Calculates and returns the matrix representation of this transform\n *\n * Avoid mutating the matrix to update the transform, it is not the source of truth.\n * Update the transform pos, rotation, scale.\n */\n get matrix() {\n if (this._isDirty) {\n if (this.parent === null) {\n this._calculateMatrix().clone(this._matrix);\n }\n else {\n this.parent.matrix.multiply(this._calculateMatrix()).clone(this._matrix);\n }\n this._isDirty = false;\n }\n return this._matrix;\n }\n /**\n * Calculates and returns the inverse matrix representation of this transform\n */\n get inverse() {\n if (this._isInverseDirty) {\n this.matrix.inverse(this._inverse);\n this._isInverseDirty = false;\n }\n return this._inverse;\n }\n _calculateMatrix() {\n this._scratch.data[0] = Math.cos(this._rotation);\n this._scratch.data[1] = Math.sin(this._rotation);\n this._scratch.data[2] = -Math.sin(this._rotation);\n this._scratch.data[3] = Math.cos(this.rotation);\n this._scratch.data[4] = this._pos.x;\n this._scratch.data[5] = this._pos.y;\n this._scratch.scale(this._scale.x, this._scale.y);\n return this._scratch;\n }\n flagDirty() {\n this._isDirty = true;\n this._isInverseDirty = true;\n for (let i = 0; i < this._children.length; i++) {\n this._children[i].flagDirty();\n }\n }\n apply(point) {\n return this.matrix.multiply(point);\n }\n applyInverse(point) {\n return this.inverse.multiply(point);\n }\n setTransform(pos, rotation, scale) {\n this._pos.x = pos.x;\n this._pos.y = pos.y;\n this._rotation = (0,_util__WEBPACK_IMPORTED_MODULE_4__.canonicalizeAngle)(rotation);\n this._scale.x = scale.x;\n this._scale.y = scale.y;\n this.flagDirty();\n }\n /**\n * Returns true if the transform has a negative x scale or y scale, but not both\n */\n isMirrored() {\n const signBitX = (0,_util__WEBPACK_IMPORTED_MODULE_4__.sign)(this.scale.x) >>> 31;\n const signBitY = (0,_util__WEBPACK_IMPORTED_MODULE_4__.sign)(this.scale.y) >>> 31;\n const mirrored = signBitX ^ signBitY;\n return !!mirrored;\n }\n /**\n * Clones the current transform\n * **Warning does not clone the parent**\n * @param dest\n */\n clone(dest) {\n const target = dest !== null && dest !== void 0 ? dest : new Transform();\n this._pos.clone(target._pos);\n target._z = this._z;\n target._rotation = this._rotation;\n this._scale.clone(target._scale);\n target.flagDirty();\n return target;\n }\n /**\n * Clones but keeps the same parent reference\n */\n cloneWithParent(dest) {\n const target = dest !== null && dest !== void 0 ? dest : new Transform();\n this._pos.clone(target._pos);\n target._z = this._z;\n target._rotation = this._rotation;\n this._scale.clone(target._scale);\n target.parent = this.parent;\n target.flagDirty();\n return target;\n }\n toString() {\n return this.matrix.toString();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/util.ts\":\n/*!**********************!*\\\n !*** ./Math/util.ts ***!\n \\**********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TwoPI: () => (/* binding */ TwoPI),\n/* harmony export */ approximatelyEqual: () => (/* binding */ approximatelyEqual),\n/* harmony export */ canonicalizeAngle: () => (/* binding */ canonicalizeAngle),\n/* harmony export */ clamp: () => (/* binding */ clamp),\n/* harmony export */ frac: () => (/* binding */ frac),\n/* harmony export */ randomInRange: () => (/* binding */ randomInRange),\n/* harmony export */ randomIntInRange: () => (/* binding */ randomIntInRange),\n/* harmony export */ range: () => (/* binding */ range),\n/* harmony export */ sign: () => (/* binding */ sign),\n/* harmony export */ toDegrees: () => (/* binding */ toDegrees),\n/* harmony export */ toRadians: () => (/* binding */ toRadians)\n/* harmony export */ });\n/* harmony import */ var _Random__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Random */ \"./Math/Random.ts\");\n\n/**\n * Two PI constant\n */\nconst TwoPI = Math.PI * 2;\n/**\n * Returns the fractional part of a number\n * @param x\n */\nfunction frac(x) {\n if (x >= 0) {\n return x - Math.floor(x);\n }\n else {\n return x - Math.ceil(x);\n }\n}\n/**\n * Returns the sign of a number, if 0 returns 0\n */\nfunction sign(val) {\n if (val === 0) {\n return 0;\n }\n return val < 0 ? -1 : 1;\n}\n/**\n * Clamps a value between a min and max inclusive\n */\nfunction clamp(val, min, max) {\n return Math.min(Math.max(min, val), max);\n}\n/**\n * Approximately equals\n */\nfunction approximatelyEqual(val1, val2, tolerance) {\n // https://dev.to/alldanielscott/how-to-compare-numbers-correctly-in-javascript-1l4i\n return Math.abs(val1 - val2) < tolerance;\n}\n/**\n * Convert an angle to be the equivalent in the range [0, 2PI)\n */\nfunction canonicalizeAngle(angle) {\n let tmpAngle = angle;\n if (angle >= TwoPI) {\n while (tmpAngle >= TwoPI) {\n tmpAngle -= TwoPI;\n }\n }\n if (angle < 0) {\n while (tmpAngle < 0) {\n tmpAngle += TwoPI;\n }\n }\n return tmpAngle;\n}\n/**\n * Convert radians to degrees\n */\nfunction toDegrees(radians) {\n return (180 / Math.PI) * radians;\n}\n/**\n * Convert degrees to radians\n */\nfunction toRadians(degrees) {\n return (degrees / 180) * Math.PI;\n}\n/**\n * Generate a range of numbers\n * For example: range(0, 5) -> [0, 1, 2, 3, 4, 5]\n * @param from inclusive\n * @param to inclusive\n */\nconst range = (from, to) => Array.from(new Array(to - from + 1), (_x, i) => i + from);\n/**\n * Find a random floating point number in range\n */\nfunction randomInRange(min, max, random = new _Random__WEBPACK_IMPORTED_MODULE_0__.Random()) {\n return random ? random.floating(min, max) : min + Math.random() * (max - min);\n}\n/**\n * Find a random integer in a range\n */\nfunction randomIntInRange(min, max, random = new _Random__WEBPACK_IMPORTED_MODULE_0__.Random()) {\n return random ? random.integer(min, max) : Math.round(randomInRange(min, max));\n}\n\n\n/***/ }),\n\n/***/ \"./Math/vector-view.ts\":\n/*!*****************************!*\\\n !*** ./Math/vector-view.ts ***!\n \\*****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ VectorView: () => (/* binding */ VectorView)\n/* harmony export */ });\n/* harmony import */ var _vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vector */ \"./Math/vector.ts\");\n\nclass VectorView extends _vector__WEBPACK_IMPORTED_MODULE_0__.Vector {\n constructor(options) {\n super(0, 0);\n this._getX = options.getX;\n this._getY = options.getY;\n this._setX = options.setX;\n this._setY = options.setY;\n }\n get x() {\n return (this._x = this._getX());\n }\n set x(val) {\n this._setX(val);\n this._x = val;\n }\n get y() {\n return (this._y = this._getY());\n }\n set y(val) {\n this._setY(val);\n this._y = val;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/vector.ts\":\n/*!************************!*\\\n !*** ./Math/vector.ts ***!\n \\************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Vector: () => (/* binding */ Vector),\n/* harmony export */ vec: () => (/* binding */ vec)\n/* harmony export */ });\n/* harmony import */ var _rotation_type__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./rotation-type */ \"./Math/rotation-type.ts\");\n/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./util */ \"./Math/util.ts\");\n\n\n/**\n * A 2D vector on a plane.\n */\nclass Vector {\n /**\n * A (0, 0) vector\n */\n static get Zero() {\n return new Vector(0, 0);\n }\n /**\n * A (1, 1) vector\n */\n static get One() {\n return new Vector(1, 1);\n }\n /**\n * A (0.5, 0.5) vector\n */\n static get Half() {\n return new Vector(0.5, 0.5);\n }\n /**\n * A unit vector pointing up (0, -1)\n */\n static get Up() {\n return new Vector(0, -1);\n }\n /**\n * A unit vector pointing down (0, 1)\n */\n static get Down() {\n return new Vector(0, 1);\n }\n /**\n * A unit vector pointing left (-1, 0)\n */\n static get Left() {\n return new Vector(-1, 0);\n }\n /**\n * A unit vector pointing right (1, 0)\n */\n static get Right() {\n return new Vector(1, 0);\n }\n /**\n * Returns a vector of unit length in the direction of the specified angle in Radians.\n * @param angle The angle to generate the vector\n */\n static fromAngle(angle) {\n return new Vector(Math.cos(angle), Math.sin(angle));\n }\n /**\n * Checks if vector is not null, undefined, or if any of its components are NaN or Infinity.\n */\n static isValid(vec) {\n if (vec === null || vec === undefined) {\n return false;\n }\n if (isNaN(vec.x) || isNaN(vec.y)) {\n return false;\n }\n if (vec.x === Infinity || vec.y === Infinity || vec.x === -Infinity || vec.y === -Infinity) {\n return false;\n }\n return true;\n }\n /**\n * Calculates distance between two Vectors\n * @param vec1\n * @param vec2\n */\n static distance(vec1, vec2) {\n return Math.sqrt(Math.pow(vec1.x - vec2.x, 2) + Math.pow(vec1.y - vec2.y, 2));\n }\n static min(vec1, vec2) {\n return new Vector(Math.min(vec1.x, vec2.x), Math.min(vec1.y, vec2.y));\n }\n static max(vec1, vec2) {\n return new Vector(Math.max(vec1.x, vec2.x), Math.max(vec1.y, vec2.y));\n }\n /**\n * @param x X component of the Vector\n * @param y Y component of the Vector\n */\n constructor(x, y) {\n this._x = 0;\n this._y = 0;\n this._x = x;\n this._y = y;\n }\n /**\n * Get the x component of the vector\n */\n get x() {\n return this._x;\n }\n /**\n * Set the x component, THIS MUTATES the current vector. It is usually better to create a new vector.\n * @warning **Be very careful setting components on shared vectors, mutating shared vectors can cause hard to find bugs**\n */\n set x(val) {\n this._x = val;\n }\n /**\n * Get the y component of the vector\n */\n get y() {\n return this._y;\n }\n /**\n * Set the y component, THIS MUTATES the current vector. It is usually better to create a new vector.\n * @warning **Be very careful setting components on shared vectors, mutating shared vectors can cause hard to find bugs**\n */\n set y(val) {\n this._y = val;\n }\n /**\n * Sets the x and y components at once, THIS MUTATES the current vector. It is usually better to create a new vector.\n * @warning **Be very careful using this, mutating vectors can cause hard to find bugs**\n */\n setTo(x, y) {\n this.x = x;\n this.y = y;\n }\n /**\n * Compares this point against another and tests for equality\n * @param vector The other point to compare to\n * @param tolerance Amount of euclidean distance off we are willing to tolerate\n */\n equals(vector, tolerance = Vector.EQUALS_EPSILON) {\n return Math.abs(this.x - vector.x) <= tolerance && Math.abs(this.y - vector.y) <= tolerance;\n }\n /**\n * The distance to another vector. If no other Vector is specified, this will return the {@apilink magnitude}.\n * @param v The other vector. Leave blank to use origin vector.\n */\n distance(v) {\n if (!v) {\n return Math.sqrt(this.x * this.x + this.y * this.y);\n }\n const deltaX = this.x - v.x;\n const deltaY = this.y - v.y;\n return Math.sqrt(deltaX * deltaX + deltaY * deltaY);\n }\n squareDistance(v) {\n if (!v) {\n v = Vector.Zero;\n }\n const deltaX = this.x - v.x;\n const deltaY = this.y - v.y;\n return deltaX * deltaX + deltaY * deltaY;\n }\n /**\n * Clamps the current vector's magnitude mutating it\n * @param magnitude\n */\n clampMagnitude(magnitude) {\n const size = this.magnitude;\n const newSize = (0,_util__WEBPACK_IMPORTED_MODULE_0__.clamp)(size, 0, magnitude);\n this.magnitude = newSize;\n return this;\n }\n /**\n * The size (magnitude) of the Vector\n * @deprecated Will be removed in v1, use Vector.magnitude\n */\n get size() {\n return this.distance();\n }\n /**\n * Setting the size mutates the current vector\n * @warning Can be used to set the size of the vector, **be very careful using this, mutating vectors can cause hard to find bugs**\n * @deprecated Will be removed in v1, use Vector.magnitude\n */\n set size(newLength) {\n const v = this.normalize().scale(newLength);\n this.setTo(v.x, v.y);\n }\n /**\n * The magnitude (length) of the Vector\n */\n get magnitude() {\n return this.distance();\n }\n /**\n * Setting the size mutates the current vector\n * @warning Can be used to set the size of the vector, **be very careful using this, mutating vectors can cause hard to find bugs**\n */\n set magnitude(newMagnitude) {\n this.normalize().scale(newMagnitude, this);\n }\n /**\n * Normalizes a non-zero vector to have a magnitude of 1. Zero vectors return a new zero vector.\n */\n normalize() {\n const distance = this.distance();\n if (distance === 0) {\n return Vector.Zero;\n }\n return new Vector(this.x / distance, this.y / distance);\n }\n /**\n * Returns the average (midpoint) between the current point and the specified\n */\n average(vec) {\n return this.add(vec).scale(0.5);\n }\n scale(sizeOrScale, dest) {\n const result = dest || new Vector(0, 0);\n if (sizeOrScale instanceof Vector) {\n result.x = this.x * sizeOrScale.x;\n result.y = this.y * sizeOrScale.y;\n }\n else {\n result.x = this.x * sizeOrScale;\n result.y = this.y * sizeOrScale;\n }\n return result;\n }\n /**\n * Adds one vector to another\n * @param v The vector to add\n * @param dest Optionally copy the result into a provided vector\n */\n add(v, dest) {\n if (dest) {\n dest.x = this.x + v.x;\n dest.y = this.y + v.y;\n return dest;\n }\n return new Vector(this.x + v.x, this.y + v.y);\n }\n /**\n * Subtracts a vector from another, if you subtract vector `B.sub(A)` the resulting vector points from A -> B\n * @param v The vector to subtract\n */\n sub(v, dest) {\n const result = dest || new Vector(0, 0);\n const x = this.x - v.x;\n const y = this.y - v.y;\n result.x = x;\n result.y = y;\n return result;\n }\n /**\n * Adds one vector to this one modifying the original\n * @param v The vector to add\n * @warning Be very careful using this, mutating vectors can cause hard to find bugs\n */\n addEqual(v) {\n this.setTo(this.x + v.x, this.y + v.y);\n return this;\n }\n /**\n * Subtracts a vector from this one modifying the original\n * @param v The vector to subtract\n * @warning Be very careful using this, mutating vectors can cause hard to find bugs\n */\n subEqual(v) {\n this.setTo(this.x - v.x, this.y - v.y);\n return this;\n }\n /**\n * Scales this vector by a factor of size and modifies the original\n * @warning Be very careful using this, mutating vectors can cause hard to find bugs\n */\n scaleEqual(size) {\n this.setTo(this.x * size, this.y * size);\n return this;\n }\n /**\n * Performs a dot product with another vector\n * @param v The vector to dot\n */\n dot(v) {\n return this.x * v.x + this.y * v.y;\n }\n cross(v) {\n if (v instanceof Vector) {\n return this.x * v.y - this.y * v.x;\n }\n else if (typeof v === 'number') {\n return new Vector(v * this.y, -v * this.x);\n }\n }\n static cross(num, vec) {\n return new Vector(-num * vec.y, num * vec.x);\n }\n /**\n * Returns the perpendicular vector to this one\n */\n perpendicular() {\n return new Vector(this.y, -this.x);\n }\n /**\n * Returns the normal vector to this one, same as the perpendicular of length 1\n */\n normal() {\n return this.perpendicular().normalize();\n }\n /**\n * Negate the current vector\n */\n negate() {\n return this.scale(-1);\n }\n /**\n * Returns the angle of this vector, in range [0, 2*PI)\n */\n toAngle() {\n return (0,_util__WEBPACK_IMPORTED_MODULE_0__.canonicalizeAngle)(Math.atan2(this.y, this.x));\n }\n /**\n * Returns the difference in radians between the angle of this vector and given angle,\n * using the given rotation type.\n * @param angle in radians to which the vector has to be rotated, using {@apilink rotate}\n * @param rotationType what {@apilink RotationType} to use for the rotation\n * @returns the angle by which the vector needs to be rotated to match the given angle\n */\n angleBetween(angle, rotationType) {\n const startAngleRadians = this.toAngle();\n const endAngleRadians = (0,_util__WEBPACK_IMPORTED_MODULE_0__.canonicalizeAngle)(angle);\n let rotationClockwise = 0;\n let rotationAntiClockwise = 0;\n if (endAngleRadians > startAngleRadians) {\n rotationClockwise = endAngleRadians - startAngleRadians;\n }\n else {\n rotationClockwise = (_util__WEBPACK_IMPORTED_MODULE_0__.TwoPI - startAngleRadians + endAngleRadians) % _util__WEBPACK_IMPORTED_MODULE_0__.TwoPI;\n }\n rotationAntiClockwise = (rotationClockwise - _util__WEBPACK_IMPORTED_MODULE_0__.TwoPI) % _util__WEBPACK_IMPORTED_MODULE_0__.TwoPI;\n switch (rotationType) {\n case _rotation_type__WEBPACK_IMPORTED_MODULE_1__.RotationType.ShortestPath:\n if (Math.abs(rotationClockwise) < Math.abs(rotationAntiClockwise)) {\n return rotationClockwise;\n }\n else {\n return rotationAntiClockwise;\n }\n case _rotation_type__WEBPACK_IMPORTED_MODULE_1__.RotationType.LongestPath:\n if (Math.abs(rotationClockwise) > Math.abs(rotationAntiClockwise)) {\n return rotationClockwise;\n }\n else {\n return rotationAntiClockwise;\n }\n case _rotation_type__WEBPACK_IMPORTED_MODULE_1__.RotationType.Clockwise:\n return rotationClockwise;\n case _rotation_type__WEBPACK_IMPORTED_MODULE_1__.RotationType.CounterClockwise:\n return rotationAntiClockwise;\n }\n }\n /**\n * Rotates the current vector around a point by a certain angle in radians.\n * Positive angle means rotation clockwise.\n */\n rotate(angle, anchor, dest) {\n const result = dest || new Vector(0, 0);\n if (!anchor) {\n anchor = new Vector(0, 0);\n }\n const sinAngle = Math.sin(angle);\n const cosAngle = Math.cos(angle);\n const x = cosAngle * (this.x - anchor.x) - sinAngle * (this.y - anchor.y) + anchor.x;\n const y = sinAngle * (this.x - anchor.x) + cosAngle * (this.y - anchor.y) + anchor.y;\n result.x = x;\n result.y = y;\n return result;\n }\n /**\n * Creates new vector that has the same values as the previous.\n */\n clone(dest) {\n const v = dest !== null && dest !== void 0 ? dest : new Vector(0, 0);\n v.x = this.x;\n v.y = this.y;\n return v;\n }\n /**\n * Returns a string representation of the vector.\n */\n toString(fixed) {\n if (fixed) {\n return `(${this.x.toFixed(fixed)}, ${this.y.toFixed(fixed)})`;\n }\n return `(${this.x}, ${this.y})`;\n }\n}\n/**\n * Get or set the vector equals epsilon, by default 0.001 meaning vectors within that tolerance on x or y will be considered equal.\n */\nVector.EQUALS_EPSILON = 0.001;\n/**\n * Shorthand for creating new Vectors - returns a new Vector instance with the\n * provided X and Y components.\n * @param x X component of the Vector\n * @param y Y component of the Vector\n */\nfunction vec(x, y) {\n return new Vector(x, y);\n}\n\n\n/***/ }),\n\n/***/ \"./Math/watch-vector.ts\":\n/*!******************************!*\\\n !*** ./Math/watch-vector.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ WatchVector: () => (/* binding */ WatchVector)\n/* harmony export */ });\n/* harmony import */ var _vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vector */ \"./Math/vector.ts\");\n\n/**\n * Wraps a vector and watches for changes in the x/y, modifies the original vector.\n */\nclass WatchVector extends _vector__WEBPACK_IMPORTED_MODULE_0__.Vector {\n constructor(original, change) {\n super(original.x, original.y);\n this.original = original;\n this.change = change;\n }\n get x() {\n return (this._x = this.original.x);\n }\n set x(newX) {\n if (newX !== this._x) {\n this.change(newX, this._y);\n this._x = this.original.x = newX;\n }\n }\n get y() {\n return (this._y = this.original.y);\n }\n set y(newY) {\n if (newY !== this._y) {\n this.change(this._x, newY);\n this._y = this.original.y = newY;\n }\n }\n setTo(x, y) {\n this.x = x;\n this.y = y;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Particles/EmitterType.ts\":\n/*!**********************************!*\\\n !*** ./Particles/EmitterType.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EmitterType: () => (/* binding */ EmitterType)\n/* harmony export */ });\n/**\n * An enum that represents the types of emitter nozzles\n */\nvar EmitterType;\n(function (EmitterType) {\n /**\n * Constant for the circular emitter type\n */\n EmitterType[\"Circle\"] = \"circle\";\n /**\n * Constant for the rectangular emitter type\n */\n EmitterType[\"Rectangle\"] = \"rectangle\";\n})(EmitterType || (EmitterType = {}));\n\n\n/***/ }),\n\n/***/ \"./Particles/GpuParticleEmitter.ts\":\n/*!*****************************************!*\\\n !*** ./Particles/GpuParticleEmitter.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ GpuParticleEmitter: () => (/* binding */ GpuParticleEmitter)\n/* harmony export */ });\n/* harmony import */ var _Actor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Actor */ \"./Actor.ts\");\n/* harmony import */ var _EmitterType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./EmitterType */ \"./Particles/EmitterType.ts\");\n/* harmony import */ var _Particles__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Particles */ \"./Particles/Particles.ts\");\n/* harmony import */ var _GpuParticleRenderer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./GpuParticleRenderer */ \"./Particles/GpuParticleRenderer.ts\");\n/* harmony import */ var _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Graphics/GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Math_Random__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Math/Random */ \"./Math/Random.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Math */ \"./Math/util.ts\");\n\n\n\n\n\n\n\n\nclass GpuParticleEmitter extends _Actor__WEBPACK_IMPORTED_MODULE_0__.Actor {\n get pos() {\n return this.transform.pos;\n }\n set pos(pos) {\n this.transform.pos = pos;\n }\n get z() {\n return this.transform.z;\n }\n set z(z) {\n this.transform.z = z;\n }\n constructor(config) {\n super({ name: `GpuParticleEmitter`, width: config.width, height: config.height }); // somewhat goofy way of doing width/height\n this.particle = {\n /**\n * Gets or sets the life of each particle in milliseconds\n */\n life: 2000,\n transform: _Particles__WEBPACK_IMPORTED_MODULE_1__.ParticleTransform.Global,\n graphic: undefined,\n opacity: 1,\n angularVelocity: 0,\n focus: undefined,\n focusAccel: undefined,\n randomRotation: false\n };\n this.graphics = new _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_2__.GraphicsComponent();\n this.isEmitting = false;\n this.emitRate = 1;\n this.emitterType = _EmitterType__WEBPACK_IMPORTED_MODULE_3__.EmitterType.Rectangle;\n this.radius = 0;\n this.maxParticles = 2000;\n this._particlesToEmit = 0;\n this.addComponent(this.graphics, true);\n this.graphics.onPostDraw = this.draw.bind(this);\n const { particle, maxParticles, x, y, z, pos, isEmitting, emitRate, emitterType, radius, random } = { ...config };\n this.maxParticles = (0,_Math__WEBPACK_IMPORTED_MODULE_4__.clamp)(maxParticles !== null && maxParticles !== void 0 ? maxParticles : this.maxParticles, 0, _GpuParticleRenderer__WEBPACK_IMPORTED_MODULE_5__.GpuParticleRenderer.GPU_MAX_PARTICLES);\n this.pos = pos !== null && pos !== void 0 ? pos : (0,_Math_vector__WEBPACK_IMPORTED_MODULE_6__.vec)(x !== null && x !== void 0 ? x : 0, y !== null && y !== void 0 ? y : 0);\n this.z = z !== null && z !== void 0 ? z : 0;\n this.isEmitting = isEmitting !== null && isEmitting !== void 0 ? isEmitting : this.isEmitting;\n this.emitRate = emitRate !== null && emitRate !== void 0 ? emitRate : this.emitRate;\n this.emitterType = emitterType !== null && emitterType !== void 0 ? emitterType : this.emitterType;\n this.radius = radius !== null && radius !== void 0 ? radius : this.radius;\n this.particle = { ...this.particle, ...particle };\n this.random = random !== null && random !== void 0 ? random : new _Math_Random__WEBPACK_IMPORTED_MODULE_7__.Random();\n this.renderer = new _GpuParticleRenderer__WEBPACK_IMPORTED_MODULE_5__.GpuParticleRenderer(this, this.random, this.particle);\n }\n _initialize(engine) {\n super._initialize(engine);\n const context = engine.graphicsContext;\n this.renderer.initialize(context.__gl, context);\n }\n update(engine, elapsed) {\n super.update(engine, elapsed);\n if (this.isEmitting) {\n this._particlesToEmit += this.emitRate * (elapsed / 1000);\n if (this._particlesToEmit > 1.0) {\n this.emitParticles(Math.floor(this._particlesToEmit));\n this._particlesToEmit = this._particlesToEmit - Math.floor(this._particlesToEmit);\n }\n }\n this.renderer.update(elapsed);\n }\n emitParticles(particleCount) {\n if (particleCount <= 0) {\n return;\n }\n this.renderer.emitParticles(particleCount | 0); // coerce to integer\n }\n clearParticles() {\n this.renderer.clearParticles();\n }\n draw(ctx, elapsed) {\n ctx.draw('ex.particle', this.renderer, elapsed);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Particles/GpuParticleRenderer.ts\":\n/*!******************************************!*\\\n !*** ./Particles/GpuParticleRenderer.ts ***!\n \\******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ GpuParticleRenderer: () => (/* binding */ GpuParticleRenderer)\n/* harmony export */ });\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Particles__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Particles */ \"./Particles/Particles.ts\");\n/* harmony import */ var _EmitterType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./EmitterType */ \"./Particles/EmitterType.ts\");\n/* harmony import */ var _Util_Assert__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Util/Assert */ \"./Util/Assert.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n\n\n\n\n\n/**\n * Container for the GPU Particle State contains the internal state needed for the GPU\n * to render particles and maintain state.\n */\nclass GpuParticleRenderer {\n constructor(emitter, random, options) {\n var _a;\n this.emitRate = 1;\n this._initialized = false;\n this._vaos = [];\n this._buffers = [];\n this._drawIndex = 0;\n this._numInputFloats = 2 + 2 + 1 + 1 + 1;\n this._particleIndex = 0;\n this._uploadIndex = 0;\n this._wrappedLife = 0;\n this._wrappedParticles = 0;\n this._particleLife = 0;\n this._clearRequested = false;\n this._emitted = [];\n this.emitter = emitter;\n this.particle = options;\n this._particleData = new Float32Array(this.emitter.maxParticles * this._numInputFloats);\n this._random = random;\n this._particleLife = (_a = this.particle.life) !== null && _a !== void 0 ? _a : 2000;\n }\n get isInitialized() {\n return this._initialized;\n }\n get maxParticles() {\n return this.emitter.maxParticles;\n }\n initialize(gl, context) {\n if (this._initialized) {\n return;\n }\n const numParticles = this.emitter.maxParticles;\n const numInputFloats = this._numInputFloats;\n const particleData = this._particleData;\n const bytesPerFloat = 4;\n const particleDataBuffer1 = gl.createBuffer();\n const vao1 = gl.createVertexArray();\n gl.bindVertexArray(vao1);\n gl.bindBuffer(gl.ARRAY_BUFFER, particleDataBuffer1);\n gl.bufferData(gl.ARRAY_BUFFER, numParticles * numInputFloats * bytesPerFloat, gl.DYNAMIC_DRAW);\n gl.bufferSubData(gl.ARRAY_BUFFER, 0, particleData);\n let offset = 0;\n // position\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, numInputFloats * bytesPerFloat, 0);\n offset += bytesPerFloat * 2;\n // velocity\n gl.vertexAttribPointer(1, 2, gl.FLOAT, false, numInputFloats * bytesPerFloat, offset);\n offset += bytesPerFloat * 2;\n // rotation\n gl.vertexAttribPointer(2, 1, gl.FLOAT, false, numInputFloats * bytesPerFloat, offset);\n offset += bytesPerFloat * 1;\n // angularVelocity\n gl.vertexAttribPointer(3, 1, gl.FLOAT, false, numInputFloats * bytesPerFloat, offset);\n offset += bytesPerFloat * 1;\n // life\n gl.vertexAttribPointer(4, 1, gl.FLOAT, false, numInputFloats * bytesPerFloat, offset);\n offset += bytesPerFloat * 1;\n // enable attributes\n gl.enableVertexAttribArray(0);\n gl.enableVertexAttribArray(1);\n gl.enableVertexAttribArray(2);\n gl.enableVertexAttribArray(3);\n gl.enableVertexAttribArray(4);\n this._vaos.push(vao1);\n this._buffers.push(particleDataBuffer1);\n // Clean up\n gl.bindVertexArray(null);\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n const particleDataBuffer2 = gl.createBuffer();\n const vao2 = gl.createVertexArray();\n gl.bindVertexArray(vao2);\n gl.bindBuffer(gl.ARRAY_BUFFER, particleDataBuffer2);\n gl.bufferData(gl.ARRAY_BUFFER, numParticles * numInputFloats * bytesPerFloat, gl.DYNAMIC_DRAW);\n offset = 0;\n // position\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, numInputFloats * bytesPerFloat, 0);\n offset += bytesPerFloat * 2;\n // velocity\n gl.vertexAttribPointer(1, 2, gl.FLOAT, false, numInputFloats * bytesPerFloat, offset);\n offset += bytesPerFloat * 2;\n // rotation\n gl.vertexAttribPointer(2, 1, gl.FLOAT, false, numInputFloats * bytesPerFloat, offset);\n offset += bytesPerFloat * 1;\n // angularVelocity\n gl.vertexAttribPointer(3, 1, gl.FLOAT, false, numInputFloats * bytesPerFloat, offset);\n offset += bytesPerFloat * 1;\n // life\n gl.vertexAttribPointer(4, 1, gl.FLOAT, false, numInputFloats * bytesPerFloat, offset);\n offset += bytesPerFloat * 1;\n // enable attributes\n gl.enableVertexAttribArray(0);\n gl.enableVertexAttribArray(1);\n gl.enableVertexAttribArray(2);\n gl.enableVertexAttribArray(3);\n gl.enableVertexAttribArray(4);\n this._vaos.push(vao2);\n this._buffers.push(particleDataBuffer2);\n // Clean up\n gl.bindVertexArray(null);\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n this._currentVao = this._vaos[this._drawIndex % 2];\n this._currentBuffer = this._buffers[(this._drawIndex + 1) % 2];\n this._initialized = true;\n }\n clearParticles() {\n this._particleData.fill(0);\n this._clearRequested = true;\n }\n emitParticles(particleCount) {\n const startIndex = this._particleIndex;\n const maxSize = this.maxParticles * this._numInputFloats;\n const endIndex = particleCount * this._numInputFloats + startIndex;\n let countParticle = 0;\n for (let i = startIndex; i < endIndex; i += this._numInputFloats) {\n const angle = this._random.floating(this.particle.minAngle || 0, this.particle.maxAngle || _Math_util__WEBPACK_IMPORTED_MODULE_0__.TwoPI);\n const speedX = this._random.floating(this.particle.minSpeed || 0, this.particle.maxSpeed || 0);\n const speedY = this._random.floating(this.particle.minSpeed || 0, this.particle.maxSpeed || 0);\n const dx = speedX * Math.cos(angle);\n const dy = speedY * Math.sin(angle);\n let ranX = 0;\n let ranY = 0;\n if (this.emitter.emitterType === _EmitterType__WEBPACK_IMPORTED_MODULE_1__.EmitterType.Rectangle) {\n ranX = this._random.floating(-0.5, 0.5) * this.emitter.width;\n ranY = this._random.floating(-0.5, 0.5) * this.emitter.height;\n }\n else {\n const radius = this._random.floating(0, this.emitter.radius);\n ranX = radius * Math.cos(angle);\n ranY = radius * Math.sin(angle);\n }\n const tx = this.emitter.transform.apply((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(ranX, ranY));\n const data = [\n this.particle.transform === _Particles__WEBPACK_IMPORTED_MODULE_3__.ParticleTransform.Local ? ranX : tx.x,\n this.particle.transform === _Particles__WEBPACK_IMPORTED_MODULE_3__.ParticleTransform.Local ? ranY : tx.y, // pos in world space\n dx,\n dy, // velocity\n this.particle.randomRotation ? (0,_Math_util__WEBPACK_IMPORTED_MODULE_0__.randomInRange)(0, _Math_util__WEBPACK_IMPORTED_MODULE_0__.TwoPI, this._random) : this.particle.rotation || 0, // rotation\n this.particle.angularVelocity || 0, // angular velocity\n this._particleLife // life\n ];\n countParticle++;\n this._particleData.set(data, i % this._particleData.length);\n }\n if (endIndex >= maxSize) {\n this._wrappedParticles += (endIndex - maxSize) / this._numInputFloats;\n this._wrappedLife = this._particleLife;\n }\n else if (this._wrappedLife > 0) {\n this._wrappedParticles += particleCount;\n }\n this._particleIndex = endIndex % maxSize;\n this._emitted.push([this._particleLife, startIndex]);\n }\n _uploadEmitted(gl) {\n // upload index is the index of the previous upload\n // particle index is the current index of modification\n if (this._particleIndex !== this._uploadIndex) {\n // Bind one buffer to ARRAY_BUFFER and the other to TFB\n gl.bindBuffer(gl.ARRAY_BUFFER, this._buffers[(this._drawIndex + 1) % 2]);\n if (this._particleIndex >= this._uploadIndex) {\n gl.bufferSubData(gl.ARRAY_BUFFER, this._uploadIndex * 4, // dst byte offset 4 bytes per float\n this._particleData, this._uploadIndex, this._particleIndex - this._uploadIndex);\n }\n else {\n // upload before the wrap\n // prettier-ignore\n gl.bufferSubData(gl.ARRAY_BUFFER, this._uploadIndex * 4, this._particleData, this._uploadIndex, this._particleData.length - this._uploadIndex);\n // upload after the wrap if there are any\n if (this._wrappedParticles) {\n // prettier-ignore\n gl.bufferSubData(gl.ARRAY_BUFFER, 0, this._particleData, 0, this._wrappedParticles * this._numInputFloats);\n }\n this._wrappedLife = this._particleLife;\n }\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n }\n this._uploadIndex = this._particleIndex % (this.maxParticles * this._numInputFloats);\n }\n update(elapsed) {\n var _a;\n this._particleLife = (_a = this.particle.life) !== null && _a !== void 0 ? _a : this._particleLife;\n if (this._wrappedLife > 0) {\n this._wrappedLife -= elapsed;\n }\n else {\n this._wrappedLife = 0;\n this._wrappedParticles = 0;\n }\n if (!this._emitted.length) {\n return;\n }\n for (let i = this._emitted.length - 1; i >= 0; i--) {\n const particle = this._emitted[i];\n particle[0] -= elapsed;\n const life = particle[0];\n if (life <= 0) {\n this._emitted.splice(i, 1);\n }\n }\n this._emitted.sort((a, b) => a[0] - b[0]);\n }\n draw(gl) {\n if (this._initialized) {\n // Emit\n if (this._clearRequested) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this._buffers[(this._drawIndex + 1) % 2]);\n gl.bufferSubData(gl.ARRAY_BUFFER, 0, this._particleData);\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n this._clearRequested = false;\n }\n else {\n this._uploadEmitted(gl);\n }\n // Bind one buffer to ARRAY_BUFFER and the other to transform feedback buffer\n gl.bindVertexArray(this._currentVao);\n gl.bindBufferBase(gl.TRANSFORM_FEEDBACK_BUFFER, 0, this._currentBuffer);\n // Perform transform feedback (run the simulation) and the draw call all at once\n if (this._wrappedLife && this._emitted[0] && this._emitted[0][1] > 0) {\n const midpoint = this._emitted[0][1] / this._numInputFloats;\n // draw oldest first (maybe make configurable)\n (0,_Util_Assert__WEBPACK_IMPORTED_MODULE_4__.assert)(`midpoint greater than 0, actual: ${midpoint}`, () => midpoint > 0);\n (0,_Util_Assert__WEBPACK_IMPORTED_MODULE_4__.assert)(`midpoint is less than max, actual: ${midpoint}`, () => midpoint < this.maxParticles);\n gl.bindBufferRange(gl.TRANSFORM_FEEDBACK_BUFFER, 0, this._currentBuffer, this._emitted[0][1] * 4, (this.maxParticles - midpoint) * this._numInputFloats * 4);\n gl.beginTransformFeedback(gl.POINTS);\n gl.drawArrays(gl.POINTS, midpoint, this.maxParticles - midpoint);\n gl.endTransformFeedback();\n // then draw newer particles\n gl.bindBufferRange(gl.TRANSFORM_FEEDBACK_BUFFER, 0, this._currentBuffer, 0, this._emitted[0][1] * 4);\n gl.beginTransformFeedback(gl.POINTS);\n gl.drawArrays(gl.POINTS, 0, midpoint);\n gl.endTransformFeedback();\n }\n else {\n gl.bindBufferRange(gl.TRANSFORM_FEEDBACK_BUFFER, 0, this._currentBuffer, 0, this._particleData.length * 4);\n gl.beginTransformFeedback(gl.POINTS);\n gl.drawArrays(gl.POINTS, 0, this.maxParticles);\n gl.endTransformFeedback();\n }\n // Clean up after ourselves to avoid errors.\n gl.bindVertexArray(null);\n gl.bindBufferBase(gl.TRANSFORM_FEEDBACK_BUFFER, 0, null);\n // flip flop buffers, one will be draw the other simulation\n this._currentVao = this._vaos[this._drawIndex % 2];\n this._currentBuffer = this._buffers[(this._drawIndex + 1) % 2];\n this._drawIndex = (this._drawIndex + 1) % 2;\n }\n }\n}\nGpuParticleRenderer.GPU_MAX_PARTICLES = 100000;\n\n\n/***/ }),\n\n/***/ \"./Particles/ParticleEmitter.ts\":\n/*!**************************************!*\\\n !*** ./Particles/ParticleEmitter.ts ***!\n \\**************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ParticleEmitter: () => (/* binding */ ParticleEmitter)\n/* harmony export */ });\n/* harmony import */ var _Actor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Actor */ \"./Actor.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math_Random__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Math/Random */ \"./Math/Random.ts\");\n/* harmony import */ var _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Collision/CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _EmitterType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./EmitterType */ \"./Particles/EmitterType.ts\");\n/* harmony import */ var _Particles__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Particles */ \"./Particles/Particles.ts\");\n/* harmony import */ var _Util_RentalPool__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/RentalPool */ \"./Util/RentalPool.ts\");\n\n\n\n\n\n\n\n\n/**\n * Using a particle emitter is a great way to create interesting effects\n * in your game, like smoke, fire, water, explosions, etc. `ParticleEmitter`\n * extend {@apilink Actor} allowing you to use all of the features that come with.\n *\n * These particles are simulated on the CPU in JavaScript\n */\nclass ParticleEmitter extends _Actor__WEBPACK_IMPORTED_MODULE_0__.Actor {\n /**\n * @param config particle emitter options bag\n */\n constructor(config) {\n var _a, _b;\n super({ width: (_a = config.width) !== null && _a !== void 0 ? _a : 0, height: (_b = config.height) !== null && _b !== void 0 ? _b : 0 });\n this._particlesToEmit = 0;\n this._particlePool = new _Util_RentalPool__WEBPACK_IMPORTED_MODULE_1__.RentalPool(() => new _Particles__WEBPACK_IMPORTED_MODULE_2__.Particle({}), (p) => p, 500);\n this.numParticles = 0;\n /**\n * Gets or sets the isEmitting flag\n */\n this.isEmitting = true;\n /**\n * Gets or sets the backing deadParticle collection\n */\n this.deadParticles = [];\n /**\n * Gets or sets the emission rate for particles (particles/sec)\n */\n this.emitRate = 1; //particles/sec\n /**\n * Gets or sets the emitter type for the particle emitter\n */\n this.emitterType = _EmitterType__WEBPACK_IMPORTED_MODULE_3__.EmitterType.Rectangle;\n /**\n * Gets or sets the emitter radius, only takes effect when the {@apilink emitterType} is {@apilink EmitterType.Circle}\n */\n this.radius = 0;\n this.particle = {\n /**\n * Gets or sets the life of each particle in milliseconds\n */\n life: 2000,\n transform: _Particles__WEBPACK_IMPORTED_MODULE_2__.ParticleTransform.Global,\n graphic: undefined,\n opacity: 1,\n angularVelocity: 0,\n focus: undefined,\n focusAccel: undefined,\n randomRotation: false\n };\n this._activeParticles = [];\n const { particle, x, y, z, pos, isEmitting, emitRate, emitterType, radius, random } = { ...config };\n this.particle = { ...this.particle, ...particle };\n this.pos = pos !== null && pos !== void 0 ? pos : (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(x !== null && x !== void 0 ? x : 0, y !== null && y !== void 0 ? y : 0);\n this.z = z !== null && z !== void 0 ? z : 0;\n this.isEmitting = isEmitting !== null && isEmitting !== void 0 ? isEmitting : this.isEmitting;\n this.emitRate = emitRate !== null && emitRate !== void 0 ? emitRate : this.emitRate;\n this.emitterType = emitterType !== null && emitterType !== void 0 ? emitterType : this.emitterType;\n this.radius = radius !== null && radius !== void 0 ? radius : this.radius;\n this.body.collisionType = _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_5__.CollisionType.PreventCollision;\n this.random = random !== null && random !== void 0 ? random : new _Math_Random__WEBPACK_IMPORTED_MODULE_6__.Random();\n }\n removeParticle(particle) {\n this.deadParticles.push(particle);\n }\n /**\n * Causes the emitter to emit particles\n * @param particleCount Number of particles to emit right now\n */\n emitParticles(particleCount) {\n var _a;\n if (particleCount <= 0) {\n return;\n }\n particleCount = particleCount | 0; // coerce to int\n for (let i = 0; i < particleCount; i++) {\n const p = this._createParticle();\n if ((_a = this === null || this === void 0 ? void 0 : this.scene) === null || _a === void 0 ? void 0 : _a.world) {\n if (this.particle.transform === _Particles__WEBPACK_IMPORTED_MODULE_2__.ParticleTransform.Global) {\n this.scene.world.add(p);\n }\n else {\n this.addChild(p);\n }\n }\n this._activeParticles.push(p);\n }\n }\n clearParticles() {\n for (let i = 0; i < this._activeParticles.length; i++) {\n this.removeParticle(this._activeParticles[i]);\n }\n }\n // Creates a new particle given the constraints of the emitter\n _createParticle() {\n let ranX = 0;\n let ranY = 0;\n const angle = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.randomInRange)(this.particle.minAngle || 0, this.particle.maxAngle || Math.PI * 2, this.random);\n const vel = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.randomInRange)(this.particle.minSpeed || 0, this.particle.maxSpeed || 0, this.random);\n const size = this.particle.startSize || (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.randomInRange)(this.particle.minSize || 5, this.particle.maxSize || 5, this.random);\n const dx = vel * Math.cos(angle);\n const dy = vel * Math.sin(angle);\n if (this.emitterType === _EmitterType__WEBPACK_IMPORTED_MODULE_3__.EmitterType.Rectangle) {\n ranX = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.randomInRange)(0, this.width, this.random);\n ranY = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.randomInRange)(0, this.height, this.random);\n }\n else if (this.emitterType === _EmitterType__WEBPACK_IMPORTED_MODULE_3__.EmitterType.Circle) {\n const radius = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.randomInRange)(0, this.radius, this.random);\n ranX = radius * Math.cos(angle);\n ranY = radius * Math.sin(angle);\n }\n const p = this._particlePool.rent();\n p.configure({\n life: this.particle.life,\n opacity: this.particle.opacity,\n beginColor: this.particle.beginColor,\n endColor: this.particle.endColor,\n pos: (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(ranX, ranY),\n vel: (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(dx, dy),\n acc: this.particle.acc,\n angularVelocity: this.particle.angularVelocity,\n startSize: this.particle.startSize,\n endSize: this.particle.endSize,\n size: size,\n graphic: this.particle.graphic,\n fade: this.particle.fade\n });\n p.registerEmitter(this);\n if (this.particle.randomRotation) {\n p.transform.rotation = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.randomInRange)(0, Math.PI * 2, this.random);\n }\n if (this.particle.focus) {\n p.focus = this.particle.focus.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(this.pos.x, this.pos.y));\n p.focusAccel = this.particle.focusAccel;\n }\n return p;\n }\n update(engine, elapsed) {\n var _a;\n super.update(engine, elapsed);\n if (this.isEmitting) {\n this._particlesToEmit += this.emitRate * (elapsed / 1000);\n if (this._particlesToEmit > 1.0) {\n this.emitParticles(Math.floor(this._particlesToEmit));\n this._particlesToEmit = this._particlesToEmit - Math.floor(this._particlesToEmit);\n }\n }\n // deferred removal\n for (let i = 0; i < this.deadParticles.length; i++) {\n if ((_a = this === null || this === void 0 ? void 0 : this.scene) === null || _a === void 0 ? void 0 : _a.world) {\n this.scene.world.remove(this.deadParticles[i], false);\n this._particlePool.return(this.deadParticles[i]);\n }\n const index = this._activeParticles.indexOf(this.deadParticles[i]);\n if (index > -1) {\n this._activeParticles.splice(index, 1);\n }\n }\n this.deadParticles.length = 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Particles/Particles.ts\":\n/*!********************************!*\\\n !*** ./Particles/Particles.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Particle: () => (/* binding */ Particle),\n/* harmony export */ ParticleTransform: () => (/* binding */ ParticleTransform)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Graphics/GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _Collision_Integrator__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Collision/Integrator */ \"./Collision/Integrator.ts\");\n\n\n\n\n\n\n\n\n\n/**\n/**\n * CPU Particle is used in a {@apilink ParticleEmitter}\n */\nclass Particle extends _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__.Entity {\n constructor(options) {\n super({ silenceWarnings: true });\n this.beginColor = _Color__WEBPACK_IMPORTED_MODULE_1__.Color.White;\n this.endColor = _Color__WEBPACK_IMPORTED_MODULE_1__.Color.White;\n // Life is counted in ms\n this.life = 300;\n this.fade = false;\n // Color transitions\n this._rRate = 1;\n this._gRate = 1;\n this._bRate = 1;\n this._aRate = 0;\n this._currentColor = _Color__WEBPACK_IMPORTED_MODULE_1__.Color.White;\n this.size = 5;\n this.sizeRate = 0;\n this.visible = true;\n this.isOffscreen = false;\n this.particleTransform = ParticleTransform.Global;\n this.name = `Particle#${this.id}`;\n this.addComponent((this.transform = new _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent()));\n this.addComponent((this.motion = new _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_3__.MotionComponent()));\n this.addComponent((this.graphics = new _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_4__.GraphicsComponent()));\n this.configure(options);\n }\n registerEmitter(emitter) {\n this._emitter = emitter;\n if (this.particleTransform === ParticleTransform.Global) {\n const globalPos = this._emitter.transform.globalPos;\n this.transform.pos = this.transform.pos.add(globalPos);\n this.motion.vel = this.motion.vel.rotate(this._emitter.transform.globalRotation);\n }\n }\n configure(options) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;\n this.particleTransform = (_a = options.transform) !== null && _a !== void 0 ? _a : this.particleTransform;\n this.life = (_b = options.life) !== null && _b !== void 0 ? _b : this.life;\n this.fade = (_c = options.fade) !== null && _c !== void 0 ? _c : this.fade;\n this.size = (_d = options.size) !== null && _d !== void 0 ? _d : this.size;\n this.endColor = (_e = options.endColor) !== null && _e !== void 0 ? _e : this.endColor.clone();\n this.beginColor = (_f = options.beginColor) !== null && _f !== void 0 ? _f : this.beginColor.clone();\n this._currentColor = this.beginColor.clone();\n this.graphic = options.graphic;\n this.graphics.opacity = (_g = options.opacity) !== null && _g !== void 0 ? _g : this.graphics.opacity;\n this.transform.pos = (_h = options.pos) !== null && _h !== void 0 ? _h : this.transform.pos;\n this.transform.rotation = (_j = options.rotation) !== null && _j !== void 0 ? _j : 0;\n this.transform.scale = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_5__.vec)(1, 1);\n this.motion.vel = (_k = options.vel) !== null && _k !== void 0 ? _k : this.motion.vel;\n this.motion.angularVelocity = (_l = options.angularVelocity) !== null && _l !== void 0 ? _l : 0;\n this.motion.acc = (_m = options.acc) !== null && _m !== void 0 ? _m : this.motion.acc;\n this._rRate = (this.endColor.r - this.beginColor.r) / this.life;\n this._gRate = (this.endColor.g - this.beginColor.g) / this.life;\n this._bRate = (this.endColor.b - this.beginColor.b) / this.life;\n this._aRate = this.graphics.opacity / this.life;\n this.startSize = (_o = options.startSize) !== null && _o !== void 0 ? _o : 0;\n this.endSize = (_p = options.endSize) !== null && _p !== void 0 ? _p : 0;\n if (this.endSize > 0 && this.startSize > 0) {\n this.sizeRate = (this.endSize - this.startSize) / this.life;\n this.size = this.startSize;\n }\n if (this.graphic) {\n this.graphics.use(this.graphic);\n this.graphics.onPostDraw = undefined;\n }\n else {\n this.graphics.localBounds = _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox.fromDimension(this.size, this.size, _Math_vector__WEBPACK_IMPORTED_MODULE_5__.Vector.Half);\n this.graphics.onPostDraw = (ctx) => {\n ctx.save();\n ctx.debug.drawPoint((0,_Math_vector__WEBPACK_IMPORTED_MODULE_5__.vec)(0, 0), { color: this._currentColor, size: this.size });\n ctx.restore();\n };\n }\n }\n kill() {\n var _a;\n if ((_a = this._emitter) === null || _a === void 0 ? void 0 : _a.isActive) {\n this._emitter.removeParticle(this);\n }\n else {\n super.kill();\n }\n }\n update(engine, elapsed) {\n this.life = this.life - elapsed;\n if (this.life < 0) {\n this.kill();\n }\n if (this.fade) {\n this.graphics.opacity = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.clamp)(this._aRate * this.life, 0.0001, 1);\n }\n if (this.startSize && this.endSize && this.startSize > 0 && this.endSize > 0) {\n this.size = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.clamp)(this.sizeRate * elapsed + this.size, Math.min(this.startSize, this.endSize), Math.max(this.startSize, this.endSize));\n }\n this._currentColor.r = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.clamp)(this._currentColor.r + this._rRate * elapsed, 0, 255);\n this._currentColor.g = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.clamp)(this._currentColor.g + this._gRate * elapsed, 0, 255);\n this._currentColor.b = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.clamp)(this._currentColor.b + this._bRate * elapsed, 0, 255);\n this._currentColor.a = this.graphics.opacity;\n let accel = this.motion.acc;\n if (this.focus) {\n accel = this.focus\n .sub(this.transform.pos)\n .normalize()\n .scale(this.focusAccel || 0)\n .scale(elapsed / 1000);\n }\n // Update transform and motion based on Euler linear algebra\n _Collision_Integrator__WEBPACK_IMPORTED_MODULE_8__.EulerIntegrator.integrate(this.transform, this.motion, accel, elapsed);\n }\n}\nParticle.DefaultConfig = {\n beginColor: _Color__WEBPACK_IMPORTED_MODULE_1__.Color.White,\n endColor: _Color__WEBPACK_IMPORTED_MODULE_1__.Color.White,\n life: 300,\n fade: false,\n size: 5,\n graphic: undefined,\n startSize: undefined,\n endSize: undefined\n};\nvar ParticleTransform;\n(function (ParticleTransform) {\n /**\n * {@apilink ParticleTransform.Global} is the default and emits particles as if\n * they were world space objects, useful for most effects.\n */\n ParticleTransform[\"Global\"] = \"global\";\n /**\n * {@apilink ParticleTransform.Local} particles are children of the emitter and move relative to the emitter\n * as they would in a parent/child actor relationship.\n */\n ParticleTransform[\"Local\"] = \"local\";\n})(ParticleTransform || (ParticleTransform = {}));\n\n\n/***/ }),\n\n/***/ \"./Particles/index.ts\":\n/*!****************************!*\\\n !*** ./Particles/index.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EmitterType: () => (/* reexport safe */ _EmitterType__WEBPACK_IMPORTED_MODULE_0__.EmitterType),\n/* harmony export */ GpuParticleEmitter: () => (/* reexport safe */ _GpuParticleEmitter__WEBPACK_IMPORTED_MODULE_3__.GpuParticleEmitter),\n/* harmony export */ GpuParticleRenderer: () => (/* reexport safe */ _GpuParticleRenderer__WEBPACK_IMPORTED_MODULE_4__.GpuParticleRenderer),\n/* harmony export */ Particle: () => (/* reexport safe */ _Particles__WEBPACK_IMPORTED_MODULE_1__.Particle),\n/* harmony export */ ParticleEmitter: () => (/* reexport safe */ _ParticleEmitter__WEBPACK_IMPORTED_MODULE_2__.ParticleEmitter),\n/* harmony export */ ParticleTransform: () => (/* reexport safe */ _Particles__WEBPACK_IMPORTED_MODULE_1__.ParticleTransform)\n/* harmony export */ });\n/* harmony import */ var _EmitterType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./EmitterType */ \"./Particles/EmitterType.ts\");\n/* harmony import */ var _Particles__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Particles */ \"./Particles/Particles.ts\");\n/* harmony import */ var _ParticleEmitter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ParticleEmitter */ \"./Particles/ParticleEmitter.ts\");\n/* harmony import */ var _GpuParticleEmitter__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./GpuParticleEmitter */ \"./Particles/GpuParticleEmitter.ts\");\n/* harmony import */ var _GpuParticleRenderer__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./GpuParticleRenderer */ \"./Particles/GpuParticleRenderer.ts\");\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Polyfill.ts\":\n/*!*********************!*\\\n !*** ./Polyfill.ts ***!\n \\*********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ polyfill: () => (/* binding */ polyfill)\n/* harmony export */ });\n/**\n * Polyfill adding function\n */\nfunction polyfill() {\n /* istanbul ignore next */\n if (typeof window === 'undefined') {\n window = {\n audioContext: function () {\n return;\n }\n };\n }\n /* istanbul ignore next */\n if (typeof window !== 'undefined' && !window.requestAnimationFrame) {\n window.requestAnimationFrame =\n window.webkitRequestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n function (callback) {\n window.setInterval(callback, 1000 / 60);\n };\n }\n /* istanbul ignore next */\n if (typeof window !== 'undefined' && !window.cancelAnimationFrame) {\n window.cancelAnimationFrame =\n window.webkitCancelAnimationFrame ||\n window.mozCancelAnimationFrame ||\n function () {\n return;\n };\n }\n /* istanbul ignore next */\n if (typeof window !== 'undefined' && !window.AudioContext) {\n if (window.webkitAudioContext) {\n const ctx = window.webkitAudioContext;\n const replaceMe = ctx.prototype.decodeAudioData;\n window.webkitAudioContext.prototype.decodeAudioData = function (arrayBuffer) {\n return new Promise((resolve, reject) => {\n replaceMe.call(this, arrayBuffer, resolve, reject);\n });\n };\n }\n window.AudioContext =\n window.AudioContext ||\n window.webkitAudioContext ||\n window.mozAudioContext ||\n window.msAudioContext ||\n window.oAudioContext;\n }\n /* istanbul ignore next */\n if (typeof window !== 'undefined' && !window.devicePixelRatio) {\n window.devicePixelRatio = window.devicePixelRatio || 1;\n }\n /* istanbul ignore next */\n if (typeof window !== 'undefined' && !window.requestIdleCallback) {\n // Adapted from https://developer.chrome.com/blog/using-requestidlecallback#checking_for_requestidlecallback\n window.requestIdleCallback =\n window.requestIdleCallback ||\n function (cb) {\n const start = Date.now();\n return setTimeout(function () {\n cb({\n didTimeout: false,\n timeRemaining: function () {\n return Math.max(0, 50 - (Date.now() - start));\n }\n });\n }, 1);\n };\n window.cancelIdleCallback =\n window.cancelIdleCallback ||\n function (id) {\n clearTimeout(id);\n };\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Resources/Font.ts\":\n/*!***************************!*\\\n !*** ./Resources/Font.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FontSource: () => (/* binding */ FontSource)\n/* harmony export */ });\n/* harmony import */ var _Graphics_Font__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Graphics/Font */ \"./Graphics/Font.ts\");\n/* harmony import */ var _Resource__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Resource */ \"./Resources/Resource.ts\");\n\n\nclass FontSource {\n constructor(\n /**\n * Path to the font resource relative from the HTML document hosting the game, or absolute\n */\n path, \n /**\n * The font family name\n */\n family, { bustCache, ...options } = {}) {\n this.path = path;\n this.family = family;\n this._isLoaded = false;\n this._resource = new _Resource__WEBPACK_IMPORTED_MODULE_0__.Resource(path, 'blob', bustCache);\n this._options = options;\n }\n async load() {\n if (this.isLoaded()) {\n return this.data;\n }\n try {\n const blob = await this._resource.load();\n const url = URL.createObjectURL(blob);\n if (!this.data) {\n this.data = new FontFace(this.family, `url(${url})`);\n document.fonts.add(this.data);\n }\n await this.data.load();\n this._isLoaded = true;\n }\n catch (error) {\n throw `Error loading FontSource from path '${this.path}' with error [${error.message}]`;\n }\n return this.data;\n }\n isLoaded() {\n return this._isLoaded;\n }\n /**\n * Build a font from this FontSource.\n * @param options {FontOptions} Override the font options\n */\n toFont(options) {\n return new _Graphics_Font__WEBPACK_IMPORTED_MODULE_1__.Font({ family: this.family, ...this._options, ...options });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Resources/Gif.ts\":\n/*!**************************!*\\\n !*** ./Resources/Gif.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Gif: () => (/* binding */ Gif),\n/* harmony export */ GifParser: () => (/* binding */ GifParser),\n/* harmony export */ Stream: () => (/* binding */ Stream)\n/* harmony export */ });\n/* harmony import */ var _Resource__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Resource */ \"./Resources/Resource.ts\");\n/* harmony import */ var _Graphics_SpriteSheet__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Graphics/SpriteSheet */ \"./Graphics/SpriteSheet.ts\");\n/* harmony import */ var _Graphics_Animation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Graphics/Animation */ \"./Graphics/Animation.ts\");\n/* harmony import */ var _Graphics_ImageSource__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Graphics/ImageSource */ \"./Graphics/ImageSource.ts\");\n\n\n\n\n/**\n * The {@apilink Texture} object allows games built in Excalibur to load image resources.\n * {@apilink Texture} is an {@apilink Loadable} which means it can be passed to a {@apilink Loader}\n * to pre-load before starting a level or game.\n */\nclass Gif {\n /**\n * @param path Path to the image resource\n * @param bustCache Optionally load texture with cache busting\n */\n constructor(path, bustCache = false) {\n this.path = path;\n /**\n * The width of the texture in pixels\n */\n this.width = 0;\n /**\n * The height of the texture in pixels\n */\n this.height = 0;\n this._images = [];\n this.data = [];\n this._sprites = [];\n this._resource = new _Resource__WEBPACK_IMPORTED_MODULE_0__.Resource(path, 'arraybuffer', bustCache);\n }\n /**\n * Should excalibur add a cache busting querystring? By default false.\n * Must be set before loading\n */\n get bustCache() {\n return this._resource.bustCache;\n }\n set bustCache(val) {\n this._resource.bustCache = val;\n }\n /**\n * Begins loading the texture and returns a promise to be resolved on completion\n */\n async load() {\n const arraybuffer = await this._resource.load();\n this._stream = new Stream(arraybuffer);\n this._gif = new GifParser(this._stream);\n const images = this._gif.images.map((i) => new _Graphics_ImageSource__WEBPACK_IMPORTED_MODULE_1__.ImageSource(i.src, false));\n // Load all textures\n await Promise.all(images.map((t) => t.load()));\n this.data = this._images = images;\n this._sprites = this._images.map((image) => {\n return image.toSprite();\n });\n return this.data;\n }\n isLoaded() {\n return !!this.data;\n }\n /**\n * Return a frame of the gif as a sprite by id\n * @param id\n */\n toSprite(id = 0) {\n var _a;\n return (_a = this._sprites[id]) !== null && _a !== void 0 ? _a : null;\n }\n /**\n * Return the gif as a spritesheet\n */\n toSpriteSheet() {\n const sprites = this._sprites;\n if (sprites.length) {\n return new _Graphics_SpriteSheet__WEBPACK_IMPORTED_MODULE_2__.SpriteSheet({ sprites });\n }\n return null;\n }\n /**\n * Transform the GIF into an animation with duration per frame\n * @param durationPerFrame Optionally override duration per frame\n */\n toAnimation(durationPerFrame) {\n var _a;\n const images = (_a = this._gif) === null || _a === void 0 ? void 0 : _a.images;\n if (images === null || images === void 0 ? void 0 : images.length) {\n const frames = images.map((image, index) => {\n var _a;\n return {\n graphic: this._sprites[index],\n duration: ((_a = this._gif) === null || _a === void 0 ? void 0 : _a.frames[index].delayMs) || undefined\n };\n });\n this._animation = new _Graphics_Animation__WEBPACK_IMPORTED_MODULE_3__.Animation({\n frames,\n frameDuration: durationPerFrame\n });\n return this._animation;\n }\n return null;\n }\n get readCheckBytes() {\n var _a, _b;\n return (_b = (_a = this._gif) === null || _a === void 0 ? void 0 : _a.checkBytes) !== null && _b !== void 0 ? _b : [];\n }\n}\nconst bitsToNum = (ba) => {\n return ba.reduce(function (s, n) {\n return s * 2 + n;\n }, 0);\n};\nconst byteToBitArr = (bite) => {\n const a = [];\n for (let i = 7; i >= 0; i--) {\n a.push(!!(bite & (1 << i)));\n }\n return a;\n};\nclass Stream {\n constructor(dataArray) {\n this.len = 0;\n this.position = 0;\n this.readByte = () => {\n if (this.position >= this.data.byteLength) {\n throw new Error('Attempted to read past end of stream.');\n }\n return this.data[this.position++];\n };\n this.readBytes = (n) => {\n const bytes = [];\n for (let i = 0; i < n; i++) {\n bytes.push(this.readByte());\n }\n return bytes;\n };\n this.read = (n) => {\n let s = '';\n for (let i = 0; i < n; i++) {\n s += String.fromCharCode(this.readByte());\n }\n return s;\n };\n this.readUnsigned = () => {\n // Little-endian.\n const a = this.readBytes(2);\n return (a[1] << 8) + a[0];\n };\n this.data = new Uint8Array(dataArray);\n this.len = this.data.byteLength;\n if (this.len === 0) {\n throw new Error('No data loaded from file');\n }\n }\n}\nconst lzwDecode = function (minCodeSize, data) {\n // TODO: Now that the GIF parser is a bit different, maybe this should get an array of bytes instead of a String?\n let pos = 0; // Maybe this streaming thing should be merged with the Stream?\n const readCode = function (size) {\n let code = 0;\n for (let i = 0; i < size; i++) {\n if (data.charCodeAt(pos >> 3) & (1 << (pos & 7))) {\n code |= 1 << i;\n }\n pos++;\n }\n return code;\n };\n const output = [];\n const clearCode = 1 << minCodeSize;\n const eoiCode = clearCode + 1;\n let codeSize = minCodeSize + 1;\n let dict = [];\n const clear = function () {\n dict = [];\n codeSize = minCodeSize + 1;\n for (let i = 0; i < clearCode; i++) {\n dict[i] = [i];\n }\n dict[clearCode] = [];\n dict[eoiCode] = null;\n };\n let code = 0;\n let last = 0;\n while (true) {\n last = code;\n code = readCode(codeSize);\n if (code === clearCode) {\n clear();\n continue;\n }\n if (code === eoiCode) {\n break;\n }\n if (code < dict.length) {\n if (last !== clearCode) {\n dict.push(dict[last].concat(dict[code][0]));\n }\n }\n else {\n if (code !== dict.length) {\n throw new Error('Invalid LZW code.');\n }\n dict.push(dict[last].concat(dict[last][0]));\n }\n output.push.apply(output, dict[code]);\n if (dict.length === 1 << codeSize && codeSize < 12) {\n // If we're at the last code and codeSize is 12, the next code will be a clearCode, and it'll be 12 bits long.\n codeSize++;\n }\n }\n // I don't know if this is technically an error, but some GIFs do it.\n //if (Math.ceil(pos / 8) !== data.length) throw new Error('Extraneous LZW bytes.');\n return output;\n};\n/**\n * GifParser for binary format\n *\n * Roughly based on the documentation https://giflib.sourceforge.net/whatsinagif/index.html\n */\nclass GifParser {\n constructor(stream) {\n this._handler = {};\n this.frames = [];\n this.images = [];\n this.globalColorTableBytes = [];\n this.checkBytes = [];\n this.parseColorTableBytes = (entries) => {\n // Each entry is 3 bytes, for RGB.\n const colorTable = [];\n for (let i = 0; i < entries; i++) {\n const rgb = this._st.readBytes(3);\n colorTable.push(rgb);\n }\n return colorTable;\n };\n this.readSubBlocks = () => {\n let size, data;\n data = '';\n do {\n size = this._st.readByte();\n data += this._st.read(size);\n } while (size !== 0);\n return data;\n };\n this.parseHeader = () => {\n const hdr = {\n sig: '',\n ver: '',\n width: 0,\n height: 0,\n colorResolution: 0,\n globalColorTableSize: 0,\n gctFlag: false,\n sortedFlag: false,\n globalColorTable: [],\n backgroundColorIndex: 0,\n pixelAspectRatio: 0 // if not 0, aspectRatio = (pixelAspectRatio + 15) / 64\n };\n hdr.sig = this._st.read(3);\n hdr.ver = this._st.read(3);\n if (hdr.sig !== 'GIF') {\n throw new Error('Not a GIF file.'); // XXX: This should probably be handled more nicely.\n }\n hdr.width = this._st.readUnsigned();\n hdr.height = this._st.readUnsigned();\n this._currentFrameCanvas.width = hdr.width;\n this._currentFrameCanvas.height = hdr.height;\n const bits = byteToBitArr(this._st.readByte());\n hdr.gctFlag = bits.shift();\n hdr.colorResolution = bitsToNum(bits.splice(0, 3));\n hdr.sortedFlag = bits.shift();\n hdr.globalColorTableSize = bitsToNum(bits.splice(0, 3));\n hdr.backgroundColorIndex = this._st.readByte();\n hdr.pixelAspectRatio = this._st.readByte(); // if not 0, aspectRatio = (pixelAspectRatio + 15) / 64\n if (hdr.gctFlag) {\n // hdr.globalColorTable = this.parseColorTable(1 << (hdr.globalColorTableSize + 1));\n this.globalColorTableBytes = this.parseColorTableBytes(1 << (hdr.globalColorTableSize + 1));\n }\n if (this._handler.hdr && this._handler.hdr(hdr)) {\n this.checkBytes.push(this._handler.hdr);\n }\n };\n this.parseExt = (block) => {\n const parseGCExt = (block) => {\n this.checkBytes.push(this._st.readByte()); // Always 4\n const bits = byteToBitArr(this._st.readByte());\n block.reserved = bits.splice(0, 3); // Reserved; should be 000.\n block.disposalMethod = bitsToNum(bits.splice(0, 3));\n block.userInputFlag = bits.shift();\n block.transparentColorFlag = bits.shift();\n block.delayTime = this._st.readUnsigned();\n block.transparentColorIndex = this._st.readByte();\n block.terminator = this._st.readByte(); // always 0\n if (this._handler.gce && this._handler.gce(block)) {\n this.checkBytes.push(this._handler.gce);\n }\n return block;\n };\n const parseComExt = (block) => {\n block.comment = this.readSubBlocks();\n if (this._handler.com && this._handler.com(block)) {\n this.checkBytes.push(this._handler.com);\n }\n };\n const parsePTExt = (block) => {\n this.checkBytes.push(this._st.readByte()); // Always 12\n block.ptHeader = this._st.readBytes(12);\n block.ptData = this.readSubBlocks();\n if (this._handler.pte && this._handler.pte(block)) {\n this.checkBytes.push(this._handler.pte);\n }\n };\n const parseAppExt = (block) => {\n const parseNetscapeExt = (block) => {\n this.checkBytes.push(this._st.readByte()); // Always 3\n block.unknown = this._st.readByte(); // Q: Always 1? What is this?\n block.iterations = this._st.readUnsigned();\n block.terminator = this._st.readByte();\n if (this._handler.app && this._handler.app.NETSCAPE && this._handler.app.NETSCAPE(block)) {\n this.checkBytes.push(this._handler.app);\n }\n };\n const parseUnknownAppExt = (block) => {\n block.appData = this.readSubBlocks();\n // FIXME: This won't work if a handler wants to match on any identifier.\n if (this._handler.app && this._handler.app[block.identifier] && this._handler.app[block.identifier](block)) {\n this.checkBytes.push(this._handler.app[block.identifier]);\n }\n };\n this.checkBytes.push(this._st.readByte()); // Always 11\n block.identifier = this._st.read(8);\n block.authCode = this._st.read(3);\n switch (block.identifier) {\n case 'NETSCAPE':\n parseNetscapeExt(block);\n break;\n default:\n parseUnknownAppExt(block);\n break;\n }\n };\n const parseUnknownExt = (block) => {\n block.data = this.readSubBlocks();\n if (this._handler.unknown && this._handler.unknown(block)) {\n this.checkBytes.push(this._handler.unknown);\n }\n };\n block.label = this._st.readByte();\n switch (block.label) {\n case 0xf9:\n block.extType = 'gce';\n this._gce = parseGCExt(block);\n break;\n case 0xfe:\n block.extType = 'com';\n parseComExt(block);\n break;\n case 0x01:\n block.extType = 'pte';\n parsePTExt(block);\n break;\n case 0xff:\n block.extType = 'app';\n parseAppExt(block);\n break;\n default:\n block.extType = 'unknown';\n parseUnknownExt(block);\n break;\n }\n };\n this.parseImg = (img) => {\n var _a;\n const deinterlace = (pixels, width) => {\n // Of course this defeats the purpose of interlacing. And it's *probably*\n // the least efficient way it's ever been implemented. But nevertheless...\n const newPixels = new Array(pixels.length);\n const rows = pixels.length / width;\n const cpRow = (toRow, fromRow) => {\n const fromPixels = pixels.slice(fromRow * width, (fromRow + 1) * width);\n newPixels.splice.apply(newPixels, [toRow * width, width].concat(fromPixels));\n };\n const offsets = [0, 4, 2, 1];\n const steps = [8, 8, 4, 2];\n let fromRow = 0;\n for (let pass = 0; pass < 4; pass++) {\n for (let toRow = offsets[pass]; toRow < rows; toRow += steps[pass]) {\n cpRow(toRow, fromRow);\n fromRow++;\n }\n }\n return newPixels;\n };\n img.leftPos = this._st.readUnsigned();\n img.topPos = this._st.readUnsigned();\n img.width = this._st.readUnsigned();\n img.height = this._st.readUnsigned();\n const bits = byteToBitArr(this._st.readByte());\n img.lctFlag = bits.shift();\n img.interlaced = bits.shift();\n img.sorted = bits.shift();\n img.reserved = bits.splice(0, 2);\n img.lctSize = bitsToNum(bits.splice(0, 3));\n if (img.lctFlag) {\n img.lctBytes = this.parseColorTableBytes(1 << (img.lctSize + 1));\n }\n img.lzwMinCodeSize = this._st.readByte();\n const lzwData = this.readSubBlocks();\n img.pixels = lzwDecode(img.lzwMinCodeSize, lzwData);\n if (img.interlaced) {\n // Move\n img.pixels = deinterlace(img.pixels, img.width);\n }\n if ((_a = this._gce) === null || _a === void 0 ? void 0 : _a.delayTime) {\n img.delayMs = this._gce.delayTime * 10;\n }\n this.frames.push(img);\n this.arrayToImage(img, img.lctFlag ? img.lctBytes : this.globalColorTableBytes);\n if (this._handler.img && this._handler.img(img)) {\n this.checkBytes.push(this._handler);\n }\n };\n this.parseBlocks = () => {\n const block = {\n sentinel: this._st.readByte(),\n type: ''\n };\n const blockChar = String.fromCharCode(block.sentinel);\n switch (blockChar) {\n case '!':\n block.type = 'ext';\n this.parseExt(block);\n break;\n case ',':\n block.type = 'img';\n this.parseImg(block);\n break;\n case ';':\n block.type = 'eof';\n if (this._handler.eof && this._handler.eof(block)) {\n this.checkBytes.push(this._handler.eof);\n }\n break;\n default:\n throw new Error('Unknown block: 0x' + block.sentinel.toString(16));\n }\n if (block.type !== 'eof') {\n this.parseBlocks();\n }\n };\n this.arrayToImage = (frame, colorTable) => {\n var _a, _b, _c, _d;\n const canvas = document.createElement('canvas');\n canvas.width = frame.width;\n canvas.height = frame.height;\n const context = canvas.getContext('2d');\n const imageData = context.getImageData(0, 0, canvas.width, canvas.height);\n let transparentColorIndex = -1;\n if ((_a = this._gce) === null || _a === void 0 ? void 0 : _a.transparentColorFlag) {\n transparentColorIndex = this._gce.transparentColorIndex;\n }\n for (let pixel = 0; pixel < frame.pixels.length; pixel++) {\n const colorIndex = frame.pixels[pixel];\n const color = colorTable[colorIndex];\n if (colorIndex === transparentColorIndex) {\n imageData.data.set([0, 0, 0, 0], pixel * 4);\n }\n else {\n imageData.data.set([...color, 255], pixel * 4);\n }\n }\n context.putImageData(imageData, 0, 0);\n // A value of 1 which tells the decoder to leave the image in place and draw the next image on top of it.\n // A value of 2 would have meant that the canvas should be restored to the background color (as indicated by the logical screen descriptor).\n // A value of 3 is defined to mean that the decoder should restore the canvas to its previous state before the current image was drawn.\n // The behavior for values 4-7 are yet to be defined.\n if (((_b = this._gce) === null || _b === void 0 ? void 0 : _b.disposalMethod) === 1 && this.images.length) {\n this._currentFrameContext.drawImage(this.images[this.images.length - 1], 0, 0);\n }\n else if (((_c = this._gce) === null || _c === void 0 ? void 0 : _c.disposalMethod) === 2 && ((_d = this._hdr) === null || _d === void 0 ? void 0 : _d.gctFlag)) {\n const bg = colorTable[this._hdr.backgroundColorIndex];\n this._currentFrameContext.fillStyle = `rgb(${bg[0]}, ${bg[1]}, ${bg[2]})`;\n this._currentFrameContext.fillRect(0, 0, this._hdr.width, this._hdr.height);\n }\n else {\n this._currentFrameContext.clearRect(0, 0, this._currentFrameCanvas.width, this._currentFrameCanvas.height);\n }\n this._currentFrameContext.drawImage(canvas, frame.leftPos, frame.topPos, frame.width, frame.height);\n const img = new Image();\n img.src = this._currentFrameCanvas.toDataURL(); // default is png\n this.images.push(img);\n };\n this._st = stream;\n this._handler = {};\n this._currentFrameCanvas = document.createElement('canvas');\n this._currentFrameContext = this._currentFrameCanvas.getContext('2d');\n this.parseHeader();\n this.parseBlocks();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Resources/Index.ts\":\n/*!****************************!*\\\n !*** ./Resources/Index.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AudioContextFactory: () => (/* reexport safe */ _Sound_Index__WEBPACK_IMPORTED_MODULE_1__.AudioContextFactory),\n/* harmony export */ FontSource: () => (/* reexport safe */ _Font__WEBPACK_IMPORTED_MODULE_3__.FontSource),\n/* harmony export */ Gif: () => (/* reexport safe */ _Gif__WEBPACK_IMPORTED_MODULE_2__.Gif),\n/* harmony export */ GifParser: () => (/* reexport safe */ _Gif__WEBPACK_IMPORTED_MODULE_2__.GifParser),\n/* harmony export */ Resource: () => (/* reexport safe */ _Resource__WEBPACK_IMPORTED_MODULE_0__.Resource),\n/* harmony export */ ResourceEvents: () => (/* reexport safe */ _Resource__WEBPACK_IMPORTED_MODULE_0__.ResourceEvents),\n/* harmony export */ Sound: () => (/* reexport safe */ _Sound_Index__WEBPACK_IMPORTED_MODULE_1__.Sound),\n/* harmony export */ SoundEvents: () => (/* reexport safe */ _Sound_Index__WEBPACK_IMPORTED_MODULE_1__.SoundEvents),\n/* harmony export */ Stream: () => (/* reexport safe */ _Gif__WEBPACK_IMPORTED_MODULE_2__.Stream),\n/* harmony export */ WebAudioInstance: () => (/* reexport safe */ _Sound_Index__WEBPACK_IMPORTED_MODULE_1__.WebAudioInstance)\n/* harmony export */ });\n/* harmony import */ var _Resource__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Resource */ \"./Resources/Resource.ts\");\n/* harmony import */ var _Sound_Index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Sound/Index */ \"./Resources/Sound/Index.ts\");\n/* harmony import */ var _Gif__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Gif */ \"./Resources/Gif.ts\");\n/* harmony import */ var _Font__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Font */ \"./Resources/Font.ts\");\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Resources/Resource.ts\":\n/*!*******************************!*\\\n !*** ./Resources/Resource.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Resource: () => (/* binding */ Resource),\n/* harmony export */ ResourceEvents: () => (/* binding */ ResourceEvents)\n/* harmony export */ });\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n\n\nconst ResourceEvents = {\n Complete: 'complete',\n Load: 'load',\n LoadStart: 'loadstart',\n Progress: 'progress',\n Error: 'error'\n};\n/**\n * The {@apilink Resource} type allows games built in Excalibur to load generic resources.\n * For any type of remote resource it is recommended to use {@apilink Resource} for preloading.\n */\nclass Resource {\n /**\n * @param path Path to the remote resource\n * @param responseType The type to expect as a response: \"\" | \"arraybuffer\" | \"blob\" | \"document\" | \"json\" | \"text\";\n * @param bustCache Whether or not to cache-bust requests\n */\n constructor(path, responseType, bustCache = false) {\n this.path = path;\n this.responseType = responseType;\n this.bustCache = bustCache;\n this.data = null;\n this.logger = _Util_Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance();\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_1__.EventEmitter();\n }\n /**\n * Returns true if the Resource is completely loaded and is ready\n * to be drawn.\n */\n isLoaded() {\n return this.data !== null;\n }\n _cacheBust(uri) {\n const query = /\\?\\w*=\\w*/;\n if (query.test(uri)) {\n uri += '&__=' + Date.now();\n }\n else {\n uri += '?__=' + Date.now();\n }\n return uri;\n }\n /**\n * Begin loading the resource and returns a promise to be resolved on completion\n */\n load() {\n return new Promise((resolve, reject) => {\n // Exit early if we already have data\n if (this.data !== null) {\n this.logger.debug('Already have data for resource', this.path);\n this.events.emit('complete', this.data);\n resolve(this.data);\n return;\n }\n const request = new XMLHttpRequest();\n request.open('GET', this.bustCache ? this._cacheBust(this.path) : this.path, true);\n request.responseType = this.responseType;\n request.addEventListener('loadstart', (e) => this.events.emit('loadstart', e));\n request.addEventListener('progress', (e) => this.events.emit('progress', e));\n request.addEventListener('error', (e) => this.events.emit('error', e));\n request.addEventListener('load', (e) => this.events.emit('load', e));\n request.addEventListener('load', () => {\n // XHR on file:// success status is 0, such as with PhantomJS\n if (request.status !== 0 && request.status !== 200) {\n this.logger.error('Failed to load resource ', this.path, ' server responded with error code', request.status);\n this.events.emit('error', request.response);\n reject(new Error(request.statusText));\n return;\n }\n if (request.response instanceof Blob && request.response.type === 'text/html') {\n const errorText = `Expected blob (usually image) data from the server when loading ${this.path}, but got HTML content instead!\r\n\r\nCheck your server configuration, for example Vite serves static files from the /public folder`;\n this.events.emit('error', request.response);\n reject(new Error(errorText));\n return;\n }\n this.data = request.response;\n this.events.emit('complete', this.data);\n this.logger.debug('Completed loading resource', this.path);\n resolve(this.data);\n });\n request.send();\n });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Resources/Sound/AudioContext.ts\":\n/*!*****************************************!*\\\n !*** ./Resources/Sound/AudioContext.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AudioContextFactory: () => (/* binding */ AudioContextFactory)\n/* harmony export */ });\n/**\n * Internal class used to build instances of AudioContext\n */\n/* istanbul ignore next */\nclass AudioContextFactory {\n static create() {\n if (!this._INSTANCE) {\n if (window.AudioContext || window.webkitAudioContext) {\n this._INSTANCE = new AudioContext();\n }\n }\n return this._INSTANCE;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Resources/Sound/Index.ts\":\n/*!**********************************!*\\\n !*** ./Resources/Sound/Index.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AudioContextFactory: () => (/* reexport safe */ _AudioContext__WEBPACK_IMPORTED_MODULE_1__.AudioContextFactory),\n/* harmony export */ Sound: () => (/* reexport safe */ _Sound__WEBPACK_IMPORTED_MODULE_0__.Sound),\n/* harmony export */ SoundEvents: () => (/* reexport safe */ _Sound__WEBPACK_IMPORTED_MODULE_0__.SoundEvents),\n/* harmony export */ WebAudioInstance: () => (/* reexport safe */ _WebAudioInstance__WEBPACK_IMPORTED_MODULE_2__.WebAudioInstance)\n/* harmony export */ });\n/* harmony import */ var _Sound__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Sound */ \"./Resources/Sound/Sound.ts\");\n/* harmony import */ var _AudioContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./AudioContext */ \"./Resources/Sound/AudioContext.ts\");\n/* harmony import */ var _WebAudioInstance__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./WebAudioInstance */ \"./Resources/Sound/WebAudioInstance.ts\");\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Resources/Sound/Sound.ts\":\n/*!**********************************!*\\\n !*** ./Resources/Sound/Sound.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Sound: () => (/* binding */ Sound),\n/* harmony export */ SoundEvents: () => (/* binding */ SoundEvents)\n/* harmony export */ });\n/* harmony import */ var _Interfaces_AudioImplementation__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Interfaces/AudioImplementation */ \"./Interfaces/AudioImplementation.ts\");\n/* harmony import */ var _Resource__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Resource */ \"./Resources/Resource.ts\");\n/* harmony import */ var _WebAudioInstance__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./WebAudioInstance */ \"./Resources/Sound/WebAudioInstance.ts\");\n/* harmony import */ var _AudioContext__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./AudioContext */ \"./Resources/Sound/AudioContext.ts\");\n/* harmony import */ var _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Events/MediaEvents */ \"./Events/MediaEvents.ts\");\n/* harmony import */ var _Util_Sound__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../Util/Sound */ \"./Util/Sound.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n\n\n\n\n\nconst SoundEvents = {\n VolumeChange: 'volumechange',\n Processed: 'processed',\n Pause: 'pause',\n Stop: 'stop',\n PlaybackEnd: 'playbackend',\n Resume: 'resume',\n PlaybackStart: 'playbackstart'\n};\n/**\n * The {@apilink Sound} object allows games built in Excalibur to load audio\n * components, from soundtracks to sound effects. {@apilink Sound} is an {@apilink Loadable}\n * which means it can be passed to a {@apilink Loader} to pre-load before a game or level.\n */\nclass Sound {\n /**\n * Indicates whether the clip should loop when complete\n * @param value Set the looping flag\n */\n set loop(value) {\n this._loop = value;\n for (const track of this._tracks) {\n track.loop = this._loop;\n }\n this.logger.debug('Set loop for all instances of sound', this.path, 'to', this._loop);\n }\n get loop() {\n return this._loop;\n }\n set volume(value) {\n this._volume = value;\n for (const track of this._tracks) {\n track.volume = this._volume;\n }\n this.events.emit('volumechange', new _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_0__.NativeSoundEvent(this));\n this.logger.debug('Set loop for all instances of sound', this.path, 'to', this._volume);\n }\n get volume() {\n return this._volume;\n }\n /**\n * Get the duration that this audio should play. If unset the total natural playback duration will be used.\n */\n get duration() {\n return this._duration;\n }\n /**\n * Set the duration that this audio should play. If unset the total natural playback duration will be used.\n *\n * Note: if you seek to a specific point the duration will start from that point, for example\n *\n * If you have a 10 second clip, seek to 5 seconds, then set the duration to 2, it will play the clip from 5-7 seconds.\n */\n set duration(duration) {\n this._duration = duration;\n }\n /**\n * Return array of Current AudioInstances playing or being paused\n */\n get instances() {\n return this._tracks;\n }\n get path() {\n return this._resource.path;\n }\n set path(val) {\n this._resource.path = val;\n }\n /**\n * Should excalibur add a cache busting querystring? By default false.\n * Must be set before loading\n */\n get bustCache() {\n return this._resource.bustCache;\n }\n set bustCache(val) {\n this._resource.bustCache = val;\n }\n /**\n * @param paths A list of audio sources (clip.wav, clip.mp3, clip.ogg) for this audio clip. This is done for browser compatibility.\n */\n constructor(...paths) {\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_1__.EventEmitter();\n this.logger = _Util_Log__WEBPACK_IMPORTED_MODULE_2__.Logger.getInstance();\n this._loop = false;\n this._volume = 1;\n this._isStopped = false;\n // private _isPaused = false;\n this._tracks = [];\n this._wasPlayingOnHidden = false;\n this._playbackRate = 1.0;\n this._audioContext = _AudioContext__WEBPACK_IMPORTED_MODULE_3__.AudioContextFactory.create();\n this._resource = new _Resource__WEBPACK_IMPORTED_MODULE_4__.Resource('', _Interfaces_AudioImplementation__WEBPACK_IMPORTED_MODULE_5__.ExResponse.type.arraybuffer);\n /**\n * Chrome : MP3, WAV, Ogg\n * Firefox : WAV, Ogg,\n * IE : MP3, WAV coming soon\n * Safari MP3, WAV, Ogg\n */\n for (const path of paths) {\n if ((0,_Util_Sound__WEBPACK_IMPORTED_MODULE_6__.canPlayFile)(path)) {\n this.path = path;\n break;\n }\n }\n if (!this.path) {\n this.logger.warn('This browser does not support any of the audio files specified:', paths.join(', '));\n this.logger.warn('Attempting to use', paths[0]);\n this.path = paths[0]; // select the first specified\n }\n }\n isLoaded() {\n return !!this.data;\n }\n async load() {\n var _a, _b;\n if (this.data) {\n return this.data;\n }\n const arraybuffer = await this._resource.load();\n const audiobuffer = await this.decodeAudio(arraybuffer.slice(0));\n this._duration = (_b = (_a = this._duration) !== null && _a !== void 0 ? _a : audiobuffer === null || audiobuffer === void 0 ? void 0 : audiobuffer.duration) !== null && _b !== void 0 ? _b : undefined;\n this.events.emit('processed', new _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_0__.NativeSoundProcessedEvent(this, audiobuffer));\n return (this.data = audiobuffer);\n }\n async decodeAudio(data) {\n try {\n return await this._audioContext.decodeAudioData(data.slice(0));\n }\n catch (e) {\n this.logger.error('Unable to decode ' +\n ' this browser may not fully support this format, or the file may be corrupt, ' +\n 'if this is an mp3 try removing id3 tags and album art from the file.');\n return await Promise.reject();\n }\n }\n wireEngine(engine) {\n if (engine) {\n this._engine = engine;\n this._engine.on('hidden', () => {\n if (engine.pauseAudioWhenHidden && this.isPlaying()) {\n this._wasPlayingOnHidden = true;\n this.pause();\n }\n });\n this._engine.on('visible', () => {\n if (engine.pauseAudioWhenHidden && this._wasPlayingOnHidden) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.play();\n this._wasPlayingOnHidden = false;\n }\n });\n this._engine.on('start', () => {\n this._isStopped = false;\n });\n this._engine.on('stop', () => {\n this.stop();\n this._isStopped = true;\n });\n }\n }\n /**\n * Returns how many instances of the sound are currently playing\n */\n instanceCount() {\n return this._tracks.length;\n }\n /**\n * Whether or not the sound is playing right now\n */\n isPlaying() {\n return this._tracks.some((t) => t.isPlaying());\n }\n isPaused() {\n return this._tracks.some((t) => t.isPaused());\n }\n isStopped() {\n return this._tracks.some((t) => t.isStopped());\n }\n /**\n * Play the sound, returns a promise that resolves when the sound is done playing\n * An optional volume argument can be passed in to play the sound. Max volume is 1.0\n */\n play(volume) {\n if (!this.isLoaded()) {\n this.logger.warn('Cannot start playing. Resource', this.path, 'is not loaded yet');\n return Promise.resolve(true);\n }\n if (this._isStopped) {\n this.logger.warn('Cannot start playing. Engine is in a stopped state.');\n return Promise.resolve(false);\n }\n this.volume = volume || this.volume;\n if (this.isPaused()) {\n return this._resumePlayback();\n }\n else {\n return this._startPlayback();\n }\n }\n /**\n * Stop the sound, and do not rewind\n */\n pause() {\n if (!this.isPlaying()) {\n return;\n }\n for (const track of this._tracks) {\n track.pause();\n }\n this.events.emit('pause', new _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_0__.NativeSoundEvent(this));\n this.logger.debug('Paused all instances of sound', this.path);\n }\n /**\n * Stop the sound if it is currently playing and rewind the track. If the sound is not playing, rewinds the track.\n */\n stop() {\n for (const track of this._tracks) {\n track.stop();\n }\n this.events.emit('stop', new _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_0__.NativeSoundEvent(this));\n this._tracks.length = 0;\n this.logger.debug('Stopped all instances of sound', this.path);\n }\n get playbackRate() {\n return this._playbackRate;\n }\n set playbackRate(playbackRate) {\n this._playbackRate = playbackRate;\n this._tracks.forEach((t) => {\n t.playbackRate = this._playbackRate;\n });\n }\n seek(position, trackId = 0) {\n if (this._tracks.length === 0) {\n this._getTrackInstance(this.data);\n }\n this._tracks[trackId].seek(position);\n }\n getTotalPlaybackDuration() {\n if (!this.isLoaded()) {\n this.logger.warnOnce(`Sound from ${this.path} is not loaded, cannot return total playback duration.` +\n `Did you forget to add Sound to a loader? https://excaliburjs.com/docs/loaders/`);\n return 0;\n }\n return this.data.duration;\n }\n /**\n * Return the current playback time of the playing track in seconds from the start.\n *\n * Optionally specify the track to query if multiple are playing at once.\n * @param trackId\n */\n getPlaybackPosition(trackId = 0) {\n if (this._tracks.length) {\n return this._tracks[trackId].getPlaybackPosition();\n }\n return 0;\n }\n /**\n * Get Id of provided AudioInstance in current trackList\n * @param track {@apilink Audio} which Id is to be given\n */\n getTrackId(track) {\n return this._tracks.indexOf(track);\n }\n async _resumePlayback() {\n if (this.isPaused()) {\n const resumed = [];\n // ensure we resume *current* tracks (if paused)\n for (const track of this._tracks) {\n resumed.push(track.play().then(() => {\n this._tracks.splice(this.getTrackId(track), 1);\n return true;\n }));\n }\n this.events.emit('resume', new _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_0__.NativeSoundEvent(this));\n this.logger.debug('Resuming paused instances for sound', this.path, this._tracks);\n // resolve when resumed tracks are done\n await Promise.all(resumed);\n }\n return true;\n }\n /**\n * Starts playback, returns a promise that resolves when playback is complete\n */\n async _startPlayback() {\n const track = this._getTrackInstance(this.data);\n const complete = await track.play(() => {\n this.events.emit('playbackstart', new _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_0__.NativeSoundEvent(this, track));\n this.logger.debug('Playing new instance for sound', this.path);\n });\n this.events.emit('playbackend', new _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_0__.NativeSoundEvent(this, track));\n // cleanup any done tracks\n const trackId = this.getTrackId(track);\n if (trackId !== -1) {\n this._tracks.splice(trackId, 1);\n }\n return complete;\n }\n _getTrackInstance(data) {\n var _a;\n const newTrack = new _WebAudioInstance__WEBPACK_IMPORTED_MODULE_7__.WebAudioInstance(data);\n newTrack.loop = this.loop;\n newTrack.volume = this.volume;\n newTrack.duration = (_a = this.duration) !== null && _a !== void 0 ? _a : 0;\n newTrack.playbackRate = this._playbackRate;\n this._tracks.push(newTrack);\n return newTrack;\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Resources/Sound/WebAudioInstance.ts\":\n/*!*********************************************!*\\\n !*** ./Resources/Sound/WebAudioInstance.ts ***!\n \\*********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ WebAudioInstance: () => (/* binding */ WebAudioInstance)\n/* harmony export */ });\n/* harmony import */ var _Util_StateMachine__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Util/StateMachine */ \"./Util/StateMachine.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _AudioContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./AudioContext */ \"./Resources/Sound/AudioContext.ts\");\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Util/Future */ \"./Util/Future.ts\");\n\n\n\n\n/**\n * Internal class representing a Web Audio AudioBufferSourceNode instance\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API\n */\nclass WebAudioInstance {\n _createNewBufferSource() {\n this._instance = this._audioContext.createBufferSource();\n this._instance.buffer = this._src;\n this._instance.loop = this.loop;\n this._instance.playbackRate.value = this._playbackRate;\n this._instance.connect(this._volumeNode);\n this._volumeNode.connect(this._audioContext.destination);\n }\n _handleEnd() {\n if (!this.loop) {\n this._instance.onended = () => {\n this._playingFuture.resolve(true);\n };\n }\n }\n set loop(value) {\n this._loop = value;\n if (this._instance) {\n this._instance.loop = value;\n if (!this.loop) {\n this._instance.onended = () => {\n this._playingFuture.resolve(true);\n };\n }\n }\n }\n get loop() {\n return this._loop;\n }\n set volume(value) {\n value = (0,_Math_util__WEBPACK_IMPORTED_MODULE_0__.clamp)(value, 0, 1.0);\n this._volume = value;\n if (this._stateMachine.in('PLAYING') && this._volumeNode.gain.setTargetAtTime) {\n // https://developer.mozilla.org/en-US/docs/Web/API/AudioParam/setTargetAtTime\n // After each .1 seconds timestep, the target value will ~63.2% closer to the target value.\n // This exponential ramp provides a more pleasant transition in gain\n this._volumeNode.gain.setTargetAtTime(value, this._audioContext.currentTime, 0.1);\n }\n else {\n this._volumeNode.gain.value = value;\n }\n }\n get volume() {\n return this._volume;\n }\n /**\n * Returns the set duration to play, otherwise returns the total duration if unset\n */\n get duration() {\n var _a;\n return (_a = this._duration) !== null && _a !== void 0 ? _a : this.getTotalPlaybackDuration();\n }\n /**\n * Set the duration that this audio should play.\n *\n * Note: if you seek to a specific point the duration will start from that point, for example\n *\n * If you have a 10 second clip, seek to 5 seconds, then set the duration to 2, it will play the clip from 5-7 seconds.\n */\n set duration(duration) {\n this._duration = duration;\n }\n constructor(_src) {\n this._src = _src;\n this._audioContext = _AudioContext__WEBPACK_IMPORTED_MODULE_1__.AudioContextFactory.create();\n this._volumeNode = this._audioContext.createGain();\n this._playingFuture = new _Util_Future__WEBPACK_IMPORTED_MODULE_2__.Future();\n this._stateMachine = _Util_StateMachine__WEBPACK_IMPORTED_MODULE_3__.StateMachine.create({\n start: 'STOPPED',\n states: {\n PLAYING: {\n onEnter: ({ data }) => {\n // Buffer nodes are single use\n this._createNewBufferSource();\n this._handleEnd();\n if (this.loop) {\n // when looping don't set a duration\n this._instance.start(0, data.pausedAt * this._playbackRate);\n }\n else {\n this._instance.start(0, data.pausedAt * this._playbackRate, this.duration);\n }\n data.startedAt = this._audioContext.currentTime - data.pausedAt;\n data.pausedAt = 0;\n },\n onState: () => this._playStarted(),\n onExit: ({ to }) => {\n // If you've exited early only resolve if explicitly STOPPED\n if (to === 'STOPPED') {\n this._playingFuture.resolve(true);\n }\n // Whenever you're not playing... you stop!\n this._instance.onended = null; // disconnect the wired on-end handler\n this._instance.disconnect();\n this._instance.stop(0);\n this._instance = null;\n },\n transitions: ['STOPPED', 'PAUSED', 'SEEK']\n },\n SEEK: {\n onEnter: ({ eventData: position, data }) => {\n data.pausedAt = (position !== null && position !== void 0 ? position : 0) / this._playbackRate;\n data.startedAt = 0;\n },\n transitions: ['*']\n },\n STOPPED: {\n onEnter: ({ data }) => {\n data.pausedAt = 0;\n data.startedAt = 0;\n this._playingFuture.resolve(true);\n },\n transitions: ['PLAYING', 'PAUSED', 'SEEK']\n },\n PAUSED: {\n onEnter: ({ data }) => {\n // Playback rate will be a scale factor of how fast/slow the audio is being played\n // default is 1.0\n // we need to invert it to get the time scale\n data.pausedAt = this._audioContext.currentTime - data.startedAt;\n },\n transitions: ['PLAYING', 'STOPPED', 'SEEK']\n }\n }\n }, {\n startedAt: 0,\n pausedAt: 0\n });\n this._volume = 1;\n this._loop = false;\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n this._playStarted = () => { };\n this._playbackRate = 1.0;\n this._createNewBufferSource();\n }\n isPlaying() {\n return this._stateMachine.in('PLAYING');\n }\n isPaused() {\n return this._stateMachine.in('PAUSED') || this._stateMachine.in('SEEK');\n }\n isStopped() {\n return this._stateMachine.in('STOPPED');\n }\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n play(playStarted = () => { }) {\n this._playStarted = playStarted;\n this._stateMachine.go('PLAYING');\n return this._playingFuture.promise;\n }\n pause() {\n this._stateMachine.go('PAUSED');\n }\n stop() {\n this._stateMachine.go('STOPPED');\n }\n seek(position) {\n this._stateMachine.go('PAUSED');\n this._stateMachine.go('SEEK', position);\n }\n getTotalPlaybackDuration() {\n return this._src.duration;\n }\n getPlaybackPosition() {\n const { pausedAt, startedAt } = this._stateMachine.data;\n if (pausedAt) {\n return pausedAt * this._playbackRate;\n }\n if (startedAt) {\n return (this._audioContext.currentTime - startedAt) * this._playbackRate;\n }\n return 0;\n }\n set playbackRate(playbackRate) {\n this._instance.playbackRate.value = this._playbackRate = playbackRate;\n }\n get playbackRate() {\n return this._instance.playbackRate.value;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Scene.ts\":\n/*!******************!*\\\n !*** ./Scene.ts ***!\n \\******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PreLoadEvent: () => (/* binding */ PreLoadEvent),\n/* harmony export */ Scene: () => (/* binding */ Scene),\n/* harmony export */ SceneEvents: () => (/* binding */ SceneEvents),\n/* harmony export */ isSceneConstructor: () => (/* binding */ isSceneConstructor)\n/* harmony export */ });\n/* harmony import */ var _ScreenElement__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./ScreenElement */ \"./ScreenElement.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./Events */ \"./Events.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Timer__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./Timer */ \"./Timer.ts\");\n/* harmony import */ var _TileMap__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./TileMap */ \"./TileMap/TileMap.ts\");\n/* harmony import */ var _Camera__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Camera */ \"./Camera.ts\");\n/* harmony import */ var _Actor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Actor */ \"./Actor.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./Util/Util */ \"./Util/Util.ts\");\n/* harmony import */ var _Trigger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Trigger */ \"./Trigger.ts\");\n/* harmony import */ var _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./EntityComponentSystem/System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _EntityComponentSystem_World__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./EntityComponentSystem/World */ \"./EntityComponentSystem/World.ts\");\n/* harmony import */ var _Collision_MotionSystem__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Collision/MotionSystem */ \"./Collision/MotionSystem.ts\");\n/* harmony import */ var _Collision_CollisionSystem__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Collision/CollisionSystem */ \"./Collision/CollisionSystem.ts\");\n/* harmony import */ var _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./EntityComponentSystem/Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _Graphics_GraphicsSystem__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Graphics/GraphicsSystem */ \"./Graphics/GraphicsSystem.ts\");\n/* harmony import */ var _Debug_DebugSystem__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Debug/DebugSystem */ \"./Debug/DebugSystem.ts\");\n/* harmony import */ var _Input_PointerSystem__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Input/PointerSystem */ \"./Input/PointerSystem.ts\");\n/* harmony import */ var _Actions_ActionsSystem__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Actions/ActionsSystem */ \"./Actions/ActionsSystem.ts\");\n/* harmony import */ var _TileMap_IsometricEntitySystem__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./TileMap/IsometricEntitySystem */ \"./TileMap/IsometricEntitySystem.ts\");\n/* harmony import */ var _Graphics_OffscreenSystem__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Graphics/OffscreenSystem */ \"./Graphics/OffscreenSystem.ts\");\n/* harmony import */ var _Collision_PhysicsWorld__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Collision/PhysicsWorld */ \"./Collision/PhysicsWorld.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Input_InputHost__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./Input/InputHost */ \"./Input/InputHost.ts\");\n/* harmony import */ var _Input_PointerScope__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Input/PointerScope */ \"./Input/PointerScope.ts\");\n/* harmony import */ var _Collision_PhysicsConfig__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Collision/PhysicsConfig */ \"./Collision/PhysicsConfig.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass PreLoadEvent {\n}\nconst SceneEvents = {\n Initialize: 'initialize',\n Activate: 'activate',\n Deactivate: 'deactivate',\n PreUpdate: 'preupdate',\n PostUpdate: 'postupdate',\n PreDraw: 'predraw',\n PostDraw: 'postdraw',\n PreDebugDraw: 'predebugdraw',\n PostDebugDraw: 'postdebugdraw',\n PreLoad: 'preload'\n};\n/**\n *\n */\nfunction isSceneConstructor(x) {\n var _a, _b;\n return !!(x === null || x === void 0 ? void 0 : x.prototype) && !!((_b = (_a = x === null || x === void 0 ? void 0 : x.prototype) === null || _a === void 0 ? void 0 : _a.constructor) === null || _b === void 0 ? void 0 : _b.name);\n}\n/**\n * {@apilink Actor | `Actors`} are composed together into groupings called Scenes in\n * Excalibur. The metaphor models the same idea behind real world\n * actors in a scene. Only actors in scenes will be updated and drawn.\n *\n * Typical usages of a scene include: levels, menus, loading screens, etc.\n */\nclass Scene {\n /**\n * The actors in the current scene\n */\n get actors() {\n return this.world.entityManager.entities.filter((e) => {\n return e instanceof _Actor__WEBPACK_IMPORTED_MODULE_0__.Actor;\n });\n }\n /**\n * The entities in the current scene\n */\n get entities() {\n return this.world.entityManager.entities;\n }\n /**\n * The triggers in the current scene\n */\n get triggers() {\n return this.world.entityManager.entities.filter((e) => {\n return e instanceof _Trigger__WEBPACK_IMPORTED_MODULE_1__.Trigger;\n });\n }\n /**\n * The {@apilink TileMap}s in the scene, if any\n */\n get tileMaps() {\n return this.world.entityManager.entities.filter((e) => {\n return e instanceof _TileMap__WEBPACK_IMPORTED_MODULE_2__.TileMap;\n });\n }\n get timers() {\n return this._timers;\n }\n constructor() {\n // Initialize systems\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_3__.Logger.getInstance();\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_4__.EventEmitter();\n /**\n * Gets or sets the current camera for the scene\n */\n this.camera = new _Camera__WEBPACK_IMPORTED_MODULE_5__.Camera();\n /**\n * The ECS world for the scene\n */\n this.world = new _EntityComponentSystem_World__WEBPACK_IMPORTED_MODULE_6__.World(this);\n /**\n * The Excalibur physics world for the scene. Used to interact\n * with colliders included in the scene.\n *\n * Can be used to perform scene ray casts, track colliders, broadphase, and narrowphase.\n */\n this.physics = new _Collision_PhysicsWorld__WEBPACK_IMPORTED_MODULE_7__.PhysicsWorld((0,_Collision_PhysicsConfig__WEBPACK_IMPORTED_MODULE_8__.getDefaultPhysicsConfig)());\n this._isInitialized = false;\n this._timers = [];\n this._cancelQueue = [];\n // Update\n this.world.add(_Actions_ActionsSystem__WEBPACK_IMPORTED_MODULE_9__.ActionsSystem);\n this.world.add(new _Collision_MotionSystem__WEBPACK_IMPORTED_MODULE_10__.MotionSystem(this.world, this.physics));\n this.world.add(new _Collision_CollisionSystem__WEBPACK_IMPORTED_MODULE_11__.CollisionSystem(this.world, this.physics));\n this.world.add(_Input_PointerSystem__WEBPACK_IMPORTED_MODULE_12__.PointerSystem);\n this.world.add(_TileMap_IsometricEntitySystem__WEBPACK_IMPORTED_MODULE_13__.IsometricEntitySystem);\n // Draw\n this.world.add(_Graphics_OffscreenSystem__WEBPACK_IMPORTED_MODULE_14__.OffscreenSystem);\n this.world.add(_Graphics_GraphicsSystem__WEBPACK_IMPORTED_MODULE_15__.GraphicsSystem);\n this.world.add(_Debug_DebugSystem__WEBPACK_IMPORTED_MODULE_16__.DebugSystem);\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n /**\n * Event hook to provide Scenes a way of loading scene specific resources.\n *\n * This is called before the Scene.onInitialize during scene transition. It will only ever fire once for a scene.\n * @param loader\n */\n onPreLoad(loader) {\n // will be overridden\n }\n /**\n * Event hook fired directly before transition, either \"in\" or \"out\" of the scene\n *\n * This overrides the Engine scene definition. However transitions specified in goToScene take highest precedence\n *\n * ```typescript\n * // Overrides all\n * Engine.goToScene('scene', { destinationIn: ..., sourceOut: ... });\n * ```\n *\n * This can be used to configure custom transitions for a scene dynamically\n */\n onTransition(direction) {\n // will be overridden\n return undefined;\n }\n /**\n * This is called before the first update of the {@apilink Scene}. Initializes scene members like the camera. This method is meant to be\n * overridden. This is where initialization of child actors should take place.\n */\n onInitialize(engine) {\n // will be overridden\n }\n /**\n * This is called when the scene is made active and started. It is meant to be overridden,\n * this is where you should setup any DOM UI or event handlers needed for the scene.\n */\n onActivate(context) {\n // will be overridden\n }\n /**\n * This is called when the scene is made transitioned away from and stopped. It is meant to be overridden,\n * this is where you should cleanup any DOM UI or event handlers needed for the scene.\n */\n onDeactivate(context) {\n // will be overridden\n }\n /**\n * Safe to override onPreUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPreUpdate` is called directly before a scene is updated.\n * @param engine reference to the engine\n * @param elapsed Number of milliseconds elapsed since the last draw.\n */\n onPreUpdate(engine, elapsed) {\n // will be overridden\n }\n /**\n * Safe to override onPostUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPostUpdate` is called directly after a scene is updated.\n * @param engine reference to the engine\n * @param elapsed Number of milliseconds elapsed since the last draw.\n */\n onPostUpdate(engine, elapsed) {\n // will be overridden\n }\n /**\n * Safe to override onPreDraw lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPreDraw` is called directly before a scene is drawn.\n *\n */\n onPreDraw(ctx, elapsed) {\n // will be overridden\n }\n /**\n * Safe to override onPostDraw lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPostDraw` is called directly after a scene is drawn.\n *\n */\n onPostDraw(ctx, elapsed) {\n // will be overridden\n }\n /**\n * Initializes actors in the scene\n */\n _initializeChildren() {\n for (const child of this.entities) {\n child._initialize(this.engine);\n }\n }\n /**\n * Gets whether or not the {@apilink Scene} has been initialized\n */\n get isInitialized() {\n return this._isInitialized;\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Initializes the scene before the first update, meant to be called by engine not by users of\n * Excalibur\n * @internal\n */\n async _initialize(engine) {\n var _a;\n if (!this.isInitialized) {\n try {\n this.engine = engine;\n // PhysicsWorld config is watched so things will automagically update\n this.physics.config = this.engine.physics;\n this.input = new _Input_InputHost__WEBPACK_IMPORTED_MODULE_17__.InputHost({\n pointerTarget: engine.pointerScope === _Input_PointerScope__WEBPACK_IMPORTED_MODULE_18__.PointerScope.Canvas ? engine.canvas : document,\n grabWindowFocus: engine.grabWindowFocus,\n engine\n });\n // Initialize camera first\n this.camera._initialize(engine);\n this.world.systemManager.initialize();\n // This order is important! we want to be sure any custom init that add actors\n // fire before the actor init\n await this.onInitialize(engine);\n this._initializeChildren();\n this._logger.debug('Scene.onInitialize', this, engine);\n this.events.emit('initialize', new _Events__WEBPACK_IMPORTED_MODULE_19__.InitializeEvent(engine, this));\n }\n catch (e) {\n this._logger.error(`Error during scene initialization for scene ${(_a = engine.director) === null || _a === void 0 ? void 0 : _a.getSceneName(this)}!`);\n throw e;\n }\n this._isInitialized = true;\n }\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Activates the scene with the base behavior, then calls the overridable `onActivate` implementation.\n * @internal\n */\n async _activate(context) {\n var _a, _b;\n try {\n this._logger.debug('Scene.onActivate', this);\n this.input.toggleEnabled(true);\n await this.onActivate(context);\n }\n catch (e) {\n this._logger.error(`Error during scene activation for scene ${(_b = (_a = this.engine) === null || _a === void 0 ? void 0 : _a.director) === null || _b === void 0 ? void 0 : _b.getSceneName(this)}!`);\n throw e;\n }\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Deactivates the scene with the base behavior, then calls the overridable `onDeactivate` implementation.\n * @internal\n */\n async _deactivate(context) {\n this._logger.debug('Scene.onDeactivate', this);\n this.input.toggleEnabled(false);\n await this.onDeactivate(context);\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _preupdate handler for {@apilink onPreUpdate} lifecycle event\n * @internal\n */\n _preupdate(engine, elapsed) {\n this.emit('preupdate', new _Events__WEBPACK_IMPORTED_MODULE_19__.PreUpdateEvent(engine, elapsed, this));\n this.onPreUpdate(engine, elapsed);\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _preupdate handler for {@apilink onPostUpdate} lifecycle event\n * @internal\n */\n _postupdate(engine, elapsed) {\n this.emit('postupdate', new _Events__WEBPACK_IMPORTED_MODULE_19__.PostUpdateEvent(engine, elapsed, this));\n this.onPostUpdate(engine, elapsed);\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _predraw handler for {@apilink onPreDraw} lifecycle event\n * @internal\n */\n _predraw(ctx, elapsed) {\n this.emit('predraw', new _Events__WEBPACK_IMPORTED_MODULE_19__.PreDrawEvent(ctx, elapsed, this));\n this.onPreDraw(ctx, elapsed);\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _postdraw handler for {@apilink onPostDraw} lifecycle event\n * @internal\n */\n _postdraw(ctx, elapsed) {\n this.emit('postdraw', new _Events__WEBPACK_IMPORTED_MODULE_19__.PostDrawEvent(ctx, elapsed, this));\n this.onPostDraw(ctx, elapsed);\n }\n /**\n * Updates all the actors and timers in the scene. Called by the {@apilink Engine}.\n * @param engine Reference to the current Engine\n * @param elapsed The number of milliseconds since the last update\n */\n update(engine, elapsed) {\n var _a;\n if (!this.isInitialized) {\n this._logger.warnOnce(`Scene update called before initialize for scene ${(_a = engine.director) === null || _a === void 0 ? void 0 : _a.getSceneName(this)}!`);\n return;\n }\n this._preupdate(engine, elapsed);\n // TODO differed entity removal for timers\n let i, len;\n // Remove timers in the cancel queue before updating them\n for (i = 0, len = this._cancelQueue.length; i < len; i++) {\n this.removeTimer(this._cancelQueue[i]);\n }\n this._cancelQueue.length = 0;\n // Cycle through timers updating timers\n for (const timer of this._timers) {\n timer.update(elapsed);\n }\n this.world.update(_EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_20__.SystemType.Update, elapsed);\n // Camera last keeps renders smooth that are based on entity/actor\n if (this.camera) {\n this.camera.update(engine, elapsed);\n }\n this._collectActorStats(engine);\n this._postupdate(engine, elapsed);\n this.input.update();\n }\n /**\n * Draws all the actors in the Scene. Called by the {@apilink Engine}.\n * @param ctx The current rendering context\n * @param elapsed The number of milliseconds since the last draw\n */\n draw(ctx, elapsed) {\n var _a;\n if (!this.isInitialized) {\n this._logger.warnOnce(`Scene draw called before initialize!`);\n return;\n }\n this._predraw(ctx, elapsed);\n this.world.update(_EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_20__.SystemType.Draw, elapsed);\n if ((_a = this.engine) === null || _a === void 0 ? void 0 : _a.isDebug) {\n this.debugDraw(ctx);\n }\n this._postdraw(ctx, elapsed);\n }\n /**\n * Draws all the actors' debug information in the Scene. Called by the {@apilink Engine}.\n * @param ctx The current rendering context\n */\n /* istanbul ignore next */\n debugDraw(ctx) {\n this.emit('predebugdraw', new _Events__WEBPACK_IMPORTED_MODULE_19__.PreDebugDrawEvent(ctx, this));\n // pass\n this.emit('postdebugdraw', new _Events__WEBPACK_IMPORTED_MODULE_19__.PostDebugDrawEvent(ctx, this));\n }\n /**\n * Checks whether an actor is contained in this scene or not\n */\n contains(actor) {\n return this.actors.indexOf(actor) > -1;\n }\n add(entity) {\n this.emit('entityadded', { target: entity });\n this.world.add(entity);\n entity.scene = this;\n if (entity instanceof _Timer__WEBPACK_IMPORTED_MODULE_21__.Timer) {\n if (!_Util_Util__WEBPACK_IMPORTED_MODULE_22__.contains(this._timers, entity)) {\n this.addTimer(entity);\n }\n return;\n }\n }\n /**\n * Removes an {@apilink Entity} (Actor, TileMap, Trigger, etc) or {@apilink Timer} from it's current scene\n * and adds it to this scene.\n *\n * Useful if you want to have an object be present in only 1 scene at a time.\n * @param entity\n */\n transfer(entity) {\n let scene;\n if (entity instanceof _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_23__.Entity && entity.scene && entity.scene !== this) {\n scene = entity.scene;\n entity.scene.world.remove(entity, false);\n }\n if (entity instanceof _Timer__WEBPACK_IMPORTED_MODULE_21__.Timer && entity.scene) {\n scene = entity.scene;\n entity.scene.removeTimer(entity);\n }\n scene === null || scene === void 0 ? void 0 : scene.emit('entityremoved', { target: entity });\n this.add(entity);\n }\n remove(entity) {\n if (entity instanceof _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_23__.Entity) {\n this.emit('entityremoved', { target: entity });\n if (entity.isActive) {\n entity.kill();\n }\n this.world.remove(entity);\n }\n if (entity instanceof _Timer__WEBPACK_IMPORTED_MODULE_21__.Timer) {\n this.removeTimer(entity);\n }\n }\n /**\n * Removes all entities and timers from the scene, optionally indicate whether deferred should or shouldn't be used.\n *\n * By default entities use deferred removal\n * @param deferred\n */\n clear(deferred = true) {\n for (let i = this.entities.length - 1; i >= 0; i--) {\n this.world.remove(this.entities[i], deferred);\n }\n for (let i = this.timers.length - 1; i >= 0; i--) {\n this.removeTimer(this.timers[i]);\n }\n }\n /**\n * Adds a {@apilink Timer} to the scene\n * @param timer The timer to add\n */\n addTimer(timer) {\n this._timers.push(timer);\n timer.scene = this;\n return timer;\n }\n /**\n * Removes a {@apilink Timer} from the scene.\n * @warning Can be dangerous, use {@apilink cancelTimer} instead\n * @param timer The timer to remove\n */\n removeTimer(timer) {\n const i = this._timers.indexOf(timer);\n if (i !== -1) {\n this._timers.splice(i, 1);\n }\n return timer;\n }\n /**\n * Cancels a {@apilink Timer}, removing it from the scene nicely\n * @param timer The timer to cancel\n */\n cancelTimer(timer) {\n this._cancelQueue.push(timer);\n return timer;\n }\n /**\n * Tests whether a {@apilink Timer} is active in the scene\n */\n isTimerActive(timer) {\n return this._timers.indexOf(timer) > -1 && !timer.complete;\n }\n isCurrentScene() {\n if (this.engine) {\n return this.engine.currentScene === this;\n }\n return false;\n }\n _collectActorStats(engine) {\n const actors = this.actors;\n for (let i = 0; i < actors.length; i++) {\n const actor = actors[i];\n if (actor instanceof _ScreenElement__WEBPACK_IMPORTED_MODULE_24__.ScreenElement) {\n engine.stats.currFrame.actors.ui++;\n }\n engine.stats.currFrame.actors.alive++;\n for (let j = 0; j < actor.children.length; j++) {\n const child = actor.children[j];\n if ((0,_ScreenElement__WEBPACK_IMPORTED_MODULE_24__.isScreenElement)(child)) {\n // TODO not true\n engine.stats.currFrame.actors.ui++;\n }\n else {\n engine.stats.currFrame.actors.alive++;\n }\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Screen.ts\":\n/*!*******************!*\\\n !*** ./Screen.ts ***!\n \\*******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DisplayMode: () => (/* binding */ DisplayMode),\n/* harmony export */ Resolution: () => (/* binding */ Resolution),\n/* harmony export */ Screen: () => (/* binding */ Screen),\n/* harmony export */ ScreenEvents: () => (/* binding */ ScreenEvents)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Collision_Index__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Collision/Index */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Util/Util */ \"./Util/Util.ts\");\n/* harmony import */ var _Graphics_Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Graphics/Context/ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _Graphics_Context_ExcaliburGraphicsContext2DCanvas__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Graphics/Context/ExcaliburGraphicsContext2DCanvas */ \"./Graphics/Context/ExcaliburGraphicsContext2DCanvas.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n\n\n\n\n/**\n * Enum representing the different display modes available to Excalibur.\n */\nvar DisplayMode;\n(function (DisplayMode) {\n /**\n * Default, use a specified resolution for the game. Like 800x600 pixels for example.\n */\n DisplayMode[\"Fixed\"] = \"Fixed\";\n /**\n * Fit the aspect ratio given by the game resolution within the container at all times will fill any gaps with canvas.\n * The displayed area outside the aspect ratio is not guaranteed to be on the screen, only the {@apilink Screen.contentArea}\n * is guaranteed to be on screen.\n */\n DisplayMode[\"FitContainerAndFill\"] = \"FitContainerAndFill\";\n /**\n * Fit the aspect ratio given by the game resolution the screen at all times will fill the screen.\n * This displayed area outside the aspect ratio is not guaranteed to be on the screen, only the {@apilink Screen.contentArea}\n * is guaranteed to be on screen.\n */\n DisplayMode[\"FitScreenAndFill\"] = \"FitScreenAndFill\";\n /**\n * Fit the viewport to the parent element maintaining aspect ratio given by the game resolution, but zooms in to avoid the black bars\n * (letterbox) that would otherwise be present in {@apilink FitContainer}.\n *\n * **warning** This will clip some drawable area from the user because of the zoom,\n * use {@apilink Screen.contentArea} to know the safe to draw area.\n */\n DisplayMode[\"FitContainerAndZoom\"] = \"FitContainerAndZoom\";\n /**\n * Fit the viewport to the device screen maintaining aspect ratio given by the game resolution, but zooms in to avoid the black bars\n * (letterbox) that would otherwise be present in {@apilink FitScreen}.\n *\n * **warning** This will clip some drawable area from the user because of the zoom,\n * use {@apilink Screen.contentArea} to know the safe to draw area.\n */\n DisplayMode[\"FitScreenAndZoom\"] = \"FitScreenAndZoom\";\n /**\n * Fit to screen using as much space as possible while maintaining aspect ratio and resolution.\n * This is not the same as {@apilink Screen.goFullScreen} but behaves in a similar way maintaining aspect ratio.\n *\n * You may want to center your game here is an example\n * ```html\n * \n * \n *
\n * \n *
\n * \n * ```\n *\n * ```css\n * // css\n * main {\n * display: flex;\n * align-items: center;\n * justify-content: center;\n * height: 100%;\n * width: 100%;\n * }\n * ```\n */\n DisplayMode[\"FitScreen\"] = \"FitScreen\";\n /**\n * Fill the entire screen's css width/height for the game resolution dynamically. This means the resolution of the game will\n * change dynamically as the window is resized. This is not the same as {@apilink Screen.goFullScreen}\n */\n DisplayMode[\"FillScreen\"] = \"FillScreen\";\n /**\n * Fit to parent element width/height using as much space as possible while maintaining aspect ratio and resolution.\n */\n DisplayMode[\"FitContainer\"] = \"FitContainer\";\n /**\n * Use the parent DOM container's css width/height for the game resolution dynamically\n */\n DisplayMode[\"FillContainer\"] = \"FillContainer\";\n})(DisplayMode || (DisplayMode = {}));\n/**\n * Convenience class for quick resolutions\n * Mostly sourced from https://emulation.gametechwiki.com/index.php/Resolution\n */\nclass Resolution {\n /* istanbul ignore next */\n static get SVGA() {\n return { width: 800, height: 600 };\n }\n /* istanbul ignore next */\n static get Standard() {\n return { width: 1920, height: 1080 };\n }\n /* istanbul ignore next */\n static get Atari2600() {\n return { width: 160, height: 192 };\n }\n /* istanbul ignore next */\n static get GameBoy() {\n return { width: 160, height: 144 };\n }\n /* istanbul ignore next */\n static get GameBoyAdvance() {\n return { width: 240, height: 160 };\n }\n /* istanbul ignore next */\n static get NintendoDS() {\n return { width: 256, height: 192 };\n }\n /* istanbul ignore next */\n static get NES() {\n return { width: 256, height: 224 };\n }\n /* istanbul ignore next */\n static get SNES() {\n return { width: 256, height: 244 };\n }\n}\nconst ScreenEvents = {\n ScreenResize: 'resize',\n PixelRatioChange: 'pixelratio',\n FullScreenChange: 'fullscreen'\n};\n/**\n * The Screen handles all aspects of interacting with the screen for Excalibur.\n */\nclass Screen {\n constructor(options) {\n var _a, _b, _c, _d;\n /**\n * Listen to screen events {@apilink ScreenEvents}\n */\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n this._antialiasing = true;\n this._canvasImageRendering = 'auto';\n this._resolutionStack = [];\n this._viewportStack = [];\n this._pixelRatioOverride = null;\n this._isFullscreen = false;\n this._isDisposed = false;\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this._fullscreenChangeHandler = () => {\n if (this._isDisposed) {\n return;\n }\n this._isFullscreen = !this._isFullscreen;\n this._logger.debug('Fullscreen Change', this._isFullscreen);\n this.events.emit('fullscreen', {\n fullscreen: this.isFullScreen\n });\n };\n this._pixelRatioChangeHandler = () => {\n if (this._isDisposed) {\n return;\n }\n this._logger.debug('Pixel Ratio Change', window.devicePixelRatio);\n this._listenForPixelRatio();\n this._devicePixelRatio = this._calculateDevicePixelRatio();\n this.applyResolutionAndViewport();\n this.events.emit('pixelratio', {\n pixelRatio: this.pixelRatio\n });\n };\n this._resizeHandler = () => {\n if (this._isDisposed) {\n return;\n }\n const parent = this.parent;\n this._logger.debug('View port resized');\n this._setResolutionAndViewportByDisplayMode(parent);\n this.applyResolutionAndViewport();\n // Emit resize event\n this.events.emit('resize', {\n resolution: this.resolution,\n viewport: this.viewport\n });\n };\n // Asking the window.devicePixelRatio is expensive we do it once\n this._devicePixelRatio = this._calculateDevicePixelRatio();\n this._contentArea = new _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox();\n this._unsafeArea = new _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox();\n this.viewport = options.viewport;\n this.resolution = (_a = options.resolution) !== null && _a !== void 0 ? _a : { ...this.viewport };\n this._contentResolution = this.resolution;\n this._displayMode = (_b = options.displayMode) !== null && _b !== void 0 ? _b : DisplayMode.Fixed;\n this._canvas = options.canvas;\n this.graphicsContext = options.context;\n this._antialiasing = (_c = options.antialiasing) !== null && _c !== void 0 ? _c : this._antialiasing;\n this._canvasImageRendering = (_d = options.canvasImageRendering) !== null && _d !== void 0 ? _d : this._canvasImageRendering;\n this._browser = options.browser;\n this._pixelRatioOverride = options.pixelRatio;\n this._applyDisplayMode();\n this._listenForPixelRatio();\n this._canvas.addEventListener('fullscreenchange', this._fullscreenChangeHandler);\n this.applyResolutionAndViewport();\n }\n _listenForPixelRatio() {\n if (this._mediaQueryList && !this._mediaQueryList.addEventListener) {\n // Safari <=13.1 workaround, remove any existing handlers\n this._mediaQueryList.removeListener(this._pixelRatioChangeHandler);\n }\n this._mediaQueryList = this._browser.window.nativeComponent.matchMedia(`(resolution: ${window.devicePixelRatio}dppx)`);\n // Safari <=13.1 workaround\n if (this._mediaQueryList.addEventListener) {\n this._mediaQueryList.addEventListener('change', this._pixelRatioChangeHandler, { once: true });\n }\n else {\n this._mediaQueryList.addListener(this._pixelRatioChangeHandler);\n }\n }\n dispose() {\n if (!this._isDisposed) {\n // Clean up handlers\n this._isDisposed = true;\n this.events.clear();\n this._browser.window.off('resize', this._resizeHandler);\n this._browser.window.clear();\n if (this._resizeObserver) {\n this._resizeObserver.disconnect();\n }\n this.parent.removeEventListener('resize', this._resizeHandler);\n // Safari <=13.1 workaround\n if (this._mediaQueryList.removeEventListener) {\n this._mediaQueryList.removeEventListener('change', this._pixelRatioChangeHandler);\n }\n else {\n this._mediaQueryList.removeListener(this._pixelRatioChangeHandler);\n }\n this._canvas.removeEventListener('fullscreenchange', this._fullscreenChangeHandler);\n this._canvas = null;\n }\n }\n _calculateDevicePixelRatio() {\n if (window.devicePixelRatio < 1) {\n return 1;\n }\n const devicePixelRatio = window.devicePixelRatio || 1;\n return devicePixelRatio;\n }\n /**\n * Returns the computed pixel ratio, first using any override, then the device pixel ratio\n */\n get pixelRatio() {\n if (this._pixelRatioOverride) {\n return this._pixelRatioOverride;\n }\n return this._devicePixelRatio;\n }\n /**\n * This calculates the ratio between excalibur pixels and the HTML pixels.\n *\n * This is useful for scaling HTML UI so that it matches your game.\n */\n get worldToPagePixelRatio() {\n if (this._canvas) {\n const pageOrigin = this.worldToPageCoordinates(_Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero);\n const pageDistance = this.worldToPageCoordinates((0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(1, 0)).sub(pageOrigin);\n const pixelConversion = pageDistance.x;\n return pixelConversion;\n }\n else {\n return 1;\n }\n }\n /**\n * Get or set the pixel ratio override\n *\n * You will need to call applyResolutionAndViewport() affect change on the screen\n */\n get pixelRatioOverride() {\n return this._pixelRatioOverride;\n }\n set pixelRatioOverride(value) {\n this._pixelRatioOverride = value;\n }\n get isHiDpi() {\n return this.pixelRatio !== 1;\n }\n get displayMode() {\n return this._displayMode;\n }\n get canvas() {\n return this._canvas;\n }\n get parent() {\n switch (this.displayMode) {\n case DisplayMode.FillContainer:\n case DisplayMode.FitContainer:\n case DisplayMode.FitContainerAndFill:\n case DisplayMode.FitContainerAndZoom:\n return this.canvas.parentElement || document.body;\n default:\n return window;\n }\n }\n get resolution() {\n return this._resolution;\n }\n set resolution(resolution) {\n this._resolution = resolution;\n }\n /**\n * Returns screen dimensions in pixels or percentage\n */\n get viewport() {\n if (this._viewport) {\n return this._viewport;\n }\n return this._resolution;\n }\n set viewport(viewport) {\n this._viewport = viewport;\n }\n get aspectRatio() {\n return this._resolution.width / this._resolution.height;\n }\n get scaledWidth() {\n return this._resolution.width * this.pixelRatio;\n }\n get scaledHeight() {\n return this._resolution.height * this.pixelRatio;\n }\n setCurrentCamera(camera) {\n this._camera = camera;\n }\n pushResolutionAndViewport() {\n this._resolutionStack.push(this.resolution);\n this._viewportStack.push(this.viewport);\n this.resolution = { ...this.resolution };\n this.viewport = { ...this.viewport };\n }\n peekViewport() {\n return this._viewportStack[this._viewportStack.length - 1];\n }\n peekResolution() {\n return this._resolutionStack[this._resolutionStack.length - 1];\n }\n popResolutionAndViewport() {\n if (this._resolutionStack.length && this._viewportStack.length) {\n this.resolution = this._resolutionStack.pop();\n this.viewport = this._viewportStack.pop();\n }\n }\n applyResolutionAndViewport() {\n if (this.graphicsContext instanceof _Graphics_Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_4__.ExcaliburGraphicsContextWebGL) {\n const scaledResolutionSupported = this.graphicsContext.checkIfResolutionSupported({\n width: this.scaledWidth,\n height: this.scaledHeight\n });\n if (!scaledResolutionSupported) {\n this._logger.warnOnce(`The currently configured resolution (${this.resolution.width}x${this.resolution.height}) and pixel ratio (${this.pixelRatio})` +\n ' are too large for the platform WebGL implementation, this may work but cause WebGL rendering to behave oddly.' +\n ' Try reducing the resolution or disabling Hi DPI scaling to avoid this' +\n ' (read more here https://excaliburjs.com/docs/screens#understanding-viewport--resolution).');\n // Attempt to recover if the user hasn't configured a specific ratio for up scaling\n if (!this.pixelRatioOverride) {\n let currentPixelRatio = Math.max(1, this.pixelRatio - 0.5);\n let newResolutionSupported = false;\n while (currentPixelRatio > 1 && !newResolutionSupported) {\n currentPixelRatio = Math.max(1, currentPixelRatio - 0.5);\n const width = this._resolution.width * currentPixelRatio;\n const height = this._resolution.height * currentPixelRatio;\n newResolutionSupported = this.graphicsContext.checkIfResolutionSupported({ width, height });\n }\n this.pixelRatioOverride = currentPixelRatio;\n this._logger.warnOnce('Scaled resolution too big attempted recovery!' +\n ` Pixel ratio was automatically reduced to (${this.pixelRatio}) to avoid 4k texture limit.` +\n ' Setting `ex.Engine({pixelRatio: ...}) will override any automatic recalculation, do so at your own risk.` ' +\n ' (read more here https://excaliburjs.com/docs/screens#understanding-viewport--resolution).');\n }\n }\n }\n this._canvas.width = this.scaledWidth;\n this._canvas.height = this.scaledHeight;\n if (this._canvasImageRendering === 'auto') {\n this._canvas.style.imageRendering = 'auto';\n }\n else {\n this._canvas.style.imageRendering = 'pixelated';\n // Fall back to 'crisp-edges' if 'pixelated' is not supported\n // Currently for firefox https://developer.mozilla.org/en-US/docs/Web/CSS/image-rendering\n if (this._canvas.style.imageRendering === '') {\n this._canvas.style.imageRendering = 'crisp-edges';\n }\n }\n const widthUnit = this.viewport.widthUnit === 'percent' ? '%' : 'px';\n const heightUnit = this.viewport.heightUnit === 'percent' ? '%' : 'px';\n this._canvas.style.width = this.viewport.width + widthUnit;\n this._canvas.style.height = this.viewport.height + heightUnit;\n // After messing with the canvas width/height the graphics context is invalidated and needs to have some properties reset\n this.graphicsContext.updateViewport(this.resolution);\n this.graphicsContext.resetTransform();\n this.graphicsContext.smoothing = this._antialiasing;\n if (this.graphicsContext instanceof _Graphics_Context_ExcaliburGraphicsContext2DCanvas__WEBPACK_IMPORTED_MODULE_5__.ExcaliburGraphicsContext2DCanvas) {\n this.graphicsContext.scale(this.pixelRatio, this.pixelRatio);\n }\n // Add the excalibur world pixel to page pixel\n document.documentElement.style.setProperty('--ex-pixel-ratio', this.worldToPagePixelRatio.toString());\n }\n /**\n * Get or set screen antialiasing,\n *\n * If true smoothing is applied\n */\n get antialiasing() {\n return this._antialiasing;\n }\n /**\n * Get or set screen antialiasing\n */\n set antialiasing(isSmooth) {\n this._antialiasing = isSmooth;\n this.graphicsContext.smoothing = this._antialiasing;\n }\n /**\n * Returns true if excalibur is fullscreen using the browser fullscreen api\n * @deprecated use isFullscreen()\n */\n get isFullScreen() {\n return this._isFullscreen;\n }\n /**\n * Returns true if excalibur is fullscreen using the browser fullscreen api\n */\n get isFullscreen() {\n return this._isFullscreen;\n }\n /**\n * Requests to go fullscreen using the browser fullscreen api, requires user interaction to be successful.\n * For example, wire this to a user click handler.\n *\n * Optionally specify a target element id to go fullscreen, by default the game canvas is used\n * @param elementId\n * @deprecated use enterFullscreen(...)\n */\n goFullScreen(elementId) {\n return this.enterFullscreen(elementId);\n }\n /**\n * Requests to enter fullscreen using the browser fullscreen api, requires user interaction to be successful.\n * For example, wire this to a user click handler.\n *\n * Optionally specify a target element id to go fullscreen, by default the game canvas is used\n * @param elementId\n */\n enterFullscreen(elementId) {\n if (elementId) {\n const maybeElement = document.getElementById(elementId);\n if (maybeElement) {\n if (!maybeElement.getAttribute('ex-fullscreen-listener')) {\n maybeElement.setAttribute('ex-fullscreen-listener', 'true');\n maybeElement.addEventListener('fullscreenchange', this._fullscreenChangeHandler);\n }\n const fullscreenPromise = maybeElement.requestFullscreen();\n return fullscreenPromise;\n }\n }\n return this._canvas.requestFullscreen();\n }\n /**\n * Requests to exit fullscreen using the browser fullscreen api\n * @deprecated use exitFullscreen()\n */\n exitFullScreen() {\n return this.exitFullscreen();\n }\n exitFullscreen() {\n return document.exitFullscreen();\n }\n _viewportToPixels(viewport) {\n return {\n width: viewport.widthUnit === 'percent' ? this.canvas.offsetWidth : viewport.width,\n height: viewport.heightUnit === 'percent' ? this.canvas.offsetHeight : viewport.height\n };\n }\n /**\n * Takes a coordinate in normal html page space, for example from a pointer move event, and translates it to\n * Excalibur screen space.\n *\n * Excalibur screen space starts at the top left (0, 0) corner of the viewport, and extends to the\n * bottom right corner (resolutionX, resolutionY). When using *AndFill suffixed display modes screen space\n * (0, 0) is the top left of the safe content area bounding box not the viewport.\n * @param point\n */\n pageToScreenCoordinates(point) {\n let newX = point.x;\n let newY = point.y;\n if (!this._isFullscreen) {\n newX -= (0,_Util_Util__WEBPACK_IMPORTED_MODULE_6__.getPosition)(this._canvas).x;\n newY -= (0,_Util_Util__WEBPACK_IMPORTED_MODULE_6__.getPosition)(this._canvas).y;\n }\n const viewport = this._viewportToPixels(this.viewport);\n // if fullscreen api on it centers with black bars\n // we need to adjust the screen to world coordinates in this case\n if (this._isFullscreen) {\n if (window.innerWidth / this.aspectRatio < window.innerHeight) {\n const screenHeight = window.innerWidth / this.aspectRatio;\n const screenMarginY = (window.innerHeight - screenHeight) / 2;\n newY = ((newY - screenMarginY) / screenHeight) * viewport.height;\n newX = (newX / window.innerWidth) * viewport.width;\n }\n else {\n const screenWidth = window.innerHeight * this.aspectRatio;\n const screenMarginX = (window.innerWidth - screenWidth) / 2;\n newX = ((newX - screenMarginX) / screenWidth) * viewport.width;\n newY = (newY / window.innerHeight) * viewport.height;\n }\n }\n newX = (newX / viewport.width) * this.resolution.width;\n newY = (newY / viewport.height) * this.resolution.height;\n // offset by content area\n newX = newX - this.contentArea.left;\n newY = newY - this.contentArea.top;\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(newX, newY);\n }\n /**\n * Takes a coordinate in Excalibur screen space, and translates it to normal html page space. For example,\n * this is where html elements might live if you want to position them relative to Excalibur.\n *\n * Excalibur screen space starts at the top left (0, 0) corner of the viewport, and extends to the\n * bottom right corner (resolutionX, resolutionY)\n * @param point\n */\n screenToPageCoordinates(point) {\n let newX = point.x;\n let newY = point.y;\n // no need to offset by content area, drawing is already offset by this\n const viewport = this._viewportToPixels(this.viewport);\n newX = (newX / this.resolution.width) * viewport.width;\n newY = (newY / this.resolution.height) * viewport.height;\n if (this._isFullscreen) {\n if (window.innerWidth / this.aspectRatio < window.innerHeight) {\n const screenHeight = window.innerWidth / this.aspectRatio;\n const screenMarginY = (window.innerHeight - screenHeight) / 2;\n newY = (newY / viewport.height) * screenHeight + screenMarginY;\n newX = (newX / viewport.width) * window.innerWidth;\n }\n else {\n const screenWidth = window.innerHeight * this.aspectRatio;\n const screenMarginX = (window.innerWidth - screenWidth) / 2;\n newX = (newX / viewport.width) * screenWidth + screenMarginX;\n newY = (newY / viewport.height) * window.innerHeight;\n }\n }\n if (!this._isFullscreen) {\n newX += (0,_Util_Util__WEBPACK_IMPORTED_MODULE_6__.getPosition)(this._canvas).x;\n newY += (0,_Util_Util__WEBPACK_IMPORTED_MODULE_6__.getPosition)(this._canvas).y;\n }\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(newX, newY);\n }\n /**\n * Takes a coordinate in Excalibur screen space, and translates it to Excalibur world space.\n *\n * World space is where {@apilink Entity | `entities`} in Excalibur live by default {@apilink CoordPlane.World}\n * and extends infinitely out relative from the {@apilink Camera}.\n * @param point Screen coordinate to convert\n */\n screenToWorldCoordinates(point) {\n // offset by content area\n point = point.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this.contentArea.left, this.contentArea.top));\n // the only difference between screen & world is the camera transform\n if (this._camera) {\n return this._camera.inverse.multiply(point);\n }\n return point.sub((0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this.resolution.width / 2, this.resolution.height / 2));\n }\n /**\n * Takes a coordinate in Excalibur world space, and translates it to Excalibur screen space.\n *\n * Screen space is where {@apilink ScreenElement | `screen elements`} and {@apilink Entity | `entities`} with {@apilink CoordPlane.Screen} live.\n * @param point World coordinate to convert\n */\n worldToScreenCoordinates(point) {\n if (this._camera) {\n return this._camera.transform.multiply(point);\n }\n return point.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this.resolution.width / 2, this.resolution.height / 2));\n }\n pageToWorldCoordinates(point) {\n const screen = this.pageToScreenCoordinates(point);\n return this.screenToWorldCoordinates(screen);\n }\n worldToPageCoordinates(point) {\n const screen = this.worldToScreenCoordinates(point);\n return this.screenToPageCoordinates(screen);\n }\n /**\n * Returns a BoundingBox of the top left corner of the screen\n * and the bottom right corner of the screen.\n *\n * World bounds are in world coordinates, useful for culling objects offscreen that are in world space\n */\n getWorldBounds() {\n const bounds = _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromDimension(this.resolution.width, this.resolution.height, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Half)\n .scale((0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(1 / this._camera.zoom, 1 / this._camera.zoom))\n .rotate(this._camera.rotation)\n .translate(this._camera.drawPos);\n return bounds;\n }\n /**\n * Returns a BoundingBox of the top left corner of the screen and the bottom right corner of the screen.\n *\n * Screen bounds are in screen coordinates, useful for culling objects offscreen that are in screen space\n */\n getScreenBounds() {\n const bounds = _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromDimension(this.resolution.width, this.resolution.height, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero);\n return bounds;\n }\n /**\n * The width of the game canvas in pixels (physical width component of the\n * resolution of the canvas element)\n */\n get canvasWidth() {\n return this.canvas.width;\n }\n /**\n * Returns half width of the game canvas in pixels (half physical width component)\n */\n get halfCanvasWidth() {\n return this.canvas.width / 2;\n }\n /**\n * The height of the game canvas in pixels, (physical height component of\n * the resolution of the canvas element)\n */\n get canvasHeight() {\n return this.canvas.height;\n }\n /**\n * Returns half height of the game canvas in pixels (half physical height component)\n */\n get halfCanvasHeight() {\n return this.canvas.height / 2;\n }\n /**\n * Returns the width of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get drawWidth() {\n if (this._camera) {\n return this.resolution.width / this._camera.zoom;\n }\n return this.resolution.width;\n }\n /**\n * Returns the width of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get width() {\n if (this._camera) {\n return this.resolution.width / this._camera.zoom;\n }\n return this.resolution.width;\n }\n /**\n * Returns half the width of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get halfDrawWidth() {\n return this.drawWidth / 2;\n }\n /**\n * Returns the height of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get drawHeight() {\n if (this._camera) {\n return this.resolution.height / this._camera.zoom;\n }\n return this.resolution.height;\n }\n get height() {\n if (this._camera) {\n return this.resolution.height / this._camera.zoom;\n }\n return this.resolution.height;\n }\n /**\n * Returns half the height of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get halfDrawHeight() {\n return this.drawHeight / 2;\n }\n /**\n * Returns screen center coordinates including zoom and device pixel ratio.\n */\n get center() {\n return (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this.halfDrawWidth, this.halfDrawHeight);\n }\n /**\n * Returns the content area in screen space where it is safe to place content\n */\n get contentArea() {\n return this._contentArea;\n }\n /**\n * Returns the unsafe area in screen space, this is the full screen and some space may not be onscreen.\n */\n get unsafeArea() {\n return this._unsafeArea;\n }\n _computeFit() {\n document.body.style.margin = '0px';\n document.body.style.overflow = 'hidden';\n const aspect = this.aspectRatio;\n let adjustedWidth = 0;\n let adjustedHeight = 0;\n if (window.innerWidth / aspect < window.innerHeight) {\n adjustedWidth = window.innerWidth;\n adjustedHeight = window.innerWidth / aspect;\n }\n else {\n adjustedWidth = window.innerHeight * aspect;\n adjustedHeight = window.innerHeight;\n }\n this.viewport = {\n width: adjustedWidth,\n height: adjustedHeight\n };\n this._contentArea = _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromDimension(this.resolution.width, this.resolution.height, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero);\n this._unsafeArea = _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromDimension(this.resolution.width, this.resolution.height, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero);\n this.events.emit('resize', {\n resolution: this.resolution,\n viewport: this.viewport\n });\n }\n _computeFitScreenAndFill() {\n document.body.style.margin = '0px';\n document.body.style.overflow = 'hidden';\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n this._computeFitAndFill(vw, vh);\n this.events.emit('resize', {\n resolution: this.resolution,\n viewport: this.viewport\n });\n }\n _computeFitContainerAndFill() {\n this.canvas.style.width = '100%';\n this.canvas.style.height = '100%';\n this._computeFitAndFill(this.canvas.offsetWidth, this.canvas.offsetHeight, {\n width: 100,\n widthUnit: 'percent',\n height: 100,\n heightUnit: 'percent'\n });\n this.events.emit('resize', {\n resolution: this.resolution,\n viewport: this.viewport\n });\n }\n _computeFitAndFill(vw, vh, viewport) {\n this.viewport = viewport !== null && viewport !== void 0 ? viewport : {\n width: vw,\n height: vh\n };\n // if the current screen aspectRatio is less than the original aspectRatio\n if (vw / vh <= this._contentResolution.width / this._contentResolution.height) {\n // compute new resolution to match the original aspect ratio\n this.resolution = {\n width: (vw * this._contentResolution.width) / vw,\n height: (((vw * this._contentResolution.width) / vw) * vh) / vw\n };\n const clip = (this.resolution.height - this._contentResolution.height) / 2;\n this._contentArea = new _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox({\n top: clip,\n left: 0,\n right: this._contentResolution.width,\n bottom: this.resolution.height - clip\n });\n this._unsafeArea = new _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox({\n top: -clip,\n left: 0,\n right: this._contentResolution.width,\n bottom: this.resolution.height + clip\n });\n }\n else {\n this.resolution = {\n width: (((vh * this._contentResolution.height) / vh) * vw) / vh,\n height: (vh * this._contentResolution.height) / vh\n };\n const clip = (this.resolution.width - this._contentResolution.width) / 2;\n this._contentArea = new _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox({\n top: 0,\n left: clip,\n right: this.resolution.width - clip,\n bottom: this._contentResolution.height\n });\n this._unsafeArea = new _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox({\n top: 0,\n left: -clip,\n right: this.resolution.width + clip,\n bottom: this._contentResolution.height\n });\n }\n }\n _computeFitScreenAndZoom() {\n document.body.style.margin = '0px';\n document.body.style.overflow = 'hidden';\n this.canvas.style.position = 'absolute';\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n this._computeFitAndZoom(vw, vh);\n this.events.emit('resize', {\n resolution: this.resolution,\n viewport: this.viewport\n });\n }\n _computeFitContainerAndZoom() {\n this.canvas.style.width = '100%';\n this.canvas.style.height = '100%';\n this.canvas.style.position = 'relative';\n const parent = this.canvas.parentElement;\n parent.style.overflow = 'hidden';\n const { offsetWidth: vw, offsetHeight: vh } = this.canvas;\n this._computeFitAndZoom(vw, vh);\n this.events.emit('resize', {\n resolution: this.resolution,\n viewport: this.viewport\n });\n }\n _computeFitAndZoom(vw, vh) {\n const aspect = this.aspectRatio;\n let adjustedWidth = 0;\n let adjustedHeight = 0;\n if (vw / aspect < vh) {\n adjustedWidth = vw;\n adjustedHeight = vw / aspect;\n }\n else {\n adjustedWidth = vh * aspect;\n adjustedHeight = vh;\n }\n const scaleX = vw / adjustedWidth;\n const scaleY = vh / adjustedHeight;\n const maxScaleFactor = Math.max(scaleX, scaleY);\n const zoomedWidth = adjustedWidth * maxScaleFactor;\n const zoomedHeight = adjustedHeight * maxScaleFactor;\n // Center zoomed dimension if bigger than the screen\n if (zoomedWidth > vw) {\n this.canvas.style.left = -(zoomedWidth - vw) / 2 + 'px';\n }\n else {\n this.canvas.style.left = '';\n }\n if (zoomedHeight > vh) {\n this.canvas.style.top = -(zoomedHeight - vh) / 2 + 'px';\n }\n else {\n this.canvas.style.top = '';\n }\n this.viewport = {\n width: zoomedWidth,\n height: zoomedHeight\n };\n const bounds = _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromDimension(this.viewport.width, this.viewport.height, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero);\n // return safe area\n if (this.viewport.width > vw) {\n const clip = ((this.viewport.width - vw) / this.viewport.width) * this.resolution.width;\n bounds.top = 0;\n bounds.left = clip / 2;\n bounds.right = this.resolution.width - clip / 2;\n bounds.bottom = this.resolution.height;\n }\n if (this.viewport.height > vh) {\n const clip = ((this.viewport.height - vh) / this.viewport.height) * this.resolution.height;\n bounds.top = clip / 2;\n bounds.left = 0;\n bounds.bottom = this.resolution.height - clip / 2;\n bounds.right = this.resolution.width;\n }\n this._contentArea = bounds;\n }\n _computeFitContainer() {\n const aspect = this.aspectRatio;\n let adjustedWidth = 0;\n let adjustedHeight = 0;\n let widthUnit = 'pixel';\n let heightUnit = 'pixel';\n const parent = this.canvas.parentElement;\n if (parent.clientWidth / aspect < parent.clientHeight) {\n this.canvas.style.width = '100%';\n adjustedWidth = 100;\n widthUnit = 'percent';\n adjustedHeight = this.canvas.offsetWidth / aspect;\n }\n else {\n this.canvas.style.height = '100%';\n adjustedHeight = 100;\n heightUnit = 'percent';\n adjustedWidth = this.canvas.offsetHeight * aspect;\n }\n this.viewport = {\n width: adjustedWidth,\n widthUnit,\n height: adjustedHeight,\n heightUnit\n };\n this._contentArea = _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromDimension(this.resolution.width, this.resolution.height, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero);\n this.events.emit('resize', {\n resolution: this.resolution,\n viewport: this.viewport\n });\n }\n _applyDisplayMode() {\n this._setResolutionAndViewportByDisplayMode(this.parent);\n // watch resizing\n if (this.parent instanceof Window) {\n this._browser.window.on('resize', this._resizeHandler);\n }\n else {\n this._resizeObserver = new ResizeObserver(() => {\n this._resizeHandler();\n });\n this._resizeObserver.observe(this.parent);\n }\n this.parent.addEventListener('resize', this._resizeHandler);\n }\n /**\n * Sets the resolution and viewport based on the selected display mode.\n */\n _setResolutionAndViewportByDisplayMode(parent) {\n if (this.displayMode === DisplayMode.FillContainer) {\n this.canvas.style.width = '100%';\n this.canvas.style.height = '100%';\n this.viewport = {\n width: 100,\n widthUnit: 'percent',\n height: 100,\n heightUnit: 'percent'\n };\n this.resolution = {\n width: this.canvas.offsetWidth,\n height: this.canvas.offsetHeight\n };\n }\n if (this.displayMode === DisplayMode.FillScreen) {\n document.body.style.margin = '0px';\n document.body.style.overflow = 'hidden';\n this.resolution = {\n width: parent.innerWidth,\n height: parent.innerHeight\n };\n this.viewport = this.resolution;\n }\n this._contentArea = _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromDimension(this.resolution.width, this.resolution.height, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero);\n if (this.displayMode === DisplayMode.FitScreen) {\n this._computeFit();\n }\n if (this.displayMode === DisplayMode.FitContainer) {\n this._computeFitContainer();\n }\n if (this.displayMode === DisplayMode.FitScreenAndFill) {\n this._computeFitScreenAndFill();\n }\n if (this.displayMode === DisplayMode.FitContainerAndFill) {\n this._computeFitContainerAndFill();\n }\n if (this.displayMode === DisplayMode.FitScreenAndZoom) {\n this._computeFitScreenAndZoom();\n }\n if (this.displayMode === DisplayMode.FitContainerAndZoom) {\n this._computeFitContainerAndZoom();\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./ScreenElement.ts\":\n/*!**************************!*\\\n !*** ./ScreenElement.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ScreenElement: () => (/* binding */ ScreenElement),\n/* harmony export */ isScreenElement: () => (/* binding */ isScreenElement)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Actor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Actor */ \"./Actor.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Collision/CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Math/coord-plane */ \"./Math/coord-plane.ts\");\n\n\n\n\n\n/**\n * Type guard to detect a screen element\n */\nfunction isScreenElement(actor) {\n return actor instanceof ScreenElement;\n}\n/**\n * Helper {@apilink Actor} primitive for drawing UI's, optimized for UI drawing. Does\n * not participate in collisions. Drawn on top of all other actors.\n */\nclass ScreenElement extends _Actor__WEBPACK_IMPORTED_MODULE_0__.Actor {\n constructor(config) {\n var _a, _b;\n super({ ...config });\n this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).coordPlane = _Math_coord_plane__WEBPACK_IMPORTED_MODULE_2__.CoordPlane.Screen;\n this.anchor = (_a = config === null || config === void 0 ? void 0 : config.anchor) !== null && _a !== void 0 ? _a : (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(0, 0);\n this.body.collisionType = (_b = config === null || config === void 0 ? void 0 : config.collisionType) !== null && _b !== void 0 ? _b : _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.PreventCollision;\n this.pointer.useGraphicsBounds = true;\n this.pointer.useColliderShape = false;\n if (!(config === null || config === void 0 ? void 0 : config.collider) && (config === null || config === void 0 ? void 0 : config.width) > 0 && (config === null || config === void 0 ? void 0 : config.height) > 0) {\n this.collider.useBoxCollider(this.width, this.height, this.anchor);\n }\n }\n _initialize(engine) {\n this._engine = engine;\n super._initialize(engine);\n }\n contains(x, y, useWorld = true) {\n if (useWorld) {\n return super.contains(x, y);\n }\n const coords = this._engine.worldToScreenCoordinates(new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(x, y));\n return super.contains(coords.x, coords.y);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./TileMap/IsometricEntityComponent.ts\":\n/*!*********************************************!*\\\n !*** ./TileMap/IsometricEntityComponent.ts ***!\n \\*********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ IsometricEntityComponent: () => (/* binding */ IsometricEntityComponent)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Component */ \"./EntityComponentSystem/Component.ts\");\n\nclass IsometricEntityComponent extends _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n /**\n * Specify the isometric map to use to position this entity's z-index\n * @param mapOrOptions\n */\n constructor(mapOrOptions) {\n super();\n /**\n * Vertical \"height\" in the isometric world\n */\n this.elevation = 0;\n this.columns = mapOrOptions.columns;\n this.rows = mapOrOptions.rows;\n this.tileWidth = mapOrOptions.tileWidth;\n this.tileHeight = mapOrOptions.tileHeight;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./TileMap/IsometricEntitySystem.ts\":\n/*!******************************************!*\\\n !*** ./TileMap/IsometricEntitySystem.ts ***!\n \\******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ IsometricEntitySystem: () => (/* binding */ IsometricEntitySystem)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _IsometricEntityComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./IsometricEntityComponent */ \"./TileMap/IsometricEntityComponent.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Priority.ts\");\n\n\n\n\nclass IsometricEntitySystem extends _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.System {\n constructor(world) {\n super();\n this.world = world;\n this.systemType = _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.SystemType.Update;\n this.query = this.world.query([_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent, _IsometricEntityComponent__WEBPACK_IMPORTED_MODULE_2__.IsometricEntityComponent]);\n }\n update() {\n let transform;\n let iso;\n for (let i = 0; i < this.query.entities.length; i++) {\n const entity = this.query.entities[i];\n transform = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n iso = entity.get(_IsometricEntityComponent__WEBPACK_IMPORTED_MODULE_2__.IsometricEntityComponent);\n const maxZindexPerElevation = Math.max(iso.columns * iso.tileWidth, iso.rows * iso.tileHeight);\n const newZ = maxZindexPerElevation * iso.elevation + transform.pos.y;\n transform.z = newZ;\n }\n }\n}\nIsometricEntitySystem.priority = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_3__.SystemPriority.Lower;\n\n\n/***/ }),\n\n/***/ \"./TileMap/IsometricMap.ts\":\n/*!*********************************!*\\\n !*** ./TileMap/IsometricMap.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ IsometricMap: () => (/* binding */ IsometricMap),\n/* harmony export */ IsometricTile: () => (/* binding */ IsometricTile)\n/* harmony export */ });\n/* harmony import */ var _Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Collision/BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../Collision/ColliderComponent */ \"./Collision/ColliderComponent.ts\");\n/* harmony import */ var _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Collision/CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Collision_Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../Collision/Colliders/CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Graphics */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../Graphics */ \"./Graphics/DebugGraphicsComponent.ts\");\n/* harmony import */ var _IsometricEntityComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./IsometricEntityComponent */ \"./TileMap/IsometricEntityComponent.ts\");\n/* harmony import */ var _Input_PointerComponent__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../Input/PointerComponent */ \"./Input/PointerComponent.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Input_PointerEventsToObjectDispatcher__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../Input/PointerEventsToObjectDispatcher */ \"./Input/PointerEventsToObjectDispatcher.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass IsometricTile extends _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__.Entity {\n getGraphics() {\n return this._graphics;\n }\n /**\n * Tile graphics\n */\n addGraphic(graphic, options) {\n this._graphics.push(graphic);\n this._gfx.isVisible = this.map.isVisible;\n this._gfx.opacity = this.map.opacity;\n if (options === null || options === void 0 ? void 0 : options.offset) {\n this._gfx.offset = options.offset;\n }\n // TODO detect when this changes on the map and apply to all tiles\n this._gfx.localBounds = this._recalculateBounds();\n }\n _recalculateBounds() {\n let bounds = this._tileBounds.clone();\n for (const graphic of this._graphics) {\n const offset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(this.map.graphicsOffset.x - this.map.tileWidth / 2, this.map.graphicsOffset.y - (this.map.renderFromTopOfGraphic ? 0 : graphic.height - this.map.tileHeight));\n bounds = bounds.combine(graphic.localBounds.translate(offset));\n }\n return bounds;\n }\n removeGraphic(graphic) {\n const index = this._graphics.indexOf(graphic);\n if (index > -1) {\n this._graphics.splice(index, 1);\n }\n this._gfx.localBounds = this._recalculateBounds();\n }\n clearGraphics() {\n this._graphics.length = 0;\n this._gfx.isVisible = false;\n this._gfx.localBounds = this._recalculateBounds();\n }\n getColliders() {\n return this._colliders;\n }\n /**\n * Adds a collider to the IsometricTile\n *\n * **Note!** the {@apilink Tile.solid} must be set to true for it to act as a \"fixed\" collider\n * @param collider\n */\n addCollider(collider) {\n this._colliders.push(collider);\n this.map.flagCollidersDirty();\n }\n /**\n * Removes a collider from the IsometricTile\n * @param collider\n */\n removeCollider(collider) {\n const index = this._colliders.indexOf(collider);\n if (index > -1) {\n this._colliders.splice(index, 1);\n }\n this.map.flagCollidersDirty();\n }\n /**\n * Clears all colliders from the IsometricTile\n */\n clearColliders() {\n this._colliders.length = 0;\n this.map.flagCollidersDirty();\n }\n /**\n * Returns the top left corner of the {@apilink IsometricTile} in world space\n */\n get pos() {\n return this.map.tileToWorld((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(this.x, this.y));\n }\n /**\n * Returns the center of the {@apilink IsometricTile}\n */\n get center() {\n return this.pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, this.map.tileHeight / 2));\n }\n /**\n * Construct a new IsometricTile\n * @param x tile coordinate in x (not world position)\n * @param y tile coordinate in y (not world position)\n * @param graphicsOffset offset that tile should be shifted by (default (0, 0))\n * @param map reference to owning IsometricMap\n */\n constructor(x, y, graphicsOffset, map) {\n super([\n new _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent(),\n new _Graphics__WEBPACK_IMPORTED_MODULE_3__.GraphicsComponent({\n offset: graphicsOffset !== null && graphicsOffset !== void 0 ? graphicsOffset : _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero,\n onPostDraw: (gfx, elapsed) => this.draw(gfx, elapsed)\n }),\n new _IsometricEntityComponent__WEBPACK_IMPORTED_MODULE_4__.IsometricEntityComponent(map)\n ]);\n /**\n * Indicates whether this tile is solid\n */\n this.solid = false;\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_5__.EventEmitter();\n this._tileBounds = new _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox();\n this._graphics = [];\n /**\n * Tile colliders\n */\n this._colliders = [];\n /**\n * Arbitrary data storage per tile, useful for any game specific data\n */\n this.data = new Map();\n this.x = x;\n this.y = y;\n this.map = map;\n this._transform = this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n this._isometricEntityComponent = this.get(_IsometricEntityComponent__WEBPACK_IMPORTED_MODULE_4__.IsometricEntityComponent);\n const halfTileWidth = this.map.tileWidth / 2;\n const halfTileHeight = this.map.tileHeight / 2;\n // See https://clintbellanger.net/articles/isometric_math/ for formula\n // The x position shifts left with every y step\n const xPos = (this.x - this.y) * halfTileWidth;\n // The y position needs to go down with every x step\n const yPos = (this.x + this.y) * halfTileHeight;\n this._transform.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(xPos, yPos);\n this._isometricEntityComponent.elevation = map.elevation;\n this._gfx = this.get(_Graphics__WEBPACK_IMPORTED_MODULE_3__.GraphicsComponent);\n this._gfx.isVisible = false; // start not visible\n const totalWidth = this.map.tileWidth;\n const totalHeight = this.map.tileHeight;\n // initial guess at gfx bounds based on the tile\n const offset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, this.map.renderFromTopOfGraphic ? totalHeight : 0);\n this._gfx.localBounds = this._tileBounds = new _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox({\n left: -totalWidth / 2,\n top: -totalHeight,\n right: totalWidth / 2,\n bottom: totalHeight\n }).translate(offset);\n }\n draw(gfx, _elapsed) {\n const halfTileWidth = this.map.tileWidth / 2;\n gfx.save();\n // shift left origin to corner of map, not the left corner of the first sprite\n gfx.translate(-halfTileWidth, 0);\n for (const graphic of this._graphics) {\n graphic.draw(gfx, this.map.graphicsOffset.x, this.map.graphicsOffset.y - (this.map.renderFromTopOfGraphic ? 0 : graphic.height - this.map.tileHeight));\n }\n gfx.restore();\n }\n}\n/**\n * The IsometricMap is a special tile map that provides isometric rendering support to Excalibur\n *\n * The tileWidth and tileHeight should be the height and width in pixels of the parallelogram of the base of the tile art asset.\n * The tileWidth and tileHeight is not necessarily the same as your graphic pixel width and height.\n *\n * Please refer to the docs https://excaliburjs.com for more details calculating what your tile width and height should be given\n * your art assets.\n */\nclass IsometricMap extends _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__.Entity {\n /**\n * Whether tiles should be visible\n * @deprecated use isVisible\n */\n get visible() {\n return this.isVisible;\n }\n /**\n * Whether tiles should be visible\n * @deprecated use isVisible\n */\n set visible(val) {\n this.isVisible = val;\n }\n constructor(options) {\n super([\n new _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent(),\n new _Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_7__.BodyComponent({\n type: _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_8__.CollisionType.Fixed\n }),\n new _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_9__.ColliderComponent(),\n new _Input_PointerComponent__WEBPACK_IMPORTED_MODULE_10__.PointerComponent(),\n new _Graphics__WEBPACK_IMPORTED_MODULE_11__.DebugGraphicsComponent((ctx, debugFlags) => this.debug(ctx, debugFlags), false)\n ], options.name);\n this.elevation = 0;\n /**\n * Whether tiles should be visible\n */\n this.isVisible = true;\n /**\n * Opacity of tiles\n */\n this.opacity = 1.0;\n /**\n * Render the tile graphic from the top instead of the bottom\n *\n * default is `false` meaning rendering from the bottom\n */\n this.renderFromTopOfGraphic = false;\n this.graphicsOffset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0);\n this._collidersDirty = false;\n this._originalOffsets = new WeakMap();\n const { pos, tileWidth, tileHeight, columns: width, rows: height, renderFromTopOfGraphic, graphicsOffset, elevation } = options;\n this.transform = this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n if (pos) {\n this.transform.pos = pos;\n }\n this.collider = this.get(_Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_9__.ColliderComponent);\n if (this.collider) {\n this.collider.set((this._composite = new _Collision_Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_12__.CompositeCollider([])));\n }\n this.pointer = this.get(_Input_PointerComponent__WEBPACK_IMPORTED_MODULE_10__.PointerComponent);\n this.renderFromTopOfGraphic = renderFromTopOfGraphic !== null && renderFromTopOfGraphic !== void 0 ? renderFromTopOfGraphic : this.renderFromTopOfGraphic;\n this.graphicsOffset = graphicsOffset !== null && graphicsOffset !== void 0 ? graphicsOffset : this.graphicsOffset;\n this.elevation = elevation !== null && elevation !== void 0 ? elevation : this.elevation;\n this.tileWidth = tileWidth;\n this.tileHeight = tileHeight;\n this.columns = width;\n this.rows = height;\n this._pointerEventDispatcher = new _Input_PointerEventsToObjectDispatcher__WEBPACK_IMPORTED_MODULE_13__.PointerEventsToObjectDispatcher();\n this.tiles = new Array(width * height);\n // build up tile representation\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const tile = new IsometricTile(x, y, this.graphicsOffset, this);\n this.tiles[x + y * width] = tile;\n this.addChild(tile);\n this._pointerEventDispatcher.addObject(tile, (p) => this.getTileByPoint(p.worldPos) === tile, () => true);\n }\n }\n this.pointer.localBounds = _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox.fromDimension(tileWidth * width * this.transform.scale.x, tileHeight * height * this.transform.scale.y, (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0.5, 0));\n }\n /**\n * @internal\n */\n _processPointerToObject(receiver) {\n this._pointerEventDispatcher.processPointerToObject(receiver, this.tiles);\n }\n /**\n * @internal\n */\n _dispatchPointerEvents(receiver) {\n this._pointerEventDispatcher.dispatchEvents(receiver, this.tiles);\n }\n update() {\n if (this._collidersDirty) {\n this.updateColliders();\n this._collidersDirty = false;\n }\n this._pointerEventDispatcher.clear();\n }\n flagCollidersDirty() {\n this._collidersDirty = true;\n }\n _getOrSetColliderOriginalOffset(collider) {\n var _a;\n if (!this._originalOffsets.has(collider)) {\n const originalOffset = collider.offset;\n this._originalOffsets.set(collider, originalOffset);\n return originalOffset;\n }\n else {\n return (_a = this._originalOffsets.get(collider)) !== null && _a !== void 0 ? _a : _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n }\n }\n updateColliders() {\n this._composite.clearColliders();\n const pos = this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent).pos;\n for (const tile of this.tiles) {\n if (tile.solid) {\n for (const collider of tile.getColliders()) {\n const originalOffset = this._getOrSetColliderOriginalOffset(collider);\n collider.offset = this.tileToWorld((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(tile.x, tile.y))\n .sub(pos)\n .add(originalOffset)\n .sub((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(this.tileWidth / 2, this.tileHeight)); // We need to unshift height based on drawing\n collider.owner = this;\n this._composite.addCollider(collider);\n }\n }\n }\n this.collider.update();\n }\n /**\n * Convert world space coordinates to the tile x, y coordinate\n * @param worldCoordinate\n */\n worldToTile(worldCoordinate) {\n // TODO I don't think this handles parent transform see TileMap\n worldCoordinate = worldCoordinate.sub(this.transform.globalPos);\n const halfTileWidth = this.tileWidth / 2;\n const halfTileHeight = this.tileHeight / 2;\n // See https://clintbellanger.net/articles/isometric_math/ for formula\n return (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(~~((worldCoordinate.x / halfTileWidth + worldCoordinate.y / halfTileHeight) / 2), ~~((worldCoordinate.y / halfTileHeight - worldCoordinate.x / halfTileWidth) / 2));\n }\n /**\n * Given a tile coordinate, return the top left corner in world space\n * @param tileCoordinate\n */\n tileToWorld(tileCoordinate) {\n const halfTileWidth = this.tileWidth / 2;\n const halfTileHeight = this.tileHeight / 2;\n // The x position shifts left with every y step\n const xPos = (tileCoordinate.x - tileCoordinate.y) * halfTileWidth;\n // The y position needs to go down with every x step\n const yPos = (tileCoordinate.x + tileCoordinate.y) * halfTileHeight;\n return (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(xPos, yPos).add(this.transform.pos);\n }\n /**\n * Returns the {@apilink IsometricTile} by its x and y coordinates\n */\n getTile(x, y) {\n if (x < 0 || y < 0 || x >= this.columns || y >= this.rows) {\n return null;\n }\n return this.tiles[x + y * this.columns];\n }\n /**\n * Returns the {@apilink IsometricTile} by testing a point in world coordinates,\n * returns `null` if no Tile was found.\n */\n getTileByPoint(point) {\n const tileCoord = this.worldToTile(point);\n const tile = this.getTile(tileCoord.x, tileCoord.y);\n return tile;\n }\n _getMaxZIndex() {\n let maxZ = Number.NEGATIVE_INFINITY;\n for (const tile of this.tiles) {\n const currentZ = tile.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent).z;\n if (currentZ > maxZ) {\n maxZ = currentZ;\n }\n }\n return maxZ;\n }\n /**\n * Debug draw for IsometricMap, called internally by excalibur when debug mode is toggled on\n * @param gfx\n */\n debug(gfx, debugFlags) {\n const { showAll, showPosition, positionColor, positionSize, showGrid, gridColor, gridWidth, showColliderGeometry } = debugFlags.isometric;\n const { geometryColor, geometryLineWidth, geometryPointSize } = debugFlags.collider;\n gfx.save();\n gfx.z = this._getMaxZIndex() + 0.5;\n if (showAll || showGrid) {\n for (let y = 0; y < this.rows + 1; y++) {\n const left = this.tileToWorld((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, y));\n const right = this.tileToWorld((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(this.columns, y));\n gfx.drawLine(left, right, gridColor, gridWidth);\n }\n for (let x = 0; x < this.columns + 1; x++) {\n const top = this.tileToWorld((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(x, 0));\n const bottom = this.tileToWorld((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(x, this.rows));\n gfx.drawLine(top, bottom, gridColor, gridWidth);\n }\n }\n if (showAll || showPosition) {\n for (const tile of this.tiles) {\n gfx.drawCircle(this.tileToWorld((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(tile.x, tile.y)), positionSize, positionColor);\n }\n }\n if (showAll || showColliderGeometry) {\n for (const tile of this.tiles) {\n if (tile.solid) {\n // only draw solid tiles\n for (const collider of tile.getColliders()) {\n collider.debug(gfx, geometryColor, { lineWidth: geometryLineWidth, pointSize: geometryPointSize });\n }\n }\n }\n }\n gfx.restore();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./TileMap/TileMap.ts\":\n/*!****************************!*\\\n !*** ./TileMap/TileMap.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Tile: () => (/* binding */ Tile),\n/* harmony export */ TileMap: () => (/* binding */ TileMap),\n/* harmony export */ TileMapEvents: () => (/* binding */ TileMapEvents)\n/* harmony export */ });\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Collision/BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Collision/CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Collision_Colliders_Shape__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../Collision/Colliders/Shape */ \"./Collision/Colliders/Shape.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Graphics */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../Graphics */ \"./Graphics/ParallaxComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../Collision/ColliderComponent */ \"./Collision/ColliderComponent.ts\");\n/* harmony import */ var _Graphics_DebugGraphicsComponent__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../Graphics/DebugGraphicsComponent */ \"./Graphics/DebugGraphicsComponent.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../Math/coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Input_PointerComponent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../Input/PointerComponent */ \"./Input/PointerComponent.ts\");\n/* harmony import */ var _Input_PointerEventsToObjectDispatcher__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../Input/PointerEventsToObjectDispatcher */ \"./Input/PointerEventsToObjectDispatcher.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst TileMapEvents = {\n PreUpdate: 'preupdate',\n PostUpdate: 'postupdate',\n PreDraw: 'predraw',\n PostDraw: 'postdraw',\n PointerUp: 'pointerup',\n PointerDown: 'pointerdown',\n PointerMove: 'pointermove',\n PointerCancel: 'pointercancel'\n};\n/**\n * The TileMap provides a mechanism for doing flat 2D tiles rendered in a grid.\n *\n * TileMaps are useful for top down or side scrolling grid oriented games.\n */\nclass TileMap extends _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__.Entity {\n flagCollidersDirty() {\n this._collidersDirty = true;\n }\n flagTilesDirty() {\n for (let i = 0; i < this.tiles.length; i++) {\n if (this.tiles[i]) {\n this.tiles[i].flagDirty();\n }\n }\n }\n get x() {\n var _a;\n return (_a = this.transform.pos.x) !== null && _a !== void 0 ? _a : 0;\n }\n set x(val) {\n var _a;\n if ((_a = this.transform) === null || _a === void 0 ? void 0 : _a.pos) {\n this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(val, this.y);\n }\n }\n get y() {\n var _a, _b;\n return (_b = (_a = this.transform) === null || _a === void 0 ? void 0 : _a.pos.y) !== null && _b !== void 0 ? _b : 0;\n }\n set y(val) {\n var _a;\n if ((_a = this.transform) === null || _a === void 0 ? void 0 : _a.pos) {\n this.transform.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(this.x, val);\n }\n }\n get z() {\n var _a;\n return (_a = this.transform.z) !== null && _a !== void 0 ? _a : 0;\n }\n set z(val) {\n if (this.transform) {\n this.transform.z = val;\n }\n }\n get rotation() {\n var _a, _b;\n return (_b = (_a = this.transform) === null || _a === void 0 ? void 0 : _a.rotation) !== null && _b !== void 0 ? _b : 0;\n }\n set rotation(val) {\n if (this.transform) {\n this.transform.rotation = val;\n }\n }\n get scale() {\n var _a, _b;\n return (_b = (_a = this.transform) === null || _a === void 0 ? void 0 : _a.scale) !== null && _b !== void 0 ? _b : _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.One;\n }\n set scale(val) {\n var _a;\n if ((_a = this.transform) === null || _a === void 0 ? void 0 : _a.scale) {\n this.transform.scale = val;\n }\n }\n get pos() {\n return this.transform.pos;\n }\n set pos(val) {\n this.transform.pos = val;\n }\n get vel() {\n return this._motion.vel;\n }\n set vel(val) {\n this._motion.vel = val;\n }\n /**\n * Width of the whole tile map in pixels\n */\n get width() {\n return this.tileWidth * this.columns * this.scale.x;\n }\n /**\n * Height of the whole tilemap in pixels\n */\n get height() {\n return this.tileHeight * this.rows * this.scale.y;\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n /**\n * @param options\n */\n constructor(options) {\n var _a, _b, _c;\n super([], options.name);\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_3__.EventEmitter();\n this._token = 0;\n this.logger = _Util_Log__WEBPACK_IMPORTED_MODULE_4__.Logger.getInstance();\n this.tiles = [];\n this._rows = [];\n this._cols = [];\n this.renderFromTopOfGraphic = false;\n this.meshingLookBehind = 10;\n this._collidersDirty = true;\n this._oldRotation = 0;\n this._originalOffsets = new WeakMap();\n this.meshingLookBehind = (_a = options.meshingLookBehind) !== null && _a !== void 0 ? _a : this.meshingLookBehind;\n this.addComponent(new _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent());\n this.addComponent(new _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_5__.MotionComponent());\n this.addComponent(new _Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_6__.BodyComponent({\n type: _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_7__.CollisionType.Fixed\n }));\n this.addComponent(new _Graphics__WEBPACK_IMPORTED_MODULE_8__.GraphicsComponent({\n onPostDraw: (ctx, elapsed) => this.draw(ctx, elapsed)\n }));\n this.addComponent(new _Graphics_DebugGraphicsComponent__WEBPACK_IMPORTED_MODULE_9__.DebugGraphicsComponent((ctx, debugFlags) => this.debug(ctx, debugFlags), false));\n this.addComponent(new _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_10__.ColliderComponent());\n this.addComponent(new _Input_PointerComponent__WEBPACK_IMPORTED_MODULE_11__.PointerComponent());\n this.pointer = this.get(_Input_PointerComponent__WEBPACK_IMPORTED_MODULE_11__.PointerComponent);\n this._graphics = this.get(_Graphics__WEBPACK_IMPORTED_MODULE_8__.GraphicsComponent);\n this.transform = this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._motion = this.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_5__.MotionComponent);\n this.collider = this.get(_Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_10__.ColliderComponent);\n this._composite = this.collider.useCompositeCollider([]);\n this.transform.pos = (_b = options.pos) !== null && _b !== void 0 ? _b : _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero;\n this._oldPos = this.transform.pos.clone();\n this._oldScale = this.transform.scale.clone();\n this.renderFromTopOfGraphic = (_c = options.renderFromTopOfGraphic) !== null && _c !== void 0 ? _c : this.renderFromTopOfGraphic;\n this.tileWidth = options.tileWidth;\n this.tileHeight = options.tileHeight;\n this.rows = options.rows;\n this.columns = options.columns;\n this._pointerEventDispatcher = new _Input_PointerEventsToObjectDispatcher__WEBPACK_IMPORTED_MODULE_12__.PointerEventsToObjectDispatcher();\n this.tiles = new Array(this.rows * this.columns);\n this._rows = new Array(this.rows);\n this._cols = new Array(this.columns);\n let currentCol = [];\n for (let i = 0; i < this.columns; i++) {\n for (let j = 0; j < this.rows; j++) {\n const tile = new Tile({\n x: i,\n y: j,\n map: this\n });\n tile.map = this;\n this.tiles[i + j * this.columns] = tile;\n this._pointerEventDispatcher.addObject(tile, (vec) => {\n // TODO handle geometry/graphics\n return tile.bounds.contains(vec.worldPos);\n }, () => true);\n currentCol.push(tile);\n if (!this._rows[j]) {\n this._rows[j] = [];\n }\n this._rows[j].push(tile);\n }\n this._cols[i] = currentCol;\n currentCol = [];\n }\n this._graphics.localBounds = new _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_13__.BoundingBox({\n left: 0,\n top: 0,\n right: this.columns * this.tileWidth * this.scale.x,\n bottom: this.rows * this.tileHeight * this.scale.y\n });\n }\n _initialize(engine) {\n super._initialize(engine);\n this._engine = engine;\n }\n _getOrSetColliderOriginalOffset(collider) {\n var _a;\n if (!this._originalOffsets.has(collider)) {\n const originalOffset = collider.offset;\n this._originalOffsets.set(collider, originalOffset);\n return originalOffset;\n }\n else {\n return (_a = this._originalOffsets.get(collider)) !== null && _a !== void 0 ? _a : _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero;\n }\n }\n /**\n * Tiles colliders based on the solid tiles in the tilemap.\n */\n _updateColliders() {\n this.collider.$colliderRemoved.notifyAll(this._composite);\n this._composite.clearColliders();\n const colliders = [];\n this._composite = this.collider.useCompositeCollider([]);\n let current = null;\n /**\n * Returns wether or not the 2 boxes share an edge and are the same height\n * @param prev\n * @param next\n * @returns true if they share and edge, false if not\n */\n const shareEdges = (prev, next) => {\n if (prev && next) {\n // same top/bottom\n return (prev.top === next.top &&\n prev.bottom === next.bottom &&\n // Shared right/left edge\n prev.right === next.left);\n }\n return false;\n };\n /**\n * Potentially merges the current collider into a list of previous ones, mutating the list\n * If checkAndCombine returns true, the collider was successfully merged and should be thrown away\n * @param current current collider to test\n * @param colliders List of colliders to consider merging with\n * @param maxLookBack The amount of colliders to look back for combination\n * @returns false when no combination found, true when successfully combined\n */\n const checkAndCombine = (current, colliders, maxLookBack = this.meshingLookBehind) => {\n if (!current) {\n return false;\n }\n // walk backwards through the list of colliders and combine with the first that shares an edge\n for (let i = colliders.length - 1; i >= 0; i--) {\n if (maxLookBack-- < 0) {\n // blunt the O(n^2) algorithm a bit\n return false;\n }\n const prev = colliders[i];\n if (shareEdges(prev, current)) {\n colliders[i] = prev.combine(current);\n return true;\n }\n }\n return false;\n };\n // ? configurable bias perhaps, horizontal strips vs. vertical ones\n // Bad tile collider packing algorithm\n for (let i = 0; i < this.columns; i++) {\n // Scan column for colliders\n for (let j = 0; j < this.rows; j++) {\n const tile = this.tiles[i + j * this.columns];\n // Current tile in column is solid build up current collider\n if (tile.solid) {\n // Use custom collider otherwise bounding box\n if (tile.getColliders().length > 0) {\n // tile with custom collider interrupting the current run\n for (const collider of tile.getColliders()) {\n const originalOffset = this._getOrSetColliderOriginalOffset(collider);\n collider.offset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(tile.x * this.tileWidth * this.scale.x, tile.y * this.tileHeight * this.scale.y).add(originalOffset);\n collider.owner = this;\n this._composite.addCollider(collider);\n }\n //we push any current collider before nulling the current run\n if (current && !checkAndCombine(current, colliders)) {\n colliders.push(current);\n }\n current = null;\n // Use the bounding box\n }\n else {\n if (!current) {\n // no current run, start one\n current = tile.defaultGeometry;\n }\n else {\n // combine with current run\n current = current.combine(tile.defaultGeometry);\n }\n }\n }\n else {\n // Not solid skip and cut off the current collider\n // End of run check and combine\n if (current && !checkAndCombine(current, colliders)) {\n colliders.push(current);\n }\n current = null;\n }\n }\n // After a column is complete check to see if it can be merged into the last one\n // Eno of run check and combine\n if (current && !checkAndCombine(current, colliders)) {\n // else new collider if no combination\n colliders.push(current);\n }\n current = null;\n }\n for (const c of colliders) {\n const collider = _Collision_Colliders_Shape__WEBPACK_IMPORTED_MODULE_14__.Shape.Box(c.width, c.height, _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero, (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(c.left - this.pos.x, c.top - this.pos.y));\n collider.owner = this;\n this._composite.addCollider(collider);\n }\n this.collider.update();\n // Notify that colliders have been updated\n this.collider.$colliderAdded.notifyAll(this._composite);\n }\n /**\n * Returns the {@apilink Tile} by index (row major order)\n *\n * Returns null if out of bounds\n */\n getTileByIndex(index) {\n var _a;\n return (_a = this.tiles[index]) !== null && _a !== void 0 ? _a : null;\n }\n /**\n * Returns the {@apilink Tile} by its x and y integer coordinates\n *\n * Returns null if out of bounds\n *\n * For example, if I want the tile in fifth column (x), and second row (y):\n * `getTile(4, 1)` 0 based, so 0 is the first in row/column\n */\n getTile(x, y) {\n if (x < 0 || y < 0 || x >= this.columns || y >= this.rows) {\n return null;\n }\n return this.tiles[x + y * this.columns];\n }\n /**\n * Returns the {@apilink Tile} by testing a point in world coordinates,\n * returns `null` if no Tile was found.\n */\n getTileByPoint(point) {\n const { x, y } = this._getTileCoordinates(point);\n const tile = this.getTile(x, y);\n if (x >= 0 && y >= 0 && x < this.columns && y < this.rows && tile) {\n return tile;\n }\n return null;\n }\n _getTileCoordinates(point) {\n // Convert to Tile Space point\n point = this.transform.applyInverse(point);\n const x = Math.floor(point.x / this.tileWidth);\n const y = Math.floor(point.y / this.tileHeight);\n return { x, y };\n }\n getRows() {\n return this._rows;\n }\n getColumns() {\n return this._cols;\n }\n /**\n * Returns the on screen tiles for a tilemap, this will overshoot by a small amount because of the internal quad tree data structure.\n *\n * Useful if you need to perform specific logic on onscreen tiles\n */\n getOnScreenTiles() {\n let worldBounds = this._engine.screen.getWorldBounds();\n const maybeParallax = this.get(_Graphics__WEBPACK_IMPORTED_MODULE_15__.ParallaxComponent);\n if (maybeParallax && this.isInitialized) {\n let pos = this.pos;\n const oneMinusFactor = _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.One.sub(maybeParallax.parallaxFactor);\n const parallaxOffset = this._engine.currentScene.camera.pos.scale(oneMinusFactor);\n pos = pos.sub(parallaxOffset);\n // adjust world bounds by parallax factor\n worldBounds = worldBounds.translate(pos);\n }\n const bounds = this.transform.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_16__.CoordPlane.Screen ? this._engine.screen.getScreenBounds() : worldBounds;\n const topLeft = this._getTileCoordinates(bounds.topLeft);\n const topRight = this._getTileCoordinates(bounds.topRight);\n const bottomRight = this._getTileCoordinates(bounds.bottomRight);\n const bottomLeft = this._getTileCoordinates(bounds.bottomLeft);\n const tileStartX = Math.min((0,_Math_util__WEBPACK_IMPORTED_MODULE_17__.clamp)(topLeft.x, 0, this.columns - 1), (0,_Math_util__WEBPACK_IMPORTED_MODULE_17__.clamp)(topRight.x, 0, this.columns - 1));\n const tileStartY = Math.min((0,_Math_util__WEBPACK_IMPORTED_MODULE_17__.clamp)(topLeft.y, 0, this.rows - 1), (0,_Math_util__WEBPACK_IMPORTED_MODULE_17__.clamp)(topRight.y, 0, this.rows - 1));\n const tileEndX = Math.max((0,_Math_util__WEBPACK_IMPORTED_MODULE_17__.clamp)(bottomRight.x, 0, this.columns - 1), (0,_Math_util__WEBPACK_IMPORTED_MODULE_17__.clamp)(bottomLeft.x, 0, this.columns - 1));\n const tileEndY = Math.max((0,_Math_util__WEBPACK_IMPORTED_MODULE_17__.clamp)(bottomRight.y, 0, this.rows - 1), (0,_Math_util__WEBPACK_IMPORTED_MODULE_17__.clamp)(bottomLeft.y, 0, this.rows - 1));\n const tiles = [];\n for (let x = tileStartX; x <= tileEndX; x++) {\n for (let y = tileStartY; y <= tileEndY; y++) {\n tiles.push(this.getTile(x, y));\n }\n }\n return tiles;\n }\n /**\n * @internal\n */\n _processPointerToObject(receiver) {\n this._pointerEventDispatcher.processPointerToObject(receiver, this.tiles);\n }\n /**\n * @internal\n */\n _dispatchPointerEvents(receiver) {\n this._pointerEventDispatcher.dispatchEvents(receiver, this.tiles);\n }\n update(engine, elapsed) {\n this._initialize(engine);\n this.onPreUpdate(engine, elapsed);\n this.emit('preupdate', new _Events__WEBPACK_IMPORTED_MODULE_18__.PreUpdateEvent(engine, elapsed, this));\n // Update colliders\n if (!this._oldPos.equals(this.pos) || this._oldRotation !== this.rotation || !this._oldScale.equals(this.scale)) {\n this.flagCollidersDirty();\n this.flagTilesDirty();\n }\n if (this._collidersDirty) {\n this._collidersDirty = false;\n this._updateColliders();\n }\n // Clear last frame's events\n this._pointerEventDispatcher.clear();\n this._token++;\n this.pos.clone(this._oldPos);\n this._oldRotation = this.rotation;\n this.scale.clone(this._oldScale);\n this.transform.pos = this.pos;\n this.onPostUpdate(engine, elapsed);\n this.emit('postupdate', new _Events__WEBPACK_IMPORTED_MODULE_18__.PostUpdateEvent(engine, elapsed, this));\n }\n /**\n * Draws the tile map to the screen. Called by the {@apilink Scene}.\n * @param ctx ExcaliburGraphicsContext\n * @param elapsed The number of milliseconds since the last draw\n */\n draw(ctx, elapsed) {\n if (!this.isInitialized) {\n return;\n }\n this.emit('predraw', new _Events__WEBPACK_IMPORTED_MODULE_18__.PreDrawEvent(ctx, elapsed, this)); // TODO fix event\n let graphics, graphicsIndex, graphicsLen;\n const tiles = this.getOnScreenTiles();\n for (let i = 0; i < tiles.length; i++) {\n const tile = tiles[i];\n // get non-negative tile sprites\n const offsets = tile.getGraphicsOffsets();\n graphics = tile.getGraphics();\n for (graphicsIndex = 0, graphicsLen = graphics.length; graphicsIndex < graphicsLen; graphicsIndex++) {\n // draw sprite, warning if sprite doesn't exist\n const graphic = graphics[graphicsIndex];\n const offset = offsets[graphicsIndex];\n if (graphic) {\n if ((0,_Graphics__WEBPACK_IMPORTED_MODULE_8__.hasGraphicsTick)(graphic)) {\n graphic === null || graphic === void 0 ? void 0 : graphic.tick(elapsed, this._token);\n }\n const offsetY = this.renderFromTopOfGraphic ? 0 : graphic.height - this.tileHeight;\n graphic.draw(ctx, tile.x * this.tileWidth + offset.x, tile.y * this.tileHeight - offsetY + offset.y);\n }\n }\n }\n this.emit('postdraw', new _Events__WEBPACK_IMPORTED_MODULE_18__.PostDrawEvent(ctx, elapsed, this));\n }\n debug(gfx, debugFlags) {\n const { showAll, showGrid, gridColor, gridWidth, showSolidBounds: showColliderBounds, solidBoundsColor: colliderBoundsColor, showColliderGeometry } = debugFlags.tilemap;\n const { geometryColor, geometryLineWidth, geometryPointSize } = debugFlags.collider;\n const width = this.tileWidth * this.columns * this.scale.x;\n const height = this.tileHeight * this.rows * this.scale.y;\n const pos = this.pos;\n if (showGrid || showAll) {\n for (let r = 0; r < this.rows + 1; r++) {\n const yOffset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(0, r * this.tileHeight * this.scale.y);\n gfx.drawLine(pos.add(yOffset), pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(width, yOffset.y)), gridColor, gridWidth);\n }\n for (let c = 0; c < this.columns + 1; c++) {\n const xOffset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(c * this.tileWidth * this.scale.x, 0);\n gfx.drawLine(pos.add(xOffset), pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(xOffset.x, height)), gridColor, gridWidth);\n }\n }\n if (showAll || showColliderBounds || showColliderGeometry) {\n const colliders = this._composite.getColliders();\n gfx.save();\n gfx.translate(this.pos.x, this.pos.y);\n gfx.scale(this.scale.x, this.scale.y);\n for (const collider of colliders) {\n const bounds = collider.localBounds;\n const pos = collider.worldPos.sub(this.pos);\n if (showColliderBounds) {\n gfx.drawRectangle(pos, bounds.width, bounds.height, colliderBoundsColor);\n }\n }\n gfx.restore();\n if (showColliderGeometry) {\n for (const collider of colliders) {\n collider.debug(gfx, geometryColor, { lineWidth: geometryLineWidth, pointSize: geometryPointSize });\n }\n }\n }\n if (showAll || showColliderBounds) {\n gfx.save();\n gfx.z = 999;\n if (showColliderBounds) {\n for (let i = 0; i < this.tiles.length; i++) {\n this.tiles[i].bounds.draw(gfx);\n }\n }\n gfx.restore();\n }\n }\n}\n/**\n * TileMap Tile\n *\n * A light-weight object that occupies a space in a collision map. Generally\n * created by a {@apilink TileMap}.\n *\n * Tiles can draw multiple sprites. Note that the order of drawing is the order\n * of the sprites in the array so the last one will be drawn on top. You can\n * use transparency to create layers this way.\n */\nclass Tile {\n /**\n * Return the world position of the top left corner of the tile\n */\n get pos() {\n if (this._posDirty) {\n this._recalculate();\n this._posDirty = false;\n }\n return this._pos;\n }\n /**\n * Width of the tile in pixels\n */\n get width() {\n return this._width;\n }\n /**\n * Height of the tile in pixels\n */\n get height() {\n return this._height;\n }\n /**\n * Wether this tile should be treated as solid by the tilemap\n */\n get solid() {\n return this._solid;\n }\n /**\n * Wether this tile should be treated as solid by the tilemap\n */\n set solid(val) {\n var _a;\n (_a = this.map) === null || _a === void 0 ? void 0 : _a.flagCollidersDirty();\n this._solid = val;\n }\n /**\n * Current list of graphics for this tile\n */\n getGraphics() {\n return this._graphics;\n }\n /**\n * Current list of offsets for this tile's graphics\n */\n getGraphicsOffsets() {\n return this._offsets;\n }\n /**\n * Add another {@apilink Graphic} to this TileMap tile\n * @param graphic\n */\n addGraphic(graphic, options) {\n this._graphics.push(graphic);\n if (options === null || options === void 0 ? void 0 : options.offset) {\n this._offsets.push(options.offset);\n }\n else {\n this._offsets.push(_Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero);\n }\n }\n /**\n * Remove an instance of a {@apilink Graphic} from this tile\n */\n removeGraphic(graphic) {\n const index = this._graphics.indexOf(graphic);\n if (index > -1) {\n this._graphics.splice(index, 1);\n this._offsets.splice(index, 1);\n }\n }\n /**\n * Clear all graphics from this tile\n */\n clearGraphics() {\n this._graphics.length = 0;\n this._offsets.length = 0;\n }\n /**\n * Returns the list of colliders\n */\n getColliders() {\n return this._colliders;\n }\n /**\n * Adds a custom collider to the {@apilink Tile} to use instead of it's bounds\n *\n * If no collider is set but {@apilink Tile.solid} is set, the tile bounds are used as a collider.\n *\n * **Note!** the {@apilink Tile.solid} must be set to true for it to act as a \"fixed\" collider\n * @param collider\n */\n addCollider(collider) {\n this._colliders.push(collider);\n this.map.flagCollidersDirty();\n }\n /**\n * Removes a collider from the {@apilink Tile}\n * @param collider\n */\n removeCollider(collider) {\n const index = this._colliders.indexOf(collider);\n if (index > -1) {\n this._colliders.splice(index, 1);\n }\n this.map.flagCollidersDirty();\n }\n /**\n * Clears all colliders from the {@apilink Tile}\n */\n clearColliders() {\n this._colliders.length = 0;\n this.map.flagCollidersDirty();\n }\n constructor(options) {\n var _a, _b;\n this._posDirty = false;\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_3__.EventEmitter();\n this._solid = false;\n this._graphics = [];\n this._offsets = [];\n /**\n * Current list of colliders for this tile\n */\n this._colliders = [];\n /**\n * Arbitrary data storage per tile, useful for any game specific data\n */\n this.data = new Map();\n this.x = options.x;\n this.y = options.y;\n this.map = options.map;\n this._width = options.map.tileWidth * this.map.scale.x;\n this._height = options.map.tileHeight * this.map.scale.y;\n this.solid = (_a = options.solid) !== null && _a !== void 0 ? _a : this.solid;\n this._graphics = (_b = options.graphics) !== null && _b !== void 0 ? _b : [];\n this._recalculate();\n }\n flagDirty() {\n return (this._posDirty = true);\n }\n _recalculate() {\n const geometryPos = this.map.pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(this.x * this.map.tileWidth, this.y * this.map.tileHeight));\n this._geometry = new _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_13__.BoundingBox(geometryPos.x, geometryPos.y, geometryPos.x + this.map.tileWidth, geometryPos.y + this.map.tileHeight);\n this._width = this.map.tileWidth * this.map.scale.x;\n this._height = this.map.tileHeight * this.map.scale.y;\n this._pos = this.map.pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(this.x * this._width, this.y * this._height));\n this._bounds = new _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_13__.BoundingBox(this._pos.x, this._pos.y, this._pos.x + this._width, this._pos.y + this._height);\n if (this.map.rotation) {\n this._bounds = this._bounds.rotate(this.map.rotation, this.map.pos);\n }\n this._posDirty = false;\n }\n /**\n * Tile bounds in world space\n */\n get bounds() {\n if (this._posDirty) {\n this._recalculate();\n }\n return this._bounds;\n }\n get defaultGeometry() {\n return this._geometry;\n }\n /**\n * Tile position in world space\n */\n get center() {\n if (this._posDirty) {\n this._recalculate();\n }\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._pos.x + this._width / 2, this._pos.y + this._height / 2);\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n if (handler) {\n this.events.off(eventName, handler);\n }\n else {\n this.events.off(eventName);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./TileMap/index.ts\":\n/*!**************************!*\\\n !*** ./TileMap/index.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ IsometricEntityComponent: () => (/* reexport safe */ _IsometricEntityComponent__WEBPACK_IMPORTED_MODULE_2__.IsometricEntityComponent),\n/* harmony export */ IsometricEntitySystem: () => (/* reexport safe */ _IsometricEntitySystem__WEBPACK_IMPORTED_MODULE_3__.IsometricEntitySystem),\n/* harmony export */ IsometricMap: () => (/* reexport safe */ _IsometricMap__WEBPACK_IMPORTED_MODULE_1__.IsometricMap),\n/* harmony export */ IsometricTile: () => (/* reexport safe */ _IsometricMap__WEBPACK_IMPORTED_MODULE_1__.IsometricTile),\n/* harmony export */ Tile: () => (/* reexport safe */ _TileMap__WEBPACK_IMPORTED_MODULE_0__.Tile),\n/* harmony export */ TileMap: () => (/* reexport safe */ _TileMap__WEBPACK_IMPORTED_MODULE_0__.TileMap),\n/* harmony export */ TileMapEvents: () => (/* reexport safe */ _TileMap__WEBPACK_IMPORTED_MODULE_0__.TileMapEvents)\n/* harmony export */ });\n/* harmony import */ var _TileMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./TileMap */ \"./TileMap/TileMap.ts\");\n/* harmony import */ var _IsometricMap__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./IsometricMap */ \"./TileMap/IsometricMap.ts\");\n/* harmony import */ var _IsometricEntityComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./IsometricEntityComponent */ \"./TileMap/IsometricEntityComponent.ts\");\n/* harmony import */ var _IsometricEntitySystem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./IsometricEntitySystem */ \"./TileMap/IsometricEntitySystem.ts\");\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Timer.ts\":\n/*!******************!*\\\n !*** ./Timer.ts ***!\n \\******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Timer: () => (/* binding */ Timer)\n/* harmony export */ });\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Math_Random__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Math/Random */ \"./Math/Random.ts\");\n\n\n/**\n * The Excalibur timer hooks into the internal timer and fires callbacks,\n * after a certain interval, optionally repeating.\n */\nclass Timer {\n get complete() {\n return this._complete;\n }\n constructor(options) {\n var _a;\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance();\n this.id = 0;\n this._elapsedTime = 0;\n this._totalTimeAlive = 0;\n this._running = false;\n this._numberOfTicks = 0;\n this.interval = 10;\n this.repeats = false;\n this.maxNumberOfRepeats = -1;\n this.randomRange = [0, 0];\n this._baseInterval = 10;\n this._generateRandomInterval = () => {\n return this._baseInterval + this.random.integer(this.randomRange[0], this.randomRange[1]);\n };\n this._complete = false;\n this.scene = null;\n const fcn = (_a = options.action) !== null && _a !== void 0 ? _a : options.fcn;\n const interval = options.interval;\n const repeats = options.repeats;\n const numberOfRepeats = options.numberOfRepeats;\n const randomRange = options.randomRange;\n const random = options.random;\n if (!!numberOfRepeats && numberOfRepeats >= 0) {\n this.maxNumberOfRepeats = numberOfRepeats;\n if (!repeats) {\n throw new Error('repeats must be set to true if numberOfRepeats is set');\n }\n }\n this.id = Timer._MAX_ID++;\n this._callbacks = [];\n this._baseInterval = this.interval = interval;\n if (!!randomRange) {\n if (randomRange[0] > randomRange[1]) {\n throw new Error('min value must be lower than max value for range');\n }\n //We use the instance of ex.Random to generate the range\n this.random = random !== null && random !== void 0 ? random : new _Math_Random__WEBPACK_IMPORTED_MODULE_1__.Random();\n this.randomRange = randomRange;\n this.interval = this._generateRandomInterval();\n this.on(() => {\n this.interval = this._generateRandomInterval();\n });\n }\n this.repeats = repeats || this.repeats;\n if (fcn) {\n this.on(fcn);\n }\n }\n /**\n * Adds a new callback to be fired after the interval is complete\n * @param action The callback to be added to the callback list, to be fired after the interval is complete.\n */\n on(action) {\n this._callbacks.push(action);\n }\n /**\n * Removes a callback from the callback list to be fired after the interval is complete.\n * @param action The callback to be removed from the callback list, to be fired after the interval is complete.\n */\n off(action) {\n const index = this._callbacks.indexOf(action);\n this._callbacks.splice(index, 1);\n }\n /**\n * Updates the timer after a certain number of milliseconds have elapsed. This is used internally by the engine.\n * @param elapsed Number of elapsed milliseconds since the last update.\n */\n update(elapsed) {\n if (this._running) {\n this._totalTimeAlive += elapsed;\n this._elapsedTime += elapsed;\n if (this.maxNumberOfRepeats > -1 && this._numberOfTicks >= this.maxNumberOfRepeats) {\n this._complete = true;\n this._running = false;\n this._elapsedTime = 0;\n }\n if (!this.complete && this._elapsedTime >= this.interval) {\n this._callbacks.forEach((c) => {\n c.call(this);\n });\n this._numberOfTicks++;\n if (this.repeats) {\n this._elapsedTime = 0;\n }\n else {\n this._complete = true;\n this._running = false;\n this._elapsedTime = 0;\n }\n }\n }\n }\n /**\n * Resets the timer so that it can be reused, and optionally reconfigure the timers interval.\n *\n * Warning** you may need to call `timer.start()` again if the timer had completed\n * @param newInterval If specified, sets a new non-negative interval in milliseconds to refire the callback\n * @param newNumberOfRepeats If specified, sets a new non-negative upper limit to the number of time this timer executes\n */\n reset(newInterval, newNumberOfRepeats) {\n if (!!newInterval && newInterval >= 0) {\n this._baseInterval = this.interval = newInterval;\n }\n if (!!this.maxNumberOfRepeats && this.maxNumberOfRepeats >= 0) {\n this.maxNumberOfRepeats = newNumberOfRepeats;\n if (!this.repeats) {\n throw new Error('repeats must be set to true if numberOfRepeats is set');\n }\n }\n this._complete = false;\n this._elapsedTime = 0;\n this._numberOfTicks = 0;\n }\n get timesRepeated() {\n return this._numberOfTicks;\n }\n getTimeRunning() {\n return this._totalTimeAlive;\n }\n /**\n * @returns milliseconds until the next action callback, if complete will return 0\n */\n get timeToNextAction() {\n if (this.complete) {\n return 0;\n }\n return this.interval - this._elapsedTime;\n }\n /**\n * @returns milliseconds elapsed toward the next action\n */\n get timeElapsedTowardNextAction() {\n return this._elapsedTime;\n }\n get isRunning() {\n return this._running;\n }\n /**\n * Pauses the timer, time will no longer increment towards the next call\n */\n pause() {\n this._running = false;\n return this;\n }\n /**\n * Resumes the timer, time will now increment towards the next call.\n */\n resume() {\n this._running = true;\n return this;\n }\n /**\n * Starts the timer, if the timer was complete it will restart the timer and reset the elapsed time counter\n */\n start() {\n if (!this.scene) {\n this._logger.warn('Cannot start a timer not part of a scene, timer wont start until added');\n }\n this._running = true;\n if (this.complete) {\n this._complete = false;\n this._elapsedTime = 0;\n this._numberOfTicks = 0;\n }\n return this;\n }\n /**\n * Stops the timer and resets the elapsed time counter towards the next action invocation\n */\n stop() {\n this._running = false;\n this._elapsedTime = 0;\n this._numberOfTicks = 0;\n return this;\n }\n /**\n * Cancels the timer, preventing any further executions.\n */\n cancel() {\n this.pause();\n if (this.scene) {\n this.scene.cancelTimer(this);\n }\n }\n}\nTimer._MAX_ID = 0;\n\n\n/***/ }),\n\n/***/ \"./Trigger.ts\":\n/*!********************!*\\\n !*** ./Trigger.ts ***!\n \\********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Trigger: () => (/* binding */ Trigger),\n/* harmony export */ TriggerEvents: () => (/* binding */ TriggerEvents)\n/* harmony export */ });\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Events */ \"./Events.ts\");\n/* harmony import */ var _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Collision/CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Actor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Actor */ \"./Actor.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n\nconst TriggerEvents = {\n ExitTrigger: 'exit',\n EnterTrigger: 'enter'\n};\n/**\n * Triggers are a method of firing arbitrary code on collision. These are useful\n * as 'buttons', 'switches', or to trigger effects in a game. By default triggers\n * are invisible, and can only be seen when {@apilink Trigger.visible} is set to `true`.\n */\nclass Trigger extends _Actor__WEBPACK_IMPORTED_MODULE_0__.Actor {\n /**\n * @param options Trigger options\n */\n constructor(options) {\n var _a, _b, _c, _d;\n super({ ...options });\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_1__.EventEmitter();\n this.filter = (_a = options.filter) !== null && _a !== void 0 ? _a : (() => true);\n this.repeat = (_b = options.repeat) !== null && _b !== void 0 ? _b : -1;\n this.action = (_c = options.action) !== null && _c !== void 0 ? _c : (() => undefined);\n this.target = options.target;\n this.graphics.isVisible = (_d = options.visible) !== null && _d !== void 0 ? _d : false;\n this.body.collisionType = _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.Passive;\n this.events.on('collisionstart', ({ other: collider }) => {\n if (!this._matchesTarget(collider.owner)) {\n return;\n }\n this.events.emit('enter', new _Events__WEBPACK_IMPORTED_MODULE_3__.EnterTriggerEvent(this, collider.owner));\n this._dispatchAction(collider.owner);\n // remove trigger if its done, -1 repeat forever\n if (this.repeat === 0) {\n this.kill();\n }\n });\n this.events.on('collisionend', ({ other: collider }) => {\n if (this._matchesTarget(collider.owner)) {\n this.events.emit('exit', new _Events__WEBPACK_IMPORTED_MODULE_3__.ExitTriggerEvent(this, collider.owner));\n }\n });\n }\n _matchesTarget(entity) {\n return this.filter(entity) && (this.target === undefined || this.target === entity);\n }\n _dispatchAction(target) {\n if (this.repeat !== 0) {\n this.action.call(this, target);\n this.repeat--;\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Assert.ts\":\n/*!************************!*\\\n !*** ./Util/Assert.ts ***!\n \\************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ assert: () => (/* binding */ assert)\n/* harmony export */ });\n/**\n * Asserts will throw in `process.env.NODE_ENV === 'development'` builds if the expression evaluates false\n */\nfunction assert(message, expression) {\n if (true) {\n if (!expression()) {\n throw new Error(message);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Browser.ts\":\n/*!*************************!*\\\n !*** ./Util/Browser.ts ***!\n \\*************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BrowserComponent: () => (/* binding */ BrowserComponent),\n/* harmony export */ BrowserEvents: () => (/* binding */ BrowserEvents)\n/* harmony export */ });\nclass BrowserComponent {\n on(eventName, handler) {\n if (this._nativeHandlers[eventName]) {\n this.off(eventName, this._nativeHandlers[eventName]);\n }\n this._nativeHandlers[eventName] = this._decorate(handler);\n this.nativeComponent.addEventListener(eventName, this._nativeHandlers[eventName]);\n }\n off(eventName, handler) {\n if (!handler) {\n handler = this._nativeHandlers[eventName];\n }\n this.nativeComponent.removeEventListener(eventName, handler);\n this._nativeHandlers[eventName] = null;\n }\n _decorate(handler) {\n return (evt) => {\n if (!this._paused) {\n handler(evt);\n }\n };\n }\n pause() {\n this._paused = true;\n }\n resume() {\n this._paused = false;\n }\n clear() {\n for (const event in this._nativeHandlers) {\n this.off(event);\n }\n }\n constructor(nativeComponent) {\n this.nativeComponent = nativeComponent;\n this._paused = false;\n this._nativeHandlers = {};\n }\n}\nclass BrowserEvents {\n constructor(_windowGlobal, _documentGlobal) {\n this._windowGlobal = _windowGlobal;\n this._documentGlobal = _documentGlobal;\n this._windowComponent = new BrowserComponent(this._windowGlobal);\n this._documentComponent = new BrowserComponent(this._documentGlobal);\n }\n get window() {\n return this._windowComponent;\n }\n get document() {\n return this._documentComponent;\n }\n pause() {\n this.window.pause();\n this.document.pause();\n }\n resume() {\n this.window.resume();\n this.document.resume();\n }\n clear() {\n this.window.clear();\n this.document.clear();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Clock.ts\":\n/*!***********************!*\\\n !*** ./Util/Clock.ts ***!\n \\***********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Clock: () => (/* binding */ Clock),\n/* harmony export */ StandardClock: () => (/* binding */ StandardClock),\n/* harmony export */ TestClock: () => (/* binding */ TestClock)\n/* harmony export */ });\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Fps__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Fps */ \"./Util/Fps.ts\");\n\n\n/**\n * Abstract Clock is the base type of all Clocks\n *\n * It has a few opinions\n * 1. It manages the calculation of what \"elapsed\" time means and thus maximum fps\n * 2. The default timing api is implemented in now()\n *\n * To implement your own clock, extend Clock and override start/stop to start and stop the clock, then call update() with whatever\n * method is unique to your clock implementation.\n */\nclass Clock {\n constructor(options) {\n var _a, _b, _c;\n this._onFatalException = () => {\n /* default nothing */\n };\n this._maxFps = Infinity;\n this._lastTime = 0;\n this._elapsed = 1;\n this._scheduledCbs = [];\n this._totalElapsed = 0;\n this._options = options;\n this.tick = options.tick;\n this._lastTime = (_a = this.now()) !== null && _a !== void 0 ? _a : 0;\n this._maxFps = (_b = options.maxFps) !== null && _b !== void 0 ? _b : this._maxFps;\n this._onFatalException = (_c = options.onFatalException) !== null && _c !== void 0 ? _c : this._onFatalException;\n this.fpsSampler = new _Fps__WEBPACK_IMPORTED_MODULE_0__.FpsSampler({\n initialFps: 60,\n nowFn: () => this.now()\n });\n }\n /**\n * Get the elapsed time for the last completed frame\n */\n elapsed() {\n return this._elapsed;\n }\n /**\n * Get the current time in milliseconds\n */\n now() {\n return performance.now();\n }\n toTestClock() {\n const testClock = new TestClock({\n ...this._options,\n defaultUpdateMs: 16.6\n });\n return testClock;\n }\n toStandardClock() {\n const clock = new StandardClock({\n ...this._options\n });\n return clock;\n }\n setFatalExceptionHandler(handler) {\n this._onFatalException = handler;\n }\n /**\n * Schedule a callback to fire given a timeout in milliseconds using the excalibur {@apilink Clock}\n *\n * This is useful to use over the built in browser `setTimeout` because callbacks will be tied to the\n * excalibur update clock, instead of browser time, this means that callbacks wont fire if the game is\n * stopped or paused.\n * @param cb callback to fire\n * @param timeoutMs Optionally specify a timeout in milliseconds from now, default is 0ms which means the next possible tick\n * @param timing Optionally specify a timeout in milliseconds from now, default is 0ms which means the next possible tick\n */\n schedule(cb, timeoutMs = 0, timing = 'preframe') {\n // Scheduled based on internal elapsed time\n const scheduledTime = this._totalElapsed + timeoutMs;\n this._scheduledCbs.push([cb, scheduledTime, timing]);\n }\n /**\n * Called internally to trigger scheduled callbacks in the clock\n * @param timing\n * @internal\n */\n __runScheduledCbs(timing = 'preframe') {\n // walk backwards to delete items as we loop\n for (let i = this._scheduledCbs.length - 1; i > -1; i--) {\n if (timing === this._scheduledCbs[i][2] && this._scheduledCbs[i][1] <= this._totalElapsed) {\n this._scheduledCbs[i][0](this._elapsed);\n this._scheduledCbs.splice(i, 1);\n }\n }\n }\n update(overrideUpdateMs) {\n try {\n this.fpsSampler.start();\n // Get the time to calculate time-elapsed\n const now = this.now();\n let elapsed = now - this._lastTime || 1; // first frame\n // Constrain fps\n const fpsInterval = 1000 / this._maxFps;\n // only run frame if enough time has elapsed\n if (elapsed >= fpsInterval) {\n let leftover = 0;\n if (fpsInterval !== 0) {\n leftover = elapsed % fpsInterval;\n elapsed = elapsed - leftover; // shift elapsed to be \"in phase\" with the current loop fps\n }\n // Resolves issue #138 if the game has been paused, or blurred for\n // more than a 200 milliseconds, reset elapsed time to 1. This improves reliability\n // and provides more expected behavior when the engine comes back\n // into focus\n if (elapsed > 200) {\n elapsed = 1;\n }\n // tick the mainloop and run scheduled callbacks\n this._elapsed = overrideUpdateMs || elapsed;\n this._totalElapsed += this._elapsed;\n this.__runScheduledCbs('preframe');\n this.tick(overrideUpdateMs || elapsed);\n this.__runScheduledCbs('postframe');\n if (fpsInterval !== 0) {\n this._lastTime = now - leftover;\n }\n else {\n this._lastTime = now;\n }\n this.fpsSampler.end();\n }\n }\n catch (e) {\n this._onFatalException(e);\n this.stop();\n }\n }\n}\n/**\n * The {@apilink StandardClock} implements the requestAnimationFrame browser api to run the tick()\n */\nclass StandardClock extends Clock {\n constructor(options) {\n super(options);\n this._running = false;\n }\n isRunning() {\n return this._running;\n }\n start() {\n if (this._running) {\n return;\n }\n this._running = true;\n const mainloop = () => {\n // stop the loop\n if (!this._running) {\n return;\n }\n try {\n // request next loop\n this._requestId = window.requestAnimationFrame(mainloop);\n this.update();\n }\n catch (e) {\n window.cancelAnimationFrame(this._requestId);\n throw e;\n }\n };\n // begin the first frame\n mainloop();\n }\n stop() {\n window.cancelAnimationFrame(this._requestId);\n this._running = false;\n }\n}\n/**\n * The TestClock is meant for debugging interactions in excalibur that require precise timing to replicate or test\n */\nclass TestClock extends Clock {\n constructor(options) {\n super({\n ...options\n });\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this._running = false;\n this._currentTime = 0;\n this._updateMs = options.defaultUpdateMs;\n }\n /**\n * Get the current time in milliseconds\n */\n now() {\n var _a;\n return (_a = this._currentTime) !== null && _a !== void 0 ? _a : 0;\n }\n isRunning() {\n return this._running;\n }\n start() {\n this._running = true;\n }\n stop() {\n this._running = false;\n }\n /**\n * Manually step the clock forward 1 tick, optionally specify an elapsed time in milliseconds\n * @param overrideUpdateMs\n */\n step(overrideUpdateMs) {\n const time = overrideUpdateMs !== null && overrideUpdateMs !== void 0 ? overrideUpdateMs : this._updateMs;\n if (this._running) {\n // to be comparable to RAF this needs to be a full blown Task\n // For example, images cannot decode synchronously in a single step\n this.update(time);\n this._currentTime += time;\n }\n else {\n this._logger.warn('The clock is not running, no step will be performed');\n }\n }\n /**\n * Run a number of steps that tick the clock, optionally specify an elapsed time in milliseconds\n * @param numberOfSteps\n * @param overrideUpdateMs\n */\n run(numberOfSteps, overrideUpdateMs) {\n for (let i = 0; i < numberOfSteps; i++) {\n this.step(overrideUpdateMs !== null && overrideUpdateMs !== void 0 ? overrideUpdateMs : this._updateMs);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Coroutine.ts\":\n/*!***************************!*\\\n !*** ./Util/Coroutine.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ coroutine: () => (/* binding */ coroutine)\n/* harmony export */ });\n/* harmony import */ var _Context__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Context */ \"./Context.ts\");\n/* harmony import */ var _Engine__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Engine */ \"./Engine.ts\");\n/* harmony import */ var _Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Log */ \"./Util/Log.ts\");\n\n\n\nconst InsideCoroutineContext = (0,_Context__WEBPACK_IMPORTED_MODULE_0__.createContext)();\nconst generatorFunctionDeclaration = /^\\s*(?:function)?\\*/;\n/**\n *\n */\nfunction isCoroutineGenerator(x) {\n if (typeof x !== 'function') {\n return false;\n }\n if (generatorFunctionDeclaration.test(Function.prototype.toString.call(x))) {\n return true;\n }\n if (!Object.getPrototypeOf) {\n return false;\n }\n return Object.getPrototypeOf(x) === Object.getPrototypeOf(new Function('return function * () {}')());\n}\n/**\n *\n */\nfunction coroutine(...args) {\n var _a;\n const logger = _Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n let coroutineGenerator;\n let thisArg;\n let options;\n let passedEngine;\n // coroutine(coroutineGenerator: CoroutineGenerator, options?: CoroutineOptions): CoroutineInstance;\n if (isCoroutineGenerator(args[0])) {\n thisArg = globalThis;\n coroutineGenerator = args[0];\n options = args[1];\n }\n // coroutine(thisArg: any, coroutineGenerator: CoroutineGenerator, options?: CoroutineOptions): CoroutineInstance;\n if (isCoroutineGenerator(args[1])) {\n thisArg = args[0];\n coroutineGenerator = args[1];\n options = args[2];\n }\n // coroutine(thisArg: any, engine: Engine, coroutineGenerator: CoroutineGenerator, options?: CoroutineOptions): CoroutineInstance;\n if (args[1] instanceof _Engine__WEBPACK_IMPORTED_MODULE_2__.Engine) {\n thisArg = args[0];\n passedEngine = args[1];\n coroutineGenerator = args[2];\n options = args[3];\n }\n // coroutine(engine: Engine, coroutineGenerator: CoroutineGenerator, options?: CoroutineOptions): CoroutineInstance;\n if (args[0] instanceof _Engine__WEBPACK_IMPORTED_MODULE_2__.Engine) {\n thisArg = globalThis;\n passedEngine = args[0];\n coroutineGenerator = args[1];\n options = args[2];\n }\n const inside = (0,_Context__WEBPACK_IMPORTED_MODULE_0__.useContext)(InsideCoroutineContext);\n const schedule = options === null || options === void 0 ? void 0 : options.timing;\n const autostart = inside ? false : (_a = options === null || options === void 0 ? void 0 : options.autostart) !== null && _a !== void 0 ? _a : true;\n let engine;\n try {\n engine = passedEngine !== null && passedEngine !== void 0 ? passedEngine : _Engine__WEBPACK_IMPORTED_MODULE_2__.Engine.useEngine();\n }\n catch (_) {\n throw Error('Cannot run coroutine without engine parameter outside of an excalibur lifecycle method.\\n' +\n 'Pass an engine parameter to ex.coroutine(engine, function * {...})');\n }\n let started = false;\n let completed = false;\n let cancelled = false;\n const generatorFcn = coroutineGenerator.bind(thisArg);\n const generator = generatorFcn();\n let loop;\n const complete = new Promise((resolve, reject) => {\n loop = (elapsed) => {\n try {\n if (cancelled) {\n completed = true;\n resolve();\n return;\n }\n const { done, value } = InsideCoroutineContext.scope(true, () => generator.next(elapsed));\n if (done || cancelled) {\n completed = true;\n resolve();\n return;\n }\n if (value instanceof Promise) {\n value.then(() => {\n // schedule next loop\n engine.clock.schedule(loop, 0, schedule);\n });\n }\n else if (value === undefined || value === void 0) {\n // schedule next frame\n engine.clock.schedule(loop, 0, schedule);\n }\n else {\n // schedule value milliseconds from now\n engine.clock.schedule(loop, value || 0, schedule);\n }\n }\n catch (e) {\n reject(e);\n return;\n }\n };\n if (autostart) {\n started = true;\n loop(engine.clock.elapsed()); // run first frame immediately\n }\n });\n const co = {\n isRunning: () => {\n return started && !cancelled && !completed;\n },\n isComplete: () => {\n return completed;\n },\n cancel: () => {\n cancelled = true;\n },\n start: () => {\n if (!started) {\n started = true;\n loop(engine.clock.elapsed());\n }\n else {\n logger.warn('.start() was called on a coroutine that was already started, this is probably a bug:\\n', Function.prototype.toString.call(generatorFcn));\n }\n return co;\n },\n generator,\n done: complete,\n then: complete.then.bind(complete),\n [Symbol.iterator]: () => {\n // TODO warn if a coroutine is already running\n // TODO warn if a coroutine is cancelled\n return generator;\n }\n };\n return co;\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Decorators.ts\":\n/*!****************************!*\\\n !*** ./Util/Decorators.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ maxMessages: () => (/* binding */ maxMessages),\n/* harmony export */ obsolete: () => (/* binding */ obsolete),\n/* harmony export */ resetObsoleteCounter: () => (/* binding */ resetObsoleteCounter)\n/* harmony export */ });\n/* harmony import */ var _Flags__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Flags */ \"./Flags.ts\");\n/* harmony import */ var _Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Log */ \"./Util/Log.ts\");\n\n\nconst maxMessages = 5;\nconst obsoleteMessage = {};\nconst resetObsoleteCounter = () => {\n for (const message in obsoleteMessage) {\n obsoleteMessage[message] = 0;\n }\n};\nconst logMessage = (message, options) => {\n const suppressObsoleteMessages = _Flags__WEBPACK_IMPORTED_MODULE_0__.Flags.isEnabled('suppress-obsolete-message');\n if (obsoleteMessage[message] < maxMessages && !suppressObsoleteMessages) {\n _Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance().warn(message);\n // tslint:disable-next-line: no-console\n if (console.trace && options.showStackTrace) {\n // tslint:disable-next-line: no-console\n console.trace();\n }\n }\n obsoleteMessage[message]++;\n};\n/**\n * Obsolete decorator for marking Excalibur methods obsolete, you can optionally specify a custom message and/or alternate replacement\n * method do the deprecated one. Inspired by https://github.com/jayphelps/core-decorators.js\n */\nfunction obsolete(options) {\n options = {\n message: 'This feature will be removed in future versions of Excalibur.',\n alternateMethod: null,\n showStackTrace: false,\n ...options\n };\n return function (target, property, descriptor) {\n if (descriptor &&\n !(typeof descriptor.value === 'function' || typeof descriptor.get === 'function' || typeof descriptor.set === 'function')) {\n throw new SyntaxError('Only classes/functions/getters/setters can be marked as obsolete');\n }\n const methodSignature = `${target.name || ''}${target.name && property ? '.' : ''}${property ? property : ''}`;\n const message = `${methodSignature} is marked obsolete: ${options.message}` +\n (options.alternateMethod ? ` Use ${options.alternateMethod} instead` : '');\n if (!obsoleteMessage[message]) {\n obsoleteMessage[message] = 0;\n }\n // If descriptor is null it is a class\n const method = descriptor ? { ...descriptor } : target;\n if (!descriptor) {\n // with es2015 classes we need to change our decoration tactic\n class DecoratedClass extends method {\n constructor(...args) {\n logMessage(message, options);\n super(...args);\n }\n }\n return DecoratedClass;\n }\n if (descriptor && descriptor.value) {\n method.value = function () {\n logMessage(message, options);\n return descriptor.value.apply(this, arguments);\n };\n return method;\n }\n if (descriptor && descriptor.get) {\n method.get = function () {\n logMessage(message, options);\n return descriptor.get.apply(this, arguments);\n };\n }\n if (descriptor && descriptor.set) {\n method.set = function () {\n logMessage(message, options);\n return descriptor.set.apply(this, arguments);\n };\n }\n return method;\n };\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Detector.ts\":\n/*!**************************!*\\\n !*** ./Util/Detector.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Detector: () => (/* binding */ Detector)\n/* harmony export */ });\n/* harmony import */ var _Log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Log */ \"./Util/Log.ts\");\n\n/**\n * This is the list of features that will be used to log the supported\n * features to the console when Detector.logBrowserFeatures() is called.\n */\nconst REPORTED_FEATURES = {\n webgl: 'WebGL',\n webaudio: 'WebAudio',\n gamepadapi: 'Gamepad API'\n};\n/**\n * Excalibur internal feature detection helper class\n */\nclass Detector {\n constructor() {\n this._features = null;\n this.failedTests = [];\n // critical browser features required for ex to run\n this._criticalTests = {\n // Test canvas/2d context support\n canvasSupport: function () {\n const elem = document.createElement('canvas');\n return !!(elem.getContext && elem.getContext('2d'));\n },\n // Test array buffer support ex uses for downloading binary data\n arrayBufferSupport: function () {\n const xhr = new XMLHttpRequest();\n xhr.open('GET', '/');\n try {\n xhr.responseType = 'arraybuffer';\n }\n catch (e) {\n return false;\n }\n return xhr.responseType === 'arraybuffer';\n },\n // Test data urls ex uses for sprites\n dataUrlSupport: function () {\n const canvas = document.createElement('canvas');\n return canvas.toDataURL('image/png').indexOf('data:image/png') === 0;\n },\n // Test object url support for loading\n objectUrlSupport: function () {\n return 'URL' in window && 'revokeObjectURL' in URL && 'createObjectURL' in URL;\n },\n // RGBA support for colors\n rgbaSupport: function () {\n const style = document.createElement('a').style;\n style.cssText = 'background-color:rgba(150,255,150,.5)';\n return ('' + style.backgroundColor).indexOf('rgba') > -1;\n }\n };\n // warnings excalibur performance will be degraded\n this._warningTest = {\n webAudioSupport: function () {\n return !!(window.AudioContext ||\n window.webkitAudioContext ||\n window.mozAudioContext ||\n window.msAudioContext ||\n window.oAudioContext);\n },\n webglSupport: function () {\n const elem = document.createElement('canvas');\n return !!(elem.getContext && elem.getContext('webgl'));\n }\n };\n this._features = this._loadBrowserFeatures();\n }\n /**\n * Returns a map of currently supported browser features. This method\n * treats the features as a singleton and will only calculate feature\n * support if it has not previously been done.\n */\n getBrowserFeatures() {\n if (this._features === null) {\n this._features = this._loadBrowserFeatures();\n }\n return this._features;\n }\n /**\n * Report on non-critical browser support for debugging purposes.\n * Use native browser console colors for visibility.\n */\n logBrowserFeatures() {\n let msg = '%cSUPPORTED BROWSER FEATURES\\n==========================%c\\n';\n const args = ['font-weight: bold; color: navy', 'font-weight: normal; color: inherit'];\n const supported = this.getBrowserFeatures();\n for (const feature of Object.keys(REPORTED_FEATURES)) {\n if (supported[feature]) {\n msg += '(%c\\u2713%c)'; // (✓)\n args.push('font-weight: bold; color: green');\n args.push('font-weight: normal; color: inherit');\n }\n else {\n msg += '(%c\\u2717%c)'; // (✗)\n args.push('font-weight: bold; color: red');\n args.push('font-weight: normal; color: inherit');\n }\n msg += ' ' + REPORTED_FEATURES[feature] + '\\n';\n }\n args.unshift(msg);\n // eslint-disable-next-line no-console\n console.log.apply(console, args);\n }\n /**\n * Executes several IIFE's to get a constant reference to supported\n * features within the current execution context.\n */\n _loadBrowserFeatures() {\n return {\n // IIFE to check canvas support\n canvas: (() => {\n return this._criticalTests.canvasSupport();\n })(),\n // IIFE to check arraybuffer support\n arraybuffer: (() => {\n return this._criticalTests.arrayBufferSupport();\n })(),\n // IIFE to check dataurl support\n dataurl: (() => {\n return this._criticalTests.dataUrlSupport();\n })(),\n // IIFE to check objecturl support\n objecturl: (() => {\n return this._criticalTests.objectUrlSupport();\n })(),\n // IIFE to check rgba support\n rgba: (() => {\n return this._criticalTests.rgbaSupport();\n })(),\n // IIFE to check webaudio support\n webaudio: (() => {\n return this._warningTest.webAudioSupport();\n })(),\n // IIFE to check webgl support\n webgl: (() => {\n return this._warningTest.webglSupport();\n })(),\n // IIFE to check gamepadapi support\n gamepadapi: (() => {\n return !!navigator.getGamepads;\n })()\n };\n }\n test() {\n // Critical test will for ex not to run\n let failedCritical = false;\n for (const test in this._criticalTests) {\n if (!this._criticalTests[test].call(this)) {\n this.failedTests.push(test);\n _Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance().error('Critical browser feature missing, Excalibur requires:', test);\n failedCritical = true;\n }\n }\n if (failedCritical) {\n return false;\n }\n // Warning tests do not for ex to return false to compatibility\n for (const warning in this._warningTest) {\n if (!this._warningTest[warning]()) {\n _Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance().warn('Warning browser feature missing, Excalibur will have reduced performance:', warning);\n }\n }\n return true;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/DrawUtil.ts\":\n/*!**************************!*\\\n !*** ./Util/DrawUtil.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ circle: () => (/* binding */ circle),\n/* harmony export */ line: () => (/* binding */ line),\n/* harmony export */ point: () => (/* binding */ point),\n/* harmony export */ roundRect: () => (/* binding */ roundRect),\n/* harmony export */ vector: () => (/* binding */ vector)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n\n/* istanbul ignore next */\n/**\n * Draw a line on canvas context\n * @param ctx The canvas context\n * @param color The color of the line\n * @param x1 The start x coordinate\n * @param y1 The start y coordinate\n * @param x2 The ending x coordinate\n * @param y2 The ending y coordinate\n * @param thickness The line thickness\n * @param cap The {@apilink LineCapStyle} (butt, round, or square)\n */\nfunction line(ctx, color = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Red, x1, y1, x2, y2, thickness = 1, cap = 'butt') {\n ctx.save();\n ctx.beginPath();\n ctx.lineWidth = thickness;\n ctx.lineCap = cap;\n ctx.strokeStyle = color.toString();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.closePath();\n ctx.stroke();\n ctx.restore();\n}\n/* istanbul ignore next */\n/**\n * Draw the vector as a point onto the canvas.\n */\nfunction point(ctx, color = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Red, point) {\n ctx.beginPath();\n ctx.strokeStyle = color.toString();\n ctx.arc(point.x, point.y, 5, 0, Math.PI * 2);\n ctx.closePath();\n ctx.stroke();\n}\n/**\n * Draw the vector as a line onto the canvas starting a origin point.\n */\n/* istanbul ignore next */\n/**\n *\n */\nfunction vector(ctx, color, origin, vector, scale = 1.0) {\n const c = color ? color.toString() : 'blue';\n const v = vector.scale(scale);\n ctx.beginPath();\n ctx.strokeStyle = c;\n ctx.moveTo(origin.x, origin.y);\n ctx.lineTo(origin.x + v.x, origin.y + v.y);\n ctx.closePath();\n ctx.stroke();\n}\n/**\n * Draw a round rectangle on a canvas context\n * @param ctx The canvas context\n * @param x The top-left x coordinate\n * @param y The top-left y coordinate\n * @param width The width of the rectangle\n * @param height The height of the rectangle\n * @param radius The border radius of the rectangle\n * @param stroke The {@apilink Color} to stroke rectangle with\n * @param fill The {@apilink Color} to fill rectangle with\n */\nfunction roundRect(ctx, x, y, width, height, radius = 5, stroke = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.White, fill = null) {\n let br;\n if (typeof radius === 'number') {\n br = { tl: radius, tr: radius, br: radius, bl: radius };\n }\n else {\n const defaultRadius = { tl: 0, tr: 0, br: 0, bl: 0 };\n for (const prop in defaultRadius) {\n if (defaultRadius.hasOwnProperty(prop)) {\n const side = prop;\n br[side] = radius[side] || defaultRadius[side];\n }\n }\n }\n ctx.beginPath();\n ctx.moveTo(x + br.tl, y);\n ctx.lineTo(x + width - br.tr, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + br.tr);\n ctx.lineTo(x + width, y + height - br.br);\n ctx.quadraticCurveTo(x + width, y + height, x + width - br.br, y + height);\n ctx.lineTo(x + br.bl, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - br.bl);\n ctx.lineTo(x, y + br.tl);\n ctx.quadraticCurveTo(x, y, x + br.tl, y);\n ctx.closePath();\n if (fill) {\n ctx.fillStyle = fill.toString();\n ctx.fill();\n }\n if (stroke) {\n ctx.strokeStyle = stroke.toString();\n ctx.stroke();\n }\n}\n/**\n *\n */\nfunction circle(ctx, x, y, radius, stroke = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.White, fill = null) {\n ctx.beginPath();\n ctx.arc(x, y, radius, 0, Math.PI * 2);\n ctx.closePath();\n if (fill) {\n ctx.fillStyle = fill.toString();\n ctx.fill();\n }\n if (stroke) {\n ctx.strokeStyle = stroke.toString();\n ctx.stroke();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/EasingFunctions.ts\":\n/*!*********************************!*\\\n !*** ./Util/EasingFunctions.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EasingFunctions: () => (/* binding */ EasingFunctions)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n\n/**\n * Standard easing functions for motion in Excalibur, defined on a domain of [0, duration] and a range from [+startValue,+endValue]\n * Given a time, the function will return a value from positive startValue to positive endValue.\n *\n * ```js\n * function Linear (t) {\n * return t * t;\n * }\n *\n * // accelerating from zero velocity\n * function EaseInQuad (t) {\n * return t * t;\n * }\n *\n * // decelerating to zero velocity\n * function EaseOutQuad (t) {\n * return t * (2 - t);\n * }\n *\n * // acceleration until halfway, then deceleration\n * function EaseInOutQuad (t) {\n * return t < .5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n * }\n *\n * // accelerating from zero velocity\n * function EaseInCubic (t) {\n * return t * t * t;\n * }\n *\n * // decelerating to zero velocity\n * function EaseOutCubic (t) {\n * return (--t) * t * t + 1;\n * }\n *\n * // acceleration until halfway, then deceleration\n * function EaseInOutCubic (t) {\n * return t < .5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1;\n * }\n * ```\n */\nclass EasingFunctions {\n static CreateReversibleEasingFunction(easing) {\n return (time, start, end, duration) => {\n if (end < start) {\n return start - (easing(time, end, start, duration) - end);\n }\n else {\n return easing(time, start, end, duration);\n }\n };\n }\n static CreateVectorEasingFunction(easing) {\n return (time, start, end, duration) => {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(easing(time, start.x, end.x, duration), easing(time, start.y, end.y, duration));\n };\n }\n}\nEasingFunctions.Linear = EasingFunctions.CreateReversibleEasingFunction((currentTime, startValue, endValue, duration) => {\n endValue = endValue - startValue;\n return (endValue * currentTime) / duration + startValue;\n});\nEasingFunctions.EaseInQuad = EasingFunctions.CreateReversibleEasingFunction((currentTime, startValue, endValue, duration) => {\n endValue = endValue - startValue;\n currentTime /= duration;\n return endValue * currentTime * currentTime + startValue;\n});\nEasingFunctions.EaseOutQuad = EasingFunctions.CreateReversibleEasingFunction((currentTime, startValue, endValue, duration) => {\n endValue = endValue - startValue;\n currentTime /= duration;\n return -endValue * currentTime * (currentTime - 2) + startValue;\n});\nEasingFunctions.EaseInOutQuad = EasingFunctions.CreateReversibleEasingFunction((currentTime, startValue, endValue, duration) => {\n endValue = endValue - startValue;\n currentTime /= duration / 2;\n if (currentTime < 1) {\n return (endValue / 2) * currentTime * currentTime + startValue;\n }\n currentTime--;\n return (-endValue / 2) * (currentTime * (currentTime - 2) - 1) + startValue;\n});\nEasingFunctions.EaseInCubic = EasingFunctions.CreateReversibleEasingFunction((currentTime, startValue, endValue, duration) => {\n endValue = endValue - startValue;\n currentTime /= duration;\n return endValue * currentTime * currentTime * currentTime + startValue;\n});\nEasingFunctions.EaseOutCubic = EasingFunctions.CreateReversibleEasingFunction((currentTime, startValue, endValue, duration) => {\n endValue = endValue - startValue;\n currentTime /= duration;\n currentTime--;\n return endValue * (currentTime * currentTime * currentTime + 1) + startValue;\n});\nEasingFunctions.EaseInOutCubic = EasingFunctions.CreateReversibleEasingFunction((currentTime, startValue, endValue, duration) => {\n endValue = endValue - startValue;\n currentTime /= duration / 2;\n if (currentTime < 1) {\n return (endValue / 2) * currentTime * currentTime * currentTime + startValue;\n }\n currentTime -= 2;\n return (endValue / 2) * (currentTime * currentTime * currentTime + 2) + startValue;\n});\n\n\n/***/ }),\n\n/***/ \"./Util/Fps.ts\":\n/*!*********************!*\\\n !*** ./Util/Fps.ts ***!\n \\*********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FpsSampler: () => (/* binding */ FpsSampler)\n/* harmony export */ });\nclass FpsSampler {\n constructor(options) {\n var _a;\n this._samplePeriod = 100;\n this._currentFrameTime = 0;\n this._frames = 0;\n this._previousSampleTime = 0;\n this._beginFrameTime = 0;\n this._fps = options.initialFps;\n this._samplePeriod = (_a = options.samplePeriod) !== null && _a !== void 0 ? _a : this._samplePeriod;\n this._currentFrameTime = 1000 / options.initialFps;\n this._nowFn = options.nowFn;\n this._previousSampleTime = this._nowFn();\n }\n /**\n * Start of code block to sample FPS for\n */\n start() {\n this._beginFrameTime = this._nowFn();\n }\n /**\n * End of code block to sample FPS for\n */\n end() {\n this._frames++;\n const time = this._nowFn();\n this._currentFrameTime = time - this._beginFrameTime;\n if (time >= this._previousSampleTime + this._samplePeriod) {\n this._fps = (this._frames * 1000) / (time - this._previousSampleTime);\n this._previousSampleTime = time;\n this._frames = 0;\n }\n }\n /**\n * Return the currently sampled fps over the last sample period, by default every 100ms\n */\n get fps() {\n return this._fps;\n }\n /**\n * Return the instantaneous fps, this can be less useful because it will fluctuate given the current frames time\n */\n get instant() {\n return 1000 / this._currentFrameTime;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Future.ts\":\n/*!************************!*\\\n !*** ./Util/Future.ts ***!\n \\************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Future: () => (/* binding */ Future)\n/* harmony export */ });\n/**\n * Future is a wrapper around a native browser Promise to allow resolving/rejecting at any time\n */\nclass Future {\n constructor() {\n this._isCompleted = false;\n this.promise = new Promise((resolve, reject) => {\n this._resolver = resolve;\n this._rejecter = reject;\n });\n }\n get isCompleted() {\n return this._isCompleted;\n }\n resolve(value) {\n if (this._isCompleted) {\n return;\n }\n this._isCompleted = true;\n this._resolver(value);\n }\n reject(error) {\n if (this._isCompleted) {\n return;\n }\n this._isCompleted = true;\n this._rejecter(error);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/IFrame.ts\":\n/*!************************!*\\\n !*** ./Util/IFrame.ts ***!\n \\************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ isCrossOriginIframe: () => (/* binding */ isCrossOriginIframe)\n/* harmony export */ });\n/**\n * Checks if excalibur is in a x-origin iframe\n */\nfunction isCrossOriginIframe() {\n try {\n // Try and listen to events on top window frame if within an iframe.\n //\n // See https://github.com/excaliburjs/Excalibur/issues/1294\n //\n // Attempt to add an event listener, which triggers a DOMException on\n // cross-origin iframes\n const noop = () => {\n return;\n };\n window.top.addEventListener('blur', noop);\n window.top.removeEventListener('blur', noop);\n }\n catch (_a) {\n return true;\n }\n return false;\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Index.ts\":\n/*!***********************!*\\\n !*** ./Util/Index.ts ***!\n \\***********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ConsoleAppender: () => (/* reexport safe */ _Log__WEBPACK_IMPORTED_MODULE_1__.ConsoleAppender),\n/* harmony export */ DrawUtil: () => (/* reexport module object */ _DrawUtil__WEBPACK_IMPORTED_MODULE_4__),\n/* harmony export */ EasingFunctions: () => (/* reexport safe */ _EasingFunctions__WEBPACK_IMPORTED_MODULE_3__.EasingFunctions),\n/* harmony export */ LogLevel: () => (/* reexport safe */ _Log__WEBPACK_IMPORTED_MODULE_1__.LogLevel),\n/* harmony export */ Logger: () => (/* reexport safe */ _Log__WEBPACK_IMPORTED_MODULE_1__.Logger),\n/* harmony export */ Observable: () => (/* reexport safe */ _Observable__WEBPACK_IMPORTED_MODULE_2__.Observable),\n/* harmony export */ ScreenAppender: () => (/* reexport safe */ _Log__WEBPACK_IMPORTED_MODULE_1__.ScreenAppender),\n/* harmony export */ addItemToArray: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.addItemToArray),\n/* harmony export */ contains: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.contains),\n/* harmony export */ delay: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.delay),\n/* harmony export */ fail: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.fail),\n/* harmony export */ getPosition: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.getPosition),\n/* harmony export */ isObject: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.isObject),\n/* harmony export */ mergeDeep: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.mergeDeep),\n/* harmony export */ omit: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.omit),\n/* harmony export */ removeItemFromArray: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.removeItemFromArray)\n/* harmony export */ });\n/* harmony import */ var _Util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Util */ \"./Util/Util.ts\");\n/* harmony import */ var _Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Observable */ \"./Util/Observable.ts\");\n/* harmony import */ var _EasingFunctions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./EasingFunctions */ \"./Util/EasingFunctions.ts\");\n/* harmony import */ var _DrawUtil__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./DrawUtil */ \"./Util/DrawUtil.ts\");\n\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Util/Log.ts\":\n/*!*********************!*\\\n !*** ./Util/Log.ts ***!\n \\*********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ConsoleAppender: () => (/* binding */ ConsoleAppender),\n/* harmony export */ LogLevel: () => (/* binding */ LogLevel),\n/* harmony export */ Logger: () => (/* binding */ Logger),\n/* harmony export */ ScreenAppender: () => (/* binding */ ScreenAppender)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* eslint-disable no-console */\n\n\n/**\n * Logging level that Excalibur will tag\n */\nvar LogLevel;\n(function (LogLevel) {\n LogLevel[LogLevel[\"Debug\"] = 0] = \"Debug\";\n LogLevel[LogLevel[\"Info\"] = 1] = \"Info\";\n LogLevel[LogLevel[\"Warn\"] = 2] = \"Warn\";\n LogLevel[LogLevel[\"Error\"] = 3] = \"Error\";\n LogLevel[LogLevel[\"Fatal\"] = 4] = \"Fatal\";\n})(LogLevel || (LogLevel = {}));\n/**\n * Static singleton that represents the logging facility for Excalibur.\n * Excalibur comes built-in with a {@apilink ConsoleAppender} and {@apilink ScreenAppender}.\n * Derive from {@apilink Appender} to create your own logging appenders.\n */\nclass Logger {\n constructor() {\n this._appenders = [];\n /**\n * Gets or sets the default logging level. Excalibur will only log\n * messages if equal to or above this level. Default: {@apilink LogLevel.Info}\n */\n this.defaultLevel = LogLevel.Info;\n this._logOnceSet = new Set();\n if (Logger._INSTANCE) {\n throw new Error('Logger is a singleton');\n }\n Logger._INSTANCE = this;\n // Default console appender\n Logger._INSTANCE.addAppender(new ConsoleAppender());\n return Logger._INSTANCE;\n }\n /**\n * Gets the current static instance of Logger\n */\n static getInstance() {\n if (Logger._INSTANCE == null) {\n Logger._INSTANCE = new Logger();\n }\n return Logger._INSTANCE;\n }\n /**\n * Adds a new {@apilink Appender} to the list of appenders to write to\n */\n addAppender(appender) {\n this._appenders.push(appender);\n }\n /**\n * Clears all appenders from the logger\n */\n clearAppenders() {\n this._appenders.length = 0;\n }\n /**\n * Logs a message at a given LogLevel\n * @param level The LogLevel`to log the message at\n * @param args An array of arguments to write to an appender\n */\n _log(level, args) {\n if (level == null) {\n level = this.defaultLevel;\n }\n const len = this._appenders.length;\n for (let i = 0; i < len; i++) {\n if (level >= this.defaultLevel) {\n this._appenders[i].log(level, args);\n }\n }\n }\n _logOnce(level, args) {\n const serialized = level + args.join('+');\n if (this._logOnceSet.has(serialized)) {\n return;\n }\n else {\n this._logOnceSet.add(serialized);\n this._log(level, args);\n }\n }\n /**\n * Writes a log message at the {@apilink LogLevel.Debug} level\n * @param args Accepts any number of arguments\n */\n debug(...args) {\n this._log(LogLevel.Debug, args);\n }\n /**\n * Writes a log message once at the {@apilink LogLevel.Fatal} level, if it sees the same args again it wont log\n * @param args Accepts any number of arguments\n */\n debugOnce(...args) {\n this._logOnce(LogLevel.Debug, args);\n }\n /**\n * Writes a log message at the {@apilink LogLevel.Info} level\n * @param args Accepts any number of arguments\n */\n info(...args) {\n this._log(LogLevel.Info, args);\n }\n /**\n * Writes a log message once at the {@apilink LogLevel.Info} level, if it sees the same args again it wont log\n * @param args Accepts any number of arguments\n */\n infoOnce(...args) {\n this._logOnce(LogLevel.Info, args);\n }\n /**\n * Writes a log message at the {@apilink LogLevel.Warn} level\n * @param args Accepts any number of arguments\n */\n warn(...args) {\n this._log(LogLevel.Warn, args);\n }\n /**\n * Writes a log message once at the {@apilink LogLevel.Warn} level, if it sees the same args again it won't log\n * @param args Accepts any number of arguments\n */\n warnOnce(...args) {\n this._logOnce(LogLevel.Warn, args);\n }\n /**\n * Writes a log message at the {@apilink LogLevel.Error} level\n * @param args Accepts any number of arguments\n */\n error(...args) {\n this._log(LogLevel.Error, args);\n }\n /**\n * Writes a log message once at the {@apilink LogLevel.Error} level, if it sees the same args again it won't log\n * @param args Accepts any number of arguments\n */\n errorOnce(...args) {\n this._logOnce(LogLevel.Error, args);\n }\n /**\n * Writes a log message at the {@apilink LogLevel.Fatal} level\n * @param args Accepts any number of arguments\n */\n fatal(...args) {\n this._log(LogLevel.Fatal, args);\n }\n /**\n * Writes a log message once at the {@apilink LogLevel.Fatal} level, if it sees the same args again it won't log\n * @param args Accepts any number of arguments\n */\n fatalOnce(...args) {\n this._logOnce(LogLevel.Fatal, args);\n }\n}\nLogger._INSTANCE = null;\n/**\n * Console appender for browsers (i.e. `console.log`)\n */\nclass ConsoleAppender {\n /**\n * Logs a message at the given {@apilink LogLevel}\n * @param level Level to log at\n * @param args Arguments to log\n */\n log(level, args) {\n // Check for console support\n if (!console && !console.log && console.warn && console.error) {\n // todo maybe do something better than nothing\n return;\n }\n // Create a new console args array\n const consoleArgs = [];\n consoleArgs.unshift.apply(consoleArgs, args);\n consoleArgs.unshift('[' + LogLevel[level] + '] : ');\n if (level < LogLevel.Warn) {\n // Call .log for Debug/Info\n if (console.log.apply) {\n // this is required on some older browsers that don't support apply on console.log :(\n console.log.apply(console, consoleArgs);\n }\n else {\n console.log(consoleArgs.join(' '));\n }\n }\n else if (level < LogLevel.Error) {\n // Call .warn for Warn\n if (console.warn.apply) {\n console.warn.apply(console, consoleArgs);\n }\n else {\n console.warn(consoleArgs.join(' '));\n }\n }\n else {\n // Call .error for Error/Fatal\n if (console.error.apply) {\n console.error.apply(console, consoleArgs);\n }\n else {\n console.error(consoleArgs.join(' '));\n }\n }\n }\n}\n/**\n * On-screen (canvas) appender\n */\nclass ScreenAppender {\n constructor(options) {\n var _a, _b;\n this._messages = [];\n this._pos = 10;\n this._color = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Black;\n this._options = options;\n this.canvas = document.createElement('canvas');\n this._ctx = this.canvas.getContext('2d');\n this.canvas.style.position = 'absolute';\n this.canvas.style.zIndex = (_b = (_a = options.zIndex) === null || _a === void 0 ? void 0 : _a.toString()) !== null && _b !== void 0 ? _b : '99';\n document.body.appendChild(this.canvas);\n this._positionScreenAppenderCanvas();\n options.engine.screen.events.on('resize', () => {\n this._positionScreenAppenderCanvas();\n });\n }\n _positionScreenAppenderCanvas() {\n var _a, _b, _c, _d;\n const options = this._options;\n this.canvas.width = (_a = options.width) !== null && _a !== void 0 ? _a : options.engine.screen.resolution.width;\n this.canvas.height = (_b = options.height) !== null && _b !== void 0 ? _b : options.engine.screen.resolution.height;\n this.canvas.style.position = 'absolute';\n const pagePos = options.engine.screen.screenToPageCoordinates((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0));\n this.canvas.style.left = pagePos.x + 'px';\n this.canvas.style.top = pagePos.y + 'px';\n this._pos = (_c = options.xPos) !== null && _c !== void 0 ? _c : this._pos;\n this._color = (_d = options.color) !== null && _d !== void 0 ? _d : this._color;\n }\n /**\n * Logs a message at the given {@apilink LogLevel}\n * @param level Level to log at\n * @param args Arguments to log\n */\n log(level, args) {\n const message = args.join(',');\n this._ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n this._messages.unshift('[' + LogLevel[level] + '] : ' + message);\n let pos = 10;\n this._messages = this._messages.slice(0, 1000);\n for (let i = 0; i < this._messages.length; i++) {\n this._ctx.fillStyle = this._color.toRGBA();\n this._ctx.fillText(this._messages[i], this._pos, pos);\n pos += 10;\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Observable.ts\":\n/*!****************************!*\\\n !*** ./Util/Observable.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Observable: () => (/* binding */ Observable)\n/* harmony export */ });\n/**\n * Simple Observable implementation\n * @template T is the typescript Type that defines the data being observed\n */\nclass Observable {\n constructor() {\n this.observers = [];\n this.subscriptions = [];\n }\n /**\n * Register an observer to listen to this observable\n * @param observer\n */\n register(observer) {\n this.observers.push(observer);\n }\n /**\n * Register a callback to listen to this observable\n * @param func\n */\n subscribe(func) {\n this.subscriptions.push(func);\n }\n /**\n * Remove an observer from the observable\n * @param observer\n */\n unregister(observer) {\n const i = this.observers.indexOf(observer);\n if (i !== -1) {\n this.observers.splice(i, 1);\n }\n }\n /**\n * Remove a callback that is listening to this observable\n * @param func\n */\n unsubscribe(func) {\n const i = this.subscriptions.indexOf(func);\n if (i !== -1) {\n this.subscriptions.splice(i, 1);\n }\n }\n /**\n * Broadcasts a message to all observers and callbacks\n * @param message\n */\n notifyAll(message) {\n const observersLength = this.observers.length;\n for (let i = 0; i < observersLength; i++) {\n this.observers[i].notify(message);\n }\n const subscriptionsLength = this.subscriptions.length;\n for (let i = 0; i < subscriptionsLength; i++) {\n this.subscriptions[i](message);\n }\n }\n /**\n * Removes all observers and callbacks\n */\n clear() {\n this.observers.length = 0;\n this.subscriptions.length = 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Pool.ts\":\n/*!**********************!*\\\n !*** ./Util/Pool.ts ***!\n \\**********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Pool: () => (/* binding */ Pool)\n/* harmony export */ });\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n\nclass Pool {\n constructor(builder, recycler, maxObjects = 100) {\n this.builder = builder;\n this.recycler = recycler;\n this.maxObjects = maxObjects;\n this.totalAllocations = 0;\n this.index = 0;\n this.objects = [];\n this.disableWarnings = false;\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance();\n }\n dispose() {\n this.objects.length = 0;\n }\n preallocate() {\n for (let i = 0; i < this.maxObjects; i++) {\n this.objects[i] = this.builder();\n }\n }\n /**\n * Use many instances out of the in the context and return all to the pool.\n *\n * By returning values out of the context they will be un-hooked from the pool and are free to be passed to consumers\n * @param context\n */\n using(context) {\n const result = context(this);\n if (result) {\n return this.done(...result);\n }\n return this.done();\n }\n /**\n * Use a single instance out of th pool and immediately return it to the pool\n * @param context\n */\n borrow(context) {\n const object = this.get();\n context(object);\n this.index--;\n }\n /**\n * Retrieve a value from the pool, will allocate a new instance if necessary or recycle from the pool\n */\n get() {\n if (this.index === this.maxObjects) {\n if (!this.disableWarnings) {\n this._logger.warn('Max pooled objects reached, possible memory leak? Doubling');\n }\n this.maxObjects = this.maxObjects * 2;\n }\n if (this.objects[this.index]) {\n // Pool has an available object already constructed\n if (this.recycler) {\n return this.recycler(this.objects[this.index++]);\n }\n return this.objects[this.index++];\n }\n else {\n // New allocation\n this.totalAllocations++;\n const object = (this.objects[this.index++] = this.builder());\n return object;\n }\n }\n done(...objects) {\n // All objects in pool now considered \"free\"\n this.index = 0;\n for (const object of objects) {\n const poolIndex = this.objects.indexOf(object);\n // Build a new object to take the pool place\n this.objects[poolIndex] = this.builder();\n this.totalAllocations++;\n }\n return objects;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/RentalPool.ts\":\n/*!****************************!*\\\n !*** ./Util/RentalPool.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RentalPool: () => (/* binding */ RentalPool)\n/* harmony export */ });\nclass RentalPool {\n constructor(builder, cleaner, preAllocate = 1) {\n this.builder = builder;\n this.cleaner = cleaner;\n this._pool = [];\n this._size = 0;\n this.grow(preAllocate);\n }\n /**\n * Grow the pool size by an amount\n * @param amount\n */\n grow(amount) {\n if (amount > 0) {\n this._size += amount;\n for (let i = 0; i < amount; i++) {\n this._pool.push(this.builder());\n }\n }\n }\n /**\n * Rent an object from the pool, optionally clean it. If not cleaned previous state may be set.\n *\n * The pool will automatically double if depleted\n * @param clean\n */\n rent(clean = false) {\n if (this._pool.length === 0) {\n this.grow(this._size);\n }\n return clean ? this.cleaner(this._pool.pop()) : this._pool.pop();\n }\n /**\n * Return an object to the pool\n * @param object\n */\n return(object) {\n this._pool.push(object);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Semaphore.ts\":\n/*!***************************!*\\\n !*** ./Util/Semaphore.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Semaphore: () => (/* binding */ Semaphore)\n/* harmony export */ });\n/* harmony import */ var _Future__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Future */ \"./Util/Future.ts\");\n\nclass AsyncWaitQueue {\n constructor() {\n // Code from StephenCleary https://gist.github.com/StephenCleary/ba50b2da419c03b9cba1d20cb4654d5e\n this._queue = [];\n }\n get length() {\n return this._queue.length;\n }\n enqueue() {\n const future = new _Future__WEBPACK_IMPORTED_MODULE_0__.Future();\n this._queue.push(future);\n return future.promise;\n }\n dequeue(value) {\n const future = this._queue.shift();\n future.resolve(value);\n }\n}\n/**\n * Semaphore allows you to limit the amount of async calls happening between `enter()` and `exit()`\n *\n * This can be useful when limiting the number of http calls, browser api calls, etc either for performance or to work\n * around browser limitations like max Image.decode() calls in chromium being 256.\n */\nclass Semaphore {\n constructor(_count) {\n this._count = _count;\n this._waitQueue = new AsyncWaitQueue();\n }\n get count() {\n return this._count;\n }\n get waiting() {\n return this._waitQueue.length;\n }\n // eslint-disable-next-line require-await\n async enter() {\n if (this._count !== 0) {\n this._count--;\n return Promise.resolve();\n }\n return this._waitQueue.enqueue();\n }\n exit(count = 1) {\n if (count === 0) {\n return;\n }\n while (count !== 0 && this._waitQueue.length !== 0) {\n this._waitQueue.dequeue(null);\n count--;\n }\n this._count += count;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Sound.ts\":\n/*!***********************!*\\\n !*** ./Util/Sound.ts ***!\n \\***********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ canPlayFile: () => (/* binding */ canPlayFile)\n/* harmony export */ });\n/* harmony import */ var _Log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Log */ \"./Util/Log.ts\");\n\n/**\n * Whether or not the browser can play this file as HTML5 Audio\n */\nfunction canPlayFile(file) {\n try {\n const a = new Audio();\n const filetype = /.*\\.([A-Za-z0-9]+)(?:(?:\\?|\\#).*)*$/;\n const type = file.match(filetype)[1];\n if (a.canPlayType('audio/' + type)) {\n return true;\n }\n else {\n return false;\n }\n }\n catch (e) {\n _Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance().warn('Cannot determine audio support, assuming no support for the Audio Tag', e);\n return false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/StateMachine.ts\":\n/*!******************************!*\\\n !*** ./Util/StateMachine.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ StateMachine: () => (/* binding */ StateMachine)\n/* harmony export */ });\nclass StateMachine {\n constructor() {\n this.states = new Map();\n }\n get currentState() {\n return this._currentState;\n }\n set currentState(state) {\n this._currentState = state;\n }\n static create(machineDescription, data) {\n const machine = new StateMachine();\n machine.data = data;\n for (const stateName in machineDescription.states) {\n machine.states.set(stateName, {\n name: stateName,\n ...machineDescription.states[stateName]\n });\n }\n // validate transitions are states\n for (const state of machine.states.values()) {\n for (const transitionState of state.transitions) {\n if (transitionState === '*') {\n continue;\n }\n if (!machine.states.has(transitionState)) {\n throw Error(`Invalid state machine, state [${state.name}] has a transition to another state that doesn't exist [${transitionState}]`);\n }\n }\n }\n machine.currentState = machine.startState = machine.states.get(machineDescription.start);\n return machine;\n }\n in(state) {\n return this.currentState.name === state;\n }\n go(stateName, eventData) {\n var _a, _b;\n if (this.currentState.transitions.includes(stateName) || this.currentState.transitions.includes('*')) {\n const potentialNewState = this.states.get(stateName);\n if (this.currentState.onExit) {\n const canExit = (_a = this.currentState) === null || _a === void 0 ? void 0 : _a.onExit({ to: potentialNewState.name, data: this.data });\n if (canExit === false) {\n return false;\n }\n }\n if (potentialNewState === null || potentialNewState === void 0 ? void 0 : potentialNewState.onEnter) {\n const canEnter = potentialNewState === null || potentialNewState === void 0 ? void 0 : potentialNewState.onEnter({ from: this.currentState.name, eventData, data: this.data });\n if (canEnter === false) {\n return false;\n }\n }\n this.currentState = potentialNewState;\n if ((_b = this.currentState) === null || _b === void 0 ? void 0 : _b.onState) {\n this.currentState.onState();\n }\n return true;\n }\n return false;\n }\n update(elapsed) {\n if (this.currentState.onUpdate) {\n this.currentState.onUpdate(this.data, elapsed);\n }\n }\n save(saveKey) {\n localStorage.setItem(saveKey, JSON.stringify({\n currentState: this.currentState.name,\n data: this.data\n }));\n }\n restore(saveKey) {\n const state = JSON.parse(localStorage.getItem(saveKey));\n this.currentState = this.states.get(state.currentState);\n this.data = state.data;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Toaster.ts\":\n/*!*************************!*\\\n !*** ./Util/Toaster.ts ***!\n \\*************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Toaster: () => (/* binding */ Toaster)\n/* harmony export */ });\n/* harmony import */ var _Toaster_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Toaster.css */ \"./Util/Toaster.css\");\n\n/**\n * The Toaster is only meant to be called from inside Excalibur to display messages to players\n */\nclass Toaster {\n constructor() {\n this._toasterCss = _Toaster_css__WEBPACK_IMPORTED_MODULE_0__[\"default\"].toString();\n this._isInitialized = false;\n }\n _initialize() {\n if (!this._isInitialized) {\n this._container = document.createElement('div');\n this._container.id = 'ex-toast-container';\n document.body.appendChild(this._container);\n this._isInitialized = true;\n this._styleBlock = document.createElement('style');\n this._styleBlock.textContent = this._toasterCss;\n document.head.appendChild(this._styleBlock);\n }\n }\n dispose() {\n this._container.parentElement.removeChild(this._container);\n this._styleBlock.parentElement.removeChild(this._styleBlock);\n this._isInitialized = false;\n }\n _createFragment(message) {\n const toastMessage = document.createElement('span');\n toastMessage.innerText = message;\n return toastMessage;\n }\n /**\n * Display a toast message to a player\n * @param message Text of the message, messages may have a single \"[LINK]\" to influence placement\n * @param linkTarget Optionally specify a link location\n * @param linkName Optionally specify a name for that link location\n */\n toast(message, linkTarget, linkName) {\n this._initialize();\n const toast = document.createElement('div');\n toast.className = 'ex-toast-message';\n const messageFragments = message.split('[LINK]').map((message) => this._createFragment(message));\n if (linkTarget) {\n const link = document.createElement('a');\n link.href = linkTarget;\n if (linkName) {\n link.innerText = linkName;\n }\n else {\n link.innerText = linkTarget;\n }\n messageFragments.splice(1, 0, link);\n }\n // Assembly message\n const finalMessage = document.createElement('div');\n messageFragments.forEach((message) => {\n finalMessage.appendChild(message);\n });\n toast.appendChild(finalMessage);\n // Dismiss button\n const dismissBtn = document.createElement('button');\n dismissBtn.innerText = 'x';\n dismissBtn.addEventListener('click', () => {\n this._container.removeChild(toast);\n });\n toast.appendChild(dismissBtn);\n // Escape to dismiss\n const keydownHandler = (evt) => {\n if (evt.key === 'Escape') {\n try {\n this._container.removeChild(toast);\n }\n catch (_a) {\n // pass\n }\n }\n document.removeEventListener('keydown', keydownHandler);\n };\n document.addEventListener('keydown', keydownHandler);\n // Insert into container\n const first = this._container.firstChild;\n this._container.insertBefore(toast, first);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Util.ts\":\n/*!**********************!*\\\n !*** ./Util/Util.ts ***!\n \\**********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ addItemToArray: () => (/* binding */ addItemToArray),\n/* harmony export */ contains: () => (/* binding */ contains),\n/* harmony export */ delay: () => (/* binding */ delay),\n/* harmony export */ fail: () => (/* binding */ fail),\n/* harmony export */ getPosition: () => (/* binding */ getPosition),\n/* harmony export */ isObject: () => (/* binding */ isObject),\n/* harmony export */ mergeDeep: () => (/* binding */ mergeDeep),\n/* harmony export */ omit: () => (/* binding */ omit),\n/* harmony export */ removeItemFromArray: () => (/* binding */ removeItemFromArray)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Future__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Future */ \"./Util/Future.ts\");\n\n\n/**\n * Find the screen position of an HTML element\n */\nfunction getPosition(el) {\n // do we need the scroll too? technically the offset method before did that\n if (el && el.getBoundingClientRect) {\n const rect = el.getBoundingClientRect();\n return (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(rect.x + window.scrollX, rect.y + window.scrollY);\n }\n return _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero;\n}\n/**\n * Add an item to an array list if it doesn't already exist. Returns true if added, false if not and already exists in the array.\n * @deprecated Will be removed in v0.26.0\n */\nfunction addItemToArray(item, array) {\n if (array.indexOf(item) === -1) {\n array.push(item);\n return true;\n }\n return false;\n}\n/**\n * Remove an item from an list\n * @deprecated Will be removed in v0.26.0\n */\nfunction removeItemFromArray(item, array) {\n let index = -1;\n if ((index = array.indexOf(item)) > -1) {\n array.splice(index, 1);\n return true;\n }\n return false;\n}\n/**\n * See if an array contains something\n */\nfunction contains(array, obj) {\n for (let i = 0; i < array.length; i++) {\n if (array[i] === obj) {\n return true;\n }\n }\n return false;\n}\n/**\n * Used for exhaustive checks at compile time\n */\nfunction fail(message) {\n throw new Error(message);\n}\n/**\n * Create a promise that resolves after a certain number of milliseconds\n *\n * It is strongly recommended you pass the excalibur clock so delays are bound to the\n * excalibur clock which would be unaffected by stop/pause.\n * @param milliseconds\n * @param clock\n */\nfunction delay(milliseconds, clock) {\n var _a;\n const future = new _Future__WEBPACK_IMPORTED_MODULE_1__.Future();\n const schedule = (_a = clock === null || clock === void 0 ? void 0 : clock.schedule.bind(clock)) !== null && _a !== void 0 ? _a : setTimeout;\n schedule(() => {\n future.resolve();\n }, milliseconds);\n return future.promise;\n}\n/**\n * Remove keys from object literals\n * @param object\n * @param keys\n */\nfunction omit(object, keys) {\n const newObj = {};\n for (const key in object) {\n if (!keys.includes(key)) {\n newObj[key] = object[key];\n }\n }\n return newObj;\n}\n/**\n * Simple object check.\n * @param item\n */\nfunction isObject(item) {\n return item && typeof item === 'object' && !Array.isArray(item);\n}\n/**\n * Deep merge two objects.\n * @param target\n * @param sources\n */\nfunction mergeDeep(target, ...sources) {\n if (!sources.length) {\n return target;\n }\n const source = sources.shift();\n if (isObject(target) && isObject(source)) {\n for (const key in source) {\n if (isObject(source[key])) {\n if (!target[key]) {\n Object.assign(target, { [key]: {} });\n }\n mergeDeep(target[key], source[key]);\n }\n else {\n Object.assign(target, { [key]: source[key] });\n }\n }\n }\n return mergeDeep(target, ...sources);\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Watch.ts\":\n/*!***********************!*\\\n !*** ./Util/Watch.ts ***!\n \\***********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ watch: () => (/* binding */ watch),\n/* harmony export */ watchAny: () => (/* binding */ watchAny),\n/* harmony export */ watchDeep: () => (/* binding */ watchDeep)\n/* harmony export */ });\n/**\n * Watch an object with a proxy, only fires if property value is different\n */\nfunction watch(type, change) {\n if (!type) {\n return type;\n }\n if (type.__isProxy === undefined) {\n // expando hack to mark a proxy\n return new Proxy(type, {\n set: (obj, prop, value) => {\n // The default behavior to store the value\n if (obj[prop] !== value) {\n obj[prop] = value;\n // Avoid watching private junk\n if (typeof prop === 'string') {\n if (prop[0] !== '_') {\n change(obj);\n }\n }\n }\n // Indicate success\n return true;\n },\n get: (obj, prop) => {\n if (prop !== '__isProxy') {\n return obj[prop];\n }\n return true;\n }\n });\n }\n return type;\n}\nconst createHandler = (path = [], change, typeType) => ({\n get: (target, key) => {\n if (key === '__isProxy') {\n return true;\n }\n if (typeof target[key] === 'object' && target[key] != null) {\n return new Proxy(target[key], createHandler([...path, key], change, typeType));\n }\n return target[key];\n },\n set: (target, key, value) => {\n if (typeof key === 'string') {\n if (key[0] !== '_') {\n change(typeType);\n }\n }\n target[key] = value;\n return true;\n }\n});\n/**\n *\n */\nfunction watchDeep(type, change) {\n if (!type) {\n return type;\n }\n if (type.__isProxy === undefined) {\n // expando hack to mark a proxy\n return new Proxy(type, createHandler([], change, type));\n }\n return type;\n}\n/**\n * Watch an object with a proxy, fires change on any property value change\n */\nfunction watchAny(type, change) {\n if (!type) {\n return type;\n }\n if (type.__isProxy === undefined) {\n // expando hack to mark a proxy\n return new Proxy(type, {\n set: (obj, prop, value) => {\n // The default behavior to store the value\n obj[prop] = value;\n // Avoid watching private junk\n if (typeof prop === 'string') {\n if (prop[0] !== '_') {\n change(obj);\n }\n }\n // Indicate success\n return true;\n },\n get: (obj, prop) => {\n if (prop !== '__isProxy') {\n return obj[prop];\n }\n return true;\n }\n });\n }\n return type;\n}\n\n\n/***/ }),\n\n/***/ \"./Util/WebAudio.ts\":\n/*!**************************!*\\\n !*** ./Util/WebAudio.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ WebAudio: () => (/* binding */ WebAudio)\n/* harmony export */ });\n/* harmony import */ var _Resources_Sound_AudioContext__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Resources/Sound/AudioContext */ \"./Resources/Sound/AudioContext.ts\");\n/* harmony import */ var _Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Log */ \"./Util/Log.ts\");\n\n\n/**\n * Patch for detecting legacy web audio in browsers\n * @internal\n * @param source\n */\nfunction isLegacyWebAudioSource(source) {\n return !!source.playbackState;\n}\nclass WebAudio {\n /**\n * Play an empty sound to unlock Safari WebAudio context. Call this function\n * right after a user interaction event.\n * @source https://paulbakaus.com/tutorials/html5/web-audio-on-ios/\n */\n static unlock() {\n const promise = new Promise((resolve, reject) => {\n if (WebAudio._UNLOCKED || !_Resources_Sound_AudioContext__WEBPACK_IMPORTED_MODULE_0__.AudioContextFactory.create()) {\n return resolve(true);\n }\n const unlockTimeoutTimer = setTimeout(() => {\n _Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance().warn('Excalibur was unable to unlock the audio context, audio probably will not play in this browser.');\n resolve(false);\n }, 200);\n const audioContext = _Resources_Sound_AudioContext__WEBPACK_IMPORTED_MODULE_0__.AudioContextFactory.create();\n audioContext.resume().then(() => {\n // create empty buffer and play it\n const buffer = audioContext.createBuffer(1, 1, 22050);\n const source = audioContext.createBufferSource();\n let ended = false;\n source.buffer = buffer;\n source.connect(audioContext.destination);\n source.onended = () => (ended = true);\n source.start(0);\n // by checking the play state after some time, we know if we're really unlocked\n setTimeout(() => {\n if (isLegacyWebAudioSource(source)) {\n if (source.playbackState === source.PLAYING_STATE || source.playbackState === source.FINISHED_STATE) {\n WebAudio._UNLOCKED = true;\n }\n }\n else {\n if (audioContext.currentTime > 0 || ended) {\n WebAudio._UNLOCKED = true;\n }\n }\n }, 0);\n clearTimeout(unlockTimeoutTimer);\n resolve(true);\n }, () => {\n reject();\n });\n });\n return promise;\n }\n static isUnlocked() {\n return this._UNLOCKED;\n }\n}\nWebAudio._UNLOCKED = false;\n\n\n/***/ }),\n\n/***/ \"./index.ts\":\n/*!******************!*\\\n !*** ./index.ts ***!\n \\******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ActionCompleteEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.ActionCompleteEvent),\n/* harmony export */ ActionContext: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ActionContext),\n/* harmony export */ ActionQueue: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ActionQueue),\n/* harmony export */ ActionSequence: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ActionSequence),\n/* harmony export */ ActionStartEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.ActionStartEvent),\n/* harmony export */ ActionsComponent: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ActionsComponent),\n/* harmony export */ ActionsSystem: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ActionsSystem),\n/* harmony export */ ActivateEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.ActivateEvent),\n/* harmony export */ Actor: () => (/* reexport safe */ _Actor__WEBPACK_IMPORTED_MODULE_6__.Actor),\n/* harmony export */ ActorEvents: () => (/* reexport safe */ _Actor__WEBPACK_IMPORTED_MODULE_6__.ActorEvents),\n/* harmony export */ AddEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.AddEvent),\n/* harmony export */ AddedComponent: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.AddedComponent),\n/* harmony export */ AffineMatrix: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.AffineMatrix),\n/* harmony export */ Animation: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Animation),\n/* harmony export */ AnimationDirection: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.AnimationDirection),\n/* harmony export */ AnimationEvents: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.AnimationEvents),\n/* harmony export */ AnimationStrategy: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.AnimationStrategy),\n/* harmony export */ ArcadeSolver: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.ArcadeSolver),\n/* harmony export */ AudioContextFactory: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.AudioContextFactory),\n/* harmony export */ Axes: () => (/* reexport safe */ _Input_Gamepad__WEBPACK_IMPORTED_MODULE_40__.Axes),\n/* harmony export */ Axis: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.Axis),\n/* harmony export */ BaseAlign: () => (/* reexport safe */ _Graphics_FontCommon__WEBPACK_IMPORTED_MODULE_14__.BaseAlign),\n/* harmony export */ BezierCurve: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.BezierCurve),\n/* harmony export */ Blink: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.Blink),\n/* harmony export */ BodyComponent: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.BodyComponent),\n/* harmony export */ BoundingBox: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.BoundingBox),\n/* harmony export */ BrowserComponent: () => (/* reexport safe */ _Util_Browser__WEBPACK_IMPORTED_MODULE_45__.BrowserComponent),\n/* harmony export */ BrowserEvents: () => (/* reexport safe */ _Util_Browser__WEBPACK_IMPORTED_MODULE_45__.BrowserEvents),\n/* harmony export */ Buttons: () => (/* reexport safe */ _Input_Gamepad__WEBPACK_IMPORTED_MODULE_40__.Buttons),\n/* harmony export */ Camera: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.Camera),\n/* harmony export */ CameraEvents: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.CameraEvents),\n/* harmony export */ Canvas: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Canvas),\n/* harmony export */ Circle: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Circle),\n/* harmony export */ CircleCollider: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.CircleCollider),\n/* harmony export */ Clock: () => (/* reexport safe */ _Util_Clock__WEBPACK_IMPORTED_MODULE_53__.Clock),\n/* harmony export */ ClosestLineJumpTable: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.ClosestLineJumpTable),\n/* harmony export */ Collider: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.Collider),\n/* harmony export */ ColliderComponent: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.ColliderComponent),\n/* harmony export */ CollisionContact: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.CollisionContact),\n/* harmony export */ CollisionEndEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.CollisionEndEvent),\n/* harmony export */ CollisionGroup: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.CollisionGroup),\n/* harmony export */ CollisionGroupManager: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.CollisionGroupManager),\n/* harmony export */ CollisionJumpTable: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.CollisionJumpTable),\n/* harmony export */ CollisionPostSolveEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.CollisionPostSolveEvent),\n/* harmony export */ CollisionPreSolveEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.CollisionPreSolveEvent),\n/* harmony export */ CollisionStartEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.CollisionStartEvent),\n/* harmony export */ CollisionSystem: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.CollisionSystem),\n/* harmony export */ CollisionType: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.CollisionType),\n/* harmony export */ Color: () => (/* reexport safe */ _Color__WEBPACK_IMPORTED_MODULE_27__.Color),\n/* harmony export */ ColorBlindFlags: () => (/* reexport safe */ _Debug_index__WEBPACK_IMPORTED_MODULE_9__.ColorBlindFlags),\n/* harmony export */ ColorBlindnessMode: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ColorBlindnessMode),\n/* harmony export */ ColorBlindnessPostProcessor: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ColorBlindnessPostProcessor),\n/* harmony export */ Component: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.Component),\n/* harmony export */ CompositeCollider: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.CompositeCollider),\n/* harmony export */ ConsoleAppender: () => (/* reexport safe */ _Util_Log__WEBPACK_IMPORTED_MODULE_50__.ConsoleAppender),\n/* harmony export */ ContactConstraintPoint: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.ContactConstraintPoint),\n/* harmony export */ ContactEndEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.ContactEndEvent),\n/* harmony export */ ContactSolveBias: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.ContactSolveBias),\n/* harmony export */ ContactStartEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.ContactStartEvent),\n/* harmony export */ CoordPlane: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.CoordPlane),\n/* harmony export */ CrossFade: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.CrossFade),\n/* harmony export */ CurveBy: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.CurveBy),\n/* harmony export */ CurveTo: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.CurveTo),\n/* harmony export */ DeactivateEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.DeactivateEvent),\n/* harmony export */ Debug: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Debug),\n/* harmony export */ DebugConfig: () => (/* reexport safe */ _Debug_index__WEBPACK_IMPORTED_MODULE_9__.DebugConfig),\n/* harmony export */ DebugGraphicsComponent: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.DebugGraphicsComponent),\n/* harmony export */ DebugSystem: () => (/* reexport safe */ _Debug_index__WEBPACK_IMPORTED_MODULE_9__.DebugSystem),\n/* harmony export */ DebugText: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.DebugText),\n/* harmony export */ DefaultAntialiasOptions: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.DefaultAntialiasOptions),\n/* harmony export */ DefaultGarbageCollectionOptions: () => (/* reexport safe */ _GarbageCollector__WEBPACK_IMPORTED_MODULE_4__.DefaultGarbageCollectionOptions),\n/* harmony export */ DefaultLoader: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.DefaultLoader),\n/* harmony export */ DefaultPixelArtOptions: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.DefaultPixelArtOptions),\n/* harmony export */ DegreeOfFreedom: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.DegreeOfFreedom),\n/* harmony export */ Delay: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.Delay),\n/* harmony export */ Detector: () => (/* reexport safe */ _Util_Detector__WEBPACK_IMPORTED_MODULE_47__.Detector),\n/* harmony export */ Die: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.Die),\n/* harmony export */ Direction: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Direction),\n/* harmony export */ Director: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.Director),\n/* harmony export */ DirectorEvents: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.DirectorEvents),\n/* harmony export */ DisplayMode: () => (/* reexport safe */ _Screen__WEBPACK_IMPORTED_MODULE_5__.DisplayMode),\n/* harmony export */ DynamicTree: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.DynamicTree),\n/* harmony export */ DynamicTreeCollisionProcessor: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.DynamicTreeCollisionProcessor),\n/* harmony export */ EX_VERSION: () => (/* binding */ EX_VERSION),\n/* harmony export */ EaseBy: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.EaseBy),\n/* harmony export */ EaseTo: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.EaseTo),\n/* harmony export */ EasingFunctions: () => (/* reexport safe */ _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_48__.EasingFunctions),\n/* harmony export */ EdgeCollider: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.EdgeCollider),\n/* harmony export */ ElasticToActorStrategy: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.ElasticToActorStrategy),\n/* harmony export */ EmitterType: () => (/* reexport safe */ _Particles_index__WEBPACK_IMPORTED_MODULE_15__.EmitterType),\n/* harmony export */ Engine: () => (/* reexport safe */ _Engine__WEBPACK_IMPORTED_MODULE_3__.Engine),\n/* harmony export */ EngineEvents: () => (/* reexport safe */ _Engine__WEBPACK_IMPORTED_MODULE_3__.EngineEvents),\n/* harmony export */ EnterTriggerEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.EnterTriggerEvent),\n/* harmony export */ EnterViewPortEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.EnterViewPortEvent),\n/* harmony export */ Entity: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.Entity),\n/* harmony export */ EntityEvents: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.EntityEvents),\n/* harmony export */ EntityManager: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.EntityManager),\n/* harmony export */ EventEmitter: () => (/* reexport safe */ _EventEmitter__WEBPACK_IMPORTED_MODULE_10__.EventEmitter),\n/* harmony export */ EventTypes: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.EventTypes),\n/* harmony export */ Events: () => (/* reexport module object */ _Events__WEBPACK_IMPORTED_MODULE_12__),\n/* harmony export */ ExResponse: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.ExResponse),\n/* harmony export */ ExcaliburGraphicsContext2DCanvas: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ExcaliburGraphicsContext2DCanvas),\n/* harmony export */ ExcaliburGraphicsContextWebGL: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ExcaliburGraphicsContextWebGL),\n/* harmony export */ ExitTriggerEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.ExitTriggerEvent),\n/* harmony export */ ExitViewPortEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.ExitViewPortEvent),\n/* harmony export */ Fade: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.Fade),\n/* harmony export */ FadeInOut: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.FadeInOut),\n/* harmony export */ Flags: () => (/* reexport safe */ _Flags__WEBPACK_IMPORTED_MODULE_1__.Flags),\n/* harmony export */ Flash: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.Flash),\n/* harmony export */ Follow: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.Follow),\n/* harmony export */ Font: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Font),\n/* harmony export */ FontCache: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.FontCache),\n/* harmony export */ FontSource: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.FontSource),\n/* harmony export */ FontStyle: () => (/* reexport safe */ _Graphics_FontCommon__WEBPACK_IMPORTED_MODULE_14__.FontStyle),\n/* harmony export */ FontUnit: () => (/* reexport safe */ _Graphics_FontCommon__WEBPACK_IMPORTED_MODULE_14__.FontUnit),\n/* harmony export */ FpsSampler: () => (/* reexport safe */ _Util_Fps__WEBPACK_IMPORTED_MODULE_52__.FpsSampler),\n/* harmony export */ FrameStats: () => (/* reexport safe */ _Debug_index__WEBPACK_IMPORTED_MODULE_9__.FrameStats),\n/* harmony export */ Future: () => (/* reexport safe */ _Util_Future__WEBPACK_IMPORTED_MODULE_57__.Future),\n/* harmony export */ GameEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.GameEvent),\n/* harmony export */ GameStartEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.GameStartEvent),\n/* harmony export */ GameStopEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.GameStopEvent),\n/* harmony export */ Gamepad: () => (/* reexport safe */ _Input_Gamepad__WEBPACK_IMPORTED_MODULE_40__.Gamepad),\n/* harmony export */ GamepadAxisEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.GamepadAxisEvent),\n/* harmony export */ GamepadButtonEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.GamepadButtonEvent),\n/* harmony export */ GamepadConnectEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.GamepadConnectEvent),\n/* harmony export */ GamepadDisconnectEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.GamepadDisconnectEvent),\n/* harmony export */ Gamepads: () => (/* reexport safe */ _Input_Gamepad__WEBPACK_IMPORTED_MODULE_40__.Gamepads),\n/* harmony export */ GarbageCollector: () => (/* reexport safe */ _GarbageCollector__WEBPACK_IMPORTED_MODULE_4__.GarbageCollector),\n/* harmony export */ Gif: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.Gif),\n/* harmony export */ GifParser: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.GifParser),\n/* harmony export */ GlobalCoordinates: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.GlobalCoordinates),\n/* harmony export */ GpuParticleEmitter: () => (/* reexport safe */ _Particles_index__WEBPACK_IMPORTED_MODULE_15__.GpuParticleEmitter),\n/* harmony export */ GpuParticleRenderer: () => (/* reexport safe */ _Particles_index__WEBPACK_IMPORTED_MODULE_15__.GpuParticleRenderer),\n/* harmony export */ Graphic: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Graphic),\n/* harmony export */ GraphicsComponent: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.GraphicsComponent),\n/* harmony export */ GraphicsGroup: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.GraphicsGroup),\n/* harmony export */ GraphicsSystem: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.GraphicsSystem),\n/* harmony export */ HashColliderProxy: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.HashColliderProxy),\n/* harmony export */ HashGridCell: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.HashGridCell),\n/* harmony export */ HashGridProxy: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.HashGridProxy),\n/* harmony export */ HiddenEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.HiddenEvent),\n/* harmony export */ HorizontalFirst: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.HorizontalFirst),\n/* harmony export */ ImageFiltering: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ImageFiltering),\n/* harmony export */ ImageSource: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ImageSource),\n/* harmony export */ ImageSourceAttributeConstants: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ImageSourceAttributeConstants),\n/* harmony export */ ImageWrapping: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ImageWrapping),\n/* harmony export */ InitializeEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.InitializeEvent),\n/* harmony export */ InputHost: () => (/* reexport safe */ _Input_InputHost__WEBPACK_IMPORTED_MODULE_42__.InputHost),\n/* harmony export */ InputMapper: () => (/* reexport safe */ _Input_InputMapper__WEBPACK_IMPORTED_MODULE_43__.InputMapper),\n/* harmony export */ IsometricEntityComponent: () => (/* reexport safe */ _TileMap_index__WEBPACK_IMPORTED_MODULE_17__.IsometricEntityComponent),\n/* harmony export */ IsometricEntitySystem: () => (/* reexport safe */ _TileMap_index__WEBPACK_IMPORTED_MODULE_17__.IsometricEntitySystem),\n/* harmony export */ IsometricMap: () => (/* reexport safe */ _TileMap_index__WEBPACK_IMPORTED_MODULE_17__.IsometricMap),\n/* harmony export */ IsometricTile: () => (/* reexport safe */ _TileMap_index__WEBPACK_IMPORTED_MODULE_17__.IsometricTile),\n/* harmony export */ KeyEvent: () => (/* reexport safe */ _Input_Keyboard__WEBPACK_IMPORTED_MODULE_41__.KeyEvent),\n/* harmony export */ Keyboard: () => (/* reexport safe */ _Input_Keyboard__WEBPACK_IMPORTED_MODULE_41__.Keyboard),\n/* harmony export */ Keys: () => (/* reexport safe */ _Input_Keyboard__WEBPACK_IMPORTED_MODULE_41__.Keys),\n/* harmony export */ KillEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.KillEvent),\n/* harmony export */ Label: () => (/* reexport safe */ _Label__WEBPACK_IMPORTED_MODULE_13__.Label),\n/* harmony export */ LimitCameraBoundsStrategy: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.LimitCameraBoundsStrategy),\n/* harmony export */ Line: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Line),\n/* harmony export */ LineSegment: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.LineSegment),\n/* harmony export */ Loader: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.Loader),\n/* harmony export */ LoaderEvents: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.LoaderEvents),\n/* harmony export */ LockCameraToActorAxisStrategy: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.LockCameraToActorAxisStrategy),\n/* harmony export */ LockCameraToActorStrategy: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.LockCameraToActorStrategy),\n/* harmony export */ LogLevel: () => (/* reexport safe */ _Util_Log__WEBPACK_IMPORTED_MODULE_50__.LogLevel),\n/* harmony export */ Logger: () => (/* reexport safe */ _Util_Log__WEBPACK_IMPORTED_MODULE_50__.Logger),\n/* harmony export */ Material: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Material),\n/* harmony export */ Matrix: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.Matrix),\n/* harmony export */ MatrixLocations: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.MatrixLocations),\n/* harmony export */ MediaEvent: () => (/* reexport safe */ _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_11__.MediaEvent),\n/* harmony export */ Meet: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.Meet),\n/* harmony export */ MotionComponent: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.MotionComponent),\n/* harmony export */ MotionSystem: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.MotionSystem),\n/* harmony export */ MoveBy: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.MoveBy),\n/* harmony export */ MoveByWithOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.MoveByWithOptions),\n/* harmony export */ MoveTo: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.MoveTo),\n/* harmony export */ MoveToWithOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.MoveToWithOptions),\n/* harmony export */ NativePointerButton: () => (/* reexport safe */ _Input_NativePointerButton__WEBPACK_IMPORTED_MODULE_33__.NativePointerButton),\n/* harmony export */ NativeSoundEvent: () => (/* reexport safe */ _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_11__.NativeSoundEvent),\n/* harmony export */ NativeSoundProcessedEvent: () => (/* reexport safe */ _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_11__.NativeSoundProcessedEvent),\n/* harmony export */ NineSlice: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.NineSlice),\n/* harmony export */ NineSliceStretch: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.NineSliceStretch),\n/* harmony export */ None: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.None),\n/* harmony export */ Observable: () => (/* reexport safe */ _Util_Observable__WEBPACK_IMPORTED_MODULE_49__.Observable),\n/* harmony export */ OffscreenSystem: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.OffscreenSystem),\n/* harmony export */ Pair: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.Pair),\n/* harmony export */ ParallaxComponent: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ParallaxComponent),\n/* harmony export */ ParallelActions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ParallelActions),\n/* harmony export */ Particle: () => (/* reexport safe */ _Particles_index__WEBPACK_IMPORTED_MODULE_15__.Particle),\n/* harmony export */ ParticleEmitter: () => (/* reexport safe */ _Particles_index__WEBPACK_IMPORTED_MODULE_15__.ParticleEmitter),\n/* harmony export */ ParticleRenderer: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ParticleRenderer),\n/* harmony export */ ParticleTransform: () => (/* reexport safe */ _Particles_index__WEBPACK_IMPORTED_MODULE_15__.ParticleTransform),\n/* harmony export */ PhysicsStats: () => (/* reexport safe */ _Debug_index__WEBPACK_IMPORTED_MODULE_9__.PhysicsStats),\n/* harmony export */ PhysicsWorld: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.PhysicsWorld),\n/* harmony export */ PointerAbstraction: () => (/* reexport safe */ _Input_PointerAbstraction__WEBPACK_IMPORTED_MODULE_35__.PointerAbstraction),\n/* harmony export */ PointerButton: () => (/* reexport safe */ _Input_PointerButton__WEBPACK_IMPORTED_MODULE_32__.PointerButton),\n/* harmony export */ PointerComponent: () => (/* reexport safe */ _Input_PointerComponent__WEBPACK_IMPORTED_MODULE_36__.PointerComponent),\n/* harmony export */ PointerEvent: () => (/* reexport safe */ _Input_PointerEvent__WEBPACK_IMPORTED_MODULE_30__.PointerEvent),\n/* harmony export */ PointerEventReceiver: () => (/* reexport safe */ _Input_PointerEventReceiver__WEBPACK_IMPORTED_MODULE_34__.PointerEventReceiver),\n/* harmony export */ PointerScope: () => (/* reexport safe */ _Input_PointerScope__WEBPACK_IMPORTED_MODULE_39__.PointerScope),\n/* harmony export */ PointerSystem: () => (/* reexport safe */ _Input_PointerSystem__WEBPACK_IMPORTED_MODULE_37__.PointerSystem),\n/* harmony export */ PointerType: () => (/* reexport safe */ _Input_PointerType__WEBPACK_IMPORTED_MODULE_38__.PointerType),\n/* harmony export */ Polygon: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Polygon),\n/* harmony export */ PolygonCollider: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.PolygonCollider),\n/* harmony export */ Pool: () => (/* reexport safe */ _Util_Pool__WEBPACK_IMPORTED_MODULE_51__.Pool),\n/* harmony export */ PostCollisionEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PostCollisionEvent),\n/* harmony export */ PostDebugDrawEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PostDebugDrawEvent),\n/* harmony export */ PostDrawEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PostDrawEvent),\n/* harmony export */ PostFrameEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PostFrameEvent),\n/* harmony export */ PostKillEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PostKillEvent),\n/* harmony export */ PostTransformDrawEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PostTransformDrawEvent),\n/* harmony export */ PostUpdateEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PostUpdateEvent),\n/* harmony export */ PreCollisionEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PreCollisionEvent),\n/* harmony export */ PreDebugDrawEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PreDebugDrawEvent),\n/* harmony export */ PreDrawEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PreDrawEvent),\n/* harmony export */ PreFrameEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PreFrameEvent),\n/* harmony export */ PreKillEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PreKillEvent),\n/* harmony export */ PreLoadEvent: () => (/* reexport safe */ _Scene__WEBPACK_IMPORTED_MODULE_16__.PreLoadEvent),\n/* harmony export */ PreTransformDrawEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PreTransformDrawEvent),\n/* harmony export */ PreUpdateEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PreUpdateEvent),\n/* harmony export */ Projection: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.Projection),\n/* harmony export */ QuadIndexBuffer: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.QuadIndexBuffer),\n/* harmony export */ QuadTree: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.QuadTree),\n/* harmony export */ Query: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.Query),\n/* harmony export */ QueryManager: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.QueryManager),\n/* harmony export */ RadiusAroundActorStrategy: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.RadiusAroundActorStrategy),\n/* harmony export */ Random: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.Random),\n/* harmony export */ Raster: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Raster),\n/* harmony export */ Ray: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.Ray),\n/* harmony export */ RealisticSolver: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.RealisticSolver),\n/* harmony export */ Rectangle: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Rectangle),\n/* harmony export */ RemoveEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.RemoveEvent),\n/* harmony export */ RemovedComponent: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.RemovedComponent),\n/* harmony export */ Repeat: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.Repeat),\n/* harmony export */ RepeatForever: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.RepeatForever),\n/* harmony export */ Resolution: () => (/* reexport safe */ _Screen__WEBPACK_IMPORTED_MODULE_5__.Resolution),\n/* harmony export */ Resource: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.Resource),\n/* harmony export */ ResourceEvents: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.ResourceEvents),\n/* harmony export */ RotateBy: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.RotateBy),\n/* harmony export */ RotateByWithOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.RotateByWithOptions),\n/* harmony export */ RotateTo: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.RotateTo),\n/* harmony export */ RotateToWithOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.RotateToWithOptions),\n/* harmony export */ RotationType: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.RotationType),\n/* harmony export */ ScaleBy: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ScaleBy),\n/* harmony export */ ScaleByWithOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ScaleByWithOptions),\n/* harmony export */ ScaleTo: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ScaleTo),\n/* harmony export */ ScaleToWithOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ScaleToWithOptions),\n/* harmony export */ Scene: () => (/* reexport safe */ _Scene__WEBPACK_IMPORTED_MODULE_16__.Scene),\n/* harmony export */ SceneEvents: () => (/* reexport safe */ _Scene__WEBPACK_IMPORTED_MODULE_16__.SceneEvents),\n/* harmony export */ Screen: () => (/* reexport safe */ _Screen__WEBPACK_IMPORTED_MODULE_5__.Screen),\n/* harmony export */ ScreenAppender: () => (/* reexport safe */ _Util_Log__WEBPACK_IMPORTED_MODULE_50__.ScreenAppender),\n/* harmony export */ ScreenElement: () => (/* reexport safe */ _ScreenElement__WEBPACK_IMPORTED_MODULE_20__.ScreenElement),\n/* harmony export */ ScreenEvents: () => (/* reexport safe */ _Screen__WEBPACK_IMPORTED_MODULE_5__.ScreenEvents),\n/* harmony export */ ScreenShader: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ScreenShader),\n/* harmony export */ ScrollPreventionMode: () => (/* reexport safe */ _Engine__WEBPACK_IMPORTED_MODULE_3__.ScrollPreventionMode),\n/* harmony export */ Semaphore: () => (/* reexport safe */ _Util_Semaphore__WEBPACK_IMPORTED_MODULE_58__.Semaphore),\n/* harmony export */ SeparatingAxis: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.SeparatingAxis),\n/* harmony export */ SeparationInfo: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.SeparationInfo),\n/* harmony export */ Shader: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Shader),\n/* harmony export */ Shape: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.Shape),\n/* harmony export */ Side: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.Side),\n/* harmony export */ Slide: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.Slide),\n/* harmony export */ SolverStrategy: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.SolverStrategy),\n/* harmony export */ Sound: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.Sound),\n/* harmony export */ SoundEvents: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.SoundEvents),\n/* harmony export */ SparseHashGrid: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.SparseHashGrid),\n/* harmony export */ SparseHashGridCollisionProcessor: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.SparseHashGridCollisionProcessor),\n/* harmony export */ SpatialPartitionStrategy: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.SpatialPartitionStrategy),\n/* harmony export */ Sprite: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Sprite),\n/* harmony export */ SpriteFont: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.SpriteFont),\n/* harmony export */ SpriteSheet: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.SpriteSheet),\n/* harmony export */ StandardClock: () => (/* reexport safe */ _Util_Clock__WEBPACK_IMPORTED_MODULE_53__.StandardClock),\n/* harmony export */ StateMachine: () => (/* reexport safe */ _Util_StateMachine__WEBPACK_IMPORTED_MODULE_56__.StateMachine),\n/* harmony export */ StrategyContainer: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.StrategyContainer),\n/* harmony export */ Stream: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.Stream),\n/* harmony export */ System: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.System),\n/* harmony export */ SystemManager: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.SystemManager),\n/* harmony export */ SystemPriority: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.SystemPriority),\n/* harmony export */ SystemType: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.SystemType),\n/* harmony export */ TagQuery: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.TagQuery),\n/* harmony export */ TestClock: () => (/* reexport safe */ _Util_Clock__WEBPACK_IMPORTED_MODULE_53__.TestClock),\n/* harmony export */ Text: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Text),\n/* harmony export */ TextAlign: () => (/* reexport safe */ _Graphics_FontCommon__WEBPACK_IMPORTED_MODULE_14__.TextAlign),\n/* harmony export */ TextureLoader: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.TextureLoader),\n/* harmony export */ Tile: () => (/* reexport safe */ _TileMap_index__WEBPACK_IMPORTED_MODULE_17__.Tile),\n/* harmony export */ TileMap: () => (/* reexport safe */ _TileMap_index__WEBPACK_IMPORTED_MODULE_17__.TileMap),\n/* harmony export */ TileMapEvents: () => (/* reexport safe */ _TileMap_index__WEBPACK_IMPORTED_MODULE_17__.TileMapEvents),\n/* harmony export */ TiledAnimation: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.TiledAnimation),\n/* harmony export */ TiledSprite: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.TiledSprite),\n/* harmony export */ Timer: () => (/* reexport safe */ _Timer__WEBPACK_IMPORTED_MODULE_18__.Timer),\n/* harmony export */ Toaster: () => (/* reexport safe */ _Util_Toaster__WEBPACK_IMPORTED_MODULE_55__.Toaster),\n/* harmony export */ Transform: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.Transform),\n/* harmony export */ TransformComponent: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.TransformComponent),\n/* harmony export */ Transition: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.Transition),\n/* harmony export */ TreeNode: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.TreeNode),\n/* harmony export */ Trigger: () => (/* reexport safe */ _Trigger__WEBPACK_IMPORTED_MODULE_19__.Trigger),\n/* harmony export */ TriggerEvents: () => (/* reexport safe */ _Trigger__WEBPACK_IMPORTED_MODULE_19__.TriggerEvents),\n/* harmony export */ TwoPI: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.TwoPI),\n/* harmony export */ Util: () => (/* reexport module object */ _Util_Index__WEBPACK_IMPORTED_MODULE_44__),\n/* harmony export */ Vector: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.Vector),\n/* harmony export */ VectorView: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.VectorView),\n/* harmony export */ VertexBuffer: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.VertexBuffer),\n/* harmony export */ VertexLayout: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.VertexLayout),\n/* harmony export */ VerticalFirst: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.VerticalFirst),\n/* harmony export */ VisibleEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.VisibleEvent),\n/* harmony export */ WebAudio: () => (/* reexport safe */ _Util_WebAudio__WEBPACK_IMPORTED_MODULE_54__.WebAudio),\n/* harmony export */ WebAudioInstance: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.WebAudioInstance),\n/* harmony export */ WheelDeltaMode: () => (/* reexport safe */ _Input_WheelDeltaMode__WEBPACK_IMPORTED_MODULE_31__.WheelDeltaMode),\n/* harmony export */ WheelEvent: () => (/* reexport safe */ _Input_WheelEvent__WEBPACK_IMPORTED_MODULE_29__.WheelEvent),\n/* harmony export */ World: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.World),\n/* harmony export */ approximatelyEqual: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.approximatelyEqual),\n/* harmony export */ assert: () => (/* reexport safe */ _Util_Assert__WEBPACK_IMPORTED_MODULE_60__.assert),\n/* harmony export */ canonicalizeAngle: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.canonicalizeAngle),\n/* harmony export */ clamp: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.clamp),\n/* harmony export */ coroutine: () => (/* reexport safe */ _Util_Coroutine__WEBPACK_IMPORTED_MODULE_59__.coroutine),\n/* harmony export */ createId: () => (/* reexport safe */ _Id__WEBPACK_IMPORTED_MODULE_2__.createId),\n/* harmony export */ frac: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.frac),\n/* harmony export */ getDefaultPhysicsConfig: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.getDefaultPhysicsConfig),\n/* harmony export */ hasGraphicsTick: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.hasGraphicsTick),\n/* harmony export */ hasOnAdd: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.hasOnAdd),\n/* harmony export */ hasOnInitialize: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.hasOnInitialize),\n/* harmony export */ hasOnPostUpdate: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.hasOnPostUpdate),\n/* harmony export */ hasOnPreUpdate: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.hasOnPreUpdate),\n/* harmony export */ hasOnRemove: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.hasOnRemove),\n/* harmony export */ hasPostDraw: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.hasPostDraw),\n/* harmony export */ hasPreDraw: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.hasPreDraw),\n/* harmony export */ has_add: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.has_add),\n/* harmony export */ has_initialize: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.has_initialize),\n/* harmony export */ has_postupdate: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.has_postupdate),\n/* harmony export */ has_preupdate: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.has_preupdate),\n/* harmony export */ has_remove: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.has_remove),\n/* harmony export */ inverseLerp: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.inverseLerp),\n/* harmony export */ inverseLerpVector: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.inverseLerpVector),\n/* harmony export */ isActor: () => (/* reexport safe */ _Actor__WEBPACK_IMPORTED_MODULE_6__.isActor),\n/* harmony export */ isAddedComponent: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.isAddedComponent),\n/* harmony export */ isComponentCtor: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.isComponentCtor),\n/* harmony export */ isLoaderConstructor: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.isLoaderConstructor),\n/* harmony export */ isMoveByOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.isMoveByOptions),\n/* harmony export */ isMoveToOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.isMoveToOptions),\n/* harmony export */ isRemovedComponent: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.isRemovedComponent),\n/* harmony export */ isRotateByOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.isRotateByOptions),\n/* harmony export */ isRotateToOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.isRotateToOptions),\n/* harmony export */ isScaleByOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.isScaleByOptions),\n/* harmony export */ isScaleToOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.isScaleToOptions),\n/* harmony export */ isSceneConstructor: () => (/* reexport safe */ _Scene__WEBPACK_IMPORTED_MODULE_16__.isSceneConstructor),\n/* harmony export */ isScreenElement: () => (/* reexport safe */ _ScreenElement__WEBPACK_IMPORTED_MODULE_20__.isScreenElement),\n/* harmony export */ isSystemConstructor: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.isSystemConstructor),\n/* harmony export */ lerp: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.lerp),\n/* harmony export */ lerpAngle: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.lerpAngle),\n/* harmony export */ lerpVector: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.lerpVector),\n/* harmony export */ maxMessages: () => (/* reexport safe */ _Util_Decorators__WEBPACK_IMPORTED_MODULE_46__.maxMessages),\n/* harmony export */ nextActionId: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.nextActionId),\n/* harmony export */ obsolete: () => (/* reexport safe */ _Util_Decorators__WEBPACK_IMPORTED_MODULE_46__.obsolete),\n/* harmony export */ parseImageFiltering: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.parseImageFiltering),\n/* harmony export */ parseImageWrapping: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.parseImageWrapping),\n/* harmony export */ pixelSnapEpsilon: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.pixelSnapEpsilon),\n/* harmony export */ randomInRange: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.randomInRange),\n/* harmony export */ randomIntInRange: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.randomIntInRange),\n/* harmony export */ range: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.range),\n/* harmony export */ remap: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.remap),\n/* harmony export */ remapVector: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.remapVector),\n/* harmony export */ resetObsoleteCounter: () => (/* reexport safe */ _Util_Decorators__WEBPACK_IMPORTED_MODULE_46__.resetObsoleteCounter),\n/* harmony export */ sign: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.sign),\n/* harmony export */ toDegrees: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.toDegrees),\n/* harmony export */ toRadians: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.toRadians),\n/* harmony export */ vec: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.vec),\n/* harmony export */ webgl: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.webgl)\n/* harmony export */ });\n/* harmony import */ var _Polyfill__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Polyfill */ \"./Polyfill.ts\");\n/* harmony import */ var _Flags__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Flags */ \"./Flags.ts\");\n/* harmony import */ var _Id__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Id */ \"./Id.ts\");\n/* harmony import */ var _Engine__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Engine */ \"./Engine.ts\");\n/* harmony import */ var _GarbageCollector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./GarbageCollector */ \"./GarbageCollector.ts\");\n/* harmony import */ var _Screen__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Screen */ \"./Screen.ts\");\n/* harmony import */ var _Actor__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Actor */ \"./Actor.ts\");\n/* harmony import */ var _Math_index__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Math/index */ \"./Math/index.ts\");\n/* harmony import */ var _Camera__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Camera */ \"./Camera.ts\");\n/* harmony import */ var _Debug_index__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Debug/index */ \"./Debug/index.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Events/MediaEvents */ \"./Events/MediaEvents.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Events */ \"./Events.ts\");\n/* harmony import */ var _Label__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Label */ \"./Label.ts\");\n/* harmony import */ var _Graphics_FontCommon__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Graphics/FontCommon */ \"./Graphics/FontCommon.ts\");\n/* harmony import */ var _Particles_index__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Particles/index */ \"./Particles/index.ts\");\n/* harmony import */ var _Scene__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Scene */ \"./Scene.ts\");\n/* harmony import */ var _TileMap_index__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./TileMap/index */ \"./TileMap/index.ts\");\n/* harmony import */ var _Timer__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Timer */ \"./Timer.ts\");\n/* harmony import */ var _Trigger__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./Trigger */ \"./Trigger.ts\");\n/* harmony import */ var _ScreenElement__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./ScreenElement */ \"./ScreenElement.ts\");\n/* harmony import */ var _Actions_index__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./Actions/index */ \"./Actions/index.ts\");\n/* harmony import */ var _Collision_Index__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./Collision/Index */ \"./Collision/Index.ts\");\n/* harmony import */ var _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./Interfaces/Index */ \"./Interfaces/Index.ts\");\n/* harmony import */ var _Resources_Index__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./Resources/Index */ \"./Resources/Index.ts\");\n/* harmony import */ var _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./EntityComponentSystem/index */ \"./EntityComponentSystem/index.ts\");\n/* harmony import */ var _Director_index__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./Director/index */ \"./Director/index.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./Color */ \"./Color.ts\");\n/* harmony import */ var _Graphics_index__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./Graphics/index */ \"./Graphics/index.ts\");\n/* harmony import */ var _Input_WheelEvent__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./Input/WheelEvent */ \"./Input/WheelEvent.ts\");\n/* harmony import */ var _Input_PointerEvent__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./Input/PointerEvent */ \"./Input/PointerEvent.ts\");\n/* harmony import */ var _Input_WheelDeltaMode__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./Input/WheelDeltaMode */ \"./Input/WheelDeltaMode.ts\");\n/* harmony import */ var _Input_PointerButton__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./Input/PointerButton */ \"./Input/PointerButton.ts\");\n/* harmony import */ var _Input_NativePointerButton__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./Input/NativePointerButton */ \"./Input/NativePointerButton.ts\");\n/* harmony import */ var _Input_PointerEventReceiver__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./Input/PointerEventReceiver */ \"./Input/PointerEventReceiver.ts\");\n/* harmony import */ var _Input_PointerAbstraction__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./Input/PointerAbstraction */ \"./Input/PointerAbstraction.ts\");\n/* harmony import */ var _Input_PointerComponent__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./Input/PointerComponent */ \"./Input/PointerComponent.ts\");\n/* harmony import */ var _Input_PointerSystem__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./Input/PointerSystem */ \"./Input/PointerSystem.ts\");\n/* harmony import */ var _Input_PointerType__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./Input/PointerType */ \"./Input/PointerType.ts\");\n/* harmony import */ var _Input_PointerScope__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./Input/PointerScope */ \"./Input/PointerScope.ts\");\n/* harmony import */ var _Input_Gamepad__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./Input/Gamepad */ \"./Input/Gamepad.ts\");\n/* harmony import */ var _Input_Keyboard__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ./Input/Keyboard */ \"./Input/Keyboard.ts\");\n/* harmony import */ var _Input_InputHost__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ./Input/InputHost */ \"./Input/InputHost.ts\");\n/* harmony import */ var _Input_InputMapper__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ./Input/InputMapper */ \"./Input/InputMapper.ts\");\n/* harmony import */ var _Util_Index__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! ./Util/Index */ \"./Util/Index.ts\");\n/* harmony import */ var _Util_Browser__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! ./Util/Browser */ \"./Util/Browser.ts\");\n/* harmony import */ var _Util_Decorators__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! ./Util/Decorators */ \"./Util/Decorators.ts\");\n/* harmony import */ var _Util_Detector__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! ./Util/Detector */ \"./Util/Detector.ts\");\n/* harmony import */ var _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! ./Util/EasingFunctions */ \"./Util/EasingFunctions.ts\");\n/* harmony import */ var _Util_Observable__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(/*! ./Util/Observable */ \"./Util/Observable.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(/*! ./Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Util_Pool__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(/*! ./Util/Pool */ \"./Util/Pool.ts\");\n/* harmony import */ var _Util_Fps__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(/*! ./Util/Fps */ \"./Util/Fps.ts\");\n/* harmony import */ var _Util_Clock__WEBPACK_IMPORTED_MODULE_53__ = __webpack_require__(/*! ./Util/Clock */ \"./Util/Clock.ts\");\n/* harmony import */ var _Util_WebAudio__WEBPACK_IMPORTED_MODULE_54__ = __webpack_require__(/*! ./Util/WebAudio */ \"./Util/WebAudio.ts\");\n/* harmony import */ var _Util_Toaster__WEBPACK_IMPORTED_MODULE_55__ = __webpack_require__(/*! ./Util/Toaster */ \"./Util/Toaster.ts\");\n/* harmony import */ var _Util_StateMachine__WEBPACK_IMPORTED_MODULE_56__ = __webpack_require__(/*! ./Util/StateMachine */ \"./Util/StateMachine.ts\");\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_57__ = __webpack_require__(/*! ./Util/Future */ \"./Util/Future.ts\");\n/* harmony import */ var _Util_Semaphore__WEBPACK_IMPORTED_MODULE_58__ = __webpack_require__(/*! ./Util/Semaphore */ \"./Util/Semaphore.ts\");\n/* harmony import */ var _Util_Coroutine__WEBPACK_IMPORTED_MODULE_59__ = __webpack_require__(/*! ./Util/Coroutine */ \"./Util/Coroutine.ts\");\n/* harmony import */ var _Util_Assert__WEBPACK_IMPORTED_MODULE_60__ = __webpack_require__(/*! ./Util/Assert */ \"./Util/Assert.ts\");\n/**\n * The current Excalibur version string\n * @description `process.env.__EX_VERSION` gets replaced by Webpack on build\n */\nconst EX_VERSION = \"0.30.1\";\n\n(0,_Polyfill__WEBPACK_IMPORTED_MODULE_0__.polyfill)();\n// This file is used as the bundle entry point and exports everything\n// that will be exposed as the `ex` global variable.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// ex.Events namespace\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// ex.Util namespaces\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// ex.Deprecated\n// import * as deprecated from './Deprecated';\n// export { deprecated as Deprecated };\n// export * from './Deprecated';\n\n\n/***/ }),\n\n/***/ \"./Director/Loader.logo.png\":\n/*!**********************************!*\\\n !*** ./Director/Loader.logo.png ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAdQAAAB2CAYAAABxhGI9AAAACXBIWXMAAAsSAAALEgHS3X78AAAKnUlEQVR42u3dP2wjSx0H8N8hJIonIRmJjsq0SBR+BQ1dcqKhe0lD77SvSwpKkJKGPulpktfRIMUdEqKIqV57rpAokM4dbSiyq7ONPTP7x39ifz7SFbnEnp3xer47O7uzH15fXwMA6OYHmgAABCoACFQAEKgAgEAFAIEKAAIVAAQqACBQAUCgAoBABQCBCgAIVAAQqAAgUAFAoAIAAhUABCoACFQAEKgAgECFLbmOiNeFf2PbAyz68Pr6qhUgbRwR92v+/zwiJrYHMEKFMmcN///UtgcQqFBk1PD/97U9Qx8VCFSgu4EmAIEKAAIVAAQqACBQ4Z25jojP8eX+0WtNAgIVaOY+Im5j+eKh24h41jQgUIEyZ7F5NaPU7wCBCiwYd/w9cOB+qAlgJ3KLLow0EV198803RWvJfvfddx+0lhEqHKu5JgAjVCBvlhmFzjQRXUekHz9+TP79y8uLRjNChXfvoePvAYEKxNtj1e42/O5JoIJABcrdRMRVLM+X3kTEpaaB988cKuzWg9EobTWdMx0Oly8uN4dqhAoARqgnaN3arHfqu7OyH8ItKLVB/P+CEfMTHyGPY3npx1m8zWGDEeoBfUk/xdti57dr/r1Wv2+6EPow3tZ5rRdS72s1neuF97xvWd+XTH0/V+UMttDWqbI/r2nrxfp+jv2uSjSO7S+OXy/A/3lN+9xX5T5HxEUPZZ0tfB71+w57eJ/HFu+z+jkv1u92YX9fbI/HhX3JA9rp5MPr66tWaG9UfUGbrHIzi7cLUyYFf/tpTady03EEeL8mUJ6i7MKYNvWNqr4Pe2jradXO60LrvPAz2PQ5RPX684ah8dxD+2zantnCgVipSVV+m/tgB9W2DDq2Sx/vM95wcHhZhWVJm8yrv58cSgfTdc70+++/X/r522+/tUKSEepBqo+om4ZLPerMjUwuNnQCtx1GWJtee1FwdD5uWd86xLs8UaVt2aNEO1/saZ/Z5rYMW4zq6v34rGV9Bg3q2eZ9SkeNm9qwyUh30OPIHYFKx5FG03C7znSOqYBq+qW/zpQ3anH037TNHluG6f0WPsPhHvab4QFty7ogOeuxDYcNy2/zu2214WNYWxmBurNO8bGn97pNBOO8xy/9uCorZZ4I2r4C7aJgO7ZV9iE49Dm6NvOWx+pWE9CUq3zbdTp9doz38TbXtzqH9RT5CyWe422OaZoZGeZCabrhPQY9HjwsjpTvCg4YtlE2+Ta/j2bzn8fqrDqgm+6yUHOmAvWUjAtGhbNYvsBknDnqH1Qhc7VmxHgeb/NbudA5j/UXlYwif2p6luhAc9teu1npiHKnDs8if6tCm7JLX3NKpgttXe9ruc9mHMd7a83iwdxF5vt8tutARaCeklRnNK9C8WnNF7geJQ4T4XG3JhSnVdilQrG+yOnrlVHfsEGYzhNBn7Lu6tS7+HJafJQ4EMiNlNqWXZ9WPvVgnVYHG5M1ByDXkT6leX2EgTqJtyt45yv7S2qO3sEZjZhDLXeR+YKdJ0Zdk8QocvH9N732KrNtq+FZ/zzIHABcJrYpd+Xv14lOd5ap76SgrduW/VTQ1qcQpqnbgu4ifZvUMNpd9XuoZmvCtPaQ2Y/BCHVLgbrJTeRPDdVf6pfMKDU2fOkHmVFFfXr3MsouLsnNvV5kRoe5+s431PeuoKPqWnaurY/ZPBEeqwceN4l96iwO6H7Mjq4y7VGPVNe10VaZMzVCPVWpI/Z6FZbcv5fMqGCU+dLfFGzj58jP8+bCdJCo7yzKTwdOF0bu9Ug7V4c+yz7FJfYeGoysUss0HssIdVZwYLDujMqlESoCdTtGsZtbHnJBeNdDSJSs0jTKdMJN1HNX54Wv7bvsU9NkVJVa13dX+/wuArV0X/l5RHyo/lnfF4G6p6DrS0kHdtXhy35TGErDPYZUn2WfWqDOo/lVqdMD2O/hKJhD7S/odukymq9s02QN4EEPR/zbaOumZc+r15zK1Zqznl9jsfiemTM1QmV3HUuTkedlg9HIQzRbUD93dfC+2tpj2fIHEH2+RqCCQH13gZq7hWXTNpVu19OB1fc9nQ0AKOKUb5lU0P1kDyOneoWk0lOZ9cIP0x7qu8+2BhCoR2wYu1+e7DmaXzBSsu5vaX1ne2zrpmUPTmxf7PM1Dm4y/vC7ny7Nif7+z/9ZmtM0Z3panPLtPmra9f16bcK0Dpbnwk43Vd/RHtu6zfNQTy1QBy3aqG2g9nVmxml+BOoJyT3NpWmn9xhfFnu4bvDa+44BXhqqfdf3uUF9+yz77AT31Yue2mjecYQ62NLfgkA9ghHqLNEhNem4H1c6vdyDxhf/bpz5m4coW/c39wi6VH2bPtHlcaV9cvXts+zxCe6rTeqc2ndL7uGd93QwM9bFcAzMoZZ7SgTBbWx+asui61h/iq1+RmjqdbnQXQ3T1DNQ63V/U9ucqm/pMzPb1rePsk/1iTOjgvatR4W3Lc8ULB78pELyrnAfeTcj1NU509/86mfJ33/8+Mf00a05UyPUEw7UVCeWG/WNEiExyHRMt5ltW30izUPk18ytt7lNfc8i//DvtvXto+ySA5BjljsLUF8lPkqMPEtW1JomDsiGBZ9Byb4NAvUITSN9GuwsIj6t6UTOqk7jJREkmzqli8xIs96udSO20sX0H1vW92IL9e1a9rgqVyf91gbPsTy9UD9n9lOkT8k+RfkFR5PMNqxOcdSf32PBvg3vilO+zdxE+okx9Wm0ph36XYsRZCpMF993GOk5qvqB3Dct6jvssb67KvuUNJ3frw92bhr8/STSF0JdRPMLpUCgnsgo9S76PZ246ZFk1wWvK5m3vVoYvW1Sz7nN91jfXbQ1ZQc7TW6HeaoOalypG/8/p/rP1aNAc6ZHzSnfdqPUPhdy2PQw6Nz9gSVhuhiqueUHR3uu7y7K3rdDX4u46ZrPbUa0IFBZ0seKQ3XQTRt2vm3W/a2DbNKys++rvm3ep6+y1x2UdP3bWU9lzra47U1GmlctX/sQ23t+aOlByLTh/4NAPaCRxtcdO5HLSJ/6vNtCwGx67VPmPbvWd1q9frKHtp4kAqRJ2HR9j762JfX3bZ//elPtj13PPDx1+D5tqk/Xi6NO8SHz7MmH19dXrdBNfVFP6T2PT1UHNit87/t4m5+aRH+nQBdvqyhZDKJLfZs8h7XPsqdV2ZOV+tanKB8aln0dyxdAXbV4j4gvt4oMOrbP6vbU73NW7TMlbdTnPrWpfqXfh9HKZ9vke7KuTeZRNtXRSe6+1FV//ce/ln5eXfsXgcqXzr6+9261M3moOoa7E6nvTZTfy7iNsmfb7kjfgXGsvxe0vihsEts9HTquPpt1q1vtahu2TqAiUAEEKj0zhwoARqgAu/OnX/442WH+9xc/Wvr58re/Tr7f41/+ZsRqhAoACFQAEKgAcHjMoQJskJsz/eqrr5Z+vvr7v5fmQFevAl5lztQIFQAQqAAgUAHgIJlDBdhgdQ41N2eKESoAIFABQKACwFEwhwoARqgAIFABQKACAAIVAAQqAAhUABCoAIBABQCBCgACFQAEKgAgUAFAoAKAQAUAgQoACFQAEKgAIFABQKACAAIVAAQqAAhUABCoAIBABQCBCgACFQAQqAAgUAFAoAKAQAUAlvwPcFDns1DsH4sAAAAASUVORK5CYII=\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/debug-font.png\":\n/*!*****************************************!*\\\n !*** ./Graphics/Context/debug-font.png ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAABACAYAAAD1Xam+AAAAAXNSR0IArs4c6QAABlFJREFUeJztndmy4yoMRcWt/v9fdr8EWoDAaDD4JntVpeqcxBrMIGQDNhEAAAAAAAAAAAAAAOCrSbMfr+u6yoEpTY+906GV57YtPkjyXj9WZZ+wHWHfo2N3/bU6Tte9Rv6ptruqRyMvKvvIX/zY3I/vjLeqsg6l/CWdp0KHKO/1Y1H2EdsR9j06Ntdfp+N03SvkH2u7i3pu5XkQ+DNTkgNJSok+/183xpcdWZHjgUzpQ2pGD67vaf//KRAGAq3tdhCy2tcMQKPyXyz7iPqrdBjbX5h9g7xbtvWf4ZJvM4D/BKG24Sd+IkQ0TC9aW5NM5FbO2HgrPVzW2vmN50DZNv/QWtl5bfPy85SBtdy9dFmjsf2F2SehTBVE+u+tkE5+lAGcJlFwGuodwRRU2Qe3rx0FhPNflc3HWC7BEh8EDGVR5IMCiLnDONtPp87qhxVH/S/LvzUAuDs/kyGimA5oSONKR1w8vsLpv+v+S9vhmS71JRiX1xB5CWZNw7m6rMrllMag/RJyWb67BEgpDVMWSydc+K47pr35w05kWd7ReEq6116KaG4CsbJ7OmV9PdZLEKkONiC1/7ZONVgDsajLIJPYp2OUAXRpnPcGmnIE6eSK4nv5YQqqSYO52JqnYfYj/PdQXQIY7XszuMofMgZRT/1LdeC5h2I5/0EdWDMY2Yb05WDE1RodVdpSA5r85slArAVnSf+89iP896St0f5bZKVA7Gk/3ja8q+152/+wrLqBWZTem3IBADbRBoDuHgAA4HdAAADgh0EAAOCHQQAA4IdBAADgh0EAAOCHuVsKbJ3P9M7jjuxHzGfv8j9iDt47Dx7hP8cjq5F/o/0T62Aer//ZOgDrajBp6aNlOWTEajKLjgj/Pcs/vfZD/a++3Pc8hNfZ966EVeh5vP75luDRJUAl0KzJfnopaqbaTuzZiulc2BS5lltFXntu3dcQsXadl59Wn1H+dfYNtrt2d6D/LDF9HkCQw6eXFbr8P9X5W/un5Ol8gz1t39p5pWOPn0vLynbgdnfe8maEQw+UIPJdfxdOd/4oTtVD0IYg8wDywGas0I04T5O3P8/qf2UWwPpkn1PbOT1bN2tFe59EM7TvKf+TRFw+erZ2ey4hpS3hp9qBkqq/tjsSU1OYqucBWB1yynt5QxC42Mdk30pAEIio//zRG3feBzLUX+TTjCKwlH83aI/KbpQBVEHgUGF0j/SitcLofHem8q6AyH0wBhFv4WszuOjy0yK2vc/oRWQoP2X9ve78jfaLnpncbBqQSC6s0HnIRT0a2yNZjfxT8+ir8t+yDsDTWaS6X70GP33+d77stp+I5HtBdwEAAPBl8ECApcAA/DBvfSowAGAB7/05ZAAA/DAIAADMMU3fOuS2ggAAwBjrorKoxWiPBxHMAgAg490Ts0VeePdA+ZfJDKcCh7sBqY88mmjklZeOt9iXPrvx2I2QPRnN2/qzyJ84h4gNcbtfasq5mM1rZr+bBWh2A+bIIX13Z9wqL+nQvFno7v3oq4tJItCed7isUT6C/I7BUn9KP95wDicYBYpcjncrO2c/dmW4tBtw4RiRld1IDxDyYsoXMHxF1w3dyz0Nne8033AOFsT6VgRCafl89fenTZUfbm8CGhrgdDcS7anAsvnkkP0IeCfQ+JzYunky6jhNYj5bl7++4fJvN9WDSKS/292A0wyANyKDI91bfkm3kcH7ckaP/SKW/VHKRZAcI14pP3beu0fPyn/DuZQbWMogNnsc16sziE96f7H/iai7uTf0/3N8lwFz/e13T00Djt4OrInCnkeChXT+qOcKOLA21tJpsv/G8/COnGnw97J9QwbTvd6djYSv7fxEVTuV/LzNhj7nOawv6bfbAGCYEpQ6HxFtuxs6sq9tzOYHobQ6Nje+6vo5BwFrPZ4OgMayS4PPt1NlzdLfbRCYBoBc+NaO4JWPwLEf33oN3unY3InKPQBW6Z7nEZzEmrl4iZjC804lqgePPEOguQcwWghUphxm343wyt/pWpWR0OrR+jvyxavHajfb9pTjbt9bH07Z5/expM4TLWfwb7QQqMoC+UDWXZo/4RgA38LOgUvLJAAQ1Td9y9//0ylxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+g79apuVUsS5ZmwAAAABJRU5ErkJggg==\");\n\n/***/ })\n\n/******/ });\n/************************************************************************/\n/******/ // The module cache\n/******/ var __webpack_module_cache__ = {};\n/******/ \n/******/ // The require function\n/******/ function __webpack_require__(moduleId) {\n/******/ \t// Check if module is in cache\n/******/ \tvar cachedModule = __webpack_module_cache__[moduleId];\n/******/ \tif (cachedModule !== undefined) {\n/******/ \t\treturn cachedModule.exports;\n/******/ \t}\n/******/ \t// Create a new module (and put it into the cache)\n/******/ \tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\tid: moduleId,\n/******/ \t\t// no module.loaded needed\n/******/ \t\texports: {}\n/******/ \t};\n/******/ \n/******/ \t// Execute the module function\n/******/ \t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/ \n/******/ \t// Return the exports of the module\n/******/ \treturn module.exports;\n/******/ }\n/******/ \n/************************************************************************/\n/******/ /* webpack/runtime/compat get default export */\n/******/ (() => {\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = (module) => {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t() => (module['default']) :\n/******/ \t\t\t() => (module);\n/******/ \t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\treturn getter;\n/******/ \t};\n/******/ })();\n/******/ \n/******/ /* webpack/runtime/define property getters */\n/******/ (() => {\n/******/ \t// define getter functions for harmony exports\n/******/ \t__webpack_require__.d = (exports, definition) => {\n/******/ \t\tfor(var key in definition) {\n/******/ \t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t}\n/******/ \t\t}\n/******/ \t};\n/******/ })();\n/******/ \n/******/ /* webpack/runtime/hasOwnProperty shorthand */\n/******/ (() => {\n/******/ \t__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))\n/******/ })();\n/******/ \n/******/ /* webpack/runtime/make namespace object */\n/******/ (() => {\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = (exports) => {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/ })();\n/******/ \n/************************************************************************/\n/******/ \n/******/ // startup\n/******/ // Load entry module and return exports\n/******/ // This entry module is referenced by other modules so it can't be inlined\n/******/ var __webpack_exports__ = __webpack_require__(\"./index.ts\");\n/******/ var __webpack_exports__ActionCompleteEvent = __webpack_exports__.ActionCompleteEvent;\n/******/ var __webpack_exports__ActionContext = __webpack_exports__.ActionContext;\n/******/ var __webpack_exports__ActionQueue = __webpack_exports__.ActionQueue;\n/******/ var __webpack_exports__ActionSequence = __webpack_exports__.ActionSequence;\n/******/ var __webpack_exports__ActionStartEvent = __webpack_exports__.ActionStartEvent;\n/******/ var __webpack_exports__ActionsComponent = __webpack_exports__.ActionsComponent;\n/******/ var __webpack_exports__ActionsSystem = __webpack_exports__.ActionsSystem;\n/******/ var __webpack_exports__ActivateEvent = __webpack_exports__.ActivateEvent;\n/******/ var __webpack_exports__Actor = __webpack_exports__.Actor;\n/******/ var __webpack_exports__ActorEvents = __webpack_exports__.ActorEvents;\n/******/ var __webpack_exports__AddEvent = __webpack_exports__.AddEvent;\n/******/ var __webpack_exports__AddedComponent = __webpack_exports__.AddedComponent;\n/******/ var __webpack_exports__AffineMatrix = __webpack_exports__.AffineMatrix;\n/******/ var __webpack_exports__Animation = __webpack_exports__.Animation;\n/******/ var __webpack_exports__AnimationDirection = __webpack_exports__.AnimationDirection;\n/******/ var __webpack_exports__AnimationEvents = __webpack_exports__.AnimationEvents;\n/******/ var __webpack_exports__AnimationStrategy = __webpack_exports__.AnimationStrategy;\n/******/ var __webpack_exports__ArcadeSolver = __webpack_exports__.ArcadeSolver;\n/******/ var __webpack_exports__AudioContextFactory = __webpack_exports__.AudioContextFactory;\n/******/ var __webpack_exports__Axes = __webpack_exports__.Axes;\n/******/ var __webpack_exports__Axis = __webpack_exports__.Axis;\n/******/ var __webpack_exports__BaseAlign = __webpack_exports__.BaseAlign;\n/******/ var __webpack_exports__BezierCurve = __webpack_exports__.BezierCurve;\n/******/ var __webpack_exports__Blink = __webpack_exports__.Blink;\n/******/ var __webpack_exports__BodyComponent = __webpack_exports__.BodyComponent;\n/******/ var __webpack_exports__BoundingBox = __webpack_exports__.BoundingBox;\n/******/ var __webpack_exports__BrowserComponent = __webpack_exports__.BrowserComponent;\n/******/ var __webpack_exports__BrowserEvents = __webpack_exports__.BrowserEvents;\n/******/ var __webpack_exports__Buttons = __webpack_exports__.Buttons;\n/******/ var __webpack_exports__Camera = __webpack_exports__.Camera;\n/******/ var __webpack_exports__CameraEvents = __webpack_exports__.CameraEvents;\n/******/ var __webpack_exports__Canvas = __webpack_exports__.Canvas;\n/******/ var __webpack_exports__Circle = __webpack_exports__.Circle;\n/******/ var __webpack_exports__CircleCollider = __webpack_exports__.CircleCollider;\n/******/ var __webpack_exports__Clock = __webpack_exports__.Clock;\n/******/ var __webpack_exports__ClosestLineJumpTable = __webpack_exports__.ClosestLineJumpTable;\n/******/ var __webpack_exports__Collider = __webpack_exports__.Collider;\n/******/ var __webpack_exports__ColliderComponent = __webpack_exports__.ColliderComponent;\n/******/ var __webpack_exports__CollisionContact = __webpack_exports__.CollisionContact;\n/******/ var __webpack_exports__CollisionEndEvent = __webpack_exports__.CollisionEndEvent;\n/******/ var __webpack_exports__CollisionGroup = __webpack_exports__.CollisionGroup;\n/******/ var __webpack_exports__CollisionGroupManager = __webpack_exports__.CollisionGroupManager;\n/******/ var __webpack_exports__CollisionJumpTable = __webpack_exports__.CollisionJumpTable;\n/******/ var __webpack_exports__CollisionPostSolveEvent = __webpack_exports__.CollisionPostSolveEvent;\n/******/ var __webpack_exports__CollisionPreSolveEvent = __webpack_exports__.CollisionPreSolveEvent;\n/******/ var __webpack_exports__CollisionStartEvent = __webpack_exports__.CollisionStartEvent;\n/******/ var __webpack_exports__CollisionSystem = __webpack_exports__.CollisionSystem;\n/******/ var __webpack_exports__CollisionType = __webpack_exports__.CollisionType;\n/******/ var __webpack_exports__Color = __webpack_exports__.Color;\n/******/ var __webpack_exports__ColorBlindFlags = __webpack_exports__.ColorBlindFlags;\n/******/ var __webpack_exports__ColorBlindnessMode = __webpack_exports__.ColorBlindnessMode;\n/******/ var __webpack_exports__ColorBlindnessPostProcessor = __webpack_exports__.ColorBlindnessPostProcessor;\n/******/ var __webpack_exports__Component = __webpack_exports__.Component;\n/******/ var __webpack_exports__CompositeCollider = __webpack_exports__.CompositeCollider;\n/******/ var __webpack_exports__ConsoleAppender = __webpack_exports__.ConsoleAppender;\n/******/ var __webpack_exports__ContactConstraintPoint = __webpack_exports__.ContactConstraintPoint;\n/******/ var __webpack_exports__ContactEndEvent = __webpack_exports__.ContactEndEvent;\n/******/ var __webpack_exports__ContactSolveBias = __webpack_exports__.ContactSolveBias;\n/******/ var __webpack_exports__ContactStartEvent = __webpack_exports__.ContactStartEvent;\n/******/ var __webpack_exports__CoordPlane = __webpack_exports__.CoordPlane;\n/******/ var __webpack_exports__CrossFade = __webpack_exports__.CrossFade;\n/******/ var __webpack_exports__CurveBy = __webpack_exports__.CurveBy;\n/******/ var __webpack_exports__CurveTo = __webpack_exports__.CurveTo;\n/******/ var __webpack_exports__DeactivateEvent = __webpack_exports__.DeactivateEvent;\n/******/ var __webpack_exports__Debug = __webpack_exports__.Debug;\n/******/ var __webpack_exports__DebugConfig = __webpack_exports__.DebugConfig;\n/******/ var __webpack_exports__DebugGraphicsComponent = __webpack_exports__.DebugGraphicsComponent;\n/******/ var __webpack_exports__DebugSystem = __webpack_exports__.DebugSystem;\n/******/ var __webpack_exports__DebugText = __webpack_exports__.DebugText;\n/******/ var __webpack_exports__DefaultAntialiasOptions = __webpack_exports__.DefaultAntialiasOptions;\n/******/ var __webpack_exports__DefaultGarbageCollectionOptions = __webpack_exports__.DefaultGarbageCollectionOptions;\n/******/ var __webpack_exports__DefaultLoader = __webpack_exports__.DefaultLoader;\n/******/ var __webpack_exports__DefaultPixelArtOptions = __webpack_exports__.DefaultPixelArtOptions;\n/******/ var __webpack_exports__DegreeOfFreedom = __webpack_exports__.DegreeOfFreedom;\n/******/ var __webpack_exports__Delay = __webpack_exports__.Delay;\n/******/ var __webpack_exports__Detector = __webpack_exports__.Detector;\n/******/ var __webpack_exports__Die = __webpack_exports__.Die;\n/******/ var __webpack_exports__Direction = __webpack_exports__.Direction;\n/******/ var __webpack_exports__Director = __webpack_exports__.Director;\n/******/ var __webpack_exports__DirectorEvents = __webpack_exports__.DirectorEvents;\n/******/ var __webpack_exports__DisplayMode = __webpack_exports__.DisplayMode;\n/******/ var __webpack_exports__DynamicTree = __webpack_exports__.DynamicTree;\n/******/ var __webpack_exports__DynamicTreeCollisionProcessor = __webpack_exports__.DynamicTreeCollisionProcessor;\n/******/ var __webpack_exports__EX_VERSION = __webpack_exports__.EX_VERSION;\n/******/ var __webpack_exports__EaseBy = __webpack_exports__.EaseBy;\n/******/ var __webpack_exports__EaseTo = __webpack_exports__.EaseTo;\n/******/ var __webpack_exports__EasingFunctions = __webpack_exports__.EasingFunctions;\n/******/ var __webpack_exports__EdgeCollider = __webpack_exports__.EdgeCollider;\n/******/ var __webpack_exports__ElasticToActorStrategy = __webpack_exports__.ElasticToActorStrategy;\n/******/ var __webpack_exports__EmitterType = __webpack_exports__.EmitterType;\n/******/ var __webpack_exports__Engine = __webpack_exports__.Engine;\n/******/ var __webpack_exports__EngineEvents = __webpack_exports__.EngineEvents;\n/******/ var __webpack_exports__EnterTriggerEvent = __webpack_exports__.EnterTriggerEvent;\n/******/ var __webpack_exports__EnterViewPortEvent = __webpack_exports__.EnterViewPortEvent;\n/******/ var __webpack_exports__Entity = __webpack_exports__.Entity;\n/******/ var __webpack_exports__EntityEvents = __webpack_exports__.EntityEvents;\n/******/ var __webpack_exports__EntityManager = __webpack_exports__.EntityManager;\n/******/ var __webpack_exports__EventEmitter = __webpack_exports__.EventEmitter;\n/******/ var __webpack_exports__EventTypes = __webpack_exports__.EventTypes;\n/******/ var __webpack_exports__Events = __webpack_exports__.Events;\n/******/ var __webpack_exports__ExResponse = __webpack_exports__.ExResponse;\n/******/ var __webpack_exports__ExcaliburGraphicsContext2DCanvas = __webpack_exports__.ExcaliburGraphicsContext2DCanvas;\n/******/ var __webpack_exports__ExcaliburGraphicsContextWebGL = __webpack_exports__.ExcaliburGraphicsContextWebGL;\n/******/ var __webpack_exports__ExitTriggerEvent = __webpack_exports__.ExitTriggerEvent;\n/******/ var __webpack_exports__ExitViewPortEvent = __webpack_exports__.ExitViewPortEvent;\n/******/ var __webpack_exports__Fade = __webpack_exports__.Fade;\n/******/ var __webpack_exports__FadeInOut = __webpack_exports__.FadeInOut;\n/******/ var __webpack_exports__Flags = __webpack_exports__.Flags;\n/******/ var __webpack_exports__Flash = __webpack_exports__.Flash;\n/******/ var __webpack_exports__Follow = __webpack_exports__.Follow;\n/******/ var __webpack_exports__Font = __webpack_exports__.Font;\n/******/ var __webpack_exports__FontCache = __webpack_exports__.FontCache;\n/******/ var __webpack_exports__FontSource = __webpack_exports__.FontSource;\n/******/ var __webpack_exports__FontStyle = __webpack_exports__.FontStyle;\n/******/ var __webpack_exports__FontUnit = __webpack_exports__.FontUnit;\n/******/ var __webpack_exports__FpsSampler = __webpack_exports__.FpsSampler;\n/******/ var __webpack_exports__FrameStats = __webpack_exports__.FrameStats;\n/******/ var __webpack_exports__Future = __webpack_exports__.Future;\n/******/ var __webpack_exports__GameEvent = __webpack_exports__.GameEvent;\n/******/ var __webpack_exports__GameStartEvent = __webpack_exports__.GameStartEvent;\n/******/ var __webpack_exports__GameStopEvent = __webpack_exports__.GameStopEvent;\n/******/ var __webpack_exports__Gamepad = __webpack_exports__.Gamepad;\n/******/ var __webpack_exports__GamepadAxisEvent = __webpack_exports__.GamepadAxisEvent;\n/******/ var __webpack_exports__GamepadButtonEvent = __webpack_exports__.GamepadButtonEvent;\n/******/ var __webpack_exports__GamepadConnectEvent = __webpack_exports__.GamepadConnectEvent;\n/******/ var __webpack_exports__GamepadDisconnectEvent = __webpack_exports__.GamepadDisconnectEvent;\n/******/ var __webpack_exports__Gamepads = __webpack_exports__.Gamepads;\n/******/ var __webpack_exports__GarbageCollector = __webpack_exports__.GarbageCollector;\n/******/ var __webpack_exports__Gif = __webpack_exports__.Gif;\n/******/ var __webpack_exports__GifParser = __webpack_exports__.GifParser;\n/******/ var __webpack_exports__GlobalCoordinates = __webpack_exports__.GlobalCoordinates;\n/******/ var __webpack_exports__GpuParticleEmitter = __webpack_exports__.GpuParticleEmitter;\n/******/ var __webpack_exports__GpuParticleRenderer = __webpack_exports__.GpuParticleRenderer;\n/******/ var __webpack_exports__Graphic = __webpack_exports__.Graphic;\n/******/ var __webpack_exports__GraphicsComponent = __webpack_exports__.GraphicsComponent;\n/******/ var __webpack_exports__GraphicsGroup = __webpack_exports__.GraphicsGroup;\n/******/ var __webpack_exports__GraphicsSystem = __webpack_exports__.GraphicsSystem;\n/******/ var __webpack_exports__HashColliderProxy = __webpack_exports__.HashColliderProxy;\n/******/ var __webpack_exports__HashGridCell = __webpack_exports__.HashGridCell;\n/******/ var __webpack_exports__HashGridProxy = __webpack_exports__.HashGridProxy;\n/******/ var __webpack_exports__HiddenEvent = __webpack_exports__.HiddenEvent;\n/******/ var __webpack_exports__HorizontalFirst = __webpack_exports__.HorizontalFirst;\n/******/ var __webpack_exports__ImageFiltering = __webpack_exports__.ImageFiltering;\n/******/ var __webpack_exports__ImageSource = __webpack_exports__.ImageSource;\n/******/ var __webpack_exports__ImageSourceAttributeConstants = __webpack_exports__.ImageSourceAttributeConstants;\n/******/ var __webpack_exports__ImageWrapping = __webpack_exports__.ImageWrapping;\n/******/ var __webpack_exports__InitializeEvent = __webpack_exports__.InitializeEvent;\n/******/ var __webpack_exports__InputHost = __webpack_exports__.InputHost;\n/******/ var __webpack_exports__InputMapper = __webpack_exports__.InputMapper;\n/******/ var __webpack_exports__IsometricEntityComponent = __webpack_exports__.IsometricEntityComponent;\n/******/ var __webpack_exports__IsometricEntitySystem = __webpack_exports__.IsometricEntitySystem;\n/******/ var __webpack_exports__IsometricMap = __webpack_exports__.IsometricMap;\n/******/ var __webpack_exports__IsometricTile = __webpack_exports__.IsometricTile;\n/******/ var __webpack_exports__KeyEvent = __webpack_exports__.KeyEvent;\n/******/ var __webpack_exports__Keyboard = __webpack_exports__.Keyboard;\n/******/ var __webpack_exports__Keys = __webpack_exports__.Keys;\n/******/ var __webpack_exports__KillEvent = __webpack_exports__.KillEvent;\n/******/ var __webpack_exports__Label = __webpack_exports__.Label;\n/******/ var __webpack_exports__LimitCameraBoundsStrategy = __webpack_exports__.LimitCameraBoundsStrategy;\n/******/ var __webpack_exports__Line = __webpack_exports__.Line;\n/******/ var __webpack_exports__LineSegment = __webpack_exports__.LineSegment;\n/******/ var __webpack_exports__Loader = __webpack_exports__.Loader;\n/******/ var __webpack_exports__LoaderEvents = __webpack_exports__.LoaderEvents;\n/******/ var __webpack_exports__LockCameraToActorAxisStrategy = __webpack_exports__.LockCameraToActorAxisStrategy;\n/******/ var __webpack_exports__LockCameraToActorStrategy = __webpack_exports__.LockCameraToActorStrategy;\n/******/ var __webpack_exports__LogLevel = __webpack_exports__.LogLevel;\n/******/ var __webpack_exports__Logger = __webpack_exports__.Logger;\n/******/ var __webpack_exports__Material = __webpack_exports__.Material;\n/******/ var __webpack_exports__Matrix = __webpack_exports__.Matrix;\n/******/ var __webpack_exports__MatrixLocations = __webpack_exports__.MatrixLocations;\n/******/ var __webpack_exports__MediaEvent = __webpack_exports__.MediaEvent;\n/******/ var __webpack_exports__Meet = __webpack_exports__.Meet;\n/******/ var __webpack_exports__MotionComponent = __webpack_exports__.MotionComponent;\n/******/ var __webpack_exports__MotionSystem = __webpack_exports__.MotionSystem;\n/******/ var __webpack_exports__MoveBy = __webpack_exports__.MoveBy;\n/******/ var __webpack_exports__MoveByWithOptions = __webpack_exports__.MoveByWithOptions;\n/******/ var __webpack_exports__MoveTo = __webpack_exports__.MoveTo;\n/******/ var __webpack_exports__MoveToWithOptions = __webpack_exports__.MoveToWithOptions;\n/******/ var __webpack_exports__NativePointerButton = __webpack_exports__.NativePointerButton;\n/******/ var __webpack_exports__NativeSoundEvent = __webpack_exports__.NativeSoundEvent;\n/******/ var __webpack_exports__NativeSoundProcessedEvent = __webpack_exports__.NativeSoundProcessedEvent;\n/******/ var __webpack_exports__NineSlice = __webpack_exports__.NineSlice;\n/******/ var __webpack_exports__NineSliceStretch = __webpack_exports__.NineSliceStretch;\n/******/ var __webpack_exports__None = __webpack_exports__.None;\n/******/ var __webpack_exports__Observable = __webpack_exports__.Observable;\n/******/ var __webpack_exports__OffscreenSystem = __webpack_exports__.OffscreenSystem;\n/******/ var __webpack_exports__Pair = __webpack_exports__.Pair;\n/******/ var __webpack_exports__ParallaxComponent = __webpack_exports__.ParallaxComponent;\n/******/ var __webpack_exports__ParallelActions = __webpack_exports__.ParallelActions;\n/******/ var __webpack_exports__Particle = __webpack_exports__.Particle;\n/******/ var __webpack_exports__ParticleEmitter = __webpack_exports__.ParticleEmitter;\n/******/ var __webpack_exports__ParticleRenderer = __webpack_exports__.ParticleRenderer;\n/******/ var __webpack_exports__ParticleTransform = __webpack_exports__.ParticleTransform;\n/******/ var __webpack_exports__PhysicsStats = __webpack_exports__.PhysicsStats;\n/******/ var __webpack_exports__PhysicsWorld = __webpack_exports__.PhysicsWorld;\n/******/ var __webpack_exports__PointerAbstraction = __webpack_exports__.PointerAbstraction;\n/******/ var __webpack_exports__PointerButton = __webpack_exports__.PointerButton;\n/******/ var __webpack_exports__PointerComponent = __webpack_exports__.PointerComponent;\n/******/ var __webpack_exports__PointerEvent = __webpack_exports__.PointerEvent;\n/******/ var __webpack_exports__PointerEventReceiver = __webpack_exports__.PointerEventReceiver;\n/******/ var __webpack_exports__PointerScope = __webpack_exports__.PointerScope;\n/******/ var __webpack_exports__PointerSystem = __webpack_exports__.PointerSystem;\n/******/ var __webpack_exports__PointerType = __webpack_exports__.PointerType;\n/******/ var __webpack_exports__Polygon = __webpack_exports__.Polygon;\n/******/ var __webpack_exports__PolygonCollider = __webpack_exports__.PolygonCollider;\n/******/ var __webpack_exports__Pool = __webpack_exports__.Pool;\n/******/ var __webpack_exports__PostCollisionEvent = __webpack_exports__.PostCollisionEvent;\n/******/ var __webpack_exports__PostDebugDrawEvent = __webpack_exports__.PostDebugDrawEvent;\n/******/ var __webpack_exports__PostDrawEvent = __webpack_exports__.PostDrawEvent;\n/******/ var __webpack_exports__PostFrameEvent = __webpack_exports__.PostFrameEvent;\n/******/ var __webpack_exports__PostKillEvent = __webpack_exports__.PostKillEvent;\n/******/ var __webpack_exports__PostTransformDrawEvent = __webpack_exports__.PostTransformDrawEvent;\n/******/ var __webpack_exports__PostUpdateEvent = __webpack_exports__.PostUpdateEvent;\n/******/ var __webpack_exports__PreCollisionEvent = __webpack_exports__.PreCollisionEvent;\n/******/ var __webpack_exports__PreDebugDrawEvent = __webpack_exports__.PreDebugDrawEvent;\n/******/ var __webpack_exports__PreDrawEvent = __webpack_exports__.PreDrawEvent;\n/******/ var __webpack_exports__PreFrameEvent = __webpack_exports__.PreFrameEvent;\n/******/ var __webpack_exports__PreKillEvent = __webpack_exports__.PreKillEvent;\n/******/ var __webpack_exports__PreLoadEvent = __webpack_exports__.PreLoadEvent;\n/******/ var __webpack_exports__PreTransformDrawEvent = __webpack_exports__.PreTransformDrawEvent;\n/******/ var __webpack_exports__PreUpdateEvent = __webpack_exports__.PreUpdateEvent;\n/******/ var __webpack_exports__Projection = __webpack_exports__.Projection;\n/******/ var __webpack_exports__QuadIndexBuffer = __webpack_exports__.QuadIndexBuffer;\n/******/ var __webpack_exports__QuadTree = __webpack_exports__.QuadTree;\n/******/ var __webpack_exports__Query = __webpack_exports__.Query;\n/******/ var __webpack_exports__QueryManager = __webpack_exports__.QueryManager;\n/******/ var __webpack_exports__RadiusAroundActorStrategy = __webpack_exports__.RadiusAroundActorStrategy;\n/******/ var __webpack_exports__Random = __webpack_exports__.Random;\n/******/ var __webpack_exports__Raster = __webpack_exports__.Raster;\n/******/ var __webpack_exports__Ray = __webpack_exports__.Ray;\n/******/ var __webpack_exports__RealisticSolver = __webpack_exports__.RealisticSolver;\n/******/ var __webpack_exports__Rectangle = __webpack_exports__.Rectangle;\n/******/ var __webpack_exports__RemoveEvent = __webpack_exports__.RemoveEvent;\n/******/ var __webpack_exports__RemovedComponent = __webpack_exports__.RemovedComponent;\n/******/ var __webpack_exports__Repeat = __webpack_exports__.Repeat;\n/******/ var __webpack_exports__RepeatForever = __webpack_exports__.RepeatForever;\n/******/ var __webpack_exports__Resolution = __webpack_exports__.Resolution;\n/******/ var __webpack_exports__Resource = __webpack_exports__.Resource;\n/******/ var __webpack_exports__ResourceEvents = __webpack_exports__.ResourceEvents;\n/******/ var __webpack_exports__RotateBy = __webpack_exports__.RotateBy;\n/******/ var __webpack_exports__RotateByWithOptions = __webpack_exports__.RotateByWithOptions;\n/******/ var __webpack_exports__RotateTo = __webpack_exports__.RotateTo;\n/******/ var __webpack_exports__RotateToWithOptions = __webpack_exports__.RotateToWithOptions;\n/******/ var __webpack_exports__RotationType = __webpack_exports__.RotationType;\n/******/ var __webpack_exports__ScaleBy = __webpack_exports__.ScaleBy;\n/******/ var __webpack_exports__ScaleByWithOptions = __webpack_exports__.ScaleByWithOptions;\n/******/ var __webpack_exports__ScaleTo = __webpack_exports__.ScaleTo;\n/******/ var __webpack_exports__ScaleToWithOptions = __webpack_exports__.ScaleToWithOptions;\n/******/ var __webpack_exports__Scene = __webpack_exports__.Scene;\n/******/ var __webpack_exports__SceneEvents = __webpack_exports__.SceneEvents;\n/******/ var __webpack_exports__Screen = __webpack_exports__.Screen;\n/******/ var __webpack_exports__ScreenAppender = __webpack_exports__.ScreenAppender;\n/******/ var __webpack_exports__ScreenElement = __webpack_exports__.ScreenElement;\n/******/ var __webpack_exports__ScreenEvents = __webpack_exports__.ScreenEvents;\n/******/ var __webpack_exports__ScreenShader = __webpack_exports__.ScreenShader;\n/******/ var __webpack_exports__ScrollPreventionMode = __webpack_exports__.ScrollPreventionMode;\n/******/ var __webpack_exports__Semaphore = __webpack_exports__.Semaphore;\n/******/ var __webpack_exports__SeparatingAxis = __webpack_exports__.SeparatingAxis;\n/******/ var __webpack_exports__SeparationInfo = __webpack_exports__.SeparationInfo;\n/******/ var __webpack_exports__Shader = __webpack_exports__.Shader;\n/******/ var __webpack_exports__Shape = __webpack_exports__.Shape;\n/******/ var __webpack_exports__Side = __webpack_exports__.Side;\n/******/ var __webpack_exports__Slide = __webpack_exports__.Slide;\n/******/ var __webpack_exports__SolverStrategy = __webpack_exports__.SolverStrategy;\n/******/ var __webpack_exports__Sound = __webpack_exports__.Sound;\n/******/ var __webpack_exports__SoundEvents = __webpack_exports__.SoundEvents;\n/******/ var __webpack_exports__SparseHashGrid = __webpack_exports__.SparseHashGrid;\n/******/ var __webpack_exports__SparseHashGridCollisionProcessor = __webpack_exports__.SparseHashGridCollisionProcessor;\n/******/ var __webpack_exports__SpatialPartitionStrategy = __webpack_exports__.SpatialPartitionStrategy;\n/******/ var __webpack_exports__Sprite = __webpack_exports__.Sprite;\n/******/ var __webpack_exports__SpriteFont = __webpack_exports__.SpriteFont;\n/******/ var __webpack_exports__SpriteSheet = __webpack_exports__.SpriteSheet;\n/******/ var __webpack_exports__StandardClock = __webpack_exports__.StandardClock;\n/******/ var __webpack_exports__StateMachine = __webpack_exports__.StateMachine;\n/******/ var __webpack_exports__StrategyContainer = __webpack_exports__.StrategyContainer;\n/******/ var __webpack_exports__Stream = __webpack_exports__.Stream;\n/******/ var __webpack_exports__System = __webpack_exports__.System;\n/******/ var __webpack_exports__SystemManager = __webpack_exports__.SystemManager;\n/******/ var __webpack_exports__SystemPriority = __webpack_exports__.SystemPriority;\n/******/ var __webpack_exports__SystemType = __webpack_exports__.SystemType;\n/******/ var __webpack_exports__TagQuery = __webpack_exports__.TagQuery;\n/******/ var __webpack_exports__TestClock = __webpack_exports__.TestClock;\n/******/ var __webpack_exports__Text = __webpack_exports__.Text;\n/******/ var __webpack_exports__TextAlign = __webpack_exports__.TextAlign;\n/******/ var __webpack_exports__TextureLoader = __webpack_exports__.TextureLoader;\n/******/ var __webpack_exports__Tile = __webpack_exports__.Tile;\n/******/ var __webpack_exports__TileMap = __webpack_exports__.TileMap;\n/******/ var __webpack_exports__TileMapEvents = __webpack_exports__.TileMapEvents;\n/******/ var __webpack_exports__TiledAnimation = __webpack_exports__.TiledAnimation;\n/******/ var __webpack_exports__TiledSprite = __webpack_exports__.TiledSprite;\n/******/ var __webpack_exports__Timer = __webpack_exports__.Timer;\n/******/ var __webpack_exports__Toaster = __webpack_exports__.Toaster;\n/******/ var __webpack_exports__Transform = __webpack_exports__.Transform;\n/******/ var __webpack_exports__TransformComponent = __webpack_exports__.TransformComponent;\n/******/ var __webpack_exports__Transition = __webpack_exports__.Transition;\n/******/ var __webpack_exports__TreeNode = __webpack_exports__.TreeNode;\n/******/ var __webpack_exports__Trigger = __webpack_exports__.Trigger;\n/******/ var __webpack_exports__TriggerEvents = __webpack_exports__.TriggerEvents;\n/******/ var __webpack_exports__TwoPI = __webpack_exports__.TwoPI;\n/******/ var __webpack_exports__Util = __webpack_exports__.Util;\n/******/ var __webpack_exports__Vector = __webpack_exports__.Vector;\n/******/ var __webpack_exports__VectorView = __webpack_exports__.VectorView;\n/******/ var __webpack_exports__VertexBuffer = __webpack_exports__.VertexBuffer;\n/******/ var __webpack_exports__VertexLayout = __webpack_exports__.VertexLayout;\n/******/ var __webpack_exports__VerticalFirst = __webpack_exports__.VerticalFirst;\n/******/ var __webpack_exports__VisibleEvent = __webpack_exports__.VisibleEvent;\n/******/ var __webpack_exports__WebAudio = __webpack_exports__.WebAudio;\n/******/ var __webpack_exports__WebAudioInstance = __webpack_exports__.WebAudioInstance;\n/******/ var __webpack_exports__WheelDeltaMode = __webpack_exports__.WheelDeltaMode;\n/******/ var __webpack_exports__WheelEvent = __webpack_exports__.WheelEvent;\n/******/ var __webpack_exports__World = __webpack_exports__.World;\n/******/ var __webpack_exports__approximatelyEqual = __webpack_exports__.approximatelyEqual;\n/******/ var __webpack_exports__assert = __webpack_exports__.assert;\n/******/ var __webpack_exports__canonicalizeAngle = __webpack_exports__.canonicalizeAngle;\n/******/ var __webpack_exports__clamp = __webpack_exports__.clamp;\n/******/ var __webpack_exports__coroutine = __webpack_exports__.coroutine;\n/******/ var __webpack_exports__createId = __webpack_exports__.createId;\n/******/ var __webpack_exports__frac = __webpack_exports__.frac;\n/******/ var __webpack_exports__getDefaultPhysicsConfig = __webpack_exports__.getDefaultPhysicsConfig;\n/******/ var __webpack_exports__hasGraphicsTick = __webpack_exports__.hasGraphicsTick;\n/******/ var __webpack_exports__hasOnAdd = __webpack_exports__.hasOnAdd;\n/******/ var __webpack_exports__hasOnInitialize = __webpack_exports__.hasOnInitialize;\n/******/ var __webpack_exports__hasOnPostUpdate = __webpack_exports__.hasOnPostUpdate;\n/******/ var __webpack_exports__hasOnPreUpdate = __webpack_exports__.hasOnPreUpdate;\n/******/ var __webpack_exports__hasOnRemove = __webpack_exports__.hasOnRemove;\n/******/ var __webpack_exports__hasPostDraw = __webpack_exports__.hasPostDraw;\n/******/ var __webpack_exports__hasPreDraw = __webpack_exports__.hasPreDraw;\n/******/ var __webpack_exports__has_add = __webpack_exports__.has_add;\n/******/ var __webpack_exports__has_initialize = __webpack_exports__.has_initialize;\n/******/ var __webpack_exports__has_postupdate = __webpack_exports__.has_postupdate;\n/******/ var __webpack_exports__has_preupdate = __webpack_exports__.has_preupdate;\n/******/ var __webpack_exports__has_remove = __webpack_exports__.has_remove;\n/******/ var __webpack_exports__inverseLerp = __webpack_exports__.inverseLerp;\n/******/ var __webpack_exports__inverseLerpVector = __webpack_exports__.inverseLerpVector;\n/******/ var __webpack_exports__isActor = __webpack_exports__.isActor;\n/******/ var __webpack_exports__isAddedComponent = __webpack_exports__.isAddedComponent;\n/******/ var __webpack_exports__isComponentCtor = __webpack_exports__.isComponentCtor;\n/******/ var __webpack_exports__isLoaderConstructor = __webpack_exports__.isLoaderConstructor;\n/******/ var __webpack_exports__isMoveByOptions = __webpack_exports__.isMoveByOptions;\n/******/ var __webpack_exports__isMoveToOptions = __webpack_exports__.isMoveToOptions;\n/******/ var __webpack_exports__isRemovedComponent = __webpack_exports__.isRemovedComponent;\n/******/ var __webpack_exports__isRotateByOptions = __webpack_exports__.isRotateByOptions;\n/******/ var __webpack_exports__isRotateToOptions = __webpack_exports__.isRotateToOptions;\n/******/ var __webpack_exports__isScaleByOptions = __webpack_exports__.isScaleByOptions;\n/******/ var __webpack_exports__isScaleToOptions = __webpack_exports__.isScaleToOptions;\n/******/ var __webpack_exports__isSceneConstructor = __webpack_exports__.isSceneConstructor;\n/******/ var __webpack_exports__isScreenElement = __webpack_exports__.isScreenElement;\n/******/ var __webpack_exports__isSystemConstructor = __webpack_exports__.isSystemConstructor;\n/******/ var __webpack_exports__lerp = __webpack_exports__.lerp;\n/******/ var __webpack_exports__lerpAngle = __webpack_exports__.lerpAngle;\n/******/ var __webpack_exports__lerpVector = __webpack_exports__.lerpVector;\n/******/ var __webpack_exports__maxMessages = __webpack_exports__.maxMessages;\n/******/ var __webpack_exports__nextActionId = __webpack_exports__.nextActionId;\n/******/ var __webpack_exports__obsolete = __webpack_exports__.obsolete;\n/******/ var __webpack_exports__parseImageFiltering = __webpack_exports__.parseImageFiltering;\n/******/ var __webpack_exports__parseImageWrapping = __webpack_exports__.parseImageWrapping;\n/******/ var __webpack_exports__pixelSnapEpsilon = __webpack_exports__.pixelSnapEpsilon;\n/******/ var __webpack_exports__randomInRange = __webpack_exports__.randomInRange;\n/******/ var __webpack_exports__randomIntInRange = __webpack_exports__.randomIntInRange;\n/******/ var __webpack_exports__range = __webpack_exports__.range;\n/******/ var __webpack_exports__remap = __webpack_exports__.remap;\n/******/ var __webpack_exports__remapVector = __webpack_exports__.remapVector;\n/******/ var __webpack_exports__resetObsoleteCounter = __webpack_exports__.resetObsoleteCounter;\n/******/ var __webpack_exports__sign = __webpack_exports__.sign;\n/******/ var __webpack_exports__toDegrees = __webpack_exports__.toDegrees;\n/******/ var __webpack_exports__toRadians = __webpack_exports__.toRadians;\n/******/ var __webpack_exports__vec = __webpack_exports__.vec;\n/******/ var __webpack_exports__webgl = __webpack_exports__.webgl;\n/******/ export { __webpack_exports__ActionCompleteEvent as ActionCompleteEvent, __webpack_exports__ActionContext as ActionContext, __webpack_exports__ActionQueue as ActionQueue, __webpack_exports__ActionSequence as ActionSequence, __webpack_exports__ActionStartEvent as ActionStartEvent, __webpack_exports__ActionsComponent as ActionsComponent, __webpack_exports__ActionsSystem as ActionsSystem, __webpack_exports__ActivateEvent as ActivateEvent, __webpack_exports__Actor as Actor, __webpack_exports__ActorEvents as ActorEvents, __webpack_exports__AddEvent as AddEvent, __webpack_exports__AddedComponent as AddedComponent, __webpack_exports__AffineMatrix as AffineMatrix, __webpack_exports__Animation as Animation, __webpack_exports__AnimationDirection as AnimationDirection, __webpack_exports__AnimationEvents as AnimationEvents, __webpack_exports__AnimationStrategy as AnimationStrategy, __webpack_exports__ArcadeSolver as ArcadeSolver, __webpack_exports__AudioContextFactory as AudioContextFactory, __webpack_exports__Axes as Axes, __webpack_exports__Axis as Axis, __webpack_exports__BaseAlign as BaseAlign, __webpack_exports__BezierCurve as BezierCurve, __webpack_exports__Blink as Blink, __webpack_exports__BodyComponent as BodyComponent, __webpack_exports__BoundingBox as BoundingBox, __webpack_exports__BrowserComponent as BrowserComponent, __webpack_exports__BrowserEvents as BrowserEvents, __webpack_exports__Buttons as Buttons, __webpack_exports__Camera as Camera, __webpack_exports__CameraEvents as CameraEvents, __webpack_exports__Canvas as Canvas, __webpack_exports__Circle as Circle, __webpack_exports__CircleCollider as CircleCollider, __webpack_exports__Clock as Clock, __webpack_exports__ClosestLineJumpTable as ClosestLineJumpTable, __webpack_exports__Collider as Collider, __webpack_exports__ColliderComponent as ColliderComponent, __webpack_exports__CollisionContact as CollisionContact, __webpack_exports__CollisionEndEvent as CollisionEndEvent, __webpack_exports__CollisionGroup as CollisionGroup, __webpack_exports__CollisionGroupManager as CollisionGroupManager, __webpack_exports__CollisionJumpTable as CollisionJumpTable, __webpack_exports__CollisionPostSolveEvent as CollisionPostSolveEvent, __webpack_exports__CollisionPreSolveEvent as CollisionPreSolveEvent, __webpack_exports__CollisionStartEvent as CollisionStartEvent, __webpack_exports__CollisionSystem as CollisionSystem, __webpack_exports__CollisionType as CollisionType, __webpack_exports__Color as Color, __webpack_exports__ColorBlindFlags as ColorBlindFlags, __webpack_exports__ColorBlindnessMode as ColorBlindnessMode, __webpack_exports__ColorBlindnessPostProcessor as ColorBlindnessPostProcessor, __webpack_exports__Component as Component, __webpack_exports__CompositeCollider as CompositeCollider, __webpack_exports__ConsoleAppender as ConsoleAppender, __webpack_exports__ContactConstraintPoint as ContactConstraintPoint, __webpack_exports__ContactEndEvent as ContactEndEvent, __webpack_exports__ContactSolveBias as ContactSolveBias, __webpack_exports__ContactStartEvent as ContactStartEvent, __webpack_exports__CoordPlane as CoordPlane, __webpack_exports__CrossFade as CrossFade, __webpack_exports__CurveBy as CurveBy, __webpack_exports__CurveTo as CurveTo, __webpack_exports__DeactivateEvent as DeactivateEvent, __webpack_exports__Debug as Debug, __webpack_exports__DebugConfig as DebugConfig, __webpack_exports__DebugGraphicsComponent as DebugGraphicsComponent, __webpack_exports__DebugSystem as DebugSystem, __webpack_exports__DebugText as DebugText, __webpack_exports__DefaultAntialiasOptions as DefaultAntialiasOptions, __webpack_exports__DefaultGarbageCollectionOptions as DefaultGarbageCollectionOptions, __webpack_exports__DefaultLoader as DefaultLoader, __webpack_exports__DefaultPixelArtOptions as DefaultPixelArtOptions, __webpack_exports__DegreeOfFreedom as DegreeOfFreedom, __webpack_exports__Delay as Delay, __webpack_exports__Detector as Detector, __webpack_exports__Die as Die, __webpack_exports__Direction as Direction, __webpack_exports__Director as Director, __webpack_exports__DirectorEvents as DirectorEvents, __webpack_exports__DisplayMode as DisplayMode, __webpack_exports__DynamicTree as DynamicTree, __webpack_exports__DynamicTreeCollisionProcessor as DynamicTreeCollisionProcessor, __webpack_exports__EX_VERSION as EX_VERSION, __webpack_exports__EaseBy as EaseBy, __webpack_exports__EaseTo as EaseTo, __webpack_exports__EasingFunctions as EasingFunctions, __webpack_exports__EdgeCollider as EdgeCollider, __webpack_exports__ElasticToActorStrategy as ElasticToActorStrategy, __webpack_exports__EmitterType as EmitterType, __webpack_exports__Engine as Engine, __webpack_exports__EngineEvents as EngineEvents, __webpack_exports__EnterTriggerEvent as EnterTriggerEvent, __webpack_exports__EnterViewPortEvent as EnterViewPortEvent, __webpack_exports__Entity as Entity, __webpack_exports__EntityEvents as EntityEvents, __webpack_exports__EntityManager as EntityManager, __webpack_exports__EventEmitter as EventEmitter, __webpack_exports__EventTypes as EventTypes, __webpack_exports__Events as Events, __webpack_exports__ExResponse as ExResponse, __webpack_exports__ExcaliburGraphicsContext2DCanvas as ExcaliburGraphicsContext2DCanvas, __webpack_exports__ExcaliburGraphicsContextWebGL as ExcaliburGraphicsContextWebGL, __webpack_exports__ExitTriggerEvent as ExitTriggerEvent, __webpack_exports__ExitViewPortEvent as ExitViewPortEvent, __webpack_exports__Fade as Fade, __webpack_exports__FadeInOut as FadeInOut, __webpack_exports__Flags as Flags, __webpack_exports__Flash as Flash, __webpack_exports__Follow as Follow, __webpack_exports__Font as Font, __webpack_exports__FontCache as FontCache, __webpack_exports__FontSource as FontSource, __webpack_exports__FontStyle as FontStyle, __webpack_exports__FontUnit as FontUnit, __webpack_exports__FpsSampler as FpsSampler, __webpack_exports__FrameStats as FrameStats, __webpack_exports__Future as Future, __webpack_exports__GameEvent as GameEvent, __webpack_exports__GameStartEvent as GameStartEvent, __webpack_exports__GameStopEvent as GameStopEvent, __webpack_exports__Gamepad as Gamepad, __webpack_exports__GamepadAxisEvent as GamepadAxisEvent, __webpack_exports__GamepadButtonEvent as GamepadButtonEvent, __webpack_exports__GamepadConnectEvent as GamepadConnectEvent, __webpack_exports__GamepadDisconnectEvent as GamepadDisconnectEvent, __webpack_exports__Gamepads as Gamepads, __webpack_exports__GarbageCollector as GarbageCollector, __webpack_exports__Gif as Gif, __webpack_exports__GifParser as GifParser, __webpack_exports__GlobalCoordinates as GlobalCoordinates, __webpack_exports__GpuParticleEmitter as GpuParticleEmitter, __webpack_exports__GpuParticleRenderer as GpuParticleRenderer, __webpack_exports__Graphic as Graphic, __webpack_exports__GraphicsComponent as GraphicsComponent, __webpack_exports__GraphicsGroup as GraphicsGroup, __webpack_exports__GraphicsSystem as GraphicsSystem, __webpack_exports__HashColliderProxy as HashColliderProxy, __webpack_exports__HashGridCell as HashGridCell, __webpack_exports__HashGridProxy as HashGridProxy, __webpack_exports__HiddenEvent as HiddenEvent, __webpack_exports__HorizontalFirst as HorizontalFirst, __webpack_exports__ImageFiltering as ImageFiltering, __webpack_exports__ImageSource as ImageSource, __webpack_exports__ImageSourceAttributeConstants as ImageSourceAttributeConstants, __webpack_exports__ImageWrapping as ImageWrapping, __webpack_exports__InitializeEvent as InitializeEvent, __webpack_exports__InputHost as InputHost, __webpack_exports__InputMapper as InputMapper, __webpack_exports__IsometricEntityComponent as IsometricEntityComponent, __webpack_exports__IsometricEntitySystem as IsometricEntitySystem, __webpack_exports__IsometricMap as IsometricMap, __webpack_exports__IsometricTile as IsometricTile, __webpack_exports__KeyEvent as KeyEvent, __webpack_exports__Keyboard as Keyboard, __webpack_exports__Keys as Keys, __webpack_exports__KillEvent as KillEvent, __webpack_exports__Label as Label, __webpack_exports__LimitCameraBoundsStrategy as LimitCameraBoundsStrategy, __webpack_exports__Line as Line, __webpack_exports__LineSegment as LineSegment, __webpack_exports__Loader as Loader, __webpack_exports__LoaderEvents as LoaderEvents, __webpack_exports__LockCameraToActorAxisStrategy as LockCameraToActorAxisStrategy, __webpack_exports__LockCameraToActorStrategy as LockCameraToActorStrategy, __webpack_exports__LogLevel as LogLevel, __webpack_exports__Logger as Logger, __webpack_exports__Material as Material, __webpack_exports__Matrix as Matrix, __webpack_exports__MatrixLocations as MatrixLocations, __webpack_exports__MediaEvent as MediaEvent, __webpack_exports__Meet as Meet, __webpack_exports__MotionComponent as MotionComponent, __webpack_exports__MotionSystem as MotionSystem, __webpack_exports__MoveBy as MoveBy, __webpack_exports__MoveByWithOptions as MoveByWithOptions, __webpack_exports__MoveTo as MoveTo, __webpack_exports__MoveToWithOptions as MoveToWithOptions, __webpack_exports__NativePointerButton as NativePointerButton, __webpack_exports__NativeSoundEvent as NativeSoundEvent, __webpack_exports__NativeSoundProcessedEvent as NativeSoundProcessedEvent, __webpack_exports__NineSlice as NineSlice, __webpack_exports__NineSliceStretch as NineSliceStretch, __webpack_exports__None as None, __webpack_exports__Observable as Observable, __webpack_exports__OffscreenSystem as OffscreenSystem, __webpack_exports__Pair as Pair, __webpack_exports__ParallaxComponent as ParallaxComponent, __webpack_exports__ParallelActions as ParallelActions, __webpack_exports__Particle as Particle, __webpack_exports__ParticleEmitter as ParticleEmitter, __webpack_exports__ParticleRenderer as ParticleRenderer, __webpack_exports__ParticleTransform as ParticleTransform, __webpack_exports__PhysicsStats as PhysicsStats, __webpack_exports__PhysicsWorld as PhysicsWorld, __webpack_exports__PointerAbstraction as PointerAbstraction, __webpack_exports__PointerButton as PointerButton, __webpack_exports__PointerComponent as PointerComponent, __webpack_exports__PointerEvent as PointerEvent, __webpack_exports__PointerEventReceiver as PointerEventReceiver, __webpack_exports__PointerScope as PointerScope, __webpack_exports__PointerSystem as PointerSystem, __webpack_exports__PointerType as PointerType, __webpack_exports__Polygon as Polygon, __webpack_exports__PolygonCollider as PolygonCollider, __webpack_exports__Pool as Pool, __webpack_exports__PostCollisionEvent as PostCollisionEvent, __webpack_exports__PostDebugDrawEvent as PostDebugDrawEvent, __webpack_exports__PostDrawEvent as PostDrawEvent, __webpack_exports__PostFrameEvent as PostFrameEvent, __webpack_exports__PostKillEvent as PostKillEvent, __webpack_exports__PostTransformDrawEvent as PostTransformDrawEvent, __webpack_exports__PostUpdateEvent as PostUpdateEvent, __webpack_exports__PreCollisionEvent as PreCollisionEvent, __webpack_exports__PreDebugDrawEvent as PreDebugDrawEvent, __webpack_exports__PreDrawEvent as PreDrawEvent, __webpack_exports__PreFrameEvent as PreFrameEvent, __webpack_exports__PreKillEvent as PreKillEvent, __webpack_exports__PreLoadEvent as PreLoadEvent, __webpack_exports__PreTransformDrawEvent as PreTransformDrawEvent, __webpack_exports__PreUpdateEvent as PreUpdateEvent, __webpack_exports__Projection as Projection, __webpack_exports__QuadIndexBuffer as QuadIndexBuffer, __webpack_exports__QuadTree as QuadTree, __webpack_exports__Query as Query, __webpack_exports__QueryManager as QueryManager, __webpack_exports__RadiusAroundActorStrategy as RadiusAroundActorStrategy, __webpack_exports__Random as Random, __webpack_exports__Raster as Raster, __webpack_exports__Ray as Ray, __webpack_exports__RealisticSolver as RealisticSolver, __webpack_exports__Rectangle as Rectangle, __webpack_exports__RemoveEvent as RemoveEvent, __webpack_exports__RemovedComponent as RemovedComponent, __webpack_exports__Repeat as Repeat, __webpack_exports__RepeatForever as RepeatForever, __webpack_exports__Resolution as Resolution, __webpack_exports__Resource as Resource, __webpack_exports__ResourceEvents as ResourceEvents, __webpack_exports__RotateBy as RotateBy, __webpack_exports__RotateByWithOptions as RotateByWithOptions, __webpack_exports__RotateTo as RotateTo, __webpack_exports__RotateToWithOptions as RotateToWithOptions, __webpack_exports__RotationType as RotationType, __webpack_exports__ScaleBy as ScaleBy, __webpack_exports__ScaleByWithOptions as ScaleByWithOptions, __webpack_exports__ScaleTo as ScaleTo, __webpack_exports__ScaleToWithOptions as ScaleToWithOptions, __webpack_exports__Scene as Scene, __webpack_exports__SceneEvents as SceneEvents, __webpack_exports__Screen as Screen, __webpack_exports__ScreenAppender as ScreenAppender, __webpack_exports__ScreenElement as ScreenElement, __webpack_exports__ScreenEvents as ScreenEvents, __webpack_exports__ScreenShader as ScreenShader, __webpack_exports__ScrollPreventionMode as ScrollPreventionMode, __webpack_exports__Semaphore as Semaphore, __webpack_exports__SeparatingAxis as SeparatingAxis, __webpack_exports__SeparationInfo as SeparationInfo, __webpack_exports__Shader as Shader, __webpack_exports__Shape as Shape, __webpack_exports__Side as Side, __webpack_exports__Slide as Slide, __webpack_exports__SolverStrategy as SolverStrategy, __webpack_exports__Sound as Sound, __webpack_exports__SoundEvents as SoundEvents, __webpack_exports__SparseHashGrid as SparseHashGrid, __webpack_exports__SparseHashGridCollisionProcessor as SparseHashGridCollisionProcessor, __webpack_exports__SpatialPartitionStrategy as SpatialPartitionStrategy, __webpack_exports__Sprite as Sprite, __webpack_exports__SpriteFont as SpriteFont, __webpack_exports__SpriteSheet as SpriteSheet, __webpack_exports__StandardClock as StandardClock, __webpack_exports__StateMachine as StateMachine, __webpack_exports__StrategyContainer as StrategyContainer, __webpack_exports__Stream as Stream, __webpack_exports__System as System, __webpack_exports__SystemManager as SystemManager, __webpack_exports__SystemPriority as SystemPriority, __webpack_exports__SystemType as SystemType, __webpack_exports__TagQuery as TagQuery, __webpack_exports__TestClock as TestClock, __webpack_exports__Text as Text, __webpack_exports__TextAlign as TextAlign, __webpack_exports__TextureLoader as TextureLoader, __webpack_exports__Tile as Tile, __webpack_exports__TileMap as TileMap, __webpack_exports__TileMapEvents as TileMapEvents, __webpack_exports__TiledAnimation as TiledAnimation, __webpack_exports__TiledSprite as TiledSprite, __webpack_exports__Timer as Timer, __webpack_exports__Toaster as Toaster, __webpack_exports__Transform as Transform, __webpack_exports__TransformComponent as TransformComponent, __webpack_exports__Transition as Transition, __webpack_exports__TreeNode as TreeNode, __webpack_exports__Trigger as Trigger, __webpack_exports__TriggerEvents as TriggerEvents, __webpack_exports__TwoPI as TwoPI, __webpack_exports__Util as Util, __webpack_exports__Vector as Vector, __webpack_exports__VectorView as VectorView, __webpack_exports__VertexBuffer as VertexBuffer, __webpack_exports__VertexLayout as VertexLayout, __webpack_exports__VerticalFirst as VerticalFirst, __webpack_exports__VisibleEvent as VisibleEvent, __webpack_exports__WebAudio as WebAudio, __webpack_exports__WebAudioInstance as WebAudioInstance, __webpack_exports__WheelDeltaMode as WheelDeltaMode, __webpack_exports__WheelEvent as WheelEvent, __webpack_exports__World as World, __webpack_exports__approximatelyEqual as approximatelyEqual, __webpack_exports__assert as assert, __webpack_exports__canonicalizeAngle as canonicalizeAngle, __webpack_exports__clamp as clamp, __webpack_exports__coroutine as coroutine, __webpack_exports__createId as createId, __webpack_exports__frac as frac, __webpack_exports__getDefaultPhysicsConfig as getDefaultPhysicsConfig, __webpack_exports__hasGraphicsTick as hasGraphicsTick, __webpack_exports__hasOnAdd as hasOnAdd, __webpack_exports__hasOnInitialize as hasOnInitialize, __webpack_exports__hasOnPostUpdate as hasOnPostUpdate, __webpack_exports__hasOnPreUpdate as hasOnPreUpdate, __webpack_exports__hasOnRemove as hasOnRemove, __webpack_exports__hasPostDraw as hasPostDraw, __webpack_exports__hasPreDraw as hasPreDraw, __webpack_exports__has_add as has_add, __webpack_exports__has_initialize as has_initialize, __webpack_exports__has_postupdate as has_postupdate, __webpack_exports__has_preupdate as has_preupdate, __webpack_exports__has_remove as has_remove, __webpack_exports__inverseLerp as inverseLerp, __webpack_exports__inverseLerpVector as inverseLerpVector, __webpack_exports__isActor as isActor, __webpack_exports__isAddedComponent as isAddedComponent, __webpack_exports__isComponentCtor as isComponentCtor, __webpack_exports__isLoaderConstructor as isLoaderConstructor, __webpack_exports__isMoveByOptions as isMoveByOptions, __webpack_exports__isMoveToOptions as isMoveToOptions, __webpack_exports__isRemovedComponent as isRemovedComponent, __webpack_exports__isRotateByOptions as isRotateByOptions, __webpack_exports__isRotateToOptions as isRotateToOptions, __webpack_exports__isScaleByOptions as isScaleByOptions, __webpack_exports__isScaleToOptions as isScaleToOptions, __webpack_exports__isSceneConstructor as isSceneConstructor, __webpack_exports__isScreenElement as isScreenElement, __webpack_exports__isSystemConstructor as isSystemConstructor, __webpack_exports__lerp as lerp, __webpack_exports__lerpAngle as lerpAngle, __webpack_exports__lerpVector as lerpVector, __webpack_exports__maxMessages as maxMessages, __webpack_exports__nextActionId as nextActionId, __webpack_exports__obsolete as obsolete, __webpack_exports__parseImageFiltering as parseImageFiltering, __webpack_exports__parseImageWrapping as parseImageWrapping, __webpack_exports__pixelSnapEpsilon as pixelSnapEpsilon, __webpack_exports__randomInRange as randomInRange, __webpack_exports__randomIntInRange as randomIntInRange, __webpack_exports__range as range, __webpack_exports__remap as remap, __webpack_exports__remapVector as remapVector, __webpack_exports__resetObsoleteCounter as resetObsoleteCounter, __webpack_exports__sign as sign, __webpack_exports__toDegrees as toDegrees, __webpack_exports__toRadians as toRadians, __webpack_exports__vec as vec, __webpack_exports__webgl as webgl };\n/******/ \n\n//# sourceMappingURL=excalibur.development.js.map","export const Config = {\r\n PlayerSpeed: 16*2, // pixels/sec\r\n PlayerFrameSpeed: 200, // ms\r\n}","import * as ex from 'excalibur';\r\nimport { Resources } from './resources';\r\nimport { Config } from './config';\r\n\r\nexport class Player extends ex.Actor {\r\n constructor(args: ex.ActorArgs) {\r\n super({\r\n ...args,\r\n collisionType: ex.CollisionType.Active\r\n })\r\n }\r\n\r\n onInitialize(engine: ex.Engine): void {\r\n const playerSpriteSheet = ex.SpriteSheet.fromImageSource({\r\n image: Resources.HeroSpriteSheetPng as ex.ImageSource,\r\n grid: {\r\n spriteWidth: 16,\r\n spriteHeight: 16,\r\n rows: 8,\r\n columns: 8\r\n }\r\n });\r\n\r\n const leftIdle = new ex.Animation({\r\n frames: [\r\n {graphic: playerSpriteSheet.getSprite(0, 1) as ex.Sprite, duration: Config.PlayerFrameSpeed},\r\n {graphic: playerSpriteSheet.getSprite(1, 1) as ex.Sprite, duration: Config.PlayerFrameSpeed},\r\n {graphic: playerSpriteSheet.getSprite(2, 1) as ex.Sprite, duration: Config.PlayerFrameSpeed},\r\n {graphic: playerSpriteSheet.getSprite(3, 1) as ex.Sprite, duration: Config.PlayerFrameSpeed},\r\n ]\r\n })\r\n this.graphics.add('left-idle', leftIdle);\r\n\r\n const rightIdle = new ex.Animation({\r\n frames: [\r\n {graphic: playerSpriteSheet.getSprite(0, 2) as ex.Sprite, duration: Config.PlayerFrameSpeed},\r\n {graphic: playerSpriteSheet.getSprite(1, 2) as ex.Sprite, duration: Config.PlayerFrameSpeed},\r\n {graphic: playerSpriteSheet.getSprite(2, 2) as ex.Sprite, duration: Config.PlayerFrameSpeed},\r\n {graphic: playerSpriteSheet.getSprite(3, 2) as ex.Sprite, duration: Config.PlayerFrameSpeed},\r\n ]\r\n })\r\n this.graphics.add('right-idle', rightIdle);\r\n\r\n\r\n const upIdle = new ex.Animation({\r\n frames: [\r\n {graphic: playerSpriteSheet.getSprite(0, 3) as ex.Sprite, duration: Config.PlayerFrameSpeed},\r\n {graphic: playerSpriteSheet.getSprite(1, 3) as ex.Sprite, duration: Config.PlayerFrameSpeed},\r\n {graphic: playerSpriteSheet.getSprite(2, 3) as ex.Sprite, duration: Config.PlayerFrameSpeed},\r\n {graphic: playerSpriteSheet.getSprite(3, 3) as ex.Sprite, duration: Config.PlayerFrameSpeed},\r\n ]\r\n })\r\n this.graphics.add('up-idle', upIdle);\r\n\r\n const downIdle = new ex.Animation({\r\n frames: [\r\n {graphic: playerSpriteSheet.getSprite(0, 0) as ex.Sprite, duration: Config.PlayerFrameSpeed},\r\n {graphic: playerSpriteSheet.getSprite(1, 0) as ex.Sprite, duration: Config.PlayerFrameSpeed},\r\n {graphic: playerSpriteSheet.getSprite(2, 0) as ex.Sprite, duration: Config.PlayerFrameSpeed},\r\n {graphic: playerSpriteSheet.getSprite(3, 0) as ex.Sprite, duration: Config.PlayerFrameSpeed},\r\n ]\r\n })\r\n this.graphics.add('down-idle', downIdle);\r\n\r\n const leftWalk = new ex.Animation({\r\n frames: [\r\n {graphic: playerSpriteSheet.getSprite(0, 5) as ex.Sprite, duration: Config.PlayerFrameSpeed},\r\n {graphic: playerSpriteSheet.getSprite(1, 5) as ex.Sprite, duration: Config.PlayerFrameSpeed},\r\n {graphic: playerSpriteSheet.getSprite(2, 5) as ex.Sprite, duration: Config.PlayerFrameSpeed},\r\n {graphic: playerSpriteSheet.getSprite(3, 5) as ex.Sprite, duration: Config.PlayerFrameSpeed},\r\n ]\r\n })\r\n this.graphics.add('left-walk', leftWalk);\r\n\r\n const rightWalk = new ex.Animation({\r\n frames: [\r\n {graphic: playerSpriteSheet.getSprite(0, 6) as ex.Sprite, duration: Config.PlayerFrameSpeed},\r\n {graphic: playerSpriteSheet.getSprite(1, 6) as ex.Sprite, duration: Config.PlayerFrameSpeed},\r\n {graphic: playerSpriteSheet.getSprite(2, 6) as ex.Sprite, duration: Config.PlayerFrameSpeed},\r\n {graphic: playerSpriteSheet.getSprite(3, 6) as ex.Sprite, duration: Config.PlayerFrameSpeed},\r\n ]\r\n });\r\n this.graphics.add('right-walk', rightWalk);\r\n\r\n const upWalk = new ex.Animation({\r\n frames: [\r\n {graphic: playerSpriteSheet.getSprite(0, 7) as ex.Sprite, duration: Config.PlayerFrameSpeed},\r\n {graphic: playerSpriteSheet.getSprite(1, 7) as ex.Sprite, duration: Config.PlayerFrameSpeed},\r\n {graphic: playerSpriteSheet.getSprite(2, 7) as ex.Sprite, duration: Config.PlayerFrameSpeed},\r\n {graphic: playerSpriteSheet.getSprite(3, 7) as ex.Sprite, duration: Config.PlayerFrameSpeed},\r\n ]\r\n });\r\n this.graphics.add('up-walk', upWalk);\r\n\r\n const downWalk = new ex.Animation({\r\n frames: [\r\n {graphic: playerSpriteSheet.getSprite(0, 4) as ex.Sprite, duration: Config.PlayerFrameSpeed},\r\n {graphic: playerSpriteSheet.getSprite(1, 4) as ex.Sprite, duration: Config.PlayerFrameSpeed},\r\n {graphic: playerSpriteSheet.getSprite(2, 4) as ex.Sprite, duration: Config.PlayerFrameSpeed},\r\n {graphic: playerSpriteSheet.getSprite(3, 4) as ex.Sprite, duration: Config.PlayerFrameSpeed},\r\n ]\r\n });\r\n this.graphics.add('down-walk', downWalk);\r\n }\r\n\r\n onPreUpdate(engine: ex.Engine, elapsedMs: number): void {\r\n this.vel = ex.Vector.Zero;\r\n\r\n this.graphics.use('down-idle');\r\n if (engine.input.keyboard.isHeld(ex.Keys.ArrowRight)) {\r\n this.vel = ex.vec(Config.PlayerSpeed, 0);\r\n this.graphics.use('right-walk');\r\n }\r\n if (engine.input.keyboard.isHeld(ex.Keys.ArrowLeft)) {\r\n this.vel = ex.vec(-Config.PlayerSpeed, 0);\r\n this.graphics.use('left-walk');\r\n }\r\n if (engine.input.keyboard.isHeld(ex.Keys.ArrowUp)) {\r\n this.vel = ex.vec(0, -Config.PlayerSpeed);\r\n this.graphics.use('up-walk');\r\n }\r\n if (engine.input.keyboard.isHeld(ex.Keys.ArrowDown)) {\r\n this.vel = ex.vec(0, Config.PlayerSpeed);\r\n this.graphics.use('down-walk');\r\n }\r\n\r\n }\r\n}","import { ImageFiltering, ImageSource, Loader } from \"excalibur\";\r\nimport { LdtkResource } from '@excalibur-ldtk';\r\n\r\nexport const Resources = {\r\n HeroSpriteSheetPng: new ImageSource('./Solaria Demo Pack Update 03/Solaria Demo Pack Update 03/16x16/Sprites/Hero 01.png'),\r\n LdtkResource: new LdtkResource('./spacing-padding/spacing-padding.ldtk', {\r\n useTilemapCameraStrategy: true,\r\n useMapBackgroundColor: true,\r\n }),\r\n LdtkAutoTile: new LdtkResource('./autotile/autotile.ldtk', {\r\n useMapBackgroundColor: true,\r\n }),\r\n LdtkPureAutoTile: new LdtkResource('./dsml1/dsml1.ldtk', {\r\n useMapBackgroundColor: true,\r\n })\r\n} as const;\r\n\r\n\r\nexport const loader = new Loader();\r\nfor (let resource of Object.values(Resources)) {\r\n loader.addResource(resource);\r\n}","import { Actor, Entity, Vector, vec } from \"excalibur\";\r\nimport { LdtkResource } from \"./ldtk-resource\";\r\nimport { LdtkEntityInstance, LdtkLayerInstance } from \"./types\";\r\nimport { Level } from \"./level\";\r\n\r\nexport class EntityLayer {\r\n public worldPos: Vector;\r\n public offset: Vector;\r\n public entities: Entity[] = [];\r\n public ldtkToEntity = new Map();\r\n public entityToLdtk = new Map();\r\n constructor(level: Level, public readonly ldtkLayer: LdtkLayerInstance, private resource: LdtkResource, public readonly order: number) {\r\n this.worldPos = vec(level.ldtkLevel.worldX, level.ldtkLevel.worldY);\r\n this.offset = vec(ldtkLayer.__pxTotalOffsetX, ldtkLayer.__pxTotalOffsetY);\r\n if (ldtkLayer.entityInstances) {\r\n for (let entity of ldtkLayer.entityInstances) {\r\n const entityMetadata = resource.projectMetadata.defs.entities.find(e => {\r\n return e.identifier === entity.__identifier\r\n });\r\n \r\n if (resource.factories.has(entity.__identifier)) {\r\n const factory = resource.factories.get(entity.__identifier);\r\n if (factory) {\r\n const newEntity = factory({\r\n type: entity.__identifier,\r\n worldPos: vec(entity.px[0], entity.px[1]).add(this.worldPos.add(this.offset)),\r\n entity,\r\n definition: entityMetadata,\r\n layer: this,\r\n });\r\n if (newEntity) {\r\n this.entities.push(newEntity);\r\n this.ldtkToEntity.set(entity, newEntity);\r\n this.entityToLdtk.set(newEntity, entity);\r\n }\r\n }\r\n } else {\r\n const actor = new Actor({\r\n name: entity.__identifier,\r\n pos: vec(entity.px[0], entity.px[1]).add(this.worldPos.add(this.offset)),\r\n width: entity.width,\r\n height: entity.height,\r\n anchor: vec(entityMetadata?.pivotX ?? 0, entityMetadata?.pivotY ?? 0),\r\n z: order\r\n });\r\n if (entity.__tile) {\r\n const ts = resource.tilesets.get(entity.__tile.tilesetUid);\r\n if (ts) {\r\n const tsxCoord = Math.floor(entity.__tile.x / entity.__tile.w);\r\n const tsyCoord = Math.floor(entity.__tile.y / entity.__tile.h);\r\n const sprite = ts.spritesheet.getSprite(tsxCoord, tsyCoord);\r\n if (sprite) {\r\n actor.graphics.use(sprite);\r\n }\r\n }\r\n }\r\n this.entities.push(actor);\r\n this.ldtkToEntity.set(entity, actor);\r\n this.entityToLdtk.set(actor, entity);\r\n }\r\n }\r\n }\r\n }\r\n\r\n runFactories() {\r\n for (let entity of this.ldtkLayer.entityInstances) {\r\n const factory = this.resource.factories.get(entity.__identifier);\r\n \r\n if (!factory) { continue }\r\n\r\n const entityMetadata = this.resource.projectMetadata.defs.entities.find(e => {\r\n return e.identifier === entity.__identifier\r\n });\r\n\r\n const newEntity = factory({\r\n type: entity.__identifier,\r\n worldPos: vec(entity.px[0], entity.px[1]).add(this.worldPos.add(this.offset)),\r\n entity,\r\n definition: entityMetadata,\r\n layer: this,\r\n });\r\n\r\n if (newEntity) {\r\n // remove pre-existing entity (e.g. the default actor created for the entity placement)\r\n const preExisting = this.ldtkToEntity.get(entity);\r\n if (preExisting) {\r\n const index = this.entities.indexOf(preExisting);\r\n if (index > -1) {\r\n this.entities.splice(index, 1);\r\n this.ldtkToEntity.delete(entity);\r\n this.entityToLdtk.delete(preExisting);\r\n }\r\n }\r\n \r\n this.entities.push(newEntity);\r\n this.ldtkToEntity.set(entity, newEntity);\r\n this.entityToLdtk.set(newEntity, entity);\r\n }\r\n }\r\n }\r\n\r\n\r\n getEntitiesByIdentifier(identifier: string): Entity[] {\r\n const ldtkEntities = this.getLdtkEntitiesByIdentifier(identifier);\r\n let results: Entity[] = [];\r\n for (const ldtk of ldtkEntities) {\r\n const maybeEntity = this.ldtkToEntity.get(ldtk);\r\n if (maybeEntity) {\r\n results.push(maybeEntity);\r\n }\r\n }\r\n return results;\r\n }\r\n\r\n getEntitiesByField(fieldIdentifier: string, value?: any): Entity[] {\r\n const ldtkEntities = this.getLdtkEntitiesByField(fieldIdentifier, value);\r\n let results: Entity[] = [];\r\n for (const ldtk of ldtkEntities) {\r\n const maybeEntity = this.ldtkToEntity.get(ldtk);\r\n if (maybeEntity) {\r\n results.push(maybeEntity);\r\n }\r\n }\r\n return results;\r\n }\r\n\r\n /**\r\n * Search layer for entities that match an identifier (case insensitive)\r\n * @param identifier \r\n * @returns \r\n */\r\n getLdtkEntitiesByIdentifier(identifier: string): LdtkEntityInstance[] {\r\n return this.ldtkLayer.entityInstances.filter(e => e.__identifier.toLocaleLowerCase() === identifier.toLowerCase());\r\n }\r\n\r\n /**\r\n * Search layer for entities that match a field and optionally a value (both case insensitive)\r\n * @param fieldIdentifier \r\n * @param value\r\n */\r\n getLdtkEntitiesByField(fieldIdentifier: string, value?: any): LdtkEntityInstance[] {\r\n return this.ldtkLayer.entityInstances.filter(e => {\r\n if (value !== undefined) {\r\n let normalizedValue = value;\r\n if (typeof value === 'string') {\r\n normalizedValue = value.toLocaleLowerCase();\r\n }\r\n\r\n const field = e.fieldInstances.find(f => f.__identifier.toLocaleLowerCase() === fieldIdentifier.toLocaleLowerCase());\r\n if (field) {\r\n return field.__value === normalizedValue;\r\n }\r\n return false;\r\n } else {\r\n return !!e.fieldInstances.find(f => f.__identifier.toLocaleLowerCase() === fieldIdentifier.toLocaleLowerCase());\r\n }\r\n });\r\n }\r\n}","\r\n\r\nexport type FileLoader = (path: string, contentType: 'json' | 'xml') => Promise;\r\n\r\nexport const FetchLoader: FileLoader = async (path: string, contentType: 'json' | 'xml') => {\r\n const response = await fetch(path);\r\n switch(contentType.toLowerCase()) {\r\n case 'xml': return await response.text();\r\n case 'json': return await response.json();\r\n default: return await response.text();\r\n }\r\n}","\r\nexport * from './ldtk-resource';\r\nexport * from './entity-layer';\r\nexport * from './file-loader';\r\nexport * from './intgrid-layer';\r\nexport * from './level-resource';\r\nexport * from './level';\r\nexport * from './loader-cache';\r\nexport * from './path-util';\r\nexport * from './tile-layer';\r\nexport * from './tileset';\r\nexport * from './types';","import { GraphicsComponent, TileMap, Vector, vec } from \"excalibur\";\r\nimport { LdtkLayerInstance } from \"./types\";\r\nimport { LdtkResource } from \"./ldtk-resource\";\r\nimport { Level } from \"./level\";\r\nimport { Tileset } from \"./tileset\";\r\n\r\nexport class IntGridLayer {\r\n\r\n public ldtkLayer: LdtkLayerInstance;\r\n public worldPos: Vector;\r\n public offset: Vector;\r\n public tilemap!: TileMap;\r\n public tileset?: Tileset;\r\n\r\n constructor(level: Level, ldtkLayer: LdtkLayerInstance, resource: LdtkResource, public readonly order: number) {\r\n this.worldPos = vec(level.ldtkLevel.worldX, level.ldtkLevel.worldY);\r\n this.offset = vec(ldtkLayer.__pxTotalOffsetX, ldtkLayer.__pxTotalOffsetY);\r\n this.ldtkLayer = ldtkLayer;\r\n if (ldtkLayer.intGridCsv.length || ldtkLayer.autoLayerTiles.length) {\r\n\r\n const rows = ldtkLayer.__cHei;\r\n const columns = ldtkLayer.__cWid;\r\n this.tilemap = new TileMap({\r\n name: ldtkLayer.__identifier,\r\n pos: this.worldPos.add(this.offset),\r\n tileWidth: ldtkLayer.__gridSize,\r\n tileHeight: ldtkLayer.__gridSize,\r\n rows,\r\n columns,\r\n });\r\n this.tilemap.z = order;\r\n const graphics = this.tilemap.get(GraphicsComponent);\r\n graphics.isVisible = ldtkLayer.visible;\r\n\r\n // find the intgrid metadata\r\n const layerMetadata = resource.projectMetadata.defs.layers.find(l => {\r\n return ldtkLayer.__identifier === l.identifier;\r\n });\r\n\r\n if (layerMetadata) {\r\n const solidValue = layerMetadata.intGridValues.find(val => {\r\n return val?.identifier?.toLocaleLowerCase() === 'solid';\r\n });\r\n\r\n for (let i = 0; i < ldtkLayer.intGridCsv.length; i++) {\r\n const xCoord = i % columns;\r\n const yCoord = Math.floor(i / columns);\r\n const tile = this.tilemap.getTile(xCoord, yCoord);\r\n if (solidValue && ldtkLayer.intGridCsv[i] === solidValue.value) {\r\n tile!.solid = true;\r\n }\r\n\r\n // TODO might be a mistake to treat 1 as solid if there isn't a labelled solid\r\n if (!solidValue && ldtkLayer.intGridCsv[i] === 1) {\r\n tile!.solid = true;\r\n }\r\n }\r\n\r\n if (ldtkLayer.__tilesetDefUid) {\r\n this.tileset = resource.tilesets.get(ldtkLayer.__tilesetDefUid);\r\n for (let i = 0; i < ldtkLayer.autoLayerTiles.length; i++) {\r\n const tile = ldtkLayer.autoLayerTiles[i];\r\n const xCoord = Math.floor(tile.px[0] / ldtkLayer.__gridSize);\r\n const yCoord = Math.floor(tile.px[1] / ldtkLayer.__gridSize);\r\n const exTile = this.tilemap.getTile(xCoord, yCoord);\r\n if (exTile && this.tileset) {\r\n const tsxCoord = Math.floor((tile.src[0] - (this.tileset.ldtkTileset.padding ?? 0)) / (this.tileset.ldtkTileset.tileGridSize + (this.tileset.ldtkTileset.spacing ?? 0)));\r\n const tsyCoord = Math.floor((tile.src[1] - (this.tileset.ldtkTileset.padding ?? 0)) / (this.tileset.ldtkTileset.tileGridSize + (this.tileset.ldtkTileset.spacing ?? 0)));\r\n // Bit 0 toggles x flip\r\n // Bit 1 toggles 1 flip\r\n // Examples: f=0 (no flip), f=1 (X flip only), f=2 (Y flip only), f=3 (both flips)\r\n const flipHorizontal = !!(tile.f & 0b01);\r\n const flipVertical = !!(tile.f & 0b10);\r\n let sprite = this.tileset.spritesheet.getSprite(tsxCoord, tsyCoord);\r\n if (flipHorizontal || flipVertical) {\r\n sprite = sprite.clone();\r\n sprite.flipHorizontal = flipHorizontal;\r\n sprite.flipVertical = flipVertical;\r\n }\r\n if (sprite) {\r\n exTile!.addGraphic(sprite);\r\n } else {\r\n console.error('Could not find sprite in LDtk spritesheet at', tsxCoord, tsyCoord);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}","import { TileLayer } from './tile-layer';\r\nimport { PathMap, pathRelativeToBase } from './path-util';\r\nimport { FetchLoader, FileLoader } from './file-loader';\r\nimport { LdtkEntityDefinition, LdtkEntityInstance, LdtkProjectMetadata } from './types';\r\nimport { compare } from 'compare-versions';\r\nimport { LoaderCache } from './loader-cache';\r\nimport { BoundingBox, Entity, ImageSource, Loadable, Scene, TransformComponent, Vector, vec } from 'excalibur';\r\nimport { LevelResource } from './level-resource';\r\nimport { Tileset } from './tileset';\r\nimport { Level } from './level';\r\nimport { EntityLayer } from './entity-layer';\r\nimport { IntGridLayer } from './intgrid-layer';\r\n\r\nexport interface AddToSceneOptions {\r\n /**\r\n * Optionally set the position to place the levels\r\n * \r\n * Default is vec(0, 0)\r\n */\r\n pos?: Vector;\r\n /**\r\n * Optionally add only specific levels to the scene\r\n * \r\n * Default includes all levels\r\n */\r\n levelFilter?: string[];\r\n\r\n /**\r\n * Optionally use the level world offsets, this is useful if your levels are arranged the way you want them\r\n * to appear in your game.\r\n * \r\n * Default is true\r\n */\r\n useLevelOffsets?: boolean;\r\n}\r\n\r\nexport interface FactoryProps {\r\n /**\r\n * Excalibur world position\r\n */\r\n worldPos: Vector;\r\n /**\r\n * LDtk name in UI\r\n */\r\n name?: string;\r\n /**\r\n * LDtk type in UI\r\n */\r\n type: string;\r\n /**\r\n * LDtk entity\r\n */\r\n entity: LdtkEntityInstance;\r\n /**\r\n * LDtk entity metadata\r\n */\r\n definition: LdtkEntityDefinition | undefined;\r\n /**\r\n * Layer\r\n */\r\n layer: EntityLayer;\r\n}\r\n\r\nexport interface LdtkResourceOptions {\r\n /**\r\n * Add a starting z index for the layers to use. By default the layers count up from 0.\r\n *\r\n * If you'd like to manually override a z-index on a layer use the 'zindex' custom property on a layer.\r\n */\r\n startZIndex?: number;\r\n\r\n /**\r\n * Default true. If false, only tilemap will be parsed and displayed, it's up to you to wire up any excalibur behavior.\r\n * Automatically wires excalibur to the following\r\n * * Wire up current scene camera\r\n *\r\n * Read more at excaliburjs.com!\r\n */\r\n useExcaliburWiring?: boolean;\r\n\r\n /**\r\n * Sets excalibur's background color to match the LDtk map\r\n */\r\n useMapBackgroundColor?: boolean;\r\n\r\n /**\r\n * The pathMap helps work around odd things bundlers do with static files by providing a way to redirect the original\r\n * source paths in the LDtk files to new locations.\r\n *\r\n * When the LDtk resource comes across something that matches `path`, it will use the output string instead.\r\n * \r\n * Example:\r\n * ```typescript\r\n * const newResource = new LdtkResource('./example-city.ldtk', {\r\n * pathMap: [\r\n * // If the \"path\" is included in the source path, the output will be used\r\n * { path: 'cone.png', output: '/static/assets/cone.png' },\r\n * // Regex matching with special [match] in output string that is replaced with the first match from the regex\r\n * { path: /(.*\\..*$)/, output: '/static/assets/[match]'}\r\n * ]\r\n * }\r\n * ```\r\n */\r\n pathMap?: PathMap;\r\n\r\n /**\r\n * Optionally provide a custom file loader implementation instead of using the built in ajax (fetch) loader\r\n * that takes a path and returns file data\r\n * \r\n */\r\n fileLoader?: FileLoader;\r\n\r\n /**\r\n * By default `true`, means LDtk files must pass the plugins Typed parse pass.\r\n *\r\n * If you have something that the LDtk plugin does not expect, you can set this to false and it will do it's best\r\n * to parse the LDtk source map file.\r\n */\r\n strict?: boolean;\r\n\r\n /**\r\n * Plugin will operate in headless mode and skip all graphics related\r\n * excalibur items including creating ImageSource's for LDtk items.\r\n *\r\n * Default false.\r\n */\r\n headless?: boolean;\r\n\r\n /**\r\n * Keeps the camera viewport within the bounds of the TileMap, uses the first tile layer's bounds.\r\n *\r\n * Defaults true, if false the camera will use the layer bounds to keep the camera from showing the background.\r\n */\r\n useTilemapCameraStrategy?: boolean;\r\n\r\n /**\r\n * Configure custom Actor/Entity factory functions to construct Actors/Entities\r\n * given a LDtk type name\r\n */\r\n entityIdentifierFactories?: Record Entity | undefined>;\r\n}\r\n\r\nexport class LdtkResource implements Loadable {\r\n public static supportedLdtkVersion = \"1.5.3\";\r\n public projectMetadata!: LdtkProjectMetadata;\r\n data!: LdtkProjectMetadata;\r\n\r\n\r\n public tilesets = new Map();\r\n public levels = new Map();\r\n public levelsByName = new Map();\r\n public factories = new Map Entity | undefined>();\r\n public fileLoader: FileLoader = FetchLoader;\r\n public pathMap: PathMap | undefined;\r\n\r\n private _imageLoader = new LoaderCache(ImageSource);\r\n private _levelLoader = new LoaderCache(LevelResource);\r\n\r\n\r\n public readonly startZIndex: number = 0;\r\n public readonly textQuality: number = 4;\r\n public readonly useExcaliburWiring: boolean = true;\r\n public readonly useMapBackgroundColor: boolean = false;\r\n public readonly useTilemapCameraStrategy: boolean = false;\r\n public readonly headless: boolean = false;\r\n public readonly strict: boolean = true;\r\n\r\n constructor(public readonly path: string, options?: LdtkResourceOptions) {\r\n const {\r\n useExcaliburWiring,\r\n useTilemapCameraStrategy,\r\n entityIdentifierFactories,\r\n pathMap,\r\n useMapBackgroundColor,\r\n fileLoader,\r\n strict,\r\n headless,\r\n startZIndex\r\n } = { ...options };\r\n this.strict = strict ?? this.strict;\r\n this.headless = headless ?? this.headless;\r\n this.useExcaliburWiring = useExcaliburWiring ?? this.useExcaliburWiring;\r\n this.useTilemapCameraStrategy = useTilemapCameraStrategy ?? this.useTilemapCameraStrategy;\r\n this.useMapBackgroundColor = useMapBackgroundColor ?? this.useMapBackgroundColor;\r\n this.startZIndex = startZIndex ?? this.startZIndex;\r\n this.fileLoader = fileLoader ?? this.fileLoader;\r\n this.pathMap = pathMap;\r\n for (const key in entityIdentifierFactories) {\r\n this.registerEntityIdentifierFactory(key, entityIdentifierFactories[key]);\r\n }\r\n\r\n }\r\n async load(): Promise {\r\n const data = await this.fileLoader(this.path, 'json');\r\n if (this.strict) {\r\n try {\r\n this.projectMetadata = LdtkProjectMetadata.parse(data);\r\n } catch (e) {\r\n console.error(`Could not parse LDtk map from location ${this.path}.\\nExcalibur only supports the latest version of LDtk formats as of the plugin's release.`);\r\n console.error(`Is your map file corrupted or being interpreted as the wrong type?`)\r\n throw e;\r\n }\r\n } else {\r\n this.projectMetadata = data as LdtkProjectMetadata;\r\n }\r\n\r\n if (compare(LdtkResource.supportedLdtkVersion, this.projectMetadata.jsonVersion ?? '0.0.0', \">\")) {\r\n console.warn(`The excalibur ldtk plugin officially supports ${LdtkResource.supportedLdtkVersion}+, the current map has LDtk version ${this.projectMetadata.jsonVersion}`)\r\n }\r\n\r\n // iterate through the defs\r\n // load the tilesets\r\n const imagesToLoad: Promise[] = [];\r\n for (let tileset of this.projectMetadata.defs.tilesets) {\r\n if (tileset.relPath) {\r\n const imagePath = pathRelativeToBase(this.path, tileset.relPath, this.pathMap);\r\n const image = this._imageLoader.getOrAdd(imagePath);\r\n const friendlyTileset = new Tileset({\r\n image,\r\n ldtkTileset: tileset\r\n });\r\n this.tilesets.set(tileset.uid, friendlyTileset);\r\n } else {\r\n if (tileset.identifier !== 'Internal_Icons') {\r\n console.warn(`No tileset image provided for ${tileset.identifier}`);\r\n }\r\n }\r\n }\r\n\r\n // iterate through the levels\r\n // load the level metadata\r\n for (let level of this.projectMetadata.levels) {\r\n if (level.externalRelPath) {\r\n // external levels\r\n const levelPath = pathRelativeToBase(this.path, level.externalRelPath, this.pathMap);\r\n this._levelLoader.getOrAdd(levelPath, this, {\r\n headless: this.headless,\r\n strict: this.strict,\r\n fileLoader: this.fileLoader,\r\n imageLoader: this._imageLoader,\r\n pathMap: this.pathMap\r\n });\r\n } else {\r\n // embedded levels\r\n const friendlyLevel = new Level(level, this);\r\n this.levels.set(level.uid, friendlyLevel);\r\n this.levelsByName.set(level.identifier.toLowerCase(), friendlyLevel);\r\n }\r\n }\r\n\r\n await Promise.all([this._imageLoader.load(), this._levelLoader.load()]);\r\n this._levelLoader.values().forEach(level => {\r\n this.levels.set(level.data.ldtkLevel.uid, level.data);\r\n this.levelsByName.set(level.data.ldtkLevel.identifier.toLowerCase(), level.data);\r\n });\r\n\r\n return this.data = this.projectMetadata;\r\n };\r\n\r\n isLoaded(): boolean {\r\n return !!this.data;\r\n }\r\n\r\n registerEntityIdentifierFactory(ldtkEntityIdentifier: string, factory: (props: FactoryProps) => Entity | undefined): void {\r\n this.factories.set(ldtkEntityIdentifier, factory);\r\n }\r\n\r\n registerEntityIdentifierFactories(factories: Record Entity | undefined>): void {\r\n for (const key in factories) {\r\n this.registerEntityIdentifierFactory(key, factories[key]);\r\n }\r\n }\r\n\r\n /**\r\n * Get a level by identifier\r\n * @param identifier \r\n * @returns \r\n */\r\n getLevel(identifier: string): Level | undefined {\r\n return this.levelsByName.get(identifier.toLowerCase());\r\n }\r\n\r\n /**\r\n * Get the entity layers, optionally provide a level identifier to filter to\r\n * @param levelIdentifier \r\n */\r\n getEntityLayers(levelIdentifier?: string): EntityLayer[] {\r\n let results: EntityLayer[] = [];\r\n if (levelIdentifier) {\r\n const level = this.getLevel(levelIdentifier);\r\n if (level) {\r\n for (let layer of level.layers) {\r\n if (layer instanceof EntityLayer) {\r\n results.push(layer);\r\n }\r\n }\r\n }\r\n } else {\r\n for (const level of this.levels.values()) {\r\n for (let layer of level.layers) {\r\n if (layer instanceof EntityLayer) {\r\n results.push(layer);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return results\r\n }\r\n\r\n getTileLayers(identifier?: string): TileLayer[] {\r\n let results: TileLayer[] = [];\r\n if (identifier) {\r\n const level = this.getLevel(identifier);\r\n if (level) {\r\n for (let layer of level.layers) {\r\n if (layer instanceof TileLayer) {\r\n results.push(layer);\r\n }\r\n }\r\n }\r\n } else {\r\n for (const level of this.levels.values()) {\r\n for (let layer of level.layers) {\r\n if (layer instanceof TileLayer) {\r\n results.push(layer);\r\n }\r\n }\r\n }\r\n }\r\n return results;\r\n }\r\n\r\n getIntGridLayers(identifier?: string): IntGridLayer[] {\r\n let results: IntGridLayer[] = [];\r\n if (identifier) {\r\n const level = this.getLevel(identifier);\r\n if (level) {\r\n for (let layer of level.layers) {\r\n if (layer instanceof IntGridLayer) {\r\n results.push(layer);\r\n }\r\n }\r\n }\r\n } else {\r\n for (const level of this.levels.values()) {\r\n for (let layer of level.layers) {\r\n if (layer instanceof IntGridLayer) {\r\n results.push(layer);\r\n }\r\n }\r\n }\r\n }\r\n return results;\r\n }\r\n\r\n /**\r\n * Search layer for entities that match an identifier (case insensitive)\r\n * @param identifier \r\n * @returns \r\n */\r\n getLdtkEntitiesByIdentifier(identifier: string, levels?: string[]): LdtkEntityInstance[] {\r\n let results: LdtkEntityInstance[] = [];\r\n const levelsToSearch = levels ?? Array.from(this.levels.values()).map(l => l.ldtkLevel.identifier);\r\n for (const level of levelsToSearch) {\r\n const layers = this.getEntityLayers(level);\r\n for (let layer of layers) {\r\n results = results.concat(layer.getLdtkEntitiesByIdentifier(identifier));\r\n }\r\n }\r\n return results;\r\n }\r\n\r\n /**\r\n * Search levels for ldtk entities that match a field and optionally a value (both case insensitive)\r\n * @param fieldIdentifier \r\n * @param value\r\n */\r\n getLdtkEntitiesByField(fieldIdentifier: string, value?: any, levels?: string[]): LdtkEntityInstance[] {\r\n let results: LdtkEntityInstance[] = [];\r\n const levelsToSearch = levels ?? Array.from(this.levels.values()).map(l => l.ldtkLevel.identifier);\r\n for (const level of levelsToSearch) {\r\n const layers = this.getEntityLayers(level);\r\n for (let layer of layers) {\r\n results = results.concat(layer.getLdtkEntitiesByField(fieldIdentifier, value));\r\n }\r\n }\r\n return results;\r\n }\r\n\r\n /**\r\n * Search levels for excalibur entities that match an identifier (case insensitive)\r\n * @param identifier\r\n * @param levels\r\n */\r\n getEntitiesByIdentifier(identifier: string, levels?: string[]): Entity[] {\r\n let results: Entity[] = [];\r\n const levelsToSearch = levels ?? Array.from(this.levels.values()).map(l => l.ldtkLevel.identifier);\r\n for (const level of levelsToSearch) {\r\n const layers = this.getEntityLayers(level);\r\n for (let layer of layers) {\r\n results = results.concat(layer.getEntitiesByIdentifier(identifier));\r\n }\r\n }\r\n return results;\r\n }\r\n\r\n /**\r\n * Search levels for excalibur entities that match a field and optionally a value (both case insensitive)\r\n * @param fieldIdentifier\r\n * @param value\r\n * @param levels\r\n */\r\n getEntitiesByField(fieldIdentifier: string, value?: any, levels?: string[]): Entity[] {\r\n let results: Entity[] = [];\r\n const levelsToSearch = levels ?? Array.from(this.levels.values()).map(l => l.ldtkLevel.identifier);\r\n for (const level of levelsToSearch) {\r\n const layers = this.getEntityLayers(level);\r\n for (let layer of layers) {\r\n results = results.concat(layer.getEntitiesByField(fieldIdentifier, value));\r\n }\r\n }\r\n return results;\r\n }\r\n\r\n /**\r\n * Get the level bounds given a list of level identifiers (case insensitive)\r\n * @param levels\r\n */\r\n getLevelBounds(levels?: string[]): BoundingBox {\r\n levels = levels ?? Array.from(this.levelsByName.keys());\r\n let bounds: BoundingBox | null = null;\r\n for (const level of this.levels.values()) {\r\n if (!levels.includes(level.ldtkLevel.identifier)) {\r\n continue;\r\n }\r\n const firstTileLayer = this.getTileLayers(level.ldtkLevel.identifier)[0];\r\n if (firstTileLayer) {\r\n const tileBounds = BoundingBox.fromDimension(\r\n firstTileLayer.tilemap.tileWidth * firstTileLayer.tilemap.columns,\r\n firstTileLayer.tilemap.tileHeight * firstTileLayer.tilemap.rows,\r\n Vector.Zero,\r\n firstTileLayer.tilemap.pos);\r\n if (!bounds) {\r\n bounds = tileBounds;\r\n } else {\r\n bounds = bounds.combine(tileBounds);\r\n }\r\n }\r\n }\r\n return bounds ?? new BoundingBox();\r\n }\r\n\r\n addToScene(scene: Scene, options?: AddToSceneOptions) {\r\n const { pos, useLevelOffsets } = {pos: vec(0, 0), useLevelOffsets: true, ...options};\r\n\r\n \r\n for (let [id, level] of this.levels.entries()) {\r\n if (options?.levelFilter?.length) {\r\n if (!options.levelFilter.includes(level.ldtkLevel.identifier)) {\r\n continue;\r\n }\r\n }\r\n for (let layer of level.layers) {\r\n if (layer instanceof TileLayer || layer instanceof IntGridLayer) {\r\n layer.tilemap.pos = layer.tilemap.pos.add(pos);\r\n if (!useLevelOffsets) {\r\n layer.tilemap.pos = layer.tilemap.pos.sub(layer.worldPos);\r\n }\r\n scene.add(layer.tilemap)\r\n } else {\r\n layer.runFactories()\r\n for (let entity of layer.entities) {\r\n const tx = entity.get(TransformComponent);\r\n if (tx) {\r\n tx.pos = tx.pos.add(pos);\r\n if (!useLevelOffsets) {\r\n tx.pos = tx.pos.sub(layer.worldPos);\r\n }\r\n }\r\n scene.add(entity);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if(this.useExcaliburWiring) {\r\n const camera = this.getLdtkEntitiesByField('camera', true)[0];\r\n if (camera) {\r\n scene.camera.pos = vec(camera.px[0], camera.px[0]);\r\n const zoom = camera.fieldInstances.find(f => f.__identifier.toLocaleLowerCase() === 'zoom');\r\n if (zoom) {\r\n scene.camera.zoom = +zoom.__value;\r\n }\r\n }\r\n }\r\n\r\n if (this.useTilemapCameraStrategy) {\r\n let bounds = this.getLevelBounds(options?.levelFilter);\r\n scene.camera.strategy.limitCameraBounds(bounds);\r\n }\r\n\r\n if (this.useMapBackgroundColor) {\r\n for (let [id, level] of this.levels.entries()) {\r\n if (options?.levelFilter?.length) {\r\n if (!options.levelFilter.includes(level.ldtkLevel.identifier)) {\r\n continue;\r\n }\r\n }\r\n scene.backgroundColor = level.backgroundColor;\r\n break;\r\n }\r\n }\r\n\r\n\r\n }\r\n}","import { ImageSource, Loadable } from \"excalibur\";\r\nimport { PathMap } from \"./path-util\";\r\nimport { LoaderCache } from \"./loader-cache\";\r\nimport { FetchLoader, FileLoader } from \"./file-loader\";\r\nimport { Level } from \"./level\";\r\nimport { LdtkLevel } from \"./types\";\r\nimport { LdtkResource } from \"./ldtk-resource\";\r\n\r\nexport interface LevelResourceOptions {\r\n headless?: boolean;\r\n strict?: boolean;\r\n fileLoader?: FileLoader;\r\n imageLoader?: LoaderCache;\r\n pathMap?: PathMap;\r\n}\r\n\r\n/**\r\n * Loads LDtk levels that are stored in separate files\r\n */\r\nexport class LevelResource implements Loadable {\r\n private fileLoader: FileLoader = FetchLoader;\r\n private imageLoader: LoaderCache;\r\n private pathMap?: PathMap;\r\n public readonly strict: boolean = true;\r\n public readonly headless: boolean = false;\r\n constructor(public readonly path: string, public readonly resource: LdtkResource, options?: LevelResourceOptions) {\r\n const { headless, strict, fileLoader, imageLoader, pathMap } = { ...options };\r\n this.fileLoader = fileLoader ?? this.fileLoader;\r\n this.strict = strict ?? this.strict;\r\n this.headless = headless ?? this.headless;\r\n this.imageLoader = imageLoader ?? new LoaderCache(ImageSource);\r\n this.pathMap = pathMap ?? this.pathMap;\r\n }\r\n data!: Level;\r\n async load(): Promise {\r\n const data = await this.fileLoader(this.path, 'json');\r\n let level: LdtkLevel;\r\n if (this.strict) {\r\n try {\r\n level = LdtkLevel.parse(data)\r\n } catch (e) {\r\n console.error(`Could not parse LDtk level data at ${this.path} are you sure a level is there and not corrupt?`);\r\n throw e;\r\n }\r\n } else {\r\n level = data as LdtkLevel;\r\n }\r\n return this.data = new Level(level, this.resource);\r\n }\r\n isLoaded(): boolean {\r\n return !!this.data;\r\n }\r\n\r\n}","import { Color } from \"excalibur\";\r\nimport { EntityLayer } from \"./entity-layer\";\r\nimport { IntGridLayer } from \"./intgrid-layer\";\r\nimport { LdtkResource } from \"./ldtk-resource\";\r\nimport { TileLayer } from \"./tile-layer\";\r\nimport { LdtkLevel } from \"./types\";\r\n\r\nexport class Level {\r\n\r\n public backgroundColor?: Color;\r\n public layers: (TileLayer | IntGridLayer | EntityLayer)[] = []; \r\n\r\n constructor(public ldtkLevel: LdtkLevel, public resource: LdtkResource) {\r\n if (ldtkLevel.__bgColor) {\r\n this.backgroundColor = Color.fromHex(ldtkLevel.__bgColor);\r\n }\r\n if (ldtkLevel.layerInstances) {\r\n let order = resource.startZIndex;\r\n let layers = ldtkLevel.layerInstances.slice().reverse();\r\n for (let layer of layers) {\r\n if (layer.entityInstances?.length !== 0) {\r\n this.layers.push(new EntityLayer(this, layer, resource, order));\r\n }\r\n\r\n if (layer.gridTiles?.length !== 0) {\r\n this.layers.push(new TileLayer(this, layer, resource, order));\r\n }\r\n\r\n // Includes standard IntGrid, IntGrid w/ AutoTile & AutoTile layers\r\n if (layer.intGridCsv?.length !== 0 || layer.autoLayerTiles?.length !== 0) {\r\n this.layers.push(new IntGridLayer(this, layer, resource, order));\r\n }\r\n order++;\r\n }\r\n }\r\n }\r\n}","export interface CanLoad {\r\n load(): Promise;\r\n }\r\n \r\n /**\r\n * Read through cache for loadables\r\n */\r\n export class LoaderCache {\r\n private _loaded = false;\r\n cache = new Map();\r\n \r\n constructor(public readonly type: new (...args: any[]) => T){}\r\n \r\n getOrAdd(...args: any[]): T {\r\n let resource = this.cache.get(args.join('+'));\r\n if (resource) {\r\n return resource;\r\n }\r\n \r\n resource = new this.type(...args);\r\n this.cache.set(args.join('+'), resource);\r\n return resource;\r\n }\r\n \r\n values(): T[] {\r\n if (this._loaded) {\r\n return Array.from(this.cache.values());\r\n }\r\n throw new Error(`Read through cache not yet loaded! No values to return!`);\r\n }\r\n \r\n async load() {\r\n const resources = Array.from(this.cache.entries());\r\n const results = await Promise.allSettled(resources.map(i => i[1].load()));\r\n \r\n // Check for errors loading resources\r\n let errored = 0;\r\n for (let i = 0; i < results.length; i++) {\r\n const result = results[i];\r\n if (result.status === 'rejected') {\r\n console.error(`Error loading resource at ${resources[i][0]}, is your pathMap correct? or your LDtk map corrupted?`, result.reason);\r\n errored++;\r\n }\r\n }\r\n if (errored) {\r\n throw new Error(`Error loading ${errored} resources`);\r\n }\r\n this._loaded = true;\r\n }\r\n }","\r\n\r\nexport type PathMap = { path: string | RegExp, output: string }[];\r\n\r\nexport function filenameFromPath(inputPath: string): string {\r\n const filenameExpression = /[^/\\\\&\\?]+\\.\\w{2,4}(?=([\\#\\?&].*$|$))/ig\r\n\r\n const matches = inputPath.match(filenameExpression);\r\n\r\n if (matches) {\r\n const match = matches[0];\r\n return match;\r\n }\r\n\r\n throw new Error(`Could not locate filename from path: ${inputPath}`);\r\n}\r\n\r\nexport function mapPath(inputPath: string, pathMap: PathMap): string {\r\n\r\n for (const { path, output } of pathMap) {\r\n if (typeof path === 'string') {\r\n if (inputPath.includes(path)) {\r\n return output;\r\n }\r\n } else {\r\n const match = inputPath.match(path);\r\n if (match) {\r\n return output.replace('[match]', match[0]);;\r\n }\r\n }\r\n }\r\n return inputPath;\r\n}\r\n\r\nexport function pathInMap(inputPath: string, pathMap?: PathMap): boolean {\r\n if (!pathMap) return false;\r\n for (const { path, output } of pathMap) {\r\n if (typeof path === 'string') {\r\n if (inputPath.includes(path)) {\r\n return true;\r\n }\r\n } else {\r\n const match = inputPath.match(path);\r\n if (match) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n}\r\n\r\n\r\nexport function pathRelativeToBase(basePath: string, relativeToBase: string, pathMap?: PathMap) {\r\n if (pathInMap(relativeToBase, pathMap) && pathMap) {\r\n return mapPath(relativeToBase, pathMap);\r\n }\r\n\r\n // Use absolute path if specified\r\n if (relativeToBase.indexOf('/') === 0) {\r\n return relativeToBase;\r\n }\r\n\r\n const originSplit = basePath.split('/');\r\n const relativeSplit = relativeToBase.split('/');\r\n // if origin path is a file, remove it so it's a directory\r\n if (originSplit[originSplit.length - 1].includes('.')) {\r\n originSplit.pop();\r\n }\r\n return originSplit.concat(relativeSplit).join('/');\r\n}","import { GraphicsComponent, TileMap, Vector, vec } from \"excalibur\";\r\nimport { LdtkResource } from \"./ldtk-resource\";\r\nimport { LdtkLayerInstance } from \"./types\";\r\nimport { Level } from \"./level\";\r\nimport { Tileset } from \"./tileset\";\r\n\r\n\r\nexport class TileLayer {\r\n public ldtkLayer: LdtkLayerInstance;\r\n public worldPos: Vector;\r\n public offset: Vector;\r\n public tilemap: TileMap;\r\n public tileset?: Tileset;\r\n\r\n constructor(level: Level, ldtkLayer: LdtkLayerInstance, resource: LdtkResource, public readonly order: number) {\r\n this.worldPos = vec(level.ldtkLevel.worldX, level.ldtkLevel.worldY);\r\n this.offset = vec(ldtkLayer.__pxTotalOffsetX, ldtkLayer.__pxTotalOffsetY);\r\n this.ldtkLayer = ldtkLayer;\r\n this.tilemap = new TileMap({\r\n name: ldtkLayer.__identifier,\r\n pos: this.worldPos.add(this.offset),\r\n tileWidth: ldtkLayer.__gridSize,\r\n tileHeight: ldtkLayer.__gridSize,\r\n rows: ldtkLayer.__cHei,\r\n columns: ldtkLayer.__cWid,\r\n });\r\n this.tilemap.z = order;\r\n const graphics = this.tilemap.get(GraphicsComponent);\r\n graphics.isVisible = ldtkLayer.visible;\r\n\r\n\r\n if (ldtkLayer.__tilesetDefUid) {\r\n this.tileset = resource.tilesets.get(ldtkLayer.__tilesetDefUid);\r\n for (let tile of ldtkLayer.gridTiles) {\r\n const xCoord = Math.floor(tile.px[0] / ldtkLayer.__gridSize);\r\n const yCoord = Math.floor(tile.px[1] / ldtkLayer.__gridSize);\r\n const exTile = this.tilemap.getTile(xCoord, yCoord);\r\n if (this.tileset) {\r\n const tsxCoord = Math.floor((tile.src[0] - (this.tileset.ldtkTileset.padding ?? 0)) / (this.tileset.ldtkTileset.tileGridSize + (this.tileset.ldtkTileset.spacing ?? 0)));\r\n const tsyCoord = Math.floor((tile.src[1] - (this.tileset.ldtkTileset.padding ?? 0)) / (this.tileset.ldtkTileset.tileGridSize + (this.tileset.ldtkTileset.spacing ?? 0)));\r\n // Bit 0 toggles x flip\r\n // Bit 1 toggles 1 flip\r\n // Examples: f=0 (no flip), f=1 (X flip only), f=2 (Y flip only), f=3 (both flips)\r\n const flipHorizontal = !!(tile.f & 0b01);\r\n const flipVertical = !!(tile.f & 0b10);\r\n let sprite = this.tileset.spritesheet.getSprite(tsxCoord, tsyCoord);\r\n if (flipHorizontal || flipVertical) {\r\n sprite = sprite.clone();\r\n sprite.flipHorizontal = flipHorizontal;\r\n sprite.flipVertical = flipVertical;\r\n }\r\n if (sprite) {\r\n exTile!.addGraphic(sprite);\r\n } else {\r\n console.error('Could not find sprite in LDtk spritesheet at', tsxCoord, tsyCoord);\r\n } \r\n }\r\n } \r\n } else {\r\n console.error('Could not tileset in LDtk', ldtkLayer.__tilesetDefUid, ldtkLayer.__tilesetRelPath);\r\n }\r\n\r\n }\r\n}","import { ImageSource, Sprite, SpriteSheet } from \"excalibur\";\r\nimport { LdtkTilesetDefinition } from \"./types\";\r\n\r\nexport interface TilesetOptions {\r\n image: ImageSource,\r\n ldtkTileset: LdtkTilesetDefinition\r\n}\r\n\r\nexport class Tileset {\r\n public readonly image: ImageSource;\r\n public readonly ldtkTileset: LdtkTilesetDefinition;\r\n public readonly spritesheet: SpriteSheet;\r\n constructor(options: TilesetOptions) {\r\n const {image, ldtkTileset} = options;\r\n this.image = image;\r\n this.ldtkTileset = ldtkTileset;\r\n this.spritesheet = SpriteSheet.fromImageSource({\r\n image,\r\n grid: {\r\n rows: ldtkTileset.pxHei / ldtkTileset.tileGridSize,\r\n columns: ldtkTileset.pxWid / ldtkTileset.tileGridSize,\r\n spriteHeight: ldtkTileset.tileGridSize,\r\n spriteWidth: ldtkTileset.tileGridSize\r\n },\r\n spacing: {\r\n margin: { \r\n x: ldtkTileset.spacing ?? 0,\r\n y: ldtkTileset.spacing ?? 0,\r\n },\r\n originOffset: {\r\n x: ldtkTileset.padding ?? 0,\r\n y: ldtkTileset.padding ?? 0\r\n }\r\n }\r\n });\r\n }\r\n}","import { z } from 'zod';\r\n\r\n\r\n\r\nconst LdtkTilesetRectangle = z.object({\r\n h: z.number(),\r\n tilesetUid: z.number(),\r\n w: z.number(),\r\n x: z.number(),\r\n y: z.number()\r\n});\r\nconst LdtkPixel = z.tuple([z.number(), z.number()]);\r\nconst LdtkFieldInstance = z.object({\r\n __identifier: z.string(),\r\n __tile: LdtkTilesetRectangle.nullable(),\r\n __type: z.string(),//z.union([z.literal('Int'), z.literal('Float'), z.literal('String'), z.literal('Bool'), z.literal('Enum')]), // TODO this might not work with ENUM\r\n __value: z.any(),\r\n defUid: z.number()\r\n})\r\nconst LdtkTileInstance = z.object({\r\n a: z.number(),\r\n f: z.number(), // 2-bit int 0bXY flip\r\n px: LdtkPixel,\r\n src: LdtkPixel,\r\n t: z.number()\r\n});\r\n\r\nexport const LdtkEntityInstance = z.object({\r\n __grid: LdtkPixel,\r\n __identifier: z.string(),\r\n __pivot: LdtkPixel,\r\n __smartColor: z.string(),\r\n __tags: z.array(z.string()),\r\n __tile: LdtkTilesetRectangle.nullable(),\r\n __worldX: z.number().nullable(),\r\n __worldY: z.number().nullable(),\r\n defUid: z.number(),\r\n fieldInstances: z.array(LdtkFieldInstance),\r\n height: z.number(),\r\n iid: z.string(),\r\n px: LdtkPixel,\r\n width: z.number()\r\n});\r\nexport type LdtkEntityInstance = z.infer;\r\n\r\nexport const LdtkLayerInstance = z.object({\r\n __cHei: z.number(),\r\n __cWid: z.number(),\r\n __gridSize: z.number(),\r\n __identifier: z.string(),\r\n __opacity: z.number(),\r\n __pxTotalOffsetX: z.number(),\r\n __pxTotalOffsetY: z.number(),\r\n __tilesetDefUid: z.number().nullable(),\r\n __tilesetRelPath:z.string().nullable(),\r\n __type: z.union([z.literal('IntGrid'), z.literal('Entities'), z.literal('Tiles'), z.literal('AutoLayer')]),\r\n autoLayerTiles: z.array(LdtkTileInstance), // only in auto layers\r\n entityInstances: z.array(LdtkEntityInstance),// only in entity layers\r\n gridTiles: z.array(LdtkTileInstance),\r\n iid: z.string(),\r\n intGridCsv: z.array(z.number()), // __cWid x __cHei, 0 means empty, values start at 1\r\n layerDefUid: z.number(),\r\n levelId: z.number(),\r\n overrideTilesetUid: z.number().nullable(),\r\n pxOffsetX: z.number(),\r\n pxOffsetY: z.number(),\r\n visible: z.boolean()\r\n});\r\nexport type LdtkLayerInstance = z.infer;\r\n\r\nexport const LdtkLevel = z.object({\r\n __bgColor: z.string().nullable(),\r\n bgColor: z.string().nullable(),\r\n __bgPos: z.object({\r\n cropRect: z.array(z.tuple([z.number(), z.number(), z.number(), z.number()])), // cropX, cropY, cropWidth, cropHeight\r\n scale: z.tuple([z.number(), z.number()]),\r\n topLeftPx: LdtkPixel\r\n }).nullable(),\r\n __neighbours: z.array(z.object({\r\n dir: z.union([z.literal('n'), z.literal('s'), z.literal('w'), z.literal('e'), z.literal('ne'), z.literal('nw'), z.literal('se'), z.literal('sw'), z.literal('o'), z.literal('<'), z.literal('>')]),\r\n levelIid: z.string()\r\n })),\r\n bgRelPath: z.string().nullable(),\r\n externalRelPath: z.string().nullable(),\r\n fieldInstances: z.array(LdtkFieldInstance),\r\n identifier: z.string(),\r\n iid: z.string(),\r\n layerInstances: z.array(LdtkLayerInstance).nullable(), // null if the save levels separately is enabled\r\n pxHei: z.number(),\r\n pxWid: z.number(),\r\n uid: z.number(),\r\n worldDepth: z.number(),\r\n worldX: z.number(),\r\n worldY: z.number()\r\n});\r\nexport type LdtkLevel = z.infer;\r\n\r\nconst LdtkWorld = z.object({\r\n identifier: z.string(),\r\n iid: z.string(),\r\n levels: z.array(LdtkLevel),\r\n worldGridHeight:z.number(),\r\n worldGridWidth: z.number(),\r\n // TODO is this a typo Vania?\r\n worldLayout: z.union([z.literal('Free'), z.literal('GridVania'), z.literal('LinearHorizontal'), z.literal('LinearVertical')]),\r\n});\r\nexport type LdtkWorld = z.infer;\r\n\r\nconst LdtkEnumValueDefinition = z.object({\r\n color: z.number(),\r\n id: z.string(),\r\n tileRect: LdtkTilesetRectangle.nullable()\r\n});\r\n\r\nconst LdtkEnumDefinition = z.object({\r\n externalRelPath: z.string().nullable(),\r\n iconTilesetUid: z.number().nullable(),\r\n identifier: z.string(),\r\n tags: z.array(z.string()),\r\n uid: z.number(),\r\n values: z.array(LdtkEnumValueDefinition)\r\n})\r\n\r\nexport type LdtkEnumDefinition = z.infer;\r\n\r\nconst LdtkTilesetDefinition = z.object({\r\n __cHei: z.number(),\r\n __cWid: z.number(),\r\n customData: z.array(z.object({\r\n data: z.string(),\r\n tileId: z.number()\r\n })),\r\n embedAtlas: z.string().nullable(),\r\n enumTags: z.optional(z.array(z.object({\r\n enumValueId: z.string(),\r\n tileIds: z.array(z.number())\r\n }))),\r\n identifier: z.string(),\r\n padding: z.number(),\r\n pxHei: z.number(),\r\n pxWid: z.number(),\r\n relPath: z.string().nullable(),\r\n spacing: z.number(),\r\n tags: z.array(z.string()),\r\n tagsSourceEnumUid: z.number().nullable(),\r\n tileGridSize: z.number(),\r\n uid: z.number()\r\n})\r\nexport type LdtkTilesetDefinition = z.infer;\r\n\r\nexport const LdtkLayerDefinition = z.object({\r\n __type: z.union([z.literal(\"IntGrid\"), z.literal(\"Entities\"), z.literal(\"Tiles\"), z.literal(\"AutoLayer\")]),\r\n autoSourceLayerDefUid: z.number().nullable(),\r\n displayOpacity: z.number(),\r\n gridSize: z.number(),\r\n identifier: z.string(),\r\n intGridValues: z.array(z.object({\r\n color: z.string(),\r\n groupUid: z.number(),\r\n identifier: z.string().nullable(),\r\n tile: LdtkTilesetRectangle.nullable(),\r\n value: z.number()\r\n })),\r\n intGridValuesGroups: z.array(z.object({\r\n color: z.string().nullable(),\r\n identifier: z.string().nullable(),\r\n uid: z.number()\r\n })),\r\n parallaxFactorX: z.number(),\r\n parallaxFactorY: z.number(),\r\n parallaxScaling: z.boolean(),\r\n pxOffsetX: z.number(),\r\n pxOffsetY: z.number(),\r\n tilesetDefUid: z.number().nullable(),\r\n uid: z.number(),\r\n});\r\nexport type LdtkLayerDefinition = z.infer;\r\n\r\nexport const LdtkEntityDefinition = z.object({\r\n color: z.string(),\r\n height: z.number(),\r\n identifier: z.string(),\r\n nineSliceBorders: z.array(z.number()),\r\n pivotX: z.number(),\r\n pivotY: z.number(),\r\n tileRect: LdtkTilesetRectangle.nullable(),\r\n tileRenderMode: z.union([\r\n z.literal(\"Cover\"),\r\n z.literal(\"FitInside\"),\r\n z.literal(\"Repeat\"),\r\n z.literal(\"Stretch\"),\r\n z.literal(\"FullSizeCropped\"),\r\n z.literal(\"FullSizeUncropped\"),\r\n z.literal(\"NineSlice\")\r\n ]),\r\n tilesetId: z.number().nullable(),\r\n uiTileRect: LdtkTilesetRectangle.nullable(),\r\n uid: z.number(),\r\n width: z.number()\r\n});\r\nexport type LdtkEntityDefinition = z.infer;\r\n\r\nconst LdtkDefinitions = z.object({\r\n tilesets: z.array(LdtkTilesetDefinition),\r\n enums: z.array(LdtkEnumDefinition),\r\n layers: z.array(LdtkLayerDefinition),\r\n entities: z.array(LdtkEntityDefinition)\r\n})\r\nexport type LdtkDefinitions = z.infer;\r\n\r\nexport const LdtkProjectMetadata = z.object({\r\n iid: z.string(),\r\n bgColor: z.string().nullable(),\r\n defs: LdtkDefinitions,\r\n externalLevels: z.boolean(),\r\n jsonVersion: z.string(),\r\n levels: z.array(LdtkLevel),\r\n toc: z.array(z.object({\r\n identifier: z.string(),\r\n instancesData: z.array(z.object({\r\n fields: z.any(),\r\n heiPx: z.number(),\r\n iids: z.string(),\r\n widPix: z.number(),\r\n worldX: z.number(),\r\n worldY: z.number()\r\n }))\r\n })),\r\n // Moving to worlds array\r\n worldGridHeight: z.number().nullable(),\r\n worldGridWidth: z.number().nullable(),\r\n // TODO is this a LDtk docs typo Vania?\r\n worldLayout: z.union([z.literal('Free'), z.literal('GridVania'), z.literal('LinearHorizontal'), z.literal('LinearVertical')]).nullable(),\r\n worlds: z.array(LdtkWorld)\r\n});\r\nexport type LdtkProjectMetadata = z.infer;\r\n\r\n\r\n\r\n","var util;\n(function (util) {\n util.assertEqual = (val) => val;\n function assertIs(_arg) { }\n util.assertIs = assertIs;\n function assertNever(_x) {\n throw new Error();\n }\n util.assertNever = assertNever;\n util.arrayToEnum = (items) => {\n const obj = {};\n for (const item of items) {\n obj[item] = item;\n }\n return obj;\n };\n util.getValidEnumValues = (obj) => {\n const validKeys = util.objectKeys(obj).filter((k) => typeof obj[obj[k]] !== \"number\");\n const filtered = {};\n for (const k of validKeys) {\n filtered[k] = obj[k];\n }\n return util.objectValues(filtered);\n };\n util.objectValues = (obj) => {\n return util.objectKeys(obj).map(function (e) {\n return obj[e];\n });\n };\n util.objectKeys = typeof Object.keys === \"function\" // eslint-disable-line ban/ban\n ? (obj) => Object.keys(obj) // eslint-disable-line ban/ban\n : (object) => {\n const keys = [];\n for (const key in object) {\n if (Object.prototype.hasOwnProperty.call(object, key)) {\n keys.push(key);\n }\n }\n return keys;\n };\n util.find = (arr, checker) => {\n for (const item of arr) {\n if (checker(item))\n return item;\n }\n return undefined;\n };\n util.isInteger = typeof Number.isInteger === \"function\"\n ? (val) => Number.isInteger(val) // eslint-disable-line ban/ban\n : (val) => typeof val === \"number\" && isFinite(val) && Math.floor(val) === val;\n function joinValues(array, separator = \" | \") {\n return array\n .map((val) => (typeof val === \"string\" ? `'${val}'` : val))\n .join(separator);\n }\n util.joinValues = joinValues;\n util.jsonStringifyReplacer = (_, value) => {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n };\n})(util || (util = {}));\nvar objectUtil;\n(function (objectUtil) {\n objectUtil.mergeShapes = (first, second) => {\n return {\n ...first,\n ...second, // second overwrites first\n };\n };\n})(objectUtil || (objectUtil = {}));\nconst ZodParsedType = util.arrayToEnum([\n \"string\",\n \"nan\",\n \"number\",\n \"integer\",\n \"float\",\n \"boolean\",\n \"date\",\n \"bigint\",\n \"symbol\",\n \"function\",\n \"undefined\",\n \"null\",\n \"array\",\n \"object\",\n \"unknown\",\n \"promise\",\n \"void\",\n \"never\",\n \"map\",\n \"set\",\n]);\nconst getParsedType = (data) => {\n const t = typeof data;\n switch (t) {\n case \"undefined\":\n return ZodParsedType.undefined;\n case \"string\":\n return ZodParsedType.string;\n case \"number\":\n return isNaN(data) ? ZodParsedType.nan : ZodParsedType.number;\n case \"boolean\":\n return ZodParsedType.boolean;\n case \"function\":\n return ZodParsedType.function;\n case \"bigint\":\n return ZodParsedType.bigint;\n case \"symbol\":\n return ZodParsedType.symbol;\n case \"object\":\n if (Array.isArray(data)) {\n return ZodParsedType.array;\n }\n if (data === null) {\n return ZodParsedType.null;\n }\n if (data.then &&\n typeof data.then === \"function\" &&\n data.catch &&\n typeof data.catch === \"function\") {\n return ZodParsedType.promise;\n }\n if (typeof Map !== \"undefined\" && data instanceof Map) {\n return ZodParsedType.map;\n }\n if (typeof Set !== \"undefined\" && data instanceof Set) {\n return ZodParsedType.set;\n }\n if (typeof Date !== \"undefined\" && data instanceof Date) {\n return ZodParsedType.date;\n }\n return ZodParsedType.object;\n default:\n return ZodParsedType.unknown;\n }\n};\n\nconst ZodIssueCode = util.arrayToEnum([\n \"invalid_type\",\n \"invalid_literal\",\n \"custom\",\n \"invalid_union\",\n \"invalid_union_discriminator\",\n \"invalid_enum_value\",\n \"unrecognized_keys\",\n \"invalid_arguments\",\n \"invalid_return_type\",\n \"invalid_date\",\n \"invalid_string\",\n \"too_small\",\n \"too_big\",\n \"invalid_intersection_types\",\n \"not_multiple_of\",\n \"not_finite\",\n]);\nconst quotelessJson = (obj) => {\n const json = JSON.stringify(obj, null, 2);\n return json.replace(/\"([^\"]+)\":/g, \"$1:\");\n};\nclass ZodError extends Error {\n get errors() {\n return this.issues;\n }\n constructor(issues) {\n super();\n this.issues = [];\n this.addIssue = (sub) => {\n this.issues = [...this.issues, sub];\n };\n this.addIssues = (subs = []) => {\n this.issues = [...this.issues, ...subs];\n };\n const actualProto = new.target.prototype;\n if (Object.setPrototypeOf) {\n // eslint-disable-next-line ban/ban\n Object.setPrototypeOf(this, actualProto);\n }\n else {\n this.__proto__ = actualProto;\n }\n this.name = \"ZodError\";\n this.issues = issues;\n }\n format(_mapper) {\n const mapper = _mapper ||\n function (issue) {\n return issue.message;\n };\n const fieldErrors = { _errors: [] };\n const processError = (error) => {\n for (const issue of error.issues) {\n if (issue.code === \"invalid_union\") {\n issue.unionErrors.map(processError);\n }\n else if (issue.code === \"invalid_return_type\") {\n processError(issue.returnTypeError);\n }\n else if (issue.code === \"invalid_arguments\") {\n processError(issue.argumentsError);\n }\n else if (issue.path.length === 0) {\n fieldErrors._errors.push(mapper(issue));\n }\n else {\n let curr = fieldErrors;\n let i = 0;\n while (i < issue.path.length) {\n const el = issue.path[i];\n const terminal = i === issue.path.length - 1;\n if (!terminal) {\n curr[el] = curr[el] || { _errors: [] };\n // if (typeof el === \"string\") {\n // curr[el] = curr[el] || { _errors: [] };\n // } else if (typeof el === \"number\") {\n // const errorArray: any = [];\n // errorArray._errors = [];\n // curr[el] = curr[el] || errorArray;\n // }\n }\n else {\n curr[el] = curr[el] || { _errors: [] };\n curr[el]._errors.push(mapper(issue));\n }\n curr = curr[el];\n i++;\n }\n }\n }\n };\n processError(this);\n return fieldErrors;\n }\n static assert(value) {\n if (!(value instanceof ZodError)) {\n throw new Error(`Not a ZodError: ${value}`);\n }\n }\n toString() {\n return this.message;\n }\n get message() {\n return JSON.stringify(this.issues, util.jsonStringifyReplacer, 2);\n }\n get isEmpty() {\n return this.issues.length === 0;\n }\n flatten(mapper = (issue) => issue.message) {\n const fieldErrors = {};\n const formErrors = [];\n for (const sub of this.issues) {\n if (sub.path.length > 0) {\n fieldErrors[sub.path[0]] = fieldErrors[sub.path[0]] || [];\n fieldErrors[sub.path[0]].push(mapper(sub));\n }\n else {\n formErrors.push(mapper(sub));\n }\n }\n return { formErrors, fieldErrors };\n }\n get formErrors() {\n return this.flatten();\n }\n}\nZodError.create = (issues) => {\n const error = new ZodError(issues);\n return error;\n};\n\nconst errorMap = (issue, _ctx) => {\n let message;\n switch (issue.code) {\n case ZodIssueCode.invalid_type:\n if (issue.received === ZodParsedType.undefined) {\n message = \"Required\";\n }\n else {\n message = `Expected ${issue.expected}, received ${issue.received}`;\n }\n break;\n case ZodIssueCode.invalid_literal:\n message = `Invalid literal value, expected ${JSON.stringify(issue.expected, util.jsonStringifyReplacer)}`;\n break;\n case ZodIssueCode.unrecognized_keys:\n message = `Unrecognized key(s) in object: ${util.joinValues(issue.keys, \", \")}`;\n break;\n case ZodIssueCode.invalid_union:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_union_discriminator:\n message = `Invalid discriminator value. Expected ${util.joinValues(issue.options)}`;\n break;\n case ZodIssueCode.invalid_enum_value:\n message = `Invalid enum value. Expected ${util.joinValues(issue.options)}, received '${issue.received}'`;\n break;\n case ZodIssueCode.invalid_arguments:\n message = `Invalid function arguments`;\n break;\n case ZodIssueCode.invalid_return_type:\n message = `Invalid function return type`;\n break;\n case ZodIssueCode.invalid_date:\n message = `Invalid date`;\n break;\n case ZodIssueCode.invalid_string:\n if (typeof issue.validation === \"object\") {\n if (\"includes\" in issue.validation) {\n message = `Invalid input: must include \"${issue.validation.includes}\"`;\n if (typeof issue.validation.position === \"number\") {\n message = `${message} at one or more positions greater than or equal to ${issue.validation.position}`;\n }\n }\n else if (\"startsWith\" in issue.validation) {\n message = `Invalid input: must start with \"${issue.validation.startsWith}\"`;\n }\n else if (\"endsWith\" in issue.validation) {\n message = `Invalid input: must end with \"${issue.validation.endsWith}\"`;\n }\n else {\n util.assertNever(issue.validation);\n }\n }\n else if (issue.validation !== \"regex\") {\n message = `Invalid ${issue.validation}`;\n }\n else {\n message = \"Invalid\";\n }\n break;\n case ZodIssueCode.too_small:\n if (issue.type === \"array\")\n message = `Array must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `more than`} ${issue.minimum} element(s)`;\n else if (issue.type === \"string\")\n message = `String must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `over`} ${issue.minimum} character(s)`;\n else if (issue.type === \"number\")\n message = `Number must be ${issue.exact\n ? `exactly equal to `\n : issue.inclusive\n ? `greater than or equal to `\n : `greater than `}${issue.minimum}`;\n else if (issue.type === \"date\")\n message = `Date must be ${issue.exact\n ? `exactly equal to `\n : issue.inclusive\n ? `greater than or equal to `\n : `greater than `}${new Date(Number(issue.minimum))}`;\n else\n message = \"Invalid input\";\n break;\n case ZodIssueCode.too_big:\n if (issue.type === \"array\")\n message = `Array must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `less than`} ${issue.maximum} element(s)`;\n else if (issue.type === \"string\")\n message = `String must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `under`} ${issue.maximum} character(s)`;\n else if (issue.type === \"number\")\n message = `Number must be ${issue.exact\n ? `exactly`\n : issue.inclusive\n ? `less than or equal to`\n : `less than`} ${issue.maximum}`;\n else if (issue.type === \"bigint\")\n message = `BigInt must be ${issue.exact\n ? `exactly`\n : issue.inclusive\n ? `less than or equal to`\n : `less than`} ${issue.maximum}`;\n else if (issue.type === \"date\")\n message = `Date must be ${issue.exact\n ? `exactly`\n : issue.inclusive\n ? `smaller than or equal to`\n : `smaller than`} ${new Date(Number(issue.maximum))}`;\n else\n message = \"Invalid input\";\n break;\n case ZodIssueCode.custom:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_intersection_types:\n message = `Intersection results could not be merged`;\n break;\n case ZodIssueCode.not_multiple_of:\n message = `Number must be a multiple of ${issue.multipleOf}`;\n break;\n case ZodIssueCode.not_finite:\n message = \"Number must be finite\";\n break;\n default:\n message = _ctx.defaultError;\n util.assertNever(issue);\n }\n return { message };\n};\n\nlet overrideErrorMap = errorMap;\nfunction setErrorMap(map) {\n overrideErrorMap = map;\n}\nfunction getErrorMap() {\n return overrideErrorMap;\n}\n\nconst makeIssue = (params) => {\n const { data, path, errorMaps, issueData } = params;\n const fullPath = [...path, ...(issueData.path || [])];\n const fullIssue = {\n ...issueData,\n path: fullPath,\n };\n if (issueData.message !== undefined) {\n return {\n ...issueData,\n path: fullPath,\n message: issueData.message,\n };\n }\n let errorMessage = \"\";\n const maps = errorMaps\n .filter((m) => !!m)\n .slice()\n .reverse();\n for (const map of maps) {\n errorMessage = map(fullIssue, { data, defaultError: errorMessage }).message;\n }\n return {\n ...issueData,\n path: fullPath,\n message: errorMessage,\n };\n};\nconst EMPTY_PATH = [];\nfunction addIssueToContext(ctx, issueData) {\n const overrideMap = getErrorMap();\n const issue = makeIssue({\n issueData: issueData,\n data: ctx.data,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap, // contextual error map is first priority\n ctx.schemaErrorMap, // then schema-bound map if available\n overrideMap, // then global override map\n overrideMap === errorMap ? undefined : errorMap, // then global default map\n ].filter((x) => !!x),\n });\n ctx.common.issues.push(issue);\n}\nclass ParseStatus {\n constructor() {\n this.value = \"valid\";\n }\n dirty() {\n if (this.value === \"valid\")\n this.value = \"dirty\";\n }\n abort() {\n if (this.value !== \"aborted\")\n this.value = \"aborted\";\n }\n static mergeArray(status, results) {\n const arrayValue = [];\n for (const s of results) {\n if (s.status === \"aborted\")\n return INVALID;\n if (s.status === \"dirty\")\n status.dirty();\n arrayValue.push(s.value);\n }\n return { status: status.value, value: arrayValue };\n }\n static async mergeObjectAsync(status, pairs) {\n const syncPairs = [];\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n syncPairs.push({\n key,\n value,\n });\n }\n return ParseStatus.mergeObjectSync(status, syncPairs);\n }\n static mergeObjectSync(status, pairs) {\n const finalObject = {};\n for (const pair of pairs) {\n const { key, value } = pair;\n if (key.status === \"aborted\")\n return INVALID;\n if (value.status === \"aborted\")\n return INVALID;\n if (key.status === \"dirty\")\n status.dirty();\n if (value.status === \"dirty\")\n status.dirty();\n if (key.value !== \"__proto__\" &&\n (typeof value.value !== \"undefined\" || pair.alwaysSet)) {\n finalObject[key.value] = value.value;\n }\n }\n return { status: status.value, value: finalObject };\n }\n}\nconst INVALID = Object.freeze({\n status: \"aborted\",\n});\nconst DIRTY = (value) => ({ status: \"dirty\", value });\nconst OK = (value) => ({ status: \"valid\", value });\nconst isAborted = (x) => x.status === \"aborted\";\nconst isDirty = (x) => x.status === \"dirty\";\nconst isValid = (x) => x.status === \"valid\";\nconst isAsync = (x) => typeof Promise !== \"undefined\" && x instanceof Promise;\n\n/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n\r\nfunction __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nfunction __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\ntypeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\n\nvar errorUtil;\n(function (errorUtil) {\n errorUtil.errToObj = (message) => typeof message === \"string\" ? { message } : message || {};\n errorUtil.toString = (message) => typeof message === \"string\" ? message : message === null || message === void 0 ? void 0 : message.message;\n})(errorUtil || (errorUtil = {}));\n\nvar _ZodEnum_cache, _ZodNativeEnum_cache;\nclass ParseInputLazyPath {\n constructor(parent, value, path, key) {\n this._cachedPath = [];\n this.parent = parent;\n this.data = value;\n this._path = path;\n this._key = key;\n }\n get path() {\n if (!this._cachedPath.length) {\n if (this._key instanceof Array) {\n this._cachedPath.push(...this._path, ...this._key);\n }\n else {\n this._cachedPath.push(...this._path, this._key);\n }\n }\n return this._cachedPath;\n }\n}\nconst handleResult = (ctx, result) => {\n if (isValid(result)) {\n return { success: true, data: result.value };\n }\n else {\n if (!ctx.common.issues.length) {\n throw new Error(\"Validation failed but no issues detected.\");\n }\n return {\n success: false,\n get error() {\n if (this._error)\n return this._error;\n const error = new ZodError(ctx.common.issues);\n this._error = error;\n return this._error;\n },\n };\n }\n};\nfunction processCreateParams(params) {\n if (!params)\n return {};\n const { errorMap, invalid_type_error, required_error, description } = params;\n if (errorMap && (invalid_type_error || required_error)) {\n throw new Error(`Can't use \"invalid_type_error\" or \"required_error\" in conjunction with custom error map.`);\n }\n if (errorMap)\n return { errorMap: errorMap, description };\n const customMap = (iss, ctx) => {\n var _a, _b;\n const { message } = params;\n if (iss.code === \"invalid_enum_value\") {\n return { message: message !== null && message !== void 0 ? message : ctx.defaultError };\n }\n if (typeof ctx.data === \"undefined\") {\n return { message: (_a = message !== null && message !== void 0 ? message : required_error) !== null && _a !== void 0 ? _a : ctx.defaultError };\n }\n if (iss.code !== \"invalid_type\")\n return { message: ctx.defaultError };\n return { message: (_b = message !== null && message !== void 0 ? message : invalid_type_error) !== null && _b !== void 0 ? _b : ctx.defaultError };\n };\n return { errorMap: customMap, description };\n}\nclass ZodType {\n get description() {\n return this._def.description;\n }\n _getType(input) {\n return getParsedType(input.data);\n }\n _getOrReturnCtx(input, ctx) {\n return (ctx || {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent,\n });\n }\n _processInputParams(input) {\n return {\n status: new ParseStatus(),\n ctx: {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent,\n },\n };\n }\n _parseSync(input) {\n const result = this._parse(input);\n if (isAsync(result)) {\n throw new Error(\"Synchronous parse encountered promise.\");\n }\n return result;\n }\n _parseAsync(input) {\n const result = this._parse(input);\n return Promise.resolve(result);\n }\n parse(data, params) {\n const result = this.safeParse(data, params);\n if (result.success)\n return result.data;\n throw result.error;\n }\n safeParse(data, params) {\n var _a;\n const ctx = {\n common: {\n issues: [],\n async: (_a = params === null || params === void 0 ? void 0 : params.async) !== null && _a !== void 0 ? _a : false,\n contextualErrorMap: params === null || params === void 0 ? void 0 : params.errorMap,\n },\n path: (params === null || params === void 0 ? void 0 : params.path) || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n const result = this._parseSync({ data, path: ctx.path, parent: ctx });\n return handleResult(ctx, result);\n }\n \"~validate\"(data) {\n var _a, _b;\n const ctx = {\n common: {\n issues: [],\n async: !!this[\"~standard\"].async,\n },\n path: [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n if (!this[\"~standard\"].async) {\n try {\n const result = this._parseSync({ data, path: [], parent: ctx });\n return isValid(result)\n ? {\n value: result.value,\n }\n : {\n issues: ctx.common.issues,\n };\n }\n catch (err) {\n if ((_b = (_a = err === null || err === void 0 ? void 0 : err.message) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === null || _b === void 0 ? void 0 : _b.includes(\"encountered\")) {\n this[\"~standard\"].async = true;\n }\n ctx.common = {\n issues: [],\n async: true,\n };\n }\n }\n return this._parseAsync({ data, path: [], parent: ctx }).then((result) => isValid(result)\n ? {\n value: result.value,\n }\n : {\n issues: ctx.common.issues,\n });\n }\n async parseAsync(data, params) {\n const result = await this.safeParseAsync(data, params);\n if (result.success)\n return result.data;\n throw result.error;\n }\n async safeParseAsync(data, params) {\n const ctx = {\n common: {\n issues: [],\n contextualErrorMap: params === null || params === void 0 ? void 0 : params.errorMap,\n async: true,\n },\n path: (params === null || params === void 0 ? void 0 : params.path) || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n const maybeAsyncResult = this._parse({ data, path: ctx.path, parent: ctx });\n const result = await (isAsync(maybeAsyncResult)\n ? maybeAsyncResult\n : Promise.resolve(maybeAsyncResult));\n return handleResult(ctx, result);\n }\n refine(check, message) {\n const getIssueProperties = (val) => {\n if (typeof message === \"string\" || typeof message === \"undefined\") {\n return { message };\n }\n else if (typeof message === \"function\") {\n return message(val);\n }\n else {\n return message;\n }\n };\n return this._refinement((val, ctx) => {\n const result = check(val);\n const setError = () => ctx.addIssue({\n code: ZodIssueCode.custom,\n ...getIssueProperties(val),\n });\n if (typeof Promise !== \"undefined\" && result instanceof Promise) {\n return result.then((data) => {\n if (!data) {\n setError();\n return false;\n }\n else {\n return true;\n }\n });\n }\n if (!result) {\n setError();\n return false;\n }\n else {\n return true;\n }\n });\n }\n refinement(check, refinementData) {\n return this._refinement((val, ctx) => {\n if (!check(val)) {\n ctx.addIssue(typeof refinementData === \"function\"\n ? refinementData(val, ctx)\n : refinementData);\n return false;\n }\n else {\n return true;\n }\n });\n }\n _refinement(refinement) {\n return new ZodEffects({\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: { type: \"refinement\", refinement },\n });\n }\n superRefine(refinement) {\n return this._refinement(refinement);\n }\n constructor(def) {\n /** Alias of safeParseAsync */\n this.spa = this.safeParseAsync;\n this._def = def;\n this.parse = this.parse.bind(this);\n this.safeParse = this.safeParse.bind(this);\n this.parseAsync = this.parseAsync.bind(this);\n this.safeParseAsync = this.safeParseAsync.bind(this);\n this.spa = this.spa.bind(this);\n this.refine = this.refine.bind(this);\n this.refinement = this.refinement.bind(this);\n this.superRefine = this.superRefine.bind(this);\n this.optional = this.optional.bind(this);\n this.nullable = this.nullable.bind(this);\n this.nullish = this.nullish.bind(this);\n this.array = this.array.bind(this);\n this.promise = this.promise.bind(this);\n this.or = this.or.bind(this);\n this.and = this.and.bind(this);\n this.transform = this.transform.bind(this);\n this.brand = this.brand.bind(this);\n this.default = this.default.bind(this);\n this.catch = this.catch.bind(this);\n this.describe = this.describe.bind(this);\n this.pipe = this.pipe.bind(this);\n this.readonly = this.readonly.bind(this);\n this.isNullable = this.isNullable.bind(this);\n this.isOptional = this.isOptional.bind(this);\n this[\"~standard\"] = {\n version: 1,\n vendor: \"zod\",\n validate: (data) => this[\"~validate\"](data),\n };\n }\n optional() {\n return ZodOptional.create(this, this._def);\n }\n nullable() {\n return ZodNullable.create(this, this._def);\n }\n nullish() {\n return this.nullable().optional();\n }\n array() {\n return ZodArray.create(this);\n }\n promise() {\n return ZodPromise.create(this, this._def);\n }\n or(option) {\n return ZodUnion.create([this, option], this._def);\n }\n and(incoming) {\n return ZodIntersection.create(this, incoming, this._def);\n }\n transform(transform) {\n return new ZodEffects({\n ...processCreateParams(this._def),\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: { type: \"transform\", transform },\n });\n }\n default(def) {\n const defaultValueFunc = typeof def === \"function\" ? def : () => def;\n return new ZodDefault({\n ...processCreateParams(this._def),\n innerType: this,\n defaultValue: defaultValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodDefault,\n });\n }\n brand() {\n return new ZodBranded({\n typeName: ZodFirstPartyTypeKind.ZodBranded,\n type: this,\n ...processCreateParams(this._def),\n });\n }\n catch(def) {\n const catchValueFunc = typeof def === \"function\" ? def : () => def;\n return new ZodCatch({\n ...processCreateParams(this._def),\n innerType: this,\n catchValue: catchValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodCatch,\n });\n }\n describe(description) {\n const This = this.constructor;\n return new This({\n ...this._def,\n description,\n });\n }\n pipe(target) {\n return ZodPipeline.create(this, target);\n }\n readonly() {\n return ZodReadonly.create(this);\n }\n isOptional() {\n return this.safeParse(undefined).success;\n }\n isNullable() {\n return this.safeParse(null).success;\n }\n}\nconst cuidRegex = /^c[^\\s-]{8,}$/i;\nconst cuid2Regex = /^[0-9a-z]+$/;\nconst ulidRegex = /^[0-9A-HJKMNP-TV-Z]{26}$/i;\n// const uuidRegex =\n// /^([a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[a-f0-9]{4}-[a-f0-9]{12}|00000000-0000-0000-0000-000000000000)$/i;\nconst uuidRegex = /^[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$/i;\nconst nanoidRegex = /^[a-z0-9_-]{21}$/i;\nconst jwtRegex = /^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]*$/;\nconst durationRegex = /^[-+]?P(?!$)(?:(?:[-+]?\\d+Y)|(?:[-+]?\\d+[.,]\\d+Y$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:(?:[-+]?\\d+W)|(?:[-+]?\\d+[.,]\\d+W$))?(?:(?:[-+]?\\d+D)|(?:[-+]?\\d+[.,]\\d+D$))?(?:T(?=[\\d+-])(?:(?:[-+]?\\d+H)|(?:[-+]?\\d+[.,]\\d+H$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:[-+]?\\d+(?:[.,]\\d+)?S)?)??$/;\n// from https://stackoverflow.com/a/46181/1550155\n// old version: too slow, didn't support unicode\n// const emailRegex = /^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/i;\n//old email regex\n// const emailRegex = /^(([^<>()[\\].,;:\\s@\"]+(\\.[^<>()[\\].,;:\\s@\"]+)*)|(\".+\"))@((?!-)([^<>()[\\].,;:\\s@\"]+\\.)+[^<>()[\\].,;:\\s@\"]{1,})[^-<>()[\\].,;:\\s@\"]$/i;\n// eslint-disable-next-line\n// const emailRegex =\n// /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\])|(\\[IPv6:(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))\\])|([A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])*(\\.[A-Za-z]{2,})+))$/;\n// const emailRegex =\n// /^[a-zA-Z0-9\\.\\!\\#\\$\\%\\&\\'\\*\\+\\/\\=\\?\\^\\_\\`\\{\\|\\}\\~\\-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n// const emailRegex =\n// /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])$/i;\nconst emailRegex = /^(?!\\.)(?!.*\\.\\.)([A-Z0-9_'+\\-\\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\\-]*\\.)+[A-Z]{2,}$/i;\n// const emailRegex =\n// /^[a-z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-z0-9-]+(?:\\.[a-z0-9\\-]+)*$/i;\n// from https://thekevinscott.com/emojis-in-javascript/#writing-a-regular-expression\nconst _emojiRegex = `^(\\\\p{Extended_Pictographic}|\\\\p{Emoji_Component})+$`;\nlet emojiRegex;\n// faster, simpler, safer\nconst ipv4Regex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/;\nconst ipv4CidrRegex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/(3[0-2]|[12]?[0-9])$/;\n// const ipv6Regex =\n// /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/;\nconst ipv6Regex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/;\nconst ipv6CidrRegex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/;\n// https://stackoverflow.com/questions/7860392/determine-if-string-is-in-base64-using-javascript\nconst base64Regex = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/;\n// https://base64.guru/standards/base64url\nconst base64urlRegex = /^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/;\n// simple\n// const dateRegexSource = `\\\\d{4}-\\\\d{2}-\\\\d{2}`;\n// no leap year validation\n// const dateRegexSource = `\\\\d{4}-((0[13578]|10|12)-31|(0[13-9]|1[0-2])-30|(0[1-9]|1[0-2])-(0[1-9]|1\\\\d|2\\\\d))`;\n// with leap year validation\nconst dateRegexSource = `((\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\\\d|30)|(02)-(0[1-9]|1\\\\d|2[0-8])))`;\nconst dateRegex = new RegExp(`^${dateRegexSource}$`);\nfunction timeRegexSource(args) {\n // let regex = `\\\\d{2}:\\\\d{2}:\\\\d{2}`;\n let regex = `([01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d`;\n if (args.precision) {\n regex = `${regex}\\\\.\\\\d{${args.precision}}`;\n }\n else if (args.precision == null) {\n regex = `${regex}(\\\\.\\\\d+)?`;\n }\n return regex;\n}\nfunction timeRegex(args) {\n return new RegExp(`^${timeRegexSource(args)}$`);\n}\n// Adapted from https://stackoverflow.com/a/3143231\nfunction datetimeRegex(args) {\n let regex = `${dateRegexSource}T${timeRegexSource(args)}`;\n const opts = [];\n opts.push(args.local ? `Z?` : `Z`);\n if (args.offset)\n opts.push(`([+-]\\\\d{2}:?\\\\d{2})`);\n regex = `${regex}(${opts.join(\"|\")})`;\n return new RegExp(`^${regex}$`);\n}\nfunction isValidIP(ip, version) {\n if ((version === \"v4\" || !version) && ipv4Regex.test(ip)) {\n return true;\n }\n if ((version === \"v6\" || !version) && ipv6Regex.test(ip)) {\n return true;\n }\n return false;\n}\nfunction isValidJWT(jwt, alg) {\n if (!jwtRegex.test(jwt))\n return false;\n try {\n const [header] = jwt.split(\".\");\n // Convert base64url to base64\n const base64 = header\n .replace(/-/g, \"+\")\n .replace(/_/g, \"/\")\n .padEnd(header.length + ((4 - (header.length % 4)) % 4), \"=\");\n const decoded = JSON.parse(atob(base64));\n if (typeof decoded !== \"object\" || decoded === null)\n return false;\n if (!decoded.typ || !decoded.alg)\n return false;\n if (alg && decoded.alg !== alg)\n return false;\n return true;\n }\n catch (_a) {\n return false;\n }\n}\nfunction isValidCidr(ip, version) {\n if ((version === \"v4\" || !version) && ipv4CidrRegex.test(ip)) {\n return true;\n }\n if ((version === \"v6\" || !version) && ipv6CidrRegex.test(ip)) {\n return true;\n }\n return false;\n}\nclass ZodString extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = String(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.string) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.string,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n if (input.data.length < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n if (input.data.length > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"length\") {\n const tooBig = input.data.length > check.value;\n const tooSmall = input.data.length < check.value;\n if (tooBig || tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n if (tooBig) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n exact: true,\n message: check.message,\n });\n }\n else if (tooSmall) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n exact: true,\n message: check.message,\n });\n }\n status.dirty();\n }\n }\n else if (check.kind === \"email\") {\n if (!emailRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"email\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"emoji\") {\n if (!emojiRegex) {\n emojiRegex = new RegExp(_emojiRegex, \"u\");\n }\n if (!emojiRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"emoji\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"uuid\") {\n if (!uuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"uuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"nanoid\") {\n if (!nanoidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"nanoid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cuid\") {\n if (!cuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cuid2\") {\n if (!cuid2Regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid2\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"ulid\") {\n if (!ulidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"ulid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"url\") {\n try {\n new URL(input.data);\n }\n catch (_a) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"url\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"regex\") {\n check.regex.lastIndex = 0;\n const testResult = check.regex.test(input.data);\n if (!testResult) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"regex\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"trim\") {\n input.data = input.data.trim();\n }\n else if (check.kind === \"includes\") {\n if (!input.data.includes(check.value, check.position)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { includes: check.value, position: check.position },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"toLowerCase\") {\n input.data = input.data.toLowerCase();\n }\n else if (check.kind === \"toUpperCase\") {\n input.data = input.data.toUpperCase();\n }\n else if (check.kind === \"startsWith\") {\n if (!input.data.startsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { startsWith: check.value },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"endsWith\") {\n if (!input.data.endsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { endsWith: check.value },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"datetime\") {\n const regex = datetimeRegex(check);\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"datetime\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"date\") {\n const regex = dateRegex;\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"date\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"time\") {\n const regex = timeRegex(check);\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"time\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"duration\") {\n if (!durationRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"duration\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"ip\") {\n if (!isValidIP(input.data, check.version)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"ip\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"jwt\") {\n if (!isValidJWT(input.data, check.alg)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"jwt\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cidr\") {\n if (!isValidCidr(input.data, check.version)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cidr\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"base64\") {\n if (!base64Regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"base64\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"base64url\") {\n if (!base64urlRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"base64url\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n _regex(regex, validation, message) {\n return this.refinement((data) => regex.test(data), {\n validation,\n code: ZodIssueCode.invalid_string,\n ...errorUtil.errToObj(message),\n });\n }\n _addCheck(check) {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n email(message) {\n return this._addCheck({ kind: \"email\", ...errorUtil.errToObj(message) });\n }\n url(message) {\n return this._addCheck({ kind: \"url\", ...errorUtil.errToObj(message) });\n }\n emoji(message) {\n return this._addCheck({ kind: \"emoji\", ...errorUtil.errToObj(message) });\n }\n uuid(message) {\n return this._addCheck({ kind: \"uuid\", ...errorUtil.errToObj(message) });\n }\n nanoid(message) {\n return this._addCheck({ kind: \"nanoid\", ...errorUtil.errToObj(message) });\n }\n cuid(message) {\n return this._addCheck({ kind: \"cuid\", ...errorUtil.errToObj(message) });\n }\n cuid2(message) {\n return this._addCheck({ kind: \"cuid2\", ...errorUtil.errToObj(message) });\n }\n ulid(message) {\n return this._addCheck({ kind: \"ulid\", ...errorUtil.errToObj(message) });\n }\n base64(message) {\n return this._addCheck({ kind: \"base64\", ...errorUtil.errToObj(message) });\n }\n base64url(message) {\n // base64url encoding is a modification of base64 that can safely be used in URLs and filenames\n return this._addCheck({\n kind: \"base64url\",\n ...errorUtil.errToObj(message),\n });\n }\n jwt(options) {\n return this._addCheck({ kind: \"jwt\", ...errorUtil.errToObj(options) });\n }\n ip(options) {\n return this._addCheck({ kind: \"ip\", ...errorUtil.errToObj(options) });\n }\n cidr(options) {\n return this._addCheck({ kind: \"cidr\", ...errorUtil.errToObj(options) });\n }\n datetime(options) {\n var _a, _b;\n if (typeof options === \"string\") {\n return this._addCheck({\n kind: \"datetime\",\n precision: null,\n offset: false,\n local: false,\n message: options,\n });\n }\n return this._addCheck({\n kind: \"datetime\",\n precision: typeof (options === null || options === void 0 ? void 0 : options.precision) === \"undefined\" ? null : options === null || options === void 0 ? void 0 : options.precision,\n offset: (_a = options === null || options === void 0 ? void 0 : options.offset) !== null && _a !== void 0 ? _a : false,\n local: (_b = options === null || options === void 0 ? void 0 : options.local) !== null && _b !== void 0 ? _b : false,\n ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message),\n });\n }\n date(message) {\n return this._addCheck({ kind: \"date\", message });\n }\n time(options) {\n if (typeof options === \"string\") {\n return this._addCheck({\n kind: \"time\",\n precision: null,\n message: options,\n });\n }\n return this._addCheck({\n kind: \"time\",\n precision: typeof (options === null || options === void 0 ? void 0 : options.precision) === \"undefined\" ? null : options === null || options === void 0 ? void 0 : options.precision,\n ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message),\n });\n }\n duration(message) {\n return this._addCheck({ kind: \"duration\", ...errorUtil.errToObj(message) });\n }\n regex(regex, message) {\n return this._addCheck({\n kind: \"regex\",\n regex: regex,\n ...errorUtil.errToObj(message),\n });\n }\n includes(value, options) {\n return this._addCheck({\n kind: \"includes\",\n value: value,\n position: options === null || options === void 0 ? void 0 : options.position,\n ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message),\n });\n }\n startsWith(value, message) {\n return this._addCheck({\n kind: \"startsWith\",\n value: value,\n ...errorUtil.errToObj(message),\n });\n }\n endsWith(value, message) {\n return this._addCheck({\n kind: \"endsWith\",\n value: value,\n ...errorUtil.errToObj(message),\n });\n }\n min(minLength, message) {\n return this._addCheck({\n kind: \"min\",\n value: minLength,\n ...errorUtil.errToObj(message),\n });\n }\n max(maxLength, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxLength,\n ...errorUtil.errToObj(message),\n });\n }\n length(len, message) {\n return this._addCheck({\n kind: \"length\",\n value: len,\n ...errorUtil.errToObj(message),\n });\n }\n /**\n * Equivalent to `.min(1)`\n */\n nonempty(message) {\n return this.min(1, errorUtil.errToObj(message));\n }\n trim() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"trim\" }],\n });\n }\n toLowerCase() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"toLowerCase\" }],\n });\n }\n toUpperCase() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"toUpperCase\" }],\n });\n }\n get isDatetime() {\n return !!this._def.checks.find((ch) => ch.kind === \"datetime\");\n }\n get isDate() {\n return !!this._def.checks.find((ch) => ch.kind === \"date\");\n }\n get isTime() {\n return !!this._def.checks.find((ch) => ch.kind === \"time\");\n }\n get isDuration() {\n return !!this._def.checks.find((ch) => ch.kind === \"duration\");\n }\n get isEmail() {\n return !!this._def.checks.find((ch) => ch.kind === \"email\");\n }\n get isURL() {\n return !!this._def.checks.find((ch) => ch.kind === \"url\");\n }\n get isEmoji() {\n return !!this._def.checks.find((ch) => ch.kind === \"emoji\");\n }\n get isUUID() {\n return !!this._def.checks.find((ch) => ch.kind === \"uuid\");\n }\n get isNANOID() {\n return !!this._def.checks.find((ch) => ch.kind === \"nanoid\");\n }\n get isCUID() {\n return !!this._def.checks.find((ch) => ch.kind === \"cuid\");\n }\n get isCUID2() {\n return !!this._def.checks.find((ch) => ch.kind === \"cuid2\");\n }\n get isULID() {\n return !!this._def.checks.find((ch) => ch.kind === \"ulid\");\n }\n get isIP() {\n return !!this._def.checks.find((ch) => ch.kind === \"ip\");\n }\n get isCIDR() {\n return !!this._def.checks.find((ch) => ch.kind === \"cidr\");\n }\n get isBase64() {\n return !!this._def.checks.find((ch) => ch.kind === \"base64\");\n }\n get isBase64url() {\n // base64url encoding is a modification of base64 that can safely be used in URLs and filenames\n return !!this._def.checks.find((ch) => ch.kind === \"base64url\");\n }\n get minLength() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxLength() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n}\nZodString.create = (params) => {\n var _a;\n return new ZodString({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodString,\n coerce: (_a = params === null || params === void 0 ? void 0 : params.coerce) !== null && _a !== void 0 ? _a : false,\n ...processCreateParams(params),\n });\n};\n// https://stackoverflow.com/questions/3966484/why-does-modulus-operator-return-fractional-number-in-javascript/31711034#31711034\nfunction floatSafeRemainder(val, step) {\n const valDecCount = (val.toString().split(\".\")[1] || \"\").length;\n const stepDecCount = (step.toString().split(\".\")[1] || \"\").length;\n const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount;\n const valInt = parseInt(val.toFixed(decCount).replace(\".\", \"\"));\n const stepInt = parseInt(step.toFixed(decCount).replace(\".\", \"\"));\n return (valInt % stepInt) / Math.pow(10, decCount);\n}\nclass ZodNumber extends ZodType {\n constructor() {\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n this.step = this.multipleOf;\n }\n _parse(input) {\n if (this._def.coerce) {\n input.data = Number(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.number) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.number,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks) {\n if (check.kind === \"int\") {\n if (!util.isInteger(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: \"integer\",\n received: \"float\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"min\") {\n const tooSmall = check.inclusive\n ? input.data < check.value\n : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n const tooBig = check.inclusive\n ? input.data > check.value\n : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"multipleOf\") {\n if (floatSafeRemainder(input.data, check.value) !== 0) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"finite\") {\n if (!Number.isFinite(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_finite,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodNumber({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message),\n },\n ],\n });\n }\n _addCheck(check) {\n return new ZodNumber({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n int(message) {\n return this._addCheck({\n kind: \"int\",\n message: errorUtil.toString(message),\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value: value,\n message: errorUtil.toString(message),\n });\n }\n finite(message) {\n return this._addCheck({\n kind: \"finite\",\n message: errorUtil.toString(message),\n });\n }\n safe(message) {\n return this._addCheck({\n kind: \"min\",\n inclusive: true,\n value: Number.MIN_SAFE_INTEGER,\n message: errorUtil.toString(message),\n })._addCheck({\n kind: \"max\",\n inclusive: true,\n value: Number.MAX_SAFE_INTEGER,\n message: errorUtil.toString(message),\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n get isInt() {\n return !!this._def.checks.find((ch) => ch.kind === \"int\" ||\n (ch.kind === \"multipleOf\" && util.isInteger(ch.value)));\n }\n get isFinite() {\n let max = null, min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"finite\" ||\n ch.kind === \"int\" ||\n ch.kind === \"multipleOf\") {\n return true;\n }\n else if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n else if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return Number.isFinite(min) && Number.isFinite(max);\n }\n}\nZodNumber.create = (params) => {\n return new ZodNumber({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodNumber,\n coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false,\n ...processCreateParams(params),\n });\n};\nclass ZodBigInt extends ZodType {\n constructor() {\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n }\n _parse(input) {\n if (this._def.coerce) {\n try {\n input.data = BigInt(input.data);\n }\n catch (_a) {\n return this._getInvalidInput(input);\n }\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.bigint) {\n return this._getInvalidInput(input);\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n const tooSmall = check.inclusive\n ? input.data < check.value\n : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n type: \"bigint\",\n minimum: check.value,\n inclusive: check.inclusive,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n const tooBig = check.inclusive\n ? input.data > check.value\n : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n type: \"bigint\",\n maximum: check.value,\n inclusive: check.inclusive,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"multipleOf\") {\n if (input.data % check.value !== BigInt(0)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n _getInvalidInput(input) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.bigint,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodBigInt({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message),\n },\n ],\n });\n }\n _addCheck(check) {\n return new ZodBigInt({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value,\n message: errorUtil.toString(message),\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n}\nZodBigInt.create = (params) => {\n var _a;\n return new ZodBigInt({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodBigInt,\n coerce: (_a = params === null || params === void 0 ? void 0 : params.coerce) !== null && _a !== void 0 ? _a : false,\n ...processCreateParams(params),\n });\n};\nclass ZodBoolean extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = Boolean(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.boolean) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.boolean,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodBoolean.create = (params) => {\n return new ZodBoolean({\n typeName: ZodFirstPartyTypeKind.ZodBoolean,\n coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false,\n ...processCreateParams(params),\n });\n};\nclass ZodDate extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = new Date(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.date) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.date,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (isNaN(input.data.getTime())) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_date,\n });\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n if (input.data.getTime() < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n message: check.message,\n inclusive: true,\n exact: false,\n minimum: check.value,\n type: \"date\",\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n if (input.data.getTime() > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n message: check.message,\n inclusive: true,\n exact: false,\n maximum: check.value,\n type: \"date\",\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return {\n status: status.value,\n value: new Date(input.data.getTime()),\n };\n }\n _addCheck(check) {\n return new ZodDate({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n min(minDate, message) {\n return this._addCheck({\n kind: \"min\",\n value: minDate.getTime(),\n message: errorUtil.toString(message),\n });\n }\n max(maxDate, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxDate.getTime(),\n message: errorUtil.toString(message),\n });\n }\n get minDate() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min != null ? new Date(min) : null;\n }\n get maxDate() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max != null ? new Date(max) : null;\n }\n}\nZodDate.create = (params) => {\n return new ZodDate({\n checks: [],\n coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false,\n typeName: ZodFirstPartyTypeKind.ZodDate,\n ...processCreateParams(params),\n });\n};\nclass ZodSymbol extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.symbol) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.symbol,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodSymbol.create = (params) => {\n return new ZodSymbol({\n typeName: ZodFirstPartyTypeKind.ZodSymbol,\n ...processCreateParams(params),\n });\n};\nclass ZodUndefined extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.undefined,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodUndefined.create = (params) => {\n return new ZodUndefined({\n typeName: ZodFirstPartyTypeKind.ZodUndefined,\n ...processCreateParams(params),\n });\n};\nclass ZodNull extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.null) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.null,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodNull.create = (params) => {\n return new ZodNull({\n typeName: ZodFirstPartyTypeKind.ZodNull,\n ...processCreateParams(params),\n });\n};\nclass ZodAny extends ZodType {\n constructor() {\n super(...arguments);\n // to prevent instances of other classes from extending ZodAny. this causes issues with catchall in ZodObject.\n this._any = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodAny.create = (params) => {\n return new ZodAny({\n typeName: ZodFirstPartyTypeKind.ZodAny,\n ...processCreateParams(params),\n });\n};\nclass ZodUnknown extends ZodType {\n constructor() {\n super(...arguments);\n // required\n this._unknown = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodUnknown.create = (params) => {\n return new ZodUnknown({\n typeName: ZodFirstPartyTypeKind.ZodUnknown,\n ...processCreateParams(params),\n });\n};\nclass ZodNever extends ZodType {\n _parse(input) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.never,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n}\nZodNever.create = (params) => {\n return new ZodNever({\n typeName: ZodFirstPartyTypeKind.ZodNever,\n ...processCreateParams(params),\n });\n};\nclass ZodVoid extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.void,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodVoid.create = (params) => {\n return new ZodVoid({\n typeName: ZodFirstPartyTypeKind.ZodVoid,\n ...processCreateParams(params),\n });\n};\nclass ZodArray extends ZodType {\n _parse(input) {\n const { ctx, status } = this._processInputParams(input);\n const def = this._def;\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (def.exactLength !== null) {\n const tooBig = ctx.data.length > def.exactLength.value;\n const tooSmall = ctx.data.length < def.exactLength.value;\n if (tooBig || tooSmall) {\n addIssueToContext(ctx, {\n code: tooBig ? ZodIssueCode.too_big : ZodIssueCode.too_small,\n minimum: (tooSmall ? def.exactLength.value : undefined),\n maximum: (tooBig ? def.exactLength.value : undefined),\n type: \"array\",\n inclusive: true,\n exact: true,\n message: def.exactLength.message,\n });\n status.dirty();\n }\n }\n if (def.minLength !== null) {\n if (ctx.data.length < def.minLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minLength.value,\n type: \"array\",\n inclusive: true,\n exact: false,\n message: def.minLength.message,\n });\n status.dirty();\n }\n }\n if (def.maxLength !== null) {\n if (ctx.data.length > def.maxLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxLength.value,\n type: \"array\",\n inclusive: true,\n exact: false,\n message: def.maxLength.message,\n });\n status.dirty();\n }\n }\n if (ctx.common.async) {\n return Promise.all([...ctx.data].map((item, i) => {\n return def.type._parseAsync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n })).then((result) => {\n return ParseStatus.mergeArray(status, result);\n });\n }\n const result = [...ctx.data].map((item, i) => {\n return def.type._parseSync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n });\n return ParseStatus.mergeArray(status, result);\n }\n get element() {\n return this._def.type;\n }\n min(minLength, message) {\n return new ZodArray({\n ...this._def,\n minLength: { value: minLength, message: errorUtil.toString(message) },\n });\n }\n max(maxLength, message) {\n return new ZodArray({\n ...this._def,\n maxLength: { value: maxLength, message: errorUtil.toString(message) },\n });\n }\n length(len, message) {\n return new ZodArray({\n ...this._def,\n exactLength: { value: len, message: errorUtil.toString(message) },\n });\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodArray.create = (schema, params) => {\n return new ZodArray({\n type: schema,\n minLength: null,\n maxLength: null,\n exactLength: null,\n typeName: ZodFirstPartyTypeKind.ZodArray,\n ...processCreateParams(params),\n });\n};\nfunction deepPartialify(schema) {\n if (schema instanceof ZodObject) {\n const newShape = {};\n for (const key in schema.shape) {\n const fieldSchema = schema.shape[key];\n newShape[key] = ZodOptional.create(deepPartialify(fieldSchema));\n }\n return new ZodObject({\n ...schema._def,\n shape: () => newShape,\n });\n }\n else if (schema instanceof ZodArray) {\n return new ZodArray({\n ...schema._def,\n type: deepPartialify(schema.element),\n });\n }\n else if (schema instanceof ZodOptional) {\n return ZodOptional.create(deepPartialify(schema.unwrap()));\n }\n else if (schema instanceof ZodNullable) {\n return ZodNullable.create(deepPartialify(schema.unwrap()));\n }\n else if (schema instanceof ZodTuple) {\n return ZodTuple.create(schema.items.map((item) => deepPartialify(item)));\n }\n else {\n return schema;\n }\n}\nclass ZodObject extends ZodType {\n constructor() {\n super(...arguments);\n this._cached = null;\n /**\n * @deprecated In most cases, this is no longer needed - unknown properties are now silently stripped.\n * If you want to pass through unknown properties, use `.passthrough()` instead.\n */\n this.nonstrict = this.passthrough;\n // extend<\n // Augmentation extends ZodRawShape,\n // NewOutput extends util.flatten<{\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // }>,\n // NewInput extends util.flatten<{\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }>\n // >(\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape,\n // UnknownKeys,\n // Catchall,\n // NewOutput,\n // NewInput\n // > {\n // return new ZodObject({\n // ...this._def,\n // shape: () => ({\n // ...this._def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // }\n /**\n * @deprecated Use `.extend` instead\n * */\n this.augment = this.extend;\n }\n _getCached() {\n if (this._cached !== null)\n return this._cached;\n const shape = this._def.shape();\n const keys = util.objectKeys(shape);\n return (this._cached = { shape, keys });\n }\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.object) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const { status, ctx } = this._processInputParams(input);\n const { shape, keys: shapeKeys } = this._getCached();\n const extraKeys = [];\n if (!(this._def.catchall instanceof ZodNever &&\n this._def.unknownKeys === \"strip\")) {\n for (const key in ctx.data) {\n if (!shapeKeys.includes(key)) {\n extraKeys.push(key);\n }\n }\n }\n const pairs = [];\n for (const key of shapeKeys) {\n const keyValidator = shape[key];\n const value = ctx.data[key];\n pairs.push({\n key: { status: \"valid\", value: key },\n value: keyValidator._parse(new ParseInputLazyPath(ctx, value, ctx.path, key)),\n alwaysSet: key in ctx.data,\n });\n }\n if (this._def.catchall instanceof ZodNever) {\n const unknownKeys = this._def.unknownKeys;\n if (unknownKeys === \"passthrough\") {\n for (const key of extraKeys) {\n pairs.push({\n key: { status: \"valid\", value: key },\n value: { status: \"valid\", value: ctx.data[key] },\n });\n }\n }\n else if (unknownKeys === \"strict\") {\n if (extraKeys.length > 0) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.unrecognized_keys,\n keys: extraKeys,\n });\n status.dirty();\n }\n }\n else if (unknownKeys === \"strip\") ;\n else {\n throw new Error(`Internal ZodObject error: invalid unknownKeys value.`);\n }\n }\n else {\n // run catchall validation\n const catchall = this._def.catchall;\n for (const key of extraKeys) {\n const value = ctx.data[key];\n pairs.push({\n key: { status: \"valid\", value: key },\n value: catchall._parse(new ParseInputLazyPath(ctx, value, ctx.path, key) //, ctx.child(key), value, getParsedType(value)\n ),\n alwaysSet: key in ctx.data,\n });\n }\n }\n if (ctx.common.async) {\n return Promise.resolve()\n .then(async () => {\n const syncPairs = [];\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n syncPairs.push({\n key,\n value,\n alwaysSet: pair.alwaysSet,\n });\n }\n return syncPairs;\n })\n .then((syncPairs) => {\n return ParseStatus.mergeObjectSync(status, syncPairs);\n });\n }\n else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get shape() {\n return this._def.shape();\n }\n strict(message) {\n errorUtil.errToObj;\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strict\",\n ...(message !== undefined\n ? {\n errorMap: (issue, ctx) => {\n var _a, _b, _c, _d;\n const defaultError = (_c = (_b = (_a = this._def).errorMap) === null || _b === void 0 ? void 0 : _b.call(_a, issue, ctx).message) !== null && _c !== void 0 ? _c : ctx.defaultError;\n if (issue.code === \"unrecognized_keys\")\n return {\n message: (_d = errorUtil.errToObj(message).message) !== null && _d !== void 0 ? _d : defaultError,\n };\n return {\n message: defaultError,\n };\n },\n }\n : {}),\n });\n }\n strip() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strip\",\n });\n }\n passthrough() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"passthrough\",\n });\n }\n // const AugmentFactory =\n // (def: Def) =>\n // (\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape, Augmentation>,\n // Def[\"unknownKeys\"],\n // Def[\"catchall\"]\n // > => {\n // return new ZodObject({\n // ...def,\n // shape: () => ({\n // ...def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // };\n extend(augmentation) {\n return new ZodObject({\n ...this._def,\n shape: () => ({\n ...this._def.shape(),\n ...augmentation,\n }),\n });\n }\n /**\n * Prior to zod@1.0.12 there was a bug in the\n * inferred type of merged objects. Please\n * upgrade if you are experiencing issues.\n */\n merge(merging) {\n const merged = new ZodObject({\n unknownKeys: merging._def.unknownKeys,\n catchall: merging._def.catchall,\n shape: () => ({\n ...this._def.shape(),\n ...merging._def.shape(),\n }),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n });\n return merged;\n }\n // merge<\n // Incoming extends AnyZodObject,\n // Augmentation extends Incoming[\"shape\"],\n // NewOutput extends {\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // },\n // NewInput extends {\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }\n // >(\n // merging: Incoming\n // ): ZodObject<\n // extendShape>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"],\n // NewOutput,\n // NewInput\n // > {\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n setKey(key, schema) {\n return this.augment({ [key]: schema });\n }\n // merge(\n // merging: Incoming\n // ): //ZodObject = (merging) => {\n // ZodObject<\n // extendShape>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"]\n // > {\n // // const mergedShape = objectUtil.mergeShapes(\n // // this._def.shape(),\n // // merging._def.shape()\n // // );\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n catchall(index) {\n return new ZodObject({\n ...this._def,\n catchall: index,\n });\n }\n pick(mask) {\n const shape = {};\n util.objectKeys(mask).forEach((key) => {\n if (mask[key] && this.shape[key]) {\n shape[key] = this.shape[key];\n }\n });\n return new ZodObject({\n ...this._def,\n shape: () => shape,\n });\n }\n omit(mask) {\n const shape = {};\n util.objectKeys(this.shape).forEach((key) => {\n if (!mask[key]) {\n shape[key] = this.shape[key];\n }\n });\n return new ZodObject({\n ...this._def,\n shape: () => shape,\n });\n }\n /**\n * @deprecated\n */\n deepPartial() {\n return deepPartialify(this);\n }\n partial(mask) {\n const newShape = {};\n util.objectKeys(this.shape).forEach((key) => {\n const fieldSchema = this.shape[key];\n if (mask && !mask[key]) {\n newShape[key] = fieldSchema;\n }\n else {\n newShape[key] = fieldSchema.optional();\n }\n });\n return new ZodObject({\n ...this._def,\n shape: () => newShape,\n });\n }\n required(mask) {\n const newShape = {};\n util.objectKeys(this.shape).forEach((key) => {\n if (mask && !mask[key]) {\n newShape[key] = this.shape[key];\n }\n else {\n const fieldSchema = this.shape[key];\n let newField = fieldSchema;\n while (newField instanceof ZodOptional) {\n newField = newField._def.innerType;\n }\n newShape[key] = newField;\n }\n });\n return new ZodObject({\n ...this._def,\n shape: () => newShape,\n });\n }\n keyof() {\n return createZodEnum(util.objectKeys(this.shape));\n }\n}\nZodObject.create = (shape, params) => {\n return new ZodObject({\n shape: () => shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nZodObject.strictCreate = (shape, params) => {\n return new ZodObject({\n shape: () => shape,\n unknownKeys: \"strict\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nZodObject.lazycreate = (shape, params) => {\n return new ZodObject({\n shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nclass ZodUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const options = this._def.options;\n function handleResults(results) {\n // return first issue-free validation if it exists\n for (const result of results) {\n if (result.result.status === \"valid\") {\n return result.result;\n }\n }\n for (const result of results) {\n if (result.result.status === \"dirty\") {\n // add issues from dirty option\n ctx.common.issues.push(...result.ctx.common.issues);\n return result.result;\n }\n }\n // return invalid\n const unionErrors = results.map((result) => new ZodError(result.ctx.common.issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors,\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return Promise.all(options.map(async (option) => {\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n parent: null,\n };\n return {\n result: await option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx,\n }),\n ctx: childCtx,\n };\n })).then(handleResults);\n }\n else {\n let dirty = undefined;\n const issues = [];\n for (const option of options) {\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n parent: null,\n };\n const result = option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx,\n });\n if (result.status === \"valid\") {\n return result;\n }\n else if (result.status === \"dirty\" && !dirty) {\n dirty = { result, ctx: childCtx };\n }\n if (childCtx.common.issues.length) {\n issues.push(childCtx.common.issues);\n }\n }\n if (dirty) {\n ctx.common.issues.push(...dirty.ctx.common.issues);\n return dirty.result;\n }\n const unionErrors = issues.map((issues) => new ZodError(issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors,\n });\n return INVALID;\n }\n }\n get options() {\n return this._def.options;\n }\n}\nZodUnion.create = (types, params) => {\n return new ZodUnion({\n options: types,\n typeName: ZodFirstPartyTypeKind.ZodUnion,\n ...processCreateParams(params),\n });\n};\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\n////////// //////////\n////////// ZodDiscriminatedUnion //////////\n////////// //////////\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\nconst getDiscriminator = (type) => {\n if (type instanceof ZodLazy) {\n return getDiscriminator(type.schema);\n }\n else if (type instanceof ZodEffects) {\n return getDiscriminator(type.innerType());\n }\n else if (type instanceof ZodLiteral) {\n return [type.value];\n }\n else if (type instanceof ZodEnum) {\n return type.options;\n }\n else if (type instanceof ZodNativeEnum) {\n // eslint-disable-next-line ban/ban\n return util.objectValues(type.enum);\n }\n else if (type instanceof ZodDefault) {\n return getDiscriminator(type._def.innerType);\n }\n else if (type instanceof ZodUndefined) {\n return [undefined];\n }\n else if (type instanceof ZodNull) {\n return [null];\n }\n else if (type instanceof ZodOptional) {\n return [undefined, ...getDiscriminator(type.unwrap())];\n }\n else if (type instanceof ZodNullable) {\n return [null, ...getDiscriminator(type.unwrap())];\n }\n else if (type instanceof ZodBranded) {\n return getDiscriminator(type.unwrap());\n }\n else if (type instanceof ZodReadonly) {\n return getDiscriminator(type.unwrap());\n }\n else if (type instanceof ZodCatch) {\n return getDiscriminator(type._def.innerType);\n }\n else {\n return [];\n }\n};\nclass ZodDiscriminatedUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const discriminator = this.discriminator;\n const discriminatorValue = ctx.data[discriminator];\n const option = this.optionsMap.get(discriminatorValue);\n if (!option) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union_discriminator,\n options: Array.from(this.optionsMap.keys()),\n path: [discriminator],\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n }\n else {\n return option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n get discriminator() {\n return this._def.discriminator;\n }\n get options() {\n return this._def.options;\n }\n get optionsMap() {\n return this._def.optionsMap;\n }\n /**\n * The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor.\n * However, it only allows a union of objects, all of which need to share a discriminator property. This property must\n * have a different value for each object in the union.\n * @param discriminator the name of the discriminator property\n * @param types an array of object schemas\n * @param params\n */\n static create(discriminator, options, params) {\n // Get all the valid discriminator values\n const optionsMap = new Map();\n // try {\n for (const type of options) {\n const discriminatorValues = getDiscriminator(type.shape[discriminator]);\n if (!discriminatorValues.length) {\n throw new Error(`A discriminator value for key \\`${discriminator}\\` could not be extracted from all schema options`);\n }\n for (const value of discriminatorValues) {\n if (optionsMap.has(value)) {\n throw new Error(`Discriminator property ${String(discriminator)} has duplicate value ${String(value)}`);\n }\n optionsMap.set(value, type);\n }\n }\n return new ZodDiscriminatedUnion({\n typeName: ZodFirstPartyTypeKind.ZodDiscriminatedUnion,\n discriminator,\n options,\n optionsMap,\n ...processCreateParams(params),\n });\n }\n}\nfunction mergeValues(a, b) {\n const aType = getParsedType(a);\n const bType = getParsedType(b);\n if (a === b) {\n return { valid: true, data: a };\n }\n else if (aType === ZodParsedType.object && bType === ZodParsedType.object) {\n const bKeys = util.objectKeys(b);\n const sharedKeys = util\n .objectKeys(a)\n .filter((key) => bKeys.indexOf(key) !== -1);\n const newObj = { ...a, ...b };\n for (const key of sharedKeys) {\n const sharedValue = mergeValues(a[key], b[key]);\n if (!sharedValue.valid) {\n return { valid: false };\n }\n newObj[key] = sharedValue.data;\n }\n return { valid: true, data: newObj };\n }\n else if (aType === ZodParsedType.array && bType === ZodParsedType.array) {\n if (a.length !== b.length) {\n return { valid: false };\n }\n const newArray = [];\n for (let index = 0; index < a.length; index++) {\n const itemA = a[index];\n const itemB = b[index];\n const sharedValue = mergeValues(itemA, itemB);\n if (!sharedValue.valid) {\n return { valid: false };\n }\n newArray.push(sharedValue.data);\n }\n return { valid: true, data: newArray };\n }\n else if (aType === ZodParsedType.date &&\n bType === ZodParsedType.date &&\n +a === +b) {\n return { valid: true, data: a };\n }\n else {\n return { valid: false };\n }\n}\nclass ZodIntersection extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const handleParsed = (parsedLeft, parsedRight) => {\n if (isAborted(parsedLeft) || isAborted(parsedRight)) {\n return INVALID;\n }\n const merged = mergeValues(parsedLeft.value, parsedRight.value);\n if (!merged.valid) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_intersection_types,\n });\n return INVALID;\n }\n if (isDirty(parsedLeft) || isDirty(parsedRight)) {\n status.dirty();\n }\n return { status: status.value, value: merged.data };\n };\n if (ctx.common.async) {\n return Promise.all([\n this._def.left._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }),\n this._def.right._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }),\n ]).then(([left, right]) => handleParsed(left, right));\n }\n else {\n return handleParsed(this._def.left._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }), this._def.right._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }));\n }\n }\n}\nZodIntersection.create = (left, right, params) => {\n return new ZodIntersection({\n left: left,\n right: right,\n typeName: ZodFirstPartyTypeKind.ZodIntersection,\n ...processCreateParams(params),\n });\n};\nclass ZodTuple extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (ctx.data.length < this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: \"array\",\n });\n return INVALID;\n }\n const rest = this._def.rest;\n if (!rest && ctx.data.length > this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: \"array\",\n });\n status.dirty();\n }\n const items = [...ctx.data]\n .map((item, itemIndex) => {\n const schema = this._def.items[itemIndex] || this._def.rest;\n if (!schema)\n return null;\n return schema._parse(new ParseInputLazyPath(ctx, item, ctx.path, itemIndex));\n })\n .filter((x) => !!x); // filter nulls\n if (ctx.common.async) {\n return Promise.all(items).then((results) => {\n return ParseStatus.mergeArray(status, results);\n });\n }\n else {\n return ParseStatus.mergeArray(status, items);\n }\n }\n get items() {\n return this._def.items;\n }\n rest(rest) {\n return new ZodTuple({\n ...this._def,\n rest,\n });\n }\n}\nZodTuple.create = (schemas, params) => {\n if (!Array.isArray(schemas)) {\n throw new Error(\"You must pass an array of schemas to z.tuple([ ... ])\");\n }\n return new ZodTuple({\n items: schemas,\n typeName: ZodFirstPartyTypeKind.ZodTuple,\n rest: null,\n ...processCreateParams(params),\n });\n};\nclass ZodRecord extends ZodType {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const pairs = [];\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n for (const key in ctx.data) {\n pairs.push({\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, key)),\n value: valueType._parse(new ParseInputLazyPath(ctx, ctx.data[key], ctx.path, key)),\n alwaysSet: key in ctx.data,\n });\n }\n if (ctx.common.async) {\n return ParseStatus.mergeObjectAsync(status, pairs);\n }\n else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get element() {\n return this._def.valueType;\n }\n static create(first, second, third) {\n if (second instanceof ZodType) {\n return new ZodRecord({\n keyType: first,\n valueType: second,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(third),\n });\n }\n return new ZodRecord({\n keyType: ZodString.create(),\n valueType: first,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(second),\n });\n }\n}\nclass ZodMap extends ZodType {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.map) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.map,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n const pairs = [...ctx.data.entries()].map(([key, value], index) => {\n return {\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, [index, \"key\"])),\n value: valueType._parse(new ParseInputLazyPath(ctx, value, ctx.path, [index, \"value\"])),\n };\n });\n if (ctx.common.async) {\n const finalMap = new Map();\n return Promise.resolve().then(async () => {\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return { status: status.value, value: finalMap };\n });\n }\n else {\n const finalMap = new Map();\n for (const pair of pairs) {\n const key = pair.key;\n const value = pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return { status: status.value, value: finalMap };\n }\n }\n}\nZodMap.create = (keyType, valueType, params) => {\n return new ZodMap({\n valueType,\n keyType,\n typeName: ZodFirstPartyTypeKind.ZodMap,\n ...processCreateParams(params),\n });\n};\nclass ZodSet extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.set) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.set,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const def = this._def;\n if (def.minSize !== null) {\n if (ctx.data.size < def.minSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minSize.value,\n type: \"set\",\n inclusive: true,\n exact: false,\n message: def.minSize.message,\n });\n status.dirty();\n }\n }\n if (def.maxSize !== null) {\n if (ctx.data.size > def.maxSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxSize.value,\n type: \"set\",\n inclusive: true,\n exact: false,\n message: def.maxSize.message,\n });\n status.dirty();\n }\n }\n const valueType = this._def.valueType;\n function finalizeSet(elements) {\n const parsedSet = new Set();\n for (const element of elements) {\n if (element.status === \"aborted\")\n return INVALID;\n if (element.status === \"dirty\")\n status.dirty();\n parsedSet.add(element.value);\n }\n return { status: status.value, value: parsedSet };\n }\n const elements = [...ctx.data.values()].map((item, i) => valueType._parse(new ParseInputLazyPath(ctx, item, ctx.path, i)));\n if (ctx.common.async) {\n return Promise.all(elements).then((elements) => finalizeSet(elements));\n }\n else {\n return finalizeSet(elements);\n }\n }\n min(minSize, message) {\n return new ZodSet({\n ...this._def,\n minSize: { value: minSize, message: errorUtil.toString(message) },\n });\n }\n max(maxSize, message) {\n return new ZodSet({\n ...this._def,\n maxSize: { value: maxSize, message: errorUtil.toString(message) },\n });\n }\n size(size, message) {\n return this.min(size, message).max(size, message);\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodSet.create = (valueType, params) => {\n return new ZodSet({\n valueType,\n minSize: null,\n maxSize: null,\n typeName: ZodFirstPartyTypeKind.ZodSet,\n ...processCreateParams(params),\n });\n};\nclass ZodFunction extends ZodType {\n constructor() {\n super(...arguments);\n this.validate = this.implement;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.function) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.function,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n function makeArgsIssue(args, error) {\n return makeIssue({\n data: args,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap,\n ctx.schemaErrorMap,\n getErrorMap(),\n errorMap,\n ].filter((x) => !!x),\n issueData: {\n code: ZodIssueCode.invalid_arguments,\n argumentsError: error,\n },\n });\n }\n function makeReturnsIssue(returns, error) {\n return makeIssue({\n data: returns,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap,\n ctx.schemaErrorMap,\n getErrorMap(),\n errorMap,\n ].filter((x) => !!x),\n issueData: {\n code: ZodIssueCode.invalid_return_type,\n returnTypeError: error,\n },\n });\n }\n const params = { errorMap: ctx.common.contextualErrorMap };\n const fn = ctx.data;\n if (this._def.returns instanceof ZodPromise) {\n // Would love a way to avoid disabling this rule, but we need\n // an alias (using an arrow function was what caused 2651).\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const me = this;\n return OK(async function (...args) {\n const error = new ZodError([]);\n const parsedArgs = await me._def.args\n .parseAsync(args, params)\n .catch((e) => {\n error.addIssue(makeArgsIssue(args, e));\n throw error;\n });\n const result = await Reflect.apply(fn, this, parsedArgs);\n const parsedReturns = await me._def.returns._def.type\n .parseAsync(result, params)\n .catch((e) => {\n error.addIssue(makeReturnsIssue(result, e));\n throw error;\n });\n return parsedReturns;\n });\n }\n else {\n // Would love a way to avoid disabling this rule, but we need\n // an alias (using an arrow function was what caused 2651).\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const me = this;\n return OK(function (...args) {\n const parsedArgs = me._def.args.safeParse(args, params);\n if (!parsedArgs.success) {\n throw new ZodError([makeArgsIssue(args, parsedArgs.error)]);\n }\n const result = Reflect.apply(fn, this, parsedArgs.data);\n const parsedReturns = me._def.returns.safeParse(result, params);\n if (!parsedReturns.success) {\n throw new ZodError([makeReturnsIssue(result, parsedReturns.error)]);\n }\n return parsedReturns.data;\n });\n }\n }\n parameters() {\n return this._def.args;\n }\n returnType() {\n return this._def.returns;\n }\n args(...items) {\n return new ZodFunction({\n ...this._def,\n args: ZodTuple.create(items).rest(ZodUnknown.create()),\n });\n }\n returns(returnType) {\n return new ZodFunction({\n ...this._def,\n returns: returnType,\n });\n }\n implement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n strictImplement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n static create(args, returns, params) {\n return new ZodFunction({\n args: (args\n ? args\n : ZodTuple.create([]).rest(ZodUnknown.create())),\n returns: returns || ZodUnknown.create(),\n typeName: ZodFirstPartyTypeKind.ZodFunction,\n ...processCreateParams(params),\n });\n }\n}\nclass ZodLazy extends ZodType {\n get schema() {\n return this._def.getter();\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const lazySchema = this._def.getter();\n return lazySchema._parse({ data: ctx.data, path: ctx.path, parent: ctx });\n }\n}\nZodLazy.create = (getter, params) => {\n return new ZodLazy({\n getter: getter,\n typeName: ZodFirstPartyTypeKind.ZodLazy,\n ...processCreateParams(params),\n });\n};\nclass ZodLiteral extends ZodType {\n _parse(input) {\n if (input.data !== this._def.value) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_literal,\n expected: this._def.value,\n });\n return INVALID;\n }\n return { status: \"valid\", value: input.data };\n }\n get value() {\n return this._def.value;\n }\n}\nZodLiteral.create = (value, params) => {\n return new ZodLiteral({\n value: value,\n typeName: ZodFirstPartyTypeKind.ZodLiteral,\n ...processCreateParams(params),\n });\n};\nfunction createZodEnum(values, params) {\n return new ZodEnum({\n values,\n typeName: ZodFirstPartyTypeKind.ZodEnum,\n ...processCreateParams(params),\n });\n}\nclass ZodEnum extends ZodType {\n constructor() {\n super(...arguments);\n _ZodEnum_cache.set(this, void 0);\n }\n _parse(input) {\n if (typeof input.data !== \"string\") {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type,\n });\n return INVALID;\n }\n if (!__classPrivateFieldGet(this, _ZodEnum_cache, \"f\")) {\n __classPrivateFieldSet(this, _ZodEnum_cache, new Set(this._def.values), \"f\");\n }\n if (!__classPrivateFieldGet(this, _ZodEnum_cache, \"f\").has(input.data)) {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get options() {\n return this._def.values;\n }\n get enum() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Values() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Enum() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n extract(values, newDef = this._def) {\n return ZodEnum.create(values, {\n ...this._def,\n ...newDef,\n });\n }\n exclude(values, newDef = this._def) {\n return ZodEnum.create(this.options.filter((opt) => !values.includes(opt)), {\n ...this._def,\n ...newDef,\n });\n }\n}\n_ZodEnum_cache = new WeakMap();\nZodEnum.create = createZodEnum;\nclass ZodNativeEnum extends ZodType {\n constructor() {\n super(...arguments);\n _ZodNativeEnum_cache.set(this, void 0);\n }\n _parse(input) {\n const nativeEnumValues = util.getValidEnumValues(this._def.values);\n const ctx = this._getOrReturnCtx(input);\n if (ctx.parsedType !== ZodParsedType.string &&\n ctx.parsedType !== ZodParsedType.number) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type,\n });\n return INVALID;\n }\n if (!__classPrivateFieldGet(this, _ZodNativeEnum_cache, \"f\")) {\n __classPrivateFieldSet(this, _ZodNativeEnum_cache, new Set(util.getValidEnumValues(this._def.values)), \"f\");\n }\n if (!__classPrivateFieldGet(this, _ZodNativeEnum_cache, \"f\").has(input.data)) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get enum() {\n return this._def.values;\n }\n}\n_ZodNativeEnum_cache = new WeakMap();\nZodNativeEnum.create = (values, params) => {\n return new ZodNativeEnum({\n values: values,\n typeName: ZodFirstPartyTypeKind.ZodNativeEnum,\n ...processCreateParams(params),\n });\n};\nclass ZodPromise extends ZodType {\n unwrap() {\n return this._def.type;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.promise &&\n ctx.common.async === false) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.promise,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const promisified = ctx.parsedType === ZodParsedType.promise\n ? ctx.data\n : Promise.resolve(ctx.data);\n return OK(promisified.then((data) => {\n return this._def.type.parseAsync(data, {\n path: ctx.path,\n errorMap: ctx.common.contextualErrorMap,\n });\n }));\n }\n}\nZodPromise.create = (schema, params) => {\n return new ZodPromise({\n type: schema,\n typeName: ZodFirstPartyTypeKind.ZodPromise,\n ...processCreateParams(params),\n });\n};\nclass ZodEffects extends ZodType {\n innerType() {\n return this._def.schema;\n }\n sourceType() {\n return this._def.schema._def.typeName === ZodFirstPartyTypeKind.ZodEffects\n ? this._def.schema.sourceType()\n : this._def.schema;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const effect = this._def.effect || null;\n const checkCtx = {\n addIssue: (arg) => {\n addIssueToContext(ctx, arg);\n if (arg.fatal) {\n status.abort();\n }\n else {\n status.dirty();\n }\n },\n get path() {\n return ctx.path;\n },\n };\n checkCtx.addIssue = checkCtx.addIssue.bind(checkCtx);\n if (effect.type === \"preprocess\") {\n const processed = effect.transform(ctx.data, checkCtx);\n if (ctx.common.async) {\n return Promise.resolve(processed).then(async (processed) => {\n if (status.value === \"aborted\")\n return INVALID;\n const result = await this._def.schema._parseAsync({\n data: processed,\n path: ctx.path,\n parent: ctx,\n });\n if (result.status === \"aborted\")\n return INVALID;\n if (result.status === \"dirty\")\n return DIRTY(result.value);\n if (status.value === \"dirty\")\n return DIRTY(result.value);\n return result;\n });\n }\n else {\n if (status.value === \"aborted\")\n return INVALID;\n const result = this._def.schema._parseSync({\n data: processed,\n path: ctx.path,\n parent: ctx,\n });\n if (result.status === \"aborted\")\n return INVALID;\n if (result.status === \"dirty\")\n return DIRTY(result.value);\n if (status.value === \"dirty\")\n return DIRTY(result.value);\n return result;\n }\n }\n if (effect.type === \"refinement\") {\n const executeRefinement = (acc) => {\n const result = effect.refinement(acc, checkCtx);\n if (ctx.common.async) {\n return Promise.resolve(result);\n }\n if (result instanceof Promise) {\n throw new Error(\"Async refinement encountered during synchronous parse operation. Use .parseAsync instead.\");\n }\n return acc;\n };\n if (ctx.common.async === false) {\n const inner = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inner.status === \"aborted\")\n return INVALID;\n if (inner.status === \"dirty\")\n status.dirty();\n // return value is ignored\n executeRefinement(inner.value);\n return { status: status.value, value: inner.value };\n }\n else {\n return this._def.schema\n ._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx })\n .then((inner) => {\n if (inner.status === \"aborted\")\n return INVALID;\n if (inner.status === \"dirty\")\n status.dirty();\n return executeRefinement(inner.value).then(() => {\n return { status: status.value, value: inner.value };\n });\n });\n }\n }\n if (effect.type === \"transform\") {\n if (ctx.common.async === false) {\n const base = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (!isValid(base))\n return base;\n const result = effect.transform(base.value, checkCtx);\n if (result instanceof Promise) {\n throw new Error(`Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.`);\n }\n return { status: status.value, value: result };\n }\n else {\n return this._def.schema\n ._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx })\n .then((base) => {\n if (!isValid(base))\n return base;\n return Promise.resolve(effect.transform(base.value, checkCtx)).then((result) => ({ status: status.value, value: result }));\n });\n }\n }\n util.assertNever(effect);\n }\n}\nZodEffects.create = (schema, effect, params) => {\n return new ZodEffects({\n schema,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect,\n ...processCreateParams(params),\n });\n};\nZodEffects.createWithPreprocess = (preprocess, schema, params) => {\n return new ZodEffects({\n schema,\n effect: { type: \"preprocess\", transform: preprocess },\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n ...processCreateParams(params),\n });\n};\nclass ZodOptional extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.undefined) {\n return OK(undefined);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodOptional.create = (type, params) => {\n return new ZodOptional({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodOptional,\n ...processCreateParams(params),\n });\n};\nclass ZodNullable extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.null) {\n return OK(null);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodNullable.create = (type, params) => {\n return new ZodNullable({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodNullable,\n ...processCreateParams(params),\n });\n};\nclass ZodDefault extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n let data = ctx.data;\n if (ctx.parsedType === ZodParsedType.undefined) {\n data = this._def.defaultValue();\n }\n return this._def.innerType._parse({\n data,\n path: ctx.path,\n parent: ctx,\n });\n }\n removeDefault() {\n return this._def.innerType;\n }\n}\nZodDefault.create = (type, params) => {\n return new ZodDefault({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodDefault,\n defaultValue: typeof params.default === \"function\"\n ? params.default\n : () => params.default,\n ...processCreateParams(params),\n });\n};\nclass ZodCatch extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n // newCtx is used to not collect issues from inner types in ctx\n const newCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n };\n const result = this._def.innerType._parse({\n data: newCtx.data,\n path: newCtx.path,\n parent: {\n ...newCtx,\n },\n });\n if (isAsync(result)) {\n return result.then((result) => {\n return {\n status: \"valid\",\n value: result.status === \"valid\"\n ? result.value\n : this._def.catchValue({\n get error() {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data,\n }),\n };\n });\n }\n else {\n return {\n status: \"valid\",\n value: result.status === \"valid\"\n ? result.value\n : this._def.catchValue({\n get error() {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data,\n }),\n };\n }\n }\n removeCatch() {\n return this._def.innerType;\n }\n}\nZodCatch.create = (type, params) => {\n return new ZodCatch({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodCatch,\n catchValue: typeof params.catch === \"function\" ? params.catch : () => params.catch,\n ...processCreateParams(params),\n });\n};\nclass ZodNaN extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.nan) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.nan,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return { status: \"valid\", value: input.data };\n }\n}\nZodNaN.create = (params) => {\n return new ZodNaN({\n typeName: ZodFirstPartyTypeKind.ZodNaN,\n ...processCreateParams(params),\n });\n};\nconst BRAND = Symbol(\"zod_brand\");\nclass ZodBranded extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const data = ctx.data;\n return this._def.type._parse({\n data,\n path: ctx.path,\n parent: ctx,\n });\n }\n unwrap() {\n return this._def.type;\n }\n}\nclass ZodPipeline extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.common.async) {\n const handleAsync = async () => {\n const inResult = await this._def.in._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inResult.status === \"aborted\")\n return INVALID;\n if (inResult.status === \"dirty\") {\n status.dirty();\n return DIRTY(inResult.value);\n }\n else {\n return this._def.out._parseAsync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx,\n });\n }\n };\n return handleAsync();\n }\n else {\n const inResult = this._def.in._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inResult.status === \"aborted\")\n return INVALID;\n if (inResult.status === \"dirty\") {\n status.dirty();\n return {\n status: \"dirty\",\n value: inResult.value,\n };\n }\n else {\n return this._def.out._parseSync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n }\n static create(a, b) {\n return new ZodPipeline({\n in: a,\n out: b,\n typeName: ZodFirstPartyTypeKind.ZodPipeline,\n });\n }\n}\nclass ZodReadonly extends ZodType {\n _parse(input) {\n const result = this._def.innerType._parse(input);\n const freeze = (data) => {\n if (isValid(data)) {\n data.value = Object.freeze(data.value);\n }\n return data;\n };\n return isAsync(result)\n ? result.then((data) => freeze(data))\n : freeze(result);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodReadonly.create = (type, params) => {\n return new ZodReadonly({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodReadonly,\n ...processCreateParams(params),\n });\n};\nfunction custom(check, params = {}, \n/**\n * @deprecated\n *\n * Pass `fatal` into the params object instead:\n *\n * ```ts\n * z.string().custom((val) => val.length > 5, { fatal: false })\n * ```\n *\n */\nfatal) {\n if (check)\n return ZodAny.create().superRefine((data, ctx) => {\n var _a, _b;\n if (!check(data)) {\n const p = typeof params === \"function\"\n ? params(data)\n : typeof params === \"string\"\n ? { message: params }\n : params;\n const _fatal = (_b = (_a = p.fatal) !== null && _a !== void 0 ? _a : fatal) !== null && _b !== void 0 ? _b : true;\n const p2 = typeof p === \"string\" ? { message: p } : p;\n ctx.addIssue({ code: \"custom\", ...p2, fatal: _fatal });\n }\n });\n return ZodAny.create();\n}\nconst late = {\n object: ZodObject.lazycreate,\n};\nvar ZodFirstPartyTypeKind;\n(function (ZodFirstPartyTypeKind) {\n ZodFirstPartyTypeKind[\"ZodString\"] = \"ZodString\";\n ZodFirstPartyTypeKind[\"ZodNumber\"] = \"ZodNumber\";\n ZodFirstPartyTypeKind[\"ZodNaN\"] = \"ZodNaN\";\n ZodFirstPartyTypeKind[\"ZodBigInt\"] = \"ZodBigInt\";\n ZodFirstPartyTypeKind[\"ZodBoolean\"] = \"ZodBoolean\";\n ZodFirstPartyTypeKind[\"ZodDate\"] = \"ZodDate\";\n ZodFirstPartyTypeKind[\"ZodSymbol\"] = \"ZodSymbol\";\n ZodFirstPartyTypeKind[\"ZodUndefined\"] = \"ZodUndefined\";\n ZodFirstPartyTypeKind[\"ZodNull\"] = \"ZodNull\";\n ZodFirstPartyTypeKind[\"ZodAny\"] = \"ZodAny\";\n ZodFirstPartyTypeKind[\"ZodUnknown\"] = \"ZodUnknown\";\n ZodFirstPartyTypeKind[\"ZodNever\"] = \"ZodNever\";\n ZodFirstPartyTypeKind[\"ZodVoid\"] = \"ZodVoid\";\n ZodFirstPartyTypeKind[\"ZodArray\"] = \"ZodArray\";\n ZodFirstPartyTypeKind[\"ZodObject\"] = \"ZodObject\";\n ZodFirstPartyTypeKind[\"ZodUnion\"] = \"ZodUnion\";\n ZodFirstPartyTypeKind[\"ZodDiscriminatedUnion\"] = \"ZodDiscriminatedUnion\";\n ZodFirstPartyTypeKind[\"ZodIntersection\"] = \"ZodIntersection\";\n ZodFirstPartyTypeKind[\"ZodTuple\"] = \"ZodTuple\";\n ZodFirstPartyTypeKind[\"ZodRecord\"] = \"ZodRecord\";\n ZodFirstPartyTypeKind[\"ZodMap\"] = \"ZodMap\";\n ZodFirstPartyTypeKind[\"ZodSet\"] = \"ZodSet\";\n ZodFirstPartyTypeKind[\"ZodFunction\"] = \"ZodFunction\";\n ZodFirstPartyTypeKind[\"ZodLazy\"] = \"ZodLazy\";\n ZodFirstPartyTypeKind[\"ZodLiteral\"] = \"ZodLiteral\";\n ZodFirstPartyTypeKind[\"ZodEnum\"] = \"ZodEnum\";\n ZodFirstPartyTypeKind[\"ZodEffects\"] = \"ZodEffects\";\n ZodFirstPartyTypeKind[\"ZodNativeEnum\"] = \"ZodNativeEnum\";\n ZodFirstPartyTypeKind[\"ZodOptional\"] = \"ZodOptional\";\n ZodFirstPartyTypeKind[\"ZodNullable\"] = \"ZodNullable\";\n ZodFirstPartyTypeKind[\"ZodDefault\"] = \"ZodDefault\";\n ZodFirstPartyTypeKind[\"ZodCatch\"] = \"ZodCatch\";\n ZodFirstPartyTypeKind[\"ZodPromise\"] = \"ZodPromise\";\n ZodFirstPartyTypeKind[\"ZodBranded\"] = \"ZodBranded\";\n ZodFirstPartyTypeKind[\"ZodPipeline\"] = \"ZodPipeline\";\n ZodFirstPartyTypeKind[\"ZodReadonly\"] = \"ZodReadonly\";\n})(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {}));\nconst instanceOfType = (\n// const instanceOfType = any>(\ncls, params = {\n message: `Input not instance of ${cls.name}`,\n}) => custom((data) => data instanceof cls, params);\nconst stringType = ZodString.create;\nconst numberType = ZodNumber.create;\nconst nanType = ZodNaN.create;\nconst bigIntType = ZodBigInt.create;\nconst booleanType = ZodBoolean.create;\nconst dateType = ZodDate.create;\nconst symbolType = ZodSymbol.create;\nconst undefinedType = ZodUndefined.create;\nconst nullType = ZodNull.create;\nconst anyType = ZodAny.create;\nconst unknownType = ZodUnknown.create;\nconst neverType = ZodNever.create;\nconst voidType = ZodVoid.create;\nconst arrayType = ZodArray.create;\nconst objectType = ZodObject.create;\nconst strictObjectType = ZodObject.strictCreate;\nconst unionType = ZodUnion.create;\nconst discriminatedUnionType = ZodDiscriminatedUnion.create;\nconst intersectionType = ZodIntersection.create;\nconst tupleType = ZodTuple.create;\nconst recordType = ZodRecord.create;\nconst mapType = ZodMap.create;\nconst setType = ZodSet.create;\nconst functionType = ZodFunction.create;\nconst lazyType = ZodLazy.create;\nconst literalType = ZodLiteral.create;\nconst enumType = ZodEnum.create;\nconst nativeEnumType = ZodNativeEnum.create;\nconst promiseType = ZodPromise.create;\nconst effectsType = ZodEffects.create;\nconst optionalType = ZodOptional.create;\nconst nullableType = ZodNullable.create;\nconst preprocessType = ZodEffects.createWithPreprocess;\nconst pipelineType = ZodPipeline.create;\nconst ostring = () => stringType().optional();\nconst onumber = () => numberType().optional();\nconst oboolean = () => booleanType().optional();\nconst coerce = {\n string: ((arg) => ZodString.create({ ...arg, coerce: true })),\n number: ((arg) => ZodNumber.create({ ...arg, coerce: true })),\n boolean: ((arg) => ZodBoolean.create({\n ...arg,\n coerce: true,\n })),\n bigint: ((arg) => ZodBigInt.create({ ...arg, coerce: true })),\n date: ((arg) => ZodDate.create({ ...arg, coerce: true })),\n};\nconst NEVER = INVALID;\n\nvar z = /*#__PURE__*/Object.freeze({\n __proto__: null,\n defaultErrorMap: errorMap,\n setErrorMap: setErrorMap,\n getErrorMap: getErrorMap,\n makeIssue: makeIssue,\n EMPTY_PATH: EMPTY_PATH,\n addIssueToContext: addIssueToContext,\n ParseStatus: ParseStatus,\n INVALID: INVALID,\n DIRTY: DIRTY,\n OK: OK,\n isAborted: isAborted,\n isDirty: isDirty,\n isValid: isValid,\n isAsync: isAsync,\n get util () { return util; },\n get objectUtil () { return objectUtil; },\n ZodParsedType: ZodParsedType,\n getParsedType: getParsedType,\n ZodType: ZodType,\n datetimeRegex: datetimeRegex,\n ZodString: ZodString,\n ZodNumber: ZodNumber,\n ZodBigInt: ZodBigInt,\n ZodBoolean: ZodBoolean,\n ZodDate: ZodDate,\n ZodSymbol: ZodSymbol,\n ZodUndefined: ZodUndefined,\n ZodNull: ZodNull,\n ZodAny: ZodAny,\n ZodUnknown: ZodUnknown,\n ZodNever: ZodNever,\n ZodVoid: ZodVoid,\n ZodArray: ZodArray,\n ZodObject: ZodObject,\n ZodUnion: ZodUnion,\n ZodDiscriminatedUnion: ZodDiscriminatedUnion,\n ZodIntersection: ZodIntersection,\n ZodTuple: ZodTuple,\n ZodRecord: ZodRecord,\n ZodMap: ZodMap,\n ZodSet: ZodSet,\n ZodFunction: ZodFunction,\n ZodLazy: ZodLazy,\n ZodLiteral: ZodLiteral,\n ZodEnum: ZodEnum,\n ZodNativeEnum: ZodNativeEnum,\n ZodPromise: ZodPromise,\n ZodEffects: ZodEffects,\n ZodTransformer: ZodEffects,\n ZodOptional: ZodOptional,\n ZodNullable: ZodNullable,\n ZodDefault: ZodDefault,\n ZodCatch: ZodCatch,\n ZodNaN: ZodNaN,\n BRAND: BRAND,\n ZodBranded: ZodBranded,\n ZodPipeline: ZodPipeline,\n ZodReadonly: ZodReadonly,\n custom: custom,\n Schema: ZodType,\n ZodSchema: ZodType,\n late: late,\n get ZodFirstPartyTypeKind () { return ZodFirstPartyTypeKind; },\n coerce: coerce,\n any: anyType,\n array: arrayType,\n bigint: bigIntType,\n boolean: booleanType,\n date: dateType,\n discriminatedUnion: discriminatedUnionType,\n effect: effectsType,\n 'enum': enumType,\n 'function': functionType,\n 'instanceof': instanceOfType,\n intersection: intersectionType,\n lazy: lazyType,\n literal: literalType,\n map: mapType,\n nan: nanType,\n nativeEnum: nativeEnumType,\n never: neverType,\n 'null': nullType,\n nullable: nullableType,\n number: numberType,\n object: objectType,\n oboolean: oboolean,\n onumber: onumber,\n optional: optionalType,\n ostring: ostring,\n pipeline: pipelineType,\n preprocess: preprocessType,\n promise: promiseType,\n record: recordType,\n set: setType,\n strictObject: strictObjectType,\n string: stringType,\n symbol: symbolType,\n transformer: effectsType,\n tuple: tupleType,\n 'undefined': undefinedType,\n union: unionType,\n unknown: unknownType,\n 'void': voidType,\n NEVER: NEVER,\n ZodIssueCode: ZodIssueCode,\n quotelessJson: quotelessJson,\n ZodError: ZodError\n});\n\nexport { BRAND, DIRTY, EMPTY_PATH, INVALID, NEVER, OK, ParseStatus, ZodType as Schema, ZodAny, ZodArray, ZodBigInt, ZodBoolean, ZodBranded, ZodCatch, ZodDate, ZodDefault, ZodDiscriminatedUnion, ZodEffects, ZodEnum, ZodError, ZodFirstPartyTypeKind, ZodFunction, ZodIntersection, ZodIssueCode, ZodLazy, ZodLiteral, ZodMap, ZodNaN, ZodNativeEnum, ZodNever, ZodNull, ZodNullable, ZodNumber, ZodObject, ZodOptional, ZodParsedType, ZodPipeline, ZodPromise, ZodReadonly, ZodRecord, ZodType as ZodSchema, ZodSet, ZodString, ZodSymbol, ZodEffects as ZodTransformer, ZodTuple, ZodType, ZodUndefined, ZodUnion, ZodUnknown, ZodVoid, addIssueToContext, anyType as any, arrayType as array, bigIntType as bigint, booleanType as boolean, coerce, custom, dateType as date, datetimeRegex, z as default, errorMap as defaultErrorMap, discriminatedUnionType as discriminatedUnion, effectsType as effect, enumType as enum, functionType as function, getErrorMap, getParsedType, instanceOfType as instanceof, intersectionType as intersection, isAborted, isAsync, isDirty, isValid, late, lazyType as lazy, literalType as literal, makeIssue, mapType as map, nanType as nan, nativeEnumType as nativeEnum, neverType as never, nullType as null, nullableType as nullable, numberType as number, objectType as object, objectUtil, oboolean, onumber, optionalType as optional, ostring, pipelineType as pipeline, preprocessType as preprocess, promiseType as promise, quotelessJson, recordType as record, setType as set, setErrorMap, strictObjectType as strictObject, stringType as string, symbolType as symbol, effectsType as transformer, tupleType as tuple, undefinedType as undefined, unionType as union, unknownType as unknown, util, voidType as void, z };\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","\r\nimport * as ex from \"excalibur\";\r\nimport { Player } from './player';\r\nimport { Resources, loader } from \"./resources\";\r\nex.Flags.useLegacyImageRenderer();\r\nconst game = new ex.Engine({\r\n resolution: {\r\n width: 256,\r\n height: 256,\r\n },\r\n suppressPlayButton: false,\r\n pixelArt: true,\r\n pixelRatio: 4,\r\n displayMode: ex.DisplayMode.FitScreen,\r\n});\r\n\r\ngame.start(loader).then(() => {\r\n console.log('Game start!');\r\n\r\n Resources.LdtkResource.registerEntityIdentifierFactory('PlayerStart', (props) => {\r\n const player = new Player({\r\n name: 'player',\r\n anchor: ex.vec(props.entity.__pivot[0],props.entity.__pivot[1]),\r\n width: props.entity.width,\r\n height: props.entity.height,\r\n pos: props.worldPos,\r\n z: props.layer.order\r\n });\r\n return player;\r\n });\r\n // Provide a type to the plugin to use for a specific entity identifier\r\n // Player.ts\r\n Resources.LdtkResource.addToScene(game.currentScene, {\r\n pos: ex.vec(0, 0),\r\n levelFilter: ['Level_0', 'Level_1']\r\n });\r\n const player = game.currentScene.world.entityManager.getByName('player')[0];\r\n if (player instanceof Player) {\r\n game.currentScene.camera.clearAllStrategies();\r\n game.currentScene.camera.strategy.lockToActor(player);\r\n const bounds = Resources.LdtkResource.getLevelBounds(['Level_0', 'Level_1']);\r\n game.currentScene.camera.strategy.limitCameraBounds(bounds);\r\n }\r\n});"],"names":[],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"sample/sample.js","mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD,O;;;;;;;;;;;;;;;ACVuD;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC,qCAAqC;AACrC,qCAAqC;AACrC,sCAAsC;AACtC,sCAAsC;AACtC;AACA;AACO;AACP;AACA;AACA;AACA;AACA,gBAAgB,oEAAe;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,UAAU;AACxF;AACA;AACA,6DAA6D,2BAA2B;AACxF;AACA;AACA,mC;;;;;;;;;;;;;;;AC3C+D;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA,eAAe,2DAAgB;AAC/B,eAAe,2DAAgB;AAC/B;AACA;AACA;AACA;AACA,cAAc,0DAAe;AAC7B;AACA;AACA;AACA;AACA,eAAe,0DAAe;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA,2C;;;;;;;;;;;;;;;;AC5BO;AACA;AACP;AACA;AACA;AACA;AACA;AACA,+DAA+D,QAAQ;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP,oBAAoB,kCAAkC;AACtD;AACA;AACA;AACA;AACA;AACA;AACA,iC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB,0BAAmB,EAAE,8BAAmB;;AAExD,8BAAmB,GAAG,0BAAmB;AACzC,qBAAqB,8BAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,4GAA4G,8BAAmB;AAC/H,iIAAiI,8BAAmB;AACpJ,qGAAqG,8BAAmB;AACxH,0HAA0H,8BAAmB;AAC7I;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD,iDAAiD;AACjD,gDAAgD;AAChD,+CAA+C;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,8FAA8F,MAAM,YAAY,aAAa,WAAW,YAAY,WAAW,MAAM,OAAO,aAAa,WAAW,YAAY,aAAa,WAAW,YAAY,WAAW,YAAY,WAAW,UAAU,YAAY,OAAO,OAAO,aAAa,cAAc,yBAAyB,yBAAyB,yBAAyB,yBAAyB,aAAa,OAAO,OAAO,MAAM,KAAK,YAAY,WAAW,YAAY,aAAa,WAAW,UAAU,UAAU,UAAU,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,UAAU,YAAY,WAAW,UAAU,MAAM,MAAM,YAAY,OAAO,KAAK,YAAY,aAAa,OAAO,KAAK,YAAY,OAAO,KAAK,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,MAAM,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,MAAM,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,MAAM,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,MAAM,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,kFAAkF,4BAA4B,yBAAyB,mBAAmB,yBAAyB,mBAAmB,0BAA0B,4BAA4B,kCAAkC,uCAAuC,gBAAgB,4BAA4B,0BAA0B,qBAAqB,8BAA8B,sBAAsB,0BAA0B,qBAAqB,sBAAsB,yBAAyB,mFAAmF,+BAA+B,4BAA4B,4DAA4D,0FAA0F,sEAAsE,0EAA0E,iEAAiE,KAAK,qCAAqC,oBAAoB,KAAK,uCAAuC,yBAAyB,kBAAkB,wBAAwB,8DAA8D,iBAAiB,gBAAgB,eAAe,gBAAgB,KAAK,sCAAsC,yBAAyB,kBAAkB,wBAAwB,iBAAiB,gBAAgB,0BAA0B,kBAAkB,mBAAmB,KAAK,qEAAqE,0BAA0B,KAAK,qCAAqC,8BAA8B,2BAA2B,KAAK,sCAAsC,6BAA6B,KAAK,4CAA4C,YAAY,mBAAmB,OAAO,UAAU,mBAAmB,OAAO,KAAK,uEAAuE,YAAY,mBAAmB,OAAO,UAAU,mBAAmB,OAAO,KAAK,6FAA6F,YAAY,mBAAmB,OAAO,UAAU,mBAAmB,OAAO,KAAK,2EAA2E,YAAY,mBAAmB,OAAO,UAAU,mBAAmB,OAAO,KAAK,qEAAqE,YAAY,mBAAmB,OAAO,UAAU,mBAAmB,OAAO,KAAK,uBAAuB;AAClmH;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,gBAAgB,0BAAmB,EAAE,+BAAmB;;AAExD,+BAAmB,GAAG,0BAAmB;AACzC,qBAAqB,+BAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,4GAA4G,+BAAmB;AAC/H,iIAAiI,+BAAmB;AACpJ,qGAAqG,+BAAmB;AACxH,0HAA0H,+BAAmB;AAC7I;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,mFAAmF,YAAY,WAAW,UAAU,UAAU,UAAU,MAAM,KAAK,UAAU,YAAY,WAAW,aAAa,WAAW,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,OAAO,KAAK,YAAY,+CAA+C,yBAAyB,gBAAgB,qBAAqB,gBAAgB,aAAa,KAAK,2BAA2B,iBAAiB,yBAAyB,oBAAoB,qCAAqC,wBAAwB,sBAAsB,sBAAsB,8BAA8B,yBAAyB,gCAAgC,2CAA2C,KAAK,kCAAkC,6BAA6B,KAAK,uBAAuB;AACr2B;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA,gDAAgD;AAChD;AACA;AACA,qFAAqF;AACrF;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,qBAAqB;AACrB;AACA;AACA,qBAAqB;AACrB;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,iBAAiB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,qBAAqB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,sFAAsF,qBAAqB;AAC3G;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,iDAAiD,qBAAqB;AACtE;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,sDAAsD,qBAAqB;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAO;;AAEP;AACA;AACA;AACA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,cAAc;AACrE;AACA;AACA;AACA;AACA;;AAEA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,2GAA2G,oCAAoC,mEAAmE,8DAA8D,uEAAuE,yCAAyC,2BAA2B,qBAAqB,wEAAwE,+BAA+B,uCAAuC,mHAAmH,oCAAoC,wEAAwE,iDAAiD,kHAAkH,4JAA4J,yCAAyC,uCAAuC,2CAA2C,2BAA2B,wEAAwE,kDAAkD,8CAA8C,6BAA6B,KAAK;;AAE57C,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,wGAAwG,yCAAyC,kBAAkB,0CAA0C,wBAAwB,wBAAwB,qBAAqB,8BAA8B,2BAA2B,mCAAmC,gCAAgC,8BAA8B,yBAAyB,6HAA6H,uDAAuD,sFAAsF,gFAAgF,mGAAmG,+GAA+G,KAAK;;AAEt/B,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6GAA6G,0CAA0C,mFAAmF,gCAAgC,iCAAiC,2BAA2B,uBAAuB,+CAA+C,yBAAyB,qBAAqB,2BAA2B,mJAAmJ,qCAAqC,oCAAoC,8BAA8B,iDAAiD,oCAAoC,KAAK,oDAAoD,8CAA8C,KAAK,yDAAyD,0CAA0C,KAAK,iGAAiG,mDAAmD,6CAA6C,KAAK,oBAAoB,+PAA+P,sJAAsJ,wDAAwD,wDAAwD,wEAAwE,oCAAoC,iCAAiC,KAAK;;AAEz2D,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,oHAAoH,0CAA0C,wBAAwB,4CAA4C,6CAA6C,6CAA6C,6CAA6C,8CAA8C,wBAAwB,+FAA+F,mBAAmB,sEAAsE,yDAAyD,mCAAmC,6CAA6C,sBAAsB,6CAA6C,sBAAsB,2CAA2C,oBAAoB,8BAA8B,oBAAoB,uOAAuO,+DAA+D,2EAA2E,gCAAgC,8BAA8B,0BAA0B,0BAA0B,oBAAoB,wCAAwC,sBAAsB,KAAK;;AAEp/C,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6GAA6G,0CAA0C,yDAAyD,mFAAmF,gCAAgC,yCAAyC,uBAAuB,sBAAsB,2BAA2B,mJAAmJ,qCAAqC,sCAAsC,8BAA8B,iDAAiD,sCAAsC,KAAK,oBAAoB,iQAAiQ,uJAAuJ,gCAAgC,6BAA6B,KAAK;;AAE1vC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,wGAAwG,yCAAyC,wBAAwB,+CAA+C,wBAAwB,wCAAwC,mBAAmB,0DAA0D,kCAAkC,uBAAuB,oBAAoB,8BAA8B,oBAAoB,mHAAmH,wFAAwF,qFAAqF,wBAAwB,uGAAuG,kDAAkD,KAAK;;AAE17B,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6GAA6G,yCAAyC,2BAA2B,qBAAqB,0BAA0B,KAAK;;AAErO,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,wGAAwG,oBAAoB,8BAA8B,8BAA8B,qBAAqB,6HAA6H,4DAA4D,KAAK;;AAE3Y,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6GAA6G,kCAAkC,4BAA4B,4BAA4B,gCAAgC,0BAA0B,sBAAsB,+BAA+B,+BAA+B,yBAAyB,uBAAuB,oBAAoB,kDAAkD,2BAA2B,8DAA8D,uBAAuB,0CAA0C,wCAAwC,yMAAyM,+CAA+C,mDAAmD,QAAQ,MAAM,6DAA6D,+CAA+C,sCAAsC,yCAAyC,6DAA6D,sEAAsE,8BAA8B,qEAAqE,kDAAkD,qCAAqC,OAAO,KAAK;;AAE18C,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6GAA6G,8BAA8B,4BAA4B,yBAAyB,uBAAuB,6BAA6B,0BAA0B,6BAA6B,4BAA4B,0BAA0B,kCAAkC,2CAA2C,uCAAuC,wCAAwC,+CAA+C,sCAAsC,uGAAuG,2BAA2B,4BAA4B,mCAAmC,0BAA0B,gBAAgB,8DAA8D,6NAA6N,wDAAwD,4FAA4F,2DAA2D,6CAA6C,2DAA2D,oGAAoG,wDAAwD,iDAAiD,4GAA4G,yEAAyE,+FAA+F,UAAU,sDAAsD,oFAAoF,wGAAwG,iEAAiE,qGAAqG,KAAK;;AAEvxE,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iHAAiH,yBAAyB,2BAA2B,qBAAqB,8CAA8C,2CAA2C,wBAAwB,4BAA4B,4DAA4D,sEAAsE,gCAAgC,sCAAsC,wBAAwB,KAAK;;AAE5iB,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,wGAAwG,oBAAoB,oBAAoB,0BAA0B,0BAA0B,qBAAqB,0DAA0D,kCAAkC,wBAAwB,KAAK;;AAElV,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iHAAiH,oCAAoC,wBAAwB,+EAA+E,8DAA8D,wEAAwE,qDAAqD,2BAA2B,qBAAqB,wIAAwI,qCAAqC,kDAAkD,uCAAuC,kDAAkD,uCAAuC,kHAAkH,8BAA8B,UAAU,MAAM,oCAAoC,SAAS,iCAAiC,qCAAqC,yEAAyE,0EAA0E,gDAAgD,4CAA4C,0JAA0J,4EAA4E,8DAA8D,YAAY,gKAAgK,4EAA4E,8DAA8D,YAAY,2BAA2B,yMAAyM,4EAA4E,2NAA2N,+FAA+F,0FAA0F,YAAY,gDAAgD,4CAA4C,yCAAyC,yEAAyE,mCAAmC,4CAA4C,YAAY,0EAA0E,qEAAqE,qCAAqC,KAAK;;AAEhmG,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,wGAAwG,yCAAyC,kBAAkB,uBAAuB,oBAAoB,0CAA0C,wBAAwB,wBAAwB,qBAAqB,8BAA8B,2BAA2B,mCAAmC,gCAAgC,8BAA8B,yBAAyB,6HAA6H,uDAAuD,kDAAkD,sFAAsF,gFAAgF,mGAAmG,+GAA+G,KAAK;;AAEnlC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6GAA6G,mEAAmE,uDAAuD,2BAA2B,qBAAqB,kDAAkD,KAAK;;AAE9U,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,wGAAwG,2BAA2B,wBAAwB,qBAAqB,+CAA+C,oFAAoF,KAAK;;AAExT,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6GAA6G,gDAAgD,6EAA6E,kDAAkD,kDAAkD,2BAA2B,qBAAqB,6CAA6C,yGAAyG,oEAAoE,uEAAuE,+CAA+C,cAAc,cAAc,2CAA2C,qEAAqE,wCAAwC,yCAAyC,QAAQ,uBAAuB,8DAA8D,iDAAiD,wCAAwC,QAAQ,uBAAuB,4DAA4D,wCAAwC,mDAAmD,OAAO,2DAA2D,kGAAkG,8EAA8E,iFAAiF,oBAAoB,4BAA4B,uBAAuB,8CAA8C,sDAAsD,sDAAsD,kCAAkC,yBAAyB,0DAA0D,+BAA+B,QAAQ,MAAM,oCAAoC,OAAO,KAAK;;AAE7gE,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,8EAA8E,gCAAmB;AACjG,qEAAqE,gCAAmB;AACxF,wEAAwE,gCAAmB;AAC3F,+EAA+E,gCAAmB;AAClG,uEAAuE,gCAAmB;AAC1F,uEAAuE,gCAAmB;AAC1F,yEAAyE,gCAAmB;AAC5F,0EAA0E,gCAAmB;AAC7F,yEAAyE,gCAAmB;AAC5F,yEAAyE,gCAAmB;AAC5F,4EAA4E,gCAAmB;AAC/F,uEAAuE,gCAAmB;AAC1F,uEAAuE,gCAAmB;AAC1F,uEAAuE,gCAAmB;AAC1F,sEAAsE,gCAAmB;AACzF,uEAAuE,gCAAmB;AAC1F,qEAAqE,gCAAmB;AACxF,wEAAwE,gCAAmB;AAC3F,sEAAsE,gCAAmB;AACzF,8DAA8D,gCAAmB;AACjF,uEAAuE,gCAAmB;AAC1F,wEAAwE,gCAAmB;AAC3F,wEAAwE,gCAAmB;;;;;;;;;;;;;;;;;;;;;;;;AAwB3F;AACA;AACA,IAAI,2BAA2B;AAC/B;AACA,QAAQ,iBAAiB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,gCAAmB;;AAEnF;AACA;AACA;AACA,kCAAkC,uCAAuC;AACzE,oDAAoD,eAAe;AACnE;AACA,qBAAqB,wBAAwB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,gCAAmB;AACnF,uEAAuE,gCAAmB;;;AAG1F;AACA;AACA,IAAI,0BAA0B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,oFAAoF,gCAAmB;AACvG,gEAAgE,gCAAmB;;;AAGnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,gCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+EAA+E,gCAAmB;AAClG,8DAA8D,gCAAmB;AACjF,8DAA8D,gCAAmB;AACjF,8DAA8D,gCAAmB;AACjF,8DAA8D,gCAAmB;AACjF,gEAAgE,gCAAmB;;;;AAInF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+EAA+E,gCAAmB;AAClG,8DAA8D,gCAAmB;AACjF,8DAA8D,gCAAmB;AACjF,8DAA8D,gCAAmB;AACjF,8DAA8D,gCAAmB;AACjF,gEAAgE,gCAAmB;;;;AAInF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,gCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,gCAAmB;AACnF,0EAA0E,gCAAmB;;;AAG7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,0GAA0G,gCAAmB;AAC7H,6GAA6G,gCAAmB;AAChI,qEAAqE,gCAAmB;AACxF,gEAAgE,gCAAmB;;;;;AAKnF;AACA,2BAA2B,yDAAyD;AACpF;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6GAA6G,gCAAmB;AAChI,0GAA0G,gCAAmB;AAC7H,qEAAqE,gCAAmB;AACxF,gEAAgE,gCAAmB;;;;;AAKnF;AACA,2BAA2B,sDAAsD;AACjF;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,oFAAoF,gCAAmB;AACvG,kEAAkE,gCAAmB;AACrF,gEAAgE,gCAAmB;;;;AAInF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,oFAAoF,gCAAmB;AACvG,gEAAgE,gCAAmB;;;AAGnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,gCAAmB;;AAEzE,gCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,gCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,0GAA0G,gCAAmB;AAC7H,6GAA6G,gCAAmB;AAChI,qEAAqE,gCAAmB;AACxF,gEAAgE,gCAAmB;;;;;AAKnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,0GAA0G,iCAAmB;AAC7H,6GAA6G,iCAAmB;AAChI,qEAAqE,iCAAmB;AACxF,gEAAgE,iCAAmB;;;;;AAKnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,0GAA0G,iCAAmB;AAC7H,6GAA6G,iCAAmB;AAChI,8DAA8D,iCAAmB;AACjF,8DAA8D,iCAAmB;AACjF,qEAAqE,iCAAmB;AACxF,8EAA8E,iCAAmB;AACjG,kEAAkE,iCAAmB;AACrF,gEAAgE,iCAAmB;;;;;;;;AAQnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,0GAA0G,iCAAmB;AAC7H,6GAA6G,iCAAmB;AAChI,8DAA8D,iCAAmB;AACjF,8DAA8D,iCAAmB;AACjF,qEAAqE,iCAAmB;AACxF,8EAA8E,iCAAmB;AACjG,gEAAgE,iCAAmB;;;;;;;AAOnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;;AAEnF;AACA,iCAAiC,gBAAgB,MAAM,wBAAwB;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;;;AAG1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;;;AAG1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,6GAA6G,iCAAmB;AAChI,0GAA0G,iCAAmB;AAC7H,mEAAmE,iCAAmB;AACtF,8DAA8D,iCAAmB;AACjF,8DAA8D,iCAAmB;;;;;;AAMjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,8DAA8D,iCAAmB;AACjF,6GAA6G,iCAAmB;AAChI,0GAA0G,iCAAmB;AAC7H,mEAAmE,iCAAmB;AACtF,8DAA8D,iCAAmB;;;;;;;AAOjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,0GAA0G,iCAAmB;AAC7H,6GAA6G,iCAAmB;AAChI,gEAAgE,iCAAmB;AACnF,8DAA8D,iCAAmB;AACjF,8DAA8D,iCAAmB;;;;;;AAMjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,0GAA0G,iCAAmB;AAC7H,6GAA6G,iCAAmB;AAChI,gEAAgE,iCAAmB;AACnF,8DAA8D,iCAAmB;AACjF,8DAA8D,iCAAmB;;;;;;AAMjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,uEAAuE,iCAAmB;AAC1F,yFAAyF,iCAAmB;AAC5G,0GAA0G,iCAAmB;AAC7H,6GAA6G,iCAAmB;;;;;AAKhI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+EAA+E,iCAAmB;AAClG,sFAAsF,iCAAmB;AACzG,0EAA0E,iCAAmB;;;;AAI7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,uEAAuE,iCAAmB;AAC1F,qEAAqE,iCAAmB;AACxF,gEAAgE,iCAAmB;AACnF,+EAA+E,iCAAmB;AAClG,gFAAgF,iCAAmB;AACnG,uEAAuE,iCAAmB;AAC1F,8EAA8E,iCAAmB;AACjG,sEAAsE,iCAAmB;AACzF,oEAAoE,iCAAmB;AACvF,uEAAuE,iCAAmB;AAC1F,wEAAwE,iCAAmB;AAC3F,sEAAsE,iCAAmB;AACzF,wEAAwE,iCAAmB;AAC3F,sEAAsE,iCAAmB;AACzF,wEAAwE,iCAAmB;AAC3F,wEAAwE,iCAAmB;AAC3F,0EAA0E,iCAAmB;AAC7F,0EAA0E,iCAAmB;AAC7F,yEAAyE,iCAAmB;AAC5F,yEAAyE,iCAAmB;AAC5F,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;AAC1F,yEAAyE,iCAAmB;AAC5F,yEAAyE,iCAAmB;AAC5F,2EAA2E,iCAAmB;AAC9F,wEAAwE,iCAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8B3F,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,iEAAiE,iCAAmB;AACpF,kEAAkE,iCAAmB;AACrF,qEAAqE,iCAAmB;AACxF,kFAAkF,iCAAmB;AACrG,kFAAkF,iCAAmB;AACrG,sFAAsF,iCAAmB;AACzG,6GAA6G,iCAAmB;AAChI,0GAA0G,iCAAmB;AAC7H,oFAAoF,iCAAmB;AACvG,6EAA6E,iCAAmB;AAChG,sFAAsF,iCAAmB;AACzG,oFAAoF,iCAAmB;AACvG,oEAAoE,iCAAmB;AACvF,0EAA0E,iCAAmB;AAC7F,gFAAgF,iCAAmB;AACnG,mFAAmF,iCAAmB;AACtG,0EAA0E,iCAAmB;AAC7F,sEAAsE,iCAAmB;;;;;;;;;;;;;;;;;;;AAmBzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,gBAAgB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qGAAqG,qBAAqB;AAC1H;AACA;AACA;AACA;AACA;AACA,qGAAqG,qBAAqB;AAC1H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uMAAuM;AACvN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE,IAAI;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,oBAAoB;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oGAAoG,IAAI;AACxG;AACA,8FAA8F,eAAe;AAC7G;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,qBAAqB;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uGAAuG,IAAI;AAC3G;AACA,6FAA6F,eAAe;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,UAAU;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,yBAAyB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wGAAwG,IAAI;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0GAA0G,IAAI;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,sBAAsB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,uBAAuB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,8EAA8E,iCAAmB;AACjG,qEAAqE,iCAAmB;AACxF,mEAAmE,iCAAmB;AACtF,gEAAgE,iCAAmB;AACnF,+EAA+E,iCAAmB;AAClG,kEAAkE,iCAAmB;AACrF,4EAA4E,iCAAmB;AAC/F,sEAAsE,iCAAmB;AACzF,kEAAkE,iCAAmB;AACrF,oEAAoE,iCAAmB;AACvF,2EAA2E,iCAAmB;;;;;;;;;;;;AAY9F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,oCAAoC;AACjE;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,wCAAwC;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,iCAAiC;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,oCAAoC;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,oCAAoC;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oBAAoB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,iBAAiB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,iBAAiB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE,gBAAgB;AACrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE,gBAAgB;AACrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,yCAAyC;AAChG,mBAAmB,kBAAkB;AACrC,qBAAqB,kBAAkB,cAAc,iBAAiB;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,sBAAsB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wGAAwG,IAAI;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,uBAAuB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yGAAyG,IAAI;AAC7G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yGAAyG,IAAI;AAC7G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,uEAAuE,iCAAmB;AAC1F,6GAA6G,iCAAmB;AAChI,0GAA0G,iCAAmB;AAC7H,yFAAyF,iCAAmB;AAC5G,8EAA8E,iCAAmB;AACjG,4DAA4D,iCAAmB;AAC/E,oEAAoE,iCAAmB;AACvF,4EAA4E,iCAAmB;AAC/F,wEAAwE,iCAAmB;AAC3F,sEAAsE,iCAAmB;AACzF,uEAAuE,iCAAmB;;;;;;;;;;;;;AAa1F;AACA;AACA;AACA;AACA;AACA,CAAC,0CAA0C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4EAA4E;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,gCAAgC;AAChD;AACA;AACA;AACA;AACA,sCAAsC,0BAA0B;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8GAA8G,qBAAqB;AACnI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,8BAA8B;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,oCAAoC;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,2BAA2B,MAAM,8BAA8B;AACnH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,uBAAuB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,+DAA+D,iCAAmB;AAClF,8DAA8D,iCAAmB;;;;AAIjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,sBAAsB;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,gBAAgB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E,OAAO;AACjF;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,+EAA+E,iCAAmB;AAClG,yFAAyF,iCAAmB;AAC5G,gEAAgE,iCAAmB;AACnF,yEAAyE,iCAAmB;AAC5F,qEAAqE,iCAAmB;AACxF,qFAAqF,iCAAmB;AACxG,yEAAyE,iCAAmB;AAC5F,sEAAsE,iCAAmB;AACzF,+DAA+D,iCAAmB;;;;;;;;;;;AAWlF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,sCAAsC;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,+CAA+C;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,2CAA2C;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,4BAA4B;AAChD;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,4EAA4E,iCAAmB;AAC/F,yEAAyE,iCAAmB;AAC5F,sEAAsE,iCAAmB;AACzF,0EAA0E,iCAAmB;AAC7F,qEAAqE,iCAAmB;AACxF,gEAAgE,iCAAmB;AACnF,kEAAkE,iCAAmB;AACrF,8EAA8E,iCAAmB;AACjG,4EAA4E,iCAAmB;AAC/F,+DAA+D,iCAAmB;AAClF,mEAAmE,iCAAmB;;;;;;;;;;;;;AAatF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qFAAqF,aAAa;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oFAAoF,gBAAgB;AACpG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,YAAY,IAAI,KAAK,cAAc;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,2EAA2E,iCAAmB;AAC9F,qEAAqE,iCAAmB;AACxF,kEAAkE,iCAAmB;AACrF,mEAAmE,iCAAmB;;;;;AAKtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C,4BAA4B,mBAAmB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,4DAA4D,iCAAmB;AAC/E,sEAAsE,iCAAmB;;;;AAIzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,wEAAwE,iCAAmB;AAC3F,oFAAoF,iCAAmB;AACvG,yEAAyE,iCAAmB;AAC5F,sEAAsE,iCAAmB;AACzF,wEAAwE,iCAAmB;AAC3F,2EAA2E,iCAAmB;AAC9F,qEAAqE,iCAAmB;AACxF,+EAA+E,iCAAmB;AAClG,wEAAwE,iCAAmB;AAC3F,4EAA4E,iCAAmB;;;;;;;;;;;AAW/F,2EAA2E;AAC3E,6EAA6E;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,uBAAuB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,0DAA0D,iCAAmB;AAC7E,wEAAwE,iCAAmB;AAC3F,yEAAyE,iCAAmB;AAC5F,qEAAqE,iCAAmB;AACxF,qEAAqE,iCAAmB;AACxF,+EAA+E,iCAAmB;AAClG,iGAAiG,iCAAmB;AACpH,kEAAkE,iCAAmB;AACrF,uEAAuE,iCAAmB;;;;;;;;;;AAU1F;AACA;AACA;AACA;AACA;AACA,sDAAsD,4BAA4B;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,4EAA4E,iCAAmB;AAC/F,wEAAwE,iCAAmB;AAC3F,yEAAyE,iCAAmB;AAC5F,0EAA0E,iCAAmB;AAC7F,2EAA2E,iCAAmB;AAC9F,qEAAqE,iCAAmB;AACxF,kEAAkE,iCAAmB;AACrF,8EAA8E,iCAAmB;AACjG,4EAA4E,iCAAmB;AAC/F,+DAA+D,iCAAmB;;;;;;;;;;;;AAYlF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qFAAqF,aAAa;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kFAAkF,aAAa;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,sEAAsE,iCAAmB;AACzF,uEAAuE,iCAAmB;AAC1F,6EAA6E,iCAAmB;AAChG,wEAAwE,iCAAmB;AAC3F,0EAA0E,iCAAmB;AAC7F,2EAA2E,iCAAmB;AAC9F,qEAAqE,iCAAmB;AACxF,kEAAkE,iCAAmB;AACrF,+EAA+E,iCAAmB;AAClG,kEAAkE,iCAAmB;AACrF,0DAA0D,iCAAmB;AAC7E,0DAA0D,iCAAmB;AAC7E,2DAA2D,iCAAmB;AAC9E,2DAA2D,iCAAmB;AAC9E,2EAA2E,iCAAmB;AAC9F,+DAA+D,iCAAmB;AAClF,wEAAwE,iCAAmB;;;;;;;;;;;;;;;AAe3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,yBAAyB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,8BAA8B,eAAe,4BAA4B;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,4BAA4B;AACrF;AACA;AACA;AACA,wBAAwB,4BAA4B;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,4BAA4B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,iBAAiB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,iBAAiB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,iBAAiB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,iBAAiB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,SAAS;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,SAAS;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,qBAAqB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,qBAAqB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,0BAA0B;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qFAAqF,gBAAgB;AACrG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qFAAqF,gBAAgB;AACrG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oEAAoE,OAAO;AAC3E;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,2EAA2E,iCAAmB;AAC9F,qEAAqE,iCAAmB;AACxF,4EAA4E,iCAAmB;AAC/F,mEAAmE,iCAAmB;;;;;AAKtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,+BAA+B;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,+BAA+B;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yEAAyE,iCAAmB;AAC5F,wEAAwE,iCAAmB;AAC3F,sEAAsE,iCAAmB;AACzF,qEAAqE,iCAAmB;AACxF,qEAAqE,iCAAmB;AACxF,2EAA2E,iCAAmB;AAC9F,0DAA0D,iCAAmB;;;;;;;;AAQ7E;AACA;AACA;AACA;AACA;AACA,yDAAyD,0BAA0B;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,sBAAsB,gDAAgD;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,sBAAsB,oCAAoC;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,sBAAsB,gCAAgC;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,qCAAqC,4BAA4B;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gFAAgF,iCAAmB;AACnG,0GAA0G,iCAAmB;AAC7H,6GAA6G,iCAAmB;AAChI,sFAAsF,iCAAmB;AACzG,iEAAiE,iCAAmB;AACpF,yEAAyE,iCAAmB;AAC5F,6EAA6E,iCAAmB;AAChG,gFAAgF,iCAAmB;AACnG,2EAA2E,iCAAmB;AAC9F,qFAAqF,iCAAmB;AACxG,yEAAyE,iCAAmB;AAC5F,kFAAkF,iCAAmB;AACrG,sEAAsE,iCAAmB;AACzF,wEAAwE,iCAAmB;;;;;;;;;;;;;;;AAe3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,0CAA0C;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA,2BAA2B,gBAAgB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,sCAAsC;;;AAGvC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,uEAAuE,iCAAmB;AAC1F,8DAA8D,iCAAmB;AACjF,uEAAuE,iCAAmB;;;;AAI1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,kEAAkE,iCAAmB;AACrF,uEAAuE,iCAAmB;AAC1F,0DAA0D,iCAAmB;;;;;AAK7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,8DAA8D,iCAAmB;AACjF,sEAAsE,iCAAmB;AACzF,kEAAkE,iCAAmB;AACrF,kEAAkE,iCAAmB;AACrF,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;AAC1F,qFAAqF,iCAAmB;AACxG,8EAA8E,iCAAmB;AACjG,qEAAqE,iCAAmB;AACxF,4DAA4D,iCAAmB;;;;;;;;;;;;AAY/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,uDAAuD,OAAO;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8FAA8F;AAC9F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;;;AAG1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,UAAU,GAAG,UAAU;AAC9C;AACA;AACA,uBAAuB,UAAU,GAAG,UAAU;AAC9C;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,qEAAqE,iCAAmB;;;AAGxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,qEAAqE,iCAAmB;AACxF,yEAAyE,iCAAmB;AAC5F,qEAAqE,iCAAmB;;;;;AAKxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,EAAE,GAAG,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,aAAa;AAC7C,mCAAmC,cAAc;AACjD;AACA;AACA;AACA;AACA,wCAAwC,yBAAyB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,yBAAyB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,mBAAmB;AACrD,qCAAqC,oBAAoB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,mBAAmB;AAC7D,6CAA6C,oBAAoB;AACjE;AACA;AACA;AACA;AACA;AACA,0CAA0C,mBAAmB;AAC7D,6CAA6C,oBAAoB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,4DAA4D,iCAAmB;AAC/E,qEAAqE,iCAAmB;AACxF,mEAAmE,iCAAmB;AACtF,uEAAuE,iCAAmB;AAC1F,qFAAqF,iCAAmB;AACxG,uEAAuE,iCAAmB;AAC1F,8EAA8E,iCAAmB;AACjG,8DAA8D,iCAAmB;AACjF,wEAAwE,iCAAmB;;;;;;;;;;AAU3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8HAA8H,kEAAkE,IAAI,kEAAkE;AACtQ;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,qCAAqC;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,qBAAqB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA,oCAAoC,gCAAgC;AACpE;AACA;AACA;AACA,yCAAyC,kCAAkC;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA,4BAA4B,wBAAwB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA,mBAAmB,gCAAgC;AACnD;AACA;AACA,4DAA4D,mCAAmC;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4DAA4D;;;AAG7D,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+EAA+E,iCAAmB;;AAElG;AACA,mFAAmF,gCAAgC,WAAW,wBAAwB;AACtJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,uCAAuC;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,6CAA6C;AAC1F;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ,YAAY;AACZ;AACA;AACA;AACA;AACA,cAAc,yBAAyB;AACvC;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,wEAAwE,iCAAmB;;AAE3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,kBAAkB;AACvE;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,MAAM;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,uEAAuE,iCAAmB;AAC1F,2EAA2E,iCAAmB;AAC9F,uEAAuE,iCAAmB;AAC1F,wEAAwE,iCAAmB;AAC3F,4EAA4E,iCAAmB;AAC/F,qEAAqE,iCAAmB;AACxF,yEAAyE,iCAAmB;AAC5F,qFAAqF,iCAAmB;AACxG,kFAAkF,iCAAmB;AACrG,gFAAgF,iCAAmB;AACnG,oFAAoF,iCAAmB;AACvG,uFAAuF,iCAAmB;AAC1G,yFAAyF,iCAAmB;AAC5G,mFAAmF,iCAAmB;AACtG,+EAA+E,iCAAmB;AAClG,sFAAsF,iCAAmB;AACzG,yEAAyE,iCAAmB;AAC5F,qFAAqF,iCAAmB;AACxG,gFAAgF,iCAAmB;AACnG,kGAAkG,iCAAmB;AACrH,qGAAqG,iCAAmB;AACxH,mFAAmF,iCAAmB;AACtG,6FAA6F,iCAAmB;AAChH,6EAA6E,iCAAmB;AAChG,8EAA8E,iCAAmB;AACjG,6EAA6E,iCAAmB;AAChG,wFAAwF,iCAAmB;AAC3G,iFAAiF,iCAAmB;AACpG,0EAA0E,iCAAmB;AAC7F,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;AAC1F,wEAAwE,iCAAmB;AAC3F,+DAA+D,iCAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyClF,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;;AAExF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+EAA+E,iCAAmB;AAClG,0GAA0G,iCAAmB;AAC7H,6GAA6G,iCAAmB;AAChI,sFAAsF,iCAAmB;AACzG,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;AAC1F,oEAAoE,iCAAmB;;;;;;;;AAQvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,4BAA4B;AACpD;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,wEAAwE,iCAAmB;AAC3F,4EAA4E,iCAAmB;AAC/F,4FAA4F,iCAAmB;;;;;AAK/G;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;AAGD,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yEAAyE,iCAAmB;AAC5F,+DAA+D,iCAAmB;AAClF,+DAA+D,iCAAmB;AAClF,uEAAuE,iCAAmB;AAC1F,oEAAoE,iCAAmB;AACvF,4FAA4F,iCAAmB;;;;;;AAM/G;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oBAAoB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oBAAoB;;;AAGrB,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA,mBAAmB,gCAAgC;AACnD;AACA;AACA,4DAA4D,mCAAmC;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,wCAAwC;;;AAGzC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,8DAA8D,iCAAmB;AACjF,uEAAuE,iCAAmB;AAC1F,qEAAqE,iCAAmB;;;;;;AAMxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4CAA4C;AAC7C;AACA,kDAAkD,uBAAuB;AACzE;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,uBAAuB;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uBAAuB;AACvC;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;;AAExF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,mEAAmE,iCAAmB;AACtF,uEAAuE,iCAAmB;AAC1F,gFAAgF,iCAAmB;AACnG,8DAA8D,iCAAmB;AACjF,uEAAuE,iCAAmB;AAC1F,sFAAsF,iCAAmB;;;;;;;;AAQzG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,2BAA2B;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,qBAAqB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oCAAoC;AAC5D,4BAA4B,qBAAqB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6EAA6E;AAC7E;AACA,uDAAuD;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oCAAoC;AAC5D,4BAA4B,qBAAqB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA,mCAAmC,qBAAqB;AACxD;AACA,iCAAiC,uBAAuB,GAAG,sBAAsB;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;AAC3C;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,cAAc;AACnD;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,oEAAoE,iCAAmB;AACvF,+DAA+D,iCAAmB;;;AAGlF;AACA;AACA,gDAAgD,gBAAgB;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2EAA2E,2BAA2B;AACtG,iCAAiC,oBAAoB,YAAY;AACjE;AACA;AACA;AACA,4EAA4E,2BAA2B;AACvG,iCAAiC,mBAAmB,uDAAuD;AAC3G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,oBAAoB;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,wBAAwB;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uEAAuE,0BAA0B;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,mGAAmG,iCAAmB;AACtH,4GAA4G,iCAAmB;AAC/H,wGAAwG,iCAAmB;;;;AAI3H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,2GAA2G,iCAAmB;AAC9H,sFAAsF,iCAAmB;AACzG,+EAA+E,iCAAmB;AAClG,gFAAgF,iCAAmB;AACnG,sFAAsF,iCAAmB;AACzG,qEAAqE,iCAAmB;AACxF,mEAAmE,iCAAmB;AACtF,iFAAiF,iCAAmB;AACpG,mFAAmF,iCAAmB;AACtG,gGAAgG,iCAAmB;AACnH,oFAAoF,iCAAmB;AACvG,6EAA6E,iCAAmB;AAChG,yFAAyF,iCAAmB;AAC5G,0EAA0E,iCAAmB;AAC7F,yEAAyE,iCAAmB;;;;;;;;;;;;;;;AAe5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gCAAgC;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mHAAmH,0CAA0C;AAC7J;AACA;AACA,+DAA+D,mBAAmB;AAClF;AACA;AACA;AACA,8DAA8D,gBAAgB;AAC9E;AACA;AACA;AACA,+DAA+D,GAAG,IAAI,8GAA8G;AACpL;AACA;AACA;AACA,iEAAiE,KAAK;AACtE;AACA;AACA;AACA;AACA,oEAAoE,8EAA8E;AAClJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4EAA4E,gBAAgB;AAC5F;AACA;AACA;AACA,2EAA2E,mBAAmB;AAC9F;AACA;AACA;AACA,iEAAiE,UAAU;AAC3E;AACA;AACA;AACA,mEAAmE,iBAAiB;AACpF;AACA;AACA;AACA,qEAAqE,+CAA+C;AACpH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D,uBAAuB;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8GAA8G,qCAAqC;AACnJ;AACA,iFAAiF,kBAAkB;AACnG;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0GAA0G,qCAAqC;AAC/I;AACA,6EAA6E,sBAAsB;AACnG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,kBAAkB;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,oEAAoE,iCAAmB;AACvF,qEAAqE,iCAAmB;;;;;;AAMxF,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,kEAAkE,iCAAmB;AACrF,oEAAoE,iCAAmB;AACvF,qEAAqE,iCAAmB;;;;AAIxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,6BAA6B,GAAG;AAChD,iCAAiC,QAAQ;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,uEAAuE,iCAAmB;AAC1F,yEAAyE,iCAAmB;AAC5F,4EAA4E,iCAAmB;AAC/F,mEAAmE,iCAAmB;AACtF,+EAA+E,iCAAmB;AAClG,qEAAqE,iCAAmB;AACxF,sEAAsE,iCAAmB;AACzF,+DAA+D,iCAAmB;AAClF,mEAAmE,iCAAmB;;;;;;;;;;AAUtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yFAAyF;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,uEAAuE,iCAAmB;AAC1F,+DAA+D,iCAAmB;AAClF,gEAAgE,iCAAmB;AACnF,kEAAkE,iCAAmB;AACrF,gEAAgE,iCAAmB;AACnF,sEAAsE,iCAAmB;;;;;;;AAOzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,eAAe;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,sBAAsB;AAC1C,oBAAoB,uCAAuC;AAC3D,gDAAgD,sCAAsC;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uFAAuF,IAAI;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2EAA2E,YAAY;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,kBAAkB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,iHAAiH;AAClI,iBAAiB,mHAAmH;AACpI;AACA;AACA;AACA,gBAAgB,gDAAgD;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,QAAQ;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,kEAAkE,iCAAmB;AACrF,oEAAoE,iCAAmB;;;;AAIvF;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,iCAAiC,QAAQ;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,uEAAuE,iCAAmB;AAC1F,yEAAyE,iCAAmB;AAC5F,oEAAoE,iCAAmB;AACvF,mEAAmE,iCAAmB;AACtF,sEAAsE,iCAAmB;AACzF,uEAAuE,iCAAmB;AAC1F,kEAAkE,iCAAmB;AACrF,qEAAqE,iCAAmB;;;;;;;;;;AAUxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,iBAAiB,mBAAmB,mBAAmB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA,8EAA8E;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,4DAA4D;AAChF;AACA;AACA;AACA;AACA,gEAAgE,0BAA0B;AAC1F,+DAA+D,0BAA0B;AACzF;AACA;AACA,gEAAgE,yCAAyC;AACzG,+DAA+D,gDAAgD;AAC/G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oFAAoF;AACpF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,kEAAkE,iCAAmB;AACrF,oEAAoE,iCAAmB;AACvF,qEAAqE,iCAAmB;AACxF,8EAA8E,iCAAmB;AACjG,0EAA0E,iCAAmB;;;;;;AAM7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,6BAA6B,GAAG;AAChD;AACA,6BAA6B,QAAQ;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,+EAA+E,iCAAmB;AAClG,+EAA+E,iCAAmB;AAClG,kEAAkE,iCAAmB;AACrF,0EAA0E,iCAAmB;AAC7F,qEAAqE,iCAAmB;AACxF,mEAAmE,iCAAmB;AACtF,8EAA8E,iCAAmB;AACjG,wEAAwE,iCAAmB;AAC3F,kEAAkE,iCAAmB;;;;;;;;;;AAUrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,QAAQ;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D,WAAW;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE,WAAW;AAC3E;AACA;AACA;AACA,gEAAgE,WAAW;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,oEAAoE,iCAAmB;AACvF,mEAAmE,iCAAmB;AACtF,mEAAmE,iCAAmB;AACtF,+DAA+D,iCAAmB;AAClF,kEAAkE,iCAAmB;AACrF,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;;;;;;;;;;AAU1F,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,0DAA0D,iCAAmB;AAC7E,qEAAqE,iCAAmB;AACxF,sEAAsE,iCAAmB;AACzF,6EAA6E,iCAAmB;AAChG,+DAA+D,iCAAmB;AAClF,kEAAkE,iCAAmB;AACrF,iEAAiE,iCAAmB;AACpF,iFAAiF,iCAAmB;AACpG,0EAA0E,iCAAmB;AAC7F,uEAAuE,iCAAmB;AAC1F,iEAAiE,iCAAmB;AACpF,kEAAkE,iCAAmB;AACrF,gEAAgE,iCAAmB;AACnF,gEAAgE,iCAAmB;AACnF,uFAAuF,iCAAmB;AAC1G,4EAA4E,iCAAmB;AAC/F,sEAAsE,iCAAmB;AACzF,mEAAmE,iCAAmB;AACtF,mEAAmE,iCAAmB;AACtF,mEAAmE,iCAAmB;AACtF,mEAAmE,iCAAmB;AACtF,qEAAqE,iCAAmB;AACxF,6EAA6E,iCAAmB;AAChG,uFAAuF,iCAAmB;AAC1G,sEAAsE,iCAAmB;AACzF,4EAA4E,iCAAmB;AAC/F,0EAA0E,iCAAmB;AAC7F,kFAAkF,iCAAmB;AACrG,iEAAiE,iCAAmB;AACpF,2EAA2E,iCAAmB;AAC9F,oEAAoE,iCAAmB;;;;;;;AAOvF;;;;;;;;;;;;;;;;;;;;;;;AAuBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oDAAoD;AACrD;AACA;AACA;AACA,QAAQ,iBAAiB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA;AACA;AACA,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA;AACA;AACA,oBAAoB,gBAAgB,kBAAkB,2BAA2B;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,sBAAsB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,uBAAuB;AAClE;AACA,qDAAqD,uBAAuB;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,0CAA0C,0BAA0B,cAAc,oBAAoB,eAAe,kBAAkB,kBAAkB;AAChN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wGAAwG,wBAAwB;AAChI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,uGAAuG;AACtH;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,qFAAqF,UAAU;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oHAAoH,+CAA+C;AACnK;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,QAAQ;AACxB,cAAc,+BAA+B;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,6BAA6B;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oHAAoH,+CAA+C;AACnK;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,gBAAgB,QAAQ,sBAAsB;AAC7D,8CAA8C,sBAAsB;AACpE;AACA;AACA;AACA;AACA;AACA,kBAAkB,gBAAgB,UAAU,sBAAsB;AAClE,iDAAiD,sBAAsB;AACvE;AACA;AACA;AACA;AACA;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,oBAAoB;AACnD,uCAAuC,gCAAgC;AACvE,mCAAmC,iCAAiC;AACpE;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,gCAAgC;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,gCAAgC;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,kCAAkC;AAC9E,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,mBAAmB,WAAW,iBAAiB,aAAa,eAAe,MAAM,iBAAiB;AAC9H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,gBAAgB,uDAAuD;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,mEAAmE,iCAAmB;;;AAGtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,0EAA0E,iCAAmB;AAC7F,wEAAwE,iCAAmB;AAC3F,mEAAmE,iCAAmB;AACtF,yEAAyE,iCAAmB;AAC5F,kEAAkE,iCAAmB;;;;;;AAMrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,0CAA0C;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6EAA6E,+DAA+D;AAC5I;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mEAAmE,iCAAmB;AACtF,yEAAyE,iCAAmB;AAC5F,gEAAgE,iCAAmB;AACnF,sEAAsE,iCAAmB;AACzF,mEAAmE,iCAAmB;AACtF,kEAAkE,iCAAmB;;;;;;;;AAQrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,QAAQ;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,oCAAoC;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,IAAI;AAChB;AACA;AACA;AACA,oGAAoG,qBAAqB;AACzH;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,yBAAyB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,QAAQ;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,sBAAsB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,uBAAuB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE,IAAI;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D,IAAI;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE,IAAI;AACtE;AACA;AACA;AACA;AACA;AACA,wGAAwG,IAAI;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0GAA0G,IAAI;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,mEAAmE,iCAAmB;;;AAGtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,oCAAoC;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,oCAAoC;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,6CAA6C;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,oCAAoC;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,QAAQ;AACvD;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yEAAyE,iCAAmB;;AAE5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,kEAAkE,iCAAmB;;;AAGrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,kEAAkE,iCAAmB;;AAErF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gCAAgC;AACjC;AACA,iBAAiB,iBAAiB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,mEAAmE,iCAAmB;;;AAGtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,QAAQ;AACtD;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yEAAyE,iCAAmB;;AAE5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,sEAAsE,iCAAmB;AACzF,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;;;;;;AAM1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mEAAmE,iCAAmB;AACtF,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,+DAA+D,iCAAmB;AAClF,kEAAkE,iCAAmB;AACrF,sEAAsE,iCAAmB;AACzF,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,+DAA+D,iCAAmB;AAClF,kEAAkE,iCAAmB;AACrF,wFAAwF,iCAAmB;AAC3G,qFAAqF,iCAAmB;;;;;;;;;;;;;;;;AAgBxG,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,kBAAkB;AAC9C;AACA;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gCAAgC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,mBAAmB;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE,mBAAmB;AACrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,mBAAmB,oDAAoD,kBAAkB;AACvH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,mBAAmB,oDAAoD,kBAAkB;AACrH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,iBAAiB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,iBAAiB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,0BAA0B;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,0BAA0B;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,0BAA0B;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,0BAA0B;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,eAAe,GAAG,eAAe,OAAO,iBAAiB;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,gBAAgB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,gBAAgB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,gBAAgB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,gBAAgB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,gBAAgB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,gBAAgB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA,6FAA6F,iBAAiB;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+EAA+E,iBAAiB;AAChG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gFAAgF,iBAAiB;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA,sBAAsB;AACtB,iEAAiE,iCAAmB;AACpF,kEAAkE,iCAAmB;AACrF,mEAAmE,iCAAmB;AACtF,sEAAsE,iCAAmB;;;;;AAKzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gDAAgD;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,8CAA8C;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,2BAA2B,IAAI;AACvE;AACA,kCAAkC,qBAAqB,OAAO;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,MAAM;AACpD;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,qBAAqB;AACxD,qBAAqB;AACrB;AACA;AACA;AACA,wDAAwD,IAAI;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gGAAgG,0BAA0B;AAC1H;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,SAAS;AACT;AACA;AACA,kBAAkB,oBAAoB,QAAQ,sBAAsB;AACpE;AACA;AACA;AACA,wDAAwD,IAAI;AAC5D;AACA;AACA;AACA;AACA,WAAW,qCAAqC,uBAAuB;AACvE,WAAW,0BAA0B;AACrC,WAAW,WAAW;AACtB,WAAW;AACX;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,gGAAgG;AAChH;AACA;AACA;AACA,oBAAoB,0BAA0B;AAC9C;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,gGAAgG,EAAE,IAAI,EAAE;AACxG;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,sCAAsC;AAClD,QAAQ,8BAA8B;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,iCAAiC,qBAAqB,gBAAgB;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,mDAAmD;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,0DAA0D;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;;AAEnF;AACA,aAAa,kBAAkB,yDAAyD,kCAAkC;AAC1H;AACA,QAAQ,iBAAiB;AACzB,WAAW,mCAAmC;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,mEAAmE,iCAAmB;AACtF,gEAAgE,iCAAmB;;;AAGnF;AACA,aAAa,kBAAkB,4BAA4B;AAC3D;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mHAAmH;AACnH,kGAAkG;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,mEAAmE,iCAAmB;;AAEtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,qEAAqE,iCAAmB;AACxF,6EAA6E,iCAAmB;AAChG,oEAAoE,iCAAmB;;;;;AAKvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,wDAAwD;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,iEAAiE;AACvG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,oGAAoG;AACpH;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,oBAAoB;AACpB;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,sEAAsE,iCAAmB;AACzF,yEAAyE,iCAAmB;AAC5F,qEAAqE,iCAAmB;AACxF,+DAA+D,iCAAmB;AAClF,qEAAqE,iCAAmB;AACxF,kEAAkE,iCAAmB;AACrF,oEAAoE,iCAAmB;AACvF,wEAAwE,iCAAmB;AAC3F,wEAAwE,iCAAmB;AAC3F,sFAAsF,iCAAmB;AACzG,wFAAwF,iCAAmB;AAC3G,kGAAkG,iCAAmB;AACrH,wFAAwF,iCAAmB;AAC3G,gGAAgG,iCAAmB;AACnH,0FAA0F,iCAAmB;AAC7G,mEAAmE,iCAAmB;AACtF,mEAAmE,iCAAmB;AACtF,mEAAmE,iCAAmB;AACtF,8FAA8F,iCAAmB;AACjH,iEAAiE,iCAAmB;AACpF,8FAA8F,iCAAmB;AACjH,8FAA8F,iCAAmB;AACjH,+DAA+D,iCAAmB;;;;;;;;;;AAUlF;;;;;;;;;;;;;;;AAeA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,wDAAwD;AAC1G,kJAAkJ,gBAAgB;AAClK,mKAAmK,gBAAgB;AACnL,oKAAoK,gBAAgB;AACpL,mJAAmJ,gBAAgB;AACnK;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,iEAAiE;AACvG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,2OAA2O;AAC3P;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,IAAI;AAChB;AACA,mFAAmF;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,aAAa;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,cAAc;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,oBAAoB;AACpB;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gFAAgF,mCAAmC;AACnH;AACA;AACA;AACA;AACA,gBAAgB,+BAA+B;AAC/C;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,4BAA4B;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,kCAAkC;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,gCAAgC,yBAAyB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iCAAiC;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,qEAAqE,iCAAmB;AACxF,6EAA6E,iCAAmB;AAChG,uFAAuF,iCAAmB;AAC1G,2EAA2E,iCAAmB;AAC9F,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;AAC1F,mFAAmF,iCAAmB;AACtG,mFAAmF,iCAAmB;;;;;;;;;;;AAWtG;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,oEAAoE,iCAAmB;AACvF,qEAAqE,iCAAmB;AACxF,wEAAwE,iCAAmB;;;;;AAK3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,4EAA4E,iCAAmB;AAC/F,+DAA+D,iCAAmB;;;AAGlF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,mEAAmE,iCAAmB;AACtF,8EAA8E,iCAAmB;AACjG,qEAAqE,iCAAmB;AACxF,kEAAkE,iCAAmB;AACrF,uFAAuF,iCAAmB;AAC1G,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,oEAAoE,iCAAmB;AACvF,qFAAqF,iCAAmB;AACxG,qFAAqF,iCAAmB;AACxG,YAAY,QAAQ;AACpB,YAAY,sBAAsB;;;;;;;;;;;;AAYlC;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA,kEAAkE,EAAE,KAAK;AACzE;AACA;AACA,0EAA0E,EAAE,KAAK;AACjF;AACA,wEAAwE,EAAE,OAAO;AACjF,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sGAAsG;AACtG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,oEAAoE,iCAAmB;AACvF,mEAAmE,iCAAmB;AACtF,8EAA8E,iCAAmB;AACjG,qEAAqE,iCAAmB;AACxF,mEAAmE,iCAAmB;AACtF,wFAAwF,iCAAmB;AAC3G,2EAA2E,iCAAmB;AAC9F,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;AAC1F,oEAAoE,iCAAmB;AACvF,kFAAkF,iCAAmB;AACrG,kFAAkF,iCAAmB;;;;;;;;;;;;;;;AAerG;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA,iEAAiE,EAAE,KAAK;AACxE;AACA;AACA,yEAAyE,EAAE,KAAK;AAChF;AACA,wGAAwG;AACxG,wEAAwE,EAAE,OAAO;AACjF,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sGAAsG;AACtG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,0EAA0E,iCAAmB;AAC7F,4EAA4E,iCAAmB;AAC/F,0DAA0D,iCAAmB;AAC7E,0DAA0D,iCAAmB;AAC7E,0DAA0D,iCAAmB;AAC7E,6EAA6E,iCAAmB;;;;;;AAMhG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,iCAAmB;AACxF,mEAAmE,iCAAmB;AACtF,6EAA6E,iCAAmB;AAChG,qEAAqE,iCAAmB;AACxF,kEAAkE,iCAAmB;AACrF,2EAA2E,iCAAmB;AAC9F,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;;;;;;;;;AAS1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,uFAAuF,iCAAmB;AAC1G,kEAAkE,iCAAmB;AACrF,qEAAqE,iCAAmB;AACxF,mEAAmE,iCAAmB;AACtF,kEAAkE,iCAAmB;;;;;;;AAOrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,qEAAqE;AACrF;AACA;AACA;AACA;AACA;AACA,oCAAoC,MAAM;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,MAAM;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,uBAAuB,kCAAkC,UAAU;AAC7H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,aAAa,cAAc,WAAW;AAC3F;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,WAAW;AAC/C;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,iCAAmB;AACnF,8EAA8E,iCAAmB;AACjG,gFAAgF,iCAAmB;AACnG,qEAAqE,iCAAmB;AACxF,+DAA+D,iCAAmB;AAClF,qEAAqE,iCAAmB;AACxF,kEAAkE,iCAAmB;AACrF,mEAAmE,iCAAmB;AACtF,6EAA6E,iCAAmB;;;;;;;;;;AAUhG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,2EAA2E,iCAAmB;AAC9F,6EAA6E,iCAAmB;AAChG,uFAAuF,iCAAmB;AAC1G,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;AAC1F,6EAA6E,iCAAmB;;;;;;;;AAQhG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,0DAA0D,iCAAmB;;AAE7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oEAAoE;AACpE;AACA;AACA;AACA;AACA,mGAAmG,eAAe,oBAAoB,cAAc;AACpJ;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,iCAAmB;AAClF,qEAAqE,iCAAmB;AACxF,6EAA6E,iCAAmB;AAChG,uFAAuF,iCAAmB;AAC1G,2EAA2E,iCAAmB;AAC9F,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;AAC1F,sFAAsF,iCAAmB;AACzG,sFAAsF,iCAAmB;;;;;;;;;;;AAWzG;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,uEAAuE,iCAAmB;;AAE1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,4EAA4E,iCAAmB;AAC/F,8EAA8E,iCAAmB;AACjG,gEAAgE,iCAAmB;AACnF,uEAAuE,iCAAmB;AAC1F,uEAAuE,iCAAmB;;;;;;AAM1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,iCAAmB;;AAEzE,iCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,iCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,0DAA0D,iCAAmB;AAC7E,oEAAoE,iCAAmB;;;AAGvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,6DAA6D;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,iBAAiB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,iBAAiB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,gBAAgB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,gBAAgB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,iBAAiB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,iBAAiB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wEAAwE,YAAY,GAAG,KAAK;AAC5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,YAAY,GAAG,MAAM;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,YAAY,GAAG,KAAK;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,8BAA8B;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,OAAO;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,UAAU,aAAa,UAAU,EAAE,+CAA+C;AAC/H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C,0BAA0B,MAAM,IAAI,SAAS,EAAE,yCAAyC;AACxF;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,+DAA+D,kCAAmB;AAClF,yEAAyE,kCAAmB;;;AAG5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,mEAAmE,kCAAmB;AACtF,kEAAkE,kCAAmB;;;;AAIrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE,MAAM;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,oBAAoB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,sBAAsB,IAAI;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,qBAAqB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,YAAY;AAClE,oBAAoB,gCAAgC,GAAG,gCAAgC;AACvF;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,YAAY;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yEAAyE;AACzE;AACA;AACA,2BAA2B;AAC3B;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,4EAA4E,kCAAmB;AAC/F,yEAAyE,kCAAmB;;;AAG5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uBAAuB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,0DAA0D,kCAAmB;AAC7E,oEAAoE,kCAAmB;;;AAGvF;AACA,wDAAwD,sBAAsB;AAC9E;AACA;AACA,4DAA4D,sBAAsB;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,yDAAyD;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,cAAc,OAAO,aAAa;AAC1F,mEAAmE,0BAA0B;AAC7F;AACA;AACA,8DAA8D,cAAc,OAAO,aAAa;AAChG;AACA,qFAAqF,aAAa;AAClG;AACA,4DAA4D,aAAa;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,gFAAgF,aAAa,IAAI,aAAa;AAC9G,8DAA8D,YAAY,MAAM,0BAA0B;AAC1G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,oBAAoB;AAChF,qBAAqB,qCAAqC;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,UAAU;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,UAAU;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,wBAAwB,YAAY;AACpC;AACA,kDAAkD,EAAE,KAAK;AACzD;AACA;AACA,0DAA0D,EAAE,KAAK;AACjE;AACA,2DAA2D;AAC3D,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,kCAAmB;;AAElF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,gCAAgC,uBAAuB;AACvD;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,wBAAwB;AACxD;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,gBAAgB,4BAA4B;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gBAAgB,kBAAkB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,OAAO;AACpD,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yFAAyF,kCAAmB;;AAE5G;AACA;AACA;AACA,wDAAwD,2BAA2B,IAAI;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,wCAAwC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yEAAyE,kCAAmB;AAC5F,+DAA+D,kCAAmB;AAClF,oEAAoE,kCAAmB;AACvF,iEAAiE,kCAAmB;AACpF,mEAAmE,kCAAmB;AACtF,0EAA0E,kCAAmB;AAC7F,mEAAmE,kCAAmB;;;;;;;;AAQtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA,wBAAwB;AACxB;AACA,2DAA2D,iCAAiC;AAC5F;AACA,kFAAkF;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,kBAAkB,YAAY,EAAE,yBAAyB,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY;AAChG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,0EAA0E,kCAAmB;;;AAG7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE,kBAAkB;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4BAA4B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,8BAA8B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD;AACA,gEAAgE;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,8BAA8B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,8BAA8B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,8BAA8B;;;AAG/B,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+EAA+E,kCAAmB;AAClG,+DAA+D,kCAAmB;AAClF,uEAAuE,kCAAmB;AAC1F,+FAA+F,kCAAmB;;;;;AAKlH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,kCAAkC;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,gCAAgC;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,+EAA+E,kCAAmB;AAClG,oEAAoE,kCAAmB;AACvF,4EAA4E,kCAAmB;;;;;AAK/F;AACA,qFAAqF,kCAAkC;AACvH,IAAI,gBAAgB,GAAG,mBAAmB,GAAG,uBAAuB,GAAG,gBAAgB,GAAG,mBAAmB,GAAG,gBAAgB,OAAO,kBAAkB;AACzJ,IAAI,kBAAkB;AACtB;AACA,yDAAyD,6BAA6B;AACtF,qEAAqE,2BAA2B,KAAK;AACrG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8FAA8F;AAC9F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,6BAA6B;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,iEAAiE,kCAAmB;AACpF,yEAAyE,kCAAmB;AAC5F,yFAAyF,kCAAmB;AAC5G,kEAAkE,kCAAmB;AACrF,2EAA2E,kCAAmB;AAC9F,+EAA+E,kCAAmB;AAClG,gFAAgF,kCAAmB;AACnG,gEAAgE,kCAAmB;AACnF,8DAA8D,kCAAmB;;;;;;;;;;;AAWjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA,gBAAgB,2IAA2I;AAC3J;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,kBAAkB;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,eAAe,yDAAyD,+DAA+D;AACpL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,iEAAiE,kCAAmB;AACpF,mEAAmE,kCAAmB;AACtF,yEAAyE,kCAAmB;AAC5F,kEAAkE,kCAAmB;;;;;;AAMrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kCAAkC;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wHAAwH,uBAAuB;AAC/I;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,2EAA2E,kCAAmB;AAC9F,qEAAqE,kCAAmB;AACxF,6GAA6G,kCAAmB;AAChI,+EAA+E,kCAAmB;AAClG,gFAAgF,kCAAmB;AACnG,uEAAuE,kCAAmB;AAC1F,2EAA2E,kCAAmB;AAC9F,0EAA0E,kCAAmB;AAC7F,kFAAkF,kCAAmB;AACrG,mEAAmE,kCAAmB;AACtF,gEAAgE,kCAAmB;AACnF,wEAAwE,kCAAmB;AAC3F,iFAAiF,kCAAmB;AACpG,kEAAkE,kCAAmB;;;;;;;;;;;;;;AAcrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,gDAAgD;AACrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,4EAA4E,kCAAmB;AAC/F,gEAAgE,kCAAmB;AACnF,kEAAkE,kCAAmB;AACrF,mEAAmE,kCAAmB;AACtF,qEAAqE,kCAAmB;AACxF,yFAAyF,kCAAmB;AAC5G,kEAAkE,kCAAmB;;;;;;;;AAQrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,iCAAiC,IAAI,uBAAuB;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,cAAc;AACjH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,6CAA6C,uBAAuB;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,UAAU,gBAAgB,cAAc;AAClG;AACA;AACA,yFAAyF;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+EAA+E,kCAAmB;AAClG,+DAA+D,kCAAmB;AAClF,iEAAiE,kCAAmB;;;;AAIpF;AACA;AACA;AACA;AACA;AACA,gBAAgB,+BAA+B;AAC/C;AACA;AACA;AACA;AACA;AACA,gBAAgB,gBAAgB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,iEAAiE,kCAAmB;AACpF,kEAAkE,kCAAmB;AACrF,qEAAqE,kCAAmB;;;;AAIxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4CAA4C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,eAAe;AACvC,4BAA4B,eAAe;AAC3C,sBAAsB,yBAAyB;AAC/C;AACA;AACA,mBAAmB,yBAAyB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,qBAAqB;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,2EAA2E,kCAAmB;AAC9F,gEAAgE,kCAAmB;AACnF,6GAA6G,kCAAmB;AAChI,sFAAsF,kCAAmB;AACzG,2EAA2E,kCAAmB;AAC9F,qEAAqE,kCAAmB;AACxF,0EAA0E,kCAAmB;AAC7F,+EAA+E,kCAAmB;;;;;;;;;AASlG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gCAAgC;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yFAAyF,kCAAmB;AAC5G,qEAAqE,kCAAmB;;;AAGxF;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,mEAAmE,kCAAmB;AACtF,qEAAqE,kCAAmB;AACxF,gEAAgE,kCAAmB;;;;AAInF;AACA,cAAc,kBAAkB,uCAAuC;AACvE;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA,CAAC,gDAAgD;;;AAGjD,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,mFAAmF,kCAAmB;AACtG,4EAA4E,kCAAmB;AAC/F,sEAAsE,kCAAmB;;;;AAIzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,wEAAwE,kCAAmB;AAC3F,+EAA+E,kCAAmB;AAClG,+EAA+E,kCAAmB;;;;;AAKlG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,IAAI;AAChB;AACA;AACA,oDAAoD,eAAe;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iEAAiE,kCAAmB;AACpF,+DAA+D,kCAAmB;AAClF,qEAAqE,kCAAmB;AACxF,+EAA+E,kCAAmB;AAClG,oEAAoE,kCAAmB;AACvF,mEAAmE,kCAAmB;;;;;;;AAOtF;AACA;AACA,IAAI,kCAAkC;AACtC;AACA,oCAAoC,yBAAyB;AAC7D;AACA;AACA;AACA;AACA,iEAAiE,YAAY,yBAAyB;AACtG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,uBAAuB,aAAa,uBAAuB;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;;AAEnF;AACA,gBAAgB,kBAAkB,+BAA+B;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iEAAiE,kCAAmB;AACpF,kEAAkE,kCAAmB;;;AAGrF;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,gBAAgB;AAChC,uFAAuF;AACvF,mFAAmF;AACnF;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,2CAA2C;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,gBAAgB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,oBAAoB;AAC9C,wBAAwB,kBAAkB;AAC1C;AACA,SAAS;AACT;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,kEAAkE,kCAAmB;AACrF,iEAAiE,kCAAmB;AACpF,+EAA+E,kCAAmB;;;;;AAKlG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,sEAAsE;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,mCAAmC;AACrE;AACA;AACA;AACA;AACA;AACA,0EAA0E,OAAO,4BAA4B,SAAS;AACtH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,OAAO,cAAc,YAAY;AAC/G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;AACnF,qEAAqE,kCAAmB;;;AAGxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,sCAAsC,iCAAiC,sBAAsB;AACzG;AACA;AACA;AACA;AACA,gBAAgB,yBAAyB;AACzC;AACA;AACA;AACA;AACA;AACA,gHAAgH,iBAAiB;AACjI;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE,EAAE,IAAI,EAAE,QAAQ,GAAG,0BAA0B,kBAAkB;AAClI;AACA;AACA,mEAAmE,EAAE,IAAI,EAAE,QAAQ,GAAG,0BAA0B,eAAe;AAC/H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,EAAE,IAAI,EAAE;AAC3D;AACA;AACA;AACA,kDAAkD,sBAAsB;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE,EAAE,IAAI,EAAE,QAAQ,GAAG,0BAA0B,kBAAkB;AAClI;AACA;AACA,mEAAmE,EAAE,IAAI,EAAE,QAAQ,GAAG,0BAA0B,eAAe;AAC/H;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,EAAE,IAAI,EAAE;AAC3D;AACA;AACA,mDAAmD,qBAAqB;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,iCAAiC,SAAS;AAC1C;AACA;AACA,qCAAqC,sBAAsB;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,eAAe,gDAAgD,aAAa,yBAAyB;AACrH,iCAAiC;AACjC,iCAAiC;AACjC,wBAAwB,UAAU;AAClC,4BAA4B,UAAU;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,gCAAgC;AAChC,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iEAAiE,kCAAmB;AACpF,+DAA+D,kCAAmB;AAClF,8DAA8D,kCAAmB;;;;AAIjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,gBAAgB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,gBAAgB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;AACnF,mEAAmE,kCAAmB;AACtF,qEAAqE,kCAAmB;AACxF,oEAAoE,kCAAmB;AACvF,qEAAqE,kCAAmB;;;;;;AAMxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,uBAAuB;AACzD;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,+CAA+C;AAC/C,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,qEAAqE,kCAAmB;AACxF,gEAAgE,kCAAmB;AACnF,kEAAkE,kCAAmB;;;;;AAKrF;AACA;AACA;AACA;AACA;AACA,wBAAwB,8CAA8C;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,sBAAsB;AAChD;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gBAAgB,qCAAqC,IAAI;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,wEAAwE,kCAAmB;;AAE3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,sCAAsC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,iEAAiE,kCAAmB;AACpF,gEAAgE,kCAAmB;AACnF,qEAAqE,kCAAmB;AACxF,uEAAuE,kCAAmB;AAC1F,qEAAqE,kCAAmB;AACxF,mEAAmE,kCAAmB;AACtF,8DAA8D,kCAAmB;AACjF,2EAA2E,kCAAmB;AAC9F,gFAAgF,kCAAmB;AACnG,wEAAwE,kCAAmB;AAC3F,0EAA0E,kCAAmB;AAC7F,4EAA4E,kCAAmB;AAC/F,iEAAiE,kCAAmB;AACpF,iEAAiE,kCAAmB;AACpF,oEAAoE,kCAAmB;AACvF,kEAAkE,kCAAmB;AACrF,+DAA+D,kCAAmB;AAClF,qEAAqE,kCAAmB;AACxF,+DAA+D,kCAAmB;AAClF,oEAAoE,kCAAmB;AACvF,qEAAqE,kCAAmB;AACxF,iEAAiE,kCAAmB;AACpF,oEAAoE,kCAAmB;AACvF,sEAAsE,kCAAmB;AACzF,yEAAyE,kCAAmB;AAC5F,2FAA2F,kCAAmB;AAC9G,mGAAmG,kCAAmB;AACtH,gGAAgG,kCAAmB;AACnH,sGAAsG,kCAAmB;AACzH,6EAA6E,kCAAmB;AAChG,qFAAqF,kCAAmB;AACxG,2FAA2F,kCAAmB;AAC9G,oGAAoG,kCAAmB;AACvH,iFAAiF,kCAAmB;AACpG,oEAAoE,kCAAmB;AACvF,mEAAmE,kCAAmB;AACtF,yEAAyE,kCAAmB;AAC5F,gFAAgF,kCAAmB;AACnG,gFAAgF,kCAAmB;AACnG,oFAAoF,kCAAmB;AACvG,2EAA2E,kCAAmB;AAC9F,gEAAgE,kCAAmB;AACnF,6EAA6E,kCAAmB;AAChG;;;;;;;;AAQA;;;;;;AAMA;;;;;;;;;;;;;;;;;AAiBA;;;AAGA;;;;;;;;AAQA;;;;;;;AAOA;;AAEA;;;;;AAKA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA,aAAa;AACb;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;AACnF,sEAAsE,kCAAmB;;;AAGzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,qBAAqB;AACjF;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA,6DAA6D,SAAS;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,SAAS;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,SAAS;AACvD;AACA;AACA;AACA;AACA,2CAA2C,SAAS;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oEAAoE;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,+BAA+B;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,0BAA0B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oBAAoB;;;AAGrB,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iEAAiE,kCAAmB;AACpF,qEAAqE,kCAAmB;AACxF,kEAAkE,kCAAmB;AACrF,8EAA8E,kCAAmB;;;;;AAKjG;AACA;AACA;AACA,gBAAgB,yCAAyC;AACzD;AACA;AACA;AACA,6BAA6B,iBAAiB;AAC9C,6BAA6B,iBAAiB;AAC9C;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C,8CAA8C;AAC9C,4CAA4C;AAC5C,8CAA8C;AAC9C;AACA,+BAA+B,SAAS;AACxC,+BAA+B,SAAS;AACxC,+BAA+B,SAAS;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,gEAAgE,kCAAmB;AACnF,qEAAqE,kCAAmB;AACxF,sEAAsE,kCAAmB;;;;;AAKzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oBAAoB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB,gBAAgB,kBAAkB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kDAAkD;;;AAGnD,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,sEAAsE,kCAAmB;AACzF,iFAAiF,kCAAmB;;;;AAIpG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,sCAAsC;;;AAGvC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yFAAyF,kCAAmB;;AAE5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;AACnF,iFAAiF,kCAAmB;AACpG,qEAAqE,kCAAmB;AACxF,sEAAsE,kCAAmB;AACzF,qEAAqE,kCAAmB;AACxF,4EAA4E,kCAAmB;AAC/F,wEAAwE,kCAAmB;AAC3F,wEAAwE,kCAAmB;AAC3F,8EAA8E,kCAAmB;AACjG,uEAAuE,kCAAmB;AAC1F,oEAAoE,kCAAmB;AACvF,qEAAqE,kCAAmB;AACxF,qEAAqE,kCAAmB;AACxF,sEAAsE,kCAAmB;;;;;;;;;;;;;;;AAezF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE,SAAS;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,8BAA8B;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,yEAAyE,kCAAmB;;AAE5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,8BAA8B;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oCAAoC;;;AAGrC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+EAA+E,kCAAmB;AAClG,+EAA+E,kCAAmB;AAClG,+EAA+E,kCAAmB;AAClG,oFAAoF,kCAAmB;AACvG,0EAA0E,kCAAmB;AAC7F,0EAA0E,kCAAmB;AAC7F,4FAA4F,kCAAmB;AAC/G,yFAAyF,kCAAmB;;;;;;;AAO5G;AACA;AACA;AACA;AACA,0DAA0D,0BAA0B;AACpF,QAAQ,kBAAkB;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA,uHAAuH,WAAW;AAClI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,qBAAqB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA,8BAA8B,sBAAsB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kCAAkC;;;AAGnC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA,CAAC,wCAAwC;;;AAGzC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,6EAA6E,kCAAmB;AAChG,yEAAyE,kCAAmB;;;;;;;;;;AAU5F,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,uEAAuE,kCAAmB;AAC1F,kEAAkE,kCAAmB;AACrF,uEAAuE,kCAAmB;AAC1F,+DAA+D,kCAAmB;;;;;;AAMlF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,qBAAqB,2BAA2B,wBAAwB;AACpF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4EAA4E,4BAA4B;AACxG,gBAAgB,qDAAqD,IAAI;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,aAAa;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,uBAAuB;AACtC;AACA;AACA;AACA,eAAe,iBAAiB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,cAAc;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,YAAY;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;AACnF,8DAA8D,kCAAmB;AACjF,gEAAgE,kCAAmB;;;;AAInF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,WAAW;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,gBAAgB;AACpE,oDAAoD,gBAAgB;AACpE,oDAAoD,gBAAgB;AACpE,oDAAoD,gBAAgB;AACpE,0DAA0D,UAAU;AACpE,0DAA0D,UAAU;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,cAAc;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG,cAAc,EAAE,cAAc,EAAE,aAAa;AAChD,GAAG,cAAc,EAAE,cAAc,EAAE,aAAa;AAChD;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,8DAA8D,kCAAmB;;AAEjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,OAAO;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,WAAW;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C,4BAA4B,uBAAuB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA,6EAA6E;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gCAAgC;;;AAGjC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;AACnF,qEAAqE,kCAAmB;AACxF,gEAAgE,kCAAmB;AACnF,uEAAuE,kCAAmB;AAC1F,mEAAmE,kCAAmB;AACtF,qEAAqE,kCAAmB;AACxF,gEAAgE,kCAAmB;AACnF,4EAA4E,kCAAmB;AAC/F,sEAAsE,kCAAmB;AACzF,oEAAoE,kCAAmB;AACvF,8DAA8D,kCAAmB;AACjF,+DAA+D,kCAAmB;AAClF,uEAAuE,kCAAmB;AAC1F,+DAA+D,kCAAmB;AAClF,wEAAwE,kCAAmB;;;;;;;;;;;;;;;;;;AAkB3F,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,uEAAuE,kCAAmB;AAC1F,8DAA8D,kCAAmB;;;AAGjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,8DAA8D,kCAAmB;AACjF,gEAAgE,kCAAmB;;;;AAInF;AACA;AACA;AACA;AACA,CAAC,0CAA0C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,WAAW;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc;AACjE,GAAG,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc;AACjE,GAAG,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,cAAc;AAClE,GAAG,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,cAAc;AAClE;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oCAAoC;;;AAGrC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,uEAAuE,kCAAmB;AAC1F,8DAA8D,kCAAmB;AACjF,gEAAgE,kCAAmB;AACnF,qEAAqE,kCAAmB;AACxF,sEAAsE,kCAAmB;;;;;;AAMzF;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,4BAA4B,UAAU;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,4BAA4B,UAAU;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,uEAAuE,kCAAmB;AAC1F,8DAA8D,kCAAmB;;;AAGjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8FAA8F,mBAAmB;AACjH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6EAA6E;AAC7E,iCAAiC,uBAAuB;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,sBAAsB,IAAI,sBAAsB;AACvE;AACA,mBAAmB,OAAO,IAAI,OAAO;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kCAAkC;;;AAGnC,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,kCAAmB;AAClF,qEAAqE,kCAAmB;AACxF,mEAAmE,kCAAmB;AACtF,6EAA6E,kCAAmB;AAChG,oFAAoF,kCAAmB;AACvG,qEAAqE,kCAAmB;AACxF,qEAAqE,kCAAmB;AACxF,8DAA8D,kCAAmB;;;;;;;;;AASjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,wEAAwE,GAAG;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,0FAA0F,IAAI;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,mEAAmE,kCAAmB;AACtF,mEAAmE,kCAAmB;AACtF,qEAAqE,kCAAmB;AACxF,qEAAqE,kCAAmB;AACxF,qEAAqE,kCAAmB;;;;;;AAMxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,cAAc;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,QAAQ;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yGAAyG,SAAS;AAClH,2GAA2G,SAAS;AACpH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,+DAA+D,kCAAmB;AAClF,qEAAqE,kCAAmB;AACxF,qEAAqE,kCAAmB;AACxF,iFAAiF,kCAAmB;AACpG,mEAAmE,kCAAmB;AACtF,qEAAqE,kCAAmB;AACxF,mEAAmE,kCAAmB;AACtF,yEAAyE,kCAAmB;;;;;;;;;AAS5F;AACA;AACA;AACA,WAAW,gBAAgB;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,gIAAgI;AAChJ;AACA,uJAAuJ;AACvJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA,wEAAwE,sBAAsB,IAAI;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,4EAA4E,IAAI;AAChG,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kCAAkC;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,+BAA+B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,+DAA+D,kCAAmB;AAClF,qEAAqE,kCAAmB;AACxF,6GAA6G,kCAAmB;AAChI,oFAAoF,kCAAmB;AACvG,sFAAsF,kCAAmB;AACzG,+EAA+E,kCAAmB;AAClG,mEAAmE,kCAAmB;AACtF,+EAA+E,kCAAmB;AAClG,8EAA8E,kCAAmB;;;;;;;;;;AAUjG;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA,gBAAgB,uBAAuB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,QAAQ;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+FAA+F,4CAA4C;AAC3I;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,mCAAmC;AAC3C;AACA;AACA;AACA;AACA,QAAQ,kCAAkC;AAC1C;AACA;AACA;AACA,CAAC,8CAA8C;;;AAG/C,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,mEAAmE,kCAAmB;AACtF,yEAAyE,kCAAmB;AAC5F,4EAA4E,kCAAmB;AAC/F,6EAA6E,kCAAmB;;;;;;;;AAQhG,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,uEAAuE,kCAAmB;AAC1F,kEAAkE,kCAAmB;;;AAGrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,wBAAwB,IAAI;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,IAAI;AACjE;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,UAAU,gBAAgB,cAAc;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,aAAa;AACpC;AACA;AACA,sEAAsE,mDAAmD;AACzH;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,8EAA8E,kCAAmB;AACjG,4EAA4E,kCAAmB;AAC/F,8EAA8E,kCAAmB;;;;;AAKjG;AACA,QAAQ,kBAAkB;AAC1B,IAAI,kBAAkB,OAAO,mBAAmB,mCAAmC;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF,SAAS;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,oBAAoB,QAAQ;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,OAAO;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,OAAO;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,wBAAwB,UAAU;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,eAAe;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,aAAa;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;AACA,oDAAoD,aAAa;AACjE;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D;AAC/D,yDAAyD;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,UAAU;AAC7C,oDAAoD,cAAc;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,6BAA6B;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,MAAM,IAAI,MAAM,IAAI,MAAM;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,qEAAqE,kCAAmB;AACxF,6DAA6D,kCAAmB;AAChF,8DAA8D,kCAAmB;;;;;;;AAOjF,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,sEAAsE,kCAAmB;;;AAGzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,mBAAmB;AAC3B,6DAA6D,mBAAmB;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yGAAyG,UAAU;AACnH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,SAAS;AACT;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA,sBAAsB;AACtB,+DAA+D,kCAAmB;AAClF,sEAAsE,kCAAmB;AACzF,0EAA0E,kCAAmB;;;;;;AAM7F,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,wFAAwF,kCAAmB;AAC3G,kEAAkE,kCAAmB;AACrF,0EAA0E,kCAAmB;AAC7F,sEAAsE,kCAAmB;AACzF,4EAA4E,kCAAmB;AAC/F,oEAAoE,kCAAmB;AACvF,kEAAkE,kCAAmB;AACrF,sEAAsE,kCAAmB;;;;;;;;;AASzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,gBAAgB;AACxB,mDAAmD,gBAAgB,OAAO;AAC1E,sCAAsC,iBAAiB;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,WAAW;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,gBAAgB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,2EAA2E,kCAAmB;AAC9F,mEAAmE,kCAAmB;AACtF,sEAAsE,kCAAmB;AACzF,qEAAqE,kCAAmB;;;;;AAKxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,MAAM;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,+BAA+B,IAAI;AACnC;AACA;AACA;AACA;AACA;AACA,uDAAuD;AACvD;AACA;AACA;AACA,qBAAqB;AACrB;AACA,iBAAiB;AACjB;AACA,gCAAgC,2BAA2B;AAC3D;AACA;AACA,qBAAqB;AACrB;AACA,iBAAiB;AACjB;AACA,gCAAgC,MAAM;AACtC;AACA;AACA;AACA,qBAAqB;AACrB;AACA,iBAAiB;AACjB;AACA,gCAAgC,MAAM;AACtC;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,sBAAsB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA,sBAAsB;AACtB,wEAAwE,kCAAmB;AAC3F,iEAAiE,kCAAmB;AACpF,kEAAkE,kCAAmB;AACrF,gEAAgE,kCAAmB;AACnF,iEAAiE,kCAAmB;AACpF,gEAAgE,kCAAmB;AACnF,+DAA+D,kCAAmB;AAClF,oEAAoE,kCAAmB;AACvF,iEAAiE,kCAAmB;AACpF,uFAAuF,kCAAmB;AAC1G,qFAAqF,kCAAmB;AACxG,iFAAiF,kCAAmB;AACpG,oFAAoF,kCAAmB;AACvG,uFAAuF,kCAAmB;AAC1G,kFAAkF,kCAAmB;AACrG,4EAA4E,kCAAmB;AAC/F,8EAA8E,kCAAmB;AACjG,+EAA+E,kCAAmB;AAClG,wFAAwF,kCAAmB;AAC3G,mFAAmF,kCAAmB;AACtG,gFAAgF,kCAAmB;AACnG,sEAAsE,kCAAmB;AACzF,0EAA0E,kCAAmB;AAC7F,6EAA6E,kCAAmB;AAChG,iFAAiF,kCAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BpG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,2BAA2B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,YAAY,iBAAiB;AAC7B;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,oCAAoC;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,eAAe;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wGAAwG,IAAI;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yGAAyG,IAAI;AAC7G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sGAAsG,IAAI;AAC1G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uGAAuG,IAAI;AAC3G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,gBAAgB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kFAAkF,kFAAkF;AACpK;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E,sIAAsI;AAChN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,sBAAsB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,uBAAuB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,oBAAoB;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,qBAAqB;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE,gBAAgB;AACtF;AACA;AACA;AACA;AACA;AACA;AACA,qFAAqF,kFAAkF;AACvK;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,SAAS;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,gBAAgB;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4EAA4E,gBAAgB;AAC5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,gBAAgB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,iBAAiB,mCAAmC,gBAAgB;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oFAAoF,gBAAgB;AACpG;AACA;AACA;AACA;AACA,yCAAyC,gBAAgB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,QAAQ;AACvD;AACA;AACA,6CAA6C,QAAQ;AACrD;AACA;AACA;AACA;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,gBAAgB;AAClC,uCAAuC,sBAAsB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,eAAe;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA,4BAA4B,2BAA2B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,kEAAkE,kCAAmB;AACrF,yEAAyE,kCAAmB;AAC5F,mEAAmE,kCAAmB;AACtF,wGAAwG,kCAAmB;AAC3H,2GAA2G,kCAAmB;AAC9H,sEAAsE,kCAAmB;;;;;;;;AAQzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oGAAoG;AACpG;AACA;AACA;AACA;AACA;AACA,qGAAqG;AACrG;AACA;AACA;AACA;AACA;AACA,uDAAuD,sBAAsB;AAC7E;AACA;AACA,YAAY,6BAA6B;AACzC;AACA;AACA;AACA;AACA,uDAAuD,mBAAmB;AAC1E;AACA;AACA,YAAY,6BAA6B;AACzC;AACA;AACA;AACA;AACA,gCAAgC,8BAA8B;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6EAA6E;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kCAAkC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,uFAAuF;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+FAA+F,wBAAwB;AACvH;AACA;AACA,6FAA6F,YAAY;AACzG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,8EAA8E,sBAAsB,GAAG,uBAAuB,qBAAqB,gBAAgB;AACnK;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,eAAe;AAClH;AACA;AACA;AACA,sEAAsE,gBAAgB;AACtF,8CAA8C,gBAAgB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,8BAA8B,8BAA8B;AACzF,qDAAqD,gBAAgB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,4CAA4C,KAAK,8BAA8B,MAAM,4BAA4B;AAC/I;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,oCAAoC;AACpD;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,+DAA+D,kCAAmB;AAClF,6GAA6G,kCAAmB;AAChI,iFAAiF,kCAAmB;AACpG,0EAA0E,kCAAmB;;;;;;AAM7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,gBAAgB;AAC3B;AACA;AACA;AACA;AACA;AACA,gBAAgB,WAAW;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,yFAAyF,kCAAmB;;AAE5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,sFAAsF,kCAAmB;AACzG,6GAA6G,kCAAmB;AAChI,kFAAkF,kCAAmB;AACrG,+EAA+E,kCAAmB;;;;;AAKlG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gCAAgC;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,iFAAiF,kCAAmB;AACpG,+EAA+E,kCAAmB;AAClG,qFAAqF,kCAAmB;AACxG,iFAAiF,kCAAmB;AACpG,gGAAgG,kCAAmB;AACnH,qEAAqE,kCAAmB;AACxF,6GAA6G,kCAAmB;AAChI,sFAAsF,kCAAmB;AACzG,kEAAkE,kCAAmB;AACrF,mEAAmE,kCAAmB;AACtF,kFAAkF,kCAAmB;AACrG,iFAAiF,kCAAmB;AACpG,sEAAsE,kCAAmB;AACzF,gGAAgG,kCAAmB;;;;;;;;;;;;;;AAcnH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,qBAAqB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,wBAAwB;AACnE;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,8GAA8G;AAC9H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,YAAY;AACpC,4BAA4B,WAAW;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sHAAsH;AACtH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,wBAAwB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,wBAAwB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,2GAA2G;AAC3H,gBAAgB,sDAAsD;AACtE;AACA;AACA;AACA,4BAA4B,mBAAmB;AAC/C;AACA;AACA;AACA;AACA,4BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,4DAA4D;AACzH;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,gFAAgF,kCAAmB;AACnG,qEAAqE,kCAAmB;AACxF,kEAAkE,kCAAmB;AACrF,sFAAsF,kCAAmB;AACzG,6GAA6G,kCAAmB;AAChI,iFAAiF,kCAAmB;AACpG,iFAAiF,kCAAmB;AACpG,oFAAoF,kCAAmB;AACvG,kEAAkE,kCAAmB;AACrF,mEAAmE,kCAAmB;AACtF,0GAA0G,kCAAmB;AAC7H,sFAAsF,kCAAmB;AACzG,yFAAyF,kCAAmB;AAC5G,iEAAiE,kCAAmB;AACpF,sEAAsE,kCAAmB;AACzF,2EAA2E,kCAAmB;AAC9F,oEAAoE,kCAAmB;AACvF,iFAAiF,kCAAmB;AACpG,gGAAgG,kCAAmB;;;;;;;;;;;;;;;;;;;AAmBnH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C,4BAA4B,eAAe;AAC3C;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,QAAQ;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA,4BAA4B,eAAe;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,eAAe;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,eAAe;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,eAAe;AACnC;AACA;AACA;AACA,gBAAgB,OAAO;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,eAAe;AAChD,qCAAqC,eAAe;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,eAAe;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0GAA0G;AAC1G;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA,mEAAmE,6BAA6B;AAChG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,4IAA4I;AAC5J,gBAAgB,sDAAsD;AACtE;AACA;AACA;AACA;AACA,4BAA4B,mBAAmB;AAC/C;AACA;AACA;AACA,4BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,4DAA4D;AACrH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,uBAAuB;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,iBAAiB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,kBAAkB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,eAAe;AACrD;AACA,kCAAkC,qBAAqB;AACvD;AACA,sBAAsB,qBAAqB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,iEAAiE,kCAAmB;AACpF,sEAAsE,kCAAmB;AACzF,kFAAkF,kCAAmB;AACrG,+EAA+E,kCAAmB;;;;;;;AAOlG,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,qEAAqE,kCAAmB;;;AAGxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;AACnF,iFAAiF,kCAAmB;AACpG,+DAA+D,kCAAmB;AAClF,sEAAsE,kCAAmB;;;;;AAKzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,0BAA0B;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,YAAY;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,iBAAiB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,0CAA0C,iBAAiB;AAC3D;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA,QAAQ,IAAI;AACZ;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,6DAA6D,kCAAmB;;;AAGhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,QAAQ;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,wBAAwB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iEAAiE,kCAAmB;AACpF,gEAAgE,kCAAmB;AACnF,6DAA6D,kCAAmB;;;;AAIhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG;AACnG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E,IAAI;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,cAAc;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA,KAAK;AACL;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB,+DAA+D,kCAAmB;AAClF,6DAA6D,kCAAmB;;;AAGhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,kBAAkB,EAAE,mCAAmC,EAAE,yBAAyB;AACrH,2BAA2B,iBAAiB,sBAAsB,gBAAgB;AAClF,+CAA+C,yBAAyB;AACxE;AACA;AACA;AACA;AACA,sCAAsC,gBAAgB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6DAA6D,kCAAmB;;AAEhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,oCAAoC;AAC9E;AACA;AACA;AACA,uCAAuC;AACvC,8CAA8C;AAC9C,gDAAgD;AAChD;AACA;AACA,uCAAuC;AACvC,8CAA8C;AAC9C,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,+DAA+D,kCAAmB;;AAElF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,uBAAuB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,gBAAgB;AACtC,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;;AAExF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;AAGD,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,8DAA8D,kCAAmB;AACjF,6DAA6D,kCAAmB;AAChF,oEAAoE,kCAAmB;AACvF,yEAAyE,kCAAmB;AAC5F,kEAAkE,kCAAmB;;;;;;;;;AASrF,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,+DAA+D,kCAAmB;AAClF;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4BAA4B;AAC7B;AACA;AACA,oCAAoC,0BAA0B,KAAK,wBAAwB;AAC3F,gBAAgB,mBAAmB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,mBAAmB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,yBAAyB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,yBAAyB;AAClE;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,wBAAwB;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,wBAAwB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,wBAAwB;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,wBAAwB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,yBAAyB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,yBAAyB;AAClE;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,yBAAyB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,yBAAyB;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA,wBAAwB,yBAAyB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;;AAErF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,YAAY;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,gEAAgE,kCAAmB;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,6DAA6D,kCAAmB;;AAEhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE,WAAW,0DAA0D,gBAAgB;AACtJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0GAA0G,6CAA6C;AACvJ;AACA;AACA;AACA;AACA;AACA,mIAAmI,0DAA0D;AAC7L;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;;AAExF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,qEAAqE,kCAAmB;AACxF,gEAAgE,kCAAmB;;;AAGnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,WAAW;AACvD;AACA;AACA;AACA;AACA,wCAAwC,oBAAoB;AAC5D;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,sFAAsF,kCAAmB;AACzG,6DAA6D,kCAAmB;;;AAGhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,aAAa;AACb;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,kEAAkE,kCAAmB;AACrF,+DAA+D,kCAAmB;AAClF,4DAA4D,kCAAmB;AAC/E,gEAAgE,kCAAmB;AACnF,0EAA0E,kCAAmB;AAC7F,gEAAgE,kCAAmB;AACnF,+DAA+D,kCAAmB;AAClF,oEAAoE,kCAAmB;AACvF,gEAAgE,kCAAmB;AACnF,qEAAqE,kCAAmB;AACxF,uEAAuE,kCAAmB;AAC1F,6EAA6E,kCAAmB;AAChG,iEAAiE,kCAAmB;AACpF,gEAAgE,kCAAmB;AACnF,8EAA8E,kCAAmB;AACjG,0EAA0E,kCAAmB;AAC7F,gEAAgE,kCAAmB;AACnF,wEAAwE,kCAAmB;AAC3F,gEAAgE,kCAAmB;AACnF,kEAAkE,kCAAmB;AACrF,wEAAwE,kCAAmB;AAC3F,wEAAwE,kCAAmB;AAC3F,0EAA0E,kCAAmB;AAC7F,2EAA2E,kCAAmB;AAC9F,0EAA0E,kCAAmB;AAC7F,sFAAsF,kCAAmB;AACzG,yEAAyE,kCAAmB;AAC5F,gEAAgE,kCAAmB;AACnF,yEAAyE,kCAAmB;AAC5F,2EAA2E,kCAAmB;AAC9F,6EAA6E,kCAAmB;AAChG,+EAA+E,kCAAmB;AAClG,8EAA8E,kCAAmB;AACjG,oFAAoF,kCAAmB;AACvG,qFAAqF,kCAAmB;AACxG,mFAAmF,kCAAmB;AACtG,iFAAiF,kCAAmB;AACpG,8EAA8E,kCAAmB;AACjG,4EAA4E,kCAAmB;AAC/F,6EAA6E,kCAAmB;AAChG,wEAAwE,kCAAmB;AAC3F,yEAAyE,kCAAmB;AAC5F,0EAA0E,kCAAmB;AAC7F,4EAA4E,kCAAmB;AAC/F,qEAAqE,kCAAmB;AACxF,uEAAuE,kCAAmB;AAC1F,0EAA0E,kCAAmB;AAC7F,wEAAwE,kCAAmB;AAC3F,+EAA+E,kCAAmB;AAClG,0EAA0E,kCAAmB;AAC7F,mEAAmE,kCAAmB;AACtF,oEAAoE,kCAAmB;AACvF,mEAAmE,kCAAmB;AACtF,qEAAqE,kCAAmB;AACxF,wEAAwE,kCAAmB;AAC3F,uEAAuE,kCAAmB;AAC1F,4EAA4E,kCAAmB;AAC/F,sEAAsE,kCAAmB;AACzF,yEAAyE,kCAAmB;AAC5F,yEAAyE,kCAAmB;AAC5F,sEAAsE,kCAAmB;AACzF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA;;;;;;;;;;;;;;;;;;AAkBA;;;;;;;;;;;;;;;;;;;AAmBA;AACA;AACA,YAAY;AACZ;;;AAGA,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iFAAiF;;AAEjF,OAAO;;AAEP;AACA;AACA;AACA;AACA,iCAAiC,0BAAmB,EAAE,kCAAmB;;AAEzE,kCAAmB,GAAG,0BAAmB;AACzC,qBAAqB,kCAAmB,GAAG,0BAAmB;AAC9D;AACA,sBAAsB;AACtB,iFAAiF;;AAEjF,OAAO;;AAEP,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,kBAAkB,kCAAmB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE,kCAAmB;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,kCAAmB;AAC7B;AACA;AACA;AACA,WAAW,kCAAmB,aAAa,WAAW;AACtD;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU,kCAAmB;AAC7B;AACA,eAAe,kCAAmB,wBAAwB,kCAAmB;AAC7E,mDAAmD,wCAAwC;AAC3F;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU,kCAAmB;AAC7B,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU,kCAAmB;AAC7B;AACA,iEAAiE,iBAAiB;AAClF;AACA,0DAA0D,aAAa;AACvE;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,0BAAmB,GAAG,kCAAmB;AACtD,sDAAsD,0BAAmB;AACzE,gDAAgD,0BAAmB;AACnE,8CAA8C,0BAAmB;AACjE,iDAAiD,0BAAmB;AACpE,mDAAmD,0BAAmB;AACtE,mDAAmD,0BAAmB;AACtE,gDAAgD,0BAAmB;AACnE,gDAAgD,0BAAmB;AACnE,wCAAwC,0BAAmB;AAC3D,8CAA8C,0BAAmB;AACjE,2CAA2C,0BAAmB;AAC9D,iDAAiD,0BAAmB;AACpE,+CAA+C,0BAAmB;AAClE,4CAA4C,0BAAmB;AAC/D,qDAAqD,0BAAmB;AACxE,kDAAkD,0BAAmB;AACrE,oDAAoD,0BAAmB;AACvE,+CAA+C,0BAAmB;AAClE,sDAAsD,0BAAmB;AACzE,uCAAuC,0BAAmB;AAC1D,uCAAuC,0BAAmB;AAC1D,4CAA4C,0BAAmB;AAC/D,8CAA8C,0BAAmB;AACjE,wCAAwC,0BAAmB;AAC3D,gDAAgD,0BAAmB;AACnE,8CAA8C,0BAAmB;AACjE,mDAAmD,0BAAmB;AACtE,gDAAgD,0BAAmB;AACnE,0CAA0C,0BAAmB;AAC7D,yCAAyC,0BAAmB;AAC5D,+CAA+C,0BAAmB;AAClE,yCAAyC,0BAAmB;AAC5D,yCAAyC,0BAAmB;AAC5D,iDAAiD,0BAAmB;AACpE,wCAAwC,0BAAmB;AAC3D,uDAAuD,0BAAmB;AAC1E,2CAA2C,0BAAmB;AAC9D,oDAAoD,0BAAmB;AACvE,mDAAmD,0BAAmB;AACtE,oDAAoD,0BAAmB;AACvE,iDAAiD,0BAAmB;AACpE,wDAAwD,0BAAmB;AAC3E,qDAAqD,0BAAmB;AACxE,0DAA0D,0BAAmB;AAC7E,yDAAyD,0BAAmB;AAC5E,sDAAsD,0BAAmB;AACzE,kDAAkD,0BAAmB;AACrE,gDAAgD,0BAAmB;AACnE,wCAAwC,0BAAmB;AAC3D,kDAAkD,0BAAmB;AACrE,qDAAqD,0BAAmB;AACxE,8DAA8D,0BAAmB;AACjF,4CAA4C,0BAAmB;AAC/D,oDAAoD,0BAAmB;AACvE,kDAAkD,0BAAmB;AACrE,yDAAyD,0BAAmB;AAC5E,kDAAkD,0BAAmB;AACrE,mDAAmD,0BAAmB;AACtE,oDAAoD,0BAAmB;AACvE,6CAA6C,0BAAmB;AAChE,4CAA4C,0BAAmB;AAC/D,0CAA0C,0BAAmB;AAC7D,0CAA0C,0BAAmB;AAC7D,kDAAkD,0BAAmB;AACrE,wCAAwC,0BAAmB;AAC3D,8CAA8C,0BAAmB;AACjE,yDAAyD,0BAAmB;AAC5E,8CAA8C,0BAAmB;AACjE,4CAA4C,0BAAmB;AAC/D,0DAA0D,0BAAmB;AAC7E,kEAAkE,0BAAmB;AACrF,gDAAgD,0BAAmB;AACnE,yDAAyD,0BAAmB;AAC5E,kDAAkD,0BAAmB;AACrE,wCAAwC,0BAAmB;AAC3D,2CAA2C,0BAAmB;AAC9D,sCAAsC,0BAAmB;AACzD,4CAA4C,0BAAmB;AAC/D,2CAA2C,0BAAmB;AAC9D,iDAAiD,0BAAmB;AACpE,8CAA8C,0BAAmB;AACjE,8CAA8C,0BAAmB;AACjE,gEAAgE,0BAAmB;AACnF,6CAA6C,0BAAmB;AAChE,yCAAyC,0BAAmB;AAC5D,yCAAyC,0BAAmB;AAC5D,kDAAkD,0BAAmB;AACrE,+CAA+C,0BAAmB;AAClE,yDAAyD,0BAAmB;AAC5E,8CAA8C,0BAAmB;AACjE,yCAAyC,0BAAmB;AAC5D,+CAA+C,0BAAmB;AAClE,oDAAoD,0BAAmB;AACvE,qDAAqD,0BAAmB;AACxE,yCAAyC,0BAAmB;AAC5D,+CAA+C,0BAAmB;AAClE,gDAAgD,0BAAmB;AACnE,+CAA+C,0BAAmB;AAClE,6CAA6C,0BAAmB;AAChE,yCAAyC,0BAAmB;AAC5D,6CAA6C,0BAAmB;AAChE,mEAAmE,0BAAmB;AACtF,gEAAgE,0BAAmB;AACnF,mDAAmD,0BAAmB;AACtE,oDAAoD,0BAAmB;AACvE,uCAAuC,0BAAmB;AAC1D,4CAA4C,0BAAmB;AAC/D,wCAAwC,0BAAmB;AAC3D,wCAAwC,0BAAmB;AAC3D,yCAAyC,0BAAmB;AAC5D,uCAAuC,0BAAmB;AAC1D,4CAA4C,0BAAmB;AAC/D,6CAA6C,0BAAmB;AAChE,4CAA4C,0BAAmB;AAC/D,2CAA2C,0BAAmB;AAC9D,6CAA6C,0BAAmB;AAChE,6CAA6C,0BAAmB;AAChE,yCAAyC,0BAAmB;AAC5D,4CAA4C,0BAAmB;AAC/D,iDAAiD,0BAAmB;AACpE,gDAAgD,0BAAmB;AACnE,0CAA0C,0BAAmB;AAC7D,mDAAmD,0BAAmB;AACtE,qDAAqD,0BAAmB;AACxE,sDAAsD,0BAAmB;AACzE,yDAAyD,0BAAmB;AAC5E,2CAA2C,0BAAmB;AAC9D,mDAAmD,0BAAmB;AACtE,sCAAsC,0BAAmB;AACzD,4CAA4C,0BAAmB;AAC/D,oDAAoD,0BAAmB;AACvE,qDAAqD,0BAAmB;AACxE,sDAAsD,0BAAmB;AACzE,0CAA0C,0BAAmB;AAC7D,oDAAoD,0BAAmB;AACvE,gDAAgD,0BAAmB;AACnE,iDAAiD,0BAAmB;AACpE,oDAAoD,0BAAmB;AACvE,+CAA+C,0BAAmB;AAClE,gDAAgD,0BAAmB;AACnE,8CAA8C,0BAAmB;AACjE,kDAAkD,0BAAmB;AACrE,iDAAiD,0BAAmB;AACpE,8CAA8C,0BAAmB;AACjE,gEAAgE,0BAAmB;AACnF,gDAAgD,0BAAmB;AACnE,kDAAkD,0BAAmB;AACrE,4CAA4C,0BAAmB;AAC/D,8CAA8C,0BAAmB;AACjE,2DAA2D,0BAAmB;AAC9E,wDAAwD,0BAAmB;AAC3E,+CAA+C,0BAAmB;AAClE,gDAAgD,0BAAmB;AACnE,2CAA2C,0BAAmB;AAC9D,2CAA2C,0BAAmB;AAC9D,uCAAuC,0BAAmB;AAC1D,4CAA4C,0BAAmB;AAC/D,wCAAwC,0BAAmB;AAC3D,4DAA4D,0BAAmB;AAC/E,uCAAuC,0BAAmB;AAC1D,8CAA8C,0BAAmB;AACjE,yCAAyC,0BAAmB;AAC5D,+CAA+C,0BAAmB;AAClE,gEAAgE,0BAAmB;AACnF,4DAA4D,0BAAmB;AAC/E,2CAA2C,0BAAmB;AAC9D,yCAAyC,0BAAmB;AAC5D,2CAA2C,0BAAmB;AAC9D,yCAAyC,0BAAmB;AAC5D,kDAAkD,0BAAmB;AACrE,6CAA6C,0BAAmB;AAChE,uCAAuC,0BAAmB;AAC1D,kDAAkD,0BAAmB;AACrE,+CAA+C,0BAAmB;AAClE,yCAAyC,0BAAmB;AAC5D,oDAAoD,0BAAmB;AACvE,yCAAyC,0BAAmB;AAC5D,oDAAoD,0BAAmB;AACvE,sDAAsD,0BAAmB;AACzE,mDAAmD,0BAAmB;AACtE,4DAA4D,0BAAmB;AAC/E,4CAA4C,0BAAmB;AAC/D,mDAAmD,0BAAmB;AACtE,uCAAuC,0BAAmB;AAC1D,6CAA6C,0BAAmB;AAChE,kDAAkD,0BAAmB;AACrE,uCAAuC,0BAAmB;AAC1D,oDAAoD,0BAAmB;AACvE,kDAAkD,0BAAmB;AACrE,2CAA2C,0BAAmB;AAC9D,kDAAkD,0BAAmB;AACrE,mDAAmD,0BAAmB;AACtE,oDAAoD,0BAAmB;AACvE,+CAA+C,0BAAmB;AAClE,+CAA+C,0BAAmB;AAClE,qDAAqD,0BAAmB;AACxE,gDAAgD,0BAAmB;AACnE,mDAAmD,0BAAmB;AACtE,+CAA+C,0BAAmB;AAClE,uDAAuD,0BAAmB;AAC1E,+CAA+C,0BAAmB;AAClE,gDAAgD,0BAAmB;AACnE,8CAA8C,0BAAmB;AACjE,0CAA0C,0BAAmB;AAC7D,kDAAkD,0BAAmB;AACrE,uCAAuC,0BAAmB;AAC1D,qDAAqD,0BAAmB;AACxE,qDAAqD,0BAAmB;AACxE,gDAAgD,0BAAmB;AACnE,iDAAiD,0BAAmB;AACpE,gDAAgD,0BAAmB;AACnE,yDAAyD,0BAAmB;AAC5E,kDAAkD,0BAAmB;AACrE,oDAAoD,0BAAmB;AACvE,oDAAoD,0BAAmB;AACvE,+CAA+C,0BAAmB;AAClE,gDAAgD,0BAAmB;AACnE,+CAA+C,0BAAmB;AAClE,+CAA+C,0BAAmB;AAClE,wDAAwD,0BAAmB;AAC3E,iDAAiD,0BAAmB;AACpE,6CAA6C,0BAAmB;AAChE,kDAAkD,0BAAmB;AACrE,2CAA2C,0BAAmB;AAC9D,wCAAwC,0BAAmB;AAC3D,+CAA+C,0BAAmB;AAClE,4DAA4D,0BAAmB;AAC/E,yCAAyC,0BAAmB;AAC5D,yCAAyC,0BAAmB;AAC5D,sCAAsC,0BAAmB;AACzD,kDAAkD,0BAAmB;AACrE,4CAA4C,0BAAmB;AAC/D,8CAA8C,0BAAmB;AACjE,mDAAmD,0BAAmB;AACtE,yCAAyC,0BAAmB;AAC5D,gDAAgD,0BAAmB;AACnE,6CAA6C,0BAAmB;AAChE,2CAA2C,0BAAmB;AAC9D,iDAAiD,0BAAmB;AACpE,2CAA2C,0BAAmB;AAC9D,sDAAsD,0BAAmB;AACzE,2CAA2C,0BAAmB;AAC9D,sDAAsD,0BAAmB;AACzE,+CAA+C,0BAAmB;AAClE,0CAA0C,0BAAmB;AAC7D,qDAAqD,0BAAmB;AACxE,0CAA0C,0BAAmB;AAC7D,qDAAqD,0BAAmB;AACxE,wCAAwC,0BAAmB;AAC3D,8CAA8C,0BAAmB;AACjE,yCAAyC,0BAAmB;AAC5D,iDAAiD,0BAAmB;AACpE,gDAAgD,0BAAmB;AACnE,+CAA+C,0BAAmB;AAClE,+CAA+C,0BAAmB;AAClE,uDAAuD,0BAAmB;AAC1E,4CAA4C,0BAAmB;AAC/D,iDAAiD,0BAAmB;AACpE,iDAAiD,0BAAmB;AACpE,yCAAyC,0BAAmB;AAC5D,wCAAwC,0BAAmB;AAC3D,uCAAuC,0BAAmB;AAC1D,wCAAwC,0BAAmB;AAC3D,iDAAiD,0BAAmB;AACpE,wCAAwC,0BAAmB;AAC3D,8CAA8C,0BAAmB;AACjE,iDAAiD,0BAAmB;AACpE,mEAAmE,0BAAmB;AACtF,2DAA2D,0BAAmB;AAC9E,yCAAyC,0BAAmB;AAC5D,6CAA6C,0BAAmB;AAChE,8CAA8C,0BAAmB;AACjE,gDAAgD,0BAAmB;AACnE,+CAA+C,0BAAmB;AAClE,oDAAoD,0BAAmB;AACvE,yCAAyC,0BAAmB;AAC5D,yCAAyC,0BAAmB;AAC5D,gDAAgD,0BAAmB;AACnE,iDAAiD,0BAAmB;AACpE,6CAA6C,0BAAmB;AAChE,2CAA2C,0BAAmB;AAC9D,4CAA4C,0BAAmB;AAC/D,uCAAuC,0BAAmB;AAC1D,4CAA4C,0BAAmB;AAC/D,gDAAgD,0BAAmB;AACnE,uCAAuC,0BAAmB;AAC1D,0CAA0C,0BAAmB;AAC7D,gDAAgD,0BAAmB;AACnE,iDAAiD,0BAAmB;AACpE,8CAA8C,0BAAmB;AACjE,wCAAwC,0BAAmB;AAC3D,0CAA0C,0BAAmB;AAC7D,4CAA4C,0BAAmB;AAC/D,qDAAqD,0BAAmB;AACxE,6CAA6C,0BAAmB;AAChE,2CAA2C,0BAAmB;AAC9D,0CAA0C,0BAAmB;AAC7D,gDAAgD,0BAAmB;AACnE,wCAAwC,0BAAmB;AAC3D,uCAAuC,0BAAmB;AAC1D,yCAAyC,0BAAmB;AAC5D,6CAA6C,0BAAmB;AAChE,+CAA+C,0BAAmB;AAClE,+CAA+C,0BAAmB;AAClE,gDAAgD,0BAAmB;AACnE,+CAA+C,0BAAmB;AAClE,2CAA2C,0BAAmB;AAC9D,mDAAmD,0BAAmB;AACtE,iDAAiD,0BAAmB;AACpE,6CAA6C,0BAAmB;AAChE,wCAAwC,0BAAmB;AAC3D,qDAAqD,0BAAmB;AACxE,yCAAyC,0BAAmB;AAC5D,oDAAoD,0BAAmB;AACvE,wCAAwC,0BAAmB;AAC3D,4CAA4C,0BAAmB;AAC/D,2CAA2C,0BAAmB;AAC9D,uCAAuC,0BAAmB;AAC1D,0DAA0D,0BAAmB;AAC7E,kDAAkD,0BAAmB;AACrE,2CAA2C,0BAAmB;AAC9D,kDAAkD,0BAAmB;AACrE,kDAAkD,0BAAmB;AACrE,iDAAiD,0BAAmB;AACpE,8CAA8C,0BAAmB;AACjE,8CAA8C,0BAAmB;AACjE,6CAA6C,0BAAmB;AAChE,0CAA0C,0BAAmB;AAC7D,iDAAiD,0BAAmB;AACpE,iDAAiD,0BAAmB;AACpE,gDAAgD,0BAAmB;AACnE,6CAA6C,0BAAmB;AAChE,8CAA8C,0BAAmB;AACjE,oDAAoD,0BAAmB;AACvE,0CAA0C,0BAAmB;AAC7D,mDAAmD,0BAAmB;AACtE,kDAAkD,0BAAmB;AACrE,sDAAsD,0BAAmB;AACzE,kDAAkD,0BAAmB;AACrE,kDAAkD,0BAAmB;AACrE,qDAAqD,0BAAmB;AACxE,oDAAoD,0BAAmB;AACvE,oDAAoD,0BAAmB;AACvE,mDAAmD,0BAAmB;AACtE,mDAAmD,0BAAmB;AACtE,qDAAqD,0BAAmB;AACxE,kDAAkD,0BAAmB;AACrE,sDAAsD,0BAAmB;AACzE,uCAAuC,0BAAmB;AAC1D,4CAA4C,0BAAmB;AAC/D,6CAA6C,0BAAmB;AAChE,8CAA8C,0BAAmB;AACjE,+CAA+C,0BAAmB;AAClE,2CAA2C,0BAAmB;AAC9D,sDAAsD,0BAAmB;AACzE,qDAAqD,0BAAmB;AACxE,mDAAmD,0BAAmB;AACtE,gDAAgD,0BAAmB;AACnE,mDAAmD,0BAAmB;AACtE,wCAAwC,0BAAmB;AAC3D,wCAAwC,0BAAmB;AAC3D,8CAA8C,0BAAmB;AACjE,uDAAuD,0BAAmB;AAC1E,uCAAuC,0BAAmB;AAC1D,4CAA4C,0BAAmB;AAC/D,4CAA4C,0BAAmB;AAC/D,sCAAsC,0BAAmB;AACzD,wCAAwC,0BAAmB;AAC3D,SAAi5jB;AACj5jB;;AAEA,iD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACv4xCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,IAAI;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oBAAoB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gCAAgC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA,0DAA0D;AAC1D,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,MAAM;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,eAAe,aAAa,eAAe;AACjF;AACA;AACA;AACA,yDAAyD,2DAA2D;AACpH;AACA;AACA,wDAAwD,kCAAkC;AAC1F;AACA;AACA;AACA;AACA;AACA,+DAA+D,+BAA+B;AAC9F;AACA;AACA,sDAAsD,+BAA+B,cAAc,eAAe;AAClH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8DAA8D,0BAA0B;AACxF;AACA,qCAAqC,SAAS,oDAAoD,0BAA0B;AAC5H;AACA;AACA;AACA,iEAAiE,4BAA4B;AAC7F;AACA;AACA,+DAA+D,0BAA0B;AACzF;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,iBAAiB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,sEAAsE,EAAE,eAAe;AACvI;AACA,iDAAiD,iEAAiE,EAAE,eAAe;AACnI;AACA,4CAA4C;AAC5C;AACA;AACA;AACA,0CAA0C,EAAE,cAAc;AAC1D;AACA,0CAA0C;AAC1C;AACA;AACA;AACA,0CAA0C,EAAE,gCAAgC;AAC5E;AACA;AACA;AACA;AACA;AACA,gDAAgD,qEAAqE,EAAE,eAAe;AACtI;AACA,iDAAiD,iEAAiE,EAAE,eAAe;AACnI;AACA,4CAA4C;AAC5C;AACA;AACA;AACA,uCAAuC,EAAE,cAAc;AACvD;AACA,4CAA4C;AAC5C;AACA;AACA;AACA,uCAAuC,EAAE,cAAc;AACvD;AACA,0CAA0C;AAC1C;AACA;AACA;AACA,0CAA0C,EAAE,gCAAgC;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,iBAAiB;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY,mCAAmC;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,kCAAkC;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,aAAa;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,CAAC;AACD,4BAA4B,wBAAwB;AACpD,yBAAyB,wBAAwB;AACjD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,sEAAsE,UAAU;AAChF;AACA,CAAC,8BAA8B;;AAE/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,4DAA4D;AACxE;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,gBAAgB,UAAU;AAC1B;AACA,qBAAqB;AACrB;AACA;AACA,qBAAqB;AACrB;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,mCAAmC;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,6BAA6B;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,6BAA6B;AAC/D;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,mCAAmC;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,sBAAsB,gCAAgC;AACtD,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,8BAA8B;AACpD,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,GAAG;AAC/B;AACA,uCAAuC,GAAG;AAC1C;AACA,iBAAiB,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU,GAAG;AACzE,gCAAgC,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,GAAG;AACvG,iCAAiC,GAAG;AACpC;AACA;AACA;AACA;AACA,4DAA4D,GAAG,mFAAmF,GAAG;AACrJ;AACA,sCAAsC,sBAAsB,sCAAsC,uBAAuB,OAAO,GAAG,cAAc;AACjJ;AACA;AACA,uBAAuB,yBAAyB,4DAA4D,EAAE,SAAS,IAAI,MAAM,EAAE,iCAAiC,EAAE,SAAS,IAAI,yBAAyB,IAAI,GAAG,EAAE,aAAa,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,mCAAmC,EAAE,SAAS,IAAI,MAAM,EAAE,iCAAiC,EAAE,SAAS,IAAI,0DAA0D,GAAG;AACrnB;AACA,iDAAiD,IAAI,kCAAkC,KAAK,6CAA6C,KAAK;AAC9I;AACA,gCAAgC,EAAE,+BAA+B,EAAE,2NAA2N,EAAE;AAChS,iGAAiG,GAAG;AACpG;AACA,8BAA8B,EAAE;AAChC;AACA,2BAA2B,sBAAsB,KAAK,gBAAgB;AACtE;AACA;AACA,+EAA+E,EAAE;AACjF,mFAAmF,EAAE;AACrF;AACA,gBAAgB,IAAI,GAAG,EAAE,aAAa,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,mCAAmC,EAAE,SAAS,IAAI,MAAM,EAAE,iCAAiC,EAAE,SAAS,IAAI;AAC5X,kCAAkC,IAAI,GAAG,IAAI,YAAY,IAAI,cAAc,IAAI,GAAG,IAAI,eAAe,IAAI,GAAG,IAAI,aAAa,IAAI,cAAc,IAAI,GAAG,IAAI,cAAc,IAAI,EAAE,IAAI,cAAc,IAAI,GAAG,IAAI,cAAc,IAAI,EAAE,IAAI,cAAc,IAAI,GAAG,IAAI,cAAc,IAAI,EAAE,IAAI,cAAc,IAAI,GAAG,IAAI,cAAc,IAAI,EAAE,IAAI,aAAa,IAAI,gBAAgB,IAAI,EAAE,IAAI,kBAAkB,IAAI,EAAE,IAAI,uBAAuB,IAAI,EAAE,IAAI,aAAa,GAAG,YAAY,IAAI,EAAE,IAAI,GAAG,IAAI,oBAAoB,IAAI,OAAO,IAAI,UAAU,IAAI,mBAAmB,IAAI,OAAO,IAAI,oBAAoB,IAAI,GAAG,IAAI,qBAAqB,IAAI,OAAO,IAAI,UAAU,IAAI,mBAAmB,IAAI,OAAO,IAAI;AAChqB,sCAAsC,IAAI,GAAG,IAAI,YAAY,IAAI,cAAc,IAAI,GAAG,IAAI,eAAe,IAAI,GAAG,IAAI,aAAa,IAAI,cAAc,IAAI,GAAG,IAAI,cAAc,IAAI,EAAE,IAAI,cAAc,IAAI,GAAG,IAAI,cAAc,IAAI,EAAE,IAAI,cAAc,IAAI,GAAG,IAAI,cAAc,IAAI,EAAE,IAAI,cAAc,IAAI,GAAG,IAAI,cAAc,IAAI,EAAE,IAAI,aAAa,IAAI,gBAAgB,IAAI,EAAE,IAAI,kBAAkB,IAAI,EAAE,IAAI,uBAAuB,IAAI,EAAE,IAAI,aAAa,GAAG,YAAY,IAAI,EAAE,IAAI,GAAG,IAAI,oBAAoB,IAAI,OAAO,IAAI,UAAU,IAAI,mBAAmB,IAAI,OAAO,IAAI,oBAAoB,IAAI,GAAG,IAAI,qBAAqB,IAAI,OAAO,IAAI,UAAU,IAAI,mBAAmB,IAAI,OAAO,IAAI;AACpqB;AACA,qCAAqC,EAAE,kBAAkB,EAAE,mBAAmB,EAAE;AAChF;AACA,wCAAwC,EAAE,kBAAkB,EAAE,sBAAsB,EAAE;AACtF;AACA,gCAAgC,EAAE,KAAK,EAAE,KAAK,EAAE;AAChD;AACA,gCAAgC,EAAE;AAClC;AACA,mHAAmH,EAAE;AACrH,iCAAiC,gBAAgB;AACjD;AACA,wBAAwB,EAAE,KAAK,EAAE,KAAK,EAAE;AACxC;AACA;AACA,mBAAmB,MAAM,OAAO,EAAE,gBAAgB;AAClD;AACA;AACA,mBAAmB,MAAM;AACzB;AACA;AACA;AACA;AACA,0BAA0B,sBAAsB;AAChD;AACA;AACA;AACA,mBAAmB,gBAAgB,GAAG,sBAAsB;AAC5D;AACA;AACA;AACA,4BAA4B,EAAE,MAAM,EAAE;AACtC,eAAe,MAAM,GAAG,eAAe;AACvC,0BAA0B,MAAM;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,iDAAiD;AACvF;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,yBAAyB;AAC/D;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,uBAAuB;AAC7D;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gCAAgC,+CAA+C;AAC/E;AACA;AACA,gCAAgC,6CAA6C;AAC7E;AACA;AACA,gCAAgC,+CAA+C;AAC/E;AACA;AACA,gCAAgC,8CAA8C;AAC9E;AACA;AACA,gCAAgC,gDAAgD;AAChF;AACA;AACA,gCAAgC,8CAA8C;AAC9E;AACA;AACA,gCAAgC,+CAA+C;AAC/E;AACA;AACA,gCAAgC,8CAA8C;AAC9E;AACA;AACA,gCAAgC,gDAAgD;AAChF;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gCAAgC,6CAA6C;AAC7E;AACA;AACA,gCAAgC,4CAA4C;AAC5E;AACA;AACA,gCAAgC,8CAA8C;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gCAAgC,uBAAuB;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gCAAgC,kDAAkD;AAClF;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,cAAc;AAC1D,SAAS;AACT;AACA;AACA;AACA;AACA,4CAA4C,qBAAqB;AACjE,SAAS;AACT;AACA;AACA;AACA;AACA,4CAA4C,qBAAqB;AACjE,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,wDAAwD;AACjF,SAAS;AACT;AACA;AACA;AACA;AACA,yBAAyB,wDAAwD;AACjF,SAAS;AACT;AACA;AACA;AACA;AACA,2BAA2B,kDAAkD;AAC7E,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,aAAa;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,gBAAgB,cAAc;AAC9B,gBAAgB,yBAAyB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,6BAA6B;AACpD;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,6BAA6B;AAC5D,iCAAiC,uCAAuC;AACxE,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,6BAA6B;AACxD;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,oBAAoB;AACpB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,8BAA8B,eAAe;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE,cAAc;AACjF;AACA;AACA;AACA,8DAA8D,uBAAuB,sBAAsB,cAAc;AACzH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,4BAA4B,kBAAkB;AAC9C;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,iCAAiC;AACjC;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,sDAAsD;AAC7E,SAAS;AACT;AACA;AACA;AACA;AACA,uBAAuB,sDAAsD;AAC7E,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA,mCAAmC,6CAA6C;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,mCAAmC,6CAA6C;AAChF;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,mCAAmC,6CAA6C;AAChF;AACA;AACA;AACA,uGAAuG,qCAAqC;AAC5I,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,kBAAkB,2CAA2C;AAC7D;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA,yBAAyB;AACzB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,cAAc;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA,qDAAqD,aAAa;AAClE,+BAA+B,sCAAsC;AACrE;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,sDAAsD;AACvD;AACA;AACA;AACA,sCAAsC,SAAS;AAC/C,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,sBAAsB;AAC/D,yCAAyC,sBAAsB;AAC/D;AACA;AACA;AACA,KAAK;AACL,yCAAyC,sBAAsB;AAC/D,qCAAqC,sBAAsB;AAC3D;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,cAAc;AAChC,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,+BAA+B;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAE2rD;;;;;;;;;;;;;;;AC7xIrrD,MAAM,MAAM,GAAG;IAClB,WAAW,EAAE,EAAE,GAAC,CAAC,EAAE,aAAa;IAChC,gBAAgB,EAAE,GAAG,EAAE,KAAK;CAC/B;;;;;;;;;;;;;;;;;;ACH+B;AACQ;AACN;AAE3B,MAAM,MAAO,SAAQ,4CAAQ;IAChC,YAAY,IAAkB;QAC1B,KAAK,CAAC;YACF,GAAG,IAAI;YACP,aAAa,EAAE,oDAAgB,CAAC,MAAM;SACzC,CAAC;IACN,CAAC;IAED,YAAY,CAAC,MAAiB;QAC1B,MAAM,iBAAiB,GAAG,kDAAc,CAAC,eAAe,CAAC;YACrD,KAAK,EAAE,iDAAS,CAAC,kBAAoC;YACrD,IAAI,EAAE;gBACF,WAAW,EAAE,EAAE;gBACf,YAAY,EAAE,EAAE;gBAChB,IAAI,EAAE,CAAC;gBACP,OAAO,EAAE,CAAC;aACb;SACJ,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,IAAI,gDAAY,CAAC;YAC9B,MAAM,EAAE;gBACJ,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;gBAC5F,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;gBAC5F,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;gBAC5F,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;aAC/F;SACJ,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAEzC,MAAM,SAAS,GAAG,IAAI,gDAAY,CAAC;YAC/B,MAAM,EAAE;gBACJ,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;gBAC5F,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;gBAC5F,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;gBAC5F,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;aAC/F;SACJ,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QAG3C,MAAM,MAAM,GAAG,IAAI,gDAAY,CAAC;YAC5B,MAAM,EAAE;gBACJ,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;gBAC5F,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;gBAC5F,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;gBAC5F,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;aAC/F;SACJ,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAErC,MAAM,QAAQ,GAAG,IAAI,gDAAY,CAAC;YAC9B,MAAM,EAAE;gBACJ,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;gBAC5F,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;gBAC5F,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;gBAC5F,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;aAC/F;SACJ,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAEzC,MAAM,QAAQ,GAAG,IAAI,gDAAY,CAAC;YAC9B,MAAM,EAAE;gBACJ,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;gBAC5F,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;gBAC5F,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;gBAC5F,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;aAC/F;SACJ,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAEzC,MAAM,SAAS,GAAG,IAAI,gDAAY,CAAC;YAC/B,MAAM,EAAE;gBACJ,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;gBAC5F,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;gBAC5F,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;gBAC5F,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;aAC/F;SACJ,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QAE3C,MAAM,MAAM,GAAG,IAAI,gDAAY,CAAC;YAC5B,MAAM,EAAE;gBACJ,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;gBAC5F,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;gBAC5F,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;gBAC5F,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;aAC/F;SACJ,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAErC,MAAM,QAAQ,GAAG,IAAI,gDAAY,CAAC;YAC9B,MAAM,EAAE;gBACJ,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;gBAC5F,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;gBAC5F,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;gBAC5F,EAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAc,EAAE,QAAQ,EAAE,2CAAM,CAAC,gBAAgB,EAAC;aAC/F;SACJ,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAC7C,CAAC;IAED,WAAW,CAAC,MAAiB,EAAE,SAAiB;QAC5C,IAAI,CAAC,GAAG,GAAG,6CAAS,CAAC,IAAI,CAAC;QAE1B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC/B,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,2CAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YACnD,IAAI,CAAC,GAAG,GAAG,0CAAM,CAAC,2CAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;YACzC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACpC,CAAC;QACD,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,2CAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YAClD,IAAI,CAAC,GAAG,GAAG,0CAAM,CAAC,CAAC,2CAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;YAC1C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACnC,CAAC;QACD,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,2CAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAChD,IAAI,CAAC,GAAG,GAAG,0CAAM,CAAC,CAAC,EAAE,CAAC,2CAAM,CAAC,WAAW,CAAC,CAAC;YAC1C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACjC,CAAC;QACD,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,2CAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YAClD,IAAI,CAAC,GAAG,GAAG,0CAAM,CAAC,CAAC,EAAE,2CAAM,CAAC,WAAW,CAAC,CAAC;YACzC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACnC,CAAC;IAEL,CAAC;CACJ;;;;;;;;;;;;;;;;;;AC/H+D;AACjB;AAExC,MAAM,SAAS,GAAG;IACrB,kBAAkB,EAAE,IAAI,kDAAW,CAAC,qFAAqF,CAAC;IAC1H,YAAY,EAAE,IAAI,yDAAY,CAAC,wCAAwC,EAAE;QACrE,wBAAwB,EAAE,IAAI;QAC9B,qBAAqB,EAAE,IAAI;KAC9B,CAAC;IACF,YAAY,EAAE,IAAI,yDAAY,CAAC,0BAA0B,EAAE;QACvD,qBAAqB,EAAE,IAAI;KAC9B,CAAC;IACF,gBAAgB,EAAE,IAAI,yDAAY,CAAC,oBAAoB,EAAE;QACrD,qBAAqB,EAAE,IAAI;KAC9B,CAAC;CACI,CAAC;AAGJ,MAAM,MAAM,GAAG,IAAI,6CAAM,EAAE,CAAC;AACnC,KAAK,IAAI,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;IAC5C,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;AACjC,CAAC;;;;;;;;;;;;;;;;ACrBsD;AAKhD,MAAM,WAAW;IAOtB,YACE,KAAY,EACI,SAA4B,EACpC,QAAsB,EACd,KAAa;QAFb,cAAS,GAAT,SAAS,CAAmB;QACpC,aAAQ,GAAR,QAAQ,CAAc;QACd,UAAK,GAAL,KAAK,CAAQ;QARxB,aAAQ,GAAa,EAAE,CAAC;QACxB,iBAAY,GAAG,IAAI,GAAG,EAA8B,CAAC;QACrD,iBAAY,GAAG,IAAI,GAAG,EAA8B,CAAC;QAO1D,IAAI,CAAC,QAAQ,GAAG,8CAAG,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACpE,IAAI,CAAC,MAAM,GAAG,8CAAG,CAAC,SAAS,CAAC,gBAAgB,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IAED,YAAY;;QACV,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,IAAI,SAAS,CAAC,eAAe,EAAE,CAAC;YAC9B,KAAK,IAAI,MAAM,IAAI,SAAS,CAAC,eAAe,EAAE,CAAC;gBAC7C,MAAM,cAAc,GAAG,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;oBACrE,OAAO,CAAC,CAAC,UAAU,KAAK,MAAM,CAAC,YAAY;gBAC7C,CAAC,CAAC,CAAC;gBACH,IAAI,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;oBAChD,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;oBAC5D,IAAI,OAAO,EAAE,CAAC;wBACZ,MAAM,SAAS,GAAG,OAAO,CAAC;4BACxB,IAAI,EAAE,MAAM,CAAC,YAAY;4BACzB,QAAQ,EAAE,8CAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;4BAC7E,MAAM;4BACN,UAAU,EAAE,cAAc;4BAC1B,KAAK,EAAE,IAAI;yBACZ,CAAC,CAAC;wBACH,IAAI,SAAS,EAAE,CAAC;4BACd,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;4BAC9B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;4BACzC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;wBAC3C,CAAC;oBACH,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;wBAClB,MAAM,KAAK,GAAG,IAAI,4CAAK,CAAC;4BACtB,IAAI,EAAE,MAAM,CAAC,YAAY;4BACzB,GAAG,EAAE,8CAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;4BACxE,KAAK,EAAE,MAAM,CAAC,KAAK;4BACnB,MAAM,EAAE,MAAM,CAAC,MAAM;4BACrB,MAAM,EAAE,8CAAG,CAAC,oBAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,MAAM,mCAAI,CAAC,EAAE,oBAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,MAAM,mCAAI,CAAC,CAAC;4BACrE,CAAC,EAAE,KAAK;yBACT,CAAC,CAAC;wBACH,MAAM,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;wBAC3D,IAAI,EAAE,EAAE,CAAC;4BACP,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;4BAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;4BAC/D,MAAM,MAAM,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;4BAC5D,IAAI,MAAM,EAAE,CAAC;gCACX,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;4BAC7B,CAAC;wBACH,CAAC;wBAED,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;wBAC1B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;wBACrC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;oBACvC,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,uDAAuD;QACvD,sEAAsE;QACtE,+BAA+B;QAC/B,EAAE;QACF,mFAAmF;QACnF,kDAAkD;QAClD,QAAQ;QACR,EAAE;QACF,gCAAgC;QAChC,iCAAiC;QACjC,qFAAqF;QACrF,cAAc;QACd,kCAAkC;QAClC,mBAAmB;QACnB,QAAQ;QACR,EAAE;QACF,qBAAqB;QACrB,8FAA8F;QAC9F,yDAAyD;QACzD,yBAAyB;QACzB,0DAA0D;QAC1D,0BAA0B;QAC1B,0CAA0C;QAC1C,4CAA4C;QAC5C,iDAAiD;QACjD,UAAU;QACV,QAAQ;QACR,EAAE;QACF,qCAAqC;QACrC,gDAAgD;QAChD,gDAAgD;QAChD,MAAM;QACN,IAAI;IACN,CAAC;IAGD,uBAAuB,CAAC,UAAkB;QACxC,MAAM,YAAY,GAAG,IAAI,CAAC,2BAA2B,CAAC,UAAU,CAAC,CAAC;QAClE,IAAI,OAAO,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAChC,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAChD,IAAI,WAAW,EAAE,CAAC;gBAChB,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,kBAAkB,CAAC,eAAuB,EAAE,KAAW;QACrD,MAAM,YAAY,GAAG,IAAI,CAAC,sBAAsB,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;QACzE,IAAI,OAAO,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAChC,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAChD,IAAI,WAAW,EAAE,CAAC;gBAChB,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;OAIG;IACH,2BAA2B,CAAC,UAAkB;QAC5C,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,iBAAiB,EAAE,KAAK,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;IACrH,CAAC;IAED;;;;OAIG;IACH,sBAAsB,CAAC,eAAuB,EAAE,KAAW;QACzD,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;YAC/C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,IAAI,eAAe,GAAG,KAAK,CAAC;gBAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;oBAC9B,eAAe,GAAG,KAAK,CAAC,iBAAiB,EAAE,CAAC;gBAC9C,CAAC;gBAED,MAAM,KAAK,GAAG,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,iBAAiB,EAAE,KAAK,eAAe,CAAC,iBAAiB,EAAE,CAAC,CAAC;gBACrH,IAAI,KAAK,EAAE,CAAC;oBACV,OAAO,KAAK,CAAC,OAAO,KAAK,eAAe,CAAC;gBAC3C,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,iBAAiB,EAAE,KAAK,eAAe,CAAC,iBAAiB,EAAE,CAAC,CAAC;YAClH,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;CACF;;;;;;;;;;;;;;;ACnKM,MAAM,WAAW,GAAe,KAAK,EAAE,IAAY,EAAE,WAA2B,EAAE,EAAE;IACxF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,QAAO,WAAW,CAAC,WAAW,EAAE,EAAE,CAAC;QAChC,KAAK,KAAK,CAAC,CAAC,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACzC,KAAK,MAAM,CAAC,CAAC,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC1C,OAAO,CAAC,CAAC,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACzC,CAAC;AACJ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACV+B;AACD;AACD;AACE;AACC;AACT;AACO;AACH;AACC;AACH;AACF;;;;;;;;;;;;;;;;ACX4C;AAM7D,MAAM,YAAY;IAQrB,YAAY,KAAY,EAAE,SAA4B,EAAE,QAAsB,EAAkB,KAAa;;QAAb,UAAK,GAAL,KAAK,CAAQ;QACzG,IAAI,CAAC,QAAQ,GAAG,8CAAG,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACpE,IAAI,CAAC,MAAM,GAAG,8CAAG,CAAC,SAAS,CAAC,gBAAgB,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC1E,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,IAAI,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;YAEjE,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC;YAC9B,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC;YACjC,IAAI,CAAC,OAAO,GAAG,IAAI,8CAAO,CAAC;gBACvB,IAAI,EAAE,SAAS,CAAC,YAAY;gBAC5B,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;gBACnC,SAAS,EAAE,SAAS,CAAC,UAAU;gBAC/B,UAAU,EAAE,SAAS,CAAC,UAAU;gBAChC,IAAI;gBACJ,OAAO;aACV,CAAC,CAAC;YACH,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC;YACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,wDAAiB,CAAC,CAAC;YACrD,QAAQ,CAAC,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC;YAEvC,4BAA4B;YAC5B,MAAM,aAAa,GAAG,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;gBAChE,OAAO,SAAS,CAAC,YAAY,KAAK,CAAC,CAAC,UAAU,CAAC;YACnD,CAAC,CAAC,CAAC;YAEH,IAAI,aAAa,EAAE,CAAC;gBAChB,MAAM,UAAU,GAAG,aAAa,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;;oBACtD,OAAO,UAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,UAAU,0CAAE,iBAAiB,EAAE,MAAK,OAAO,CAAC;gBAC5D,CAAC,CAAC,CAAC;gBAEH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACnD,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC;oBAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC;oBACvC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;oBAClD,IAAI,UAAU,IAAI,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,KAAK,EAAE,CAAC;wBAC7D,IAAK,CAAC,KAAK,GAAG,IAAI,CAAC;oBACvB,CAAC;oBAED,8EAA8E;oBAC9E,IAAI,CAAC,UAAU,IAAI,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;wBAC/C,IAAK,CAAC,KAAK,GAAG,IAAI,CAAC;oBACvB,CAAC;gBACL,CAAC;gBAED,IAAI,SAAS,CAAC,eAAe,EAAE,CAAC;oBAC5B,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;oBAChE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;wBACvD,MAAM,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;wBACzC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;wBAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;wBAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;wBACpD,IAAI,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;4BACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,UAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,mCAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,GAAG,CAAC,UAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,mCAAI,CAAC,CAAC,CAAC,CAAC,CAAC;4BACzK,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,UAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,mCAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,GAAG,CAAC,UAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,mCAAI,CAAC,CAAC,CAAC,CAAC,CAAC;4BACzK,uBAAuB;4BACvB,uBAAuB;4BACvB,kFAAkF;4BAClF,MAAM,cAAc,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;4BACzC,MAAM,YAAY,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;4BACvC,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;4BACpE,IAAI,cAAc,IAAI,YAAY,EAAE,CAAC;gCACjC,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;gCACxB,MAAM,CAAC,cAAc,GAAG,cAAc,CAAC;gCACvC,MAAM,CAAC,YAAY,GAAG,YAAY,CAAC;4BACvC,CAAC;4BACD,IAAI,MAAM,EAAE,CAAC;gCACT,MAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;4BAC/B,CAAC;iCAAM,CAAC;gCACJ,OAAO,CAAC,KAAK,CAAC,8CAA8C,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;4BACtF,CAAC;wBACL,CAAC;oBACL,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;CACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;AC1FwC;AACiB;AACF;AACgC;AAC7C;AACE;AACkE;AAC9D;AACb;AACJ;AACa;AACE;AAmIxC,MAAM,YAAY;IAyBrB,YAA4B,IAAY,EAAE,OAA6B;QAA3C,SAAI,GAAJ,IAAI,CAAQ;QAnBjC,aAAQ,GAAG,IAAI,GAAG,EAAmB,CAAC;QACtC,WAAM,GAAG,IAAI,GAAG,EAAiB,CAAC;QAClC,iBAAY,GAAG,IAAI,GAAG,EAAiB,CAAC;QACxC,cAAS,GAAG,IAAI,GAAG,EAAuD,CAAC;QAC3E,eAAU,GAAe,qDAAW,CAAC;QAGpC,iBAAY,GAAG,IAAI,sDAAW,CAAC,kDAAW,CAAC,CAAC;QAC5C,iBAAY,GAAG,IAAI,sDAAW,CAAC,0DAAa,CAAC,CAAC;QAGtC,gBAAW,GAAW,CAAC,CAAC;QACxB,gBAAW,GAAW,CAAC,CAAC;QACxB,uBAAkB,GAAY,IAAI,CAAC;QACnC,0BAAqB,GAAY,KAAK,CAAC;QACvC,6BAAwB,GAAY,KAAK,CAAC;QAC1C,aAAQ,GAAY,KAAK,CAAC;QAC1B,WAAM,GAAY,IAAI,CAAC;QAGnC,MAAM,EACF,kBAAkB,EAClB,wBAAwB,EACxB,yBAAyB,EACzB,OAAO,EACP,qBAAqB,EACrB,UAAU,EACV,MAAM,EACN,QAAQ,EACR,WAAW,EACd,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,IAAI,CAAC,MAAM,CAAC;QACpC,IAAI,CAAC,QAAQ,GAAG,QAAQ,aAAR,QAAQ,cAAR,QAAQ,GAAI,IAAI,CAAC,QAAQ,CAAC;QAC1C,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,aAAlB,kBAAkB,cAAlB,kBAAkB,GAAI,IAAI,CAAC,kBAAkB,CAAC;QACxE,IAAI,CAAC,wBAAwB,GAAG,wBAAwB,aAAxB,wBAAwB,cAAxB,wBAAwB,GAAI,IAAI,CAAC,wBAAwB,CAAC;QAC1F,IAAI,CAAC,qBAAqB,GAAG,qBAAqB,aAArB,qBAAqB,cAArB,qBAAqB,GAAI,IAAI,CAAC,qBAAqB,CAAC;QACjF,IAAI,CAAC,WAAW,GAAG,WAAW,aAAX,WAAW,cAAX,WAAW,GAAI,IAAI,CAAC,WAAW,CAAC;QACnD,IAAI,CAAC,UAAU,GAAG,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,IAAI,CAAC,UAAU,CAAC;QAChD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,KAAK,MAAM,GAAG,IAAI,yBAAyB,EAAE,CAAC;YAC1C,IAAI,CAAC,+BAA+B,CAAC,GAAG,EAAE,yBAAyB,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9E,CAAC;IAEL,CAAC;IACD,KAAK,CAAC,IAAI;;QACN,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACtD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,IAAI,CAAC;gBACD,IAAI,CAAC,eAAe,GAAG,uDAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3D,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,OAAO,CAAC,KAAK,CAAC,0CAA0C,IAAI,CAAC,IAAI,2FAA2F,CAAC,CAAC;gBAC9J,OAAO,CAAC,KAAK,CAAC,oEAAoE,CAAC;gBACnF,MAAM,CAAC,CAAC;YACZ,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,eAAe,GAAG,IAA2B,CAAC;QACvD,CAAC;QAED,IAAI,yDAAO,CAAC,YAAY,CAAC,oBAAoB,EAAE,UAAI,CAAC,eAAe,CAAC,WAAW,mCAAI,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC;YAC/F,OAAO,CAAC,IAAI,CAAC,iDAAiD,YAAY,CAAC,oBAAoB,uCAAuC,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC;QAC7K,CAAC;QAED,2BAA2B;QAC3B,oBAAoB;QACpB,MAAM,YAAY,GAAgC,EAAE,CAAC;QACrD,KAAK,IAAI,OAAO,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACrD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBAClB,MAAM,SAAS,GAAG,8DAAkB,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC/E,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;gBACpD,MAAM,eAAe,GAAG,IAAI,6CAAO,CAAC;oBAChC,KAAK;oBACL,WAAW,EAAE,OAAO;iBACvB,CAAC,CAAC;gBACH,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;YACpD,CAAC;iBAAM,CAAC;gBACJ,IAAI,OAAO,CAAC,UAAU,KAAK,gBAAgB,EAAE,CAAC;oBAC1C,OAAO,CAAC,IAAI,CAAC,iCAAiC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;gBACxE,CAAC;YACL,CAAC;QACL,CAAC;QAED,6BAA6B;QAC7B,0BAA0B;QAC1B,KAAK,IAAI,KAAK,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC;YAC5C,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;gBACxB,kBAAkB;gBAClB,MAAM,SAAS,GAAG,8DAAkB,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,eAAe,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;gBACrF,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,EAAE;oBACxC,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,UAAU,EAAE,IAAI,CAAC,UAAU;oBAC3B,WAAW,EAAE,IAAI,CAAC,YAAY;oBAC9B,OAAO,EAAE,IAAI,CAAC,OAAO;iBACxB,CAAC,CAAC;YACP,CAAC;iBAAM,CAAC;gBACJ,kBAAkB;gBAClB,MAAM,aAAa,GAAG,IAAI,yCAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;gBAC7C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;gBAC1C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,aAAa,CAAC,CAAC;YACzE,CAAC;QACL,CAAC;QAED,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACxE,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACvC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACtD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACrF,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC;IAC5C,CAAC;IAAA,CAAC;IAEF,QAAQ;QACJ,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,+BAA+B,CAAC,oBAA4B,EAAE,OAAoD;QAC9G,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;IAED,iCAAiC,CAAC,SAAsE;QACpG,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;YAC1B,IAAI,CAAC,+BAA+B,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9D,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,QAAQ,CAAC,UAAkB;QACvB,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED;;;OAGG;IACH,eAAe,CAAC,eAAwB;QACpC,IAAI,OAAO,GAAkB,EAAE,CAAC;QAChC,IAAI,eAAe,EAAE,CAAC;YAClB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;YAC7C,IAAI,KAAK,EAAE,CAAC;gBACR,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBAC7B,IAAI,KAAK,YAAY,uDAAW,EAAE,CAAC;wBAC/B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACxB,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;gBACvC,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBAC7B,IAAI,KAAK,YAAY,uDAAW,EAAE,CAAC;wBAC/B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACxB,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;QAED,OAAO,OAAO;IAClB,CAAC;IAED,aAAa,CAAC,UAAmB;QAC7B,IAAI,OAAO,GAAgB,EAAE,CAAC;QAC9B,IAAI,UAAU,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YACxC,IAAI,KAAK,EAAE,CAAC;gBACR,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBAC7B,IAAI,KAAK,YAAY,kDAAS,EAAE,CAAC;wBAC7B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACxB,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;gBACvC,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBAC7B,IAAI,KAAK,YAAY,kDAAS,EAAE,CAAC;wBAC7B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACxB,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,gBAAgB,CAAC,UAAmB;QAChC,IAAI,OAAO,GAAmB,EAAE,CAAC;QACjC,IAAI,UAAU,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YACxC,IAAI,KAAK,EAAE,CAAC;gBACR,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBAC7B,IAAI,KAAK,YAAY,yDAAY,EAAE,CAAC;wBAChC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACxB,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;gBACvC,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBAC7B,IAAI,KAAK,YAAY,yDAAY,EAAE,CAAC;wBAChC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACxB,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;;OAIG;IACH,2BAA2B,CAAC,UAAkB,EAAE,MAAiB;QAC7D,IAAI,OAAO,GAAyB,EAAE,CAAC;QACvC,MAAM,cAAc,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACnG,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAC3C,KAAK,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;gBACvB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,CAAC,UAAU,CAAC,CAAC,CAAC;YAC5E,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;;OAIG;IACH,sBAAsB,CAAC,eAAuB,EAAE,KAAW,EAAE,MAAiB;QAC1E,IAAI,OAAO,GAAyB,EAAE,CAAC;QACvC,MAAM,cAAc,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACnG,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAC3C,KAAK,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;gBACvB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC,CAAC;YACnF,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;;OAIG;IACH,uBAAuB,CAAC,UAAkB,EAAE,MAAiB;QACzD,IAAI,OAAO,GAAkB,EAAE,CAAC;QAChC,MAAM,cAAc,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACnG,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAC3C,KAAK,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;gBACvB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,UAAU,CAAC,CAAC,CAAC;YACxE,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;;;OAKG;IACH,kBAAkB,CAAC,eAAuB,EAAE,KAAW,EAAE,MAAiB;QACtE,IAAI,OAAO,GAAkB,EAAE,CAAC;QAChC,MAAM,cAAc,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACnG,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAC3C,KAAK,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;gBACvB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC,CAAC;YAC/E,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;OAGG;IACH,cAAc,CAAC,MAAiB;QAC5B,MAAM,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;QACxD,IAAI,MAAM,GAAuB,IAAI,CAAC;QACtC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACvC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC/C,SAAS;YACb,CAAC;YACD,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;YACzE,IAAI,cAAc,EAAE,CAAC;gBACjB,MAAM,UAAU,GAAG,kDAAW,CAAC,aAAa,CACxC,cAAc,CAAC,OAAO,CAAC,SAAS,GAAG,cAAc,CAAC,OAAO,CAAC,OAAO,EACjE,cAAc,CAAC,OAAO,CAAC,UAAU,GAAG,cAAc,CAAC,OAAO,CAAC,IAAI,EAC/D,6CAAM,CAAC,IAAI,EACX,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBAChC,IAAI,CAAC,MAAM,EAAE,CAAC;oBACV,MAAM,GAAG,UAAU,CAAC;gBACxB,CAAC;qBAAM,CAAC;oBACJ,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBACxC,CAAC;YACL,CAAC;QACL,CAAC;QACD,OAAO,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,IAAI,kDAAW,EAAE,CAAC;IACvC,CAAC;IAED,UAAU,CAAC,KAAY,EAAE,OAA2B;;QAChD,MAAM,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,EAAC,GAAG,EAAE,8CAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,GAAG,OAAO,EAAC,CAAC;QAErF,KAAK,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;YAC5C,IAAI,aAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,WAAW,0CAAE,MAAM,EAAE,CAAC;gBAC/B,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC5D,SAAS;gBACb,CAAC;YACL,CAAC;YACD,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBAC7B,IAAI,KAAK,YAAY,kDAAS,IAAI,KAAK,YAAY,yDAAY,EAAE,CAAC;oBAC9D,KAAK,CAAC,OAAO,CAAC,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBAC/C,IAAI,CAAC,eAAe,EAAE,CAAC;wBACnB,KAAK,CAAC,OAAO,CAAC,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;oBAC9D,CAAC;oBACD,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC;gBAC5B,CAAC;qBAAM,CAAC;oBACJ,KAAK,CAAC,YAAY,EAAE;oBACpB,KAAK,IAAI,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;wBAChC,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,yDAAkB,CAAC,CAAC;wBAC1C,IAAI,EAAE,EAAE,CAAC;4BACL,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;4BACzB,IAAI,CAAC,eAAe,EAAE,CAAC;gCACnB,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;4BACxC,CAAC;wBACL,CAAC;wBACD,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;oBACtB,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;QAED,IAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9D,IAAI,MAAM,EAAE,CAAC;gBACT,KAAK,CAAC,MAAM,CAAC,GAAG,GAAG,8CAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBACnD,MAAM,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,iBAAiB,EAAE,KAAK,MAAM,CAAC,CAAC;gBAC5F,IAAI,IAAI,EAAE,CAAC;oBACP,KAAK,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;gBACtC,CAAC;YACL,CAAC;QACL,CAAC;QAED,IAAI,IAAI,CAAC,wBAAwB,EAAE,CAAC;YAChC,IAAI,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,WAAW,CAAC,CAAC;YACvD,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC7B,KAAK,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC5C,IAAI,aAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,WAAW,0CAAE,MAAM,EAAE,CAAC;oBAC/B,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;wBAC5D,SAAS;oBACb,CAAC;gBACL,CAAC;gBACD,KAAK,CAAC,eAAe,GAAG,KAAK,CAAC,eAAe,CAAC;gBAC9C,MAAM;YACV,CAAC;QACL,CAAC;IAGL,CAAC;;AAnXa,iCAAoB,GAAG,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;AC/IC;AAEL;AACW;AACxB;AACI;AAWpC;;GAEG;AACI,MAAM,aAAa;IAMtB,YAA4B,IAAY,EAAkB,QAAsB,EAAE,OAA8B;QAApF,SAAI,GAAJ,IAAI,CAAQ;QAAkB,aAAQ,GAAR,QAAQ,CAAc;QALxE,eAAU,GAAe,qDAAW,CAAC;QAG7B,WAAM,GAAY,IAAI,CAAC;QACvB,aAAQ,GAAY,KAAK,CAAC;QAEtC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;QAC9E,IAAI,CAAC,UAAU,GAAG,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,IAAI,CAAC,UAAU,CAAC;QAChD,IAAI,CAAC,MAAM,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,IAAI,CAAC,MAAM,CAAC;QACpC,IAAI,CAAC,QAAQ,GAAG,QAAQ,aAAR,QAAQ,cAAR,QAAQ,GAAI,IAAI,CAAC,QAAQ,CAAC;QAC1C,IAAI,CAAC,WAAW,GAAG,WAAW,aAAX,WAAW,cAAX,WAAW,GAAI,IAAI,sDAAW,CAAC,kDAAW,CAAC,CAAC;QAC/D,IAAI,CAAC,OAAO,GAAG,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,IAAI,CAAC,OAAO,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,IAAI;QACN,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACtD,IAAI,KAAgB,CAAC;QACrB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,IAAI,CAAC;gBACD,KAAK,GAAG,6CAAS,CAAC,KAAK,CAAC,IAAI,CAAC;YACjC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,OAAO,CAAC,KAAK,CAAC,sCAAsC,IAAI,CAAC,IAAI,iDAAiD,CAAC,CAAC;gBAChH,MAAM,CAAC,CAAC;YACZ,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,KAAK,GAAG,IAAiB,CAAC;QAC9B,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,GAAG,IAAI,yCAAK,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvD,CAAC;IACD,QAAQ;QACJ,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IACvB,CAAC;CAEJ;;;;;;;;;;;;;;;;;;;ACrDiC;AACW;AACE;AAEN;AAGlC,MAAM,KAAK;IAKd,YAAmB,SAAoB,EAAS,QAAsB;;QAAnD,cAAS,GAAT,SAAS,CAAW;QAAS,aAAQ,GAAR,QAAQ,CAAc;QAF/D,WAAM,GAA+C,EAAE,CAAC;QAG3D,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;YACtB,IAAI,CAAC,eAAe,GAAG,4CAAK,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,SAAS,CAAC,cAAc,EAAE,CAAC;YAC3B,IAAI,KAAK,GAAG,QAAQ,CAAC,WAAW,CAAC;YACjC,IAAI,MAAM,GAAG,SAAS,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC;YACxD,KAAK,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;gBACvB,IAAI,YAAK,CAAC,eAAe,0CAAE,MAAM,MAAK,CAAC,EAAE,CAAC;oBACtC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,sDAAW,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;gBACpE,CAAC;gBAED,IAAI,YAAK,CAAC,SAAS,0CAAE,MAAM,MAAK,CAAC,EAAE,CAAC;oBAChC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,kDAAS,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;gBAClE,CAAC;gBAED,mEAAmE;gBACnE,IAAI,YAAK,CAAC,UAAU,0CAAE,MAAM,MAAK,CAAC,IAAI,YAAK,CAAC,cAAc,0CAAE,MAAM,MAAK,CAAC,EAAE,CAAC;oBACvE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,wDAAY,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;gBACrE,CAAC;gBACD,KAAK,EAAE,CAAC;YACZ,CAAC;QACL,CAAC;IACL,CAAC;CACJ;;;;;;;;;;;;;;;AChCA;;GAEG;AACI,MAAM,WAAW;IAIrB,YAA4B,IAA+B;QAA/B,SAAI,GAAJ,IAAI,CAA2B;QAHnD,YAAO,GAAG,KAAK,CAAC;QACxB,UAAK,GAAG,IAAI,GAAG,EAAa,CAAC;IAEgC,CAAC;IAE9D,QAAQ,CAAC,GAAG,IAAW;QACpB,IAAI,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9C,IAAI,QAAQ,EAAE,CAAC;YACZ,OAAO,QAAQ,CAAC;QACnB,CAAC;QAED,QAAQ,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;QACzC,OAAO,QAAQ,CAAC;IACnB,CAAC;IAED,MAAM;QACH,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAChB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1C,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC9E,CAAC;IAED,KAAK,CAAC,IAAI;QACP,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAE1E,qCAAqC;QACrC,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBAChC,OAAO,CAAC,KAAK,CAAC,6BAA6B,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,wDAAwD,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;gBACnI,OAAO,EAAE,CAAC;YACb,CAAC;QACJ,CAAC;QACD,IAAI,OAAO,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,iBAAiB,OAAO,YAAY,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACvB,CAAC;CACH;;;;;;;;;;;;;;;;;;AC7CK,SAAS,gBAAgB,CAAC,SAAiB;IAC/C,MAAM,kBAAkB,GAAG,yCAAyC;IAEpE,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAEpD,IAAI,OAAO,EAAE,CAAC;QACX,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACzB,OAAO,KAAK,CAAC;IAChB,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,wCAAwC,SAAS,EAAE,CAAC,CAAC;AACxE,CAAC;AAEM,SAAS,OAAO,CAAC,SAAiB,EAAE,OAAgB;IAExD,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;QACtC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5B,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5B,OAAO,MAAM,CAAC;YACjB,CAAC;QACJ,CAAC;aAAM,CAAC;YACL,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,KAAK,EAAE,CAAC;gBACT,OAAO,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAAA;AAAA,EAAC;YAC/C,CAAC;QACJ,CAAC;IACJ,CAAC;IACD,OAAO,SAAS,CAAC;AACpB,CAAC;AAEM,SAAS,SAAS,CAAC,SAAiB,EAAE,OAAiB;IAC3D,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC3B,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;QACtC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5B,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5B,OAAO,IAAI,CAAC;YACf,CAAC;QACJ,CAAC;aAAM,CAAC;YACL,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,KAAK,EAAE,CAAC;gBACT,OAAO,IAAI,CAAC;YACf,CAAC;QACJ,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AAChB,CAAC;AAGM,SAAS,kBAAkB,CAAC,QAAgB,EAAE,cAAsB,EAAE,OAAiB;IAC3F,IAAI,SAAS,CAAC,cAAc,EAAE,OAAO,CAAC,IAAI,OAAO,EAAE,CAAC;QACjD,OAAO,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,iCAAiC;IACjC,IAAI,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,OAAO,cAAc,CAAC;IACzB,CAAC;IAED,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,aAAa,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAChD,0DAA0D;IAC1D,IAAI,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACrD,WAAW,CAAC,GAAG,EAAE,CAAC;IACrB,CAAC;IACD,OAAO,WAAW,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACtD,CAAC;;;;;;;;;;;;;;;;ACrEmE;AAO7D,MAAM,SAAS;IAOlB,YAAY,KAAY,EAAE,SAA4B,EAAE,QAAsB,EAAkB,KAAa;;QAAb,UAAK,GAAL,KAAK,CAAQ;QACzG,IAAI,CAAC,QAAQ,GAAG,8CAAG,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACpE,IAAI,CAAC,MAAM,GAAG,8CAAG,CAAC,SAAS,CAAC,gBAAgB,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC1E,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,8CAAO,CAAC;YACvB,IAAI,EAAE,SAAS,CAAC,YAAY;YAC5B,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;YACnC,SAAS,EAAE,SAAS,CAAC,UAAU;YAC/B,UAAU,EAAE,SAAS,CAAC,UAAU;YAChC,IAAI,EAAE,SAAS,CAAC,MAAM;YACtB,OAAO,EAAE,SAAS,CAAC,MAAM;SAC5B,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,wDAAiB,CAAC,CAAC;QACrD,QAAQ,CAAC,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC;QAGvC,IAAI,SAAS,CAAC,eAAe,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;YAChE,KAAK,IAAI,IAAI,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;gBACnC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;gBAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;gBAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBACpD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;oBACf,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,UAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,mCAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,GAAG,CAAC,UAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,mCAAI,CAAC,CAAC,CAAC,CAAC,CAAC;oBACzK,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,UAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,mCAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,GAAG,CAAC,UAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,mCAAI,CAAC,CAAC,CAAC,CAAC,CAAC;oBACzK,uBAAuB;oBACvB,uBAAuB;oBACvB,kFAAkF;oBAClF,MAAM,cAAc,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;oBACzC,MAAM,YAAY,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;oBACvC,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;oBACpE,IAAI,cAAc,IAAI,YAAY,EAAE,CAAC;wBACjC,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;wBACxB,MAAM,CAAC,cAAc,GAAG,cAAc,CAAC;wBACvC,MAAM,CAAC,YAAY,GAAG,YAAY,CAAC;oBACvC,CAAC;oBACD,IAAI,MAAM,EAAE,CAAC;wBACT,MAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;oBAC/B,CAAC;yBAAM,CAAC;wBACJ,OAAO,CAAC,KAAK,CAAC,8CAA8C,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;oBACtF,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,SAAS,CAAC,eAAe,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACtG,CAAC;IAEL,CAAC;CACJ;;;;;;;;;;;;;;;;AC/D4D;AAQtD,MAAM,OAAO;IAIhB,YAAY,OAAuB;;QAC/B,MAAM,EAAC,KAAK,EAAE,WAAW,EAAC,GAAG,OAAO,CAAC;QACrC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,WAAW,GAAG,kDAAW,CAAC,eAAe,CAAC;YAC3C,KAAK;YACL,IAAI,EAAE;gBACF,IAAI,EAAE,WAAW,CAAC,KAAK,GAAG,WAAW,CAAC,YAAY;gBAClD,OAAO,EAAE,WAAW,CAAC,KAAK,GAAG,WAAW,CAAC,YAAY;gBACrD,YAAY,EAAE,WAAW,CAAC,YAAY;gBACtC,WAAW,EAAE,WAAW,CAAC,YAAY;aACxC;YACD,OAAO,EAAE;gBACL,MAAM,EAAE;oBACJ,CAAC,EAAE,iBAAW,CAAC,OAAO,mCAAI,CAAC;oBAC3B,CAAC,EAAE,iBAAW,CAAC,OAAO,mCAAI,CAAC;iBAC9B;gBACD,YAAY,EAAE;oBACV,CAAC,EAAE,iBAAW,CAAC,OAAO,mCAAI,CAAC;oBAC3B,CAAC,EAAE,iBAAW,CAAC,OAAO,mCAAI,CAAC;iBAC9B;aACJ;SACJ,CAAC,CAAC;IACP,CAAC;CACJ;;;;;;;;;;;;;;;;;;;;;ACpCuB;AAIxB,MAAM,oBAAoB,GAAG,kCAAC,CAAC,MAAM,CAAC;IAClC,CAAC,EAAE,kCAAC,CAAC,MAAM,EAAE;IACb,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,CAAC,EAAE,kCAAC,CAAC,MAAM,EAAE;IACb,CAAC,EAAE,kCAAC,CAAC,MAAM,EAAE;IACb,CAAC,EAAE,kCAAC,CAAC,MAAM,EAAE;CAChB,CAAC,CAAC;AACH,MAAM,SAAS,GAAG,kCAAC,CAAC,KAAK,CAAC,CAAC,kCAAC,CAAC,MAAM,EAAE,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AACpD,MAAM,iBAAiB,GAAG,kCAAC,CAAC,MAAM,CAAC;IAC/B,YAAY,EAAE,kCAAC,CAAC,MAAM,EAAE;IACxB,MAAM,EAAE,oBAAoB,CAAC,QAAQ,EAAE;IACvC,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE,EAAC,mJAAmJ;IACtK,OAAO,EAAE,kCAAC,CAAC,GAAG,EAAE;IAChB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;CACrB,CAAC;AACF,MAAM,gBAAgB,GAAG,kCAAC,CAAC,MAAM,CAAC;IAC9B,CAAC,EAAE,kCAAC,CAAC,MAAM,EAAE;IACb,CAAC,EAAE,kCAAC,CAAC,MAAM,EAAE,EAAE,sBAAsB;IACrC,EAAE,EAAE,SAAS;IACb,GAAG,EAAE,SAAS;IACd,CAAC,EAAE,kCAAC,CAAC,MAAM,EAAE;CAChB,CAAC,CAAC;AAEI,MAAM,kBAAkB,GAAG,kCAAC,CAAC,MAAM,CAAC;IACvC,MAAM,EAAE,SAAS;IACjB,YAAY,EAAE,kCAAC,CAAC,MAAM,EAAE;IACxB,OAAO,EAAE,SAAS;IAClB,YAAY,EAAE,kCAAC,CAAC,MAAM,EAAE;IACxB,MAAM,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,EAAE,CAAC;IAC3B,MAAM,EAAE,oBAAoB,CAAC,QAAQ,EAAE;IACvC,QAAQ,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,QAAQ,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,cAAc,EAAE,kCAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC;IAC1C,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;IACf,EAAE,EAAE,SAAS;IACb,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;CACpB,CAAC,CAAC;AAGI,MAAM,iBAAiB,GAAG,kCAAC,CAAC,MAAM,CAAC;IACtC,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,YAAY,EAAE,kCAAC,CAAC,MAAM,EAAE;IACxB,SAAS,EAAE,kCAAC,CAAC,MAAM,EAAE;IACrB,gBAAgB,EAAE,kCAAC,CAAC,MAAM,EAAE;IAC5B,gBAAgB,EAAE,kCAAC,CAAC,MAAM,EAAE;IAC5B,eAAe,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACtC,gBAAgB,EAAC,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACtC,MAAM,EAAE,kCAAC,CAAC,KAAK,CAAC,CAAC,kCAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;IAC1G,cAAc,EAAE,kCAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,sBAAsB;IACjE,eAAe,EAAE,kCAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAC,wBAAwB;IACrE,SAAS,EAAE,kCAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC;IACpC,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;IACf,UAAU,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,EAAE,CAAC,EAAE,oDAAoD;IACrF,WAAW,EAAE,kCAAC,CAAC,MAAM,EAAE;IACvB,OAAO,EAAE,kCAAC,CAAC,MAAM,EAAE;IACnB,kBAAkB,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACzC,SAAS,EAAE,kCAAC,CAAC,MAAM,EAAE;IACrB,SAAS,EAAE,kCAAC,CAAC,MAAM,EAAE;IACrB,OAAO,EAAE,kCAAC,CAAC,OAAO,EAAE;CACvB,CAAC,CAAC;AAGI,MAAM,SAAS,GAAG,kCAAC,CAAC,MAAM,CAAC;IAC9B,SAAS,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,OAAO,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,OAAO,EAAE,kCAAC,CAAC,MAAM,CAAC;QACd,QAAQ,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,KAAK,CAAC,CAAC,kCAAC,CAAC,MAAM,EAAE,EAAE,kCAAC,CAAC,MAAM,EAAE,EAAE,kCAAC,CAAC,MAAM,EAAE,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,sCAAsC;QACpH,KAAK,EAAE,kCAAC,CAAC,KAAK,CAAC,CAAC,kCAAC,CAAC,MAAM,EAAE,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACxC,SAAS,EAAE,SAAS;KACvB,CAAC,CAAC,QAAQ,EAAE;IACb,YAAY,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,CAAC;QAC3B,GAAG,EAAE,kCAAC,CAAC,KAAK,CAAC,CAAC,kCAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QAClM,QAAQ,EAAE,kCAAC,CAAC,MAAM,EAAE;KACvB,CAAC,CAAC;IACH,SAAS,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,eAAe,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACtC,cAAc,EAAE,kCAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC;IAC1C,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;IACf,cAAc,EAAE,kCAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,QAAQ,EAAE,EAAE,gDAAgD;IACvG,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;IACjB,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;IACjB,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;IACf,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;CACrB,CAAC,CAAC;AAGH,MAAM,SAAS,GAAG,kCAAC,CAAC,MAAM,CAAC;IACvB,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;IACf,MAAM,EAAE,kCAAC,CAAC,KAAK,CAAC,SAAS,CAAC;IAC1B,eAAe,EAAC,kCAAC,CAAC,MAAM,EAAE;IAC1B,cAAc,EAAE,kCAAC,CAAC,MAAM,EAAE;IAC1B,6BAA6B;IAC7B,WAAW,EAAE,kCAAC,CAAC,KAAK,CAAC,CAAC,kCAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC;CAChI,CAAC,CAAC;AAGH,MAAM,uBAAuB,GAAG,kCAAC,CAAC,MAAM,CAAC;IACrC,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;IACjB,EAAE,EAAE,kCAAC,CAAC,MAAM,EAAE;IACd,QAAQ,EAAE,oBAAoB,CAAC,QAAQ,EAAE;CAC5C,CAAC,CAAC;AAEH,MAAM,kBAAkB,GAAG,kCAAC,CAAC,MAAM,CAAC;IAChC,eAAe,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACtC,cAAc,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACrC,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,IAAI,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,EAAE,CAAC;IACzB,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;IACf,MAAM,EAAE,kCAAC,CAAC,KAAK,CAAC,uBAAuB,CAAC;CAC3C,CAAC;AAIF,MAAM,qBAAqB,GAAG,kCAAC,CAAC,MAAM,CAAC;IACnC,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,UAAU,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,CAAC;QACzB,IAAI,EAAE,kCAAC,CAAC,MAAM,EAAE;QAChB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;KACrB,CAAC,CAAC;IACH,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,QAAQ,EAAE,kCAAC,CAAC,QAAQ,CAAC,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,CAAC;QAClC,WAAW,EAAE,kCAAC,CAAC,MAAM,EAAE;QACvB,OAAO,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,EAAE,CAAC;KAC/B,CAAC,CAAC,CAAC;IACJ,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,OAAO,EAAE,kCAAC,CAAC,MAAM,EAAE;IACnB,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;IACjB,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;IACjB,OAAO,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,OAAO,EAAE,kCAAC,CAAC,MAAM,EAAE;IACnB,IAAI,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,EAAE,CAAC;IACzB,iBAAiB,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACxC,YAAY,EAAE,kCAAC,CAAC,MAAM,EAAE;IACxB,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;CAClB,CAAC;AAGK,MAAM,mBAAmB,GAAG,kCAAC,CAAC,MAAM,CAAC;IACxC,MAAM,EAAE,kCAAC,CAAC,KAAK,CAAC,CAAC,kCAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;IAC1G,qBAAqB,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5C,cAAc,EAAE,kCAAC,CAAC,MAAM,EAAE;IAC1B,QAAQ,EAAE,kCAAC,CAAC,MAAM,EAAE;IACpB,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,aAAa,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,CAAC;QAC5B,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;QACjB,QAAQ,EAAE,kCAAC,CAAC,MAAM,EAAE;QACpB,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QACjC,IAAI,EAAE,oBAAoB,CAAC,QAAQ,EAAE;QACrC,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;KACpB,CAAC,CAAC;IACH,mBAAmB,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,CAAC;QAClC,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC5B,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QACjC,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;KAClB,CAAC,CAAC;IACH,eAAe,EAAE,kCAAC,CAAC,MAAM,EAAE;IAC3B,eAAe,EAAE,kCAAC,CAAC,MAAM,EAAE;IAC3B,eAAe,EAAE,kCAAC,CAAC,OAAO,EAAE;IAC5B,SAAS,EAAE,kCAAC,CAAC,MAAM,EAAE;IACrB,SAAS,EAAE,kCAAC,CAAC,MAAM,EAAE;IACrB,aAAa,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpC,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;CAClB,CAAC,CAAC;AAGI,MAAM,oBAAoB,GAAG,kCAAC,CAAC,MAAM,CAAC;IACzC,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;IACjB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;IACtB,gBAAgB,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,EAAE,CAAC;IACrC,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;IAClB,QAAQ,EAAE,oBAAoB,CAAC,QAAQ,EAAE;IACzC,cAAc,EAAE,kCAAC,CAAC,KAAK,CAAC;QACpB,kCAAC,CAAC,OAAO,CAAC,OAAO,CAAC;QAClB,kCAAC,CAAC,OAAO,CAAC,WAAW,CAAC;QACtB,kCAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;QACnB,kCAAC,CAAC,OAAO,CAAC,SAAS,CAAC;QACpB,kCAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC;QAC5B,kCAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC;QAC9B,kCAAC,CAAC,OAAO,CAAC,WAAW,CAAC;KACzB,CAAC;IACF,SAAS,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,UAAU,EAAE,oBAAoB,CAAC,QAAQ,EAAE;IAC3C,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;IACf,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;CACpB,CAAC,CAAC;AAGH,MAAM,eAAe,GAAG,kCAAC,CAAC,MAAM,CAAC;IAC7B,QAAQ,EAAE,kCAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC;IACxC,KAAK,EAAE,kCAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC;IAClC,MAAM,EAAE,kCAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC;IACpC,QAAQ,EAAE,kCAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC;CAC1C,CAAC;AAGK,MAAM,mBAAmB,GAAG,kCAAC,CAAC,MAAM,CAAC;IACxC,GAAG,EAAE,kCAAC,CAAC,MAAM,EAAE;IACf,OAAO,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,IAAI,EAAE,eAAe;IACrB,cAAc,EAAE,kCAAC,CAAC,OAAO,EAAE;IAC3B,WAAW,EAAE,kCAAC,CAAC,MAAM,EAAE;IACvB,MAAM,EAAE,kCAAC,CAAC,KAAK,CAAC,SAAS,CAAC;IAC1B,GAAG,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,CAAC;QAClB,UAAU,EAAE,kCAAC,CAAC,MAAM,EAAE;QACtB,aAAa,EAAE,kCAAC,CAAC,KAAK,CAAC,kCAAC,CAAC,MAAM,CAAC;YAC5B,MAAM,EAAE,kCAAC,CAAC,GAAG,EAAE;YACf,KAAK,EAAE,kCAAC,CAAC,MAAM,EAAE;YACjB,IAAI,EAAE,kCAAC,CAAC,MAAM,EAAE;YAChB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;YAClB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;YAClB,MAAM,EAAE,kCAAC,CAAC,MAAM,EAAE;SACrB,CAAC,CAAC;KACN,CAAC,CAAC;IACH,yBAAyB;IACzB,eAAe,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACtC,cAAc,EAAE,kCAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACrC,uCAAuC;IACvC,WAAW,EAAE,kCAAC,CAAC,KAAK,CAAC,CAAC,kCAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,kCAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACxI,MAAM,EAAE,kCAAC,CAAC,KAAK,CAAC,SAAS,CAAC;CAC7B,CAAC,CAAC;;;;;;;UC1OH;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;;;;WCtBA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA,E;;;;;WCPA,wF;;;;;WCAA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D,E;;;;;;;;;;;;;;ACLgC;AACE;AACc;AAChD,4CAAQ,CAAC,sBAAsB,EAAE,CAAC;AAClC,MAAM,IAAI,GAAG,IAAI,6CAAS,CAAC;IACvB,UAAU,EAAE;QACR,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,GAAG;KACd;IACD,kBAAkB,EAAE,KAAK;IACzB,QAAQ,EAAE,IAAI;IACd,UAAU,EAAE,CAAC;IACb,WAAW,EAAE,kDAAc,CAAC,SAAS;CACxC,CAAC,CAAC;AAEH,IAAI,CAAC,KAAK,CAAC,8CAAM,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;IACzB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAE3B,iDAAS,CAAC,YAAY,CAAC,+BAA+B,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE;QAC5E,MAAM,MAAM,GAAG,IAAI,2CAAM,CAAC;YACtB,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,0CAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC/D,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK;YACzB,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM;YAC3B,GAAG,EAAE,KAAK,CAAC,QAAQ;YACnB,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK;SACvB,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAClB,CAAC,CAAC,CAAC;IACH,uEAAuE;IACvE,YAAY;IACZ,iDAAS,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE;QACjD,GAAG,EAAE,0CAAM,CAAC,CAAC,EAAE,CAAC,CAAC;QACjB,WAAW,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;KACtC,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,aAAa,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5E,IAAI,MAAM,YAAY,2CAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;QAC9C,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,iDAAS,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;QAC7E,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAChE,CAAC;AACL,CAAC,CAAC,CAAC","sources":["webpack://@excaliburjs/plugin-ldtk/webpack/universalModuleDefinition","webpack://@excaliburjs/plugin-ldtk/./node_modules/compare-versions/lib/esm/compare.js","webpack://@excaliburjs/plugin-ldtk/./node_modules/compare-versions/lib/esm/compareVersions.js","webpack://@excaliburjs/plugin-ldtk/./node_modules/compare-versions/lib/esm/utils.js","webpack://@excaliburjs/plugin-ldtk/./node_modules/excalibur/build/esm/excalibur.development.js","webpack://@excaliburjs/plugin-ldtk/./node_modules/zod/lib/index.mjs","webpack://@excaliburjs/plugin-ldtk/./sample/config.ts","webpack://@excaliburjs/plugin-ldtk/./sample/player.ts","webpack://@excaliburjs/plugin-ldtk/./sample/resources.ts","webpack://@excaliburjs/plugin-ldtk/./src/entity-layer.ts","webpack://@excaliburjs/plugin-ldtk/./src/file-loader.ts","webpack://@excaliburjs/plugin-ldtk/./src/index.ts","webpack://@excaliburjs/plugin-ldtk/./src/intgrid-layer.ts","webpack://@excaliburjs/plugin-ldtk/./src/ldtk-resource.ts","webpack://@excaliburjs/plugin-ldtk/./src/level-resource.ts","webpack://@excaliburjs/plugin-ldtk/./src/level.ts","webpack://@excaliburjs/plugin-ldtk/./src/loader-cache.ts","webpack://@excaliburjs/plugin-ldtk/./src/path-util.ts","webpack://@excaliburjs/plugin-ldtk/./src/tile-layer.ts","webpack://@excaliburjs/plugin-ldtk/./src/tileset.ts","webpack://@excaliburjs/plugin-ldtk/./src/types.ts","webpack://@excaliburjs/plugin-ldtk/webpack/bootstrap","webpack://@excaliburjs/plugin-ldtk/webpack/runtime/define property getters","webpack://@excaliburjs/plugin-ldtk/webpack/runtime/hasOwnProperty shorthand","webpack://@excaliburjs/plugin-ldtk/webpack/runtime/make namespace object","webpack://@excaliburjs/plugin-ldtk/./sample/main.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, () => {\nreturn ","import { compareVersions } from './compareVersions.js';\n/**\n * Compare [semver](https://semver.org/) version strings using the specified operator.\n *\n * @param v1 First version to compare\n * @param v2 Second version to compare\n * @param operator Allowed arithmetic operator to use\n * @returns `true` if the comparison between the firstVersion and the secondVersion satisfies the operator, `false` otherwise.\n *\n * @example\n * ```\n * compare('10.1.8', '10.0.4', '>'); // return true\n * compare('10.0.1', '10.0.1', '='); // return true\n * compare('10.1.1', '10.2.2', '<'); // return true\n * compare('10.1.1', '10.2.2', '<='); // return true\n * compare('10.1.1', '10.2.2', '>='); // return false\n * ```\n */\nexport const compare = (v1, v2, operator) => {\n // validate input operator\n assertValidOperator(operator);\n // since result of compareVersions can only be -1 or 0 or 1\n // a simple map can be used to replace switch\n const res = compareVersions(v1, v2);\n return operatorResMap[operator].includes(res);\n};\nconst operatorResMap = {\n '>': [1],\n '>=': [0, 1],\n '=': [0],\n '<=': [-1, 0],\n '<': [-1],\n '!=': [-1, 1],\n};\nconst allowedOperators = Object.keys(operatorResMap);\nconst assertValidOperator = (op) => {\n if (typeof op !== 'string') {\n throw new TypeError(`Invalid operator type, expected string but got ${typeof op}`);\n }\n if (allowedOperators.indexOf(op) === -1) {\n throw new Error(`Invalid operator, expected one of ${allowedOperators.join('|')}`);\n }\n};\n//# sourceMappingURL=compare.js.map","import { compareSegments, validateAndParse } from './utils.js';\n/**\n * Compare [semver](https://semver.org/) version strings to find greater, equal or lesser.\n * This library supports the full semver specification, including comparing versions with different number of digits like `1.0.0`, `1.0`, `1`, and pre-release versions like `1.0.0-alpha`.\n * @param v1 - First version to compare\n * @param v2 - Second version to compare\n * @returns Numeric value compatible with the [Array.sort(fn) interface](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#Parameters).\n */\nexport const compareVersions = (v1, v2) => {\n // validate input and split into segments\n const n1 = validateAndParse(v1);\n const n2 = validateAndParse(v2);\n // pop off the patch\n const p1 = n1.pop();\n const p2 = n2.pop();\n // validate numbers\n const r = compareSegments(n1, n2);\n if (r !== 0)\n return r;\n // validate pre-release\n if (p1 && p2) {\n return compareSegments(p1.split('.'), p2.split('.'));\n }\n else if (p1 || p2) {\n return p1 ? -1 : 1;\n }\n return 0;\n};\n//# sourceMappingURL=compareVersions.js.map","export const semver = /^[v^~<>=]*?(\\d+)(?:\\.([x*]|\\d+)(?:\\.([x*]|\\d+)(?:\\.([x*]|\\d+))?(?:-([\\da-z\\-]+(?:\\.[\\da-z\\-]+)*))?(?:\\+[\\da-z\\-]+(?:\\.[\\da-z\\-]+)*)?)?)?$/i;\nexport const validateAndParse = (version) => {\n if (typeof version !== 'string') {\n throw new TypeError('Invalid argument expected string');\n }\n const match = version.match(semver);\n if (!match) {\n throw new Error(`Invalid argument not valid semver ('${version}' received)`);\n }\n match.shift();\n return match;\n};\nconst isWildcard = (s) => s === '*' || s === 'x' || s === 'X';\nconst tryParse = (v) => {\n const n = parseInt(v, 10);\n return isNaN(n) ? v : n;\n};\nconst forceType = (a, b) => typeof a !== typeof b ? [String(a), String(b)] : [a, b];\nconst compareStrings = (a, b) => {\n if (isWildcard(a) || isWildcard(b))\n return 0;\n const [ap, bp] = forceType(tryParse(a), tryParse(b));\n if (ap > bp)\n return 1;\n if (ap < bp)\n return -1;\n return 0;\n};\nexport const compareSegments = (a, b) => {\n for (let i = 0; i < Math.max(a.length, b.length); i++) {\n const r = compareStrings(a[i] || '0', b[i] || '0');\n if (r !== 0)\n return r;\n }\n return 0;\n};\n//# sourceMappingURL=utils.js.map","/*!\n * excalibur - 0.30.1 - 2024-12-12\n * https://github.com/excaliburjs/Excalibur\n * Copyright (c) 2024 Excalibur.js \n * Licensed BSD-2-Clause\n * @preserve\n */\n/******/ var __webpack_modules__ = ({\n\n/***/ \"./Director/Loader.css\":\n/*!*****************************!*\\\n !*** ./Director/Loader.css ***!\n \\*****************************/\n/***/ ((module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/sourceMaps.js */ \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ \"../../node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `/* Buttons styles start */\r\n\r\nbutton#excalibur-play {\r\n display: inline-block;\r\n position: relative;\r\n z-index: 999;\r\n border-radius: 6px;\r\n border: none;\r\n /*border: 3px solid;\r\n border-color: white;\r\n box-shadow: 0 0 10px #ccc;*/\r\n padding: 1rem 1.5rem 1rem 4rem;\r\n margin: 0;\r\n text-decoration: none;\r\n background: #00b233;\r\n color: #ffffff;\r\n font-family: sans-serif;\r\n font-size: 2rem;\r\n white-space: nowrap;\r\n line-height: 1;\r\n cursor: pointer;\r\n text-align: center;\r\n transition:\r\n background 250ms ease-in-out,\r\n transform 150ms ease;\r\n -webkit-appearance: none;\r\n -moz-appearance: none;\r\n\r\n -webkit-animation: excalibur-button-fadein 200ms; /* Safari, Chrome and Opera > 12.1 */\r\n -moz-animation: excalibur-button-fadein 200ms; /* Firefox < 16 */\r\n -ms-animation: excalibur-button-fadein 200ms; /* Internet Explorer */\r\n -o-animation: excalibur-button-fadein 200ms; /* Opera < 12.1 */\r\n animation: excalibur-button-fadein 200ms;\r\n}\r\n\r\n/*\r\nbutton#excalibur-play {\r\n display: none;\r\n}*/\r\n\r\nbutton#excalibur-play:after {\r\n position: absolute;\r\n content: '';\r\n border: 8px solid;\r\n border-color: transparent transparent transparent white;\r\n left: 35px;\r\n top: 24px;\r\n width: 0;\r\n height: 0;\r\n}\r\n\r\nbutton#excalibur-play:before {\r\n position: absolute;\r\n content: '';\r\n border: 3px solid;\r\n left: 19px;\r\n top: 14px;\r\n border-radius: 20px;\r\n width: 30px;\r\n height: 30px;\r\n}\r\n\r\nbutton#excalibur-play:hover,\r\nbutton#excalibur-play:focus {\r\n background: #00982c;\r\n}\r\n\r\nbutton#excalibur-play:focus {\r\n outline: 1px solid #fff;\r\n outline-offset: -4px;\r\n}\r\n\r\nbutton#excalibur-play:active {\r\n transform: scale(0.99);\r\n}\r\n\r\n@keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n/* Firefox < 16 */\r\n@-moz-keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n/* Safari, Chrome and Opera > 12.1 */\r\n@-webkit-keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n/* Internet Explorer */\r\n@-ms-keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n/* Opera < 12.1 */\r\n@-o-keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./Director/Loader.css\"],\"names\":[],\"mappings\":\"AAAA,yBAAyB;;AAEzB;EACE,qBAAqB;EACrB,kBAAkB;EAClB,YAAY;EACZ,kBAAkB;EAClB,YAAY;EACZ;;+BAE6B;EAC7B,8BAA8B;EAC9B,SAAS;EACT,qBAAqB;EACrB,mBAAmB;EACnB,cAAc;EACd,uBAAuB;EACvB,eAAe;EACf,mBAAmB;EACnB,cAAc;EACd,eAAe;EACf,kBAAkB;EAClB;;wBAEsB;EACtB,wBAAwB;EACxB,qBAAqB;;EAErB,gDAAgD,EAAE,oCAAoC;EACtF,6CAA6C,EAAE,iBAAiB;EAChE,4CAA4C,EAAE,sBAAsB;EACpE,2CAA2C,EAAE,iBAAiB;EAC9D,wCAAwC;AAC1C;;AAEA;;;EAGE;;AAEF;EACE,kBAAkB;EAClB,WAAW;EACX,iBAAiB;EACjB,uDAAuD;EACvD,UAAU;EACV,SAAS;EACT,QAAQ;EACR,SAAS;AACX;;AAEA;EACE,kBAAkB;EAClB,WAAW;EACX,iBAAiB;EACjB,UAAU;EACV,SAAS;EACT,mBAAmB;EACnB,WAAW;EACX,YAAY;AACd;;AAEA;;EAEE,mBAAmB;AACrB;;AAEA;EACE,uBAAuB;EACvB,oBAAoB;AACtB;;AAEA;EACE,sBAAsB;AACxB;;AAEA;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF;;AAEA,iBAAiB;AACjB;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF;;AAEA,oCAAoC;AACpC;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF;;AAEA,sBAAsB;AACtB;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF;;AAEA,iBAAiB;AACjB;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF\",\"sourcesContent\":[\"/* Buttons styles start */\\r\\n\\r\\nbutton#excalibur-play {\\r\\n display: inline-block;\\r\\n position: relative;\\r\\n z-index: 999;\\r\\n border-radius: 6px;\\r\\n border: none;\\r\\n /*border: 3px solid;\\r\\n border-color: white;\\r\\n box-shadow: 0 0 10px #ccc;*/\\r\\n padding: 1rem 1.5rem 1rem 4rem;\\r\\n margin: 0;\\r\\n text-decoration: none;\\r\\n background: #00b233;\\r\\n color: #ffffff;\\r\\n font-family: sans-serif;\\r\\n font-size: 2rem;\\r\\n white-space: nowrap;\\r\\n line-height: 1;\\r\\n cursor: pointer;\\r\\n text-align: center;\\r\\n transition:\\r\\n background 250ms ease-in-out,\\r\\n transform 150ms ease;\\r\\n -webkit-appearance: none;\\r\\n -moz-appearance: none;\\r\\n\\r\\n -webkit-animation: excalibur-button-fadein 200ms; /* Safari, Chrome and Opera > 12.1 */\\r\\n -moz-animation: excalibur-button-fadein 200ms; /* Firefox < 16 */\\r\\n -ms-animation: excalibur-button-fadein 200ms; /* Internet Explorer */\\r\\n -o-animation: excalibur-button-fadein 200ms; /* Opera < 12.1 */\\r\\n animation: excalibur-button-fadein 200ms;\\r\\n}\\r\\n\\r\\n/*\\r\\nbutton#excalibur-play {\\r\\n display: none;\\r\\n}*/\\r\\n\\r\\nbutton#excalibur-play:after {\\r\\n position: absolute;\\r\\n content: '';\\r\\n border: 8px solid;\\r\\n border-color: transparent transparent transparent white;\\r\\n left: 35px;\\r\\n top: 24px;\\r\\n width: 0;\\r\\n height: 0;\\r\\n}\\r\\n\\r\\nbutton#excalibur-play:before {\\r\\n position: absolute;\\r\\n content: '';\\r\\n border: 3px solid;\\r\\n left: 19px;\\r\\n top: 14px;\\r\\n border-radius: 20px;\\r\\n width: 30px;\\r\\n height: 30px;\\r\\n}\\r\\n\\r\\nbutton#excalibur-play:hover,\\r\\nbutton#excalibur-play:focus {\\r\\n background: #00982c;\\r\\n}\\r\\n\\r\\nbutton#excalibur-play:focus {\\r\\n outline: 1px solid #fff;\\r\\n outline-offset: -4px;\\r\\n}\\r\\n\\r\\nbutton#excalibur-play:active {\\r\\n transform: scale(0.99);\\r\\n}\\r\\n\\r\\n@keyframes excalibur-button-fadein {\\r\\n from {\\r\\n opacity: 0;\\r\\n }\\r\\n to {\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n/* Firefox < 16 */\\r\\n@-moz-keyframes excalibur-button-fadein {\\r\\n from {\\r\\n opacity: 0;\\r\\n }\\r\\n to {\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n/* Safari, Chrome and Opera > 12.1 */\\r\\n@-webkit-keyframes excalibur-button-fadein {\\r\\n from {\\r\\n opacity: 0;\\r\\n }\\r\\n to {\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n/* Internet Explorer */\\r\\n@-ms-keyframes excalibur-button-fadein {\\r\\n from {\\r\\n opacity: 0;\\r\\n }\\r\\n to {\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n/* Opera < 12.1 */\\r\\n@-o-keyframes excalibur-button-fadein {\\r\\n from {\\r\\n opacity: 0;\\r\\n }\\r\\n to {\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n\n\n/***/ }),\n\n/***/ \"./Util/Toaster.css\":\n/*!**************************!*\\\n !*** ./Util/Toaster.css ***!\n \\**************************/\n/***/ ((module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/sourceMaps.js */ \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ \"../../node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `#ex-toast-container {\r\n position: absolute;\r\n height: 0;\r\n min-width: 50%;\r\n left: 50%;\r\n top: 0;\r\n}\r\n\r\n.ex-toast-message {\r\n left: -50%;\r\n position: relative;\r\n display: flex;\r\n justify-content: space-between;\r\n\r\n padding: 10px;\r\n margin-top: 5px;\r\n font-size: 18px;\r\n font-family: sans-serif;\r\n border-radius: 6px;\r\n border: 3px solid #b7b779;\r\n background-color: rgb(253, 253, 192);\r\n}\r\n\r\n.ex-toast-message button {\r\n align-self: flex-start;\r\n}\r\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./Util/Toaster.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,kBAAkB;EAClB,SAAS;EACT,cAAc;EACd,SAAS;EACT,MAAM;AACR;;AAEA;EACE,UAAU;EACV,kBAAkB;EAClB,aAAa;EACb,8BAA8B;;EAE9B,aAAa;EACb,eAAe;EACf,eAAe;EACf,uBAAuB;EACvB,kBAAkB;EAClB,yBAAyB;EACzB,oCAAoC;AACtC;;AAEA;EACE,sBAAsB;AACxB\",\"sourcesContent\":[\"#ex-toast-container {\\r\\n position: absolute;\\r\\n height: 0;\\r\\n min-width: 50%;\\r\\n left: 50%;\\r\\n top: 0;\\r\\n}\\r\\n\\r\\n.ex-toast-message {\\r\\n left: -50%;\\r\\n position: relative;\\r\\n display: flex;\\r\\n justify-content: space-between;\\r\\n\\r\\n padding: 10px;\\r\\n margin-top: 5px;\\r\\n font-size: 18px;\\r\\n font-family: sans-serif;\\r\\n border-radius: 6px;\\r\\n border: 3px solid #b7b779;\\r\\n background-color: rgb(253, 253, 192);\\r\\n}\\r\\n\\r\\n.ex-toast-message button {\\r\\n align-self: flex-start;\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n\n\n/***/ }),\n\n/***/ \"../../node_modules/css-loader/dist/runtime/api.js\":\n/*!*********************************************************!*\\\n !*** ../../node_modules/css-loader/dist/runtime/api.js ***!\n \\*********************************************************/\n/***/ ((module) => {\n\n\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\nmodule.exports = function (cssWithMappingToString) {\n var list = [];\n\n // return the list of modules as css string\n list.toString = function toString() {\n return this.map(function (item) {\n var content = \"\";\n var needLayer = typeof item[5] !== \"undefined\";\n if (item[4]) {\n content += \"@supports (\".concat(item[4], \") {\");\n }\n if (item[2]) {\n content += \"@media \".concat(item[2], \" {\");\n }\n if (needLayer) {\n content += \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\");\n }\n content += cssWithMappingToString(item);\n if (needLayer) {\n content += \"}\";\n }\n if (item[2]) {\n content += \"}\";\n }\n if (item[4]) {\n content += \"}\";\n }\n return content;\n }).join(\"\");\n };\n\n // import a list of modules into the list\n list.i = function i(modules, media, dedupe, supports, layer) {\n if (typeof modules === \"string\") {\n modules = [[null, modules, undefined]];\n }\n var alreadyImportedModules = {};\n if (dedupe) {\n for (var k = 0; k < this.length; k++) {\n var id = this[k][0];\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n for (var _k = 0; _k < modules.length; _k++) {\n var item = [].concat(modules[_k]);\n if (dedupe && alreadyImportedModules[item[0]]) {\n continue;\n }\n if (typeof layer !== \"undefined\") {\n if (typeof item[5] === \"undefined\") {\n item[5] = layer;\n } else {\n item[1] = \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\").concat(item[1], \"}\");\n item[5] = layer;\n }\n }\n if (media) {\n if (!item[2]) {\n item[2] = media;\n } else {\n item[1] = \"@media \".concat(item[2], \" {\").concat(item[1], \"}\");\n item[2] = media;\n }\n }\n if (supports) {\n if (!item[4]) {\n item[4] = \"\".concat(supports);\n } else {\n item[1] = \"@supports (\".concat(item[4], \") {\").concat(item[1], \"}\");\n item[4] = supports;\n }\n }\n list.push(item);\n }\n };\n return list;\n};\n\n/***/ }),\n\n/***/ \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\":\n/*!****************************************************************!*\\\n !*** ../../node_modules/css-loader/dist/runtime/sourceMaps.js ***!\n \\****************************************************************/\n/***/ ((module) => {\n\n\n\nmodule.exports = function (item) {\n var content = item[1];\n var cssMapping = item[3];\n if (!cssMapping) {\n return content;\n }\n if (typeof btoa === \"function\") {\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n var sourceMapping = \"/*# \".concat(data, \" */\");\n return [content].concat([sourceMapping]).join(\"\\n\");\n }\n return [content].join(\"\\n\");\n};\n\n/***/ }),\n\n/***/ \"./Graphics/Context/circle-renderer/circle-renderer.frag.glsl\":\n/*!********************************************************************!*\\\n !*** ./Graphics/Context/circle-renderer/circle-renderer.frag.glsl ***!\n \\********************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nprecision highp float;\\r\\n\\r\\n// UV coord\\r\\nin vec2 v_uv;\\r\\n\\r\\n// Color coord to blend with image\\r\\nin lowp vec4 v_color;\\r\\n\\r\\n// Stroke color if used\\r\\nin lowp vec4 v_strokeColor;\\r\\n\\r\\n// Stroke thickness if used\\r\\nin lowp float v_strokeThickness;\\r\\n\\r\\n// Opacity\\r\\nin float v_opacity;\\r\\n\\r\\nout vec4 fragColor;\\r\\n\\r\\nvoid main() {\\r\\n // make (0, 0) the center the uv \\r\\n vec2 uv = v_uv * 2.0 - 1.0;\\r\\n\\r\\n vec4 color = v_color;\\r\\n vec4 strokeColor = v_strokeColor;\\r\\n\\r\\n // circle border is at radius 1.0 \\r\\n // dist is > 0 when inside the circle \\r\\n float d = length(uv);\\r\\n float dist = 1.0 - length(uv);\\r\\n\\r\\n // Fade based on fwidth\\r\\n float fade = fwidth(dot(uv, uv));\\r\\n\\r\\n // if dist is greater than 0 step to 1;\\r\\n // when we cross this 0 threshold add a smooth fade\\r\\n float fill = smoothstep(-fade/2.0, fade/2.0, dist);\\r\\n\\r\\n // if dist is greater than the stroke thickness step to 1\\r\\n float stroke = 1.0 - smoothstep(v_strokeThickness, v_strokeThickness + fade, dist);\\r\\n\\r\\n strokeColor.a *= fill * stroke;\\r\\n strokeColor.rgb *= strokeColor.a;\\r\\n\\r\\n color.a *= fill * (1.0 - stroke);\\r\\n color.rgb *= color.a;\\r\\n\\r\\n vec4 finalColor = mix(vec4(0.0), (color + strokeColor), fill);\\r\\n finalColor.rgb = finalColor.rgb * v_opacity;\\r\\n finalColor.a = finalColor.a * v_opacity;\\r\\n fragColor = finalColor;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/circle-renderer/circle-renderer.vert.glsl\":\n/*!********************************************************************!*\\\n !*** ./Graphics/Context/circle-renderer/circle-renderer.vert.glsl ***!\n \\********************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nin vec2 a_position;\\r\\n\\r\\n// UV coordinate\\r\\nin vec2 a_uv;\\r\\nout vec2 v_uv;\\r\\n\\r\\n// Opacity \\r\\nin float a_opacity;\\r\\nout float v_opacity;\\r\\n\\r\\nin vec4 a_color;\\r\\nout vec4 v_color;\\r\\n\\r\\nin vec4 a_strokeColor;\\r\\nout vec4 v_strokeColor;\\r\\n\\r\\nin float a_strokeThickness;\\r\\nout float v_strokeThickness;\\r\\n\\r\\nuniform mat4 u_matrix;\\r\\n\\r\\n\\r\\nvoid main() {\\r\\n // Set the vertex position using the ortho transform matrix\\r\\n gl_Position = u_matrix * vec4(a_position, 0.0, 1.0);\\r\\n\\r\\n // Pass through UV coords\\r\\n v_uv = a_uv;\\r\\n // Pass through the Opacity to the fragment shader\\r\\n v_opacity = a_opacity;\\r\\n // Pass through the color to the fragment shader\\r\\n v_color = a_color;\\r\\n // Pass through the stroke color to the fragment shader\\r\\n v_strokeColor = a_strokeColor;\\r\\n // Pass through the stroke thickenss to the fragment shader\\r\\n v_strokeThickness = a_strokeThickness;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/image-renderer-v2/image-renderer-v2.frag.glsl\":\n/*!************************************************************************!*\\\n !*** ./Graphics/Context/image-renderer-v2/image-renderer-v2.frag.glsl ***!\n \\************************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nprecision mediump float;\\r\\n\\r\\n// UV coord\\r\\nin vec2 v_texcoord;\\r\\n\\r\\n// Textures in the current draw\\r\\nuniform sampler2D u_textures[%%count%%];\\r\\n\\r\\nuniform bool u_pixelart;\\r\\n\\r\\nin float v_texture_index;\\r\\n\\r\\nin float v_opacity;\\r\\n\\r\\nin vec4 v_tint;\\r\\n\\r\\n// texture resolution\\r\\nin vec2 v_res;\\r\\n\\r\\nin vec2 v_uv_min;\\r\\nin vec2 v_uv_max;\\r\\n\\r\\nout vec4 fragColor;\\r\\n\\r\\n// Inigo Quilez pixel art filter https://jorenjoestar.github.io/post/pixel_art_filtering/\\r\\nvec2 uv_iq(in vec2 uv, in vec2 texture_size) {\\r\\n vec2 pixel = uv * texture_size;\\r\\n\\r\\n vec2 seam=floor(pixel+.5);\\r\\n vec2 dudv=fwidth(pixel);\\r\\n pixel=seam+clamp((pixel-seam)/dudv,-.5,.5);\\r\\n\\r\\n return pixel/texture_size;\\r\\n}\\r\\n\\r\\nfloat lerp(float from, float to, float rel){\\r\\n return ((1. - rel) * from) + (rel * to);\\r\\n}\\r\\n\\r\\nfloat invLerp(float from, float to, float value){\\r\\n return (value - from) / (to - from);\\r\\n}\\r\\n\\r\\nfloat remap(float origFrom, float origTo, float targetFrom, float targetTo, float value){\\r\\n float rel = invLerp(origFrom, origTo, value);\\r\\n return lerp(targetFrom, targetTo, rel);\\r\\n}\\r\\n\\r\\nvoid main(){\\r\\n // In order to support the most efficient sprite batching, we have multiple\\r\\n // textures loaded into the gpu (usually 8) this picker logic skips over textures\\r\\n // that do not apply to a particular sprite.\\r\\n\\r\\n vec4 color=vec4(1.,0,0,1.);\\r\\n\\r\\n // GLSL is templated out to pick the right texture and set the vec4 color\\r\\n vec2 uv = u_pixelart ? uv_iq(v_texcoord, v_res) : v_texcoord;\\r\\n uv.x = remap(0.,1., v_uv_min.x, v_uv_max.x, uv.x);\\r\\n uv.y = remap(0.,1., v_uv_min.y, v_uv_max.y, uv.y);\\r\\n\\r\\n %%texture_picker%%\\r\\n\\r\\n color.rgb = color.rgb * v_opacity;\\r\\n color.a = color.a * v_opacity;\\r\\n fragColor = color * v_tint;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/image-renderer-v2/image-renderer-v2.vert.glsl\":\n/*!************************************************************************!*\\\n !*** ./Graphics/Context/image-renderer-v2/image-renderer-v2.vert.glsl ***!\n \\************************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nlayout(location=0) in vec2 pos;\\r\\nlayout(location=1) in vec2 a_texcoord;\\r\\nout vec2 v_texcoord;\\r\\n\\r\\nlayout(location=2) in vec2 a_offset;\\r\\nlayout(location=3) in vec2 a_mat_column1;\\r\\nlayout(location=4) in vec2 a_mat_column2;\\r\\nlayout(location=5) in vec2 a_mat_column3;\\r\\n\\r\\nlayout(location=6) in float a_opacity;\\r\\nout float v_opacity;\\r\\n\\r\\n// Texture resolution (could be bigger than a_siz)\\r\\nlayout(location=7) in vec2 a_res;\\r\\nout vec2 v_res;\\r\\n\\r\\n// Final size of graphic\\r\\nlayout(location=8) in vec2 a_size;\\r\\n\\r\\nlayout(location=9) in lowp float a_texture_index;\\r\\nout lowp float v_texture_index;\\r\\n\\r\\nlayout(location=10) in vec2 a_uv_min;\\r\\nout vec2 v_uv_min;\\r\\n\\r\\nlayout(location=11) in vec2 a_uv_max;\\r\\nout vec2 v_uv_max;\\r\\n\\r\\nlayout(location=12) in vec4 a_tint;\\r\\nout vec4 v_tint;\\r\\n\\r\\nuniform mat4 u_matrix;\\r\\n\\r\\nvoid main(){\\r\\n mat4 world_mat = mat4(\\r\\n a_mat_column1.x, a_mat_column1.y, 0., 0.,\\r\\n a_mat_column2.x, a_mat_column2.y, 0., 0.,\\r\\n 0. , 0. , 1., 0.,\\r\\n a_mat_column3.x, a_mat_column3.y, 0., 1.\\r\\n );\\r\\n\\r\\n vec2 newPos = vec2(pos.x * a_res.x, pos.y * a_res.y);\\r\\n gl_Position = u_matrix * world_mat * vec4(newPos + a_offset, 0., 1.);\\r\\n\\r\\n v_opacity = a_opacity;\\r\\n v_texcoord = a_texcoord;\\r\\n v_uv_min = a_uv_min;\\r\\n v_uv_max = a_uv_max;\\r\\n v_res = a_res;\\r\\n v_texture_index = a_texture_index;\\r\\n v_tint = a_tint;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/image-renderer/image-renderer.frag.glsl\":\n/*!******************************************************************!*\\\n !*** ./Graphics/Context/image-renderer/image-renderer.frag.glsl ***!\n \\******************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nprecision mediump float;\\r\\n\\r\\n// UV coord\\r\\nin vec2 v_texcoord;\\r\\n\\r\\n// Texture index\\r\\nin lowp float v_textureIndex;\\r\\n\\r\\n// Textures in the current draw\\r\\nuniform sampler2D u_textures[%%count%%];\\r\\n\\r\\nuniform bool u_pixelart;\\r\\n\\r\\n// Opacity\\r\\nin float v_opacity;\\r\\n\\r\\nin vec4 v_tint;\\r\\n\\r\\nin vec2 v_res;\\r\\n\\r\\nout vec4 fragColor;\\r\\n\\r\\n// Inigo Quilez pixel art filter https://jorenjoestar.github.io/post/pixel_art_filtering/\\r\\nvec2 uv_iq(in vec2 uv, in vec2 texture_size) {\\r\\n vec2 pixel = uv * texture_size;\\r\\n \\r\\n vec2 seam=floor(pixel+.5);\\r\\n vec2 dudv=fwidth(pixel);\\r\\n pixel=seam+clamp((pixel-seam)/dudv,-.5,.5);\\r\\n \\r\\n return pixel/texture_size;\\r\\n}\\r\\n\\r\\nvoid main(){\\r\\n // In order to support the most efficient sprite batching, we have multiple\\r\\n // textures loaded into the gpu (usually 8) this picker logic skips over textures\\r\\n // that do not apply to a particular sprite.\\r\\n \\r\\n vec4 color=vec4(1.,0,0,1.);\\r\\n \\r\\n // GLSL is templated out to pick the right texture and set the vec4 color\\r\\n %%texture_picker%%\\r\\n \\r\\n color.rgb=color.rgb*v_opacity;\\r\\n color.a=color.a*v_opacity;\\r\\n fragColor=color*v_tint;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/image-renderer/image-renderer.vert.glsl\":\n/*!******************************************************************!*\\\n !*** ./Graphics/Context/image-renderer/image-renderer.vert.glsl ***!\n \\******************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nin vec2 a_position;\\r\\n\\r\\n// Opacity\\r\\nin float a_opacity;\\r\\nout float v_opacity;\\r\\n\\r\\n// UV coordinate\\r\\nin vec2 a_texcoord;\\r\\nout vec2 v_texcoord;\\r\\n\\r\\n// Texture res\\r\\nin vec2 a_res;\\r\\nout vec2 v_res;\\r\\n\\r\\n// Texture number\\r\\nin lowp float a_textureIndex;\\r\\nout lowp float v_textureIndex;\\r\\n\\r\\nin vec4 a_tint;\\r\\nout vec4 v_tint;\\r\\n\\r\\nuniform mat4 u_matrix;\\r\\n\\r\\nvoid main(){\\r\\n // Set the vertex position using the ortho transform matrix\\r\\n gl_Position=u_matrix*vec4(a_position,0.,1.);\\r\\n \\r\\n // Pass through the Opacity to the fragment shader\\r\\n v_opacity=a_opacity;\\r\\n // Pass through the UV coord to the fragment shader\\r\\n v_texcoord=a_texcoord;\\r\\n\\r\\n v_res = a_res;\\r\\n\\r\\n // Pass through the texture number to the fragment shader\\r\\n v_textureIndex=a_textureIndex;\\r\\n // Pass through the tint\\r\\n v_tint=a_tint;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/line-renderer/line-fragment.glsl\":\n/*!***********************************************************!*\\\n !*** ./Graphics/Context/line-renderer/line-fragment.glsl ***!\n \\***********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nprecision mediump float;\\r\\n\\r\\n// Color\\r\\nin lowp vec4 v_color;\\r\\n\\r\\nout vec4 fragColor;\\r\\n\\r\\nvoid main() {\\r\\n fragColor = v_color;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/line-renderer/line-vertex.glsl\":\n/*!*********************************************************!*\\\n !*** ./Graphics/Context/line-renderer/line-vertex.glsl ***!\n \\*********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nin vec2 a_position;\\r\\nin vec4 a_color;\\r\\n\\r\\nout lowp vec4 v_color;\\r\\n\\r\\nuniform mat4 u_matrix;\\r\\n\\r\\nvoid main() {\\r\\n // Set the vertex position using the ortho transform matrix\\r\\n gl_Position = u_matrix * vec4(a_position, 0.0, 1.0);\\r\\n\\r\\n // Passthrough the color\\r\\n v_color = a_color;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/particle-renderer/particle-fragment.glsl\":\n/*!*******************************************************************!*\\\n !*** ./Graphics/Context/particle-renderer/particle-fragment.glsl ***!\n \\*******************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nprecision mediump float;\\r\\n\\r\\nuniform sampler2D graphic;\\r\\nuniform bool useTexture;\\r\\nuniform float maxLifeMs;\\r\\n\\r\\nuniform vec4 beginColor;\\r\\nuniform vec4 endColor;\\r\\nuniform bool fade;\\r\\nuniform float startOpacity;\\r\\n\\r\\nin float finalRotation;\\r\\nin float finalLifeMs;\\r\\nout vec4 fragColor;\\r\\n\\r\\nvoid main(){\\r\\n\\r\\n float lifePct = finalLifeMs / maxLifeMs;\\r\\n\\r\\n if (useTexture) {\\r\\n /** Draw texture */\\r\\n if (lifePct <= 0.) discard;\\r\\n float mid = .5;\\r\\n float cosine = cos(finalRotation);\\r\\n float sine = sin(finalRotation);\\r\\n vec2 rotated = vec2(cosine * (gl_PointCoord.x - mid) + sine * (gl_PointCoord.y - mid) + mid,\\r\\n cosine * (gl_PointCoord.y - mid) - sine * (gl_PointCoord.x - mid) + mid);\\r\\n vec4 color = texture(graphic, rotated);\\r\\n fragColor = color * (fade ? lifePct : 1.0);\\r\\n } else {\\r\\n /** Draw circle */\\r\\n if (lifePct <= 0.) discard;\\r\\n vec2 uv = gl_PointCoord.xy * 2.0 - 1.0;\\r\\n float dist = 1.0 - length(uv);\\r\\n float edge = fwidth(dot(uv, uv));\\r\\n float circle = smoothstep(-edge/2.0, edge/2.0, dist);\\r\\n vec3 color = mix(beginColor.rgb, endColor.rgb, 1.0 - lifePct);\\r\\n fragColor.rgb = color;\\r\\n fragColor.a = startOpacity * circle * (fade ? lifePct : 1.0);// * mix(beginColor.a, endColor.a, 1.0 - lifePct);\\r\\n fragColor.rgb *= fragColor.a;\\r\\n }\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/particle-renderer/particle-vertex.glsl\":\n/*!*****************************************************************!*\\\n !*** ./Graphics/Context/particle-renderer/particle-vertex.glsl ***!\n \\*****************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nprecision mediump float;\\r\\n\\r\\nuniform float deltaMs;\\r\\nuniform float maxLifeMs;\\r\\nuniform vec2 gravity;\\r\\nuniform vec2 focus;\\r\\nuniform float focusAccel;\\r\\nuniform mat4 u_matrix;\\r\\nuniform mat4 u_transform;\\r\\nuniform float startSize;\\r\\nuniform float endSize;\\r\\n// uniform sampler2D obstacle;\\r\\n\\r\\nlayout(location=0)in vec2 position;\\r\\nlayout(location=1)in vec2 velocity;\\r\\nlayout(location=2)in float rotation;\\r\\nlayout(location=3)in float angularVelocity;\\r\\nlayout(location=4)in float lifeMs;\\r\\n\\r\\n// TODO z index to handle buffer wrapping?\\r\\n\\r\\n// DO NOT RE-ORDER\\r\\nout vec2 finalPosition;\\r\\nout vec2 finalVelocity;\\r\\nout float finalRotation;\\r\\nout float finalAngularVelocity;\\r\\nout float finalLifeMs;\\r\\nvoid main(){\\r\\n // Evolve particle\\r\\n float seconds = deltaMs / 1000.;\\r\\n // euler integration\\r\\n // Weird artifact of re-using the same buffer layout for update/draw\\r\\n // we need differently named variables\\r\\n vec2 finalGravity = gravity + normalize(focus - position) * focusAccel;\\r\\n finalVelocity = velocity + finalGravity * seconds;\\r\\n finalPosition = position + velocity * seconds + finalGravity * .5 * seconds * seconds;\\r\\n finalRotation = rotation + angularVelocity * seconds;\\r\\n finalAngularVelocity = angularVelocity;\\r\\n finalLifeMs = clamp(lifeMs - deltaMs, 0., maxLifeMs);\\r\\n\\r\\n // Collision mask sampling\\r\\n // vec2 samplePoint = finalPosition / vec2(width, height);\\r\\n // vec4 collides = texture(obstacle, samplePoint);\\r\\n // if (distance(collides,vec4(0.)) > .01) {\\r\\n // // non opaque means we collide! recalc final pos/vel\\r\\n // vec2 newVelocity = velocity * -.1;// lose energy\\r\\n // finalVelocity = newVelocity + gravity * seconds;\\r\\n // finalPosition = position + newVelocity * seconds + gravity * .5 * seconds * seconds;\\r\\n // }\\r\\n\\r\\n float lifePercent = finalLifeMs / maxLifeMs;\\r\\n vec2 transformedPos = (u_matrix * u_transform * vec4(finalPosition,0.,1.)).xy;\\r\\n float scale = sqrt(u_transform[0][0] * u_transform[0][0] + u_transform[1][1] * u_transform[1][1]);\\r\\n gl_Position = vec4(transformedPos, 1.0 - lifePercent, 1.); // use life percent to sort z\\r\\n gl_PointSize = mix(startSize, endSize, 1.0 - lifePercent) * scale;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/point-renderer/point-fragment.glsl\":\n/*!*************************************************************!*\\\n !*** ./Graphics/Context/point-renderer/point-fragment.glsl ***!\n \\*************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\n\\r\\nprecision mediump float;\\r\\nin lowp vec4 v_color;\\r\\n\\r\\nout vec4 fragColor;\\r\\n\\r\\nvoid main() {\\r\\n float r = 0.0, delta = 0.0, alpha = 1.0;\\r\\n vec2 cxy = 2.0 * gl_PointCoord - 1.0;\\r\\n r = dot(cxy, cxy);\\r\\n\\r\\n delta = fwidth(r);\\r\\n alpha = 1.0 - smoothstep(1.0 - delta, 1.0 + delta, r);\\r\\n // \\\"premultiply\\\" the color by alpha\\r\\n vec4 color = v_color;\\r\\n color.a = color.a * alpha;\\r\\n color.rgb = color.rgb * color.a;\\r\\n fragColor = color;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/point-renderer/point-vertex.glsl\":\n/*!***********************************************************!*\\\n !*** ./Graphics/Context/point-renderer/point-vertex.glsl ***!\n \\***********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nin vec2 a_position;\\r\\nin vec4 a_color;\\r\\nin float a_size;\\r\\nout lowp vec4 v_color;\\r\\nuniform mat4 u_matrix;\\r\\n\\r\\nvoid main() {\\r\\n gl_Position = u_matrix * vec4(a_position, 0.0, 1.0);\\r\\n gl_PointSize = a_size * 2.0;\\r\\n v_color = a_color;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/rectangle-renderer/rectangle-renderer.frag.glsl\":\n/*!**************************************************************************!*\\\n !*** ./Graphics/Context/rectangle-renderer/rectangle-renderer.frag.glsl ***!\n \\**************************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\n\\r\\nprecision mediump float;\\r\\n\\r\\n// UV coord\\r\\nin vec2 v_uv;\\r\\n\\r\\nin vec2 v_size; // in pixels\\r\\n\\r\\n// Color coord to blend with image\\r\\nin lowp vec4 v_color;\\r\\n\\r\\n// Stroke color if used\\r\\nin lowp vec4 v_strokeColor;\\r\\n\\r\\n// Stroke thickness if used\\r\\nin lowp float v_strokeThickness; // in pixels\\r\\n\\r\\n// Opacity\\r\\nin float v_opacity;\\r\\n\\r\\nout vec4 fragColor;\\r\\n\\r\\nvoid main() {\\r\\n // modified from https://stackoverflow.com/questions/59197671/glsl-rounded-rectangle-with-variable-border\\r\\n vec2 uv = v_uv;\\r\\n vec2 fragCoord = uv * v_size;\\r\\n float maxX = v_size.x - v_strokeThickness;\\r\\n float minX = v_strokeThickness;\\r\\n float maxY = v_size.y - v_strokeThickness;\\r\\n float minY = v_strokeThickness;\\r\\n\\r\\n if (fragCoord.x < maxX && fragCoord.x > minX &&\\r\\n fragCoord.y < maxY && fragCoord.y > minY) {\\r\\n fragColor = v_color;\\r\\n } else {\\r\\n fragColor = v_strokeColor;\\r\\n }\\r\\n fragColor.a *= v_opacity;\\r\\n fragColor.rgb *= fragColor.a;\\r\\n\\r\\n // vec2 v2CenteredPos = abs(fragCoord - v_size.xy / 2.0);\\r\\n // vec2 v2HalfShapeSizePx = v_size.xy/2.0 - v_strokeThickness/2.0;\\r\\n\\r\\n // float fHalfBorderDist = 0.0;\\r\\n // float fHalfBorderThickness = 0.0;\\r\\n\\r\\n // if (fragCoord.x > max(v_radius, v_strokeThickness) && \\r\\n // fragCoord.x < v_size.x - max(v_radius, v_strokeThickness))\\r\\n // {\\r\\n // fHalfBorderDist = v2CenteredPos.y - v2HalfShapeSizePx.y;\\r\\n // fHalfBorderThickness = v_strokeThickness / 2.0;\\r\\n // }\\r\\n // else if (fragCoord.y > max(v_radius, v_strokeThickness) && \\r\\n // fragCoord.y < v_size.y - max(v_radius, v_strokeThickness))\\r\\n // {\\r\\n // fHalfBorderDist = v2CenteredPos.x - v2HalfShapeSizePx.x;\\r\\n // fHalfBorderThickness = v_strokeThickness / 2.0;\\r\\n // }\\r\\n // else\\r\\n // {\\r\\n // vec2 edgeVec = max(vec2(0.0), v_radius - vec2(\\r\\n // uv.x > 0.5 ? v_size.x - fragCoord.x : fragCoord.x,\\r\\n // uv.y > 0.5 ? v_size.y - fragCoord.y : fragCoord.y));\\r\\n \\r\\n // float ellipse_ab = v_radius-v_strokeThickness;\\r\\n // vec2 ellipse_isect = (v_strokeThickness > v_radius || v_strokeThickness > v_radius) ? vec2(0.0) :\\r\\n // edgeVec.xy * ellipse_ab*ellipse_ab / length(ellipse_ab*edgeVec.yx); \\r\\n \\r\\n // fHalfBorderThickness = (v_radius - length(ellipse_isect)) / 2.0;\\r\\n // fHalfBorderDist = length(edgeVec) - (v_radius - fHalfBorderThickness);\\r\\n // }\\r\\n\\r\\n // vec4 v4FromColor = v_strokeColor;\\r\\n // v4FromColor.rgb *= v4FromColor.a;\\r\\n // vec4 v4ToColor = vec4(0.0); // background color is transparent\\r\\n // if (fHalfBorderDist < 0.0) {\\r\\n // v4ToColor = v_color;\\r\\n // v4ToColor.rgb *= v4ToColor.a;\\r\\n // }\\r\\n\\r\\n // float mixPct = abs(fHalfBorderDist) - fHalfBorderThickness;\\r\\n\\r\\n // vec4 finalColor = mix(v4FromColor, v4ToColor, mixPct);\\r\\n // gl_FragColor = finalColor;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/rectangle-renderer/rectangle-renderer.vert.glsl\":\n/*!**************************************************************************!*\\\n !*** ./Graphics/Context/rectangle-renderer/rectangle-renderer.vert.glsl ***!\n \\**************************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nin vec2 a_position;\\r\\n\\r\\n// UV coordinate\\r\\nin vec2 a_uv;\\r\\nout vec2 v_uv;\\r\\n\\r\\nin vec2 a_size;\\r\\nout vec2 v_size;\\r\\n\\r\\n// Opacity \\r\\nin float a_opacity;\\r\\nout float v_opacity;\\r\\n\\r\\nin vec4 a_color;\\r\\nout vec4 v_color;\\r\\n\\r\\nin vec4 a_strokeColor;\\r\\nout vec4 v_strokeColor;\\r\\n\\r\\nin float a_strokeThickness;\\r\\nout float v_strokeThickness;\\r\\n\\r\\nuniform mat4 u_matrix;\\r\\n\\r\\n\\r\\nvoid main() {\\r\\n // Set the vertex position using the ortho transform matrix\\r\\n gl_Position = u_matrix * vec4(a_position, 0.0, 1.0);\\r\\n\\r\\n // Pass through UV coords\\r\\n v_uv = a_uv;\\r\\n // Pass through size\\r\\n v_size = a_size;\\r\\n // Pass through the Opacity to the fragment shader\\r\\n v_opacity = a_opacity;\\r\\n // Pass through the color to the fragment shader\\r\\n v_color = a_color;\\r\\n // Pass through the stroke color to the fragment shader\\r\\n v_strokeColor = a_strokeColor;\\r\\n // Pass through the stroke thickenss to the fragment shader\\r\\n v_strokeThickness = a_strokeThickness;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/screen-pass-painter/screen-fragment.glsl\":\n/*!*******************************************************************!*\\\n !*** ./Graphics/Context/screen-pass-painter/screen-fragment.glsl ***!\n \\*******************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nprecision mediump float;\\r\\n\\r\\n// Passed in from the vertex shader.\\r\\nin vec2 v_texcoord;\\r\\n\\r\\n// The texture.\\r\\nuniform sampler2D u_texture;\\r\\n\\r\\nout vec4 fragColor;\\r\\n\\r\\nvoid main() {\\r\\n fragColor = texture(u_texture, v_texcoord);\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/screen-pass-painter/screen-vertex.glsl\":\n/*!*****************************************************************!*\\\n !*** ./Graphics/Context/screen-pass-painter/screen-vertex.glsl ***!\n \\*****************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nin vec2 a_position;\\r\\n\\r\\nin vec2 a_texcoord;\\r\\nout vec2 v_texcoord;\\r\\n\\r\\nvoid main() {\\r\\n gl_Position = vec4(a_position, 0.0, 1.0);\\r\\n\\r\\n // Pass the texcoord to the fragment shader.\\r\\n v_texcoord = a_texcoord;\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Graphics/PostProcessor/color-blind-fragment.glsl\":\n/*!**********************************************************!*\\\n !*** ./Graphics/PostProcessor/color-blind-fragment.glsl ***!\n \\**********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"#version 300 es\\r\\nprecision mediump float;\\r\\n// our texture\\r\\nuniform sampler2D u_image;\\r\\n// the texCoords passed in from the vertex shader.\\r\\nin vec2 v_texcoord;\\r\\n\\r\\n// color blind type\\r\\nuniform int u_type;\\r\\n\\r\\n// simulation?\\r\\nuniform bool u_simulate;\\r\\n\\r\\nout vec4 fragColor;\\r\\n\\r\\nvoid main() {\\r\\n vec4 o = texture(u_image, v_texcoord);\\r\\n // RGB to LMS matrix conversion\\r\\n float L = (17.8824 * o.r) + (43.5161 * o.g) + (4.11935 * o.b);\\r\\n float M = (3.45565 * o.r) + (27.1554 * o.g) + (3.86714 * o.b);\\r\\n float S = (0.0299566 * o.r) + (0.184309 * o.g) + (1.46709 * o.b);\\r\\n // Simulate color blindness\\r\\n float l;\\r\\n float m;\\r\\n float s;\\r\\n //MODE CODE//\\r\\n if (u_type == 0) {\\r\\n // Protanope\\r\\n l = 0.0 * L + 2.02344 * M + -2.52581 * S;\\r\\n m = 0.0 * L + 1.0 * M + 0.0 * S;\\r\\n s = 0.0 * L + 0.0 * M + 1.0 * S;;\\r\\n } else if (u_type == 1) {\\r\\n // Deuteranope\\r\\n l = 1.0 * L + 0.0 * M + 0.0 * S;\\r\\n m = 0.494207 * L + 0.0 * M + 1.24827 * S;\\r\\n s = 0.0 * L + 0.0 * M + 1.0 * S;\\r\\n } else if (u_type == 2) {\\r\\n // Tritanope\\r\\n l = 1.0 * L + 0.0 * M + 0.0 * S;\\r\\n m = 0.0 * L + 1.0 * M + 0.0 * S;\\r\\n s = -0.395913 * L + 0.801109 * M + 0.0 * S;\\r\\n }\\r\\n\\r\\n // LMS to RGB matrix conversion\\r\\n vec4 error; // simulate the colors\\r\\n error.r = (0.0809444479 * l) + (-0.130504409 * m) + (0.116721066 * s);\\r\\n error.g = (-0.0102485335 * l) + (0.0540193266 * m) + (-0.113614708 * s);\\r\\n error.b = (-0.000365296938 * l) + (-0.00412161469 * m) + (0.693511405 * s);\\r\\n error.a = 1.0;\\r\\n vec4 diff = o - error;\\r\\n vec4 correction; // correct the colors\\r\\n correction.r = 0.0;\\r\\n correction.g = (diff.r * 0.7) + (diff.g * 1.0);\\r\\n correction.b = (diff.r * 0.7) + (diff.b * 1.0);\\r\\n correction = o + correction;\\r\\n correction.a = o.a;\\r\\n //SIMULATE//\\r\\n\\r\\n // sim \\r\\n if (u_simulate) {\\r\\n fragColor = error.rgba;\\r\\n } else {\\r\\n fragColor = correction.rgba;\\r\\n }\\r\\n}\");\n\n/***/ }),\n\n/***/ \"./Actions/Action.ts\":\n/*!***************************!*\\\n !*** ./Actions/Action.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ nextActionId: () => (/* binding */ nextActionId)\n/* harmony export */ });\nlet _ACTION_ID = 0;\n/**\n *\n */\nfunction nextActionId() {\n return _ACTION_ID++;\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/ActionContext.ts\":\n/*!**********************************!*\\\n !*** ./Actions/ActionContext.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ActionContext: () => (/* binding */ ActionContext)\n/* harmony export */ });\n/* harmony import */ var _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Util/EasingFunctions */ \"./Util/EasingFunctions.ts\");\n/* harmony import */ var _ActionQueue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ActionQueue */ \"./Actions/ActionQueue.ts\");\n/* harmony import */ var _Action_Repeat__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./Action/Repeat */ \"./Actions/Action/Repeat.ts\");\n/* harmony import */ var _Action_RepeatForever__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./Action/RepeatForever */ \"./Actions/Action/RepeatForever.ts\");\n/* harmony import */ var _Action_MoveBy__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Action/MoveBy */ \"./Actions/Action/MoveBy.ts\");\n/* harmony import */ var _Action_MoveTo__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Action/MoveTo */ \"./Actions/Action/MoveTo.ts\");\n/* harmony import */ var _Action_RotateTo__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Action/RotateTo */ \"./Actions/Action/RotateTo.ts\");\n/* harmony import */ var _Action_RotateBy__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Action/RotateBy */ \"./Actions/Action/RotateBy.ts\");\n/* harmony import */ var _Action_ScaleTo__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Action/ScaleTo */ \"./Actions/Action/ScaleTo.ts\");\n/* harmony import */ var _Action_ScaleBy__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Action/ScaleBy */ \"./Actions/Action/ScaleBy.ts\");\n/* harmony import */ var _Action_CallMethod__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Action/CallMethod */ \"./Actions/Action/CallMethod.ts\");\n/* harmony import */ var _Action_EaseTo__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Action/EaseTo */ \"./Actions/Action/EaseTo.ts\");\n/* harmony import */ var _Action_EaseBy__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Action/EaseBy */ \"./Actions/Action/EaseBy.ts\");\n/* harmony import */ var _Action_Blink__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Action/Blink */ \"./Actions/Action/Blink.ts\");\n/* harmony import */ var _Action_Fade__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Action/Fade */ \"./Actions/Action/Fade.ts\");\n/* harmony import */ var _Action_Delay__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Action/Delay */ \"./Actions/Action/Delay.ts\");\n/* harmony import */ var _Action_Die__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./Action/Die */ \"./Actions/Action/Die.ts\");\n/* harmony import */ var _Action_Follow__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./Action/Follow */ \"./Actions/Action/Follow.ts\");\n/* harmony import */ var _Action_Meet__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./Action/Meet */ \"./Actions/Action/Meet.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Math */ \"./Math/vector.ts\");\n/* harmony import */ var _Action_Flash__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Action/Flash */ \"./Actions/Action/Flash.ts\");\n/* harmony import */ var _Action_CurveTo__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Action/CurveTo */ \"./Actions/Action/CurveTo.ts\");\n/* harmony import */ var _Action_CurveBy__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Action/CurveBy */ \"./Actions/Action/CurveBy.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * The fluent Action API allows you to perform \"actions\" on\n * {@apilink Actor | `actors`} such as following, moving, rotating, and\n * more. You can implement your own actions by implementing\n * the {@apilink Action} interface.\n */\nclass ActionContext {\n constructor(entity) {\n this._entity = entity;\n this._queue = new _ActionQueue__WEBPACK_IMPORTED_MODULE_0__.ActionQueue(entity);\n }\n getQueue() {\n return this._queue;\n }\n update(elapsed) {\n this._queue.update(elapsed);\n }\n /**\n * Clears all queued actions from the Actor\n */\n clearActions() {\n this._queue.clearActions();\n }\n runAction(action) {\n action.reset();\n this._queue.add(action);\n return this;\n }\n /**\n * Animates an actor with a specified bezier curve by an offset to the current position, the start point is assumed\n * to be the actors current position\n * @param options\n */\n curveBy(options) {\n this._queue.add(new _Action_CurveBy__WEBPACK_IMPORTED_MODULE_1__.CurveBy(this._entity, options));\n return this;\n }\n /**\n * Animates an actor with a specified bezier curve to an absolute world space coordinate, the start point is assumed\n * to be the actors current position\n * @param options\n */\n curveTo(options) {\n this._queue.add(new _Action_CurveTo__WEBPACK_IMPORTED_MODULE_2__.CurveTo(this._entity, options));\n return this;\n }\n easeTo(...args) {\n var _a, _b;\n let x = 0;\n let y = 0;\n let duration = 0;\n let easingFcn = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_3__.EasingFunctions.Linear;\n if (args[0] instanceof _Math__WEBPACK_IMPORTED_MODULE_4__.Vector) {\n x = args[0].x;\n y = args[0].y;\n duration = args[1];\n easingFcn = (_a = args[2]) !== null && _a !== void 0 ? _a : easingFcn;\n }\n else {\n x = args[0];\n y = args[1];\n duration = args[2];\n easingFcn = (_b = args[3]) !== null && _b !== void 0 ? _b : easingFcn;\n }\n this._queue.add(new _Action_EaseTo__WEBPACK_IMPORTED_MODULE_5__.EaseTo(this._entity, x, y, duration, easingFcn));\n return this;\n }\n easeBy(...args) {\n var _a, _b;\n let offsetX = 0;\n let offsetY = 0;\n let duration = 0;\n let easingFcn = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_3__.EasingFunctions.Linear;\n if (args[0] instanceof _Math__WEBPACK_IMPORTED_MODULE_4__.Vector) {\n offsetX = args[0].x;\n offsetY = args[0].y;\n duration = args[1];\n easingFcn = (_a = args[2]) !== null && _a !== void 0 ? _a : easingFcn;\n }\n else {\n offsetX = args[0];\n offsetY = args[1];\n duration = args[2];\n easingFcn = (_b = args[3]) !== null && _b !== void 0 ? _b : easingFcn;\n }\n this._queue.add(new _Action_EaseBy__WEBPACK_IMPORTED_MODULE_6__.EaseBy(this._entity, offsetX, offsetY, duration, easingFcn));\n return this;\n }\n moveTo(xOrPosOrOptions, yOrSpeed, speedOrUndefined) {\n let x = 0;\n let y = 0;\n let speed = 0;\n if (xOrPosOrOptions instanceof _Math__WEBPACK_IMPORTED_MODULE_4__.Vector) {\n x = xOrPosOrOptions.x;\n y = xOrPosOrOptions.y;\n speed = +(yOrSpeed !== null && yOrSpeed !== void 0 ? yOrSpeed : 0);\n this._queue.add(new _Action_MoveTo__WEBPACK_IMPORTED_MODULE_7__.MoveTo(this._entity, x, y, speed));\n }\n else if (typeof xOrPosOrOptions === 'number' && typeof yOrSpeed === 'number' && typeof speedOrUndefined === 'number') {\n x = xOrPosOrOptions;\n y = yOrSpeed;\n speed = speedOrUndefined;\n this._queue.add(new _Action_MoveTo__WEBPACK_IMPORTED_MODULE_7__.MoveTo(this._entity, x, y, speed));\n }\n else if ((0,_Action_MoveTo__WEBPACK_IMPORTED_MODULE_7__.isMoveToOptions)(xOrPosOrOptions)) {\n this._queue.add(new _Action_MoveTo__WEBPACK_IMPORTED_MODULE_7__.MoveToWithOptions(this._entity, xOrPosOrOptions));\n }\n return this;\n }\n moveBy(xOffsetOrVectorOrOptions, yOffsetOrSpeed, speedOrUndefined) {\n let xOffset = 0;\n let yOffset = 0;\n let speed = 0;\n if (xOffsetOrVectorOrOptions instanceof _Math__WEBPACK_IMPORTED_MODULE_4__.Vector && typeof yOffsetOrSpeed === 'number') {\n xOffset = xOffsetOrVectorOrOptions.x;\n yOffset = xOffsetOrVectorOrOptions.y;\n speed = yOffsetOrSpeed;\n this._queue.add(new _Action_MoveBy__WEBPACK_IMPORTED_MODULE_8__.MoveBy(this._entity, xOffset, yOffset, speed));\n }\n else if (typeof xOffsetOrVectorOrOptions === 'number' && typeof yOffsetOrSpeed === 'number' && typeof speedOrUndefined === 'number') {\n xOffset = xOffsetOrVectorOrOptions;\n yOffset = yOffsetOrSpeed;\n speed = speedOrUndefined;\n this._queue.add(new _Action_MoveBy__WEBPACK_IMPORTED_MODULE_8__.MoveBy(this._entity, xOffset, yOffset, speed));\n }\n else if ((0,_Action_MoveBy__WEBPACK_IMPORTED_MODULE_8__.isMoveByOptions)(xOffsetOrVectorOrOptions)) {\n this._queue.add(new _Action_MoveBy__WEBPACK_IMPORTED_MODULE_8__.MoveByWithOptions(this._entity, xOffsetOrVectorOrOptions));\n }\n return this;\n }\n rotateTo(angleRadiansOrOptions, speed, rotationType) {\n if (typeof angleRadiansOrOptions === 'number' && typeof speed === 'number') {\n this._queue.add(new _Action_RotateTo__WEBPACK_IMPORTED_MODULE_9__.RotateTo(this._entity, angleRadiansOrOptions, speed, rotationType));\n }\n else if (typeof angleRadiansOrOptions === 'object') {\n this._queue.add(new _Action_RotateTo__WEBPACK_IMPORTED_MODULE_9__.RotateToWithOptions(this._entity, angleRadiansOrOptions));\n }\n return this;\n }\n rotateBy(angleRadiansOffsetOrOptions, speed, rotationType) {\n if (typeof angleRadiansOffsetOrOptions === 'object') {\n this._queue.add(new _Action_RotateBy__WEBPACK_IMPORTED_MODULE_10__.RotateByWithOptions(this._entity, angleRadiansOffsetOrOptions));\n }\n else {\n this._queue.add(new _Action_RotateBy__WEBPACK_IMPORTED_MODULE_10__.RotateBy(this._entity, angleRadiansOffsetOrOptions, speed, rotationType));\n }\n return this;\n }\n scaleTo(sizeXOrVectorOrOptions, sizeYOrSpeed, speedXOrUndefined, speedYOrUndefined) {\n let sizeX = 1;\n let sizeY = 1;\n let speedX = 0;\n let speedY = 0;\n if ((0,_Action_ScaleTo__WEBPACK_IMPORTED_MODULE_11__.isScaleToOptions)(sizeXOrVectorOrOptions)) {\n this._queue.add(new _Action_ScaleTo__WEBPACK_IMPORTED_MODULE_11__.ScaleToWithOptions(this._entity, sizeXOrVectorOrOptions));\n return this;\n }\n if (sizeXOrVectorOrOptions instanceof _Math__WEBPACK_IMPORTED_MODULE_4__.Vector && sizeYOrSpeed instanceof _Math__WEBPACK_IMPORTED_MODULE_4__.Vector) {\n sizeX = sizeXOrVectorOrOptions.x;\n sizeY = sizeXOrVectorOrOptions.y;\n speedX = sizeYOrSpeed.x;\n speedY = sizeYOrSpeed.y;\n }\n if (typeof sizeXOrVectorOrOptions === 'number' && typeof sizeYOrSpeed === 'number') {\n sizeX = sizeXOrVectorOrOptions;\n sizeY = sizeYOrSpeed;\n speedX = speedXOrUndefined;\n speedY = speedYOrUndefined;\n }\n this._queue.add(new _Action_ScaleTo__WEBPACK_IMPORTED_MODULE_11__.ScaleTo(this._entity, sizeX, sizeY, speedX, speedY));\n return this;\n }\n scaleBy(sizeOffsetXOrVectorOrOptions, sizeOffsetYOrSpeed, speed) {\n if ((0,_Action_ScaleBy__WEBPACK_IMPORTED_MODULE_12__.isScaleByOptions)(sizeOffsetXOrVectorOrOptions)) {\n this._queue.add(new _Action_ScaleBy__WEBPACK_IMPORTED_MODULE_12__.ScaleByWithOptions(this._entity, sizeOffsetXOrVectorOrOptions));\n return this;\n }\n let sizeOffsetX = 1;\n let sizeOffsetY = 1;\n if (sizeOffsetXOrVectorOrOptions instanceof _Math__WEBPACK_IMPORTED_MODULE_4__.Vector) {\n sizeOffsetX = sizeOffsetXOrVectorOrOptions.x;\n sizeOffsetY = sizeOffsetXOrVectorOrOptions.y;\n speed = sizeOffsetYOrSpeed;\n }\n if (typeof sizeOffsetXOrVectorOrOptions === 'number' && typeof sizeOffsetYOrSpeed === 'number') {\n sizeOffsetX = sizeOffsetXOrVectorOrOptions;\n sizeOffsetY = sizeOffsetYOrSpeed;\n }\n this._queue.add(new _Action_ScaleBy__WEBPACK_IMPORTED_MODULE_12__.ScaleBy(this._entity, sizeOffsetX, sizeOffsetY, speed));\n return this;\n }\n /**\n * This method will cause an actor to blink (become visible and not\n * visible). Optionally, you may specify the number of blinks. Specify the amount of time\n * the actor should be visible per blink, and the amount of time not visible.\n * This method is part of the actor 'Action' fluent API allowing action chaining.\n * @param timeVisible The amount of time to stay visible per blink in milliseconds\n * @param timeNotVisible The amount of time to stay not visible per blink in milliseconds\n * @param numBlinks The number of times to blink\n */\n blink(timeVisible, timeNotVisible, numBlinks = 1) {\n this._queue.add(new _Action_Blink__WEBPACK_IMPORTED_MODULE_13__.Blink(this._entity, timeVisible, timeNotVisible, numBlinks));\n return this;\n }\n /**\n * This method will cause an actor's opacity to change from its current value\n * to the provided value by a specified time (in milliseconds). This method is\n * part of the actor 'Action' fluent API allowing action chaining.\n * @param opacity The ending opacity\n * @param duration The time it should take to fade the actor (in milliseconds)\n */\n fade(opacity, duration) {\n this._queue.add(new _Action_Fade__WEBPACK_IMPORTED_MODULE_14__.Fade(this._entity, opacity, duration));\n return this;\n }\n /**\n * This will cause an actor to flash a specific color for a period of time\n * @param color\n * @param duration The duration in milliseconds\n */\n flash(color, duration = 1000) {\n this._queue.add(new _Action_Flash__WEBPACK_IMPORTED_MODULE_15__.Flash(this._entity, color, duration));\n return this;\n }\n /**\n * This method will delay the next action from executing for a certain\n * amount of time (in milliseconds). This method is part of the actor\n * 'Action' fluent API allowing action chaining.\n * @param duration The amount of time to delay the next action in the queue from executing in milliseconds\n */\n delay(duration) {\n this._queue.add(new _Action_Delay__WEBPACK_IMPORTED_MODULE_16__.Delay(duration));\n return this;\n }\n /**\n * This method will add an action to the queue that will remove the actor from the\n * scene once it has completed its previous Any actions on the\n * action queue after this action will not be executed.\n */\n die() {\n this._queue.add(new _Action_Die__WEBPACK_IMPORTED_MODULE_17__.Die(this._entity));\n return this;\n }\n /**\n * This method allows you to call an arbitrary method as the next action in the\n * action queue. This is useful if you want to execute code in after a specific\n * action, i.e An actor arrives at a destination after traversing a path\n */\n callMethod(method) {\n this._queue.add(new _Action_CallMethod__WEBPACK_IMPORTED_MODULE_18__.CallMethod(method));\n return this;\n }\n /**\n * This method will cause the actor to repeat all of the actions built in\n * the `repeatBuilder` callback. If the number of repeats\n * is not specified it will repeat forever. This method is part of\n * the actor 'Action' fluent API allowing action chaining\n *\n * ```typescript\n * // Move up in a zig-zag by repeated moveBy's\n * actor.actions.repeat(repeatCtx => {\n * repeatCtx.moveBy(10, 0, 10);\n * repeatCtx.moveBy(0, 10, 10);\n * }, 5);\n * ```\n * @param repeatBuilder The builder to specify the repeatable list of actions\n * @param times The number of times to repeat all the previous actions in the action queue. If nothing is specified the actions\n * will repeat forever\n */\n repeat(repeatBuilder, times) {\n if (!times) {\n this.repeatForever(repeatBuilder);\n return this;\n }\n this._queue.add(new _Action_Repeat__WEBPACK_IMPORTED_MODULE_19__.Repeat(this._entity, repeatBuilder, times));\n return this;\n }\n /**\n * This method will cause the actor to repeat all of the actions built in\n * the `repeatBuilder` callback. If the number of repeats\n * is not specified it will repeat forever. This method is part of\n * the actor 'Action' fluent API allowing action chaining\n *\n * ```typescript\n * // Move up in a zig-zag by repeated moveBy's\n * actor.actions.repeat(repeatCtx => {\n * repeatCtx.moveBy(10, 0, 10);\n * repeatCtx.moveBy(0, 10, 10);\n * }, 5);\n * ```\n * @param repeatBuilder The builder to specify the repeatable list of actions\n */\n repeatForever(repeatBuilder) {\n this._queue.add(new _Action_RepeatForever__WEBPACK_IMPORTED_MODULE_20__.RepeatForever(this._entity, repeatBuilder));\n return this;\n }\n /**\n * This method will cause the entity to follow another at a specified distance\n * @param entity The entity to follow\n * @param followDistance The distance to maintain when following, if not specified the actor will follow at the current distance.\n */\n follow(entity, followDistance) {\n if (followDistance === undefined) {\n this._queue.add(new _Action_Follow__WEBPACK_IMPORTED_MODULE_21__.Follow(this._entity, entity));\n }\n else {\n this._queue.add(new _Action_Follow__WEBPACK_IMPORTED_MODULE_21__.Follow(this._entity, entity, followDistance));\n }\n return this;\n }\n /**\n * This method will cause the entity to move towards another until they\n * collide \"meet\" at a specified speed.\n * @param entity The entity to meet\n * @param speed The speed in pixels per second to move, if not specified it will match the speed of the other actor\n */\n meet(entity, speed) {\n if (speed === undefined) {\n this._queue.add(new _Action_Meet__WEBPACK_IMPORTED_MODULE_22__.Meet(this._entity, entity));\n }\n else {\n this._queue.add(new _Action_Meet__WEBPACK_IMPORTED_MODULE_22__.Meet(this._entity, entity, speed));\n }\n return this;\n }\n /**\n * Returns a promise that resolves when the current action queue up to now\n * is finished.\n */\n toPromise() {\n const temp = new Promise((resolve) => {\n this._queue.add(new _Action_CallMethod__WEBPACK_IMPORTED_MODULE_18__.CallMethod(() => {\n resolve();\n }));\n });\n return temp;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/ActionQueue.ts\":\n/*!********************************!*\\\n !*** ./Actions/ActionQueue.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ActionQueue: () => (/* binding */ ActionQueue)\n/* harmony export */ });\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n\n/**\n * Action Queues represent an ordered sequence of actions\n *\n * Action queues are part of the {@apilink ActionContext | `Action API`} and\n * store the list of actions to be executed for an {@apilink Actor}.\n *\n * Actors implement {@apilink Actor.actions} which can be manipulated by\n * advanced users to adjust the actions currently being executed in the\n * queue.\n */\nclass ActionQueue {\n constructor(entity) {\n this._actions = [];\n this._currentAction = null;\n this._completedActions = [];\n this._entity = entity;\n }\n /**\n * Add an action to the sequence\n * @param action\n */\n add(action) {\n this._actions.push(action);\n }\n /**\n * Remove an action by reference from the sequence\n * @param action\n */\n remove(action) {\n const index = this._actions.indexOf(action);\n this._actions.splice(index, 1);\n }\n /**\n * Removes all actions from this sequence\n */\n clearActions() {\n this._actions.length = 0;\n this._completedActions.length = 0;\n if (this._currentAction) {\n this._currentAction.stop();\n }\n }\n /**\n *\n * @returns The total list of actions in this sequence complete or not\n */\n getActions() {\n return this._actions.concat(this._completedActions);\n }\n getIncompleteActions() {\n return this._actions;\n }\n getCurrentAction() {\n return this._currentAction;\n }\n /**\n *\n * @returns `true` if there are more actions to process in the sequence\n */\n hasNext() {\n return this._actions.length > 0;\n }\n /**\n * @returns `true` if the current sequence of actions is done\n */\n isComplete() {\n return this._actions.length === 0;\n }\n /**\n * Resets the sequence of actions, this is used to restart a sequence from the beginning\n */\n reset() {\n this._actions = this.getActions();\n const len = this._actions.length;\n for (let i = 0; i < len; i++) {\n this._actions[i].reset();\n }\n this._completedActions = [];\n }\n /**\n * Update the queue which updates actions and handles completing actions\n * @param elapsed\n */\n update(elapsed) {\n if (this._actions.length > 0) {\n if (this._currentAction !== this._actions[0]) {\n this._currentAction = this._actions[0];\n this._entity.emit('actionstart', new _Events__WEBPACK_IMPORTED_MODULE_0__.ActionStartEvent(this._currentAction, this._entity));\n }\n this._currentAction.update(elapsed);\n if (this._currentAction.isComplete(this._entity)) {\n this._entity.emit('actioncomplete', new _Events__WEBPACK_IMPORTED_MODULE_0__.ActionCompleteEvent(this._currentAction, this._entity));\n const complete = this._actions.shift();\n if (complete) {\n this._completedActions.push(complete);\n }\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/ActionSequence.ts\":\n/*!******************************************!*\\\n !*** ./Actions/Action/ActionSequence.ts ***!\n \\******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ActionSequence: () => (/* binding */ ActionSequence)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _ActionContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ActionContext */ \"./Actions/ActionContext.ts\");\n\n\n/**\n * Action that can represent a sequence of actions, this can be useful in conjunction with\n * {@apilink ParallelActions} to run multiple sequences in parallel.\n */\nclass ActionSequence {\n constructor(entity, actionBuilder) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._stopped = false;\n this._sequenceBuilder = actionBuilder;\n this._sequenceContext = new _ActionContext__WEBPACK_IMPORTED_MODULE_1__.ActionContext(entity);\n this._actionQueue = this._sequenceContext.getQueue();\n this._sequenceBuilder(this._sequenceContext);\n }\n update(elapsed) {\n this._actionQueue.update(elapsed);\n }\n isComplete() {\n return this._stopped || this._actionQueue.isComplete();\n }\n stop() {\n this._stopped = true;\n }\n reset() {\n this._stopped = false;\n this._actionQueue.reset();\n }\n clone(entity) {\n return new ActionSequence(entity, this._sequenceBuilder);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/Blink.ts\":\n/*!*********************************!*\\\n !*** ./Actions/Action/Blink.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Blink: () => (/* binding */ Blink)\n/* harmony export */ });\n/* harmony import */ var _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Graphics/GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\nclass Blink {\n constructor(entity, timeVisible, timeNotVisible, numBlinks = 1) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._timeVisible = 0;\n this._timeNotVisible = 0;\n this._elapsedTime = 0;\n this._totalTime = 0;\n this._stopped = false;\n this._started = false;\n this._graphics = entity.get(_Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_1__.GraphicsComponent);\n this._timeVisible = timeVisible;\n this._timeNotVisible = timeNotVisible;\n this._duration = (timeVisible + timeNotVisible) * numBlinks;\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._elapsedTime = 0;\n this._totalTime = 0;\n }\n if (!this._graphics) {\n return;\n }\n this._elapsedTime += elapsed;\n this._totalTime += elapsed;\n if (this._graphics.isVisible && this._elapsedTime >= this._timeVisible) {\n this._graphics.isVisible = false;\n this._elapsedTime = 0;\n }\n if (!this._graphics.isVisible && this._elapsedTime >= this._timeNotVisible) {\n this._graphics.isVisible = true;\n this._elapsedTime = 0;\n }\n if (this.isComplete()) {\n this._graphics.isVisible = true;\n }\n }\n isComplete() {\n return this._stopped || this._totalTime >= this._duration;\n }\n stop() {\n if (this._graphics) {\n this._graphics.isVisible = true;\n }\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n this._elapsedTime = 0;\n this._totalTime = 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/CallMethod.ts\":\n/*!**************************************!*\\\n !*** ./Actions/Action/CallMethod.ts ***!\n \\**************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CallMethod: () => (/* binding */ CallMethod)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\nclass CallMethod {\n constructor(method) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._hasBeenCalled = false;\n this._method = method;\n }\n update(elapsed) {\n this._method();\n this._hasBeenCalled = true;\n }\n isComplete() {\n return this._hasBeenCalled;\n }\n reset() {\n this._hasBeenCalled = false;\n }\n stop() {\n this._hasBeenCalled = true;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/CurveBy.ts\":\n/*!***********************************!*\\\n !*** ./Actions/Action/CurveBy.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CurveBy: () => (/* binding */ CurveBy)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../EntityComponentSystem */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math */ \"./Math/bezier-curve.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math */ \"./Math/vector.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Math */ \"./Math/util.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math */ \"./Math/lerp.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\nclass CurveBy {\n constructor(entity, options) {\n var _a;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._mode = 'dynamic';\n this._entity = entity;\n this._tx = this._entity.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n if (!this._tx) {\n throw new Error(`Entity ${entity.name} has no TransformComponent, can only curveTo on Entities with TransformComponents.`);\n }\n this._curve = this._curve = new _Math__WEBPACK_IMPORTED_MODULE_2__.BezierCurve({\n controlPoints: [(0,_Math__WEBPACK_IMPORTED_MODULE_3__.vec)(0, 0), ...options.controlPoints],\n quality: options.quality\n });\n this._durationMs = options.duration;\n this._mode = (_a = options.mode) !== null && _a !== void 0 ? _a : this._mode;\n this._currentMs = this._durationMs;\n }\n update(elapsed) {\n if (!this._started) {\n this._curve.setControlPoint(0, this._tx.globalPos);\n this._curve.setControlPoint(1, this._curve.controlPoints[1].add(this._tx.globalPos));\n this._curve.setControlPoint(2, this._curve.controlPoints[2].add(this._tx.globalPos));\n this._curve.setControlPoint(3, this._curve.controlPoints[3].add(this._tx.globalPos));\n this._started = true;\n }\n this._currentMs -= elapsed;\n const t = (0,_Math__WEBPACK_IMPORTED_MODULE_4__.clamp)((0,_Math__WEBPACK_IMPORTED_MODULE_5__.remap)(0, this._durationMs, 0, 1, this._durationMs - this._currentMs), 0, 1);\n if (this._mode === 'dynamic') {\n this._tx.pos = this._curve.getPoint(t);\n }\n else {\n this._tx.pos = this._curve.getUniformPoint(t);\n }\n if (this.isComplete(this._entity)) {\n if (this._mode === 'dynamic') {\n this._tx.pos = this._curve.getPoint(1);\n }\n else {\n this._tx.pos = this._curve.getUniformPoint(1);\n }\n }\n }\n isComplete(entity) {\n return this._stopped || this._currentMs < 0;\n }\n reset() {\n this._currentMs = this._durationMs;\n this._started = false;\n this._stopped = false;\n }\n stop() {\n this._stopped = true;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/CurveTo.ts\":\n/*!***********************************!*\\\n !*** ./Actions/Action/CurveTo.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CurveTo: () => (/* binding */ CurveTo)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../EntityComponentSystem */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math */ \"./Math/bezier-curve.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math */ \"./Math/vector.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Math */ \"./Math/util.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math */ \"./Math/lerp.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\nclass CurveTo {\n constructor(entity, options) {\n var _a;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._mode = 'dynamic';\n this._entity = entity;\n this._tx = this._entity.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n if (!this._tx) {\n throw new Error(`Entity ${entity.name} has no TransformComponent, can only curveTo on Entities with TransformComponents.`);\n }\n this._curve = new _Math__WEBPACK_IMPORTED_MODULE_2__.BezierCurve({\n controlPoints: [(0,_Math__WEBPACK_IMPORTED_MODULE_3__.vec)(0, 0), ...options.controlPoints],\n quality: options.quality\n });\n this._durationMs = options.duration;\n this._mode = (_a = options.mode) !== null && _a !== void 0 ? _a : this._mode;\n this._currentMs = this._durationMs;\n }\n update(elapsed) {\n if (!this._started) {\n this._curve.setControlPoint(0, this._tx.globalPos.clone());\n this._started = true;\n }\n this._currentMs -= elapsed;\n const t = (0,_Math__WEBPACK_IMPORTED_MODULE_4__.clamp)((0,_Math__WEBPACK_IMPORTED_MODULE_5__.remap)(0, this._durationMs, 0, 1, this._durationMs - this._currentMs), 0, 1);\n if (this._mode === 'dynamic') {\n this._tx.pos = this._curve.getPoint(t);\n }\n else {\n this._tx.pos = this._curve.getUniformPoint(t);\n }\n if (this.isComplete(this._entity)) {\n if (this._mode === 'dynamic') {\n this._tx.pos = this._curve.getPoint(1);\n }\n else {\n this._tx.pos = this._curve.getUniformPoint(1);\n }\n }\n }\n isComplete(entity) {\n return this._stopped || this._currentMs < 0;\n }\n reset() {\n this._currentMs = this._durationMs;\n this._started = false;\n this._stopped = false;\n }\n stop() {\n this._stopped = true;\n this._currentMs = 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/Delay.ts\":\n/*!*********************************!*\\\n !*** ./Actions/Action/Delay.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Delay: () => (/* binding */ Delay)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\nclass Delay {\n constructor(duration) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._elapsedTime = 0;\n this._started = false;\n this._stopped = false;\n this._delay = duration;\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n }\n this._elapsedTime += elapsed;\n }\n isComplete() {\n return this._stopped || this._elapsedTime >= this._delay;\n }\n stop() {\n this._stopped = true;\n }\n reset() {\n this._elapsedTime = 0;\n this._started = false;\n this._stopped = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/Die.ts\":\n/*!*******************************!*\\\n !*** ./Actions/Action/Die.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Die: () => (/* binding */ Die)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _ActionsComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ActionsComponent */ \"./Actions/ActionsComponent.ts\");\n\n\nclass Die {\n constructor(entity) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._stopped = false;\n this._entity = entity;\n }\n update(elapsed) {\n this._entity.get(_ActionsComponent__WEBPACK_IMPORTED_MODULE_1__.ActionsComponent).clearActions();\n this._entity.kill();\n this._stopped = true;\n }\n isComplete() {\n return this._stopped;\n }\n stop() {\n return;\n }\n reset() {\n return;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/EaseBy.ts\":\n/*!**********************************!*\\\n !*** ./Actions/Action/EaseBy.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EaseBy: () => (/* binding */ EaseBy)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\n\n/**\n * @deprecated use moveBy({offset: Vector, duration: number, easing: EasingFunction})\n */\nclass EaseBy {\n constructor(entity, offsetX, offsetY, duration, easingFcn) {\n this.easingFcn = easingFcn;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._currentLerpTime = 0;\n this._lerpDuration = 1 * 1000; // 1 second\n this._lerpStart = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(0, 0);\n this._lerpEnd = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(0, 0);\n this._initialized = false;\n this._stopped = false;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__.MotionComponent);\n this._lerpDuration = duration;\n this._offset = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(offsetX, offsetY);\n }\n _initialize() {\n this._lerpStart = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this._tx.pos.x, this._tx.pos.y);\n this._currentLerpTime = 0;\n this._lerpEnd = this._lerpStart.add(this._offset);\n }\n update(elapsed) {\n if (!this._initialized) {\n this._initialize();\n this._initialized = true;\n }\n // Need to update lerp time first, otherwise the first update will always be zero\n this._currentLerpTime += elapsed;\n let newX = this._tx.pos.x;\n let newY = this._tx.pos.y;\n if (this._currentLerpTime < this._lerpDuration) {\n if (this._lerpEnd.x < this._lerpStart.x) {\n newX =\n this._lerpStart.x -\n (this.easingFcn(this._currentLerpTime, this._lerpEnd.x, this._lerpStart.x, this._lerpDuration) - this._lerpEnd.x);\n }\n else {\n newX = this.easingFcn(this._currentLerpTime, this._lerpStart.x, this._lerpEnd.x, this._lerpDuration);\n }\n if (this._lerpEnd.y < this._lerpStart.y) {\n newY =\n this._lerpStart.y -\n (this.easingFcn(this._currentLerpTime, this._lerpEnd.y, this._lerpStart.y, this._lerpDuration) - this._lerpEnd.y);\n }\n else {\n newY = this.easingFcn(this._currentLerpTime, this._lerpStart.y, this._lerpEnd.y, this._lerpDuration);\n }\n // Given the lerp position figure out the velocity in pixels per second\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)((newX - this._tx.pos.x) / (elapsed / 1000), (newY - this._tx.pos.y) / (elapsed / 1000));\n }\n else {\n this._tx.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(this._lerpEnd.x, this._lerpEnd.y);\n this._motion.vel = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n }\n }\n isComplete() {\n return this._stopped || this._currentLerpTime >= this._lerpDuration;\n }\n reset() {\n this._initialized = false;\n this._stopped = false;\n this._currentLerpTime = 0;\n }\n stop() {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0);\n this._stopped = true;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/EaseTo.ts\":\n/*!**********************************!*\\\n !*** ./Actions/Action/EaseTo.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EaseTo: () => (/* binding */ EaseTo)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\n\n/**\n * @deprecated use moveTo({pos: Vector, duration: number, easing: EasingFunction})\n */\nclass EaseTo {\n constructor(entity, x, y, duration, easingFcn) {\n this.easingFcn = easingFcn;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._currentLerpTime = 0;\n this._lerpDuration = 1 * 1000; // 1 second\n this._lerpStart = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(0, 0);\n this._lerpEnd = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(0, 0);\n this._initialized = false;\n this._stopped = false;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__.MotionComponent);\n this._lerpDuration = duration;\n this._lerpEnd = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(x, y);\n }\n _initialize() {\n this._lerpStart = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this._tx.pos.x, this._tx.pos.y);\n this._currentLerpTime = 0;\n }\n update(elapsed) {\n if (!this._initialized) {\n this._initialize();\n this._initialized = true;\n }\n // Need to update lerp time first, otherwise the first update will always be zero\n this._currentLerpTime += elapsed;\n let newX = this._tx.pos.x;\n let newY = this._tx.pos.y;\n if (this._currentLerpTime < this._lerpDuration) {\n if (this._lerpEnd.x < this._lerpStart.x) {\n newX =\n this._lerpStart.x -\n (this.easingFcn(this._currentLerpTime, this._lerpEnd.x, this._lerpStart.x, this._lerpDuration) - this._lerpEnd.x);\n }\n else {\n newX = this.easingFcn(this._currentLerpTime, this._lerpStart.x, this._lerpEnd.x, this._lerpDuration);\n }\n if (this._lerpEnd.y < this._lerpStart.y) {\n newY =\n this._lerpStart.y -\n (this.easingFcn(this._currentLerpTime, this._lerpEnd.y, this._lerpStart.y, this._lerpDuration) - this._lerpEnd.y);\n }\n else {\n newY = this.easingFcn(this._currentLerpTime, this._lerpStart.y, this._lerpEnd.y, this._lerpDuration);\n }\n // Given the lerp position figure out the velocity in pixels per second\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)((newX - this._tx.pos.x) / (elapsed / 1000), (newY - this._tx.pos.y) / (elapsed / 1000));\n }\n else {\n this._tx.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(this._lerpEnd.x, this._lerpEnd.y);\n this._motion.vel = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n }\n }\n isComplete() {\n return this._stopped || this._currentLerpTime >= this._lerpDuration;\n }\n reset() {\n this._initialized = false;\n this._stopped = false;\n this._currentLerpTime = 0;\n }\n stop() {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0);\n this._stopped = true;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/Fade.ts\":\n/*!********************************!*\\\n !*** ./Actions/Action/Fade.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Fade: () => (/* binding */ Fade)\n/* harmony export */ });\n/* harmony import */ var _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Graphics/GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\nclass Fade {\n constructor(entity, endOpacity, duration) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._multiplier = 1;\n this._started = false;\n this._stopped = false;\n this._graphics = entity.get(_Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_1__.GraphicsComponent);\n this._endOpacity = endOpacity;\n this._remainingTime = this._originalTime = duration;\n }\n update(elapsed) {\n if (!this._graphics) {\n return;\n }\n if (!this._started) {\n this._started = true;\n this._remainingTime = this._originalTime;\n // determine direction when we start\n if (this._endOpacity < this._graphics.opacity) {\n this._multiplier = -1;\n }\n else {\n this._multiplier = 1;\n }\n }\n if (this._remainingTime > 0) {\n this._graphics.opacity += (this._multiplier * (Math.abs(this._graphics.opacity - this._endOpacity) * elapsed)) / this._remainingTime;\n }\n this._remainingTime -= elapsed;\n if (this.isComplete()) {\n this._graphics.opacity = this._endOpacity;\n }\n _Util_Log__WEBPACK_IMPORTED_MODULE_2__.Logger.getInstance().debug('[Action fade] Actor opacity:', this._graphics.opacity);\n }\n isComplete() {\n return this._stopped || this._remainingTime <= 0;\n }\n stop() {\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n this._remainingTime = this._originalTime;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/Flash.ts\":\n/*!*********************************!*\\\n !*** ./Actions/Action/Flash.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Flash: () => (/* binding */ Flash)\n/* harmony export */ });\n/* harmony import */ var _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Graphics/GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\nclass Flash {\n constructor(entity, color, duration = 1000) {\n var _a;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._stopped = false;\n this._started = false;\n this._total = 0;\n this._currentDuration = 0;\n this._graphics = entity.get(_Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_1__.GraphicsComponent);\n this._duration = duration;\n this._entity = entity;\n this._material = (_a = entity.scene) === null || _a === void 0 ? void 0 : _a.engine.graphicsContext.createMaterial({\n name: 'flash-material',\n color,\n fragmentSource: `#version 300 es\r\n \r\n precision mediump float;\r\n uniform float u_blend;\r\n uniform sampler2D u_graphic;\r\n uniform vec4 u_color;\r\n \r\n in vec2 v_uv; \r\n out vec4 color;\r\n \r\n void main() { \r\n vec4 textureColor = texture(u_graphic, v_uv); \r\n color = mix(textureColor, u_color, u_blend * textureColor.a);\r\n color.rgb = color.rgb * color.a;\r\n }`\n });\n this._total = duration;\n }\n update(elapsed) {\n var _a;\n if (!this._started) {\n this._started = true;\n this._total = this._duration;\n this._currentDuration = this._duration;\n this._entity.graphics.material = this._material;\n }\n if (!this._graphics) {\n return;\n }\n this._currentDuration -= elapsed;\n if (this._graphics) {\n (_a = this._material) === null || _a === void 0 ? void 0 : _a.update((shader) => {\n shader.trySetUniformFloat('u_blend', this._currentDuration / this._total);\n });\n }\n if (this.isComplete()) {\n this._entity.graphics.material = null;\n }\n }\n isComplete() {\n return this._stopped || this._currentDuration <= 0;\n }\n stop() {\n if (this._graphics) {\n this._graphics.isVisible = true;\n }\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/Follow.ts\":\n/*!**********************************!*\\\n !*** ./Actions/Action/Follow.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Follow: () => (/* binding */ Follow)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\n\nclass Follow {\n constructor(entity, entityToFollow, followDistance) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n this._followTx = entityToFollow.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._followMotion = entityToFollow.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n this._current = new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(this._tx.pos.x, this._tx.pos.y);\n this._end = new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(this._followTx.pos.x, this._followTx.pos.y);\n this._maximumDistance = followDistance !== undefined ? followDistance : this._current.distance(this._end);\n this._speed = 0;\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._distanceBetween = this._current.distance(this._end);\n this._dir = this._end.sub(this._current).normalize();\n }\n const actorToFollowSpeed = Math.sqrt(Math.pow(this._followMotion.vel.x, 2) + Math.pow(this._followMotion.vel.y, 2));\n if (actorToFollowSpeed !== 0) {\n this._speed = actorToFollowSpeed;\n }\n this._current = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this._tx.pos.x, this._tx.pos.y);\n this._end = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this._followTx.pos.x, this._followTx.pos.y);\n this._distanceBetween = this._current.distance(this._end);\n this._dir = this._end.sub(this._current).normalize();\n if (this._distanceBetween >= this._maximumDistance) {\n const m = this._dir.scale(this._speed);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(m.x, m.y);\n }\n else {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(0, 0);\n }\n if (this.isComplete()) {\n this._tx.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this._end.x, this._end.y);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(0, 0);\n }\n }\n stop() {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(0, 0);\n this._stopped = true;\n }\n isComplete() {\n // the actor following should never stop unless specified to do so\n return this._stopped;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/Meet.ts\":\n/*!********************************!*\\\n !*** ./Actions/Action/Meet.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Meet: () => (/* binding */ Meet)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\n\nclass Meet {\n constructor(actor, actorToMeet, speed) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._speedWasSpecified = false;\n this._tx = actor.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._motion = actor.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n this._meetTx = actorToMeet.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._meetMotion = actorToMeet.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n this._current = new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(this._tx.pos.x, this._tx.pos.y);\n this._end = new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(this._meetTx.pos.x, this._meetTx.pos.y);\n this._speed = speed || 0;\n if (speed !== undefined) {\n this._speedWasSpecified = true;\n }\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._distanceBetween = this._current.distance(this._end);\n this._dir = this._end.sub(this._current).normalize();\n }\n const actorToMeetSpeed = Math.sqrt(Math.pow(this._meetMotion.vel.x, 2) + Math.pow(this._meetMotion.vel.y, 2));\n if (actorToMeetSpeed !== 0 && !this._speedWasSpecified) {\n this._speed = actorToMeetSpeed;\n }\n this._current = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this._tx.pos.x, this._tx.pos.y);\n this._end = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this._meetTx.pos.x, this._meetTx.pos.y);\n this._distanceBetween = this._current.distance(this._end);\n this._dir = this._end.sub(this._current).normalize();\n const m = this._dir.scale(this._speed);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(m.x, m.y);\n if (this.isComplete()) {\n this._tx.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this._end.x, this._end.y);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(0, 0);\n }\n }\n isComplete() {\n return this._stopped || this._distanceBetween <= 1;\n }\n stop() {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(0, 0);\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n this._distanceBetween = Infinity;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/MoveBy.ts\":\n/*!**********************************!*\\\n !*** ./Actions/Action/MoveBy.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MoveBy: () => (/* binding */ MoveBy),\n/* harmony export */ MoveByWithOptions: () => (/* binding */ MoveByWithOptions),\n/* harmony export */ isMoveByOptions: () => (/* binding */ isMoveByOptions)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math */ \"./Math/util.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../Math */ \"./Math/lerp.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Util/EasingFunctions */ \"./Util/EasingFunctions.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\n\n\n\n\n/**\n *\n */\nfunction isMoveByOptions(x) {\n return x.offset instanceof _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector && typeof x.duration === 'number';\n}\nclass MoveByWithOptions {\n constructor(entity, options) {\n var _a;\n this.entity = entity;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_1__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._easing = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_2__.EasingFunctions.Linear;\n this._offset = options.offset;\n this._easing = (_a = options.easing) !== null && _a !== void 0 ? _a : this._easing;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_4__.MotionComponent);\n if (!this._tx) {\n throw new Error(`Entity ${entity.name} has no TransformComponent, can only MoveBy on Entities with TransformComponents.`);\n }\n this._durationMs = options.duration;\n this._currentMs = this._durationMs;\n }\n update(elapsed) {\n if (!this._started) {\n this._start = this._tx.pos.clone();\n this._end = this._start.add(this._offset);\n this._started = true;\n }\n this._currentMs -= elapsed;\n const t = (0,_Math__WEBPACK_IMPORTED_MODULE_5__.clamp)((0,_Math__WEBPACK_IMPORTED_MODULE_6__.remap)(0, this._durationMs, 0, 1, this._durationMs - this._currentMs), 0, 1);\n const currentPos = this._tx.pos;\n const newPosX = this._easing(t, this._start.x, this._end.x, 1);\n const newPosY = this._easing(t, this._start.y, this._end.y, 1);\n const velX = (newPosX - currentPos.x) / (elapsed / 1000);\n const velY = (newPosY - currentPos.y) / (elapsed / 1000);\n this._motion.vel.x = velX;\n this._motion.vel.y = velY;\n if (this.isComplete(this.entity)) {\n this._tx.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this._end.x, this._end.y);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n }\n }\n isComplete(entity) {\n return this._stopped || this._currentMs < 0;\n }\n stop() {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n this._stopped = true;\n this._currentMs = 0;\n }\n reset() {\n this._currentMs = this._durationMs;\n this._started = false;\n this._stopped = false;\n }\n}\nclass MoveBy {\n constructor(entity, offsetX, offsetY, speed) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_1__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._entity = entity;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_4__.MotionComponent);\n this._speed = speed;\n this._offset = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(offsetX, offsetY);\n if (speed <= 0) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_7__.Logger.getInstance().error('Attempted to moveBy with speed less than or equal to zero : ' + speed);\n throw new Error('Speed must be greater than 0 pixels per second');\n }\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._start = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(this._tx.pos.x, this._tx.pos.y);\n this._end = this._start.add(this._offset);\n this._distance = this._offset.magnitude;\n this._dir = this._end.sub(this._start).normalize();\n }\n if (this.isComplete(this._entity)) {\n this._tx.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this._end.x, this._end.y);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n }\n else {\n this._motion.vel = this._dir.scale(this._speed);\n }\n }\n isComplete(entity) {\n const tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__.TransformComponent);\n return this._stopped || tx.pos.distance(this._start) >= this._distance;\n }\n stop() {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/MoveTo.ts\":\n/*!**********************************!*\\\n !*** ./Actions/Action/MoveTo.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MoveTo: () => (/* binding */ MoveTo),\n/* harmony export */ MoveToWithOptions: () => (/* binding */ MoveToWithOptions),\n/* harmony export */ isMoveToOptions: () => (/* binding */ isMoveToOptions)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math */ \"./Math/util.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../Math */ \"./Math/lerp.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Util/EasingFunctions */ \"./Util/EasingFunctions.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n\n\n\n\n\n/**\n *\n */\nfunction isMoveToOptions(x) {\n return x.pos instanceof _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector && typeof x.duration === 'number';\n}\nclass MoveToWithOptions {\n constructor(entity, options) {\n var _a;\n this.entity = entity;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_1__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._easing = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_2__.EasingFunctions.Linear;\n this._end = options.pos;\n this._easing = (_a = options.easing) !== null && _a !== void 0 ? _a : this._easing;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_4__.MotionComponent);\n if (!this._tx) {\n throw new Error(`Entity ${entity.name} has no TransformComponent, can only moveTo on Entities with TransformComponents.`);\n }\n this._durationMs = options.duration;\n this._currentMs = this._durationMs;\n }\n update(elapsed) {\n if (!this._started) {\n this._start = this._tx.pos.clone();\n this._started = true;\n }\n this._currentMs -= elapsed;\n const t = (0,_Math__WEBPACK_IMPORTED_MODULE_5__.clamp)((0,_Math__WEBPACK_IMPORTED_MODULE_6__.remap)(0, this._durationMs, 0, 1, this._durationMs - this._currentMs), 0, 1);\n const currentPos = this._tx.pos;\n const newPosX = this._easing(t, this._start.x, this._end.x, 1);\n const newPosY = this._easing(t, this._start.y, this._end.y, 1);\n const velX = (newPosX - currentPos.x) / (elapsed / 1000);\n const velY = (newPosY - currentPos.y) / (elapsed / 1000);\n this._motion.vel.x = velX;\n this._motion.vel.y = velY;\n if (this.isComplete(this.entity)) {\n this._tx.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this._end.x, this._end.y);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n }\n }\n isComplete(entity) {\n return this._stopped || this._currentMs < 0;\n }\n stop() {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n this._stopped = true;\n this._currentMs = 0;\n }\n reset() {\n this._currentMs = this._durationMs;\n this._started = false;\n this._stopped = false;\n }\n}\nclass MoveTo {\n constructor(entity, destX, destY, speed) {\n this.entity = entity;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_1__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_4__.MotionComponent);\n this._end = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(destX, destY);\n this._speed = speed;\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._start = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(this._tx.pos.x, this._tx.pos.y);\n this._distance = this._start.distance(this._end);\n this._dir = this._end.sub(this._start).normalize();\n }\n const m = this._dir.scale(this._speed);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(m.x, m.y);\n if (this.isComplete(this.entity)) {\n this._tx.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this._end.x, this._end.y);\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n }\n }\n isComplete(entity) {\n const tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__.TransformComponent);\n return this._stopped || new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(tx.pos.x, tx.pos.y).distance(this._start) >= this._distance;\n }\n stop() {\n this._motion.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/ParallelActions.ts\":\n/*!*******************************************!*\\\n !*** ./Actions/Action/ParallelActions.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ParallelActions: () => (/* binding */ ParallelActions)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n\n/**\n * Action that can run multiple {@apilink Action}s or {@apilink ActionSequence}s at the same time\n */\nclass ParallelActions {\n constructor(parallelActions) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._actions = parallelActions;\n }\n update(elapsed) {\n for (let i = 0; i < this._actions.length; i++) {\n this._actions[i].update(elapsed);\n }\n }\n isComplete(entity) {\n return this._actions.every((a) => a.isComplete(entity));\n }\n reset() {\n this._actions.forEach((a) => a.reset());\n }\n stop() {\n this._actions.forEach((a) => a.stop());\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/Repeat.ts\":\n/*!**********************************!*\\\n !*** ./Actions/Action/Repeat.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Repeat: () => (/* binding */ Repeat)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _ActionContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ActionContext */ \"./Actions/ActionContext.ts\");\n\n\nclass Repeat {\n constructor(entity, repeatBuilder, repeat) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._stopped = false;\n this._repeatBuilder = repeatBuilder;\n this._repeatContext = new _ActionContext__WEBPACK_IMPORTED_MODULE_1__.ActionContext(entity);\n this._actionQueue = this._repeatContext.getQueue();\n this._repeat = repeat;\n this._originalRepeat = repeat;\n this._repeatBuilder(this._repeatContext);\n this._repeat--; // current execution is the first repeat\n }\n update(elapsed) {\n if (this._actionQueue.isComplete()) {\n this._actionQueue.clearActions();\n this._repeatBuilder(this._repeatContext);\n this._repeat--;\n }\n this._actionQueue.update(elapsed);\n }\n isComplete() {\n return this._stopped || (this._repeat <= 0 && this._actionQueue.isComplete());\n }\n stop() {\n this._stopped = true;\n }\n reset() {\n this._repeat = this._originalRepeat;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/RepeatForever.ts\":\n/*!*****************************************!*\\\n !*** ./Actions/Action/RepeatForever.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RepeatForever: () => (/* binding */ RepeatForever)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _ActionContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ActionContext */ \"./Actions/ActionContext.ts\");\n\n\n/**\n * RepeatForever Action implementation, it is recommended you use the fluent action\n * context API.\n *\n *\n */\nclass RepeatForever {\n constructor(entity, repeatBuilder) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._stopped = false;\n this._repeatBuilder = repeatBuilder;\n this._repeatContext = new _ActionContext__WEBPACK_IMPORTED_MODULE_1__.ActionContext(entity);\n this._actionQueue = this._repeatContext.getQueue();\n this._repeatBuilder(this._repeatContext);\n }\n update(elapsed) {\n if (this._stopped) {\n return;\n }\n if (this._actionQueue.isComplete()) {\n this._actionQueue.clearActions();\n this._repeatBuilder(this._repeatContext);\n }\n this._actionQueue.update(elapsed);\n }\n isComplete() {\n return this._stopped;\n }\n stop() {\n this._stopped = true;\n this._actionQueue.clearActions();\n }\n reset() {\n return;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/RotateBy.ts\":\n/*!************************************!*\\\n !*** ./Actions/Action/RotateBy.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RotateBy: () => (/* binding */ RotateBy),\n/* harmony export */ RotateByWithOptions: () => (/* binding */ RotateByWithOptions),\n/* harmony export */ isRotateByOptions: () => (/* binding */ isRotateByOptions)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math */ \"./Math/rotation-type.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math */ \"./Math/lerp.ts\");\n\n\n\n\n\n/**\n *\n */\nfunction isRotateByOptions(x) {\n return typeof x.angleRadiansOffset === 'number' && typeof x.duration === 'number';\n}\nclass RotateByWithOptions {\n constructor(entity, options) {\n var _a;\n this.entity = entity;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._offset = 0;\n this._startAngle = 0;\n this._endAngle = 0;\n this._offset = options.angleRadiansOffset;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n if (!this._tx) {\n throw new Error(`Entity ${entity.name} has no TransformComponent, can only RotateBy on Entities with TransformComponents.`);\n }\n this._durationMs = options.duration;\n this._rotationType = (_a = options.rotationType) !== null && _a !== void 0 ? _a : _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.ShortestPath;\n this._currentMs = this._durationMs;\n }\n update(elapsed) {\n if (!this._started) {\n this._startAngle = this._tx.rotation;\n this._endAngle = (0,_Math_util__WEBPACK_IMPORTED_MODULE_4__.canonicalizeAngle)(this._startAngle + this._offset);\n this._started = true;\n }\n this._currentMs -= elapsed;\n const t = (0,_Math_util__WEBPACK_IMPORTED_MODULE_4__.clamp)((0,_Math__WEBPACK_IMPORTED_MODULE_5__.remap)(0, this._durationMs, 0, 1, this._durationMs - this._currentMs), 0, 1);\n const newAngle = (0,_Math__WEBPACK_IMPORTED_MODULE_5__.lerpAngle)(this._startAngle, this._endAngle, this._rotationType, t);\n const currentAngle = this._tx.rotation;\n const rx = (newAngle - currentAngle) / (elapsed / 1000);\n this._motion.angularVelocity = rx;\n if (this.isComplete()) {\n this._tx.rotation = this._endAngle;\n this._motion.angularVelocity = 0;\n }\n }\n isComplete() {\n return this._stopped || this._currentMs < 0;\n }\n stop() {\n this._motion.angularVelocity = 0;\n this._stopped = true;\n this._currentMs = 0;\n }\n reset() {\n this._currentMs = this._durationMs;\n this._started = false;\n this._stopped = false;\n }\n}\nclass RotateBy {\n constructor(entity, angleRadiansOffset, speed, rotationType) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n this._speed = speed;\n this._offset = angleRadiansOffset;\n this._rotationType = rotationType || _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.ShortestPath;\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._start = this._tx.rotation;\n this._currentNonCannonAngle = this._tx.rotation;\n this._end = this._start + this._offset;\n const distance1 = Math.abs(this._end - this._start);\n const distance2 = _Math_util__WEBPACK_IMPORTED_MODULE_4__.TwoPI - distance1;\n if (distance1 > distance2) {\n this._shortDistance = distance2;\n this._longDistance = distance1;\n }\n else {\n this._shortDistance = distance1;\n this._longDistance = distance2;\n }\n this._shortestPathIsPositive = (this._start - this._end + _Math_util__WEBPACK_IMPORTED_MODULE_4__.TwoPI) % _Math_util__WEBPACK_IMPORTED_MODULE_4__.TwoPI >= Math.PI;\n switch (this._rotationType) {\n case _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.ShortestPath:\n this._distance = this._shortDistance;\n if (this._shortestPathIsPositive) {\n this._direction = 1;\n }\n else {\n this._direction = -1;\n }\n break;\n case _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.LongestPath:\n this._distance = this._longDistance;\n if (this._shortestPathIsPositive) {\n this._direction = -1;\n }\n else {\n this._direction = 1;\n }\n break;\n case _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.Clockwise:\n this._direction = 1;\n if (this._shortDistance >= 0) {\n this._distance = this._shortDistance;\n }\n else {\n this._distance = this._longDistance;\n }\n break;\n case _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.CounterClockwise:\n this._direction = -1;\n if (this._shortDistance <= 0) {\n this._distance = this._shortDistance;\n }\n else {\n this._distance = this._longDistance;\n }\n break;\n }\n }\n this._motion.angularVelocity = this._direction * this._speed;\n this._currentNonCannonAngle += this._direction * this._speed * (elapsed / 1000);\n if (this.isComplete()) {\n this._tx.rotation = this._end;\n this._motion.angularVelocity = 0;\n this._stopped = true;\n }\n }\n isComplete() {\n const distanceTraveled = Math.abs(this._currentNonCannonAngle - this._start);\n return this._stopped || distanceTraveled >= Math.abs(this._distance);\n }\n stop() {\n this._motion.angularVelocity = 0;\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n this._start = undefined;\n this._currentNonCannonAngle = undefined;\n this._distance = undefined;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/RotateTo.ts\":\n/*!************************************!*\\\n !*** ./Actions/Action/RotateTo.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RotateTo: () => (/* binding */ RotateTo),\n/* harmony export */ RotateToWithOptions: () => (/* binding */ RotateToWithOptions),\n/* harmony export */ isRotateToOptions: () => (/* binding */ isRotateToOptions)\n/* harmony export */ });\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math */ \"./Math/rotation-type.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math */ \"./Math/lerp.ts\");\n\n\n\n\n\n\n/**\n *\n */\nfunction isRotateToOptions(x) {\n return typeof x.angle === 'number' && typeof x.duration === 'number';\n}\nclass RotateToWithOptions {\n constructor(entity, options) {\n var _a;\n this.entity = entity;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._endAngle = 0;\n this._startAngle = 0;\n this._endAngle = options.angle;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n if (!this._tx) {\n throw new Error(`Entity ${entity.name} has no TransformComponent, can only RotateTo on Entities with TransformComponents.`);\n }\n this._durationMs = options.duration;\n this._rotationType = (_a = options.rotationType) !== null && _a !== void 0 ? _a : _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.ShortestPath;\n this._currentMs = this._durationMs;\n }\n update(elapsed) {\n if (!this._started) {\n this._startAngle = this._tx.rotation;\n this._started = true;\n }\n this._currentMs -= elapsed;\n const t = (0,_Math_util__WEBPACK_IMPORTED_MODULE_4__.clamp)((0,_Math__WEBPACK_IMPORTED_MODULE_5__.remap)(0, this._durationMs, 0, 1, this._durationMs - this._currentMs), 0, 1);\n const newAngle = (0,_Math__WEBPACK_IMPORTED_MODULE_5__.lerpAngle)(this._startAngle, this._endAngle, this._rotationType, t);\n const currentAngle = this._tx.rotation;\n const rx = (newAngle - currentAngle) / (elapsed / 1000);\n this._motion.angularVelocity = rx;\n if (this.isComplete(this.entity)) {\n this._tx.rotation = this._endAngle;\n this._motion.angularVelocity = 0;\n }\n }\n isComplete(entity) {\n return this._stopped || this._currentMs < 0;\n }\n stop() {\n this._motion.angularVelocity = 0;\n this._stopped = true;\n this._currentMs = 0;\n }\n reset() {\n this._currentMs = this._durationMs;\n this._started = false;\n this._stopped = false;\n }\n}\nclass RotateTo {\n constructor(entity, angle, speed, rotationType) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n this._end = angle;\n this._speed = speed;\n this._rotationType = rotationType || _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.ShortestPath;\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._start = this._tx.rotation;\n this._currentNonCannonAngle = this._tx.rotation;\n const distance1 = Math.abs(this._end - this._start);\n const distance2 = _Math_util__WEBPACK_IMPORTED_MODULE_4__.TwoPI - distance1;\n if (distance1 > distance2) {\n this._shortDistance = distance2;\n this._longDistance = distance1;\n }\n else {\n this._shortDistance = distance1;\n this._longDistance = distance2;\n }\n this._shortestPathIsPositive = (this._start - this._end + _Math_util__WEBPACK_IMPORTED_MODULE_4__.TwoPI) % _Math_util__WEBPACK_IMPORTED_MODULE_4__.TwoPI >= Math.PI;\n switch (this._rotationType) {\n case _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.ShortestPath:\n this._distance = this._shortDistance;\n if (this._shortestPathIsPositive) {\n this._direction = 1;\n }\n else {\n this._direction = -1;\n }\n break;\n case _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.LongestPath:\n this._distance = this._longDistance;\n if (this._shortestPathIsPositive) {\n this._direction = -1;\n }\n else {\n this._direction = 1;\n }\n break;\n case _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.Clockwise:\n this._direction = 1;\n if (this._shortestPathIsPositive) {\n this._distance = this._shortDistance;\n }\n else {\n this._distance = this._longDistance;\n }\n break;\n case _Math__WEBPACK_IMPORTED_MODULE_3__.RotationType.CounterClockwise:\n this._direction = -1;\n if (!this._shortestPathIsPositive) {\n this._distance = this._shortDistance;\n }\n else {\n this._distance = this._longDistance;\n }\n break;\n }\n }\n this._motion.angularVelocity = this._direction * this._speed;\n this._currentNonCannonAngle += this._direction * this._speed * (elapsed / 1000);\n if (this.isComplete()) {\n this._tx.rotation = this._end;\n this._motion.angularVelocity = 0;\n this._stopped = true;\n }\n }\n isComplete() {\n const distanceTraveled = Math.abs(this._currentNonCannonAngle - this._start);\n return this._stopped || distanceTraveled >= Math.abs(this._distance);\n }\n stop() {\n this._motion.angularVelocity = 0;\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/ScaleBy.ts\":\n/*!***********************************!*\\\n !*** ./Actions/Action/ScaleBy.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ScaleBy: () => (/* binding */ ScaleBy),\n/* harmony export */ ScaleByWithOptions: () => (/* binding */ ScaleByWithOptions),\n/* harmony export */ isScaleByOptions: () => (/* binding */ isScaleByOptions)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Math */ \"./Math/util.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math */ \"./Math/lerp.ts\");\n\n\n\n\n\n/**\n *\n */\nfunction isScaleByOptions(x) {\n return typeof x.scaleOffset === 'object' && typeof x.duration === 'number';\n}\nclass ScaleByWithOptions {\n constructor(entity, options) {\n this.entity = entity;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._endScale = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(1, 1);\n this._scaleOffset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0);\n this._startScale = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(1, 1);\n this._scaleOffset = options.scaleOffset;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__.MotionComponent);\n if (!this._tx) {\n throw new Error(`Entity ${entity.name} has no TransformComponent, can only ScaleBy on Entities with TransformComponents.`);\n }\n this._durationMs = options.duration;\n this._currentMs = this._durationMs;\n }\n update(elapsed) {\n if (!this._started) {\n this._startScale = this._tx.scale;\n this._endScale = this._startScale.add(this._scaleOffset);\n this._started = true;\n }\n this._currentMs -= elapsed;\n const t = (0,_Math__WEBPACK_IMPORTED_MODULE_4__.clamp)((0,_Math__WEBPACK_IMPORTED_MODULE_5__.remap)(0, this._durationMs, 0, 1, this._durationMs - this._currentMs), 0, 1);\n const newScale = (0,_Math__WEBPACK_IMPORTED_MODULE_5__.lerpVector)(this._startScale, this._endScale, t);\n const currentScale = this._tx.scale;\n const sx = newScale.sub(currentScale).scale(1 / (elapsed / 1000));\n this._motion.scaleFactor = sx;\n if (this.isComplete()) {\n this._tx.scale = this._endScale;\n this._motion.angularVelocity = 0;\n }\n }\n isComplete() {\n return this._stopped || this._currentMs < 0;\n }\n stop() {\n this._motion.scaleFactor = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n this._stopped = true;\n this._currentMs = 0;\n }\n reset() {\n this._currentMs = this._durationMs;\n this._started = false;\n this._stopped = false;\n }\n}\nclass ScaleBy {\n constructor(entity, scaleOffsetX, scaleOffsetY, speed) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__.MotionComponent);\n this._offset = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(scaleOffsetX, scaleOffsetY);\n this._speedX = this._speedY = speed;\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._startScale = this._tx.scale.clone();\n this._endScale = this._startScale.add(this._offset);\n this._distanceX = Math.abs(this._endScale.x - this._startScale.x);\n this._distanceY = Math.abs(this._endScale.y - this._startScale.y);\n this._directionX = this._endScale.x < this._startScale.x ? -1 : 1;\n this._directionY = this._endScale.y < this._startScale.y ? -1 : 1;\n }\n this._motion.scaleFactor.x = this._speedX * this._directionX;\n this._motion.scaleFactor.y = this._speedY * this._directionY;\n if (this.isComplete()) {\n this._tx.scale = this._endScale;\n this._motion.scaleFactor.x = 0;\n this._motion.scaleFactor.y = 0;\n }\n }\n isComplete() {\n return (this._stopped ||\n (Math.abs(this._tx.scale.x - this._startScale.x) >= this._distanceX - 0.01 &&\n Math.abs(this._tx.scale.y - this._startScale.y) >= this._distanceY - 0.01));\n }\n stop() {\n this._motion.scaleFactor.x = 0;\n this._motion.scaleFactor.y = 0;\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/Action/ScaleTo.ts\":\n/*!***********************************!*\\\n !*** ./Actions/Action/ScaleTo.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ScaleTo: () => (/* binding */ ScaleTo),\n/* harmony export */ ScaleToWithOptions: () => (/* binding */ ScaleToWithOptions),\n/* harmony export */ isScaleToOptions: () => (/* binding */ isScaleToOptions)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Math */ \"./Math/util.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math */ \"./Math/lerp.ts\");\n\n\n\n\n\n/**\n *\n */\nfunction isScaleToOptions(x) {\n return typeof x.scale === 'object' && typeof x.duration === 'number';\n}\nclass ScaleToWithOptions {\n constructor(entity, options) {\n this.entity = entity;\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._endScale = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(1, 1);\n this._startScale = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(1, 1);\n this._endScale = options.scale;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__.MotionComponent);\n if (!this._tx) {\n throw new Error(`Entity ${entity.name} has no TransformComponent, can only ScaleTo on Entities with TransformComponents.`);\n }\n this._durationMs = options.duration;\n this._currentMs = this._durationMs;\n }\n update(elapsed) {\n if (!this._started) {\n this._startScale = this._tx.scale;\n this._started = true;\n }\n this._currentMs -= elapsed;\n const t = (0,_Math__WEBPACK_IMPORTED_MODULE_4__.clamp)((0,_Math__WEBPACK_IMPORTED_MODULE_5__.remap)(0, this._durationMs, 0, 1, this._durationMs - this._currentMs), 0, 1);\n const newScale = (0,_Math__WEBPACK_IMPORTED_MODULE_5__.lerpVector)(this._startScale, this._endScale, t);\n const currentScale = this._tx.scale;\n const sx = newScale.sub(currentScale).scale(1 / (elapsed / 1000));\n this._motion.scaleFactor = sx;\n if (this.isComplete()) {\n this._tx.scale = this._endScale;\n this._motion.angularVelocity = 0;\n }\n }\n isComplete() {\n return this._stopped || this._currentMs < 0;\n }\n stop() {\n this._motion.scaleFactor = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n this._stopped = true;\n this._currentMs = 0;\n }\n reset() {\n this._currentMs = this._durationMs;\n this._started = false;\n this._stopped = false;\n }\n}\nclass ScaleTo {\n constructor(entity, scaleX, scaleY, speedX, speedY) {\n this.id = (0,_Action__WEBPACK_IMPORTED_MODULE_0__.nextActionId)();\n this._started = false;\n this._stopped = false;\n this._tx = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n this._motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_3__.MotionComponent);\n this._endX = scaleX;\n this._endY = scaleY;\n this._speedX = speedX;\n this._speedY = speedY;\n }\n update(elapsed) {\n if (!this._started) {\n this._started = true;\n this._startX = this._tx.scale.x;\n this._startY = this._tx.scale.y;\n this._distanceX = Math.abs(this._endX - this._startX);\n this._distanceY = Math.abs(this._endY - this._startY);\n }\n if (!(Math.abs(this._tx.scale.x - this._startX) >= this._distanceX)) {\n const directionX = this._endY < this._startY ? -1 : 1;\n this._motion.scaleFactor.x = this._speedX * directionX;\n }\n else {\n this._motion.scaleFactor.x = 0;\n }\n if (!(Math.abs(this._tx.scale.y - this._startY) >= this._distanceY)) {\n const directionY = this._endY < this._startY ? -1 : 1;\n this._motion.scaleFactor.y = this._speedY * directionY;\n }\n else {\n this._motion.scaleFactor.y = 0;\n }\n if (this.isComplete()) {\n this._tx.scale = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(this._endX, this._endY);\n this._motion.scaleFactor.x = 0;\n this._motion.scaleFactor.y = 0;\n }\n }\n isComplete() {\n return (this._stopped ||\n (Math.abs(this._tx.scale.x - this._startX) >= this._distanceX - 0.01 &&\n Math.abs(this._tx.scale.y - this._startY) >= this._distanceY - 0.01));\n }\n stop() {\n this._motion.scaleFactor.x = 0;\n this._motion.scaleFactor.y = 0;\n this._stopped = true;\n }\n reset() {\n this._started = false;\n this._stopped = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/ActionsComponent.ts\":\n/*!*************************************!*\\\n !*** ./Actions/ActionsComponent.ts ***!\n \\*************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ActionsComponent: () => (/* binding */ ActionsComponent)\n/* harmony export */ });\n/* harmony import */ var _ActionContext__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./ActionContext */ \"./Actions/ActionContext.ts\");\n/* harmony import */ var _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Component */ \"./EntityComponentSystem/Component.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n\n\n\n\nclass ActionsComponent extends _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor() {\n super(...arguments);\n this.dependencies = [_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent, _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent];\n this._ctx = null;\n }\n onAdd(entity) {\n this._ctx = new _ActionContext__WEBPACK_IMPORTED_MODULE_3__.ActionContext(entity);\n }\n onRemove() {\n this._ctx = null;\n }\n _getCtx() {\n if (!this._ctx) {\n throw new Error('Actions component not attached to an entity, no context available');\n }\n return this._ctx;\n }\n /**\n * Returns the internal action queue\n * @returns action queue\n */\n getQueue() {\n if (!this._ctx) {\n throw new Error('Actions component not attached to an entity, no queue available');\n }\n return this._ctx.getQueue();\n }\n /**\n * Runs a specific action in the action queue\n * @param action\n */\n runAction(action) {\n if (!this._ctx) {\n throw new Error('Actions component not attached to an entity, cannot run action');\n }\n return this._ctx.runAction(action);\n }\n /**\n * Updates the internal action context, performing action and moving through the internal queue\n * @param elapsed\n */\n update(elapsed) {\n var _a;\n return (_a = this._ctx) === null || _a === void 0 ? void 0 : _a.update(elapsed);\n }\n /**\n * Clears all queued actions from the Actor\n */\n clearActions() {\n var _a;\n (_a = this._ctx) === null || _a === void 0 ? void 0 : _a.clearActions();\n }\n /**\n * Animates an actor with a specified bezier curve by an offset to the current position, the start point is assumed\n * to be the actors current position\n * @param options\n */\n curveBy(options) {\n return this._getCtx().curveBy.apply(this._ctx, [options]);\n }\n /**\n * Animates an actor with a specified bezier curve to an absolute world space coordinate, the start point is assumed\n * to be the actors current position\n * @param options\n */\n curveTo(options) {\n return this._getCtx().curveTo.apply(this._ctx, [options]);\n }\n easeTo(...args) {\n return this._getCtx().easeTo.apply(this._ctx, args);\n }\n easeBy(...args) {\n return this._getCtx().easeBy.apply(this._ctx, args);\n }\n moveTo(xOrPosOrOptions, yOrSpeed, speedOrUndefined) {\n return this._getCtx().moveTo.apply(this._ctx, [xOrPosOrOptions, yOrSpeed, speedOrUndefined]);\n }\n moveBy(xOffsetOrVectorOptions, yOffsetOrSpeed, speedOrUndefined) {\n return this._getCtx().moveBy.apply(this._ctx, [xOffsetOrVectorOptions, yOffsetOrSpeed, speedOrUndefined]);\n }\n rotateTo(angle, speed, rotationType) {\n return this._getCtx().rotateTo.apply(this._ctx, [angle, speed, rotationType]);\n }\n rotateBy(angleRadiansOffsetOrOptions, speed, rotationType) {\n return this._getCtx().rotateBy.apply(this._ctx, [angleRadiansOffsetOrOptions, speed, rotationType]);\n }\n scaleTo(sizeXOrVectorOrOptions, sizeYOrSpeed, speedXOrUndefined, speedYOrUndefined) {\n return this._getCtx().scaleTo.apply(this._ctx, [sizeXOrVectorOrOptions, sizeYOrSpeed, speedXOrUndefined, speedYOrUndefined]);\n }\n scaleBy(sizeOffsetXOrVectorOrOptions, sizeOffsetYOrSpeed, speed) {\n return this._getCtx().scaleBy.apply(this._ctx, [sizeOffsetXOrVectorOrOptions, sizeOffsetYOrSpeed, speed]);\n }\n /**\n * This method will cause an actor to blink (become visible and not\n * visible). Optionally, you may specify the number of blinks. Specify the amount of time\n * the actor should be visible per blink, and the amount of time not visible.\n * This method is part of the actor 'Action' fluent API allowing action chaining.\n * @param timeVisible The amount of time to stay visible per blink in milliseconds\n * @param timeNotVisible The amount of time to stay not visible per blink in milliseconds\n * @param numBlinks The number of times to blink\n */\n blink(timeVisible, timeNotVisible, numBlinks) {\n return this._getCtx().blink(timeVisible, timeNotVisible, numBlinks);\n }\n /**\n * This method will cause an actor's opacity to change from its current value\n * to the provided value by a specified time (in milliseconds). This method is\n * part of the actor 'Action' fluent API allowing action chaining.\n * @param opacity The ending opacity\n * @param duration The time it should take to fade the actor (in milliseconds)\n */\n fade(opacity, duration) {\n return this._getCtx().fade(opacity, duration);\n }\n /**\n * This will cause an actor to flash a specific color for a period of time\n * @param color\n * @param duration The duration in milliseconds\n */\n flash(color, duration = 1000) {\n return this._getCtx().flash(color, duration);\n }\n /**\n * This method will delay the next action from executing for a certain\n * amount of time (in milliseconds). This method is part of the actor\n * 'Action' fluent API allowing action chaining.\n * @param duration The amount of time to delay the next action in the queue from executing in milliseconds\n */\n delay(duration) {\n return this._getCtx().delay(duration);\n }\n /**\n * This method will add an action to the queue that will remove the actor from the\n * scene once it has completed its previous Any actions on the\n * action queue after this action will not be executed.\n */\n die() {\n return this._getCtx().die();\n }\n /**\n * This method allows you to call an arbitrary method as the next action in the\n * action queue. This is useful if you want to execute code in after a specific\n * action, i.e An actor arrives at a destination after traversing a path\n */\n callMethod(method) {\n return this._getCtx().callMethod(method);\n }\n /**\n * This method will cause the actor to repeat all of the actions built in\n * the `repeatBuilder` callback. If the number of repeats\n * is not specified it will repeat forever. This method is part of\n * the actor 'Action' fluent API allowing action chaining\n *\n * ```typescript\n * // Move up in a zig-zag by repeated moveBy's\n * actor.actions.repeat(repeatCtx => {\n * repeatCtx.moveBy(10, 0, 10);\n * repeatCtx.moveBy(0, 10, 10);\n * }, 5);\n * ```\n * @param repeatBuilder The builder to specify the repeatable list of actions\n * @param times The number of times to repeat all the previous actions in the action queue. If nothing is specified the actions\n * will repeat forever\n */\n repeat(repeatBuilder, times) {\n return this._getCtx().repeat(repeatBuilder, times);\n }\n /**\n * This method will cause the actor to repeat all of the actions built in\n * the `repeatBuilder` callback. If the number of repeats\n * is not specified it will repeat forever. This method is part of\n * the actor 'Action' fluent API allowing action chaining\n *\n * ```typescript\n * // Move up in a zig-zag by repeated moveBy's\n * actor.actions.repeat(repeatCtx => {\n * repeatCtx.moveBy(10, 0, 10);\n * repeatCtx.moveBy(0, 10, 10);\n * }, 5);\n * ```\n * @param repeatBuilder The builder to specify the repeatable list of actions\n */\n repeatForever(repeatBuilder) {\n return this._getCtx().repeatForever(repeatBuilder);\n }\n /**\n * This method will cause the entity to follow another at a specified distance\n * @param entity The entity to follow\n * @param followDistance The distance to maintain when following, if not specified the actor will follow at the current distance.\n */\n follow(entity, followDistance) {\n return this._getCtx().follow(entity, followDistance);\n }\n /**\n * This method will cause the entity to move towards another until they\n * collide \"meet\" at a specified speed.\n * @param entity The entity to meet\n * @param speed The speed in pixels per second to move, if not specified it will match the speed of the other actor\n */\n meet(entity, speed) {\n return this._getCtx().meet(entity, speed);\n }\n /**\n * Returns a promise that resolves when the current action queue up to now\n * is finished.\n */\n toPromise() {\n return this._getCtx().toPromise();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Actions/ActionsSystem.ts\":\n/*!**********************************!*\\\n !*** ./Actions/ActionsSystem.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ActionsSystem: () => (/* binding */ ActionsSystem)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Priority.ts\");\n/* harmony import */ var _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _ActionsComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ActionsComponent */ \"./Actions/ActionsComponent.ts\");\n\n\n\nclass ActionsSystem extends _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.System {\n constructor(world) {\n super();\n this.world = world;\n this.systemType = _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.SystemType.Update;\n this._actions = [];\n this.query = this.world.query([_ActionsComponent__WEBPACK_IMPORTED_MODULE_1__.ActionsComponent]);\n this.query.entityAdded$.subscribe((e) => this._actions.push(e.get(_ActionsComponent__WEBPACK_IMPORTED_MODULE_1__.ActionsComponent)));\n this.query.entityRemoved$.subscribe((e) => {\n const action = e.get(_ActionsComponent__WEBPACK_IMPORTED_MODULE_1__.ActionsComponent);\n const index = this._actions.indexOf(action);\n if (index > -1) {\n this._actions.splice(index, 1);\n }\n });\n }\n update(elapsed) {\n for (let i = 0; i < this._actions.length; i++) {\n const action = this._actions[i];\n action.update(elapsed);\n }\n }\n}\nActionsSystem.priority = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_2__.SystemPriority.Higher;\n\n\n/***/ }),\n\n/***/ \"./Actions/index.ts\":\n/*!**************************!*\\\n !*** ./Actions/index.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ActionContext: () => (/* reexport safe */ _ActionContext__WEBPACK_IMPORTED_MODULE_0__.ActionContext),\n/* harmony export */ ActionQueue: () => (/* reexport safe */ _ActionQueue__WEBPACK_IMPORTED_MODULE_1__.ActionQueue),\n/* harmony export */ ActionSequence: () => (/* reexport safe */ _Action_ActionSequence__WEBPACK_IMPORTED_MODULE_3__.ActionSequence),\n/* harmony export */ ActionsComponent: () => (/* reexport safe */ _ActionsComponent__WEBPACK_IMPORTED_MODULE_24__.ActionsComponent),\n/* harmony export */ ActionsSystem: () => (/* reexport safe */ _ActionsSystem__WEBPACK_IMPORTED_MODULE_25__.ActionsSystem),\n/* harmony export */ Blink: () => (/* reexport safe */ _Action_Blink__WEBPACK_IMPORTED_MODULE_7__.Blink),\n/* harmony export */ CurveBy: () => (/* reexport safe */ _Action_CurveBy__WEBPACK_IMPORTED_MODULE_23__.CurveBy),\n/* harmony export */ CurveTo: () => (/* reexport safe */ _Action_CurveTo__WEBPACK_IMPORTED_MODULE_22__.CurveTo),\n/* harmony export */ Delay: () => (/* reexport safe */ _Action_Delay__WEBPACK_IMPORTED_MODULE_20__.Delay),\n/* harmony export */ Die: () => (/* reexport safe */ _Action_Die__WEBPACK_IMPORTED_MODULE_8__.Die),\n/* harmony export */ EaseBy: () => (/* reexport safe */ _Action_EaseBy__WEBPACK_IMPORTED_MODULE_10__.EaseBy),\n/* harmony export */ EaseTo: () => (/* reexport safe */ _Action_EaseTo__WEBPACK_IMPORTED_MODULE_9__.EaseTo),\n/* harmony export */ Fade: () => (/* reexport safe */ _Action_Fade__WEBPACK_IMPORTED_MODULE_11__.Fade),\n/* harmony export */ Flash: () => (/* reexport safe */ _Action_Flash__WEBPACK_IMPORTED_MODULE_21__.Flash),\n/* harmony export */ Follow: () => (/* reexport safe */ _Action_Follow__WEBPACK_IMPORTED_MODULE_12__.Follow),\n/* harmony export */ Meet: () => (/* reexport safe */ _Action_Meet__WEBPACK_IMPORTED_MODULE_13__.Meet),\n/* harmony export */ MoveBy: () => (/* reexport safe */ _Action_MoveBy__WEBPACK_IMPORTED_MODULE_14__.MoveBy),\n/* harmony export */ MoveByWithOptions: () => (/* reexport safe */ _Action_MoveBy__WEBPACK_IMPORTED_MODULE_14__.MoveByWithOptions),\n/* harmony export */ MoveTo: () => (/* reexport safe */ _Action_MoveTo__WEBPACK_IMPORTED_MODULE_15__.MoveTo),\n/* harmony export */ MoveToWithOptions: () => (/* reexport safe */ _Action_MoveTo__WEBPACK_IMPORTED_MODULE_15__.MoveToWithOptions),\n/* harmony export */ ParallelActions: () => (/* reexport safe */ _Action_ParallelActions__WEBPACK_IMPORTED_MODULE_4__.ParallelActions),\n/* harmony export */ Repeat: () => (/* reexport safe */ _Action_Repeat__WEBPACK_IMPORTED_MODULE_5__.Repeat),\n/* harmony export */ RepeatForever: () => (/* reexport safe */ _Action_RepeatForever__WEBPACK_IMPORTED_MODULE_6__.RepeatForever),\n/* harmony export */ RotateBy: () => (/* reexport safe */ _Action_RotateBy__WEBPACK_IMPORTED_MODULE_16__.RotateBy),\n/* harmony export */ RotateByWithOptions: () => (/* reexport safe */ _Action_RotateBy__WEBPACK_IMPORTED_MODULE_16__.RotateByWithOptions),\n/* harmony export */ RotateTo: () => (/* reexport safe */ _Action_RotateTo__WEBPACK_IMPORTED_MODULE_17__.RotateTo),\n/* harmony export */ RotateToWithOptions: () => (/* reexport safe */ _Action_RotateTo__WEBPACK_IMPORTED_MODULE_17__.RotateToWithOptions),\n/* harmony export */ ScaleBy: () => (/* reexport safe */ _Action_ScaleBy__WEBPACK_IMPORTED_MODULE_18__.ScaleBy),\n/* harmony export */ ScaleByWithOptions: () => (/* reexport safe */ _Action_ScaleBy__WEBPACK_IMPORTED_MODULE_18__.ScaleByWithOptions),\n/* harmony export */ ScaleTo: () => (/* reexport safe */ _Action_ScaleTo__WEBPACK_IMPORTED_MODULE_19__.ScaleTo),\n/* harmony export */ ScaleToWithOptions: () => (/* reexport safe */ _Action_ScaleTo__WEBPACK_IMPORTED_MODULE_19__.ScaleToWithOptions),\n/* harmony export */ isMoveByOptions: () => (/* reexport safe */ _Action_MoveBy__WEBPACK_IMPORTED_MODULE_14__.isMoveByOptions),\n/* harmony export */ isMoveToOptions: () => (/* reexport safe */ _Action_MoveTo__WEBPACK_IMPORTED_MODULE_15__.isMoveToOptions),\n/* harmony export */ isRotateByOptions: () => (/* reexport safe */ _Action_RotateBy__WEBPACK_IMPORTED_MODULE_16__.isRotateByOptions),\n/* harmony export */ isRotateToOptions: () => (/* reexport safe */ _Action_RotateTo__WEBPACK_IMPORTED_MODULE_17__.isRotateToOptions),\n/* harmony export */ isScaleByOptions: () => (/* reexport safe */ _Action_ScaleBy__WEBPACK_IMPORTED_MODULE_18__.isScaleByOptions),\n/* harmony export */ isScaleToOptions: () => (/* reexport safe */ _Action_ScaleTo__WEBPACK_IMPORTED_MODULE_19__.isScaleToOptions),\n/* harmony export */ nextActionId: () => (/* reexport safe */ _Action__WEBPACK_IMPORTED_MODULE_2__.nextActionId)\n/* harmony export */ });\n/* harmony import */ var _ActionContext__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ActionContext */ \"./Actions/ActionContext.ts\");\n/* harmony import */ var _ActionQueue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ActionQueue */ \"./Actions/ActionQueue.ts\");\n/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Action */ \"./Actions/Action.ts\");\n/* harmony import */ var _Action_ActionSequence__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Action/ActionSequence */ \"./Actions/Action/ActionSequence.ts\");\n/* harmony import */ var _Action_ParallelActions__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Action/ParallelActions */ \"./Actions/Action/ParallelActions.ts\");\n/* harmony import */ var _Action_Repeat__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Action/Repeat */ \"./Actions/Action/Repeat.ts\");\n/* harmony import */ var _Action_RepeatForever__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Action/RepeatForever */ \"./Actions/Action/RepeatForever.ts\");\n/* harmony import */ var _Action_Blink__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Action/Blink */ \"./Actions/Action/Blink.ts\");\n/* harmony import */ var _Action_Die__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Action/Die */ \"./Actions/Action/Die.ts\");\n/* harmony import */ var _Action_EaseTo__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Action/EaseTo */ \"./Actions/Action/EaseTo.ts\");\n/* harmony import */ var _Action_EaseBy__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Action/EaseBy */ \"./Actions/Action/EaseBy.ts\");\n/* harmony import */ var _Action_Fade__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Action/Fade */ \"./Actions/Action/Fade.ts\");\n/* harmony import */ var _Action_Follow__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Action/Follow */ \"./Actions/Action/Follow.ts\");\n/* harmony import */ var _Action_Meet__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Action/Meet */ \"./Actions/Action/Meet.ts\");\n/* harmony import */ var _Action_MoveBy__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Action/MoveBy */ \"./Actions/Action/MoveBy.ts\");\n/* harmony import */ var _Action_MoveTo__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Action/MoveTo */ \"./Actions/Action/MoveTo.ts\");\n/* harmony import */ var _Action_RotateBy__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Action/RotateBy */ \"./Actions/Action/RotateBy.ts\");\n/* harmony import */ var _Action_RotateTo__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./Action/RotateTo */ \"./Actions/Action/RotateTo.ts\");\n/* harmony import */ var _Action_ScaleBy__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Action/ScaleBy */ \"./Actions/Action/ScaleBy.ts\");\n/* harmony import */ var _Action_ScaleTo__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./Action/ScaleTo */ \"./Actions/Action/ScaleTo.ts\");\n/* harmony import */ var _Action_Delay__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./Action/Delay */ \"./Actions/Action/Delay.ts\");\n/* harmony import */ var _Action_Flash__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./Action/Flash */ \"./Actions/Action/Flash.ts\");\n/* harmony import */ var _Action_CurveTo__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./Action/CurveTo */ \"./Actions/Action/CurveTo.ts\");\n/* harmony import */ var _Action_CurveBy__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./Action/CurveBy */ \"./Actions/Action/CurveBy.ts\");\n/* harmony import */ var _ActionsComponent__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./ActionsComponent */ \"./Actions/ActionsComponent.ts\");\n/* harmony import */ var _ActionsSystem__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./ActionsSystem */ \"./Actions/ActionsSystem.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Actor.ts\":\n/*!******************!*\\\n !*** ./Actor.ts ***!\n \\******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Actor: () => (/* binding */ Actor),\n/* harmony export */ ActorEvents: () => (/* binding */ ActorEvents),\n/* harmony export */ isActor: () => (/* binding */ isActor)\n/* harmony export */ });\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./Events */ \"./Events.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Collision/BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Collision/CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./EntityComponentSystem/Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Graphics/GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Graphics_Rectangle__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Graphics/Rectangle */ \"./Graphics/Rectangle.ts\");\n/* harmony import */ var _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Collision/ColliderComponent */ \"./Collision/ColliderComponent.ts\");\n/* harmony import */ var _Collision_Colliders_Shape__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Collision/Colliders/Shape */ \"./Collision/Colliders/Shape.ts\");\n/* harmony import */ var _Util_Watch__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Util/Watch */ \"./Util/Watch.ts\");\n/* harmony import */ var _Graphics_Circle__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Graphics/Circle */ \"./Graphics/Circle.ts\");\n/* harmony import */ var _Input_PointerComponent__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Input/PointerComponent */ \"./Input/PointerComponent.ts\");\n/* harmony import */ var _Actions_ActionsComponent__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Actions/ActionsComponent */ \"./Actions/ActionsComponent.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Math/coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Type guard for checking if something is an Actor\n * @param x\n */\nfunction isActor(x) {\n return x instanceof Actor;\n}\nconst ActorEvents = {\n CollisionStart: 'collisionstart',\n CollisionEnd: 'collisionend',\n PreCollision: 'precollision',\n PostCollision: 'postcollision',\n Kill: 'kill',\n PreKill: 'prekill',\n PostKill: 'postkill',\n PreDraw: 'predraw',\n PostDraw: 'postdraw',\n PreTransformDraw: 'pretransformdraw',\n PostTransformDraw: 'posttransformdraw',\n PreDebugDraw: 'predebugdraw',\n PostDebugDraw: 'postdebugdraw',\n PointerUp: 'pointerup',\n PointerDown: 'pointerdown',\n PointerEnter: 'pointerenter',\n PointerLeave: 'pointerleave',\n PointerMove: 'pointermove',\n PointerCancel: 'pointercancel',\n Wheel: 'pointerwheel',\n PointerDrag: 'pointerdragstart',\n PointerDragEnd: 'pointerdragend',\n PointerDragEnter: 'pointerdragenter',\n PointerDragLeave: 'pointerdragleave',\n PointerDragMove: 'pointerdragmove',\n EnterViewPort: 'enterviewport',\n ExitViewPort: 'exitviewport',\n ActionStart: 'actionstart',\n ActionComplete: 'actioncomplete'\n};\n/**\n * The most important primitive in Excalibur is an `Actor`. Anything that\n * can move on the screen, collide with another `Actor`, respond to events,\n * or interact with the current scene, must be an actor. An `Actor` **must**\n * be part of a {@apilink Scene} for it to be drawn to the screen.\n */\nclass Actor extends _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__.Entity {\n /**\n * Gets the position vector of the actor in pixels\n */\n get pos() {\n return this.transform.pos;\n }\n /**\n * Sets the position vector of the actor in pixels\n */\n set pos(thePos) {\n this.transform.pos = thePos.clone();\n }\n /**\n * Gets the position vector of the actor from the last frame\n */\n get oldPos() {\n return this.body.oldPos;\n }\n /**\n * Gets the global position vector of the actor from the last frame\n */\n get oldGlobalPos() {\n return this.body.oldGlobalPos;\n }\n /**\n * Sets the position vector of the actor in the last frame\n */\n set oldPos(thePos) {\n this.body.oldPos.setTo(thePos.x, thePos.y);\n }\n /**\n * Gets the velocity vector of the actor in pixels/sec\n */\n get vel() {\n return this.motion.vel;\n }\n /**\n * Sets the velocity vector of the actor in pixels/sec\n */\n set vel(theVel) {\n this.motion.vel = theVel.clone();\n }\n /**\n * Gets the velocity vector of the actor from the last frame\n */\n get oldVel() {\n return this.body.oldVel;\n }\n /**\n * Sets the velocity vector of the actor from the last frame\n */\n set oldVel(theVel) {\n this.body.oldVel.setTo(theVel.x, theVel.y);\n }\n /**\n * Gets the acceleration vector of the actor in pixels/second/second. An acceleration pointing down such as (0, 100) may be\n * useful to simulate a gravitational effect.\n */\n get acc() {\n return this.motion.acc;\n }\n /**\n * Sets the acceleration vector of teh actor in pixels/second/second\n */\n set acc(theAcc) {\n this.motion.acc = theAcc.clone();\n }\n /**\n * Sets the acceleration of the actor from the last frame. This does not include the global acc {@apilink Physics.acc}.\n */\n set oldAcc(theAcc) {\n this.body.oldAcc.setTo(theAcc.x, theAcc.y);\n }\n /**\n * Gets the acceleration of the actor from the last frame. This does not include the global acc {@apilink Physics.acc}.\n */\n get oldAcc() {\n return this.body.oldAcc;\n }\n /**\n * Gets the rotation of the actor in radians. 1 radian = 180/PI Degrees.\n */\n get rotation() {\n return this.transform.rotation;\n }\n /**\n * Sets the rotation of the actor in radians. 1 radian = 180/PI Degrees.\n */\n set rotation(theAngle) {\n this.transform.rotation = theAngle;\n }\n /**\n * Gets the rotational velocity of the actor in radians/second\n */\n get angularVelocity() {\n return this.motion.angularVelocity;\n }\n /**\n * Sets the rotational velocity of the actor in radians/sec\n */\n set angularVelocity(angularVelocity) {\n this.motion.angularVelocity = angularVelocity;\n }\n get scale() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).scale;\n }\n set scale(scale) {\n this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).scale = scale;\n }\n /**\n * The anchor to apply all actor related transformations like rotation,\n * translation, and scaling. By default the anchor is in the center of\n * the actor. By default it is set to the center of the actor (.5, .5)\n *\n * An anchor of (.5, .5) will ensure that drawings are centered.\n *\n * Use `anchor.setTo` to set the anchor to a different point using\n * values between 0 and 1. For example, anchoring to the top-left would be\n * `Actor.anchor.setTo(0, 0)` and top-right would be `Actor.anchor.setTo(0, 1)`.\n */\n get anchor() {\n return this._anchor;\n }\n set anchor(vec) {\n this._anchor = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_2__.watch)(vec, (v) => this._handleAnchorChange(v));\n this._handleAnchorChange(vec);\n }\n _handleAnchorChange(v) {\n if (this.graphics) {\n this.graphics.anchor = v;\n }\n }\n /**\n * The offset in pixels to apply to all actor graphics\n *\n * Default offset of (0, 0)\n */\n get offset() {\n return this._offset;\n }\n set offset(vec) {\n this._offset = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_2__.watch)(vec, (v) => this._handleOffsetChange(v));\n this._handleOffsetChange(vec);\n }\n _handleOffsetChange(v) {\n if (this.graphics) {\n this.graphics.offset = v;\n }\n }\n /**\n * Indicates whether the actor is physically in the viewport\n */\n get isOffScreen() {\n return this.hasTag('ex.offscreen');\n }\n get draggable() {\n return this._draggable;\n }\n set draggable(isDraggable) {\n if (isDraggable) {\n if (isDraggable && !this._draggable) {\n this.events.on('pointerdragstart', this._pointerDragStartHandler);\n this.events.on('pointerdragend', this._pointerDragEndHandler);\n this.events.on('pointerdragmove', this._pointerDragMoveHandler);\n this.events.on('pointerdragleave', this._pointerDragLeaveHandler);\n }\n else if (!isDraggable && this._draggable) {\n this.events.off('pointerdragstart', this._pointerDragStartHandler);\n this.events.off('pointerdragend', this._pointerDragEndHandler);\n this.events.off('pointerdragmove', this._pointerDragMoveHandler);\n this.events.off('pointerdragleave', this._pointerDragLeaveHandler);\n }\n this._draggable = isDraggable;\n }\n }\n /**\n * Sets the color of the actor's current graphic\n */\n get color() {\n return this.graphics.color;\n }\n set color(v) {\n this.graphics.color = v;\n }\n // #endregion\n /**\n *\n * @param config\n */\n constructor(config) {\n super();\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_3__.EventEmitter();\n this._anchor = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_2__.watch)(_Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Half, (v) => this._handleAnchorChange(v));\n this._offset = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_2__.watch)(_Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero, (v) => this._handleOffsetChange(v));\n /**\n * Convenience reference to the global logger\n */\n this.logger = _Util_Log__WEBPACK_IMPORTED_MODULE_5__.Logger.getInstance();\n /**\n * Draggable helper\n */\n this._draggable = false;\n this._dragging = false;\n this._pointerDragStartHandler = () => {\n this._dragging = true;\n };\n this._pointerDragEndHandler = () => {\n this._dragging = false;\n };\n this._pointerDragMoveHandler = (pe) => {\n if (this._dragging) {\n this.pos = pe.worldPos;\n }\n };\n this._pointerDragLeaveHandler = (pe) => {\n if (this._dragging) {\n this.pos = pe.worldPos;\n }\n };\n const { name, x, y, pos, coordPlane, scale, width, height, radius, collider, vel, acc, rotation, angularVelocity, z, color, visible, opacity, anchor, offset, collisionType, collisionGroup, silenceWarnings } = {\n ...config\n };\n this.name = name !== null && name !== void 0 ? name : this.name;\n this.anchor = anchor !== null && anchor !== void 0 ? anchor : Actor.defaults.anchor.clone();\n this.offset = offset !== null && offset !== void 0 ? offset : _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero;\n this.transform = new _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent();\n this.addComponent(this.transform);\n this.pos = pos !== null && pos !== void 0 ? pos : (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(x !== null && x !== void 0 ? x : 0, y !== null && y !== void 0 ? y : 0);\n this.rotation = rotation !== null && rotation !== void 0 ? rotation : 0;\n this.scale = scale !== null && scale !== void 0 ? scale : (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(1, 1);\n this.z = z !== null && z !== void 0 ? z : 0;\n this.transform.coordPlane = coordPlane !== null && coordPlane !== void 0 ? coordPlane : _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__.CoordPlane.World;\n this._silenceWarnings = silenceWarnings !== null && silenceWarnings !== void 0 ? silenceWarnings : false;\n this.pointer = new _Input_PointerComponent__WEBPACK_IMPORTED_MODULE_7__.PointerComponent();\n this.addComponent(this.pointer);\n this.graphics = new _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_8__.GraphicsComponent({\n anchor: this.anchor,\n offset: this.offset,\n opacity: opacity\n });\n this.addComponent(this.graphics);\n this.motion = new _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_9__.MotionComponent();\n this.addComponent(this.motion);\n this.vel = vel !== null && vel !== void 0 ? vel : _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero;\n this.acc = acc !== null && acc !== void 0 ? acc : _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero;\n this.angularVelocity = angularVelocity !== null && angularVelocity !== void 0 ? angularVelocity : 0;\n this.actions = new _Actions_ActionsComponent__WEBPACK_IMPORTED_MODULE_10__.ActionsComponent();\n this.addComponent(this.actions);\n this.body = new _Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_11__.BodyComponent();\n this.addComponent(this.body);\n this.body.collisionType = collisionType !== null && collisionType !== void 0 ? collisionType : _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_12__.CollisionType.Passive;\n if (collisionGroup) {\n this.body.group = collisionGroup;\n }\n if (color) {\n this.color = color;\n }\n if (collider) {\n this.collider = new _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_13__.ColliderComponent(collider);\n this.addComponent(this.collider);\n }\n else if (radius) {\n this.collider = new _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_13__.ColliderComponent(_Collision_Colliders_Shape__WEBPACK_IMPORTED_MODULE_14__.Shape.Circle(radius));\n this.addComponent(this.collider);\n if (color) {\n this.graphics.add(new _Graphics_Circle__WEBPACK_IMPORTED_MODULE_15__.Circle({\n color: color,\n radius\n }));\n }\n }\n else {\n if (width > 0 && height > 0) {\n this.collider = new _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_13__.ColliderComponent(_Collision_Colliders_Shape__WEBPACK_IMPORTED_MODULE_14__.Shape.Box(width, height, this.anchor));\n this.addComponent(this.collider);\n if (color && width && height) {\n this.graphics.add(new _Graphics_Rectangle__WEBPACK_IMPORTED_MODULE_16__.Rectangle({\n color: color,\n width,\n height\n }));\n }\n }\n else {\n this.collider = new _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_13__.ColliderComponent();\n this.addComponent(this.collider); // no collider\n }\n }\n this.graphics.isVisible = visible !== null && visible !== void 0 ? visible : true;\n }\n clone() {\n const clone = new Actor({\n silenceWarnings: this._silenceWarnings,\n color: this.color.clone(),\n anchor: this.anchor.clone(),\n offset: this.offset.clone()\n });\n clone.clearComponents();\n clone.processComponentRemoval();\n // Clone builtins, order is important, same as ctor\n clone.addComponent((clone.transform = this.transform.clone()), true);\n clone.addComponent((clone.pointer = this.pointer.clone()), true);\n clone.addComponent((clone.graphics = this.graphics.clone()), true);\n clone.addComponent((clone.motion = this.motion.clone()), true);\n clone.addComponent((clone.actions = this.actions.clone()), true);\n clone.addComponent((clone.body = this.body.clone()), true);\n clone.addComponent((clone.collider = this.collider.clone()), true);\n const builtInComponents = [\n this.transform,\n this.pointer,\n this.graphics,\n this.motion,\n this.actions,\n this.body,\n this.collider\n ];\n // Clone non-builtin the current actors components\n const components = this.getComponents();\n for (const c of components) {\n if (!builtInComponents.includes(c)) {\n clone.addComponent(c.clone(), true);\n }\n }\n return clone;\n }\n /**\n * `onInitialize` is called before the first update of the actor. This method is meant to be\n * overridden. This is where initialization of child actors should take place.\n *\n * Synonymous with the event handler `.on('initialize', (evt) => {...})`\n */\n onInitialize(engine) {\n // Override me\n }\n /**\n * Initializes this actor and all it's child actors, meant to be called by the Scene before first update not by users of Excalibur.\n *\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n * @internal\n */\n _initialize(engine) {\n super._initialize(engine);\n for (const child of this.children) {\n child._initialize(engine);\n }\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n // #endregion\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _prekill handler for {@apilink onPreKill} lifecycle event\n * @internal\n */\n _prekill(scene) {\n this.events.emit('prekill', new _Events__WEBPACK_IMPORTED_MODULE_17__.PreKillEvent(this));\n this.onPreKill(scene);\n }\n /**\n * Safe to override onPreKill lifecycle event handler. Synonymous with `.on('prekill', (evt) =>{...})`\n *\n * `onPreKill` is called directly before an actor is killed and removed from its current {@apilink Scene}.\n */\n onPreKill(scene) {\n // Override me\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _prekill handler for {@apilink onPostKill} lifecycle event\n * @internal\n */\n _postkill(scene) {\n this.events.emit('postkill', new _Events__WEBPACK_IMPORTED_MODULE_17__.PostKillEvent(this));\n this.onPostKill(scene);\n }\n /**\n * Safe to override onPostKill lifecycle event handler. Synonymous with `.on('postkill', (evt) => {...})`\n *\n * `onPostKill` is called directly after an actor is killed and remove from its current {@apilink Scene}.\n */\n onPostKill(scene) {\n // Override me\n }\n /**\n * If the current actor is a member of the scene, this will remove\n * it from the scene graph. It will no longer be drawn or updated.\n */\n kill() {\n if (this.scene) {\n this._prekill(this.scene);\n this.events.emit('kill', new _Events__WEBPACK_IMPORTED_MODULE_17__.KillEvent(this));\n super.kill();\n this._postkill(this.scene);\n }\n else {\n this.logger.warn(`Cannot kill actor named \"${this.name}\", it was never added to the Scene`);\n }\n }\n /**\n * If the current actor is killed, it will now not be killed.\n */\n unkill() {\n this.isActive = true;\n }\n /**\n * Indicates wether the actor has been killed.\n */\n isKilled() {\n return !this.isActive;\n }\n /**\n * Gets the z-index of an actor. The z-index determines the relative order an actor is drawn in.\n * Actors with a higher z-index are drawn on top of actors with a lower z-index\n */\n get z() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).z;\n }\n /**\n * Sets the z-index of an actor and updates it in the drawing list for the scene.\n * The z-index determines the relative order an actor is drawn in.\n * Actors with a higher z-index are drawn on top of actors with a lower z-index\n * @param newZ new z-index to assign\n */\n set z(newZ) {\n this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).z = newZ;\n }\n /**\n * Get the center point of an actor (global position)\n */\n get center() {\n const globalPos = this.getGlobalPos();\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector(globalPos.x + this.width / 2 - this.anchor.x * this.width, globalPos.y + this.height / 2 - this.anchor.y * this.height);\n }\n /**\n * Get the local center point of an actor\n */\n get localCenter() {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector(this.pos.x + this.width / 2 - this.anchor.x * this.width, this.pos.y + this.height / 2 - this.anchor.y * this.height);\n }\n get width() {\n return this.collider.localBounds.width * this.getGlobalScale().x;\n }\n get height() {\n return this.collider.localBounds.height * this.getGlobalScale().y;\n }\n /**\n * Gets this actor's rotation taking into account any parent relationships\n * @returns Rotation angle in radians\n * @deprecated Use {@apilink globalRotation} instead\n */\n getGlobalRotation() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).globalRotation;\n }\n /**\n * The actor's rotation (in radians) taking into account any parent relationships\n */\n get globalRotation() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).globalRotation;\n }\n /**\n * Gets an actor's world position taking into account parent relationships, scaling, rotation, and translation\n * @returns Position in world coordinates\n * @deprecated Use {@apilink globalPos} instead\n */\n getGlobalPos() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).globalPos;\n }\n /**\n * The actor's world position taking into account parent relationships, scaling, rotation, and translation\n */\n get globalPos() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).globalPos;\n }\n /**\n * Gets the global scale of the Actor\n * @deprecated Use {@apilink globalScale} instead\n */\n getGlobalScale() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).globalScale;\n }\n /**\n * The global scale of the Actor\n */\n get globalScale() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).globalScale;\n }\n /**\n * The global z-index of the actor\n */\n get globalZ() {\n return this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).globalZ;\n }\n // #region Collision\n /**\n * Tests whether the x/y specified are contained in the actor\n * @param x X coordinate to test (in world coordinates)\n * @param y Y coordinate to test (in world coordinates)\n * @param recurse checks whether the x/y are contained in any child actors (if they exist).\n */\n contains(x, y, recurse = false) {\n const point = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(x, y);\n const collider = this.get(_Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_13__.ColliderComponent);\n collider.update();\n const geom = collider.get();\n if (!geom) {\n return false;\n }\n const containment = geom.contains(point);\n if (recurse) {\n return (containment ||\n this.children.some((child) => {\n return child.contains(x, y, true);\n }));\n }\n return containment;\n }\n /**\n * Returns true if the two actor.collider's surfaces are less than or equal to the distance specified from each other\n * @param actor Actor to test\n * @param distance Distance in pixels to test\n */\n within(actor, distance) {\n const collider = this.get(_Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_13__.ColliderComponent);\n const otherCollider = actor.get(_Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_13__.ColliderComponent);\n const me = collider.get();\n const other = otherCollider.get();\n if (me && other) {\n return me.getClosestLineBetween(other).getLength() <= distance;\n }\n return false;\n }\n // #endregion\n // #region Update\n /**\n * Called by the Engine, updates the state of the actor\n * @internal\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n */\n update(engine, elapsed) {\n this._initialize(engine);\n this._add(engine);\n this._preupdate(engine, elapsed);\n this._postupdate(engine, elapsed);\n this._remove(engine);\n }\n /**\n * Safe to override onPreUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPreUpdate` is called directly before an actor is updated.\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n */\n onPreUpdate(engine, elapsed) {\n // Override me\n }\n /**\n * Safe to override onPostUpdate lifecycle event handler. Synonymous with `.on('postupdate', (evt) =>{...})`\n *\n * `onPostUpdate` is called directly after an actor is updated.\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n */\n onPostUpdate(engine, elapsed) {\n // Override me\n }\n /**\n * Fires before every collision resolution for a confirmed contact\n * @param self\n * @param other\n * @param side\n * @param contact\n */\n onPreCollisionResolve(self, other, side, contact) {\n // Override me\n }\n /**\n * Fires after every resolution for a confirmed contact.\n * @param self\n * @param other\n * @param side\n * @param contact\n */\n onPostCollisionResolve(self, other, side, contact) {\n // Override me\n }\n /**\n * Fires once when 2 entities with a ColliderComponent first start colliding or touching, if the Colliders stay in contact this\n * does not continue firing until they separate and re-collide.\n * @param self\n * @param other\n * @param side\n * @param contact\n */\n onCollisionStart(self, other, side, contact) {\n // Override me\n }\n /**\n * Fires once when 2 entities with a ColliderComponent separate after having been in contact.\n * @param self\n * @param other\n * @param side\n * @param lastContact\n */\n onCollisionEnd(self, other, side, lastContact) {\n // Override me\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _preupdate handler for {@apilink onPreUpdate} lifecycle event\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n * @internal\n */\n _preupdate(engine, elapsed) {\n this.events.emit('preupdate', new _Events__WEBPACK_IMPORTED_MODULE_17__.PreUpdateEvent(engine, elapsed, this));\n this.onPreUpdate(engine, elapsed);\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _preupdate handler for {@apilink onPostUpdate} lifecycle event\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n * @internal\n */\n _postupdate(engine, elapsed) {\n this.events.emit('postupdate', new _Events__WEBPACK_IMPORTED_MODULE_17__.PostUpdateEvent(engine, elapsed, this));\n this.onPostUpdate(engine, elapsed);\n }\n}\n// #region Properties\n/**\n * Set defaults for all Actors\n */\nActor.defaults = {\n anchor: _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Half\n};\n\n\n/***/ }),\n\n/***/ \"./Camera.ts\":\n/*!*******************!*\\\n !*** ./Camera.ts ***!\n \\*******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Axis: () => (/* binding */ Axis),\n/* harmony export */ Camera: () => (/* binding */ Camera),\n/* harmony export */ CameraEvents: () => (/* binding */ CameraEvents),\n/* harmony export */ ElasticToActorStrategy: () => (/* binding */ ElasticToActorStrategy),\n/* harmony export */ LimitCameraBoundsStrategy: () => (/* binding */ LimitCameraBoundsStrategy),\n/* harmony export */ LockCameraToActorAxisStrategy: () => (/* binding */ LockCameraToActorAxisStrategy),\n/* harmony export */ LockCameraToActorStrategy: () => (/* binding */ LockCameraToActorStrategy),\n/* harmony export */ RadiusAroundActorStrategy: () => (/* binding */ RadiusAroundActorStrategy),\n/* harmony export */ StrategyContainer: () => (/* binding */ StrategyContainer)\n/* harmony export */ });\n/* harmony import */ var _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Util/EasingFunctions */ \"./Util/EasingFunctions.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Util/Util */ \"./Util/Util.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Events */ \"./Events.ts\");\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Math/affine-matrix */ \"./Math/affine-matrix.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Graphics */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Math_watch_vector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Math/watch-vector */ \"./Math/watch-vector.ts\");\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Container to house convenience strategy methods\n * @internal\n */\nclass StrategyContainer {\n constructor(camera) {\n this.camera = camera;\n }\n /**\n * Creates and adds the {@apilink LockCameraToActorStrategy} on the current camera.\n * @param actor The actor to lock the camera to\n */\n lockToActor(actor) {\n this.camera.addStrategy(new LockCameraToActorStrategy(actor));\n }\n /**\n * Creates and adds the {@apilink LockCameraToActorAxisStrategy} on the current camera\n * @param actor The actor to lock the camera to\n * @param axis The axis to follow the actor on\n */\n lockToActorAxis(actor, axis) {\n this.camera.addStrategy(new LockCameraToActorAxisStrategy(actor, axis));\n }\n /**\n * Creates and adds the {@apilink ElasticToActorStrategy} on the current camera\n * If cameraElasticity < cameraFriction < 1.0, the behavior will be a dampened spring that will slowly end at the target without bouncing\n * If cameraFriction < cameraElasticity < 1.0, the behavior will be an oscillating spring that will over\n * correct and bounce around the target\n * @param actor Target actor to elastically follow\n * @param cameraElasticity [0 - 1.0] The higher the elasticity the more force that will drive the camera towards the target\n * @param cameraFriction [0 - 1.0] The higher the friction the more that the camera will resist motion towards the target\n */\n elasticToActor(actor, cameraElasticity, cameraFriction) {\n this.camera.addStrategy(new ElasticToActorStrategy(actor, cameraElasticity, cameraFriction));\n }\n /**\n * Creates and adds the {@apilink RadiusAroundActorStrategy} on the current camera\n * @param actor Target actor to follow when it is \"radius\" pixels away\n * @param radius Number of pixels away before the camera will follow\n */\n radiusAroundActor(actor, radius) {\n this.camera.addStrategy(new RadiusAroundActorStrategy(actor, radius));\n }\n /**\n * Creates and adds the {@apilink LimitCameraBoundsStrategy} on the current camera\n * @param box The bounding box to limit the camera to.\n */\n limitCameraBounds(box) {\n this.camera.addStrategy(new LimitCameraBoundsStrategy(box));\n }\n}\n/**\n * Camera axis enum\n */\nvar Axis;\n(function (Axis) {\n Axis[Axis[\"X\"] = 0] = \"X\";\n Axis[Axis[\"Y\"] = 1] = \"Y\";\n})(Axis || (Axis = {}));\n/**\n * Lock a camera to the exact x/y position of an actor.\n */\nclass LockCameraToActorStrategy {\n constructor(target) {\n this.target = target;\n this.action = (target, camera, engine, elapsed) => {\n const center = target.center;\n return center;\n };\n }\n}\n/**\n * Lock a camera to a specific axis around an actor.\n */\nclass LockCameraToActorAxisStrategy {\n constructor(target, axis) {\n this.target = target;\n this.axis = axis;\n this.action = (target, cam, _eng, elapsed) => {\n const center = target.center;\n const currentFocus = cam.getFocus();\n if (this.axis === Axis.X) {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(center.x, currentFocus.y);\n }\n else {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(currentFocus.x, center.y);\n }\n };\n }\n}\n/**\n * Using [Hook's law](https://en.wikipedia.org/wiki/Hooke's_law), elastically move the camera towards the target actor.\n */\nclass ElasticToActorStrategy {\n /**\n * If cameraElasticity < cameraFriction < 1.0, the behavior will be a dampened spring that will slowly end at the target without bouncing\n * If cameraFriction < cameraElasticity < 1.0, the behavior will be an oscillating spring that will over\n * correct and bounce around the target\n * @param target Target actor to elastically follow\n * @param cameraElasticity [0 - 1.0] The higher the elasticity the more force that will drive the camera towards the target\n * @param cameraFriction [0 - 1.0] The higher the friction the more that the camera will resist motion towards the target\n */\n constructor(target, cameraElasticity, cameraFriction) {\n this.target = target;\n this.cameraElasticity = cameraElasticity;\n this.cameraFriction = cameraFriction;\n this.action = (target, cam, _eng, elapsed) => {\n const position = target.center;\n let focus = cam.getFocus();\n let cameraVel = cam.vel.clone();\n // Calculate the stretch vector, using the spring equation\n // F = kX\n // https://en.wikipedia.org/wiki/Hooke's_law\n // Apply to the current camera velocity\n const stretch = position.sub(focus).scale(this.cameraElasticity); // stretch is X\n cameraVel = cameraVel.add(stretch);\n // Calculate the friction (-1 to apply a force in the opposition of motion)\n // Apply to the current camera velocity\n const friction = cameraVel.scale(-1).scale(this.cameraFriction);\n cameraVel = cameraVel.add(friction);\n // Update position by velocity deltas\n focus = focus.add(cameraVel);\n return focus;\n };\n }\n}\nclass RadiusAroundActorStrategy {\n /**\n *\n * @param target Target actor to follow when it is \"radius\" pixels away\n * @param radius Number of pixels away before the camera will follow\n */\n constructor(target, radius) {\n this.target = target;\n this.radius = radius;\n this.action = (target, cam, _eng, elapsed) => {\n const position = target.center;\n const focus = cam.getFocus();\n const direction = position.sub(focus);\n const distance = direction.magnitude;\n if (distance >= this.radius) {\n const offset = distance - this.radius;\n return focus.add(direction.normalize().scale(offset));\n }\n return focus;\n };\n }\n}\n/**\n * Prevent a camera from going beyond the given camera dimensions.\n */\nclass LimitCameraBoundsStrategy {\n constructor(target) {\n this.target = target;\n /**\n * Useful for limiting the camera to a {@apilink TileMap}'s dimensions, or a specific area inside the map.\n *\n * Note that this strategy does not perform any movement by itself.\n * It only sets the camera position to within the given bounds when the camera has gone beyond them.\n * Thus, it is a good idea to combine it with other camera strategies and set this strategy as the last one.\n *\n * Make sure that the camera bounds are at least as large as the viewport size.\n * @param target The bounding box to limit the camera to\n */\n this.boundSizeChecked = false; // Check and warn only once\n this.action = (target, cam, _eng, elapsed) => {\n const focus = cam.getFocus();\n if (!this.boundSizeChecked) {\n if (target.bottom - target.top < _eng.drawHeight || target.right - target.left < _eng.drawWidth) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance().warn('Camera bounds should not be smaller than the engine viewport');\n }\n this.boundSizeChecked = true;\n }\n let focusX = focus.x;\n let focusY = focus.y;\n if (focus.x < target.left + _eng.halfDrawWidth) {\n focusX = target.left + _eng.halfDrawWidth;\n }\n else if (focus.x > target.right - _eng.halfDrawWidth) {\n focusX = target.right - _eng.halfDrawWidth;\n }\n if (focus.y < target.top + _eng.halfDrawHeight) {\n focusY = target.top + _eng.halfDrawHeight;\n }\n else if (focus.y > target.bottom - _eng.halfDrawHeight) {\n focusY = target.bottom - _eng.halfDrawHeight;\n }\n return (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(focusX, focusY);\n };\n }\n}\nconst CameraEvents = {\n Initialize: 'initialize',\n PreUpdate: 'preupdate',\n PostUpdate: 'postupdate'\n};\n/**\n * Cameras\n *\n * {@apilink Camera} is the base class for all Excalibur cameras. Cameras are used\n * to move around your game and set focus. They are used to determine\n * what is \"off screen\" and can be used to scale the game.\n *\n */\nclass Camera {\n constructor() {\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_2__.EventEmitter();\n this.transform = _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_3__.AffineMatrix.identity();\n this.inverse = _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_3__.AffineMatrix.identity();\n this._cameraStrategies = [];\n this.strategy = new StrategyContainer(this);\n /**\n * Get or set current zoom of the camera, defaults to 1\n */\n this._z = 1;\n /**\n * Get or set rate of change in zoom, defaults to 0\n */\n this.dz = 0;\n /**\n * Get or set zoom acceleration\n */\n this.az = 0;\n /**\n * Current rotation of the camera\n */\n this.rotation = 0;\n this._angularVelocity = 0;\n this._posChanged = false;\n this._pos = new _Math_watch_vector__WEBPACK_IMPORTED_MODULE_4__.WatchVector(_Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero, () => {\n this._posChanged = true;\n });\n /**\n * Interpolated camera position if more draws are running than updates\n *\n * Enabled when `Engine.fixedUpdateFps` is enabled, in all other cases this will be the same as pos\n */\n this.drawPos = this.pos.clone();\n this._oldPos = this.pos.clone();\n /**\n * Get or set the camera's velocity\n */\n this.vel = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero;\n /**\n * Get or set the camera's acceleration\n */\n this.acc = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero;\n this._cameraMoving = false;\n this._currentLerpTime = 0;\n this._lerpDuration = 1000; // 1 second\n this._lerpStart = null;\n this._lerpEnd = null;\n //camera effects\n this._isShaking = false;\n this._shakeMagnitudeX = 0;\n this._shakeMagnitudeY = 0;\n this._shakeDuration = 0;\n this._elapsedShakeTime = 0;\n this._xShake = 0;\n this._yShake = 0;\n this._isZooming = false;\n this._zoomStart = 1;\n this._zoomEnd = 1;\n this._currentZoomTime = 0;\n this._zoomDuration = 0;\n this._zoomEasing = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_5__.EasingFunctions.EaseInOutCubic;\n this._easing = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_5__.EasingFunctions.EaseInOutCubic;\n this._halfWidth = 0;\n this._halfHeight = 0;\n this._viewport = null;\n this._isInitialized = false;\n this._snapPos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n }\n get zoom() {\n return this._z;\n }\n set zoom(val) {\n this._z = val;\n if (this._engine) {\n this._halfWidth = this._engine.halfDrawWidth;\n this._halfHeight = this._engine.halfDrawHeight;\n }\n }\n /**\n * Get or set the camera's angular velocity\n */\n get angularVelocity() {\n return this._angularVelocity;\n }\n set angularVelocity(value) {\n this._angularVelocity = value;\n }\n /**\n * Get or set the camera's position\n */\n get pos() {\n return this._pos;\n }\n set pos(vec) {\n this._posChanged = true;\n this._pos = new _Math_watch_vector__WEBPACK_IMPORTED_MODULE_4__.WatchVector(vec, () => {\n this._posChanged = true;\n });\n }\n /**\n * Has the position changed since the last update\n */\n hasChanged() {\n return this._posChanged;\n }\n /**\n * Get the camera's x position\n */\n get x() {\n return this.pos.x;\n }\n /**\n * Set the camera's x position (cannot be set when following an {@apilink Actor} or when moving)\n */\n set x(value) {\n if (!this._follow && !this._cameraMoving) {\n this.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(value, this.pos.y);\n }\n }\n /**\n * Get the camera's y position\n */\n get y() {\n return this.pos.y;\n }\n /**\n * Set the camera's y position (cannot be set when following an {@apilink Actor} or when moving)\n */\n set y(value) {\n if (!this._follow && !this._cameraMoving) {\n this.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.pos.x, value);\n }\n }\n /**\n * Get or set the camera's x velocity\n */\n get dx() {\n return this.vel.x;\n }\n set dx(value) {\n this.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(value, this.vel.y);\n }\n /**\n * Get or set the camera's y velocity\n */\n get dy() {\n return this.vel.y;\n }\n set dy(value) {\n this.vel = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.vel.x, value);\n }\n /**\n * Get or set the camera's x acceleration\n */\n get ax() {\n return this.acc.x;\n }\n set ax(value) {\n this.acc = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(value, this.acc.y);\n }\n /**\n * Get or set the camera's y acceleration\n */\n get ay() {\n return this.acc.y;\n }\n set ay(value) {\n this.acc = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.acc.x, value);\n }\n /**\n * Returns the focal point of the camera, a new point giving the x and y position of the camera\n */\n getFocus() {\n return this.pos;\n }\n /**\n * This moves the camera focal point to the specified position using specified easing function. Cannot move when following an Actor.\n * @param pos The target position to move to\n * @param duration The duration in milliseconds the move should last\n * @param [easingFn] An optional easing function ({@apilink EasingFunctions.EaseInOutCubic} by default)\n * @returns A {@apilink Promise} that resolves when movement is finished, including if it's interrupted.\n * The {@apilink Promise} value is the {@apilink Vector} of the target position. It will be rejected if a move cannot be made.\n */\n move(pos, duration, easingFn = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_5__.EasingFunctions.EaseInOutCubic) {\n if (typeof easingFn !== 'function') {\n throw 'Please specify an EasingFunction';\n }\n // cannot move when following an actor\n if (this._follow) {\n return Promise.reject(pos);\n }\n // resolve existing promise, if any\n if (this._lerpPromise && this._lerpResolve) {\n this._lerpResolve(pos);\n }\n this._lerpPromise = new Promise((resolve) => {\n this._lerpResolve = resolve;\n });\n this._lerpStart = this.getFocus().clone();\n this._lerpDuration = duration;\n this._lerpEnd = pos;\n this._currentLerpTime = 0;\n this._cameraMoving = true;\n this._easing = easingFn;\n return this._lerpPromise;\n }\n /**\n * Sets the camera to shake at the specified magnitudes for the specified duration\n * @param magnitudeX The x magnitude of the shake\n * @param magnitudeY The y magnitude of the shake\n * @param duration The duration of the shake in milliseconds\n */\n shake(magnitudeX, magnitudeY, duration) {\n this._isShaking = true;\n this._shakeMagnitudeX = magnitudeX;\n this._shakeMagnitudeY = magnitudeY;\n this._shakeDuration = duration;\n }\n /**\n * Zooms the camera in or out by the specified scale over the specified duration.\n * If no duration is specified, it take effect immediately.\n * @param scale The scale of the zoom\n * @param duration The duration of the zoom in milliseconds\n */\n zoomOverTime(scale, duration = 0, easingFn = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_5__.EasingFunctions.EaseInOutCubic) {\n this._zoomPromise = new Promise((resolve) => {\n this._zoomResolve = resolve;\n });\n if (duration) {\n this._isZooming = true;\n this._zoomEasing = easingFn;\n this._currentZoomTime = 0;\n this._zoomDuration = duration;\n this._zoomStart = this.zoom;\n this._zoomEnd = scale;\n }\n else {\n this._isZooming = false;\n this.zoom = scale;\n return Promise.resolve(true);\n }\n return this._zoomPromise;\n }\n /**\n * Gets the bounding box of the viewport of this camera in world coordinates\n */\n get viewport() {\n if (this._viewport) {\n return this._viewport;\n }\n return new _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox(0, 0, 0, 0);\n }\n /**\n * Adds a new camera strategy to this camera\n * @param cameraStrategy Instance of an {@apilink CameraStrategy}\n */\n addStrategy(cameraStrategy) {\n this._cameraStrategies.push(cameraStrategy);\n }\n /**\n * Removes a camera strategy by reference\n * @param cameraStrategy Instance of an {@apilink CameraStrategy}\n */\n removeStrategy(cameraStrategy) {\n (0,_Util_Util__WEBPACK_IMPORTED_MODULE_7__.removeItemFromArray)(cameraStrategy, this._cameraStrategies);\n }\n /**\n * Clears all camera strategies from the camera\n */\n clearAllStrategies() {\n this._cameraStrategies.length = 0;\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _preupdate handler for {@apilink onPreUpdate} lifecycle event\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n * @internal\n */\n _preupdate(engine, elapsed) {\n this.events.emit('preupdate', new _Events__WEBPACK_IMPORTED_MODULE_8__.PreUpdateEvent(engine, elapsed, this));\n this.onPreUpdate(engine, elapsed);\n }\n /**\n * Safe to override onPreUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPreUpdate` is called directly before a scene is updated.\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n */\n onPreUpdate(engine, elapsed) {\n // Overridable\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _preupdate handler for {@apilink onPostUpdate} lifecycle event\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n * @internal\n */\n _postupdate(engine, elapsed) {\n this.events.emit('postupdate', new _Events__WEBPACK_IMPORTED_MODULE_8__.PostUpdateEvent(engine, elapsed, this));\n this.onPostUpdate(engine, elapsed);\n }\n /**\n * Safe to override onPostUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPostUpdate` is called directly after a scene is updated.\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n */\n onPostUpdate(engine, elapsed) {\n // Overridable\n }\n get isInitialized() {\n return this._isInitialized;\n }\n _initialize(engine) {\n if (!this.isInitialized) {\n this._engine = engine;\n this._screen = engine.screen;\n const currentRes = this._screen.contentArea;\n let center = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(currentRes.width / 2, currentRes.height / 2);\n if (!this._engine.loadingComplete) {\n // If there was a loading screen, we peek the configured resolution\n const res = this._screen.peekResolution();\n if (res) {\n center = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(res.width / 2, res.height / 2);\n }\n }\n this._halfWidth = center.x;\n this._halfHeight = center.y;\n // If the user has not set the camera pos, apply default center screen position\n if (!this._posChanged) {\n this.pos = center;\n }\n this.pos.clone(this.drawPos);\n // First frame bootstrap\n // Ensure camera tx is correct\n // Run update twice to ensure properties are init'd\n this.updateTransform(this.pos);\n // Run strategies for first frame\n this.runStrategies(engine, engine.clock.elapsed());\n // Setup the first frame viewport\n this.updateViewport();\n // It's important to update the camera after strategies\n // This prevents jitter\n this.updateTransform(this.pos);\n this.pos.clone(this._oldPos);\n this.onInitialize(engine);\n this.events.emit('initialize', new _Events__WEBPACK_IMPORTED_MODULE_8__.InitializeEvent(engine, this));\n this._isInitialized = true;\n }\n }\n /**\n * Safe to override onPostUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPostUpdate` is called directly after a scene is updated.\n */\n onInitialize(engine) {\n // Overridable\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n runStrategies(engine, elapsed) {\n for (const s of this._cameraStrategies) {\n this.pos = s.action.call(s, s.target, this, engine, elapsed);\n }\n }\n updateViewport() {\n // recalculate viewport\n this._viewport = new _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox(this.x - this._halfWidth, this.y - this._halfHeight, this.x + this._halfWidth, this.y + this._halfHeight);\n }\n update(engine, elapsed) {\n this._initialize(engine);\n this._preupdate(engine, elapsed);\n this.pos.clone(this._oldPos);\n // Update placements based on linear algebra\n this.pos = this.pos.add(this.vel.scale(elapsed / 1000));\n this.zoom += (this.dz * elapsed) / 1000;\n this.vel = this.vel.add(this.acc.scale(elapsed / 1000));\n this.dz += (this.az * elapsed) / 1000;\n this.rotation += (this.angularVelocity * elapsed) / 1000;\n if (this._isZooming) {\n if (this._currentZoomTime < this._zoomDuration) {\n const zoomEasing = this._zoomEasing;\n const newZoom = zoomEasing(this._currentZoomTime, this._zoomStart, this._zoomEnd, this._zoomDuration);\n this.zoom = newZoom;\n this._currentZoomTime += elapsed;\n }\n else {\n this._isZooming = false;\n this.zoom = this._zoomEnd;\n this._currentZoomTime = 0;\n this._zoomResolve(true);\n }\n }\n if (this._cameraMoving) {\n if (this._currentLerpTime < this._lerpDuration) {\n const moveEasing = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_5__.EasingFunctions.CreateVectorEasingFunction(this._easing);\n const lerpPoint = moveEasing(this._currentLerpTime, this._lerpStart, this._lerpEnd, this._lerpDuration);\n this.pos = lerpPoint;\n this._currentLerpTime += elapsed;\n }\n else {\n this.pos = this._lerpEnd;\n const end = this._lerpEnd.clone();\n this._lerpStart = null;\n this._lerpEnd = null;\n this._currentLerpTime = 0;\n this._cameraMoving = false;\n // Order matters here, resolve should be last so any chain promises have a clean slate\n this._lerpResolve(end);\n }\n }\n if (this._isDoneShaking()) {\n this._isShaking = false;\n this._elapsedShakeTime = 0;\n this._shakeMagnitudeX = 0;\n this._shakeMagnitudeY = 0;\n this._shakeDuration = 0;\n this._xShake = 0;\n this._yShake = 0;\n }\n else {\n this._elapsedShakeTime += elapsed;\n this._xShake = ((Math.random() * this._shakeMagnitudeX) | 0) + 1;\n this._yShake = ((Math.random() * this._shakeMagnitudeY) | 0) + 1;\n }\n this.runStrategies(engine, elapsed);\n this.updateViewport();\n // It's important to update the camera after strategies\n // This prevents jitter\n this.updateTransform(this.pos);\n this._postupdate(engine, elapsed);\n this._posChanged = false;\n }\n /**\n * Applies the relevant transformations to the game canvas to \"move\" or apply effects to the Camera\n * @param ctx Canvas context to apply transformations\n */\n draw(ctx) {\n // default to the current position\n this.pos.clone(this.drawPos);\n // interpolation if fixed update is on\n // must happen on the draw, because more draws are potentially happening than updates\n if (this._engine.fixedUpdateTimestep) {\n const blend = this._engine.currentFrameLagMs / this._engine.fixedUpdateTimestep;\n const interpolatedPos = this.pos.scale(blend).add(this._oldPos.scale(1.0 - blend));\n interpolatedPos.clone(this.drawPos);\n this.updateTransform(interpolatedPos);\n }\n // Snap camera to pixel\n if (ctx.snapToPixel) {\n const snapPos = this.drawPos.clone(this._snapPos);\n snapPos.x = ~~(snapPos.x + _Graphics__WEBPACK_IMPORTED_MODULE_9__.pixelSnapEpsilon * (0,_Math_util__WEBPACK_IMPORTED_MODULE_10__.sign)(snapPos.x));\n snapPos.y = ~~(snapPos.y + _Graphics__WEBPACK_IMPORTED_MODULE_9__.pixelSnapEpsilon * (0,_Math_util__WEBPACK_IMPORTED_MODULE_10__.sign)(snapPos.y));\n snapPos.clone(this.drawPos);\n this.updateTransform(snapPos);\n }\n ctx.multiply(this.transform);\n }\n updateTransform(pos) {\n // center the camera\n const newCanvasWidth = this._screen.resolution.width / this.zoom;\n const newCanvasHeight = this._screen.resolution.height / this.zoom;\n const cameraPos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(-pos.x + newCanvasWidth / 2 + this._xShake, -pos.y + newCanvasHeight / 2 + this._yShake);\n // Calculate camera transform\n this.transform.reset();\n this.transform.scale(this.zoom, this.zoom);\n // rotate about the focus\n this.transform.translate(newCanvasWidth / 2, newCanvasHeight / 2);\n this.transform.rotate(this.rotation);\n this.transform.translate(-newCanvasWidth / 2, -newCanvasHeight / 2);\n this.transform.translate(cameraPos.x, cameraPos.y);\n this.transform.inverse(this.inverse);\n }\n _isDoneShaking() {\n return !this._isShaking || this._elapsedShakeTime >= this._shakeDuration;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/BodyComponent.ts\":\n/*!************************************!*\\\n !*** ./Collision/BodyComponent.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BodyComponent: () => (/* binding */ BodyComponent),\n/* harmony export */ DegreeOfFreedom: () => (/* binding */ DegreeOfFreedom)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Component */ \"./EntityComponentSystem/Component.ts\");\n/* harmony import */ var _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Group/CollisionGroup */ \"./Collision/Group/CollisionGroup.ts\");\n/* harmony import */ var _Id__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Id */ \"./Id.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _ColliderComponent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./ColliderComponent */ \"./Collision/ColliderComponent.ts\");\n/* harmony import */ var _Math_transform__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Math/transform */ \"./Math/transform.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _PhysicsConfig__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./PhysicsConfig */ \"./Collision/PhysicsConfig.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\nvar DegreeOfFreedom;\n(function (DegreeOfFreedom) {\n DegreeOfFreedom[\"Rotation\"] = \"rotation\";\n DegreeOfFreedom[\"X\"] = \"x\";\n DegreeOfFreedom[\"Y\"] = \"y\";\n})(DegreeOfFreedom || (DegreeOfFreedom = {}));\n/**\n * Body describes all the physical properties pos, vel, acc, rotation, angular velocity for the purpose of\n * of physics simulation.\n */\nclass BodyComponent extends _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor(options) {\n var _a, _b, _c;\n super();\n this.dependencies = [_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent, _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent];\n this.id = (0,_Id__WEBPACK_IMPORTED_MODULE_3__.createId)('body', BodyComponent._ID++);\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_4__.EventEmitter();\n this.oldTransform = new _Math_transform__WEBPACK_IMPORTED_MODULE_5__.Transform();\n /**\n * Indicates whether the old transform has been captured at least once for interpolation\n * @internal\n */\n this.__oldTransformCaptured = false;\n /**\n * Enable or disabled the fixed update interpolation, by default interpolation is on.\n */\n this.enableFixedUpdateInterpolate = true;\n /**\n * Collision type for the rigidbody physics simulation, by default {@apilink CollisionType.PreventCollision}\n */\n this.collisionType = _CollisionType__WEBPACK_IMPORTED_MODULE_6__.CollisionType.PreventCollision;\n /**\n * The collision group for the body's colliders, by default body colliders collide with everything\n */\n this.group = _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_7__.CollisionGroup.All;\n this._sleeping = false;\n /**\n * The also known as coefficient of restitution of this actor, represents the amount of energy preserved after collision or the\n * bounciness. If 1, it is 100% bouncy, 0 it completely absorbs.\n */\n this.bounciness = 0.2;\n /**\n * The coefficient of friction on this actor.\n *\n * The {@apilink SolverStrategy.Arcade} does not support this property.\n *\n */\n this.friction = 0.99;\n /**\n * Should use global gravity {@apilink Physics.gravity} in it's physics simulation, default is true\n */\n this.useGravity = true;\n /**\n * Degrees of freedom to limit\n *\n * Note: this only limits responses in the realistic solver, if velocity/angularVelocity is set the actor will still respond\n */\n this.limitDegreeOfFreedom = [];\n this._oldGlobalPos = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Zero;\n /**\n * The velocity of the actor last frame (vx, vy) in pixels/second\n */\n this.oldVel = new _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector(0, 0);\n /**\n * Gets/sets the acceleration of the actor from the last frame. This does not include the global acc {@apilink Physics.acc}.\n */\n this.oldAcc = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Zero;\n this._impulseScratch = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_8__.vec)(0, 0);\n this._distanceFromCenterScratch = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_8__.vec)(0, 0);\n if (options) {\n this.collisionType = (_a = options.type) !== null && _a !== void 0 ? _a : this.collisionType;\n this.group = (_b = options.group) !== null && _b !== void 0 ? _b : this.group;\n this.useGravity = (_c = options.useGravity) !== null && _c !== void 0 ? _c : this.useGravity;\n this._bodyConfig = {\n ...(0,_PhysicsConfig__WEBPACK_IMPORTED_MODULE_9__.getDefaultPhysicsConfig)().bodies,\n ...options.config\n };\n }\n else {\n this._bodyConfig = {\n ...(0,_PhysicsConfig__WEBPACK_IMPORTED_MODULE_9__.getDefaultPhysicsConfig)().bodies\n };\n }\n this.updatePhysicsConfig(this._bodyConfig);\n this._mass = BodyComponent._DEFAULT_CONFIG.defaultMass;\n }\n get matrix() {\n return this.transform.get().matrix;\n }\n /**\n * Called by excalibur to update physics config defaults if they change\n * @param config\n */\n updatePhysicsConfig(config) {\n this._bodyConfig = {\n ...(0,_PhysicsConfig__WEBPACK_IMPORTED_MODULE_9__.getDefaultPhysicsConfig)().bodies,\n ...config\n };\n this.canSleep = this._bodyConfig.canSleepByDefault;\n this.sleepMotion = this._bodyConfig.sleepEpsilon * 5;\n this.wakeThreshold = this._bodyConfig.wakeThreshold;\n }\n /**\n * Called by excalibur to update defaults\n * @param config\n */\n static updateDefaultPhysicsConfig(config) {\n BodyComponent._DEFAULT_CONFIG = config;\n }\n get mass() {\n return this._mass;\n }\n set mass(newMass) {\n this._mass = newMass;\n this._cachedInertia = undefined;\n this._cachedInverseInertia = undefined;\n }\n /**\n * The inverse mass (1/mass) of the body. If {@apilink CollisionType.Fixed} this is 0, meaning \"infinite\" mass\n */\n get inverseMass() {\n return this.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_6__.CollisionType.Fixed ? 0 : 1 / this.mass;\n }\n /**\n * Whether this body is sleeping or not\n * @deprecated use isSleeping\n */\n get sleeping() {\n return this.isSleeping;\n }\n /**\n * Whether this body is sleeping or not\n */\n get isSleeping() {\n return this._sleeping;\n }\n /**\n * Set the sleep state of the body\n * @param sleeping\n * @deprecated use isSleeping\n */\n setSleeping(sleeping) {\n this.isSleeping = sleeping;\n }\n set isSleeping(sleeping) {\n this._sleeping = sleeping;\n if (!sleeping) {\n // Give it a kick to keep it from falling asleep immediately\n this.sleepMotion = this._bodyConfig.sleepEpsilon * 5;\n }\n else {\n this.vel = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Zero;\n this.acc = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Zero;\n this.angularVelocity = 0;\n this.sleepMotion = 0;\n }\n }\n /**\n * Update body's {@apilink BodyComponent.sleepMotion} for the purpose of sleeping\n */\n updateMotion() {\n if (this._sleeping) {\n this.isSleeping = true;\n }\n const currentMotion = this.vel.magnitude * this.vel.magnitude + Math.abs(this.angularVelocity * this.angularVelocity);\n const bias = this._bodyConfig.sleepBias;\n this.sleepMotion = bias * this.sleepMotion + (1 - bias) * currentMotion;\n this.sleepMotion = (0,_Math_util__WEBPACK_IMPORTED_MODULE_10__.clamp)(this.sleepMotion, 0, 10 * this._bodyConfig.sleepEpsilon);\n if (this.canSleep && this.sleepMotion < this._bodyConfig.sleepEpsilon) {\n this.isSleeping = true;\n }\n }\n /**\n * Get the moment of inertia from the {@apilink ColliderComponent}\n */\n get inertia() {\n if (this._cachedInertia) {\n return this._cachedInertia;\n }\n // Inertia is a property of the geometry, so this is a little goofy but seems to be okay?\n const collider = this.owner.get(_ColliderComponent__WEBPACK_IMPORTED_MODULE_11__.ColliderComponent);\n if (collider) {\n collider.$colliderAdded.subscribe(() => {\n this._cachedInertia = null;\n });\n collider.$colliderRemoved.subscribe(() => {\n this._cachedInertia = null;\n });\n const maybeCollider = collider.get();\n if (maybeCollider) {\n return (this._cachedInertia = maybeCollider.getInertia(this.mass));\n }\n }\n return 0;\n }\n /**\n * Get the inverse moment of inertial from the {@apilink ColliderComponent}. If {@apilink CollisionType.Fixed} this is 0, meaning \"infinite\" mass\n */\n get inverseInertia() {\n if (this._cachedInverseInertia) {\n return this._cachedInverseInertia;\n }\n return (this._cachedInverseInertia = this.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_6__.CollisionType.Fixed ? 0 : 1 / this.inertia);\n }\n /**\n * Returns if the owner is active\n * @deprecated use isActive\n */\n get active() {\n var _a;\n return !!((_a = this.owner) === null || _a === void 0 ? void 0 : _a.isActive);\n }\n /**\n * Returns if the owner is active\n */\n get isActive() {\n var _a;\n return !!((_a = this.owner) === null || _a === void 0 ? void 0 : _a.isActive);\n }\n /**\n * @deprecated Use globalPos\n */\n get center() {\n return this.globalPos;\n }\n onAdd(owner) {\n var _a, _b;\n this.transform = (_a = this.owner) === null || _a === void 0 ? void 0 : _a.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this.motion = (_b = this.owner) === null || _b === void 0 ? void 0 : _b.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n }\n get pos() {\n return this.transform.pos;\n }\n set pos(val) {\n this.transform.pos = val;\n }\n /**\n * The (x, y) position of the actor this will be in the middle of the actor if the\n * {@apilink Actor.anchor} is set to (0.5, 0.5) which is default.\n * If you want the (x, y) position to be the top left of the actor specify an anchor of (0, 0).\n */\n get globalPos() {\n return this.transform.globalPos;\n }\n set globalPos(val) {\n this.transform.globalPos = val;\n }\n /**\n * The position of the actor last frame (x, y) in pixels\n */\n get oldPos() {\n return this.oldTransform.pos;\n }\n /**\n * The global position of the actor last frame (x, y) in pixels\n */\n get oldGlobalPos() {\n return this._oldGlobalPos;\n }\n /**\n * The current velocity vector (vx, vy) of the actor in pixels/second\n */\n get vel() {\n return this.motion.vel;\n }\n set vel(val) {\n this.motion.vel = val;\n }\n /**\n * The current acceleration vector (ax, ay) of the actor in pixels/second/second. An acceleration pointing down such as (0, 100) may\n * be useful to simulate a gravitational effect.\n */\n get acc() {\n return this.motion.acc;\n }\n set acc(val) {\n this.motion.acc = val;\n }\n /**\n * The current torque applied to the actor\n */\n get torque() {\n return this.motion.torque;\n }\n set torque(val) {\n this.motion.torque = val;\n }\n /**\n * Gets/sets the rotation of the body from the last frame.\n */\n get oldRotation() {\n return this.oldTransform.rotation;\n }\n /**\n * The rotation of the body in radians\n */\n get rotation() {\n return this.transform.globalRotation;\n }\n set rotation(val) {\n this.transform.globalRotation = val;\n }\n /**\n * The scale vector of the actor\n */\n get scale() {\n return this.transform.globalScale;\n }\n set scale(val) {\n this.transform.globalScale = val;\n }\n /**\n * The scale of the actor last frame\n */\n get oldScale() {\n return this.oldTransform.scale;\n }\n /**\n * The scale rate of change of the actor in scale/second\n */\n get scaleFactor() {\n return this.motion.scaleFactor;\n }\n set scaleFactor(scaleFactor) {\n this.motion.scaleFactor = scaleFactor;\n }\n /**\n * Get the angular velocity in radians/second\n */\n get angularVelocity() {\n return this.motion.angularVelocity;\n }\n /**\n * Set the angular velocity in radians/second\n */\n set angularVelocity(value) {\n this.motion.angularVelocity = value;\n }\n /**\n * Apply a specific impulse to the body\n * @param point\n * @param impulse\n */\n applyImpulse(point, impulse) {\n if (this.collisionType !== _CollisionType__WEBPACK_IMPORTED_MODULE_6__.CollisionType.Active) {\n return; // only active objects participate in the simulation\n }\n const finalImpulse = impulse.scale(this.inverseMass, this._impulseScratch);\n if (this.limitDegreeOfFreedom.indexOf(DegreeOfFreedom.X) > -1) {\n finalImpulse.x = 0;\n }\n if (this.limitDegreeOfFreedom.indexOf(DegreeOfFreedom.Y) > -1) {\n finalImpulse.y = 0;\n }\n this.vel.addEqual(finalImpulse);\n if (!this.limitDegreeOfFreedom.includes(DegreeOfFreedom.Rotation)) {\n const distanceFromCenter = point.sub(this.globalPos, this._distanceFromCenterScratch);\n this.angularVelocity += this.inverseInertia * distanceFromCenter.cross(impulse);\n }\n }\n /**\n * Apply only linear impulse to the body\n * @param impulse\n */\n applyLinearImpulse(impulse) {\n if (this.collisionType !== _CollisionType__WEBPACK_IMPORTED_MODULE_6__.CollisionType.Active) {\n return; // only active objects participate in the simulation\n }\n const finalImpulse = impulse.scale(this.inverseMass);\n if (this.limitDegreeOfFreedom.includes(DegreeOfFreedom.X)) {\n finalImpulse.x = 0;\n }\n if (this.limitDegreeOfFreedom.includes(DegreeOfFreedom.Y)) {\n finalImpulse.y = 0;\n }\n this.vel = this.vel.add(finalImpulse);\n }\n /**\n * Apply only angular impulse to the body\n * @param point\n * @param impulse\n */\n applyAngularImpulse(point, impulse) {\n if (this.collisionType !== _CollisionType__WEBPACK_IMPORTED_MODULE_6__.CollisionType.Active) {\n return; // only active objects participate in the simulation\n }\n if (!this.limitDegreeOfFreedom.includes(DegreeOfFreedom.Rotation)) {\n const distanceFromCenter = point.sub(this.globalPos);\n this.angularVelocity += this.inverseInertia * distanceFromCenter.cross(impulse);\n }\n }\n /**\n * Sets the old versions of pos, vel, acc, and scale.\n */\n captureOldTransform() {\n // Capture old values before integration step updates them\n this.__oldTransformCaptured = true;\n const tx = this.transform.get();\n tx.clone(this.oldTransform);\n this.oldTransform.parent = tx.parent; // also grab parent\n this.oldVel.setTo(this.vel.x, this.vel.y);\n this.oldAcc.setTo(this.acc.x, this.acc.y);\n this.oldGlobalPos.setTo(this.globalPos.x, this.globalPos.y);\n }\n clone() {\n const component = super.clone();\n return component;\n }\n}\nBodyComponent._ID = 0;\nBodyComponent._DEFAULT_CONFIG = {\n ...(0,_PhysicsConfig__WEBPACK_IMPORTED_MODULE_9__.getDefaultPhysicsConfig)().bodies\n};\n\n\n/***/ }),\n\n/***/ \"./Collision/BoundingBox.ts\":\n/*!**********************************!*\\\n !*** ./Collision/BoundingBox.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BoundingBox: () => (/* binding */ BoundingBox)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Side__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Side */ \"./Collision/Side.ts\");\n\n\n\n/**\n * Axis Aligned collision primitive for Excalibur.\n */\nclass BoundingBox {\n /**\n * Constructor allows passing of either an object with all coordinate components,\n * or the coordinate components passed separately.\n * @param leftOrOptions Either x coordinate of the left edge or an options object\n * containing the four coordinate components.\n * @param top y coordinate of the top edge\n * @param right x coordinate of the right edge\n * @param bottom y coordinate of the bottom edge\n */\n constructor(leftOrOptions = 0, top = 0, right = 0, bottom = 0) {\n // Cache bounding box point returns\n this._points = [];\n if (typeof leftOrOptions === 'object') {\n this.left = leftOrOptions.left;\n this.top = leftOrOptions.top;\n this.right = leftOrOptions.right;\n this.bottom = leftOrOptions.bottom;\n }\n else if (typeof leftOrOptions === 'number') {\n this.left = leftOrOptions;\n this.top = top;\n this.right = right;\n this.bottom = bottom;\n }\n }\n /**\n * Returns a new instance of {@apilink BoundingBox} that is a copy of the current instance\n */\n clone(dest) {\n const result = dest || new BoundingBox(0, 0, 0, 0);\n result.left = this.left;\n result.right = this.right;\n result.top = this.top;\n result.bottom = this.bottom;\n return result;\n }\n /**\n * Resets the bounds to a zero width/height box\n */\n reset() {\n this.left = 0;\n this.top = 0;\n this.bottom = 0;\n this.right = 0;\n }\n /**\n * Given bounding box A & B, returns the side relative to A when intersection is performed.\n * @param intersection Intersection vector between 2 bounding boxes\n */\n static getSideFromIntersection(intersection) {\n if (!intersection) {\n return _Side__WEBPACK_IMPORTED_MODULE_0__.Side.None;\n }\n if (intersection) {\n if (Math.abs(intersection.x) > Math.abs(intersection.y)) {\n if (intersection.x < 0) {\n return _Side__WEBPACK_IMPORTED_MODULE_0__.Side.Right;\n }\n return _Side__WEBPACK_IMPORTED_MODULE_0__.Side.Left;\n }\n else {\n if (intersection.y < 0) {\n return _Side__WEBPACK_IMPORTED_MODULE_0__.Side.Bottom;\n }\n return _Side__WEBPACK_IMPORTED_MODULE_0__.Side.Top;\n }\n }\n return _Side__WEBPACK_IMPORTED_MODULE_0__.Side.None;\n }\n static fromPoints(points) {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (let i = 0; i < points.length; i++) {\n if (points[i].x < minX) {\n minX = points[i].x;\n }\n if (points[i].x > maxX) {\n maxX = points[i].x;\n }\n if (points[i].y < minY) {\n minY = points[i].y;\n }\n if (points[i].y > maxY) {\n maxY = points[i].y;\n }\n }\n return new BoundingBox(minX, minY, maxX, maxY);\n }\n /**\n * Creates a bounding box from a width and height\n * @param width\n * @param height\n * @param anchor Default Vector.Half\n * @param pos Default Vector.Zero\n */\n static fromDimension(width, height, anchor = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Half, pos = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero) {\n return new BoundingBox(-width * anchor.x + pos.x, -height * anchor.y + pos.y, width - width * anchor.x + pos.x, height - height * anchor.y + pos.y);\n }\n /**\n * Returns the calculated width of the bounding box\n */\n get width() {\n return this.right - this.left;\n }\n /**\n * Returns the calculated height of the bounding box\n */\n get height() {\n return this.bottom - this.top;\n }\n /**\n * Return whether the bounding box has zero dimensions in height,width or both\n */\n hasZeroDimensions() {\n return this.width === 0 || this.height === 0;\n }\n /**\n * Returns the center of the bounding box\n */\n get center() {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector((this.left + this.right) / 2, (this.top + this.bottom) / 2);\n }\n get topLeft() {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.left, this.top);\n }\n get bottomRight() {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.right, this.bottom);\n }\n get topRight() {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.right, this.top);\n }\n get bottomLeft() {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.left, this.bottom);\n }\n translate(pos) {\n return new BoundingBox(this.left + pos.x, this.top + pos.y, this.right + pos.x, this.bottom + pos.y);\n }\n /**\n * Rotates a bounding box by and angle and around a point, if no point is specified (0, 0) is used by default. The resulting bounding\n * box is also axis-align. This is useful when a new axis-aligned bounding box is needed for rotated geometry.\n */\n rotate(angle, point = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero) {\n const points = this.getPoints().map((p) => p.rotate(angle, point));\n return BoundingBox.fromPoints(points);\n }\n /**\n * Scale a bounding box by a scale factor, optionally provide a point\n * @param scale\n * @param point\n */\n scale(scale, point = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero) {\n const shifted = this.translate(point);\n return new BoundingBox(shifted.left * scale.x, shifted.top * scale.y, shifted.right * scale.x, shifted.bottom * scale.y);\n }\n /**\n * Transform the axis aligned bounding box by a {@apilink Matrix}, producing a new axis aligned bounding box\n * @param matrix\n */\n transform(matrix) {\n // inlined these calculations to not use vectors would speed it up slightly\n // const matFirstColumn = vec(matrix.data[0], matrix.data[1]);\n // const xa = matFirstColumn.scale(this.left);\n const xa1 = matrix.data[0] * this.left;\n const xa2 = matrix.data[1] * this.left;\n // const xb = matFirstColumn.scale(this.right);\n const xb1 = matrix.data[0] * this.right;\n const xb2 = matrix.data[1] * this.right;\n // const matSecondColumn = vec(matrix.data[2], matrix.data[3]);\n // const ya = matSecondColumn.scale(this.top);\n const ya1 = matrix.data[2] * this.top;\n const ya2 = matrix.data[3] * this.top;\n // const yb = matSecondColumn.scale(this.bottom);\n const yb1 = matrix.data[2] * this.bottom;\n const yb2 = matrix.data[3] * this.bottom;\n const matrixPos = matrix.getPosition();\n // const topLeft = Vector.min(xa, xb).add(Vector.min(ya, yb)).add(matrixPos);\n // const bottomRight = Vector.max(xa, xb).add(Vector.max(ya, yb)).add(matrixPos);\n const left = Math.min(xa1, xb1) + Math.min(ya1, yb1) + matrixPos.x;\n const top = Math.min(xa2, xb2) + Math.min(ya2, yb2) + matrixPos.y;\n const right = Math.max(xa1, xb1) + Math.max(ya1, yb1) + matrixPos.x;\n const bottom = Math.max(xa2, xb2) + Math.max(ya2, yb2) + matrixPos.y;\n return new BoundingBox({\n left, //: topLeft.x,\n top, //: topLeft.y,\n right, //: bottomRight.x,\n bottom //: bottomRight.y\n });\n }\n /**\n * Returns the perimeter of the bounding box\n */\n getPerimeter() {\n const wx = this.width;\n const wy = this.height;\n return 2 * (wx + wy);\n }\n /**\n * Returns the world space points that make up the corners of the bounding box as a polygon\n */\n getPoints() {\n if (this._left !== this.left || this._right !== this.right || this._top !== this.top || this._bottom !== this.bottom) {\n this._points.length = 0;\n this._points.push(new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.left, this.top));\n this._points.push(new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.right, this.top));\n this._points.push(new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.right, this.bottom));\n this._points.push(new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.left, this.bottom));\n this._left = this.left;\n this._right = this.right;\n this._top = this.top;\n this._bottom = this.bottom;\n }\n return this._points;\n }\n /**\n * Determines whether a ray intersects with a bounding box\n */\n rayCast(ray, farClipDistance = Infinity) {\n // algorithm from https://tavianator.com/fast-branchless-raybounding-box-intersections/\n let tMin = -Infinity;\n let tMax = +Infinity;\n const xInv = ray.dir.x === 0 ? Number.MAX_VALUE : 1 / ray.dir.x;\n const yInv = ray.dir.y === 0 ? Number.MAX_VALUE : 1 / ray.dir.y;\n const tx1 = (this.left - ray.pos.x) * xInv;\n const tx2 = (this.right - ray.pos.x) * xInv;\n tMin = Math.min(tx1, tx2);\n tMax = Math.max(tx1, tx2);\n const ty1 = (this.top - ray.pos.y) * yInv;\n const ty2 = (this.bottom - ray.pos.y) * yInv;\n tMin = Math.max(tMin, Math.min(ty1, ty2));\n tMax = Math.min(tMax, Math.max(ty1, ty2));\n return tMax >= Math.max(0, tMin) && tMin < farClipDistance;\n }\n rayCastTime(ray, farClipDistance = Infinity) {\n // algorithm from https://tavianator.com/fast-branchless-raybounding-box-intersections/\n let tMin = -Infinity;\n let tMax = +Infinity;\n const xInv = ray.dir.x === 0 ? Number.MAX_VALUE : 1 / ray.dir.x;\n const yInv = ray.dir.y === 0 ? Number.MAX_VALUE : 1 / ray.dir.y;\n const tx1 = (this.left - ray.pos.x) * xInv;\n const tx2 = (this.right - ray.pos.x) * xInv;\n tMin = Math.min(tx1, tx2);\n tMax = Math.max(tx1, tx2);\n const ty1 = (this.top - ray.pos.y) * yInv;\n const ty2 = (this.bottom - ray.pos.y) * yInv;\n tMin = Math.max(tMin, Math.min(ty1, ty2));\n tMax = Math.min(tMax, Math.max(ty1, ty2));\n if (tMax >= Math.max(0, tMin) && tMin < farClipDistance) {\n return tMin;\n }\n return -1;\n }\n contains(val) {\n if (val instanceof _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector) {\n return this.left <= val.x && this.top <= val.y && val.y <= this.bottom && val.x <= this.right;\n }\n else if (val instanceof BoundingBox) {\n return this.left <= val.left && this.top <= val.top && val.bottom <= this.bottom && val.right <= this.right;\n }\n return false;\n }\n /**\n * Combines this bounding box and another together returning a new bounding box\n * @param other The bounding box to combine\n */\n combine(other, dest) {\n const compositeBB = dest || new BoundingBox(0, 0, 0, 0);\n const left = Math.min(this.left, other.left);\n const top = Math.min(this.top, other.top);\n const right = Math.max(this.right, other.right);\n const bottom = Math.max(this.bottom, other.bottom);\n compositeBB.left = left;\n compositeBB.top = top;\n compositeBB.right = right;\n compositeBB.bottom = bottom;\n return compositeBB;\n }\n get dimensions() {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(this.width, this.height);\n }\n /**\n * Returns true if the bounding boxes overlap.\n * @param other\n * @param epsilon Optionally specify a small epsilon (default 0) as amount of overlap to ignore as overlap.\n * This epsilon is useful in stable collision simulations.\n */\n overlaps(other, epsilon) {\n const e = epsilon || 0;\n if (other.hasZeroDimensions()) {\n return this.contains(other);\n }\n if (this.hasZeroDimensions()) {\n return other.contains(this);\n }\n const totalBoundingBox = this.combine(other);\n return totalBoundingBox.width + e < other.width + this.width && totalBoundingBox.height + e < other.height + this.height;\n }\n /**\n * Test wether this bounding box intersects with another returning\n * the intersection vector that can be used to resolve the collision. If there\n * is no intersection null is returned.\n * @param other Other {@apilink BoundingBox} to test intersection with\n * @returns A Vector in the direction of the current BoundingBox, this <- other\n */\n intersect(other) {\n const totalBoundingBox = this.combine(other);\n // If the total bounding box is less than or equal the sum of the 2 bounds then there is collision\n if (totalBoundingBox.width < other.width + this.width &&\n totalBoundingBox.height < other.height + this.height &&\n !totalBoundingBox.dimensions.equals(other.dimensions) &&\n !totalBoundingBox.dimensions.equals(this.dimensions)) {\n // collision\n let overlapX = 0;\n // right edge is between the other's left and right edge\n /**\n * +-this-+\n * | |\n * | +-other-+\n * +----|-+ |\n * | |\n * +-------+\n * <---\n * ^ overlap\n */\n if (this.right >= other.left && this.right <= other.right) {\n overlapX = other.left - this.right;\n // right edge is past the other's right edge\n /**\n * +-other-+\n * | |\n * | +-this-+\n * +----|--+ |\n * | |\n * +------+\n * --->\n * ^ overlap\n */\n }\n else {\n overlapX = other.right - this.left;\n }\n let overlapY = 0;\n // top edge is between the other's top and bottom edge\n /**\n * +-other-+\n * | |\n * | +-this-+ | <- overlap\n * +----|--+ | |\n * | | \\ /\n * +------+ '\n */\n if (this.top <= other.bottom && this.top >= other.top) {\n overlapY = other.bottom - this.top;\n // top edge is above the other top edge\n /**\n * +-this-+ .\n * | | / \\\n * | +-other-+ | <- overlap\n * +----|-+ | |\n * | |\n * +-------+\n */\n }\n else {\n overlapY = other.top - this.bottom;\n }\n if (Math.abs(overlapX) < Math.abs(overlapY)) {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(overlapX, 0);\n }\n else {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(0, overlapY);\n }\n // Case of total containment of one bounding box by another\n }\n else if (totalBoundingBox.dimensions.equals(other.dimensions) || totalBoundingBox.dimensions.equals(this.dimensions)) {\n let overlapX = 0;\n // this is wider than the other\n if (this.width - other.width >= 0) {\n // This right edge is closest to the others right edge\n if (this.right - other.right <= other.left - this.left) {\n overlapX = other.left - this.right;\n // This left edge is closest to the others left edge\n }\n else {\n overlapX = other.right - this.left;\n }\n // other is wider than this\n }\n else {\n // This right edge is closest to the others right edge\n if (other.right - this.right <= this.left - other.left) {\n overlapX = this.left - other.right;\n // This left edge is closest to the others left edge\n }\n else {\n overlapX = this.right - other.left;\n }\n }\n let overlapY = 0;\n // this is taller than other\n if (this.height - other.height >= 0) {\n // The bottom edge is closest to the others bottom edge\n if (this.bottom - other.bottom <= other.top - this.top) {\n overlapY = other.top - this.bottom;\n }\n else {\n overlapY = other.bottom - this.top;\n }\n // other is taller than this\n }\n else {\n // The bottom edge is closest to the others bottom edge\n if (other.bottom - this.bottom <= this.top - other.top) {\n overlapY = this.top - other.bottom;\n }\n else {\n overlapY = this.bottom - other.top;\n }\n }\n if (Math.abs(overlapX) < Math.abs(overlapY)) {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(overlapX, 0);\n }\n else {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(0, overlapY);\n }\n }\n else {\n return null;\n }\n }\n /**\n * Test whether the bounding box has intersected with another bounding box, returns the side of the current bb that intersected.\n * @param bb The other actor to test\n */\n intersectWithSide(bb) {\n const intersect = this.intersect(bb);\n return BoundingBox.getSideFromIntersection(intersect);\n }\n /**\n * Draw a debug bounding box\n * @param ex\n * @param color\n */\n draw(ex, color = _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Yellow) {\n ex.debug.drawRect(this.left, this.top, this.width, this.height, { color });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/ColliderComponent.ts\":\n/*!****************************************!*\\\n !*** ./Collision/ColliderComponent.ts ***!\n \\****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ColliderComponent: () => (/* binding */ ColliderComponent)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Component */ \"./EntityComponentSystem/Component.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _Util_Observable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Util/Observable */ \"./Util/Observable.ts\");\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Colliders/CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var _Colliders_Shape__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Colliders/Shape */ \"./Collision/Colliders/Shape.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Actor__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Actor */ \"./Actor.ts\");\n\n\n\n\n\n\n\n\n\n\nclass ColliderComponent extends _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor(collider) {\n super();\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_1__.EventEmitter();\n /**\n * Observable that notifies when a collider is added to the body\n */\n this.$colliderAdded = new _Util_Observable__WEBPACK_IMPORTED_MODULE_2__.Observable();\n /**\n * Observable that notifies when a collider is removed from the body\n */\n this.$colliderRemoved = new _Util_Observable__WEBPACK_IMPORTED_MODULE_2__.Observable();\n this._collidersToRemove = [];\n this.set(collider);\n }\n /**\n * Get the current collider geometry\n */\n get() {\n return this._collider;\n }\n /**\n * Set the collider geometry\n * @param collider\n * @returns the collider you set\n */\n set(collider) {\n this.clear();\n if (collider) {\n this._collider = collider;\n this._collider.owner = this.owner;\n collider.events.pipe(this.events);\n this.$colliderAdded.notifyAll(collider);\n this.update();\n }\n return collider;\n }\n /**\n * Remove collider geometry from collider component\n */\n clear() {\n if (this._collider) {\n this._collidersToRemove.push(this._collider);\n this._collider = null;\n }\n }\n processColliderRemoval() {\n for (const collider of this._collidersToRemove) {\n collider.events.unpipe(this.events);\n this.$colliderRemoved.notifyAll(collider);\n collider.owner = null;\n }\n }\n clone() {\n const clone = new ColliderComponent(this._collider.clone());\n return clone;\n }\n /**\n * Return world space bounds\n */\n get bounds() {\n var _a, _b;\n return (_b = (_a = this._collider) === null || _a === void 0 ? void 0 : _a.bounds) !== null && _b !== void 0 ? _b : new _BoundingBox__WEBPACK_IMPORTED_MODULE_3__.BoundingBox();\n }\n /**\n * Return local space bounds\n */\n get localBounds() {\n var _a, _b;\n return (_b = (_a = this._collider) === null || _a === void 0 ? void 0 : _a.localBounds) !== null && _b !== void 0 ? _b : new _BoundingBox__WEBPACK_IMPORTED_MODULE_3__.BoundingBox();\n }\n /**\n * Update the collider's transformed geometry\n */\n update() {\n var _a;\n const tx = (_a = this.owner) === null || _a === void 0 ? void 0 : _a.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__.TransformComponent);\n if (this._collider) {\n this._collider.owner = this.owner;\n if (tx) {\n this._collider.update(tx.get());\n }\n }\n }\n /**\n * Collide component with another\n * @param other\n */\n collide(other) {\n let colliderA = this._collider;\n let colliderB = other._collider;\n if (!colliderA || !colliderB) {\n return [];\n }\n // If we have a composite left hand side :(\n // Might bite us, but to avoid updating all the handlers make composite always left side\n let flipped = false;\n if (colliderB instanceof _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_5__.CompositeCollider) {\n colliderA = colliderB;\n colliderB = this._collider;\n flipped = true;\n }\n if (this._collider) {\n const contacts = colliderA.collide(colliderB);\n if (contacts) {\n if (flipped) {\n contacts.forEach((contact) => {\n contact.mtv = contact.mtv.negate();\n contact.normal = contact.normal.negate();\n contact.tangent = contact.normal.perpendicular();\n contact.colliderA = this._collider;\n contact.colliderB = other._collider;\n });\n }\n return contacts;\n }\n return [];\n }\n return [];\n }\n onAdd(entity) {\n if (this._collider) {\n this.update();\n }\n // Wire up the collider events to the owning entity\n this.events.on('precollision', (evt) => {\n const precollision = evt;\n entity.events.emit('precollision', new _Events__WEBPACK_IMPORTED_MODULE_6__.PreCollisionEvent(precollision.self, precollision.other, precollision.side, precollision.intersection, precollision.contact));\n if (entity instanceof _Actor__WEBPACK_IMPORTED_MODULE_7__.Actor) {\n entity.onPreCollisionResolve(precollision.self, precollision.other, precollision.side, precollision.contact);\n }\n });\n this.events.on('postcollision', (evt) => {\n const postcollision = evt;\n entity.events.emit('postcollision', new _Events__WEBPACK_IMPORTED_MODULE_6__.PostCollisionEvent(postcollision.self, postcollision.other, postcollision.side, postcollision.intersection, postcollision.contact));\n if (entity instanceof _Actor__WEBPACK_IMPORTED_MODULE_7__.Actor) {\n entity.onPostCollisionResolve(postcollision.self, postcollision.other, postcollision.side, postcollision.contact);\n }\n });\n this.events.on('collisionstart', (evt) => {\n const start = evt;\n entity.events.emit('collisionstart', new _Events__WEBPACK_IMPORTED_MODULE_6__.CollisionStartEvent(start.self, start.other, start.side, start.contact));\n if (entity instanceof _Actor__WEBPACK_IMPORTED_MODULE_7__.Actor) {\n entity.onCollisionStart(start.self, start.other, start.side, start.contact);\n }\n });\n this.events.on('collisionend', (evt) => {\n const end = evt;\n entity.events.emit('collisionend', new _Events__WEBPACK_IMPORTED_MODULE_6__.CollisionEndEvent(end.self, end.other, end.side, end.lastContact));\n if (entity instanceof _Actor__WEBPACK_IMPORTED_MODULE_7__.Actor) {\n entity.onCollisionEnd(end.self, end.other, end.side, end.lastContact);\n }\n });\n }\n onRemove() {\n this.events.clear();\n this.$colliderRemoved.notifyAll(this._collider);\n }\n /**\n * Sets up a box geometry based on the current bounds of the associated actor of this physics body.\n *\n * If no width/height are specified the body will attempt to use the associated actor's width/height.\n *\n * By default, the box is center is at (0, 0) which means it is centered around the actors anchor.\n */\n useBoxCollider(width, height, anchor = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Half, center = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Zero) {\n const collider = _Colliders_Shape__WEBPACK_IMPORTED_MODULE_9__.Shape.Box(width, height, anchor, center);\n return this.set(collider);\n }\n /**\n * Sets up a {@apilink PolygonCollider | `polygon`} collision geometry based on a list of of points relative\n * to the anchor of the associated actor\n * of this physics body.\n *\n * Only [convex polygon](https://en.wikipedia.org/wiki/Convex_polygon) definitions are supported.\n *\n * By default, the box is center is at (0, 0) which means it is centered around the actors anchor.\n */\n usePolygonCollider(points, center = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Zero) {\n const poly = _Colliders_Shape__WEBPACK_IMPORTED_MODULE_9__.Shape.Polygon(points, center);\n return this.set(poly);\n }\n /**\n * Sets up a {@apilink Circle | `circle collision geometry`} as the only collider with a specified radius in pixels.\n *\n * By default, the box is center is at (0, 0) which means it is centered around the actors anchor.\n */\n useCircleCollider(radius, center = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Zero) {\n const collider = _Colliders_Shape__WEBPACK_IMPORTED_MODULE_9__.Shape.Circle(radius, center);\n return this.set(collider);\n }\n /**\n * Sets up an {@apilink Edge | `edge collision geometry`} with a start point and an end point relative to the anchor of the associated actor\n * of this physics body.\n *\n * By default, the box is center is at (0, 0) which means it is centered around the actors anchor.\n */\n useEdgeCollider(begin, end) {\n const collider = _Colliders_Shape__WEBPACK_IMPORTED_MODULE_9__.Shape.Edge(begin, end);\n return this.set(collider);\n }\n /**\n * Setups up a {@apilink CompositeCollider} which can define any arbitrary set of excalibur colliders\n * @param colliders\n */\n useCompositeCollider(colliders) {\n return this.set(new _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_5__.CompositeCollider(colliders));\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/CircleCollider.ts\":\n/*!***********************************************!*\\\n !*** ./Collision/Colliders/CircleCollider.ts ***!\n \\***********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CircleCollider: () => (/* binding */ CircleCollider)\n/* harmony export */ });\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./CollisionJumpTable */ \"./Collision/Colliders/CollisionJumpTable.ts\");\n/* harmony import */ var _PolygonCollider__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./PolygonCollider */ \"./Collision/Colliders/PolygonCollider.ts\");\n/* harmony import */ var _EdgeCollider__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./EdgeCollider */ \"./Collision/Colliders/EdgeCollider.ts\");\n/* harmony import */ var _Math_projection__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../Math/projection */ \"./Math/projection.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../Color */ \"./Color.ts\");\n/* harmony import */ var _Collider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Collider */ \"./Collision/Colliders/Collider.ts\");\n/* harmony import */ var _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./ClosestLineJumpTable */ \"./Collision/Colliders/ClosestLineJumpTable.ts\");\n/* harmony import */ var _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math/affine-matrix */ \"./Math/affine-matrix.ts\");\n/* harmony import */ var _Index__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Index */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math/util */ \"./Math/util.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * This is a circle collider for the excalibur rigid body physics simulation\n */\nclass CircleCollider extends _Collider__WEBPACK_IMPORTED_MODULE_0__.Collider {\n get worldPos() {\n return this._globalMatrix.getPosition();\n }\n /**\n * Get the radius of the circle\n */\n get radius() {\n var _a;\n if (this._radius) {\n return this._radius;\n }\n const tx = this._transform;\n const scale = (_a = tx === null || tx === void 0 ? void 0 : tx.globalScale) !== null && _a !== void 0 ? _a : _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.One;\n // This is a trade off, the alternative is retooling circles to support ellipse collisions\n return (this._radius = this._naturalRadius * Math.min(scale.x, scale.y));\n }\n /**\n * Set the radius of the circle\n */\n set radius(val) {\n var _a;\n const tx = this._transform;\n const scale = (_a = tx === null || tx === void 0 ? void 0 : tx.globalScale) !== null && _a !== void 0 ? _a : _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.One;\n // This is a trade off, the alternative is retooling circles to support ellipse collisions\n this._naturalRadius = val / Math.min(scale.x, scale.y);\n this._localBoundsDirty = true;\n this._radius = val;\n }\n constructor(options) {\n super();\n /**\n * Position of the circle relative to the collider, by default (0, 0).\n */\n this.offset = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n this._globalMatrix = _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_2__.AffineMatrix.identity();\n this._localBoundsDirty = true;\n this.offset = options.offset || _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n this.radius = options.radius || 0;\n this._globalMatrix.translate(this.offset.x, this.offset.y);\n }\n /**\n * Returns a clone of this shape, not associated with any collider\n */\n clone() {\n return new CircleCollider({\n offset: this.offset.clone(),\n radius: this.radius\n });\n }\n /**\n * Get the center of the collider in world coordinates\n */\n get center() {\n return this._globalMatrix.getPosition();\n }\n /**\n * Tests if a point is contained in this collider\n */\n contains(point) {\n var _a, _b;\n const pos = (_b = (_a = this._transform) === null || _a === void 0 ? void 0 : _a.pos) !== null && _b !== void 0 ? _b : this.offset;\n const distance = pos.distance(point);\n if (distance <= this.radius) {\n return true;\n }\n return false;\n }\n /**\n * Casts a ray at the Circle collider and returns the nearest point of collision\n * @param ray\n */\n rayCast(ray, max = Infinity) {\n var _a, _b;\n // https://en.wikipedia.org/wiki/Intersection_(geometry)#A_line_and_a_circle\n const c = this.center;\n const dir = ray.dir;\n const orig = ray.pos;\n const u = c.sub(orig);\n const u1 = dir.scale(u.dot(dir));\n const u2 = u.sub(u1);\n const d = u2.magnitude;\n if (d > this.radius) {\n return null;\n }\n else {\n // tangent case\n let toi = 0;\n if ((0,_Math_util__WEBPACK_IMPORTED_MODULE_3__.approximatelyEqual)(d, this.radius, 0.0001)) {\n toi = -dir.dot(orig.sub(c));\n if (toi > 0 && toi < max) {\n const point = ray.getPoint(toi);\n return {\n point,\n normal: point.sub(c).normalize(),\n collider: this,\n body: (_a = this.owner) === null || _a === void 0 ? void 0 : _a.get(_Index__WEBPACK_IMPORTED_MODULE_4__.BodyComponent),\n distance: toi\n };\n }\n return null;\n }\n else {\n // two point\n const discriminant = Math.sqrt(Math.pow(dir.dot(orig.sub(c)), 2) - Math.pow(orig.sub(c).distance(), 2) + Math.pow(this.radius, 2));\n const toi1 = -dir.dot(orig.sub(c)) + discriminant;\n const toi2 = -dir.dot(orig.sub(c)) - discriminant;\n const positiveToi = [];\n if (toi1 >= 0) {\n positiveToi.push(toi1);\n }\n if (toi2 >= 0) {\n positiveToi.push(toi2);\n }\n const minToi = Math.min(...positiveToi);\n if (minToi <= max) {\n const point = ray.getPoint(minToi);\n return {\n point,\n normal: point.sub(c).normalize(),\n collider: this,\n body: (_b = this.owner) === null || _b === void 0 ? void 0 : _b.get(_Index__WEBPACK_IMPORTED_MODULE_4__.BodyComponent),\n distance: minToi\n };\n }\n return null;\n }\n }\n }\n getClosestLineBetween(shape) {\n if (shape instanceof CircleCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_5__.ClosestLineJumpTable.CircleCircleClosestLine(this, shape);\n }\n else if (shape instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_6__.PolygonCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_5__.ClosestLineJumpTable.PolygonCircleClosestLine(shape, this).flip();\n }\n else if (shape instanceof _EdgeCollider__WEBPACK_IMPORTED_MODULE_7__.EdgeCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_5__.ClosestLineJumpTable.CircleEdgeClosestLine(this, shape).flip();\n }\n else {\n throw new Error(`Polygon could not collide with unknown CollisionShape ${typeof shape}`);\n }\n }\n /**\n * @inheritdoc\n */\n collide(collider) {\n if (collider instanceof CircleCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_8__.CollisionJumpTable.CollideCircleCircle(this, collider);\n }\n else if (collider instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_6__.PolygonCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_8__.CollisionJumpTable.CollideCirclePolygon(this, collider);\n }\n else if (collider instanceof _EdgeCollider__WEBPACK_IMPORTED_MODULE_7__.EdgeCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_8__.CollisionJumpTable.CollideCircleEdge(this, collider);\n }\n else {\n throw new Error(`Circle could not collide with unknown CollisionShape ${typeof collider}`);\n }\n }\n /**\n * Find the point on the collider furthest in the direction specified\n */\n getFurthestPoint(direction) {\n return this.center.add(direction.normalize().scale(this.radius));\n }\n /**\n * Find the local point on the shape in the direction specified\n * @param direction\n */\n getFurthestLocalPoint(direction) {\n const dir = direction.normalize();\n return dir.scale(this.radius);\n }\n /**\n * Get the axis aligned bounding box for the circle collider in world coordinates\n */\n get bounds() {\n return this.localBounds.transform(this._globalMatrix);\n }\n /**\n * Get the axis aligned bounding box for the circle collider in local coordinates\n */\n get localBounds() {\n if (this._localBoundsDirty) {\n this._localBounds = new _BoundingBox__WEBPACK_IMPORTED_MODULE_9__.BoundingBox(-this._naturalRadius, -this._naturalRadius, +this._naturalRadius, +this._naturalRadius);\n this._localBoundsDirty = false;\n }\n return this._localBounds;\n }\n /**\n * Get axis not implemented on circles, since there are infinite axis in a circle\n */\n get axes() {\n return [];\n }\n /**\n * Returns the moment of inertia of a circle given it's mass\n * https://en.wikipedia.org/wiki/List_of_moments_of_inertia\n */\n getInertia(mass) {\n return (mass * this.radius * this.radius) / 2;\n }\n /* istanbul ignore next */\n update(transform) {\n var _a;\n this._transform = transform;\n const globalMat = (_a = transform.matrix) !== null && _a !== void 0 ? _a : this._globalMatrix;\n globalMat.clone(this._globalMatrix);\n this._globalMatrix.translate(this.offset.x, this.offset.y);\n this._radius = undefined;\n }\n /**\n * Project the circle along a specified axis\n */\n project(axis) {\n const scalars = [];\n const point = this.center;\n const dotProduct = point.dot(axis);\n scalars.push(dotProduct);\n scalars.push(dotProduct + this.radius);\n scalars.push(dotProduct - this.radius);\n return new _Math_projection__WEBPACK_IMPORTED_MODULE_10__.Projection(Math.min.apply(Math, scalars), Math.max.apply(Math, scalars));\n }\n debug(ex, color, options) {\n var _a, _b, _c, _d;\n const { lineWidth } = { ...{ lineWidth: 1 }, ...options };\n const tx = this._transform;\n const scale = (_a = tx === null || tx === void 0 ? void 0 : tx.globalScale) !== null && _a !== void 0 ? _a : _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.One;\n const rotation = (_b = tx === null || tx === void 0 ? void 0 : tx.globalRotation) !== null && _b !== void 0 ? _b : 0;\n const pos = (_c = tx === null || tx === void 0 ? void 0 : tx.globalPos) !== null && _c !== void 0 ? _c : _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n ex.save();\n ex.translate(pos.x, pos.y);\n ex.rotate(rotation);\n ex.scale(scale.x, scale.y);\n ex.drawCircle((_d = this.offset) !== null && _d !== void 0 ? _d : _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero, this._naturalRadius, _Color__WEBPACK_IMPORTED_MODULE_11__.Color.Transparent, color, lineWidth);\n ex.restore();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/ClosestLineJumpTable.ts\":\n/*!*****************************************************!*\\\n !*** ./Collision/Colliders/ClosestLineJumpTable.ts ***!\n \\*****************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ClosestLineJumpTable: () => (/* binding */ ClosestLineJumpTable)\n/* harmony export */ });\n/* harmony import */ var _Math_line_segment__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/line-segment */ \"./Math/line-segment.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math_ray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math/ray */ \"./Math/ray.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/util */ \"./Math/util.ts\");\n\n\n\n\n/**\n * Finds the closest line segment between two given line segments.\n */\nfunction ClosestLine(line1, line2) {\n // https://math.stackexchange.com/questions/1993953/closest-points-between-2-lines-in-2d\n const EPSILON = 1e-9;\n const line1Dir = line1.dir();\n const line2Dir = line2.dir();\n const d1Squared = line1Dir.dot(line1Dir);\n const d2Squared = line2Dir.dot(line2Dir);\n if (d1Squared < EPSILON && d2Squared < EPSILON) {\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_0__.LineSegment(line1.begin, line2.begin);\n }\n if (d1Squared < EPSILON) {\n const t = (0,_Math_util__WEBPACK_IMPORTED_MODULE_1__.clamp)(line2Dir.dot(line1.begin.sub(line2.begin)) / d2Squared, 0, 1);\n const closestPoint = line2.begin.add(line2Dir.scale(t));\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_0__.LineSegment(line1.begin, closestPoint);\n }\n if (d2Squared < EPSILON) {\n const t = (0,_Math_util__WEBPACK_IMPORTED_MODULE_1__.clamp)(line1Dir.dot(line2.begin.sub(line1.begin)) / d1Squared, 0, 1);\n const closestPoint = line1.begin.add(line1Dir.scale(t));\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_0__.LineSegment(closestPoint, line2.begin);\n }\n const r = line1.begin.sub(line2.begin);\n const a = d1Squared;\n const e = d2Squared;\n const f = line2Dir.dot(r);\n const denom = a * e - Math.pow(line1Dir.dot(line2Dir), 2);\n let s = 0;\n let t = 0;\n if (Math.abs(denom) > EPSILON) {\n s = (0,_Math_util__WEBPACK_IMPORTED_MODULE_1__.clamp)((line1Dir.dot(line2Dir) * f - e * line1Dir.dot(r)) / denom, 0, 1);\n }\n else {\n // lines are parallel\n s = (0,_Math_util__WEBPACK_IMPORTED_MODULE_1__.clamp)(line1Dir.dot(r) / a, 0, 1);\n }\n if (Math.abs(e) > EPSILON) {\n t = (0,_Math_util__WEBPACK_IMPORTED_MODULE_1__.clamp)((line1Dir.dot(line2Dir) * s + f) / e, 0, 1);\n }\n else {\n // line2 is a degenerate point\n t = 0;\n }\n const closestPointOnLine1 = line1.begin.add(line1Dir.scale(s));\n const closestPointOnLine2 = line2.begin.add(line2Dir.scale(t));\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_0__.LineSegment(closestPointOnLine1, closestPointOnLine2);\n}\nconst ClosestLineJumpTable = {\n PolygonPolygonClosestLine(polygonA, polygonB) {\n const aSides = polygonA.getSides();\n const bSides = polygonB.getSides();\n let minDistance = Number.MAX_VALUE;\n let closestLine = null;\n for (let i = 0; i < aSides.length; i++) {\n for (let j = 0; j < bSides.length; j++) {\n const line = ClosestLine(aSides[i], bSides[j]);\n const distance = line.getLength();\n if (distance < minDistance) {\n minDistance = distance;\n closestLine = line;\n }\n }\n }\n return closestLine;\n },\n PolygonEdgeClosestLine(polygon, edge) {\n // Find the 2 closest faces on each polygon\n const otherWorldPos = edge.worldPos;\n const otherDirection = otherWorldPos.sub(polygon.worldPos);\n const rayTowardsOther = new _Math_ray__WEBPACK_IMPORTED_MODULE_2__.Ray(polygon.worldPos, otherDirection);\n const thisPoint = polygon.rayCast(rayTowardsOther).point.add(rayTowardsOther.dir.scale(0.1));\n const thisFace = polygon.getClosestFace(thisPoint);\n // L1 = P(s) = p0 + s * u, where s is time and p0 is the start of the line\n // L2 = Q(t) = q0 + t * v, where t is time and q0 is the start of the line\n const edgeLine = edge.asLine();\n return ClosestLine(thisFace.face, edgeLine);\n },\n PolygonCircleClosestLine(polygon, circle) {\n // https://math.stackexchange.com/questions/1919177/how-to-find-point-on-line-closest-to-sphere\n // Find the 2 closest faces on each polygon\n const otherWorldPos = circle.worldPos;\n const otherDirection = otherWorldPos.sub(polygon.worldPos);\n const rayTowardsOther = new _Math_ray__WEBPACK_IMPORTED_MODULE_2__.Ray(polygon.worldPos, otherDirection.normalize());\n const thisPoint = polygon.rayCast(rayTowardsOther).point.add(rayTowardsOther.dir.scale(0.1));\n const thisFace = polygon.getClosestFace(thisPoint);\n // L1 = P(s) = p0 + s * u, where s is time and p0 is the start of the line\n const p0 = thisFace.face.begin;\n const u = thisFace.face.getEdge();\n // Time of minimum distance\n let t = (u.x * (otherWorldPos.x - p0.x) + u.y * (otherWorldPos.y - p0.y)) / (u.x * u.x + u.y * u.y);\n // If time of minimum is past the edge clamp\n if (t > 1) {\n t = 1;\n }\n else if (t < 0) {\n t = 0;\n }\n // Minimum distance\n const d = Math.sqrt(Math.pow(p0.x + u.x * t - otherWorldPos.x, 2) + Math.pow(p0.y + u.y * t - otherWorldPos.y, 2)) - circle.radius;\n const circlex = ((p0.x + u.x * t - otherWorldPos.x) * circle.radius) / (circle.radius + d);\n const circley = ((p0.y + u.y * t - otherWorldPos.y) * circle.radius) / (circle.radius + d);\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_0__.LineSegment(u.scale(t).add(p0), new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(otherWorldPos.x + circlex, otherWorldPos.y + circley));\n },\n CircleCircleClosestLine(circleA, circleB) {\n // Find the 2 closest faces on each polygon\n const otherWorldPos = circleB.worldPos;\n const otherDirection = otherWorldPos.sub(circleA.worldPos);\n const thisWorldPos = circleA.worldPos;\n const thisDirection = thisWorldPos.sub(circleB.worldPos);\n const rayTowardsOther = new _Math_ray__WEBPACK_IMPORTED_MODULE_2__.Ray(circleA.worldPos, otherDirection);\n const rayTowardsThis = new _Math_ray__WEBPACK_IMPORTED_MODULE_2__.Ray(circleB.worldPos, thisDirection);\n const thisPoint = circleA.rayCast(rayTowardsOther);\n const otherPoint = circleB.rayCast(rayTowardsThis);\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_0__.LineSegment(thisPoint.point, otherPoint.point);\n },\n CircleEdgeClosestLine(circle, edge) {\n // https://math.stackexchange.com/questions/1919177/how-to-find-point-on-line-closest-to-sphere\n const circleWorldPos = circle.worldPos;\n // L1 = P(s) = p0 + s * u, where s is time and p0 is the start of the line\n const edgeLine = edge.asLine();\n const edgeStart = edgeLine.begin;\n const edgeVector = edgeLine.getEdge();\n const p0 = edgeStart;\n const u = edgeVector;\n // Time of minimum distance\n let t = (u.x * (circleWorldPos.x - p0.x) + u.y * (circleWorldPos.y - p0.y)) / (u.x * u.x + u.y * u.y);\n // If time of minimum is past the edge clamp to edge\n if (t > 1) {\n t = 1;\n }\n else if (t < 0) {\n t = 0;\n }\n // Minimum distance\n const d = Math.sqrt(Math.pow(p0.x + u.x * t - circleWorldPos.x, 2) + Math.pow(p0.y + u.y * t - circleWorldPos.y, 2)) - circle.radius;\n const circlex = ((p0.x + u.x * t - circleWorldPos.x) * circle.radius) / (circle.radius + d);\n const circley = ((p0.y + u.y * t - circleWorldPos.y) * circle.radius) / (circle.radius + d);\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_0__.LineSegment(u.scale(t).add(p0), new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(circleWorldPos.x + circlex, circleWorldPos.y + circley));\n },\n EdgeEdgeClosestLine(edgeA, edgeB) {\n // L1 = P(s) = p0 + s * u, where s is time and p0 is the start of the line\n const edgeLineA = edgeA.asLine();\n // L2 = Q(t) = q0 + t * v, where t is time and q0 is the start of the line\n const edgeLineB = edgeB.asLine();\n return ClosestLine(edgeLineA, edgeLineB);\n }\n};\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/Collider.ts\":\n/*!*****************************************!*\\\n !*** ./Collision/Colliders/Collider.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Collider: () => (/* binding */ Collider)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Id__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Id */ \"./Id.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n/**\n * A collision collider specifies the geometry that can detect when other collision colliders intersect\n * for the purposes of colliding 2 objects in excalibur.\n */\nclass Collider {\n constructor() {\n this.id = (0,_Id__WEBPACK_IMPORTED_MODULE_0__.createId)('collider', Collider._ID++);\n /**\n * Composite collider if any this collider is attached to\n *\n * **WARNING** do not tamper with this property\n */\n this.composite = null;\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_1__.EventEmitter();\n /**\n * Pixel offset of the collision collider relative to the collider, by default (0, 0) meaning the collider is positioned\n * on top of the collider.\n */\n this.offset = _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero;\n }\n /**\n * Returns a boolean indicating whether this body collided with\n * or was in stationary contact with\n * the body of the other {@apilink Collider}\n */\n touching(other) {\n const contact = this.collide(other);\n if (contact) {\n return true;\n }\n return false;\n }\n}\nCollider._ID = 0;\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/CollisionJumpTable.ts\":\n/*!***************************************************!*\\\n !*** ./Collision/Colliders/CollisionJumpTable.ts ***!\n \\***************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CollisionJumpTable: () => (/* binding */ CollisionJumpTable)\n/* harmony export */ });\n/* harmony import */ var _CircleCollider__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./CircleCollider */ \"./Collision/Colliders/CircleCollider.ts\");\n/* harmony import */ var _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Detection/CollisionContact */ \"./Collision/Detection/CollisionContact.ts\");\n/* harmony import */ var _PolygonCollider__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./PolygonCollider */ \"./Collision/Colliders/PolygonCollider.ts\");\n/* harmony import */ var _EdgeCollider__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./EdgeCollider */ \"./Collision/Colliders/EdgeCollider.ts\");\n/* harmony import */ var _SeparatingAxis__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./SeparatingAxis */ \"./Collision/Colliders/SeparatingAxis.ts\");\n/* harmony import */ var _Math_line_segment__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../Math/line-segment */ \"./Math/line-segment.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../EntityComponentSystem */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Detection_Pair__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Detection/Pair */ \"./Collision/Detection/Pair.ts\");\n/* harmony import */ var _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/affine-matrix */ \"./Math/affine-matrix.ts\");\n\n\n\n\n\n\n\n\n\n\nconst ScratchZero = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero; // TODO constant vector\nconst ScratchNormal = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero; // TODO constant vector\nconst ScratchMatrix = _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_1__.AffineMatrix.identity();\nconst CollisionJumpTable = {\n CollideCircleCircle(circleA, circleB) {\n const circleAPos = circleA.worldPos;\n const circleBPos = circleB.worldPos;\n const combinedRadius = circleA.radius + circleB.radius;\n const distance = circleAPos.distance(circleBPos);\n if (distance > combinedRadius) {\n return [];\n }\n // negative means overlap\n const separation = combinedRadius - distance;\n // Normal points from A -> B\n const normal = circleBPos.sub(circleAPos).normalize();\n const tangent = normal.perpendicular();\n const mvt = normal.scale(separation);\n const point = circleA.getFurthestPoint(normal);\n const local = circleA.getFurthestLocalPoint(normal);\n const info = {\n collider: circleA,\n separation,\n axis: normal,\n point: point\n };\n return [new _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_2__.CollisionContact(circleA, circleB, mvt, normal, tangent, [point], [local], info)];\n },\n CollideCirclePolygon(circle, polygon) {\n var _a, _b;\n let minAxis = _SeparatingAxis__WEBPACK_IMPORTED_MODULE_3__.SeparatingAxis.findCirclePolygonSeparation(circle, polygon);\n if (!minAxis) {\n return [];\n }\n // make sure that the minAxis is pointing away from circle\n const sameDir = minAxis.dot(polygon.center.sub(circle.center));\n minAxis = sameDir < 0 ? minAxis.negate() : minAxis;\n const point = circle.getFurthestPoint(minAxis);\n const xf = (_b = (_a = circle.owner) === null || _a === void 0 ? void 0 : _a.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__.TransformComponent)) !== null && _b !== void 0 ? _b : new _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__.TransformComponent();\n const local = xf.applyInverse(point);\n const normal = minAxis.normalize();\n const info = {\n collider: circle,\n separation: -minAxis.magnitude,\n axis: normal,\n point: point,\n localPoint: local,\n side: polygon.findSide(normal.negate()),\n localSide: polygon.findLocalSide(normal.negate())\n };\n return [new _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_2__.CollisionContact(circle, polygon, minAxis, normal, normal.perpendicular(), [point], [local], info)];\n },\n CollideCircleEdge(circle, edge) {\n // TODO not sure this actually abides by local/world collisions\n // Are edge.begin and edge.end local space or world space? I think they should be local\n // center of the circle in world pos\n const cc = circle.center;\n // vector in the direction of the edge\n const edgeWorld = edge.asLine();\n const e = edgeWorld.end.sub(edgeWorld.begin);\n // amount of overlap with the circle's center along the edge direction\n const u = e.dot(edgeWorld.end.sub(cc));\n const v = e.dot(cc.sub(edgeWorld.begin));\n const side = edge.asLine();\n const localSide = edge.asLocalLine();\n // Potential region A collision (circle is on the left side of the edge, before the beginning)\n if (v <= 0) {\n const da = edgeWorld.begin.sub(cc);\n const dda = da.dot(da); // quick and dirty way of calc'n distance in r^2 terms saves some sqrts\n // save some sqrts\n if (dda > circle.radius * circle.radius) {\n return []; // no collision\n }\n const normal = da.normalize();\n const separation = circle.radius - Math.sqrt(dda);\n const info = {\n collider: circle,\n separation: separation,\n axis: normal,\n point: side.begin,\n side: side,\n localSide: localSide\n };\n return [\n new _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_2__.CollisionContact(circle, edge, normal.scale(separation), normal, normal.perpendicular(), [side.begin], [localSide.begin], info)\n ];\n }\n // Potential region B collision (circle is on the right side of the edge, after the end)\n if (u <= 0) {\n const db = edgeWorld.end.sub(cc);\n const ddb = db.dot(db);\n if (ddb > circle.radius * circle.radius) {\n return [];\n }\n const normal = db.normalize();\n const separation = circle.radius - Math.sqrt(ddb);\n const info = {\n collider: circle,\n separation: separation,\n axis: normal,\n point: side.end,\n side: side,\n localSide: localSide\n };\n return [\n new _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_2__.CollisionContact(circle, edge, normal.scale(separation), normal, normal.perpendicular(), [side.end], [localSide.end], info)\n ];\n }\n // Otherwise potential region AB collision (circle is in the middle of the edge between the beginning and end)\n const den = e.dot(e);\n const pointOnEdge = edgeWorld.begin\n .scale(u)\n .add(edgeWorld.end.scale(v))\n .scale(1 / den);\n const d = cc.sub(pointOnEdge);\n const dd = d.dot(d);\n if (dd > circle.radius * circle.radius) {\n return []; // no collision\n }\n let normal = e.perpendicular();\n // flip correct direction\n if (normal.dot(cc.sub(edgeWorld.begin)) < 0) {\n normal.x = -normal.x;\n normal.y = -normal.y;\n }\n normal = normal.normalize();\n const separation = circle.radius - Math.sqrt(dd);\n const mvt = normal.scale(separation);\n const info = {\n collider: circle,\n separation: separation,\n axis: normal,\n point: pointOnEdge,\n side: side,\n localSide: localSide\n };\n return [\n new _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_2__.CollisionContact(circle, edge, mvt, normal.negate(), normal.negate().perpendicular(), [pointOnEdge], [pointOnEdge.sub(edge.worldPos)], info)\n ];\n },\n CollideEdgeEdge() {\n // Edge-edge collision doesn't make sense\n return [];\n },\n CollidePolygonEdge(polygon, edge) {\n var _a;\n const pc = polygon.center;\n const ec = edge.center;\n const dir = ec.sub(pc).normalize();\n // build a temporary polygon from the edge to use SAT\n const linePoly = new _PolygonCollider__WEBPACK_IMPORTED_MODULE_5__.PolygonCollider({\n points: [edge.begin, edge.end, edge.end.add(dir.scale(100)), edge.begin.add(dir.scale(100))],\n offset: edge.offset\n });\n linePoly.owner = edge.owner;\n const tx = (_a = edge.owner) === null || _a === void 0 ? void 0 : _a.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__.TransformComponent);\n if (tx) {\n linePoly.update(edge.owner.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__.TransformComponent).get());\n }\n // Gross hack but poly-poly works well\n const contact = this.CollidePolygonPolygon(polygon, linePoly);\n if (contact.length) {\n // Fudge the contact back to edge\n contact[0].colliderB = edge;\n contact[0].id = _Detection_Pair__WEBPACK_IMPORTED_MODULE_6__.Pair.calculatePairHash(polygon.id, edge.id);\n }\n return contact;\n },\n CollidePolygonPolygon(polyA, polyB) {\n // Multi contact from SAT\n // https://gamedev.stackexchange.com/questions/111390/multiple-contacts-for-sat-collision-detection\n // do a SAT test to find a min axis if it exists\n const separationA = _SeparatingAxis__WEBPACK_IMPORTED_MODULE_3__.SeparatingAxis.findPolygonPolygonSeparation(polyA, polyB);\n // If there is no overlap from boxA's perspective we can end early\n if (separationA.separation > 0) {\n return [];\n }\n const separationB = _SeparatingAxis__WEBPACK_IMPORTED_MODULE_3__.SeparatingAxis.findPolygonPolygonSeparation(polyB, polyA);\n // If there is no overlap from boxB's perspective exit now\n if (separationB.separation > 0) {\n return [];\n }\n // Separations are both negative, we want to pick the least negative (minimal movement)\n const separation = separationA.separation > separationB.separation ? separationA : separationB;\n // The incident side is the most opposite from the axes of collision on the other collider\n const other = separation.collider === polyA ? polyB : polyA;\n const main = separation.collider === polyA ? polyA : polyB;\n const toIncidentFrame = other.transform.inverse.multiply(main.transform.matrix, ScratchMatrix);\n const toIncidentFrameRotation = toIncidentFrame.getRotation();\n const referenceEdgeNormal = main.normals[separation.sideId].rotate(toIncidentFrameRotation, ScratchZero, ScratchNormal);\n let minEdge = Number.MAX_VALUE;\n let incidentEdgeIndex = 0;\n for (let i = 0; i < other.normals.length; i++) {\n const value = referenceEdgeNormal.dot(other.normals[i]);\n if (value < minEdge) {\n minEdge = value;\n incidentEdgeIndex = i;\n }\n }\n // Clip incident side by the perpendicular lines at each end of the reference side\n // https://en.wikipedia.org/wiki/Sutherland%E2%80%93Hodgman_algorithm\n const referenceSide = separation.localSide.transform(toIncidentFrame);\n const referenceDirection = separation.localAxis.perpendicular().negate().rotate(toIncidentFrameRotation);\n const incidentSide = new _Math_line_segment__WEBPACK_IMPORTED_MODULE_7__.LineSegment(other.points[incidentEdgeIndex], other.points[(incidentEdgeIndex + 1) % other.points.length]);\n const clipRight = incidentSide.clip(referenceDirection.negate(), -referenceDirection.dot(referenceSide.begin), false);\n let clipLeft = null;\n if (clipRight) {\n clipLeft = clipRight.clip(referenceDirection, referenceDirection.dot(referenceSide.end), false);\n }\n if (clipLeft) {\n const localPoints = [];\n const points = [];\n const clipPoints = clipLeft.getPoints();\n for (let i = 0; i < clipPoints.length; i++) {\n const p = clipPoints[i];\n if (referenceSide.below(p)) {\n localPoints.push(p);\n points.push(other.transform.apply(p));\n }\n }\n let normal = separation.axis;\n let tangent = normal.perpendicular();\n // Point Contact A -> B\n if (polyB.center.sub(polyA.center).dot(normal) < 0) {\n normal = normal.negate();\n tangent = normal.perpendicular();\n }\n return [new _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_2__.CollisionContact(polyA, polyB, normal.scale(-separation.separation), normal, tangent, points, localPoints, separation)];\n }\n return [];\n },\n FindContactSeparation(contact, localPoint) {\n var _a, _b, _c, _d;\n const shapeA = contact.colliderA;\n const txA = (_b = (_a = contact.bodyA) === null || _a === void 0 ? void 0 : _a.transform) !== null && _b !== void 0 ? _b : new _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__.TransformComponent();\n const shapeB = contact.colliderB;\n const txB = (_d = (_c = contact.bodyB) === null || _c === void 0 ? void 0 : _c.transform) !== null && _d !== void 0 ? _d : new _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_4__.TransformComponent();\n // both are circles\n if (shapeA instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_8__.CircleCollider && shapeB instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_8__.CircleCollider) {\n const combinedRadius = shapeA.radius + shapeB.radius;\n const distance = txA.pos.distance(txB.pos);\n const separation = combinedRadius - distance;\n return -separation;\n }\n // both are polygons\n if (shapeA instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_5__.PolygonCollider && shapeB instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_5__.PolygonCollider) {\n if (contact.info.localSide) {\n let side;\n let worldPoint;\n if (contact.info.collider === shapeA) {\n side = new _Math_line_segment__WEBPACK_IMPORTED_MODULE_7__.LineSegment(txA.apply(contact.info.localSide.begin), txA.apply(contact.info.localSide.end));\n worldPoint = txB.apply(localPoint);\n }\n else {\n side = new _Math_line_segment__WEBPACK_IMPORTED_MODULE_7__.LineSegment(txB.apply(contact.info.localSide.begin), txB.apply(contact.info.localSide.end));\n worldPoint = txA.apply(localPoint);\n }\n return side.distanceToPoint(worldPoint, true);\n }\n }\n // polygon v circle\n if ((shapeA instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_5__.PolygonCollider && shapeB instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_8__.CircleCollider) ||\n (shapeB instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_5__.PolygonCollider && shapeA instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_8__.CircleCollider)) {\n const worldPoint = txA.apply(localPoint);\n if (contact.info.side) {\n return contact.info.side.distanceToPoint(worldPoint, true);\n }\n }\n // polygon v edge\n if ((shapeA instanceof _EdgeCollider__WEBPACK_IMPORTED_MODULE_9__.EdgeCollider && shapeB instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_5__.PolygonCollider) ||\n (shapeB instanceof _EdgeCollider__WEBPACK_IMPORTED_MODULE_9__.EdgeCollider && shapeA instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_5__.PolygonCollider)) {\n let worldPoint;\n if (contact.info.collider === shapeA) {\n worldPoint = txB.apply(localPoint);\n }\n else {\n worldPoint = txA.apply(localPoint);\n }\n if (contact.info.side) {\n return contact.info.side.distanceToPoint(worldPoint, true);\n }\n }\n // circle v edge\n if ((shapeA instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_8__.CircleCollider && shapeB instanceof _EdgeCollider__WEBPACK_IMPORTED_MODULE_9__.EdgeCollider) ||\n (shapeB instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_8__.CircleCollider && shapeA instanceof _EdgeCollider__WEBPACK_IMPORTED_MODULE_9__.EdgeCollider)) {\n // Local point is always on the edge which is always shapeB\n const worldPoint = txB.apply(localPoint);\n let circlePoint;\n if (shapeA instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_8__.CircleCollider) {\n circlePoint = shapeA.getFurthestPoint(contact.normal);\n }\n const dist = worldPoint.distance(circlePoint);\n if (contact.info.side) {\n return dist > 0 ? -dist : 0;\n }\n }\n return 0;\n }\n};\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/CompositeCollider.ts\":\n/*!**************************************************!*\\\n !*** ./Collision/Colliders/CompositeCollider.ts ***!\n \\**************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CompositeCollider: () => (/* binding */ CompositeCollider)\n/* harmony export */ });\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../.. */ \"./Util/Util.ts\");\n/* harmony import */ var _Detection_Pair__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Detection/Pair */ \"./Collision/Detection/Pair.ts\");\n/* harmony import */ var _Math_projection__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../Math/projection */ \"./Math/projection.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Detection_DynamicTree__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Detection/DynamicTree */ \"./Collision/Detection/DynamicTree.ts\");\n/* harmony import */ var _Detection_DynamicTreeCollisionProcessor__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Detection/DynamicTreeCollisionProcessor */ \"./Collision/Detection/DynamicTreeCollisionProcessor.ts\");\n/* harmony import */ var _Collider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Collider */ \"./Collision/Colliders/Collider.ts\");\n/* harmony import */ var _PhysicsConfig__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../PhysicsConfig */ \"./Collision/PhysicsConfig.ts\");\n\n\n\n\n\n\n\n\n\nclass CompositeCollider extends _Collider__WEBPACK_IMPORTED_MODULE_0__.Collider {\n /**\n * Treat composite collider's member colliders as either separate colliders for the purposes of onCollisionStart/onCollision\n * or as a single collider together.\n *\n * This property can be overridden on individual {@apilink CompositeColliders}.\n *\n * For composites without gaps or small groups of colliders, you probably want 'together'\n *\n * For composites with deliberate gaps, like a platforming level layout, you probably want 'separate'\n *\n * Default is 'together' if unset\n */\n set compositeStrategy(value) {\n this._compositeStrategy = value;\n }\n get compositeStrategy() {\n return this._compositeStrategy;\n }\n constructor(colliders) {\n super();\n this._collisionProcessor = new _Detection_DynamicTreeCollisionProcessor__WEBPACK_IMPORTED_MODULE_1__.DynamicTreeCollisionProcessor({\n ...(0,_PhysicsConfig__WEBPACK_IMPORTED_MODULE_2__.getDefaultPhysicsConfig)()\n });\n this._dynamicAABBTree = new _Detection_DynamicTree__WEBPACK_IMPORTED_MODULE_3__.DynamicTree({\n boundsPadding: 5,\n velocityMultiplier: 2\n });\n this._colliders = [];\n for (const c of colliders) {\n this.addCollider(c);\n }\n }\n clearColliders() {\n this._colliders = [];\n }\n addCollider(collider) {\n let colliders;\n if (collider instanceof CompositeCollider) {\n colliders = collider.getColliders();\n colliders.forEach((c) => c.offset.addEqual(collider.offset));\n }\n else {\n colliders = [collider];\n }\n // Flatten composites\n for (const c of colliders) {\n c.events.pipe(this.events);\n c.composite = this;\n this._colliders.push(c);\n this._collisionProcessor.track(c);\n this._dynamicAABBTree.trackCollider(c);\n }\n }\n removeCollider(collider) {\n collider.events.pipe(this.events);\n collider.composite = null;\n ___WEBPACK_IMPORTED_MODULE_4__.removeItemFromArray(collider, this._colliders);\n this._collisionProcessor.untrack(collider);\n this._dynamicAABBTree.untrackCollider(collider);\n }\n getColliders() {\n return this._colliders;\n }\n get worldPos() {\n var _a, _b;\n return ((_b = (_a = this._transform) === null || _a === void 0 ? void 0 : _a.pos) !== null && _b !== void 0 ? _b : _Math_vector__WEBPACK_IMPORTED_MODULE_5__.Vector.Zero).add(this.offset);\n }\n get center() {\n var _a, _b;\n return ((_b = (_a = this._transform) === null || _a === void 0 ? void 0 : _a.pos) !== null && _b !== void 0 ? _b : _Math_vector__WEBPACK_IMPORTED_MODULE_5__.Vector.Zero).add(this.offset);\n }\n get bounds() {\n var _a, _b;\n // TODO cache this\n const colliders = this.getColliders();\n const results = colliders.reduce((acc, collider) => acc.combine(collider.bounds), (_b = (_a = colliders[0]) === null || _a === void 0 ? void 0 : _a.bounds) !== null && _b !== void 0 ? _b : new _BoundingBox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox().translate(this.worldPos));\n return results.translate(this.offset);\n }\n get localBounds() {\n var _a, _b;\n // TODO cache this\n const colliders = this.getColliders();\n const results = colliders.reduce((acc, collider) => acc.combine(collider.localBounds), (_b = (_a = colliders[0]) === null || _a === void 0 ? void 0 : _a.localBounds) !== null && _b !== void 0 ? _b : new _BoundingBox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox());\n return results;\n }\n get axes() {\n // TODO cache this\n const colliders = this.getColliders();\n let axes = [];\n for (const collider of colliders) {\n axes = axes.concat(collider.axes);\n }\n return axes;\n }\n getFurthestPoint(direction) {\n const colliders = this.getColliders();\n const furthestPoints = [];\n for (const collider of colliders) {\n furthestPoints.push(collider.getFurthestPoint(direction));\n }\n // Pick best point from all colliders\n let bestPoint = furthestPoints[0];\n let maxDistance = -Number.MAX_VALUE;\n for (const point of furthestPoints) {\n const distance = point.dot(direction);\n if (distance > maxDistance) {\n bestPoint = point;\n maxDistance = distance;\n }\n }\n return bestPoint;\n }\n getInertia(mass) {\n const colliders = this.getColliders();\n let totalInertia = 0;\n for (const collider of colliders) {\n totalInertia += collider.getInertia(mass);\n }\n return totalInertia;\n }\n collide(other) {\n let otherColliders = [other];\n if (other instanceof CompositeCollider) {\n otherColliders = other.getColliders();\n }\n const pairs = [];\n for (const c of otherColliders) {\n this._dynamicAABBTree.query(c, (potentialCollider) => {\n pairs.push(new _Detection_Pair__WEBPACK_IMPORTED_MODULE_7__.Pair(c, potentialCollider));\n return false;\n });\n }\n let contacts = [];\n for (const p of pairs) {\n contacts = contacts.concat(p.collide());\n }\n return contacts;\n }\n getClosestLineBetween(other) {\n const colliders = this.getColliders();\n const lines = [];\n if (other instanceof CompositeCollider) {\n const otherColliders = other.getColliders();\n for (const colliderA of colliders) {\n for (const colliderB of otherColliders) {\n const maybeLine = colliderA.getClosestLineBetween(colliderB);\n if (maybeLine) {\n lines.push(maybeLine);\n }\n }\n }\n }\n else {\n for (const collider of colliders) {\n const maybeLine = other.getClosestLineBetween(collider);\n if (maybeLine) {\n lines.push(maybeLine);\n }\n }\n }\n if (lines.length) {\n let minLength = lines[0].getLength();\n let minLine = lines[0];\n for (const line of lines) {\n const length = line.getLength();\n if (length < minLength) {\n minLength = length;\n minLine = line;\n }\n }\n return minLine;\n }\n return null;\n }\n contains(point) {\n const colliders = this.getColliders();\n for (const collider of colliders) {\n if (collider.contains(point)) {\n return true;\n }\n }\n return false;\n }\n rayCast(ray, max) {\n const colliders = this.getColliders();\n const hits = [];\n for (const collider of colliders) {\n const hit = collider.rayCast(ray, max);\n if (hit) {\n hits.push(hit);\n }\n }\n if (hits.length) {\n let minHit = hits[0];\n let minDistance = minHit.point.dot(ray.dir);\n for (const hit of hits) {\n const distance = ray.dir.dot(hit.point);\n if (distance < minDistance) {\n minHit = hit;\n minDistance = distance;\n }\n }\n return minHit;\n }\n return null;\n }\n project(axis) {\n const colliders = this.getColliders();\n const projections = [];\n for (const collider of colliders) {\n const proj = collider.project(axis);\n if (proj) {\n projections.push(proj);\n }\n }\n // Merge all proj's on the same axis\n if (projections.length) {\n const newProjection = new _Math_projection__WEBPACK_IMPORTED_MODULE_8__.Projection(projections[0].min, projections[0].max);\n for (const proj of projections) {\n newProjection.min = Math.min(proj.min, newProjection.min);\n newProjection.max = Math.max(proj.max, newProjection.max);\n }\n return newProjection;\n }\n return null;\n }\n update(transform) {\n if (transform) {\n const colliders = this.getColliders();\n for (const collider of colliders) {\n collider.owner = this.owner;\n collider.update(transform);\n }\n }\n }\n debug(ex, color, options) {\n const colliders = this.getColliders();\n ex.save();\n ex.translate(this.offset.x, this.offset.y);\n for (const collider of colliders) {\n collider.debug(ex, color, options);\n }\n ex.restore();\n }\n clone() {\n const result = new CompositeCollider(this._colliders.map((c) => c.clone()));\n result.offset = this.offset.clone();\n return result;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/EdgeCollider.ts\":\n/*!*********************************************!*\\\n !*** ./Collision/Colliders/EdgeCollider.ts ***!\n \\*********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EdgeCollider: () => (/* binding */ EdgeCollider)\n/* harmony export */ });\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./CollisionJumpTable */ \"./Collision/Colliders/CollisionJumpTable.ts\");\n/* harmony import */ var _CircleCollider__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./CircleCollider */ \"./Collision/Colliders/CircleCollider.ts\");\n/* harmony import */ var _PolygonCollider__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./PolygonCollider */ \"./Collision/Colliders/PolygonCollider.ts\");\n/* harmony import */ var _Math_projection__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../Math/projection */ \"./Math/projection.ts\");\n/* harmony import */ var _Math_line_segment__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../Math/line-segment */ \"./Math/line-segment.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Collider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Collider */ \"./Collision/Colliders/Collider.ts\");\n/* harmony import */ var _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./ClosestLineJumpTable */ \"./Collision/Colliders/ClosestLineJumpTable.ts\");\n/* harmony import */ var _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/affine-matrix */ \"./Math/affine-matrix.ts\");\n/* harmony import */ var _Index__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Index */ \"./Collision/BodyComponent.ts\");\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Edge is a single line collider to create collisions with a single line.\n */\nclass EdgeCollider extends _Collider__WEBPACK_IMPORTED_MODULE_0__.Collider {\n constructor(options) {\n var _a;\n super();\n this._globalMatrix = _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_1__.AffineMatrix.identity();\n this.begin = options.begin || _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero;\n this.end = options.end || _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero;\n this.offset = (_a = options.offset) !== null && _a !== void 0 ? _a : _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero;\n }\n /**\n * Returns a clone of this Edge, not associated with any collider\n */\n clone() {\n return new EdgeCollider({\n begin: this.begin.clone(),\n end: this.end.clone()\n });\n }\n get worldPos() {\n var _a;\n const tx = this._transform;\n return (_a = tx === null || tx === void 0 ? void 0 : tx.globalPos.add(this.offset)) !== null && _a !== void 0 ? _a : this.offset;\n }\n /**\n * Get the center of the collision area in world coordinates\n */\n get center() {\n const begin = this._getTransformedBegin();\n const end = this._getTransformedEnd();\n const pos = begin.average(end);\n return pos;\n }\n _getTransformedBegin() {\n return this._globalMatrix.multiply(this.begin);\n }\n _getTransformedEnd() {\n return this._globalMatrix.multiply(this.end);\n }\n /**\n * Returns the slope of the line in the form of a vector\n */\n getSlope() {\n const begin = this._getTransformedBegin();\n const end = this._getTransformedEnd();\n const distance = begin.distance(end);\n return end.sub(begin).scale(1 / distance);\n }\n /**\n * Returns the length of the line segment in pixels\n */\n getLength() {\n const begin = this._getTransformedBegin();\n const end = this._getTransformedEnd();\n const distance = begin.distance(end);\n return distance;\n }\n /**\n * Tests if a point is contained in this collision area\n */\n contains() {\n return false;\n }\n /**\n * @inheritdoc\n */\n rayCast(ray, max = Infinity) {\n var _a;\n const numerator = this._getTransformedBegin().sub(ray.pos);\n // Test is line and ray are parallel and non intersecting\n if (ray.dir.cross(this.getSlope()) === 0 && numerator.cross(ray.dir) !== 0) {\n return null;\n }\n // Lines are parallel\n const divisor = ray.dir.cross(this.getSlope());\n if (divisor === 0) {\n return null;\n }\n const t = numerator.cross(this.getSlope()) / divisor;\n if (t >= 0 && t <= max) {\n const u = numerator.cross(ray.dir) / divisor / this.getLength();\n if (u >= 0 && u <= 1) {\n return {\n distance: t,\n normal: this.asLine().normal(),\n collider: this,\n body: (_a = this.owner) === null || _a === void 0 ? void 0 : _a.get(_Index__WEBPACK_IMPORTED_MODULE_3__.BodyComponent),\n point: ray.getPoint(t)\n };\n }\n }\n return null;\n }\n /**\n * Returns the closes line between this and another collider, from this -> collider\n * @param shape\n */\n getClosestLineBetween(shape) {\n if (shape instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_4__.CircleCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_5__.ClosestLineJumpTable.CircleEdgeClosestLine(shape, this);\n }\n else if (shape instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_6__.PolygonCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_5__.ClosestLineJumpTable.PolygonEdgeClosestLine(shape, this).flip();\n }\n else if (shape instanceof EdgeCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_5__.ClosestLineJumpTable.EdgeEdgeClosestLine(this, shape);\n }\n else {\n throw new Error(`Polygon could not collide with unknown CollisionShape ${typeof shape}`);\n }\n }\n /**\n * @inheritdoc\n */\n collide(shape) {\n if (shape instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_4__.CircleCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_7__.CollisionJumpTable.CollideCircleEdge(shape, this);\n }\n else if (shape instanceof _PolygonCollider__WEBPACK_IMPORTED_MODULE_6__.PolygonCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_7__.CollisionJumpTable.CollidePolygonEdge(shape, this);\n }\n else if (shape instanceof EdgeCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_7__.CollisionJumpTable.CollideEdgeEdge();\n }\n else {\n throw new Error(`Edge could not collide with unknown CollisionShape ${typeof shape}`);\n }\n }\n /**\n * Find the point on the collider furthest in the direction specified\n */\n getFurthestPoint(direction) {\n const transformedBegin = this._getTransformedBegin();\n const transformedEnd = this._getTransformedEnd();\n if (direction.dot(transformedBegin) > 0) {\n return transformedBegin;\n }\n else {\n return transformedEnd;\n }\n }\n _boundsFromBeginEnd(begin, end, padding = 10) {\n // A perfectly vertical or horizontal edge would have a bounds 0 width or height\n // this causes problems for the collision system so we give them some padding\n return new _BoundingBox__WEBPACK_IMPORTED_MODULE_8__.BoundingBox(Math.min(begin.x, end.x) - padding, Math.min(begin.y, end.y) - padding, Math.max(begin.x, end.x) + padding, Math.max(begin.y, end.y) + padding);\n }\n /**\n * Get the axis aligned bounding box for the edge collider in world space\n */\n get bounds() {\n const transformedBegin = this._getTransformedBegin();\n const transformedEnd = this._getTransformedEnd();\n return this._boundsFromBeginEnd(transformedBegin, transformedEnd);\n }\n /**\n * Get the axis aligned bounding box for the edge collider in local space\n */\n get localBounds() {\n return this._boundsFromBeginEnd(this.begin, this.end);\n }\n /**\n * Returns this edge represented as a line in world coordinates\n */\n asLine() {\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_9__.LineSegment(this._getTransformedBegin(), this._getTransformedEnd());\n }\n /**\n * Return this edge as a line in local line coordinates (relative to the position)\n */\n asLocalLine() {\n return new _Math_line_segment__WEBPACK_IMPORTED_MODULE_9__.LineSegment(this.begin, this.end);\n }\n /**\n * Get the axis associated with the edge\n */\n get axes() {\n const e = this._getTransformedEnd().sub(this._getTransformedBegin());\n const edgeNormal = e.normal();\n const axes = [];\n axes.push(edgeNormal);\n axes.push(edgeNormal.negate());\n axes.push(edgeNormal.normal());\n axes.push(edgeNormal.normal().negate());\n return axes;\n }\n /**\n * Get the moment of inertia for an edge\n * https://en.wikipedia.org/wiki/List_of_moments_of_inertia\n */\n getInertia(mass) {\n const length = this.end.sub(this.begin).distance() / 2;\n return mass * length * length;\n }\n /**\n * @inheritdoc\n */\n update(transform) {\n var _a;\n this._transform = transform;\n const globalMat = (_a = transform.matrix) !== null && _a !== void 0 ? _a : this._globalMatrix;\n globalMat.clone(this._globalMatrix);\n this._globalMatrix.translate(this.offset.x, this.offset.y);\n }\n /**\n * Project the edge along a specified axis\n */\n project(axis) {\n const scalars = [];\n const points = [this._getTransformedBegin(), this._getTransformedEnd()];\n const len = points.length;\n for (let i = 0; i < len; i++) {\n scalars.push(points[i].dot(axis));\n }\n return new _Math_projection__WEBPACK_IMPORTED_MODULE_10__.Projection(Math.min.apply(Math, scalars), Math.max.apply(Math, scalars));\n }\n debug(ex, color) {\n const begin = this._getTransformedBegin();\n const end = this._getTransformedEnd();\n ex.drawLine(begin, end, color, 2);\n ex.drawCircle(begin, 2, color);\n ex.drawCircle(end, 2, color);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/PolygonCollider.ts\":\n/*!************************************************!*\\\n !*** ./Collision/Colliders/PolygonCollider.ts ***!\n \\************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PolygonCollider: () => (/* binding */ PolygonCollider)\n/* harmony export */ });\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _EdgeCollider__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./EdgeCollider */ \"./Collision/Colliders/EdgeCollider.ts\");\n/* harmony import */ var _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./CollisionJumpTable */ \"./Collision/Colliders/CollisionJumpTable.ts\");\n/* harmony import */ var _CircleCollider__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./CircleCollider */ \"./Collision/Colliders/CircleCollider.ts\");\n/* harmony import */ var _Math_projection__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../Math/projection */ \"./Math/projection.ts\");\n/* harmony import */ var _Math_line_segment__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../Math/line-segment */ \"./Math/line-segment.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math_ray__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../Math/ray */ \"./Math/ray.ts\");\n/* harmony import */ var _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./ClosestLineJumpTable */ \"./Collision/Colliders/ClosestLineJumpTable.ts\");\n/* harmony import */ var _Collider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Collider */ \"./Collision/Colliders/Collider.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../.. */ \"./Util/Log.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../.. */ \"./Math/util.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../.. */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../.. */ \"./Graphics/Debug.ts\");\n/* harmony import */ var _CompositeCollider__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var _Shape__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Shape */ \"./Collision/Colliders/Shape.ts\");\n/* harmony import */ var _Math_transform__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math/transform */ \"./Math/transform.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Polygon collider for detecting collisions\n */\nclass PolygonCollider extends _Collider__WEBPACK_IMPORTED_MODULE_0__.Collider {\n flagDirty() {\n this._localBoundsDirty = true;\n this._localSidesDirty = true;\n this._transformedPointsDirty = true;\n this._sidesDirty = true;\n }\n get normals() {\n return this._normals;\n }\n /**\n * Points in the polygon in order around the perimeter in local coordinates. These are relative from the body transform position.\n * Excalibur stores these in counter-clockwise order\n */\n set points(points) {\n if (points.length < 3) {\n throw new Error('PolygonCollider cannot be created with less that 3 points');\n }\n this._points = points;\n this._checkAndUpdateWinding(this._points);\n this._calculateNormals();\n this.flagDirty();\n }\n _calculateNormals() {\n const normals = [];\n for (let i = 0; i < this._points.length; i++) {\n normals.push(this._points[(i + 1) % this._points.length].sub(this._points[i]).normal());\n }\n this._normals = normals;\n }\n /**\n * Points in the polygon in order around the perimeter in local coordinates. These are relative from the body transform position.\n * Excalibur stores these in counter-clockwise order\n */\n get points() {\n return this._points;\n }\n get transform() {\n return this._transform;\n }\n constructor(options) {\n var _a;\n super();\n this._logger = ___WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this._transform = new _Math_transform__WEBPACK_IMPORTED_MODULE_2__.Transform();\n this._transformedPoints = [];\n this._sides = [];\n this._localSides = [];\n this._transformedPointsDirty = true;\n this._sidesDirty = true;\n this._localSidesDirty = true;\n this._localBoundsDirty = true;\n this.offset = (_a = options.offset) !== null && _a !== void 0 ? _a : _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero;\n this._transform.pos.x += this.offset.x;\n this._transform.pos.y += this.offset.y;\n this.points = options.points;\n if (!this.isConvex()) {\n if (!options.suppressConvexWarning) {\n this._logger.warn('Excalibur only supports convex polygon colliders and will not behave properly.' +\n 'Call PolygonCollider.triangulate() to build a new collider composed of smaller convex triangles');\n }\n }\n // calculate initial transformation\n this._calculateTransformation();\n }\n _checkAndUpdateWinding(points) {\n const counterClockwise = this._isCounterClockwiseWinding(points);\n if (!counterClockwise) {\n points.reverse();\n }\n }\n _isCounterClockwiseWinding(points) {\n // https://stackoverflow.com/a/1165943\n let sum = 0;\n for (let i = 0; i < points.length; i++) {\n sum += (points[(i + 1) % points.length].x - points[i].x) * (points[(i + 1) % points.length].y + points[i].y);\n }\n return sum < 0;\n }\n /**\n * Returns if the polygon collider is convex, Excalibur does not handle non-convex collision shapes.\n * Call {@apilink Polygon.triangulate} to generate a {@apilink CompositeCollider} from this non-convex shape\n */\n isConvex() {\n // From SO: https://stackoverflow.com/a/45372025\n if (this.points.length < 3) {\n return false;\n }\n let oldPoint = this.points[this.points.length - 2];\n let newPoint = this.points[this.points.length - 1];\n let direction = Math.atan2(newPoint.y - oldPoint.y, newPoint.x - oldPoint.x);\n let oldDirection = 0;\n let orientation = 0;\n let angleSum = 0;\n for (const [i, point] of this.points.entries()) {\n oldPoint = newPoint;\n oldDirection = direction;\n newPoint = point;\n direction = Math.atan2(newPoint.y - oldPoint.y, newPoint.x - oldPoint.x);\n if (oldPoint.equals(newPoint)) {\n return false; // repeat point\n }\n let angle = direction - oldDirection;\n if (angle <= -Math.PI) {\n angle += Math.PI * 2;\n }\n else if (angle > Math.PI) {\n angle -= Math.PI * 2;\n }\n if (i === 0) {\n if (angle === 0.0) {\n return false;\n }\n orientation = angle > 0 ? 1 : -1;\n }\n else {\n if (orientation * angle <= 0) {\n return false;\n }\n }\n angleSum += angle;\n }\n return Math.abs(Math.round(angleSum / (Math.PI * 2))) === 1;\n }\n /**\n * Tessellates the polygon into a triangle fan as a {@apilink CompositeCollider} of triangle polygons\n */\n tessellate() {\n const polygons = [];\n for (let i = 1; i < this.points.length - 2; i++) {\n polygons.push([this.points[0], this.points[i + 1], this.points[i + 2]]);\n }\n polygons.push([this.points[0], this.points[1], this.points[2]]);\n return new _CompositeCollider__WEBPACK_IMPORTED_MODULE_4__.CompositeCollider(polygons.map((points) => _Shape__WEBPACK_IMPORTED_MODULE_5__.Shape.Polygon(points)));\n }\n /**\n * Triangulate the polygon collider using the \"Ear Clipping\" algorithm.\n * Returns a new {@apilink CompositeCollider} made up of smaller triangles.\n */\n triangulate() {\n // https://www.youtube.com/watch?v=hTJFcHutls8\n if (this.points.length < 3) {\n throw Error('Invalid polygon');\n }\n const triangles = [];\n // algorithm likes clockwise\n const vertices = [...this.points].reverse();\n let vertexCount = vertices.length;\n /**\n * Returns the previous index based on the current vertex\n */\n function getPrevIndex(index) {\n return index === 0 ? vertexCount - 1 : index - 1;\n }\n /**\n * Retrieves the next index based on the current vertex\n */\n function getNextIndex(index) {\n return index === vertexCount - 1 ? 0 : index + 1;\n }\n /**\n * Whether or not the angle at this vertex index is convex\n */\n function isConvex(index) {\n const prev = getPrevIndex(index);\n const next = getNextIndex(index);\n const va = vertices[prev];\n const vb = vertices[index];\n const vc = vertices[next];\n // Check convexity\n const leftArm = va.sub(vb);\n const rightArm = vc.sub(vb);\n // Positive cross product is convex\n if (leftArm.cross(rightArm) < 0) {\n return false;\n }\n return true;\n }\n const convexVertices = vertices.map((_, i) => isConvex(i));\n /**\n * Quick test for point in triangle\n */\n function isPointInTriangle(point, a, b, c) {\n const ab = b.sub(a);\n const bc = c.sub(b);\n const ca = a.sub(c);\n const ap = point.sub(a);\n const bp = point.sub(b);\n const cp = point.sub(c);\n const cross1 = ab.cross(ap);\n const cross2 = bc.cross(bp);\n const cross3 = ca.cross(cp);\n if (cross1 > 0 || cross2 > 0 || cross3 > 0) {\n return false;\n }\n return true;\n }\n /**\n * Calculate the area of the triangle\n */\n // function triangleArea(a: Vector, b: Vector, c: Vector) {\n // return Math.abs(a.x * (b.y - c.y) + b.x * (c.y - a.y) + c.x * (a.y - c.y))/2;\n // }\n /**\n * Find the next suitable ear tip\n */\n function findEarTip() {\n for (let i = 0; i < vertexCount; i++) {\n if (convexVertices[i]) {\n const prev = getPrevIndex(i);\n const next = getNextIndex(i);\n const va = vertices[prev];\n const vb = vertices[i];\n const vc = vertices[next];\n let isEar = true;\n // Check that if any vertices are in the triangle a, b, c\n for (let j = 0; j < vertexCount; j++) {\n // We can skip these verts because they are the triangle we are testing\n if (j === i || j === prev || j === next) {\n continue;\n }\n const point = vertices[j];\n if (isPointInTriangle(point, va, vb, vc)) {\n isEar = false;\n break;\n }\n }\n // Add ear to polygon list and remove from list\n if (isEar) {\n return i;\n }\n }\n }\n // Fall back to any convex vertex\n for (let i = 0; i < vertexCount; i++) {\n if (convexVertices[i]) {\n return i;\n }\n }\n // bail and return the first one?\n return 0;\n }\n /**\n * Cut the ear and produce a triangle, update internal state\n */\n function cutEarTip(index) {\n const prev = getPrevIndex(index);\n const next = getNextIndex(index);\n const va = vertices[prev];\n const vb = vertices[index];\n const vc = vertices[next];\n // Clockwise winding\n // if (triangleArea(va, vb, vc) > 0) {\n triangles.push([va, vb, vc]);\n // }\n vertices.splice(index, 1);\n convexVertices.splice(index, 1);\n vertexCount--;\n }\n // Loop over all the vertices finding ears\n while (vertexCount > 3) {\n const earIndex = findEarTip();\n cutEarTip(earIndex);\n // reclassify vertices\n for (let i = 0; i < vertexCount; i++) {\n convexVertices[i] = isConvex(i);\n }\n }\n // Last triangle after the loop\n triangles.push([vertices[0], vertices[1], vertices[2]]);\n // FIXME: there is a colinear triangle that sneaks in here sometimes\n return new _CompositeCollider__WEBPACK_IMPORTED_MODULE_4__.CompositeCollider(triangles.map((points) => _Shape__WEBPACK_IMPORTED_MODULE_5__.Shape.Polygon(points, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero, true)));\n }\n /**\n * Returns a clone of this ConvexPolygon, not associated with any collider\n */\n clone() {\n return new PolygonCollider({\n offset: this.offset.clone(),\n points: this.points.map((p) => p.clone())\n });\n }\n /**\n * Returns the world position of the collider, which is the current body transform plus any defined offset\n */\n get worldPos() {\n return this._transform.pos;\n }\n /**\n * Get the center of the collider in world coordinates\n */\n get center() {\n return this.bounds.center;\n }\n /**\n * Calculates the underlying transformation from the body relative space to world space\n */\n _calculateTransformation() {\n const points = this.points;\n const len = points.length;\n this._transformedPoints.length = 0; // clear out old transform\n for (let i = 0; i < len; i++) {\n this._transformedPoints[i] = this._transform.apply(points[i].clone());\n }\n }\n /**\n * Gets the points that make up the polygon in world space, from actor relative space (if specified)\n */\n getTransformedPoints() {\n if (this._transformedPointsDirty) {\n this._calculateTransformation();\n this._transformedPointsDirty = false;\n }\n return this._transformedPoints;\n }\n /**\n * Gets the sides of the polygon in world space\n */\n getSides() {\n if (this._sidesDirty) {\n const lines = [];\n const points = this.getTransformedPoints();\n const len = points.length;\n for (let i = 0; i < len; i++) {\n // This winding is important\n lines.push(new _Math_line_segment__WEBPACK_IMPORTED_MODULE_6__.LineSegment(points[i], points[(i + 1) % len]));\n }\n this._sides = lines;\n this._sidesDirty = false;\n }\n return this._sides;\n }\n /**\n * Returns the local coordinate space sides\n */\n getLocalSides() {\n if (this._localSidesDirty) {\n const lines = [];\n const points = this.points;\n const len = points.length;\n for (let i = 0; i < len; i++) {\n // This winding is important\n lines.push(new _Math_line_segment__WEBPACK_IMPORTED_MODULE_6__.LineSegment(points[i], points[(i + 1) % len]));\n }\n this._localSides = lines;\n this._localSidesDirty = false;\n }\n return this._localSides;\n }\n /**\n * Given a direction vector find the world space side that is most in that direction\n * @param direction\n */\n findSide(direction) {\n const sides = this.getSides();\n let bestSide = sides[0];\n let maxDistance = -Number.MAX_VALUE;\n for (let side = 0; side < sides.length; side++) {\n const currentSide = sides[side];\n const sideNormal = currentSide.normal();\n const mostDirection = sideNormal.dot(direction);\n if (mostDirection > maxDistance) {\n bestSide = currentSide;\n maxDistance = mostDirection;\n }\n }\n return bestSide;\n }\n /**\n * Given a direction vector find the local space side that is most in that direction\n * @param direction\n */\n findLocalSide(direction) {\n const sides = this.getLocalSides();\n let bestSide = sides[0];\n let maxDistance = -Number.MAX_VALUE;\n for (let side = 0; side < sides.length; side++) {\n const currentSide = sides[side];\n const sideNormal = currentSide.normal();\n const mostDirection = sideNormal.dot(direction);\n if (mostDirection > maxDistance) {\n bestSide = currentSide;\n maxDistance = mostDirection;\n }\n }\n return bestSide;\n }\n /**\n * Get the axis associated with the convex polygon\n */\n get axes() {\n const axes = [];\n const sides = this.getSides();\n for (let i = 0; i < sides.length; i++) {\n axes.push(sides[i].normal());\n }\n return axes;\n }\n /**\n * Updates the transform for the collision geometry\n *\n * Collision geometry (points/bounds) will not change until this is called.\n * @param transform\n */\n update(transform) {\n if (transform) {\n // This change means an update must be performed in order for geometry to update\n transform.cloneWithParent(this._transform);\n this._transformedPointsDirty = true;\n this._sidesDirty = true;\n if (this.offset.x !== 0 || this.offset.y !== 0) {\n this._transform.pos.x += this.offset.x;\n this._transform.pos.y += this.offset.y;\n }\n if (this._transform.isMirrored()) {\n // negative transforms really mess with things in collision local space\n // flatten out the negatives by applying to geometry\n this.points = this.points.map((p) => (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(p.x * (0,___WEBPACK_IMPORTED_MODULE_7__.sign)(this._transform.scale.x), p.y * (0,___WEBPACK_IMPORTED_MODULE_7__.sign)(this._transform.scale.y)));\n this._transform.scale.x = Math.abs(this._transform.scale.x);\n this._transform.scale.y = Math.abs(this._transform.scale.y);\n }\n }\n }\n /**\n * Tests if a point is contained in this collider in world space\n */\n contains(point) {\n // Always cast to the right, as long as we cast in a consistent fixed direction we\n // will be fine\n const localPoint = this._transform.applyInverse(point);\n const testRay = new _Math_ray__WEBPACK_IMPORTED_MODULE_8__.Ray(localPoint, new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(1, 0));\n let intersectCount = 0;\n const sides = this.getLocalSides();\n for (let sideIndex = 0; sideIndex < sides.length; sideIndex++) {\n const side = sides[sideIndex];\n if (testRay.intersect(side) >= 0) {\n intersectCount++;\n }\n }\n if (intersectCount % 2 === 0) {\n return false;\n }\n return true;\n }\n getClosestLineBetween(collider) {\n if (collider instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_9__.CircleCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_10__.ClosestLineJumpTable.PolygonCircleClosestLine(this, collider);\n }\n else if (collider instanceof PolygonCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_10__.ClosestLineJumpTable.PolygonPolygonClosestLine(this, collider);\n }\n else if (collider instanceof _EdgeCollider__WEBPACK_IMPORTED_MODULE_11__.EdgeCollider) {\n return _ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_10__.ClosestLineJumpTable.PolygonEdgeClosestLine(this, collider);\n }\n else {\n throw new Error(`Polygon could not collide with unknown CollisionShape ${typeof collider}`);\n }\n }\n /**\n * Returns a collision contact if the 2 colliders collide, otherwise collide will\n * return null.\n * @param collider\n */\n collide(collider) {\n if (collider instanceof _CircleCollider__WEBPACK_IMPORTED_MODULE_9__.CircleCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_12__.CollisionJumpTable.CollideCirclePolygon(collider, this);\n }\n else if (collider instanceof PolygonCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_12__.CollisionJumpTable.CollidePolygonPolygon(this, collider);\n }\n else if (collider instanceof _EdgeCollider__WEBPACK_IMPORTED_MODULE_11__.EdgeCollider) {\n return _CollisionJumpTable__WEBPACK_IMPORTED_MODULE_12__.CollisionJumpTable.CollidePolygonEdge(this, collider);\n }\n else {\n throw new Error(`Polygon could not collide with unknown CollisionShape ${typeof collider}`);\n }\n }\n /**\n * Find the point on the collider furthest in the direction specified\n */\n getFurthestPoint(direction) {\n const pts = this.getTransformedPoints();\n let furthestPoint = null;\n let maxDistance = -Number.MAX_VALUE;\n for (let i = 0; i < pts.length; i++) {\n const distance = direction.dot(pts[i]);\n if (distance > maxDistance) {\n maxDistance = distance;\n furthestPoint = pts[i];\n }\n }\n return furthestPoint;\n }\n /**\n * Find the local point on the collider furthest in the direction specified\n * @param direction\n */\n getFurthestLocalPoint(direction) {\n const pts = this.points;\n let furthestPoint = pts[0];\n let maxDistance = -Number.MAX_VALUE;\n for (let i = 0; i < pts.length; i++) {\n const distance = direction.dot(pts[i]);\n if (distance > maxDistance) {\n maxDistance = distance;\n furthestPoint = pts[i];\n }\n }\n return furthestPoint;\n }\n /**\n * Finds the closes face to the point using perpendicular distance\n * @param point point to test against polygon\n */\n getClosestFace(point) {\n const sides = this.getSides();\n let min = Number.POSITIVE_INFINITY;\n let faceIndex = -1;\n let distance = -1;\n for (let i = 0; i < sides.length; i++) {\n const dist = sides[i].distanceToPoint(point);\n if (dist < min) {\n min = dist;\n faceIndex = i;\n distance = dist;\n }\n }\n if (faceIndex !== -1) {\n return {\n distance: sides[faceIndex].normal().scale(distance),\n face: sides[faceIndex]\n };\n }\n return null;\n }\n /**\n * Get the axis aligned bounding box for the polygon collider in world coordinates\n */\n get bounds() {\n return this.localBounds.transform(this._transform.matrix);\n }\n /**\n * Get the axis aligned bounding box for the polygon collider in local coordinates\n */\n get localBounds() {\n if (this._localBoundsDirty) {\n this._localBounds = _BoundingBox__WEBPACK_IMPORTED_MODULE_13__.BoundingBox.fromPoints(this.points);\n this._localBoundsDirty = false;\n }\n return this._localBounds;\n }\n /**\n * Get the moment of inertia for an arbitrary polygon\n * https://en.wikipedia.org/wiki/List_of_moments_of_inertia\n */\n getInertia(mass) {\n if (this._cachedMass === mass && this._cachedInertia) {\n return this._cachedInertia;\n }\n let numerator = 0;\n let denominator = 0;\n const points = this.points;\n for (let i = 0; i < points.length; i++) {\n const iplusone = (i + 1) % points.length;\n const crossTerm = points[iplusone].cross(points[i]);\n numerator += crossTerm * (points[i].dot(points[i]) + points[i].dot(points[iplusone]) + points[iplusone].dot(points[iplusone]));\n denominator += crossTerm;\n }\n this._cachedMass = mass;\n return (this._cachedInertia = (mass / 6) * (numerator / denominator));\n }\n /**\n * Casts a ray into the polygon and returns a vector representing the point of contact (in world space) or null if no collision.\n */\n rayCast(ray, max = Infinity) {\n var _a;\n // find the minimum contact time greater than 0\n // contact times less than 0 are behind the ray and we don't want those\n const sides = this.getSides();\n const len = sides.length;\n let minContactTime = Number.MAX_VALUE;\n let contactSide;\n let contactIndex = -1;\n for (let i = 0; i < len; i++) {\n const contactTime = ray.intersect(sides[i]);\n if (contactTime >= 0 && contactTime < minContactTime && contactTime <= max) {\n minContactTime = contactTime;\n contactSide = sides[i];\n contactIndex = i;\n }\n }\n // contact was found\n if (contactIndex >= 0) {\n return {\n collider: this,\n distance: minContactTime,\n body: (_a = this.owner) === null || _a === void 0 ? void 0 : _a.get(___WEBPACK_IMPORTED_MODULE_14__.BodyComponent),\n point: ray.getPoint(minContactTime),\n normal: contactSide.normal()\n };\n }\n // no contact found\n return null;\n }\n /**\n * Project the edges of the polygon along a specified axis\n */\n project(axis) {\n const points = this.getTransformedPoints();\n const len = points.length;\n let min = Number.MAX_VALUE;\n let max = -Number.MAX_VALUE;\n for (let i = 0; i < len; i++) {\n const scalar = points[i].dot(axis);\n min = Math.min(min, scalar);\n max = Math.max(max, scalar);\n }\n return new _Math_projection__WEBPACK_IMPORTED_MODULE_15__.Projection(min, max);\n }\n debug(ex, color, options) {\n const points = this.getTransformedPoints();\n ___WEBPACK_IMPORTED_MODULE_16__.Debug.drawPolygon(points, { color });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/SeparatingAxis.ts\":\n/*!***********************************************!*\\\n !*** ./Collision/Colliders/SeparatingAxis.ts ***!\n \\***********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SeparatingAxis: () => (/* binding */ SeparatingAxis),\n/* harmony export */ SeparationInfo: () => (/* binding */ SeparationInfo)\n/* harmony export */ });\n/* harmony import */ var _Math_line_segment__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/line-segment */ \"./Math/line-segment.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math/affine-matrix */ \"./Math/affine-matrix.ts\");\n/* harmony import */ var _Util_Pool__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Util/Pool */ \"./Util/Pool.ts\");\n\n\n\n\n/**\n * Specific information about a contact and it's separation\n */\nclass SeparationInfo {\n constructor() {\n /**\n * Axis of separation from the collider's perspective\n */\n this.axis = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n /**\n * Local axis of separation from the collider's perspective\n */\n this.localAxis = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n /**\n * Side of separation (reference) from the collider's perspective\n */\n this.side = new _Math_line_segment__WEBPACK_IMPORTED_MODULE_1__.LineSegment((0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0), (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0));\n /**\n * Local side of separation (reference) from the collider's perspective\n */\n this.localSide = new _Math_line_segment__WEBPACK_IMPORTED_MODULE_1__.LineSegment((0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0), (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0));\n /**\n * Point on collider B (incident point)\n */\n this.point = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n /**\n * Local point on collider B (incident point)\n */\n this.localPoint = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n }\n}\nclass SeparatingAxis {\n static findPolygonPolygonSeparation(polyA, polyB) {\n // if polyB has 0 scale we need to hop back to degenerate separation\n if (polyB.transform.matrix.determinant() === 0) {\n return SeparatingAxis.findPolygonPolygonSeparationDegenerate(polyA, polyB);\n }\n // Multi contact from SAT\n // https://gamedev.stackexchange.com/questions/111390/multiple-contacts-for-sat-collision-detection\n // do a SAT test to find a min axis if it exists\n let bestSeparation = -Number.MAX_VALUE;\n let bestSideIndex = -1;\n let localPoint;\n // Work inside polyB reference frame\n // inv polyB converts to local space from polyA world space\n const toPolyBSpace = polyB.transform.inverse.multiply(polyA.transform.matrix, SeparatingAxis._SCRATCH_MATRIX);\n const toPolyBSpaceRotation = toPolyBSpace.getRotation();\n const normalsA = polyA.normals;\n const pointsA = polyA.points;\n const pointsB = polyB.points;\n for (let pointsAIndex = 0; pointsAIndex < pointsA.length; pointsAIndex++) {\n const normal = normalsA[pointsAIndex].rotate(toPolyBSpaceRotation, SeparatingAxis._ZERO, SeparatingAxis._SCRATCH_NORMAL);\n const point = toPolyBSpace.multiply(pointsA[pointsAIndex], SeparatingAxis._SCRATCH_POINT);\n // For every point in polyB\n // We want to see how much overlap there is on the axis provided by the normal\n // We want to find the minimum overlap among all points\n let smallestPointDistance = Number.MAX_VALUE;\n let smallestLocalPoint;\n for (let pointsBIndex = 0; pointsBIndex < pointsB.length; pointsBIndex++) {\n const distance = normal.dot(pointsB[pointsBIndex].sub(point, SeparatingAxis._SCRATCH_SUB_POINT));\n if (distance < smallestPointDistance) {\n smallestPointDistance = distance;\n smallestLocalPoint = pointsB[pointsBIndex];\n }\n }\n // We take the maximum overlap as the separation between the\n // A negative separation means there were no gaps between the two shapes\n if (smallestPointDistance > bestSeparation) {\n bestSeparation = smallestPointDistance;\n bestSideIndex = pointsAIndex;\n localPoint = smallestLocalPoint;\n }\n }\n // TODO can we avoid applying world space transforms?\n const bestSide2 = (bestSideIndex + 1) % pointsA.length;\n const separationInfo = SeparatingAxis.SeparationPool.get();\n separationInfo.collider = polyA;\n separationInfo.separation = bestSeparation;\n if (bestSeparation > 0) {\n // early out because if separation is > 0 then no local point\n return separationInfo;\n }\n normalsA[bestSideIndex].clone(separationInfo.localAxis);\n normalsA[bestSideIndex].rotate(polyA.transform.rotation, SeparatingAxis._ZERO, separationInfo.axis);\n polyA.transform.matrix.multiply(pointsA[bestSideIndex], separationInfo.side.begin);\n polyA.transform.matrix.multiply(pointsA[bestSide2], separationInfo.side.end);\n polyB.transform.matrix.multiply(localPoint, separationInfo.point);\n separationInfo.sideId = bestSideIndex;\n localPoint.clone(separationInfo.localPoint);\n pointsA[bestSideIndex].clone(separationInfo.localSide.begin);\n pointsA[bestSide2].clone(separationInfo.localSide.end);\n return separationInfo;\n }\n static findCirclePolygonSeparation(circle, polygon) {\n const axes = polygon.axes;\n const pc = polygon.center;\n // Special SAT with circles\n const polyDir = pc.sub(circle.worldPos);\n const closestPointOnPoly = polygon.getFurthestPoint(polyDir.negate());\n axes.push(closestPointOnPoly.sub(circle.worldPos).normalize());\n let minOverlap = Number.MAX_VALUE;\n let minAxis = null;\n let minIndex = -1;\n for (let i = 0; i < axes.length; i++) {\n const proj1 = polygon.project(axes[i]);\n const proj2 = circle.project(axes[i]);\n const overlap = proj1.getOverlap(proj2);\n if (overlap <= 0) {\n return null;\n }\n else {\n if (overlap < minOverlap) {\n minOverlap = overlap;\n minAxis = axes[i];\n minIndex = i;\n }\n }\n }\n if (minIndex < 0) {\n return null;\n }\n return minAxis.normalize().scale(minOverlap);\n }\n static findPolygonPolygonSeparationDegenerate(polyA, polyB) {\n let bestSeparation = -Number.MAX_VALUE;\n let bestSide = null;\n let bestAxis = null;\n let bestSideIndex = -1;\n let bestOtherPoint = null;\n const sides = polyA.getSides();\n const localSides = polyA.getLocalSides();\n for (let i = 0; i < sides.length; i++) {\n const side = sides[i];\n const axis = side.normal();\n const vertB = polyB.getFurthestPoint(axis.negate());\n // Separation on side i's axis\n // We are looking for the largest separation between poly A's sides\n const vertSeparation = side.distanceToPoint(vertB, true);\n if (vertSeparation > bestSeparation) {\n bestSeparation = vertSeparation;\n bestSide = side;\n bestAxis = axis;\n bestSideIndex = i;\n bestOtherPoint = vertB;\n }\n }\n return {\n collider: polyA,\n separation: bestAxis ? bestSeparation : 99,\n axis: bestAxis,\n side: bestSide,\n localSide: localSides[bestSideIndex],\n sideId: bestSideIndex,\n point: bestOtherPoint,\n localPoint: bestAxis ? polyB.getFurthestLocalPoint(bestAxis.negate()) : null\n };\n }\n}\nSeparatingAxis.SeparationPool = new _Util_Pool__WEBPACK_IMPORTED_MODULE_2__.Pool(() => new SeparationInfo(), (i) => i, // no recycle\n500);\nSeparatingAxis._ZERO = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\nSeparatingAxis._SCRATCH_POINT = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\nSeparatingAxis._SCRATCH_SUB_POINT = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\nSeparatingAxis._SCRATCH_NORMAL = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\nSeparatingAxis._SCRATCH_MATRIX = _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_3__.AffineMatrix.identity();\nSeparatingAxis.SeparationPool.disableWarnings = true;\n\n\n/***/ }),\n\n/***/ \"./Collision/Colliders/Shape.ts\":\n/*!**************************************!*\\\n !*** ./Collision/Colliders/Shape.ts ***!\n \\**************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Shape: () => (/* binding */ Shape)\n/* harmony export */ });\n/* harmony import */ var _PolygonCollider__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./PolygonCollider */ \"./Collision/Colliders/PolygonCollider.ts\");\n/* harmony import */ var _CircleCollider__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./CircleCollider */ \"./Collision/Colliders/CircleCollider.ts\");\n/* harmony import */ var _EdgeCollider__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./EdgeCollider */ \"./Collision/Colliders/EdgeCollider.ts\");\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _CompositeCollider__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../.. */ \"./Util/Log.ts\");\n\n\n\n\n\n\n\n/**\n * Excalibur helper for defining colliders quickly\n */\nclass Shape {\n /**\n * Creates a box collider, under the hood defines a {@apilink PolygonCollider} collider\n * @param width Width of the box\n * @param height Height of the box\n * @param anchor Anchor of the box (default (.5, .5)) which positions the box relative to the center of the collider's position\n * @param offset Optional offset relative to the collider in local coordinates\n */\n static Box(width, height, anchor = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Half, offset = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero) {\n return new _PolygonCollider__WEBPACK_IMPORTED_MODULE_1__.PolygonCollider({\n points: new _BoundingBox__WEBPACK_IMPORTED_MODULE_2__.BoundingBox(-width * anchor.x, -height * anchor.y, width - width * anchor.x, height - height * anchor.y).getPoints(),\n offset: offset\n });\n }\n /**\n * Creates a new {@apilink PolygonCollider | `arbitrary polygon`} collider\n *\n * PolygonColliders are useful for creating convex polygon shapes\n * @param points Points specified in counter clockwise\n * @param offset Optional offset relative to the collider in local coordinates\n */\n static Polygon(points, offset = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero, suppressConvexWarning = false) {\n return new _PolygonCollider__WEBPACK_IMPORTED_MODULE_1__.PolygonCollider({\n points: points,\n offset: offset,\n suppressConvexWarning\n });\n }\n /**\n * Creates a new {@apilink CircleCollider | `circle`} collider\n *\n * Circle colliders are useful for balls, or to make collisions more forgiving on sharp edges\n * @param radius Radius of the circle collider\n * @param offset Optional offset relative to the collider in local coordinates\n */\n static Circle(radius, offset = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero) {\n return new _CircleCollider__WEBPACK_IMPORTED_MODULE_3__.CircleCollider({\n radius: radius,\n offset: offset\n });\n }\n /**\n * Creates a new {@apilink EdgeCollider | `edge`} collider\n *\n * Edge colliders are useful for floors, walls, and other barriers\n * @param begin Beginning of the edge in local coordinates to the collider\n * @param end Ending of the edge in local coordinates to the collider\n */\n static Edge(begin, end) {\n return new _EdgeCollider__WEBPACK_IMPORTED_MODULE_4__.EdgeCollider({\n begin: begin,\n end: end\n });\n }\n /**\n * Creates a new capsule shaped {@apilink CompositeCollider} using 2 circles and a box\n *\n * Capsule colliders are useful for platformers with incline or jagged floors to have a smooth\n * player experience.\n * @param width\n * @param height\n * @param offset Optional offset\n */\n static Capsule(width, height, offset = _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero) {\n const logger = ___WEBPACK_IMPORTED_MODULE_5__.Logger.getInstance();\n if (width === height) {\n logger.warn('A capsule collider with equal width and height is a circle, consider using a ex.Shape.Circle or ex.CircleCollider');\n }\n const vertical = height >= width;\n if (vertical) {\n // height > width, if equal maybe use a circle\n const capsule = new _CompositeCollider__WEBPACK_IMPORTED_MODULE_6__.CompositeCollider([\n Shape.Circle(width / 2, (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, -height / 2 + width / 2).add(offset)),\n Shape.Box(width, height - width, _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Half, offset),\n Shape.Circle(width / 2, (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, height / 2 - width / 2).add(offset))\n ]);\n return capsule;\n }\n else {\n // width > height, if equal maybe use a circle\n const capsule = new _CompositeCollider__WEBPACK_IMPORTED_MODULE_6__.CompositeCollider([\n Shape.Circle(height / 2, (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(-width / 2 + height / 2, 0).add(offset)),\n Shape.Box(width - height, height, _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Half, offset),\n Shape.Circle(height / 2, (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(width / 2 - height / 2, 0).add(offset))\n ]);\n return capsule;\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/CollisionSystem.ts\":\n/*!**************************************!*\\\n !*** ./Collision/CollisionSystem.ts ***!\n \\**************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CollisionSystem: () => (/* binding */ CollisionSystem)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Priority.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _SolverStrategy__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./SolverStrategy */ \"./Collision/SolverStrategy.ts\");\n/* harmony import */ var _Solver_ArcadeSolver__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Solver/ArcadeSolver */ \"./Collision/Solver/ArcadeSolver.ts\");\n/* harmony import */ var _Solver_RealisticSolver__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Solver/RealisticSolver */ \"./Collision/Solver/RealisticSolver.ts\");\n/* harmony import */ var _ColliderComponent__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./ColliderComponent */ \"./Collision/ColliderComponent.ts\");\n/* harmony import */ var _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Colliders/CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var _Collision_Side__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../Collision/Side */ \"./Collision/Side.ts\");\n/* harmony import */ var _Colliders_SeparatingAxis__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Colliders/SeparatingAxis */ \"./Collision/Colliders/SeparatingAxis.ts\");\n/* harmony import */ var _MotionSystem__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./MotionSystem */ \"./Collision/MotionSystem.ts\");\n/* harmony import */ var _Detection_Pair__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Detection/Pair */ \"./Collision/Detection/Pair.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass CollisionSystem extends _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.System {\n get _processor() {\n return this._physics.collisionProcessor;\n }\n constructor(world, _physics) {\n super();\n this._physics = _physics;\n this.systemType = _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.SystemType.Update;\n this._configDirty = false;\n this._lastFrameContacts = new Map();\n this._currentFrameContacts = new Map();\n this._arcadeSolver = new _Solver_ArcadeSolver__WEBPACK_IMPORTED_MODULE_1__.ArcadeSolver(_physics.config.arcade);\n this._realisticSolver = new _Solver_RealisticSolver__WEBPACK_IMPORTED_MODULE_2__.RealisticSolver(_physics.config.realistic);\n this._physics.$configUpdate.subscribe(() => (this._configDirty = true));\n this._trackCollider = (c) => this._processor.track(c);\n this._untrackCollider = (c) => this._processor.untrack(c);\n this.query = world.query([_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_3__.TransformComponent, _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_4__.MotionComponent, _ColliderComponent__WEBPACK_IMPORTED_MODULE_5__.ColliderComponent]);\n this.query.entityAdded$.subscribe((e) => {\n const colliderComponent = e.get(_ColliderComponent__WEBPACK_IMPORTED_MODULE_5__.ColliderComponent);\n colliderComponent.$colliderAdded.subscribe(this._trackCollider);\n colliderComponent.$colliderRemoved.subscribe(this._untrackCollider);\n const collider = colliderComponent.get();\n if (collider) {\n this._processor.track(collider);\n }\n });\n this.query.entityRemoved$.subscribe((e) => {\n const colliderComponent = e.get(_ColliderComponent__WEBPACK_IMPORTED_MODULE_5__.ColliderComponent);\n const collider = colliderComponent.get();\n if (colliderComponent && collider) {\n this._processor.untrack(collider);\n }\n });\n this._motionSystem = world.get(_MotionSystem__WEBPACK_IMPORTED_MODULE_6__.MotionSystem);\n }\n initialize(world, scene) {\n this._engine = scene.engine;\n }\n update(elapsed) {\n var _a, _b, _c, _d;\n if (!this._physics.config.enabled) {\n return;\n }\n // TODO do we need to do this every frame?\n // Collect up all the colliders and update them\n let colliders = [];\n for (let entityIndex = 0; entityIndex < this.query.entities.length; entityIndex++) {\n const entity = this.query.entities[entityIndex];\n const colliderComp = entity.get(_ColliderComponent__WEBPACK_IMPORTED_MODULE_5__.ColliderComponent);\n const collider = colliderComp === null || colliderComp === void 0 ? void 0 : colliderComp.get();\n if (colliderComp && ((_a = colliderComp.owner) === null || _a === void 0 ? void 0 : _a.isActive) && collider) {\n colliderComp.update();\n // Flatten composite colliders\n if (collider instanceof _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_7__.CompositeCollider) {\n const compositeColliders = collider.getColliders();\n if (!collider.compositeStrategy) {\n collider.compositeStrategy = this._physics.config.colliders.compositeStrategy;\n }\n colliders = colliders.concat(compositeColliders);\n }\n else {\n colliders.push(collider);\n }\n }\n }\n // Update the spatial partitioning data structures\n // TODO if collider invalid it will break the processor\n // TODO rename \"update\" to something more specific\n this._processor.update(colliders, elapsed);\n // Run broadphase on all colliders and locates potential collisions\n let pairs = this._processor.broadphase(colliders, elapsed);\n this._currentFrameContacts.clear();\n // Given possible pairs find actual contacts\n let contacts = []; // = this._processor.narrowphase(pairs, this._engine?.debug?.stats?.currFrame);\n const solver = this.getSolver();\n // Solve, this resolves the position/velocity so entities aren't overlapping\n const substep = this._physics.config.substep;\n for (let step = 0; step < substep; step++) {\n if (step > 0) {\n // first step is run by the MotionSystem when configured, so skip\n this._motionSystem.update(elapsed);\n }\n // Re-use pairs from previous collision\n if (contacts.length) {\n pairs = contacts.map((c) => new _Detection_Pair__WEBPACK_IMPORTED_MODULE_8__.Pair(c.colliderA, c.colliderB));\n }\n if (pairs.length) {\n contacts = this._processor.narrowphase(pairs, (_d = (_c = (_b = this._engine) === null || _b === void 0 ? void 0 : _b.debug) === null || _c === void 0 ? void 0 : _c.stats) === null || _d === void 0 ? void 0 : _d.currFrame);\n contacts = solver.solve(contacts);\n // Record contacts for start/end\n for (const contact of contacts) {\n if (contact.isCanceled()) {\n continue;\n }\n // Process composite ids, things with the same composite id are treated as the same collider for start/end\n const index = contact.id.indexOf('|');\n if (index > 0) {\n const compositeId = contact.id.substring(index + 1);\n this._currentFrameContacts.set(compositeId, contact);\n }\n else {\n this._currentFrameContacts.set(contact.id, contact);\n }\n }\n }\n }\n // Emit contact start/end events\n this.runContactStartEnd();\n // reset the last frame cache\n this._lastFrameContacts.clear();\n // Keep track of collisions contacts that have started or ended\n this._lastFrameContacts = new Map(this._currentFrameContacts);\n // Process deferred collider removals\n for (const entity of this.query.entities) {\n const collider = entity.get(_ColliderComponent__WEBPACK_IMPORTED_MODULE_5__.ColliderComponent);\n if (collider) {\n collider.processColliderRemoval();\n }\n }\n }\n postupdate() {\n _Colliders_SeparatingAxis__WEBPACK_IMPORTED_MODULE_9__.SeparatingAxis.SeparationPool.done();\n }\n getSolver() {\n if (this._configDirty) {\n this._configDirty = false;\n this._arcadeSolver = new _Solver_ArcadeSolver__WEBPACK_IMPORTED_MODULE_1__.ArcadeSolver(this._physics.config.arcade);\n this._realisticSolver = new _Solver_RealisticSolver__WEBPACK_IMPORTED_MODULE_2__.RealisticSolver(this._physics.config.realistic);\n }\n return this._physics.config.solver === _SolverStrategy__WEBPACK_IMPORTED_MODULE_10__.SolverStrategy.Realistic ? this._realisticSolver : this._arcadeSolver;\n }\n debug(ex) {\n this._processor.debug(ex, 0);\n }\n runContactStartEnd() {\n // If composite colliders are 'together' collisions may have a duplicate id because we want to treat those as a singular start/end\n for (const [id, c] of this._currentFrameContacts) {\n // find all new contacts\n if (!this._lastFrameContacts.has(id)) {\n const colliderA = c.colliderA;\n const colliderB = c.colliderB;\n const side = _Collision_Side__WEBPACK_IMPORTED_MODULE_11__.Side.fromDirection(c.mtv);\n const opposite = _Collision_Side__WEBPACK_IMPORTED_MODULE_11__.Side.getOpposite(side);\n colliderA.events.emit('collisionstart', new _Events__WEBPACK_IMPORTED_MODULE_12__.CollisionStartEvent(colliderA, colliderB, side, c));\n colliderA.events.emit('contactstart', new _Events__WEBPACK_IMPORTED_MODULE_12__.ContactStartEvent(colliderA, colliderB, side, c));\n colliderB.events.emit('collisionstart', new _Events__WEBPACK_IMPORTED_MODULE_12__.CollisionStartEvent(colliderB, colliderA, opposite, c));\n colliderB.events.emit('contactstart', new _Events__WEBPACK_IMPORTED_MODULE_12__.ContactStartEvent(colliderB, colliderA, opposite, c));\n }\n }\n // find all contacts that have ceased\n for (const [id, c] of this._lastFrameContacts) {\n if (!this._currentFrameContacts.has(id)) {\n const colliderA = c.colliderA;\n const colliderB = c.colliderB;\n const side = _Collision_Side__WEBPACK_IMPORTED_MODULE_11__.Side.fromDirection(c.mtv);\n const opposite = _Collision_Side__WEBPACK_IMPORTED_MODULE_11__.Side.getOpposite(side);\n colliderA.events.emit('collisionend', new _Events__WEBPACK_IMPORTED_MODULE_12__.CollisionEndEvent(colliderA, colliderB, side, c));\n colliderA.events.emit('contactend', new _Events__WEBPACK_IMPORTED_MODULE_12__.ContactEndEvent(colliderA, colliderB, side, c));\n colliderB.events.emit('collisionend', new _Events__WEBPACK_IMPORTED_MODULE_12__.CollisionEndEvent(colliderB, colliderA, opposite, c));\n colliderB.events.emit('contactend', new _Events__WEBPACK_IMPORTED_MODULE_12__.ContactEndEvent(colliderB, colliderA, opposite, c));\n }\n }\n }\n}\nCollisionSystem.priority = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_13__.SystemPriority.Higher;\n\n\n/***/ }),\n\n/***/ \"./Collision/CollisionType.ts\":\n/*!************************************!*\\\n !*** ./Collision/CollisionType.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CollisionType: () => (/* binding */ CollisionType)\n/* harmony export */ });\n/**\n * An enum that describes the types of collisions bodies can participate in\n */\nvar CollisionType;\n(function (CollisionType) {\n /**\n * Bodies with the `PreventCollision` setting do not participate in any\n * collisions and do not raise collision events.\n */\n CollisionType[\"PreventCollision\"] = \"PreventCollision\";\n /**\n * Bodies with the `Passive` setting only raise collision events, but are not\n * influenced or moved by other bodies and do not influence or move other bodies.\n * This is useful for use in trigger type behavior.\n */\n CollisionType[\"Passive\"] = \"Passive\";\n /**\n * Bodies with the `Active` setting raise collision events and participate\n * in collisions with other bodies and will be push or moved by bodies sharing\n * the `Active` or `Fixed` setting.\n */\n CollisionType[\"Active\"] = \"Active\";\n /**\n * Bodies with the `Fixed` setting raise collision events and participate in\n * collisions with other bodies. Actors with the `Fixed` setting will not be\n * pushed or moved by other bodies sharing the `Fixed`. Think of Fixed\n * bodies as \"immovable/unstoppable\" objects. If two `Fixed` bodies meet they will\n * not be pushed or moved by each other, they will not interact except to throw\n * collision events.\n */\n CollisionType[\"Fixed\"] = \"Fixed\";\n})(CollisionType || (CollisionType = {}));\n\n\n/***/ }),\n\n/***/ \"./Collision/Detection/CollisionContact.ts\":\n/*!*************************************************!*\\\n !*** ./Collision/Detection/CollisionContact.ts ***!\n \\*************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CollisionContact: () => (/* binding */ CollisionContact)\n/* harmony export */ });\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Pair__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Pair */ \"./Collision/Detection/Pair.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../BodyComponent */ \"./Collision/BodyComponent.ts\");\n\n\n\n/**\n * Collision contacts are used internally by Excalibur to resolve collision between colliders. This\n * Pair prevents collisions from being evaluated more than one time\n */\nclass CollisionContact {\n constructor(colliderA, colliderB, mtv, normal, tangent, points, localPoints, info) {\n var _a, _b, _c, _d, _e, _f;\n this._canceled = false;\n this.bodyA = null;\n this.bodyB = null;\n this.colliderA = colliderA;\n this.colliderB = colliderB;\n this.mtv = mtv;\n this.normal = normal;\n this.tangent = tangent;\n this.points = points;\n this.localPoints = localPoints;\n this.info = info;\n this.id = _Pair__WEBPACK_IMPORTED_MODULE_0__.Pair.calculatePairHash(colliderA.id, colliderB.id);\n if (colliderA.composite || colliderB.composite) {\n // Add on the parent composite pair for start/end contact if 'together\n const colliderAId = ((_a = colliderA.composite) === null || _a === void 0 ? void 0 : _a.compositeStrategy) === 'separate' ? colliderA.id : (_c = (_b = colliderA.composite) === null || _b === void 0 ? void 0 : _b.id) !== null && _c !== void 0 ? _c : colliderA.id;\n const colliderBId = ((_d = colliderB.composite) === null || _d === void 0 ? void 0 : _d.compositeStrategy) === 'separate' ? colliderB.id : (_f = (_e = colliderB.composite) === null || _e === void 0 ? void 0 : _e.id) !== null && _f !== void 0 ? _f : colliderB.id;\n this.id += '|' + _Pair__WEBPACK_IMPORTED_MODULE_0__.Pair.calculatePairHash(colliderAId, colliderBId);\n }\n if (this.colliderA.owner) {\n this.bodyA = this.colliderA.owner.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_1__.BodyComponent);\n }\n if (this.colliderB.owner) {\n this.bodyB = this.colliderB.owner.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_1__.BodyComponent);\n }\n }\n /**\n * Match contact awake state, except if body's are Fixed\n */\n matchAwake() {\n const bodyA = this.bodyA;\n const bodyB = this.bodyB;\n if (bodyA && bodyB) {\n if (bodyA.isSleeping !== bodyB.isSleeping) {\n if (bodyA.isSleeping && bodyA.collisionType !== _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.Fixed && bodyB.sleepMotion >= bodyA.wakeThreshold) {\n bodyA.isSleeping = false;\n }\n if (bodyB.isSleeping && bodyB.collisionType !== _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.Fixed && bodyA.sleepMotion >= bodyB.wakeThreshold) {\n bodyB.isSleeping = false;\n }\n }\n }\n }\n isCanceled() {\n return this._canceled;\n }\n cancel() {\n this._canceled = true;\n }\n /**\n * Biases the contact so that the given collider is colliderA\n */\n bias(collider) {\n if (collider !== this.colliderA && collider !== this.colliderB) {\n throw new Error('Collider must be either colliderA or colliderB from this contact');\n }\n if (collider === this.colliderA) {\n return this;\n }\n const colliderA = this.colliderA;\n const colliderB = this.colliderB;\n this.colliderB = colliderA;\n this.colliderA = colliderB;\n this.mtv = this.mtv.negate();\n this.normal = this.normal.negate();\n this.tangent = this.tangent.negate();\n return this;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Detection/DynamicTree.ts\":\n/*!********************************************!*\\\n !*** ./Collision/Detection/DynamicTree.ts ***!\n \\********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DynamicTree: () => (/* binding */ DynamicTree),\n/* harmony export */ TreeNode: () => (/* binding */ TreeNode)\n/* harmony export */ });\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../.. */ \"./Color.ts\");\n\n\n\n\n/**\n * Dynamic Tree Node used for tracking bounds within the tree\n */\nclass TreeNode {\n constructor(parent) {\n this.parent = parent;\n this.parent = parent || null;\n this.data = null;\n this.bounds = new _BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox();\n this.left = null;\n this.right = null;\n this.height = 0;\n }\n isLeaf() {\n return !this.left && !this.right;\n }\n}\n/**\n * The DynamicTrees provides a spatial partitioning data structure for quickly querying for overlapping bounding boxes for\n * all tracked bodies. The worst case performance of this is O(n*log(n)) where n is the number of bodies in the tree.\n *\n * Internally the bounding boxes are organized as a balanced binary tree of bounding boxes, where the leaf nodes are tracked bodies.\n * Every non-leaf node is a bounding box that contains child bounding boxes.\n */\nclass DynamicTree {\n constructor(_config, worldBounds = new _BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox(-Number.MAX_VALUE, -Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE)) {\n this._config = _config;\n this.worldBounds = worldBounds;\n this.root = null;\n this.nodes = {};\n }\n /**\n * Inserts a node into the dynamic tree\n */\n _insert(leaf) {\n // If there are no nodes in the tree, make this the root leaf\n if (this.root === null) {\n this.root = leaf;\n this.root.parent = null;\n return;\n }\n // Search the tree for a node that is not a leaf and find the best place to insert\n const leafAABB = leaf.bounds;\n let currentRoot = this.root;\n while (!currentRoot.isLeaf()) {\n const left = currentRoot.left;\n const right = currentRoot.right;\n const area = currentRoot.bounds.getPerimeter();\n const combinedAABB = currentRoot.bounds.combine(leafAABB);\n const combinedArea = combinedAABB.getPerimeter();\n // Calculate cost heuristic for creating a new parent and leaf\n const cost = 2 * combinedArea;\n // Minimum cost of pushing the leaf down the tree\n const inheritanceCost = 2 * (combinedArea - area);\n // Cost of descending\n let leftCost = 0;\n const leftCombined = leafAABB.combine(left.bounds);\n let newArea;\n let oldArea;\n if (left.isLeaf()) {\n leftCost = leftCombined.getPerimeter() + inheritanceCost;\n }\n else {\n oldArea = left.bounds.getPerimeter();\n newArea = leftCombined.getPerimeter();\n leftCost = newArea - oldArea + inheritanceCost;\n }\n let rightCost = 0;\n const rightCombined = leafAABB.combine(right.bounds);\n if (right.isLeaf()) {\n rightCost = rightCombined.getPerimeter() + inheritanceCost;\n }\n else {\n oldArea = right.bounds.getPerimeter();\n newArea = rightCombined.getPerimeter();\n rightCost = newArea - oldArea + inheritanceCost;\n }\n // cost is acceptable\n if (cost < leftCost && cost < rightCost) {\n break;\n }\n // Descend to the depths\n if (leftCost < rightCost) {\n currentRoot = left;\n }\n else {\n currentRoot = right;\n }\n }\n // Create the new parent node and insert into the tree\n const oldParent = currentRoot.parent;\n const newParent = new TreeNode(oldParent);\n newParent.bounds = leafAABB.combine(currentRoot.bounds);\n newParent.height = currentRoot.height + 1;\n if (oldParent !== null) {\n // The sibling node was not the root\n if (oldParent.left === currentRoot) {\n oldParent.left = newParent;\n }\n else {\n oldParent.right = newParent;\n }\n newParent.left = currentRoot;\n newParent.right = leaf;\n currentRoot.parent = newParent;\n leaf.parent = newParent;\n }\n else {\n // The sibling node was the root\n newParent.left = currentRoot;\n newParent.right = leaf;\n currentRoot.parent = newParent;\n leaf.parent = newParent;\n this.root = newParent;\n }\n // Walk up the tree fixing heights and AABBs\n let currentNode = leaf.parent;\n while (currentNode) {\n currentNode = this._balance(currentNode);\n if (!currentNode.left) {\n throw new Error('Parent of current leaf cannot have a null left child' + currentNode);\n }\n if (!currentNode.right) {\n throw new Error('Parent of current leaf cannot have a null right child' + currentNode);\n }\n currentNode.height = 1 + Math.max(currentNode.left.height, currentNode.right.height);\n currentNode.bounds = currentNode.left.bounds.combine(currentNode.right.bounds);\n currentNode = currentNode.parent;\n }\n }\n /**\n * Removes a node from the dynamic tree\n */\n _remove(leaf) {\n if (leaf === this.root) {\n this.root = null;\n return;\n }\n const parent = leaf.parent;\n const grandParent = parent.parent;\n let sibling;\n if (parent.left === leaf) {\n sibling = parent.right;\n }\n else {\n sibling = parent.left;\n }\n if (grandParent) {\n if (grandParent.left === parent) {\n grandParent.left = sibling;\n }\n else {\n grandParent.right = sibling;\n }\n sibling.parent = grandParent;\n let currentNode = grandParent;\n while (currentNode) {\n currentNode = this._balance(currentNode);\n currentNode.bounds = currentNode.left.bounds.combine(currentNode.right.bounds);\n currentNode.height = 1 + Math.max(currentNode.left.height, currentNode.right.height);\n currentNode = currentNode.parent;\n }\n }\n else {\n this.root = sibling;\n sibling.parent = null;\n }\n }\n /**\n * Tracks a body in the dynamic tree\n */\n trackCollider(collider) {\n const node = new TreeNode();\n node.data = collider;\n node.bounds = collider.bounds;\n node.bounds.left -= 2;\n node.bounds.top -= 2;\n node.bounds.right += 2;\n node.bounds.bottom += 2;\n this.nodes[collider.id.value] = node;\n this._insert(node);\n }\n /**\n * Updates the dynamic tree given the current bounds of each body being tracked\n */\n updateCollider(collider) {\n var _a;\n const node = this.nodes[collider.id.value];\n if (!node) {\n return false;\n }\n const b = collider.bounds;\n // if the body is outside the world no longer update it\n if (!this.worldBounds.contains(b)) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance().warn('Collider with id ' + collider.id.value + ' is outside the world bounds and will no longer be tracked for physics');\n this.untrackCollider(collider);\n return false;\n }\n if (node.bounds.contains(b)) {\n return false;\n }\n this._remove(node);\n b.left -= this._config.boundsPadding;\n b.top -= this._config.boundsPadding;\n b.right += this._config.boundsPadding;\n b.bottom += this._config.boundsPadding;\n // THIS IS CAUSING UNNECESSARY CHECKS\n if (collider.owner) {\n const body = (_a = collider.owner) === null || _a === void 0 ? void 0 : _a.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_2__.BodyComponent);\n if (body) {\n const multdx = ((body.vel.x * 32) / 1000) * this._config.velocityMultiplier;\n const multdy = ((body.vel.y * 32) / 1000) * this._config.velocityMultiplier;\n if (multdx < 0) {\n b.left += multdx;\n }\n else {\n b.right += multdx;\n }\n if (multdy < 0) {\n b.top += multdy;\n }\n else {\n b.bottom += multdy;\n }\n }\n }\n node.bounds = b;\n this._insert(node);\n return true;\n }\n /**\n * Untracks a body from the dynamic tree\n */\n untrackCollider(collider) {\n const node = this.nodes[collider.id.value];\n if (!node) {\n return;\n }\n this._remove(node);\n this.nodes[collider.id.value] = null;\n delete this.nodes[collider.id.value];\n }\n /**\n * Balances the tree about a node\n */\n _balance(node) {\n if (node === null) {\n throw new Error('Cannot balance at null node');\n }\n if (node.isLeaf() || node.height < 2) {\n return node;\n }\n const left = node.left;\n const right = node.right;\n const a = node;\n const b = left;\n const c = right;\n const d = left.left;\n const e = left.right;\n const f = right.left;\n const g = right.right;\n const balance = c.height - b.height;\n // Rotate c node up\n if (balance > 1) {\n // Swap the right node with it's parent\n c.left = a;\n c.parent = a.parent;\n a.parent = c;\n // The original node's old parent should point to the right node\n // this is mega confusing\n if (c.parent) {\n if (c.parent.left === a) {\n c.parent.left = c;\n }\n else {\n c.parent.right = c;\n }\n }\n else {\n this.root = c;\n }\n // Rotate\n if (f.height > g.height) {\n c.right = f;\n a.right = g;\n g.parent = a;\n a.bounds = b.bounds.combine(g.bounds);\n c.bounds = a.bounds.combine(f.bounds);\n a.height = 1 + Math.max(b.height, g.height);\n c.height = 1 + Math.max(a.height, f.height);\n }\n else {\n c.right = g;\n a.right = f;\n f.parent = a;\n a.bounds = b.bounds.combine(f.bounds);\n c.bounds = a.bounds.combine(g.bounds);\n a.height = 1 + Math.max(b.height, f.height);\n c.height = 1 + Math.max(a.height, g.height);\n }\n return c;\n }\n // Rotate left node up\n if (balance < -1) {\n // swap\n b.left = a;\n b.parent = a.parent;\n a.parent = b;\n // node's old parent should point to b\n if (b.parent) {\n if (b.parent.left === a) {\n b.parent.left = b;\n }\n else {\n if (b.parent.right !== a) {\n throw 'Error rotating Dynamic Tree';\n }\n b.parent.right = b;\n }\n }\n else {\n this.root = b;\n }\n // rotate\n if (d.height > e.height) {\n b.right = d;\n a.left = e;\n e.parent = a;\n a.bounds = c.bounds.combine(e.bounds);\n b.bounds = a.bounds.combine(d.bounds);\n a.height = 1 + Math.max(c.height, e.height);\n b.height = 1 + Math.max(a.height, d.height);\n }\n else {\n b.right = e;\n a.left = d;\n d.parent = a;\n a.bounds = c.bounds.combine(d.bounds);\n b.bounds = a.bounds.combine(e.bounds);\n a.height = 1 + Math.max(c.height, d.height);\n b.height = 1 + Math.max(a.height, e.height);\n }\n return b;\n }\n return node;\n }\n /**\n * Returns the internal height of the tree, shorter trees are better. Performance drops as the tree grows\n */\n getHeight() {\n if (this.root === null) {\n return 0;\n }\n return this.root.height;\n }\n /**\n * Queries the Dynamic Axis Aligned Tree for bodies that could be colliding with the provided body.\n *\n * In the query callback, it will be passed a potential collider. Returning true from this callback indicates\n * that you are complete with your query and you do not want to continue. Returning false will continue searching\n * the tree until all possible colliders have been returned.\n */\n query(collider, callback) {\n const bounds = collider.bounds;\n const helper = (currentNode) => {\n if (currentNode && currentNode.bounds.overlaps(bounds)) {\n if (currentNode.isLeaf() && currentNode.data !== collider) {\n if (callback.call(collider, currentNode.data)) {\n return true;\n }\n }\n else {\n return helper(currentNode.left) || helper(currentNode.right);\n }\n }\n return false;\n };\n helper(this.root);\n }\n /**\n * Queries the Dynamic Axis Aligned Tree for bodies that could be intersecting. By default the raycast query uses an infinitely\n * long ray to test the tree specified by `max`.\n *\n * In the query callback, it will be passed a potential body that intersects with the raycast. Returning true from this\n * callback indicates that your are complete with your query and do not want to continue. Return false will continue searching\n * the tree until all possible bodies that would intersect with the ray have been returned.\n */\n rayCastQuery(ray, max = Infinity, callback) {\n const helper = (currentNode) => {\n if (currentNode && currentNode.bounds.rayCast(ray, max)) {\n if (currentNode.isLeaf()) {\n if (callback.call(ray, currentNode.data)) {\n // ray hit a leaf! return the body\n return true;\n }\n }\n else {\n // ray hit but not at a leaf, recurse deeper\n return helper(currentNode.left) || helper(currentNode.right);\n }\n }\n return false; // ray missed\n };\n helper(this.root);\n }\n getNodes() {\n const helper = (currentNode) => {\n if (currentNode) {\n return [currentNode].concat(helper(currentNode.left), helper(currentNode.right));\n }\n else {\n return [];\n }\n };\n return helper(this.root);\n }\n debug(ex) {\n // draw all the nodes in the Dynamic Tree\n const helper = (currentNode) => {\n if (currentNode) {\n if (currentNode.isLeaf()) {\n currentNode.bounds.draw(ex, ___WEBPACK_IMPORTED_MODULE_3__.Color.Green);\n }\n else {\n currentNode.bounds.draw(ex, ___WEBPACK_IMPORTED_MODULE_3__.Color.White);\n }\n if (currentNode.left) {\n helper(currentNode.left);\n }\n if (currentNode.right) {\n helper(currentNode.right);\n }\n }\n };\n helper(this.root);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Detection/DynamicTreeCollisionProcessor.ts\":\n/*!**************************************************************!*\\\n !*** ./Collision/Detection/DynamicTreeCollisionProcessor.ts ***!\n \\**************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DynamicTreeCollisionProcessor: () => (/* binding */ DynamicTreeCollisionProcessor)\n/* harmony export */ });\n/* harmony import */ var _DynamicTree__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./DynamicTree */ \"./Collision/Detection/DynamicTree.ts\");\n/* harmony import */ var _Pair__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Pair */ \"./Collision/Detection/Pair.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math_ray__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../Math/ray */ \"./Math/ray.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Colliders/CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Group/CollisionGroup */ \"./Collision/Group/CollisionGroup.ts\");\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Id__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Id */ \"./Id.ts\");\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Responsible for performing the collision broadphase (locating potential collisions) and\n * the narrowphase (actual collision contacts)\n */\nclass DynamicTreeCollisionProcessor {\n constructor(_config) {\n this._config = _config;\n this._pairs = new Set();\n this._collisionPairCache = [];\n this._colliders = [];\n this._dynamicCollisionTree = new _DynamicTree__WEBPACK_IMPORTED_MODULE_0__.DynamicTree(_config.dynamicTree);\n }\n getColliders() {\n return this._colliders;\n }\n query(pointOrBounds) {\n const results = [];\n if (pointOrBounds instanceof _BoundingBox__WEBPACK_IMPORTED_MODULE_1__.BoundingBox) {\n this._dynamicCollisionTree.query({\n id: (0,_Id__WEBPACK_IMPORTED_MODULE_2__.createId)('collider', -1),\n owner: null,\n bounds: pointOrBounds\n }, (other) => {\n results.push(other);\n return false;\n });\n }\n else {\n this._dynamicCollisionTree.query({\n id: (0,_Id__WEBPACK_IMPORTED_MODULE_2__.createId)('collider', -1),\n owner: null,\n bounds: new _BoundingBox__WEBPACK_IMPORTED_MODULE_1__.BoundingBox(pointOrBounds.x, pointOrBounds.y, pointOrBounds.x, pointOrBounds.y)\n }, (other) => {\n results.push(other);\n return false;\n });\n }\n return results;\n }\n rayCast(ray, options) {\n var _a, _b, _c;\n const results = [];\n const maxDistance = (_a = options === null || options === void 0 ? void 0 : options.maxDistance) !== null && _a !== void 0 ? _a : Infinity;\n const collisionGroup = options === null || options === void 0 ? void 0 : options.collisionGroup;\n const collisionMask = !collisionGroup ? (_b = options === null || options === void 0 ? void 0 : options.collisionMask) !== null && _b !== void 0 ? _b : _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_3__.CollisionGroup.All.category : collisionGroup.category;\n const searchAllColliders = (_c = options === null || options === void 0 ? void 0 : options.searchAllColliders) !== null && _c !== void 0 ? _c : false;\n this._dynamicCollisionTree.rayCastQuery(ray, maxDistance, (collider) => {\n const owner = collider.owner;\n const maybeBody = owner.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_4__.BodyComponent);\n if ((options === null || options === void 0 ? void 0 : options.ignoreCollisionGroupAll) && maybeBody.group === _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_3__.CollisionGroup.All) {\n return false;\n }\n const canCollide = (collisionMask & maybeBody.group.category) !== 0;\n // Early exit if not the right group\n if ((maybeBody === null || maybeBody === void 0 ? void 0 : maybeBody.group) && !canCollide) {\n return false;\n }\n const hit = collider.rayCast(ray, maxDistance);\n if (hit) {\n if (options === null || options === void 0 ? void 0 : options.filter) {\n if (options.filter(hit)) {\n results.push(hit);\n if (!searchAllColliders) {\n // returning true exits the search\n return true;\n }\n }\n }\n else {\n results.push(hit);\n if (!searchAllColliders) {\n // returning true exits the search\n return true;\n }\n }\n }\n return false;\n });\n return results;\n }\n /**\n * Tracks a physics body for collisions\n */\n track(target) {\n if (!target) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_5__.Logger.getInstance().warn('Cannot track null collider');\n return;\n }\n if (target instanceof _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_6__.CompositeCollider) {\n const colliders = target.getColliders();\n for (const c of colliders) {\n c.owner = target.owner;\n this._colliders.push(c);\n this._dynamicCollisionTree.trackCollider(c);\n }\n }\n else {\n this._colliders.push(target);\n this._dynamicCollisionTree.trackCollider(target);\n }\n }\n /**\n * Untracks a physics body\n */\n untrack(target) {\n if (!target) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_5__.Logger.getInstance().warn('Cannot untrack a null collider');\n return;\n }\n if (target instanceof _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_6__.CompositeCollider) {\n const colliders = target.getColliders();\n for (const c of colliders) {\n const index = this._colliders.indexOf(c);\n if (index !== -1) {\n this._colliders.splice(index, 1);\n }\n this._dynamicCollisionTree.untrackCollider(c);\n }\n }\n else {\n const index = this._colliders.indexOf(target);\n if (index !== -1) {\n this._colliders.splice(index, 1);\n }\n this._dynamicCollisionTree.untrackCollider(target);\n }\n }\n _pairExists(colliderA, colliderB) {\n // if the collision pair has been calculated already short circuit\n const hash = _Pair__WEBPACK_IMPORTED_MODULE_7__.Pair.calculatePairHash(colliderA.id, colliderB.id);\n return this._pairs.has(hash);\n }\n /**\n * Detects potential collision pairs in a broadphase approach with the dynamic AABB tree strategy\n */\n broadphase(targets, elapsed, stats) {\n const seconds = elapsed / 1000;\n // Retrieve the list of potential colliders, exclude killed, prevented, and self\n const potentialColliders = targets.filter((other) => {\n var _a, _b;\n const body = (_a = other.owner) === null || _a === void 0 ? void 0 : _a.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_4__.BodyComponent);\n return ((_b = other.owner) === null || _b === void 0 ? void 0 : _b.isActive) && body.collisionType !== _CollisionType__WEBPACK_IMPORTED_MODULE_8__.CollisionType.PreventCollision;\n });\n // clear old list of collision pairs\n this._collisionPairCache = [];\n this._pairs.clear();\n // check for normal collision pairs\n let collider;\n for (let j = 0, l = potentialColliders.length; j < l; j++) {\n collider = potentialColliders[j];\n // Query the collision tree for potential colliders\n this._dynamicCollisionTree.query(collider, (other) => {\n if (!this._pairExists(collider, other) && _Pair__WEBPACK_IMPORTED_MODULE_7__.Pair.canCollide(collider, other)) {\n const pair = new _Pair__WEBPACK_IMPORTED_MODULE_7__.Pair(collider, other);\n this._pairs.add(pair.id);\n this._collisionPairCache.push(pair);\n }\n // Always return false, to query whole tree. Returning true in the query method stops searching\n return false;\n });\n }\n if (stats) {\n stats.physics.pairs = this._collisionPairCache.length;\n }\n // Check dynamic tree for fast moving objects\n // Fast moving objects are those moving at least there smallest bound per frame\n if (this._config.continuous.checkForFastBodies) {\n for (const collider of potentialColliders) {\n const body = collider.owner.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_4__.BodyComponent);\n // Skip non-active objects. Does not make sense on other collision types\n if (body.collisionType !== _CollisionType__WEBPACK_IMPORTED_MODULE_8__.CollisionType.Active) {\n continue;\n }\n // Maximum travel distance next frame\n const updateDistance = body.vel.magnitude * seconds + // velocity term\n body.acc.magnitude * 0.5 * seconds * seconds; // acc term\n // Find the minimum dimension\n const minDimension = Math.min(collider.bounds.height, collider.bounds.width);\n if (this._config.continuous.disableMinimumSpeedForFastBody || updateDistance > minDimension / 2) {\n if (stats) {\n stats.physics.fastBodies++;\n }\n // start with the oldPos because the integration for actors has already happened\n // objects resting on a surface may be slightly penetrating in the current position\n const updateVec = body.globalPos.sub(body.oldPos);\n const centerPoint = collider.center;\n const furthestPoint = collider.getFurthestPoint(body.vel);\n const origin = furthestPoint.sub(updateVec);\n const ray = new _Math_ray__WEBPACK_IMPORTED_MODULE_9__.Ray(origin, body.vel);\n // back the ray up by -2x surfaceEpsilon to account for fast moving objects starting on the surface\n ray.pos = ray.pos.add(ray.dir.scale(-2 * this._config.continuous.surfaceEpsilon));\n let minCollider;\n let minTranslate = new _Math_vector__WEBPACK_IMPORTED_MODULE_10__.Vector(Infinity, Infinity);\n this._dynamicCollisionTree.rayCastQuery(ray, updateDistance + this._config.continuous.surfaceEpsilon * 2, (other) => {\n if (!this._pairExists(collider, other) && _Pair__WEBPACK_IMPORTED_MODULE_7__.Pair.canCollide(collider, other)) {\n const hit = other.rayCast(ray, updateDistance + this._config.continuous.surfaceEpsilon * 10);\n if (hit) {\n const translate = hit.point.sub(origin);\n if (translate.magnitude < minTranslate.magnitude) {\n minTranslate = translate;\n minCollider = other;\n }\n }\n }\n return false;\n });\n if (minCollider && _Math_vector__WEBPACK_IMPORTED_MODULE_10__.Vector.isValid(minTranslate)) {\n const pair = new _Pair__WEBPACK_IMPORTED_MODULE_7__.Pair(collider, minCollider);\n if (!this._pairs.has(pair.id)) {\n this._pairs.add(pair.id);\n this._collisionPairCache.push(pair);\n }\n // move the fast moving object to the other body\n // need to push into the surface by ex.Physics.surfaceEpsilon\n const shift = centerPoint.sub(furthestPoint);\n body.globalPos = origin\n .add(shift)\n .add(minTranslate)\n .add(ray.dir.scale(10 * this._config.continuous.surfaceEpsilon)); // needed to push the shape slightly into contact\n collider.update(body.transform.get());\n if (stats) {\n stats.physics.fastBodyCollisions++;\n }\n }\n }\n }\n }\n // return cache\n return this._collisionPairCache;\n }\n /**\n * Applies narrow phase on collision pairs to find actual area intersections\n * Adds actual colliding pairs to stats' Frame data\n */\n narrowphase(pairs, stats) {\n let contacts = [];\n for (let i = 0; i < pairs.length; i++) {\n const newContacts = pairs[i].collide();\n contacts = contacts.concat(newContacts);\n if (stats && newContacts.length > 0) {\n for (const c of newContacts) {\n stats.physics.contacts.set(c.id, c);\n }\n }\n }\n if (stats) {\n stats.physics.collisions += contacts.length;\n }\n return contacts;\n }\n /**\n * Update the dynamic tree positions\n */\n update(targets) {\n let updated = 0;\n const len = targets.length;\n for (let i = 0; i < len; i++) {\n if (this._dynamicCollisionTree.updateCollider(targets[i])) {\n updated++;\n }\n }\n return updated;\n }\n debug(ex) {\n this._dynamicCollisionTree.debug(ex);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Detection/Pair.ts\":\n/*!*************************************!*\\\n !*** ./Collision/Detection/Pair.ts ***!\n \\*************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Pair: () => (/* binding */ Pair)\n/* harmony export */ });\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../BodyComponent */ \"./Collision/BodyComponent.ts\");\n\n\n/**\n * Models a potential collision between 2 colliders\n */\nclass Pair {\n constructor(colliderA, colliderB) {\n this.colliderA = colliderA;\n this.colliderB = colliderB;\n this.id = null;\n this.id = Pair.calculatePairHash(colliderA.id, colliderB.id);\n }\n /**\n * Returns whether a it is allowed for 2 colliders in a Pair to collide\n * @param colliderA\n * @param colliderB\n */\n static canCollide(colliderA, colliderB) {\n var _a, _b;\n // Prevent self collision\n if (colliderA.id === colliderB.id) {\n return false;\n }\n // Colliders with the same owner do not collide (composite colliders)\n if (colliderA.owner && colliderB.owner && colliderA.owner.id === colliderB.owner.id) {\n return false;\n }\n // if the pair has a member with zero dimension don't collide\n if (colliderA.localBounds.hasZeroDimensions() || colliderB.localBounds.hasZeroDimensions()) {\n return false;\n }\n const bodyA = (_a = colliderA === null || colliderA === void 0 ? void 0 : colliderA.owner) === null || _a === void 0 ? void 0 : _a.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_0__.BodyComponent);\n const bodyB = (_b = colliderB === null || colliderB === void 0 ? void 0 : colliderB.owner) === null || _b === void 0 ? void 0 : _b.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_0__.BodyComponent);\n // Body's needed for collision in the current state\n // TODO can we collide without a body?\n if (!bodyA || !bodyB) {\n return false;\n }\n // If both are in the same collision group short circuit\n if (!bodyA.group.canCollide(bodyB.group)) {\n return false;\n }\n // if both are fixed short circuit\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_1__.CollisionType.Fixed && bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_1__.CollisionType.Fixed) {\n return false;\n }\n // if the either is prevent collision short circuit\n if (bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_1__.CollisionType.PreventCollision || bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_1__.CollisionType.PreventCollision) {\n return false;\n }\n // if either is dead short circuit\n if (!bodyA.isActive || !bodyB.isActive) {\n return false;\n }\n return true;\n }\n /**\n * Returns whether or not it is possible for the pairs to collide\n */\n get canCollide() {\n const colliderA = this.colliderA;\n const colliderB = this.colliderB;\n return Pair.canCollide(colliderA, colliderB);\n }\n /**\n * Runs the collision intersection logic on the members of this pair\n */\n collide() {\n return this.colliderA.collide(this.colliderB);\n }\n /**\n * Check if the collider is part of the pair\n * @param collider\n */\n hasCollider(collider) {\n return collider === this.colliderA || collider === this.colliderB;\n }\n /**\n * Calculates the unique pair hash id for this collision pair (owning id)\n */\n static calculatePairHash(idA, idB) {\n if (idA.value < idB.value) {\n return `#${idA.value}+${idB.value}`;\n }\n else {\n return `#${idB.value}+${idA.value}`;\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Detection/QuadTree.ts\":\n/*!*****************************************!*\\\n !*** ./Collision/Detection/QuadTree.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ QuadTree: () => (/* binding */ QuadTree)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Color */ \"./Color.ts\");\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n\n\n/**\n * QuadTree spatial data structure. Useful for quickly retrieving all objects that might\n * be in a specific location.\n */\nclass QuadTree {\n constructor(bounds, options) {\n this.bounds = bounds;\n this.options = options;\n this._defaultOptions = {\n maxDepth: 10,\n capacity: 10,\n level: 0\n };\n this.items = [];\n this._isDivided = false;\n this.topLeft = null;\n this.topRight = null;\n this.bottomLeft = null;\n this.bottomRight = null;\n this.options = { ...this._defaultOptions, ...options };\n this.halfWidth = bounds.width / 2;\n this.halfHeight = bounds.height / 2;\n }\n /**\n * Splits the quad tree one level deeper\n */\n _split() {\n this._isDivided = true;\n const newLevelOptions = {\n maxDepth: this.options.maxDepth,\n capacity: this.options.capacity,\n level: this.options.level + 1\n };\n this.topLeft = new QuadTree(new _BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox({\n left: this.bounds.left,\n top: this.bounds.top,\n right: this.bounds.left + this.halfWidth,\n bottom: this.bounds.top + this.halfHeight\n }), newLevelOptions);\n this.topRight = new QuadTree(new _BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox({\n left: this.bounds.left + this.halfWidth,\n top: this.bounds.top,\n right: this.bounds.right,\n bottom: this.bounds.top + this.halfHeight\n }), newLevelOptions);\n this.bottomLeft = new QuadTree(new _BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox({\n left: this.bounds.left,\n top: this.bounds.top + this.halfHeight,\n right: this.bounds.left + this.halfWidth,\n bottom: this.bounds.bottom\n }), newLevelOptions);\n this.bottomRight = new QuadTree(new _BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox({\n left: this.bounds.left + this.halfWidth,\n top: this.bounds.top + this.halfHeight,\n right: this.bounds.right,\n bottom: this.bounds.bottom\n }), newLevelOptions);\n }\n _insertIntoSubNodes(item) {\n var _a, _b, _c, _d;\n if ((_a = this.topLeft) === null || _a === void 0 ? void 0 : _a.bounds.overlaps(item.bounds)) {\n this.topLeft.insert(item);\n }\n if ((_b = this.topRight) === null || _b === void 0 ? void 0 : _b.bounds.overlaps(item.bounds)) {\n this.topRight.insert(item);\n }\n if ((_c = this.bottomLeft) === null || _c === void 0 ? void 0 : _c.bounds.overlaps(item.bounds)) {\n this.bottomLeft.insert(item);\n }\n if ((_d = this.bottomRight) === null || _d === void 0 ? void 0 : _d.bounds.overlaps(item.bounds)) {\n this.bottomRight.insert(item);\n }\n }\n /**\n * Insert an item to be tracked in the QuadTree\n * @param item\n */\n insert(item) {\n // add to subnodes if it matches\n if (this._isDivided) {\n this._insertIntoSubNodes(item);\n return;\n }\n // leaf case\n this.items.push(item);\n // capacity\n if (this.items.length > this.options.capacity && this.options.level < this.options.maxDepth) {\n if (!this._isDivided) {\n this._split();\n }\n // divide this level's items into it's subnodes\n for (const item of this.items) {\n this._insertIntoSubNodes(item);\n }\n // clear this level\n this.items.length = 0;\n }\n }\n /**\n * Remove a tracked item in the QuadTree\n * @param item\n */\n remove(item) {\n var _a, _b, _c, _d;\n if (!this.bounds.overlaps(item.bounds)) {\n return;\n }\n if (!this._isDivided) {\n const index = this.items.indexOf(item);\n if (index > -1) {\n this.items.splice(index, 1);\n }\n return;\n }\n if ((_a = this.topLeft) === null || _a === void 0 ? void 0 : _a.bounds.overlaps(item.bounds)) {\n this.topLeft.remove(item);\n }\n if ((_b = this.topRight) === null || _b === void 0 ? void 0 : _b.bounds.overlaps(item.bounds)) {\n this.topRight.remove(item);\n }\n if ((_c = this.bottomLeft) === null || _c === void 0 ? void 0 : _c.bounds.overlaps(item.bounds)) {\n this.bottomLeft.remove(item);\n }\n if ((_d = this.bottomRight) === null || _d === void 0 ? void 0 : _d.bounds.overlaps(item.bounds)) {\n this.bottomRight.remove(item);\n }\n }\n /**\n * Query the structure for all objects that intersect the bounding box\n * @param boundingBox\n * @returns items\n */\n query(boundingBox) {\n let results = this.items;\n if (this._isDivided) {\n if (this.topLeft.bounds.overlaps(boundingBox)) {\n results = results.concat(this.topLeft.query(boundingBox));\n }\n if (this.topRight.bounds.overlaps(boundingBox)) {\n results = results.concat(this.topRight.query(boundingBox));\n }\n if (this.bottomLeft.bounds.overlaps(boundingBox)) {\n results = results.concat(this.bottomLeft.query(boundingBox));\n }\n if (this.bottomRight.bounds.overlaps(boundingBox)) {\n results = results.concat(this.bottomRight.query(boundingBox));\n }\n }\n results = results.filter((item, index) => {\n return results.indexOf(item) >= index;\n });\n return results;\n }\n clear() {\n this.items = [];\n this._isDivided = false;\n this.topLeft = null;\n this.topRight = null;\n this.bottomLeft = null;\n this.bottomRight = null;\n }\n getAllItems() {\n let results = this.items;\n if (this._isDivided) {\n results = results.concat(this.topLeft.getAllItems());\n results = results.concat(this.topRight.getAllItems());\n results = results.concat(this.bottomLeft.getAllItems());\n results = results.concat(this.bottomRight.getAllItems());\n }\n results = results.filter((item, index) => {\n return results.indexOf(item) >= index;\n });\n return results;\n }\n getTreeDepth() {\n if (!this._isDivided) {\n return 0;\n }\n return (1 +\n Math.max(this.topLeft.getTreeDepth(), this.topRight.getTreeDepth(), this.bottomLeft.getTreeDepth(), this.bottomRight.getTreeDepth()));\n }\n debug(ctx) {\n this.bounds.draw(ctx, _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Yellow);\n if (this._isDivided) {\n this.topLeft.bounds.draw(ctx, _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Yellow);\n this.topRight.bounds.draw(ctx, _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Yellow);\n this.bottomLeft.bounds.draw(ctx, _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Yellow);\n this.bottomRight.bounds.draw(ctx, _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Yellow);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Detection/SparseHashGrid.ts\":\n/*!***********************************************!*\\\n !*** ./Collision/Detection/SparseHashGrid.ts ***!\n \\***********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ HashGridCell: () => (/* binding */ HashGridCell),\n/* harmony export */ HashGridProxy: () => (/* binding */ HashGridProxy),\n/* harmony export */ SparseHashGrid: () => (/* binding */ SparseHashGrid)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Color */ \"./Color.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_RentalPool__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Util/RentalPool */ \"./Util/RentalPool.ts\");\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../BoundingBox */ \"./Collision/BoundingBox.ts\");\n\n\n\n\nclass HashGridProxy {\n constructor(object, gridSize) {\n this.object = object;\n this.id = -1;\n this.cells = [];\n this.hasZeroBounds = false;\n this.gridSize = gridSize;\n this.bounds = object.bounds;\n this.hasZeroBounds = this.bounds.hasZeroDimensions();\n this.leftX = Math.floor(this.bounds.left / this.gridSize);\n this.rightX = Math.floor(this.bounds.right / this.gridSize);\n this.bottomY = Math.floor(this.bounds.bottom / this.gridSize);\n this.topY = Math.floor(this.bounds.top / this.gridSize);\n }\n /**\n * Has the hashed bounds changed\n */\n hasChanged() {\n const bounds = this.object.bounds;\n const leftX = Math.floor(bounds.left / this.gridSize);\n const rightX = Math.floor(bounds.right / this.gridSize);\n const bottomY = Math.floor(bounds.bottom / this.gridSize);\n const topY = Math.floor(bounds.top / this.gridSize);\n if (this.leftX !== leftX || this.rightX !== rightX || this.bottomY !== bottomY || this.topY !== topY) {\n return true;\n }\n return false;\n }\n /**\n * Clears all collider references\n */\n clear() {\n for (const cell of this.cells) {\n const index = cell.proxies.indexOf(this);\n if (index > -1) {\n cell.proxies.splice(index, 1);\n }\n // TODO reclaim cell in pool if empty?\n }\n }\n /**\n * Update bounds of the proxy\n */\n updateBounds() {\n this.bounds = this.object.bounds;\n }\n /**\n * Updates the hashed bounds coordinates\n */\n update() {\n this.bounds = this.object.bounds;\n this.leftX = Math.floor(this.bounds.left / this.gridSize);\n this.rightX = Math.floor(this.bounds.right / this.gridSize);\n this.bottomY = Math.floor(this.bounds.bottom / this.gridSize);\n this.topY = Math.floor(this.bounds.top / this.gridSize);\n this.hasZeroBounds = this.object.bounds.hasZeroDimensions();\n }\n}\nclass HashGridCell {\n constructor() {\n this.proxies = [];\n }\n configure(x, y) {\n this.x = x;\n this.y = y;\n this.key = HashGridCell.calculateHashKey(x, y);\n }\n static calculateHashKey(x, y) {\n return `${x}+${y}`;\n }\n}\nclass SparseHashGrid {\n constructor(options) {\n this.bounds = new _BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox();\n this._hashGridCellPool = new _Util_RentalPool__WEBPACK_IMPORTED_MODULE_1__.RentalPool(() => new HashGridCell(), (instance) => {\n instance.configure(0, 0);\n instance.proxies.length = 0;\n return instance;\n }, 1000);\n this.gridSize = options.size;\n this.sparseHashGrid = new Map();\n this.objectToProxy = new Map();\n if (options.proxyFactory) {\n this._buildProxy = (object) => options.proxyFactory(object, this.gridSize);\n }\n else {\n this._buildProxy = (object) => new HashGridProxy(object, this.gridSize);\n }\n // TODO dynamic grid size potentially larger than the largest collider\n // TODO Re-hash the objects if the median proves to be different\n }\n query(boundsOrPoint) {\n const results = new Set();\n if (boundsOrPoint instanceof _BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox) {\n const bounds = boundsOrPoint;\n const leftX = Math.floor(bounds.left / this.gridSize);\n const rightX = Math.floor(bounds.right / this.gridSize);\n const bottomY = Math.floor(bounds.bottom / this.gridSize);\n const topY = Math.floor(bounds.top / this.gridSize);\n for (let x = leftX; x <= rightX; x++) {\n for (let y = topY; y <= bottomY; y++) {\n const key = HashGridCell.calculateHashKey(x, y);\n // Hash bounds into appropriate cell\n const cell = this.sparseHashGrid.get(key);\n if (cell) {\n for (let i = 0; i < cell.proxies.length; i++) {\n cell.proxies[i].updateBounds();\n if (cell.proxies[i].bounds.intersect(bounds)) {\n results.add(cell.proxies[i].object);\n }\n }\n }\n }\n }\n }\n else {\n const point = boundsOrPoint;\n const key = HashGridCell.calculateHashKey(Math.floor(point.x / this.gridSize), Math.floor(point.y / this.gridSize));\n // Hash points into appropriate cell\n const cell = this.sparseHashGrid.get(key);\n if (cell) {\n for (let i = 0; i < cell.proxies.length; i++) {\n cell.proxies[i].updateBounds();\n if (cell.proxies[i].bounds.contains(point)) {\n results.add(cell.proxies[i].object);\n }\n }\n }\n }\n return Array.from(results);\n }\n get(xCoord, yCoord) {\n const key = HashGridCell.calculateHashKey(xCoord, yCoord);\n const cell = this.sparseHashGrid.get(key);\n return cell;\n }\n _insert(x, y, proxy) {\n const key = HashGridCell.calculateHashKey(x, y);\n // Hash collider into appropriate cell\n let cell = this.sparseHashGrid.get(key);\n if (!cell) {\n cell = this._hashGridCellPool.rent();\n cell.configure(x, y);\n this.sparseHashGrid.set(cell.key, cell);\n }\n cell.proxies.push(proxy);\n proxy.cells.push(cell); // TODO dupes, doesn't seem to be a problem\n this.bounds.combine(proxy.bounds, this.bounds);\n }\n _remove(x, y, proxy) {\n const key = HashGridCell.calculateHashKey(x, y);\n // Hash collider into appropriate cell\n const cell = this.sparseHashGrid.get(key);\n if (cell) {\n const proxyIndex = cell.proxies.indexOf(proxy);\n if (proxyIndex > -1) {\n cell.proxies.splice(proxyIndex, 1);\n }\n const cellIndex = proxy.cells.indexOf(cell);\n if (cellIndex > -1) {\n proxy.cells.splice(cellIndex, 1);\n }\n if (cell.proxies.length === 0) {\n this._hashGridCellPool.return(cell);\n this.sparseHashGrid.delete(key);\n }\n }\n }\n track(target) {\n const proxy = this._buildProxy(target);\n this.objectToProxy.set(target, proxy);\n for (let x = proxy.leftX; x <= proxy.rightX; x++) {\n for (let y = proxy.topY; y <= proxy.bottomY; y++) {\n this._insert(x, y, proxy);\n }\n }\n }\n untrack(target) {\n const proxy = this.objectToProxy.get(target);\n if (proxy) {\n proxy.clear();\n this.objectToProxy.delete(target);\n }\n }\n update(targets) {\n let updated = 0;\n // FIXME resetting bounds is wrong, if nothing has updated then\n // the bounds stay 0\n // this.bounds.reset();\n for (const target of targets) {\n const proxy = this.objectToProxy.get(target);\n if (!proxy) {\n continue;\n }\n if (proxy.hasChanged()) {\n // TODO slightly wasteful only remove from changed\n for (let x = proxy.leftX; x <= proxy.rightX; x++) {\n for (let y = proxy.topY; y <= proxy.bottomY; y++) {\n this._remove(x, y, proxy);\n }\n }\n proxy.update();\n // TODO slightly wasteful only add new\n for (let x = proxy.leftX; x <= proxy.rightX; x++) {\n for (let y = proxy.topY; y <= proxy.bottomY; y++) {\n this._insert(x, y, proxy);\n }\n }\n updated++;\n }\n }\n return updated;\n }\n debug(ex, elapsed) {\n const transparent = _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Transparent;\n const color = _Color__WEBPACK_IMPORTED_MODULE_2__.Color.White;\n for (const cell of this.sparseHashGrid.values()) {\n ex.drawRectangle((0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(cell.x * this.gridSize, cell.y * this.gridSize), this.gridSize, this.gridSize, transparent, color, 2);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Detection/SparseHashGridCollisionProcessor.ts\":\n/*!*****************************************************************!*\\\n !*** ./Collision/Detection/SparseHashGridCollisionProcessor.ts ***!\n \\*****************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ HashColliderProxy: () => (/* binding */ HashColliderProxy),\n/* harmony export */ SparseHashGridCollisionProcessor: () => (/* binding */ SparseHashGridCollisionProcessor)\n/* harmony export */ });\n/* harmony import */ var _Id__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Id */ \"./Id.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_Pool__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Util/Pool */ \"./Util/Pool.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Colliders/CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Group/CollisionGroup */ \"./Collision/Group/CollisionGroup.ts\");\n/* harmony import */ var _Pair__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Pair */ \"./Collision/Detection/Pair.ts\");\n/* harmony import */ var _SparseHashGrid__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./SparseHashGrid */ \"./Collision/Detection/SparseHashGrid.ts\");\n\n\n\n\n\n\n\n\n\n/**\n * Proxy type to stash collision info\n */\nclass HashColliderProxy extends _SparseHashGrid__WEBPACK_IMPORTED_MODULE_0__.HashGridProxy {\n constructor(collider, gridSize) {\n var _a, _b;\n super(collider, gridSize);\n this.collider = collider;\n this.id = -1;\n this.hasZeroBounds = false;\n /**\n * References to the hash cell the collider is a current member of\n */\n this.cells = [];\n this.gridSize = gridSize;\n const bounds = collider.bounds;\n this.hasZeroBounds = bounds.hasZeroDimensions();\n this.leftX = Math.floor(bounds.left / this.gridSize);\n this.rightX = Math.floor(bounds.right / this.gridSize);\n this.bottomY = Math.floor(bounds.bottom / this.gridSize);\n this.topY = Math.floor(bounds.top / this.gridSize);\n this.owner = collider.owner;\n this.body = (_a = this.owner) === null || _a === void 0 ? void 0 : _a.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_1__.BodyComponent);\n this.collisionType = (_b = this.body.collisionType) !== null && _b !== void 0 ? _b : _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.PreventCollision;\n }\n /**\n * Updates the hashed bounds coordinates\n */\n update() {\n var _a, _b;\n super.update();\n this.body = (_a = this.owner) === null || _a === void 0 ? void 0 : _a.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_1__.BodyComponent);\n this.collisionType = (_b = this.body.collisionType) !== null && _b !== void 0 ? _b : _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.PreventCollision;\n this.hasZeroBounds = this.collider.localBounds.hasZeroDimensions();\n }\n}\n/**\n * This collision processor uses a sparsely populated grid of uniform cells to bucket potential\n * colliders together for the purpose of detecting collision pairs and collisions.\n */\nclass SparseHashGridCollisionProcessor {\n constructor(options) {\n this._pairs = new Set();\n this._nonPairs = new Set();\n this._pairPool = new _Util_Pool__WEBPACK_IMPORTED_MODULE_3__.Pool(() => new _Pair__WEBPACK_IMPORTED_MODULE_4__.Pair({ id: (0,_Id__WEBPACK_IMPORTED_MODULE_5__.createId)('collider', 0) }, { id: (0,_Id__WEBPACK_IMPORTED_MODULE_5__.createId)('collider', 0) }), (instance) => {\n instance.colliderA = null;\n instance.colliderB = null;\n return instance;\n }, 200);\n this.gridSize = options.size;\n this.hashGrid = new _SparseHashGrid__WEBPACK_IMPORTED_MODULE_0__.SparseHashGrid({\n size: this.gridSize,\n proxyFactory: (collider, size) => new HashColliderProxy(collider, size)\n });\n this._pairPool.disableWarnings = true;\n // TODO dynamic grid size potentially larger than the largest collider\n // TODO Re-hash the objects if the median proves to be different\n }\n getColliders() {\n return Array.from(this.hashGrid.objectToProxy.keys());\n }\n query(boundsOrPoint) {\n // FIXME workaround TS: https://github.com/microsoft/TypeScript/issues/14107\n return this.hashGrid.query(boundsOrPoint);\n }\n rayCast(ray, options) {\n var _a, _b, _c;\n // DDA raycast algo\n const results = [];\n const maxDistance = (_a = options === null || options === void 0 ? void 0 : options.maxDistance) !== null && _a !== void 0 ? _a : Infinity;\n const collisionGroup = options === null || options === void 0 ? void 0 : options.collisionGroup;\n const collisionMask = !collisionGroup ? (_b = options === null || options === void 0 ? void 0 : options.collisionMask) !== null && _b !== void 0 ? _b : _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_6__.CollisionGroup.All.category : collisionGroup.category;\n const searchAllColliders = (_c = options === null || options === void 0 ? void 0 : options.searchAllColliders) !== null && _c !== void 0 ? _c : false;\n const unitRay = ray.dir.normalize();\n const dydx = unitRay.y / unitRay.x;\n const dxdy = unitRay.x / unitRay.y;\n const unitStepX = Math.sqrt(1 + dydx * dydx) * this.gridSize;\n const unitStepY = Math.sqrt(1 + dxdy * dxdy) * this.gridSize;\n const startXCoord = ray.pos.x / this.gridSize;\n const startYCoord = ray.pos.y / this.gridSize;\n const stepDir = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_7__.vec)(1, 1);\n let currentXCoord = ~~startXCoord;\n let currentYCoord = ~~startYCoord;\n let currentRayLengthX = 0;\n let currentRayLengthY = 0;\n if (unitRay.x < 0) {\n stepDir.x = -1;\n currentRayLengthX = (startXCoord - currentXCoord) * unitStepX;\n }\n else {\n stepDir.x = 1;\n currentRayLengthX = (currentXCoord + 1 - startXCoord) * unitStepX;\n }\n if (unitRay.y < 0) {\n stepDir.y = -1;\n currentRayLengthY = (startYCoord - currentYCoord) * unitStepY;\n }\n else {\n stepDir.y = 1;\n currentRayLengthY = (currentYCoord + 1 - startYCoord) * unitStepY;\n }\n const collidersVisited = new Set();\n let done = false;\n let maxIterations = 9999;\n while (!done && maxIterations > 0) {\n maxIterations--; // safety exit\n // exit if exhausted max hash grid coordinate, bounds of the sparse grid\n if (!this.hashGrid.bounds.contains((0,_Math_vector__WEBPACK_IMPORTED_MODULE_7__.vec)(currentXCoord * this.gridSize, currentYCoord * this.gridSize))) {\n break;\n }\n // Test colliders at cell\n const key = _SparseHashGrid__WEBPACK_IMPORTED_MODULE_0__.HashGridCell.calculateHashKey(currentXCoord, currentYCoord);\n const cell = this.hashGrid.sparseHashGrid.get(key);\n if (cell) {\n const cellHits = [];\n for (let colliderIndex = 0; colliderIndex < cell.proxies.length; colliderIndex++) {\n const collider = cell.proxies[colliderIndex];\n if (!collidersVisited.has(collider.collider.id.value)) {\n collidersVisited.add(collider.collider.id.value);\n if ((options === null || options === void 0 ? void 0 : options.ignoreCollisionGroupAll) && collider.body.group === _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_6__.CollisionGroup.All) {\n continue;\n }\n const canCollide = (collisionMask & collider.body.group.category) !== 0;\n // Early exit if not the right group\n if (collider.body.group && !canCollide) {\n continue;\n }\n const hit = collider.collider.rayCast(ray, maxDistance);\n // Collect up all the colliders that hit inside a cell\n // they can be in any order so we need to sort them next\n if (hit) {\n cellHits.push(hit);\n }\n }\n }\n cellHits.sort((hit1, hit2) => hit1.distance - hit2.distance);\n for (let i = 0; i < cellHits.length; i++) {\n const hit = cellHits[i];\n if (options === null || options === void 0 ? void 0 : options.filter) {\n if (options.filter(hit)) {\n results.push(hit);\n if (!searchAllColliders) {\n done = true;\n break;\n }\n }\n }\n else {\n results.push(hit);\n if (!searchAllColliders) {\n done = true;\n break;\n }\n }\n }\n }\n if (currentRayLengthX < currentRayLengthY) {\n currentXCoord += stepDir.x;\n currentRayLengthX += unitStepX;\n }\n else {\n currentYCoord += stepDir.y;\n currentRayLengthY += unitStepY;\n }\n }\n // Sort by distance\n results.sort((hit1, hit2) => hit1.distance - hit2.distance);\n if (!searchAllColliders && results.length) {\n return [results[0]];\n }\n return results;\n }\n /**\n * Adds the collider to the internal data structure for collision tracking\n * @param target\n */\n track(target) {\n let colliders = [target];\n if (target instanceof _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_8__.CompositeCollider) {\n const compColliders = target.getColliders();\n for (const c of compColliders) {\n c.owner = target.owner;\n }\n colliders = compColliders;\n }\n for (const target of colliders) {\n this.hashGrid.track(target);\n }\n }\n /**\n * Removes a collider from the internal data structure for tracking collisions\n * @param target\n */\n untrack(target) {\n let colliders = [target];\n if (target instanceof _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_8__.CompositeCollider) {\n colliders = target.getColliders();\n }\n for (const target of colliders) {\n this.hashGrid.untrack(target);\n }\n }\n _canCollide(colliderA, colliderB) {\n // Prevent self collision\n if (colliderA.collider.id === colliderB.collider.id) {\n return false;\n }\n // Colliders with the same owner do not collide (composite colliders)\n if (colliderA.owner && colliderB.owner && colliderA.owner.id === colliderB.owner.id) {\n return false;\n }\n // if the pair has a member with zero dimension don't collide\n if (colliderA.hasZeroBounds || colliderB.hasZeroBounds) {\n return false;\n }\n // If both are in the same collision group short circuit\n if (!colliderA.body.group.canCollide(colliderB.body.group)) {\n return false;\n }\n // if both are fixed short circuit\n if (colliderA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.Fixed && colliderB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.Fixed) {\n return false;\n }\n // if the either is prevent collision short circuit\n if (colliderA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.PreventCollision || colliderB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.PreventCollision) {\n return false;\n }\n // if either is dead short circuit\n if (!colliderA.owner.isActive || !colliderB.owner.isActive) {\n return false;\n }\n return true;\n }\n /**\n * Runs the broadphase sweep over tracked colliders and returns possible collision pairs\n * @param targets\n * @param elapsed\n */\n broadphase(targets, elapsed) {\n const pairs = [];\n this._pairs.clear();\n this._nonPairs.clear();\n let proxyId = 0;\n for (const proxy of this.hashGrid.objectToProxy.values()) {\n proxy.id = proxyId++; // track proxies we've already processed\n if (!proxy.owner.isActive || proxy.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.PreventCollision) {\n continue;\n }\n // for every cell proxy collider is member of\n for (let cellIndex = 0; cellIndex < proxy.cells.length; cellIndex++) {\n const cell = proxy.cells[cellIndex];\n // TODO Can we skip any cells or make this iteration faster?\n // maybe a linked list here\n for (let otherIndex = 0; otherIndex < cell.proxies.length; otherIndex++) {\n const other = cell.proxies[otherIndex];\n if (other.id === proxy.id) {\n // skip duplicates\n continue;\n }\n const id = _Pair__WEBPACK_IMPORTED_MODULE_4__.Pair.calculatePairHash(proxy.collider.id, other.collider.id);\n if (this._nonPairs.has(id)) {\n continue; // Is there a way we can re-use the non-pair cache\n }\n if (!this._pairs.has(id) && this._canCollide(proxy, other) && proxy.object.bounds.overlaps(other.object.bounds)) {\n const pair = this._pairPool.get();\n pair.colliderA = proxy.collider;\n pair.colliderB = other.collider;\n pair.id = id;\n this._pairs.add(id);\n pairs.push(pair);\n }\n else {\n this._nonPairs.add(id);\n }\n }\n }\n }\n return pairs;\n }\n /**\n * Runs a fine grain pass on collision pairs and does geometry intersection tests producing any contacts\n * @param pairs\n * @param stats\n */\n narrowphase(pairs, stats) {\n const contacts = [];\n for (let i = 0; i < pairs.length; i++) {\n const newContacts = pairs[i].collide();\n for (let j = 0; j < newContacts.length; j++) {\n const c = newContacts[j];\n contacts.push(c);\n if (stats) {\n stats.physics.contacts.set(c.id, c);\n }\n }\n }\n this._pairPool.done();\n if (stats) {\n stats.physics.collisions += contacts.length;\n }\n return contacts; // TODO maybe we can re-use contacts as likely pairs next frame\n }\n /**\n * Perform data structure maintenance, returns number of colliders updated\n */\n update(targets, elapsed) {\n return this.hashGrid.update(targets);\n }\n /**\n * Draws the internal data structure\n * @param ex\n * @param elapsed\n */\n debug(ex, elapsed) {\n this.hashGrid.debug(ex, elapsed);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Detection/SpatialPartitionStrategy.ts\":\n/*!*********************************************************!*\\\n !*** ./Collision/Detection/SpatialPartitionStrategy.ts ***!\n \\*********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SpatialPartitionStrategy: () => (/* binding */ SpatialPartitionStrategy)\n/* harmony export */ });\n/**\n * Possible collision resolution strategies\n *\n * The default is {@apilink SolverStrategy.Arcade} which performs simple axis aligned arcade style physics. This is useful for things\n * like platformers or top down games.\n *\n * More advanced rigid body physics are enabled by setting {@apilink SolverStrategy.Realistic} which allows for complicated\n * simulated physical interactions.\n */\nvar SpatialPartitionStrategy;\n(function (SpatialPartitionStrategy) {\n SpatialPartitionStrategy[\"DynamicTree\"] = \"dynamic-tree\";\n SpatialPartitionStrategy[\"SparseHashGrid\"] = \"sparse-hash-grid\";\n})(SpatialPartitionStrategy || (SpatialPartitionStrategy = {}));\n\n\n/***/ }),\n\n/***/ \"./Collision/Group/CollisionGroup.ts\":\n/*!*******************************************!*\\\n !*** ./Collision/Group/CollisionGroup.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CollisionGroup: () => (/* binding */ CollisionGroup)\n/* harmony export */ });\n/* harmony import */ var _CollisionGroupManager__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./CollisionGroupManager */ \"./Collision/Group/CollisionGroupManager.ts\");\n\n/**\n * CollisionGroups indicate like members that do not collide with each other. Use {@apilink CollisionGroupManager} to create {@apilink CollisionGroup}s\n *\n * For example:\n *\n * Players have collision group \"player\"\n *\n * ![Player Collision Group](/assets/images/docs/CollisionGroupsPlayer.png)\n *\n * Enemies have collision group \"enemy\"\n *\n * ![Enemy Collision Group](/assets/images/docs/CollisionGroupsEnemy.png)\n *\n * Blocks have collision group \"ground\"\n *\n * ![Ground collision group](/assets/images/docs/CollisionGroupsGround.png)\n *\n * Players don't collide with each other, but enemies and blocks. Likewise, enemies don't collide with each other but collide\n * with players and blocks.\n *\n * This is done with bitmasking, see the following pseudo-code\n *\n * PlayerGroup = `0b001`\n * PlayerGroupMask = `0b110`\n *\n * EnemyGroup = `0b010`\n * EnemyGroupMask = `0b101`\n *\n * BlockGroup = `0b100`\n * BlockGroupMask = `0b011`\n *\n * Should Players collide? No because the bitwise mask evaluates to 0\n * `(player1.group & player2.mask) === 0`\n * `(0b001 & 0b110) === 0`\n *\n * Should Players and Enemies collide? Yes because the bitwise mask is non-zero\n * `(player1.group & enemy1.mask) === 1`\n * `(0b001 & 0b101) === 1`\n *\n * Should Players and Blocks collide? Yes because the bitwise mask is non-zero\n * `(player1.group & blocks1.mask) === 1`\n * `(0b001 & 0b011) === 1`\n */\nclass CollisionGroup {\n /**\n * STOP!!** It is preferred that {@apilink CollisionGroupManager.create} is used to create collision groups\n * unless you know how to construct the proper bitmasks. See https://github.com/excaliburjs/Excalibur/issues/1091 for more info.\n * @param name Name of the collision group\n * @param category 32 bit category for the group, should be a unique power of 2. For example `0b001` or `0b010`\n * @param mask 32 bit mask of category, or `~category` generally. For a category of `0b001`, the mask would be `0b110`\n */\n constructor(name, category, mask) {\n this._name = name;\n this._category = category;\n this._mask = mask;\n }\n /**\n * Get the name of the collision group\n */\n get name() {\n return this._name;\n }\n /**\n * Get the category of the collision group, a 32 bit number which should be a unique power of 2\n */\n get category() {\n return this._category;\n }\n /**\n * Get the mask for this collision group\n */\n get mask() {\n return this._mask;\n }\n /**\n * Evaluates whether 2 collision groups can collide\n *\n * This means the mask has the same bit set the other category and vice versa\n * @param other CollisionGroup\n */\n canCollide(other) {\n const overlap1 = this.category & other.mask;\n const overlap2 = this.mask & other.category;\n return overlap1 !== 0 && overlap2 !== 0;\n }\n /**\n * Inverts the collision group. For example, if before the group specified \"players\",\n * inverting would specify all groups except players\n * @returns CollisionGroup\n */\n invert() {\n const group = _CollisionGroupManager__WEBPACK_IMPORTED_MODULE_0__.CollisionGroupManager.create('~(' + this.name + ')', ~this.mask | 0);\n group._category = ~this.category;\n return group;\n }\n /**\n * Combine collision groups with each other. The new group includes all of the previous groups.\n * @param collisionGroups\n */\n static combine(collisionGroups) {\n const combinedName = collisionGroups.map((c) => c.name).join('+');\n const combinedCategory = collisionGroups.reduce((current, g) => g.category | current, 0b0);\n const combinedMask = ~combinedCategory;\n return _CollisionGroupManager__WEBPACK_IMPORTED_MODULE_0__.CollisionGroupManager.create(combinedName, combinedMask);\n }\n /**\n * Creates a collision group that collides with the listed groups\n * @param collisionGroups\n */\n static collidesWith(collisionGroups) {\n const combinedName = `collidesWith(${collisionGroups.map((c) => c.name).join('+')})`;\n const combinedMask = collisionGroups.reduce((current, g) => g.category | current, 0b0);\n return _CollisionGroupManager__WEBPACK_IMPORTED_MODULE_0__.CollisionGroupManager.create(combinedName, combinedMask);\n }\n toString() {\n return `\r\ncategory: ${this.category.toString(2).padStart(32, '0')}\r\nmask: ${(this.mask >>> 0).toString(2).padStart(32, '0')}\r\n `;\n }\n}\n/**\n * The `All` {@apilink CollisionGroup} is a special group that collides with all other groups including itself,\n * it is the default collision group on colliders.\n */\nCollisionGroup.All = new CollisionGroup('Collide with all groups', -1, -1);\n\n\n/***/ }),\n\n/***/ \"./Collision/Group/CollisionGroupManager.ts\":\n/*!**************************************************!*\\\n !*** ./Collision/Group/CollisionGroupManager.ts ***!\n \\**************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CollisionGroupManager: () => (/* binding */ CollisionGroupManager)\n/* harmony export */ });\n/* harmony import */ var _CollisionGroup__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./CollisionGroup */ \"./Collision/Group/CollisionGroup.ts\");\n\n/**\n * Static class for managing collision groups in excalibur, there is a maximum of 32 collision groups possible in excalibur\n */\nclass CollisionGroupManager {\n /**\n * Create a new named collision group up to a max of 32.\n * @param name Name for the collision group\n * @param mask Optionally provide your own 32-bit mask, if none is provide the manager will generate one\n */\n static create(name, mask) {\n if (this._CURRENT_GROUP > this._MAX_GROUPS) {\n throw new Error(`Cannot have more than ${this._MAX_GROUPS} collision groups`);\n }\n if (this._GROUPS.get(name)) {\n const existingGroup = this._GROUPS.get(name);\n if (existingGroup.mask === mask) {\n return existingGroup;\n }\n throw new Error(`Collision group ${name} already exists with a different mask!`);\n }\n const group = new _CollisionGroup__WEBPACK_IMPORTED_MODULE_0__.CollisionGroup(name, this._CURRENT_BIT, mask !== undefined ? mask : ~this._CURRENT_BIT);\n this._CURRENT_BIT = (this._CURRENT_BIT << 1) | 0;\n this._CURRENT_GROUP++;\n this._GROUPS.set(name, group);\n return group;\n }\n /**\n * Get all collision groups currently tracked by excalibur\n */\n static get groups() {\n return Array.from(this._GROUPS.values());\n }\n /**\n * Get a collision group by it's name\n * @param name\n */\n static groupByName(name) {\n return this._GROUPS.get(name);\n }\n /**\n * Resets the managers internal group management state\n */\n static reset() {\n this._GROUPS = new Map();\n this._CURRENT_BIT = this._STARTING_BIT;\n this._CURRENT_GROUP = 1;\n }\n}\n// using bitmasking the maximum number of groups is 32, because that is the highest 32bit integer that JS can present.\nCollisionGroupManager._STARTING_BIT = 0b1 | 0;\nCollisionGroupManager._MAX_GROUPS = 32;\nCollisionGroupManager._CURRENT_GROUP = 1;\nCollisionGroupManager._CURRENT_BIT = CollisionGroupManager._STARTING_BIT;\nCollisionGroupManager._GROUPS = new Map();\n\n\n/***/ }),\n\n/***/ \"./Collision/Index.ts\":\n/*!****************************!*\\\n !*** ./Collision/Index.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ArcadeSolver: () => (/* reexport safe */ _Solver_ArcadeSolver__WEBPACK_IMPORTED_MODULE_24__.ArcadeSolver),\n/* harmony export */ BodyComponent: () => (/* reexport safe */ _BodyComponent__WEBPACK_IMPORTED_MODULE_0__.BodyComponent),\n/* harmony export */ BoundingBox: () => (/* reexport safe */ _BoundingBox__WEBPACK_IMPORTED_MODULE_5__.BoundingBox),\n/* harmony export */ CircleCollider: () => (/* reexport safe */ _Colliders_CircleCollider__WEBPACK_IMPORTED_MODULE_8__.CircleCollider),\n/* harmony export */ ClosestLineJumpTable: () => (/* reexport safe */ _Colliders_ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_12__.ClosestLineJumpTable),\n/* harmony export */ Collider: () => (/* reexport safe */ _Colliders_Collider__WEBPACK_IMPORTED_MODULE_4__.Collider),\n/* harmony export */ ColliderComponent: () => (/* reexport safe */ _ColliderComponent__WEBPACK_IMPORTED_MODULE_1__.ColliderComponent),\n/* harmony export */ CollisionContact: () => (/* reexport safe */ _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_17__.CollisionContact),\n/* harmony export */ CollisionGroup: () => (/* reexport safe */ _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_14__.CollisionGroup),\n/* harmony export */ CollisionGroupManager: () => (/* reexport safe */ _Group_CollisionGroupManager__WEBPACK_IMPORTED_MODULE_15__.CollisionGroupManager),\n/* harmony export */ CollisionJumpTable: () => (/* reexport safe */ _Colliders_CollisionJumpTable__WEBPACK_IMPORTED_MODULE_11__.CollisionJumpTable),\n/* harmony export */ CollisionSystem: () => (/* reexport safe */ _CollisionSystem__WEBPACK_IMPORTED_MODULE_28__.CollisionSystem),\n/* harmony export */ CollisionType: () => (/* reexport safe */ _CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType),\n/* harmony export */ CompositeCollider: () => (/* reexport safe */ _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_7__.CompositeCollider),\n/* harmony export */ ContactConstraintPoint: () => (/* reexport safe */ _Solver_ContactConstraintPoint__WEBPACK_IMPORTED_MODULE_26__.ContactConstraintPoint),\n/* harmony export */ ContactSolveBias: () => (/* reexport safe */ _Solver_ContactBias__WEBPACK_IMPORTED_MODULE_25__.ContactSolveBias),\n/* harmony export */ DegreeOfFreedom: () => (/* reexport safe */ _BodyComponent__WEBPACK_IMPORTED_MODULE_0__.DegreeOfFreedom),\n/* harmony export */ DynamicTree: () => (/* reexport safe */ _Detection_DynamicTree__WEBPACK_IMPORTED_MODULE_18__.DynamicTree),\n/* harmony export */ DynamicTreeCollisionProcessor: () => (/* reexport safe */ _Detection_DynamicTreeCollisionProcessor__WEBPACK_IMPORTED_MODULE_19__.DynamicTreeCollisionProcessor),\n/* harmony export */ EdgeCollider: () => (/* reexport safe */ _Colliders_EdgeCollider__WEBPACK_IMPORTED_MODULE_9__.EdgeCollider),\n/* harmony export */ HashColliderProxy: () => (/* reexport safe */ _Detection_SparseHashGridCollisionProcessor__WEBPACK_IMPORTED_MODULE_20__.HashColliderProxy),\n/* harmony export */ HashGridCell: () => (/* reexport safe */ _Detection_SparseHashGrid__WEBPACK_IMPORTED_MODULE_21__.HashGridCell),\n/* harmony export */ HashGridProxy: () => (/* reexport safe */ _Detection_SparseHashGrid__WEBPACK_IMPORTED_MODULE_21__.HashGridProxy),\n/* harmony export */ HorizontalFirst: () => (/* reexport safe */ _Solver_ContactBias__WEBPACK_IMPORTED_MODULE_25__.HorizontalFirst),\n/* harmony export */ MotionSystem: () => (/* reexport safe */ _MotionSystem__WEBPACK_IMPORTED_MODULE_29__.MotionSystem),\n/* harmony export */ None: () => (/* reexport safe */ _Solver_ContactBias__WEBPACK_IMPORTED_MODULE_25__.None),\n/* harmony export */ Pair: () => (/* reexport safe */ _Detection_Pair__WEBPACK_IMPORTED_MODULE_16__.Pair),\n/* harmony export */ PhysicsWorld: () => (/* reexport safe */ _PhysicsWorld__WEBPACK_IMPORTED_MODULE_30__.PhysicsWorld),\n/* harmony export */ PolygonCollider: () => (/* reexport safe */ _Colliders_PolygonCollider__WEBPACK_IMPORTED_MODULE_10__.PolygonCollider),\n/* harmony export */ QuadTree: () => (/* reexport safe */ _Detection_QuadTree__WEBPACK_IMPORTED_MODULE_23__.QuadTree),\n/* harmony export */ RealisticSolver: () => (/* reexport safe */ _Solver_RealisticSolver__WEBPACK_IMPORTED_MODULE_27__.RealisticSolver),\n/* harmony export */ SeparatingAxis: () => (/* reexport safe */ _Colliders_SeparatingAxis__WEBPACK_IMPORTED_MODULE_13__.SeparatingAxis),\n/* harmony export */ SeparationInfo: () => (/* reexport safe */ _Colliders_SeparatingAxis__WEBPACK_IMPORTED_MODULE_13__.SeparationInfo),\n/* harmony export */ Shape: () => (/* reexport safe */ _Colliders_Shape__WEBPACK_IMPORTED_MODULE_6__.Shape),\n/* harmony export */ Side: () => (/* reexport safe */ _Side__WEBPACK_IMPORTED_MODULE_32__.Side),\n/* harmony export */ SolverStrategy: () => (/* reexport safe */ _SolverStrategy__WEBPACK_IMPORTED_MODULE_3__.SolverStrategy),\n/* harmony export */ SparseHashGrid: () => (/* reexport safe */ _Detection_SparseHashGrid__WEBPACK_IMPORTED_MODULE_21__.SparseHashGrid),\n/* harmony export */ SparseHashGridCollisionProcessor: () => (/* reexport safe */ _Detection_SparseHashGridCollisionProcessor__WEBPACK_IMPORTED_MODULE_20__.SparseHashGridCollisionProcessor),\n/* harmony export */ SpatialPartitionStrategy: () => (/* reexport safe */ _Detection_SpatialPartitionStrategy__WEBPACK_IMPORTED_MODULE_22__.SpatialPartitionStrategy),\n/* harmony export */ TreeNode: () => (/* reexport safe */ _Detection_DynamicTree__WEBPACK_IMPORTED_MODULE_18__.TreeNode),\n/* harmony export */ VerticalFirst: () => (/* reexport safe */ _Solver_ContactBias__WEBPACK_IMPORTED_MODULE_25__.VerticalFirst),\n/* harmony export */ getDefaultPhysicsConfig: () => (/* reexport safe */ _PhysicsConfig__WEBPACK_IMPORTED_MODULE_31__.getDefaultPhysicsConfig)\n/* harmony export */ });\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _ColliderComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ColliderComponent */ \"./Collision/ColliderComponent.ts\");\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _SolverStrategy__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./SolverStrategy */ \"./Collision/SolverStrategy.ts\");\n/* harmony import */ var _Colliders_Collider__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Colliders/Collider */ \"./Collision/Colliders/Collider.ts\");\n/* harmony import */ var _BoundingBox__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Colliders_Shape__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Colliders/Shape */ \"./Collision/Colliders/Shape.ts\");\n/* harmony import */ var _Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Colliders/CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var _Colliders_CircleCollider__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Colliders/CircleCollider */ \"./Collision/Colliders/CircleCollider.ts\");\n/* harmony import */ var _Colliders_EdgeCollider__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Colliders/EdgeCollider */ \"./Collision/Colliders/EdgeCollider.ts\");\n/* harmony import */ var _Colliders_PolygonCollider__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Colliders/PolygonCollider */ \"./Collision/Colliders/PolygonCollider.ts\");\n/* harmony import */ var _Colliders_CollisionJumpTable__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Colliders/CollisionJumpTable */ \"./Collision/Colliders/CollisionJumpTable.ts\");\n/* harmony import */ var _Colliders_ClosestLineJumpTable__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Colliders/ClosestLineJumpTable */ \"./Collision/Colliders/ClosestLineJumpTable.ts\");\n/* harmony import */ var _Colliders_SeparatingAxis__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Colliders/SeparatingAxis */ \"./Collision/Colliders/SeparatingAxis.ts\");\n/* harmony import */ var _Group_CollisionGroup__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Group/CollisionGroup */ \"./Collision/Group/CollisionGroup.ts\");\n/* harmony import */ var _Group_CollisionGroupManager__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Group/CollisionGroupManager */ \"./Collision/Group/CollisionGroupManager.ts\");\n/* harmony import */ var _Detection_Pair__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Detection/Pair */ \"./Collision/Detection/Pair.ts\");\n/* harmony import */ var _Detection_CollisionContact__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./Detection/CollisionContact */ \"./Collision/Detection/CollisionContact.ts\");\n/* harmony import */ var _Detection_DynamicTree__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Detection/DynamicTree */ \"./Collision/Detection/DynamicTree.ts\");\n/* harmony import */ var _Detection_DynamicTreeCollisionProcessor__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./Detection/DynamicTreeCollisionProcessor */ \"./Collision/Detection/DynamicTreeCollisionProcessor.ts\");\n/* harmony import */ var _Detection_SparseHashGridCollisionProcessor__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./Detection/SparseHashGridCollisionProcessor */ \"./Collision/Detection/SparseHashGridCollisionProcessor.ts\");\n/* harmony import */ var _Detection_SparseHashGrid__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./Detection/SparseHashGrid */ \"./Collision/Detection/SparseHashGrid.ts\");\n/* harmony import */ var _Detection_SpatialPartitionStrategy__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./Detection/SpatialPartitionStrategy */ \"./Collision/Detection/SpatialPartitionStrategy.ts\");\n/* harmony import */ var _Detection_QuadTree__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./Detection/QuadTree */ \"./Collision/Detection/QuadTree.ts\");\n/* harmony import */ var _Solver_ArcadeSolver__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./Solver/ArcadeSolver */ \"./Collision/Solver/ArcadeSolver.ts\");\n/* harmony import */ var _Solver_ContactBias__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./Solver/ContactBias */ \"./Collision/Solver/ContactBias.ts\");\n/* harmony import */ var _Solver_ContactConstraintPoint__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./Solver/ContactConstraintPoint */ \"./Collision/Solver/ContactConstraintPoint.ts\");\n/* harmony import */ var _Solver_RealisticSolver__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./Solver/RealisticSolver */ \"./Collision/Solver/RealisticSolver.ts\");\n/* harmony import */ var _CollisionSystem__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./CollisionSystem */ \"./Collision/CollisionSystem.ts\");\n/* harmony import */ var _MotionSystem__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./MotionSystem */ \"./Collision/MotionSystem.ts\");\n/* harmony import */ var _PhysicsWorld__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./PhysicsWorld */ \"./Collision/PhysicsWorld.ts\");\n/* harmony import */ var _PhysicsConfig__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./PhysicsConfig */ \"./Collision/PhysicsConfig.ts\");\n/* harmony import */ var _Side__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./Side */ \"./Collision/Side.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Collision/Integrator.ts\":\n/*!*********************************!*\\\n !*** ./Collision/Integrator.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EulerIntegrator: () => (/* binding */ EulerIntegrator)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n\nclass EulerIntegrator {\n static integrate(transform, motion, totalAcc, elapsed) {\n const seconds = elapsed / 1000;\n // This code looks a little wild, but it's to avoid creating any new Vector instances\n // integration is done in a tight loop so this is key to avoid GC'ing\n motion.vel.addEqual(totalAcc.scale(seconds, EulerIntegrator._ACC));\n transform.pos\n .add(motion.vel.scale(seconds, EulerIntegrator._VEL), EulerIntegrator._POS)\n .addEqual(totalAcc.scale(0.5 * seconds * seconds, EulerIntegrator._VEL_ACC));\n motion.angularVelocity += motion.torque * (1.0 / motion.inertia) * seconds;\n const rotation = transform.rotation + motion.angularVelocity * seconds;\n transform.scale.add(motion.scaleFactor.scale(seconds, this._SCALE_FACTOR), EulerIntegrator._SCALE);\n const tx = transform.get();\n tx.setTransform(EulerIntegrator._POS, rotation, EulerIntegrator._SCALE);\n }\n}\n// Scratch vectors to avoid allocation\nEulerIntegrator._POS = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\nEulerIntegrator._SCALE = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(1, 1);\nEulerIntegrator._ACC = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\nEulerIntegrator._VEL = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\nEulerIntegrator._VEL_ACC = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\nEulerIntegrator._SCALE_FACTOR = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\n\n\n/***/ }),\n\n/***/ \"./Collision/MotionSystem.ts\":\n/*!***********************************!*\\\n !*** ./Collision/MotionSystem.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MotionSystem: () => (/* binding */ MotionSystem)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Priority.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Integrator__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Integrator */ \"./Collision/Integrator.ts\");\n\n\n\n\n\n\n\nclass MotionSystem extends _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.System {\n constructor(world, physics) {\n super();\n this.world = world;\n this.physics = physics;\n this.systemType = _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.SystemType.Update;\n this._physicsConfigDirty = false;\n physics.$configUpdate.subscribe(() => (this._physicsConfigDirty = true));\n this.query = this.world.query([_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent, _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent]);\n }\n update(elapsed) {\n let transform;\n let motion;\n const entities = this.query.entities;\n const substep = this.physics.config.substep;\n for (let i = 0; i < entities.length; i++) {\n transform = entities[i].get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n motion = entities[i].get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_2__.MotionComponent);\n const optionalBody = entities[i].get(_BodyComponent__WEBPACK_IMPORTED_MODULE_3__.BodyComponent);\n if (this._physicsConfigDirty && optionalBody) {\n optionalBody.updatePhysicsConfig(this.physics.config.bodies);\n }\n if (optionalBody === null || optionalBody === void 0 ? void 0 : optionalBody.isSleeping) {\n continue;\n }\n const totalAcc = motion.acc.clone();\n if ((optionalBody === null || optionalBody === void 0 ? void 0 : optionalBody.collisionType) === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Active && (optionalBody === null || optionalBody === void 0 ? void 0 : optionalBody.useGravity)) {\n totalAcc.addEqual(this.physics.config.gravity);\n }\n // capture old transform of this entity and all of its children so that\n // any transform properties that derived from their parents are properly captured\n if (!entities[i].parent) {\n this.captureOldTransformWithChildren(entities[i]);\n }\n // Update transform and motion based on Euler linear algebra\n _Integrator__WEBPACK_IMPORTED_MODULE_5__.EulerIntegrator.integrate(transform, motion, totalAcc, elapsed / substep);\n }\n this._physicsConfigDirty = false;\n }\n captureOldTransformWithChildren(entity) {\n var _a;\n (_a = entity.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_3__.BodyComponent)) === null || _a === void 0 ? void 0 : _a.captureOldTransform();\n for (let i = 0; i < entity.children.length; i++) {\n this.captureOldTransformWithChildren(entity.children[i]);\n }\n }\n}\nMotionSystem.priority = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_6__.SystemPriority.Higher;\n\n\n/***/ }),\n\n/***/ \"./Collision/PhysicsConfig.ts\":\n/*!************************************!*\\\n !*** ./Collision/PhysicsConfig.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ getDefaultPhysicsConfig: () => (/* binding */ getDefaultPhysicsConfig)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _SolverStrategy__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./SolverStrategy */ \"./Collision/SolverStrategy.ts\");\n/* harmony import */ var _Solver_ContactBias__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Solver/ContactBias */ \"./Collision/Solver/ContactBias.ts\");\n/* harmony import */ var _Detection_SpatialPartitionStrategy__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Detection/SpatialPartitionStrategy */ \"./Collision/Detection/SpatialPartitionStrategy.ts\");\n\n\n\n\nconst getDefaultPhysicsConfig = () => ({\n enabled: true,\n gravity: (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0).clone(),\n solver: _SolverStrategy__WEBPACK_IMPORTED_MODULE_1__.SolverStrategy.Arcade,\n substep: 1,\n colliders: {\n compositeStrategy: 'together'\n },\n continuous: {\n checkForFastBodies: true,\n disableMinimumSpeedForFastBody: false,\n surfaceEpsilon: 0.1\n },\n bodies: {\n canSleepByDefault: false,\n sleepEpsilon: 0.07,\n wakeThreshold: 0.07 * 3,\n sleepBias: 0.9,\n defaultMass: 10\n },\n spatialPartition: _Detection_SpatialPartitionStrategy__WEBPACK_IMPORTED_MODULE_2__.SpatialPartitionStrategy.SparseHashGrid,\n sparseHashGrid: {\n size: 100\n },\n dynamicTree: {\n boundsPadding: 5,\n velocityMultiplier: 2\n },\n arcade: {\n contactSolveBias: _Solver_ContactBias__WEBPACK_IMPORTED_MODULE_3__.ContactSolveBias.None\n },\n realistic: {\n positionIterations: 3,\n velocityIterations: 8,\n slop: 1,\n steeringFactor: 0.2,\n warmStart: true\n }\n});\n\n\n/***/ }),\n\n/***/ \"./Collision/PhysicsWorld.ts\":\n/*!***********************************!*\\\n !*** ./Collision/PhysicsWorld.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PhysicsWorld: () => (/* binding */ PhysicsWorld)\n/* harmony export */ });\n/* harmony import */ var _Util_Observable__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Util/Observable */ \"./Util/Observable.ts\");\n/* harmony import */ var _Index__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Index */ \"./Collision/Detection/SparseHashGridCollisionProcessor.ts\");\n/* harmony import */ var _Index__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Index */ \"./Collision/Detection/DynamicTreeCollisionProcessor.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Util_Watch__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Util/Watch */ \"./Util/Watch.ts\");\n/* harmony import */ var _Detection_SpatialPartitionStrategy__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Detection/SpatialPartitionStrategy */ \"./Collision/Detection/SpatialPartitionStrategy.ts\");\n\n\n\n\n\nclass PhysicsWorld {\n get config() {\n return (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_0__.watchDeep)(this._config, (change) => {\n this.$configUpdate.notifyAll(change);\n });\n }\n set config(newConfig) {\n this._config = newConfig;\n this.$configUpdate.notifyAll(newConfig);\n }\n /**\n * Spatial data structure for locating potential collision pairs and ray casts\n */\n get collisionProcessor() {\n if (this._configDirty) {\n this._configDirty = false;\n // preserve tracked colliders if config updates\n const colliders = this._collisionProcessor.getColliders();\n if (this._config.spatialPartition === _Detection_SpatialPartitionStrategy__WEBPACK_IMPORTED_MODULE_1__.SpatialPartitionStrategy.SparseHashGrid) {\n this._collisionProcessor = new _Index__WEBPACK_IMPORTED_MODULE_2__.SparseHashGridCollisionProcessor(this._config.sparseHashGrid);\n }\n else {\n this._collisionProcessor = new _Index__WEBPACK_IMPORTED_MODULE_3__.DynamicTreeCollisionProcessor(this._config);\n }\n for (const collider of colliders) {\n this._collisionProcessor.track(collider);\n }\n }\n return this._collisionProcessor;\n }\n constructor(config) {\n this.$configUpdate = new _Util_Observable__WEBPACK_IMPORTED_MODULE_4__.Observable();\n this._configDirty = false;\n this.config = config;\n this.$configUpdate.subscribe((config) => {\n this._configDirty = true;\n _BodyComponent__WEBPACK_IMPORTED_MODULE_5__.BodyComponent.updateDefaultPhysicsConfig(config.bodies);\n });\n if (this._config.spatialPartition === _Detection_SpatialPartitionStrategy__WEBPACK_IMPORTED_MODULE_1__.SpatialPartitionStrategy.SparseHashGrid) {\n this._collisionProcessor = new _Index__WEBPACK_IMPORTED_MODULE_2__.SparseHashGridCollisionProcessor(this._config.sparseHashGrid);\n }\n else {\n this._collisionProcessor = new _Index__WEBPACK_IMPORTED_MODULE_3__.DynamicTreeCollisionProcessor(this._config);\n }\n }\n /**\n * Raycast into the scene's physics world\n * @param ray\n * @param options\n */\n rayCast(ray, options) {\n return this.collisionProcessor.rayCast(ray, options);\n }\n query(pointOrBounds) {\n // FIXME workaround TS: https://github.com/microsoft/TypeScript/issues/14107\n return this._collisionProcessor.query(pointOrBounds);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Side.ts\":\n/*!***************************!*\\\n !*** ./Collision/Side.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Side: () => (/* binding */ Side)\n/* harmony export */ });\n/**\n * An enum that describes the sides of an axis aligned box for collision\n */\nvar Side;\n(function (Side) {\n Side[\"None\"] = \"None\";\n Side[\"Top\"] = \"Top\";\n Side[\"Bottom\"] = \"Bottom\";\n Side[\"Left\"] = \"Left\";\n Side[\"Right\"] = \"Right\";\n})(Side || (Side = {}));\n(function (Side) {\n /**\n * Returns the opposite side from the current\n */\n function getOpposite(side) {\n if (side === Side.Top) {\n return Side.Bottom;\n }\n if (side === Side.Bottom) {\n return Side.Top;\n }\n if (side === Side.Left) {\n return Side.Right;\n }\n if (side === Side.Right) {\n return Side.Left;\n }\n return Side.None;\n }\n Side.getOpposite = getOpposite;\n /**\n * Given a vector, return the Side most in that direction\n */\n function fromDirection(direction) {\n if (Math.abs(direction.x) >= Math.abs(direction.y)) {\n if (direction.x <= 0) {\n return Side.Left;\n }\n return Side.Right;\n }\n if (direction.y <= 0) {\n return Side.Top;\n }\n return Side.Bottom;\n }\n Side.fromDirection = fromDirection;\n})(Side || (Side = {}));\n\n\n/***/ }),\n\n/***/ \"./Collision/SolverStrategy.ts\":\n/*!*************************************!*\\\n !*** ./Collision/SolverStrategy.ts ***!\n \\*************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SolverStrategy: () => (/* binding */ SolverStrategy)\n/* harmony export */ });\n/**\n * Possible collision resolution strategies\n *\n * The default is {@apilink SolverStrategy.Arcade} which performs simple axis aligned arcade style physics. This is useful for things\n * like platformers or top down games.\n *\n * More advanced rigid body physics are enabled by setting {@apilink SolverStrategy.Realistic} which allows for complicated\n * simulated physical interactions.\n */\nvar SolverStrategy;\n(function (SolverStrategy) {\n SolverStrategy[\"Arcade\"] = \"arcade\";\n SolverStrategy[\"Realistic\"] = \"realistic\";\n})(SolverStrategy || (SolverStrategy = {}));\n\n\n/***/ }),\n\n/***/ \"./Collision/Solver/ArcadeSolver.ts\":\n/*!******************************************!*\\\n !*** ./Collision/Solver/ArcadeSolver.ts ***!\n \\******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ArcadeSolver: () => (/* binding */ ArcadeSolver)\n/* harmony export */ });\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Events */ \"./Events.ts\");\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Side__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Side */ \"./Collision/Side.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _ContactBias__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ContactBias */ \"./Collision/Solver/ContactBias.ts\");\n\n\n\n\n\n/**\n * ArcadeSolver is the default in Excalibur. It solves collisions so that there is no overlap between contacts,\n * and negates velocity along the collision normal.\n *\n * This is usually the type of collisions used for 2D games that don't need a more realistic collision simulation.\n *\n */\nclass ArcadeSolver {\n constructor(config) {\n this.config = config;\n this.directionMap = new Map();\n this.distanceMap = new Map();\n }\n solve(contacts) {\n // Events and init\n this.preSolve(contacts);\n // Remove any canceled contacts\n contacts = contacts.filter((c) => !c.isCanceled());\n // Locate collision bias order\n let bias;\n switch (this.config.contactSolveBias) {\n case _ContactBias__WEBPACK_IMPORTED_MODULE_0__.ContactSolveBias.HorizontalFirst: {\n bias = _ContactBias__WEBPACK_IMPORTED_MODULE_0__.HorizontalFirst;\n break;\n }\n case _ContactBias__WEBPACK_IMPORTED_MODULE_0__.ContactSolveBias.VerticalFirst: {\n bias = _ContactBias__WEBPACK_IMPORTED_MODULE_0__.VerticalFirst;\n break;\n }\n default: {\n bias = _ContactBias__WEBPACK_IMPORTED_MODULE_0__.None;\n }\n }\n // Sort by bias (None, VerticalFirst, HorizontalFirst) to avoid artifacts with seams\n // Sort contacts by distance to avoid artifacts with seams\n // It's important to solve in a specific order\n contacts.sort((a, b) => {\n const aDir = this.directionMap.get(a.id);\n const bDir = this.directionMap.get(b.id);\n const aDist = this.distanceMap.get(a.id);\n const bDist = this.distanceMap.get(b.id);\n return bias[aDir] - bias[bDir] || aDist - bDist;\n });\n for (const contact of contacts) {\n // Solve position first in arcade\n this.solvePosition(contact);\n // Solve velocity second in arcade\n this.solveVelocity(contact);\n }\n // Events and any contact house-keeping the solver needs\n this.postSolve(contacts);\n return contacts;\n }\n preSolve(contacts) {\n const epsilon = 0.0001;\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n if (Math.abs(contact.mtv.x) < epsilon && Math.abs(contact.mtv.y) < epsilon) {\n // Cancel near 0 mtv collisions\n contact.cancel();\n continue;\n }\n const side = _Side__WEBPACK_IMPORTED_MODULE_1__.Side.fromDirection(contact.mtv);\n const mtv = contact.mtv.negate();\n const distance = Math.abs(contact.info.separation);\n this.distanceMap.set(contact.id, distance);\n this.directionMap.set(contact.id, side === _Side__WEBPACK_IMPORTED_MODULE_1__.Side.Left || side === _Side__WEBPACK_IMPORTED_MODULE_1__.Side.Right ? 'horizontal' : 'vertical');\n // Publish collision events on both participants\n contact.colliderA.events.emit('precollision', new _Events__WEBPACK_IMPORTED_MODULE_2__.PreCollisionEvent(contact.colliderA, contact.colliderB, side, mtv, contact));\n contact.colliderB.events.emit('precollision', new _Events__WEBPACK_IMPORTED_MODULE_2__.PreCollisionEvent(contact.colliderB, contact.colliderA, _Side__WEBPACK_IMPORTED_MODULE_1__.Side.getOpposite(side), mtv.negate(), contact));\n }\n }\n postSolve(contacts) {\n var _a, _b;\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n if (contact.isCanceled()) {\n continue;\n }\n const colliderA = contact.colliderA;\n const colliderB = contact.colliderB;\n const bodyA = (_a = colliderA.owner) === null || _a === void 0 ? void 0 : _a.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_3__.BodyComponent);\n const bodyB = (_b = colliderB.owner) === null || _b === void 0 ? void 0 : _b.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_3__.BodyComponent);\n if (bodyA && bodyB) {\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Passive || bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Passive) {\n continue;\n }\n }\n const side = _Side__WEBPACK_IMPORTED_MODULE_1__.Side.fromDirection(contact.mtv);\n const mtv = contact.mtv.negate();\n // Publish collision events on both participants\n contact.colliderA.events.emit('postcollision', new _Events__WEBPACK_IMPORTED_MODULE_2__.PostCollisionEvent(contact.colliderA, contact.colliderB, side, mtv, contact));\n contact.colliderB.events.emit('postcollision', new _Events__WEBPACK_IMPORTED_MODULE_2__.PostCollisionEvent(contact.colliderB, contact.colliderA, _Side__WEBPACK_IMPORTED_MODULE_1__.Side.getOpposite(side), mtv.negate(), contact));\n }\n }\n solvePosition(contact) {\n var _a, _b;\n const epsilon = 0.0001;\n // if bounds no longer intersect skip to the next\n // this removes jitter from overlapping/stacked solid tiles or a wall of solid tiles\n if (!contact.colliderA.bounds.overlaps(contact.colliderB.bounds, epsilon)) {\n // Cancel the contact to prevent and solving\n contact.cancel();\n return;\n }\n if (Math.abs(contact.mtv.x) < epsilon && Math.abs(contact.mtv.y) < epsilon) {\n // Cancel near 0 mtv collisions\n contact.cancel();\n return;\n }\n let mtv = contact.mtv;\n const colliderA = contact.colliderA;\n const colliderB = contact.colliderB;\n const bodyA = (_a = colliderA.owner) === null || _a === void 0 ? void 0 : _a.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_3__.BodyComponent);\n const bodyB = (_b = colliderB.owner) === null || _b === void 0 ? void 0 : _b.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_3__.BodyComponent);\n if (bodyA && bodyB) {\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Passive || bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Passive) {\n return;\n }\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Active && bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Active) {\n // split overlaps if both are Active\n mtv = mtv.scale(0.5);\n }\n // Resolve overlaps\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Active) {\n bodyA.globalPos.x -= mtv.x;\n bodyA.globalPos.y -= mtv.y;\n colliderA.update(bodyA.transform.get());\n }\n if (bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Active) {\n bodyB.globalPos.x += mtv.x;\n bodyB.globalPos.y += mtv.y;\n colliderB.update(bodyB.transform.get());\n }\n }\n }\n solveVelocity(contact) {\n var _a, _b;\n if (contact.isCanceled()) {\n return;\n }\n const colliderA = contact.colliderA;\n const colliderB = contact.colliderB;\n const bodyA = (_a = colliderA.owner) === null || _a === void 0 ? void 0 : _a.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_3__.BodyComponent);\n const bodyB = (_b = colliderB.owner) === null || _b === void 0 ? void 0 : _b.get(_BodyComponent__WEBPACK_IMPORTED_MODULE_3__.BodyComponent);\n if (bodyA && bodyB) {\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Passive || bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Passive) {\n return;\n }\n const normal = contact.normal;\n const opposite = normal.negate();\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Active) {\n // only adjust velocity if the contact normal is opposite to the current velocity\n // this avoids catching edges on a platform when sliding off\n if (bodyA.vel.normalize().dot(opposite) < 0) {\n // Cancel out velocity opposite direction of collision normal\n const velAdj = normal.scale(normal.dot(bodyA.vel.negate()));\n bodyA.vel = bodyA.vel.add(velAdj);\n }\n }\n if (bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.Active) {\n // only adjust velocity if the contact normal is opposite to the current velocity\n // this avoids catching edges on a platform\n if (bodyB.vel.normalize().dot(normal) < 0) {\n const velAdj = opposite.scale(opposite.dot(bodyB.vel.negate()));\n bodyB.vel = bodyB.vel.add(velAdj);\n }\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Solver/ContactBias.ts\":\n/*!*****************************************!*\\\n !*** ./Collision/Solver/ContactBias.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ContactSolveBias: () => (/* binding */ ContactSolveBias),\n/* harmony export */ HorizontalFirst: () => (/* binding */ HorizontalFirst),\n/* harmony export */ None: () => (/* binding */ None),\n/* harmony export */ VerticalFirst: () => (/* binding */ VerticalFirst)\n/* harmony export */ });\n/**\n * Tells the Arcade collision solver to prefer certain contacts over others\n */\nvar ContactSolveBias;\n(function (ContactSolveBias) {\n ContactSolveBias[\"None\"] = \"none\";\n ContactSolveBias[\"VerticalFirst\"] = \"vertical-first\";\n ContactSolveBias[\"HorizontalFirst\"] = \"horizontal-first\";\n})(ContactSolveBias || (ContactSolveBias = {}));\n/**\n * Vertical First contact solve bias Used by the {@apilink ArcadeSolver} to sort contacts\n */\nconst VerticalFirst = {\n vertical: 1,\n horizontal: 2\n};\n/**\n * Horizontal First contact solve bias Used by the {@apilink ArcadeSolver} to sort contacts\n */\nconst HorizontalFirst = {\n horizontal: 1,\n vertical: 2\n};\n/**\n * None value, {@apilink ArcadeSolver} sorts contacts using distance by default\n */\nconst None = {\n horizontal: 0,\n vertical: 0\n};\n\n\n/***/ }),\n\n/***/ \"./Collision/Solver/ContactConstraintPoint.ts\":\n/*!****************************************************!*\\\n !*** ./Collision/Solver/ContactConstraintPoint.ts ***!\n \\****************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ContactConstraintPoint: () => (/* binding */ ContactConstraintPoint)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n\n/**\n * Holds information about contact points, meant to be reused over multiple frames of contact\n */\nclass ContactConstraintPoint {\n constructor(point, local, contact) {\n this.point = point;\n this.local = local;\n this.contact = contact;\n /**\n * Impulse accumulated over time in normal direction\n */\n this.normalImpulse = 0;\n /**\n * Impulse accumulated over time in the tangent direction\n */\n this.tangentImpulse = 0;\n /**\n * Effective mass seen in the normal direction\n */\n this.normalMass = 0;\n /**\n * Effective mass seen in the tangent direction\n */\n this.tangentMass = 0;\n /**\n * Direction from center of mass of bodyA to contact point\n */\n this.aToContact = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\n /**\n * Direction from center of mass of bodyB to contact point\n */\n this.bToContact = new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\n /**\n * Original contact velocity combined with bounciness\n */\n this.originalVelocityAndRestitution = 0;\n this.update();\n }\n /**\n * Updates the contact information\n */\n update() {\n const bodyA = this.contact.bodyA;\n const bodyB = this.contact.bodyB;\n if (bodyA && bodyB) {\n const normal = this.contact.normal;\n const tangent = this.contact.tangent;\n this.aToContact = this.point.sub(bodyA.globalPos);\n this.bToContact = this.point.sub(bodyB.globalPos);\n const aToContactNormal = this.aToContact.cross(normal);\n const bToContactNormal = this.bToContact.cross(normal);\n this.normalMass =\n bodyA.inverseMass +\n bodyB.inverseMass +\n bodyA.inverseInertia * aToContactNormal * aToContactNormal +\n bodyB.inverseInertia * bToContactNormal * bToContactNormal;\n const aToContactTangent = this.aToContact.cross(tangent);\n const bToContactTangent = this.bToContact.cross(tangent);\n this.tangentMass =\n bodyA.inverseMass +\n bodyB.inverseMass +\n bodyA.inverseInertia * aToContactTangent * aToContactTangent +\n bodyB.inverseInertia * bToContactTangent * bToContactTangent;\n }\n return this;\n }\n /**\n * Returns the relative velocity between bodyA and bodyB\n */\n getRelativeVelocity() {\n const bodyA = this.contact.bodyA;\n const bodyB = this.contact.bodyB;\n if (bodyA && bodyB) {\n // Relative velocity in linear terms\n // Angular to linear velocity formula -> omega = velocity/radius so omega x radius = velocity\n const velA = bodyA.vel.add(_Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.cross(bodyA.angularVelocity, this.aToContact));\n const velB = bodyB.vel.add(_Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.cross(bodyB.angularVelocity, this.bToContact));\n return velB.sub(velA);\n }\n return _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Collision/Solver/RealisticSolver.ts\":\n/*!*********************************************!*\\\n !*** ./Collision/Solver/RealisticSolver.ts ***!\n \\*********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RealisticSolver: () => (/* binding */ RealisticSolver)\n/* harmony export */ });\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Events */ \"./Events.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _CollisionType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _ContactConstraintPoint__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ContactConstraintPoint */ \"./Collision/Solver/ContactConstraintPoint.ts\");\n/* harmony import */ var _Side__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Side */ \"./Collision/Side.ts\");\n/* harmony import */ var _BodyComponent__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Colliders_CollisionJumpTable__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Colliders/CollisionJumpTable */ \"./Collision/Colliders/CollisionJumpTable.ts\");\n\n\n\n\n\n\n\nclass RealisticSolver {\n constructor(config) {\n this.config = config;\n this.lastFrameContacts = new Map();\n // map contact id to contact points\n this.idToContactConstraint = new Map();\n }\n getContactConstraints(id) {\n var _a;\n return (_a = this.idToContactConstraint.get(id)) !== null && _a !== void 0 ? _a : [];\n }\n solve(contacts) {\n // Events and init\n this.preSolve(contacts);\n // Remove any canceled contacts\n contacts = contacts.filter((c) => !c.isCanceled());\n // Solve velocity first\n this.solveVelocity(contacts);\n // Solve position last because non-overlap is the most important\n this.solvePosition(contacts);\n // Events and any contact house-keeping the solver needs\n this.postSolve(contacts);\n return contacts;\n }\n preSolve(contacts) {\n var _a, _b, _c;\n const epsilon = 0.0001;\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n if (Math.abs(contact.mtv.x) < epsilon && Math.abs(contact.mtv.y) < epsilon) {\n // Cancel near 0 mtv collisions\n contact.cancel();\n continue;\n }\n // Publish collision events on both participants\n const side = _Side__WEBPACK_IMPORTED_MODULE_0__.Side.fromDirection(contact.mtv);\n contact.colliderA.events.emit('precollision', new _Events__WEBPACK_IMPORTED_MODULE_1__.PreCollisionEvent(contact.colliderA, contact.colliderB, side, contact.mtv, contact));\n contact.colliderA.events.emit('beforecollisionresolve', new _Events__WEBPACK_IMPORTED_MODULE_1__.CollisionPreSolveEvent(contact.colliderA, contact.colliderB, side, contact.mtv, contact));\n contact.colliderB.events.emit('precollision', new _Events__WEBPACK_IMPORTED_MODULE_1__.PreCollisionEvent(contact.colliderB, contact.colliderA, _Side__WEBPACK_IMPORTED_MODULE_0__.Side.getOpposite(side), contact.mtv.negate(), contact));\n contact.colliderB.events.emit('beforecollisionresolve', new _Events__WEBPACK_IMPORTED_MODULE_1__.CollisionPreSolveEvent(contact.colliderB, contact.colliderA, _Side__WEBPACK_IMPORTED_MODULE_0__.Side.getOpposite(side), contact.mtv.negate(), contact));\n // Match awake state for sleeping\n contact.matchAwake();\n }\n // Keep track of contacts that done\n const finishedContactIds = Array.from(this.idToContactConstraint.keys());\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n // Remove all current contacts that are not done\n const index = finishedContactIds.indexOf(contact.id);\n if (index > -1) {\n finishedContactIds.splice(index, 1);\n }\n const contactPoints = (_a = this.idToContactConstraint.get(contact.id)) !== null && _a !== void 0 ? _a : [];\n let pointIndex = 0;\n const bodyA = contact.bodyA;\n const bodyB = contact.bodyB;\n if (bodyA && bodyB) {\n for (let j = 0; j < contact.points.length; j++) {\n const point = contact.points[j];\n const normal = contact.normal;\n const tangent = contact.tangent;\n const aToContact = point.sub(bodyA.globalPos);\n const bToContact = point.sub(bodyB.globalPos);\n const aToContactNormal = aToContact.cross(normal);\n const bToContactNormal = bToContact.cross(normal);\n const normalMass = bodyA.inverseMass +\n bodyB.inverseMass +\n bodyA.inverseInertia * aToContactNormal * aToContactNormal +\n bodyB.inverseInertia * bToContactNormal * bToContactNormal;\n const aToContactTangent = aToContact.cross(tangent);\n const bToContactTangent = bToContact.cross(tangent);\n const tangentMass = bodyA.inverseMass +\n bodyB.inverseMass +\n bodyA.inverseInertia * aToContactTangent * aToContactTangent +\n bodyB.inverseInertia * bToContactTangent * bToContactTangent;\n // Preserve normal/tangent impulse by re-using the contact point if it's close\n if (contactPoints[pointIndex] && ((_c = (_b = contactPoints[pointIndex]) === null || _b === void 0 ? void 0 : _b.point) === null || _c === void 0 ? void 0 : _c.squareDistance(point)) < 4) {\n contactPoints[pointIndex].point = point;\n contactPoints[pointIndex].local = contact.localPoints[pointIndex];\n }\n else {\n // new contact if it's not close or doesn't exist\n contactPoints[pointIndex] = new _ContactConstraintPoint__WEBPACK_IMPORTED_MODULE_2__.ContactConstraintPoint(point, contact.localPoints[pointIndex], contact);\n }\n // Update contact point calculations\n contactPoints[pointIndex].aToContact = aToContact;\n contactPoints[pointIndex].bToContact = bToContact;\n contactPoints[pointIndex].normalMass = 1.0 / normalMass;\n contactPoints[pointIndex].tangentMass = 1.0 / tangentMass;\n // Calculate relative velocity before solving to accurately do restitution\n const restitution = bodyA.bounciness > bodyB.bounciness ? bodyA.bounciness : bodyB.bounciness;\n const relativeVelocity = contact.normal.dot(contactPoints[pointIndex].getRelativeVelocity());\n contactPoints[pointIndex].originalVelocityAndRestitution = 0;\n if (relativeVelocity < -0.1) {\n // TODO what's a good threshold here?\n contactPoints[pointIndex].originalVelocityAndRestitution = -restitution * relativeVelocity;\n }\n pointIndex++;\n }\n }\n this.idToContactConstraint.set(contact.id, contactPoints);\n }\n // Clean up any contacts that did not occur last frame\n for (const id of finishedContactIds) {\n this.idToContactConstraint.delete(id);\n }\n // Warm contacts with accumulated impulse\n // Useful for tall stacks\n if (this.config.warmStart) {\n this.warmStart(contacts);\n }\n else {\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n const contactPoints = this.getContactConstraints(contact.id);\n for (const point of contactPoints) {\n point.normalImpulse = 0;\n point.tangentImpulse = 0;\n }\n }\n }\n }\n postSolve(contacts) {\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n const bodyA = contact.bodyA;\n const bodyB = contact.bodyB;\n if (bodyA && bodyB) {\n // Skip post solve for active+passive collisions\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_3__.CollisionType.Passive || bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_3__.CollisionType.Passive) {\n continue;\n }\n // Update motion values for sleeping\n bodyA.updateMotion();\n bodyB.updateMotion();\n }\n // Publish collision events on both participants\n const side = _Side__WEBPACK_IMPORTED_MODULE_0__.Side.fromDirection(contact.mtv);\n contact.colliderA.events.emit('postcollision', new _Events__WEBPACK_IMPORTED_MODULE_1__.PostCollisionEvent(contact.colliderA, contact.colliderB, side, contact.mtv, contact));\n contact.colliderA.events.emit('aftercollisionresolve', new _Events__WEBPACK_IMPORTED_MODULE_1__.CollisionPostSolveEvent(contact.colliderA, contact.colliderB, side, contact.mtv, contact));\n contact.colliderB.events.emit('postcollision', new _Events__WEBPACK_IMPORTED_MODULE_1__.PostCollisionEvent(contact.colliderB, contact.colliderA, _Side__WEBPACK_IMPORTED_MODULE_0__.Side.getOpposite(side), contact.mtv.negate(), contact));\n contact.colliderB.events.emit('aftercollisionresolve', new _Events__WEBPACK_IMPORTED_MODULE_1__.CollisionPostSolveEvent(contact.colliderB, contact.colliderA, _Side__WEBPACK_IMPORTED_MODULE_0__.Side.getOpposite(side), contact.mtv.negate(), contact));\n }\n // Store contacts\n this.lastFrameContacts.clear();\n for (let i = 0; i < contacts.length; i++) {\n const c = contacts[i];\n this.lastFrameContacts.set(c.id, c);\n }\n }\n /**\n * Warm up body's based on previous frame contact points\n * @param contacts\n */\n warmStart(contacts) {\n var _a;\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n const bodyA = contact.bodyA;\n const bodyB = contact.bodyB;\n if (bodyA && bodyB) {\n const contactPoints = (_a = this.idToContactConstraint.get(contact.id)) !== null && _a !== void 0 ? _a : [];\n for (const point of contactPoints) {\n if (this.config.warmStart) {\n const normalImpulse = contact.normal.scale(point.normalImpulse);\n const tangentImpulse = contact.tangent.scale(point.tangentImpulse);\n const impulse = normalImpulse.add(tangentImpulse);\n bodyA.applyImpulse(point.point, impulse.negate());\n bodyB.applyImpulse(point.point, impulse);\n }\n else {\n point.normalImpulse = 0;\n point.tangentImpulse = 0;\n }\n }\n }\n }\n }\n /**\n * Iteratively solve the position overlap constraint\n * @param contacts\n */\n solvePosition(contacts) {\n var _a;\n for (let i = 0; i < this.config.positionIterations; i++) {\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n const bodyA = contact.bodyA;\n const bodyB = contact.bodyB;\n if (bodyA && bodyB) {\n // Skip solving active+passive\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_3__.CollisionType.Passive || bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_3__.CollisionType.Passive) {\n continue;\n }\n const constraints = (_a = this.idToContactConstraint.get(contact.id)) !== null && _a !== void 0 ? _a : [];\n for (const point of constraints) {\n const normal = contact.normal;\n const separation = _Colliders_CollisionJumpTable__WEBPACK_IMPORTED_MODULE_4__.CollisionJumpTable.FindContactSeparation(contact, point.local);\n const steeringConstant = this.config.steeringFactor; //0.2;\n const maxCorrection = -5;\n const slop = this.config.slop; //1;\n // Clamp to avoid over-correction\n // Remember that we are shooting for 0 overlap in the end\n const steeringForce = (0,_Math_util__WEBPACK_IMPORTED_MODULE_5__.clamp)(steeringConstant * (separation + slop), maxCorrection, 0);\n const impulse = normal.scale(-steeringForce * point.normalMass);\n // This is a pseudo impulse, meaning we aren't doing a real impulse calculation\n // We adjust position and rotation instead of doing the velocity\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_3__.CollisionType.Active) {\n // TODO make applyPseudoImpulse function?\n const impulseForce = impulse.negate().scale(bodyA.inverseMass);\n if (bodyA.limitDegreeOfFreedom.includes(_BodyComponent__WEBPACK_IMPORTED_MODULE_6__.DegreeOfFreedom.X)) {\n impulseForce.x = 0;\n }\n if (bodyA.limitDegreeOfFreedom.includes(_BodyComponent__WEBPACK_IMPORTED_MODULE_6__.DegreeOfFreedom.Y)) {\n impulseForce.y = 0;\n }\n bodyA.globalPos = bodyA.globalPos.add(impulseForce);\n if (!bodyA.limitDegreeOfFreedom.includes(_BodyComponent__WEBPACK_IMPORTED_MODULE_6__.DegreeOfFreedom.Rotation)) {\n bodyA.rotation -= point.aToContact.cross(impulse) * bodyA.inverseInertia;\n }\n }\n if (bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_3__.CollisionType.Active) {\n const impulseForce = impulse.scale(bodyB.inverseMass);\n if (bodyB.limitDegreeOfFreedom.includes(_BodyComponent__WEBPACK_IMPORTED_MODULE_6__.DegreeOfFreedom.X)) {\n impulseForce.x = 0;\n }\n if (bodyB.limitDegreeOfFreedom.includes(_BodyComponent__WEBPACK_IMPORTED_MODULE_6__.DegreeOfFreedom.Y)) {\n impulseForce.y = 0;\n }\n bodyB.globalPos = bodyB.globalPos.add(impulseForce);\n if (!bodyB.limitDegreeOfFreedom.includes(_BodyComponent__WEBPACK_IMPORTED_MODULE_6__.DegreeOfFreedom.Rotation)) {\n bodyB.rotation += point.bToContact.cross(impulse) * bodyB.inverseInertia;\n }\n }\n }\n }\n }\n }\n }\n solveVelocity(contacts) {\n var _a;\n for (let i = 0; i < this.config.velocityIterations; i++) {\n for (let i = 0; i < contacts.length; i++) {\n const contact = contacts[i];\n const bodyA = contact.bodyA;\n const bodyB = contact.bodyB;\n if (bodyA && bodyB) {\n // Skip solving active+passive\n if (bodyA.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_3__.CollisionType.Passive || bodyB.collisionType === _CollisionType__WEBPACK_IMPORTED_MODULE_3__.CollisionType.Passive) {\n continue;\n }\n const friction = Math.min(bodyA.friction, bodyB.friction);\n const constraints = (_a = this.idToContactConstraint.get(contact.id)) !== null && _a !== void 0 ? _a : [];\n // Friction constraint\n for (const point of constraints) {\n const relativeVelocity = point.getRelativeVelocity();\n // Negate velocity in tangent direction to simulate friction\n const tangentVelocity = -relativeVelocity.dot(contact.tangent);\n let impulseDelta = tangentVelocity * point.tangentMass;\n // Clamping based in Erin Catto's GDC 2006 talk\n // Correct clamping https://github.com/erincatto/box2d-lite/blob/master/docs/GDC2006_Catto_Erin_PhysicsTutorial.pdf\n // Accumulated fiction impulse is always between -uMaxFriction < dT < uMaxFriction\n // But deltas can vary\n const maxFriction = friction * point.normalImpulse;\n const newImpulse = (0,_Math_util__WEBPACK_IMPORTED_MODULE_5__.clamp)(point.tangentImpulse + impulseDelta, -maxFriction, maxFriction);\n impulseDelta = newImpulse - point.tangentImpulse;\n point.tangentImpulse = newImpulse;\n const impulse = contact.tangent.scale(impulseDelta);\n bodyA.applyImpulse(point.point, impulse.negate());\n bodyB.applyImpulse(point.point, impulse);\n }\n // Bounce constraint\n for (const point of constraints) {\n // Need to recalc relative velocity because the previous step could have changed vel\n const relativeVelocity = point.getRelativeVelocity();\n // Compute impulse in normal direction\n const normalVelocity = relativeVelocity.dot(contact.normal);\n // Per Erin it is a mistake to apply the restitution inside the iteration\n // From Erin Catto's Box2D we keep original contact velocity and adjust by small impulses\n let impulseDelta = -point.normalMass * (normalVelocity - point.originalVelocityAndRestitution);\n // Clamping based in Erin Catto's GDC 2014 talk\n // Accumulated impulse stored in the contact is always positive (dV > 0)\n // But deltas can be negative\n const newImpulse = Math.max(point.normalImpulse + impulseDelta, 0);\n impulseDelta = newImpulse - point.normalImpulse;\n point.normalImpulse = newImpulse;\n const impulse = contact.normal.scale(impulseDelta);\n bodyA.applyImpulse(point.point, impulse.negate());\n bodyB.applyImpulse(point.point, impulse);\n }\n }\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Color.ts\":\n/*!******************!*\\\n !*** ./Color.ts ***!\n \\******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Color: () => (/* binding */ Color)\n/* harmony export */ });\n/**\n * Provides standard colors (e.g. {@apilink Color.Black})\n * but you can also create custom colors using RGB, HSL, or Hex. Also provides\n * useful color operations like {@apilink Color.lighten}, {@apilink Color.darken}, and more.\n */\nclass Color {\n /**\n * Creates a new instance of Color from an r, g, b, a\n * @param r The red component of color (0-255)\n * @param g The green component of color (0-255)\n * @param b The blue component of color (0-255)\n * @param a The alpha component of color (0-1.0)\n */\n constructor(r, g, b, a) {\n this.r = r;\n this.g = g;\n this.b = b;\n this.a = a != null ? a : 1;\n }\n /**\n * Creates a new instance of Color from an r, g, b, a\n * @param r The red component of color (0-255)\n * @param g The green component of color (0-255)\n * @param b The blue component of color (0-255)\n * @param a The alpha component of color (0-1.0)\n */\n static fromRGB(r, g, b, a) {\n return new Color(r, g, b, a);\n }\n /**\n * Creates a new instance of Color from a rgb string\n * @param string CSS color string of the form rgba(255, 255, 255, 1) or rgb(255, 255, 255)\n */\n static fromRGBString(string) {\n const rgbaRegEx = /^rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*(\\d+(?:\\.\\d+)?))?\\)/i;\n let match = null;\n if ((match = string.match(rgbaRegEx))) {\n const r = parseInt(match[1], 10);\n const g = parseInt(match[2], 10);\n const b = parseInt(match[3], 10);\n let a = 1;\n if (match[4]) {\n a = parseFloat(match[4]);\n }\n return new Color(r, g, b, a);\n }\n else {\n throw new Error('Invalid rgb/a string: ' + string);\n }\n }\n /**\n * Creates a new instance of Color from a hex string\n * @param hex CSS color string of the form #ffffff, the alpha component is optional\n */\n static fromHex(hex) {\n const hexRegEx = /^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})?$/i;\n let match = null;\n if ((match = hex.match(hexRegEx))) {\n const r = parseInt(match[1], 16);\n const g = parseInt(match[2], 16);\n const b = parseInt(match[3], 16);\n let a = 1;\n if (match[4]) {\n a = parseInt(match[4], 16) / 255;\n }\n return new Color(r, g, b, a);\n }\n else {\n throw new Error('Invalid hex string: ' + hex);\n }\n }\n /**\n * Creates a new instance of Color from hsla values\n * @param h Hue is represented [0-1]\n * @param s Saturation is represented [0-1]\n * @param l Luminance is represented [0-1]\n * @param a Alpha is represented [0-1]\n */\n static fromHSL(h, s, l, a = 1.0) {\n const temp = new HSLColor(h, s, l, a);\n return temp.toRGBA();\n }\n /**\n * Lightens the current color by a specified amount\n * @param factor The amount to lighten by [0-1]\n */\n lighten(factor = 0.1) {\n const temp = HSLColor.fromRGBA(this.r, this.g, this.b, this.a);\n temp.l += (1 - temp.l) * factor;\n return temp.toRGBA();\n }\n /**\n * Darkens the current color by a specified amount\n * @param factor The amount to darken by [0-1]\n */\n darken(factor = 0.1) {\n const temp = HSLColor.fromRGBA(this.r, this.g, this.b, this.a);\n temp.l -= temp.l * factor;\n return temp.toRGBA();\n }\n /**\n * Saturates the current color by a specified amount\n * @param factor The amount to saturate by [0-1]\n */\n saturate(factor = 0.1) {\n const temp = HSLColor.fromRGBA(this.r, this.g, this.b, this.a);\n temp.s += temp.s * factor;\n return temp.toRGBA();\n }\n /**\n * Desaturates the current color by a specified amount\n * @param factor The amount to desaturate by [0-1]\n */\n desaturate(factor = 0.1) {\n const temp = HSLColor.fromRGBA(this.r, this.g, this.b, this.a);\n temp.s -= temp.s * factor;\n return temp.toRGBA();\n }\n /**\n * Multiplies a color by another, results in a darker color\n * @param color The other color\n */\n multiply(color) {\n const newR = (((color.r / 255) * this.r) / 255) * 255;\n const newG = (((color.g / 255) * this.g) / 255) * 255;\n const newB = (((color.b / 255) * this.b) / 255) * 255;\n const newA = color.a * this.a;\n return new Color(newR, newG, newB, newA);\n }\n /**\n * Screens a color by another, results in a lighter color\n * @param color The other color\n */\n screen(color) {\n const color1 = color.invert();\n const color2 = color.invert();\n return color1.multiply(color2).invert();\n }\n /**\n * Inverts the current color\n */\n invert() {\n return new Color(255 - this.r, 255 - this.g, 255 - this.b, 1.0 - this.a);\n }\n /**\n * Averages the current color with another\n * @param color The other color\n */\n average(color) {\n const newR = (color.r + this.r) / 2;\n const newG = (color.g + this.g) / 2;\n const newB = (color.b + this.b) / 2;\n const newA = (color.a + this.a) / 2;\n return new Color(newR, newG, newB, newA);\n }\n equal(color) {\n return this.toString() === color.toString();\n }\n /**\n * Returns a CSS string representation of a color.\n * @param format Color representation, accepts: rgb, hsl, or hex\n */\n toString(format = 'rgb') {\n switch (format) {\n case 'rgb':\n return this.toRGBA();\n case 'hsl':\n return this.toHSLA();\n case 'hex':\n return this.toHex();\n default:\n throw new Error('Invalid Color format');\n }\n }\n /**\n * Returns Hex Value of a color component\n * @param c color component\n * @see https://stackoverflow.com/questions/5623838/rgb-to-hex-and-hex-to-rgb\n */\n _componentToHex(c) {\n // Handle negative and fractional numbers\n const hex = Math.max(Math.round(c), 0).toString(16);\n return hex.length === 1 ? '0' + hex : hex;\n }\n /**\n * Return Hex representation of a color.\n */\n toHex() {\n let hexRepresentation = '#' + this._componentToHex(this.r) + this._componentToHex(this.g) + this._componentToHex(this.b);\n if (this.a !== 1) {\n hexRepresentation += this._componentToHex(this.a * 255);\n }\n return hexRepresentation;\n }\n /**\n * Return RGBA representation of a color.\n */\n toRGBA() {\n const result = String(this.r.toFixed(0)) + ', ' + String(this.g.toFixed(0)) + ', ' + String(this.b.toFixed(0));\n if (this.a !== undefined || this.a !== null) {\n return 'rgba(' + result + ', ' + String(this.a) + ')';\n }\n return 'rgb(' + result + ')';\n }\n /**\n * Return HSLA representation of a color.\n */\n toHSLA() {\n return HSLColor.fromRGBA(this.r, this.g, this.b, this.a).toString();\n }\n /**\n * Returns a CSS string representation of a color.\n */\n fillStyle() {\n return this.toString();\n }\n /**\n * Returns a clone of the current color.\n */\n clone(dest) {\n const result = dest || new Color(this.r, this.g, this.b, this.a);\n result.r = this.r;\n result.g = this.g;\n result.b = this.b;\n result.a = this.a;\n return result;\n }\n /**\n * Black (#000000)\n */\n static get Black() {\n return Color.fromHex('#000000');\n }\n /**\n * White (#FFFFFF)\n */\n static get White() {\n return Color.fromHex('#FFFFFF');\n }\n /**\n * Gray (#808080)\n */\n static get Gray() {\n return Color.fromHex('#808080');\n }\n /**\n * Light gray (#D3D3D3)\n */\n static get LightGray() {\n return Color.fromHex('#D3D3D3');\n }\n /**\n * Dark gray (#A9A9A9)\n */\n static get DarkGray() {\n return Color.fromHex('#A9A9A9');\n }\n /**\n * Yellow (#FFFF00)\n */\n static get Yellow() {\n return Color.fromHex('#FFFF00');\n }\n /**\n * Orange (#FFA500)\n */\n static get Orange() {\n return Color.fromHex('#FFA500');\n }\n /**\n * Red (#FF0000)\n */\n static get Red() {\n return Color.fromHex('#FF0000');\n }\n /**\n * Vermilion (#FF5B31)\n */\n static get Vermilion() {\n return Color.fromHex('#FF5B31');\n }\n /**\n * Rose (#FF007F)\n */\n static get Rose() {\n return Color.fromHex('#FF007F');\n }\n /**\n * Pink (#FFC0CB)\n */\n static get Pink() {\n return Color.fromHex('#FFC0CB');\n }\n /**\n * Magenta (#FF00FF)\n */\n static get Magenta() {\n return Color.fromHex('#FF00FF');\n }\n /**\n * Violet (#7F00FF)\n */\n static get Violet() {\n return Color.fromHex('#7F00FF');\n }\n /**\n * Purple (#800080)\n */\n static get Purple() {\n return Color.fromHex('#800080');\n }\n /**\n * Blue (#0000FF)\n */\n static get Blue() {\n return Color.fromHex('#0000FF');\n }\n /**\n * Azure (#007FFF)\n */\n static get Azure() {\n return Color.fromHex('#007FFF');\n }\n /**\n * Cyan (#00FFFF)\n */\n static get Cyan() {\n return Color.fromHex('#00FFFF');\n }\n /**\n * Viridian (#59978F)\n */\n static get Viridian() {\n return Color.fromHex('#59978F');\n }\n /**\n * Teal (#008080)\n */\n static get Teal() {\n return Color.fromHex('#008080');\n }\n /**\n * Green (#00FF00)\n */\n static get Green() {\n return Color.fromHex('#00FF00');\n }\n /**\n * Chartreuse (#7FFF00)\n */\n static get Chartreuse() {\n return Color.fromHex('#7FFF00');\n }\n /**\n * Transparent (#FFFFFF00)\n */\n static get Transparent() {\n return Color.fromHex('#FFFFFF00');\n }\n /**\n * ExcaliburBlue (#176BAA)\n */\n static get ExcaliburBlue() {\n return Color.fromHex('#176BAA');\n }\n /**\n * Brown (#964B00)\n */\n static get Brown() {\n return Color.fromHex('#964B00');\n }\n}\n/**\n * Internal HSL Color representation\n *\n * http://en.wikipedia.org/wiki/HSL_and_HSV\n * http://axonflux.com/handy-rgb-to-hsl-and-rgb-to-hsv-color-model-c\n */\nclass HSLColor {\n constructor(h, s, l, a) {\n this.h = h;\n this.s = s;\n this.l = l;\n this.a = a;\n }\n static hue2rgb(p, q, t) {\n if (t < 0) {\n t += 1;\n }\n if (t > 1) {\n t -= 1;\n }\n if (t < 1 / 6) {\n return p + (q - p) * 6 * t;\n }\n if (t < 1 / 2) {\n return q;\n }\n if (t < 2 / 3) {\n return p + (q - p) * (2 / 3 - t) * 6;\n }\n return p;\n }\n static fromRGBA(r, g, b, a) {\n r /= 255;\n g /= 255;\n b /= 255;\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h, s;\n const l = (max + min) / 2;\n if (max === min) {\n h = s = 0; // achromatic\n }\n else {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n h /= 6;\n }\n return new HSLColor(h, s, l, a);\n }\n toRGBA() {\n let r, g, b;\n if (this.s === 0) {\n r = g = b = this.l; // achromatic\n }\n else {\n const q = this.l < 0.5 ? this.l * (1 + this.s) : this.l + this.s - this.l * this.s;\n const p = 2 * this.l - q;\n r = HSLColor.hue2rgb(p, q, this.h + 1 / 3);\n g = HSLColor.hue2rgb(p, q, this.h);\n b = HSLColor.hue2rgb(p, q, this.h - 1 / 3);\n }\n return new Color(r * 255, g * 255, b * 255, this.a);\n }\n toString() {\n const h = this.h.toFixed(0), s = this.s.toFixed(0), l = this.l.toFixed(0), a = this.a.toFixed(0);\n return `hsla(${h}, ${s}, ${l}, ${a})`;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Context.ts\":\n/*!********************!*\\\n !*** ./Context.ts ***!\n \\********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ createContext: () => (/* binding */ createContext),\n/* harmony export */ useContext: () => (/* binding */ useContext)\n/* harmony export */ });\n/**\n * Creates a injectable context that can be retrieved later with `useContext(context)`\n *\n * Example\n * ```typescript\n *\n * const AppContext = createContext({some: 'value'});\n * context.scope(val, () => {\n * const value = useContext(AppContext);\n * })\n *\n * ```\n */\nfunction createContext() {\n const ctx = {\n scope: (value, cb) => {\n const old = ctx.value;\n ctx.value = value;\n try {\n return cb();\n }\n catch (e) {\n throw e;\n }\n finally {\n ctx.value = old;\n }\n },\n value: undefined\n };\n return ctx;\n}\n/**\n * Retrieves the value from the current context\n */\nfunction useContext(context) {\n return context.value;\n}\n\n\n/***/ }),\n\n/***/ \"./Debug/DebugConfig.ts\":\n/*!******************************!*\\\n !*** ./Debug/DebugConfig.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DebugConfig: () => (/* binding */ DebugConfig),\n/* harmony export */ FrameStats: () => (/* binding */ FrameStats),\n/* harmony export */ PhysicsStats: () => (/* binding */ PhysicsStats)\n/* harmony export */ });\n/* harmony import */ var _DebugFlags__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./DebugFlags */ \"./Debug/DebugFlags.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n\n\n/**\n * Debug statistics and flags for Excalibur. If polling these values, it would be\n * best to do so on the `postupdate` event for {@apilink Engine}, after all values have been\n * updated during a frame.\n */\nclass DebugConfig {\n constructor(engine) {\n /**\n * Performance statistics\n */\n this.stats = {\n /**\n * Current frame statistics. Engine reuses this instance, use {@apilink FrameStats.clone} to copy frame stats.\n * Best accessed on {@apilink postframe} event. See {@apilink FrameStats}\n */\n currFrame: new FrameStats(),\n /**\n * Previous frame statistics. Engine reuses this instance, use {@apilink FrameStats.clone} to copy frame stats.\n * Best accessed on {@apilink preframe} event. Best inspected on engine event `preframe`. See {@apilink FrameStats}\n */\n prevFrame: new FrameStats()\n };\n /**\n * Filter debug context to named entities or entity ids\n */\n this.filter = {\n /**\n * Toggle filter on or off (default off) must be on for DebugDraw to use filters\n */\n useFilter: false,\n /**\n * Query for entities by name, if the entity name contains `nameQuery` it will be included\n */\n nameQuery: '',\n /**\n * Query for Entity ids, if the id matches it will be included\n */\n ids: []\n };\n /**\n * Entity debug settings\n */\n this.entity = {\n showAll: false,\n showId: false,\n showName: false\n };\n /**\n * Transform component debug settings\n */\n this.transform = {\n showAll: false,\n debugZIndex: 10000000,\n showPosition: false,\n showPositionLabel: false,\n positionColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Yellow,\n showZIndex: false,\n showScale: false,\n scaleColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Green,\n showRotation: false,\n rotationColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Blue\n };\n /**\n * Graphics component debug settings\n */\n this.graphics = {\n showAll: false,\n showBounds: false,\n boundsColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Yellow\n };\n /**\n * Collider component debug settings\n */\n this.collider = {\n showAll: false,\n showBounds: false,\n boundsColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Blue,\n showOwner: false,\n showGeometry: true,\n geometryColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Green,\n geometryLineWidth: 1,\n geometryPointSize: 0.5\n };\n /**\n * Physics simulation debug settings\n */\n this.physics = {\n showAll: false,\n showBroadphaseSpacePartitionDebug: false,\n showCollisionNormals: false,\n collisionNormalColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Cyan,\n showCollisionContacts: true,\n contactSize: 2,\n collisionContactColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Red\n };\n /**\n * Motion component debug settings\n */\n this.motion = {\n showAll: false,\n showVelocity: false,\n velocityColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Yellow,\n showAcceleration: false,\n accelerationColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Red\n };\n /**\n * Body component debug settings\n */\n this.body = {\n showAll: false,\n showCollisionGroup: false,\n showCollisionType: false,\n showSleeping: false,\n showMotion: false,\n showMass: false\n };\n /**\n * Camera debug settings\n */\n this.camera = {\n showAll: false,\n showFocus: false,\n focusColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Red,\n showZoom: false\n };\n this.tilemap = {\n showAll: false,\n showGrid: false,\n gridColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Red,\n gridWidth: 0.5,\n showSolidBounds: false,\n solidBoundsColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.fromHex('#8080807F'), // grayish\n showColliderGeometry: true\n };\n this.isometric = {\n showAll: false,\n showPosition: false,\n positionColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Yellow,\n positionSize: 1,\n showGrid: false,\n gridColor: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Red,\n gridWidth: 1,\n showColliderGeometry: true\n };\n this._engine = engine;\n this.colorBlindMode = new _DebugFlags__WEBPACK_IMPORTED_MODULE_1__.ColorBlindFlags(this._engine);\n }\n /**\n * Switch the current excalibur clock with the {@apilink TestClock} and return\n * it in the same running state.\n *\n * This is useful when you need to debug frame by frame.\n */\n useTestClock() {\n const clock = this._engine.clock;\n const wasRunning = clock.isRunning();\n clock.stop();\n const testClock = clock.toTestClock();\n if (wasRunning) {\n testClock.start();\n }\n this._engine.clock = testClock;\n return testClock;\n }\n /**\n * Switch the current excalibur clock with the {@apilink StandardClock} and\n * return it in the same running state.\n *\n * This is useful when you need to switch back to normal mode after\n * debugging.\n */\n useStandardClock() {\n const currentClock = this._engine.clock;\n const wasRunning = currentClock.isRunning();\n currentClock.stop();\n const standardClock = currentClock.toStandardClock();\n if (wasRunning) {\n standardClock.start();\n }\n this._engine.clock = standardClock;\n return standardClock;\n }\n}\n/**\n * Implementation of a frame's stats. Meant to have values copied via {@apilink FrameStats.reset}, avoid\n * creating instances of this every frame.\n */\nclass FrameStats {\n constructor() {\n this._id = 0;\n this._elapsedMs = 0;\n this._fps = 0;\n this._actorStats = {\n alive: 0,\n killed: 0,\n ui: 0,\n get remaining() {\n return this.alive - this.killed;\n },\n get total() {\n return this.remaining + this.ui;\n }\n };\n this._durationStats = {\n update: 0,\n draw: 0,\n get total() {\n return this.update + this.draw;\n }\n };\n this._physicsStats = new PhysicsStats();\n this._graphicsStats = {\n drawCalls: 0,\n drawnImages: 0\n };\n }\n /**\n * Zero out values or clone other IFrameStat stats. Allows instance reuse.\n * @param [otherStats] Optional stats to clone\n */\n reset(otherStats) {\n if (otherStats) {\n this.id = otherStats.id;\n this.elapsedMs = otherStats.elapsedMs;\n this.fps = otherStats.fps;\n this.actors.alive = otherStats.actors.alive;\n this.actors.killed = otherStats.actors.killed;\n this.actors.ui = otherStats.actors.ui;\n this.duration.update = otherStats.duration.update;\n this.duration.draw = otherStats.duration.draw;\n this._physicsStats.reset(otherStats.physics);\n this.graphics.drawCalls = otherStats.graphics.drawCalls;\n this.graphics.drawnImages = otherStats.graphics.drawnImages;\n }\n else {\n this.id = this.elapsedMs = this.fps = 0;\n this.actors.alive = this.actors.killed = this.actors.ui = 0;\n this.duration.update = this.duration.draw = 0;\n this._physicsStats.reset();\n this.graphics.drawnImages = this.graphics.drawCalls = 0;\n }\n }\n /**\n * Provides a clone of this instance.\n */\n clone() {\n const fs = new FrameStats();\n fs.reset(this);\n return fs;\n }\n /**\n * Gets the frame's id\n */\n get id() {\n return this._id;\n }\n /**\n * Sets the frame's id\n */\n set id(value) {\n this._id = value;\n }\n /**\n * Gets the frame's delta (time since last frame)\n */\n get elapsedMs() {\n return this._elapsedMs;\n }\n /**\n * Sets the frame's delta (time since last frame). Internal use only.\n * @internal\n */\n set elapsedMs(value) {\n this._elapsedMs = value;\n }\n /**\n * Gets the frame's frames-per-second (FPS)\n */\n get fps() {\n return this._fps;\n }\n /**\n * Sets the frame's frames-per-second (FPS). Internal use only.\n * @internal\n */\n set fps(value) {\n this._fps = value;\n }\n /**\n * Gets the frame's actor statistics\n */\n get actors() {\n return this._actorStats;\n }\n /**\n * Gets the frame's duration statistics\n */\n get duration() {\n return this._durationStats;\n }\n /**\n * Gets the frame's physics statistics\n */\n get physics() {\n return this._physicsStats;\n }\n /**\n * Gets the frame's graphics statistics\n */\n get graphics() {\n return this._graphicsStats;\n }\n}\nclass PhysicsStats {\n constructor() {\n this._pairs = 0;\n this._collisions = 0;\n this._contacts = new Map();\n this._fastBodies = 0;\n this._fastBodyCollisions = 0;\n this._broadphase = 0;\n this._narrowphase = 0;\n }\n /**\n * Zero out values or clone other IPhysicsStats stats. Allows instance reuse.\n * @param [otherStats] Optional stats to clone\n */\n reset(otherStats) {\n if (otherStats) {\n this.pairs = otherStats.pairs;\n this.collisions = otherStats.collisions;\n this.contacts = otherStats.contacts;\n this.fastBodies = otherStats.fastBodies;\n this.fastBodyCollisions = otherStats.fastBodyCollisions;\n this.broadphase = otherStats.broadphase;\n this.narrowphase = otherStats.narrowphase;\n }\n else {\n this.pairs = this.collisions = this.fastBodies = 0;\n this.fastBodyCollisions = this.broadphase = this.narrowphase = 0;\n this.contacts.clear();\n }\n }\n /**\n * Provides a clone of this instance.\n */\n clone() {\n const ps = new PhysicsStats();\n ps.reset(this);\n return ps;\n }\n get pairs() {\n return this._pairs;\n }\n set pairs(value) {\n this._pairs = value;\n }\n get collisions() {\n return this._collisions;\n }\n set collisions(value) {\n this._collisions = value;\n }\n get contacts() {\n return this._contacts;\n }\n set contacts(contacts) {\n this._contacts = contacts;\n }\n get fastBodies() {\n return this._fastBodies;\n }\n set fastBodies(value) {\n this._fastBodies = value;\n }\n get fastBodyCollisions() {\n return this._fastBodyCollisions;\n }\n set fastBodyCollisions(value) {\n this._fastBodyCollisions = value;\n }\n get broadphase() {\n return this._broadphase;\n }\n set broadphase(value) {\n this._broadphase = value;\n }\n get narrowphase() {\n return this._narrowphase;\n }\n set narrowphase(value) {\n this._narrowphase = value;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Debug/DebugFlags.ts\":\n/*!*****************************!*\\\n !*** ./Debug/DebugFlags.ts ***!\n \\*****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ColorBlindFlags: () => (/* binding */ ColorBlindFlags)\n/* harmony export */ });\n/* harmony import */ var _Graphics_PostProcessor_ColorBlindnessMode__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Graphics/PostProcessor/ColorBlindnessMode */ \"./Graphics/PostProcessor/ColorBlindnessMode.ts\");\n/* harmony import */ var _Graphics_PostProcessor_ColorBlindnessPostProcessor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Graphics/PostProcessor/ColorBlindnessPostProcessor */ \"./Graphics/PostProcessor/ColorBlindnessPostProcessor.ts\");\n/* harmony import */ var _Graphics_Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Graphics/Context/ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n\n\n\nclass ColorBlindFlags {\n constructor(engine) {\n this._engine = engine;\n this._colorBlindPostProcessor = new _Graphics_PostProcessor_ColorBlindnessPostProcessor__WEBPACK_IMPORTED_MODULE_0__.ColorBlindnessPostProcessor(_Graphics_PostProcessor_ColorBlindnessMode__WEBPACK_IMPORTED_MODULE_1__.ColorBlindnessMode.Protanope);\n }\n /**\n * Correct colors for a specified color blindness\n * @param colorBlindness\n */\n correct(colorBlindness) {\n if (this._engine.graphicsContext instanceof _Graphics_Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_2__.ExcaliburGraphicsContextWebGL) {\n this.clear();\n this._colorBlindPostProcessor.colorBlindnessMode = colorBlindness;\n this._colorBlindPostProcessor.simulate = false;\n this._engine.graphicsContext.addPostProcessor(this._colorBlindPostProcessor);\n }\n }\n /**\n * Simulate colors for a specified color blindness\n * @param colorBlindness\n */\n simulate(colorBlindness) {\n if (this._engine.graphicsContext instanceof _Graphics_Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_2__.ExcaliburGraphicsContextWebGL) {\n this.clear();\n this._colorBlindPostProcessor.colorBlindnessMode = colorBlindness;\n this._colorBlindPostProcessor.simulate = true;\n this._engine.graphicsContext.addPostProcessor(this._colorBlindPostProcessor);\n }\n }\n /**\n * Remove color blindness post processor\n */\n clear() {\n this._engine.graphicsContext.removePostProcessor(this._colorBlindPostProcessor);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Debug/DebugSystem.ts\":\n/*!******************************!*\\\n !*** ./Debug/DebugSystem.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DebugSystem: () => (/* binding */ DebugSystem)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../Collision/ColliderComponent */ \"./Collision/ColliderComponent.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Priority.ts\");\n/* harmony import */ var _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../Collision/BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Collision_CollisionSystem__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Collision/CollisionSystem */ \"./Collision/CollisionSystem.ts\");\n/* harmony import */ var _Collision_Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../Collision/Colliders/CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Graphics/GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Particles_Particles__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Particles/Particles */ \"./Particles/Particles.ts\");\n/* harmony import */ var _Graphics_DebugGraphicsComponent__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Graphics/DebugGraphicsComponent */ \"./Graphics/DebugGraphicsComponent.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Math/coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _Graphics_Debug__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../Graphics/Debug */ \"./Graphics/Debug.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass DebugSystem extends _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.System {\n constructor(world) {\n super();\n this.world = world;\n this.systemType = _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.SystemType.Draw;\n this.query = this.world.query([_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_1__.TransformComponent]);\n }\n initialize(world, scene) {\n this._graphicsContext = scene.engine.graphicsContext;\n this._camera = scene.camera;\n this._engine = scene.engine;\n this._collisionSystem = world.systemManager.get(_Collision_CollisionSystem__WEBPACK_IMPORTED_MODULE_2__.CollisionSystem);\n }\n update() {\n var _a;\n if (!this._engine.isDebug) {\n return;\n }\n const filterSettings = this._engine.debug.filter;\n let id;\n let name;\n const entitySettings = this._engine.debug.entity;\n let tx;\n const txSettings = this._engine.debug.transform;\n let motion;\n const motionSettings = this._engine.debug.motion;\n let colliderComp;\n const colliderSettings = this._engine.debug.collider;\n const physicsSettings = this._engine.debug.physics;\n let graphics;\n const graphicsSettings = this._engine.debug.graphics;\n let debugDraw;\n let body;\n const bodySettings = this._engine.debug.body;\n const cameraSettings = this._engine.debug.camera;\n for (let i = 0; i < this.query.entities.length; i++) {\n const entity = this.query.entities[i];\n if (entity.hasTag('offscreen')) {\n // skip offscreen entities\n continue;\n }\n if (entity instanceof _Particles_Particles__WEBPACK_IMPORTED_MODULE_3__.Particle) {\n // Particles crush the renderer :(\n continue;\n }\n if (filterSettings.useFilter) {\n const allIds = filterSettings.ids.length === 0;\n const idMatch = allIds || filterSettings.ids.includes(entity.id);\n if (!idMatch) {\n continue;\n }\n const allNames = filterSettings.nameQuery === '';\n const nameMatch = allNames || entity.name.includes(filterSettings.nameQuery);\n if (!nameMatch) {\n continue;\n }\n }\n let cursor = _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero;\n const lineHeight = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(0, 16);\n id = entity.id;\n name = entity.name;\n tx = entity.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n // This optionally sets our camera based on the entity coord plan (world vs. screen)\n this._pushCameraTransform(tx);\n this._graphicsContext.save();\n if (tx.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_5__.CoordPlane.Screen) {\n this._graphicsContext.translate(this._engine.screen.contentArea.left, this._engine.screen.contentArea.top);\n }\n this._graphicsContext.z = txSettings.debugZIndex;\n this._applyTransform(entity);\n if (tx) {\n if (txSettings.showAll || txSettings.showPosition) {\n this._graphicsContext.debug.drawPoint(_Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero, { size: 4, color: txSettings.positionColor });\n }\n if (txSettings.showAll || txSettings.showPositionLabel) {\n this._graphicsContext.debug.drawText(`pos${tx.pos.toString(2)}`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (txSettings.showAll || txSettings.showZIndex) {\n this._graphicsContext.debug.drawText(`z(${tx.z.toFixed(1)})`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (entitySettings.showAll || entitySettings.showId) {\n this._graphicsContext.debug.drawText(`id(${id}) ${entity.parent ? 'child of id(' + ((_a = entity.parent) === null || _a === void 0 ? void 0 : _a.id) + ')' : ''}`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (entitySettings.showAll || entitySettings.showName) {\n this._graphicsContext.debug.drawText(`name(${name})`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (txSettings.showAll || txSettings.showRotation) {\n this._graphicsContext.drawLine(_Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero, _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.fromAngle(tx.rotation).scale(50).add(_Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero), txSettings.rotationColor, 2);\n this._graphicsContext.debug.drawText(`rot deg(${(0,_Math_util__WEBPACK_IMPORTED_MODULE_6__.toDegrees)(tx.rotation).toFixed(2)})`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (txSettings.showAll || txSettings.showScale) {\n this._graphicsContext.drawLine(_Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero, tx.scale.add(_Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero), txSettings.scaleColor, 2);\n }\n }\n graphics = entity.get(_Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_7__.GraphicsComponent);\n if (graphics) {\n if (graphicsSettings.showAll || graphicsSettings.showBounds) {\n const bounds = graphics.localBounds;\n bounds.draw(this._graphicsContext, graphicsSettings.boundsColor);\n }\n }\n debugDraw = entity.get(_Graphics_DebugGraphicsComponent__WEBPACK_IMPORTED_MODULE_8__.DebugGraphicsComponent);\n if (debugDraw) {\n if (!debugDraw.useTransform) {\n this._graphicsContext.restore();\n }\n debugDraw.draw(this._graphicsContext, this._engine.debug);\n if (!debugDraw.useTransform) {\n this._graphicsContext.save();\n this._applyTransform(entity);\n }\n }\n body = entity.get(_Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_9__.BodyComponent);\n if (body) {\n if (bodySettings.showAll || bodySettings.showCollisionGroup) {\n this._graphicsContext.debug.drawText(`collision group(${body.group.name})`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (bodySettings.showAll || bodySettings.showCollisionType) {\n this._graphicsContext.debug.drawText(`collision type(${body.collisionType})`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (bodySettings.showAll || bodySettings.showMass) {\n this._graphicsContext.debug.drawText(`mass(${body.mass})`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (bodySettings.showAll || bodySettings.showMotion) {\n this._graphicsContext.debug.drawText(`motion(${body.sleepMotion})`, cursor);\n cursor = cursor.add(lineHeight);\n }\n if (bodySettings.showAll || bodySettings.showSleeping) {\n this._graphicsContext.debug.drawText(`sleeping(${body.canSleep ? body.isSleeping : 'cant sleep'})`, cursor);\n cursor = cursor.add(lineHeight);\n }\n }\n this._graphicsContext.restore();\n // World space\n this._graphicsContext.save();\n if (tx.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_5__.CoordPlane.Screen) {\n this._graphicsContext.translate(this._engine.screen.contentArea.left, this._engine.screen.contentArea.top);\n }\n this._graphicsContext.z = txSettings.debugZIndex;\n motion = entity.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_10__.MotionComponent);\n if (motion) {\n if (motionSettings.showAll || motionSettings.showVelocity) {\n this._graphicsContext.debug.drawText(`vel${motion.vel.toString(2)}`, cursor.add(tx.globalPos));\n this._graphicsContext.drawLine(tx.globalPos, tx.globalPos.add(motion.vel), motionSettings.velocityColor, 2);\n cursor = cursor.add(lineHeight);\n }\n if (motionSettings.showAll || motionSettings.showAcceleration) {\n this._graphicsContext.drawLine(tx.globalPos, tx.globalPos.add(motion.acc), motionSettings.accelerationColor, 2);\n }\n }\n // Colliders live in world space already so after the restore()\n colliderComp = entity.get(_Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_11__.ColliderComponent);\n if (colliderComp) {\n const collider = colliderComp.get();\n if ((colliderSettings.showAll || colliderSettings.showGeometry) && collider) {\n collider.debug(this._graphicsContext, colliderSettings.geometryColor, {\n lineWidth: colliderSettings.geometryLineWidth,\n pointSize: colliderSettings.geometryPointSize\n });\n }\n if (colliderSettings.showAll || colliderSettings.showBounds) {\n if (collider instanceof _Collision_Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_12__.CompositeCollider) {\n const colliders = collider.getColliders();\n for (const collider of colliders) {\n const bounds = collider.bounds;\n const pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(bounds.left, bounds.top);\n this._graphicsContext.debug.drawRect(pos.x, pos.y, bounds.width, bounds.height, { color: colliderSettings.boundsColor });\n if (colliderSettings.showAll || colliderSettings.showOwner) {\n this._graphicsContext.debug.drawText(`owner id(${collider.owner.id})`, pos);\n }\n }\n colliderComp.bounds.draw(this._graphicsContext, colliderSettings.boundsColor);\n }\n else if (collider) {\n const bounds = colliderComp.bounds;\n const pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(bounds.left, bounds.top);\n this._graphicsContext.debug.drawRect(pos.x, pos.y, bounds.width, bounds.height, { color: colliderSettings.boundsColor });\n if (colliderSettings.showAll || colliderSettings.showOwner) {\n this._graphicsContext.debug.drawText(`owner id(${colliderComp.owner.id})`, pos);\n }\n }\n }\n }\n this._graphicsContext.restore();\n this._popCameraTransform(tx);\n }\n this._graphicsContext.save();\n this._camera.draw(this._graphicsContext);\n if (physicsSettings.showAll || physicsSettings.showBroadphaseSpacePartitionDebug) {\n this._collisionSystem.debug(this._graphicsContext);\n }\n if (physicsSettings.showAll || physicsSettings.showCollisionContacts || physicsSettings.showCollisionNormals) {\n for (const [_, contact] of this._engine.debug.stats.currFrame.physics.contacts) {\n if (physicsSettings.showAll || physicsSettings.showCollisionContacts) {\n for (const point of contact.points) {\n this._graphicsContext.debug.drawPoint(point, {\n size: physicsSettings.contactSize,\n color: physicsSettings.collisionContactColor\n });\n }\n }\n if (physicsSettings.showAll || physicsSettings.showCollisionNormals) {\n for (const point of contact.points) {\n this._graphicsContext.debug.drawLine(point, contact.normal.scale(30).add(point), {\n color: physicsSettings.collisionNormalColor\n });\n }\n }\n }\n }\n this._graphicsContext.restore();\n if (cameraSettings) {\n this._graphicsContext.save();\n this._camera.draw(this._graphicsContext);\n if (cameraSettings.showAll || cameraSettings.showFocus) {\n this._graphicsContext.drawCircle(this._camera.pos, 4, cameraSettings.focusColor);\n }\n if (cameraSettings.showAll || cameraSettings.showZoom) {\n this._graphicsContext.debug.drawText(`zoom(${this._camera.zoom})`, this._camera.pos);\n }\n this._graphicsContext.restore();\n }\n this._graphicsContext.flush();\n }\n postupdate(engine, elapsed) {\n if (this._engine.isDebug) {\n this._graphicsContext.save();\n if (this._camera) {\n this._camera.draw(this._graphicsContext);\n }\n _Graphics_Debug__WEBPACK_IMPORTED_MODULE_13__.Debug.flush(this._graphicsContext);\n this._graphicsContext.restore();\n }\n }\n /**\n * This applies the current entity transform to the graphics context\n * @param entity\n */\n _applyTransform(entity) {\n const ancestors = entity.getAncestors();\n for (const ancestor of ancestors) {\n const transform = ancestor === null || ancestor === void 0 ? void 0 : ancestor.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n if (transform) {\n this._graphicsContext.translate(transform.pos.x, transform.pos.y);\n this._graphicsContext.scale(transform.scale.x, transform.scale.y);\n this._graphicsContext.rotate(transform.rotation);\n }\n }\n }\n /**\n * Applies the current camera transform if in world coordinates\n * @param transform\n */\n _pushCameraTransform(transform) {\n // Establish camera offset per entity\n if (transform.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_5__.CoordPlane.World) {\n this._graphicsContext.save();\n if (this._camera) {\n this._camera.draw(this._graphicsContext);\n }\n }\n }\n /**\n * Resets the current camera transform if in world coordinates\n * @param transform\n */\n _popCameraTransform(transform) {\n if (transform.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_5__.CoordPlane.World) {\n // Apply camera world offset\n this._graphicsContext.restore();\n }\n }\n}\nDebugSystem.priority = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_14__.SystemPriority.Lowest;\n\n\n/***/ }),\n\n/***/ \"./Debug/index.ts\":\n/*!************************!*\\\n !*** ./Debug/index.ts ***!\n \\************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ColorBlindFlags: () => (/* reexport safe */ _DebugFlags__WEBPACK_IMPORTED_MODULE_1__.ColorBlindFlags),\n/* harmony export */ DebugConfig: () => (/* reexport safe */ _DebugConfig__WEBPACK_IMPORTED_MODULE_0__.DebugConfig),\n/* harmony export */ DebugSystem: () => (/* reexport safe */ _DebugSystem__WEBPACK_IMPORTED_MODULE_2__.DebugSystem),\n/* harmony export */ FrameStats: () => (/* reexport safe */ _DebugConfig__WEBPACK_IMPORTED_MODULE_0__.FrameStats),\n/* harmony export */ PhysicsStats: () => (/* reexport safe */ _DebugConfig__WEBPACK_IMPORTED_MODULE_0__.PhysicsStats)\n/* harmony export */ });\n/* harmony import */ var _DebugConfig__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./DebugConfig */ \"./Debug/DebugConfig.ts\");\n/* harmony import */ var _DebugFlags__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./DebugFlags */ \"./Debug/DebugFlags.ts\");\n/* harmony import */ var _DebugSystem__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./DebugSystem */ \"./Debug/DebugSystem.ts\");\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Director/CrossFade.ts\":\n/*!*******************************!*\\\n !*** ./Director/CrossFade.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CrossFade: () => (/* binding */ CrossFade)\n/* harmony export */ });\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Graphics */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Transition__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Transition */ \"./Director/Transition.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n\n\n\n/**\n * CrossFades between the previous scene and the destination scene\n *\n * Note: CrossFade only works as an \"in\" transition\n */\nclass CrossFade extends _Transition__WEBPACK_IMPORTED_MODULE_0__.Transition {\n constructor(options) {\n super({ direction: 'in', ...options }); // default the correct direction\n this.name = `CrossFade#${this.id}`;\n }\n async onPreviousSceneDeactivate(scene) {\n this.image = await scene.engine.screenshot(true);\n // Firefox is particularly slow\n // needed in case the image isn't ready yet\n await this.image.decode();\n }\n onInitialize(engine) {\n this.engine = engine;\n this.transform.pos = engine.screen.unsafeArea.topLeft;\n this.screenCover = _Graphics__WEBPACK_IMPORTED_MODULE_1__.ImageSource.fromHtmlImageElement(this.image).toSprite();\n this.graphics.add(this.screenCover);\n // This is because we preserve hidpi res on the screen shot which COULD be bigger than the logical resolution\n this.transform.scale = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(1 / engine.screen.pixelRatio, 1 / engine.screen.pixelRatio);\n this.graphics.opacity = this.progress;\n }\n onStart(_progress) {\n this.graphics.opacity = this.progress;\n }\n onReset() {\n this.graphics.opacity = this.progress;\n }\n onEnd(progress) {\n this.graphics.opacity = progress;\n }\n onUpdate(progress) {\n this.graphics.opacity = progress;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Director/DefaultLoader.ts\":\n/*!***********************************!*\\\n !*** ./Director/DefaultLoader.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DefaultLoader: () => (/* binding */ DefaultLoader),\n/* harmony export */ LoaderEvents: () => (/* binding */ LoaderEvents),\n/* harmony export */ isLoaderConstructor: () => (/* binding */ isLoaderConstructor)\n/* harmony export */ });\n/* harmony import */ var _Util_WebAudio__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Util/WebAudio */ \"./Util/WebAudio.ts\");\n/* harmony import */ var _Graphics_Canvas__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Graphics/Canvas */ \"./Graphics/Canvas.ts\");\n/* harmony import */ var _Graphics_Filtering__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Graphics/Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Resources_Sound_Sound__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Resources/Sound/Sound */ \"./Resources/Sound/Sound.ts\");\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Util/Future */ \"./Util/Future.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Util/Util */ \"./Util/Util.ts\");\n\n\n\n\n\n\n\n\n\nconst LoaderEvents = {\n // Add event types here\n BeforeLoad: 'beforeload',\n AfterLoad: 'afterload',\n UserAction: 'useraction',\n LoadResourceStart: 'loadresourcestart',\n LoadResourceEnd: 'loadresourceend'\n};\n/**\n * Returns true if the constructor is for an Excalibur Loader\n */\nfunction isLoaderConstructor(x) {\n var _a, _b;\n return !!(x === null || x === void 0 ? void 0 : x.prototype) && !!((_b = (_a = x === null || x === void 0 ? void 0 : x.prototype) === null || _a === void 0 ? void 0 : _a.constructor) === null || _b === void 0 ? void 0 : _b.name);\n}\nclass DefaultLoader {\n get resources() {\n return this._resources;\n }\n /**\n * @param options Optionally provide the list of resources you want to load at constructor time\n */\n constructor(options) {\n var _a;\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n this.canvas = new _Graphics_Canvas__WEBPACK_IMPORTED_MODULE_1__.Canvas({\n filtering: _Graphics_Filtering__WEBPACK_IMPORTED_MODULE_2__.ImageFiltering.Blended,\n smoothing: true,\n cache: false,\n draw: this.onDraw.bind(this)\n });\n this._resources = [];\n this._numLoaded = 0;\n this._totalTimeMs = 0;\n this._loadingFuture = new _Util_Future__WEBPACK_IMPORTED_MODULE_3__.Future();\n if (options && ((_a = options.loadables) === null || _a === void 0 ? void 0 : _a.length)) {\n this.addResources(options.loadables);\n }\n }\n /**\n * Called by the engine before loading\n * @param engine\n */\n onInitialize(engine) {\n this.engine = engine;\n this.canvas.width = this.engine.screen.resolution.width;\n this.canvas.height = this.engine.screen.resolution.height;\n }\n /**\n * Return a promise that resolves when the user interacts with the loading screen in some way, usually a click.\n *\n * It's important to implement this in order to unlock the audio context in the browser. Browsers automatically prevent\n * audio from playing until the user performs an action.\n *\n */\n async onUserAction() {\n return await Promise.resolve();\n }\n /**\n * Overridable lifecycle method, called directly before loading starts\n */\n async onBeforeLoad() {\n // override me\n }\n /**\n * Overridable lifecycle method, called after loading has completed\n */\n async onAfterLoad() {\n // override me\n await (0,_Util_Util__WEBPACK_IMPORTED_MODULE_4__.delay)(500, this.engine.clock); // avoid a flicker\n }\n /**\n * Add a resource to the loader to load\n * @param loadable Resource to add\n */\n addResource(loadable) {\n this._resources.push(loadable);\n }\n /**\n * Add a list of resources to the loader to load\n * @param loadables The list of resources to load\n */\n addResources(loadables) {\n let i = 0;\n const len = loadables.length;\n for (i; i < len; i++) {\n this.addResource(loadables[i]);\n }\n }\n markResourceComplete() {\n this._numLoaded++;\n }\n /**\n * Returns the progress of the loader as a number between [0, 1] inclusive.\n */\n get progress() {\n const total = this._resources.length;\n return total > 0 ? (0,_Math_util__WEBPACK_IMPORTED_MODULE_5__.clamp)(this._numLoaded, 0, total) / total : 1;\n }\n /**\n * Returns true if the loader has completely loaded all resources\n */\n isLoaded() {\n return this._numLoaded === this._resources.length;\n }\n /**\n * Optionally override the onUpdate\n * @param engine\n * @param elapsed\n */\n onUpdate(engine, elapsed) {\n this._totalTimeMs += elapsed;\n // override me\n }\n /**\n * Optionally override the onDraw\n */\n onDraw(ctx) {\n const seconds = this._totalTimeMs / 1000;\n ctx.fillStyle = _Color__WEBPACK_IMPORTED_MODULE_6__.Color.Black.toRGBA();\n ctx.fillRect(0, 0, this.engine.screen.resolution.width, this.engine.screen.resolution.height);\n ctx.save();\n ctx.translate(this.engine.screen.resolution.width / 2, this.engine.screen.resolution.height / 2);\n const speed = seconds * 10;\n ctx.strokeStyle = 'white';\n ctx.lineWidth = 10;\n ctx.lineCap = 'round';\n ctx.arc(0, 0, 40, speed, speed + (Math.PI * 3) / 2);\n ctx.stroke();\n ctx.fillStyle = 'white';\n ctx.font = '16px sans-serif';\n const text = (this.progress * 100).toFixed(0) + '%';\n const textbox = ctx.measureText(text);\n const width = Math.abs(textbox.actualBoundingBoxLeft) + Math.abs(textbox.actualBoundingBoxRight);\n const height = Math.abs(textbox.actualBoundingBoxAscent) + Math.abs(textbox.actualBoundingBoxDescent);\n ctx.fillText(text, -width / 2, height / 2); // center\n ctx.restore();\n }\n areResourcesLoaded() {\n if (this._resources.length === 0) {\n // special case no resources mean loaded;\n return Promise.resolve();\n }\n return this._loadingFuture.promise;\n }\n /**\n * Not meant to be overridden\n *\n * Begin loading all of the supplied resources, returning a promise\n * that resolves when loading of all is complete AND the user has interacted with the loading screen\n */\n async load() {\n await this.onBeforeLoad();\n this.events.emit('beforeload');\n this.canvas.flagDirty();\n await Promise.all(this._resources.map(async (r) => {\n this.events.emit('loadresourcestart', r);\n await r.load().finally(() => {\n // capture progress\n this._numLoaded++;\n this.canvas.flagDirty();\n this.events.emit('loadresourceend', r);\n });\n }));\n // Wire all sound to the engine\n for (const resource of this._resources) {\n if (resource instanceof _Resources_Sound_Sound__WEBPACK_IMPORTED_MODULE_7__.Sound) {\n resource.wireEngine(this.engine);\n }\n }\n this._loadingFuture.resolve();\n this.canvas.flagDirty();\n // Unlock browser AudioContext in after user gesture\n // See: https://github.com/excaliburjs/Excalibur/issues/262\n // See: https://github.com/excaliburjs/Excalibur/issues/1031\n await this.onUserAction();\n this.events.emit('useraction');\n await _Util_WebAudio__WEBPACK_IMPORTED_MODULE_8__.WebAudio.unlock();\n await this.onAfterLoad();\n this.events.emit('afterload');\n return (this.data = this._resources);\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Director/Director.ts\":\n/*!******************************!*\\\n !*** ./Director/Director.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Director: () => (/* binding */ Director),\n/* harmony export */ DirectorEvents: () => (/* binding */ DirectorEvents)\n/* harmony export */ });\n/* harmony import */ var _DefaultLoader__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./DefaultLoader */ \"./Director/DefaultLoader.ts\");\n/* harmony import */ var _Scene__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Scene */ \"./Scene.ts\");\n/* harmony import */ var _Loader__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Loader */ \"./Director/Loader.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n\n\n\nconst DirectorEvents = {\n NavigationStart: 'navigationstart',\n Navigation: 'navigation',\n NavigationEnd: 'navigationend'\n};\n/**\n * The Director is responsible for managing scenes and changing scenes in Excalibur.\n *\n * It deals with transitions, scene loaders, switching scenes\n *\n * This is used internally by Excalibur, generally not mean to\n * be instantiated end users directly.\n */\nclass Director {\n /**\n * Gets whether the director currently transitioning between scenes\n *\n * Useful if you need to block behavior during transition\n */\n get isTransitioning() {\n return this._isTransitioning;\n }\n constructor(_engine, scenes) {\n this._engine = _engine;\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this._initialized = false;\n /**\n * All registered scenes in Excalibur\n */\n this.scenes = {};\n /**\n * Holds all instantiated scenes\n */\n this._sceneToInstance = new Map();\n this._sceneToLoader = new Map();\n this._sceneToTransition = new Map();\n /**\n * Used to keep track of scenes that have already been loaded so we don't load multiple times\n */\n this._loadedScenes = new Set();\n this._isTransitioning = false;\n this.rootScene = this.currentScene = new _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene();\n this.add('root', this.rootScene);\n this.currentScene = this.rootScene;\n this.currentSceneName = 'root';\n for (const sceneKey in scenes) {\n const sceneOrOptions = scenes[sceneKey];\n this.add(sceneKey, sceneOrOptions);\n if (sceneKey === 'root') {\n this.rootScene = this.getSceneInstance('root'); // always a root scene\n this.currentScene = this.rootScene;\n }\n }\n }\n /**\n * Initialize the director's internal state\n */\n async onInitialize() {\n if (!this._initialized) {\n this._initialized = true;\n if (this._deferredGoto) {\n const deferredScene = this._deferredGoto;\n this._deferredGoto = undefined;\n const deferredTransition = this._deferredTransition;\n this._deferredTransition = undefined;\n const deferredSceneInstance = this.getSceneInstance(deferredScene);\n if (deferredSceneInstance && deferredTransition) {\n deferredTransition._addToTargetScene(this._engine, deferredSceneInstance);\n }\n await this.swapScene(deferredScene);\n if (deferredSceneInstance && deferredTransition) {\n await this.playTransition(deferredTransition, deferredSceneInstance);\n }\n }\n else {\n await this.swapScene('root');\n }\n }\n }\n get isInitialized() {\n return this._initialized;\n }\n /**\n * Configures the start scene, and optionally the transition & loader for the director\n *\n * Typically this is called at the beginning of the game to the start scene and transition and never again.\n * @param startScene\n * @param options\n */\n configureStart(startScene, options) {\n const maybeLoaderOrCtor = options === null || options === void 0 ? void 0 : options.loader;\n if (maybeLoaderOrCtor instanceof _DefaultLoader__WEBPACK_IMPORTED_MODULE_3__.DefaultLoader) {\n this.mainLoader = maybeLoaderOrCtor;\n }\n else if ((0,_DefaultLoader__WEBPACK_IMPORTED_MODULE_3__.isLoaderConstructor)(maybeLoaderOrCtor)) {\n this.mainLoader = new maybeLoaderOrCtor();\n }\n else {\n this.mainLoader = new _Loader__WEBPACK_IMPORTED_MODULE_4__.Loader();\n }\n let maybeStartTransition;\n if (options === null || options === void 0 ? void 0 : options.inTransition) {\n const { inTransition } = options;\n maybeStartTransition = inTransition;\n }\n this.startScene = startScene;\n // Fire and forget promise for the initial scene\n if (maybeStartTransition) {\n const startSceneInstance = this.getSceneInstance(this.startScene);\n if (startSceneInstance) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n maybeStartTransition._addToTargetScene(this._engine, startSceneInstance);\n this.swapScene(this.startScene).then(() => {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n return this.playTransition(maybeStartTransition, startSceneInstance);\n });\n }\n }\n else {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.swapScene(this.startScene);\n }\n this.currentSceneName = this.startScene;\n }\n _getLoader(sceneName) {\n return this._sceneToLoader.get(sceneName);\n }\n _getInTransition(sceneName) {\n var _a;\n const sceneOrRoute = this.scenes[sceneName];\n if (sceneOrRoute instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene || (0,_Scene__WEBPACK_IMPORTED_MODULE_2__.isSceneConstructor)(sceneOrRoute)) {\n return undefined;\n }\n return (_a = sceneOrRoute === null || sceneOrRoute === void 0 ? void 0 : sceneOrRoute.transitions) === null || _a === void 0 ? void 0 : _a.in;\n }\n _getOutTransition(sceneName) {\n var _a;\n const sceneOrRoute = this.scenes[sceneName];\n if (sceneOrRoute instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene || (0,_Scene__WEBPACK_IMPORTED_MODULE_2__.isSceneConstructor)(sceneOrRoute)) {\n return undefined;\n }\n return (_a = sceneOrRoute === null || sceneOrRoute === void 0 ? void 0 : sceneOrRoute.transitions) === null || _a === void 0 ? void 0 : _a.out;\n }\n getDeferredScene() {\n const maybeDeferred = this.getSceneDefinition(this._deferredGoto);\n if (this._deferredGoto && maybeDeferred) {\n return maybeDeferred;\n }\n return null;\n }\n /**\n * Returns a scene by name if it exists, might be the constructor and not the instance of a scene\n * @param name\n */\n getSceneDefinition(name) {\n const maybeScene = this.scenes[name];\n if (maybeScene instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene || (0,_Scene__WEBPACK_IMPORTED_MODULE_2__.isSceneConstructor)(maybeScene)) {\n return maybeScene;\n }\n else if (maybeScene) {\n return maybeScene.scene;\n }\n return undefined;\n }\n /**\n * Returns the name of the registered scene, null if none can be found\n * @param scene\n */\n getSceneName(scene) {\n for (const [name, maybeScene] of Object.entries(this.scenes)) {\n if (maybeScene instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene) {\n if (scene === maybeScene) {\n return name;\n }\n }\n else if (!(0,_Scene__WEBPACK_IMPORTED_MODULE_2__.isSceneConstructor)(maybeScene)) {\n if (scene === maybeScene.scene) {\n return name;\n }\n }\n }\n for (const [name, maybeScene] of Object.entries(this.scenes)) {\n if ((0,_Scene__WEBPACK_IMPORTED_MODULE_2__.isSceneConstructor)(maybeScene)) {\n if (scene.constructor === maybeScene) {\n return name;\n }\n }\n else if (!(maybeScene instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene)) {\n if (scene.constructor === maybeScene.scene) {\n return name;\n }\n }\n }\n return null;\n }\n /**\n * Returns the same Director, but asserts a scene DOES exist to the type system\n * @param name\n */\n assertAdded(name) {\n return this;\n }\n /**\n * Returns the same Director, but asserts a scene DOES NOT exist to the type system\n * @param name\n */\n assertRemoved(name) {\n return this;\n }\n /**\n * Adds additional Scenes to the game!\n * @param name\n * @param sceneOrRoute\n */\n add(name, sceneOrRoute) {\n if (!(sceneOrRoute instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene) && !(0,_Scene__WEBPACK_IMPORTED_MODULE_2__.isSceneConstructor)(sceneOrRoute)) {\n const { loader, transitions } = sceneOrRoute;\n const { in: inTransition, out: outTransition } = transitions !== null && transitions !== void 0 ? transitions : {};\n this._sceneToTransition.set(name, { in: inTransition, out: outTransition });\n if ((0,_DefaultLoader__WEBPACK_IMPORTED_MODULE_3__.isLoaderConstructor)(loader)) {\n this._sceneToLoader.set(name, new loader());\n }\n else if (loader) {\n this._sceneToLoader.set(name, loader);\n }\n }\n if (this.scenes[name]) {\n this._logger.warn('Scene', name, 'already exists overwriting');\n }\n this.scenes[name] = sceneOrRoute;\n return this.assertAdded(name);\n }\n remove(nameOrScene) {\n if (nameOrScene instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene || (0,_Scene__WEBPACK_IMPORTED_MODULE_2__.isSceneConstructor)(nameOrScene)) {\n const sceneOrCtor = nameOrScene;\n // remove scene\n for (const key in this.scenes) {\n if (this.scenes.hasOwnProperty(key)) {\n const potentialSceneOrOptions = this.scenes[key];\n let scene;\n if (potentialSceneOrOptions instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene || (0,_Scene__WEBPACK_IMPORTED_MODULE_2__.isSceneConstructor)(potentialSceneOrOptions)) {\n scene = potentialSceneOrOptions;\n }\n else {\n scene = potentialSceneOrOptions.scene;\n }\n if (scene === sceneOrCtor) {\n if (key === this.currentSceneName) {\n throw new Error(`Cannot remove a currently active scene: ${key}`);\n }\n this._sceneToInstance.delete(key);\n this._sceneToTransition.delete(key);\n this._sceneToLoader.delete(key);\n delete this.scenes[key];\n }\n }\n }\n }\n if (typeof nameOrScene === 'string') {\n if (nameOrScene === this.currentSceneName) {\n throw new Error(`Cannot remove a currently active scene: ${nameOrScene}`);\n }\n // remove scene\n this._sceneToInstance.delete(nameOrScene);\n this._sceneToTransition.delete(nameOrScene);\n this._sceneToLoader.delete(nameOrScene);\n delete this.scenes[nameOrScene];\n }\n }\n /**\n * Go to a specific scene, and optionally override loaders and transitions\n * @param destinationScene\n * @param options\n */\n async goToScene(destinationScene, options) {\n var _a, _b, _c, _d, _e, _f;\n const maybeDest = this.getSceneInstance(destinationScene);\n if (!maybeDest) {\n this._logger.warn(`Scene ${destinationScene} does not exist! Check the name, are you sure you added it?`);\n return;\n }\n const sourceSceneInstance = this.currentScene;\n const sourceScene = this.currentSceneName;\n const engineInputEnabled = (_b = (_a = this._engine.input) === null || _a === void 0 ? void 0 : _a.enabled) !== null && _b !== void 0 ? _b : true;\n this._isTransitioning = true;\n const maybeSourceOut = (_c = this.getSceneInstance(sourceScene)) === null || _c === void 0 ? void 0 : _c.onTransition('out');\n const maybeDestinationIn = maybeDest === null || maybeDest === void 0 ? void 0 : maybeDest.onTransition('in');\n options = {\n // Engine configuration then dynamic scene transitions\n ...{ sourceOut: (_d = this._getOutTransition(this.currentSceneName)) !== null && _d !== void 0 ? _d : maybeSourceOut },\n ...{ destinationIn: (_e = this._getInTransition(destinationScene)) !== null && _e !== void 0 ? _e : maybeDestinationIn },\n // Goto options\n ...options\n };\n const { sourceOut, destinationIn, sceneActivationData } = options;\n const outTransition = sourceOut !== null && sourceOut !== void 0 ? sourceOut : this._getOutTransition(this.currentSceneName);\n const inTransition = destinationIn !== null && destinationIn !== void 0 ? destinationIn : this._getInTransition(destinationScene);\n const hideLoader = (outTransition === null || outTransition === void 0 ? void 0 : outTransition.hideLoader) || (inTransition === null || inTransition === void 0 ? void 0 : inTransition.hideLoader);\n if (hideLoader) {\n // Start hidden loader early and take advantage of the transition\n // Don't await and block on a hidden loader\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.maybeLoadScene(destinationScene, hideLoader);\n }\n this._emitEvent('navigationstart', sourceScene, destinationScene);\n // Run the out transition on the current scene if present\n if (outTransition) {\n await this.playTransition(outTransition, sourceSceneInstance);\n }\n // Run the loader if present\n await this.maybeLoadScene(destinationScene, hideLoader);\n // Give incoming transition a chance to grab info from previous\n if (inTransition) {\n await inTransition.onPreviousSceneDeactivate(this.currentScene);\n }\n // Setup the in transition on the destination scene if present\n // this is important to it can be initialized with the\n if (inTransition) {\n inTransition._addToTargetScene(this._engine, maybeDest);\n }\n // Swap to the new scene\n // Runs scene lifecycle init and activate\n await this.swapScene(destinationScene, sceneActivationData);\n this._emitEvent('navigation', sourceScene, destinationScene);\n // Run the in transition on the new scene if present\n if (inTransition) {\n await this.playTransition(inTransition, maybeDest);\n }\n this._emitEvent('navigationend', sourceScene, destinationScene);\n (_f = this._engine.input) === null || _f === void 0 ? void 0 : _f.toggleEnabled(engineInputEnabled);\n this._isTransitioning = false;\n }\n /**\n * Retrieves a scene instance by key if it's registered.\n *\n * This will call any constructors that were given as a definition\n * @param scene\n */\n getSceneInstance(scene) {\n const sceneDefinition = this.getSceneDefinition(scene);\n if (!sceneDefinition) {\n return undefined;\n }\n if (this._sceneToInstance.has(scene)) {\n return this._sceneToInstance.get(scene);\n }\n if (sceneDefinition instanceof _Scene__WEBPACK_IMPORTED_MODULE_2__.Scene) {\n this._sceneToInstance.set(scene, sceneDefinition);\n return sceneDefinition;\n }\n const newScene = new sceneDefinition();\n this._sceneToInstance.set(scene, newScene);\n return newScene;\n }\n /**\n * Triggers scene loading if has not already been loaded\n * @param scene\n * @param hideLoader\n */\n async maybeLoadScene(scene, hideLoader = false) {\n var _a;\n const loader = (_a = this._getLoader(scene)) !== null && _a !== void 0 ? _a : new _DefaultLoader__WEBPACK_IMPORTED_MODULE_3__.DefaultLoader();\n const sceneToLoad = this.getSceneDefinition(scene);\n const sceneToLoadInstance = this.getSceneInstance(scene);\n if (sceneToLoad && sceneToLoadInstance && !this._loadedScenes.has(sceneToLoadInstance)) {\n sceneToLoadInstance.onPreLoad(loader);\n sceneToLoadInstance.events.emit('preload', { loader });\n if (hideLoader) {\n // Don't await a hidden loader\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this._engine.load(loader, hideLoader);\n }\n else {\n await this._engine.load(loader);\n }\n this._loadedScenes.add(sceneToLoadInstance);\n }\n }\n /**\n * Plays a transition in the current scene and does book keeping for input.\n * @param transition\n */\n async playTransition(transition, targetScene) {\n var _a, _b, _c, _d, _e, _f, _g;\n if (!this.isInitialized) {\n this._deferredTransition = transition;\n return;\n }\n if (transition) {\n this.currentTransition = transition;\n const sceneInputEnabled = (_b = (_a = targetScene.input) === null || _a === void 0 ? void 0 : _a.enabled) !== null && _b !== void 0 ? _b : true;\n (_c = targetScene.input) === null || _c === void 0 ? void 0 : _c.toggleEnabled(!transition.blockInput);\n (_d = this._engine.input) === null || _d === void 0 ? void 0 : _d.toggleEnabled(!transition.blockInput);\n this.currentTransition._addToTargetScene(this._engine, targetScene);\n await this.currentTransition._play();\n (_e = targetScene.input) === null || _e === void 0 ? void 0 : _e.toggleEnabled(sceneInputEnabled);\n }\n (_f = this.currentTransition) === null || _f === void 0 ? void 0 : _f.kill();\n (_g = this.currentTransition) === null || _g === void 0 ? void 0 : _g.reset();\n this.currentTransition = undefined;\n }\n /**\n * Swaps the current and destination scene after performing required lifecycle events\n * @param destinationScene\n * @param data\n */\n async swapScene(destinationScene, data) {\n const engine = this._engine;\n // if not yet initialized defer goToScene\n if (!this.isInitialized) {\n this._deferredGoto = destinationScene;\n return;\n }\n const maybeDest = this.getSceneInstance(destinationScene);\n if (maybeDest) {\n const previousScene = this.currentScene;\n const nextScene = maybeDest;\n this._logger.debug('Going to scene:', destinationScene);\n // only deactivate when initialized\n if (this.currentScene.isInitialized) {\n const context = { engine, previousScene, nextScene };\n await this.currentScene._deactivate(context);\n this.currentScene.events.emit('deactivate', new _Events__WEBPACK_IMPORTED_MODULE_5__.DeactivateEvent(context, this.currentScene));\n this.currentScene.input.clear();\n }\n // wait for the scene to be loaded if needed\n const destLoader = this._sceneToLoader.get(destinationScene);\n await (destLoader === null || destLoader === void 0 ? void 0 : destLoader.areResourcesLoaded());\n // set current scene to new one\n this.currentScene = nextScene;\n this.currentSceneName = destinationScene;\n engine.screen.setCurrentCamera(nextScene.camera);\n // initialize the current scene if has not been already\n await this.currentScene._initialize(engine);\n const context = { engine, previousScene, nextScene, data };\n await this.currentScene._activate(context);\n this.currentScene.events.emit('activate', new _Events__WEBPACK_IMPORTED_MODULE_5__.ActivateEvent(context, this.currentScene));\n }\n else {\n this._logger.error('Scene', destinationScene, 'does not exist!');\n }\n }\n _emitEvent(eventName, sourceScene, destinationScene) {\n const source = this.getSceneDefinition(sourceScene);\n const dest = this.getSceneDefinition(destinationScene);\n this.events.emit(eventName, {\n sourceScene: source,\n sourceName: sourceScene,\n destinationScene: dest,\n destinationName: destinationScene\n });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Director/FadeInOut.ts\":\n/*!*******************************!*\\\n !*** ./Director/FadeInOut.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FadeInOut: () => (/* binding */ FadeInOut)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Graphics */ \"./Graphics/Rectangle.ts\");\n/* harmony import */ var _Transition__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Transition */ \"./Director/Transition.ts\");\n\n\n\nclass FadeInOut extends _Transition__WEBPACK_IMPORTED_MODULE_0__.Transition {\n constructor(options) {\n var _a, _b;\n super({\n ...options,\n duration: (_a = options.duration) !== null && _a !== void 0 ? _a : 2000\n });\n this.name = `FadeInOut#${this.id}`;\n this.color = (_b = options.color) !== null && _b !== void 0 ? _b : _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Black;\n }\n onInitialize(engine) {\n this.transform.pos = engine.screen.unsafeArea.topLeft;\n this.screenCover = new _Graphics__WEBPACK_IMPORTED_MODULE_2__.Rectangle({\n width: engine.screen.resolution.width,\n height: engine.screen.resolution.height,\n color: this.color\n });\n this.graphics.add(this.screenCover);\n this.graphics.opacity = this.progress;\n }\n onReset() {\n this.graphics.opacity = this.progress;\n }\n onStart(progress) {\n this.graphics.opacity = progress;\n }\n onEnd(progress) {\n this.graphics.opacity = progress;\n }\n onUpdate(progress) {\n this.graphics.opacity = progress;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Director/Loader.ts\":\n/*!****************************!*\\\n !*** ./Director/Loader.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Loader: () => (/* binding */ Loader)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Util_DrawUtil__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Util/DrawUtil */ \"./Util/DrawUtil.ts\");\n/* harmony import */ var _Loader_logo_png__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Loader.logo.png */ \"./Director/Loader.logo.png\");\n/* harmony import */ var _Loader_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Loader.css */ \"./Director/Loader.css\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Util/Util */ \"./Util/Util.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _DefaultLoader__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./DefaultLoader */ \"./Director/DefaultLoader.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Util/Future */ \"./Util/Future.ts\");\n\n\n\n\n\n\n\n\n\n/**\n * Pre-loading assets\n *\n * The loader provides a mechanism to preload multiple resources at\n * one time. The loader must be passed to the engine in order to\n * trigger the loading progress bar.\n *\n * The {@apilink Loader} itself implements {@apilink Loadable} so you can load loaders.\n *\n * ## Example: Pre-loading resources for a game\n *\n * ```js\n * // create a loader\n * var loader = new ex.Loader();\n *\n * // create a resource dictionary (best practice is to keep a separate file)\n * var resources = {\n * TextureGround: new ex.Texture(\"/images/textures/ground.png\"),\n * SoundDeath: new ex.Sound(\"/sound/death.wav\", \"/sound/death.mp3\")\n * };\n *\n * // loop through dictionary and add to loader\n * for (var loadable in resources) {\n * if (resources.hasOwnProperty(loadable)) {\n * loader.addResource(resources[loadable]);\n * }\n * }\n *\n * // start game\n * game.start(loader).then(function () {\n * console.log(\"Game started!\");\n * });\n * ```\n *\n * ## Customize the Loader\n *\n * The loader can be customized to show different, text, logo, background color, and button.\n *\n * ```typescript\n * const loader = new ex.Loader([playerTexture]);\n *\n * // The loaders button text can simply modified using this\n * loader.playButtonText = 'Start the best game ever';\n *\n * // The logo can be changed by inserting a base64 image string here\n *\n * loader.logo = 'data:image/png;base64,iVBORw...';\n * loader.logoWidth = 15;\n * loader.logoHeight = 14;\n *\n * // The background color can be changed like so by supplying a valid CSS color string\n *\n * loader.backgroundColor = 'red'\n * loader.backgroundColor = '#176BAA'\n *\n * // To build a completely new button\n * loader.startButtonFactory = () => {\n * let myButton = document.createElement('button');\n * myButton.textContent = 'The best button';\n * return myButton;\n * };\n *\n * engine.start(loader).then(() => {});\n * ```\n */\nclass Loader extends _DefaultLoader__WEBPACK_IMPORTED_MODULE_0__.DefaultLoader {\n get _image() {\n if (!this._imageElement) {\n this._imageElement = new Image();\n this._imageElement.onload = () => this._imageLoaded.resolve();\n this._imageElement.src = this.logo;\n }\n return this._imageElement;\n }\n get playButtonRootElement() {\n return this._playButtonRootElement;\n }\n get playButtonElement() {\n return this._playButtonElement;\n }\n get _playButton() {\n const existingRoot = document.getElementById('excalibur-play-root');\n if (existingRoot) {\n this._playButtonRootElement = existingRoot;\n }\n if (!this._playButtonRootElement) {\n this._playButtonRootElement = document.createElement('div');\n this._playButtonRootElement.id = 'excalibur-play-root';\n this._playButtonRootElement.style.position = 'absolute';\n document.body.appendChild(this._playButtonRootElement);\n }\n if (!this._styleBlock) {\n this._styleBlock = document.createElement('style');\n this._styleBlock.textContent = this._playButtonStyles;\n document.head.appendChild(this._styleBlock);\n }\n if (!this._playButtonElement) {\n this._playButtonElement = this.startButtonFactory();\n this._playButtonRootElement.appendChild(this._playButtonElement);\n }\n return this._playButtonElement;\n }\n constructor(loadablesOrOptions) {\n const options = Array.isArray(loadablesOrOptions)\n ? {\n loadables: loadablesOrOptions\n }\n : loadablesOrOptions;\n super(options);\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this._originalOptions = { loadables: [] };\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_2__.EventEmitter();\n this._playButtonShown = false;\n // logo drawing stuff\n // base64 string encoding of the excalibur logo (logo-white.png)\n this.logo = _Loader_logo_png__WEBPACK_IMPORTED_MODULE_3__[\"default\"];\n this.logoWidth = 468;\n this.logoHeight = 118;\n /**\n * Gets or sets the color of the loading bar, default is {@apilink Color.White}\n */\n this.loadingBarColor = _Color__WEBPACK_IMPORTED_MODULE_4__.Color.White;\n /**\n * Gets or sets the background color of the loader as a hex string\n */\n this.backgroundColor = '#176BAA';\n this._imageLoaded = new _Util_Future__WEBPACK_IMPORTED_MODULE_5__.Future();\n this.suppressPlayButton = false;\n /** Loads the css from Loader.css */\n this._playButtonStyles = _Loader_css__WEBPACK_IMPORTED_MODULE_6__[\"default\"].toString();\n /**\n * Get/set play button text\n */\n this.playButtonText = 'Play game';\n /**\n * Return a html button element for excalibur to use as a play button\n */\n this.startButtonFactory = () => {\n let buttonElement = document.getElementById('excalibur-play');\n if (!buttonElement) {\n buttonElement = document.createElement('button');\n }\n buttonElement.id = 'excalibur-play';\n buttonElement.textContent = this.playButtonText;\n buttonElement.style.display = 'none';\n return buttonElement;\n };\n this._originalOptions = { ...Loader._DEFAULT_LOADER_OPTIONS, ...options };\n }\n onInitialize(engine) {\n this.engine = engine;\n this.screen = engine.screen;\n this.canvas.width = this.engine.canvas.width;\n this.canvas.height = this.engine.canvas.height;\n this.screen.events.on('resize', () => {\n this.canvas.width = this.engine.canvas.width;\n this.canvas.height = this.engine.canvas.height;\n });\n }\n /**\n * Shows the play button and returns a promise that resolves when clicked\n */\n async showPlayButton() {\n var _a, _b;\n if (this.suppressPlayButton) {\n this.hidePlayButton();\n // Delay is to give the logo a chance to show, otherwise don't delay\n await (0,_Util_Util__WEBPACK_IMPORTED_MODULE_7__.delay)(500, (_a = this.engine) === null || _a === void 0 ? void 0 : _a.clock);\n }\n else {\n const resizeHandler = () => {\n try {\n this._positionPlayButton();\n }\n catch (_a) {\n // swallow if can't position\n }\n };\n if ((_b = this.engine) === null || _b === void 0 ? void 0 : _b.browser) {\n this.engine.browser.window.on('resize', resizeHandler);\n }\n this._playButtonShown = true;\n this._playButton.style.display = 'block';\n document.body.addEventListener('keyup', (evt) => {\n if (evt.key === 'Enter') {\n this._playButton.click();\n }\n });\n this._positionPlayButton();\n const playButtonClicked = new Promise((resolve) => {\n const startButtonHandler = (e) => {\n var _a;\n // We want to stop propagation to keep bubbling to the engine pointer handlers\n e.stopPropagation();\n // Hide Button after click\n this.hidePlayButton();\n if ((_a = this.engine) === null || _a === void 0 ? void 0 : _a.browser) {\n this.engine.browser.window.off('resize', resizeHandler);\n }\n if (this._originalOptions.fullscreenAfterLoad) {\n try {\n this._logger.info('requesting fullscreen');\n if (this._originalOptions.fullscreenContainer instanceof HTMLElement) {\n this._originalOptions.fullscreenContainer.requestFullscreen();\n }\n else {\n this.engine.screen.goFullScreen(this._originalOptions.fullscreenContainer);\n }\n }\n catch (error) {\n this._logger.error('could not go fullscreen', error);\n }\n }\n resolve();\n };\n this._playButton.addEventListener('click', startButtonHandler);\n this._playButton.addEventListener('touchend', startButtonHandler);\n this._playButton.addEventListener('pointerup', startButtonHandler);\n });\n return await playButtonClicked;\n }\n }\n hidePlayButton() {\n this._playButtonShown = false;\n this._playButton.style.display = 'none';\n }\n /**\n * Clean up generated elements for the loader\n */\n dispose() {\n if (this._playButtonRootElement.parentElement) {\n this._playButtonRootElement.removeChild(this._playButtonElement);\n document.body.removeChild(this._playButtonRootElement);\n document.head.removeChild(this._styleBlock);\n this._playButtonRootElement = null;\n this._playButtonElement = null;\n this._styleBlock = null;\n }\n }\n async onUserAction() {\n var _a;\n // short delay in showing the button for aesthetics\n await (0,_Util_Util__WEBPACK_IMPORTED_MODULE_7__.delay)(200, (_a = this.engine) === null || _a === void 0 ? void 0 : _a.clock);\n this.canvas.flagDirty();\n // show play button\n await this.showPlayButton();\n }\n async onBeforeLoad() {\n this.screen.pushResolutionAndViewport();\n this.screen.resolution = { width: this.canvas.width, height: this.canvas.height };\n this.screen.applyResolutionAndViewport();\n const image = this._image;\n await this._imageLoaded.promise;\n await (image === null || image === void 0 ? void 0 : image.decode()); // decode logo if it exists\n }\n // eslint-disable-next-line require-await\n async onAfterLoad() {\n this.screen.popResolutionAndViewport();\n this.screen.applyResolutionAndViewport();\n this.dispose();\n }\n _positionPlayButton() {\n if (this.engine) {\n const { x: left, y: top, width: screenWidth, height: screenHeight } = this.engine.canvas.getBoundingClientRect();\n if (this._playButtonRootElement) {\n const buttonWidth = this._playButton.clientWidth;\n const buttonHeight = this._playButton.clientHeight;\n if (this.playButtonPosition) {\n this._playButtonRootElement.style.left = `${this.playButtonPosition.x}px`;\n this._playButtonRootElement.style.top = `${this.playButtonPosition.y}px`;\n }\n else {\n this._playButtonRootElement.style.left = `${left + screenWidth / 2 - buttonWidth / 2}px`;\n this._playButtonRootElement.style.top = `${top + screenHeight / 2 - buttonHeight / 2 + 100}px`;\n }\n }\n }\n }\n /**\n * Loader draw function. Draws the default Excalibur loading screen.\n * Override `logo`, `logoWidth`, `logoHeight` and `backgroundColor` properties\n * to customize the drawing, or just override entire method.\n */\n onDraw(ctx) {\n const canvasHeight = this.engine.canvasHeight / this.engine.pixelRatio;\n const canvasWidth = this.engine.canvasWidth / this.engine.pixelRatio;\n this._positionPlayButton();\n ctx.fillStyle = this.backgroundColor;\n ctx.fillRect(0, 0, canvasWidth, canvasHeight);\n let logoY = canvasHeight / 2;\n const width = Math.min(this.logoWidth, canvasWidth * 0.75);\n let logoX = canvasWidth / 2 - width / 2;\n if (this.logoPosition) {\n logoX = this.logoPosition.x;\n logoY = this.logoPosition.y;\n }\n const imageHeight = Math.floor(width * (this.logoHeight / this.logoWidth)); // OG height/width factor\n const oldAntialias = this.engine.screen.antialiasing;\n this.engine.screen.antialiasing = true;\n if (!this.logoPosition) {\n ctx.drawImage(this._image, 0, 0, this.logoWidth, this.logoHeight, logoX, logoY - imageHeight - 20, width, imageHeight);\n }\n else {\n ctx.drawImage(this._image, 0, 0, this.logoWidth, this.logoHeight, logoX, logoY, width, imageHeight);\n }\n // loading box\n if (!this.suppressPlayButton && this._playButtonShown) {\n this.engine.screen.antialiasing = oldAntialias;\n return;\n }\n let loadingX = logoX;\n let loadingY = logoY;\n if (this.loadingBarPosition) {\n loadingX = this.loadingBarPosition.x;\n loadingY = this.loadingBarPosition.y;\n }\n ctx.lineWidth = 2;\n _Util_DrawUtil__WEBPACK_IMPORTED_MODULE_8__.roundRect(ctx, loadingX, loadingY, width, 20, 10, this.loadingBarColor);\n const progress = width * this.progress;\n const margin = 5;\n const progressWidth = progress - margin * 2;\n const height = 20 - margin * 2;\n _Util_DrawUtil__WEBPACK_IMPORTED_MODULE_8__.roundRect(ctx, loadingX + margin, loadingY + margin, progressWidth > 10 ? progressWidth : 10, height, 5, null, this.loadingBarColor);\n this.engine.screen.antialiasing = oldAntialias;\n }\n}\nLoader._DEFAULT_LOADER_OPTIONS = {\n loadables: [],\n fullscreenAfterLoad: false,\n fullscreenContainer: undefined\n};\n\n\n/***/ }),\n\n/***/ \"./Director/Slide.ts\":\n/*!***************************!*\\\n !*** ./Director/Slide.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Slide: () => (/* binding */ Slide)\n/* harmony export */ });\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Graphics */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Transition__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Transition */ \"./Director/Transition.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/EasingFunctions */ \"./Util/EasingFunctions.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Math/coord-plane */ \"./Math/coord-plane.ts\");\n\n\n\n\n\n/**\n * Slide`s between the previous scene and the destination scene\n *\n * Note: Slide` only works as an \"in\" transition\n */\nclass Slide extends _Transition__WEBPACK_IMPORTED_MODULE_0__.Transition {\n constructor(options) {\n var _a;\n super({ direction: 'in', ...options }); // default the correct direction\n this._easing = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_1__.EasingFunctions.Linear;\n this.name = `Slide#${this.id}`;\n this.slideDirection = options.slideDirection;\n this.transform.coordPlane = _Math_coord_plane__WEBPACK_IMPORTED_MODULE_2__.CoordPlane.World;\n this.graphics.forceOnScreen = true;\n this._easing = (_a = options.easingFunction) !== null && _a !== void 0 ? _a : this._easing;\n this._vectorEasing = _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_1__.EasingFunctions.CreateVectorEasingFunction(this._easing);\n }\n async onPreviousSceneDeactivate(scene) {\n this._image = await scene.engine.screenshot(true);\n // Firefox is particularly slow\n // needed in case the image isn't ready yet\n await this._image.decode();\n this._screenCover = _Graphics__WEBPACK_IMPORTED_MODULE_3__.ImageSource.fromHtmlImageElement(this._image).toSprite();\n }\n onInitialize(engine) {\n this._engine = engine;\n switch (this.slideDirection) {\n case 'up': {\n this._directionOffset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(0, -engine.screen.resolution.height);\n break;\n }\n case 'down': {\n this._directionOffset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(0, engine.screen.resolution.height);\n break;\n }\n case 'left': {\n this._directionOffset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(-engine.screen.resolution.width, 0);\n break;\n }\n case 'right': {\n this._directionOffset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(engine.screen.resolution.width, 0);\n break;\n }\n }\n this._camera = this._engine.currentScene.camera;\n this._destinationCameraPosition = this._camera.pos.clone();\n // For sliding shift the camera and the transition slide by offset\n this._camera.pos = this._camera.pos.add(this._directionOffset);\n this.transform.pos = this.transform.pos.add(this._directionOffset);\n this._startCameraPosition = this._camera.pos.clone();\n this.graphics.use(this._screenCover);\n // This is because we preserve hidpi res on the screen shot which COULD be bigger than the logical resolution\n this.transform.scale = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(1 / engine.screen.pixelRatio, 1 / engine.screen.pixelRatio);\n }\n onUpdate(progress) {\n // in-transitions count down from 1 -> 0, so our \"end\" is swapped\n this._camera.pos = this._vectorEasing(progress, this._destinationCameraPosition, this._startCameraPosition, 1);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Director/Transition.ts\":\n/*!********************************!*\\\n !*** ./Director/Transition.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Transition: () => (/* binding */ Transition)\n/* harmony export */ });\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Util/Future */ \"./Util/Future.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Graphics */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Math/coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Util/EasingFunctions */ \"./Util/EasingFunctions.ts\");\n/* harmony import */ var _Util_Coroutine__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../Util/Coroutine */ \"./Util/Coroutine.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n\n\n\n\n\n\n\n\n\n/**\n * Base Transition that can be extended to provide custom scene transitions in Excalibur.\n */\nclass Transition extends _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_0__.Entity {\n /**\n * Returns a number between [0, 1] indicating what state the transition is in.\n *\n * * For 'out' direction transitions start at 0 and end at 1\n * * For 'in' direction transitions start at 1 and end at 0\n */\n get progress() {\n return this._currentProgress;\n }\n get complete() {\n if (this.direction === 'out') {\n return this.progress >= 1;\n }\n else {\n return this.progress <= 0;\n }\n }\n constructor(options) {\n var _a, _b, _c, _d;\n super();\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this.transform = new _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_2__.TransformComponent();\n this.graphics = new _Graphics__WEBPACK_IMPORTED_MODULE_3__.GraphicsComponent();\n this._completeFuture = new _Util_Future__WEBPACK_IMPORTED_MODULE_4__.Future();\n // State needs to be reset between uses\n this.started = false;\n this._currentDistance = 0;\n this._currentProgress = 0;\n this.done = this._completeFuture.promise;\n this.name = `Transition#${this.id}`;\n this.duration = options.duration;\n this.easing = (_a = options.easing) !== null && _a !== void 0 ? _a : _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_5__.EasingFunctions.Linear;\n this.direction = (_b = options.direction) !== null && _b !== void 0 ? _b : 'out';\n this.hideLoader = (_c = options.hideLoader) !== null && _c !== void 0 ? _c : false;\n this.blockInput = (_d = options.blockInput) !== null && _d !== void 0 ? _d : false;\n this.transform.coordPlane = _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__.CoordPlane.Screen;\n this.transform.pos = _Math_vector__WEBPACK_IMPORTED_MODULE_7__.Vector.Zero;\n this.transform.z = Infinity; // Transitions sit on top of everything\n this.graphics.anchor = _Math_vector__WEBPACK_IMPORTED_MODULE_7__.Vector.Zero;\n this.addComponent(this.transform);\n this.addComponent(this.graphics);\n if (this.direction === 'out') {\n this._currentProgress = 0;\n }\n else {\n this._currentProgress = 1;\n }\n }\n /**\n * Overridable lifecycle method, called before each update.\n *\n * **WARNING BE SURE** to call `super.updateTransition()` if overriding in your own custom implementation\n * @param engine\n * @param elapsed\n */\n updateTransition(engine, elapsed) {\n if (this.complete) {\n return;\n }\n this._currentDistance += (0,_Math_util__WEBPACK_IMPORTED_MODULE_8__.clamp)(elapsed / this.duration, 0, 1);\n if (this._currentDistance >= 1) {\n this._currentDistance = 1;\n }\n if (this.direction === 'out') {\n this._currentProgress = (0,_Math_util__WEBPACK_IMPORTED_MODULE_8__.clamp)(this.easing(this._currentDistance, 0, 1, 1), 0, 1);\n }\n else {\n this._currentProgress = (0,_Math_util__WEBPACK_IMPORTED_MODULE_8__.clamp)(this.easing(this._currentDistance, 1, 0, 1), 0, 1);\n }\n }\n /**\n * Overridable lifecycle method, called right before the previous scene has deactivated.\n *\n * This gives incoming transition a chance to grab info from previous scene if desired\n * @param scene\n */\n async onPreviousSceneDeactivate(scene) {\n // override me\n }\n /**\n * Overridable lifecycle method, called once at the beginning of the transition\n *\n * `progress` is given between 0 and 1\n * @param progress\n */\n onStart(progress) {\n // override me\n }\n /**\n * Overridable lifecycle method, called every frame of the transition\n *\n * `progress` is given between 0 and 1\n * @param progress\n */\n onUpdate(progress) {\n // override me\n }\n /**\n * Overridable lifecycle method, called at the end of the transition,\n *\n * `progress` is given between 0 and 1\n * @param progress\n */\n onEnd(progress) {\n // override me\n }\n /**\n * Overridable lifecycle method, called when the transition is reset\n *\n * Use this to override and provide your own reset logic for internal state in custom transition implementations\n */\n onReset() {\n // override me\n }\n /**\n * reset() is called by the engine to reset transitions\n */\n reset() {\n this.started = false;\n this._completeFuture = new _Util_Future__WEBPACK_IMPORTED_MODULE_4__.Future();\n this.done = this._completeFuture.promise;\n this._currentDistance = 0;\n if (this.direction === 'out') {\n this._currentProgress = 0;\n }\n else {\n this._currentProgress = 1;\n }\n this.onReset();\n }\n /**\n * @internal\n */\n _addToTargetScene(engine, targetScene) {\n const currentScene = targetScene;\n if (this.started) {\n this._logger.warn(`Attempted to add a transition ${this.name} that is already playing.`);\n }\n if (currentScene.world.entityManager.getById(this.id)) {\n return this._co;\n }\n this._engine = engine;\n currentScene.add(this);\n const self = this;\n this._co = (0,_Util_Coroutine__WEBPACK_IMPORTED_MODULE_9__.coroutine)(engine, function* () {\n while (!self.complete) {\n const elapsed = yield; // per frame\n self.updateTransition(self._engine, elapsed);\n self._execute();\n }\n }, {\n autostart: false\n });\n return this._co;\n }\n /**\n * Called internally by excalibur to swap scenes with transition\n * @internal\n */\n async _play() {\n if (this.started) {\n this.reset();\n this._logger.warn(`Attempted to play a transition ${this.name} that is already playing, reset transition.`);\n }\n if (!this._engine || !this._co) {\n this.reset();\n this._logger.warn(`Attempted to play a transition ${this.name} that hasn't been added`);\n }\n if (this._co) {\n await this._co.start();\n }\n }\n /**\n * execute() is called by the engine every frame to update the Transition lifecycle onStart/onUpdate/onEnd\n * @internal\n */\n _execute() {\n if (!this.isInitialized) {\n return;\n }\n if (!this.started) {\n this.started = true;\n this.onStart(this.progress);\n }\n this.onUpdate(this.progress);\n if (this.complete && !this._completeFuture.isCompleted) {\n this.onEnd(this.progress);\n this._completeFuture.resolve();\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Director/index.ts\":\n/*!***************************!*\\\n !*** ./Director/index.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CrossFade: () => (/* reexport safe */ _CrossFade__WEBPACK_IMPORTED_MODULE_2__.CrossFade),\n/* harmony export */ DefaultLoader: () => (/* reexport safe */ _DefaultLoader__WEBPACK_IMPORTED_MODULE_6__.DefaultLoader),\n/* harmony export */ Director: () => (/* reexport safe */ _Director__WEBPACK_IMPORTED_MODULE_4__.Director),\n/* harmony export */ DirectorEvents: () => (/* reexport safe */ _Director__WEBPACK_IMPORTED_MODULE_4__.DirectorEvents),\n/* harmony export */ FadeInOut: () => (/* reexport safe */ _FadeInOut__WEBPACK_IMPORTED_MODULE_1__.FadeInOut),\n/* harmony export */ Loader: () => (/* reexport safe */ _Loader__WEBPACK_IMPORTED_MODULE_5__.Loader),\n/* harmony export */ LoaderEvents: () => (/* reexport safe */ _DefaultLoader__WEBPACK_IMPORTED_MODULE_6__.LoaderEvents),\n/* harmony export */ Slide: () => (/* reexport safe */ _Slide__WEBPACK_IMPORTED_MODULE_3__.Slide),\n/* harmony export */ Transition: () => (/* reexport safe */ _Transition__WEBPACK_IMPORTED_MODULE_0__.Transition),\n/* harmony export */ isLoaderConstructor: () => (/* reexport safe */ _DefaultLoader__WEBPACK_IMPORTED_MODULE_6__.isLoaderConstructor)\n/* harmony export */ });\n/* harmony import */ var _Transition__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Transition */ \"./Director/Transition.ts\");\n/* harmony import */ var _FadeInOut__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./FadeInOut */ \"./Director/FadeInOut.ts\");\n/* harmony import */ var _CrossFade__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./CrossFade */ \"./Director/CrossFade.ts\");\n/* harmony import */ var _Slide__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Slide */ \"./Director/Slide.ts\");\n/* harmony import */ var _Director__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Director */ \"./Director/Director.ts\");\n/* harmony import */ var _Loader__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Loader */ \"./Director/Loader.ts\");\n/* harmony import */ var _DefaultLoader__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./DefaultLoader */ \"./Director/DefaultLoader.ts\");\n\n\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Engine.ts\":\n/*!*******************!*\\\n !*** ./Engine.ts ***!\n \\*******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Engine: () => (/* binding */ Engine),\n/* harmony export */ EngineEvents: () => (/* binding */ EngineEvents),\n/* harmony export */ ScrollPreventionMode: () => (/* binding */ ScrollPreventionMode)\n/* harmony export */ });\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ */ \"./index.ts\");\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Util/Future */ \"./Util/Future.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Input_PointerScope__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./Input/PointerScope */ \"./Input/PointerScope.ts\");\n/* harmony import */ var _Flags__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Flags */ \"./Flags.ts\");\n/* harmony import */ var _Polyfill__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Polyfill */ \"./Polyfill.ts\");\n/* harmony import */ var _Screen__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Screen */ \"./Screen.ts\");\n/* harmony import */ var _Director_DefaultLoader__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./Director/DefaultLoader */ \"./Director/DefaultLoader.ts\");\n/* harmony import */ var _Director_Loader__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./Director/Loader */ \"./Director/Loader.ts\");\n/* harmony import */ var _Util_Detector__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Util/Detector */ \"./Util/Detector.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./Events */ \"./Events.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./Color */ \"./Color.ts\");\n/* harmony import */ var _Scene__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./Scene */ \"./Scene.ts\");\n/* harmony import */ var _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./EntityComponentSystem/Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _Debug_DebugConfig__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./Debug/DebugConfig */ \"./Debug/DebugConfig.ts\");\n/* harmony import */ var _Util_Browser__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Util/Browser */ \"./Util/Browser.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Graphics */ \"./Graphics/Context/ExcaliburGraphicsContext.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Graphics */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Graphics */ \"./Graphics/Context/ExcaliburGraphicsContext2DCanvas.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Graphics */ \"./Graphics/Context/texture-loader.ts\");\n/* harmony import */ var _Util_Clock__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./Util/Clock */ \"./Util/Clock.ts\");\n/* harmony import */ var _Graphics_Filtering__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Graphics/Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Graphics_GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./Graphics/GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n/* harmony import */ var _Util_Toaster__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Util/Toaster */ \"./Util/Toaster.ts\");\n/* harmony import */ var _Director_Director__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./Director/Director */ \"./Director/Director.ts\");\n/* harmony import */ var _Input_InputHost__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./Input/InputHost */ \"./Input/InputHost.ts\");\n/* harmony import */ var _Collision_PhysicsConfig__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Collision/PhysicsConfig */ \"./Collision/PhysicsConfig.ts\");\n/* harmony import */ var _Context__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Context */ \"./Context.ts\");\n/* harmony import */ var _GarbageCollector__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./GarbageCollector */ \"./GarbageCollector.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./Util/Util */ \"./Util/Util.ts\");\n\n\n\n\n\n\n(0,_Polyfill__WEBPACK_IMPORTED_MODULE_0__.polyfill)();\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst EngineEvents = {\n FallbackGraphicsContext: 'fallbackgraphicscontext',\n Initialize: 'initialize',\n Visible: 'visible',\n Hidden: 'hidden',\n Start: 'start',\n Stop: 'stop',\n PreUpdate: 'preupdate',\n PostUpdate: 'postupdate',\n PreFrame: 'preframe',\n PostFrame: 'postframe',\n PreDraw: 'predraw',\n PostDraw: 'postdraw'\n};\n/**\n * Enum representing the different mousewheel event bubble prevention\n */\nvar ScrollPreventionMode;\n(function (ScrollPreventionMode) {\n /**\n * Do not prevent any page scrolling\n */\n ScrollPreventionMode[ScrollPreventionMode[\"None\"] = 0] = \"None\";\n /**\n * Prevent page scroll if mouse is over the game canvas\n */\n ScrollPreventionMode[ScrollPreventionMode[\"Canvas\"] = 1] = \"Canvas\";\n /**\n * Prevent all page scrolling via mouse wheel\n */\n ScrollPreventionMode[ScrollPreventionMode[\"All\"] = 2] = \"All\";\n})(ScrollPreventionMode || (ScrollPreventionMode = {}));\n/**\n * The Excalibur Engine\n *\n * The {@apilink Engine} is the main driver for a game. It is responsible for\n * starting/stopping the game, maintaining state, transmitting events,\n * loading resources, and managing the scene.\n */\nclass Engine {\n static useEngine() {\n const value = (0,_Context__WEBPACK_IMPORTED_MODULE_1__.useContext)(Engine.Context);\n if (!value) {\n throw new Error('Cannot inject engine with `useEngine()`, `useEngine()` was called outside of Engine lifecycle scope.');\n }\n return value;\n }\n /**\n * The width of the game canvas in pixels (physical width component of the\n * resolution of the canvas element)\n */\n get canvasWidth() {\n return this.screen.canvasWidth;\n }\n /**\n * Returns half width of the game canvas in pixels (half physical width component)\n */\n get halfCanvasWidth() {\n return this.screen.halfCanvasWidth;\n }\n /**\n * The height of the game canvas in pixels, (physical height component of\n * the resolution of the canvas element)\n */\n get canvasHeight() {\n return this.screen.canvasHeight;\n }\n /**\n * Returns half height of the game canvas in pixels (half physical height component)\n */\n get halfCanvasHeight() {\n return this.screen.halfCanvasHeight;\n }\n /**\n * Returns the width of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get drawWidth() {\n return this.screen.drawWidth;\n }\n /**\n * Returns half the width of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get halfDrawWidth() {\n return this.screen.halfDrawWidth;\n }\n /**\n * Returns the height of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get drawHeight() {\n return this.screen.drawHeight;\n }\n /**\n * Returns half the height of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get halfDrawHeight() {\n return this.screen.halfDrawHeight;\n }\n /**\n * Returns whether excalibur detects the current screen to be HiDPI\n */\n get isHiDpi() {\n return this.screen.isHiDpi;\n }\n /**\n * Access {@apilink stats} that holds frame statistics.\n */\n get stats() {\n return this.debug.stats;\n }\n /**\n * The current {@apilink Scene} being drawn and updated on screen\n */\n get currentScene() {\n return this.director.currentScene;\n }\n /**\n * The current {@apilink Scene} being drawn and updated on screen\n */\n get currentSceneName() {\n return this.director.currentSceneName;\n }\n /**\n * The default {@apilink Scene} of the game, use {@apilink Engine.goToScene} to transition to different scenes.\n */\n get rootScene() {\n return this.director.rootScene;\n }\n /**\n * Contains all the scenes currently registered with Excalibur\n */\n get scenes() {\n return this.director.scenes;\n }\n /**\n * Indicates whether the engine is set to fullscreen or not\n */\n get isFullscreen() {\n return this.screen.isFullScreen;\n }\n /**\n * Indicates the current {@apilink DisplayMode} of the engine.\n */\n get displayMode() {\n return this.screen.displayMode;\n }\n /**\n * Returns the calculated pixel ration for use in rendering\n */\n get pixelRatio() {\n return this.screen.pixelRatio;\n }\n get isDebug() {\n return this._isDebug;\n }\n /**\n * Hints the graphics context to truncate fractional world space coordinates\n */\n get snapToPixel() {\n return this.graphicsContext.snapToPixel;\n }\n set snapToPixel(shouldSnapToPixel) {\n this.graphicsContext.snapToPixel = shouldSnapToPixel;\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n /**\n * Creates a new game using the given {@apilink EngineOptions}. By default, if no options are provided,\n * the game will be rendered full screen (taking up all available browser window space).\n * You can customize the game rendering through {@apilink EngineOptions}.\n *\n * Example:\n *\n * ```js\n * var game = new ex.Engine({\n * width: 0, // the width of the canvas\n * height: 0, // the height of the canvas\n * enableCanvasTransparency: true, // the transparencySection of the canvas\n * canvasElementId: '', // the DOM canvas element ID, if you are providing your own\n * displayMode: ex.DisplayMode.FullScreen, // the display mode\n * pointerScope: ex.PointerScope.Document, // the scope of capturing pointer (mouse/touch) events\n * backgroundColor: ex.Color.fromHex('#2185d0') // background color of the engine\n * });\n *\n * // call game.start, which is a Promise\n * game.start().then(function () {\n * // ready, set, go!\n * });\n * ```\n */\n constructor(options) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j;\n /**\n * Anything run under scope can use `useEngine()` to inject the current engine\n * @param cb\n */\n this.scope = (cb) => Engine.Context.scope(this, cb);\n /**\n * Current Excalibur version string\n *\n * Useful for plugins or other tools that need to know what features are available\n */\n this.version = ___WEBPACK_IMPORTED_MODULE_2__.EX_VERSION;\n /**\n * Listen to and emit events on the Engine\n */\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_3__.EventEmitter();\n /**\n * Optionally set the maximum fps if not set Excalibur will go as fast as the device allows.\n *\n * You may want to constrain max fps if your game cannot maintain fps consistently, it can look and feel better to have a 30fps game than\n * one that bounces between 30fps and 60fps\n */\n this.maxFps = Number.POSITIVE_INFINITY;\n this._inputEnabled = true;\n this._suppressPlayButton = false;\n /**\n * Indicates whether audio should be paused when the game is no longer visible.\n */\n this.pauseAudioWhenHidden = true;\n /**\n * Indicates whether the engine should draw with debug information\n */\n this._isDebug = false;\n /**\n * Sets the Transparency for the engine.\n */\n this.enableCanvasTransparency = true;\n /**\n * The action to take when a fatal exception is thrown\n */\n this.onFatalException = (e) => {\n _Util_Log__WEBPACK_IMPORTED_MODULE_4__.Logger.getInstance().fatal(e, e.stack);\n };\n this._toaster = new _Util_Toaster__WEBPACK_IMPORTED_MODULE_5__.Toaster();\n this._timescale = 1.0;\n this._isInitialized = false;\n this._originalOptions = {};\n this._handleWebGLContextLost = (e) => {\n var _a;\n e.preventDefault();\n this.clock.stop();\n this._logger.fatalOnce('WebGL Graphics Lost', e);\n const container = document.createElement('div');\n container.id = 'ex-webgl-graphics-context-lost';\n container.style.position = 'absolute';\n container.style.zIndex = '99';\n container.style.left = '50%';\n container.style.top = '50%';\n container.style.display = 'flex';\n container.style.flexDirection = 'column';\n container.style.transform = 'translate(-50%, -50%)';\n container.style.backgroundColor = 'white';\n container.style.padding = '10px';\n container.style.borderStyle = 'solid 1px';\n const div = document.createElement('div');\n div.innerHTML = `\r\n

There was an issue rendering, please refresh the page.

\r\n
\r\n

WebGL Graphics Context Lost

\r\n\r\n \r\n\r\n

There are a few reasons this might happen:

\r\n
    \r\n
  • Two or more pages are placing a high demand on the GPU
  • \r\n
  • Another page or operation has stalled the GPU and the browser has decided to reset the GPU
  • \r\n
  • The computer has multiple GPUs and the user has switched between them
  • \r\n
  • Graphics driver has crashed or restarted
  • \r\n
  • Graphics driver was updated
  • \r\n
\r\n
\r\n `;\n container.appendChild(div);\n if ((_a = this.canvas) === null || _a === void 0 ? void 0 : _a.parentElement) {\n this.canvas.parentElement.appendChild(container);\n const button = div.querySelector('#ex-webgl-graphics-reload');\n button === null || button === void 0 ? void 0 : button.addEventListener('click', () => location.reload());\n }\n };\n this._performanceThresholdTriggered = false;\n this._fpsSamples = [];\n this._disposed = false;\n this._isLoading = false;\n this._hideLoader = false;\n this._isReadyFuture = new _Util_Future__WEBPACK_IMPORTED_MODULE_6__.Future();\n /**\n * Returns the current frames elapsed milliseconds\n */\n this.currentFrameElapsedMs = 0;\n /**\n * Returns the current frame lag when in fixed update mode\n */\n this.currentFrameLagMs = 0;\n this._lagMs = 0;\n this._screenShotRequests = [];\n options = { ...Engine._DEFAULT_ENGINE_OPTIONS, ...options };\n this._originalOptions = options;\n _Flags__WEBPACK_IMPORTED_MODULE_7__.Flags.freeze();\n // Initialize browser events facade\n this.browser = new _Util_Browser__WEBPACK_IMPORTED_MODULE_8__.BrowserEvents(window, document);\n // Check compatibility\n const detector = new _Util_Detector__WEBPACK_IMPORTED_MODULE_9__.Detector();\n if (!options.suppressMinimumBrowserFeatureDetection && !(this._compatible = detector.test())) {\n const message = document.createElement('div');\n message.innerText = 'Sorry, your browser does not support all the features needed for Excalibur';\n document.body.appendChild(message);\n detector.failedTests.forEach(function (test) {\n const testMessage = document.createElement('div');\n testMessage.innerText = 'Browser feature missing ' + test;\n document.body.appendChild(testMessage);\n });\n if (options.canvasElementId) {\n const canvas = document.getElementById(options.canvasElementId);\n if (canvas) {\n canvas.parentElement.removeChild(canvas);\n }\n }\n return;\n }\n else {\n this._compatible = true;\n }\n // Use native console API for color fun\n // eslint-disable-next-line no-console\n if (console.log && !options.suppressConsoleBootMessage) {\n // eslint-disable-next-line no-console\n console.log(`%cPowered by Excalibur.js (v${___WEBPACK_IMPORTED_MODULE_2__.EX_VERSION})`, 'background: #176BAA; color: white; border-radius: 5px; padding: 15px; font-size: 1.5em; line-height: 80px;');\n // eslint-disable-next-line no-console\n console.log('\\n\\\r\n /| ________________\\n\\\r\nO|===|* >________________>\\n\\\r\n \\\\|');\n // eslint-disable-next-line no-console\n console.log('Visit', 'http://excaliburjs.com', 'for more information');\n }\n // Suppress play button\n if (options.suppressPlayButton) {\n this._suppressPlayButton = true;\n }\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_4__.Logger.getInstance();\n // If debug is enabled, let's log browser features to the console.\n if (this._logger.defaultLevel === _Util_Log__WEBPACK_IMPORTED_MODULE_4__.LogLevel.Debug) {\n detector.logBrowserFeatures();\n }\n this._logger.debug('Building engine...');\n if (options.garbageCollection === true) {\n this.garbageCollectorConfig = {\n ..._GarbageCollector__WEBPACK_IMPORTED_MODULE_10__.DefaultGarbageCollectionOptions\n };\n }\n else if (options.garbageCollection === false) {\n this._logger.warn('WebGL Garbage Collection Disabled!!! If you leak any images over time your game will crash when GPU memory is exhausted');\n this.garbageCollectorConfig = null;\n }\n else {\n this.garbageCollectorConfig = {\n ..._GarbageCollector__WEBPACK_IMPORTED_MODULE_10__.DefaultGarbageCollectionOptions,\n ...options.garbageCollection\n };\n }\n this._garbageCollector = new _GarbageCollector__WEBPACK_IMPORTED_MODULE_10__.GarbageCollector({ getTimestamp: Date.now });\n this.canvasElementId = options.canvasElementId;\n if (options.canvasElementId) {\n this._logger.debug('Using Canvas element specified: ' + options.canvasElementId);\n //test for existence of element\n if (document.getElementById(options.canvasElementId) === null) {\n throw new Error('Cannot find existing element in the DOM, please ensure element is created prior to engine creation.');\n }\n this.canvas = document.getElementById(options.canvasElementId);\n }\n else if (options.canvasElement) {\n this._logger.debug('Using Canvas element specified:', options.canvasElement);\n this.canvas = options.canvasElement;\n }\n else {\n this._logger.debug('Using generated canvas element');\n this.canvas = document.createElement('canvas');\n }\n if (this.canvas && !options.enableCanvasContextMenu) {\n this.canvas.addEventListener('contextmenu', (evt) => {\n evt.preventDefault();\n });\n }\n let displayMode = (_a = options.displayMode) !== null && _a !== void 0 ? _a : _Screen__WEBPACK_IMPORTED_MODULE_11__.DisplayMode.Fixed;\n if ((options.width && options.height) || options.viewport) {\n if (options.displayMode === undefined) {\n displayMode = _Screen__WEBPACK_IMPORTED_MODULE_11__.DisplayMode.Fixed;\n }\n this._logger.debug('Engine viewport is size ' + options.width + ' x ' + options.height);\n }\n else if (!options.displayMode) {\n this._logger.debug('Engine viewport is fit');\n displayMode = _Screen__WEBPACK_IMPORTED_MODULE_11__.DisplayMode.FitScreen;\n }\n this.grabWindowFocus = options.grabWindowFocus;\n this.pointerScope = options.pointerScope;\n this._originalDisplayMode = displayMode;\n let pixelArtSampler;\n let uvPadding;\n let nativeContextAntialiasing;\n let canvasImageRendering;\n let filtering;\n let multiSampleAntialiasing;\n if (typeof options.antialiasing === 'object') {\n ({ pixelArtSampler, nativeContextAntialiasing, multiSampleAntialiasing, filtering, canvasImageRendering } = {\n ...(options.pixelArt ? _Graphics__WEBPACK_IMPORTED_MODULE_12__.DefaultPixelArtOptions : _Graphics__WEBPACK_IMPORTED_MODULE_12__.DefaultAntialiasOptions),\n ...options.antialiasing\n });\n }\n else {\n pixelArtSampler = !!options.pixelArt;\n nativeContextAntialiasing = false;\n multiSampleAntialiasing = options.antialiasing;\n canvasImageRendering = options.antialiasing ? 'auto' : 'pixelated';\n filtering = options.antialiasing ? _Graphics_Filtering__WEBPACK_IMPORTED_MODULE_13__.ImageFiltering.Blended : _Graphics_Filtering__WEBPACK_IMPORTED_MODULE_13__.ImageFiltering.Pixel;\n }\n if (nativeContextAntialiasing && multiSampleAntialiasing) {\n this._logger.warnOnce(`Cannot use antialias setting nativeContextAntialiasing and multiSampleAntialiasing` +\n ` at the same time, they are incompatible settings. If you aren\\'t sure use multiSampleAntialiasing`);\n }\n if (options.pixelArt) {\n uvPadding = 0.25;\n }\n if (!options.antialiasing || filtering === _Graphics_Filtering__WEBPACK_IMPORTED_MODULE_13__.ImageFiltering.Pixel) {\n uvPadding = 0;\n }\n // Override with any user option, if non default to .25 for pixel art, 0.01 for everything else\n uvPadding = (_c = (_b = options.uvPadding) !== null && _b !== void 0 ? _b : uvPadding) !== null && _c !== void 0 ? _c : 0.01;\n // Canvas 2D fallback can be flagged on\n let useCanvasGraphicsContext = _Flags__WEBPACK_IMPORTED_MODULE_7__.Flags.isEnabled('use-canvas-context');\n if (!useCanvasGraphicsContext) {\n // Attempt webgl first\n try {\n this.graphicsContext = new _Graphics__WEBPACK_IMPORTED_MODULE_14__.ExcaliburGraphicsContextWebGL({\n canvasElement: this.canvas,\n enableTransparency: this.enableCanvasTransparency,\n pixelArtSampler: pixelArtSampler,\n antialiasing: nativeContextAntialiasing,\n multiSampleAntialiasing: multiSampleAntialiasing,\n uvPadding: uvPadding,\n powerPreference: options.powerPreference,\n backgroundColor: options.backgroundColor,\n snapToPixel: options.snapToPixel,\n useDrawSorting: options.useDrawSorting,\n garbageCollector: this.garbageCollectorConfig\n ? {\n garbageCollector: this._garbageCollector,\n collectionInterval: this.garbageCollectorConfig.textureCollectInterval\n }\n : null,\n handleContextLost: (_d = options.handleContextLost) !== null && _d !== void 0 ? _d : this._handleWebGLContextLost,\n handleContextRestored: options.handleContextRestored\n });\n }\n catch (e) {\n this._logger.warn(`Excalibur could not load webgl for some reason (${e.message}) and loaded a Canvas 2D fallback. ` +\n `Some features of Excalibur will not work in this mode. \\n\\n` +\n 'Read more about this issue at https://excaliburjs.com/docs/performance');\n // fallback to canvas in case of failure\n useCanvasGraphicsContext = true;\n }\n }\n if (useCanvasGraphicsContext) {\n this.graphicsContext = new _Graphics__WEBPACK_IMPORTED_MODULE_15__.ExcaliburGraphicsContext2DCanvas({\n canvasElement: this.canvas,\n enableTransparency: this.enableCanvasTransparency,\n antialiasing: nativeContextAntialiasing,\n backgroundColor: options.backgroundColor,\n snapToPixel: options.snapToPixel,\n useDrawSorting: options.useDrawSorting\n });\n }\n this.screen = new _Screen__WEBPACK_IMPORTED_MODULE_11__.Screen({\n canvas: this.canvas,\n context: this.graphicsContext,\n antialiasing: nativeContextAntialiasing,\n canvasImageRendering: canvasImageRendering,\n browser: this.browser,\n viewport: (_e = options.viewport) !== null && _e !== void 0 ? _e : (options.width && options.height ? { width: options.width, height: options.height } : _Screen__WEBPACK_IMPORTED_MODULE_11__.Resolution.SVGA),\n resolution: options.resolution,\n displayMode,\n pixelRatio: options.suppressHiDPIScaling ? 1 : (_f = options.pixelRatio) !== null && _f !== void 0 ? _f : null\n });\n // TODO REMOVE STATIC!!!\n // Set default filtering based on antialiasing\n _Graphics__WEBPACK_IMPORTED_MODULE_16__.TextureLoader.filtering = filtering;\n if (options.backgroundColor) {\n this.backgroundColor = options.backgroundColor.clone();\n }\n this.maxFps = (_g = options.maxFps) !== null && _g !== void 0 ? _g : this.maxFps;\n this.fixedUpdateTimestep = (_h = options.fixedUpdateTimestep) !== null && _h !== void 0 ? _h : this.fixedUpdateTimestep;\n this.fixedUpdateFps = (_j = options.fixedUpdateFps) !== null && _j !== void 0 ? _j : this.fixedUpdateFps;\n this.fixedUpdateTimestep = this.fixedUpdateTimestep || 1000 / this.fixedUpdateFps;\n this.clock = new _Util_Clock__WEBPACK_IMPORTED_MODULE_17__.StandardClock({\n maxFps: this.maxFps,\n tick: this._mainloop.bind(this),\n onFatalException: (e) => this.onFatalException(e)\n });\n this.enableCanvasTransparency = options.enableCanvasTransparency;\n if (typeof options.physics === 'boolean') {\n this.physics = {\n ...(0,_Collision_PhysicsConfig__WEBPACK_IMPORTED_MODULE_18__.getDefaultPhysicsConfig)(),\n enabled: options.physics\n };\n }\n else {\n this.physics = {\n ...(0,_Collision_PhysicsConfig__WEBPACK_IMPORTED_MODULE_18__.getDefaultPhysicsConfig)()\n };\n (0,_Util_Util__WEBPACK_IMPORTED_MODULE_19__.mergeDeep)(this.physics, options.physics);\n }\n this.debug = new _Debug_DebugConfig__WEBPACK_IMPORTED_MODULE_20__.DebugConfig(this);\n this.director = new _Director_Director__WEBPACK_IMPORTED_MODULE_21__.Director(this, options.scenes);\n this._initialize(options);\n window.___EXCALIBUR_DEVTOOL = this;\n Engine.InstanceCount++;\n }\n _monitorPerformanceThresholdAndTriggerFallback() {\n const { allow } = this._originalOptions.configurePerformanceCanvas2DFallback;\n let { threshold, showPlayerMessage } = this._originalOptions.configurePerformanceCanvas2DFallback;\n if (threshold === undefined) {\n threshold = Engine._DEFAULT_ENGINE_OPTIONS.configurePerformanceCanvas2DFallback.threshold;\n }\n if (showPlayerMessage === undefined) {\n showPlayerMessage = Engine._DEFAULT_ENGINE_OPTIONS.configurePerformanceCanvas2DFallback.showPlayerMessage;\n }\n if (!_Flags__WEBPACK_IMPORTED_MODULE_7__.Flags.isEnabled('use-canvas-context') && allow && this.ready && !this._performanceThresholdTriggered) {\n // Calculate Average fps for last X number of frames after start\n if (this._fpsSamples.length === threshold.numberOfFrames) {\n this._fpsSamples.splice(0, 1);\n }\n this._fpsSamples.push(this.clock.fpsSampler.fps);\n let total = 0;\n for (let i = 0; i < this._fpsSamples.length; i++) {\n total += this._fpsSamples[i];\n }\n const average = total / this._fpsSamples.length;\n if (this._fpsSamples.length === threshold.numberOfFrames) {\n if (average <= threshold.fps) {\n this._performanceThresholdTriggered = true;\n this._logger.warn(`Switching to browser 2D Canvas fallback due to performance. Some features of Excalibur will not work in this mode.\\n` +\n \"this might mean your browser doesn't have webgl enabled or hardware acceleration is unavailable.\\n\\n\" +\n 'If in Chrome:\\n' +\n ' * Visit Settings > Advanced > System, and ensure \"Use Hardware Acceleration\" is checked.\\n' +\n ' * Visit chrome://flags/#ignore-gpu-blocklist and ensure \"Override software rendering list\" is \"enabled\"\\n' +\n 'If in Firefox, visit about:config\\n' +\n ' * Ensure webgl.disabled = false\\n' +\n ' * Ensure webgl.force-enabled = true\\n' +\n ' * Ensure layers.acceleration.force-enabled = true\\n\\n' +\n 'Read more about this issue at https://excaliburjs.com/docs/performance');\n if (showPlayerMessage) {\n this._toaster.toast('Excalibur is encountering performance issues. ' +\n \"It's possible that your browser doesn't have hardware acceleration enabled. \" +\n 'Visit [LINK] for more information and potential solutions.', 'https://excaliburjs.com/docs/performance');\n }\n this.useCanvas2DFallback();\n this.emit('fallbackgraphicscontext', this.graphicsContext);\n }\n }\n }\n }\n /**\n * Switches the engine's graphics context to the 2D Canvas.\n * @warning Some features of Excalibur will not work in this mode.\n */\n useCanvas2DFallback() {\n var _a, _b, _c;\n // Swap out the canvas\n const newCanvas = this.canvas.cloneNode(false);\n this.canvas.parentNode.replaceChild(newCanvas, this.canvas);\n this.canvas = newCanvas;\n const options = { ...this._originalOptions, antialiasing: this.screen.antialiasing };\n const displayMode = this._originalDisplayMode;\n // New graphics context\n this.graphicsContext = new _Graphics__WEBPACK_IMPORTED_MODULE_15__.ExcaliburGraphicsContext2DCanvas({\n canvasElement: this.canvas,\n enableTransparency: this.enableCanvasTransparency,\n antialiasing: options.antialiasing,\n backgroundColor: options.backgroundColor,\n snapToPixel: options.snapToPixel,\n useDrawSorting: options.useDrawSorting\n });\n // Reset screen\n if (this.screen) {\n this.screen.dispose();\n }\n this.screen = new _Screen__WEBPACK_IMPORTED_MODULE_11__.Screen({\n canvas: this.canvas,\n context: this.graphicsContext,\n antialiasing: (_a = options.antialiasing) !== null && _a !== void 0 ? _a : true,\n browser: this.browser,\n viewport: (_b = options.viewport) !== null && _b !== void 0 ? _b : (options.width && options.height ? { width: options.width, height: options.height } : _Screen__WEBPACK_IMPORTED_MODULE_11__.Resolution.SVGA),\n resolution: options.resolution,\n displayMode,\n pixelRatio: options.suppressHiDPIScaling ? 1 : (_c = options.pixelRatio) !== null && _c !== void 0 ? _c : null\n });\n this.screen.setCurrentCamera(this.currentScene.camera);\n // Reset pointers\n this.input.pointers.detach();\n const pointerTarget = options && options.pointerScope === _Input_PointerScope__WEBPACK_IMPORTED_MODULE_22__.PointerScope.Document ? document : this.canvas;\n this.input.pointers = this.input.pointers.recreate(pointerTarget, this);\n this.input.pointers.init();\n }\n /**\n * Attempts to completely clean up excalibur resources, including removing the canvas from the dom.\n *\n * To start again you will need to new up an Engine.\n */\n dispose() {\n if (!this._disposed) {\n this._disposed = true;\n this.stop();\n this._garbageCollector.forceCollectAll();\n this.input.toggleEnabled(false);\n this.canvas.parentNode.removeChild(this.canvas);\n this.canvas = null;\n this.screen.dispose();\n this.graphicsContext.dispose();\n this.graphicsContext = null;\n Engine.InstanceCount--;\n }\n }\n isDisposed() {\n return this._disposed;\n }\n /**\n * Returns a BoundingBox of the top left corner of the screen\n * and the bottom right corner of the screen.\n */\n getWorldBounds() {\n return this.screen.getWorldBounds();\n }\n /**\n * Gets the current engine timescale factor (default is 1.0 which is 1:1 time)\n */\n get timescale() {\n return this._timescale;\n }\n /**\n * Sets the current engine timescale factor. Useful for creating slow-motion effects or fast-forward effects\n * when using time-based movement.\n */\n set timescale(value) {\n if (value < 0) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_4__.Logger.getInstance().warnOnce('engine.timescale to a value less than 0 are ignored');\n return;\n }\n this._timescale = value;\n }\n /**\n * Adds a {@apilink Timer} to the {@apilink currentScene}.\n * @param timer The timer to add to the {@apilink currentScene}.\n */\n addTimer(timer) {\n return this.currentScene.addTimer(timer);\n }\n /**\n * Removes a {@apilink Timer} from the {@apilink currentScene}.\n * @param timer The timer to remove to the {@apilink currentScene}.\n */\n removeTimer(timer) {\n return this.currentScene.removeTimer(timer);\n }\n /**\n * Adds a {@apilink Scene} to the engine, think of scenes in Excalibur as you\n * would levels or menus.\n * @param key The name of the scene, must be unique\n * @param scene The scene to add to the engine\n */\n addScene(key, scene) {\n this.director.add(key, scene);\n return this;\n }\n /**\n * @internal\n */\n removeScene(entity) {\n this.director.remove(entity);\n }\n add(entity) {\n if (arguments.length === 2) {\n this.director.add(arguments[0], arguments[1]);\n return;\n }\n const maybeDeferred = this.director.getDeferredScene();\n if (maybeDeferred instanceof _Scene__WEBPACK_IMPORTED_MODULE_23__.Scene) {\n maybeDeferred.add(entity);\n }\n else {\n this.currentScene.add(entity);\n }\n }\n remove(entity) {\n if (entity instanceof _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_24__.Entity) {\n this.currentScene.remove(entity);\n }\n if (entity instanceof _Scene__WEBPACK_IMPORTED_MODULE_23__.Scene || (0,_Scene__WEBPACK_IMPORTED_MODULE_23__.isSceneConstructor)(entity)) {\n this.removeScene(entity);\n }\n if (typeof entity === 'string') {\n this.removeScene(entity);\n }\n }\n /**\n * Changes the current scene with optionally supplied:\n * * Activation data\n * * Transitions\n * * Loaders\n *\n * Example:\n * ```typescript\n * game.goToScene('myScene', {\n * sceneActivationData: {any: 'thing at all'},\n * destinationIn: new FadeInOut({duration: 1000, direction: 'in'}),\n * sourceOut: new FadeInOut({duration: 1000, direction: 'out'}),\n * loader: MyLoader\n * });\n * ```\n *\n * Scenes are defined in the Engine constructor\n * ```typescript\n * const engine = new ex.Engine({\n scenes: {...}\n });\n * ```\n * Or by adding dynamically\n *\n * ```typescript\n * engine.addScene('myScene', new ex.Scene());\n * ```\n * @param destinationScene\n * @param options\n */\n async goToScene(destinationScene, options) {\n await this.scope(async () => {\n await this.director.goToScene(destinationScene, options);\n });\n }\n /**\n * Transforms the current x, y from screen coordinates to world coordinates\n * @param point Screen coordinate to convert\n */\n screenToWorldCoordinates(point) {\n return this.screen.screenToWorldCoordinates(point);\n }\n /**\n * Transforms a world coordinate, to a screen coordinate\n * @param point World coordinate to convert\n */\n worldToScreenCoordinates(point) {\n return this.screen.worldToScreenCoordinates(point);\n }\n /**\n * Initializes the internal canvas, rendering context, display mode, and native event listeners\n */\n _initialize(options) {\n var _a, _b;\n this.pageScrollPreventionMode = options.scrollPreventionMode;\n // initialize inputs\n const pointerTarget = options && options.pointerScope === _Input_PointerScope__WEBPACK_IMPORTED_MODULE_22__.PointerScope.Document ? document : this.canvas;\n const grabWindowFocus = (_b = (_a = this._originalOptions) === null || _a === void 0 ? void 0 : _a.grabWindowFocus) !== null && _b !== void 0 ? _b : true;\n this.input = new _Input_InputHost__WEBPACK_IMPORTED_MODULE_25__.InputHost({\n pointerTarget,\n grabWindowFocus,\n engine: this\n });\n this.inputMapper = this.input.inputMapper;\n // Issue #385 make use of the visibility api\n // https://developer.mozilla.org/en-US/docs/Web/Guide/User_experience/Using_the_Page_Visibility_API\n this.browser.document.on('visibilitychange', () => {\n if (document.visibilityState === 'hidden') {\n this.events.emit('hidden', new _Events__WEBPACK_IMPORTED_MODULE_26__.HiddenEvent(this));\n this._logger.debug('Window hidden');\n }\n else if (document.visibilityState === 'visible') {\n this.events.emit('visible', new _Events__WEBPACK_IMPORTED_MODULE_26__.VisibleEvent(this));\n this._logger.debug('Window visible');\n }\n });\n if (!this.canvasElementId && !options.canvasElement) {\n document.body.appendChild(this.canvas);\n }\n }\n toggleInputEnabled(enabled) {\n this._inputEnabled = enabled;\n this.input.toggleEnabled(this._inputEnabled);\n }\n onInitialize(engine) {\n // Override me\n }\n /**\n * Gets whether the actor is Initialized\n */\n get isInitialized() {\n return this._isInitialized;\n }\n async _overrideInitialize(engine) {\n if (!this.isInitialized) {\n await this.director.onInitialize();\n await this.onInitialize(engine);\n this.events.emit('initialize', new _Events__WEBPACK_IMPORTED_MODULE_26__.InitializeEvent(engine, this));\n this._isInitialized = true;\n }\n }\n /**\n * Updates the entire state of the game\n * @param elapsed Number of milliseconds elapsed since the last update.\n */\n _update(elapsed) {\n var _a;\n if (this._isLoading) {\n // suspend updates until loading is finished\n (_a = this._loader) === null || _a === void 0 ? void 0 : _a.onUpdate(this, elapsed);\n // Update input listeners\n this.input.update();\n return;\n }\n // Publish preupdate events\n this.clock.__runScheduledCbs('preupdate');\n this._preupdate(elapsed);\n // process engine level events\n this.currentScene.update(this, elapsed);\n // Update graphics postprocessors\n this.graphicsContext.updatePostProcessors(elapsed);\n // Publish update event\n this.clock.__runScheduledCbs('postupdate');\n this._postupdate(elapsed);\n // Update input listeners\n this.input.update();\n }\n /**\n * @internal\n */\n _preupdate(elapsed) {\n this.emit('preupdate', new _Events__WEBPACK_IMPORTED_MODULE_26__.PreUpdateEvent(this, elapsed, this));\n this.onPreUpdate(this, elapsed);\n }\n /**\n * Safe to override method\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n */\n onPreUpdate(engine, elapsed) {\n // Override me\n }\n /**\n * @internal\n */\n _postupdate(elapsed) {\n this.emit('postupdate', new _Events__WEBPACK_IMPORTED_MODULE_26__.PostUpdateEvent(this, elapsed, this));\n this.onPostUpdate(this, elapsed);\n }\n /**\n * Safe to override method\n * @param engine The reference to the current game engine\n * @param elapsed The time elapsed since the last update in milliseconds\n */\n onPostUpdate(engine, elapsed) {\n // Override me\n }\n /**\n * Draws the entire game\n * @param elapsed Number of milliseconds elapsed since the last draw.\n */\n _draw(elapsed) {\n var _a, _b;\n // Use scene background color if present, fallback to engine\n this.graphicsContext.backgroundColor = (_a = this.currentScene.backgroundColor) !== null && _a !== void 0 ? _a : this.backgroundColor;\n this.graphicsContext.beginDrawLifecycle();\n this.graphicsContext.clear();\n this.clock.__runScheduledCbs('predraw');\n this._predraw(this.graphicsContext, elapsed);\n // Drawing nothing else while loading\n if (this._isLoading) {\n if (!this._hideLoader) {\n (_b = this._loader) === null || _b === void 0 ? void 0 : _b.canvas.draw(this.graphicsContext, 0, 0);\n this.clock.__runScheduledCbs('postdraw');\n this.graphicsContext.flush();\n this.graphicsContext.endDrawLifecycle();\n }\n return;\n }\n this.currentScene.draw(this.graphicsContext, elapsed);\n this.clock.__runScheduledCbs('postdraw');\n this._postdraw(this.graphicsContext, elapsed);\n // Flush any pending drawings\n this.graphicsContext.flush();\n this.graphicsContext.endDrawLifecycle();\n this._checkForScreenShots();\n }\n /**\n * @internal\n */\n _predraw(ctx, elapsed) {\n this.emit('predraw', new _Events__WEBPACK_IMPORTED_MODULE_26__.PreDrawEvent(ctx, elapsed, this));\n this.onPreDraw(ctx, elapsed);\n }\n /**\n * Safe to override method to hook into pre draw\n * @param ctx {@link ExcaliburGraphicsContext} for drawing\n * @param elapsed Number of milliseconds elapsed since the last draw.\n */\n onPreDraw(ctx, elapsed) {\n // Override me\n }\n /**\n * @internal\n */\n _postdraw(ctx, elapsed) {\n this.emit('postdraw', new _Events__WEBPACK_IMPORTED_MODULE_26__.PostDrawEvent(ctx, elapsed, this));\n this.onPostDraw(ctx, elapsed);\n }\n /**\n * Safe to override method to hook into pre draw\n * @param ctx {@link ExcaliburGraphicsContext} for drawing\n * @param elapsed Number of milliseconds elapsed since the last draw.\n */\n onPostDraw(ctx, elapsed) {\n // Override me\n }\n /**\n * Enable or disable Excalibur debugging functionality.\n * @param toggle a value that debug drawing will be changed to\n */\n showDebug(toggle) {\n this._isDebug = toggle;\n }\n /**\n * Toggle Excalibur debugging functionality.\n */\n toggleDebug() {\n this._isDebug = !this._isDebug;\n return this._isDebug;\n }\n /**\n * Returns true when loading is totally complete and the player has clicked start\n */\n get loadingComplete() {\n return !this._isLoading;\n }\n get ready() {\n return this._isReadyFuture.isCompleted;\n }\n isReady() {\n return this._isReadyFuture.promise;\n }\n async start(sceneNameOrLoader, options) {\n await this.scope(async () => {\n if (!this._compatible) {\n throw new Error('Excalibur is incompatible with your browser');\n }\n this._isLoading = true;\n let loader;\n if (sceneNameOrLoader instanceof _Director_DefaultLoader__WEBPACK_IMPORTED_MODULE_27__.DefaultLoader) {\n loader = sceneNameOrLoader;\n }\n else if (typeof sceneNameOrLoader === 'string') {\n this.director.configureStart(sceneNameOrLoader, options);\n loader = this.director.mainLoader;\n }\n // Start the excalibur clock which drives the mainloop\n this._logger.debug('Starting game clock...');\n this.browser.resume();\n this.clock.start();\n if (this.garbageCollectorConfig) {\n this._garbageCollector.start();\n }\n this._logger.debug('Game clock started');\n await this.load(loader !== null && loader !== void 0 ? loader : new _Director_Loader__WEBPACK_IMPORTED_MODULE_28__.Loader());\n // Initialize before ready\n await this._overrideInitialize(this);\n this._isReadyFuture.resolve();\n this.emit('start', new _Events__WEBPACK_IMPORTED_MODULE_26__.GameStartEvent(this));\n return this._isReadyFuture.promise;\n });\n }\n _mainloop(elapsed) {\n this.scope(() => {\n this.emit('preframe', new _Events__WEBPACK_IMPORTED_MODULE_26__.PreFrameEvent(this, this.stats.prevFrame));\n const elapsedMs = elapsed * this.timescale;\n this.currentFrameElapsedMs = elapsedMs;\n // reset frame stats (reuse existing instances)\n const frameId = this.stats.prevFrame.id + 1;\n this.stats.currFrame.reset();\n this.stats.currFrame.id = frameId;\n this.stats.currFrame.elapsedMs = elapsedMs;\n this.stats.currFrame.fps = this.clock.fpsSampler.fps;\n _Graphics_GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_29__.GraphicsDiagnostics.clear();\n const beforeUpdate = this.clock.now();\n const fixedTimestepMs = this.fixedUpdateTimestep;\n if (this.fixedUpdateTimestep) {\n this._lagMs += elapsedMs;\n while (this._lagMs >= fixedTimestepMs) {\n this._update(fixedTimestepMs);\n this._lagMs -= fixedTimestepMs;\n }\n }\n else {\n this._update(elapsedMs);\n }\n const afterUpdate = this.clock.now();\n this.currentFrameLagMs = this._lagMs;\n this._draw(elapsedMs);\n const afterDraw = this.clock.now();\n this.stats.currFrame.duration.update = afterUpdate - beforeUpdate;\n this.stats.currFrame.duration.draw = afterDraw - afterUpdate;\n this.stats.currFrame.graphics.drawnImages = _Graphics_GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_29__.GraphicsDiagnostics.DrawnImagesCount;\n this.stats.currFrame.graphics.drawCalls = _Graphics_GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_29__.GraphicsDiagnostics.DrawCallCount;\n this.emit('postframe', new _Events__WEBPACK_IMPORTED_MODULE_26__.PostFrameEvent(this, this.stats.currFrame));\n this.stats.prevFrame.reset(this.stats.currFrame);\n this._monitorPerformanceThresholdAndTriggerFallback();\n });\n }\n /**\n * Stops Excalibur's main loop, useful for pausing the game.\n */\n stop() {\n if (this.clock.isRunning()) {\n this.emit('stop', new _Events__WEBPACK_IMPORTED_MODULE_26__.GameStopEvent(this));\n this.browser.pause();\n this.clock.stop();\n this._garbageCollector.stop();\n this._logger.debug('Game stopped');\n }\n }\n /**\n * Returns the Engine's running status, Useful for checking whether engine is running or paused.\n */\n isRunning() {\n return this.clock.isRunning();\n }\n /**\n * Takes a screen shot of the current viewport and returns it as an\n * HTML Image Element.\n * @param preserveHiDPIResolution in the case of HiDPI return the full scaled backing image, by default false\n */\n screenshot(preserveHiDPIResolution = false) {\n const screenShotPromise = new Promise((resolve) => {\n this._screenShotRequests.push({ preserveHiDPIResolution, resolve });\n });\n return screenShotPromise;\n }\n _checkForScreenShots() {\n // We must grab the draw buffer before we yield to the browser\n // the draw buffer is cleared after compositing\n // the reason for the asynchrony is setting `preserveDrawingBuffer: true`\n // forces the browser to copy buffers which can have a mass perf impact on mobile\n for (const request of this._screenShotRequests) {\n const finalWidth = request.preserveHiDPIResolution ? this.canvas.width : this.screen.resolution.width;\n const finalHeight = request.preserveHiDPIResolution ? this.canvas.height : this.screen.resolution.height;\n const screenshot = document.createElement('canvas');\n screenshot.width = finalWidth;\n screenshot.height = finalHeight;\n const ctx = screenshot.getContext('2d');\n ctx.imageSmoothingEnabled = this.screen.antialiasing;\n ctx.drawImage(this.canvas, 0, 0, finalWidth, finalHeight);\n const result = new Image();\n const raw = screenshot.toDataURL('image/png');\n result.onload = () => {\n request.resolve(result);\n };\n result.src = raw;\n }\n // Reset state\n this._screenShotRequests.length = 0;\n }\n /**\n * Another option available to you to load resources into the game.\n * Immediately after calling this the game will pause and the loading screen\n * will appear.\n * @param loader Some {@apilink Loadable} such as a {@apilink Loader} collection, {@apilink Sound}, or {@apilink Texture}.\n */\n async load(loader, hideLoader = false) {\n await this.scope(async () => {\n try {\n // early exit if loaded\n if (loader.isLoaded()) {\n return;\n }\n this._loader = loader;\n this._isLoading = true;\n this._hideLoader = hideLoader;\n if (loader instanceof _Director_Loader__WEBPACK_IMPORTED_MODULE_28__.Loader) {\n loader.suppressPlayButton = loader.suppressPlayButton || this._suppressPlayButton;\n }\n this._loader.onInitialize(this);\n await loader.load();\n }\n catch (e) {\n this._logger.error('Error loading resources, things may not behave properly', e);\n await Promise.resolve();\n }\n finally {\n this._isLoading = false;\n this._hideLoader = false;\n this._loader = null;\n }\n });\n }\n}\nEngine.Context = (0,_Context__WEBPACK_IMPORTED_MODULE_1__.createContext)();\nEngine.InstanceCount = 0;\n/**\n * Default {@apilink EngineOptions}\n */\nEngine._DEFAULT_ENGINE_OPTIONS = {\n width: 0,\n height: 0,\n enableCanvasTransparency: true,\n useDrawSorting: true,\n configurePerformanceCanvas2DFallback: {\n allow: false,\n showPlayerMessage: false,\n threshold: { fps: 20, numberOfFrames: 100 }\n },\n canvasElementId: '',\n canvasElement: undefined,\n enableCanvasContextMenu: false,\n snapToPixel: false,\n antialiasing: true,\n pixelArt: false,\n garbageCollection: true,\n powerPreference: 'high-performance',\n pointerScope: _Input_PointerScope__WEBPACK_IMPORTED_MODULE_22__.PointerScope.Canvas,\n suppressConsoleBootMessage: null,\n suppressMinimumBrowserFeatureDetection: null,\n suppressHiDPIScaling: null,\n suppressPlayButton: null,\n grabWindowFocus: true,\n scrollPreventionMode: ScrollPreventionMode.Canvas,\n backgroundColor: _Color__WEBPACK_IMPORTED_MODULE_30__.Color.fromHex('#2185d0') // Excalibur blue\n};\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/Component.ts\":\n/*!********************************************!*\\\n !*** ./EntityComponentSystem/Component.ts ***!\n \\********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Component: () => (/* binding */ Component),\n/* harmony export */ isComponentCtor: () => (/* binding */ isComponentCtor)\n/* harmony export */ });\n/**\n *\n */\nfunction isComponentCtor(value) {\n return !!value && !!value.prototype && !!value.prototype.constructor;\n}\n/**\n * Type guard to check if a component implements clone\n * @param x\n */\nfunction hasClone(x) {\n return !!(x === null || x === void 0 ? void 0 : x.clone);\n}\n/**\n * Components are containers for state in Excalibur, the are meant to convey capabilities that an Entity possesses\n *\n * Implementations of Component must have a zero-arg constructor to support dependencies\n *\n * ```typescript\n * class MyComponent extends ex.Component {\n * // zero arg support required if you want to use component dependencies\n * constructor(public optionalPos?: ex.Vector) {}\n * }\n * ```\n */\nclass Component {\n constructor() {\n // TODO maybe generate a unique id?\n /**\n * Current owning {@apilink Entity}, if any, of this component. Null if not added to any {@apilink Entity}\n */\n this.owner = undefined;\n }\n /**\n * Clones any properties on this component, if that property value has a `clone()` method it will be called\n */\n clone() {\n const newComponent = new this.constructor();\n for (const prop in this) {\n if (this.hasOwnProperty(prop)) {\n const val = this[prop];\n if (hasClone(val) && prop !== 'owner' && prop !== 'clone') {\n newComponent[prop] = val.clone();\n }\n else {\n newComponent[prop] = val;\n }\n }\n }\n return newComponent;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/Components/MotionComponent.ts\":\n/*!*************************************************************!*\\\n !*** ./EntityComponentSystem/Components/MotionComponent.ts ***!\n \\*************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MotionComponent: () => (/* binding */ MotionComponent)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Component */ \"./EntityComponentSystem/Component.ts\");\n\n\nclass MotionComponent extends _Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor() {\n super(...arguments);\n /**\n * The velocity of an entity in pixels per second\n */\n this.vel = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n /**\n * The acceleration of entity in pixels per second^2\n */\n this.acc = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n /**\n * The scale rate of change in scale units per second\n */\n this.scaleFactor = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n /**\n * The angular velocity which is how quickly the entity is rotating in radians per second\n */\n this.angularVelocity = 0;\n /**\n * The amount of torque applied to the entity, angular acceleration is torque * inertia\n */\n this.torque = 0;\n /**\n * Inertia can be thought of as the resistance to motion\n */\n this.inertia = 1;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/Components/TransformComponent.ts\":\n/*!****************************************************************!*\\\n !*** ./EntityComponentSystem/Components/TransformComponent.ts ***!\n \\****************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TransformComponent: () => (/* binding */ TransformComponent)\n/* harmony export */ });\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Math/coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _Math_transform__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math/transform */ \"./Math/transform.ts\");\n/* harmony import */ var _Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Component */ \"./EntityComponentSystem/Component.ts\");\n/* harmony import */ var _Util_Observable__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Util/Observable */ \"./Util/Observable.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n\n\n\n\n\nclass TransformComponent extends _Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor() {\n super(...arguments);\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this._parentComponent = null;\n this._transform = new _Math_transform__WEBPACK_IMPORTED_MODULE_2__.Transform();\n this._addChildTransform = (child) => {\n const childTxComponent = child.get(TransformComponent);\n if (childTxComponent) {\n childTxComponent._transform.parent = this._transform;\n childTxComponent._parentComponent = this;\n }\n };\n /**\n * Observable that emits when the z index changes on this component\n */\n this.zIndexChanged$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_3__.Observable();\n this._coordPlane = _Math_coord_plane__WEBPACK_IMPORTED_MODULE_4__.CoordPlane.World;\n }\n get() {\n return this._transform;\n }\n onAdd(owner) {\n for (const child of owner.children) {\n this._addChildTransform(child);\n }\n owner.childrenAdded$.subscribe((child) => this._addChildTransform(child));\n owner.childrenRemoved$.subscribe((child) => {\n const childTxComponent = child.get(TransformComponent);\n if (childTxComponent) {\n childTxComponent._transform.parent = null;\n childTxComponent._parentComponent = null;\n }\n });\n }\n onRemove(_previousOwner) {\n this._transform.parent = null;\n this._parentComponent = null;\n }\n /**\n * The z-index ordering of the entity, a higher values are drawn on top of lower values.\n * For example z=99 would be drawn on top of z=0.\n */\n get z() {\n return this._transform.z;\n }\n set z(val) {\n const oldz = this._transform.z;\n this._transform.z = val;\n if (oldz !== val) {\n this.zIndexChanged$.notifyAll(val);\n }\n }\n get globalZ() {\n return this._transform.globalZ;\n }\n set globalZ(z) {\n this._transform.globalZ = z;\n }\n /**\n * The {@apilink CoordPlane | `coordinate plane`} for this transform for the entity.\n */\n get coordPlane() {\n if (this._parentComponent) {\n return this._parentComponent.coordPlane;\n }\n return this._coordPlane;\n }\n set coordPlane(value) {\n var _a;\n if (!this._parentComponent) {\n this._coordPlane = value;\n }\n else {\n this._logger.warn(`Cannot set coordinate plane on child entity ${(_a = this.owner) === null || _a === void 0 ? void 0 : _a.name}, children inherit their coordinate plane from their parents.`);\n }\n }\n get pos() {\n return this._transform.pos;\n }\n set pos(v) {\n this._transform.pos = v;\n }\n get globalPos() {\n return this._transform.globalPos;\n }\n set globalPos(v) {\n this._transform.globalPos = v;\n }\n get rotation() {\n return this._transform.rotation;\n }\n set rotation(rotation) {\n this._transform.rotation = rotation;\n }\n get globalRotation() {\n return this._transform.globalRotation;\n }\n set globalRotation(rotation) {\n this._transform.globalRotation = rotation;\n }\n get scale() {\n return this._transform.scale;\n }\n set scale(v) {\n this._transform.scale = v;\n }\n get globalScale() {\n return this._transform.globalScale;\n }\n set globalScale(v) {\n this._transform.globalScale = v;\n }\n applyInverse(v) {\n return this._transform.applyInverse(v);\n }\n apply(v) {\n return this._transform.apply(v);\n }\n clone() {\n const component = new TransformComponent();\n component._transform = this._transform.clone();\n return component;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/Entity.ts\":\n/*!*****************************************!*\\\n !*** ./EntityComponentSystem/Entity.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AddedComponent: () => (/* binding */ AddedComponent),\n/* harmony export */ Entity: () => (/* binding */ Entity),\n/* harmony export */ EntityEvents: () => (/* binding */ EntityEvents),\n/* harmony export */ RemovedComponent: () => (/* binding */ RemovedComponent),\n/* harmony export */ isAddedComponent: () => (/* binding */ isAddedComponent),\n/* harmony export */ isRemovedComponent: () => (/* binding */ isRemovedComponent)\n/* harmony export */ });\n/* harmony import */ var _Component__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Component */ \"./EntityComponentSystem/Component.ts\");\n/* harmony import */ var _Util_Observable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Observable */ \"./Util/Observable.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Util/Util */ \"./Util/Util.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n\n\n\n\n\n\n\n/**\n * AddedComponent message\n */\nclass AddedComponent {\n constructor(data) {\n this.data = data;\n this.type = 'Component Added';\n }\n}\n/**\n * Type guard to know if message is f an Added Component\n */\nfunction isAddedComponent(x) {\n return !!x && x.type === 'Component Added';\n}\n/**\n * RemovedComponent message\n */\nclass RemovedComponent {\n constructor(data) {\n this.data = data;\n this.type = 'Component Removed';\n }\n}\n/**\n * Type guard to know if message is for a Removed Component\n */\nfunction isRemovedComponent(x) {\n return !!x && x.type === 'Component Removed';\n}\nconst EntityEvents = {\n Add: 'add',\n Remove: 'remove',\n Initialize: 'initialize',\n PreUpdate: 'preupdate',\n PostUpdate: 'postupdate',\n Kill: 'kill'\n};\n/**\n * An Entity is the base type of anything that can have behavior in Excalibur, they are part of the built in entity component system\n *\n * Entities can be strongly typed with the components they contain\n *\n * ```typescript\n * const entity = new Entity();\n * entity.components.a; // Type ComponentA\n * entity.components.b; // Type ComponentB\n * ```\n */\nclass Entity {\n constructor(componentsOrOptions, name) {\n /**\n * The unique identifier for the entity\n */\n this.id = Entity._ID++;\n this.name = `Entity#${this.id}`;\n /**\n * Listen to or emit events for an entity\n */\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n this._tags = new Set();\n this.componentAdded$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_1__.Observable();\n this.componentRemoved$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_1__.Observable();\n this.tagAdded$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_1__.Observable();\n this.tagRemoved$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_1__.Observable();\n /**\n * Current components on the entity\n *\n * **Do not modify**\n *\n * Use addComponent/removeComponent otherwise the ECS will not be notified of changes.\n */\n this.components = new Map();\n this.componentValues = [];\n this._componentsToRemove = [];\n /**\n * The current scene that the entity is in, if any\n */\n this.scene = null;\n /**\n * Whether this entity is active, if set to false it will be reclaimed\n */\n this.isActive = true;\n this._parent = null;\n this.childrenAdded$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_1__.Observable();\n this.childrenRemoved$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_1__.Observable();\n this._children = [];\n this._isInitialized = false;\n this._isAdded = false;\n let componentsToAdd;\n let nameToAdd;\n let silence = false;\n if (Array.isArray(componentsOrOptions)) {\n componentsToAdd = componentsOrOptions;\n nameToAdd = name;\n }\n else if (componentsOrOptions && typeof componentsOrOptions === 'object') {\n const { components, name, silenceWarnings } = componentsOrOptions;\n componentsToAdd = components !== null && components !== void 0 ? components : [];\n nameToAdd = name;\n silence = !!silenceWarnings;\n }\n if (nameToAdd) {\n this.name = nameToAdd;\n }\n if (componentsToAdd) {\n for (const component of componentsToAdd) {\n this.addComponent(component);\n }\n }\n if (true) {\n if (!silence) {\n setTimeout(() => {\n if (!this.scene && !this.isInitialized) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_2__.Logger.getInstance().warn(`Entity \"${this.name || this.id}\" was not added to a scene.`);\n }\n }, 5000);\n }\n }\n }\n /**\n * Whether this entity is active, if set to false it will be reclaimed\n * @deprecated use isActive\n */\n get active() {\n return this.isActive;\n }\n /**\n * Whether this entity is active, if set to false it will be reclaimed\n * @deprecated use isActive\n */\n set active(val) {\n this.isActive = val;\n }\n /**\n * Kill the entity, means it will no longer be updated. Kills are deferred to the end of the update.\n * If parented it will be removed from the parent when killed.\n */\n kill() {\n if (this.isActive) {\n this.isActive = false;\n this.unparent();\n }\n this.emit('kill', new _Events__WEBPACK_IMPORTED_MODULE_3__.KillEvent(this));\n }\n isKilled() {\n return !this.isActive;\n }\n /**\n * Specifically get the tags on the entity from {@apilink TagsComponent}\n */\n get tags() {\n return this._tags;\n }\n /**\n * Check if a tag exists on the entity\n * @param tag name to check for\n */\n hasTag(tag) {\n return this._tags.has(tag);\n }\n /**\n * Adds a tag to an entity\n * @param tag\n */\n addTag(tag) {\n this._tags.add(tag);\n this.tagAdded$.notifyAll(tag);\n return this;\n }\n /**\n * Removes a tag on the entity\n *\n * Removals are deferred until the end of update\n * @param tag\n */\n removeTag(tag) {\n this._tags.delete(tag);\n this.tagRemoved$.notifyAll(tag);\n return this;\n }\n /**\n * The types of the components on the Entity\n */\n get types() {\n return Array.from(this.components.keys());\n }\n /**\n * Returns all component instances on entity\n */\n getComponents() {\n return Array.from(this.components.values());\n }\n /**\n * Verifies that an entity has all the required types\n * @param requiredTypes\n */\n hasAll(requiredTypes) {\n for (let i = 0; i < requiredTypes.length; i++) {\n if (!this.components.has(requiredTypes[i])) {\n return false;\n }\n }\n return true;\n }\n /**\n * Verifies that an entity has all the required tags\n * @param requiredTags\n */\n hasAllTags(requiredTags) {\n for (let i = 0; i < requiredTags.length; i++) {\n if (!this.tags.has(requiredTags[i])) {\n return false;\n }\n }\n return true;\n }\n get(type) {\n return this.components.get(type);\n }\n get parent() {\n return this._parent;\n }\n /**\n * Get the direct children of this entity\n */\n get children() {\n return this._children;\n }\n /**\n * Unparents this entity, if there is a parent. Otherwise it does nothing.\n */\n unparent() {\n if (this._parent) {\n this._parent.removeChild(this);\n this._parent = null;\n }\n }\n /**\n * Adds an entity to be a child of this entity\n * @param entity\n */\n addChild(entity) {\n if (entity.parent === null) {\n if (this.getAncestors().includes(entity)) {\n throw new Error('Cycle detected, cannot add entity');\n }\n this._children.push(entity);\n entity._parent = this;\n this.childrenAdded$.notifyAll(entity);\n }\n else {\n throw new Error('Entity already has a parent, cannot add without unparenting');\n }\n return this;\n }\n /**\n * Remove an entity from children if it exists\n * @param entity\n */\n removeChild(entity) {\n if (entity.parent === this) {\n (0,_Util_Util__WEBPACK_IMPORTED_MODULE_4__.removeItemFromArray)(entity, this._children);\n entity._parent = null;\n this.childrenRemoved$.notifyAll(entity);\n }\n return this;\n }\n /**\n * Removes all children from this entity\n */\n removeAllChildren() {\n // Avoid modifying the array issue by walking backwards\n for (let i = this.children.length - 1; i >= 0; i--) {\n this.removeChild(this.children[i]);\n }\n return this;\n }\n /**\n * Returns a list of parent entities starting with the topmost parent. Includes the current entity.\n */\n getAncestors() {\n const result = [this];\n let current = this.parent;\n while (current) {\n result.push(current);\n current = current.parent;\n }\n return result.reverse();\n }\n /**\n * Returns a list of all the entities that descend from this entity. Includes the current entity.\n */\n getDescendants() {\n let result = [this];\n let queue = [this];\n while (queue.length > 0) {\n const curr = queue.pop();\n if (curr) {\n queue = queue.concat(curr.children);\n result = result.concat(curr.children);\n }\n }\n return result;\n }\n /**\n * Creates a deep copy of the entity and a copy of all its components\n */\n clone() {\n const newEntity = new Entity();\n for (const c of this.types) {\n const componentInstance = this.get(c);\n if (componentInstance) {\n newEntity.addComponent(componentInstance.clone());\n }\n }\n for (const child of this.children) {\n newEntity.addChild(child.clone());\n }\n return newEntity;\n }\n /**\n * Adds a copy of all the components from another template entity as a \"prefab\"\n * @param templateEntity Entity to use as a template\n * @param force Force component replacement if it already exists on the target entity\n */\n addTemplate(templateEntity, force = false) {\n for (const c of templateEntity.getComponents()) {\n this.addComponent(c.clone(), force);\n }\n for (const child of templateEntity.children) {\n this.addChild(child.clone().addTemplate(child));\n }\n return this;\n }\n _getClassHierarchyRoot(componentType) {\n var _a, _b;\n let current = componentType;\n let parent = (_a = Object.getPrototypeOf(current.prototype)) === null || _a === void 0 ? void 0 : _a.constructor;\n while (parent && parent !== Object && parent !== _Component__WEBPACK_IMPORTED_MODULE_5__.Component) {\n current = parent;\n parent = (_b = Object.getPrototypeOf(current.prototype)) === null || _b === void 0 ? void 0 : _b.constructor;\n }\n return current;\n }\n /**\n * Adds a component to the entity\n * @param component Component or Entity to add copy of components from\n * @param force Optionally overwrite any existing components of the same type\n */\n addComponent(component, force = false) {\n // if component already exists, skip if not forced\n if (this.has(component.constructor)) {\n if (force) {\n // Remove existing component type if exists when forced\n this.removeComponent(component.constructor, true);\n }\n else {\n // early exit component exits\n return this;\n }\n }\n // TODO circular dependencies will be a problem\n if (component.dependencies && component.dependencies.length) {\n for (const ctor of component.dependencies) {\n this.addComponent(new ctor());\n }\n }\n component.owner = this;\n const rootComponent = this._getClassHierarchyRoot(component.constructor);\n this.components.set(rootComponent, component);\n this.components.set(component.constructor, component);\n this.componentValues.push(component);\n if (component.onAdd) {\n component.onAdd(this);\n }\n this.componentAdded$.notifyAll(component);\n return this;\n }\n /**\n * Removes a component from the entity, by default removals are deferred to the end of entity update to avoid consistency issues\n *\n * Components can be force removed with the `force` flag, the removal is not deferred and happens immediately\n * @param typeOrInstance\n * @param force\n */\n removeComponent(typeOrInstance, force = false) {\n let type;\n if ((0,_Component__WEBPACK_IMPORTED_MODULE_5__.isComponentCtor)(typeOrInstance)) {\n type = typeOrInstance;\n }\n else {\n type = typeOrInstance.constructor;\n }\n if (force) {\n const componentToRemove = this.components.get(type);\n if (componentToRemove) {\n this.componentRemoved$.notifyAll(componentToRemove);\n componentToRemove.owner = undefined;\n if (componentToRemove.onRemove) {\n componentToRemove.onRemove(this);\n }\n const componentIndex = this.componentValues.indexOf(componentToRemove);\n if (componentIndex > -1) {\n this.componentValues.splice(componentIndex, 1);\n }\n }\n const rootComponent = this._getClassHierarchyRoot(type);\n this.components.delete(rootComponent);\n this.components.delete(type); // remove after the notify to preserve typing\n }\n else {\n this._componentsToRemove.push(type);\n }\n return this;\n }\n clearComponents() {\n const components = this.types;\n for (const c of components) {\n this.removeComponent(c);\n }\n }\n /**\n * @hidden\n * @internal\n */\n processComponentRemoval() {\n for (const type of this._componentsToRemove) {\n this.removeComponent(type, true);\n }\n this._componentsToRemove.length = 0;\n }\n /**\n * Check if a component type exists\n * @param type\n */\n has(type) {\n return this.components.has(type);\n }\n /**\n * Gets whether the actor is Initialized\n */\n get isInitialized() {\n return this._isInitialized;\n }\n get isAdded() {\n return this._isAdded;\n }\n /**\n * Initializes this entity, meant to be called by the Scene before first update not by users of Excalibur.\n *\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n * @internal\n */\n _initialize(engine) {\n if (!this.isInitialized) {\n this.onInitialize(engine);\n this.events.emit('initialize', new _Events__WEBPACK_IMPORTED_MODULE_3__.InitializeEvent(engine, this));\n this._isInitialized = true;\n }\n }\n /**\n * Adds this Actor, meant to be called by the Scene when Actor is added.\n *\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n * @internal\n */\n _add(engine) {\n if (!this.isAdded && this.isActive) {\n this.onAdd(engine);\n this.events.emit('add', new _Events__WEBPACK_IMPORTED_MODULE_3__.AddEvent(engine, this));\n this._isAdded = true;\n }\n }\n /**\n * Removes Actor, meant to be called by the Scene when Actor is added.\n *\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n * @internal\n */\n _remove(engine) {\n if (this.isAdded && !this.isActive) {\n this.onRemove(engine);\n this.events.emit('remove', new _Events__WEBPACK_IMPORTED_MODULE_3__.RemoveEvent(engine, this));\n this._isAdded = false;\n }\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _preupdate handler for {@apilink onPreUpdate} lifecycle event\n * @internal\n */\n _preupdate(engine, elapsed) {\n this.events.emit('preupdate', new _Events__WEBPACK_IMPORTED_MODULE_3__.PreUpdateEvent(engine, elapsed, this));\n this.onPreUpdate(engine, elapsed);\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _preupdate handler for {@apilink onPostUpdate} lifecycle event\n * @internal\n */\n _postupdate(engine, elapsed) {\n this.events.emit('postupdate', new _Events__WEBPACK_IMPORTED_MODULE_3__.PostUpdateEvent(engine, elapsed, this));\n this.onPostUpdate(engine, elapsed);\n }\n /**\n * `onInitialize` is called before the first update of the entity. This method is meant to be\n * overridden.\n *\n * Synonymous with the event handler `.on('initialize', (evt) => {...})`\n */\n onInitialize(engine) {\n // Override me\n }\n /**\n * `onAdd` is called when Actor is added to scene. This method is meant to be\n * overridden.\n *\n * Synonymous with the event handler `.on('add', (evt) => {...})`\n */\n onAdd(engine) {\n // Override me\n }\n /**\n * `onRemove` is called when Actor is added to scene. This method is meant to be\n * overridden.\n *\n * Synonymous with the event handler `.on('remove', (evt) => {...})`\n */\n onRemove(engine) {\n // Override me\n }\n /**\n * Safe to override onPreUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPreUpdate` is called directly before an entity is updated.\n */\n onPreUpdate(engine, elapsed) {\n // Override me\n }\n /**\n * Safe to override onPostUpdate lifecycle event handler. Synonymous with `.on('postupdate', (evt) =>{...})`\n *\n * `onPostUpdate` is called directly after an entity is updated.\n */\n onPostUpdate(engine, elapsed) {\n // Override me\n }\n /**\n *\n * Entity update lifecycle, called internally\n * @internal\n * @param engine\n * @param elapsed\n */\n update(engine, elapsed) {\n this._initialize(engine);\n this._add(engine);\n this._preupdate(engine, elapsed);\n for (const child of this.children) {\n child.update(engine, elapsed);\n }\n this._postupdate(engine, elapsed);\n this._remove(engine);\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n if (handler) {\n this.events.off(eventName, handler);\n }\n else {\n this.events.off(eventName);\n }\n }\n}\nEntity._ID = 0;\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/EntityManager.ts\":\n/*!************************************************!*\\\n !*** ./EntityComponentSystem/EntityManager.ts ***!\n \\************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EntityManager: () => (/* binding */ EntityManager)\n/* harmony export */ });\n/* harmony import */ var _Entity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Util */ \"./Util/Util.ts\");\n\n\n// Add/Remove entities and components\nclass EntityManager {\n constructor(_world) {\n this._world = _world;\n this.entities = [];\n this._entityIndex = {};\n this._childAddedHandlerMap = new Map();\n this._childRemovedHandlerMap = new Map();\n this._createChildAddedHandler = () => (e) => {\n this.addEntity(e);\n };\n this._createChildRemovedHandler = () => (e) => {\n this.removeEntity(e, false);\n };\n this._entitiesToRemove = [];\n }\n /**\n * Runs the entity lifecycle\n * @param scene\n * @param elapsed\n */\n updateEntities(scene, elapsed) {\n for (let entityIndex = 0; entityIndex < this.entities.length; entityIndex++) {\n const entity = this.entities[entityIndex];\n entity.update(scene.engine, elapsed);\n if (!entity.isActive) {\n this.removeEntity(entity);\n }\n }\n }\n findEntitiesForRemoval() {\n for (let entityIndex = 0; entityIndex < this.entities.length; entityIndex++) {\n const entity = this.entities[entityIndex];\n if (!entity.isActive) {\n this.removeEntity(entity);\n }\n }\n }\n /**\n * Adds an entity to be tracked by the EntityManager\n * @param entity\n */\n addEntity(entity) {\n entity.isActive = true;\n entity.scene = this._world.scene;\n if (entity && !this._entityIndex[entity.id]) {\n this._entityIndex[entity.id] = entity;\n this.entities.push(entity);\n this._world.queryManager.addEntity(entity);\n // if entity has children\n entity.children.forEach((c) => {\n c.scene = entity.scene;\n this.addEntity(c);\n });\n const childAdded = this._createChildAddedHandler();\n this._childAddedHandlerMap.set(entity, childAdded);\n const childRemoved = this._createChildRemovedHandler();\n this._childRemovedHandlerMap.set(entity, childRemoved);\n entity.childrenAdded$.subscribe(childAdded);\n entity.childrenRemoved$.subscribe(childRemoved);\n }\n }\n removeEntity(idOrEntity, deferred = true) {\n var _a, _b;\n let id = 0;\n if (idOrEntity instanceof _Entity__WEBPACK_IMPORTED_MODULE_0__.Entity) {\n id = idOrEntity.id;\n }\n else {\n id = idOrEntity;\n }\n const entity = this._entityIndex[id];\n if (entity && entity.isActive) {\n entity.isActive = false;\n }\n if (entity && deferred) {\n this._entitiesToRemove.push(entity);\n return;\n }\n delete this._entityIndex[id];\n if (entity) {\n entity.scene = null;\n (0,_Util_Util__WEBPACK_IMPORTED_MODULE_1__.removeItemFromArray)(entity, this.entities);\n this._world.queryManager.removeEntity(entity);\n // if entity has children\n entity.children.forEach((c) => {\n c.scene = null;\n this.removeEntity(c, deferred);\n });\n const childAddedHandler = this._childAddedHandlerMap.get(entity);\n if (childAddedHandler) {\n entity.childrenAdded$.unsubscribe(childAddedHandler);\n }\n const childRemovedHandler = this._childRemovedHandlerMap.get(entity);\n if (childRemovedHandler) {\n entity.childrenRemoved$.unsubscribe(childRemovedHandler);\n }\n // stats\n if ((_b = (_a = this._world) === null || _a === void 0 ? void 0 : _a.scene) === null || _b === void 0 ? void 0 : _b.engine) {\n this._world.scene.engine.stats.currFrame.actors.killed++;\n }\n }\n }\n processEntityRemovals() {\n for (let entityIndex = 0; entityIndex < this._entitiesToRemove.length; entityIndex++) {\n const entity = this._entitiesToRemove[entityIndex];\n if (entity.isActive) {\n continue;\n }\n this.removeEntity(entity, false);\n }\n this._entitiesToRemove.length = 0;\n }\n processComponentRemovals() {\n for (let entityIndex = 0; entityIndex < this.entities.length; entityIndex++) {\n const entity = this.entities[entityIndex];\n entity.processComponentRemoval();\n }\n }\n getById(id) {\n return this._entityIndex[id];\n }\n getByName(name) {\n return this.entities.filter((e) => e.name === name);\n }\n clear() {\n for (let i = this.entities.length - 1; i >= 0; i--) {\n this.removeEntity(this.entities[i]);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/Priority.ts\":\n/*!*******************************************!*\\\n !*** ./EntityComponentSystem/Priority.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SystemPriority: () => (/* binding */ SystemPriority)\n/* harmony export */ });\n/**\n * Higher priorities run earlier than others in the system update\n */\nconst SystemPriority = {\n Highest: -Infinity,\n Higher: -5,\n Average: 0,\n Lower: 5,\n Lowest: Infinity\n};\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/Query.ts\":\n/*!****************************************!*\\\n !*** ./EntityComponentSystem/Query.ts ***!\n \\****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Query: () => (/* binding */ Query)\n/* harmony export */ });\n/* harmony import */ var _Util_Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Util/Observable */ \"./Util/Observable.ts\");\n\n/**\n * Represents query for entities that match a list of types that is cached and observable\n *\n * Queries can be strongly typed by supplying a type union in the optional type parameter\n * ```typescript\n * const queryAB = new ex.Query(['A', 'B']);\n * ```\n */\nclass Query {\n constructor(requiredComponents) {\n this.requiredComponents = requiredComponents;\n this.components = new Set();\n this.entities = [];\n /**\n * This fires right after the component is added\n */\n this.entityAdded$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_0__.Observable();\n /**\n * This fires right before the component is actually removed from the entity, it will still be available for cleanup purposes\n */\n this.entityRemoved$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_0__.Observable();\n if (requiredComponents.length === 0) {\n throw new Error('Cannot create query without components');\n }\n for (const type of requiredComponents) {\n this.components.add(type);\n }\n this.id = Query.createId(requiredComponents);\n }\n static createId(requiredComponents) {\n // TODO what happens if a user defines the same type name as a built in type\n // ! TODO this could be dangerous depending on the bundler's settings for names\n // Maybe some kind of hash function is better here?\n return requiredComponents\n .slice()\n .map((c) => c.name)\n .sort()\n .join('-');\n }\n /**\n * Potentially adds an entity to a query index, returns true if added, false if not\n * @param entity\n */\n checkAndAdd(entity) {\n if (!this.entities.includes(entity) && entity.hasAll(Array.from(this.components))) {\n this.entities.push(entity);\n this.entityAdded$.notifyAll(entity);\n return true;\n }\n return false;\n }\n removeEntity(entity) {\n const index = this.entities.indexOf(entity);\n if (index > -1) {\n this.entities.splice(index, 1);\n this.entityRemoved$.notifyAll(entity);\n }\n }\n /**\n * Returns a list of entities that match the query\n * @param sort Optional sorting function to sort entities returned from the query\n */\n getEntities(sort) {\n if (sort) {\n this.entities.sort(sort);\n }\n return this.entities;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/QueryManager.ts\":\n/*!***********************************************!*\\\n !*** ./EntityComponentSystem/QueryManager.ts ***!\n \\***********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ QueryManager: () => (/* binding */ QueryManager)\n/* harmony export */ });\n/* harmony import */ var _Query__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Query */ \"./EntityComponentSystem/Query.ts\");\n/* harmony import */ var _TagQuery__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./TagQuery */ \"./EntityComponentSystem/TagQuery.ts\");\n\n\n/**\n * The query manager is responsible for updating all queries when entities/components change\n */\nclass QueryManager {\n constructor(_world) {\n this._world = _world;\n this._queries = new Map();\n this._addComponentHandlers = new Map();\n this._removeComponentHandlers = new Map();\n this._componentToQueriesIndex = new Map();\n this._tagQueries = new Map();\n this._addTagHandlers = new Map();\n this._removeTagHandlers = new Map();\n this._tagToQueriesIndex = new Map();\n this._createAddComponentHandler = (entity) => (c) => {\n this.addComponent(entity, c);\n };\n this._createRemoveComponentHandler = (entity) => (c) => {\n this.removeComponent(entity, c);\n };\n this._createAddTagHandler = (entity) => (tag) => {\n this.addTag(entity, tag);\n };\n this._createRemoveTagHandler = (entity) => (tag) => {\n this.removeTag(entity, tag);\n };\n }\n createQuery(requiredComponents) {\n const id = _Query__WEBPACK_IMPORTED_MODULE_0__.Query.createId(requiredComponents);\n if (this._queries.has(id)) {\n // short circuit if query is already created\n return this._queries.get(id);\n }\n const query = new _Query__WEBPACK_IMPORTED_MODULE_0__.Query(requiredComponents);\n this._queries.set(query.id, query);\n // index maintenance\n for (const component of requiredComponents) {\n const queries = this._componentToQueriesIndex.get(component);\n if (!queries) {\n this._componentToQueriesIndex.set(component, [query]);\n }\n else {\n queries.push(query);\n }\n }\n for (const entity of this._world.entities) {\n this.addEntity(entity);\n }\n return query;\n }\n createTagQuery(requiredTags) {\n const id = _TagQuery__WEBPACK_IMPORTED_MODULE_1__.TagQuery.createId(requiredTags);\n if (this._tagQueries.has(id)) {\n // short circuit if query is already created\n return this._tagQueries.get(id);\n }\n const query = new _TagQuery__WEBPACK_IMPORTED_MODULE_1__.TagQuery(requiredTags);\n this._tagQueries.set(query.id, query);\n // index maintenance\n for (const tag of requiredTags) {\n const queries = this._tagToQueriesIndex.get(tag);\n if (!queries) {\n this._tagToQueriesIndex.set(tag, [query]);\n }\n else {\n queries.push(query);\n }\n }\n for (const entity of this._world.entities) {\n this.addEntity(entity);\n }\n return query;\n }\n /**\n * Scans queries and locates any that need this entity added\n * @param entity\n */\n addEntity(entity) {\n const maybeAddComponent = this._addComponentHandlers.get(entity);\n const maybeRemoveComponent = this._removeComponentHandlers.get(entity);\n const addComponent = maybeAddComponent !== null && maybeAddComponent !== void 0 ? maybeAddComponent : this._createAddComponentHandler(entity);\n const removeComponent = maybeRemoveComponent !== null && maybeRemoveComponent !== void 0 ? maybeRemoveComponent : this._createRemoveComponentHandler(entity);\n this._addComponentHandlers.set(entity, addComponent);\n this._removeComponentHandlers.set(entity, removeComponent);\n const maybeAddTag = this._addTagHandlers.get(entity);\n const maybeRemoveTag = this._removeTagHandlers.get(entity);\n const addTag = maybeAddTag !== null && maybeAddTag !== void 0 ? maybeAddTag : this._createAddTagHandler(entity);\n const removeTag = maybeRemoveTag !== null && maybeRemoveTag !== void 0 ? maybeRemoveTag : this._createRemoveTagHandler(entity);\n this._addTagHandlers.set(entity, addTag);\n this._removeTagHandlers.set(entity, removeTag);\n for (const query of this._queries.values()) {\n query.checkAndAdd(entity);\n }\n for (const tagQuery of this._tagQueries.values()) {\n tagQuery.checkAndAdd(entity);\n }\n entity.componentAdded$.subscribe(addComponent);\n entity.componentRemoved$.subscribe(removeComponent);\n entity.tagAdded$.subscribe(addTag);\n entity.tagRemoved$.subscribe(removeTag);\n }\n /**\n * Scans queries and locates any that need this entity removed\n * @param entity\n */\n removeEntity(entity) {\n // Handle components\n const addComponent = this._addComponentHandlers.get(entity);\n const removeComponent = this._removeComponentHandlers.get(entity);\n for (const query of this._queries.values()) {\n query.removeEntity(entity);\n }\n if (addComponent) {\n entity.componentAdded$.unsubscribe(addComponent);\n }\n if (removeComponent) {\n entity.componentRemoved$.unsubscribe(removeComponent);\n }\n // Handle tags\n const addTag = this._addTagHandlers.get(entity);\n const removeTag = this._removeTagHandlers.get(entity);\n for (const tagQuery of this._tagQueries.values()) {\n tagQuery.removeEntity(entity);\n }\n if (addTag) {\n entity.tagAdded$.unsubscribe(addTag);\n }\n if (removeTag) {\n entity.tagRemoved$.unsubscribe(removeTag);\n }\n }\n /**\n * Updates any queries when a component is added to an entity\n * @param entity\n * @param component\n */\n addComponent(entity, component) {\n var _a;\n const queries = (_a = this._componentToQueriesIndex.get(component.constructor)) !== null && _a !== void 0 ? _a : [];\n for (const query of queries) {\n query.checkAndAdd(entity);\n }\n }\n /**\n * Updates any queries when a component is removed from an entity\n * @param entity\n * @param component\n */\n removeComponent(entity, component) {\n var _a;\n const queries = (_a = this._componentToQueriesIndex.get(component.constructor)) !== null && _a !== void 0 ? _a : [];\n for (const query of queries) {\n query.removeEntity(entity);\n }\n }\n /**\n * Updates any queries when a tag is added to an entity\n * @param entity\n * @param tag\n */\n addTag(entity, tag) {\n var _a;\n const queries = (_a = this._tagToQueriesIndex.get(tag)) !== null && _a !== void 0 ? _a : [];\n for (const query of queries) {\n query.checkAndAdd(entity);\n }\n }\n /**\n * Updates any queries when a component is removed from an entity\n * @param entity\n * @param tag\n */\n removeTag(entity, tag) {\n var _a;\n const queries = (_a = this._tagToQueriesIndex.get(tag)) !== null && _a !== void 0 ? _a : [];\n for (const query of queries) {\n query.removeEntity(entity);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/System.ts\":\n/*!*****************************************!*\\\n !*** ./EntityComponentSystem/System.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ System: () => (/* binding */ System),\n/* harmony export */ SystemType: () => (/* binding */ SystemType)\n/* harmony export */ });\n/* harmony import */ var _Priority__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Priority */ \"./EntityComponentSystem/Priority.ts\");\n\n/**\n * Enum that determines whether to run the system in the update or draw phase\n */\nvar SystemType;\n(function (SystemType) {\n SystemType[\"Update\"] = \"update\";\n SystemType[\"Draw\"] = \"draw\";\n})(SystemType || (SystemType = {}));\n/**\n * An Excalibur {@apilink System} that updates entities of certain types.\n * Systems are scene specific\n *\n *\n *\n * Excalibur Systems currently require at least 1 Component type to operated\n *\n * Multiple types are declared as a type union\n * For example:\n *\n * ```typescript\n * class MySystem extends System {\n * static priority = SystemPriority.Lowest;\n * public readonly systemType = SystemType.Update;\n * public query: Query;\n * constructor(public world: World) {\n * super();\n * this.query = this.world.query([TransformComponent]);\n * }\n * public update(elapsed: number) {\n * ...\n * }\n * }\n * ```\n */\nclass System {\n}\n/**\n * System can execute in priority order, by default all systems are priority 0. Lower values indicated higher priority.\n * For a system to execute before all other a lower priority value (-1 for example) must be set.\n * For a system to execute after all other a higher priority value (10 for example) must be set.\n */\nSystem.priority = _Priority__WEBPACK_IMPORTED_MODULE_0__.SystemPriority.Average;\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/SystemManager.ts\":\n/*!************************************************!*\\\n !*** ./EntityComponentSystem/SystemManager.ts ***!\n \\************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SystemManager: () => (/* binding */ SystemManager),\n/* harmony export */ isSystemConstructor: () => (/* binding */ isSystemConstructor)\n/* harmony export */ });\n/* harmony import */ var _System__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Util */ \"./Util/Util.ts\");\n\n\n/**\n *\n */\nfunction isSystemConstructor(x) {\n var _a, _b;\n return !!(x === null || x === void 0 ? void 0 : x.prototype) && !!((_b = (_a = x === null || x === void 0 ? void 0 : x.prototype) === null || _a === void 0 ? void 0 : _a.constructor) === null || _b === void 0 ? void 0 : _b.name);\n}\n/**\n * The SystemManager is responsible for keeping track of all systems in a scene.\n * Systems are scene specific\n */\nclass SystemManager {\n constructor(_world) {\n this._world = _world;\n /**\n * List of systems, to add a new system call {@apilink SystemManager.addSystem}\n */\n this.systems = [];\n this.initialized = false;\n }\n /**\n * Get a system registered in the manager by type\n * @param systemType\n */\n get(systemType) {\n return this.systems.find((s) => s instanceof systemType);\n }\n /**\n * Adds a system to the manager, it will now be updated every frame\n * @param systemOrCtor\n */\n addSystem(systemOrCtor) {\n let system;\n if (systemOrCtor instanceof _System__WEBPACK_IMPORTED_MODULE_0__.System) {\n system = systemOrCtor;\n }\n else {\n system = new systemOrCtor(this._world);\n }\n this.systems.push(system);\n this.systems.sort((a, b) => a.constructor.priority - b.constructor.priority);\n // If systems are added and the manager has already been init'd\n // then immediately init the system\n if (this.initialized && system.initialize) {\n system.initialize(this._world, this._world.scene);\n }\n }\n /**\n * Removes a system from the manager, it will no longer be updated\n * @param system\n */\n removeSystem(system) {\n (0,_Util_Util__WEBPACK_IMPORTED_MODULE_1__.removeItemFromArray)(system, this.systems);\n }\n /**\n * Initialize all systems in the manager\n *\n * Systems added after initialize() will be initialized on add\n */\n initialize() {\n if (!this.initialized) {\n this.initialized = true;\n for (const s of this.systems) {\n if (s.initialize) {\n s.initialize(this._world, this._world.scene);\n }\n }\n }\n }\n /**\n * Updates all systems\n * @param type whether this is an update or draw system\n * @param scene context reference\n * @param elapsed time in milliseconds\n */\n updateSystems(type, scene, elapsed) {\n const systems = this.systems.filter((s) => s.systemType === type);\n for (const s of systems) {\n if (s.preupdate) {\n s.preupdate(scene, elapsed);\n }\n }\n for (const s of systems) {\n s.update(elapsed);\n }\n for (const s of systems) {\n if (s.postupdate) {\n s.postupdate(scene, elapsed);\n }\n }\n }\n clear() {\n for (let i = this.systems.length - 1; i >= 0; i--) {\n this.removeSystem(this.systems[i]);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/TagQuery.ts\":\n/*!*******************************************!*\\\n !*** ./EntityComponentSystem/TagQuery.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TagQuery: () => (/* binding */ TagQuery)\n/* harmony export */ });\n/* harmony import */ var _Util_Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Util/Observable */ \"./Util/Observable.ts\");\n\nclass TagQuery {\n constructor(requiredTags) {\n this.requiredTags = requiredTags;\n this.tags = new Set();\n this.entities = [];\n /**\n * This fires right after the component is added\n */\n this.entityAdded$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_0__.Observable();\n /**\n * This fires right before the component is actually removed from the entity, it will still be available for cleanup purposes\n */\n this.entityRemoved$ = new _Util_Observable__WEBPACK_IMPORTED_MODULE_0__.Observable();\n if (requiredTags.length === 0) {\n throw new Error('Cannot create tag query without tags');\n }\n for (const tag of requiredTags) {\n this.tags.add(tag);\n }\n this.id = TagQuery.createId(requiredTags);\n }\n static createId(requiredComponents) {\n return requiredComponents.slice().sort().join('-');\n }\n checkAndAdd(entity) {\n if (!this.entities.includes(entity) && entity.hasAllTags(Array.from(this.tags))) {\n this.entities.push(entity);\n this.entityAdded$.notifyAll(entity);\n return true;\n }\n return false;\n }\n removeEntity(entity) {\n const index = this.entities.indexOf(entity);\n if (index > -1) {\n this.entities.splice(index, 1);\n this.entityRemoved$.notifyAll(entity);\n }\n }\n /**\n * Returns a list of entities that match the query\n * @param sort Optional sorting function to sort entities returned from the query\n */\n getEntities(sort) {\n if (sort) {\n this.entities.sort(sort);\n }\n return this.entities;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/World.ts\":\n/*!****************************************!*\\\n !*** ./EntityComponentSystem/World.ts ***!\n \\****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ World: () => (/* binding */ World)\n/* harmony export */ });\n/* harmony import */ var _Entity__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _EntityManager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./EntityManager */ \"./EntityComponentSystem/EntityManager.ts\");\n/* harmony import */ var _QueryManager__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./QueryManager */ \"./EntityComponentSystem/QueryManager.ts\");\n/* harmony import */ var _System__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _SystemManager__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./SystemManager */ \"./EntityComponentSystem/SystemManager.ts\");\n\n\n\n\n\n/**\n * The World is a self-contained entity component system for a particular context.\n */\nclass World {\n /**\n * The context type is passed to the system updates\n * @param scene\n */\n constructor(scene) {\n this.scene = scene;\n this.queryManager = new _QueryManager__WEBPACK_IMPORTED_MODULE_0__.QueryManager(this);\n this.entityManager = new _EntityManager__WEBPACK_IMPORTED_MODULE_1__.EntityManager(this);\n this.systemManager = new _SystemManager__WEBPACK_IMPORTED_MODULE_2__.SystemManager(this);\n }\n /**\n * Query the ECS world for entities that match your components\n * @param requiredTypes\n */\n query(requiredTypes) {\n return this.queryManager.createQuery(requiredTypes);\n }\n queryTags(requiredTags) {\n return this.queryManager.createTagQuery(requiredTags);\n }\n /**\n * Update systems by type and time elapsed in milliseconds\n */\n update(type, elapsed) {\n if (type === _System__WEBPACK_IMPORTED_MODULE_3__.SystemType.Update) {\n this.entityManager.updateEntities(this.scene, elapsed);\n }\n this.systemManager.updateSystems(type, this.scene, elapsed);\n this.entityManager.findEntitiesForRemoval();\n this.entityManager.processComponentRemovals();\n this.entityManager.processEntityRemovals();\n }\n add(entityOrSystem) {\n if (entityOrSystem instanceof _Entity__WEBPACK_IMPORTED_MODULE_4__.Entity) {\n this.entityManager.addEntity(entityOrSystem);\n }\n if (entityOrSystem instanceof _System__WEBPACK_IMPORTED_MODULE_3__.System || (0,_SystemManager__WEBPACK_IMPORTED_MODULE_2__.isSystemConstructor)(entityOrSystem)) {\n this.systemManager.addSystem(entityOrSystem);\n }\n }\n /**\n * Get a system out of the ECS world\n */\n get(system) {\n return this.systemManager.get(system);\n }\n remove(entityOrSystem, deferred = true) {\n if (entityOrSystem instanceof _Entity__WEBPACK_IMPORTED_MODULE_4__.Entity) {\n this.entityManager.removeEntity(entityOrSystem, deferred);\n }\n if (entityOrSystem instanceof _System__WEBPACK_IMPORTED_MODULE_3__.System) {\n this.systemManager.removeSystem(entityOrSystem);\n }\n }\n get entities() {\n return this.entityManager.entities;\n }\n clearEntities() {\n this.entityManager.clear();\n }\n clearSystems() {\n this.systemManager.clear();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./EntityComponentSystem/index.ts\":\n/*!****************************************!*\\\n !*** ./EntityComponentSystem/index.ts ***!\n \\****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AddedComponent: () => (/* reexport safe */ _Entity__WEBPACK_IMPORTED_MODULE_1__.AddedComponent),\n/* harmony export */ Component: () => (/* reexport safe */ _Component__WEBPACK_IMPORTED_MODULE_0__.Component),\n/* harmony export */ Entity: () => (/* reexport safe */ _Entity__WEBPACK_IMPORTED_MODULE_1__.Entity),\n/* harmony export */ EntityEvents: () => (/* reexport safe */ _Entity__WEBPACK_IMPORTED_MODULE_1__.EntityEvents),\n/* harmony export */ EntityManager: () => (/* reexport safe */ _EntityManager__WEBPACK_IMPORTED_MODULE_2__.EntityManager),\n/* harmony export */ MotionComponent: () => (/* reexport safe */ _Components_MotionComponent__WEBPACK_IMPORTED_MODULE_11__.MotionComponent),\n/* harmony export */ Query: () => (/* reexport safe */ _Query__WEBPACK_IMPORTED_MODULE_3__.Query),\n/* harmony export */ QueryManager: () => (/* reexport safe */ _QueryManager__WEBPACK_IMPORTED_MODULE_5__.QueryManager),\n/* harmony export */ RemovedComponent: () => (/* reexport safe */ _Entity__WEBPACK_IMPORTED_MODULE_1__.RemovedComponent),\n/* harmony export */ System: () => (/* reexport safe */ _System__WEBPACK_IMPORTED_MODULE_6__.System),\n/* harmony export */ SystemManager: () => (/* reexport safe */ _SystemManager__WEBPACK_IMPORTED_MODULE_7__.SystemManager),\n/* harmony export */ SystemPriority: () => (/* reexport safe */ _Priority__WEBPACK_IMPORTED_MODULE_9__.SystemPriority),\n/* harmony export */ SystemType: () => (/* reexport safe */ _System__WEBPACK_IMPORTED_MODULE_6__.SystemType),\n/* harmony export */ TagQuery: () => (/* reexport safe */ _TagQuery__WEBPACK_IMPORTED_MODULE_4__.TagQuery),\n/* harmony export */ TransformComponent: () => (/* reexport safe */ _Components_TransformComponent__WEBPACK_IMPORTED_MODULE_10__.TransformComponent),\n/* harmony export */ World: () => (/* reexport safe */ _World__WEBPACK_IMPORTED_MODULE_8__.World),\n/* harmony export */ isAddedComponent: () => (/* reexport safe */ _Entity__WEBPACK_IMPORTED_MODULE_1__.isAddedComponent),\n/* harmony export */ isComponentCtor: () => (/* reexport safe */ _Component__WEBPACK_IMPORTED_MODULE_0__.isComponentCtor),\n/* harmony export */ isRemovedComponent: () => (/* reexport safe */ _Entity__WEBPACK_IMPORTED_MODULE_1__.isRemovedComponent),\n/* harmony export */ isSystemConstructor: () => (/* reexport safe */ _SystemManager__WEBPACK_IMPORTED_MODULE_7__.isSystemConstructor)\n/* harmony export */ });\n/* harmony import */ var _Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Component */ \"./EntityComponentSystem/Component.ts\");\n/* harmony import */ var _Entity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _EntityManager__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./EntityManager */ \"./EntityComponentSystem/EntityManager.ts\");\n/* harmony import */ var _Query__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Query */ \"./EntityComponentSystem/Query.ts\");\n/* harmony import */ var _TagQuery__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./TagQuery */ \"./EntityComponentSystem/TagQuery.ts\");\n/* harmony import */ var _QueryManager__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./QueryManager */ \"./EntityComponentSystem/QueryManager.ts\");\n/* harmony import */ var _System__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _SystemManager__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./SystemManager */ \"./EntityComponentSystem/SystemManager.ts\");\n/* harmony import */ var _World__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./World */ \"./EntityComponentSystem/World.ts\");\n/* harmony import */ var _Priority__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Priority */ \"./EntityComponentSystem/Priority.ts\");\n/* harmony import */ var _Components_TransformComponent__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Components_MotionComponent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./EventEmitter.ts\":\n/*!*************************!*\\\n !*** ./EventEmitter.ts ***!\n \\*************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EventEmitter: () => (/* binding */ EventEmitter)\n/* harmony export */ });\n/**\n * Excalibur's typed event emitter, this allows events to be sent with any string to Type mapping\n */\nclass EventEmitter {\n constructor() {\n this._paused = false;\n this._empty = true;\n this._listeners = {};\n this._listenersOnce = {};\n this._pipes = [];\n }\n /**\n * Removes all listeners and pipes\n */\n clear() {\n this._listeners = {};\n this._listenersOnce = {};\n this._pipes.length = 0;\n this._empty = true;\n }\n on(eventName, handler) {\n var _a;\n this._empty = false;\n this._listeners[eventName] = (_a = this._listeners[eventName]) !== null && _a !== void 0 ? _a : [];\n this._listeners[eventName].push(handler);\n return {\n close: () => this.off(eventName, handler)\n };\n }\n once(eventName, handler) {\n var _a;\n this._empty = false;\n this._listenersOnce[eventName] = (_a = this._listenersOnce[eventName]) !== null && _a !== void 0 ? _a : [];\n this._listenersOnce[eventName].push(handler);\n return {\n close: () => this.off(eventName, handler)\n };\n }\n off(eventName, handler) {\n var _a, _b;\n if (handler) {\n const newListeners = (_a = this._listeners[eventName]) === null || _a === void 0 ? void 0 : _a.filter((h) => h !== handler);\n this._listeners[eventName] = newListeners;\n const newOnceListeners = (_b = this._listenersOnce[eventName]) === null || _b === void 0 ? void 0 : _b.filter((h) => h !== handler);\n this._listenersOnce[eventName] = newOnceListeners;\n }\n else {\n delete this._listeners[eventName];\n }\n }\n emit(eventName, event) {\n if (this._empty) {\n return;\n }\n if (this._paused) {\n return;\n }\n const listeners = this._listeners[eventName];\n if (listeners) {\n for (let i = 0; i < listeners.length; i++) {\n listeners[i](event);\n }\n }\n const onces = this._listenersOnce[eventName];\n this._listenersOnce[eventName] = [];\n if (onces) {\n for (let i = 0; i < onces.length; i++) {\n onces[i](event);\n }\n }\n for (let i = 0; i < this._pipes.length; i++) {\n this._pipes[i].emit(eventName, event);\n }\n }\n /**\n * Replay events from this emitter to another\n * @param emitter\n */\n pipe(emitter) {\n if (this === emitter) {\n throw Error('Cannot pipe to self');\n }\n this._empty = false;\n this._pipes.push(emitter);\n return {\n close: () => {\n const i = this._pipes.indexOf(emitter);\n if (i > -1) {\n this._pipes.splice(i, 1);\n }\n }\n };\n }\n /**\n * Remove any piped emitters\n * @param emitter\n */\n unpipe(emitter) {\n const i = this._pipes.indexOf(emitter);\n if (i > -1) {\n this._pipes.splice(i, 1);\n }\n }\n /**\n * Paused event emitters do not emit events\n */\n pause() {\n this._paused = true;\n }\n /**\n * Unpaused event emitter do emit events\n */\n unpause() {\n this._paused = false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Events.ts\":\n/*!*******************!*\\\n !*** ./Events.ts ***!\n \\*******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ActionCompleteEvent: () => (/* binding */ ActionCompleteEvent),\n/* harmony export */ ActionStartEvent: () => (/* binding */ ActionStartEvent),\n/* harmony export */ ActivateEvent: () => (/* binding */ ActivateEvent),\n/* harmony export */ AddEvent: () => (/* binding */ AddEvent),\n/* harmony export */ CollisionEndEvent: () => (/* binding */ CollisionEndEvent),\n/* harmony export */ CollisionPostSolveEvent: () => (/* binding */ CollisionPostSolveEvent),\n/* harmony export */ CollisionPreSolveEvent: () => (/* binding */ CollisionPreSolveEvent),\n/* harmony export */ CollisionStartEvent: () => (/* binding */ CollisionStartEvent),\n/* harmony export */ ContactEndEvent: () => (/* binding */ ContactEndEvent),\n/* harmony export */ ContactStartEvent: () => (/* binding */ ContactStartEvent),\n/* harmony export */ DeactivateEvent: () => (/* binding */ DeactivateEvent),\n/* harmony export */ EnterTriggerEvent: () => (/* binding */ EnterTriggerEvent),\n/* harmony export */ EnterViewPortEvent: () => (/* binding */ EnterViewPortEvent),\n/* harmony export */ EventTypes: () => (/* binding */ EventTypes),\n/* harmony export */ ExitTriggerEvent: () => (/* binding */ ExitTriggerEvent),\n/* harmony export */ ExitViewPortEvent: () => (/* binding */ ExitViewPortEvent),\n/* harmony export */ GameEvent: () => (/* binding */ GameEvent),\n/* harmony export */ GameStartEvent: () => (/* binding */ GameStartEvent),\n/* harmony export */ GameStopEvent: () => (/* binding */ GameStopEvent),\n/* harmony export */ GamepadAxisEvent: () => (/* binding */ GamepadAxisEvent),\n/* harmony export */ GamepadButtonEvent: () => (/* binding */ GamepadButtonEvent),\n/* harmony export */ GamepadConnectEvent: () => (/* binding */ GamepadConnectEvent),\n/* harmony export */ GamepadDisconnectEvent: () => (/* binding */ GamepadDisconnectEvent),\n/* harmony export */ HiddenEvent: () => (/* binding */ HiddenEvent),\n/* harmony export */ InitializeEvent: () => (/* binding */ InitializeEvent),\n/* harmony export */ KillEvent: () => (/* binding */ KillEvent),\n/* harmony export */ PostCollisionEvent: () => (/* binding */ PostCollisionEvent),\n/* harmony export */ PostDebugDrawEvent: () => (/* binding */ PostDebugDrawEvent),\n/* harmony export */ PostDrawEvent: () => (/* binding */ PostDrawEvent),\n/* harmony export */ PostFrameEvent: () => (/* binding */ PostFrameEvent),\n/* harmony export */ PostKillEvent: () => (/* binding */ PostKillEvent),\n/* harmony export */ PostTransformDrawEvent: () => (/* binding */ PostTransformDrawEvent),\n/* harmony export */ PostUpdateEvent: () => (/* binding */ PostUpdateEvent),\n/* harmony export */ PreCollisionEvent: () => (/* binding */ PreCollisionEvent),\n/* harmony export */ PreDebugDrawEvent: () => (/* binding */ PreDebugDrawEvent),\n/* harmony export */ PreDrawEvent: () => (/* binding */ PreDrawEvent),\n/* harmony export */ PreFrameEvent: () => (/* binding */ PreFrameEvent),\n/* harmony export */ PreKillEvent: () => (/* binding */ PreKillEvent),\n/* harmony export */ PreTransformDrawEvent: () => (/* binding */ PreTransformDrawEvent),\n/* harmony export */ PreUpdateEvent: () => (/* binding */ PreUpdateEvent),\n/* harmony export */ RemoveEvent: () => (/* binding */ RemoveEvent),\n/* harmony export */ VisibleEvent: () => (/* binding */ VisibleEvent)\n/* harmony export */ });\nvar EventTypes;\n(function (EventTypes) {\n EventTypes[\"Kill\"] = \"kill\";\n EventTypes[\"PreKill\"] = \"prekill\";\n EventTypes[\"PostKill\"] = \"postkill\";\n EventTypes[\"PreDraw\"] = \"predraw\";\n EventTypes[\"PostDraw\"] = \"postdraw\";\n EventTypes[\"PreDebugDraw\"] = \"predebugdraw\";\n EventTypes[\"PostDebugDraw\"] = \"postdebugdraw\";\n EventTypes[\"PreUpdate\"] = \"preupdate\";\n EventTypes[\"PostUpdate\"] = \"postupdate\";\n EventTypes[\"PreFrame\"] = \"preframe\";\n EventTypes[\"PostFrame\"] = \"postframe\";\n EventTypes[\"PreCollision\"] = \"precollision\";\n EventTypes[\"CollisionStart\"] = \"collisionstart\";\n EventTypes[\"CollisionEnd\"] = \"collisionend\";\n EventTypes[\"PostCollision\"] = \"postcollision\";\n EventTypes[\"Initialize\"] = \"initialize\";\n EventTypes[\"Activate\"] = \"activate\";\n EventTypes[\"Deactivate\"] = \"deactivate\";\n EventTypes[\"ExitViewport\"] = \"exitviewport\";\n EventTypes[\"EnterViewport\"] = \"enterviewport\";\n EventTypes[\"ExitTrigger\"] = \"exit\";\n EventTypes[\"EnterTrigger\"] = \"enter\";\n EventTypes[\"Connect\"] = \"connect\";\n EventTypes[\"Disconnect\"] = \"disconnect\";\n EventTypes[\"Button\"] = \"button\";\n EventTypes[\"Axis\"] = \"axis\";\n EventTypes[\"Visible\"] = \"visible\";\n EventTypes[\"Hidden\"] = \"hidden\";\n EventTypes[\"Start\"] = \"start\";\n EventTypes[\"Stop\"] = \"stop\";\n EventTypes[\"PointerUp\"] = \"pointerup\";\n EventTypes[\"PointerDown\"] = \"pointerdown\";\n EventTypes[\"PointerMove\"] = \"pointermove\";\n EventTypes[\"PointerEnter\"] = \"pointerenter\";\n EventTypes[\"PointerLeave\"] = \"pointerleave\";\n EventTypes[\"PointerCancel\"] = \"pointercancel\";\n EventTypes[\"PointerWheel\"] = \"pointerwheel\";\n EventTypes[\"Up\"] = \"up\";\n EventTypes[\"Down\"] = \"down\";\n EventTypes[\"Move\"] = \"move\";\n EventTypes[\"Enter\"] = \"enter\";\n EventTypes[\"Leave\"] = \"leave\";\n EventTypes[\"Cancel\"] = \"cancel\";\n EventTypes[\"Wheel\"] = \"wheel\";\n EventTypes[\"Press\"] = \"press\";\n EventTypes[\"Release\"] = \"release\";\n EventTypes[\"Hold\"] = \"hold\";\n EventTypes[\"PointerDragStart\"] = \"pointerdragstart\";\n EventTypes[\"PointerDragEnd\"] = \"pointerdragend\";\n EventTypes[\"PointerDragEnter\"] = \"pointerdragenter\";\n EventTypes[\"PointerDragLeave\"] = \"pointerdragleave\";\n EventTypes[\"PointerDragMove\"] = \"pointerdragmove\";\n EventTypes[\"ActionStart\"] = \"actionstart\";\n EventTypes[\"ActionComplete\"] = \"actioncomplete\";\n EventTypes[\"Add\"] = \"add\";\n EventTypes[\"Remove\"] = \"remove\";\n})(EventTypes || (EventTypes = {}));\n/**\n * Base event type in Excalibur that all other event types derive from. Not all event types are thrown on all Excalibur game objects,\n * some events are unique to a type, others are not.\n *\n */\nclass GameEvent {\n constructor() {\n /**\n * Other target object for this event\n */\n this.other = null;\n this._bubbles = true;\n }\n /**\n * If set to false, prevents event from propagating to other actors. If true it will be propagated\n * to all actors that apply.\n */\n get bubbles() {\n return this._bubbles;\n }\n set bubbles(value) {\n this._bubbles = value;\n }\n /**\n * Prevents event from bubbling\n */\n stopPropagation() {\n this.bubbles = false;\n }\n}\n/**\n * The 'kill' event is emitted on actors when it is killed. The target is the actor that was killed.\n */\nclass KillEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'prekill' event is emitted directly before an actor is killed.\n */\nclass PreKillEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'postkill' event is emitted directly after the actor is killed.\n */\nclass PostKillEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'start' event is emitted on engine when has started and is ready for interaction.\n */\nclass GameStartEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'stop' event is emitted on engine when has been stopped and will no longer take input, update or draw.\n */\nclass GameStopEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'predraw' event is emitted on actors, scenes, and engine before drawing starts. Actors' predraw happens inside their graphics\n * transform so that all drawing takes place with the actor as the origin.\n *\n */\nclass PreDrawEvent extends GameEvent {\n constructor(ctx, elapsed, self) {\n super();\n this.ctx = ctx;\n this.elapsed = elapsed;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'postdraw' event is emitted on actors, scenes, and engine after drawing finishes. Actors' postdraw happens inside their graphics\n * transform so that all drawing takes place with the actor as the origin.\n *\n */\nclass PostDrawEvent extends GameEvent {\n constructor(ctx, elapsed, self) {\n super();\n this.ctx = ctx;\n this.elapsed = elapsed;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'pretransformdraw' event is emitted on actors/entities before any graphics transforms have taken place.\n * Useful if you need to completely customize the draw or modify the transform before drawing in the draw step (for example needing\n * latest camera positions)\n *\n */\nclass PreTransformDrawEvent extends GameEvent {\n constructor(ctx, elapsed, self) {\n super();\n this.ctx = ctx;\n this.elapsed = elapsed;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'posttransformdraw' event is emitted on actors/entities after all graphics have been draw and transforms reset.\n * Useful if you need to completely custom the draw after everything is done.\n *\n */\nclass PostTransformDrawEvent extends GameEvent {\n constructor(ctx, elapsed, self) {\n super();\n this.ctx = ctx;\n this.elapsed = elapsed;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'predebugdraw' event is emitted on actors, scenes, and engine before debug drawing starts.\n */\nclass PreDebugDrawEvent extends GameEvent {\n constructor(ctx, self) {\n super();\n this.ctx = ctx;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'postdebugdraw' event is emitted on actors, scenes, and engine after debug drawing starts.\n */\nclass PostDebugDrawEvent extends GameEvent {\n constructor(ctx, self) {\n super();\n this.ctx = ctx;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'preupdate' event is emitted on actors, scenes, camera, and engine before the update starts.\n */\nclass PreUpdateEvent extends GameEvent {\n constructor(engine, elapsed, self) {\n super();\n this.engine = engine;\n this.elapsed = elapsed;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'postupdate' event is emitted on actors, scenes, camera, and engine after the update ends.\n */\nclass PostUpdateEvent extends GameEvent {\n constructor(engine, elapsed, self) {\n super();\n this.engine = engine;\n this.elapsed = elapsed;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * The 'preframe' event is emitted on the engine, before the frame begins.\n */\nclass PreFrameEvent extends GameEvent {\n constructor(engine, prevStats) {\n super();\n this.engine = engine;\n this.prevStats = prevStats;\n this.target = engine;\n }\n}\n/**\n * The 'postframe' event is emitted on the engine, after a frame ends.\n */\nclass PostFrameEvent extends GameEvent {\n constructor(engine, stats) {\n super();\n this.engine = engine;\n this.stats = stats;\n this.target = engine;\n }\n}\n/**\n * Event received when a gamepad is connected to Excalibur. {@apilink Gamepads} receives this event.\n */\nclass GamepadConnectEvent extends GameEvent {\n constructor(index, gamepad) {\n super();\n this.index = index;\n this.gamepad = gamepad;\n this.target = gamepad;\n }\n}\n/**\n * Event received when a gamepad is disconnected from Excalibur. {@apilink Gamepads} receives this event.\n */\nclass GamepadDisconnectEvent extends GameEvent {\n constructor(index, gamepad) {\n super();\n this.index = index;\n this.gamepad = gamepad;\n this.target = gamepad;\n }\n}\n/**\n * Gamepad button event. See {@apilink Gamepads} for information on responding to controller input. {@apilink Gamepad} instances receive this event;\n */\nclass GamepadButtonEvent extends GameEvent {\n /**\n * @param button The Gamepad button\n * @param value A numeric value between 0 and 1\n */\n constructor(button, value, self) {\n super();\n this.button = button;\n this.value = value;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Gamepad axis event. See {@apilink Gamepads} for information on responding to controller input. {@apilink Gamepad} instances receive this event;\n */\nclass GamepadAxisEvent extends GameEvent {\n /**\n * @param axis The Gamepad axis\n * @param value A numeric value between -1 and 1\n */\n constructor(axis, value, self) {\n super();\n this.axis = axis;\n this.value = value;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event received by the {@apilink Engine} when the browser window is visible on a screen.\n */\nclass VisibleEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event received by the {@apilink Engine} when the browser window is hidden from all screens.\n */\nclass HiddenEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event thrown on an {@apilink Actor | `actor`} when a collision will occur this frame if it resolves\n */\nclass PreCollisionEvent extends GameEvent {\n /**\n * @param self The actor the event was thrown on\n * @param other The actor that will collided with the current actor\n * @param side The side that will be collided with the current actor\n * @param intersection Intersection vector\n */\n constructor(self, other, side, intersection, contact) {\n super();\n this.self = self;\n this.other = other;\n this.side = side;\n this.intersection = intersection;\n this.contact = contact;\n this.target = self;\n }\n}\n/**\n * Event thrown on an {@apilink Actor | `actor`} when a collision has been resolved (body reacted) this frame\n */\nclass PostCollisionEvent extends GameEvent {\n /**\n * @param self The actor the event was thrown on\n * @param other The actor that did collide with the current actor\n * @param side The side that did collide with the current actor\n * @param intersection Intersection vector\n */\n constructor(self, other, side, intersection, contact) {\n super();\n this.self = self;\n this.other = other;\n this.side = side;\n this.intersection = intersection;\n this.contact = contact;\n this.target = self;\n }\n}\nclass ContactStartEvent {\n constructor(self, other, side, contact) {\n this.self = self;\n this.other = other;\n this.side = side;\n this.contact = contact;\n }\n}\nclass ContactEndEvent {\n constructor(self, other, side, lastContact) {\n this.self = self;\n this.other = other;\n this.side = side;\n this.lastContact = lastContact;\n }\n}\nclass CollisionPreSolveEvent {\n constructor(self, other, side, intersection, contact) {\n this.self = self;\n this.other = other;\n this.side = side;\n this.intersection = intersection;\n this.contact = contact;\n }\n}\nclass CollisionPostSolveEvent {\n constructor(self, other, side, intersection, contact) {\n this.self = self;\n this.other = other;\n this.side = side;\n this.intersection = intersection;\n this.contact = contact;\n }\n}\n/**\n * Event thrown the first time an {@apilink Actor | `actor`} collides with another, after an actor is in contact normal collision events are fired.\n */\nclass CollisionStartEvent extends GameEvent {\n /**\n *\n * @param self\n * @param other\n * @param side\n * @param contact\n */\n constructor(self, other, side, contact) {\n super();\n this.self = self;\n this.other = other;\n this.side = side;\n this.contact = contact;\n this.target = self;\n }\n}\n/**\n * Event thrown when the {@apilink Actor | `actor`} is no longer colliding with another\n */\nclass CollisionEndEvent extends GameEvent {\n /**\n *\n */\n constructor(self, other, side, lastContact) {\n super();\n this.self = self;\n this.other = other;\n this.side = side;\n this.lastContact = lastContact;\n this.target = self;\n }\n}\n/**\n * Event thrown on an {@apilink Actor}, {@apilink Scene}, and {@apilink Engine} only once before the first update call\n */\nclass InitializeEvent extends GameEvent {\n /**\n * @param engine The reference to the current engine\n */\n constructor(engine, self) {\n super();\n this.engine = engine;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event thrown on a {@apilink Scene} on activation\n */\nclass ActivateEvent extends GameEvent {\n /**\n * @param context The context for the scene activation\n */\n constructor(context, self) {\n super();\n this.context = context;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event thrown on a {@apilink Scene} on deactivation\n */\nclass DeactivateEvent extends GameEvent {\n /**\n * @param context The context for the scene deactivation\n */\n constructor(context, self) {\n super();\n this.context = context;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event thrown on an {@apilink Actor} when the graphics bounds completely leaves the screen.\n */\nclass ExitViewPortEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event thrown on an {@apilink Actor} when any part of the graphics bounds are on screen.\n */\nclass EnterViewPortEvent extends GameEvent {\n constructor(self) {\n super();\n this.self = self;\n this.target = self;\n }\n}\nclass EnterTriggerEvent extends GameEvent {\n constructor(self, entity) {\n super();\n this.self = self;\n this.entity = entity;\n this.target = self;\n }\n}\nclass ExitTriggerEvent extends GameEvent {\n constructor(self, entity) {\n super();\n this.self = self;\n this.entity = entity;\n this.target = self;\n }\n}\n/**\n * Event thrown on an {@apilink Actor} when an action starts.\n */\nclass ActionStartEvent extends GameEvent {\n constructor(action, self) {\n super();\n this.action = action;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event thrown on an {@apilink Actor} when an action completes.\n */\nclass ActionCompleteEvent extends GameEvent {\n constructor(action, self) {\n super();\n this.action = action;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event thrown on an [[Actor]] when an Actor added to scene.\n */\nclass AddEvent extends GameEvent {\n constructor(engine, self) {\n super();\n this.engine = engine;\n this.self = self;\n this.target = self;\n }\n}\n/**\n * Event thrown on an [[Actor]] when an Actor removed from scene.\n */\nclass RemoveEvent extends GameEvent {\n constructor(engine, self) {\n super();\n this.engine = engine;\n this.self = self;\n this.target = self;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Events/MediaEvents.ts\":\n/*!*******************************!*\\\n !*** ./Events/MediaEvents.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MediaEvent: () => (/* binding */ MediaEvent),\n/* harmony export */ NativeSoundEvent: () => (/* binding */ NativeSoundEvent),\n/* harmony export */ NativeSoundProcessedEvent: () => (/* binding */ NativeSoundProcessedEvent)\n/* harmony export */ });\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n\nclass MediaEvent extends _Events__WEBPACK_IMPORTED_MODULE_0__.GameEvent {\n /**\n * Media event cannot bubble\n */\n set bubbles(_value) {\n // stubbed\n }\n /**\n * Media event cannot bubble\n */\n get bubbles() {\n return false;\n }\n /**\n * Media event cannot bubble, so they have no path\n */\n get _path() {\n return null;\n }\n /**\n * Media event cannot bubble, so they have no path\n */\n set _path(_val) {\n // stubbed\n }\n constructor(target, _name = 'MediaEvent') {\n super();\n this.target = target;\n this._name = _name;\n }\n /**\n * Prevents event from bubbling\n */\n stopPropagation() {\n /**\n * Stub\n */\n }\n /**\n * Action, that calls when event happens\n */\n action() {\n /**\n * Stub\n */\n }\n /**\n * Propagate event further through event path\n */\n propagate() {\n /**\n * Stub\n */\n }\n layPath(_actor) {\n /**\n * Stub\n */\n }\n}\nclass NativeSoundEvent extends MediaEvent {\n constructor(target, track) {\n super(target, 'NativeSoundEvent');\n this.track = track;\n }\n}\nclass NativeSoundProcessedEvent extends MediaEvent {\n constructor(target, _processedData) {\n super(target, 'NativeSoundProcessedEvent');\n this._processedData = _processedData;\n this.data = this._processedData;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Flags.ts\":\n/*!******************!*\\\n !*** ./Flags.ts ***!\n \\******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Flags: () => (/* binding */ Flags)\n/* harmony export */ });\n/**\n * Flags is a feature flag implementation for Excalibur. They can only be operated **before {@apilink Engine} construction**\n * after which they are frozen and are read-only.\n *\n * Flags are used to enable experimental or preview features in Excalibur.\n */\nclass Flags {\n /**\n * Force excalibur to load the Canvas 2D graphics context fallback\n * @warning not all features of excalibur are supported in the Canvas 2D fallback\n */\n static useCanvasGraphicsContext() {\n Flags.enable('use-canvas-context');\n }\n /**\n * Force excalibur to use the less optimized image renderer\n */\n static useLegacyImageRenderer() {\n Flags.enable('use-legacy-image-renderer');\n }\n /**\n * Freeze all flag modifications making them readonly\n */\n static freeze() {\n Flags._FROZEN = true;\n }\n /**\n * Resets internal flag state, not meant to be called by users. Only used for testing.\n *\n * Calling this in your game is UNSUPPORTED\n * @internal\n */\n static _reset() {\n Flags._FROZEN = false;\n Flags._FLAGS = {};\n }\n /**\n * Enable a specific feature flag by name. **Note: can only be set before {@apilink Engine} constructor time**\n * @param flagName\n */\n static enable(flagName) {\n if (this._FROZEN) {\n throw Error('Feature flags can only be enabled before Engine constructor time');\n }\n Flags._FLAGS[flagName] = true;\n }\n /**\n * Disable a specific feature flag by name. **Note: can only be set before {@apilink Engine} constructor time**\n * @param flagName\n */\n static disable(flagName) {\n if (this._FROZEN) {\n throw Error('Feature flags can only be disabled before Engine constructor time');\n }\n Flags._FLAGS[flagName] = false;\n }\n /**\n * Check if a flag is enabled. If the flag is disabled or does not exist `false` is returned\n * @param flagName\n */\n static isEnabled(flagName) {\n return !!Flags._FLAGS[flagName];\n }\n /**\n * Show a list of currently known flags\n */\n static show() {\n return Object.keys(Flags._FLAGS);\n }\n}\nFlags._FROZEN = false;\nFlags._FLAGS = {};\n\n\n/***/ }),\n\n/***/ \"./GarbageCollector.ts\":\n/*!*****************************!*\\\n !*** ./GarbageCollector.ts ***!\n \\*****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DefaultGarbageCollectionOptions: () => (/* binding */ DefaultGarbageCollectionOptions),\n/* harmony export */ GarbageCollector: () => (/* binding */ GarbageCollector)\n/* harmony export */ });\nconst DefaultGarbageCollectionOptions = {\n textureCollectInterval: 60000\n // TODO future work to integrate the font and text configuration, refactor existing collection mechanism\n // fontCollectInterval: 60_000,\n // textMeasurementCollectInterval: 60_000,\n};\nclass GarbageCollector {\n constructor(options) {\n this.options = options;\n this._running = false;\n this._collectionMap = new Map();\n this._collectors = new Map();\n /**\n * Runs the collection loop to cleanup any stale resources given the registered collect handlers\n */\n this.collectStaleResources = (deadline) => {\n if (!this._running) {\n return;\n }\n for (const [type, [collector, timeoutInterval]] of this._collectors.entries()) {\n const now = this.options.getTimestamp();\n for (const [resource, [resourceType, time]] of this._collectionMap.entries()) {\n if (type !== resourceType || time + timeoutInterval >= now) {\n continue;\n }\n const collected = collector(resource);\n if (collected) {\n this._collectionMap.delete(resource);\n }\n }\n }\n this._collectHandle = requestIdleCallback(this.collectStaleResources);\n };\n }\n /**\n *\n * @param type Resource type\n * @param timeoutInterval If resource type exceeds interval in milliseconds collect() is called\n * @param collect Collection implementation, returns true if collected\n */\n registerCollector(type, timeoutInterval, collect) {\n this._collectors.set(type, [collect, timeoutInterval]);\n }\n /**\n * Add a resource to be tracked for collection\n * @param type\n * @param resource\n */\n addCollectableResource(type, resource) {\n this._collectionMap.set(resource, [type, this.options.getTimestamp()]);\n }\n /**\n * Update the resource last used timestamp preventing collection\n * @param resource\n */\n touch(resource) {\n const collectionData = this._collectionMap.get(resource);\n if (collectionData) {\n this._collectionMap.set(resource, [collectionData[0], this.options.getTimestamp()]);\n }\n }\n /**\n * Force collect all resources, useful for shutting down a game\n * or if you know that you will not use anything you've allocated before now\n */\n forceCollectAll() {\n for (const [_, [collector]] of this._collectors.entries()) {\n for (const [resource] of this._collectionMap.entries()) {\n const collected = collector(resource);\n if (collected) {\n this._collectionMap.delete(resource);\n }\n }\n }\n }\n /**\n * Starts the garbage collection loop\n */\n start() {\n this._running = true;\n this.collectStaleResources();\n }\n /**\n * Stops the garbage collection loop\n */\n stop() {\n this._running = false;\n cancelIdleCallback(this._collectHandle);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Animation.ts\":\n/*!*******************************!*\\\n !*** ./Graphics/Animation.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Animation: () => (/* binding */ Animation),\n/* harmony export */ AnimationDirection: () => (/* binding */ AnimationDirection),\n/* harmony export */ AnimationEvents: () => (/* binding */ AnimationEvents),\n/* harmony export */ AnimationStrategy: () => (/* binding */ AnimationStrategy)\n/* harmony export */ });\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n\nvar AnimationDirection;\n(function (AnimationDirection) {\n /**\n * Animation is playing forwards\n */\n AnimationDirection[\"Forward\"] = \"forward\";\n /**\n * Animation is playing backwards\n */\n AnimationDirection[\"Backward\"] = \"backward\";\n})(AnimationDirection || (AnimationDirection = {}));\nvar AnimationStrategy;\n(function (AnimationStrategy) {\n /**\n * Animation ends without displaying anything\n */\n AnimationStrategy[\"End\"] = \"end\";\n /**\n * Animation loops to the first frame after the last frame\n */\n AnimationStrategy[\"Loop\"] = \"loop\";\n /**\n * Animation plays to the last frame, then backwards to the first frame, then repeats\n */\n AnimationStrategy[\"PingPong\"] = \"pingpong\";\n /**\n * Animation ends stopping on the last frame\n */\n AnimationStrategy[\"Freeze\"] = \"freeze\";\n})(AnimationStrategy || (AnimationStrategy = {}));\nconst AnimationEvents = {\n Frame: 'frame',\n Loop: 'loop',\n End: 'end'\n};\n/**\n * Create an Animation given a list of {@apilink Frame | `frames`} in {@apilink AnimationOptions}\n *\n * To create an Animation from a {@apilink SpriteSheet}, use {@apilink Animation.fromSpriteSheet}\n */\nclass Animation extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n constructor(options) {\n var _a, _b, _c;\n super(options);\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_1__.EventEmitter();\n this.frames = [];\n this.strategy = AnimationStrategy.Loop;\n this.frameDuration = 100;\n this._idempotencyToken = -1;\n this._firstTick = true;\n this._currentFrame = 0;\n this._timeLeftInFrame = 0;\n this._pingPongDirection = 1;\n this._done = false;\n this._playing = true;\n this._speed = 1;\n this._reversed = false;\n this.frames = options.frames;\n this.speed = (_a = options.speed) !== null && _a !== void 0 ? _a : this.speed;\n this.strategy = (_b = options.strategy) !== null && _b !== void 0 ? _b : this.strategy;\n this.frameDuration = options.totalDuration ? options.totalDuration / this.frames.length : (_c = options.frameDuration) !== null && _c !== void 0 ? _c : this.frameDuration;\n if (options.reverse) {\n this.reverse();\n }\n this.goToFrame(0);\n }\n clone() {\n return new Animation({\n frames: this.frames.map((f) => ({ ...f })),\n frameDuration: this.frameDuration,\n speed: this.speed,\n reverse: this._reversed,\n strategy: this.strategy,\n ...this.cloneGraphicOptions()\n });\n }\n get width() {\n const maybeFrame = this.currentFrame;\n if (maybeFrame && maybeFrame.graphic) {\n return Math.abs(maybeFrame.graphic.width * this.scale.x);\n }\n return 0;\n }\n get height() {\n const maybeFrame = this.currentFrame;\n if (maybeFrame && maybeFrame.graphic) {\n return Math.abs(maybeFrame.graphic.height * this.scale.y);\n }\n return 0;\n }\n /**\n * Create an Animation from a {@apilink SpriteSheet}, a list of indices into the sprite sheet, a duration per frame\n * and optional {@apilink AnimationStrategy}\n *\n * Example:\n * ```typescript\n * const spriteSheet = SpriteSheet.fromImageSource({...});\n *\n * const anim = Animation.fromSpriteSheet(spriteSheet, range(0, 5), 200, AnimationStrategy.Loop);\n * ```\n * @param spriteSheet ex.SpriteSheet\n * @param spriteSheetIndex 0 based index from left to right, top down (row major order) of the ex.SpriteSheet\n * @param durationPerFrame duration per frame in milliseconds\n * @param strategy Optional strategy, default AnimationStrategy.Loop\n */\n static fromSpriteSheet(spriteSheet, spriteSheetIndex, durationPerFrame, strategy = AnimationStrategy.Loop) {\n const maxIndex = spriteSheet.sprites.length - 1;\n const invalidIndices = spriteSheetIndex.filter((index) => index < 0 || index > maxIndex);\n if (invalidIndices.length) {\n Animation._LOGGER.warn(`Indices into SpriteSheet were provided that don\\'t exist: ${invalidIndices.join(',')} no frame will be shown`);\n }\n return new Animation({\n frames: spriteSheet.sprites\n .filter((_, index) => spriteSheetIndex.indexOf(index) > -1)\n .map((f) => ({\n graphic: f,\n duration: durationPerFrame\n })),\n strategy: strategy\n });\n }\n /**\n * Create an {@apilink Animation} from a {@apilink SpriteSheet} given a list of coordinates\n *\n * Example:\n * ```typescript\n * const spriteSheet = SpriteSheet.fromImageSource({...});\n *\n * const anim = Animation.fromSpriteSheetCoordinates({\n * spriteSheet,\n * frameCoordinates: [\n * {x: 0, y: 5, duration: 100, options { flipHorizontal: true }},\n * {x: 1, y: 5, duration: 200},\n * {x: 2, y: 5},\n * {x: 3, y: 5}\n * ],\n * strategy: AnimationStrategy.PingPong\n * });\n * ```\n * @param options\n * @returns Animation\n */\n static fromSpriteSheetCoordinates(options) {\n var _a;\n const { spriteSheet, frameCoordinates, durationPerFrame, durationPerFrameMs, speed, strategy, reverse } = options;\n const defaultDuration = (_a = durationPerFrame !== null && durationPerFrame !== void 0 ? durationPerFrame : durationPerFrameMs) !== null && _a !== void 0 ? _a : 100;\n const frames = [];\n for (const coord of frameCoordinates) {\n const { x, y, duration, options } = coord;\n const sprite = spriteSheet.getSprite(x, y, options);\n if (sprite) {\n frames.push({\n graphic: sprite,\n duration: duration !== null && duration !== void 0 ? duration : defaultDuration\n });\n }\n else {\n Animation._LOGGER.warn(`Skipping frame! SpriteSheet does not have coordinate (${x}, ${y}), please check your SpriteSheet to confirm that sprite exists`);\n }\n }\n return new Animation({\n frames,\n strategy,\n speed,\n reverse\n });\n }\n /**\n * Current animation speed\n *\n * 1 meaning normal 1x speed.\n * 2 meaning 2x speed and so on.\n */\n get speed() {\n return this._speed;\n }\n /**\n * Current animation speed\n *\n * 1 meaning normal 1x speed.\n * 2 meaning 2x speed and so on.\n */\n set speed(val) {\n this._speed = (0,_Math_util__WEBPACK_IMPORTED_MODULE_2__.clamp)(Math.abs(val), 0, Infinity);\n }\n /**\n * Returns the current Frame of the animation\n *\n * Use {@apilink Animation.currentFrameIndex} to get the frame number and\n * {@apilink Animation.goToFrame} to set the current frame index\n */\n get currentFrame() {\n if (this._currentFrame >= 0 && this._currentFrame < this.frames.length) {\n return this.frames[this._currentFrame];\n }\n return null;\n }\n /**\n * Returns the current frame index of the animation\n *\n * Use {@apilink Animation.currentFrame} to grab the current {@apilink Frame} object\n */\n get currentFrameIndex() {\n return this._currentFrame;\n }\n /**\n * Returns the amount of time in milliseconds left in the current frame\n */\n get currentFrameTimeLeft() {\n return this._timeLeftInFrame;\n }\n /**\n * Returns `true` if the animation is playing\n */\n get isPlaying() {\n return this._playing;\n }\n get isReversed() {\n return this._reversed;\n }\n /**\n * Reverses the play direction of the Animation, this preserves the current frame\n */\n reverse() {\n // Don't mutate with the original frame list, create a copy\n this.frames = this.frames.slice().reverse();\n this._reversed = !this._reversed;\n }\n /**\n * Returns the current play direction of the animation\n */\n get direction() {\n // Keep logically consistent with ping-pong direction\n // If ping-pong is forward = 1 and reversed is true then we are logically reversed\n const reversed = this._reversed && this._pingPongDirection === 1 ? true : false;\n return reversed ? AnimationDirection.Backward : AnimationDirection.Forward;\n }\n /**\n * Plays or resumes the animation from the current frame\n */\n play() {\n this._playing = true;\n }\n /**\n * Pauses the animation on the current frame\n */\n pause() {\n this._playing = false;\n this._firstTick = true; // firstTick must be set to emit the proper frame event\n }\n /**\n * Reset the animation back to the beginning, including if the animation were done\n */\n reset() {\n this._done = false;\n this._firstTick = true;\n this._currentFrame = 0;\n this._timeLeftInFrame = this.frameDuration;\n const maybeFrame = this.frames[this._currentFrame];\n if (maybeFrame) {\n this._timeLeftInFrame = (maybeFrame === null || maybeFrame === void 0 ? void 0 : maybeFrame.duration) || this.frameDuration;\n }\n }\n /**\n * Returns `true` if the animation can end\n */\n get canFinish() {\n switch (this.strategy) {\n case AnimationStrategy.End:\n case AnimationStrategy.Freeze: {\n return true;\n }\n default: {\n return false;\n }\n }\n }\n /**\n * Returns `true` if the animation is done, for looping type animations\n * `ex.AnimationStrategy.PingPong` and `ex.AnimationStrategy.Loop` this will always return `false`\n *\n * See the `ex.Animation.canFinish()` method to know if an animation type can end\n */\n get done() {\n return this._done;\n }\n /**\n * Jump the animation immediately to a specific frame if it exists\n *\n * Optionally specify an override for the duration of the frame, useful for\n * keeping multiple animations in sync with one another.\n * @param frameNumber\n * @param duration\n */\n goToFrame(frameNumber, duration) {\n this._currentFrame = frameNumber;\n this._timeLeftInFrame = duration !== null && duration !== void 0 ? duration : this.frameDuration;\n const maybeFrame = this.frames[this._currentFrame];\n if (maybeFrame && !this._done) {\n this._timeLeftInFrame = duration !== null && duration !== void 0 ? duration : ((maybeFrame === null || maybeFrame === void 0 ? void 0 : maybeFrame.duration) || this.frameDuration);\n this.events.emit('frame', { ...maybeFrame, frameIndex: this.currentFrameIndex });\n }\n }\n _nextFrame() {\n const currentFrame = this._currentFrame;\n if (this._done) {\n return currentFrame;\n }\n let next = -1;\n switch (this.strategy) {\n case AnimationStrategy.Loop: {\n next = (currentFrame + 1) % this.frames.length;\n if (next === 0) {\n this.events.emit('loop', this);\n }\n break;\n }\n case AnimationStrategy.End: {\n next = currentFrame + 1;\n if (next >= this.frames.length) {\n this._done = true;\n this._currentFrame = this.frames.length;\n this.events.emit('end', this);\n }\n break;\n }\n case AnimationStrategy.Freeze: {\n next = (0,_Math_util__WEBPACK_IMPORTED_MODULE_2__.clamp)(currentFrame + 1, 0, this.frames.length - 1);\n if (next >= this.frames.length - 1) {\n this._done = true;\n this.events.emit('end', this);\n }\n break;\n }\n case AnimationStrategy.PingPong: {\n if (currentFrame + this._pingPongDirection >= this.frames.length) {\n this._pingPongDirection = -1;\n this.events.emit('loop', this);\n }\n if (currentFrame + this._pingPongDirection < 0) {\n this._pingPongDirection = 1;\n this.events.emit('loop', this);\n }\n next = currentFrame + (this._pingPongDirection % this.frames.length);\n break;\n }\n }\n return next;\n }\n /**\n * Called internally by Excalibur to update the state of the animation potential update the current frame\n * @param elapsed Milliseconds elapsed\n * @param idempotencyToken Prevents double ticking in a frame by passing a unique token to the frame\n */\n tick(elapsed, idempotencyToken = 0) {\n if (this._idempotencyToken === idempotencyToken) {\n return;\n }\n this._idempotencyToken = idempotencyToken;\n if (!this._playing) {\n return;\n }\n // if it's the first frame emit frame event\n if (this._firstTick) {\n this._firstTick = false;\n this.events.emit('frame', { ...this.currentFrame, frameIndex: this.currentFrameIndex });\n }\n this._timeLeftInFrame -= elapsed * this._speed;\n if (this._timeLeftInFrame <= 0) {\n this.goToFrame(this._nextFrame());\n }\n }\n _drawImage(ctx, x, y) {\n if (this.currentFrame && this.currentFrame.graphic) {\n this.currentFrame.graphic.draw(ctx, x, y);\n }\n }\n}\nAnimation._LOGGER = _Util_Log__WEBPACK_IMPORTED_MODULE_3__.Logger.getInstance();\n\n\n/***/ }),\n\n/***/ \"./Graphics/Canvas.ts\":\n/*!****************************!*\\\n !*** ./Graphics/Canvas.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Canvas: () => (/* binding */ Canvas)\n/* harmony export */ });\n/* harmony import */ var _Raster__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Raster */ \"./Graphics/Raster.ts\");\n\n/**\n * A canvas {@apilink Graphic} to provide an adapter between the 2D Canvas API and the {@apilink ExcaliburGraphicsContext}.\n *\n * The {@apilink Canvas} works by re-rastering a draw handler to a HTMLCanvasElement for every draw which is then passed\n * to the {@apilink ExcaliburGraphicsContext} implementation as a rendered image.\n *\n * **Low performance API**\n */\nclass Canvas extends _Raster__WEBPACK_IMPORTED_MODULE_0__.Raster {\n /**\n * Return the 2D graphics context of this canvas\n */\n get ctx() {\n return this._ctx;\n }\n constructor(_options = {}) {\n super(_options);\n this._options = _options;\n }\n clone() {\n return new Canvas({\n ...this._options,\n ...this.cloneGraphicOptions(),\n ...this.cloneRasterOptions()\n });\n }\n execute(ctx) {\n var _a, _b;\n if ((_a = this._options) === null || _a === void 0 ? void 0 : _a.draw) {\n (_b = this._options) === null || _b === void 0 ? void 0 : _b.draw(ctx);\n }\n if (!this._options.cache) {\n this.flagDirty();\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Circle.ts\":\n/*!****************************!*\\\n !*** ./Graphics/Circle.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Circle: () => (/* binding */ Circle)\n/* harmony export */ });\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Raster__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Raster */ \"./Graphics/Raster.ts\");\n\n\n/**\n * A circle {@apilink Graphic} for drawing circles to the {@apilink ExcaliburGraphicsContext}\n *\n * Circles default to {@apilink ImageFiltering.Blended}\n */\nclass Circle extends _Raster__WEBPACK_IMPORTED_MODULE_0__.Raster {\n get radius() {\n return this._radius;\n }\n set radius(value) {\n this._radius = value;\n this.width = this._radius * 2;\n this.height = this._radius * 2;\n this.flagDirty();\n }\n constructor(options) {\n var _a, _b, _c;\n super(options);\n this._radius = 0;\n const lineWidth = (_a = options.lineWidth) !== null && _a !== void 0 ? _a : (options.strokeColor ? 1 : 0); // default lineWidth in canvas is 1px\n this.padding = (_b = options.padding) !== null && _b !== void 0 ? _b : 2 + lineWidth / 2; // default 2 padding for circles looks nice\n this.radius = options.radius;\n this.filtering = (_c = options.filtering) !== null && _c !== void 0 ? _c : _Filtering__WEBPACK_IMPORTED_MODULE_1__.ImageFiltering.Blended;\n this.rasterize();\n }\n clone() {\n return new Circle({\n radius: this.radius,\n ...this.cloneGraphicOptions(),\n ...this.cloneRasterOptions()\n });\n }\n execute(ctx) {\n if (this.radius > 0) {\n ctx.beginPath();\n ctx.arc(this.radius, this.radius, this.radius, 0, Math.PI * 2);\n if (this.color) {\n ctx.fill();\n }\n if (this.strokeColor) {\n ctx.stroke();\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/ExcaliburGraphicsContext.ts\":\n/*!******************************************************!*\\\n !*** ./Graphics/Context/ExcaliburGraphicsContext.ts ***!\n \\******************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DefaultAntialiasOptions: () => (/* binding */ DefaultAntialiasOptions),\n/* harmony export */ DefaultPixelArtOptions: () => (/* binding */ DefaultPixelArtOptions)\n/* harmony export */ });\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Filtering */ \"./Graphics/Filtering.ts\");\n\nconst DefaultAntialiasOptions = {\n pixelArtSampler: false,\n nativeContextAntialiasing: false,\n multiSampleAntialiasing: true,\n filtering: _Filtering__WEBPACK_IMPORTED_MODULE_0__.ImageFiltering.Blended,\n canvasImageRendering: 'auto'\n};\nconst DefaultPixelArtOptions = {\n pixelArtSampler: true,\n nativeContextAntialiasing: false,\n multiSampleAntialiasing: true,\n filtering: _Filtering__WEBPACK_IMPORTED_MODULE_0__.ImageFiltering.Blended,\n canvasImageRendering: 'auto'\n};\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/ExcaliburGraphicsContext2DCanvas.ts\":\n/*!**************************************************************!*\\\n !*** ./Graphics/Context/ExcaliburGraphicsContext2DCanvas.ts ***!\n \\**************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ExcaliburGraphicsContext2DCanvas: () => (/* binding */ ExcaliburGraphicsContext2DCanvas)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Color */ \"./Color.ts\");\n/* harmony import */ var _state_stack__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./state-stack */ \"./Graphics/Context/state-stack.ts\");\n/* harmony import */ var _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n/* harmony import */ var _debug_text__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./debug-text */ \"./Graphics/Context/debug-text.ts\");\n\n\n\n\nconst pixelSnapEpsilon = 0.0001;\nclass ExcaliburGraphicsContext2DCanvasDebug {\n constructor(_ex) {\n this._ex = _ex;\n this._debugText = new _debug_text__WEBPACK_IMPORTED_MODULE_0__.DebugText();\n }\n /**\n * Draw a debug rectangle to the context\n * @param x\n * @param y\n * @param width\n * @param height\n */\n drawRect(x, y, width, height) {\n this._ex.__ctx.save();\n this._ex.__ctx.strokeStyle = 'red';\n this._ex.__ctx.strokeRect(this._ex.snapToPixel ? ~~(x + pixelSnapEpsilon) : x, this._ex.snapToPixel ? ~~(y + pixelSnapEpsilon) : y, this._ex.snapToPixel ? ~~(width + pixelSnapEpsilon) : width, this._ex.snapToPixel ? ~~(height + pixelSnapEpsilon) : height);\n this._ex.__ctx.restore();\n }\n drawLine(start, end, lineOptions = { color: _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Black }) {\n var _a, _b;\n this._ex.__ctx.save();\n this._ex.__ctx.beginPath();\n this._ex.__ctx.strokeStyle = (_b = (_a = lineOptions.color) === null || _a === void 0 ? void 0 : _a.toString()) !== null && _b !== void 0 ? _b : '';\n this._ex.__ctx.moveTo(this._ex.snapToPixel ? ~~(start.x + pixelSnapEpsilon) : start.x, this._ex.snapToPixel ? ~~(start.y + pixelSnapEpsilon) : start.y);\n this._ex.__ctx.lineTo(this._ex.snapToPixel ? ~~(end.x + pixelSnapEpsilon) : end.x, this._ex.snapToPixel ? ~~(end.y + pixelSnapEpsilon) : end.y);\n this._ex.__ctx.lineWidth = 2;\n this._ex.__ctx.stroke();\n this._ex.__ctx.closePath();\n this._ex.__ctx.restore();\n }\n drawPoint(point, pointOptions = { color: _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Black, size: 5 }) {\n this._ex.__ctx.save();\n this._ex.__ctx.beginPath();\n this._ex.__ctx.fillStyle = pointOptions.color.toString();\n this._ex.__ctx.arc(this._ex.snapToPixel ? ~~(point.x + pixelSnapEpsilon) : point.x, this._ex.snapToPixel ? ~~(point.y + pixelSnapEpsilon) : point.y, pointOptions.size, 0, Math.PI * 2);\n this._ex.__ctx.fill();\n this._ex.__ctx.closePath();\n this._ex.__ctx.restore();\n }\n drawText(text, pos) {\n this._debugText.write(this._ex, text, pos);\n }\n}\nclass ExcaliburGraphicsContext2DCanvas {\n get width() {\n return this.__ctx.canvas.width;\n }\n get height() {\n return this.__ctx.canvas.height;\n }\n get opacity() {\n return this._state.current.opacity;\n }\n set opacity(value) {\n this._state.current.opacity = value;\n }\n get tint() {\n return this._state.current.tint;\n }\n set tint(color) {\n this._state.current.tint = color;\n }\n get smoothing() {\n return this.__ctx.imageSmoothingEnabled;\n }\n set smoothing(value) {\n this.__ctx.imageSmoothingEnabled = value;\n }\n constructor(options) {\n /**\n * Unused in Canvas implementation\n */\n this.useDrawSorting = false;\n /**\n * Unused in Canvas implementation\n */\n this.z = 0;\n this.backgroundColor = _Color__WEBPACK_IMPORTED_MODULE_1__.Color.ExcaliburBlue;\n this._state = new _state_stack__WEBPACK_IMPORTED_MODULE_2__.StateStack();\n this.snapToPixel = false;\n this.debug = new ExcaliburGraphicsContext2DCanvasDebug(this);\n const { canvasElement, context, enableTransparency, snapToPixel, antialiasing: smoothing, backgroundColor } = options;\n this.__ctx =\n context !== null && context !== void 0 ? context : canvasElement.getContext('2d', {\n alpha: enableTransparency !== null && enableTransparency !== void 0 ? enableTransparency : true\n });\n if (!this.__ctx) {\n throw new Error('Cannot build new ExcaliburGraphicsContext2D for some reason!');\n }\n this.backgroundColor = backgroundColor !== null && backgroundColor !== void 0 ? backgroundColor : this.backgroundColor;\n this.snapToPixel = snapToPixel !== null && snapToPixel !== void 0 ? snapToPixel : this.snapToPixel;\n this.smoothing = smoothing !== null && smoothing !== void 0 ? smoothing : this.smoothing;\n }\n resetTransform() {\n this.__ctx.resetTransform();\n }\n updateViewport(_resolution) {\n // pass\n }\n drawImage(image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight) {\n if (swidth === 0 || sheight === 0) {\n return; // zero dimension dest exit early\n }\n else if (dwidth === 0 || dheight === 0) {\n return; // zero dimension dest exit early\n }\n else if (image.width === 0 || image.height === 0) {\n return; // zero dimension source exit early\n }\n this.__ctx.globalAlpha = this.opacity;\n const args = [image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight]\n .filter((a) => a !== undefined)\n .map((a) => (typeof a === 'number' && this.snapToPixel ? ~~a : a));\n this.__ctx.drawImage.apply(this.__ctx, args);\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_3__.GraphicsDiagnostics.DrawCallCount++;\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_3__.GraphicsDiagnostics.DrawnImagesCount = 1;\n }\n drawLine(start, end, color, thickness = 1) {\n this.__ctx.save();\n this.__ctx.beginPath();\n this.__ctx.strokeStyle = color.toString();\n this.__ctx.moveTo(this.snapToPixel ? ~~(start.x + pixelSnapEpsilon) : start.x, this.snapToPixel ? ~~(start.y + pixelSnapEpsilon) : start.y);\n this.__ctx.lineTo(this.snapToPixel ? ~~(end.x + pixelSnapEpsilon) : end.x, this.snapToPixel ? ~~(end.y + pixelSnapEpsilon) : end.y);\n this.__ctx.lineWidth = thickness;\n this.__ctx.stroke();\n this.__ctx.closePath();\n this.__ctx.restore();\n }\n drawRectangle(pos, width, height, color) {\n this.__ctx.save();\n this.__ctx.fillStyle = color.toString();\n this.__ctx.fillRect(this.snapToPixel ? ~~(pos.x + pixelSnapEpsilon) : pos.x, this.snapToPixel ? ~~(pos.y + pixelSnapEpsilon) : pos.y, this.snapToPixel ? ~~(width + pixelSnapEpsilon) : width, this.snapToPixel ? ~~(height + pixelSnapEpsilon) : height);\n this.__ctx.restore();\n }\n drawCircle(pos, radius, color, stroke, thickness) {\n this.__ctx.save();\n this.__ctx.beginPath();\n if (stroke) {\n this.__ctx.strokeStyle = stroke.toString();\n }\n if (thickness) {\n this.__ctx.lineWidth = thickness;\n }\n this.__ctx.fillStyle = color.toString();\n this.__ctx.arc(this.snapToPixel ? ~~(pos.x + pixelSnapEpsilon) : pos.x, this.snapToPixel ? ~~(pos.y + pixelSnapEpsilon) : pos.y, radius, 0, Math.PI * 2);\n this.__ctx.fill();\n if (stroke) {\n this.__ctx.stroke();\n }\n this.__ctx.closePath();\n this.__ctx.restore();\n }\n /**\n * Save the current state of the canvas to the stack (transforms and opacity)\n */\n save() {\n this.__ctx.save();\n this._state.save();\n }\n /**\n * Restore the state of the canvas from the stack\n */\n restore() {\n this.__ctx.restore();\n this._state.restore();\n }\n /**\n * Translate the origin of the context by an x and y\n * @param x\n * @param y\n */\n translate(x, y) {\n this.__ctx.translate(this.snapToPixel ? ~~(x + pixelSnapEpsilon) : x, this.snapToPixel ? ~~(y + pixelSnapEpsilon) : y);\n }\n /**\n * Rotate the context about the current origin\n */\n rotate(angle) {\n this.__ctx.rotate(angle);\n }\n /**\n * Scale the context by an x and y factor\n * @param x\n * @param y\n */\n scale(x, y) {\n this.__ctx.scale(x, y);\n }\n getTransform() {\n throw new Error('Not implemented');\n }\n multiply(_m) {\n this.__ctx.setTransform(this.__ctx.getTransform().multiply(_m.toDOMMatrix()));\n }\n addPostProcessor(_postprocessor) {\n // pass\n }\n removePostProcessor(_postprocessor) {\n // pass\n }\n clearPostProcessors() {\n // pass\n }\n updatePostProcessors(elapsed) {\n // pass\n }\n beginDrawLifecycle() {\n // pass\n }\n endDrawLifecycle() {\n // pass\n }\n set material(material) {\n this._state.current.material = material;\n }\n get material() {\n return this._state.current.material;\n }\n createMaterial(options) {\n // pass\n return null;\n }\n clear() {\n // Clear frame\n this.__ctx.clearRect(0, 0, this.width, this.height);\n this.__ctx.fillStyle = this.backgroundColor.toString();\n this.__ctx.fillRect(0, 0, this.width, this.height);\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_3__.GraphicsDiagnostics.clear();\n }\n /**\n * Flushes the batched draw calls to the screen\n */\n flush() {\n // pass\n }\n dispose() {\n this.__ctx = undefined;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\":\n/*!***********************************************************!*\\\n !*** ./Graphics/Context/ExcaliburGraphicsContextWebGL.ts ***!\n \\***********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ExcaliburGraphicsContextWebGL: () => (/* binding */ ExcaliburGraphicsContextWebGL),\n/* harmony export */ pixelSnapEpsilon: () => (/* binding */ pixelSnapEpsilon)\n/* harmony export */ });\n/* harmony import */ var _Math_matrix__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../Math/matrix */ \"./Math/matrix.ts\");\n/* harmony import */ var _transform_stack__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./transform-stack */ \"./Graphics/Context/transform-stack.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Color */ \"./Color.ts\");\n/* harmony import */ var _state_stack__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./state-stack */ \"./Graphics/Context/state-stack.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _debug_text__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./debug-text */ \"./Graphics/Context/debug-text.ts\");\n/* harmony import */ var _render_target__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./render-target */ \"./Graphics/Context/render-target.ts\");\n/* harmony import */ var _texture_loader__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./texture-loader */ \"./Graphics/Context/texture-loader.ts\");\n/* harmony import */ var _line_renderer_line_renderer__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./line-renderer/line-renderer */ \"./Graphics/Context/line-renderer/line-renderer.ts\");\n/* harmony import */ var _point_renderer_point_renderer__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./point-renderer/point-renderer */ \"./Graphics/Context/point-renderer/point-renderer.ts\");\n/* harmony import */ var _screen_pass_painter_screen_pass_painter__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./screen-pass-painter/screen-pass-painter */ \"./Graphics/Context/screen-pass-painter/screen-pass-painter.ts\");\n/* harmony import */ var _image_renderer_image_renderer__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./image-renderer/image-renderer */ \"./Graphics/Context/image-renderer/image-renderer.ts\");\n/* harmony import */ var _rectangle_renderer_rectangle_renderer__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./rectangle-renderer/rectangle-renderer */ \"./Graphics/Context/rectangle-renderer/rectangle-renderer.ts\");\n/* harmony import */ var _circle_renderer_circle_renderer__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./circle-renderer/circle-renderer */ \"./Graphics/Context/circle-renderer/circle-renderer.ts\");\n/* harmony import */ var _Util_Pool__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Util/Pool */ \"./Util/Pool.ts\");\n/* harmony import */ var _draw_call__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./draw-call */ \"./Graphics/Context/draw-call.ts\");\n/* harmony import */ var _material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./material */ \"./Graphics/Context/material.ts\");\n/* harmony import */ var _material_renderer_material_renderer__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./material-renderer/material-renderer */ \"./Graphics/Context/material-renderer/material-renderer.ts\");\n/* harmony import */ var _shader__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _particle_renderer_particle_renderer__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./particle-renderer/particle-renderer */ \"./Graphics/Context/particle-renderer/particle-renderer.ts\");\n/* harmony import */ var _image_renderer_v2_image_renderer_v2__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./image-renderer-v2/image-renderer-v2 */ \"./Graphics/Context/image-renderer-v2/image-renderer-v2.ts\");\n/* harmony import */ var _Flags__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Flags */ \"./Flags.ts\");\n\n\n\n\n\n\n\n\n\n// renderers\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst pixelSnapEpsilon = 0.0001;\nclass ExcaliburGraphicsContextWebGLDebug {\n constructor(_webglCtx) {\n this._webglCtx = _webglCtx;\n this._debugText = new _debug_text__WEBPACK_IMPORTED_MODULE_0__.DebugText();\n }\n /**\n * Draw a debugging rectangle to the context\n * @param x\n * @param y\n * @param width\n * @param height\n */\n drawRect(x, y, width, height, rectOptions = { color: _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Black }) {\n this.drawLine((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(x, y), (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(x + width, y), { ...rectOptions });\n this.drawLine((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(x + width, y), (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(x + width, y + height), { ...rectOptions });\n this.drawLine((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(x + width, y + height), (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(x, y + height), { ...rectOptions });\n this.drawLine((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(x, y + height), (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(x, y), { ...rectOptions });\n }\n /**\n * Draw a debugging line to the context\n * @param start\n * @param end\n * @param lineOptions\n */\n drawLine(start, end, lineOptions) {\n var _a;\n this._webglCtx.draw('ex.line', start, end, (_a = lineOptions === null || lineOptions === void 0 ? void 0 : lineOptions.color) !== null && _a !== void 0 ? _a : _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Black);\n }\n /**\n * Draw a debugging point to the context\n * @param point\n * @param pointOptions\n */\n drawPoint(point, pointOptions = { color: _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Black, size: 5 }) {\n this._webglCtx.draw('ex.point', point, pointOptions.color, pointOptions.size);\n }\n drawText(text, pos) {\n this._debugText.write(this._webglCtx, text, pos);\n }\n}\nclass ExcaliburGraphicsContextWebGL {\n get z() {\n return this._state.current.z;\n }\n set z(value) {\n this._state.current.z = value;\n }\n get opacity() {\n return this._state.current.opacity;\n }\n set opacity(value) {\n this._state.current.opacity = value;\n }\n get tint() {\n return this._state.current.tint;\n }\n set tint(color) {\n this._state.current.tint = color;\n }\n get width() {\n return this.__gl.canvas.width;\n }\n get height() {\n return this.__gl.canvas.height;\n }\n get ortho() {\n return this._ortho;\n }\n /**\n * Checks the underlying webgl implementation if the requested internal resolution is supported\n * @param dim\n */\n checkIfResolutionSupported(dim) {\n // Slight hack based on this thread https://groups.google.com/g/webgl-dev-list/c/AHONvz3oQTo\n let supported = true;\n if (dim.width > 4096 || dim.height > 4096) {\n supported = false;\n }\n return supported;\n }\n constructor(options) {\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_3__.Logger.getInstance();\n this._renderers = new Map();\n this.imageRenderer = _Flags__WEBPACK_IMPORTED_MODULE_4__.Flags.isEnabled('use-legacy-image-renderer') ? 'ex.image' : 'ex.image-v2';\n this._isDrawLifecycle = false;\n this.useDrawSorting = true;\n this._drawCallPool = new _Util_Pool__WEBPACK_IMPORTED_MODULE_5__.Pool(() => new _draw_call__WEBPACK_IMPORTED_MODULE_6__.DrawCall(), undefined, 4000);\n this._drawCallIndex = 0;\n this._drawCalls = new Array(4000).fill(null);\n // Postprocessing is a tuple with 2 render targets, these are flip-flopped during the postprocessing process\n this._postProcessTargets = [];\n this._postprocessors = [];\n this._transform = new _transform_stack__WEBPACK_IMPORTED_MODULE_7__.TransformStack();\n this._state = new _state_stack__WEBPACK_IMPORTED_MODULE_8__.StateStack();\n /**\n * Snaps the drawing x/y coordinate to the nearest whole pixel\n */\n this.snapToPixel = false;\n /**\n * Native context smoothing\n */\n this.smoothing = false;\n /**\n * Whether the pixel art sampler is enabled for smooth sub pixel anti-aliasing\n */\n this.pixelArtSampler = false;\n /**\n * UV padding in pixels to use in internal image rendering to prevent texture bleed\n *\n */\n this.uvPadding = 0.01;\n this.backgroundColor = _Color__WEBPACK_IMPORTED_MODULE_1__.Color.ExcaliburBlue;\n this.multiSampleAntialiasing = true;\n this.transparency = true;\n this._isContextLost = false;\n this._disposed = false;\n this._imageToWidth = new Map();\n this._imageToHeight = new Map();\n this.debug = new ExcaliburGraphicsContextWebGLDebug(this);\n this._totalPostProcessorTime = 0;\n const { canvasElement, context, enableTransparency, antialiasing, uvPadding, multiSampleAntialiasing, pixelArtSampler, powerPreference, snapToPixel, backgroundColor, useDrawSorting, garbageCollector, handleContextLost, handleContextRestored } = options;\n this.__gl =\n context !== null && context !== void 0 ? context : canvasElement.getContext('webgl2', {\n antialias: antialiasing !== null && antialiasing !== void 0 ? antialiasing : this.smoothing,\n premultipliedAlpha: false,\n alpha: enableTransparency !== null && enableTransparency !== void 0 ? enableTransparency : this.transparency,\n depth: false,\n powerPreference: powerPreference !== null && powerPreference !== void 0 ? powerPreference : 'high-performance'\n });\n if (!this.__gl) {\n throw Error('Failed to retrieve webgl context from browser');\n }\n if (handleContextLost) {\n this.__gl.canvas.addEventListener('webglcontextlost', handleContextLost, false);\n }\n if (handleContextRestored) {\n this.__gl.canvas.addEventListener('webglcontextrestored', handleContextRestored, false);\n }\n this.__gl.canvas.addEventListener('webglcontextlost', () => {\n this._isContextLost = true;\n });\n this.__gl.canvas.addEventListener('webglcontextrestored', () => {\n this._isContextLost = false;\n });\n this.textureLoader = new _texture_loader__WEBPACK_IMPORTED_MODULE_9__.TextureLoader(this.__gl, garbageCollector);\n this.snapToPixel = snapToPixel !== null && snapToPixel !== void 0 ? snapToPixel : this.snapToPixel;\n this.smoothing = antialiasing !== null && antialiasing !== void 0 ? antialiasing : this.smoothing;\n this.transparency = enableTransparency !== null && enableTransparency !== void 0 ? enableTransparency : this.transparency;\n this.pixelArtSampler = pixelArtSampler !== null && pixelArtSampler !== void 0 ? pixelArtSampler : this.pixelArtSampler;\n this.uvPadding = uvPadding !== null && uvPadding !== void 0 ? uvPadding : this.uvPadding;\n this.multiSampleAntialiasing = typeof multiSampleAntialiasing === 'boolean' ? multiSampleAntialiasing : this.multiSampleAntialiasing;\n this.samples = typeof multiSampleAntialiasing === 'object' ? multiSampleAntialiasing.samples : undefined;\n this.backgroundColor = backgroundColor !== null && backgroundColor !== void 0 ? backgroundColor : this.backgroundColor;\n this.useDrawSorting = useDrawSorting !== null && useDrawSorting !== void 0 ? useDrawSorting : this.useDrawSorting;\n this._drawCallPool.disableWarnings = true;\n this._drawCallPool.preallocate();\n this._init();\n }\n dispose() {\n if (!this._disposed) {\n this._disposed = true;\n this.textureLoader.dispose();\n for (const renderer of this._renderers.values()) {\n renderer.dispose();\n }\n this._renderers.clear();\n this._drawCallPool.dispose();\n this._drawCalls.length = 0;\n this.__gl = null;\n }\n }\n _init() {\n const gl = this.__gl;\n // Setup viewport and view matrix\n this._ortho = _Math_matrix__WEBPACK_IMPORTED_MODULE_10__.Matrix.ortho(0, gl.canvas.width, gl.canvas.height, 0, 400, -400);\n gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);\n // Clear background\n gl.clearColor(this.backgroundColor.r / 255, this.backgroundColor.g / 255, this.backgroundColor.b / 255, this.backgroundColor.a);\n gl.clear(gl.COLOR_BUFFER_BIT);\n // Enable alpha blending\n // https://www.realtimerendering.com/blog/gpus-prefer-premultiplication/\n gl.enable(gl.BLEND);\n gl.blendEquation(gl.FUNC_ADD);\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n gl.blendEquationSeparate(gl.FUNC_ADD, gl.FUNC_ADD);\n gl.blendFuncSeparate(gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n gl.depthMask(false);\n // Setup builtin renderers\n this.register(new _image_renderer_image_renderer__WEBPACK_IMPORTED_MODULE_11__.ImageRenderer({\n uvPadding: this.uvPadding,\n pixelArtSampler: this.pixelArtSampler\n }));\n this.register(new _material_renderer_material_renderer__WEBPACK_IMPORTED_MODULE_12__.MaterialRenderer());\n this.register(new _rectangle_renderer_rectangle_renderer__WEBPACK_IMPORTED_MODULE_13__.RectangleRenderer());\n this.register(new _circle_renderer_circle_renderer__WEBPACK_IMPORTED_MODULE_14__.CircleRenderer());\n this.register(new _point_renderer_point_renderer__WEBPACK_IMPORTED_MODULE_15__.PointRenderer());\n this.register(new _line_renderer_line_renderer__WEBPACK_IMPORTED_MODULE_16__.LineRenderer());\n this.register(new _particle_renderer_particle_renderer__WEBPACK_IMPORTED_MODULE_17__.ParticleRenderer());\n this.register(new _image_renderer_v2_image_renderer_v2__WEBPACK_IMPORTED_MODULE_18__.ImageRendererV2({\n uvPadding: this.uvPadding,\n pixelArtSampler: this.pixelArtSampler\n }));\n this.materialScreenTexture = gl.createTexture();\n if (!this.materialScreenTexture) {\n throw new Error('Could not create screen texture!');\n }\n gl.bindTexture(gl.TEXTURE_2D, this.materialScreenTexture);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT);\n gl.bindTexture(gl.TEXTURE_2D, null);\n this._screenRenderer = new _screen_pass_painter_screen_pass_painter__WEBPACK_IMPORTED_MODULE_19__.ScreenPassPainter(gl);\n this._renderTarget = new _render_target__WEBPACK_IMPORTED_MODULE_20__.RenderTarget({\n gl,\n transparency: this.transparency,\n width: gl.canvas.width,\n height: gl.canvas.height\n });\n this._postProcessTargets = [\n new _render_target__WEBPACK_IMPORTED_MODULE_20__.RenderTarget({\n gl,\n transparency: this.transparency,\n width: gl.canvas.width,\n height: gl.canvas.height\n }),\n new _render_target__WEBPACK_IMPORTED_MODULE_20__.RenderTarget({\n gl,\n transparency: this.transparency,\n width: gl.canvas.width,\n height: gl.canvas.height\n })\n ];\n this._msaaTarget = new _render_target__WEBPACK_IMPORTED_MODULE_20__.RenderTarget({\n gl,\n transparency: this.transparency,\n width: gl.canvas.width,\n height: gl.canvas.height,\n antialias: this.multiSampleAntialiasing,\n samples: this.samples\n });\n }\n register(renderer) {\n this._renderers.set(renderer.type, renderer);\n renderer.initialize(this.__gl, this);\n }\n get(rendererName) {\n return this._renderers.get(rendererName);\n }\n _isCurrentRenderer(renderer) {\n if (!this._currentRenderer || this._currentRenderer === renderer) {\n return true;\n }\n return false;\n }\n beginDrawLifecycle() {\n this._isDrawLifecycle = true;\n }\n endDrawLifecycle() {\n this._isDrawLifecycle = false;\n }\n draw(rendererName, ...args) {\n if (true) {\n if (args.length > 9) {\n throw new Error('Only 10 or less renderer arguments are supported!;');\n }\n }\n if (!this._isDrawLifecycle) {\n this._logger.warnOnce(`Attempting to draw outside the the drawing lifecycle (preDraw/postDraw) is not supported and is a source of bugs/errors.\\n` +\n `If you want to do custom drawing, use Actor.graphics, or any onPreDraw or onPostDraw handler.`);\n }\n if (this._isContextLost) {\n this._logger.errorOnce(`Unable to draw ${rendererName}, the webgl context is lost`);\n return;\n }\n const renderer = this._renderers.get(rendererName);\n if (renderer) {\n if (this.useDrawSorting) {\n const drawCall = this._drawCallPool.get();\n drawCall.z = this._state.current.z;\n drawCall.priority = renderer.priority;\n drawCall.renderer = rendererName;\n this.getTransform().clone(drawCall.transform);\n drawCall.state.z = this._state.current.z;\n drawCall.state.opacity = this._state.current.opacity;\n drawCall.state.tint = this._state.current.tint;\n drawCall.state.material = this._state.current.material;\n drawCall.args[0] = args[0];\n drawCall.args[1] = args[1];\n drawCall.args[2] = args[2];\n drawCall.args[3] = args[3];\n drawCall.args[4] = args[4];\n drawCall.args[5] = args[5];\n drawCall.args[6] = args[6];\n drawCall.args[7] = args[7];\n drawCall.args[8] = args[8];\n drawCall.args[9] = args[9];\n this._drawCalls[this._drawCallIndex++] = drawCall;\n }\n else {\n // Set the current renderer if not defined\n if (!this._currentRenderer) {\n this._currentRenderer = renderer;\n }\n if (!this._isCurrentRenderer(renderer)) {\n // switching graphics means we must flush the previous\n this._currentRenderer.flush();\n }\n // If we are still using the same renderer we can add to the current batch\n renderer.draw(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9]);\n this._currentRenderer = renderer;\n }\n }\n else {\n throw Error(`No renderer with name ${rendererName} has been registered`);\n }\n }\n resetTransform() {\n this._transform.reset();\n }\n updateViewport(resolution) {\n const gl = this.__gl;\n this._ortho = this._ortho = _Math_matrix__WEBPACK_IMPORTED_MODULE_10__.Matrix.ortho(0, resolution.width, resolution.height, 0, 400, -400);\n this._renderTarget.setResolution(gl.canvas.width, gl.canvas.height);\n this._msaaTarget.setResolution(gl.canvas.width, gl.canvas.height);\n this._postProcessTargets[0].setResolution(gl.canvas.width, gl.canvas.height);\n this._postProcessTargets[1].setResolution(gl.canvas.width, gl.canvas.height);\n }\n _getImageWidth(image) {\n let maybeWidth = this._imageToWidth.get(image);\n if (maybeWidth === undefined) {\n maybeWidth = image.width;\n this._imageToWidth.set(image, maybeWidth);\n }\n return maybeWidth;\n }\n _getImageHeight(image) {\n let maybeHeight = this._imageToHeight.get(image);\n if (maybeHeight === undefined) {\n maybeHeight = image.height;\n this._imageToHeight.set(image, maybeHeight);\n }\n return maybeHeight;\n }\n drawImage(image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight) {\n if (swidth === 0 || sheight === 0) {\n return; // zero dimension dest exit early\n }\n else if (dwidth === 0 || dheight === 0) {\n return; // zero dimension dest exit early\n }\n else if (this._getImageWidth(image) === 0 || this._getImageHeight(image) === 0) {\n return; // zero dimension source exit early\n }\n if (!image) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_3__.Logger.getInstance().warn('Cannot draw a null or undefined image');\n // tslint:disable-next-line: no-console\n if (console.trace) {\n // tslint:disable-next-line: no-console\n console.trace();\n }\n return;\n }\n if (this._state.current.material) {\n this.draw('ex.material', image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight);\n }\n else {\n if (this.imageRenderer === 'ex.image') {\n this.draw(this.imageRenderer, image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight);\n }\n else {\n this.draw(this.imageRenderer, image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight);\n }\n }\n }\n drawLine(start, end, color, thickness = 1) {\n this.draw('ex.rectangle', start, end, color, thickness);\n }\n drawRectangle(pos, width, height, color, stroke, strokeThickness) {\n this.draw('ex.rectangle', pos, width, height, color, stroke, strokeThickness);\n }\n drawCircle(pos, radius, color, stroke, thickness) {\n this.draw('ex.circle', pos, radius, color, stroke, thickness);\n }\n save() {\n this._transform.save();\n this._state.save();\n }\n restore() {\n this._transform.restore();\n this._state.restore();\n }\n translate(x, y) {\n this._transform.translate(this.snapToPixel ? ~~(x + pixelSnapEpsilon) : x, this.snapToPixel ? ~~(y + pixelSnapEpsilon) : y);\n }\n rotate(angle) {\n this._transform.rotate(angle);\n }\n scale(x, y) {\n this._transform.scale(x, y);\n }\n transform(matrix) {\n this._transform.current = matrix;\n }\n getTransform() {\n return this._transform.current;\n }\n multiply(m) {\n this._transform.current.multiply(m, this._transform.current);\n }\n addPostProcessor(postprocessor) {\n this._postprocessors.push(postprocessor);\n postprocessor.initialize(this.__gl);\n }\n removePostProcessor(postprocessor) {\n const index = this._postprocessors.indexOf(postprocessor);\n if (index !== -1) {\n this._postprocessors.splice(index, 1);\n }\n }\n clearPostProcessors() {\n this._postprocessors.length = 0;\n }\n updatePostProcessors(elapsed) {\n for (const postprocessor of this._postprocessors) {\n const shader = postprocessor.getShader();\n shader.use();\n const uniforms = shader.getUniforms();\n this._totalPostProcessorTime += elapsed;\n if (uniforms.find((u) => u.name === 'u_time_ms')) {\n shader.setUniformFloat('u_time_ms', this._totalPostProcessorTime);\n }\n if (uniforms.find((u) => u.name === 'u_elapsed_ms')) {\n shader.setUniformFloat('u_elapsed_ms', elapsed);\n }\n if (uniforms.find((u) => u.name === 'u_resolution')) {\n shader.setUniformFloatVector('u_resolution', (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(this.width, this.height));\n }\n if (postprocessor.onUpdate) {\n postprocessor.onUpdate(elapsed);\n }\n }\n }\n set material(material) {\n this._state.current.material = material;\n }\n get material() {\n return this._state.current.material;\n }\n /**\n * Creates and initializes the material which compiles the internal shader\n * @param options\n * @returns Material\n */\n createMaterial(options) {\n const material = new _material__WEBPACK_IMPORTED_MODULE_21__.Material({ ...options, graphicsContext: this });\n return material;\n }\n createShader(options) {\n const gl = this.__gl;\n const { vertexSource, fragmentSource } = options;\n const shader = new _shader__WEBPACK_IMPORTED_MODULE_22__.Shader({\n gl,\n vertexSource,\n fragmentSource\n });\n shader.compile();\n return shader;\n }\n clear() {\n const gl = this.__gl;\n const currentTarget = this.multiSampleAntialiasing ? this._msaaTarget : this._renderTarget;\n currentTarget.use();\n gl.clearColor(this.backgroundColor.r / 255, this.backgroundColor.g / 255, this.backgroundColor.b / 255, this.backgroundColor.a);\n // Clear the context with the newly set color. This is\n // the function call that actually does the drawing.\n gl.clear(gl.COLOR_BUFFER_BIT);\n }\n /**\n * Flushes all batched rendering to the screen\n */\n flush() {\n var _a;\n if (this._isContextLost) {\n this._logger.errorOnce(`Unable to flush the webgl context is lost`);\n return;\n }\n // render target captures all draws and redirects to the render target\n let currentTarget = this.multiSampleAntialiasing ? this._msaaTarget : this._renderTarget;\n currentTarget.use();\n if (this.useDrawSorting) {\n // null out unused draw calls\n for (let i = this._drawCallIndex; i < this._drawCalls.length; i++) {\n this._drawCalls[i] = null;\n }\n // sort draw calls\n // Find the original order of the first instance of the draw call\n const originalSort = new Map();\n for (const [name] of this._renderers) {\n let firstIndex = 0;\n for (firstIndex = 0; firstIndex < this._drawCallIndex; firstIndex++) {\n if (this._drawCalls[firstIndex].renderer === name) {\n break;\n }\n }\n originalSort.set(name, firstIndex);\n }\n this._drawCalls.sort((a, b) => {\n if (a === null || b === null) {\n return 0;\n }\n const zIndex = a.z - b.z;\n const originalSortOrder = originalSort.get(a.renderer) - originalSort.get(b.renderer);\n const priority = a.priority - b.priority;\n if (zIndex === 0) {\n // sort by z first\n if (priority === 0) {\n // sort by priority\n return originalSortOrder; // use the original order to inform draw call packing to maximally preserve painter order\n }\n return priority;\n }\n return zIndex;\n });\n const oldTransform = this._transform.current;\n const oldState = this._state.current;\n if (this._drawCalls.length && this._drawCallIndex) {\n let currentRendererName = this._drawCalls[0].renderer;\n let currentRenderer = this._renderers.get(currentRendererName);\n for (let i = 0; i < this._drawCallIndex; i++) {\n // hydrate the state for renderers\n this._transform.current = this._drawCalls[i].transform;\n this._state.current = this._drawCalls[i].state;\n if (this._drawCalls[i].renderer !== currentRendererName) {\n // switching graphics renderer means we must flush the previous\n currentRenderer.flush();\n currentRendererName = this._drawCalls[i].renderer;\n currentRenderer = this._renderers.get(currentRendererName);\n }\n // ! hack to grab screen texture before materials run because they might want it\n if (currentRenderer instanceof _material_renderer_material_renderer__WEBPACK_IMPORTED_MODULE_12__.MaterialRenderer && ((_a = this.material) === null || _a === void 0 ? void 0 : _a.isUsingScreenTexture)) {\n currentTarget.copyToTexture(this.materialScreenTexture);\n currentTarget.use();\n }\n // If we are still using the same renderer we can add to the current batch\n currentRenderer.draw(...this._drawCalls[i].args);\n }\n if (currentRenderer.hasPendingDraws()) {\n currentRenderer.flush();\n }\n }\n // reset state\n this._transform.current = oldTransform;\n this._state.current = oldState;\n // reclaim draw calls\n this._drawCallPool.done();\n this._drawCallIndex = 0;\n this._imageToHeight.clear();\n this._imageToWidth.clear();\n }\n else {\n // This is the final flush at the moment to draw any leftover pending draw\n for (const renderer of this._renderers.values()) {\n if (renderer.hasPendingDraws()) {\n renderer.flush();\n }\n }\n }\n currentTarget.disable();\n // post process step\n if (this._postprocessors.length > 0) {\n const source = currentTarget.toRenderSource();\n source.use();\n }\n // flip flop render targets for post processing\n for (let i = 0; i < this._postprocessors.length; i++) {\n currentTarget = this._postProcessTargets[i % 2];\n this._postProcessTargets[i % 2].use();\n this._screenRenderer.renderWithPostProcessor(this._postprocessors[i]);\n this._postProcessTargets[i % 2].toRenderSource().use();\n }\n // Final blit to the screen\n currentTarget.blitToScreen();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/circle-renderer/circle-renderer.ts\":\n/*!*************************************************************!*\\\n !*** ./Graphics/Context/circle-renderer/circle-renderer.ts ***!\n \\*************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CircleRenderer: () => (/* binding */ CircleRenderer)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../Color */ \"./Color.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n/* harmony import */ var _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _quad_index_buffer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../quad-index-buffer */ \"./Graphics/Context/quad-index-buffer.ts\");\n/* harmony import */ var _shader__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _vertex_buffer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _vertex_layout__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../vertex-layout */ \"./Graphics/Context/vertex-layout.ts\");\n/* harmony import */ var _circle_renderer_frag_glsl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./circle-renderer.frag.glsl */ \"./Graphics/Context/circle-renderer/circle-renderer.frag.glsl\");\n/* harmony import */ var _circle_renderer_vert_glsl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./circle-renderer.vert.glsl */ \"./Graphics/Context/circle-renderer/circle-renderer.vert.glsl\");\n\n\n\n\n\n\n\n\n\n\nclass CircleRenderer {\n constructor() {\n this.type = 'ex.circle';\n this.priority = 0;\n this._maxCircles = 10922; // max(uint16) / 6 verts\n this._circleCount = 0;\n this._vertexIndex = 0;\n }\n initialize(gl, context) {\n this._gl = gl;\n this._context = context;\n this._shader = new _shader__WEBPACK_IMPORTED_MODULE_0__.Shader({\n gl,\n fragmentSource: _circle_renderer_frag_glsl__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n vertexSource: _circle_renderer_vert_glsl__WEBPACK_IMPORTED_MODULE_2__[\"default\"]\n });\n this._shader.compile();\n // setup uniforms\n this._shader.use();\n this._shader.setUniformMatrix('u_matrix', context.ortho);\n this._buffer = new _vertex_buffer__WEBPACK_IMPORTED_MODULE_3__.VertexBuffer({\n gl,\n size: 14 * 4 * this._maxCircles,\n type: 'dynamic'\n });\n this._layout = new _vertex_layout__WEBPACK_IMPORTED_MODULE_4__.VertexLayout({\n gl,\n shader: this._shader,\n vertexBuffer: this._buffer,\n attributes: [\n ['a_position', 2],\n ['a_uv', 2],\n ['a_opacity', 1],\n ['a_color', 4],\n ['a_strokeColor', 4],\n ['a_strokeThickness', 1]\n ]\n });\n this._quads = new _quad_index_buffer__WEBPACK_IMPORTED_MODULE_5__.QuadIndexBuffer(gl, this._maxCircles, true);\n }\n dispose() {\n this._buffer.dispose();\n this._quads.dispose();\n this._shader.dispose();\n this._context = null;\n this._gl = null;\n }\n _isFull() {\n if (this._circleCount >= this._maxCircles) {\n return true;\n }\n return false;\n }\n draw(pos, radius, color, stroke = _Color__WEBPACK_IMPORTED_MODULE_6__.Color.Transparent, strokeThickness = 0) {\n if (this._isFull()) {\n this.flush();\n }\n this._circleCount++;\n // transform based on current context\n const transform = this._context.getTransform();\n const opacity = this._context.opacity;\n const snapToPixel = this._context.snapToPixel;\n const topLeft = transform.multiply(pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_7__.vec)(-radius, -radius)));\n const topRight = transform.multiply(pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_7__.vec)(radius, -radius)));\n const bottomRight = transform.multiply(pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_7__.vec)(radius, radius)));\n const bottomLeft = transform.multiply(pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_7__.vec)(-radius, radius)));\n if (snapToPixel) {\n topLeft.x = ~~(topLeft.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n topLeft.y = ~~(topLeft.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n topRight.x = ~~(topRight.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n topRight.y = ~~(topRight.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n bottomLeft.x = ~~(bottomLeft.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n bottomLeft.y = ~~(bottomLeft.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n bottomRight.x = ~~(bottomRight.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n bottomRight.y = ~~(bottomRight.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n }\n // TODO UV could be static vertex buffer\n const uvx0 = 0;\n const uvy0 = 0;\n const uvx1 = 1;\n const uvy1 = 1;\n // update data\n const vertexBuffer = this._layout.vertexBuffer.bufferData;\n // (0, 0) - 0\n vertexBuffer[this._vertexIndex++] = topLeft.x;\n vertexBuffer[this._vertexIndex++] = topLeft.y;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness / radius;\n // (0, 1) - 1\n vertexBuffer[this._vertexIndex++] = bottomLeft.x;\n vertexBuffer[this._vertexIndex++] = bottomLeft.y;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness / radius;\n // (1, 0) - 2\n vertexBuffer[this._vertexIndex++] = topRight.x;\n vertexBuffer[this._vertexIndex++] = topRight.y;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness / radius;\n // (1, 1) - 3\n vertexBuffer[this._vertexIndex++] = bottomRight.x;\n vertexBuffer[this._vertexIndex++] = bottomRight.y;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness / radius;\n }\n hasPendingDraws() {\n return this._circleCount !== 0;\n }\n flush() {\n // nothing to draw early exit\n if (this._circleCount === 0) {\n return;\n }\n const gl = this._gl;\n // Bind the shader\n this._shader.use();\n // Bind the memory layout and upload data\n this._layout.use(true);\n // Update ortho matrix uniform\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n // Bind index buffer\n this._quads.bind();\n // Draw all the quads\n gl.drawElements(gl.TRIANGLES, this._circleCount * 6, this._quads.bufferGlType, 0);\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_9__.GraphicsDiagnostics.DrawnImagesCount += this._circleCount;\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_9__.GraphicsDiagnostics.DrawCallCount++;\n // Reset\n this._circleCount = 0;\n this._vertexIndex = 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/debug-text.ts\":\n/*!****************************************!*\\\n !*** ./Graphics/Context/debug-text.ts ***!\n \\****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DebugText: () => (/* binding */ DebugText)\n/* harmony export */ });\n/* harmony import */ var _ImageSource__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ImageSource */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _SpriteFont__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../SpriteFont */ \"./Graphics/SpriteFont.ts\");\n/* harmony import */ var _SpriteSheet__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../SpriteSheet */ \"./Graphics/SpriteSheet.ts\");\n/* harmony import */ var _debug_font_png__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./debug-font.png */ \"./Graphics/Context/debug-font.png\");\n\n\n\n\n/**\n * Internal debug text helper\n */\nclass DebugText {\n constructor() {\n /**\n * base64 font\n */\n this.fontSheet = _debug_font_png__WEBPACK_IMPORTED_MODULE_0__[\"default\"];\n this.size = 16;\n // We fire and forget, we don't care if it's loaded or not\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.load();\n }\n load() {\n this._imageSource = new _ImageSource__WEBPACK_IMPORTED_MODULE_1__.ImageSource(this.fontSheet);\n return this._imageSource.load().then(() => {\n this._spriteSheet = _SpriteSheet__WEBPACK_IMPORTED_MODULE_2__.SpriteSheet.fromImageSource({\n image: this._imageSource,\n grid: {\n rows: 4,\n columns: 16,\n spriteWidth: 16,\n spriteHeight: 16\n }\n });\n this._spriteFont = new _SpriteFont__WEBPACK_IMPORTED_MODULE_3__.SpriteFont({\n alphabet: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ,!\\'&.\"?-()+# ',\n caseInsensitive: true,\n spriteSheet: this._spriteSheet,\n spacing: -6\n });\n });\n }\n /**\n * Writes debug text using the built in sprint font\n * @param ctx\n * @param text\n * @param pos\n */\n write(ctx, text, pos) {\n if (this._imageSource.isLoaded()) {\n this._spriteFont.render(ctx, text, null, pos.x, pos.y);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/draw-call.ts\":\n/*!***************************************!*\\\n !*** ./Graphics/Context/draw-call.ts ***!\n \\***************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DrawCall: () => (/* binding */ DrawCall)\n/* harmony export */ });\n/* harmony import */ var _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/affine-matrix */ \"./Math/affine-matrix.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Color */ \"./Color.ts\");\n\n\nclass DrawCall {\n constructor() {\n this.z = 0;\n this.priority = 0;\n this.renderer = '';\n this.transform = _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_0__.AffineMatrix.identity();\n this.state = {\n z: 0,\n opacity: 1,\n tint: _Color__WEBPACK_IMPORTED_MODULE_1__.Color.White,\n material: null\n };\n this.args = new Array(10);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/image-renderer-v2/image-renderer-v2.ts\":\n/*!*****************************************************************!*\\\n !*** ./Graphics/Context/image-renderer-v2/image-renderer-v2.ts ***!\n \\*****************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ImageRendererV2: () => (/* binding */ ImageRendererV2)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Color */ \"./Color.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n/* harmony import */ var _ImageSource__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../ImageSource */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../Wrapping */ \"./Graphics/Wrapping.ts\");\n/* harmony import */ var _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _shader__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _vertex_buffer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _webgl_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../webgl-util */ \"./Graphics/Context/webgl-util.ts\");\n/* harmony import */ var _image_renderer_v2_frag_glsl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./image-renderer-v2.frag.glsl */ \"./Graphics/Context/image-renderer-v2/image-renderer-v2.frag.glsl\");\n/* harmony import */ var _image_renderer_v2_vert_glsl__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./image-renderer-v2.vert.glsl */ \"./Graphics/Context/image-renderer-v2/image-renderer-v2.vert.glsl\");\n// import { Color } from '../../../Color';\n// import { parseImageFiltering } from '../../Filtering';\n\n\n\n\n\n\n\n\n\n\n\nclass ImageRendererV2 {\n constructor(options) {\n this.type = 'ex.image-v2';\n this.priority = 0;\n // TODO this could be bigger probably\n this._maxImages = 20000; // max(uint16) / 6 verts\n this._maxTextures = 0;\n this._components = 2 + 2 + 2 + 2 + 1 + 2 + 2 + 1 + 2 + 2 + 4;\n // Per flush vars\n this._imageCount = 0;\n this._textures = [];\n this._textureIndex = 0;\n this._textureToIndex = new Map();\n this._images = new Set();\n this._vertexIndex = 0;\n this._imageToWidth = new Map();\n this._imageToHeight = new Map();\n this._view = [0, 0, 0, 0];\n this._dest = [0, 0];\n this._defaultTint = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.White;\n this.pixelArtSampler = options.pixelArtSampler;\n this.uvPadding = options.uvPadding;\n }\n initialize(gl, context) {\n this._gl = gl;\n this._context = context;\n // Transform shader source\n const maxTexture = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS);\n const maxComplexity = (0,_webgl_util__WEBPACK_IMPORTED_MODULE_1__.getMaxShaderComplexity)(gl, maxTexture);\n this._maxTextures = Math.min(maxTexture, maxComplexity);\n const transformedFrag = this._transformFragmentSource(_image_renderer_v2_frag_glsl__WEBPACK_IMPORTED_MODULE_2__[\"default\"], this._maxTextures);\n // Compile shader\n this._shader = new _shader__WEBPACK_IMPORTED_MODULE_3__.Shader({\n gl,\n fragmentSource: transformedFrag,\n vertexSource: _image_renderer_v2_vert_glsl__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n });\n this._shader.compile();\n // setup uniforms\n this._shader.use();\n this._shader.setUniformMatrix('u_matrix', context.ortho);\n // Initialize texture slots to [0, 1, 2, 3, 4, .... maxGPUTextures]\n this._shader.setUniformIntArray('u_textures', [...Array(this._maxTextures)].map((_, i) => i));\n this._vao = gl.createVertexArray();\n gl.bindVertexArray(this._vao);\n this._quadMesh = new Float32Array([\n // pos uv\n 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0,\n 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1\n ]);\n this._meshBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this._meshBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, this._quadMesh, gl.STATIC_DRAW);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 16, 0);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(1, 2, gl.FLOAT, false, 16, 8);\n gl.enableVertexAttribArray(1);\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n // Setup memory layout\n const components = this._components;\n this._transformData = new _vertex_buffer__WEBPACK_IMPORTED_MODULE_5__.VertexBuffer({\n gl,\n size: components * this._maxImages, // components * images\n type: 'dynamic'\n });\n this._transformData.bind();\n // attributes\n let offset = 0;\n let start = 2;\n const bytesPerFloat = 4;\n const totalSize = components * 4;\n // a_offset vec2 - 2\n gl.vertexAttribPointer(start++, 2, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(2);\n offset += 2 * bytesPerFloat;\n // a_mat_column1 vec2 - 2\n gl.vertexAttribPointer(start++, 2, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(3);\n offset += 2 * bytesPerFloat;\n // a_mat_column2 vec2 - 2\n gl.vertexAttribPointer(start++, 2, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(4);\n offset += 2 * bytesPerFloat;\n // a_mat_column3 vec2 - 2\n gl.vertexAttribPointer(start++, 2, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(5);\n offset += 2 * bytesPerFloat;\n // a_opacity float - 1\n gl.vertexAttribPointer(start++, 1, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(6);\n offset += 1 * bytesPerFloat;\n // a_res vec2 - 2\n gl.vertexAttribPointer(start++, 2, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(7);\n offset += 2 * bytesPerFloat;\n // a_size vec2 - 2\n gl.vertexAttribPointer(start++, 2, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(8);\n offset += 2 * bytesPerFloat;\n // a_texture_index - 1\n gl.vertexAttribPointer(start++, 1, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(9);\n offset += 1 * bytesPerFloat;\n // a_uv_min - 2\n gl.vertexAttribPointer(start++, 2, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(10);\n offset += 2 * bytesPerFloat;\n // a_uv_max - 2\n gl.vertexAttribPointer(start++, 2, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(11);\n offset += 2 * bytesPerFloat;\n // a_tint - 4\n gl.vertexAttribPointer(start++, 4, gl.FLOAT, false, totalSize, offset);\n gl.enableVertexAttribArray(12);\n offset += 4 * bytesPerFloat;\n gl.vertexAttribDivisor(2, 1);\n gl.vertexAttribDivisor(3, 1);\n gl.vertexAttribDivisor(4, 1);\n gl.vertexAttribDivisor(5, 1);\n gl.vertexAttribDivisor(6, 1);\n gl.vertexAttribDivisor(7, 1);\n gl.vertexAttribDivisor(8, 1);\n gl.vertexAttribDivisor(9, 1);\n gl.vertexAttribDivisor(10, 1);\n gl.vertexAttribDivisor(11, 1);\n gl.vertexAttribDivisor(12, 1);\n gl.bindVertexArray(null);\n }\n _bindData(gl) {\n // Setup memory layout\n const components = this._components;\n this._transformData.bind();\n this._transformData.upload(components * this._imageCount);\n gl.bindVertexArray(this._vao);\n }\n dispose() {\n this._transformData.dispose();\n this._shader.dispose();\n this._textures.length = 0;\n this._context = null;\n this._gl = null;\n }\n _transformFragmentSource(source, maxTextures) {\n let newSource = source.replace('%%count%%', maxTextures.toString());\n let texturePickerBuilder = '';\n for (let i = 0; i < maxTextures; i++) {\n if (i === 0) {\n texturePickerBuilder += `if (v_texture_index <= ${i}.5) {\\n`;\n }\n else {\n texturePickerBuilder += ` else if (v_texture_index <= ${i}.5) {\\n`;\n }\n texturePickerBuilder += ` color = texture(u_textures[${i}], uv);\\n`;\n texturePickerBuilder += ` }\\n`;\n }\n newSource = newSource.replace('%%texture_picker%%', texturePickerBuilder);\n return newSource;\n }\n _addImageAsTexture(image) {\n if (this._images.has(image)) {\n return;\n }\n const maybeFiltering = image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_6__.ImageSourceAttributeConstants.Filtering);\n const filtering = maybeFiltering ? (0,_Filtering__WEBPACK_IMPORTED_MODULE_7__.parseImageFiltering)(maybeFiltering) : undefined;\n const wrapX = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_8__.parseImageWrapping)(image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_6__.ImageSourceAttributeConstants.WrappingX));\n const wrapY = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_8__.parseImageWrapping)(image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_6__.ImageSourceAttributeConstants.WrappingY));\n const force = image.getAttribute('forceUpload') === 'true' ? true : false;\n const texture = this._context.textureLoader.load(image, {\n filtering,\n wrapping: { x: wrapX, y: wrapY }\n }, force);\n // remove force attribute after upload\n image.removeAttribute('forceUpload');\n if (this._textures.indexOf(texture) === -1) {\n this._textures.push(texture);\n this._textureToIndex.set(texture, this._textureIndex++);\n this._images.add(image);\n }\n }\n _bindTextures(gl) {\n // Bind textures in the correct order\n const max = Math.min(this._textureIndex, this._maxTextures);\n for (let i = 0; i < max; i++) {\n gl.activeTexture(gl.TEXTURE0 + i);\n gl.bindTexture(gl.TEXTURE_2D, this._textures[i] || this._textures[0]);\n }\n }\n _getTextureIdForImage(image) {\n var _a;\n if (image) {\n const maybeTexture = this._context.textureLoader.get(image);\n return (_a = this._textureToIndex.get(maybeTexture)) !== null && _a !== void 0 ? _a : -1; //this._textures.indexOf(maybeTexture);\n }\n return -1;\n }\n _isFull() {\n if (this._imageCount >= this._maxImages) {\n return true;\n }\n if (this._textures.length >= this._maxTextures) {\n return true;\n }\n return false;\n }\n _getImageWidth(image) {\n let maybeWidth = this._imageToWidth.get(image);\n if (maybeWidth === undefined) {\n maybeWidth = image.width;\n this._imageToWidth.set(image, maybeWidth);\n }\n return maybeWidth;\n }\n _getImageHeight(image) {\n let maybeHeight = this._imageToHeight.get(image);\n if (maybeHeight === undefined) {\n maybeHeight = image.height;\n this._imageToHeight.set(image, maybeHeight);\n }\n return maybeHeight;\n }\n draw(image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight) {\n var _a, _b, _c, _d;\n // Force a render if the batch is full\n if (this._isFull()) {\n this.flush();\n }\n this._imageCount++;\n // This creates and uploads the texture if not already done\n this._addImageAsTexture(image);\n const maybeImageWidth = this._getImageWidth(image);\n const maybeImageHeight = this._getImageHeight(image);\n let width = maybeImageWidth || swidth || 0;\n let height = maybeImageHeight || sheight || 0;\n this._view[0] = 0;\n this._view[1] = 0;\n this._view[2] = (_a = swidth !== null && swidth !== void 0 ? swidth : maybeImageWidth) !== null && _a !== void 0 ? _a : 0;\n this._view[3] = (_b = sheight !== null && sheight !== void 0 ? sheight : maybeImageHeight) !== null && _b !== void 0 ? _b : 0;\n this._dest[0] = sx !== null && sx !== void 0 ? sx : 1;\n this._dest[1] = sy !== null && sy !== void 0 ? sy : 1;\n // If destination is specified, update view and dest\n if (dx !== undefined && dy !== undefined && dwidth !== undefined && dheight !== undefined) {\n this._view[0] = sx !== null && sx !== void 0 ? sx : 1;\n this._view[1] = sy !== null && sy !== void 0 ? sy : 1;\n this._view[2] = (_c = swidth !== null && swidth !== void 0 ? swidth : maybeImageWidth) !== null && _c !== void 0 ? _c : 0;\n this._view[3] = (_d = sheight !== null && sheight !== void 0 ? sheight : maybeImageHeight) !== null && _d !== void 0 ? _d : 0;\n this._dest[0] = dx;\n this._dest[1] = dy;\n width = dwidth;\n height = dheight;\n }\n sx = this._view[0];\n sy = this._view[1];\n const sw = this._view[2];\n const sh = this._view[3];\n // transform based on current context\n const transform = this._context.getTransform();\n const opacity = this._context.opacity;\n const snapToPixel = this._context.snapToPixel;\n if (snapToPixel) {\n this._dest[0] = ~~(this._dest[0] + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_9__.pixelSnapEpsilon);\n this._dest[1] = ~~(this._dest[1] + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_9__.pixelSnapEpsilon);\n }\n const tint = this._context.tint || this._defaultTint;\n const textureId = this._getTextureIdForImage(image);\n const imageWidth = maybeImageWidth || width;\n const imageHeight = maybeImageHeight || height;\n const uvx0 = (sx + this.uvPadding) / imageWidth;\n const uvy0 = (sy + this.uvPadding) / imageHeight;\n const uvx1 = (sx + sw - this.uvPadding) / imageWidth;\n const uvy1 = (sy + sh - this.uvPadding) / imageHeight;\n const txWidth = maybeImageWidth;\n const txHeight = maybeImageHeight;\n // update data\n const vertexBuffer = this._transformData.bufferData;\n vertexBuffer[this._vertexIndex++] = this._dest[0];\n vertexBuffer[this._vertexIndex++] = this._dest[1];\n vertexBuffer[this._vertexIndex++] = transform.data[0];\n vertexBuffer[this._vertexIndex++] = transform.data[1];\n vertexBuffer[this._vertexIndex++] = transform.data[2];\n vertexBuffer[this._vertexIndex++] = transform.data[3];\n vertexBuffer[this._vertexIndex++] = transform.data[4];\n vertexBuffer[this._vertexIndex++] = transform.data[5];\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = width;\n vertexBuffer[this._vertexIndex++] = height;\n vertexBuffer[this._vertexIndex++] = txWidth;\n vertexBuffer[this._vertexIndex++] = txHeight;\n vertexBuffer[this._vertexIndex++] = textureId;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = tint.r / 255;\n vertexBuffer[this._vertexIndex++] = tint.g / 255;\n vertexBuffer[this._vertexIndex++] = tint.b / 255;\n vertexBuffer[this._vertexIndex++] = tint.a;\n }\n hasPendingDraws() {\n return this._imageCount !== 0;\n }\n flush() {\n // nothing to draw early exit\n if (this._imageCount === 0) {\n return;\n }\n const gl = this._gl;\n // Bind the shader\n this._shader.use();\n // Bind the memory layout and upload data\n this._bindData(gl);\n // Update ortho matrix uniform\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n // Turn on pixel art aa sampler\n this._shader.setUniformBoolean('u_pixelart', this.pixelArtSampler);\n // Bind textures to\n this._bindTextures(gl);\n // Draw all the quads\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 6, this._imageCount);\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_10__.GraphicsDiagnostics.DrawnImagesCount += this._imageCount;\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_10__.GraphicsDiagnostics.DrawCallCount++;\n gl.bindVertexArray(null);\n // Reset\n this._imageCount = 0;\n this._vertexIndex = 0;\n this._textures.length = 0;\n this._textureIndex = 0;\n this._textureToIndex.clear();\n this._images.clear();\n this._imageToWidth.clear();\n this._imageToHeight.clear();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/image-renderer/image-renderer.ts\":\n/*!***********************************************************!*\\\n !*** ./Graphics/Context/image-renderer/image-renderer.ts ***!\n \\***********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ImageRenderer: () => (/* binding */ ImageRenderer)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Color */ \"./Color.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n/* harmony import */ var _ImageSource__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../ImageSource */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../Wrapping */ \"./Graphics/Wrapping.ts\");\n/* harmony import */ var _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _quad_index_buffer__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../quad-index-buffer */ \"./Graphics/Context/quad-index-buffer.ts\");\n/* harmony import */ var _shader__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _vertex_buffer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _vertex_layout__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../vertex-layout */ \"./Graphics/Context/vertex-layout.ts\");\n/* harmony import */ var _webgl_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../webgl-util */ \"./Graphics/Context/webgl-util.ts\");\n/* harmony import */ var _image_renderer_frag_glsl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./image-renderer.frag.glsl */ \"./Graphics/Context/image-renderer/image-renderer.frag.glsl\");\n/* harmony import */ var _image_renderer_vert_glsl__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./image-renderer.vert.glsl */ \"./Graphics/Context/image-renderer/image-renderer.vert.glsl\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass ImageRenderer {\n constructor(options) {\n this.type = 'ex.image';\n this.priority = 0;\n this._maxImages = 10922; // max(uint16) / 6 verts\n this._maxTextures = 0;\n // Per flush vars\n this._imageCount = 0;\n this._textures = [];\n this._textureIndex = 0;\n this._textureToIndex = new Map();\n this._images = new Set();\n this._vertexIndex = 0;\n this._imageToWidth = new Map();\n this._imageToHeight = new Map();\n this._view = [0, 0, 0, 0];\n this._dest = [0, 0];\n this._quad = [0, 0, 0, 0, 0, 0, 0, 0];\n this._defaultTint = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.White;\n this.pixelArtSampler = options.pixelArtSampler;\n this.uvPadding = options.uvPadding;\n }\n initialize(gl, context) {\n this._gl = gl;\n this._context = context;\n // Transform shader source\n // FIXME: PIXEL 6 complains `ERROR: Expression too complex.` if we use it's reported max texture units, 125 seems to work for now...\n const maxTexture = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS);\n const maxComplexity = (0,_webgl_util__WEBPACK_IMPORTED_MODULE_1__.getMaxShaderComplexity)(gl, maxTexture);\n this._maxTextures = Math.min(maxTexture, maxComplexity);\n const transformedFrag = this._transformFragmentSource(_image_renderer_frag_glsl__WEBPACK_IMPORTED_MODULE_2__[\"default\"], this._maxTextures);\n // Compile shader\n this._shader = new _shader__WEBPACK_IMPORTED_MODULE_3__.Shader({\n gl,\n fragmentSource: transformedFrag,\n vertexSource: _image_renderer_vert_glsl__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n });\n this._shader.compile();\n // setup uniforms\n this._shader.use();\n this._shader.setUniformMatrix('u_matrix', context.ortho);\n // Initialize texture slots to [0, 1, 2, 3, 4, .... maxGPUTextures]\n this._shader.setUniformIntArray('u_textures', [...Array(this._maxTextures)].map((_, i) => i));\n // Setup memory layout\n this._buffer = new _vertex_buffer__WEBPACK_IMPORTED_MODULE_5__.VertexBuffer({\n gl,\n size: 12 * 4 * this._maxImages, // 12 components * 4 verts\n type: 'dynamic'\n });\n this._layout = new _vertex_layout__WEBPACK_IMPORTED_MODULE_6__.VertexLayout({\n gl,\n shader: this._shader,\n vertexBuffer: this._buffer,\n attributes: [\n ['a_position', 2],\n ['a_opacity', 1],\n ['a_res', 2],\n ['a_texcoord', 2],\n ['a_textureIndex', 1],\n ['a_tint', 4]\n ]\n });\n // Setup index buffer\n this._quads = new _quad_index_buffer__WEBPACK_IMPORTED_MODULE_7__.QuadIndexBuffer(gl, this._maxImages, true);\n }\n dispose() {\n this._buffer.dispose();\n this._quads.dispose();\n this._shader.dispose();\n this._textures.length = 0;\n this._context = null;\n this._gl = null;\n }\n _transformFragmentSource(source, maxTextures) {\n let newSource = source.replace('%%count%%', maxTextures.toString());\n let texturePickerBuilder = '';\n for (let i = 0; i < maxTextures; i++) {\n if (i === 0) {\n texturePickerBuilder += `if (v_textureIndex <= ${i}.5) {\\n`;\n }\n else {\n texturePickerBuilder += ` else if (v_textureIndex <= ${i}.5) {\\n`;\n }\n texturePickerBuilder += ` vec2 uv = u_pixelart ? uv_iq(v_texcoord, v_res) : v_texcoord;\\n`;\n texturePickerBuilder += ` color = texture(u_textures[${i}], uv);\\n`;\n texturePickerBuilder += ` }\\n`;\n }\n newSource = newSource.replace('%%texture_picker%%', texturePickerBuilder);\n return newSource;\n }\n _addImageAsTexture(image) {\n if (this._images.has(image)) {\n return;\n }\n const maybeFiltering = image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_8__.ImageSourceAttributeConstants.Filtering);\n const filtering = maybeFiltering ? (0,_Filtering__WEBPACK_IMPORTED_MODULE_9__.parseImageFiltering)(maybeFiltering) : undefined;\n const wrapX = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_10__.parseImageWrapping)(image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_8__.ImageSourceAttributeConstants.WrappingX));\n const wrapY = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_10__.parseImageWrapping)(image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_8__.ImageSourceAttributeConstants.WrappingY));\n const force = image.getAttribute('forceUpload') === 'true' ? true : false;\n const texture = this._context.textureLoader.load(image, {\n filtering,\n wrapping: { x: wrapX, y: wrapY }\n }, force);\n // remove force attribute after upload\n image.removeAttribute('forceUpload');\n if (this._textures.indexOf(texture) === -1) {\n this._textures.push(texture);\n this._textureToIndex.set(texture, this._textureIndex++);\n this._images.add(image);\n }\n }\n _bindTextures(gl) {\n // Bind textures in the correct order\n for (let i = 0; i < this._maxTextures; i++) {\n gl.activeTexture(gl.TEXTURE0 + i);\n gl.bindTexture(gl.TEXTURE_2D, this._textures[i] || this._textures[0]);\n }\n }\n _getTextureIdForImage(image) {\n var _a;\n if (image) {\n const maybeTexture = this._context.textureLoader.get(image);\n return (_a = this._textureToIndex.get(maybeTexture)) !== null && _a !== void 0 ? _a : -1; //this._textures.indexOf(maybeTexture);\n }\n return -1;\n }\n _isFull() {\n if (this._imageCount >= this._maxImages) {\n return true;\n }\n if (this._textures.length >= this._maxTextures) {\n return true;\n }\n return false;\n }\n _getImageWidth(image) {\n let maybeWidth = this._imageToWidth.get(image);\n if (maybeWidth === undefined) {\n maybeWidth = image.width;\n this._imageToWidth.set(image, maybeWidth);\n }\n return maybeWidth;\n }\n _getImageHeight(image) {\n let maybeHeight = this._imageToHeight.get(image);\n if (maybeHeight === undefined) {\n maybeHeight = image.height;\n this._imageToHeight.set(image, maybeHeight);\n }\n return maybeHeight;\n }\n draw(image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight) {\n var _a, _b, _c, _d;\n // Force a render if the batch is full\n if (this._isFull()) {\n this.flush();\n }\n this._imageCount++;\n // This creates and uploads the texture if not already done\n this._addImageAsTexture(image);\n const maybeImageWidth = this._getImageWidth(image);\n const maybeImageHeight = this._getImageHeight(image);\n let width = maybeImageWidth || swidth || 0;\n let height = maybeImageHeight || sheight || 0;\n this._view[0] = 0;\n this._view[1] = 0;\n this._view[2] = (_a = swidth !== null && swidth !== void 0 ? swidth : maybeImageWidth) !== null && _a !== void 0 ? _a : 0;\n this._view[3] = (_b = sheight !== null && sheight !== void 0 ? sheight : maybeImageHeight) !== null && _b !== void 0 ? _b : 0;\n this._dest[0] = sx !== null && sx !== void 0 ? sx : 1;\n this._dest[1] = sy !== null && sy !== void 0 ? sy : 1;\n // If destination is specified, update view and dest\n if (dx !== undefined && dy !== undefined && dwidth !== undefined && dheight !== undefined) {\n this._view[0] = sx !== null && sx !== void 0 ? sx : 1;\n this._view[1] = sy !== null && sy !== void 0 ? sy : 1;\n this._view[2] = (_c = swidth !== null && swidth !== void 0 ? swidth : maybeImageWidth) !== null && _c !== void 0 ? _c : 0;\n this._view[3] = (_d = sheight !== null && sheight !== void 0 ? sheight : maybeImageHeight) !== null && _d !== void 0 ? _d : 0;\n this._dest[0] = dx;\n this._dest[1] = dy;\n width = dwidth;\n height = dheight;\n }\n sx = this._view[0];\n sy = this._view[1];\n const sw = this._view[2];\n const sh = this._view[3];\n // transform based on current context\n const transform = this._context.getTransform();\n const opacity = this._context.opacity;\n const snapToPixel = this._context.snapToPixel;\n // top left\n this._quad[0] = this._dest[0];\n this._quad[1] = this._dest[1];\n // top right\n this._quad[2] = this._dest[0] + width;\n this._quad[3] = this._dest[1];\n // bottom left\n this._quad[4] = this._dest[0];\n this._quad[5] = this._dest[1] + height;\n // bottom right\n this._quad[6] = this._dest[0] + width;\n this._quad[7] = this._dest[1] + height;\n transform.multiplyQuadInPlace(this._quad);\n if (snapToPixel) {\n this._quad[0] = ~~(this._quad[0] + (0,_Math_util__WEBPACK_IMPORTED_MODULE_11__.sign)(this._quad[0]) * _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__.pixelSnapEpsilon);\n this._quad[1] = ~~(this._quad[1] + (0,_Math_util__WEBPACK_IMPORTED_MODULE_11__.sign)(this._quad[1]) * _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__.pixelSnapEpsilon);\n this._quad[2] = ~~(this._quad[2] + (0,_Math_util__WEBPACK_IMPORTED_MODULE_11__.sign)(this._quad[2]) * _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__.pixelSnapEpsilon);\n this._quad[3] = ~~(this._quad[3] + (0,_Math_util__WEBPACK_IMPORTED_MODULE_11__.sign)(this._quad[3]) * _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__.pixelSnapEpsilon);\n this._quad[4] = ~~(this._quad[4] + (0,_Math_util__WEBPACK_IMPORTED_MODULE_11__.sign)(this._quad[4]) * _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__.pixelSnapEpsilon);\n this._quad[5] = ~~(this._quad[5] + (0,_Math_util__WEBPACK_IMPORTED_MODULE_11__.sign)(this._quad[5]) * _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__.pixelSnapEpsilon);\n this._quad[6] = ~~(this._quad[6] + (0,_Math_util__WEBPACK_IMPORTED_MODULE_11__.sign)(this._quad[6]) * _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__.pixelSnapEpsilon);\n this._quad[7] = ~~(this._quad[7] + (0,_Math_util__WEBPACK_IMPORTED_MODULE_11__.sign)(this._quad[7]) * _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_12__.pixelSnapEpsilon);\n }\n const tint = this._context.tint || this._defaultTint;\n const textureId = this._getTextureIdForImage(image);\n const imageWidth = maybeImageWidth || width;\n const imageHeight = maybeImageHeight || height;\n const uvx0 = (sx + this.uvPadding) / imageWidth;\n const uvy0 = (sy + this.uvPadding) / imageHeight;\n const uvx1 = (sx + sw - this.uvPadding) / imageWidth;\n const uvy1 = (sy + sh - this.uvPadding) / imageHeight;\n const txWidth = maybeImageWidth;\n const txHeight = maybeImageHeight;\n // update data\n const vertexBuffer = this._layout.vertexBuffer.bufferData;\n // (0, 0) - 0\n vertexBuffer[this._vertexIndex++] = this._quad[0];\n vertexBuffer[this._vertexIndex++] = this._quad[1];\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = txWidth;\n vertexBuffer[this._vertexIndex++] = txHeight;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = textureId;\n vertexBuffer[this._vertexIndex++] = tint.r / 255;\n vertexBuffer[this._vertexIndex++] = tint.g / 255;\n vertexBuffer[this._vertexIndex++] = tint.b / 255;\n vertexBuffer[this._vertexIndex++] = tint.a;\n // (0, 1) - 1\n vertexBuffer[this._vertexIndex++] = this._quad[4];\n vertexBuffer[this._vertexIndex++] = this._quad[5];\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = txWidth;\n vertexBuffer[this._vertexIndex++] = txHeight;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = textureId;\n vertexBuffer[this._vertexIndex++] = tint.r / 255;\n vertexBuffer[this._vertexIndex++] = tint.g / 255;\n vertexBuffer[this._vertexIndex++] = tint.b / 255;\n vertexBuffer[this._vertexIndex++] = tint.a;\n // (1, 0) - 2\n vertexBuffer[this._vertexIndex++] = this._quad[2];\n vertexBuffer[this._vertexIndex++] = this._quad[3];\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = txWidth;\n vertexBuffer[this._vertexIndex++] = txHeight;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = textureId;\n vertexBuffer[this._vertexIndex++] = tint.r / 255;\n vertexBuffer[this._vertexIndex++] = tint.g / 255;\n vertexBuffer[this._vertexIndex++] = tint.b / 255;\n vertexBuffer[this._vertexIndex++] = tint.a;\n // (1, 1) - 3\n vertexBuffer[this._vertexIndex++] = this._quad[6];\n vertexBuffer[this._vertexIndex++] = this._quad[7];\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = txWidth;\n vertexBuffer[this._vertexIndex++] = txHeight;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = textureId;\n vertexBuffer[this._vertexIndex++] = tint.r / 255;\n vertexBuffer[this._vertexIndex++] = tint.g / 255;\n vertexBuffer[this._vertexIndex++] = tint.b / 255;\n vertexBuffer[this._vertexIndex++] = tint.a;\n }\n hasPendingDraws() {\n return this._imageCount !== 0;\n }\n flush() {\n // nothing to draw early exit\n if (this._imageCount === 0) {\n return;\n }\n const gl = this._gl;\n // Bind the shader\n this._shader.use();\n // Bind the memory layout and upload data\n this._layout.use(true, 4 * 12 * this._imageCount); // 4 verts * 12 components\n // Update ortho matrix uniform\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n // Turn on pixel art aa sampler\n this._shader.setUniformBoolean('u_pixelart', this.pixelArtSampler);\n // Bind textures to\n this._bindTextures(gl);\n // Bind index buffer\n this._quads.bind();\n // Draw all the quads\n gl.drawElements(gl.TRIANGLES, this._imageCount * 6, this._quads.bufferGlType, 0);\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_13__.GraphicsDiagnostics.DrawnImagesCount += this._imageCount;\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_13__.GraphicsDiagnostics.DrawCallCount++;\n // Reset\n this._imageCount = 0;\n this._vertexIndex = 0;\n this._textures.length = 0;\n this._textureIndex = 0;\n this._textureToIndex.clear();\n this._images.clear();\n this._imageToWidth.clear();\n this._imageToHeight.clear();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/line-renderer/line-renderer.ts\":\n/*!*********************************************************!*\\\n !*** ./Graphics/Context/line-renderer/line-renderer.ts ***!\n \\*********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ LineRenderer: () => (/* binding */ LineRenderer)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _line_vertex_glsl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./line-vertex.glsl */ \"./Graphics/Context/line-renderer/line-vertex.glsl\");\n/* harmony import */ var _line_fragment_glsl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./line-fragment.glsl */ \"./Graphics/Context/line-renderer/line-fragment.glsl\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../.. */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../.. */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../.. */ \"./Graphics/Context/vertex-layout.ts\");\n/* harmony import */ var _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n\n\n\n\n\nclass LineRenderer {\n constructor() {\n this.type = 'ex.line';\n this.priority = 0;\n this._maxLines = 10922;\n this._vertexIndex = 0;\n this._lineCount = 0;\n this._startScratch = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n this._endScratch = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(0, 0);\n }\n initialize(gl, context) {\n this._gl = gl;\n this._context = context;\n this._shader = new ___WEBPACK_IMPORTED_MODULE_1__.Shader({\n gl,\n vertexSource: _line_vertex_glsl__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n fragmentSource: _line_fragment_glsl__WEBPACK_IMPORTED_MODULE_3__[\"default\"]\n });\n this._shader.compile();\n this._shader.use();\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n this._vertexBuffer = new ___WEBPACK_IMPORTED_MODULE_4__.VertexBuffer({\n gl,\n size: 6 * 2 * this._maxLines,\n type: 'dynamic'\n });\n this._layout = new ___WEBPACK_IMPORTED_MODULE_5__.VertexLayout({\n gl,\n vertexBuffer: this._vertexBuffer,\n shader: this._shader,\n attributes: [\n ['a_position', 2],\n ['a_color', 4]\n ]\n });\n }\n dispose() {\n this._vertexBuffer.dispose();\n this._shader.dispose();\n this._context = null;\n this._gl = null;\n }\n draw(start, end, color) {\n // Force a render if the batch is full\n if (this._isFull()) {\n this.flush();\n }\n this._lineCount++;\n const transform = this._context.getTransform();\n const finalStart = transform.multiply(start, this._startScratch);\n const finalEnd = transform.multiply(end, this._endScratch);\n const vertexBuffer = this._vertexBuffer.bufferData;\n // Start\n vertexBuffer[this._vertexIndex++] = finalStart.x;\n vertexBuffer[this._vertexIndex++] = finalStart.y;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n // End\n vertexBuffer[this._vertexIndex++] = finalEnd.x;\n vertexBuffer[this._vertexIndex++] = finalEnd.y;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n }\n _isFull() {\n if (this._lineCount >= this._maxLines) {\n return true;\n }\n return false;\n }\n hasPendingDraws() {\n return this._lineCount !== 0;\n }\n flush() {\n // nothing to draw early exit\n if (this._lineCount === 0) {\n return;\n }\n const gl = this._gl;\n this._shader.use();\n this._layout.use(true);\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n gl.drawArrays(gl.LINES, 0, this._lineCount * 2); // 2 verts per line\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_6__.GraphicsDiagnostics.DrawnImagesCount += this._lineCount;\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_6__.GraphicsDiagnostics.DrawCallCount++;\n // reset\n this._vertexIndex = 0;\n this._lineCount = 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/material-renderer/material-renderer.ts\":\n/*!*****************************************************************!*\\\n !*** ./Graphics/Context/material-renderer/material-renderer.ts ***!\n \\*****************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MaterialRenderer: () => (/* binding */ MaterialRenderer)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n/* harmony import */ var _ImageSource__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../ImageSource */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../Wrapping */ \"./Graphics/Wrapping.ts\");\n/* harmony import */ var _quad_index_buffer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../quad-index-buffer */ \"./Graphics/Context/quad-index-buffer.ts\");\n/* harmony import */ var _vertex_buffer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _vertex_layout__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../vertex-layout */ \"./Graphics/Context/vertex-layout.ts\");\n\n\n\n\n\n\n\n\nclass MaterialRenderer {\n constructor() {\n this.type = 'ex.material';\n this.priority = 0;\n this._textures = [];\n }\n initialize(gl, context) {\n this._gl = gl;\n this._context = context;\n // Setup memory layout\n this._buffer = new _vertex_buffer__WEBPACK_IMPORTED_MODULE_0__.VertexBuffer({\n gl,\n size: 6 * 4, // 6 components * 4 verts\n type: 'dynamic'\n });\n // Setup a vertex layout/buffer to the material\n this._layout = new _vertex_layout__WEBPACK_IMPORTED_MODULE_1__.VertexLayout({\n gl,\n vertexBuffer: this._buffer,\n attributes: [\n ['a_position', 2],\n ['a_uv', 2],\n ['a_screenuv', 2]\n ],\n suppressWarnings: true\n });\n // Setup index buffer\n this._quads = new _quad_index_buffer__WEBPACK_IMPORTED_MODULE_2__.QuadIndexBuffer(gl, 1, true);\n }\n dispose() {\n this._buffer.dispose();\n this._quads.dispose();\n this._textures.length = 0;\n this._context = null;\n this._gl = null;\n }\n draw(image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight) {\n var _a, _b, _c, _d;\n const gl = this._gl;\n // Extract context info\n const material = this._context.material;\n if (!material) {\n return;\n }\n const transform = this._context.getTransform();\n const opacity = this._context.opacity;\n // material shader\n const shader = material.getShader();\n // construct geometry, or hold on to it in the material?\n // geometry primitive for drawing rectangles?\n // update data\n const vertexBuffer = this._layout.vertexBuffer.bufferData;\n let vertexIndex = 0;\n let width = (image === null || image === void 0 ? void 0 : image.width) || swidth || 0;\n let height = (image === null || image === void 0 ? void 0 : image.height) || sheight || 0;\n let view = [0, 0, (_a = swidth !== null && swidth !== void 0 ? swidth : image === null || image === void 0 ? void 0 : image.width) !== null && _a !== void 0 ? _a : 0, (_b = sheight !== null && sheight !== void 0 ? sheight : image === null || image === void 0 ? void 0 : image.height) !== null && _b !== void 0 ? _b : 0];\n let dest = [sx !== null && sx !== void 0 ? sx : 1, sy !== null && sy !== void 0 ? sy : 1];\n // If destination is specified, update view and dest\n if (dx !== undefined && dy !== undefined && dwidth !== undefined && dheight !== undefined) {\n view = [sx !== null && sx !== void 0 ? sx : 1, sy !== null && sy !== void 0 ? sy : 1, (_c = swidth !== null && swidth !== void 0 ? swidth : image === null || image === void 0 ? void 0 : image.width) !== null && _c !== void 0 ? _c : 0, (_d = sheight !== null && sheight !== void 0 ? sheight : image === null || image === void 0 ? void 0 : image.height) !== null && _d !== void 0 ? _d : 0];\n dest = [dx, dy];\n width = dwidth;\n height = dheight;\n }\n sx = view[0];\n sy = view[1];\n const sw = view[2];\n const sh = view[3];\n const topLeft = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(dest[0], dest[1]);\n const topRight = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(dest[0] + width, dest[1]);\n const bottomLeft = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(dest[0], dest[1] + height);\n const bottomRight = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(dest[0] + width, dest[1] + height);\n const imageWidth = image.width || width;\n const imageHeight = image.height || height;\n const uvx0 = sx / imageWidth;\n const uvy0 = sy / imageHeight;\n const uvx1 = (sx + sw - 0.01) / imageWidth;\n const uvy1 = (sy + sh - 0.01) / imageHeight;\n const topLeftScreen = transform.getPosition();\n const bottomRightScreen = topLeftScreen.add(bottomRight);\n const screenUVX0 = topLeftScreen.x / this._context.width;\n const screenUVY0 = topLeftScreen.y / this._context.height;\n const screenUVX1 = bottomRightScreen.x / this._context.width;\n const screenUVY1 = bottomRightScreen.y / this._context.height;\n // (0, 0) - 0\n vertexBuffer[vertexIndex++] = topLeft.x;\n vertexBuffer[vertexIndex++] = topLeft.y;\n vertexBuffer[vertexIndex++] = uvx0;\n vertexBuffer[vertexIndex++] = uvy0;\n vertexBuffer[vertexIndex++] = screenUVX0;\n vertexBuffer[vertexIndex++] = screenUVY0;\n // (0, 1) - 1\n vertexBuffer[vertexIndex++] = bottomLeft.x;\n vertexBuffer[vertexIndex++] = bottomLeft.y;\n vertexBuffer[vertexIndex++] = uvx0;\n vertexBuffer[vertexIndex++] = uvy1;\n vertexBuffer[vertexIndex++] = screenUVX0;\n vertexBuffer[vertexIndex++] = screenUVY1;\n // (1, 0) - 2\n vertexBuffer[vertexIndex++] = topRight.x;\n vertexBuffer[vertexIndex++] = topRight.y;\n vertexBuffer[vertexIndex++] = uvx1;\n vertexBuffer[vertexIndex++] = uvy0;\n vertexBuffer[vertexIndex++] = screenUVX1;\n vertexBuffer[vertexIndex++] = screenUVY0;\n // (1, 1) - 3\n vertexBuffer[vertexIndex++] = bottomRight.x;\n vertexBuffer[vertexIndex++] = bottomRight.y;\n vertexBuffer[vertexIndex++] = uvx1;\n vertexBuffer[vertexIndex++] = uvy1;\n vertexBuffer[vertexIndex++] = screenUVX1;\n vertexBuffer[vertexIndex++] = screenUVY1;\n // This creates and uploads the texture if not already done\n const texture = this._addImageAsTexture(image);\n // apply material\n material.use();\n this._layout.shader = shader;\n // apply layout and geometry\n this._layout.use(true);\n // apply time in ms since the page (performance.now())\n shader.trySetUniformFloat('u_time_ms', performance.now());\n // apply opacity\n shader.trySetUniformFloat('u_opacity', opacity);\n // apply resolution\n shader.trySetUniformFloatVector('u_resolution', (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this._context.width, this._context.height));\n // apply graphic resolution\n shader.trySetUniformFloatVector('u_graphic_resolution', (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(imageWidth, imageHeight));\n // apply size\n shader.trySetUniformFloatVector('u_size', (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(sw, sh));\n // apply orthographic projection\n shader.trySetUniformMatrix('u_matrix', this._context.ortho);\n // apply geometry transform\n shader.trySetUniformMatrix('u_transform', transform.to4x4());\n // bind graphic image texture 'uniform sampler2D u_graphic;'\n gl.activeTexture(gl.TEXTURE0 + 0);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n shader.trySetUniformInt('u_graphic', 0);\n // bind the screen texture\n gl.activeTexture(gl.TEXTURE0 + 1);\n gl.bindTexture(gl.TEXTURE_2D, this._context.materialScreenTexture);\n shader.trySetUniformInt('u_screen_texture', 1);\n // bind any additional textures in the material\n material.uploadAndBind(gl);\n // bind quad index buffer\n this._quads.bind();\n // Draw a single quad\n gl.drawElements(gl.TRIANGLES, 6, this._quads.bufferGlType, 0);\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_4__.GraphicsDiagnostics.DrawnImagesCount++;\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_4__.GraphicsDiagnostics.DrawCallCount++;\n }\n _addImageAsTexture(image) {\n const maybeFiltering = image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_5__.ImageSourceAttributeConstants.Filtering);\n const filtering = maybeFiltering ? (0,_Filtering__WEBPACK_IMPORTED_MODULE_6__.parseImageFiltering)(maybeFiltering) : undefined;\n const wrapX = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_7__.parseImageWrapping)(image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_5__.ImageSourceAttributeConstants.WrappingX));\n const wrapY = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_7__.parseImageWrapping)(image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_5__.ImageSourceAttributeConstants.WrappingY));\n const force = image.getAttribute('forceUpload') === 'true' ? true : false;\n const texture = this._context.textureLoader.load(image, {\n filtering,\n wrapping: { x: wrapX, y: wrapY }\n }, force);\n // remove force attribute after upload\n image.removeAttribute('forceUpload');\n if (this._textures.indexOf(texture) === -1) {\n this._textures.push(texture);\n }\n return texture;\n }\n hasPendingDraws() {\n return false;\n }\n flush() {\n // flush does not do anything, material renderer renders immediately per draw\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/material.ts\":\n/*!**************************************!*\\\n !*** ./Graphics/Context/material.ts ***!\n \\**************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Material: () => (/* binding */ Material)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Color */ \"./Color.ts\");\n/* harmony import */ var _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _ImageSource__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ImageSource */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Wrapping */ \"./Graphics/Wrapping.ts\");\n\n\n\n\n\n\nconst defaultVertexSource = `#version 300 es\r\nin vec2 a_position;\r\n\r\nin vec2 a_uv;\r\nout vec2 v_uv;\r\n\r\nin vec2 a_screenuv;\r\nout vec2 v_screenuv;\r\n\r\nuniform mat4 u_matrix;\r\nuniform mat4 u_transform;\r\n\r\nvoid main() {\r\n // Set the vertex position using the ortho & transform matrix\r\n gl_Position = u_matrix * u_transform * vec4(a_position, 0.0, 1.0);\r\n\r\n // Pass through the UV coord to the fragment shader\r\n v_uv = a_uv;\r\n v_screenuv = a_screenuv;\r\n}\r\n`;\nclass Material {\n constructor(options) {\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance();\n this._color = _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Transparent;\n this._initialized = false;\n this._images = new Map();\n this._textures = new Map();\n const { color, name, vertexSource, fragmentSource, graphicsContext, images } = options;\n this._name = name !== null && name !== void 0 ? name : 'anonymous material';\n this._vertexSource = vertexSource !== null && vertexSource !== void 0 ? vertexSource : defaultVertexSource;\n this._fragmentSource = fragmentSource;\n this._color = color !== null && color !== void 0 ? color : this._color;\n if (!graphicsContext) {\n throw Error(`Material ${name} must be provided an excalibur webgl graphics context`);\n }\n if (graphicsContext instanceof _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_2__.ExcaliburGraphicsContextWebGL) {\n this._graphicsContext = graphicsContext;\n this._initialize(graphicsContext);\n }\n else {\n this._logger.warn(`Material ${name} was created in 2D Canvas mode, currently only WebGL is supported`);\n }\n if (images) {\n for (const key in images) {\n this.addImageSource(key, images[key]);\n }\n }\n }\n _initialize(graphicsContextWebGL) {\n if (this._initialized) {\n return;\n }\n const gl = graphicsContextWebGL.__gl;\n // max texture slots - 2 for the graphic texture and screen texture\n this._maxTextureSlots = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS) - 2;\n this._shader = graphicsContextWebGL.createShader({\n vertexSource: this._vertexSource,\n fragmentSource: this._fragmentSource\n });\n this._shader.compile();\n this._initialized = true;\n }\n get color() {\n return this._color;\n }\n set color(c) {\n this._color = c;\n }\n get name() {\n var _a;\n return (_a = this._name) !== null && _a !== void 0 ? _a : 'anonymous material';\n }\n get isUsingScreenTexture() {\n return this._fragmentSource.includes('u_screen_texture');\n }\n update(callback) {\n if (this._shader) {\n this._shader.use();\n callback(this._shader);\n }\n }\n getShader() {\n return this._shader;\n }\n addImageSource(textureUniformName, image) {\n if (this._images.size < this._maxTextureSlots) {\n this._images.set(textureUniformName, image);\n }\n else {\n this._logger.warn(`Max number texture slots ${this._maxTextureSlots} have been reached for material \"${this.name}\", ` +\n `no more textures will be uploaded due to hardware constraints.`);\n }\n }\n removeImageSource(textureName) {\n const image = this._images.get(textureName);\n this._graphicsContext.textureLoader.delete(image.image);\n this._images.delete(textureName);\n }\n _loadImageSource(image) {\n const imageElement = image.image;\n const maybeFiltering = imageElement.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_3__.ImageSourceAttributeConstants.Filtering);\n const filtering = maybeFiltering ? (0,_Filtering__WEBPACK_IMPORTED_MODULE_4__.parseImageFiltering)(maybeFiltering) : undefined;\n const wrapX = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_5__.parseImageWrapping)(imageElement.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_3__.ImageSourceAttributeConstants.WrappingX));\n const wrapY = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_5__.parseImageWrapping)(imageElement.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_3__.ImageSourceAttributeConstants.WrappingY));\n const force = imageElement.getAttribute('forceUpload') === 'true' ? true : false;\n const texture = this._graphicsContext.textureLoader.load(imageElement, {\n filtering,\n wrapping: { x: wrapX, y: wrapY }\n }, force);\n // remove force attribute after upload\n imageElement.removeAttribute('forceUpload');\n if (!this._textures.has(image)) {\n this._textures.set(image, texture);\n }\n return texture;\n }\n uploadAndBind(gl, startingTextureSlot = 2) {\n let textureSlot = startingTextureSlot;\n for (const [textureName, image] of this._images.entries()) {\n if (!image.isLoaded()) {\n this._logger.warnOnce(`Image named ${textureName} in material ${this.name} not loaded, nothing will be uploaded to the shader.` +\n ` Did you forget to add this to a loader? https://excaliburjs.com/docs/loaders/`);\n continue;\n } // skip unloaded images, maybe warn\n const texture = this._loadImageSource(image);\n gl.activeTexture(gl.TEXTURE0 + textureSlot);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n this._shader.trySetUniformInt(textureName, textureSlot);\n textureSlot++;\n }\n }\n use() {\n if (this._initialized) {\n // bind the shader\n this._shader.use();\n // Apply standard uniforms\n this._shader.trySetUniformFloatColor('u_color', this._color);\n }\n else {\n throw Error(`Material ${this.name} not yet initialized, use the ExcaliburGraphicsContext.createMaterial() to work around this.`);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/particle-renderer/particle-renderer.ts\":\n/*!*****************************************************************!*\\\n !*** ./Graphics/Context/particle-renderer/particle-renderer.ts ***!\n \\*****************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ParticleRenderer: () => (/* binding */ ParticleRenderer)\n/* harmony export */ });\n/* harmony import */ var _shader__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _particle_vertex_glsl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./particle-vertex.glsl */ \"./Graphics/Context/particle-renderer/particle-vertex.glsl\");\n/* harmony import */ var _particle_fragment_glsl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./particle-fragment.glsl */ \"./Graphics/Context/particle-renderer/particle-fragment.glsl\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../../Color */ \"./Color.ts\");\n/* harmony import */ var _ImageSource__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../ImageSource */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Wrapping */ \"./Graphics/Wrapping.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Particles_Particles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../Particles/Particles */ \"./Particles/Particles.ts\");\n\n\n\n\n\n\n\n\n\nclass ParticleRenderer {\n constructor() {\n this.type = 'ex.particle';\n this.priority = 0;\n }\n initialize(gl, context) {\n this._gl = gl;\n this._context = context;\n this._shader = new _shader__WEBPACK_IMPORTED_MODULE_0__.Shader({\n gl,\n vertexSource: _particle_vertex_glsl__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n fragmentSource: _particle_fragment_glsl__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n onPreLink: (program) => {\n gl.transformFeedbackVaryings(program, ['finalPosition', 'finalVelocity', 'finalRotation', 'finalAngularVelocity', 'finalLifeMs'], gl.INTERLEAVED_ATTRIBS);\n }\n });\n this._shader.compile();\n this._shader.use();\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n }\n _getTexture(image) {\n const maybeFiltering = image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_3__.ImageSourceAttributeConstants.Filtering);\n const filtering = maybeFiltering ? (0,_Filtering__WEBPACK_IMPORTED_MODULE_4__.parseImageFiltering)(maybeFiltering) : undefined;\n const wrapX = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_5__.parseImageWrapping)(image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_3__.ImageSourceAttributeConstants.WrappingX));\n const wrapY = (0,_Wrapping__WEBPACK_IMPORTED_MODULE_5__.parseImageWrapping)(image.getAttribute(_ImageSource__WEBPACK_IMPORTED_MODULE_3__.ImageSourceAttributeConstants.WrappingY));\n const force = image.getAttribute('forceUpload') === 'true' ? true : false;\n const texture = this._context.textureLoader.load(image, {\n filtering,\n wrapping: { x: wrapX, y: wrapY }\n }, force);\n // remove force attribute after upload\n image.removeAttribute('forceUpload');\n return texture;\n }\n draw(renderer, elapsed) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j;\n const gl = this._gl;\n this._shader.use();\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n const transform = renderer.particle.transform === _Particles_Particles__WEBPACK_IMPORTED_MODULE_6__.ParticleTransform.Local\n ? this._context.getTransform()\n : this._context.getTransform().multiply(renderer.emitter.transform.get().inverse);\n this._shader.setUniformAffineMatrix('u_transform', transform);\n this._shader.setUniformBoolean('fade', renderer.particle.fade ? true : false);\n this._shader.setUniformBoolean('useTexture', renderer.particle.graphic ? true : false);\n this._shader.setUniformFloat('maxLifeMs', (_a = renderer.particle.life) !== null && _a !== void 0 ? _a : 2000);\n this._shader.setUniformFloat('deltaMs', elapsed);\n this._shader.setUniformFloatVector('gravity', (_b = renderer.particle.acc) !== null && _b !== void 0 ? _b : (0,_Math_vector__WEBPACK_IMPORTED_MODULE_7__.vec)(0, 0));\n this._shader.setUniformFloatColor('beginColor', (_c = renderer.particle.beginColor) !== null && _c !== void 0 ? _c : _Color__WEBPACK_IMPORTED_MODULE_8__.Color.Transparent);\n this._shader.setUniformFloatColor('endColor', (_d = renderer.particle.endColor) !== null && _d !== void 0 ? _d : _Color__WEBPACK_IMPORTED_MODULE_8__.Color.Transparent);\n let startSize = (_e = renderer.particle.startSize) !== null && _e !== void 0 ? _e : 0;\n let endSize = (_f = renderer.particle.endSize) !== null && _f !== void 0 ? _f : 0;\n const size = (_g = renderer.particle.size) !== null && _g !== void 0 ? _g : 0;\n if (size > 0) {\n startSize = size;\n endSize = size;\n }\n this._shader.setUniformFloat('startSize', startSize !== null && startSize !== void 0 ? startSize : 10);\n this._shader.setUniformFloat('endSize', endSize !== null && endSize !== void 0 ? endSize : 10);\n this._shader.setUniformFloat('startOpacity', (_h = renderer.particle.opacity) !== null && _h !== void 0 ? _h : 1);\n if (renderer.particle.focus) {\n this._shader.setUniformFloatVector('focus', renderer.particle.focus);\n this._shader.setUniformFloat('focusAccel', (_j = renderer.particle.focusAccel) !== null && _j !== void 0 ? _j : 0);\n }\n // Particle Graphic (only Sprites right now)\n if (renderer.particle.graphic) {\n const graphic = renderer.particle.graphic;\n const texture = this._getTexture(graphic.image.image);\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n this._shader.setUniformInt('graphic', 0);\n }\n // Collision Mask\n // gl.activeTexture(gl.TEXTURE0 + 1);\n // gl.bindTexture(gl.TEXTURE_2D, obstacleTex);\n // gl.uniform1i(u_obstacle, 1);\n renderer.draw(gl);\n }\n hasPendingDraws() {\n return false;\n }\n flush() {\n // pass\n }\n dispose() {\n // pass\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/point-renderer/point-renderer.ts\":\n/*!***********************************************************!*\\\n !*** ./Graphics/Context/point-renderer/point-renderer.ts ***!\n \\***********************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointRenderer: () => (/* binding */ PointRenderer)\n/* harmony export */ });\n/* harmony import */ var _point_vertex_glsl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./point-vertex.glsl */ \"./Graphics/Context/point-renderer/point-vertex.glsl\");\n/* harmony import */ var _point_fragment_glsl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./point-fragment.glsl */ \"./Graphics/Context/point-renderer/point-fragment.glsl\");\n/* harmony import */ var _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _shader__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _vertex_buffer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _vertex_layout__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../vertex-layout */ \"./Graphics/Context/vertex-layout.ts\");\n/* harmony import */ var _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n\n\n\n\n\n\n\nclass PointRenderer {\n constructor() {\n this.type = 'ex.point';\n this.priority = 0;\n this._maxPoints = 10922;\n this._pointCount = 0;\n this._vertexIndex = 0;\n }\n initialize(gl, context) {\n this._gl = gl;\n this._context = context;\n this._shader = new _shader__WEBPACK_IMPORTED_MODULE_0__.Shader({\n gl,\n vertexSource: _point_vertex_glsl__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n fragmentSource: _point_fragment_glsl__WEBPACK_IMPORTED_MODULE_2__[\"default\"]\n });\n this._shader.compile();\n this._shader.use();\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n this._buffer = new _vertex_buffer__WEBPACK_IMPORTED_MODULE_3__.VertexBuffer({\n gl,\n size: 7 * this._maxPoints,\n type: 'dynamic'\n });\n this._layout = new _vertex_layout__WEBPACK_IMPORTED_MODULE_4__.VertexLayout({\n gl,\n shader: this._shader,\n vertexBuffer: this._buffer,\n attributes: [\n ['a_position', 2],\n ['a_color', 4],\n ['a_size', 1]\n ]\n });\n }\n dispose() {\n this._buffer.dispose();\n this._shader.dispose();\n this._context = null;\n this._gl = null;\n }\n draw(point, color, size) {\n // Force a render if the batch is full\n if (this._isFull()) {\n this.flush();\n }\n this._pointCount++;\n const transform = this._context.getTransform();\n const opacity = this._context.opacity;\n const snapToPixel = this._context.snapToPixel;\n const finalPoint = transform.multiply(point);\n if (snapToPixel) {\n finalPoint.x = ~~(finalPoint.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_5__.pixelSnapEpsilon);\n finalPoint.y = ~~(finalPoint.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_5__.pixelSnapEpsilon);\n }\n const vertexBuffer = this._buffer.bufferData;\n vertexBuffer[this._vertexIndex++] = finalPoint.x;\n vertexBuffer[this._vertexIndex++] = finalPoint.y;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a * opacity;\n vertexBuffer[this._vertexIndex++] = size * Math.max(transform.getScaleX(), transform.getScaleY());\n }\n _isFull() {\n if (this._pointCount >= this._maxPoints) {\n return true;\n }\n return false;\n }\n hasPendingDraws() {\n return this._pointCount !== 0;\n }\n flush() {\n // nothing to draw early exit\n if (this._pointCount === 0) {\n return;\n }\n const gl = this._gl;\n this._shader.use();\n this._layout.use(true);\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n gl.drawArrays(gl.POINTS, 0, this._pointCount);\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_6__.GraphicsDiagnostics.DrawnImagesCount += this._pointCount;\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_6__.GraphicsDiagnostics.DrawCallCount++;\n this._pointCount = 0;\n this._vertexIndex = 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/quad-index-buffer.ts\":\n/*!***********************************************!*\\\n !*** ./Graphics/Context/quad-index-buffer.ts ***!\n \\***********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ QuadIndexBuffer: () => (/* binding */ QuadIndexBuffer)\n/* harmony export */ });\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../.. */ \"./Util/Log.ts\");\n\n/**\n * Helper that defines and index buffer for quad geometry\n *\n * Index buffers allow you to save space in vertex buffers when you share vertices in geometry\n * it is almost always worth it in terms of performance to use an index buffer.\n */\nclass QuadIndexBuffer {\n /**\n * @param gl WebGL2RenderingContext this layout will be attached to, these cannot be reused across contexts.\n * @param numberOfQuads Specify the max number of quads you want to draw\n * @param useUint16 Optionally force a uint16 buffer\n */\n constructor(gl, numberOfQuads, useUint16) {\n this._logger = ___WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance();\n this._gl = gl;\n this.buffer = gl.createBuffer();\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.buffer);\n const totalVertices = numberOfQuads * 6;\n if (!useUint16) {\n this.bufferData = new Uint32Array(totalVertices);\n }\n else {\n // fall back to using gl.UNSIGNED_SHORT or tell the user they are out of luck\n const maxUint16 = 65535;\n const maxUint16Index = Math.floor((maxUint16 - 1) / 4); // max quads\n this.bufferGlType = gl.UNSIGNED_SHORT;\n this.bufferData = new Uint16Array(totalVertices);\n // TODO Should we error if this happens?? maybe not might crash mid game\n if (numberOfQuads > maxUint16Index) {\n this._logger.warn(`Total quads exceeds hardware index buffer limit (uint16), max(${maxUint16Index}) requested quads(${numberOfQuads})`);\n }\n }\n let currentQuad = 0;\n for (let i = 0; i < totalVertices; i += 6) {\n // first triangle\n this.bufferData[i + 0] = currentQuad + 0;\n this.bufferData[i + 1] = currentQuad + 1;\n this.bufferData[i + 2] = currentQuad + 2;\n // second triangle\n this.bufferData[i + 3] = currentQuad + 2;\n this.bufferData[i + 4] = currentQuad + 1;\n this.bufferData[i + 5] = currentQuad + 3;\n currentQuad += 4;\n }\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.bufferData, gl.STATIC_DRAW);\n }\n get size() {\n return this.bufferData.length;\n }\n /**\n * Upload data to the GPU\n */\n upload() {\n const gl = this._gl;\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.buffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.bufferData, gl.STATIC_DRAW);\n }\n /**\n * Bind this index buffer\n */\n bind() {\n const gl = this._gl;\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.buffer);\n }\n dispose() {\n const gl = this._gl;\n gl.deleteBuffer(this.buffer);\n this._gl = null;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/rectangle-renderer/rectangle-renderer.ts\":\n/*!*******************************************************************!*\\\n !*** ./Graphics/Context/rectangle-renderer/rectangle-renderer.ts ***!\n \\*******************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RectangleRenderer: () => (/* binding */ RectangleRenderer)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Color */ \"./Color.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../GraphicsDiagnostics */ \"./Graphics/GraphicsDiagnostics.ts\");\n/* harmony import */ var _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _quad_index_buffer__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../quad-index-buffer */ \"./Graphics/Context/quad-index-buffer.ts\");\n/* harmony import */ var _shader__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _vertex_buffer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _vertex_layout__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../vertex-layout */ \"./Graphics/Context/vertex-layout.ts\");\n/* harmony import */ var _rectangle_renderer_frag_glsl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./rectangle-renderer.frag.glsl */ \"./Graphics/Context/rectangle-renderer/rectangle-renderer.frag.glsl\");\n/* harmony import */ var _rectangle_renderer_vert_glsl__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./rectangle-renderer.vert.glsl */ \"./Graphics/Context/rectangle-renderer/rectangle-renderer.vert.glsl\");\n\n\n\n\n\n\n\n\n\n\nclass RectangleRenderer {\n constructor() {\n this.type = 'ex.rectangle';\n this.priority = 0;\n this._maxRectangles = 10922; // max(uint16) / 6 verts\n this._rectangleCount = 0;\n this._vertexIndex = 0;\n this._transparent = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Transparent;\n this._scratch1 = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0);\n this._scratch2 = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0);\n this._scratch3 = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0);\n this._scratch4 = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0);\n }\n initialize(gl, context) {\n this._gl = gl;\n this._context = context;\n // https://stackoverflow.com/questions/59197671/glsl-rounded-rectangle-with-variable-border\n this._shader = new _shader__WEBPACK_IMPORTED_MODULE_2__.Shader({\n gl,\n fragmentSource: _rectangle_renderer_frag_glsl__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n vertexSource: _rectangle_renderer_vert_glsl__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n });\n this._shader.compile();\n // setup uniforms\n this._shader.use();\n this._shader.setUniformMatrix('u_matrix', context.ortho);\n this._buffer = new _vertex_buffer__WEBPACK_IMPORTED_MODULE_5__.VertexBuffer({\n gl,\n size: 16 * 4 * this._maxRectangles,\n type: 'dynamic'\n });\n this._layout = new _vertex_layout__WEBPACK_IMPORTED_MODULE_6__.VertexLayout({\n gl,\n shader: this._shader,\n vertexBuffer: this._buffer,\n attributes: [\n ['a_position', 2],\n ['a_uv', 2],\n ['a_size', 2],\n ['a_opacity', 1],\n ['a_color', 4],\n ['a_strokeColor', 4],\n ['a_strokeThickness', 1]\n ]\n });\n this._quads = new _quad_index_buffer__WEBPACK_IMPORTED_MODULE_7__.QuadIndexBuffer(gl, this._maxRectangles, true);\n }\n dispose() {\n this._buffer.dispose();\n this._quads.dispose();\n this._shader.dispose();\n this._context = null;\n this._gl = null;\n }\n _isFull() {\n if (this._rectangleCount >= this._maxRectangles) {\n return true;\n }\n return false;\n }\n draw(...args) {\n if (args[0] instanceof _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector && args[1] instanceof _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector) {\n this.drawLine.apply(this, args);\n }\n else {\n this.drawRectangle.apply(this, args);\n }\n }\n drawLine(start, end, color, thickness = 1) {\n if (this._isFull()) {\n this.flush();\n }\n this._rectangleCount++;\n // transform based on current context\n const transform = this._context.getTransform();\n const opacity = this._context.opacity;\n const snapToPixel = this._context.snapToPixel;\n const dir = end.sub(start);\n const length = dir.magnitude;\n const normal = dir.normalize().perpendicular();\n const halfThick = thickness / 2;\n /**\n * +---------------------^----------------------+\n * | | (normal) |\n * (startX, startY)------------------>(endX, endY)\n * | |\n * + -------------------------------------------+\n */\n const startTop = transform.multiply(normal.scale(halfThick, this._scratch1).add(start, this._scratch1), this._scratch1);\n const startBottom = transform.multiply(normal.scale(-halfThick, this._scratch2).add(start, this._scratch2), this._scratch2);\n const endTop = transform.multiply(normal.scale(halfThick, this._scratch3).add(end, this._scratch3), this._scratch3);\n const endBottom = transform.multiply(normal.scale(-halfThick, this._scratch4).add(end, this._scratch4), this._scratch4);\n if (snapToPixel) {\n startTop.x = ~~(startTop.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n startTop.y = ~~(startTop.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n endTop.x = ~~(endTop.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n endTop.y = ~~(endTop.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n startBottom.x = ~~(startBottom.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n startBottom.y = ~~(startBottom.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n endBottom.x = ~~(endBottom.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n endBottom.y = ~~(endBottom.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n }\n // TODO uv could be static vertex buffer\n const uvx0 = 0;\n const uvy0 = 0;\n const uvx1 = 1;\n const uvy1 = 1;\n const stroke = this._transparent;\n const strokeThickness = 0;\n const width = 1;\n // update data\n const vertexBuffer = this._layout.vertexBuffer.bufferData;\n // (0, 0) - 0\n vertexBuffer[this._vertexIndex++] = startTop.x;\n vertexBuffer[this._vertexIndex++] = startTop.y;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = length;\n vertexBuffer[this._vertexIndex++] = thickness;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness / width;\n // (0, 1) - 1\n vertexBuffer[this._vertexIndex++] = startBottom.x;\n vertexBuffer[this._vertexIndex++] = startBottom.y;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = length;\n vertexBuffer[this._vertexIndex++] = thickness;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness / width;\n // (1, 0) - 2\n vertexBuffer[this._vertexIndex++] = endTop.x;\n vertexBuffer[this._vertexIndex++] = endTop.y;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = length;\n vertexBuffer[this._vertexIndex++] = thickness;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness / width;\n // (1, 1) - 3\n vertexBuffer[this._vertexIndex++] = endBottom.x;\n vertexBuffer[this._vertexIndex++] = endBottom.y;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = length;\n vertexBuffer[this._vertexIndex++] = thickness;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness / width;\n }\n drawRectangle(pos, width, height, color, stroke = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Transparent, strokeThickness = 0) {\n if (this._isFull()) {\n this.flush();\n }\n this._rectangleCount++;\n // transform based on current context\n const transform = this._context.getTransform();\n const opacity = this._context.opacity;\n const snapToPixel = this._context.snapToPixel;\n const topLeft = transform.multiply(pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0)));\n const topRight = transform.multiply(pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(width, 0)));\n const bottomRight = transform.multiply(pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(width, height)));\n const bottomLeft = transform.multiply(pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, height)));\n if (snapToPixel) {\n topLeft.x = ~~(topLeft.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n topLeft.y = ~~(topLeft.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n topRight.x = ~~(topRight.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n topRight.y = ~~(topRight.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n bottomLeft.x = ~~(bottomLeft.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n bottomLeft.y = ~~(bottomLeft.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n bottomRight.x = ~~(bottomRight.x + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n bottomRight.y = ~~(bottomRight.y + _ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_8__.pixelSnapEpsilon);\n }\n // TODO uv could be static vertex buffer\n const uvx0 = 0;\n const uvy0 = 0;\n const uvx1 = 1;\n const uvy1 = 1;\n // update data\n const vertexBuffer = this._layout.vertexBuffer.bufferData;\n // (0, 0) - 0\n vertexBuffer[this._vertexIndex++] = topLeft.x;\n vertexBuffer[this._vertexIndex++] = topLeft.y;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = width;\n vertexBuffer[this._vertexIndex++] = height;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness;\n // (0, 1) - 1\n vertexBuffer[this._vertexIndex++] = bottomLeft.x;\n vertexBuffer[this._vertexIndex++] = bottomLeft.y;\n vertexBuffer[this._vertexIndex++] = uvx0;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = width;\n vertexBuffer[this._vertexIndex++] = height;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness;\n // (1, 0) - 2\n vertexBuffer[this._vertexIndex++] = topRight.x;\n vertexBuffer[this._vertexIndex++] = topRight.y;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy0;\n vertexBuffer[this._vertexIndex++] = width;\n vertexBuffer[this._vertexIndex++] = height;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness;\n // (1, 1) - 3\n vertexBuffer[this._vertexIndex++] = bottomRight.x;\n vertexBuffer[this._vertexIndex++] = bottomRight.y;\n vertexBuffer[this._vertexIndex++] = uvx1;\n vertexBuffer[this._vertexIndex++] = uvy1;\n vertexBuffer[this._vertexIndex++] = width;\n vertexBuffer[this._vertexIndex++] = height;\n vertexBuffer[this._vertexIndex++] = opacity;\n vertexBuffer[this._vertexIndex++] = color.r / 255;\n vertexBuffer[this._vertexIndex++] = color.g / 255;\n vertexBuffer[this._vertexIndex++] = color.b / 255;\n vertexBuffer[this._vertexIndex++] = color.a;\n vertexBuffer[this._vertexIndex++] = stroke.r / 255;\n vertexBuffer[this._vertexIndex++] = stroke.g / 255;\n vertexBuffer[this._vertexIndex++] = stroke.b / 255;\n vertexBuffer[this._vertexIndex++] = stroke.a;\n vertexBuffer[this._vertexIndex++] = strokeThickness;\n }\n hasPendingDraws() {\n return this._rectangleCount !== 0;\n }\n flush() {\n // nothing to draw early exit\n if (this._rectangleCount === 0) {\n return;\n }\n const gl = this._gl;\n // Bind the shader\n this._shader.use();\n // Bind the memory layout and upload data\n this._layout.use(true);\n // Update ortho matrix uniform\n this._shader.setUniformMatrix('u_matrix', this._context.ortho);\n // Bind index buffer\n this._quads.bind();\n // Draw all the quads\n gl.drawElements(gl.TRIANGLES, this._rectangleCount * 6, this._quads.bufferGlType, 0);\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_9__.GraphicsDiagnostics.DrawnImagesCount += this._rectangleCount;\n _GraphicsDiagnostics__WEBPACK_IMPORTED_MODULE_9__.GraphicsDiagnostics.DrawCallCount++;\n // Reset\n this._rectangleCount = 0;\n this._vertexIndex = 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/render-source.ts\":\n/*!*******************************************!*\\\n !*** ./Graphics/Context/render-source.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RenderSource: () => (/* binding */ RenderSource)\n/* harmony export */ });\nclass RenderSource {\n constructor(_gl, _texture) {\n this._gl = _gl;\n this._texture = _texture;\n }\n use() {\n const gl = this._gl;\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, this._texture);\n }\n disable() {\n const gl = this._gl;\n gl.bindTexture(gl.TEXTURE_2D, null);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/render-target.ts\":\n/*!*******************************************!*\\\n !*** ./Graphics/Context/render-target.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RenderTarget: () => (/* binding */ RenderTarget)\n/* harmony export */ });\n/* harmony import */ var _render_source__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./render-source */ \"./Graphics/Context/render-source.ts\");\n\nclass RenderTarget {\n constructor(options) {\n var _a, _b;\n this.antialias = false;\n this.samples = 1;\n this._gl = options.gl;\n this.width = options.width;\n this.height = options.height;\n this.transparency = options.transparency;\n this.antialias = (_a = options.antialias) !== null && _a !== void 0 ? _a : this.antialias;\n this.samples = (_b = options.samples) !== null && _b !== void 0 ? _b : this._gl.getParameter(this._gl.MAX_SAMPLES);\n const gl = this._gl;\n // Determine current context format for blitting later needs to match\n if (gl.drawingBufferFormat) {\n this.bufferFormat = gl.drawingBufferFormat;\n }\n else {\n // Documented in webgl spec\n // https://registry.khronos.org/webgl/specs/latest/1.0/\n if (this.transparency) {\n this.bufferFormat = gl.RGBA8;\n }\n else {\n this.bufferFormat = gl.RGB8;\n }\n }\n this._setupRenderBuffer();\n this._setupFramebuffer();\n }\n setResolution(width, height) {\n const gl = this._gl;\n this.width = width;\n this.height = height;\n // update backing texture size\n gl.bindTexture(gl.TEXTURE_2D, this._frameTexture);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n // update render buffer size\n if (this._renderBuffer) {\n gl.bindRenderbuffer(gl.RENDERBUFFER, this._renderBuffer);\n gl.renderbufferStorageMultisample(gl.RENDERBUFFER, Math.min(this.samples, gl.getParameter(gl.MAX_SAMPLES)), this.bufferFormat, this.width, this.height);\n }\n }\n get renderBuffer() {\n return this._renderBuffer;\n }\n get renderFrameBuffer() {\n return this._renderFrameBuffer;\n }\n get frameBuffer() {\n return this._frameBuffer;\n }\n get frameTexture() {\n return this._frameTexture;\n }\n _setupRenderBuffer() {\n if (this.antialias) {\n const gl = this._gl;\n // Render buffers can be used as an input to a shader\n this._renderBuffer = gl.createRenderbuffer();\n this._renderFrameBuffer = gl.createFramebuffer();\n gl.bindRenderbuffer(gl.RENDERBUFFER, this._renderBuffer);\n gl.renderbufferStorageMultisample(gl.RENDERBUFFER, Math.min(this.samples, gl.getParameter(gl.MAX_SAMPLES)), this.bufferFormat, this.width, this.height);\n gl.bindFramebuffer(gl.FRAMEBUFFER, this._renderFrameBuffer);\n gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, this._renderBuffer);\n }\n }\n _setupFramebuffer() {\n // Allocates frame buffer\n const gl = this._gl;\n this._frameTexture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, this._frameTexture);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n // set the filtering so we don't need mips\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n // attach the texture as the first color attachment\n const attachmentPoint = gl.COLOR_ATTACHMENT0;\n // After this bind all draw calls will draw to this framebuffer texture\n this._frameBuffer = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, this._frameBuffer);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, attachmentPoint, gl.TEXTURE_2D, this._frameTexture, 0);\n // Reset after initialized\n this.disable();\n }\n toRenderSource() {\n if (this.renderBuffer) {\n this.blitRenderBufferToFrameBuffer();\n }\n const source = new _render_source__WEBPACK_IMPORTED_MODULE_0__.RenderSource(this._gl, this._frameTexture);\n return source;\n }\n blitToScreen() {\n const gl = this._gl;\n // set to size of canvas's drawingBuffer\n if (this._renderBuffer) {\n gl.bindFramebuffer(gl.READ_FRAMEBUFFER, this.renderFrameBuffer);\n gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, null);\n gl.clearBufferfv(gl.COLOR, 0, [0.0, 0.0, 1.0, 1.0]);\n gl.blitFramebuffer(0, 0, this.width, this.height, 0, 0, this.width, this.height, gl.COLOR_BUFFER_BIT, gl.LINEAR);\n }\n else {\n gl.bindFramebuffer(gl.READ_FRAMEBUFFER, this.frameBuffer);\n gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, null);\n gl.clearBufferfv(gl.COLOR, 0, [0.0, 0.0, 1.0, 1.0]);\n gl.blitFramebuffer(0, 0, this.width, this.height, 0, 0, this.width, this.height, gl.COLOR_BUFFER_BIT, gl.LINEAR);\n }\n }\n blitRenderBufferToFrameBuffer() {\n if (this._renderBuffer) {\n const gl = this._gl;\n gl.bindFramebuffer(gl.READ_FRAMEBUFFER, this.renderFrameBuffer);\n gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, this.frameBuffer);\n gl.clearBufferfv(gl.COLOR, 0, [0.0, 0.0, 1.0, 1.0]);\n gl.blitFramebuffer(0, 0, this.width, this.height, 0, 0, this.width, this.height, gl.COLOR_BUFFER_BIT, gl.LINEAR);\n }\n }\n copyToTexture(texture) {\n const gl = this._gl;\n if (this._renderBuffer) {\n this.blitRenderBufferToFrameBuffer();\n }\n gl.bindFramebuffer(gl.FRAMEBUFFER, this._frameBuffer);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.copyTexImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 0, 0, this.width, this.height, 0);\n }\n /**\n * When called, all drawing gets redirected to this render target\n */\n use() {\n const gl = this._gl;\n if (this.antialias) {\n gl.bindFramebuffer(gl.FRAMEBUFFER, this._renderFrameBuffer);\n }\n else {\n gl.bindFramebuffer(gl.FRAMEBUFFER, this._frameBuffer);\n }\n // very important to set the viewport to the size of the framebuffer texture\n gl.viewport(0, 0, this.width, this.height);\n }\n /**\n * When called, all drawing is sent back to the canvas\n */\n disable() {\n const gl = this._gl;\n // passing null switches rendering back to the canvas\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.bindTexture(gl.TEXTURE_2D, null);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/screen-pass-painter/screen-pass-painter.ts\":\n/*!*********************************************************************!*\\\n !*** ./Graphics/Context/screen-pass-painter/screen-pass-painter.ts ***!\n \\*********************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ScreenPassPainter: () => (/* binding */ ScreenPassPainter)\n/* harmony export */ });\n/* harmony import */ var _screen_vertex_glsl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./screen-vertex.glsl */ \"./Graphics/Context/screen-pass-painter/screen-vertex.glsl\");\n/* harmony import */ var _screen_fragment_glsl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./screen-fragment.glsl */ \"./Graphics/Context/screen-pass-painter/screen-fragment.glsl\");\n/* harmony import */ var _shader__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _vertex_buffer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _vertex_layout__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../vertex-layout */ \"./Graphics/Context/vertex-layout.ts\");\n\n\n\n\n\n/**\n * This is responsible for painting the entire screen during the render passes\n */\nclass ScreenPassPainter {\n constructor(gl) {\n this._gl = gl;\n this._shader = new _shader__WEBPACK_IMPORTED_MODULE_0__.Shader({\n gl,\n vertexSource: _screen_vertex_glsl__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n fragmentSource: _screen_fragment_glsl__WEBPACK_IMPORTED_MODULE_2__[\"default\"]\n });\n this._shader.compile();\n // Setup memory layout\n this._buffer = new _vertex_buffer__WEBPACK_IMPORTED_MODULE_3__.VertexBuffer({\n gl,\n type: 'static',\n // clip space quad + uv since we don't need a camera\n data: new Float32Array([\n -1, -1, 0, 0, -1, 1, 0, 1, 1, -1, 1, 0,\n 1, -1, 1, 0, -1, 1, 0, 1, 1, 1, 1, 1\n ])\n });\n this._layout = new _vertex_layout__WEBPACK_IMPORTED_MODULE_4__.VertexLayout({\n gl,\n shader: this._shader,\n vertexBuffer: this._buffer,\n attributes: [\n ['a_position', 2],\n ['a_texcoord', 2]\n ]\n });\n this._buffer.upload();\n }\n renderWithPostProcessor(postprocessor) {\n const gl = this._gl;\n postprocessor.getShader().use();\n postprocessor.getLayout().use();\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n }\n renderToScreen() {\n const gl = this._gl;\n this._shader.use();\n this._layout.use();\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/shader.ts\":\n/*!************************************!*\\\n !*** ./Graphics/Context/shader.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Shader: () => (/* binding */ Shader)\n/* harmony export */ });\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../.. */ \"./Util/Log.ts\");\n/* harmony import */ var _webgl_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./webgl-util */ \"./Graphics/Context/webgl-util.ts\");\n\n\nclass Shader {\n get compiled() {\n return this._compiled;\n }\n /**\n * Create a shader program in excalibur\n * @param options specify shader vertex and fragment source\n */\n constructor(options) {\n this._logger = ___WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance();\n this.uniforms = {};\n this.attributes = {};\n this._compiled = false;\n const { gl, vertexSource, fragmentSource, onPreLink, onPostCompile } = options;\n this._gl = gl;\n this.vertexSource = vertexSource;\n this.fragmentSource = fragmentSource;\n this._onPreLink = onPreLink;\n this._onPostCompile = onPostCompile;\n }\n dispose() {\n const gl = this._gl;\n gl.deleteProgram(this.program);\n this._gl = null;\n }\n /**\n * Binds the shader program\n */\n use() {\n const gl = this._gl;\n gl.useProgram(this.program);\n Shader._ACTIVE_SHADER_INSTANCE = this;\n }\n isCurrentlyBound() {\n return Shader._ACTIVE_SHADER_INSTANCE === this;\n }\n /**\n * Compile the current shader against a webgl context\n */\n compile() {\n const gl = this._gl;\n const vertexShader = this._compileShader(gl, this.vertexSource, gl.VERTEX_SHADER);\n const fragmentShader = this._compileShader(gl, this.fragmentSource, gl.FRAGMENT_SHADER);\n this.program = this._createProgram(gl, vertexShader, fragmentShader);\n const attributes = this.getAttributes();\n for (const attribute of attributes) {\n this.attributes[attribute.name] = attribute;\n }\n const uniforms = this.getUniforms();\n for (const uniform of uniforms) {\n this.uniforms[uniform.name] = uniform;\n }\n this._compiled = true;\n if (this._onPostCompile) {\n this._onPostCompile(this);\n }\n return this.program;\n }\n getUniforms() {\n const gl = this._gl;\n const uniformCount = gl.getProgramParameter(this.program, gl.ACTIVE_UNIFORMS);\n const uniforms = [];\n for (let i = 0; i < uniformCount; i++) {\n const uniform = gl.getActiveUniform(this.program, i);\n const uniformLocation = gl.getUniformLocation(this.program, uniform.name);\n uniforms.push({\n name: uniform.name,\n glType: uniform.type,\n location: uniformLocation\n });\n }\n return uniforms;\n }\n getAttributes() {\n const gl = this._gl;\n const attributeCount = gl.getProgramParameter(this.program, gl.ACTIVE_ATTRIBUTES);\n const attributes = [];\n for (let i = 0; i < attributeCount; i++) {\n const attribute = gl.getActiveAttrib(this.program, i);\n const attributeLocation = gl.getAttribLocation(this.program, attribute.name);\n attributes.push({\n name: attribute.name,\n glType: (0,_webgl_util__WEBPACK_IMPORTED_MODULE_1__.getAttributePointerType)(gl, attribute.type),\n size: (0,_webgl_util__WEBPACK_IMPORTED_MODULE_1__.getAttributeComponentSize)(gl, attribute.type),\n location: attributeLocation,\n normalized: false\n });\n }\n return attributes;\n }\n /**\n * Set a texture in a gpu texture slot\n * @param slotNumber\n * @param texture\n */\n setTexture(slotNumber, texture) {\n const gl = this._gl;\n gl.activeTexture(gl.TEXTURE0 + slotNumber);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n }\n /**\n * Set an integer uniform for the current shader\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n setUniformInt(name, value) {\n this.setUniform('uniform1i', name, ~~value);\n }\n /**\n * Set an integer uniform for the current shader, WILL NOT THROW on error.\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n trySetUniformInt(name, value) {\n return this.trySetUniform('uniform1i', name, ~~value);\n }\n /**\n * Set an integer array uniform for the current shader\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n setUniformIntArray(name, value) {\n this.setUniform('uniform1iv', name, value);\n }\n /**\n * Set an integer array uniform for the current shader, WILL NOT THROW on error.\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n trySetUniformIntArray(name, value) {\n return this.trySetUniform('uniform1iv', name, value);\n }\n /**\n * Set a boolean uniform for the current shader\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n setUniformBoolean(name, value) {\n this.setUniform('uniform1i', name, value ? 1 : 0);\n }\n /**\n * Set a boolean uniform for the current shader, WILL NOT THROW on error.\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n trySetUniformBoolean(name, value) {\n return this.trySetUniform('uniform1i', name, value ? 1 : 0);\n }\n /**\n * Set a float uniform for the current shader\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n setUniformFloat(name, value) {\n this.setUniform('uniform1f', name, value);\n }\n /**\n * Set a float uniform for the current shader, WILL NOT THROW on error.\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n trySetUniformFloat(name, value) {\n return this.trySetUniform('uniform1f', name, value);\n }\n /**\n * Set a float array uniform for the current shader\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n setUniformFloatArray(name, value) {\n this.setUniform('uniform1fv', name, value);\n }\n /**\n * Set a float array uniform for the current shader, WILL NOT THROW on error.\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n trySetUniformFloatArray(name, value) {\n return this.trySetUniform('uniform1fv', name, value);\n }\n /**\n * Set a {@apilink Vector} uniform for the current shader\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n setUniformFloatVector(name, value) {\n this.setUniform('uniform2f', name, value.x, value.y);\n }\n /**\n * Set a {@apilink Vector} uniform for the current shader, WILL NOT THROW on error.\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n trySetUniformFloatVector(name, value) {\n return this.trySetUniform('uniform2f', name, value.x, value.y);\n }\n /**\n * Set a {@apilink Color} uniform for the current shader\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n setUniformFloatColor(name, value) {\n this.setUniform('uniform4f', name, value.r / 255, value.g / 255, value.b / 255, value.a);\n }\n /**\n * Set a {@apilink Color} uniform for the current shader, WILL NOT THROW on error.\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n trySetUniformFloatColor(name, value) {\n return this.trySetUniform('uniform4f', name, value.r / 255, value.g / 255, value.b / 255, value.a);\n }\n /**\n * Set an {@apilink Matrix} uniform for the current shader\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n setUniformMatrix(name, value) {\n this.setUniform('uniformMatrix4fv', name, false, value.data);\n }\n setUniformAffineMatrix(name, value) {\n this.setUniform('uniformMatrix4fv', name, false, [\n value.data[0],\n value.data[1],\n 0,\n 0,\n value.data[2],\n value.data[3],\n 0,\n 0,\n 0,\n 0,\n 1,\n 0,\n value.data[4],\n value.data[5],\n 0,\n 1\n ]);\n }\n /**\n * Set an {@apilink Matrix} uniform for the current shader, WILL NOT THROW on error.\n *\n * **Important** Must call ex.Shader.use() before setting a uniform!\n * @param name\n * @param value\n */\n trySetUniformMatrix(name, value) {\n return this.trySetUniform('uniformMatrix4fv', name, false, value.data);\n }\n /**\n * Set any available uniform type in webgl\n *\n * For example setUniform('uniformMatrix2fv', 'u_my2x2_mat`, ...);\n */\n setUniform(uniformType, name, ...value) {\n if (!this._compiled) {\n throw Error(`Must compile shader before setting a uniform ${uniformType}:${name}`);\n }\n if (!this.isCurrentlyBound()) {\n throw Error('Currently accessed shader instance is not the current active shader in WebGL,' +\n ' must call `shader.use()` before setting uniforms');\n }\n const gl = this._gl;\n const location = gl.getUniformLocation(this.program, name);\n if (location) {\n const args = [location, ...value];\n this._gl[uniformType].apply(this._gl, args);\n }\n else {\n throw Error(`Uniform ${uniformType}:${name} doesn\\'t exist or is not used in the shader source code,` +\n ' unused uniforms are optimized away by most browsers');\n }\n }\n /**\n * Set any available uniform type in webgl. Will try to set the uniform, will return false if the uniform didn't exist,\n * true if it was set.\n *\n * WILL NOT THROW on error\n *\n * For example setUniform('uniformMatrix2fv', 'u_my2x2_mat`, ...);\n *\n */\n trySetUniform(uniformType, name, ...value) {\n if (!this._compiled) {\n this._logger.warn(`Must compile shader before setting a uniform ${uniformType}:${name}`);\n return false;\n }\n if (!this.isCurrentlyBound()) {\n this._logger.warn('Currently accessed shader instance is not the current active shader in WebGL,' +\n ' must call `shader.use()` before setting uniforms');\n return false;\n }\n const gl = this._gl;\n const location = gl.getUniformLocation(this.program, name);\n if (location) {\n const args = [location, ...value];\n this._gl[uniformType].apply(this._gl, args);\n }\n else {\n return false;\n }\n return true;\n }\n _createProgram(gl, vertexShader, fragmentShader) {\n const program = gl.createProgram();\n if (program === null) {\n throw Error('Could not create graphics shader program');\n }\n // attach the shaders.\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n if (this._onPreLink) {\n this._onPreLink(program);\n }\n // link the program.\n gl.linkProgram(program);\n const success = gl.getProgramParameter(program, gl.LINK_STATUS);\n if (!success) {\n throw Error(`Could not link the program: [${gl.getProgramInfoLog(program)}]`);\n }\n return program;\n }\n _compileShader(gl, source, type) {\n const typeName = gl.VERTEX_SHADER === type ? 'vertex' : 'fragment';\n const shader = gl.createShader(type);\n if (shader === null) {\n throw Error(`Could not build shader: [${source}]`);\n }\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n const success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n if (!success) {\n const errorInfo = gl.getShaderInfoLog(shader);\n throw Error(`Could not compile ${typeName} shader:\\n\\n${errorInfo}${this._processSourceForError(source, errorInfo)}`);\n }\n return shader;\n }\n _processSourceForError(source, errorInfo) {\n if (!source) {\n return errorInfo;\n }\n const lines = source.split('\\n');\n const errorLineStart = errorInfo.search(/\\d:\\d/);\n const errorLineEnd = errorInfo.indexOf(' ', errorLineStart);\n const [_, error2] = errorInfo\n .slice(errorLineStart, errorLineEnd)\n .split(':')\n .map((v) => Number(v));\n for (let i = 0; i < lines.length; i++) {\n lines[i] = `${i + 1}: ${lines[i]}${error2 === i + 1 ? ' <----- ERROR!' : ''}`;\n }\n return '\\n\\nSource:\\n' + lines.join('\\n');\n }\n}\nShader._ACTIVE_SHADER_INSTANCE = null;\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/state-stack.ts\":\n/*!*****************************************!*\\\n !*** ./Graphics/Context/state-stack.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ContextState: () => (/* binding */ ContextState),\n/* harmony export */ StateStack: () => (/* binding */ StateStack)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Color */ \"./Color.ts\");\n/* harmony import */ var _Util_RentalPool__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Util/RentalPool */ \"./Util/RentalPool.ts\");\n\n\nclass ContextState {\n constructor() {\n this.opacity = 1;\n this.z = 0;\n this.tint = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.White;\n this.material = null;\n }\n}\nclass StateStack {\n constructor() {\n this._pool = new _Util_RentalPool__WEBPACK_IMPORTED_MODULE_1__.RentalPool(() => new ContextState(), (s) => {\n s.opacity = 1;\n s.z = 0;\n s.tint = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.White;\n s.material = null;\n return s;\n }, 100);\n this.current = this._pool.rent(true);\n this._states = [];\n }\n _cloneState(dest) {\n var _a;\n dest.opacity = this.current.opacity;\n dest.z = this.current.z;\n dest.tint = (_a = this.current.tint) === null || _a === void 0 ? void 0 : _a.clone();\n dest.material = this.current.material; // TODO is this going to cause problems when cloning\n return dest;\n }\n save() {\n this._states.push(this.current);\n this.current = this._cloneState(this._pool.rent());\n }\n restore() {\n this._pool.return(this.current);\n this.current = this._states.pop();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/texture-loader.ts\":\n/*!********************************************!*\\\n !*** ./Graphics/Context/texture-loader.ts ***!\n \\********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TextureLoader: () => (/* binding */ TextureLoader)\n/* harmony export */ });\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Wrapping */ \"./Graphics/Wrapping.ts\");\n\n\n\n/**\n * Manages loading image sources into webgl textures, a unique id is associated with all sources\n */\nclass TextureLoader {\n constructor(gl, _garbageCollector) {\n var _a;\n this._garbageCollector = _garbageCollector;\n this._textureMap = new Map();\n /**\n * Looks for textures that haven't been drawn in a while\n */\n this._collect = (image) => {\n var _a;\n if (this._gl) {\n const name = (_a = image.dataset.originalSrc) !== null && _a !== void 0 ? _a : image.constructor.name;\n TextureLoader._LOGGER.debug(`WebGL Texture for ${name} collected`);\n this.delete(image);\n return true;\n }\n return false;\n };\n this._gl = gl;\n TextureLoader._MAX_TEXTURE_SIZE = gl.getParameter(gl.MAX_TEXTURE_SIZE);\n if (this._garbageCollector) {\n TextureLoader._LOGGER.debug('WebGL Texture collection interval:', this._garbageCollector.collectionInterval);\n (_a = this._garbageCollector.garbageCollector) === null || _a === void 0 ? void 0 : _a.registerCollector('texture', this._garbageCollector.collectionInterval, this._collect);\n }\n }\n dispose() {\n for (const [image] of this._textureMap) {\n this.delete(image);\n }\n this._textureMap.clear();\n this._gl = null;\n }\n /**\n * Get the WebGL Texture from a source image\n * @param image\n */\n get(image) {\n return this._textureMap.get(image);\n }\n /**\n * Returns whether a source image has been loaded as a texture\n * @param image\n */\n has(image) {\n return this._textureMap.has(image);\n }\n /**\n * Loads a graphic into webgl and returns it's texture info, a webgl context must be previously registered\n * @param image Source graphic\n * @param options {ImageSourceOptions} Optionally configure the ImageFiltering and ImageWrapping mode to apply to the loaded texture\n * @param forceUpdate Optionally force a texture to be reloaded, useful if the source graphic has changed\n */\n load(image, options, forceUpdate = false) {\n var _a, _b;\n // Ignore loading if webgl is not registered\n const gl = this._gl;\n if (!gl) {\n return null;\n }\n const { filtering, wrapping } = { ...options };\n let tex = null;\n // If reuse the texture if it's from the same source\n if (this.has(image)) {\n tex = this.get(image);\n }\n // Update existing webgl texture and return early\n if (tex) {\n if (forceUpdate) {\n gl.bindTexture(gl.TEXTURE_2D, tex);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);\n }\n (_a = this._garbageCollector) === null || _a === void 0 ? void 0 : _a.garbageCollector.touch(image);\n return tex;\n }\n // No texture exists create a new one\n tex = gl.createTexture();\n // TODO implement texture gc with weakmap and timer\n TextureLoader.checkImageSizeSupportedAndLog(image);\n gl.bindTexture(gl.TEXTURE_2D, tex);\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);\n let wrappingConfig;\n if (wrapping) {\n if (typeof wrapping === 'string') {\n wrappingConfig = {\n x: wrapping,\n y: wrapping\n };\n }\n else {\n wrappingConfig = {\n x: wrapping.x,\n y: wrapping.y\n };\n }\n }\n const { x: xWrap, y: yWrap } = wrappingConfig !== null && wrappingConfig !== void 0 ? wrappingConfig : TextureLoader.wrapping;\n switch (xWrap) {\n case _Wrapping__WEBPACK_IMPORTED_MODULE_0__.ImageWrapping.Clamp:\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n break;\n case _Wrapping__WEBPACK_IMPORTED_MODULE_0__.ImageWrapping.Repeat:\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT);\n break;\n case _Wrapping__WEBPACK_IMPORTED_MODULE_0__.ImageWrapping.Mirror:\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.MIRRORED_REPEAT);\n break;\n default:\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n }\n switch (yWrap) {\n case _Wrapping__WEBPACK_IMPORTED_MODULE_0__.ImageWrapping.Clamp:\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n break;\n case _Wrapping__WEBPACK_IMPORTED_MODULE_0__.ImageWrapping.Repeat:\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT);\n break;\n case _Wrapping__WEBPACK_IMPORTED_MODULE_0__.ImageWrapping.Mirror:\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.MIRRORED_REPEAT);\n break;\n default:\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n }\n // NEAREST for pixel art, LINEAR for hi-res\n const filterMode = filtering !== null && filtering !== void 0 ? filtering : TextureLoader.filtering;\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filterMode === _Filtering__WEBPACK_IMPORTED_MODULE_1__.ImageFiltering.Pixel ? gl.NEAREST : gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filterMode === _Filtering__WEBPACK_IMPORTED_MODULE_1__.ImageFiltering.Pixel ? gl.NEAREST : gl.LINEAR);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);\n this._textureMap.set(image, tex);\n (_b = this._garbageCollector) === null || _b === void 0 ? void 0 : _b.garbageCollector.addCollectableResource('texture', image);\n return tex;\n }\n delete(image) {\n // Ignore loading if webgl is not registered\n const gl = this._gl;\n if (!gl) {\n return;\n }\n if (this.has(image)) {\n const texture = this.get(image);\n if (texture) {\n this._textureMap.delete(image);\n gl.deleteTexture(texture);\n }\n }\n }\n /**\n * Takes an image and returns if it meets size criteria for hardware\n * @param image\n * @returns if the image will be supported at runtime\n */\n static checkImageSizeSupportedAndLog(image) {\n var _a;\n const originalSrc = (_a = image.dataset.originalSrc) !== null && _a !== void 0 ? _a : 'internal canvas bitmap';\n if (image.width > TextureLoader._MAX_TEXTURE_SIZE || image.height > TextureLoader._MAX_TEXTURE_SIZE) {\n TextureLoader._LOGGER.error(`The image [${originalSrc}] provided to Excalibur is too large for the device's maximum texture size of ` +\n `(${TextureLoader._MAX_TEXTURE_SIZE}x${TextureLoader._MAX_TEXTURE_SIZE}) please resize to an image ` +\n `for excalibur to render properly.\\n\\nImages will likely render as black rectangles.\\n\\n` +\n `Read more here: https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/WebGL_best_practices#understand_system_limits`);\n return false;\n }\n else if (image.width > 4096 || image.height > 4096) {\n // https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/WebGL_best_practices#understand_system_limits\n TextureLoader._LOGGER.warn(`The image [${originalSrc}] provided to excalibur is too large may not work on all mobile devices, ` +\n `it is recommended you resize images to a maximum (4096x4096).\\n\\n` +\n `Images will likely render as black rectangles on some mobile platforms.\\n\\n` +\n `Read more here: https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/WebGL_best_practices#understand_system_limits`);\n }\n return true;\n }\n}\nTextureLoader._LOGGER = _Util_Log__WEBPACK_IMPORTED_MODULE_2__.Logger.getInstance();\n/**\n * Sets the default filtering for the Excalibur texture loader, default {@apilink ImageFiltering.Blended}\n */\nTextureLoader.filtering = _Filtering__WEBPACK_IMPORTED_MODULE_1__.ImageFiltering.Blended;\nTextureLoader.wrapping = { x: _Wrapping__WEBPACK_IMPORTED_MODULE_0__.ImageWrapping.Clamp, y: _Wrapping__WEBPACK_IMPORTED_MODULE_0__.ImageWrapping.Clamp };\nTextureLoader._MAX_TEXTURE_SIZE = 4096;\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/transform-stack.ts\":\n/*!*********************************************!*\\\n !*** ./Graphics/Context/transform-stack.ts ***!\n \\*********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TransformStack: () => (/* binding */ TransformStack)\n/* harmony export */ });\n/* harmony import */ var _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Math/affine-matrix */ \"./Math/affine-matrix.ts\");\n/* harmony import */ var _Util_RentalPool__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Util/RentalPool */ \"./Util/RentalPool.ts\");\n\n\nclass TransformStack {\n constructor() {\n this._pool = new _Util_RentalPool__WEBPACK_IMPORTED_MODULE_0__.RentalPool(() => _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_1__.AffineMatrix.identity(), (mat) => mat.reset(), 100);\n this._transforms = [];\n this._currentTransform = this._pool.rent(true);\n }\n save() {\n this._transforms.push(this._currentTransform);\n this._currentTransform = this._currentTransform.clone(this._pool.rent());\n }\n restore() {\n this._pool.return(this._currentTransform);\n this._currentTransform = this._transforms.pop();\n }\n translate(x, y) {\n return this._currentTransform.translate(x, y);\n }\n rotate(angle) {\n return this._currentTransform.rotate(angle);\n }\n scale(x, y) {\n return this._currentTransform.scale(x, y);\n }\n reset() {\n this._currentTransform.reset();\n }\n set current(matrix) {\n this._currentTransform = matrix;\n }\n get current() {\n return this._currentTransform;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/vertex-buffer.ts\":\n/*!*******************************************!*\\\n !*** ./Graphics/Context/vertex-buffer.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ VertexBuffer: () => (/* binding */ VertexBuffer)\n/* harmony export */ });\n/**\n * Helper around vertex buffer to simplify creating and uploading geometry\n *\n * Under the hood uses Float32Array\n */\nclass VertexBuffer {\n constructor(options) {\n /**\n * If the vertices never change switching 'static' can be more efficient on the gpu\n *\n * Default is 'dynamic'\n */\n this.type = 'dynamic';\n const { gl, size, type, data } = options;\n this._gl = gl;\n this.buffer = this._gl.createBuffer();\n if (!data && !size) {\n throw Error('Must either provide data or a size to the VertexBuffer');\n }\n if (!data) {\n this.bufferData = new Float32Array(size);\n }\n else {\n this.bufferData = data;\n }\n this.type = type !== null && type !== void 0 ? type : this.type;\n // Allocate buffer\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer);\n gl.bufferData(gl.ARRAY_BUFFER, this.bufferData, this.type === 'static' ? gl.STATIC_DRAW : gl.DYNAMIC_DRAW);\n }\n /**\n * Bind this vertex buffer\n */\n bind() {\n const gl = this._gl;\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer);\n }\n unbind() {\n const gl = this._gl;\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n }\n /**\n * Upload vertex buffer geometry to the GPU\n */\n upload(count) {\n const gl = this._gl;\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer);\n if (count) {\n gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.bufferData, 0, count);\n }\n else {\n // TODO always use bufferSubData? need to perf test it\n gl.bufferData(gl.ARRAY_BUFFER, this.bufferData, this.type === 'static' ? gl.STATIC_DRAW : gl.DYNAMIC_DRAW);\n }\n }\n dispose() {\n const gl = this._gl;\n gl.deleteBuffer(this.buffer);\n this._gl = null;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/vertex-layout.ts\":\n/*!*******************************************!*\\\n !*** ./Graphics/Context/vertex-layout.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ VertexLayout: () => (/* binding */ VertexLayout)\n/* harmony export */ });\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../.. */ \"./Util/Log.ts\");\n/* harmony import */ var _webgl_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./webgl-util */ \"./Graphics/Context/webgl-util.ts\");\n\n\n/**\n * Helper around creating vertex attributes in a given {@apilink VertexBuffer}, this is useful for describing\n * the memory layout for your vertices inside a particular buffer\n *\n * Note: This helper assumes interleaved attributes in one {@apilink VertexBuffer}, not many.\n *\n * Working with `gl.vertexAttribPointer` can be tricky, and this attempts to double check you\n */\nclass VertexLayout {\n get vertexBuffer() {\n return this._vertexBuffer;\n }\n get attributes() {\n return this._attributes;\n }\n constructor(options) {\n this._logger = ___WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance();\n this._suppressWarnings = false;\n this._layout = [];\n this._attributes = [];\n this._vertexTotalSizeBytes = 0;\n this._initialized = false;\n const { gl, shader, vertexBuffer, attributes, suppressWarnings } = options;\n this._gl = gl;\n this._vertexBuffer = vertexBuffer;\n this._attributes = attributes;\n this._shader = shader;\n this._suppressWarnings = suppressWarnings;\n if (shader) {\n this.initialize();\n }\n }\n /**\n * Total number of bytes that the vertex will take up\n */\n get totalVertexSizeBytes() {\n return this._vertexTotalSizeBytes;\n }\n set shader(shader) {\n if (shader && this._shader !== shader) {\n this._shader = shader;\n this.initialize();\n }\n }\n get shader() {\n return this._shader;\n }\n /**\n * Layouts need shader locations and must be bound to a shader\n */\n initialize() {\n if (this._initialized) {\n return;\n }\n if (!this._shader) {\n return;\n }\n if (!this._shader.compiled) {\n throw Error('Shader not compiled, shader must be compiled before defining a vertex layout');\n }\n this._vertexTotalSizeBytes = 0;\n this._layout.length = 0;\n const shaderAttributes = this._shader.attributes;\n for (const attribute of this._attributes) {\n const attrib = shaderAttributes[attribute[0]];\n if (!attrib) {\n if (!(0,_webgl_util__WEBPACK_IMPORTED_MODULE_1__.isAttributeInSource)(this._shader.vertexSource, attribute[0])) {\n throw Error(`The attribute named: ${attribute[0]} size ${attribute[1]}` +\n ` not found in the shader source code:\\n ${this._shader.vertexSource}`);\n }\n if (!this._suppressWarnings) {\n this._logger.warn(`The attribute named: ${attribute[0]} size ${attribute[1]}` +\n ` not found in the compiled shader. This is possibly a bug:\\n` +\n ` 1. Not a bug, but should remove unused code - attribute \"${attribute[0]}\" is unused in` +\n ` vertex/fragment and has been automatically removed by glsl compiler.\\n` +\n ` 2. Definitely a bug, attribute \"${attribute[0]}\" in layout has been mistyped or is missing` +\n ` in shader, check vertex/fragment source.`);\n }\n const glType = (0,_webgl_util__WEBPACK_IMPORTED_MODULE_1__.getGLTypeFromSource)(this._gl, this._shader.vertexSource, attribute[0]);\n // Unused attribute placeholder\n this._layout.push({\n name: attribute[0],\n glType,\n size: attribute[1],\n location: -1,\n normalized: false\n });\n }\n if (attrib) {\n if (attrib.size !== attribute[1]) {\n throw Error(`VertexLayout size definition for attribute: [${attribute[0]}, ${attribute[1]}],` +\n ` doesn\\'t match shader source size ${attrib.size}:\\n ${this._shader.vertexSource}`);\n }\n this._layout.push(attrib);\n }\n }\n // calc size\n let componentsPerVertex = 0;\n for (const vertAttribute of this._layout) {\n const typeSize = (0,_webgl_util__WEBPACK_IMPORTED_MODULE_1__.getGlTypeSizeBytes)(this._gl, vertAttribute.glType);\n this._vertexTotalSizeBytes += typeSize * vertAttribute.size;\n componentsPerVertex += vertAttribute.size;\n }\n if (this._vertexBuffer.bufferData.length % componentsPerVertex !== 0) {\n this._logger.warn(`The vertex component size (${componentsPerVertex}) does NOT divide evenly into the specified vertex buffer` +\n ` (${this._vertexBuffer.bufferData.length})`);\n }\n // create VAO\n const gl = this._gl;\n this._vao = gl.createVertexArray();\n gl.bindVertexArray(this._vao);\n this._vertexBuffer.bind();\n let offset = 0;\n for (const vert of this._layout) {\n // skip unused attributes\n if (vert.location !== -1) {\n if (vert.glType === gl.INT) {\n gl.vertexAttribIPointer(vert.location, vert.size, vert.glType, this.totalVertexSizeBytes, offset);\n }\n else {\n gl.vertexAttribPointer(vert.location, vert.size, vert.glType, vert.normalized, this.totalVertexSizeBytes, offset);\n }\n gl.enableVertexAttribArray(vert.location);\n }\n offset += (0,_webgl_util__WEBPACK_IMPORTED_MODULE_1__.getGlTypeSizeBytes)(gl, vert.glType) * vert.size;\n }\n gl.bindVertexArray(null);\n this._vertexBuffer.unbind();\n this._initialized = true;\n }\n /**\n * Bind this layout with it's associated vertex buffer\n * @param uploadBuffer Optionally indicate you wish to upload the buffer to the GPU associated with this layout\n */\n use(uploadBuffer = false, count) {\n if (!this._shader) {\n throw Error('No shader is associated with this vertex layout, a shader must be set');\n }\n const gl = this._gl;\n if (!this._shader.isCurrentlyBound()) {\n throw Error('Shader associated with this vertex layout is not active! Call shader.use() before layout.use()');\n }\n this._vertexBuffer.bind();\n if (uploadBuffer) {\n this._vertexBuffer.upload(count);\n }\n gl.bindVertexArray(this._vao);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Context/webgl-util.ts\":\n/*!****************************************!*\\\n !*** ./Graphics/Context/webgl-util.ts ***!\n \\****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ getAttributeComponentSize: () => (/* binding */ getAttributeComponentSize),\n/* harmony export */ getAttributePointerType: () => (/* binding */ getAttributePointerType),\n/* harmony export */ getGLTypeFromSource: () => (/* binding */ getGLTypeFromSource),\n/* harmony export */ getGlTypeSizeBytes: () => (/* binding */ getGlTypeSizeBytes),\n/* harmony export */ getMaxShaderComplexity: () => (/* binding */ getMaxShaderComplexity),\n/* harmony export */ isAttributeInSource: () => (/* binding */ isAttributeInSource)\n/* harmony export */ });\n/**\n * Return the size of the GlType in bytes\n * @param gl\n * @param type\n */\nfunction getGlTypeSizeBytes(gl, type) {\n switch (type) {\n case gl.INT:\n case gl.UNSIGNED_INT:\n case gl.FLOAT:\n return 4;\n case gl.SHORT:\n return 2;\n case gl.UNSIGNED_SHORT:\n return 2;\n case gl.BYTE:\n return 1;\n case gl.UNSIGNED_BYTE:\n return 1;\n default:\n return 1;\n }\n}\n/**\n * Checks if an attribute is present in vertex source\n */\nfunction isAttributeInSource(source, variable) {\n const attributeRegexTemplate = `(?[a-z0-9]+)\\\\s+${variable};`;\n const regex = new RegExp(attributeRegexTemplate, 'g');\n const matches = regex.exec(source);\n return (matches === null || matches === void 0 ? void 0 : matches.length) > 0;\n}\n/**\n * Attempt to discern the glType of an attribute from vertex source\n * @param gl\n * @param source\n * @param variable\n */\nfunction getGLTypeFromSource(gl, source, variable) {\n var _a;\n const attributeRegexTemplate = `(?[a-z0-9]+)\\\\s+${variable};`;\n const regex = new RegExp(attributeRegexTemplate, 'g');\n const matches = regex.exec(source);\n const type = (_a = matches === null || matches === void 0 ? void 0 : matches.groups) === null || _a === void 0 ? void 0 : _a.type;\n switch (type) {\n case 'float':\n case 'vec2':\n case 'vec3':\n case 'vec4':\n return gl.FLOAT;\n case 'int':\n case 'ivec2':\n case 'ivec3':\n case 'ivec4':\n return gl.INT;\n case 'uint':\n case 'uvec2':\n case 'uvec3':\n case 'uvec4':\n return gl.UNSIGNED_INT;\n case 'bool':\n case 'bvec2':\n case 'bvec3':\n case 'bvec4':\n return gl.BOOL;\n case 'short':\n return gl.SHORT;\n case 'ushort':\n return gl.UNSIGNED_SHORT;\n case 'ubyte':\n return gl.UNSIGNED_BYTE;\n case 'byte':\n return gl.BYTE;\n default:\n return gl.FLOAT;\n }\n}\n/**\n * Based on the type return the number of attribute components\n *\n * https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/vertexAttribPointer\n * @param gl\n * @param type\n */\nfunction getAttributeComponentSize(gl, type) {\n switch (type) {\n case gl.LOW_FLOAT:\n case gl.HIGH_FLOAT:\n case gl.FLOAT:\n return 1;\n case gl.FLOAT_VEC2:\n return 2;\n case gl.FLOAT_VEC3:\n return 3;\n case gl.FLOAT_VEC4:\n return 4;\n case gl.BYTE:\n return 1;\n case gl.UNSIGNED_BYTE:\n return 1;\n case gl.UNSIGNED_SHORT:\n case gl.SHORT:\n return 1;\n default:\n return 1;\n }\n}\n/**\n * Based on the attribute return the corresponding supported attrib pointer type\n * https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/vertexAttribPointer\n * @param gl\n * @param type\n */\nfunction getAttributePointerType(gl, type) {\n switch (type) {\n case gl.LOW_FLOAT:\n case gl.HIGH_FLOAT:\n case gl.FLOAT:\n case gl.FLOAT_VEC2:\n case gl.FLOAT_VEC3:\n case gl.FLOAT_VEC4:\n return gl.FLOAT;\n case gl.BYTE:\n return gl.BYTE;\n case gl.UNSIGNED_BYTE:\n return gl.UNSIGNED_BYTE;\n case gl.SHORT:\n return gl.SHORT;\n case gl.UNSIGNED_SHORT:\n return gl.UNSIGNED_SHORT;\n default:\n return gl.FLOAT;\n }\n}\n/**\n *\n */\nfunction getMaxShaderComplexity(gl, numIfs) {\n const assembleTestShader = (numIfs) => {\n const testShader = `#version 300 es\r\n precision mediump float;\r\n out vec4 fragColor;\r\n void main() {\r\n float index = 1.01;\r\n %%complexity%%\r\n }`;\n let testComplexity = '';\n for (let i = 0; i < numIfs; i++) {\n if (i === 0) {\n testComplexity += `if (index <= ${i}.5) {\\n`;\n }\n else {\n testComplexity += ` else if (index <= ${i}.5) {\\n`;\n }\n testComplexity += ` fragColor = vec4(1.0);\\n`;\n testComplexity += ` }\\n`;\n }\n return testShader.replace('%%complexity%%', testComplexity);\n };\n let canCompile = false;\n do {\n const test = assembleTestShader(numIfs);\n const shader = gl.createShader(gl.FRAGMENT_SHADER);\n gl.shaderSource(shader, test);\n gl.compileShader(shader);\n canCompile = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n if (!canCompile) {\n numIfs = (numIfs / 2) | 0;\n }\n } while (!canCompile);\n return numIfs;\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Debug.ts\":\n/*!***************************!*\\\n !*** ./Graphics/Debug.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Debug: () => (/* binding */ Debug)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n\nclass Debug {\n static registerGraphicsContext(ctx) {\n Debug._ctx = ctx;\n }\n static draw(debugDrawCall) {\n this._drawCalls.push(debugDrawCall);\n }\n static drawPoint(point, options) {\n Debug.draw((ctx) => {\n ctx.debug.drawPoint(point, options);\n });\n }\n static drawLine(start, end, options) {\n Debug.draw((ctx) => {\n ctx.debug.drawLine(start, end, options);\n });\n }\n static drawLines(points, options) {\n if (points.length > 1) {\n Debug.draw((ctx) => {\n for (let i = 0; i < points.length - 1; i++) {\n ctx.debug.drawLine(points[i], points[i + 1], options);\n }\n });\n }\n }\n static drawText(text, pos) {\n Debug.draw((ctx) => {\n ctx.debug.drawText(text, pos);\n });\n }\n static drawPolygon(points, options) {\n if (points.length > 1) {\n Debug.draw((ctx) => {\n const firstPoint = points[0];\n const polygon = [...points, firstPoint];\n for (let i = 0; i < polygon.length - 1; i++) {\n ctx.debug.drawLine(polygon[i], polygon[i + 1], options);\n }\n });\n }\n }\n static drawCircle(center, radius, options) {\n const { color, strokeColor, width } = {\n color: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Black,\n strokeColor: undefined,\n width: undefined,\n ...options\n };\n Debug.draw((ctx) => {\n ctx.drawCircle(center, radius, color, strokeColor, width);\n });\n }\n static drawBounds(boundingBox, options) {\n Debug.draw((ctx) => {\n ctx.debug.drawRect(boundingBox.left, boundingBox.top, boundingBox.width, boundingBox.height, options);\n });\n }\n static drawRay(ray, options) {\n const { distance, color } = {\n color: _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Blue,\n distance: 10,\n ...options\n };\n Debug.draw((ctx) => {\n const start = ray.pos;\n const end = ray.pos.add(ray.dir.scale(distance));\n ctx.debug.drawLine(start, end, { color });\n });\n }\n static flush(ctx) {\n ctx.save();\n ctx.z = Debug.z;\n for (const drawCall of Debug._drawCalls) {\n drawCall(ctx);\n }\n ctx.restore();\n Debug.clear();\n }\n static clear() {\n Debug._drawCalls.length = 0;\n }\n}\nDebug._drawCalls = [];\nDebug.z = Infinity;\n\n\n/***/ }),\n\n/***/ \"./Graphics/DebugGraphicsComponent.ts\":\n/*!********************************************!*\\\n !*** ./Graphics/DebugGraphicsComponent.ts ***!\n \\********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DebugGraphicsComponent: () => (/* binding */ DebugGraphicsComponent)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Component */ \"./EntityComponentSystem/Component.ts\");\n\n/**\n * Provide arbitrary drawing for the purposes of debugging your game\n *\n * Will only show when the Engine is set to debug mode {@apilink Engine.showDebug} or {@apilink Engine.toggleDebug}\n *\n */\nclass DebugGraphicsComponent extends _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor(draw, useTransform = true) {\n super();\n this.draw = draw;\n this.useTransform = useTransform;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Filtering.ts\":\n/*!*******************************!*\\\n !*** ./Graphics/Filtering.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ImageFiltering: () => (/* binding */ ImageFiltering),\n/* harmony export */ parseImageFiltering: () => (/* binding */ parseImageFiltering)\n/* harmony export */ });\n/**\n * Describes the different image filtering modes\n */\nvar ImageFiltering;\n(function (ImageFiltering) {\n /**\n * Pixel is useful when you do not want smoothing aka antialiasing applied to your graphics.\n *\n * Useful for Pixel art aesthetics.\n */\n ImageFiltering[\"Pixel\"] = \"Pixel\";\n /**\n * Blended is useful when you have high resolution artwork and would like it blended and smoothed\n */\n ImageFiltering[\"Blended\"] = \"Blended\";\n})(ImageFiltering || (ImageFiltering = {}));\n/**\n * Parse the image filtering attribute value, if it doesn't match returns null\n */\nfunction parseImageFiltering(val) {\n switch (val) {\n case ImageFiltering.Pixel:\n return ImageFiltering.Pixel;\n case ImageFiltering.Blended:\n return ImageFiltering.Blended;\n default:\n return undefined;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Font.ts\":\n/*!**************************!*\\\n !*** ./Graphics/Font.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Font: () => (/* binding */ Font)\n/* harmony export */ });\n/* harmony import */ var _Collision_Index__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Collision/Index */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _FontCommon__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./FontCommon */ \"./Graphics/FontCommon.ts\");\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _FontTextInstance__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./FontTextInstance */ \"./Graphics/FontTextInstance.ts\");\n/* harmony import */ var _FontCache__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./FontCache */ \"./Graphics/FontCache.ts\");\n\n\n\n\n\n\n\n/**\n * Represents a system or web font in Excalibur\n *\n * If no options specified, the system sans-serif 10 pixel is used\n *\n * If loading a custom web font be sure to have the font loaded before you use it https://erikonarheim.com/posts/dont-test-fonts/\n */\nclass Font extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n constructor(options = {}) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v;\n super(options); // <- Graphics properties\n /**\n * Set the font filtering mode, by default set to {@apilink ImageFiltering.Blended} regardless of the engine default smoothing\n *\n * If you have a pixel style font that may be a reason to switch this to {@apilink ImageFiltering.Pixel}\n */\n this.filtering = _Filtering__WEBPACK_IMPORTED_MODULE_1__.ImageFiltering.Blended;\n /**\n * Font quality determines the size of the underlying raster text, higher quality means less jagged edges.\n * If quality is set to 1, then just enough raster bitmap is generated to render the text.\n *\n * You can think of quality as how zoomed in to the text you can get before seeing jagged edges.\n *\n * (Default 2)\n */\n this.quality = 2;\n // Raster properties for fonts\n this.padding = 2;\n this.smoothing = false;\n this.lineWidth = 1;\n this.lineDash = [];\n this.color = _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Black;\n this.family = 'sans-serif';\n this.style = _FontCommon__WEBPACK_IMPORTED_MODULE_3__.FontStyle.Normal;\n this.bold = false;\n this.unit = _FontCommon__WEBPACK_IMPORTED_MODULE_3__.FontUnit.Px;\n this.textAlign = _FontCommon__WEBPACK_IMPORTED_MODULE_3__.TextAlign.Left;\n this.baseAlign = _FontCommon__WEBPACK_IMPORTED_MODULE_3__.BaseAlign.Top;\n this.direction = _FontCommon__WEBPACK_IMPORTED_MODULE_3__.Direction.LeftToRight;\n /**\n * Font line height in pixels, default line height if unset\n */\n this.lineHeight = undefined;\n this.size = 10;\n this._textBounds = new _Collision_Index__WEBPACK_IMPORTED_MODULE_4__.BoundingBox();\n this._textMeasurement = new _FontTextInstance__WEBPACK_IMPORTED_MODULE_5__.FontTextInstance(this, '', _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Black);\n // Raster properties\n this.smoothing = (_a = options === null || options === void 0 ? void 0 : options.smoothing) !== null && _a !== void 0 ? _a : this.smoothing;\n this.padding = (_b = options === null || options === void 0 ? void 0 : options.padding) !== null && _b !== void 0 ? _b : this.padding;\n this.color = (_c = options === null || options === void 0 ? void 0 : options.color) !== null && _c !== void 0 ? _c : this.color;\n this.strokeColor = (_d = options === null || options === void 0 ? void 0 : options.strokeColor) !== null && _d !== void 0 ? _d : this.strokeColor;\n this.lineDash = (_e = options === null || options === void 0 ? void 0 : options.lineDash) !== null && _e !== void 0 ? _e : this.lineDash;\n this.lineWidth = (_f = options === null || options === void 0 ? void 0 : options.lineWidth) !== null && _f !== void 0 ? _f : this.lineWidth;\n this.filtering = (_g = options === null || options === void 0 ? void 0 : options.filtering) !== null && _g !== void 0 ? _g : this.filtering;\n // Font specific properties\n this.family = (_h = options === null || options === void 0 ? void 0 : options.family) !== null && _h !== void 0 ? _h : this.family;\n this.style = (_j = options === null || options === void 0 ? void 0 : options.style) !== null && _j !== void 0 ? _j : this.style;\n this.bold = (_k = options === null || options === void 0 ? void 0 : options.bold) !== null && _k !== void 0 ? _k : this.bold;\n this.size = (_l = options === null || options === void 0 ? void 0 : options.size) !== null && _l !== void 0 ? _l : this.size;\n this.unit = (_m = options === null || options === void 0 ? void 0 : options.unit) !== null && _m !== void 0 ? _m : this.unit;\n this.textAlign = (_o = options === null || options === void 0 ? void 0 : options.textAlign) !== null && _o !== void 0 ? _o : this.textAlign;\n this.baseAlign = (_p = options === null || options === void 0 ? void 0 : options.baseAlign) !== null && _p !== void 0 ? _p : this.baseAlign;\n this.direction = (_q = options === null || options === void 0 ? void 0 : options.direction) !== null && _q !== void 0 ? _q : this.direction;\n this.lineHeight = (_r = options === null || options === void 0 ? void 0 : options.lineHeight) !== null && _r !== void 0 ? _r : this.lineHeight;\n this.quality = (_s = options === null || options === void 0 ? void 0 : options.quality) !== null && _s !== void 0 ? _s : this.quality;\n if (options === null || options === void 0 ? void 0 : options.shadow) {\n this.shadow = {};\n this.shadow.blur = (_t = options.shadow.blur) !== null && _t !== void 0 ? _t : this.shadow.blur;\n this.shadow.offset = (_u = options.shadow.offset) !== null && _u !== void 0 ? _u : this.shadow.offset;\n this.shadow.color = (_v = options.shadow.color) !== null && _v !== void 0 ? _v : this.shadow.color;\n }\n }\n clone() {\n return new Font({\n ...this.cloneGraphicOptions(),\n size: this.size,\n unit: this.unit,\n family: this.family,\n style: this.style,\n bold: this.bold,\n textAlign: this.textAlign,\n baseAlign: this.baseAlign,\n direction: this.direction,\n shadow: this.shadow\n ? {\n blur: this.shadow.blur,\n offset: this.shadow.offset,\n color: this.shadow.color\n }\n : undefined\n });\n }\n get fontString() {\n return `${this.style} ${this.bold ? 'bold' : ''} ${this.size}${this.unit} ${this.family}`;\n }\n get localBounds() {\n return this._textBounds;\n }\n _drawImage(_ex, _x, _y) {\n // TODO weird vestigial drawimage\n }\n _rotate(ex) {\n var _a;\n // TODO this needs to change depending on the bounding box...\n const origin = (_a = this.origin) !== null && _a !== void 0 ? _a : this._textBounds.center;\n ex.translate(origin.x, origin.y);\n ex.rotate(this.rotation);\n ex.translate(-origin.x, -origin.y);\n }\n _flip(ex) {\n if (this.flipHorizontal) {\n ex.translate(this._textBounds.width / this.scale.x, 0);\n ex.scale(-1, 1);\n }\n if (this.flipVertical) {\n ex.translate(0, -this._textBounds.height / 2 / this.scale.y);\n ex.scale(1, -1);\n }\n }\n measureTextWithoutCache(text, maxWidth) {\n return this._textMeasurement.measureText(text, maxWidth);\n }\n /**\n * Returns a BoundingBox that is the total size of the text including multiple lines\n *\n * Does not include any padding or adjustment\n * @param text\n * @returns BoundingBox\n */\n measureText(text, maxWidth) {\n return _FontCache__WEBPACK_IMPORTED_MODULE_6__.FontCache.measureText(text, this, maxWidth);\n }\n _postDraw(ex) {\n ex.restore();\n }\n render(ex, text, colorOverride, x, y, maxWidth) {\n const textInstance = _FontCache__WEBPACK_IMPORTED_MODULE_6__.FontCache.getTextInstance(text, this, colorOverride);\n // Apply affine transformations\n this._textBounds = textInstance.dimensions;\n this._preDraw(ex, x, y);\n textInstance.render(ex, x, y, maxWidth);\n this._postDraw(ex);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/FontCache.ts\":\n/*!*******************************!*\\\n !*** ./Graphics/FontCache.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FontCache: () => (/* binding */ FontCache)\n/* harmony export */ });\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _FontTextInstance__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./FontTextInstance */ \"./Graphics/FontTextInstance.ts\");\n\n\nclass FontCache {\n static measureText(text, font, maxWidth) {\n const hash = _FontTextInstance__WEBPACK_IMPORTED_MODULE_0__.FontTextInstance.getHashCode(font, text);\n if (FontCache._MEASURE_CACHE.has(hash)) {\n return FontCache._MEASURE_CACHE.get(hash);\n }\n FontCache._LOGGER.debug('Font text measurement cache miss');\n const measurement = font.measureTextWithoutCache(text, maxWidth);\n FontCache._MEASURE_CACHE.set(hash, measurement);\n return measurement;\n }\n static getTextInstance(text, font, color) {\n const hash = _FontTextInstance__WEBPACK_IMPORTED_MODULE_0__.FontTextInstance.getHashCode(font, text, color);\n let textInstance = FontCache._TEXT_CACHE.get(hash);\n if (!textInstance) {\n textInstance = new _FontTextInstance__WEBPACK_IMPORTED_MODULE_0__.FontTextInstance(font, text, color);\n FontCache._TEXT_CACHE.set(hash, textInstance);\n FontCache._LOGGER.debug('Font text instance cache miss');\n }\n // Cache the bitmap for certain amount of time\n FontCache._TEXT_USAGE.set(textInstance, performance.now());\n return textInstance;\n }\n static checkAndClearCache() {\n const deferred = [];\n const currentHashCodes = new Set();\n for (const [textInstance, time] of FontCache._TEXT_USAGE.entries()) {\n // if bitmap hasn't been used in 100 ms clear it\n if (time + FontCache.FONT_TIMEOUT < performance.now()) {\n FontCache._LOGGER.debug(`Text cache entry timed out ${textInstance.text}`);\n deferred.push(textInstance);\n textInstance.dispose();\n }\n else {\n const hash = textInstance.getHashCode(false);\n currentHashCodes.add(hash);\n }\n }\n // Deferred removal of text instances\n deferred.forEach((t) => {\n FontCache._TEXT_USAGE.delete(t);\n });\n // Regenerate text instance cache\n this._TEXT_CACHE.clear();\n for (const [textInstance] of this._TEXT_USAGE.entries()) {\n this._TEXT_CACHE.set(textInstance.getHashCode(), textInstance);\n }\n // Regenerated measurement cache\n const newTextMeasurementCache = new Map();\n for (const current of currentHashCodes) {\n if (FontCache._MEASURE_CACHE.has(current)) {\n newTextMeasurementCache.set(current, FontCache._MEASURE_CACHE.get(current));\n }\n }\n this._MEASURE_CACHE.clear();\n this._MEASURE_CACHE = newTextMeasurementCache;\n }\n static get cacheSize() {\n return FontCache._TEXT_USAGE.size;\n }\n /**\n * Force clear all cached text bitmaps\n */\n static clearCache() {\n for (const [textInstance] of FontCache._TEXT_USAGE.entries()) {\n textInstance.dispose();\n }\n FontCache._TEXT_USAGE.clear();\n FontCache._TEXT_CACHE.clear();\n FontCache._MEASURE_CACHE.clear();\n }\n}\nFontCache.FONT_TIMEOUT = 500;\nFontCache._LOGGER = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\nFontCache._TEXT_USAGE = new Map();\nFontCache._TEXT_CACHE = new Map();\nFontCache._MEASURE_CACHE = new Map();\n\n\n/***/ }),\n\n/***/ \"./Graphics/FontCommon.ts\":\n/*!********************************!*\\\n !*** ./Graphics/FontCommon.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BaseAlign: () => (/* binding */ BaseAlign),\n/* harmony export */ Direction: () => (/* binding */ Direction),\n/* harmony export */ FontStyle: () => (/* binding */ FontStyle),\n/* harmony export */ FontUnit: () => (/* binding */ FontUnit),\n/* harmony export */ TextAlign: () => (/* binding */ TextAlign)\n/* harmony export */ });\n/**\n * Enum representing the different font size units\n * https://developer.mozilla.org/en-US/docs/Web/CSS/font-size\n */\nvar FontUnit;\n(function (FontUnit) {\n /**\n * Em is a scalable unit, 1 em is equal to the current font size of the current element, parent elements can effect em values\n */\n FontUnit[\"Em\"] = \"em\";\n /**\n * Rem is similar to the Em, it is a scalable unit. 1 rem is equal to the font size of the root element\n */\n FontUnit[\"Rem\"] = \"rem\";\n /**\n * Pixel is a unit of length in screen pixels\n */\n FontUnit[\"Px\"] = \"px\";\n /**\n * Point is a physical unit length (1/72 of an inch)\n */\n FontUnit[\"Pt\"] = \"pt\";\n /**\n * Percent is a scalable unit similar to Em, the only difference is the Em units scale faster when Text-Size stuff\n */\n FontUnit[\"Percent\"] = \"%\";\n})(FontUnit || (FontUnit = {}));\n/**\n * Enum representing the different horizontal text alignments\n */\nvar TextAlign;\n(function (TextAlign) {\n /**\n * The text is left-aligned.\n */\n TextAlign[\"Left\"] = \"left\";\n /**\n * The text is right-aligned.\n */\n TextAlign[\"Right\"] = \"right\";\n /**\n * The text is centered.\n */\n TextAlign[\"Center\"] = \"center\";\n /**\n * The text is aligned at the normal start of the line (left-aligned for left-to-right locales,\n * right-aligned for right-to-left locales).\n */\n TextAlign[\"Start\"] = \"start\";\n /**\n * The text is aligned at the normal end of the line (right-aligned for left-to-right locales,\n * left-aligned for right-to-left locales).\n */\n TextAlign[\"End\"] = \"end\";\n})(TextAlign || (TextAlign = {}));\n/**\n * Enum representing the different baseline text alignments\n */\nvar BaseAlign;\n(function (BaseAlign) {\n /**\n * The text baseline is the top of the em square.\n */\n BaseAlign[\"Top\"] = \"top\";\n /**\n * The text baseline is the hanging baseline. Currently unsupported; this will act like\n * alphabetic.\n */\n BaseAlign[\"Hanging\"] = \"hanging\";\n /**\n * The text baseline is the middle of the em square.\n */\n BaseAlign[\"Middle\"] = \"middle\";\n /**\n * The text baseline is the normal alphabetic baseline.\n */\n BaseAlign[\"Alphabetic\"] = \"alphabetic\";\n /**\n * The text baseline is the ideographic baseline; this is the bottom of\n * the body of the characters, if the main body of characters protrudes\n * beneath the alphabetic baseline. Currently unsupported; this will\n * act like alphabetic.\n */\n BaseAlign[\"Ideographic\"] = \"ideographic\";\n /**\n * The text baseline is the bottom of the bounding box. This differs\n * from the ideographic baseline in that the ideographic baseline\n * doesn't consider descenders.\n */\n BaseAlign[\"Bottom\"] = \"bottom\";\n})(BaseAlign || (BaseAlign = {}));\n/**\n * Enum representing the different possible font styles\n */\nvar FontStyle;\n(function (FontStyle) {\n FontStyle[\"Normal\"] = \"normal\";\n FontStyle[\"Italic\"] = \"italic\";\n FontStyle[\"Oblique\"] = \"oblique\";\n})(FontStyle || (FontStyle = {}));\n/**\n * Enum representing the text direction, useful for other languages, or writing text in reverse\n */\nvar Direction;\n(function (Direction) {\n Direction[\"LeftToRight\"] = \"ltr\";\n Direction[\"RightToLeft\"] = \"rtl\";\n})(Direction || (Direction = {}));\n\n\n/***/ }),\n\n/***/ \"./Graphics/FontTextInstance.ts\":\n/*!**************************************!*\\\n !*** ./Graphics/FontTextInstance.ts ***!\n \\**************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FontTextInstance: () => (/* binding */ FontTextInstance)\n/* harmony export */ });\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Util_DrawUtil__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/DrawUtil */ \"./Util/DrawUtil.ts\");\n/* harmony import */ var _Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Context/ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n\n\n\n\nclass FontTextInstance {\n constructor(font, text, color, maxWidth) {\n this.font = font;\n this.text = text;\n this.color = color;\n this.maxWidth = maxWidth;\n this._textFragments = [];\n this.disposed = false;\n this._dirty = true;\n this.canvas = document.createElement('canvas');\n const ctx = this.canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Unable to create FontTextInstance, internal canvas failed to create');\n }\n this.ctx = ctx;\n this.dimensions = this.measureText(text);\n this._setDimension(this.dimensions, this.ctx);\n this._lastHashCode = this.getHashCode();\n }\n measureText(text, maxWidth) {\n if (this.disposed) {\n throw Error('Accessing disposed text instance! ' + this.text);\n }\n let lines = null;\n if (maxWidth != null) {\n lines = this._getLinesFromText(text, maxWidth);\n }\n else {\n lines = text.split('\\n');\n }\n const maxWidthLine = lines.reduce((a, b) => {\n return a.length > b.length ? a : b;\n });\n this._applyFont(this.ctx); // font must be applied to the context to measure it\n const metrics = this.ctx.measureText(maxWidthLine);\n let textHeight = Math.abs(metrics.actualBoundingBoxAscent) + Math.abs(metrics.actualBoundingBoxDescent);\n // TODO line height makes the text bounds wonky\n const lineAdjustedHeight = textHeight * lines.length;\n textHeight = lineAdjustedHeight;\n const bottomBounds = lineAdjustedHeight - Math.abs(metrics.actualBoundingBoxAscent);\n const x = 0;\n const y = 0;\n const measurement = new _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox({\n left: x - Math.abs(metrics.actualBoundingBoxLeft) - this.font.padding,\n top: y - Math.abs(metrics.actualBoundingBoxAscent) - this.font.padding,\n bottom: y + bottomBounds + this.font.padding,\n right: x + Math.abs(metrics.actualBoundingBoxRight) + this.font.padding\n });\n return measurement;\n }\n _setDimension(textBounds, bitmap) {\n let lineHeightRatio = 1;\n if (this.font.lineHeight) {\n lineHeightRatio = this.font.lineHeight / this.font.size;\n }\n // Changing the width and height clears the context properties\n // We double the bitmap width to account for all possible alignment\n // We scale by \"quality\" so we render text without jaggies\n bitmap.canvas.width = (textBounds.width + this.font.padding * 2) * 2 * this.font.quality;\n bitmap.canvas.height = (textBounds.height + this.font.padding * 2) * 2 * this.font.quality * lineHeightRatio;\n }\n static getHashCode(font, text, color) {\n var _a;\n const hash = text +\n '__hashcode__' +\n font.fontString +\n font.showDebug +\n font.textAlign +\n font.baseAlign +\n font.direction +\n font.lineHeight +\n JSON.stringify(font.shadow) +\n (font.padding.toString() +\n font.smoothing.toString() +\n font.lineWidth.toString() +\n font.lineDash.toString() +\n ((_a = font.strokeColor) === null || _a === void 0 ? void 0 : _a.toString()) +\n (color ? color.toString() : font.color.toString()));\n return hash;\n }\n getHashCode(includeColor = true) {\n return FontTextInstance.getHashCode(this.font, this.text, includeColor ? this.color : undefined);\n }\n _applyRasterProperties(ctx) {\n var _a, _b, _c;\n ctx.translate(this.font.padding, this.font.padding);\n ctx.imageSmoothingEnabled = this.font.smoothing;\n ctx.lineWidth = this.font.lineWidth;\n ctx.setLineDash((_a = this.font.lineDash) !== null && _a !== void 0 ? _a : ctx.getLineDash());\n ctx.strokeStyle = (_c = (_b = this.font.strokeColor) === null || _b === void 0 ? void 0 : _b.toString()) !== null && _c !== void 0 ? _c : '';\n ctx.fillStyle = this.color.toString();\n }\n _applyFont(ctx) {\n ctx.resetTransform();\n ctx.translate(this.font.padding + ctx.canvas.width / 2, this.font.padding + ctx.canvas.height / 2);\n ctx.scale(this.font.quality, this.font.quality);\n ctx.textAlign = this.font.textAlign;\n ctx.textBaseline = this.font.baseAlign;\n ctx.font = this.font.fontString;\n ctx.direction = this.font.direction;\n if (this.font.shadow) {\n if (this.font.shadow.color) {\n ctx.shadowColor = this.font.shadow.color.toString();\n }\n if (this.font.shadow.blur) {\n ctx.shadowBlur = this.font.shadow.blur;\n }\n if (this.font.shadow.offset) {\n ctx.shadowOffsetX = this.font.shadow.offset.x;\n ctx.shadowOffsetY = this.font.shadow.offset.y;\n }\n }\n }\n _drawText(ctx, lines, lineHeight) {\n this._applyRasterProperties(ctx);\n this._applyFont(ctx);\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (this.color) {\n ctx.fillText(line, 0, i * lineHeight);\n }\n if (this.font.strokeColor) {\n ctx.strokeText(line, 0, i * lineHeight);\n }\n }\n if (this.font.showDebug) {\n // Horizontal line\n /* istanbul ignore next */\n (0,_Util_DrawUtil__WEBPACK_IMPORTED_MODULE_1__.line)(ctx, _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Green, -ctx.canvas.width / 2, 0, ctx.canvas.width / 2, 0, 2);\n // Vertical line\n /* istanbul ignore next */\n (0,_Util_DrawUtil__WEBPACK_IMPORTED_MODULE_1__.line)(ctx, _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Red, 0, -ctx.canvas.height / 2, 0, ctx.canvas.height / 2, 2);\n }\n }\n _splitTextBitmap(bitmap) {\n const textImages = [];\n let currentX = 0;\n let currentY = 0;\n // 4k is the max for mobile devices\n const width = Math.min(4096, bitmap.canvas.width);\n const height = Math.min(4096, bitmap.canvas.height);\n // Splits the original bitmap into 4k max chunks\n while (currentX < bitmap.canvas.width) {\n while (currentY < bitmap.canvas.height) {\n // create new bitmap\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Unable to split internal FontTextInstance bitmap, failed to create internal canvas');\n }\n // draw current slice to new bitmap in < 4k chunks\n ctx.drawImage(bitmap.canvas, currentX, currentY, width, height, 0, 0, width, height);\n textImages.push({ x: currentX, y: currentY, canvas });\n currentY += height;\n }\n currentX += width;\n currentY = 0;\n }\n return textImages;\n }\n flagDirty() {\n this._dirty = true;\n }\n render(ex, x, y, maxWidth) {\n var _a;\n if (this.disposed) {\n throw Error('Accessing disposed text instance! ' + this.text);\n }\n this._ex = ex;\n const hashCode = this.getHashCode();\n if (this._lastHashCode !== hashCode) {\n this._dirty = true;\n }\n // Calculate image chunks\n if (this._dirty) {\n this.dimensions = this.measureText(this.text, maxWidth);\n this._setDimension(this.dimensions, this.ctx);\n const lines = this._getLinesFromText(this.text, maxWidth);\n const lineHeight = (_a = this.font.lineHeight) !== null && _a !== void 0 ? _a : this.dimensions.height / lines.length;\n // draws the text to the main bitmap\n this._drawText(this.ctx, lines, lineHeight);\n // clear any out old fragments\n if (ex instanceof _Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_3__.ExcaliburGraphicsContextWebGL) {\n for (const frag of this._textFragments) {\n ex.textureLoader.delete(frag.canvas);\n }\n }\n // splits to < 4k fragments for large text\n this._textFragments = this._splitTextBitmap(this.ctx);\n if (ex instanceof _Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_3__.ExcaliburGraphicsContextWebGL) {\n for (const frag of this._textFragments) {\n ex.textureLoader.load(frag.canvas, { filtering: this.font.filtering }, true);\n }\n }\n this._lastHashCode = hashCode;\n this._dirty = false;\n }\n // draws the bitmap fragments to excalibur graphics context\n for (const frag of this._textFragments) {\n ex.drawImage(frag.canvas, 0, 0, frag.canvas.width, frag.canvas.height, frag.x / this.font.quality + x - this.ctx.canvas.width / this.font.quality / 2, frag.y / this.font.quality + y - this.ctx.canvas.height / this.font.quality / 2, frag.canvas.width / this.font.quality, frag.canvas.height / this.font.quality);\n }\n }\n dispose() {\n this.disposed = true;\n this.dimensions = undefined;\n this.canvas = undefined;\n this.ctx = undefined;\n if (this._ex instanceof _Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_3__.ExcaliburGraphicsContextWebGL) {\n for (const frag of this._textFragments) {\n this._ex.textureLoader.delete(frag.canvas);\n }\n }\n this._textFragments.length = 0;\n }\n _getLinesFromText(text, maxWidth) {\n var _a;\n if (this._cachedText === text && this._cachedRenderWidth === maxWidth && ((_a = this._cachedLines) === null || _a === void 0 ? void 0 : _a.length)) {\n return this._cachedLines;\n }\n const lines = text.split('\\n');\n if (maxWidth == null) {\n return lines;\n }\n // If the current line goes past the maxWidth, append a new line without modifying the underlying text.\n for (let i = 0; i < lines.length; i++) {\n let line = lines[i];\n let newLine = '';\n if (this.measureText(line).width > maxWidth) {\n while (this.measureText(line).width > maxWidth) {\n newLine = line[line.length - 1] + newLine;\n line = line.slice(0, -1); // Remove last character from line\n }\n // Update the array with our new values\n lines[i] = line;\n lines[i + 1] = newLine;\n }\n }\n this._cachedText = text;\n this._cachedLines = lines;\n this._cachedRenderWidth = maxWidth;\n return lines;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Graphic.ts\":\n/*!*****************************!*\\\n !*** ./Graphics/Graphic.ts ***!\n \\*****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Graphic: () => (/* binding */ Graphic)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Util_Watch__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Util/Watch */ \"./Util/Watch.ts\");\n/* harmony import */ var _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/affine-matrix */ \"./Math/affine-matrix.ts\");\n\n\n\n\n/**\n * A Graphic is the base Excalibur primitive for something that can be drawn to the {@apilink ExcaliburGraphicsContext}.\n * {@apilink Sprite}, {@apilink Animation}, {@apilink GraphicsGroup}, {@apilink Canvas}, {@apilink Rectangle}, {@apilink Circle}, and {@apilink Polygon} all derive from the\n * {@apilink Graphic} abstract class.\n *\n * Implementors of a Graphic must override the abstract {@apilink Graphic._drawImage} method to render an image to the graphics context. Graphic\n * handles all the position, rotation, and scale transformations in {@apilink Graphic._preDraw} and {@apilink Graphic._postDraw}\n */\nclass Graphic {\n isStale() {\n return this._transformStale;\n }\n /**\n * Gets or sets the flipHorizontal, which will flip the graphic horizontally (across the y axis)\n */\n get flipHorizontal() {\n return this._flipHorizontal;\n }\n set flipHorizontal(value) {\n this._flipHorizontal = value;\n this._transformStale = true;\n }\n /**\n * Gets or sets the flipVertical, which will flip the graphic vertically (across the x axis)\n */\n get flipVertical() {\n return this._flipVertical;\n }\n set flipVertical(value) {\n this._flipVertical = value;\n this._transformStale = true;\n }\n /**\n * Gets or sets the rotation of the graphic\n */\n get rotation() {\n return this._rotation;\n }\n set rotation(value) {\n this._rotation = value;\n this._transformStale = true;\n }\n /**\n * Gets or sets the scale of the graphic, this affects the width and\n */\n get scale() {\n return this._scale;\n }\n set scale(value) {\n this._scale = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_0__.watch)(value, () => {\n this._transformStale = true;\n });\n this._transformStale = true;\n }\n /**\n * Gets or sets the origin of the graphic, if not set the center of the graphic is the origin\n */\n get origin() {\n return this._origin;\n }\n set origin(value) {\n if (value) {\n this._origin = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_0__.watch)(value, () => {\n this._transformStale = true;\n });\n }\n this._transformStale = true;\n }\n constructor(options) {\n var _a, _b, _c, _d, _e, _f, _g;\n this.id = Graphic._ID++;\n this.transform = _Math_affine_matrix__WEBPACK_IMPORTED_MODULE_1__.AffineMatrix.identity();\n this._transformStale = true;\n /**\n * Gets or sets wether to show debug information about the graphic\n */\n this.showDebug = false;\n this._flipHorizontal = false;\n this._flipVertical = false;\n this._rotation = 0;\n /**\n * Gets or sets the opacity of the graphic, 0 is transparent, 1 is solid (opaque).\n */\n this.opacity = 1;\n this._scale = _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.One;\n this._width = 0;\n this._height = 0;\n if (options) {\n this.origin = (_a = options.origin) !== null && _a !== void 0 ? _a : this.origin;\n this.flipHorizontal = (_b = options.flipHorizontal) !== null && _b !== void 0 ? _b : this.flipHorizontal;\n this.flipVertical = (_c = options.flipVertical) !== null && _c !== void 0 ? _c : this.flipVertical;\n this.rotation = (_d = options.rotation) !== null && _d !== void 0 ? _d : this.rotation;\n this.opacity = (_e = options.opacity) !== null && _e !== void 0 ? _e : this.opacity;\n this.scale = (_f = options.scale) !== null && _f !== void 0 ? _f : this.scale;\n this.tint = (_g = options.tint) !== null && _g !== void 0 ? _g : this.tint;\n if (options.width) {\n this._width = options.width;\n }\n if (options.height) {\n this._height = options.height;\n }\n }\n }\n cloneGraphicOptions() {\n return {\n width: this.width / this.scale.x,\n height: this.height / this.scale.y,\n origin: this.origin ? this.origin.clone() : undefined,\n flipHorizontal: this.flipHorizontal,\n flipVertical: this.flipVertical,\n rotation: this.rotation,\n opacity: this.opacity,\n scale: this.scale ? this.scale.clone() : undefined,\n tint: this.tint ? this.tint.clone() : undefined\n };\n }\n /**\n * Gets or sets the width of the graphic (always positive)\n */\n get width() {\n return Math.abs(this._width * this.scale.x);\n }\n /**\n * Gets or sets the height of the graphic (always positive)\n */\n get height() {\n return Math.abs(this._height * this.scale.y);\n }\n set width(value) {\n this._width = value;\n this._transformStale = true;\n }\n set height(value) {\n this._height = value;\n this._transformStale = true;\n }\n /**\n * Gets a copy of the bounds in pixels occupied by the graphic on the the screen. This includes scale.\n */\n get localBounds() {\n return _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_3__.BoundingBox.fromDimension(this.width, this.height, _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero);\n }\n /**\n * Draw the whole graphic to the context including transform\n * @param ex The excalibur graphics context\n * @param x\n * @param y\n */\n draw(ex, x, y) {\n this._preDraw(ex, x, y);\n this._drawImage(ex, 0, 0);\n this._postDraw(ex);\n }\n /**\n * Apply affine transformations to the graphics context to manipulate the graphic before {@apilink Graphic._drawImage}\n * @param ex\n * @param x\n * @param y\n */\n _preDraw(ex, x, y) {\n ex.save();\n ex.translate(x, y);\n if (this._transformStale) {\n this.transform.reset();\n this.transform.scale(Math.abs(this.scale.x), Math.abs(this.scale.y));\n this._rotate(this.transform);\n this._flip(this.transform);\n this._transformStale = false;\n }\n ex.multiply(this.transform);\n // it is important to multiply alphas so graphics respect the current context\n ex.opacity = ex.opacity * this.opacity;\n if (this.tint) {\n ex.tint = this.tint;\n }\n }\n _rotate(ex) {\n var _a;\n const scaleDirX = this.scale.x > 0 ? 1 : -1;\n const scaleDirY = this.scale.y > 0 ? 1 : -1;\n const origin = (_a = this.origin) !== null && _a !== void 0 ? _a : (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(this.width / 2, this.height / 2);\n ex.translate(origin.x, origin.y);\n ex.rotate(this.rotation);\n // This is for handling direction changes 1 or -1, that way we don't have mismatched translates()\n ex.scale(scaleDirX, scaleDirY);\n ex.translate(-origin.x, -origin.y);\n }\n _flip(ex) {\n if (this.flipHorizontal) {\n ex.translate(this.width / this.scale.x, 0);\n ex.scale(-1, 1);\n }\n if (this.flipVertical) {\n ex.translate(0, this.height / this.scale.y);\n ex.scale(1, -1);\n }\n }\n /**\n * Apply any additional work after {@apilink Graphic._drawImage} and restore the context state.\n * @param ex\n */\n _postDraw(ex) {\n if (this.showDebug) {\n ex.debug.drawRect(0, 0, this.width, this.height);\n }\n ex.restore();\n }\n}\nGraphic._ID = 0;\n\n\n/***/ }),\n\n/***/ \"./Graphics/GraphicsComponent.ts\":\n/*!***************************************!*\\\n !*** ./Graphics/GraphicsComponent.ts ***!\n \\***************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ GraphicsComponent: () => (/* binding */ GraphicsComponent),\n/* harmony export */ hasGraphicsTick: () => (/* binding */ hasGraphicsTick)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Collision_Index__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Collision/Index */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Component */ \"./EntityComponentSystem/Component.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Math_watch_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/watch-vector */ \"./Math/watch-vector.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Graphics_GraphicsGroup__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Graphics/GraphicsGroup */ \"./Graphics/GraphicsGroup.ts\");\n/* harmony import */ var _Raster__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Raster */ \"./Graphics/Raster.ts\");\n/* harmony import */ var _Text__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Text */ \"./Graphics/Text.ts\");\n\n\n\n\n\n\n\n\n\n\n/**\n * Type guard for checking if a Graphic HasTick (used for graphics that change over time like animations)\n * @param graphic\n */\nfunction hasGraphicsTick(graphic) {\n return !!graphic.tick;\n}\n/**\n * Component to manage drawings, using with the position component\n */\nclass GraphicsComponent extends _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n /**\n * Sets or gets wether any drawing should be visible in this component\n * @deprecated use isVisible\n */\n get visible() {\n return this.isVisible;\n }\n /**\n * Sets or gets wether any drawing should be visible in this component\n * @deprecated use isVisible\n */\n set visible(val) {\n this.isVisible = val;\n }\n /**\n * Offset to apply to graphics by default\n */\n get offset() {\n return this._offset;\n }\n set offset(value) {\n this._offset = new _Math_watch_vector__WEBPACK_IMPORTED_MODULE_1__.WatchVector(value, () => this.recalculateBounds());\n this.recalculateBounds();\n }\n /**\n * Anchor to apply to graphics by default\n */\n get anchor() {\n return this._anchor;\n }\n set anchor(value) {\n this._anchor = new _Math_watch_vector__WEBPACK_IMPORTED_MODULE_1__.WatchVector(value, () => this.recalculateBounds());\n this.recalculateBounds();\n }\n /**\n * Sets the color of the actor's current graphic\n */\n get color() {\n return this._color;\n }\n set color(v) {\n if (v) {\n this._color = v.clone();\n const currentGraphic = this.graphics.current;\n if (currentGraphic instanceof _Raster__WEBPACK_IMPORTED_MODULE_2__.Raster || currentGraphic instanceof _Text__WEBPACK_IMPORTED_MODULE_3__.Text) {\n currentGraphic.color = this._color;\n }\n }\n }\n constructor(options) {\n super();\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_4__.Logger.getInstance();\n this._current = 'default';\n this._graphics = {};\n this._options = {};\n this.material = null;\n /**\n * Sets or gets wether any drawing should be visible in this component\n */\n this.isVisible = true;\n /**\n * Optionally force the graphic onscreen, default false. Not recommend to use for perf reasons, only if you known what you're doing.\n */\n this.forceOnScreen = false;\n /**\n * Sets or gets wither all drawings should have an opacity applied\n */\n this.opacity = 1;\n this._offset = new _Math_watch_vector__WEBPACK_IMPORTED_MODULE_1__.WatchVector(_Math_vector__WEBPACK_IMPORTED_MODULE_5__.Vector.Zero, () => this.recalculateBounds());\n this._anchor = new _Math_watch_vector__WEBPACK_IMPORTED_MODULE_1__.WatchVector(_Math_vector__WEBPACK_IMPORTED_MODULE_5__.Vector.Half, () => this.recalculateBounds());\n /**\n * Flip all graphics horizontally along the y-axis\n */\n this.flipHorizontal = false;\n /**\n * Flip all graphics vertically along the x-axis\n */\n this.flipVertical = false;\n /**\n * If set to true graphics added to the component will be copied. This can effect performance, but is useful if you don't want\n * changes to a graphic to effect all the places it is used.\n */\n this.copyGraphics = false;\n // Defaults\n options = {\n visible: this.isVisible,\n graphics: {},\n ...options\n };\n const { current, anchor, color, opacity, visible, graphics, offset, copyGraphics, onPreDraw, onPostDraw, onPreTransformDraw, onPostTransformDraw } = options;\n for (const [key, graphicOrOptions] of Object.entries(graphics)) {\n if (graphicOrOptions instanceof _Graphic__WEBPACK_IMPORTED_MODULE_6__.Graphic) {\n this._graphics[key] = graphicOrOptions;\n }\n else {\n this._graphics[key] = graphicOrOptions.graphic;\n this._options[key] = graphicOrOptions.options;\n }\n }\n this.offset = offset !== null && offset !== void 0 ? offset : this.offset;\n this.opacity = opacity !== null && opacity !== void 0 ? opacity : this.opacity;\n this.anchor = anchor !== null && anchor !== void 0 ? anchor : this.anchor;\n this.color = color !== null && color !== void 0 ? color : this.color;\n this.copyGraphics = copyGraphics !== null && copyGraphics !== void 0 ? copyGraphics : this.copyGraphics;\n this.onPreDraw = onPreDraw !== null && onPreDraw !== void 0 ? onPreDraw : this.onPreDraw;\n this.onPostDraw = onPostDraw !== null && onPostDraw !== void 0 ? onPostDraw : this.onPostDraw;\n this.onPreDraw = onPreTransformDraw !== null && onPreTransformDraw !== void 0 ? onPreTransformDraw : this.onPreTransformDraw;\n this.onPostTransformDraw = onPostTransformDraw !== null && onPostTransformDraw !== void 0 ? onPostTransformDraw : this.onPostTransformDraw;\n this.isVisible = !!visible;\n this._current = current !== null && current !== void 0 ? current : this._current;\n if (current && this._graphics[current]) {\n this.use(current);\n }\n }\n getGraphic(name) {\n return this._graphics[name];\n }\n getOptions(name) {\n return this._options[name];\n }\n /**\n * Get registered graphics names\n */\n getNames() {\n return Object.keys(this._graphics);\n }\n /**\n * Returns the currently displayed graphic\n */\n get current() {\n return this._graphics[this._current];\n }\n /**\n * Returns the currently displayed graphic offsets\n */\n get currentOptions() {\n return this._options[this._current];\n }\n /**\n * Returns all graphics associated with this component\n */\n get graphics() {\n return this._graphics;\n }\n /**\n * Returns all graphics options associated with this component\n */\n get options() {\n return this._options;\n }\n add(nameOrGraphic, graphicOrOptions, options) {\n let name = 'default';\n let graphicToSet = null;\n let optionsToSet = undefined;\n if (typeof nameOrGraphic === 'string' && graphicOrOptions instanceof _Graphic__WEBPACK_IMPORTED_MODULE_6__.Graphic) {\n name = nameOrGraphic;\n graphicToSet = graphicOrOptions;\n optionsToSet = options;\n }\n if (nameOrGraphic instanceof _Graphic__WEBPACK_IMPORTED_MODULE_6__.Graphic && !(graphicOrOptions instanceof _Graphic__WEBPACK_IMPORTED_MODULE_6__.Graphic)) {\n graphicToSet = nameOrGraphic;\n optionsToSet = graphicOrOptions;\n }\n if (!graphicToSet) {\n throw new Error('Need to provide a graphic or valid graphic string');\n }\n this._graphics[name] = this.copyGraphics ? graphicToSet.clone() : graphicToSet;\n this._options[name] = this.copyGraphics ? { ...optionsToSet } : optionsToSet;\n if (name === 'default') {\n this.use('default');\n }\n return graphicToSet;\n }\n /**\n * Removes a registered graphic, if the removed graphic is the current it will switch to the default\n * @param name\n */\n remove(name) {\n delete this._graphics[name];\n delete this._options[name];\n if (this._current === name) {\n this._current = 'default';\n this.recalculateBounds();\n }\n }\n /**\n * Use a graphic only, will set the default graphic. Returns the new {@apilink Graphic}\n *\n * Optionally override the stored options\n * @param nameOrGraphic\n * @param options\n */\n use(nameOrGraphic, options) {\n var _a;\n if (nameOrGraphic instanceof _Graphic__WEBPACK_IMPORTED_MODULE_6__.Graphic) {\n let graphic = nameOrGraphic;\n if (this.copyGraphics) {\n graphic = nameOrGraphic.clone();\n }\n this._current = 'default';\n this._graphics[this._current] = graphic;\n this._options[this._current] = options;\n }\n else {\n this._current = nameOrGraphic;\n this._options[this._current] = options;\n if (!(this._current in this._graphics)) {\n this._logger.warn(`Graphic ${this._current} is not registered with the graphics component owned by ${(_a = this.owner) === null || _a === void 0 ? void 0 : _a.name}. Nothing will be drawn.`);\n }\n }\n this.recalculateBounds();\n return this.current;\n }\n /**\n * Hide currently shown graphic\n */\n hide() {\n this._current = 'ex.none';\n }\n set localBounds(bounds) {\n this._localBounds = bounds;\n }\n recalculateBounds() {\n let bb = new _Collision_Index__WEBPACK_IMPORTED_MODULE_7__.BoundingBox();\n const graphic = this._graphics[this._current];\n const options = this._options[this._current];\n if (!graphic) {\n this._localBounds = bb;\n return;\n }\n let anchor = this.anchor;\n let offset = this.offset;\n if (options === null || options === void 0 ? void 0 : options.anchor) {\n anchor = options.anchor;\n }\n if (options === null || options === void 0 ? void 0 : options.offset) {\n offset = options.offset;\n }\n const bounds = graphic.localBounds;\n const offsetX = -bounds.width * anchor.x + offset.x;\n const offsetY = -bounds.height * anchor.y + offset.y;\n if (graphic instanceof _Graphics_GraphicsGroup__WEBPACK_IMPORTED_MODULE_8__.GraphicsGroup && !graphic.useAnchor) {\n bb = graphic === null || graphic === void 0 ? void 0 : graphic.localBounds.combine(bb);\n }\n else {\n bb = graphic === null || graphic === void 0 ? void 0 : graphic.localBounds.translate((0,_Math_vector__WEBPACK_IMPORTED_MODULE_5__.vec)(offsetX, offsetY)).combine(bb);\n }\n this._localBounds = bb;\n }\n /**\n * Get local bounds of graphics component\n */\n get localBounds() {\n if (!this._localBounds || this._localBounds.hasZeroDimensions()) {\n this.recalculateBounds();\n }\n return this._localBounds; // recalc guarantees type\n }\n /**\n * Get world bounds of graphics component\n */\n get bounds() {\n let bounds = this.localBounds;\n if (this.owner) {\n const tx = this.owner.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_9__.TransformComponent);\n if (tx) {\n bounds = bounds.transform(tx.get().matrix);\n }\n }\n return bounds;\n }\n /**\n * Update underlying graphics if necessary, called internally\n * @param elapsed\n * @internal\n */\n update(elapsed, idempotencyToken = 0) {\n const graphic = this.current;\n if (graphic && hasGraphicsTick(graphic)) {\n graphic.tick(elapsed, idempotencyToken);\n }\n }\n clone() {\n const graphics = new GraphicsComponent();\n graphics._graphics = { ...this._graphics };\n graphics._options = { ...this._options };\n graphics.offset = this.offset.clone();\n if (this.color) {\n graphics.color = this.color.clone();\n }\n graphics.opacity = this.opacity;\n graphics.anchor = this.anchor.clone();\n graphics.copyGraphics = this.copyGraphics;\n graphics.onPreDraw = this.onPreDraw;\n graphics.onPostDraw = this.onPostDraw;\n graphics.isVisible = this.isVisible;\n return graphics;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/GraphicsDiagnostics.ts\":\n/*!*****************************************!*\\\n !*** ./Graphics/GraphicsDiagnostics.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ GraphicsDiagnostics: () => (/* binding */ GraphicsDiagnostics)\n/* harmony export */ });\nclass GraphicsDiagnostics {\n static clear() {\n GraphicsDiagnostics.DrawCallCount = 0;\n GraphicsDiagnostics.DrawnImagesCount = 0;\n }\n}\nGraphicsDiagnostics.DrawCallCount = 0;\nGraphicsDiagnostics.DrawnImagesCount = 0;\n\n\n/***/ }),\n\n/***/ \"./Graphics/GraphicsGroup.ts\":\n/*!***********************************!*\\\n !*** ./Graphics/GraphicsGroup.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ GraphicsGroup: () => (/* binding */ GraphicsGroup)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Animation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Animation */ \"./Graphics/Animation.ts\");\n/* harmony import */ var _Collision_Index__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Collision/Index */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n\n\n\n\n\nclass GraphicsGroup extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n constructor(options) {\n var _a;\n super(options);\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this.useAnchor = true;\n this.members = [];\n this.members = options.members;\n this.useAnchor = (_a = options.useAnchor) !== null && _a !== void 0 ? _a : this.useAnchor;\n this._updateDimensions();\n }\n clone() {\n return new GraphicsGroup({\n members: [...this.members],\n ...this.cloneGraphicOptions()\n });\n }\n _updateDimensions() {\n const bb = this.localBounds;\n this.width = bb.width;\n this.height = bb.height;\n return bb;\n }\n get localBounds() {\n const bb = new _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox();\n for (const member of this.members) {\n if (member instanceof _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic) {\n member.localBounds.combine(bb, bb);\n }\n else {\n const { graphic, offset: pos, useBounds } = member;\n const shouldUseBounds = useBounds === undefined ? true : useBounds;\n if (graphic) {\n if (shouldUseBounds) {\n graphic.localBounds.translate(pos).combine(bb, bb);\n }\n }\n else {\n this._logger.warnOnce(`Graphics group member has an null or undefined graphic, member definition: ${JSON.stringify(member)}.`);\n }\n }\n }\n return bb;\n }\n _isAnimationOrGroup(graphic) {\n return graphic instanceof _Animation__WEBPACK_IMPORTED_MODULE_3__.Animation || graphic instanceof GraphicsGroup;\n }\n tick(elapsed, idempotencyToken) {\n for (const member of this.members) {\n let graphic;\n if (member instanceof _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic) {\n graphic = member;\n }\n else {\n graphic = member.graphic;\n }\n if (this._isAnimationOrGroup(graphic)) {\n graphic.tick(elapsed, idempotencyToken);\n }\n }\n }\n reset() {\n for (const member of this.members) {\n let graphic;\n if (member instanceof _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic) {\n graphic = member;\n }\n else {\n graphic = member.graphic;\n }\n if (this._isAnimationOrGroup(graphic)) {\n graphic.reset();\n }\n }\n }\n _preDraw(ex, x, y) {\n this._updateDimensions();\n super._preDraw(ex, this.useAnchor ? x : 0, this.useAnchor ? y : 0);\n }\n _drawImage(ex, x, y) {\n const pos = _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.Zero;\n for (const member of this.members) {\n let graphic;\n if (member instanceof _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic) {\n graphic = member;\n }\n else {\n graphic = member.graphic;\n member.offset.clone(pos);\n }\n if (!graphic) {\n continue;\n }\n ex.save();\n ex.translate(x, y);\n graphic.draw(ex, pos.x, pos.y);\n if (this.showDebug) {\n /* istanbul ignore next */\n ex.debug.drawRect(0, 0, this.width, this.height);\n }\n ex.restore();\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/GraphicsSystem.ts\":\n/*!************************************!*\\\n !*** ./Graphics/GraphicsSystem.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ GraphicsSystem: () => (/* binding */ GraphicsSystem)\n/* harmony export */ });\n/* harmony import */ var _GraphicsComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Priority.ts\");\n/* harmony import */ var _GraphicsGroup__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./GraphicsGroup */ \"./Graphics/GraphicsGroup.ts\");\n/* harmony import */ var _ParallaxComponent__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./ParallaxComponent */ \"./Graphics/ParallaxComponent.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Math/coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../Collision/BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _FontCache__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./FontCache */ \"./Graphics/FontCache.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _Math_transform__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/transform */ \"./Math/transform.ts\");\n/* harmony import */ var _TransformInterpolation__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./TransformInterpolation */ \"./Graphics/TransformInterpolation.ts\");\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass GraphicsSystem extends _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_0__.System {\n get sortedTransforms() {\n return this._sortedTransforms;\n }\n constructor(world) {\n super();\n this.world = world;\n this.systemType = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_0__.SystemType.Draw;\n this._token = 0;\n this._sortedTransforms = [];\n this._zHasChanged = false;\n this._zIndexUpdate = () => {\n this._zHasChanged = true;\n };\n this._targetInterpolationTransform = new _Math_transform__WEBPACK_IMPORTED_MODULE_1__.Transform();\n this.query = this.world.query([_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent, _GraphicsComponent__WEBPACK_IMPORTED_MODULE_3__.GraphicsComponent]);\n this.query.entityAdded$.subscribe((e) => {\n const tx = e.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n this._sortedTransforms.push(tx);\n tx.zIndexChanged$.subscribe(this._zIndexUpdate);\n this._zHasChanged = true;\n });\n this.query.entityRemoved$.subscribe((e) => {\n const tx = e.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n tx.zIndexChanged$.unsubscribe(this._zIndexUpdate);\n const index = this._sortedTransforms.indexOf(tx);\n if (index > -1) {\n this._sortedTransforms.splice(index, 1);\n }\n });\n }\n initialize(world, scene) {\n this._camera = scene.camera;\n this._engine = scene.engine;\n }\n preupdate() {\n // Graphics context could be switched to fallback in a new frame\n this._graphicsContext = this._engine.graphicsContext;\n if (this._zHasChanged) {\n this._sortedTransforms.sort((a, b) => {\n return a.globalZ - b.globalZ;\n });\n this._zHasChanged = false;\n }\n }\n update(elapsed) {\n this._token++;\n let graphics;\n _FontCache__WEBPACK_IMPORTED_MODULE_4__.FontCache.checkAndClearCache();\n // This is a performance enhancement, most things are in world space\n // so if we can only do this once saves a ton of transform updates\n this._graphicsContext.save();\n if (this._camera) {\n this._camera.draw(this._graphicsContext);\n }\n for (let transformIndex = 0; transformIndex < this._sortedTransforms.length; transformIndex++) {\n const transform = this._sortedTransforms[transformIndex];\n const entity = transform.owner;\n // If the entity is offscreen skip\n if (entity.hasTag('ex.offscreen')) {\n continue;\n }\n graphics = entity.get(_GraphicsComponent__WEBPACK_IMPORTED_MODULE_3__.GraphicsComponent);\n // Exit if graphics set to not visible\n if (!graphics.isVisible) {\n continue;\n }\n // Optionally run the onPreTransformDraw graphics lifecycle draw\n if (graphics.onPreTransformDraw) {\n graphics.onPreTransformDraw(this._graphicsContext, elapsed);\n }\n entity.events.emit('pretransformdraw', new _Events__WEBPACK_IMPORTED_MODULE_5__.PreTransformDrawEvent(this._graphicsContext, elapsed, entity));\n // This optionally sets our camera based on the entity coord plan (world vs. screen)\n if (transform.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__.CoordPlane.Screen) {\n this._graphicsContext.restore();\n }\n this._graphicsContext.save();\n if (transform.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__.CoordPlane.Screen) {\n this._graphicsContext.translate(this._engine.screen.contentArea.left, this._engine.screen.contentArea.top);\n }\n // Tick any graphics state (but only once) for animations and graphics groups\n graphics.update(elapsed, this._token);\n // Apply parallax\n const parallax = entity.get(_ParallaxComponent__WEBPACK_IMPORTED_MODULE_7__.ParallaxComponent);\n if (parallax) {\n // We use the Tiled formula\n // https://doc.mapeditor.org/en/latest/manual/layers/#parallax-scrolling-factor\n // cameraPos * (1 - parallaxFactor)\n const oneMinusFactor = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.One.sub(parallax.parallaxFactor);\n const parallaxOffset = this._camera.drawPos.scale(oneMinusFactor);\n this._graphicsContext.translate(parallaxOffset.x, parallaxOffset.y);\n }\n // Position the entity + estimate lag\n this._applyTransform(entity);\n // If there is a material enable it on the context\n if (graphics.material) {\n this._graphicsContext.material = graphics.material;\n }\n // Optionally run the onPreDraw graphics lifecycle draw\n if (graphics.onPreDraw) {\n graphics.onPreDraw(this._graphicsContext, elapsed);\n }\n entity.events.emit('predraw', new _Events__WEBPACK_IMPORTED_MODULE_5__.PreDrawEvent(this._graphicsContext, elapsed, entity));\n // this._graphicsContext.opacity *= graphics.opacity;\n this._applyOpacity(entity);\n // Draw the graphics component\n this._drawGraphicsComponent(graphics, transform);\n // Optionally run the onPostDraw graphics lifecycle draw\n if (graphics.onPostDraw) {\n graphics.onPostDraw(this._graphicsContext, elapsed);\n }\n entity.events.emit('postdraw', new _Events__WEBPACK_IMPORTED_MODULE_5__.PostDrawEvent(this._graphicsContext, elapsed, entity));\n this._graphicsContext.restore();\n // Reset the transform back to the original world space\n if (transform.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__.CoordPlane.Screen) {\n this._graphicsContext.save();\n if (this._camera) {\n this._camera.draw(this._graphicsContext);\n }\n }\n // Optionally run the onPreTransformDraw graphics lifecycle draw\n if (graphics.onPostTransformDraw) {\n graphics.onPostTransformDraw(this._graphicsContext, elapsed);\n }\n entity.events.emit('posttransformdraw', new _Events__WEBPACK_IMPORTED_MODULE_5__.PostTransformDrawEvent(this._graphicsContext, elapsed, entity));\n }\n this._graphicsContext.restore();\n }\n _drawGraphicsComponent(graphicsComponent, transformComponent) {\n var _a, _b;\n if (graphicsComponent.isVisible) {\n const flipHorizontal = graphicsComponent.flipHorizontal;\n const flipVertical = graphicsComponent.flipVertical;\n const graphic = graphicsComponent.current;\n const options = (_a = graphicsComponent.currentOptions) !== null && _a !== void 0 ? _a : {};\n if (graphic) {\n let anchor = graphicsComponent.anchor;\n let offset = graphicsComponent.offset;\n let scaleX = 1;\n let scaleY = 1;\n // handle specific overrides\n if (options === null || options === void 0 ? void 0 : options.anchor) {\n anchor = options.anchor;\n }\n if (options === null || options === void 0 ? void 0 : options.offset) {\n offset = options.offset;\n }\n const globalScale = transformComponent.globalScale;\n scaleX *= graphic.scale.x * globalScale.x;\n scaleY *= graphic.scale.y * globalScale.y;\n // See https://github.com/excaliburjs/Excalibur/pull/619 for discussion on this formula\n const offsetX = -graphic.width * anchor.x + offset.x * scaleX;\n const offsetY = -graphic.height * anchor.y + offset.y * scaleY;\n const oldFlipHorizontal = graphic.flipHorizontal;\n const oldFlipVertical = graphic.flipVertical;\n if (flipHorizontal || flipVertical) {\n // flip any currently flipped graphics\n graphic.flipHorizontal = flipHorizontal ? !oldFlipHorizontal : oldFlipHorizontal;\n graphic.flipVertical = flipVertical ? !oldFlipVertical : oldFlipVertical;\n }\n graphic === null || graphic === void 0 ? void 0 : graphic.draw(this._graphicsContext, offsetX, offsetY);\n if (flipHorizontal || flipVertical) {\n graphic.flipHorizontal = oldFlipHorizontal;\n graphic.flipVertical = oldFlipVertical;\n }\n // TODO move debug code out?\n if (((_b = this._engine) === null || _b === void 0 ? void 0 : _b.isDebug) && this._engine.debug.graphics.showBounds) {\n const offset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_8__.vec)(offsetX, offsetY);\n if (graphic instanceof _GraphicsGroup__WEBPACK_IMPORTED_MODULE_9__.GraphicsGroup) {\n for (const member of graphic.members) {\n let g;\n let pos = _Math_vector__WEBPACK_IMPORTED_MODULE_8__.Vector.Zero;\n if (member instanceof _Graphic__WEBPACK_IMPORTED_MODULE_10__.Graphic) {\n g = member;\n }\n else {\n g = member.graphic;\n pos = member.offset;\n }\n if (graphic.useAnchor) {\n g === null || g === void 0 ? void 0 : g.localBounds.translate(offset.add(pos)).draw(this._graphicsContext, this._engine.debug.graphics.boundsColor);\n }\n else {\n g === null || g === void 0 ? void 0 : g.localBounds.translate(pos).draw(this._graphicsContext, this._engine.debug.graphics.boundsColor);\n }\n }\n }\n else {\n /* istanbul ignore next */\n graphic === null || graphic === void 0 ? void 0 : graphic.localBounds.translate(offset).draw(this._graphicsContext, this._engine.debug.graphics.boundsColor);\n }\n }\n }\n }\n }\n /**\n * This applies the current entity transform to the graphics context\n * @param entity\n */\n _applyTransform(entity) {\n const ancestors = entity.getAncestors();\n for (let i = 0; i < ancestors.length; i++) {\n const ancestor = ancestors[i];\n const transform = ancestor === null || ancestor === void 0 ? void 0 : ancestor.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n const optionalBody = ancestor === null || ancestor === void 0 ? void 0 : ancestor.get(_Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_11__.BodyComponent);\n if (transform) {\n let tx = transform.get();\n if (optionalBody) {\n if (this._engine.fixedUpdateTimestep && optionalBody.__oldTransformCaptured && optionalBody.enableFixedUpdateInterpolate) {\n // Interpolate graphics if needed\n const blend = this._engine.currentFrameLagMs / this._engine.fixedUpdateTimestep;\n tx = (0,_TransformInterpolation__WEBPACK_IMPORTED_MODULE_12__.blendTransform)(optionalBody.oldTransform, transform.get(), blend, this._targetInterpolationTransform);\n }\n }\n this._graphicsContext.z = transform.globalZ;\n this._graphicsContext.translate(tx.pos.x, tx.pos.y);\n this._graphicsContext.scale(tx.scale.x, tx.scale.y);\n this._graphicsContext.rotate(tx.rotation);\n }\n }\n }\n _applyOpacity(entity) {\n var _a;\n const ancestors = entity.getAncestors();\n for (let i = 0; i < ancestors.length; i++) {\n const ancestor = ancestors[i];\n const maybeGraphics = ancestor === null || ancestor === void 0 ? void 0 : ancestor.get(_GraphicsComponent__WEBPACK_IMPORTED_MODULE_3__.GraphicsComponent);\n this._graphicsContext.opacity *= (_a = maybeGraphics === null || maybeGraphics === void 0 ? void 0 : maybeGraphics.opacity) !== null && _a !== void 0 ? _a : 1;\n }\n }\n}\nGraphicsSystem.priority = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_13__.SystemPriority.Average;\n\n\n/***/ }),\n\n/***/ \"./Graphics/ImageSource.ts\":\n/*!*********************************!*\\\n !*** ./Graphics/ImageSource.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ImageSource: () => (/* binding */ ImageSource),\n/* harmony export */ ImageSourceAttributeConstants: () => (/* binding */ ImageSourceAttributeConstants)\n/* harmony export */ });\n/* harmony import */ var _Resources_Resource__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Resources/Resource */ \"./Resources/Resource.ts\");\n/* harmony import */ var _Sprite__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Sprite */ \"./Graphics/Sprite.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Future */ \"./Util/Future.ts\");\n/* harmony import */ var _Graphics_Context_texture_loader__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Graphics/Context/texture-loader */ \"./Graphics/Context/texture-loader.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Wrapping */ \"./Graphics/Wrapping.ts\");\n\n\n\n\n\n\n\nconst ImageSourceAttributeConstants = {\n Filtering: 'filtering',\n WrappingX: 'wrapping-x',\n WrappingY: 'wrapping-y'\n};\nclass ImageSource {\n /**\n * The original size of the source image in pixels\n */\n get width() {\n return this.image.naturalWidth;\n }\n /**\n * The original height of the source image in pixels\n */\n get height() {\n return this.image.naturalHeight;\n }\n /**\n * Returns true if the Texture is completely loaded and is ready\n * to be drawn.\n */\n isLoaded() {\n if (!this._src) {\n // this boosts speed of access\n this._src = this.data.src;\n }\n return !!this._src;\n }\n get image() {\n return this.data;\n }\n constructor(pathOrBase64, bustCacheOrOptions, filtering) {\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance();\n /**\n * Access to the underlying html image element\n */\n this.data = new Image();\n this._readyFuture = new _Util_Future__WEBPACK_IMPORTED_MODULE_1__.Future();\n /**\n * Promise the resolves when the image is loaded and ready for use, does not initiate loading\n */\n this.ready = this._readyFuture.promise;\n this.path = pathOrBase64;\n let bustCache = false;\n let wrapping;\n if (typeof bustCacheOrOptions === 'boolean') {\n bustCache = bustCacheOrOptions;\n }\n else {\n ({ filtering, wrapping, bustCache } = { ...bustCacheOrOptions });\n }\n this._resource = new _Resources_Resource__WEBPACK_IMPORTED_MODULE_2__.Resource(pathOrBase64, 'blob', bustCache);\n this.filtering = filtering !== null && filtering !== void 0 ? filtering : this.filtering;\n if (typeof wrapping === 'string') {\n this.wrapping = {\n x: wrapping,\n y: wrapping\n };\n }\n else {\n this.wrapping = wrapping !== null && wrapping !== void 0 ? wrapping : this.wrapping;\n }\n if (pathOrBase64.endsWith('.gif')) {\n this._logger.warn(`Use the ex.Gif type to load gifs, you may have mixed results with ${pathOrBase64} in ex.ImageSource. Fully supported: svg, jpg, bmp, and png`);\n }\n }\n /**\n * Create an ImageSource from and HTML tag element\n * @param image\n */\n static fromHtmlImageElement(image, options) {\n const imageSource = new ImageSource('');\n imageSource._src = 'image-element';\n imageSource.data = image;\n imageSource.data.setAttribute('data-original-src', 'image-element');\n if (options === null || options === void 0 ? void 0 : options.filtering) {\n imageSource.data.setAttribute(ImageSourceAttributeConstants.Filtering, options === null || options === void 0 ? void 0 : options.filtering);\n }\n else {\n imageSource.data.setAttribute(ImageSourceAttributeConstants.Filtering, _Filtering__WEBPACK_IMPORTED_MODULE_3__.ImageFiltering.Blended);\n }\n if (options === null || options === void 0 ? void 0 : options.wrapping) {\n let wrapping;\n if (typeof options.wrapping === 'string') {\n wrapping = {\n x: options.wrapping,\n y: options.wrapping\n };\n }\n else {\n wrapping = {\n x: options.wrapping.x,\n y: options.wrapping.y\n };\n }\n imageSource.data.setAttribute(ImageSourceAttributeConstants.WrappingX, wrapping.x);\n imageSource.data.setAttribute(ImageSourceAttributeConstants.WrappingY, wrapping.y);\n }\n else {\n imageSource.data.setAttribute(ImageSourceAttributeConstants.WrappingX, _Wrapping__WEBPACK_IMPORTED_MODULE_4__.ImageWrapping.Clamp);\n imageSource.data.setAttribute(ImageSourceAttributeConstants.WrappingY, _Wrapping__WEBPACK_IMPORTED_MODULE_4__.ImageWrapping.Clamp);\n }\n _Graphics_Context_texture_loader__WEBPACK_IMPORTED_MODULE_5__.TextureLoader.checkImageSizeSupportedAndLog(image);\n imageSource._readyFuture.resolve(image);\n return imageSource;\n }\n static fromHtmlCanvasElement(image, options) {\n const imageSource = new ImageSource('');\n imageSource._src = 'canvas-element-blob';\n imageSource.data.setAttribute('data-original-src', 'canvas-element-blob');\n if (options === null || options === void 0 ? void 0 : options.filtering) {\n imageSource.data.setAttribute(ImageSourceAttributeConstants.Filtering, options === null || options === void 0 ? void 0 : options.filtering);\n }\n else {\n imageSource.data.setAttribute(ImageSourceAttributeConstants.Filtering, _Filtering__WEBPACK_IMPORTED_MODULE_3__.ImageFiltering.Blended);\n }\n if (options === null || options === void 0 ? void 0 : options.wrapping) {\n let wrapping;\n if (typeof options.wrapping === 'string') {\n wrapping = {\n x: options.wrapping,\n y: options.wrapping\n };\n }\n else {\n wrapping = {\n x: options.wrapping.x,\n y: options.wrapping.y\n };\n }\n imageSource.data.setAttribute(ImageSourceAttributeConstants.WrappingX, wrapping.x);\n imageSource.data.setAttribute(ImageSourceAttributeConstants.WrappingY, wrapping.y);\n }\n else {\n imageSource.data.setAttribute(ImageSourceAttributeConstants.WrappingX, _Wrapping__WEBPACK_IMPORTED_MODULE_4__.ImageWrapping.Clamp);\n imageSource.data.setAttribute(ImageSourceAttributeConstants.WrappingY, _Wrapping__WEBPACK_IMPORTED_MODULE_4__.ImageWrapping.Clamp);\n }\n _Graphics_Context_texture_loader__WEBPACK_IMPORTED_MODULE_5__.TextureLoader.checkImageSizeSupportedAndLog(image);\n image.toBlob((blob) => {\n // TODO throw? if blob null?\n const url = URL.createObjectURL(blob);\n imageSource.image.onload = () => {\n // no longer need to read the blob so it's revoked\n URL.revokeObjectURL(url);\n imageSource.data = imageSource.image;\n imageSource._readyFuture.resolve(imageSource.image);\n };\n imageSource.image.src = url;\n });\n return imageSource;\n }\n static fromSvgString(svgSource, options) {\n const blob = new Blob([svgSource], { type: 'image/svg+xml' });\n const url = URL.createObjectURL(blob);\n return new ImageSource(url, options);\n }\n /**\n * Should excalibur add a cache busting querystring? By default false.\n * Must be set before loading\n */\n get bustCache() {\n return this._resource.bustCache;\n }\n set bustCache(val) {\n this._resource.bustCache = val;\n }\n /**\n * Begins loading the image and returns a promise that resolves when the image is loaded\n */\n async load() {\n var _a, _b, _c, _d;\n if (this.isLoaded()) {\n return this.data;\n }\n try {\n // Load base64 or blob if needed\n let url;\n if (!this.path.includes('data:image/')) {\n const blob = await this._resource.load();\n url = URL.createObjectURL(blob);\n }\n else {\n url = this.path;\n }\n // Decode the image\n const image = new Image();\n // Use Image.onload over Image.decode()\n // https://bugs.chromium.org/p/chromium/issues/detail?id=1055828#c7\n // Otherwise chrome will throw still Image.decode() failures for large textures\n const loadedFuture = new _Util_Future__WEBPACK_IMPORTED_MODULE_1__.Future();\n image.onload = () => loadedFuture.resolve();\n image.src = url;\n image.setAttribute('data-original-src', this.path);\n await loadedFuture.promise;\n // Set results\n // We defer loading the texture into webgl until the first draw that way we avoid a singleton\n // and for the multi-engine case the texture needs to be created in EACH webgl context to work\n // See image-renderer.ts draw()\n this.data = image;\n // emit warning if potentially too big\n _Graphics_Context_texture_loader__WEBPACK_IMPORTED_MODULE_5__.TextureLoader.checkImageSizeSupportedAndLog(this.data);\n }\n catch (error) {\n throw `Error loading ImageSource from path '${this.path}' with error [${error.message}]`;\n }\n // Do a bad thing to pass the filtering as an attribute\n this.data.setAttribute(ImageSourceAttributeConstants.Filtering, this.filtering); // TODO fix type\n this.data.setAttribute(ImageSourceAttributeConstants.WrappingX, (_b = (_a = this.wrapping) === null || _a === void 0 ? void 0 : _a.x) !== null && _b !== void 0 ? _b : _Wrapping__WEBPACK_IMPORTED_MODULE_4__.ImageWrapping.Clamp);\n this.data.setAttribute(ImageSourceAttributeConstants.WrappingY, (_d = (_c = this.wrapping) === null || _c === void 0 ? void 0 : _c.y) !== null && _d !== void 0 ? _d : _Wrapping__WEBPACK_IMPORTED_MODULE_4__.ImageWrapping.Clamp);\n // todo emit complete\n this._readyFuture.resolve(this.data);\n return this.data;\n }\n /**\n * Build a sprite from this ImageSource\n */\n toSprite(options) {\n return _Sprite__WEBPACK_IMPORTED_MODULE_6__.Sprite.from(this, options);\n }\n /**\n * Unload images from memory\n */\n unload() {\n this.data = new Image();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Line.ts\":\n/*!**************************!*\\\n !*** ./Graphics/Line.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Line: () => (/* binding */ Line)\n/* harmony export */ });\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n\n\n\nclass Line extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n constructor(options) {\n super();\n this.color = _Color__WEBPACK_IMPORTED_MODULE_1__.Color.Black;\n this.thickness = 1;\n const { start, end, color, thickness } = options;\n this.start = start;\n this.end = end;\n this.color = color !== null && color !== void 0 ? color : this.color;\n this.thickness = thickness !== null && thickness !== void 0 ? thickness : this.thickness;\n this._localBounds = this._calculateBounds();\n const { width, height } = this._localBounds;\n this.width = width;\n this.height = height;\n }\n get localBounds() {\n return this._localBounds;\n }\n _calculateBounds() {\n const lineNormal = this.end.sub(this.start).normal();\n const halfThickness = this.thickness / 2;\n const points = [\n this.start.add(lineNormal.scale(halfThickness)),\n this.end.add(lineNormal.scale(halfThickness)),\n this.end.add(lineNormal.scale(-halfThickness)),\n this.start.add(lineNormal.scale(-halfThickness))\n ];\n return _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromPoints(points);\n }\n _drawImage(ctx, _x, _y) {\n ctx.drawLine(this.start, this.end, this.color, this.thickness);\n }\n clone() {\n return new Line({\n start: this.start,\n end: this.end,\n color: this.color,\n thickness: this.thickness\n });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/NineSlice.ts\":\n/*!*******************************!*\\\n !*** ./Graphics/NineSlice.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ NineSlice: () => (/* binding */ NineSlice),\n/* harmony export */ NineSliceStretch: () => (/* binding */ NineSliceStretch)\n/* harmony export */ });\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n\n\n\n/**\n * Nine slice stretch mode\n */\nvar NineSliceStretch;\n(function (NineSliceStretch) {\n /**\n * Stretch the image across a dimension\n */\n NineSliceStretch[\"Stretch\"] = \"stretch\";\n /**\n * Tile the image across a dimension\n */\n NineSliceStretch[\"Tile\"] = \"tile\";\n /**\n * Tile the image across a dimension but only by whole image amounts\n */\n NineSliceStretch[\"TileFit\"] = \"tile-fit\";\n})(NineSliceStretch || (NineSliceStretch = {}));\nclass NineSlice extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n constructor(config) {\n super(config);\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this._config = config;\n this._imgSource = config.source;\n this._canvasA = document.createElement('canvas');\n this._canvasB = document.createElement('canvas');\n this._canvasC = document.createElement('canvas');\n this._canvasD = document.createElement('canvas');\n this._canvasE = document.createElement('canvas');\n this._canvasF = document.createElement('canvas');\n this._canvasG = document.createElement('canvas');\n this._canvasH = document.createElement('canvas');\n this._canvasI = document.createElement('canvas');\n this._initialize();\n this._imgSource.ready.then(() => {\n this._initialize();\n });\n }\n /**\n * Sets the target width of the 9 slice (pixels), and recalculates the 9 slice if desired (auto)\n * @param newWidth\n * @param auto\n */\n setTargetWidth(newWidth, auto = false) {\n this._config.width = newWidth;\n if (auto) {\n this._initialize();\n }\n }\n /**\n * Sets the target height of the 9 slice (pixels), and recalculates the 9 slice if desired (auto)\n * @param newHeight\n * @param auto\n */\n setTargetHeight(newHeight, auto = false) {\n this._config.height = newHeight;\n if (auto) {\n this._initialize();\n }\n }\n /**\n * Sets the 9 slice margins (pixels), and recalculates the 9 slice if desired (auto)\n */\n setMargins(left, top, right, bottom, auto = false) {\n this._config.sourceConfig.leftMargin = left;\n this._config.sourceConfig.topMargin = top;\n this._config.sourceConfig.rightMargin = right;\n this._config.sourceConfig.bottomMargin = bottom;\n if (auto) {\n this._initialize();\n }\n }\n /**\n * Sets the stretching strategy for the 9 slice, and recalculates the 9 slice if desired (auto)\n *\n */\n setStretch(type, stretch, auto = false) {\n if (type === 'horizontal') {\n this._config.destinationConfig.horizontalStretch = stretch;\n }\n else if (type === 'vertical') {\n this._config.destinationConfig.verticalStretch = stretch;\n }\n else {\n this._config.destinationConfig.horizontalStretch = stretch;\n this._config.destinationConfig.verticalStretch = stretch;\n }\n if (auto) {\n this._initialize();\n }\n }\n /**\n * Returns the config of the 9 slice\n */\n getConfig() {\n return this._config;\n }\n /**\n * Draws 1 of the 9 tiles based on parameters passed in\n * context is the ExcaliburGraphicsContext from the _drawImage function\n * destinationSize is the size of the destination image as a vector (width,height)\n * targetCanvas is the canvas to draw to\n * horizontalStretch and verticalStretch are the horizontal and vertical stretching strategies\n * marginW and marginH are optional margins for the 9 slice for positioning\n * @param context\n * @param targetCanvas\n * @param destinationSize\n * @param horizontalStretch\n * @param verticalStretch\n * @param marginWidth\n * @param marginHeight\n */\n _drawTile(context, targetCanvas, destinationSize, horizontalStretch, verticalStretch, marginWidth, marginHeight) {\n const tempMarginW = marginWidth || 0;\n const tempMarginH = marginHeight || 0;\n let tempSizeX, tempPositionX, tempSizeY, tempPositionY;\n const numTilesX = this._getNumberOfTiles(targetCanvas.width, destinationSize.x, horizontalStretch);\n const numTilesY = this._getNumberOfTiles(targetCanvas.height, destinationSize.y, verticalStretch);\n for (let i = 0; i < numTilesX; i++) {\n for (let j = 0; j < numTilesY; j++) {\n let { tempSize, tempPosition } = this._calculateParams(i, numTilesX, targetCanvas.width, destinationSize.x, this._config.destinationConfig.horizontalStretch);\n tempSizeX = tempSize;\n tempPositionX = tempPosition;\n ({ tempSize, tempPosition } = this._calculateParams(j, numTilesY, targetCanvas.height, destinationSize.y, this._config.destinationConfig.verticalStretch));\n tempSizeY = tempSize;\n tempPositionY = tempPosition;\n context.drawImage(targetCanvas, 0, 0, targetCanvas.width, targetCanvas.height, tempMarginW + tempPositionX, tempMarginH + tempPositionY, tempSizeX, tempSizeY);\n }\n }\n }\n /**\n * Draws the 9 slices to the canvas\n */\n _drawImage(ex, x, y) {\n if (this._imgSource.isLoaded()) {\n // Top left, no stretching\n this._drawTile(ex, this._canvasA, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.sourceConfig.leftMargin, this._config.sourceConfig.topMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch);\n // Top, middle, horizontal stretching\n this._drawTile(ex, this._canvasB, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.width - this._config.sourceConfig.leftMargin - this._config.sourceConfig.rightMargin, this._config.sourceConfig.topMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch, this._config.sourceConfig.leftMargin, 0);\n // Top right, no stretching\n this._drawTile(ex, this._canvasC, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.sourceConfig.rightMargin, this._config.sourceConfig.topMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch, this._config.width - this._config.sourceConfig.rightMargin, 0);\n // middle, left, vertical stretching\n this._drawTile(ex, this._canvasD, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.sourceConfig.leftMargin, this._config.height - this._config.sourceConfig.bottomMargin - this._config.sourceConfig.topMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch, 0, this._config.sourceConfig.topMargin);\n // center, both stretching\n if (this._config.destinationConfig.drawCenter) {\n this._drawTile(ex, this._canvasE, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.width - this._config.sourceConfig.leftMargin - this._config.sourceConfig.rightMargin, this._config.height - this._config.sourceConfig.bottomMargin - this._config.sourceConfig.topMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch, this._config.sourceConfig.leftMargin, this._config.sourceConfig.topMargin);\n }\n // middle, right, vertical stretching\n this._drawTile(ex, this._canvasF, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.sourceConfig.rightMargin, this._config.height - this._config.sourceConfig.bottomMargin - this._config.sourceConfig.topMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch, this._config.width - this._config.sourceConfig.rightMargin, this._config.sourceConfig.topMargin);\n // bottom left, no stretching\n this._drawTile(ex, this._canvasG, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.sourceConfig.leftMargin, this._config.sourceConfig.bottomMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch, 0, this._config.height - this._config.sourceConfig.bottomMargin);\n // bottom middle, horizontal stretching\n this._drawTile(ex, this._canvasH, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.width - this._config.sourceConfig.leftMargin - this._config.sourceConfig.rightMargin, this._config.sourceConfig.bottomMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch, this._config.sourceConfig.leftMargin, this._config.height - this._config.sourceConfig.bottomMargin);\n // bottom right, no stretching\n this._drawTile(ex, this._canvasI, new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._config.sourceConfig.rightMargin, this._config.sourceConfig.bottomMargin), this._config.destinationConfig.horizontalStretch, this._config.destinationConfig.verticalStretch, this._config.width - this._config.sourceConfig.rightMargin, this._config.height - this._config.sourceConfig.bottomMargin);\n }\n else {\n this._logger.warnOnce(`NineSlice ImageSource ${this._imgSource.path}` +\n ` is not yet loaded and won't be drawn. Please call .load() or include in a Loader.\\n\\n` +\n `Read https://excaliburjs.com/docs/imagesource for more information.`);\n }\n }\n /**\n * Slices the source sprite into the 9 slice canvases internally\n */\n _initialize() {\n this._sourceSprite = this._imgSource.image;\n // top left slice\n this._canvasA.width = this._config.sourceConfig.leftMargin;\n this._canvasA.height = this._config.sourceConfig.topMargin;\n const aCtx = this._canvasA.getContext('2d');\n aCtx === null || aCtx === void 0 ? void 0 : aCtx.drawImage(this._sourceSprite, 0, 0, this._canvasA.width, this._canvasA.height, 0, 0, this._canvasA.width, this._canvasA.height);\n // top slice\n this._canvasB.width = this._config.sourceConfig.width - this._config.sourceConfig.leftMargin - this._config.sourceConfig.rightMargin;\n this._canvasB.height = this._config.sourceConfig.topMargin;\n const bCtx = this._canvasB.getContext('2d');\n bCtx === null || bCtx === void 0 ? void 0 : bCtx.drawImage(this._sourceSprite, this._config.sourceConfig.leftMargin, 0, this._canvasB.width, this._canvasB.height, 0, 0, this._canvasB.width, this._canvasB.height);\n // top right slice\n this._canvasC.width = this._config.sourceConfig.rightMargin;\n this._canvasC.height = this._config.sourceConfig.topMargin;\n const cCtx = this._canvasC.getContext('2d');\n cCtx === null || cCtx === void 0 ? void 0 : cCtx.drawImage(this._sourceSprite, this._sourceSprite.width - this._config.sourceConfig.rightMargin, 0, this._canvasC.width, this._canvasC.height, 0, 0, this._canvasC.width, this._canvasC.height);\n // middle left slice\n this._canvasD.width = this._config.sourceConfig.leftMargin;\n this._canvasD.height = this._config.sourceConfig.height - this._config.sourceConfig.topMargin - this._config.sourceConfig.bottomMargin;\n const dCtx = this._canvasD.getContext('2d');\n dCtx === null || dCtx === void 0 ? void 0 : dCtx.drawImage(this._sourceSprite, 0, this._config.sourceConfig.topMargin, this._canvasD.width, this._canvasD.height, 0, 0, this._canvasD.width, this._canvasD.height);\n // middle slice\n this._canvasE.width = this._config.sourceConfig.width - this._config.sourceConfig.leftMargin - this._config.sourceConfig.rightMargin;\n this._canvasE.height = this._config.sourceConfig.height - this._config.sourceConfig.topMargin - this._config.sourceConfig.bottomMargin;\n const eCtx = this._canvasE.getContext('2d');\n eCtx === null || eCtx === void 0 ? void 0 : eCtx.drawImage(this._sourceSprite, this._config.sourceConfig.leftMargin, this._config.sourceConfig.topMargin, this._canvasE.width, this._canvasE.height, 0, 0, this._canvasE.width, this._canvasE.height);\n // middle right slice\n this._canvasF.width = this._config.sourceConfig.rightMargin;\n this._canvasF.height = this._config.sourceConfig.height - this._config.sourceConfig.topMargin - this._config.sourceConfig.bottomMargin;\n const fCtx = this._canvasF.getContext('2d');\n fCtx === null || fCtx === void 0 ? void 0 : fCtx.drawImage(this._sourceSprite, this._config.sourceConfig.width - this._config.sourceConfig.rightMargin, this._config.sourceConfig.topMargin, this._canvasF.width, this._canvasF.height, 0, 0, this._canvasF.width, this._canvasF.height);\n // bottom left slice\n this._canvasG.width = this._config.sourceConfig.leftMargin;\n this._canvasG.height = this._config.sourceConfig.bottomMargin;\n const gCtx = this._canvasG.getContext('2d');\n gCtx === null || gCtx === void 0 ? void 0 : gCtx.drawImage(this._sourceSprite, 0, this._config.sourceConfig.height - this._config.sourceConfig.bottomMargin, this._canvasG.width, this._canvasG.height, 0, 0, this._canvasG.width, this._canvasG.height);\n // bottom slice\n this._canvasH.width = this._config.sourceConfig.width - this._config.sourceConfig.leftMargin - this._config.sourceConfig.rightMargin;\n this._canvasH.height = this._config.sourceConfig.bottomMargin;\n const hCtx = this._canvasH.getContext('2d');\n hCtx === null || hCtx === void 0 ? void 0 : hCtx.drawImage(this._sourceSprite, this._config.sourceConfig.leftMargin, this._config.sourceConfig.height - this._config.sourceConfig.bottomMargin, this._canvasH.width, this._canvasH.height, 0, 0, this._canvasH.width, this._canvasH.height);\n // bottom right slice\n this._canvasI.width = this._config.sourceConfig.rightMargin;\n this._canvasI.height = this._config.sourceConfig.bottomMargin;\n const iCtx = this._canvasI.getContext('2d');\n iCtx === null || iCtx === void 0 ? void 0 : iCtx.drawImage(this._sourceSprite, this._sourceSprite.width - this._config.sourceConfig.rightMargin, this._config.sourceConfig.height - this._config.sourceConfig.bottomMargin, this._canvasI.width, this._canvasI.height, 0, 0, this._canvasI.width, this._canvasI.height);\n }\n /**\n * Clones the 9 slice\n */\n clone() {\n return new NineSlice(this._config);\n }\n /**\n * Returns the number of tiles\n */\n _getNumberOfTiles(tileSize, destinationSize, strategy) {\n switch (strategy) {\n case NineSliceStretch.Stretch:\n return 1;\n case NineSliceStretch.Tile:\n return Math.ceil(destinationSize / tileSize);\n case NineSliceStretch.TileFit:\n return Math.ceil(destinationSize / tileSize);\n }\n }\n /**\n * Returns the position and size of the tile\n */\n _calculateParams(tileNum, numTiles, tileSize, destinationSize, strategy) {\n switch (strategy) {\n case NineSliceStretch.Stretch:\n return {\n tempPosition: 0,\n tempSize: destinationSize\n };\n case NineSliceStretch.Tile:\n // if last tile, adjust size\n if (tileNum === numTiles - 1) {\n //last tile\n return {\n tempPosition: tileNum * tileSize,\n tempSize: tileSize - (numTiles * tileSize - destinationSize)\n };\n }\n else {\n return {\n tempPosition: tileNum * tileSize,\n tempSize: tileSize\n };\n }\n case NineSliceStretch.TileFit:\n const reducedTileSize = destinationSize / numTiles;\n const position = tileNum * reducedTileSize;\n return {\n tempPosition: position,\n tempSize: reducedTileSize\n };\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/OffscreenSystem.ts\":\n/*!*************************************!*\\\n !*** ./Graphics/OffscreenSystem.ts ***!\n \\*************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ OffscreenSystem: () => (/* binding */ OffscreenSystem)\n/* harmony export */ });\n/* harmony import */ var _GraphicsComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _ParallaxComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./ParallaxComponent */ \"./Graphics/ParallaxComponent.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Math/coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Priority.ts\");\n\n\n\n\n\n\n\n\nclass OffscreenSystem extends _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.System {\n constructor(world) {\n super();\n this.world = world;\n this.systemType = _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.SystemType.Draw;\n this.query = this.world.query([_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent, _GraphicsComponent__WEBPACK_IMPORTED_MODULE_2__.GraphicsComponent]);\n }\n initialize(world, scene) {\n this._camera = scene.camera;\n this._screen = scene.engine.screen;\n }\n update() {\n this._worldBounds = this._screen.getWorldBounds();\n let transform;\n let graphics;\n let maybeParallax;\n for (let i = 0; i < this.query.entities.length; i++) {\n const entity = this.query.entities[i];\n graphics = entity.get(_GraphicsComponent__WEBPACK_IMPORTED_MODULE_2__.GraphicsComponent);\n transform = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n maybeParallax = entity.get(_ParallaxComponent__WEBPACK_IMPORTED_MODULE_3__.ParallaxComponent);\n let parallaxOffset;\n if (maybeParallax) {\n // We use the Tiled formula\n // https://doc.mapeditor.org/en/latest/manual/layers/#parallax-scrolling-factor\n // cameraPos * (1 - parallaxFactor)\n const oneMinusFactor = _Math_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.One.sub(maybeParallax.parallaxFactor);\n parallaxOffset = this._camera.pos.scale(oneMinusFactor);\n }\n // Figure out if entities are offscreen\n const entityOffscreen = this._isOffscreen(transform, graphics, parallaxOffset);\n if (entityOffscreen && !entity.hasTag('ex.offscreen')) {\n entity.events.emit('exitviewport', new _Events__WEBPACK_IMPORTED_MODULE_5__.ExitViewPortEvent(entity));\n entity.addTag('ex.offscreen');\n }\n if (!entityOffscreen && entity.hasTag('ex.offscreen')) {\n entity.events.emit('enterviewport', new _Events__WEBPACK_IMPORTED_MODULE_5__.EnterViewPortEvent(entity));\n entity.removeTag('ex.offscreen');\n }\n }\n }\n _isOffscreen(transform, graphics, parallaxOffset) {\n if (graphics.forceOnScreen) {\n return false;\n }\n if (transform.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_6__.CoordPlane.World) {\n let bounds = graphics.localBounds;\n if (parallaxOffset) {\n bounds = bounds.translate(parallaxOffset);\n }\n const transformedBounds = bounds.transform(transform.get().matrix);\n const graphicsOffscreen = !this._worldBounds.overlaps(transformedBounds);\n return graphicsOffscreen;\n }\n else {\n // TODO screen coordinates\n return false;\n }\n }\n}\nOffscreenSystem.priority = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_7__.SystemPriority.Higher;\n\n\n/***/ }),\n\n/***/ \"./Graphics/ParallaxComponent.ts\":\n/*!***************************************!*\\\n !*** ./Graphics/ParallaxComponent.ts ***!\n \\***************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ParallaxComponent: () => (/* binding */ ParallaxComponent)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Component */ \"./EntityComponentSystem/Component.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n\n\nclass ParallaxComponent extends _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor(parallaxFactor) {\n super();\n this.parallaxFactor = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(1.0, 1.0);\n this.parallaxFactor = parallaxFactor !== null && parallaxFactor !== void 0 ? parallaxFactor : this.parallaxFactor;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Polygon.ts\":\n/*!*****************************!*\\\n !*** ./Graphics/Polygon.ts ***!\n \\*****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Polygon: () => (/* binding */ Polygon)\n/* harmony export */ });\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Raster__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Raster */ \"./Graphics/Raster.ts\");\n\n\n\n/**\n * A polygon {@apilink Graphic} for drawing arbitrary polygons to the {@apilink ExcaliburGraphicsContext}\n *\n * Polygons default to {@apilink ImageFiltering.Blended}\n */\nclass Polygon extends _Raster__WEBPACK_IMPORTED_MODULE_0__.Raster {\n get points() {\n return this._points;\n }\n set points(points) {\n this._points = points;\n const min = this.minPoint;\n this.width = this._points.reduce((max, p) => Math.max(p.x, max), 0) - min.x;\n this.height = this._points.reduce((max, p) => Math.max(p.y, max), 0) - min.y;\n this.flagDirty();\n }\n get minPoint() {\n const minX = this._points.reduce((min, p) => Math.min(p.x, min), Infinity);\n const minY = this._points.reduce((min, p) => Math.min(p.y, min), Infinity);\n return (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(minX, minY);\n }\n constructor(options) {\n super(options);\n this._points = [];\n this.points = options.points;\n this.filtering = _Filtering__WEBPACK_IMPORTED_MODULE_2__.ImageFiltering.Blended;\n this.rasterize();\n }\n clone() {\n return new Polygon({\n points: this.points.map((p) => p.clone()),\n ...this.cloneGraphicOptions(),\n ...this.cloneRasterOptions()\n });\n }\n execute(ctx) {\n if (this.points && this.points.length) {\n ctx.beginPath();\n // Iterate through the supplied points and construct a 'polygon'\n const min = this.minPoint.negate();\n const firstPoint = this.points[0].add(min);\n ctx.moveTo(firstPoint.x, firstPoint.y);\n this.points.forEach((point) => {\n ctx.lineTo(point.x + min.x, point.y + min.y);\n });\n ctx.lineTo(firstPoint.x, firstPoint.y);\n ctx.closePath();\n if (this.color) {\n ctx.fill();\n }\n if (this.strokeColor) {\n ctx.stroke();\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/PostProcessor/ColorBlindnessMode.ts\":\n/*!******************************************************!*\\\n !*** ./Graphics/PostProcessor/ColorBlindnessMode.ts ***!\n \\******************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ColorBlindnessMode: () => (/* binding */ ColorBlindnessMode)\n/* harmony export */ });\nvar ColorBlindnessMode;\n(function (ColorBlindnessMode) {\n ColorBlindnessMode[\"Protanope\"] = \"Protanope\";\n ColorBlindnessMode[\"Deuteranope\"] = \"Deuteranope\";\n ColorBlindnessMode[\"Tritanope\"] = \"Tritanope\";\n})(ColorBlindnessMode || (ColorBlindnessMode = {}));\n\n\n/***/ }),\n\n/***/ \"./Graphics/PostProcessor/ColorBlindnessPostProcessor.ts\":\n/*!***************************************************************!*\\\n !*** ./Graphics/PostProcessor/ColorBlindnessPostProcessor.ts ***!\n \\***************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ColorBlindnessPostProcessor: () => (/* binding */ ColorBlindnessPostProcessor)\n/* harmony export */ });\n/* harmony import */ var _color_blind_fragment_glsl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./color-blind-fragment.glsl */ \"./Graphics/PostProcessor/color-blind-fragment.glsl\");\n/* harmony import */ var _ColorBlindnessMode__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ColorBlindnessMode */ \"./Graphics/PostProcessor/ColorBlindnessMode.ts\");\n/* harmony import */ var _ScreenShader__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ScreenShader */ \"./Graphics/PostProcessor/ScreenShader.ts\");\n\n\n\nclass ColorBlindnessPostProcessor {\n constructor(_colorBlindnessMode, simulate = false) {\n this._colorBlindnessMode = _colorBlindnessMode;\n this._simulate = false;\n this._simulate = simulate;\n }\n initialize(gl) {\n this._shader = new _ScreenShader__WEBPACK_IMPORTED_MODULE_0__.ScreenShader(gl, _color_blind_fragment_glsl__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n this.simulate = this._simulate;\n this.colorBlindnessMode = this._colorBlindnessMode;\n }\n getShader() {\n return this._shader.getShader();\n }\n getLayout() {\n return this._shader.getLayout();\n }\n set colorBlindnessMode(colorBlindMode) {\n this._colorBlindnessMode = colorBlindMode;\n if (this._shader) {\n const shader = this._shader.getShader();\n shader.use();\n if (this._colorBlindnessMode === _ColorBlindnessMode__WEBPACK_IMPORTED_MODULE_2__.ColorBlindnessMode.Protanope) {\n shader.setUniformInt('u_type', 0);\n }\n else if (this._colorBlindnessMode === _ColorBlindnessMode__WEBPACK_IMPORTED_MODULE_2__.ColorBlindnessMode.Deuteranope) {\n shader.setUniformInt('u_type', 1);\n }\n else if (this._colorBlindnessMode === _ColorBlindnessMode__WEBPACK_IMPORTED_MODULE_2__.ColorBlindnessMode.Tritanope) {\n shader.setUniformInt('u_type', 2);\n }\n }\n }\n get colorBlindnessMode() {\n return this._colorBlindnessMode;\n }\n set simulate(value) {\n this._simulate = value;\n if (this._shader) {\n const shader = this._shader.getShader();\n shader.use();\n shader.setUniformBoolean('u_simulate', value);\n }\n }\n get simulate() {\n return this._simulate;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/PostProcessor/ScreenShader.ts\":\n/*!************************************************!*\\\n !*** ./Graphics/PostProcessor/ScreenShader.ts ***!\n \\************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ScreenShader: () => (/* binding */ ScreenShader)\n/* harmony export */ });\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Context_shader__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Context/shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _Context_vertex_buffer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Context/vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _Context_vertex_layout__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Context/vertex-layout */ \"./Graphics/Context/vertex-layout.ts\");\n\n\n\n\n/**\n * Helper that defines a whole screen renderer, just provide a fragment source!\n *\n * Currently supports 1 varying\n * - vec2 a_texcoord between 0-1 which corresponds to screen position\n */\nclass ScreenShader {\n constructor(gl, fragmentSource) {\n if (true) {\n if (fragmentSource.includes('v_texcoord')) {\n _Util_Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance().warn(`ScreenShader: \"v_texcoord\" is deprecated in postprocessing fragment shaders will be removed in v1.0,` +\n ` use \"v_uv\" instead. Source [${fragmentSource}]`);\n }\n }\n this._shader = new _Context_shader__WEBPACK_IMPORTED_MODULE_1__.Shader({\n gl,\n vertexSource: `#version 300 es\r\n in vec2 a_position;\r\n in vec2 a_uv;\r\n out vec2 v_texcoord;\r\n out vec2 v_uv;\r\n\r\n void main() {\r\n gl_Position = vec4(a_position, 0.0, 1.0);\r\n // Pass the texcoord to the fragment shader.\r\n v_texcoord = a_uv;\r\n v_uv = a_uv;\r\n }`,\n fragmentSource: fragmentSource\n });\n this._shader.compile();\n // Setup memory layout\n this._buffer = new _Context_vertex_buffer__WEBPACK_IMPORTED_MODULE_2__.VertexBuffer({\n gl,\n type: 'static',\n // clip space quad + uv since we don't need a camera\n data: new Float32Array([\n -1, -1, 0, 0, -1, 1, 0, 1, 1, -1, 1, 0,\n 1, -1, 1, 0, -1, 1, 0, 1, 1, 1, 1, 1\n ])\n });\n this._layout = new _Context_vertex_layout__WEBPACK_IMPORTED_MODULE_3__.VertexLayout({\n gl,\n shader: this._shader,\n vertexBuffer: this._buffer,\n attributes: [\n ['a_position', 2],\n ['a_uv', 2]\n ]\n });\n this._buffer.upload();\n }\n getShader() {\n return this._shader;\n }\n getLayout() {\n return this._layout;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Raster.ts\":\n/*!****************************!*\\\n !*** ./Graphics/Raster.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Raster: () => (/* binding */ Raster)\n/* harmony export */ });\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Util_Watch__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Util/Watch */ \"./Util/Watch.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Util */ \"./Util/Util.ts\");\n\n\n\n\n\n\n/**\n * A Raster is a Graphic that needs to be first painted to a HTMLCanvasElement before it can be drawn to the\n * {@apilink ExcaliburGraphicsContext}. This is useful for generating custom images using the 2D canvas api.\n *\n * Implementors must implement the {@apilink Raster.execute} method to rasterize their drawing.\n */\nclass Raster extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n constructor(options) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;\n super((0,_Util_Util__WEBPACK_IMPORTED_MODULE_1__.omit)({ ...options }, ['width', 'height'])); // rasters do some special sauce with width/height\n this.lineCap = 'butt';\n this.quality = 1;\n this._dirty = true;\n this._smoothing = false;\n this._color = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_2__.watch)(_Color__WEBPACK_IMPORTED_MODULE_3__.Color.Black, () => this.flagDirty());\n this._lineWidth = 1;\n this._lineDash = [];\n this._padding = 0;\n if (options) {\n this.quality = (_a = options.quality) !== null && _a !== void 0 ? _a : this.quality;\n this.color = (_b = options.color) !== null && _b !== void 0 ? _b : _Color__WEBPACK_IMPORTED_MODULE_3__.Color.Black;\n this.strokeColor = options === null || options === void 0 ? void 0 : options.strokeColor;\n this.smoothing = (_c = options.smoothing) !== null && _c !== void 0 ? _c : this.smoothing;\n this.lineWidth = (_d = options.lineWidth) !== null && _d !== void 0 ? _d : this.lineWidth;\n this.lineDash = (_e = options.lineDash) !== null && _e !== void 0 ? _e : this.lineDash;\n this.lineCap = (_f = options.lineCap) !== null && _f !== void 0 ? _f : this.lineCap;\n this.padding = (_g = options.padding) !== null && _g !== void 0 ? _g : this.padding;\n this.filtering = (_h = options.filtering) !== null && _h !== void 0 ? _h : this.filtering;\n }\n this._bitmap = document.createElement('canvas');\n // get the default canvas width/height as a fallback\n const bitmapWidth = (_j = options === null || options === void 0 ? void 0 : options.width) !== null && _j !== void 0 ? _j : this._bitmap.width;\n const bitmapHeight = (_k = options === null || options === void 0 ? void 0 : options.height) !== null && _k !== void 0 ? _k : this._bitmap.height;\n this.width = bitmapWidth;\n this.height = bitmapHeight;\n const maybeCtx = this._bitmap.getContext('2d');\n if (!maybeCtx) {\n /* istanbul ignore next */\n throw new Error('Browser does not support 2d canvas drawing, cannot create Raster graphic');\n }\n else {\n this._ctx = maybeCtx;\n }\n }\n cloneRasterOptions() {\n return {\n color: this.color ? this.color.clone() : undefined,\n strokeColor: this.strokeColor ? this.strokeColor.clone() : undefined,\n smoothing: this.smoothing,\n lineWidth: this.lineWidth,\n lineDash: this.lineDash,\n lineCap: this.lineCap,\n quality: this.quality,\n padding: this.padding\n };\n }\n /**\n * Gets whether the graphic is dirty, this means there are changes that haven't been re-rasterized\n */\n get dirty() {\n return this._dirty;\n }\n /**\n * Flags the graphic as dirty, meaning it must be re-rasterized before draw.\n * This should be called any time the graphics state changes such that it affects the outputted drawing\n */\n flagDirty() {\n this._dirty = true;\n }\n /**\n * Gets or sets the current width of the Raster graphic. Setting the width will cause the raster\n * to be flagged dirty causing a re-raster on the next draw.\n *\n * Any `padding`s or `quality` set will be factored into the width\n */\n get width() {\n return Math.abs(this._getTotalWidth() * this.scale.x);\n }\n set width(value) {\n value /= Math.abs(this.scale.x);\n this._bitmap.width = value;\n this._originalWidth = value;\n this.flagDirty();\n }\n /**\n * Gets or sets the current height of the Raster graphic. Setting the height will cause the raster\n * to be flagged dirty causing a re-raster on the next draw.\n *\n * Any `padding` or `quality` set will be factored into the height\n */\n get height() {\n return Math.abs(this._getTotalHeight() * this.scale.y);\n }\n set height(value) {\n value /= Math.abs(this.scale.y);\n this._bitmap.height = value;\n this._originalHeight = value;\n this.flagDirty();\n }\n _getTotalWidth() {\n var _a;\n return (((_a = this._originalWidth) !== null && _a !== void 0 ? _a : this._bitmap.width) + this.padding * 2) * 1;\n }\n _getTotalHeight() {\n var _a;\n return (((_a = this._originalHeight) !== null && _a !== void 0 ? _a : this._bitmap.height) + this.padding * 2) * 1;\n }\n /**\n * Returns the local bounds of the Raster including the padding\n */\n get localBounds() {\n return _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_4__.BoundingBox.fromDimension(this._getTotalWidth() * this.scale.x, this._getTotalHeight() * this.scale.y, _Math_vector__WEBPACK_IMPORTED_MODULE_5__.Vector.Zero);\n }\n /**\n * Gets or sets the smoothing (anti-aliasing of the graphic). Setting the height will cause the raster\n * to be flagged dirty causing a re-raster on the next draw.\n */\n get smoothing() {\n return this._smoothing;\n }\n set smoothing(value) {\n this._smoothing = value;\n this.flagDirty();\n }\n /**\n * Gets or sets the fillStyle of the Raster graphic. Setting the fillStyle will cause the raster to be\n * flagged dirty causing a re-raster on the next draw.\n */\n get color() {\n return this._color;\n }\n set color(value) {\n this.flagDirty();\n this._color = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_2__.watch)(value, () => this.flagDirty());\n }\n /**\n * Gets or sets the strokeStyle of the Raster graphic. Setting the strokeStyle will cause the raster to be\n * flagged dirty causing a re-raster on the next draw.\n */\n get strokeColor() {\n return this._strokeColor;\n }\n set strokeColor(value) {\n this.flagDirty();\n if (value) {\n this._strokeColor = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_2__.watch)(value, () => this.flagDirty());\n }\n }\n /**\n * Gets or sets the line width of the Raster graphic. Setting the lineWidth will cause the raster to be\n * flagged dirty causing a re-raster on the next draw.\n */\n get lineWidth() {\n return this._lineWidth;\n }\n set lineWidth(value) {\n this._lineWidth = value;\n this.flagDirty();\n }\n get lineDash() {\n return this._lineDash;\n }\n set lineDash(value) {\n this._lineDash = value;\n this.flagDirty();\n }\n get padding() {\n return this._padding;\n }\n set padding(value) {\n this._padding = value;\n this.flagDirty();\n }\n /**\n * Rasterize the graphic to a bitmap making it usable as in excalibur. Rasterize is called automatically if\n * the graphic is {@apilink Raster.dirty} on the next {@apilink Graphic.draw} call\n */\n rasterize() {\n this._dirty = false;\n this._ctx.clearRect(0, 0, this._getTotalWidth(), this._getTotalHeight());\n this._ctx.save();\n this._applyRasterProperties(this._ctx);\n this.execute(this._ctx);\n this._ctx.restore();\n }\n _applyRasterProperties(ctx) {\n var _a, _b, _c, _d;\n this._bitmap.width = this._getTotalWidth() * this.quality;\n this._bitmap.height = this._getTotalHeight() * this.quality;\n // Do a bad thing to pass the filtering as an attribute\n this._bitmap.setAttribute('filtering', this.filtering);\n this._bitmap.setAttribute('forceUpload', 'true');\n ctx.scale(this.quality, this.quality);\n ctx.translate(this.padding, this.padding);\n ctx.imageSmoothingEnabled = this.smoothing;\n ctx.lineWidth = this.lineWidth;\n ctx.setLineDash((_a = this.lineDash) !== null && _a !== void 0 ? _a : ctx.getLineDash());\n ctx.lineCap = this.lineCap;\n ctx.strokeStyle = (_c = (_b = this.strokeColor) === null || _b === void 0 ? void 0 : _b.toString()) !== null && _c !== void 0 ? _c : '';\n ctx.fillStyle = (_d = this.color) === null || _d === void 0 ? void 0 : _d.toString();\n }\n _drawImage(ex, x, y) {\n if (this._dirty) {\n this.rasterize();\n }\n ex.scale(1 / this.quality, 1 / this.quality);\n ex.drawImage(this._bitmap, x, y);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Rectangle.ts\":\n/*!*******************************!*\\\n !*** ./Graphics/Rectangle.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Rectangle: () => (/* binding */ Rectangle)\n/* harmony export */ });\n/* harmony import */ var _Raster__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Raster */ \"./Graphics/Raster.ts\");\n\n/**\n * A Rectangle {@apilink Graphic} for drawing rectangles to the {@apilink ExcaliburGraphicsContext}\n */\nclass Rectangle extends _Raster__WEBPACK_IMPORTED_MODULE_0__.Raster {\n constructor(options) {\n super(options);\n this.width = options.width;\n this.height = options.height;\n this.rasterize();\n }\n clone() {\n return new Rectangle({\n width: this.width,\n height: this.height,\n ...this.cloneGraphicOptions(),\n ...this.cloneRasterOptions()\n });\n }\n execute(ctx) {\n if (this.color) {\n ctx.fillRect(0, 0, this.width, this.height);\n }\n if (this.strokeColor) {\n ctx.strokeRect(0, 0, this.width, this.height);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Sprite.ts\":\n/*!****************************!*\\\n !*** ./Graphics/Sprite.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Sprite: () => (/* binding */ Sprite)\n/* harmony export */ });\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n\n\nclass Sprite extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n static from(image, options) {\n return new Sprite({\n image,\n ...options\n });\n }\n constructor(options) {\n var _a, _b;\n super(options);\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this._dirty = true;\n this.image = options.image;\n const { width, height } = options;\n this.sourceView = (_a = options.sourceView) !== null && _a !== void 0 ? _a : { x: 0, y: 0, width: width !== null && width !== void 0 ? width : 0, height: height !== null && height !== void 0 ? height : 0 };\n this.destSize = (_b = options.destSize) !== null && _b !== void 0 ? _b : { width: width !== null && width !== void 0 ? width : 0, height: height !== null && height !== void 0 ? height : 0 };\n this._updateSpriteDimensions();\n // Fire when loaded\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.image.ready.then(() => {\n this._updateSpriteDimensions();\n });\n }\n get width() {\n return Math.abs(this.destSize.width * this.scale.x);\n }\n get height() {\n return Math.abs(this.destSize.height * this.scale.y);\n }\n set width(newWidth) {\n newWidth /= Math.abs(this.scale.x);\n this.destSize.width = newWidth;\n super.width = Math.ceil(this.destSize.width);\n }\n set height(newHeight) {\n newHeight /= Math.abs(this.scale.y);\n this.destSize.height = newHeight;\n super.height = Math.ceil(this.destSize.height);\n }\n _updateSpriteDimensions() {\n var _a, _b, _c, _d, _e, _f;\n const { width: nativeWidth, height: nativeHeight } = this.image;\n // This code uses || to avoid 0's\n // If the source is not specified, use the native dimension\n this.sourceView.width = ((_a = this.sourceView) === null || _a === void 0 ? void 0 : _a.width) || nativeWidth;\n this.sourceView.height = ((_b = this.sourceView) === null || _b === void 0 ? void 0 : _b.height) || nativeHeight;\n // If the destination is not specified, use the source if specified, then native\n this.destSize.width = ((_c = this.destSize) === null || _c === void 0 ? void 0 : _c.width) || ((_d = this.sourceView) === null || _d === void 0 ? void 0 : _d.width) || nativeWidth;\n this.destSize.height = ((_e = this.destSize) === null || _e === void 0 ? void 0 : _e.height) || ((_f = this.sourceView) === null || _f === void 0 ? void 0 : _f.height) || nativeHeight;\n this.width = Math.ceil(this.destSize.width) * this.scale.x;\n this.height = Math.ceil(this.destSize.height) * this.scale.y;\n }\n _preDraw(ex, x, y) {\n if (this.image.isLoaded() && this._dirty) {\n this._dirty = false;\n this._updateSpriteDimensions();\n }\n super._preDraw(ex, x, y);\n }\n _drawImage(ex, x, y) {\n if (this.image.isLoaded()) {\n ex.drawImage(this.image.image, this.sourceView.x, this.sourceView.y, this.sourceView.width, this.sourceView.height, x, y, this.destSize.width, this.destSize.height);\n }\n else {\n this._logger.warnOnce(`ImageSource ${this.image.path}` +\n ` is not yet loaded and won't be drawn. Please call .load() or include in a Loader.\\n\\n` +\n `Read https://excaliburjs.com/docs/imagesource for more information.`);\n }\n }\n clone() {\n return new Sprite({\n image: this.image,\n sourceView: { ...this.sourceView },\n destSize: { ...this.destSize },\n ...this.cloneGraphicOptions()\n });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/SpriteFont.ts\":\n/*!********************************!*\\\n !*** ./Graphics/SpriteFont.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SpriteFont: () => (/* binding */ SpriteFont)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n\n\n\n\nclass SpriteFont extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n constructor(options) {\n super(options);\n this._text = '';\n this.alphabet = '';\n this.shadow = undefined;\n this.caseInsensitive = false;\n this.spacing = 0;\n this.lineHeight = undefined;\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n const { alphabet, spriteSheet, caseInsensitive, spacing, shadow, lineHeight } = options;\n this.alphabet = alphabet;\n this.spriteSheet = spriteSheet;\n this.caseInsensitive = caseInsensitive !== null && caseInsensitive !== void 0 ? caseInsensitive : this.caseInsensitive;\n this.spacing = spacing !== null && spacing !== void 0 ? spacing : this.spacing;\n this.shadow = shadow !== null && shadow !== void 0 ? shadow : this.shadow;\n this.lineHeight = lineHeight !== null && lineHeight !== void 0 ? lineHeight : this.lineHeight;\n }\n _getCharacterSprites(text) {\n const results = [];\n // handle case insensitive\n const textToRender = this.caseInsensitive ? text.toLocaleLowerCase() : text;\n const alphabet = this.caseInsensitive ? this.alphabet.toLocaleLowerCase() : this.alphabet;\n // for each letter in text\n for (let letterIndex = 0; letterIndex < textToRender.length; letterIndex++) {\n // find the sprite index in alphabet , if there is an error pick the first\n const letter = textToRender[letterIndex];\n let spriteIndex = alphabet.indexOf(letter);\n if (spriteIndex === -1) {\n spriteIndex = 0;\n this._logger.warnOnce(`SpriteFont - Cannot find letter '${letter}' in configured alphabet '${alphabet}'.`);\n this._logger.warnOnce('There maybe be more issues in the SpriteFont configuration. No additional warnings will be logged.');\n }\n const letterSprite = this.spriteSheet.sprites[spriteIndex];\n if (letterSprite) {\n results.push(letterSprite);\n }\n else {\n this._logger.warnOnce(`SpriteFont - Cannot find sprite for '${letter}' at index '${spriteIndex}' in configured SpriteSheet`);\n this._logger.warnOnce('There maybe be more issues in the SpriteFont configuration. No additional warnings will be logged.');\n }\n }\n return results;\n }\n measureText(text, maxWidth) {\n const lines = this._getLinesFromText(text, maxWidth);\n const maxWidthLine = lines.reduce((a, b) => {\n return a.length > b.length ? a : b;\n });\n const sprites = this._getCharacterSprites(maxWidthLine);\n let width = 0;\n let height = 0;\n for (const sprite of sprites) {\n width += sprite.width + this.spacing;\n height = Math.max(height, sprite.height);\n }\n return _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromDimension(width * this.scale.x, height * lines.length * this.scale.y, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero);\n }\n _drawImage(ex, x, y, maxWidth) {\n var _a;\n let xCursor = 0;\n let yCursor = 0;\n let height = 0;\n const lines = this._getLinesFromText(this._text, maxWidth);\n for (const line of lines) {\n for (const sprite of this._getCharacterSprites(line)) {\n // draw it in the right spot and increase the cursor by sprite width\n sprite.draw(ex, x + xCursor, y + yCursor);\n xCursor += sprite.width + this.spacing;\n height = Math.max(height, sprite.height);\n }\n xCursor = 0;\n yCursor += (_a = this.lineHeight) !== null && _a !== void 0 ? _a : height;\n }\n }\n render(ex, text, _color, x, y, maxWidth) {\n // SpriteFont doesn't support _color, yet...\n this._text = text;\n const bounds = this.measureText(text, maxWidth);\n this.width = bounds.width;\n this.height = bounds.height;\n if (this.shadow) {\n ex.save();\n ex.translate(this.shadow.offset.x, this.shadow.offset.y);\n this._preDraw(ex, x, y);\n this._drawImage(ex, 0, 0, maxWidth);\n this._postDraw(ex);\n ex.restore();\n }\n this._preDraw(ex, x, y);\n this._drawImage(ex, 0, 0, maxWidth);\n this._postDraw(ex);\n }\n clone() {\n return new SpriteFont({\n alphabet: this.alphabet,\n spriteSheet: this.spriteSheet,\n spacing: this.spacing\n });\n }\n _getLinesFromText(text, maxWidth) {\n var _a;\n if (this._cachedText === text && this._cachedRenderWidth === maxWidth && ((_a = this._cachedLines) === null || _a === void 0 ? void 0 : _a.length)) {\n return this._cachedLines;\n }\n const lines = text.split('\\n');\n if (maxWidth == null) {\n return lines;\n }\n // If the current line goes past the maxWidth, append a new line without modifying the underlying text.\n for (let i = 0; i < lines.length; i++) {\n let line = lines[i];\n let newLine = '';\n // Note: we subtract the spacing to counter the initial padding on the left side.\n if (this.measureText(line).width > maxWidth) {\n while (this.measureText(line).width > maxWidth) {\n newLine = line[line.length - 1] + newLine;\n line = line.slice(0, -1); // Remove last character from line\n }\n // Update the array with our new values\n lines[i] = line;\n lines[i + 1] = newLine;\n }\n }\n this._cachedText = text;\n this._cachedLines = lines;\n this._cachedRenderWidth = maxWidth;\n return lines;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/SpriteSheet.ts\":\n/*!*********************************!*\\\n !*** ./Graphics/SpriteSheet.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SpriteSheet: () => (/* binding */ SpriteSheet)\n/* harmony export */ });\n/* harmony import */ var _Sprite__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Sprite */ \"./Graphics/Sprite.ts\");\n/* harmony import */ var _TiledSprite__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./TiledSprite */ \"./Graphics/TiledSprite.ts\");\n\n\n/**\n * Represents a collection of sprites from a source image with some organization in a grid\n */\nclass SpriteSheet {\n /**\n * Build a new sprite sheet from a list of sprites\n *\n * Use {@apilink SpriteSheet.fromImageSource} to create a SpriteSheet from an {@apilink ImageSource} organized in a grid\n * @param options\n */\n constructor(options) {\n this.sprites = [];\n const { sprites, rows, columns } = options;\n this.sprites = sprites;\n this.rows = rows !== null && rows !== void 0 ? rows : 1;\n this.columns = columns !== null && columns !== void 0 ? columns : this.sprites.length;\n }\n /**\n * Find a sprite by their x/y integer coordinates in the SpriteSheet, for example `getSprite(0, 0)` is the {@apilink Sprite} in the top-left\n * and `getSprite(1, 0)` is the sprite one to the right.\n * @param x\n * @param y\n */\n getSprite(x, y, options) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j;\n if (x >= this.columns || x < 0) {\n throw Error(`No sprite exists in the SpriteSheet at (${x}, ${y}), x: ${x} should be between 0 and ${this.columns - 1} columns`);\n }\n if (y >= this.rows || y < 0) {\n throw Error(`No sprite exists in the SpriteSheet at (${x}, ${y}), y: ${y} should be between 0 and ${this.rows - 1} rows`);\n }\n const spriteIndex = x + y * this.columns;\n const sprite = this.sprites[spriteIndex];\n if (sprite) {\n if (options) {\n const spriteWithOptions = sprite.clone();\n spriteWithOptions.flipHorizontal = (_a = options.flipHorizontal) !== null && _a !== void 0 ? _a : spriteWithOptions.flipHorizontal;\n spriteWithOptions.flipVertical = (_b = options.flipVertical) !== null && _b !== void 0 ? _b : spriteWithOptions.flipVertical;\n spriteWithOptions.width = (_c = options.width) !== null && _c !== void 0 ? _c : spriteWithOptions.width;\n spriteWithOptions.height = (_d = options.height) !== null && _d !== void 0 ? _d : spriteWithOptions.height;\n spriteWithOptions.rotation = (_e = options.rotation) !== null && _e !== void 0 ? _e : spriteWithOptions.rotation;\n spriteWithOptions.scale = (_f = options.scale) !== null && _f !== void 0 ? _f : spriteWithOptions.scale;\n spriteWithOptions.opacity = (_g = options.opacity) !== null && _g !== void 0 ? _g : spriteWithOptions.opacity;\n spriteWithOptions.tint = (_h = options.tint) !== null && _h !== void 0 ? _h : spriteWithOptions.tint;\n spriteWithOptions.origin = (_j = options.origin) !== null && _j !== void 0 ? _j : spriteWithOptions.origin;\n return spriteWithOptions;\n }\n return sprite;\n }\n throw Error(`Invalid sprite coordinates (${x}, ${y})`);\n }\n /**\n * Find a sprite by their x/y integer coordinates in the SpriteSheet and configures tiling to repeat by default,\n * for example `getTiledSprite(0, 0)` is the {@apilink TiledSprite} in the top-left\n * and `getTiledSprite(1, 0)` is the sprite one to the right.\n *\n * Example:\n *\n * ```typescript\n * spriteSheet.getTiledSprite(1, 0, {\n * width: game.screen.width,\n * height: 200,\n * wrapping: {\n * x: ex.ImageWrapping.Repeat,\n * y: ex.ImageWrapping.Clamp\n * }\n * });\n * ```\n * @param x\n * @param y\n * @param options\n */\n getTiledSprite(x, y, options) {\n if (x >= this.columns || x < 0) {\n throw Error(`No sprite exists in the SpriteSheet at (${x}, ${y}), x: ${x} should be between 0 and ${this.columns - 1} columns`);\n }\n if (y >= this.rows || y < 0) {\n throw Error(`No sprite exists in the SpriteSheet at (${x}, ${y}), y: ${y} should be between 0 and ${this.rows - 1} rows`);\n }\n const spriteIndex = x + y * this.columns;\n const sprite = this.sprites[spriteIndex];\n if (sprite) {\n return _TiledSprite__WEBPACK_IMPORTED_MODULE_0__.TiledSprite.fromSprite(sprite, options);\n }\n throw Error(`Invalid sprite coordinates (${x}, ${y})`);\n }\n /**\n * Create a sprite sheet from a sparse set of {@apilink SourceView} rectangles\n * @param options\n */\n static fromImageSourceWithSourceViews(options) {\n const sprites = options.sourceViews.map((sourceView) => {\n return new _Sprite__WEBPACK_IMPORTED_MODULE_1__.Sprite({\n image: options.image,\n sourceView\n });\n });\n return new SpriteSheet({ sprites });\n }\n /**\n * Create a SpriteSheet from an {@apilink ImageSource} organized in a grid\n *\n * Example:\n * ```\n * const spriteSheet = SpriteSheet.fromImageSource({\n * image: imageSource,\n * grid: {\n * rows: 5,\n * columns: 2,\n * spriteWidth: 32, // pixels\n * spriteHeight: 32 // pixels\n * },\n * // Optionally specify spacing\n * spacing: {\n * // pixels from the top left to start the sprite parsing\n * originOffset: {\n * x: 5,\n * y: 5\n * },\n * // pixels between each sprite while parsing\n * margin: {\n * x: 1,\n * y: 1\n * }\n * }\n * })\n * ```\n * @param options\n */\n static fromImageSource(options) {\n var _a;\n const sprites = [];\n options.spacing = (_a = options.spacing) !== null && _a !== void 0 ? _a : {};\n const { image, grid: { rows, columns: cols, spriteWidth, spriteHeight }, spacing: { originOffset, margin } } = options;\n const offsetDefaults = { x: 0, y: 0, ...originOffset };\n const marginDefaults = { x: 0, y: 0, ...margin };\n for (let x = 0; x < cols; x++) {\n for (let y = 0; y < rows; y++) {\n sprites[x + y * cols] = new _Sprite__WEBPACK_IMPORTED_MODULE_1__.Sprite({\n image: image,\n sourceView: {\n x: x * spriteWidth + marginDefaults.x * x + offsetDefaults.x,\n y: y * spriteHeight + marginDefaults.y * y + offsetDefaults.y,\n width: spriteWidth,\n height: spriteHeight\n },\n destSize: { height: spriteHeight, width: spriteWidth }\n });\n }\n }\n return new SpriteSheet({\n sprites: sprites,\n rows: rows,\n columns: cols\n });\n }\n clone() {\n return new SpriteSheet({\n sprites: this.sprites.map((sprite) => sprite.clone()),\n rows: this.rows,\n columns: this.columns\n });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Text.ts\":\n/*!**************************!*\\\n !*** ./Graphics/Text.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Text: () => (/* binding */ Text)\n/* harmony export */ });\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Font__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Font */ \"./Graphics/Font.ts\");\n\n\n\n/**\n * Represent Text graphics in excalibur\n *\n * Useful for in game labels, ui, or overlays\n */\nclass Text extends _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic {\n constructor(options) {\n var _a, _b;\n super(options);\n this._text = '';\n this._textWidth = 0;\n this._textHeight = 0;\n // This order is important font, color, then text\n this.font = (_a = options.font) !== null && _a !== void 0 ? _a : new _Font__WEBPACK_IMPORTED_MODULE_1__.Font();\n this.color = (_b = options.color) !== null && _b !== void 0 ? _b : this.color;\n this.text = options.text;\n this.maxWidth = options.maxWidth;\n }\n clone() {\n var _a, _b;\n return new Text({\n text: this.text.slice(),\n color: (_b = (_a = this.color) === null || _a === void 0 ? void 0 : _a.clone()) !== null && _b !== void 0 ? _b : _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Black,\n font: this.font.clone(),\n maxWidth: this.maxWidth\n });\n }\n get text() {\n return this._text;\n }\n set text(value) {\n this._text = value;\n this._calculateDimension();\n }\n get font() {\n return this._font;\n }\n set font(font) {\n this._font = font;\n }\n get width() {\n if (this._textWidth === 0) {\n this._calculateDimension();\n }\n return this._textWidth * this.scale.x;\n }\n get height() {\n if (this._textHeight === 0) {\n this._calculateDimension();\n }\n return this._textHeight * this.scale.y;\n }\n _calculateDimension() {\n const { width, height } = this.font.measureText(this._text, this.maxWidth);\n this._textWidth = width;\n this._textHeight = height;\n }\n get localBounds() {\n return this.font.measureText(this._text, this.maxWidth).scale(this.scale);\n }\n _rotate(_ex) {\n // None this is delegated to font\n // This override erases the default behavior\n }\n _flip(_ex) {\n // None this is delegated to font\n // This override erases the default behavior\n }\n _preDraw(ex, x, y) {\n if (this.isStale() || this.font.isStale()) {\n this.font.flipHorizontal = this.flipHorizontal;\n this.font.flipVertical = this.flipVertical;\n this.font.rotation = this.rotation;\n this.font.origin = this.origin;\n this.font.opacity = this.opacity;\n }\n this.font.tint = this.tint;\n super._preDraw(ex, x, y);\n }\n _drawImage(ex, x, y) {\n var _a;\n let color = _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Black;\n if (this.font instanceof _Font__WEBPACK_IMPORTED_MODULE_1__.Font) {\n color = (_a = this.color) !== null && _a !== void 0 ? _a : this.font.color;\n }\n const { width, height } = this.font.measureText(this._text, this.maxWidth);\n this._textWidth = width;\n this._textHeight = height;\n this.font.render(ex, this._text, color, x, y, this.maxWidth);\n if (this.font.showDebug) {\n ex.debug.drawRect(x - width, y - height, width * 2, height * 2);\n if (this.maxWidth != null) {\n ex.debug.drawRect(x, y, this.maxWidth, this.height, {\n color: _Color__WEBPACK_IMPORTED_MODULE_2__.Color.Yellow\n });\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/TiledAnimation.ts\":\n/*!************************************!*\\\n !*** ./Graphics/TiledAnimation.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TiledAnimation: () => (/* binding */ TiledAnimation)\n/* harmony export */ });\n/* harmony import */ var _Sprite__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Sprite */ \"./Graphics/Sprite.ts\");\n/* harmony import */ var _Animation__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Animation */ \"./Graphics/Animation.ts\");\n/* harmony import */ var _TiledSprite__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./TiledSprite */ \"./Graphics/TiledSprite.ts\");\n/* harmony import */ var _Util_Watch__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Util/Watch */ \"./Util/Watch.ts\");\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Future */ \"./Util/Future.ts\");\n\n\n\n\n\nclass TiledAnimation extends _Animation__WEBPACK_IMPORTED_MODULE_0__.Animation {\n constructor(options) {\n super({\n ...options,\n frames: options.animation.frames.slice(),\n strategy: options.animation.strategy,\n frameDuration: options.animation.frameDuration,\n speed: options.animation.speed,\n reverse: options.animation.isReversed\n });\n this._ready = new _Util_Future__WEBPACK_IMPORTED_MODULE_1__.Future();\n this.ready = this._ready.promise;\n this._tiledWidth = 0;\n this._tiledHeight = 0;\n this._sourceView = {};\n this._sourceView = { ...options.sourceView };\n this._tiledWidth = options.width;\n this._tiledHeight = options.height;\n const promises = [];\n for (let i = 0; i < this.frames.length; i++) {\n const graphic = this.frames[i].graphic;\n if (graphic && graphic instanceof _Sprite__WEBPACK_IMPORTED_MODULE_2__.Sprite) {\n const tiledSprite = new _TiledSprite__WEBPACK_IMPORTED_MODULE_3__.TiledSprite({\n image: graphic.image,\n width: options.width,\n height: options.height,\n sourceView: { ...graphic.sourceView },\n wrapping: options.wrapping,\n filtering: options.filtering\n });\n this.frames[i].graphic = tiledSprite;\n // There is a new calc'd sourceView when ready\n tiledSprite.ready.then(() => {\n tiledSprite.sourceView = { ...tiledSprite.sourceView, ...this._sourceView };\n });\n promises.push(tiledSprite.ready);\n }\n }\n Promise.all(promises).then(() => this._ready.resolve());\n }\n static fromAnimation(animation, options) {\n return new TiledAnimation({\n width: animation.width,\n height: animation.height,\n ...options,\n animation\n });\n }\n _updateSourceView() {\n for (let i = 0; i < this.frames.length; i++) {\n const graphic = this.frames[i].graphic;\n if (graphic && graphic instanceof _Sprite__WEBPACK_IMPORTED_MODULE_2__.Sprite) {\n graphic.sourceView = { ...graphic.sourceView, ...this._sourceView };\n }\n }\n }\n get sourceView() {\n return (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_4__.watch)(this._sourceView, () => this._updateSourceView());\n }\n set sourceView(sourceView) {\n this._sourceView = (0,_Util_Watch__WEBPACK_IMPORTED_MODULE_4__.watch)(sourceView, () => this._updateSourceView());\n this._updateSourceView();\n }\n _updateWidthHeight() {\n for (let i = 0; i < this.frames.length; i++) {\n const graphic = this.frames[i].graphic;\n if (graphic && graphic instanceof _Sprite__WEBPACK_IMPORTED_MODULE_2__.Sprite) {\n graphic.sourceView.height = this._tiledHeight || graphic.height;\n graphic.destSize.height = this._tiledHeight || graphic.height;\n graphic.sourceView.width = this._tiledWidth || graphic.width;\n graphic.destSize.width = this._tiledWidth || graphic.width;\n }\n }\n }\n get width() {\n return this._tiledWidth;\n }\n get height() {\n return this._tiledHeight;\n }\n set width(width) {\n this._tiledWidth = width;\n this._updateWidthHeight();\n }\n set height(height) {\n this._tiledHeight = height;\n this._updateWidthHeight();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/TiledSprite.ts\":\n/*!*********************************!*\\\n !*** ./Graphics/TiledSprite.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TiledSprite: () => (/* binding */ TiledSprite)\n/* harmony export */ });\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Future */ \"./Util/Future.ts\");\n/* harmony import */ var _ImageSource__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ImageSource */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Sprite__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Sprite */ \"./Graphics/Sprite.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Wrapping */ \"./Graphics/Wrapping.ts\");\n\n\n\n\nclass TiledSprite extends _Sprite__WEBPACK_IMPORTED_MODULE_0__.Sprite {\n constructor(options) {\n super({\n image: options.image,\n sourceView: options.sourceView,\n destSize: { width: options.width, height: options.height },\n flipHorizontal: options.flipHorizontal,\n flipVertical: options.flipVertical,\n rotation: options.rotation,\n scale: options.scale,\n opacity: options.opacity,\n tint: options.tint,\n origin: options.origin\n });\n this._ready = new _Util_Future__WEBPACK_IMPORTED_MODULE_1__.Future();\n this.ready = this._ready.promise;\n this._options = options;\n if (this.image.isLoaded()) {\n this._applyTiling();\n }\n else {\n this.image.ready.then(() => this._applyTiling());\n }\n }\n static fromSprite(sprite, options) {\n return new TiledSprite({\n sourceView: { ...sprite.sourceView },\n width: sprite.width,\n height: sprite.height,\n ...options,\n image: sprite.image\n });\n }\n _applyTiling() {\n const { width, height, filtering, wrapping } = { ...this._options };\n const spriteCanvas = document.createElement('canvas');\n spriteCanvas.width = this.sourceView.width;\n spriteCanvas.height = this.sourceView.height;\n const spriteCtx = spriteCanvas.getContext('2d');\n // prettier-ignore\n spriteCtx.drawImage(this.image.image, this.sourceView.x, this.sourceView.y, this.sourceView.width, this.sourceView.height, 0, 0, this.sourceView.width, this.sourceView.height);\n // prettier-ignore\n const tiledImageSource = _ImageSource__WEBPACK_IMPORTED_MODULE_2__.ImageSource.fromHtmlCanvasElement(spriteCanvas, {\n wrapping: wrapping !== null && wrapping !== void 0 ? wrapping : _Wrapping__WEBPACK_IMPORTED_MODULE_3__.ImageWrapping.Repeat,\n filtering\n });\n if (width) {\n this.destSize.width = width;\n this.sourceView.width = width;\n }\n if (height) {\n this.destSize.height = height;\n this.sourceView.height = height;\n }\n this.sourceView.x = 0;\n this.sourceView.y = 0;\n this.image = tiledImageSource;\n // this._ready.resolve();\n this.image.ready.then(() => this._ready.resolve());\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/TransformInterpolation.ts\":\n/*!********************************************!*\\\n !*** ./Graphics/TransformInterpolation.ts ***!\n \\********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ blendGlobalTransform: () => (/* binding */ blendGlobalTransform),\n/* harmony export */ blendTransform: () => (/* binding */ blendTransform)\n/* harmony export */ });\n/* harmony import */ var _Math_transform__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Math/transform */ \"./Math/transform.ts\");\n\n/**\n * Blend 2 transforms for interpolation, will interpolate from the context of newTx's parent if it exists\n */\nfunction blendTransform(oldTx, newTx, blend, target) {\n if (oldTx.parent !== newTx.parent) {\n // Caller expects a local transform\n // Adjust old tx to be local to the new parent whatever that is\n const oldTxWithNewParent = oldTx.clone();\n const oldGlobalPos = oldTx.globalPos.clone();\n const oldGlobalScale = oldTx.globalScale.clone();\n const oldGlobalRotation = oldTx.globalRotation;\n oldTxWithNewParent.parent = newTx.parent;\n oldTxWithNewParent.globalPos = oldGlobalPos;\n oldTxWithNewParent.globalScale = oldGlobalScale;\n oldTxWithNewParent.globalRotation = oldGlobalRotation;\n oldTx = oldTxWithNewParent;\n }\n let interpolatedPos = newTx.pos;\n let interpolatedScale = newTx.scale;\n let interpolatedRotation = newTx.rotation;\n interpolatedPos = newTx.pos.scale(blend).add(oldTx.pos.scale(1.0 - blend));\n interpolatedScale = newTx.scale.scale(blend).add(oldTx.scale.scale(1.0 - blend));\n // Rotational lerp https://stackoverflow.com/a/30129248\n const cosine = (1.0 - blend) * Math.cos(oldTx.rotation) + blend * Math.cos(newTx.rotation);\n const sine = (1.0 - blend) * Math.sin(oldTx.rotation) + blend * Math.sin(newTx.rotation);\n interpolatedRotation = Math.atan2(sine, cosine);\n const tx = target !== null && target !== void 0 ? target : new _Math_transform__WEBPACK_IMPORTED_MODULE_0__.Transform();\n tx.setTransform(interpolatedPos, interpolatedRotation, interpolatedScale);\n return tx;\n}\n/**\n *\n */\nfunction blendGlobalTransform(oldTx, newTx, blend, target) {\n let interpolatedPos = newTx.globalPos;\n let interpolatedScale = newTx.globalScale;\n let interpolatedRotation = newTx.globalRotation;\n interpolatedPos = newTx.globalPos.scale(blend).add(oldTx.globalPos.scale(1.0 - blend));\n interpolatedScale = newTx.globalScale.scale(blend).add(oldTx.globalScale.scale(1.0 - blend));\n // Rotational lerp https://stackoverflow.com/a/30129248\n const cosine = (1.0 - blend) * Math.cos(oldTx.globalRotation) + blend * Math.cos(newTx.globalRotation);\n const sine = (1.0 - blend) * Math.sin(oldTx.globalRotation) + blend * Math.sin(newTx.globalRotation);\n interpolatedRotation = Math.atan2(sine, cosine);\n const tx = target !== null && target !== void 0 ? target : new _Math_transform__WEBPACK_IMPORTED_MODULE_0__.Transform();\n tx.setTransform(interpolatedPos, interpolatedRotation, interpolatedScale);\n return tx;\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/Wrapping.ts\":\n/*!******************************!*\\\n !*** ./Graphics/Wrapping.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ImageWrapping: () => (/* binding */ ImageWrapping),\n/* harmony export */ parseImageWrapping: () => (/* binding */ parseImageWrapping)\n/* harmony export */ });\n/**\n * Describes the different image wrapping modes\n */\nvar ImageWrapping;\n(function (ImageWrapping) {\n ImageWrapping[\"Clamp\"] = \"Clamp\";\n ImageWrapping[\"Repeat\"] = \"Repeat\";\n ImageWrapping[\"Mirror\"] = \"Mirror\";\n})(ImageWrapping || (ImageWrapping = {}));\n/**\n *\n */\nfunction parseImageWrapping(val) {\n switch (val) {\n case ImageWrapping.Clamp:\n return ImageWrapping.Clamp;\n case ImageWrapping.Repeat:\n return ImageWrapping.Repeat;\n case ImageWrapping.Mirror:\n return ImageWrapping.Mirror;\n default:\n return ImageWrapping.Clamp;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Graphics/index.ts\":\n/*!***************************!*\\\n !*** ./Graphics/index.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Animation: () => (/* reexport safe */ _Animation__WEBPACK_IMPORTED_MODULE_5__.Animation),\n/* harmony export */ AnimationDirection: () => (/* reexport safe */ _Animation__WEBPACK_IMPORTED_MODULE_5__.AnimationDirection),\n/* harmony export */ AnimationEvents: () => (/* reexport safe */ _Animation__WEBPACK_IMPORTED_MODULE_5__.AnimationEvents),\n/* harmony export */ AnimationStrategy: () => (/* reexport safe */ _Animation__WEBPACK_IMPORTED_MODULE_5__.AnimationStrategy),\n/* harmony export */ BaseAlign: () => (/* reexport safe */ _FontCommon__WEBPACK_IMPORTED_MODULE_17__.BaseAlign),\n/* harmony export */ Canvas: () => (/* reexport safe */ _Canvas__WEBPACK_IMPORTED_MODULE_21__.Canvas),\n/* harmony export */ Circle: () => (/* reexport safe */ _Circle__WEBPACK_IMPORTED_MODULE_13__.Circle),\n/* harmony export */ ColorBlindnessMode: () => (/* reexport safe */ _PostProcessor_ColorBlindnessMode__WEBPACK_IMPORTED_MODULE_31__.ColorBlindnessMode),\n/* harmony export */ ColorBlindnessPostProcessor: () => (/* reexport safe */ _PostProcessor_ColorBlindnessPostProcessor__WEBPACK_IMPORTED_MODULE_32__.ColorBlindnessPostProcessor),\n/* harmony export */ Debug: () => (/* reexport safe */ _Debug__WEBPACK_IMPORTED_MODULE_41__.Debug),\n/* harmony export */ DebugGraphicsComponent: () => (/* reexport safe */ _DebugGraphicsComponent__WEBPACK_IMPORTED_MODULE_8__.DebugGraphicsComponent),\n/* harmony export */ DebugText: () => (/* reexport safe */ _Context_debug_text__WEBPACK_IMPORTED_MODULE_29__.DebugText),\n/* harmony export */ DefaultAntialiasOptions: () => (/* reexport safe */ _Context_ExcaliburGraphicsContext__WEBPACK_IMPORTED_MODULE_25__.DefaultAntialiasOptions),\n/* harmony export */ DefaultPixelArtOptions: () => (/* reexport safe */ _Context_ExcaliburGraphicsContext__WEBPACK_IMPORTED_MODULE_25__.DefaultPixelArtOptions),\n/* harmony export */ Direction: () => (/* reexport safe */ _FontCommon__WEBPACK_IMPORTED_MODULE_17__.Direction),\n/* harmony export */ ExcaliburGraphicsContext2DCanvas: () => (/* reexport safe */ _Context_ExcaliburGraphicsContext2DCanvas__WEBPACK_IMPORTED_MODULE_26__.ExcaliburGraphicsContext2DCanvas),\n/* harmony export */ ExcaliburGraphicsContextWebGL: () => (/* reexport safe */ _Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_27__.ExcaliburGraphicsContextWebGL),\n/* harmony export */ Font: () => (/* reexport safe */ _Font__WEBPACK_IMPORTED_MODULE_18__.Font),\n/* harmony export */ FontCache: () => (/* reexport safe */ _FontCache__WEBPACK_IMPORTED_MODULE_19__.FontCache),\n/* harmony export */ FontStyle: () => (/* reexport safe */ _FontCommon__WEBPACK_IMPORTED_MODULE_17__.FontStyle),\n/* harmony export */ FontUnit: () => (/* reexport safe */ _FontCommon__WEBPACK_IMPORTED_MODULE_17__.FontUnit),\n/* harmony export */ Graphic: () => (/* reexport safe */ _Graphic__WEBPACK_IMPORTED_MODULE_0__.Graphic),\n/* harmony export */ GraphicsComponent: () => (/* reexport safe */ _GraphicsComponent__WEBPACK_IMPORTED_MODULE_7__.GraphicsComponent),\n/* harmony export */ GraphicsGroup: () => (/* reexport safe */ _GraphicsGroup__WEBPACK_IMPORTED_MODULE_3__.GraphicsGroup),\n/* harmony export */ GraphicsSystem: () => (/* reexport safe */ _GraphicsSystem__WEBPACK_IMPORTED_MODULE_9__.GraphicsSystem),\n/* harmony export */ ImageFiltering: () => (/* reexport safe */ _Filtering__WEBPACK_IMPORTED_MODULE_34__.ImageFiltering),\n/* harmony export */ ImageSource: () => (/* reexport safe */ _ImageSource__WEBPACK_IMPORTED_MODULE_4__.ImageSource),\n/* harmony export */ ImageSourceAttributeConstants: () => (/* reexport safe */ _ImageSource__WEBPACK_IMPORTED_MODULE_4__.ImageSourceAttributeConstants),\n/* harmony export */ ImageWrapping: () => (/* reexport safe */ _Wrapping__WEBPACK_IMPORTED_MODULE_35__.ImageWrapping),\n/* harmony export */ Line: () => (/* reexport safe */ _Line__WEBPACK_IMPORTED_MODULE_6__.Line),\n/* harmony export */ Material: () => (/* reexport safe */ _Context_material__WEBPACK_IMPORTED_MODULE_40__.Material),\n/* harmony export */ NineSlice: () => (/* reexport safe */ _NineSlice__WEBPACK_IMPORTED_MODULE_22__.NineSlice),\n/* harmony export */ NineSliceStretch: () => (/* reexport safe */ _NineSlice__WEBPACK_IMPORTED_MODULE_22__.NineSliceStretch),\n/* harmony export */ OffscreenSystem: () => (/* reexport safe */ _OffscreenSystem__WEBPACK_IMPORTED_MODULE_10__.OffscreenSystem),\n/* harmony export */ ParallaxComponent: () => (/* reexport safe */ _ParallaxComponent__WEBPACK_IMPORTED_MODULE_11__.ParallaxComponent),\n/* harmony export */ ParticleRenderer: () => (/* reexport safe */ _Context_particle_renderer_particle_renderer__WEBPACK_IMPORTED_MODULE_28__.ParticleRenderer),\n/* harmony export */ Polygon: () => (/* reexport safe */ _Polygon__WEBPACK_IMPORTED_MODULE_15__.Polygon),\n/* harmony export */ QuadIndexBuffer: () => (/* reexport safe */ _Context_quad_index_buffer__WEBPACK_IMPORTED_MODULE_39__.QuadIndexBuffer),\n/* harmony export */ Raster: () => (/* reexport safe */ _Raster__WEBPACK_IMPORTED_MODULE_12__.Raster),\n/* harmony export */ Rectangle: () => (/* reexport safe */ _Rectangle__WEBPACK_IMPORTED_MODULE_14__.Rectangle),\n/* harmony export */ ScreenShader: () => (/* reexport safe */ _PostProcessor_ScreenShader__WEBPACK_IMPORTED_MODULE_30__.ScreenShader),\n/* harmony export */ Shader: () => (/* reexport safe */ _Context_shader__WEBPACK_IMPORTED_MODULE_36__.Shader),\n/* harmony export */ Sprite: () => (/* reexport safe */ _Sprite__WEBPACK_IMPORTED_MODULE_1__.Sprite),\n/* harmony export */ SpriteFont: () => (/* reexport safe */ _SpriteFont__WEBPACK_IMPORTED_MODULE_20__.SpriteFont),\n/* harmony export */ SpriteSheet: () => (/* reexport safe */ _SpriteSheet__WEBPACK_IMPORTED_MODULE_2__.SpriteSheet),\n/* harmony export */ Text: () => (/* reexport safe */ _Text__WEBPACK_IMPORTED_MODULE_16__.Text),\n/* harmony export */ TextAlign: () => (/* reexport safe */ _FontCommon__WEBPACK_IMPORTED_MODULE_17__.TextAlign),\n/* harmony export */ TextureLoader: () => (/* reexport safe */ _Context_texture_loader__WEBPACK_IMPORTED_MODULE_33__.TextureLoader),\n/* harmony export */ TiledAnimation: () => (/* reexport safe */ _TiledAnimation__WEBPACK_IMPORTED_MODULE_24__.TiledAnimation),\n/* harmony export */ TiledSprite: () => (/* reexport safe */ _TiledSprite__WEBPACK_IMPORTED_MODULE_23__.TiledSprite),\n/* harmony export */ VertexBuffer: () => (/* reexport safe */ _Context_vertex_buffer__WEBPACK_IMPORTED_MODULE_37__.VertexBuffer),\n/* harmony export */ VertexLayout: () => (/* reexport safe */ _Context_vertex_layout__WEBPACK_IMPORTED_MODULE_38__.VertexLayout),\n/* harmony export */ hasGraphicsTick: () => (/* reexport safe */ _GraphicsComponent__WEBPACK_IMPORTED_MODULE_7__.hasGraphicsTick),\n/* harmony export */ parseImageFiltering: () => (/* reexport safe */ _Filtering__WEBPACK_IMPORTED_MODULE_34__.parseImageFiltering),\n/* harmony export */ parseImageWrapping: () => (/* reexport safe */ _Wrapping__WEBPACK_IMPORTED_MODULE_35__.parseImageWrapping),\n/* harmony export */ pixelSnapEpsilon: () => (/* reexport safe */ _Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_27__.pixelSnapEpsilon),\n/* harmony export */ webgl: () => (/* reexport module object */ _Context_webgl_util__WEBPACK_IMPORTED_MODULE_42__)\n/* harmony export */ });\n/* harmony import */ var _Graphic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Graphic */ \"./Graphics/Graphic.ts\");\n/* harmony import */ var _Sprite__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Sprite */ \"./Graphics/Sprite.ts\");\n/* harmony import */ var _SpriteSheet__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./SpriteSheet */ \"./Graphics/SpriteSheet.ts\");\n/* harmony import */ var _GraphicsGroup__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./GraphicsGroup */ \"./Graphics/GraphicsGroup.ts\");\n/* harmony import */ var _ImageSource__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./ImageSource */ \"./Graphics/ImageSource.ts\");\n/* harmony import */ var _Animation__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Animation */ \"./Graphics/Animation.ts\");\n/* harmony import */ var _Line__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Line */ \"./Graphics/Line.ts\");\n/* harmony import */ var _GraphicsComponent__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _DebugGraphicsComponent__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./DebugGraphicsComponent */ \"./Graphics/DebugGraphicsComponent.ts\");\n/* harmony import */ var _GraphicsSystem__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./GraphicsSystem */ \"./Graphics/GraphicsSystem.ts\");\n/* harmony import */ var _OffscreenSystem__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./OffscreenSystem */ \"./Graphics/OffscreenSystem.ts\");\n/* harmony import */ var _ParallaxComponent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./ParallaxComponent */ \"./Graphics/ParallaxComponent.ts\");\n/* harmony import */ var _Raster__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Raster */ \"./Graphics/Raster.ts\");\n/* harmony import */ var _Circle__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Circle */ \"./Graphics/Circle.ts\");\n/* harmony import */ var _Rectangle__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Rectangle */ \"./Graphics/Rectangle.ts\");\n/* harmony import */ var _Polygon__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Polygon */ \"./Graphics/Polygon.ts\");\n/* harmony import */ var _Text__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Text */ \"./Graphics/Text.ts\");\n/* harmony import */ var _FontCommon__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./FontCommon */ \"./Graphics/FontCommon.ts\");\n/* harmony import */ var _Font__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Font */ \"./Graphics/Font.ts\");\n/* harmony import */ var _FontCache__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./FontCache */ \"./Graphics/FontCache.ts\");\n/* harmony import */ var _SpriteFont__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./SpriteFont */ \"./Graphics/SpriteFont.ts\");\n/* harmony import */ var _Canvas__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./Canvas */ \"./Graphics/Canvas.ts\");\n/* harmony import */ var _NineSlice__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./NineSlice */ \"./Graphics/NineSlice.ts\");\n/* harmony import */ var _TiledSprite__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./TiledSprite */ \"./Graphics/TiledSprite.ts\");\n/* harmony import */ var _TiledAnimation__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./TiledAnimation */ \"./Graphics/TiledAnimation.ts\");\n/* harmony import */ var _Context_ExcaliburGraphicsContext__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./Context/ExcaliburGraphicsContext */ \"./Graphics/Context/ExcaliburGraphicsContext.ts\");\n/* harmony import */ var _Context_ExcaliburGraphicsContext2DCanvas__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./Context/ExcaliburGraphicsContext2DCanvas */ \"./Graphics/Context/ExcaliburGraphicsContext2DCanvas.ts\");\n/* harmony import */ var _Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./Context/ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _Context_particle_renderer_particle_renderer__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./Context/particle-renderer/particle-renderer */ \"./Graphics/Context/particle-renderer/particle-renderer.ts\");\n/* harmony import */ var _Context_debug_text__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./Context/debug-text */ \"./Graphics/Context/debug-text.ts\");\n/* harmony import */ var _PostProcessor_ScreenShader__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./PostProcessor/ScreenShader */ \"./Graphics/PostProcessor/ScreenShader.ts\");\n/* harmony import */ var _PostProcessor_ColorBlindnessMode__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./PostProcessor/ColorBlindnessMode */ \"./Graphics/PostProcessor/ColorBlindnessMode.ts\");\n/* harmony import */ var _PostProcessor_ColorBlindnessPostProcessor__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./PostProcessor/ColorBlindnessPostProcessor */ \"./Graphics/PostProcessor/ColorBlindnessPostProcessor.ts\");\n/* harmony import */ var _Context_texture_loader__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./Context/texture-loader */ \"./Graphics/Context/texture-loader.ts\");\n/* harmony import */ var _Filtering__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./Filtering */ \"./Graphics/Filtering.ts\");\n/* harmony import */ var _Wrapping__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./Wrapping */ \"./Graphics/Wrapping.ts\");\n/* harmony import */ var _Context_shader__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./Context/shader */ \"./Graphics/Context/shader.ts\");\n/* harmony import */ var _Context_vertex_buffer__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./Context/vertex-buffer */ \"./Graphics/Context/vertex-buffer.ts\");\n/* harmony import */ var _Context_vertex_layout__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./Context/vertex-layout */ \"./Graphics/Context/vertex-layout.ts\");\n/* harmony import */ var _Context_quad_index_buffer__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./Context/quad-index-buffer */ \"./Graphics/Context/quad-index-buffer.ts\");\n/* harmony import */ var _Context_material__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./Context/material */ \"./Graphics/Context/material.ts\");\n/* harmony import */ var _Debug__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ./Debug */ \"./Graphics/Debug.ts\");\n/* harmony import */ var _Context_webgl_util__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ./Context/webgl-util */ \"./Graphics/Context/webgl-util.ts\");\n// Graphics\n\n\n\n\n\n\n\n// Graphics ECS\n\n\n\n\n\n// Raster graphics\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// TODO DELETEME\n\n\n// Post Processor\n\n\n\n\n\n\n\n// Rendering\n\n\n\n\n\n\n// Debug\n\n// Util\n\n\n\n\n/***/ }),\n\n/***/ \"./Id.ts\":\n/*!***************!*\\\n !*** ./Id.ts ***!\n \\***************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ createId: () => (/* binding */ createId)\n/* harmony export */ });\n/**\n * Create a branded ID type from a number\n */\nfunction createId(type, value) {\n return { type, value };\n}\n\n\n/***/ }),\n\n/***/ \"./Input/Gamepad.ts\":\n/*!**************************!*\\\n !*** ./Input/Gamepad.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Axes: () => (/* binding */ Axes),\n/* harmony export */ Buttons: () => (/* binding */ Buttons),\n/* harmony export */ Gamepad: () => (/* binding */ Gamepad),\n/* harmony export */ GamepadEvents: () => (/* binding */ GamepadEvents),\n/* harmony export */ Gamepads: () => (/* binding */ Gamepads)\n/* harmony export */ });\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n\n\nconst GamepadEvents = {\n GamepadConnect: 'connect',\n GamepadDisconnect: 'disconnect',\n GamepadButton: 'button',\n GamepadAxis: 'axis'\n};\n/**\n * Excalibur leverages the HTML5 Gamepad API [where it is supported](http://caniuse.com/#feat=gamepad)\n * to provide controller support for your games.\n */\nclass Gamepads {\n constructor() {\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n /**\n * Whether or not to poll for Gamepad input (default: `false`)\n */\n this.enabled = false;\n /**\n * Whether or not Gamepad API is supported\n */\n this.supported = !!navigator.getGamepads;\n this._gamePadTimeStamps = [0, 0, 0, 0];\n this._oldPads = [];\n this._pads = [];\n this._initSuccess = false;\n this._navigator = navigator;\n this._minimumConfiguration = null;\n this._enabled = true;\n }\n init() {\n if (!this.supported) {\n return;\n }\n if (this._initSuccess) {\n return;\n }\n // In Chrome, this will return 4 undefined items until a button is pressed\n // In FF, this will not return any items until a button is pressed\n this._oldPads = this._clonePads(this._navigator.getGamepads());\n if (this._oldPads.length && this._oldPads[0]) {\n this._initSuccess = true;\n }\n }\n toggleEnabled(enabled) {\n this._enabled = enabled;\n }\n /**\n * Sets the minimum gamepad configuration, for example {axis: 4, buttons: 4} means\n * this game requires at minimum 4 axis inputs and 4 buttons, this is not restrictive\n * all other controllers with more axis or buttons are valid as well. If no minimum\n * configuration is set all pads are valid.\n */\n setMinimumGamepadConfiguration(config) {\n this._enableAndUpdate(); // if config is used, implicitly enable\n this._minimumConfiguration = config;\n }\n /**\n * When implicitly enabled, set the enabled flag and run an update so information is updated\n */\n _enableAndUpdate() {\n if (!this.enabled) {\n this.enabled = true;\n this.update();\n }\n }\n /**\n * Checks a navigator gamepad against the minimum configuration if present.\n */\n _isGamepadValid(pad) {\n if (!this._minimumConfiguration) {\n return true;\n }\n if (!pad) {\n return false;\n }\n const axesLength = pad.axes.filter((value) => {\n return typeof value !== undefined;\n }).length;\n const buttonLength = pad.buttons.filter((value) => {\n return typeof value !== undefined;\n }).length;\n return axesLength >= this._minimumConfiguration.axis && buttonLength >= this._minimumConfiguration.buttons && pad.connected;\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n this._enableAndUpdate(); // implicitly enable\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this._enableAndUpdate(); // implicitly enable\n this.events.off(eventName, handler);\n }\n /**\n * Updates Gamepad state and publishes Gamepad events\n */\n update() {\n if (!this.enabled || !this.supported) {\n return;\n }\n if (!this._enabled) {\n return;\n }\n this.init();\n const gamepads = this._navigator.getGamepads();\n for (let i = 0; i < gamepads.length; i++) {\n if (!gamepads[i]) {\n const gamepad = this.at(i);\n // If was connected, but now isn't emit the disconnect event\n if (gamepad.connected) {\n this.events.emit('disconnect', new _Events__WEBPACK_IMPORTED_MODULE_1__.GamepadDisconnectEvent(i, gamepad));\n }\n // Reset connection status\n gamepad.connected = false;\n continue;\n }\n else {\n if (!this.at(i).connected && this._isGamepadValid(gamepads[i])) {\n this.events.emit('connect', new _Events__WEBPACK_IMPORTED_MODULE_1__.GamepadConnectEvent(i, this.at(i)));\n }\n // Set connection status\n this.at(i).connected = true;\n }\n this.at(i).update();\n // Only supported in Chrome\n if (gamepads[i].timestamp && gamepads[i].timestamp === this._gamePadTimeStamps[i]) {\n continue;\n }\n this._gamePadTimeStamps[i] = gamepads[i].timestamp;\n // Add reference to navigator gamepad\n this.at(i).navigatorGamepad = gamepads[i];\n // Buttons\n let b, bi, a, ai, value;\n for (b in Buttons) {\n bi = Buttons[b];\n if (typeof bi === 'number') {\n if (gamepads[i].buttons[bi]) {\n value = gamepads[i].buttons[bi].value;\n if (value !== this._oldPads[i].getButton(bi)) {\n if (gamepads[i].buttons[bi].pressed) {\n this.at(i).updateButton(bi, value);\n this.at(i).events.emit('button', new _Events__WEBPACK_IMPORTED_MODULE_1__.GamepadButtonEvent(bi, value, this.at(i)));\n }\n else {\n this.at(i).updateButton(bi, 0);\n }\n }\n }\n }\n }\n // Axes\n for (a in Axes) {\n ai = Axes[a];\n if (typeof ai === 'number') {\n value = gamepads[i].axes[ai];\n if (value !== this._oldPads[i].getAxes(ai)) {\n this.at(i).updateAxes(ai, value);\n this.at(i).events.emit('axis', new _Events__WEBPACK_IMPORTED_MODULE_1__.GamepadAxisEvent(ai, value, this.at(i)));\n }\n }\n }\n this._oldPads[i] = this._clonePad(gamepads[i]);\n }\n }\n /**\n * Safely retrieves a Gamepad at a specific index and creates one if it doesn't yet exist\n */\n at(index) {\n this._enableAndUpdate(); // implicitly enable gamepads when at() is called\n if (index >= this._pads.length) {\n // Ensure there is a pad to retrieve\n for (let i = this._pads.length - 1, max = index; i < max; i++) {\n this._pads.push(new Gamepad());\n this._oldPads.push(new Gamepad());\n }\n }\n return this._pads[index];\n }\n /**\n * Returns a list of all valid gamepads that meet the minimum configuration requirement.\n */\n getValidGamepads() {\n this._enableAndUpdate();\n const result = [];\n for (let i = 0; i < this._pads.length; i++) {\n if (this._isGamepadValid(this.at(i).navigatorGamepad) && this.at(i).connected) {\n result.push(this.at(i));\n }\n }\n return result;\n }\n /**\n * Gets the number of connected gamepads\n */\n count() {\n return this._pads.filter((p) => p.connected).length;\n }\n _clonePads(pads) {\n const arr = [];\n for (let i = 0, len = pads.length; i < len; i++) {\n arr.push(this._clonePad(pads[i]));\n }\n return arr;\n }\n /**\n * Fastest way to clone a known object is to do it yourself\n */\n _clonePad(pad) {\n let i, len;\n const clonedPad = new Gamepad();\n if (!pad) {\n return clonedPad;\n }\n for (i = 0, len = pad.buttons.length; i < len; i++) {\n if (pad.buttons[i]) {\n clonedPad.updateButton(i, pad.buttons[i].value);\n }\n }\n for (i = 0, len = pad.axes.length; i < len; i++) {\n clonedPad.updateAxes(i, pad.axes[i]);\n }\n return clonedPad;\n }\n}\n/**\n * The minimum value an axis has to move before considering it a change\n */\nGamepads.MinAxisMoveThreshold = 0.05;\n/**\n * Gamepad holds state information for a connected controller. See {@apilink Gamepads}\n * for more information on handling controller input.\n */\nclass Gamepad {\n constructor() {\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n this.connected = false;\n this._axes = new Array(4);\n this._buttons = new Array(16);\n this._buttonsUp = new Array(16);\n this._buttonsDown = new Array(16);\n for (let i = 0; i < this._buttons.length; i++) {\n this._buttons[i] = 0;\n }\n for (let i = 0; i < this._axes.length; i++) {\n this._axes[i] = 0;\n }\n }\n update() {\n // Reset buttonsDown and buttonsUp after update is complete\n this._buttonsDown = new Array(16);\n this._buttonsUp = new Array(16);\n }\n /**\n * Whether or not the given button is pressed\n * @deprecated will be removed in v0.28.0. Use isButtonHeld instead\n * @param button The button to query\n * @param threshold The threshold over which the button is considered to be pressed\n */\n isButtonPressed(button, threshold = 1) {\n return this._buttons[button] >= threshold;\n }\n /**\n * Tests if a certain button is held down. This is persisted between frames.\n * @param button The button to query\n * @param threshold The threshold over which the button is considered to be pressed\n */\n isButtonHeld(button, threshold = 1) {\n return this._buttons[button] >= threshold;\n }\n /**\n * Tests if a certain button was just pressed this frame. This is cleared at the end of the update frame.\n * @param button Test whether a button was just pressed\n * @param threshold The threshold over which the button is considered to be pressed\n */\n wasButtonPressed(button, threshold = 1) {\n return this._buttonsDown[button] >= threshold;\n }\n /**\n * Tests if a certain button was just released this frame. This is cleared at the end of the update frame.\n * @param button Test whether a button was just released\n */\n wasButtonReleased(button) {\n return Boolean(this._buttonsUp[button]);\n }\n /**\n * Gets the given button value between 0 and 1\n */\n getButton(button) {\n return this._buttons[button];\n }\n /**\n * Gets the given axis value between -1 and 1. Values below\n * {@apilink MinAxisMoveThreshold} are considered 0.\n */\n getAxes(axes) {\n const value = this._axes[axes];\n if (Math.abs(value) < Gamepads.MinAxisMoveThreshold) {\n return 0;\n }\n else {\n return value;\n }\n }\n updateButton(buttonIndex, value) {\n // button was just released\n if (value === 0 && this._buttons[buttonIndex]) {\n this._buttonsUp[buttonIndex] = 1;\n // button was just pressed\n }\n else {\n this._buttonsDown[buttonIndex] = value;\n }\n this._buttons[buttonIndex] = value;\n }\n updateAxes(axesIndex, value) {\n this._axes[axesIndex] = value;\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n}\n/**\n * Gamepad Buttons enumeration\n */\nvar Buttons;\n(function (Buttons) {\n /**\n * Face 1 button (e.g. A)\n */\n Buttons[Buttons[\"Face1\"] = 0] = \"Face1\";\n /**\n * Face 2 button (e.g. B)\n */\n Buttons[Buttons[\"Face2\"] = 1] = \"Face2\";\n /**\n * Face 3 button (e.g. X)\n */\n Buttons[Buttons[\"Face3\"] = 2] = \"Face3\";\n /**\n * Face 4 button (e.g. Y)\n */\n Buttons[Buttons[\"Face4\"] = 3] = \"Face4\";\n /**\n * Left bumper button\n */\n Buttons[Buttons[\"LeftBumper\"] = 4] = \"LeftBumper\";\n /**\n * Right bumper button\n */\n Buttons[Buttons[\"RightBumper\"] = 5] = \"RightBumper\";\n /**\n * Left trigger button\n */\n Buttons[Buttons[\"LeftTrigger\"] = 6] = \"LeftTrigger\";\n /**\n * Right trigger button\n */\n Buttons[Buttons[\"RightTrigger\"] = 7] = \"RightTrigger\";\n /**\n * Select button\n */\n Buttons[Buttons[\"Select\"] = 8] = \"Select\";\n /**\n * Start button\n */\n Buttons[Buttons[\"Start\"] = 9] = \"Start\";\n /**\n * Left analog stick press (e.g. L3)\n */\n Buttons[Buttons[\"LeftStick\"] = 10] = \"LeftStick\";\n /**\n * Right analog stick press (e.g. R3)\n */\n Buttons[Buttons[\"RightStick\"] = 11] = \"RightStick\";\n /**\n * D-pad up\n */\n Buttons[Buttons[\"DpadUp\"] = 12] = \"DpadUp\";\n /**\n * D-pad down\n */\n Buttons[Buttons[\"DpadDown\"] = 13] = \"DpadDown\";\n /**\n * D-pad left\n */\n Buttons[Buttons[\"DpadLeft\"] = 14] = \"DpadLeft\";\n /**\n * D-pad right\n */\n Buttons[Buttons[\"DpadRight\"] = 15] = \"DpadRight\";\n})(Buttons || (Buttons = {}));\n/**\n * Gamepad Axes enumeration\n */\nvar Axes;\n(function (Axes) {\n /**\n * Left analogue stick X direction\n */\n Axes[Axes[\"LeftStickX\"] = 0] = \"LeftStickX\";\n /**\n * Left analogue stick Y direction\n */\n Axes[Axes[\"LeftStickY\"] = 1] = \"LeftStickY\";\n /**\n * Right analogue stick X direction\n */\n Axes[Axes[\"RightStickX\"] = 2] = \"RightStickX\";\n /**\n * Right analogue stick Y direction\n */\n Axes[Axes[\"RightStickY\"] = 3] = \"RightStickY\";\n})(Axes || (Axes = {}));\n\n\n/***/ }),\n\n/***/ \"./Input/InputHost.ts\":\n/*!****************************!*\\\n !*** ./Input/InputHost.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ InputHost: () => (/* binding */ InputHost)\n/* harmony export */ });\n/* harmony import */ var _Gamepad__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Gamepad */ \"./Input/Gamepad.ts\");\n/* harmony import */ var _InputMapper__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./InputMapper */ \"./Input/InputMapper.ts\");\n/* harmony import */ var _Keyboard__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Keyboard */ \"./Input/Keyboard.ts\");\n/* harmony import */ var _PointerEventReceiver__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./PointerEventReceiver */ \"./Input/PointerEventReceiver.ts\");\n\n\n\n\nclass InputHost {\n constructor(options) {\n this._enabled = true;\n const { pointerTarget, grabWindowFocus, engine } = options;\n this.keyboard = new _Keyboard__WEBPACK_IMPORTED_MODULE_0__.Keyboard();\n this.pointers = new _PointerEventReceiver__WEBPACK_IMPORTED_MODULE_1__.PointerEventReceiver(pointerTarget, engine);\n this.gamepads = new _Gamepad__WEBPACK_IMPORTED_MODULE_2__.Gamepads();\n this.keyboard.init({ grabWindowFocus });\n this.pointers.init({ grabWindowFocus });\n this.gamepads.init();\n this.inputMapper = new _InputMapper__WEBPACK_IMPORTED_MODULE_3__.InputMapper({\n keyboard: this.keyboard,\n pointers: this.pointers,\n gamepads: this.gamepads\n });\n }\n get enabled() {\n return this._enabled;\n }\n toggleEnabled(enabled) {\n this._enabled = enabled;\n this.keyboard.toggleEnabled(this._enabled);\n this.pointers.toggleEnabled(this._enabled);\n this.gamepads.toggleEnabled(this._enabled);\n }\n update() {\n if (this._enabled) {\n this.inputMapper.execute();\n this.keyboard.update();\n this.gamepads.update();\n }\n }\n clear() {\n this.keyboard.clear();\n this.pointers.clear();\n // this.gamepads.clear();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Input/InputMapper.ts\":\n/*!******************************!*\\\n !*** ./Input/InputMapper.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ InputMapper: () => (/* binding */ InputMapper)\n/* harmony export */ });\n/**\n * This allows you to map multiple inputs to specific commands! This is especially useful when\n * you need to allow multiple input sources to control a specific action.\n */\nclass InputMapper {\n constructor(inputs) {\n this.inputs = inputs;\n this._handlers = new Map();\n }\n /**\n * Executes the input map, called internally by Excalibur\n */\n execute() {\n for (const [input, command] of this._handlers.entries()) {\n const results = input(this.inputs);\n if (results) {\n command(results);\n }\n }\n }\n /**\n * This allows you to map multiple inputs to specific commands! This is useful\n *\n * The inputHandler should return a truthy value if you wish the commandHandler to fire.\n *\n * Example:\n * ```typescript\n * const moveRight = (amount: number) => { actor.vel.x = 100 * amount }\n * const moveLeft = (amount: number) => { actor.vel.x = -100 * amount }\n * const moveUp = (amount: number) => { actor.vel.y = -100 * amount }\n * const moveDown = (amount: number) => { actor.vel.y = 100 * amount }\n *\n * engine.inputMapper.on(({keyboard}) => keyboard.isHeld(ex.Keys.ArrowRight) ? 1 : 0, moveRight);\n * engine.inputMapper.on(({gamepads}) => gamepads.at(0).isButtonPressed(ex.Buttons.DpadRight) ? 1 : 0, moveRight);\n * engine.inputMapper.on(({gamepads}) => gamepads.at(0).getAxes(ex.Axes.LeftStickX) > 0 ?\n * gamepads.at(0).getAxes(ex.Axes.LeftStickX) : 0, moveRight);\n * ```\n * @param inputHandler\n * @param commandHandler\n */\n on(inputHandler, commandHandler) {\n this._handlers.set(inputHandler, commandHandler);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Input/Keyboard.ts\":\n/*!***************************!*\\\n !*** ./Input/Keyboard.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ KeyEvent: () => (/* binding */ KeyEvent),\n/* harmony export */ KeyEvents: () => (/* binding */ KeyEvents),\n/* harmony export */ Keyboard: () => (/* binding */ Keyboard),\n/* harmony export */ Keys: () => (/* binding */ Keys)\n/* harmony export */ });\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _Util_IFrame__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Util/IFrame */ \"./Util/IFrame.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n\n/**\n * Enum representing physical input key codes\n *\n * Spec: https://w3c.github.io/uievents-code/#key-alphanumeric-section\n */\nvar Keys;\n(function (Keys) {\n // Writing System Keys https://w3c.github.io/uievents-code/#key-alphanumeric-writing-system\n Keys[\"Backquote\"] = \"Backquote\";\n Keys[\"Backslash\"] = \"Backslash\";\n Keys[\"BracketLeft\"] = \"BracketLeft\";\n Keys[\"BracketRight\"] = \"BracketRight\";\n Keys[\"Comma\"] = \"Comma\";\n // NUMBERS\n Keys[\"Key0\"] = \"Digit0\";\n Keys[\"Key1\"] = \"Digit1\";\n Keys[\"Key2\"] = \"Digit2\";\n Keys[\"Key3\"] = \"Digit3\";\n Keys[\"Key4\"] = \"Digit4\";\n Keys[\"Key5\"] = \"Digit5\";\n Keys[\"Key6\"] = \"Digit6\";\n Keys[\"Key7\"] = \"Digit7\";\n Keys[\"Key8\"] = \"Digit8\";\n Keys[\"Key9\"] = \"Digit9\";\n Keys[\"Digit0\"] = \"Digit0\";\n Keys[\"Digit1\"] = \"Digit1\";\n Keys[\"Digit2\"] = \"Digit2\";\n Keys[\"Digit3\"] = \"Digit3\";\n Keys[\"Digit4\"] = \"Digit4\";\n Keys[\"Digit5\"] = \"Digit5\";\n Keys[\"Digit6\"] = \"Digit6\";\n Keys[\"Digit7\"] = \"Digit7\";\n Keys[\"Digit8\"] = \"Digit8\";\n Keys[\"Digit9\"] = \"Digit9\";\n Keys[\"Equal\"] = \"Equal\";\n Keys[\"IntlBackslash\"] = \"IntlBackslash\";\n Keys[\"IntlRo\"] = \"IntlRo\";\n Keys[\"IntlYen\"] = \"IntlYen\";\n // LETTERS\n Keys[\"A\"] = \"KeyA\";\n Keys[\"B\"] = \"KeyB\";\n Keys[\"C\"] = \"KeyC\";\n Keys[\"D\"] = \"KeyD\";\n Keys[\"E\"] = \"KeyE\";\n Keys[\"F\"] = \"KeyF\";\n Keys[\"G\"] = \"KeyG\";\n Keys[\"H\"] = \"KeyH\";\n Keys[\"I\"] = \"KeyI\";\n Keys[\"J\"] = \"KeyJ\";\n Keys[\"K\"] = \"KeyK\";\n Keys[\"L\"] = \"KeyL\";\n Keys[\"M\"] = \"KeyM\";\n Keys[\"N\"] = \"KeyN\";\n Keys[\"O\"] = \"KeyO\";\n Keys[\"P\"] = \"KeyP\";\n Keys[\"Q\"] = \"KeyQ\";\n Keys[\"R\"] = \"KeyR\";\n Keys[\"S\"] = \"KeyS\";\n Keys[\"T\"] = \"KeyT\";\n Keys[\"U\"] = \"KeyU\";\n Keys[\"V\"] = \"KeyV\";\n Keys[\"W\"] = \"KeyW\";\n Keys[\"X\"] = \"KeyX\";\n Keys[\"Y\"] = \"KeyY\";\n Keys[\"Z\"] = \"KeyZ\";\n Keys[\"KeyA\"] = \"KeyA\";\n Keys[\"KeyB\"] = \"KeyB\";\n Keys[\"KeyC\"] = \"KeyC\";\n Keys[\"KeyD\"] = \"KeyD\";\n Keys[\"KeyE\"] = \"KeyE\";\n Keys[\"KeyF\"] = \"KeyF\";\n Keys[\"KeyG\"] = \"KeyG\";\n Keys[\"KeyH\"] = \"KeyH\";\n Keys[\"KeyI\"] = \"KeyI\";\n Keys[\"KeyJ\"] = \"KeyJ\";\n Keys[\"KeyK\"] = \"KeyK\";\n Keys[\"KeyL\"] = \"KeyL\";\n Keys[\"KeyM\"] = \"KeyM\";\n Keys[\"KeyN\"] = \"KeyN\";\n Keys[\"KeyO\"] = \"KeyO\";\n Keys[\"KeyP\"] = \"KeyP\";\n Keys[\"KeyQ\"] = \"KeyQ\";\n Keys[\"KeyR\"] = \"KeyR\";\n Keys[\"KeyS\"] = \"KeyS\";\n Keys[\"KeyT\"] = \"KeyT\";\n Keys[\"KeyU\"] = \"KeyU\";\n Keys[\"KeyV\"] = \"KeyV\";\n Keys[\"KeyW\"] = \"KeyW\";\n Keys[\"KeyX\"] = \"KeyX\";\n Keys[\"KeyY\"] = \"KeyY\";\n Keys[\"KeyZ\"] = \"KeyZ\";\n // SYMBOLS\n Keys[\"Minus\"] = \"Minus\";\n Keys[\"Period\"] = \"Period\";\n Keys[\"Quote\"] = \"Quote\";\n Keys[\"Semicolon\"] = \"Semicolon\";\n Keys[\"Slash\"] = \"Slash\";\n // Functional keys https://w3c.github.io/uievents-code/#key-alphanumeric-functional\n Keys[\"AltLeft\"] = \"AltLeft\";\n Keys[\"AltRight\"] = \"AltRight\";\n Keys[\"Alt\"] = \"Alt\";\n Keys[\"AltGraph\"] = \"AltGraph\";\n Keys[\"Backspace\"] = \"Backspace\";\n Keys[\"CapsLock\"] = \"CapsLock\";\n Keys[\"ContextMenu\"] = \"ContextMenu\";\n Keys[\"ControlLeft\"] = \"ControlLeft\";\n Keys[\"ControlRight\"] = \"ControlRight\";\n Keys[\"Enter\"] = \"Enter\";\n Keys[\"MetaLeft\"] = \"MetaLeft\";\n Keys[\"MetaRight\"] = \"MetaRight\";\n Keys[\"ShiftLeft\"] = \"ShiftLeft\";\n Keys[\"ShiftRight\"] = \"ShiftRight\";\n Keys[\"Space\"] = \"Space\";\n Keys[\"Tab\"] = \"Tab\";\n Keys[\"Convert\"] = \"Convert\";\n Keys[\"KanaMode\"] = \"KanaMode\";\n Keys[\"NonConvert\"] = \"NonConvert\";\n // Control Pad https://w3c.github.io/uievents-code/#key-controlpad-section\n Keys[\"Delete\"] = \"Delete\";\n Keys[\"End\"] = \"End\";\n Keys[\"Help\"] = \"Help\";\n Keys[\"Home\"] = \"Home\";\n Keys[\"Insert\"] = \"Insert\";\n Keys[\"PageDown\"] = \"PageDown\";\n Keys[\"PageUp\"] = \"PageUp\";\n // Arrow Pad https://w3c.github.io/uievents-code/#key-arrowpad-section\n Keys[\"Up\"] = \"ArrowUp\";\n Keys[\"Down\"] = \"ArrowDown\";\n Keys[\"Left\"] = \"ArrowLeft\";\n Keys[\"Right\"] = \"ArrowRight\";\n Keys[\"ArrowUp\"] = \"ArrowUp\";\n Keys[\"ArrowDown\"] = \"ArrowDown\";\n Keys[\"ArrowLeft\"] = \"ArrowLeft\";\n Keys[\"ArrowRight\"] = \"ArrowRight\";\n // Numpad Section https://w3c.github.io/uievents-code/#key-numpad-section\n Keys[\"NumLock\"] = \"NumLock\";\n Keys[\"Numpad0\"] = \"Numpad0\";\n Keys[\"Numpad1\"] = \"Numpad1\";\n Keys[\"Numpad2\"] = \"Numpad2\";\n Keys[\"Numpad3\"] = \"Numpad3\";\n Keys[\"Numpad4\"] = \"Numpad4\";\n Keys[\"Numpad5\"] = \"Numpad5\";\n Keys[\"Numpad6\"] = \"Numpad6\";\n Keys[\"Numpad7\"] = \"Numpad7\";\n Keys[\"Numpad8\"] = \"Numpad8\";\n Keys[\"Numpad9\"] = \"Numpad9\";\n Keys[\"Num0\"] = \"Numpad0\";\n Keys[\"Num1\"] = \"Numpad1\";\n Keys[\"Num2\"] = \"Numpad2\";\n Keys[\"Num3\"] = \"Numpad3\";\n Keys[\"Num4\"] = \"Numpad4\";\n Keys[\"Num5\"] = \"Numpad5\";\n Keys[\"Num6\"] = \"Numpad6\";\n Keys[\"Num7\"] = \"Numpad7\";\n Keys[\"Num8\"] = \"Numpad8\";\n Keys[\"Num9\"] = \"Numpad9\";\n Keys[\"NumAdd\"] = \"NumpadAdd\";\n Keys[\"NumpadAdd\"] = \"NumpadAdd\";\n Keys[\"NumDecimal\"] = \"NumpadDecimal\";\n Keys[\"NumpadDecimal\"] = \"NumpadDecimal\";\n Keys[\"NumDivide\"] = \"NumpadDivide\";\n Keys[\"NumpadDivide\"] = \"NumpadDivide\";\n Keys[\"NumEnter\"] = \"NumpadEnter\";\n Keys[\"NumpadEnter\"] = \"NumpadEnter\";\n Keys[\"NumMultiply\"] = \"NumpadMultiply\";\n Keys[\"NumpadMultiply\"] = \"NumpadMultiply\";\n Keys[\"NumSubtract\"] = \"NumpadSubtract\";\n Keys[\"NumpadSubtract\"] = \"NumpadSubtract\";\n // NumComma = 'NumpadComma', // not x-browser\n // NumpadComma = 'NumpadComma', // not x-browser\n // Function section https://w3c.github.io/uievents-code/#key-function-section\n Keys[\"Esc\"] = \"Escape\";\n Keys[\"Escape\"] = \"Escape\";\n Keys[\"F1\"] = \"F1\";\n Keys[\"F2\"] = \"F2\";\n Keys[\"F3\"] = \"F3\";\n Keys[\"F4\"] = \"F4\";\n Keys[\"F5\"] = \"F5\";\n Keys[\"F6\"] = \"F6\";\n Keys[\"F7\"] = \"F7\";\n Keys[\"F8\"] = \"F8\";\n Keys[\"F9\"] = \"F9\";\n Keys[\"F10\"] = \"F10\";\n Keys[\"F11\"] = \"F11\";\n Keys[\"F12\"] = \"F12\";\n Keys[\"F13\"] = \"F13\";\n Keys[\"F14\"] = \"F14\";\n Keys[\"F15\"] = \"F15\";\n Keys[\"F16\"] = \"F16\";\n Keys[\"F17\"] = \"F17\";\n Keys[\"F18\"] = \"F18\";\n Keys[\"F19\"] = \"F19\";\n Keys[\"F20\"] = \"F20\";\n Keys[\"PrintScreen\"] = \"PrintScreen\";\n Keys[\"ScrollLock\"] = \"ScrollLock\";\n Keys[\"Pause\"] = \"Pause\";\n Keys[\"Unidentified\"] = \"Unidentified\";\n})(Keys || (Keys = {}));\n/**\n * Event thrown on a game object for a key event\n */\nclass KeyEvent extends _Events__WEBPACK_IMPORTED_MODULE_0__.GameEvent {\n /**\n * @param key The key responsible for throwing the event\n * @param value The key's typed value the browser detected\n * @param originalEvent The original keyboard event that Excalibur handled\n */\n constructor(key, value, originalEvent) {\n super();\n this.key = key;\n this.value = value;\n this.originalEvent = originalEvent;\n }\n}\nconst KeyEvents = {\n Press: 'press',\n Hold: 'hold',\n Release: 'release'\n};\n/**\n * Provides keyboard support for Excalibur.\n */\nclass Keyboard {\n constructor() {\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_1__.EventEmitter();\n this._enabled = true;\n /**\n * Keys that are currently held down\n */\n this._keys = [];\n /**\n * Keys up in the current frame\n */\n this._keysUp = [];\n /**\n * Keys down in the current frame\n */\n this._keysDown = [];\n this._releaseAllKeys = (ev) => {\n for (const code of this._keys) {\n const keyEvent = new KeyEvent(code, ev.key, ev);\n this.events.emit('up', keyEvent);\n this.events.emit('release', keyEvent);\n }\n this._keysUp = Array.from(new Set(this._keys.concat(this._keysUp)));\n this._keys.length = 0;\n };\n this._handleKeyDown = (ev) => {\n if (!this._enabled) {\n return;\n }\n // handle macos meta key issue\n // https://github.com/excaliburjs/Excalibur/issues/2608\n if (!ev.metaKey && (this._keys.includes(Keys.MetaLeft) || this._keys.includes(Keys.MetaRight))) {\n this._releaseAllKeys(ev);\n }\n const code = ev.code;\n if (this._keys.indexOf(code) === -1) {\n this._keys.push(code);\n this._keysDown.push(code);\n const keyEvent = new KeyEvent(code, ev.key, ev);\n this.events.emit('down', keyEvent);\n this.events.emit('press', keyEvent);\n }\n };\n this._handleKeyUp = (ev) => {\n if (!this._enabled) {\n return;\n }\n const code = ev.code;\n const key = this._keys.indexOf(code);\n this._keys.splice(key, 1);\n this._keysUp.push(code);\n const keyEvent = new KeyEvent(code, ev.key, ev);\n // alias the old api, we may want to deprecate this in the future\n this.events.emit('up', keyEvent);\n this.events.emit('release', keyEvent);\n // handle macos meta key issue\n // https://github.com/excaliburjs/Excalibur/issues/2608\n if (ev.key === 'Meta') {\n this._releaseAllKeys(ev);\n }\n };\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n /**\n * Initialize Keyboard event listeners\n */\n init(keyboardOptions) {\n let { global } = keyboardOptions;\n const { grabWindowFocus } = keyboardOptions;\n if (!global) {\n if ((0,_Util_IFrame__WEBPACK_IMPORTED_MODULE_2__.isCrossOriginIframe)()) {\n global = window;\n // Workaround for iframes like for itch.io or codesandbox\n // https://www.reddit.com/r/gamemaker/comments/kfs5cs/keyboard_inputs_no_longer_working_in_html5_game/\n // https://forum.gamemaker.io/index.php?threads/solved-keyboard-issue-on-itch-io.87336/\n if (grabWindowFocus) {\n window.focus();\n }\n _Util_Log__WEBPACK_IMPORTED_MODULE_3__.Logger.getInstance().warn('Excalibur might be in a cross-origin iframe, in order to receive keyboard events it must be in focus');\n }\n else {\n global = window.top;\n }\n }\n global.addEventListener('blur', () => {\n this._keys.length = 0; // empties array efficiently\n });\n // key up is on window because canvas cannot have focus\n global.addEventListener('keyup', this._handleKeyUp);\n // key down is on window because canvas cannot have focus\n global.addEventListener('keydown', this._handleKeyDown);\n }\n toggleEnabled(enabled) {\n this._enabled = enabled;\n }\n clear() {\n this._keysDown.length = 0;\n this._keysUp.length = 0;\n this._keys.length = 0;\n }\n update() {\n // Reset keysDown and keysUp after update is complete\n this._keysDown.length = 0;\n this._keysUp.length = 0;\n // Emit synthetic \"hold\" event\n for (let i = 0; i < this._keys.length; i++) {\n this.events.emit('hold', new KeyEvent(this._keys[i]));\n }\n }\n /**\n * Gets list of keys being pressed down\n */\n getKeys() {\n return this._keys;\n }\n /**\n * Tests if a certain key was just pressed this frame. This is cleared at the end of the update frame.\n * @param key Test whether a key was just pressed\n */\n wasPressed(key) {\n if (!this._enabled) {\n return false;\n }\n return this._keysDown.indexOf(key) > -1;\n }\n /**\n * Tests if a certain key is held down. This is persisted between frames.\n * @param key Test whether a key is held down\n */\n isHeld(key) {\n if (!this._enabled) {\n return false;\n }\n return this._keys.indexOf(key) > -1;\n }\n /**\n * Tests if a certain key was just released this frame. This is cleared at the end of the update frame.\n * @param key Test whether a key was just released\n */\n wasReleased(key) {\n if (!this._enabled) {\n return false;\n }\n return this._keysUp.indexOf(key) > -1;\n }\n /**\n * Trigger a manual key event\n * @param type\n * @param key\n * @param character\n */\n triggerEvent(type, key, character) {\n if (type === 'down') {\n this._handleKeyDown(new KeyboardEvent('keydown', {\n code: key,\n key: character !== null && character !== void 0 ? character : null\n }));\n }\n if (type === 'up') {\n this._handleKeyUp(new KeyboardEvent('keyup', {\n code: key,\n key: character !== null && character !== void 0 ? character : null\n }));\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Input/NativePointerButton.ts\":\n/*!**************************************!*\\\n !*** ./Input/NativePointerButton.ts ***!\n \\**************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ NativePointerButton: () => (/* binding */ NativePointerButton)\n/* harmony export */ });\n/**\n * Native browser button enumeration\n */\nvar NativePointerButton;\n(function (NativePointerButton) {\n NativePointerButton[NativePointerButton[\"NoButton\"] = -1] = \"NoButton\";\n NativePointerButton[NativePointerButton[\"Left\"] = 0] = \"Left\";\n NativePointerButton[NativePointerButton[\"Middle\"] = 1] = \"Middle\";\n NativePointerButton[NativePointerButton[\"Right\"] = 2] = \"Right\";\n NativePointerButton[NativePointerButton[\"Unknown\"] = 3] = \"Unknown\";\n})(NativePointerButton || (NativePointerButton = {}));\n\n\n/***/ }),\n\n/***/ \"./Input/PointerAbstraction.ts\":\n/*!*************************************!*\\\n !*** ./Input/PointerAbstraction.ts ***!\n \\*************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerAbstraction: () => (/* binding */ PointerAbstraction)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Math_global_coordinates__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Math/global-coordinates */ \"./Math/global-coordinates.ts\");\n\n\n\nclass PointerAbstraction {\n constructor() {\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n /**\n * The last position on the document this pointer was at. Can be `null` if pointer was never active.\n */\n this.lastPagePos = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n /**\n * The last position on the screen this pointer was at. Can be `null` if pointer was never active.\n */\n this.lastScreenPos = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n /**\n * The last position in the game world coordinates this pointer was at. Can be `null` if pointer was never active.\n */\n this.lastWorldPos = _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n this._onPointerMove = (ev) => {\n this.lastPagePos = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(ev.pagePos.x, ev.pagePos.y);\n this.lastScreenPos = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(ev.screenPos.x, ev.screenPos.y);\n this.lastWorldPos = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(ev.worldPos.x, ev.worldPos.y);\n };\n this._onPointerDown = (ev) => {\n this.lastPagePos = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(ev.pagePos.x, ev.pagePos.y);\n this.lastScreenPos = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(ev.screenPos.x, ev.screenPos.y);\n this.lastWorldPos = new _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector(ev.worldPos.x, ev.worldPos.y);\n };\n this.on('move', this._onPointerMove);\n this.on('down', this._onPointerDown);\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n /**\n * Called internally by excalibur to keep pointers up to date\n * @internal\n * @param engine\n */\n _updateWorldPosition(engine) {\n const coord = _Math_global_coordinates__WEBPACK_IMPORTED_MODULE_2__.GlobalCoordinates.fromPagePosition(this.lastPagePos, engine);\n this.lastScreenPos = coord.screenPos;\n this.lastWorldPos = coord.worldPos;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Input/PointerButton.ts\":\n/*!********************************!*\\\n !*** ./Input/PointerButton.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerButton: () => (/* binding */ PointerButton)\n/* harmony export */ });\n/**\n * The mouse button being pressed.\n */\nvar PointerButton;\n(function (PointerButton) {\n PointerButton[\"Left\"] = \"Left\";\n PointerButton[\"Middle\"] = \"Middle\";\n PointerButton[\"Right\"] = \"Right\";\n PointerButton[\"Unknown\"] = \"Unknown\";\n PointerButton[\"NoButton\"] = \"NoButton\";\n})(PointerButton || (PointerButton = {}));\n\n\n/***/ }),\n\n/***/ \"./Input/PointerComponent.ts\":\n/*!***********************************!*\\\n !*** ./Input/PointerComponent.ts ***!\n \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerComponent: () => (/* binding */ PointerComponent)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Component */ \"./EntityComponentSystem/Component.ts\");\n\n/**\n * Add this component to optionally configure how the pointer\n * system detects pointer events.\n *\n * By default the collider shape is used and graphics bounds is not.\n *\n * If both collider shape and graphics bounds are enabled it will fire events if either or\n * are intersecting the pointer.\n */\nclass PointerComponent extends _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor(options) {\n var _a, _b;\n super();\n /**\n * Use any existing Collider component geometry for pointer events. This is useful if you want\n * user pointer events only to trigger on the same collision geometry used in the collider component\n * for collision resolution. Default is `true`.\n */\n this.useColliderShape = true;\n /**\n * Use any existing Graphics component bounds for pointers. This is useful if you want the axis aligned\n * bounds around the graphic to trigger pointer events. Default is `true`.\n */\n this.useGraphicsBounds = true;\n this.useColliderShape = (_a = options === null || options === void 0 ? void 0 : options.useColliderShape) !== null && _a !== void 0 ? _a : this.useColliderShape;\n this.useGraphicsBounds = (_b = options === null || options === void 0 ? void 0 : options.useGraphicsBounds) !== null && _b !== void 0 ? _b : this.useGraphicsBounds;\n this.localBounds = options === null || options === void 0 ? void 0 : options.localBounds;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Input/PointerEvent.ts\":\n/*!*******************************!*\\\n !*** ./Input/PointerEvent.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerEvent: () => (/* binding */ PointerEvent)\n/* harmony export */ });\nclass PointerEvent {\n cancel() {\n this.active = false;\n }\n get pagePos() {\n return this.coordinates.pagePos;\n }\n get screenPos() {\n return this.coordinates.screenPos;\n }\n get worldPos() {\n return this.coordinates.worldPos;\n }\n constructor(type, pointerId, button, pointerType, coordinates, nativeEvent) {\n this.type = type;\n this.pointerId = pointerId;\n this.button = button;\n this.pointerType = pointerType;\n this.coordinates = coordinates;\n this.nativeEvent = nativeEvent;\n this.active = true;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Input/PointerEventReceiver.ts\":\n/*!***************************************!*\\\n !*** ./Input/PointerEventReceiver.ts ***!\n \\***************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerEventReceiver: () => (/* binding */ PointerEventReceiver),\n/* harmony export */ PointerEvents: () => (/* binding */ PointerEvents)\n/* harmony export */ });\n/* harmony import */ var _Engine__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Engine */ \"./Engine.ts\");\n/* harmony import */ var _Math_global_coordinates__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Math/global-coordinates */ \"./Math/global-coordinates.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _PointerEvent__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./PointerEvent */ \"./Input/PointerEvent.ts\");\n/* harmony import */ var _WheelEvent__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./WheelEvent */ \"./Input/WheelEvent.ts\");\n/* harmony import */ var _PointerAbstraction__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./PointerAbstraction */ \"./Input/PointerAbstraction.ts\");\n/* harmony import */ var _WheelDeltaMode__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./WheelDeltaMode */ \"./Input/WheelDeltaMode.ts\");\n/* harmony import */ var _PointerSystem__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./PointerSystem */ \"./Input/PointerSystem.ts\");\n/* harmony import */ var _NativePointerButton__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./NativePointerButton */ \"./Input/NativePointerButton.ts\");\n/* harmony import */ var _PointerButton__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./PointerButton */ \"./Input/PointerButton.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../Util/Util */ \"./Util/Util.ts\");\n/* harmony import */ var _PointerType__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./PointerType */ \"./Input/PointerType.ts\");\n/* harmony import */ var _Util_IFrame__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Util/IFrame */ \"./Util/IFrame.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst PointerEvents = {\n Move: 'move',\n Down: 'down',\n Up: 'up',\n Wheel: 'wheel'\n};\n/**\n * Is this event a native touch event?\n */\nfunction isTouchEvent(value) {\n // Guard for Safari <= 13.1\n return globalThis.TouchEvent && value instanceof globalThis.TouchEvent;\n}\n/**\n * Is this event a native pointer event\n */\nfunction isPointerEvent(value) {\n // Guard for Safari <= 13.1\n return globalThis.PointerEvent && value instanceof globalThis.PointerEvent;\n}\n/**\n * The PointerEventProcessor is responsible for collecting all the events from the canvas and transforming them into GlobalCoordinates\n */\nclass PointerEventReceiver {\n constructor(target, engine) {\n this.target = target;\n this.engine = engine;\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n this.primary = new _PointerAbstraction__WEBPACK_IMPORTED_MODULE_1__.PointerAbstraction();\n this._activeNativePointerIdsToNormalized = new Map();\n this.lastFramePointerCoords = new Map();\n this.currentFramePointerCoords = new Map();\n this.currentFramePointerDown = new Map();\n this.lastFramePointerDown = new Map();\n this.currentFrameDown = [];\n this.currentFrameUp = [];\n this.currentFrameMove = [];\n this.currentFrameCancel = [];\n this.currentFrameWheel = [];\n this._enabled = true;\n this._pointers = [this.primary];\n this._boundHandle = this._handle.bind(this);\n this._boundWheel = this._handleWheel.bind(this);\n }\n toggleEnabled(enabled) {\n this._enabled = enabled;\n }\n /**\n * Creates a new PointerEventReceiver with a new target and engine while preserving existing pointer event\n * handlers.\n * @param target\n * @param engine\n */\n recreate(target, engine) {\n const eventReceiver = new PointerEventReceiver(target, engine);\n eventReceiver.primary = this.primary;\n eventReceiver._pointers = this._pointers;\n return eventReceiver;\n }\n /**\n * Locates a specific pointer by id, creates it if it doesn't exist\n * @param index\n */\n at(index) {\n if (index >= this._pointers.length) {\n // Ensure there is a pointer to retrieve\n for (let i = this._pointers.length - 1, max = index; i < max; i++) {\n this._pointers.push(new _PointerAbstraction__WEBPACK_IMPORTED_MODULE_1__.PointerAbstraction());\n }\n }\n return this._pointers[index];\n }\n /**\n * The number of pointers currently being tracked by excalibur\n */\n count() {\n return this._pointers.length;\n }\n /**\n * Is the specified pointer id down this frame\n * @param pointerId\n */\n isDown(pointerId) {\n var _a;\n if (!this._enabled) {\n return false;\n }\n return (_a = this.currentFramePointerDown.get(pointerId)) !== null && _a !== void 0 ? _a : false;\n }\n /**\n * Was the specified pointer id down last frame\n * @param pointerId\n */\n wasDown(pointerId) {\n var _a;\n if (!this._enabled) {\n return false;\n }\n return (_a = this.lastFramePointerDown.get(pointerId)) !== null && _a !== void 0 ? _a : false;\n }\n /**\n * Whether the Pointer is currently dragging.\n */\n isDragging(pointerId) {\n if (!this._enabled) {\n return false;\n }\n return this.isDown(pointerId);\n }\n /**\n * Whether the Pointer just started dragging.\n */\n isDragStart(pointerId) {\n if (!this._enabled) {\n return false;\n }\n return this.isDown(pointerId) && !this.wasDown(pointerId);\n }\n /**\n * Whether the Pointer just ended dragging.\n */\n isDragEnd(pointerId) {\n if (!this._enabled) {\n return false;\n }\n return !this.isDown(pointerId) && this.wasDown(pointerId);\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n /**\n * Called internally by excalibur\n *\n * Updates the current frame pointer info and emits raw pointer events\n *\n * This does not emit events to entities, see PointerSystem\n * @internal\n */\n update() {\n this.lastFramePointerDown = new Map(this.currentFramePointerDown);\n this.lastFramePointerCoords = new Map(this.currentFramePointerCoords);\n for (const event of this.currentFrameDown) {\n if (!event.active) {\n continue;\n }\n this.emit('down', event);\n const pointer = this.at(event.pointerId);\n pointer.emit('down', event);\n this.primary.emit('pointerdown', event);\n }\n for (const event of this.currentFrameUp) {\n if (!event.active) {\n continue;\n }\n this.emit('up', event);\n const pointer = this.at(event.pointerId);\n pointer.emit('up', event);\n }\n for (const event of this.currentFrameMove) {\n if (!event.active) {\n continue;\n }\n this.emit('move', event);\n const pointer = this.at(event.pointerId);\n pointer.emit('move', event);\n }\n for (const event of this.currentFrameCancel) {\n if (!event.active) {\n continue;\n }\n this.emit('cancel', event);\n const pointer = this.at(event.pointerId);\n pointer.emit('cancel', event);\n }\n for (const event of this.currentFrameWheel) {\n if (!event.active) {\n continue;\n }\n this.emit('pointerwheel', event);\n this.emit('wheel', event);\n this.primary.emit('pointerwheel', event);\n this.primary.emit('wheel', event);\n }\n if (this.engine.currentScene.camera.hasChanged()) {\n for (const pointer of this._pointers) {\n pointer._updateWorldPosition(this.engine);\n }\n }\n }\n /**\n * Clears the current frame event and pointer data\n */\n clear() {\n for (const event of this.currentFrameUp) {\n this.currentFramePointerCoords.delete(event.pointerId);\n const ids = this._activeNativePointerIdsToNormalized.entries();\n for (const [native, normalized] of ids) {\n if (normalized === event.pointerId) {\n this._activeNativePointerIdsToNormalized.delete(native);\n }\n }\n }\n this.currentFrameDown.length = 0;\n this.currentFrameUp.length = 0;\n this.currentFrameMove.length = 0;\n this.currentFrameCancel.length = 0;\n this.currentFrameWheel.length = 0;\n }\n /**\n * Initializes the pointer event receiver so that it can start listening to native\n * browser events.\n */\n init(options) {\n var _a;\n if (this.engine.isDisposed()) {\n return;\n }\n // Disabling the touch action avoids browser/platform gestures from firing on the canvas\n // It is important on mobile to have touch action 'none'\n // https://stackoverflow.com/questions/48124372/pointermove-event-not-working-with-touch-why-not\n if (this.target === this.engine.canvas) {\n this.engine.canvas.style.touchAction = 'none';\n }\n else {\n document.body.style.touchAction = 'none';\n }\n // Preferred pointer events\n if (window.PointerEvent) {\n this.target.addEventListener('pointerdown', this._boundHandle);\n this.target.addEventListener('pointerup', this._boundHandle);\n this.target.addEventListener('pointermove', this._boundHandle);\n this.target.addEventListener('pointercancel', this._boundHandle);\n }\n else {\n // Touch Events\n this.target.addEventListener('touchstart', this._boundHandle);\n this.target.addEventListener('touchend', this._boundHandle);\n this.target.addEventListener('touchmove', this._boundHandle);\n this.target.addEventListener('touchcancel', this._boundHandle);\n // Mouse Events\n this.target.addEventListener('mousedown', this._boundHandle);\n this.target.addEventListener('mouseup', this._boundHandle);\n this.target.addEventListener('mousemove', this._boundHandle);\n }\n // MDN MouseWheelEvent\n const wheelOptions = {\n passive: !(this.engine.pageScrollPreventionMode === _Engine__WEBPACK_IMPORTED_MODULE_2__.ScrollPreventionMode.All ||\n this.engine.pageScrollPreventionMode === _Engine__WEBPACK_IMPORTED_MODULE_2__.ScrollPreventionMode.Canvas)\n };\n if ('onwheel' in document.createElement('div')) {\n // Modern Browsers\n this.target.addEventListener('wheel', this._boundWheel, wheelOptions);\n }\n else if (document.onmousewheel !== undefined) {\n // Webkit and IE\n this.target.addEventListener('mousewheel', this._boundWheel, wheelOptions);\n }\n else {\n // Remaining browser and older Firefox\n this.target.addEventListener('MozMousePixelScroll', this._boundWheel, wheelOptions);\n }\n const grabWindowFocus = (_a = options === null || options === void 0 ? void 0 : options.grabWindowFocus) !== null && _a !== void 0 ? _a : true;\n // Handle cross origin iframe\n if (grabWindowFocus && (0,_Util_IFrame__WEBPACK_IMPORTED_MODULE_3__.isCrossOriginIframe)()) {\n const grabFocus = () => {\n window.focus();\n };\n // Preferred pointer events\n if (window.PointerEvent) {\n this.target.addEventListener('pointerdown', grabFocus);\n }\n else {\n // Touch Events\n this.target.addEventListener('touchstart', grabFocus);\n // Mouse Events\n this.target.addEventListener('mousedown', grabFocus);\n }\n }\n }\n detach() {\n // Preferred pointer events\n if (window.PointerEvent) {\n this.target.removeEventListener('pointerdown', this._boundHandle);\n this.target.removeEventListener('pointerup', this._boundHandle);\n this.target.removeEventListener('pointermove', this._boundHandle);\n this.target.removeEventListener('pointercancel', this._boundHandle);\n }\n else {\n // Touch Events\n this.target.removeEventListener('touchstart', this._boundHandle);\n this.target.removeEventListener('touchend', this._boundHandle);\n this.target.removeEventListener('touchmove', this._boundHandle);\n this.target.removeEventListener('touchcancel', this._boundHandle);\n // Mouse Events\n this.target.removeEventListener('mousedown', this._boundHandle);\n this.target.removeEventListener('mouseup', this._boundHandle);\n this.target.removeEventListener('mousemove', this._boundHandle);\n }\n if ('onwheel' in document.createElement('div')) {\n // Modern Browsers\n this.target.removeEventListener('wheel', this._boundWheel);\n }\n else if (document.onmousewheel !== undefined) {\n // Webkit and IE\n this.target.addEventListener('mousewheel', this._boundWheel);\n }\n else {\n // Remaining browser and older Firefox\n this.target.addEventListener('MozMousePixelScroll', this._boundWheel);\n }\n }\n /**\n * Take native pointer id and map it to index in active pointers\n * @param nativePointerId\n */\n _normalizePointerId(nativePointerId) {\n // Add to the the native pointer set id\n this._activeNativePointerIdsToNormalized.set(nativePointerId, -1);\n // Native pointer ids in ascending order\n const currentPointerIds = Array.from(this._activeNativePointerIdsToNormalized.keys()).sort((a, b) => a - b);\n // The index into sorted ids will be the new id, will always have an id\n const id = currentPointerIds.findIndex((p) => p === nativePointerId);\n // Save the mapping so we can reverse it later\n this._activeNativePointerIdsToNormalized.set(nativePointerId, id);\n // ignore pointer because game isn't watching\n return id;\n }\n /**\n * Responsible for handling and parsing pointer events\n */\n _handle(ev) {\n if (!this._enabled) {\n return;\n }\n ev.preventDefault();\n const eventCoords = new Map();\n let button;\n let pointerType;\n if (isTouchEvent(ev)) {\n button = _PointerButton__WEBPACK_IMPORTED_MODULE_4__.PointerButton.Unknown;\n pointerType = _PointerType__WEBPACK_IMPORTED_MODULE_5__.PointerType.Touch;\n // https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent\n for (let i = 0; i < ev.changedTouches.length; i++) {\n const touch = ev.changedTouches[i];\n const coordinates = _Math_global_coordinates__WEBPACK_IMPORTED_MODULE_6__.GlobalCoordinates.fromPagePosition(touch.pageX, touch.pageY, this.engine);\n const nativePointerId = i + 1;\n const pointerId = this._normalizePointerId(nativePointerId);\n this.currentFramePointerCoords.set(pointerId, coordinates);\n eventCoords.set(pointerId, coordinates);\n }\n }\n else {\n button = this._nativeButtonToPointerButton(ev.button);\n pointerType = _PointerType__WEBPACK_IMPORTED_MODULE_5__.PointerType.Mouse;\n const coordinates = _Math_global_coordinates__WEBPACK_IMPORTED_MODULE_6__.GlobalCoordinates.fromPagePosition(ev.pageX, ev.pageY, this.engine);\n let nativePointerId = 1;\n if (isPointerEvent(ev)) {\n nativePointerId = ev.pointerId;\n pointerType = this._stringToPointerType(ev.pointerType);\n }\n const pointerId = this._normalizePointerId(nativePointerId);\n this.currentFramePointerCoords.set(pointerId, coordinates);\n eventCoords.set(pointerId, coordinates);\n }\n for (const [pointerId, coord] of eventCoords.entries()) {\n switch (ev.type) {\n case 'mousedown':\n case 'pointerdown':\n case 'touchstart':\n this.currentFrameDown.push(new _PointerEvent__WEBPACK_IMPORTED_MODULE_7__.PointerEvent('down', pointerId, button, pointerType, coord, ev));\n this.currentFramePointerDown.set(pointerId, true);\n break;\n case 'mouseup':\n case 'pointerup':\n case 'touchend':\n this.currentFrameUp.push(new _PointerEvent__WEBPACK_IMPORTED_MODULE_7__.PointerEvent('up', pointerId, button, pointerType, coord, ev));\n this.currentFramePointerDown.set(pointerId, false);\n break;\n case 'mousemove':\n case 'pointermove':\n case 'touchmove':\n this.currentFrameMove.push(new _PointerEvent__WEBPACK_IMPORTED_MODULE_7__.PointerEvent('move', pointerId, button, pointerType, coord, ev));\n break;\n case 'touchcancel':\n case 'pointercancel':\n this.currentFrameCancel.push(new _PointerEvent__WEBPACK_IMPORTED_MODULE_7__.PointerEvent('cancel', pointerId, button, pointerType, coord, ev));\n break;\n }\n }\n }\n _handleWheel(ev) {\n if (!this._enabled) {\n return;\n }\n // Should we prevent page scroll because of this event\n if (this.engine.pageScrollPreventionMode === _Engine__WEBPACK_IMPORTED_MODULE_2__.ScrollPreventionMode.All ||\n (this.engine.pageScrollPreventionMode === _Engine__WEBPACK_IMPORTED_MODULE_2__.ScrollPreventionMode.Canvas && ev.target === this.engine.canvas)) {\n ev.preventDefault();\n }\n const screen = this.engine.screen.pageToScreenCoordinates((0,_Math_vector__WEBPACK_IMPORTED_MODULE_8__.vec)(ev.pageX, ev.pageY));\n const world = this.engine.screen.screenToWorldCoordinates(screen);\n /**\n * A constant used to normalize wheel events across different browsers\n *\n * This normalization factor is pulled from\n * https://developer.mozilla.org/en-US/docs/Web/Events/wheel#Listening_to_this_event_across_browser\n */\n const ScrollWheelNormalizationFactor = -1 / 40;\n const deltaX = ev.deltaX || ev.wheelDeltaX * ScrollWheelNormalizationFactor || 0;\n const deltaY = ev.deltaY || ev.wheelDeltaY * ScrollWheelNormalizationFactor || ev.wheelDelta * ScrollWheelNormalizationFactor || ev.detail || 0;\n const deltaZ = ev.deltaZ || 0;\n let deltaMode = _WheelDeltaMode__WEBPACK_IMPORTED_MODULE_9__.WheelDeltaMode.Pixel;\n if (ev.deltaMode) {\n if (ev.deltaMode === 1) {\n deltaMode = _WheelDeltaMode__WEBPACK_IMPORTED_MODULE_9__.WheelDeltaMode.Line;\n }\n else if (ev.deltaMode === 2) {\n deltaMode = _WheelDeltaMode__WEBPACK_IMPORTED_MODULE_9__.WheelDeltaMode.Page;\n }\n }\n const we = new _WheelEvent__WEBPACK_IMPORTED_MODULE_10__.WheelEvent(world.x, world.y, ev.pageX, ev.pageY, screen.x, screen.y, 0, deltaX, deltaY, deltaZ, deltaMode, ev);\n this.currentFrameWheel.push(we);\n }\n /**\n * Triggers an excalibur pointer event in a world space pos\n *\n * Useful for testing pointers in excalibur\n * @param type\n * @param pos\n */\n triggerEvent(type, pos) {\n const page = this.engine.screen.worldToPageCoordinates(pos);\n // Send an event to the event receiver\n if (window.PointerEvent) {\n this._handle(new window.PointerEvent('pointer' + type, {\n pointerId: 0,\n clientX: page.x,\n clientY: page.y\n }));\n }\n else {\n // Safari hack\n this._handle(new window.MouseEvent('mouse' + type, {\n clientX: page.x,\n clientY: page.y\n }));\n }\n // Force update pointer system\n const pointerSystem = this.engine.currentScene.world.get(_PointerSystem__WEBPACK_IMPORTED_MODULE_11__.PointerSystem);\n pointerSystem.preupdate(this.engine.currentScene, 1);\n pointerSystem.update(1);\n }\n _nativeButtonToPointerButton(s) {\n switch (s) {\n case _NativePointerButton__WEBPACK_IMPORTED_MODULE_12__.NativePointerButton.NoButton:\n return _PointerButton__WEBPACK_IMPORTED_MODULE_4__.PointerButton.NoButton;\n case _NativePointerButton__WEBPACK_IMPORTED_MODULE_12__.NativePointerButton.Left:\n return _PointerButton__WEBPACK_IMPORTED_MODULE_4__.PointerButton.Left;\n case _NativePointerButton__WEBPACK_IMPORTED_MODULE_12__.NativePointerButton.Middle:\n return _PointerButton__WEBPACK_IMPORTED_MODULE_4__.PointerButton.Middle;\n case _NativePointerButton__WEBPACK_IMPORTED_MODULE_12__.NativePointerButton.Right:\n return _PointerButton__WEBPACK_IMPORTED_MODULE_4__.PointerButton.Right;\n case _NativePointerButton__WEBPACK_IMPORTED_MODULE_12__.NativePointerButton.Unknown:\n return _PointerButton__WEBPACK_IMPORTED_MODULE_4__.PointerButton.Unknown;\n default:\n return (0,_Util_Util__WEBPACK_IMPORTED_MODULE_13__.fail)(s);\n }\n }\n _stringToPointerType(s) {\n switch (s) {\n case 'touch':\n return _PointerType__WEBPACK_IMPORTED_MODULE_5__.PointerType.Touch;\n case 'mouse':\n return _PointerType__WEBPACK_IMPORTED_MODULE_5__.PointerType.Mouse;\n case 'pen':\n return _PointerType__WEBPACK_IMPORTED_MODULE_5__.PointerType.Pen;\n default:\n return _PointerType__WEBPACK_IMPORTED_MODULE_5__.PointerType.Unknown;\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Input/PointerEventsToObjectDispatcher.ts\":\n/*!**************************************************!*\\\n !*** ./Input/PointerEventsToObjectDispatcher.ts ***!\n \\**************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerEventsToObjectDispatcher: () => (/* binding */ PointerEventsToObjectDispatcher),\n/* harmony export */ PointerTargetObjectProxy: () => (/* binding */ PointerTargetObjectProxy)\n/* harmony export */ });\n/* harmony import */ var _Util_RentalPool__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Util/RentalPool */ \"./Util/RentalPool.ts\");\n\n/**\n *\n */\nfunction hasNestedEvents(object) {\n return object && object._dispatchPointerEvents && object._processPointerToObject;\n}\nclass PointerTargetObjectProxy {\n get events() {\n return this.object.events;\n }\n init(object, contains, active) {\n this.object = object;\n this.contains = contains;\n this.active = active;\n }\n}\nclass PointerEventsToObjectDispatcher {\n constructor() {\n this._proxyPool = new _Util_RentalPool__WEBPACK_IMPORTED_MODULE_0__.RentalPool(() => new PointerTargetObjectProxy(), (p) => p, 100);\n this._objectToProxy = new Map();\n this._proxies = [];\n this._lastFrameObjectToPointers = new Map();\n this._currentFrameObjectToPointers = new Map();\n }\n /**\n * Tracks an object to associate with pointers and their events\n * @param object\n * @param contains\n * @param active\n */\n addObject(object, contains, active) {\n const proxy = this._proxyPool.rent(false);\n proxy.init(object, contains, active);\n this._proxies.push(proxy);\n this._objectToProxy.set(object, proxy);\n }\n _getProxy(object) {\n const proxy = this._objectToProxy.get(object);\n if (proxy) {\n return proxy;\n }\n throw new Error('No PointerTargetProxy for object');\n }\n /**\n * Untracks an object associated with pointers and their events\n * @param object\n */\n removeObject(object) {\n const proxy = this._objectToProxy.get(object);\n if (proxy) {\n const index = this._proxies.indexOf(proxy);\n if (index > -1) {\n this._proxies.splice(index, 1);\n }\n this._proxyPool.return(proxy);\n }\n }\n _objectCurrentlyUnderPointer(object, pointerId) {\n return !!(this._currentFrameObjectToPointers.has(object) && this._currentFrameObjectToPointers.get(object).includes(pointerId));\n }\n _objectWasUnderPointer(object, pointerId) {\n return !!(this._lastFrameObjectToPointers.has(object) && this._lastFrameObjectToPointers.get(object).includes(pointerId));\n }\n _entered(object, pointerId) {\n return this._objectCurrentlyUnderPointer(object, pointerId) && !this._lastFrameObjectToPointers.has(object);\n }\n _left(object, pointerId) {\n return !this._currentFrameObjectToPointers.has(object) && this._objectWasUnderPointer(object, pointerId);\n }\n /**\n * Manually associate a pointer id with an object.\n *\n * This assumes you've checked that the pointer is indeed over the object.\n */\n addPointerToObject(object, pointerId) {\n const maybeProxy = this._objectToProxy.get(object);\n if (maybeProxy) {\n this._addPointerToProxy(maybeProxy, pointerId);\n }\n }\n _addPointerToProxy(object, pointerId) {\n if (!this._currentFrameObjectToPointers.has(object)) {\n this._currentFrameObjectToPointers.set(object, [pointerId]);\n return;\n }\n const pointers = this._currentFrameObjectToPointers.get(object);\n this._currentFrameObjectToPointers.set(object, pointers.concat(pointerId));\n }\n /**\n * Dispatches the appropriate pointer events in sortedObject order on tracked objects\n * @param receiver\n * @param sortedObjects\n */\n dispatchEvents(receiver, sortedObjects) {\n const lastFrameEntities = new Set(this._lastFrameObjectToPointers.keys());\n const currentFrameEntities = new Set(this._currentFrameObjectToPointers.keys());\n // Filter preserves z order\n let lastMovePerPointer;\n let lastUpPerPointer;\n let lastDownPerPointer;\n // Dispatch events in proxy z order\n for (let i = 0; i < sortedObjects.length; i++) {\n const object = sortedObjects[i];\n const proxy = this._getProxy(object);\n if (hasNestedEvents(object)) {\n object._dispatchPointerEvents(receiver);\n }\n if (lastFrameEntities.has(proxy) || currentFrameEntities.has(proxy)) {\n lastDownPerPointer = this._processDownAndEmit(receiver, proxy);\n lastUpPerPointer = this._processUpAndEmit(receiver, proxy);\n lastMovePerPointer = this._processMoveAndEmit(receiver, proxy);\n const lastUpDownMoveEvents = [...lastMovePerPointer.values(), ...lastDownPerPointer.values(), ...lastUpPerPointer.values()];\n this._processEnterLeaveAndEmit(receiver, proxy, lastUpDownMoveEvents);\n this._processCancelAndEmit(receiver, proxy);\n this._processWheelAndEmit(receiver, proxy);\n }\n }\n }\n /**\n * Given the tracked objects, update pointer containment given the provided contains()\n * @param receiver\n * @param objects\n */\n processPointerToObject(receiver, objects) {\n // Pre-process find entities under pointers\n for (let objectIndex = 0; objectIndex < objects.length; objectIndex++) {\n const object = objects[objectIndex];\n const proxy = this._getProxy(object);\n if (hasNestedEvents(object)) {\n object._processPointerToObject(receiver);\n }\n for (const [pointerId, pos] of receiver.currentFramePointerCoords.entries()) {\n if (proxy.contains(pos)) {\n this._addPointerToProxy(proxy, pointerId);\n }\n }\n }\n }\n /**\n * Clear current frames pointer-object associations and track last frame pointer-object associations\n */\n clear() {\n this._lastFrameObjectToPointers.clear();\n this._lastFrameObjectToPointers = new Map(this._currentFrameObjectToPointers);\n this._currentFrameObjectToPointers.clear();\n }\n _processDownAndEmit(receiver, object) {\n const lastDownPerPointer = new Map();\n // Loop through down and dispatch to entities\n for (const event of receiver.currentFrameDown) {\n if (event.active && this._objectCurrentlyUnderPointer(object, event.pointerId)) {\n object.events.emit('pointerdown', event);\n if (receiver.isDragStart(event.pointerId)) {\n object.events.emit('pointerdragstart', event);\n }\n }\n lastDownPerPointer.set(event.pointerId, event);\n }\n return lastDownPerPointer;\n }\n _processUpAndEmit(receiver, object) {\n const lastUpPerPointer = new Map();\n // Loop through up and dispatch to entities\n for (const event of receiver.currentFrameUp) {\n if (event.active && this._objectCurrentlyUnderPointer(object, event.pointerId)) {\n object.events.emit('pointerup', event);\n if (receiver.isDragEnd(event.pointerId)) {\n object.events.emit('pointerdragend', event);\n }\n }\n lastUpPerPointer.set(event.pointerId, event);\n }\n return lastUpPerPointer;\n }\n _processMoveAndEmit(receiver, object) {\n const lastMovePerPointer = new Map();\n // Loop through move and dispatch to entities\n for (const event of receiver.currentFrameMove) {\n if (event.active && object.active() && this._objectCurrentlyUnderPointer(object, event.pointerId)) {\n // move\n object.events.emit('pointermove', event);\n if (receiver.isDragging(event.pointerId)) {\n object.events.emit('pointerdragmove', event);\n }\n }\n lastMovePerPointer.set(event.pointerId, event);\n }\n return lastMovePerPointer;\n }\n _processEnterLeaveAndEmit(receiver, object, lastUpDownMoveEvents) {\n // up, down, and move are considered for enter and leave\n for (const event of lastUpDownMoveEvents) {\n // enter\n if (event.active && object.active() && this._entered(object, event.pointerId)) {\n object.events.emit('pointerenter', event);\n if (receiver.isDragging(event.pointerId)) {\n object.events.emit('pointerdragenter', event);\n }\n break;\n }\n if (event.active &&\n object.active() &&\n // leave can happen on move\n (this._left(object, event.pointerId) ||\n // or leave can happen on pointer up\n (this._objectCurrentlyUnderPointer(object, event.pointerId) && event.type === 'up'))) {\n object.events.emit('pointerleave', event);\n if (receiver.isDragging(event.pointerId)) {\n object.events.emit('pointerdragleave', event);\n }\n break;\n }\n }\n }\n _processCancelAndEmit(receiver, object) {\n // cancel\n for (const event of receiver.currentFrameCancel) {\n if (event.active && object.active() && this._objectCurrentlyUnderPointer(object, event.pointerId)) {\n object.events.emit('pointercancel', event);\n }\n }\n }\n _processWheelAndEmit(receiver, object) {\n // wheel\n for (const event of receiver.currentFrameWheel) {\n // Currently the wheel only fires under the primary pointer '0'\n if (event.active && object.active() && this._objectCurrentlyUnderPointer(object, 0)) {\n object.events.emit('pointerwheel', event);\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Input/PointerScope.ts\":\n/*!*******************************!*\\\n !*** ./Input/PointerScope.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerScope: () => (/* binding */ PointerScope)\n/* harmony export */ });\n/**\n * Determines the scope of handling mouse/touch events.\n */\nvar PointerScope;\n(function (PointerScope) {\n /**\n * Handle events on the `canvas` element only. Events originating outside the\n * `canvas` will not be handled.\n */\n PointerScope[\"Canvas\"] = \"Canvas\";\n /**\n * Handles events on the entire document. All events will be handled by Excalibur.\n */\n PointerScope[\"Document\"] = \"Document\";\n})(PointerScope || (PointerScope = {}));\n\n\n/***/ }),\n\n/***/ \"./Input/PointerSystem.ts\":\n/*!********************************!*\\\n !*** ./Input/PointerSystem.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerSystem: () => (/* binding */ PointerSystem)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Priority.ts\");\n/* harmony import */ var _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Graphics/GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _PointerComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./PointerComponent */ \"./Input/PointerComponent.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Math/coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _Collision_Detection_SparseHashGrid__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Collision/Detection/SparseHashGrid */ \"./Collision/Detection/SparseHashGrid.ts\");\n/* harmony import */ var _PointerEventsToObjectDispatcher__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./PointerEventsToObjectDispatcher */ \"./Input/PointerEventsToObjectDispatcher.ts\");\n\n\n\n\n\n\n/**\n * The PointerSystem is responsible for dispatching pointer events to entities\n * that need them.\n *\n * The PointerSystem can be optionally configured by the {@apilink PointerComponent}, by default Entities use\n * the {@apilink Collider}'s shape for pointer events.\n */\nclass PointerSystem extends _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_0__.System {\n constructor(world) {\n super();\n this.world = world;\n this.systemType = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_0__.SystemType.Update;\n this._graphicsHashGrid = new _Collision_Detection_SparseHashGrid__WEBPACK_IMPORTED_MODULE_1__.SparseHashGrid({ size: 100 });\n this._graphics = [];\n this._entityToPointer = new Map();\n this._pointerEventDispatcher = new _PointerEventsToObjectDispatcher__WEBPACK_IMPORTED_MODULE_2__.PointerEventsToObjectDispatcher();\n /**\n * Optionally override component configuration for all entities\n */\n this.overrideUseColliderShape = false;\n /**\n * Optionally override component configuration for all entities\n */\n this.overrideUseGraphicsBounds = false;\n this._sortedTransforms = [];\n this._sortedEntities = [];\n this._zHasChanged = false;\n this._zIndexUpdate = () => {\n this._zHasChanged = true;\n };\n this.query = this.world.query([_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_3__.TransformComponent, _PointerComponent__WEBPACK_IMPORTED_MODULE_4__.PointerComponent]);\n this.query.entityAdded$.subscribe((e) => {\n const tx = e.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_3__.TransformComponent);\n const pointer = e.get(_PointerComponent__WEBPACK_IMPORTED_MODULE_4__.PointerComponent);\n this._pointerEventDispatcher.addObject(e, (pos) => {\n // If pointer bounds defined\n if (pointer && pointer.localBounds) {\n const pointerBounds = pointer.localBounds.transform(tx.get().matrix);\n return pointerBounds.contains(tx.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_5__.CoordPlane.World ? pos.worldPos : pos.screenPos);\n }\n return false;\n }, () => e.isActive);\n this._entityToPointer.set(e, pointer);\n const maybeGfx = e.get(_Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_6__.GraphicsComponent);\n if (maybeGfx) {\n this._graphics.push(maybeGfx);\n this._graphicsHashGrid.track(maybeGfx);\n }\n this._sortedTransforms.push(tx);\n this._sortedEntities.push(tx.owner);\n tx.zIndexChanged$.subscribe(this._zIndexUpdate);\n this._zHasChanged = true;\n });\n this.query.entityRemoved$.subscribe((e) => {\n this._pointerEventDispatcher.removeObject(e);\n const tx = e.get(_EntityComponentSystem__WEBPACK_IMPORTED_MODULE_3__.TransformComponent);\n this._entityToPointer.delete(e);\n const maybeGfx = e.get(_Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_6__.GraphicsComponent);\n if (maybeGfx) {\n const index = this._graphics.indexOf(maybeGfx);\n if (index > -1) {\n this._graphics.splice(index, 1);\n }\n this._graphicsHashGrid.untrack(maybeGfx);\n }\n tx.zIndexChanged$.unsubscribe(this._zIndexUpdate);\n const index = this._sortedTransforms.indexOf(tx);\n if (index > -1) {\n this._sortedTransforms.splice(index, 1);\n this._sortedEntities.splice(index, 1);\n }\n });\n }\n initialize(world, scene) {\n this._engine = scene.engine;\n this._scene = scene;\n }\n preupdate() {\n if (this._scene.camera.hasChanged()) {\n // if the camera has changed we want to force a transform update so pointers can be correctly calc'd\n this._scene.camera.updateTransform(this._scene.camera.pos);\n }\n // event receiver might change per frame\n this._receivers = [this._engine.input.pointers, this._scene.input.pointers];\n this._engineReceiver = this._engine.input.pointers;\n if (this._zHasChanged) {\n this._sortedTransforms.sort((a, b) => {\n return b.z - a.z;\n });\n this._sortedEntities = this._sortedTransforms.map((t) => t.owner);\n this._zHasChanged = false;\n }\n }\n update() {\n // Update graphics\n this._graphicsHashGrid.update(this._graphics);\n // Locate all the pointer/entity mappings\n for (const [pointerId, pos] of this._engineReceiver.currentFramePointerCoords.entries()) {\n const colliders = this._scene.physics.query(pos.worldPos);\n for (let i = 0; i < colliders.length; i++) {\n const collider = colliders[i];\n const maybePointer = this._entityToPointer.get(collider.owner);\n if (maybePointer && (maybePointer.useColliderShape || this.overrideUseColliderShape)) {\n this._pointerEventDispatcher.addPointerToObject(collider.owner, pointerId);\n }\n }\n const graphics = this._graphicsHashGrid.query(pos.worldPos);\n for (let i = 0; i < graphics.length; i++) {\n const graphic = graphics[i];\n const maybePointer = this._entityToPointer.get(graphic.owner);\n if (maybePointer && (maybePointer.useGraphicsBounds || this.overrideUseGraphicsBounds)) {\n this._pointerEventDispatcher.addPointerToObject(graphic.owner, pointerId);\n }\n }\n }\n this._pointerEventDispatcher.processPointerToObject(this._engineReceiver, this._sortedEntities);\n // Dispatch pointer events on entities\n this._pointerEventDispatcher.dispatchEvents(this._engineReceiver, this._sortedEntities);\n // Dispatch pointer events on top level pointers\n this._receivers.forEach((r) => r.update());\n // Clear last frame's events\n this._pointerEventDispatcher.clear();\n this._receivers.forEach((r) => r.clear());\n }\n}\nPointerSystem.priority = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_7__.SystemPriority.Higher;\n\n\n/***/ }),\n\n/***/ \"./Input/PointerType.ts\":\n/*!******************************!*\\\n !*** ./Input/PointerType.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PointerType: () => (/* binding */ PointerType)\n/* harmony export */ });\n/**\n * The type of pointer for a {@apilink PointerEvent}.\n */\nvar PointerType;\n(function (PointerType) {\n PointerType[\"Touch\"] = \"Touch\";\n PointerType[\"Mouse\"] = \"Mouse\";\n PointerType[\"Pen\"] = \"Pen\";\n PointerType[\"Unknown\"] = \"Unknown\";\n})(PointerType || (PointerType = {}));\n\n\n/***/ }),\n\n/***/ \"./Input/WheelDeltaMode.ts\":\n/*!*********************************!*\\\n !*** ./Input/WheelDeltaMode.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ WheelDeltaMode: () => (/* binding */ WheelDeltaMode)\n/* harmony export */ });\nvar WheelDeltaMode;\n(function (WheelDeltaMode) {\n WheelDeltaMode[\"Pixel\"] = \"Pixel\";\n WheelDeltaMode[\"Line\"] = \"Line\";\n WheelDeltaMode[\"Page\"] = \"Page\";\n})(WheelDeltaMode || (WheelDeltaMode = {}));\n\n\n/***/ }),\n\n/***/ \"./Input/WheelEvent.ts\":\n/*!*****************************!*\\\n !*** ./Input/WheelEvent.ts ***!\n \\*****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ WheelEvent: () => (/* binding */ WheelEvent)\n/* harmony export */ });\nclass WheelEvent {\n cancel() {\n this.active = false;\n }\n constructor(x, y, pageX, pageY, screenX, screenY, index, deltaX, deltaY, deltaZ, deltaMode, ev) {\n this.x = x;\n this.y = y;\n this.pageX = pageX;\n this.pageY = pageY;\n this.screenX = screenX;\n this.screenY = screenY;\n this.index = index;\n this.deltaX = deltaX;\n this.deltaY = deltaY;\n this.deltaZ = deltaZ;\n this.deltaMode = deltaMode;\n this.ev = ev;\n this.active = true;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Interfaces/AudioImplementation.ts\":\n/*!*******************************************!*\\\n !*** ./Interfaces/AudioImplementation.ts ***!\n \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ExResponse: () => (/* binding */ ExResponse)\n/* harmony export */ });\nclass ExResponse {\n}\nExResponse.type = {\n any: '',\n blob: 'blob',\n json: 'json',\n text: 'text',\n document: 'document',\n arraybuffer: 'arraybuffer'\n};\n\n\n/***/ }),\n\n/***/ \"./Interfaces/Index.ts\":\n/*!*****************************!*\\\n !*** ./Interfaces/Index.ts ***!\n \\*****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ExResponse: () => (/* reexport safe */ _AudioImplementation__WEBPACK_IMPORTED_MODULE_0__.ExResponse),\n/* harmony export */ hasOnAdd: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.hasOnAdd),\n/* harmony export */ hasOnInitialize: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.hasOnInitialize),\n/* harmony export */ hasOnPostUpdate: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.hasOnPostUpdate),\n/* harmony export */ hasOnPreUpdate: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.hasOnPreUpdate),\n/* harmony export */ hasOnRemove: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.hasOnRemove),\n/* harmony export */ hasPostDraw: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.hasPostDraw),\n/* harmony export */ hasPreDraw: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.hasPreDraw),\n/* harmony export */ has_add: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.has_add),\n/* harmony export */ has_initialize: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.has_initialize),\n/* harmony export */ has_postupdate: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.has_postupdate),\n/* harmony export */ has_preupdate: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.has_preupdate),\n/* harmony export */ has_remove: () => (/* reexport safe */ _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__.has_remove)\n/* harmony export */ });\n/* harmony import */ var _AudioImplementation__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AudioImplementation */ \"./Interfaces/AudioImplementation.ts\");\n/* harmony import */ var _LifecycleEvents__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./LifecycleEvents */ \"./Interfaces/LifecycleEvents.ts\");\n\n\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Interfaces/LifecycleEvents.ts\":\n/*!***************************************!*\\\n !*** ./Interfaces/LifecycleEvents.ts ***!\n \\***************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ hasOnAdd: () => (/* binding */ hasOnAdd),\n/* harmony export */ hasOnInitialize: () => (/* binding */ hasOnInitialize),\n/* harmony export */ hasOnPostUpdate: () => (/* binding */ hasOnPostUpdate),\n/* harmony export */ hasOnPreUpdate: () => (/* binding */ hasOnPreUpdate),\n/* harmony export */ hasOnRemove: () => (/* binding */ hasOnRemove),\n/* harmony export */ hasPostDraw: () => (/* binding */ hasPostDraw),\n/* harmony export */ hasPreDraw: () => (/* binding */ hasPreDraw),\n/* harmony export */ has_add: () => (/* binding */ has_add),\n/* harmony export */ has_initialize: () => (/* binding */ has_initialize),\n/* harmony export */ has_postupdate: () => (/* binding */ has_postupdate),\n/* harmony export */ has_preupdate: () => (/* binding */ has_preupdate),\n/* harmony export */ has_remove: () => (/* binding */ has_remove)\n/* harmony export */ });\n/**\n * Type guard checking for internal initialize method\n * @internal\n * @param a\n */\nfunction has_initialize(a) {\n return !!a._initialize;\n}\n/**\n *\n */\nfunction has_add(a) {\n return !!a.onAdd;\n}\n/**\n *\n */\nfunction has_remove(a) {\n return !!a.onRemove;\n}\n/**\n *\n */\nfunction hasOnInitialize(a) {\n return !!a.onInitialize;\n}\n/**\n *\n */\nfunction has_preupdate(a) {\n return !!a._preupdate;\n}\n/**\n *\n */\nfunction hasOnPreUpdate(a) {\n return !!a.onPreUpdate;\n}\n/**\n *\n */\nfunction has_postupdate(a) {\n return !!a.onPostUpdate;\n}\n/**\n *\n */\nfunction hasOnPostUpdate(a) {\n return !!a.onPostUpdate;\n}\n/**\n *\n */\nfunction hasOnAdd(a) {\n return !!a.onAdd;\n}\n/**\n *\n */\nfunction hasOnRemove(a) {\n return !!a.onRemove;\n}\n/**\n *\n */\nfunction hasPreDraw(a) {\n return !!a.onPreDraw;\n}\n/**\n *\n */\nfunction hasPostDraw(a) {\n return !!a.onPostDraw;\n}\n\n\n/***/ }),\n\n/***/ \"./Label.ts\":\n/*!******************!*\\\n !*** ./Label.ts ***!\n \\******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Label: () => (/* binding */ Label)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Graphics_Text__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Graphics/Text */ \"./Graphics/Text.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Graphics */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Graphics_Font__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Graphics/Font */ \"./Graphics/Font.ts\");\n/* harmony import */ var _Actor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Actor */ \"./Actor.ts\");\n\n\n\n\n\n/**\n * Labels are the way to draw small amounts of text to the screen. They are\n * actors and inherit all of the benefits and capabilities.\n */\nclass Label extends _Actor__WEBPACK_IMPORTED_MODULE_0__.Actor {\n set maxWidth(width) {\n this._text.maxWidth = width;\n }\n get maxWidth() {\n return this._text.maxWidth;\n }\n get font() {\n return this._font;\n }\n set font(newFont) {\n this._font = newFont;\n this._text.font = newFont;\n }\n /**\n * The text to draw.\n */\n get text() {\n return this._text.text;\n }\n set text(text) {\n this._text.text = text;\n }\n get color() {\n return this._text.color;\n }\n set color(color) {\n if (this._text) {\n this._text.color = color;\n }\n }\n get opacity() {\n return this.graphics.opacity;\n }\n set opacity(opacity) {\n this.graphics.opacity = opacity;\n }\n /**\n * The {@apilink SpriteFont} to use, if any. Overrides {@apilink Font | `font`} if present.\n */\n get spriteFont() {\n return this._spriteFont;\n }\n set spriteFont(sf) {\n if (sf) {\n this._spriteFont = sf;\n this._text.font = this._spriteFont;\n }\n }\n /**\n * Build a new label\n * @param options\n */\n constructor(options) {\n super(options);\n this._font = new _Graphics_Font__WEBPACK_IMPORTED_MODULE_1__.Font();\n this._text = new _Graphics_Text__WEBPACK_IMPORTED_MODULE_2__.Text({ text: '', font: this._font });\n const { text, pos, x, y, spriteFont, font, color, maxWidth } = { text: '', ...options };\n this.pos = pos !== null && pos !== void 0 ? pos : (x && y ? (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(x, y) : this.pos);\n this.text = text !== null && text !== void 0 ? text : this.text;\n this.font = font !== null && font !== void 0 ? font : this.font;\n this.maxWidth = maxWidth !== null && maxWidth !== void 0 ? maxWidth : this.maxWidth;\n this.spriteFont = spriteFont !== null && spriteFont !== void 0 ? spriteFont : this.spriteFont;\n this._text.color = color !== null && color !== void 0 ? color : this.color;\n const gfx = this.get(_Graphics__WEBPACK_IMPORTED_MODULE_4__.GraphicsComponent);\n gfx.anchor = _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero;\n gfx.use(this._text);\n }\n _initialize(engine) {\n super._initialize(engine);\n }\n /**\n * Returns the width of the text in the label (in pixels);\n */\n getTextWidth() {\n return this._text.width;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/Random.ts\":\n/*!************************!*\\\n !*** ./Math/Random.ts ***!\n \\************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Random: () => (/* binding */ Random)\n/* harmony export */ });\n/**\n * @module\n * Pseudo-Random Utility\n *\n * A pseudo-random utility to add seeded random support for help in\n * generating things like terrain or reproducible randomness. Uses the\n * [Mersenne Twister](https://en.wikipedia.org/wiki/Mersenne_Twister) algorithm.\n */\n/**\n * 32-bit mask\n */\nconst BITMASK32 = 0xffffffff;\n/**\n * Pseudo-random number generator following the Mersenne_Twister algorithm. Given a seed this generator will produce the same sequence\n * of numbers each time it is called.\n * See https://en.wikipedia.org/wiki/Mersenne_Twister for more details.\n * Uses the MT19937-32 (2002) implementation documented here http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/emt19937ar.html\n *\n * Api inspired by http://chancejs.com/# https://github.com/chancejs/chancejs\n */\nclass Random {\n /**\n * If no seed is specified, the Date.now() is used\n */\n constructor(seed) {\n this.seed = seed;\n // Separation point of one one word, the number of bits in the lower bitmask 0 <= r <= w-1\n this._lowerMask = 0x7fffffff; // 31 bits same as _r\n this._upperMask = 0x80000000; // 34 high bits\n // Word size, 64 bits\n this._w = 32;\n // Degree of recurrence\n this._n = 624;\n // Middle word, an offset used in the recurrence defining the series x, 1<=m>> 0;\n for (let i = 1; i < this._n; i++) {\n const s = this._mt[i - 1] ^ (this._mt[i - 1] >>> (this._w - 2));\n // numbers are bigger than the JS max safe int, add in 16-bit chunks to prevent IEEE rounding errors on high bits\n this._mt[i] = (((this._f * ((s & 0xffff0000) >>> 16)) << 16) + this._f * (s & 0xffff) + i) >>> 0;\n }\n this._index = this._n;\n }\n /**\n * Apply the twist\n */\n _twist() {\n const mag01 = [0x0, this._a];\n let y = 0, i = 0;\n for (; i < this._n - this._m; i++) {\n y = (this._mt[i] & this._upperMask) | (this._mt[i + 1] & this._lowerMask);\n this._mt[i] = this._mt[i + this._m] ^ (y >>> 1) ^ (mag01[y & 0x1] & BITMASK32);\n }\n for (; i < this._n - 1; i++) {\n y = (this._mt[i] & this._upperMask) | (this._mt[i + 1] & this._lowerMask);\n this._mt[i] = this._mt[i + (this._m - this._n)] ^ (y >>> 1) ^ (mag01[y & 0x1] & BITMASK32);\n }\n y = (this._mt[this._n - 1] & this._upperMask) | (this._mt[0] & this._lowerMask);\n this._mt[this._n - 1] = this._mt[this._m - 1] ^ (y >>> 1) ^ (mag01[y & 0x1] & BITMASK32);\n this._index = 0;\n }\n /**\n * Return next 32 bit integer number in sequence\n */\n nextInt() {\n if (this._index >= this._n) {\n this._twist();\n }\n let y = this._mt[this._index++];\n y ^= y >>> this._u;\n y ^= (y << this._s) & this._b;\n y ^= (y << this._t) & this._c;\n y ^= y >>> this._l;\n return y >>> 0;\n }\n /**\n * Return a random floating point number between [0, 1)\n */\n next() {\n return this.nextInt() * (1.0 / 4294967296.0); // divided by 2^32\n }\n /**\n * Return a random floating point in range [min, max) min is included, max is not included\n */\n floating(min, max) {\n return (max - min) * this.next() + min;\n }\n /**\n * Return a random integer in range [min, max] min is included, max is included.\n * Implemented with rejection sampling, see https://medium.com/@betable/tifu-by-using-math-random-f1c308c4fd9d#.i13tdiu5a\n */\n integer(min, max) {\n return Math.floor((max - min + 1) * this.next() + min);\n }\n /**\n * Returns true or false randomly with 50/50 odds by default.\n * By default the likelihood of returning a true is .5 (50%).\n * @param likelihood takes values between [0, 1]\n */\n bool(likelihood = 0.5) {\n return this.next() <= likelihood;\n }\n /**\n * Returns one element from an array at random\n */\n pickOne(array) {\n return array[this.integer(0, array.length - 1)];\n }\n /**\n * Returns a new array random picking elements from the original\n * @param array Original array to pick from\n * @param numPicks can be any positive number\n * @param allowDuplicates indicates whether the returned set is allowed duplicates (it does not mean there will always be duplicates\n * just that it is possible)\n */\n pickSet(array, numPicks, allowDuplicates = false) {\n if (allowDuplicates) {\n return this._pickSetWithDuplicates(array, numPicks);\n }\n else {\n return this._pickSetWithoutDuplicates(array, numPicks);\n }\n }\n /**\n * Returns a new array randomly picking elements in the original (not reused)\n * @param array Array to pick elements out of\n * @param numPicks must be less than or equal to the number of elements in the array.\n */\n _pickSetWithoutDuplicates(array, numPicks) {\n if (numPicks > array.length || numPicks < 0) {\n throw new Error('Invalid number of elements to pick, must pick a value 0 < n <= length');\n }\n if (numPicks === array.length) {\n return array;\n }\n const result = new Array(numPicks);\n let currentPick = 0;\n const tempArray = array.slice(0);\n while (currentPick < numPicks) {\n const index = this.integer(0, tempArray.length - 1);\n result[currentPick++] = tempArray[index];\n tempArray.splice(index, 1);\n }\n return result;\n }\n /**\n * Returns a new array random picking elements from the original allowing duplicates\n * @param array Array to pick elements out of\n * @param numPicks can be any positive number\n */\n _pickSetWithDuplicates(array, numPicks) {\n // Typescript numbers are all floating point, so do we add check for int? (or floor the input?)\n if (numPicks < 0) {\n throw new Error('Invalid number of elements to pick, must pick a value 0 <= n < MAX_INT');\n }\n const result = new Array(numPicks);\n for (let i = 0; i < numPicks; i++) {\n result[i] = this.pickOne(array);\n }\n return result;\n }\n /**\n * Returns a new array that has its elements shuffled. Using the Fisher/Yates method\n * https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle\n */\n shuffle(array) {\n const tempArray = array.slice(0);\n let swap;\n for (let i = 0; i < tempArray.length - 2; i++) {\n const randomIndex = this.integer(i, tempArray.length - 1);\n swap = tempArray[i];\n tempArray[i] = tempArray[randomIndex];\n tempArray[randomIndex] = swap;\n }\n return tempArray;\n }\n /**\n * Generate a list of random integer numbers\n * @param length the length of the final array\n * @param min the minimum integer number to generate inclusive\n * @param max the maximum integer number to generate inclusive\n */\n range(length, min, max) {\n const result = new Array(length);\n for (let i = 0; i < length; i++) {\n result[i] = this.integer(min, max);\n }\n return result;\n }\n /**\n * Returns the result of a d4 dice roll\n */\n d4() {\n return this.integer(1, 4);\n }\n /**\n * Returns the result of a d6 dice roll\n */\n d6() {\n return this.integer(1, 6);\n }\n /**\n * Returns the result of a d8 dice roll\n */\n d8() {\n return this.integer(1, 8);\n }\n /**\n * Returns the result of a d10 dice roll\n */\n d10() {\n return this.integer(1, 10);\n }\n /**\n * Returns the result of a d12 dice roll\n */\n d12() {\n return this.integer(1, 12);\n }\n /**\n * Returns the result of a d20 dice roll\n */\n d20() {\n return this.integer(1, 20);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/affine-matrix.ts\":\n/*!*******************************!*\\\n !*** ./Math/affine-matrix.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AffineMatrix: () => (/* binding */ AffineMatrix)\n/* harmony export */ });\n/* harmony import */ var _matrix__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./matrix */ \"./Math/matrix.ts\");\n/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./util */ \"./Math/util.ts\");\n/* harmony import */ var _vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vector */ \"./Math/vector.ts\");\n\n\n\nclass AffineMatrix {\n constructor() {\n /**\n * | | | |\n * | ------- | ------- | -------- |\n * | data[0] | data[2] | data[4] |\n * | data[1] | data[3] | data[5] |\n * | 0 | 0 | 1 |\n */\n this.data = new Float64Array(6);\n this._scale = new Float64Array([1, 1]);\n this._scaleSignX = 1;\n this._scaleSignY = 1;\n }\n /**\n * Converts the current matrix into a DOMMatrix\n *\n * This is useful when working with the browser Canvas context\n * @returns {DOMMatrix} DOMMatrix\n */\n toDOMMatrix() {\n return new DOMMatrix([...this.data]);\n }\n static identity() {\n const mat = new AffineMatrix();\n mat.data[0] = 1;\n mat.data[1] = 0;\n mat.data[2] = 0;\n mat.data[3] = 1;\n mat.data[4] = 0;\n mat.data[5] = 0;\n return mat;\n }\n /**\n * Creates a brand new translation matrix at the specified 3d point\n * @param x\n * @param y\n */\n static translation(x, y) {\n const mat = AffineMatrix.identity();\n mat.data[4] = x;\n mat.data[5] = y;\n return mat;\n }\n /**\n * Creates a brand new scaling matrix with the specified scaling factor\n * @param sx\n * @param sy\n */\n static scale(sx, sy) {\n const mat = AffineMatrix.identity();\n mat.data[0] = sx;\n mat.data[3] = sy;\n mat._scale[0] = sx;\n mat._scale[1] = sy;\n return mat;\n }\n /**\n * Creates a brand new rotation matrix with the specified angle in radians\n * @param angle\n */\n static rotation(angle) {\n const mat = AffineMatrix.identity();\n mat.data[0] = Math.cos(angle);\n mat.data[1] = Math.sin(angle);\n mat.data[2] = -Math.sin(angle);\n mat.data[3] = Math.cos(angle);\n return mat;\n }\n setPosition(x, y) {\n this.data[4] = x;\n this.data[5] = y;\n }\n getPosition() {\n return (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.data[4], this.data[5]);\n }\n /**\n * Applies rotation to the current matrix mutating it\n * @param angle in Radians\n */\n rotate(angle) {\n const a11 = this.data[0];\n const a21 = this.data[1];\n const a12 = this.data[2];\n const a22 = this.data[3];\n const sine = Math.sin(angle);\n const cosine = Math.cos(angle);\n this.data[0] = cosine * a11 + sine * a12;\n this.data[1] = cosine * a21 + sine * a22;\n this.data[2] = cosine * a12 - sine * a11;\n this.data[3] = cosine * a22 - sine * a21;\n return this;\n }\n /**\n * Applies translation to the current matrix mutating it\n * @param x\n * @param y\n */\n translate(x, y) {\n const a11 = this.data[0];\n const a21 = this.data[1];\n // const a31 = 0;\n const a12 = this.data[2];\n const a22 = this.data[3];\n // const a32 = 0;\n const a13 = this.data[4];\n const a23 = this.data[5];\n // const a33 = 1;\n // Doesn't change z\n this.data[4] = a11 * x + a12 * y + a13;\n this.data[5] = a21 * x + a22 * y + a23;\n return this;\n }\n /**\n * Applies scaling to the current matrix mutating it\n * @param x\n * @param y\n */\n scale(x, y) {\n const a11 = this.data[0];\n const a21 = this.data[1];\n const a12 = this.data[2];\n const a22 = this.data[3];\n this.data[0] = a11 * x;\n this.data[1] = a21 * x;\n this.data[2] = a12 * y;\n this.data[3] = a22 * y;\n this._scale[0] = x;\n this._scale[1] = y;\n this._scaleSignX = (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(x);\n this._scaleSignY = (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(y);\n return this;\n }\n determinant() {\n return this.data[0] * this.data[3] - this.data[1] * this.data[2];\n }\n /**\n * Return the affine inverse, optionally store it in a target matrix.\n *\n * It's recommended you call .reset() the target unless you know what you're doing\n * @param target\n */\n inverse(target) {\n // See http://negativeprobability.blogspot.com/2011/11/affine-transformations-and-their.html\n // See https://www.mathsisfun.com/algebra/matrix-inverse.html\n // Since we are actually only doing 2D transformations we can use this hack\n // We don't actually use the 3rd or 4th dimension\n const det = this.determinant();\n let inverseDet = det; // default to a zero matrix if we have a singular matrix\n if (det !== 0) {\n inverseDet = 1 / det;\n }\n const a = this.data[0];\n const b = this.data[2];\n const c = this.data[1];\n const d = this.data[3];\n const m = target || AffineMatrix.identity();\n // inverts rotation and scale\n m.data[0] = d * inverseDet;\n m.data[1] = -c * inverseDet;\n m.data[2] = -b * inverseDet;\n m.data[3] = a * inverseDet;\n const tx = this.data[4];\n const ty = this.data[5];\n // invert translation\n // transform translation into the matrix basis created by rot/scale\n m.data[4] = -(tx * m.data[0] + ty * m.data[2]);\n m.data[5] = -(tx * m.data[1] + ty * m.data[3]);\n return m;\n }\n multiply(vectorOrMatrix, dest) {\n if (vectorOrMatrix instanceof _vector__WEBPACK_IMPORTED_MODULE_0__.Vector) {\n const result = dest || new _vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\n const vector = vectorOrMatrix;\n // these shenanigans are to allow dest and vector to be the same instance\n const resultX = vector.x * this.data[0] + vector.y * this.data[2] + this.data[4];\n const resultY = vector.x * this.data[1] + vector.y * this.data[3] + this.data[5];\n result.x = resultX;\n result.y = resultY;\n return result;\n }\n else {\n const result = dest || new AffineMatrix();\n const other = vectorOrMatrix;\n const a11 = this.data[0];\n const a21 = this.data[1];\n // const a31 = 0;\n const a12 = this.data[2];\n const a22 = this.data[3];\n // const a32 = 0;\n const a13 = this.data[4];\n const a23 = this.data[5];\n // const a33 = 1;\n const b11 = other.data[0];\n const b21 = other.data[1];\n // const b31 = 0;\n const b12 = other.data[2];\n const b22 = other.data[3];\n // const b32 = 0;\n const b13 = other.data[4];\n const b23 = other.data[5];\n // const b33 = 1;\n result.data[0] = a11 * b11 + a12 * b21; // + a13 * b31; // zero\n result.data[1] = a21 * b11 + a22 * b21; // + a23 * b31; // zero\n result.data[2] = a11 * b12 + a12 * b22; // + a13 * b32; // zero\n result.data[3] = a21 * b12 + a22 * b22; // + a23 * b32; // zero\n result.data[4] = a11 * b13 + a12 * b23 + a13; // * b33; // one\n result.data[5] = a21 * b13 + a22 * b23 + a23; // * b33; // one\n const signX = this._scaleSignX;\n const signY = this._scaleSignY;\n result._scaleSignX = signX * (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(result._scaleSignX);\n result._scaleSignY = signY * (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(result._scaleSignY);\n return result;\n }\n }\n /**\n * Packed array of length 8, that contains 4 vertices, with 2 components each\n * So: [x0, y0, x1, y1, x2, y2, x3, y3]\n * @param quad\n */\n multiplyQuadInPlace(quad) {\n const resultTopLeftX = quad[0] * this.data[0] + quad[1] * this.data[2] + this.data[4];\n const resultTopLeftY = quad[0] * this.data[1] + quad[1] * this.data[3] + this.data[5];\n quad[0] = resultTopLeftX;\n quad[1] = resultTopLeftY;\n const resultTopRightX = quad[2] * this.data[0] + quad[3] * this.data[2] + this.data[4];\n const resultTopRightY = quad[2] * this.data[1] + quad[3] * this.data[3] + this.data[5];\n quad[2] = resultTopRightX;\n quad[3] = resultTopRightY;\n const resultBottomLeftX = quad[4] * this.data[0] + quad[5] * this.data[2] + this.data[4];\n const resultBottomLeftY = quad[4] * this.data[1] + quad[5] * this.data[3] + this.data[5];\n quad[4] = resultBottomLeftX;\n quad[5] = resultBottomLeftY;\n const resultBottomRightX = quad[6] * this.data[0] + quad[7] * this.data[2] + this.data[4];\n const resultBottomRightY = quad[6] * this.data[1] + quad[7] * this.data[3] + this.data[5];\n quad[6] = resultBottomRightX;\n quad[7] = resultBottomRightY;\n }\n to4x4() {\n const mat = new _matrix__WEBPACK_IMPORTED_MODULE_2__.Matrix();\n mat.data[0] = this.data[0];\n mat.data[1] = this.data[1];\n mat.data[2] = 0;\n mat.data[3] = 0;\n mat.data[4] = this.data[2];\n mat.data[5] = this.data[3];\n mat.data[6] = 0;\n mat.data[7] = 0;\n mat.data[8] = 0;\n mat.data[9] = 0;\n mat.data[10] = 1;\n mat.data[11] = 0;\n mat.data[12] = this.data[4];\n mat.data[13] = this.data[5];\n mat.data[14] = 0;\n mat.data[15] = 1;\n return mat;\n }\n setRotation(angle) {\n const currentScale = this.getScale();\n const sine = Math.sin(angle);\n const cosine = Math.cos(angle);\n this.data[0] = cosine * currentScale.x;\n this.data[1] = sine * currentScale.y;\n this.data[2] = -sine * currentScale.x;\n this.data[3] = cosine * currentScale.y;\n }\n getRotation() {\n const angle = Math.atan2(this.data[1] / this.getScaleY(), this.data[0] / this.getScaleX());\n return (0,_util__WEBPACK_IMPORTED_MODULE_1__.canonicalizeAngle)(angle);\n }\n getScaleX() {\n // absolute scale of the matrix (we lose sign so need to add it back)\n const xScaleSq = this.data[0] * this.data[0] + this.data[2] * this.data[2];\n if (xScaleSq === 1.0) {\n // usually there isn't scale so we can avoid a sqrt\n return this._scaleSignX;\n }\n return this._scaleSignX * Math.sqrt(xScaleSq);\n }\n getScaleY() {\n // absolute scale of the matrix (we lose sign so need to add it back)\n const yScaleSq = this.data[1] * this.data[1] + this.data[3] * this.data[3];\n if (yScaleSq === 1.0) {\n // usually there isn't scale so we can avoid a sqrt\n return this._scaleSignY;\n }\n return this._scaleSignY * Math.sqrt(yScaleSq);\n }\n /**\n * Get the scale of the matrix\n */\n getScale() {\n return (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.getScaleX(), this.getScaleY());\n }\n setScaleX(val) {\n if (val === this._scale[0]) {\n return;\n }\n this._scaleSignX = (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(val);\n // negative scale acts like a 180 rotation, so flip\n const xscale = (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.data[0] * this._scaleSignX, this.data[2] * this._scaleSignX).normalize();\n this.data[0] = xscale.x * val;\n this.data[2] = xscale.y * val;\n this._scale[0] = val;\n }\n setScaleY(val) {\n if (val === this._scale[1]) {\n return;\n }\n this._scaleSignY = (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(val);\n // negative scale acts like a 180 rotation, so flip\n const yscale = (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.data[1] * this._scaleSignY, this.data[3] * this._scaleSignY).normalize();\n this.data[1] = yscale.x * val;\n this.data[3] = yscale.y * val;\n this._scale[1] = val;\n }\n setScale(scale) {\n this.setScaleX(scale.x);\n this.setScaleY(scale.y);\n }\n isIdentity() {\n return this.data[0] === 1 && this.data[1] === 0 && this.data[2] === 0 && this.data[3] === 1 && this.data[4] === 0 && this.data[5] === 0;\n }\n /**\n * Resets the current matrix to the identity matrix, mutating it\n * @returns {AffineMatrix} Current matrix as identity\n */\n reset() {\n const mat = this;\n mat.data[0] = 1;\n mat.data[1] = 0;\n mat.data[2] = 0;\n mat.data[3] = 1;\n mat.data[4] = 0;\n mat.data[5] = 0;\n return mat;\n }\n /**\n * Creates a new Matrix with the same data as the current {@apilink AffineMatrix}\n */\n clone(dest) {\n const mat = dest || new AffineMatrix();\n mat.data[0] = this.data[0];\n mat.data[1] = this.data[1];\n mat.data[2] = this.data[2];\n mat.data[3] = this.data[3];\n mat.data[4] = this.data[4];\n mat.data[5] = this.data[5];\n mat._scaleSignX = this._scaleSignX;\n mat._scaleSignY = this._scaleSignY;\n return mat;\n }\n toString() {\n return `\r\n[${this.data[0]} ${this.data[2]} ${this.data[4]}]\r\n[${this.data[1]} ${this.data[3]} ${this.data[5]}]\r\n[0 0 1]\r\n`;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/bezier-curve.ts\":\n/*!******************************!*\\\n !*** ./Math/bezier-curve.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BezierCurve: () => (/* binding */ BezierCurve)\n/* harmony export */ });\n/* harmony import */ var _lerp__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./lerp */ \"./Math/lerp.ts\");\n\n/**\n * BezierCurve that supports cubic Bezier curves.\n */\nclass BezierCurve {\n constructor(options) {\n var _a;\n // Thanks Freya! https://www.youtube.com/watch?v=aVwxzDHniEw\n this._distLookup = [];\n this.quality = 4;\n if (options.controlPoints.length !== 4) {\n throw new Error('Only cubic bezier curves are supported');\n }\n this._controlPoints = [...options.controlPoints];\n this.quality = (_a = options.quality) !== null && _a !== void 0 ? _a : this.quality;\n this._calculateLookup();\n }\n get arcLength() {\n return this._arcLength;\n }\n get controlPoints() {\n return this._controlPoints;\n }\n set controlPoints(points) {\n this._controlPoints = [...points];\n this._calculateLookup();\n }\n setControlPoint(index, point) {\n this._controlPoints[index] = point;\n this._calculateLookup();\n }\n _calculateLookup() {\n let totalLength = 0;\n this._distLookup.length = 0;\n let prev = this.controlPoints[0];\n const n = this.controlPoints.length * this.quality;\n for (let i = 0; i < n; i++) {\n const t = i / (n - 1);\n const pt = this.getPoint(t);\n const diff = prev.distance(pt);\n totalLength += diff;\n this._distLookup.push(totalLength);\n prev = pt;\n }\n this._arcLength = totalLength;\n }\n _getTimeGivenDistance(distance) {\n const n = this._distLookup.length;\n const arcLength = this.arcLength;\n if (distance >= 0 && distance < arcLength) {\n for (let i = 0; i < n - 1; i++) {\n if (this._distLookup[i] <= distance && distance < this._distLookup[i + 1]) {\n return (0,_lerp__WEBPACK_IMPORTED_MODULE_0__.remap)(this._distLookup[i], this._distLookup[i + 1], i / (n - 1), (i + 1) / (n - 1), distance);\n }\n }\n }\n return distance / arcLength;\n }\n /**\n * Get the point on the Bezier curve at a certain time\n * @param time Between 0-1\n */\n getPoint(time) {\n const points = [...this.controlPoints];\n for (let r = 1; r < points.length; r++) {\n for (let i = 0; i < points.length - r; i++) {\n points[i] = (0,_lerp__WEBPACK_IMPORTED_MODULE_0__.lerpVector)(points[i], points[i + 1], time);\n }\n }\n return points[0];\n }\n /**\n * Get the tangent of the Bezier curve at a certain time\n * @param time Between 0-1\n */\n getTangent(time) {\n const timeSquared = time * time;\n const p0 = this.controlPoints[0];\n const p1 = this.controlPoints[1];\n const p2 = this.controlPoints[2];\n const p3 = this.controlPoints[3];\n // Derivative of Bernstein polynomial\n const pPrime = p0\n .scale(-3 * timeSquared + 6 * time - 3)\n .add(p1.scale(9 * timeSquared - 12 * time + 3).add(p2.scale(-9 * timeSquared + 6 * time).add(p3.scale(3 * timeSquared))));\n return pPrime.normalize();\n }\n /**\n * Get the tangent of the Bezier curve where the distance is uniformly distributed over time\n * @param time\n */\n getUniformTangent(time) {\n const desiredDistance = time * this.arcLength;\n const uniformTime = this._getTimeGivenDistance(desiredDistance);\n return this.getTangent(uniformTime);\n }\n /**\n * Get the normal of the Bezier curve at a certain time\n * @param time Between 0-1\n */\n getNormal(time) {\n return this.getTangent(time).normal();\n }\n /**\n * Get the normal of the Bezier curve where the distance is uniformly distributed over time\n * @param time\n */\n getUniformNormal(time) {\n return this.getUniformTangent(time).normal();\n }\n /**\n * Points are spaced uniformly across the length of the curve over time\n * @param time\n */\n getUniformPoint(time) {\n const desiredDistance = time * this.arcLength;\n const uniformTime = this._getTimeGivenDistance(desiredDistance);\n return this.getPoint(uniformTime);\n }\n clone() {\n return new BezierCurve({\n controlPoints: [...this.controlPoints],\n quality: this.quality\n });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/coord-plane.ts\":\n/*!*****************************!*\\\n !*** ./Math/coord-plane.ts ***!\n \\*****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CoordPlane: () => (/* binding */ CoordPlane)\n/* harmony export */ });\n/**\n * Enum representing the coordinate plane for the position 2D vector in the {@apilink TransformComponent}\n */\nvar CoordPlane;\n(function (CoordPlane) {\n /**\n * The world coordinate plane (default) represents world space, any entities drawn with world\n * space move when the camera moves.\n */\n CoordPlane[\"World\"] = \"world\";\n /**\n * The screen coordinate plane represents screen space, entities drawn in screen space are pinned\n * to screen coordinates ignoring the camera.\n */\n CoordPlane[\"Screen\"] = \"screen\";\n})(CoordPlane || (CoordPlane = {}));\n\n\n/***/ }),\n\n/***/ \"./Math/global-coordinates.ts\":\n/*!************************************!*\\\n !*** ./Math/global-coordinates.ts ***!\n \\************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ GlobalCoordinates: () => (/* binding */ GlobalCoordinates)\n/* harmony export */ });\n/* harmony import */ var _vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vector */ \"./Math/vector.ts\");\n\nclass GlobalCoordinates {\n static fromPagePosition(xOrPos, yOrEngine, engineOrUndefined) {\n let pageX;\n let pageY;\n let pagePos;\n let engine;\n if (arguments.length === 3) {\n pageX = xOrPos;\n pageY = yOrEngine;\n pagePos = new _vector__WEBPACK_IMPORTED_MODULE_0__.Vector(pageX, pageY);\n engine = engineOrUndefined;\n }\n else {\n pagePos = xOrPos;\n pageX = pagePos.x;\n pageY = pagePos.y;\n engine = yOrEngine;\n }\n const screenPos = engine.screen.pageToScreenCoordinates(pagePos);\n const worldPos = engine.screen.screenToWorldCoordinates(screenPos);\n return new GlobalCoordinates(worldPos, pagePos, screenPos);\n }\n constructor(worldPos, pagePos, screenPos) {\n this.worldPos = worldPos;\n this.pagePos = pagePos;\n this.screenPos = screenPos;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/index.ts\":\n/*!***********************!*\\\n !*** ./Math/index.ts ***!\n \\***********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AffineMatrix: () => (/* reexport safe */ _affine_matrix__WEBPACK_IMPORTED_MODULE_3__.AffineMatrix),\n/* harmony export */ BezierCurve: () => (/* reexport safe */ _bezier_curve__WEBPACK_IMPORTED_MODULE_12__.BezierCurve),\n/* harmony export */ CoordPlane: () => (/* reexport safe */ _coord_plane__WEBPACK_IMPORTED_MODULE_5__.CoordPlane),\n/* harmony export */ GlobalCoordinates: () => (/* reexport safe */ _global_coordinates__WEBPACK_IMPORTED_MODULE_7__.GlobalCoordinates),\n/* harmony export */ LineSegment: () => (/* reexport safe */ _line_segment__WEBPACK_IMPORTED_MODULE_8__.LineSegment),\n/* harmony export */ Matrix: () => (/* reexport safe */ _matrix__WEBPACK_IMPORTED_MODULE_2__.Matrix),\n/* harmony export */ MatrixLocations: () => (/* reexport safe */ _matrix__WEBPACK_IMPORTED_MODULE_2__.MatrixLocations),\n/* harmony export */ Projection: () => (/* reexport safe */ _projection__WEBPACK_IMPORTED_MODULE_9__.Projection),\n/* harmony export */ Random: () => (/* reexport safe */ _Random__WEBPACK_IMPORTED_MODULE_6__.Random),\n/* harmony export */ Ray: () => (/* reexport safe */ _ray__WEBPACK_IMPORTED_MODULE_10__.Ray),\n/* harmony export */ RotationType: () => (/* reexport safe */ _rotation_type__WEBPACK_IMPORTED_MODULE_14__.RotationType),\n/* harmony export */ Transform: () => (/* reexport safe */ _transform__WEBPACK_IMPORTED_MODULE_4__.Transform),\n/* harmony export */ TwoPI: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.TwoPI),\n/* harmony export */ Vector: () => (/* reexport safe */ _vector__WEBPACK_IMPORTED_MODULE_0__.Vector),\n/* harmony export */ VectorView: () => (/* reexport safe */ _vector_view__WEBPACK_IMPORTED_MODULE_1__.VectorView),\n/* harmony export */ approximatelyEqual: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.approximatelyEqual),\n/* harmony export */ canonicalizeAngle: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.canonicalizeAngle),\n/* harmony export */ clamp: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.clamp),\n/* harmony export */ frac: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.frac),\n/* harmony export */ inverseLerp: () => (/* reexport safe */ _lerp__WEBPACK_IMPORTED_MODULE_11__.inverseLerp),\n/* harmony export */ inverseLerpVector: () => (/* reexport safe */ _lerp__WEBPACK_IMPORTED_MODULE_11__.inverseLerpVector),\n/* harmony export */ lerp: () => (/* reexport safe */ _lerp__WEBPACK_IMPORTED_MODULE_11__.lerp),\n/* harmony export */ lerpAngle: () => (/* reexport safe */ _lerp__WEBPACK_IMPORTED_MODULE_11__.lerpAngle),\n/* harmony export */ lerpVector: () => (/* reexport safe */ _lerp__WEBPACK_IMPORTED_MODULE_11__.lerpVector),\n/* harmony export */ randomInRange: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.randomInRange),\n/* harmony export */ randomIntInRange: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.randomIntInRange),\n/* harmony export */ range: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.range),\n/* harmony export */ remap: () => (/* reexport safe */ _lerp__WEBPACK_IMPORTED_MODULE_11__.remap),\n/* harmony export */ remapVector: () => (/* reexport safe */ _lerp__WEBPACK_IMPORTED_MODULE_11__.remapVector),\n/* harmony export */ sign: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.sign),\n/* harmony export */ toDegrees: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.toDegrees),\n/* harmony export */ toRadians: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_13__.toRadians),\n/* harmony export */ vec: () => (/* reexport safe */ _vector__WEBPACK_IMPORTED_MODULE_0__.vec)\n/* harmony export */ });\n/* harmony import */ var _vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vector */ \"./Math/vector.ts\");\n/* harmony import */ var _vector_view__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./vector-view */ \"./Math/vector-view.ts\");\n/* harmony import */ var _matrix__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./matrix */ \"./Math/matrix.ts\");\n/* harmony import */ var _affine_matrix__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./affine-matrix */ \"./Math/affine-matrix.ts\");\n/* harmony import */ var _transform__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./transform */ \"./Math/transform.ts\");\n/* harmony import */ var _coord_plane__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _Random__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Random */ \"./Math/Random.ts\");\n/* harmony import */ var _global_coordinates__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./global-coordinates */ \"./Math/global-coordinates.ts\");\n/* harmony import */ var _line_segment__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./line-segment */ \"./Math/line-segment.ts\");\n/* harmony import */ var _projection__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./projection */ \"./Math/projection.ts\");\n/* harmony import */ var _ray__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./ray */ \"./Math/ray.ts\");\n/* harmony import */ var _lerp__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./lerp */ \"./Math/lerp.ts\");\n/* harmony import */ var _bezier_curve__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./bezier-curve */ \"./Math/bezier-curve.ts\");\n/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./util */ \"./Math/util.ts\");\n/* harmony import */ var _rotation_type__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./rotation-type */ \"./Math/rotation-type.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Math/lerp.ts\":\n/*!**********************!*\\\n !*** ./Math/lerp.ts ***!\n \\**********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ inverseLerp: () => (/* binding */ inverseLerp),\n/* harmony export */ inverseLerpVector: () => (/* binding */ inverseLerpVector),\n/* harmony export */ lerp: () => (/* binding */ lerp),\n/* harmony export */ lerpAngle: () => (/* binding */ lerpAngle),\n/* harmony export */ lerpVector: () => (/* binding */ lerpVector),\n/* harmony export */ remap: () => (/* binding */ remap),\n/* harmony export */ remapVector: () => (/* binding */ remapVector)\n/* harmony export */ });\n/* harmony import */ var _rotation_type__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./rotation-type */ \"./Math/rotation-type.ts\");\n/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./util */ \"./Math/util.ts\");\n\n\n/**\n * Linear interpolation between `a` and `b`, at `time = 0` the value will be `a` at `time = 1` the value will be `b`\n * @param a\n * @param b\n * @param time\n */\nfunction lerp(a, b, time) {\n return (1 - time) * a + b * time;\n}\n/**\n * Linear interpolation between angles in radians\n * @param startAngle\n * @param endAngle\n * @param rotationType\n * @param time\n */\nfunction lerpAngle(startAngle, endAngle, rotationType, time) {\n const shortestPathIsPositive = (startAngle - endAngle + _util__WEBPACK_IMPORTED_MODULE_0__.TwoPI) % _util__WEBPACK_IMPORTED_MODULE_0__.TwoPI >= Math.PI;\n const distance1 = Math.abs(endAngle - startAngle);\n const distance2 = _util__WEBPACK_IMPORTED_MODULE_0__.TwoPI - distance1;\n let shortDistance = 0;\n let longDistance = 0;\n if (distance1 > distance2) {\n shortDistance = distance2;\n longDistance = distance1;\n }\n else {\n shortDistance = distance1;\n longDistance = distance2;\n }\n let distance = 0;\n let direction = 1;\n switch (rotationType) {\n case _rotation_type__WEBPACK_IMPORTED_MODULE_1__.RotationType.ShortestPath:\n distance = shortDistance;\n direction = shortestPathIsPositive ? 1 : -1;\n break;\n case _rotation_type__WEBPACK_IMPORTED_MODULE_1__.RotationType.LongestPath:\n distance = longDistance;\n direction = shortestPathIsPositive ? -1 : 1;\n break;\n case _rotation_type__WEBPACK_IMPORTED_MODULE_1__.RotationType.Clockwise:\n direction = 1;\n distance = shortestPathIsPositive ? shortDistance : longDistance;\n break;\n case _rotation_type__WEBPACK_IMPORTED_MODULE_1__.RotationType.CounterClockwise:\n direction = -1;\n distance = shortestPathIsPositive ? longDistance : shortDistance;\n break;\n }\n return startAngle + direction * (distance * time);\n}\n/**\n * Linear interpolation between `a` and `b`, at `time = 0` the value will be `a` at `time = 1` the value will be `b`\n * @param a\n * @param b\n * @param time\n */\nfunction lerpVector(a, b, time) {\n return a.scale(1 - time).add(b.scale(time));\n}\n/**\n * Inverse of a linear interpolation, given a `value` in between `a` and `b` return how close to `a` or `b` the `value` is.\n *\n * Example: `a=1`, `b=5`, `value=4` will return `.75`\n * @param a\n * @param b\n * @param value\n */\nfunction inverseLerp(a, b, value) {\n return (value - a) / (b - a);\n}\n/**\n * Inverse of a linear interpolation, given a `value` in between `a` and `b` return how close to `a` or `b` the `value` is.\n *\n * **Warning** assumes that the `value` vector is co-linear with vector `a` and `b`\n *\n * Example: `a=1`, `b=5`, `value=4` will return `.75`\n * @param a\n * @param b\n * @param value\n */\nfunction inverseLerpVector(a, b, value) {\n const numerator = value.sub(a);\n const denominator = b.sub(a);\n const x = numerator.x / denominator.x;\n const y = numerator.y / denominator.y;\n return Math.min(x, y);\n}\n/**\n * Remaps a value from a source domain to a destination\n * @param minSource\n * @param maxSource\n * @param minDestination\n * @param maxDestination\n * @param value\n */\nfunction remap(minSource, maxSource, minDestination, maxDestination, value) {\n const time = inverseLerp(minSource, maxSource, value);\n return lerp(minDestination, maxDestination, time);\n}\n/**\n * Remaps a value from a source domain to a destination\n *\n * **Warning** assumes that the `value` vector is co-linear with vector `minSource` and `maxSource`\n * @param minSource\n * @param maxSource\n * @param minDestination\n * @param maxDestination\n * @param value\n */\nfunction remapVector(minSource, maxSource, minDestination, maxDestination, value) {\n const time = inverseLerpVector(minSource, maxSource, value);\n return lerpVector(minDestination, maxDestination, time);\n}\n\n\n/***/ }),\n\n/***/ \"./Math/line-segment.ts\":\n/*!******************************!*\\\n !*** ./Math/line-segment.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ LineSegment: () => (/* binding */ LineSegment)\n/* harmony export */ });\n/* harmony import */ var _vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vector */ \"./Math/vector.ts\");\n\n/**\n * A 2D line segment\n */\nclass LineSegment {\n /**\n * @param begin The starting point of the line segment\n * @param end The ending point of the line segment\n */\n constructor(begin, end) {\n this.begin = begin;\n this.end = end;\n }\n clone(dest) {\n const result = dest || new LineSegment(this.begin.clone(), this.end.clone());\n result.begin = this.begin.clone(result.begin);\n result.end = this.end.clone(result.end);\n return result;\n }\n transform(matrix, dest) {\n const result = dest || new LineSegment(_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero, _vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero);\n result.begin = matrix.multiply(this.begin, result.begin);\n result.end = matrix.multiply(this.end, result.end);\n return result;\n }\n /**\n * Gets the raw slope (m) of the line. Will return (+/-)Infinity for vertical lines.\n */\n get slope() {\n return (this.end.y - this.begin.y) / (this.end.x - this.begin.x);\n }\n /**\n * Gets the Y-intercept (b) of the line. Will return (+/-)Infinity if there is no intercept.\n */\n get intercept() {\n return this.begin.y - this.slope * this.begin.x;\n }\n /**\n * Gets the normal of the line\n */\n normal() {\n if (this._normal) {\n return this._normal;\n }\n return (this._normal = this.end.sub(this.begin).normal());\n }\n dir() {\n if (this._dir) {\n return this._dir;\n }\n return (this._dir = this.end.sub(this.begin));\n }\n getPoints() {\n return [this.begin, this.end];\n }\n /**\n * Returns the slope of the line in the form of a vector of length 1\n */\n getSlope() {\n if (this._slope) {\n return this._slope;\n }\n const begin = this.begin;\n const end = this.end;\n const distance = begin.distance(end);\n return (this._slope = end.sub(begin).scale(1 / distance));\n }\n /**\n * Returns the edge of the line as vector, the length of the vector is the length of the edge\n */\n getEdge() {\n const begin = this.begin;\n const end = this.end;\n return end.sub(begin);\n }\n /**\n * Returns the length of the line segment in pixels\n */\n getLength() {\n const begin = this.begin;\n const end = this.end;\n const distance = begin.distance(end);\n return distance;\n }\n /**\n * Returns the midpoint of the edge\n */\n get midpoint() {\n return this.begin.add(this.end).scale(0.5);\n }\n /**\n * Flips the direction of the line segment\n */\n flip() {\n return new LineSegment(this.end, this.begin);\n }\n /**\n * Tests if a given point is below the line, points in the normal direction above the line are considered above.\n * @param point\n */\n below(point) {\n const above2 = (this.end.x - this.begin.x) * (point.y - this.begin.y) - (this.end.y - this.begin.y) * (point.x - this.begin.x);\n return above2 >= 0;\n }\n /**\n * Returns the clip point\n * @param sideVector Vector that traces the line\n * @param length Length to clip along side\n */\n clip(sideVector, length, normalize = true) {\n let dir = sideVector;\n if (normalize) {\n dir = dir.normalize();\n }\n const near = dir.dot(this.begin) - length;\n const far = dir.dot(this.end) - length;\n const results = [];\n if (near <= 0) {\n results.push(this.begin);\n }\n if (far <= 0) {\n results.push(this.end);\n }\n if (near * far < 0) {\n const clipTime = near / (near - far);\n results.push(this.begin.add(this.end.sub(this.begin).scale(clipTime)));\n }\n if (results.length !== 2) {\n return null;\n }\n return new LineSegment(results[0], results[1]);\n }\n /**\n * Find the perpendicular distance from the line to a point\n * https://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line\n * @param point\n */\n distanceToPoint(point, signed = false) {\n const x0 = point.x;\n const y0 = point.y;\n const l = this.getLength();\n const dy = this.end.y - this.begin.y;\n const dx = this.end.x - this.begin.x;\n const distance = (dy * x0 - dx * y0 + this.end.x * this.begin.y - this.end.y * this.begin.x) / l;\n return signed ? distance : Math.abs(distance);\n }\n /**\n * Find the perpendicular line from the line to a point\n * https://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line\n * (a - p) - ((a - p) * n)n\n * a is a point on the line\n * p is the arbitrary point above the line\n * n is a unit vector in direction of the line\n * @param point\n */\n findVectorToPoint(point) {\n const aMinusP = this.begin.sub(point);\n const n = this.getSlope();\n return aMinusP.sub(n.scale(aMinusP.dot(n)));\n }\n /**\n * Finds a point on the line given only an X or a Y value. Given an X value, the function returns\n * a new point with the calculated Y value and vice-versa.\n * @param x The known X value of the target point\n * @param y The known Y value of the target point\n * @returns A new point with the other calculated axis value\n */\n findPoint(x = null, y = null) {\n const m = this.slope;\n const b = this.intercept;\n if (x !== null) {\n return new _vector__WEBPACK_IMPORTED_MODULE_0__.Vector(x, m * x + b);\n }\n else if (y !== null) {\n return new _vector__WEBPACK_IMPORTED_MODULE_0__.Vector((y - b) / m, y);\n }\n else {\n throw new Error('You must provide an X or a Y value');\n }\n }\n /**\n * @see http://stackoverflow.com/a/11908158/109458\n */\n hasPoint() {\n let currPoint;\n let threshold = 0;\n if (typeof arguments[0] === 'number' && typeof arguments[1] === 'number') {\n currPoint = new _vector__WEBPACK_IMPORTED_MODULE_0__.Vector(arguments[0], arguments[1]);\n threshold = arguments[2] || 0;\n }\n else if (arguments[0] instanceof _vector__WEBPACK_IMPORTED_MODULE_0__.Vector) {\n currPoint = arguments[0];\n threshold = arguments[1] || 0;\n }\n else {\n throw 'Could not determine the arguments for Vector.hasPoint';\n }\n const dxc = currPoint.x - this.begin.x;\n const dyc = currPoint.y - this.begin.y;\n const dx1 = this.end.x - this.begin.x;\n const dy1 = this.end.y - this.begin.y;\n const cross = dxc * dy1 - dyc * dx1;\n // check whether point lines on the line\n if (Math.abs(cross) > threshold) {\n return false;\n }\n // check whether point lies in-between start and end\n if (Math.abs(dx1) >= Math.abs(dy1)) {\n return dx1 > 0 ? this.begin.x <= currPoint.x && currPoint.x <= this.end.x : this.end.x <= currPoint.x && currPoint.x <= this.begin.x;\n }\n else {\n return dy1 > 0 ? this.begin.y <= currPoint.y && currPoint.y <= this.end.y : this.end.y <= currPoint.y && currPoint.y <= this.begin.y;\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/matrix.ts\":\n/*!************************!*\\\n !*** ./Math/matrix.ts ***!\n \\************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Matrix: () => (/* binding */ Matrix),\n/* harmony export */ MatrixLocations: () => (/* binding */ MatrixLocations)\n/* harmony export */ });\n/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./util */ \"./Math/util.ts\");\n/* harmony import */ var _vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vector */ \"./Math/vector.ts\");\n\n\n\nvar MatrixLocations;\n(function (MatrixLocations) {\n MatrixLocations[MatrixLocations[\"X\"] = 12] = \"X\";\n MatrixLocations[MatrixLocations[\"Y\"] = 13] = \"Y\";\n})(MatrixLocations || (MatrixLocations = {}));\n/**\n * Excalibur Matrix helper for 4x4 matrices\n *\n * Useful for webgl 4x4 matrices\n */\nclass Matrix {\n constructor() {\n /**\n * 4x4 matrix in column major order\n *\n * | | | | |\n * | ------- | ------- | -------- | -------- |\n * | data[0] | data[4] | data[8] | data[12] |\n * | data[1] | data[5] | data[9] | data[13] |\n * | data[2] | data[6] | data[10] | data[14] |\n * | data[3] | data[7] | data[11] | data[15] |\n *\n */\n this.data = new Float32Array(16);\n this._scaleX = 1;\n this._scaleSignX = 1;\n this._scaleY = 1;\n this._scaleSignY = 1;\n }\n /**\n * Creates an orthographic (flat non-perspective) projection\n * https://en.wikipedia.org/wiki/Orthographic_projection\n * @param left\n * @param right\n * @param bottom\n * @param top\n * @param near\n * @param far\n */\n static ortho(left, right, bottom, top, near, far) {\n const mat = new Matrix();\n mat.data[0] = 2 / (right - left);\n mat.data[1] = 0;\n mat.data[2] = 0;\n mat.data[3] = 0;\n mat.data[4] = 0;\n mat.data[5] = 2 / (top - bottom);\n mat.data[6] = 0;\n mat.data[7] = 0;\n mat.data[8] = 0;\n mat.data[9] = 0;\n mat.data[10] = -2 / (far - near);\n mat.data[11] = 0;\n mat.data[12] = -(right + left) / (right - left);\n mat.data[13] = -(top + bottom) / (top - bottom);\n mat.data[14] = -(far + near) / (far - near);\n mat.data[15] = 1;\n return mat;\n }\n /**\n * Creates a new Matrix with the same data as the current 4x4\n */\n clone(dest) {\n const mat = dest || new Matrix();\n mat.data[0] = this.data[0];\n mat.data[1] = this.data[1];\n mat.data[2] = this.data[2];\n mat.data[3] = this.data[3];\n mat.data[4] = this.data[4];\n mat.data[5] = this.data[5];\n mat.data[6] = this.data[6];\n mat.data[7] = this.data[7];\n mat.data[8] = this.data[8];\n mat.data[9] = this.data[9];\n mat.data[10] = this.data[10];\n mat.data[11] = this.data[11];\n mat.data[12] = this.data[12];\n mat.data[13] = this.data[13];\n mat.data[14] = this.data[14];\n mat.data[15] = this.data[15];\n return mat;\n }\n /**\n * Converts the current matrix into a DOMMatrix\n *\n * This is useful when working with the browser Canvas context\n * @returns {DOMMatrix} DOMMatrix\n */\n toDOMMatrix() {\n return new DOMMatrix([...this.data]);\n }\n static fromFloat32Array(data) {\n const matrix = new Matrix();\n matrix.data = data;\n return matrix;\n }\n /**\n * Creates a new identity matrix (a matrix that when applied does nothing)\n */\n static identity() {\n const mat = new Matrix();\n mat.data[0] = 1;\n mat.data[1] = 0;\n mat.data[2] = 0;\n mat.data[3] = 0;\n mat.data[4] = 0;\n mat.data[5] = 1;\n mat.data[6] = 0;\n mat.data[7] = 0;\n mat.data[8] = 0;\n mat.data[9] = 0;\n mat.data[10] = 1;\n mat.data[11] = 0;\n mat.data[12] = 0;\n mat.data[13] = 0;\n mat.data[14] = 0;\n mat.data[15] = 1;\n return mat;\n }\n /**\n * Resets the current matrix to the identity matrix, mutating it\n * @returns {Matrix} Current matrix as identity\n */\n reset() {\n const mat = this;\n mat.data[0] = 1;\n mat.data[1] = 0;\n mat.data[2] = 0;\n mat.data[3] = 0;\n mat.data[4] = 0;\n mat.data[5] = 1;\n mat.data[6] = 0;\n mat.data[7] = 0;\n mat.data[8] = 0;\n mat.data[9] = 0;\n mat.data[10] = 1;\n mat.data[11] = 0;\n mat.data[12] = 0;\n mat.data[13] = 0;\n mat.data[14] = 0;\n mat.data[15] = 1;\n return mat;\n }\n /**\n * Creates a brand new translation matrix at the specified 3d point\n * @param x\n * @param y\n */\n static translation(x, y) {\n const mat = Matrix.identity();\n mat.data[12] = x;\n mat.data[13] = y;\n return mat;\n }\n /**\n * Creates a brand new scaling matrix with the specified scaling factor\n * @param sx\n * @param sy\n */\n static scale(sx, sy) {\n const mat = Matrix.identity();\n mat.data[0] = sx;\n mat.data[5] = sy;\n mat.data[10] = 1;\n mat.data[15] = 1;\n return mat;\n }\n /**\n * Creates a brand new rotation matrix with the specified angle in radians\n * @param angle\n */\n static rotation(angle) {\n const mat = Matrix.identity();\n mat.data[0] = Math.cos(angle);\n mat.data[4] = -Math.sin(angle);\n mat.data[1] = Math.sin(angle);\n mat.data[5] = Math.cos(angle);\n return mat;\n }\n multiply(vectorOrMatrix, dest) {\n if (vectorOrMatrix instanceof _vector__WEBPACK_IMPORTED_MODULE_0__.Vector) {\n const result = dest || new _vector__WEBPACK_IMPORTED_MODULE_0__.Vector(0, 0);\n const vector = vectorOrMatrix;\n // these shenanigans are to allow dest and vector to be the same instance\n const resultX = vector.x * this.data[0] + vector.y * this.data[4] + this.data[12];\n const resultY = vector.x * this.data[1] + vector.y * this.data[5] + this.data[13];\n result.x = resultX;\n result.y = resultY;\n return result;\n }\n else {\n const result = dest || new Matrix();\n const other = vectorOrMatrix;\n const a11 = this.data[0];\n const a21 = this.data[1];\n const a31 = this.data[2];\n const a41 = this.data[3];\n const a12 = this.data[4];\n const a22 = this.data[5];\n const a32 = this.data[6];\n const a42 = this.data[7];\n const a13 = this.data[8];\n const a23 = this.data[9];\n const a33 = this.data[10];\n const a43 = this.data[11];\n const a14 = this.data[12];\n const a24 = this.data[13];\n const a34 = this.data[14];\n const a44 = this.data[15];\n const b11 = other.data[0];\n const b21 = other.data[1];\n const b31 = other.data[2];\n const b41 = other.data[3];\n const b12 = other.data[4];\n const b22 = other.data[5];\n const b32 = other.data[6];\n const b42 = other.data[7];\n const b13 = other.data[8];\n const b23 = other.data[9];\n const b33 = other.data[10];\n const b43 = other.data[11];\n const b14 = other.data[12];\n const b24 = other.data[13];\n const b34 = other.data[14];\n const b44 = other.data[15];\n result.data[0] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n result.data[1] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n result.data[2] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n result.data[3] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n result.data[4] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n result.data[5] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n result.data[6] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n result.data[7] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n result.data[8] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n result.data[9] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n result.data[10] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n result.data[11] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n result.data[12] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n result.data[13] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n result.data[14] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n result.data[15] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n const s = this.getScale();\n result._scaleSignX = (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(s.x) * (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(result._scaleSignX);\n result._scaleSignY = (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(s.y) * (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(result._scaleSignY);\n return result;\n }\n }\n /**\n * Applies translation to the current matrix mutating it\n * @param x\n * @param y\n */\n translate(x, y) {\n const a11 = this.data[0];\n const a21 = this.data[1];\n const a31 = this.data[2];\n const a41 = this.data[3];\n const a12 = this.data[4];\n const a22 = this.data[5];\n const a32 = this.data[6];\n const a42 = this.data[7];\n const a13 = this.data[8];\n const a23 = this.data[9];\n const a33 = this.data[10];\n const a43 = this.data[11];\n const a14 = this.data[12];\n const a24 = this.data[13];\n const a34 = this.data[14];\n const a44 = this.data[15];\n // Doesn't change z\n const z = 0;\n const w = 1;\n this.data[12] = a11 * x + a12 * y + a13 * z + a14 * w;\n this.data[13] = a21 * x + a22 * y + a23 * z + a24 * w;\n this.data[14] = a31 * x + a32 * y + a33 * z + a34 * w;\n this.data[15] = a41 * x + a42 * y + a43 * z + a44 * w;\n return this;\n }\n setPosition(x, y) {\n this.data[12] = x;\n this.data[13] = y;\n }\n getPosition() {\n return (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.data[12], this.data[13]);\n }\n /**\n * Applies rotation to the current matrix mutating it\n * @param angle in Radians\n */\n rotate(angle) {\n const a11 = this.data[0];\n const a21 = this.data[1];\n const a31 = this.data[2];\n const a41 = this.data[3];\n const a12 = this.data[4];\n const a22 = this.data[5];\n const a32 = this.data[6];\n const a42 = this.data[7];\n const sine = Math.sin(angle);\n const cosine = Math.cos(angle);\n this.data[0] = cosine * a11 + sine * a12;\n this.data[1] = cosine * a21 + sine * a22;\n this.data[2] = cosine * a31 + sine * a32;\n this.data[3] = cosine * a41 + sine * a42;\n this.data[4] = cosine * a12 - sine * a11;\n this.data[5] = cosine * a22 - sine * a21;\n this.data[6] = cosine * a32 - sine * a31;\n this.data[7] = cosine * a42 - sine * a41;\n return this;\n }\n /**\n * Applies scaling to the current matrix mutating it\n * @param x\n * @param y\n */\n scale(x, y) {\n const a11 = this.data[0];\n const a21 = this.data[1];\n const a31 = this.data[2];\n const a41 = this.data[3];\n const a12 = this.data[4];\n const a22 = this.data[5];\n const a32 = this.data[6];\n const a42 = this.data[7];\n this.data[0] = a11 * x;\n this.data[1] = a21 * x;\n this.data[2] = a31 * x;\n this.data[3] = a41 * x;\n this.data[4] = a12 * y;\n this.data[5] = a22 * y;\n this.data[6] = a32 * y;\n this.data[7] = a42 * y;\n return this;\n }\n setRotation(angle) {\n const currentScale = this.getScale();\n const sine = Math.sin(angle);\n const cosine = Math.cos(angle);\n this.data[0] = cosine * currentScale.x;\n this.data[1] = sine * currentScale.y;\n this.data[4] = -sine * currentScale.x;\n this.data[5] = cosine * currentScale.y;\n }\n getRotation() {\n const angle = Math.atan2(this.data[1] / this.getScaleY(), this.data[0] / this.getScaleX());\n return (0,_util__WEBPACK_IMPORTED_MODULE_1__.canonicalizeAngle)(angle);\n }\n getScaleX() {\n // absolute scale of the matrix (we lose sign so need to add it back)\n const xscale = (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.data[0], this.data[4]).magnitude;\n return this._scaleSignX * xscale;\n }\n getScaleY() {\n // absolute scale of the matrix (we lose sign so need to add it back)\n const yscale = (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.data[1], this.data[5]).magnitude;\n return this._scaleSignY * yscale;\n }\n /**\n * Get the scale of the matrix\n */\n getScale() {\n return (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.getScaleX(), this.getScaleY());\n }\n setScaleX(val) {\n if (this._scaleX === val) {\n return;\n }\n this._scaleSignX = (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(val);\n // negative scale acts like a 180 rotation, so flip\n const xscale = (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.data[0] * this._scaleSignX, this.data[4] * this._scaleSignX).normalize();\n this.data[0] = xscale.x * val;\n this.data[4] = xscale.y * val;\n this._scaleX = val;\n }\n setScaleY(val) {\n if (this._scaleY === val) {\n return;\n }\n this._scaleSignY = (0,_util__WEBPACK_IMPORTED_MODULE_1__.sign)(val);\n // negative scale acts like a 180 rotation, so flip\n const yscale = (0,_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(this.data[1] * this._scaleSignY, this.data[5] * this._scaleSignY).normalize();\n this.data[1] = yscale.x * val;\n this.data[5] = yscale.y * val;\n this._scaleY = val;\n }\n setScale(scale) {\n this.setScaleX(scale.x);\n this.setScaleY(scale.y);\n }\n /**\n * Determinant of the upper left 2x2 matrix\n */\n getBasisDeterminant() {\n return this.data[0] * this.data[5] - this.data[1] * this.data[4];\n }\n /**\n * Return the affine inverse, optionally store it in a target matrix.\n *\n * It's recommended you call .reset() the target unless you know what you're doing\n * @param target\n */\n getAffineInverse(target) {\n // See http://negativeprobability.blogspot.com/2011/11/affine-transformations-and-their.html\n // See https://www.mathsisfun.com/algebra/matrix-inverse.html\n // Since we are actually only doing 2D transformations we can use this hack\n // We don't actually use the 3rd or 4th dimension\n const det = this.getBasisDeterminant();\n const inverseDet = 1 / det; // todo zero check\n const a = this.data[0];\n const b = this.data[4];\n const c = this.data[1];\n const d = this.data[5];\n const m = target || Matrix.identity();\n // inverts rotation and scale\n m.data[0] = d * inverseDet;\n m.data[1] = -c * inverseDet;\n m.data[4] = -b * inverseDet;\n m.data[5] = a * inverseDet;\n const tx = this.data[12];\n const ty = this.data[13];\n // invert translation\n // transform translation into the matrix basis created by rot/scale\n m.data[12] = -(tx * m.data[0] + ty * m.data[4]);\n m.data[13] = -(tx * m.data[1] + ty * m.data[5]);\n return m;\n }\n isIdentity() {\n return (this.data[0] === 1 &&\n this.data[1] === 0 &&\n this.data[2] === 0 &&\n this.data[3] === 0 &&\n this.data[4] === 0 &&\n this.data[5] === 1 &&\n this.data[6] === 0 &&\n this.data[7] === 0 &&\n this.data[8] === 0 &&\n this.data[9] === 0 &&\n this.data[10] === 1 &&\n this.data[11] === 0 &&\n this.data[12] === 0 &&\n this.data[13] === 0 &&\n this.data[14] === 0 &&\n this.data[15] === 1);\n }\n toString() {\n return `\r\n[${this.data[0]} ${this.data[4]} ${this.data[8]} ${this.data[12]}]\r\n[${this.data[1]} ${this.data[5]} ${this.data[9]} ${this.data[13]}]\r\n[${this.data[2]} ${this.data[6]} ${this.data[10]} ${this.data[14]}]\r\n[${this.data[3]} ${this.data[7]} ${this.data[11]} ${this.data[15]}]\r\n`;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/projection.ts\":\n/*!****************************!*\\\n !*** ./Math/projection.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Projection: () => (/* binding */ Projection)\n/* harmony export */ });\n/**\n * A 1 dimensional projection on an axis, used to test overlaps\n */\nclass Projection {\n constructor(min, max) {\n this.min = min;\n this.max = max;\n }\n overlaps(projection) {\n return this.max > projection.min && projection.max > this.min;\n }\n getOverlap(projection) {\n if (this.overlaps(projection)) {\n if (this.max > projection.max) {\n return projection.max - this.min;\n }\n else {\n return this.max - projection.min;\n }\n }\n return 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/ray.ts\":\n/*!*********************!*\\\n !*** ./Math/ray.ts ***!\n \\*********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Ray: () => (/* binding */ Ray)\n/* harmony export */ });\n/**\n * A 2D ray that can be cast into the scene to do collision detection\n */\nclass Ray {\n /**\n * @param pos The starting position for the ray\n * @param dir The vector indicating the direction of the ray\n */\n constructor(pos, dir) {\n this.pos = pos;\n this.dir = dir.normalize();\n }\n /**\n * Tests a whether this ray intersects with a line segment. Returns a number greater than or equal to 0 on success.\n * This number indicates the mathematical intersection time.\n * @param line The line to test\n */\n intersect(line) {\n const numerator = line.begin.sub(this.pos);\n // Test is line and ray are parallel and non intersecting\n if (this.dir.cross(line.getSlope()) === 0 && numerator.cross(this.dir) !== 0) {\n return -1;\n }\n // Lines are parallel\n const divisor = this.dir.cross(line.getSlope());\n if (divisor === 0) {\n return -1;\n }\n const t = numerator.cross(line.getSlope()) / divisor;\n if (t >= 0) {\n const u = numerator.cross(this.dir) / divisor / line.getLength();\n if (u >= 0 && u <= 1) {\n return t;\n }\n }\n return -1;\n }\n intersectPoint(line) {\n const time = this.intersect(line);\n if (time < 0) {\n return null;\n }\n return this.getPoint(time);\n }\n /**\n * Returns the point of intersection given the intersection time\n */\n getPoint(time) {\n return this.pos.add(this.dir.scale(time));\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/rotation-type.ts\":\n/*!*******************************!*\\\n !*** ./Math/rotation-type.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RotationType: () => (/* binding */ RotationType)\n/* harmony export */ });\n/**\n * An enum that describes the strategies that rotation actions can use\n */\nvar RotationType;\n(function (RotationType) {\n /**\n * Rotation via `ShortestPath` will use the smallest angle\n * between the starting and ending points. This strategy is the default behavior.\n */\n RotationType[\"ShortestPath\"] = \"shortest-path\";\n /**\n * Rotation via `LongestPath` will use the largest angle\n * between the starting and ending points.\n */\n RotationType[\"LongestPath\"] = \"longest-path\";\n /**\n * Rotation via `Clockwise` will travel in a clockwise direction,\n * regardless of the starting and ending points.\n */\n RotationType[\"Clockwise\"] = \"clockwise\";\n /**\n * Rotation via `CounterClockwise` will travel in a counterclockwise direction,\n * regardless of the starting and ending points.\n */\n RotationType[\"CounterClockwise\"] = \"counter-clockwise\";\n})(RotationType || (RotationType = {}));\n\n\n/***/ }),\n\n/***/ \"./Math/transform.ts\":\n/*!***************************!*\\\n !*** ./Math/transform.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Transform: () => (/* binding */ Transform)\n/* harmony export */ });\n/* harmony import */ var _affine_matrix__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./affine-matrix */ \"./Math/affine-matrix.ts\");\n/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./util */ \"./Math/util.ts\");\n/* harmony import */ var _vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./vector */ \"./Math/vector.ts\");\n/* harmony import */ var _vector_view__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./vector-view */ \"./Math/vector-view.ts\");\n/* harmony import */ var _watch_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./watch-vector */ \"./Math/watch-vector.ts\");\n\n\n\n\n\nclass Transform {\n constructor() {\n this._parent = null;\n this._children = [];\n this._pos = new _watch_vector__WEBPACK_IMPORTED_MODULE_0__.WatchVector((0,_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0), () => {\n this.flagDirty();\n });\n this._globalPos = new _vector_view__WEBPACK_IMPORTED_MODULE_2__.VectorView({\n getX: () => this.matrix.data[4],\n getY: () => this.matrix.data[5],\n setX: (x) => {\n if (this.parent) {\n const { x: newX } = this.parent.inverse.multiply((0,_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(x, this.pos.y));\n this.pos.x = newX;\n }\n else {\n this.pos.x = x;\n }\n if (x !== this.matrix.data[4]) {\n this.flagDirty();\n }\n },\n setY: (y) => {\n if (this.parent) {\n const { y: newY } = this.parent.inverse.multiply((0,_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(this.pos.x, y));\n this.pos.y = newY;\n }\n else {\n this.pos.y = y;\n }\n if (y !== this.matrix.data[5]) {\n this.flagDirty();\n }\n }\n });\n this._rotation = 0;\n this._scale = new _watch_vector__WEBPACK_IMPORTED_MODULE_0__.WatchVector((0,_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(1, 1), () => {\n this.flagDirty();\n });\n this._globalScale = new _vector_view__WEBPACK_IMPORTED_MODULE_2__.VectorView({\n getX: () => (this.parent ? this.matrix.getScaleX() : this.scale.x),\n getY: () => (this.parent ? this.matrix.getScaleY() : this.scale.y),\n setX: (x) => {\n if (this.parent) {\n const globalScaleX = this.parent.globalScale.x;\n this.scale.x = x / globalScaleX;\n }\n else {\n this.scale.x = x;\n }\n },\n setY: (y) => {\n if (this.parent) {\n const globalScaleY = this.parent.globalScale.y;\n this.scale.y = y / globalScaleY;\n }\n else {\n this.scale.y = y;\n }\n }\n });\n this._z = 0;\n this._isDirty = false;\n this._isInverseDirty = false;\n this._matrix = _affine_matrix__WEBPACK_IMPORTED_MODULE_3__.AffineMatrix.identity();\n this._inverse = _affine_matrix__WEBPACK_IMPORTED_MODULE_3__.AffineMatrix.identity();\n this._scratch = _affine_matrix__WEBPACK_IMPORTED_MODULE_3__.AffineMatrix.identity();\n }\n get parent() {\n return this._parent;\n }\n set parent(transform) {\n if (this._parent) {\n const index = this._parent._children.indexOf(this);\n if (index > -1) {\n this._parent._children.splice(index, 1);\n }\n }\n this._parent = transform;\n if (this._parent) {\n this._parent._children.push(this);\n }\n this.flagDirty();\n }\n get children() {\n return this._children;\n }\n set pos(v) {\n this._pos.x = v.x;\n this._pos.y = v.y;\n }\n get pos() {\n return this._pos;\n }\n set globalPos(v) {\n let localPos = v.clone();\n if (this.parent) {\n localPos = this.parent.inverse.multiply(v);\n }\n if (!localPos.equals(this._pos)) {\n this._pos = localPos;\n this.flagDirty();\n }\n }\n get globalPos() {\n return this._globalPos;\n }\n set rotation(rotation) {\n const canonRotation = (0,_util__WEBPACK_IMPORTED_MODULE_4__.canonicalizeAngle)(rotation);\n if (canonRotation !== this._rotation) {\n this.flagDirty();\n }\n this._rotation = canonRotation;\n }\n get rotation() {\n return this._rotation;\n }\n set globalRotation(rotation) {\n let inverseRotation = 0;\n if (this.parent) {\n inverseRotation = this.parent.globalRotation;\n }\n const canonRotation = (0,_util__WEBPACK_IMPORTED_MODULE_4__.canonicalizeAngle)(rotation + inverseRotation);\n if (canonRotation !== this._rotation) {\n this.flagDirty();\n }\n this._rotation = canonRotation;\n }\n get globalRotation() {\n if (this.parent) {\n return this.matrix.getRotation();\n }\n return this.rotation;\n }\n set scale(v) {\n this._scale.x = v.x;\n this._scale.y = v.y;\n }\n get scale() {\n return this._scale;\n }\n set globalScale(v) {\n let inverseScale = (0,_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(1, 1);\n if (this.parent) {\n inverseScale = this.parent.globalScale;\n }\n this.scale = v.scale((0,_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(1 / inverseScale.x, 1 / inverseScale.y));\n }\n get globalScale() {\n return this._globalScale;\n }\n set z(z) {\n this._z = z;\n this.flagDirty();\n }\n get z() {\n return this._z;\n }\n set globalZ(z) {\n if (this.parent) {\n this.z = z - this.parent.globalZ;\n }\n else {\n this.z = z;\n }\n }\n get globalZ() {\n if (this.parent) {\n return this.z + this.parent.globalZ;\n }\n return this.z;\n }\n /**\n * Calculates and returns the matrix representation of this transform\n *\n * Avoid mutating the matrix to update the transform, it is not the source of truth.\n * Update the transform pos, rotation, scale.\n */\n get matrix() {\n if (this._isDirty) {\n if (this.parent === null) {\n this._calculateMatrix().clone(this._matrix);\n }\n else {\n this.parent.matrix.multiply(this._calculateMatrix()).clone(this._matrix);\n }\n this._isDirty = false;\n }\n return this._matrix;\n }\n /**\n * Calculates and returns the inverse matrix representation of this transform\n */\n get inverse() {\n if (this._isInverseDirty) {\n this.matrix.inverse(this._inverse);\n this._isInverseDirty = false;\n }\n return this._inverse;\n }\n _calculateMatrix() {\n this._scratch.data[0] = Math.cos(this._rotation);\n this._scratch.data[1] = Math.sin(this._rotation);\n this._scratch.data[2] = -Math.sin(this._rotation);\n this._scratch.data[3] = Math.cos(this.rotation);\n this._scratch.data[4] = this._pos.x;\n this._scratch.data[5] = this._pos.y;\n this._scratch.scale(this._scale.x, this._scale.y);\n return this._scratch;\n }\n flagDirty() {\n this._isDirty = true;\n this._isInverseDirty = true;\n for (let i = 0; i < this._children.length; i++) {\n this._children[i].flagDirty();\n }\n }\n apply(point) {\n return this.matrix.multiply(point);\n }\n applyInverse(point) {\n return this.inverse.multiply(point);\n }\n setTransform(pos, rotation, scale) {\n this._pos.x = pos.x;\n this._pos.y = pos.y;\n this._rotation = (0,_util__WEBPACK_IMPORTED_MODULE_4__.canonicalizeAngle)(rotation);\n this._scale.x = scale.x;\n this._scale.y = scale.y;\n this.flagDirty();\n }\n /**\n * Returns true if the transform has a negative x scale or y scale, but not both\n */\n isMirrored() {\n const signBitX = (0,_util__WEBPACK_IMPORTED_MODULE_4__.sign)(this.scale.x) >>> 31;\n const signBitY = (0,_util__WEBPACK_IMPORTED_MODULE_4__.sign)(this.scale.y) >>> 31;\n const mirrored = signBitX ^ signBitY;\n return !!mirrored;\n }\n /**\n * Clones the current transform\n * **Warning does not clone the parent**\n * @param dest\n */\n clone(dest) {\n const target = dest !== null && dest !== void 0 ? dest : new Transform();\n this._pos.clone(target._pos);\n target._z = this._z;\n target._rotation = this._rotation;\n this._scale.clone(target._scale);\n target.flagDirty();\n return target;\n }\n /**\n * Clones but keeps the same parent reference\n */\n cloneWithParent(dest) {\n const target = dest !== null && dest !== void 0 ? dest : new Transform();\n this._pos.clone(target._pos);\n target._z = this._z;\n target._rotation = this._rotation;\n this._scale.clone(target._scale);\n target.parent = this.parent;\n target.flagDirty();\n return target;\n }\n toString() {\n return this.matrix.toString();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/util.ts\":\n/*!**********************!*\\\n !*** ./Math/util.ts ***!\n \\**********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TwoPI: () => (/* binding */ TwoPI),\n/* harmony export */ approximatelyEqual: () => (/* binding */ approximatelyEqual),\n/* harmony export */ canonicalizeAngle: () => (/* binding */ canonicalizeAngle),\n/* harmony export */ clamp: () => (/* binding */ clamp),\n/* harmony export */ frac: () => (/* binding */ frac),\n/* harmony export */ randomInRange: () => (/* binding */ randomInRange),\n/* harmony export */ randomIntInRange: () => (/* binding */ randomIntInRange),\n/* harmony export */ range: () => (/* binding */ range),\n/* harmony export */ sign: () => (/* binding */ sign),\n/* harmony export */ toDegrees: () => (/* binding */ toDegrees),\n/* harmony export */ toRadians: () => (/* binding */ toRadians)\n/* harmony export */ });\n/* harmony import */ var _Random__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Random */ \"./Math/Random.ts\");\n\n/**\n * Two PI constant\n */\nconst TwoPI = Math.PI * 2;\n/**\n * Returns the fractional part of a number\n * @param x\n */\nfunction frac(x) {\n if (x >= 0) {\n return x - Math.floor(x);\n }\n else {\n return x - Math.ceil(x);\n }\n}\n/**\n * Returns the sign of a number, if 0 returns 0\n */\nfunction sign(val) {\n if (val === 0) {\n return 0;\n }\n return val < 0 ? -1 : 1;\n}\n/**\n * Clamps a value between a min and max inclusive\n */\nfunction clamp(val, min, max) {\n return Math.min(Math.max(min, val), max);\n}\n/**\n * Approximately equals\n */\nfunction approximatelyEqual(val1, val2, tolerance) {\n // https://dev.to/alldanielscott/how-to-compare-numbers-correctly-in-javascript-1l4i\n return Math.abs(val1 - val2) < tolerance;\n}\n/**\n * Convert an angle to be the equivalent in the range [0, 2PI)\n */\nfunction canonicalizeAngle(angle) {\n let tmpAngle = angle;\n if (angle >= TwoPI) {\n while (tmpAngle >= TwoPI) {\n tmpAngle -= TwoPI;\n }\n }\n if (angle < 0) {\n while (tmpAngle < 0) {\n tmpAngle += TwoPI;\n }\n }\n return tmpAngle;\n}\n/**\n * Convert radians to degrees\n */\nfunction toDegrees(radians) {\n return (180 / Math.PI) * radians;\n}\n/**\n * Convert degrees to radians\n */\nfunction toRadians(degrees) {\n return (degrees / 180) * Math.PI;\n}\n/**\n * Generate a range of numbers\n * For example: range(0, 5) -> [0, 1, 2, 3, 4, 5]\n * @param from inclusive\n * @param to inclusive\n */\nconst range = (from, to) => Array.from(new Array(to - from + 1), (_x, i) => i + from);\n/**\n * Find a random floating point number in range\n */\nfunction randomInRange(min, max, random = new _Random__WEBPACK_IMPORTED_MODULE_0__.Random()) {\n return random ? random.floating(min, max) : min + Math.random() * (max - min);\n}\n/**\n * Find a random integer in a range\n */\nfunction randomIntInRange(min, max, random = new _Random__WEBPACK_IMPORTED_MODULE_0__.Random()) {\n return random ? random.integer(min, max) : Math.round(randomInRange(min, max));\n}\n\n\n/***/ }),\n\n/***/ \"./Math/vector-view.ts\":\n/*!*****************************!*\\\n !*** ./Math/vector-view.ts ***!\n \\*****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ VectorView: () => (/* binding */ VectorView)\n/* harmony export */ });\n/* harmony import */ var _vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vector */ \"./Math/vector.ts\");\n\nclass VectorView extends _vector__WEBPACK_IMPORTED_MODULE_0__.Vector {\n constructor(options) {\n super(0, 0);\n this._getX = options.getX;\n this._getY = options.getY;\n this._setX = options.setX;\n this._setY = options.setY;\n }\n get x() {\n return (this._x = this._getX());\n }\n set x(val) {\n this._setX(val);\n this._x = val;\n }\n get y() {\n return (this._y = this._getY());\n }\n set y(val) {\n this._setY(val);\n this._y = val;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Math/vector.ts\":\n/*!************************!*\\\n !*** ./Math/vector.ts ***!\n \\************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Vector: () => (/* binding */ Vector),\n/* harmony export */ vec: () => (/* binding */ vec)\n/* harmony export */ });\n/* harmony import */ var _rotation_type__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./rotation-type */ \"./Math/rotation-type.ts\");\n/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./util */ \"./Math/util.ts\");\n\n\n/**\n * A 2D vector on a plane.\n */\nclass Vector {\n /**\n * A (0, 0) vector\n */\n static get Zero() {\n return new Vector(0, 0);\n }\n /**\n * A (1, 1) vector\n */\n static get One() {\n return new Vector(1, 1);\n }\n /**\n * A (0.5, 0.5) vector\n */\n static get Half() {\n return new Vector(0.5, 0.5);\n }\n /**\n * A unit vector pointing up (0, -1)\n */\n static get Up() {\n return new Vector(0, -1);\n }\n /**\n * A unit vector pointing down (0, 1)\n */\n static get Down() {\n return new Vector(0, 1);\n }\n /**\n * A unit vector pointing left (-1, 0)\n */\n static get Left() {\n return new Vector(-1, 0);\n }\n /**\n * A unit vector pointing right (1, 0)\n */\n static get Right() {\n return new Vector(1, 0);\n }\n /**\n * Returns a vector of unit length in the direction of the specified angle in Radians.\n * @param angle The angle to generate the vector\n */\n static fromAngle(angle) {\n return new Vector(Math.cos(angle), Math.sin(angle));\n }\n /**\n * Checks if vector is not null, undefined, or if any of its components are NaN or Infinity.\n */\n static isValid(vec) {\n if (vec === null || vec === undefined) {\n return false;\n }\n if (isNaN(vec.x) || isNaN(vec.y)) {\n return false;\n }\n if (vec.x === Infinity || vec.y === Infinity || vec.x === -Infinity || vec.y === -Infinity) {\n return false;\n }\n return true;\n }\n /**\n * Calculates distance between two Vectors\n * @param vec1\n * @param vec2\n */\n static distance(vec1, vec2) {\n return Math.sqrt(Math.pow(vec1.x - vec2.x, 2) + Math.pow(vec1.y - vec2.y, 2));\n }\n static min(vec1, vec2) {\n return new Vector(Math.min(vec1.x, vec2.x), Math.min(vec1.y, vec2.y));\n }\n static max(vec1, vec2) {\n return new Vector(Math.max(vec1.x, vec2.x), Math.max(vec1.y, vec2.y));\n }\n /**\n * @param x X component of the Vector\n * @param y Y component of the Vector\n */\n constructor(x, y) {\n this._x = 0;\n this._y = 0;\n this._x = x;\n this._y = y;\n }\n /**\n * Get the x component of the vector\n */\n get x() {\n return this._x;\n }\n /**\n * Set the x component, THIS MUTATES the current vector. It is usually better to create a new vector.\n * @warning **Be very careful setting components on shared vectors, mutating shared vectors can cause hard to find bugs**\n */\n set x(val) {\n this._x = val;\n }\n /**\n * Get the y component of the vector\n */\n get y() {\n return this._y;\n }\n /**\n * Set the y component, THIS MUTATES the current vector. It is usually better to create a new vector.\n * @warning **Be very careful setting components on shared vectors, mutating shared vectors can cause hard to find bugs**\n */\n set y(val) {\n this._y = val;\n }\n /**\n * Sets the x and y components at once, THIS MUTATES the current vector. It is usually better to create a new vector.\n * @warning **Be very careful using this, mutating vectors can cause hard to find bugs**\n */\n setTo(x, y) {\n this.x = x;\n this.y = y;\n }\n /**\n * Compares this point against another and tests for equality\n * @param vector The other point to compare to\n * @param tolerance Amount of euclidean distance off we are willing to tolerate\n */\n equals(vector, tolerance = Vector.EQUALS_EPSILON) {\n return Math.abs(this.x - vector.x) <= tolerance && Math.abs(this.y - vector.y) <= tolerance;\n }\n /**\n * The distance to another vector. If no other Vector is specified, this will return the {@apilink magnitude}.\n * @param v The other vector. Leave blank to use origin vector.\n */\n distance(v) {\n if (!v) {\n return Math.sqrt(this.x * this.x + this.y * this.y);\n }\n const deltaX = this.x - v.x;\n const deltaY = this.y - v.y;\n return Math.sqrt(deltaX * deltaX + deltaY * deltaY);\n }\n squareDistance(v) {\n if (!v) {\n v = Vector.Zero;\n }\n const deltaX = this.x - v.x;\n const deltaY = this.y - v.y;\n return deltaX * deltaX + deltaY * deltaY;\n }\n /**\n * Clamps the current vector's magnitude mutating it\n * @param magnitude\n */\n clampMagnitude(magnitude) {\n const size = this.magnitude;\n const newSize = (0,_util__WEBPACK_IMPORTED_MODULE_0__.clamp)(size, 0, magnitude);\n this.magnitude = newSize;\n return this;\n }\n /**\n * The size (magnitude) of the Vector\n * @deprecated Will be removed in v1, use Vector.magnitude\n */\n get size() {\n return this.distance();\n }\n /**\n * Setting the size mutates the current vector\n * @warning Can be used to set the size of the vector, **be very careful using this, mutating vectors can cause hard to find bugs**\n * @deprecated Will be removed in v1, use Vector.magnitude\n */\n set size(newLength) {\n const v = this.normalize().scale(newLength);\n this.setTo(v.x, v.y);\n }\n /**\n * The magnitude (length) of the Vector\n */\n get magnitude() {\n return this.distance();\n }\n /**\n * Setting the size mutates the current vector\n * @warning Can be used to set the size of the vector, **be very careful using this, mutating vectors can cause hard to find bugs**\n */\n set magnitude(newMagnitude) {\n this.normalize().scale(newMagnitude, this);\n }\n /**\n * Normalizes a non-zero vector to have a magnitude of 1. Zero vectors return a new zero vector.\n */\n normalize() {\n const distance = this.distance();\n if (distance === 0) {\n return Vector.Zero;\n }\n return new Vector(this.x / distance, this.y / distance);\n }\n /**\n * Returns the average (midpoint) between the current point and the specified\n */\n average(vec) {\n return this.add(vec).scale(0.5);\n }\n scale(sizeOrScale, dest) {\n const result = dest || new Vector(0, 0);\n if (sizeOrScale instanceof Vector) {\n result.x = this.x * sizeOrScale.x;\n result.y = this.y * sizeOrScale.y;\n }\n else {\n result.x = this.x * sizeOrScale;\n result.y = this.y * sizeOrScale;\n }\n return result;\n }\n /**\n * Adds one vector to another\n * @param v The vector to add\n * @param dest Optionally copy the result into a provided vector\n */\n add(v, dest) {\n if (dest) {\n dest.x = this.x + v.x;\n dest.y = this.y + v.y;\n return dest;\n }\n return new Vector(this.x + v.x, this.y + v.y);\n }\n /**\n * Subtracts a vector from another, if you subtract vector `B.sub(A)` the resulting vector points from A -> B\n * @param v The vector to subtract\n */\n sub(v, dest) {\n const result = dest || new Vector(0, 0);\n const x = this.x - v.x;\n const y = this.y - v.y;\n result.x = x;\n result.y = y;\n return result;\n }\n /**\n * Adds one vector to this one modifying the original\n * @param v The vector to add\n * @warning Be very careful using this, mutating vectors can cause hard to find bugs\n */\n addEqual(v) {\n this.setTo(this.x + v.x, this.y + v.y);\n return this;\n }\n /**\n * Subtracts a vector from this one modifying the original\n * @param v The vector to subtract\n * @warning Be very careful using this, mutating vectors can cause hard to find bugs\n */\n subEqual(v) {\n this.setTo(this.x - v.x, this.y - v.y);\n return this;\n }\n /**\n * Scales this vector by a factor of size and modifies the original\n * @warning Be very careful using this, mutating vectors can cause hard to find bugs\n */\n scaleEqual(size) {\n this.setTo(this.x * size, this.y * size);\n return this;\n }\n /**\n * Performs a dot product with another vector\n * @param v The vector to dot\n */\n dot(v) {\n return this.x * v.x + this.y * v.y;\n }\n cross(v) {\n if (v instanceof Vector) {\n return this.x * v.y - this.y * v.x;\n }\n else if (typeof v === 'number') {\n return new Vector(v * this.y, -v * this.x);\n }\n }\n static cross(num, vec) {\n return new Vector(-num * vec.y, num * vec.x);\n }\n /**\n * Returns the perpendicular vector to this one\n */\n perpendicular() {\n return new Vector(this.y, -this.x);\n }\n /**\n * Returns the normal vector to this one, same as the perpendicular of length 1\n */\n normal() {\n return this.perpendicular().normalize();\n }\n /**\n * Negate the current vector\n */\n negate() {\n return this.scale(-1);\n }\n /**\n * Returns the angle of this vector, in range [0, 2*PI)\n */\n toAngle() {\n return (0,_util__WEBPACK_IMPORTED_MODULE_0__.canonicalizeAngle)(Math.atan2(this.y, this.x));\n }\n /**\n * Returns the difference in radians between the angle of this vector and given angle,\n * using the given rotation type.\n * @param angle in radians to which the vector has to be rotated, using {@apilink rotate}\n * @param rotationType what {@apilink RotationType} to use for the rotation\n * @returns the angle by which the vector needs to be rotated to match the given angle\n */\n angleBetween(angle, rotationType) {\n const startAngleRadians = this.toAngle();\n const endAngleRadians = (0,_util__WEBPACK_IMPORTED_MODULE_0__.canonicalizeAngle)(angle);\n let rotationClockwise = 0;\n let rotationAntiClockwise = 0;\n if (endAngleRadians > startAngleRadians) {\n rotationClockwise = endAngleRadians - startAngleRadians;\n }\n else {\n rotationClockwise = (_util__WEBPACK_IMPORTED_MODULE_0__.TwoPI - startAngleRadians + endAngleRadians) % _util__WEBPACK_IMPORTED_MODULE_0__.TwoPI;\n }\n rotationAntiClockwise = (rotationClockwise - _util__WEBPACK_IMPORTED_MODULE_0__.TwoPI) % _util__WEBPACK_IMPORTED_MODULE_0__.TwoPI;\n switch (rotationType) {\n case _rotation_type__WEBPACK_IMPORTED_MODULE_1__.RotationType.ShortestPath:\n if (Math.abs(rotationClockwise) < Math.abs(rotationAntiClockwise)) {\n return rotationClockwise;\n }\n else {\n return rotationAntiClockwise;\n }\n case _rotation_type__WEBPACK_IMPORTED_MODULE_1__.RotationType.LongestPath:\n if (Math.abs(rotationClockwise) > Math.abs(rotationAntiClockwise)) {\n return rotationClockwise;\n }\n else {\n return rotationAntiClockwise;\n }\n case _rotation_type__WEBPACK_IMPORTED_MODULE_1__.RotationType.Clockwise:\n return rotationClockwise;\n case _rotation_type__WEBPACK_IMPORTED_MODULE_1__.RotationType.CounterClockwise:\n return rotationAntiClockwise;\n }\n }\n /**\n * Rotates the current vector around a point by a certain angle in radians.\n * Positive angle means rotation clockwise.\n */\n rotate(angle, anchor, dest) {\n const result = dest || new Vector(0, 0);\n if (!anchor) {\n anchor = new Vector(0, 0);\n }\n const sinAngle = Math.sin(angle);\n const cosAngle = Math.cos(angle);\n const x = cosAngle * (this.x - anchor.x) - sinAngle * (this.y - anchor.y) + anchor.x;\n const y = sinAngle * (this.x - anchor.x) + cosAngle * (this.y - anchor.y) + anchor.y;\n result.x = x;\n result.y = y;\n return result;\n }\n /**\n * Creates new vector that has the same values as the previous.\n */\n clone(dest) {\n const v = dest !== null && dest !== void 0 ? dest : new Vector(0, 0);\n v.x = this.x;\n v.y = this.y;\n return v;\n }\n /**\n * Returns a string representation of the vector.\n */\n toString(fixed) {\n if (fixed) {\n return `(${this.x.toFixed(fixed)}, ${this.y.toFixed(fixed)})`;\n }\n return `(${this.x}, ${this.y})`;\n }\n}\n/**\n * Get or set the vector equals epsilon, by default 0.001 meaning vectors within that tolerance on x or y will be considered equal.\n */\nVector.EQUALS_EPSILON = 0.001;\n/**\n * Shorthand for creating new Vectors - returns a new Vector instance with the\n * provided X and Y components.\n * @param x X component of the Vector\n * @param y Y component of the Vector\n */\nfunction vec(x, y) {\n return new Vector(x, y);\n}\n\n\n/***/ }),\n\n/***/ \"./Math/watch-vector.ts\":\n/*!******************************!*\\\n !*** ./Math/watch-vector.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ WatchVector: () => (/* binding */ WatchVector)\n/* harmony export */ });\n/* harmony import */ var _vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vector */ \"./Math/vector.ts\");\n\n/**\n * Wraps a vector and watches for changes in the x/y, modifies the original vector.\n */\nclass WatchVector extends _vector__WEBPACK_IMPORTED_MODULE_0__.Vector {\n constructor(original, change) {\n super(original.x, original.y);\n this.original = original;\n this.change = change;\n }\n get x() {\n return (this._x = this.original.x);\n }\n set x(newX) {\n if (newX !== this._x) {\n this.change(newX, this._y);\n this._x = this.original.x = newX;\n }\n }\n get y() {\n return (this._y = this.original.y);\n }\n set y(newY) {\n if (newY !== this._y) {\n this.change(this._x, newY);\n this._y = this.original.y = newY;\n }\n }\n setTo(x, y) {\n this.x = x;\n this.y = y;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Particles/EmitterType.ts\":\n/*!**********************************!*\\\n !*** ./Particles/EmitterType.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EmitterType: () => (/* binding */ EmitterType)\n/* harmony export */ });\n/**\n * An enum that represents the types of emitter nozzles\n */\nvar EmitterType;\n(function (EmitterType) {\n /**\n * Constant for the circular emitter type\n */\n EmitterType[\"Circle\"] = \"circle\";\n /**\n * Constant for the rectangular emitter type\n */\n EmitterType[\"Rectangle\"] = \"rectangle\";\n})(EmitterType || (EmitterType = {}));\n\n\n/***/ }),\n\n/***/ \"./Particles/GpuParticleEmitter.ts\":\n/*!*****************************************!*\\\n !*** ./Particles/GpuParticleEmitter.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ GpuParticleEmitter: () => (/* binding */ GpuParticleEmitter)\n/* harmony export */ });\n/* harmony import */ var _Actor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Actor */ \"./Actor.ts\");\n/* harmony import */ var _EmitterType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./EmitterType */ \"./Particles/EmitterType.ts\");\n/* harmony import */ var _Particles__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Particles */ \"./Particles/Particles.ts\");\n/* harmony import */ var _GpuParticleRenderer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./GpuParticleRenderer */ \"./Particles/GpuParticleRenderer.ts\");\n/* harmony import */ var _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Graphics/GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Math_Random__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Math/Random */ \"./Math/Random.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Math */ \"./Math/util.ts\");\n\n\n\n\n\n\n\n\nclass GpuParticleEmitter extends _Actor__WEBPACK_IMPORTED_MODULE_0__.Actor {\n get pos() {\n return this.transform.pos;\n }\n set pos(pos) {\n this.transform.pos = pos;\n }\n get z() {\n return this.transform.z;\n }\n set z(z) {\n this.transform.z = z;\n }\n constructor(config) {\n super({ name: `GpuParticleEmitter`, width: config.width, height: config.height }); // somewhat goofy way of doing width/height\n this.particle = {\n /**\n * Gets or sets the life of each particle in milliseconds\n */\n life: 2000,\n transform: _Particles__WEBPACK_IMPORTED_MODULE_1__.ParticleTransform.Global,\n graphic: undefined,\n opacity: 1,\n angularVelocity: 0,\n focus: undefined,\n focusAccel: undefined,\n randomRotation: false\n };\n this.graphics = new _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_2__.GraphicsComponent();\n this.isEmitting = false;\n this.emitRate = 1;\n this.emitterType = _EmitterType__WEBPACK_IMPORTED_MODULE_3__.EmitterType.Rectangle;\n this.radius = 0;\n this.maxParticles = 2000;\n this._particlesToEmit = 0;\n this.addComponent(this.graphics, true);\n this.graphics.onPostDraw = this.draw.bind(this);\n const { particle, maxParticles, x, y, z, pos, isEmitting, emitRate, emitterType, radius, random } = { ...config };\n this.maxParticles = (0,_Math__WEBPACK_IMPORTED_MODULE_4__.clamp)(maxParticles !== null && maxParticles !== void 0 ? maxParticles : this.maxParticles, 0, _GpuParticleRenderer__WEBPACK_IMPORTED_MODULE_5__.GpuParticleRenderer.GPU_MAX_PARTICLES);\n this.pos = pos !== null && pos !== void 0 ? pos : (0,_Math_vector__WEBPACK_IMPORTED_MODULE_6__.vec)(x !== null && x !== void 0 ? x : 0, y !== null && y !== void 0 ? y : 0);\n this.z = z !== null && z !== void 0 ? z : 0;\n this.isEmitting = isEmitting !== null && isEmitting !== void 0 ? isEmitting : this.isEmitting;\n this.emitRate = emitRate !== null && emitRate !== void 0 ? emitRate : this.emitRate;\n this.emitterType = emitterType !== null && emitterType !== void 0 ? emitterType : this.emitterType;\n this.radius = radius !== null && radius !== void 0 ? radius : this.radius;\n this.particle = { ...this.particle, ...particle };\n this.random = random !== null && random !== void 0 ? random : new _Math_Random__WEBPACK_IMPORTED_MODULE_7__.Random();\n this.renderer = new _GpuParticleRenderer__WEBPACK_IMPORTED_MODULE_5__.GpuParticleRenderer(this, this.random, this.particle);\n }\n _initialize(engine) {\n super._initialize(engine);\n const context = engine.graphicsContext;\n this.renderer.initialize(context.__gl, context);\n }\n update(engine, elapsed) {\n super.update(engine, elapsed);\n if (this.isEmitting) {\n this._particlesToEmit += this.emitRate * (elapsed / 1000);\n if (this._particlesToEmit > 1.0) {\n this.emitParticles(Math.floor(this._particlesToEmit));\n this._particlesToEmit = this._particlesToEmit - Math.floor(this._particlesToEmit);\n }\n }\n this.renderer.update(elapsed);\n }\n emitParticles(particleCount) {\n if (particleCount <= 0) {\n return;\n }\n this.renderer.emitParticles(particleCount | 0); // coerce to integer\n }\n clearParticles() {\n this.renderer.clearParticles();\n }\n draw(ctx, elapsed) {\n ctx.draw('ex.particle', this.renderer, elapsed);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Particles/GpuParticleRenderer.ts\":\n/*!******************************************!*\\\n !*** ./Particles/GpuParticleRenderer.ts ***!\n \\******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ GpuParticleRenderer: () => (/* binding */ GpuParticleRenderer)\n/* harmony export */ });\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Particles__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Particles */ \"./Particles/Particles.ts\");\n/* harmony import */ var _EmitterType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./EmitterType */ \"./Particles/EmitterType.ts\");\n/* harmony import */ var _Util_Assert__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Util/Assert */ \"./Util/Assert.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n\n\n\n\n\n/**\n * Container for the GPU Particle State contains the internal state needed for the GPU\n * to render particles and maintain state.\n */\nclass GpuParticleRenderer {\n constructor(emitter, random, options) {\n var _a;\n this.emitRate = 1;\n this._initialized = false;\n this._vaos = [];\n this._buffers = [];\n this._drawIndex = 0;\n this._numInputFloats = 2 + 2 + 1 + 1 + 1;\n this._particleIndex = 0;\n this._uploadIndex = 0;\n this._wrappedLife = 0;\n this._wrappedParticles = 0;\n this._particleLife = 0;\n this._clearRequested = false;\n this._emitted = [];\n this.emitter = emitter;\n this.particle = options;\n this._particleData = new Float32Array(this.emitter.maxParticles * this._numInputFloats);\n this._random = random;\n this._particleLife = (_a = this.particle.life) !== null && _a !== void 0 ? _a : 2000;\n }\n get isInitialized() {\n return this._initialized;\n }\n get maxParticles() {\n return this.emitter.maxParticles;\n }\n initialize(gl, context) {\n if (this._initialized) {\n return;\n }\n const numParticles = this.emitter.maxParticles;\n const numInputFloats = this._numInputFloats;\n const particleData = this._particleData;\n const bytesPerFloat = 4;\n const particleDataBuffer1 = gl.createBuffer();\n const vao1 = gl.createVertexArray();\n gl.bindVertexArray(vao1);\n gl.bindBuffer(gl.ARRAY_BUFFER, particleDataBuffer1);\n gl.bufferData(gl.ARRAY_BUFFER, numParticles * numInputFloats * bytesPerFloat, gl.DYNAMIC_DRAW);\n gl.bufferSubData(gl.ARRAY_BUFFER, 0, particleData);\n let offset = 0;\n // position\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, numInputFloats * bytesPerFloat, 0);\n offset += bytesPerFloat * 2;\n // velocity\n gl.vertexAttribPointer(1, 2, gl.FLOAT, false, numInputFloats * bytesPerFloat, offset);\n offset += bytesPerFloat * 2;\n // rotation\n gl.vertexAttribPointer(2, 1, gl.FLOAT, false, numInputFloats * bytesPerFloat, offset);\n offset += bytesPerFloat * 1;\n // angularVelocity\n gl.vertexAttribPointer(3, 1, gl.FLOAT, false, numInputFloats * bytesPerFloat, offset);\n offset += bytesPerFloat * 1;\n // life\n gl.vertexAttribPointer(4, 1, gl.FLOAT, false, numInputFloats * bytesPerFloat, offset);\n offset += bytesPerFloat * 1;\n // enable attributes\n gl.enableVertexAttribArray(0);\n gl.enableVertexAttribArray(1);\n gl.enableVertexAttribArray(2);\n gl.enableVertexAttribArray(3);\n gl.enableVertexAttribArray(4);\n this._vaos.push(vao1);\n this._buffers.push(particleDataBuffer1);\n // Clean up\n gl.bindVertexArray(null);\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n const particleDataBuffer2 = gl.createBuffer();\n const vao2 = gl.createVertexArray();\n gl.bindVertexArray(vao2);\n gl.bindBuffer(gl.ARRAY_BUFFER, particleDataBuffer2);\n gl.bufferData(gl.ARRAY_BUFFER, numParticles * numInputFloats * bytesPerFloat, gl.DYNAMIC_DRAW);\n offset = 0;\n // position\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, numInputFloats * bytesPerFloat, 0);\n offset += bytesPerFloat * 2;\n // velocity\n gl.vertexAttribPointer(1, 2, gl.FLOAT, false, numInputFloats * bytesPerFloat, offset);\n offset += bytesPerFloat * 2;\n // rotation\n gl.vertexAttribPointer(2, 1, gl.FLOAT, false, numInputFloats * bytesPerFloat, offset);\n offset += bytesPerFloat * 1;\n // angularVelocity\n gl.vertexAttribPointer(3, 1, gl.FLOAT, false, numInputFloats * bytesPerFloat, offset);\n offset += bytesPerFloat * 1;\n // life\n gl.vertexAttribPointer(4, 1, gl.FLOAT, false, numInputFloats * bytesPerFloat, offset);\n offset += bytesPerFloat * 1;\n // enable attributes\n gl.enableVertexAttribArray(0);\n gl.enableVertexAttribArray(1);\n gl.enableVertexAttribArray(2);\n gl.enableVertexAttribArray(3);\n gl.enableVertexAttribArray(4);\n this._vaos.push(vao2);\n this._buffers.push(particleDataBuffer2);\n // Clean up\n gl.bindVertexArray(null);\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n this._currentVao = this._vaos[this._drawIndex % 2];\n this._currentBuffer = this._buffers[(this._drawIndex + 1) % 2];\n this._initialized = true;\n }\n clearParticles() {\n this._particleData.fill(0);\n this._clearRequested = true;\n }\n emitParticles(particleCount) {\n const startIndex = this._particleIndex;\n const maxSize = this.maxParticles * this._numInputFloats;\n const endIndex = particleCount * this._numInputFloats + startIndex;\n let countParticle = 0;\n for (let i = startIndex; i < endIndex; i += this._numInputFloats) {\n const angle = this._random.floating(this.particle.minAngle || 0, this.particle.maxAngle || _Math_util__WEBPACK_IMPORTED_MODULE_0__.TwoPI);\n const speedX = this._random.floating(this.particle.minSpeed || 0, this.particle.maxSpeed || 0);\n const speedY = this._random.floating(this.particle.minSpeed || 0, this.particle.maxSpeed || 0);\n const dx = speedX * Math.cos(angle);\n const dy = speedY * Math.sin(angle);\n let ranX = 0;\n let ranY = 0;\n if (this.emitter.emitterType === _EmitterType__WEBPACK_IMPORTED_MODULE_1__.EmitterType.Rectangle) {\n ranX = this._random.floating(-0.5, 0.5) * this.emitter.width;\n ranY = this._random.floating(-0.5, 0.5) * this.emitter.height;\n }\n else {\n const radius = this._random.floating(0, this.emitter.radius);\n ranX = radius * Math.cos(angle);\n ranY = radius * Math.sin(angle);\n }\n const tx = this.emitter.transform.apply((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(ranX, ranY));\n const data = [\n this.particle.transform === _Particles__WEBPACK_IMPORTED_MODULE_3__.ParticleTransform.Local ? ranX : tx.x,\n this.particle.transform === _Particles__WEBPACK_IMPORTED_MODULE_3__.ParticleTransform.Local ? ranY : tx.y, // pos in world space\n dx,\n dy, // velocity\n this.particle.randomRotation ? (0,_Math_util__WEBPACK_IMPORTED_MODULE_0__.randomInRange)(0, _Math_util__WEBPACK_IMPORTED_MODULE_0__.TwoPI, this._random) : this.particle.rotation || 0, // rotation\n this.particle.angularVelocity || 0, // angular velocity\n this._particleLife // life\n ];\n countParticle++;\n this._particleData.set(data, i % this._particleData.length);\n }\n if (endIndex >= maxSize) {\n this._wrappedParticles += (endIndex - maxSize) / this._numInputFloats;\n this._wrappedLife = this._particleLife;\n }\n else if (this._wrappedLife > 0) {\n this._wrappedParticles += particleCount;\n }\n this._particleIndex = endIndex % maxSize;\n this._emitted.push([this._particleLife, startIndex]);\n }\n _uploadEmitted(gl) {\n // upload index is the index of the previous upload\n // particle index is the current index of modification\n if (this._particleIndex !== this._uploadIndex) {\n // Bind one buffer to ARRAY_BUFFER and the other to TFB\n gl.bindBuffer(gl.ARRAY_BUFFER, this._buffers[(this._drawIndex + 1) % 2]);\n if (this._particleIndex >= this._uploadIndex) {\n gl.bufferSubData(gl.ARRAY_BUFFER, this._uploadIndex * 4, // dst byte offset 4 bytes per float\n this._particleData, this._uploadIndex, this._particleIndex - this._uploadIndex);\n }\n else {\n // upload before the wrap\n // prettier-ignore\n gl.bufferSubData(gl.ARRAY_BUFFER, this._uploadIndex * 4, this._particleData, this._uploadIndex, this._particleData.length - this._uploadIndex);\n // upload after the wrap if there are any\n if (this._wrappedParticles) {\n // prettier-ignore\n gl.bufferSubData(gl.ARRAY_BUFFER, 0, this._particleData, 0, this._wrappedParticles * this._numInputFloats);\n }\n this._wrappedLife = this._particleLife;\n }\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n }\n this._uploadIndex = this._particleIndex % (this.maxParticles * this._numInputFloats);\n }\n update(elapsed) {\n var _a;\n this._particleLife = (_a = this.particle.life) !== null && _a !== void 0 ? _a : this._particleLife;\n if (this._wrappedLife > 0) {\n this._wrappedLife -= elapsed;\n }\n else {\n this._wrappedLife = 0;\n this._wrappedParticles = 0;\n }\n if (!this._emitted.length) {\n return;\n }\n for (let i = this._emitted.length - 1; i >= 0; i--) {\n const particle = this._emitted[i];\n particle[0] -= elapsed;\n const life = particle[0];\n if (life <= 0) {\n this._emitted.splice(i, 1);\n }\n }\n this._emitted.sort((a, b) => a[0] - b[0]);\n }\n draw(gl) {\n if (this._initialized) {\n // Emit\n if (this._clearRequested) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this._buffers[(this._drawIndex + 1) % 2]);\n gl.bufferSubData(gl.ARRAY_BUFFER, 0, this._particleData);\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n this._clearRequested = false;\n }\n else {\n this._uploadEmitted(gl);\n }\n // Bind one buffer to ARRAY_BUFFER and the other to transform feedback buffer\n gl.bindVertexArray(this._currentVao);\n gl.bindBufferBase(gl.TRANSFORM_FEEDBACK_BUFFER, 0, this._currentBuffer);\n // Perform transform feedback (run the simulation) and the draw call all at once\n if (this._wrappedLife && this._emitted[0] && this._emitted[0][1] > 0) {\n const midpoint = this._emitted[0][1] / this._numInputFloats;\n // draw oldest first (maybe make configurable)\n (0,_Util_Assert__WEBPACK_IMPORTED_MODULE_4__.assert)(`midpoint greater than 0, actual: ${midpoint}`, () => midpoint > 0);\n (0,_Util_Assert__WEBPACK_IMPORTED_MODULE_4__.assert)(`midpoint is less than max, actual: ${midpoint}`, () => midpoint < this.maxParticles);\n gl.bindBufferRange(gl.TRANSFORM_FEEDBACK_BUFFER, 0, this._currentBuffer, this._emitted[0][1] * 4, (this.maxParticles - midpoint) * this._numInputFloats * 4);\n gl.beginTransformFeedback(gl.POINTS);\n gl.drawArrays(gl.POINTS, midpoint, this.maxParticles - midpoint);\n gl.endTransformFeedback();\n // then draw newer particles\n gl.bindBufferRange(gl.TRANSFORM_FEEDBACK_BUFFER, 0, this._currentBuffer, 0, this._emitted[0][1] * 4);\n gl.beginTransformFeedback(gl.POINTS);\n gl.drawArrays(gl.POINTS, 0, midpoint);\n gl.endTransformFeedback();\n }\n else {\n gl.bindBufferRange(gl.TRANSFORM_FEEDBACK_BUFFER, 0, this._currentBuffer, 0, this._particleData.length * 4);\n gl.beginTransformFeedback(gl.POINTS);\n gl.drawArrays(gl.POINTS, 0, this.maxParticles);\n gl.endTransformFeedback();\n }\n // Clean up after ourselves to avoid errors.\n gl.bindVertexArray(null);\n gl.bindBufferBase(gl.TRANSFORM_FEEDBACK_BUFFER, 0, null);\n // flip flop buffers, one will be draw the other simulation\n this._currentVao = this._vaos[this._drawIndex % 2];\n this._currentBuffer = this._buffers[(this._drawIndex + 1) % 2];\n this._drawIndex = (this._drawIndex + 1) % 2;\n }\n }\n}\nGpuParticleRenderer.GPU_MAX_PARTICLES = 100000;\n\n\n/***/ }),\n\n/***/ \"./Particles/ParticleEmitter.ts\":\n/*!**************************************!*\\\n !*** ./Particles/ParticleEmitter.ts ***!\n \\**************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ParticleEmitter: () => (/* binding */ ParticleEmitter)\n/* harmony export */ });\n/* harmony import */ var _Actor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Actor */ \"./Actor.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Math_Random__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Math/Random */ \"./Math/Random.ts\");\n/* harmony import */ var _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Collision/CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _EmitterType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./EmitterType */ \"./Particles/EmitterType.ts\");\n/* harmony import */ var _Particles__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Particles */ \"./Particles/Particles.ts\");\n/* harmony import */ var _Util_RentalPool__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/RentalPool */ \"./Util/RentalPool.ts\");\n\n\n\n\n\n\n\n\n/**\n * Using a particle emitter is a great way to create interesting effects\n * in your game, like smoke, fire, water, explosions, etc. `ParticleEmitter`\n * extend {@apilink Actor} allowing you to use all of the features that come with.\n *\n * These particles are simulated on the CPU in JavaScript\n */\nclass ParticleEmitter extends _Actor__WEBPACK_IMPORTED_MODULE_0__.Actor {\n /**\n * @param config particle emitter options bag\n */\n constructor(config) {\n var _a, _b;\n super({ width: (_a = config.width) !== null && _a !== void 0 ? _a : 0, height: (_b = config.height) !== null && _b !== void 0 ? _b : 0 });\n this._particlesToEmit = 0;\n this._particlePool = new _Util_RentalPool__WEBPACK_IMPORTED_MODULE_1__.RentalPool(() => new _Particles__WEBPACK_IMPORTED_MODULE_2__.Particle({}), (p) => p, 500);\n this.numParticles = 0;\n /**\n * Gets or sets the isEmitting flag\n */\n this.isEmitting = true;\n /**\n * Gets or sets the backing deadParticle collection\n */\n this.deadParticles = [];\n /**\n * Gets or sets the emission rate for particles (particles/sec)\n */\n this.emitRate = 1; //particles/sec\n /**\n * Gets or sets the emitter type for the particle emitter\n */\n this.emitterType = _EmitterType__WEBPACK_IMPORTED_MODULE_3__.EmitterType.Rectangle;\n /**\n * Gets or sets the emitter radius, only takes effect when the {@apilink emitterType} is {@apilink EmitterType.Circle}\n */\n this.radius = 0;\n this.particle = {\n /**\n * Gets or sets the life of each particle in milliseconds\n */\n life: 2000,\n transform: _Particles__WEBPACK_IMPORTED_MODULE_2__.ParticleTransform.Global,\n graphic: undefined,\n opacity: 1,\n angularVelocity: 0,\n focus: undefined,\n focusAccel: undefined,\n randomRotation: false\n };\n this._activeParticles = [];\n const { particle, x, y, z, pos, isEmitting, emitRate, emitterType, radius, random } = { ...config };\n this.particle = { ...this.particle, ...particle };\n this.pos = pos !== null && pos !== void 0 ? pos : (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(x !== null && x !== void 0 ? x : 0, y !== null && y !== void 0 ? y : 0);\n this.z = z !== null && z !== void 0 ? z : 0;\n this.isEmitting = isEmitting !== null && isEmitting !== void 0 ? isEmitting : this.isEmitting;\n this.emitRate = emitRate !== null && emitRate !== void 0 ? emitRate : this.emitRate;\n this.emitterType = emitterType !== null && emitterType !== void 0 ? emitterType : this.emitterType;\n this.radius = radius !== null && radius !== void 0 ? radius : this.radius;\n this.body.collisionType = _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_5__.CollisionType.PreventCollision;\n this.random = random !== null && random !== void 0 ? random : new _Math_Random__WEBPACK_IMPORTED_MODULE_6__.Random();\n }\n removeParticle(particle) {\n this.deadParticles.push(particle);\n }\n /**\n * Causes the emitter to emit particles\n * @param particleCount Number of particles to emit right now\n */\n emitParticles(particleCount) {\n var _a;\n if (particleCount <= 0) {\n return;\n }\n particleCount = particleCount | 0; // coerce to int\n for (let i = 0; i < particleCount; i++) {\n const p = this._createParticle();\n if ((_a = this === null || this === void 0 ? void 0 : this.scene) === null || _a === void 0 ? void 0 : _a.world) {\n if (this.particle.transform === _Particles__WEBPACK_IMPORTED_MODULE_2__.ParticleTransform.Global) {\n this.scene.world.add(p);\n }\n else {\n this.addChild(p);\n }\n }\n this._activeParticles.push(p);\n }\n }\n clearParticles() {\n for (let i = 0; i < this._activeParticles.length; i++) {\n this.removeParticle(this._activeParticles[i]);\n }\n }\n // Creates a new particle given the constraints of the emitter\n _createParticle() {\n let ranX = 0;\n let ranY = 0;\n const angle = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.randomInRange)(this.particle.minAngle || 0, this.particle.maxAngle || Math.PI * 2, this.random);\n const vel = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.randomInRange)(this.particle.minSpeed || 0, this.particle.maxSpeed || 0, this.random);\n const size = this.particle.startSize || (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.randomInRange)(this.particle.minSize || 5, this.particle.maxSize || 5, this.random);\n const dx = vel * Math.cos(angle);\n const dy = vel * Math.sin(angle);\n if (this.emitterType === _EmitterType__WEBPACK_IMPORTED_MODULE_3__.EmitterType.Rectangle) {\n ranX = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.randomInRange)(0, this.width, this.random);\n ranY = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.randomInRange)(0, this.height, this.random);\n }\n else if (this.emitterType === _EmitterType__WEBPACK_IMPORTED_MODULE_3__.EmitterType.Circle) {\n const radius = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.randomInRange)(0, this.radius, this.random);\n ranX = radius * Math.cos(angle);\n ranY = radius * Math.sin(angle);\n }\n const p = this._particlePool.rent();\n p.configure({\n life: this.particle.life,\n opacity: this.particle.opacity,\n beginColor: this.particle.beginColor,\n endColor: this.particle.endColor,\n pos: (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(ranX, ranY),\n vel: (0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(dx, dy),\n acc: this.particle.acc,\n angularVelocity: this.particle.angularVelocity,\n startSize: this.particle.startSize,\n endSize: this.particle.endSize,\n size: size,\n graphic: this.particle.graphic,\n fade: this.particle.fade\n });\n p.registerEmitter(this);\n if (this.particle.randomRotation) {\n p.transform.rotation = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.randomInRange)(0, Math.PI * 2, this.random);\n }\n if (this.particle.focus) {\n p.focus = this.particle.focus.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_4__.vec)(this.pos.x, this.pos.y));\n p.focusAccel = this.particle.focusAccel;\n }\n return p;\n }\n update(engine, elapsed) {\n var _a;\n super.update(engine, elapsed);\n if (this.isEmitting) {\n this._particlesToEmit += this.emitRate * (elapsed / 1000);\n if (this._particlesToEmit > 1.0) {\n this.emitParticles(Math.floor(this._particlesToEmit));\n this._particlesToEmit = this._particlesToEmit - Math.floor(this._particlesToEmit);\n }\n }\n // deferred removal\n for (let i = 0; i < this.deadParticles.length; i++) {\n if ((_a = this === null || this === void 0 ? void 0 : this.scene) === null || _a === void 0 ? void 0 : _a.world) {\n this.scene.world.remove(this.deadParticles[i], false);\n this._particlePool.return(this.deadParticles[i]);\n }\n const index = this._activeParticles.indexOf(this.deadParticles[i]);\n if (index > -1) {\n this._activeParticles.splice(index, 1);\n }\n }\n this.deadParticles.length = 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Particles/Particles.ts\":\n/*!********************************!*\\\n !*** ./Particles/Particles.ts ***!\n \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Particle: () => (/* binding */ Particle),\n/* harmony export */ ParticleTransform: () => (/* binding */ ParticleTransform)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Graphics/GraphicsComponent */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _Collision_Integrator__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Collision/Integrator */ \"./Collision/Integrator.ts\");\n\n\n\n\n\n\n\n\n\n/**\n/**\n * CPU Particle is used in a {@apilink ParticleEmitter}\n */\nclass Particle extends _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__.Entity {\n constructor(options) {\n super({ silenceWarnings: true });\n this.beginColor = _Color__WEBPACK_IMPORTED_MODULE_1__.Color.White;\n this.endColor = _Color__WEBPACK_IMPORTED_MODULE_1__.Color.White;\n // Life is counted in ms\n this.life = 300;\n this.fade = false;\n // Color transitions\n this._rRate = 1;\n this._gRate = 1;\n this._bRate = 1;\n this._aRate = 0;\n this._currentColor = _Color__WEBPACK_IMPORTED_MODULE_1__.Color.White;\n this.size = 5;\n this.sizeRate = 0;\n this.visible = true;\n this.isOffscreen = false;\n this.particleTransform = ParticleTransform.Global;\n this.name = `Particle#${this.id}`;\n this.addComponent((this.transform = new _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent()));\n this.addComponent((this.motion = new _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_3__.MotionComponent()));\n this.addComponent((this.graphics = new _Graphics_GraphicsComponent__WEBPACK_IMPORTED_MODULE_4__.GraphicsComponent()));\n this.configure(options);\n }\n registerEmitter(emitter) {\n this._emitter = emitter;\n if (this.particleTransform === ParticleTransform.Global) {\n const globalPos = this._emitter.transform.globalPos;\n this.transform.pos = this.transform.pos.add(globalPos);\n this.motion.vel = this.motion.vel.rotate(this._emitter.transform.globalRotation);\n }\n }\n configure(options) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;\n this.particleTransform = (_a = options.transform) !== null && _a !== void 0 ? _a : this.particleTransform;\n this.life = (_b = options.life) !== null && _b !== void 0 ? _b : this.life;\n this.fade = (_c = options.fade) !== null && _c !== void 0 ? _c : this.fade;\n this.size = (_d = options.size) !== null && _d !== void 0 ? _d : this.size;\n this.endColor = (_e = options.endColor) !== null && _e !== void 0 ? _e : this.endColor.clone();\n this.beginColor = (_f = options.beginColor) !== null && _f !== void 0 ? _f : this.beginColor.clone();\n this._currentColor = this.beginColor.clone();\n this.graphic = options.graphic;\n this.graphics.opacity = (_g = options.opacity) !== null && _g !== void 0 ? _g : this.graphics.opacity;\n this.transform.pos = (_h = options.pos) !== null && _h !== void 0 ? _h : this.transform.pos;\n this.transform.rotation = (_j = options.rotation) !== null && _j !== void 0 ? _j : 0;\n this.transform.scale = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_5__.vec)(1, 1);\n this.motion.vel = (_k = options.vel) !== null && _k !== void 0 ? _k : this.motion.vel;\n this.motion.angularVelocity = (_l = options.angularVelocity) !== null && _l !== void 0 ? _l : 0;\n this.motion.acc = (_m = options.acc) !== null && _m !== void 0 ? _m : this.motion.acc;\n this._rRate = (this.endColor.r - this.beginColor.r) / this.life;\n this._gRate = (this.endColor.g - this.beginColor.g) / this.life;\n this._bRate = (this.endColor.b - this.beginColor.b) / this.life;\n this._aRate = this.graphics.opacity / this.life;\n this.startSize = (_o = options.startSize) !== null && _o !== void 0 ? _o : 0;\n this.endSize = (_p = options.endSize) !== null && _p !== void 0 ? _p : 0;\n if (this.endSize > 0 && this.startSize > 0) {\n this.sizeRate = (this.endSize - this.startSize) / this.life;\n this.size = this.startSize;\n }\n if (this.graphic) {\n this.graphics.use(this.graphic);\n this.graphics.onPostDraw = undefined;\n }\n else {\n this.graphics.localBounds = _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox.fromDimension(this.size, this.size, _Math_vector__WEBPACK_IMPORTED_MODULE_5__.Vector.Half);\n this.graphics.onPostDraw = (ctx) => {\n ctx.save();\n ctx.debug.drawPoint((0,_Math_vector__WEBPACK_IMPORTED_MODULE_5__.vec)(0, 0), { color: this._currentColor, size: this.size });\n ctx.restore();\n };\n }\n }\n kill() {\n var _a;\n if ((_a = this._emitter) === null || _a === void 0 ? void 0 : _a.isActive) {\n this._emitter.removeParticle(this);\n }\n else {\n super.kill();\n }\n }\n update(engine, elapsed) {\n this.life = this.life - elapsed;\n if (this.life < 0) {\n this.kill();\n }\n if (this.fade) {\n this.graphics.opacity = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.clamp)(this._aRate * this.life, 0.0001, 1);\n }\n if (this.startSize && this.endSize && this.startSize > 0 && this.endSize > 0) {\n this.size = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.clamp)(this.sizeRate * elapsed + this.size, Math.min(this.startSize, this.endSize), Math.max(this.startSize, this.endSize));\n }\n this._currentColor.r = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.clamp)(this._currentColor.r + this._rRate * elapsed, 0, 255);\n this._currentColor.g = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.clamp)(this._currentColor.g + this._gRate * elapsed, 0, 255);\n this._currentColor.b = (0,_Math_util__WEBPACK_IMPORTED_MODULE_7__.clamp)(this._currentColor.b + this._bRate * elapsed, 0, 255);\n this._currentColor.a = this.graphics.opacity;\n let accel = this.motion.acc;\n if (this.focus) {\n accel = this.focus\n .sub(this.transform.pos)\n .normalize()\n .scale(this.focusAccel || 0)\n .scale(elapsed / 1000);\n }\n // Update transform and motion based on Euler linear algebra\n _Collision_Integrator__WEBPACK_IMPORTED_MODULE_8__.EulerIntegrator.integrate(this.transform, this.motion, accel, elapsed);\n }\n}\nParticle.DefaultConfig = {\n beginColor: _Color__WEBPACK_IMPORTED_MODULE_1__.Color.White,\n endColor: _Color__WEBPACK_IMPORTED_MODULE_1__.Color.White,\n life: 300,\n fade: false,\n size: 5,\n graphic: undefined,\n startSize: undefined,\n endSize: undefined\n};\nvar ParticleTransform;\n(function (ParticleTransform) {\n /**\n * {@apilink ParticleTransform.Global} is the default and emits particles as if\n * they were world space objects, useful for most effects.\n */\n ParticleTransform[\"Global\"] = \"global\";\n /**\n * {@apilink ParticleTransform.Local} particles are children of the emitter and move relative to the emitter\n * as they would in a parent/child actor relationship.\n */\n ParticleTransform[\"Local\"] = \"local\";\n})(ParticleTransform || (ParticleTransform = {}));\n\n\n/***/ }),\n\n/***/ \"./Particles/index.ts\":\n/*!****************************!*\\\n !*** ./Particles/index.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EmitterType: () => (/* reexport safe */ _EmitterType__WEBPACK_IMPORTED_MODULE_0__.EmitterType),\n/* harmony export */ GpuParticleEmitter: () => (/* reexport safe */ _GpuParticleEmitter__WEBPACK_IMPORTED_MODULE_3__.GpuParticleEmitter),\n/* harmony export */ GpuParticleRenderer: () => (/* reexport safe */ _GpuParticleRenderer__WEBPACK_IMPORTED_MODULE_4__.GpuParticleRenderer),\n/* harmony export */ Particle: () => (/* reexport safe */ _Particles__WEBPACK_IMPORTED_MODULE_1__.Particle),\n/* harmony export */ ParticleEmitter: () => (/* reexport safe */ _ParticleEmitter__WEBPACK_IMPORTED_MODULE_2__.ParticleEmitter),\n/* harmony export */ ParticleTransform: () => (/* reexport safe */ _Particles__WEBPACK_IMPORTED_MODULE_1__.ParticleTransform)\n/* harmony export */ });\n/* harmony import */ var _EmitterType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./EmitterType */ \"./Particles/EmitterType.ts\");\n/* harmony import */ var _Particles__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Particles */ \"./Particles/Particles.ts\");\n/* harmony import */ var _ParticleEmitter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ParticleEmitter */ \"./Particles/ParticleEmitter.ts\");\n/* harmony import */ var _GpuParticleEmitter__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./GpuParticleEmitter */ \"./Particles/GpuParticleEmitter.ts\");\n/* harmony import */ var _GpuParticleRenderer__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./GpuParticleRenderer */ \"./Particles/GpuParticleRenderer.ts\");\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Polyfill.ts\":\n/*!*********************!*\\\n !*** ./Polyfill.ts ***!\n \\*********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ polyfill: () => (/* binding */ polyfill)\n/* harmony export */ });\n/**\n * Polyfill adding function\n */\nfunction polyfill() {\n /* istanbul ignore next */\n if (typeof window === 'undefined') {\n window = {\n audioContext: function () {\n return;\n }\n };\n }\n /* istanbul ignore next */\n if (typeof window !== 'undefined' && !window.requestAnimationFrame) {\n window.requestAnimationFrame =\n window.webkitRequestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n function (callback) {\n window.setInterval(callback, 1000 / 60);\n };\n }\n /* istanbul ignore next */\n if (typeof window !== 'undefined' && !window.cancelAnimationFrame) {\n window.cancelAnimationFrame =\n window.webkitCancelAnimationFrame ||\n window.mozCancelAnimationFrame ||\n function () {\n return;\n };\n }\n /* istanbul ignore next */\n if (typeof window !== 'undefined' && !window.AudioContext) {\n if (window.webkitAudioContext) {\n const ctx = window.webkitAudioContext;\n const replaceMe = ctx.prototype.decodeAudioData;\n window.webkitAudioContext.prototype.decodeAudioData = function (arrayBuffer) {\n return new Promise((resolve, reject) => {\n replaceMe.call(this, arrayBuffer, resolve, reject);\n });\n };\n }\n window.AudioContext =\n window.AudioContext ||\n window.webkitAudioContext ||\n window.mozAudioContext ||\n window.msAudioContext ||\n window.oAudioContext;\n }\n /* istanbul ignore next */\n if (typeof window !== 'undefined' && !window.devicePixelRatio) {\n window.devicePixelRatio = window.devicePixelRatio || 1;\n }\n /* istanbul ignore next */\n if (typeof window !== 'undefined' && !window.requestIdleCallback) {\n // Adapted from https://developer.chrome.com/blog/using-requestidlecallback#checking_for_requestidlecallback\n window.requestIdleCallback =\n window.requestIdleCallback ||\n function (cb) {\n const start = Date.now();\n return setTimeout(function () {\n cb({\n didTimeout: false,\n timeRemaining: function () {\n return Math.max(0, 50 - (Date.now() - start));\n }\n });\n }, 1);\n };\n window.cancelIdleCallback =\n window.cancelIdleCallback ||\n function (id) {\n clearTimeout(id);\n };\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Resources/Font.ts\":\n/*!***************************!*\\\n !*** ./Resources/Font.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FontSource: () => (/* binding */ FontSource)\n/* harmony export */ });\n/* harmony import */ var _Graphics_Font__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Graphics/Font */ \"./Graphics/Font.ts\");\n/* harmony import */ var _Resource__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Resource */ \"./Resources/Resource.ts\");\n\n\nclass FontSource {\n constructor(\n /**\n * Path to the font resource relative from the HTML document hosting the game, or absolute\n */\n path, \n /**\n * The font family name\n */\n family, { bustCache, ...options } = {}) {\n this.path = path;\n this.family = family;\n this._isLoaded = false;\n this._resource = new _Resource__WEBPACK_IMPORTED_MODULE_0__.Resource(path, 'blob', bustCache);\n this._options = options;\n }\n async load() {\n if (this.isLoaded()) {\n return this.data;\n }\n try {\n const blob = await this._resource.load();\n const url = URL.createObjectURL(blob);\n if (!this.data) {\n this.data = new FontFace(this.family, `url(${url})`);\n document.fonts.add(this.data);\n }\n await this.data.load();\n this._isLoaded = true;\n }\n catch (error) {\n throw `Error loading FontSource from path '${this.path}' with error [${error.message}]`;\n }\n return this.data;\n }\n isLoaded() {\n return this._isLoaded;\n }\n /**\n * Build a font from this FontSource.\n * @param options {FontOptions} Override the font options\n */\n toFont(options) {\n return new _Graphics_Font__WEBPACK_IMPORTED_MODULE_1__.Font({ family: this.family, ...this._options, ...options });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Resources/Gif.ts\":\n/*!**************************!*\\\n !*** ./Resources/Gif.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Gif: () => (/* binding */ Gif),\n/* harmony export */ GifParser: () => (/* binding */ GifParser),\n/* harmony export */ Stream: () => (/* binding */ Stream)\n/* harmony export */ });\n/* harmony import */ var _Resource__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Resource */ \"./Resources/Resource.ts\");\n/* harmony import */ var _Graphics_SpriteSheet__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Graphics/SpriteSheet */ \"./Graphics/SpriteSheet.ts\");\n/* harmony import */ var _Graphics_Animation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Graphics/Animation */ \"./Graphics/Animation.ts\");\n/* harmony import */ var _Graphics_ImageSource__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Graphics/ImageSource */ \"./Graphics/ImageSource.ts\");\n\n\n\n\n/**\n * The {@apilink Texture} object allows games built in Excalibur to load image resources.\n * {@apilink Texture} is an {@apilink Loadable} which means it can be passed to a {@apilink Loader}\n * to pre-load before starting a level or game.\n */\nclass Gif {\n /**\n * @param path Path to the image resource\n * @param bustCache Optionally load texture with cache busting\n */\n constructor(path, bustCache = false) {\n this.path = path;\n /**\n * The width of the texture in pixels\n */\n this.width = 0;\n /**\n * The height of the texture in pixels\n */\n this.height = 0;\n this._images = [];\n this.data = [];\n this._sprites = [];\n this._resource = new _Resource__WEBPACK_IMPORTED_MODULE_0__.Resource(path, 'arraybuffer', bustCache);\n }\n /**\n * Should excalibur add a cache busting querystring? By default false.\n * Must be set before loading\n */\n get bustCache() {\n return this._resource.bustCache;\n }\n set bustCache(val) {\n this._resource.bustCache = val;\n }\n /**\n * Begins loading the texture and returns a promise to be resolved on completion\n */\n async load() {\n const arraybuffer = await this._resource.load();\n this._stream = new Stream(arraybuffer);\n this._gif = new GifParser(this._stream);\n const images = this._gif.images.map((i) => new _Graphics_ImageSource__WEBPACK_IMPORTED_MODULE_1__.ImageSource(i.src, false));\n // Load all textures\n await Promise.all(images.map((t) => t.load()));\n this.data = this._images = images;\n this._sprites = this._images.map((image) => {\n return image.toSprite();\n });\n return this.data;\n }\n isLoaded() {\n return !!this.data;\n }\n /**\n * Return a frame of the gif as a sprite by id\n * @param id\n */\n toSprite(id = 0) {\n var _a;\n return (_a = this._sprites[id]) !== null && _a !== void 0 ? _a : null;\n }\n /**\n * Return the gif as a spritesheet\n */\n toSpriteSheet() {\n const sprites = this._sprites;\n if (sprites.length) {\n return new _Graphics_SpriteSheet__WEBPACK_IMPORTED_MODULE_2__.SpriteSheet({ sprites });\n }\n return null;\n }\n /**\n * Transform the GIF into an animation with duration per frame\n * @param durationPerFrame Optionally override duration per frame\n */\n toAnimation(durationPerFrame) {\n var _a;\n const images = (_a = this._gif) === null || _a === void 0 ? void 0 : _a.images;\n if (images === null || images === void 0 ? void 0 : images.length) {\n const frames = images.map((image, index) => {\n var _a;\n return {\n graphic: this._sprites[index],\n duration: ((_a = this._gif) === null || _a === void 0 ? void 0 : _a.frames[index].delayMs) || undefined\n };\n });\n this._animation = new _Graphics_Animation__WEBPACK_IMPORTED_MODULE_3__.Animation({\n frames,\n frameDuration: durationPerFrame\n });\n return this._animation;\n }\n return null;\n }\n get readCheckBytes() {\n var _a, _b;\n return (_b = (_a = this._gif) === null || _a === void 0 ? void 0 : _a.checkBytes) !== null && _b !== void 0 ? _b : [];\n }\n}\nconst bitsToNum = (ba) => {\n return ba.reduce(function (s, n) {\n return s * 2 + n;\n }, 0);\n};\nconst byteToBitArr = (bite) => {\n const a = [];\n for (let i = 7; i >= 0; i--) {\n a.push(!!(bite & (1 << i)));\n }\n return a;\n};\nclass Stream {\n constructor(dataArray) {\n this.len = 0;\n this.position = 0;\n this.readByte = () => {\n if (this.position >= this.data.byteLength) {\n throw new Error('Attempted to read past end of stream.');\n }\n return this.data[this.position++];\n };\n this.readBytes = (n) => {\n const bytes = [];\n for (let i = 0; i < n; i++) {\n bytes.push(this.readByte());\n }\n return bytes;\n };\n this.read = (n) => {\n let s = '';\n for (let i = 0; i < n; i++) {\n s += String.fromCharCode(this.readByte());\n }\n return s;\n };\n this.readUnsigned = () => {\n // Little-endian.\n const a = this.readBytes(2);\n return (a[1] << 8) + a[0];\n };\n this.data = new Uint8Array(dataArray);\n this.len = this.data.byteLength;\n if (this.len === 0) {\n throw new Error('No data loaded from file');\n }\n }\n}\nconst lzwDecode = function (minCodeSize, data) {\n // TODO: Now that the GIF parser is a bit different, maybe this should get an array of bytes instead of a String?\n let pos = 0; // Maybe this streaming thing should be merged with the Stream?\n const readCode = function (size) {\n let code = 0;\n for (let i = 0; i < size; i++) {\n if (data.charCodeAt(pos >> 3) & (1 << (pos & 7))) {\n code |= 1 << i;\n }\n pos++;\n }\n return code;\n };\n const output = [];\n const clearCode = 1 << minCodeSize;\n const eoiCode = clearCode + 1;\n let codeSize = minCodeSize + 1;\n let dict = [];\n const clear = function () {\n dict = [];\n codeSize = minCodeSize + 1;\n for (let i = 0; i < clearCode; i++) {\n dict[i] = [i];\n }\n dict[clearCode] = [];\n dict[eoiCode] = null;\n };\n let code = 0;\n let last = 0;\n while (true) {\n last = code;\n code = readCode(codeSize);\n if (code === clearCode) {\n clear();\n continue;\n }\n if (code === eoiCode) {\n break;\n }\n if (code < dict.length) {\n if (last !== clearCode) {\n dict.push(dict[last].concat(dict[code][0]));\n }\n }\n else {\n if (code !== dict.length) {\n throw new Error('Invalid LZW code.');\n }\n dict.push(dict[last].concat(dict[last][0]));\n }\n output.push.apply(output, dict[code]);\n if (dict.length === 1 << codeSize && codeSize < 12) {\n // If we're at the last code and codeSize is 12, the next code will be a clearCode, and it'll be 12 bits long.\n codeSize++;\n }\n }\n // I don't know if this is technically an error, but some GIFs do it.\n //if (Math.ceil(pos / 8) !== data.length) throw new Error('Extraneous LZW bytes.');\n return output;\n};\n/**\n * GifParser for binary format\n *\n * Roughly based on the documentation https://giflib.sourceforge.net/whatsinagif/index.html\n */\nclass GifParser {\n constructor(stream) {\n this._handler = {};\n this.frames = [];\n this.images = [];\n this.globalColorTableBytes = [];\n this.checkBytes = [];\n this.parseColorTableBytes = (entries) => {\n // Each entry is 3 bytes, for RGB.\n const colorTable = [];\n for (let i = 0; i < entries; i++) {\n const rgb = this._st.readBytes(3);\n colorTable.push(rgb);\n }\n return colorTable;\n };\n this.readSubBlocks = () => {\n let size, data;\n data = '';\n do {\n size = this._st.readByte();\n data += this._st.read(size);\n } while (size !== 0);\n return data;\n };\n this.parseHeader = () => {\n const hdr = {\n sig: '',\n ver: '',\n width: 0,\n height: 0,\n colorResolution: 0,\n globalColorTableSize: 0,\n gctFlag: false,\n sortedFlag: false,\n globalColorTable: [],\n backgroundColorIndex: 0,\n pixelAspectRatio: 0 // if not 0, aspectRatio = (pixelAspectRatio + 15) / 64\n };\n hdr.sig = this._st.read(3);\n hdr.ver = this._st.read(3);\n if (hdr.sig !== 'GIF') {\n throw new Error('Not a GIF file.'); // XXX: This should probably be handled more nicely.\n }\n hdr.width = this._st.readUnsigned();\n hdr.height = this._st.readUnsigned();\n this._currentFrameCanvas.width = hdr.width;\n this._currentFrameCanvas.height = hdr.height;\n const bits = byteToBitArr(this._st.readByte());\n hdr.gctFlag = bits.shift();\n hdr.colorResolution = bitsToNum(bits.splice(0, 3));\n hdr.sortedFlag = bits.shift();\n hdr.globalColorTableSize = bitsToNum(bits.splice(0, 3));\n hdr.backgroundColorIndex = this._st.readByte();\n hdr.pixelAspectRatio = this._st.readByte(); // if not 0, aspectRatio = (pixelAspectRatio + 15) / 64\n if (hdr.gctFlag) {\n // hdr.globalColorTable = this.parseColorTable(1 << (hdr.globalColorTableSize + 1));\n this.globalColorTableBytes = this.parseColorTableBytes(1 << (hdr.globalColorTableSize + 1));\n }\n if (this._handler.hdr && this._handler.hdr(hdr)) {\n this.checkBytes.push(this._handler.hdr);\n }\n };\n this.parseExt = (block) => {\n const parseGCExt = (block) => {\n this.checkBytes.push(this._st.readByte()); // Always 4\n const bits = byteToBitArr(this._st.readByte());\n block.reserved = bits.splice(0, 3); // Reserved; should be 000.\n block.disposalMethod = bitsToNum(bits.splice(0, 3));\n block.userInputFlag = bits.shift();\n block.transparentColorFlag = bits.shift();\n block.delayTime = this._st.readUnsigned();\n block.transparentColorIndex = this._st.readByte();\n block.terminator = this._st.readByte(); // always 0\n if (this._handler.gce && this._handler.gce(block)) {\n this.checkBytes.push(this._handler.gce);\n }\n return block;\n };\n const parseComExt = (block) => {\n block.comment = this.readSubBlocks();\n if (this._handler.com && this._handler.com(block)) {\n this.checkBytes.push(this._handler.com);\n }\n };\n const parsePTExt = (block) => {\n this.checkBytes.push(this._st.readByte()); // Always 12\n block.ptHeader = this._st.readBytes(12);\n block.ptData = this.readSubBlocks();\n if (this._handler.pte && this._handler.pte(block)) {\n this.checkBytes.push(this._handler.pte);\n }\n };\n const parseAppExt = (block) => {\n const parseNetscapeExt = (block) => {\n this.checkBytes.push(this._st.readByte()); // Always 3\n block.unknown = this._st.readByte(); // Q: Always 1? What is this?\n block.iterations = this._st.readUnsigned();\n block.terminator = this._st.readByte();\n if (this._handler.app && this._handler.app.NETSCAPE && this._handler.app.NETSCAPE(block)) {\n this.checkBytes.push(this._handler.app);\n }\n };\n const parseUnknownAppExt = (block) => {\n block.appData = this.readSubBlocks();\n // FIXME: This won't work if a handler wants to match on any identifier.\n if (this._handler.app && this._handler.app[block.identifier] && this._handler.app[block.identifier](block)) {\n this.checkBytes.push(this._handler.app[block.identifier]);\n }\n };\n this.checkBytes.push(this._st.readByte()); // Always 11\n block.identifier = this._st.read(8);\n block.authCode = this._st.read(3);\n switch (block.identifier) {\n case 'NETSCAPE':\n parseNetscapeExt(block);\n break;\n default:\n parseUnknownAppExt(block);\n break;\n }\n };\n const parseUnknownExt = (block) => {\n block.data = this.readSubBlocks();\n if (this._handler.unknown && this._handler.unknown(block)) {\n this.checkBytes.push(this._handler.unknown);\n }\n };\n block.label = this._st.readByte();\n switch (block.label) {\n case 0xf9:\n block.extType = 'gce';\n this._gce = parseGCExt(block);\n break;\n case 0xfe:\n block.extType = 'com';\n parseComExt(block);\n break;\n case 0x01:\n block.extType = 'pte';\n parsePTExt(block);\n break;\n case 0xff:\n block.extType = 'app';\n parseAppExt(block);\n break;\n default:\n block.extType = 'unknown';\n parseUnknownExt(block);\n break;\n }\n };\n this.parseImg = (img) => {\n var _a;\n const deinterlace = (pixels, width) => {\n // Of course this defeats the purpose of interlacing. And it's *probably*\n // the least efficient way it's ever been implemented. But nevertheless...\n const newPixels = new Array(pixels.length);\n const rows = pixels.length / width;\n const cpRow = (toRow, fromRow) => {\n const fromPixels = pixels.slice(fromRow * width, (fromRow + 1) * width);\n newPixels.splice.apply(newPixels, [toRow * width, width].concat(fromPixels));\n };\n const offsets = [0, 4, 2, 1];\n const steps = [8, 8, 4, 2];\n let fromRow = 0;\n for (let pass = 0; pass < 4; pass++) {\n for (let toRow = offsets[pass]; toRow < rows; toRow += steps[pass]) {\n cpRow(toRow, fromRow);\n fromRow++;\n }\n }\n return newPixels;\n };\n img.leftPos = this._st.readUnsigned();\n img.topPos = this._st.readUnsigned();\n img.width = this._st.readUnsigned();\n img.height = this._st.readUnsigned();\n const bits = byteToBitArr(this._st.readByte());\n img.lctFlag = bits.shift();\n img.interlaced = bits.shift();\n img.sorted = bits.shift();\n img.reserved = bits.splice(0, 2);\n img.lctSize = bitsToNum(bits.splice(0, 3));\n if (img.lctFlag) {\n img.lctBytes = this.parseColorTableBytes(1 << (img.lctSize + 1));\n }\n img.lzwMinCodeSize = this._st.readByte();\n const lzwData = this.readSubBlocks();\n img.pixels = lzwDecode(img.lzwMinCodeSize, lzwData);\n if (img.interlaced) {\n // Move\n img.pixels = deinterlace(img.pixels, img.width);\n }\n if ((_a = this._gce) === null || _a === void 0 ? void 0 : _a.delayTime) {\n img.delayMs = this._gce.delayTime * 10;\n }\n this.frames.push(img);\n this.arrayToImage(img, img.lctFlag ? img.lctBytes : this.globalColorTableBytes);\n if (this._handler.img && this._handler.img(img)) {\n this.checkBytes.push(this._handler);\n }\n };\n this.parseBlocks = () => {\n const block = {\n sentinel: this._st.readByte(),\n type: ''\n };\n const blockChar = String.fromCharCode(block.sentinel);\n switch (blockChar) {\n case '!':\n block.type = 'ext';\n this.parseExt(block);\n break;\n case ',':\n block.type = 'img';\n this.parseImg(block);\n break;\n case ';':\n block.type = 'eof';\n if (this._handler.eof && this._handler.eof(block)) {\n this.checkBytes.push(this._handler.eof);\n }\n break;\n default:\n throw new Error('Unknown block: 0x' + block.sentinel.toString(16));\n }\n if (block.type !== 'eof') {\n this.parseBlocks();\n }\n };\n this.arrayToImage = (frame, colorTable) => {\n var _a, _b, _c, _d;\n const canvas = document.createElement('canvas');\n canvas.width = frame.width;\n canvas.height = frame.height;\n const context = canvas.getContext('2d');\n const imageData = context.getImageData(0, 0, canvas.width, canvas.height);\n let transparentColorIndex = -1;\n if ((_a = this._gce) === null || _a === void 0 ? void 0 : _a.transparentColorFlag) {\n transparentColorIndex = this._gce.transparentColorIndex;\n }\n for (let pixel = 0; pixel < frame.pixels.length; pixel++) {\n const colorIndex = frame.pixels[pixel];\n const color = colorTable[colorIndex];\n if (colorIndex === transparentColorIndex) {\n imageData.data.set([0, 0, 0, 0], pixel * 4);\n }\n else {\n imageData.data.set([...color, 255], pixel * 4);\n }\n }\n context.putImageData(imageData, 0, 0);\n // A value of 1 which tells the decoder to leave the image in place and draw the next image on top of it.\n // A value of 2 would have meant that the canvas should be restored to the background color (as indicated by the logical screen descriptor).\n // A value of 3 is defined to mean that the decoder should restore the canvas to its previous state before the current image was drawn.\n // The behavior for values 4-7 are yet to be defined.\n if (((_b = this._gce) === null || _b === void 0 ? void 0 : _b.disposalMethod) === 1 && this.images.length) {\n this._currentFrameContext.drawImage(this.images[this.images.length - 1], 0, 0);\n }\n else if (((_c = this._gce) === null || _c === void 0 ? void 0 : _c.disposalMethod) === 2 && ((_d = this._hdr) === null || _d === void 0 ? void 0 : _d.gctFlag)) {\n const bg = colorTable[this._hdr.backgroundColorIndex];\n this._currentFrameContext.fillStyle = `rgb(${bg[0]}, ${bg[1]}, ${bg[2]})`;\n this._currentFrameContext.fillRect(0, 0, this._hdr.width, this._hdr.height);\n }\n else {\n this._currentFrameContext.clearRect(0, 0, this._currentFrameCanvas.width, this._currentFrameCanvas.height);\n }\n this._currentFrameContext.drawImage(canvas, frame.leftPos, frame.topPos, frame.width, frame.height);\n const img = new Image();\n img.src = this._currentFrameCanvas.toDataURL(); // default is png\n this.images.push(img);\n };\n this._st = stream;\n this._handler = {};\n this._currentFrameCanvas = document.createElement('canvas');\n this._currentFrameContext = this._currentFrameCanvas.getContext('2d');\n this.parseHeader();\n this.parseBlocks();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Resources/Index.ts\":\n/*!****************************!*\\\n !*** ./Resources/Index.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AudioContextFactory: () => (/* reexport safe */ _Sound_Index__WEBPACK_IMPORTED_MODULE_1__.AudioContextFactory),\n/* harmony export */ FontSource: () => (/* reexport safe */ _Font__WEBPACK_IMPORTED_MODULE_3__.FontSource),\n/* harmony export */ Gif: () => (/* reexport safe */ _Gif__WEBPACK_IMPORTED_MODULE_2__.Gif),\n/* harmony export */ GifParser: () => (/* reexport safe */ _Gif__WEBPACK_IMPORTED_MODULE_2__.GifParser),\n/* harmony export */ Resource: () => (/* reexport safe */ _Resource__WEBPACK_IMPORTED_MODULE_0__.Resource),\n/* harmony export */ ResourceEvents: () => (/* reexport safe */ _Resource__WEBPACK_IMPORTED_MODULE_0__.ResourceEvents),\n/* harmony export */ Sound: () => (/* reexport safe */ _Sound_Index__WEBPACK_IMPORTED_MODULE_1__.Sound),\n/* harmony export */ SoundEvents: () => (/* reexport safe */ _Sound_Index__WEBPACK_IMPORTED_MODULE_1__.SoundEvents),\n/* harmony export */ Stream: () => (/* reexport safe */ _Gif__WEBPACK_IMPORTED_MODULE_2__.Stream),\n/* harmony export */ WebAudioInstance: () => (/* reexport safe */ _Sound_Index__WEBPACK_IMPORTED_MODULE_1__.WebAudioInstance)\n/* harmony export */ });\n/* harmony import */ var _Resource__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Resource */ \"./Resources/Resource.ts\");\n/* harmony import */ var _Sound_Index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Sound/Index */ \"./Resources/Sound/Index.ts\");\n/* harmony import */ var _Gif__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Gif */ \"./Resources/Gif.ts\");\n/* harmony import */ var _Font__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Font */ \"./Resources/Font.ts\");\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Resources/Resource.ts\":\n/*!*******************************!*\\\n !*** ./Resources/Resource.ts ***!\n \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Resource: () => (/* binding */ Resource),\n/* harmony export */ ResourceEvents: () => (/* binding */ ResourceEvents)\n/* harmony export */ });\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n\n\nconst ResourceEvents = {\n Complete: 'complete',\n Load: 'load',\n LoadStart: 'loadstart',\n Progress: 'progress',\n Error: 'error'\n};\n/**\n * The {@apilink Resource} type allows games built in Excalibur to load generic resources.\n * For any type of remote resource it is recommended to use {@apilink Resource} for preloading.\n */\nclass Resource {\n /**\n * @param path Path to the remote resource\n * @param responseType The type to expect as a response: \"\" | \"arraybuffer\" | \"blob\" | \"document\" | \"json\" | \"text\";\n * @param bustCache Whether or not to cache-bust requests\n */\n constructor(path, responseType, bustCache = false) {\n this.path = path;\n this.responseType = responseType;\n this.bustCache = bustCache;\n this.data = null;\n this.logger = _Util_Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance();\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_1__.EventEmitter();\n }\n /**\n * Returns true if the Resource is completely loaded and is ready\n * to be drawn.\n */\n isLoaded() {\n return this.data !== null;\n }\n _cacheBust(uri) {\n const query = /\\?\\w*=\\w*/;\n if (query.test(uri)) {\n uri += '&__=' + Date.now();\n }\n else {\n uri += '?__=' + Date.now();\n }\n return uri;\n }\n /**\n * Begin loading the resource and returns a promise to be resolved on completion\n */\n load() {\n return new Promise((resolve, reject) => {\n // Exit early if we already have data\n if (this.data !== null) {\n this.logger.debug('Already have data for resource', this.path);\n this.events.emit('complete', this.data);\n resolve(this.data);\n return;\n }\n const request = new XMLHttpRequest();\n request.open('GET', this.bustCache ? this._cacheBust(this.path) : this.path, true);\n request.responseType = this.responseType;\n request.addEventListener('loadstart', (e) => this.events.emit('loadstart', e));\n request.addEventListener('progress', (e) => this.events.emit('progress', e));\n request.addEventListener('error', (e) => this.events.emit('error', e));\n request.addEventListener('load', (e) => this.events.emit('load', e));\n request.addEventListener('load', () => {\n // XHR on file:// success status is 0, such as with PhantomJS\n if (request.status !== 0 && request.status !== 200) {\n this.logger.error('Failed to load resource ', this.path, ' server responded with error code', request.status);\n this.events.emit('error', request.response);\n reject(new Error(request.statusText));\n return;\n }\n if (request.response instanceof Blob && request.response.type === 'text/html') {\n const errorText = `Expected blob (usually image) data from the server when loading ${this.path}, but got HTML content instead!\r\n\r\nCheck your server configuration, for example Vite serves static files from the /public folder`;\n this.events.emit('error', request.response);\n reject(new Error(errorText));\n return;\n }\n this.data = request.response;\n this.events.emit('complete', this.data);\n this.logger.debug('Completed loading resource', this.path);\n resolve(this.data);\n });\n request.send();\n });\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Resources/Sound/AudioContext.ts\":\n/*!*****************************************!*\\\n !*** ./Resources/Sound/AudioContext.ts ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AudioContextFactory: () => (/* binding */ AudioContextFactory)\n/* harmony export */ });\n/**\n * Internal class used to build instances of AudioContext\n */\n/* istanbul ignore next */\nclass AudioContextFactory {\n static create() {\n if (!this._INSTANCE) {\n if (window.AudioContext || window.webkitAudioContext) {\n this._INSTANCE = new AudioContext();\n }\n }\n return this._INSTANCE;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Resources/Sound/Index.ts\":\n/*!**********************************!*\\\n !*** ./Resources/Sound/Index.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AudioContextFactory: () => (/* reexport safe */ _AudioContext__WEBPACK_IMPORTED_MODULE_1__.AudioContextFactory),\n/* harmony export */ Sound: () => (/* reexport safe */ _Sound__WEBPACK_IMPORTED_MODULE_0__.Sound),\n/* harmony export */ SoundEvents: () => (/* reexport safe */ _Sound__WEBPACK_IMPORTED_MODULE_0__.SoundEvents),\n/* harmony export */ WebAudioInstance: () => (/* reexport safe */ _WebAudioInstance__WEBPACK_IMPORTED_MODULE_2__.WebAudioInstance)\n/* harmony export */ });\n/* harmony import */ var _Sound__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Sound */ \"./Resources/Sound/Sound.ts\");\n/* harmony import */ var _AudioContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./AudioContext */ \"./Resources/Sound/AudioContext.ts\");\n/* harmony import */ var _WebAudioInstance__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./WebAudioInstance */ \"./Resources/Sound/WebAudioInstance.ts\");\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Resources/Sound/Sound.ts\":\n/*!**********************************!*\\\n !*** ./Resources/Sound/Sound.ts ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Sound: () => (/* binding */ Sound),\n/* harmony export */ SoundEvents: () => (/* binding */ SoundEvents)\n/* harmony export */ });\n/* harmony import */ var _Interfaces_AudioImplementation__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Interfaces/AudioImplementation */ \"./Interfaces/AudioImplementation.ts\");\n/* harmony import */ var _Resource__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Resource */ \"./Resources/Resource.ts\");\n/* harmony import */ var _WebAudioInstance__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./WebAudioInstance */ \"./Resources/Sound/WebAudioInstance.ts\");\n/* harmony import */ var _AudioContext__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./AudioContext */ \"./Resources/Sound/AudioContext.ts\");\n/* harmony import */ var _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Events/MediaEvents */ \"./Events/MediaEvents.ts\");\n/* harmony import */ var _Util_Sound__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../Util/Sound */ \"./Util/Sound.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n\n\n\n\n\nconst SoundEvents = {\n VolumeChange: 'volumechange',\n Processed: 'processed',\n Pause: 'pause',\n Stop: 'stop',\n PlaybackEnd: 'playbackend',\n Resume: 'resume',\n PlaybackStart: 'playbackstart'\n};\n/**\n * The {@apilink Sound} object allows games built in Excalibur to load audio\n * components, from soundtracks to sound effects. {@apilink Sound} is an {@apilink Loadable}\n * which means it can be passed to a {@apilink Loader} to pre-load before a game or level.\n */\nclass Sound {\n /**\n * Indicates whether the clip should loop when complete\n * @param value Set the looping flag\n */\n set loop(value) {\n this._loop = value;\n for (const track of this._tracks) {\n track.loop = this._loop;\n }\n this.logger.debug('Set loop for all instances of sound', this.path, 'to', this._loop);\n }\n get loop() {\n return this._loop;\n }\n set volume(value) {\n this._volume = value;\n for (const track of this._tracks) {\n track.volume = this._volume;\n }\n this.events.emit('volumechange', new _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_0__.NativeSoundEvent(this));\n this.logger.debug('Set loop for all instances of sound', this.path, 'to', this._volume);\n }\n get volume() {\n return this._volume;\n }\n /**\n * Get the duration that this audio should play. If unset the total natural playback duration will be used.\n */\n get duration() {\n return this._duration;\n }\n /**\n * Set the duration that this audio should play. If unset the total natural playback duration will be used.\n *\n * Note: if you seek to a specific point the duration will start from that point, for example\n *\n * If you have a 10 second clip, seek to 5 seconds, then set the duration to 2, it will play the clip from 5-7 seconds.\n */\n set duration(duration) {\n this._duration = duration;\n }\n /**\n * Return array of Current AudioInstances playing or being paused\n */\n get instances() {\n return this._tracks;\n }\n get path() {\n return this._resource.path;\n }\n set path(val) {\n this._resource.path = val;\n }\n /**\n * Should excalibur add a cache busting querystring? By default false.\n * Must be set before loading\n */\n get bustCache() {\n return this._resource.bustCache;\n }\n set bustCache(val) {\n this._resource.bustCache = val;\n }\n /**\n * @param paths A list of audio sources (clip.wav, clip.mp3, clip.ogg) for this audio clip. This is done for browser compatibility.\n */\n constructor(...paths) {\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_1__.EventEmitter();\n this.logger = _Util_Log__WEBPACK_IMPORTED_MODULE_2__.Logger.getInstance();\n this._loop = false;\n this._volume = 1;\n this._isStopped = false;\n // private _isPaused = false;\n this._tracks = [];\n this._wasPlayingOnHidden = false;\n this._playbackRate = 1.0;\n this._audioContext = _AudioContext__WEBPACK_IMPORTED_MODULE_3__.AudioContextFactory.create();\n this._resource = new _Resource__WEBPACK_IMPORTED_MODULE_4__.Resource('', _Interfaces_AudioImplementation__WEBPACK_IMPORTED_MODULE_5__.ExResponse.type.arraybuffer);\n /**\n * Chrome : MP3, WAV, Ogg\n * Firefox : WAV, Ogg,\n * IE : MP3, WAV coming soon\n * Safari MP3, WAV, Ogg\n */\n for (const path of paths) {\n if ((0,_Util_Sound__WEBPACK_IMPORTED_MODULE_6__.canPlayFile)(path)) {\n this.path = path;\n break;\n }\n }\n if (!this.path) {\n this.logger.warn('This browser does not support any of the audio files specified:', paths.join(', '));\n this.logger.warn('Attempting to use', paths[0]);\n this.path = paths[0]; // select the first specified\n }\n }\n isLoaded() {\n return !!this.data;\n }\n async load() {\n var _a, _b;\n if (this.data) {\n return this.data;\n }\n const arraybuffer = await this._resource.load();\n const audiobuffer = await this.decodeAudio(arraybuffer.slice(0));\n this._duration = (_b = (_a = this._duration) !== null && _a !== void 0 ? _a : audiobuffer === null || audiobuffer === void 0 ? void 0 : audiobuffer.duration) !== null && _b !== void 0 ? _b : undefined;\n this.events.emit('processed', new _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_0__.NativeSoundProcessedEvent(this, audiobuffer));\n return (this.data = audiobuffer);\n }\n async decodeAudio(data) {\n try {\n return await this._audioContext.decodeAudioData(data.slice(0));\n }\n catch (e) {\n this.logger.error('Unable to decode ' +\n ' this browser may not fully support this format, or the file may be corrupt, ' +\n 'if this is an mp3 try removing id3 tags and album art from the file.');\n return await Promise.reject();\n }\n }\n wireEngine(engine) {\n if (engine) {\n this._engine = engine;\n this._engine.on('hidden', () => {\n if (engine.pauseAudioWhenHidden && this.isPlaying()) {\n this._wasPlayingOnHidden = true;\n this.pause();\n }\n });\n this._engine.on('visible', () => {\n if (engine.pauseAudioWhenHidden && this._wasPlayingOnHidden) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.play();\n this._wasPlayingOnHidden = false;\n }\n });\n this._engine.on('start', () => {\n this._isStopped = false;\n });\n this._engine.on('stop', () => {\n this.stop();\n this._isStopped = true;\n });\n }\n }\n /**\n * Returns how many instances of the sound are currently playing\n */\n instanceCount() {\n return this._tracks.length;\n }\n /**\n * Whether or not the sound is playing right now\n */\n isPlaying() {\n return this._tracks.some((t) => t.isPlaying());\n }\n isPaused() {\n return this._tracks.some((t) => t.isPaused());\n }\n isStopped() {\n return this._tracks.some((t) => t.isStopped());\n }\n /**\n * Play the sound, returns a promise that resolves when the sound is done playing\n * An optional volume argument can be passed in to play the sound. Max volume is 1.0\n */\n play(volume) {\n if (!this.isLoaded()) {\n this.logger.warn('Cannot start playing. Resource', this.path, 'is not loaded yet');\n return Promise.resolve(true);\n }\n if (this._isStopped) {\n this.logger.warn('Cannot start playing. Engine is in a stopped state.');\n return Promise.resolve(false);\n }\n this.volume = volume || this.volume;\n if (this.isPaused()) {\n return this._resumePlayback();\n }\n else {\n return this._startPlayback();\n }\n }\n /**\n * Stop the sound, and do not rewind\n */\n pause() {\n if (!this.isPlaying()) {\n return;\n }\n for (const track of this._tracks) {\n track.pause();\n }\n this.events.emit('pause', new _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_0__.NativeSoundEvent(this));\n this.logger.debug('Paused all instances of sound', this.path);\n }\n /**\n * Stop the sound if it is currently playing and rewind the track. If the sound is not playing, rewinds the track.\n */\n stop() {\n for (const track of this._tracks) {\n track.stop();\n }\n this.events.emit('stop', new _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_0__.NativeSoundEvent(this));\n this._tracks.length = 0;\n this.logger.debug('Stopped all instances of sound', this.path);\n }\n get playbackRate() {\n return this._playbackRate;\n }\n set playbackRate(playbackRate) {\n this._playbackRate = playbackRate;\n this._tracks.forEach((t) => {\n t.playbackRate = this._playbackRate;\n });\n }\n seek(position, trackId = 0) {\n if (this._tracks.length === 0) {\n this._getTrackInstance(this.data);\n }\n this._tracks[trackId].seek(position);\n }\n getTotalPlaybackDuration() {\n if (!this.isLoaded()) {\n this.logger.warnOnce(`Sound from ${this.path} is not loaded, cannot return total playback duration.` +\n `Did you forget to add Sound to a loader? https://excaliburjs.com/docs/loaders/`);\n return 0;\n }\n return this.data.duration;\n }\n /**\n * Return the current playback time of the playing track in seconds from the start.\n *\n * Optionally specify the track to query if multiple are playing at once.\n * @param trackId\n */\n getPlaybackPosition(trackId = 0) {\n if (this._tracks.length) {\n return this._tracks[trackId].getPlaybackPosition();\n }\n return 0;\n }\n /**\n * Get Id of provided AudioInstance in current trackList\n * @param track {@apilink Audio} which Id is to be given\n */\n getTrackId(track) {\n return this._tracks.indexOf(track);\n }\n async _resumePlayback() {\n if (this.isPaused()) {\n const resumed = [];\n // ensure we resume *current* tracks (if paused)\n for (const track of this._tracks) {\n resumed.push(track.play().then(() => {\n this._tracks.splice(this.getTrackId(track), 1);\n return true;\n }));\n }\n this.events.emit('resume', new _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_0__.NativeSoundEvent(this));\n this.logger.debug('Resuming paused instances for sound', this.path, this._tracks);\n // resolve when resumed tracks are done\n await Promise.all(resumed);\n }\n return true;\n }\n /**\n * Starts playback, returns a promise that resolves when playback is complete\n */\n async _startPlayback() {\n const track = this._getTrackInstance(this.data);\n const complete = await track.play(() => {\n this.events.emit('playbackstart', new _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_0__.NativeSoundEvent(this, track));\n this.logger.debug('Playing new instance for sound', this.path);\n });\n this.events.emit('playbackend', new _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_0__.NativeSoundEvent(this, track));\n // cleanup any done tracks\n const trackId = this.getTrackId(track);\n if (trackId !== -1) {\n this._tracks.splice(trackId, 1);\n }\n return complete;\n }\n _getTrackInstance(data) {\n var _a;\n const newTrack = new _WebAudioInstance__WEBPACK_IMPORTED_MODULE_7__.WebAudioInstance(data);\n newTrack.loop = this.loop;\n newTrack.volume = this.volume;\n newTrack.duration = (_a = this.duration) !== null && _a !== void 0 ? _a : 0;\n newTrack.playbackRate = this._playbackRate;\n this._tracks.push(newTrack);\n return newTrack;\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Resources/Sound/WebAudioInstance.ts\":\n/*!*********************************************!*\\\n !*** ./Resources/Sound/WebAudioInstance.ts ***!\n \\*********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ WebAudioInstance: () => (/* binding */ WebAudioInstance)\n/* harmony export */ });\n/* harmony import */ var _Util_StateMachine__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Util/StateMachine */ \"./Util/StateMachine.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _AudioContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./AudioContext */ \"./Resources/Sound/AudioContext.ts\");\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Util/Future */ \"./Util/Future.ts\");\n\n\n\n\n/**\n * Internal class representing a Web Audio AudioBufferSourceNode instance\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API\n */\nclass WebAudioInstance {\n _createNewBufferSource() {\n this._instance = this._audioContext.createBufferSource();\n this._instance.buffer = this._src;\n this._instance.loop = this.loop;\n this._instance.playbackRate.value = this._playbackRate;\n this._instance.connect(this._volumeNode);\n this._volumeNode.connect(this._audioContext.destination);\n }\n _handleEnd() {\n if (!this.loop) {\n this._instance.onended = () => {\n this._playingFuture.resolve(true);\n };\n }\n }\n set loop(value) {\n this._loop = value;\n if (this._instance) {\n this._instance.loop = value;\n if (!this.loop) {\n this._instance.onended = () => {\n this._playingFuture.resolve(true);\n };\n }\n }\n }\n get loop() {\n return this._loop;\n }\n set volume(value) {\n value = (0,_Math_util__WEBPACK_IMPORTED_MODULE_0__.clamp)(value, 0, 1.0);\n this._volume = value;\n if (this._stateMachine.in('PLAYING') && this._volumeNode.gain.setTargetAtTime) {\n // https://developer.mozilla.org/en-US/docs/Web/API/AudioParam/setTargetAtTime\n // After each .1 seconds timestep, the target value will ~63.2% closer to the target value.\n // This exponential ramp provides a more pleasant transition in gain\n this._volumeNode.gain.setTargetAtTime(value, this._audioContext.currentTime, 0.1);\n }\n else {\n this._volumeNode.gain.value = value;\n }\n }\n get volume() {\n return this._volume;\n }\n /**\n * Returns the set duration to play, otherwise returns the total duration if unset\n */\n get duration() {\n var _a;\n return (_a = this._duration) !== null && _a !== void 0 ? _a : this.getTotalPlaybackDuration();\n }\n /**\n * Set the duration that this audio should play.\n *\n * Note: if you seek to a specific point the duration will start from that point, for example\n *\n * If you have a 10 second clip, seek to 5 seconds, then set the duration to 2, it will play the clip from 5-7 seconds.\n */\n set duration(duration) {\n this._duration = duration;\n }\n constructor(_src) {\n this._src = _src;\n this._audioContext = _AudioContext__WEBPACK_IMPORTED_MODULE_1__.AudioContextFactory.create();\n this._volumeNode = this._audioContext.createGain();\n this._playingFuture = new _Util_Future__WEBPACK_IMPORTED_MODULE_2__.Future();\n this._stateMachine = _Util_StateMachine__WEBPACK_IMPORTED_MODULE_3__.StateMachine.create({\n start: 'STOPPED',\n states: {\n PLAYING: {\n onEnter: ({ data }) => {\n // Buffer nodes are single use\n this._createNewBufferSource();\n this._handleEnd();\n if (this.loop) {\n // when looping don't set a duration\n this._instance.start(0, data.pausedAt * this._playbackRate);\n }\n else {\n this._instance.start(0, data.pausedAt * this._playbackRate, this.duration);\n }\n data.startedAt = this._audioContext.currentTime - data.pausedAt;\n data.pausedAt = 0;\n },\n onState: () => this._playStarted(),\n onExit: ({ to }) => {\n // If you've exited early only resolve if explicitly STOPPED\n if (to === 'STOPPED') {\n this._playingFuture.resolve(true);\n }\n // Whenever you're not playing... you stop!\n this._instance.onended = null; // disconnect the wired on-end handler\n this._instance.disconnect();\n this._instance.stop(0);\n this._instance = null;\n },\n transitions: ['STOPPED', 'PAUSED', 'SEEK']\n },\n SEEK: {\n onEnter: ({ eventData: position, data }) => {\n data.pausedAt = (position !== null && position !== void 0 ? position : 0) / this._playbackRate;\n data.startedAt = 0;\n },\n transitions: ['*']\n },\n STOPPED: {\n onEnter: ({ data }) => {\n data.pausedAt = 0;\n data.startedAt = 0;\n this._playingFuture.resolve(true);\n },\n transitions: ['PLAYING', 'PAUSED', 'SEEK']\n },\n PAUSED: {\n onEnter: ({ data }) => {\n // Playback rate will be a scale factor of how fast/slow the audio is being played\n // default is 1.0\n // we need to invert it to get the time scale\n data.pausedAt = this._audioContext.currentTime - data.startedAt;\n },\n transitions: ['PLAYING', 'STOPPED', 'SEEK']\n }\n }\n }, {\n startedAt: 0,\n pausedAt: 0\n });\n this._volume = 1;\n this._loop = false;\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n this._playStarted = () => { };\n this._playbackRate = 1.0;\n this._createNewBufferSource();\n }\n isPlaying() {\n return this._stateMachine.in('PLAYING');\n }\n isPaused() {\n return this._stateMachine.in('PAUSED') || this._stateMachine.in('SEEK');\n }\n isStopped() {\n return this._stateMachine.in('STOPPED');\n }\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n play(playStarted = () => { }) {\n this._playStarted = playStarted;\n this._stateMachine.go('PLAYING');\n return this._playingFuture.promise;\n }\n pause() {\n this._stateMachine.go('PAUSED');\n }\n stop() {\n this._stateMachine.go('STOPPED');\n }\n seek(position) {\n this._stateMachine.go('PAUSED');\n this._stateMachine.go('SEEK', position);\n }\n getTotalPlaybackDuration() {\n return this._src.duration;\n }\n getPlaybackPosition() {\n const { pausedAt, startedAt } = this._stateMachine.data;\n if (pausedAt) {\n return pausedAt * this._playbackRate;\n }\n if (startedAt) {\n return (this._audioContext.currentTime - startedAt) * this._playbackRate;\n }\n return 0;\n }\n set playbackRate(playbackRate) {\n this._instance.playbackRate.value = this._playbackRate = playbackRate;\n }\n get playbackRate() {\n return this._instance.playbackRate.value;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Scene.ts\":\n/*!******************!*\\\n !*** ./Scene.ts ***!\n \\******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PreLoadEvent: () => (/* binding */ PreLoadEvent),\n/* harmony export */ Scene: () => (/* binding */ Scene),\n/* harmony export */ SceneEvents: () => (/* binding */ SceneEvents),\n/* harmony export */ isSceneConstructor: () => (/* binding */ isSceneConstructor)\n/* harmony export */ });\n/* harmony import */ var _ScreenElement__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./ScreenElement */ \"./ScreenElement.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./Events */ \"./Events.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Timer__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./Timer */ \"./Timer.ts\");\n/* harmony import */ var _TileMap__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./TileMap */ \"./TileMap/TileMap.ts\");\n/* harmony import */ var _Camera__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Camera */ \"./Camera.ts\");\n/* harmony import */ var _Actor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Actor */ \"./Actor.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./Util/Util */ \"./Util/Util.ts\");\n/* harmony import */ var _Trigger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Trigger */ \"./Trigger.ts\");\n/* harmony import */ var _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./EntityComponentSystem/System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _EntityComponentSystem_World__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./EntityComponentSystem/World */ \"./EntityComponentSystem/World.ts\");\n/* harmony import */ var _Collision_MotionSystem__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Collision/MotionSystem */ \"./Collision/MotionSystem.ts\");\n/* harmony import */ var _Collision_CollisionSystem__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Collision/CollisionSystem */ \"./Collision/CollisionSystem.ts\");\n/* harmony import */ var _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./EntityComponentSystem/Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _Graphics_GraphicsSystem__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Graphics/GraphicsSystem */ \"./Graphics/GraphicsSystem.ts\");\n/* harmony import */ var _Debug_DebugSystem__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Debug/DebugSystem */ \"./Debug/DebugSystem.ts\");\n/* harmony import */ var _Input_PointerSystem__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Input/PointerSystem */ \"./Input/PointerSystem.ts\");\n/* harmony import */ var _Actions_ActionsSystem__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Actions/ActionsSystem */ \"./Actions/ActionsSystem.ts\");\n/* harmony import */ var _TileMap_IsometricEntitySystem__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./TileMap/IsometricEntitySystem */ \"./TileMap/IsometricEntitySystem.ts\");\n/* harmony import */ var _Graphics_OffscreenSystem__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Graphics/OffscreenSystem */ \"./Graphics/OffscreenSystem.ts\");\n/* harmony import */ var _Collision_PhysicsWorld__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Collision/PhysicsWorld */ \"./Collision/PhysicsWorld.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Input_InputHost__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./Input/InputHost */ \"./Input/InputHost.ts\");\n/* harmony import */ var _Input_PointerScope__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Input/PointerScope */ \"./Input/PointerScope.ts\");\n/* harmony import */ var _Collision_PhysicsConfig__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Collision/PhysicsConfig */ \"./Collision/PhysicsConfig.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass PreLoadEvent {\n}\nconst SceneEvents = {\n Initialize: 'initialize',\n Activate: 'activate',\n Deactivate: 'deactivate',\n PreUpdate: 'preupdate',\n PostUpdate: 'postupdate',\n PreDraw: 'predraw',\n PostDraw: 'postdraw',\n PreDebugDraw: 'predebugdraw',\n PostDebugDraw: 'postdebugdraw',\n PreLoad: 'preload'\n};\n/**\n *\n */\nfunction isSceneConstructor(x) {\n var _a, _b;\n return !!(x === null || x === void 0 ? void 0 : x.prototype) && !!((_b = (_a = x === null || x === void 0 ? void 0 : x.prototype) === null || _a === void 0 ? void 0 : _a.constructor) === null || _b === void 0 ? void 0 : _b.name);\n}\n/**\n * {@apilink Actor | `Actors`} are composed together into groupings called Scenes in\n * Excalibur. The metaphor models the same idea behind real world\n * actors in a scene. Only actors in scenes will be updated and drawn.\n *\n * Typical usages of a scene include: levels, menus, loading screens, etc.\n */\nclass Scene {\n /**\n * The actors in the current scene\n */\n get actors() {\n return this.world.entityManager.entities.filter((e) => {\n return e instanceof _Actor__WEBPACK_IMPORTED_MODULE_0__.Actor;\n });\n }\n /**\n * The entities in the current scene\n */\n get entities() {\n return this.world.entityManager.entities;\n }\n /**\n * The triggers in the current scene\n */\n get triggers() {\n return this.world.entityManager.entities.filter((e) => {\n return e instanceof _Trigger__WEBPACK_IMPORTED_MODULE_1__.Trigger;\n });\n }\n /**\n * The {@apilink TileMap}s in the scene, if any\n */\n get tileMaps() {\n return this.world.entityManager.entities.filter((e) => {\n return e instanceof _TileMap__WEBPACK_IMPORTED_MODULE_2__.TileMap;\n });\n }\n get timers() {\n return this._timers;\n }\n constructor() {\n // Initialize systems\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_3__.Logger.getInstance();\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_4__.EventEmitter();\n /**\n * Gets or sets the current camera for the scene\n */\n this.camera = new _Camera__WEBPACK_IMPORTED_MODULE_5__.Camera();\n /**\n * The ECS world for the scene\n */\n this.world = new _EntityComponentSystem_World__WEBPACK_IMPORTED_MODULE_6__.World(this);\n /**\n * The Excalibur physics world for the scene. Used to interact\n * with colliders included in the scene.\n *\n * Can be used to perform scene ray casts, track colliders, broadphase, and narrowphase.\n */\n this.physics = new _Collision_PhysicsWorld__WEBPACK_IMPORTED_MODULE_7__.PhysicsWorld((0,_Collision_PhysicsConfig__WEBPACK_IMPORTED_MODULE_8__.getDefaultPhysicsConfig)());\n this._isInitialized = false;\n this._timers = [];\n this._cancelQueue = [];\n // Update\n this.world.add(_Actions_ActionsSystem__WEBPACK_IMPORTED_MODULE_9__.ActionsSystem);\n this.world.add(new _Collision_MotionSystem__WEBPACK_IMPORTED_MODULE_10__.MotionSystem(this.world, this.physics));\n this.world.add(new _Collision_CollisionSystem__WEBPACK_IMPORTED_MODULE_11__.CollisionSystem(this.world, this.physics));\n this.world.add(_Input_PointerSystem__WEBPACK_IMPORTED_MODULE_12__.PointerSystem);\n this.world.add(_TileMap_IsometricEntitySystem__WEBPACK_IMPORTED_MODULE_13__.IsometricEntitySystem);\n // Draw\n this.world.add(_Graphics_OffscreenSystem__WEBPACK_IMPORTED_MODULE_14__.OffscreenSystem);\n this.world.add(_Graphics_GraphicsSystem__WEBPACK_IMPORTED_MODULE_15__.GraphicsSystem);\n this.world.add(_Debug_DebugSystem__WEBPACK_IMPORTED_MODULE_16__.DebugSystem);\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n /**\n * Event hook to provide Scenes a way of loading scene specific resources.\n *\n * This is called before the Scene.onInitialize during scene transition. It will only ever fire once for a scene.\n * @param loader\n */\n onPreLoad(loader) {\n // will be overridden\n }\n /**\n * Event hook fired directly before transition, either \"in\" or \"out\" of the scene\n *\n * This overrides the Engine scene definition. However transitions specified in goToScene take highest precedence\n *\n * ```typescript\n * // Overrides all\n * Engine.goToScene('scene', { destinationIn: ..., sourceOut: ... });\n * ```\n *\n * This can be used to configure custom transitions for a scene dynamically\n */\n onTransition(direction) {\n // will be overridden\n return undefined;\n }\n /**\n * This is called before the first update of the {@apilink Scene}. Initializes scene members like the camera. This method is meant to be\n * overridden. This is where initialization of child actors should take place.\n */\n onInitialize(engine) {\n // will be overridden\n }\n /**\n * This is called when the scene is made active and started. It is meant to be overridden,\n * this is where you should setup any DOM UI or event handlers needed for the scene.\n */\n onActivate(context) {\n // will be overridden\n }\n /**\n * This is called when the scene is made transitioned away from and stopped. It is meant to be overridden,\n * this is where you should cleanup any DOM UI or event handlers needed for the scene.\n */\n onDeactivate(context) {\n // will be overridden\n }\n /**\n * Safe to override onPreUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPreUpdate` is called directly before a scene is updated.\n * @param engine reference to the engine\n * @param elapsed Number of milliseconds elapsed since the last draw.\n */\n onPreUpdate(engine, elapsed) {\n // will be overridden\n }\n /**\n * Safe to override onPostUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPostUpdate` is called directly after a scene is updated.\n * @param engine reference to the engine\n * @param elapsed Number of milliseconds elapsed since the last draw.\n */\n onPostUpdate(engine, elapsed) {\n // will be overridden\n }\n /**\n * Safe to override onPreDraw lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPreDraw` is called directly before a scene is drawn.\n *\n */\n onPreDraw(ctx, elapsed) {\n // will be overridden\n }\n /**\n * Safe to override onPostDraw lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\n *\n * `onPostDraw` is called directly after a scene is drawn.\n *\n */\n onPostDraw(ctx, elapsed) {\n // will be overridden\n }\n /**\n * Initializes actors in the scene\n */\n _initializeChildren() {\n for (const child of this.entities) {\n child._initialize(this.engine);\n }\n }\n /**\n * Gets whether or not the {@apilink Scene} has been initialized\n */\n get isInitialized() {\n return this._isInitialized;\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Initializes the scene before the first update, meant to be called by engine not by users of\n * Excalibur\n * @internal\n */\n async _initialize(engine) {\n var _a;\n if (!this.isInitialized) {\n try {\n this.engine = engine;\n // PhysicsWorld config is watched so things will automagically update\n this.physics.config = this.engine.physics;\n this.input = new _Input_InputHost__WEBPACK_IMPORTED_MODULE_17__.InputHost({\n pointerTarget: engine.pointerScope === _Input_PointerScope__WEBPACK_IMPORTED_MODULE_18__.PointerScope.Canvas ? engine.canvas : document,\n grabWindowFocus: engine.grabWindowFocus,\n engine\n });\n // Initialize camera first\n this.camera._initialize(engine);\n this.world.systemManager.initialize();\n // This order is important! we want to be sure any custom init that add actors\n // fire before the actor init\n await this.onInitialize(engine);\n this._initializeChildren();\n this._logger.debug('Scene.onInitialize', this, engine);\n this.events.emit('initialize', new _Events__WEBPACK_IMPORTED_MODULE_19__.InitializeEvent(engine, this));\n }\n catch (e) {\n this._logger.error(`Error during scene initialization for scene ${(_a = engine.director) === null || _a === void 0 ? void 0 : _a.getSceneName(this)}!`);\n throw e;\n }\n this._isInitialized = true;\n }\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Activates the scene with the base behavior, then calls the overridable `onActivate` implementation.\n * @internal\n */\n async _activate(context) {\n var _a, _b;\n try {\n this._logger.debug('Scene.onActivate', this);\n this.input.toggleEnabled(true);\n await this.onActivate(context);\n }\n catch (e) {\n this._logger.error(`Error during scene activation for scene ${(_b = (_a = this.engine) === null || _a === void 0 ? void 0 : _a.director) === null || _b === void 0 ? void 0 : _b.getSceneName(this)}!`);\n throw e;\n }\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Deactivates the scene with the base behavior, then calls the overridable `onDeactivate` implementation.\n * @internal\n */\n async _deactivate(context) {\n this._logger.debug('Scene.onDeactivate', this);\n this.input.toggleEnabled(false);\n await this.onDeactivate(context);\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _preupdate handler for {@apilink onPreUpdate} lifecycle event\n * @internal\n */\n _preupdate(engine, elapsed) {\n this.emit('preupdate', new _Events__WEBPACK_IMPORTED_MODULE_19__.PreUpdateEvent(engine, elapsed, this));\n this.onPreUpdate(engine, elapsed);\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _preupdate handler for {@apilink onPostUpdate} lifecycle event\n * @internal\n */\n _postupdate(engine, elapsed) {\n this.emit('postupdate', new _Events__WEBPACK_IMPORTED_MODULE_19__.PostUpdateEvent(engine, elapsed, this));\n this.onPostUpdate(engine, elapsed);\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _predraw handler for {@apilink onPreDraw} lifecycle event\n * @internal\n */\n _predraw(ctx, elapsed) {\n this.emit('predraw', new _Events__WEBPACK_IMPORTED_MODULE_19__.PreDrawEvent(ctx, elapsed, this));\n this.onPreDraw(ctx, elapsed);\n }\n /**\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\n *\n * Internal _postdraw handler for {@apilink onPostDraw} lifecycle event\n * @internal\n */\n _postdraw(ctx, elapsed) {\n this.emit('postdraw', new _Events__WEBPACK_IMPORTED_MODULE_19__.PostDrawEvent(ctx, elapsed, this));\n this.onPostDraw(ctx, elapsed);\n }\n /**\n * Updates all the actors and timers in the scene. Called by the {@apilink Engine}.\n * @param engine Reference to the current Engine\n * @param elapsed The number of milliseconds since the last update\n */\n update(engine, elapsed) {\n var _a;\n if (!this.isInitialized) {\n this._logger.warnOnce(`Scene update called before initialize for scene ${(_a = engine.director) === null || _a === void 0 ? void 0 : _a.getSceneName(this)}!`);\n return;\n }\n this._preupdate(engine, elapsed);\n // TODO differed entity removal for timers\n let i, len;\n // Remove timers in the cancel queue before updating them\n for (i = 0, len = this._cancelQueue.length; i < len; i++) {\n this.removeTimer(this._cancelQueue[i]);\n }\n this._cancelQueue.length = 0;\n // Cycle through timers updating timers\n for (const timer of this._timers) {\n timer.update(elapsed);\n }\n this.world.update(_EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_20__.SystemType.Update, elapsed);\n // Camera last keeps renders smooth that are based on entity/actor\n if (this.camera) {\n this.camera.update(engine, elapsed);\n }\n this._collectActorStats(engine);\n this._postupdate(engine, elapsed);\n this.input.update();\n }\n /**\n * Draws all the actors in the Scene. Called by the {@apilink Engine}.\n * @param ctx The current rendering context\n * @param elapsed The number of milliseconds since the last draw\n */\n draw(ctx, elapsed) {\n var _a;\n if (!this.isInitialized) {\n this._logger.warnOnce(`Scene draw called before initialize!`);\n return;\n }\n this._predraw(ctx, elapsed);\n this.world.update(_EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_20__.SystemType.Draw, elapsed);\n if ((_a = this.engine) === null || _a === void 0 ? void 0 : _a.isDebug) {\n this.debugDraw(ctx);\n }\n this._postdraw(ctx, elapsed);\n }\n /**\n * Draws all the actors' debug information in the Scene. Called by the {@apilink Engine}.\n * @param ctx The current rendering context\n */\n /* istanbul ignore next */\n debugDraw(ctx) {\n this.emit('predebugdraw', new _Events__WEBPACK_IMPORTED_MODULE_19__.PreDebugDrawEvent(ctx, this));\n // pass\n this.emit('postdebugdraw', new _Events__WEBPACK_IMPORTED_MODULE_19__.PostDebugDrawEvent(ctx, this));\n }\n /**\n * Checks whether an actor is contained in this scene or not\n */\n contains(actor) {\n return this.actors.indexOf(actor) > -1;\n }\n add(entity) {\n this.emit('entityadded', { target: entity });\n this.world.add(entity);\n entity.scene = this;\n if (entity instanceof _Timer__WEBPACK_IMPORTED_MODULE_21__.Timer) {\n if (!_Util_Util__WEBPACK_IMPORTED_MODULE_22__.contains(this._timers, entity)) {\n this.addTimer(entity);\n }\n return;\n }\n }\n /**\n * Removes an {@apilink Entity} (Actor, TileMap, Trigger, etc) or {@apilink Timer} from it's current scene\n * and adds it to this scene.\n *\n * Useful if you want to have an object be present in only 1 scene at a time.\n * @param entity\n */\n transfer(entity) {\n let scene;\n if (entity instanceof _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_23__.Entity && entity.scene && entity.scene !== this) {\n scene = entity.scene;\n entity.scene.world.remove(entity, false);\n }\n if (entity instanceof _Timer__WEBPACK_IMPORTED_MODULE_21__.Timer && entity.scene) {\n scene = entity.scene;\n entity.scene.removeTimer(entity);\n }\n scene === null || scene === void 0 ? void 0 : scene.emit('entityremoved', { target: entity });\n this.add(entity);\n }\n remove(entity) {\n if (entity instanceof _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_23__.Entity) {\n this.emit('entityremoved', { target: entity });\n if (entity.isActive) {\n entity.kill();\n }\n this.world.remove(entity);\n }\n if (entity instanceof _Timer__WEBPACK_IMPORTED_MODULE_21__.Timer) {\n this.removeTimer(entity);\n }\n }\n /**\n * Removes all entities and timers from the scene, optionally indicate whether deferred should or shouldn't be used.\n *\n * By default entities use deferred removal\n * @param deferred\n */\n clear(deferred = true) {\n for (let i = this.entities.length - 1; i >= 0; i--) {\n this.world.remove(this.entities[i], deferred);\n }\n for (let i = this.timers.length - 1; i >= 0; i--) {\n this.removeTimer(this.timers[i]);\n }\n }\n /**\n * Adds a {@apilink Timer} to the scene\n * @param timer The timer to add\n */\n addTimer(timer) {\n this._timers.push(timer);\n timer.scene = this;\n return timer;\n }\n /**\n * Removes a {@apilink Timer} from the scene.\n * @warning Can be dangerous, use {@apilink cancelTimer} instead\n * @param timer The timer to remove\n */\n removeTimer(timer) {\n const i = this._timers.indexOf(timer);\n if (i !== -1) {\n this._timers.splice(i, 1);\n }\n return timer;\n }\n /**\n * Cancels a {@apilink Timer}, removing it from the scene nicely\n * @param timer The timer to cancel\n */\n cancelTimer(timer) {\n this._cancelQueue.push(timer);\n return timer;\n }\n /**\n * Tests whether a {@apilink Timer} is active in the scene\n */\n isTimerActive(timer) {\n return this._timers.indexOf(timer) > -1 && !timer.complete;\n }\n isCurrentScene() {\n if (this.engine) {\n return this.engine.currentScene === this;\n }\n return false;\n }\n _collectActorStats(engine) {\n const actors = this.actors;\n for (let i = 0; i < actors.length; i++) {\n const actor = actors[i];\n if (actor instanceof _ScreenElement__WEBPACK_IMPORTED_MODULE_24__.ScreenElement) {\n engine.stats.currFrame.actors.ui++;\n }\n engine.stats.currFrame.actors.alive++;\n for (let j = 0; j < actor.children.length; j++) {\n const child = actor.children[j];\n if ((0,_ScreenElement__WEBPACK_IMPORTED_MODULE_24__.isScreenElement)(child)) {\n // TODO not true\n engine.stats.currFrame.actors.ui++;\n }\n else {\n engine.stats.currFrame.actors.alive++;\n }\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Screen.ts\":\n/*!*******************!*\\\n !*** ./Screen.ts ***!\n \\*******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DisplayMode: () => (/* binding */ DisplayMode),\n/* harmony export */ Resolution: () => (/* binding */ Resolution),\n/* harmony export */ Screen: () => (/* binding */ Screen),\n/* harmony export */ ScreenEvents: () => (/* binding */ ScreenEvents)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Collision_Index__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Collision/Index */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Util_Util__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Util/Util */ \"./Util/Util.ts\");\n/* harmony import */ var _Graphics_Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Graphics/Context/ExcaliburGraphicsContextWebGL */ \"./Graphics/Context/ExcaliburGraphicsContextWebGL.ts\");\n/* harmony import */ var _Graphics_Context_ExcaliburGraphicsContext2DCanvas__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Graphics/Context/ExcaliburGraphicsContext2DCanvas */ \"./Graphics/Context/ExcaliburGraphicsContext2DCanvas.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n\n\n\n\n/**\n * Enum representing the different display modes available to Excalibur.\n */\nvar DisplayMode;\n(function (DisplayMode) {\n /**\n * Default, use a specified resolution for the game. Like 800x600 pixels for example.\n */\n DisplayMode[\"Fixed\"] = \"Fixed\";\n /**\n * Fit the aspect ratio given by the game resolution within the container at all times will fill any gaps with canvas.\n * The displayed area outside the aspect ratio is not guaranteed to be on the screen, only the {@apilink Screen.contentArea}\n * is guaranteed to be on screen.\n */\n DisplayMode[\"FitContainerAndFill\"] = \"FitContainerAndFill\";\n /**\n * Fit the aspect ratio given by the game resolution the screen at all times will fill the screen.\n * This displayed area outside the aspect ratio is not guaranteed to be on the screen, only the {@apilink Screen.contentArea}\n * is guaranteed to be on screen.\n */\n DisplayMode[\"FitScreenAndFill\"] = \"FitScreenAndFill\";\n /**\n * Fit the viewport to the parent element maintaining aspect ratio given by the game resolution, but zooms in to avoid the black bars\n * (letterbox) that would otherwise be present in {@apilink FitContainer}.\n *\n * **warning** This will clip some drawable area from the user because of the zoom,\n * use {@apilink Screen.contentArea} to know the safe to draw area.\n */\n DisplayMode[\"FitContainerAndZoom\"] = \"FitContainerAndZoom\";\n /**\n * Fit the viewport to the device screen maintaining aspect ratio given by the game resolution, but zooms in to avoid the black bars\n * (letterbox) that would otherwise be present in {@apilink FitScreen}.\n *\n * **warning** This will clip some drawable area from the user because of the zoom,\n * use {@apilink Screen.contentArea} to know the safe to draw area.\n */\n DisplayMode[\"FitScreenAndZoom\"] = \"FitScreenAndZoom\";\n /**\n * Fit to screen using as much space as possible while maintaining aspect ratio and resolution.\n * This is not the same as {@apilink Screen.goFullScreen} but behaves in a similar way maintaining aspect ratio.\n *\n * You may want to center your game here is an example\n * ```html\n * \n * \n *
\n * \n *
\n * \n * ```\n *\n * ```css\n * // css\n * main {\n * display: flex;\n * align-items: center;\n * justify-content: center;\n * height: 100%;\n * width: 100%;\n * }\n * ```\n */\n DisplayMode[\"FitScreen\"] = \"FitScreen\";\n /**\n * Fill the entire screen's css width/height for the game resolution dynamically. This means the resolution of the game will\n * change dynamically as the window is resized. This is not the same as {@apilink Screen.goFullScreen}\n */\n DisplayMode[\"FillScreen\"] = \"FillScreen\";\n /**\n * Fit to parent element width/height using as much space as possible while maintaining aspect ratio and resolution.\n */\n DisplayMode[\"FitContainer\"] = \"FitContainer\";\n /**\n * Use the parent DOM container's css width/height for the game resolution dynamically\n */\n DisplayMode[\"FillContainer\"] = \"FillContainer\";\n})(DisplayMode || (DisplayMode = {}));\n/**\n * Convenience class for quick resolutions\n * Mostly sourced from https://emulation.gametechwiki.com/index.php/Resolution\n */\nclass Resolution {\n /* istanbul ignore next */\n static get SVGA() {\n return { width: 800, height: 600 };\n }\n /* istanbul ignore next */\n static get Standard() {\n return { width: 1920, height: 1080 };\n }\n /* istanbul ignore next */\n static get Atari2600() {\n return { width: 160, height: 192 };\n }\n /* istanbul ignore next */\n static get GameBoy() {\n return { width: 160, height: 144 };\n }\n /* istanbul ignore next */\n static get GameBoyAdvance() {\n return { width: 240, height: 160 };\n }\n /* istanbul ignore next */\n static get NintendoDS() {\n return { width: 256, height: 192 };\n }\n /* istanbul ignore next */\n static get NES() {\n return { width: 256, height: 224 };\n }\n /* istanbul ignore next */\n static get SNES() {\n return { width: 256, height: 244 };\n }\n}\nconst ScreenEvents = {\n ScreenResize: 'resize',\n PixelRatioChange: 'pixelratio',\n FullScreenChange: 'fullscreen'\n};\n/**\n * The Screen handles all aspects of interacting with the screen for Excalibur.\n */\nclass Screen {\n constructor(options) {\n var _a, _b, _c, _d;\n /**\n * Listen to screen events {@apilink ScreenEvents}\n */\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n this._antialiasing = true;\n this._canvasImageRendering = 'auto';\n this._resolutionStack = [];\n this._viewportStack = [];\n this._pixelRatioOverride = null;\n this._isFullscreen = false;\n this._isDisposed = false;\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this._fullscreenChangeHandler = () => {\n if (this._isDisposed) {\n return;\n }\n this._isFullscreen = !this._isFullscreen;\n this._logger.debug('Fullscreen Change', this._isFullscreen);\n this.events.emit('fullscreen', {\n fullscreen: this.isFullScreen\n });\n };\n this._pixelRatioChangeHandler = () => {\n if (this._isDisposed) {\n return;\n }\n this._logger.debug('Pixel Ratio Change', window.devicePixelRatio);\n this._listenForPixelRatio();\n this._devicePixelRatio = this._calculateDevicePixelRatio();\n this.applyResolutionAndViewport();\n this.events.emit('pixelratio', {\n pixelRatio: this.pixelRatio\n });\n };\n this._resizeHandler = () => {\n if (this._isDisposed) {\n return;\n }\n const parent = this.parent;\n this._logger.debug('View port resized');\n this._setResolutionAndViewportByDisplayMode(parent);\n this.applyResolutionAndViewport();\n // Emit resize event\n this.events.emit('resize', {\n resolution: this.resolution,\n viewport: this.viewport\n });\n };\n // Asking the window.devicePixelRatio is expensive we do it once\n this._devicePixelRatio = this._calculateDevicePixelRatio();\n this._contentArea = new _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox();\n this._unsafeArea = new _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox();\n this.viewport = options.viewport;\n this.resolution = (_a = options.resolution) !== null && _a !== void 0 ? _a : { ...this.viewport };\n this._contentResolution = this.resolution;\n this._displayMode = (_b = options.displayMode) !== null && _b !== void 0 ? _b : DisplayMode.Fixed;\n this._canvas = options.canvas;\n this.graphicsContext = options.context;\n this._antialiasing = (_c = options.antialiasing) !== null && _c !== void 0 ? _c : this._antialiasing;\n this._canvasImageRendering = (_d = options.canvasImageRendering) !== null && _d !== void 0 ? _d : this._canvasImageRendering;\n this._browser = options.browser;\n this._pixelRatioOverride = options.pixelRatio;\n this._applyDisplayMode();\n this._listenForPixelRatio();\n this._canvas.addEventListener('fullscreenchange', this._fullscreenChangeHandler);\n this.applyResolutionAndViewport();\n }\n _listenForPixelRatio() {\n if (this._mediaQueryList && !this._mediaQueryList.addEventListener) {\n // Safari <=13.1 workaround, remove any existing handlers\n this._mediaQueryList.removeListener(this._pixelRatioChangeHandler);\n }\n this._mediaQueryList = this._browser.window.nativeComponent.matchMedia(`(resolution: ${window.devicePixelRatio}dppx)`);\n // Safari <=13.1 workaround\n if (this._mediaQueryList.addEventListener) {\n this._mediaQueryList.addEventListener('change', this._pixelRatioChangeHandler, { once: true });\n }\n else {\n this._mediaQueryList.addListener(this._pixelRatioChangeHandler);\n }\n }\n dispose() {\n if (!this._isDisposed) {\n // Clean up handlers\n this._isDisposed = true;\n this.events.clear();\n this._browser.window.off('resize', this._resizeHandler);\n this._browser.window.clear();\n if (this._resizeObserver) {\n this._resizeObserver.disconnect();\n }\n this.parent.removeEventListener('resize', this._resizeHandler);\n // Safari <=13.1 workaround\n if (this._mediaQueryList.removeEventListener) {\n this._mediaQueryList.removeEventListener('change', this._pixelRatioChangeHandler);\n }\n else {\n this._mediaQueryList.removeListener(this._pixelRatioChangeHandler);\n }\n this._canvas.removeEventListener('fullscreenchange', this._fullscreenChangeHandler);\n this._canvas = null;\n }\n }\n _calculateDevicePixelRatio() {\n if (window.devicePixelRatio < 1) {\n return 1;\n }\n const devicePixelRatio = window.devicePixelRatio || 1;\n return devicePixelRatio;\n }\n /**\n * Returns the computed pixel ratio, first using any override, then the device pixel ratio\n */\n get pixelRatio() {\n if (this._pixelRatioOverride) {\n return this._pixelRatioOverride;\n }\n return this._devicePixelRatio;\n }\n /**\n * This calculates the ratio between excalibur pixels and the HTML pixels.\n *\n * This is useful for scaling HTML UI so that it matches your game.\n */\n get worldToPagePixelRatio() {\n if (this._canvas) {\n const pageOrigin = this.worldToPageCoordinates(_Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero);\n const pageDistance = this.worldToPageCoordinates((0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(1, 0)).sub(pageOrigin);\n const pixelConversion = pageDistance.x;\n return pixelConversion;\n }\n else {\n return 1;\n }\n }\n /**\n * Get or set the pixel ratio override\n *\n * You will need to call applyResolutionAndViewport() affect change on the screen\n */\n get pixelRatioOverride() {\n return this._pixelRatioOverride;\n }\n set pixelRatioOverride(value) {\n this._pixelRatioOverride = value;\n }\n get isHiDpi() {\n return this.pixelRatio !== 1;\n }\n get displayMode() {\n return this._displayMode;\n }\n get canvas() {\n return this._canvas;\n }\n get parent() {\n switch (this.displayMode) {\n case DisplayMode.FillContainer:\n case DisplayMode.FitContainer:\n case DisplayMode.FitContainerAndFill:\n case DisplayMode.FitContainerAndZoom:\n return this.canvas.parentElement || document.body;\n default:\n return window;\n }\n }\n get resolution() {\n return this._resolution;\n }\n set resolution(resolution) {\n this._resolution = resolution;\n }\n /**\n * Returns screen dimensions in pixels or percentage\n */\n get viewport() {\n if (this._viewport) {\n return this._viewport;\n }\n return this._resolution;\n }\n set viewport(viewport) {\n this._viewport = viewport;\n }\n get aspectRatio() {\n return this._resolution.width / this._resolution.height;\n }\n get scaledWidth() {\n return this._resolution.width * this.pixelRatio;\n }\n get scaledHeight() {\n return this._resolution.height * this.pixelRatio;\n }\n setCurrentCamera(camera) {\n this._camera = camera;\n }\n pushResolutionAndViewport() {\n this._resolutionStack.push(this.resolution);\n this._viewportStack.push(this.viewport);\n this.resolution = { ...this.resolution };\n this.viewport = { ...this.viewport };\n }\n peekViewport() {\n return this._viewportStack[this._viewportStack.length - 1];\n }\n peekResolution() {\n return this._resolutionStack[this._resolutionStack.length - 1];\n }\n popResolutionAndViewport() {\n if (this._resolutionStack.length && this._viewportStack.length) {\n this.resolution = this._resolutionStack.pop();\n this.viewport = this._viewportStack.pop();\n }\n }\n applyResolutionAndViewport() {\n if (this.graphicsContext instanceof _Graphics_Context_ExcaliburGraphicsContextWebGL__WEBPACK_IMPORTED_MODULE_4__.ExcaliburGraphicsContextWebGL) {\n const scaledResolutionSupported = this.graphicsContext.checkIfResolutionSupported({\n width: this.scaledWidth,\n height: this.scaledHeight\n });\n if (!scaledResolutionSupported) {\n this._logger.warnOnce(`The currently configured resolution (${this.resolution.width}x${this.resolution.height}) and pixel ratio (${this.pixelRatio})` +\n ' are too large for the platform WebGL implementation, this may work but cause WebGL rendering to behave oddly.' +\n ' Try reducing the resolution or disabling Hi DPI scaling to avoid this' +\n ' (read more here https://excaliburjs.com/docs/screens#understanding-viewport--resolution).');\n // Attempt to recover if the user hasn't configured a specific ratio for up scaling\n if (!this.pixelRatioOverride) {\n let currentPixelRatio = Math.max(1, this.pixelRatio - 0.5);\n let newResolutionSupported = false;\n while (currentPixelRatio > 1 && !newResolutionSupported) {\n currentPixelRatio = Math.max(1, currentPixelRatio - 0.5);\n const width = this._resolution.width * currentPixelRatio;\n const height = this._resolution.height * currentPixelRatio;\n newResolutionSupported = this.graphicsContext.checkIfResolutionSupported({ width, height });\n }\n this.pixelRatioOverride = currentPixelRatio;\n this._logger.warnOnce('Scaled resolution too big attempted recovery!' +\n ` Pixel ratio was automatically reduced to (${this.pixelRatio}) to avoid 4k texture limit.` +\n ' Setting `ex.Engine({pixelRatio: ...}) will override any automatic recalculation, do so at your own risk.` ' +\n ' (read more here https://excaliburjs.com/docs/screens#understanding-viewport--resolution).');\n }\n }\n }\n this._canvas.width = this.scaledWidth;\n this._canvas.height = this.scaledHeight;\n if (this._canvasImageRendering === 'auto') {\n this._canvas.style.imageRendering = 'auto';\n }\n else {\n this._canvas.style.imageRendering = 'pixelated';\n // Fall back to 'crisp-edges' if 'pixelated' is not supported\n // Currently for firefox https://developer.mozilla.org/en-US/docs/Web/CSS/image-rendering\n if (this._canvas.style.imageRendering === '') {\n this._canvas.style.imageRendering = 'crisp-edges';\n }\n }\n const widthUnit = this.viewport.widthUnit === 'percent' ? '%' : 'px';\n const heightUnit = this.viewport.heightUnit === 'percent' ? '%' : 'px';\n this._canvas.style.width = this.viewport.width + widthUnit;\n this._canvas.style.height = this.viewport.height + heightUnit;\n // After messing with the canvas width/height the graphics context is invalidated and needs to have some properties reset\n this.graphicsContext.updateViewport(this.resolution);\n this.graphicsContext.resetTransform();\n this.graphicsContext.smoothing = this._antialiasing;\n if (this.graphicsContext instanceof _Graphics_Context_ExcaliburGraphicsContext2DCanvas__WEBPACK_IMPORTED_MODULE_5__.ExcaliburGraphicsContext2DCanvas) {\n this.graphicsContext.scale(this.pixelRatio, this.pixelRatio);\n }\n // Add the excalibur world pixel to page pixel\n document.documentElement.style.setProperty('--ex-pixel-ratio', this.worldToPagePixelRatio.toString());\n }\n /**\n * Get or set screen antialiasing,\n *\n * If true smoothing is applied\n */\n get antialiasing() {\n return this._antialiasing;\n }\n /**\n * Get or set screen antialiasing\n */\n set antialiasing(isSmooth) {\n this._antialiasing = isSmooth;\n this.graphicsContext.smoothing = this._antialiasing;\n }\n /**\n * Returns true if excalibur is fullscreen using the browser fullscreen api\n * @deprecated use isFullscreen()\n */\n get isFullScreen() {\n return this._isFullscreen;\n }\n /**\n * Returns true if excalibur is fullscreen using the browser fullscreen api\n */\n get isFullscreen() {\n return this._isFullscreen;\n }\n /**\n * Requests to go fullscreen using the browser fullscreen api, requires user interaction to be successful.\n * For example, wire this to a user click handler.\n *\n * Optionally specify a target element id to go fullscreen, by default the game canvas is used\n * @param elementId\n * @deprecated use enterFullscreen(...)\n */\n goFullScreen(elementId) {\n return this.enterFullscreen(elementId);\n }\n /**\n * Requests to enter fullscreen using the browser fullscreen api, requires user interaction to be successful.\n * For example, wire this to a user click handler.\n *\n * Optionally specify a target element id to go fullscreen, by default the game canvas is used\n * @param elementId\n */\n enterFullscreen(elementId) {\n if (elementId) {\n const maybeElement = document.getElementById(elementId);\n if (maybeElement) {\n if (!maybeElement.getAttribute('ex-fullscreen-listener')) {\n maybeElement.setAttribute('ex-fullscreen-listener', 'true');\n maybeElement.addEventListener('fullscreenchange', this._fullscreenChangeHandler);\n }\n const fullscreenPromise = maybeElement.requestFullscreen();\n return fullscreenPromise;\n }\n }\n return this._canvas.requestFullscreen();\n }\n /**\n * Requests to exit fullscreen using the browser fullscreen api\n * @deprecated use exitFullscreen()\n */\n exitFullScreen() {\n return this.exitFullscreen();\n }\n exitFullscreen() {\n return document.exitFullscreen();\n }\n _viewportToPixels(viewport) {\n return {\n width: viewport.widthUnit === 'percent' ? this.canvas.offsetWidth : viewport.width,\n height: viewport.heightUnit === 'percent' ? this.canvas.offsetHeight : viewport.height\n };\n }\n /**\n * Takes a coordinate in normal html page space, for example from a pointer move event, and translates it to\n * Excalibur screen space.\n *\n * Excalibur screen space starts at the top left (0, 0) corner of the viewport, and extends to the\n * bottom right corner (resolutionX, resolutionY). When using *AndFill suffixed display modes screen space\n * (0, 0) is the top left of the safe content area bounding box not the viewport.\n * @param point\n */\n pageToScreenCoordinates(point) {\n let newX = point.x;\n let newY = point.y;\n if (!this._isFullscreen) {\n newX -= (0,_Util_Util__WEBPACK_IMPORTED_MODULE_6__.getPosition)(this._canvas).x;\n newY -= (0,_Util_Util__WEBPACK_IMPORTED_MODULE_6__.getPosition)(this._canvas).y;\n }\n const viewport = this._viewportToPixels(this.viewport);\n // if fullscreen api on it centers with black bars\n // we need to adjust the screen to world coordinates in this case\n if (this._isFullscreen) {\n if (window.innerWidth / this.aspectRatio < window.innerHeight) {\n const screenHeight = window.innerWidth / this.aspectRatio;\n const screenMarginY = (window.innerHeight - screenHeight) / 2;\n newY = ((newY - screenMarginY) / screenHeight) * viewport.height;\n newX = (newX / window.innerWidth) * viewport.width;\n }\n else {\n const screenWidth = window.innerHeight * this.aspectRatio;\n const screenMarginX = (window.innerWidth - screenWidth) / 2;\n newX = ((newX - screenMarginX) / screenWidth) * viewport.width;\n newY = (newY / window.innerHeight) * viewport.height;\n }\n }\n newX = (newX / viewport.width) * this.resolution.width;\n newY = (newY / viewport.height) * this.resolution.height;\n // offset by content area\n newX = newX - this.contentArea.left;\n newY = newY - this.contentArea.top;\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(newX, newY);\n }\n /**\n * Takes a coordinate in Excalibur screen space, and translates it to normal html page space. For example,\n * this is where html elements might live if you want to position them relative to Excalibur.\n *\n * Excalibur screen space starts at the top left (0, 0) corner of the viewport, and extends to the\n * bottom right corner (resolutionX, resolutionY)\n * @param point\n */\n screenToPageCoordinates(point) {\n let newX = point.x;\n let newY = point.y;\n // no need to offset by content area, drawing is already offset by this\n const viewport = this._viewportToPixels(this.viewport);\n newX = (newX / this.resolution.width) * viewport.width;\n newY = (newY / this.resolution.height) * viewport.height;\n if (this._isFullscreen) {\n if (window.innerWidth / this.aspectRatio < window.innerHeight) {\n const screenHeight = window.innerWidth / this.aspectRatio;\n const screenMarginY = (window.innerHeight - screenHeight) / 2;\n newY = (newY / viewport.height) * screenHeight + screenMarginY;\n newX = (newX / viewport.width) * window.innerWidth;\n }\n else {\n const screenWidth = window.innerHeight * this.aspectRatio;\n const screenMarginX = (window.innerWidth - screenWidth) / 2;\n newX = (newX / viewport.width) * screenWidth + screenMarginX;\n newY = (newY / viewport.height) * window.innerHeight;\n }\n }\n if (!this._isFullscreen) {\n newX += (0,_Util_Util__WEBPACK_IMPORTED_MODULE_6__.getPosition)(this._canvas).x;\n newY += (0,_Util_Util__WEBPACK_IMPORTED_MODULE_6__.getPosition)(this._canvas).y;\n }\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(newX, newY);\n }\n /**\n * Takes a coordinate in Excalibur screen space, and translates it to Excalibur world space.\n *\n * World space is where {@apilink Entity | `entities`} in Excalibur live by default {@apilink CoordPlane.World}\n * and extends infinitely out relative from the {@apilink Camera}.\n * @param point Screen coordinate to convert\n */\n screenToWorldCoordinates(point) {\n // offset by content area\n point = point.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this.contentArea.left, this.contentArea.top));\n // the only difference between screen & world is the camera transform\n if (this._camera) {\n return this._camera.inverse.multiply(point);\n }\n return point.sub((0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this.resolution.width / 2, this.resolution.height / 2));\n }\n /**\n * Takes a coordinate in Excalibur world space, and translates it to Excalibur screen space.\n *\n * Screen space is where {@apilink ScreenElement | `screen elements`} and {@apilink Entity | `entities`} with {@apilink CoordPlane.Screen} live.\n * @param point World coordinate to convert\n */\n worldToScreenCoordinates(point) {\n if (this._camera) {\n return this._camera.transform.multiply(point);\n }\n return point.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this.resolution.width / 2, this.resolution.height / 2));\n }\n pageToWorldCoordinates(point) {\n const screen = this.pageToScreenCoordinates(point);\n return this.screenToWorldCoordinates(screen);\n }\n worldToPageCoordinates(point) {\n const screen = this.worldToScreenCoordinates(point);\n return this.screenToPageCoordinates(screen);\n }\n /**\n * Returns a BoundingBox of the top left corner of the screen\n * and the bottom right corner of the screen.\n *\n * World bounds are in world coordinates, useful for culling objects offscreen that are in world space\n */\n getWorldBounds() {\n const bounds = _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromDimension(this.resolution.width, this.resolution.height, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Half)\n .scale((0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(1 / this._camera.zoom, 1 / this._camera.zoom))\n .rotate(this._camera.rotation)\n .translate(this._camera.drawPos);\n return bounds;\n }\n /**\n * Returns a BoundingBox of the top left corner of the screen and the bottom right corner of the screen.\n *\n * Screen bounds are in screen coordinates, useful for culling objects offscreen that are in screen space\n */\n getScreenBounds() {\n const bounds = _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromDimension(this.resolution.width, this.resolution.height, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero);\n return bounds;\n }\n /**\n * The width of the game canvas in pixels (physical width component of the\n * resolution of the canvas element)\n */\n get canvasWidth() {\n return this.canvas.width;\n }\n /**\n * Returns half width of the game canvas in pixels (half physical width component)\n */\n get halfCanvasWidth() {\n return this.canvas.width / 2;\n }\n /**\n * The height of the game canvas in pixels, (physical height component of\n * the resolution of the canvas element)\n */\n get canvasHeight() {\n return this.canvas.height;\n }\n /**\n * Returns half height of the game canvas in pixels (half physical height component)\n */\n get halfCanvasHeight() {\n return this.canvas.height / 2;\n }\n /**\n * Returns the width of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get drawWidth() {\n if (this._camera) {\n return this.resolution.width / this._camera.zoom;\n }\n return this.resolution.width;\n }\n /**\n * Returns the width of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get width() {\n if (this._camera) {\n return this.resolution.width / this._camera.zoom;\n }\n return this.resolution.width;\n }\n /**\n * Returns half the width of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get halfDrawWidth() {\n return this.drawWidth / 2;\n }\n /**\n * Returns the height of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get drawHeight() {\n if (this._camera) {\n return this.resolution.height / this._camera.zoom;\n }\n return this.resolution.height;\n }\n get height() {\n if (this._camera) {\n return this.resolution.height / this._camera.zoom;\n }\n return this.resolution.height;\n }\n /**\n * Returns half the height of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\n */\n get halfDrawHeight() {\n return this.drawHeight / 2;\n }\n /**\n * Returns screen center coordinates including zoom and device pixel ratio.\n */\n get center() {\n return (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(this.halfDrawWidth, this.halfDrawHeight);\n }\n /**\n * Returns the content area in screen space where it is safe to place content\n */\n get contentArea() {\n return this._contentArea;\n }\n /**\n * Returns the unsafe area in screen space, this is the full screen and some space may not be onscreen.\n */\n get unsafeArea() {\n return this._unsafeArea;\n }\n _computeFit() {\n document.body.style.margin = '0px';\n document.body.style.overflow = 'hidden';\n const aspect = this.aspectRatio;\n let adjustedWidth = 0;\n let adjustedHeight = 0;\n if (window.innerWidth / aspect < window.innerHeight) {\n adjustedWidth = window.innerWidth;\n adjustedHeight = window.innerWidth / aspect;\n }\n else {\n adjustedWidth = window.innerHeight * aspect;\n adjustedHeight = window.innerHeight;\n }\n this.viewport = {\n width: adjustedWidth,\n height: adjustedHeight\n };\n this._contentArea = _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromDimension(this.resolution.width, this.resolution.height, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero);\n this._unsafeArea = _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromDimension(this.resolution.width, this.resolution.height, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero);\n this.events.emit('resize', {\n resolution: this.resolution,\n viewport: this.viewport\n });\n }\n _computeFitScreenAndFill() {\n document.body.style.margin = '0px';\n document.body.style.overflow = 'hidden';\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n this._computeFitAndFill(vw, vh);\n this.events.emit('resize', {\n resolution: this.resolution,\n viewport: this.viewport\n });\n }\n _computeFitContainerAndFill() {\n this.canvas.style.width = '100%';\n this.canvas.style.height = '100%';\n this._computeFitAndFill(this.canvas.offsetWidth, this.canvas.offsetHeight, {\n width: 100,\n widthUnit: 'percent',\n height: 100,\n heightUnit: 'percent'\n });\n this.events.emit('resize', {\n resolution: this.resolution,\n viewport: this.viewport\n });\n }\n _computeFitAndFill(vw, vh, viewport) {\n this.viewport = viewport !== null && viewport !== void 0 ? viewport : {\n width: vw,\n height: vh\n };\n // if the current screen aspectRatio is less than the original aspectRatio\n if (vw / vh <= this._contentResolution.width / this._contentResolution.height) {\n // compute new resolution to match the original aspect ratio\n this.resolution = {\n width: (vw * this._contentResolution.width) / vw,\n height: (((vw * this._contentResolution.width) / vw) * vh) / vw\n };\n const clip = (this.resolution.height - this._contentResolution.height) / 2;\n this._contentArea = new _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox({\n top: clip,\n left: 0,\n right: this._contentResolution.width,\n bottom: this.resolution.height - clip\n });\n this._unsafeArea = new _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox({\n top: -clip,\n left: 0,\n right: this._contentResolution.width,\n bottom: this.resolution.height + clip\n });\n }\n else {\n this.resolution = {\n width: (((vh * this._contentResolution.height) / vh) * vw) / vh,\n height: (vh * this._contentResolution.height) / vh\n };\n const clip = (this.resolution.width - this._contentResolution.width) / 2;\n this._contentArea = new _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox({\n top: 0,\n left: clip,\n right: this.resolution.width - clip,\n bottom: this._contentResolution.height\n });\n this._unsafeArea = new _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox({\n top: 0,\n left: -clip,\n right: this.resolution.width + clip,\n bottom: this._contentResolution.height\n });\n }\n }\n _computeFitScreenAndZoom() {\n document.body.style.margin = '0px';\n document.body.style.overflow = 'hidden';\n this.canvas.style.position = 'absolute';\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n this._computeFitAndZoom(vw, vh);\n this.events.emit('resize', {\n resolution: this.resolution,\n viewport: this.viewport\n });\n }\n _computeFitContainerAndZoom() {\n this.canvas.style.width = '100%';\n this.canvas.style.height = '100%';\n this.canvas.style.position = 'relative';\n const parent = this.canvas.parentElement;\n parent.style.overflow = 'hidden';\n const { offsetWidth: vw, offsetHeight: vh } = this.canvas;\n this._computeFitAndZoom(vw, vh);\n this.events.emit('resize', {\n resolution: this.resolution,\n viewport: this.viewport\n });\n }\n _computeFitAndZoom(vw, vh) {\n const aspect = this.aspectRatio;\n let adjustedWidth = 0;\n let adjustedHeight = 0;\n if (vw / aspect < vh) {\n adjustedWidth = vw;\n adjustedHeight = vw / aspect;\n }\n else {\n adjustedWidth = vh * aspect;\n adjustedHeight = vh;\n }\n const scaleX = vw / adjustedWidth;\n const scaleY = vh / adjustedHeight;\n const maxScaleFactor = Math.max(scaleX, scaleY);\n const zoomedWidth = adjustedWidth * maxScaleFactor;\n const zoomedHeight = adjustedHeight * maxScaleFactor;\n // Center zoomed dimension if bigger than the screen\n if (zoomedWidth > vw) {\n this.canvas.style.left = -(zoomedWidth - vw) / 2 + 'px';\n }\n else {\n this.canvas.style.left = '';\n }\n if (zoomedHeight > vh) {\n this.canvas.style.top = -(zoomedHeight - vh) / 2 + 'px';\n }\n else {\n this.canvas.style.top = '';\n }\n this.viewport = {\n width: zoomedWidth,\n height: zoomedHeight\n };\n const bounds = _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromDimension(this.viewport.width, this.viewport.height, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero);\n // return safe area\n if (this.viewport.width > vw) {\n const clip = ((this.viewport.width - vw) / this.viewport.width) * this.resolution.width;\n bounds.top = 0;\n bounds.left = clip / 2;\n bounds.right = this.resolution.width - clip / 2;\n bounds.bottom = this.resolution.height;\n }\n if (this.viewport.height > vh) {\n const clip = ((this.viewport.height - vh) / this.viewport.height) * this.resolution.height;\n bounds.top = clip / 2;\n bounds.left = 0;\n bounds.bottom = this.resolution.height - clip / 2;\n bounds.right = this.resolution.width;\n }\n this._contentArea = bounds;\n }\n _computeFitContainer() {\n const aspect = this.aspectRatio;\n let adjustedWidth = 0;\n let adjustedHeight = 0;\n let widthUnit = 'pixel';\n let heightUnit = 'pixel';\n const parent = this.canvas.parentElement;\n if (parent.clientWidth / aspect < parent.clientHeight) {\n this.canvas.style.width = '100%';\n adjustedWidth = 100;\n widthUnit = 'percent';\n adjustedHeight = this.canvas.offsetWidth / aspect;\n }\n else {\n this.canvas.style.height = '100%';\n adjustedHeight = 100;\n heightUnit = 'percent';\n adjustedWidth = this.canvas.offsetHeight * aspect;\n }\n this.viewport = {\n width: adjustedWidth,\n widthUnit,\n height: adjustedHeight,\n heightUnit\n };\n this._contentArea = _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromDimension(this.resolution.width, this.resolution.height, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero);\n this.events.emit('resize', {\n resolution: this.resolution,\n viewport: this.viewport\n });\n }\n _applyDisplayMode() {\n this._setResolutionAndViewportByDisplayMode(this.parent);\n // watch resizing\n if (this.parent instanceof Window) {\n this._browser.window.on('resize', this._resizeHandler);\n }\n else {\n this._resizeObserver = new ResizeObserver(() => {\n this._resizeHandler();\n });\n this._resizeObserver.observe(this.parent);\n }\n this.parent.addEventListener('resize', this._resizeHandler);\n }\n /**\n * Sets the resolution and viewport based on the selected display mode.\n */\n _setResolutionAndViewportByDisplayMode(parent) {\n if (this.displayMode === DisplayMode.FillContainer) {\n this.canvas.style.width = '100%';\n this.canvas.style.height = '100%';\n this.viewport = {\n width: 100,\n widthUnit: 'percent',\n height: 100,\n heightUnit: 'percent'\n };\n this.resolution = {\n width: this.canvas.offsetWidth,\n height: this.canvas.offsetHeight\n };\n }\n if (this.displayMode === DisplayMode.FillScreen) {\n document.body.style.margin = '0px';\n document.body.style.overflow = 'hidden';\n this.resolution = {\n width: parent.innerWidth,\n height: parent.innerHeight\n };\n this.viewport = this.resolution;\n }\n this._contentArea = _Collision_Index__WEBPACK_IMPORTED_MODULE_2__.BoundingBox.fromDimension(this.resolution.width, this.resolution.height, _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector.Zero);\n if (this.displayMode === DisplayMode.FitScreen) {\n this._computeFit();\n }\n if (this.displayMode === DisplayMode.FitContainer) {\n this._computeFitContainer();\n }\n if (this.displayMode === DisplayMode.FitScreenAndFill) {\n this._computeFitScreenAndFill();\n }\n if (this.displayMode === DisplayMode.FitContainerAndFill) {\n this._computeFitContainerAndFill();\n }\n if (this.displayMode === DisplayMode.FitScreenAndZoom) {\n this._computeFitScreenAndZoom();\n }\n if (this.displayMode === DisplayMode.FitContainerAndZoom) {\n this._computeFitContainerAndZoom();\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./ScreenElement.ts\":\n/*!**************************!*\\\n !*** ./ScreenElement.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ScreenElement: () => (/* binding */ ScreenElement),\n/* harmony export */ isScreenElement: () => (/* binding */ isScreenElement)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Actor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Actor */ \"./Actor.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Collision/CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Math/coord-plane */ \"./Math/coord-plane.ts\");\n\n\n\n\n\n/**\n * Type guard to detect a screen element\n */\nfunction isScreenElement(actor) {\n return actor instanceof ScreenElement;\n}\n/**\n * Helper {@apilink Actor} primitive for drawing UI's, optimized for UI drawing. Does\n * not participate in collisions. Drawn on top of all other actors.\n */\nclass ScreenElement extends _Actor__WEBPACK_IMPORTED_MODULE_0__.Actor {\n constructor(config) {\n var _a, _b;\n super({ ...config });\n this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).coordPlane = _Math_coord_plane__WEBPACK_IMPORTED_MODULE_2__.CoordPlane.Screen;\n this.anchor = (_a = config === null || config === void 0 ? void 0 : config.anchor) !== null && _a !== void 0 ? _a : (0,_Math_vector__WEBPACK_IMPORTED_MODULE_3__.vec)(0, 0);\n this.body.collisionType = (_b = config === null || config === void 0 ? void 0 : config.collisionType) !== null && _b !== void 0 ? _b : _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_4__.CollisionType.PreventCollision;\n this.pointer.useGraphicsBounds = true;\n this.pointer.useColliderShape = false;\n if (!(config === null || config === void 0 ? void 0 : config.collider) && (config === null || config === void 0 ? void 0 : config.width) > 0 && (config === null || config === void 0 ? void 0 : config.height) > 0) {\n this.collider.useBoxCollider(this.width, this.height, this.anchor);\n }\n }\n _initialize(engine) {\n this._engine = engine;\n super._initialize(engine);\n }\n contains(x, y, useWorld = true) {\n if (useWorld) {\n return super.contains(x, y);\n }\n const coords = this._engine.worldToScreenCoordinates(new _Math_vector__WEBPACK_IMPORTED_MODULE_3__.Vector(x, y));\n return super.contains(coords.x, coords.y);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./TileMap/IsometricEntityComponent.ts\":\n/*!*********************************************!*\\\n !*** ./TileMap/IsometricEntityComponent.ts ***!\n \\*********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ IsometricEntityComponent: () => (/* binding */ IsometricEntityComponent)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Component */ \"./EntityComponentSystem/Component.ts\");\n\nclass IsometricEntityComponent extends _EntityComponentSystem_Component__WEBPACK_IMPORTED_MODULE_0__.Component {\n /**\n * Specify the isometric map to use to position this entity's z-index\n * @param mapOrOptions\n */\n constructor(mapOrOptions) {\n super();\n /**\n * Vertical \"height\" in the isometric world\n */\n this.elevation = 0;\n this.columns = mapOrOptions.columns;\n this.rows = mapOrOptions.rows;\n this.tileWidth = mapOrOptions.tileWidth;\n this.tileHeight = mapOrOptions.tileHeight;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./TileMap/IsometricEntitySystem.ts\":\n/*!******************************************!*\\\n !*** ./TileMap/IsometricEntitySystem.ts ***!\n \\******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ IsometricEntitySystem: () => (/* binding */ IsometricEntitySystem)\n/* harmony export */ });\n/* harmony import */ var _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/System */ \"./EntityComponentSystem/System.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _IsometricEntityComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./IsometricEntityComponent */ \"./TileMap/IsometricEntityComponent.ts\");\n/* harmony import */ var _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../EntityComponentSystem */ \"./EntityComponentSystem/Priority.ts\");\n\n\n\n\nclass IsometricEntitySystem extends _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.System {\n constructor(world) {\n super();\n this.world = world;\n this.systemType = _EntityComponentSystem_System__WEBPACK_IMPORTED_MODULE_0__.SystemType.Update;\n this.query = this.world.query([_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent, _IsometricEntityComponent__WEBPACK_IMPORTED_MODULE_2__.IsometricEntityComponent]);\n }\n update() {\n let transform;\n let iso;\n for (let i = 0; i < this.query.entities.length; i++) {\n const entity = this.query.entities[i];\n transform = entity.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n iso = entity.get(_IsometricEntityComponent__WEBPACK_IMPORTED_MODULE_2__.IsometricEntityComponent);\n const maxZindexPerElevation = Math.max(iso.columns * iso.tileWidth, iso.rows * iso.tileHeight);\n const newZ = maxZindexPerElevation * iso.elevation + transform.pos.y;\n transform.z = newZ;\n }\n }\n}\nIsometricEntitySystem.priority = _EntityComponentSystem__WEBPACK_IMPORTED_MODULE_3__.SystemPriority.Lower;\n\n\n/***/ }),\n\n/***/ \"./TileMap/IsometricMap.ts\":\n/*!*********************************!*\\\n !*** ./TileMap/IsometricMap.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ IsometricMap: () => (/* binding */ IsometricMap),\n/* harmony export */ IsometricTile: () => (/* binding */ IsometricTile)\n/* harmony export */ });\n/* harmony import */ var _Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Collision/BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../Collision/ColliderComponent */ \"./Collision/ColliderComponent.ts\");\n/* harmony import */ var _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Collision/CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Collision_Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../Collision/Colliders/CompositeCollider */ \"./Collision/Colliders/CompositeCollider.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Graphics */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../Graphics */ \"./Graphics/DebugGraphicsComponent.ts\");\n/* harmony import */ var _IsometricEntityComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./IsometricEntityComponent */ \"./TileMap/IsometricEntityComponent.ts\");\n/* harmony import */ var _Input_PointerComponent__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../Input/PointerComponent */ \"./Input/PointerComponent.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Input_PointerEventsToObjectDispatcher__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../Input/PointerEventsToObjectDispatcher */ \"./Input/PointerEventsToObjectDispatcher.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass IsometricTile extends _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__.Entity {\n getGraphics() {\n return this._graphics;\n }\n /**\n * Tile graphics\n */\n addGraphic(graphic, options) {\n this._graphics.push(graphic);\n this._gfx.isVisible = this.map.isVisible;\n this._gfx.opacity = this.map.opacity;\n if (options === null || options === void 0 ? void 0 : options.offset) {\n this._gfx.offset = options.offset;\n }\n // TODO detect when this changes on the map and apply to all tiles\n this._gfx.localBounds = this._recalculateBounds();\n }\n _recalculateBounds() {\n let bounds = this._tileBounds.clone();\n for (const graphic of this._graphics) {\n const offset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(this.map.graphicsOffset.x - this.map.tileWidth / 2, this.map.graphicsOffset.y - (this.map.renderFromTopOfGraphic ? 0 : graphic.height - this.map.tileHeight));\n bounds = bounds.combine(graphic.localBounds.translate(offset));\n }\n return bounds;\n }\n removeGraphic(graphic) {\n const index = this._graphics.indexOf(graphic);\n if (index > -1) {\n this._graphics.splice(index, 1);\n }\n this._gfx.localBounds = this._recalculateBounds();\n }\n clearGraphics() {\n this._graphics.length = 0;\n this._gfx.isVisible = false;\n this._gfx.localBounds = this._recalculateBounds();\n }\n getColliders() {\n return this._colliders;\n }\n /**\n * Adds a collider to the IsometricTile\n *\n * **Note!** the {@apilink Tile.solid} must be set to true for it to act as a \"fixed\" collider\n * @param collider\n */\n addCollider(collider) {\n this._colliders.push(collider);\n this.map.flagCollidersDirty();\n }\n /**\n * Removes a collider from the IsometricTile\n * @param collider\n */\n removeCollider(collider) {\n const index = this._colliders.indexOf(collider);\n if (index > -1) {\n this._colliders.splice(index, 1);\n }\n this.map.flagCollidersDirty();\n }\n /**\n * Clears all colliders from the IsometricTile\n */\n clearColliders() {\n this._colliders.length = 0;\n this.map.flagCollidersDirty();\n }\n /**\n * Returns the top left corner of the {@apilink IsometricTile} in world space\n */\n get pos() {\n return this.map.tileToWorld((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(this.x, this.y));\n }\n /**\n * Returns the center of the {@apilink IsometricTile}\n */\n get center() {\n return this.pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, this.map.tileHeight / 2));\n }\n /**\n * Construct a new IsometricTile\n * @param x tile coordinate in x (not world position)\n * @param y tile coordinate in y (not world position)\n * @param graphicsOffset offset that tile should be shifted by (default (0, 0))\n * @param map reference to owning IsometricMap\n */\n constructor(x, y, graphicsOffset, map) {\n super([\n new _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent(),\n new _Graphics__WEBPACK_IMPORTED_MODULE_3__.GraphicsComponent({\n offset: graphicsOffset !== null && graphicsOffset !== void 0 ? graphicsOffset : _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero,\n onPostDraw: (gfx, elapsed) => this.draw(gfx, elapsed)\n }),\n new _IsometricEntityComponent__WEBPACK_IMPORTED_MODULE_4__.IsometricEntityComponent(map)\n ]);\n /**\n * Indicates whether this tile is solid\n */\n this.solid = false;\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_5__.EventEmitter();\n this._tileBounds = new _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox();\n this._graphics = [];\n /**\n * Tile colliders\n */\n this._colliders = [];\n /**\n * Arbitrary data storage per tile, useful for any game specific data\n */\n this.data = new Map();\n this.x = x;\n this.y = y;\n this.map = map;\n this._transform = this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n this._isometricEntityComponent = this.get(_IsometricEntityComponent__WEBPACK_IMPORTED_MODULE_4__.IsometricEntityComponent);\n const halfTileWidth = this.map.tileWidth / 2;\n const halfTileHeight = this.map.tileHeight / 2;\n // See https://clintbellanger.net/articles/isometric_math/ for formula\n // The x position shifts left with every y step\n const xPos = (this.x - this.y) * halfTileWidth;\n // The y position needs to go down with every x step\n const yPos = (this.x + this.y) * halfTileHeight;\n this._transform.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(xPos, yPos);\n this._isometricEntityComponent.elevation = map.elevation;\n this._gfx = this.get(_Graphics__WEBPACK_IMPORTED_MODULE_3__.GraphicsComponent);\n this._gfx.isVisible = false; // start not visible\n const totalWidth = this.map.tileWidth;\n const totalHeight = this.map.tileHeight;\n // initial guess at gfx bounds based on the tile\n const offset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, this.map.renderFromTopOfGraphic ? totalHeight : 0);\n this._gfx.localBounds = this._tileBounds = new _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox({\n left: -totalWidth / 2,\n top: -totalHeight,\n right: totalWidth / 2,\n bottom: totalHeight\n }).translate(offset);\n }\n draw(gfx, _elapsed) {\n const halfTileWidth = this.map.tileWidth / 2;\n gfx.save();\n // shift left origin to corner of map, not the left corner of the first sprite\n gfx.translate(-halfTileWidth, 0);\n for (const graphic of this._graphics) {\n graphic.draw(gfx, this.map.graphicsOffset.x, this.map.graphicsOffset.y - (this.map.renderFromTopOfGraphic ? 0 : graphic.height - this.map.tileHeight));\n }\n gfx.restore();\n }\n}\n/**\n * The IsometricMap is a special tile map that provides isometric rendering support to Excalibur\n *\n * The tileWidth and tileHeight should be the height and width in pixels of the parallelogram of the base of the tile art asset.\n * The tileWidth and tileHeight is not necessarily the same as your graphic pixel width and height.\n *\n * Please refer to the docs https://excaliburjs.com for more details calculating what your tile width and height should be given\n * your art assets.\n */\nclass IsometricMap extends _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__.Entity {\n /**\n * Whether tiles should be visible\n * @deprecated use isVisible\n */\n get visible() {\n return this.isVisible;\n }\n /**\n * Whether tiles should be visible\n * @deprecated use isVisible\n */\n set visible(val) {\n this.isVisible = val;\n }\n constructor(options) {\n super([\n new _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent(),\n new _Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_7__.BodyComponent({\n type: _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_8__.CollisionType.Fixed\n }),\n new _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_9__.ColliderComponent(),\n new _Input_PointerComponent__WEBPACK_IMPORTED_MODULE_10__.PointerComponent(),\n new _Graphics__WEBPACK_IMPORTED_MODULE_11__.DebugGraphicsComponent((ctx, debugFlags) => this.debug(ctx, debugFlags), false)\n ], options.name);\n this.elevation = 0;\n /**\n * Whether tiles should be visible\n */\n this.isVisible = true;\n /**\n * Opacity of tiles\n */\n this.opacity = 1.0;\n /**\n * Render the tile graphic from the top instead of the bottom\n *\n * default is `false` meaning rendering from the bottom\n */\n this.renderFromTopOfGraphic = false;\n this.graphicsOffset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0);\n this._collidersDirty = false;\n this._originalOffsets = new WeakMap();\n const { pos, tileWidth, tileHeight, columns: width, rows: height, renderFromTopOfGraphic, graphicsOffset, elevation } = options;\n this.transform = this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent);\n if (pos) {\n this.transform.pos = pos;\n }\n this.collider = this.get(_Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_9__.ColliderComponent);\n if (this.collider) {\n this.collider.set((this._composite = new _Collision_Colliders_CompositeCollider__WEBPACK_IMPORTED_MODULE_12__.CompositeCollider([])));\n }\n this.pointer = this.get(_Input_PointerComponent__WEBPACK_IMPORTED_MODULE_10__.PointerComponent);\n this.renderFromTopOfGraphic = renderFromTopOfGraphic !== null && renderFromTopOfGraphic !== void 0 ? renderFromTopOfGraphic : this.renderFromTopOfGraphic;\n this.graphicsOffset = graphicsOffset !== null && graphicsOffset !== void 0 ? graphicsOffset : this.graphicsOffset;\n this.elevation = elevation !== null && elevation !== void 0 ? elevation : this.elevation;\n this.tileWidth = tileWidth;\n this.tileHeight = tileHeight;\n this.columns = width;\n this.rows = height;\n this._pointerEventDispatcher = new _Input_PointerEventsToObjectDispatcher__WEBPACK_IMPORTED_MODULE_13__.PointerEventsToObjectDispatcher();\n this.tiles = new Array(width * height);\n // build up tile representation\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const tile = new IsometricTile(x, y, this.graphicsOffset, this);\n this.tiles[x + y * width] = tile;\n this.addChild(tile);\n this._pointerEventDispatcher.addObject(tile, (p) => this.getTileByPoint(p.worldPos) === tile, () => true);\n }\n }\n this.pointer.localBounds = _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox.fromDimension(tileWidth * width * this.transform.scale.x, tileHeight * height * this.transform.scale.y, (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0.5, 0));\n }\n /**\n * @internal\n */\n _processPointerToObject(receiver) {\n this._pointerEventDispatcher.processPointerToObject(receiver, this.tiles);\n }\n /**\n * @internal\n */\n _dispatchPointerEvents(receiver) {\n this._pointerEventDispatcher.dispatchEvents(receiver, this.tiles);\n }\n update() {\n if (this._collidersDirty) {\n this.updateColliders();\n this._collidersDirty = false;\n }\n this._pointerEventDispatcher.clear();\n }\n flagCollidersDirty() {\n this._collidersDirty = true;\n }\n _getOrSetColliderOriginalOffset(collider) {\n var _a;\n if (!this._originalOffsets.has(collider)) {\n const originalOffset = collider.offset;\n this._originalOffsets.set(collider, originalOffset);\n return originalOffset;\n }\n else {\n return (_a = this._originalOffsets.get(collider)) !== null && _a !== void 0 ? _a : _Math_vector__WEBPACK_IMPORTED_MODULE_1__.Vector.Zero;\n }\n }\n updateColliders() {\n this._composite.clearColliders();\n const pos = this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent).pos;\n for (const tile of this.tiles) {\n if (tile.solid) {\n for (const collider of tile.getColliders()) {\n const originalOffset = this._getOrSetColliderOriginalOffset(collider);\n collider.offset = this.tileToWorld((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(tile.x, tile.y))\n .sub(pos)\n .add(originalOffset)\n .sub((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(this.tileWidth / 2, this.tileHeight)); // We need to unshift height based on drawing\n collider.owner = this;\n this._composite.addCollider(collider);\n }\n }\n }\n this.collider.update();\n }\n /**\n * Convert world space coordinates to the tile x, y coordinate\n * @param worldCoordinate\n */\n worldToTile(worldCoordinate) {\n // TODO I don't think this handles parent transform see TileMap\n worldCoordinate = worldCoordinate.sub(this.transform.globalPos);\n const halfTileWidth = this.tileWidth / 2;\n const halfTileHeight = this.tileHeight / 2;\n // See https://clintbellanger.net/articles/isometric_math/ for formula\n return (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(~~((worldCoordinate.x / halfTileWidth + worldCoordinate.y / halfTileHeight) / 2), ~~((worldCoordinate.y / halfTileHeight - worldCoordinate.x / halfTileWidth) / 2));\n }\n /**\n * Given a tile coordinate, return the top left corner in world space\n * @param tileCoordinate\n */\n tileToWorld(tileCoordinate) {\n const halfTileWidth = this.tileWidth / 2;\n const halfTileHeight = this.tileHeight / 2;\n // The x position shifts left with every y step\n const xPos = (tileCoordinate.x - tileCoordinate.y) * halfTileWidth;\n // The y position needs to go down with every x step\n const yPos = (tileCoordinate.x + tileCoordinate.y) * halfTileHeight;\n return (0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(xPos, yPos).add(this.transform.pos);\n }\n /**\n * Returns the {@apilink IsometricTile} by its x and y coordinates\n */\n getTile(x, y) {\n if (x < 0 || y < 0 || x >= this.columns || y >= this.rows) {\n return null;\n }\n return this.tiles[x + y * this.columns];\n }\n /**\n * Returns the {@apilink IsometricTile} by testing a point in world coordinates,\n * returns `null` if no Tile was found.\n */\n getTileByPoint(point) {\n const tileCoord = this.worldToTile(point);\n const tile = this.getTile(tileCoord.x, tileCoord.y);\n return tile;\n }\n _getMaxZIndex() {\n let maxZ = Number.NEGATIVE_INFINITY;\n for (const tile of this.tiles) {\n const currentZ = tile.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent).z;\n if (currentZ > maxZ) {\n maxZ = currentZ;\n }\n }\n return maxZ;\n }\n /**\n * Debug draw for IsometricMap, called internally by excalibur when debug mode is toggled on\n * @param gfx\n */\n debug(gfx, debugFlags) {\n const { showAll, showPosition, positionColor, positionSize, showGrid, gridColor, gridWidth, showColliderGeometry } = debugFlags.isometric;\n const { geometryColor, geometryLineWidth, geometryPointSize } = debugFlags.collider;\n gfx.save();\n gfx.z = this._getMaxZIndex() + 0.5;\n if (showAll || showGrid) {\n for (let y = 0; y < this.rows + 1; y++) {\n const left = this.tileToWorld((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, y));\n const right = this.tileToWorld((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(this.columns, y));\n gfx.drawLine(left, right, gridColor, gridWidth);\n }\n for (let x = 0; x < this.columns + 1; x++) {\n const top = this.tileToWorld((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(x, 0));\n const bottom = this.tileToWorld((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(x, this.rows));\n gfx.drawLine(top, bottom, gridColor, gridWidth);\n }\n }\n if (showAll || showPosition) {\n for (const tile of this.tiles) {\n gfx.drawCircle(this.tileToWorld((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(tile.x, tile.y)), positionSize, positionColor);\n }\n }\n if (showAll || showColliderGeometry) {\n for (const tile of this.tiles) {\n if (tile.solid) {\n // only draw solid tiles\n for (const collider of tile.getColliders()) {\n collider.debug(gfx, geometryColor, { lineWidth: geometryLineWidth, pointSize: geometryPointSize });\n }\n }\n }\n }\n gfx.restore();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./TileMap/TileMap.ts\":\n/*!****************************!*\\\n !*** ./TileMap/TileMap.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Tile: () => (/* binding */ Tile),\n/* harmony export */ TileMap: () => (/* binding */ TileMap),\n/* harmony export */ TileMapEvents: () => (/* binding */ TileMapEvents)\n/* harmony export */ });\n/* harmony import */ var _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../Collision/BoundingBox */ \"./Collision/BoundingBox.ts\");\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EntityComponentSystem/Entity */ \"./EntityComponentSystem/Entity.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../EntityComponentSystem/Components/TransformComponent */ \"./EntityComponentSystem/Components/TransformComponent.ts\");\n/* harmony import */ var _Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Collision/BodyComponent */ \"./Collision/BodyComponent.ts\");\n/* harmony import */ var _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Collision/CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Collision_Colliders_Shape__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../Collision/Colliders/Shape */ \"./Collision/Colliders/Shape.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Graphics */ \"./Graphics/GraphicsComponent.ts\");\n/* harmony import */ var _Graphics__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../Graphics */ \"./Graphics/ParallaxComponent.ts\");\n/* harmony import */ var _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../EntityComponentSystem/Components/MotionComponent */ \"./EntityComponentSystem/Components/MotionComponent.ts\");\n/* harmony import */ var _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../Collision/ColliderComponent */ \"./Collision/ColliderComponent.ts\");\n/* harmony import */ var _Graphics_DebugGraphicsComponent__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../Graphics/DebugGraphicsComponent */ \"./Graphics/DebugGraphicsComponent.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../Events */ \"./Events.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Math_coord_plane__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../Math/coord-plane */ \"./Math/coord-plane.ts\");\n/* harmony import */ var _Math_util__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../Math/util */ \"./Math/util.ts\");\n/* harmony import */ var _Input_PointerComponent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../Input/PointerComponent */ \"./Input/PointerComponent.ts\");\n/* harmony import */ var _Input_PointerEventsToObjectDispatcher__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../Input/PointerEventsToObjectDispatcher */ \"./Input/PointerEventsToObjectDispatcher.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst TileMapEvents = {\n PreUpdate: 'preupdate',\n PostUpdate: 'postupdate',\n PreDraw: 'predraw',\n PostDraw: 'postdraw',\n PointerUp: 'pointerup',\n PointerDown: 'pointerdown',\n PointerMove: 'pointermove',\n PointerCancel: 'pointercancel'\n};\n/**\n * The TileMap provides a mechanism for doing flat 2D tiles rendered in a grid.\n *\n * TileMaps are useful for top down or side scrolling grid oriented games.\n */\nclass TileMap extends _EntityComponentSystem_Entity__WEBPACK_IMPORTED_MODULE_0__.Entity {\n flagCollidersDirty() {\n this._collidersDirty = true;\n }\n flagTilesDirty() {\n for (let i = 0; i < this.tiles.length; i++) {\n if (this.tiles[i]) {\n this.tiles[i].flagDirty();\n }\n }\n }\n get x() {\n var _a;\n return (_a = this.transform.pos.x) !== null && _a !== void 0 ? _a : 0;\n }\n set x(val) {\n var _a;\n if ((_a = this.transform) === null || _a === void 0 ? void 0 : _a.pos) {\n this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent).pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(val, this.y);\n }\n }\n get y() {\n var _a, _b;\n return (_b = (_a = this.transform) === null || _a === void 0 ? void 0 : _a.pos.y) !== null && _b !== void 0 ? _b : 0;\n }\n set y(val) {\n var _a;\n if ((_a = this.transform) === null || _a === void 0 ? void 0 : _a.pos) {\n this.transform.pos = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(this.x, val);\n }\n }\n get z() {\n var _a;\n return (_a = this.transform.z) !== null && _a !== void 0 ? _a : 0;\n }\n set z(val) {\n if (this.transform) {\n this.transform.z = val;\n }\n }\n get rotation() {\n var _a, _b;\n return (_b = (_a = this.transform) === null || _a === void 0 ? void 0 : _a.rotation) !== null && _b !== void 0 ? _b : 0;\n }\n set rotation(val) {\n if (this.transform) {\n this.transform.rotation = val;\n }\n }\n get scale() {\n var _a, _b;\n return (_b = (_a = this.transform) === null || _a === void 0 ? void 0 : _a.scale) !== null && _b !== void 0 ? _b : _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.One;\n }\n set scale(val) {\n var _a;\n if ((_a = this.transform) === null || _a === void 0 ? void 0 : _a.scale) {\n this.transform.scale = val;\n }\n }\n get pos() {\n return this.transform.pos;\n }\n set pos(val) {\n this.transform.pos = val;\n }\n get vel() {\n return this._motion.vel;\n }\n set vel(val) {\n this._motion.vel = val;\n }\n /**\n * Width of the whole tile map in pixels\n */\n get width() {\n return this.tileWidth * this.columns * this.scale.x;\n }\n /**\n * Height of the whole tilemap in pixels\n */\n get height() {\n return this.tileHeight * this.rows * this.scale.y;\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n this.events.off(eventName, handler);\n }\n /**\n * @param options\n */\n constructor(options) {\n var _a, _b, _c;\n super([], options.name);\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_3__.EventEmitter();\n this._token = 0;\n this.logger = _Util_Log__WEBPACK_IMPORTED_MODULE_4__.Logger.getInstance();\n this.tiles = [];\n this._rows = [];\n this._cols = [];\n this.renderFromTopOfGraphic = false;\n this.meshingLookBehind = 10;\n this._collidersDirty = true;\n this._oldRotation = 0;\n this._originalOffsets = new WeakMap();\n this.meshingLookBehind = (_a = options.meshingLookBehind) !== null && _a !== void 0 ? _a : this.meshingLookBehind;\n this.addComponent(new _EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent());\n this.addComponent(new _EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_5__.MotionComponent());\n this.addComponent(new _Collision_BodyComponent__WEBPACK_IMPORTED_MODULE_6__.BodyComponent({\n type: _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_7__.CollisionType.Fixed\n }));\n this.addComponent(new _Graphics__WEBPACK_IMPORTED_MODULE_8__.GraphicsComponent({\n onPostDraw: (ctx, elapsed) => this.draw(ctx, elapsed)\n }));\n this.addComponent(new _Graphics_DebugGraphicsComponent__WEBPACK_IMPORTED_MODULE_9__.DebugGraphicsComponent((ctx, debugFlags) => this.debug(ctx, debugFlags), false));\n this.addComponent(new _Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_10__.ColliderComponent());\n this.addComponent(new _Input_PointerComponent__WEBPACK_IMPORTED_MODULE_11__.PointerComponent());\n this.pointer = this.get(_Input_PointerComponent__WEBPACK_IMPORTED_MODULE_11__.PointerComponent);\n this._graphics = this.get(_Graphics__WEBPACK_IMPORTED_MODULE_8__.GraphicsComponent);\n this.transform = this.get(_EntityComponentSystem_Components_TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent);\n this._motion = this.get(_EntityComponentSystem_Components_MotionComponent__WEBPACK_IMPORTED_MODULE_5__.MotionComponent);\n this.collider = this.get(_Collision_ColliderComponent__WEBPACK_IMPORTED_MODULE_10__.ColliderComponent);\n this._composite = this.collider.useCompositeCollider([]);\n this.transform.pos = (_b = options.pos) !== null && _b !== void 0 ? _b : _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero;\n this._oldPos = this.transform.pos.clone();\n this._oldScale = this.transform.scale.clone();\n this.renderFromTopOfGraphic = (_c = options.renderFromTopOfGraphic) !== null && _c !== void 0 ? _c : this.renderFromTopOfGraphic;\n this.tileWidth = options.tileWidth;\n this.tileHeight = options.tileHeight;\n this.rows = options.rows;\n this.columns = options.columns;\n this._pointerEventDispatcher = new _Input_PointerEventsToObjectDispatcher__WEBPACK_IMPORTED_MODULE_12__.PointerEventsToObjectDispatcher();\n this.tiles = new Array(this.rows * this.columns);\n this._rows = new Array(this.rows);\n this._cols = new Array(this.columns);\n let currentCol = [];\n for (let i = 0; i < this.columns; i++) {\n for (let j = 0; j < this.rows; j++) {\n const tile = new Tile({\n x: i,\n y: j,\n map: this\n });\n tile.map = this;\n this.tiles[i + j * this.columns] = tile;\n this._pointerEventDispatcher.addObject(tile, (vec) => {\n // TODO handle geometry/graphics\n return tile.bounds.contains(vec.worldPos);\n }, () => true);\n currentCol.push(tile);\n if (!this._rows[j]) {\n this._rows[j] = [];\n }\n this._rows[j].push(tile);\n }\n this._cols[i] = currentCol;\n currentCol = [];\n }\n this._graphics.localBounds = new _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_13__.BoundingBox({\n left: 0,\n top: 0,\n right: this.columns * this.tileWidth * this.scale.x,\n bottom: this.rows * this.tileHeight * this.scale.y\n });\n }\n _initialize(engine) {\n super._initialize(engine);\n this._engine = engine;\n }\n _getOrSetColliderOriginalOffset(collider) {\n var _a;\n if (!this._originalOffsets.has(collider)) {\n const originalOffset = collider.offset;\n this._originalOffsets.set(collider, originalOffset);\n return originalOffset;\n }\n else {\n return (_a = this._originalOffsets.get(collider)) !== null && _a !== void 0 ? _a : _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero;\n }\n }\n /**\n * Tiles colliders based on the solid tiles in the tilemap.\n */\n _updateColliders() {\n this.collider.$colliderRemoved.notifyAll(this._composite);\n this._composite.clearColliders();\n const colliders = [];\n this._composite = this.collider.useCompositeCollider([]);\n let current = null;\n /**\n * Returns wether or not the 2 boxes share an edge and are the same height\n * @param prev\n * @param next\n * @returns true if they share and edge, false if not\n */\n const shareEdges = (prev, next) => {\n if (prev && next) {\n // same top/bottom\n return (prev.top === next.top &&\n prev.bottom === next.bottom &&\n // Shared right/left edge\n prev.right === next.left);\n }\n return false;\n };\n /**\n * Potentially merges the current collider into a list of previous ones, mutating the list\n * If checkAndCombine returns true, the collider was successfully merged and should be thrown away\n * @param current current collider to test\n * @param colliders List of colliders to consider merging with\n * @param maxLookBack The amount of colliders to look back for combination\n * @returns false when no combination found, true when successfully combined\n */\n const checkAndCombine = (current, colliders, maxLookBack = this.meshingLookBehind) => {\n if (!current) {\n return false;\n }\n // walk backwards through the list of colliders and combine with the first that shares an edge\n for (let i = colliders.length - 1; i >= 0; i--) {\n if (maxLookBack-- < 0) {\n // blunt the O(n^2) algorithm a bit\n return false;\n }\n const prev = colliders[i];\n if (shareEdges(prev, current)) {\n colliders[i] = prev.combine(current);\n return true;\n }\n }\n return false;\n };\n // ? configurable bias perhaps, horizontal strips vs. vertical ones\n // Bad tile collider packing algorithm\n for (let i = 0; i < this.columns; i++) {\n // Scan column for colliders\n for (let j = 0; j < this.rows; j++) {\n const tile = this.tiles[i + j * this.columns];\n // Current tile in column is solid build up current collider\n if (tile.solid) {\n // Use custom collider otherwise bounding box\n if (tile.getColliders().length > 0) {\n // tile with custom collider interrupting the current run\n for (const collider of tile.getColliders()) {\n const originalOffset = this._getOrSetColliderOriginalOffset(collider);\n collider.offset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(tile.x * this.tileWidth * this.scale.x, tile.y * this.tileHeight * this.scale.y).add(originalOffset);\n collider.owner = this;\n this._composite.addCollider(collider);\n }\n //we push any current collider before nulling the current run\n if (current && !checkAndCombine(current, colliders)) {\n colliders.push(current);\n }\n current = null;\n // Use the bounding box\n }\n else {\n if (!current) {\n // no current run, start one\n current = tile.defaultGeometry;\n }\n else {\n // combine with current run\n current = current.combine(tile.defaultGeometry);\n }\n }\n }\n else {\n // Not solid skip and cut off the current collider\n // End of run check and combine\n if (current && !checkAndCombine(current, colliders)) {\n colliders.push(current);\n }\n current = null;\n }\n }\n // After a column is complete check to see if it can be merged into the last one\n // Eno of run check and combine\n if (current && !checkAndCombine(current, colliders)) {\n // else new collider if no combination\n colliders.push(current);\n }\n current = null;\n }\n for (const c of colliders) {\n const collider = _Collision_Colliders_Shape__WEBPACK_IMPORTED_MODULE_14__.Shape.Box(c.width, c.height, _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero, (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(c.left - this.pos.x, c.top - this.pos.y));\n collider.owner = this;\n this._composite.addCollider(collider);\n }\n this.collider.update();\n // Notify that colliders have been updated\n this.collider.$colliderAdded.notifyAll(this._composite);\n }\n /**\n * Returns the {@apilink Tile} by index (row major order)\n *\n * Returns null if out of bounds\n */\n getTileByIndex(index) {\n var _a;\n return (_a = this.tiles[index]) !== null && _a !== void 0 ? _a : null;\n }\n /**\n * Returns the {@apilink Tile} by its x and y integer coordinates\n *\n * Returns null if out of bounds\n *\n * For example, if I want the tile in fifth column (x), and second row (y):\n * `getTile(4, 1)` 0 based, so 0 is the first in row/column\n */\n getTile(x, y) {\n if (x < 0 || y < 0 || x >= this.columns || y >= this.rows) {\n return null;\n }\n return this.tiles[x + y * this.columns];\n }\n /**\n * Returns the {@apilink Tile} by testing a point in world coordinates,\n * returns `null` if no Tile was found.\n */\n getTileByPoint(point) {\n const { x, y } = this._getTileCoordinates(point);\n const tile = this.getTile(x, y);\n if (x >= 0 && y >= 0 && x < this.columns && y < this.rows && tile) {\n return tile;\n }\n return null;\n }\n _getTileCoordinates(point) {\n // Convert to Tile Space point\n point = this.transform.applyInverse(point);\n const x = Math.floor(point.x / this.tileWidth);\n const y = Math.floor(point.y / this.tileHeight);\n return { x, y };\n }\n getRows() {\n return this._rows;\n }\n getColumns() {\n return this._cols;\n }\n /**\n * Returns the on screen tiles for a tilemap, this will overshoot by a small amount because of the internal quad tree data structure.\n *\n * Useful if you need to perform specific logic on onscreen tiles\n */\n getOnScreenTiles() {\n let worldBounds = this._engine.screen.getWorldBounds();\n const maybeParallax = this.get(_Graphics__WEBPACK_IMPORTED_MODULE_15__.ParallaxComponent);\n if (maybeParallax && this.isInitialized) {\n let pos = this.pos;\n const oneMinusFactor = _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.One.sub(maybeParallax.parallaxFactor);\n const parallaxOffset = this._engine.currentScene.camera.pos.scale(oneMinusFactor);\n pos = pos.sub(parallaxOffset);\n // adjust world bounds by parallax factor\n worldBounds = worldBounds.translate(pos);\n }\n const bounds = this.transform.coordPlane === _Math_coord_plane__WEBPACK_IMPORTED_MODULE_16__.CoordPlane.Screen ? this._engine.screen.getScreenBounds() : worldBounds;\n const topLeft = this._getTileCoordinates(bounds.topLeft);\n const topRight = this._getTileCoordinates(bounds.topRight);\n const bottomRight = this._getTileCoordinates(bounds.bottomRight);\n const bottomLeft = this._getTileCoordinates(bounds.bottomLeft);\n const tileStartX = Math.min((0,_Math_util__WEBPACK_IMPORTED_MODULE_17__.clamp)(topLeft.x, 0, this.columns - 1), (0,_Math_util__WEBPACK_IMPORTED_MODULE_17__.clamp)(topRight.x, 0, this.columns - 1));\n const tileStartY = Math.min((0,_Math_util__WEBPACK_IMPORTED_MODULE_17__.clamp)(topLeft.y, 0, this.rows - 1), (0,_Math_util__WEBPACK_IMPORTED_MODULE_17__.clamp)(topRight.y, 0, this.rows - 1));\n const tileEndX = Math.max((0,_Math_util__WEBPACK_IMPORTED_MODULE_17__.clamp)(bottomRight.x, 0, this.columns - 1), (0,_Math_util__WEBPACK_IMPORTED_MODULE_17__.clamp)(bottomLeft.x, 0, this.columns - 1));\n const tileEndY = Math.max((0,_Math_util__WEBPACK_IMPORTED_MODULE_17__.clamp)(bottomRight.y, 0, this.rows - 1), (0,_Math_util__WEBPACK_IMPORTED_MODULE_17__.clamp)(bottomLeft.y, 0, this.rows - 1));\n const tiles = [];\n for (let x = tileStartX; x <= tileEndX; x++) {\n for (let y = tileStartY; y <= tileEndY; y++) {\n tiles.push(this.getTile(x, y));\n }\n }\n return tiles;\n }\n /**\n * @internal\n */\n _processPointerToObject(receiver) {\n this._pointerEventDispatcher.processPointerToObject(receiver, this.tiles);\n }\n /**\n * @internal\n */\n _dispatchPointerEvents(receiver) {\n this._pointerEventDispatcher.dispatchEvents(receiver, this.tiles);\n }\n update(engine, elapsed) {\n this._initialize(engine);\n this.onPreUpdate(engine, elapsed);\n this.emit('preupdate', new _Events__WEBPACK_IMPORTED_MODULE_18__.PreUpdateEvent(engine, elapsed, this));\n // Update colliders\n if (!this._oldPos.equals(this.pos) || this._oldRotation !== this.rotation || !this._oldScale.equals(this.scale)) {\n this.flagCollidersDirty();\n this.flagTilesDirty();\n }\n if (this._collidersDirty) {\n this._collidersDirty = false;\n this._updateColliders();\n }\n // Clear last frame's events\n this._pointerEventDispatcher.clear();\n this._token++;\n this.pos.clone(this._oldPos);\n this._oldRotation = this.rotation;\n this.scale.clone(this._oldScale);\n this.transform.pos = this.pos;\n this.onPostUpdate(engine, elapsed);\n this.emit('postupdate', new _Events__WEBPACK_IMPORTED_MODULE_18__.PostUpdateEvent(engine, elapsed, this));\n }\n /**\n * Draws the tile map to the screen. Called by the {@apilink Scene}.\n * @param ctx ExcaliburGraphicsContext\n * @param elapsed The number of milliseconds since the last draw\n */\n draw(ctx, elapsed) {\n if (!this.isInitialized) {\n return;\n }\n this.emit('predraw', new _Events__WEBPACK_IMPORTED_MODULE_18__.PreDrawEvent(ctx, elapsed, this)); // TODO fix event\n let graphics, graphicsIndex, graphicsLen;\n const tiles = this.getOnScreenTiles();\n for (let i = 0; i < tiles.length; i++) {\n const tile = tiles[i];\n // get non-negative tile sprites\n const offsets = tile.getGraphicsOffsets();\n graphics = tile.getGraphics();\n for (graphicsIndex = 0, graphicsLen = graphics.length; graphicsIndex < graphicsLen; graphicsIndex++) {\n // draw sprite, warning if sprite doesn't exist\n const graphic = graphics[graphicsIndex];\n const offset = offsets[graphicsIndex];\n if (graphic) {\n if ((0,_Graphics__WEBPACK_IMPORTED_MODULE_8__.hasGraphicsTick)(graphic)) {\n graphic === null || graphic === void 0 ? void 0 : graphic.tick(elapsed, this._token);\n }\n const offsetY = this.renderFromTopOfGraphic ? 0 : graphic.height - this.tileHeight;\n graphic.draw(ctx, tile.x * this.tileWidth + offset.x, tile.y * this.tileHeight - offsetY + offset.y);\n }\n }\n }\n this.emit('postdraw', new _Events__WEBPACK_IMPORTED_MODULE_18__.PostDrawEvent(ctx, elapsed, this));\n }\n debug(gfx, debugFlags) {\n const { showAll, showGrid, gridColor, gridWidth, showSolidBounds: showColliderBounds, solidBoundsColor: colliderBoundsColor, showColliderGeometry } = debugFlags.tilemap;\n const { geometryColor, geometryLineWidth, geometryPointSize } = debugFlags.collider;\n const width = this.tileWidth * this.columns * this.scale.x;\n const height = this.tileHeight * this.rows * this.scale.y;\n const pos = this.pos;\n if (showGrid || showAll) {\n for (let r = 0; r < this.rows + 1; r++) {\n const yOffset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(0, r * this.tileHeight * this.scale.y);\n gfx.drawLine(pos.add(yOffset), pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(width, yOffset.y)), gridColor, gridWidth);\n }\n for (let c = 0; c < this.columns + 1; c++) {\n const xOffset = (0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(c * this.tileWidth * this.scale.x, 0);\n gfx.drawLine(pos.add(xOffset), pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(xOffset.x, height)), gridColor, gridWidth);\n }\n }\n if (showAll || showColliderBounds || showColliderGeometry) {\n const colliders = this._composite.getColliders();\n gfx.save();\n gfx.translate(this.pos.x, this.pos.y);\n gfx.scale(this.scale.x, this.scale.y);\n for (const collider of colliders) {\n const bounds = collider.localBounds;\n const pos = collider.worldPos.sub(this.pos);\n if (showColliderBounds) {\n gfx.drawRectangle(pos, bounds.width, bounds.height, colliderBoundsColor);\n }\n }\n gfx.restore();\n if (showColliderGeometry) {\n for (const collider of colliders) {\n collider.debug(gfx, geometryColor, { lineWidth: geometryLineWidth, pointSize: geometryPointSize });\n }\n }\n }\n if (showAll || showColliderBounds) {\n gfx.save();\n gfx.z = 999;\n if (showColliderBounds) {\n for (let i = 0; i < this.tiles.length; i++) {\n this.tiles[i].bounds.draw(gfx);\n }\n }\n gfx.restore();\n }\n }\n}\n/**\n * TileMap Tile\n *\n * A light-weight object that occupies a space in a collision map. Generally\n * created by a {@apilink TileMap}.\n *\n * Tiles can draw multiple sprites. Note that the order of drawing is the order\n * of the sprites in the array so the last one will be drawn on top. You can\n * use transparency to create layers this way.\n */\nclass Tile {\n /**\n * Return the world position of the top left corner of the tile\n */\n get pos() {\n if (this._posDirty) {\n this._recalculate();\n this._posDirty = false;\n }\n return this._pos;\n }\n /**\n * Width of the tile in pixels\n */\n get width() {\n return this._width;\n }\n /**\n * Height of the tile in pixels\n */\n get height() {\n return this._height;\n }\n /**\n * Wether this tile should be treated as solid by the tilemap\n */\n get solid() {\n return this._solid;\n }\n /**\n * Wether this tile should be treated as solid by the tilemap\n */\n set solid(val) {\n var _a;\n (_a = this.map) === null || _a === void 0 ? void 0 : _a.flagCollidersDirty();\n this._solid = val;\n }\n /**\n * Current list of graphics for this tile\n */\n getGraphics() {\n return this._graphics;\n }\n /**\n * Current list of offsets for this tile's graphics\n */\n getGraphicsOffsets() {\n return this._offsets;\n }\n /**\n * Add another {@apilink Graphic} to this TileMap tile\n * @param graphic\n */\n addGraphic(graphic, options) {\n this._graphics.push(graphic);\n if (options === null || options === void 0 ? void 0 : options.offset) {\n this._offsets.push(options.offset);\n }\n else {\n this._offsets.push(_Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector.Zero);\n }\n }\n /**\n * Remove an instance of a {@apilink Graphic} from this tile\n */\n removeGraphic(graphic) {\n const index = this._graphics.indexOf(graphic);\n if (index > -1) {\n this._graphics.splice(index, 1);\n this._offsets.splice(index, 1);\n }\n }\n /**\n * Clear all graphics from this tile\n */\n clearGraphics() {\n this._graphics.length = 0;\n this._offsets.length = 0;\n }\n /**\n * Returns the list of colliders\n */\n getColliders() {\n return this._colliders;\n }\n /**\n * Adds a custom collider to the {@apilink Tile} to use instead of it's bounds\n *\n * If no collider is set but {@apilink Tile.solid} is set, the tile bounds are used as a collider.\n *\n * **Note!** the {@apilink Tile.solid} must be set to true for it to act as a \"fixed\" collider\n * @param collider\n */\n addCollider(collider) {\n this._colliders.push(collider);\n this.map.flagCollidersDirty();\n }\n /**\n * Removes a collider from the {@apilink Tile}\n * @param collider\n */\n removeCollider(collider) {\n const index = this._colliders.indexOf(collider);\n if (index > -1) {\n this._colliders.splice(index, 1);\n }\n this.map.flagCollidersDirty();\n }\n /**\n * Clears all colliders from the {@apilink Tile}\n */\n clearColliders() {\n this._colliders.length = 0;\n this.map.flagCollidersDirty();\n }\n constructor(options) {\n var _a, _b;\n this._posDirty = false;\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_3__.EventEmitter();\n this._solid = false;\n this._graphics = [];\n this._offsets = [];\n /**\n * Current list of colliders for this tile\n */\n this._colliders = [];\n /**\n * Arbitrary data storage per tile, useful for any game specific data\n */\n this.data = new Map();\n this.x = options.x;\n this.y = options.y;\n this.map = options.map;\n this._width = options.map.tileWidth * this.map.scale.x;\n this._height = options.map.tileHeight * this.map.scale.y;\n this.solid = (_a = options.solid) !== null && _a !== void 0 ? _a : this.solid;\n this._graphics = (_b = options.graphics) !== null && _b !== void 0 ? _b : [];\n this._recalculate();\n }\n flagDirty() {\n return (this._posDirty = true);\n }\n _recalculate() {\n const geometryPos = this.map.pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(this.x * this.map.tileWidth, this.y * this.map.tileHeight));\n this._geometry = new _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_13__.BoundingBox(geometryPos.x, geometryPos.y, geometryPos.x + this.map.tileWidth, geometryPos.y + this.map.tileHeight);\n this._width = this.map.tileWidth * this.map.scale.x;\n this._height = this.map.tileHeight * this.map.scale.y;\n this._pos = this.map.pos.add((0,_Math_vector__WEBPACK_IMPORTED_MODULE_2__.vec)(this.x * this._width, this.y * this._height));\n this._bounds = new _Collision_BoundingBox__WEBPACK_IMPORTED_MODULE_13__.BoundingBox(this._pos.x, this._pos.y, this._pos.x + this._width, this._pos.y + this._height);\n if (this.map.rotation) {\n this._bounds = this._bounds.rotate(this.map.rotation, this.map.pos);\n }\n this._posDirty = false;\n }\n /**\n * Tile bounds in world space\n */\n get bounds() {\n if (this._posDirty) {\n this._recalculate();\n }\n return this._bounds;\n }\n get defaultGeometry() {\n return this._geometry;\n }\n /**\n * Tile position in world space\n */\n get center() {\n if (this._posDirty) {\n this._recalculate();\n }\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_2__.Vector(this._pos.x + this._width / 2, this._pos.y + this._height / 2);\n }\n emit(eventName, event) {\n this.events.emit(eventName, event);\n }\n on(eventName, handler) {\n return this.events.on(eventName, handler);\n }\n once(eventName, handler) {\n return this.events.once(eventName, handler);\n }\n off(eventName, handler) {\n if (handler) {\n this.events.off(eventName, handler);\n }\n else {\n this.events.off(eventName);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./TileMap/index.ts\":\n/*!**************************!*\\\n !*** ./TileMap/index.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ IsometricEntityComponent: () => (/* reexport safe */ _IsometricEntityComponent__WEBPACK_IMPORTED_MODULE_2__.IsometricEntityComponent),\n/* harmony export */ IsometricEntitySystem: () => (/* reexport safe */ _IsometricEntitySystem__WEBPACK_IMPORTED_MODULE_3__.IsometricEntitySystem),\n/* harmony export */ IsometricMap: () => (/* reexport safe */ _IsometricMap__WEBPACK_IMPORTED_MODULE_1__.IsometricMap),\n/* harmony export */ IsometricTile: () => (/* reexport safe */ _IsometricMap__WEBPACK_IMPORTED_MODULE_1__.IsometricTile),\n/* harmony export */ Tile: () => (/* reexport safe */ _TileMap__WEBPACK_IMPORTED_MODULE_0__.Tile),\n/* harmony export */ TileMap: () => (/* reexport safe */ _TileMap__WEBPACK_IMPORTED_MODULE_0__.TileMap),\n/* harmony export */ TileMapEvents: () => (/* reexport safe */ _TileMap__WEBPACK_IMPORTED_MODULE_0__.TileMapEvents)\n/* harmony export */ });\n/* harmony import */ var _TileMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./TileMap */ \"./TileMap/TileMap.ts\");\n/* harmony import */ var _IsometricMap__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./IsometricMap */ \"./TileMap/IsometricMap.ts\");\n/* harmony import */ var _IsometricEntityComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./IsometricEntityComponent */ \"./TileMap/IsometricEntityComponent.ts\");\n/* harmony import */ var _IsometricEntitySystem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./IsometricEntitySystem */ \"./TileMap/IsometricEntitySystem.ts\");\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Timer.ts\":\n/*!******************!*\\\n !*** ./Timer.ts ***!\n \\******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Timer: () => (/* binding */ Timer)\n/* harmony export */ });\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Math_Random__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Math/Random */ \"./Math/Random.ts\");\n\n\n/**\n * The Excalibur timer hooks into the internal timer and fires callbacks,\n * after a certain interval, optionally repeating.\n */\nclass Timer {\n get complete() {\n return this._complete;\n }\n constructor(options) {\n var _a;\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance();\n this.id = 0;\n this._elapsedTime = 0;\n this._totalTimeAlive = 0;\n this._running = false;\n this._numberOfTicks = 0;\n this.interval = 10;\n this.repeats = false;\n this.maxNumberOfRepeats = -1;\n this.randomRange = [0, 0];\n this._baseInterval = 10;\n this._generateRandomInterval = () => {\n return this._baseInterval + this.random.integer(this.randomRange[0], this.randomRange[1]);\n };\n this._complete = false;\n this.scene = null;\n const fcn = (_a = options.action) !== null && _a !== void 0 ? _a : options.fcn;\n const interval = options.interval;\n const repeats = options.repeats;\n const numberOfRepeats = options.numberOfRepeats;\n const randomRange = options.randomRange;\n const random = options.random;\n if (!!numberOfRepeats && numberOfRepeats >= 0) {\n this.maxNumberOfRepeats = numberOfRepeats;\n if (!repeats) {\n throw new Error('repeats must be set to true if numberOfRepeats is set');\n }\n }\n this.id = Timer._MAX_ID++;\n this._callbacks = [];\n this._baseInterval = this.interval = interval;\n if (!!randomRange) {\n if (randomRange[0] > randomRange[1]) {\n throw new Error('min value must be lower than max value for range');\n }\n //We use the instance of ex.Random to generate the range\n this.random = random !== null && random !== void 0 ? random : new _Math_Random__WEBPACK_IMPORTED_MODULE_1__.Random();\n this.randomRange = randomRange;\n this.interval = this._generateRandomInterval();\n this.on(() => {\n this.interval = this._generateRandomInterval();\n });\n }\n this.repeats = repeats || this.repeats;\n if (fcn) {\n this.on(fcn);\n }\n }\n /**\n * Adds a new callback to be fired after the interval is complete\n * @param action The callback to be added to the callback list, to be fired after the interval is complete.\n */\n on(action) {\n this._callbacks.push(action);\n }\n /**\n * Removes a callback from the callback list to be fired after the interval is complete.\n * @param action The callback to be removed from the callback list, to be fired after the interval is complete.\n */\n off(action) {\n const index = this._callbacks.indexOf(action);\n this._callbacks.splice(index, 1);\n }\n /**\n * Updates the timer after a certain number of milliseconds have elapsed. This is used internally by the engine.\n * @param elapsed Number of elapsed milliseconds since the last update.\n */\n update(elapsed) {\n if (this._running) {\n this._totalTimeAlive += elapsed;\n this._elapsedTime += elapsed;\n if (this.maxNumberOfRepeats > -1 && this._numberOfTicks >= this.maxNumberOfRepeats) {\n this._complete = true;\n this._running = false;\n this._elapsedTime = 0;\n }\n if (!this.complete && this._elapsedTime >= this.interval) {\n this._callbacks.forEach((c) => {\n c.call(this);\n });\n this._numberOfTicks++;\n if (this.repeats) {\n this._elapsedTime = 0;\n }\n else {\n this._complete = true;\n this._running = false;\n this._elapsedTime = 0;\n }\n }\n }\n }\n /**\n * Resets the timer so that it can be reused, and optionally reconfigure the timers interval.\n *\n * Warning** you may need to call `timer.start()` again if the timer had completed\n * @param newInterval If specified, sets a new non-negative interval in milliseconds to refire the callback\n * @param newNumberOfRepeats If specified, sets a new non-negative upper limit to the number of time this timer executes\n */\n reset(newInterval, newNumberOfRepeats) {\n if (!!newInterval && newInterval >= 0) {\n this._baseInterval = this.interval = newInterval;\n }\n if (!!this.maxNumberOfRepeats && this.maxNumberOfRepeats >= 0) {\n this.maxNumberOfRepeats = newNumberOfRepeats;\n if (!this.repeats) {\n throw new Error('repeats must be set to true if numberOfRepeats is set');\n }\n }\n this._complete = false;\n this._elapsedTime = 0;\n this._numberOfTicks = 0;\n }\n get timesRepeated() {\n return this._numberOfTicks;\n }\n getTimeRunning() {\n return this._totalTimeAlive;\n }\n /**\n * @returns milliseconds until the next action callback, if complete will return 0\n */\n get timeToNextAction() {\n if (this.complete) {\n return 0;\n }\n return this.interval - this._elapsedTime;\n }\n /**\n * @returns milliseconds elapsed toward the next action\n */\n get timeElapsedTowardNextAction() {\n return this._elapsedTime;\n }\n get isRunning() {\n return this._running;\n }\n /**\n * Pauses the timer, time will no longer increment towards the next call\n */\n pause() {\n this._running = false;\n return this;\n }\n /**\n * Resumes the timer, time will now increment towards the next call.\n */\n resume() {\n this._running = true;\n return this;\n }\n /**\n * Starts the timer, if the timer was complete it will restart the timer and reset the elapsed time counter\n */\n start() {\n if (!this.scene) {\n this._logger.warn('Cannot start a timer not part of a scene, timer wont start until added');\n }\n this._running = true;\n if (this.complete) {\n this._complete = false;\n this._elapsedTime = 0;\n this._numberOfTicks = 0;\n }\n return this;\n }\n /**\n * Stops the timer and resets the elapsed time counter towards the next action invocation\n */\n stop() {\n this._running = false;\n this._elapsedTime = 0;\n this._numberOfTicks = 0;\n return this;\n }\n /**\n * Cancels the timer, preventing any further executions.\n */\n cancel() {\n this.pause();\n if (this.scene) {\n this.scene.cancelTimer(this);\n }\n }\n}\nTimer._MAX_ID = 0;\n\n\n/***/ }),\n\n/***/ \"./Trigger.ts\":\n/*!********************!*\\\n !*** ./Trigger.ts ***!\n \\********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Trigger: () => (/* binding */ Trigger),\n/* harmony export */ TriggerEvents: () => (/* binding */ TriggerEvents)\n/* harmony export */ });\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Events */ \"./Events.ts\");\n/* harmony import */ var _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Collision/CollisionType */ \"./Collision/CollisionType.ts\");\n/* harmony import */ var _Actor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Actor */ \"./Actor.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./EventEmitter */ \"./EventEmitter.ts\");\n\n\n\n\nconst TriggerEvents = {\n ExitTrigger: 'exit',\n EnterTrigger: 'enter'\n};\n/**\n * Triggers are a method of firing arbitrary code on collision. These are useful\n * as 'buttons', 'switches', or to trigger effects in a game. By default triggers\n * are invisible, and can only be seen when {@apilink Trigger.visible} is set to `true`.\n */\nclass Trigger extends _Actor__WEBPACK_IMPORTED_MODULE_0__.Actor {\n /**\n * @param options Trigger options\n */\n constructor(options) {\n var _a, _b, _c, _d;\n super({ ...options });\n this.events = new _EventEmitter__WEBPACK_IMPORTED_MODULE_1__.EventEmitter();\n this.filter = (_a = options.filter) !== null && _a !== void 0 ? _a : (() => true);\n this.repeat = (_b = options.repeat) !== null && _b !== void 0 ? _b : -1;\n this.action = (_c = options.action) !== null && _c !== void 0 ? _c : (() => undefined);\n this.target = options.target;\n this.graphics.isVisible = (_d = options.visible) !== null && _d !== void 0 ? _d : false;\n this.body.collisionType = _Collision_CollisionType__WEBPACK_IMPORTED_MODULE_2__.CollisionType.Passive;\n this.events.on('collisionstart', ({ other: collider }) => {\n if (!this._matchesTarget(collider.owner)) {\n return;\n }\n this.events.emit('enter', new _Events__WEBPACK_IMPORTED_MODULE_3__.EnterTriggerEvent(this, collider.owner));\n this._dispatchAction(collider.owner);\n // remove trigger if its done, -1 repeat forever\n if (this.repeat === 0) {\n this.kill();\n }\n });\n this.events.on('collisionend', ({ other: collider }) => {\n if (this._matchesTarget(collider.owner)) {\n this.events.emit('exit', new _Events__WEBPACK_IMPORTED_MODULE_3__.ExitTriggerEvent(this, collider.owner));\n }\n });\n }\n _matchesTarget(entity) {\n return this.filter(entity) && (this.target === undefined || this.target === entity);\n }\n _dispatchAction(target) {\n if (this.repeat !== 0) {\n this.action.call(this, target);\n this.repeat--;\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Assert.ts\":\n/*!************************!*\\\n !*** ./Util/Assert.ts ***!\n \\************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ assert: () => (/* binding */ assert)\n/* harmony export */ });\n/**\n * Asserts will throw in `process.env.NODE_ENV === 'development'` builds if the expression evaluates false\n */\nfunction assert(message, expression) {\n if (true) {\n if (!expression()) {\n throw new Error(message);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Browser.ts\":\n/*!*************************!*\\\n !*** ./Util/Browser.ts ***!\n \\*************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BrowserComponent: () => (/* binding */ BrowserComponent),\n/* harmony export */ BrowserEvents: () => (/* binding */ BrowserEvents)\n/* harmony export */ });\nclass BrowserComponent {\n on(eventName, handler) {\n if (this._nativeHandlers[eventName]) {\n this.off(eventName, this._nativeHandlers[eventName]);\n }\n this._nativeHandlers[eventName] = this._decorate(handler);\n this.nativeComponent.addEventListener(eventName, this._nativeHandlers[eventName]);\n }\n off(eventName, handler) {\n if (!handler) {\n handler = this._nativeHandlers[eventName];\n }\n this.nativeComponent.removeEventListener(eventName, handler);\n this._nativeHandlers[eventName] = null;\n }\n _decorate(handler) {\n return (evt) => {\n if (!this._paused) {\n handler(evt);\n }\n };\n }\n pause() {\n this._paused = true;\n }\n resume() {\n this._paused = false;\n }\n clear() {\n for (const event in this._nativeHandlers) {\n this.off(event);\n }\n }\n constructor(nativeComponent) {\n this.nativeComponent = nativeComponent;\n this._paused = false;\n this._nativeHandlers = {};\n }\n}\nclass BrowserEvents {\n constructor(_windowGlobal, _documentGlobal) {\n this._windowGlobal = _windowGlobal;\n this._documentGlobal = _documentGlobal;\n this._windowComponent = new BrowserComponent(this._windowGlobal);\n this._documentComponent = new BrowserComponent(this._documentGlobal);\n }\n get window() {\n return this._windowComponent;\n }\n get document() {\n return this._documentComponent;\n }\n pause() {\n this.window.pause();\n this.document.pause();\n }\n resume() {\n this.window.resume();\n this.document.resume();\n }\n clear() {\n this.window.clear();\n this.document.clear();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Clock.ts\":\n/*!***********************!*\\\n !*** ./Util/Clock.ts ***!\n \\***********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Clock: () => (/* binding */ Clock),\n/* harmony export */ StandardClock: () => (/* binding */ StandardClock),\n/* harmony export */ TestClock: () => (/* binding */ TestClock)\n/* harmony export */ });\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Fps__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Fps */ \"./Util/Fps.ts\");\n\n\n/**\n * Abstract Clock is the base type of all Clocks\n *\n * It has a few opinions\n * 1. It manages the calculation of what \"elapsed\" time means and thus maximum fps\n * 2. The default timing api is implemented in now()\n *\n * To implement your own clock, extend Clock and override start/stop to start and stop the clock, then call update() with whatever\n * method is unique to your clock implementation.\n */\nclass Clock {\n constructor(options) {\n var _a, _b, _c;\n this._onFatalException = () => {\n /* default nothing */\n };\n this._maxFps = Infinity;\n this._lastTime = 0;\n this._elapsed = 1;\n this._scheduledCbs = [];\n this._totalElapsed = 0;\n this._options = options;\n this.tick = options.tick;\n this._lastTime = (_a = this.now()) !== null && _a !== void 0 ? _a : 0;\n this._maxFps = (_b = options.maxFps) !== null && _b !== void 0 ? _b : this._maxFps;\n this._onFatalException = (_c = options.onFatalException) !== null && _c !== void 0 ? _c : this._onFatalException;\n this.fpsSampler = new _Fps__WEBPACK_IMPORTED_MODULE_0__.FpsSampler({\n initialFps: 60,\n nowFn: () => this.now()\n });\n }\n /**\n * Get the elapsed time for the last completed frame\n */\n elapsed() {\n return this._elapsed;\n }\n /**\n * Get the current time in milliseconds\n */\n now() {\n return performance.now();\n }\n toTestClock() {\n const testClock = new TestClock({\n ...this._options,\n defaultUpdateMs: 16.6\n });\n return testClock;\n }\n toStandardClock() {\n const clock = new StandardClock({\n ...this._options\n });\n return clock;\n }\n setFatalExceptionHandler(handler) {\n this._onFatalException = handler;\n }\n /**\n * Schedule a callback to fire given a timeout in milliseconds using the excalibur {@apilink Clock}\n *\n * This is useful to use over the built in browser `setTimeout` because callbacks will be tied to the\n * excalibur update clock, instead of browser time, this means that callbacks wont fire if the game is\n * stopped or paused.\n * @param cb callback to fire\n * @param timeoutMs Optionally specify a timeout in milliseconds from now, default is 0ms which means the next possible tick\n * @param timing Optionally specify a timeout in milliseconds from now, default is 0ms which means the next possible tick\n */\n schedule(cb, timeoutMs = 0, timing = 'preframe') {\n // Scheduled based on internal elapsed time\n const scheduledTime = this._totalElapsed + timeoutMs;\n this._scheduledCbs.push([cb, scheduledTime, timing]);\n }\n /**\n * Called internally to trigger scheduled callbacks in the clock\n * @param timing\n * @internal\n */\n __runScheduledCbs(timing = 'preframe') {\n // walk backwards to delete items as we loop\n for (let i = this._scheduledCbs.length - 1; i > -1; i--) {\n if (timing === this._scheduledCbs[i][2] && this._scheduledCbs[i][1] <= this._totalElapsed) {\n this._scheduledCbs[i][0](this._elapsed);\n this._scheduledCbs.splice(i, 1);\n }\n }\n }\n update(overrideUpdateMs) {\n try {\n this.fpsSampler.start();\n // Get the time to calculate time-elapsed\n const now = this.now();\n let elapsed = now - this._lastTime || 1; // first frame\n // Constrain fps\n const fpsInterval = 1000 / this._maxFps;\n // only run frame if enough time has elapsed\n if (elapsed >= fpsInterval) {\n let leftover = 0;\n if (fpsInterval !== 0) {\n leftover = elapsed % fpsInterval;\n elapsed = elapsed - leftover; // shift elapsed to be \"in phase\" with the current loop fps\n }\n // Resolves issue #138 if the game has been paused, or blurred for\n // more than a 200 milliseconds, reset elapsed time to 1. This improves reliability\n // and provides more expected behavior when the engine comes back\n // into focus\n if (elapsed > 200) {\n elapsed = 1;\n }\n // tick the mainloop and run scheduled callbacks\n this._elapsed = overrideUpdateMs || elapsed;\n this._totalElapsed += this._elapsed;\n this.__runScheduledCbs('preframe');\n this.tick(overrideUpdateMs || elapsed);\n this.__runScheduledCbs('postframe');\n if (fpsInterval !== 0) {\n this._lastTime = now - leftover;\n }\n else {\n this._lastTime = now;\n }\n this.fpsSampler.end();\n }\n }\n catch (e) {\n this._onFatalException(e);\n this.stop();\n }\n }\n}\n/**\n * The {@apilink StandardClock} implements the requestAnimationFrame browser api to run the tick()\n */\nclass StandardClock extends Clock {\n constructor(options) {\n super(options);\n this._running = false;\n }\n isRunning() {\n return this._running;\n }\n start() {\n if (this._running) {\n return;\n }\n this._running = true;\n const mainloop = () => {\n // stop the loop\n if (!this._running) {\n return;\n }\n try {\n // request next loop\n this._requestId = window.requestAnimationFrame(mainloop);\n this.update();\n }\n catch (e) {\n window.cancelAnimationFrame(this._requestId);\n throw e;\n }\n };\n // begin the first frame\n mainloop();\n }\n stop() {\n window.cancelAnimationFrame(this._requestId);\n this._running = false;\n }\n}\n/**\n * The TestClock is meant for debugging interactions in excalibur that require precise timing to replicate or test\n */\nclass TestClock extends Clock {\n constructor(options) {\n super({\n ...options\n });\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n this._running = false;\n this._currentTime = 0;\n this._updateMs = options.defaultUpdateMs;\n }\n /**\n * Get the current time in milliseconds\n */\n now() {\n var _a;\n return (_a = this._currentTime) !== null && _a !== void 0 ? _a : 0;\n }\n isRunning() {\n return this._running;\n }\n start() {\n this._running = true;\n }\n stop() {\n this._running = false;\n }\n /**\n * Manually step the clock forward 1 tick, optionally specify an elapsed time in milliseconds\n * @param overrideUpdateMs\n */\n step(overrideUpdateMs) {\n const time = overrideUpdateMs !== null && overrideUpdateMs !== void 0 ? overrideUpdateMs : this._updateMs;\n if (this._running) {\n // to be comparable to RAF this needs to be a full blown Task\n // For example, images cannot decode synchronously in a single step\n this.update(time);\n this._currentTime += time;\n }\n else {\n this._logger.warn('The clock is not running, no step will be performed');\n }\n }\n /**\n * Run a number of steps that tick the clock, optionally specify an elapsed time in milliseconds\n * @param numberOfSteps\n * @param overrideUpdateMs\n */\n run(numberOfSteps, overrideUpdateMs) {\n for (let i = 0; i < numberOfSteps; i++) {\n this.step(overrideUpdateMs !== null && overrideUpdateMs !== void 0 ? overrideUpdateMs : this._updateMs);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Coroutine.ts\":\n/*!***************************!*\\\n !*** ./Util/Coroutine.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ coroutine: () => (/* binding */ coroutine)\n/* harmony export */ });\n/* harmony import */ var _Context__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Context */ \"./Context.ts\");\n/* harmony import */ var _Engine__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Engine */ \"./Engine.ts\");\n/* harmony import */ var _Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Log */ \"./Util/Log.ts\");\n\n\n\nconst InsideCoroutineContext = (0,_Context__WEBPACK_IMPORTED_MODULE_0__.createContext)();\nconst generatorFunctionDeclaration = /^\\s*(?:function)?\\*/;\n/**\n *\n */\nfunction isCoroutineGenerator(x) {\n if (typeof x !== 'function') {\n return false;\n }\n if (generatorFunctionDeclaration.test(Function.prototype.toString.call(x))) {\n return true;\n }\n if (!Object.getPrototypeOf) {\n return false;\n }\n return Object.getPrototypeOf(x) === Object.getPrototypeOf(new Function('return function * () {}')());\n}\n/**\n *\n */\nfunction coroutine(...args) {\n var _a;\n const logger = _Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance();\n let coroutineGenerator;\n let thisArg;\n let options;\n let passedEngine;\n // coroutine(coroutineGenerator: CoroutineGenerator, options?: CoroutineOptions): CoroutineInstance;\n if (isCoroutineGenerator(args[0])) {\n thisArg = globalThis;\n coroutineGenerator = args[0];\n options = args[1];\n }\n // coroutine(thisArg: any, coroutineGenerator: CoroutineGenerator, options?: CoroutineOptions): CoroutineInstance;\n if (isCoroutineGenerator(args[1])) {\n thisArg = args[0];\n coroutineGenerator = args[1];\n options = args[2];\n }\n // coroutine(thisArg: any, engine: Engine, coroutineGenerator: CoroutineGenerator, options?: CoroutineOptions): CoroutineInstance;\n if (args[1] instanceof _Engine__WEBPACK_IMPORTED_MODULE_2__.Engine) {\n thisArg = args[0];\n passedEngine = args[1];\n coroutineGenerator = args[2];\n options = args[3];\n }\n // coroutine(engine: Engine, coroutineGenerator: CoroutineGenerator, options?: CoroutineOptions): CoroutineInstance;\n if (args[0] instanceof _Engine__WEBPACK_IMPORTED_MODULE_2__.Engine) {\n thisArg = globalThis;\n passedEngine = args[0];\n coroutineGenerator = args[1];\n options = args[2];\n }\n const inside = (0,_Context__WEBPACK_IMPORTED_MODULE_0__.useContext)(InsideCoroutineContext);\n const schedule = options === null || options === void 0 ? void 0 : options.timing;\n const autostart = inside ? false : (_a = options === null || options === void 0 ? void 0 : options.autostart) !== null && _a !== void 0 ? _a : true;\n let engine;\n try {\n engine = passedEngine !== null && passedEngine !== void 0 ? passedEngine : _Engine__WEBPACK_IMPORTED_MODULE_2__.Engine.useEngine();\n }\n catch (_) {\n throw Error('Cannot run coroutine without engine parameter outside of an excalibur lifecycle method.\\n' +\n 'Pass an engine parameter to ex.coroutine(engine, function * {...})');\n }\n let started = false;\n let completed = false;\n let cancelled = false;\n const generatorFcn = coroutineGenerator.bind(thisArg);\n const generator = generatorFcn();\n let loop;\n const complete = new Promise((resolve, reject) => {\n loop = (elapsed) => {\n try {\n if (cancelled) {\n completed = true;\n resolve();\n return;\n }\n const { done, value } = InsideCoroutineContext.scope(true, () => generator.next(elapsed));\n if (done || cancelled) {\n completed = true;\n resolve();\n return;\n }\n if (value instanceof Promise) {\n value.then(() => {\n // schedule next loop\n engine.clock.schedule(loop, 0, schedule);\n });\n }\n else if (value === undefined || value === void 0) {\n // schedule next frame\n engine.clock.schedule(loop, 0, schedule);\n }\n else {\n // schedule value milliseconds from now\n engine.clock.schedule(loop, value || 0, schedule);\n }\n }\n catch (e) {\n reject(e);\n return;\n }\n };\n if (autostart) {\n started = true;\n loop(engine.clock.elapsed()); // run first frame immediately\n }\n });\n const co = {\n isRunning: () => {\n return started && !cancelled && !completed;\n },\n isComplete: () => {\n return completed;\n },\n cancel: () => {\n cancelled = true;\n },\n start: () => {\n if (!started) {\n started = true;\n loop(engine.clock.elapsed());\n }\n else {\n logger.warn('.start() was called on a coroutine that was already started, this is probably a bug:\\n', Function.prototype.toString.call(generatorFcn));\n }\n return co;\n },\n generator,\n done: complete,\n then: complete.then.bind(complete),\n [Symbol.iterator]: () => {\n // TODO warn if a coroutine is already running\n // TODO warn if a coroutine is cancelled\n return generator;\n }\n };\n return co;\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Decorators.ts\":\n/*!****************************!*\\\n !*** ./Util/Decorators.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ maxMessages: () => (/* binding */ maxMessages),\n/* harmony export */ obsolete: () => (/* binding */ obsolete),\n/* harmony export */ resetObsoleteCounter: () => (/* binding */ resetObsoleteCounter)\n/* harmony export */ });\n/* harmony import */ var _Flags__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Flags */ \"./Flags.ts\");\n/* harmony import */ var _Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Log */ \"./Util/Log.ts\");\n\n\nconst maxMessages = 5;\nconst obsoleteMessage = {};\nconst resetObsoleteCounter = () => {\n for (const message in obsoleteMessage) {\n obsoleteMessage[message] = 0;\n }\n};\nconst logMessage = (message, options) => {\n const suppressObsoleteMessages = _Flags__WEBPACK_IMPORTED_MODULE_0__.Flags.isEnabled('suppress-obsolete-message');\n if (obsoleteMessage[message] < maxMessages && !suppressObsoleteMessages) {\n _Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance().warn(message);\n // tslint:disable-next-line: no-console\n if (console.trace && options.showStackTrace) {\n // tslint:disable-next-line: no-console\n console.trace();\n }\n }\n obsoleteMessage[message]++;\n};\n/**\n * Obsolete decorator for marking Excalibur methods obsolete, you can optionally specify a custom message and/or alternate replacement\n * method do the deprecated one. Inspired by https://github.com/jayphelps/core-decorators.js\n */\nfunction obsolete(options) {\n options = {\n message: 'This feature will be removed in future versions of Excalibur.',\n alternateMethod: null,\n showStackTrace: false,\n ...options\n };\n return function (target, property, descriptor) {\n if (descriptor &&\n !(typeof descriptor.value === 'function' || typeof descriptor.get === 'function' || typeof descriptor.set === 'function')) {\n throw new SyntaxError('Only classes/functions/getters/setters can be marked as obsolete');\n }\n const methodSignature = `${target.name || ''}${target.name && property ? '.' : ''}${property ? property : ''}`;\n const message = `${methodSignature} is marked obsolete: ${options.message}` +\n (options.alternateMethod ? ` Use ${options.alternateMethod} instead` : '');\n if (!obsoleteMessage[message]) {\n obsoleteMessage[message] = 0;\n }\n // If descriptor is null it is a class\n const method = descriptor ? { ...descriptor } : target;\n if (!descriptor) {\n // with es2015 classes we need to change our decoration tactic\n class DecoratedClass extends method {\n constructor(...args) {\n logMessage(message, options);\n super(...args);\n }\n }\n return DecoratedClass;\n }\n if (descriptor && descriptor.value) {\n method.value = function () {\n logMessage(message, options);\n return descriptor.value.apply(this, arguments);\n };\n return method;\n }\n if (descriptor && descriptor.get) {\n method.get = function () {\n logMessage(message, options);\n return descriptor.get.apply(this, arguments);\n };\n }\n if (descriptor && descriptor.set) {\n method.set = function () {\n logMessage(message, options);\n return descriptor.set.apply(this, arguments);\n };\n }\n return method;\n };\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Detector.ts\":\n/*!**************************!*\\\n !*** ./Util/Detector.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Detector: () => (/* binding */ Detector)\n/* harmony export */ });\n/* harmony import */ var _Log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Log */ \"./Util/Log.ts\");\n\n/**\n * This is the list of features that will be used to log the supported\n * features to the console when Detector.logBrowserFeatures() is called.\n */\nconst REPORTED_FEATURES = {\n webgl: 'WebGL',\n webaudio: 'WebAudio',\n gamepadapi: 'Gamepad API'\n};\n/**\n * Excalibur internal feature detection helper class\n */\nclass Detector {\n constructor() {\n this._features = null;\n this.failedTests = [];\n // critical browser features required for ex to run\n this._criticalTests = {\n // Test canvas/2d context support\n canvasSupport: function () {\n const elem = document.createElement('canvas');\n return !!(elem.getContext && elem.getContext('2d'));\n },\n // Test array buffer support ex uses for downloading binary data\n arrayBufferSupport: function () {\n const xhr = new XMLHttpRequest();\n xhr.open('GET', '/');\n try {\n xhr.responseType = 'arraybuffer';\n }\n catch (e) {\n return false;\n }\n return xhr.responseType === 'arraybuffer';\n },\n // Test data urls ex uses for sprites\n dataUrlSupport: function () {\n const canvas = document.createElement('canvas');\n return canvas.toDataURL('image/png').indexOf('data:image/png') === 0;\n },\n // Test object url support for loading\n objectUrlSupport: function () {\n return 'URL' in window && 'revokeObjectURL' in URL && 'createObjectURL' in URL;\n },\n // RGBA support for colors\n rgbaSupport: function () {\n const style = document.createElement('a').style;\n style.cssText = 'background-color:rgba(150,255,150,.5)';\n return ('' + style.backgroundColor).indexOf('rgba') > -1;\n }\n };\n // warnings excalibur performance will be degraded\n this._warningTest = {\n webAudioSupport: function () {\n return !!(window.AudioContext ||\n window.webkitAudioContext ||\n window.mozAudioContext ||\n window.msAudioContext ||\n window.oAudioContext);\n },\n webglSupport: function () {\n const elem = document.createElement('canvas');\n return !!(elem.getContext && elem.getContext('webgl'));\n }\n };\n this._features = this._loadBrowserFeatures();\n }\n /**\n * Returns a map of currently supported browser features. This method\n * treats the features as a singleton and will only calculate feature\n * support if it has not previously been done.\n */\n getBrowserFeatures() {\n if (this._features === null) {\n this._features = this._loadBrowserFeatures();\n }\n return this._features;\n }\n /**\n * Report on non-critical browser support for debugging purposes.\n * Use native browser console colors for visibility.\n */\n logBrowserFeatures() {\n let msg = '%cSUPPORTED BROWSER FEATURES\\n==========================%c\\n';\n const args = ['font-weight: bold; color: navy', 'font-weight: normal; color: inherit'];\n const supported = this.getBrowserFeatures();\n for (const feature of Object.keys(REPORTED_FEATURES)) {\n if (supported[feature]) {\n msg += '(%c\\u2713%c)'; // (✓)\n args.push('font-weight: bold; color: green');\n args.push('font-weight: normal; color: inherit');\n }\n else {\n msg += '(%c\\u2717%c)'; // (✗)\n args.push('font-weight: bold; color: red');\n args.push('font-weight: normal; color: inherit');\n }\n msg += ' ' + REPORTED_FEATURES[feature] + '\\n';\n }\n args.unshift(msg);\n // eslint-disable-next-line no-console\n console.log.apply(console, args);\n }\n /**\n * Executes several IIFE's to get a constant reference to supported\n * features within the current execution context.\n */\n _loadBrowserFeatures() {\n return {\n // IIFE to check canvas support\n canvas: (() => {\n return this._criticalTests.canvasSupport();\n })(),\n // IIFE to check arraybuffer support\n arraybuffer: (() => {\n return this._criticalTests.arrayBufferSupport();\n })(),\n // IIFE to check dataurl support\n dataurl: (() => {\n return this._criticalTests.dataUrlSupport();\n })(),\n // IIFE to check objecturl support\n objecturl: (() => {\n return this._criticalTests.objectUrlSupport();\n })(),\n // IIFE to check rgba support\n rgba: (() => {\n return this._criticalTests.rgbaSupport();\n })(),\n // IIFE to check webaudio support\n webaudio: (() => {\n return this._warningTest.webAudioSupport();\n })(),\n // IIFE to check webgl support\n webgl: (() => {\n return this._warningTest.webglSupport();\n })(),\n // IIFE to check gamepadapi support\n gamepadapi: (() => {\n return !!navigator.getGamepads;\n })()\n };\n }\n test() {\n // Critical test will for ex not to run\n let failedCritical = false;\n for (const test in this._criticalTests) {\n if (!this._criticalTests[test].call(this)) {\n this.failedTests.push(test);\n _Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance().error('Critical browser feature missing, Excalibur requires:', test);\n failedCritical = true;\n }\n }\n if (failedCritical) {\n return false;\n }\n // Warning tests do not for ex to return false to compatibility\n for (const warning in this._warningTest) {\n if (!this._warningTest[warning]()) {\n _Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance().warn('Warning browser feature missing, Excalibur will have reduced performance:', warning);\n }\n }\n return true;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/DrawUtil.ts\":\n/*!**************************!*\\\n !*** ./Util/DrawUtil.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ circle: () => (/* binding */ circle),\n/* harmony export */ line: () => (/* binding */ line),\n/* harmony export */ point: () => (/* binding */ point),\n/* harmony export */ roundRect: () => (/* binding */ roundRect),\n/* harmony export */ vector: () => (/* binding */ vector)\n/* harmony export */ });\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n\n/* istanbul ignore next */\n/**\n * Draw a line on canvas context\n * @param ctx The canvas context\n * @param color The color of the line\n * @param x1 The start x coordinate\n * @param y1 The start y coordinate\n * @param x2 The ending x coordinate\n * @param y2 The ending y coordinate\n * @param thickness The line thickness\n * @param cap The {@apilink LineCapStyle} (butt, round, or square)\n */\nfunction line(ctx, color = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Red, x1, y1, x2, y2, thickness = 1, cap = 'butt') {\n ctx.save();\n ctx.beginPath();\n ctx.lineWidth = thickness;\n ctx.lineCap = cap;\n ctx.strokeStyle = color.toString();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.closePath();\n ctx.stroke();\n ctx.restore();\n}\n/* istanbul ignore next */\n/**\n * Draw the vector as a point onto the canvas.\n */\nfunction point(ctx, color = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Red, point) {\n ctx.beginPath();\n ctx.strokeStyle = color.toString();\n ctx.arc(point.x, point.y, 5, 0, Math.PI * 2);\n ctx.closePath();\n ctx.stroke();\n}\n/**\n * Draw the vector as a line onto the canvas starting a origin point.\n */\n/* istanbul ignore next */\n/**\n *\n */\nfunction vector(ctx, color, origin, vector, scale = 1.0) {\n const c = color ? color.toString() : 'blue';\n const v = vector.scale(scale);\n ctx.beginPath();\n ctx.strokeStyle = c;\n ctx.moveTo(origin.x, origin.y);\n ctx.lineTo(origin.x + v.x, origin.y + v.y);\n ctx.closePath();\n ctx.stroke();\n}\n/**\n * Draw a round rectangle on a canvas context\n * @param ctx The canvas context\n * @param x The top-left x coordinate\n * @param y The top-left y coordinate\n * @param width The width of the rectangle\n * @param height The height of the rectangle\n * @param radius The border radius of the rectangle\n * @param stroke The {@apilink Color} to stroke rectangle with\n * @param fill The {@apilink Color} to fill rectangle with\n */\nfunction roundRect(ctx, x, y, width, height, radius = 5, stroke = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.White, fill = null) {\n let br;\n if (typeof radius === 'number') {\n br = { tl: radius, tr: radius, br: radius, bl: radius };\n }\n else {\n const defaultRadius = { tl: 0, tr: 0, br: 0, bl: 0 };\n for (const prop in defaultRadius) {\n if (defaultRadius.hasOwnProperty(prop)) {\n const side = prop;\n br[side] = radius[side] || defaultRadius[side];\n }\n }\n }\n ctx.beginPath();\n ctx.moveTo(x + br.tl, y);\n ctx.lineTo(x + width - br.tr, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + br.tr);\n ctx.lineTo(x + width, y + height - br.br);\n ctx.quadraticCurveTo(x + width, y + height, x + width - br.br, y + height);\n ctx.lineTo(x + br.bl, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - br.bl);\n ctx.lineTo(x, y + br.tl);\n ctx.quadraticCurveTo(x, y, x + br.tl, y);\n ctx.closePath();\n if (fill) {\n ctx.fillStyle = fill.toString();\n ctx.fill();\n }\n if (stroke) {\n ctx.strokeStyle = stroke.toString();\n ctx.stroke();\n }\n}\n/**\n *\n */\nfunction circle(ctx, x, y, radius, stroke = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.White, fill = null) {\n ctx.beginPath();\n ctx.arc(x, y, radius, 0, Math.PI * 2);\n ctx.closePath();\n if (fill) {\n ctx.fillStyle = fill.toString();\n ctx.fill();\n }\n if (stroke) {\n ctx.strokeStyle = stroke.toString();\n ctx.stroke();\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/EasingFunctions.ts\":\n/*!*********************************!*\\\n !*** ./Util/EasingFunctions.ts ***!\n \\*********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EasingFunctions: () => (/* binding */ EasingFunctions)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n\n/**\n * Standard easing functions for motion in Excalibur, defined on a domain of [0, duration] and a range from [+startValue,+endValue]\n * Given a time, the function will return a value from positive startValue to positive endValue.\n *\n * ```js\n * function Linear (t) {\n * return t * t;\n * }\n *\n * // accelerating from zero velocity\n * function EaseInQuad (t) {\n * return t * t;\n * }\n *\n * // decelerating to zero velocity\n * function EaseOutQuad (t) {\n * return t * (2 - t);\n * }\n *\n * // acceleration until halfway, then deceleration\n * function EaseInOutQuad (t) {\n * return t < .5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n * }\n *\n * // accelerating from zero velocity\n * function EaseInCubic (t) {\n * return t * t * t;\n * }\n *\n * // decelerating to zero velocity\n * function EaseOutCubic (t) {\n * return (--t) * t * t + 1;\n * }\n *\n * // acceleration until halfway, then deceleration\n * function EaseInOutCubic (t) {\n * return t < .5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1;\n * }\n * ```\n */\nclass EasingFunctions {\n static CreateReversibleEasingFunction(easing) {\n return (time, start, end, duration) => {\n if (end < start) {\n return start - (easing(time, end, start, duration) - end);\n }\n else {\n return easing(time, start, end, duration);\n }\n };\n }\n static CreateVectorEasingFunction(easing) {\n return (time, start, end, duration) => {\n return new _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector(easing(time, start.x, end.x, duration), easing(time, start.y, end.y, duration));\n };\n }\n}\nEasingFunctions.Linear = EasingFunctions.CreateReversibleEasingFunction((currentTime, startValue, endValue, duration) => {\n endValue = endValue - startValue;\n return (endValue * currentTime) / duration + startValue;\n});\nEasingFunctions.EaseInQuad = EasingFunctions.CreateReversibleEasingFunction((currentTime, startValue, endValue, duration) => {\n endValue = endValue - startValue;\n currentTime /= duration;\n return endValue * currentTime * currentTime + startValue;\n});\nEasingFunctions.EaseOutQuad = EasingFunctions.CreateReversibleEasingFunction((currentTime, startValue, endValue, duration) => {\n endValue = endValue - startValue;\n currentTime /= duration;\n return -endValue * currentTime * (currentTime - 2) + startValue;\n});\nEasingFunctions.EaseInOutQuad = EasingFunctions.CreateReversibleEasingFunction((currentTime, startValue, endValue, duration) => {\n endValue = endValue - startValue;\n currentTime /= duration / 2;\n if (currentTime < 1) {\n return (endValue / 2) * currentTime * currentTime + startValue;\n }\n currentTime--;\n return (-endValue / 2) * (currentTime * (currentTime - 2) - 1) + startValue;\n});\nEasingFunctions.EaseInCubic = EasingFunctions.CreateReversibleEasingFunction((currentTime, startValue, endValue, duration) => {\n endValue = endValue - startValue;\n currentTime /= duration;\n return endValue * currentTime * currentTime * currentTime + startValue;\n});\nEasingFunctions.EaseOutCubic = EasingFunctions.CreateReversibleEasingFunction((currentTime, startValue, endValue, duration) => {\n endValue = endValue - startValue;\n currentTime /= duration;\n currentTime--;\n return endValue * (currentTime * currentTime * currentTime + 1) + startValue;\n});\nEasingFunctions.EaseInOutCubic = EasingFunctions.CreateReversibleEasingFunction((currentTime, startValue, endValue, duration) => {\n endValue = endValue - startValue;\n currentTime /= duration / 2;\n if (currentTime < 1) {\n return (endValue / 2) * currentTime * currentTime * currentTime + startValue;\n }\n currentTime -= 2;\n return (endValue / 2) * (currentTime * currentTime * currentTime + 2) + startValue;\n});\n\n\n/***/ }),\n\n/***/ \"./Util/Fps.ts\":\n/*!*********************!*\\\n !*** ./Util/Fps.ts ***!\n \\*********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FpsSampler: () => (/* binding */ FpsSampler)\n/* harmony export */ });\nclass FpsSampler {\n constructor(options) {\n var _a;\n this._samplePeriod = 100;\n this._currentFrameTime = 0;\n this._frames = 0;\n this._previousSampleTime = 0;\n this._beginFrameTime = 0;\n this._fps = options.initialFps;\n this._samplePeriod = (_a = options.samplePeriod) !== null && _a !== void 0 ? _a : this._samplePeriod;\n this._currentFrameTime = 1000 / options.initialFps;\n this._nowFn = options.nowFn;\n this._previousSampleTime = this._nowFn();\n }\n /**\n * Start of code block to sample FPS for\n */\n start() {\n this._beginFrameTime = this._nowFn();\n }\n /**\n * End of code block to sample FPS for\n */\n end() {\n this._frames++;\n const time = this._nowFn();\n this._currentFrameTime = time - this._beginFrameTime;\n if (time >= this._previousSampleTime + this._samplePeriod) {\n this._fps = (this._frames * 1000) / (time - this._previousSampleTime);\n this._previousSampleTime = time;\n this._frames = 0;\n }\n }\n /**\n * Return the currently sampled fps over the last sample period, by default every 100ms\n */\n get fps() {\n return this._fps;\n }\n /**\n * Return the instantaneous fps, this can be less useful because it will fluctuate given the current frames time\n */\n get instant() {\n return 1000 / this._currentFrameTime;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Future.ts\":\n/*!************************!*\\\n !*** ./Util/Future.ts ***!\n \\************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Future: () => (/* binding */ Future)\n/* harmony export */ });\n/**\n * Future is a wrapper around a native browser Promise to allow resolving/rejecting at any time\n */\nclass Future {\n constructor() {\n this._isCompleted = false;\n this.promise = new Promise((resolve, reject) => {\n this._resolver = resolve;\n this._rejecter = reject;\n });\n }\n get isCompleted() {\n return this._isCompleted;\n }\n resolve(value) {\n if (this._isCompleted) {\n return;\n }\n this._isCompleted = true;\n this._resolver(value);\n }\n reject(error) {\n if (this._isCompleted) {\n return;\n }\n this._isCompleted = true;\n this._rejecter(error);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/IFrame.ts\":\n/*!************************!*\\\n !*** ./Util/IFrame.ts ***!\n \\************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ isCrossOriginIframe: () => (/* binding */ isCrossOriginIframe)\n/* harmony export */ });\n/**\n * Checks if excalibur is in a x-origin iframe\n */\nfunction isCrossOriginIframe() {\n try {\n // Try and listen to events on top window frame if within an iframe.\n //\n // See https://github.com/excaliburjs/Excalibur/issues/1294\n //\n // Attempt to add an event listener, which triggers a DOMException on\n // cross-origin iframes\n const noop = () => {\n return;\n };\n window.top.addEventListener('blur', noop);\n window.top.removeEventListener('blur', noop);\n }\n catch (_a) {\n return true;\n }\n return false;\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Index.ts\":\n/*!***********************!*\\\n !*** ./Util/Index.ts ***!\n \\***********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ConsoleAppender: () => (/* reexport safe */ _Log__WEBPACK_IMPORTED_MODULE_1__.ConsoleAppender),\n/* harmony export */ DrawUtil: () => (/* reexport module object */ _DrawUtil__WEBPACK_IMPORTED_MODULE_4__),\n/* harmony export */ EasingFunctions: () => (/* reexport safe */ _EasingFunctions__WEBPACK_IMPORTED_MODULE_3__.EasingFunctions),\n/* harmony export */ LogLevel: () => (/* reexport safe */ _Log__WEBPACK_IMPORTED_MODULE_1__.LogLevel),\n/* harmony export */ Logger: () => (/* reexport safe */ _Log__WEBPACK_IMPORTED_MODULE_1__.Logger),\n/* harmony export */ Observable: () => (/* reexport safe */ _Observable__WEBPACK_IMPORTED_MODULE_2__.Observable),\n/* harmony export */ ScreenAppender: () => (/* reexport safe */ _Log__WEBPACK_IMPORTED_MODULE_1__.ScreenAppender),\n/* harmony export */ addItemToArray: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.addItemToArray),\n/* harmony export */ contains: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.contains),\n/* harmony export */ delay: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.delay),\n/* harmony export */ fail: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.fail),\n/* harmony export */ getPosition: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.getPosition),\n/* harmony export */ isObject: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.isObject),\n/* harmony export */ mergeDeep: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.mergeDeep),\n/* harmony export */ omit: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.omit),\n/* harmony export */ removeItemFromArray: () => (/* reexport safe */ _Util__WEBPACK_IMPORTED_MODULE_0__.removeItemFromArray)\n/* harmony export */ });\n/* harmony import */ var _Util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Util */ \"./Util/Util.ts\");\n/* harmony import */ var _Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Observable */ \"./Util/Observable.ts\");\n/* harmony import */ var _EasingFunctions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./EasingFunctions */ \"./Util/EasingFunctions.ts\");\n/* harmony import */ var _DrawUtil__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./DrawUtil */ \"./Util/DrawUtil.ts\");\n\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./Util/Log.ts\":\n/*!*********************!*\\\n !*** ./Util/Log.ts ***!\n \\*********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ConsoleAppender: () => (/* binding */ ConsoleAppender),\n/* harmony export */ LogLevel: () => (/* binding */ LogLevel),\n/* harmony export */ Logger: () => (/* binding */ Logger),\n/* harmony export */ ScreenAppender: () => (/* binding */ ScreenAppender)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Color */ \"./Color.ts\");\n/* eslint-disable no-console */\n\n\n/**\n * Logging level that Excalibur will tag\n */\nvar LogLevel;\n(function (LogLevel) {\n LogLevel[LogLevel[\"Debug\"] = 0] = \"Debug\";\n LogLevel[LogLevel[\"Info\"] = 1] = \"Info\";\n LogLevel[LogLevel[\"Warn\"] = 2] = \"Warn\";\n LogLevel[LogLevel[\"Error\"] = 3] = \"Error\";\n LogLevel[LogLevel[\"Fatal\"] = 4] = \"Fatal\";\n})(LogLevel || (LogLevel = {}));\n/**\n * Static singleton that represents the logging facility for Excalibur.\n * Excalibur comes built-in with a {@apilink ConsoleAppender} and {@apilink ScreenAppender}.\n * Derive from {@apilink Appender} to create your own logging appenders.\n */\nclass Logger {\n constructor() {\n this._appenders = [];\n /**\n * Gets or sets the default logging level. Excalibur will only log\n * messages if equal to or above this level. Default: {@apilink LogLevel.Info}\n */\n this.defaultLevel = LogLevel.Info;\n this._logOnceSet = new Set();\n if (Logger._INSTANCE) {\n throw new Error('Logger is a singleton');\n }\n Logger._INSTANCE = this;\n // Default console appender\n Logger._INSTANCE.addAppender(new ConsoleAppender());\n return Logger._INSTANCE;\n }\n /**\n * Gets the current static instance of Logger\n */\n static getInstance() {\n if (Logger._INSTANCE == null) {\n Logger._INSTANCE = new Logger();\n }\n return Logger._INSTANCE;\n }\n /**\n * Adds a new {@apilink Appender} to the list of appenders to write to\n */\n addAppender(appender) {\n this._appenders.push(appender);\n }\n /**\n * Clears all appenders from the logger\n */\n clearAppenders() {\n this._appenders.length = 0;\n }\n /**\n * Logs a message at a given LogLevel\n * @param level The LogLevel`to log the message at\n * @param args An array of arguments to write to an appender\n */\n _log(level, args) {\n if (level == null) {\n level = this.defaultLevel;\n }\n const len = this._appenders.length;\n for (let i = 0; i < len; i++) {\n if (level >= this.defaultLevel) {\n this._appenders[i].log(level, args);\n }\n }\n }\n _logOnce(level, args) {\n const serialized = level + args.join('+');\n if (this._logOnceSet.has(serialized)) {\n return;\n }\n else {\n this._logOnceSet.add(serialized);\n this._log(level, args);\n }\n }\n /**\n * Writes a log message at the {@apilink LogLevel.Debug} level\n * @param args Accepts any number of arguments\n */\n debug(...args) {\n this._log(LogLevel.Debug, args);\n }\n /**\n * Writes a log message once at the {@apilink LogLevel.Fatal} level, if it sees the same args again it wont log\n * @param args Accepts any number of arguments\n */\n debugOnce(...args) {\n this._logOnce(LogLevel.Debug, args);\n }\n /**\n * Writes a log message at the {@apilink LogLevel.Info} level\n * @param args Accepts any number of arguments\n */\n info(...args) {\n this._log(LogLevel.Info, args);\n }\n /**\n * Writes a log message once at the {@apilink LogLevel.Info} level, if it sees the same args again it wont log\n * @param args Accepts any number of arguments\n */\n infoOnce(...args) {\n this._logOnce(LogLevel.Info, args);\n }\n /**\n * Writes a log message at the {@apilink LogLevel.Warn} level\n * @param args Accepts any number of arguments\n */\n warn(...args) {\n this._log(LogLevel.Warn, args);\n }\n /**\n * Writes a log message once at the {@apilink LogLevel.Warn} level, if it sees the same args again it won't log\n * @param args Accepts any number of arguments\n */\n warnOnce(...args) {\n this._logOnce(LogLevel.Warn, args);\n }\n /**\n * Writes a log message at the {@apilink LogLevel.Error} level\n * @param args Accepts any number of arguments\n */\n error(...args) {\n this._log(LogLevel.Error, args);\n }\n /**\n * Writes a log message once at the {@apilink LogLevel.Error} level, if it sees the same args again it won't log\n * @param args Accepts any number of arguments\n */\n errorOnce(...args) {\n this._logOnce(LogLevel.Error, args);\n }\n /**\n * Writes a log message at the {@apilink LogLevel.Fatal} level\n * @param args Accepts any number of arguments\n */\n fatal(...args) {\n this._log(LogLevel.Fatal, args);\n }\n /**\n * Writes a log message once at the {@apilink LogLevel.Fatal} level, if it sees the same args again it won't log\n * @param args Accepts any number of arguments\n */\n fatalOnce(...args) {\n this._logOnce(LogLevel.Fatal, args);\n }\n}\nLogger._INSTANCE = null;\n/**\n * Console appender for browsers (i.e. `console.log`)\n */\nclass ConsoleAppender {\n /**\n * Logs a message at the given {@apilink LogLevel}\n * @param level Level to log at\n * @param args Arguments to log\n */\n log(level, args) {\n // Check for console support\n if (!console && !console.log && console.warn && console.error) {\n // todo maybe do something better than nothing\n return;\n }\n // Create a new console args array\n const consoleArgs = [];\n consoleArgs.unshift.apply(consoleArgs, args);\n consoleArgs.unshift('[' + LogLevel[level] + '] : ');\n if (level < LogLevel.Warn) {\n // Call .log for Debug/Info\n if (console.log.apply) {\n // this is required on some older browsers that don't support apply on console.log :(\n console.log.apply(console, consoleArgs);\n }\n else {\n console.log(consoleArgs.join(' '));\n }\n }\n else if (level < LogLevel.Error) {\n // Call .warn for Warn\n if (console.warn.apply) {\n console.warn.apply(console, consoleArgs);\n }\n else {\n console.warn(consoleArgs.join(' '));\n }\n }\n else {\n // Call .error for Error/Fatal\n if (console.error.apply) {\n console.error.apply(console, consoleArgs);\n }\n else {\n console.error(consoleArgs.join(' '));\n }\n }\n }\n}\n/**\n * On-screen (canvas) appender\n */\nclass ScreenAppender {\n constructor(options) {\n var _a, _b;\n this._messages = [];\n this._pos = 10;\n this._color = _Color__WEBPACK_IMPORTED_MODULE_0__.Color.Black;\n this._options = options;\n this.canvas = document.createElement('canvas');\n this._ctx = this.canvas.getContext('2d');\n this.canvas.style.position = 'absolute';\n this.canvas.style.zIndex = (_b = (_a = options.zIndex) === null || _a === void 0 ? void 0 : _a.toString()) !== null && _b !== void 0 ? _b : '99';\n document.body.appendChild(this.canvas);\n this._positionScreenAppenderCanvas();\n options.engine.screen.events.on('resize', () => {\n this._positionScreenAppenderCanvas();\n });\n }\n _positionScreenAppenderCanvas() {\n var _a, _b, _c, _d;\n const options = this._options;\n this.canvas.width = (_a = options.width) !== null && _a !== void 0 ? _a : options.engine.screen.resolution.width;\n this.canvas.height = (_b = options.height) !== null && _b !== void 0 ? _b : options.engine.screen.resolution.height;\n this.canvas.style.position = 'absolute';\n const pagePos = options.engine.screen.screenToPageCoordinates((0,_Math_vector__WEBPACK_IMPORTED_MODULE_1__.vec)(0, 0));\n this.canvas.style.left = pagePos.x + 'px';\n this.canvas.style.top = pagePos.y + 'px';\n this._pos = (_c = options.xPos) !== null && _c !== void 0 ? _c : this._pos;\n this._color = (_d = options.color) !== null && _d !== void 0 ? _d : this._color;\n }\n /**\n * Logs a message at the given {@apilink LogLevel}\n * @param level Level to log at\n * @param args Arguments to log\n */\n log(level, args) {\n const message = args.join(',');\n this._ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n this._messages.unshift('[' + LogLevel[level] + '] : ' + message);\n let pos = 10;\n this._messages = this._messages.slice(0, 1000);\n for (let i = 0; i < this._messages.length; i++) {\n this._ctx.fillStyle = this._color.toRGBA();\n this._ctx.fillText(this._messages[i], this._pos, pos);\n pos += 10;\n }\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Observable.ts\":\n/*!****************************!*\\\n !*** ./Util/Observable.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Observable: () => (/* binding */ Observable)\n/* harmony export */ });\n/**\n * Simple Observable implementation\n * @template T is the typescript Type that defines the data being observed\n */\nclass Observable {\n constructor() {\n this.observers = [];\n this.subscriptions = [];\n }\n /**\n * Register an observer to listen to this observable\n * @param observer\n */\n register(observer) {\n this.observers.push(observer);\n }\n /**\n * Register a callback to listen to this observable\n * @param func\n */\n subscribe(func) {\n this.subscriptions.push(func);\n }\n /**\n * Remove an observer from the observable\n * @param observer\n */\n unregister(observer) {\n const i = this.observers.indexOf(observer);\n if (i !== -1) {\n this.observers.splice(i, 1);\n }\n }\n /**\n * Remove a callback that is listening to this observable\n * @param func\n */\n unsubscribe(func) {\n const i = this.subscriptions.indexOf(func);\n if (i !== -1) {\n this.subscriptions.splice(i, 1);\n }\n }\n /**\n * Broadcasts a message to all observers and callbacks\n * @param message\n */\n notifyAll(message) {\n const observersLength = this.observers.length;\n for (let i = 0; i < observersLength; i++) {\n this.observers[i].notify(message);\n }\n const subscriptionsLength = this.subscriptions.length;\n for (let i = 0; i < subscriptionsLength; i++) {\n this.subscriptions[i](message);\n }\n }\n /**\n * Removes all observers and callbacks\n */\n clear() {\n this.observers.length = 0;\n this.subscriptions.length = 0;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Pool.ts\":\n/*!**********************!*\\\n !*** ./Util/Pool.ts ***!\n \\**********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Pool: () => (/* binding */ Pool)\n/* harmony export */ });\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Util/Log */ \"./Util/Log.ts\");\n\nclass Pool {\n constructor(builder, recycler, maxObjects = 100) {\n this.builder = builder;\n this.recycler = recycler;\n this.maxObjects = maxObjects;\n this.totalAllocations = 0;\n this.index = 0;\n this.objects = [];\n this.disableWarnings = false;\n this._logger = _Util_Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance();\n }\n dispose() {\n this.objects.length = 0;\n }\n preallocate() {\n for (let i = 0; i < this.maxObjects; i++) {\n this.objects[i] = this.builder();\n }\n }\n /**\n * Use many instances out of the in the context and return all to the pool.\n *\n * By returning values out of the context they will be un-hooked from the pool and are free to be passed to consumers\n * @param context\n */\n using(context) {\n const result = context(this);\n if (result) {\n return this.done(...result);\n }\n return this.done();\n }\n /**\n * Use a single instance out of th pool and immediately return it to the pool\n * @param context\n */\n borrow(context) {\n const object = this.get();\n context(object);\n this.index--;\n }\n /**\n * Retrieve a value from the pool, will allocate a new instance if necessary or recycle from the pool\n */\n get() {\n if (this.index === this.maxObjects) {\n if (!this.disableWarnings) {\n this._logger.warn('Max pooled objects reached, possible memory leak? Doubling');\n }\n this.maxObjects = this.maxObjects * 2;\n }\n if (this.objects[this.index]) {\n // Pool has an available object already constructed\n if (this.recycler) {\n return this.recycler(this.objects[this.index++]);\n }\n return this.objects[this.index++];\n }\n else {\n // New allocation\n this.totalAllocations++;\n const object = (this.objects[this.index++] = this.builder());\n return object;\n }\n }\n done(...objects) {\n // All objects in pool now considered \"free\"\n this.index = 0;\n for (const object of objects) {\n const poolIndex = this.objects.indexOf(object);\n // Build a new object to take the pool place\n this.objects[poolIndex] = this.builder();\n this.totalAllocations++;\n }\n return objects;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/RentalPool.ts\":\n/*!****************************!*\\\n !*** ./Util/RentalPool.ts ***!\n \\****************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RentalPool: () => (/* binding */ RentalPool)\n/* harmony export */ });\nclass RentalPool {\n constructor(builder, cleaner, preAllocate = 1) {\n this.builder = builder;\n this.cleaner = cleaner;\n this._pool = [];\n this._size = 0;\n this.grow(preAllocate);\n }\n /**\n * Grow the pool size by an amount\n * @param amount\n */\n grow(amount) {\n if (amount > 0) {\n this._size += amount;\n for (let i = 0; i < amount; i++) {\n this._pool.push(this.builder());\n }\n }\n }\n /**\n * Rent an object from the pool, optionally clean it. If not cleaned previous state may be set.\n *\n * The pool will automatically double if depleted\n * @param clean\n */\n rent(clean = false) {\n if (this._pool.length === 0) {\n this.grow(this._size);\n }\n return clean ? this.cleaner(this._pool.pop()) : this._pool.pop();\n }\n /**\n * Return an object to the pool\n * @param object\n */\n return(object) {\n this._pool.push(object);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Semaphore.ts\":\n/*!***************************!*\\\n !*** ./Util/Semaphore.ts ***!\n \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Semaphore: () => (/* binding */ Semaphore)\n/* harmony export */ });\n/* harmony import */ var _Future__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Future */ \"./Util/Future.ts\");\n\nclass AsyncWaitQueue {\n constructor() {\n // Code from StephenCleary https://gist.github.com/StephenCleary/ba50b2da419c03b9cba1d20cb4654d5e\n this._queue = [];\n }\n get length() {\n return this._queue.length;\n }\n enqueue() {\n const future = new _Future__WEBPACK_IMPORTED_MODULE_0__.Future();\n this._queue.push(future);\n return future.promise;\n }\n dequeue(value) {\n const future = this._queue.shift();\n future.resolve(value);\n }\n}\n/**\n * Semaphore allows you to limit the amount of async calls happening between `enter()` and `exit()`\n *\n * This can be useful when limiting the number of http calls, browser api calls, etc either for performance or to work\n * around browser limitations like max Image.decode() calls in chromium being 256.\n */\nclass Semaphore {\n constructor(_count) {\n this._count = _count;\n this._waitQueue = new AsyncWaitQueue();\n }\n get count() {\n return this._count;\n }\n get waiting() {\n return this._waitQueue.length;\n }\n // eslint-disable-next-line require-await\n async enter() {\n if (this._count !== 0) {\n this._count--;\n return Promise.resolve();\n }\n return this._waitQueue.enqueue();\n }\n exit(count = 1) {\n if (count === 0) {\n return;\n }\n while (count !== 0 && this._waitQueue.length !== 0) {\n this._waitQueue.dequeue(null);\n count--;\n }\n this._count += count;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Sound.ts\":\n/*!***********************!*\\\n !*** ./Util/Sound.ts ***!\n \\***********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ canPlayFile: () => (/* binding */ canPlayFile)\n/* harmony export */ });\n/* harmony import */ var _Log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Log */ \"./Util/Log.ts\");\n\n/**\n * Whether or not the browser can play this file as HTML5 Audio\n */\nfunction canPlayFile(file) {\n try {\n const a = new Audio();\n const filetype = /.*\\.([A-Za-z0-9]+)(?:(?:\\?|\\#).*)*$/;\n const type = file.match(filetype)[1];\n if (a.canPlayType('audio/' + type)) {\n return true;\n }\n else {\n return false;\n }\n }\n catch (e) {\n _Log__WEBPACK_IMPORTED_MODULE_0__.Logger.getInstance().warn('Cannot determine audio support, assuming no support for the Audio Tag', e);\n return false;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/StateMachine.ts\":\n/*!******************************!*\\\n !*** ./Util/StateMachine.ts ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ StateMachine: () => (/* binding */ StateMachine)\n/* harmony export */ });\nclass StateMachine {\n constructor() {\n this.states = new Map();\n }\n get currentState() {\n return this._currentState;\n }\n set currentState(state) {\n this._currentState = state;\n }\n static create(machineDescription, data) {\n const machine = new StateMachine();\n machine.data = data;\n for (const stateName in machineDescription.states) {\n machine.states.set(stateName, {\n name: stateName,\n ...machineDescription.states[stateName]\n });\n }\n // validate transitions are states\n for (const state of machine.states.values()) {\n for (const transitionState of state.transitions) {\n if (transitionState === '*') {\n continue;\n }\n if (!machine.states.has(transitionState)) {\n throw Error(`Invalid state machine, state [${state.name}] has a transition to another state that doesn't exist [${transitionState}]`);\n }\n }\n }\n machine.currentState = machine.startState = machine.states.get(machineDescription.start);\n return machine;\n }\n in(state) {\n return this.currentState.name === state;\n }\n go(stateName, eventData) {\n var _a, _b;\n if (this.currentState.transitions.includes(stateName) || this.currentState.transitions.includes('*')) {\n const potentialNewState = this.states.get(stateName);\n if (this.currentState.onExit) {\n const canExit = (_a = this.currentState) === null || _a === void 0 ? void 0 : _a.onExit({ to: potentialNewState.name, data: this.data });\n if (canExit === false) {\n return false;\n }\n }\n if (potentialNewState === null || potentialNewState === void 0 ? void 0 : potentialNewState.onEnter) {\n const canEnter = potentialNewState === null || potentialNewState === void 0 ? void 0 : potentialNewState.onEnter({ from: this.currentState.name, eventData, data: this.data });\n if (canEnter === false) {\n return false;\n }\n }\n this.currentState = potentialNewState;\n if ((_b = this.currentState) === null || _b === void 0 ? void 0 : _b.onState) {\n this.currentState.onState();\n }\n return true;\n }\n return false;\n }\n update(elapsed) {\n if (this.currentState.onUpdate) {\n this.currentState.onUpdate(this.data, elapsed);\n }\n }\n save(saveKey) {\n localStorage.setItem(saveKey, JSON.stringify({\n currentState: this.currentState.name,\n data: this.data\n }));\n }\n restore(saveKey) {\n const state = JSON.parse(localStorage.getItem(saveKey));\n this.currentState = this.states.get(state.currentState);\n this.data = state.data;\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Toaster.ts\":\n/*!*************************!*\\\n !*** ./Util/Toaster.ts ***!\n \\*************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Toaster: () => (/* binding */ Toaster)\n/* harmony export */ });\n/* harmony import */ var _Toaster_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Toaster.css */ \"./Util/Toaster.css\");\n\n/**\n * The Toaster is only meant to be called from inside Excalibur to display messages to players\n */\nclass Toaster {\n constructor() {\n this._toasterCss = _Toaster_css__WEBPACK_IMPORTED_MODULE_0__[\"default\"].toString();\n this._isInitialized = false;\n }\n _initialize() {\n if (!this._isInitialized) {\n this._container = document.createElement('div');\n this._container.id = 'ex-toast-container';\n document.body.appendChild(this._container);\n this._isInitialized = true;\n this._styleBlock = document.createElement('style');\n this._styleBlock.textContent = this._toasterCss;\n document.head.appendChild(this._styleBlock);\n }\n }\n dispose() {\n this._container.parentElement.removeChild(this._container);\n this._styleBlock.parentElement.removeChild(this._styleBlock);\n this._isInitialized = false;\n }\n _createFragment(message) {\n const toastMessage = document.createElement('span');\n toastMessage.innerText = message;\n return toastMessage;\n }\n /**\n * Display a toast message to a player\n * @param message Text of the message, messages may have a single \"[LINK]\" to influence placement\n * @param linkTarget Optionally specify a link location\n * @param linkName Optionally specify a name for that link location\n */\n toast(message, linkTarget, linkName) {\n this._initialize();\n const toast = document.createElement('div');\n toast.className = 'ex-toast-message';\n const messageFragments = message.split('[LINK]').map((message) => this._createFragment(message));\n if (linkTarget) {\n const link = document.createElement('a');\n link.href = linkTarget;\n if (linkName) {\n link.innerText = linkName;\n }\n else {\n link.innerText = linkTarget;\n }\n messageFragments.splice(1, 0, link);\n }\n // Assembly message\n const finalMessage = document.createElement('div');\n messageFragments.forEach((message) => {\n finalMessage.appendChild(message);\n });\n toast.appendChild(finalMessage);\n // Dismiss button\n const dismissBtn = document.createElement('button');\n dismissBtn.innerText = 'x';\n dismissBtn.addEventListener('click', () => {\n this._container.removeChild(toast);\n });\n toast.appendChild(dismissBtn);\n // Escape to dismiss\n const keydownHandler = (evt) => {\n if (evt.key === 'Escape') {\n try {\n this._container.removeChild(toast);\n }\n catch (_a) {\n // pass\n }\n }\n document.removeEventListener('keydown', keydownHandler);\n };\n document.addEventListener('keydown', keydownHandler);\n // Insert into container\n const first = this._container.firstChild;\n this._container.insertBefore(toast, first);\n }\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Util.ts\":\n/*!**********************!*\\\n !*** ./Util/Util.ts ***!\n \\**********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ addItemToArray: () => (/* binding */ addItemToArray),\n/* harmony export */ contains: () => (/* binding */ contains),\n/* harmony export */ delay: () => (/* binding */ delay),\n/* harmony export */ fail: () => (/* binding */ fail),\n/* harmony export */ getPosition: () => (/* binding */ getPosition),\n/* harmony export */ isObject: () => (/* binding */ isObject),\n/* harmony export */ mergeDeep: () => (/* binding */ mergeDeep),\n/* harmony export */ omit: () => (/* binding */ omit),\n/* harmony export */ removeItemFromArray: () => (/* binding */ removeItemFromArray)\n/* harmony export */ });\n/* harmony import */ var _Math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Math/vector */ \"./Math/vector.ts\");\n/* harmony import */ var _Future__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Future */ \"./Util/Future.ts\");\n\n\n/**\n * Find the screen position of an HTML element\n */\nfunction getPosition(el) {\n // do we need the scroll too? technically the offset method before did that\n if (el && el.getBoundingClientRect) {\n const rect = el.getBoundingClientRect();\n return (0,_Math_vector__WEBPACK_IMPORTED_MODULE_0__.vec)(rect.x + window.scrollX, rect.y + window.scrollY);\n }\n return _Math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector.Zero;\n}\n/**\n * Add an item to an array list if it doesn't already exist. Returns true if added, false if not and already exists in the array.\n * @deprecated Will be removed in v0.26.0\n */\nfunction addItemToArray(item, array) {\n if (array.indexOf(item) === -1) {\n array.push(item);\n return true;\n }\n return false;\n}\n/**\n * Remove an item from an list\n * @deprecated Will be removed in v0.26.0\n */\nfunction removeItemFromArray(item, array) {\n let index = -1;\n if ((index = array.indexOf(item)) > -1) {\n array.splice(index, 1);\n return true;\n }\n return false;\n}\n/**\n * See if an array contains something\n */\nfunction contains(array, obj) {\n for (let i = 0; i < array.length; i++) {\n if (array[i] === obj) {\n return true;\n }\n }\n return false;\n}\n/**\n * Used for exhaustive checks at compile time\n */\nfunction fail(message) {\n throw new Error(message);\n}\n/**\n * Create a promise that resolves after a certain number of milliseconds\n *\n * It is strongly recommended you pass the excalibur clock so delays are bound to the\n * excalibur clock which would be unaffected by stop/pause.\n * @param milliseconds\n * @param clock\n */\nfunction delay(milliseconds, clock) {\n var _a;\n const future = new _Future__WEBPACK_IMPORTED_MODULE_1__.Future();\n const schedule = (_a = clock === null || clock === void 0 ? void 0 : clock.schedule.bind(clock)) !== null && _a !== void 0 ? _a : setTimeout;\n schedule(() => {\n future.resolve();\n }, milliseconds);\n return future.promise;\n}\n/**\n * Remove keys from object literals\n * @param object\n * @param keys\n */\nfunction omit(object, keys) {\n const newObj = {};\n for (const key in object) {\n if (!keys.includes(key)) {\n newObj[key] = object[key];\n }\n }\n return newObj;\n}\n/**\n * Simple object check.\n * @param item\n */\nfunction isObject(item) {\n return item && typeof item === 'object' && !Array.isArray(item);\n}\n/**\n * Deep merge two objects.\n * @param target\n * @param sources\n */\nfunction mergeDeep(target, ...sources) {\n if (!sources.length) {\n return target;\n }\n const source = sources.shift();\n if (isObject(target) && isObject(source)) {\n for (const key in source) {\n if (isObject(source[key])) {\n if (!target[key]) {\n Object.assign(target, { [key]: {} });\n }\n mergeDeep(target[key], source[key]);\n }\n else {\n Object.assign(target, { [key]: source[key] });\n }\n }\n }\n return mergeDeep(target, ...sources);\n}\n\n\n/***/ }),\n\n/***/ \"./Util/Watch.ts\":\n/*!***********************!*\\\n !*** ./Util/Watch.ts ***!\n \\***********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ watch: () => (/* binding */ watch),\n/* harmony export */ watchAny: () => (/* binding */ watchAny),\n/* harmony export */ watchDeep: () => (/* binding */ watchDeep)\n/* harmony export */ });\n/**\n * Watch an object with a proxy, only fires if property value is different\n */\nfunction watch(type, change) {\n if (!type) {\n return type;\n }\n if (type.__isProxy === undefined) {\n // expando hack to mark a proxy\n return new Proxy(type, {\n set: (obj, prop, value) => {\n // The default behavior to store the value\n if (obj[prop] !== value) {\n obj[prop] = value;\n // Avoid watching private junk\n if (typeof prop === 'string') {\n if (prop[0] !== '_') {\n change(obj);\n }\n }\n }\n // Indicate success\n return true;\n },\n get: (obj, prop) => {\n if (prop !== '__isProxy') {\n return obj[prop];\n }\n return true;\n }\n });\n }\n return type;\n}\nconst createHandler = (path = [], change, typeType) => ({\n get: (target, key) => {\n if (key === '__isProxy') {\n return true;\n }\n if (typeof target[key] === 'object' && target[key] != null) {\n return new Proxy(target[key], createHandler([...path, key], change, typeType));\n }\n return target[key];\n },\n set: (target, key, value) => {\n if (typeof key === 'string') {\n if (key[0] !== '_') {\n change(typeType);\n }\n }\n target[key] = value;\n return true;\n }\n});\n/**\n *\n */\nfunction watchDeep(type, change) {\n if (!type) {\n return type;\n }\n if (type.__isProxy === undefined) {\n // expando hack to mark a proxy\n return new Proxy(type, createHandler([], change, type));\n }\n return type;\n}\n/**\n * Watch an object with a proxy, fires change on any property value change\n */\nfunction watchAny(type, change) {\n if (!type) {\n return type;\n }\n if (type.__isProxy === undefined) {\n // expando hack to mark a proxy\n return new Proxy(type, {\n set: (obj, prop, value) => {\n // The default behavior to store the value\n obj[prop] = value;\n // Avoid watching private junk\n if (typeof prop === 'string') {\n if (prop[0] !== '_') {\n change(obj);\n }\n }\n // Indicate success\n return true;\n },\n get: (obj, prop) => {\n if (prop !== '__isProxy') {\n return obj[prop];\n }\n return true;\n }\n });\n }\n return type;\n}\n\n\n/***/ }),\n\n/***/ \"./Util/WebAudio.ts\":\n/*!**************************!*\\\n !*** ./Util/WebAudio.ts ***!\n \\**************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ WebAudio: () => (/* binding */ WebAudio)\n/* harmony export */ });\n/* harmony import */ var _Resources_Sound_AudioContext__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Resources/Sound/AudioContext */ \"./Resources/Sound/AudioContext.ts\");\n/* harmony import */ var _Log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Log */ \"./Util/Log.ts\");\n\n\n/**\n * Patch for detecting legacy web audio in browsers\n * @internal\n * @param source\n */\nfunction isLegacyWebAudioSource(source) {\n return !!source.playbackState;\n}\nclass WebAudio {\n /**\n * Play an empty sound to unlock Safari WebAudio context. Call this function\n * right after a user interaction event.\n * @source https://paulbakaus.com/tutorials/html5/web-audio-on-ios/\n */\n static unlock() {\n const promise = new Promise((resolve, reject) => {\n if (WebAudio._UNLOCKED || !_Resources_Sound_AudioContext__WEBPACK_IMPORTED_MODULE_0__.AudioContextFactory.create()) {\n return resolve(true);\n }\n const unlockTimeoutTimer = setTimeout(() => {\n _Log__WEBPACK_IMPORTED_MODULE_1__.Logger.getInstance().warn('Excalibur was unable to unlock the audio context, audio probably will not play in this browser.');\n resolve(false);\n }, 200);\n const audioContext = _Resources_Sound_AudioContext__WEBPACK_IMPORTED_MODULE_0__.AudioContextFactory.create();\n audioContext.resume().then(() => {\n // create empty buffer and play it\n const buffer = audioContext.createBuffer(1, 1, 22050);\n const source = audioContext.createBufferSource();\n let ended = false;\n source.buffer = buffer;\n source.connect(audioContext.destination);\n source.onended = () => (ended = true);\n source.start(0);\n // by checking the play state after some time, we know if we're really unlocked\n setTimeout(() => {\n if (isLegacyWebAudioSource(source)) {\n if (source.playbackState === source.PLAYING_STATE || source.playbackState === source.FINISHED_STATE) {\n WebAudio._UNLOCKED = true;\n }\n }\n else {\n if (audioContext.currentTime > 0 || ended) {\n WebAudio._UNLOCKED = true;\n }\n }\n }, 0);\n clearTimeout(unlockTimeoutTimer);\n resolve(true);\n }, () => {\n reject();\n });\n });\n return promise;\n }\n static isUnlocked() {\n return this._UNLOCKED;\n }\n}\nWebAudio._UNLOCKED = false;\n\n\n/***/ }),\n\n/***/ \"./index.ts\":\n/*!******************!*\\\n !*** ./index.ts ***!\n \\******************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ActionCompleteEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.ActionCompleteEvent),\n/* harmony export */ ActionContext: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ActionContext),\n/* harmony export */ ActionQueue: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ActionQueue),\n/* harmony export */ ActionSequence: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ActionSequence),\n/* harmony export */ ActionStartEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.ActionStartEvent),\n/* harmony export */ ActionsComponent: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ActionsComponent),\n/* harmony export */ ActionsSystem: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ActionsSystem),\n/* harmony export */ ActivateEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.ActivateEvent),\n/* harmony export */ Actor: () => (/* reexport safe */ _Actor__WEBPACK_IMPORTED_MODULE_6__.Actor),\n/* harmony export */ ActorEvents: () => (/* reexport safe */ _Actor__WEBPACK_IMPORTED_MODULE_6__.ActorEvents),\n/* harmony export */ AddEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.AddEvent),\n/* harmony export */ AddedComponent: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.AddedComponent),\n/* harmony export */ AffineMatrix: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.AffineMatrix),\n/* harmony export */ Animation: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Animation),\n/* harmony export */ AnimationDirection: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.AnimationDirection),\n/* harmony export */ AnimationEvents: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.AnimationEvents),\n/* harmony export */ AnimationStrategy: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.AnimationStrategy),\n/* harmony export */ ArcadeSolver: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.ArcadeSolver),\n/* harmony export */ AudioContextFactory: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.AudioContextFactory),\n/* harmony export */ Axes: () => (/* reexport safe */ _Input_Gamepad__WEBPACK_IMPORTED_MODULE_40__.Axes),\n/* harmony export */ Axis: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.Axis),\n/* harmony export */ BaseAlign: () => (/* reexport safe */ _Graphics_FontCommon__WEBPACK_IMPORTED_MODULE_14__.BaseAlign),\n/* harmony export */ BezierCurve: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.BezierCurve),\n/* harmony export */ Blink: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.Blink),\n/* harmony export */ BodyComponent: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.BodyComponent),\n/* harmony export */ BoundingBox: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.BoundingBox),\n/* harmony export */ BrowserComponent: () => (/* reexport safe */ _Util_Browser__WEBPACK_IMPORTED_MODULE_45__.BrowserComponent),\n/* harmony export */ BrowserEvents: () => (/* reexport safe */ _Util_Browser__WEBPACK_IMPORTED_MODULE_45__.BrowserEvents),\n/* harmony export */ Buttons: () => (/* reexport safe */ _Input_Gamepad__WEBPACK_IMPORTED_MODULE_40__.Buttons),\n/* harmony export */ Camera: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.Camera),\n/* harmony export */ CameraEvents: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.CameraEvents),\n/* harmony export */ Canvas: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Canvas),\n/* harmony export */ Circle: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Circle),\n/* harmony export */ CircleCollider: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.CircleCollider),\n/* harmony export */ Clock: () => (/* reexport safe */ _Util_Clock__WEBPACK_IMPORTED_MODULE_53__.Clock),\n/* harmony export */ ClosestLineJumpTable: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.ClosestLineJumpTable),\n/* harmony export */ Collider: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.Collider),\n/* harmony export */ ColliderComponent: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.ColliderComponent),\n/* harmony export */ CollisionContact: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.CollisionContact),\n/* harmony export */ CollisionEndEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.CollisionEndEvent),\n/* harmony export */ CollisionGroup: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.CollisionGroup),\n/* harmony export */ CollisionGroupManager: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.CollisionGroupManager),\n/* harmony export */ CollisionJumpTable: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.CollisionJumpTable),\n/* harmony export */ CollisionPostSolveEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.CollisionPostSolveEvent),\n/* harmony export */ CollisionPreSolveEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.CollisionPreSolveEvent),\n/* harmony export */ CollisionStartEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.CollisionStartEvent),\n/* harmony export */ CollisionSystem: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.CollisionSystem),\n/* harmony export */ CollisionType: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.CollisionType),\n/* harmony export */ Color: () => (/* reexport safe */ _Color__WEBPACK_IMPORTED_MODULE_27__.Color),\n/* harmony export */ ColorBlindFlags: () => (/* reexport safe */ _Debug_index__WEBPACK_IMPORTED_MODULE_9__.ColorBlindFlags),\n/* harmony export */ ColorBlindnessMode: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ColorBlindnessMode),\n/* harmony export */ ColorBlindnessPostProcessor: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ColorBlindnessPostProcessor),\n/* harmony export */ Component: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.Component),\n/* harmony export */ CompositeCollider: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.CompositeCollider),\n/* harmony export */ ConsoleAppender: () => (/* reexport safe */ _Util_Log__WEBPACK_IMPORTED_MODULE_50__.ConsoleAppender),\n/* harmony export */ ContactConstraintPoint: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.ContactConstraintPoint),\n/* harmony export */ ContactEndEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.ContactEndEvent),\n/* harmony export */ ContactSolveBias: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.ContactSolveBias),\n/* harmony export */ ContactStartEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.ContactStartEvent),\n/* harmony export */ CoordPlane: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.CoordPlane),\n/* harmony export */ CrossFade: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.CrossFade),\n/* harmony export */ CurveBy: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.CurveBy),\n/* harmony export */ CurveTo: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.CurveTo),\n/* harmony export */ DeactivateEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.DeactivateEvent),\n/* harmony export */ Debug: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Debug),\n/* harmony export */ DebugConfig: () => (/* reexport safe */ _Debug_index__WEBPACK_IMPORTED_MODULE_9__.DebugConfig),\n/* harmony export */ DebugGraphicsComponent: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.DebugGraphicsComponent),\n/* harmony export */ DebugSystem: () => (/* reexport safe */ _Debug_index__WEBPACK_IMPORTED_MODULE_9__.DebugSystem),\n/* harmony export */ DebugText: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.DebugText),\n/* harmony export */ DefaultAntialiasOptions: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.DefaultAntialiasOptions),\n/* harmony export */ DefaultGarbageCollectionOptions: () => (/* reexport safe */ _GarbageCollector__WEBPACK_IMPORTED_MODULE_4__.DefaultGarbageCollectionOptions),\n/* harmony export */ DefaultLoader: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.DefaultLoader),\n/* harmony export */ DefaultPixelArtOptions: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.DefaultPixelArtOptions),\n/* harmony export */ DegreeOfFreedom: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.DegreeOfFreedom),\n/* harmony export */ Delay: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.Delay),\n/* harmony export */ Detector: () => (/* reexport safe */ _Util_Detector__WEBPACK_IMPORTED_MODULE_47__.Detector),\n/* harmony export */ Die: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.Die),\n/* harmony export */ Direction: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Direction),\n/* harmony export */ Director: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.Director),\n/* harmony export */ DirectorEvents: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.DirectorEvents),\n/* harmony export */ DisplayMode: () => (/* reexport safe */ _Screen__WEBPACK_IMPORTED_MODULE_5__.DisplayMode),\n/* harmony export */ DynamicTree: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.DynamicTree),\n/* harmony export */ DynamicTreeCollisionProcessor: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.DynamicTreeCollisionProcessor),\n/* harmony export */ EX_VERSION: () => (/* binding */ EX_VERSION),\n/* harmony export */ EaseBy: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.EaseBy),\n/* harmony export */ EaseTo: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.EaseTo),\n/* harmony export */ EasingFunctions: () => (/* reexport safe */ _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_48__.EasingFunctions),\n/* harmony export */ EdgeCollider: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.EdgeCollider),\n/* harmony export */ ElasticToActorStrategy: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.ElasticToActorStrategy),\n/* harmony export */ EmitterType: () => (/* reexport safe */ _Particles_index__WEBPACK_IMPORTED_MODULE_15__.EmitterType),\n/* harmony export */ Engine: () => (/* reexport safe */ _Engine__WEBPACK_IMPORTED_MODULE_3__.Engine),\n/* harmony export */ EngineEvents: () => (/* reexport safe */ _Engine__WEBPACK_IMPORTED_MODULE_3__.EngineEvents),\n/* harmony export */ EnterTriggerEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.EnterTriggerEvent),\n/* harmony export */ EnterViewPortEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.EnterViewPortEvent),\n/* harmony export */ Entity: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.Entity),\n/* harmony export */ EntityEvents: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.EntityEvents),\n/* harmony export */ EntityManager: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.EntityManager),\n/* harmony export */ EventEmitter: () => (/* reexport safe */ _EventEmitter__WEBPACK_IMPORTED_MODULE_10__.EventEmitter),\n/* harmony export */ EventTypes: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.EventTypes),\n/* harmony export */ Events: () => (/* reexport module object */ _Events__WEBPACK_IMPORTED_MODULE_12__),\n/* harmony export */ ExResponse: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.ExResponse),\n/* harmony export */ ExcaliburGraphicsContext2DCanvas: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ExcaliburGraphicsContext2DCanvas),\n/* harmony export */ ExcaliburGraphicsContextWebGL: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ExcaliburGraphicsContextWebGL),\n/* harmony export */ ExitTriggerEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.ExitTriggerEvent),\n/* harmony export */ ExitViewPortEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.ExitViewPortEvent),\n/* harmony export */ Fade: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.Fade),\n/* harmony export */ FadeInOut: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.FadeInOut),\n/* harmony export */ Flags: () => (/* reexport safe */ _Flags__WEBPACK_IMPORTED_MODULE_1__.Flags),\n/* harmony export */ Flash: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.Flash),\n/* harmony export */ Follow: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.Follow),\n/* harmony export */ Font: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Font),\n/* harmony export */ FontCache: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.FontCache),\n/* harmony export */ FontSource: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.FontSource),\n/* harmony export */ FontStyle: () => (/* reexport safe */ _Graphics_FontCommon__WEBPACK_IMPORTED_MODULE_14__.FontStyle),\n/* harmony export */ FontUnit: () => (/* reexport safe */ _Graphics_FontCommon__WEBPACK_IMPORTED_MODULE_14__.FontUnit),\n/* harmony export */ FpsSampler: () => (/* reexport safe */ _Util_Fps__WEBPACK_IMPORTED_MODULE_52__.FpsSampler),\n/* harmony export */ FrameStats: () => (/* reexport safe */ _Debug_index__WEBPACK_IMPORTED_MODULE_9__.FrameStats),\n/* harmony export */ Future: () => (/* reexport safe */ _Util_Future__WEBPACK_IMPORTED_MODULE_57__.Future),\n/* harmony export */ GameEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.GameEvent),\n/* harmony export */ GameStartEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.GameStartEvent),\n/* harmony export */ GameStopEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.GameStopEvent),\n/* harmony export */ Gamepad: () => (/* reexport safe */ _Input_Gamepad__WEBPACK_IMPORTED_MODULE_40__.Gamepad),\n/* harmony export */ GamepadAxisEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.GamepadAxisEvent),\n/* harmony export */ GamepadButtonEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.GamepadButtonEvent),\n/* harmony export */ GamepadConnectEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.GamepadConnectEvent),\n/* harmony export */ GamepadDisconnectEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.GamepadDisconnectEvent),\n/* harmony export */ Gamepads: () => (/* reexport safe */ _Input_Gamepad__WEBPACK_IMPORTED_MODULE_40__.Gamepads),\n/* harmony export */ GarbageCollector: () => (/* reexport safe */ _GarbageCollector__WEBPACK_IMPORTED_MODULE_4__.GarbageCollector),\n/* harmony export */ Gif: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.Gif),\n/* harmony export */ GifParser: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.GifParser),\n/* harmony export */ GlobalCoordinates: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.GlobalCoordinates),\n/* harmony export */ GpuParticleEmitter: () => (/* reexport safe */ _Particles_index__WEBPACK_IMPORTED_MODULE_15__.GpuParticleEmitter),\n/* harmony export */ GpuParticleRenderer: () => (/* reexport safe */ _Particles_index__WEBPACK_IMPORTED_MODULE_15__.GpuParticleRenderer),\n/* harmony export */ Graphic: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Graphic),\n/* harmony export */ GraphicsComponent: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.GraphicsComponent),\n/* harmony export */ GraphicsGroup: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.GraphicsGroup),\n/* harmony export */ GraphicsSystem: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.GraphicsSystem),\n/* harmony export */ HashColliderProxy: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.HashColliderProxy),\n/* harmony export */ HashGridCell: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.HashGridCell),\n/* harmony export */ HashGridProxy: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.HashGridProxy),\n/* harmony export */ HiddenEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.HiddenEvent),\n/* harmony export */ HorizontalFirst: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.HorizontalFirst),\n/* harmony export */ ImageFiltering: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ImageFiltering),\n/* harmony export */ ImageSource: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ImageSource),\n/* harmony export */ ImageSourceAttributeConstants: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ImageSourceAttributeConstants),\n/* harmony export */ ImageWrapping: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ImageWrapping),\n/* harmony export */ InitializeEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.InitializeEvent),\n/* harmony export */ InputHost: () => (/* reexport safe */ _Input_InputHost__WEBPACK_IMPORTED_MODULE_42__.InputHost),\n/* harmony export */ InputMapper: () => (/* reexport safe */ _Input_InputMapper__WEBPACK_IMPORTED_MODULE_43__.InputMapper),\n/* harmony export */ IsometricEntityComponent: () => (/* reexport safe */ _TileMap_index__WEBPACK_IMPORTED_MODULE_17__.IsometricEntityComponent),\n/* harmony export */ IsometricEntitySystem: () => (/* reexport safe */ _TileMap_index__WEBPACK_IMPORTED_MODULE_17__.IsometricEntitySystem),\n/* harmony export */ IsometricMap: () => (/* reexport safe */ _TileMap_index__WEBPACK_IMPORTED_MODULE_17__.IsometricMap),\n/* harmony export */ IsometricTile: () => (/* reexport safe */ _TileMap_index__WEBPACK_IMPORTED_MODULE_17__.IsometricTile),\n/* harmony export */ KeyEvent: () => (/* reexport safe */ _Input_Keyboard__WEBPACK_IMPORTED_MODULE_41__.KeyEvent),\n/* harmony export */ Keyboard: () => (/* reexport safe */ _Input_Keyboard__WEBPACK_IMPORTED_MODULE_41__.Keyboard),\n/* harmony export */ Keys: () => (/* reexport safe */ _Input_Keyboard__WEBPACK_IMPORTED_MODULE_41__.Keys),\n/* harmony export */ KillEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.KillEvent),\n/* harmony export */ Label: () => (/* reexport safe */ _Label__WEBPACK_IMPORTED_MODULE_13__.Label),\n/* harmony export */ LimitCameraBoundsStrategy: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.LimitCameraBoundsStrategy),\n/* harmony export */ Line: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Line),\n/* harmony export */ LineSegment: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.LineSegment),\n/* harmony export */ Loader: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.Loader),\n/* harmony export */ LoaderEvents: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.LoaderEvents),\n/* harmony export */ LockCameraToActorAxisStrategy: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.LockCameraToActorAxisStrategy),\n/* harmony export */ LockCameraToActorStrategy: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.LockCameraToActorStrategy),\n/* harmony export */ LogLevel: () => (/* reexport safe */ _Util_Log__WEBPACK_IMPORTED_MODULE_50__.LogLevel),\n/* harmony export */ Logger: () => (/* reexport safe */ _Util_Log__WEBPACK_IMPORTED_MODULE_50__.Logger),\n/* harmony export */ Material: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Material),\n/* harmony export */ Matrix: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.Matrix),\n/* harmony export */ MatrixLocations: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.MatrixLocations),\n/* harmony export */ MediaEvent: () => (/* reexport safe */ _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_11__.MediaEvent),\n/* harmony export */ Meet: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.Meet),\n/* harmony export */ MotionComponent: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.MotionComponent),\n/* harmony export */ MotionSystem: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.MotionSystem),\n/* harmony export */ MoveBy: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.MoveBy),\n/* harmony export */ MoveByWithOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.MoveByWithOptions),\n/* harmony export */ MoveTo: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.MoveTo),\n/* harmony export */ MoveToWithOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.MoveToWithOptions),\n/* harmony export */ NativePointerButton: () => (/* reexport safe */ _Input_NativePointerButton__WEBPACK_IMPORTED_MODULE_33__.NativePointerButton),\n/* harmony export */ NativeSoundEvent: () => (/* reexport safe */ _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_11__.NativeSoundEvent),\n/* harmony export */ NativeSoundProcessedEvent: () => (/* reexport safe */ _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_11__.NativeSoundProcessedEvent),\n/* harmony export */ NineSlice: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.NineSlice),\n/* harmony export */ NineSliceStretch: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.NineSliceStretch),\n/* harmony export */ None: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.None),\n/* harmony export */ Observable: () => (/* reexport safe */ _Util_Observable__WEBPACK_IMPORTED_MODULE_49__.Observable),\n/* harmony export */ OffscreenSystem: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.OffscreenSystem),\n/* harmony export */ Pair: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.Pair),\n/* harmony export */ ParallaxComponent: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ParallaxComponent),\n/* harmony export */ ParallelActions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ParallelActions),\n/* harmony export */ Particle: () => (/* reexport safe */ _Particles_index__WEBPACK_IMPORTED_MODULE_15__.Particle),\n/* harmony export */ ParticleEmitter: () => (/* reexport safe */ _Particles_index__WEBPACK_IMPORTED_MODULE_15__.ParticleEmitter),\n/* harmony export */ ParticleRenderer: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ParticleRenderer),\n/* harmony export */ ParticleTransform: () => (/* reexport safe */ _Particles_index__WEBPACK_IMPORTED_MODULE_15__.ParticleTransform),\n/* harmony export */ PhysicsStats: () => (/* reexport safe */ _Debug_index__WEBPACK_IMPORTED_MODULE_9__.PhysicsStats),\n/* harmony export */ PhysicsWorld: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.PhysicsWorld),\n/* harmony export */ PointerAbstraction: () => (/* reexport safe */ _Input_PointerAbstraction__WEBPACK_IMPORTED_MODULE_35__.PointerAbstraction),\n/* harmony export */ PointerButton: () => (/* reexport safe */ _Input_PointerButton__WEBPACK_IMPORTED_MODULE_32__.PointerButton),\n/* harmony export */ PointerComponent: () => (/* reexport safe */ _Input_PointerComponent__WEBPACK_IMPORTED_MODULE_36__.PointerComponent),\n/* harmony export */ PointerEvent: () => (/* reexport safe */ _Input_PointerEvent__WEBPACK_IMPORTED_MODULE_30__.PointerEvent),\n/* harmony export */ PointerEventReceiver: () => (/* reexport safe */ _Input_PointerEventReceiver__WEBPACK_IMPORTED_MODULE_34__.PointerEventReceiver),\n/* harmony export */ PointerScope: () => (/* reexport safe */ _Input_PointerScope__WEBPACK_IMPORTED_MODULE_39__.PointerScope),\n/* harmony export */ PointerSystem: () => (/* reexport safe */ _Input_PointerSystem__WEBPACK_IMPORTED_MODULE_37__.PointerSystem),\n/* harmony export */ PointerType: () => (/* reexport safe */ _Input_PointerType__WEBPACK_IMPORTED_MODULE_38__.PointerType),\n/* harmony export */ Polygon: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Polygon),\n/* harmony export */ PolygonCollider: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.PolygonCollider),\n/* harmony export */ Pool: () => (/* reexport safe */ _Util_Pool__WEBPACK_IMPORTED_MODULE_51__.Pool),\n/* harmony export */ PostCollisionEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PostCollisionEvent),\n/* harmony export */ PostDebugDrawEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PostDebugDrawEvent),\n/* harmony export */ PostDrawEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PostDrawEvent),\n/* harmony export */ PostFrameEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PostFrameEvent),\n/* harmony export */ PostKillEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PostKillEvent),\n/* harmony export */ PostTransformDrawEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PostTransformDrawEvent),\n/* harmony export */ PostUpdateEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PostUpdateEvent),\n/* harmony export */ PreCollisionEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PreCollisionEvent),\n/* harmony export */ PreDebugDrawEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PreDebugDrawEvent),\n/* harmony export */ PreDrawEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PreDrawEvent),\n/* harmony export */ PreFrameEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PreFrameEvent),\n/* harmony export */ PreKillEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PreKillEvent),\n/* harmony export */ PreLoadEvent: () => (/* reexport safe */ _Scene__WEBPACK_IMPORTED_MODULE_16__.PreLoadEvent),\n/* harmony export */ PreTransformDrawEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PreTransformDrawEvent),\n/* harmony export */ PreUpdateEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.PreUpdateEvent),\n/* harmony export */ Projection: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.Projection),\n/* harmony export */ QuadIndexBuffer: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.QuadIndexBuffer),\n/* harmony export */ QuadTree: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.QuadTree),\n/* harmony export */ Query: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.Query),\n/* harmony export */ QueryManager: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.QueryManager),\n/* harmony export */ RadiusAroundActorStrategy: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.RadiusAroundActorStrategy),\n/* harmony export */ Random: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.Random),\n/* harmony export */ Raster: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Raster),\n/* harmony export */ Ray: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.Ray),\n/* harmony export */ RealisticSolver: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.RealisticSolver),\n/* harmony export */ Rectangle: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Rectangle),\n/* harmony export */ RemoveEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.RemoveEvent),\n/* harmony export */ RemovedComponent: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.RemovedComponent),\n/* harmony export */ Repeat: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.Repeat),\n/* harmony export */ RepeatForever: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.RepeatForever),\n/* harmony export */ Resolution: () => (/* reexport safe */ _Screen__WEBPACK_IMPORTED_MODULE_5__.Resolution),\n/* harmony export */ Resource: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.Resource),\n/* harmony export */ ResourceEvents: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.ResourceEvents),\n/* harmony export */ RotateBy: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.RotateBy),\n/* harmony export */ RotateByWithOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.RotateByWithOptions),\n/* harmony export */ RotateTo: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.RotateTo),\n/* harmony export */ RotateToWithOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.RotateToWithOptions),\n/* harmony export */ RotationType: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.RotationType),\n/* harmony export */ ScaleBy: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ScaleBy),\n/* harmony export */ ScaleByWithOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ScaleByWithOptions),\n/* harmony export */ ScaleTo: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ScaleTo),\n/* harmony export */ ScaleToWithOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.ScaleToWithOptions),\n/* harmony export */ Scene: () => (/* reexport safe */ _Scene__WEBPACK_IMPORTED_MODULE_16__.Scene),\n/* harmony export */ SceneEvents: () => (/* reexport safe */ _Scene__WEBPACK_IMPORTED_MODULE_16__.SceneEvents),\n/* harmony export */ Screen: () => (/* reexport safe */ _Screen__WEBPACK_IMPORTED_MODULE_5__.Screen),\n/* harmony export */ ScreenAppender: () => (/* reexport safe */ _Util_Log__WEBPACK_IMPORTED_MODULE_50__.ScreenAppender),\n/* harmony export */ ScreenElement: () => (/* reexport safe */ _ScreenElement__WEBPACK_IMPORTED_MODULE_20__.ScreenElement),\n/* harmony export */ ScreenEvents: () => (/* reexport safe */ _Screen__WEBPACK_IMPORTED_MODULE_5__.ScreenEvents),\n/* harmony export */ ScreenShader: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.ScreenShader),\n/* harmony export */ ScrollPreventionMode: () => (/* reexport safe */ _Engine__WEBPACK_IMPORTED_MODULE_3__.ScrollPreventionMode),\n/* harmony export */ Semaphore: () => (/* reexport safe */ _Util_Semaphore__WEBPACK_IMPORTED_MODULE_58__.Semaphore),\n/* harmony export */ SeparatingAxis: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.SeparatingAxis),\n/* harmony export */ SeparationInfo: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.SeparationInfo),\n/* harmony export */ Shader: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Shader),\n/* harmony export */ Shape: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.Shape),\n/* harmony export */ Side: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.Side),\n/* harmony export */ Slide: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.Slide),\n/* harmony export */ SolverStrategy: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.SolverStrategy),\n/* harmony export */ Sound: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.Sound),\n/* harmony export */ SoundEvents: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.SoundEvents),\n/* harmony export */ SparseHashGrid: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.SparseHashGrid),\n/* harmony export */ SparseHashGridCollisionProcessor: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.SparseHashGridCollisionProcessor),\n/* harmony export */ SpatialPartitionStrategy: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.SpatialPartitionStrategy),\n/* harmony export */ Sprite: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Sprite),\n/* harmony export */ SpriteFont: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.SpriteFont),\n/* harmony export */ SpriteSheet: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.SpriteSheet),\n/* harmony export */ StandardClock: () => (/* reexport safe */ _Util_Clock__WEBPACK_IMPORTED_MODULE_53__.StandardClock),\n/* harmony export */ StateMachine: () => (/* reexport safe */ _Util_StateMachine__WEBPACK_IMPORTED_MODULE_56__.StateMachine),\n/* harmony export */ StrategyContainer: () => (/* reexport safe */ _Camera__WEBPACK_IMPORTED_MODULE_8__.StrategyContainer),\n/* harmony export */ Stream: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.Stream),\n/* harmony export */ System: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.System),\n/* harmony export */ SystemManager: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.SystemManager),\n/* harmony export */ SystemPriority: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.SystemPriority),\n/* harmony export */ SystemType: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.SystemType),\n/* harmony export */ TagQuery: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.TagQuery),\n/* harmony export */ TestClock: () => (/* reexport safe */ _Util_Clock__WEBPACK_IMPORTED_MODULE_53__.TestClock),\n/* harmony export */ Text: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.Text),\n/* harmony export */ TextAlign: () => (/* reexport safe */ _Graphics_FontCommon__WEBPACK_IMPORTED_MODULE_14__.TextAlign),\n/* harmony export */ TextureLoader: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.TextureLoader),\n/* harmony export */ Tile: () => (/* reexport safe */ _TileMap_index__WEBPACK_IMPORTED_MODULE_17__.Tile),\n/* harmony export */ TileMap: () => (/* reexport safe */ _TileMap_index__WEBPACK_IMPORTED_MODULE_17__.TileMap),\n/* harmony export */ TileMapEvents: () => (/* reexport safe */ _TileMap_index__WEBPACK_IMPORTED_MODULE_17__.TileMapEvents),\n/* harmony export */ TiledAnimation: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.TiledAnimation),\n/* harmony export */ TiledSprite: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.TiledSprite),\n/* harmony export */ Timer: () => (/* reexport safe */ _Timer__WEBPACK_IMPORTED_MODULE_18__.Timer),\n/* harmony export */ Toaster: () => (/* reexport safe */ _Util_Toaster__WEBPACK_IMPORTED_MODULE_55__.Toaster),\n/* harmony export */ Transform: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.Transform),\n/* harmony export */ TransformComponent: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.TransformComponent),\n/* harmony export */ Transition: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.Transition),\n/* harmony export */ TreeNode: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.TreeNode),\n/* harmony export */ Trigger: () => (/* reexport safe */ _Trigger__WEBPACK_IMPORTED_MODULE_19__.Trigger),\n/* harmony export */ TriggerEvents: () => (/* reexport safe */ _Trigger__WEBPACK_IMPORTED_MODULE_19__.TriggerEvents),\n/* harmony export */ TwoPI: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.TwoPI),\n/* harmony export */ Util: () => (/* reexport module object */ _Util_Index__WEBPACK_IMPORTED_MODULE_44__),\n/* harmony export */ Vector: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.Vector),\n/* harmony export */ VectorView: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.VectorView),\n/* harmony export */ VertexBuffer: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.VertexBuffer),\n/* harmony export */ VertexLayout: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.VertexLayout),\n/* harmony export */ VerticalFirst: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.VerticalFirst),\n/* harmony export */ VisibleEvent: () => (/* reexport safe */ _Events__WEBPACK_IMPORTED_MODULE_12__.VisibleEvent),\n/* harmony export */ WebAudio: () => (/* reexport safe */ _Util_WebAudio__WEBPACK_IMPORTED_MODULE_54__.WebAudio),\n/* harmony export */ WebAudioInstance: () => (/* reexport safe */ _Resources_Index__WEBPACK_IMPORTED_MODULE_24__.WebAudioInstance),\n/* harmony export */ WheelDeltaMode: () => (/* reexport safe */ _Input_WheelDeltaMode__WEBPACK_IMPORTED_MODULE_31__.WheelDeltaMode),\n/* harmony export */ WheelEvent: () => (/* reexport safe */ _Input_WheelEvent__WEBPACK_IMPORTED_MODULE_29__.WheelEvent),\n/* harmony export */ World: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.World),\n/* harmony export */ approximatelyEqual: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.approximatelyEqual),\n/* harmony export */ assert: () => (/* reexport safe */ _Util_Assert__WEBPACK_IMPORTED_MODULE_60__.assert),\n/* harmony export */ canonicalizeAngle: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.canonicalizeAngle),\n/* harmony export */ clamp: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.clamp),\n/* harmony export */ coroutine: () => (/* reexport safe */ _Util_Coroutine__WEBPACK_IMPORTED_MODULE_59__.coroutine),\n/* harmony export */ createId: () => (/* reexport safe */ _Id__WEBPACK_IMPORTED_MODULE_2__.createId),\n/* harmony export */ frac: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.frac),\n/* harmony export */ getDefaultPhysicsConfig: () => (/* reexport safe */ _Collision_Index__WEBPACK_IMPORTED_MODULE_22__.getDefaultPhysicsConfig),\n/* harmony export */ hasGraphicsTick: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.hasGraphicsTick),\n/* harmony export */ hasOnAdd: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.hasOnAdd),\n/* harmony export */ hasOnInitialize: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.hasOnInitialize),\n/* harmony export */ hasOnPostUpdate: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.hasOnPostUpdate),\n/* harmony export */ hasOnPreUpdate: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.hasOnPreUpdate),\n/* harmony export */ hasOnRemove: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.hasOnRemove),\n/* harmony export */ hasPostDraw: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.hasPostDraw),\n/* harmony export */ hasPreDraw: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.hasPreDraw),\n/* harmony export */ has_add: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.has_add),\n/* harmony export */ has_initialize: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.has_initialize),\n/* harmony export */ has_postupdate: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.has_postupdate),\n/* harmony export */ has_preupdate: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.has_preupdate),\n/* harmony export */ has_remove: () => (/* reexport safe */ _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__.has_remove),\n/* harmony export */ inverseLerp: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.inverseLerp),\n/* harmony export */ inverseLerpVector: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.inverseLerpVector),\n/* harmony export */ isActor: () => (/* reexport safe */ _Actor__WEBPACK_IMPORTED_MODULE_6__.isActor),\n/* harmony export */ isAddedComponent: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.isAddedComponent),\n/* harmony export */ isComponentCtor: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.isComponentCtor),\n/* harmony export */ isLoaderConstructor: () => (/* reexport safe */ _Director_index__WEBPACK_IMPORTED_MODULE_26__.isLoaderConstructor),\n/* harmony export */ isMoveByOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.isMoveByOptions),\n/* harmony export */ isMoveToOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.isMoveToOptions),\n/* harmony export */ isRemovedComponent: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.isRemovedComponent),\n/* harmony export */ isRotateByOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.isRotateByOptions),\n/* harmony export */ isRotateToOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.isRotateToOptions),\n/* harmony export */ isScaleByOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.isScaleByOptions),\n/* harmony export */ isScaleToOptions: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.isScaleToOptions),\n/* harmony export */ isSceneConstructor: () => (/* reexport safe */ _Scene__WEBPACK_IMPORTED_MODULE_16__.isSceneConstructor),\n/* harmony export */ isScreenElement: () => (/* reexport safe */ _ScreenElement__WEBPACK_IMPORTED_MODULE_20__.isScreenElement),\n/* harmony export */ isSystemConstructor: () => (/* reexport safe */ _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__.isSystemConstructor),\n/* harmony export */ lerp: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.lerp),\n/* harmony export */ lerpAngle: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.lerpAngle),\n/* harmony export */ lerpVector: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.lerpVector),\n/* harmony export */ maxMessages: () => (/* reexport safe */ _Util_Decorators__WEBPACK_IMPORTED_MODULE_46__.maxMessages),\n/* harmony export */ nextActionId: () => (/* reexport safe */ _Actions_index__WEBPACK_IMPORTED_MODULE_21__.nextActionId),\n/* harmony export */ obsolete: () => (/* reexport safe */ _Util_Decorators__WEBPACK_IMPORTED_MODULE_46__.obsolete),\n/* harmony export */ parseImageFiltering: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.parseImageFiltering),\n/* harmony export */ parseImageWrapping: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.parseImageWrapping),\n/* harmony export */ pixelSnapEpsilon: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.pixelSnapEpsilon),\n/* harmony export */ randomInRange: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.randomInRange),\n/* harmony export */ randomIntInRange: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.randomIntInRange),\n/* harmony export */ range: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.range),\n/* harmony export */ remap: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.remap),\n/* harmony export */ remapVector: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.remapVector),\n/* harmony export */ resetObsoleteCounter: () => (/* reexport safe */ _Util_Decorators__WEBPACK_IMPORTED_MODULE_46__.resetObsoleteCounter),\n/* harmony export */ sign: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.sign),\n/* harmony export */ toDegrees: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.toDegrees),\n/* harmony export */ toRadians: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.toRadians),\n/* harmony export */ vec: () => (/* reexport safe */ _Math_index__WEBPACK_IMPORTED_MODULE_7__.vec),\n/* harmony export */ webgl: () => (/* reexport safe */ _Graphics_index__WEBPACK_IMPORTED_MODULE_28__.webgl)\n/* harmony export */ });\n/* harmony import */ var _Polyfill__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Polyfill */ \"./Polyfill.ts\");\n/* harmony import */ var _Flags__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Flags */ \"./Flags.ts\");\n/* harmony import */ var _Id__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Id */ \"./Id.ts\");\n/* harmony import */ var _Engine__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Engine */ \"./Engine.ts\");\n/* harmony import */ var _GarbageCollector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./GarbageCollector */ \"./GarbageCollector.ts\");\n/* harmony import */ var _Screen__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Screen */ \"./Screen.ts\");\n/* harmony import */ var _Actor__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Actor */ \"./Actor.ts\");\n/* harmony import */ var _Math_index__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Math/index */ \"./Math/index.ts\");\n/* harmony import */ var _Camera__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Camera */ \"./Camera.ts\");\n/* harmony import */ var _Debug_index__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Debug/index */ \"./Debug/index.ts\");\n/* harmony import */ var _EventEmitter__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./EventEmitter */ \"./EventEmitter.ts\");\n/* harmony import */ var _Events_MediaEvents__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Events/MediaEvents */ \"./Events/MediaEvents.ts\");\n/* harmony import */ var _Events__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Events */ \"./Events.ts\");\n/* harmony import */ var _Label__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Label */ \"./Label.ts\");\n/* harmony import */ var _Graphics_FontCommon__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Graphics/FontCommon */ \"./Graphics/FontCommon.ts\");\n/* harmony import */ var _Particles_index__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Particles/index */ \"./Particles/index.ts\");\n/* harmony import */ var _Scene__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Scene */ \"./Scene.ts\");\n/* harmony import */ var _TileMap_index__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./TileMap/index */ \"./TileMap/index.ts\");\n/* harmony import */ var _Timer__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Timer */ \"./Timer.ts\");\n/* harmony import */ var _Trigger__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./Trigger */ \"./Trigger.ts\");\n/* harmony import */ var _ScreenElement__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./ScreenElement */ \"./ScreenElement.ts\");\n/* harmony import */ var _Actions_index__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./Actions/index */ \"./Actions/index.ts\");\n/* harmony import */ var _Collision_Index__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./Collision/Index */ \"./Collision/Index.ts\");\n/* harmony import */ var _Interfaces_Index__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./Interfaces/Index */ \"./Interfaces/Index.ts\");\n/* harmony import */ var _Resources_Index__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./Resources/Index */ \"./Resources/Index.ts\");\n/* harmony import */ var _EntityComponentSystem_index__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./EntityComponentSystem/index */ \"./EntityComponentSystem/index.ts\");\n/* harmony import */ var _Director_index__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./Director/index */ \"./Director/index.ts\");\n/* harmony import */ var _Color__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./Color */ \"./Color.ts\");\n/* harmony import */ var _Graphics_index__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./Graphics/index */ \"./Graphics/index.ts\");\n/* harmony import */ var _Input_WheelEvent__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./Input/WheelEvent */ \"./Input/WheelEvent.ts\");\n/* harmony import */ var _Input_PointerEvent__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./Input/PointerEvent */ \"./Input/PointerEvent.ts\");\n/* harmony import */ var _Input_WheelDeltaMode__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./Input/WheelDeltaMode */ \"./Input/WheelDeltaMode.ts\");\n/* harmony import */ var _Input_PointerButton__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./Input/PointerButton */ \"./Input/PointerButton.ts\");\n/* harmony import */ var _Input_NativePointerButton__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./Input/NativePointerButton */ \"./Input/NativePointerButton.ts\");\n/* harmony import */ var _Input_PointerEventReceiver__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./Input/PointerEventReceiver */ \"./Input/PointerEventReceiver.ts\");\n/* harmony import */ var _Input_PointerAbstraction__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./Input/PointerAbstraction */ \"./Input/PointerAbstraction.ts\");\n/* harmony import */ var _Input_PointerComponent__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./Input/PointerComponent */ \"./Input/PointerComponent.ts\");\n/* harmony import */ var _Input_PointerSystem__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./Input/PointerSystem */ \"./Input/PointerSystem.ts\");\n/* harmony import */ var _Input_PointerType__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./Input/PointerType */ \"./Input/PointerType.ts\");\n/* harmony import */ var _Input_PointerScope__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./Input/PointerScope */ \"./Input/PointerScope.ts\");\n/* harmony import */ var _Input_Gamepad__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./Input/Gamepad */ \"./Input/Gamepad.ts\");\n/* harmony import */ var _Input_Keyboard__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ./Input/Keyboard */ \"./Input/Keyboard.ts\");\n/* harmony import */ var _Input_InputHost__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ./Input/InputHost */ \"./Input/InputHost.ts\");\n/* harmony import */ var _Input_InputMapper__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ./Input/InputMapper */ \"./Input/InputMapper.ts\");\n/* harmony import */ var _Util_Index__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! ./Util/Index */ \"./Util/Index.ts\");\n/* harmony import */ var _Util_Browser__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! ./Util/Browser */ \"./Util/Browser.ts\");\n/* harmony import */ var _Util_Decorators__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! ./Util/Decorators */ \"./Util/Decorators.ts\");\n/* harmony import */ var _Util_Detector__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! ./Util/Detector */ \"./Util/Detector.ts\");\n/* harmony import */ var _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! ./Util/EasingFunctions */ \"./Util/EasingFunctions.ts\");\n/* harmony import */ var _Util_Observable__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(/*! ./Util/Observable */ \"./Util/Observable.ts\");\n/* harmony import */ var _Util_Log__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(/*! ./Util/Log */ \"./Util/Log.ts\");\n/* harmony import */ var _Util_Pool__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(/*! ./Util/Pool */ \"./Util/Pool.ts\");\n/* harmony import */ var _Util_Fps__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(/*! ./Util/Fps */ \"./Util/Fps.ts\");\n/* harmony import */ var _Util_Clock__WEBPACK_IMPORTED_MODULE_53__ = __webpack_require__(/*! ./Util/Clock */ \"./Util/Clock.ts\");\n/* harmony import */ var _Util_WebAudio__WEBPACK_IMPORTED_MODULE_54__ = __webpack_require__(/*! ./Util/WebAudio */ \"./Util/WebAudio.ts\");\n/* harmony import */ var _Util_Toaster__WEBPACK_IMPORTED_MODULE_55__ = __webpack_require__(/*! ./Util/Toaster */ \"./Util/Toaster.ts\");\n/* harmony import */ var _Util_StateMachine__WEBPACK_IMPORTED_MODULE_56__ = __webpack_require__(/*! ./Util/StateMachine */ \"./Util/StateMachine.ts\");\n/* harmony import */ var _Util_Future__WEBPACK_IMPORTED_MODULE_57__ = __webpack_require__(/*! ./Util/Future */ \"./Util/Future.ts\");\n/* harmony import */ var _Util_Semaphore__WEBPACK_IMPORTED_MODULE_58__ = __webpack_require__(/*! ./Util/Semaphore */ \"./Util/Semaphore.ts\");\n/* harmony import */ var _Util_Coroutine__WEBPACK_IMPORTED_MODULE_59__ = __webpack_require__(/*! ./Util/Coroutine */ \"./Util/Coroutine.ts\");\n/* harmony import */ var _Util_Assert__WEBPACK_IMPORTED_MODULE_60__ = __webpack_require__(/*! ./Util/Assert */ \"./Util/Assert.ts\");\n/**\n * The current Excalibur version string\n * @description `process.env.__EX_VERSION` gets replaced by Webpack on build\n */\nconst EX_VERSION = \"0.30.1\";\n\n(0,_Polyfill__WEBPACK_IMPORTED_MODULE_0__.polyfill)();\n// This file is used as the bundle entry point and exports everything\n// that will be exposed as the `ex` global variable.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// ex.Events namespace\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// ex.Util namespaces\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// ex.Deprecated\n// import * as deprecated from './Deprecated';\n// export { deprecated as Deprecated };\n// export * from './Deprecated';\n\n\n/***/ }),\n\n/***/ \"./Director/Loader.logo.png\":\n/*!**********************************!*\\\n !*** ./Director/Loader.logo.png ***!\n \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAdQAAAB2CAYAAABxhGI9AAAACXBIWXMAAAsSAAALEgHS3X78AAAKnUlEQVR42u3dP2wjSx0H8N8hJIonIRmJjsq0SBR+BQ1dcqKhe0lD77SvSwpKkJKGPulpktfRIMUdEqKIqV57rpAokM4dbSiyq7ONPTP7x39ifz7SFbnEnp3xer47O7uzH15fXwMA6OYHmgAABCoACFQAEKgAgEAFAIEKAAIVAAQqACBQAUCgAoBABQCBCgAIVAAQqAAgUAFAoAIAAhUABCoACFQAEKgAgECFLbmOiNeFf2PbAyz68Pr6qhUgbRwR92v+/zwiJrYHMEKFMmcN///UtgcQqFBk1PD/97U9Qx8VCFSgu4EmAIEKAAIVAAQqACBQ4Z25jojP8eX+0WtNAgIVaOY+Im5j+eKh24h41jQgUIEyZ7F5NaPU7wCBCiwYd/w9cOB+qAlgJ3KLLow0EV198803RWvJfvfddx+0lhEqHKu5JgAjVCBvlhmFzjQRXUekHz9+TP79y8uLRjNChXfvoePvAYEKxNtj1e42/O5JoIJABcrdRMRVLM+X3kTEpaaB988cKuzWg9EobTWdMx0Oly8uN4dqhAoARqgnaN3arHfqu7OyH8ItKLVB/P+CEfMTHyGPY3npx1m8zWGDEeoBfUk/xdti57dr/r1Wv2+6EPow3tZ5rRdS72s1neuF97xvWd+XTH0/V+UMttDWqbI/r2nrxfp+jv2uSjSO7S+OXy/A/3lN+9xX5T5HxEUPZZ0tfB71+w57eJ/HFu+z+jkv1u92YX9fbI/HhX3JA9rp5MPr66tWaG9UfUGbrHIzi7cLUyYFf/tpTady03EEeL8mUJ6i7MKYNvWNqr4Pe2jradXO60LrvPAz2PQ5RPX684ah8dxD+2zantnCgVipSVV+m/tgB9W2DDq2Sx/vM95wcHhZhWVJm8yrv58cSgfTdc70+++/X/r522+/tUKSEepBqo+om4ZLPerMjUwuNnQCtx1GWJtee1FwdD5uWd86xLs8UaVt2aNEO1/saZ/Z5rYMW4zq6v34rGV9Bg3q2eZ9SkeNm9qwyUh30OPIHYFKx5FG03C7znSOqYBq+qW/zpQ3anH037TNHluG6f0WPsPhHvab4QFty7ogOeuxDYcNy2/zu2214WNYWxmBurNO8bGn97pNBOO8xy/9uCorZZ4I2r4C7aJgO7ZV9iE49Dm6NvOWx+pWE9CUq3zbdTp9doz38TbXtzqH9RT5CyWe422OaZoZGeZCabrhPQY9HjwsjpTvCg4YtlE2+Ta/j2bzn8fqrDqgm+6yUHOmAvWUjAtGhbNYvsBknDnqH1Qhc7VmxHgeb/NbudA5j/UXlYwif2p6luhAc9teu1npiHKnDs8if6tCm7JLX3NKpgttXe9ruc9mHMd7a83iwdxF5vt8tutARaCeklRnNK9C8WnNF7geJQ4T4XG3JhSnVdilQrG+yOnrlVHfsEGYzhNBn7Lu6tS7+HJafJQ4EMiNlNqWXZ9WPvVgnVYHG5M1ByDXkT6leX2EgTqJtyt45yv7S2qO3sEZjZhDLXeR+YKdJ0Zdk8QocvH9N732KrNtq+FZ/zzIHABcJrYpd+Xv14lOd5ap76SgrduW/VTQ1qcQpqnbgu4ifZvUMNpd9XuoZmvCtPaQ2Y/BCHVLgbrJTeRPDdVf6pfMKDU2fOkHmVFFfXr3MsouLsnNvV5kRoe5+s431PeuoKPqWnaurY/ZPBEeqwceN4l96iwO6H7Mjq4y7VGPVNe10VaZMzVCPVWpI/Z6FZbcv5fMqGCU+dLfFGzj58jP8+bCdJCo7yzKTwdOF0bu9Ug7V4c+yz7FJfYeGoysUss0HssIdVZwYLDujMqlESoCdTtGsZtbHnJBeNdDSJSs0jTKdMJN1HNX54Wv7bvsU9NkVJVa13dX+/wuArV0X/l5RHyo/lnfF4G6p6DrS0kHdtXhy35TGErDPYZUn2WfWqDOo/lVqdMD2O/hKJhD7S/odukymq9s02QN4EEPR/zbaOumZc+r15zK1Zqznl9jsfiemTM1QmV3HUuTkedlg9HIQzRbUD93dfC+2tpj2fIHEH2+RqCCQH13gZq7hWXTNpVu19OB1fc9nQ0AKOKUb5lU0P1kDyOneoWk0lOZ9cIP0x7qu8+2BhCoR2wYu1+e7DmaXzBSsu5vaX1ne2zrpmUPTmxf7PM1Dm4y/vC7ny7Nif7+z/9ZmtM0Z3panPLtPmra9f16bcK0Dpbnwk43Vd/RHtu6zfNQTy1QBy3aqG2g9nVmxml+BOoJyT3NpWmn9xhfFnu4bvDa+44BXhqqfdf3uUF9+yz77AT31Yue2mjecYQ62NLfgkA9ghHqLNEhNem4H1c6vdyDxhf/bpz5m4coW/c39wi6VH2bPtHlcaV9cvXts+zxCe6rTeqc2ndL7uGd93QwM9bFcAzMoZZ7SgTBbWx+asui61h/iq1+RmjqdbnQXQ3T1DNQ63V/U9ucqm/pMzPb1rePsk/1iTOjgvatR4W3Lc8ULB78pELyrnAfeTcj1NU509/86mfJ33/8+Mf00a05UyPUEw7UVCeWG/WNEiExyHRMt5ltW30izUPk18ytt7lNfc8i//DvtvXto+ySA5BjljsLUF8lPkqMPEtW1JomDsiGBZ9Byb4NAvUITSN9GuwsIj6t6UTOqk7jJREkmzqli8xIs96udSO20sX0H1vW92IL9e1a9rgqVyf91gbPsTy9UD9n9lOkT8k+RfkFR5PMNqxOcdSf32PBvg3vilO+zdxE+okx9Wm0ph36XYsRZCpMF993GOk5qvqB3Dct6jvssb67KvuUNJ3frw92bhr8/STSF0JdRPMLpUCgnsgo9S76PZ246ZFk1wWvK5m3vVoYvW1Sz7nN91jfXbQ1ZQc7TW6HeaoOalypG/8/p/rP1aNAc6ZHzSnfdqPUPhdy2PQw6Nz9gSVhuhiqueUHR3uu7y7K3rdDX4u46ZrPbUa0IFBZ0seKQ3XQTRt2vm3W/a2DbNKys++rvm3ep6+y1x2UdP3bWU9lzra47U1GmlctX/sQ23t+aOlByLTh/4NAPaCRxtcdO5HLSJ/6vNtCwGx67VPmPbvWd1q9frKHtp4kAqRJ2HR9j762JfX3bZ//elPtj13PPDx1+D5tqk/Xi6NO8SHz7MmH19dXrdBNfVFP6T2PT1UHNit87/t4m5+aRH+nQBdvqyhZDKJLfZs8h7XPsqdV2ZOV+tanKB8aln0dyxdAXbV4j4gvt4oMOrbP6vbU73NW7TMlbdTnPrWpfqXfh9HKZ9vke7KuTeZRNtXRSe6+1FV//ce/ln5eXfsXgcqXzr6+9261M3moOoa7E6nvTZTfy7iNsmfb7kjfgXGsvxe0vihsEts9HTquPpt1q1vtahu2TqAiUAEEKj0zhwoARqgAu/OnX/442WH+9xc/Wvr58re/Tr7f41/+ZsRqhAoACFQAEKgAcHjMoQJskJsz/eqrr5Z+vvr7v5fmQFevAl5lztQIFQAQqAAgUAHgIJlDBdhgdQ41N2eKESoAIFABQKACwFEwhwoARqgAIFABQKACAAIVAAQqAAhUABCoAIBABQCBCgACFQAEKgAgUAFAoAKAQAUAgQoACFQAEKgAIFABQKACAAIVAAQqAAhUABCoAIBABQCBCgACFQAQqAAgUAFAoAKAQAUAlvwPcFDns1DsH4sAAAAASUVORK5CYII=\");\n\n/***/ }),\n\n/***/ \"./Graphics/Context/debug-font.png\":\n/*!*****************************************!*\\\n !*** ./Graphics/Context/debug-font.png ***!\n \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAABACAYAAAD1Xam+AAAAAXNSR0IArs4c6QAABlFJREFUeJztndmy4yoMRcWt/v9fdr8EWoDAaDD4JntVpeqcxBrMIGQDNhEAAAAAAAAAAAAAAOCrSbMfr+u6yoEpTY+906GV57YtPkjyXj9WZZ+wHWHfo2N3/bU6Tte9Rv6ptruqRyMvKvvIX/zY3I/vjLeqsg6l/CWdp0KHKO/1Y1H2EdsR9j06Ntdfp+N03SvkH2u7i3pu5XkQ+DNTkgNJSok+/183xpcdWZHjgUzpQ2pGD67vaf//KRAGAq3tdhCy2tcMQKPyXyz7iPqrdBjbX5h9g7xbtvWf4ZJvM4D/BKG24Sd+IkQ0TC9aW5NM5FbO2HgrPVzW2vmN50DZNv/QWtl5bfPy85SBtdy9dFmjsf2F2SehTBVE+u+tkE5+lAGcJlFwGuodwRRU2Qe3rx0FhPNflc3HWC7BEh8EDGVR5IMCiLnDONtPp87qhxVH/S/LvzUAuDs/kyGimA5oSONKR1w8vsLpv+v+S9vhmS71JRiX1xB5CWZNw7m6rMrllMag/RJyWb67BEgpDVMWSydc+K47pr35w05kWd7ReEq6116KaG4CsbJ7OmV9PdZLEKkONiC1/7ZONVgDsajLIJPYp2OUAXRpnPcGmnIE6eSK4nv5YQqqSYO52JqnYfYj/PdQXQIY7XszuMofMgZRT/1LdeC5h2I5/0EdWDMY2Yb05WDE1RodVdpSA5r85slArAVnSf+89iP896St0f5bZKVA7Gk/3ja8q+152/+wrLqBWZTem3IBADbRBoDuHgAA4HdAAADgh0EAAOCHQQAA4IdBAADgh0EAAOCHuVsKbJ3P9M7jjuxHzGfv8j9iDt47Dx7hP8cjq5F/o/0T62Aer//ZOgDrajBp6aNlOWTEajKLjgj/Pcs/vfZD/a++3Pc8hNfZ966EVeh5vP75luDRJUAl0KzJfnopaqbaTuzZiulc2BS5lltFXntu3dcQsXadl59Wn1H+dfYNtrt2d6D/LDF9HkCQw6eXFbr8P9X5W/un5Ol8gz1t39p5pWOPn0vLynbgdnfe8maEQw+UIPJdfxdOd/4oTtVD0IYg8wDywGas0I04T5O3P8/qf2UWwPpkn1PbOT1bN2tFe59EM7TvKf+TRFw+erZ2ey4hpS3hp9qBkqq/tjsSU1OYqucBWB1yynt5QxC42Mdk30pAEIio//zRG3feBzLUX+TTjCKwlH83aI/KbpQBVEHgUGF0j/SitcLofHem8q6AyH0wBhFv4WszuOjy0yK2vc/oRWQoP2X9ve78jfaLnpncbBqQSC6s0HnIRT0a2yNZjfxT8+ir8t+yDsDTWaS6X70GP33+d77stp+I5HtBdwEAAPBl8ECApcAA/DBvfSowAGAB7/05ZAAA/DAIAADMMU3fOuS2ggAAwBjrorKoxWiPBxHMAgAg490Ts0VeePdA+ZfJDKcCh7sBqY88mmjklZeOt9iXPrvx2I2QPRnN2/qzyJ84h4gNcbtfasq5mM1rZr+bBWh2A+bIIX13Z9wqL+nQvFno7v3oq4tJItCed7isUT6C/I7BUn9KP95wDicYBYpcjncrO2c/dmW4tBtw4RiRld1IDxDyYsoXMHxF1w3dyz0Nne8033AOFsT6VgRCafl89fenTZUfbm8CGhrgdDcS7anAsvnkkP0IeCfQ+JzYunky6jhNYj5bl7++4fJvN9WDSKS/292A0wyANyKDI91bfkm3kcH7ckaP/SKW/VHKRZAcI14pP3beu0fPyn/DuZQbWMogNnsc16sziE96f7H/iai7uTf0/3N8lwFz/e13T00Djt4OrInCnkeChXT+qOcKOLA21tJpsv/G8/COnGnw97J9QwbTvd6djYSv7fxEVTuV/LzNhj7nOawv6bfbAGCYEpQ6HxFtuxs6sq9tzOYHobQ6Nje+6vo5BwFrPZ4OgMayS4PPt1NlzdLfbRCYBoBc+NaO4JWPwLEf33oN3unY3InKPQBW6Z7nEZzEmrl4iZjC804lqgePPEOguQcwWghUphxm343wyt/pWpWR0OrR+jvyxavHajfb9pTjbt9bH07Z5/expM4TLWfwb7QQqMoC+UDWXZo/4RgA38LOgUvLJAAQ1Td9y9//0ylxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+g79apuVUsS5ZmwAAAABJRU5ErkJggg==\");\n\n/***/ })\n\n/******/ });\n/************************************************************************/\n/******/ // The module cache\n/******/ var __webpack_module_cache__ = {};\n/******/ \n/******/ // The require function\n/******/ function __webpack_require__(moduleId) {\n/******/ \t// Check if module is in cache\n/******/ \tvar cachedModule = __webpack_module_cache__[moduleId];\n/******/ \tif (cachedModule !== undefined) {\n/******/ \t\treturn cachedModule.exports;\n/******/ \t}\n/******/ \t// Create a new module (and put it into the cache)\n/******/ \tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\tid: moduleId,\n/******/ \t\t// no module.loaded needed\n/******/ \t\texports: {}\n/******/ \t};\n/******/ \n/******/ \t// Execute the module function\n/******/ \t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/ \n/******/ \t// Return the exports of the module\n/******/ \treturn module.exports;\n/******/ }\n/******/ \n/************************************************************************/\n/******/ /* webpack/runtime/compat get default export */\n/******/ (() => {\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = (module) => {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t() => (module['default']) :\n/******/ \t\t\t() => (module);\n/******/ \t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\treturn getter;\n/******/ \t};\n/******/ })();\n/******/ \n/******/ /* webpack/runtime/define property getters */\n/******/ (() => {\n/******/ \t// define getter functions for harmony exports\n/******/ \t__webpack_require__.d = (exports, definition) => {\n/******/ \t\tfor(var key in definition) {\n/******/ \t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t}\n/******/ \t\t}\n/******/ \t};\n/******/ })();\n/******/ \n/******/ /* webpack/runtime/hasOwnProperty shorthand */\n/******/ (() => {\n/******/ \t__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))\n/******/ })();\n/******/ \n/******/ /* webpack/runtime/make namespace object */\n/******/ (() => {\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = (exports) => {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/ })();\n/******/ \n/************************************************************************/\n/******/ \n/******/ // startup\n/******/ // Load entry module and return exports\n/******/ // This entry module is referenced by other modules so it can't be inlined\n/******/ var __webpack_exports__ = __webpack_require__(\"./index.ts\");\n/******/ var __webpack_exports__ActionCompleteEvent = __webpack_exports__.ActionCompleteEvent;\n/******/ var __webpack_exports__ActionContext = __webpack_exports__.ActionContext;\n/******/ var __webpack_exports__ActionQueue = __webpack_exports__.ActionQueue;\n/******/ var __webpack_exports__ActionSequence = __webpack_exports__.ActionSequence;\n/******/ var __webpack_exports__ActionStartEvent = __webpack_exports__.ActionStartEvent;\n/******/ var __webpack_exports__ActionsComponent = __webpack_exports__.ActionsComponent;\n/******/ var __webpack_exports__ActionsSystem = __webpack_exports__.ActionsSystem;\n/******/ var __webpack_exports__ActivateEvent = __webpack_exports__.ActivateEvent;\n/******/ var __webpack_exports__Actor = __webpack_exports__.Actor;\n/******/ var __webpack_exports__ActorEvents = __webpack_exports__.ActorEvents;\n/******/ var __webpack_exports__AddEvent = __webpack_exports__.AddEvent;\n/******/ var __webpack_exports__AddedComponent = __webpack_exports__.AddedComponent;\n/******/ var __webpack_exports__AffineMatrix = __webpack_exports__.AffineMatrix;\n/******/ var __webpack_exports__Animation = __webpack_exports__.Animation;\n/******/ var __webpack_exports__AnimationDirection = __webpack_exports__.AnimationDirection;\n/******/ var __webpack_exports__AnimationEvents = __webpack_exports__.AnimationEvents;\n/******/ var __webpack_exports__AnimationStrategy = __webpack_exports__.AnimationStrategy;\n/******/ var __webpack_exports__ArcadeSolver = __webpack_exports__.ArcadeSolver;\n/******/ var __webpack_exports__AudioContextFactory = __webpack_exports__.AudioContextFactory;\n/******/ var __webpack_exports__Axes = __webpack_exports__.Axes;\n/******/ var __webpack_exports__Axis = __webpack_exports__.Axis;\n/******/ var __webpack_exports__BaseAlign = __webpack_exports__.BaseAlign;\n/******/ var __webpack_exports__BezierCurve = __webpack_exports__.BezierCurve;\n/******/ var __webpack_exports__Blink = __webpack_exports__.Blink;\n/******/ var __webpack_exports__BodyComponent = __webpack_exports__.BodyComponent;\n/******/ var __webpack_exports__BoundingBox = __webpack_exports__.BoundingBox;\n/******/ var __webpack_exports__BrowserComponent = __webpack_exports__.BrowserComponent;\n/******/ var __webpack_exports__BrowserEvents = __webpack_exports__.BrowserEvents;\n/******/ var __webpack_exports__Buttons = __webpack_exports__.Buttons;\n/******/ var __webpack_exports__Camera = __webpack_exports__.Camera;\n/******/ var __webpack_exports__CameraEvents = __webpack_exports__.CameraEvents;\n/******/ var __webpack_exports__Canvas = __webpack_exports__.Canvas;\n/******/ var __webpack_exports__Circle = __webpack_exports__.Circle;\n/******/ var __webpack_exports__CircleCollider = __webpack_exports__.CircleCollider;\n/******/ var __webpack_exports__Clock = __webpack_exports__.Clock;\n/******/ var __webpack_exports__ClosestLineJumpTable = __webpack_exports__.ClosestLineJumpTable;\n/******/ var __webpack_exports__Collider = __webpack_exports__.Collider;\n/******/ var __webpack_exports__ColliderComponent = __webpack_exports__.ColliderComponent;\n/******/ var __webpack_exports__CollisionContact = __webpack_exports__.CollisionContact;\n/******/ var __webpack_exports__CollisionEndEvent = __webpack_exports__.CollisionEndEvent;\n/******/ var __webpack_exports__CollisionGroup = __webpack_exports__.CollisionGroup;\n/******/ var __webpack_exports__CollisionGroupManager = __webpack_exports__.CollisionGroupManager;\n/******/ var __webpack_exports__CollisionJumpTable = __webpack_exports__.CollisionJumpTable;\n/******/ var __webpack_exports__CollisionPostSolveEvent = __webpack_exports__.CollisionPostSolveEvent;\n/******/ var __webpack_exports__CollisionPreSolveEvent = __webpack_exports__.CollisionPreSolveEvent;\n/******/ var __webpack_exports__CollisionStartEvent = __webpack_exports__.CollisionStartEvent;\n/******/ var __webpack_exports__CollisionSystem = __webpack_exports__.CollisionSystem;\n/******/ var __webpack_exports__CollisionType = __webpack_exports__.CollisionType;\n/******/ var __webpack_exports__Color = __webpack_exports__.Color;\n/******/ var __webpack_exports__ColorBlindFlags = __webpack_exports__.ColorBlindFlags;\n/******/ var __webpack_exports__ColorBlindnessMode = __webpack_exports__.ColorBlindnessMode;\n/******/ var __webpack_exports__ColorBlindnessPostProcessor = __webpack_exports__.ColorBlindnessPostProcessor;\n/******/ var __webpack_exports__Component = __webpack_exports__.Component;\n/******/ var __webpack_exports__CompositeCollider = __webpack_exports__.CompositeCollider;\n/******/ var __webpack_exports__ConsoleAppender = __webpack_exports__.ConsoleAppender;\n/******/ var __webpack_exports__ContactConstraintPoint = __webpack_exports__.ContactConstraintPoint;\n/******/ var __webpack_exports__ContactEndEvent = __webpack_exports__.ContactEndEvent;\n/******/ var __webpack_exports__ContactSolveBias = __webpack_exports__.ContactSolveBias;\n/******/ var __webpack_exports__ContactStartEvent = __webpack_exports__.ContactStartEvent;\n/******/ var __webpack_exports__CoordPlane = __webpack_exports__.CoordPlane;\n/******/ var __webpack_exports__CrossFade = __webpack_exports__.CrossFade;\n/******/ var __webpack_exports__CurveBy = __webpack_exports__.CurveBy;\n/******/ var __webpack_exports__CurveTo = __webpack_exports__.CurveTo;\n/******/ var __webpack_exports__DeactivateEvent = __webpack_exports__.DeactivateEvent;\n/******/ var __webpack_exports__Debug = __webpack_exports__.Debug;\n/******/ var __webpack_exports__DebugConfig = __webpack_exports__.DebugConfig;\n/******/ var __webpack_exports__DebugGraphicsComponent = __webpack_exports__.DebugGraphicsComponent;\n/******/ var __webpack_exports__DebugSystem = __webpack_exports__.DebugSystem;\n/******/ var __webpack_exports__DebugText = __webpack_exports__.DebugText;\n/******/ var __webpack_exports__DefaultAntialiasOptions = __webpack_exports__.DefaultAntialiasOptions;\n/******/ var __webpack_exports__DefaultGarbageCollectionOptions = __webpack_exports__.DefaultGarbageCollectionOptions;\n/******/ var __webpack_exports__DefaultLoader = __webpack_exports__.DefaultLoader;\n/******/ var __webpack_exports__DefaultPixelArtOptions = __webpack_exports__.DefaultPixelArtOptions;\n/******/ var __webpack_exports__DegreeOfFreedom = __webpack_exports__.DegreeOfFreedom;\n/******/ var __webpack_exports__Delay = __webpack_exports__.Delay;\n/******/ var __webpack_exports__Detector = __webpack_exports__.Detector;\n/******/ var __webpack_exports__Die = __webpack_exports__.Die;\n/******/ var __webpack_exports__Direction = __webpack_exports__.Direction;\n/******/ var __webpack_exports__Director = __webpack_exports__.Director;\n/******/ var __webpack_exports__DirectorEvents = __webpack_exports__.DirectorEvents;\n/******/ var __webpack_exports__DisplayMode = __webpack_exports__.DisplayMode;\n/******/ var __webpack_exports__DynamicTree = __webpack_exports__.DynamicTree;\n/******/ var __webpack_exports__DynamicTreeCollisionProcessor = __webpack_exports__.DynamicTreeCollisionProcessor;\n/******/ var __webpack_exports__EX_VERSION = __webpack_exports__.EX_VERSION;\n/******/ var __webpack_exports__EaseBy = __webpack_exports__.EaseBy;\n/******/ var __webpack_exports__EaseTo = __webpack_exports__.EaseTo;\n/******/ var __webpack_exports__EasingFunctions = __webpack_exports__.EasingFunctions;\n/******/ var __webpack_exports__EdgeCollider = __webpack_exports__.EdgeCollider;\n/******/ var __webpack_exports__ElasticToActorStrategy = __webpack_exports__.ElasticToActorStrategy;\n/******/ var __webpack_exports__EmitterType = __webpack_exports__.EmitterType;\n/******/ var __webpack_exports__Engine = __webpack_exports__.Engine;\n/******/ var __webpack_exports__EngineEvents = __webpack_exports__.EngineEvents;\n/******/ var __webpack_exports__EnterTriggerEvent = __webpack_exports__.EnterTriggerEvent;\n/******/ var __webpack_exports__EnterViewPortEvent = __webpack_exports__.EnterViewPortEvent;\n/******/ var __webpack_exports__Entity = __webpack_exports__.Entity;\n/******/ var __webpack_exports__EntityEvents = __webpack_exports__.EntityEvents;\n/******/ var __webpack_exports__EntityManager = __webpack_exports__.EntityManager;\n/******/ var __webpack_exports__EventEmitter = __webpack_exports__.EventEmitter;\n/******/ var __webpack_exports__EventTypes = __webpack_exports__.EventTypes;\n/******/ var __webpack_exports__Events = __webpack_exports__.Events;\n/******/ var __webpack_exports__ExResponse = __webpack_exports__.ExResponse;\n/******/ var __webpack_exports__ExcaliburGraphicsContext2DCanvas = __webpack_exports__.ExcaliburGraphicsContext2DCanvas;\n/******/ var __webpack_exports__ExcaliburGraphicsContextWebGL = __webpack_exports__.ExcaliburGraphicsContextWebGL;\n/******/ var __webpack_exports__ExitTriggerEvent = __webpack_exports__.ExitTriggerEvent;\n/******/ var __webpack_exports__ExitViewPortEvent = __webpack_exports__.ExitViewPortEvent;\n/******/ var __webpack_exports__Fade = __webpack_exports__.Fade;\n/******/ var __webpack_exports__FadeInOut = __webpack_exports__.FadeInOut;\n/******/ var __webpack_exports__Flags = __webpack_exports__.Flags;\n/******/ var __webpack_exports__Flash = __webpack_exports__.Flash;\n/******/ var __webpack_exports__Follow = __webpack_exports__.Follow;\n/******/ var __webpack_exports__Font = __webpack_exports__.Font;\n/******/ var __webpack_exports__FontCache = __webpack_exports__.FontCache;\n/******/ var __webpack_exports__FontSource = __webpack_exports__.FontSource;\n/******/ var __webpack_exports__FontStyle = __webpack_exports__.FontStyle;\n/******/ var __webpack_exports__FontUnit = __webpack_exports__.FontUnit;\n/******/ var __webpack_exports__FpsSampler = __webpack_exports__.FpsSampler;\n/******/ var __webpack_exports__FrameStats = __webpack_exports__.FrameStats;\n/******/ var __webpack_exports__Future = __webpack_exports__.Future;\n/******/ var __webpack_exports__GameEvent = __webpack_exports__.GameEvent;\n/******/ var __webpack_exports__GameStartEvent = __webpack_exports__.GameStartEvent;\n/******/ var __webpack_exports__GameStopEvent = __webpack_exports__.GameStopEvent;\n/******/ var __webpack_exports__Gamepad = __webpack_exports__.Gamepad;\n/******/ var __webpack_exports__GamepadAxisEvent = __webpack_exports__.GamepadAxisEvent;\n/******/ var __webpack_exports__GamepadButtonEvent = __webpack_exports__.GamepadButtonEvent;\n/******/ var __webpack_exports__GamepadConnectEvent = __webpack_exports__.GamepadConnectEvent;\n/******/ var __webpack_exports__GamepadDisconnectEvent = __webpack_exports__.GamepadDisconnectEvent;\n/******/ var __webpack_exports__Gamepads = __webpack_exports__.Gamepads;\n/******/ var __webpack_exports__GarbageCollector = __webpack_exports__.GarbageCollector;\n/******/ var __webpack_exports__Gif = __webpack_exports__.Gif;\n/******/ var __webpack_exports__GifParser = __webpack_exports__.GifParser;\n/******/ var __webpack_exports__GlobalCoordinates = __webpack_exports__.GlobalCoordinates;\n/******/ var __webpack_exports__GpuParticleEmitter = __webpack_exports__.GpuParticleEmitter;\n/******/ var __webpack_exports__GpuParticleRenderer = __webpack_exports__.GpuParticleRenderer;\n/******/ var __webpack_exports__Graphic = __webpack_exports__.Graphic;\n/******/ var __webpack_exports__GraphicsComponent = __webpack_exports__.GraphicsComponent;\n/******/ var __webpack_exports__GraphicsGroup = __webpack_exports__.GraphicsGroup;\n/******/ var __webpack_exports__GraphicsSystem = __webpack_exports__.GraphicsSystem;\n/******/ var __webpack_exports__HashColliderProxy = __webpack_exports__.HashColliderProxy;\n/******/ var __webpack_exports__HashGridCell = __webpack_exports__.HashGridCell;\n/******/ var __webpack_exports__HashGridProxy = __webpack_exports__.HashGridProxy;\n/******/ var __webpack_exports__HiddenEvent = __webpack_exports__.HiddenEvent;\n/******/ var __webpack_exports__HorizontalFirst = __webpack_exports__.HorizontalFirst;\n/******/ var __webpack_exports__ImageFiltering = __webpack_exports__.ImageFiltering;\n/******/ var __webpack_exports__ImageSource = __webpack_exports__.ImageSource;\n/******/ var __webpack_exports__ImageSourceAttributeConstants = __webpack_exports__.ImageSourceAttributeConstants;\n/******/ var __webpack_exports__ImageWrapping = __webpack_exports__.ImageWrapping;\n/******/ var __webpack_exports__InitializeEvent = __webpack_exports__.InitializeEvent;\n/******/ var __webpack_exports__InputHost = __webpack_exports__.InputHost;\n/******/ var __webpack_exports__InputMapper = __webpack_exports__.InputMapper;\n/******/ var __webpack_exports__IsometricEntityComponent = __webpack_exports__.IsometricEntityComponent;\n/******/ var __webpack_exports__IsometricEntitySystem = __webpack_exports__.IsometricEntitySystem;\n/******/ var __webpack_exports__IsometricMap = __webpack_exports__.IsometricMap;\n/******/ var __webpack_exports__IsometricTile = __webpack_exports__.IsometricTile;\n/******/ var __webpack_exports__KeyEvent = __webpack_exports__.KeyEvent;\n/******/ var __webpack_exports__Keyboard = __webpack_exports__.Keyboard;\n/******/ var __webpack_exports__Keys = __webpack_exports__.Keys;\n/******/ var __webpack_exports__KillEvent = __webpack_exports__.KillEvent;\n/******/ var __webpack_exports__Label = __webpack_exports__.Label;\n/******/ var __webpack_exports__LimitCameraBoundsStrategy = __webpack_exports__.LimitCameraBoundsStrategy;\n/******/ var __webpack_exports__Line = __webpack_exports__.Line;\n/******/ var __webpack_exports__LineSegment = __webpack_exports__.LineSegment;\n/******/ var __webpack_exports__Loader = __webpack_exports__.Loader;\n/******/ var __webpack_exports__LoaderEvents = __webpack_exports__.LoaderEvents;\n/******/ var __webpack_exports__LockCameraToActorAxisStrategy = __webpack_exports__.LockCameraToActorAxisStrategy;\n/******/ var __webpack_exports__LockCameraToActorStrategy = __webpack_exports__.LockCameraToActorStrategy;\n/******/ var __webpack_exports__LogLevel = __webpack_exports__.LogLevel;\n/******/ var __webpack_exports__Logger = __webpack_exports__.Logger;\n/******/ var __webpack_exports__Material = __webpack_exports__.Material;\n/******/ var __webpack_exports__Matrix = __webpack_exports__.Matrix;\n/******/ var __webpack_exports__MatrixLocations = __webpack_exports__.MatrixLocations;\n/******/ var __webpack_exports__MediaEvent = __webpack_exports__.MediaEvent;\n/******/ var __webpack_exports__Meet = __webpack_exports__.Meet;\n/******/ var __webpack_exports__MotionComponent = __webpack_exports__.MotionComponent;\n/******/ var __webpack_exports__MotionSystem = __webpack_exports__.MotionSystem;\n/******/ var __webpack_exports__MoveBy = __webpack_exports__.MoveBy;\n/******/ var __webpack_exports__MoveByWithOptions = __webpack_exports__.MoveByWithOptions;\n/******/ var __webpack_exports__MoveTo = __webpack_exports__.MoveTo;\n/******/ var __webpack_exports__MoveToWithOptions = __webpack_exports__.MoveToWithOptions;\n/******/ var __webpack_exports__NativePointerButton = __webpack_exports__.NativePointerButton;\n/******/ var __webpack_exports__NativeSoundEvent = __webpack_exports__.NativeSoundEvent;\n/******/ var __webpack_exports__NativeSoundProcessedEvent = __webpack_exports__.NativeSoundProcessedEvent;\n/******/ var __webpack_exports__NineSlice = __webpack_exports__.NineSlice;\n/******/ var __webpack_exports__NineSliceStretch = __webpack_exports__.NineSliceStretch;\n/******/ var __webpack_exports__None = __webpack_exports__.None;\n/******/ var __webpack_exports__Observable = __webpack_exports__.Observable;\n/******/ var __webpack_exports__OffscreenSystem = __webpack_exports__.OffscreenSystem;\n/******/ var __webpack_exports__Pair = __webpack_exports__.Pair;\n/******/ var __webpack_exports__ParallaxComponent = __webpack_exports__.ParallaxComponent;\n/******/ var __webpack_exports__ParallelActions = __webpack_exports__.ParallelActions;\n/******/ var __webpack_exports__Particle = __webpack_exports__.Particle;\n/******/ var __webpack_exports__ParticleEmitter = __webpack_exports__.ParticleEmitter;\n/******/ var __webpack_exports__ParticleRenderer = __webpack_exports__.ParticleRenderer;\n/******/ var __webpack_exports__ParticleTransform = __webpack_exports__.ParticleTransform;\n/******/ var __webpack_exports__PhysicsStats = __webpack_exports__.PhysicsStats;\n/******/ var __webpack_exports__PhysicsWorld = __webpack_exports__.PhysicsWorld;\n/******/ var __webpack_exports__PointerAbstraction = __webpack_exports__.PointerAbstraction;\n/******/ var __webpack_exports__PointerButton = __webpack_exports__.PointerButton;\n/******/ var __webpack_exports__PointerComponent = __webpack_exports__.PointerComponent;\n/******/ var __webpack_exports__PointerEvent = __webpack_exports__.PointerEvent;\n/******/ var __webpack_exports__PointerEventReceiver = __webpack_exports__.PointerEventReceiver;\n/******/ var __webpack_exports__PointerScope = __webpack_exports__.PointerScope;\n/******/ var __webpack_exports__PointerSystem = __webpack_exports__.PointerSystem;\n/******/ var __webpack_exports__PointerType = __webpack_exports__.PointerType;\n/******/ var __webpack_exports__Polygon = __webpack_exports__.Polygon;\n/******/ var __webpack_exports__PolygonCollider = __webpack_exports__.PolygonCollider;\n/******/ var __webpack_exports__Pool = __webpack_exports__.Pool;\n/******/ var __webpack_exports__PostCollisionEvent = __webpack_exports__.PostCollisionEvent;\n/******/ var __webpack_exports__PostDebugDrawEvent = __webpack_exports__.PostDebugDrawEvent;\n/******/ var __webpack_exports__PostDrawEvent = __webpack_exports__.PostDrawEvent;\n/******/ var __webpack_exports__PostFrameEvent = __webpack_exports__.PostFrameEvent;\n/******/ var __webpack_exports__PostKillEvent = __webpack_exports__.PostKillEvent;\n/******/ var __webpack_exports__PostTransformDrawEvent = __webpack_exports__.PostTransformDrawEvent;\n/******/ var __webpack_exports__PostUpdateEvent = __webpack_exports__.PostUpdateEvent;\n/******/ var __webpack_exports__PreCollisionEvent = __webpack_exports__.PreCollisionEvent;\n/******/ var __webpack_exports__PreDebugDrawEvent = __webpack_exports__.PreDebugDrawEvent;\n/******/ var __webpack_exports__PreDrawEvent = __webpack_exports__.PreDrawEvent;\n/******/ var __webpack_exports__PreFrameEvent = __webpack_exports__.PreFrameEvent;\n/******/ var __webpack_exports__PreKillEvent = __webpack_exports__.PreKillEvent;\n/******/ var __webpack_exports__PreLoadEvent = __webpack_exports__.PreLoadEvent;\n/******/ var __webpack_exports__PreTransformDrawEvent = __webpack_exports__.PreTransformDrawEvent;\n/******/ var __webpack_exports__PreUpdateEvent = __webpack_exports__.PreUpdateEvent;\n/******/ var __webpack_exports__Projection = __webpack_exports__.Projection;\n/******/ var __webpack_exports__QuadIndexBuffer = __webpack_exports__.QuadIndexBuffer;\n/******/ var __webpack_exports__QuadTree = __webpack_exports__.QuadTree;\n/******/ var __webpack_exports__Query = __webpack_exports__.Query;\n/******/ var __webpack_exports__QueryManager = __webpack_exports__.QueryManager;\n/******/ var __webpack_exports__RadiusAroundActorStrategy = __webpack_exports__.RadiusAroundActorStrategy;\n/******/ var __webpack_exports__Random = __webpack_exports__.Random;\n/******/ var __webpack_exports__Raster = __webpack_exports__.Raster;\n/******/ var __webpack_exports__Ray = __webpack_exports__.Ray;\n/******/ var __webpack_exports__RealisticSolver = __webpack_exports__.RealisticSolver;\n/******/ var __webpack_exports__Rectangle = __webpack_exports__.Rectangle;\n/******/ var __webpack_exports__RemoveEvent = __webpack_exports__.RemoveEvent;\n/******/ var __webpack_exports__RemovedComponent = __webpack_exports__.RemovedComponent;\n/******/ var __webpack_exports__Repeat = __webpack_exports__.Repeat;\n/******/ var __webpack_exports__RepeatForever = __webpack_exports__.RepeatForever;\n/******/ var __webpack_exports__Resolution = __webpack_exports__.Resolution;\n/******/ var __webpack_exports__Resource = __webpack_exports__.Resource;\n/******/ var __webpack_exports__ResourceEvents = __webpack_exports__.ResourceEvents;\n/******/ var __webpack_exports__RotateBy = __webpack_exports__.RotateBy;\n/******/ var __webpack_exports__RotateByWithOptions = __webpack_exports__.RotateByWithOptions;\n/******/ var __webpack_exports__RotateTo = __webpack_exports__.RotateTo;\n/******/ var __webpack_exports__RotateToWithOptions = __webpack_exports__.RotateToWithOptions;\n/******/ var __webpack_exports__RotationType = __webpack_exports__.RotationType;\n/******/ var __webpack_exports__ScaleBy = __webpack_exports__.ScaleBy;\n/******/ var __webpack_exports__ScaleByWithOptions = __webpack_exports__.ScaleByWithOptions;\n/******/ var __webpack_exports__ScaleTo = __webpack_exports__.ScaleTo;\n/******/ var __webpack_exports__ScaleToWithOptions = __webpack_exports__.ScaleToWithOptions;\n/******/ var __webpack_exports__Scene = __webpack_exports__.Scene;\n/******/ var __webpack_exports__SceneEvents = __webpack_exports__.SceneEvents;\n/******/ var __webpack_exports__Screen = __webpack_exports__.Screen;\n/******/ var __webpack_exports__ScreenAppender = __webpack_exports__.ScreenAppender;\n/******/ var __webpack_exports__ScreenElement = __webpack_exports__.ScreenElement;\n/******/ var __webpack_exports__ScreenEvents = __webpack_exports__.ScreenEvents;\n/******/ var __webpack_exports__ScreenShader = __webpack_exports__.ScreenShader;\n/******/ var __webpack_exports__ScrollPreventionMode = __webpack_exports__.ScrollPreventionMode;\n/******/ var __webpack_exports__Semaphore = __webpack_exports__.Semaphore;\n/******/ var __webpack_exports__SeparatingAxis = __webpack_exports__.SeparatingAxis;\n/******/ var __webpack_exports__SeparationInfo = __webpack_exports__.SeparationInfo;\n/******/ var __webpack_exports__Shader = __webpack_exports__.Shader;\n/******/ var __webpack_exports__Shape = __webpack_exports__.Shape;\n/******/ var __webpack_exports__Side = __webpack_exports__.Side;\n/******/ var __webpack_exports__Slide = __webpack_exports__.Slide;\n/******/ var __webpack_exports__SolverStrategy = __webpack_exports__.SolverStrategy;\n/******/ var __webpack_exports__Sound = __webpack_exports__.Sound;\n/******/ var __webpack_exports__SoundEvents = __webpack_exports__.SoundEvents;\n/******/ var __webpack_exports__SparseHashGrid = __webpack_exports__.SparseHashGrid;\n/******/ var __webpack_exports__SparseHashGridCollisionProcessor = __webpack_exports__.SparseHashGridCollisionProcessor;\n/******/ var __webpack_exports__SpatialPartitionStrategy = __webpack_exports__.SpatialPartitionStrategy;\n/******/ var __webpack_exports__Sprite = __webpack_exports__.Sprite;\n/******/ var __webpack_exports__SpriteFont = __webpack_exports__.SpriteFont;\n/******/ var __webpack_exports__SpriteSheet = __webpack_exports__.SpriteSheet;\n/******/ var __webpack_exports__StandardClock = __webpack_exports__.StandardClock;\n/******/ var __webpack_exports__StateMachine = __webpack_exports__.StateMachine;\n/******/ var __webpack_exports__StrategyContainer = __webpack_exports__.StrategyContainer;\n/******/ var __webpack_exports__Stream = __webpack_exports__.Stream;\n/******/ var __webpack_exports__System = __webpack_exports__.System;\n/******/ var __webpack_exports__SystemManager = __webpack_exports__.SystemManager;\n/******/ var __webpack_exports__SystemPriority = __webpack_exports__.SystemPriority;\n/******/ var __webpack_exports__SystemType = __webpack_exports__.SystemType;\n/******/ var __webpack_exports__TagQuery = __webpack_exports__.TagQuery;\n/******/ var __webpack_exports__TestClock = __webpack_exports__.TestClock;\n/******/ var __webpack_exports__Text = __webpack_exports__.Text;\n/******/ var __webpack_exports__TextAlign = __webpack_exports__.TextAlign;\n/******/ var __webpack_exports__TextureLoader = __webpack_exports__.TextureLoader;\n/******/ var __webpack_exports__Tile = __webpack_exports__.Tile;\n/******/ var __webpack_exports__TileMap = __webpack_exports__.TileMap;\n/******/ var __webpack_exports__TileMapEvents = __webpack_exports__.TileMapEvents;\n/******/ var __webpack_exports__TiledAnimation = __webpack_exports__.TiledAnimation;\n/******/ var __webpack_exports__TiledSprite = __webpack_exports__.TiledSprite;\n/******/ var __webpack_exports__Timer = __webpack_exports__.Timer;\n/******/ var __webpack_exports__Toaster = __webpack_exports__.Toaster;\n/******/ var __webpack_exports__Transform = __webpack_exports__.Transform;\n/******/ var __webpack_exports__TransformComponent = __webpack_exports__.TransformComponent;\n/******/ var __webpack_exports__Transition = __webpack_exports__.Transition;\n/******/ var __webpack_exports__TreeNode = __webpack_exports__.TreeNode;\n/******/ var __webpack_exports__Trigger = __webpack_exports__.Trigger;\n/******/ var __webpack_exports__TriggerEvents = __webpack_exports__.TriggerEvents;\n/******/ var __webpack_exports__TwoPI = __webpack_exports__.TwoPI;\n/******/ var __webpack_exports__Util = __webpack_exports__.Util;\n/******/ var __webpack_exports__Vector = __webpack_exports__.Vector;\n/******/ var __webpack_exports__VectorView = __webpack_exports__.VectorView;\n/******/ var __webpack_exports__VertexBuffer = __webpack_exports__.VertexBuffer;\n/******/ var __webpack_exports__VertexLayout = __webpack_exports__.VertexLayout;\n/******/ var __webpack_exports__VerticalFirst = __webpack_exports__.VerticalFirst;\n/******/ var __webpack_exports__VisibleEvent = __webpack_exports__.VisibleEvent;\n/******/ var __webpack_exports__WebAudio = __webpack_exports__.WebAudio;\n/******/ var __webpack_exports__WebAudioInstance = __webpack_exports__.WebAudioInstance;\n/******/ var __webpack_exports__WheelDeltaMode = __webpack_exports__.WheelDeltaMode;\n/******/ var __webpack_exports__WheelEvent = __webpack_exports__.WheelEvent;\n/******/ var __webpack_exports__World = __webpack_exports__.World;\n/******/ var __webpack_exports__approximatelyEqual = __webpack_exports__.approximatelyEqual;\n/******/ var __webpack_exports__assert = __webpack_exports__.assert;\n/******/ var __webpack_exports__canonicalizeAngle = __webpack_exports__.canonicalizeAngle;\n/******/ var __webpack_exports__clamp = __webpack_exports__.clamp;\n/******/ var __webpack_exports__coroutine = __webpack_exports__.coroutine;\n/******/ var __webpack_exports__createId = __webpack_exports__.createId;\n/******/ var __webpack_exports__frac = __webpack_exports__.frac;\n/******/ var __webpack_exports__getDefaultPhysicsConfig = __webpack_exports__.getDefaultPhysicsConfig;\n/******/ var __webpack_exports__hasGraphicsTick = __webpack_exports__.hasGraphicsTick;\n/******/ var __webpack_exports__hasOnAdd = __webpack_exports__.hasOnAdd;\n/******/ var __webpack_exports__hasOnInitialize = __webpack_exports__.hasOnInitialize;\n/******/ var __webpack_exports__hasOnPostUpdate = __webpack_exports__.hasOnPostUpdate;\n/******/ var __webpack_exports__hasOnPreUpdate = __webpack_exports__.hasOnPreUpdate;\n/******/ var __webpack_exports__hasOnRemove = __webpack_exports__.hasOnRemove;\n/******/ var __webpack_exports__hasPostDraw = __webpack_exports__.hasPostDraw;\n/******/ var __webpack_exports__hasPreDraw = __webpack_exports__.hasPreDraw;\n/******/ var __webpack_exports__has_add = __webpack_exports__.has_add;\n/******/ var __webpack_exports__has_initialize = __webpack_exports__.has_initialize;\n/******/ var __webpack_exports__has_postupdate = __webpack_exports__.has_postupdate;\n/******/ var __webpack_exports__has_preupdate = __webpack_exports__.has_preupdate;\n/******/ var __webpack_exports__has_remove = __webpack_exports__.has_remove;\n/******/ var __webpack_exports__inverseLerp = __webpack_exports__.inverseLerp;\n/******/ var __webpack_exports__inverseLerpVector = __webpack_exports__.inverseLerpVector;\n/******/ var __webpack_exports__isActor = __webpack_exports__.isActor;\n/******/ var __webpack_exports__isAddedComponent = __webpack_exports__.isAddedComponent;\n/******/ var __webpack_exports__isComponentCtor = __webpack_exports__.isComponentCtor;\n/******/ var __webpack_exports__isLoaderConstructor = __webpack_exports__.isLoaderConstructor;\n/******/ var __webpack_exports__isMoveByOptions = __webpack_exports__.isMoveByOptions;\n/******/ var __webpack_exports__isMoveToOptions = __webpack_exports__.isMoveToOptions;\n/******/ var __webpack_exports__isRemovedComponent = __webpack_exports__.isRemovedComponent;\n/******/ var __webpack_exports__isRotateByOptions = __webpack_exports__.isRotateByOptions;\n/******/ var __webpack_exports__isRotateToOptions = __webpack_exports__.isRotateToOptions;\n/******/ var __webpack_exports__isScaleByOptions = __webpack_exports__.isScaleByOptions;\n/******/ var __webpack_exports__isScaleToOptions = __webpack_exports__.isScaleToOptions;\n/******/ var __webpack_exports__isSceneConstructor = __webpack_exports__.isSceneConstructor;\n/******/ var __webpack_exports__isScreenElement = __webpack_exports__.isScreenElement;\n/******/ var __webpack_exports__isSystemConstructor = __webpack_exports__.isSystemConstructor;\n/******/ var __webpack_exports__lerp = __webpack_exports__.lerp;\n/******/ var __webpack_exports__lerpAngle = __webpack_exports__.lerpAngle;\n/******/ var __webpack_exports__lerpVector = __webpack_exports__.lerpVector;\n/******/ var __webpack_exports__maxMessages = __webpack_exports__.maxMessages;\n/******/ var __webpack_exports__nextActionId = __webpack_exports__.nextActionId;\n/******/ var __webpack_exports__obsolete = __webpack_exports__.obsolete;\n/******/ var __webpack_exports__parseImageFiltering = __webpack_exports__.parseImageFiltering;\n/******/ var __webpack_exports__parseImageWrapping = __webpack_exports__.parseImageWrapping;\n/******/ var __webpack_exports__pixelSnapEpsilon = __webpack_exports__.pixelSnapEpsilon;\n/******/ var __webpack_exports__randomInRange = __webpack_exports__.randomInRange;\n/******/ var __webpack_exports__randomIntInRange = __webpack_exports__.randomIntInRange;\n/******/ var __webpack_exports__range = __webpack_exports__.range;\n/******/ var __webpack_exports__remap = __webpack_exports__.remap;\n/******/ var __webpack_exports__remapVector = __webpack_exports__.remapVector;\n/******/ var __webpack_exports__resetObsoleteCounter = __webpack_exports__.resetObsoleteCounter;\n/******/ var __webpack_exports__sign = __webpack_exports__.sign;\n/******/ var __webpack_exports__toDegrees = __webpack_exports__.toDegrees;\n/******/ var __webpack_exports__toRadians = __webpack_exports__.toRadians;\n/******/ var __webpack_exports__vec = __webpack_exports__.vec;\n/******/ var __webpack_exports__webgl = __webpack_exports__.webgl;\n/******/ export { __webpack_exports__ActionCompleteEvent as ActionCompleteEvent, __webpack_exports__ActionContext as ActionContext, __webpack_exports__ActionQueue as ActionQueue, __webpack_exports__ActionSequence as ActionSequence, __webpack_exports__ActionStartEvent as ActionStartEvent, __webpack_exports__ActionsComponent as ActionsComponent, __webpack_exports__ActionsSystem as ActionsSystem, __webpack_exports__ActivateEvent as ActivateEvent, __webpack_exports__Actor as Actor, __webpack_exports__ActorEvents as ActorEvents, __webpack_exports__AddEvent as AddEvent, __webpack_exports__AddedComponent as AddedComponent, __webpack_exports__AffineMatrix as AffineMatrix, __webpack_exports__Animation as Animation, __webpack_exports__AnimationDirection as AnimationDirection, __webpack_exports__AnimationEvents as AnimationEvents, __webpack_exports__AnimationStrategy as AnimationStrategy, __webpack_exports__ArcadeSolver as ArcadeSolver, __webpack_exports__AudioContextFactory as AudioContextFactory, __webpack_exports__Axes as Axes, __webpack_exports__Axis as Axis, __webpack_exports__BaseAlign as BaseAlign, __webpack_exports__BezierCurve as BezierCurve, __webpack_exports__Blink as Blink, __webpack_exports__BodyComponent as BodyComponent, __webpack_exports__BoundingBox as BoundingBox, __webpack_exports__BrowserComponent as BrowserComponent, __webpack_exports__BrowserEvents as BrowserEvents, __webpack_exports__Buttons as Buttons, __webpack_exports__Camera as Camera, __webpack_exports__CameraEvents as CameraEvents, __webpack_exports__Canvas as Canvas, __webpack_exports__Circle as Circle, __webpack_exports__CircleCollider as CircleCollider, __webpack_exports__Clock as Clock, __webpack_exports__ClosestLineJumpTable as ClosestLineJumpTable, __webpack_exports__Collider as Collider, __webpack_exports__ColliderComponent as ColliderComponent, __webpack_exports__CollisionContact as CollisionContact, __webpack_exports__CollisionEndEvent as CollisionEndEvent, __webpack_exports__CollisionGroup as CollisionGroup, __webpack_exports__CollisionGroupManager as CollisionGroupManager, __webpack_exports__CollisionJumpTable as CollisionJumpTable, __webpack_exports__CollisionPostSolveEvent as CollisionPostSolveEvent, __webpack_exports__CollisionPreSolveEvent as CollisionPreSolveEvent, __webpack_exports__CollisionStartEvent as CollisionStartEvent, __webpack_exports__CollisionSystem as CollisionSystem, __webpack_exports__CollisionType as CollisionType, __webpack_exports__Color as Color, __webpack_exports__ColorBlindFlags as ColorBlindFlags, __webpack_exports__ColorBlindnessMode as ColorBlindnessMode, __webpack_exports__ColorBlindnessPostProcessor as ColorBlindnessPostProcessor, __webpack_exports__Component as Component, __webpack_exports__CompositeCollider as CompositeCollider, __webpack_exports__ConsoleAppender as ConsoleAppender, __webpack_exports__ContactConstraintPoint as ContactConstraintPoint, __webpack_exports__ContactEndEvent as ContactEndEvent, __webpack_exports__ContactSolveBias as ContactSolveBias, __webpack_exports__ContactStartEvent as ContactStartEvent, __webpack_exports__CoordPlane as CoordPlane, __webpack_exports__CrossFade as CrossFade, __webpack_exports__CurveBy as CurveBy, __webpack_exports__CurveTo as CurveTo, __webpack_exports__DeactivateEvent as DeactivateEvent, __webpack_exports__Debug as Debug, __webpack_exports__DebugConfig as DebugConfig, __webpack_exports__DebugGraphicsComponent as DebugGraphicsComponent, __webpack_exports__DebugSystem as DebugSystem, __webpack_exports__DebugText as DebugText, __webpack_exports__DefaultAntialiasOptions as DefaultAntialiasOptions, __webpack_exports__DefaultGarbageCollectionOptions as DefaultGarbageCollectionOptions, __webpack_exports__DefaultLoader as DefaultLoader, __webpack_exports__DefaultPixelArtOptions as DefaultPixelArtOptions, __webpack_exports__DegreeOfFreedom as DegreeOfFreedom, __webpack_exports__Delay as Delay, __webpack_exports__Detector as Detector, __webpack_exports__Die as Die, __webpack_exports__Direction as Direction, __webpack_exports__Director as Director, __webpack_exports__DirectorEvents as DirectorEvents, __webpack_exports__DisplayMode as DisplayMode, __webpack_exports__DynamicTree as DynamicTree, __webpack_exports__DynamicTreeCollisionProcessor as DynamicTreeCollisionProcessor, __webpack_exports__EX_VERSION as EX_VERSION, __webpack_exports__EaseBy as EaseBy, __webpack_exports__EaseTo as EaseTo, __webpack_exports__EasingFunctions as EasingFunctions, __webpack_exports__EdgeCollider as EdgeCollider, __webpack_exports__ElasticToActorStrategy as ElasticToActorStrategy, __webpack_exports__EmitterType as EmitterType, __webpack_exports__Engine as Engine, __webpack_exports__EngineEvents as EngineEvents, __webpack_exports__EnterTriggerEvent as EnterTriggerEvent, __webpack_exports__EnterViewPortEvent as EnterViewPortEvent, __webpack_exports__Entity as Entity, __webpack_exports__EntityEvents as EntityEvents, __webpack_exports__EntityManager as EntityManager, __webpack_exports__EventEmitter as EventEmitter, __webpack_exports__EventTypes as EventTypes, __webpack_exports__Events as Events, __webpack_exports__ExResponse as ExResponse, __webpack_exports__ExcaliburGraphicsContext2DCanvas as ExcaliburGraphicsContext2DCanvas, __webpack_exports__ExcaliburGraphicsContextWebGL as ExcaliburGraphicsContextWebGL, __webpack_exports__ExitTriggerEvent as ExitTriggerEvent, __webpack_exports__ExitViewPortEvent as ExitViewPortEvent, __webpack_exports__Fade as Fade, __webpack_exports__FadeInOut as FadeInOut, __webpack_exports__Flags as Flags, __webpack_exports__Flash as Flash, __webpack_exports__Follow as Follow, __webpack_exports__Font as Font, __webpack_exports__FontCache as FontCache, __webpack_exports__FontSource as FontSource, __webpack_exports__FontStyle as FontStyle, __webpack_exports__FontUnit as FontUnit, __webpack_exports__FpsSampler as FpsSampler, __webpack_exports__FrameStats as FrameStats, __webpack_exports__Future as Future, __webpack_exports__GameEvent as GameEvent, __webpack_exports__GameStartEvent as GameStartEvent, __webpack_exports__GameStopEvent as GameStopEvent, __webpack_exports__Gamepad as Gamepad, __webpack_exports__GamepadAxisEvent as GamepadAxisEvent, __webpack_exports__GamepadButtonEvent as GamepadButtonEvent, __webpack_exports__GamepadConnectEvent as GamepadConnectEvent, __webpack_exports__GamepadDisconnectEvent as GamepadDisconnectEvent, __webpack_exports__Gamepads as Gamepads, __webpack_exports__GarbageCollector as GarbageCollector, __webpack_exports__Gif as Gif, __webpack_exports__GifParser as GifParser, __webpack_exports__GlobalCoordinates as GlobalCoordinates, __webpack_exports__GpuParticleEmitter as GpuParticleEmitter, __webpack_exports__GpuParticleRenderer as GpuParticleRenderer, __webpack_exports__Graphic as Graphic, __webpack_exports__GraphicsComponent as GraphicsComponent, __webpack_exports__GraphicsGroup as GraphicsGroup, __webpack_exports__GraphicsSystem as GraphicsSystem, __webpack_exports__HashColliderProxy as HashColliderProxy, __webpack_exports__HashGridCell as HashGridCell, __webpack_exports__HashGridProxy as HashGridProxy, __webpack_exports__HiddenEvent as HiddenEvent, __webpack_exports__HorizontalFirst as HorizontalFirst, __webpack_exports__ImageFiltering as ImageFiltering, __webpack_exports__ImageSource as ImageSource, __webpack_exports__ImageSourceAttributeConstants as ImageSourceAttributeConstants, __webpack_exports__ImageWrapping as ImageWrapping, __webpack_exports__InitializeEvent as InitializeEvent, __webpack_exports__InputHost as InputHost, __webpack_exports__InputMapper as InputMapper, __webpack_exports__IsometricEntityComponent as IsometricEntityComponent, __webpack_exports__IsometricEntitySystem as IsometricEntitySystem, __webpack_exports__IsometricMap as IsometricMap, __webpack_exports__IsometricTile as IsometricTile, __webpack_exports__KeyEvent as KeyEvent, __webpack_exports__Keyboard as Keyboard, __webpack_exports__Keys as Keys, __webpack_exports__KillEvent as KillEvent, __webpack_exports__Label as Label, __webpack_exports__LimitCameraBoundsStrategy as LimitCameraBoundsStrategy, __webpack_exports__Line as Line, __webpack_exports__LineSegment as LineSegment, __webpack_exports__Loader as Loader, __webpack_exports__LoaderEvents as LoaderEvents, __webpack_exports__LockCameraToActorAxisStrategy as LockCameraToActorAxisStrategy, __webpack_exports__LockCameraToActorStrategy as LockCameraToActorStrategy, __webpack_exports__LogLevel as LogLevel, __webpack_exports__Logger as Logger, __webpack_exports__Material as Material, __webpack_exports__Matrix as Matrix, __webpack_exports__MatrixLocations as MatrixLocations, __webpack_exports__MediaEvent as MediaEvent, __webpack_exports__Meet as Meet, __webpack_exports__MotionComponent as MotionComponent, __webpack_exports__MotionSystem as MotionSystem, __webpack_exports__MoveBy as MoveBy, __webpack_exports__MoveByWithOptions as MoveByWithOptions, __webpack_exports__MoveTo as MoveTo, __webpack_exports__MoveToWithOptions as MoveToWithOptions, __webpack_exports__NativePointerButton as NativePointerButton, __webpack_exports__NativeSoundEvent as NativeSoundEvent, __webpack_exports__NativeSoundProcessedEvent as NativeSoundProcessedEvent, __webpack_exports__NineSlice as NineSlice, __webpack_exports__NineSliceStretch as NineSliceStretch, __webpack_exports__None as None, __webpack_exports__Observable as Observable, __webpack_exports__OffscreenSystem as OffscreenSystem, __webpack_exports__Pair as Pair, __webpack_exports__ParallaxComponent as ParallaxComponent, __webpack_exports__ParallelActions as ParallelActions, __webpack_exports__Particle as Particle, __webpack_exports__ParticleEmitter as ParticleEmitter, __webpack_exports__ParticleRenderer as ParticleRenderer, __webpack_exports__ParticleTransform as ParticleTransform, __webpack_exports__PhysicsStats as PhysicsStats, __webpack_exports__PhysicsWorld as PhysicsWorld, __webpack_exports__PointerAbstraction as PointerAbstraction, __webpack_exports__PointerButton as PointerButton, __webpack_exports__PointerComponent as PointerComponent, __webpack_exports__PointerEvent as PointerEvent, __webpack_exports__PointerEventReceiver as PointerEventReceiver, __webpack_exports__PointerScope as PointerScope, __webpack_exports__PointerSystem as PointerSystem, __webpack_exports__PointerType as PointerType, __webpack_exports__Polygon as Polygon, __webpack_exports__PolygonCollider as PolygonCollider, __webpack_exports__Pool as Pool, __webpack_exports__PostCollisionEvent as PostCollisionEvent, __webpack_exports__PostDebugDrawEvent as PostDebugDrawEvent, __webpack_exports__PostDrawEvent as PostDrawEvent, __webpack_exports__PostFrameEvent as PostFrameEvent, __webpack_exports__PostKillEvent as PostKillEvent, __webpack_exports__PostTransformDrawEvent as PostTransformDrawEvent, __webpack_exports__PostUpdateEvent as PostUpdateEvent, __webpack_exports__PreCollisionEvent as PreCollisionEvent, __webpack_exports__PreDebugDrawEvent as PreDebugDrawEvent, __webpack_exports__PreDrawEvent as PreDrawEvent, __webpack_exports__PreFrameEvent as PreFrameEvent, __webpack_exports__PreKillEvent as PreKillEvent, __webpack_exports__PreLoadEvent as PreLoadEvent, __webpack_exports__PreTransformDrawEvent as PreTransformDrawEvent, __webpack_exports__PreUpdateEvent as PreUpdateEvent, __webpack_exports__Projection as Projection, __webpack_exports__QuadIndexBuffer as QuadIndexBuffer, __webpack_exports__QuadTree as QuadTree, __webpack_exports__Query as Query, __webpack_exports__QueryManager as QueryManager, __webpack_exports__RadiusAroundActorStrategy as RadiusAroundActorStrategy, __webpack_exports__Random as Random, __webpack_exports__Raster as Raster, __webpack_exports__Ray as Ray, __webpack_exports__RealisticSolver as RealisticSolver, __webpack_exports__Rectangle as Rectangle, __webpack_exports__RemoveEvent as RemoveEvent, __webpack_exports__RemovedComponent as RemovedComponent, __webpack_exports__Repeat as Repeat, __webpack_exports__RepeatForever as RepeatForever, __webpack_exports__Resolution as Resolution, __webpack_exports__Resource as Resource, __webpack_exports__ResourceEvents as ResourceEvents, __webpack_exports__RotateBy as RotateBy, __webpack_exports__RotateByWithOptions as RotateByWithOptions, __webpack_exports__RotateTo as RotateTo, __webpack_exports__RotateToWithOptions as RotateToWithOptions, __webpack_exports__RotationType as RotationType, __webpack_exports__ScaleBy as ScaleBy, __webpack_exports__ScaleByWithOptions as ScaleByWithOptions, __webpack_exports__ScaleTo as ScaleTo, __webpack_exports__ScaleToWithOptions as ScaleToWithOptions, __webpack_exports__Scene as Scene, __webpack_exports__SceneEvents as SceneEvents, __webpack_exports__Screen as Screen, __webpack_exports__ScreenAppender as ScreenAppender, __webpack_exports__ScreenElement as ScreenElement, __webpack_exports__ScreenEvents as ScreenEvents, __webpack_exports__ScreenShader as ScreenShader, __webpack_exports__ScrollPreventionMode as ScrollPreventionMode, __webpack_exports__Semaphore as Semaphore, __webpack_exports__SeparatingAxis as SeparatingAxis, __webpack_exports__SeparationInfo as SeparationInfo, __webpack_exports__Shader as Shader, __webpack_exports__Shape as Shape, __webpack_exports__Side as Side, __webpack_exports__Slide as Slide, __webpack_exports__SolverStrategy as SolverStrategy, __webpack_exports__Sound as Sound, __webpack_exports__SoundEvents as SoundEvents, __webpack_exports__SparseHashGrid as SparseHashGrid, __webpack_exports__SparseHashGridCollisionProcessor as SparseHashGridCollisionProcessor, __webpack_exports__SpatialPartitionStrategy as SpatialPartitionStrategy, __webpack_exports__Sprite as Sprite, __webpack_exports__SpriteFont as SpriteFont, __webpack_exports__SpriteSheet as SpriteSheet, __webpack_exports__StandardClock as StandardClock, __webpack_exports__StateMachine as StateMachine, __webpack_exports__StrategyContainer as StrategyContainer, __webpack_exports__Stream as Stream, __webpack_exports__System as System, __webpack_exports__SystemManager as SystemManager, __webpack_exports__SystemPriority as SystemPriority, __webpack_exports__SystemType as SystemType, __webpack_exports__TagQuery as TagQuery, __webpack_exports__TestClock as TestClock, __webpack_exports__Text as Text, __webpack_exports__TextAlign as TextAlign, __webpack_exports__TextureLoader as TextureLoader, __webpack_exports__Tile as Tile, __webpack_exports__TileMap as TileMap, __webpack_exports__TileMapEvents as TileMapEvents, __webpack_exports__TiledAnimation as TiledAnimation, __webpack_exports__TiledSprite as TiledSprite, __webpack_exports__Timer as Timer, __webpack_exports__Toaster as Toaster, __webpack_exports__Transform as Transform, __webpack_exports__TransformComponent as TransformComponent, __webpack_exports__Transition as Transition, __webpack_exports__TreeNode as TreeNode, __webpack_exports__Trigger as Trigger, __webpack_exports__TriggerEvents as TriggerEvents, __webpack_exports__TwoPI as TwoPI, __webpack_exports__Util as Util, __webpack_exports__Vector as Vector, __webpack_exports__VectorView as VectorView, __webpack_exports__VertexBuffer as VertexBuffer, __webpack_exports__VertexLayout as VertexLayout, __webpack_exports__VerticalFirst as VerticalFirst, __webpack_exports__VisibleEvent as VisibleEvent, __webpack_exports__WebAudio as WebAudio, __webpack_exports__WebAudioInstance as WebAudioInstance, __webpack_exports__WheelDeltaMode as WheelDeltaMode, __webpack_exports__WheelEvent as WheelEvent, __webpack_exports__World as World, __webpack_exports__approximatelyEqual as approximatelyEqual, __webpack_exports__assert as assert, __webpack_exports__canonicalizeAngle as canonicalizeAngle, __webpack_exports__clamp as clamp, __webpack_exports__coroutine as coroutine, __webpack_exports__createId as createId, __webpack_exports__frac as frac, __webpack_exports__getDefaultPhysicsConfig as getDefaultPhysicsConfig, __webpack_exports__hasGraphicsTick as hasGraphicsTick, __webpack_exports__hasOnAdd as hasOnAdd, __webpack_exports__hasOnInitialize as hasOnInitialize, __webpack_exports__hasOnPostUpdate as hasOnPostUpdate, __webpack_exports__hasOnPreUpdate as hasOnPreUpdate, __webpack_exports__hasOnRemove as hasOnRemove, __webpack_exports__hasPostDraw as hasPostDraw, __webpack_exports__hasPreDraw as hasPreDraw, __webpack_exports__has_add as has_add, __webpack_exports__has_initialize as has_initialize, __webpack_exports__has_postupdate as has_postupdate, __webpack_exports__has_preupdate as has_preupdate, __webpack_exports__has_remove as has_remove, __webpack_exports__inverseLerp as inverseLerp, __webpack_exports__inverseLerpVector as inverseLerpVector, __webpack_exports__isActor as isActor, __webpack_exports__isAddedComponent as isAddedComponent, __webpack_exports__isComponentCtor as isComponentCtor, __webpack_exports__isLoaderConstructor as isLoaderConstructor, __webpack_exports__isMoveByOptions as isMoveByOptions, __webpack_exports__isMoveToOptions as isMoveToOptions, __webpack_exports__isRemovedComponent as isRemovedComponent, __webpack_exports__isRotateByOptions as isRotateByOptions, __webpack_exports__isRotateToOptions as isRotateToOptions, __webpack_exports__isScaleByOptions as isScaleByOptions, __webpack_exports__isScaleToOptions as isScaleToOptions, __webpack_exports__isSceneConstructor as isSceneConstructor, __webpack_exports__isScreenElement as isScreenElement, __webpack_exports__isSystemConstructor as isSystemConstructor, __webpack_exports__lerp as lerp, __webpack_exports__lerpAngle as lerpAngle, __webpack_exports__lerpVector as lerpVector, __webpack_exports__maxMessages as maxMessages, __webpack_exports__nextActionId as nextActionId, __webpack_exports__obsolete as obsolete, __webpack_exports__parseImageFiltering as parseImageFiltering, __webpack_exports__parseImageWrapping as parseImageWrapping, __webpack_exports__pixelSnapEpsilon as pixelSnapEpsilon, __webpack_exports__randomInRange as randomInRange, __webpack_exports__randomIntInRange as randomIntInRange, __webpack_exports__range as range, __webpack_exports__remap as remap, __webpack_exports__remapVector as remapVector, __webpack_exports__resetObsoleteCounter as resetObsoleteCounter, __webpack_exports__sign as sign, __webpack_exports__toDegrees as toDegrees, __webpack_exports__toRadians as toRadians, __webpack_exports__vec as vec, __webpack_exports__webgl as webgl };\n/******/ \n\n//# sourceMappingURL=excalibur.development.js.map","var util;\n(function (util) {\n util.assertEqual = (val) => val;\n function assertIs(_arg) { }\n util.assertIs = assertIs;\n function assertNever(_x) {\n throw new Error();\n }\n util.assertNever = assertNever;\n util.arrayToEnum = (items) => {\n const obj = {};\n for (const item of items) {\n obj[item] = item;\n }\n return obj;\n };\n util.getValidEnumValues = (obj) => {\n const validKeys = util.objectKeys(obj).filter((k) => typeof obj[obj[k]] !== \"number\");\n const filtered = {};\n for (const k of validKeys) {\n filtered[k] = obj[k];\n }\n return util.objectValues(filtered);\n };\n util.objectValues = (obj) => {\n return util.objectKeys(obj).map(function (e) {\n return obj[e];\n });\n };\n util.objectKeys = typeof Object.keys === \"function\" // eslint-disable-line ban/ban\n ? (obj) => Object.keys(obj) // eslint-disable-line ban/ban\n : (object) => {\n const keys = [];\n for (const key in object) {\n if (Object.prototype.hasOwnProperty.call(object, key)) {\n keys.push(key);\n }\n }\n return keys;\n };\n util.find = (arr, checker) => {\n for (const item of arr) {\n if (checker(item))\n return item;\n }\n return undefined;\n };\n util.isInteger = typeof Number.isInteger === \"function\"\n ? (val) => Number.isInteger(val) // eslint-disable-line ban/ban\n : (val) => typeof val === \"number\" && isFinite(val) && Math.floor(val) === val;\n function joinValues(array, separator = \" | \") {\n return array\n .map((val) => (typeof val === \"string\" ? `'${val}'` : val))\n .join(separator);\n }\n util.joinValues = joinValues;\n util.jsonStringifyReplacer = (_, value) => {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n };\n})(util || (util = {}));\nvar objectUtil;\n(function (objectUtil) {\n objectUtil.mergeShapes = (first, second) => {\n return {\n ...first,\n ...second, // second overwrites first\n };\n };\n})(objectUtil || (objectUtil = {}));\nconst ZodParsedType = util.arrayToEnum([\n \"string\",\n \"nan\",\n \"number\",\n \"integer\",\n \"float\",\n \"boolean\",\n \"date\",\n \"bigint\",\n \"symbol\",\n \"function\",\n \"undefined\",\n \"null\",\n \"array\",\n \"object\",\n \"unknown\",\n \"promise\",\n \"void\",\n \"never\",\n \"map\",\n \"set\",\n]);\nconst getParsedType = (data) => {\n const t = typeof data;\n switch (t) {\n case \"undefined\":\n return ZodParsedType.undefined;\n case \"string\":\n return ZodParsedType.string;\n case \"number\":\n return isNaN(data) ? ZodParsedType.nan : ZodParsedType.number;\n case \"boolean\":\n return ZodParsedType.boolean;\n case \"function\":\n return ZodParsedType.function;\n case \"bigint\":\n return ZodParsedType.bigint;\n case \"symbol\":\n return ZodParsedType.symbol;\n case \"object\":\n if (Array.isArray(data)) {\n return ZodParsedType.array;\n }\n if (data === null) {\n return ZodParsedType.null;\n }\n if (data.then &&\n typeof data.then === \"function\" &&\n data.catch &&\n typeof data.catch === \"function\") {\n return ZodParsedType.promise;\n }\n if (typeof Map !== \"undefined\" && data instanceof Map) {\n return ZodParsedType.map;\n }\n if (typeof Set !== \"undefined\" && data instanceof Set) {\n return ZodParsedType.set;\n }\n if (typeof Date !== \"undefined\" && data instanceof Date) {\n return ZodParsedType.date;\n }\n return ZodParsedType.object;\n default:\n return ZodParsedType.unknown;\n }\n};\n\nconst ZodIssueCode = util.arrayToEnum([\n \"invalid_type\",\n \"invalid_literal\",\n \"custom\",\n \"invalid_union\",\n \"invalid_union_discriminator\",\n \"invalid_enum_value\",\n \"unrecognized_keys\",\n \"invalid_arguments\",\n \"invalid_return_type\",\n \"invalid_date\",\n \"invalid_string\",\n \"too_small\",\n \"too_big\",\n \"invalid_intersection_types\",\n \"not_multiple_of\",\n \"not_finite\",\n]);\nconst quotelessJson = (obj) => {\n const json = JSON.stringify(obj, null, 2);\n return json.replace(/\"([^\"]+)\":/g, \"$1:\");\n};\nclass ZodError extends Error {\n get errors() {\n return this.issues;\n }\n constructor(issues) {\n super();\n this.issues = [];\n this.addIssue = (sub) => {\n this.issues = [...this.issues, sub];\n };\n this.addIssues = (subs = []) => {\n this.issues = [...this.issues, ...subs];\n };\n const actualProto = new.target.prototype;\n if (Object.setPrototypeOf) {\n // eslint-disable-next-line ban/ban\n Object.setPrototypeOf(this, actualProto);\n }\n else {\n this.__proto__ = actualProto;\n }\n this.name = \"ZodError\";\n this.issues = issues;\n }\n format(_mapper) {\n const mapper = _mapper ||\n function (issue) {\n return issue.message;\n };\n const fieldErrors = { _errors: [] };\n const processError = (error) => {\n for (const issue of error.issues) {\n if (issue.code === \"invalid_union\") {\n issue.unionErrors.map(processError);\n }\n else if (issue.code === \"invalid_return_type\") {\n processError(issue.returnTypeError);\n }\n else if (issue.code === \"invalid_arguments\") {\n processError(issue.argumentsError);\n }\n else if (issue.path.length === 0) {\n fieldErrors._errors.push(mapper(issue));\n }\n else {\n let curr = fieldErrors;\n let i = 0;\n while (i < issue.path.length) {\n const el = issue.path[i];\n const terminal = i === issue.path.length - 1;\n if (!terminal) {\n curr[el] = curr[el] || { _errors: [] };\n // if (typeof el === \"string\") {\n // curr[el] = curr[el] || { _errors: [] };\n // } else if (typeof el === \"number\") {\n // const errorArray: any = [];\n // errorArray._errors = [];\n // curr[el] = curr[el] || errorArray;\n // }\n }\n else {\n curr[el] = curr[el] || { _errors: [] };\n curr[el]._errors.push(mapper(issue));\n }\n curr = curr[el];\n i++;\n }\n }\n }\n };\n processError(this);\n return fieldErrors;\n }\n static assert(value) {\n if (!(value instanceof ZodError)) {\n throw new Error(`Not a ZodError: ${value}`);\n }\n }\n toString() {\n return this.message;\n }\n get message() {\n return JSON.stringify(this.issues, util.jsonStringifyReplacer, 2);\n }\n get isEmpty() {\n return this.issues.length === 0;\n }\n flatten(mapper = (issue) => issue.message) {\n const fieldErrors = {};\n const formErrors = [];\n for (const sub of this.issues) {\n if (sub.path.length > 0) {\n fieldErrors[sub.path[0]] = fieldErrors[sub.path[0]] || [];\n fieldErrors[sub.path[0]].push(mapper(sub));\n }\n else {\n formErrors.push(mapper(sub));\n }\n }\n return { formErrors, fieldErrors };\n }\n get formErrors() {\n return this.flatten();\n }\n}\nZodError.create = (issues) => {\n const error = new ZodError(issues);\n return error;\n};\n\nconst errorMap = (issue, _ctx) => {\n let message;\n switch (issue.code) {\n case ZodIssueCode.invalid_type:\n if (issue.received === ZodParsedType.undefined) {\n message = \"Required\";\n }\n else {\n message = `Expected ${issue.expected}, received ${issue.received}`;\n }\n break;\n case ZodIssueCode.invalid_literal:\n message = `Invalid literal value, expected ${JSON.stringify(issue.expected, util.jsonStringifyReplacer)}`;\n break;\n case ZodIssueCode.unrecognized_keys:\n message = `Unrecognized key(s) in object: ${util.joinValues(issue.keys, \", \")}`;\n break;\n case ZodIssueCode.invalid_union:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_union_discriminator:\n message = `Invalid discriminator value. Expected ${util.joinValues(issue.options)}`;\n break;\n case ZodIssueCode.invalid_enum_value:\n message = `Invalid enum value. Expected ${util.joinValues(issue.options)}, received '${issue.received}'`;\n break;\n case ZodIssueCode.invalid_arguments:\n message = `Invalid function arguments`;\n break;\n case ZodIssueCode.invalid_return_type:\n message = `Invalid function return type`;\n break;\n case ZodIssueCode.invalid_date:\n message = `Invalid date`;\n break;\n case ZodIssueCode.invalid_string:\n if (typeof issue.validation === \"object\") {\n if (\"includes\" in issue.validation) {\n message = `Invalid input: must include \"${issue.validation.includes}\"`;\n if (typeof issue.validation.position === \"number\") {\n message = `${message} at one or more positions greater than or equal to ${issue.validation.position}`;\n }\n }\n else if (\"startsWith\" in issue.validation) {\n message = `Invalid input: must start with \"${issue.validation.startsWith}\"`;\n }\n else if (\"endsWith\" in issue.validation) {\n message = `Invalid input: must end with \"${issue.validation.endsWith}\"`;\n }\n else {\n util.assertNever(issue.validation);\n }\n }\n else if (issue.validation !== \"regex\") {\n message = `Invalid ${issue.validation}`;\n }\n else {\n message = \"Invalid\";\n }\n break;\n case ZodIssueCode.too_small:\n if (issue.type === \"array\")\n message = `Array must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `more than`} ${issue.minimum} element(s)`;\n else if (issue.type === \"string\")\n message = `String must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `over`} ${issue.minimum} character(s)`;\n else if (issue.type === \"number\")\n message = `Number must be ${issue.exact\n ? `exactly equal to `\n : issue.inclusive\n ? `greater than or equal to `\n : `greater than `}${issue.minimum}`;\n else if (issue.type === \"date\")\n message = `Date must be ${issue.exact\n ? `exactly equal to `\n : issue.inclusive\n ? `greater than or equal to `\n : `greater than `}${new Date(Number(issue.minimum))}`;\n else\n message = \"Invalid input\";\n break;\n case ZodIssueCode.too_big:\n if (issue.type === \"array\")\n message = `Array must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `less than`} ${issue.maximum} element(s)`;\n else if (issue.type === \"string\")\n message = `String must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `under`} ${issue.maximum} character(s)`;\n else if (issue.type === \"number\")\n message = `Number must be ${issue.exact\n ? `exactly`\n : issue.inclusive\n ? `less than or equal to`\n : `less than`} ${issue.maximum}`;\n else if (issue.type === \"bigint\")\n message = `BigInt must be ${issue.exact\n ? `exactly`\n : issue.inclusive\n ? `less than or equal to`\n : `less than`} ${issue.maximum}`;\n else if (issue.type === \"date\")\n message = `Date must be ${issue.exact\n ? `exactly`\n : issue.inclusive\n ? `smaller than or equal to`\n : `smaller than`} ${new Date(Number(issue.maximum))}`;\n else\n message = \"Invalid input\";\n break;\n case ZodIssueCode.custom:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_intersection_types:\n message = `Intersection results could not be merged`;\n break;\n case ZodIssueCode.not_multiple_of:\n message = `Number must be a multiple of ${issue.multipleOf}`;\n break;\n case ZodIssueCode.not_finite:\n message = \"Number must be finite\";\n break;\n default:\n message = _ctx.defaultError;\n util.assertNever(issue);\n }\n return { message };\n};\n\nlet overrideErrorMap = errorMap;\nfunction setErrorMap(map) {\n overrideErrorMap = map;\n}\nfunction getErrorMap() {\n return overrideErrorMap;\n}\n\nconst makeIssue = (params) => {\n const { data, path, errorMaps, issueData } = params;\n const fullPath = [...path, ...(issueData.path || [])];\n const fullIssue = {\n ...issueData,\n path: fullPath,\n };\n if (issueData.message !== undefined) {\n return {\n ...issueData,\n path: fullPath,\n message: issueData.message,\n };\n }\n let errorMessage = \"\";\n const maps = errorMaps\n .filter((m) => !!m)\n .slice()\n .reverse();\n for (const map of maps) {\n errorMessage = map(fullIssue, { data, defaultError: errorMessage }).message;\n }\n return {\n ...issueData,\n path: fullPath,\n message: errorMessage,\n };\n};\nconst EMPTY_PATH = [];\nfunction addIssueToContext(ctx, issueData) {\n const overrideMap = getErrorMap();\n const issue = makeIssue({\n issueData: issueData,\n data: ctx.data,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap, // contextual error map is first priority\n ctx.schemaErrorMap, // then schema-bound map if available\n overrideMap, // then global override map\n overrideMap === errorMap ? undefined : errorMap, // then global default map\n ].filter((x) => !!x),\n });\n ctx.common.issues.push(issue);\n}\nclass ParseStatus {\n constructor() {\n this.value = \"valid\";\n }\n dirty() {\n if (this.value === \"valid\")\n this.value = \"dirty\";\n }\n abort() {\n if (this.value !== \"aborted\")\n this.value = \"aborted\";\n }\n static mergeArray(status, results) {\n const arrayValue = [];\n for (const s of results) {\n if (s.status === \"aborted\")\n return INVALID;\n if (s.status === \"dirty\")\n status.dirty();\n arrayValue.push(s.value);\n }\n return { status: status.value, value: arrayValue };\n }\n static async mergeObjectAsync(status, pairs) {\n const syncPairs = [];\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n syncPairs.push({\n key,\n value,\n });\n }\n return ParseStatus.mergeObjectSync(status, syncPairs);\n }\n static mergeObjectSync(status, pairs) {\n const finalObject = {};\n for (const pair of pairs) {\n const { key, value } = pair;\n if (key.status === \"aborted\")\n return INVALID;\n if (value.status === \"aborted\")\n return INVALID;\n if (key.status === \"dirty\")\n status.dirty();\n if (value.status === \"dirty\")\n status.dirty();\n if (key.value !== \"__proto__\" &&\n (typeof value.value !== \"undefined\" || pair.alwaysSet)) {\n finalObject[key.value] = value.value;\n }\n }\n return { status: status.value, value: finalObject };\n }\n}\nconst INVALID = Object.freeze({\n status: \"aborted\",\n});\nconst DIRTY = (value) => ({ status: \"dirty\", value });\nconst OK = (value) => ({ status: \"valid\", value });\nconst isAborted = (x) => x.status === \"aborted\";\nconst isDirty = (x) => x.status === \"dirty\";\nconst isValid = (x) => x.status === \"valid\";\nconst isAsync = (x) => typeof Promise !== \"undefined\" && x instanceof Promise;\n\n/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n\r\nfunction __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nfunction __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\ntypeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\n\nvar errorUtil;\n(function (errorUtil) {\n errorUtil.errToObj = (message) => typeof message === \"string\" ? { message } : message || {};\n errorUtil.toString = (message) => typeof message === \"string\" ? message : message === null || message === void 0 ? void 0 : message.message;\n})(errorUtil || (errorUtil = {}));\n\nvar _ZodEnum_cache, _ZodNativeEnum_cache;\nclass ParseInputLazyPath {\n constructor(parent, value, path, key) {\n this._cachedPath = [];\n this.parent = parent;\n this.data = value;\n this._path = path;\n this._key = key;\n }\n get path() {\n if (!this._cachedPath.length) {\n if (this._key instanceof Array) {\n this._cachedPath.push(...this._path, ...this._key);\n }\n else {\n this._cachedPath.push(...this._path, this._key);\n }\n }\n return this._cachedPath;\n }\n}\nconst handleResult = (ctx, result) => {\n if (isValid(result)) {\n return { success: true, data: result.value };\n }\n else {\n if (!ctx.common.issues.length) {\n throw new Error(\"Validation failed but no issues detected.\");\n }\n return {\n success: false,\n get error() {\n if (this._error)\n return this._error;\n const error = new ZodError(ctx.common.issues);\n this._error = error;\n return this._error;\n },\n };\n }\n};\nfunction processCreateParams(params) {\n if (!params)\n return {};\n const { errorMap, invalid_type_error, required_error, description } = params;\n if (errorMap && (invalid_type_error || required_error)) {\n throw new Error(`Can't use \"invalid_type_error\" or \"required_error\" in conjunction with custom error map.`);\n }\n if (errorMap)\n return { errorMap: errorMap, description };\n const customMap = (iss, ctx) => {\n var _a, _b;\n const { message } = params;\n if (iss.code === \"invalid_enum_value\") {\n return { message: message !== null && message !== void 0 ? message : ctx.defaultError };\n }\n if (typeof ctx.data === \"undefined\") {\n return { message: (_a = message !== null && message !== void 0 ? message : required_error) !== null && _a !== void 0 ? _a : ctx.defaultError };\n }\n if (iss.code !== \"invalid_type\")\n return { message: ctx.defaultError };\n return { message: (_b = message !== null && message !== void 0 ? message : invalid_type_error) !== null && _b !== void 0 ? _b : ctx.defaultError };\n };\n return { errorMap: customMap, description };\n}\nclass ZodType {\n get description() {\n return this._def.description;\n }\n _getType(input) {\n return getParsedType(input.data);\n }\n _getOrReturnCtx(input, ctx) {\n return (ctx || {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent,\n });\n }\n _processInputParams(input) {\n return {\n status: new ParseStatus(),\n ctx: {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent,\n },\n };\n }\n _parseSync(input) {\n const result = this._parse(input);\n if (isAsync(result)) {\n throw new Error(\"Synchronous parse encountered promise.\");\n }\n return result;\n }\n _parseAsync(input) {\n const result = this._parse(input);\n return Promise.resolve(result);\n }\n parse(data, params) {\n const result = this.safeParse(data, params);\n if (result.success)\n return result.data;\n throw result.error;\n }\n safeParse(data, params) {\n var _a;\n const ctx = {\n common: {\n issues: [],\n async: (_a = params === null || params === void 0 ? void 0 : params.async) !== null && _a !== void 0 ? _a : false,\n contextualErrorMap: params === null || params === void 0 ? void 0 : params.errorMap,\n },\n path: (params === null || params === void 0 ? void 0 : params.path) || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n const result = this._parseSync({ data, path: ctx.path, parent: ctx });\n return handleResult(ctx, result);\n }\n \"~validate\"(data) {\n var _a, _b;\n const ctx = {\n common: {\n issues: [],\n async: !!this[\"~standard\"].async,\n },\n path: [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n if (!this[\"~standard\"].async) {\n try {\n const result = this._parseSync({ data, path: [], parent: ctx });\n return isValid(result)\n ? {\n value: result.value,\n }\n : {\n issues: ctx.common.issues,\n };\n }\n catch (err) {\n if ((_b = (_a = err === null || err === void 0 ? void 0 : err.message) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === null || _b === void 0 ? void 0 : _b.includes(\"encountered\")) {\n this[\"~standard\"].async = true;\n }\n ctx.common = {\n issues: [],\n async: true,\n };\n }\n }\n return this._parseAsync({ data, path: [], parent: ctx }).then((result) => isValid(result)\n ? {\n value: result.value,\n }\n : {\n issues: ctx.common.issues,\n });\n }\n async parseAsync(data, params) {\n const result = await this.safeParseAsync(data, params);\n if (result.success)\n return result.data;\n throw result.error;\n }\n async safeParseAsync(data, params) {\n const ctx = {\n common: {\n issues: [],\n contextualErrorMap: params === null || params === void 0 ? void 0 : params.errorMap,\n async: true,\n },\n path: (params === null || params === void 0 ? void 0 : params.path) || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n const maybeAsyncResult = this._parse({ data, path: ctx.path, parent: ctx });\n const result = await (isAsync(maybeAsyncResult)\n ? maybeAsyncResult\n : Promise.resolve(maybeAsyncResult));\n return handleResult(ctx, result);\n }\n refine(check, message) {\n const getIssueProperties = (val) => {\n if (typeof message === \"string\" || typeof message === \"undefined\") {\n return { message };\n }\n else if (typeof message === \"function\") {\n return message(val);\n }\n else {\n return message;\n }\n };\n return this._refinement((val, ctx) => {\n const result = check(val);\n const setError = () => ctx.addIssue({\n code: ZodIssueCode.custom,\n ...getIssueProperties(val),\n });\n if (typeof Promise !== \"undefined\" && result instanceof Promise) {\n return result.then((data) => {\n if (!data) {\n setError();\n return false;\n }\n else {\n return true;\n }\n });\n }\n if (!result) {\n setError();\n return false;\n }\n else {\n return true;\n }\n });\n }\n refinement(check, refinementData) {\n return this._refinement((val, ctx) => {\n if (!check(val)) {\n ctx.addIssue(typeof refinementData === \"function\"\n ? refinementData(val, ctx)\n : refinementData);\n return false;\n }\n else {\n return true;\n }\n });\n }\n _refinement(refinement) {\n return new ZodEffects({\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: { type: \"refinement\", refinement },\n });\n }\n superRefine(refinement) {\n return this._refinement(refinement);\n }\n constructor(def) {\n /** Alias of safeParseAsync */\n this.spa = this.safeParseAsync;\n this._def = def;\n this.parse = this.parse.bind(this);\n this.safeParse = this.safeParse.bind(this);\n this.parseAsync = this.parseAsync.bind(this);\n this.safeParseAsync = this.safeParseAsync.bind(this);\n this.spa = this.spa.bind(this);\n this.refine = this.refine.bind(this);\n this.refinement = this.refinement.bind(this);\n this.superRefine = this.superRefine.bind(this);\n this.optional = this.optional.bind(this);\n this.nullable = this.nullable.bind(this);\n this.nullish = this.nullish.bind(this);\n this.array = this.array.bind(this);\n this.promise = this.promise.bind(this);\n this.or = this.or.bind(this);\n this.and = this.and.bind(this);\n this.transform = this.transform.bind(this);\n this.brand = this.brand.bind(this);\n this.default = this.default.bind(this);\n this.catch = this.catch.bind(this);\n this.describe = this.describe.bind(this);\n this.pipe = this.pipe.bind(this);\n this.readonly = this.readonly.bind(this);\n this.isNullable = this.isNullable.bind(this);\n this.isOptional = this.isOptional.bind(this);\n this[\"~standard\"] = {\n version: 1,\n vendor: \"zod\",\n validate: (data) => this[\"~validate\"](data),\n };\n }\n optional() {\n return ZodOptional.create(this, this._def);\n }\n nullable() {\n return ZodNullable.create(this, this._def);\n }\n nullish() {\n return this.nullable().optional();\n }\n array() {\n return ZodArray.create(this);\n }\n promise() {\n return ZodPromise.create(this, this._def);\n }\n or(option) {\n return ZodUnion.create([this, option], this._def);\n }\n and(incoming) {\n return ZodIntersection.create(this, incoming, this._def);\n }\n transform(transform) {\n return new ZodEffects({\n ...processCreateParams(this._def),\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: { type: \"transform\", transform },\n });\n }\n default(def) {\n const defaultValueFunc = typeof def === \"function\" ? def : () => def;\n return new ZodDefault({\n ...processCreateParams(this._def),\n innerType: this,\n defaultValue: defaultValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodDefault,\n });\n }\n brand() {\n return new ZodBranded({\n typeName: ZodFirstPartyTypeKind.ZodBranded,\n type: this,\n ...processCreateParams(this._def),\n });\n }\n catch(def) {\n const catchValueFunc = typeof def === \"function\" ? def : () => def;\n return new ZodCatch({\n ...processCreateParams(this._def),\n innerType: this,\n catchValue: catchValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodCatch,\n });\n }\n describe(description) {\n const This = this.constructor;\n return new This({\n ...this._def,\n description,\n });\n }\n pipe(target) {\n return ZodPipeline.create(this, target);\n }\n readonly() {\n return ZodReadonly.create(this);\n }\n isOptional() {\n return this.safeParse(undefined).success;\n }\n isNullable() {\n return this.safeParse(null).success;\n }\n}\nconst cuidRegex = /^c[^\\s-]{8,}$/i;\nconst cuid2Regex = /^[0-9a-z]+$/;\nconst ulidRegex = /^[0-9A-HJKMNP-TV-Z]{26}$/i;\n// const uuidRegex =\n// /^([a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[a-f0-9]{4}-[a-f0-9]{12}|00000000-0000-0000-0000-000000000000)$/i;\nconst uuidRegex = /^[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$/i;\nconst nanoidRegex = /^[a-z0-9_-]{21}$/i;\nconst jwtRegex = /^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]*$/;\nconst durationRegex = /^[-+]?P(?!$)(?:(?:[-+]?\\d+Y)|(?:[-+]?\\d+[.,]\\d+Y$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:(?:[-+]?\\d+W)|(?:[-+]?\\d+[.,]\\d+W$))?(?:(?:[-+]?\\d+D)|(?:[-+]?\\d+[.,]\\d+D$))?(?:T(?=[\\d+-])(?:(?:[-+]?\\d+H)|(?:[-+]?\\d+[.,]\\d+H$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:[-+]?\\d+(?:[.,]\\d+)?S)?)??$/;\n// from https://stackoverflow.com/a/46181/1550155\n// old version: too slow, didn't support unicode\n// const emailRegex = /^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/i;\n//old email regex\n// const emailRegex = /^(([^<>()[\\].,;:\\s@\"]+(\\.[^<>()[\\].,;:\\s@\"]+)*)|(\".+\"))@((?!-)([^<>()[\\].,;:\\s@\"]+\\.)+[^<>()[\\].,;:\\s@\"]{1,})[^-<>()[\\].,;:\\s@\"]$/i;\n// eslint-disable-next-line\n// const emailRegex =\n// /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\])|(\\[IPv6:(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))\\])|([A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])*(\\.[A-Za-z]{2,})+))$/;\n// const emailRegex =\n// /^[a-zA-Z0-9\\.\\!\\#\\$\\%\\&\\'\\*\\+\\/\\=\\?\\^\\_\\`\\{\\|\\}\\~\\-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n// const emailRegex =\n// /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])$/i;\nconst emailRegex = /^(?!\\.)(?!.*\\.\\.)([A-Z0-9_'+\\-\\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\\-]*\\.)+[A-Z]{2,}$/i;\n// const emailRegex =\n// /^[a-z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-z0-9-]+(?:\\.[a-z0-9\\-]+)*$/i;\n// from https://thekevinscott.com/emojis-in-javascript/#writing-a-regular-expression\nconst _emojiRegex = `^(\\\\p{Extended_Pictographic}|\\\\p{Emoji_Component})+$`;\nlet emojiRegex;\n// faster, simpler, safer\nconst ipv4Regex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/;\nconst ipv4CidrRegex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/(3[0-2]|[12]?[0-9])$/;\n// const ipv6Regex =\n// /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/;\nconst ipv6Regex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/;\nconst ipv6CidrRegex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/;\n// https://stackoverflow.com/questions/7860392/determine-if-string-is-in-base64-using-javascript\nconst base64Regex = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/;\n// https://base64.guru/standards/base64url\nconst base64urlRegex = /^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/;\n// simple\n// const dateRegexSource = `\\\\d{4}-\\\\d{2}-\\\\d{2}`;\n// no leap year validation\n// const dateRegexSource = `\\\\d{4}-((0[13578]|10|12)-31|(0[13-9]|1[0-2])-30|(0[1-9]|1[0-2])-(0[1-9]|1\\\\d|2\\\\d))`;\n// with leap year validation\nconst dateRegexSource = `((\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\\\d|30)|(02)-(0[1-9]|1\\\\d|2[0-8])))`;\nconst dateRegex = new RegExp(`^${dateRegexSource}$`);\nfunction timeRegexSource(args) {\n // let regex = `\\\\d{2}:\\\\d{2}:\\\\d{2}`;\n let regex = `([01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d`;\n if (args.precision) {\n regex = `${regex}\\\\.\\\\d{${args.precision}}`;\n }\n else if (args.precision == null) {\n regex = `${regex}(\\\\.\\\\d+)?`;\n }\n return regex;\n}\nfunction timeRegex(args) {\n return new RegExp(`^${timeRegexSource(args)}$`);\n}\n// Adapted from https://stackoverflow.com/a/3143231\nfunction datetimeRegex(args) {\n let regex = `${dateRegexSource}T${timeRegexSource(args)}`;\n const opts = [];\n opts.push(args.local ? `Z?` : `Z`);\n if (args.offset)\n opts.push(`([+-]\\\\d{2}:?\\\\d{2})`);\n regex = `${regex}(${opts.join(\"|\")})`;\n return new RegExp(`^${regex}$`);\n}\nfunction isValidIP(ip, version) {\n if ((version === \"v4\" || !version) && ipv4Regex.test(ip)) {\n return true;\n }\n if ((version === \"v6\" || !version) && ipv6Regex.test(ip)) {\n return true;\n }\n return false;\n}\nfunction isValidJWT(jwt, alg) {\n if (!jwtRegex.test(jwt))\n return false;\n try {\n const [header] = jwt.split(\".\");\n // Convert base64url to base64\n const base64 = header\n .replace(/-/g, \"+\")\n .replace(/_/g, \"/\")\n .padEnd(header.length + ((4 - (header.length % 4)) % 4), \"=\");\n const decoded = JSON.parse(atob(base64));\n if (typeof decoded !== \"object\" || decoded === null)\n return false;\n if (!decoded.typ || !decoded.alg)\n return false;\n if (alg && decoded.alg !== alg)\n return false;\n return true;\n }\n catch (_a) {\n return false;\n }\n}\nfunction isValidCidr(ip, version) {\n if ((version === \"v4\" || !version) && ipv4CidrRegex.test(ip)) {\n return true;\n }\n if ((version === \"v6\" || !version) && ipv6CidrRegex.test(ip)) {\n return true;\n }\n return false;\n}\nclass ZodString extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = String(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.string) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.string,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n if (input.data.length < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n if (input.data.length > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"length\") {\n const tooBig = input.data.length > check.value;\n const tooSmall = input.data.length < check.value;\n if (tooBig || tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n if (tooBig) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n exact: true,\n message: check.message,\n });\n }\n else if (tooSmall) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n exact: true,\n message: check.message,\n });\n }\n status.dirty();\n }\n }\n else if (check.kind === \"email\") {\n if (!emailRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"email\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"emoji\") {\n if (!emojiRegex) {\n emojiRegex = new RegExp(_emojiRegex, \"u\");\n }\n if (!emojiRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"emoji\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"uuid\") {\n if (!uuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"uuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"nanoid\") {\n if (!nanoidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"nanoid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cuid\") {\n if (!cuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cuid2\") {\n if (!cuid2Regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid2\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"ulid\") {\n if (!ulidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"ulid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"url\") {\n try {\n new URL(input.data);\n }\n catch (_a) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"url\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"regex\") {\n check.regex.lastIndex = 0;\n const testResult = check.regex.test(input.data);\n if (!testResult) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"regex\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"trim\") {\n input.data = input.data.trim();\n }\n else if (check.kind === \"includes\") {\n if (!input.data.includes(check.value, check.position)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { includes: check.value, position: check.position },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"toLowerCase\") {\n input.data = input.data.toLowerCase();\n }\n else if (check.kind === \"toUpperCase\") {\n input.data = input.data.toUpperCase();\n }\n else if (check.kind === \"startsWith\") {\n if (!input.data.startsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { startsWith: check.value },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"endsWith\") {\n if (!input.data.endsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { endsWith: check.value },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"datetime\") {\n const regex = datetimeRegex(check);\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"datetime\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"date\") {\n const regex = dateRegex;\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"date\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"time\") {\n const regex = timeRegex(check);\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"time\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"duration\") {\n if (!durationRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"duration\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"ip\") {\n if (!isValidIP(input.data, check.version)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"ip\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"jwt\") {\n if (!isValidJWT(input.data, check.alg)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"jwt\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cidr\") {\n if (!isValidCidr(input.data, check.version)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cidr\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"base64\") {\n if (!base64Regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"base64\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"base64url\") {\n if (!base64urlRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"base64url\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n _regex(regex, validation, message) {\n return this.refinement((data) => regex.test(data), {\n validation,\n code: ZodIssueCode.invalid_string,\n ...errorUtil.errToObj(message),\n });\n }\n _addCheck(check) {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n email(message) {\n return this._addCheck({ kind: \"email\", ...errorUtil.errToObj(message) });\n }\n url(message) {\n return this._addCheck({ kind: \"url\", ...errorUtil.errToObj(message) });\n }\n emoji(message) {\n return this._addCheck({ kind: \"emoji\", ...errorUtil.errToObj(message) });\n }\n uuid(message) {\n return this._addCheck({ kind: \"uuid\", ...errorUtil.errToObj(message) });\n }\n nanoid(message) {\n return this._addCheck({ kind: \"nanoid\", ...errorUtil.errToObj(message) });\n }\n cuid(message) {\n return this._addCheck({ kind: \"cuid\", ...errorUtil.errToObj(message) });\n }\n cuid2(message) {\n return this._addCheck({ kind: \"cuid2\", ...errorUtil.errToObj(message) });\n }\n ulid(message) {\n return this._addCheck({ kind: \"ulid\", ...errorUtil.errToObj(message) });\n }\n base64(message) {\n return this._addCheck({ kind: \"base64\", ...errorUtil.errToObj(message) });\n }\n base64url(message) {\n // base64url encoding is a modification of base64 that can safely be used in URLs and filenames\n return this._addCheck({\n kind: \"base64url\",\n ...errorUtil.errToObj(message),\n });\n }\n jwt(options) {\n return this._addCheck({ kind: \"jwt\", ...errorUtil.errToObj(options) });\n }\n ip(options) {\n return this._addCheck({ kind: \"ip\", ...errorUtil.errToObj(options) });\n }\n cidr(options) {\n return this._addCheck({ kind: \"cidr\", ...errorUtil.errToObj(options) });\n }\n datetime(options) {\n var _a, _b;\n if (typeof options === \"string\") {\n return this._addCheck({\n kind: \"datetime\",\n precision: null,\n offset: false,\n local: false,\n message: options,\n });\n }\n return this._addCheck({\n kind: \"datetime\",\n precision: typeof (options === null || options === void 0 ? void 0 : options.precision) === \"undefined\" ? null : options === null || options === void 0 ? void 0 : options.precision,\n offset: (_a = options === null || options === void 0 ? void 0 : options.offset) !== null && _a !== void 0 ? _a : false,\n local: (_b = options === null || options === void 0 ? void 0 : options.local) !== null && _b !== void 0 ? _b : false,\n ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message),\n });\n }\n date(message) {\n return this._addCheck({ kind: \"date\", message });\n }\n time(options) {\n if (typeof options === \"string\") {\n return this._addCheck({\n kind: \"time\",\n precision: null,\n message: options,\n });\n }\n return this._addCheck({\n kind: \"time\",\n precision: typeof (options === null || options === void 0 ? void 0 : options.precision) === \"undefined\" ? null : options === null || options === void 0 ? void 0 : options.precision,\n ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message),\n });\n }\n duration(message) {\n return this._addCheck({ kind: \"duration\", ...errorUtil.errToObj(message) });\n }\n regex(regex, message) {\n return this._addCheck({\n kind: \"regex\",\n regex: regex,\n ...errorUtil.errToObj(message),\n });\n }\n includes(value, options) {\n return this._addCheck({\n kind: \"includes\",\n value: value,\n position: options === null || options === void 0 ? void 0 : options.position,\n ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message),\n });\n }\n startsWith(value, message) {\n return this._addCheck({\n kind: \"startsWith\",\n value: value,\n ...errorUtil.errToObj(message),\n });\n }\n endsWith(value, message) {\n return this._addCheck({\n kind: \"endsWith\",\n value: value,\n ...errorUtil.errToObj(message),\n });\n }\n min(minLength, message) {\n return this._addCheck({\n kind: \"min\",\n value: minLength,\n ...errorUtil.errToObj(message),\n });\n }\n max(maxLength, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxLength,\n ...errorUtil.errToObj(message),\n });\n }\n length(len, message) {\n return this._addCheck({\n kind: \"length\",\n value: len,\n ...errorUtil.errToObj(message),\n });\n }\n /**\n * Equivalent to `.min(1)`\n */\n nonempty(message) {\n return this.min(1, errorUtil.errToObj(message));\n }\n trim() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"trim\" }],\n });\n }\n toLowerCase() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"toLowerCase\" }],\n });\n }\n toUpperCase() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"toUpperCase\" }],\n });\n }\n get isDatetime() {\n return !!this._def.checks.find((ch) => ch.kind === \"datetime\");\n }\n get isDate() {\n return !!this._def.checks.find((ch) => ch.kind === \"date\");\n }\n get isTime() {\n return !!this._def.checks.find((ch) => ch.kind === \"time\");\n }\n get isDuration() {\n return !!this._def.checks.find((ch) => ch.kind === \"duration\");\n }\n get isEmail() {\n return !!this._def.checks.find((ch) => ch.kind === \"email\");\n }\n get isURL() {\n return !!this._def.checks.find((ch) => ch.kind === \"url\");\n }\n get isEmoji() {\n return !!this._def.checks.find((ch) => ch.kind === \"emoji\");\n }\n get isUUID() {\n return !!this._def.checks.find((ch) => ch.kind === \"uuid\");\n }\n get isNANOID() {\n return !!this._def.checks.find((ch) => ch.kind === \"nanoid\");\n }\n get isCUID() {\n return !!this._def.checks.find((ch) => ch.kind === \"cuid\");\n }\n get isCUID2() {\n return !!this._def.checks.find((ch) => ch.kind === \"cuid2\");\n }\n get isULID() {\n return !!this._def.checks.find((ch) => ch.kind === \"ulid\");\n }\n get isIP() {\n return !!this._def.checks.find((ch) => ch.kind === \"ip\");\n }\n get isCIDR() {\n return !!this._def.checks.find((ch) => ch.kind === \"cidr\");\n }\n get isBase64() {\n return !!this._def.checks.find((ch) => ch.kind === \"base64\");\n }\n get isBase64url() {\n // base64url encoding is a modification of base64 that can safely be used in URLs and filenames\n return !!this._def.checks.find((ch) => ch.kind === \"base64url\");\n }\n get minLength() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxLength() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n}\nZodString.create = (params) => {\n var _a;\n return new ZodString({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodString,\n coerce: (_a = params === null || params === void 0 ? void 0 : params.coerce) !== null && _a !== void 0 ? _a : false,\n ...processCreateParams(params),\n });\n};\n// https://stackoverflow.com/questions/3966484/why-does-modulus-operator-return-fractional-number-in-javascript/31711034#31711034\nfunction floatSafeRemainder(val, step) {\n const valDecCount = (val.toString().split(\".\")[1] || \"\").length;\n const stepDecCount = (step.toString().split(\".\")[1] || \"\").length;\n const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount;\n const valInt = parseInt(val.toFixed(decCount).replace(\".\", \"\"));\n const stepInt = parseInt(step.toFixed(decCount).replace(\".\", \"\"));\n return (valInt % stepInt) / Math.pow(10, decCount);\n}\nclass ZodNumber extends ZodType {\n constructor() {\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n this.step = this.multipleOf;\n }\n _parse(input) {\n if (this._def.coerce) {\n input.data = Number(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.number) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.number,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks) {\n if (check.kind === \"int\") {\n if (!util.isInteger(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: \"integer\",\n received: \"float\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"min\") {\n const tooSmall = check.inclusive\n ? input.data < check.value\n : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n const tooBig = check.inclusive\n ? input.data > check.value\n : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"multipleOf\") {\n if (floatSafeRemainder(input.data, check.value) !== 0) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"finite\") {\n if (!Number.isFinite(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_finite,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodNumber({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message),\n },\n ],\n });\n }\n _addCheck(check) {\n return new ZodNumber({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n int(message) {\n return this._addCheck({\n kind: \"int\",\n message: errorUtil.toString(message),\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value: value,\n message: errorUtil.toString(message),\n });\n }\n finite(message) {\n return this._addCheck({\n kind: \"finite\",\n message: errorUtil.toString(message),\n });\n }\n safe(message) {\n return this._addCheck({\n kind: \"min\",\n inclusive: true,\n value: Number.MIN_SAFE_INTEGER,\n message: errorUtil.toString(message),\n })._addCheck({\n kind: \"max\",\n inclusive: true,\n value: Number.MAX_SAFE_INTEGER,\n message: errorUtil.toString(message),\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n get isInt() {\n return !!this._def.checks.find((ch) => ch.kind === \"int\" ||\n (ch.kind === \"multipleOf\" && util.isInteger(ch.value)));\n }\n get isFinite() {\n let max = null, min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"finite\" ||\n ch.kind === \"int\" ||\n ch.kind === \"multipleOf\") {\n return true;\n }\n else if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n else if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return Number.isFinite(min) && Number.isFinite(max);\n }\n}\nZodNumber.create = (params) => {\n return new ZodNumber({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodNumber,\n coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false,\n ...processCreateParams(params),\n });\n};\nclass ZodBigInt extends ZodType {\n constructor() {\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n }\n _parse(input) {\n if (this._def.coerce) {\n try {\n input.data = BigInt(input.data);\n }\n catch (_a) {\n return this._getInvalidInput(input);\n }\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.bigint) {\n return this._getInvalidInput(input);\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n const tooSmall = check.inclusive\n ? input.data < check.value\n : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n type: \"bigint\",\n minimum: check.value,\n inclusive: check.inclusive,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n const tooBig = check.inclusive\n ? input.data > check.value\n : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n type: \"bigint\",\n maximum: check.value,\n inclusive: check.inclusive,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"multipleOf\") {\n if (input.data % check.value !== BigInt(0)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n _getInvalidInput(input) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.bigint,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodBigInt({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message),\n },\n ],\n });\n }\n _addCheck(check) {\n return new ZodBigInt({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value,\n message: errorUtil.toString(message),\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n}\nZodBigInt.create = (params) => {\n var _a;\n return new ZodBigInt({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodBigInt,\n coerce: (_a = params === null || params === void 0 ? void 0 : params.coerce) !== null && _a !== void 0 ? _a : false,\n ...processCreateParams(params),\n });\n};\nclass ZodBoolean extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = Boolean(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.boolean) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.boolean,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodBoolean.create = (params) => {\n return new ZodBoolean({\n typeName: ZodFirstPartyTypeKind.ZodBoolean,\n coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false,\n ...processCreateParams(params),\n });\n};\nclass ZodDate extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = new Date(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.date) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.date,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (isNaN(input.data.getTime())) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_date,\n });\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n if (input.data.getTime() < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n message: check.message,\n inclusive: true,\n exact: false,\n minimum: check.value,\n type: \"date\",\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n if (input.data.getTime() > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n message: check.message,\n inclusive: true,\n exact: false,\n maximum: check.value,\n type: \"date\",\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return {\n status: status.value,\n value: new Date(input.data.getTime()),\n };\n }\n _addCheck(check) {\n return new ZodDate({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n min(minDate, message) {\n return this._addCheck({\n kind: \"min\",\n value: minDate.getTime(),\n message: errorUtil.toString(message),\n });\n }\n max(maxDate, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxDate.getTime(),\n message: errorUtil.toString(message),\n });\n }\n get minDate() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min != null ? new Date(min) : null;\n }\n get maxDate() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max != null ? new Date(max) : null;\n }\n}\nZodDate.create = (params) => {\n return new ZodDate({\n checks: [],\n coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false,\n typeName: ZodFirstPartyTypeKind.ZodDate,\n ...processCreateParams(params),\n });\n};\nclass ZodSymbol extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.symbol) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.symbol,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodSymbol.create = (params) => {\n return new ZodSymbol({\n typeName: ZodFirstPartyTypeKind.ZodSymbol,\n ...processCreateParams(params),\n });\n};\nclass ZodUndefined extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.undefined,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodUndefined.create = (params) => {\n return new ZodUndefined({\n typeName: ZodFirstPartyTypeKind.ZodUndefined,\n ...processCreateParams(params),\n });\n};\nclass ZodNull extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.null) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.null,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodNull.create = (params) => {\n return new ZodNull({\n typeName: ZodFirstPartyTypeKind.ZodNull,\n ...processCreateParams(params),\n });\n};\nclass ZodAny extends ZodType {\n constructor() {\n super(...arguments);\n // to prevent instances of other classes from extending ZodAny. this causes issues with catchall in ZodObject.\n this._any = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodAny.create = (params) => {\n return new ZodAny({\n typeName: ZodFirstPartyTypeKind.ZodAny,\n ...processCreateParams(params),\n });\n};\nclass ZodUnknown extends ZodType {\n constructor() {\n super(...arguments);\n // required\n this._unknown = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodUnknown.create = (params) => {\n return new ZodUnknown({\n typeName: ZodFirstPartyTypeKind.ZodUnknown,\n ...processCreateParams(params),\n });\n};\nclass ZodNever extends ZodType {\n _parse(input) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.never,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n}\nZodNever.create = (params) => {\n return new ZodNever({\n typeName: ZodFirstPartyTypeKind.ZodNever,\n ...processCreateParams(params),\n });\n};\nclass ZodVoid extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.void,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodVoid.create = (params) => {\n return new ZodVoid({\n typeName: ZodFirstPartyTypeKind.ZodVoid,\n ...processCreateParams(params),\n });\n};\nclass ZodArray extends ZodType {\n _parse(input) {\n const { ctx, status } = this._processInputParams(input);\n const def = this._def;\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (def.exactLength !== null) {\n const tooBig = ctx.data.length > def.exactLength.value;\n const tooSmall = ctx.data.length < def.exactLength.value;\n if (tooBig || tooSmall) {\n addIssueToContext(ctx, {\n code: tooBig ? ZodIssueCode.too_big : ZodIssueCode.too_small,\n minimum: (tooSmall ? def.exactLength.value : undefined),\n maximum: (tooBig ? def.exactLength.value : undefined),\n type: \"array\",\n inclusive: true,\n exact: true,\n message: def.exactLength.message,\n });\n status.dirty();\n }\n }\n if (def.minLength !== null) {\n if (ctx.data.length < def.minLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minLength.value,\n type: \"array\",\n inclusive: true,\n exact: false,\n message: def.minLength.message,\n });\n status.dirty();\n }\n }\n if (def.maxLength !== null) {\n if (ctx.data.length > def.maxLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxLength.value,\n type: \"array\",\n inclusive: true,\n exact: false,\n message: def.maxLength.message,\n });\n status.dirty();\n }\n }\n if (ctx.common.async) {\n return Promise.all([...ctx.data].map((item, i) => {\n return def.type._parseAsync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n })).then((result) => {\n return ParseStatus.mergeArray(status, result);\n });\n }\n const result = [...ctx.data].map((item, i) => {\n return def.type._parseSync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n });\n return ParseStatus.mergeArray(status, result);\n }\n get element() {\n return this._def.type;\n }\n min(minLength, message) {\n return new ZodArray({\n ...this._def,\n minLength: { value: minLength, message: errorUtil.toString(message) },\n });\n }\n max(maxLength, message) {\n return new ZodArray({\n ...this._def,\n maxLength: { value: maxLength, message: errorUtil.toString(message) },\n });\n }\n length(len, message) {\n return new ZodArray({\n ...this._def,\n exactLength: { value: len, message: errorUtil.toString(message) },\n });\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodArray.create = (schema, params) => {\n return new ZodArray({\n type: schema,\n minLength: null,\n maxLength: null,\n exactLength: null,\n typeName: ZodFirstPartyTypeKind.ZodArray,\n ...processCreateParams(params),\n });\n};\nfunction deepPartialify(schema) {\n if (schema instanceof ZodObject) {\n const newShape = {};\n for (const key in schema.shape) {\n const fieldSchema = schema.shape[key];\n newShape[key] = ZodOptional.create(deepPartialify(fieldSchema));\n }\n return new ZodObject({\n ...schema._def,\n shape: () => newShape,\n });\n }\n else if (schema instanceof ZodArray) {\n return new ZodArray({\n ...schema._def,\n type: deepPartialify(schema.element),\n });\n }\n else if (schema instanceof ZodOptional) {\n return ZodOptional.create(deepPartialify(schema.unwrap()));\n }\n else if (schema instanceof ZodNullable) {\n return ZodNullable.create(deepPartialify(schema.unwrap()));\n }\n else if (schema instanceof ZodTuple) {\n return ZodTuple.create(schema.items.map((item) => deepPartialify(item)));\n }\n else {\n return schema;\n }\n}\nclass ZodObject extends ZodType {\n constructor() {\n super(...arguments);\n this._cached = null;\n /**\n * @deprecated In most cases, this is no longer needed - unknown properties are now silently stripped.\n * If you want to pass through unknown properties, use `.passthrough()` instead.\n */\n this.nonstrict = this.passthrough;\n // extend<\n // Augmentation extends ZodRawShape,\n // NewOutput extends util.flatten<{\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // }>,\n // NewInput extends util.flatten<{\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }>\n // >(\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape,\n // UnknownKeys,\n // Catchall,\n // NewOutput,\n // NewInput\n // > {\n // return new ZodObject({\n // ...this._def,\n // shape: () => ({\n // ...this._def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // }\n /**\n * @deprecated Use `.extend` instead\n * */\n this.augment = this.extend;\n }\n _getCached() {\n if (this._cached !== null)\n return this._cached;\n const shape = this._def.shape();\n const keys = util.objectKeys(shape);\n return (this._cached = { shape, keys });\n }\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.object) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const { status, ctx } = this._processInputParams(input);\n const { shape, keys: shapeKeys } = this._getCached();\n const extraKeys = [];\n if (!(this._def.catchall instanceof ZodNever &&\n this._def.unknownKeys === \"strip\")) {\n for (const key in ctx.data) {\n if (!shapeKeys.includes(key)) {\n extraKeys.push(key);\n }\n }\n }\n const pairs = [];\n for (const key of shapeKeys) {\n const keyValidator = shape[key];\n const value = ctx.data[key];\n pairs.push({\n key: { status: \"valid\", value: key },\n value: keyValidator._parse(new ParseInputLazyPath(ctx, value, ctx.path, key)),\n alwaysSet: key in ctx.data,\n });\n }\n if (this._def.catchall instanceof ZodNever) {\n const unknownKeys = this._def.unknownKeys;\n if (unknownKeys === \"passthrough\") {\n for (const key of extraKeys) {\n pairs.push({\n key: { status: \"valid\", value: key },\n value: { status: \"valid\", value: ctx.data[key] },\n });\n }\n }\n else if (unknownKeys === \"strict\") {\n if (extraKeys.length > 0) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.unrecognized_keys,\n keys: extraKeys,\n });\n status.dirty();\n }\n }\n else if (unknownKeys === \"strip\") ;\n else {\n throw new Error(`Internal ZodObject error: invalid unknownKeys value.`);\n }\n }\n else {\n // run catchall validation\n const catchall = this._def.catchall;\n for (const key of extraKeys) {\n const value = ctx.data[key];\n pairs.push({\n key: { status: \"valid\", value: key },\n value: catchall._parse(new ParseInputLazyPath(ctx, value, ctx.path, key) //, ctx.child(key), value, getParsedType(value)\n ),\n alwaysSet: key in ctx.data,\n });\n }\n }\n if (ctx.common.async) {\n return Promise.resolve()\n .then(async () => {\n const syncPairs = [];\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n syncPairs.push({\n key,\n value,\n alwaysSet: pair.alwaysSet,\n });\n }\n return syncPairs;\n })\n .then((syncPairs) => {\n return ParseStatus.mergeObjectSync(status, syncPairs);\n });\n }\n else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get shape() {\n return this._def.shape();\n }\n strict(message) {\n errorUtil.errToObj;\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strict\",\n ...(message !== undefined\n ? {\n errorMap: (issue, ctx) => {\n var _a, _b, _c, _d;\n const defaultError = (_c = (_b = (_a = this._def).errorMap) === null || _b === void 0 ? void 0 : _b.call(_a, issue, ctx).message) !== null && _c !== void 0 ? _c : ctx.defaultError;\n if (issue.code === \"unrecognized_keys\")\n return {\n message: (_d = errorUtil.errToObj(message).message) !== null && _d !== void 0 ? _d : defaultError,\n };\n return {\n message: defaultError,\n };\n },\n }\n : {}),\n });\n }\n strip() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strip\",\n });\n }\n passthrough() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"passthrough\",\n });\n }\n // const AugmentFactory =\n // (def: Def) =>\n // (\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape, Augmentation>,\n // Def[\"unknownKeys\"],\n // Def[\"catchall\"]\n // > => {\n // return new ZodObject({\n // ...def,\n // shape: () => ({\n // ...def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // };\n extend(augmentation) {\n return new ZodObject({\n ...this._def,\n shape: () => ({\n ...this._def.shape(),\n ...augmentation,\n }),\n });\n }\n /**\n * Prior to zod@1.0.12 there was a bug in the\n * inferred type of merged objects. Please\n * upgrade if you are experiencing issues.\n */\n merge(merging) {\n const merged = new ZodObject({\n unknownKeys: merging._def.unknownKeys,\n catchall: merging._def.catchall,\n shape: () => ({\n ...this._def.shape(),\n ...merging._def.shape(),\n }),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n });\n return merged;\n }\n // merge<\n // Incoming extends AnyZodObject,\n // Augmentation extends Incoming[\"shape\"],\n // NewOutput extends {\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // },\n // NewInput extends {\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }\n // >(\n // merging: Incoming\n // ): ZodObject<\n // extendShape>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"],\n // NewOutput,\n // NewInput\n // > {\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n setKey(key, schema) {\n return this.augment({ [key]: schema });\n }\n // merge(\n // merging: Incoming\n // ): //ZodObject = (merging) => {\n // ZodObject<\n // extendShape>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"]\n // > {\n // // const mergedShape = objectUtil.mergeShapes(\n // // this._def.shape(),\n // // merging._def.shape()\n // // );\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n catchall(index) {\n return new ZodObject({\n ...this._def,\n catchall: index,\n });\n }\n pick(mask) {\n const shape = {};\n util.objectKeys(mask).forEach((key) => {\n if (mask[key] && this.shape[key]) {\n shape[key] = this.shape[key];\n }\n });\n return new ZodObject({\n ...this._def,\n shape: () => shape,\n });\n }\n omit(mask) {\n const shape = {};\n util.objectKeys(this.shape).forEach((key) => {\n if (!mask[key]) {\n shape[key] = this.shape[key];\n }\n });\n return new ZodObject({\n ...this._def,\n shape: () => shape,\n });\n }\n /**\n * @deprecated\n */\n deepPartial() {\n return deepPartialify(this);\n }\n partial(mask) {\n const newShape = {};\n util.objectKeys(this.shape).forEach((key) => {\n const fieldSchema = this.shape[key];\n if (mask && !mask[key]) {\n newShape[key] = fieldSchema;\n }\n else {\n newShape[key] = fieldSchema.optional();\n }\n });\n return new ZodObject({\n ...this._def,\n shape: () => newShape,\n });\n }\n required(mask) {\n const newShape = {};\n util.objectKeys(this.shape).forEach((key) => {\n if (mask && !mask[key]) {\n newShape[key] = this.shape[key];\n }\n else {\n const fieldSchema = this.shape[key];\n let newField = fieldSchema;\n while (newField instanceof ZodOptional) {\n newField = newField._def.innerType;\n }\n newShape[key] = newField;\n }\n });\n return new ZodObject({\n ...this._def,\n shape: () => newShape,\n });\n }\n keyof() {\n return createZodEnum(util.objectKeys(this.shape));\n }\n}\nZodObject.create = (shape, params) => {\n return new ZodObject({\n shape: () => shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nZodObject.strictCreate = (shape, params) => {\n return new ZodObject({\n shape: () => shape,\n unknownKeys: \"strict\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nZodObject.lazycreate = (shape, params) => {\n return new ZodObject({\n shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nclass ZodUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const options = this._def.options;\n function handleResults(results) {\n // return first issue-free validation if it exists\n for (const result of results) {\n if (result.result.status === \"valid\") {\n return result.result;\n }\n }\n for (const result of results) {\n if (result.result.status === \"dirty\") {\n // add issues from dirty option\n ctx.common.issues.push(...result.ctx.common.issues);\n return result.result;\n }\n }\n // return invalid\n const unionErrors = results.map((result) => new ZodError(result.ctx.common.issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors,\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return Promise.all(options.map(async (option) => {\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n parent: null,\n };\n return {\n result: await option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx,\n }),\n ctx: childCtx,\n };\n })).then(handleResults);\n }\n else {\n let dirty = undefined;\n const issues = [];\n for (const option of options) {\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n parent: null,\n };\n const result = option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx,\n });\n if (result.status === \"valid\") {\n return result;\n }\n else if (result.status === \"dirty\" && !dirty) {\n dirty = { result, ctx: childCtx };\n }\n if (childCtx.common.issues.length) {\n issues.push(childCtx.common.issues);\n }\n }\n if (dirty) {\n ctx.common.issues.push(...dirty.ctx.common.issues);\n return dirty.result;\n }\n const unionErrors = issues.map((issues) => new ZodError(issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors,\n });\n return INVALID;\n }\n }\n get options() {\n return this._def.options;\n }\n}\nZodUnion.create = (types, params) => {\n return new ZodUnion({\n options: types,\n typeName: ZodFirstPartyTypeKind.ZodUnion,\n ...processCreateParams(params),\n });\n};\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\n////////// //////////\n////////// ZodDiscriminatedUnion //////////\n////////// //////////\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\nconst getDiscriminator = (type) => {\n if (type instanceof ZodLazy) {\n return getDiscriminator(type.schema);\n }\n else if (type instanceof ZodEffects) {\n return getDiscriminator(type.innerType());\n }\n else if (type instanceof ZodLiteral) {\n return [type.value];\n }\n else if (type instanceof ZodEnum) {\n return type.options;\n }\n else if (type instanceof ZodNativeEnum) {\n // eslint-disable-next-line ban/ban\n return util.objectValues(type.enum);\n }\n else if (type instanceof ZodDefault) {\n return getDiscriminator(type._def.innerType);\n }\n else if (type instanceof ZodUndefined) {\n return [undefined];\n }\n else if (type instanceof ZodNull) {\n return [null];\n }\n else if (type instanceof ZodOptional) {\n return [undefined, ...getDiscriminator(type.unwrap())];\n }\n else if (type instanceof ZodNullable) {\n return [null, ...getDiscriminator(type.unwrap())];\n }\n else if (type instanceof ZodBranded) {\n return getDiscriminator(type.unwrap());\n }\n else if (type instanceof ZodReadonly) {\n return getDiscriminator(type.unwrap());\n }\n else if (type instanceof ZodCatch) {\n return getDiscriminator(type._def.innerType);\n }\n else {\n return [];\n }\n};\nclass ZodDiscriminatedUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const discriminator = this.discriminator;\n const discriminatorValue = ctx.data[discriminator];\n const option = this.optionsMap.get(discriminatorValue);\n if (!option) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union_discriminator,\n options: Array.from(this.optionsMap.keys()),\n path: [discriminator],\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n }\n else {\n return option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n get discriminator() {\n return this._def.discriminator;\n }\n get options() {\n return this._def.options;\n }\n get optionsMap() {\n return this._def.optionsMap;\n }\n /**\n * The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor.\n * However, it only allows a union of objects, all of which need to share a discriminator property. This property must\n * have a different value for each object in the union.\n * @param discriminator the name of the discriminator property\n * @param types an array of object schemas\n * @param params\n */\n static create(discriminator, options, params) {\n // Get all the valid discriminator values\n const optionsMap = new Map();\n // try {\n for (const type of options) {\n const discriminatorValues = getDiscriminator(type.shape[discriminator]);\n if (!discriminatorValues.length) {\n throw new Error(`A discriminator value for key \\`${discriminator}\\` could not be extracted from all schema options`);\n }\n for (const value of discriminatorValues) {\n if (optionsMap.has(value)) {\n throw new Error(`Discriminator property ${String(discriminator)} has duplicate value ${String(value)}`);\n }\n optionsMap.set(value, type);\n }\n }\n return new ZodDiscriminatedUnion({\n typeName: ZodFirstPartyTypeKind.ZodDiscriminatedUnion,\n discriminator,\n options,\n optionsMap,\n ...processCreateParams(params),\n });\n }\n}\nfunction mergeValues(a, b) {\n const aType = getParsedType(a);\n const bType = getParsedType(b);\n if (a === b) {\n return { valid: true, data: a };\n }\n else if (aType === ZodParsedType.object && bType === ZodParsedType.object) {\n const bKeys = util.objectKeys(b);\n const sharedKeys = util\n .objectKeys(a)\n .filter((key) => bKeys.indexOf(key) !== -1);\n const newObj = { ...a, ...b };\n for (const key of sharedKeys) {\n const sharedValue = mergeValues(a[key], b[key]);\n if (!sharedValue.valid) {\n return { valid: false };\n }\n newObj[key] = sharedValue.data;\n }\n return { valid: true, data: newObj };\n }\n else if (aType === ZodParsedType.array && bType === ZodParsedType.array) {\n if (a.length !== b.length) {\n return { valid: false };\n }\n const newArray = [];\n for (let index = 0; index < a.length; index++) {\n const itemA = a[index];\n const itemB = b[index];\n const sharedValue = mergeValues(itemA, itemB);\n if (!sharedValue.valid) {\n return { valid: false };\n }\n newArray.push(sharedValue.data);\n }\n return { valid: true, data: newArray };\n }\n else if (aType === ZodParsedType.date &&\n bType === ZodParsedType.date &&\n +a === +b) {\n return { valid: true, data: a };\n }\n else {\n return { valid: false };\n }\n}\nclass ZodIntersection extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const handleParsed = (parsedLeft, parsedRight) => {\n if (isAborted(parsedLeft) || isAborted(parsedRight)) {\n return INVALID;\n }\n const merged = mergeValues(parsedLeft.value, parsedRight.value);\n if (!merged.valid) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_intersection_types,\n });\n return INVALID;\n }\n if (isDirty(parsedLeft) || isDirty(parsedRight)) {\n status.dirty();\n }\n return { status: status.value, value: merged.data };\n };\n if (ctx.common.async) {\n return Promise.all([\n this._def.left._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }),\n this._def.right._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }),\n ]).then(([left, right]) => handleParsed(left, right));\n }\n else {\n return handleParsed(this._def.left._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }), this._def.right._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }));\n }\n }\n}\nZodIntersection.create = (left, right, params) => {\n return new ZodIntersection({\n left: left,\n right: right,\n typeName: ZodFirstPartyTypeKind.ZodIntersection,\n ...processCreateParams(params),\n });\n};\nclass ZodTuple extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (ctx.data.length < this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: \"array\",\n });\n return INVALID;\n }\n const rest = this._def.rest;\n if (!rest && ctx.data.length > this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: \"array\",\n });\n status.dirty();\n }\n const items = [...ctx.data]\n .map((item, itemIndex) => {\n const schema = this._def.items[itemIndex] || this._def.rest;\n if (!schema)\n return null;\n return schema._parse(new ParseInputLazyPath(ctx, item, ctx.path, itemIndex));\n })\n .filter((x) => !!x); // filter nulls\n if (ctx.common.async) {\n return Promise.all(items).then((results) => {\n return ParseStatus.mergeArray(status, results);\n });\n }\n else {\n return ParseStatus.mergeArray(status, items);\n }\n }\n get items() {\n return this._def.items;\n }\n rest(rest) {\n return new ZodTuple({\n ...this._def,\n rest,\n });\n }\n}\nZodTuple.create = (schemas, params) => {\n if (!Array.isArray(schemas)) {\n throw new Error(\"You must pass an array of schemas to z.tuple([ ... ])\");\n }\n return new ZodTuple({\n items: schemas,\n typeName: ZodFirstPartyTypeKind.ZodTuple,\n rest: null,\n ...processCreateParams(params),\n });\n};\nclass ZodRecord extends ZodType {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const pairs = [];\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n for (const key in ctx.data) {\n pairs.push({\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, key)),\n value: valueType._parse(new ParseInputLazyPath(ctx, ctx.data[key], ctx.path, key)),\n alwaysSet: key in ctx.data,\n });\n }\n if (ctx.common.async) {\n return ParseStatus.mergeObjectAsync(status, pairs);\n }\n else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get element() {\n return this._def.valueType;\n }\n static create(first, second, third) {\n if (second instanceof ZodType) {\n return new ZodRecord({\n keyType: first,\n valueType: second,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(third),\n });\n }\n return new ZodRecord({\n keyType: ZodString.create(),\n valueType: first,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(second),\n });\n }\n}\nclass ZodMap extends ZodType {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.map) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.map,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n const pairs = [...ctx.data.entries()].map(([key, value], index) => {\n return {\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, [index, \"key\"])),\n value: valueType._parse(new ParseInputLazyPath(ctx, value, ctx.path, [index, \"value\"])),\n };\n });\n if (ctx.common.async) {\n const finalMap = new Map();\n return Promise.resolve().then(async () => {\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return { status: status.value, value: finalMap };\n });\n }\n else {\n const finalMap = new Map();\n for (const pair of pairs) {\n const key = pair.key;\n const value = pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return { status: status.value, value: finalMap };\n }\n }\n}\nZodMap.create = (keyType, valueType, params) => {\n return new ZodMap({\n valueType,\n keyType,\n typeName: ZodFirstPartyTypeKind.ZodMap,\n ...processCreateParams(params),\n });\n};\nclass ZodSet extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.set) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.set,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const def = this._def;\n if (def.minSize !== null) {\n if (ctx.data.size < def.minSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minSize.value,\n type: \"set\",\n inclusive: true,\n exact: false,\n message: def.minSize.message,\n });\n status.dirty();\n }\n }\n if (def.maxSize !== null) {\n if (ctx.data.size > def.maxSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxSize.value,\n type: \"set\",\n inclusive: true,\n exact: false,\n message: def.maxSize.message,\n });\n status.dirty();\n }\n }\n const valueType = this._def.valueType;\n function finalizeSet(elements) {\n const parsedSet = new Set();\n for (const element of elements) {\n if (element.status === \"aborted\")\n return INVALID;\n if (element.status === \"dirty\")\n status.dirty();\n parsedSet.add(element.value);\n }\n return { status: status.value, value: parsedSet };\n }\n const elements = [...ctx.data.values()].map((item, i) => valueType._parse(new ParseInputLazyPath(ctx, item, ctx.path, i)));\n if (ctx.common.async) {\n return Promise.all(elements).then((elements) => finalizeSet(elements));\n }\n else {\n return finalizeSet(elements);\n }\n }\n min(minSize, message) {\n return new ZodSet({\n ...this._def,\n minSize: { value: minSize, message: errorUtil.toString(message) },\n });\n }\n max(maxSize, message) {\n return new ZodSet({\n ...this._def,\n maxSize: { value: maxSize, message: errorUtil.toString(message) },\n });\n }\n size(size, message) {\n return this.min(size, message).max(size, message);\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodSet.create = (valueType, params) => {\n return new ZodSet({\n valueType,\n minSize: null,\n maxSize: null,\n typeName: ZodFirstPartyTypeKind.ZodSet,\n ...processCreateParams(params),\n });\n};\nclass ZodFunction extends ZodType {\n constructor() {\n super(...arguments);\n this.validate = this.implement;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.function) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.function,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n function makeArgsIssue(args, error) {\n return makeIssue({\n data: args,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap,\n ctx.schemaErrorMap,\n getErrorMap(),\n errorMap,\n ].filter((x) => !!x),\n issueData: {\n code: ZodIssueCode.invalid_arguments,\n argumentsError: error,\n },\n });\n }\n function makeReturnsIssue(returns, error) {\n return makeIssue({\n data: returns,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap,\n ctx.schemaErrorMap,\n getErrorMap(),\n errorMap,\n ].filter((x) => !!x),\n issueData: {\n code: ZodIssueCode.invalid_return_type,\n returnTypeError: error,\n },\n });\n }\n const params = { errorMap: ctx.common.contextualErrorMap };\n const fn = ctx.data;\n if (this._def.returns instanceof ZodPromise) {\n // Would love a way to avoid disabling this rule, but we need\n // an alias (using an arrow function was what caused 2651).\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const me = this;\n return OK(async function (...args) {\n const error = new ZodError([]);\n const parsedArgs = await me._def.args\n .parseAsync(args, params)\n .catch((e) => {\n error.addIssue(makeArgsIssue(args, e));\n throw error;\n });\n const result = await Reflect.apply(fn, this, parsedArgs);\n const parsedReturns = await me._def.returns._def.type\n .parseAsync(result, params)\n .catch((e) => {\n error.addIssue(makeReturnsIssue(result, e));\n throw error;\n });\n return parsedReturns;\n });\n }\n else {\n // Would love a way to avoid disabling this rule, but we need\n // an alias (using an arrow function was what caused 2651).\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const me = this;\n return OK(function (...args) {\n const parsedArgs = me._def.args.safeParse(args, params);\n if (!parsedArgs.success) {\n throw new ZodError([makeArgsIssue(args, parsedArgs.error)]);\n }\n const result = Reflect.apply(fn, this, parsedArgs.data);\n const parsedReturns = me._def.returns.safeParse(result, params);\n if (!parsedReturns.success) {\n throw new ZodError([makeReturnsIssue(result, parsedReturns.error)]);\n }\n return parsedReturns.data;\n });\n }\n }\n parameters() {\n return this._def.args;\n }\n returnType() {\n return this._def.returns;\n }\n args(...items) {\n return new ZodFunction({\n ...this._def,\n args: ZodTuple.create(items).rest(ZodUnknown.create()),\n });\n }\n returns(returnType) {\n return new ZodFunction({\n ...this._def,\n returns: returnType,\n });\n }\n implement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n strictImplement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n static create(args, returns, params) {\n return new ZodFunction({\n args: (args\n ? args\n : ZodTuple.create([]).rest(ZodUnknown.create())),\n returns: returns || ZodUnknown.create(),\n typeName: ZodFirstPartyTypeKind.ZodFunction,\n ...processCreateParams(params),\n });\n }\n}\nclass ZodLazy extends ZodType {\n get schema() {\n return this._def.getter();\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const lazySchema = this._def.getter();\n return lazySchema._parse({ data: ctx.data, path: ctx.path, parent: ctx });\n }\n}\nZodLazy.create = (getter, params) => {\n return new ZodLazy({\n getter: getter,\n typeName: ZodFirstPartyTypeKind.ZodLazy,\n ...processCreateParams(params),\n });\n};\nclass ZodLiteral extends ZodType {\n _parse(input) {\n if (input.data !== this._def.value) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_literal,\n expected: this._def.value,\n });\n return INVALID;\n }\n return { status: \"valid\", value: input.data };\n }\n get value() {\n return this._def.value;\n }\n}\nZodLiteral.create = (value, params) => {\n return new ZodLiteral({\n value: value,\n typeName: ZodFirstPartyTypeKind.ZodLiteral,\n ...processCreateParams(params),\n });\n};\nfunction createZodEnum(values, params) {\n return new ZodEnum({\n values,\n typeName: ZodFirstPartyTypeKind.ZodEnum,\n ...processCreateParams(params),\n });\n}\nclass ZodEnum extends ZodType {\n constructor() {\n super(...arguments);\n _ZodEnum_cache.set(this, void 0);\n }\n _parse(input) {\n if (typeof input.data !== \"string\") {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type,\n });\n return INVALID;\n }\n if (!__classPrivateFieldGet(this, _ZodEnum_cache, \"f\")) {\n __classPrivateFieldSet(this, _ZodEnum_cache, new Set(this._def.values), \"f\");\n }\n if (!__classPrivateFieldGet(this, _ZodEnum_cache, \"f\").has(input.data)) {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get options() {\n return this._def.values;\n }\n get enum() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Values() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Enum() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n extract(values, newDef = this._def) {\n return ZodEnum.create(values, {\n ...this._def,\n ...newDef,\n });\n }\n exclude(values, newDef = this._def) {\n return ZodEnum.create(this.options.filter((opt) => !values.includes(opt)), {\n ...this._def,\n ...newDef,\n });\n }\n}\n_ZodEnum_cache = new WeakMap();\nZodEnum.create = createZodEnum;\nclass ZodNativeEnum extends ZodType {\n constructor() {\n super(...arguments);\n _ZodNativeEnum_cache.set(this, void 0);\n }\n _parse(input) {\n const nativeEnumValues = util.getValidEnumValues(this._def.values);\n const ctx = this._getOrReturnCtx(input);\n if (ctx.parsedType !== ZodParsedType.string &&\n ctx.parsedType !== ZodParsedType.number) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type,\n });\n return INVALID;\n }\n if (!__classPrivateFieldGet(this, _ZodNativeEnum_cache, \"f\")) {\n __classPrivateFieldSet(this, _ZodNativeEnum_cache, new Set(util.getValidEnumValues(this._def.values)), \"f\");\n }\n if (!__classPrivateFieldGet(this, _ZodNativeEnum_cache, \"f\").has(input.data)) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get enum() {\n return this._def.values;\n }\n}\n_ZodNativeEnum_cache = new WeakMap();\nZodNativeEnum.create = (values, params) => {\n return new ZodNativeEnum({\n values: values,\n typeName: ZodFirstPartyTypeKind.ZodNativeEnum,\n ...processCreateParams(params),\n });\n};\nclass ZodPromise extends ZodType {\n unwrap() {\n return this._def.type;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.promise &&\n ctx.common.async === false) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.promise,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const promisified = ctx.parsedType === ZodParsedType.promise\n ? ctx.data\n : Promise.resolve(ctx.data);\n return OK(promisified.then((data) => {\n return this._def.type.parseAsync(data, {\n path: ctx.path,\n errorMap: ctx.common.contextualErrorMap,\n });\n }));\n }\n}\nZodPromise.create = (schema, params) => {\n return new ZodPromise({\n type: schema,\n typeName: ZodFirstPartyTypeKind.ZodPromise,\n ...processCreateParams(params),\n });\n};\nclass ZodEffects extends ZodType {\n innerType() {\n return this._def.schema;\n }\n sourceType() {\n return this._def.schema._def.typeName === ZodFirstPartyTypeKind.ZodEffects\n ? this._def.schema.sourceType()\n : this._def.schema;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const effect = this._def.effect || null;\n const checkCtx = {\n addIssue: (arg) => {\n addIssueToContext(ctx, arg);\n if (arg.fatal) {\n status.abort();\n }\n else {\n status.dirty();\n }\n },\n get path() {\n return ctx.path;\n },\n };\n checkCtx.addIssue = checkCtx.addIssue.bind(checkCtx);\n if (effect.type === \"preprocess\") {\n const processed = effect.transform(ctx.data, checkCtx);\n if (ctx.common.async) {\n return Promise.resolve(processed).then(async (processed) => {\n if (status.value === \"aborted\")\n return INVALID;\n const result = await this._def.schema._parseAsync({\n data: processed,\n path: ctx.path,\n parent: ctx,\n });\n if (result.status === \"aborted\")\n return INVALID;\n if (result.status === \"dirty\")\n return DIRTY(result.value);\n if (status.value === \"dirty\")\n return DIRTY(result.value);\n return result;\n });\n }\n else {\n if (status.value === \"aborted\")\n return INVALID;\n const result = this._def.schema._parseSync({\n data: processed,\n path: ctx.path,\n parent: ctx,\n });\n if (result.status === \"aborted\")\n return INVALID;\n if (result.status === \"dirty\")\n return DIRTY(result.value);\n if (status.value === \"dirty\")\n return DIRTY(result.value);\n return result;\n }\n }\n if (effect.type === \"refinement\") {\n const executeRefinement = (acc) => {\n const result = effect.refinement(acc, checkCtx);\n if (ctx.common.async) {\n return Promise.resolve(result);\n }\n if (result instanceof Promise) {\n throw new Error(\"Async refinement encountered during synchronous parse operation. Use .parseAsync instead.\");\n }\n return acc;\n };\n if (ctx.common.async === false) {\n const inner = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inner.status === \"aborted\")\n return INVALID;\n if (inner.status === \"dirty\")\n status.dirty();\n // return value is ignored\n executeRefinement(inner.value);\n return { status: status.value, value: inner.value };\n }\n else {\n return this._def.schema\n ._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx })\n .then((inner) => {\n if (inner.status === \"aborted\")\n return INVALID;\n if (inner.status === \"dirty\")\n status.dirty();\n return executeRefinement(inner.value).then(() => {\n return { status: status.value, value: inner.value };\n });\n });\n }\n }\n if (effect.type === \"transform\") {\n if (ctx.common.async === false) {\n const base = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (!isValid(base))\n return base;\n const result = effect.transform(base.value, checkCtx);\n if (result instanceof Promise) {\n throw new Error(`Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.`);\n }\n return { status: status.value, value: result };\n }\n else {\n return this._def.schema\n ._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx })\n .then((base) => {\n if (!isValid(base))\n return base;\n return Promise.resolve(effect.transform(base.value, checkCtx)).then((result) => ({ status: status.value, value: result }));\n });\n }\n }\n util.assertNever(effect);\n }\n}\nZodEffects.create = (schema, effect, params) => {\n return new ZodEffects({\n schema,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect,\n ...processCreateParams(params),\n });\n};\nZodEffects.createWithPreprocess = (preprocess, schema, params) => {\n return new ZodEffects({\n schema,\n effect: { type: \"preprocess\", transform: preprocess },\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n ...processCreateParams(params),\n });\n};\nclass ZodOptional extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.undefined) {\n return OK(undefined);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodOptional.create = (type, params) => {\n return new ZodOptional({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodOptional,\n ...processCreateParams(params),\n });\n};\nclass ZodNullable extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.null) {\n return OK(null);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodNullable.create = (type, params) => {\n return new ZodNullable({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodNullable,\n ...processCreateParams(params),\n });\n};\nclass ZodDefault extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n let data = ctx.data;\n if (ctx.parsedType === ZodParsedType.undefined) {\n data = this._def.defaultValue();\n }\n return this._def.innerType._parse({\n data,\n path: ctx.path,\n parent: ctx,\n });\n }\n removeDefault() {\n return this._def.innerType;\n }\n}\nZodDefault.create = (type, params) => {\n return new ZodDefault({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodDefault,\n defaultValue: typeof params.default === \"function\"\n ? params.default\n : () => params.default,\n ...processCreateParams(params),\n });\n};\nclass ZodCatch extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n // newCtx is used to not collect issues from inner types in ctx\n const newCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n };\n const result = this._def.innerType._parse({\n data: newCtx.data,\n path: newCtx.path,\n parent: {\n ...newCtx,\n },\n });\n if (isAsync(result)) {\n return result.then((result) => {\n return {\n status: \"valid\",\n value: result.status === \"valid\"\n ? result.value\n : this._def.catchValue({\n get error() {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data,\n }),\n };\n });\n }\n else {\n return {\n status: \"valid\",\n value: result.status === \"valid\"\n ? result.value\n : this._def.catchValue({\n get error() {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data,\n }),\n };\n }\n }\n removeCatch() {\n return this._def.innerType;\n }\n}\nZodCatch.create = (type, params) => {\n return new ZodCatch({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodCatch,\n catchValue: typeof params.catch === \"function\" ? params.catch : () => params.catch,\n ...processCreateParams(params),\n });\n};\nclass ZodNaN extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.nan) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.nan,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return { status: \"valid\", value: input.data };\n }\n}\nZodNaN.create = (params) => {\n return new ZodNaN({\n typeName: ZodFirstPartyTypeKind.ZodNaN,\n ...processCreateParams(params),\n });\n};\nconst BRAND = Symbol(\"zod_brand\");\nclass ZodBranded extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const data = ctx.data;\n return this._def.type._parse({\n data,\n path: ctx.path,\n parent: ctx,\n });\n }\n unwrap() {\n return this._def.type;\n }\n}\nclass ZodPipeline extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.common.async) {\n const handleAsync = async () => {\n const inResult = await this._def.in._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inResult.status === \"aborted\")\n return INVALID;\n if (inResult.status === \"dirty\") {\n status.dirty();\n return DIRTY(inResult.value);\n }\n else {\n return this._def.out._parseAsync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx,\n });\n }\n };\n return handleAsync();\n }\n else {\n const inResult = this._def.in._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inResult.status === \"aborted\")\n return INVALID;\n if (inResult.status === \"dirty\") {\n status.dirty();\n return {\n status: \"dirty\",\n value: inResult.value,\n };\n }\n else {\n return this._def.out._parseSync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n }\n static create(a, b) {\n return new ZodPipeline({\n in: a,\n out: b,\n typeName: ZodFirstPartyTypeKind.ZodPipeline,\n });\n }\n}\nclass ZodReadonly extends ZodType {\n _parse(input) {\n const result = this._def.innerType._parse(input);\n const freeze = (data) => {\n if (isValid(data)) {\n data.value = Object.freeze(data.value);\n }\n return data;\n };\n return isAsync(result)\n ? result.then((data) => freeze(data))\n : freeze(result);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodReadonly.create = (type, params) => {\n return new ZodReadonly({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodReadonly,\n ...processCreateParams(params),\n });\n};\nfunction custom(check, params = {}, \n/**\n * @deprecated\n *\n * Pass `fatal` into the params object instead:\n *\n * ```ts\n * z.string().custom((val) => val.length > 5, { fatal: false })\n * ```\n *\n */\nfatal) {\n if (check)\n return ZodAny.create().superRefine((data, ctx) => {\n var _a, _b;\n if (!check(data)) {\n const p = typeof params === \"function\"\n ? params(data)\n : typeof params === \"string\"\n ? { message: params }\n : params;\n const _fatal = (_b = (_a = p.fatal) !== null && _a !== void 0 ? _a : fatal) !== null && _b !== void 0 ? _b : true;\n const p2 = typeof p === \"string\" ? { message: p } : p;\n ctx.addIssue({ code: \"custom\", ...p2, fatal: _fatal });\n }\n });\n return ZodAny.create();\n}\nconst late = {\n object: ZodObject.lazycreate,\n};\nvar ZodFirstPartyTypeKind;\n(function (ZodFirstPartyTypeKind) {\n ZodFirstPartyTypeKind[\"ZodString\"] = \"ZodString\";\n ZodFirstPartyTypeKind[\"ZodNumber\"] = \"ZodNumber\";\n ZodFirstPartyTypeKind[\"ZodNaN\"] = \"ZodNaN\";\n ZodFirstPartyTypeKind[\"ZodBigInt\"] = \"ZodBigInt\";\n ZodFirstPartyTypeKind[\"ZodBoolean\"] = \"ZodBoolean\";\n ZodFirstPartyTypeKind[\"ZodDate\"] = \"ZodDate\";\n ZodFirstPartyTypeKind[\"ZodSymbol\"] = \"ZodSymbol\";\n ZodFirstPartyTypeKind[\"ZodUndefined\"] = \"ZodUndefined\";\n ZodFirstPartyTypeKind[\"ZodNull\"] = \"ZodNull\";\n ZodFirstPartyTypeKind[\"ZodAny\"] = \"ZodAny\";\n ZodFirstPartyTypeKind[\"ZodUnknown\"] = \"ZodUnknown\";\n ZodFirstPartyTypeKind[\"ZodNever\"] = \"ZodNever\";\n ZodFirstPartyTypeKind[\"ZodVoid\"] = \"ZodVoid\";\n ZodFirstPartyTypeKind[\"ZodArray\"] = \"ZodArray\";\n ZodFirstPartyTypeKind[\"ZodObject\"] = \"ZodObject\";\n ZodFirstPartyTypeKind[\"ZodUnion\"] = \"ZodUnion\";\n ZodFirstPartyTypeKind[\"ZodDiscriminatedUnion\"] = \"ZodDiscriminatedUnion\";\n ZodFirstPartyTypeKind[\"ZodIntersection\"] = \"ZodIntersection\";\n ZodFirstPartyTypeKind[\"ZodTuple\"] = \"ZodTuple\";\n ZodFirstPartyTypeKind[\"ZodRecord\"] = \"ZodRecord\";\n ZodFirstPartyTypeKind[\"ZodMap\"] = \"ZodMap\";\n ZodFirstPartyTypeKind[\"ZodSet\"] = \"ZodSet\";\n ZodFirstPartyTypeKind[\"ZodFunction\"] = \"ZodFunction\";\n ZodFirstPartyTypeKind[\"ZodLazy\"] = \"ZodLazy\";\n ZodFirstPartyTypeKind[\"ZodLiteral\"] = \"ZodLiteral\";\n ZodFirstPartyTypeKind[\"ZodEnum\"] = \"ZodEnum\";\n ZodFirstPartyTypeKind[\"ZodEffects\"] = \"ZodEffects\";\n ZodFirstPartyTypeKind[\"ZodNativeEnum\"] = \"ZodNativeEnum\";\n ZodFirstPartyTypeKind[\"ZodOptional\"] = \"ZodOptional\";\n ZodFirstPartyTypeKind[\"ZodNullable\"] = \"ZodNullable\";\n ZodFirstPartyTypeKind[\"ZodDefault\"] = \"ZodDefault\";\n ZodFirstPartyTypeKind[\"ZodCatch\"] = \"ZodCatch\";\n ZodFirstPartyTypeKind[\"ZodPromise\"] = \"ZodPromise\";\n ZodFirstPartyTypeKind[\"ZodBranded\"] = \"ZodBranded\";\n ZodFirstPartyTypeKind[\"ZodPipeline\"] = \"ZodPipeline\";\n ZodFirstPartyTypeKind[\"ZodReadonly\"] = \"ZodReadonly\";\n})(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {}));\nconst instanceOfType = (\n// const instanceOfType = any>(\ncls, params = {\n message: `Input not instance of ${cls.name}`,\n}) => custom((data) => data instanceof cls, params);\nconst stringType = ZodString.create;\nconst numberType = ZodNumber.create;\nconst nanType = ZodNaN.create;\nconst bigIntType = ZodBigInt.create;\nconst booleanType = ZodBoolean.create;\nconst dateType = ZodDate.create;\nconst symbolType = ZodSymbol.create;\nconst undefinedType = ZodUndefined.create;\nconst nullType = ZodNull.create;\nconst anyType = ZodAny.create;\nconst unknownType = ZodUnknown.create;\nconst neverType = ZodNever.create;\nconst voidType = ZodVoid.create;\nconst arrayType = ZodArray.create;\nconst objectType = ZodObject.create;\nconst strictObjectType = ZodObject.strictCreate;\nconst unionType = ZodUnion.create;\nconst discriminatedUnionType = ZodDiscriminatedUnion.create;\nconst intersectionType = ZodIntersection.create;\nconst tupleType = ZodTuple.create;\nconst recordType = ZodRecord.create;\nconst mapType = ZodMap.create;\nconst setType = ZodSet.create;\nconst functionType = ZodFunction.create;\nconst lazyType = ZodLazy.create;\nconst literalType = ZodLiteral.create;\nconst enumType = ZodEnum.create;\nconst nativeEnumType = ZodNativeEnum.create;\nconst promiseType = ZodPromise.create;\nconst effectsType = ZodEffects.create;\nconst optionalType = ZodOptional.create;\nconst nullableType = ZodNullable.create;\nconst preprocessType = ZodEffects.createWithPreprocess;\nconst pipelineType = ZodPipeline.create;\nconst ostring = () => stringType().optional();\nconst onumber = () => numberType().optional();\nconst oboolean = () => booleanType().optional();\nconst coerce = {\n string: ((arg) => ZodString.create({ ...arg, coerce: true })),\n number: ((arg) => ZodNumber.create({ ...arg, coerce: true })),\n boolean: ((arg) => ZodBoolean.create({\n ...arg,\n coerce: true,\n })),\n bigint: ((arg) => ZodBigInt.create({ ...arg, coerce: true })),\n date: ((arg) => ZodDate.create({ ...arg, coerce: true })),\n};\nconst NEVER = INVALID;\n\nvar z = /*#__PURE__*/Object.freeze({\n __proto__: null,\n defaultErrorMap: errorMap,\n setErrorMap: setErrorMap,\n getErrorMap: getErrorMap,\n makeIssue: makeIssue,\n EMPTY_PATH: EMPTY_PATH,\n addIssueToContext: addIssueToContext,\n ParseStatus: ParseStatus,\n INVALID: INVALID,\n DIRTY: DIRTY,\n OK: OK,\n isAborted: isAborted,\n isDirty: isDirty,\n isValid: isValid,\n isAsync: isAsync,\n get util () { return util; },\n get objectUtil () { return objectUtil; },\n ZodParsedType: ZodParsedType,\n getParsedType: getParsedType,\n ZodType: ZodType,\n datetimeRegex: datetimeRegex,\n ZodString: ZodString,\n ZodNumber: ZodNumber,\n ZodBigInt: ZodBigInt,\n ZodBoolean: ZodBoolean,\n ZodDate: ZodDate,\n ZodSymbol: ZodSymbol,\n ZodUndefined: ZodUndefined,\n ZodNull: ZodNull,\n ZodAny: ZodAny,\n ZodUnknown: ZodUnknown,\n ZodNever: ZodNever,\n ZodVoid: ZodVoid,\n ZodArray: ZodArray,\n ZodObject: ZodObject,\n ZodUnion: ZodUnion,\n ZodDiscriminatedUnion: ZodDiscriminatedUnion,\n ZodIntersection: ZodIntersection,\n ZodTuple: ZodTuple,\n ZodRecord: ZodRecord,\n ZodMap: ZodMap,\n ZodSet: ZodSet,\n ZodFunction: ZodFunction,\n ZodLazy: ZodLazy,\n ZodLiteral: ZodLiteral,\n ZodEnum: ZodEnum,\n ZodNativeEnum: ZodNativeEnum,\n ZodPromise: ZodPromise,\n ZodEffects: ZodEffects,\n ZodTransformer: ZodEffects,\n ZodOptional: ZodOptional,\n ZodNullable: ZodNullable,\n ZodDefault: ZodDefault,\n ZodCatch: ZodCatch,\n ZodNaN: ZodNaN,\n BRAND: BRAND,\n ZodBranded: ZodBranded,\n ZodPipeline: ZodPipeline,\n ZodReadonly: ZodReadonly,\n custom: custom,\n Schema: ZodType,\n ZodSchema: ZodType,\n late: late,\n get ZodFirstPartyTypeKind () { return ZodFirstPartyTypeKind; },\n coerce: coerce,\n any: anyType,\n array: arrayType,\n bigint: bigIntType,\n boolean: booleanType,\n date: dateType,\n discriminatedUnion: discriminatedUnionType,\n effect: effectsType,\n 'enum': enumType,\n 'function': functionType,\n 'instanceof': instanceOfType,\n intersection: intersectionType,\n lazy: lazyType,\n literal: literalType,\n map: mapType,\n nan: nanType,\n nativeEnum: nativeEnumType,\n never: neverType,\n 'null': nullType,\n nullable: nullableType,\n number: numberType,\n object: objectType,\n oboolean: oboolean,\n onumber: onumber,\n optional: optionalType,\n ostring: ostring,\n pipeline: pipelineType,\n preprocess: preprocessType,\n promise: promiseType,\n record: recordType,\n set: setType,\n strictObject: strictObjectType,\n string: stringType,\n symbol: symbolType,\n transformer: effectsType,\n tuple: tupleType,\n 'undefined': undefinedType,\n union: unionType,\n unknown: unknownType,\n 'void': voidType,\n NEVER: NEVER,\n ZodIssueCode: ZodIssueCode,\n quotelessJson: quotelessJson,\n ZodError: ZodError\n});\n\nexport { BRAND, DIRTY, EMPTY_PATH, INVALID, NEVER, OK, ParseStatus, ZodType as Schema, ZodAny, ZodArray, ZodBigInt, ZodBoolean, ZodBranded, ZodCatch, ZodDate, ZodDefault, ZodDiscriminatedUnion, ZodEffects, ZodEnum, ZodError, ZodFirstPartyTypeKind, ZodFunction, ZodIntersection, ZodIssueCode, ZodLazy, ZodLiteral, ZodMap, ZodNaN, ZodNativeEnum, ZodNever, ZodNull, ZodNullable, ZodNumber, ZodObject, ZodOptional, ZodParsedType, ZodPipeline, ZodPromise, ZodReadonly, ZodRecord, ZodType as ZodSchema, ZodSet, ZodString, ZodSymbol, ZodEffects as ZodTransformer, ZodTuple, ZodType, ZodUndefined, ZodUnion, ZodUnknown, ZodVoid, addIssueToContext, anyType as any, arrayType as array, bigIntType as bigint, booleanType as boolean, coerce, custom, dateType as date, datetimeRegex, z as default, errorMap as defaultErrorMap, discriminatedUnionType as discriminatedUnion, effectsType as effect, enumType as enum, functionType as function, getErrorMap, getParsedType, instanceOfType as instanceof, intersectionType as intersection, isAborted, isAsync, isDirty, isValid, late, lazyType as lazy, literalType as literal, makeIssue, mapType as map, nanType as nan, nativeEnumType as nativeEnum, neverType as never, nullType as null, nullableType as nullable, numberType as number, objectType as object, objectUtil, oboolean, onumber, optionalType as optional, ostring, pipelineType as pipeline, preprocessType as preprocess, promiseType as promise, quotelessJson, recordType as record, setType as set, setErrorMap, strictObjectType as strictObject, stringType as string, symbolType as symbol, effectsType as transformer, tupleType as tuple, undefinedType as undefined, unionType as union, unknownType as unknown, util, voidType as void, z };\n","export const Config = {\n PlayerSpeed: 16*2, // pixels/sec\n PlayerFrameSpeed: 200, // ms\n}","import * as ex from 'excalibur';\nimport { Resources } from './resources';\nimport { Config } from './config';\n\nexport class Player extends ex.Actor {\n constructor(args: ex.ActorArgs) {\n super({\n ...args,\n collisionType: ex.CollisionType.Active\n })\n }\n\n onInitialize(engine: ex.Engine): void {\n const playerSpriteSheet = ex.SpriteSheet.fromImageSource({\n image: Resources.HeroSpriteSheetPng as ex.ImageSource,\n grid: {\n spriteWidth: 16,\n spriteHeight: 16,\n rows: 8,\n columns: 8\n }\n });\n\n const leftIdle = new ex.Animation({\n frames: [\n {graphic: playerSpriteSheet.getSprite(0, 1) as ex.Sprite, duration: Config.PlayerFrameSpeed},\n {graphic: playerSpriteSheet.getSprite(1, 1) as ex.Sprite, duration: Config.PlayerFrameSpeed},\n {graphic: playerSpriteSheet.getSprite(2, 1) as ex.Sprite, duration: Config.PlayerFrameSpeed},\n {graphic: playerSpriteSheet.getSprite(3, 1) as ex.Sprite, duration: Config.PlayerFrameSpeed},\n ]\n })\n this.graphics.add('left-idle', leftIdle);\n\n const rightIdle = new ex.Animation({\n frames: [\n {graphic: playerSpriteSheet.getSprite(0, 2) as ex.Sprite, duration: Config.PlayerFrameSpeed},\n {graphic: playerSpriteSheet.getSprite(1, 2) as ex.Sprite, duration: Config.PlayerFrameSpeed},\n {graphic: playerSpriteSheet.getSprite(2, 2) as ex.Sprite, duration: Config.PlayerFrameSpeed},\n {graphic: playerSpriteSheet.getSprite(3, 2) as ex.Sprite, duration: Config.PlayerFrameSpeed},\n ]\n })\n this.graphics.add('right-idle', rightIdle);\n\n\n const upIdle = new ex.Animation({\n frames: [\n {graphic: playerSpriteSheet.getSprite(0, 3) as ex.Sprite, duration: Config.PlayerFrameSpeed},\n {graphic: playerSpriteSheet.getSprite(1, 3) as ex.Sprite, duration: Config.PlayerFrameSpeed},\n {graphic: playerSpriteSheet.getSprite(2, 3) as ex.Sprite, duration: Config.PlayerFrameSpeed},\n {graphic: playerSpriteSheet.getSprite(3, 3) as ex.Sprite, duration: Config.PlayerFrameSpeed},\n ]\n })\n this.graphics.add('up-idle', upIdle);\n\n const downIdle = new ex.Animation({\n frames: [\n {graphic: playerSpriteSheet.getSprite(0, 0) as ex.Sprite, duration: Config.PlayerFrameSpeed},\n {graphic: playerSpriteSheet.getSprite(1, 0) as ex.Sprite, duration: Config.PlayerFrameSpeed},\n {graphic: playerSpriteSheet.getSprite(2, 0) as ex.Sprite, duration: Config.PlayerFrameSpeed},\n {graphic: playerSpriteSheet.getSprite(3, 0) as ex.Sprite, duration: Config.PlayerFrameSpeed},\n ]\n })\n this.graphics.add('down-idle', downIdle);\n\n const leftWalk = new ex.Animation({\n frames: [\n {graphic: playerSpriteSheet.getSprite(0, 5) as ex.Sprite, duration: Config.PlayerFrameSpeed},\n {graphic: playerSpriteSheet.getSprite(1, 5) as ex.Sprite, duration: Config.PlayerFrameSpeed},\n {graphic: playerSpriteSheet.getSprite(2, 5) as ex.Sprite, duration: Config.PlayerFrameSpeed},\n {graphic: playerSpriteSheet.getSprite(3, 5) as ex.Sprite, duration: Config.PlayerFrameSpeed},\n ]\n })\n this.graphics.add('left-walk', leftWalk);\n\n const rightWalk = new ex.Animation({\n frames: [\n {graphic: playerSpriteSheet.getSprite(0, 6) as ex.Sprite, duration: Config.PlayerFrameSpeed},\n {graphic: playerSpriteSheet.getSprite(1, 6) as ex.Sprite, duration: Config.PlayerFrameSpeed},\n {graphic: playerSpriteSheet.getSprite(2, 6) as ex.Sprite, duration: Config.PlayerFrameSpeed},\n {graphic: playerSpriteSheet.getSprite(3, 6) as ex.Sprite, duration: Config.PlayerFrameSpeed},\n ]\n });\n this.graphics.add('right-walk', rightWalk);\n\n const upWalk = new ex.Animation({\n frames: [\n {graphic: playerSpriteSheet.getSprite(0, 7) as ex.Sprite, duration: Config.PlayerFrameSpeed},\n {graphic: playerSpriteSheet.getSprite(1, 7) as ex.Sprite, duration: Config.PlayerFrameSpeed},\n {graphic: playerSpriteSheet.getSprite(2, 7) as ex.Sprite, duration: Config.PlayerFrameSpeed},\n {graphic: playerSpriteSheet.getSprite(3, 7) as ex.Sprite, duration: Config.PlayerFrameSpeed},\n ]\n });\n this.graphics.add('up-walk', upWalk);\n\n const downWalk = new ex.Animation({\n frames: [\n {graphic: playerSpriteSheet.getSprite(0, 4) as ex.Sprite, duration: Config.PlayerFrameSpeed},\n {graphic: playerSpriteSheet.getSprite(1, 4) as ex.Sprite, duration: Config.PlayerFrameSpeed},\n {graphic: playerSpriteSheet.getSprite(2, 4) as ex.Sprite, duration: Config.PlayerFrameSpeed},\n {graphic: playerSpriteSheet.getSprite(3, 4) as ex.Sprite, duration: Config.PlayerFrameSpeed},\n ]\n });\n this.graphics.add('down-walk', downWalk);\n }\n\n onPreUpdate(engine: ex.Engine, elapsedMs: number): void {\n this.vel = ex.Vector.Zero;\n\n this.graphics.use('down-idle');\n if (engine.input.keyboard.isHeld(ex.Keys.ArrowRight)) {\n this.vel = ex.vec(Config.PlayerSpeed, 0);\n this.graphics.use('right-walk');\n }\n if (engine.input.keyboard.isHeld(ex.Keys.ArrowLeft)) {\n this.vel = ex.vec(-Config.PlayerSpeed, 0);\n this.graphics.use('left-walk');\n }\n if (engine.input.keyboard.isHeld(ex.Keys.ArrowUp)) {\n this.vel = ex.vec(0, -Config.PlayerSpeed);\n this.graphics.use('up-walk');\n }\n if (engine.input.keyboard.isHeld(ex.Keys.ArrowDown)) {\n this.vel = ex.vec(0, Config.PlayerSpeed);\n this.graphics.use('down-walk');\n }\n\n }\n}","import { ImageFiltering, ImageSource, Loader } from \"excalibur\";\nimport { LdtkResource } from '@excalibur-ldtk';\n\nexport const Resources = {\n HeroSpriteSheetPng: new ImageSource('./Solaria Demo Pack Update 03/Solaria Demo Pack Update 03/16x16/Sprites/Hero 01.png'),\n LdtkResource: new LdtkResource('./spacing-padding/spacing-padding.ldtk', {\n useTilemapCameraStrategy: true,\n useMapBackgroundColor: true,\n }),\n LdtkAutoTile: new LdtkResource('./autotile/autotile.ldtk', {\n useMapBackgroundColor: true,\n }),\n LdtkPureAutoTile: new LdtkResource('./dsml1/dsml1.ldtk', {\n useMapBackgroundColor: true,\n })\n} as const;\n\n\nexport const loader = new Loader();\nfor (let resource of Object.values(Resources)) {\n loader.addResource(resource);\n}","import { Actor, Entity, Vector, vec } from \"excalibur\";\nimport { LdtkResource } from \"./ldtk-resource\";\nimport { LdtkEntityInstance, LdtkLayerInstance } from \"./types\";\nimport { Level } from \"./level\";\n\nexport class EntityLayer {\n public worldPos: Vector;\n public offset: Vector;\n public entities: Entity[] = [];\n public ldtkToEntity = new Map();\n public entityToLdtk = new Map();\n\n constructor(\n level: Level,\n public readonly ldtkLayer: LdtkLayerInstance,\n private resource: LdtkResource,\n public readonly order: number) {\n this.worldPos = vec(level.ldtkLevel.worldX, level.ldtkLevel.worldY);\n this.offset = vec(ldtkLayer.__pxTotalOffsetX, ldtkLayer.__pxTotalOffsetY);\n console.log(\"yo\");\n }\n\n runFactories() {\n const ldtkLayer = this.ldtkLayer;\n const resource = this.resource;\n const order = this.order;\n if (ldtkLayer.entityInstances) {\n for (let entity of ldtkLayer.entityInstances) {\n const entityMetadata = resource.projectMetadata.defs.entities.find(e => {\n return e.identifier === entity.__identifier\n });\n if (resource.factories.has(entity.__identifier)) {\n const factory = resource.factories.get(entity.__identifier);\n if (factory) {\n const newEntity = factory({\n type: entity.__identifier,\n worldPos: vec(entity.px[0], entity.px[1]).add(this.worldPos.add(this.offset)),\n entity,\n definition: entityMetadata,\n layer: this,\n });\n if (newEntity) {\n this.entities.push(newEntity);\n this.ldtkToEntity.set(entity, newEntity);\n this.entityToLdtk.set(newEntity, entity);\n }\n }\n } else {\n if (entity.__tile) {\n const actor = new Actor({\n name: entity.__identifier,\n pos: vec(entity.px[0], entity.px[1]).add(this.worldPos.add(this.offset)),\n width: entity.width,\n height: entity.height,\n anchor: vec(entityMetadata?.pivotX ?? 0, entityMetadata?.pivotY ?? 0),\n z: order\n });\n const ts = resource.tilesets.get(entity.__tile.tilesetUid);\n if (ts) {\n const tsxCoord = Math.floor(entity.__tile.x / entity.__tile.w);\n const tsyCoord = Math.floor(entity.__tile.y / entity.__tile.h);\n const sprite = ts.spritesheet.getSprite(tsxCoord, tsyCoord);\n if (sprite) {\n actor.graphics.use(sprite);\n }\n }\n\n this.entities.push(actor);\n this.ldtkToEntity.set(entity, actor);\n this.entityToLdtk.set(actor, entity);\n }\n }\n }\n }\n\n // for (let entity of this.ldtkLayer.entityInstances) {\n // const factory = this.resource.factories.get(entity.__identifier);\n // if (!factory) { continue }\n //\n // const entityMetadata = this.resource.projectMetadata.defs.entities.find(e => {\n // return e.identifier === entity.__identifier\n // });\n //\n // const newEntity = factory({\n // type: entity.__identifier,\n // worldPos: vec(entity.px[0], entity.px[1]).add(this.worldPos.add(this.offset)),\n // entity,\n // definition: entityMetadata,\n // layer: this,\n // });\n //\n // if (newEntity) {\n // // remove pre-existing entity (e.g. the default actor created for the entity placement)\n // const preExisting = this.ldtkToEntity.get(entity);\n // if (preExisting) {\n // const index = this.entities.indexOf(preExisting);\n // if (index > -1) {\n // this.entities.splice(index, 1);\n // this.ldtkToEntity.delete(entity);\n // this.entityToLdtk.delete(preExisting);\n // }\n // }\n //\n // this.entities.push(newEntity);\n // this.ldtkToEntity.set(entity, newEntity);\n // this.entityToLdtk.set(newEntity, entity);\n // }\n // }\n }\n\n\n getEntitiesByIdentifier(identifier: string): Entity[] {\n const ldtkEntities = this.getLdtkEntitiesByIdentifier(identifier);\n let results: Entity[] = [];\n for (const ldtk of ldtkEntities) {\n const maybeEntity = this.ldtkToEntity.get(ldtk);\n if (maybeEntity) {\n results.push(maybeEntity);\n }\n }\n return results;\n }\n\n getEntitiesByField(fieldIdentifier: string, value?: any): Entity[] {\n const ldtkEntities = this.getLdtkEntitiesByField(fieldIdentifier, value);\n let results: Entity[] = [];\n for (const ldtk of ldtkEntities) {\n const maybeEntity = this.ldtkToEntity.get(ldtk);\n if (maybeEntity) {\n results.push(maybeEntity);\n }\n }\n return results;\n }\n\n /**\n * Search layer for entities that match an identifier (case insensitive)\n * @param identifier \n * @returns \n */\n getLdtkEntitiesByIdentifier(identifier: string): LdtkEntityInstance[] {\n return this.ldtkLayer.entityInstances.filter(e => e.__identifier.toLocaleLowerCase() === identifier.toLowerCase());\n }\n\n /**\n * Search layer for entities that match a field and optionally a value (both case insensitive)\n * @param fieldIdentifier \n * @param value\n */\n getLdtkEntitiesByField(fieldIdentifier: string, value?: any): LdtkEntityInstance[] {\n return this.ldtkLayer.entityInstances.filter(e => {\n if (value !== undefined) {\n let normalizedValue = value;\n if (typeof value === 'string') {\n normalizedValue = value.toLocaleLowerCase();\n }\n\n const field = e.fieldInstances.find(f => f.__identifier.toLocaleLowerCase() === fieldIdentifier.toLocaleLowerCase());\n if (field) {\n return field.__value === normalizedValue;\n }\n return false;\n } else {\n return !!e.fieldInstances.find(f => f.__identifier.toLocaleLowerCase() === fieldIdentifier.toLocaleLowerCase());\n }\n });\n }\n}\n","\n\nexport type FileLoader = (path: string, contentType: 'json' | 'xml') => Promise;\n\nexport const FetchLoader: FileLoader = async (path: string, contentType: 'json' | 'xml') => {\n const response = await fetch(path);\n switch(contentType.toLowerCase()) {\n case 'xml': return await response.text();\n case 'json': return await response.json();\n default: return await response.text();\n }\n}","\nexport * from './ldtk-resource';\nexport * from './entity-layer';\nexport * from './file-loader';\nexport * from './intgrid-layer';\nexport * from './level-resource';\nexport * from './level';\nexport * from './loader-cache';\nexport * from './path-util';\nexport * from './tile-layer';\nexport * from './tileset';\nexport * from './types';","import { GraphicsComponent, TileMap, Vector, vec } from \"excalibur\";\nimport { LdtkLayerInstance } from \"./types\";\nimport { LdtkResource } from \"./ldtk-resource\";\nimport { Level } from \"./level\";\nimport { Tileset } from \"./tileset\";\n\nexport class IntGridLayer {\n\n public ldtkLayer: LdtkLayerInstance;\n public worldPos: Vector;\n public offset: Vector;\n public tilemap!: TileMap;\n public tileset?: Tileset;\n\n constructor(level: Level, ldtkLayer: LdtkLayerInstance, resource: LdtkResource, public readonly order: number) {\n this.worldPos = vec(level.ldtkLevel.worldX, level.ldtkLevel.worldY);\n this.offset = vec(ldtkLayer.__pxTotalOffsetX, ldtkLayer.__pxTotalOffsetY);\n this.ldtkLayer = ldtkLayer;\n if (ldtkLayer.intGridCsv.length || ldtkLayer.autoLayerTiles.length) {\n\n const rows = ldtkLayer.__cHei;\n const columns = ldtkLayer.__cWid;\n this.tilemap = new TileMap({\n name: ldtkLayer.__identifier,\n pos: this.worldPos.add(this.offset),\n tileWidth: ldtkLayer.__gridSize,\n tileHeight: ldtkLayer.__gridSize,\n rows,\n columns,\n });\n this.tilemap.z = order;\n const graphics = this.tilemap.get(GraphicsComponent);\n graphics.isVisible = ldtkLayer.visible;\n\n // find the intgrid metadata\n const layerMetadata = resource.projectMetadata.defs.layers.find(l => {\n return ldtkLayer.__identifier === l.identifier;\n });\n\n if (layerMetadata) {\n const solidValue = layerMetadata.intGridValues.find(val => {\n return val?.identifier?.toLocaleLowerCase() === 'solid';\n });\n\n for (let i = 0; i < ldtkLayer.intGridCsv.length; i++) {\n const xCoord = i % columns;\n const yCoord = Math.floor(i / columns);\n const tile = this.tilemap.getTile(xCoord, yCoord);\n if (solidValue && ldtkLayer.intGridCsv[i] === solidValue.value) {\n tile!.solid = true;\n }\n\n // TODO might be a mistake to treat 1 as solid if there isn't a labelled solid\n if (!solidValue && ldtkLayer.intGridCsv[i] === 1) {\n tile!.solid = true;\n }\n }\n\n if (ldtkLayer.__tilesetDefUid) {\n this.tileset = resource.tilesets.get(ldtkLayer.__tilesetDefUid);\n for (let i = 0; i < ldtkLayer.autoLayerTiles.length; i++) {\n const tile = ldtkLayer.autoLayerTiles[i];\n const xCoord = Math.floor(tile.px[0] / ldtkLayer.__gridSize);\n const yCoord = Math.floor(tile.px[1] / ldtkLayer.__gridSize);\n const exTile = this.tilemap.getTile(xCoord, yCoord);\n if (exTile && this.tileset) {\n const tsxCoord = Math.floor((tile.src[0] - (this.tileset.ldtkTileset.padding ?? 0)) / (this.tileset.ldtkTileset.tileGridSize + (this.tileset.ldtkTileset.spacing ?? 0)));\n const tsyCoord = Math.floor((tile.src[1] - (this.tileset.ldtkTileset.padding ?? 0)) / (this.tileset.ldtkTileset.tileGridSize + (this.tileset.ldtkTileset.spacing ?? 0)));\n // Bit 0 toggles x flip\n // Bit 1 toggles 1 flip\n // Examples: f=0 (no flip), f=1 (X flip only), f=2 (Y flip only), f=3 (both flips)\n const flipHorizontal = !!(tile.f & 0b01);\n const flipVertical = !!(tile.f & 0b10);\n let sprite = this.tileset.spritesheet.getSprite(tsxCoord, tsyCoord);\n if (flipHorizontal || flipVertical) {\n sprite = sprite.clone();\n sprite.flipHorizontal = flipHorizontal;\n sprite.flipVertical = flipVertical;\n }\n if (sprite) {\n exTile!.addGraphic(sprite);\n } else {\n console.error('Could not find sprite in LDtk spritesheet at', tsxCoord, tsyCoord);\n }\n }\n }\n }\n }\n }\n }\n}\n","import { TileLayer } from './tile-layer';\nimport { PathMap, pathRelativeToBase } from './path-util';\nimport { FetchLoader, FileLoader } from './file-loader';\nimport { LdtkEntityDefinition, LdtkEntityInstance, LdtkProjectMetadata } from './types';\nimport { compare } from 'compare-versions';\nimport { LoaderCache } from './loader-cache';\nimport { BoundingBox, Entity, ImageSource, Loadable, Scene, TransformComponent, Vector, vec } from 'excalibur';\nimport { LevelResource } from './level-resource';\nimport { Tileset } from './tileset';\nimport { Level } from './level';\nimport { EntityLayer } from './entity-layer';\nimport { IntGridLayer } from './intgrid-layer';\n\nexport interface AddToSceneOptions {\n /**\n * Optionally set the position to place the levels\n * \n * Default is vec(0, 0)\n */\n pos?: Vector;\n /**\n * Optionally add only specific levels to the scene\n * \n * Default includes all levels\n */\n levelFilter?: string[];\n\n /**\n * Optionally use the level world offsets, this is useful if your levels are arranged the way you want them\n * to appear in your game.\n * \n * Default is true\n */\n useLevelOffsets?: boolean;\n}\n\nexport interface FactoryProps {\n /**\n * Excalibur world position\n */\n worldPos: Vector;\n /**\n * LDtk name in UI\n */\n name?: string;\n /**\n * LDtk type in UI\n */\n type: string;\n /**\n * LDtk entity\n */\n entity: LdtkEntityInstance;\n /**\n * LDtk entity metadata\n */\n definition: LdtkEntityDefinition | undefined;\n /**\n * Layer\n */\n layer: EntityLayer;\n}\n\nexport interface LdtkResourceOptions {\n /**\n * Add a starting z index for the layers to use. By default the layers count up from 0.\n *\n * If you'd like to manually override a z-index on a layer use the 'zindex' custom property on a layer.\n */\n startZIndex?: number;\n\n /**\n * Default true. If false, only tilemap will be parsed and displayed, it's up to you to wire up any excalibur behavior.\n * Automatically wires excalibur to the following\n * * Wire up current scene camera\n *\n * Read more at excaliburjs.com!\n */\n useExcaliburWiring?: boolean;\n\n /**\n * Sets excalibur's background color to match the LDtk map\n */\n useMapBackgroundColor?: boolean;\n\n /**\n * The pathMap helps work around odd things bundlers do with static files by providing a way to redirect the original\n * source paths in the LDtk files to new locations.\n *\n * When the LDtk resource comes across something that matches `path`, it will use the output string instead.\n * \n * Example:\n * ```typescript\n * const newResource = new LdtkResource('./example-city.ldtk', {\n * pathMap: [\n * // If the \"path\" is included in the source path, the output will be used\n * { path: 'cone.png', output: '/static/assets/cone.png' },\n * // Regex matching with special [match] in output string that is replaced with the first match from the regex\n * { path: /(.*\\..*$)/, output: '/static/assets/[match]'}\n * ]\n * }\n * ```\n */\n pathMap?: PathMap;\n\n /**\n * Optionally provide a custom file loader implementation instead of using the built in ajax (fetch) loader\n * that takes a path and returns file data\n * \n */\n fileLoader?: FileLoader;\n\n /**\n * By default `true`, means LDtk files must pass the plugins Typed parse pass.\n *\n * If you have something that the LDtk plugin does not expect, you can set this to false and it will do it's best\n * to parse the LDtk source map file.\n */\n strict?: boolean;\n\n /**\n * Plugin will operate in headless mode and skip all graphics related\n * excalibur items including creating ImageSource's for LDtk items.\n *\n * Default false.\n */\n headless?: boolean;\n\n /**\n * Keeps the camera viewport within the bounds of the TileMap, uses the first tile layer's bounds.\n *\n * Defaults true, if false the camera will use the layer bounds to keep the camera from showing the background.\n */\n useTilemapCameraStrategy?: boolean;\n\n /**\n * Configure custom Actor/Entity factory functions to construct Actors/Entities\n * given a LDtk type name\n */\n entityIdentifierFactories?: Record Entity | undefined>;\n}\n\nexport class LdtkResource implements Loadable {\n public static supportedLdtkVersion = \"1.5.3\";\n public projectMetadata!: LdtkProjectMetadata;\n data!: LdtkProjectMetadata;\n\n\n public tilesets = new Map();\n public levels = new Map();\n public levelsByName = new Map();\n public factories = new Map Entity | undefined>();\n public fileLoader: FileLoader = FetchLoader;\n public pathMap: PathMap | undefined;\n\n private _imageLoader = new LoaderCache(ImageSource);\n private _levelLoader = new LoaderCache(LevelResource);\n\n\n public readonly startZIndex: number = 0;\n public readonly textQuality: number = 4;\n public readonly useExcaliburWiring: boolean = true;\n public readonly useMapBackgroundColor: boolean = false;\n public readonly useTilemapCameraStrategy: boolean = false;\n public readonly headless: boolean = false;\n public readonly strict: boolean = true;\n\n constructor(public readonly path: string, options?: LdtkResourceOptions) {\n const {\n useExcaliburWiring,\n useTilemapCameraStrategy,\n entityIdentifierFactories,\n pathMap,\n useMapBackgroundColor,\n fileLoader,\n strict,\n headless,\n startZIndex\n } = { ...options };\n this.strict = strict ?? this.strict;\n this.headless = headless ?? this.headless;\n this.useExcaliburWiring = useExcaliburWiring ?? this.useExcaliburWiring;\n this.useTilemapCameraStrategy = useTilemapCameraStrategy ?? this.useTilemapCameraStrategy;\n this.useMapBackgroundColor = useMapBackgroundColor ?? this.useMapBackgroundColor;\n this.startZIndex = startZIndex ?? this.startZIndex;\n this.fileLoader = fileLoader ?? this.fileLoader;\n this.pathMap = pathMap;\n for (const key in entityIdentifierFactories) {\n this.registerEntityIdentifierFactory(key, entityIdentifierFactories[key]);\n }\n\n }\n async load(): Promise {\n const data = await this.fileLoader(this.path, 'json');\n if (this.strict) {\n try {\n this.projectMetadata = LdtkProjectMetadata.parse(data);\n } catch (e) {\n console.error(`Could not parse LDtk map from location ${this.path}.\\nExcalibur only supports the latest version of LDtk formats as of the plugin's release.`);\n console.error(`Is your map file corrupted or being interpreted as the wrong type?`)\n throw e;\n }\n } else {\n this.projectMetadata = data as LdtkProjectMetadata;\n }\n\n if (compare(LdtkResource.supportedLdtkVersion, this.projectMetadata.jsonVersion ?? '0.0.0', \">\")) {\n console.warn(`The excalibur ldtk plugin officially supports ${LdtkResource.supportedLdtkVersion}+, the current map has LDtk version ${this.projectMetadata.jsonVersion}`)\n }\n\n // iterate through the defs\n // load the tilesets\n const imagesToLoad: Promise[] = [];\n for (let tileset of this.projectMetadata.defs.tilesets) {\n if (tileset.relPath) {\n const imagePath = pathRelativeToBase(this.path, tileset.relPath, this.pathMap);\n const image = this._imageLoader.getOrAdd(imagePath);\n const friendlyTileset = new Tileset({\n image,\n ldtkTileset: tileset\n });\n this.tilesets.set(tileset.uid, friendlyTileset);\n } else {\n if (tileset.identifier !== 'Internal_Icons') {\n console.warn(`No tileset image provided for ${tileset.identifier}`);\n }\n }\n }\n\n // iterate through the levels\n // load the level metadata\n for (let level of this.projectMetadata.levels) {\n if (level.externalRelPath) {\n // external levels\n const levelPath = pathRelativeToBase(this.path, level.externalRelPath, this.pathMap);\n this._levelLoader.getOrAdd(levelPath, this, {\n headless: this.headless,\n strict: this.strict,\n fileLoader: this.fileLoader,\n imageLoader: this._imageLoader,\n pathMap: this.pathMap\n });\n } else {\n // embedded levels\n const friendlyLevel = new Level(level, this);\n this.levels.set(level.uid, friendlyLevel);\n this.levelsByName.set(level.identifier.toLowerCase(), friendlyLevel);\n }\n }\n\n await Promise.all([this._imageLoader.load(), this._levelLoader.load()]);\n this._levelLoader.values().forEach(level => {\n this.levels.set(level.data.ldtkLevel.uid, level.data);\n this.levelsByName.set(level.data.ldtkLevel.identifier.toLowerCase(), level.data);\n });\n\n return this.data = this.projectMetadata;\n };\n\n isLoaded(): boolean {\n return !!this.data;\n }\n\n registerEntityIdentifierFactory(ldtkEntityIdentifier: string, factory: (props: FactoryProps) => Entity | undefined): void {\n this.factories.set(ldtkEntityIdentifier, factory);\n }\n\n registerEntityIdentifierFactories(factories: Record Entity | undefined>): void {\n for (const key in factories) {\n this.registerEntityIdentifierFactory(key, factories[key]);\n }\n }\n\n /**\n * Get a level by identifier\n * @param identifier \n * @returns \n */\n getLevel(identifier: string): Level | undefined {\n return this.levelsByName.get(identifier.toLowerCase());\n }\n\n /**\n * Get the entity layers, optionally provide a level identifier to filter to\n * @param levelIdentifier \n */\n getEntityLayers(levelIdentifier?: string): EntityLayer[] {\n let results: EntityLayer[] = [];\n if (levelIdentifier) {\n const level = this.getLevel(levelIdentifier);\n if (level) {\n for (let layer of level.layers) {\n if (layer instanceof EntityLayer) {\n results.push(layer);\n }\n }\n }\n } else {\n for (const level of this.levels.values()) {\n for (let layer of level.layers) {\n if (layer instanceof EntityLayer) {\n results.push(layer);\n }\n }\n }\n }\n\n return results\n }\n\n getTileLayers(identifier?: string): TileLayer[] {\n let results: TileLayer[] = [];\n if (identifier) {\n const level = this.getLevel(identifier);\n if (level) {\n for (let layer of level.layers) {\n if (layer instanceof TileLayer) {\n results.push(layer);\n }\n }\n }\n } else {\n for (const level of this.levels.values()) {\n for (let layer of level.layers) {\n if (layer instanceof TileLayer) {\n results.push(layer);\n }\n }\n }\n }\n return results;\n }\n\n getIntGridLayers(identifier?: string): IntGridLayer[] {\n let results: IntGridLayer[] = [];\n if (identifier) {\n const level = this.getLevel(identifier);\n if (level) {\n for (let layer of level.layers) {\n if (layer instanceof IntGridLayer) {\n results.push(layer);\n }\n }\n }\n } else {\n for (const level of this.levels.values()) {\n for (let layer of level.layers) {\n if (layer instanceof IntGridLayer) {\n results.push(layer);\n }\n }\n }\n }\n return results;\n }\n\n /**\n * Search layer for entities that match an identifier (case insensitive)\n * @param identifier \n * @returns \n */\n getLdtkEntitiesByIdentifier(identifier: string, levels?: string[]): LdtkEntityInstance[] {\n let results: LdtkEntityInstance[] = [];\n const levelsToSearch = levels ?? Array.from(this.levels.values()).map(l => l.ldtkLevel.identifier);\n for (const level of levelsToSearch) {\n const layers = this.getEntityLayers(level);\n for (let layer of layers) {\n results = results.concat(layer.getLdtkEntitiesByIdentifier(identifier));\n }\n }\n return results;\n }\n\n /**\n * Search levels for ldtk entities that match a field and optionally a value (both case insensitive)\n * @param fieldIdentifier \n * @param value\n */\n getLdtkEntitiesByField(fieldIdentifier: string, value?: any, levels?: string[]): LdtkEntityInstance[] {\n let results: LdtkEntityInstance[] = [];\n const levelsToSearch = levels ?? Array.from(this.levels.values()).map(l => l.ldtkLevel.identifier);\n for (const level of levelsToSearch) {\n const layers = this.getEntityLayers(level);\n for (let layer of layers) {\n results = results.concat(layer.getLdtkEntitiesByField(fieldIdentifier, value));\n }\n }\n return results;\n }\n\n /**\n * Search levels for excalibur entities that match an identifier (case insensitive)\n * @param identifier\n * @param levels\n */\n getEntitiesByIdentifier(identifier: string, levels?: string[]): Entity[] {\n let results: Entity[] = [];\n const levelsToSearch = levels ?? Array.from(this.levels.values()).map(l => l.ldtkLevel.identifier);\n for (const level of levelsToSearch) {\n const layers = this.getEntityLayers(level);\n for (let layer of layers) {\n results = results.concat(layer.getEntitiesByIdentifier(identifier));\n }\n }\n return results;\n }\n\n /**\n * Search levels for excalibur entities that match a field and optionally a value (both case insensitive)\n * @param fieldIdentifier\n * @param value\n * @param levels\n */\n getEntitiesByField(fieldIdentifier: string, value?: any, levels?: string[]): Entity[] {\n let results: Entity[] = [];\n const levelsToSearch = levels ?? Array.from(this.levels.values()).map(l => l.ldtkLevel.identifier);\n for (const level of levelsToSearch) {\n const layers = this.getEntityLayers(level);\n for (let layer of layers) {\n results = results.concat(layer.getEntitiesByField(fieldIdentifier, value));\n }\n }\n return results;\n }\n\n /**\n * Get the level bounds given a list of level identifiers (case insensitive)\n * @param levels\n */\n getLevelBounds(levels?: string[]): BoundingBox {\n levels = levels ?? Array.from(this.levelsByName.keys());\n let bounds: BoundingBox | null = null;\n for (const level of this.levels.values()) {\n if (!levels.includes(level.ldtkLevel.identifier)) {\n continue;\n }\n const firstTileLayer = this.getTileLayers(level.ldtkLevel.identifier)[0];\n if (firstTileLayer) {\n const tileBounds = BoundingBox.fromDimension(\n firstTileLayer.tilemap.tileWidth * firstTileLayer.tilemap.columns,\n firstTileLayer.tilemap.tileHeight * firstTileLayer.tilemap.rows,\n Vector.Zero,\n firstTileLayer.tilemap.pos);\n if (!bounds) {\n bounds = tileBounds;\n } else {\n bounds = bounds.combine(tileBounds);\n }\n }\n }\n return bounds ?? new BoundingBox();\n }\n\n addToScene(scene: Scene, options?: AddToSceneOptions) {\n const { pos, useLevelOffsets } = {pos: vec(0, 0), useLevelOffsets: true, ...options};\n\n for (let [id, level] of this.levels.entries()) {\n if (options?.levelFilter?.length) {\n if (!options.levelFilter.includes(level.ldtkLevel.identifier)) {\n continue;\n }\n }\n for (let layer of level.layers) {\n if (layer instanceof TileLayer || layer instanceof IntGridLayer) {\n layer.tilemap.pos = layer.tilemap.pos.add(pos);\n if (!useLevelOffsets) {\n layer.tilemap.pos = layer.tilemap.pos.sub(layer.worldPos);\n }\n scene.add(layer.tilemap)\n } else {\n layer.runFactories()\n for (let entity of layer.entities) {\n const tx = entity.get(TransformComponent);\n if (tx) {\n tx.pos = tx.pos.add(pos);\n if (!useLevelOffsets) {\n tx.pos = tx.pos.sub(layer.worldPos);\n }\n }\n scene.add(entity);\n }\n }\n }\n }\n\n if(this.useExcaliburWiring) {\n const camera = this.getLdtkEntitiesByField('camera', true)[0];\n if (camera) {\n scene.camera.pos = vec(camera.px[0], camera.px[0]);\n const zoom = camera.fieldInstances.find(f => f.__identifier.toLocaleLowerCase() === 'zoom');\n if (zoom) {\n scene.camera.zoom = +zoom.__value;\n }\n }\n }\n\n if (this.useTilemapCameraStrategy) {\n let bounds = this.getLevelBounds(options?.levelFilter);\n scene.camera.strategy.limitCameraBounds(bounds);\n }\n\n if (this.useMapBackgroundColor) {\n for (let [id, level] of this.levels.entries()) {\n if (options?.levelFilter?.length) {\n if (!options.levelFilter.includes(level.ldtkLevel.identifier)) {\n continue;\n }\n }\n scene.backgroundColor = level.backgroundColor;\n break;\n }\n }\n\n\n }\n}\n","import { ImageSource, Loadable } from \"excalibur\";\nimport { PathMap } from \"./path-util\";\nimport { LoaderCache } from \"./loader-cache\";\nimport { FetchLoader, FileLoader } from \"./file-loader\";\nimport { Level } from \"./level\";\nimport { LdtkLevel } from \"./types\";\nimport { LdtkResource } from \"./ldtk-resource\";\n\nexport interface LevelResourceOptions {\n headless?: boolean;\n strict?: boolean;\n fileLoader?: FileLoader;\n imageLoader?: LoaderCache;\n pathMap?: PathMap;\n}\n\n/**\n * Loads LDtk levels that are stored in separate files\n */\nexport class LevelResource implements Loadable {\n private fileLoader: FileLoader = FetchLoader;\n private imageLoader: LoaderCache;\n private pathMap?: PathMap;\n public readonly strict: boolean = true;\n public readonly headless: boolean = false;\n constructor(public readonly path: string, public readonly resource: LdtkResource, options?: LevelResourceOptions) {\n const { headless, strict, fileLoader, imageLoader, pathMap } = { ...options };\n this.fileLoader = fileLoader ?? this.fileLoader;\n this.strict = strict ?? this.strict;\n this.headless = headless ?? this.headless;\n this.imageLoader = imageLoader ?? new LoaderCache(ImageSource);\n this.pathMap = pathMap ?? this.pathMap;\n }\n data!: Level;\n async load(): Promise {\n const data = await this.fileLoader(this.path, 'json');\n let level: LdtkLevel;\n if (this.strict) {\n try {\n level = LdtkLevel.parse(data)\n } catch (e) {\n console.error(`Could not parse LDtk level data at ${this.path} are you sure a level is there and not corrupt?`);\n throw e;\n }\n } else {\n level = data as LdtkLevel;\n }\n return this.data = new Level(level, this.resource);\n }\n isLoaded(): boolean {\n return !!this.data;\n }\n\n}","import { Color } from \"excalibur\";\nimport { EntityLayer } from \"./entity-layer\";\nimport { IntGridLayer } from \"./intgrid-layer\";\nimport { LdtkResource } from \"./ldtk-resource\";\nimport { TileLayer } from \"./tile-layer\";\nimport { LdtkLevel } from \"./types\";\n\nexport class Level {\n\n public backgroundColor?: Color;\n public layers: (TileLayer | IntGridLayer | EntityLayer)[] = []; \n\n constructor(public ldtkLevel: LdtkLevel, public resource: LdtkResource) {\n if (ldtkLevel.__bgColor) {\n this.backgroundColor = Color.fromHex(ldtkLevel.__bgColor);\n }\n if (ldtkLevel.layerInstances) {\n let order = resource.startZIndex;\n let layers = ldtkLevel.layerInstances.slice().reverse();\n for (let layer of layers) {\n if (layer.entityInstances?.length !== 0) {\n this.layers.push(new EntityLayer(this, layer, resource, order));\n }\n\n if (layer.gridTiles?.length !== 0) {\n this.layers.push(new TileLayer(this, layer, resource, order));\n }\n\n // Includes standard IntGrid, IntGrid w/ AutoTile & AutoTile layers\n if (layer.intGridCsv?.length !== 0 || layer.autoLayerTiles?.length !== 0) {\n this.layers.push(new IntGridLayer(this, layer, resource, order));\n }\n order++;\n }\n }\n }\n}","export interface CanLoad {\n load(): Promise;\n }\n \n /**\n * Read through cache for loadables\n */\n export class LoaderCache {\n private _loaded = false;\n cache = new Map();\n \n constructor(public readonly type: new (...args: any[]) => T){}\n \n getOrAdd(...args: any[]): T {\n let resource = this.cache.get(args.join('+'));\n if (resource) {\n return resource;\n }\n \n resource = new this.type(...args);\n this.cache.set(args.join('+'), resource);\n return resource;\n }\n \n values(): T[] {\n if (this._loaded) {\n return Array.from(this.cache.values());\n }\n throw new Error(`Read through cache not yet loaded! No values to return!`);\n }\n \n async load() {\n const resources = Array.from(this.cache.entries());\n const results = await Promise.allSettled(resources.map(i => i[1].load()));\n \n // Check for errors loading resources\n let errored = 0;\n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n if (result.status === 'rejected') {\n console.error(`Error loading resource at ${resources[i][0]}, is your pathMap correct? or your LDtk map corrupted?`, result.reason);\n errored++;\n }\n }\n if (errored) {\n throw new Error(`Error loading ${errored} resources`);\n }\n this._loaded = true;\n }\n }","\n\nexport type PathMap = { path: string | RegExp, output: string }[];\n\nexport function filenameFromPath(inputPath: string): string {\n const filenameExpression = /[^/\\\\&\\?]+\\.\\w{2,4}(?=([\\#\\?&].*$|$))/ig\n\n const matches = inputPath.match(filenameExpression);\n\n if (matches) {\n const match = matches[0];\n return match;\n }\n\n throw new Error(`Could not locate filename from path: ${inputPath}`);\n}\n\nexport function mapPath(inputPath: string, pathMap: PathMap): string {\n\n for (const { path, output } of pathMap) {\n if (typeof path === 'string') {\n if (inputPath.includes(path)) {\n return output;\n }\n } else {\n const match = inputPath.match(path);\n if (match) {\n return output.replace('[match]', match[0]);;\n }\n }\n }\n return inputPath;\n}\n\nexport function pathInMap(inputPath: string, pathMap?: PathMap): boolean {\n if (!pathMap) return false;\n for (const { path, output } of pathMap) {\n if (typeof path === 'string') {\n if (inputPath.includes(path)) {\n return true;\n }\n } else {\n const match = inputPath.match(path);\n if (match) {\n return true;\n }\n }\n }\n return false;\n}\n\n\nexport function pathRelativeToBase(basePath: string, relativeToBase: string, pathMap?: PathMap) {\n if (pathInMap(relativeToBase, pathMap) && pathMap) {\n return mapPath(relativeToBase, pathMap);\n }\n\n // Use absolute path if specified\n if (relativeToBase.indexOf('/') === 0) {\n return relativeToBase;\n }\n\n const originSplit = basePath.split('/');\n const relativeSplit = relativeToBase.split('/');\n // if origin path is a file, remove it so it's a directory\n if (originSplit[originSplit.length - 1].includes('.')) {\n originSplit.pop();\n }\n return originSplit.concat(relativeSplit).join('/');\n}","import { GraphicsComponent, TileMap, Vector, vec } from \"excalibur\";\nimport { LdtkResource } from \"./ldtk-resource\";\nimport { LdtkLayerInstance } from \"./types\";\nimport { Level } from \"./level\";\nimport { Tileset } from \"./tileset\";\n\n\nexport class TileLayer {\n public ldtkLayer: LdtkLayerInstance;\n public worldPos: Vector;\n public offset: Vector;\n public tilemap: TileMap;\n public tileset?: Tileset;\n\n constructor(level: Level, ldtkLayer: LdtkLayerInstance, resource: LdtkResource, public readonly order: number) {\n this.worldPos = vec(level.ldtkLevel.worldX, level.ldtkLevel.worldY);\n this.offset = vec(ldtkLayer.__pxTotalOffsetX, ldtkLayer.__pxTotalOffsetY);\n this.ldtkLayer = ldtkLayer;\n this.tilemap = new TileMap({\n name: ldtkLayer.__identifier,\n pos: this.worldPos.add(this.offset),\n tileWidth: ldtkLayer.__gridSize,\n tileHeight: ldtkLayer.__gridSize,\n rows: ldtkLayer.__cHei,\n columns: ldtkLayer.__cWid,\n });\n this.tilemap.z = order;\n const graphics = this.tilemap.get(GraphicsComponent);\n graphics.isVisible = ldtkLayer.visible;\n\n\n if (ldtkLayer.__tilesetDefUid) {\n this.tileset = resource.tilesets.get(ldtkLayer.__tilesetDefUid);\n for (let tile of ldtkLayer.gridTiles) {\n const xCoord = Math.floor(tile.px[0] / ldtkLayer.__gridSize);\n const yCoord = Math.floor(tile.px[1] / ldtkLayer.__gridSize);\n const exTile = this.tilemap.getTile(xCoord, yCoord);\n if (this.tileset) {\n const tsxCoord = Math.floor((tile.src[0] - (this.tileset.ldtkTileset.padding ?? 0)) / (this.tileset.ldtkTileset.tileGridSize + (this.tileset.ldtkTileset.spacing ?? 0)));\n const tsyCoord = Math.floor((tile.src[1] - (this.tileset.ldtkTileset.padding ?? 0)) / (this.tileset.ldtkTileset.tileGridSize + (this.tileset.ldtkTileset.spacing ?? 0)));\n // Bit 0 toggles x flip\n // Bit 1 toggles 1 flip\n // Examples: f=0 (no flip), f=1 (X flip only), f=2 (Y flip only), f=3 (both flips)\n const flipHorizontal = !!(tile.f & 0b01);\n const flipVertical = !!(tile.f & 0b10);\n let sprite = this.tileset.spritesheet.getSprite(tsxCoord, tsyCoord);\n if (flipHorizontal || flipVertical) {\n sprite = sprite.clone();\n sprite.flipHorizontal = flipHorizontal;\n sprite.flipVertical = flipVertical;\n }\n if (sprite) {\n exTile!.addGraphic(sprite);\n } else {\n console.error('Could not find sprite in LDtk spritesheet at', tsxCoord, tsyCoord);\n } \n }\n } \n } else {\n console.error('Could not tileset in LDtk', ldtkLayer.__tilesetDefUid, ldtkLayer.__tilesetRelPath);\n }\n\n }\n}","import { ImageSource, Sprite, SpriteSheet } from \"excalibur\";\nimport { LdtkTilesetDefinition } from \"./types\";\n\nexport interface TilesetOptions {\n image: ImageSource,\n ldtkTileset: LdtkTilesetDefinition\n}\n\nexport class Tileset {\n public readonly image: ImageSource;\n public readonly ldtkTileset: LdtkTilesetDefinition;\n public readonly spritesheet: SpriteSheet;\n constructor(options: TilesetOptions) {\n const {image, ldtkTileset} = options;\n this.image = image;\n this.ldtkTileset = ldtkTileset;\n this.spritesheet = SpriteSheet.fromImageSource({\n image,\n grid: {\n rows: ldtkTileset.pxHei / ldtkTileset.tileGridSize,\n columns: ldtkTileset.pxWid / ldtkTileset.tileGridSize,\n spriteHeight: ldtkTileset.tileGridSize,\n spriteWidth: ldtkTileset.tileGridSize\n },\n spacing: {\n margin: { \n x: ldtkTileset.spacing ?? 0,\n y: ldtkTileset.spacing ?? 0,\n },\n originOffset: {\n x: ldtkTileset.padding ?? 0,\n y: ldtkTileset.padding ?? 0\n }\n }\n });\n }\n}","import { z } from 'zod';\n\n\n\nconst LdtkTilesetRectangle = z.object({\n h: z.number(),\n tilesetUid: z.number(),\n w: z.number(),\n x: z.number(),\n y: z.number()\n});\nconst LdtkPixel = z.tuple([z.number(), z.number()]);\nconst LdtkFieldInstance = z.object({\n __identifier: z.string(),\n __tile: LdtkTilesetRectangle.nullable(),\n __type: z.string(),//z.union([z.literal('Int'), z.literal('Float'), z.literal('String'), z.literal('Bool'), z.literal('Enum')]), // TODO this might not work with ENUM\n __value: z.any(),\n defUid: z.number()\n})\nconst LdtkTileInstance = z.object({\n a: z.number(),\n f: z.number(), // 2-bit int 0bXY flip\n px: LdtkPixel,\n src: LdtkPixel,\n t: z.number()\n});\n\nexport const LdtkEntityInstance = z.object({\n __grid: LdtkPixel,\n __identifier: z.string(),\n __pivot: LdtkPixel,\n __smartColor: z.string(),\n __tags: z.array(z.string()),\n __tile: LdtkTilesetRectangle.nullable(),\n __worldX: z.number().nullable(),\n __worldY: z.number().nullable(),\n defUid: z.number(),\n fieldInstances: z.array(LdtkFieldInstance),\n height: z.number(),\n iid: z.string(),\n px: LdtkPixel,\n width: z.number()\n});\nexport type LdtkEntityInstance = z.infer;\n\nexport const LdtkLayerInstance = z.object({\n __cHei: z.number(),\n __cWid: z.number(),\n __gridSize: z.number(),\n __identifier: z.string(),\n __opacity: z.number(),\n __pxTotalOffsetX: z.number(),\n __pxTotalOffsetY: z.number(),\n __tilesetDefUid: z.number().nullable(),\n __tilesetRelPath:z.string().nullable(),\n __type: z.union([z.literal('IntGrid'), z.literal('Entities'), z.literal('Tiles'), z.literal('AutoLayer')]),\n autoLayerTiles: z.array(LdtkTileInstance), // only in auto layers\n entityInstances: z.array(LdtkEntityInstance),// only in entity layers\n gridTiles: z.array(LdtkTileInstance),\n iid: z.string(),\n intGridCsv: z.array(z.number()), // __cWid x __cHei, 0 means empty, values start at 1\n layerDefUid: z.number(),\n levelId: z.number(),\n overrideTilesetUid: z.number().nullable(),\n pxOffsetX: z.number(),\n pxOffsetY: z.number(),\n visible: z.boolean()\n});\nexport type LdtkLayerInstance = z.infer;\n\nexport const LdtkLevel = z.object({\n __bgColor: z.string().nullable(),\n bgColor: z.string().nullable(),\n __bgPos: z.object({\n cropRect: z.array(z.tuple([z.number(), z.number(), z.number(), z.number()])), // cropX, cropY, cropWidth, cropHeight\n scale: z.tuple([z.number(), z.number()]),\n topLeftPx: LdtkPixel\n }).nullable(),\n __neighbours: z.array(z.object({\n dir: z.union([z.literal('n'), z.literal('s'), z.literal('w'), z.literal('e'), z.literal('ne'), z.literal('nw'), z.literal('se'), z.literal('sw'), z.literal('o'), z.literal('<'), z.literal('>')]),\n levelIid: z.string()\n })),\n bgRelPath: z.string().nullable(),\n externalRelPath: z.string().nullable(),\n fieldInstances: z.array(LdtkFieldInstance),\n identifier: z.string(),\n iid: z.string(),\n layerInstances: z.array(LdtkLayerInstance).nullable(), // null if the save levels separately is enabled\n pxHei: z.number(),\n pxWid: z.number(),\n uid: z.number(),\n worldDepth: z.number(),\n worldX: z.number(),\n worldY: z.number()\n});\nexport type LdtkLevel = z.infer;\n\nconst LdtkWorld = z.object({\n identifier: z.string(),\n iid: z.string(),\n levels: z.array(LdtkLevel),\n worldGridHeight:z.number(),\n worldGridWidth: z.number(),\n // TODO is this a typo Vania?\n worldLayout: z.union([z.literal('Free'), z.literal('GridVania'), z.literal('LinearHorizontal'), z.literal('LinearVertical')]),\n});\nexport type LdtkWorld = z.infer;\n\nconst LdtkEnumValueDefinition = z.object({\n color: z.number(),\n id: z.string(),\n tileRect: LdtkTilesetRectangle.nullable()\n});\n\nconst LdtkEnumDefinition = z.object({\n externalRelPath: z.string().nullable(),\n iconTilesetUid: z.number().nullable(),\n identifier: z.string(),\n tags: z.array(z.string()),\n uid: z.number(),\n values: z.array(LdtkEnumValueDefinition)\n})\n\nexport type LdtkEnumDefinition = z.infer;\n\nconst LdtkTilesetDefinition = z.object({\n __cHei: z.number(),\n __cWid: z.number(),\n customData: z.array(z.object({\n data: z.string(),\n tileId: z.number()\n })),\n embedAtlas: z.string().nullable(),\n enumTags: z.optional(z.array(z.object({\n enumValueId: z.string(),\n tileIds: z.array(z.number())\n }))),\n identifier: z.string(),\n padding: z.number(),\n pxHei: z.number(),\n pxWid: z.number(),\n relPath: z.string().nullable(),\n spacing: z.number(),\n tags: z.array(z.string()),\n tagsSourceEnumUid: z.number().nullable(),\n tileGridSize: z.number(),\n uid: z.number()\n})\nexport type LdtkTilesetDefinition = z.infer;\n\nexport const LdtkLayerDefinition = z.object({\n __type: z.union([z.literal(\"IntGrid\"), z.literal(\"Entities\"), z.literal(\"Tiles\"), z.literal(\"AutoLayer\")]),\n autoSourceLayerDefUid: z.number().nullable(),\n displayOpacity: z.number(),\n gridSize: z.number(),\n identifier: z.string(),\n intGridValues: z.array(z.object({\n color: z.string(),\n groupUid: z.number(),\n identifier: z.string().nullable(),\n tile: LdtkTilesetRectangle.nullable(),\n value: z.number()\n })),\n intGridValuesGroups: z.array(z.object({\n color: z.string().nullable(),\n identifier: z.string().nullable(),\n uid: z.number()\n })),\n parallaxFactorX: z.number(),\n parallaxFactorY: z.number(),\n parallaxScaling: z.boolean(),\n pxOffsetX: z.number(),\n pxOffsetY: z.number(),\n tilesetDefUid: z.number().nullable(),\n uid: z.number(),\n});\nexport type LdtkLayerDefinition = z.infer;\n\nexport const LdtkEntityDefinition = z.object({\n color: z.string(),\n height: z.number(),\n identifier: z.string(),\n nineSliceBorders: z.array(z.number()),\n pivotX: z.number(),\n pivotY: z.number(),\n tileRect: LdtkTilesetRectangle.nullable(),\n tileRenderMode: z.union([\n z.literal(\"Cover\"),\n z.literal(\"FitInside\"),\n z.literal(\"Repeat\"),\n z.literal(\"Stretch\"),\n z.literal(\"FullSizeCropped\"),\n z.literal(\"FullSizeUncropped\"),\n z.literal(\"NineSlice\")\n ]),\n tilesetId: z.number().nullable(),\n uiTileRect: LdtkTilesetRectangle.nullable(),\n uid: z.number(),\n width: z.number()\n});\nexport type LdtkEntityDefinition = z.infer;\n\nconst LdtkDefinitions = z.object({\n tilesets: z.array(LdtkTilesetDefinition),\n enums: z.array(LdtkEnumDefinition),\n layers: z.array(LdtkLayerDefinition),\n entities: z.array(LdtkEntityDefinition)\n})\nexport type LdtkDefinitions = z.infer;\n\nexport const LdtkProjectMetadata = z.object({\n iid: z.string(),\n bgColor: z.string().nullable(),\n defs: LdtkDefinitions,\n externalLevels: z.boolean(),\n jsonVersion: z.string(),\n levels: z.array(LdtkLevel),\n toc: z.array(z.object({\n identifier: z.string(),\n instancesData: z.array(z.object({\n fields: z.any(),\n heiPx: z.number(),\n iids: z.string(),\n widPix: z.number(),\n worldX: z.number(),\n worldY: z.number()\n }))\n })),\n // Moving to worlds array\n worldGridHeight: z.number().nullable(),\n worldGridWidth: z.number().nullable(),\n // TODO is this a LDtk docs typo Vania?\n worldLayout: z.union([z.literal('Free'), z.literal('GridVania'), z.literal('LinearHorizontal'), z.literal('LinearVertical')]).nullable(),\n worlds: z.array(LdtkWorld)\n});\nexport type LdtkProjectMetadata = z.infer;\n\n\n\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","\nimport * as ex from \"excalibur\";\nimport { Player } from './player';\nimport { Resources, loader } from \"./resources\";\nex.Flags.useLegacyImageRenderer();\nconst game = new ex.Engine({\n resolution: {\n width: 256,\n height: 256,\n },\n suppressPlayButton: false,\n pixelArt: true,\n pixelRatio: 4,\n displayMode: ex.DisplayMode.FitScreen,\n});\n\ngame.start(loader).then(() => {\n console.log('Game start!');\n\n Resources.LdtkResource.registerEntityIdentifierFactory('PlayerStart', (props) => {\n const player = new Player({\n name: 'player',\n anchor: ex.vec(props.entity.__pivot[0],props.entity.__pivot[1]),\n width: props.entity.width,\n height: props.entity.height,\n pos: props.worldPos,\n z: props.layer.order\n });\n return player;\n });\n // Provide a type to the plugin to use for a specific entity identifier\n // Player.ts\n Resources.LdtkResource.addToScene(game.currentScene, {\n pos: ex.vec(0, 0),\n levelFilter: ['Level_0', 'Level_1']\n });\n const player = game.currentScene.world.entityManager.getByName('player')[0];\n if (player instanceof Player) {\n game.currentScene.camera.clearAllStrategies();\n game.currentScene.camera.strategy.lockToActor(player);\n const bounds = Resources.LdtkResource.getLevelBounds(['Level_0', 'Level_1']);\n game.currentScene.camera.strategy.limitCameraBounds(bounds);\n }\n});"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/src/entity-layer.ts b/src/entity-layer.ts index 209ab32..23c3771 100644 --- a/src/entity-layer.ts +++ b/src/entity-layer.ts @@ -4,156 +4,165 @@ import { LdtkEntityInstance, LdtkLayerInstance } from "./types"; import { Level } from "./level"; export class EntityLayer { - public worldPos: Vector; - public offset: Vector; - public entities: Entity[] = []; - public ldtkToEntity = new Map(); - public entityToLdtk = new Map(); - constructor(level: Level, public readonly ldtkLayer: LdtkLayerInstance, private resource: LdtkResource, public readonly order: number) { - this.worldPos = vec(level.ldtkLevel.worldX, level.ldtkLevel.worldY); - this.offset = vec(ldtkLayer.__pxTotalOffsetX, ldtkLayer.__pxTotalOffsetY); - if (ldtkLayer.entityInstances) { - for (let entity of ldtkLayer.entityInstances) { - const entityMetadata = resource.projectMetadata.defs.entities.find(e => { - return e.identifier === entity.__identifier - }); - - if (resource.factories.has(entity.__identifier)) { - const factory = resource.factories.get(entity.__identifier); - if (factory) { - const newEntity = factory({ - type: entity.__identifier, - worldPos: vec(entity.px[0], entity.px[1]).add(this.worldPos.add(this.offset)), - entity, - definition: entityMetadata, - layer: this, - }); - if (newEntity) { - this.entities.push(newEntity); - this.ldtkToEntity.set(entity, newEntity); - this.entityToLdtk.set(newEntity, entity); - } - } - } else { - const actor = new Actor({ - name: entity.__identifier, - pos: vec(entity.px[0], entity.px[1]).add(this.worldPos.add(this.offset)), - width: entity.width, - height: entity.height, - anchor: vec(entityMetadata?.pivotX ?? 0, entityMetadata?.pivotY ?? 0), - z: order - }); - if (entity.__tile) { - const ts = resource.tilesets.get(entity.__tile.tilesetUid); - if (ts) { - const tsxCoord = Math.floor(entity.__tile.x / entity.__tile.w); - const tsyCoord = Math.floor(entity.__tile.y / entity.__tile.h); - const sprite = ts.spritesheet.getSprite(tsxCoord, tsyCoord); - if (sprite) { - actor.graphics.use(sprite); - } - } - } - this.entities.push(actor); - this.ldtkToEntity.set(entity, actor); - this.entityToLdtk.set(actor, entity); - } - } - } - } + public worldPos: Vector; + public offset: Vector; + public entities: Entity[] = []; + public ldtkToEntity = new Map(); + public entityToLdtk = new Map(); - runFactories() { - for (let entity of this.ldtkLayer.entityInstances) { - const factory = this.resource.factories.get(entity.__identifier); - - if (!factory) { continue } - - const entityMetadata = this.resource.projectMetadata.defs.entities.find(e => { - return e.identifier === entity.__identifier - }); + constructor( + level: Level, + public readonly ldtkLayer: LdtkLayerInstance, + private resource: LdtkResource, + public readonly order: number) { + this.worldPos = vec(level.ldtkLevel.worldX, level.ldtkLevel.worldY); + this.offset = vec(ldtkLayer.__pxTotalOffsetX, ldtkLayer.__pxTotalOffsetY); + console.log("yo"); + } + runFactories() { + const ldtkLayer = this.ldtkLayer; + const resource = this.resource; + const order = this.order; + if (ldtkLayer.entityInstances) { + for (let entity of ldtkLayer.entityInstances) { + const entityMetadata = resource.projectMetadata.defs.entities.find(e => { + return e.identifier === entity.__identifier + }); + if (resource.factories.has(entity.__identifier)) { + const factory = resource.factories.get(entity.__identifier); + if (factory) { const newEntity = factory({ - type: entity.__identifier, - worldPos: vec(entity.px[0], entity.px[1]).add(this.worldPos.add(this.offset)), - entity, - definition: entityMetadata, - layer: this, + type: entity.__identifier, + worldPos: vec(entity.px[0], entity.px[1]).add(this.worldPos.add(this.offset)), + entity, + definition: entityMetadata, + layer: this, }); - if (newEntity) { - // remove pre-existing entity (e.g. the default actor created for the entity placement) - const preExisting = this.ldtkToEntity.get(entity); - if (preExisting) { - const index = this.entities.indexOf(preExisting); - if (index > -1) { - this.entities.splice(index, 1); - this.ldtkToEntity.delete(entity); - this.entityToLdtk.delete(preExisting); - } - } - - this.entities.push(newEntity); - this.ldtkToEntity.set(entity, newEntity); - this.entityToLdtk.set(newEntity, entity); + this.entities.push(newEntity); + this.ldtkToEntity.set(entity, newEntity); + this.entityToLdtk.set(newEntity, entity); + } + } + } else { + if (entity.__tile) { + const actor = new Actor({ + name: entity.__identifier, + pos: vec(entity.px[0], entity.px[1]).add(this.worldPos.add(this.offset)), + width: entity.width, + height: entity.height, + anchor: vec(entityMetadata?.pivotX ?? 0, entityMetadata?.pivotY ?? 0), + z: order + }); + const ts = resource.tilesets.get(entity.__tile.tilesetUid); + if (ts) { + const tsxCoord = Math.floor(entity.__tile.x / entity.__tile.w); + const tsyCoord = Math.floor(entity.__tile.y / entity.__tile.h); + const sprite = ts.spritesheet.getSprite(tsxCoord, tsyCoord); + if (sprite) { + actor.graphics.use(sprite); + } } + + this.entities.push(actor); + this.ldtkToEntity.set(entity, actor); + this.entityToLdtk.set(actor, entity); + } } + } } + // for (let entity of this.ldtkLayer.entityInstances) { + // const factory = this.resource.factories.get(entity.__identifier); + // if (!factory) { continue } + // + // const entityMetadata = this.resource.projectMetadata.defs.entities.find(e => { + // return e.identifier === entity.__identifier + // }); + // + // const newEntity = factory({ + // type: entity.__identifier, + // worldPos: vec(entity.px[0], entity.px[1]).add(this.worldPos.add(this.offset)), + // entity, + // definition: entityMetadata, + // layer: this, + // }); + // + // if (newEntity) { + // // remove pre-existing entity (e.g. the default actor created for the entity placement) + // const preExisting = this.ldtkToEntity.get(entity); + // if (preExisting) { + // const index = this.entities.indexOf(preExisting); + // if (index > -1) { + // this.entities.splice(index, 1); + // this.ldtkToEntity.delete(entity); + // this.entityToLdtk.delete(preExisting); + // } + // } + // + // this.entities.push(newEntity); + // this.ldtkToEntity.set(entity, newEntity); + // this.entityToLdtk.set(newEntity, entity); + // } + // } + } - getEntitiesByIdentifier(identifier: string): Entity[] { - const ldtkEntities = this.getLdtkEntitiesByIdentifier(identifier); - let results: Entity[] = []; - for (const ldtk of ldtkEntities) { - const maybeEntity = this.ldtkToEntity.get(ldtk); - if (maybeEntity) { - results.push(maybeEntity); - } - } - return results; - } - getEntitiesByField(fieldIdentifier: string, value?: any): Entity[] { - const ldtkEntities = this.getLdtkEntitiesByField(fieldIdentifier, value); - let results: Entity[] = []; - for (const ldtk of ldtkEntities) { - const maybeEntity = this.ldtkToEntity.get(ldtk); - if (maybeEntity) { - results.push(maybeEntity); - } - } - return results; + getEntitiesByIdentifier(identifier: string): Entity[] { + const ldtkEntities = this.getLdtkEntitiesByIdentifier(identifier); + let results: Entity[] = []; + for (const ldtk of ldtkEntities) { + const maybeEntity = this.ldtkToEntity.get(ldtk); + if (maybeEntity) { + results.push(maybeEntity); + } } + return results; + } - /** - * Search layer for entities that match an identifier (case insensitive) - * @param identifier - * @returns - */ - getLdtkEntitiesByIdentifier(identifier: string): LdtkEntityInstance[] { - return this.ldtkLayer.entityInstances.filter(e => e.__identifier.toLocaleLowerCase() === identifier.toLowerCase()); + getEntitiesByField(fieldIdentifier: string, value?: any): Entity[] { + const ldtkEntities = this.getLdtkEntitiesByField(fieldIdentifier, value); + let results: Entity[] = []; + for (const ldtk of ldtkEntities) { + const maybeEntity = this.ldtkToEntity.get(ldtk); + if (maybeEntity) { + results.push(maybeEntity); + } } + return results; + } - /** - * Search layer for entities that match a field and optionally a value (both case insensitive) - * @param fieldIdentifier - * @param value - */ - getLdtkEntitiesByField(fieldIdentifier: string, value?: any): LdtkEntityInstance[] { - return this.ldtkLayer.entityInstances.filter(e => { - if (value !== undefined) { - let normalizedValue = value; - if (typeof value === 'string') { - normalizedValue = value.toLocaleLowerCase(); - } + /** + * Search layer for entities that match an identifier (case insensitive) + * @param identifier + * @returns + */ + getLdtkEntitiesByIdentifier(identifier: string): LdtkEntityInstance[] { + return this.ldtkLayer.entityInstances.filter(e => e.__identifier.toLocaleLowerCase() === identifier.toLowerCase()); + } - const field = e.fieldInstances.find(f => f.__identifier.toLocaleLowerCase() === fieldIdentifier.toLocaleLowerCase()); - if (field) { - return field.__value === normalizedValue; - } - return false; - } else { - return !!e.fieldInstances.find(f => f.__identifier.toLocaleLowerCase() === fieldIdentifier.toLocaleLowerCase()); - } - }); - } -} \ No newline at end of file + /** + * Search layer for entities that match a field and optionally a value (both case insensitive) + * @param fieldIdentifier + * @param value + */ + getLdtkEntitiesByField(fieldIdentifier: string, value?: any): LdtkEntityInstance[] { + return this.ldtkLayer.entityInstances.filter(e => { + if (value !== undefined) { + let normalizedValue = value; + if (typeof value === 'string') { + normalizedValue = value.toLocaleLowerCase(); + } + + const field = e.fieldInstances.find(f => f.__identifier.toLocaleLowerCase() === fieldIdentifier.toLocaleLowerCase()); + if (field) { + return field.__value === normalizedValue; + } + return false; + } else { + return !!e.fieldInstances.find(f => f.__identifier.toLocaleLowerCase() === fieldIdentifier.toLocaleLowerCase()); + } + }); + } +} diff --git a/src/intgrid-layer.ts b/src/intgrid-layer.ts index 2f7f70f..9a85ed0 100644 --- a/src/intgrid-layer.ts +++ b/src/intgrid-layer.ts @@ -88,4 +88,4 @@ export class IntGridLayer { } } } -} \ No newline at end of file +} diff --git a/src/ldtk-resource.ts b/src/ldtk-resource.ts index e83740e..43eea73 100644 --- a/src/ldtk-resource.ts +++ b/src/ldtk-resource.ts @@ -454,7 +454,6 @@ export class LdtkResource implements Loadable { addToScene(scene: Scene, options?: AddToSceneOptions) { const { pos, useLevelOffsets } = {pos: vec(0, 0), useLevelOffsets: true, ...options}; - for (let [id, level] of this.levels.entries()) { if (options?.levelFilter?.length) { if (!options.levelFilter.includes(level.ldtkLevel.identifier)) { @@ -514,4 +513,4 @@ export class LdtkResource implements Loadable { } -} \ No newline at end of file +} diff --git a/webpack.config.test.js b/webpack.config.test.js index 05e1674..67eecdd 100644 --- a/webpack.config.test.js +++ b/webpack.config.test.js @@ -4,6 +4,9 @@ module.exports = { devtool: 'source-map', devServer: { static: '.', + headers: { + 'Cache-Control': 'no-store', + }, }, module: { rules: [ @@ -33,4 +36,4 @@ module.exports = { path: path.resolve(__dirname, 'sample'), libraryTarget: "umd" }, -}; \ No newline at end of file +};